Tejiendo algoritmos

            Ä Ò ÖÓ Ê    Ò Ö Ò Ø Ä ÓÒ
                  lrleon@ula.ve
ÒØÖÓ    ×ØÙ Ó× Ò Å ÖÓ Ð ØÖÓÒ Ý Ë ×Ø Ñ ×   ×ØÖ Ù Ó×
              ÍÒ Ú Ö×     ÄÓ× Ò ×

              ½   × ÔØ Ñ Ö    ¾¼¼
ÄÓ× Ø Ó×     Ð ÔÓÖØ ×ÓÒ Ó×  Ù Ó× Ø Ó× ÖØ ¬ Р׸ Ö Ð Þ Ó× ÔÓÖ   ÖÑ Ò Ø
Ùר Ñ ÒØ Ý ÙÒ Ö Ø Ð Æ ÛØÓÒ ÓÖ Ò Ø Ó ÔÓÖ Ð ÔÖÓ Ö Ñ xfractintº
Ð ×ØÙ ÒØ Ö Ø ÖÒÓ¸ Ø Ò Þ ÒØ Ð ÒØ ¸ Ô ÖÓ ÔÓÖ ×Ó Ö ØÓ Ó¸ ÓÒ ×ØÓº
Prefacio

ÉÙ × Ö ÕÙ ×Ø Ø ÜØÓ × ÓÒ× Ö × ÓÑÓ ÙÒ Ú Ñ ÙÑ Ò Ð × ÒÓ Ø ÚÓ Ý Ò Ð
ÔÖÓ Ö Ñ ÓÒ Ð ÓÖ ØÑÓ× Ý ×ØÖÙ ØÙÖ ×         ØÓ× ÕÙ ×ÓÔÓÖØ Ò ÔÖÓ Ö Ñ × ÓÑÔÙØ ¹
  ÓÒ Ð ×º Î Ñ ÙÑ × ÙÒ Ô Ð Ö Ð Ø Ò ÓÒרÖÙ Ñ ÒØ Ð ÑÔ Ö Ø ÚÓ Ð Ø Ò Ú
ÕÙ ÓÒÒÓØ Ú Ò ¸ Ò Ó Ñ Ò Ý Ñ ÙÑ ÕÙ × Ò ¬                  ÓÒÑ Ó º ÔÖ Ò Ö ×
Ô Ö Ó ØÖ Ò× Ø Ö ÙÒ Ñ ÒÓ Ò× Ò Ö × Ô Ö Ó ÑÓ×ØÖ Ö× ÐÓ ÙÒ Ô Ö Ö ÒÓº Ò× Ò Ö
ÔÖÓÚ Ò Ð Ð Ø Ò Ò× Ò Ö ¸ Ú Ö Ó ÓÑÔÙ ×ØÓ         Ò ´ Òµ Ý × Ò Ö ´× Ò Ð Öµ Ð
 ÜÔÖ × ÓÒ ÙÒ × ÑÔÐ Ù Ò Ó × × Ò Ð ÓÒ Ð Ó ÙÒ × Ò             × Ù Öº × ¸ ÙÒ Ú ¹
   Ñ ÙÑ ÔÖ Ø Ò × Ö ÙÒ Ù     ØÖ Ò× ØÓ ÔÓÖ ÙÒ × Ò        ÔÖ Ò Þ     Ò ×Ø ×Ó¸
Ð ÔÖÓ Ö Ñ ÓÒ ÓÑÔÙØ ÓÖ ×º

Modo y medios
È ÖÑ Ø × Ñ ÒØÖÓ Ù Ö Ð ÑÓ Ó Ò× Ò ÒÞ         ר Ø ÜØÓ¸ ÜÔÖ × Ó ÔÓÖ ×Ø ÒØ ÕÙ × ÑÓ
ÔÖÓÚ Ö Ó ÓÖ ÒØ Ð
        Ù Ò Ó × Ù Ó¸ ÓÐÚ Ó¸
       Ù Ò Ó Ú Ó¸ Ö Ù Ö Ó¸
       Ù Ò Ó Ó¸ ÒØ Ò Óº
Ä ÔÖÓÔ ÓÒ Ø Ú              ÙÒ ÓÒÓ Ñ ÒØÓ Ó ÙÖÖ Ù Ò Ó ×Ø × ÒØ Ò º Ð Ò¹
Ø Ò Ñ ÒØÓ × ØÓÖÒ Ö Ð          Ù Ò Ó ÙÒ ÔÖ Ò Þ ÓÒ×ÙÑ Ð         ÙÖ      Ó× × Ö ¹
Ø Ö ×Ø × ×Ù ÔÖ Ø           Ò ÓÐ × Ð Ñ ×ÑÓº  Ó ÓØÖ Ñ Ò Ö ¸ Ð ÑÓ Ó Ò× Ò ÒÞ
 × ÑÓ×ØÖ Ö ÒØ Ö Ñ ÒØ ÓÑÓ × Ö Ð Þ ÙÒ ×ØÖÙ ØÙÖ         ØÓ× Ý ÙÒ Ð ÓÖ ØÑÓº Ó ×Ø
ÑÓ Ó¸ ÒØ ÒØ Ö Ù Ö ÙÒ ÔÓØ Ò Ð ÔÖ Ò Þ ÔÓÖ Ð Ñ ÒÓ Ð ÔÖ Ø                  Ð ÔÖÓ Ö ¹
Ñ ÓÒ Ú ÒÞ º È Ö ÐÐÓ ÑÔÐ Ó Ð ÙÒÓ× Ñ Ó׺

C++
È Ö Ö ÔÖ × ÒØ Ö ÐÓ× Ð ÓÖ ØÑÓ× Ý Ð × ×Ô ¬ ÓÒ ×         רÖÙ ØÙÖ ×    ØÓ× ÑÔÐ Ó Ð
ÐÒÙ         ÔÖÓ Ö Ñ ÓÒ C   ++º

      ר    × ÓÒ ÒÓ × ØÓÑÓ × Ò Ò × Ó ÓÒ ×¸ Ð × Ù Ð ×¸ Ö ×ÙÑ Ñ ÒØ ¸ × ÔÙ Ò
 Ð × ¬ Ö Ò Ó× ÖÙÔÓ׺ Ð ÔÖ Ñ ÖÓ Ù ×Ø ÓÒ Ð Ú ÒØÙ Ð × ÓÒÓ Ñ ÒØÓ Ð Ð ØÓÖ ×Ó Ö
 Ð Ð Ò Ù C++º         ×ØÓ Ó Ö ÔÐ Ö ÕÙ ¸ ÒÓ ×ÓÐÓ C++ × ÙÒÓ ÐÓ× Ð Ò Ù × Ñ ×
ÔÓÔÙÐ Ö × ÑÔÓÖØ ÒØ × Ð ÔÖÓ Ö Ñ ÓÒ × ×Ø Ñ ×¸ × ÒÓ ÕÙ ×Ù × ÒØ Ü × Ý × Ñ ÒØ
×ÓÒ Ö Ñ Ò × ÒØ × Ð Ñ ÝÓÖ       ÐÓ× ÓØÖÓ× Ð Ò Ù × ÔÖÓ ÙÖ Ð × Ý Ó ØÓ׺       Ó¸ Ò
 Ð ÕÙÓÖÙÑ ØÙ Ð ÐÓ× Ð Ò Ù × ÔÖÓ Ö Ñ ÓÒ ÔÖÓ ÙÖ Ð × ÒÓ ×ÓÐÓ ÓÑ Ò C++¸ × ÒÓ
ÕÙ Ð Ö ×ØÓ ÐÓ× Ð Ò Ù × × Ò×Ô Ö Ò Ò Ð Ó Ò ×Ù ÔÖ ÙÖ×ÓÖ¸ Ð Ð Ò Ù C ÔÓÖ Òר Ò ×¸
java¸ python¸ perl¸ C# Ý Dº
iv



    Ð × ÙÒ Ó Ø ÔÓ Ó ÓÒ ÒÙÒ ÕÙ Ð ÓÑÔÖ Ò× ÓÒ × ØÓÖÒ Ñ × ¬ ÙÐØÓ× ¸
Ð Ù Ð Ö ÔÐ Ó ÓÒ Ó× Ö ÙÑ ÒØÓ׺ Ð ÔÖ Ñ ÖÓ × ÕÙ ÐÓ× Ð Ò Ù × ÔÖÓ Ö Ñ ÓÒ ×
Ô Ò× ÖÓÒ¸ Ø Ñ Ò¸ Ò ÙÒ ×Ø ÐÓ ÓÐÓÕÙ Ð ½ Ö ×Ô ØÓ Ð ÔÖÓ Ö Ñ ÓÒº ÓÒ× Ö ÑÓ׸
ÔÓÖ ÑÔÐÓ¸ Ð × Ù ÒØ × Ù Ó ÔÖÓ Ö Ñ Ò ÙÒ × Ù Ó Ð Ò Ù     ר ÐÐ ÒÓ
            Repita mientras m > 0 y m < n
                    si a[m] < a[x] entonces
                            m = m/2;
                    de lo contrario
                            m = 2*m
                    fin si
            Fin repita mientras

         Ð Ù Ð × ÕÙ Ú Ð ÒØ   Ð ØÖ Ù ÓÒ Ð Ø Ö Ð¸ ÓÐÓÕÙ Ð ¸ Ð × Ù ÒØ ÐÓÕÙ Ò C++
            while (m > 0 and m < n)
              {
                if (a[m] < a[x])
                  m = m/2;
                else
                  m = 2*m;
              }

     ÙÒÕÙ ÙÒ ÑÔÐÓ ÒÓ ×Ø Ô Ö Ò Ö Ð Þ Ö Ñ             Ò× ×Ó Ö Ð Ù×Ó Ð Ð Ò Ù C++¸
 Ð      Ó × ÕÙ Ù ÐÕÙ Ö ÕÙ ÓÒ× Ö × Ö Ñ ÒØ Ð ÔÖÓ Ö Ñ ÓÒ Ø Ò Ö ÕÙ ÔÖÓ Ö ¹
Ñ Ö Ý ×ØÓ       Ö     ÖÐÓ Ò ÙÒ Ð Ò Ù        ÔÖÓ Ö Ñ ÓÒ Ð Ù Ð¸ Ô Ö Ò Ó Ñ Ð¸ Ù
Ô Ò× Ó Ò Ð Ò Ù Ò Ð × º ÈÓÖ Ø ÒØÓ¸ Ò Ú Ø Ð Ñ ÒØ ¸ ÙÒ ÔÖ Ò Þ ×Ô ÒÓ Ô ÖÐ ÒØ ¹
   Ö ÔÖÓ Ö Ñ Ö Ò ÙÒ Ð Ò Ù       ÔÖÓ Ö Ñ ÓÒ Ò Ð Þ Ó º À Ð ÓØ ÓÒ ÒØ Ö ÓÖ¸
Ø Ñ Ò ÔÓ ÑÓ× Ö ÕÙ Ð ÔÖÓ Ö Ñ Ò ×Ø ÐÐ ÒÓ Ý ×Ù ÕÙ Ú Ð ÒØ Ò C++ Ø Ò Ò Ð
Ñ ×ÑÓ × Ò ¬ Óº × Ô٠׸ × Ù Ó×Ó¸ Ù Ò Ó Ñ ÒÓ׸ ¬ÖÑ Ö ÕÙ Ð ÓÑÔÖ Ò× ÓÒ ×
ØÓÖÒ Ñ × ¬ ÙÐØÓ× º
    ÍÒ ÓÒ ÕÙ × ØÖ ÙÝ Ð Ù×Ó ÙÒ × Ù Ó Ð Ò Ù × ÕÙ ×Ø × Ò Ô Ò ÒØ
    Ð ÑÔÐ Ñ ÒØ ÓÒº Ò Ñ Ö Ø Ö Ó¸ ×ØÓ × Ô Ö ÐÑ ÒØ ÓÖÖ ØÓº ÈÓÖ ÑÔÐÓ¸ Ð ×
ÔÐ ÒØ ÐÐ × Ò C++ ÔÐ ÒØ Ò ÙÒ ÔÖÓ Ð Ñ       ÔÓÖØ Ø Ð       Ò ÓØÖÓ× Ð Ò Ù × ÕÙ ÒÓ Ð ×
Ø Ò Òº Ð Ù Ò ÔÙ Ö Ù Ö ÕÙ Ð Ù×Ó ÔÐ ÒØ ÐÐ × ×ÓÒ Ö ÔØ × Ô Ö Ð ÔÖ Ò Þº
È ÖÓ ×Ø Ó ÓÒ ×ÓÐÓ Ø Ò × ÒØ Ó × ÒÓ × ÓÑÔÖ Ò Ð ÓÒ ÔØÓ Ý ¬Ò ÙÒ ÔÐ ÒØ ÐÐ ¸
 Ù Ð ÒÓ × ÓØÖÓ ÕÙ Ð Ò Ö         º ÒØ Ò Ó ×ØÓ¸ ÙÒ ÔÖÓ Ö Ñ ÓÒ ÔÐ ÒØ ÐÐ × × Ø Ò Ó
Ñ × Ò Ö Ó ÕÙ ÙÒÓ Ö Ð Þ Ó Ò ÙÒ × Ù Ó Ð Ò Ù Ý Ö ×ÙÐØ ÕÙ ×Ø × Ð ÔÖ Ò Ô Ð
 Ö ÙÑ ÒØÓ ÕÙ Ò × ¬ Ò Ò Ð Ò× Ò ÒÞ ÔÖÓ Ö Ñ ÓÒ Ò ÙÒ × Ù Ó Ð Ò Ù º
ØÓ Ó× ÑÓ Ó׸ × × Ù× × ÙÒ × Ù Ó Ð Ò Ù ¸ ÒØÓÒ × Ø Ñ Ò Ö ÕÙ ÔÐ ÒØ Ö× Ð
ÔÖÓ Ð Ñ ØÖ Ù Ö ÙÒ Ð Ò Ù             ÔÖÓ Ö Ñ ÓÒ Ö Ð¾ º Å × ÙÒ Ó Ö ÙÑ ÒØÓ ×ØÖ
 Ò ÕÙ ¸         Ù ÒØ     Ð ÔÓÔÙÐ Ö     Ý ØÖ Ò× Ò Ò        Ð C++¸ Ö Ó ÕÙ × Ñ × Ð
ØÖ Ù Ö ÙÒ ÔÖÓ Ö Ñ Ò ×ØÖÙ ØÙÖ Ó Ò C++               ÓØÖÓ Ð Ò Ù ¸ ÔÓÖ ÑÔÐÓ¸ java¸
ÕÙ ÙÒÓ Ö Ð Þ Ó Ò ÙÒ × Ù Ó Ð Ò Ù ¿ º
     × ÑÔÓ× Ð × Ö ÓÑÔÐ Ø Ñ ÒØ ÓÐÓÕÙ Ð Ò ÙÒ Ð Ò Ù
     ½
                                                          ÔÖÓ Ö Ñ ÓÒº
    ÍÒ ØÖ Ù ÓÒ ÓÒ Ñ × × Ù ÖÞÓ × × ØÖ Ø
     ¾
                                             ÙÒ × Ù Ó Ð Ò Ù     Ò ×Ø ÐÐ ÒÓº
  ¿
            Ó¸ ÑÙ Ó× Ø ÜØÓ× ÔÖÓ Ö Ñ ÓÒ Ô Ö Ò Ò Ö ÒØ ×             ÓÒ × Ô Ö ×Ø ÒØÓ× Ð Ò Ù ×º
 Ò ÑÙ Ó×        רÓ× ×Ó׸ Ð ÙØÓÖ × Ö ÐÓ× ÔÖÓ Ö Ñ × Ò ÙÒ ×ÓÐÓ Ð Ò Ù Ý ÐÙ Ó ÑÔÐ ØÖ Ù ØÓÖ ×
      Ð ÓØÖÓ Ð Ò Ù º Ì Ð × ×ÓÒ ÐÓ× ×Ó× Ë Û Ó Ï ×× Ý ×Ù× × Ö × Ò C¸ C++ Ý java
v



    Biblioteca ALEPH
       ר Ø ÜØÓ ÓÒØ Ò ¸ Ò × Ñ ×ÑÓ¸ ÙÒ ÑÔÐ Ñ ÒØ ÓÒ ÓÒ Ö Ø       ÙÒ     Ð ÓØ ¸ Ð Ö ¸
    ÐÐ Ñ ALEPH¸ ÓÒØ ÒØ Ú          ØÓ × Ð × ×ØÖÙ ØÙÖ ×   ØÓ× Ý Ð ÓÖ ØÑÓ× ØÖ Ø Ó× Ò
      ר Ø ÜØÓº
         Ä Ð ØÙÖ ÔÓ× Ð Ø Ð Ð Ù ÒØ          Ð    Ð ÓØ Ý Ö Ú Ð ×Ô ØÓ× ×Ù ÒרÖÙ¹
    Ñ ÒØ ÓÒº Ë ÐÚÓ ÖÖÓÖ × ÙÒ ÒÓ × Ù ÖØÓ× Ó Ñ ÓÖ × ÕÙ Ù ÐÕÙ Ö × ÔÖÓÔÓÒ Ö¸
      Ð Ð ØÓÖ Ø Ò Ð ÔÓ× Ð          ÔÓÝ Ö× Ò ÙÒ ÑÔÐ ÒØ ÓÒ ÓÒ Ö Ø ÕÙ Ð         ÐØ Ð
      ÔÖÓÔ ÓÒ ×Ù× ÓÒÓ Ñ ÒØÓ׺
         ÄÓ× Ó Ó× Ù ÒØ × ALEPH ר Ò ×ÔÓÒ Ð × Ò ftp:://ftp.ula.ve/lrleon/
    aleph Ù ÖÓÒ ÙØÓÑ Ø Ñ ÒØ Ò ÒØ Ó× ÓÒ bcpp ¿ º
           ÐÓ Ð Ö Ó Ñ ÜÔ Ö Ò ÓÑÓ Ò× Ò ÒØ ¸ ÒØ ÒØ Ó Ö ÓÑÔ Ò× Ö ÐÓ× × Ù Ö ¹
      ÓÖ × ÖÖÓÖ × Ý ÔÖÓÔÓÒ ÒØ × Ñ ÓÖ × ÓÒ ÙÒ ÔÓÒ Ö ÓÒ Ò ×Ù Ð ¬ ÓÒº ÆÓ Ú Ó
    Ò Ò ÙÒ ÑÔ Ñ ÒØÓ ÕÙ ÙÒ Ø Ö ÖÓ ÔÐ ÕÙ ÐÓ Ñ ×ÑÓ × ×Ø Ø ÜØÓ × Ù× ÓÑÓ Ñ Ø Ö Ð
     ÒרÖÙ ÓÒ Ðº Ë Ð ÙÒ Ð ØÓÖ Ù Ö Ñ Ö ÙÐÓ Ò× Ò ÒÞ × Ö ÔÓÖØ Ö Ð ÙÒ ÖÖÓÖ
    Ó Ö Ð Þ Ö Ð ÙÒ Ñ ÓÖ ¸ ÒØÓÒ × Ð Ö Þ Ó ÐÓ Ö ÔÓÖØ Ð Ñ Ð lrleon@ula.veº
         Ä Ó ÙÑ ÒØ ÓÒ Ð         Ð ÓØ ר ×ÔÓÒ Ð Ò Ð ÒÐ http://www.ing.ula.
    ve/alephº ר Ù × Ö Ø Ô Ö ÔÖÓ × Ö× ÓÒ Ð Ü Ð ÒØ ÔÖÓ Ö Ñ doxygen º

    Programaci´n literaria
              o
     Ò Ð Ð ÓÖ ÓÒ          ר Ø ÜØÓ × ÙØ Ð ÞÓ ÙÒ × ×Ø Ñ ÐÐ Ñ Ó noweb ½ ¸ ½ ¸ Ð Ù Ð ×
    ÙÒ × ×Ø Ñ ÔÖÓ Ö Ñ Ó ÕÙ Ò Ö ×Ø Ø ÜØÓ Ý ÐÓ× Ù ÒØ × Ò C++ Ô ÖØ Ö ÙÒ ×ÓÐÓ
     Ö ÚÓ Ù ÒØ º Ð Ù ÒØ ÒØÖ Ð Þ ÔÖÓ× ÜÔÐ Ø Ú ÓÒ ÐÓÕÙ × Ó Ó                          Ð
     ÑÔÐ ÒØ ÓÒ Ð         Ð ÓØ º
         ר ר ÐÓ × Ö ØÙÖ ÔÖÓ Ö Ñ × × ÒÓÑ Ò ÔÖÓ Ö Ñ ÓÒ Ð Ø Ö Ö Ý Ù ÔÖÓ¹
    ÔÙ ×ØÓ ÔÓÖ ÃÒÙØ ½ º Ä         × ÔÖ × ÒØ Ö ÙÒ ×Ø ÐÓ Ñ × ÓÐÓÕÙ Ð Ô Ö × Ö Ö ÔÖÓ Ö Ñ ×
    ÕÙ Ð Ñ ÖÓ ×Ø ÐÓ ÓÖÑ Ó ÙÒ Ð Ò Ù               ÔÖÓ Ö Ñ ÓÒ¸ ÙÒØÓ ÓÒ Ð Ò Ò         ÕÙ
    Ð Ó ÙÑ ÒØ ÓÒ Ý Ð ÙÐØ Ñ Ú Ö× ÓÒ Ð ÔÖÓ Ö Ñ ´ÔÖ ×ÙÑ Ð Ñ ÒØ ÓÖÖ Ø µ Ö × Ò Ò
    ÙÒ ×ÓÐÓ Ù ÒØ º
         Ô ÖØ      Ó Ó Ò C++¸ ÐÓ× ÐÓÕÙ × ÔÙ Ò ÓÒØ Ò Ö Ö Ö Ò × ÓØÖÓ× ÐÓÕ٠׺ ÍÒ
      ¬Ò ÓÒ        ÐÓÕÙ ÓÑ ÒÞ ÔÓÖ ×Ù ÒÓÑ Ö ÒØÖ Ô Ö ÒØ × × Ò ÙÐ Ö ×º ÈÓÖ ÑÔÐÓ¸
     ÓÒ× Ö ÑÓ× Ø ÖÑ Ò Ö × ÙÒ ÒÙÑ ÖÓ n × Ó ÒÓ ÔÖ ÑÓº È Ö ÐÐÓ¸ ÔÓ ÑÓ× ¬Ò Ö Ð
    × Ù ÒØ ÐÓÕÙ
Ú      Ð ÙÐ Ö × Ò × ÔÖ ÑÓ Ú ≡
     if (n <= 2)
       // n es un n´mero primo
                   u
     const int ra´z_de_n = static_cast<int>(ceil(sqrt(n)));
                 ı

     for (int i = 3; i < ra´z_de_n; i += 2)
                           ı
       if (n % i == 0)
         // n no es primo

     // n es un n´mero primo
                 u
        ÄÓ× ÐÓÕÙ × × ÒÙÑ Ö Ò × ÙÒ Ð ÒÙÑ ÖÓ Ð Ô Ò ÓÒ × ¬Ò Ò ÔÓÖ ÔÖ Ñ Ö
    Ú Þº Ë Ý Ñ × ÙÒ ÐÓÕÙ Ò ÙÒ Ô Ò ¸ ÒØÓÒ × ×Ø × Ð Ò ÙÒ Ð ØÖ ÕÙ ¸ Ò
     Ð ÓÖ Ò Ð Ø Ó¸ × ÓÖÖ ×ÔÓÒ ÓÒ ×Ù ÓÖ Ò Ô Ö ÓÒº Ð ÙÒÓ× ÐÓÕÙ × Ö Ö Ò Ò
      ÓØÖÓ× ÐÓÕÙ × Ó Ú Ö Ð ×º
vi



     ÄÓ× ÐÓÕÙ × ×Ø Ò × Ö ØÓ× Ò ÙÒ ÓÖ Ò ÕÙ × Ö × ÔÖ Ö Ð Ô Ö Ð ÓÑÔÖ Ò× ÓÒ
ÕÙ Ð Ñ ÖÓ Ð ×Ø Ó Ó Óº × ¸ Ö               Ö ØÓ Ö Ø ÕÙ × Ñ ÔÙ            Ö ×Ó Ö Ð
 ר ÐÓ Ý ÓÖ Ò ÔÖ × ÒØ ÓÒ ÙÒ ×ØÖÙ ØÙÖ             ØÓ Ó Ð ÓÖ ØÑÓ Ò ÔÖÓ Ö Ñ ÓÒ Ð Ø¹
 Ö Ö ¸ Ô ÖÓ Ð ×ÓÐ ØÓ Ð Ö Ø Ó ÙÒ × Ù ÖÞÓ ÔÖ Ñ Ò Ó ÔÓÖ ÓÑÔ Ö Ö Ð ×Ø ÐÓ noweb ÓÒ
 Ð Ð ×Ø Ó ÔÐ ÒÓ Ó Ó Ý¸ ÒØÓÒ ×¸ Ó × ÓÒ× Ö ÓÒ¸ Ö Ö ×Ù Ö Ø º
     ÈÙ        Ö× ÕÙ ×Ø Ø ÜØÓ ÓÒØ Ò Ð ÑÔÐ ÒØ ÓÒ          Ù ÒØ רÖÙ ØÙÖ        ØÓ×
Ó Ð ÓÖ ØÑÓ × ×ØÙ º ÑÔ ÖÓ¸ ØÓÑ Ö× ×ØÓ Ð Ô          Ð Ð ØÖ     ÖÖ Ö ×Ø ÒØ Ô Ô Ð
     Ñ × ÕÙ Ö ×Ø Ø ÜØÓ Ñ × ÚÓÐÙÑ ÒÓ×Ó Ý Ö Ô Ø Ø ÚÓº Ò × × ÒØ Ó¸ Ò Ö × Ð
 ×Ô Ó¸ × Ò Ö Ð Þ Ó ÓÖØ ×            Ó× Ø ÔÓ×
    ½º Å Ò Ó      Ü Ô ÓÒ × ÙÒÕÙ ×Ø ×Ô ØÓ ÓÒר ØÙÝ ÙÒ             Ð × ÓÒ × Ñ ×
        Ð ÒØ × C++¸ ר Ø ÜØÓ × ÒÓ ÐÓ× ÔÖ × ÒØ º
    ¾º Å ØÓ Ó× Ð × × Ö Ô Ø Ø ÚÓ× Ó ÑÙÝ × ÑÔР׺
  Ò Ñ Ó× ×Ó׸ Ð Ó Ó Ð Ð ÓØ ¸ Ö Ø Ñ ÒØ Ò Ö Ó Ô ÖØ Ö Ð Ù ÒØ noweb
     ר Ø ÜØÓ¸ ר ÓÑÔÐ ØÓ × Ö¸ Ð Ð ÓØ ÓÒØ Ò ÐÓ× Ñ Ò ÓÖ × Ü Ô ÓÒ ×
Ý Ñ ØÓ Ó× ÓÑ Ø Ó× Ò ×Ø Ø ÜØÓº

Ejercicios
  Ù ÐÕÙ Ö × Ð ÔÖ Ø ¸ ÒÓ Ý ÓØÖ Ñ Ò Ö                     ÕÙ ÙÒ ÔÖ Ø ÒØ ÓÒ×ÙÑ ×Ù×
 ÓÒÓ Ñ ÒØÓ× ÕÙ ÒÓ ×             Ò Ó ÔÖ Ø º ÈÓÖ Ñ × × Ù ÖÞÓ ÕÙ × Ö Ð ÔÓÖ ÓÖ ÒØ Ö
Ý Ò× Ò Ö¸ Ð ÔÖ Ò Þ          ¸ ÔÖ Ö Ð Ñ ÒØ Ù Ó ÔÓÖ ÙÒ Ñ ×ØÖÓ¸ Ö Ø Ö ÔÓÖ × ×ÓÐÓ
ÐÓ ÔÖ Ò Óº
    À Ý ØÖ × Ñ Ò Ö ×¸ ÕÙ ÒÓ        Ò × Ö Ü ÐÙÝ ÒØ ׸ Ö Ð Þ Ö ÐÓ ÒØ Ö ÓÖ
   ½º Ê ×ÓÐÙ ÓÒ          Ö Ó× ÔÖÓÔÙ ×ØÓ× Ò ×Ø × ÒØ Ó¸ Ð ¬Ò Ð                Ô ØÙÐÓ ×
      ÔÖ × ÒØ ÙÒ ÓÒ ÙÒØÓ          Ö Ó× ×Ø Ò Ó׸ ÔÖ ÑÓÖ ÐÑ ÒØ ¸ Ð Ö ×ÓÐÙ ÓÒ Ò
      ×ÓÐ Ø Ö Ó ÔÓÖ Ô ÖØ Ð ÔÖ Ò Þº
        Ð ÙÒÓ× Ö Ó× ×ÓÒ Ø ÓÖ Ó× Ò Ð × ÒØ Ó ÕÙ ÒÓ Ò × Ö Ñ ÒØ Ö ÕÙ Ö Ò
       × Ö Ö ÙÒ ÔÖÓ Ö Ñ ÓÑÔ Ð Ð º ÈÓÖ ×ÙÔÙ ×ØÓ¸ ÒÓ ×Ø ÔÖÓ          Ó × ÒØ Ö× Ö ÒØ Ð
       ÓÑÔÙØ ÓÖ ÒØ ÒØ Ö ÓÒ Ö Ø Ö Ð Ö Ó Ñ ÒØ ÙÒ ÔÖÓ Ö Ñ º ÇØÖÓ× Ö Ó×
      ×ÓÒ ÔÖ Ø Ó× Ý ÓÒ× ×Ø Ò Ò ÜØ Ò× ÓÒ × Ð           Ð ÓØ º רÓ× Ö Ó× ×ÓÒ ×Ø Ò¹
       Ù Ð × ÐÓ× Ø ÓÖ Ó× ÔÓÖÕÙ ÒÙÒ Ò ×Ù Ö ×ÙÐØ Ó Ò Ø ÖÑ ÒÓ× ÙÒ Ó ØÓ Ð
          Ð ÓØ º
      ÄÓ× Ö Ó× ×Ø Ò Ð × ¬ Ó× × ÙÒ ÙÒ ¬ ÙÐØ ×Ù Ø Ú ÙÞ                      ÔÓÖ Ñ º ÆÓ
       × Ð ÔÓÒ Ö Ö Ð Ø ÑÔÓ Ö ×ÓÐÙ ÓÒ ÙÒ Ö Ó¸ ÔÙ × ×Ø Ô Ò                             Ð
       ×ØÙ ÒØ ¸ Ô ÖÓ ÕÙ Ñ Ð × ¬ ÓÒ
       ´ µ Æ Ò ÙÒ ÖÙÞ ÒÓØ ÙÒ Ö Ó ÓÒ× Ö Ó × Ò ÐÐÓº ÄÓ× Ø ÓÖ Ó×                    Ö Ò
                Ö ×ÓÐÚ Ö× Ò Ð ÓÖ Ò       Ò Ó Ñ ÒÙØÓ׸ Ñ ÒØÖ × ÕÙ ÐÓ× ÔÖ Ø Ó× Ò Ð
             ÙÒ º
       ´ µ ÍÒ ÖÙÞ ´·µ ÜÔÖ × ÙÒ Ø ÑÔÓ ×Ø Ñ Ó ÙÒ Ó× ÓÖ × Ò Ð ×Ó ÙÒ
                Ö Ó Ø ÓÖ Ó Ý     Ó× × Ò Ð ÔÖ Ø Óº
       ´ µ Ó× ÖÙ × ´··µ ÜÔÖ × Ò Ý ÙÒ ¬ ÙÐØ ÑÙ Ó Ñ ÝÓÖº ÈÓÖ ÐÓ Ò Ö Ð¸
              ר Ð ×       Ö Ó× ÔÐ ÒØ Ò Ð ÔÖ Ò Þ ÙÒ × Ù Ö Ñ ÒØÓ Ó Ö Ú Ð ÓÒ
vii



            ÙÒ ØÖÙ Ó Ó Ø Ò ÕÙ ¸ ÙÒ Ú Þ Ö Ú Ð ¸                  Ö Ù Ö Ð ÓÑÔÐ         Ð
                 Ö Ó Ò Ò ÙÒ ÖÙÞº
               Ð Ø ÑÔÓ ÙÒ Ö Ó Ø ÓÖ Ó               × Ö Ð Ñ ÒÓ× ÙÒ ¸ Ñ ÒØÖ × ÕÙ Ð
                 ÙÒÓ ÔÖ Ø Ó ØÖ × ´¿µ ׺
       ´ µ ÌÖ × ÖÙ × ´···µ Ö ÔÖ × ÒØ Ò ÙÒ Ö Ó Ð Ø ¸                 и ÙÒ¸ Ô Ö ÙÒ Ñ ×¹
            ØÖÓ Ý ×Ù Ø ÑÔÓ Ö ×ÓÐÙ ÓÒ ÒÓ ×Ø Ð Ñ Ø Óº
   ¾º Ê Ð Þ ÓÒ             Ö Ó× Ù Ó× Ò Ð ÓÖ ØÓÖ Ó ÙÒÓ ÐÓ× Ö Ò × Ó ×Ø ÙÐÓ× ÕÙ
      ÐÓ ×ØÖ ØÓ ÔÐ ÒØ Ð ÔÖ Ò Þ ¹Ý ÙÒÓ Ö ÕÙ ÐÐÓ Ó ÙÖÖ Ò Ù ÐÕÙ Ö ÔÖ Ø ¹ ×
      ÕÙ ×Ù ÓÒ ÓÒ ÒÓÚ Ð ¬ ÙÐØ ÔØ Ö ÕÙ ÐÓ ÕÙ Ô Ö Ð ÔÙ × Ö Ò ÔÖ Ò Ô Ó
         ×ØÖ ØÓ Ú Ò Ö ¸ ØÖ Ú × Ð Ö Ó¸ ÓÒ Ö ØÓº
           Ó ÐÓ ÒØ Ö ÓÖ¸ ÔÙ           Ö× ÕÙ Ð × ÒØ Ó ÙÒ Ö Ó Ò Ð ÓÖ ØÓÖ Ó ×
      Ô ÖÑ Ø ÖÐ Ð ×ØÙ ÒØ Ò Ö Ð ÓÒ Ö ÓÒ ×Ù× ÓÒÓ Ñ ÒØÓ׺ È Ö ÐÐÓ¸ Ò
      Ð ÓÖ ØÓÖ Ó¸ ÔÙ Ò Ö Ð Þ Ö× ØÖ × Ø Ú            ×
       ´ µ ÓÒØ ÑÔÐ ÓÒ ÙÒ ÔÖÓ Ð Ñ ÓÑÔÙØ ÓÒ Ð¸ ÙÒØÓ ÓÒ ×Ù ×ÓÐÙ ÓÒ¸ Ò Ð Ù Ð
            ×         Ù×Ó Ð ÙÒ ×ØÖÙ ØÙÖ            ØÓ× Ó Ð ÓÖ ØÑÓ ×ØÙ Óº
               Ð Ù         Ð ÓÖ ØÓÖ Ó ÔÙ      ÒÙÒ Ö Ð ÔÖÓ Ð Ñ Ý ÔÖ × ÒØ Ö Ð ÒרÖÙ¹
            Ñ ÒØ ÓÒ ×Ù ×ÓÐÙ ÓÒº ÄÙ Ó¸ ÒÚ Ø Ö Ð ×ØÙ ÒØ Ö Ú × Ö ÐÓ× Ù ÒØ ×
                 Ò Ö Ö¸ ÒØ × ×Ù Ù ÓÒ¸ Ð × Ø Ò × Ý ×Ø ÐÓ× ÙØ Ð Þ Ó× Ò Ð ÒרÖÙ¹
            Ñ ÒØ ÓÒº
       ´ µ ÓÒØ ÑÔÐ ÓÒ Ð                Ù ÓÒ Ð ÔÖÓ Ö Ñ Ô Ö Ú Ö× × ÓÑ Ò ÓÒ ×
              ÒØÖ º ר × Ð × Ò Ð Ù Ð Ð ÔÖ Ò Þ ÓÑ ÒÞ × ÒØ Ö ÓÒ Ö ÓÒ
              × Ö¸ ÕÙ ÐÓ× ÓÒ ÔØÓ× ×ØÖ ØÓ× Ô Ö Ò Ò ×ÓÐÙ ÓÒ × ÓÒ Ö Ø ×º
               ÙÖ ÒØ ר Ø Ú           ÔÙ × Ö Ö ÓÑ Ò Ð Ð ÙØ Ð Þ ÓÒ ÙÒ ÔÙ¹
            Ö ÓÖ º
       ´ µ Ò ÐÑ ÒØ ¸ Ö ×ÓÐÙ ÓÒ ÙÒ Ú Ö ÒØ Ð ÔÖÓ Ð Ñ Ô ÖØ Ö Ð ×ÓÐÙ ÓÒ
            ÔÖ Ñ Ò º Ò ×Ø ÔÙÒØÓ¸ × ÑÙÝ ÑÔÓÖØ ÒØ ÕÙ × ØÖ                  ×Ó Ö Ð Ñ ×ÑÓ
            ÔÖÓ Ð Ñ Ý Ù ÒØ ׸ Ô ÖÓ ÓÒ Ð ÙÒ Ú Ö ÒØ ÙÒ ÑÔÐ ÓÒ Ô Ö Ö ×ÓÐÚ Ö
            ÓØÖ × Ð × × ÒØÖ ×¸ ÔÓÖ ÑÔÐÓº
   ¿º Ê Ð Þ ÓÒ ØÖ Ó× ÔÖ Ø Ó× Ò Ù Ð Ñ ÒØ ¸ Ò Ð ×Ô Ö ØÙ Ð ÔÖÓÚ Ö Ó
        Ø Ó¸ ר × Ð × ÕÙ × Ò                Ð      Ö Ô Ö ÒØ Ò Ö º
         ÓÑÓ          × Ö Ð ÔÖÓÝ ØÓ         ÓÖÖ ×ÔÓÒ Ö× ÓÒ ÙÒ ÔÖÓ Ð Ñ ÓÖ Ò Ð Ô Ö Ý
       ÓÒ × ÒØ Ó Ð ÓÒØ ÜØÓ Ò ÓÒ × Ò× Ò × Ö¸ ÓÖÑÙÐ Ó ÔÓÖ Ý Ô Ö Ù× Ö× Ò
      Ð ÓÑÙÒ            Ò ÓÒ × Ö Ð Ð Ò× Ò ÒÞ             ר ÙÖ×Óº ÈÓÖ ÑÔÐÓ¸ × Ð ÒÓ
       Ð ÐÙ Ö Ò× Ò ÒÞ × Ô              Ò ÔÖÓ Ð Ñ × ØÖ ¬ Ó¸ ÒØÓÒ × ÔÙ ÔÐ ÒØ Ö×
      ÙÒ ÓÒ ÙÒØÓ ÑÔÐ × ÑÓ ÔÖÓÝ ØÓ× Ò ØÓÖÒÓ Ð × ÑÙÐ ÓÒ Ð ØÖ ¬ Ó Ý Ð ×ØÙ Ó
            Ú Ö× × Ø Ò × Ô Ö Ú Ø Ö Ð ÓÒ ×Ø ÓÒº ÍÒ ÔÖÓÝ ØÓ ר Ø ÔÓ Ö ÕÙ Ö Ö ¸
      ÔÓÖ ÑÔÐÓ¸ Ð ÑÓ Ð Þ ÓÒ ÓÒ Ö Ó× Ð × Ú ×                   Ö ÙÐ ÓÒ¸ Ñ Ò ×ÑÓ×
       ÓÒØÖÓÐ ÓÑÓ ÐÓ× × Ñ ÓÖÓ× Ý           ÒØ × Ö ÙÐ ÒØ × ÓÑÓ ÐÓ× ÙØÓÑÓÚ Ð ×º
ËÓ Ö × Ó × Ö Ü × Ú Ñ ÒØ Ö Ô Ø Ø ÚÓ¸ Ó Ò× ×Ø Ö Ò Ð ÑÔÓÖØ Ò                   ÐÓ× Ö Ó׺
 ×ØÓ Ý            × Ö Ó Ú Ó × Ð Ô Ö×Ô Ø Ú Ð ×ØÙ ÒØ ¸ ÔÙ × × Ð ÙÒ Ó Ñ Ó
   Ö Ø Ö× º Ð ÒרÖÙ ØÓÖ¸ ÔÓÖ ÓØÖ Ô ÖØ ¸ Ð Ô ÖÑ Ø ÒÖ ÕÙ Ö Ð Ò× Ò ÒÞ Ù Ò Ó ×
ÔÐ ÒØ Ò Ö Ó× ÕÙ ÓÑÔÐ Ø Ò Ó ÓÑÔÐ Ñ ÒØ Ò Ð ÓÒÓ Ñ ÒØÓ ÑÔ ÖØ Ó × ÓÑÓ¸
Ñ ÒØ Ð ÓÖÖ ÓÒ¸ ×ÙÔ ÖÚ × Ö Ð Ò Ú Ð ×Ù× ×ØÙ ÒØ ׺
viii



Historia
  ÓÑ Ò Ð Ð ÓÖ ÓÒ Ð Ð ÓØ ALEPH Ò Ñ ÝÓ ½ º Ò ÕÙ Ð ÒØÓÒ × Ñ
 ÓÒ× Ö × Ö Ö Ð × × Ó ØÓ× Ô Ö Ö ÔÖ × ÒØ Ö Ð ×Ø × ´Ð × Ö ÖÕÙ × Slink Ý Dlinkµ¸
 Ö ÓÐ × Ò Ö Ó× ´Ð × Ö ÖÕÙ × BinNode<Key> Ý Avl Tree<Key>µ Ý Ø Ð × × ´Ð Ð ×
LhashTable<Key>µº
     È ÖØ × ×Ø Ø ÜØÓ ÓÑ ÒÞ ÖÓÒ Ô Ö Ö Ñ                    Ó× ½ ¸ ÐÙ Ó ÕÙ Ð ÙÒÓ×
 ×ØÙ ÒØ × Ñ Ó × ÖÚ × Ò ÕÙ Ð × × Ö ÙØ Ð Ð Ö Ð ÓÖ ØÑÓ× Ò Ó Ó Ý ÕÙ ×ØÓ× Ù × Ò
    Ò ÓÑ ÒØ Ó׺ Ù ÒØÓÒ × Ù Ò Ó Ô Ð noweb¸ ÙÝ Ñ ×ØÖ Ð Ø Ú Ý
 ÓÒÓ Ó Ù Ò Ó¸ ×ØÙ Ò Ó Ò Ö ÓÒ Ò Ñ                        Ó Ó¸ Ñ Ù ÓÔÓÖØÙÒ × ÑÓ Ð Ö Ð
Ð ÖÓ ÓÑÔ Ð ÓÖ × À Ò×ÓÒ Ý Ö × Ö ½¾ º Ò × Ø ÑÔÓ × Ö Ô ÖØ ÐÓ ÕÙ ÓÝ
 × Ð Ô ØÙÐÓ ¾¸ ÓÒ ÖÒ ÒØ × Ù Ò ×º Ñ                      Ó× Ð ¾¼¼¼ ÓÑ Ò Ð Ô ØÙÐÓ
×Ó Ö Ö ÓÐ × Ý Ô ÖØ Ð ¸ Ö Ö ÒØ Ð × Ø Ð × × º Ð Ô ØÙÐÓ                      Ø Ò Ó ×Ø ÒØ ×
ÑÓ ¬ ÓÒ × ×Ù ÓÒØ Ò Ó ÓÖ Ò Ð Ý Ò ÙÖ ×¸ Ó ÙÖÖ ×¸ Ò ×Ù Ñ ÝÓÖ Ô ÖØ ¸ Ò Ð
Ð Ö Ó Ô Ö Ó Ó ÓÑÔÖ Ò Ó ÒØÖ ¾¼¼½ Ý ¾¼¼ º
      Ò ÒÓÚ Ñ Ö Ð ¾¼¼½ Ö Ø ¸ × ÒØ Ö Ñ ÒØ ¸ ÐÓ ÕÙ ØÙ ÐÑ ÒØ × Ð Ô ØÙÐÓ
×Ó Ö ÕÙ Ð Ö Ó Ö ÓР׺
       Ñ       Ó× Ð ¾¼¼ Ò Ð ÜØ Ò× ÓÒ Ð               Ð ÓØ            Ö Ó× Ø Ñ ÔÖ × ÒØ Ó
 Ò Ð Ô ØÙÐÓ º Ä × ×ØÖÙ ØÙÖ × Ý Ð ÓÖ ØÑÓ× Ò ØÓÖÒÓ ×Ø ÓÑ Ò Ó Ò Ú Ö Ó ×Ø ÒØ
 Ò ÓÖÑ Ý ÒÓ × Ó¸ ר Ó×ØÓ Ð ¾¼¼ ¸ Ò ÕÙ Ò ØÓÑ Ó ÙÒ Ú Ö× ÓÒ ×Ø Ð º Ö Ó
ÕÙ Ò ×Ø ÓÑ Ò Ó × ÓÒ ×Ø Ø ÜØÓ Ö Ð Þ ×Ù× ÔÖ Ò Ô Ð × ÔÓÖØ ׺
        ×      Ö ÖÓ ¾¼¼ Ñ ÔÐ ÒØ Ð × Ù ÖÞÓ Ö Ú × Ö Ý ÙÒ ¬ Ö ÐÓ× Ô ØÙÐÓ× Ó
ÐÓ ÕÙ ÓÝ ÓÒ ÓÖÑ ×Ø Ø ÜØÓº × Ö ÒØ Ö Ñ ÒØ ÐÓ× Ô ØÙÐÓ× ½¸ ×Ó Ö ×ØÖ ÓÒ
   ØÓ׸ Ý Ð ¿¸ ÓÒ ÖÒ ÒØ Ð Ö Ø              Ð ÓÖ ØÑÓ× Ý ×ØÖÙ ØÙÖ ×        ØÓ׺
      Ð × ÔØ Ñ Ö ¾¼¼ ÙÐÑ Ò Ð Ô ØÙÐÓ Ö Ö ÒØ Ð × Ø Ð × × º
     Ä Ñ ÝÓÖ         Ð × ¬ ÙÖ ×    ר Ð ÖÓ Ù ÖÓÒ Ò Ö × ÙØÓÑ Ø Ñ ÒØ Ñ ÒØ
ÔÖÓ Ö Ñ × Ð ÓÖ Ó× ÓÒ Ð ÔÖÓÔ             Ð ÓØ ALEPHº Ò × × ÒØ Ó¸ Ý ØÖ × ÔÖÓ Ö ¹
Ñ×
    ½º btreepic Ô Ö       Ù Ö Ö ÓÐ × Ò Ö Ó׺
    ¾º ntreepic Ô Ö       Ù Ö Ö ÓÖ × Ò × Ý Ö ÓÐ × Ò Ò Ö Ðº
    ¿º graphpic Ô Ö       Ù Ö Ö Ó׺
  Ð ÔÖ Ñ Ö ÔÖÓ Ö Ñ ¸ btreepic¸ Ù ÑÓØ Ú Ó Ñ Ò× Ø × ÓÒ ÓÒ ÐÓ× Ù Ó× Ö ÓÐ ×
   Ò Ö Ó× Ö Ð Þ Ó× ÓÒ ÔÖÓ Ö Ñ × ×Ô Ð × Ø Ð × ÓÑÓ Xfig Ý diaº                ×ØÓ × ÙÒÓ Ð
 ÑÔÓ× Ð Ñ Ø Ö Ð                Ù Ö Ö ÓÐ × ÒÓÖÑ × ¹        ÒØÓ× Ó Ñ Ð × ÒÓ Ó×¹º Ò Ú ÖØÙ
     רӏ ×ÓÐ Ø ÙÒ ØÖ Ó × ÓÐ Ö Ð Ö ×Ô ØÓ ÙÝÓ× Ö ×ÙÐØ Ó׸ Ô × Ö × Ø × ÖÑ
 × ÓÐ ÖÑ ÒØ ¸ ר ÖÓÒ ÑÙ Ó × ÖÑ ×Ù¬ ÒØ ׺ Ö Þ × ÜÔ Ö Ò ¸                              ÔÓÖ
Ñ ÔÖÓÔ Ù ÒØ Ö Ð Þ Ö btreepicº Ù Ò Ó ØÙÚ ÕÙ                   Ù Ö Ö ÓÐ × Ò Ö Ð ×¸ ×ÓÐ Ø
 Ð Ñ ×ÑÓ Ø ÔÓ ÔÖÓ Ö Ñ ÕÙ Ô Ö Ó ÙÒ ×ØÙ ÒØ Ü Ð×Ó¸ ÐÐ Ñ Ó ÂÓ× Ö ØÓ¸
ÕÙ Ò ÓÖ Ó ÙÒ ÔÖ Ñ Ö Ú Ö× ÓÒ ÐÐ Ñ xtreepic Ý ÕÙ ×Ø ×ØÖ Ù                        Ò ALEPHº
Ä Ñ ÒØ Ð Ñ ÒØ ¸ ר Ú Ö× ÓÒ ÓÔ Ö ×Ó Ö ÙÒ Ú Ö× ÓÒ Ö ÓÐ × ÕÙ Ð ÔÓ                        Ñ
Ò ×         Ý Ö Ú × ÓÒ Ý Ö       Ù ¸ ÔÓÖ ÐÓ ÕÙ ÔÖ Ö Ö           Ö ÒØ Ö Ñ ÒØ Ð ÔÖÓ Ö Ñ
    Ó Ð ÒÓÑ Ö ntreepicº È Ö Ð Ð ÓÖ ÓÒ Ð ÔÖÓ Ö Ñ Ñ Ù ÑÙÝ ÙØ Ð Ð ÖÑÓ×Ó
Ø ÜØÓ ×Ó Ö       Ù Ó        Ö Ó× ÃÓÞÓ ËÙ Ý Ñ ¾¼ º Ò ÐÑ ÒØ ¸ Ù Ò Ó Ñ Ò ÓÒØÖ
 Ò Ð Ñ ×Ñ Ò ×             Ö ×Ô ØÓ ÐÓ× Ö Ó׸ ÔÖÓÚ           Ð Ó × ÓÒ Ô Ö × ÖÖÓÐÐ Ö ×
ix



 ÒØ Ö Ñ ÒØ Ð ÓÖÔÙ× Ð ÓÖ ØÑ Ó Ò ÓÑ ØÖ ÓÑÔÙØ ÓÒ Ðº Ð ÔÖÓ Ö Ñ Ö ×ÙÐØ ÒØ ¸
graphpic     × ÙÒ ÑÙÝ × ÑÔÐ Ý Ú ØÓ Ð Ð ÓÖ ØÑ Ú Ò ÙÐ               Ð Ù Ó ÙØÓÑ Ø Ó
     Ö Ó×           Ó¸ Ð × × ÓÒ × ×Ó Ö Ù Ó ×ÓÒ ØÓÑ × ÔÓÖ Ð Ù×Ù Ö Ó Ô ÖÓ ÔÙ Ö
     Ö ÕÙ graphpic Ø Ò Ð Ú ÖØÙ ÓÔ Ö Ö ÒØ Ö Ñ ÒØ ×Ó Ö ÓÑ ØÖ ÓÑÔÙØ ÓÒ Ð
Ý ÕÙ ÐÐÓ¸ ÒÓ ×ÓÐÓ Ú Ð ×Ø ÑÔÓ¸ × ÒÓ ÕÙ Ö ÙØÙÖÓ× × ÖÖÓÐÐÓ׺
       Ò Å ÖÞÓ ¾¼¼ Ò Ð × Ö ØÙÖ Ð Ó ÙÑ ÒØ ÓÒ Ð Ð ÓØ º Å Ò Ö ÒØ
   ÙÒ ÔÖÓ Ð Ñ        ÓÑÓ ÒØ Ö Ö Ð Ó ÙÑ ÒØ ÓÒ Ò Ð Ù ÒØ              ר Ø ÜØÓ × Ò ÕÙ ÐÐ
 Ô Ö Þ Ò Ð Ø ÜØÓ º Ê ÕÙ Ö × Ö ÖÐ Ò Ð Ñ ×ÑÓ × Ø Ó ÓÒ × Ö ×Ø Ð ÖÓ ÔÓÖÕÙ
     × ÑÓ Ó¸ Ó Ð Ñ ×Ñ Ó ØÖ Ò noweb¸ ÙÒ ÑÓ ¬ ÓÒ Ð Ð ÓØ × ÔÓ Ö
   ØÙ Ð Þ Ö Ö Ô Ñ ÒØ Ò Ð Ó ÙÑ ÒØ ÓÒº                  ÒØÓÒ × × Ò Ö ÙÒ ¬ÐØÖÓ Ø ÜØÓ
ÕÙ Ö ÓÒÓ × ÐÓ× ÐÓÕÙ ×             Ó ÙÑ ÒØ ÓÒ ÒØÖÓ Ð Ù ÒØ noweb Ý ÐÓ× Ð Ñ Ò ×
    Ñ Ò Ö ÕÙ ÒÓ Ô Ö × Ò Ò Ð × Ð Ä Ì º Ì Ð ¬ÐØÖÓ × ÒÓÑ Ò deldoxygen Ý
 Ù × Ö ØÓ ÓÒ Ð Ò Ö ÓÖ            Ò Ð Þ ÓÖ × Ð Ü Ó Ö ¬ Ó× flex Ý C++º Ð Ù Ò Ö ÕÙ
ÔÙ          ÖÐÓ      Ó Ò ØÖ ÒØ Ñ ÒÙØÓ× ÓÒ ÙÒÓ ÐÓ× Ð Ò Ù × × Ö ÔØ Ò ÑÓ ÖÒÓ×
´perl¸ python¸ Ø ºµº ÈÖÓ Ð Ñ ÒØ ×          ÖØÓ × ÝÓ Ù × Ñ ×ØÖÓ Ò Ð ÙÒÓ ÕÙ ÐÐÓ×
Ð Ò Ù ×¸ Ô ÖÓ¸ Ò Ò ÙÖ              × Ñ Ö ÔÐ Ö ÓÒ ØÖ ×      Ó׺ ÈÖ Ñ ÖÓ¸ ÑÓÖ ÙÒ Ô Ö
      ÓÖ × Ò × Ö Ö deldoxygen ÔÓÖÕÙ Ø Ò ÕÙ Ò ÒÓ× × Ò Ù× Ö flex Ý ÒÓ Ö ÓÖ
    Ò Ð Ð Ò Ù ÒÓ × ÔÙ × ÑÙ Ð              Ö Ò º Ë ÙÒ Ó¸ Ñ ¬ÐØÖÓ Ø Ò ÑÙ × Ñ ×
ÔÓ× Ð         × × Ö ÓÖÖ ØÓ¸ ÔÙ × Ù ×Ô ¬ Ó ¹ÒÓ ÔÖÓ Ö Ñ Ó¹ Ó Ð ÓÖÑ Ð ×ÑÓ
    Ð × ÜÔÖ × ÓÒ × Ö ÙÐ Ö × Ý ÐÓ× ÙØÓÑ Ø × Ò ÙÒ Ð Ò Ù         × Ö ÔØ Ò ¸ ר ÓÖÖ Ø ØÙ
Ø Ò ÕÙ ÔÖÓ Ö Ñ Ö× Ý ÒÓ ×Ô ¬ Ö× ÓÑÓ Ù Ð ×Óº Ò ÐÑ ÒØ ¸ Ð ¬ÐØÖÓ                       ×Ö
 ÓÒ× Ö Ð Ñ ÒØ Ñ × Ú ÐÓÞ ÕÙ ÙÒ ÓÒØÖ Ô ÖØ × Ö ÔØ Ò ÝÓ Ö ¸ Ù Ò Ó Ñ ÒÓ׸ Ó×
ÓÖ Ò × Ñ Ò ØÙ º
       Ù Ò Ó Ñ Ò ÓÒØÖ         ÒÐ       ÓÒ ¬Ò Ð      ר Ú Ö× ÓÒ ´Å ÖÞÓ ¾¼¼ µ¸ Ù
Ö Ð Þ Ö ÕÙ Ð Ø ÜØÓ ÓÒØ Ò ´Ý ÙÒ ÓÒØ Ò µ ÐÓÕÙ × noweb ÓÒ Ô ÞÓ× Ó Ó × Ò
ÑÙ Ó Ú ÐÓÖ           Ø Ó ÔÓÖ ÑÔÐÓ¸ Ö Ô Ø Ö ÙÒ ÓÒ × ÙÝÓ × ÒØ Ó Ý Ù ÜÔÐ Ó Ò
ÓØÖÓ ÐÙ Ö Ô Ö ÓØÖ Ð ×          Ó ØÓº           ÒØÓÒ × × Ò Ö ÓØÖÓ ¬ÐØÖÓ Ø ÜØÓ ÕÙ
Ö ÓÒÓÞ         Ð Ñ Ø ÓÖ × ÒØÖÓ Ð Ù ÒØ noweb Ý ÕÙ × ÒÚÓ × ÒØ × nowebº Ð
¬ÐØÖÓ × ÒÓÑ Ò nobook¸ Ù × Ö ØÓ Ø Ñ Ò Ò flex Ý Ð Ñ Ò ¸ Ô Ö Ð × Ð Ä Ì ¸ ÐÓ×
  ÐÓÕÙ × Ð Ñ Ø Ó׺

Cosas que faltan y sobran
   × ÑÙ × Ô Ö×Ô Ø Ú ×¸ × ÑÔÖ ÙÒ Ø ÜØÓ ÓÐ                ÐØ   Ð Óº ÕÙ × Ó Ö Ö Ö
  ÐÓ ÕÙ ¸ Ö Ó ¸ Ù Ö         Ó Ô Ö Ø Ñ ÒØ Ö Ð Þ Ö Ý ÐÓ ÕÙ ¸ ÓÒ ÖØ ØÙ ¸ ÒÓ
        Öº
      Ö Ó × Ò Ö Ñ ÒØ ÕÙ Ð × ×ØÖÙ ØÙÖ ×      ØÓ× Ý Ð ÓÖ ØÑÓ× ÙÒ Ñ ÒØ Ð × ×Ø Ò ÔÖ ¹
× ÒØ × Ò ×Ø Ø ÜØÓ ÙÒÕÙ × ÙÖÓ Ð ÙÒ Ô Ö × Ö Ô Ö º ÈÓÖ ÓØÖ Ô ÖØ ¸ Ñ Ø Ö Ð ÕÙ
  Ñ Ù Ó × ÐØÓ ÒØ Ö ×¸ ÕÙ ×Ø ÔÖ × ÒØ Ò Ð             Ð ÓØ ALEPH¸ ÒÓ ×Ø ÔÖ × ÒØ
 Ò ×Ø Ø ÜØÓº ÄÓ× ÑÔÐÓ× Ñ × ÒÓØ Ð × ÐÐÓ ×ÓÒ Ð × Ð ×Ø × × Ô¸ ÓÐÓÖ Ó×          Ö Ó׸
   Ñ ÒÓ× ÙÐ Ö ÒÓ× Ý Ñ ÐØÓÒ ÒÓ׸ רÖÙ ØÙÖ ×        Ö Ó× ÓÒ ÙÖÖ ÒØ ׸     ÒØ × Ý
× ÑÙÐ ÓÒ¸ רÖÙ ØÙÖ ×      Ö Ó× Ý ×Ù× Ð ÓÖ ØÑÓ× × Ó× Ò ÓÐÓÒ ×        ÓÖÑ × Ý ¹
ÓÑ ØÖ ÓÑÔÙØ ÓÒ Ðº Å Ù × Ùר Ó Ò ÐÙ ÖÐ × Ò ×Ø Ð ÖÓ¸ Ô ÖÓ Ý Ñ ×Ó Ö Ô ×Ó
 Ð ÑÓÑ ÒØÓ Ý ÓØ Ð Ð Ñ Ø        ×Ô Óº
      ×Ô ØÓ× ÕÙ ÒÓ ×Ø Ò × ÖÖÓÐÐ Ó× Ò ALEPH Ý ÕÙ × Ö Ò ÒÓ× Ò ÐÙ Ö× ×ÓÒ
ÐÓ× Ô×          ÓÒ ¸ Ð × Ñ Ð × Ö ÓÐ ×             Ó× × ×Ø Ñ × Ö ÚÓ Ý Ù×ÕÙ
x



 Ò Ñ ÑÓÖ × ÙÒ Ö ´ + Ý Ö Ú Ó×µ Ý ÐÓ× Ö ÓÐ × ÕÙ ØÖ ׺
     Ò ×Ø Ø ÜØÓ × Ô Ð Ð Ð Ò Ù      ÑÓ Ð Ó ÍÅÄ Ô Ö        Ð Ø Ö Ð ÓÑÔÖ × ÓÒ
Ö Ð ÓÒ × ÒØÖ Ó ØÓ× º Ö Ó × Ò Ö Ñ ÒØ ÕÙ ÍÅÄ Ø Ò ÑÙ Ó Ú ÐÓÖ Ô Ö ÓÑÔÖ Ò Ö
× ×Ø Ñ × ÓÑÔÐ Ó׸ Ý × ÖÖÓÐÐ Ó׸ Ý ÙÒ ÔÓ Ó Ñ ÒÓ× Ú ÐÓÖ¸ ÙÒÕÙ ÔÖ Ð ¸ Ô Ö
  × Ò ÖÐÓ׺ È ÖÓ Ò ÐÓ ÕÙ Ø Ò ×Ø Ø ÜØÓ Ý ×Ù× ÙÖ×Ó× Ö Ú Ó׸ ÒÓ × ØÖ × Ò ÒØ
ÙØ Ð º

Deudas
ËÙ Ý ÒØ Ð               ÙØÓÖ × × ÓÒ ÙÒ Ð × Ñ × Ö Ò × Ð × Ý ØÖ ÑÔ × ×Ø
Ø ÑÔÓ Ð Ö Ó ÙØÓÖ Ý¸ Ñ × ÐÐ Ý ÖÖ ÒØ ÙÒ¸ Ð ÔÖÓÔ                             Ò Ù×ØÖ Ð º ÈÓÖ
Ñ × Ö Ø Ö ÔÖ Ñ Ò ÕÙ ÔÙ Ø Ò Ö Ù ÐÕÙ Ö Ó Ö ¸ ר × Ö ÙÒ× Ö Ö × ¸
Ý Ô Ö ¸ ÙÒ ÙÐØÙÖ º Ä ÔÖ Ñ Ö Ù ¸ Ô٠׸ ÕÙ Ù ÐÕÙ Ö Ò Ú ÙÓ ÕÙ Ö ÓÒ ÙÒ
ÓÖ ×          ×Ù ÙÐØÙÖ ¸ Ð Ù Ð Ð ÒØÖ        Ð ØÖ × ÓÒ Ó Ö ÙÒר Ò Ð¸ Ò ÓÒÓ Ñ ÒØÓ×
Ý × ÒØ Ñ ÒØÓ× Ý ÕÙ ÔÓ× Ð Ø Ò Ò×Ô Ö Ò Ð Ó Ö Ò Ù ×Ø ÓÒº Ò ×Ø Ñ ×ÑÓ ×Ô Ö ØÙ¸
ÙÒ Ú Þ ÒØÖ        Ð Ó Ö ¸ Ð × ÙÒ         Ù       ÕÙ Ö ×         Ð ÙÐØÙÖ ÕÙ Ö           Ý
Ö ÓÒÓ Ð Ó Ö º
    È Ö Ö × Ò Ó ÇÖØ Ý ×× Ø¸ ÙÒÓ × ÙÒÓ Ý ×Ù Ö ÙÒר Ò ¸ Ô ÖÓ¸ Ù ÐÕÙ Ö × ¸
 Ò ×Ø × ÑÔÖ × Ò Ù ÒØÖ Ð Ò­Ù Ò              ÖÙÑ ÓÖ Ð ÓØÖÓº Å × ÒØÓ¸ Ô٠׸ Ò Ö Ò
  Ù          ÕÙ Ò × × ÒØÓ Ð × Ó ÐÓ ÕÙ ×ÓÝ Ý¸ Ò ÐÓ Ô ÖØ ÙÐ Ö              ר Ø ÜØÓ¸
 ÕÙ ÐÐÓ× ÕÙ Ò ÖÓÒ ÑÙÝ Ö Ø Ñ ÒØ Ò ×Ù Ð ÓÖ ÓÒº
    Î ØÓÖ Ö ÚÓ¸ ÖÐÓ× Æ Ú ¸ ÂÙ Ò ÄÙ × Ú × Ý ÂÙ Ò ÖÐÓ× Î Ö × Ù ÖÓÒ Ñ × ÔÖ Ñ ÖÓ×
  × ÔÙÐÓ× Ò ×Ø Ý Ð Ö         × ×Ø Ñ × ×ØÖ Ù Ó׺ Î ØÓÖ ÒרÖÙÑ ÒØÓ Ð ÔÖ Ñ Ö Ú Ö× ÓÒ
   Ð Ð × LinearHashTable<Key> ÔÖ × ÒØ              Ò Ü º½º ´Ô Ò ¿¿µº ÖÐÓ× ÒרÖÙ¹
Ñ ÒØÓ Ð ÔÖ Ñ Ö Ú Ö× ÓÒ ÙÒ × ×Ø Ñ ÓÑÙÒ ÓÒ Ð                  ÒÚ Ö ÙÖ ×Ùר ÒØ Ó Ò Ð
Ù×Ó ALEPH Ð × ×Ø Ñ ÙÒ × ÓÔ Ö Ø ÚÓ ÓÝ Ò º ÂÙ Ò ÖÐÓ× ÒרÖÙÑ ÒØÓ ÐÓ×
 Ö ÓÐ × ÎÄ Ð Ó× Ý ÓÒ Ö Ò Ó׸ ÐÓ× Ù Ð ×¸ × Ò ÒÓ ×Ø Ò ÔÖ × ÒØ × Ò ×Ø Ø ÜØÓ¸ ×Ù
 ÒרÖÙÑ ÒØ ÓÒ ÝÙ Ó Ñ ÓÖ Ö Ý ÔÙÖ Ö Ð Ð × Avl Tree<Key>º
      Ò Ö × Ö Ù ÙÒ Ù×Ù Ö Ó ÒØ Ò× ÚÓ ALEPH ÙÖ ÒØ Ð Ö Ð Þ ÓÒ ×Ù Ø × ×
Ñ ×ØÖ ¸ ÐÓ ÕÙ Ñ Ô ÖÑ Ø Ó Ú Ö ×Ô ØÓ× ÕÙ ÐÙ Ó Ò ÖÓÒ Ò ÜØ Ò× ÓÒ × Ý Ñ ÓÖ ×
   Ð     Ð ÓØ º
    Ä ÓÒ Ö Ó ÙÒ ¸ Ð Ñ Ö ÓÒØÖ Ö × Ý ÖÐÓ× Óר Ö Ð Þ ÖÓÒ treepic¸ ÔÖ ÙÖ×ÓÖ
    btreepic ÙÒ ÔÖÓ Ö Ñ Ô Ö          Ù Ö ÐÓ× Ö ÓÐ × Ò Ö Ó×       ר Ð ÖÓº ÂÓ× Ö ØÓ
 × Ö Ó xtreepic¸ ÔÖ ÙÖ×ÓÖ ntreepic¸ Ù× Ó Ô Ö               Ù Ö Ö ÓÐ × Ý Ö ÓÖ × Ò ×
  Ò Ö Ð ×º
    ÂÓÖ Ê ÓÒ Ó Ý ÌÓÑ × ÄÓÔ Þ Ö Ð Þ ÖÓÒ Ð × ÔÖ Ñ Ö × ÔÖÙ ×              × ÑÔ ÒÓ ×Ó Ö ÐÓ×
  Ú Ö×Ó× Ö ÓÐ × Ò Ö Ó×       Ù×ÕÙ º
     ×Ù× Ë Ò Þ Ö Ð ÞÓ Ô ÖØ        Ð ÑÔÐ ÒØ ÓÒ Ô Ö Ð Ð             Ð ÓØ      ר Ò Ö C++
   Ó ALEPHº Ò ÔÖÙ ×                 × ÑÔ ÒÓ ØÖ ÓÒ Ð ×¸ Ð         Ð ÓØ       ר Ò Ö Ó
ALEPH ×        Ñ ÓÖ × ÑÔ ÒÓ ÕÙ Ð            ÆÍº
    ÂÙ Ò Ù ÒØ × ÒרÖÙÑ ÒØÓ Ô ÖØ Ý ÔÙÖÓ Ð Ð × Ò Ö                   Ö ÓÐ Tree Node<T>º
ÇÖÐ Ò Ó Î ÙÒ Ò ÓÒØÖÓ ÖÖÓÖ × ÑÔÓÖØ ÒØ × Ò ÐÓ× Ö ÓÐ × Ý ÔÐ ÒØ Ó Ð ÙÒ × ×Ù Ö Ò ×
ÑÙÝ ÔÖ Ð × ×Ó Ö Ð ×Ø ÐÓ ÑÔÐ ÒØ ÓÒº
     Ò Ð ÓÒ ÓÒ            ר Ø ÜØÓ × Ò ÑÔÐ Ó ÒØ Ö Ñ ÒØ ÔÖÓ Ö Ñ × Ð Ö ×
Ä Ì ½ ¸ Ì ¾½ ¸ noweb¸ Á Ì              ¸ gnu make ¸ imake ½¿ ¸ gnuplot ½½ ¸ R ½ ¸
Maxima ½ ¸ Xfig ¾¿ ¸ dia ¸ Umbrello ¾¾ ¸ doxygen ¸ bcpp ¿ ¸ graphviz ½¼¸ ¸ ¸
0.0. Bibliograf´
               ıa                                                                xi



  ÒØÖ ÓØÖÓ׺ ר Ø ÜØÓ Ý ÐÓ× ÔÖÓ Ö Ñ × Ù ÖÓÒ Ø Ó× ÓÒ gnu Emacs ¾ º ÄÓ× ÔÖÓ Ö Ñ ×
 Ù ÖÓÒ Ñ Ò Ó× ÓÒ ØÓ Ó× ÐÓ× ÙØ Ð Ø Ö Ó× GNU ½ º
     ÂÙ Ò Ú Ó¸ ÈÖÓ ×ÓÖ Ð               ÙÐØ     ÀÙÑ Ò        × Ð ÍÒ Ú Ö×         ÄÓ×
   Ò ×¸ Ñ ×ÙÔ ÖÚ ×Ó ÐÓ× ÓÑ ÒØ Ö Ó× Ø ÑÓÐÓ Ó× Ò Ð Ø Ò Ý Ö Óº
      Ð ÙÒ × Ú ×¸ Ð Ó × ÖÚ Ö Ð ÙÒÓ× ×ØÓ× Ý Ø ØÙ × Ò × ÔÙÐÓ׸ Ñ Ô Ö ÒÓØ ÖÐ ×
  Ð ÙÒ × Ñ × Ò× Ò ÒÞ × ÐÓ ÕÙ ÚÓ Ð Ð Ò ÔÓ× Ð                    Ñ ÑÔÖÓÒØ º È ÖÓ ×
Ø ÒÓÖ Ó Ð Ö Ö ÕÙ ×ÓÝ ÝÓ¸ Ñ × Ò¸ ÕÙ Ò ÔÓÖØ ×Ù× Ð ÓÒ × Ý¸ ÔÓÖ Ø ÒØÓ¸ ÕÙ Ò Ð ×
  ÜÔÖ × Ö Ø ØÙ º
     Å × Ñ × ÑÓ× Ô Ö ×¸ Æ ÐÐÝ Ý Ð ×¸ Ò ÓÒØÖ Ù Ó ÐÓ ÕÙ Ñ ØÖ Ù Ö ÓÑÓ
ÙÒ × Ò× Ð       Ô ÖØ ÙÐ Ö         Ð Ø ÒÓÐÓ º Å Ñ Ö Ð ÝÓ Ý ÓÖÖ Ó ÒØ Ö Ñ ÒØ ר
ØÖ × Ö ØÓ × ÓÑÓ ÐÐÓ׸ ÓØÖÓÖ Ñ ÓÐ × Ò ¸ Ñ Ò× Ò ÖÓÒ × Ö Ö ÙÒ ÔÓ Óº
     À Ó × ÖÚ Ó ÕÙ × ØÓ Ó ÙØÓÖ Ð ÖÓ Ø ÜØÓ Ø Ò Ó ÜÔÖ × Ö Ñ ÒØÓ× ×Ù
   Ñ Ð ´ ×ÔÓ×Ó´ µ     Ó´ µ´×µµº Ò Ð ØÖ Ò× ÙÖ×Ó ×Ø            ÓÒ Ñ Ô Ö Ø      ÕÙ ÐÐÓ
ÔÖÓ Ð Ñ ÒØ Ó Þ ÕÙ ÐÐÓ׸ Ò Ñ ×Ó ÓÒ × Ö                          ÖÖ ×ÔÓÒ× Ð Ò Ð Ò ¸
ÙÒÓ Ð × ÓÐÚ º ÈÓÖ Ö ÞÓÒ × ÑÙÝ ÒØ Ñ ×¸ Ô Ö Ò Ø Ò ×¸ ÒÓ ÔÙ Ó Ñ Ö Ò ÜÔÖ × Ö
  ÓÑÓ Ý Ù ÒØÓ ×ÓÝ Ö × Ñ ×ÔÓ× ¸ Å              и Ô ÖÓ × ÔÙ Ó Ð Ñ Ö ÕÙ ÒÓ × Ö Ò
× Ò ÐÐ º Ë ÔÙ × ÓÒ Ý           ÐÐ ¸ ÔÓÖ ×Ù ÑÓÖ Ý ×Ù Ô Ö ÓÒ¸ Ñ Ñ ÝÓÖ Ý ÔÖ Ò Ô Ð Ù
ººº Ý Ö Ø ØÙ º

Bibliograf´
          ıa
 ½ ØØÔ »»ÛÛÛº ÒÙºÓÖ º
 ¾ ØØÔ »»ÛÛÛº ÒÙºÓÖ »×Ó ØÛ Ö » Ñ ×»º
 ¿ ØØÔ »» ÒÚ × Ð ¹ ×Ð Ò ºÒ Ø» ÔÔº
    ØØÔ »»ÛÛÛº Ø ÒºÓÖ º
    ØØÔ »»ÛÛÛº Ñ ºÓÖ º
    ØØÔ »»ÛÛÛº ÒÓÑ ºÓÖ »ÔÖÓ Ø×» º
    ØØÔ »»ÛÛÛº ÓÜÝ ÒºÓÖ º
    ÐÐ×ÓÒ¸ Ò×Ò Ö¸ ÃÓÙØ×Ó¬Ó׸ ÆÓÖØ ¸ Ò ÏÓÓ ÙÐк Ö Ô Ú Þ ß ÓÔ Ò ×ÓÙÖ Ö Ô
    Ö Û Ò ØÓÓÐ׺ ÁÒ Ê ÏÁÆ           ÓÒ Ö Ò ÓÒ Ö Ô Ö Û Ò ´ µ¸ ¾¼¼½º
   ÂÓ Ò ÐÐ×ÓÒ¸ Ñ Ò Êº Ò×Ò Ö¸ Ð Ø Ö Ó× ÃÓÙØ×Ó¬Ó׸ ËØ Ô Ò º ÆÓÖØ ¸ Ò ÓÖ¹
    ÓÒ ÏÓÓ ÙÐк Ö Ô Ú Þ Ò ÝÒ Ö Ô ß ×Ø Ø Ò ÝÒ Ñ Ö Ô Ö Û Ò ØÓÓÐ׸
   ¾¼¼¿º
½¼ Ñ Ò Ò×Ò Ö¸ Ð Ø Ö Ó× ÃÓÙØ×Ó¬Ó׸ Ò ËØ Ô Ò ÆÓÖØ º Ö Û Ò Ö Ô × Û Ø
   dotº Ì Ò Ð Ö ÔÓÖØ¸ Ì²Ì         ÐÐ Ä ÓÖ ØÓÖ ×¸ ÅÙÖÖ Ý À Ðи ÆÂ¸ ÍË ¸ ÖÙ ÖÝ
   ¾¼¼¾º
½½ ØØÔ »»ÛÛÛº ÒÙÔÐÓØº Ò Óº
½¾ Ú Êº À Ò×ÓÒ Ò Ö ×ØÓÔ Ö Ïº Ö × Öº Ê Ø Ö Ø Ð                   ÓÑÔ Ð Ö × Ò
    Ò ÁÑÔÐ Ñ ÒØ Ø ÓÒº        ×ÓÒ Ï ×Рݸ ½ º
xii



½¿ ØØÔ »»ÜÓÖ º Ö × ØÓÔºÓÖ º
½ Ò Ö Û Äº ÂÓ Ò×ÓÒ Ò Ö º ÂÓ Ò×ÓÒº Ä Ø Ö Ø ÔÖÓ Ö ÑÑ Ò Ù× Ò ÒÓÛ º Ä ÒÙÜ
   ÂÓÙÖÒ Ð¸ Ô × ß ¸ Ó ØÓ Ö ½ º
½ ÓÒ Ð º ÃÒÙØ º Ä Ø Ö Ø ÔÖÓ Ö ÑÑ Ò º Ì      ÓÑÔÙØ Ö ÂÓÙÖÒ Ð¸ ¾ ´¾µ ß½½½¸
   ½ º
½ ØØÔ »»ÛÛÛº Ø ÒºÓÖ º
½ ØØÔ »»Ñ Ü Ñ º×ÓÙÖ ÓÖ ºÒ غ
½ ÛÛÛº ØØÔ »»Ö¹ÔÖÓ ØºÓÖ º
½ ÆÓÖÑ Ò Ê Ñ× Ýº Ä Ø Ö Ø ÔÖÓ Ö ÑÑ Ò × ÑÔÐ ¬ º Á    ËÓ ØÛ Ö ¸ ½½´ µ ß½¼ ¸
   Ë ÔØ Ñ Ö ½ º
¾¼ ÃÓÞÓ ËÙ Ý Ñ º Ö Ô Ö Û Ò Ò ÔÔÐ Ø ÓÒ× ÓÖ ËÓ ØÛ Ö Ò Ò Ö Ò Ò
   ÃÒÓÛÐ        Ò Ò Ö׸ ÚÓÐÙÑ ½½ Ó ËÓ ØÛ Ö Ò Ò Ö Ò Ò ÃÒÓÛÐ          Ò ¹
   Ò Ö Ò º ÏÓÖÐ Ë ÒØ ¬ ¸ ¾¼¼¾º
¾½ ØØÔ »»ØÙ ºÓÖ »Ø Ø Ü»º
¾¾ ØØÔ »»ÛÛÛº ºÓÖ º
¾¿ ØØÔ »»ÛÛۺܬ ºÓÖ º
Contenido

        ÐÓ Ö     ººººººººººººººººººººººººººººººººººººººº Ü
1 Abstracci´n de datos
           o                                                                                                                            1
  ½º½   ×Ô ¬ ÓÒ ×            ØÓ× º º º º º º º º º º º º º º º º º º º º                            º ºº        º   º   º   º   º   º    ¿
      ½º½º½ Ì ÔÓ ×ØÖ ØÓ             ØÓ º º º º º º º º º º º º º º º º º                            º ºº        º   º   º   º   º   º
      ½º½º¾ ÆÓ ÓÒ Ð × Ó ØÓ º º º º º º º º º º º º º º º                                            º ºº        º   º   º   º   º   º
      ½º½º¿ ÄÓ ×Ù Ø ÚÓ ÙÒ Ó ØÓ º º º º º º º º º º º º º º º                                        º ºº        º   º   º   º   º   º
      ½º½º ÍÒ ÑÔÐÓ Ì º º º º º º º º º º º º º º º º º º                                            º ºº        º   º   º   º   º   º
      ½º½º      Ð Ð Ò Ù ÍÅÄ º º º º º º º º º º º º º º º º º º º º                                 º ºº        º   º   º   º   º   º   ½¼
  ½º¾ À Ö Ò º º º º º º º º º º º º º º º º º º º º º º º º º º º º º                               º ºº        º   º   º   º   º   º   ½½
      ½º¾º½ Ì ÔÓ×         ÖÒ       ººººººººººººººººººº                                              º ºº        º   º   º   º   º   º   ½¾
      ½º¾º¾ ÅÙÐØ Ö Ò º º º º º º º º º º º º º º º º º º º º º º                                    º ºº        º   º   º   º   º   º   ½¿
      ½º¾º¿ ÈÓÐ ÑÓÖ¬×ÑÓ º º º º º º º º º º º º º º º º º º º º º º                                 º ºº        º   º   º   º   º   º   ½¿
              ½º¾º¿º½ ÈÓÐ ÑÓÖ¬×ÑÓ ×Ó Ö Ö º º º º º º º º º                                          º ºº        º   º   º   º   º   º   ½
              ½º¾º¿º¾ ÈÓÐ ÑÓÖ¬×ÑÓ            ÖÒ ºººººººººº                                          º ºº        º   º   º   º   º   º   ½
              ½º¾º¿º¿ ÈÓÐ ÑÓÖ¬×ÑÓ ÔÐ ÒØ ÐÐ ´Ø ÔÓ× Ô Ö Ñ ØÖ Þ                                         Ó×µ        º   º   º   º   º   º   ½
              ½º¾º¿º ÄÓ Ò Ö Ð Ý ÐÓ Ò Ö Ó º º º º º º º º º º º                                      ººº         º   º   º   º   º   º   ½
  ½º¿ Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð ×ØÖÙ ØÙÖ ×                     ØÓ× º º º º º º                            ººº         º   º   º   º   º   º   ½
      ½º¿º½ ÓÑÔ Ö ÓÒ Ò Ö Ð ÒØÖ Ð Ú × º º º º º º º º º º º                                          ººº         º   º   º   º   º   º   ½
      ½º¿º¾ ÇÔ Ö ÓÒ × Ô Ö ÓÒ ÙÒØÓ× ÓÖ Ò Ð × º º º º º º º º                                         ººº         º   º   º   º   º   º   ¾¼
      ½º¿º¿ Ö ÙÒר Ò × Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð º º º º º º                                              ººº         º   º   º   º   º   º   ¾¼
      ½º¿º ÈÖ × ÒØ ÓÒ × Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð º º º º º º                                             ººº         º   º   º   º   º   º   ¾½
  ½º     × ÒÓ        ØÓ× Ý ×ØÖ ÓÒ × º º º º º º º º º º º º º º º º                                 ººº         º   º   º   º   º   º   ¾½
      ½º º½ Ì ÔÓ×         ×ØÖ ÓÒ º º º º º º º º º º º º º º º º º º                                ººº         º   º   º   º   º   º   ¾½
      ½º º¾ Ð ÔÖ Ò Ô Ó ¬Ò¹ ¹¬Ò º º º º º º º º º º º º º º º º º º                                  ººº         º   º   º   º   º   º   ¾¾
      ½º º¿ ÁÒ Ù ÓÒ Ý Ù ÓÒ º º º º º º º º º º º º º º º º º                                        ººº         º   º   º   º   º   º   ¾¿
      ½º º Ç ÙÐØ Ñ ÒØÓ Ò ÓÖÑ ÓÒ º º º º º º º º º º º º º                                           ººº         º   º   º   º   º   º   ¾
  ½º ÆÓØ × Ý Ö ÓÑ Ò ÓÒ × Ð Ó Ö ¬ × º º º º º º º º º º º º                                          ººº         º   º   º   º   º   º   ¾
  ½º      Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º º º º º                              ººº         º   º   º   º   º   º   ¾
     ÐÓ Ö      ºººººººººººººººººººººººººººººº                                                       ººº         º   º   º   º   º   º   ¾
2 Secuencias                                                                                                                            29
  ¾º½      ÖÖ ÐÓ× º º º º º º º º º º º º º º º º º º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   ¿¼
         ¾º½º½ ÇÔ Ö ÓÒ × × × ÓÒ ÖÖ ÐÓ×                  º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   ¿½
                ¾º½º½º½ Ö ØÑ Ø            ÔÙÒØ ÖÓ×      º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   ¿½
                ¾º½º½º¾ Ù×ÕÙ ÔÓÖ Ð Ú º º                º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   ¿¾
                ¾º½º½º¿ ÁÒ× Ö ÓÒ ÔÓÖ Ð Ú º º º          º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   ¿¿

                                              Ü
xiv                                                                              CONTENIDO



               ¾º½º½º      Ð Ñ Ò ÓÒ ÔÓÖ Ð Ú º º º º º º º º º º º º º º          ºº   º   º   º   º   º   ¿¿
      ¾º½º¾ Å Ò Ó Ñ ÑÓÖ Ô Ö ÖÖ ÐÓ× º º º º º º º º º º º º º                     ºº   º   º   º   º   º   ¿
               ¾º½º¾º½ ÖÖ ÐÓ× Ò Ñ ÑÓÖ ×Ø Ø º º º º º º º º º º                   ºº   º   º   º   º   º   ¿
               ¾º½º¾º¾ ÖÖ ÐÓ× Ò Ô Ð º º º º º º º º º º º º º º º º º            ºº   º   º   º   º   º   ¿
               ¾º½º¾º¿ ÖÖ ÐÓ× Ò Ñ ÑÓÖ Ò Ñ º º º º º º º º º                      ºº   º   º   º   º   º   ¿
      ¾º½º¿ ÖÖ ÐÓ×            Ø× º º º º º º º º º º º º º º º º º º º º º º     ºº   º   º   º   º   º   ¿
      ¾º½º       ÖÖ ÐÓ× Ò Ñ Ó× º º º º º º º º º º º º º º º º º º º º º         ºº   º   º   º   º   º     ½
      ¾º½º       Ð Ì DynArray<T> º º º º º º º º º º º º º º º º º º º           ºº   º   º   º   º   º     ½
               ¾º½º º½ רÖÙ ØÙÖ             ØÓ× DynArray<T> º º º º º            ºº   º   º   º   º   º     ¾
               ¾º½º º¾ Å Ò Ó Ñ ÑÓÖ º º º º º º º º º º º º º º º                 ºº   º   º   º   º   º
               ¾º½º º¿ ×Ô ¬ ÓÒ ÑÔÐ ÒØ ÓÒ Ñ ØÓ Ó× ÔÙ Ð                            Ó×   º   º   º   º   º
               ¾º½º º         ×Ó Ñ ÒØ ÓÔ Ö ÓÖ [] º º º º º º º º º º             ºº   º   º   º   º   º
               ¾º½º º Í×Ó Ð Ú ÐÓÖ ÔÓÖ ÓÑ × ÓÒ º º º º º º º º º º º º            ºº   º   º   º   º   º
  ¾º¾ ÖÖ ÐÓ× ÑÙÐØ Ñ Ò× ÓÒ Ð × º º º º º º º º º º º º º º º º º º º º            ºº   º   º   º   º   º    ½
  ¾º¿ ÁØ Ö ÓÖ × º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º      ºº   º   º   º   º   º    ¾
  ¾º Ä ×Ø × ÒÐ Þ × º º º º º º º º º º º º º º º º º º º º º º º º º º           ºº   º   º   º   º   º
      ¾º º½ Ä ×Ø × ÒÐ Þ × Ý Ð ÔÖ Ò Ô Ó ¬Ò ¬Ò º º º º º º º º º º                 ºº   º   º   º   º   º
      ¾º º¾ Ð Ì Slink ´ ÒÐ × ÑÔÐ µ º º º º º º º º º º º º º º                   ºº   º   º   º   º   º
      ¾º º¿ Ð Ì Snode<T> ´ÒÓ Ó × ÑÔÐ µ º º º º º º º º º º º º                   ºº   º   º   º   º   º     ½
      ¾º º       Ð Ì Slist<T> ´Ð ר × ÑÔÐ Ñ ÒØ ÒÐ Þ µ º º º º                    ºº   º   º   º   º   º     ¾
      ¾º º ÁØ Ö ÓÖ Slist<T> º º º º º º º º º º º º º º º º º º º                ºº   º   º   º   º   º     ¿
      ¾º º       Ð Ì DynSlist<T> º º º º º º º º º º º º º º º º º º º           ºº   º   º   º   º   º
      ¾º º       Ð Ì Dlink ´ ÒÐ           Óе ººººººººººººººº                    ºº   º   º   º   º   º
      ¾º º       Ð Ì Dnode<T> ´ÒÓ Ó Ó Ð µ º º º º º º º º º º º º º              ºº   º   º   º   º   º
      ¾º º       Ð Ì Dlist<T> ´Ð ר Ö ÙÐ Ö Ó Ð Ñ ÒØ ÒÐ Þ µ                       ºº   º   º   º   º   º
               ¾º º º½ Ð ÔÖÓ Ð Ñ ÐÓ× ×ØÖÙ ØÓÖ × Ú ÖØÙ Ð × º º º                  ºº   º   º   º   º   º
               ¾º º º¾ ÁØ Ö ÓÖ Dlist<T> º º º º º º º º º º º º º º              ºº   º   º   º   º   º     ¾
      ¾º º½¼ Ð Ì DynDlist<T> º º º º º º º º º º º º º º º º º º º               ºº   º   º   º   º   º     ¿
               ¾º º½¼º½ ÁØ Ö ÓÖ DynDlist<T> º º º º º º º º º º º º              ºº   º   º   º   º   º
      ¾º º½½ ÔÐ ÓÒ Ö ØÑ Ø                   ÔÓÐ ÒÓÑ Ó× º º º º º º º º º º º     ºº   º   º   º   º   º   ½¼¼
               ¾º º½½º½ ÁÑÔÐ Ñ ÒØ ÓÒ ÔÓÐ ÒÓÑ Ó× º º º º º º º º º                ºº   º   º   º   º   º   ½¼½
  ¾º È Ð × º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º     ºº   º   º   º   º   º   ½¼
      ¾º º½ Ê ÔÖ × ÒØ ÓÒ × ÙÒ Ô Ð Ò Ñ ÑÓÖ º º º º º º º º                        ºº   º   º   º   º   º   ½¼
      ¾º º¾ Ð Ì ArrayStack<T> ´Ô Ð Ú ØÓÖ Þ µ º º º º º º º                       ºº   º   º   º   º   º   ½¼
      ¾º º¿ Ð Ì ListStack<T> ´Ô Ð ÓÒ Ð ×Ø × ÒÐ Þ ×µ º º º                        ºº   º   º   º   º   º   ½½¾
      ¾º º       Ð Ì DynListStack<T> º º º º º º º º º º º º º º º º             ºº   º   º   º   º   º   ½½
      ¾º º       ÔÐ ÓÒ ÙÒ Ú ÐÙ ÓÖ ÜÔÖ × ÓÒ × Ö ØÑ Ø × Ò¬                         ×    º   º   º   º   º   ½½
      ¾º º È Ð ×¸ ÐÐ Ñ × ÔÖÓ Ñ ÒØÓ× Ý Ö ÙÖ× ÓÒ º º º º º º                       ºº   º   º   º   º   º   ½¾¾
               ¾º º º½ ÓÒ× Ó× Ô Ö Ð Ö ÙÖ× ÓÒ º º º º º º º º º º º               ºº   º   º   º   º   º   ½¾
               ¾º º º¾ Ð Ñ Ò ÓÒ Ð Ö ÙÖ× ÓÒ º º º º º º º º º º º                 ºº   º   º   º   º   º   ½¾
  ¾º    ÓÐ × º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º   ºº   º   º   º   º   º   ½¿½
      ¾º º½ Î Ö ÒØ × Ð × ÓÐ × º º º º º º º º º º º º º º º º º º º              ºº   º   º   º   º   º   ½¿¾
      ¾º º¾ ÔÐ ÓÒ × Ð × ÓÐ × º º º º º º º º º º º º º º º º º º                 ºº   º   º   º   º   º   ½¿¾
      ¾º º¿ Ê ÔÖ × ÒØ ÓÒ × Ò Ñ ÑÓÖ                  Ð × ÓÐ × º º º º º º º º     ºº   º   º   º   º   º   ½¿¿
      ¾º º       Ð Ì ArrayQueue<T> ´ ÓÐ Ú ØÓÖ Þ µ º º º º º º º                  ºº   º   º   º   º   º   ½¿
      ¾º º       Ð Ì ListQueue<T> ´ ÓÐ ÓÒ Ð ×Ø × ÒÐ Þ ×µ º º º                   ºº   º   º   º   º   º   ½¿
CONTENIDO                                                                                                 xv



         ¾º º     Ð Ì DynListQueue<T> ´ ÓÐ Ò Ñ                        ÓÒ Ð ×Ø   × ÒÐ Þ       ×µ   º   º   ½¼
  ¾º       רÖÙ ØÙÖ ×    ØÓ× ÓÑ Ò × ¹ ÅÙÐØ Ð ×Ø × º           º   º   ºººº      ººººº    º   ºº   º   º   ½½
  ¾º     ÆÓØ × Ð Ó Ö ¬ × º º º º º º º º º º º º º º º º      º   º   ºººº      ººººº    º   ºº   º   º   ½¿
  ¾º         Ö Ó× º º º º º º º º º º º º º º º º º º º º º   º   º   ºººº      ººººº    º   ºº   º   º   ½
        ÐÓ Ö     ººººººººººººººººººººººº                      º   º   ºººº      ººººº    º   ºº   º   º   ½
3 Cr´
    ıtica de algoritmos                                                                                   157
  ¿º½   Ò Ð × × Ð ÓÖ ØÑÓ× º º º º º º º º º º º º º º º º º º º º º º º º º º º º                 º   º   ½
      ¿º½º½ ÍÒ          Ó Ô ×Ó       Ù ÓÒ º º º º º º º º º º º º º º º º º º º º º               º   º   ½½
      ¿º½º¾       Ð Ö ØÓÖ ×Ó Ö ÐÓ× Ñ ØÓ Ó× ÓÖ Ò Ñ ÒØÓ º º º º º º º º º º                         º   º   ½¾
      ¿º½º¿ ÇÖ Ò Ñ ÒØÓ ÔÓÖ × Ð ÓÒ º º º º º º º º º º º º º º º º º º º º º                       º   º   ½¾
      ¿º½º       Ù×ÕÙ × Ù Ò Ð º º º º º º º º º º º º º º º º º º º º º º º º º                   º   º   ½
      ¿º½º ÁÑÔÐ ÒØ ÓÒ Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð Ñ ÒØ DynArray<T>                                        º   º   ½
      ¿º½º       Ù×ÕÙ          ÜØÖ ÑÓ× º º º º º º º º º º º º º º º º º º º º º º º º            º   º   ½
      ¿º½º ÆÓØ ÓÒ O º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º                   º   º   ½
               ¿º½º º½ Ð Ö O º º º º º º º º º º º º º º º º º º º º º º º º                      º   º   ½¾
               ¿º½º º¾ Ò Ð × × Ð ÓÖ ØÑÓ× Ñ ÒØ O º º º º º º º º º º º º                           º   º   ½¾
      ¿º½º ÇÖ Ò Ñ ÒØÓ ÔÓÖ Ò× Ö ÓÒ º º º º º º º º º º º º º º º º º º º º º                       º   º   ½
      ¿º½º       Ù×ÕÙ       ÒÖ ººººººººººººººººººººººººººº                                        º   º   ½
      ¿º½º½¼ ÖÖÓÖ × Ð ÒÓØ ÓÒ O º º º º º º º º º º º º º º º º º º º º º º º                      º   º   ½
      ¿º½º½½ Ì ÔÓ× Ò Ð × × º º º º º º º º º º º º º º º º º º º º º º º º º º º                  º   º   ½¼
  ¿º¾ Ð ÓÖ ØÑÓ× Ú Ö» ÓÑ Ò Ö º º º º º º º º º º º º º º º º º º º º º º º º                       º   º   ½¼
      ¿º¾º½ ÇÖ Ò Ñ ÒØÓ ÔÓÖ Ñ Þ Ð º º º º º º º º º º º º º º º º º º º º º º                      º   º   ½¾
               ¿º¾º½º½ Å Þ Ð ´Ñ Ö µ º º º º º º º º º º º º º º º º º º º º º º º                 º   º   ½¾
               ¿º¾º½º¾ Ò Ð × × Ð Ñ Ö ×ÓÖØ º º º º º º º º º º º º º º º º º º º                   º   º   ½
               ¿º¾º½º¿ ר Ð            Ð Ñ Ö ×ÓÖØ º º º º º º º º º º º º º º º º º               º   º   ½
               ¿º¾º½º      Óר Ò ×Ô Ó º º º º º º º º º º º º º º º º º º º º º º                 º   º   ½
               ¿º¾º½º ÇÖ Ò Ñ ÒØÓ ÔÓÖ Ñ Þ Ð Ð ×Ø × ÒÐ Þ × º º º º º º                              º   º   ½
      ¿º¾º¾ ÇÖ Ò Ñ ÒØÓ Ö Ô Ó ´ÉÙ ×ÓÖØµ º º º º º º º º º º º º º º º º º º                        º   º   ½
               ¿º¾º¾º½ È ÖØ ÓÒ º º º º º º º º º º º º º º º º º º º º º º º º º º                º   º   ½
               ¿º¾º¾º¾ Ò Ð × × Ð ÕÙ ×ÓÖØ º º º º º º º º º º º º º º º º º º º                    º   º   ½
               ¿º¾º¾º¿ Ò Ð × × ÓÒ×ÙÑÓ ×Ô Ó Ð ÕÙ ×ÓÖØ º º º º º º                                  º   º   ½
               ¿º¾º¾º Ë Ð ÓÒ Ð Ô ÚÓØ º º º º º º º º º º º º º º º º º º º º                      º   º   ½¾
               ¿º¾º¾º ÉÙ ×ÓÖØ × Ò Ö ÙÖ× ÓÒ º º º º º º º º º º º º º º º º º º                    º   º   ½¿
               ¿º¾º¾º ÉÙ ×ÓÖØ ×Ó Ö Ð ×Ø × ÒÐ Þ × º º º º º º º º º º º º º                        º   º   ½
               ¿º¾º¾º Å ÓÖ × Ð ÕÙ ×ÓÖØ º º º º º º º º º º º º º º º º º º º º                    º   º   ½
               ¿º¾º¾º      ÐÚ×ÖÔ Ø × º º º º º º º º º º º º º º º º º º º º º º                  º   º   ½
               ¿º¾º¾º ÉÙ ×ÓÖØ ÓÒ ÙÖÖ ÒØ Ó Ô Ö Ð ÐÓ º º º º º º º º º º º º º                      º   º   ½
               ¿º¾º¾º½¼ Ù×ÕÙ        Ð ØÓÖ         ÐÚ ºººººººººººººººº                             º   º   ½
               ¿º¾º¾º½½ Ë Ð ÓÒ Ð ØÓÖ ×Ó Ö × Ù Ò                  ×ÓÖ Ò × º º º º                  º   º   ½
  ¿º¿ Ò Ð × × ÑÓÖØ Þ Ó º º º º º º º º º º º º º º º º º º º º º º º º º º º º º                  º   º   ¾¼¼
      ¿º¿º½ Ò Ð × × ÔÓØ Ò Ð º º º º º º º º º º º º º º º º º º º º º º º º º º º                 º   º   ¾¼½
      ¿º¿º¾ Ò Ð × × ÓÒØ Ð º º º º º º º º º º º º º º º º º º º º º º º º º º º                   º   º   ¾¼
      ¿º¿º¿ Ë Ð ÓÒ Ð ÔÓØ Ò Ð Ó Ö ØÓ× º º º º º º º º º º º º º º º º º º                          º   º   ¾¼
  ¿º    ÓÖÖ Ø ØÙ         Ð ÓÖ ØÑÓ× º º º º º º º º º º º º º º º º º º º º º º º º º º            º   º   ¾¼
      ¿º º½ ÈÐ ÒØ Ñ ÒØÓ ÙÒ ÑÓ×ØÖ ÓÒ ÓÖÖ Ø ØÙ º º º º º º º º                                      º   º   ¾¼
xvi                                                                                                 CONTENIDO



      ¿º º¾ Ì ÔÓ× ÖÖÓÖ × º º º º º º º º º º º          º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   ¾¼
      ¿º º¿ ÈÖ Ú Ò ÓÒ Ý Ø ÓÒ ÖÖÓÖ × º º                 º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   ¾¼
            ¿º º¿º½     × ÔÐ Ò ÔÖÓ Ö Ñ ÓÒ               º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   ¾¼
            ¿º º¿º¾ Ò Ð × × ×Ø Ø Ó º º º º º º          º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   ¾½¿
            ¿º º¿º¿ Ò Ð × × Ò Ñ Ó º º º º º             º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   ¾½
  ¿º ¬       Ý ¬ Ò ºººººººººººººº                       º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   ¾¾¿
      ¿º º½ Ä Ö Ð Ð ¼¹¾¼ º º º º º º º º º º            º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   ¾¾
      ¿º º¾    Ù Ò Ó Ø ÖÐ ¬ Ò                ºººº       º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   ¾¾
      ¿º º¿ Å Ò Ö × Ñ ÓÖ Ö Ð ¬ Ò º º                    º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   ¾¾
      ¿º º È Ö¬Ð ´ÔÖÓ¬Ð Ò µ º º º º º º º º º º         º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   ¾¾
      ¿º º ÄÓ Ð           Ö ÖÒ         ººººººº          º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   ¾¿¼
      ¿º º Ì ÑÔÓ          × ÖÖÓÐÐÓ º º º º º º º º º    º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   ¾¿¼
  ¿º ÆÓØ × Ð Ó Ö ¬ × º º º º º º º º º º º º º º        º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   ¾¿½
  ¿º      Ö Ó× º º º º º º º º º º º º º º º º º º º    º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   ¾¿¾
     ÐÓ Ö    ººººººººººººººººººººº                      º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   º   ¾¿
  ´
4 Arboles                                                                                                                       241
      º½ ÓÒ ÔØÓ× × Ó× º º º º º º º º º º º º º º º º º º º º º º                       ººº         º   º   º   º   º   º   º   ¾
      º¾ Ê ÔÖ × ÒØ ÓÒ × ÙÒ Ö ÓÐ º º º º º º º º º º º º º º º º                         ººº         º   º   º   º   º   º   º   ¾
          º¾º½ ÓÒ ÙÒØÓ× Ò Ó× º º º º º º º º º º º º º º º º º                          ººº         º   º   º   º   º   º   º   ¾
          º¾º¾ Ë Ù Ò × Ô Ö ÒØ Þ × º º º º º º º º º º º º º º º                         ººº         º   º   º   º   º   º   º   ¾
          º¾º¿ ÁÒ ÒØ ÓÒ º º º º º º º º º º º º º º º º º º º º º º                     ººº         º   º   º   º   º   º   º   ¾
          º¾º ÆÓØ ÓÒ           Ûݺ º º º º º º º º º º º º º º º º º                    ººº         º   º   º   º   º   º   º   ¾
      º¿ Ê ÔÖ × ÒØ ÓÒ × Ö ÓÐ × Ò Ñ ÑÓÖ º º º º º º º º º º                              ººº         º   º   º   º   º   º   º   ¾   ¼
          º¿º½ Ä ×Ø × ÒÐ Þ × º º º º º º º º º º º º º º º º º º º                      ººº         º   º   º   º   º   º   º   ¾   ¼
          º¿º¾ ÖÖ ÐÓ× º º º º º º º º º º º º º º º º º º º º º º º º                   ººº         º   º   º   º   º   º   º   ¾   ½
      º    Ö ÓÐ × Ò Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º                  ººº         º   º   º   º   º   º   º   ¾   ¾
          º º½ Ê ÔÖ × ÒØ ÓÒ Ò Ñ ÑÓÖ             ÙÒ Ö ÓÐ Ò Ö Ó º º                       ººº         º   º   º   º   º   º   º   ¾   ¿
          º º¾ Ê ÓÖÖ Ó× ×Ó Ö Ö ÓÐ × Ò Ö Ó× º º º º º º º º º º                          ººº         º   º   º   º   º   º   º   ¾   ¿
          º º¿ ÍÒ Ì        Ò Ö Ó Ô Ö Ö ÓÐ × Ò Ö Ó× º º º º º º                          ººº         º   º   º   º   º   º   º   ¾
          ºº      ÓÒØ Ò ÓÖ ÙÒ ÓÒ × ×Ó Ö Ö ÓÐ × Ò Ö Ó× º º                               ººº         º   º   º   º   º   º   º   ¾   ¾
          º º Ê ÓÖÖ Ó× Ö ÙÖ× ÚÓ× º º º º º º º º º º º º º º º º º                      ººº         º   º   º   º   º   º   º   ¾   ¿
          º º Ê ÓÖÖ Ó× ÒÓ Ö ÙÖ× ÚÓ× º º º º º º º º º º º º º º º                       ººº         º   º   º   º   º   º   º   ¾
          ºº       Ð ÙÐÓ Ð Ö Ò Ð           ºººººººººººººº                               ººº         º   º   º   º   º   º   º   ¾
          ºº       Ð ÙÐÓ Ð ÐØÙÖ º º º º º º º º º º º º º º º º º                       ººº         º   º   º   º   º   º   º   ¾
          ºº      ÓÔ      Ö ÓÐ × Ò Ö Ó× º º º º º º º º º º º º º º                     ººº         º   º   º   º   º   º   º   ¾
          º º½¼ רÖÙ ÓÒ Ö ÓÐ × Ò Ö Ó× º º º º º º º º º º º                             ººº         º   º   º   º   º   º   º   ¾
          º º½½ ÓÑÔ Ö ÓÒ Ö ÓÐ × Ò Ö Ó× º º º º º º º º º º                              ººº         º   º   º   º   º   º   º   ¾
                 º º½½º½ Ë Ñ Ð Ö     ººººººººººººººººº                                  ººº         º   º   º   º   º   º   º   ¾
                 º º½½º¾ ÕÙ Ú Ð Ò º º º º º º º º º º º º º º º º                       ººº         º   º   º   º   º   º   º   ¾
          º º½¾ Ê ÓÖÖ Ó ÔÓÖ Ò Ú Ð × º º º º º º º º º º º º º º º º º                   ººº         º   º   º   º   º   º   º   ¾   ¼
          º º½¿ ÓÒרÖÙ ÓÒ Ö ÓÐ × Ò Ö Ó× Ô ÖØ Ö Ö ÓÖÖ                                    Ó× º        º   º   º   º   º   º   º   ¾   ½
          º º½ ÓÒ ÙÒØÓ ÒÓ Ó× Ò ÙÒ Ò Ú Ð º º º º º º º º º º º                           ººº         º   º   º   º   º   º   º   ¾   ¿
          º º½ À Ð Ó Ö ÓÐ × Ò Ö Ó× º º º º º º º º º º º º º º                          ººº         º   º   º   º   º   º   º   ¾
          º º½ Ê ÓÖÖ Ó× Ô× Ù Ó¹ Ð Ó× º º º º º º º º º º º º º º                        ººº         º   º   º   º   º   º   º   ¾
          º º½ ÓÖÖ ×ÔÓÒ Ò ÒØÖ Ö ÓÐ × Ò Ö Ó× Ý m¹Ö Ó× º                                  ººº         º   º   º   º   º   º   º   ¾
CONTENIDO                                                                                      xvii



  º  ÍÒ Ì         Ò Ö Ó Ô Ö Ö ÓÐ × º º º º º º º º º º º º º º º º º º º º º º º º         º   ¾¿
      º º½ Ç × ÖÚ ÓÖ × Tree Node<T> º º º º º º º º º º º º º º º º º º º                  º   ¾
      º º¾ ÅÓ ¬ ÓÖ × Tree Node<T> º º º º º º º º º º º º º º º º º º º                    º   ¾
      º º¿ Ç × ÖÚ ÓÖ × Ö ÓÐ × º º º º º º º º º º º º º º º º º º º º º º º º              º   ¾
      º º Ê ÓÖÖ Ó× ×Ó Ö Tree Node<T> º º º º º º º º º º º º º º º º º º º                 º   ¾
      ºº        רÖÙ ÓÒ Tree Node<T> º º º º º º º º º º º º º º º º º º º º               º   ¾
      ºº      Ù×ÕÙ ÔÓÖ ÒÙÑ ÖÓ                ÛÝ ººººººººººººººººººº                        º   ¾¼
      ºº        Ð ÙÐÓ Ð ÒÙÑ ÖÓ            Ûݺºººººººººººººººººººº                          º   ¾¼
      ºº      ÓÖÖ ×ÔÓÒ Ò ÒØÖ Tree Node<T> Ý Ö ÓÐ × Ò Ö Ó× º º º º º º                      º   ¾¾
  º    Ð ÙÒÓ× ÓÒ ÔØÓ× Ñ Ø Ñ Ø Ó× ÐÓ× Ö ÓÐ × º º º º º º º º º º º º º º º º                º   ¾
      º º½ ÐØÙÖ ÙÒ Ö ÓÐ º º º º º º º º º º º º º º º º º º º º º º º º º º º              º   ¾
      º º¾ ÄÓÒ ØÙ Ð Ñ ÒÓ ÒØ ÖÒÓ» ÜØ ÖÒÓ º º º º º º º º º º º º º º º º º                  º   ¾
      º º¿ Ö ÓÐ × ÓÑÔÐ ØÓ× º º º º º º º º º º º º º º º º º º º º º º º º º º º           º   ¾
  º À Ô× º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º       º   ¿¼½
      º º½ ÁÒ× Ö ÓÒ Ò ÙÒ Ô º º º º º º º º º º º º º º º º º º º º º º º º º º             º   ¿¼¿
      º º¾ Ð Ñ Ò ÓÒ Ò ÙÒ Ô º º º º º º º º º º º º º º º º º º º º º º º º                 º   ¿¼
      º º¿ ÓÐ × ÔÖ ÓÖ              ººººººººººººººººººººººººººº                             º   ¿¼
             º º¿º½ ÅÓ ¬ ÓÒ ÔÖ ÓÖ                    ºººººººººººººººººº                    º   ¿¼
      º º À Ô×ÓÖØ º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º          º   ¿¼
      ºº      ÔÐ ÓÒ × ÐÓ× Ô× º º º º º º º º º º º º º º º º º º º º º º º                 º   ¿½¼
      ºº      Ð Ì BinHeap<Key> º º º º º º º º º º º º º º º º º º º º º º º º             º   ¿½¾
             º º º½ ÁÒØ Ö Ñ Ó ÒØÖ ÒÓ Ó× º º º º º º º º º º º º º º º º º º º              º   ¿½
             º º º¾ ÁÒ× Ö ÓÒ Ò BinHeap<Key> º º º º º º º º º º º º º º º º                º   ¿½
             º º º¿ Ð Ñ Ò ÓÒ Ð Ñ Ò ÑÓ Ð Ñ ÒØÓ ÙÒ BinHeap<Key> º                            º   ¿½
             ººº          ØÙ Ð Þ ÓÒ Ò ÙÒ Ô º º º º º º º º º º º º º º º º º º             º   ¿½
             ººº        Ð Ñ Ò ÓÒ Ù ÐÕÙ Ö Ð Ñ ÒØÓ Ò ÙÒ BinHeap<Key>                         º   ¿½
             ººº          רÖÙ ÓÒ BinHeap<Key> º º º º º º º º º º º º º º º               º   ¿½
  º ÒÙÑ Ö ÓÒ Ý Ó Ó× Ö ÓÐ × º º º º º º º º º º º º º º º º º º º º º º                     º   ¿¾¼
             º º¼º      Ó Ó× ÙÒ Ö ÓÐ Ò Ö Ó º º º º º º º º º º º º º º º º                 º   ¿¾½
             º º¼º      Ó Ó×               ººººººººººººººººººººººº                         º   ¿¾
      º º½ ÆÙÑ ÖÓ×           ØÐÒ ºººººººººººººººººººººººººº                                º   ¿¾
  º    Ö ÓÐ × Ò Ö Ó×        Ù×ÕÙ º º º º º º º º º º º º º º º º º º º º º º º º º         º   ¿¿¼
      º º½ Ù×ÕÙ          Ò ÙÒ          ººººººººººººººººººººººººº                           º   ¿¿¾
             º º½º½ Ù×ÕÙ             Ð Ñ ÒÓÖ Ý Ð Ñ ÝÓÖ Ð Ñ ÒØÓ ÙÒ                      º   º   ¿¿¿
             º º½º¾ Ù×ÕÙ             Ð ÔÖ      ×ÓÖ Ý ×Ù ×ÓÖ º º º º º º º º º º º º º      º   ¿¿
             º º½º¿ Ù×ÕÙ × ×Ô Ð × ×Ó Ö ÙÒ                        ºººººººººººº              º   ¿¿
      º º¾ Ð Ì BinTree<Key> º º º º º º º º º º º º º º º º º º º º º º º º                º   ¿¿
      º º¿ ÁÒ× Ö ÓÒ Ò ÙÒ             ºººººººººººººººººººººººººº                            º   ¿¿
      º º È ÖØ ÓÒ ÙÒ                 ÔÓÖ Ð Ú ´×ÔРص º º º º º º º º º º º º º º º º       º   ¿¿
      º º ÍÒ ÓÒ Ü ÐÙ× Ú                  ´ Ó Ò Ü ÐÙ× ÚÓµ º º º º º º º º º º º º º º º     º   ¿½
      ºº      Ð Ñ Ò ÓÒ Ò ÙÒ              ºººººººººººººººººººººººº                          º   ¿¾
      º º ÁÒ× Ö ÓÒ Ò Ö Þ ÙÒ                    ººººººººººººººººººººº                       º   ¿¿
      º º ÍÒ ÓÒ               ´ Ó Òµ º º º º º º º º º º º º º º º º º º º º º º º º º º   º   ¿
      ºº      Ò Ð × × ÐÓ× Ö ÓÐ × Ò Ö Ó×              Ù×ÕÙ º º º º º º º º º º º º º        º   ¿
  º½¼ Ð Ì DynMapTree<Tree, Key, Range, Compare> º º º º º º º º º º º                      º   ¿
  º½½ ÜØ Ò× ÓÒ × ÐÓ× Ö ÓÐ × Ò Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º           º   ¿¿
xviii                                                                                    CONTENIDO



         º½½º½ Ë Ð ÓÒ ÔÓÖ ÔÓ× ÓÒ º º º º º º º º º º º º º º         º   º   º   º   º   º   º   º   º   º   º   º   ¿
         º½½º¾ Ð ÙÐÓ Ð ÔÓ× ÓÒ Ò¬ º º º º º º º º º º º               º   º   º   º   º   º   º   º   º   º   º   º   ¿
         º½½º¿ ÁÒ× Ö ÓÒ ÔÓÖ Ð Ú Ò Ö ÓÐ Ò Ö Ó ÜØ Ò Ó º                º   º   º   º   º   º   º   º   º   º   º   º   ¿
         º½½º È ÖØ ÓÒ ÔÓÖ Ð Ú º º º º º º º º º º º º º º º º        º   º   º   º   º   º   º   º   º   º   º   º   ¿
         º½½º ÁÒ× Ö ÓÒ Ò Ö Þ º º º º º º º º º º º º º º º º º       º   º   º   º   º   º   º   º   º   º   º   º   ¿
         º½½º È ÖØ ÓÒ ÔÓÖ ÔÓ× ÓÒ º º º º º º º º º º º º º º         º   º   º   º   º   º   º   º   º   º   º   º   ¿
         º½½º ÁÒ× Ö ÓÒ ÔÓÖ ÔÓ× ÓÒ º º º º º º º º º º º º º º        º   º   º   º   º   º   º   º   º   º   º   º   ¿
         º½½º ÍÒ ÓÒ Ü ÐÙ× Ú         Ö ÓÐ × ÜØ Ò Ó× º º º º º         º   º   º   º   º   º   º   º   º   º   º   º   ¿
         º½½º Ð Ñ Ò ÓÒ ÔÓÖ Ð Ú Ò Ö ÓÐ × ÜØ Ò Ó× º º                  º   º   º   º   º   º   º   º   º   º   º   º   ¿   ¼
         º½½º½¼ Ð Ñ Ò ÓÒ ÔÓÖ ÔÓ× ÓÒ Ò Ö ÓÐ × ÜØ Ò Ó×                 º   º   º   º   º   º   º   º   º   º   º   º   ¿   ¼
         º½½º½½ × ÑÔ ÒÓ Ð × ÜØ Ò× ÓÒ × º º º º º º º º º º           º   º   º   º   º   º   º   º   º   º   º   º   ¿   ½
    º½¾ ÊÓØ ÓÒ Ö ÓÐ × Ò Ö Ó× º º º º º º º º º º º º º º º           º   º   º   º   º   º   º   º   º   º   º   º   ¿   ½
         º½¾º½ ÊÓØ ÓÒ × Ò Ö ÓÐ × Ò Ö Ó× ÜØ Ò Ó× º º º                º   º   º   º   º   º   º   º   º   º   º   º   ¿   ¿
    º½¿ Ó Ó× ÀÙ«Ñ Ò º º º º º º º º º º º º º º º º º º º            º   º   º   º   º   º   º   º   º   º   º   º   ¿   ¿
         º½¿º½ ÍÒ Ì Ô Ö Ö ÓÐ × Ó Ó º º º º º º º º º                 º   º   º   º   º   º   º   º   º   º   º   º   ¿
         º½¿º¾     Ó ¬ ÓÒ º º º º º º º º º º º º º º º º º º        º   º   º   º   º   º   º   º   º   º   º   º   ¿
         º½¿º¿ Ð ÓÖ ØÑÓ ÀÙ«Ñ Ò º º º º º º º º º º º º º º           º   º   º   º   º   º   º   º   º   º   º   º   ¿
         º½¿º     ¬Ò ÓÒ × Ñ ÓÐÓ× Ý Ö Ù Ò × º º º º º º               º   º   º   º   º   º   º   º   º   º   º   º   ¿   ¼
         º½¿º Ó ¬ ÓÒ Ø ÜØÓ º º º º º º º º º º º º º º º             º   º   º   º   º   º   º   º   º   º   º   º   ¿   ½
         º½¿º ÇÔØ Ñ ÓÒ ÀÙ«Ñ Ò º º º º º º º º º º º º º              º   º   º   º   º   º   º   º   º   º   º   º   ¿   ¿
                º½¿º º½ ÓÒ ÐÙ× ÓÒ º º º º º º º º º º º º º º º      º   º   º   º   º   º   º   º   º   º   º   º   ¿
    º½ Ö ÓÐ × ×Ø Ø Ó× ÓÔØ ÑÓ× º º º º º º º º º º º º º º º º        º   º   º   º   º   º   º   º   º   º   º   º   ¿
         º½ º½ Ç Ø ÚÓ Ð ÔÖÓ Ð Ñ º º º º º º º º º º º º º º          º   º   º   º   º   º   º   º   º   º   º   º   ¿
         º½ º¾ ÁÑÔÐ ÒØ ÓÒ Ð ÔÖÓ Ð Ñ º º º º º º º º º º º            º   º   º   º   º   º   º   º   º   º   º   º   ¿
    º½ ÆÓØ × Ð Ó Ö ¬ × º º º º º º º º º º º º º º º º º º º º       º   º   º   º   º   º   º   º   º   º   º   º   ¿   ¾
    º½      Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º º   º   º   º   º   º   º   º   º   º   º   º   º   ¿
       ÐÓ Ö     ººººººººººººººººººººººººººº                          º   º   º   º   º   º   º   º   º   º   º   º   ¿
5 Tablas hash                                                                                                        399
    º½ Å Ò Ó ÓÐ × ÓÒ × º º º º º º º º º º º º º º º º º º º º º º º º º                     º   º  ºº   º   º        ¼½
        º½º½ Ä Ô Ö Ó Ð ÙÑÔÐ ÒÓ× º º º º º º º º º º º º º º º º º                            º   º  ºº   º   º        ¼½
        º½º¾ ×ØÖ Ø × Ñ Ò Ó ÓÐ × ÓÒ × º º º º º º º º º º º º º                               º   º  ºº   º   º        ¼¿
        º½º¿ Ò Ò Ñ ÒØÓ º º º º º º º º º º º º º º º º º º º º º º º                         º   º  ºº   º   º        ¼¿
              º½º¿º½ Ò Ò Ñ ÒØÓ × Ô Ö Ó º º º º º º º º º º º º º                             º   º  ºº   º   º        ¼¿
              º½º¿º¾ Ò Ð × × Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó º º º º º º                                 º   º  ºº   º   º        ¼
              º½º¿º¿ Ò Ò Ñ ÒØÓ ÖÖ Ó º º º º º º º º º º º º º                                º   º  ºº   º   º        ½½
              º½º¿º   Ò Ð × × Ò ÓÖÑ Ð Ð Ò Ò Ñ ÒØÓ ÖÖ Ó º º                                   º   º  ºº   º   º        ½¾
        º½º     Ö ÓÒ Ñ ÒØÓ ÖØÓ º º º º º º º º º º º º º º º º º º                           º   º  ºº   º   º        ½
              º½º º½ ËÓÒ Ó Ð ´×ÓÒ Ó ÙÒ ÓÖÑ µ º º º º º º º º º                               º   º  ºº   º   º        ½
              º½º º¾ ËÓÒ Ó Ð Ò Ð º º º º º º º º º º º º º º º º º º º º                     º   º  ºº   º   º        ½
              º½º º¿ Ò Ð × × Ò ÓÖÑ Ð Ð ×ÓÒ Ó Ð Ò Ð º º º º º º º º                           º   º  ºº   º   º        ¾¼
              º½º º ËÓÒ Ó Ù Ö Ø Ó º º º º º º º º º º º º º º º º º                          º   º  ºº   º   º        ¾¿
              º½º º   ÓÐ × ººººººººººººººººººººº                                             º   º  ºº   º   º        ¾
              º½º º   Ò Ð × × Ò ÓÖÑ Ð Ð Ó Ð × º º º º º º º º º                              º   º  ºº   º   º        ¾
        º½º Ê Ùר         Ñ Ò× ÓÒ Ò ÙÒ Ø Ð × º º º º º º º º º                               º   º  ºº   º   º        ¿¼
        º½º Å Ò Ó Ò Ñ Ó Ù Ø × ´Ì DynLhashTable<Key,                                          Record>µ                 ¿¾
CONTENIDO                                                                                                            xix



        º½º  Ì Ð × × ÐÒ Ð × º º º º º º º º º º º º º º º º º º º                    ºº      º   º   º   º   º   º    ¿¿
              º½º º½ ÜÔ Ò× ÓÒ» ÓÒØÖ ÓÒ ÙÒ Ø Ð × Ð Ò                                  Ð       º   º   º   º   º   º    ¿
              º½º º¾ Ù×ÕÙ            Ò LinearHashTable<Key> º º º                    ºº      º   º   º   º   º   º    ¿
              º½º º¿ ÁÒ× Ö ÓÒ Ò LinearHashTable<Key> º º º º                         ºº      º   º   º   º   º   º      ¼
              º½º º      Ð Ñ Ò ÓÒ Ò LinearHashTable<Key> º º                         ºº      º   º   º   º   º   º      ¼
              º½º º       Ò Ð × × Ð ×Ô Ö× ÓÒ Ð Ò Ð º º º º º º º º                   ºº      º   º   º   º   º   º     ¼
   º¾ ÙÒ ÓÒ × × º º º º º º º º º º º º º º º º º º º º º º º º º º                  ºº      º   º   º   º   º   º
       º¾º½ ÁÒØ Ö Þ Ð ÙÒ ÓÒ × º º º º º º º º º º º º º º º º                        ºº      º   º   º   º   º   º
       º¾º¾ ÀÓÐ ÙÖ           ×Ô Ö× ÓÒ º º º º º º º º º º º º º º º º º º            ºº      º   º   º   º   º   º
       º¾º¿ ÈÐ Ó Ó Ó Ð Ó Ð Ú º º º º º º º º º º º º º º º                           ºº      º   º   º   º   º   º
       º¾º À ÙÖ ×Ø ×             ×Ô Ö× ÓÒ º º º º º º º º º º º º º º º º            ºº      º   º   º   º   º   º
              º¾º º½       ×Ô Ö× ÓÒ ÔÓÖ Ú × ÓÒ º º º º º º º º º º º º               ºº      º   º   º   º   º   º
              º¾º º¾       ×Ô Ö× ÓÒ ÔÓÖ ÑÙÐØ ÔÐ ÓÒ º º º º º º º º º                 ºº      º   º   º   º   º   º
       º¾º      ×Ô Ö× ÓÒ           Ò×      Ö ØÖ× ºººººººººº                          ºº      º   º   º   º   º   º     ½
       º¾º      ×Ô Ö× ÓÒ ÙÒ Ú Ö× Ð º º º º º º º º º º º º º º º º º º º             ºº      º   º   º   º   º   º     ½
       º¾º      ×Ô Ö× ÓÒ Ô Ö Ø º º º º º º º º º º º º º º º º º º º º               ºº      º   º   º   º   º   º     ¾
   º¿ ÇØÖÓ× Ù×Ó× Ð × Ø Ð × × Ý Ð ×Ô Ö× ÓÒ º º º º º º º º                            ºº      º   º   º   º   º   º     ¿
       º¿º½ Á ÒØ ¬ ÓÒ                 Ò× ºººººººººººººººº                            ºº      º   º   º   º   º   º     ¿
       º¿º¾ ËÙÔ ÖØÖ Þ º º º º º º º º º º º º º º º º º º º º º º º º                ºº      º   º   º   º   º   º
       º¿º¿          ´ Ð Ì Hash Cache<Key,Data> µ º º º º º º º                      ºº      º   º   º   º   º   º
   º ÆÓØ × Ð Ó Ö ¬ × º º º º º º º º º º º º º º º º º º º º º º º º                 ºº      º   º   º   º   º   º
   º      Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º º º º º º             ºº      º   º   º   º   º   º
     ÐÓ Ö    ººººººººººººººººººººººººººººººº                                         ºº      º   º   º   º   º   º     ¼
  ´
6 Arboles de b´squeda equilibrados
              u                                                                                                      473
   º½   ÕÙ Ð Ö Ó Ö ÓÐ × º º º º º º º º º º º º º º º º º       ºº   º   º   º   º   º   º   º   º   º   º   º   º
   º¾   Ö ÓÐ × Ð ØÓÖ Þ Ó× º º º º º º º º º º º º º º º º º     ºº   º   º   º   º   º   º   º   º   º   º   º   º
       º¾º½ Ð Ì Rand Tree<Key> º º º º º º º º º º              ºº   º   º   º   º   º   º   º   º   º   º   º   º
               º¾º½º½ ÁÒ× Ö ÓÒ Ò ÙÒ               ºººººº        ºº   º   º   º   º   º   º   º   º   º   º   º   º
               º¾º½º¾ Ð Ñ Ò ÓÒ Ò ÙÒ                 ººººº       ºº   º   º   º   º   º   º   º   º   º   º   º   º     ¼
       º¾º¾ Ò Ð × × ÐÓ× Ö ÓÐ × Ð ØÓÖ Þ Ó× º º º º               ºº   º   º   º   º   º   º   º   º   º   º   º   º     ¾
   º¿ ÌÖ Ô× º º º º º º º º º º º º º º º º º º º º º º º º º   ºº   º   º   º   º   º   º   º   º   º   º   º   º
       º¿º½ Ð Ì Treap<Key> º º º º º º º º º º º º              ºº   º   º   º   º   º   º   º   º   º   º   º   º
       º¿º¾ ÁÒ× Ö ÓÒ Ò ÙÒ ØÖ Ô º º º º º º º º º º º º          ºº   º   º   º   º   º   º   º   º   º   º   º   º
       º¿º¿ Ð Ñ Ò ÓÒ Ò ØÖ Ô º º º º º º º º º º º º º           ºº   º   º   º   º   º   º   º   º   º   º   º   º     ¼
       º¿º      Ò Ð × × ÐÓ× ØÖ Ô× º º º º º º º º º º º º º     ºº   º   º   º   º   º   º   º   º   º   º   º   º     ¾
       º¿º ÈÖ ÓÖ        × ÑÔÐ Ø × º º º º º º º º º º º º       ºº   º   º   º   º   º   º   º   º   º   º   º   º
   º    Ö ÓÐ × ÎÄ º º º º º º º º º º º º º º º º º º º º º     ºº   º   º   º   º   º   º   º   º   º   º   º   º
       º º½ Ð Ì Avl Tree<Key> º º º º º º º º º º               ºº   º   º   º   º   º   º   º   º   º   º   º   º
               º º½º½ ÁÒ× Ö ÓÒ Ò ÙÒ Ö ÓÐ ÎÄ º º º º             ºº   º   º   º   º   º   º   º   º   º   º   º   º
               º º½º¾ Ð Ñ Ò ÓÒ Ò ÙÒ Ö ÓÐ ÎÄ º º º               ºº   º   º   º   º   º   º   º   º   º   º   º   º    ¼½
       º º¾ Ò Ð × × ÐÓ× Ö ÓÐ × ÎÄ º º º º º º º º º             ºº   º   º   º   º   º   º   º   º   º   º   º   º    ¼
               º º¾º½ Ö ÓÐ ×           ÓÒ       ººººººº         ºº   º   º   º   º   º   º   º   º   º   º   º   º    ¼
               º º¾º¾     ÑÓ×ØÖ ÓÒ Ð ÔÖÓÔÓ× ÓÒ º                 º   º   º   º   º   º   º   º   º   º   º   º   º    ½½
   º    Ö ÓÐ × ÖÓ Ó¹Ò ÖÓ º º º º º º º º º º º º º º º º º º    ºº   º   º   º   º   º   º   º   º   º   º   º   º    ½¿
       º º½ Ð Ì Rb Tree<Key> º º º º º º º º º º º              ºº   º   º   º   º   º   º   º   º   º   º   º   º    ½
xx                                                                                              CONTENIDO



                    º º½º½ ÁÒ× Ö ÓÒ Ò ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ º º             º   º   º   º   º   º   º   º   º   º   º   º   º    ½
                    º º½º¾ Ð Ñ Ò ÓÒ Ò ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ                 º   º   º   º   º   º   º   º   º   º   º   º   º    ¾¼
            º º¾ Ò Ð × × ÐÓ× Ö ÓÐ × ÖÓ Ó¹Ò ÖÓ º º º º º º º             º   º   º   º   º   º   º   º   º   º   º   º   º    ¾
     º       Ö ÓÐ × ×ÔÐ Ý º º º º º º º º º º º º º º º º º º º º º º   º   º   º   º   º   º   º   º   º   º   º   º   º    ¿¼
            º º½ Ð Ì Splay Tree<Key> º º º º º º º º º º                º   º   º   º   º   º   º   º   º   º   º   º   º    ¿¾
            º º¾ Ò Ð × × ÐÓ× Ö ÓÐ × ×ÔÐ Ý º º º º º º º º º º           º   º   º   º   º   º   º   º   º   º   º   º   º    ¿
     º       ÓÒ ÐÙ× ÓÒ º º º º º º º º º º º º º º º º º º º º º º º    º   º   º   º   º   º   º   º   º   º   º   º   º      ¾
     º     ÆÓØ × Ð Ó Ö ¬ × º º º º º º º º º º º º º º º º º º º        º   º   º   º   º   º   º   º   º   º   º   º   º
     º         Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º     º   º   º   º   º   º   º   º   º   º   º   º   º
          ÐÓ Ö     ºººººººººººººººººººººººººº                           º   º   º   º   º   º   º   º   º   º   º   º   º
7 Grafos                                                                                                                    559
     º½  ÙÒ Ñ ÒØÓ× º º º º º º º º º º º º º º º º º º º º º º º º º º º º º                        º   º   º   º   º   º     ½
     º¾   רÖÙ ØÙÖ ×      ØÓ× Ô Ö Ö ÔÖ × ÒØ Ö Ö Ó× º º º º º º º º º º º º                          º   º   º   º   º   º
         º¾º½ Å ØÖ ×           Ý Ò         ººººººººººººººººººº                                      º   º   º   º   º   º
         º¾º¾ Ä ×Ø ×         Ý Ò ººººººººººººººººººººº                                              º   º   º   º   º   º
     º¿ ÍÒ Ì Ô Ö Ö Ó× ´List Graph<Node, Arc>µ º º º º º º º º º                                     º   º   º   º   º   º
         º¿º½ Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º º º º º º                        º   º   º   º   º   º     ¼
         º¿º¾       Ö Ó× ´List Digraph<Node, Arc>µ º º º º º º º º º º                              º   º   º   º   º   º     ½
         º¿º¿ ÆÓ Ó× º º º º º º º º º º º º º º º º º º º º º º º º º º º º º                       º   º   º   º   º   º     ½
                 º¿º¿º½ ÁÒ× Ö ÓÒ ÒÓ Ó× º º º º º º º º º º º º º º º º º                            º   º   º   º   º   º     ¾
                 º¿º¿º¾ Ð Ñ Ò ÓÒ ÒÓ Ó× º º º º º º º º º º º º º º º                                º   º   º   º   º   º     ¾
                 º¿º¿º¿       ×Ó ÐÓ× ÒÓ Ó× ÙÒ Ö Ó º º º º º º º º º º                               º   º   º   º   º   º     ¿
         º¿º      Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º º º º º º                    º   º   º   º   º   º
                 º¿º º½ ÁÒ× Ö ÓÒ Ö Ó× º º º º º º º º º º º º º º º º º                             º   º   º   º   º   º
                 º¿º º¾ Ð Ñ Ò ÓÒ Ö Ó× º º º º º º º º º º º º º º º º                               º   º   º   º   º   º
                 º¿º º¿       ×Ó ÐÓ× Ö Ó× ÙÒ Ö Ó º º º º º º º º º º                                º   º   º   º   º   º
         º¿º      ØÖ ÙØÓ× ÓÒØÖÓÐ ÒÓ Ó× Ý Ö Ó× º º º º º º º º º º º                                 º   º   º   º   º   º     ¼
                 º¿º º½     Ø× ÓÒØÖÓÐ º º º º º º º º º º º º º º º º º º º                         º   º   º   º   º   º     ¼
                 º¿º º¾ ÓÒØ ÓÖ × º º º º º º º º º º º º º º º º º º º º º                          º   º   º   º   º   º     ¿
                 º¿º º¿ ÓÓ × º º º º º º º º º º º º º º º º º º º º º º º                          º   º   º   º   º   º     ¿
                 º¿º º Ê Ò Ó ÒÓ Ó× Ý Ö Ó× º º º º º º º º º º º º º                                 º   º   º   º   º   º
         º¿º Å ÖÓ×             ×Ó ÒÓ Ó× Ý Ö Ó× º º º º º º º º º º º º º º                          º   º   º   º   º   º
         º¿º      ÓÒרÖÙ ÓÒ Ý ×ØÖÙ ÓÒ List Graph<Node, Arc>                                         º   º   º   º   º   º
         º¿º ÇÔ Ö ÓÒ × Ò Ö × ×Ó Ö ÒÓ Ó× º º º º º º º º º º º º º                                   º   º   º   º   º   º
         º¿º ÇÔ Ö ÓÒ × Ò Ö × ×Ó Ö Ö Ó× º º º º º º º º º º º º º                                    º   º   º   º   º   º
         º¿º½¼ ÁÑÔÐ ÒØ ÓÒ List Graph<Node, Arc> º º º º º º º º                                     º   º   º   º   º   º
                 º¿º½¼º½      ×Ó ÒÓ Ó× Ý Ö Ó× º º º º º º º º º º º º º º                           º   º   º   º   º   º
                 º¿º½¼º¾ Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º                       º   º   º   º   º   º     ½
                 º¿º½¼º¿ ÁÒ× Ö ÓÒ ÒÓ Ó× º º º º º º º º º º º º º º º º º                           º   º   º   º   º   º
                 º¿º½¼º ÁÒ× Ö ÓÒ Ö Ó× º º º º º º º º º º º º º º º º º                             º   º   º   º   º   º
                 º¿º½¼º Ð Ñ Ò ÓÒ Ö Ó× º º º º º º º º º º º º º º º º                               º   º   º   º   º   º
                 º¿º½¼º Ð Ñ Ò ÓÒ ÒÓ Ó× º º º º º º º º º º º º º º º                                º   º   º   º   º   º
                 º¿º½¼º Ä ÑÔ Þ           Ö Ó× º º º º º º º º º º º º º º º º º                     º   º   º   º   º   º
                 º¿º½¼º Å Ô Ó ÒÓ Ó× Ý Ö Ó× º º º º º º º º º º º º º º                              º   º   º   º   º   º
                 º¿º½¼º ÓÔ           Ö Ó× º º º º º º º º º º º º º º º º º º                       º   º   º   º   º   º    ¼¼
CONTENIDO                                                                                                 xxi



              º¿º½¼º½¼ ÇÖ Ò Ñ ÒØÓ Ö Ó× º º º º º º º º º º º º º              º   º   º   º   º   º   º    ¼½
  º   Ì       Ñ ÒÓ ×Ó Ö ÙÒ Ö Ó ´Path<GT>µ º º º º º º º º º º º º º           º   º   º   º   º   º   º    ¼¾
  º   Ê ÓÖÖ Ó× ×Ó Ö Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º        º   º   º   º   º   º   º    ¼
       º º½ ÁØ Ö ÓÖ × ¬ÐØÖÓ º º º º º º º º º º º º º º º º º º º º º º º     º   º   º   º   º   º   º    ¼
              º º½º½ ÁØ Ö ÓÖ ¬ÐØÖÓ Ö Ó× ÙÒ ÒÓ Ó º º º º º º º                 º   º   º   º   º   º   º    ¼
              º º½º¾ ÁØ Ö ÓÖ ¬ÐØÖÓ Ö Ó× º º º º º º º º º º º º º º           º   º   º   º   º   º   º    ½¼
              º º½º¿ ÁØ Ö ÓÖ ¬ÐØÖÓ ÒÓ Ó× º º º º º º º º º º º º º            º   º   º   º   º   º   º    ½¼
       º º¾ Ê ÓÖÖ Ó Ò ÔÖÓ ÙÒ              ººººººººººººººººº                   º   º   º   º   º   º   º    ½¼
       º º¿ ÓÒ Ø Ú           ÒØÖ Ö Ó× º º º º º º º º º º º º º º º º º       º   º   º   º   º   º   º    ½
       º º Ê ÓÖÖ Ó Ò ÑÔÐ ØÙ º º º º º º º º º º º º º º º º º º º             º   º   º   º   º   º   º    ½
       º º ÈÖÙ             ÐÓ× º º º º º º º º º º º º º º º º º º º º º º    º   º   º   º   º   º   º    ½
       º º ÈÖÙ               Ð         ººººººººººººººººººº                    º   º   º   º   º   º   º    ½
       ºº      Ù×ÕÙ            Ñ ÒÓ× ÔÓÖ ÔÖÓ ÙÒ         ºººººººººº            º   º   º   º   º   º   º    ¾½
              º º º½ ÈÖÙ            Ü ×Ø Ò º º º º º º º º º º º º º º º      º   º   º   º   º   º   º    ¾½
              º º º¾ Ù×ÕÙ               Ñ ÒÓ ÒØÖ Ó× ÒÓ Ó× º º º º º           º   º   º   º   º   º   º    ¾¿
       ºº      Ù×ÕÙ            Ñ ÒÓ× ÔÓÖ ÑÔÐ ØÙ º º º º º º º º º º º º       º   º   º   º   º   º   º    ¾
       ºº      Ö ÓÐ × Ö ÓÖ × ÔÖÓ ÙÒ                   ººººººººººº             º   º   º   º   º   º   º    ¾
       º º½¼ Ö ÓÐ × Ö ÓÖ × ÑÔÐ ØÙ º º º º º º º º º º º º º                   º   º   º   º   º   º   º    ¿¼
       º º½½ Ö ÓÐ × Ö ÓÖ × Ò ÖÖ ÐÓ× º º º º º º º º º º º º º º               º   º   º   º   º   º   º    ¿½
       º º½¾ ÓÒÚ Ö× ÓÒ ÙÒ Ö ÓÐ Ö ÓÖ ÙÒ Tree Node<T> º                         º   º   º   º   º   º   º    ¿¿
       º º½¿ ÓÑÔÓÒ ÒØ × Ò ÓÒ ÜÓ× ÙÒ Ö Ó º º º º º º º º º º º                 º   º   º   º   º   º   º    ¿
       º º½ ÈÙÒØÓ× ÖØ ÙÐ ÓÒ ÙÒ Ö Ó º º º º º º º º º º º º                    º   º   º   º   º   º   º    ¿
       º º½ ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× ÐÓ× ÔÙÒØÓ× ÓÖØ º º º º º º                      º   º   º   º   º   º   º      ¼
              º º½ º½ È ÒØ Ó ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× º º º º º º º º                º   º   º   º   º   º   º      ¾
              º º½ º¾ ÓÔ Ñ Ô                 ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× º º º          º   º   º   º   º   º   º
  º   Å ØÖ ×           Ý Ò ººººººººººººººººººººººº                            º   º   º   º   º   º   º
       º º½ Ð Ì Map Matrix Graph<GT> º º º º º º º º º º º º º                º   º   º   º   º   º   º
       º º¾ Ð Ì Matrix Graph<GT> º º º º º º º º º º º º º º º                º   º   º   º   º   º   º     ¿
       º º¿ Ð Ì Ady Mat<GT, Entry> º º º º º º º º º º º º º º                º   º   º   º   º   º   º
       ºº      Ð Ì Bit Mat Graph<GT> º º º º º º º º º º º º º º º            º   º   º   º   º   º   º
       ºº      Ð ÓÖ ØÑÓ Ï Ö× ÐÐ º º º º º º º º º º º º º º º º º º º         º   º   º   º   º   º   º     ½
  º   ÌÓÔ Ó× ×Ó Ö Ö Ó× Ö Ó× º º º º º º º º º º º º º º º º º º º             º   º   º   º   º   º   º
       º º½ ÓÒ Ø Ú           ÒØÖ Ö Ó× º º º º º º º º º º º º º º º º         º   º   º   º   º   º   º
       º º¾ ÁÒÚ Ö× ÓÒ ÙÒ Ö Ó º º º º º º º º º º º º º º º º º º              º   º   º   º   º   º   º
       º º¿ ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ× ÙÒ Ö Ó º º º º                        º   º   º   º   º   º   º
              º º¿º½ Ð ÓÖ ØÑÓ ÃÓ× Ö Ù º º º º º º º º º º º º º               º   º   º   º   º   º   º
              º º¿º¾ Ð ÓÖ ØÑÓ Ì Ö Ò º º º º º º º º º º º º º º º             º   º   º   º   º   º   º
       º º ÈÖÙ               Ð         ººººººººººººººººººº                    º   º   º   º   º   º   º
       ºº        Ð ÙÐÓ      ÐÓ× Ò ÙÒ Ö Ó º º º º º º º º º º º º º º          º   º   º   º   º   º   º
       ºº         Ö Ó× Ð Ó× ´          µº º º º º º º º º º º º º º º º º º   º   º   º   º   º   º   º
       º º ÈÐ Ò ¬ ÓÒ Ø Ö × º º º º º º º º º º º º º º º º º º º              º   º   º   º   º   º   º
       º º ÇÖ Ò Ñ ÒØÓ ØÓÔÓÐÓ Ó º º º º º º º º º º º º º º º º º              º   º   º   º   º   º   º     ¼
  º     Ö ÓÐ × Ö ÓÖ × Ñ Ò ÑÓ× º º º º º º º º º º º º º º º º º º º           º   º   º   º   º   º   º
       º º½        ×Ó ÐÓ× Ô ×Ó× Ð Ö Ó º º º º º º º º º º º º º º º º         º   º   º   º   º   º   º
       º º¾ Ð ÓÖ ØÑÓ ÃÖÙ× Ð º º º º º º º º º º º º º º º º º º º             º   º   º   º   º   º   º
              º º¾º½ Ò Ð × × Ð Ð ÓÖ ØÑÓ ÃÖÙ× Ð º º º º º º º                  º   º   º   º   º   º   º    ¼½
xxii                                                                                  CONTENIDO



                    º º¾º¾ ÓÖÖ Ø ØÙ Ð Ð ÓÖ ØÑÓ ÃÖÙ× Ð º º º º                     º   º   º   º   º   º   º   º   ¼½
            º º¿     Ð ÓÖ ØÑÓ ÈÖ Ñ º º º º º º º º º º º º º º º º º º º º        º   º   º   º   º   º   º   º   ¼¾
                    º º¿º½ ÁÒØ Ö Þ Ð Ð ÓÖ ØÑÓ ÈÖ Ñ º º º º º º º º                º   º   º   º   º   º   º   º   ¼¾
                    º º¿º¾ À Ô Ü ÐÙ× ÚÓ Ö Ó× Ñ Ò ÑÓ× º º º º º º º                º   º   º   º   º   º   º   º   ¼¾
                    º º¿º¿ ÁÒ Ð Þ ÓÒ Ð Ð ÓÖ ØÑÓ ÈÖ Ñ º º º º º                    º   º   º   º   º   º   º   º   ¼
                    º º¿º      Ð Ð ÓÖ ØÑÓ ÈÖ Ñ º º º º º º º º º º º º º          º   º   º   º   º   º   º   º   ¼
                    º º¿º      Ò Ð × × Ð Ð ÓÖ ØÑÓ ÈÖ Ñ º º º º º º º º            º   º   º   º   º   º   º   º   ¼
                    º º¿º      ÓÖÖ Ø ØÙ Ð Ð ÓÖ ØÑÓ ÈÖ Ñ º º º º º º               º   º   º   º   º   º   º   º   ¼
       º      Ñ ÒÓ× Ñ Ò ÑÓ× º º º º º º º º º º º º º º º º º º º º º º º º º     º   º   º   º   º   º   º   º   ½¼
            º º½ Ð ÓÖ ØÑÓ               ×ØÖ º º º º º º º º º º º º º º º º º º   º   º   º   º   º   º   º   º   ½½
                    º º½º½      ר Ò       ÙÑÙÐ       Ò ÐÓ× ÒÓ Ó× º º º º º º     º   º   º   º   º   º   º   º   ½¾
                    º º½º¾ ÈÓØ Ò Ð Ò ÐÓ× Ö Ó× º º º º º º º º º º º º º           º   º   º   º   º   º   º   º   ½
                    º º½º¿ Ð Ð ÓÖ ØÑÓ               ×ØÖ º º º º º º º º º º º     º   º   º   º   º   º   º   º   ½
                    º º½º       Ð ÙÐÓ ÙÒ Ñ ÒÓ Ñ Ò ÑÓ º º º º º º º º              º   º   º   º   º   º   º   º   ½
                    º º½º      ÓÖÖ Ø ØÙ Ð Ð ÓÖ ØÑÓ                ×ØÖ º º º º     º   º   º   º   º   º   º   º   ½
                    º º½º      Ò Ð × × Ð Ð ÓÖ ØÑÓ             ×ØÖ º º º º º º     º   º   º   º   º   º   º   º   ¾¼
            º º¾ Ð ÓÖ ØÑÓ           ÐÓÝ ¹Ï Ö× ÐÐ º º º º º º º º º º º º º º      º   º   º   º   º   º   º   º   ¾¼
                    º º¾º½ ÁÒØ Ö × º º º º º º º º º º º º º º º º º º º º        º   º   º   º   º   º   º   º   ¾½
                    º º¾º¾ Ð Ð ÓÖ ØÑÓ            ÐÓÝ ¹Ï Ö× ÐÐ º º º º º º º       º   º   º   º   º   º   º   º   ¾¾
                    º º¾º¿ Ò Ð × × Ð Ð ÓÖ ØÑÓ              ÐÓÝ ¹Ï Ö× ÐÐ º º       º   º   º   º   º   º   º   º   ¾
                    º º¾º      ÓÖÖ Ø ØÙ Ð Ð ÓÖ ØÑÓ             ÐÓÝ ¹Ï Ö× ÐÐ       º   º   º   º   º   º   º   º   ¾
                    º º¾º Ê ÙÔ Ö ÓÒ                Ñ ÒÓ× º º º º º º º º º º º    º   º   º   º   º   º   º   º   ¾
            º º¿ Ð ÓÖ ØÑÓ            ÐÐÑ Ò¹ ÓÖ º º º º º º º º º º º º º º º      º   º   º   º   º   º   º   º   ¾
                    º º¿º½ ÁÒ Ð Þ ÓÒ Ð Ð ÓÖ ØÑÓ                   ÐÐÑ Ò¹ ÓÖ       º   º   º   º   º   º   º   º   ¾
                    º º¿º¾ Å Ò Ó Ð Ö ÓÐ Ö ÓÖ º º º º º º º º º º                  º   º   º   º   º   º   º   º   ¿¼
                    º º¿º¿ Ð Ð ÓÖ ØÑÓ Ò Ö Ó ÐÐÑ Ò¹ ÓÖ º º º º º                   º   º   º   º   º   º   º   º   ¿¼
                    º º¿º      Ð ÓÖ ØÑÓ Ñ ÓÖ Ó            ÐÐÑ Ò¹ ÓÖ º º º º       º   º   º   º   º   º   º   º   ¿½
                    º º¿º       Ø ÓÒ           ÐÓ× Ò Ø ÚÓ× º º º º º º º º º      º   º   º   º   º   º   º   º   ¿
                    º º¿º      ÓÒרÖÙ ÓÒ Ð Ö ÓÐ Ö ÓÖ º º º º º º                  º   º   º   º   º   º   º   º   ¿
                    º º¿º      Ò Ð × × Ð Ð ÓÖ ØÑÓ           ÐÐÑ Ò¹ ÓÖ º º º       º   º   º   º   º   º   º   º   ¿
                    º º¿º      ÓÖÖ Ø ØÙ Ð Ð ÓÖ ØÑÓ              ÐÐÑ Ò¹ ÓÖ º       º   º   º   º   º   º   º   º   ¿
                    º º¿º      Ù×ÕÙ            ÐÓ× Ò Ø ÚÓ× º º º º º º º º º      º   º   º   º   º   º   º   º   ¿
                    º º¿º½¼ Ð ÙÐÓ           ÐÓ× Ò Ø ÚÓ× Ò ÙÒ Ö Ó º º              º   º   º   º   º   º   º   º     ½
            ºº        × Ù× ÓÒ ×Ó Ö ÐÓ× Ð ÓÖ ØÑÓ×          Ñ ÒÓ× Ñ Ò ÑÓ× º º       º   º   º   º   º   º   º   º     ¾
       º½¼ Ê × ­Ù Ó º º º º º º º º º º º º º º º º º º º º º º º º º º º         º   º   º   º   º   º   º   º     ¿
            º½¼º½ ¬Ò ÓÒ × Ý ÔÖÓÔ               × ÙÒ Ñ ÒØ Ð × º º º º º º º        º   º   º   º   º   º   º   º     ¿
            º½¼º¾ Ð Ì Net Graph<TNode,TArc,T> º º º º º º º º º º                 º   º   º   º   º   º   º   º
            º½¼º¿ Å Ò Ó× Ú Ö Ó× Ù ÒØ × Ó ×ÙÑ ÖÓ× º º º º º º º º º                º   º   º   º   º   º   º   º
            º½¼º ÇÔ Ö ÓÒ × ØÓÔÓÐÓ × ×Ó Ö ÙÒ Ö                   Ô Ø         ºº    º   º   º   º   º   º   º   º
            º½¼º ÓÖØ × Ö º º º º º º º º º º º º º º º º º º º º º º º            º   º   º   º   º   º   º   º    ¾
            º½¼º ÐÙ Ó Ñ Ü ÑÓ» ÓÖØ Ñ Ò ÑÓ º º º º º º º º º º º º º º º            º   º   º   º   º   º   º   º
            º½¼º      Ñ ÒÓ× ÙÑ ÒØÓ º º º º º º º º º º º º º º º º º º º          º   º   º   º   º   º   º   º
            º½¼º      Ð ÙÐÓ Ð Ö Ö × Ù Ð º º º º º º º º º º º º º º º º           º   º   º   º   º   º   º   º
            º½¼º      Ð ÙÐÓ       Ñ ÒÓ× ÙÑ ÒØÓ º º º º º º º º º º º º º          º   º   º   º   º   º   º   º    ½
            º½¼º½¼ ÁÒ Ö Ñ ÒØÓ Ð ­Ù Ó ÔÓÖ ÙÒ Ñ ÒÓ ÙÑ ÒØÓ º º º º                   º   º   º   º   º   º   º   º    ¾
            º½¼º½½ Ð Ð ÓÖ ØÑÓ          ÓÖ ¹ ÙÐ Ö×ÓÒ º º º º º º º º º º º º º     º   º   º   º   º   º   º   º    ¿
CONTENIDO                                                                                xxiii



              º½¼º½½º½ Ò Ð × × Ð Ð ÓÖ ØÑÓ            ÓÖ ¹ ÙÐ Ö×ÓÒ º º º º º º º º º º
       º½¼º½¾ Ð Ð ÓÖ ØÑÓ          ÑÓÒ ×¹Ã ÖÔ º º º º º º º º º º º º º º º º º º º º º
              º½¼º½¾º½ Ò Ð × × Ð Ð ÓÖ ØÑÓ              ÑÓÒ ×¹Ã ÖÔ º º º º º º º º º º        ¼
       º½¼º½¿ Ð ÓÖ ØÑÓ× ÑÔÙ Ý ÔÖ ¹­Ù Ó º º º º º º º º º º º º º º º º º º º º               ¾
              º½¼º½¿º½ ÐØÙÖ ÙÒ ÒÓ Ó º º º º º º º º º º º º º º º º º º º º º º º            ¿
              º½¼º½¿º¾ Ð ÓÖ ØÑÓ Ò Ö Ó ÔÖ ¹­Ù Ó º º º º º º º º º º º º º º º º               ¿
              º½¼º½¿º¿ Î ÐÓÖ × Ò Ð × Ð ÙÒ ÓÒ ÐØÙÖ º º º º º º º º º º º
              º½¼º½¿º Å Ò Ó Ð ÓÒ ÙÒØÓ Ah º º º º º º º º º º º º º º º º º º º º
              º½¼º½¿º ÁÑÔÐ ÒØ ÓÒ Ð Ð ÓÖ ØÑÓ Ò Ö Ó º º º º º º º º º º º º º                   ¼
              º½¼º½¿º Ò Ð × × Ð Ð ÓÖ ØÑÓ ÔÖ ¹­Ù Ó º º º º º º º º º º º º º º                 ¾
              º½¼º½¿º ÑÔÙ           ÔÖ ¹­Ù Ó Á Ç º º º º º º º º º º º º º º º º º º º
              º½¼º½¿º ÑÔÙ           ÔÖ ¹­Ù Ó ÓÒ Ñ ÝÓÖ ×Ø Ò º º º º º º º º º º
              º½¼º½¿º ÑÔÙ           ÔÖ ¹­Ù Ó ÓÒ ÓÐ Ð ØÓÖ º º º º º º º º º º º º             ¾
              º½¼º½¿º½¼ Ð ÓÖ ØÑÓ Ò Ö Ó ÑÔÙ                   ÔÖ ¹­Ù Ó ÔÓÖ Ö Ó× º º º º
              º½¼º½¿º½½ ÓÒ ÐÙ× ÓÒ ×Ó Ö Ð ÓÖ ØÑÓ× ÔÖ ¹­Ù Ó º º º º º º º º º º º              ¼½
       º½¼º½ Ð ÙÐÓ Ð ÓÖØ Ñ Ò ÑÓ º º º º º º º º º º º º º º º º º º º º º º º º              ¼½
       º½¼º½ ÙÑ ÒØÓ Ó ×Ñ ÒÙ ÓÒ ­Ù Ó ÙÒ Ö º º º º º º º º º º º º º º                         ¼
  º½½ Ê Ù ÓÒ × Ð ÔÖÓ Ð Ñ Ð ­Ù Ó Ñ Ü ÑÓ º º º º º º º º º º º º º º º º º º º                 ¼
       º½½º½ ÐÙ Ó Ñ Ü ÑÓ Ò Ö × ÒÓ¹ Ö × º º º º º º º º º º º º º º º º º º º                 ¼
       º½½º¾ Ô           × Ò ÒÓ Ó× º º º º º º º º º º º º º º º º º º º º º º º º º º       ¼
       º½½º¿ ÐÙ Ó Ö Ð Þ Ð º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º        ½¼
       º½½º Å Ü ÑÓ ÑÔ Ö Ñ ÒØÓ Ô ÖØ Ó º º º º º º º º º º º º º º º º º º º                   ½½
              º½½º º½ ÐÙ Ó Ñ Ü ÑÓ Ý ÑÔ Ö Ñ ÒØÓ Ô ÖØ Ó º º º º º º º º º                      ½¿
              º½½º º¾ Ò Ð × × Ð ÑÔ Ö Ñ ÒØÓ Ô ÖØ Ó ÔÓÖ ­Ù Ó Ñ Ü ÑÓ º º                        ½
              º½½º º¿ Ð ÙÐÓ Ð ¹Ô ÖØ ÓÒ º º º º º º º º º º º º º º º º º º º                 ½
              º½½º º ÓÒרÖÙ ÓÒ Ð Ö Ô ÖØ Ø º º º º º º º º º º º º º º º                      ½
              º½½º º ÜØÖ ÓÒ Ð ÑÔ Ö Ñ ÒØÓ Ð Ö Ñ Ü Ñ Þ                                 ººº     ½
              º½½º º ÁÑÔÐ ÒØ ÓÒ ¬Ò Ð Ð ÑÔ Ö Ñ ÒØÓ                            Ö ÒÐ
                       Ñ ÜÑ º º º º º º º º º º º º º º º º º º º º º º º º º º º º º        ½
       º½½º Ö ÙÐ ÓÒ × º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º          ½
       º½½º ÓÒ Ø Ú               Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º º º    ¾¼
              º½½º º½ Ð Ø ÓÖ Ñ Å Ò Ö º º º º º º º º º º º º º º º º º º º º º               ¾½
              º½½º º¾ Ð ÙÐÓ Ke(G) º º º º º º º º º º º º º º º º º º º º º º º              ¾½
              º½½º º¿ ÁÑÔÐ ÒØ ÓÒ Ð Ð ÓÖ ØÑÓ                 Ð ÙÐÓ Ke(G) º º º º º º          ¾¾
              º½½º º Ò Ð × × Ð Ð ÓÖ ØÑÓ º½¼ º º º º º º º º º º º º º º º º º º              ¾
       º½½º     Ð ÙÐÓ Kv(e) º º º º º º º º º º º º º º º º º º º º º º º º º º º º º        ¾
  º½¾ ÐÙ Ó× Óר Ñ Ò ÑÓ º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º           ¾
       º½¾º½ Ð Ì Net Max Flow Min Cost<TNode,TArc,T> º º º º º º º º º º                     ¿½
              º½¾º½º½       ×Ó Ð Óר ÙÒ Ö Ó º º º º º º º º º º º º º º º º º º              ¿¾
       º½¾º¾ Ð ÓÖ ØÑÓ× Ñ Ü ÑÓ ­Ù Ó ÓÒ Óר Ñ Ò ÑÓ Ñ ÒØ Ð Ñ Ò ÓÒ
                   ÐÓ× º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º   ¿¿
              º½¾º¾º½ Ð Ñ Ò ÓÒ              ÐÓ× ÓÒ ­Ù Ó Ñ Ü ÑÓ Ò Ð º º º º º º º             ¿¿
              º½¾º¾º¾ Ð Ñ Ò ÓÒ              ÐÓ× Ñ ÒØ ×ÙÔÖ ¹ Ö Ó Ò Ø ÚÓ º º º º               ¿¿
       º½¾º¿ Ò Ð × × ÐÓ× Ð ÓÖ ØÑÓ× × Ó× Ò Ð Ñ Ò ÓÒ                         ÐÓ× Ò Ø ÚÓ×       ¿
       º½¾º ÈÖÓ Ð Ñ × ÕÙ × Ö Ù Ò ÒÙÒ Ó× ­Ù Ó Ñ Ü ÑÓ Óר
             Ñ Ò ÑÓ º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º      ¿
xxiv                                                                        CONTENIDO



                º½¾º º½ ÌÖ Ò×ÔÓÖØ º º º º º º º º º º º º º º º º º º º º º º º º      º   º   º    ¿
                º½¾º º¾ ÌÖ × ÓÖ Ó º º º º º º º º º º º º º º º º º º º º º º º º      º   º   º        ¿
                º½¾º º¿ × Ò ÓÒ ØÖ Ó× º º º º º º º º º º º º º º º º º                 º   º   º
                º½¾º º     Ñ ÒÓ Ñ Ò ÑÓ º º º º º º º º º º º º º º º º º º º º º       º   º   º
                º½¾º º ÈÐ Ò ¬ ÓÒ º º º º º º º º º º º º º º º º º º º º º º º         º   º   º
    º½¿ ÈÖÓ Ö Ñ ÓÒ Ð Ò Ð º º º º º º º º º º º º º º º º º º º º º º º º º º º º       º   º   º        ¼
         º½¿º½ ÓÖÑ ×Ø Ò Ö ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð º º º º º º º º º º º º º º                 º   º   º        ¾
         º½¿º¾ Å Ò Ñ Þ ÓÒ¸ ÒÓ Ñ Ü Ñ Þ ÓÒ¸ Ð ÙÒ ÓÒ Ó Ø ÚÓ º º º º º                     º   º   º        ¾
         º½¿º¿ Î Ö Ð × ÓÒ Ö ×ØÖ ÓÒ × Ò Ø Ú × º º º º º º º º º º º º º º º             º   º   º        ¿
                º½¿º¿º½ Ê ×ØÖ ÓÒ ×          ÙÐ       ºººººººººººººººº                  º   º   º        ¿
         º½¿º Ê ×ØÖ ÓÒ × Ñ ÝÓÖ Ó Ù Ð º º º º º º º º º º º º º º º º º º º º           º   º   º        ¿
         º½¿º ÍÒ ÑÔÐÓ º º º º º º º º º º º º º º º º º º º º º º º º º º º º º        º   º   º        ¿
         º½¿º ÓÖÑ ÓÐ                ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð º º º º º º º º º º º º º         º   º   º
         º½¿º Ð Ñ ØÓ Ó × ÑÔÐ Ü º º º º º º º º º º º º º º º º º º º º º º º º º       º   º   º
                º½¿º º½ ×ÕÙ Ñ Ò Ö Ð º º º º º º º º º º º º º º º º º º º º º          º   º   º
                º½¿º º¾ ¬Ò ÓÒ Ð ÙÒ ÓÒ Ó Ø ÚÓ º º º º º º º º º º º º                   º   º   º
                º½¿º º¿ ¬Ò ÓÒ Ð × Ö ×ØÖ ÓÒ × º º º º º º º º º º º º º º               º   º   º
                º½¿º º Ä ×ØÖÙ ØÙÖ            ØÓ× º º º º º º º º º º º º º º º º º     º   º   º
                º½¿º º Ë Ð ÓÒ Ð Ô ÚÓØ º º º º º º º º º º º º º º º º º º º            º   º   º
                º½¿º º È ÚÓØ Ó º º º º º º º º º º º º º º º º º º º º º º º º º º     º   º   º        ¼
         º½¿º ÓÒ ÐÙ× ÓÒ ×Ó Ö Ð ÔÖÓ Ö Ñ ÓÒ Ð Ò Ð º º º º º º º º º º º º º              º   º   º        ¾
    º½ Ê × ­Ù Ó Ý ÔÖÓ Ö Ñ ÓÒ Ð Ò Ð º º º º º º º º º º º º º º º º º º º               º   º   º        ¾
         º½ º½ ÓÒÚ Ö× ÓÒ ÙÒ Ö            Ô Ø            Óר × ÙÒ ÔÖÓ Ö Ñ Ð Ò           Ð   º   º        ¾
         º½ º¾ Ê × Ò Ö Ð Þ × º º º º º º º º º º º º º º º º º º º º º º º º           º   º   º        ¿
         º½ º¿ Ô          × ÓØ × º º º º º º º º º º º º º º º º º º º º º º º         º   º   º
         º½ º Ê × ÓÒ Ö ×ØÖ ÓÒ × Ð Ø Ö Ð × º º º º º º º º º º º º º º º º º            º   º   º
         º½ º Ê × ÑÙÐØ ¹­Ù Ó º º º º º º º º º º º º º º º º º º º º º º º º º º       º   º   º
         º½ º Ê × ÔÖÓ × Ñ ÒØÓ º º º º º º º º º º º º º º º º º º º º º º              º   º   º
                º½ º º½      Ò × ÔÖÓ Ù ÓÒ º º º º º º º º º º º º º º º º º            º   º   º
    º½ Ð × ÑÔÐ Ü Ô Ö Ö × ­Ù Ó º º º º º º º º º º º º º º º º º º º º º º º            º   º   º
         º½ º½ ÓÒ ÐÙ× ÓÒ ×Ó Ö Ð ÔÖÓ Ð Ñ Ð ­Ù Ó Ñ Ü ÑÓ Óר Ñ Ò ÑÓ                       º   º   º
    º½ ÆÓØ × Ð Ó Ö ¬ × º º º º º º º º º º º º º º º º º º º º º º º º º º º º º       º   º   º
    º½      Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º   º   º   º        ½
       ÐÓ Ö    ºººººººººººººººººººººººººººººººººººº                                    º   º   º
´
Indice de identificadores                                                                           893
Cap´
   ıtulo 1

Abstracci´n de datos
         o

   ר Ø ÜØÓ ÓÒ ÖÒ Ð × ÒÓ ÑÔÐ ÒØ ÓÒ                  רÖÙ ØÙÖ ×      ØÓ× Ý Ð ÓÖ ØÑÓ× ÕÙ
 ÒרÖÙÑ ÒØ Ò ×ÓÐÙ ÓÒ × ÔÖÓ Ð Ñ × Ñ ÒØ ÔÖÓ Ö Ñ × ÓÑÔÙØ ÓÖº
     ÍÒ Ð ÓÖ ØÑÓ × ÙÒ × Ù Ò ¬Ò Ø           ÒרÖÙ ÓÒ × ÕÙ ÓÑ Ø Ð ÓÒ× Ù ÓÒ ÙÒ
¬Òº Í× ÑÓ× Ð ÓÖ ØÑÓ× Ò Ú Ö×Ó× ÓÒØ ÜØÓ× Ð Ú ÔÓÖ ÑÔÐÓ¸ Ù Ò Ó ÔÖ Ô Ö ÑÓ×
ÙÒ ÔÐ ØÓ ÓÑ × ÙÒ Ð ÙÒ Ö Ø º Ä ÙÐØÙÖ ÒÓ× Ò ÙÐ Ó Ð ÙÒÓ× Ð ÓÖ ØÑÓ× ¸
  ÙÐØÙÖ Ð ×¸ ÒÓ Ò ØÙÖ Ð ×½ ¸ Ô Ö × ÒÚÓÐÚ ÖÒÓ× ×Ó ÐÑ ÒØ ÔÓÖ ÑÔÐÓ׸ Ð Ð ÓÖ ØÑÓ
  ÓÒ Ù Ö ÙÒ ÙØÓÑÓÚ Ð Ó Ð Ð ÓÖ ØÑÓ Ô Ö ÖÙÞ Ö ÙÒ ÐÐ º Ò Ñ Ó× ÑÔÐÓ׸ Ð ¬Ò ÕÙ
× ÔÐ ÒØ × ÖÖ Ö ÙÒ × Ø Óº
     Ë ÙÒ ÃÒÙØ          ¸ Ð Ø ÖÑ ÒÓ Ð ÓÖ ØÑÓ ÔÖÓÚ Ò            Ð ÒÓÑ Ö       Ð Ò ×ØÖ Ð
Ñ Ø Ñ Ø Ó Ð¹Ã Û Ö ÞÑ ¸ Ð È Ö× ¸ Ô ÖØ Ð ØÙ Ð ÁÖ Ò¸ Ö ÓÒ Ð ÔÐ Ò Ø ÑÙÝ
  ÑÒÞ            × Ö ÓÖÖ        ÐÑÔº         Ð¹Ã Û Ö ÞÑ Ø Ñ Ò ÔÖÓÚ Ò Ð Ô Ð Ö
    Ð Ö ¸ ÓÑ Ò Ó × Ù ÖØÓ ÔÓÖ Ú Þ ÔÖ Ñ Ö Ò Ð ØÙ Ð ÒÚ Ó Ý × ×Ø Ó ÁÖ Õº
     È Ö Ð ÓÒ× Ù ÓÒ ÙÒ ¬Ò × ÑÔÐ Ò Ñ Ó× º Ò Ð ×Ó ÙÒ ÔÐ ØÓ¸ ÐÓ× Ñ Ó×
ÕÙ × ÙØ Ð Þ Ò ×ÓÒ ÐÓ× ÒרÖÙÑ ÒØÓ×         Ó Ò Ò Ö ÒØ × Ð Ó Ò ÖÓ¸ ÕÙ Ò ÔÙ
 ÒØ ÖÔÖ Ø Ö× Ø Ñ Ò ÓÑÓ ÙÒ Ñ Ó¸ ÓÒ Ù ¸ Ò ÙÒ ÓÖ Ò ×Ô ¬ Ó¸ ÐÓ× Ò Ö ÒØ ×
mediante ÐÓ× ÒרÖÙÑ ÒØÓ׺ Ä × Ù Ò               Ù ÓÒ¸ Ó × ¸ Ð Ð ÓÖ ØÑÓ¸ × ÙÒ Ñ ÒØ Ð
Ô Ö ÓÒ× Ù Ö Ð ÔÐ ØÓ Ò Ù ×Ø ÓÒº ÍÒ ÐØ Ö ÓÒ Ð ÓÖ Ò ÔÓ× Ð Ñ ÒØ                   ÖÖ Ö ÙÒ
  ÐØ Ö ÓÒ ×Ó Ö Ð × ÓÖ Ð ÔÐ ØÓº
       ÙÖ ÒØ Ð ÔÖ Ô Ö ÓÒ ÙÒ ÔÐ ØÓ¸ Ð Ó Ò ÖÓ Ö ÕÙ Ö Ô Ö Ö Ý Ö ÓÖ Ö Ð × Ù Ò
         Ù ÓÒº Ð Ö ÕÙ Ö ¸ ÔÓÖ ÑÔÐÓ¸ ×Ó Ö Ö Ð ÙÒÓ× Ð ÒÓ× ÒØ × Ñ Þ Ð ÖÐÓ× ÓÒ Ð
    ÖÒ º Ë ÙÒ Ð ÜÔ Ö Ò Ý Ð ÓÑÔÐ              ¸ × ÔÓ× Ð ÕÙ Ð Ó Ò ÖÓ ÐÐ Ú ÒÓØ × ÕÙ
Ñ ÑÓÖ Ò Ð ×Ø Ó ÔÖ Ô Ö ÓÒ ÔÓÖ ÑÔÐÓ¸ ÒÓØ Ö Ð ÓÖ Ò ÕÙ ÓÑ ÒÞÓ ÓÖÒ Öº
   Ò ØÓ Ó ÑÓÑ ÒØÓ¸ ÓÒ ÒÓØ × Ó × Ò ÐР׸ Ð Ó Ò ÖÓ Ö ÕÙ Ö Ø Ò Ö ÓÒ× Ò              Ð ×Ø Ó
  Ò Ð Ù Ð × Ù Ð ÔÖ Ô Ö ÓÒ Ö ×Ô ØÓ ×Ù Ö Ø º È Ö ÐÐÓ¸ Ð × × ÖÚ ×Ù Ñ ÑÓÖ º
       Ò Ð ×Ó ÙÒ ÔÖÓ Ö Ñ ¸ Ð ÓÑÔÙØ ÓÖ ÙÒ                 Ó Ò ÖÓ¸ Ð Ù Ð ÙØ ¬ ÐÑ ÒØ
Ð × Ö Ø × ÕÙ × Ð ÔÖÓÔÓÖ ÓÒ Òº Ð ÓÑÔÙØ ÓÖ ×¸ ÒØÓÒ ×¸ ÙÒ ÙØÓÖ ÕÙ ÓÖ Ò Þ
Ý Ù× Ð ÙÒÓ× Ñ Ó× Ô Ö Ð ÒÞ Ö Ð ×ÓÐÙ ÓÒ                 Ð ÙÒ ÔÖÓ Ð Ñ ¸ × ÙÒ Ð ÙÒ Ö Ø
ÐÐ Ñ       ÔÖÓ Ö Ñ Ý ÕÙ Ö Ù Ö ×Ø Ó×              Ð ÙÐÓ× Ñ ÒØ ÙÒ Ñ ÑÓÖ º
       Ô ÖØ Ð È͸ ÕÙ Ò ÙÒ            Ó Ò ÖÓ¸ Ð ÓÑÔÙØ ÓÖ × Ú Ð ÙÒ Ñ Ó ÙÒ ¹
Ñ ÒØ Ð Ð Ñ ÑÓÖ º ÔÓÖ × ¸ Ð Ñ ÑÓÖ Ò ÖÙØÓ × ÙÒ × Ù Ò                       ÖÓ× Ý ÙÒÓ× ÙÝÓ
× ÒØ Ó ÐÓ ÑÔ ÖØ Ð ÔÖÓ Ö Ñ ÓÖ Ò ÓÖÑ                 ØÓ× º
  ½
     Ò ×ØÓ× Ø ÑÔÓ× ×ØÓ ÒÓ × Ø Ò Ó Ú Óº ÁÒ Ö Ð Ñ ÒØ ¸ Ö Ò Ô ÖØ   Ð ÙÐØÙÖ × ÓÒ ÙÒ   ÓÒ Ð
Ò ØÙÖ º


                                            ½
2                                                   Cap´
                                                           ıtulo 1. Abstracci´n de datos
                                                                             o



           Ù ÐÕÙ Ö ÔÖÓ Ö Ñ ÕÙ ÓÔ Ö Ò ÙÒ ÓÑÔÙØ ÓÖ ÔÙ                  Ú Ö× Ò Ó× Ô ÖØ × Ð
    × ÙÒ           ÒרÖÙ ÓÒ ×         Ù ÓÒ Ý ÐÓ× ØÓ׺ Ä × ÒרÖÙ ÓÒ × ×ÓÒ Ö ×ÙÐØ Ó
     ÕÙ ÐÐÓ ÕÙ × Ö ÑÓ× ÓÑÓ Ó Ó Ù ÒØ º Ò Ó × ÓÒ ×¸ Ð × ÒרÖÙ ÓÒ × ÔÙ Ò Ò Ö¹
     Ö× ÙÖ ÒØ Ð           Ù ÓÒ Ð ÔÖÓ Ö Ñ º ÄÓ× ØÓ× Ö ÔÖ × ÒØ Ò Ð ×Ø Ó               Ð ÙÐÓ Ò
     Ð ÙÒ ÑÓÑ ÒØÓ Ð Ø ÑÔÓ             Ù ÓÒº
        Ä ÔÐ Ö           ØÓ ÔÖÓÚ Ò Ð Ð Ø Ò “datum”¸ ÕÙ × Ð Ô ÖØ Ô Ó Ô × Ó
       Ó ´ Öµº ØÓ ÓÒÒÓØ ¸ Ô٠׸ Ð Ó ÕÙ Ù                Ó Ò Ð Ô × Ó Ý ÕÙ ÒÓ× ÒØ Ö ×
    Ö ÓÖ Ö × × Ð × ÒØ Ó ÕÙ × Ñ ÑÓÖ Þ Óº Ò Ð ×Ó Ð ÔÖÓ Ö Ñ ÓÒ¸ ÙÒ ØÓ
    Ö Ù Ö ÙÒ Ô ÖØ Ð ×Ø Ó                Ù ÓÒ Ð ÔÖÓ Ö Ñ º
           Ð Ñ Ò ÑÓ Ò Ú Ð ÓÖ Ò Þ ÓÒ ÙÒ ØÓ × ×Ù “tipo”º ÍÒ Ø ÔÓ                  ØÓ ¬Ò ÙÒ
     ÓÒ ÙÒØÓ ÓÑÔÙ ×ØÓ ÔÓÖ ØÓ Ó× ÐÓ× Ú ÐÓÖ × ÕÙ ÔÙ         ÕÙ Ö Ö ÙÒ Òר Ò        Ð ØÓº
        ÍÒ Ø ÔÓ        ØÓ ÔÙ    ÓÒ ÓÖÑ Ö× ÔÓÖ Ú Ö Ó× Ø ÔÓ×        ØÓ׺ Ò ×Ø ×Ó¸ ÐÓ Ð × ¬¹
       ÑÓ× Ò ØÓ רÖÙ ØÙÖ Ó Ó ×ØÖÙ ØÙÖ              ØÓ× º Ò Ð ÙÒÓ× ×Ó׸ ÐÓ× ØÓ× ÔÙ Ò
    × Ö Ö ÙÖ× ÚÓ× ´Ö ÙÖÖ ÒØ ×¾ µ × Ö¸ × ÙÒ Ð Ø ÔÓ          ØÓ¸ × Ö ÙÖÖ Ò × Ñ ×ÑÓ× Ó ÒØÖ
     ÐÐÓ׺
           Ð ÙÒÓ× ÑÔÐÓ× Ò C++ ÔÓ Ö Ò Ö ÐÙÞ ×Ø ×ÙÒØÓº
        È Ö Ö ÔÖ × ÒØ Ö ÒÙÑ ÖÓ× ÒØ ÖÓ׸ × ÙØ Ð Þ Ð Ø ÔÓ          ØÓ int¸ Ð Ù Ð Ò ÕÙ ×Ù
    Ú ÐÓÖ Ô ÖØ Ò Ð ÓÒ ÙÒØÓ Zº Ò ×Ø ×Ó ÒÓ ×               Ò          Ö      ÓÑÓ × Ö ÔÖ × ÒØ
     Ð Ø ÔÓ int Ò Ð Ñ ÑÓÖ         ÙÒ ÓÑÔÙØ ÓÖ Ò ÔÙ Ö ØÖ Ø Ö×                19¸    937 Ó
    2535301200456458802993406410049¸ ÒØÖ Ò¬Ò ØÓ× Ú ÐÓÖ × ÔÓ× Ð ×º
        È Ö Ö ÔÖ × ÒØ Ö ÒÙÑ ÖÓ× Ö Ð ×¸ ÕÙ Ô ÖØ Ò Ò R¸ Ù× ÑÓ× Ð Ø ÔÓ floatº Ì ÔÓ
    Ñ × ÒØ Ö × ÒØ ÕÙ Ð ÒØ Ö ÓÖ ÔÓÖÕÙ ØÖ ×ÐÙ Ô ÖØ             ×Ù ÑÔÐ ÒØ ÓÒ Ò Ð Ñ ÑÓÖ
        ÙÒ ÓÑÔÙØ ÓÖ Ù Ò Ó ÜÔÖ × ¸ Ñ ÒØ Ð ÒÓÑ Ö float¸ ÕÙ Ð Ö ÔÖ × ÒØ ÓÒ Ð
    ÒÙÑ ÖÓ × Ò ÔÙÒØÓ ­ÓØ ÒØ × Ö¸ ר רÖÙ ØÙÖ                 Ò ØÖ × ÑÔÓ× ÓÖÑ × Ñ Ð Ö
      Ð × Ù ÒØ
                         0     00001000         001011110010110001001010

                        Ë ÒÓ     ÜÔÓÒ ÒØ           È ÖØ Ö      ÓÒ Ð
      Ð × ÒØ Ó ×Ø רÖÙ ØÙÖ × ØÙ Ö Ö Ô Ñ ÒØ ×ÙÑ × Ñ ÒØ Ùר Ð ÜÔÓÒ ÒØ
    Ý Ð Ô ÖØ Ö ÓÒ Ðº ÙÒÕÙ ÒÓ ÓÒÓ ÑÓ× Ð Ø Ñ ÒÓ ÐÓ× ÑÔÓ× ÒØ Ö ÓÖ ×¸ Ð
     ÓÒÓ Ñ ÒØÓ Ð ×ØÖÙ ØÙÖ Ý Ð Ñ Ò Ö Ñ Ò ÔÙÐ ÖÐ ÒÓ× Ð ÖØ ×Ó Ö Ð Ð Ö
     Ò Ú Ø Ð ÖÖÓÖ Ö ÓÒ Ó ÕÙ Ó ÙÖÖ Ù Ò Ó ØÖ          ÑÓ× ÓÒ Ö ØÑ Ø ­ÓØ ÒØ º
         È Ö ÐÙ×ØÖ Ö ÙÒ ØÓ Ö ÙÖÖ ÒØ ÒÓ× Ú Ð Ö ÑÓ× Ð Ø ÔÓ Ð Ñ ÒØÓ × Ù Ò ¾ ¸
     ÙÝ ×Ô ¬ ÓÒ Ò C++ ÔÙ ÔÐ ÒØ Ö× ÓÑÓ × Ù
¾      Ð Ñ ÒØÓ × Ù Ò ¾ ≡
        struct Elemento
        {
          int dato;
          Elemento * siguiente_elemento;
        };
         Ð Ñ ÒØÓ × Ù Ò ¾ ÑÓ Ð Þ ÙÒ Ð Ñ ÒØÓ ÒØ ÖÓ Ô ÖØ Ò ÒØ ÙÒ × Ù Ò º
    ÆÓØ ÑÓ× ÕÙ Ð ØÖ ÙØÓ siguiente elemento × Ö ¬ Ö ÙÒ struct Elemento Ò
    Ð Ö ÓÒ Ò Ñ ÑÓÖ Ð × Ù ÒØ Ð Ñ ÒØÓ Ò Ð × Ù Ò º
        Ò ×Ô ÒÓи × ÓÑÓ Ò Ð Ñ ÝÓÖ
        ¾
                                            Ð × Ð Ò Ù × ÖÓÑ Ò ×¸ Ü ×Ø Ð Ø ÖÑ ÒÓ Ö ÙÖÖ Ö ¸ Р٠и
    × ÙÒ ×Ù Ö Þ Ð Ø Ò Ö ÙÖÖÓ¸ ÓÒÒÓØ ¸ ÚÓÐÚ Ö ¸ Ö Ö × Ö º Ò Ò Ð × Ð Ö Þ × Ð Ñ ×Ñ ¸ Ô ÖÓ ×      Ò
    Ö ÙÖ×Ù׸ ÕÙ × Ò ¬   ÚÙ ÐØ ¸ Ö ØÓÖÒÓ º Ò ×Ø Ø ÜØÓ × ÔÖ Ö Ò        Ö ÙÖ× ÓÒ Ò ÐÙ Ö Ö ÙÖÖ Ò º
1.1. Especificaciones de datos                                                     3



       Ú Ö×Ó× ÒØ Ö × × Ò Ò Ò Ð × ÒÓ ÙÒ ×ØÖÙ ØÙÖ                     ØÓ׺ ÒØÖ ÐÓ× Ñ ×
Ø Ô Ó× ÔÓ ÑÓ× ×Ø Ö Ð ÓÑÔÖ Ò× ÓÒ Ý Ñ Ò ÔÙÐ ÓÒ Ð ÔÖÓ Ö Ñ ÔÓÖ Ô ÖØ Ð
ÔÖÓ Ö Ñ ÓÖ¸ Ð × ÑÔ ÒÓ Ý Ð            ÔØ ÓÒ ÙÒ Ð ÓÖ ØÑÓ Ó ÓÒ ÔØÓ Ô ÖØ ÙÐ Öº Ò Ð
    ÑÔÐÓ Ð Ø ÔÓ float¸ Ý Ó× Ö Ø Ö ×Ø × × Ú ×º Ä ÔÖ Ñ Ö × ÕÙ Ð × ÓÔ Ö ÓÒ ×
 Ö ØÑ Ø × ×ÓÒ ÑÙÝ Ö Ô ×º              Ó¸ × ÑÔÖ ØÓÑ Ò Ø ÑÔÓ ÓÒר ÒØ Ò Ô Ò ÒØ
   Ð Ú ÐÓÖ Ô ÖØ ÙÐ Ö Ð ØÓº Ä × ÙÒ             Ö Ø Ö ×Ø ÓÒ ÖÒ Ð ×Ô Ó × Ö¸
         ØÓ Ò ÔÙÒØÓ ­ÓØ ÒØ × ÑÔÖ Ó ÙÔ Ð Ñ ×Ñ ÒØ                 ×Ô Ó¸ Ù ×Ø ÓÒ ÕÙ ÒÓ
×Ù Ö × Ù× Ö ÑÓ× Ö ØÑ Ø Ö ØÖ Ö º
     È Ö ÐÓ× Ø ÔÓ×      ØÓ× ÕÙ        ÑÓ×       ÑÔÐ ¬ Ö ´int Ý floatµ¸ ×ÔÓÒ ÑÓ×
ÙÒ ÓÒ Ó ÙÐØÙÖ Ð¸ Ñ Ø Ñ Ø Ó Ý ÔÖÓ Ö Ñ ÓÒ¸ ÕÙ ÒÓ× Ô ÖÑ Ø × Ò Ð ÖÐÓ× Ý ÓÑÔÖ Ò¹
   ÖÐÓ× × Ò Ò ×           Ø ÐÐ Ö Ñ ÒÙ Ó× Ñ ÒØ Ò ÕÙ ÓÒ× ×Ø Òº Ë ÑÓ׸ × Ò Ø Ò Ö ÕÙ
 Ò ÖÐÓ ÜÔÐ Ø Ñ ÒØ ¸ ÕÙ Ü ×Ø Ò Ð × ÓÔ Ö ÓÒ × Ö ØÑ Ø × ØÖ ÓÒ Ð × ×ÙÑ ¸
Ö ×Ø ¸ ÔÖÓ Ù ØÓ Ý Ú × ÓÒ¸ × ÓÑÓ ÕÙ          Ò Ý Ù Ð × ×ÓÒ ×Ù× Ö ×ÙÐØ Ó׺

1.1    Especificaciones de datos
ËÙÔÓÒ ÑÓ× ÕÙ ÙÒ Ó Ò ÖÓ ÓÒ×ÙÑ Ó × × Ö Ö ÙÒ                  ×Ù× Ö Ø × Ô Ö ÚÙй
   ÖÐ ÓØÖÓ× Ó Ò ÖÓ׺ Ò ×Ø × ØÙ ÓÒ¸ × ÙÒ Ð ÓÖÔÙ× Ó Ò Ø ÚÓ ×Ù ÜÔ Ö Ò ¸ Ð
 Ó Ò ÖÓ ×ÙÑ ÕÙ ×Ù× Ð ØÓÖ × ÔÓ× Ò ÙÒ Ð Ò Ù ÓÑÙÒ ÕÙ Ð × Ð Ø Ö ÒØ Ò Ö Ð ×
 ÒרÖÙ ÓÒ × ×Ù Ö Ø º ÈÓÖ ÑÔÐÓ¸ × Ö ÕÙ Ö ÕÙ Ð Ó Ò ÖÓ Ý ×Ù× Ð ØÓÖ × Ø Ò Ò
 Ð Ñ ×ÑÓ ÓÒ ÔØÓ ÐÓ ÕÙ × ÙÒ ÓÐÐ º
      Ò ÐÑÖÓ        × ÐÒÙ       ÓÑÙÒ¸ Ð Ö Ø         × Ö ÔÖ × ÒÓ         ÓÒØ Ò Ö
 Ñ Ù         × ÕÙ ÐÓÕÙ Ò Ð ÙØ ÒØ º         Ñ ×¸      × Ö ÓÑÔÐ Ø Ò Ð × ÒØ Ó
ÕÙ Ð ÙØ ÒØ ÔÖ Ô Ö ÔÐ Ò Ñ ÒØ Ð ÔÐ ØÓ Ò Ù ×Ø ÓÒº
      Ò Ð Ô Ö Ô ÓÒ Ð ÔÖ Ò Þ ÔÖÓ Ö Ñ ÓÒ Ü ×Ø ÙÒ           Ö Ò × Ò Ð ÒØÖ Ð ¹
ÓÖ Ö ÙÒ ÔÐ ØÓ Ó Ò Ý ÙØ Ö ÙÒ ÔÖÓ Ö Ñ º Ò Ó Ò × ÓÔ Ö ×Ó Ö Ó× × ÓÒ Ö Ø ×
Ô Ö Ð Ô Ö Ô ÓÒ ÙÑ Ò º Ò ÔÖÓ Ö Ñ ÓÒ Ð ÓÑÔÙØ ÓÖ ÓÔ Ö ×Ó Ö ØÓ× ÓÒ Ö ¹
ØÓ× Ò ×Ù Ñ ÑÓÖ ¸ Ô ÖÓ ×ØÖ ØÓ× Ô Ö ÒÙ ×ØÖ Ô Ö Ô ÓÒº ÈÖ ÙÒØ ÑÓ×ÒÓ׸ Ü ×Ø ÙÒ
ÒÙÑ ÖÓ Ü ×Ø ÙÒ ÖÖ ÐÓ º Ò ÒÙ ×ØÖ Ñ ÒØ ¸ ÙÒ ÖÖ ÐÓ ÓÒר ØÙÝ ÙÒ ×ØÖ ÓÒ
ÕÙ ÒÓ × ÔØ ÓÒ ÒÙ ×ØÖ Ô Ö Ô ÓÒ × Ò×ÓÖ Ðº Ò Ð ÓÑÔÙØ ÓÖ ÒÓ Ø Ò × ÒØ Ó Ð
   ×ØÖ ÓÒ ÖÖ ÐÓ¸ ÔÙ × ×Ø ÒÓ ÒØ Ò ÐÓ ÕÙ × ÙÒ ÒÙÑ ÖÓ Ó ÖÖ ÐÓº Ò Ð ×Ó Ð
ÔÖÓ Ö Ñ ÓÒ¸ × ÓÑÓ Ò ÓØÖÓ× ÓÑ Ò Ó× Ö Ú Ó× Ð Ñ Ø Ñ Ø ¸ ÙÒ ÒÙÑ ÖÓ Ó ÙÒ
   ÖÖ ÐÓ ×ÓÒ ÓÒ ÔØÓ× ×ØÖ ØÓ× ÕÙ ÓÒ ÓÖÑ Ò ÙÒ Ð Ò Ù ÓÑÙÒ Ô Ö ÓÑÙÒ ÖÐÓ×
Ý Ô ÖÑ Ø Ö Ð ÓÒרÖÙ ÓÒ Ñ × ÓÒ ÔØÓ׺
      ÒØÖ ÔÖÓ Ö Ñ ÓÖ ×¸ × ÓÑÓ Ò Ð Ö ×ØÓ Ð × ÔÖ Ø ×¸ × ÑÙÝ ÑÔÓÖØ ÒØ ×ÔÓÒ Ö
    ÙÒ ÓÖÔÙ× ÓÑÙÒ¸ ×Ó Ö Ð Ñ Ò Ö       ×ØÖ Ö¸ ÕÙ Ô ÖÑ Ø Ð ÓÑÙÒ ÓÒ Ñ Ò Ö
  ÓÑÓ Ò º
       ÓÒ× Ö ÑÓ× ÙÒ × ØÙ ÓÒ Ò Ð ÕÙ × ÑÓ× ×ÔÓÒ Ö ÙÒ ÒÙ ÚÓ Ø ÔÓ               ØÓº
ÈÐ ÒØ ÑÓ×ÒÓ× Ó× Ð × × ÔÖ ÙÒØ × Ò Ð × Ù ÒØ ÓÖ Ò
    ½º Ƚ Ù Ð × ×Ù ¬Ò Ó¸ Ó ÓØÖ Ñ Ò Ö ¸ Ô Ö ÕÙ ÔÙ × ÖÚ Ö
    ¾º Ⱦ ÓÑÓ × ÔÙ        ¬Ò Ö ÕÙ Ö ÔÖ × ÒØ Ð ØÓ
Ä ÔÖ Ñ Ö ÔÖ ÙÒØ ÒÓ× Ò          Ð Ð×      ÔÖÓ Ð Ñ Ô Ö Ð Ù Ð Ð Ø ÔÓ         ØÓ ×
  Ö ÙÒ× Ö ÓÑÓ Ô ÖØ Ð ×ÓÐÙ ÓÒº Ë ×ØÓ ÒÓ ×Ø ¬Ò Ó¸ ÒØÓÒ × ÒÓ Ø Ò Ò Ò ÙÒ
× ÒØ Ó ÓÒ× Ö Ö Ð Ø ÔÓ        ØÓº Ä × ÙÒ ÔÖ ÙÒØ ÒÓ× ÜÔÖ × ÕÙ × Ð Ø ÔÓ
4                                                  Cap´
                                                      ıtulo 1. Abstracci´n de datos
                                                                        o



   ØÓ¸ Ô ÖÓ × qu´-es Ô Ò
                e           Ð Ô Ö ÕÙ ×Ø × Ù× º Ë Ø Ò ÑÓ× Ð ÖÓ Ð ¬Ò¸ ÒØÓÒ ×
ÙÒ ØÓ × ¬Ò × ÙÒ Ð × ÓÔ Ö ÓÒ × Ô ÖÑ × Ð × Ý ×Ù× Ö ×ÙÐØ Ó׺
    ÈÓÖ ÑÔÐÓ¸ × ÒÓ× Ò ÓÒØÖ ÑÓ× Ò ÙÒ × ØÙ ÓÒ Ò Ð Ù Ð Ö ÕÙ Ö ÑÓ× Ð ÙÐÓ
Ú Ö Ð ÓÑÔÐ ¸ ÒØÓÒ × × × Ò Ð Ø Ò Ö ÙÒ Ø ÔÓ      ØÓ ÒÙÑ ÖÓ ÓÑÔÐ Ó º ÄÄ Ñ ×
   ÓÑÔÐ Ó       ר Ø ÔÓ Ý ¬Ò ÑÓ×ÐÓ ÓÑÓ ÙÒ ×ÙÑ cr + ci i | cr, ci ∈ R¸ ÓÒ Ð
 Ó ¬ ÒØ cr × ÐÐ Ñ Ó Ô ÖØ Ö Ð √ ci Ô ÖØ Ñ Ò Ö
                                  ݸ                    ר ÙÐØ ÑÓ Ö ÔÖ × ÒØ
ÙÒ Ö ÓÒ Ð ÒÙÑ ÖÓ Ñ Ò Ó −1            ¿º Ð Ù Ð ÕÙ ÓÒ ÐÓ× Ø ÔÓ× ÒØ Ö ÓÖ ×¸ ר
   ¬Ò ÓÒ ×ÙÑ ÕÙ Ð Ð ØÓÖ Ù ÒØ ÓÒ ÙÒ ÙÐØÙÖ Ñ Ø Ñ Ø Ò Ð Ù Ð Ø Ò Ò × ÒØ Ó
ÐÓ× ÒÙÑ ÖÓ× ÓÑÔÐ Ó׺
      ÓÑÓ ÓÔ Ö ÓÒ × ×Ø Ð ÑÓ× Ð ÓÒ×ÙÐØ     Ð Ô ÖØ Ö Ð Ñ Ò Ö ¸ Ö ×Ô Ø Ú ¹
Ñ ÒØ º
1.1.1      Tipo abstracto de dato
À ÑÓ× Ó ÕÙ ÙÒ Ø ÔÓ           ØÓ Ö ÔÖ × ÒØ ÙÒ ÓÒ ÙÒØÓº Ó Ð ÔÖ ×ÙÒ ÓÒ ÙÒ ×
 ÙÐØÙÖ Ð Ñ Ø Ñ Ø ¸ Ð Ù Ð ÓÑÔÖ Ò Ð ÓÒ ÔØÓ ÓÒ ÙÒØÓ¸ Ð Ø ÔÓ ÓÑÔÐ Ó ×
   ¬Ò Ò ØÓÖÒÓ Ð ÒÓ ÓÒ Ñ Ø Ñ Ø           ÒÙÑ ÖÓ ÓÑÔÐ Ó ÕÙ Ð Ö Ò ×Ù ÓÑÔÖ Ò× ÓÒº
    Ó × Ð Ò Ù ¸ Ð ÑÔÐÓ ÒØ Ö ÓÖ × Ø × Ð × ÔÖ ÙÒØ × È½ Ý È¾¸ Ö ×Ô Ø Ú Ñ ÒØ º
Ë ÒÓ ×ÔÙ× Ö ÑÓ× Ð ÓÖÔÙ× Ñ Ø Ñ Ø Ó ÒÙÑ ÖÓ ÓÑÔÐ Ó¸ ÒØÓÒ × ÒÓ× × Ö ÑÙÝ
     Ð ÒØ ÖÔÖ Ø Ö Ð × ÒØ Ó Ð Ø ÔÓ ÓÑÔÐ Ó º
    Ä Ñ Ø Ñ Ø ¸ × ÑÔÖ Ý Ù Ò Ó × Ý Ô × Ó ÔÓÖ ×Ù ÒØÖ Ò Ñ ÒØÓ¸ ¬Ò ÙÒ ÓÖ¹
ÔÙ× Ó Ò Ø ÚÓ¸ ר ÒØ ×ØÖ ØÓ ÔÓÖ ÖØÓ¸ ÕÙ ÒÓ× Ô ÖÑ Ø ¬Ò Ö Ð ÒÙ ÚÓ Ø ÔÓ           ØÓº
Ë ÒÓ× Ö Ñ Ø ÑÓ× Ð ¬Ò ÓÒ Ø ÔÓ              ØÓ¸ ÒØÓÒ ×¸ × ÙÒ Ð Ñ Ø Ñ Ø ¸ ¬Ò Ö ÙÒ
Ø ÔÓ      ØÓ ×ØÖ Ò ¬Ò Ö ÙÒ ÓÒ ÙÒØÓ Ð × Ó× Ñ Ò Ö × ÕÙ Ø Ò Ð Ñ Ø Ñ Ø
ÔÓÖ ÜØ Ò× ÓÒ Ó ÔÓÖ ÓÑÔÖ Ò× ÓÒº ¬Ò Ö ÙÒ ÓÒ ÙÒØÓ ÔÓÖ ÜØ Ò× ÓÒ × ÑÙÝ Ó Ø ÚÓ¸
Ô ÖÓ¸ Ø Ñ Ò¸ ÑÙÝ Ö ÙÓ Ý¸ Ò ÑÙ Ó× ×Ó׸ ÑÔÓ× Ð Ù Ò Ó Ð ÓÒ ÙÒØÓ × Ò¬Ò ØÓ¸
ÔÓÖ ÑÔÐÓº Ò Ð ×Ó Ð ÔÖÓ Ö Ñ ÓÒ¸ ÙÒ Ø ÔÓ                 ØÓ × ¬Ò ¸ Ô Ö Ó Ñ ÒØ ¸
ÔÓÖ ÓÑÔÖ Ò× ÓÒ Ñ ÒØ ÙÒ ÓÖÑ Ñ ØÓ ÓÐÓ               ÒÓÑ Ò       Ø ÔÓ ×ØÖ ØÓ    ØÓ
Ó Ì ¸ Р٠и Ò Ð Ú Ö× ÓÒ ×Ø Ø ÜØÓ¸ ÓÒר Ð × × Ù ÒØ × Ô ÖØ ×
   ½º ÍÒ × Ö Ô ÓÒ Ð ¬Ò Ô Ö Ð Ù Ð × ×Ø Ò Ð Ø ÔÓ               ØÓº
   ¾º ÍÒ ÓÒ ÙÒØÓ Ü ÓÑ × Ý ÔÖ ÓÒ ÓÒ × ÕÙ ¬Ò Ò Ð ÓÑ Ò Ó Ð Ø ÔÓ º
   ¿º ÍÒ ÒØ Ö Þ ¬Ò ÔÓÖ ØÓ × Ð × ÓÔ Ö ÓÒ × ÔÓ× Ð × ×Ó Ö Ð Ì Ò Ð Ù Ð¸ ÔÓÖ
           ÓÔ Ö ÓÒ¸ × ×Ø Ð Þ Ò Ó× Ø ÔÓ× ×Ô ¬ ÓÒ ×
      Especificaci´n sint´ctica: ÒÓÑ Ö
                  o      a                  Ð ÓÔ Ö ÓÒ¸ Ø ÔÓ Ö ×ÙÐØ Ó Ý ÒÓÑ Ö ×
           Ý Ø ÔÓ× ÐÓ× Ô Ö Ñ ØÖÓ׺
      Especificaci´n sem´ntica:
                  o       a         × Ö Ô ÓÒ ÐÓ ÕÙ        Ð ÓÔ Ö ÓÒ ×Ó Ö Ð ×Ø Ó
             ÐÌ º
            Ò ×Ø Ô ÖØ ÔÙ × Ö ÙØ Ð Ò Ö Ü ÓÑ ×¸ ÔÖ ÓÒ ÓÒ × Ý ÔÓר ÓÒ ÓÒ ×º
     × Ò Ð ×Ø Ö ÕÙ ¸ ÓÒÓ Ó¸ ÒØ Ò Ó Ý ÔØ Ó Ð ¬Ò¸ ÕÙ Ö Ò ÓÑÔÐ ØÓ × Ò¹
Ø Ó Ð × ×Ô ¬ ÓÒ × × ÒØ Ø Ý × Ñ ÒØ              ÙÒ Ì º
     Ò ×Ø Ø ÜØÓ¸ ÒÓ× Ú Ð Ö ÑÓ× Ð ÓÒ ÔØÓ Ð × Ó ØÓ Ô Ö Ö Ð Þ Ö Ô ÖØ Ð
 ×Ô ¬ ÓÒº
                                                                    √
    ¿
         Ó Ð Ô Ö×Ô Ø Ú Ñ Ø Ñ Ø ¸ ÒÓ Ü ×Ø ÒØ ÖÔÖ Ø ÓÒ ×   Ð ÒÙÑ ÖÓ       −1º
        ÓÑ Ò Ó Ò Ð × ÒØ Ó ÙÒ ÙÒ ÓÒ Ñ Ø Ñ Ø º
1.1. Especificaciones de datos                                                      5



1.1.2    Noci´n de clase de objeto
             o
Ä Ô Ð Ö Ó ØÓ ÔÖÓÚ Ò Ð Ð Ø Ò Ó ØÙÑ ´Ó ¹ ØÙÑ Ù Ó ¹ ØÙѵ¸ ÓÑÔÓ× ÓÒ
    Ó ¸ ÕÙ × Ò ¬ ×Ó Ö Ð ´Ð µ¸ Ö ÒØ ¸ Ý ØÙѸ ÕÙ × Ð Ô ÖØ Ô Ó Ô × Ó                 Ö¸
 Ø ÑÓ Ö ØÓ Ý Ö Ý ÕÙ × Ò ¬ Ø Ò Ö¸               Öº × Ô٠׸ Ó ØÙÑ ´Ó ØÙѵ × ÐÓ
ÕÙ Ý Ð Ö ÒØ ¸ ÐÓ ÕÙ × Ú × Ð ÙÒ Ó× ¸ ×Ù Ö ÜØ ÖÒ º Ò × Ñ Ð Ö ÓÒØÖ ×Ø ¸ Ð
Ô Ð Ö ×Ù ØÓ ¸ Ø Ñ Ò ÔÖÓÚ Ò ÒØ Ð Ð Ø Ò ×Ù ØÙѸ ÙÝÓ ÔÖ ¬ Ó Ð Ø ÒÓ ×Ù × Ò Ð
       Ó¸ × Ò ¬      ÐÓ ÕÙ ×Ø        Ó Ð Ó× ¸ Ó ÙÐØÓ¸ ÕÙ Ð × ÒØ ÖÒÓ         Ó ÓØÖÓ
ÑÓ Ó¸ ÒÚ × Ð Ò Ô Ö Ò º
      Ò ÔÖÓ Ö Ñ ÓÒ¸ × ÓÑÓ Ò ÓØÖ × Ò Ò Ö ×¸ ÐÓ Ó Ø ÚÓ¸ Ó × ¸ Ð Ö Ú × Ð ¸ ×
   ÒÓÑ Ò ÒØ Ö Þ           ÒØ Ö¹ Þ × Ö¸ ÐÓ ÕÙ ×Ø ÒØÖ Ð Ö ÐÓ ÕÙ × Ó Ö                 Ð
 ÜØ Ö ÓÖº
      Ò Ð ÓÒØ ÜØÓ Ð ÔÖÓ Ö Ñ ÓÒ¸ ÙÒ Ð ×               Ó ØÓ ¸ Ó × ÑÔÐ Ñ ÒØ Ð × ¸
 × ÙÒ Ö ÔÖ × ÒØ ÓÒ Ó Ø Ú           ÙÒ Ø ÔÓ ×ØÖ ØÓ      ØÓ ÕÙ ¬Ò ×Ù ×Ô ¬ ÓÒ
× ÒØ Ø º ÈÓÖ Ó Ø Ú ÔÖ Ø Ò ÑÓ× Ö ÕÙ ×ÓÐÓ ÒÓ× Ö Ö ÑÓ× Ð × Ô ÖØ × ÜØ ÖÒ ×¸
Ú × Ð ×¸ ÕÙ Ø Ò Ö ÙÒ Ó ØÓ Ô ÖØ Ò ÒØ ÙÒ Ð ×                 º Ò Ð ×Ó ÙÒ Ø ÔÓ
   ØÓ¸ Ð × Ô ÖØ × Ú × Ð × Ð × ÓÒ ÓÖÑ Ò Ð ÒÓÑ Ö Ð Ø ÔÓ¸ ÐÓ× ÒÓÑ Ö × Ð × ÓÔ Ö ÓÒ ×¸
ÐÓ× ÒÓÑ Ö × ÐÓ× Ô Ö Ñ ØÖÓ׸ ÐÓ× Ø ÔÓ×       ØÓ ÐÓ× Ô Ö Ñ ØÖÓ× Ý ÐÓ× Ö ×ÙÐØ Ó× Ð ×
ÓÔ Ö ÓÒ × × Ö¸ ×Ù ×Ô ¬ ÓÒ × ÒØ Ø º
    È Ö × Ø× Ö Ð Ó ØÚ                 Ð ×Ô ¬ ÓÒ × ÒØ Ø ¸ × Ò × Ö Ó ÓÖ Ö ÙÒ
Ð Ò Ù ÓÑÙÒ ÒØÖ ÐÓ× ÔÖÓ Ö Ñ ÓÖ ×¸ Ô٠׸ ÐÓ ÓÒØÖ Ö Ó¸ × Ö ÑÙÝ              Ð ÒØ ÖÔÖ Ø Ö
Ð ÒØ Ö Þº ÍÒ ÙØÓÑÓÚ Ð¸ ÔÓÖ ÑÔÐÓ¸ Ø Ò ÙÒ ÒØ Ö Þ Ù×Ó ÓÒ× ×Ø ÒØ ¸ ÒØÖ ÓØÖ ×
 Ó× ×¸ ÐÓ× Ô Ð ×¸ Ð ÚÓÐ ÒØ Ý Ð Ø Ð ÖÓº È Ö ÔÓ Ö ÓÒ Ù ÖÐÓ¸ × Ö ÕÙ Ö ÕÙ Ð
 ÓÒ Ù ØÓÖ ×Ø ÒØÖ Ò Ó Ò Ð ÙØ Ð Þ ÓÒ × ÒØ Ö Þº Ð Ñ ×ÑÓ ÑÓ Ó¸ Ô Ö ÕÙ ÙÒ
ÔÖÓ Ö Ñ ÓÖ ÓÑÔÖ Ò ÙÒ ×Ô ¬ ÓÒ × ÒØ Ø ¸ ר                       ÒØ Ò Ö Ð Ð Ò Ù Ò
ÕÙ × ×Ô ¬ Ð Ð × Ó Ì º Ò Ð ×Ó                   ר Ø ÜØÓ¸ Ö Ð Þ Ö ÑÓ× ×Ô ¬ ÓÒ ×
× ÒØ Ø × Ì Ò Ð Ð Ò Ù C++ Ó Ò Ö Ñ × Ð × × ÍÅĺ
      Ò C++¸ Ð ÑÔÐÓ Ð Ì             ÓÑÔÐ Ó ÔÓ Ö ÑÓ Ð Þ Ö× Ð × Ù ÒØ ÑÓ Ó
   ÓÑÔÐ Ó ≡
 struct Complejo
 {
   Complejo(float r, float i);
   Complejo(const Complejo & c);
   float & obtenga_parte_real();
   float & obtenga_parte_imag();
 };
  ¬Ò ×
 Complejo¸   Ò Ú Ö Ù× º
  ר ¬Ò ÓÒ ×Ø Ð Ó Ø Ú Ñ ÒØ Ð ×Ô ¬ ÓÒ × ÒØ Ø                ÐÌ    ÓÑÔÐ Ó ¸
Р٠и ÙÒ     Ð Ð Ò Ù Ý Ð ÓÖÔÙ× Ñ Ø Ñ Ø Ó ÙÐØÙÖ Ð Ð ÒÓ ÓÒ ÒÙÑ ÖÓ Óѹ
ÔÐ Ó¸ ÓÑÔÐ Ø Ð ×Ô ¬ ÓÒ × ÒØ Ø          ÐÌ º
    ÉÙ ×Ù Ó ÓÒ Ð ×Ô ¬ ÓÒ × Ñ ÒØ                ר ÓÑÔÐ Ø Ð ×Ô ¬ ÓÒ Ë
 ×ÙÑ ÑÓ× ÕÙ Ð Ð ØÓÖ Ð ×Ô ¬ ÓÒ Ð Ì               ÓÑÔÐ Ó ÓÒÓ ×Ù Ñ Ø Ñ Ø
 Ò Ö ÒØ ¸ ÒØÓÒ × ÐÓ× ÒÓÑ Ö × Ð × ÓÔ Ö ÓÒ × Ô ÖÑ Ø Ò ÓÑÔÖ Ò Ö Ö Ø Ñ ÒØ ÕÙ
         ÓÔ Ö ÓÒ × Ò Ò ×         ÜÔÐ Ø ÖÐÓº Ü ×Ø Ð ÙÒ Ù ×Ó Ö ÐÓ ÕÙ     Ð
ÓÔ Ö ÓÒ obtenga parte real()) Ä Ö ×ÔÙ ×Ø Ô Ò ¸ ÒØÖ ÓØÖÓ× ØÓÖ ×¸ Ð Ö Ó
    ר × Ð Ö ØÓÖ × Ø ÑÓÐÓ   × Ù ÖÓÒ   × Ù ÖØ × Ò ¿ º
6                                               Cap´
                                                   ıtulo 1. Abstracci´n de datos
                                                                     o



    ÒØ Ò Ñ ÒØÓ Ñ Ø Ñ Ø Ó ÕÙ Ø Ò Ð Ù ×Ø ÓÒ ÒØ º Ë Ð Ð ØÓÖ ÒÓ ÓÒÓ Ð ÒÓ ÓÒ
   ÒÙÑ ÖÓ ÓÑÔÐ Ó¸ ÒØÓÒ × × Ö ÕÙ Ö Ö ÙÒ ×Ô ¬ ÓÒ × Ñ ÒØ ÕÙ Ð ÑÔ ÖØ ÐÓ
ÕÙ × ÙÒ ÓÑÔÐ Óº
   ÄÓ Ó Ø ÚÓ ÔÓ× Ð Ø ÙÒ Ù Ö Ó ÓÑÙÒ ÒØÖ        Ö ÒØ × Ô Ö×ÓÒ × Ö     Ð ÒØ Ö¹
ÔÖ Ø ÓÒ ÙÒ Ø ÔÓ       ØÓº È Ö ÕÙ ×Ø Ù Ö Ó Ó ÙÖÖ ¸ × Ò × Ö Ó ÕÙ Ð × Ô Ö×ÓÒ ×
 Ò Ù ×Ø ÓÒ Ú Ò Ó ÒØ ÖÔÖ Ø Ò ÓÑÓ Ò Ñ ÒØ Ð Ó ØÓº ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð ÒØ Ö¹
ÔÖ Ø ÓÒ ÙÒ Ì        ÔÒ      Ð Ö Ó Ò ÕÙ ×Ù× ÒØ Ö × Ó× ÓÑÔ ÖØ Ò Ð Ð Ò Ù ÓÒ
ÕÙ × Ö Ð ×Ù ×Ô ¬ ÓÒº
1.1.3   Lo subjetivo de un objeto
Ë ØÖ Ø ÑÓ× ÙÒ ØÓ Ò Ø ÖÑ ÒÓ× Ó Ø ÚÓ׸ ÒØÓÒ ×¸ Ò ÕÙ ÓÒ× ×Ø ØÖ Ø ÖÐÓ Ò Ø ÖÑ ÒÓ×
×Ù Ø ÚÓ×        ÖÓ××Ó ÑÓ Ó¸ Ð Ö ×ÔÙ ×Ø × ÕÙ Ð ×Ù Ø Ú          ÙÒ Ì × ØÖ Ø ÙÖ ÒØ
×Ù ×Ô ¬ ÓÒ × Ñ ÒØ º
      Ü ×Ø Ò¸ × Ñ ÒØ ¸ ØÖ × Ù ÒØ × ×Ù Ø Ú º
     Ä Ú × ÓÒ¸ ÒØ ÖÔÖ Ø ÓÒ Ý¸ Ò ÓÒ× Ù Ò ¸ Ð × ÒØ Ó ÙÒ Ì ¸ Ô Ò                Ð ÜÔ ¹
Ö Ò Ý ÓÒÓ Ñ ÒØÓ ÕÙ Ø Ò Ð Ô Ö×ÓÒ ÕÙ ÙØ Ð Ð Ì º È ÖÓ ×ØÓ × ÑÙÝ ×Ù Ø ÚÓ¸
ÔÙ ×        ÕÙ Ò Ø Ò ×Ù ÔÖÓÔ ÜÔ Ö Ò ¸ Ð Ù Ð ÒÓ             ØÖ Ø Ö× Ó Ø Ú Ñ ÒØ º Ä
ÔÖ Ñ Ö Ù ÒØ ×Ù Ø Ú               ׸ ÒØÓÒ ×¸ Ð ÒØ ÖÔÖ Ø ÓÒ Ð Ù×Ù Ö Ó Ð Ì          Ö
    ×Ù × ÒØ Óº ÉÙ Ò × Ý Ò ×ØÙ Ó              ÐÑ ÒØ ÐÓ× ÒÙÑ ÖÓ× ÓÑÔÐ Ó× Ø Ò Ö Ò ÙÒ
 ÓÑÔÖ × ÓÒ Ð Ì            ÓÑÔÐ Ó Ñ × ÓÑÓ Ò ÕÙ ÕÙ Ò × ÒÓ ÐÓ Ý Ò ×ØÙ Óº
È Ö ×ØÓ× ÙÐØ ÑÓ× ÔÙ × Ö Ò × Ö Ó ÓÑÔÐ Ñ ÒØ Ö Ð ×Ô ¬ ÓÒº
      Ò Ð ×Ó Ð Ì           ÓÑÔÐ Ó × ÑÙÝ ÓÒÚ Ò ÒØ Ø Ò Ö ÙÒ ØÖ Ý ØÓÖ            ×ØÙ Ó×
Ñ Ø Ñ Ø Ó׺ ÈÙ ÙÒ ÔÖÓ Ö Ñ ÓÖ × Ò ×Ø ØÖ Ý ØÓÖ Ñ Ò Ö Ð Ì                   ÓÑÔÐ Ó
  Ò Ö ÒØ Ö ×Ø ÔÖ ÙÒØ Ö Ú Ð Ô Ö×Ô Ø Ú × ÓÒØÖ ØÓÖ ×º
      Ò ÔÖ Ñ Ö ÐÙ Ö¸ × Ð Ù×Ù Ö Ó Ð Ì          ÓÑÔÐ Ó      ÔØ Ð ÒØ Ö Þ¸ ÒØÓÒ ×¸ Ð
   × ÖÖÓÐÐÓ ÔÖÓ Ö Ñ × ÕÙ Ù× Ò ÒÙÑ ÖÓ× ÓÑÔÐ Ó× Ô ÖÑ Ø Ò Ö ÓÑÔÖ Ò× ÓÒ Ö
    Ð Ñ Ø Ñ Ø ÓÑÔÐ º ÑÔ ÖÓ¸ ר Ù×Ù Ö Ó¸ Ð ÒÓ ×ÔÓÒ Ö Ð ÓÖÔÙ× Ñ Ø Ñ Ø Ó
Ö ÕÙ Ö Ó¸ × Ñ × ÔÖÓÔ Ò×Ó ÙØ Ð Þ Ö Ð ÒØ Ö Þ Ô Ö ÙÒ ¬Ò Ö ÒØ Ð ÕÙ Ù ÓÒ                Ó
 ÐÌ         ÓÑÔÐ Ó ÔÓÖ ÑÔÐÓ¸ Ô Ö Ö ÔÖ × ÒØ Ö ÔÙÒØÓ× Ò Ð ÔÐ ÒÓ ÖØ × ÒÓº Ë Ò
 ×ØÓ ÔÙ Ö ÔÖ × ÒØ Ö ÙÒ ÓÖÖÓ Ó Ó¸ Ø Ñ Ò ÔÙ                    ÖÖ Ö Ö Ò × ÓÒ Ù× ÓÒ ×
 ÒØÖ ÐÓ× ÔÖÓ Ö Ñ ÓÖ × Ý Ñ ÒØ Ò ÓÖ ×º
     Ä × ÙÒ Ù ÒØ ×Ù Ø Ú                ÔÖÓÚ Ò Ð Ñ ×ÑÓ × Ò ÓÖ Ð Ì º Ð Ó ØÓ
Ö ×ÙÐØ ÒØ Ô Ò Ø Ñ Ò Ð ÜÔ Ö Ò                   Ð × Ò ÓÖº È Ö×ÓÒ × Ö ÒØ × Ø Ò Ò
  ÔÖÓÔÓÒ Ö ÒØ Ö × Ö ÒØ ׺
     Ä ÙÐØ Ñ Ù ÒØ ×Ù Ø Ú             × Ö ¬ Ö Ð ÑÔÐ ÒØ ÓÒ Ð Ì º ר ÒØÓ× ÔÖÓ¹
 Ö Ñ ÓÖ × Ö Ð Þ Ö Ò ÑÔÐ ÒØ ÓÒ × Ö ÒØ ׺ Ë Ò ×Ø × ÔÖ Ñ Ö Ñ ÒØ Ð ×Ù ¹
ØÚ       ÕÙ ÔÖ Ø Ò × ÓÒ Ö ÙÒ Ì ¸ ÔÙ × Ö × Ò Ð ÓÒ× Ö ÖÐ ÔÓÖ Ó× Ö ÞÓÒ ×
 Ð Ø ÑÔÓ ÑÔÐ ÒØ ÓÒ Ý Ð Ø ÑÔÓ                 Ù ÓÒº
      Ð Ø ÑÔÓ       × ÖÖÓÐÐÓ ÙÒ Ì ÔÙ × Ö Ø Ò ÜØ Ò×Ó ÕÙ ÓÑÔÖÓÑ Ø ÙÒ ÔÖÓÝ ØÓº
  Ò ÐÓ Ñ ÒØ ¸ Ð Ø ÑÔÓ           Ù ÓÒ Ð ÔÖÓ Ö Ñ Ö ×ÙÐØ ÒØ ÔÙ × Ö Ø Ò Ð ÒØÓ ÕÙ
Ò × Ö Ó Ö Ô Ø Ö Ð ÑÔÐ ÒØ ÓÒ Ð Ì º Ò Ù Ð ×ÕÙ Ö                ר × × ØÙ ÓÒ × ÔÙ × Ö
 ÓÒÚ Ò ÒØ Ò Ö ÐÓ× ×Ô ØÓ× Ò Ö Ð × Ð ÑÔÐ ÒØ ÓÒº
      Ò Ö ×ÙÑ Ò¸ Ð × Ù ÒØ × ×Ù Ø Ú         × Ø Ô ¬ Ò ÓÑÓ × Ù
    ½º ËÙ Ø Ú           ÒØ ÖÔÖ Ø ÓÒ Ð Ù×Ù Ö Óº
    ¾º ËÙ Ø Ú           ÒØ ÖÔÖ Ø ÓÒ Ð × Ò ÓÖº
1.1. Especificaciones de datos                                                        7



   ¿º ËÙ Ø Ú           ÑÔÐ ÒØ ÓÒº
    ÈÓÖ Ñ × Ò × × ÕÙ × Ð              Ð ÓÖ ÒØ ÓÒ Ó ØÓ׸ ÐÓ× ÔÖÓ Ö Ñ ÓÖ × ÕÙ
× Ö ÙÒ× Ö Ò Ò × ÖÖÓÐÐÓ× ÓÓÔ Ö Ø ÚÓ×             Ò ×Ø Ö ÓÒ× ÒØ ×         ר × ×Ù Ø Ú ¹
      × Ð ÑÓÑ ÒØÓ Ö Ð Þ Ö Ð ×Ô ¬ ÓÒ × Ñ ÒØ                 ÙÒ Ì º Ä             Ò Ð ×¹
Ô ¬ ÓÒ × Ñ ÒØ ׸ ÒØÓÒ ×¸                 Ù Ö× Ð ÜÔ Ø Ø Ú Ó Ò Ø Ú Ð ÖÙÔÓ
Ô Ö×ÓÒ × ÒÚÓÐÙ Ö × Ò Ð × ÖÖÓÐÐÓ Ý Ù×Ó ÙÒ Ì º Ë ÕÙ Ð ÖÙÔÓ¸ ÔÓÖ Òר Ò ¸
 ÓÑÔÖ Ò Ð Ñ Ø Ñ Ø ÓÑÔÐ ¸ ÒØÓÒ × ÒÓ ×ÓÐÓ × ÒÒ × Ö Ó ÓÒ Ö Ò ÙÒ ×Ô ¹
¬ ÓÒ × Ñ ÒØ ÕÙ ÜÔÐ ÕÙ Ð ÒÓ ÓÒ ÒÙÑ ÖÓ ÓÑÔÐ Ó¸ × ÒÓ ÕÙ ¸ Ø Ñ Ò¸ ÔÙ
ØÓÖÒ Ö× ÑÙÝ Ø Ó×Óº Ò ×Ø ×Ó¸ Ð Ù ÒØ ×Ù Ø Ú                   ×ÓÐÓ × ÑÔÐ ÒØ ÓÒ¸ Ð
 ٠Р׸ ÔÖ × Ñ ÒØ ¸ Ð ×Ù Ø Ú        ÕÙ ÔÖ Ø Ò Ó ÙÐØ Ö ÙÒ Ì º
    ÈÓÖ Ð Ö ÞÓÒ ÒØ Ö ÓÖ¸ Ð ×Ô ¬ ÓÒ × Ñ ÒØ ÒÓ × Ó Ø Ú º ÓÖ Ò¸ ÓÑÓ
Ö Ð Þ Ö ÙÒ ×Ô ¬ ÓÒ × Ñ ÒØ               Ø Ú × Ö¸ ÕÙ ÐÓ Ö Ð ØÓ                    ÔØ Ö×
 ÒØ Ò      ÔÓÖ ÙÒ ÖÙÔÓ ÔÖÓ Ö Ñ ÓÖ ×º Ê ×ÔÙ ×Ø Ö ×ÙÑ Ñ ÒØ ÙÒ Ð Ò Ù
     Ù Óº È Ö × ÖØ Ö Ò ØÓÖÒÓ ×Ø Ù ×Ø ÓÒ¸ × ÔÖÓÔ Ó Ñ Ò Ö ÓÑÓ Ó× ÒØ Ö¹
ÐÓ ÙØÓÖ × ØÖ Ø Ò Ð ÒÓ ÓÒ ÐÓ Ó Ø ÚÓ Ý ×Ù Ø ÚÓ Ö               ÙÒ Ó× ÔÖÓ Ö Ñ ÓÒ
Ý ÙÒ Ì º
      Ò Ð × ÒØ Ó Ò ÕÙ ÐÓ ÑÓ× ØÖ Ø Ó¸ ÐÓ Ó Ø ÚÓ Ð Ó× ÔÖÓ Ö Ñ                   × Ô Ö Ô¹
Ø Ð Ð Ú × ÓÒ ÓÑÙÒ ÐÓ× ÒØ ÖÐÓ ÙØÓÖ ×¸ Ñ ÒØÖ × ÕÙ ÐÓ ×Ù Ø ÚÓ Ð × ×Ø Ó ÙÐØÓ Ð
Ñ ÒÓ× Ð Ñ Ö            ÙÒÓ    ÐÐÓ× Ó Ñ Ó׺ ÈÓÖ Ú × ÓÒ ¸ Ð Ð ØÓÖ ÒÓ             ×ÙÑ Ö Ð
Ñ ÖÓ × ÒØ Ó × Ò×ÓÖ Ð¸ × ÒÓ Ð Ô               Ô Ö Ö ÙÒ Ó× Ó ÒÓÑ ÒÓ Ñ ÒØ Ð ×
   ×ØÖ ÓÒ × Ý ÓÒרÖÙ ÓÒ × ÒØ Ð ØÙ Ð × ÕÙ Ð ÜÔ Ö Ò                 ÐÓ× ÒØ ÖÐÓ ÙØÓÖ × Ð ×
Ô ÖÑ Ø º ÓÑÓ Ô ÖØ Ð ÜÔ Ö Ò ¸ × Ö Ø Ó ÕÙ ÐÓ× ÒØ ÖÐÓ ÙØÓÖ × Ø Ò Ò ×ØÖ Þ ×
    ÔÖÓ Ö Ñ ÓÒ ÕÙ Ô Ö Ð ×º
    ËÙÔÓÒ ÑÓ× ÕÙ ÙÒ ÒØ ÖÐÓ ÙØÓÖ Ð ÔÖ × ÒØ ÙÒ Ì                 ÓØÖÓ º Ó× × ØÙ ÓÒ ×
 Ò Ð × ×ÓÒ ÔÓ× Ð × ´½µ Ú ÒØ ÖÔÖ Ø Ð Ì                   Ð Ñ ×Ñ Ñ Ò Ö ÕÙ Ý ´¾µ
   ÒÓ ÐÓ ÒØ ÖÔÖ Ø Ù Ðº Ò Ù ÐÕÙ Ö            ÐÓ× Ó× ×Ó׸ × × Ò Ð ÕÙ           ÓÒÓÞ Ð
ÓÔ Ò ÓÒ       Ô Ö ÔÓ Ö Ø ÖÑ Ò Ö× Ù Ð Ð × Ó× × ØÙ ÓÒ × Ó ÙÖÖ º
       Ù Ò Ó Ó ÙÖÖ Ð ÔÖ Ñ Ö × ØÙ ÓÒ¸ ÒØÓÒ × ÐÓ× ÒØ ÖÐÓ ÙØÓÖ × Ø Ò Ò ÙÒ Ñ Ö
  ÓÑÓ Ò        Ð Ì Ý Ð ×Ù Ø Ú        ÕÙ Ö ×Ø × ÑÔÐ ÒØ ÓÒ¸ Р٠и Ò Ð ×Ø Ó
      × ÒÓ¸ × × ÑÔÖ × Ù ÒÓ Ó ÙÐØ ÖÐ º
    Ë Ó ÙÖÖ Ð × ÙÒ × ØÙ ÓÒ¸ ÒØÓÒ × Ý                  Ò ÓÑÓ Ò Þ Ö Ð Ú × ÓÒ ÒØ Ö¹
ÔÖ Ø ÓÒ Ð Ì            ÓÖÑ ÕÙ ×Ù× ×Ù Ø Ú        × ÒØ ÖÔÖ Ø ÓÒ Ú Ò Ò Ó Ø Ú ×º
Ä ÙÒ Ñ Ò Ö ×Ø ÓÖ ÓÒÓ                          Ö ×ØÓ × ØÖ Ú × Ð ÐÓ Óº × ÔÓÖ ×ØÓ
ÕÙ Ð Ð Ò Ù × ÙÒ Ñ ÒØ Ð Ò Ð ×Ô ¬ ÓÒ ÙÒ Ì º È ÖÓ Ð Ð Ò Ù ÒÓ × Ñ Ö¹
 Ñ ÒØ ÙÒ Ö ÓÒ Ðº ÒÓ Ø Ò Ò Ò ÙÒ ÓÖÑ                  ÓÖÖÓ ÓÖ Ö × ÓÑÔ ÖØ ×Ù Ñ Ö
× ÒÓ × Ù Ð ÒØ ÖÔÖ Ø ÓÒ ÕÙ Ø Ò                 Ö    Ð Ì º ÈÓÖ Ø ÒØÓ¸ Ù Ò Ó × × Ò
ÙÒ ÒÙ ÚÓ Ì ¸ × × Ò Ð ÕÙ Ð × Ò ÓÖ ÐÓ ÜÔÓÒ ÒØ ÐÓ× ÒØ Ö × Ó× Ò ÙÒ
ÔÖÓ ×Ó          ÐÓ Ó ÕÙ ÙÖ ×Ø ÕÙ ÒÓ Ý Ò ×Ù Ø Ú               × ÒØ ÖÔÖ Ø ÓÒ Ý ×ÓÐÓ
Ö ×Ø Ò Ð × ÑÔÐ ÒØ ÓÒº
1.1.4   Un ejemplo de TAD
 ÜÔ Ö Ò × ÕÙ Ö × Ò Ð × ÖÖÓÐÐÓ ÔÖÓ Ö Ñ ×        Ù Ó Ô ÖÑ Ø Ò ÑÓ Ð Þ Ö ÙÒ
Ì ¸ ÐÐ Ñ Ó    ÙÖ ¸ ÙÝÓ ¬Ò × Ò Ö Ð Þ Ö ÓÔ Ö ÓÒ × Ò Ö ÒØ × Ð Ù Ó
ÙÒ ¬ ÙÖ ×Ó Ö Ð ÙÒ ÓÒ Ó ÓÒØÖ ×Ø º Ì Ð Ì   × ÙØ Ð Ô Ö Ö Ð Þ Ö ÔÖÓ Ö Ñ × ÕÙ
8                                                    Cap´
                                                        ıtulo 1. Abstracci´n de datos
                                                                          o



       Ò      Ù Ó× Ý ÙÒ ÔÖÓÔÙ ×Ø           ¬Ò ÓÒ × ÓÑÓ × Ù
      ÙÖ       ≡
    struct Figure
    {
     ÓÒרÖÙ ØÓÖ ×              ÙÖ
    Ç × ÖÚ ÓÖ ×               ÙÖ
    ÅÓ ¬ ÓÖ ×                 ÙÖ
    };

         ÙÖ × ÓÒ Ö Ø × ½¾
    ¬Ò ×
    Figure¸   Ù×   Ò ÙÒ ×      ¸ ¸ ½¾¸ Ò ½ º
      ÐÌ          ÙÖ ÑÓ Ð Þ ÙÒ ¬ ÙÖ Ò Ö Ð ÕÙ × Ù Ö Ò Ð ÙÒ Ñ Ó
 ÓÒØÖ ×Ø º × Ò Ö Ð Ò Ð × ÒØ Ó ÕÙ ×ÓÐÓ ×ØÖ ÑÓ× ÓÔ Ö ÓÒ × Ò Ö Ð × ×Ó Ö
ÙÒ ¬ ÙÖ ÓÑ ØÖ Ù ÐÕÙ Ö × Ö¸ Ð × ÓÔ Ö ÓÒ × ×ÓÒ Ò Ö Ð × ÔÓÖÕÙ ÓÔ Ö Ò
×Ó Ö Ù ÐÕÙ Ö ¬ ÙÖ Ò Ô Ò ÒØ Ñ ÒØ            ×Ù Ô ÖØ ÙÐ Ö º ÈÓÖ Ù ÐÕÙ Ö ¬ ÙÖ
ÔÖ Ø Ò ÑÓ× ÜÔÖ × Ö ÕÙ ×Ù ÓÖÑ ¸ Ù Ö Ø ¸ ØÖ Ò ÙÐ Ö¸ Ø Ø Ö ¸ ÒÓ ÒÓ× ÑÔÓÖØ ×ÓÐÓ
ÒÓ× ÒØ Ö × ÙÒ ¬ ÙÖ ÓÑÓ ×ØÖ ÓÒ Ò Ö Ð Ô Ö                Ù ÖÝÐ ÑÒÖ ÒÖÐ
ÓÔ Ö Ö ×Ó Ö ÐÐ ØÖ Ú × ÓÔ Ö ÓÒ × Ò Ö Ð × ÓÑÙÒ × ØÓ × Ð × ¬ ÙÖ × Ü ×Ø ÒØ ׺
    ÆÓ ×       ¸ ݸ × ÔÖ Ö Ð ×ÙÑ Ö ÕÙ ÒÓ × ÔÙ ¸ ¬Ò Ö ÙÒ ×ØÖ ÓÒ × Ò ÓÒÓ Ö
 Ð Ô Ö ÕÙ        Ø Ð ¬Ò ÓÒº ÈÓÖ × Ö ÞÓÒ¸ Ù Ò Ó × Ò ÑÓ× ÙÒ Ì ¸           ÑÓ× × ¹
 ÙÖ ÖÒÓ× Ø Ò Ö Ð ÖÓ Ð ¬Ò ÕÙ Ô Ö× Ù ÑÓ׺ Ò ×Ø × ÒØ Ó¸ Ò ÐÓ ÕÙ ÓÒ ÖÒ Ð
Ì          ÙÖ ¸ Ð ¬Ò × Ù Ö ¬ ÙÖ × Ò Ð ÙÒ Ñ Ó ÓÒØÖ ×Ø º Ë ×Ø ¬Ò ÒÓ ×Ø
 Ð ÖÓ¸ ÒÓ Ø Ò × ÒØ Ó Ð Ö ¬ ÙÖ × Ý ×Ù× ÓÔ Ö ÓÒ ×º
    Ä ×Ô ¬ ÓÒ × ÒØ Ø           ÐÌ        ÙÖ      ר      ÔÓÖ ×Ù ¬Ò ÓÒ Ò C++º
    ÍÒ ÓÔ Ö ÓÒ ×Ó Ö ÙÒ Ð × × ÒÓÑ Ò Ñ ØÓ Ó ¸ Ø ÖÑ ÒÓ ÔÖÓÚ Ò ÒØ Ð Ð Ø Ò
Ñ Ø Ó Ù׸ Ð Ù Ð ÔÖÓÚ Ò Ð Ö Ó μ θοδος ´Ñ Ø ¹ Ó Ó×µº Ò ×Ø ×Ó Ñ Ø
 ÓÒÒÓØ Ù Ö ¸ Ñ × ÐÐ Ý Ó Ó× × Ò ¬             Ñ ÒÓº Å ØÓ Ó ÕÙ Ö       Ö¸ Ô٠׸ ÙÒ
  Ñ ÒÓ          Ð ¬Ò ÕÙ ×Ø Ù Ö × Ö¸ ÙÒ Ñ ÒÓ ÓÒ ×Ø ÒÓ¸ ÓÒ × ÒØ Óº
    È Ö ¬Ò Ö Ð × Ñ ÒØ                 ÓÔ Ö ÓÒ¸       ÑÓ× ÒÓØ Ö Ð Ì Point¸
ÔÙ × ÐÓ Ö Ö Ò Ò Ð ÙÒ × ÓÔ Ö ÓÒ × Ð Ì                ÙÖ º ËÙÔ Ø Ó Ð ¬Ò Ð
Ì          ÙÖ ¸ ÙÒ ÔÙÒØÓ ×Ø Ò Ð Ù           ÓÒ Ð ¬ ÙÖ Ð ÑÓÑ ÒØÓ ×Ù Ù¹
    Ó Ý ÒÓ ÒÓ× ÓÒÚ Ò ¸ ÔÓÖ ÓÖ ¸ ¬Ò ÖÐ Ñ ×¸ ÔÙ × ÒÓ Ø Ò ÑÓ×       ¹Ý × ÔÓÖ ÓÖ
Ø Ñ Ò ÔÖ Ö Ð ÒÓ Ø Ò ÖÐ ¹ Ð Ñ Ó Ò Ð Ù Ð × Ù Ö Ò Ð × ¬ ÙÖ × ÔÓÖ ÑÔÐÓ׸
ÙÒ Ñ Ó ÔÐ Ò Ö Ô Ô Ð Ó Ô ÒØ ÐÐ Ó ÙÒ Ñ Ó ØÖ Ñ Ò× ÓÒ Ð ÔÖÓÝ ØÓÖ ØÖ Ñ Ò× ÓÒ Ð Ù
 ÓÐÓ Ö º È Ö Ð ÔÖ Ñ Ö Ø ÔÓ Ñ Ó Ð ÔÙÒØÓ Ö ÕÙ Ö Ó× ÓÓÖ Ò ×¸ Ñ ÒØÖ × ÕÙ
Ô Ö Ð × ÙÒ Ó ØÖ ׺
    À Ý Ó× ÓÖÑ × ÓÒרÖÙ Ö ÙÒ ¬ ÙÖ ×ØÖ Ø ÜÔÖ × × ÔÓÖ ÐÓ× × Ù ÒØ × ÓÒ×¹
ØÖÙ ØÓÖ ×
   ÓÒרÖÙ ØÓÖ ×        ÙÖ ≡                                  ´ µ
    Figure(const Point & point);
    Figure(const Figure & figure);
Í× × Figure º
 Ð ÔÖ Ñ Ö ÓÒרÖÙ ØÓÖ Ö ÕÙ Ö ÙÒ ÔÙÒØÓ Ð × ÙÒ Ó ÓÔ Ð ¬ ÙÖ                Ô ÖØ Ö Ð ÔÙÒØÓ
 ÓÒ × Ò Ù ÒØÖ ÓØÖ ¬ ÙÖ º
     Ä Ö ÙÒ Ò         ×   Ö     º
1.1. Especificaciones de datos                                                 9



    Ð ×ØÖÙ ØÓÖ Ð Ì               ÙÖ            × Ö Ú ÖØÙ Ð
  ÓÒרÖÙ ØÓÖ ×   ÙÖ           +≡                             ´ µ
  virtual ~Figure();
Í× × Figure º
Ô٠׸    × Ñ Ò Ö ¸ × Ö ÒØ Þ Ð ÒÚÓ ÓÒ        Ù ÐÕÙ Ö ×ØÖÙ ØÓÖ ×Ó Ó ÙÒ
¬ ÙÖ Ô ÖØ ÙÐ Öº
      ÙÒ Ñ ØÓ Ó ÕÙ ÒÓ ÐØ Ö Ó ÑÓ ¬ÕÙ Ð ×Ø Ó Ð Ó ØÓ ×Ù Ð ÐÐ Ñ Ö× Ð Ó × Ö¹
Ú ÓÖ º Ò ×Ø × ÒØ Ó¸ ÙÒ ¬ ÙÖ Ø Ò ÙÒ ×ÓÐÓ Ó × ÖÚ ÓÖ
 Ç × ÖÚ ÓÖ ×      ÙÖ ≡                                ´ µ ½
  const Point & get_point() const;
 Ð Ù Ð Ó × ÖÚ ×Ù ÔÙÒØÓ Ö Ö Ò Ò Ð ÔÐ ÒÓº Ò C++¸ Ð Ð ¬ ÓÖ const ×Ó Ö
ÙÒ Ñ ØÓ Ó Ð Ò      Ð ÓÑÔ Ð ÓÖ ÕÙ Ð Ñ ØÓ Ó ÒÓ ÐØ Ö Ð ×Ø Ó Ð Ó ØÓº
     ÙÒ Ñ ØÓ Ó ÕÙ ÐØ Ö Ó ÑÓ ¬ Ð ×Ø Ó ÙÒ Ó ØÓ × Ð Ð × ¬       ÑÓ ¬ ÓÖ
Ó¸ Ú ×¸        ØÙ ÓÖ º ÄÓ× ØÙ ÓÖ × ÙÒ ¬ ÙÖ ×ÓÒ ÐÓ× × Ù ÒØ ×
 ÅÓ ¬ ÓÖ ×        ÙÖ ≡                                   ´ µ
  virtual   void   draw() = 0;
  virtual   void   move(const Point & point) = 0;
  virtual   void   erase() = 0;
  virtual   void   scale(const Ratio & ratio) = 0;
  virtual   void   rotate(const Angle &angle) = 0;
     ÄÓ× ÒÓÑ Ö × Ñ ØÓ Ó× draw(), move() Ý erase() Ò Ò Ð Ö Ñ ÒØ ÕÙ × ÐÓ ÕÙ
Ö Ð Þ Ò º Ð Ñ ØÓ Ó scale() Ùר Ð Ø Ñ ÒÓ ´ × Ð µ ÙÒ ¬ ÙÖ × ÙÒ ÙÒ Ö Ó
     Óº Ð Ø ÔÓ Ratio ×Ô ¬ ÙÒ Ñ Ò ØÙ            × Ð ÕÙ × Ò ¬ Ð ÔÖÓÔÓÖ ÓÒ Ò ÕÙ
Ð × Ð × ÑÓ ¬ × ×Ø × Ñ ÒÓÖ ÕÙ ÙÒÓ¸ ÒØÓÒ × Ð ¬ ÙÖ ×                  ¸ ÐÓ ÓÒØÖ Ö Ó
× Ö Ò º Ò ÐÑ ÒØ ¸ Ð Ñ ØÓ Ó rotate() Ö Ó ÖÓØ Ð ¬ ÙÖ Ò Ð Ñ Ó × ÙÒ ÙÒ
 Ò ÙÐÓ Ø ÔÓ Angleº
     ÄÓ× ÅÓ ¬ ÓÖ ×           ÙÖ Ö ÔÖ × ÒØ Ò ÓÔ Ö ÓÒ × Ò Ö Ð × ×Ó Ö ÙÒ ¬ ÙÖ º
ÈÓ ÑÓ× Ù ÖÐ ¸ ÑÓÚ ÖÐ             ÓØÖÓ ÔÙÒØÓ¸ ÓÖÖ ÖÐ ¸ × Ð ÖÐ × ÙÒ Ð ÙÒ Ñ Ò ØÙ ¸
Ó ÖÓØ ÖÐ × ÙÒ Ð ÙÒ Ò ÙÐÓ Ò Ö Ò × ÙÝÓ × ÒÓ Ò                Ð × ÒØ Ó ÖÓØ ÓÒº Ò
ØÓ Ó× ÐÓ× ×Ó׸ ØÖ Ø ÑÓ× ÓÒ ¬ ÙÖ × ×ØÖ Ø ×¸ ÒÓ ÓÒ Ö Ø ×º
       Ð Ù Ð ÕÙ ÓÒ Ð Ø ÔÓ Point¸ Ò ×Ø ר Ó ÒÓ × ÓÒÚ Ò ÒØ Ô Ò× Ö Ò Ð × Ñ¹
ÔÐ ÒØ ÓÒ × ÐÓ× Ø ÔÓ× Ratio Ý Angleº ËÓÐÓ ×Ø ÓÒ ÓÒÓ Ö ×Ù ÙØ Ð Þ ÓÒ ÓÒ Ó ØÓ×
    Ø ÔÓ Figure Ö ÙÒ× Ö Ø Ð ¬Ò         Ù ÖР׺
     Å Ò ÓÒ Ô ÖØ ÙÐ Ö Ñ Ö Ò Ó× Ð ¬ ÓÖ × × ÒØ Ø Ó× Ð C++º Ð ÔÖ Ñ ÖÓ ÐÓ ÓÒ¹
 ÓÖÑ Ð ÔÖ ¬ Ó Ö × ÖÚ Ó virtual ¸ Ð Ù Ð Ò ÕÙ Ð ÓÔ Ö ÓÒ ÔÙ ÑÔÐ ÒØ Ö×
× ÙÒ Ð Ô ÖØ ÙÐ Ö          Ð ¬ ÙÖ ÔÓÖ ÑÔÐÓ¸ ÙÒ Ù Ö Ó × Ù               Ö ÒØ ÕÙ ÙÒ
  Ö ÙÐÓº Ð × ÙÒ Ó ×Ø        Ó ÔÓÖ Ð      Ó Ò Ð Þ Ö Ð ÓÔ Ö ÓÒ ÓÒ Ð Ú ÐÓÖ ÖÓº
  ר × Ð × ÒØ Ü × C++ Ô Ö ¬Ò Ö ÙÒ Ñ ØÓ Ó Ú ÖØÙ Ð ÔÙÖÓ ¸ Р٠и ×Ù Ú Þ¸ ¬Ò
ÙÒ Ð × ×ØÖ Ø Ó × ¸ ×ØÖ ÓÒ ÔÙÖ ¸ × Ò Ò Ò ÙÒ Ö Ø Ö ÓÒ Ö ØÓ¸ ÔÙ × × ÒÓ Ð
 Ð × ÒÓ × Ö ×ØÖ Ø º È Ö ÔÖ Ò Ö ×Ø Ó × ÖÚ ÓÒ¸ ÓÑ Ò ÑÓ× ÔÓÖ ÔÖ ÙÒØ ÖÒÓ×
     Ù Ð ¬ ÙÖ × Ö ¬ Ö Ð Ì         ÙÖ      º Ä Ö ×ÔÙ ×Ø ÓÖÖ Ø × ÕÙ ÒÓ ÐÓ × ÑÓ׸
ÔÙ × × ØÖ Ø ÙÒ Ð × ×ØÖ Ø ¸ ÒÓ ÙÒ ÓÒ Ö Ø º
     ÄÓ× Ñ ØÓ Ó× Ú ÖØÙ Ð × ÔÙÖÓ× Ø Ò Ò ÕÙ ÑÔÐ ÒØ Ö× Ò Ð × × Ö Ú ×              Ð
 Ð × Figure ÕÙ ÓÒ Ö Ø Ò ÑÔÐ ÒØ ÓÒ × Ô ÖØ ÙÐ Ö × ÙÒ ¬ ÙÖ ×ØÖ Ø º ÈÓÖ Ñ¹
      ÓÒ    ÓÒ     ÕÙ × ÓÒÓÞ Ò ÐÓ× Ø ÖÑ ÒÓ× Ò Ð × ×º
10                                                Cap´
                                                     ıtulo 1. Abstracci´n de datos
                                                                       o



ÔÐÓ¸ Ð Ñ ØÓ Ó scale() ÙÒ ØÖ Ò ÙÐÓ × ÑÔÐ ÒØ Ò ÙÒ Ð ×            Triangle     ÖÚ
Figureº
     Ð ÓÒ ÔØÓ     Ö Ú ÓÒ × Ö ×ØÙ Ó ÓÒ Ñ × Ø ÐÐ Ò Ð ×               ÓÒ Ü ½º¾ ´Ô Ò ½½µº
1.1.5   El lenguaje UML
À ר ÓÖ ÒÓ× ÑÓ× × ÖÚ Ó Ð Ð Ò Ù C++ Ô Ö Ö ×ÓÐÚ Ö Ð ×Ô ¬ ÓÒ × ÒØ Ø º
  Ò ØÓ¸ Ò ×Ø Ð Ò Ù ¸ Ý Ò ÓØÖÓ× ÓÖ ÒØ Ó× Ó ØÓ׸ Ð × ÒØ Ü × Ð ÔÖÓÔ Ó Ð Ò Ù
 Ò      ØÓ Ó× ÐÓ× ×Ô ØÓ× × ÒØ Ø Ó× ÒØ Ö × Ý¸ × × × Ó Ò ÒÓÑ Ö ×    Ù Ó׸ ÙÒ¹
   Ñ ÒØ ÐÓ× × Ñ ÒØ Ó׺
    ÀÓÝ Ò        Ü ×Ø Ò ÑÙ Ó× Ð Ò Ù × ÓÖ ÒØ Ó× Ó ØÓ׸ ÙÝ ÔÖ × Ò ÒÓ× ¬¹
 ÙÐØ ÙÒ ¬ Ö Ñ Ö × Ò ×Ô ¬ ÓÒ × Ý × ÒÓ׺ È Ö Ô Ð Ö ×Ø ÔÖÓ Ð Ñ ¸ ×
      Ñ × ÙÒ             ¸ ÙÒ ÓÒ×ÓÖ Ó ÐÐ Ñ Ó ÇÅ ´Ç Ø Å Ò Ñ ÒØ ÖÓÙÔµ Ò¹
Ø ÒØ ÓÑÓ Ò Þ Ö Ð Ñ Ò Ö               ×Ô ¬ Ö Ì     º     Ó Ð Ò Ù × ÒÓÑ Ò
   ÖÓÒ Ñ Ñ ÒØ ÍÅÄ ÍÒ ¬ ÅÓ Ð Ò Ä Ò Ù              Ý × × ÖÚ     ÙÒ Ñ Ó ÕÙ ÒÓ
Ø Ò Ò ØÓ Ó× ÐÓ× Ð Ò Ù × Ý ÕÙ × ÓÒ×ÓÒ ÓÒ Ð            ÐÓ Ó Ø ÚÓ Ð Ö ¬ Óº ÍÒ
 Ö¬Ó        Ñ × ÕÙ Ñ Ð Ô Ð Ö × Ö Þ ÙÒ ÒØ ÙÓ ÔÖÓÚ Ö Ó¸ Ý ÍÅÄ ÐÓ ÓÒÖ Ù Ò Ó ×
Ö ÕÙ Ö Ó × ÖÚ Ö Ö ÒØ × Ì Ý ×Ù× Ö Ð ÓÒ ×º
      ÐÌ         ÙÖ ÔÙ ÑÓ Ð Þ Ö× Ô ØÓÖ Ñ ÒØ Ò ÍÅÄ ÓÑÓ Ò Ð ¬ ÙÖ ½º½º
ÍÒ Ö Ø Ò ÙÐÓ Ö ÔÖ × ÒØ ÙÒ Ð × ÓÒ ØÖ × × ÓÒ ×º Ð ÒÓÑ Ö Ð Ð × × Ò Ù ÒØÖ
 Ò Ð × ÓÒ ×ÙÔ Ö ÓÖº Ð Ø ØÙÐÓ Ò Ð ØÖ ÙÖ× Ú Ò ÕÙ Ð Ð × × ×ØÖ Ø º
                                         Figure
                         -point: Point
                         +Figure(in point:Point)
                         +Figure(in figure:Figure)
                         +~Figure()
                         +get_point(): Point
                         +draw(): void
                         +move(in p:Point): void
                         +erase(): void
                         +scale(in ratio:Ratio): void
                         +rotate(in angle:Angle): void




                      ÙÖ ½º½       Ö Ñ ÍÅÄ         Ð Ð×   Figure

   Ä × ÙÒ × ÓÒ Ò             ÐÓ× ØÖ ÙØÓ× Ý Ð Ø Ö Ö ÐÓ× Ñ ØÓ Ó× Ù ÓÔ Ö ÓÒ ×º Ð
ÔÖ ¬ Ó ¹ Ò        ÒÓÑ Ö       ØÖ ÙØÓ Ù ÓÔ Ö ÓÒ Ò ÕÙ Ð Ñ Ñ ÖÓ × Ò × Ð
Ñ ÒØÖ × ÕÙ Ð × Ñ ÓÐÓ · Ò ÕÙ × ÓÑÔÐ Ø Ñ ÒØ               × Ðº
   ÍÒ ÒÓÑ Ö ÓÔ Ö ÓÒ Ò Ð ØÖ ÙÖ× Ú Ò ÕÙ Ð ÓÔ Ö ÓÒ × Ú ÖØÙ Ð Ó ÔÓÐ ÑÓÖ
 ÓÒ ÔØÓ ÕÙ ×ØÙ Ö ÑÓ× ÔÖÓÒØ Ñ ÒØ º
   ÄÓ× ÒÓÑ Ö × Ø ÔÓ× Ö ØÓÖÒÓ Ý Ô Ö Ñ ØÖÓ× × × Ô Ö Ò ÐÓ× ÒÓÑ Ö × ÙÒ ÓÒ
Ý Ô Ö Ñ ØÖÓ× ÓÒ Ó× ÔÙÒØÓ× ´ Ð ÒØ Ù ¸ Ô ÖÓ Ð ÒØ ¸ Ù× ÒÞ Ð È × Ð Ý Ð Óеº
ÄÓ× Ô Ö Ñ ØÖÓ× Ø Ò Ò ÙÒ ÔÖ ¬ Ó Ð ¬ ÓÖ ÕÙ ÔÙ Ò Ø Ò Ö Ú ÐÓÖ × in¸ out Ó inout Ô Ö
 ×Ô ¬ Ö Ô Ö Ñ ØÖÓ× ÒØÖ ¸ × Ð Ó ÒØÖ »× Ð Ö ×Ô Ø Ú Ñ ÒØ º
   ÍÒ ÔÖÓ Ö Ñ ÓÑÔÐ Ó ÓÒØ Ò ÑÙ Ó× Ø ÔÓ× ×ØÖ ØÓ׺ Ù Ò Ó ×Ø ÒØ                     ×
 Ö Ò ¸ Ù ÐÕÙ Ö Ð Ò Ù       Ú Ò ÓÑÔÐ Ó Ô Ö Ñ Ö Ö Ò ÙÒ           Ð × ×Ø Ñ Ý ÒØÖÓ
1.2. Herencia                                                                         11



    Ð Ó × ÖÚ Ö ×Ù× Ø ÔÓ×    ØÓ× ÒØ ÖÖ Ð     ÓÒ ×º Ä Ö Ò Ú ÒØ       ÍÅÄ × ×Ù Ö Ø Ö
 Ö ¬ Ó¸ Ð Ù Ð Ð Ø Ó × ÖÚ Ö¸ ×ÓÐÓ Ú ×Ù     Ð Ý Ó Ø Ú Ñ ÒØ ¸ ÐÓ× Ø ÔÓ× ×ØÖ ØÓ× Ò ÙÒ
×ÓÐ Ñ Ö º
      Ò ×Ø Ø ÜØÓ Ù× Ö ÑÓ× ÍÅÄ ×ÓÐÓ Ô Ö    ×Ô ¬ Ö Ö Ñ × Ð × × ÒØ ÖÖ Ð ÓÒ ×
 ÒØÖ ÐР׺ ÍÅÄ × ÙÒ Ð Ò Ù          ÑÓ     Ð Ó ÑÙ Ó Ñ × Ö Ó Ý Ð ÜÔ Ö Ò        ¹
ÑÓ×ØÖ Ó ÕÙ ¸ Ô Ö Ò Ö ÓÑÓ Ò                  ÒØ ÖÔÖ Ø ÓÒ Ò ÙÒ ÔÖÓÝ ØÓ¸ ר × Ñ ×
× ÑÔÐ ÕÙ ÙÒ Ð Ò Ù         ÔÖÓ Ö Ñ ÓÒº

1.2    Herencia
  ÐÌ         ÙÖ      ÑÓ Ð Þ ÙÒ ¬ ÙÖ Ò Ö Ð ÕÙ ÒÓ Ò Ò               Ö       ×Ù ÓÖÑ
 ÓÒ Ö Ø º Ë Ò Ñ Ö Ó¸ Ð ÑÓÑ ÒØÓ           Ù Ö ÙÒ ¬ ÙÖ ¸ × Ø Ò ÕÙ ÓÒ Ö Ø Ö Ý ÓÒÓ Ö
    Ù Ð ¬ ÙÖ × ØÖ Ø º Ò Ð Ö Ó ØÓ׸ ÓÒ Ö Ø Ö × Ð                   ×Ô Ð Þ Ö Ý ×
Ö ÔÖ × ÒØ Ñ ÒØ ÙÒ Ö Ð ÓÒ ÐÐ Ñ              ÖÒ       Ð × º Ò ÍÅĸ ÓÒ Ö Ø Ö Ð ÙÒ ×
 ¬ ÙÖ × Ó ÙÒ Ö Ñ ÍÅĸ Ö ×ÙÑ Ó¸ ÑÔÐ Ö Þ Ð ÓÒ ÔØÓ ÙÒ ÓÖÑ ÕÙ ÒÓ×
Ô ÖÑ Ø Ú ×Ù Ð Þ Ö Ð × Ð × × Ý ×Ù× Ö Ð ÓÒ × Ò ÙÒ ×Ô          Ò ÐÓ Ó Ø ÜÓÒÓÑ ¸
Ø Ð ÓÑÓ × ÐÙ×ØÖ Ò Ð ¬ ÙÖ ½º¾º
                                                 Figure
                                 -point: Point
                                 +Figure(in point:Point)
                                 +Figure(in figure:Figure)
                                 +~Figure()
                                 +get_point(): Point
                                 +draw(): void
                                 +move(in p:Point): void
                                 +erase(): void
                                 +scale(in ratio:Ratio): void
                                 +rotate(in angle:Angle): void




             Triangle                                     Square                       Circle
-hypotenuse: float                          -side_size: float                  -ratio: float
-angle_hypotenuse: float
                                            +get_side_size(): float            +get_ratio(): float
+get_hypotenuse(): float                    +...()                             +...()
+get_angle_hypotenuse(): float
+...()




                ÙÖ ½º¾ Â Ö ÖÕÙ      Ð × × ×Ô       ÐÞ     ×    Ð Ð×   Figure

    Ä Ö Ð ÓÒ     Ö Ò × ÜÔÖ × Ò ÍÅÄ Ñ ÒØ ÙÒ ­             ÓÒØ Ù ÕÙ Ô ÖØ
  × Ð Ð × ×Ô Ð Þ             Ð Ð × Ò Ö Ðº Ò Ð ×Ó ÑÔÐÓ¸ Ð Ð × Ò Ö Ð Ð
 ÓÒ ÓÖÑ Ð Ì       ÙÖ ¸ Ñ ÒØÖ × ÕÙ Ð × Ð × × ×Ô Ð Þ × ÓÒ Ö Ø Ò Ð × ¬ ÙÖ ×
 ×Ô ¬ × Triangle¸ Square Ý Circle¸ ×Ô Ð Þ ÓÒ × ØÖ Ò ÙÐÓ¸ Ù Ö Ó Ý Ö ÙÐÓ¸
Ö ×Ô Ø Ú Ñ ÒØ º
12                                              Cap´
                                                        ıtulo 1. Abstracci´n de datos
                                                                          o



       Ä      Ö Ò × ¬Ò ¸ ÒØÓÒ ×¸ ÓÑÓ Ð ÔÖÓÔ             ÕÙ Ø Ò ÙÒ Ð ×          Ö Ö
     Ð×Ö      ÓØÖ Ð × º
            Ð Ð × Ò Ö Ð × Ð ÐÐ Ñ Ð × × Ó ÙÒ Ñ ÒØ Ð ¸ Ñ ÒØÖ × ÕÙ Ð ×Ô Ð¹
      Þ × Ð ÒÓÑ Ò Ð × Ö Ú º Ò Ð ÑÔÐÓ Ð × ¬ ÙÖ ×¸ Ð Ì                          ÙÖ
      × Ð × × Ð × Ð × × Ö Ú × Triangle¸ Square Ý Circleº
             ÑÓ׸ Ø Ñ Ò¸ ÕÙ Ð Ð × Ö Ú           Ö        Ð Ð × × Ò Ð × ÒØ Ó ÕÙ
        Ö ØÓ ×Ù ÒØ Ö Þ ÔÙ Ð º ÍÒ ØÖ Ò ÙÐÓ¸ ÔÓÖ Òר Ò ¸ Ö           Ð ÔÙÒØÓ Ö Ö Ò
      ØÖ Ù Ð ØÓ × Ð × ¬ ÙÖ × Ò Ö Ð × × Ö¸ ÙÒ Ó ØÓ Ø ÔÓ Triangle ÔÙ ÒÚÓ Ö
      Ð Ñ ØÓ Ó get point()¸ ÔÙ × ×Ø Ù Ö Ó Ð Ì                ÙÖ º
           Ò Ð Ö Ñ ÍÅÄ Ð ¬ ÙÖ ½º¾ × ÔÖ ÕÙ Ð × Ð × × Ö Ú × ÔÓ× Ò ØÖ ÙØÓ×
     Ý Ñ ØÓ Ó× ÕÙ ÒÓ × Ò Ù ÒØÖ Ò Ò Ð Ð × × º ÈÓÖ ÑÔÐÓ¸ Ð Ð × Circle ÔÓ× ÙÒ
     Ñ ØÓ Ó ÐÐ Ñ Ó get ratio() ÙÝ ÙÒ ÓÒ × Ó × ÖÚ Ö Ð Ö Ó Ð Ö ÙÒ Ö Ò ÕÙ
     Ö ÔÖ × ÒØ ÙÒ Òר Ò          Ó ØÓ Ø ÔÓ Circleº Ð ØÖ ÙØÓ ratio Ø Ò × ÒØ Ó¸
     × ÙÒ Ð ÓÑ ØÖ ¸ Ô Ö Ð Ð × Circle¸ Ô ÖÓ ÒÓ ÐÓ Ø Ò Ô Ö Ð × Ð × × Triangle Ý
     Squareº      ÓÖ    Ò¸ Ð × ØÖ × Ð × × Ö Ú ×           ÙÖ     ÓÑÔ ÖØ Ò Ð ÔÙÒØÓ
     Ö Ö Ò ¸ ÔÙ × ÐÐ × ×ÓÒ¸ ÔÓÖ Ö Ú ÓÒ¸ Ø ÔÓ          ÙÖ º
         ÄÓ ÒØ Ö ÓÖ ×Ù Ö ÙÒ ÒØ ÖÔÖ Ø ÓÒ Ð Ö Ò ÕÙ Þ Ñ × Ö Ð Ö Ð ÓÒ × Ö
      × Ö¸ Ð Ð × Ö Ú es¸ Ø Ñ Ò¸               Ð× ×º           ר ÑÓ Ó¸ Ó ØÓ× Ø ÔÓ
     Triangle¸ Square Ý Circle son¸ Ø Ñ Ò¸     Ø ÔÓ Figureº
         Ä     Ð Ö ÓÒ Ò C++ Ð Ö Ð ÓÒ          Ö Ò ÒØ Ö ÓÖ × Ð × Ù ÒØ
½¾       ÙÖ × ÓÒ Ö Ø × ½¾ ≡                                           ´ µ
         struct Triangle : virtual public Figure { ... };
         struct Square : public Figure { ... };
         struct Circle : public Figure { ... };
     Í× × Figure º
         Ä × Ù Ó ×Ô ¬ ÓÒ Ð Ð × Triangle Ò                 ÕÙ × ÙÒ Ð × ×ØÖ Ø º Ò
         ØÓ¸ ÒÓØ ÑÓ× ÕÙ ¸ Ò Ð ×Ó ÙÒ ØÖ Ò ÙÐÓ¸ × ÙÒ ÒÙ ×ØÖ ÙÐØÙÖ Ñ Ø Ñ Ø ¸ ÔÓ ¹
     ÑÓ× ×Ô Ð Þ ÖÐÓ ÙÒ Ñ × × ÙÒ Ð × ÐÓÒ ØÙ × ×Ù× Ð Ó׺
         ÄÓ Ö Ò Ó×Ó Ð Ö Ò × Ð ÔÓ× Ð                     ÜÔÖ × Ö ÓÒ ÔØÓ× Ý ×ØÖ ÓÒ ×
       Ò Ö Ð × ØÖ Ú × Ð × × × × Ô Ö ÐÙ Ó Ô ÖØ ÙÐ Ö Þ ÖÐ × Ñ ÒØ Ö Ú ÓÒ ×º רÓ
     Ó Ö Ð ÔÓ× Ð             × Ò Ö Ò Ù Ø Ú Ñ ÒØ ¸ Ý Ò Ó × ÐÓ Ô ÖØ ÙÐ Ö       ÐÓ Ò ¹
     Ö Ð Ó¸ Ù Ø Ú Ñ ÒØ ¸ Ý Ò Ó × ÐÓ Ò Ö Ð             ÐÓ Ô ÖØ ÙÐ Öº    Ó ÓØÖÓ ÑÓ Ó¸
     Ý Ò Ó × ÐÓ ÓÒ Ö ØÓ          ÐÓ ×ØÖ ØÓ Ó¸ Ô Ö Ó Ñ ÒØ ¸ × ÐÓ ×ØÖ ØÓ           ÐÓ
      ÓÒ Ö ØÓº

     1.2.1    Tipos de herencia
     Ä    ÖÒ       Ð ÑÔÐÓ ÒØ Ö ÓÖ × ÒÓÑ Ò     Ö Ò ÔÙ Ð ¸ ÔÙ × ÐÓ ÕÙ × ÔÙ Ð Ó
        Ð Ð × × Ø Ñ Ò Ú Ò ÔÙ Ð Ó Ò Ð Ð × Ö Ú º
         À Ý ÓØÖÓ ÑÓ Ó   ÖÒ       ÒÓÑ Ò Ó   ÑÔÐ ÒØ ÓÒ Ó Ö Ò ÔÖ Ú º ר
     ÑÓ Ó ÜÔÖ × Ð       Ó ÕÙ Ð Ð × × × Ù× Ô Ö ÑÔÐ ÒØ Ö Ð ¸ Ó Ô ÖØ          и
      Ð × Ö Ú º Ò ÍÅÄ Ð Ö Ò ÔÖ Ú × Ö ÔÖ × ÒØ Ñ ÒØ ÙÒ ­                   ÔÙÒ¹
     Ø ¸ Ñ ÒØÖ × ÕÙ Ò C  ++ Ñ      ÒØ Ð Ð ¬ ÓÖ private ÓÑÓ ÔÖ ¬ Ó Ð ÒÓÑ Ö Ð
      Ð× ×º
1.2. Herencia                                                                        13



1.2.2   Multiherencia
  Ò Ó × ÓÒ ×¸ ÙÒ Ð × Ó ØÓ es¸ Ð Ú Þ¸ Ó× Ó Ñ × Ð × ×º Ò Ð ÑÙÒ Ó Ó ØÓ׸
 ×ØÓ ÔÙ       ÜÔÖ × Ö× Ñ ÒØ ÙÒ Ö Ð ÓÒ            Ö Ò ÑÙÐØ ÔÐ º × Ö¸ ÙÒ Ó ØÓ
ÔÙ       Ö Ö        Ó× Ó Ñ × Ð × × × º Ä ¬ ÙÖ ½º¿ ÑÙ ×ØÖ ÙÒ Ö Ð ÓÒ Ð × × ÕÙ
ÑÓ Ð Þ ÐÓ× ØÓÖ × ÙÒ ÍÒ Ú Ö× º Ø Ò ÓÒ ×Ô Ð Ñ Ö Ð Ð × Preparadorº
  Ò Ð Ú Ö Ð¸ ÙÒ ÔÖ Ô Ö ÓÖ × ÙÒ ×ØÙ ÒØ Ü Ð×Ó¸ ÙÝ Ü Ð Ò ÔÖ Ð ÍÒ ¹
Ú Ö×      Ô Ö Ð × ×Ø Ò Ý Ñ ÓÖ           ×Ù× ÙÖ×Ó׺ ÓÑÓ Ö ØÖ Ù ÓÒ¸ Ð ÍÒ Ú Ö×
Ð ÓØÓÖ Ð ×ØÙ ÒØ ÙÒ ×Ø Ô Ò Óº Ò ÐÓ× Ø ÖÑ ÒÓ× Ð               Ö Ñ ÍÅĸ Preparador
   Ö       Ð × Ð × × Estudiante Ý Trabajador Universitario¸ Ö ×Ô Ø Ú Ñ ÒØ º        ר
ÑÓ Ó ¬Ò ÑÓ× ÕÙ ÙÒ ÔÖ Ô Ö ÓÖ es¸ Ð Ú Þ¸ ×ØÙ ÒØ Ý ØÖ               ÓÖ ÙÒ Ú Ö× Ø Ö Óº
                                        Persona
                               +nombres(): Nombres
                               +cédula(): Cédula
                               +edad(): int




             Trabajador Universitario
                                                              Estudiante
         +salario(): Salario
         +antiguedad(): int                   +expediente(): Expediente_Estudiante
         +...()                               +...()




  Profesor          Obrero         Empleado                  Preparador




                ÙÖ ½º¿ Ê Ð ÓÒ ×         Ð××    Ô Ö×ÓÒ × Ò ÙÒ ÍÒ Ú Ö×
     × ÔÓ× Ð Ø Ò Ö Ö Ð ÓÒ ×        ÑÙÐØ Ö Ò           ÒØ Ö Þ ÔÓÖ ÙÒ Ô ÖØ ¸ Ý         ѹ
ÔÐ ÒØ ÓÒ ÔÓÖ Ð ÙÒ ÓØÖ º

1.2.3   Polimorfismo
Ä Ô Ð Ö “polimorfo” ÔÖÓÚ Ò Ð Ö Ó π λυ ´ ÔÓÐÝ µ¸ ÕÙ × Ò ¬ ÑÙ Ó Ñ Ò¹
ØÖ × ÕÙ ÑÓÖ Ó ÔÖÓÚ Ò μορφ ´ ÑÓÖ µ¸ ÕÙ × Ò ¬ ¬ ÙÖ ¸ ÓÖÑ º ÈÓÐ ÑÓÖ Ó
 ÓÒÒÓØ ¸ Ô٠׸ ÑÙ × ¬ ÙÖ × ¸ ÑÙ × ÓÖÑ × º Ò Ð Ö Ó ØÓ׸ polimorfismo
es la propiedad de expresar varias funciones o procedimientos diferentes o
similares bajo el mismo nombreº
   À Ý ØÖ × Ð × ×    ÔÓÐ ÑÓÖ¬×ÑÓ        ×Ó Ö Ö ¸        ÖÒ     Ý    ÔÐ ÒØ ÐÐ º
14                                                        Cap´
                                                             ıtulo 1. Abstracci´n de datos
                                                                               o



1.2.3.1      Polimorfismo de sobrecarga
ËÓ Ö Ö × Ð Ô            ÙÒ Ð Ò Ù   Ó ØÓ× Ô Ö ¬Ò Ö ÒÓÑ Ö × Ù Ð ×                        ÙÒ¹
 ÓÒ ×¸ ÔÖÓ Ñ ÒØÓ× Ý Ñ ØÓ Ó׺ ÓÒ× Ö ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ Ð ÙÒ ÓÒ × Ù ÒØ
           const int sumar(const int & x, const int & y);
    ÙÝÓ ¬Ò × ×ÙÑ Ö Ó× ÒØ ÖÓ׺             sumar()   ÔÙ      ×Ó Ö Ö Ö× Ô Ö ÕÙ ×ÙÑ Ñ ×
ÒØ ÖÓ×
const int sumar(const int & x, const int & y, const int & z);
const int sumar(const int & w, const int & x, const int & y, const int & z);
       Ð ÓÑÔ Ð ÓÖ¸ ØÖ Ú × Ð ÒØ     Ô Ö Ñ ØÖÓ׸ Ö Ð Þ Ð ×Ø Ò ÓÒ Ý     ÙÐ
     Ð × ØÖ × ÙÒ ÓÒ × × Ð ÕÙ × ÒÚÓ Öº ÈÓÖ ÑÔÐÓ¸ × Ð ÓÑÔ Ð ÓÖ Ò Ù ÒØÖ
           sumar(1, 2, 3);
      ÒØÓÒ × ×Ø Ò Ö Ö Ð ÐÐ Ñ      sumar() ÓÒ ØÖ × Ô Ö Ñ ØÖÓ׺
      × ÔÓ× Ð ¸ Ø Ñ Ò¸ ¬Ò Ö sumar() Ô Ö ÕÙ ×ÙÑ ÓØÖ Ð ×                        Ó ØÓ׺ ÈÓÖ
     ÑÔÐÓ
           const string sumar(const string & x, const string & y);
   Ä ×ÙÑ        Ò × ÔÙ ÒØ ÖÔÖ Ø Ö× ÓÑÓ Ð ÓÒ Ø Ò ÓÒº Ð ÓÑÔ Ð ÓÖ Ö Ð Þ
Ð ×Ø Ò ÓÒ Ö ×Ô ØÓ Ð × Ú Ö× ÓÒ × Ö ØÑ Ø × Ñ ÒØ ÐÓ× Ø ÔÓ× ÐÓ× Ô Ö Ñ ØÖÓ׺
    Ò C++ × ÔÙ Ò ×Ó Ö Ö Ö ÐÓ× ÓÔ Ö ÓÖ ×º ÈÓÖ ÑÔÐÓ¸ ÔÓ Ö ÑÓ× ×Ô ¬ Ö Ð
 ÓÒ Ø Ò ÓÒ        Ò × Ð × Ù ÒØ ÑÓ Ó
 const string operator + (const string & x, const string & y);
      Ò ×Ø     ×Ó¸ ÔÙ      × Ö Ö× Ð Ó × ÓÑÓ
     string s1, s2;

     ...

     string s3 = s1 + s2;
   Ä ×Ó Ö Ö      ÓÔ Ö ÓÖ × ¸ Ò ÐÙ× Ú ¸ Ð   ÙÒ ÓÒ ×¸ × ÙÒ ×ÙÒØÓ ÔÓÐ Ñ Ó ÔÓÖÕÙ
Ó ÙÐØ ÓÔ Ö ÓÒ × Ý ÔÙ    ÓÒØÖ Ú Ò Ö Ð × ÒØ Ó ÙÐØÙÖ Ð Ð ÓÔ Ö ÓÖº ÈÓÖ ÑÔÐÓ¸ Ð
 Ó Ó ÒØ Ö ÓÖ Ø Ò Ô Ö ØÓ × ÒØ Ó ÙÐØÙÖ Ð Ô Ö Ð Ö ØÑ Ø ¸ Ô ÖÓ ÕÙ Þ ÒÓ Ô Ö Ð
 ÓÒ Ø Ò ÓÒº Ù Ò Ó Ò ÙÒ ÔÖ Ñ Ö Ò×Ô ÓÒ ÙÒ Ð ØÓÖ Ð Ð ×ÙÑ                    Ò ×¸
ÔÓ× Ð Ñ ÒØ Ð Ô Ò× Ö ÕÙ ÐÓ× ÓÔ Ö Ò Ó× ×ÓÒ ÒÙÑ Ö Ó׸ ÐÓ Ù Ð Ò Ð ÙÐØ ÑÓ ÑÔÐÓ ÒÓ
 × Ð ×Óº ÈÓÖ × Ö ÞÓÒ¸ × ÔÓÖ ÐÓ Ò Ö Ð Ö ÓÑ Ò Ð Ú Ø Ö Ð ×Ó Ö Ö º
1.2.3.2      Polimorfismo de herencia

     ÙÒ Ö Ð ÓÒ               ÖÒ       ÒØÖ ØÖ × Ð × × X¸ Y Ý Z¸ ÜÔÖ ×       Ö ¬ Ñ ÒØ     Ð
× Ù ÒØ Ñ Ò Ö
                                                X
                                        +método(...): T




                                  Y                              Z
                        +método(...): T                  +método(...): T
1.2. Herencia                                                                    15



      Ð ÔÓÐ ÑÓÖ¬×ÑÓ       Ö Ò × ¬Ò ÓÑÓ Ð ÔÓ× Ð                  ¬Ò Ö ´ÒÓ ×Ó Ö Ö Öµ
    Ñ ØÓ Ó× Ú ÖØÙ Ð × Ð Ñ ×ÑÓ ÒÓÑ Ö Ò Ð × ØÖ × Ð × ×¸ ÒÚÓ Ö Ð Ñ ØÓ Ó × Ð Ð × X Ý
       Ø ÖÑ Ò Ö¸ Ò Ø ÑÔÓ         Ù ÓÒ¸ Ù Ð × Ð Ñ ØÓ Ó ÓÒ Ö ØÓ × ÙÒ × Ð ÑÔÐ ÒØ ÓÒ
    Ö Ð Ð Ð × Xº
           ÐÓ× Ñ ØÓ Ó× Y::m´todo() Ý Z::m´todo() × Ð × ÓÒÒÓØ ÓÑÓ ×Ô Ð Þ ÓÒ ×
                            e             e
       Ð Ñ ØÓ Ó Ò Ð Ð × × X::m´todo()º
                                   e
         ÈÓ Ö      Ö× ÕÙ Ð ÔÓÐ ÑÓÖ¬×ÑÓ       Ö Ò × Ð ×Ó Ö Ö            Ñ ØÓ Ó× Ú ÖØÙ Ð ×
     ÒØÖ Ð × Ð × ×º × ÑÔÓÖØ ÒØ Ö × ÐØ Ö ÕÙ ¸ Ò ×Ø ×Ó¸ ÐÓ× ÔÖÓØÓØ ÔÓ× ÐÓ× Ñ ØÓ Ó×
    Ú ÖØÙ Ð × Ø Ò Ò ÕÙ × Ö ÒØ Ó׺
         Ê ÓÖ ÑÓ× ÕÙ Ð Ì             ÙÖ     ÓÒØ Ò Ñ ØÓ Ó× Ú ÖØÙ Ð ×¸ ÔÙÖÓ׸ ÕÙ ÒÓ ×
    ÔÙ Ò ÑÔÐ ÒØ Öº Ë ÔÖ Ø Ò × ÑÓ× Ù Ö ÙÒ Ó ØÓ Ø ÔÓ                 ÙÖ ¸ × ÒÓ× Ô Ö ¹
       Ö Ð ÔÖ ÙÒØ        Ù Ð ¬ ÙÖ ¸ ÔÙ × Ð Ì         ÙÖ      × ÙÒ ¬ ÙÖ ×ØÖ Ø ¸ ÒÓ
     ÓÒ Ö Ø º × Ù Ò Ó ÓÒÓ ÑÓ× Ù Ð × Ð ¬ ÙÖ ÕÙ Ø Ò × ÒØ Ó Ò Ö ÓÑÓ Ù ÖÐ º
         Ä ÑÔÐ ÒØ ÓÒ ÙÒ Ñ ØÓ Ó Ú ÖØÙ Ð ÔÙÖÓ × Ð Ð              ÙÒ Ð × Ö Ú º È Ö
     Ð ×Ó Ð Ì            ÙÖ ¸ ×Ù× ÙÖ × ÓÒ Ö Ø × ½¾             Ò ÑÔÐ ÒØ Ö ×Ù× Ñ ØÓ Ó×
    Ú ÖØÙ Ð × ÔÙÖÓ׺ ÈÓÖ ÑÔÐÓ¸ ÐÓ× Ñ ØÓ Ó× Square::draw() Ý Circle::draw() ÑÔÐ ÒØ Ò
        ÑÒÖ        Ö ÒØ Ð Ù Ó ×Ù ÓÖÖ ×ÔÓÒ ÒØ ¬ ÙÖ º                 ר ÑÓ Ó¸ Ù Ò Ó ×
    ÓÔ Ö ×Ó Ö ÙÒ Ó ØÓ Ò Ö Ð Ø ÔÓ             ÙÖ     Ý × ÒÚÓ       ÙÒ Ñ ØÓ Ó Ú ÖØÙ Ð¸ ×
    × Ð ÓÒ ¸ Ò Ø ÑÔÓ            Ù ÓÒ¸ Ð Ñ ØÓ Ó ×Ô Ð Þ ÓÒ × ÙÒ Ð ¬ ÙÖ ÓÒ Ö Ø
    ×Ó Ö Ð Ù Ð × ×Ø ÓÔ Ö Ò Óº
         Ä Ú ÖØÙ Ð ÔÓÐ ÑÓÖ¬×ÑÓ          Ö Ò × ÕÙ Ô ÖÑ Ø × Ö Ö ÔÖÓ Ö Ñ × Ò Ö Ð ×
    ÕÙ Ñ Ò ÔÙÐ Ò ¬ ÙÖ × Ò Ö Ð × º רÓ× ÔÖÓ Ö Ñ × ÒÓ Ö ÕÙ Ö Ò ÓÒÓ Ö Ð × ¬ ÙÖ ×
     ÓÒ Ö Ø ×¸ ÔÙ × ÓÔ Ö Ò Ò ÙÒ ÓÒ Ñ ØÓ Ó× Ú ÖØÙ Ð × Ò Ö Ð × ÔÙÖÓ׺ ÈÓÖ ÑÔÐÓ¸
    Ô ÖØ × ÔÖÓ Ö Ñ × Ô Ö        Ù Ö ¬ ÙÖ × Ñ Ò ÔÙÐ Ò ¬ ÙÖ × Ò ×ØÖ ØÓ¸ Ð × Ù Ò¸ Ð ×
    ÑÙ Ú Ò¸ Ð × ÖÓØ Ò¸ Ø Ø Ö º       ØÓ×    ÓÒÓÑ Þ Ö Ó Ó¸ Ö ×ÙÐØ ÙØ Ð Ð ÔÓ× Ð
     × Ö Ö ÔÖÓ Ö Ñ × Ò Ö Ð × ÓÑÓ Ð Ð ÑÔÐÓ × Ù ÒØ
½    ÅÒ Ó ÒÖÐ             ÙÖ ½ ≡
      void release_left_button(const Action_Mode mode, Figure & fig)
      {
        switch (mode)
          {
          case Draw:
          case Move:
            fig.draw(); break;
          case Delete: fig.erase(); break;
          case Scale: fig.scale(dif_mag_with_previous_click()); break;
          case Rotate: fig.rotate(dif_angle_with_previous_click()); break;
            ...
          }
      }
    Í× × Figure º
    Ð Ù Ð × Ö ÒÚÓ       Ò ×Ó ÕÙ × Ø Ø ÕÙ × ×Ù ÐØ Ð ÓØÓÒ ÞÕÙ                Ö Ó Ð Ö ØÓÒ
      ÒØÖÓ ÙÒ Ð ÒÞÓ ×ØÖ ØÓ           Ù Óº
       release left button() ÒÓ Ö ÕÙ Ö ÓÒÓ Ö Ð ¬ ÙÖ ÓÒ Ö Ø º ËÙ            Ó Ó × ¹
    Ò Ö Ð Ý ÒÓ ×    Ø ÔÓÖ Ð × ÑÓ ¬ ÓÒ × Ó Ò ÙÖ × Ð × ¬ ÙÖ ×º               ÈÓÖ ÑÔÐÓ¸
    × release left button() ÓÔ Ö ×Ó Ö ÙÒ Ù Ö Ó¸ ÒØÓÒ × × ÒÚÓ Ö Ò            ÐÓ× Ñ ØÓ Ó×
          ÒÙ ÚÓ¸ Ð Ö ÙÒ Ò   ×   Ö   º
16                                              Cap´
                                                       ıtulo 1. Abstracci´n de datos
                                                                         o



    Ú ÖØÙ Ð × ÓÒ Ö ØÓ×    Ð Ð×     Square    Ò ÐÓ Ñ ÒØ ¸ Ó ÙÖÖ ÓÒ ÙÒ Ö ÙÐÓ¸ ×Ó Ò Ð
     Ù Ð × ÒÚÓ Ö Ò ÐÓ× Ñ ØÓ Ó×     Circleº

    1.2.3.3    Polimorfismo de plantilla (tipos parametrizados)

    À Ý × ØÙ ÓÒ × Ò Ð × Ù Ð × ÙÒ ÔÖÓ Ð Ñ Ý ×Ù ×ÓÐÙ ÓÒ ÔÙ Ò ×Ô ¬ Ö×          ÓÖÑ Ò¹
      Ô Ò ÒØ Ð ´Ó ÐÓ×µ Ø ÔÓ´×µ      ØÓ´×µº ÈÓÖ ÑÔÐÓ¸ Ð ÔÖÓ Ð Ñ      Ù× Ö ÙÒ Ð Ñ ÒØÓ
     Ò ÙÒ ÓÒ ÙÒØÓ¸ Ý ×Ù ×ÓÐÙ ÓÒ¸ ×ÓÒ Ò Ô Ò ÒØ × Ð Ø ÔÓ        Ð Ñ ÒØÓ׺ Ë ×ÙÔÓÒ ÑÓ×
    ÕÙ Ð ÓÒ ÙÒØÓ × Ö ÔÖ × ÒØ Ñ ÒØ ÙÒ ÖÖ ÐÓ¸ ÒØÓÒ ×¸ ÙÒ ÔÓ× Ð Ñ Ò Ö ¸ Ò Ö ¸
        Ù× Ö ÙÒ Ð Ñ ÒØÓ × ÓÑÓ × Ù
½     Ù×ÕÙ     ÒØÖÓ ÙÒ ÖÖ ÐÓ ½ ≡
          template <typename T, class Compare>
      int sequential_search(T * a, const T& x, int l, int r)
      {
        for (int i = l; i <= r; i++)
          if (are_equals<T, Compare> () (a[i], x))
            return i;

          return No_Index;
      }
    Í× × sequential search ½   º
      ר ÖÙØ Ò Ù× Ð Ð Ñ ÒØÓ x ÒØÖÓ Ð Ö Ò Ó ÓÑÔÖ Ò Ó ÒØÖ l Ý r Ð ÖÖ ÐÓ aº
    Ë Ö ØÓÖÒ ÙÒ Ò            ÒØÖÓ Ð ÖÖ ÐÓ ÓÖÖ ×ÔÓÒ ÒØ ÙÒ ÒØÖ ÕÙ ÓÒØ Ò ÙÒ
     Ð Ñ ÒØÓ Ù Ð x¸ Ó Ð Ú ÐÓÖ No Index ´ÔÓÖ ÐÓ Ò Ö Ð −1µ¸ × Ð ÖÖ ÐÓ ÒÓ ÓÒØ Ò xº
           Ô ÖØ          ÐÓ× Ô Ö Ñ ØÖÓ× Ô ÖØ Ò ÒØ × Ð ÓÒ ÙÒØÓ¸               Ð Ð ÓÖ ØÑÓ
       Ò Ö Ó sequential search<T, Compare>() Ö ÕÙ Ö Ó× Ø ÔÓ× Ô Ö Ñ ØÖ Þ Ó× Ð
    Ø ÔÓ        ØÓ Ð ÓÒ ÙÒØÓ¸ ÒÓÑ Ò Ó Ò Ö Ñ ÒØ T¸ Ý ÙÒ Ø ÔÓ ÓÑÔ Ö ÓÖ                 ٠й
          ÐÐ Ñ Ó are equals<T, Compare>() ÙÝÓ Ù×Ó × Ö ÓÖ Ó Ò Ü ½º¿º½ ´Ô Ò ½ µº
           ÙÒ ÓÒ × Ó Ñ ØÓ Ó× ÓÑÓ sequential search<T, Compare>() × ÒÓÑ Ò Ò ÔÐ Ò¹
    Ø ÐÐ × º       ÑÓ× ÕÙ sequential search<T, Compare>() × Ò Ö ÔÓÖÕÙ genera
    ÙÒ Ñ Ð          ÙÒ ÓÒ × Ô Ö        Ø ÔÓ Ü ×Ø ÒØ Ò Ð Ù Ð Ü ×Ø ÙÒ Ð × are equals()º
      Ò ÓØÖ × Ô Ð Ö ×¸ ÙÒ ÔÐ ÒØ ÐÐ ÙØÓÑ Ø Þ Ð ×Ó Ö Ö             Ð ÙÒ ÓÒ Ó Ð × Ô Ö ÐÓ×
    Ø ÔÓ× ÒÚÓÐÙ Ö Ó× Ò Ð ÔÐ ÒØ ÐÐ º
         Ç × ÖÚ ÑÓ× ÕÙ ÙÒÕÙ Ð ÔÐ ÒØ ÐÐ × Ð Ñ ×Ñ ¸ Ó × ¸ × Ò Ö ¸ Ð Ó Ó
       Ò Ö Ó sequential search<int, are equals<int> >(...) × Ö ÒØ Ð Ð ÓÖ ØÑÓ
    sequential search<string, are equals<string> >(...)º Ð ÓÑÔ Ð ÓÖ                   Ò¹
    Ö Ö Ó× Ó Ó× ×Ø ÒØÓ× ÙÒÓ Ô Ö ÖÖ ÐÓ×              ÒØ ÖÓ× ´intµ Ý Ð ÓØÖÓ Ô Ö ÖÖ ÐÓ×
          Ò × ´stringµº
           Ù Ò Ó × ÑÔÐ ¬ Ó Ð Ð ×          ÙÖ ¸ × Ò Ó ÕÙ ×Ù ¬Ò × Ù ÖÐ Ò ÙÒ Ñ Ó
         ÓÒØÖ ×Ø º      Ù ÐÑ Ó×          Ð Ô Ô Ð¸ Ô ÒØ ÐÐ    Ú Ó¸ Ø Ð Ú ×ÓÖ¸ ÓÐÓ Ö ¸ ººº
      Ð Ð ØÓÖ Ù Ó×Ó              Ö× Ô Ö Ø Ó ÕÙ Ð × ÑÔÐ ÒØ ÓÒ × Ð Ð ×              ÙÖ
    ´Square¸ Triangle Ý Circleµ¸ Ø Ò Ò ÕÙ ×ÙÑ Ö ÙÒ Ñ Ó Ò ÓÒ Ö Ð Þ Ö Ð × ÓÔ Ö Ó¹
    Ò ×º ÍÒ Ñ Ò Ö          Ò Ô Ò Þ Ö× Ð Ñ Ó ÓÒØÖ ×Ø ×              Ö Ð Ð×         ÙÖ
    ÙÒ ÔÐ ÒØ ÐÐ ÙÝÓ Ô Ö Ñ ØÖÓ × ¸ Ùר Ñ ÒØ ¸ Ð Ñ Ó ÓÒØÖ ×Ø º Ä                × ÐÙ×ØÖ Ò
     Ð Ö Ñ ÍÅÄ Ð ¬ ÙÖ ½º º
          Ò Ò Ð ×¸ Ø ÑÔÐ Ø º
1.2. Herencia                                                                 17



                                                 Medium_Type:Medium
                                  Figure
                     -point: Point
                     +medium: Medium_Type
                     +Figure(in point:Point)
                     +Figure(in figure:Figure)
                     +~Figure()
                     +get_point(): Point
                     +draw(): void
                     +move(in p:Point): void
                     +erase(): void
                     +scale(in ratio:Ratio): void
                     +rotate(in angle:Angle): void



        ÙÖ ½º         Ö Ñ ÍÅÄ     Ð Ð×      ÙÖ ÓÒ Ð Ñ Ó       ÓÒØÖ ×Ø ÓÑÓ Ô Ö Ñ ØÖÓ

         Ò ÍÅĸ ÐÓ× Ô Ö Ñ ØÖÓ× ÔÐ ÒØ ÐÐ Ð Ð × × ×Ô ¬ Ò Ò ÙÒ Ö Ø Ò ÙÐÓ ÔÙÒØ Ó
    × ØÙ Ó Ò Ð ×ÕÙ Ò ×ÙÔ Ö ÓÖ Ö º
        ÍÒ Ó ØÓ Ø ÔÓ          ÙÖ       ÔÓ× ÓÑÓ Ø ÔÓ Ô Ö Ñ ØÖ Þ Ó Ð Ñ Ó Ò ÓÒ
    × Ñ Ò ÔÙÐ Ò Ð × ¬ ÙÖ ×º ÈÙ × Ö Ò × Ö Ó ÕÙ Ð × ×Ô Ð Þ ÓÒ ×                 ÙÖ
     ÓÒÓÞ Ò Ð Ø ÔÓ ÓÒ Ö ØÓ Ð Ñ Ó           ÓÒØÖ ×Ø º ÈÓÖ ×Ø Ö ÞÓÒ¸ Ð Ú Ö× ÓÒ ÔÐ ÒØ ÐÐ
            ÙÖ     ÜÔÓÖØ Ð Ø ÔÓ Ô Ö Ñ ØÖ Þ Ó Ó Ð ÒÓÑ Ö Medium Typeº Ò C++ ר
        ÓÒ × ÐÐ Ú      Ó Ñ ÒØ Ð × Ù ÒØ          Ð Ö ÓÒ
½    Ç × ÖÚ ÓÖ ×       ÙÖ +≡                                    ´ µ
        typedef Medium Medium_Type;
       ר Ñ Ò Ö ¸ ÙÒ ×Ô        Ð Þ ÓÒ ÔÙ    Òר Ò Ö ÙÒ Ó ØÓ    Ø ÔÓ Medium Type ÓÑÓ
    × ÐÙ×ØÖ Ò Ð × Ù ÒØ         ÑÔÐÓ
    void Square::draw()
    {
      /* .... */
      Medium_Type m; // Instancia un objeto "medio de contraste"

        /* .... */

        medium.put_line(...);
    }

      Ð ØÖ ÙØÓ Ø ÔÓ medium Ð Ð × Figure<Medium> Ð Ô ÖÑ Ø ×Ó Ð Ñ ×ÑÓº Ä
     ×Ô Ð Þ ÓÒ Square::draw() Ù Ö Ð Ò × Ò Ð Ñ Ó ÓÒØÖ ×Ø ÓÖÖ ×ÔÓÒ ÒØ ×
     Ð Ö ×Ô Ø ÚÓ Ù Ö Óº Ä ÑÔÐ ÒØ ÓÒ Square::draw() Ú Ò Ò Ö Ö ×Ô ØÓ Ð
    Ñ Óº
18                                              Cap´
                                                   ıtulo 1. Abstracci´n de datos
                                                                     o



1.2.3.4    Lo general y lo gen´rico
                              e

ÄÓ× Ø ÖÑ ÒÓ× Ò Ö Ð Ý Ò Ö Ó ÒÓ ×ÓÐÓ × Ô Ö Ò ÑÙ Ó Ð Ü Ñ ÒØ ¸ × ÒÓ ÕÙ ¸ Ò
     ØÓ¸ Ø Ñ Ò ×ÓÒ ÑÙÝ × Ñ Ð Ö × × Ñ ÒØ Ý Ø ÑÓÐÓ Ñ ÒØ º
    Ä Ö Þ      Ñ Ó× Ø ÖÑ ÒÓ× × Ð Ú Ö Ó Ð Ø ÒÓ Ò ÖÓ¸ ÕÙ × Ò ¬ Ò Ò Ö Ö¸ Ö Öº
  Ò ×Ø ÔÓ ¸ Ø ÒØÓ Ò Ö Ð ÓÑÓ Ò Ö Ó ÓÒÒÓØ Ò ÐÓ ÕÙ × ÓÑÙÒ ÙÒ ×Ô º
    Ò ÖÓ ÔÖÓÚ Ò Ð Ú Þ Ð Ö Ó γ νος ´ ÒÙ×µ ÕÙ Ò Ð Ð Ò Ù ÑÓ ÖÒÓ ÓÒÒÓØ
 Ö Þ Ý ÕÙ Ò Ö Ó × Ö Ö ÐÓ ÓÑÙÒº               ÒÙ× ÔÖÓÚ Ò ÙÒ ÑÙÝ ÑÔÐ Ú Ö
    Ø ÖÑ ÒÓ× Ò ÖÓ¸ Ò¸ Ò Ø ¸ ÒØ Ð Ó¸ Ò ÖÓ×Ó¸ ÒØ ¸ Ò ÐÓ ¸ Ò Ó¸ Ò Ð¸
 Ò Ò Ó¸ Ò Ò Ö ¸ Ø Ø Ö º
      Ò ×Ù Ð Ö × Ñ Ý ØÖ × Ò ÒØ Ð Å Ø × ¸ Ö ×ØÓØ Ð × ×Ø Ò Ù Ð Ò ÖÓ ÓÑÓ
ÐÓ ÕÙ Ð × × Ò ÐÑ ÒØ ÓÑÙÒ ÙÒ ×Ô º ÈÓ ÑÓ× Ö¸ Ô٠׸ ÕÙ Ð Ö Ó ØÓ×
 ר ¸ ×         Ñ × ¾ ¼¼ ÒÓ׸ ÑÔÖ Ò ÔÓÖ ×Ø            º
      Ò Ð ×Ó Ð ÔÖÓ Ö Ñ ÓÒ Ó ØÓ׸ Ò Ö Ð ÒØ ¬ Ð × × Ó ØÓ× Ò Ö Ð ×
 × Ö¸ × × ÓØÖ × Ð × × Ñ × Ô ÖØ ÙÐ Ö ×¸ Ò Ú Ù Ð ×¸ Ó Ð × × ÕÙ ÓÔ Ö Ò ×Ó Ö Ð
   Ò Ö Ð º ÈÓÖ ÑÔÐÓ׸ Ð Ð ×          ÙÖ     × Ò Ö Ð ØÓ × Ð × ¬ ÙÖ ×¸ Ñ ÒØÖ × ÕÙ
Ð Ð × are equals() Ö ÔÖ × ÒØ Ð ÓÑÔ Ö ÓÒ Ò Ö Ð Ý Ò Ö ÒØÖ Ó ØÓ׺
         Ò Ö Ó ÓÒÒÓØ ÐÓ ÕÙ Ò Ö Ó × ¸ Ò Ð ÓÖ ÒØ ÓÒ Ó ØÓ׸ Ð × ÔÐ ÒØ ÐР׸
 ÓÒ ÔØÓ ÕÙ Ö Ò          ÑÓ× ÔÖ × ÒØ Ö Ý ÑÔÐ ¬ Öº

1.3       El problema fundamental de estructuras de datos
  Ü ×Ø ÙÒ Ð ×       ÔÖÓ Ð Ñ ÙÝ Ó ÙÖÖ Ò × Ø Ò Ù Ù Ò ÔÖ Ø Ñ ÒØ ØÓ Ó× ÐÓ×
 Ñ ØÓ× Ð ÔÖÓ Ö Ñ ÓÒ ÕÙ Ý × ÔÓ× Ð Ò Ö Þ ÖÐ Ò ÙÒ ×ÓÐ Ð × º Ë ØÖ Ø Ð
 ÓÒ ÙÒØÓº ÈÙ ×ØÓ ÕÙ Ò Ð Ñ ÝÓÖ       ÐÓ× ×Ó× ÐÓ× Ð Ñ ÒØÓ× ×ÓÒ Ð Ñ ×ÑÓ Ø ÔÓ¸ × ÔÓ× ¹
 Ð Ó Ø Þ ÖÐÓ Ò ÙÒ Ì        Ò Ö Ó Ø Ð ÓÑÓ ÐÓ ÐÙ×ØÖ Ð Ö Ñ ÍÅÄ Ð ¬ ÙÖ ½º º
  Ð Ö Ñ Ò Ù ×Ø ÓÒ ÑÓ Ð Þ ÐÓ ÕÙ × ÓÒÓ ÓÑÓ Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð ×¹
ØÖÙ ØÙÖ ×      ØÓ× º Ä × Ö ÒØ × Ñ Ò Ö × ÑÔÐ ÒØ ÖÐÓ Ý ×Ù× Ú Ö× × Ö ÙÒר Ò ×
     ÔÐ ÓÒ Ö Ò × ØÓ Ó Ð ÓÖÔÙ× ×Ø Ø ÜØÓº
                                                          Key_Type:T
                                                          Compare_Type:Compare
                                Set
     +insert(in key:T): void
     +search(in key:T): T *
     +remove(in key:T): void
     +size(): size_t
     +swap(inout set:Set<T, Compare>): void
     +join(in set:Set<T, Compare>): Set<T>
     +split(in key:T,out l:Set<T, Compare>,out r:Set<T,
             Compare>): void
     +position(in key:T): int
     +select(in pos:int): T*
     +split_pos(in pos:int,out l:Set<T, Compare>,
                out r:Set<T, Compare>): void




               ÙÖ ½º        Ö Ñ ÍÅÄ      ÙÒ Ð ×     ÒÖ      ÓÒ ÙÒØÓ ´Ë ص
1.3. El problema fundamental de estructuras de datos                          19



        Ä Ð × Set<T, Compare> ÑÓ Ð Þ ÙÒ ÓÒ ÙÒØÓ Ò Ö Ó       ØÓ× Ø ÔÓ T¸ ÓÒ
     Ö Ø Ö Ó ÓÑÔ Ö ÓÒ Compare¸ ÙÝÓ ¬Ò × Ò Ö Ð Þ Ö ÓÔ Ö ÓÒ × ×Ó Ö ÓÒ ÙÒØÓ× × Ò
    ÕÙ ÒÓ× ÒØ Ö × ÓÑÓ ×ØÓ× × ÑÔÐ ÒØ Òº
        À Ý ÑÙ × ÓÖÑ × ÑÔÐ ÒØ Ö Ð Ø ÔÓ Set<T, Compare>º Ä      × ÓÒ Ô Ò
    ×Ù× Ö ÙÒר Ò × Ù×Óº
          ÓÒ ÙÒØÓ×    ØÓ× ÕÙ × ÓÖÖ ×ÔÓÒ Ò ÓÒ Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð × ÒÓÑ Ò Ò
      ÓÒØ Ò ÓÖ × º ÍÒ ÓÒØ Ò ÓÖ ×¸ Ô٠׸ ÙÒ ÓÒ ÙÒØÓ Ð Ñ ÒØÓ× Ð Ñ ×ÑÓ Ø ÔÓº
        Set<T, Compare> ÔÙ    ÑÓ Ð Þ Ö× Ò C++ ÓÑÓ × Ù
½      ÓÒ ÙÒØÓ ÙÒ Ñ ÒØ Ð ½ ≡
         template <typename T, class Compare>
     struct Set
     {
       void insert(const T & key);
       T * search(const T & key);
       void remove(const T & key);
       const size_t size() const;
       void swap(Set<T, Compare> & set);
       void join(Set<T, Compare> * set);
       void split(const T& key, Set<T, Compare> *& l, Set<T> *& r);
       const int position(const T& key) const;
       T * select(const int pos);
       void split_pos(const int & pos, Set<T, Compare> *& l, Set<T, Compare> *& r);
     };
         Ò Ð Ò × Ò Ö Ð ×¸ Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð × ¬Ò ÓÑÓ Ð Ñ ÒØ Ò Ñ ÒØÓ ÙÒ
     ÓÒ ÙÒØÓ Set<T, Compare> Ð Ñ ÒØÓ× Ø ÔÓ T ÓÒ Ð × ÓÔ Ö ÓÒ × × × Ò× Ö ÓÒ¸
     Ù×ÕÙ ¸ ×ÙÔÖ × ÓÒ Ý Ö Ò Ð          Ý ÙÝ × ÒØ Ö × ÙÒ Ñ ÒØ Ð × ×ÓÒ insert()¸
    search()¸ remove() Ý size()¸ Ö ×Ô Ø Ú Ñ ÒØ º
         Ö Ù ÒØ Ñ ÒØ ¸ ÐÓ× Ð Ñ ÒØÓ× Ð ÓÒ ÙÒØÓ × ÒÓÑ Ò Ò Ð Ú × º     ÐÐ Ð ÒÓÑ Ö
       Ô Ö Ñ ØÖÓ key Ò ÑÙ × Ð × ÒØ Ö × Set<T, Compare>º
        swap(set) ÒØ Ö Ñ     ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ× set ÓÒ ÐÓ× thisº Ë ÙÒ Ð ×ØÖÙ ¹
    ØÙÖ       ØÓ× ÓÒ ÕÙ × ÑÔÐ ÒØ Set<T, Compare>¸ Ð ÙÒ × Ú × ×Ø ÓÔ Ö ÓÒ × Ö
    ÑÙÝ Ö Ô º
         Ð Ñ ØÓ Ó join(set) ÙÒ this ÓÒ Ð ÓÒ ÙÒØÓ Ö Ö Ò Ó ÔÓÖ Ð Ô Ö Ñ ØÖÓ setº
       ×ÔÙ × Ð ÓÔ Ö ÓÒ¸ set Ú Ò Ú Óº
        join() ÔÙ   Ø Ò Ö Ú Ö ÓÒ × × ÙÒ Ð Ø ÔÓ ÓÒ ÙÒØÓ Ý Ð ×ØÖÙ ØÙÖ     ØÓ׺ Ä ×
    Ñ × ÓÑÙÒ × ×ÓÒ Ð ÓÒ Ø Ò ÓÒ Ý Ð ÒØ Ö Ô ÓÒº

    1.3.1   Comparaci´n general entre claves
                     o
    ÅÙ × Ú × Ð Ø ÔÓ Ò Ö Ó T × ÓÖ Ò Ð × Ö¸ Ð × Ð Ú × ÔÙ Ò ×ÔÓÒ Ö× Ò ÙÒ
    × Ù Ò ÓÖ Ò          × Ð Ñ ÒÓÖ ×Ø Ð Ñ ÝÓÖ Ó Ú Ú Ö× º Ò ×Ó× ×Ó׸ Ô Ö Ò Ð
    Ö ×ØÓ Ð × ÓÔ Ö ÓÒ × Ý Ð Ð ×       ÓÑÔ Ö ÓÒ Compareº
        Compare × ÙÒ Ð × ÕÙ ÑÔÐ ÒØ Ð ÓÑÔ Ö ÓÒ ÒØÖ Ó× Ð Ñ ÒØÓ×         Ø ÔÓ Tº ÈÓÖ ÐÓ
      Ò Ö Ð¸ Compare ÑÔÐ ÒØ Ð ÓÔ Ö ÓÖ Ö Ð ÓÒ Ð <º ÓÒ ÙÒ Ð ×      ר Ø ÔÓ¸ × ÔÓ× Ð
    Ö Ð Þ Ö Ð Ö ×ØÓ ÐÓ× ÓÔ Ö ÓÖ × Ö Ð ÓÒ Ð ×º ÈÓÖ ÑÔÐÓ¸ × Ø Ò ÑÓ× Ó× Ð Ú × k1 Ý k2
    Ý ÙÒ Ð × Compare<T> ÙÝÓ ÓÔ Ö ÓÖ () ÑÔÐ ÒØ k1 < k2¸ ÒØÓÒ × Ð × Ù ÒØ × Ù Ó
     Ó Ó ÑÔÐ ¬ ØÓ × Ð × ÓÑÔ Ö ÓÒ × ÔÓ× Ð ×
20                                                  Cap´
                                                       ıtulo 1. Abstracci´n de datos
                                                                         o



     if (Compare() (k1, k2)) // ¿k1 < k2?
       // acci´n a ejecutar si k1 < k2
              o
     else if (Compare() (k2, k1)) // ¿k2 < k1?
       // acci´n a ejecutar si k2 < k1
              o
     else // Tienen que ser iguales
       // acci´n a ejecutar si k1 == k2
              o



1.3.2    Operaciones para conjuntos ordenables
Ë Ð ÓÒ ÙÒØÓ × ÓÖ Ò Ð ¸ ÒØÓÒ × ×Ø ÔÙ ÒØ ÖÔÖ Ø Ö× ÓÑÓ ÙÒ × Ù Ò ÓÖ Ò
S =< k0, k2, . . . , kn−1 >¸ ÓÒ n × Ð              Ö ÒÐ         Ð ÓÒ ÙÒØÓº Ò × ×Ó¸ ÔÙ Ò
Ö Ð Þ Ö× Ú Ö × ÓÔ Ö ÓÒ × ×Ó Ö Ð × Ù Ò Sº
     Ð Ñ ØÓ Ó split(key, l, r) Ô ÖØ ÓÒ                        Ð ÓÒ ÙÒØÓ Ò Ó× ×Ù ÓÒ ÙÒØÓ×
l =< k0, k1, . . . , ki > Ý r =< ki+1, ki+2, . . . , kn−1 > × ÙÒ Ð Ð Ú key Ø Ð ÕÙ l <   Ý <
rº ×      Ö¸ l ÓÒØ Ò Ð × Ð Ú × Ñ ÒÓÖ × ÕÙ key Ý r Ð × Ñ ÝÓÖ ×º ×ÔÙ × Ð ÓÔ Ö ÓÒ
this Ú Ò Ú Óº
     Ð Ñ ØÓ Ó position(key) Ö ØÓÖÒ Ð ÔÓ× ÓÒ Ð Ð Ú ÒØÖÓ ÐÓ ÕÙ × Ö Ð
× Ù Ò ÓÖ Ò º Ë key ÒÓ × Ò Ù ÒØÖ Ò Ð ÓÒ ÙÒØÓ¸ ÒØÓÒ × × Ö ØÓÖÒ ÙÒ Ú ÐÓÖ
 ÒÚ Ð Óº
     Ð Ñ ØÓ Ó select(pos) Ö ØÓÖÒ Ð Ð Ñ ÒØÓ × ØÙ Ó Ò Ð ÔÓ× ÓÒ pos × ÙÒ Ð ÓÖ Òº
Ë pos × Ñ ÝÓÖ Ó Ù Ð Ð Ö Ò Ð ¸ ÒØÓÒ × × Ò Ö ÙÒ Ü Ô ÓÒº
      Ò ÐÑ ÒØ ¸ Ð Ñ ØÓ Ó split pos(pos, l, r) Ô ÖØ ÓÒ                          Ð ÓÒ ÙÒØÓ Ò
l =< k0, k1, . . . , kpos−1 > Ý r =< kpos, . . . , kn−1 >º ÍÒ Ü Ô ÓÒ Ó ÙÖÖ Ö × pos ר
 Ù Ö Ð Ö Ò Óº

1.3.3    Circunstancias del problema fundamental
  Ù Ð ×ÕÙ Ö Ò × Ò Ð × × ØÙ ÓÒ × ÙØ Ð Þ ÓÒ¸ ÐÓ× Ð Ñ ÒØÓ× ÙÒ ÓÒ ÙÒØÓ Ø Ò Ò ÕÙ
 Ù Ö Ö× Ò Ð ÙÒ Ð × Ñ ÑÓÖ º Ä Ñ Ò Ö Ö ÔÖ × ÒØ Ö Ò Ñ ÑÓÖ Ø Ð ÓÒ ÙÒØÓ
Ö ÕÙ Ö ÙÒ ×ØÖÙ ØÙÖ               ØÓ× ÙÝ ÓÖÑ Ô Ò         ×Ù× Ö ÙÒר Ò × Ù×Óº
    À Ý Ú Ö Ó× ØÓÖ × ÕÙ Ò Ò Ò Ð × ÒÓ Ó × Ó Ò              Ð ×ØÖÙ ØÙÖ      ØÓ׸ ÒØÖ
ÐÓ× ÕÙ         ר Ö ÐÓ× ÓÒÓ Ñ ÒØÓ× ÕÙ × Ø Ò Ò ×Ó Ö Ð Ö Ò Ð ¸ Ð ×ØÖ Ù ÓÒ
   Ö ÖÒ          ÐÓ× Ð Ñ ÒØÓ׸ Ð × ÓÔ Ö ÓÒ × ÕÙ × Ù× Ö Ò Ý Ð Ö Ù Ò ÓÒ ÕÙ ×Ø ×
× ÒÚÓ Ö Òº
    Ä Ö ÒÐ                      ÒØÖ    Ð Ø ÔÓ Ñ ÑÓÖ º ÍÒ Ö Ò Ð          ÑÙÝ Ö Ò
Ö ÕÙ Ö Ö Ñ ÑÓÖ × ÙÒ Ö ´ × Óµ Ó Ø Ö Ö ´ÓØÖÓ× Ñ Ó× Ñ × Ð ÒØÓ×µ Ý ×Ø              × ÓÒ
    Ø Ö      ÐÑ ÒØ Ð Ø ÔÓ ×ØÖÙ ØÙÖ             ØÓ׺
    À Ý Ó × ÓÒ × Ò ÕÙ Ð ÙÒ × Ð Ú × ×ÓÒ Ñ × ÔÖÓÔ Ò× ×           ÖØ × ÓÔ Ö ÓÒ × ÕÙ
ÓØÖ ×º ÈÓÖ ÑÔÐÓ¸ × Ð × Ð Ú × Ù × Ò Ô ÐÐ Ó׸ ÒØÓÒ × Ð × Ö ÕÙ Ð × Ð ØÖ × Ü
Ó Ý ×ÓÒ ÔÓ Ó Ö Ù ÒØ ׸ Ý ÕÙ Ð × ÚÓ Ð × ×ÓÒ Ñ × Ö Ù ÒØ ׸ ÔÙ Ò Ö Ò ÙÒ
 רÖÙ ØÙÖ         ØÓ× ÕÙ Ø Ò       Ö ÙÔ Ö Ö Ö Ô Ñ ÒØ Ð Ú × ÕÙ Ø Ò Ò¸ ÔÓÖ ÑÔÐÓ¸
      ÓÑÓ × ÙÒ Ð ØÖ º
    Ë ÙÒ Ð ÔÖÓ Ð Ñ ¸ Ð ÙÒ × ÓÔ Ö ÓÒ × ×ÓÒ Ñ × ÔÖÓ Ð × ÕÙ ÓØÖ × Ò ÐÙ× Ú ¸ Ò
ÑÙ Ó× ×Ó׸ ÒÓ × ÙØ Ð Þ Ò ØÓ × Ð × ÓÔ Ö ÓÒ × Ó Ð Ñ ÝÓÖ        Ð × ØÚ       × ×Ó Ö Ð
 ÓÒ ÙÒØÓ × ÓÒ ÒØÖ Ò Ò ÙÒ Ó ÔÓ × ÓÔ Ö ÓÒ ×º Ò ×ØÓ× ×Ó׸ Ð ×ØÖÙ ØÙÖ               ØÓ×
ÔÙ       × Ò Ö× Ô Ö ÓÔØ Ñ Þ Ö Ð ÓÔ Ö ÓÒ Ñ × Ö Ù ÒØ º
1.4. Dise˜ o de datos y abstracciones
         n                                                                           21



1.3.4   Presentaciones del problema fundamental
   Ò Ú Ð ÙÒ ÓÒ Ð Ü ×Ø Ò Ú Ö × ÒØ ÖÔÖ Ø ÓÒ × Ð Ø ÔÓ Ò Ö Ó ÓÒ ÙÒØÓ ÙÒ Ñ Ò¹
Ø Ð ½ º À ݸ Ò × Ò ¸ Ó× ÓÒ× Ö ÓÒ × Ò × Ö × ÐØ Ö× º
    Ä ÔÖ Ñ Ö ÓÒ× Ö ÓÒ ÓÒ ÖÒ Ð Ö Ô Ø Ò Ó ÒÓ ÐÓ× Ð Ñ ÒØÓ׺ Ù Ò Ó
× Ô ÖÑ Ø Ö Ô Ø Ö ÐÓ× Ð Ñ ÒØÓ× ÙÒ ÓÒ ÙÒØÓ¸ ÒØÓÒ × ×Ø × Ð ÒÓÑ Ò ÑÙÐØ ¹
 ÓÒ ÙÒØÓ º
      ÒÐ     Ð ÓØ   ר Ò Ö C++¸ Ò Ð ÒØ ÐÐ Ñ stdc++¸ Ð ÓÒ ÙÒØÓ × Ð ÓÒÓ
 ÓÑÓ set<T, compare> Ñ ÒØÖ × ÕÙ Ð ÑÙÐØ ÓÒ ÙÒØÓ ÓÑÓ multiset<T, compare>º
    Ä × ÙÒ ÓÒ× Ö ÓÒ × Ð ÐÑ Ò Ñ ÒØÓ Ô Ö × ÓÖ Ò Ó× Ø ÔÓ (Ã Ý, Ð Ñ)º
Ä         × ÙÒ Ø Ð ×Ó Ø Ú ÕÙ Ö ÙÔ Ö ÙÒ Òר Ò             ÐÑ ∈ ÐÑ        ÙÒ
 Ð Ú Ý ∈ à ݺ         ר Ð ×      ÓÒ ÙÒØÓ × Ð ÓÒÓ ÓÑÓ Ñ Ô Ó   ½¼ º ÙÒ ÓÐ×
 Ð Ú × ÔÙ Ò Ö Ô Ø Ö× ¸ ÒØÓÒ × Ð Ñ Ô Ó × Ð       ÑÙÐØ Ñ Ô Ó º
      Ò Ð Ð ÓØ ר Ò Ö C++ Ð Ñ Ô Ó × Ð ÓÒÓ ÓÑÓ map<Key, Elem, compare>
Ñ ÒØÖ × ÕÙ Ð ÑÙÐØ Ñ Ô Ó ÓÑÓ multimap<Key, Elem, Compare>º Ò ÐÓ× Ñ Ô Ó× ×Ù Ð
 ÑÔÐ ÒØ Ö× Ð ÓÔ Ö ÓÖ [] × ÙÒ Ð Ð Ú º

1.4     Dise˜o de datos y abstracciones
            n
 Ð × ÒÓ       ×ØÖ ÓÒ × Ý ×Ù× ÓÒ× Ù ÒØ × Ì × ÙÒ ÖØ ÕÙ × ÔÖ Ò ÓÒ Ð ÜÔ ¹
Ö Ò º ÕÙ Ö ÖÐ ÒÓ Ø Ò ÓØÖ ÐØ ÖÒ Ø Ú ÕÙ Ò Ö ÒØ Ö× Ö ×ÔÓÒ× Ð Ñ ÒØ ÔÖÓ Ð Ñ ×
Ö Ð × ÔÖÓ Ö Ñ ÓÒº ÈÓÖ Ö ×ÔÓÒ× Ð        × ÒØ Ò Ð Ø ØÙ ÓÒÓÖ Ð Ö ×ÔÓÒ Ö
ÔÓÖ ÐÓ× ÕÙ ÚÓ Ó׸ ÐÓ Ù Ð ÒÓ ×ÓÐÓ ×Ø ÓÒ ÓÒ Ó Ð ÓÒ× Ò ÕÙ Ð ÔÖ Ø ÒØ
ØÒ        Ö    ×Ù ÓÒÓ Ñ ÒØÓ¸ × ÒÓ ×Ù ÓÒ ×Ø     Ý Ù ÖÞ       Ö Ø Öº
     Ò ÐÓ ÕÙ × Ù     ר × ÓÒ¸ × ÔÐ ÒØ Ò Ð ÙÒ × Ö ­ Ü ÓÒ × ÕÙ       ÓÒ× Ö Ö Ð
 ÔÖ Ò Þ Ô Ö Ò Ö ÒØ Ö Ñ ÓÖ Ð ÔÖ Ò Þ       Ð × ÒÓ      ØÓ× Ý ÔÖÓ Ö Ñ ÓÒº
1.4.1   Tipos de abstracci´n
                          o
Ë ÙÒ Ð ÒØ Ö × ÕÙ × Ø Ò Ð ÑÓÑ ÒØÓ              × Ò Ö ÙÒ ×ØÖ ÓÒ Ó ×ØÖÙ ØÙÖ            ØÓ׸
  ר ÔÙ      Ð × ¬ Ö× Ò ÓÖ ÒØ              ÐÓ× ØÓ× ¸ ÓÖ ÒØ               Ð ­Ù Ó Ù ÓÖ Ò¹
Ø            Ð ÓÒ ÔØÓ Ó ×ØÖ ÓÒ º
     ÍÒ ×ØÖ ÓÒ ÓÖ ÒØ                  ÐÓ× ØÓ× × ÕÙ ÐÐ ÙÝÓ ¬Ò ר Ò ÙÞ Ó ÔÓÖ Ð
ÓÖ Ò Þ ÓÒ ÐÓ× ØÓ× Ò Ð ÓÑÔÙØ ÓÖº Ð Ú Þ¸ Ø Ð ÓÖ Ò Þ ÓÒ Ó                               Ö¹
ÕÙ Ö Ñ ÒØÓ×        × ÑÔ ÒÓ¸ ÓÖÖÓ          ×Ô Ó Ó Ð ÙÒ ÓØÖÓ ÕÙ Ø Ò Ð ÓÑÔÙØ ÓÖ¸
× ×Ø Ñ ÓÔ Ö Ø ÚÓ Ù ÓØÖÓ× ÔÖÓ Ö Ñ × × ×Ø Ñ º ר × Ð ×Ó ÑÙ × Ð × ×ØÖÙ ¹
ØÙÖ ×       ØÓ× ÕÙ ×ØÙ Ö ÑÓ× Ò ×Ø Ø ÜØÓº ÑÔÐÓ× ×Ø × Ð × × ÓÖ ÒØ ÓÒ ÐÓ×
  ÓÒר ØÙÝ Ò ÐÓ× ÖÖ ÐÓ׸ Ð × Ð ×Ø × ÒÐ Þ × Ý Ð × Ú Ö× × ×ØÖÙ ØÙÖ × Ö ÓÐ ÕÙ × Ö Ò
  ×ØÙ     × Ò ×Ø Ø ÜØÓº
     ÅÙ Ó× ÔÖÓ Ð Ñ × ÓÑÔÙØ ÓÒ Ð × Ü Ò ÙÒ Ô ØÖÓÒ ÔÖÓ × Ñ ÒØÓ ×Ø ÒØ ÚÓ
Ý ÙÒ ÓÖÑ º Ò Ø Ð × × ØÙ ÓÒ ×¸ ÔÙ × Ö ÑÙÝ ÓÒÚ Ò ÒØ ×ÔÓÒ Ö ÙÒ ×ØÖÙ ¹
ØÙÖ        ØÓ× ÕÙ Ö ÔÖ × ÒØ Ð ÓÖ Ò Ó ×ÕÙ Ñ            ÔÖÓ × Ñ ÒØÓ ÐÓ× ØÓ׺ Ò ×Ø
   ×Ó ÑÓ× ÕÙ Ð ×ØÖÙ ØÙÖ ×Ø ÓÖ ÒØ                     Ð ­Ù Ó Ó Ð Ô ØÖÓÒº ÈÓÖ ÑÔÐÓ¸ × ÐÓ×
    ØÓ×    Ò ÔÖÓ × Ö× × ÙÒ Ð ÓÖ Ò Ô Ö ÓÒ Ò Ð × ×Ø Ñ ¸ ÒØÓÒ × ÙÒ ×ÔÓ× ÓÒ
 ½¼
     Ð Ò Ð × Ñ ÔÔ Ò ¸ ÙÝ ÓÒÒÓØ ÓÒ Ñ Ø Ñ Ø × Ò ¬ ÙÒ ÓÒ Ò Ð × ÒØ Ó Ð Ø ÓÖ
ÓÒ ÙÒØÓ׺ ÈÓÖ ÓØÖ Ô ÖØ ¸ × ÑÔÓÖØ ÒØ ר Ö ÕÙ Ð Ø ÖÑ ÒÓ Ù Ö ÒØ Ñ ÒØ ÔØ Ó ÔÓÖ Ð Ê         º
22                                                Cap´
                                                     ıtulo 1. Abstracci´n de datos
                                                                       o



    ÐÓ× ØÓ× Ò ÙÒ × Ù Ò ÔÙ Ö ÔÖ × ÒØ Ö Ð ÓÖ Ò ÐÐ                     º Ì Ð ×ØÖÙ ØÙÖ × ¹
ÒÓÑ Ò ÓÐ Ý × Ö ×ØÙ               Ò Ü ¾º ´Ô Ò ½¿½µº ÆÓØ ÑÓ× ÕÙ Ò ×Ø ×Ó ÒÓ ×
Ô Ò× Ò Ð ÓÖ Ò Þ ÓÒ ÕÙ ÐÓ× ØÓ× Ø Ò Ò Ò Ñ ÑÓÖ ¸ × ÒÓ Ò Ð ÓÖ Ò Ó Ô ØÖÓÒ Ò
ÕÙ ×ØÓ× × ÔÖÓ × Òº
        Ò ÐÑ ÒØ ¸ Ð × ÒÓ ÙÒ ×ØÖÙ ØÙÖ              ØÓ× ÔÙ        Ð Ø Ö Ð Ö ÔÖ × ÒØ ÓÒ
ÙÒ ÓÒ ÔØÓ Ó ×ØÖ ÓÒ ÓÒÓ              ÓÒ Ñ Ö × ÓÑÔÖ Ò Ö Ð ÔÖÓ Ð Ñ Ý¸ ÓÒ× Ù ÒØ ¹
Ñ ÒØ ¸ × ÒÚÓÐÚ Ö× ÓÑÓ Ñ ÒØ Ò ×Ù ×ÓÐÙ ÓÒº Ò ×Ø ×Ó¸ ÑÓ× ÕÙ Ð ×ØÖÙ ¹
ØÙÖ          ØÓ× ×Ø ÓÖ ÒØ          Ð ÓÒ ÔØÓº Ä           × × ÑÔÐ ¬ Ö Ð ÔÖÓ Ö Ñ ÓÖ Ó
ÐÓ× Ù×Ù Ö Ó× Ð ÒØ Ò Ñ ÒØÓ Ð ÔÖÓ Ð Ñ Ý ×Ù ×ÓÐÙ ÓÒº
     À Ý ÑÙ Ó× Ñ ÒÓ× Ô Ö Ö ×ÓÐÚ Ö ÔÖÓ Ð Ñ ×º Ù ÒØ Ò ÕÙ Å Ð Ö Ý¸ ÔÖ ÙÖ×ÓÖ
    Ð Ø ÓÖ Ð ØÖÓÑ Ò Ø ¸ ÒÓ Ø Ò ×Ù¬ ÒØ ÓÖÑ ÓÒ Ñ Ø Ñ Ø Ô Ö ÜÔÐ Ö ÐÓ×
  ÒÓÑ ÒÓ× Ð ØÖÓÑ Ò Ø Ó× ×Ù× ÜÔ Ö Ñ ÒØÓ׺ Ä Ò Ð                         Ö Ý ÐÓ ÓÒ Ù Ó
 Ö Ö ×Ù× ÔÖÓÔ × ×ØÖ ÓÒ × Ö ¬ ׸ ÔÖÓÚ Ò ÒØ × ×Ù× Ó × ÖÚ ÓÒ × ÜÔ Ö Ñ ÒØ Р׸
  Ô ÖØ Ö Ð × Ù Ð × ÙÒ Ó Ý ÜÔÐ Ó Ð Ð ØÖÓÑ Ò Ø ×ÑÓº Ð Ù Ð ÕÙ Ö Ý¸ ÑÙ ×
Ú × Ö ÑÓ× ×ØÖ ÓÒ × ÕÙ ÒÓ× Ô ÖÑ Ø Ò ÓÑÔÖ Ò Ö Ñ ÓÖ ÙÒ Ð ÓÖ ØÑÓº ר ×
   ×ØÖ ÓÒ × ÓÒ ÓÖÑ Ò ×ØÖÙ ØÙÖ ×            ØÓ׺ ÍÒ ÑÔÐÓ ÑÙÝ ÒÓØ Ð × Ð ÓÒ ÔØÓ
      Ö Óº Ø ÑÓÐÓ Ñ ÒØ ¸ Ð Ø ÖÑ ÒÓ Ö Ó ÔÖÓÚ Ò                 Ö ¬ Ó ¸ ÔÙ × ÐÓ× Ö Ó× ×ÓÒ
 ÜÔÖ × Ó× Ò Ø ÖÑ ÒÓ× Ö ¬ Ó׺ Ë Ò Ñ Ö Ó¸ Ò Ö Ð ¸ ÙÒ Ö Ó ÑÓ Ð Þ Ð ÓÒ ÔØÓ
    Ö Ð ÓÒ ×Ó Ö Ð Ù Ð Ü ×Ø ØÓ Ó ÙÒ ÓÖÔÙ× Ñ Ø Ñ Ø Óº Ô × Ö Ð ÓÖÔÙ× Ý¸ ÕÙ Þ
ÔÓÖÕÙ ×Ø × Ò ÓÑÔÐ ØÓ¸ ÐÓ× Ö Ó× Ó Ö Ò ÙÒ Ú × ÓÒ Ö ¬                 Ð Ö Ð ÓÒ Ñ Ø Ñ Ø
 ÓÒ Ð ÕÙ × Ñ × ÓÑÓ ØÖ             Öº ר × ÓØÖ Ö ÞÓÒ ÕÙ Ùר ¬ Ð × ÒÓ ÙÒ
 רÖÙ ØÙÖ          ØÓ ÙÒ Ñ Ò Ö Ö ÔÖ × ÒØ Ö Ð ÔÖÓ Ð Ñ Ò Ø ÖÑ ÒÓ× Ñ × × Ò ÐÐÓ׺
       רÓ× ØÖ × Ø ÔÓ× ÓÖ ÒØ ÓÒ        Ð ÙÒ ÓÖÑ Ò Ð × ¬ Ò Ð ¬Ò Ó Ð Ô Ö ÕÙ ×
  × Ò Ó × × Ð ÓÒ ÙÒ ×ØÖÙ ØÙÖ              ØÓ׺ Ä Ð × ¬ ÓÒ ÒÓ × Ü Ø Ò Ü ÐÙÝ ÒØ º
ÍÒ ×ØÖÙ ØÙÖ              ØÓ× ÔÙ Ò Ö Ð Ú Þ¸ Ó Ò Ö ÒØ × ÑÓÑ ÒØÓ׸ Ó ØÓ Ó× Ó
 Ù ÐÕÙ Ö         ÐÓ× Ø ÔÓ× ÓÖ ÒØ ÓÒº È ÖÓ Ø ÖÑ Ò Ö Ò ÙÒ ÓÒ Ð × Ö ÙÒר Ò ×
 Ù Ð × Ð ÓÖ ÒØ ÓÒ ÙÒ ×ØÖÙ ØÙÖ               ØÓ׸ ÔÙ      Ù Ö Ð ÔÖÓ Ö Ñ ÓÖ Ò ×Ù × ÒÓ
Ó × Ð ÓÒº

1.4.2   El principio fin-a-fin
  ÓÒ× Ö ÑÓ× Ð Ì          ÙÖ Ý Ö Ô Ø ÑÓ× Ð ÔÖ ÙÒØ ÙÒ Ñ ÒØ Ð Ô Ö ÕÙ × ÖÚ
  Ù Ð × ×Ù ¬Ò Ð        Ò Ð × ÓÒ Ü ½º½º ´Ô Ò µ × ÔÖ Ø Ò Ó Ò Ö Ð Þ Ö ÓÔ Ö ¹
  ÓÒ × Ò Ö ÒØ × Ð Ù Ó ÙÒ ¬ ÙÖ ×Ó Ö Ð ÙÒ ÓÒ Ó                  ÓÒØÖ ×Ø º ÓÒ ×Ø
¬Ò ¬Ò Ó¸ Ð × ÓÔ Ö ÓÒ × Ð Ì            ÙÖ ¸ Ù Ö¸ ÑÓÚ Ö¸ Ø Ø Ö ¸ Ø Ò Ò × Ò¹
Ø Ó×ÒÒ ×             ÓÒÓ Ö Ù Ð × Ð ¬ ÙÖ Ò Ù ×Ø ÓÒº È Ò× ÑÓ׸ ÕÙ ×Ù Ö × ÒÓ
ØÙÚ × ÑÓ× Ð ÖÓ Ô Ö ÕÙ × Ù× Ö Ð Ì        ÙÖ       Ä Ö ×ÔÙ ×Ø ¸ ÒÓ Ø Ò Ó Ú Ò ×ØÓ×
Ø ÑÔÓ׸ × ÕÙ ÒÓ× × Ö ÑÙÝ       Ð ÓÑÔÖ Ò ÖÐÓº Ë ÒÙ ×ØÖÓ ÒØ Ò Ñ ÒØÓ ÒÓ ×ØÙÚ ×
 Ð ÖÓ¸ ÒØÓÒ ×¸ ÕÙ Þ ¸ ÓÑ Ø Ö ÑÓ× Ð ÖÖÓÖ ÒØ ÒØ Ö ÑÔÐ ÒØ Ö Ð Ì            ÙÖ ¸ Ð
 ٠и ÓÑÓ Ý × Ñ Ò ÓÒÓ¸ × ×ØÖ ØÓº
       ÓÖ Ô Ò× ÑÓ× Ò Ù Ð × Ö Ð ÓÖÑ ÙÒ Ì Figure × ×Ø רÙÚ × ×Ø Ò Ó
  Ð ÙÐÓ× ÓÑ ØÖ Ó× Ò ÐÓ× Ù Ð ×¸ Ò ÐÙ Ö      Ù Ö¸ × Ð ÙÐ × Ò Ö × ÒØ Ö× ÓÒ ×
 ÒØÖ ¬ ÙÖ ×º È Ö ×Ø ¬Ò¸ Ð × ÓÔ Ö ÓÒ × Ð Ì             ÙÖ       ÒÓ Ø Ò Ö Ò ÑÙ Ó
× ÒØ Óº
    ÍÒ ÔÖ Ò Ô Ó     × ÒÓ × ×Ø Ñ × × ÓÒÓ ÓÑÓ Ð ÔÖ Ò Ô Ó ¬Ò¹ ¹¬Ò º ר ÓÒ× ×Ø
 Ò ÒÓ ×Ô ¬ Ö¸ Ñ ÒÓ× × Ò Ö¸ ÑÙ Ó Ñ ÒÓ× ÑÔÐ ÒØ Ö¸ Ñ × ÐÐ Ð ¬Ò ÕÙ × ÓÒÓÞ
1.4. Dise˜ o de datos y abstracciones
         n                                                                                        23



Ý × Ù Ö Ô Ö Ð ÔÖÓ Ö Ñ º Î ÓÐ Ö ×Ø ÔÖ Ò Ô Ó ÔÙ Óר Ö × Ù ÖÞÓ Ú ÒÓ¸ ÔÙ × ×ÓÐÓ
 × Ò ÐÓ× ÔÙÒØÓ× ¬Ò Ð × Ð ÔÖÓ Ö Ñ ¸ Ó Ò ×Ù× Ù×Ù Ö Ó× ¬Ò Р׸ Ò ÕÙ × Ø Ò ØÓ Ó Ð
 ÓÒÓ Ñ ÒØÓ Ò × Ö Ó Ô Ö × Ò Ö ÙÒ ÔÖÓ Ö Ñ ÓÒ × ÒØ Ó ½ º
     Ò Ð ÑÔÐÓ Ð Ì             ÓÑÔÐ Ó ¸ Ø Ð ÓÑÓ ÐÓ ÑÓ× ØÖ Ø Ó¸ ÕÙ ÓÒÓ ÑÓ×
   Ö       ×Ù ¬Ò ÄÓ× ÒÙÑ ÖÓ× ÓÑÔÐ Ó× Ø Ò Ò ÑÔÐ ÔÐ ÓÒ Ò Ò × Ý Ò Ò ¹
Ò Ö Ö ÞÓÒ ÔÓÖ Ð Ù Ð ÙÒ ÔÖÓ Ö Ñ ÓÖ ÔÙ Ö Ú Ö× Ø ÒØ Ó ÒÖ ÕÙ Ö Ð Ì                    ÓÒ
Ñ ØÓ Ó× Ó Ð × × Ö Ú × ÕÙ         Ð Ø Ò ×Ù ÙØÙÖ Ñ Ò ÔÙÐ ÓÒº Ë ÔÙ Ö ¸ ÔÓÖ ÑÔÐÓ¸
Ñ Ò Ö ÓÓÖ Ò × ÔÓÐ Ö ×º Ë Ò Ñ Ö Ó¸ ÑÔÐ Ö Ð Ì                ÓÑÔÐ Ó ÒÓ Ø Ò × Ò¹
Ø Ó × ÒÓ × Ø Ò Ð ÖØ ØÙ ÕÙ Ð × ÓÓÖ Ò × ÔÓÐ Ö × × Ö Ò Ù× × ÔÓÖ ÐÓ× Ù×Ù Ö Ó×
 Ú ÒØÙ Ð × Ð Ì         ÓÑÔÐ Ó º
    Ä Ó × ÖÚ ÓÒ ÒØ Ö ÓÖ ÒÓ × Ö Ð Þ Ô Ö ÓÒÓÑ Þ Ö ØÖ Ó ¹ÙÒ Ò Ò                 ÓÒ×ÙÒÓ
 ÓÒ Ð ÔÖ Ò Ô Ó ¬Ò¹ ¹¬Ò¹¸ × ÒÓ ÔÓÖÕÙ Ð ÒØ Ö × Ó Ò ÙÒ Ì         ÓÑÔÐ Ó ÜØ Ò Ó
 ÓÒ ÓÓÖ Ò × ÔÓÐ Ö × ÔÙ Ö Ñ Ò Ö ÓØÖ ÒØ ÖÔÖ Ø ÓÒ¸ Ò ÙÝÓ ×Ó¸ Ð ÜØ Ò× ÓÒ
ÔÙ Ö × Ö ÙÒ ×ØÓÖ Óº
    ÍÒ Ì          × Ö Ñ Ò ÑÓ Ý ×Ù¬ ÒØ º ÈÓÖ Ñ Ò ÑÓ ÔÖ Ø Ò ÑÓ× Ò Ö ÕÙ ÒÓ
Ø Ò Ñ × ÐÓ Ò × Ö Óº ÈÓÖ ×Ù¬ ÒØ ÕÙ Ö ÑÓ× Ö ÕÙ                ÓÒØ Ò Ö ØÓ Ó ÐÓ Ò × Ö Ó
Ô Ö ×Ø Ò ÖÐÓ Ð ¬Ò Ô Ö Ð Ù Ð Ù ¬Ò Óº ר Ð Ö ×Ø × ÖÖ Ö × × Ö Ð Ø ÚÓ¸ ÔÙ ×
  ÔÒ        Ð ¬Ò Ý ×Ù ÒØ ÖÔÖ Ø ÓÒº          ÐÐ ¸ ÒØÓÒ ×¸ Ð Ö Ø Ö × Ò Ð ÕÙ Ø Ò ¸
Ô Ö Ð Ü ØÓ ÙÒ ÔÖÓÝ ØÓ¸ Ð ÕÙ Ð ¬Ò ר Ð Ö Ñ ÒØ ¬Ò Ó Ý ÕÙ ÐÓ× Ô ÖØ Ô ÒØ ×
ÒÓ ×ÓÐÓ ÐÓ Ø Ò Ò Ð ÖÓ¸ × ÒÓ ÕÙ ×Ø Ò ÓÑÔÖÓÑ Ø Ó× ÓÒ Ðº
    ÉÙ Þ ÙÒ ÓÖ ×ÑÓ Ë ÒØ¹ ÜÙÔ ÖÝ ÜÔÖ × Ñ ÓÖ Ð × ÒØ Ó Ñ Ò Ñ Ð                   Ý ×Ù¬¹
   Ò      Ð ÔÖ Ò Ô Ó ¬Ò¹ ¹¬Ò È Ö ÕÙ Ð Ô Ö ÓÒ × Ð ÒÞ ÒÓ Ù Ò Ó ÒÓ Ý
Ñ × Ò ÕÙ Ò Ö¸ × ÒÓ Ù Ò Ó ÒÓ Ý Ñ × Ò ÕÙ ×ÙÔÖ Ñ Ö ½½º
1.4.3    Inducci´n y deducci´n
                o           o
ÁÒ Ù ÓÒ × Ò ¬ Ö × ÐÓ Ô ÖØ ÙÐ Ö                  ÐÓ Ò Ö Ð Ñ ÒØÖ × ÕÙ      Ù ÓÒ × Ò Ð
 Ö × ÐÓ Ò Ö Ð                 ÐÓ Ô ÖØ ÙÐ Öº Ù Ò Ó × × Ò Ò ×ØÖ ÓÒ ×¸ ÔÓÖ ÓÒ
 ÓÑ ÒÞ Ö º
      × ÙÒ ÔÖ Ò Ô Ó ÓÒÓ Ó Ò Ù ÓÒ Ý × ÒÓ Ö × ÐÓ ÓÒ Ö ØÓ                    ÐÓ ×ØÖ ØÓº
  Ò ÓØÖ × Ô Ð Ö ×¸ ÓÖ Ö ×ØÖ ÓÒ × Ô ÖØ Ö Ð ÜÔ Ö Ò ÓÒ Ö Ø Ö Ðº Ò ×
× ÒØ Ó¸ Ù Ò Ó ÒÓ × Ø Ò ÓÒÓ Ñ ÒØÓ Ò Ð Ö                    ÙÒ ÔÖÓ Ð Ñ      Ó¸ Ð ÔÖÓ ×Ó
    Ò        ÓÒ         ÓÑ ÒÞ Ö Ô ÖØ Ö       ÒÓÑ ÒÓ× ÓÒ Ö ØÓ× Ð ÔÖÓ Ð Ñ Ý¸ ÐÙ Ó¸
Ô ÖØ Ö × × Ô ÖØ ÙÐ Ö             ׸ ÒØ ÒØ Ö ¬Ò Ö ×ØÖ ÓÒ ×º
      Ò Ð ÔÖÓ Ö Ñ ÓÒ Ó ØÓ׸ Ü ×Ø Ò Ó× Ñ Ò ×ÑÓ×                 Ò Ö Ð Þ ÓÒ Ð Ö Ò
     Ð × × Ý Ð × ÔÐ ÒØ ÐР׺ Ä Ö Ò ÓÒ ÖÒ ÐÓ× ØÓ׸ Ñ ÒØÖ × ÕÙ Ð × ÔÐ ÒØ ÐÐ × Ð
 Ó Óº
    Ä Ö Ò × ÔÐ Ô Ö Ð Ò Ö Ò Ö Ð                     × Ý ÓÑÔÓÖØ Ñ ÒØÓ× ÓÑÙÒ × ÙÒ
   ÖØ Ð × Ó ØÓº Ä × Ð × × Ö Ú × Ð × ¬ Ò Ý ÔÓÖØ Ò Ô ÖØ ÙÐ Ö                   × Óѹ
ÔÓÖØ Ñ ÒØÓ Ò Ö Ð Ý Ò Ú Ð ×            ×ØÖ ÓÒº Ù Ò Ó × ÒØ ¬ÕÙ Ò Ð × × Ó Ì ¸ Ù×ÕÙ
ÕÙ × ÐÓ ÓÑÙÒ Ý ×Ó ÐÐ Ú ÐÓ ÐÓ Ò Ö Ð ØÖ Ú × Ð × × × × Ó ×ØÖ Ø ×º
    À Ý Ó× ×Ô ØÓ× Ò Ö Ð Þ Ö Ñ ÒØ Ð Ö Ò                   Ð × ×º Ð ÔÖ Ñ ÖÓ ÐÓ ÓÑÔÓÒ Ò
ÐÓ× ØÖ ÙØÓ× Ó × Ð × Ö Ø Ö ×Ø × ÙÒ Ó ØÓ Óº Ò Ð ×Ó Ð Ì                           ÙÖ ¸
ÙÒ ØÖ ÙØÓ Ò Ö Ð ÐÓ ÓÒ ÓÖÑ Ð ÔÙÒØÓ Ö Ö Ò ÓÑÙÒ ØÓ × Ð × ¬ ÙÖ × Ô ÖØ ¹
 ½½
      ÌÖ Ù ÓÒ   Ð ÙØÓÖ       ÁÐ × Ñ Ð   ÕÙ Ð Ô Ö    Ø ÓÒ ×Ó Ø   ØØ ÒØ   ÒÓÒ ÕÙ Ò   Ð Ò³Ý   ÔÐÙ× Ö Ò
 ÓÙØ Ö¸ Ñ × ÕÙ Ò   Ð Ò³Ý   ÔÐÙ× Ö Ò     Ö ØÖ Ò Ö   º Ë ÒØ¹ ÜÙÔ Öݺ Ì ÖÖ      × ÓÑÑ × º
24                                              Cap´
                                                   ıtulo 1. Abstracci´n de datos
                                                                     o



ÙÐ Ö ×º Ð × ÙÒ Ó ×Ô ØÓ         ÒÖÐ        × ÙÒ ÓÒ Ð Ý Ø Ò Ð × ÓÔ Ö ÓÒ ×º Ò Ð
  ×Ó Ð Ì          ÙÖ ¸ ÐÓ× Ñ ØÓ Ó× Ú ÖØÙ Ð × draw()¸ move()¸ Ø Ø Ö ¸ Ò Ö Ð Þ Ò
ÓÔ Ö ÓÒ × ÓÑÙÒ × ØÓ × Ð × ¬ ÙÖ ×º
      ÓÑÓ Ý ÐÓ Ò ÑÓ׸ Ð ÙÒÓ× Ð ÓÖ ØÑÓ× ×ÓÒ ×Ù× ÔØ Ð × × Ö Ò Ö Ó× Ó Ð
 ÓÖÑ ÔÐ ÒØ ÐÐ º ÓÒ× Ö ÑÓ× Ð ÔÖÓ Ð Ñ ÓÖ Ò Ö ÙÒ × Ù Ò                      Ð Ñ ÒØÓ× ÕÙ
× Ö ØÖ Ø Ó Ò Ð Ô ØÙÐÓ Ü ¿º ÆÓØ ÑÓ× ÕÙ Ð ÒÙÒ Ó ÒÓ Ñ Ò ÓÒ Ð Ø ÔÓ Ð Ñ ÒØÓ×
  ÓÖ Ò Ö ×ÓÐÓ ×Ô ¬ ÕÙ × ØÖ Ø ÙÒ × Ù Ò º ÈÓ ÑÓ× ÓÖ Ò Ö Ô ÐÐ Ó׸ ÒØ ÖÓ×
Ó Ð Ñ ÒØÓ×      Ù ÐÕÙ Ö ÓØÖÓ Ø ÔÓ Ó Ð Ñ ×ÑÓ ×ÕÙ Ñ º ÇÖ Ò Ö × Ò Ô Ò ÒØ
   Ð ØÓº Ò ×Ø Ð ×        ÔÖÓ Ð Ñ × × ÔÙ Ò × Ò Ö ÙÒ ÓÖ Ò Ñ ÒØÓ Ò Ö Ó ÙÝÓ
Ô Ö Ñ ØÖÓ × Ö Ð Ø ÔÓ Ð Ñ ÒØÓ׺
      × ÑÔÓÖØ ÒØ ר Ö ÕÙ ÙÒ ÓÑÔÓÖØ Ñ ÒØÓ Ò Ö Ó Ô Ö                 ×ÔÙ × ÓÒÓ Ö
 ÓÑÔÓÖØ Ñ ÒØÓ× ÓÒ Ö ØÓ× Ý ÒÓ Ð ÓÒØÖ Ö Óº Æ × ÕÙ Ö Ù Ò Ó × ÔÓ× ÙÒ ÑÔÐ
 ÜÔ Ö Ò ¸ ÒÓ ×        ÔÖÓ Ö Ñ Ö Ó Ó Ò Ö Ó × Ò ÒØ ×           ÖÐÓ Ú Ö ¬ Ó Ü Ùר ¹
Ú Ñ ÒØ ÓÒ Ð Ñ ÒÓ× ÙÒ Ø ÔÓ         ØÓ ÓÒÓ Ó Ý ÓÒ Ö ØÓº
    È Ö Ð × Ó× Ø Ò ×         Ò Ö Ð Þ ÓÒ¸ Ö Ò Ý Ø ÔÓ× Ô Ö Ñ ØÖ Þ Ó׸ Ð Ñ ÒÓ
 ÓÑ ÒÞ Ò ÐÓ ÓÒ Ö ØÓ Ý × Ö             ÐÓ ×ØÖ ØÓ¸ ÒÓ Ð Ö Ú ×º ÈÓ ÑÓ× Ö ÕÙ ×Ø
 × Ð ×Ø ÐÓ Ù Ò Ó × × Ò Ý ÔÖÓ Ö Ñ ÓÒ × ÒØ Óº
      ÓÒ ÓÖÑ × Ò ÜÔ Ö Ò ÓÒ Ö Ø ¸ ÙÒ × Ò ÓÖ ÔÙ                ÓÒ× Ö Ö Ð ÙÒ × Ò¹
 Ö Ð Þ ÓÒ × ÔÖ ÓÖ ´ÒÓ ØÓ ×µ × Ò ÙÒ Ú Ö Ð × Ô ÖØ ÙÐ Ö      ׺ ×ØÓ × Ù ÓÒ Ý ×
ÔÓ× Ð ×ÔÙ × ÔÖ Ò Ö Ó × Ò Ö Ô ÖØ × ÓÒ Ö Ø × Ð ×ÓÐÙ ÓÒº
    Ä Ò Ð ¸ Ù Ò Ó Ó ÙÖÖ ¸ × Ñ Ö Ö Ò ÐÓ ×ØÖ ØÓ ÐÓ ÕÙ ÔÙ                Ú Ò Ö ÓÒ Ö ØÓº
ÁÒ Ò Ó × Ò ¬ Ø Ò Ö Ò Ó ×             ÒØÖÓ ´ Òµº Ò Ó ÕÙ Ò Ö            ׸ Ù Ò ×¸ ÔÓÖ
×ÙÔÙ ×ØÓº × ×Ø Ô Ö×Ô Ø Ú ¸ Ò Ò Ö ×¸ ÒØÓÒ ×¸ Ð ÔÖ Ø                   Ð Ò¹ Ò Ó Ô ÖÓ¸
ÒÓ × ÔÓ Ö Ø Ò Ö Ò Ò Ó × × ÑÔÖ × Ü × Ô ÖÑ Ò Ö Ò ÐÓ ÓÒ Ö ØÓ Ý × ×ÙÔ Ø ×
Ø Ò × Ý Ñ ØÓ Ó× ¬ Ó׺ ר × Ð Ö ÞÓÒ ÔÓÖ Ð Ù Ð Ð ÒØÙ ÓÒ ÒÙÒ              × Ö × ÖØ º
1.4.4   Ocultamiento de informaci´n
                                 o
ÍÒ Ì ×ÓÐÓ ×Ô ¬ Ð ¬Ò ÙÒ ØÓ Ý ×Ù ÒØ Ö Þº Ù Ò Ó × Ù Ö ÙÒ × ÒÓ
 Ò ØÓÖÒÓ ÙÒ Ì ¸ × Ù Ö ÙÒ ×Ô ¬ ÓÒ Ó Ø Ú ÕÙ ÒÓ                        Ò       Ö
×Ù ÑÔÐ ÒØ ÓÒº ×ØÓ × ÓÒÓ Ó ÓÑÓ Ð ÔÖ Ò Ô Ó Ó ÙÐØ Ñ ÒØÓ Ò ÓÖÑ ÓÒ¸ Ð
 Ù Ð ÓÒ× ×Ø Ò Ó ÙÐØ Ö Ð Ö Ñ ÒØ Ð ÑÔÐ ÒØ ÓÒ ÙÒ Ì ¸ Ô٠׸ ÓÑÓ Ý ÐÓ
   ÑÓ׸ ר ÓÒ ÓÖÑ ÐÓ ×Ù Ø ÚÓ¸ ÕÙ ¸ ÒÓ ×ÓÐÓ × ÑÙ Ó Ñ × ÓÑÔÐ Ó¸ × ÒÓ ÕÙ ¬ ÙÐØ
Ð ÓÑÙÒ ÓÒº
      Ú × × Ù ÒÓ Ð Ö Ð ÑÔÐ ÒØ ÓÒ Ò Ú Ð ÒØ Ö Þº ÈÓÖ ÑÔÐÓ¸ Ö
ÕÙ ÓÒ ÙÒØÓ ÙÒ Ñ ÒØ Ð ½ ר ÑÔÐ ÒØ Ó ÓÒ ÖÖ ÐÓ× ÓÖ Ò Ó× ÔÖÓÔÓÖ ÓÒ ÙÒ
        Ö      Ð × ÑÔ ÒÓ × × Ö ¸ ÔÓÖ ÑÔÐÓ¸ ÕÙ Ð Ù×ÕÙ           × Ö Ô ¸ Ô ÖÓ ÕÙ Ð
 Ò× Ö ÓÒ Ý ×ÙÔÖ × ÓÒ ×ÓÒ Ð ÒØ ׺ ÆÓØ ÑÓ× ÕÙ Ò ×Ø ×Ó ÒÓ × ¬Ò Ü Ø Ñ ÒØ ÓÑÓ
× ÑÔÐ ÒØ Ð Ì ¸ × ÒÓ × Ò ¸ ÓÑÓ Ô ÖØ Ð ×Ô ¬ ÓÒ¸ ÙÒ ×Ô ØÓ Ò Ö Ð
Ð ÑÔÐ ÒØ ÓÒº
    ÈÓÖ Ø ÒØÓ¸ Ð Ö ÓÑ Ò ÓÒ Ò Ö Ð           × ÒÓ × ÕÙ × Ó ÙÐØ ÐÓ Ñ × ÕÙ × ÔÙ Ð
 ÑÔÐ ÒØ ÓÒº È ÖÓ¸ × ÔÓÖ Ö ÞÓÒ ×        × ÑÔ ÒÓ Ó Ö ÕÙ Ö Ñ ÒØÓ× Ö ×ÙÐØ ÓÒÚ Ò ÒØ
 ר Ð Ö ÙÒ Ø ÔÓ ÑÔÐ ÒØ ÓÒ¸ ÒØÓÒ × ØÖ Ø × ×Ø Ò ÐÓ× Ø ÖÑ ÒÓ× Ñ × Ò Ö Ó×
ÔÓ× Ð ×º
1.5. Notas y recomendaciones bibliogr´ficas
                                     a                                            25



1.5    Notas y recomendaciones bibliogr´ficas
                                       a
Ä ÔÖÓ Ö Ñ ÓÒ ÓÖ ÒØ            Ó ØÓ× × Ö ÑÓÒØ ¬Ò Ð × Ð                   ½ ¼ Ò ÕÙ
 Ô Ö Ó Ð Ð Ò Ù Simula ¾ ¸ ÓÒ ÐÓ× ÓÒ ÔØÓ× Ð × ¸ Ö Ò Ý ÔÓÐ ÑÓÖ¬×ÑÓº À Ý
  Ó× Ó × ÖÚ ÓÒ × ×ØÓÖ × ÑÙÝ ÑÔÓÖØ ÒØ ׺ Ä ÔÖ Ñ Ö × ÕÙ Simula × Ö ÙÒ× Ö Ó
 Ò Ð ÓÑ Ò Ó Ð × ÑÙÐ ÓÒ Ý ÒÓ Ð ÔÖÓ Ö Ñ ÓÒ ØÖ ÓÒ Ðº Ä × ÙÒ × ÕÙ
ØÓ Ó× ÐÓ× ÓÒ ÔØÓ× ÑÓ ÖÒÓ× Ð ÓÖ ÒØ ÓÒ Ó ØÓ× Ô Ö ÖÓÒ ÔÖ Ñ ÖÓ ÕÙ Ð ÒÓ ÓÒ
ÑØÑØ             Ø ÔÓ     ØÓ ×ØÖ ØÓº
     Simula ÒÓ            Ö× Ø Ò Ó ÑÙÝ Ò Ù ÒØ Ò ×Ù ÔÓ ÔÓÖÕÙ ØÖ Ò× ÙÖÖ ÖÓÒ
 Ð ÙÒ ×          × ÒØ × ÕÙ × Ð × ÑÔÓÐÚ × Ý ÓÒ× Ö × Ò Ð Ô Ö Ñ ØÙ Ð
    ÐÓ× Ó ØÓ׺ ÈÓÖ Ð ÓÒØÖ Ö Ó¸ ÐÓ× ÓÑÔÙØ ר ׸ ÕÙ × Ö Ò ÑÙÝ Ð Ø × Ó׸ ÓÒÓ Ò ÐÓ×
Ø ÔÓ× ×ØÖ ØÓ×          ØÓ× × ÐÓ× ØÖ Ó× Ä × ÓÚ Ý ÐÐ × ½¼ Ý Ð Ó ÙÐØ Ñ ÒØÓ
 Ò ÓÖÑ ÓÒ × ÐÓ× ØÖ Ó× È ÖÒ × ½¿ º
      Ð Ð Ò Ù C++¸ Ú ÙÐÓ          Ò× Ò ÒÞ Ð ÔÖ × ÒØ Ø ÜØÓ¸ Ò×Ô Ö Ó Ò ÐÓ× Ð Ò Ù ¹
  × C Ý Smalltalk ¸ ½¸ ½ ¸ Ù Ö Ó ÔÓÖ ÖÒ ËØÖÓÙרÖÙÔº Ä Ñ ÓÖ Ö Ö Ò Ô Ö
×Ù ÔÖ Ò Þ × ×Ù ÔÖÓÔ Ó Ø ÜØÓ Ì C++ ÈÖÓ Ö ÑÑ Ò Ä Ò Ù ½ ¸ Р٠и Ô ÖØ
    ÕÙ × ÔÓ× Ð Ñ ÒØ Ð Ñ ÓÖ Ô Ö ÓÑÔÖ Ò Ö Ð Ð Ò Ù ¸ × ÙÒ Ü Ð ÒØ ØÖ Ø Ó
 Ò Ò Ö          ÔÖÓ Ö Ñ ÓÒ¸ ÕÙ ÒÓ Ø Ò Ò ÕÙ Ú Ö ÓÒ Ð Ö Ò                ÔÖÓÝ ØÓ×
×Ó ØÛ Ö ¸ Ø Ú          ÓÖ Ò Ùר Ý ÚÙÐ ÖÑ ÒØ ÓÒÓ         Ó Ð ÖÓØÙÐÓ Ò Ò Ö Ð
×Ó ØÛ Ö º
      ר Ø ÜØÓ ÒÓ Ú Ö× ×Ó Ö Ð ÒØ Ö Þ Ð          Ð ÓØ  ר Ò Ö C++¸ × ÒÓ¸ Ñ × Ò¸
    Ö        ×Ù ÑÔÐ ÒØ ÓÒº × ÙØ и × Ò Ñ Ö Ó¸ ×ØÙ Ö Ð ÒØ Ö Þ              ØÓ× ÒÓ
Ö Ô Ø Ö ØÖ Ó Ý          ÓÑÓ Ò Þ Ö Ö Ø Ö Ó׺ ÍÒ Ü Ð ÒØ Ö Ö Ò ×Ó Ö Ð               Ð Ó¹
Ø ×Ø Ò Ö C++ Ð ÓÒר ØÙÝ Ð Ø ÜØÓ ÂÓ×ÙØØ × º
     ÍÒ Ö Ù ÒØÓ ×ØÓÖ Ó Ö         Ð C++ Ý Ð ÔÖÓ Ö Ñ ÓÒ Ó ØÓ× ÔÙ Ò ÓÒØÖ Ö×
 Ò ½ º Ä Ð ØÙÖ × ÑÙÝ ÒØ Ö × ÒØ ÔÓÖÕÙ Ö Ú Ð ÕÙ Ð × ×ØÖ ÓÒ × Ý ÓÒ ÔØÓ×
 ×Ó       × ÐÓ× Ó ØÓ× ×ÓÒ Ö ×ÙÐØ Ó Ð Ö ¬Ò Ñ ÒØÓ ØÖ Ú × ÖÖÓÖ × Ý Ö ×Ó׺
      Ð ÔÖ Ò Ô Ó ¬Ò¹ ¹¬Ò × Ó Ó × ÖÚ Ó × ÔÓ × Ö ÑÓØ ׸ Ô ÖÓ Ù Ù ÐÐ ÖÑÓ Ç ¹
   Ѹ Ù Ò Ó ÒÙÒ Ó ×Ù Ð Ö Ò Ú ¸ Ð Ù Ð Ö Þ ÒÓ ÑÙÐØ ÔÐ ÕÙ ÐÓ× ÒØ × × Ò
Ò ×           ¸ ÕÙ Ò ÔÖ Ñ ÖÓ × ÓÒÓ ×Ù ÑÔÓÖØ Ò Ô ×Ø ÑÓÐÓ º Ò Ð ÔÖÓ Ö ¹
Ñ ÓÒ¸ Ð ÔÖ Ò Ô Ó × Ó Ó × ÖÚ Ó Ò Ö Ò × × ×Ø Ñ ×¸ × Ò Ó Ð Ö ×Ô ØÓ Ñ Ð Ñ Ø Ó
 Ð ÖØ ÙÐÓ Ë ÐØÞ Ö Ø Ð ½ º ËÓ Ö ×Ø ÖØ ÙÐÓ × Ñ Ò ×Ø Ö ÓÑ ÒØ Ö ÕÙ Ë ÐØÞ Ö Ø Ð
ÓÖ ÒØ Ò ×Ù ÖØ ÙÐÓ × ×Ø Ñ × ×ØÖ Ù Ó× Ý ÒÓ Ö Ø Ñ ÒØ Ð × ÒÓ               ØÓ׺ ÈÓÖ ÓØÖ
Ô ÖØ ¸ Ð Ø ÖÑ ÒÓ ¬Ò Ñ ÒÙ Ó × ÒØ ÖÔÖ Ø ÓÑÓ ÜØÖ ÑÓ Ý ÒÓ ÓÑÓ ÙÒ ÔÖÓÔÓ× ØÓº
        ØÖ Ú × Ð ÜÔ Ö Ò × × Ù Ö Ò ØÓ× Ò Ö Ð × Ý Ò ÖÓ×                 Ó Óº ÙÒ
   Ø ÓÖ ÓÒ×ÓÐ             Ð × Ó Ó Ó ×Ù Ð ÒÓÑ Ò Ö× Ð ÓÑÔÓÒ ÒØ Ó Ô ØÖÓÒ º ÍÒ
Ö Ô ÖØÓÖ Ó ×Ø ÒØ Ö Ó Ô ØÖÓÒ × Ò Ö Ó× × Ó× ÔÙ            Ò ÓÒØÖ Ö× Ò º
     Ë Ò Ô Ö ÓÑ Ò Ö Ð ÔÖÓ Ö Ñ ÓÒ × Ö ÕÙ Ö Ò Ð ÙÒÓ× ÒÓ× ÜÔ Ö Ò ÓÑÓ
 ÙØÓÖ ÔÖÓ Ö Ñ ×¸ ÐÓ× Ø ÜØÓ× Ë ÓØØ Å Ý Ö× ½½¸ ½¾ ÓÒר ØÙÝ Ò Ð Ñ ÓÖ Ö Ö Ò
Ô Ö ÓÑÔÖ Ò Ö¸ ÓÑ Ò Ö Ý × Ö Ù× Ö ÑÙ × Ð × Ó× Ò Ö × × Ð C++º
     Ä ×ØÓÖ          ÍÅÄ × Ö ÑÓÒØ ÇÅÌ ½ ¸ ÙÒ Ð Ò Ù             Ö ¬ Ó¸ ÔÖ ÙÖ×ÓÖ Ð
   ØÙ Ð ÍÅĸ ÔÖÓÔÙ ×ØÓ ÔÓÖ Â Ñ × ÊÙÑ Ù ¸ ÙÒ ÒØ ¬ Ó Ð Ö Ð ÔÖÓ Ö Ñ ÓÒ
Ó ØÓ׺ Ð ÓÒ×ÓÖ Ó ÇÅ ´Ç Ø Å Ò Ñ ÒØ ÖÓÙÔµ¸ Ò Ð Ñ ØÓ ÐÓ× × ×Ø Ñ ×
   ×ØÖ Ù Ó× Ó ØÓ׸ ØÓÑÓ ÇÅÌ ÓÑÓ × Ô Ö × ÖÖÓÐÐ Ö Ð ØÙ Ð ÍÅĺ
26                                                       Cap´
                                                            ıtulo 1. Abstracci´n de datos
                                                                              o



1.6        Ejercicios
     ½º      × Ò ÑÔÐ ÒØ ÙÒ Ì ÕÙ Ö ÔÖ × ÒØ ÒÙÑ ÖÓ× Ò ÔÙÒØÓ ­ÓØ ÒØ Ý Ò Ð Ù Ð ×
           ×Ô ¬ÕÙ Ð ÔÖ × ÓÒ × Ö¸ Ð Ø Ñ ÒÓ Ð Ñ ÒØ × Ý Ð ÜÔÓÒ ÒØ º
     ¾º     Ö Ø ÕÙ Ð Ì      ÓÑÔÐ Ó º ÉÙ Ø Ò ÓÑÔÐ ØÓ × × ÓÖÖ Ø ×Ù ×Ô ¬ ÓÒ
          × Ñ ÒØ       ÉÙ ÔÖÓ Ð Ñ ×     ÓÑ Ò Ó Ý Ö ×ÙÐØ Ó× ÔÙ Ò Ó ÙÖÖ Ö
     ¿º     ÑÔÐ Ð Ì          ÓÑÔÐ Ó Ô Ö Ñ Ò Ö ÓÓÖ Ò × ÔÓÐ Ö ×º × ÙØ ÓÒ
           ÓÐÓ Ö Ð ÑÔÐ ÓÒ ´ Ò ÒÙ ÚÓ× Ñ ØÓ Ó׸ Ò ÙÒ Ð × Ö Ú ¸ Ø Ø Ö µ
      º      × Ò ÑÔÐ ÒØ ÙÒ Ì ÕÙ Ö ÔÖ × ÒØ ÒÙÑ ÖÓ× ÔÖ × ÓÒ Ö ØÖ Ö º
      º   Ê Ú × Ù ÒØ × ÔÖÓ Ö Ñ × Ð Ö × Ô Ö         Ù Ö ÓÑÓ Xfig Ý DIA Ò Ù Ð Ö¹
           ÖÕÙ       Ð × × ÓÒ ÕÙ ÐÐÓ× ÑÓ Ð Þ Ò Ð × ¬ ÙÖ ×º
      º   Á ÒØ ¬ÕÙ ÐÓ× Ó ØÓ× ÙÒ Ñ ÒØ Ð × Ô Ö Ð ÓÒ Ù ÓÒ ÙÒ ÙØÓÑÓÚ Ð ÕÙ ×
           Ò Ù ÒØÖ Ò Ò Ð       Òº ÈÖ        ÙÒÓ¸ ר Ð Þ ×Ù ¬Ò Ý Ð × ÓÔ Ö ÓÒ × ÙÒØÓ
           ÓÒ ×Ù× ×Ô ¬ ÓÒ × × ÒØ Ø Ý × Ñ ÒØ º
      º      × Ò Ò Ù Ø Ú Ñ ÒØ ÙÒ Ö ÖÕÙ         Ð × × ÕÙ Ö ÔÖ × ÒØ Ú ÙÐÓ× ÙØÓÑÓØÓÖ ×º
               Ù ÐÓ× Ö Ñ × ÍÅĺ
      º      ×Ò      Ù Ø Ú Ñ ÒØ ÙÒ Ö ÖÕÙ         Ð × × ÕÙ Ö ÔÖ × ÒØ Ú Ú Ò × º    Ù
          ÐÓ× Ö Ñ × ÍÅĺ
      º     ÓÒ× Ö Ð × × Ù ÒØ × Ð × × Ó ØÓ ÙÝÓ× ÒÓÑ Ö × ×Ù Ö Ò ÐÓ ÕÙ Ö ÔÖ × ÒØ Ò
                     Medio locomoción            Medio aéreo

                     Medio terrestre           Medio marítimo           Helicoptero


                           Energía               Avión      Barco        Globo


                    Dirigible        Monopatín       Submarino          Cohete

                    Patineta         Patines      Carreta       Bus        Tren

                    Moto        Bicicleta         Con Motor           Sin Motor


         × Ò ÙÒ ×ÕÙ Ñ    Ù Ø ÚÓ ÕÙ Ö Ð ÓÒ ×Ø × Ð × ×º
 ½¼º Å Ò ÓÒ ØÖ × Ó Ñ × ÔÐ ÓÒ × Ò ÓÒ Ô Ö Þ Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð
     Ð × ×ØÖÙ ØÙÖ ×   ØÓ׺ È Ö        ÔÐ ÓÒ¸ ÜÔÐ ÕÙ Ð ÓÖÑ Ò ÕÙ Ô Ö Ý
        × ÖØ Ö Ú Ñ ÒØ Ö         ÓÑÓ × ÑÔÐ ÒØ Ö º
 ½½º Å Ò ÓÒ ØÖ × Ó Ñ × ÔÐ ÓÒ × Ò ÓÒ ÒÓ Ô Ö Þ Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð
     Ð × ×ØÖÙ ØÙÖ ×   ØÓ׺
 ½¾º Å Ò ÓÒ Ð ÙÒ × ×ØÖÙ ØÙÖ ×       ØÓ× ÓÒÓ × Ý × ÙØ ×Ù Ð × ¬ ÓÒ × ÙÒ ÐÓ×
     Ð Ò Ñ ÒØÓ× ÜÔÐ Ó× Ò Ð × ÓÒ Ü ½º º½ ´Ô Ò ¾½µº
1.6. Bibliograf´
               ıa                                                               27



 ½¿º   Ó ÙÒ ÓÒ ÙÒØÓ S     ¬Ò Ó ÔÓÖ Ð Ø ÔÓ Set<T, Compare>¸ ÜÔÐ ÕÙ ÓÑÓ ÓÒÓ Ö
    Ð Ð Ñ ÒØÓ ÓÖÖ ×ÔÓÒ     ÒØ Ð Ñ Ò Ò Ð × ÒØ Ó ×Ø ר Óº
 ½º    Ó ÙÒ ÓÒ ÙÒØÓ S     ¬Ò Ó ÔÓÖ Ð Ø ÔÓ Set<T, Compare>¸ ÜÔÐ ÕÙ ÓÑÓ × ÔÖÓ¹
    Ö Ñ Ö ¸ Ò ÙÒ ÓÒ        Ð × ÔÖ Ñ Ø Ú ×    ÓÒ ÙÒØÓ ÙÒ Ñ ÒØ Ð ½ ¸ Ð ÖÙØ Ò
                   template <class __Set>
               __Set extraer(__Set & set, int i, int j);


     Ð Ù Ð ÜØÖ       S¸ Ý Ö ØÓÖÒ Ò ÙÒ ÒÙ ÚÓ ÓÒ ÙÒØÓ¸ ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ× ÕÙ ×Ø Ò
      ÒØÖ Ð × ÔÓ× ÓÒ × i Ý j¸ Ö ×Ô Ø Ú Ñ ÒØ º ×ÔÙ × Ð ÓÔ Ö ÓÒ¸ S ÓÒØ Ò ÐÓ×
      Ð Ñ ÒØÓ× ÒØÖ ÐÓ× Ö Ò Ó× [0..i − 1] Ý [j + 1..n − 1]¸ ÓÒ n = |S|º
 ½ º ×ÙÑ ÕÙ Ð ¬Ò ÙÒ × ×Ø Ñ × Ð Ñ Ò ×ØÖ ÓÒ Ð × ÓÐ Ö                        ÙÒ ÖÖ Ö
     ÙÒ Ú Ö× Ø Ö º    Ó ×Ø ¬Ò¸ × ×             ×ÔÓÒ Ö       ××      ØÓ×   ×ØÙ ÒØ ׸
     ÔÖÓ ×ÓÖ ×¸ ÖÖ Ö ×¸ ÙÖ×Ó׸ × ÓÒ ×¸ × ÐÓÒ ×¸ ÓÖ Ö Ó× Ý Ñ × ×Ô ØÓ× ÔÖÓÔ Ó×
     Ð Ñ Ò ×ØÖ ÓÒ × ÓÐ Ö ÙÒ ÍÒ Ú Ö× º
     ÈÐ ÒØ Ì        Ò Ö Ð ×¸ Ô ÖØ ÙÐ Ö ×¸ Ô Ö Ñ ØÖ Þ Ó׸ ÕÙ ÑÓ Ð Ò Ð × Ú Ö× ×
        ×ØÖ ÓÒ × ÕÙ Ñ Ò Ö Ð × ×Ø Ñ º Ù ÐÓ×                   Ö Ñ × ÍÅÄ Ô Ö ØÓ × Ð ×
      Ð × × × Ò ×º
 ½ º Ê ÓÒ× Ö Ð Ö Ó ÒØ Ö ÓÖ Ô Ö ÐÓ× × ÓÐ Ö × × ÙÒ Ö Ý ÔÖ Ñ Ö º

Bibliograf´
          ıa
 ½ ÝØ ¸      ØÓÖº ËÔ Ð ××Ù ÓÒ ËÑ ÐÐØ Ð ¸ ÚÓÐÙÑ ¸ Ù Ùר ½ ½º
 ¾ Ǻ º      Ð Ò Ãº ÆÝ Ö º ËÁÅÍÄ ß Ò Ä ÇĹ × × ÑÙÐ Ø ÓÒ Ð Ò Ù º Óѹ
   ÑÙÒ Ø ÓÒ× Ó Ø          Ÿ ´ µ ½ß ¾¸ Ë ÔØ Ñ Ö ½ º
 ¿ Ê Ñ× × Ù ÒÑ ÝÓÖº ÁÒØ ÖÔÖ Ø Ò Ó ÇÖ Ò Þ ÓÒ ×ººº ÍÒ Ì ÓÖ Ë ×Ø Ñ Ó¹
   ÁÒØ ÖÔ ÖØ Ø Ú      ÇÖ Ò Þ ÓÒ ×º ÍÒ Ú Ö×        ÄÓ× Ò × ¹ ÓÒ× Ó ÔÙ ¹
   Ð ÓÒ × ¹ ÓÒ× Ó          ×ØÙ Ó× ÈÓר Ö Ó¸ ¾¼¼½º
     º ÑÑ ¸ ʺ À ÐѸ ʺ ÂÓ Ò×ÓÒ¸ Ò Âº ÎÐ ×× ×º × Ò È ØØ ÖÒ׺   ×ÓÒ¹Ï ×Рݸ
   ½ º
   Ç Ø Å Ò Ñ ÒØ ÖÓÙÔº ÇÅ ÍÒ ¬ ÅÓ Ð Ò Ä Ò Ù ¾º¼ ÈÖÓÔÓ× Ð¸ Ê ¹
   Ú × ×Ù Ñ ×× ÓÒ ØÓ ÇÅ Ê È× »¼¼¹¼ ¹¼½ Ò »¼¼¹¼ ¹¼¾¸ Î Ö× ÓÒ ¼º ½º
   ÇÅ ¸ ØØÔ »»ÛÛÛºÓÑ º ÓÑ»ÙÑл¸ ¾¼¼¾º
     º Àº Àº ÁÒ ÐÐ׺ × Ò ÔÖ Ò ÔÐ ×    Ò ×Ñ ÐÐØ Ð º Ì ¸ ´ µ ¾ ß¾ ¸ Ù Ùר
   ½ ½º
   Æ ÓРź ÂÓ×ÙØØ ×º Ì        ·· ËØ Ò Ö Ä Ö ÖÝ ØÙØÓÖ Ð Ò Ö Ö Ò º ÔÙ ¹
    ϸ ÔÙ ¹ Ï Ö¸ ½ º
     Ö Ò Ïº à ÖÒ Ò Ò ÒÒ × Ê Ø º Ì              ÈÖÓ Ö ÑÑ Ò Ä Ò Ù ¸ Ë ÓÒ
       Ø ÓÒº ÈÖ ÒØ ¹À Ðи ½ º
28                                           Cap´
                                                ıtulo 1. Abstracci´n de datos
                                                                  o



      ÓÒ Ð     º ÃÒÙØ º ÙÒ Ñ ÒØ Ð Ð ÓÖ Ø Ñ׸ ÚÓÐÙÑ ½ Ó Ì          ÖØ Ó ÓÑÔÙØ Ö
     ÈÖÓ Ö ÑÑ Ò º        ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ÍË ¸ Ø Ö Ø ÓÒ¸ ½ º
½¼   Ä × ÓÚ Ò ÐР׺ ÈÖÓ Ö ÑÑ Ò Û Ø ×ØÖ Ø Ø ØÝÔ ×º Ë ÔÐ Ò ÆÓØ ×¸ ¸ ½ º
½½   Ë ÓØØ Å Ý Ö׺ « Ø Ú ··º          ×ÓÒ Ï ×Рݸ ½ ¾º
½¾   Ë ÓØØ Å Ý Ö׺ ÅÓÖ « Ø Ú ··º           ×ÓÒ Ï ×Рݸ ½ º
½¿     º ĺ È ÖÒ ×º Ø Ò ÕÙ ÓÖ ×Ó ØÛ Ö ÑÓ ÙÐ ×Ô ¬ Ø ÓÒ Û Ø Ü ÑÔР׺ ÓÑÑÙ¹
     Ò Ø ÓÒ× Ó Ø ××Ó Ø ÓÒ Ó ÓÑÔÙØ Ò Å Ò Öݸ ½ ´ µ ¿¿¼ß¿¿ ¸ Å Ý ½ ¾º
½    Â Ñ × º ÊÙÑ Ù º ÇÅÌ Ì Ó Ø ÑÓ Ðº ÂÇÇȸ ´ µ ¾½ß¾ ¸ ½ º
½    º Ë ÐØÞ Ö¸ º Ê ¸ Ò º Ð Ö º Ò ¹ØÓ¹ Ò Ö ÙÑ ÒØ× Ò ×Ýר Ñ × Òº Å
     ÌÖ Ò× Ø ÓÒ× ÓÒ ÓÑÔÙØ Ö ËÝר Ñ׸ ¾´ µ¸ ½ º
½        ÖÒ ËØÖÓÙרÖÙÔº Ì      × Ò Ò ÚÓÐÙØ ÓÒ Ó ··º           ×ÓÒ Ï ×Рݸ Ê Ò
     Å ×׺¸ ½ º
½        ÖÒ ËØÖÓÙרÖÙÔº Ì ·· ÈÖÓ Ö ÑÑ Ò Ä Ò Ù º            ×ÓÒ¹Ï ×Рݸ ¿Ö Ø ÓÒ¸
     ¾¼¼¼º
½    Ä ÖÖÝ Ì ×Ð Öº Ì ËÑ ÐÐØ Ð ÒÚ ÖÓÒÑ ÒØº ÝØ ¸ ´ µ ¼ß½ ¸ Ù Ùר ½ ½º
Cap´
   ıtulo 2

Secuencias

  ר Ô ØÙÐÓ Ú Ö× ×Ó Ö × Ù Ò ×º Ò ÔÖÓ Ö Ñ ÓÒ¸ × ÓÑÓ Ò ÓØÖÓ× Ñ ØÓ×
ÒÙ ×ØÖ ÙÐØÙÖ ¸ ÙÒ × Ù Ò × ¬Ò ÓÑÓ ÙÒ ×Ù × ÓÒ                   Ð Ñ ÒØÓ×     Ð ÙÒ Ø ÔÓº
ÈÓÖ ×Ù × ÓÒ ÒØ Ò ÑÓ× ÕÙ ÐÓ× Ð Ñ ÒØÓ× Ð × Ù Ò ÔÙ Ò Ñ Ö Ö× × ÙÒ ÖØÓ
ÓÖ Ò Ô Ö ÓÒ Ó ÔÖÓ × Ñ ÒØÓ ÙÒÓ ØÖ × ÓØÖÓ¸ ÞÕÙ Ö                   Ö ¸ ÖÖ
     Ó Ý ÓØÖ × ÓÑ Ò ÓÒ × ÕÙ Ñ ÒØ Ò Ò Ð Ö Ø Ö ×Ù × ÚÓ ×Ù Ý ÒØ Ð
× ÙÒ º
      ÒÐ Ú       ÓØ Ò Ð ÑÓ× ÓÒ × Ù Ò × × Ò ÕÙ × ÒÙÒ ÒÓ× Ñ Ö Ú ÐÐ ÑÓ×
    ×Ù× ÓÒ× Ù Ò ×¸ Ð × Ù Ð × × ÒÓ× × Ô Ö Ò Ò Ð ÙÒ                  Ð Ú º Ò ×Ø й
Ð ÒÓ¸ Ý Ò ÓØÖ × Ð Ò Ù ×¸ Ð ÑÓ× Ý × Ö ÑÓ× ÞÕÙ Ö              Ö     Ý × ÖÖ
     Ó Ó × ¸ × Ù Ò ÐÑ ÒØ º Ä Ñ ÝÓÖ          Ð × Ú × Ð Ð ØÙÖ Ó ÙÖÖ × Ò ÕÙ ÒÙ ×ØÖÓ
Ô Ò× Ñ ÒØÓ ÒØ ÖÚ Ò Ý Ö Ñ ÒØ Ð × ÒØ Ó ÐÓ ÕÙ Ð ÑÓ׺                   ÑÓ× ÒØÓÒ × ÕÙ
Ð ÑÓ× ­Ù Ñ ÒØ º Ë Ù Ò Ð × ØÙ ÓÒ Ú × ×Ù                 Ò Ñ Ø Ñ Ø ¸ ÓÑ Ò Ó ÓÒ
×ÓÐ ÑÓ× ÓÔ Ö Ö Ð Ñ ÒÓ× ×Ó Ø Ú Ñ ÒØ ¸ ÞÕÙ Ö             Ö Ý Ð ÙÒÓ× ÓØÖÓ× ÑÓ Ó×
Ñ × Ö × ÖÚ Ó× Ô Ö ÐÓ× Ñ Ø Ñ Ø Ó× Ü Ð×Ó׺
    ÆÓ ×ÓÐÓ Ð × × Ù Ò × ÒÓ× ×ÓÒ Ù Ù ×¸ × ÒÓ ÕÙ ÑÙ × Ú × ×Ø × Ø Ò Ò Ö Ò¹
Ø × Ô Ö×Ô Ø Ú × Ñ Ö Ó ×Ø ÒØÓ× ÑÓ Ó× Ý Ø ÑÔÓ× Ô Ö ÔÖ × ÒØ Ö× ÒØ ÖÔÖ Ø Ö× º
  ÓÒ× Ö ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ Ð ×Ó ÙÒ Ô Ð ÙÐ Ú ×Ø ÓÑÓ ÙÒ × Ù Ò                          × ¹
Ò × ÐÚ Ò × ÙÒ Ð × ÒØ Ó ÕÙ Ð Ö ØÓÖ ÒÓ× ÔÖ Ø Ò ØÖ Ò×Ñ Ø Ö Ð ×ØÓÖ º È Ö
 ÔÖÓÜ Ñ ÖÒÓ× ÐÓ ÕÙ ÓÑÓ Ô Ð ÙÐ × ÕÙ Ö ÔÖ × ÒØ Ö¸          ÑÓ× Ñ Ö Ö Ð Ô Ð ÙÐ × Ù Ò¹
   ÐÑ ÒØ º ÍÒ ÓÖØ Ò Ð × Ù Ò ¸ Ó ÙÒ Ô ÖÑÙØ ÓÒ ÒØÖ ×Ù× × Ò × ÔÙ ÚÓÐÚ Ö
Ð Ô Ð ÙÐ Ò ÒØ Ð Ð Ó¸ ÕÙ Þ Ò Ð Ñ ÓÖ ÐÓ× ×Ó× ¸ Ó Ö Ö ÙÒ ÒØ ÖÔÖ Ø ÓÒ ×¹
Ø ÒØ º ÈÓÖ ×ÙÔÙ ×ØÓ¸ ÐÓ ÒØ Ö ÓÖ ÒÓ ÒÓ× ÑÔ ¸ Ò Ö ØÖÓ×Ô Ø Ú ¸ ÐÙ Ó        Ö ÔÖ × Ò Ó
 ÒØ Ö Ñ ÒØ Ð Ô Ð ÙÐ ¸ Ñ Ö Ö Ð ÙÒ × ×Ù× Ô ÖØ × Ô Ö Ñ ÓÖ Ö ÒÙ ×ØÖ ÓÑÔÖ Ò× ÓÒº
Î ×ØÓ ÓØÖÓ ÑÓ Ó¸ ÙÒ Ô Ð ÙÐ ÓÒ× ×Ø Ò ÙÒ × Ù Ò                  ÓØÓ Ö × ÙÝ ×Ù × ÓÒ
Ö ÓÒרÖÙÝ Ð × × Ò × ÓÒ ÑÔÖ × ÓÒ Ö Ð º
      Ð ÓÑÔÙØ ÓÖ ÒÓ × Ô Ð Ù Ù                Ð × × Ù Ò ×º ÆÓ ÑÙÝ ÓØÖÓÖ ¸ Ù Ð × ¬¹
    Ó Ñ ÕÙ Ò × Ù Ò Ð ¸ ÔÙ × × Ö Ñ Ø Ð Ö Ý ÙØ Ö ÔÖÓ Ö Ñ ×¸ ÐÓ× Ù Ð × ÒÓ ×ÓÒ
Ñ × ÕÙ × Ù Ò × ÒרÖÙ ÓÒ × × Ö Ø × Ò ÙÒ Ñ ÑÓÖ º À ÕÙ ¸ Ô٠׸ ÙÒ Ò Ó
× Ö Ó ÕÙ Ù ÐÕÙ Ö ×ØÖ ÓÒ × Ù Ò × ÑÔÐ Ñ ÒØ Ù×                         Ò Ð ÓÑÔÙØ ÓÒº
      Ò ×Ø Ô ØÙÐÓ ×ØÙ Ö ÑÓ× Ð × × Ù ÒØ × ×ØÖÙ ØÙÖ ×           ØÓ× Ö Ø Ö Þ × ÓÑÓ
× ÙÒ ×
    ¯ ÖÖ ÐÓ׺

    ¯ Ä ×Ø × ÒÐ Þ     ׺
                                         ¾
30                                                       Cap´
                                                            ıtulo 2. Secuencias



     È Ð ×º
      ¯

   ¯ ÓР׺

     Ù ÐÕÙ Ö      ר × ×ØÖÙ ØÙÖ × × Ù Ù ÔÓÖ ØÓ × Ð × Ò × ÓÑÔÙØ ÓÒ Ð × Ý ×
ÑÙÝ ÔÖÓ Ð ÕÙ × Ò Ô ÖØ Ð Ñ ÒÓ Ö Ø Ó               Ù ÓÒº ÈÓÖ ×Ø Ö ÞÓÒ¸ × × Ð
 ÓÒÓ Ö Ð × ÑÔÐ ÒØ ÓÒ × Ñ × ¬ ÒØ × ÔÓ× Ð ×º
   ÄÓ× ÖÖ ÐÓ× Ý Ð ×Ø × ÒÐ Þ × ÓÒ ÓÖÑ Ò ×ØÖ ÓÒ ×         ØÓ׸ Ñ ÒØÖ × ÕÙ Ð × Ô Ð ×
Ý ÓÐ × ×ÓÒ ×ØÖ ÓÒ × ­Ù Óº ÍÒ × Ù Ò              Ð Ñ ÒØÓ× Ð Ñ ×ÑÓ Ø ÔÓ ÓÒ ÓÖÑ
ÙÒ ÓÒ ÙÒØÓ ÐÓ ÕÙ ×Ù Ö         ÒØÖ ÕÙ ÙÒ × Ù Ò ¸ Ú ×Ø ÓÑÓ ×ØÖ ÓÒ               ØÓ¸
ÔÙ ÑÔÐ ÒØ Ö Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð ×ØÖÙ ØÙÖ             ØÓ× ×ØÙ Ó Ò Ð Ô ØÙÐÓ ½º
 ר × Ö Ð Ò × × ÕÙ Ð ÑÔ ÖØ Ö ÑÓ× ÐÓ× ÖÖ ÐÓ× Ý Ð × Ð ×Ø × ÒÐ Þ ×º
   ÇØÖ × × ØÙ ÓÒ × ÓÑÔÙØ ÓÒ Ð × Ö ÕÙ Ö Ò ÙÒ Ô ØÖÓÒ ÔÖÓ × Ñ ÒØÓ Ô ÖØ ÙÐ Öº
 ר × Ð × ÒØ Ó Ð × Ô Ð × Ý Ð × ÓР׸ ÙÝÓ× ÒÓÑ Ö × Ò ÖØ ÓÖÑ ×ØÖ Ò Ð ÓÖ Ò
   ÔÖÓ × Ñ ÒØÓº

2.1       Arreglos
ÍÒ ÖÖ ÐÓ        Ñ Ò× ÓÒ Ñ × ÙÒ × Ù Ò           n ≤ Ñ Ð Ñ ÒØÓ× Ð Ñ ×ÑÓ Ø ÔÓ Ò Ð
 Ù Ð Ð ×Ó              Ð Ñ ÒØÓ × Ö ØÓ Ý ÓÒ×ÙÑ ÙÒ Ø ÑÔÓ ÓÒר ÒØ Ò Ô Ò ÒØ
   ×Ù ÔÓ× ÓÒ ÒØÖÓ Ð × Ù Ò º
    ÈÓÖ ÐÓ Ò Ö Ð¸ ÐÓ× Ð Ñ ÒØÓ× ÙÒ ÖÖ ÐÓ × ÓÖ Ò Þ Ò ÓÖÑ Ö Ø Ñ ÒØ ÓÒØ Ù
 Ò Ð Ñ ÑÓÖ Ð ÓÑÔÙØ ÓÖ¸ ÐÓ ÕÙ ÔÖÓÔÓÖ ÓÒ Ó× ÓÒ × ÕÙ                 Ò Ð ÖÖ ÐÓ ÑÙÝ
 ÒØ Ö × ÒØ Ô Ö Ð ÔÖÓ Ö Ñ ÓÒ × ×Ø Ñ ×
   ½º Ë ÔÙ            Ö Ö Ø Ñ ÒØ Ù ÐÕÙ Ö Ð Ñ ÒØÓ × ÙÒ ×Ù ÔÓ× ÓÒ ÒØÖÓ Ð
      × Ù Ò º ÈÓÖ ÐÓ Ò Ö Ð¸ ×ØÓ × ÑÔÐ ÒØ Ò Ú Ð          ÓÑÔ Ð ÓÒ Ý × ×Ô ¬
        ÒÚ Ð Ð Ð Ò Ù           ÔÖÓ Ö Ñ ÓÒ Ñ ÒØ Ð ÓÔ Ö ÓÖ []º ÈÓÖ ÑÔÐÓ¸ Ð
       ÜÔÖ × ÓÒ Ò C++ a[15] = 9¸ × Ò Ð ÒØ ÖÓ 9 Ð ÑÓ × ÜØÓ Ð Ñ ÒØÓ Ð ÖÖ ÐÓº
   ¾º Ð Ó×ØÓ Ò ×Ô Ó × Ñ Ò ÑÓ × × ÑÔÖ ¸ Ð ÒØ                Ð Ñ ÒØÓ׺
    Æ Ò ÙÒ ×ØÖÙ ØÙÖ           ØÓ Ó Ö Ñ ÓÖ Ö Ò Ñ ÒØÓ Ò Ð       ×Ó ÔÓÖ ÔÓ× ÓÒº Ð
     Ó ÕÙ ÐÓ× Ð Ñ ÒØÓ× ×Ø Ò ÓÒØ ÙÓ× ÚÓÖ ÜØÖ ÓÖ Ò Ö Ñ ÒØ Ð × ÔÐ ÓÒ ×
ÕÙ Ü Ò ÐÓ Ð               Ö Ö Ò ¸ ÔÙ × × ÑÙÝ ÔÖÓ Ð ÕÙ ÐÓ× Ð Ñ ÒØÓ× Ö ÒÓ× Ò
 ×Ô Ó Ý Ø ÑÔÓ × Ò Ù ÒØÖ Ò Ò Ð            ½º

    Ä Ñ ÝÓÖ       ÐÓ× Ð Ò Ù × ÔÖÓ Ö Ñ ÓÒ ÑÓ ÖÒÓ× Ó Ö Ò ×ÓÔÓÖØ Ô Ö Ð Ñ Ò Ó
    ÖÖ ÐÓ׺
      ÓÒ× Ö ÑÓ× ÙÒ ÖÖ ÐÓ A[11]          Ð Ñ ÒØÓ× Ø ÔÓ T ÙÝÓ Ø Ñ ÒÓ Ò ÝØ × ×
sizeof(T) Ý ÕÙ × Ô ØÓÖ Þ        Ð × Ù ÒØ ÑÓ Ó
                            0 1 2 3 4 5 6 7 8 9 10
                     Base   T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10

Ð ÓÑÔ Ð ÓÖ ×Ó Ð ÖÖ ÐÓ Ð Ö ÓÒ Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ ÐÐ Ñ     × Ð ÖÖ ÐÓ ¸
ÙÝÓ Ú ÐÓÖ × Ø ÖÑ Ò × ÙÒ Ð ÐÙ Ö ÓÒ Ó ÙÖÖ Ð   Ð Ö ÓÒ Ó Òר Ò ÓÒ Ý Ð
  ½
    Ò ×Ø ÓÒØ ÜØÓ ÙÒ    × ÙÒ ×ØÖÙ ØÙÖ ×Ô   Ð    ØÓ¸ ×ÓÔÓÖØ ÔÓÖ Ð Ö Û Ö ¸ Р٠и × ×
Ù× ÓÖÖ Ø Ñ ÒØ ¸ Ð Ö ÓÒ× Ö Ð Ñ ÒØ Ð Ú ÐÓ            ×Ó Ð Ñ ÑÓÖ º
2.1. Arreglos                                                                               31



ÑÓ Ó    Ð Ö ÓÒº Ù Ò Ó Ð ÓÑÔ Ð ÓÖ Ò Ù ÒØÖ ÙÒ                            ×Ó Ð i¹ × Ñ ÔÓ× ÓÒ¸
 ר Ò Ö Ð × Ù ÒØ Ð ÙÐÓ    ×Ó Ð Ñ ÑÓÖ
                      Ö    ÓÒ Ð Ð Ñ ÒØÓ = base + i × sizeof(T)              ´¾º½µ
Ä ÓÔ Ö ÓÒ ×ÙÑ ÕÙ Ð ÔÖ Ñ Ö Ò             Ð ÖÖ ÐÓ × ÖÓ¸ ÕÙ × Ð ×Ó Ò ÐÓ× Ð Ò Ù ×
C Ý C++º Ë Ð Ð Ò Ù     Ô ÖÑ Ø ÕÙ ÐÓ× Ò × ÓÑ Ò Ò Ò Ú ÐÓÖ × Ö ØÖ Ö Ó׸ ÒØÓÒ ×
 Ð ÓÑÔ Ð ÓÖ           Ò Ö Ö ÙÒ ÓÔ Ö ÓÒ       ÓÒ Ð ÒØ × ÔÓ Ö Ö Ð Þ Ö Ð Ð ÙÐÓ
 ÒØ Ö ÓÖ¸ ÐÓ ÕÙ      ÙÒ ÔÓ Ó Ñ × Ð ÒØÓ Ð ×Óº
     Ò Ò Ö Ð¸ ÐÓ× ÓÑÔ Ð ÓÖ × ÒÓ ØÙ Ò Ú Ö ¬ ÓÒ Ö Ò Óº × Ö¸ ÒÓ × × ÙÖ Ò
   ÕÙ Ð Ò           Ö Ö Ò Ð ÖÖ ÐÓ ×Ø ÒØÖÓ ÐÓ× Ö Ò Ó× ÓÖÖ ØÓ׺ Ä Ö ÞÓÒ ×
ÕÙ ×Ø Ú Ö ¬ ÓÒ Ð Ò ÙÒ Ó×ØÓ ÓÒר ÒØ                       ×Ó ÕÙ ÔÙ × Ö ÑÔÓÖØ ÒØ º
  ÓÒ× Ù ÒØ Ñ ÒØ ¸ ÙÒ       ×Ó Ù Ö     Ö Ò Ó × ÙÒ Ö Ú ÖÖÓÖ ÔÖÓ Ö Ñ ÓÒ ÙÝÓ×
× ÒØÓÑ × ÔÙ Ò Ô × Ö × Ô Ö Ó× ÙÖ ÒØ Ð ÙÒ Ø ÑÔÓº ר Ø ÔÓ               ÖÖÓÖ × ÑÙÝ
     Ð      Ø Ø Ö Ö ÞÓÒ ÔÓÖ Ð Ù Ð × Ù Ò      ÙØ Ð Þ Ö × ÖØÓ× Ú Ö ¬ ÓÒ Ö Ò Ó×
                                                            ¾

 ÒØ × Ö Ö Ò Ö ÙÒ ÖÖ ÐÓº
2.1.1     Operaciones b´sicas con Arreglos
                       a
À Ý Ú Ö Ó× ×Ô ØÓ× ÓÒ× Ö Ö Ð ÓÖ ÓÔ Ö Ö ×Ó Ö ÖÖ ÐÓ×
   ¯ Ë ÐÓ× Ð Ñ ÒØÓ× ×Ø Ò Ó ÒÓ ÓÖ Ò Ó׺

   ¯ Ë × ÓÒÓ      Ð ÓÖ Ò Ò× Ö ÓÒ»×ÙÔÖ × ÓÒ ÐÓ× Ð Ñ ÒØÓ׺
   ¯ Ë × ÓÒÓ      ÓÒ ÒØ Ð ÓÒ Ð ÒÙÑ ÖÓ Ð Ñ ÒØÓ׺
   ¯ ÉÙ Ø Ò Ø Ö Ø Ú × × Ö Ò Ð × ÓÔ Ö ÓÒ ×   ÍÒ ÐØ ÒØ Ö Ø Ú    × Ò ¬ ÕÙ
     Ð × Ò× Ö ÓÒ ×¸ Ù×ÕÙ × Ý Ð Ñ Ò ÓÒ × ÔÙ Ò ×Ù Ö Ö Ù ÒØ Ñ ÒØ Ý ÓÒ Ð
     Ñ ×Ñ ÔÖÓ Ð º
   ¯ Ð Ø Ñ ÒÓ Ý Ô ØÖÓÒ        ×Ó ÐÓ× Ð Ñ ÒØÓ× ÕÙ Ð Ö Ð ÖÖ ÐÓº Å ÒØÖ × Ñ ×
      Ö Ò × Ð Ð Ñ ÒØÓ¸ Ñ ÒÓ× Ò ¬ Ó× × Ó Ø Ò Ö Ò ÔÓÖ Ð      º
2.1.1.1    Aritm´tica de punteros
                e

ÍÒ Ð × Ö Ò × Ú ÖØÙ × Ð Ð Ò Ù C¸ ØÖ × Ò               Ð C++¸ × ÐÓ ÕÙ × ÓÒÓ ÓÑÓ
   Ö ØÑ Ø     ÔÙÒØ ÖÓ× º Ì Ð ÓÒ ÔØÓ ÓÒ× ×Ø Ò Ò ÓÖÔÓÖ Ö Ð Ð Ò Ù ÓÔ Ö ÓÒ ×
×Ó Ö ÔÙÒØ ÖÓ× ÙÝÓ× Ö ×ÙÐØ Ó× ÓÒ× Ö Ò Ð Ø ÔÓ       ØÓ Ð Ù Ð × ÔÙÒØ º È Ö Ð Ö ¬ Ö
 ר ÓÒ ÔØÓ¸ × ÖÖÓÐÐ ÑÓ× ÙÒ ÑÔÐÓº
     Ä ÒרÖÙ ÓÒ T * arreglo ptr = new T[n          Ð Ö ÙÒ ÔÙÒØ ÖÓ ÙÒ Ð
Ñ ÑÓÖ       Ø ÔÓ Ò Ö Ó Tº Ð Ú Þ¸ × Ô ÖØ Ñ ÑÓÖ Ô Ö Ð Ö Ö n Ð × ÓÒ¹
Ø Ù × Ø ÔÓ T Ó × ¸ ÙÒ ÖÖ ÐÓ         Ñ Ò× ÓÒ nº
     ÆÓÖÑ ÐÑ ÒØ ¸ × arreglo ptr × Ð × ÙÒ ÖÖ ÐÓ¸ ÒØÓÒ ×¸ Ô Ö            Ö Ð i¹ × ÑÓ
 Ð Ñ ÒØÓ Ø Ò Ö ÑÓ× ÕÙ       ØÙ Ö ÙÒ Ð ÙÐÓ × Ñ Ð Ö ´¾º½µº ÓÖ Ò¸ Ð Ð ÙÐÓ Ñ¹
ÔÐ Ó Ò ´¾º½µ ÐÓ Ò Ö ÙØÓÑ Ø Ñ ÒØ Ð ÓÑÔ Ð ÓÖ Ù Ò Ó¸ ÔÓÖ ÑÔÐÓ¸ × Ö ¹
ÑÓ× *(arreglo ptr + i) = 5;º Ð ÓÔ Ö Ò Ó ÞÕÙ Ö Ó Ð × Ò ÓÒ × ÒØ ÖÔÖ Ø
  ¾
    Ð ºÊº º º ÜÔÖ × Ô Ö × ÖØÓ     ¬ÖÑ   ÓÒ     Ð   ÖØ Þ      Ð Ó   º     ÙÒ × ÖØÓ × Ð ÓÒÓ Ñ ×
ÓÑÓ ÔÖ ÓÒ ÓÒ Ó ÒÚ Ö ÒØ º
  Ò ×Ø Ø ÜØÓ × ÙØ Ð Þ Ò ÒÚÓ ÓÒ × Ð ÔÖ Ñ Ø Ú   I(predicado)    Ð         Ð ÓØ   nana   ½ º
32                                                        Cap´
                                                                  ıtulo 2. Secuencias



      ÓÑÓ          Ð ÓÒØ Ò Ó Ð Ö ÓÒ Ñ ÑÓÖ arreglo ptr Ñ × i ÒØ ÖÓ׺ Ð
      ÓÑÔ Ð ÓÖ × ÕÙ × ØÖ Ø Ð Ø ÔÓ int Ý ÒÓ ÓØÖÓ ÔÓÖÕÙ Ð ÔÙÒØ ÖÓ Ù      ÐÖ Ó
      ÓÑÓ ÙÒ ÔÙÒØ ÖÓ ÒØ ÖÓº ÓÒ ×Ø ÓÒÓ Ñ ÒØÓ¸ Ð ÓÑÔ Ð ÓÖ ÑÔÐ Ø Ý ØÖ Ò×Ô Ö Ò¹
     Ø Ñ ÒØ Ò ÓÖÔÓÖ Ð Ø Ñ ÒÓ ÙÒ ÒØ ÖÓ ´sizeof(int)µ Ò Ð Ð ÙÐÓ Ð ×Óº
         Ä ÜÔÖ × ÓÒ *(arreglo ptr + i) × Ü Ø Ñ ÒØ ÕÙ Ú Ð ÒØ arreglo ptr[i]¸
     Ð Ù Ð × ØÖ Ù               Ð i¹ × ÑÓ ÒØ ÖÓ    Ð × ÙÒ     ÙÝ Ö ÓÒ ×
      × arreglo ptrº ÉÙ Þ ÙÒ ÔÖÓ Ð Ñ       ר Ò ÓÕÙ × ÕÙ × Ñ ×   Ð ×Ø Ò Ù Ö Ð
          ×Ó ÙÒ ÖÖ ÐÓ ÜÔÐ Ø Ñ ÒØ       Ð Ö Ó ÙÒ ×Ó Ñ ÒØ ÙÒ ÔÙÒØ ÖÓº ÈÓÖ ×Ø
     Ö ÞÓÒ¸ × ÓÒÚ Ò ÒØ ÕÙ Ð ÒÓÑ Ö Ð ÔÙÒØ ÖÓ Ö ­ ×Ù ÓÒ ÓÒº Ò Ð ×Ó ÑÔÐÓ¸
      Ð ×Ù¬ Ó ptr¿ ÒÓØ ÕÙ × ØÖ Ø ÙÒ ÔÙÒØ ÓÖº
     2.1.1.2    B´ squeda por clave
                 u

     Ë ÐÓ× Ð Ñ ÒØÓ× ×Ø Ò ÓÖ Ò Ó׸ ÒØÓÒ × ÔÓ ÑÓ× Ù× Ö ÙÒ ÙÐÓ×Ó Ð ÓÖ ØÑÓ¸ ÐÐ Ñ Ó
       Ù×ÕÙ      Ò Ö ¸ ÙÝ ×Ô ¬ ÓÒ Ò Ö × ÓÑÓ × Ù
¿¾     Ù×ÕÙ     Ò Ö ¿¾ ≡
          template <typename T, class Compare>
      int binary_search(T a[], const T & x, int l, int r)
      {
        int m; // ´ndice del medio
                  ı
        while (l <= r) // mientras los ındices no se crucen
                                       ´
          {
            m = (l + r)/2;
            if (Compare() (x, a[m]))        // ¿es x < a[m]?
              r = m - 1;
            else if (Compare() (a[m]), x)   // ¿es x > a[m]?
              l = m + 1;
            else
              return m; // ==> a[m] == x ==> encontrado!
          }
        return m;
      }
       ¬Ò ×
      binary search¸   Ù×   Ò ÙÒ × ¿¿¸ ¿ ¸ Ò   ¼º
        binary search<T, Compare>() Ù×      ÙÒ Ó ÙÖÖ Ò      Ð Ð Ñ ÒØÓ x¸    Ø ÔÓ
       Ò Ö Ó Ì¸ ÒØÖÓ Ð Ö Ò Ó ÓÑÔÖ Ò Ó ÒØÖ l Ý r Ð ÖÖ ÐÓ ÓÖ Ò Ó aº
          Ð ÔÖ Ò Ô Ó Ð Ù×ÕÙ         Ò Ö × Ú Ö Ð ÖÖ ÐÓ Ò Ó× Ô ÖØ × Ù Ð ×
     Ø Ñ ÒÓ m = (l + r)/2 ݸ Ò ×Ó ÕÙ a[m] ÒÓ ÓÒØ Ò x¸ Ù× Ö Ò Ð ÙÒ             Ð×
     Ñ Ø × × ÙÒ Ð ÓÖ Ò x Ö ×Ô ØÓ a[m]º
        ÆÓØ × ÕÙ binary search<T, Compare>() Ö ØÓÖÒ ÙÒ ÔÓ× ÓÒ Ú Ð ÙÒ × x ÒÓ ×
      Ò Ù ÒØÖ Ò Ð ÖÖ ÐÓº ×ØÓ Ö ÕÙ Ö ÕÙ Ð Ð ÒØ ¸ ÐÙ Ó Ð Ù×ÕÙ ¸ ÓÑÔ Ö
     ÒÙ ÚÓ x ÓÒ Ð Ú ÐÓÖ Ö ØÓÖÒÓ Ô Ö Ú Ö ¬ Ö × x Ù ÐÐ Ó Ó ÒÓº ÙÒÕÙ ×ØÓ ÓÒÐÐ Ú ÙÒ
     Ð ÖÓ Óר ¸ Ô ÖÑ Ø ÓÒÓ Ö Ð ÔÓ× ÓÒ Ò ÓÒ × Ò× ÖØ Ö x Ò Ð ÖÖ ÐÓ Ñ Ò Ö
     ÕÙ ×Ø × ÓÖ Ò Óº
          ÓÑÓ ×ØÙ Ö ÑÓ× Ò Ð ×Ù ¹× ÓÒ Ü ¿º½º ¸ Ð Ö Ò Ñ ÒØÓ ×Ø Ð ÓÖ ØÑÓ × ÔÖÓ¹
     ÔÓÖ ÓÒ Ð Ð nº Ë Ò ×Ø Óר × Ñ ÝÓÖ ÕÙ Ð ÓÒר ÒØ Ð ×Ó ÔÓÖ ÔÓ× ÓÒ¸ Ò Ð
     ÔÖ Ø × ×Ø ÒØ Ù ÒÓº
       ¿
           ÖÚ    ÓÒ Ò Ò Ð ×     ÔÓ ÒØ Ö º
2.1. Arreglos                                                                    33



         Ë ÐÓ× Ð Ñ ÒØÓ× ÒÓ ×Ø Ò ÓÖ Ò Ó׸ ÒØÓÒ × ÔÙ      ØÙ Ö× ¸ Óר Ð ¹
     × ÑÔ ÒÓ¸ Ð Ù×ÕÙ × Ù Ò Ð × Ö Ø Ò Ü ½º¾º¿º¿ Ó Ð ÒÓÑ Ö            ÙÒ ÓÒ
     sequential search<T, Compare>()º Ë  Ò Ð Ø Ö ÓÒ Ö ÕÙ Ö ÔÓÖ ×Ø Ð ×
      Ù×ÕÙ ÔÙ Ö ÕÙ Ö Ö Ò×Ô ÓÒ Ö ØÓ × Ð × Ð × Ð ÖÖ ÐÓ¸ × ÔØ Ð ÓÑÓ
     ×ÓÐÙ ÓÒ Ô Ö × Ð × Ñ Ò ×º
     2.1.1.3    Inserci´n por clave
                       o

     Ë Ð ÖÖ ÐÓ × Ñ ÒØ Ò ×ÓÖ Ò Ó¸ ÒØÓÒ × Ð Ò× Ö ÓÒ × Ö Ô × Ñ Ñ ÒØ
      Ò ÙÖ Ð ¬Ò Ð Ð × Ù Ò º          ÐÓ ÓÒØÖ Ö Ó¸ Ð Ò× Ö ÓÒ Ú Ò Ñ × ÓרÓ× ¸
     ÔÙ × × Ö ÕÙ Ö Ù× Ö Ò Ð ÖÖ ÐÓ Ð ÔÓ× ÓÒ Ò× Ö ÓÒ¸ ÐÙ Ó ×ÔÐ Þ Ö ÐÓ× Ð Ñ Ò¹
     ØÓ× Ð × Ù Ò Ò ÙÒ ÔÓ× ÓÒ         Ð Ö       ݸ ¬Ò ÐÑ ÒØ ¸ ÓÔ Ö Ð Ð Ñ ÒØÓº Ì Ð
      Ð ÓÖ ØÑÓ × ÒÓÑ Ò Ò× Ö ÓÒ ÔÓÖ Ô ÖØÙÖ      Ö      Ý × ÒרÖÙÑ ÒØ ÓÑÓ × Ù
¿¿    ÁÒ× Ö ÓÒ ÔÓÖ Ö  ¿¿ ≡
           template <typename T, class Compare>
       void insert_by_gap(T a[], const T & x, int & n)
       {
         int pos_gap = binary_search<T, Compare>(T, x, 0, n - 1);

           for (int i = n; i > pos_gap; --i)
             a[i] = a[i - 1];

           a[pos_gap] = x;
           ++n;
       }
     Í× × binary search ¿¾º
           ר Ð ÓÖ ØÑÓ × Ô ØÓÖ Þ          Ð × Ù ÒØ ÑÓ Ó

                 ººº    ÓÖ Ò      ººº                ººº    ÓÖ Ò ººº


                                        pos gap             --i            n

     Ä ÖÙØ Ò ×ÙÑ ÕÙ        × Ð ÒØ
                              n                    Ð Ñ ÒØÓ× ÕÙ Ø Ò Ð × Ù Ò Ý ÕÙ ×Ø Ú ÐÓÖ
     ÒÓ Ù Ð Ó Ü    Ð      Ñ Ò× ÓÒ Ð ÖÖ            ÐÓº
         insert by gap<T, Compare>() ØÓÑ             Ð Ø ÑÔÓ    Ù×ÕÙ ¸ ÕÙ × Ö Ô × ÑÓ¸ Ñ ×
      Ð Ø ÑÔÓ       ÖÖÐ Ö      ÕÙ Ö ÕÙ Ö           Ð Ø Ö ÓÒ Ý Ð ÓÔ º
     2.1.1.4    Eliminaci´n por clave
                         o

       ÓÒ ÖÖ ÐÓ׸ Ð Ð Ñ Ò ÓÒ ÔÖ Ñ ÖÓ Ö ÕÙ Ö ÓÒÓ Ö Ð ÔÓ× ÓÒ ÒØÖÓ Ð ÖÖ ÐÓ Ð
      Ð Ñ ÒØÓ Ð Ñ Ò Öº ×ØÓ ÔÙ Ö Ð Þ Ö× Ñ ÒØ Ð ÖÙØ Ò × sequential search<T,
     Compare>() Ó binary search<T, Compare>()¸ × ÙÒ ÕÙ Ð ÖÖ ÐÓ ×Ø Ó ÒÓ ÓÖ Ò Óº
       Ò Ñ × × ØÙ ÓÒ ×¸ Ð Ð Ñ ÒØÓ Ð Ñ Ò Ó          ÙÒ Ù Ó Ó Ö          ÕÙ
      Ø Ô Ö× º
34                                                                  Cap´
                                                                           ıtulo 2. Secuencias



        Ë Ð ÖÖ ÐÓ ×Ø ×ÓÖ Ò Ó¸ ÒØÓÒ × Ð Ð Ñ Ò ÓÒ ÔÙ                         ÐÐ Ú Ö×         Ó ÓÑÓ
    × Ù
¿     Ð Ñ Ò ÓÒ Ò ÖÖ ÐÓ ×ÓÖ Ò Ó ¿ ≡
          template <typename T, class Equal>
      void remove_in_unsorted_array(T a[], const T & x, int & n)
      {
        int pos_gap = sequential_search<T, Equal>(T, x, 0, n - 1);

          if (a[pos_gap] != x)
            // excepci´n: x no se encuentra en a[]
                      o

          a[pos_gap] = a[n - 1];
          --n;
      }
    Í× × sequential search ½        º
          remove in unsorted array<T, Equal>() Ø            Ô Ð Ö      ÓÒ Ð ÙÐØ ÑÓ Ð Ñ ÒØÓ      Ð
    × ÙÒ         º
       Ë Ð           ÖÖ ÐÓ ×Ø ÓÖ Ò Ó¸ ÒØÓÒ × × Ö ÕÙ Ö Ø Ô Ö Ð Ö              Ñ       ÒØ  ×ÔÐ Þ ¹
    Ñ ÒØÓ               Ð ÞÕÙ Ö     ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ× ÕÙ ×Ø Ò Ð Ö                   Ð Ö      Ð
    × Ù ÒØ           ÓÖÑ
¿     ÐÑÒ            ÓÒ Ò ÖÖ ÐÓ ÓÖ Ò Ó ¿ ≡
          template <typename T, class Equal>
      void remove_in_sorted_array(T a[], const T & x, int & n)
      {
        int pos_gap = binary_search<T, Equal>(T, x, 0, n - 1);

          if (a[pos_gap] != x)
            // excepci´n: x no se encuentra en a[] ;
                      o

          for (int i = pos_gap; i < n; ++i)
            a[i] = a[i + 1];

          --n;
      }
    Í× × binary search ¿¾º
          Ä Ø Ò             Ò Ù ×Ø ÓÒ × Ô ØÓÖ Þ         Ð × Ù ÒØ ÓÖÑ

                      ººº    ÓÖ Ò       ººº               ººº   ÓÖ Ò ººº


                                              pos gap            ++i             n


    2.1.2     Manejo de memoria para arreglos
    Ë ÙÒ Ð ×ÕÙ Ñ Ò ÕÙ × Ô ÖØ Ð Ñ ÑÓÖ Ô Ö ÙÒ ÖÖ ÐÓ¸ ר × Ð × ¬                             Ò ×Ø Ø Ó
    Ý Ò Ñ Óº
2.1. Arreglos                                                                          35



2.1.2.1   Arreglos en memoria est´tica
                                 a

   ר Ø ÔÓ ÖÖ ÐÓ × Ð Ö ÐÓ Ð Ó ×Ø Ø Ñ ÒØ ÒØÖÓ ÙÒ ÙÒ ÓÒ º ר ÖÖ ÐÓ
  Ü ÕÙ × ÓÒÓÞ Ð Ñ Ò× ÓÒ Ò Ø ÑÔÓ               ÓÑÔ Ð ÓÒº Ð ÖÖ ÐÓ Ó ÙÔ ØÓ Ó ×Ù
  ×Ô Ó ÙÖ ÒØ ØÓ Ð Ú          Ð ÔÖÓ Ö Ñ Ý ×Ù Ñ Ò× ÓÒ ÒÓ ÔÙ      Ñ Ö× º
      Ò Ò Ö Ð¸ ר Ø ÔÓ     ÖÖ ÐÓ       Ù× Ö× Ô Ö Ù Ö Ö ÓÒר ÒØ × ÕÙ × Ö Ò ÙØ ¹
Ð Þ × ÐÓ Ð Ö Ó ØÓ ´Ó Ð Ñ ÝÓÖ Ô ÖØ µ Ð Ú               Ð ÔÖÓ Ö Ñ º Ì Ñ Ò ÔÙ
ÙØ Ð Þ Ö× ÓÑÓ ÔÓ× ØÓ Ú ÐÓÖ × Ø Ö Ø ÚÓ× ÔÓÖ ÑÔÐÓ¸ ÙÒ ÔÐ ÓÒ ÒÙÑ Ö ÕÙ
× ÑÔÖ Ö Ð ÓÔ Ö ÓÒ × ÓÒ Ñ ØÖ ×               Ñ Ò× ÓÒ ¬ Ý ÙÝÓ Ú ÐÓÖ × Ñ Ò Ò
 ÙÒ ÓÒ Ð ÒØÖ         Ð ÔÖÓ Ð Ñ º
2.1.2.2   Arreglos en pila

  ר Ø ÔÓ ÖÖ ÐÓ × Ð ÕÙ ×        Ð Ö ÒØÖÓ ÙÒ ÙÒ ÓÒ º Ð ×Ô Ó Ñ ÑÓÖ
 × Ô ÖØ Ó Ð Ô Ð            Ù ÓÒ Ð ÔÖÓ Ö Ñ º ÈÙ ×ØÓ ÕÙ Ð Ô Ð      Ù ÓÒ × Ú Ø Ð
Ô Ö Ð ÔÖÓ Ö Ñ ¸ ×       Ø Ò Ö Ù Ó ÓÒ ÙÒ × ÓÖ         Ô Ð Ù× Ó ÔÓÖ ÙÒ Ü × Ú
ÐÓÒ ØÙ Ð ÖÖ ÐÓº ×ØÓ ÔÙ × Ö Ö Ø Ó Ò ÔÖÓ Ö Ñ × ÓÒ ÙÖÖ ÒØ × ÑÙÐØ ¹Ø Ö Ó Ò
 Ñ ÒØ × ÕÙ ×ÓÔÓÖØ Ò ÓÖÖÙØ Ò ×º
    Ä Ú ÒØ       ר Ø ÔÓ ÖÖ ÐÓ × Ó Ð º ÈÖ Ñ ÖÓ Ð ÓÑÔ Ð ÓÖ ÒÓ Ö ÕÙ Ö ÓÒÓ Ö
×Ù Ñ Ò× ÓÒ Ô Ö Ò Ö Ö Ù ÐÕÙ Ö Ó Ó Ö × ÖÚ ÓÒ Ñ ÑÓÖ Ó Ö Ö Ò
 Ð ÖÖ ÐÓº Ò ÓÒ× Ù Ò ¸ × ÔÓ× Ð ×Ô Ö Ö ×Ø Ð             Ù ÓÒ Ð     Ð Ö ÓÒ Ô Ö
 ÓÒÓ Ö ×Ù Ñ Ò× ÓÒº Ä × Ù ÒØ × ÓÒ Ó Ó × Ø Ð Ò ÓÑÔ Ð ÓÖ × GNU
                      void foo(size_t n) { int array[n]; ...       }

    Ä × ÙÒ Ú ÒØ × ÕÙ Ð ×Ô              Ó Ó ÙÔ Ó ÔÓÖ Ð ÖÖ ÐÓ × Ô ÖØ ÙØÓÑ Ø Ñ ÒØ
  Ò Ð ÑÓÑ ÒØÓ         Ù ÓÒ Ð             Ð Ö ÓÒ Ý × Ð Ö Ð × Ð         Ð Ñ ØÓ Ð
   Ð Ö ÓÒº Ò Ð ÑÔÐÓ ÒØ Ö ÓÖ¸          Ð ÖÖ ÐÓ × Ð Ö Ð × Ð         Ð ÙÒ ÓÒ foo()º
        Ù× Ð Ö × Ó       × ÓÖ          Ô Ð ¸ Ð Ù×Ó ×Ø Ø ÔÓ ÖÖ ÐÓ          Ö ×ØÖ Ò Ö×
    Ñ Ò× ÓÒ × Ô ÕÙ Ò ×º      ÔÖ ×Ø    Ö× Ø Ò ÓÒ ×Ñ Ö       Ð Ò Ú Ð Ð × ÐÐ Ñ × Ð ×
 ÙÒ ÓÒ ×¸ Ô٠׸ Ñ       ÕÙ × Ò          Ò Ð × ÐÐ Ñ ×¸ × ÓÒ×ÙÑ Ñ × Ô Ð º
    ÆÓ Ù× ÖÖ ÐÓ× Ò Ô Ð ÒØÖÓ            ÙÒ ÓÒ × Ö ÙÖ× Ú × Ó ÒØÖÓ ÙÒ ÓÒ × ÕÙ × Ö Ò
ÐÐ Ñ × Ö ÙÖ× Ú Ñ ÒØ º
2.1.2.3   Arreglos en memoria din´mica
                                 a
ÍÒ ÖÖ ÐÓ Ò Ñ ÑÓÖ Ò Ñ × ÕÙ Ð Ô ÖØ Ó ØÖ Ú × Ð Ñ Ò ÓÖ Ñ ÑÓÖ º
 Ò C++¸ ÔÓÖ ÑÔÐÓ¸ Ð × Ù ÒØ ÒרÖÙ ÓÒ Ö × ÖÚ ÙÒ ÖÖ ÐÓ 1000 ÒØ ÖÓ×
                    int * array = new int [1000];


    Ð Ø Ñ ÒÓ Ð ÖÖ ÐÓ ×ÓÐÓ ×Ø Ð Ñ Ø Ó ÔÓÖ Ð ÒØ Ñ ÑÓÖ ×ÔÓÒ Ð º Ä
 Ñ Ò× ÓÒ ÔÙ   ×Ô ¬ Ö× ÓÑÓ ÙÒ Ú Ö Ð º
    ר Ø ÔÓ ÖÖ ÐÓ Ü ÕÙ Ð Ñ ÑÓÖ × Ð Ö Ù Ò Ó Ð ÖÖ ÐÓ Ý ÒÓ × Ö ÕÙ Ö º
 Ò Ð ÑÔÐÓ ÒØ Ö ÓÖ ×ØÓ × Ö Ð Þ Ñ ÒØ
      Ò Ý Ò C++ ¸ ÙÒ ÖÖ ÐÓ ×Ø Ø    Ó×     Ð Ö ÒØÖÓ ÙÒ ÙÒ ÓÒ Ó ÙÒ ÑÓ ÙÐÓ ÔÖ         Ó Ð
Ô Ð Ö Ö × ÖÚ staticº Ò Ð ×Ó         ÙÒ ÑÓ ÙÐÓ¸ Ð ÖÖ ÐÓ ×ÓÐÓ × Ú × Ð ÒØÖÓ Ð ÑÓ ÙÐÓ Ý Ô ÖØ Ö
  Ð ÔÙÒØÓ       Ð Ö ÓÒº Ò Ð ×Ó     ÙÒ ÙÒ ÓÒ¸ Ð ÖÖ ÐÓ ×ÓÐÓ × Ú × Ð ÒØÖÓ Ð ÙÒ ÓÒº
      Ø Ò ÓÒ ×ØÓ ÒÓ Ò × Ö Ñ ÒØ    × ÖØÓ Ò ÓØÖÓ× Ð Ò Ù ×º Ò ÇÊÌÊ Æ¸ ÔÓÖ ÑÔÐÓ¸ Ð Ñ ÝÓÖ
   ÐÓ× ÖÖ ÐÓ× ×ÓÒ ×Ø Ø Ó׺
36                                                          Cap´
                                                                   ıtulo 2. Secuencias



                          delete [] array;

          × ÑÔÓÖØ ÒØ Ö × ÐØ Ö ÕÙ Ð ÓÔ Ö ÓÖ delete []         ÑÔ Ö Ø Ú Ñ ÒØ Ù× Ö ÐÓ×
     ÓÖ Ø ×¸ ÔÙ × ×Ø × Ð Ñ Ò Ö        Ò ÖÐ Ð ÓÑÔ Ð ÓÖ ÕÙ × Ð Ö ÙÒ ÖÖ ÐÓ Ý
    ÒÓ ÙÒ ÐÓÕÙ Ñ ÑÓÖ º Ë Ö ÕÙ Ö          ר × ÒØ Ü × ÔÓÖÕÙ × Ò × Ö Ó ÐÐ Ñ Ö ØÓ Ó×
    ÐÓ× ×ØÖÙ ØÓÖ × ÙÒÓ ÔÓÖ       ÒØÖ    Ð ÖÖ ÐÓº
        Ä Ñ ÑÓÖ Ð ÖÖ ÐÓ           Ð Ö Ö× Ô Ò × × × ÙÖÓ ÕÙ ×Ø ÒÓ × Ö Ö ÕÙ Ö Óº
          Ð ÖÖ ÐÓ Ò Ñ ÑÓÖ Ò Ñ × Ð ÓÔ ÓÒ            ØÓ Ô Ö Ð Ñ ÝÓÖ     Ð × ÔÐ ÓÒ ×
    ÕÙ Ù× Ò ÖÖ ÐÓ×        Ñ Ò× ÓÒ Ñ Ò Ó Ö Ò º Ð Ù Ð Ú Ö ¬ ÓÒ Ö Ò Ó×
    ÙØ Ð Ø Ö Ó×    ÔÙÖ ÓÒ ×Ô Ð Þ Ó× Ø Ð × ÓÑÓ dmalloc ¾¼ Ó valgrind ½½ º

    2.1.3    Arreglos de bits
    Ê ÓÖ ÑÓ× ÕÙ ÙÒ ØÓ Ø ÔÓ ÐÓ Ó¸ bool Ò C++¸ ×ÓÐÓ ÔÙ ØÓÑ Ö Ó× Ú ÐÓÖ × true
    Ó falseº È Ö Ö ÔÖ × ÒØ Ö ÙÒ bool ×ÓÐÓ × Ö ÕÙ Ö ÙÒ Ø¸ Ô ÖÓ¸ ÔÓÖ Ö ÞÓÒ × Ð Ò ÓÒ
        Ñ ÑÓÖ ¸ Ò C++ ÙÒ bool × ØÖ Ù Ó ÙÒ ÝØ ÙÝÓ Ú ÐÓÖ ÔÙ × Ö ÖÓ ´0µ Ó ÙÒÓ ´1µº
      ר ×Ô Ö Ó × Ø ´7µ Ø× × ×ÔÖ Ð Ò Ð ÒÑ Ò× Ñ ÝÓÖ                      Ð × ÔÐ ÓÒ ×¸
    ÔÙ × Ð ÒØ            ØÓ× ÐÓ Ó× × Ô ÕÙ Ò º
           ÓÖ   Ò¸ ÕÙ ×Ù        × Ø Ò ÑÓ× ÙÒ ÖÖ ÐÓ        ØÓ× ÐÓ Ó× Ë Ð Ñ Ò× ÓÒ
       Ð ÖÖ ÐÓ × ÓÒ× Ö Ð ¸ ÒØÓÒ × ÔÓ ÑÓ× Ò ÙÖÖ Ö Ò ÙÒ ×Ô Ö Ó Ñ ÑÓÖ Ñ¹
    ÔÓÖØ ÒØ º È ÖÓ¸ Ü ×Ø Ò ÔÐ ÓÒ × ÕÙ Ö ÕÙ Ö Ò ÖÖ ÐÓ× ÐÓ Ó× Ä Ö ×ÔÙ ×Ø ×
     ¬ÖÑ Ø Ú Ý          Ö ÕÙ × ÔÖ × ÒØ Ò ÓÒ ÖØ Ö Ù Ò º
        ÍÒ ÑÔÐÓ × Ð Ñ Ò Ó Ô Ò × Ñ ÑÓÖ Ú ÖØÙ Ð ØÙ Ó ÔÓÖ ÙÒ × ×Ø Ñ
    ÓÔ Ö Ø ÚÓº ÓÒ× Ö ÑÓ× ÙÒ Ñ ÑÓÖ ÔÖ Ò Ô Ð 512 Å Ý Ô Ò × 4 à ÙÒ × ×Ø Ñ
    ÓÔ Ö Ø ÚÓ     Ñ ÒØ Ò Ö Ð ×Ø Ó 512×1024à = 131072 Ô Ò ×º Ë
                                             4à                               ר Ó ×
    Ö ÔÖ × ÒØ ÓÒ ÙÒ ÝØ ¸ ÒØÓÒ × × Ö ÕÙ Ö Ò 128 Ã            Ñ ÑÓÖ Ô Ö ÐÑ Ò Ö Ð
     ר Ó Ð × 131072 Ô Ò ×º ÈÓÖ            Ô Ò ¸ Ð × ×Ø Ñ ÓÔ Ö Ø ÚÓ Ñ Ò Ó× Ø×º Ð
    ÔÖ Ñ ÖÓ Ò × Ð Ô Ò × Ò Ù ÒØÖ Ó ÒÓ Ò Ñ ÑÓÖ ÔÖ Ò Ô Ðº Ð × ÙÒ Ó Ò ×
    ÙÒ Ô Ò       × Ó Ó ÒÓ ÑÓ ¬ º Ë × ÙØ Ð Þ Ò Ó× Ø× ÔÓÖ Ô Ò ¸ × Ö ÕÙ Ö Ò
                                   2 × 131072
                                              = 32768 = 32Ã ;
                                        8
    ÕÙ ¸ ÓÑÓ × Ú ¸ Ö ÔÖ × ÒØ ÙÒ ÓÖÖÓ Ñ ÑÓÖ × Ò ¬ Ø ÚÓº
       È Ö Ñ Ò Ö ÖÖ ÐÓ×         Ø×¸ ÒØÖÓ Ù Ö ÑÓ× Ð Ì BitArray¸ Ð Ù Ð ÑÓ Ð Þ
    Ú ØÓÖ ×     Ø×º ר Ì ×Ø ×Ô ¬ Ó ÑÔÐ ÒØ Ó Ò Ð Ö ÚÓ Ø ÖÖ ÝºÀ ¿
¿     Ø ÖÖ ÝºÀ ¿ ≡
     class BitArray
     {
          Å Ñ ÖÓ× ÔÖ Ú Ó×       BitArray ¿
          Å Ñ ÖÓ× ÔÙ Ð Ó×       BitArray ¿
     };
      ¬Ò ×
     BitArray¸   Ù×   Ò ÙÒ × ¿ ¸ ¿ ¸ ¿ ¸ ¿ ß ¾¸ Ò   º
     ÄÓ× ØÖ ÙØÓ× × Ó× BitArray ÓÒ ÖÒ Ò ×Ù Ñ Ò× ÓÒ
¿   Å Ñ ÖÓ× ÔÖ Ú Ó× BitArray ¿ ≡                  ´¿                µ ¿
      Ð × ÝØ ¿
     mutable size_t         num_bits;
     mutable size_t         num_bytes;
2.1. Arreglos                                                                        37



    num bits ÐÑ Ò Ð Ñ Ò× ÓÒ Ò Ø× Ñ ÒØÖ × ÕÙ num bytes ÐÑ Ò Ð Ñ Ò× ÓÒ
     Ð ÖÖ ÐÓ    ÝØ × array of bytesº Ð Ú ÐÓÖ num bytes × Ñ Ò ÑÓ Ý ×Ù¬ ÒØ Ô Ö
    ÐÑ Ò Ö ÐÓ× Ø× Ö ÕÙ Ö Ó׺
      Ä × Ð ÖÖ ÐÓ          ÝØ × × Ö ÐÑ Ò     Ò
¿   Å Ñ ÖÓ× ÔÖ Ú Ó× BitArray ¿ +≡                    ´¿ µ ¿ ¿
     Byte * array_of_bytes;
         Ð ØÖÙ Ó Ô Ö Ö Ð Þ Ö ÙÒ ÑÔÐ ÒØ ÓÒ × Ò ÐÐ × ×ÔÓÒ Ö ÙÒ ×ÓÔÓÖØ ÕÙ Ñ Ò Ô¹
    ÙÐ ÐÓ× Ø× ÒØÖÓ ÙÒ ÝØ º         Ó ×ÓÔÓÖØ ר   Ó ÔÓÖ Ð ×Ù Ð × BitArray::Byte¸
    Ð Ù Ð × ¬Ò ×
¿     Ð × ÝØ ¿ ≡                                               ´¿ µ
     struct Byte
     {
       unsigned int   b0   :   1;
       unsigned int   b1   :   1;
       unsigned int   b2   :   1;
       unsigned int   b3   :   1;
       unsigned int   b4   :   1;
       unsigned int   b5   :   1;
       unsigned int   b6   :   1;
       unsigned int   b7   :   1;
          Ä ØÙÖ       Ø¿
           × Ö ØÙÖ     Ø¿
           ÓÒרÖÙ ØÓÖ     ÝØ ¿
     };
         × Ñ ÒØ ¸ Ð ×Ù ¹ Ð × BitArray::Byte ¬Ò ÙÒ Ñ × Ö                     8     Ø× Ñ ÒØ
     ÑÔÓ× Ø× º ר Ñ × Ö Ô ÖÑ Ø ÙÒ ×Ó × Ò ÐÐÓ Ó ÙÒ Ò                              غ Ä Ð ØÙÖ
    ׸ ÒØÓÒ ×¸ ÑÔÐ ÒØ    ÓÑÓ × Ù
¿   Ä ØÙÖ      Ø¿ ≡                                                       ´¿ µ
     unsigned   int read_bit(const unsigned int & i) const
     {
       switch   (i)
         {
         case   0 : return b0;
         case   1 : return b1;
           //   ...
         case   7 : return b7;
         }
     }
     ÓÒ i × Ð Ò       Ð Ø ÕÙ × × Ð Öº
       Ä × Ö ØÙÖ × ÑÔÐ ÒØ    ÓÑÓ × Ù
¿     × Ö ØÙÖ   Ø¿ ≡                                                      ´¿ µ
     void write_bit(const unsigned int & i, const unsigned int & value)
     {
       switch (i)
         {
         case 0 : b0 = value; break;
         case 1 : b1 = value; break;
       ÄÓ× ÑÔÓ× Ø× Ù ÖÓÒ ÓÖ Ò ÐÑ ÒØ    ¬Ò Ó× Ô Ö Ð Ð Ò Ù     Ý ×ÓÒ Ô ÖØ    Ð C++
38                                                            Cap´
                                                                     ıtulo 2. Secuencias



              // ...
            case 7 : b7 = value; break;
            }
      }
     ÓÒ     i × Ð Ò     Ð Ø ÕÙ × ×       Ö Ý value × Ð Ø ÕÙ × × × Ö Öº
        × ÑÙÝ ÙØ и ÜÔ Ò× × ÙÒ ÔÓ Ó Ø ÑÔÓ¸ ÕÙ Ù Ò Ó × Ô ÖØ Ð Ñ ÑÓÖ
    Ô Ö ÙÒ Ó ØÓ Ø ÔÓ Byte ØÓ Ó× ×Ù× Ø× ר Ò Ò Ó× Ò ÖÓº ÁÑÔÐ ÒØ Ö ÑÓ× ×Ø
    × Ñ ÒØ Ò Ð ÓÒרÖÙ ØÓÖ ÔÓÖ ÓÑ × ÓÒ
¿     ÓÒרÖÙ ØÓÖ    ÝØ ¿ ≡                                  ´¿ µ
      Byte() : b0(0), b1(0), b2(0), b3(0), b4(0), b5(0), b6(0), b7(0) { /* empty */ }
    ר ÓÒרÖÙ ØÓÖ Ö ÒØ Þ ÕÙ ØÓ Ó ÖÖ ÐÓ Ø ÔÓ Byte Ø Ò ØÓ Ó× ×Ù× Ø× Ò ÖÓº
      È Ö Ð Ö Ö ÙÒ Ó ØÓ Ø ÔÓ BitArray ר ÓÒ ×Ô ¬ Ö Ð Ñ Ò× ÓÒ Ð ÖÖ ÐÓº
    Ð ÓÒרÖÙ ØÓÖ Ý Ð ×ØÖÙ ØÓÖ Ø Ò Ò¸ Ô٠׸ Ð × Ù ÒØ ÓÖÑ
¿   Å Ñ ÖÓ× ÔÙ Ð Ó× BitArray ¿ ≡                        ´¿ µ ¿
      BitArray(const size_t & dim = 256)
        : num_bits(dim), num_bytes(num_bits/8 + (((num_bits % 8) != 0) ? 1 : 0)),
          array_of_bytes (new Byte [num_bytes])
      { /* empty */ }
      ~BitArray() { delete [] array_of_bytes; }
    Í× × BitArray ¿ º
     È Ö ÓÒÓ Ö Ð Ñ Ò× ÓÒ Ð ÖÖ ÐÓ¸ × ÔÙ                   ÑÔÐ Ö Ð Ñ ØÓ Ó
¿   Å Ñ ÖÓ× ÔÙ Ð Ó× BitArray ¿ +≡                               ´¿ µ ¿    ¿
      const size_t & size() const { return   get_len(); }
        Ð     ×Ó ÐÓ× Ð Ñ ÒØÓ× Ð ÖÖ ÐÓ × Ö Ð Þ Ñ ÒØ Ð ÓÔ Ö ÓÖ []¸ Ð Ù Ð ×
     ÓÑÔÐ    Ó ×Ô ¬ Ö Ý ÑÔÐ ÒØ Ö ÔÓÖÕÙ ×Ø        ר Ò Ù Ö ÐÓ× ×Ó× Ð ØÙÖ
      ÐÓ×    × Ö ØÙÖ º
          Ó Ð Ò i ÙÒ Ø¸ Ð ÔÓ× ÓÒ byte index ÒØÖÓ array of bytes × Ð ÙÐ
     ÓÑÓ × Ù
                                                    i
                                     byte index =         .
                                                    8
    ËÙ ÔÓ× ÓÒ bit index ÒØÖÓ Ð ÝØ ר Ö                  ÔÓÖ
                                  bit index = i     ÑÓ    8 .

          ÓÒ× Ö ÑÓ× Ð ÒרÖÙ ÓÒ i = array[40]; ÕÙ Ð Ö Ð Ú ÐÓÖ Ð Ø ÓÖÖ ×ÔÓÒ ÒØ
       Ð ÒØÖ 40º Ò ×Ø ×Ó¸ Ð ÑÔÐ ÒØ ÓÒ Ð ÓÔ Ö ÓÖ []               Ù× Ö Ð Ø 40 Ý
     ÒØÓÒ × Ö ØÓÖÒ Ö ÙÒ Ö ÔÖ × ÒØ ÓÒ ÒØ Ö ¹ Ø ÔÓ int¹ Ð Ø         Óº Ò ×Ø ×Ó¸
     Ð ÓÔ Ö ÓÖ []      ÒÚÓ Ö read bit()º
            ÓÖ ÓÒ× Ö ÑÓ× Ð ÒרÖÙ ÓÒ array[40] = i; ÕÙ × Ö Ö Ò Ð ÒØÖ 40 Ð
     ÖÖ ÐÓ Ð Ú ÐÓÖ ÓÒØ Ò Ó Ò Ð Ú Ö Ð iº Ò ×Ø ×Ó¸ Ð ×Ó           ÐÓ Ð Þ Ö Ð Ø 40
     Ò Ð ÖÖ ÐÓ Ý × Ö Ö¸ ÒÓ Ð Ö¸ Ð Ú ÐÓÖ iº Ò ×Ø ×Ó¸ Ð ÓÔ Ö ÓÖ []          ÒÚÓ Ö
      write bit()º
        Ä ÑÔÐ ÒØ ÓÒ Ð ÓÔ Ö ÓÖ [] Ö ÕÙ Ö ¸ ÒØÓÒ ×¸ Ö Ð Þ Ö ÓÔ Ö ÓÒ × Ö ÒØ ×
    × ÙÒ Ð Ø ÔÓ        ×Ó Ð ØÙÖ Ó × Ö ØÙÖ º ×ØÓ ÒÓ × ÔÙ Ö Ð Þ Ö Ò Ð ÑÔÐ ÒØ ÓÒ
         Ð ÙÒ Ð × Ð Ö ÓÒ × ØÖ ÓÒ Ð × Ð ÓÔ Ö ÓÖ []¸ Ô ÖÓ × × ÔÙ ÔÓר Ö Ö Ð
      ר Ò ÓÒ ×Ø Ð ÙÒ ÑÓÑ ÒØÓ Ò ÕÙ × ÔÓ× Ð ÓÒÓ Ö × Ð ×Ó × Ð ØÙÖ Ó
2.1. Arreglos                                                                      39



    × Ö ØÙÖ º Ì Ð ×Ø Ò ÓÒ × Ö Ð Þ Ñ ÒØ ÙÒ ÓÑ Ò ÓÒ Ð ÓÔ Ö ÓÖ [] Ý                       ÙÒ
    Ð × ×Ô Ð ÒÓÑ Ò          ÔÖÓÜÝ ¸ Ð Ù Ð × ¬Ò ÓÑÓ × Ù
¿   Å Ñ ÖÓ× ÔÖ Ú Ó× BitArray ¿ +≡                      ´¿ µ ¿
      class BitProxy
      {
           Ñ Ñ ÖÓ× ÔÖ Ú Ó×              ØÈÖÓÜÝ ¿
           Ñ Ñ ÖÓ× ÔÙ Ð Ó×             ØÈÖÓÜÝ ¿
      };
      ¬Ò ×
      BitProxy¸   Ù×   Ò ÙÒ × ¿ Ò        ¼ º
      Ð ÓÔ Ö ÓÖ []            BitArray       Ö ØÓÖÒ ÙÒ BitProxy¸   Ñ Ò Ö Ø Ð ÓÑÓ × Ù
¿   Å Ñ ÖÓ× ÔÙ Ð Ó×      BitArray ¿ +≡                     ´¿ µ ¿     ¼
      BitProxy operator [] (const size_t & i) const
      {
        return BitProxy(const_cast<BitArray&>(*this), i);
      }
      BitProxy operator [] (const size_t & i) { return BitProxy(*this, i); }
    Í× × BitArray ¿     Ò   BitProxy   ¿ º
     Ð ÔÖ Ñ Ö ÓÔ Ö ÓÖ × ÒÚÓ Ô Ö ÙÒ BitArray ÓÒר ÒØ ´ Ð Ö Ó constµ¸ Ñ ÒØÖ ×
    ÕÙ Ð × ÙÒ Ó Ô Ö ÙÒ BitArray ÕÙ ÒÓ × ÓÒר ÒØ º
         Ð ÓÔ Ö ÓÖ × Ò ÓÒ Ý Ð ÓÒרÖÙ ØÓÖ ÓÔ       BitProxy ÑÔÐ ÒØ Ò Ð × Ö ØÙÖ ¸
    Ñ ÒØÖ × ÕÙ Ð ÓÔ Ö ÓÖ ÓÒÚ Ö× ÓÒ Ø ÔÓ ÑÔÐ ÒØ Ð Ð ØÙÖ º
         Ù ÐÕÙ Ö × Ð Ø ÔÓ        ×Ó¸ ÔÖ Ú Ñ ÒØ × Ò × Ö Ó Ð ÙÐ Ö Ð Ò      Ð ÝØ
      ÒØÖÓ array of bytes Ý Ð Ò           Ð Ø ÒØÖÓ Ð ÝØ º ר Ò ÓÖÑ ÓÒ Ð
     Ù Ö ÑÓ× Ò ÐÓ× × Ù ÒØ × ØÖ ÙØÓ×
¿    Ñ Ñ ÖÓ× ÔÖ Ú Ó×     ØÈÖÓÜÝ ¿ ≡                            ´¿ µ
      const size_t bit_index;
      Byte * byte_ptr;
      Ì Ð × ØÖ ÙØÓ× × Ò Ò Ò Ð ÓÒרÖÙ ØÓÖ                    BitProxy
¿   Ñ Ñ ÖÓ× ÔÙ Ð Ó×    ØÈÖÓÜÝ ¿ ≡                                       ´¿ µ ¼
      BitProxy(BitArray & array, const size_t & i) : bit_index(i % 8)
      {
        const size_t byte_index = i/8;
        byte_ptr = &array.array_of_bytes[byte_index];
      }
    Í× × BitArray ¿     Ò   BitProxy   ¿ º
      Ù Ò Ó × Òר Ò ÙÒ Ð × BitProxy¸ ×          Ö¸ Ù Ò Ó × ÒÚÓ Ð ÓÔ Ö ÓÖ []
       BitArray¸ Ð ÑÔÓ byte ptr ÔÙÒØ Ð ÝØ         ÒØÖÓ array of bytes ÕÙ ÓÒ¹
    Ø Ò Ð Ø ÕÙ × ×               Öº bit index ÓÒØ Ò Ð Ò         Ð Ø ÒØÖÓ Ð
     ÝØ *byte ptrº Ë Ð Ò i ר Ù Ö           Ö Ò Ó¸ ÒØÓÒ × Ð ÓÒרÖÙ ØÓÖ ×Ô Ö Ð
     Ü Ô ÓÒ std::out of range()º
        ÆÓØ × ÕÙ Ð ÑÓÑ ÒØÓ      ÓÒרÖÙ ÓÒ ÙÒ BitProxy ÙÒ ÒÓ ×        Ö ÐÞ Ó Ð
        ×Ó¸ Ô ÖÓ × ×    Ð ÙÐ Ó Ð Ö ÓÒ Ð ÝØ ÓÒ × Ò Ù ÒØÖ Ð Ø ´byte ptrµ
    Ý×        Ø ÖÑ Ò Ó Ù Ð × Ð Ø ÒØÖÓ × ÝØ ´bit indexµº
        Ë ÙÒ Ð ÓÒØ ÜØÓ Ð ÜÔÖ × ÓÒ ÕÙ ÒÚÓÕÙ Ð ÓÔ Ö ÓÖ [] Ð ÓÑÔ Ð ÓÖ ×Ø Ò Ù
    × Ð ×Ó × Ð ØÙÖ Ó × Ö ØÙÖ º Ë × Ð ØÙÖ ¸ ÒØÓÒ × Ð ÓÑÔ Ð ÓÖ ØÖ Ø Ö
40                                                          Cap´
                                                                   ıtulo 2. Secuencias



      ÓÒÚ ÖØ Ö Ð BitProxy ÙÒ ÒØ ÖÓ Ö ×ÙÐØ ÒØ        Ð Ð ØÙÖ
¼   Ñ Ñ ÖÓ× ÔÙ Ð Ó×      ØÈÖÓÜÝ ¿ +≡                          ´¿ µ ¿    ¼
      operator int () const { return byte_ptr->read_bit(bit_index); }
      Ù Ò Ó Ð ÓÑÔ Ð ÓÖ Ò Ù ÒØÖ ÙÒ ÜÔÖ × ÓÒ ÓÑÓ i = array[40]¸ × Ù× ÙÒ ÓÒ×¹
    ØÖÙ ØÓÖ int ÓÒ Ô Ö Ñ ØÖÓ BitProxyº Ë ÒÓ¸ Ð ÓÑÔ Ð ÓÖ Ù× ÙÒ × Ò ÓÒ
       BitProxy intº      ÓÑÓ ÒÓ Ü ×Ø Ò Ò ÙÒÓ  רÓ× ÓÔ Ö ÓÖ ×¸ Ð ÓÑÔ Ð ÓÖ ÓÒ¹
    Ú ÖØ Ð ÔÖÓÜÝ ÙÒ intº
         Ò Ð ÜÔÖ × ÓÒ array[40] = i¸ ר ÓÒ ¬Ò Ö ÙÒ ÓÔ Ö ÓÖ × Ò ÓÒ ÔÖÓÜÝ
      Ô ÖØ Ö ÙÒ ÒØ ÖÓ Ø Ð ÓÑÓ × Ù
¼    Ñ Ñ ÖÓ× ÔÙ Ð Ó×       ØÈÖÓÜÝ ¿ +≡                    ´¿ µ ¼
      BitProxy& operator = (const size_t & value)
      {
        byte_ptr->write_bit(bit_index, value);
        return *this;
      }
    Í× × BitProxy ¿ º
       Ä Ð × BitProxy Ô ÖÑ Ø Ñ Ò Ö ÙÒ ÖÖ ÐÓ      Ø× × Ü Ø Ñ ÒØ     Ð Ñ ×Ñ
    Ñ Ò Ö ÕÙ × Ù× Ò ÐÓ× ÖÖ ÐÓ׺ Ë Ò Ñ Ö Ó¸ ר Ø Ò Ò Ö ÒØ Þ ÕÙ × ÑÔÖ ×
    ÔÓ× Ð Ù× Ö Ð ÓÔ Ö ÓÖ []¸ Ò × Ð   Ñ × ÐØÓ × ÑÔ ÒÓº ÈÓÖ × Ö ÞÓÒ ÜÔÓÖØ ÑÓ×
     Ó× ÓÔ Ö ÓÒ × ÜÔÐ Ø × Ð ØÙÖ Ý × Ö ØÙÖ
¼    Å Ñ ÖÓ× ÔÙ Ð Ó× BitArray ¿ +≡                 ´¿ µ ¿    ¼
      int read_bit(const size_t & i) const
      {
        const int bit_index = i % 8;
        return array_of_bytes[i/8].read_bit(bit_index);
      }
      void write_bit(const size_t & i, const unsigned int & value) const
      {
        array_of_bytes[i/8].write_bit(i, value);
      }
           ØÓ× Ñ ÓÖ × ÑÔ ÒÓ¸ ר × ÓÔ Ö ÓÒ × ÒÓ Ö Ð Þ Ò Ú Ö ¬ ÓÒ × ÓÖÖ Ø ØÙ º
          ÓÑÓ ÖÖ ÐÓ¸ ÙÒ BitArray ר ×Ù ØÓ Ð × Ñ ×Ñ × Ö ×ØÖ ÓÒ × ×Ó   ׸ × Ò Ó Ð
    ÔÖ Ò Ô Ð Ó ×Ø ÙÐÓ Ð ÔÓ× Ð         ÕÙ Ð Ñ Ò× ÓÒ ÒÓ × ×Ù¬ ÒØ Ô Ö Ù Ö Ö ÐÓ×
      Ø× Ö ÕÙ Ö Ó׺ ÈÓÖ × Ö ÞÓÒ¸ ÔÐ ÒØ Ö ÑÓ× ÙÒ ÓÔ Ö ÓÒ Ö Ùר ¸ ÓÒ× ×Ø ÒØ Ò Ð
    Ö ¹ ¬Ò ÓÒ Ð Ñ Ò× ÓÒ
¼    Å Ñ ÖÓ× ÔÙ Ð Ó× BitArray ¿ +≡                          ´¿ µ ¼
      void resize(const size_t & new_dim)
      {
        const size_t new_num_bytes = new_dim/8 + (((new_dim % 8) != 0) ? 1 : 0);
        Byte * new_array_of_bytes = new Byte [new_num_bytes];

         for (int i = 0, n = Aleph::min(num_bytes, new_num_bytes); i < n; ++i)
           new_array_of_bytes[i] = array_of_bytes[i];

         num_bits = new_dim;
         num_bytes = new_num_bytes;
         delete [] array_of_bytes;
         array_of_bytes = new_array_of_bytes;
2.1. Arreglos                                                          41



 }
ÆÓØ ÑÓ× ÕÙ Ñ ÒØ resize() ÒÓ ×ÓÐÓ ÔÙ       Ñ Ö× Ð Ñ Ò× ÓÒ Ô Ö      Ö Ð
 ÖÖ ÐÓ Ñ × Ö Ò ¸ × ÒÓ¸ Ø Ñ Ò¸ Ô Ö   ÖÐÓ Ñ × Ô ÕÙ ÒÓº Ò ×Ø ÙÐØ ÑÓ ×Ó ×
Ô Ö Ò ÐÓ× Ø× Ü ÒØ ׺

2.1.4   Arreglos Din´micos
                    a
ÍÒ ÖÖ ÐÓ Ò Ñ Ó × ÕÙ Ð Ò Ð Ù Ð ×Ù Ñ Ò× ÓÒ ÔÙ ÑÓ ¬ Ö× Ò Ñ Ñ ÒØ º
  ×ØÓ × ÑÙÝ ÙØ Ð Ô Ö ÔÐ ÓÒ × ÕÙ ×       Ò Ò ¬ Ö Ð Ö Ô Ó ×Ó ÔÓÖ ÔÓ× ÓÒ¸
Ô ÖÓ ÕÙ ÒÓ ÓÒÓ Ò Ð ÒÙÑ ÖÓ Ð Ñ ÒØÓ× ÕÙ × ÔÙ Ò Ñ Ò Öº ÈÓÖ ÑÔÐÓ¸ ÙÒ Ø ÔÓ
 ×Ô Ð Ö ÙÔ Ö ÓÒ Ð Ú ¹ Ö ÓÒ¸ ÐÐ Ñ Ó × Ò Ò Ñ Ó¸ ÙÑ ÒØ Ý ÓÒØÖ
ÔÖÓ Ö × Ú Ñ ÒØ Ð Ñ Ò× ÓÒ ÙÒ ÖÖ ÐÓº ר רÖÙ ØÙÖ × ÜÔÐ Ò Ð × ÓÒ Ü º½º º
    C Ý C++ ÒÓ ×ÓÔÓÖØ Ò ÖÖ ÐÓ× Ò Ñ Ó׺ ×ØÓ ÑÔÐ ÕÙ ÐÓ× ÖÖ ÐÓ× Ò Ñ Ó×      Ò
×ÙÖØ Ö× ÔÓÖ ÙÒ Ì Ò Ð ÓØ º
        ÓÖ    Ò¸ ÓÑÓ ÑÔÐ Ñ ÒØ Ö ÙÒ ÖÖ ÐÓ Ò Ñ Ó Ä Ò Þ ×Ù Ö ÕÙ ×
Ö ÐÓ Ð Ð ÖÖ ÐÓº ÁÒ ÐÑ ÒØ ¸ × ¬ ÙÒ Ñ Ò× ÓÒ Ý × Ô ÖØ Ñ ÑÓÖ Ô Ö Ð
 ÖÖ ÐÓº Ë Ð Ñ Ò× ÓÒ × Ð ÒÞ ¸ ÒØÓÒ × × Ø ÖÑ Ò ÙÒ ÒÙ Ú Ñ Ò× ÓÒ Ñ ÝÓÖ
Ý × Ô ÖØ ÙÒ ÒÙ ÚÓ ÐÓÕÙ Ñ ÑÓÖ º ×Ô٠׸ ÐÓ× Ð Ñ ÒØÓ× × ÓÔ Ò Ð ÒÙ ÚÓ ÐÓÕÙ
ݸ ¬Ò ÐÑ ÒØ ¸ × Ð Ö Ð ÒØ ÙÓ ÐÓÕÙ º
      ר Ò ÓÕÙ × Ó ÙØ Ð Þ Ó ÓÒ Ü ØÓ Ò Ð ÙÒÓ× × ×Ø Ñ × ÑÔÓÖØ ÒØ ׺ Ä Ð ÓØ
 ר Ò Ö C Ó Ö ÙÒ ÔÖ Ñ Ø Ú ¸ realloc()¸ ÙÝ × ÒØ Ü × × Ð × Ù ÒØ
        void *realloc(void *ptr, size_t size);

   Ä ÖÙØ Ò Ñ Ð Ø Ñ ÒÓ Ð ÐÓÕÙ              Ñ ÑÓÖ ÔÙÒØ Ó ÔÓÖ ptr¸ Ð Ù Ð
    Ö × Ó Ó Ø Ò Ó ÐÐ Ñ × ÔÖ Ú × malloc()¸ calloc() Ó realloc()º Ð ÓÒ¹
Ø Ò Ó ptr Ô ÖÑ Ò Ö ÒÑÓ ¬ Ó Ð Ñ Ò ÑÓ ÔÓ× Ð ÒØÖ Ð ÒØ ÙÓ Ý Ð ÒÙ ÚÓ
Ø Ñ ÒÓ sizeº
    Ì ÓÖ Ñ ÒØ ¸ realloc() × ÒØ Ð ÒØ Ý Ô Þ Ô ÖØ Ö ÙÒ ÐÓÕÙ Ñ × Ö Ò
× Ò Ñ Ö Ð Ö ÓÒ Ñ ÑÓÖ º ×ØÓ × ÒØ Ö × ÒØ ÔÓÖÕÙ × Ú Ø Ð ÓÔ                ÐÓ×
 Ð Ñ ÒØÓ× Ð ÒØ ÙÓ ÐÓÕÙ         Ð ÒÙ ÚÓ ÐÓÕÙ º ÑÔ ÖÓ¸ Ò Ð ÔÖ Ø ×ØÓ ÒÓ × ×Ù¹
¬ ÒØ ÔÓÖÕÙ ÒÓ × ÙÒ Ö ÒØ º             Ó¸ ÑÙÝ ÔÓ × ÑÔÐ Ñ ÒØ ÓÒ × realloc()
    Ò ÙÒ × Ù ÖÞÓ ÔÓÖ Ú Ö ¬ Ö × Ý Ñ ÑÓÖ ÓÒØ Ù ×ÔÓÒ Ð ptrº
2.1.5   El TAD DynArray<T>
 Ò ×Ø ×     ÓÒ ÑÓ×ØÖ Ö ÑÓ× ØÓ Ð ÒØ Ö Þ ÑÔÐ Ñ ÒØ ÓÒ ÙÒ Ì ¸ ÐÐ Ñ Ó
DynArray<T>¸ Ð Ù Ð ÑÓ Ð Þ ÙÒ ÖÖ ÐÓ Ò Ñ Ó      Ð Ñ ÒØÓ× Ø ÔÓ Tº
   DynArray<T> ×ØÖ ÙÒ         Ñ Ò× ÓÒ ØÙ Ð ÓÒ ÙÒ Ú ÐÓÖ Ò Ð ×Ô ¬ Ó Ò
Ø ÑÔÓ ÓÒרÖÙ ÓÒº Ì Ð Ñ Ò× ÓÒ ØÙ Ð × ÓÒÓ Ñ ÒØ Ð Ñ ØÓ Ó size()º
   DynArray<T> Ö ÒØ Þ ÙÒ ÓÒ×ÙÑÓ       Ñ ÑÓÖ ÔÖÓÔÓÖ ÓÒ Ð Ð ÒØ           Ò¹
ØÖ × × Ö Ø × Ð ÖÖ ÐÓ × Ö¸ Ð × ÒØÖ × ÕÙ ÒÓ Ò × Ó × Ö Ø × ÒÓ Ò × Ö ¹
Ñ ÒØ ÓÒ×ÙÑ Ò Ñ ÑÓÖ º Ä Ñ ÑÓÖ × Ö × ÖÚ ×ÓÐÓ Ù Ò Ó × × Ö Ò Ð × ÒØÖ ×
ÔÓÖ ÔÖ Ñ Ö Ú Þº
   Ä Ñ Ò× ÓÒ ØÙ Ð × ÜÔ Ò Ô Ö ÞÓ× Ý ÙØÓÑ Ø Ñ ÒØ Ù Ò Ó × × Ö ×Ó Ö
ÙÒ Ò ÕÙ ×Ø Ù Ö          Ð Ñ Ò× ÓÒ ØÙ к Ë × Ö Ö Ò ÙÒ Ò         ÓÑÓ Ð ØÙÖ
Ñ ÝÓÖ Ó Ù Ð Ð Ñ Ò× ÓÒ ØÙ и ÒØÓÒ × × Ò Ö Ð Ü Ô ÓÒ Ù Ö Ö Ò Óº
42                                                                   Cap´
                                                                            ıtulo 2. Secuencias



         Ä  Ñ Ò× ÓÒ ØÙ Ð ÔÙ ÓÒØÖ Ö× ÜÔÐ Ø Ñ ÒØ Ñ ÒØ ÙÒ ÓÔ Ö ÓÒ ÐÐ Ñ
    cut()º  Ä ÙÒ ÓÒ Ð Ö ÒØÓÒ × ØÓ Ð Ñ ÑÓÖ Ó ÙÔ      ÒØÖ Ð ÒÙ Ú Ý ÒØ Ö ÓÖ
      Ñ Ò× ÓÒ ØÙ к
        DynArray<T> × ×Ô ¬  Ò Ð Ö ÚÓ ØÔÐ ÝÒ ÖÖ ÝºÀ ¾ ¸ Ð Ù Ð ÜÔÓÖØ Ð Ð ×
    Ô Ö Ñ ØÖ Þ DynArray<T>
¾    ØÔÐ ÝÒ ÖÖ ÝºÀ ¾ ≡
           template <typename T>
      class DynArray
      {
          Ñ Ñ ÖÓ× ÓÒר ÒØ × DynArray<T>
          Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T>
          Ñ Ñ ÖÓ× ÔÙ Ð Ó× DynArray<T>
      };
       ÁÒ     ÓÒ ÓÒר ÒØ × DynArray<T> ½
      ¬Ò ×
      DynArray¸  Ù× Ò ÙÒ × ¸ ½¸ ¾ ¸ ¸            ¸½    ¸ ¾ ¾¸ ¿¿¾ ¸ ¿ ß ½¸ ¿¾¸   ß ½¸    ¸    ¸   ¼¸
             ¾ ¸ ¿¸ ¾¸ Ò   º
         × Ò ×Ô Ò× Ð ÕÙ Ü ×Ø Ð ÓÒרÖÙ ØÓÖ ÔÓÖ ÓÑ × ÓÒ T::T()¸ × ÓÑÓ Ð ×ØÖÙ ¹
    ØÓÖ T::~T()º Ä Ù× Ò         Ù ÐÕÙ Ö      ÐÐÓ× × Ö ÔÓÖØ ÓÑÓ ÖÖÓÖ Ò Ø ÑÔÓ
     ÓÑÔ Ð ÓÒº
        ÍÒ DynArray<T> ×Ó ÙÒ Ñ Ò× ÓÒ Ñ Ü Ñ º ÍÒ ÖÖ ÐÓ ÒÓ ÔÙ            ÜÔ Ò Ö×
    Ñ × ÐÐ       ÕÙ ÐÐ Ñ Ò× ÓÒº ÈÓÖ ÓÑ × ÓÒ¸ Ð Ñ Ò× ÓÒ Ñ Ü Ñ × 2         ÒØÖ ×
    ´2 × 1024 × 1024 × 1024µ º
    2.1.5.1     Estructura de datos de DynArray<T>

    Ä ¬ ÙÖ ¾º½ ´Ô Ò ¿µ ×ÕÙ Ñ Ø Þ Ð Ö ÔÖ × ÒØ ÓÒ Ò Ñ ÑÓÖ                          ÙÒ DynArray<T>¸
    Ð Ù Ð ÐÙ×ØÖ ØÖ × Ð × × ÓÑÔÓÒ ÒØ ×
    Directorio:  ÖÖ ÐÓ ÔÙÒØ ÓÖ × ×                Ñ ÒØÓ× ÙÝ       Ñ Ò× ÓÒ × dir sizeº
    Segmento: ÖÖ ÐÓ        ÔÙÒØ ÓÖ ×              ÐÓÕÙ × ÙÝ       Ñ Ò× ÓÒ × seg sizeº ÈÙ Ò
         Ü ×Ø Ö ×Ø dir size × Ñ ÒØÓ׺
    Bloque: ÖÖ ÐÓ     Ð Ñ ÒØÓ× Ø ÔÓ T            ÙÝ Ñ Ò× ÓÒ × block sizeº Ò ØÓØ Ð¸ ÔÙ Ò
         Ü ×Ø Ö ×Ø dir size × seg size            ÐÓÕ٠׺ ÄÓ× ÐÓÕÙ × ÐÑ Ò Ò ÐÓ× Ð Ñ ÒØÓ×
           Ð ÖÖ ÐÓº Ä Ñ Ò× ÓÒ Ñ Ü Ñ               Ð ÖÖ ÐÓ × dir size × seg size × block size
         Ð Ñ ÒØÓ׺
         ËÓ Ö ÙÒ Ñ ÕÙ Ò        32 Ø×¸ Pentium III¸ ÔÓÖ    ÑÔÐÓ¸ ÙÒ ÔÖÓ ×Ó ×ÔÓÒ     ÙÒ ×Ô Ó       Ö ¹
      ÓÒ Ñ ÒØÓ 232 º ÓÑÓ Ð ×Ô Ó             Ö ÓÒ Ñ ÒØÓ           ÓÒØ Ò Ö Ð Ó Ó Ð ÔÖÓ Ö Ñ ¸ ×Ù× ØÓ×
     ר Ø Ó× Ý ×Ù× ØÓ× Ò Ñ Ó׸ Ð ÒØ               ×Ô Ó ×ÔÓÒ Ð × Ñ ÒÓÖ ÕÙ 232 º        Ñ ×¸ Ð × ×Ø Ñ
    ÓÔ Ö Ø ÚÓ Ö × ÖÚ ÙÒ Ô ÖØ Ð ×Ô Ó           Ö ÓÒ Ñ ÒØÓ Ô Ö × Ñ ×ÑÓº ÍÒ ÖÖ ÐÓ ¾               ÒØ ÖÓ×
     ÓÖØÓ× ´shortµ ÒÓ Ö Ò ÙÒ ÔÖÓ ×Óº ÈÓÖ ÓØÖ Ô ÖØ ¸ × Ö ÕÙ Ö Ö Ð Ñ ÒÓ× ÙÒ Ñ ÑÓÖ Ú ÖØÙ Ð 4
           ÝØ × Ô Ö Ð Ö Ö ×Ø ÖÖ ÐÓº ÈÓÖ ×Ø × Ö ÞÓÒ ×¸ Ö ÑÓ× ÕÙ 2            ÒØÖ × × ×Ù¬ ÒØ Ô Ö Ð
    Ñ ÝÓÖ       Ð × × ØÙ ÓÒ ×º
       ÄÓ ÒØ Ö ÓÖ        × Ö Ú Ð Ó Ò × ×Ø Ñ × Ô Ö× ×Ø ÒØ × ÓÒ Ö Ò × ÖÖ ÐÓ× ×ÓÒ Ñ Ô Ó× Ò × Ó Ý
     Ò Ñ ÑÓÖ Ý Ò Ñ Ñ ÒØ Ö Ó× Ð Ñ Ò º Ä × ÖÕÙ Ø ØÙÖ ×                           Ø× Ó Ñ ×    Ò ÔÓ× Ð
     ×Ô Ó×         Ö ÓÒ Ñ ÒØÓ Ô Ö× ×Ø ÒØ ×      ÒÚ Ö ÙÖ ÑÙÝ Ö Ò º ÑÔ ÖÓ¸ Ð ÓÒ× Ù ÓÒ ÙÒ
    × ×Ø Ñ ÓÔ Ö Ø ÚÓ¸ Ô Ö Ñ        Ð Ô Ö× ×Ø Ò ¸ × ÙÒ ÙÒ Ø Ñ ÑÙÝ ÒÑ ÙÖÓ ÒÚ ×Ø ÓÒº
2.1. Arreglos                                                                         43


                                         º º º




                                         º º º          º   º     º        º    º
                                                        º   º     º        º    º
                                                        º   º     º        º    º

                                                                      Bloques



  dir size                                              º
                                                        º       º block size
                                                                º
                                                        º       º
                                 Segmento
                                      º º º
                                  seg size



                                                        º   º     º    º        º
             Directorio                                 º
                                                        º
                                                            º
                                                            º     º
                                                                  º    º
                                                                       º        º
                                                                                º


                    ÙÖ ¾º½ רÖÙ ØÙÖ           ØÓ×     DynArray<T>


    Ð Ö Ø Ö Ò Ñ Ó Ð ÖÖ ÐÓ Ö × Ò Ð           Ó          ÕÙ ×ÓÐÓ × ÙØ Ð Þ Ò ÐÓ× ÐÓÕÙ × Ý
× Ñ ÒØÓ× ÕÙ ÓÖÖ ×ÔÓÒ Ò Ð Ñ ÒØÓ× Ð ÖÖ ÐÓ ÕÙ              Ý Ò × Ó × Ö ØÓ× Ó Ñ ÒØ
ÙÒ Ñ ØÓ Ó ×Ô Ð ÐÐ Ñ Ó touch()º
      Ó ÙÒ Ò i¸ Ð ×Ó ÑÔÐ         Ð ÙÐ Ö Ð ÒØÖ           Ò Ð Ö ØÓÖ Ó¸ ÐÙ Ó Ð ÒØÖ
 Ò Ð × Ñ ÒØÓ Ý¸ ¬Ò ÐÑ ÒØ ¸ Ð ÒØÖ    Ò Ð ÐÓÕÙ º          רÓ× Ð ÙÐÓ× ÔÙ Ò Ö Ð Þ Ö×
 ÓÑÓ × Ù
´
Indice del segmento en el directorio:      × Ñ ÒØÓ Ö ÔÖ × ÒØ seg size×block size
      Ð Ñ ÒØÓ× Ð ÖÖ ÐÓº Ð Ò         Ò Ð Ö ØÓÖ Ó ×Ø    Ó ÔÓÖ Ð ÜÔÖ × ÓÒ × Ù ÒØ
                          pos in dir =
                                                    i
                                          seg size × block size
                                                                                    ´¾º¾µ
     ÍØ Ð Þ Ö ÑÓ× Ð ÒÓÑ Ö Ú Ö Ð          pos in dir      Ú Þ ÕÙ Ö ÕÙ Ö ÑÓ× ÐÑ Ò Ö
     ÙÒ Ò      Ò Ð Ö ØÓÖ Óº
´
Indice del bloque en el segmento:  Ð Ö ×ØÓ Ð Ú × ÓÒ ´¾º¾µ¸ ÒÓØ Ó Ö ×ØÓ¸ ܹ
     ÔÖ × Ð ÒÙÑ ÖÓ    ÐÓÕÙ × ÕÙ ÐØ Ò Ô Ö ÐÐ Ö Ð Ò iº
     ÈÙ ×ØÓ ÕÙ     ÐÓÕÙ ÔÓ× block size Ð Ñ ÒØÓ׸ Ð ÔÓ× ÓÒ ÒØÖÓ Ð × Ñ ÒØÓ
      ר       ÔÓÖ
                             pos in seg =
                                             Ö ×ØÓ                    ´¾º¿µ
                                          block size
       ÓÒ Ö ×ØÓ × ¬Ò ÓÑÓ
                          Ö ×ØÓ = i ÑÓ   (seg size × block size)                    ´¾º µ
44                                                                  Cap´
                                                                       ıtulo 2. Secuencias



      Ð ÒÓÑ Ö       Ú Ö Ð pos in seg × Ö ÙØ Ð Þ Ó       Ú Þ ÕÙ            ×     × Ñ ÑÓÖ Þ Ö
     ÙÒ Ò         × Ñ ÒØÓº
Indice del elemento en el bloque: Ð Ò
´                                              Ð Ð Ñ ÒØÓ ÒØÖÓ              Ð ÐÓÕÙ × Ó Ø Ò
       ØÖ Ú × Ð Ö ×ØÓ Ð Ú × ÓÒ ´¾º¿µº × Ô٠׸ Ð Ö ×ØÓ ×Ø                   Ú × ÓÒ × Ð ÒÙÑ ÖÓ
          Ð Ñ ÒØÓ× ÕÙ ÐØ Ò Ô Ö ÐÐ Ö Ð i¹ × ÑÓ Ð Ñ ÒØÓ ÒØÖÓ                  Ð ÐÓÕÙ
                            pos in block = Ö       ×ØÓ ÑÓ   block size                 ´¾º µ
     ËÙר ØÙÝ Ò Ó ´¾º µ Ò ´¾º µ
           pos in block = (i ÑÓ (seg size × block size)) ÑÓ block size                 ´¾º µ
      ר × ÓÔ Ö ÓÒ ×     Ò ØÙ Ö× × ÑÔÖ ÕÙ × × Ö Ð Þ Ö ÙÒ                ×Óº ÈÙ ×ØÓ
ÕÙ         ÓÔ Ö ÓÒ ØÓÑ ÙÒ Ñ Ü ÑÓ Ø ÑÔÓ ÓÒר ÒØ ¸ × Ö ÒØ Þ ÕÙ Ð ×Ó ÙÒ
 ÖÖ ÐÓ Ò Ñ Ó ØÓÑ ÙÒ Ñ Ü ÑÓ Ø ÑÔÓ ÕÙ Ø Ñ Ò × ÓÒר ÒØ º
    È Ö Ñ ÓÖ Ö Ð Ø ÑÔÓ        Ð ÙÐÓ ´¾º¾µ¸ ´¾º¿µ Ý ´¾º µ ÐÓ× Ø Ñ ÒÓ×    Ö ØÓÖ Ó¸
× Ñ ÒØÓ Ý       ÐÓÕÙ ×ÓÒ ÔÓØ Ò × Ü Ø ×       Ó׺      ר ÓÖÑ ¸ Ð ÑÙÐØ ÔÐ ÓÒ Ý Ð
  Ú × ÓÒ ÔÙ Ò Ö Ð Þ Ö× ÓÒ × ÑÔÐ × ×ÔÐ Þ Ñ ÒØÓ׺
            ØÓ×    Ò Ö Ø ÑÔÓ       Ù ÓÒ¸ Ð ÙÒÓ× Ð ÙÐÓ× × Ö Ð Þ Ò Ò Ø ÑÔÓ
 ÓÒרÖÙ ÓÒ Ý Ñ × ÚÙ ÐÚ Ò ÑÓ ¬ Ö× ÙÖ ÒØ Ð Ø ÑÔÓ Ú                      ÙÒ Òר Ò
   DynArray<T>º
 Ñ Ñ ÖÓ× ÓÒר ÒØ × DynArray<T> ≡                               ´ ¾µ
  mutable size_t pow_dir;
  mutable size_t pow_seg;
  mutable size_t pow_block;

    ר × ÓÒר ÒØ × ÐÑ Ò Ò Ð × ÔÓØ Ò × 2 Ð × ÐÓÒ ØÙ × Ð Ö ØÓÖ Ó¸ × Ñ ÒØÓ
Ý ÐÓÕÙ ¸ Ð Ù Ð × ×ÓÒ 2pow dir ¸ 2pow seg Ý 2pow block ¸ Ö ×Ô Ø Ú Ñ ÒØ º
   Ä Ñ Ò× ÓÒ Ñ Ü Ñ Ö ×ÙÐØ ÒØ × 2pow dir ×2pow seg ×2pow block º Ë ×Ø Ð ÙÐÓ Ö ×ÙÐØ
Ñ ÝÓÖ ÕÙ Ð Ñ Ü Ñ Ñ Ò× ÓÒ Ô ÖÑ Ø Max Dim Allowed¸ ÒØÓÒ × × Ò Ö Ð Ü¹
 Ô ÓÒ std::length errorº Ë ÒÓ Ý Ô                    ÒÙÑ Ö Ô Ö          ØÙ Ö Ð × ÓÔ Ö ÓÒ ×
Ñ ÒØ ×ÔÐ Þ Ñ ÒØÓ׸ ÒØÓÒ × × Ò Ö Ð Ü Ô ÓÒ std::overflow errorº
    ÒØ × ÓÒØ ÒÙ Ö¸ Ø Ò Ò× Ò Ù ÒØ Ð × × Ù ÒØ × Ù Ð ×
                                  seg size = 2pow seg                                  ´¾º µ
                                block size = 2        pow block
                                                                                       ´¾º µ
ËÙר ØÙÝ Ò Ó ´¾º µ Ý ´¾º µ Ò ´¾º¾µ Ø Ò ÑÓ×
                 pos in dir =
                                2pow seg
                                            i
                                           ×2 pow block
                                                                  i
                                                        = (pow seg+pow block)
                                                         2
                                                                                       ´¾º µ
Ñ Ñ ÖÓ× ÓÒר ÒØ ×      DynArray<T>            +≡                  ´ ¾µ
  mutable size_t seg_plus_block_pow;
2.1. Arreglos                                                                               45



    Ð Ú ÐÓÖ 2(pow seg+pow block) × Ù Ö ÔÖ Ú Ñ ÒØ Ò seg plus block pow Ô Ö ÙØÙÖÓ×
 Ð ÙÐÓ׺
   ËÙר ØÙÝ Ò Ó ´¾º µ Ý ´¾º µ Ò ´¾º µ¸ Ø Ò ÑÓ×
              Ö ×ØÓ = i ÑÓ       (2pow seg × 2pow block ) = i ÑÓ 2(pow seg+pow block)    ´¾º½¼µ
       ÓÖ       ÑÓ× Ò ÓÒØÖ Ö ÙÒ Ñ Ò Ö       Ð ÙÐ Ö Ö Ô Ñ ÒØ Ð Ó ÒØ Ý                     Ð Ö ×ØÓ
   ÙÒ Ú × ÓÒ ÒØÖ ÙÒ ÔÓØ Ò Ü Ø                2º È Ö Ð ×Ó           Ð Ð ÙÐÓ                Рܹ
ÔÖ × ÓÒ ´¾º µ¸ Ý × ÑÓ× ÕÙ Ð Ó ÒØ × Ð Ö ×ÙÐØ Ó               ×ÔÐ Þ Ö i      Ð               Ö
seg plus block pow Ú ×º        ר Ñ Ò Ö ¸ Ð ÜÔÖ × ÓÒ ´¾º µ Ö ×ÙÐØ ¸ Ñ ÒØ                ×ÔÐ Þ ¹
Ñ ÒØÓ׸ Ò
                         pos in dir = i           seg plus block pow    ´¾º½½µ
  Ð Ö ×ØÓ ×Ø     Ó ÔÓÖ ÐÓ× seg plus block pow Ø× Ñ ÒÓ× × Ò ¬ Ø ÚÓ× iº È Ö
 ÓÒÓ Ö ÐÓ× seg plus block pow Ø× Ñ ÒÓ× × Ò ¬ Ø ÚÓ× ÓÒרÖÙ ÑÓ× ÙÒ ÒÙÑ ÖÓ ÓÒ
ÐÓ× seg plus block pow Ø× Ñ ÒÓ× × Ò ¬ Ø ÚÓ× Ò ÙÒÓ Ý ÐÓ× Ö ×Ø ÒØ × Ò ÖÓº
 Ñ Ñ ÖÓ× ÓÒר ÒØ × DynArray<T> +≡                    ´ ¾µ
 mutable size_t mask_seg_plus_block;

   mask seg plus block       ×      Ð ÙÐ    Ð × Ù ÒØ ÑÓ Ó
                      mask seg plus block = 2seg plus block pow − 1                      ´¾º½¾µ
     Ò × Ò Ö ¸ 2seg plus block pow ÓÒØ Ò ÔÙÖÓ× ÖÓ× Ü ÔØÓ ÙÒ ÙÒÓ Ò Ð
ÔÓ× ÓÒ seg plus block powº ÓÑÓ Ý seg plus block pow ÖÓ× ÒØ × ÐÐ Ö Ð
ÙÒ Ó ÙÒÓ¸          Ø ÔÖÓÚÓ ÙÒ ÔÖ ×ØÓ ÕÙ × ÔÓÖ ¬Ò Ô Ó Ù Ò Ó × ÐÐ      Ð Ø Ò
seg plus block powº × Ô٠׸ ר ÒÙÑ ÖÓ Ø Ò ÐÓ× ÔÖ Ñ ÖÓ× seg plus block pow Ò
ÙÒÓ Ý ÐÓ× Ö ×Ø ÒØ × Ò ÖÓº Ð Ö ×ØÓ Ò Ð ÜÔÖ × ÓÒ ´¾º½¼µ ÔÙ   Ð ÙÐ Ö× ÓÒ ÙÒ AND
ÐÓ Ó ÙÝÓ ÓÔ Ö ÓÖ Ò C++ × &
         Ö ×ØÓ = i AND mask seg plus block = i & mask seg plus block ´¾º½¿µ
    × ÓÑÙÒ ÒÓØ Ö Ð Ú Ö Ð mask seg plus block ÓÑÓ ÙÒ Ñ × Ö ÔÓÖÕÙ
ÒÑ × Ö ÐÓ× Ø× Ð ÞÕÙ Ö      seg plus block powº
Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> ≡                                             ´ ¾µ
 size_t mask_seg;
 size_t mask_block;

   mask seg   ×   ÒÓØ ÔÓÖ Ð × Ù ÒØ ÜÔÖ × ÓÒ
                       mask seg = 2pow seg − 1 = seg size − 1 ;                          ´¾º½ µ
ÄÓ ÕÙ Ô ÖÑ Ø ÙÒ Ð ÙÐÓ Ô Ö Ð ÔÓ× ÓÒ Ò Ð ÐÓÕÙ
                                 pos in seg = Ö   ×ØÓ >> pow block                       ´¾º½ µ
 ÓÒ Ö ×ØÓ × ´¾º½¿µº
   mask block ×  ÒÓØ ÔÓÖ
                     mask block = 2pow block − 1 = block size − 1                        ´¾º½ µ
46                                                            Cap´
                                                                 ıtulo 2. Secuencias



   È Ö Ð ÙÐ Ö Ð Ò        ÒØÖÓ ÙÒ ÐÓÕÙ ´¾º µ¸ Ý ÕÙ Ð ÙÐ Ö Ð Ö ×ØÓ           Ú Ö
 ÒØÖ block sizeº È Ö ÐÐÓ¸ ÙØ Ð Þ ÑÓ× Ð Ñ × Ö mask blockº       ר ÓÖÑ ¸ ´¾º µ ×
ÔÐ ÒØ ÓÑÓ × Ù
             pos in block = (i & mask seg plus block) & mask block        ´¾º½ µ
      ÓÖ ÔÓ ÑÓ× ÑÔÐ ÒØ Ö ¬ ÒØ Ñ ÒØ ÐÓ× ×Ó× Ð Ö ØÓÖ Ó¸ × Ñ ÒØÓ Ý ÐÓÕÙ
 ÜÔÖ × Ó׺ È Ö ÐÐÓ¸ ×Ð Ö ÑÓ× ÐÓ× Ð ÙÐÓ× Ò ÙÒ ÓÒ × × Ô Ö × ÓÒ ÒÓÑ Ö × ÕÙ
Ò ÕÙ Ò Ð Ö Ñ ÒØ ÐÓ× Ð ÙÐÓ× Ò Ù ×Ø ÓÒ
 Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> +≡                       ´ ¾µ
    size_t index_in_dir(const size_t & i) const
    {
      return i >> seg_plus_block_pow;
    }
    size_t modulus_from_index_in_dir(const size_t & i) const
    {
      return (i & mask_seg_plus_block);
    }
    size_t index_in_seg(const size_t & i) const
    {
      return modulus_from_index_in_dir(i) >> pow_block;
    }
    size_t index_in_block(const size_t & i) const
    {
      return modulus_from_index_in_dir(i) & mask_block;
    }
    ¬Ò ×
    index in block¸ Ù×    Ò ÙÒ × ¿¸ ¸ Ò     º
    index in dir¸ Ù×     Ò ÙÒ × ¿ß Ò    º
    index in seg¸ Ù×     Ò ÙÒ × ¿ß Ò    º
     index in dir() Ð ÙÐ Ð Ò         ÒØÖÓ Ð Ö ØÓÖ Ó Ó Ð Ò          Ð ÖÖ ÐÓ i
Ñ     ÒØ Ð ÜÔÖ × ÓÒ ´¾º½½µº
   index in seg()    Ð ÙÐ Ð Ò          ÒØÖÓ Ð × Ñ ÒØÓ      Ó Ð Ò      Ð ÖÖ ¹
 ÐÓ i × ÙÒ Ð ´¾º½ µº        ר ÙÒ ÓÒ Ö ÕÙ Ö Ð Ú ÐÓÖ Ö ×ØÓ ÕÙ ÓÖÖ ×ÔÓÒ
  modulus from index in dir()) × ÙÒ ´¾º½¿µº
   index in block() Ð ÙÐ Ð Ò            ÒØÖÓ Ð ÐÓÕÙ     Ó Ð Ò    i Ð ÖÖ ÐÓ
× ÙÒ ´¾º½ µº
     ÓÑÓ Ð × ÙÒ ÓÒ × ×ÓÒ inline¸ Ð × Ù Ò ÒØ ÖÒ ÓÔ Ö ÓÒ × × ÜÔÓÒ ÓÑÔÐ ¹
Ø Ñ ÒØ Ð ÓÔØ Ñ Þ ÓÖ Ð ÓÑÔ Ð ÓÖ¸ Ð Ù Ð × Ô Þ          ØÙ Ö ÑÙ × ÓÔØ Ñ Þ ÓÒ ×¸
ÔÓÖ ÑÔÐÓ¸ Ð Ñ ÑÓÖ Þ Ö Ð Ö ×ØÓ Ð Ú × ÓÒ ØÙ              Ò Ð Ð ÙÐÓ Ð Ò       Ð
  Ö ØÓÖ Óº
 Ñ Ñ ÖÓ× ÓÒר ÒØ × DynArray<T> +≡                         ´ ¾µ
    mutable size_t max_dim;      // 2^(pow_dir + pow_seg + pow_block) - 1
   max dim ÐÑ Ò Ð Ñ Ü Ñ     Ñ Ò× ÓÒ ÕÙ ÔÙ               Ð ÒÞ Ö Ð ÖÖ ÐÓ × ÙÒ Ð × ÐÓÒ ¹
ØÙ × Ð Ö ØÓÖ Ó¸ × Ñ ÒØÓ Ý ÐÓÕÙ º
 Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> +≡                             ´ ¾µ
    size_t current_dim;
    size_t num_segs;
    size_t num_blocks;
2.1. Arreglos                                                                 47



   current dim    ÐÑ Ò Ð Ñ Ò× ÓÒ ØÙ к num segs Ý num blocks ÓÒØ Ð Þ Ò Ð
ØÓØ Ð     × Ñ ÒØÓ× Ý  ÐÓÕÙ × ÕÙ Ò × Ó Ö × ÖÚ Ó׺
2.1.5.2     Manejo de memoria

  Ò Ð Ñ Ò Ó Ñ ÑÓÖ ×              Ò ÓÒ× Ö Ö ÐÓ× × Ù ÒØ × ×Ô ØÓ×
   ¯ Ð Ú ÐÓÖ NULL Ò       ÕÙ ÙÒ ÒØÖ            Ö ØÓÖ Ó Ó × Ñ ÒØÓ ÒÓ Ø Ò Ñ ÑÓÖ
       Ô ÖØ º ×ØÓ ÑÔÐ ÕÙ Ù Ò Ó ÙÒ ÐÓÕÙ × Ð Ö Ó¸ Ð ÒØÖ                 Ò Ð Ö ØÓÖ Ó
           × Ö Ö ×Ø ÙÖ   Ð Ú ÐÓÖ NULLº
   ¯ ÄÓ× × Ñ ÒØÓ× Ý ÐÓÕÙ × Ö × ÖÚ Ó× Ó Ð Ö Ó×          Ò ÓÒØ Ð Þ Ö× º
   Ä ÒØÖ          Ð Ö ØÓÖ Ó׸ × Ñ ÒØÓ Ý ÐÓÕÙ ÓÑ ÒÞ Ô ÖØ Ö Ð Ö ØÓÖ Ó¸ Ð Ù Ð
×     Ð Ö ÓÑÓ × Ù
 Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> +≡                          ´ ¾µ
  T *** dir;
dir Ö ÔÖ × ÒØ Ð ÔÙÒØ ÓÖ Ð Ö ØÓÖ Óº
     Ð Ñ Ò Ó Ñ ÑÓÖ × Ö Ð Þ Ñ ÒØ Ñ ØÓ Ó× ÔÖ Ú Ó× ×Ô             Ð Þ Ó× ÕÙ × Ô Ö Ò
ÐÓ× Ø ÐÐ × Ò ÔÙÒØÓ× ÙÒ Ó׸ × Ò ÐÐÓ× ÔÙÖ Ö Ý Ñ ÒØ Ò Ö
 Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> +≡                    ´ ¾µ
  void fill_dir_to_null()
  {
    for (size_t i = 0; i < dir_size; ++i)
      dir[i] = NULL;
  }
  void fill_seg_to_null(T ** seg)
  {
    for (size_t i = 0; i < seg_size; ++i)
      seg[i] = NULL;
  }
  ¬Ò ×
  fill dir to null¸   Ù×   Ò ÙÒ   º
  fill seg to null¸   Ù×   Ò ÙÒ   º
 fill dir to null() × ÙÖ ÕÙ ØÓ × Ð × ÒØÖ      × Ð Ö ØÓÖ Ó × Ò ÒÙР׺ Ð
Ú ÐÓÖ NULL Ò       ÕÙ Ð ÒØÖ       Ð Ö ØÓÖ Ó ÒÓ ÔÓ× ÙÒ × Ñ ÒØÓ Ö × ÖÚ Óº
  Ò ÐÓ Ñ ÒØ ¸ ÙÒ NULL Ò ÙÒ ÒØÖ       ÙÒ × Ñ ÒØÓ Ò Ö ÕÙ Ð ÒØÖ ÒÓ ÔÓ×
ÙÒ ÐÓÕÙ Ö × ÖÚ Óº
    fill seg to null() Ò Ð Þ   ØÓ × Ð ÒØÖ × Ð × Ñ ÒØÓ ÔÙÒØ Ó ÔÓÖ seg
 Ð Ú ÐÓÖ NULLº fill dir to null() × ÐÐ Ñ Ù Ò Ó × Ö         Ð Ö ØÓÖ Ó Ý
fill seg to null() Ù Ò Ó × Ö ÙÒ ÒÙ ÚÓ × Ñ ÒØÓº
 Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> +≡                   ´ ¾µ
  void allocate_dir()
  {
        dir = new T ** [dir_size];
        fill_dir_to_null();
  }
  void allocate_segment(T **& seg)
        ÐÚÖ Ó Ò   Ð Þ Ö Ý × Ô ÖØ Ö Ð   Ð Ð Ò Ù ×Ô ÒÓÐ º
48                                                     Cap´
                                                          ıtulo 2. Secuencias



  {
      seg = new T* [seg_size];
      fill_seg_to_null(seg);
      ++num_segs;
  }
  ¬Ò ×
  allocate dir¸ Ù×    Ò    ÙÒ ×    Ò ¾º
  allocate segment¸ Ù×     Ò ÙÒ × ¾ ¸ ¸ Ò        º
Í× × fill dir to null       Ò fill seg to null   º
      allocate dir() Ö × ÖÚ
                      Ñ ÑÓÖ Ô Ö Ð Ö ØÓÖ Ó Ý ¬ ØÓ × ×Ù× ÒØÖ × Ò NULLº
      allocate segment() ×
                       Ò Ð ÔÙÒØ ÖÓ seg Ð Ö ÓÒ Ñ ÑÓÖ          ÙÒ ÒÙ ÚÓ × ¹
Ñ ÒØÓ ÙÝ × ÒØÖ × ×Ø Ò Ò Ð Þ × Ò NULLº
   Ä × ÒØÖ × Ð Ö ØÓÖ Ó Ý ÐÓ× × Ñ ÒØÓ× × ÑÔÖ           Ò Ò Ð Þ Ö× Ò NULLº
dir[i] == NULL Ò   ÕÙ ÒÓ ×    Ô ÖØ Ó ÙÒ × Ñ ÒØÓ Ñ ÒØÖ × ÕÙ dir[i][j] ==
NULL Ò     ÕÙ ÒÓ ×   Ô ÖØ Ó Ð ÐÓÕÙ º
    Ò Ð ×Ó Ò Ð Þ Ö ÙÒ ÐÓÕÙ ¸       ÑÓ× ÓÒ× Ö Ö Ð ÔÓ× Ð       ÕÙ Ð Ù×Ù Ö Ó
   DynArray<T> ×Ô ¬ÕÙ ÙÒ Ú ÐÓÖ Ò Ðº È Ö ÐÐÓ¸ Ù Ö Ö ÑÓ× Ò ÐÓ× × Ù ÒØ ×
  ÑÔÓ× ÙÒ Ú ÐÓÖ Ò Ð T ØÓ × Ð × ÒØÖ × ÙÒ ÐÓÕÙ
 Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> +≡                  ´ ¾µ
  T   default_initial_value;
  T * default_initial_value_ptr;
      default initial valueÐÑ Ò Ð Ú ÐÓÖ Ò Ð¸ Ñ ÒØÖ × ÕÙ default initial value ptr
ÙÒ ÔÙÒØ ÖÓ Ð Ð ÒØ Ö ÓÖº ÈÓÖ ÓÑ × ÓÒ¸ ר ÔÙÒØ ÖÓ × NULL¸ ÑÓ Ó Ø Ð ÕÙ ¸ Ø Ñ Ò
ÔÓÖ ÓÑ × ÓÒ¸ ÒÓ × Ö Ð ÙÒ Ò Ð Þ ÓÒ ÜÔÐ Ø ¸ × ÒÓ Ð ÑÔÐ Ø ×Ù Ý ÒØ Ð ÓÒ×¹
ØÖÙ ØÓÖ ÔÓÖ ÓÑ × ÓÒ T::T()º ÈÓÖ ×Ø Ö ÞÓÒ¸ ØÓ Ó× ÐÓ× ÓÒרÖÙ ØÓÖ × DynArray<T>
 Ò Ð Þ Ò default initial value ptr Ò NULL
 Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> +≡                       ´ ¾µ
  void allocate_block(T *& block)
  {
    block = new T [block_size];
    ++num_blocks;

      if (default_initial_value_ptr == NULL) return;

      for (size_t i = 0; i < block_size; ++i)
        block[i] = default_initial_value;
  }
  ¬Ò ×
  allocate block¸   Ù×    Ò ÙÒ ×     Ò    º
allocate block()     × Ò Ð ÔÙÒØ ÖÓ block Ð Ö ÓÒ Ñ ÑÓÖ      ÙÒ ÒÙ ÚÓ ÐÓÕÙ º
Ë ÙÒ ÕÙ × Ý Ó ÒÓ ×Ô ¬ Ó ÙÒ Ú ÐÓÖ ÔÓÖ ÓÑ × ÓÒ¸ × Ö ÓÖÖ Ö block Ý × Ð × Ò Ö
 Ð Ú ÐÓÖ default initial value ÐÓ ÕÙ Ü Ð Ü ×Ø Ò   Ð ÓÔ Ö ÓÖ × Ò ÓÒ T&
operator = (const T&)º
 Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> +≡                   ´ ¾µ
  void release_segment(T **& seg)
  {
    delete [] seg;
    seg = NULL;
2.1. Arreglos                                                                        49



    --num_segs;
  }
  void release_block(T *& block)
  {
    delete [] block;
    block = NULL;
    --num_blocks;
  }
  ¬Ò ×
  release block¸ Ù×     Ò ÙÒ ×       Ò       º
  release segment¸ Ù×    Ò ÙÒ ×          Ò       º
  רÓ× Ñ ØÓ Ó× × Ò Ö Ò Ð Ö Ö ÓÒ× ×Ø ÒØ Ñ ÒØ ÙÒ × Ñ ÒØÓ Ó ÙÒ ÐÓÕÙ º ÇØÖ
Ñ Ò Ö Ð Ö Ö ÒÚÓÐÙ Ö ÙÒ × Ñ ÒØÓ ÓÒ ØÓ Ó× ×Ù× ÐÓÕ٠׸ Ó ØÓ Ó× ÐÓ× × Ñ ÒØÓ× Ý
 ÐÓÕÙ × Ð ÖÖ ÐÓ Ó Ð Ö ØÓÖ Ó
Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> +≡                 ´ ¾µ       ½
  void release_blocks_and_segment(T ** & seg)
  {
    for(size_t i = 0; i < seg_size ; ++i)
      if (seg[i] != NULL)
        release_block(seg[i]);
    release_segment(seg);
  }
  void release_all_segments_and_blocks()
  {
    for(size_t i = 0; i < dir_size ; ++i)
      if (dir[i] != NULL)
        release_blocks_and_segment(dir[i]);
    current_dim = 0;
  }
  void release_dir()
  {
    release_all_segments_and_blocks();
    delete [] dir;
    dir = NULL;
    current_dim = 0;
  }
  ¬Ò ×
  release all segments and blocks¸ Ù×    Ò       ÙÒ      º
  release blocks and segment¸ Ò Ú Ö Ù× º
Í× × release block     Ò release segment             º

2.1.5.3   Especificaci´n e implantaci´n de m´todos p´ blicos
                     o              o      e       u

Ð ÓÒרÖÙ ØÓÖ ÔÓÖ ÓÑ × ÓÒ ÔÐ ÒØ ÙÒ ×ÙØ Ð Þ                    Ö   Ð ×Ð   ÓÒ   Ð Ø Ñ ÒÓ Ð
ÐÓÕÙ
Ñ Ñ ÖÓ× ÔÙ Ð Ó× DynArray<T> ≡                                       ´ ¾µ ½
  DynArray(const size_t & dim = 10000)
    : pow_dir             ( Default_Pow_Dir                                  ),
      pow_seg             ( Default_Pow_Seg                                  ),
          Ø ÖÑ Ò ÓÒ        Ð ÔÓØ Ò               ¾ Ð ÐÓÕÙ ¼
50                                                                         Cap´
                                                                                  ıtulo 2. Secuencias



            seg_plus_block_pow ( pow_seg + pow_block                                      ),
            mask_seg_plus_block ( two_raised(seg_plus_block_pow) - 1                      ),
            dir_size            ( two_raised(pow_dir)                                     ),
            seg_size            ( two_raised(pow_seg)                                     ),
            block_size          ( two_raised(pow_block)                                   ),
            max_dim             ( two_raised(seg_plus_block_pow + pow_dir)                ),
            mask_seg            ( seg_size - 1                                            ),
            mask_block          ( block_size - 1                                          ),
            current_dim         ( 0                                                       ),
            num_segs            ( 0                                                       ),
            num_blocks          ( 0                                                       ),
            default_initial_value_ptr (NULL)
      {
          allocate_dir();
      }
    Í× × allocate dir       Ò   DynArray    ¾º
      ÓÑÓ × Ú ¸ Ð ÓÒרÖÙ ØÓÖ × Ð ÓÒ ÙÒ ÐÓÒ ØÙ       ÐÓÕÙ º Å ÒØÖ × Ñ × Ö Ò × ×Ø
    ÐÓÒ ØÙ ¸ Ñ ÒÓÖ × Ö Ð ÒØ           Ö × ÖÚ ÓÒ × Ñ ÑÓÖ Ù× × ÔÓÖ Ð ÜÔ Ò× ÓÒ
       Ð ÖÖ ÐÓº ÍÒ Ø Ñ ÒÓ       ÐÓÕÙ ÑÙÝ Ô ÕÙ ÒÓ ÑÔÐ Ö ÕÙ ÒÙ ÚÓ× ÐÓÕÙ × Ø Ò Ö Ò
    ÕÙ Ô ÖØ Ö× ÑÙÝ Ñ ÒÙ Óº Ò Ò ÙÖ ¸ Ð Ñ Ü Ñ Ñ Ò× ÓÒ Ð ÖÖ ÐÓ × Ö ÑÙÝ
    ÐÑØ º
            ÑÓ× ÔÖ Ú Ð Ö ÙÒ ÐÓÒ ØÙ          ÐÓÕÙ Ñ × Ó Ñ ÒÓ× Ö Ò º Ò ÔÖ Ò Ô Ó¸ ×
    × Ð ÓÒ ÙÒ Ó Ø Ú Ô ÖØ            Ð Ñ Ò× ÓÒ Ò Ð ×Ô ¬          Ò Ð ÓÒרÖÙ ØÓÖº Ð
    ÙÒ Ó ÔÖÓ Ð Ñ Ó ÙÖÖ Ù Ò Ó Ð Ù×Ù Ö Ó ×Ù Ö ÙÒ Ñ Ò× ÓÒ Ò Ð ÑÙÝ Ô ÕÙ Ò ¸ ÐÓ
    ÕÙ     ÖÖ Ö ÙÒ Ø Ñ ÒÓ         ÐÓÕÙ ÑÙÝ Ô ÕÙ ÒÓº È Ö Ú Ø Ö ×ØÓ¸ × Ð ÓÒ ÑÓ× ÙÒ
    ÔÓØ Ò       2     × ÓÑÓ ÐÓÒ ØÙ Ñ Ò Ñ Ð ÐÓÕÙ º ÓÑÓ × ×Ô ¬ Ó Ò Ñ Ñ ÖÓ×
     ÓÒר ÒØ × DynArray<T> ¸ Ø Ð ÔÓØ Ò × Ö Ð Ú ÐÓÖ 12¸ ÕÙ Ú Ð ÒØ 4096
     ÒØÖ ×¸ ÐÓ ÕÙ ÖÖÓ ÙÒ Ñ Ò× ÓÒ Ñ Ü Ñ ÔÓÖ ÓÑ × ÓÒ 24+26+212 = 222 = 4194304º
         Ò ÙÒ Ñ ÕÙ Ò       ¿¾ Ø×¸ Max Bits Allowed = 32º ÒØÓÒ ×¸ Ö ×Ø Ö Ò 32 − 22 − 1
    ÔÓØ Ò ×        Ó× Ñ × Ô Ö ÙÒ ÐÓÕÙ ÒØ × ÐÐ Ö Max Bits Allowedº Ä Ñ Ü Ñ
    ÔÓØ Ò         Ó× Ð Ø Ñ ÒÓ ÙÒ ÐÓÕÙ × Ö
            Max Pow Block = 32 − Default Pow Dir − Default Pow Seg − 1 = 21                      ´¾º½ µ
    ÄÓ ÕÙ        ÙÒ Ñ Ü Ñ             Ñ Ò× ÓÒ Ö             ÓÒ Ð ÓÒ Ð ÓÒרÖÙ ØÓÖ ÔÓÖ ÓÑ × ÓÒ
               2Default   Pow Dir
                                    × 2Default   Pow Seg
                                                           × 221 = 24 × 26 × 221 = 536870912 ,

     Ñ Ò× ÓÒ Ñ × ÕÙ ×Ù¬ ÒØ Ô Ö Ð Ñ ÝÓÖ         ÐÓ× ÖÖ ÐÓ× ÕÙ ÕÙ Ô Ò Ò Ñ ÑÓÖ º
       Ä Ñ Ü Ñ ÔÓØ Ò           Ó× Ð ÐÓÕÙ × ÐÑ Ò            Ò ÙÒ ÓÒר ÒØ Ð ÙÐ
    × ÙÒ ´¾º½ µº
         × Ô٠׸ ×      Ö ÒØ Þ Ö ÕÙ Default Pow Block ≤ pow block ≤ Max Pow Blockº
     ר ÜÔÖ × ÓÒ × ØÖ Ù      Ð × Ù ÒØ ÑÓ Ó
¼      Ø ÖÑ Ò ÓÒ Ð ÔÓØ Ò          ¾ Ð ÐÓÕÙ ¼ ≡                   ´ µ
          pow_block          (std::min(std::max(next2Pow(dim/8), Default_Pow_Block),
                                       Max_Pow_Block) ),
     ר Ð ÙÐÓ ÔÖ Ñ ÖÓ Ú               Ð Ñ Ò× ÓÒ ÔÖÓÔÙ ×Ø ÒØÖ Ó Ó Ý ÐÙ Ó ÐÐ Ú ×Ø Ö ×ÙÐØ Ó
      Ð ÔÖÓÜ Ñ ÔÓØ Ò                  Ó׺ ר × Ö Ð ÔÓØ Ò      Ó× Ð ÐÓÕÙ Ñ ÒÓ× ÕÙ ×
2.1. Arreglos                                                                       51



    Ñ × Ô ÕÙ Ò ÕÙ Default Pow Block Ó Ñ × Ö Ò ÕÙ          Max Pow Blockº
½   ÁÒ     ÓÒ ÓÒר ÒØ × DynArray<T> ½ ≡                                ´ ¾µ
      template <typename T> const size_t DynArray<T>::Default_Pow_Dir      =   4; /* 16    */
      template <typename T> const size_t DynArray<T>::Default_Pow_Seg      =   6; /* 64    */
      template <typename T> const size_t DynArray<T>::Default_Pow_Block    =   12; /* 4096 */
      template <typename T> const size_t DynArray<T>::Max_Bits_Allowed     =   8 * sizeof(size_t);
      template <typename T> const size_t DynArray<T>::Max_Dim_Allowed      =   2*1024*1024*1024ul;
      template <typename T> const size_t DynArray<T>::Max_Pow_Block =
      (Max_Bits_Allowed - Default_Pow_Dir - Default_Pow_Seg - 1);
    Í× × DynArray ¾º
         Ð Ð ÙÐÓ       Ð ÔÖÓÜ Ñ ÔÓØ Ò      Ó×    ÙÒ ÒÙÑ ÖÓ × Ö Ð Þ Ó ÔÓÖ Ð ÙÒ ÓÒ
    ר Ø next2Pow
½   Ñ Ñ ÖÓ× ÔÖ Ú Ó×      DynArray<T>     +≡                ´ ¾µ      ½
      static size_t next2Pow(const size_t & number)
      {
        return static_cast<size_t>(ceil(log(static_cast<float>(number))/log(2.0)));
      }
         Ð ÓÒרÖÙ ØÓÖ ÓÔ Ý Ð ÓÔ Ö ÓÖ    × Ò ÓÒ Ö Ð Þ Ò ÙÒ ÓÔ Ö ÓÒ ÓÑÙÒ Ð ×
    Ö × ÖÚ ÓÒ × Ñ ÑÓÖ Ý ÓÔ × Ð Ö ØÓÖ Ó¸ × Ñ ÒØÓ× Ý ÐÓÕÙ × Ð ÖÖ ÐÓ ×Ø ÒÓ¸
    × ÔÓÖ Ð ÓÒרÖÙ ØÓÖ Ó ÔÓÖ Ð × Ò ÓÒº ÈÓÖ ÐÐÓ¸ Ò Ô×ÙÐ ÑÓ× ×Ø ÓÔ Ö ÓÒ Ò ÙÒ
    Ñ ØÓ Ó ÔÖ Ú Ó ÓÑÙÒ ÐÐ Ñ Ó copy array()
½    Ñ Ñ ÖÓ× ÔÙ Ð Ó× DynArray<T> +≡                  ´ ¾µ     ¾
      void copy_array(const DynArray<T> & src_array)
      {
        for (int i = 0; i < src_array.current_dim; ++i)
          if (src_array.exist(i))
            (*this)[i] = src_array.access(i);
      }
    Í× × DynArray ¾º
       copy array()      Ù×Ó     Ó× Ñ ØÓ Ó× ÔÙ Ð Ó× ÕÙ    ÑÔÐ ÒØ Ö ÑÓ× Ñ × Ð ÒØ º
    src array.exist(i) Ö ØÓÖÒ true × Ð i¹ × Ñ ÒØÖ        Ü ×Ø Ò src array Ð× ¸
    ÐÓ ÓÒØÖ Ö Óº src array.access(i) Ö ØÓÖÒ Ð i¹ × Ñ    ÒØÖ        src array × Ò Ú Ö¹
     ¬ Ö ÕÙ         ÒØÖ     Ü ×Ø × Ö¸ ÕÙ Ø Ò ÙÒ × Ñ ÒØÓ Ý ÙÒ ÐÓÕÙ Ô ÖØ ¹
      Ó׺ ÆÓ Ý Ò ×            Ú Ö ¬ Ö ÕÙ Ý Ñ ÑÓÖ ÔÓÖÕÙ ×ØÓ Ù Ú Ö ¬ Ó ÓÒ
    src array.exist(i)º Ð ÓÔ Ö Ò Ó ÞÕÙ Ö Ó      Ð × Ò ÓÒ¸ (*this)[i] = ... Ô ÖØ
     Ð × Ñ ÒØÓ Ó Ð ÐÓÕÙ × × Ö ÕÙ Ö º
         ÆÓØ ÑÓ× ÕÙ copy array() Ö ÓÖÖ        ÔÓ× ÓÒ ÐÓ× ÖÖ ÐÓ׺ À Ý ÙÒ Ñ Ò Ö
    ÑÙ Ó Ñ × ¬ ÒØ ¸ Ô ÖÓ Ñ ×          Ð     ÑÔÐ ÒØ Ö ÕÙ × Ú Ð      Ð ÓÔ Ö Ø
      ÐÓÕ٠׺ Ä ¬ ÙÐØ ×ØÖ         Ù Ò Ó ÐÓ× ÖÖ ÐÓ× Ø Ò Ò Ø Ñ ÒÓ× × Ñ ÒØÓ× Ý ÐÓ¹
    ÕÙ × Ö ÒØ ׺ Ì Ð ÑÔÐ ÒØ ÓÒ × Ð                  Ö Óº ÓÑÓ ÝÙ ¸ × ÔÖÓÚ Ð
    Ñ ØÓ Ó advance block index()¸ Р٠и Ó× ÐÓ× Ò × Ð × Ñ ÒØÓ Ý Ð ÐÓÕÙ ¸
       Ð ÙÐ ÐÓ× Ò × ÓÖÖ ×ÔÓÒ ÒØ × len ÐÓÕÙ ×
½    Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> +≡                       ´ ¾µ ½ ¾
      size_t divide_by_block_size(const size_t & number) const
      {
        return number >> pow_block;
      }
52                                                             Cap´
                                                                      ıtulo 2. Secuencias



      size_t modulus_by_block_size(const size_t & number) const
      {
        return number & mask_block;
      }
      void advance_block_index(size_t &       block_index,
                               size_t &       seg_index,
                               const size_t & len) const
      {
        if (block_index + len < block_size)
          {
            block_index += len;
            return;
          }
        seg_index += divide_by_block_size(len);
        block_index = modulus_by_block_size(len);
      }
       ÇØÖ ÓÖÑ        ÓÔ Ö Ö Ô Ñ ÒØ Ö ÕÙ Ö × ÙÖ Ö ÕÙ Ð ÖÖ ÐÓ ×Ø ÒÓ Ø Ò Ü ¹
    Ø Ñ ÒØ Ð Ñ ×Ñ ×ØÖÙ ØÙÖ ÕÙ Ð Ð Ù ÒØ × Ö¸ ÐÓ× Ø Ñ ÒÓ×        Ö ØÓÖ Ó¸ × Ñ ÒØÓ
    Ý ÐÓÕÙ       Ò × Ö ÒØ Ó׺     Ó × ÔÖ Ñ × ¸ ÔÓ ÑÓ× ÓÔ Ö ×ÓÐÓ ÕÙ ÐÐ × ÒØÖ ×
    ÕÙ ÓÒØ Ò Ò Ñ ÑÓÖ         Ð × Ù ÒØ Ñ Ò Ö
¾    Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> +≡                   ´ ¾µ ½
      void allocate_dir(T *** src_dir)
      {
        allocate_dir();
        for (int i = 0; i < dir_size; i++)
          if (src_dir[i] != NULL)
            allocate_segment(dir[i], src_dir[i]);
      }
    Í× × allocate dir         Ò   allocate segment   º
     Ð Ñ ØÓ Ó           Ù×Ó       Ð ÔÖ Ñ Ø Ú
                                         allocate seg()    Ò ×Ù Ú Ö× ÓÒ   ÓÔ ¸ Ð Ù Ð ×Ù
    ÚÞ      Ù×Ó         allocate block(seg[i],
      src seg[i])º        ר × ÔÖ Ñ Ø Ú × ÒÓ ×Ø Ò ÑÓ×ØÖ   × Ò ×Ø Ø ÜØÓ¸ Ô ÖÓ ×ÓÒ   ÐÑ ÒØ
       ٠Р׺
       Å ÒØ allocate dir() Ò ×Ù Ú Ö× ÓÒ ÓÔ ÔÓ ÑÓ× Ó Ö Ö ÙÒ ÑÓ ÐÓ ÓÔ
    Ñ × ¬ ÒØ º ר ÓÖÑ       ÓÔ Ð ÐÐ Ñ Ö ÑÓ× copy array exactly() Ý Ð ¬Ò ÑÓ×
      Ó Ð × Ù ÒØ ÑÓ Ó
¾   Ñ Ñ ÖÓ× ÔÙ Ð Ó× DynArray<T> +≡                   ´ ¾µ ½ ¿
      void copy_array_exactly(const DynArray<T> & array)
      {
        release_dir(); // liberar toda la memoria de this
        pow_dir                   = array.pow_dir;
        pow_seg                   = array.fpow_seg;
        pow_block                 = array.pow_block;
        seg_plus_block_pow        = array.seg_plus_block_pow;
        mask_seg_plus_block       = array.mask_seg_plus_block;
        dir_size                  = array.dir_size;
        seg_size                  = array.seg_size;
        block_size                = array.block_size;
        max_dim                   = array.max_dim;
2.1. Arreglos                                                                53



          mask_seg                       =    array.mask_seg;
          mask_block                     =    array.mask_block;
          current_dim                    =    array.current_dim;
          num_segs                       =    array.num_segs;
          num_blocks                     =    array.num_blocks;
          default_initial_value_ptr      =    array.default_initial_value_ptr;
          allocate_dir(array.dir);
      }
    Í× × allocate dir     Ò   DynArray   ¾º

      Å ÒØ allocate dir() × ÔÙ ÑÔÐ ÒØ Ö ¬ ÒØ Ñ ÒØ Ð ÓÒרÖÙ ØÓÖ ÓÔ º Ä
    × Ò ÓÒ¸ ÔÓÖ Ð ÓÒØÖ Ö Ó¸ Ö Ð Þ Ð ÓÔ Ð Ñ ÒØÓ ÔÓÖ Ð Ñ ÒØÓ¸ ÐÓ ÕÙ ÒÓ × ÐÓ Ñ ×
    ¬ ÒØ º
       Ð ×Ó ÙÒ Ð Ñ ÒØÓ ÙÒ DynArray<T> ÔÙ Ö Ð Þ Ö× Ö Ø Ñ ÒØ Ñ ÒØ
¿   Ñ Ñ ÖÓ× ÔÙ Ð Ó× DynArray<T> +≡                 ´ ¾µ ¾ ¿
      T & access(const size_t & i)
      {
        return dir[index_in_dir(i)][index_in_seg(i)][index_in_block(i)];
      }
    Í× × index in block   ¸ index in dir        ¸ Ò   index in seg   º
       access() ÒÓ Ú Ö ¬ ÕÙ Ð Ñ ÑÓÖ      Ð ÐÓÕÙ Ý ×Ù × Ñ ÒØÓ Ý × Ó Ô ÖØ º
     ר Ñ ØÓ Ó      Ù× Ö× ×ÓÐÓ Ù Ò Ó × ×Ø ×ÓÐÙØ Ñ ÒØ × ÙÖÓ ÕÙ ×     × Ö ØÓ Ò
    Ð ÔÓ× ÓÒ        ×Ó iº
       È Ö Ò Ö × ÙÒ ÒØÖ               ÔÙ       Ö× × Ò ÖÖÓÖ × Ö¸ ÕÙ ×Ø Ø Ò
    ×Ù ÐÓÕÙ Ý ×Ù × Ñ ÒØÓ¸ × ÔÖÓÚ
¿    Ñ Ñ ÖÓ× ÔÙ Ð Ó× DynArray<T> +≡                    ´ ¾µ ¿ ¿
      bool exist(const size_t & i) const
      {
        const size_t pos_in_dir = index_in_dir(i);
        if (dir[pos_in_dir] == NULL)
          return false;
        const size_t pos_in_seg = index_in_seg(i);
        if (dir[pos_in_dir][pos_in_seg] == NULL)
          return false;
        return true;
      }
    Í× × index in dir     Ò   index in seg       º
        exist() Ö ØÓÖÒ true × Ð ÔÓ× ÓÒ i Ø Ò ×Ù ÐÓÕÙ Ý × Ñ ÒØÓ false¸ ÐÓ ÓÒ¹
    ØÖ Ö Óº
          Ò ÑÙ × Ó × ÓÒ ×¸ × Ö ÕÙ Ö Ú Ö ¬ Ö Ü ×Ø Ò    ÙÒ ÒØÖ Ý¸ × ×Ø Ü ×Ø ¸
     ÒØÓÒ × Ö Ð Þ Ö Ð ×Óº È Ö Ú Ø Ö ÓÖÖ Ö Ð Ó Ð Ð ÙÐÓ Ò × Ò Ö ØÓÖ Ó¸
    × Ñ ÒØÓ Ý ÐÓÕÙ ¸ ÔÓ ÑÓ× ÜÔÓÖØ Ö Ð ÔÖ Ñ Ø Ú × Ù ÒØ
¿    Ñ Ñ ÖÓ× ÔÙ Ð Ó× DynArray<T> +≡                    ´ ¾µ ¿
      T * test(const size_t & i) const
      {
        const size_t pos_in_dir = index_in_dir(i);
        if (dir[pos_in_dir] == NULL)
          return NULL;
54                                                                    Cap´
                                                                         ıtulo 2. Secuencias



      const size_t pos_in_seg = index_in_seg(i);
      if (dir[pos_in_dir][pos_in_seg] == NULL)
        return NULL;
      return &dir[index_in_dir(i)][index_in_seg(i)][index_in_block(i)];
  }
Í× × index in block   ¸ index in dir   ¸ Ò   index in seg     º
 ר × Ð Ñ Ò Ö Ñ × Ö Ô ÔÓ× Ð                Ö ÙÒ ÒØÖ         Ð ÖÖ ÐÓ Ò Ñ Óº
ÆÓØ ÑÓ׸ × Ò Ñ Ö Ó¸ ÕÙ ÒÓ × Ö Ð Þ Ò Ò ÙÒ Ú Ö ¬ ÓÒº Ë Ð ÒØÖ      Ü ×Ø ¸ ÒØÓÒ ×
test() Ö ØÓÖÒ ÙÒ ÔÙÒØ ÖÓ Ð ÒØÖ     NULL   ÐÓ ÓÒØÖ Ö Óº
   È Ö Ô ÖØ Ö ÜÔÐ Ø Ñ ÒØ Ð ÐÓÕÙ Ý × Ñ ÒØÓ ÙÒ ÔÓ× ÓÒ ÒØÖÓ Ð ÖÖ ÐÓ¸
× ÔÖÓÚ
 Ñ Ñ ÖÓ× ÔÙ Ð Ó× DynArray<T> +≡                      ´ ¾µ ¿
  T & touch(const size_t & i)
  {
    const size_t pos_in_dir = index_in_dir(i);
    if (dir[pos_in_dir] == NULL)
      allocate_segment(dir[pos_in_dir]);

      const size_t pos_in_seg = index_in_seg(i);
      if (dir[pos_in_dir][pos_in_seg] == NULL)
              allocate_block(dir[pos_in_dir][pos_in_seg]);
      if (i >= current_dim)
        current_dim = i + 1;
      return dir[pos_in_dir][pos_in_seg][index_in_block(i)];
  }
Í× × allocate block ¸   allocate segment     ¸   index in block   ¸   index in dir   ¸
   Ò index in seg º
  Ì Ñ Ò ÔÙ      Ô ÖØ Ö× ØÓ Ð Ñ ÑÓÖ Ö ÕÙ Ö Ô Ö Ö ÒØ Þ Ö Ð                                 ×Ó Ö ØÓ
 ÙÒ Ö Ò Ó ÔÓ× ÓÒ ×º ×ØÓ × Ö Ð Þ Ñ ÒØ Ð × Ù ÒØ Ñ ØÓ Ó
Ñ Ñ ÖÓ× ÔÙ Ð Ó× DynArray<T> +≡               ´ ¾µ
  void reserve(const size_t & l, const size_t & r)
  {
    const size_t first_seg   = index_in_dir(l);
    const size_t last_seg    = index_in_dir(r);
    const size_t first_block = index_in_seg(l);
    const size_t last_block = index_in_seg(r);
        for (size_t seg_idx = first_seg; seg_idx <= last_seg; ++seg_idx)
          {
            if (dir[seg_idx] == NULL)
              allocate_segment(dir[seg_idx]);
            size_t block_idx = (seg_idx == first_seg) ? first_block : 0;
            const size_t final_block = (seg_idx == last_seg) ? last_block : seg_size - 1;
            while (block_idx <= final_block)
              {
                if (dir[seg_idx][block_idx] == NULL)
                  allocate_block(dir[seg_idx][block_idx]);
                ++block_idx;
              }
          } // end for (...)
2.1. Arreglos                                                                                        55



          if (r + 1 > current_dim)
            current_dim = r + 1;
  }
Í× × allocate block        ¸ allocate segment    ¸ index in dir        ¸ Ò   index in seg   º
      reserve()      Ô ÖØ ÐÓ× ÐÓÕÙ × Ý × Ñ ÒØÓ× ÕÙ                Ö Ò ÐÖ Ò Ó          ÔÓ× ÓÒ × ÒØÖ    l
Ý rº
      Ð Ñ ×Ñ Ñ Ò Ö Ò ÕÙ × ÔÙ      Ô ÖØ Ö Ñ ÑÓÖ Ô Ö × ÙÖ Ö ×Ó       Ø Ö¹
Ñ Ò × ÔÓ× ÓÒ ×¸ Ø Ñ Ò × ÔÐ Ù× Ð Ò Ö ÕÙ × Ð Ö Ð Ñ ÑÓÖ          ÙÒ Ö Ò Ó
   ÔÓ× ÓÒ × ÕÙ Ð Ù×Ù Ö Ó Ø ÖÑ Ò ÕÙ ÒÓ Ù× Ö Ñ ×º Ð Ñ ØÓ Ó cut() Ùר Ð
  Ñ Ò× ÓÒ Ð ÖÖ ÐÓ ÙÒ Ñ Ò× ÓÒ Ò Ö ÓÖ ÐÐ Ñ new dim Ý Ð Ö ØÓ Ð Ñ ÑÓÖ
 ÒØÖ new dim Ý Ð ÒØ Ù Ñ Ò× ÓÒ
Ñ Ñ ÖÓ× ÔÙ Ð Ó× DynArray<T> +≡                 ´ ¾µ
  void cut(const size_t & new_dim = 0)
  {
    if (new_dim == 0)
      {
        release_all_segments_and_blocks();
        current_dim = 0;
        return;
      }
    const size_t old_dim = current_dim; // guarda antigua dimensi´n
                                                                 o
    const int idx_first_seg   = index_in_dir(old_dim - 1); // ındices cotas bloques
                                                              ´
    const int idx_first_block = index_in_seg(old_dim - 1);
    const int idx_last_seg    = index_in_dir(new_dim - 1); // ındices cotas segmentos
                                                              ´
    const int idx_last_block = index_in_seg(new_dim - 1);
    for (int idx_seg = index_in_dir(old_dim - 1); idx_seg >= idx_last_seg;
         --idx_seg) // recorre descendentemente los segmentos
      {
        if (dir[idx_seg] == NULL) // ¿hay un segmento?
          continue; // no ==> avance al siguiente
           Ä Ö Ö × Ò ÒØ Ñ ÒØ ÐÓ× ÐÓÕÙ × Ð × Ñ ÒØÓ
           Ä Ö Ö Ð × Ñ ÒØÓ
         }
       current_dim = new_dim; // actualiza nueva dimensi´n
                                                        o
  }
Í× × index in dir      ¸ index in seg    ¸ Ò    release all segments and blocks         º
     Ä Ð Ö ÓÒ        ÐÓÕÙ × × Ð Ó Ð     ÔÓÖÕÙ Ý ÕÙ Ñ Ò Ö ×Ó× Ô ÖØ ÙÐ Ö ×
Ô Ö Ð ÙÐØ ÑÓ Ý ÔÖ Ñ Ö ÐÓÕÙ º idx block ÐÐ Ú Ð Ò        Ð ÐÓÕÙ Ò Ð × Ñ ÒØÓ
   ØÙ Ð idx segº È Ö Ð Ú ÐÓÖ Ò Ð ÒØÖÓ Ð × Ñ ÒØÓ¸ Ý Ó× ×Ó× ÔÓ× Ð ×
    ½º Ë × ØÖ Ø Ð ÔÖ Ñ Ö × Ñ ÒØÓ¸ ÒØÓÒ × idx block ÓÑ ÒÞ Ò idx first blockº
        ר ×Ó Ó ÙÖÖ ÙÒ ×ÓÐ Ú Þ Ù Ò Ó idx seg == idx first segº
    ¾º idx block ÓÑ ÒÞ Ò block size − 1º ר × Ð ×Ó ÓÑÙÒ Ý × Ú Ö ¬
        Ù Ò Ó idx seg != idx first segº
  Ð Ú ÐÓÖ Ò Ð × ¬Ò ¸ ÒØÓÒ ×¸ Ð × Ù ÒØ ÑÓ Ó
 Ä Ö Ö × Ò ÒØ Ñ ÒØ ÐÓ× ÐÓÕÙ × Ð × Ñ ÒØÓ ≡               ´ µ
      Ä ÒÚ Ö× ÓÒ ×     Ö    ÔÓÖÕÙ Ð Ð Ö ÓÒ          ÐÓÕÙ × ×      ØÙ     × Ò ÒØ Ñ ÒØ º
56                                                          Cap´
                                                                 ıtulo 2. Secuencias



        // primer bloque a liberar
    int idx_block = idx_seg == idx_first_seg ? idx_first_block : seg_size - 1;
        Ì Ñ Ò Ý Ó× ×Ó× ÔÓ× Ð × Ô Ö Ð Ú ÐÓÖ ¬Ò Ð idx block
       ½º Ë ÒÓ ÒÓ× Ò ÓÒØÖ ÑÓ× Ò Ð ÙÐØ ÑÓ × Ñ ÒØÓ ´idx last segµ¸ ÒØÓÒ × Ð ÙÐØ ÑÓ
           ÐÓÕÙ × Ö Ð Ò 0º Ä ÓÒ ÓÒ Ô Ö × Ö ¸ ÒØÓÒ ×¸ Ð × Ù ÒØ
           Ë ×Ø Ò ÐÓÕÙ ÙÒ × Ñ ÒØÓ Ò Ö Ð ≡                        ´ µ
            (idx_seg > idx_last_seg and idx_block >= 0)

¾º Ë ÒÓ× Ò ÓÒØÖ ÑÓ× Ò Ð ÙÐØ ÑÓ × Ñ ÒØÓ¸ ÒØÓÒ × Ð ÙÐØ ÑÓ ÐÓÕÙ × Ö idx last blockº
    ר ÓÒ ÓÒ Ð Ø Ø ÑÓ× Ñ ÒØ Ð ÔÖ              Ó
        Ë ×Ø Ò ÐÓÕÙ Ð ÙÐØ ÑÓ × Ñ ÒØÓ ≡                          ´ µ
            (idx_seg == idx_last_seg and idx_block > idx_last_block)

      Ð Ù Ð ÕÙ Ð Ö × Ò ÒØ Ñ ÒØ Ð ÐÓÕÙ Ð × Ñ ÒØÓ ØÙ Ð ×                   ¬Ò ¸ ÒØÓÒ ×¸
   ÓÑÓ × Ù
   Ä Ö Ö × Ò ÒØ Ñ ÒØ ÐÓ× ÐÓÕÙ × Ð × Ñ ÒØÓ +≡    ´ µ
        // Libera descendentemente los bloques reservados del segmento
    while ( Ë ×Ø Ò ÐÓÕÙ        ÙÒ × Ñ ÒØÓ Ò Ö Ð        or
             Ë ×Ø Ò ÐÓÕÙ Ð ÙÐØ ÑÓ × Ñ ÒØÓ           )
    {
      if (dir[idx_seg][idx_block] != NULL) // ¿Hay un bloque aqu´?
                                                                ı
        release_block(dir[idx_seg][idx_block]);
      --idx_block;
    }
  Í× × release block     º
      Ð × Ñ ÒØÓ ×ÓÐÓ  Ð Ö Ö× × ØÓ Ó× ×Ù× ÐÓÕÙ × ÐÓ Ò × Óº ×ØÓ × Ú Ö ¬ ×
  Ö ÓÖÖ Ó ÓÑÔÐ Ø Ñ ÒØ Ð × Ñ ÒØÓ ØÙ Ð
   Ä Ö Ö Ð × Ñ ÒØÓ ≡                                      ´ µ
    if (idx_block < 0)
      release_segment(dir[idx_seg]);
  Í× × release segment       º

  2.1.5.4     Acceso mediante operador []

  À ר Ð ÔÖ × ÒØ ¸ Ð × ÒØ Ö ×         ×Ó ÐÓ× Ð Ñ ÒØÓ× ÙÒ ÖÖ ÐÓ Ò Ñ Ó ×Ø Ò
    ×Ò ×ÔÖ          ØÙ Ö Ð ×Ó Ò Ø ÑÔÓ ÓÒר ÒØ          Ð Ñ Ò Ö Ñ × Ö Ô ÔÓ× Ð º
  access() ÒÓ Ú Ö ¬ × Ð Ñ ÑÓÖ         × Ó Ô ÖØ ¸ Ö ÞÓÒ ÔÓÖ Ð Ù Ð Ð Ù×Ù Ö Ó
   ÜÔÐ Ø Ñ ÒØ Ú Ö ¬ ÖÐ ØÖ Ú × exist() Ó Ô ÖØ ÖÐ Ñ ÒØ touch() Ó reserve()º
      ÍÒ ÓÖÑ Ñ × × ÑÔÐ Ý ØÖ Ò×Ô Ö ÒØ Ñ Ò ÔÙÐ Ö ÙÒ ÖÖ ÐÓ Ò Ñ Ó¸ Ò ØÖ Ñ ÒØÓ
      ÙÒ ÔÓ Ó Ø ÑÔÓ¸ × ØÖ Ú × Ð ÓÔ Ö ÓÖ []º ÁÒ ÐÑ ÒØ ¸ Ð ÖÖ ÐÓ × ÓÒרÖÙÝ
   ÓÒ Ø Ò ×ÓÐÓ Ð Ö ØÓÖ Ó Ô ÖØ Óº È ÙÐ Ø Ò Ñ ÒØ ¸ Ñ          ÕÙ × × Ö Ò ØÓ× Ò
  Ð × ÔÓ× ÓÒ ×¸ × Ô ÖØ Ò¸ Ô Ö ÞÓ× Ñ ÒØ ¸ ÐÓ× × Ñ ÒØÓ× Ý ÐÓÕÙ × ÓÖÖ ×ÔÓÒ ÒØ × Ð ×
   ÒØÖ × ÕÙ Ò × Ó × Ö Ø ×º        ר Ñ Ò Ö ¸ Ð Ñ ÑÓÖ Ó ÙÔ ÔÓÖ Ð DynArray<T>
   × ÔÖÓÔÓÖ ÓÒ Ð Ð × ÒØÖ × × Ö Ø × Ý ÒÓ ×Ù Ñ Ò× ÓÒº
2.1. Arreglos                                                            57



    È Ö ÑÔÐ ÒØ Ö ×Ø ÙÒ ÓÒ Ð ¸ Ö ÕÙ Ö ÑÓ× ×Ø Ò Ù Ö ÐÓ×     ×Ó× Ð ØÙÖ
ÐÓ×      × Ö ØÙÖ º È Ö ÐÐÓ¸ Ù× Ö ÑÓ× ÙÒ Ð × Ñ ÓÖ Proxy¸ Ø Ð ÓÑÓ × ÜÔÐ Ó
 Ò Ü ¾º½º¿ ´Ô Ò ¿ µ
 Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> +≡                       ´ ¾µ ¾
    class Proxy
    {
         Å Ñ ÖÓ× ØÓ Ð ÔÖÓÜÝ
         Å ØÓ Ó× Ð ÔÖÓÜÝ
    };
ר Ð × × Ð Ú ÐÓÖ        Ö ØÓÖÒÓ Ð ÓÔ Ö ÓÖ [] Ò Ð Ð ×       DynArray<T>
Ñ Ñ ÖÓ× ÔÙ Ð Ó×       DynArray<T>      +≡                      ´ ¾µ
    Proxy operator [] (const size_t & i)
    {
      return Proxy (const_cast<DynArray<T>&>(*this), i);
    }
Í× × DynArray ¾º
    Ë ×     ØÙ ÙÒ       ×Ó Ð ØÙÖ Ù Ö         Ð Ñ Ò× ÓÒ ØÙ и ÒØÓÒ × × ¹
Ò Ö std::length errorº Ë × Ö Ð Þ ÙÒ ×Ó × Ö ØÙÖ ¸ ÙÒ Ù Ö Ð Ñ Ò× ÓÒ
  ØÙ и ÒØÓÒ ×¸ × Ú Ö ¬ × Ü ×Ø Ò Ð ÐÓÕÙ Ý Ð × Ñ ÒØÓ × ÒÓ × Ð ×Ó¸ ÒØÓÒ × ×ØÓ×
× Ô ÖØ Òº ÈÙ        Ò Ö Ö× std::bad alloc × ÒÓ Ý Ñ ÑÓÖ ¸ Ó std::length error
× Ð Ò i × Ñ ÝÓÖ Ó Ù Ð ÕÙ Ð Ñ Ü Ñ Ñ Ò× ÓÒº
    Ä Ñ Ò× ÓÒ × Ùר ÙØÓÑ Ø Ñ ÒØ × ÙÒ Ð Ñ ÝÓÖ ÔÓ× ÓÒ × Ö Ø º Ë ÙÒ ×Ó
   Ð ØÙÖ Ð i¹ × Ñ ÒØÖ           Ø Ø ÕÙ Ð ÐÓÕÙ ÒÓ × Ó Ô ÖØ Ó¸ ÒØÓÒ × ×
  Ò Ö Ð Ü Ô ÓÒ std::invalid argumentº
      Ð   ×Ó Ð ØÙÖ ÙÒ ÒØÖ ÕÙ ÒÓ × Ó × Ö Ø ÒÓ × ÑÔÖ Ù× ÙÒ Ü¹
  Ô ÓÒ¸ ÔÙ × Ð ÒØÖ Ý ÔÙ Ø Ò Ö ×Ù ÐÓÕÙ Ô ÖØ Ó ÑÔ ÖÓ¸ Ò ×Ø ×Ó Ð Ú ÐÓÖ
   Ð Ð ØÙÖ × Ò Ø ÖÑ Ò Óº
    Ä        Ð ÓÔ Ö ÓÖ [] × Ö ØÓÖÒ Ö ÙÒ Ð × ÈÖÓÜÝ Ò ×Ô Ö     ÓÒÓ Ö × Ð ×Ó
 × Ð ØÙÖ Ó × Ö ØÙÖ º
    ÄÓ× Ñ Ñ ÖÓ× ØÓ× Proxy Ñ ÒØ Ò Ò Ð Ò ÓÖÑ ÓÒ ×Ù¬ ÒØ Ô Ö Ú Ð Ö Ý ¹
ØÙ Ö Ð ×Ó
 Å Ñ ÖÓ× ØÓ Ð ÔÖÓÜÝ ≡                                       ´ µ
    size_t index;
    size_t     pos_in_dir;
    size_t     pos_in_seg;
    size_t     pos_in_block;
    T **&      ref_seg;
    T *        block;
    DynArray & array;
Í× × DynArray ¾º
     index × Ð Ò    Ð Ð Ñ ÒØÓ ÕÙ Ð ÔÖÓÜÝ       º pos in dir¸ pos in seg
Ý   pos in block ×ÓÒ
                ÐÓ× Ò × Ò Ð Ö ØÓÖ Ó¸ × Ñ ÒØÓ Ý ÐÓÕÙ ÓÖÖ ×ÔÓÒ ÒØ ×
    indexº רÓ× Ú ÐÓÖ
                × × Ð ÙÐ Ò ÙÖ ÒØ Ð ÓÒרÖÙ ÓÒ Ð ÔÖÓÜݺ
     ref seg × ÙÒ Ö
                 ÖÒ    Ð ÒØÖ pos in dir Ð Ö ØÓÖ Óº        × Ö ÙÒ Ö Ö Ò¹
  ÔÓÖÕÙ ×Ø × ×Ù× ÔØ Ð ÑÓ ¬ Ö× º          ר Ö Ö Ò ¸ ref seg[pos in seg]
 ÒÓØ Ð ÔÙÒØ ÓÖ Ð ÐÓÕÙ Ý ref seg[pos in seg][pos in block] ÒÓØ Ð Ð ¹
Ñ ÒØÓ Ð ÖÖ ÐÓ ÓÖÖ ×ÔÓÒ ÒØ Ð Ò      indexº block × ÙÒ ÔÙÒØ ÓÖ Ù Ð Ó
58                                                                 Cap´
                                                                      ıtulo 2. Secuencias



    ref seg[pos in seg][pos in block]º array
                                    × ÙÒ Ö Ö Ò Ð DynArray<T> ÙØ ¹
ÐÞ   Ô Ö Ó × ÖÚ Ö Ý ÑÓ ¬ Ö ×Ù ×Ø Óº
   Å Ñ ÖÓ× ØÓ Ð ÔÖÓÜÝ × Ò Ò Ò Ð ÓÒרÖÙ ØÓÖ Ð ÔÖÓÜÝ ÓÑÓ × Ù
Å ØÓ Ó× Ð ÔÖÓÜÝ ≡                             ´ µ
    Proxy(DynArray<T>& _array, const size_t & i)
      : index(i), pos_in_dir(_array.index_in_dir(index)),
        pos_in_seg(_array.index_in_seg(index)), pos_in_block(_array.index_in_block(index)),
        ref_seg(_array.dir[pos_in_dir]), block (NULL), array(_array)
    {
      if (ref_seg != NULL)
        block = ref_seg[pos_in_seg]; // ya existe un bloque para la entrada i
    }
Í× × DynArray ¾¸ index in block   ¸ index in dir   ¸ Ò   index in seg   º
i  × Ð Ò        Ð DynArray<T>array Ð Ù Ð Ð ÔÖÓÜÝ    Ö Ö Ò º Ä × ÔÓ× ÓÒ × ×
  Ð ÙÐ Ò × ÙÒ Ð × ÙÒ ÓÒ × ÙÜ Ð Ö × DynArray<T>º Ë Ð Ö Ö Ò ref seg ÓÒØ Ò
ÙÒ ÔÙÒØ ÓÖ Ú Ð Ó¸ ÒØÓÒ × block × Ò Ð Þ Ô Ö ÔÙÒØ Ö Ð ÐÓÕÙ º
    ÆÓ ×    ØÙ Ò Ò ÙÒ       ÓÒ Ù Ò Ó × ×ØÖÙÝ ÙÒ ÔÖÓÜݺ
    ÍÒ Proxy ÓÒרÖÙ Ó ×Ø Ð ×ØÓ Ô Ö       Ö ÙÒ ÔÓ× ÓÒ      º Ë ÙÒ Ð ÓÒØ ÜØÓ
    ÒÚÓ ÓÒ Ð ÓÔ Ö ÓÖ []¸ Ð ÓÑÔ Ð ÓÖ Ø ÖÑ Ò Ö × Ð ×Ó × Ð ØÙÖ Ó
 × Ö ØÙÖ º Ù Ò Ó Ó ÙÖÖ ÙÒ Ð ØÙÖ ¸ Ð ÓÑÔ Ð ÓÖ ÒØ ÒØ Ö ÓÒÚ ÖØ Ö Ð Proxy Ð Ø ÔÓ
  Ò Ö Ó Tº Ì Ð ÓÒÚ Ö× ÓÒ × ¬Ò Ð × Ù ÒØ ÑÓ Ó
 Å ØÓ Ó× Ð ÔÖÓÜÝ +≡                                ´ µ
    operator T & ()
    {
      return block[pos_in_block];
    }
block == NULL    Ò ÕÙ ÒÓ Ü ×Ø ÙÒ ÐÓÕÙ Ô Ö Ð Ò indexº Ë ÒÓ Ý ÐÓÕÙ ¸
 ÒØÓÒ × Ð Ð ØÙÖ × ÒÚ Ð Ý × Ò Ö Ð Ü Ô ÓÒ std::invalid argumentº ÐÓ
 ÓÒØÖ Ö Ó¸ × Ö ØÓÖÒ Ð Ð Ñ ÒØÓ Ö Ö Óº
   Ä × Ö ØÙÖ ÔÙ Ó ÙÖÖ Ö Ù Ò Ó ×      ØÙ ÙÒ × Ò ÓÒ¸ Ð Ù Ð × ¬Ò Ô Ö
ÙÒ Proxy Ð × Ó× × Ù ÒØ × ÓÖÑ ×
 Å ØÓ Ó× Ð ÔÖÓÜÝ +≡                              ´ µ
    Proxy & operator = (const T & data)
    {
        Ç Ø Ò Ö Ó Ô ÖØ Ö Ð × Ñ ÒØÓ Ý Ð ÐÓÕÙ
        Î Ö ¬ Ö Ý ØÙ Ð Þ Ö Ð Ñ Ò× ÓÒ
        block[pos_in_block] = data;
        return *this;
    }
    Proxy & operator = (const Proxy & proxy)
    {
      if (proxy.block == NULL) // ¿operando derecho puede leer?
        throw std::invalid_argument("right entry has not been still written");

        Ç Ø Ò Ö Ó Ô ÖØ Ö Ð × Ñ ÒØÓ Ý Ð ÐÓÕÙ
        Î Ö ¬ Ö Ý ØÙ Ð Þ Ö Ð Ñ Ò× ÓÒ
        block[pos_in_block] = proxy.block[proxy.pos_in_block];
        return *this;
    }
2.1. Arreglos                                                             59



   × Ö¸ × Ò ÓÒ Ð Ø ÔÓ Ò Ö Ó T ÙÒ ÔÖÓÜݸ ÔÓÖ ÑÔÐÓ array[i] = variable
Ó × Ò ÓÒ ÔÖÓÜÝ ÔÖÓÜݸ ÔÓÖ ÑÔÐÓ array[i] = array[j]º Ò Ð ÙÐØ ÑÓ ×Ó
×         Ú Ö ¬ Ö ÕÙ Ð Ð ØÙÖ Ð ÓÔ Ö Ò Ó Ö Ó × Ú Ð ¸ Ù Ð × Ð × ÒØ Ó Ð
ÔÖ Ñ Ö ifº
        Ö ×ØÓ¸ Ð × Ó× × Ò ÓÒ × ×ÓÒ ÑÙÝ × Ñ Ð Ö × Ý × Ö Ñ Ø Ò Ç Ø Ò Ö Ó Ô ÖØ Ö
  Ð × Ñ ÒØÓ Ý Ð ÐÓÕÙ        Ò ÓÒ × × Ö Ö Ý ÐÙ Ó Î Ö ¬ Ö Ý ØÙ Ð Þ Ö Ð
    Ñ Ò× ÓÒ º
     Ä Ñ Ò× ÓÒ ØÙ Ð ×ÓÐÓ × ØÙ Ð Þ × × × Ö Ò ÙÒ ÔÓ× ÓÒ Ñ ÝÓÖ ÕÙ Ð ¹
Ñ Ò× ÓÒ ØÙ Ð
 Î Ö ¬ Ö Ý ØÙ Ð Þ Ö Ð Ñ Ò× ÓÒ ≡                               ´ µ
 if (index >= array.current_dim)
   array.current_dim = index + 1;
    Ç Ø Ò Ö Ó Ô ÖØ Ö Ð × Ñ ÒØÓ Ý Ð ÐÓÕÙ               Ö Ð Þ Ó× Ô ×Ó×
  ½º Ç Ø Ò Ö Ð × Ñ ÒØÓ
     Ç Ø Ò Ö Ó Ô ÖØ Ö Ð × Ñ ÒØÓ Ý Ð ÐÓÕÙ          ≡            ´   µ
          bool seg_was_allocated_in_current_call = false;
          if (ref_seg == NULL) // hay segmento?
          {     // No ==> apartarlo!
            array.allocate_segment(ref_seg);
            seg_was_allocated_in_current_call = true;
          }
     Í× × allocate segment       º
     seg was allocated in current call  Ñ ÑÓÖ Þ × × Ô ÖØ Ñ ÑÓÖ Ô Ö Ð × ¹
     Ñ ÒØÓº ×ØÓ Ô ÖÑ Ø Ø ÖÑ Ò Ö × Ý ÕÙ Ð Ö Ö Ó ÒÓ Ð × Ñ ÒØÓ Ò ×Ó ÕÙ
     Ó ÙÖÖ ÙÒ Ü Ô ÓÒ × × Ô ÖØ Ð ÐÓÕÙ º
  ¾º Ç Ø Ò Ö ÐÓÕÙ
      Ç Ø Ò Ö Ó Ô ÖØ Ö Ð × Ñ ÒØÓ Ý Ð ÐÓÕÙ     +≡       ´ µ
          if (block == NULL) // test if block is allocated
            {
                array.allocate_block(block);
                ref_seg[pos_in_seg] = block;
            }
     Í× × allocate block     º
   Ë Ó ÙÖÖ ÙÒ ÐÐ         Ñ ÑÓÖ ÙÖ ÒØ Ð Ö × ÖÚ ÓÒ Ð × Ñ ÒØÓ¸ Рܹ
  Ô ÓÒ std::bad alloc¸ Ò Ö ÔÓÖ new Ý Ö Ò Ö ÔÓÖ allocate segment() Ó
allocate block()¸ ÔÙ      Ö× × Ò ÔØÙÖ Öº Ë Ð ÐÐ     Ñ ÑÓÖ Ó ÙÖÖ ÙÖ ÒØ
Ð Ö × ÖÚ ÓÒ Ð ÐÓÕÙ ¸ ÒØÓÒ × Ð Ü Ô ÓÒ std::bad alloc¸ Ò Ö ÔÓÖ new¸
  ÔØÙÖ Ö× Ô Ö Ú ÒØÙ ÐÑ ÒØ ÔÓ Ö Ð Ö Ö Ð Ñ ÑÓÖ Ð × Ñ ÒØÓ ÕÙ Ù Ô ÖØ
ÔÓÖ Ð ÐÐ Ñ     ØÙ к ר × Ð Ö ÞÓÒ ÔÓÖ Ð Ù Ð Ý ÙÒ Ñ Ò ÓÖ Ü Ô ÓÒ Ô Ö
Ð Ö × ÖÚ ÓÒ Ð ÐÓÕÙ º
2.1.5.5     Uso del valor por omisi´n
                                   o

À ÑÓ× Ö Ð Ó Ð      Ó ÕÙ Ð Ñ ÑÓÖ   ÙÒ DynArray<T> × Ô ÖØ Ô Ö ÞÓ× Ñ ÒØ
 Ò Ø ÑÔÓ × Ö ØÙÖ º Ì Ñ Ò ÑÓ× ×Ø Ó ÕÙ ×Ø Ö Ø Ö ×Ø Ô ÖÑ Ø ÓÖÖ Ö
Ñ ÑÓÖ Ò ÔÐ ÓÒ × ÕÙ Ù× Ò ÖÖ ÐÓ× ×Ô Ö Ó׺
60                                                        Cap´
                                                                 ıtulo 2. Secuencias



         ÉÙ ×Ù         ÙÒ Ó×             ÙÒ ÒØÖ ÕÙ ÒÓ × Ó × Ö Ø º È Ö ×ØÙ Ö
     ר Ù ×Ø ÓÒ¸ ×ÙÔÓÒ ÑÓ× ÙÒ ×Ó Ð ØÙÖ ÙÒ i¹ × Ñ ÒØÖ                     ÒØ ר Ú ÒØÓ¸
    ÔÓ ÑÓ× ÔÐ ÒØ Ö ÐÓ× × Ù ÒØ × × Ò Ö Ó×
       ½º Ä i¹ × Ñ ÒØÖ           × Ó ÔÖ Ú Ý ÜÔÐ Ø Ñ ÒØ × Ö Ø ¸ Ò ÙÝÓ ×Ó × Ö ØÓÖÒ Ö
           Ð ÙÐØ ÑÓ Ú ÐÓÖ × Ö ØÓº
       ¾º Ä ÒØÖ ÒÓ × Ó ÔÖ Ú Ñ ÒØ × Ö Ø º Ò ×Ø × ØÙ ÓÒ ÔÙ Ò Ó ÙÖÖ Ö Ó×
           Ó× ×
           ´ µ ÉÙ ÒÓ × Ý Ô ÖØ Ó ÙÒ ÐÓÕÙ Ô Ö Ð i¹ × Ñ ÒØÖ ¸ Ò ÙÝÓ ×Ó × ØÖ Ø
                    ÙÒ ÖÖÓÖ ÔÖÓ Ö Ñ ÓÒ ´Ð ØÙÖ ÙÒ Ú ÐÓÖ ÕÙ ÒÓ × Ó × Ö ØÓµ Р٠и
                 Ò Ð Ñ ÓÖ ÐÓ× × Ò Ö Ó׸ Ò Ö Ö ÙÒ Ü Ô ÓÒº ר × Ö Ð × ØÙ ÓÒ
                × Ð ×Ó × Ö Ð Þ Ñ ÒØ Ð ÓÔ Ö ÓÖ []º Ë Ð ×Ó × Ö Ð Þ Ñ ÒØ
                access()¸ ÒØÓÒ ×¸ ÓÒ ×Ù ÖØ ¸ Ó ÙÖÖ Ö Ð Ü Ô ÓÒ × ×Ø Ñ segmentation
                faultº ÈÓÖ Ð ÓÒØÖ Ö Ó¸ ÓÒ Ñ Ð ×Ù ÖØ ¸ ÒÓ Ó ÙÖÖ Ö Ò Ò ÙÒ Ü Ô ÓÒ¸ ÐÓ ÕÙ
                Ø Ò Ö Ó ÙÐØ Ö Ð ÖÖÓÖº
           ´ µ ÉÙ × × × Ý Ô ÖØ Ó Ð ÐÓÕÙ ÙÖ ÒØ Ð × Ö ØÙÖ                 Ð ÙÒ ÒØÖ     Ò
                 Ð Ñ ×ÑÓ ÐÓÕÙ Ð i¹ × Ñ ÒØÖ º Ò ×Ø ×Ó¸ × Ö ØÓÖÒ Ö Ð Ú ÐÓÖ ÕÙ
                   Ý × Ö ØÓ Ð ÓÒרÖÙ ØÓÖ ÔÓÖ ÓÑ × ÓÒ T::T()º ÆÓØ ÑÓ× Ð ÔÓ× Ð ¸ ÒÓ Ø Ò
                 Ü Ô ÓÒ Ð¸ ÕÙ ×Ø ÓÒרÖÙ ØÓÖ ÔÓÖ ÓÑ × ÓÒ ÒÓ Ö Ð Ò Ò ÙÒ × Ö ØÙÖ ¸
                 Ò ÙÝÓ ×Ó Ð Ú ÐÓÖ Ö ØÓÖÒÓ ÔÙ × Ö Ù ÐÕÙ Ö ¸ × ÙÒ Ð ×Ø Ó Ð ÐÓÕÙ º

         Ð Ì DynArray<T> ÔÙ × Ö ÙØ Ð Ô Ö ÑÓ Ð Þ Ö ÖÖ ÐÓ× ×Ô Ö Ó× ÔÓÖ                ѹ
    ÔÐÓ¸ ÙÒ Ñ ØÖ Þ ×Ô Ö   ÕÙ ÓÒØ Ò ÑÙ Ó× ÖÓ׺ Ò ×Ø ×Ó ÔÓ ÑÓ× Ù×                  Ö ÙÒ
    DynArray<T> mat[n*n]º Ð    ×Ó ÙÒ ÒØÖ     Ð Ñ ØÖ Þ ÔÙ Ö Ð Þ Ö× Ñ                ÒØ
     Ð ÓÔ Ö ÓÖ (i,j) Ó Ñ ÒØ Ð Ù×Ó ÙÒ Ð × ÔÖÓÜݺ ÍÒ × Ù Ó¹ ÑÔÐ ÒØ ÓÒ ×Ù            Ö
       Ð ×Ó Ð ØÙÖ ÙÒ Ì Matriz<T> × ÓÑÓ × Ù
¼        ×Ó Ñ ØÖ Þ ¼ ≡
         template <typename T>
     const T & Matriz<T>::operator () (const long & i, const long & j) const
     {
       const int & n = mat.size();
       const long index_dynarray = i + j*n; // posici´n dentro de mat
                                                     o
       if (not mat.exist(index))
         return Zero_Value;
       return mat.access(index);
     }
    ÄÓ Ù Ö Ó Ò Ð ÓÒר ÒØ index dynarray × ÓÖÖ ×ÔÓÒ ÓÒ ÓÒ× Ö Ö ÙÒ Ñ ØÖ Þ
     ÓÑÓ ÙÒ ÖÖ ÐÓ ÖÖ ÐÓ× ½¼ º Ë Ð ÔÖ        Ó not mat.exist(index) × ÖØÓ¸ ÒØÓÒ ×
    ÒÓ Ý Ñ ÑÓÖ Ô ÖØ Ô Ö Ð ÐÓÕÙ ÕÙ ÓÒØ Ò Ö Ð ÒØÖ (i,j)¸ Ö ÞÓÒ ÔÓÖ Ð
     Ù Ð × Ö ØÓÖÒ ÙÒ Ú ÐÓÖ ÔÓÖ ÓÑ × ÓÒ ÒÓÑ Ò Ó Ò ×Ø ×Ó Zero Value ÐÓ ÓÒØÖ Ö Ó¸
    Ö ØÓÖÒ ÑÓ× mat.access(index) ÔÙ × Ð ×Ó ×Ø Ö ÒØ Þ Ó × Ð ­Ù Ó ÐÐ         × ÐÒ º
        ÈÙ ÔÖ × ÒØ Ö× Ð × ØÙ ÓÒ × Ö Ø Ò ¾ ¸ ×              Ö¸ mat.access(index) ÒÓ
        × Ó ÔÖ Ú Ñ ÒØ × Ö ØÓ¸ Ô ÖÓ not mat.exist(index) == trueº Ò Ú ÐÓÖ Ö ¹
    ØÓÖÒÓ × Ö ¸ ÒØÓÒ ×¸ Ð ×Ô ¬ Ó ÔÓÖ T::T() Ó Ð × Ò Ó Ò ÙÒ ÐÐ Ñ
    set default initial value()º
     ½¼
          Î ×   Ü   ¾º¾ ´Ô Ò ½µº
2.2. Arreglos multidimensionales                                                 61



   set default initial value() Ô ÖÑ Ø ×Ô ¬ Ö Ú Ö×Ó× Ú ÐÓÖ × Ò Ð × Ô Ö Ð
Ñ ×ÑÓ Ø ÔÓ¸ ÐÓ ÕÙ × Ö ÑÙÝ ÙØ Ð Ô Ö ÑÔÓ× Ð Ö Ó× Ö ÒØ × ÕÙ Ñ Ò ÔÙÐ Ò Ð
Ñ ×ÑÓ Ø ÔÓ ÓÔ Ö Ò Ó Ð × Ñ ØÖ ×       Ý Ò Ò ÐÓ× Ö Ó׸ ÔÓÖ ÑÔÐÓº

2.2    Arreglos multidimensionales
  Ò ÙÒ ÑÙÝ ÖØ Ñ        ¸ ÐÓ× ÖÖ ÐÓ× ×ÓÒ Ö Ñ Ò × ÒØ × ÐÓ× Ú ØÓÖ × Ð Ñ Ø Ñ Ø º
  Ò ×Ø × ÒØ Ó¸ × ÔÓ× Ð Ö ÔÖ × ÒØ Ö ÙÒ Ñ ØÖ Þ n× m Ñ ÒØ ÙÒ ÖÖ ÐÓ n ÖÖ ¹
 ÐÓ×     Ñ Ò× ÓÒ m × Ö¸ ÙÒ × Ù Ò            × Ù Ò ×º
     Ò C++ ÙÒ Ñ ØÖ Þ ×Ø Ø ÔÓ ×        Ð Ö Ð × Ù ÒØ ÑÓ Ó
 T matriz[n][m];

    Ð Ð Ò Ù ÑÔÐ ÒØ Ð ×Ó ÙÒ ÒØÖ                  Ð Ñ ØÖ Þ Ñ     ÒØ ÓÑ Ò ÓÒ × Ð
ÓÔ Ö ÓÖ []º ÈÓÖ ÑÔÐÓ¸ Ð ÜÔÖ × ÓÒ
 matriz[i][j] = dato;

     × Ò dato Ð j¹ × ÑÓ Ð Ñ ÒØÓ Ð i¹ × Ñ ¬Ð º
     Ð ÓÑÔ Ð ÓÖ Ò Ö ÙØÓÑ Ø Ñ ÒØ Ð Ð ÙÐÓ Ð Ö ÓÒ                          ×Ó¸ Ð Ù Ð ×
ÔÙ      ÒÙÒ Ö Ð × Ù ÒØ ÓÖÑ
          Ö ÓÒ Ð Ð Ñ ÒØÓ = base + i × m × sizeof(T) + j × sizeof(T)           ´¾º½ µ
  ÒÐ      Ð Ö ÓÒ ÒØ Ö ÓÖ¸ Ð ÓÑÔ Ð ÓÖ             Ù× Ö ÙÒ ×Ô Ó ÓÒØ ÙÓ ÐÓ ×Ù¬ ÒØ ¹
Ñ ÒØ Ö Ò Ô Ö Ð Ö Ö ÐÓ× n × m Ð Ñ ÒØÓ× Ð Ñ ØÖ Þº ÓÒ ÓÖÑ ÙÑ ÒØ Ò n Ý m¸
  ×Ñ ÒÙÝ Ð ÔÓ× Ð              Ò ÓÒØÖ Ö Ø Ð ×Ô Óº
    ÈÓÖ ÓØÖ Ô ÖØ ¸ Ò C++ Ð Ñ ØÖ Þ ÒØ Ö ÓÖ × ×Ø Ø Ò Ð × ÒØ Ó ÕÙ ÒÓ × ÔÓ× Ð
   Ñ Ö ×Ù Ñ Ò× ÓÒº Ð Ð ÙÐÓ ´¾º½ µ Ò Ö Ó ÔÓÖ Ð ÓÑÔ Ð ÓÖ ×ÙÑ ÕÙ n Ý m
Ô ÖÑ Ò Ò ÓÒר ÒØ × ÙÖ ÒØ Ð Ú                Ð Ñ ØÖ Þº Ë Ò ×ØÓ ÒÓ × Ø Ò ÔÖÓ Ð Ñ Ø Ó¸
ÔÙ × × ÔÓ Ö Ò Ö Ö Ó Ó Ô Ö n Ý m Ú Ö Ð ×¸ ÙÒ Ñ Ó Ò Ð ÙÒ Ð × Ñ Ò× ÓÒ ×
ÓÐ          ×ÔÐ Þ Ö Ð Ñ ÝÓÖ      ÐÓ× Ð Ñ ÒØÓ׺
    ÈÓÖ Ð × Ö ÞÓÒ × ÒØ Ö ÓÖ ×¸ × ÔÖ Ö Ð ØÖ Ø Ö ÜÔÐ Ø Ñ ÒØ ÙÒ ÖÖ ÐÓ ÑÙÐØ Ñ Ò¹
× ÓÒ Ð ÓÑÓ ÐÓ ÕÙ × ÙÒ × Ù Ò                × Ù Ò ×º     Ó ×Ø Ô Ö×Ô Ø Ú ¸ ÙÒ Ñ ØÖ Þ
n × m ÔÙ          Ð Ö Ö× ÓÑÓ × Ù
        T ** matriz = new T * [n]; // Aparta un arreglo de punteros a filas

        for (int i = 0; i < n; ++i)
          matriz[i] = new T [m]; // aparta la fila matriz[i]

     ר ×ÕÙ Ñ × ÒØÖ Ñ × Ò Ñ Ó ÕÙ Ð ÒØ Ö ÓÖº Ë × Ñ Ð ÒÙÑ ÖÓ
¬Ð × n¸ ÒØÓÒ × ×ÓÐÓ × Ò × Ö Ó Ö ÐÓ Ð Þ Ö Ð ÖÖ ÐÓ matrizº Ë ¸ ÔÓÖ Ð ÓÒØÖ Ö Ó¸ ×
ÑÓ ¬ Ð ÒÙÑ ÖÓ ÓÐÙÑÒ ×¸ ÒØÓÒ × Ý ÕÙ Ö ÐÓ Ð Þ Ö              ¬Ð matriz[i]º
     ÒC  ++¸ × ÓÑÓ Ò Ð Ñ ÝÓÖ       ÐÓ× Ð Ò Ù ×¸ ÙÒ Ñ ØÖ Þ × ÓÒ× Ö ÓÑÓ ÙÒ
 ÖÖ ÐÓ n ¬Ð × Ø Ñ ÒÓ mº Ë Ò Ñ Ö Ó¸ Ø Ñ Ò ÔÙ ÒØ ÖÔÖ Ø Ö× Ð Ö Ú × ×
    Ö¸ ÓÑÓ ÙÒ ÖÖ ÐÓ m ÓÐÙÑÒ × Ø Ñ ÒÓ nº ר × Ð ×Ó Ð Ð Ò Ù
ÔÖÓ Ö Ñ ÓÒ ÓÖØÖ Ò¸ ÒØ Ò× Ú Ñ ÒØ Ù× Ó Ô Ö Ð ÙÐÓ× ÒÙÑ Ö Ó׺
      ÙÒÕÙ × ÙØ Ð ¸ Ð ×ÔÓ× ÓÒ ×Ô Ð Ð × Ñ ØÖ × Ò ÓÖØÖ Ò ÒÓ × ÙÒ ÔÖ Óº
ËÙ      ÕÙ ÑÙ × ÓÔ Ö ÓÒ × Ñ Ø Ñ Ø × ×Ó Ö Ñ ØÖ × Ü Ò ÙÒ Ô ØÖÓÒ                ×Ó
ÕÙ ÚÓÖ Ð × Ù Ò Ð Þ ÓÒ ÔÓÖ ÓÐÙÑÒ × Ò ÐÙ Ö ÔÓÖ ¬Ð ׺
62                                                              Cap´
                                                                   ıtulo 2. Secuencias



     Ù ÒØ          Ð ÔÓÔÙÐ Ö    Ð ÓÖØÖ Ò¸ ÐÓ× ÔÖÓ Ö Ñ ÓÖ × C Ý C++ Ò ÓÒ¹
× Ö Ö Ú Ö ÒØ × Ô Ö ÐÓ× ÖÖ ÐÓ×   Ù × Ð ÓÖØÖ Ò¸ ÔÙ × × ×Ø ÒØ Ø Ð ÙØ Ð Þ Ö
  Ð ÓØ × × Ö Ø × Ò ÓÖØÖ Ò Ý Ú Ú Ö× º

2.3   Iteradores
  Ò ÔÖÓ Ö Ñ ÓÒ¸ Ò ÕÙ Ð ¬Ò Ù ÒØ × ÒÓ ÕÙ Ò × ÒÓ × Ù Ò ×º Ù ÐÕÙ Ö ×
Ð ×ØÖÙ ØÙÖ       ØÓ׸ Ð ÕÙ   ÔÖÓ × Ñ ÒØÓ × ÑÔÖ × Ö Ñ Ø × Ù Ò ×º Ð
Ô ØÖÓÒ × Ø Ò Ö Ù ÒØ ÕÙ Ñ Ö ÙÒ Ô ØÖÓÒ Ò Ö Ó ÒÓÑ Ò Ó Iterator<Set, T> Ý
 ×Ô ¬ Ó Ò Ð Ö Ñ ÍÅÄ Ð ¬ ÙÖ ¾º¾º
                                                Set<Type>:template
                                                T:class
                                  Iterator
                     +Set_Type
                     +Item_Type
                     +Iterator(in ct:Set<T>)
                     +Iterator(in it:Iterator)
                     +Iterator()
                     +operator =(in ct:Set<T>)
                     +operator =(in it:Iterator)
                     +next(): void
                     +prev(): void
                     +has_current(): bool
                     +is_in_first(): bool
                     +is_in_last(): bool
                     +current(): T
                     +reset_first(): void
                     +reset_last(): void
                     +del(): void
                     +insert(in item:T): void
                     +append(in item:T): void
                     +set(in item:T): void
                     +position(): int


            ÙÖ ¾º¾        Ö Ñ ÍÅÄ            Ð Ð×   ÒÖ     Iterator<Set, T>

   Ä Ð × Iterator<Set, T> Ö       Ó× Ø ÔÓ× Ô Ö Ñ ØÖ Þ Ó× Set<T> Ð Ø ÔÓ ÜÔÐ Ó
 Ò Ü ½º¿ ´Ô Ò ½ µ Ý Tº ËÙ ¬Ò × Ð Ø Ö Ð ÔÖÓ × Ñ ÒØÓ × Ù Ò Ð          Ð Ñ ÒØÓ× Ò
ÙÒ ÓÒ ÙÒØÓ Set<T>º
   È Ö Ù× Ö ÙÒ Ø Ö ÓÖ × Ö ÕÙ Ö ÙÒ ÓÒ ÙÒØÓ Ó ÓÒØ Ò ÓÖ Set<T>º À Ý Ó× ÓÖÑ ×
    Òר Ò ÖÐÓ Ñ ÒØ Ð ÓÒרÖÙ ØÓÖ ÕÙ Ö           Ð ÓÒ ÙÒØÓ Ó Ñ ÒØ Ð ÓÒרÖÙ ØÓÖ
 ÓÔ º Ò Ð ÔÖ Ñ ÖÓ¸ Ð Ø Ö ÓÖ × ÔÓ× ÓÒ Ò Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ Ð × Ù Ò ¸
Ñ ÒØÖ × ÕÙ Ò Ð × ÙÒ Ó Ò Ð Ð Ñ ÒØÓ ØÙ Ð Ð Ø Ö ÓÖ Ù ÒØ Ð ÓÔ º
   È ØÓÖ Ñ ÒØ ¸ ÙÒ ÓÒ ÙÒØÓ ÔÙ ÒØ ÖÔÖ Ø Ö× ÓÑÓ Ð × Ù ÒØ × Ù Ò             ÒÖ
   n Ð Ñ ÒØÓ×    Ð ÙÒ Ø ÔÓ Ò Ö Ó T
2.3. Iteradores                                                                   63




    e0        e1       e2   ...     ei    ei+1     ...   en−2    en−1    en



           ÙÖ ¾º¿ Ê ÔÖ × ÒØ ÓÒ Ô ØÓÖ         ÙÒ ÒØ Ö ÓÖ ×Ó Ö ÙÒ × Ù Ò

      Ù Ò Ó × Òר Ò ÙÒ Ø Ö ÓÖ ÓÒ ÙÒ ÓÒØ Ò ÓÖ Set<T>¸ ר ÕÙ ÔÓ× ÓÒ Ó Ò
 Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ Ð × Ù Ò         × Ò Ó Ò Ð Ù Ó ÓÑÓ e0º
      Ð Ð Ñ ÒØÓ × Ò Ó ÓÑÓ en ÒÓ Ü ×Ø Ò Ð × Ù Ò ¸ Ô ÖÓ ×Ø ÐÓ Ñ ÒØ ¹
ÒÓØ ÕÙ Ð Ø Ö ÓÖ ×Ø        × ÓÖ Ó Ó Ù Ö           Ö Ò Ó º Ä ÔÖ Ñ Ø Ú has current()
Ö ØÓÖÒ false × Ð Ø Ö ÓÖ × Ò Ù ÒØÖ ÔÓ× ÓÒ Ó Ò Ð Ð Ñ ÒØÓ ¬ Ø Ó en true
ÐÓ ÓÒØÖ Ö Óº
      Ò Ð ÙÒ × × ØÙ ÓÒ × ÔÙ      ÓÒÚ Ò Ö × Ö × Ð Ø Ö ÓÖ ×Ø ÔÓ× ÓÒ Ó Ò Ð
ÔÖ Ñ Ö Ó ÙÐØ ÑÓ Ð Ñ ÒØÓº Ë Ð Ø Ö ÓÖ × Ò ÓÒØÖ × Ò Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ¸ ÒØÓÒ ×
is in first() Ö ØÓÖÒ Ö true Ð Ñ ×Ñ × Ñ ÒØ          × ÔÐ Ö ÓÒ is in last() × Ð
 Ø Ö ÓÖ × Ò ÓÒØÖ × Ò Ð ÙÐØ ÑÓ Ð Ñ ÒØÓº
      Ð Ð Ñ ÒØÓ ØÙ Ð Ð Ø Ö ÓÖ × ÓÒ×ÙÐØ Ñ ÒØ Ð Ñ ØÓ Ó get current()º
  Ò Ð ×Ó Ò Ö Ð¸ × ÙÒ Ð ÑÔÐ ÒØ ÓÒ                 Set<T>¸ Ð Ø Ö ÓÖ       Ò Ö Ð Ü¹
  Ô ÓÒ std::overflow error × × ÒØ ÒØ           Ö ÙÒ Ø Ö ÓÖ × ÓÖ Óº
    È Ö × ÐÚ Ù Ö Ö Ð ×Ø Ó ÙÒ Ø Ö ÓÖ ÔÙ Ò ÓÒרÖÙ Ö× Ø Ö ÓÖ × × Ò ÕÙ ×
ÔÖÓÔÓÖ ÓÒ Ð ÓÒ ÙÒØÓº Ç Ú Ñ ÒØ ¸ ÙÒ Ø Ö ÓÖ × Ò ÓÒ ÙÒØÓ ÒÓ × Ú Ð Ó ×Ø ÕÙ ×Ø
ÒÓ × ¬Ò Ñ ÒØ Ð ÙÒ Ð × Ó× Ú Ö× ÓÒ × Ð ÓÔ Ö ÓÖ × Ò ÓÒº
    È Ö Ú ÒÞ Ö Ð Ø Ö ÓÖ              Ð      Ö        Ó            Ð ÒØ ×       ÙØ
 Ð Ñ ØÓ Ó next()º      Ò ÐÓ Ñ ÒØ ¸ Ô Ö Ö ØÖÓ ÖÐÓ              Ð ÞÕÙ Ö         Ó ¹
        ØÖ × ×    ÙØ prev()º Ù ÐÕÙ Ö          רÓ× Ñ ØÓ Ó× ÔÙ       Ò Ö Ö Ð × Ü Ô¹
  ÓÒ × std::overflow error Ó std::underflow error × Ð Ø Ö ÓÖ ×Ø × ÓÖ Óº
      Ò ALEPH¸ × ÓÑÓ Ò ÓØÖÓ× Ñ ØÓ׸ ÙÒ ÓÒ ÙÒØÓ ÓÒØ Ò ×Ù Ð × Iteratorº ×
    Ö¸ Iterator × ÙÒ ×Ù Ð × Ð ×Ô Ð Þ ÓÒ Set<T, Compare>º
      Ð × Ù ÒØ Ó Ó ÐÙ×ØÖ ÙÒ Ù×ÕÙ          Ò Ö Ò ÙÒ ÓÒ ÙÒØÓ Ñ ÒØ ÙÒ Ø Ö ÓÖ
             template <template <class> class Set, typename T, class Compare>
         T * search(Set<T> & set, const T & item)
         {
           for (typename Set<T>::Iterator it(set); it.has_current(); it.next())
             if (are_equals<T, Compare>() (it.get_current(), item))
               return &it.get_current();
           return NULL;
         }

      Ú × ÙÒ Ø Ö ÓÖ ÔÙ      Ö Ù× Ö× º È Ö ÐÐÓ¸ × ÔÓ× Ð Ö Ò ÖÐÓ Ô Ö ÕÙ ×Ø
 ÔÙÒØ Ð ÔÖ Ñ Ö Ó ÙÐØ ÑÓ Ð Ñ ÒØÓ Ð ÓÒ ÙÒØÓº reset first() Ö Ò      Ð Ø Ö ÓÖ Ð
ÔÖ Ñ Ö Ð Ñ ÒØÓ¸ Ñ ÒØÖ × ÕÙ reset last() ÐÓ Ö Ò    Ð ÙÐØ ÑÓ ´ Ò  Ó ÓÒ en−1 Ò
Ð ¬ ÙÖ Ü ¾º¿µº
   Ä × ÓÔ Ö ÓÒ × ÕÙ × Ù Ò ×ÓÒ Ô Ò ÒØ × Ð ×ØÖÙ ØÙÖ              ØÓ× ÓÒ ÕÙ ×
 ÑÔÐ ÒØ Ð ÓÒ ÙÒØÓº
     Ð Ñ ØÓ Ó del() Ð Ñ Ò Ð ÓÒ ÙÒØÓ Ð Ð Ñ ÒØÓ ØÙ Ð Ý Ú ÒÞ Ð Ø Ö ÓÖ ÙÒ
ÔÓ× ÓÒ         Ð ÒØ º    Ø Ò Ö× ×Ô Ð Ù Ó Ù Ò Ó × ÒØ Ö Ð Ò next() Ý del()
 Ò ÙÒ Ñ ×Ñ Ø Ö ÓÒº
64                                                                        Cap´
                                                                             ıtulo 2. Secuencias



     Ð Ñ ØÓ Ó insert() Ò× ÖØ ÙÒ ÒÙ ÚÓ Ð Ñ ÒØÓ Ò Ð × Ù Ò          Ð Ö           Ð
 Ð Ñ ÒØÓ ØÙ Ð Ð Ø Ö ÓÖ × Ò Ú ÒÞ Öº Ò ÐÓ Ñ ÒØ ¸ Ð Ñ ØÓ Ó append() Ò× ÖØ
      Ð ÞÕÙ Ö º
    Ä ÔÖ Ñ Ø Ú set() ÔÓ× ÓÒ ÙÒ Ø Ö ÓÖ Ò Ð Ð Ñ ÒØÓ item Ô ÖØ Ò ÒØ Ð ÓÒ ÙÒØÓº
ÈÓÖ ÐÓ Ò Ö Ð¸ ÒÓ × Ú Ð × item Ò ØÓ × Ô ÖØ Ð ÓÒ ÙÒØÓº
    position() Ö ØÓÖÒ Ð ÔÓ× ÓÒ Ð Ð Ñ ÒØÓ ØÙ Ð ÒØÖÓ        Ð × ÙÒ º
    Ë ÙÒ Ð ÑÔÐ ÒØ ÓÒ Set<T> Ð Ø Ö ÓÖ ÔÙ           ÒÖ ÕÙ Ö× ÓÒ ÓØÖ × ÔÖ Ñ Ø Ú ×º
ÈÓ× Ð Ñ ÒØ Ð Ñ × ÑÔÓÖØ ÒØ        ÐÐ × × Ð ÓÔ Ö ÓÖ       ×Ó []¸ Ð Ù Ð Ö ØÓÖÒ ÙÒ
 Ð Ñ ÒØÓ Ð ÓÒ ÙÒØÓ × ÙÒ ×Ù ÔÓ× ÓÒ ÒØÖÓ Ð × Ù Ò º
    ÄÓ× Ø Ö ÓÖ × ÔÙ Ò Ù× Ö× Ò Ö Ñ ÒØ × Ö¸ ÔÙ Ò                  Ö ÔÖÓ Ö Ñ × ÕÙ
Ö Ò Ø Ö ÓÖ × × Ò Ø Ò Ö ÓÒÓ Ñ ÒØÓ Ð Ø ÔÓ ÓÒ ÙÒØÓ ×Ó Ö Ð Ù Ð Ø Ö Òº È Ö
 ר × × ØÙ ÓÒ ×¸ ÔÙ × Ö × Ð Ø Ò Ö Ð Ø ÔÓ Ð ÓÒ ÙÒØÓ Ý Ð ×Ù× Ð Ñ ÒØÓ׺
È Ö ÐÐÓ¸ × ÜÔÓÖØ Ò ÐÓ× × ÒÓÒ ÑÓ× Ø ÔÓ Set Type Ý Item Type¸ Ö ×Ô Ø Ú Ñ ÒØ º
Set Type ÔÖÓÔÓÖ ÓÒ Ð Ø ÔÓ     ÓÒ ÙÒØÓ ÓÒ ÕÙ ÒÓÖÑ ÐÑ ÒØ × ÓÒרÖÙÝ Ð Ø Ö ÓÖ¸
Ñ ÒØÖ × ÕÙ Item Type Ð Ø ÔÓ ÕÙ Ö ØÓÖÒ get current())º

2.4     Listas Enlazadas
ÍÒ Ð ×Ø × ÙÒ × Ù Ò          ÐÓÒ ØÙ Ú Ö Ð                < t1, t2, t3, . . . , tn >   n   Ð Ñ ÒØÓ×
 Ð ÙÒ Ø ÔÓ T ÓÒ Ð × × Ù ÒØ × ÔÖÓÔ   ×
Restricci´n de acceso:
         o

       ½º Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ¸ t1¸ ×                     Ö Ø Ñ ÒØ Ò Ø ÑÔÓ ÓÒר ÒØ º
       ¾º È Ö                Ö Ð Ð Ñ ÒØÓ Ti¸ × Ò × Ö Ó           Ö × Ù Ò ÐÑ ÒØ ÐÓ× i − 1
          ÔÖ Ú Ó× Ð Ñ ÒØÓ× < t1, t2, t3, . . . , ti−1 >º
      ר Ö ×ØÖ ÓÒ × ÑÔÓÒ ×Ó Ö ØÓ × Ð × ÓÔ Ö ÓÒ × ÕÙ Ö ÕÙ Ö Ò                           Ö
      Ù ÐÕÙ Ö ÔÓ× ÓÒ Ð × Ù Ò º Ò ÓÒ× Ù Ò ¸ Ð Ø ÑÔÓ                            Ù ÓÒ Ò Ð
         ×Ó¸ Ò× Ö ÓÒ Ý Ð Ñ Ò ÓÒ × Ô Ò ÒØ Ð ÔÓ× ÓÒ ÒØÖÓ Ð Ð ×Ø º
Flexibilidad: Ë ×             ÓÒÓ Ð Ö ÓÒ               ÙÒ Ð Ñ ÒØÓ ti ÒØÖÓ    Ð × ÙÒ
     < t1, t2, . . . , ti, ti+1, . . . , tn >¸ ÒØÓÒ ×

        ½º     ÔÙ
             ti+1    Ð Ñ Ò Ö× Ò Ø ÑÔÓ ÓÒר ÒØ º Ð ×Ø Ó ×ÔÙ ×  ר Ð Ñ ¹
           Ò ÓÒ × < t1, t2, . . . , ti, . . . , tn >º
        ¾º ÍÒ Ð Ñ ÒØÓ Ù ÐÕÙ Ö tj ÔÙ Ò× ÖØ Ö× ×ÔÙ × ti Ò Ø ÑÔÓ ÓÒר ÒØ º
            Ð ×Ø Ó ¬Ò Ð ×ÔÙ × Ð Ò× Ö ÓÒ ×
                               < t1, t2, . . . , ti−1, ti, tj, ti+1, . . . , tn >

Espacio proporcional al tama˜o:
                            n         Ð ×Ô Ó Ó ÙÔ Ó ÔÓÖ ÐÓ× Ð Ñ ÒØÓ× Ð Ð ×Ø
       × ÑÔÖ × ÔÖÓÔÓÖ ÓÒ Ð Ð ÒÙÑ ÖÓ        Ð Ñ ÒØÓ× × Ö¸ ÔÙ      ÜÔÖ × Ö× ÓÑÓ
       ÙÒ ÙÒ ÓÒ f(n) = k × nº
     Ä × Ð ×Ø × ×ÓÒ ÓÒ × Ô Ö ÔÐ ÓÒ × ÓÒ¸ Ó Ð ÙÒ × ¸ Ð × × Ù ÒØ × Ö Ø Ö ×Ø ×
     ¯ Ë Ö ÕÙ Ö Ò Ú Ö Ó× ÓÒ ÙÒØÓ× ´ÕÙ Þ ÑÙ Ó×µ Ý ×Ù ÒØ     × Ú Ö Ð ÐÓ Ð Ö Ó
       Ð ÔÐ ÓÒº
2.4. Listas Enlazadas                                                            65



   ¯  Ä× Ö ÒÐ            × ÐÓ× ÓÒ ÙÒØÓ× ×ÓÒ × ÓÒÓ × Ý ÑÙÝ Ú Ö Ð × Ò Ð Ø ÑÔÓ
         Ú        Ð ÔÐ ÓÒº
    ¯ Ð ÔÖÓ × Ñ ÒØÓ × × Ù Ò Ð ×               Ö¸ Ð ÔÖÓ × Ñ ÒØÓ Ð i¹ × ÑÓ Ð Ñ ÒØÓ ×
      Ö Ð Þ ×ÔÙ × ÔÖÓ × Ö ÐÓ× (i − 1) Ð Ñ ÒØÓ× ÔÖ Ú Ó׺
    Ä ×Ø × ÓÒ Ð × Ö Ø Ö ×Ø × × Ò Ð × ÓÖÑ Ò Ô ÖØ ÐÓ× Ð Ò Ù × ÔÖÓ Ö Ñ ÓÒ
 ÙÒ ÓÒ Ð ×¸ LISP¸ ML¸ CAML¸ ÔÓÖ ÑÔÐÓ× Ý ÐÓ× ÑÓ ÖÒÓ× Ý ÔÓØ ÒØ × Ð Ò Ù ×
 × Ö ÔØ Ò Ò Ð × Ó ÙÖÖ Ò × Ñ × ÔÓÔÙÐ Ö ×¸ perl Ý pythonº Ä Ò Ù × Ñ ÒÓ Ò Ú Ð¸
Ø Ð × ÓÑÓ Pascal¸ C Ó C++¸ ÒÓ ÔÓ× Ò Ð ×Ø × ÓÑÓ Ô ÖØ Ð Ð Ò Ù ¸ Ö ÞÓÒ ÔÓÖ Ð Ù Ð
 × ÓÒÚ Ò ÒØ ÑÔÐ ÒØ ÖÐ × Ò Ö Ð Ý Ò Ö Ñ ÒØ Ò Ð ÓØ º
      Ð × Ð ×Ø × × Ð × Ø Ð      ÒÐ Þ × ÔÓÖÕÙ ¸          ÖÒ     Ð ÖÖ ÐÓ¸      Ð Ñ ÒØÓ
   Ð × Ù Ò Ö × Ò ÙÒ Ö ÓÒ Ñ ÑÓÖ ÕÙ ÒÓ × ÓÒØ Ù º È Ö ÓÒÓ Ö Ù Ð
 × Ð × Ù ÒØ Ð Ñ ÒØÓ Ð × Ù Ò ¸ × Ò × Ö Ó ÙÒ ÒÐ                    Ð ÐÓÕÙ     Ñ ÑÓÖ
ÕÙ ÐÓ Ð Ö º Ä ¬ ÙÖ ¾º ÑÙ ×ØÖ Ð Ð × Ö ÔÖ × ÒØ ÓÒ Ô ØÓÖ                   ÙÒ Ð ×Ø × Ñ¹
ÔÐ Ñ ÒØ ÒÐ Þ          ÙÝÓ× Ð Ñ ÒØÓ× ×ÓÒ Ð × Ð ØÖ × × Ð       ר Ð º
head
           A               B               C               D               E




                        ÙÖ ¾º ÍÒ Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ

          Ð Ñ ÒØÓ Ð × Ù Ò × Ö ÔÖ × ÒØ Ñ ÒØ ÙÒ               Ú     Ò Ó×
  ÑÔÓ× Ð Ð Ñ ÒØÓ Ð × Ù Ò Ý Ð ÔÙÒØ ÓÖ Ð ÔÖÓÜ Ñ              º ÍÒ      ×
  ÒÓÑ Ò ÒÓ Ó º
    Ð ÔÙÒØÓ ÒØÖ         ÙÒ Ð ×Ø × Ð Ö ÓÒ Ð ÔÖ Ñ Ö ÒÓ Ó¸ ÒÓÑ Ò Ó head Ò
Ð ¬ ÙÖ ¾º º
    Ò C Ó C++¸ ÙÒ ÒÓ Ó ÔÙ     ×Ô ¬ Ö× ÓÑÓ × Ù
   ¬Ò ÓÒ ÒÓ Ó × ÑÔÐ ≡
 struct Node
 {
   char   data;
   Node * next;
 };
  ר × Ð Ø Ô       Ð Ö ÓÒ ÙÒ ÒÓ Ó Ô ÖØ Ò ÒØ ÙÒ Ð ×Ø ÒÐ Þ º data ÐÑ Ò
Ð Ð ØÖ Ý next × Ð ÔÙÒØ ÖÓ Ð ÔÖÓÜ ÑÓ Ð Ñ ÒØÓº ÈÙ ×ØÓ ÕÙ ÙÒ Node × Ö ¬ Ö × Ñ ×ÑÓ
  ØÖ Ú × next¸ Ð × Ð ×Ø × ÒÐ Þ × Ò × Ó Ð × ¬ ×           רÖÙ ØÙÖ × Ö ÙÖÖ ÒØ × º
    Ä Ð ×Ø Ð ¬ ÙÖ ¾º × Ø ÓÖ Þ ÓÑÓ × ÑÔÐ Ñ ÒØ ÒÐ Þ                 ÔÓÖÕÙ ×Ù× ÒÓ Ó×
ÔÓ× Ò ÙÒ ×ÓÐÓ ÒÐ          Ð × Ù ÒØ ÒÓ Ó Ò Ð × Ù Ò º Ò ØÖ Ñ ÒØÓ ÙÒ ÔÓÕÙ ØÓ
Ñ × Ñ ÑÓÖ ¸ × ÔÓ× Ð ÙØ Ð Þ Ö ÙÒ ÒÐ             ÓÒ Ð Ð Ð Ñ ÒØÓ ÔÖ      ×ÓÖº Ò ×Ø
   ×Ó Ð Ð ×Ø × Ø ÓÖ Þ ÓÑÓ Ó Ð Ñ ÒØ ÒÐ Þ              Ý × Ö ÔÖ × ÒØ Ô ØÓÖ Ñ ÒØ
 ÓÑÓ Ò Ð ¬ ÙÖ ¾º º            ØÓ× Ñ Ò Ö Ð ÓØÖÓ ÜØÖ ÑÓ¸ × Ö ÕÙ Ö ÙÒ ÔÙÒØ ÖÓ
     ÓÒ Ð Ð ÙÐØ ÑÓ Ð Ñ ÒØÓ Ð Ð ×Ø º
      Ð Ó×ØÓ Ò ×Ô Ó ÙÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ × Ö ÓÑÔ Ò× ÓÒ Ö × ÓÒ ×Ù
Ú Ö× Ø Ð º       Ó ÙÒ Ð Ñ ÒØÓ Ô ÖØ Ò ÒØ Ð Ð ×Ø ¸ Ð × ÓÔ Ö ÓÒ × ÔÙ Ò Ö Ö Ö Ð
66                                                       Cap´
                                                            ıtulo 2. Secuencias



first                                                              last

           A              B               C               D                   E




                        ÙÖ ¾º ÍÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ

 Ð Ñ ÒØÓ ÔÖ      ×ÓÖ Ó Ð ×Ù ×ÓÖº ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð Ð ×Ø ÔÙ Ö ÓÖÖ Ö× Ò ÐÓ× Ó×
× ÒØ Ó׸ ÞÕÙ Ö            Ö    Ó Ú Ú Ö× º
    ÉÙ Þ Ð Ö Ò Ú ÖØÙ        ÙÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ        ×Ð Ô             ÙØÓ¹
 Ð Ñ Ò ÓÒ º Ù ÐÕÙ Ö ÒÓ Ó ÔÓ× ØÓ Ó Ð ÓÒØ ÜØÓ Ò × Ö Ó ´ÔÖ          ×ÓÖ Ý ×Ù ×ÓÖµ
Ô Ö Ð Ñ ×ÑÓ Ð Ñ Ò Ö× Ð Ð ×Ø º
     Ò Ð ¬ ÙÖ ¾º × Ù× Ò Ó× ÔÙÒØÓ×         ÒØÖ   ÙÒÓ ÔÓÖ     ÜØÖ ÑÓº × ÔÓ× Ð
Ý Ñ × Ú Ö× Ø Ð × × ÖÖ Ò ÐÓ× ÒÐ × Ý ×          Ð Ð ×Ø Ö ÙÐ Ö Ø Ð ÓÑÓ ÐÓ ÐÙרÖ
Ð ¬ ÙÖ ¾º º Ò ×Ø ×Ó¸ ר ÓÒ Ñ ÒØ Ò Ö ÙÒ ÔÙÒØ ÖÓ Ð ÔÖ Ñ Ö ÒÓ Ó Ð Ð ×Ø Ô Ö
Ø Ò Ö ×Ó ×Ù ÓØÖÓ ÜØÖ ÑÓº
 first
            A             B              C               D                E




                    ÙÖ ¾º ÍÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ           Ö ÙÐ Ö

     Ò Ò     ÙÖ ¸ Ø Ð ÓÑÓ ÐÓ ×ØÙ Ö ÑÓ× ÔÓר Ö ÓÖÑ ÒØ ¸ × × ÓÐÓ ÓÑÓ      Ö ÙÒ
ÒÓ Ó      ÓÒ Ð¸ Ð Ù Ð ÒÓ ÓÖÑ Ô ÖØ ÐÓ      Ð × Ù Ò ¸ ÒØÓÒ × × Ò Ò Ð Ò Ð
   ­Ù Ó¸ ÔÙ × ÒÓ Ý ÕÙ ÓÒ× Ö Ö ÐÓ× ×Ó× Ô ÖØ ÙÐ Ö × Ù Ò Ó Ð Ð ×Ø ר Ó Ú Ò
Ú º
   Ä ×Ø Ò ×          Ö ÙÐ Ö   Ý ÒÓ Ó        Ö Ø Ñ Ò ÔÙ Ò ÔÐ Ö× Ð ×Ø × × Ñ¹
ÔÐ Ñ ÒØ ÒÐ Þ × ÙÒÕÙ Ð Ò Ò Ò Ú Ö× Ø Ð                ÒÓ × Ø Ò ÒÓØ Ð ÓÑÓ ÓÒ Ð ×
 Ó Ð Ñ ÒØ ÒÐ Þ ×º
2.4.1    Listas enlazadas y el principio fin a fin
Ä × ÓÔ Ö ÓÒ × ×Ó Ö Ð ×Ø × ÒÐ Þ × ÔÙ Ò × Ô Ö Ö× Ò ÐÓ× Ò Ú Ð × Ö ÖÕÙ Ó׸ × ÙÒ
 Ð Ø ÔÓ ÓÔ Ö ÓÒ ×¸ ÐÙ×ØÖ Ó× Ò Ð Ö Ñ ÍÅÄ Ð × Ð × × ÕÙ Ñ Ò ÔÙÐ Ò Ð ×Ø ×
 Ò ALEPHº
      Ò Ð ÔÖ Ñ Ö Ò Ú Ð Ð ¬Ò × Ð Ñ Ò Ó      ÔÙÒØ ÓÖ ×º ËÓÐÓ ÒÓ× ÓÒ ÖÒ Ò Ð × ÓÔ Ö ¹
  ÓÒ ×     ÒÐ       ÙÒ ÒÓ Ó ÓÒ ÓØÖÓ × Ò ÓÒ× Ö Ö¸ Ò Ð Ö ×ØÓ ÐÓ× ÒÓ Ó׸ Ò Ð Ø ÔÓ
      ØÓ ÕÙ ×ØÓ× ÓÒØ Ò Òº Ò ×Ø Ò Ú Ð × Ò Ù ÒØÖ Ò Ð × Ð × × Slink Ý Dlink¸ Ð
 Ù Ð × ÑÓ Ð Þ Ò ÒÐ × ÒÓ Ó× Ð ×Ø × × ÑÔÐ Ý Ó Ð Ñ ÒØ ÒÐ Þ ×¸ Ö ×Ô Ø Ú ¹
Ñ ÒØ º Ä × ÓÔ Ö ÓÒ × Ò ×Ø Ò Ú Ð ×ÓÒ ÓÑÔÐ Ø Ñ ÒØ Ò Ô Ò ÒØ × Ð Ø ÔÓ              ØÓ
ÕÙ Ð Ö Ù Ò ÐÓ× ÒÓ Ó× ÐÓ ÕÙ Ð ×          Ò Ö Ð × Ô Ö ØÓ × Ð × Ð × × Ð ×Ø ׺
2.4. Listas Enlazadas                                                               67



         Slink                          Dlink
                                                          1: Manejo de enlaces



                 :T                             :T
         Snode                          Dnode             2: Manejo de tipo
   +get_data(): T                 +get_data(): T




    :T                             :T
    Slist                          Dlist                  3: Manejo de nodos




            :T                             :T
                                                          4: Manejo de memoria
     DynSlist                       DynDlist


                 ÙÖ ¾º   ÖÑ    Ò Ö Ð ÍÅÄ        Ð × Ð × × Ô Ö Ð ×Ø × ÒÐ Þ      ×

       Ò Ð × ÙÒ Ó Ò Ú Ð Ð ¬Ò × Ð Ö Ö ÙÒ ØÓ Ò Ö Ó Ò Ð ÒÓ Ó ÕÙ ÐÙ Ó Ö ×ÙÐØ
 Ò Ð Ø ÔÓ       Ð Ñ ÒØÓ Ð × Ù Ò º Ò ×Ø Ò Ú Ð Ò ÓÒØÖ ÑÓ× Ð × Ð × × Snode<T>
Ý Dnode<T>¸ Ö ×Ô Ø Ú Ñ ÒØ º Ð ¬Ò ר × Ð × × × Ñ Ò Ö ÙÒ ØÓ Ò Ö Ó T × ¹
ÕÙ Ð Ñ ÒØ Ð ÓÔ Ö ÓÒ get data()º ÆÓØ × ÕÙ ÔÓÖ Ö Ò ÔÙ Ð ÙÒ Snode<T>
 × ÙÒ Slink Ý ÙÒ Dnode<T> × ÙÒ Dlinkº
       Ò Ð Ø Ö Ö Ò Ú Ð Ð ¬Ò × Ñ Ò ÔÙÐ Ö Ð ×Ø × ÒÓ Ó׸ × Ò × ÑÔÐ × Ø ÔÓ Slist<T>¸
Ó × Ò Ó Ð × Ø ÔÓ Dlist<T>º ÆÓØ × ÕÙ Ò ×Ø Ò Ú Ð ×             Ð Ð ×Ø × ÒÓ Ó× Ý ÒÓ
    Ð ×Ø ×    Ð Ñ ÒØÓ׺       ÒÓ Ó ÙÒ Ð ×Ø Ö ÕÙ Ö Ô ÖØ Ö ÙÒ ×Ô Ó Ñ ÑÓÖ º
  Ò Ð Ò Ù × ÓÑÓ C++ Ð Ñ Ò Ó Ñ ÑÓÖ × Ð Ó ÔÓÖÕÙ Ý ÕÙ × ÙÖ Ö×
Ð ÖÖ           ÐÓÕÙ ¸ Ò ÒÙ ×ØÖÓ ×Ó¸         ÒÓ Ó¸ ÕÙ Ý × Ó Ô ÖØ Ó ÙÒ Ú Þ ÕÙ ×
   Ø ÖÑ Ò ÕÙ ×Ø Ý ÒÓ × Ù× Ö Ñ ×º Ò Ò ÙÖ ¸ Ý × ØÙ ÓÒ × Ò Ð × Ù Ð × ÒÓ
 × Ò × Ö Ó Ô ÖØ Ö Ó Ð Ö Ö Ñ ÑÓÖ º ÇØÖ Ú ÒØ               ר Ò ÓÕÙ × ÕÙ ÔÓ ÑÓ×
 Ð Ñ Ò Ö ÙÒ ÒÓ Ó ÙÒ ÓÒ ÙÒØÓ Ò× ÖØ ÖÐÓ Ò ÓØÖÓ × Ò Ò ×                 Ð Ö Ö Ý ÐÙ Ó
 Ô ÖØ Ö Ñ ÑÓÖ º Ò Ú ÖØÙ           ר × Ö ÞÓÒ ×¸ Ð Ñ Ò Ó ÔÓÖ ÒÓ Ó× Ô ÖÑ Ø ×Ô ¬ Ö
ÓÔ Ö ÓÒ × ×Ó Ö Ð ×Ø × × Ò ÓÒ× Ö Ö Ð Ñ Ò Ó Ð Ñ ÑÓÖ º
       Ò ÐÑ ÒØ ¸ Ð ÙÐØ ÑÓ Ò Ú Ð ÓÖÖ ×ÔÓÒ Ð ÓÒ ÔØÓ ØÖ ÓÒ Ð Ð ×Ø Ò Ð Ù Ð ØÓ Ó
 ר Ö ×Ù ÐØÓ Ò ÐÙ Ó Ð Ñ Ò Ó Ñ ÑÓÖ º Ò ×Ø × ÒØ Ó¸ × ÜÔÓÖØ Ò Ð × Ð × ×
DynSlist<T> Ý DynDlist<T>¸ Ð Ù Ð × ÑÓ Ð Þ Ò Ð ×Ø × ÑÔÐ ÒØ         × Ñ ÒØ ÒÐ ×
× ÑÔÐ × Ý Ó Ð ×¸ Ö ×Ô Ø Ú Ñ ÒØ
2.4.2    El TAD Slink (enlace simple)
  Ð Ì Slink¸ ¬Ò Ó Ò Ð Ö ÚÓ ×Ð Ò ºÀ                   ¸ Ö ÔÖ × ÒØ ÙÒ ÒÐ      × ÑÔÐ   ÙÒ
Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ    Ö ÙÐ Ö ÓÒ ÒÓ Ó                Öº
     ×Ð Ò ºÀ   ÜÔÓÖØ Ð Ð × Slink
 ×Ð Ò ºÀ ≡
 class Slink
68                                                              Cap´
                                                                   ıtulo 2. Secuencias



  {
       Ñ Ñ ÖÓ× ÔÖÓØ Ó×          Slink
       Ñ Ñ ÖÓ× ÔÙ Ð Ó×        Slink
  };
      ÙÒ ÓÒ      ÓÒÚ Ö× ÓÒ     Slink    Ð× ½
  ¬Ò ×
  Slink¸   Ù×   Ò ÙÒ × ¸ ¸ ½¸ ¾¸ Ò        º
    Ç ØÓ× ÕÙ      Ò ÒÐ Þ Ö× Ò ÙÒ Ð ×Ø × ÑÔÐ Ò Ø Ò Ö ÙÒ Slink ÓÑÓ ØÖ ÙØÓ
Ó × Ö Slink ÔÓÖ Ö Ò ÔÙ Ð º Ä ¬ ÙÖ ¾º ÑÙ ×ØÖ ÙÒ Ð ×Ø        Ù ØÖÓ Ð Ñ ÒØÓ×
 ÑÔÐ ÒØ Ñ ÒØ Slinkº




                             ÙÖ ¾º Ä ×Ø ÒÐ Þ   × ÑÔÐ ÓÒ Slink

    À Ý ÙÒ    Ö Ò ÒÑ Ø Ñ ÒØ ÔÖ                 Ð ÓÒ Ð ¬ ÙÖ ¾º        Ð ÞÓ ÔÙÒØ Ð
Ð ÞÓ Ð × Ù ÒØ ÒÓ Ó Ý ÒÓ Ð ÒÓ Óº ×ØÓ ÔÐ ÒØ        ÙÒ    Ö Ò ×Ù ×Ø Ò Ð ÓÒ Ð × Ð ×Ø ×
 ÒÐ Þ × ØÖ ÓÒ Ð × ÓÒ Ð ÔÙÒØ ÓÖ Ö                 ÓÒ Ð Ö ×ØÖÓ ÓÑÔÐ ØÓº
    Slink Ø Ò ÙÒ ×ÓÐÓ Ñ Ñ ÖÓ ØÓ Ý ÔÖÓØ         Ó
 Ñ Ñ ÖÓ× ÔÖÓØ Ó× Slink ≡                                                ´ µ
  protected:
    Slink* next;
Í× × Slink º
Ä ÔÖÓØ ÓÒ Ô ÖÑ Ø ÕÙ ÙÒ Ð × Ö Ú                   Slink   ÙØ Ð       Ö Ø Ñ ÒØ Ð Ñ Ñ¹
 ÖÓ ØÓ nextº
    Ð Ì Slink × Ø Ò × ÑÔÐ ¸ ÕÙ ÑÙ Ó×           ×Ù× Ñ ØÓ Ó× ÓÒÐÐ Ú Ò ÙÒ ×ÓÐ Ð Ò
 Ñ Ñ ÖÓ× ÔÙ Ð Ó× Slink ≡                                          ´ µ
  Slink() : next(this) { /* Empty */ }
  Slink(const Slink &)
  {
    next = this;
  }
  Slink & operator = (const Slink & link)
  {
    next = this;
  }
  void reset()
  {
    next = this;
  }
  bool is_empty() const
  {
    return next == this;
2.4. Listas Enlazadas                                                           69



  }
Í× × Slink º
     Ð ÓÒרÖÙ ØÓÖ Slink() Ö ÙÒ Ð ÞÓ × ÑÔÐ ÔÙÒØ Ò Ó × Ñ ×ÑÓº Ä ÓÔ        ÙÒ
Slink  ×ÓÐÓ × Ô ÖÑ Ø × Ð Ð ÞÓ ÒÓ ×Ø Ò ÐÙ Ó ÒØÖÓ     Ð ÙÒ Ð ×Ø ÙÒ Slink ×ÓÐÓ
ÔÙ      ÓÔ Ö× × ×Ø ר Ú Óº
   is empty() Ö ØÓÖÒ Ú Ö    ÖÓ × Ð next ÔÙÒØ × Ñ ×ÑÓº Ä          ר Ñ ØÓ Ó
 × ÒÚÓ ÖÐÓ × ÙÒ ÒÓ Ó          Öº
   get next() Ö ØÓÖÒ Ð × Ù ÒØ Ð ÞÓ Ø Ó thisº
   Ä Ò× Ö ÓÒ × Ö ×Ô ØÓ Ð ×Ù ×ÓÖ Ý × ÓÑÓ × Ù
 Ñ Ñ ÖÓ× ÔÙ Ð Ó× Slink +≡                         ´ µ
  void insert_next(Slink * p)
  {
    p->next = next;
    next = p;
  }
Í× × Slink º
insert next()Ò× ÖØ Ð Ð ÞÓ p ×ÔÙ × thisº
   Ð Ñ ×ÑÓ ÑÓ Ó¸ Ð Ð Ñ Ò ÓÒ Ø Ò Ð × Ù ÒØ Ð Ñ ÒØÓ Ý Ø Ñ Ò × ÑÙÝ × Ò ÐÐ
Ñ Ñ ÖÓ× ÔÙ Ð Ó× Slink +≡                            ´ µ
  Slink * remove_next()
  {
    Slink * ret_val = next;
    next = ret_val->next;
    ret_val->reset();
    return ret_val;
  }
Í× × Slink º
remove next() ×ÙÔÖ Ñ
                   Ð × Ù ÒØ Ð Ñ ÒØÓ Ö ×Ô ØÓ this Ý Ö ØÓÖÒ Ð Ð ÞÓ Ð Ñ Ò Óº
   ËÙÔÓÒ ÑÓ× ÕÙ × ÑÓ× ÒÐ Þ Ö Ó ØÓ× Ø ÔÓ Window Ò ÙÒ Ð ×Ø × ÑÔÐ Ñ ÒØ Ò¹
Ð Þ º À Ý Ó× ÓÖÑ ×      ÖÐÓº Ä ÔÖ Ñ Ö × ÔÓÖ Ö Ú ÓÒ
         class Window : public slink
         {
                 ...
         };

     Ò ×Ø ×Ó ÔÓ ÑÓ× Ò× ÖØ Ö Ö Ø Ñ ÒØ Òר Ò ×             Window     ×ÔÙ ×   ÙÒ ÒÓ Ó
Ô ÖØ ÙÐ Ö first
         Window * window_ptr = new Window (...);
         ...
         first->insert_next(window_ptr);

     ×ØÓ × ÔÓ× Ð ÔÓÖÕÙ Window ׸ ÔÓÖ Ö Ú ÓÒ¸ Ø ÔÓ Slinkº ÈÙ ×ØÓ ÕÙ Ð ×
ÓÔ Ö ÓÒ × Ð Ð × Slink ×ÓÒ Ò ÙÒ ÓÒ Slink½½ ¸ ÔÙ × Ö Ò × Ö Ó ØÙ Ö ÙÒ
 ÓÒÚ Ö× ÓÒº ÈÓÖ ÑÔÐÓ
         window_ptr = static_cast<Window*>(first->remove_next());
 ½½
      Ê ÙÒ Ò    Ö   º
70                                                       Cap´
                                                            ıtulo 2. Secuencias



     ÓÑÓ first->remove next() Ö ØÓÖÒ ÙÒ Slink¸ Ð ÓÒÚ Ö× ÓÒ ÐÓ ÑÓ ¬ Ô Ö ÕÙ ×
ØÖ Ø ÓÑÓ Ø ÔÓ Window¸ Ð Ù Ð × Ð ×Ó ÔÓÖ Ö Ú ÓÒº
    Ä × ÙÒ ÓÖÑ Ô Ö ÒÐ Þ Ö Ð × × × ÔÓÖ ÓÐÓ ÓÒ ÙÒ Slink ÓÑÓ ØÖ ÙØÓ
     Window

         class Window
         {
                 ...
           Slink link;
         };

    Ë first ÔÙÒØ Ð ÔÖ Ñ Ö ÒÓ Ó ÙÒ Ð ×Ø ¸ ÒØÓÒ × ÙÒ Òר Ò           window ptr
Ø ÔÓ Window ÔÙ Ò× ÖØ Ö× ×ÔÙ × first Ð × Ù ÒØ ÑÓ Ó
         first->insert_next(&window_ptr->link);

    Ð Ò ÓÕÙ ÒØ Ö ÓÖ Ø Ò Ð Ú ÒØ     ÕÙ       ÔÓ× Ð ÒÐ Þ Ö Ó ØÓ× Ú Ö × Ð ×Ø ×
Ó × ¸ ÙÒ Ó ØÓ ÔÙ × Ö Ô ÖØ Ú Ö × Ð ×Ø ׺ È Ö ÐÐÓ¸ × ÑÔÐ Ñ ÒØ      ÑÓ× Ð Ö Ö
 ÓÑÓ ØÖ ÙØÓ× Ø ÒØÓ× Slink ÓÑÓ Ð ÒØ       Ð ×Ø × Ð × Ù Ð × Ô ÖØ Ò Ö Ð Ó ØÓº
  Ð ÑÔÐÓ ÒØ Ö ÓÖ¸ ÔÙ ÑÙÐØ ÔÐ Ö× Ð × Ù ÒØ ÓÖÑ
         class Window
         {
                 ...
           Slink link_1;
           Slink link_2;
                 ...
           Slink link_n;
         };
         ...
         first->insert_next(&window_ptr->link_1);
         first->insert_next(&window_ptr->link_2);
         ...
         first->insert_next(&window_ptr->link_n);

   ÓÒ ×Ø Ø Ò ÒÓ × ÔÓ× Ð Ö Ð Þ Ö ÙÒ ÓÒÚ Ö× ÓÒ ÔÓÖ ÓÑÔ Ð ÓÖ¸ ÔÙ × Ù ÐÕÙ Ö
ØÖ ÙØÓ Ø ÔÓ Slink ÒÓ × Ð ÔÖÓÔ Ð × Window¸ × ÒÓ Ô ÖØ       ÐÐ º È Ö Ó Ø Ò Ö Ð
 Ö ÓÒ ÓÖÖ Ø Ô ÖØ Ö ÙÒ Slink ×ÓÒ Ò × Ö Ó× Ð ÙÒÓ× Ð ÙÐÓ× Ò Ö ØÑ Ø
ÔÙÒØ ÓÖ ×º ÈÙ ×ØÓ ÕÙ Ø Ð × Ð ÙÐÓ× ×ÓÒ ÑÙÝ ×Ù× ÔØ Ð × ÖÖÓÖ¸ × ×Ø ÒØ × Ð
Ò Ô×ÙÐ ÖÐÓ× Ò ÙÒ ÔÖ Ñ Ø Ú Ð × Ù ÒØ ÓÖÑ
static Window * link_to_window(Slink *& link)
{
  Window * ptr_zero     = 0;
  size_t offset_link    = reinterpret_cast<char*>(&(ptr_zero->link));
  char * address_result = reinterpret_cast<char*>(link) - offset_link;
  return static_cast<Window *>(address_result);
}

  ÆÓ Ø Ò ÑÓ× ÓÖÑ      ÓÒÓ Ö ÐÓ× ÒÓÑ Ö × ÐÓ× ØÖ ÙØÓ× Slink Ò ×Ù ÒØ º ÆÓ
ÔÓ ÑÓ׸ Ô٠׸ Ó Ö Ö ÙÒ ÖÙØ Ò Ò Ö ÕÙ ÒÓ× ÓÒÚ ÖØ ÙÒ Slink Ð Ð × ÕÙ
2.4. Listas Enlazadas                                                            71



     ÓÒØ Ò Ð Slink¸ Ô ÖÓ × ÔÓ ÑÓ× Ó Ö Ö ÙÒ Ñ ÖÓ ÕÙ ÔÖ Ô Ö Ð Ø ÖÖ ÒÓ
½    ÙÒ ÓÒ ÓÒÚ Ö× ÓÒ Slink Ð × ½ ≡                             ´ µ
      # define SLINK_TO_TYPE(type_name, link_name) 
      static type_name * slink_to_type(Slink * link) 
      { 
        type_name * ptr_zero = 0; 
        size_t offset_link   = reinterpret_cast<size_t>(&(ptr_zero->link_name)); 
        char * address_type = reinterpret_cast<char*>(link) - offset_link; 
        return reinterpret_cast<type_name *>(address_type); 
      }
      ¬Ò ×
      SLINK TO TYPE¸    Ò Ú Ö Ù× º
    Í× × Slink º
       Ð Ñ ÖÓ Ø Ò Ó× Ô Ö Ñ ØÖÓ׺ type name × Ð ÒÓÑ Ö     Ð Ð × ÕÙ Ð Ö ÙÒ
    Slinkº link name × Ð ÒÓÑ Ö     ÙÒ ØÖ ÙØÓ Ø ÔÓ Slink ÓÒØ Ò Ó ÒØÖÓ Ð
     Ð × type nameº
        Å ÒØ Ð Ñ ÖÓ SLINK TO TYPE¸ Ð Ù×Ù Ö Ó ×ÔÓÒ      ÙÒ ÑÔÐ ÒØ ÓÒ   ÓÒ¹
    Ú Ö× ÓÒ Slink ×Ù Ð × º Ð Ñ ÖÓ ×           Ò ÐÙ Ö ÒØÖÓ Ð Ð × ÕÙ ÙØ Ð
     Ð Slinkº ÈÓÖ ÑÔÐÓ¸ Ô Ö Ð Ð × Window
              class Window
              {
                /* ... */
              SLINK_TO_TYPE(Window, link);
              };

       Ë    Ò Ö ÙÒ Ñ Ñ ÖÓ ×Ø Ø Ó ÕÙ     ØÙ Ð Ñ ×ÑÓ ØÖ Ó ÕÙ ÙÒ ÓÒ         ÓÒ¹
    Ú Ö× ÓÒ    Slink  Ð× ½ º
       Ë Ò Ð Ñ ÖÓ × Ð Ó ÓÑÔÐ Ó¸ ר × Ò Ô Ò ÒØ                Ð ÔÓ× ÓÒ Slink
     Ò Windowº Ä ×ØÖÙ ØÙÖ Ð Ñ Ñ ÖÓ ×Ø Ø Ó × Ð Ñ ×Ñ Ô Ö ØÓ Ð × ÕÙ Ù× ÙÒ
    Slink ×ÓÐÓ Ý ÕÙ    Ñ Ö Window Ý link ÔÓÖ ÐÓ× ÒÓÑ Ö × ÕÙ Ð Ð ÒØ × Ó º

    2.4.3     El TAD Snode<T> (nodo simple)
    Snode<T>    × ÙÒ Ð × Ô Ö Ñ ØÖ Þ ÕÙ ×ØÖ ÙÒ ÒÓ Ó Ô ÖØ Ò ÒØ ÙÒ Ð ×Ø
    × ÑÔÐ Ñ ÒØ ÒÐ Þ     Ö ÙÐ Ö¸ ÓÒ ÒÓ Ó Ö ¸ ÙÝÓ× ØÓ× ×ÓÒ Ø ÔÓ Tº Snode<T>
    × ¬Ò ÑÔÐ ÒØ Ò Ð Ö ÚÓ ØÔÐ ×ÒÓ ºÀ ½ ¸ Ð Ù Ð ÔÓ× Ð × Ù ÒØ רÖÙ ØÙÖ
½    ØÔÐ ×ÒÓ ºÀ ½ ≡
          template <typename T>
      class Snode : public Slink
      {
         Ñ Ñ ÖÓ× ÔÖ Ú Ó× Snode<T>                ¾
         Ñ Ñ ÖÓ× ÔÙ Ð Ó× Snode<T>               ¾
      };
      ¬Ò ×
      Snode¸ Ù×       Ò ÙÒ × ¾¸      ¸ ½½¾ ¸ ½½¿ ¸ ½¾ ¸ Ò ½¿ º
    Í× × Slink    º
       ÈÙ ×ØÓ ÕÙ Snode<T> Ö Ú Slink¸ ר × Ø Ñ Ò ÙÒ Slink Ý Ö ¸ Ü Ô ÓÒ
       Ð ÙÒÓ× Ñ ØÓ Ó× ÕÙ   Ò ×Ó Ö Ö Ö× ¸ Ð Ñ ÝÓÖ Ô ÖØ ÐÓ× Ñ ØÓ Ó× Slinkº
72                                                               Cap´
                                                                        ıtulo 2. Secuencias



      ÍÒ Snode<T> Ø Ò ÙÒ ÙÒ Ó ØÖ ÙØÓ
¾   Ñ Ñ ÖÓ× ÔÖ Ú Ó× Snode<T> ¾ ≡                                                ´½ µ
      T data;
    data  ÓÒØ Ò Ð ØÓ ÐÑ Ò Ó Ò Ð ÒÓ Óº ר                     ØÓ ÔÙ        ÓÒ×ÙÐØ Ö× Ñ      ÒØ Ð
    Ó × ÖÚ ÓÖ
¾    Ñ Ñ ÖÓ× ÔÙ Ð Ó× Snode<T> ¾ ≡                                        ´½ µ ¾
      T& get_data() { return data; }
      À Ý Ó× Ñ Ò Ö ×               ÓÒרÖÙ Ö ÙÒ Snode<T>
¾   Ñ Ñ ÖÓ× ÔÙ Ð Ó×     Snode<T> ¾ +≡                      ´       ½ µ     ¾     ¾
      Snode() { /* empty*/ }
      Snode(const T & _data) : data(_data) { /* empty */ }
    Í× × Snode ½ º
         Ð ÓÒרÖÙ ØÓÖ Ú Ó Ö ÙÒ ÒÓ Ó ÓÒ Ú ÐÓÖ     ØÓ Ò Ø ÖÑ Ò Óº Ð × ÙÒ Ó ÓÒ×¹
    ØÖÙ ØÓÖ Ö ÙÒ ÒÓ Ó ÓÒ Ð Ú ÐÓÖ     ØÓ dataº
         Ð Ñ ØÓ Ó insert next() × Ö       Ö Ø Ñ ÒØ      Slink ÐÓ ÕÙ × Ô ÖÑ × Ð
    ÔÓÖÕÙ ÙÒ Snode<T> × Ø Ñ Ò ÙÒ Slinkº
       ÈÓÖ Ð ÓÒØÖ Ö Ó¸     ÑÓ× ×Ó Ö Ö Ö remove next()¸ ÔÙ × ×Ø Ö ØÓÖÒ ÙÒ Slink Ý
    Ö ÕÙ Ö ÑÓ× ÕÙ × Ö ØÓÖÒ ÙÒ Snode<T>
¾    Ñ Ñ ÖÓ× ÔÙ Ð Ó× Snode<T> ¾ +≡                     ´½ µ ¾ ¾
      Snode * remove_next() { return static_cast<Snode*>(Slink::remove_next()); }
    Í× × Slink       Ò   Snode   ½ º
      Ä Ñ ×Ñ ×Ó Ö Ö        Ö Ð Þ Ö× Ô Ö              get next()
¾   Ñ Ñ ÖÓ× ÔÙ Ð Ó× Snode<T> ¾ +≡                                        ´½ µ        ¾
      Snode * get_next() const { return static_cast<Snode*>(Slink::get_next()); }
    Í× × Slink       Ò   Snode   ½ º

    2.4.4    El TAD Slist<T> (lista simplemente enlazada)
     Ð Ì Slist<T> ×ØÖ ÙÒ Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ                       Ö ÙÐ Ö ÒÓ Ó× × ÑÔР׸ Ð
    Ù Ð × ¬Ò Ò Ð Ö ÚÓ ØÔÐ ×Ð ×ØºÀ ¾ ¸ Ò Ð Ù Ð ×                   ¬Ò Ð Ð × Ò Ù ×Ø ÓÒ
¾   ØÔÐ ×Ð ×ØºÀ ¾ ≡
          template <typename T>
      class Slist : public Snode<T>
      {
           ¬Ò ÓÒ × Slist<T> ¾
         Ñ ØÓ Ó× ÔÙ Ð Ó× Slist<T>           ¿
         Ø Ö ÓÖ Slist<T> ¿
      };
      ¬Ò ×
      Slist¸ Ù×     Ò ÙÒ × ¿ß º
    Í× × Snode    ½ º
       Ä Ð × Slist<T> ÑÓ Ð Þ ÙÒ Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ                            ÒÓ Ó× × ÑÔÐ × ÕÙ
     ÐÑ Ò Ò ØÓ× Ø ÔÓ T
¾      ¬Ò ÓÒ × Slist<T> ¾ ≡                                                     ´ ¾µ
      typedef Snode<T> Node;
    Í× × Snode ½ º
2.4. Listas Enlazadas                                                          73



     ר    Ð Ö ÓÒ ÜÔÓÖØ Ð Ø ÔÓ Slist<T>::Node × ÒÓÒ ÑÓ Snode<T>º
      Ä ÙÒ Ò× Ö ÓÒ ÔÓ× Ð × Ð ÔÖ Ò Ô Ó Ð Ð ×Ø Ø Ð ÓÑÓ × Ù
¿   Ñ ØÓ Ó× ÔÙ Ð Ó× Slist<T> ¿ ≡                        ´ ¾µ ¿
      void insert_first(Node * node)
      {
        this->insert_next(node);
      }
    insert first() Ò× ÖØ Ð ÒÓ Ó Ð ÔÖ Ò Ô Ó Ð Ð ×Ø × Ö¸ node Ú Ò Ð ÔÖ Ñ Ö
    Ð Ñ ÒØÓ Ð Ð ×Ø º
         Ð Ñ ×ÑÓ ÑÓ Ó¸ Ð ÙÒ ÓÖÑ ×ÙÔÖ Ñ Ö × ÔÓÖ Ð ÔÖ Ò Ô Ó Ð Ð ×Ø
¿   Ñ ØÓ Ó× ÔÙ Ð Ó× Slist<T> ¿ +≡                  ´ ¾µ ¿ ¿
      Node * remove_first() throw(std::exception, std::underflow_error)
      {
        return this->remove_next();
      }
          remove first() Ð Ñ Ò      Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ Ð Ð ×Ø Ý Ö ØÓÖÒ ×Ù Ö ÓÒº
           Ð Ù×Ù Ö Ó Slist<T>      ÔÙ      ÓÒÓ Ö Ð Ö ÓÒ Ð ÔÖ Ñ Ö ÒÓ Ó Ñ ÒØ
¿   Ñ ØÓ Ó× ÔÙ Ð Ó×    Slist<T> ¿ +≡                            ´ ¾µ ¿
      Node * get_first() const Exception_Prototypes(std::underflow_error)
      {
        return this->get_next();
      }
         Ð Ö ×ØÓ ÐÓ× Ð Ñ ÒØÓ× ÔÙ Ò Ö× ØÖ Ú × Ð ÒØ Ö Þ Slist<T>::Node¸
    Ð Ù Ð × Ð Ñ ×Ñ Snode<T>º Ð Ù×Ù Ö Ó ÔÙ    ØÙ Ö Ò× Ö ÓÒ × Ý ×ÙÔÖ × ÓÒ ×
    Ð Ð ×Ø ØÖ Ú × ×Ø Ú º
    2.4.5     Iterador de Slist<T>
    Slist<T>     ÜÔÓÖØ ÙÒ Ø Ö ÓÖ         Ó Ð ×Ù ¹ Ð ×
¿    Ø Ö ÓÖ    Slist<T>      ¿ ≡                                     ´ ¾µ
      class Iterator
      {
           Ñ Ñ ÖÓ× ÔÖ Ú Ó×      Ø Ö ÓÖ      Slist<T>     ¿
           Ñ Ñ ÖÓ× ÔÙ Ð Ó×     Ø Ö ÓÖ      Slist<T>     ¿
      };
             Ð ÙÒ Ñ Ò Ö ¸ Ð Ø Ö ÓÖ  ÔÓ× Ö Ð Ò ÓÖÑ ÓÒ ×Ù¬ ÒØ Ô Ö ÔÓ Ö Ö ÓÖÖ Ö
    Ð Ð ×Ø º Ì Ð Ò ÓÖÑ ÓÒ ×Ø ÓÒר ØÙ ÔÓÖ
¿    Ñ Ñ ÖÓ× ÔÖ Ú Ó× Ø Ö ÓÖ Slist<T> ¿ ≡                    ´¿ µ
      Slist * list;
      Node * current;
    Í× × Slist ¾ º
    list × ÙÒ ÔÙÒØ ÓÖ Ð Ð ×Ø ÒÐ Þ ×Ó Ö Ð Ù Ð × Ø Ö Ý current × Ð Ð Ñ ÒØÓ
     ØÙ Ð Ð Ø Ö ÓÖº
         Ö ×ØÓ¸ Ð Ø Ö ÓÖ × ¬Ò × ÑÔÐ Ñ ÒØ ÓÑÓ × Ù
¿   Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ Slist<T> ¿ ≡                  ´¿ µ
        Iterator(Slist & _list) : list(&_list), current(list->get_first()) { /* Empty */ }
      bool has_current() const { return current != list; }
74                                                          Cap´
                                                               ıtulo 2. Secuencias



  Node * get_current()
  {
    return current;
  }
  void next()
  {
    current = current->get_next();
  }
  void reset_first() { current = list->get_next(); }
Í× × Slist ¾ º
     Ð × Ù ÒØ     ÑÔÐÓ Ú × Ø ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ×   ÙÒ Ð ×Ø
for (typename Slist<int>::Iterator itor(list); itor.has_current(); itor.next())
  // procesar itor.get_current()->get_data();



2.4.6    El TAD DynSlist<T>
  Ð Ì DynSlist<T> ÑÓ Ð Þ ÙÒ Ð ×Ø      Ð Ñ ÒØÓ× Ø ÔÓ T ÙÝÓ Ñ Ò Ó Ñ ÑÓÖ
ÐÓ Ö Ð Þ ÒØ ÖÒ Ñ ÒØ Ð ÔÖÓÔ Ó Ì º ÓÑÓ Ø Ð¸ ר Ì × Ö Ñ × Ð ÓÒ ÔØÓ Ð
    Ð ×Ø ÒÙÒ Ó Ð ÔÖ Ò Ô Ó Ð Ô ØÙÐÓº ËÙ ¬Ò ÓÒ ÑÔÐ ÒØ ÓÒ × Ò Ù ÒØÖ Ò Ò
 Ð Ö ÚÓ ØÔÐ ÝÒËÐ ×ØºÀ ¸ ÙÝ ×ØÖÙ ØÙÖ × Ð × Ù ÒØ
 ØÔÐ ÝÒËÐ ×ØºÀ ≡
      template <typename T>
  class DynSlist : public Slist<T>
  {
     Å Ñ ÖÓ× ÔÖ Ú Ó× DynSlist<T>
     Å Ñ ÖÓ× ÔÙ Ð Ó× DynSlist<T>
  };
  ¬Ò ×
  DynSlist¸ Ù×   Ò ÙÒ    º
Í× × Slist ¾ º
   DynSlist<T> Ö    Ô ÖØ Ð ÒØ Ö Þ ÑÔÐ ÒØ ÓÒ Slist<T>º this ׸ Ò¹
ØÓÒ ×¸ Ð ÒÓ Ó    Ö Ð Ð ×Ø º  ÓÒ ÐÑ ÒØ ¸ DynSlist<T> ÓÒØ Ð Þ Ð ÒØ
   Ð Ñ ÒØÓ× Ð Ð ×Ø
 Å Ñ ÖÓ× ÔÖ Ú Ó× DynSlist<T> ≡                    ´ µ
  size_t num_items;
      ÒØ × Ð Ô Ö ÓÒ Ð Ô ØÖÓÒ Ø Ö ÓÖ ÔÖ × ÒØ Ó Ò Ü ¾º¿¸ Ð × ÒØ Ö × Ð ×
Ð ×Ø × ÒÐ Þ × Ñ Ò     Ò Ð ÓÒ ÔØÓ       ÙÖ×ÓÖ º ÍÒ ÙÖ×ÓÖ ×ØÖ ÙÒ ÔÓ× ÓÒ Ð
Ð ×Ø ÒØÖÓ Ð × Ù Ò Ö ×Ô ØÓ Ð Ù Ð × Ö Ð Þ Ò ×Ù× ÓÔ Ö ÓÒ × ÔÖ Ò Ô Ð ×º ÙÒ
  ÙÖ×ÓÖ × Ð ÐÐ Ñ Ø Ñ Ò ÔÓ× ÓÒ ØÙ Ð º
    È Ö ÐÐ Ú Ö Ð ×Ø Ó Ð ÙÖ×ÓÖ × ÙØ Ð Þ Ò ÐÓ× × Ù ÒØ × ØÖ ÙØÓ×
 Å Ñ ÖÓ× ÔÖ Ú Ó× DynSlist<T> +≡                      ´ µ
  int        current_pos;
  Snode<T> * current_node;
Í× × Snode ½ º
2.4. Listas Enlazadas                                                          75



current pos  × Ð ÓÖ Ò Ð Ð Ð Ñ ÒØÓ ØÙ Ð ÒØÖÓ Ð × Ù Ò º current node × Ð
ÒÓ Ó ÔÖ     ×ÓÖ Ð Ð Ñ ÒØÓ ØÙ к
    ÒØ × ÑÔÐ ÒØ Ö Ð × ÔÖ Ñ Ø Ú × ÔÖ Ò Ô Ð × DynSlist<T>¸ Ö ÕÙ Ö ÑÓ× ÙÒ ÖÙØ Ò
      ×Ó ÔÓÖ ÔÓ× ÓÒ
 Å Ñ ÖÓ× ÔÖ Ú Ó× DynSlist<T> +≡                        ´ µ
  typename Slist<T>::Node * get_previous_to_pos(const int & pos)
  {
    if (pos < current_pos) // hay que retroceder?
      { // Si, reinicie posici´n actual
                              o
        current_pos = 0;
        current_node = this;
      }
    while (current_pos < pos) // avanzar hasta nodo predecesor a pos
      {
        current_node = current_node->get_next();
        ++current_pos;
      }
    return current_node;
  }
Í× × Slist ¾ º
get previous to pos() Ö
                      ØÓÖÒ Ð ÒÓ Ó ÔÖ    ×ÓÖ Ð ÔÓ× ÓÒ pos Ý     current node
ÔÓ× ÓÒ Ó Ò Ó ÔÖ          ×ÓÖº Ä Ñ ÑÓÖ Þ ÓÒ Ð ÔÖ     ×ÓÖ × Ò ×Ô Ò× Ð Ô Ö
ÐÓ× Ð ÓÖ ØÑÓ× Ò× Ö ÓÒ Ý Ð Ñ Ò ÓÒº
   ÄÓ× Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ö ×Ø ÒØ × × ×Ô ¬ Ò ÓÑÓ × Ù
 Å Ñ ÖÓ× ÔÙ Ð Ó× DynSlist<T> ≡                             ´ µ
  T & operator [] (const size_t & i)
  {
    return get_previous_to_pos(i)->get_next()->get_data();
  }
  void insert(const int & pos, const T & data)
  {      // apartar nodo para nuevo elemento
    typename Slist<T>::Node * node = new typename Slist<T>::Node (data);
    typename Slist<T>::Node * prev = get_previous_to_pos(pos); // predecesor
    prev->insert_next(node);
    ++num_items;
  }
  void remove(const int & pos)
  {      // obtener nodo predecesor al nuevo elemento
    typename Slist<T>::Node * prev = get_previous_to_pos(pos);
    typename Slist<T>::Node * node_to_delete = prev->remove_next();
    delete node_to_delete;
    --num_items;
  }
  ~DynSlist()
  {      // eliminar nodo por nodo hasta que la lista devenga vac´a
                                                                 ı
    while (not this->is_empty())
      delete this->remove_first(); // remove_first de la clase base Slink
  }
Í× × DynSlist    ¸ Slink ¸ Ò   Slist   ¾º
76                                                             Cap´
                                                                  ıtulo 2. Secuencias



     DynSlist<T> ÜÔÓÖØ ÙÒ Ø Ö        ÓÖ ÙÝ    ×Ô ¬        ÓÒ × ÑÙÝ × ÑÔÐ     Ð      ÖÐ
 ÖÚ         Slist<T>::Iteratorº

2.4.7    El TAD Dlink (enlace doble)
 Ò Ð Ñ ×ÑÓ ×Ô Ö ØÙ    × ÒÓ ÕÙ Ð Ì Slink¸ Ð Ì Dlink ¬Ò ÙÒ Ó Ð ÒÐ
 ÓÒØ Ò Ó Ò ÙÒ ÒÓ Ó Ô ÖØ Ò ÒØ ÙÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ    Ö ÙÐ Ö ÓÒ ÒÓ Ó
       Öº
    Dlink × ×Ô ¬    ÑÔÐ ÒØ Ò Ð Ö ÚÓ Ð Ò ºÀ ÕÙ × ×ØÖÙ ØÙÖ Ð × Ù ÒØ
ÑÓ Ó
  Ð Ò ºÀ ≡
 class Dlink
 {
       Ñ Ñ ÖÓ× ÔÖÓØ Ó×     Dlink
       Ñ Ñ ÖÓ× ÔÙ Ð Ó×   Dlink
 };
  Ñ ÖÓ× ÓÒÚ Ö× ÓÒ Dlink Ð × ¿
     Ô ÖØ Ö  ר ÑÓÑ ÒØÓ × ÑÙÝ ÑÔÓÖØ ÒØ ÔÙÒØÙ Ð Þ Ö Ý ×Ø Ò Ù Ö ÐÓ× × Ù ÒØ ×
¬Ò ×
  ½º Ð ¬Ò ÙÒ Dlink × ÙÒ Ö ÒÓ Ó                  Ö        ÙÒ Ð ×Ø Ö ÙÐ Ö Ó Ð Ñ ÒØ Ò¹
     Ð Þ º Ò ×Ø × ÒØ Ó¸ Ð × ÓÔ Ö ÓÒ ×               Ð Ð × Dlink Ö ¬ Ö Ò Ð ×Ø × Ó Ð ¹
     Ñ ÒØ ÒÐ Þ ×¸ Ö ÙÐ Ö ×¸ ÙÝÓ ÒÓ Ó                 Ö × thisº
  ¾º Ð ¬Ò ÙÒ Dlink* × ÙÒ Ö ÔÙÒØ ÓÖ                   ÙÒ ÒÓ Ó Ô ÖØ Ò ÒØ ÙÒ Ð ×Ø Ö¹
      ÙÐ Ö Ó Ð Ñ ÒØ ÒÐ Þ º
Dlink ÔÓ×   Ó× ØÖ ÙØÓ× ÔÖÓØ Ó×
 Ñ Ñ ÖÓ× ÔÖÓØ Ó× Dlink ≡                                             ´   µ
 mutable Dlink * prev;
 mutable Dlink * next;
next Ý prev ×ÓÒ ÔÙÒØ ÓÖ × Ð ×Ù ×ÓÖ Ý ÔÖ ×ÓÖ thisº
   ÍÒ ÒÙ ÚÓ Dlink × ÑÔÖ × Ö ÓÒ ×Ù× Ð ÞÓ× ÔÙÒØ Ò Ó × Ñ ×ÑÓ ×                      Ö¸ ÓÑÓ
ÙÒ ÒÓ Ó       Ö ÙÝ Ð ×Ø ר Ú
 Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink ≡                           ´ µ
 Dlink() : prev(this), next(this) { /* empty */ }
   Ú ÒØÙ ÐÑ ÒØ ¸ ÙÒÕÙ Ð            Ó¸ × ÓÒÚ Ò ÒØ ÜÔÓÖØ Ö ÒØ Ö       × Ô Ö ÓÔ × Ý × ¹
Ò ÓÒ ×
 Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink        +≡                           ´   µ
 Dlink(const Dlink &) { reset(); }
 Dlink & operator = (const Dlink & l)
 {
   reset();
   return *this;
 }
2.4. Listas Enlazadas                                                      77



  ÒÖ Ð       Ð × Ó× ÓÔ Ö ÓÒ × ÒÓ ØÙ Ò ÓÔ × ÜÔÓÖØ Ò Ô Ö × Ø × Ö ÓÔ Ö ÓÒ ×
 ÓÒ Ú Ö Ð × Ø ÑÔÓÖ Ð × Ù× × ÔÓÖ Ð ÓÑÔ Ð ÓÖº ÆÓ × ÔÓ× Ð Ö Ð Þ Ö ÓÔ    ר
Ò Ú Ð¸ ÔÓÖÕÙ ÒÓ × Ñ Ò Ò Ò ÙÒ Ñ Ò ×ÑÓ      × Ò ÓÒ Ñ ÑÓÖ Ò × ÓÒÓ Ð
Ø ÔÓ       ØÓ ÕÙ Ð Ö Ò ÐÓ× ÒÓ Ó׺
    ÍÒ Ó Ð ÒÐ ÔÙ          Ö Ò Ö× Ñ ÒØ
 Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink +≡                       ´ µ
 void reset()
 {
   next = prev = this;
 }
reset() Ö Ò   ÙÒ Ð ×Ø      ÕÙ ÔÙÒØ   × Ñ ×ÑÓº ×ØÓ no es equivalente a eliminar
los nodos atados a thisº
    ÙÒÕÙ ÒÓ × ÔÓ× Ð × Ò Ö ×Ó Ö ÙÒ Ð ×Ø ÕÙ ÓÒØ Ò Ð Ñ ÒØÓ׸ × × ÔÓ× Ð
ÒØ Ö Ñ Ö ÐÓ× ÓÒØ Ò Ó×      Ó× Ð ×Ø × Ó Ð Ñ ÒØ ÒÐ Þ × Ò Ø ÑÔÓ ÓÒר ÒØ º ÈÓÖ
ר Ö ÞÓÒ¸ × Ó Ö Ð ÔÖ Ñ Ø Ú swap() ÙÝ ÑÔÐ ÒØ ÓÒ × ÓÑÓ × Ù
Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink +≡                          ´ µ
 void swap(Dlink * link)
 {
   if (is_empty() and link->is_empty())
     return;
   if (is_empty())
     {
       link->next->prev = this;
       link->prev->next = this;
       next = link->next;
       prev = link->prev;
       link->reset();
       return;
     }
   if (link->is_empty())
     {
       next->prev = link;
       prev->next = link;
       link->next = next;
       link->prev = prev;
       reset();
       return;
     }
   Aleph::swap(prev->next, link->prev->next);
   Aleph::swap(next->prev, link->next->prev);
   Aleph::swap(prev, link->prev);
   Aleph::swap(next, link->next);
 }
   swap() × ÙÒ Ö Ò ÓÔ Ö ÓÒ¸ Ô٠׸ Ô ÖØ        ÕÙ ×Ù Ø ÑÔÓ           Ù ÓÒ × ×¹
Ô Ø ÙÐ Ö¸ ÔÙ × × ÓÒר ÒØ ¸ × Ò Ö Ð Ô Ö ØÓ × Ð × Ð ×Ø × Ó Ð Ñ ÒØ ÒÐ Þ × ÓÒ
ÒÓ Ó      Ö ¸ × Ò ÑÔÓÖØ Ö Ò Ð Ø ÔÓ   ØÓ ÕÙ × Ñ Ò ¸ Ò ÓÑÓ × Ö × ÖÚ Ð Ñ ÑÓ¹
Ö º Ä ¬ ÙÖ ¾º ÐÙ×ØÖ ÐÓ× ÒÓ Ó× Ð × Ð ×Ø × Ò ÐÓ× Ù Ð × × Ö Ð Þ Ò ÐÓ× ÒØ Ö Ñ Ó׺
     ×ÙÑ Ò Ó ÕÙ this × Ð ÒÓ Ó        Ö    ÙÒ Ð ×Ø ¸ ÔÓ ÑÓ× × Ö × Ð Ð ×Ø ר
Ú Ó ÒÓ¸ × ÓÒØ Ò ÙÒ ×ÓÐÓ Ð Ñ ÒØÓ Ó × ×Ù Ö Ò Ð          × Ñ ÒÓÖ Ó Ù Ð ÙÒÓ
78                                                            Cap´
                                                                 ıtulo 2. Secuencias




                                        this


      swap                      swap    swap                       swap

                                        link




                             ÙÖ ¾º ÇÔ Ö ÓÒ swap(link)

Ñ Ñ ÖÓ× ÔÙ Ð Ó×    Dlink    +≡                       ´ µ
 bool is_empty() const { return this == next and this == prev; }
 bool is_unitarian() const { return this != next and next == prev; }
 bool is_unitarian_or_empty() const { return next == prev; }
   ÍÒ ÔÙÒØÓ ×Ø Ö ×Ø × ÓÔ Ö ÓÒ × × ÕÙ ÒÓ Ö ÕÙ Ö Ò ÓÒØ Ð Þ Ö Ð ÒØ
  ÒÓ Ó× Ð Ð ×Ø º
   Ä ¬ ÙÖ ¾º½¼ ÒÙÑ Ö ÐÓ× Ö ÒØ × Ô ×Ó× ÒÚÓÐÙ Ö Ó× Ò Ð Ò× Ö ÓÒ¸ ÐÓ× Ù Ð × ×
Ö Ð Þ Ò Ò Ð ÖÙØ Ò insert()¸ Ð Ù Ð Ò× ÖØ node ÓÑÓ Ð ×Ù ×ÓÖ this
 Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink +≡                       ´ µ
 void insert(Dlink * node)
 {
   node->prev = this;
   node->next = next;
   next->prev = node;
   next       = node;
 }
Ä Ò× Ö ÓÒ ÓÑÓ ÔÖ       ×ÓÖ ×    ÒÓÑ Ò    append()   Ý×       ¬Ò ÓÑÓ × Ù
 Ñ Ñ ÖÓ× ÔÙ Ð Ó×   Dlink       +≡                        ´    µ
 void append(Dlink * node)
 {
   node->next = this;
   node->prev = prev;
   prev->next = node;
   prev       = node;
 }
    ÈÙ ×ØÓ ÕÙ Ð Ð ×Ø × Ö ÙÐ Ö¸ insert() × Ð ÒÓ Ó         Ö Ò× ÖØ ÙÒ ÒÓ Ó Ð
ÔÖ Ò Ô Ó Ð Ð ×Ø º Ò ÐÓ Ñ ÒØ ¸ append() ÐÓ× Ò× ÖØ Ð ¬Ò к
         Ð Ö ÓÒ ÙÒ ÒÓ Ó¸ ÔÓ ÑÓ×            Ö ×Ù ×Ù ×ÓÖ Ý ÔÖ     ×ÓÖ Ñ ÒØ
ÐÓ× × Ù ÒØ × Ñ ØÓ Ó×
 Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink +≡                         ´ µ       ¼
2.4. Listas Enlazadas                                                                      79



 1:node->prev = this; node
                                                                 2:node->next = next;
                                           X
                 4: next = node;           3:next->prev = node;



                 A                  B                              C               D


                           this

        ÙÖ ¾º½¼ ÁÒ× Ö ÓÒ Ò ÙÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ                     ÑÔÐ ÒØ     ÓÒ Dlink

  Dlink *&    get_next()
  {
    return    next;
  }
  Dlink *&    get_prev()
  {
    return    prev;
  }

                                            this




        head




                             ´ µ ÒØ ×       ÙØ Ö insert list(head)
                                           this




       head




                            ´ µ    ×ÔÙ ×       ÙØ Ö insert list(head)

                        ÙÖ ¾º½½ ÁÒ× Ö ÓÒ           Ð ×Ø   ÒØÖÓ    ÙÒ Ð ×Ø

      Ü ×Ø Ò Ö ÙÒר Ò × Ò Ð × Ù Ð × × Ö ÕÙ Ö Ò× ÖØ Ö ÙÒ Ð ×Ø ÓÑÔÐ Ø ÒØÖÓ
ÓØÖ     Ô ÖØ Ö ÙÒÓ ×Ù× ÒÓ Ó׺ È Ö ÐÐÓ¸ ÙØ Ð Þ ÑÓ× Ð × ÔÖ Ñ Ø Ú × insert list()
80                                                             Cap´
                                                                      ıtulo 2. Secuencias



    Ý append list()º Ä ¬ ÙÖ ¾º½½ ÑÙ ×ØÖ Ð ÔÖÓ ×Ó       Ù ÓÒ insert list(head)º
       ×ÔÙ × ×Ù Ù ÓÒ¸ Ð Ð ×Ø ÙÝÓ ÒÓ Ó         Ö ×Ø   ÔÙÒØ Ó ÔÓÖ head Ú Ò Ú ¸
    ÔÙ × ×Ù× ÒÓ Ó× Ù ÖÓÒ Ò ÐÙ Ó× Ò thisº × ÑÙÝ ÑÔÓÖØ ÒØ ÒÓØ Ö ÕÙ Ò ×Ø ×Ó this
    ÒÓ Ò × Ö Ñ ÒØ × ÙÒ ÒÓ Ó           Ö ¸ × ÒÓ ÕÙ ÔÙ × Ö Ù ÐÕÙ Ö ÓØÖÓ ÒÓ Óº Ä ×
     ÑÔÐ Ñ ÒØ ÓÒ × ×ÓÒ ÓÑÓ × Ù
¼    Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink +≡                          ´ µ       ¼
      void insert_list(Dlink * head)
      {
        if (head->is_empty())
          return;
        head->prev->next = next;
        head->next->prev = this;
        next->prev       = head->prev;
        next             = head->next;
        head->reset();
      }
      void append_list(Dlink * head)
      {
        if (head->is_empty())
          return;
        head->next->prev = prev;
        head->prev->next = this;
        prev->next       = head->next;
        prev             = head->prev;
        head->reset();
      }
          Ò Ð ÙÒÓ× ÓÒØ ÜØÓ׸ Ð × ÓÔ Ö ÓÒ × insert list() Ý append list() × ÓÒÓ Ò
      ÓÑÓ ×ÔÐ ½¾ º
        ÍÒ ×Ó Ô ÖØ ÙÐ Ö¸ ÕÙ Þ ÑÙ Ó Ñ × ÓÑÙÒ ÕÙ Ð ×ÔÐ ¸ × Ð ÓÔ Ö ÓÒ ÓÒ Ø Ò Ö
    Ð ×Ø × concat list(head)¸ Ð Ù Ð ÓÒ Ø Ò Ð Ð ×Ø ÙÝÓ ÒÓ Ó       Ö × head ÓÒ thisº
    head Ú Ò Ú            ×ÔÙ × Ð ÓÔ Ö ÓÒº Ò ×Ø ×Ó¸ × × ×ÙÑ ÕÙ this × ÒÓ Ó
            Ö º Ð Ö ×Ô ØÓ¸ × ÔÐ ÒØ Ð × Ù ÒØ ÑÔÐ Ñ ÒØ ÓÒ
¼    Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink +≡                            ´ µ ¼ ½
      void concat_list(Dlink * head)
      {
        if (head->is_empty())
          return;
        if (this->is_empty())
          {
            swap(head);
            return;
          }
        prev->next       = head->next;
        head->next->prev = prev;
        prev             = head->prev;
     ½¾
          Ò Ò Ð ×¸ ר Ø ÖÑ ÒÓ × ÙØ Ð Þ Ù Ò Ó × × ÜÔÖ × Ö ÕÙ Ó× Ó× × × Ô Ò¸ × ÙÒØ Ò¸ ÔÓÖ ×Ù×
     ÜØÖ ÑÓ× ¹ÙÒ ÔÙÒØ ÓÒ Ð ÓØÖ ¹º Ò Ð ÓÔ Ò ÓÒ    ר Ö ØÓÖ¸ Ð ÕÙ Ú Ð ÒØ ר ÐÐ ÒÓ Ñ × ÔÖÓÜ ÑÓ ×
      ÒÐ Þ Ö ¸ ÙÝÓ Ù×Ó ÔÐ ÒØ ÙÒ Ñ Ù           ÒÐ Ö    Ð ×Ø × ÒÐ Þ ×º ÈÓÖ × Ö ÞÓÒ¸ ÓÒØ ÒÙ Ö ÑÓ×
    ÙØ Ð Þ Ò Ó Ð Ø ÖÑ ÒÓ Ò Ò Ð ×º
2.4. Listas Enlazadas                                                                  81



         head->prev->next = this;
         head->reset();
     }
             Ð Ö ÓÒ ÙÒ ÒÓ Ó¸ Ý Ú Ö × Ñ Ò Ö × ÒÚÓ Ö ÙÒ Ð Ñ Ò ÓÒº                            Ä
    Ñ × ÙØ Ð ØÓ × × Ð ÒÓÑ Ò          ÙØÓ¹ Ð Ñ Ò ÓÒ ¸ Ð    ØÙ Ñ ÒØ del()º                   Ä
    ÖÙØ Ò × ÑÙÝ ÙØ Ð ÔÓÖÕÙ Ô ÖÑ Ø ÕÙ ÓØÖ × ×ØÖÙ ØÙÖ ×    ØÓ× ÐÑ Ò Ò Ö Ö Ò                       ×
     Ð Ñ Ò Ð × Ð Ñ ÒØÓ× ÙÒ Ð ×Ø ÒÐ Þ º Ò ÓØÖ × Ô Ð Ö ×¸ ÙÒ ÒÓ Ó Ù ÐÕÙ                       Ö
    ÔÙ ×ÙÔÖ Ñ Ö× × Ñ ×ÑÓ Ð Ð ×Ø º ËÙ ÑÔÐ Ñ ÒØ ÓÒ × ÓÑÓ × Ù
½    Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink +≡                          ´ µ ¼ ½
     void del()
     {
       prev->next = next;
       next->prev = prev;
       reset();
     }
    ÄÓ× Ô ×Ó×    del()   × ÑÙ ×ØÖ Ò Ò Ð ¬ ÙÖ ¾º½¾º
                                     1: prev->next = next;
                                          3: reset();

                                 A                 B              C                D


                                                 2: next->prev = prev;
                                          this

         ÙÖ ¾º½¾ ÙØÓ¹ Ð Ñ Ò ÓÒ Ò ÙÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ                   ÑÔÐ ÒØ    ÓÒ Dlink

           Ó ÙÒ ÒÓ ¸ Ý ÓØÖ × Ó× Ñ Ò Ö ×   Ð Ñ Ò Ö ×Ù ÔÖ                   ×ÓÖ Ó ×Ù ×Ù ×ÓÖ¸ Ð ×
    Ù Ð × × ÑÔÐ ÒØ Ò Ñ ÒØ ÐÓ× × Ù ÒØ × Ñ ØÓ Ó×
½   Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink +≡                        ´ µ                   ½   ¾
     Dlink * remove_prev()
     {
       Dlink* retValue = prev;
       retValue->del();
       return retValue;
     }
     Dlink * remove_next()
     {
       Dlink* retValue = next;
       retValue->del();
       return retValue;
     }
         remove prev() ×ÙÔÖ Ñ   Ð ÔÖ     ×ÓÖ Ö ×Ô ØÓ this remove next() ×ÙÔÖ Ñ Ð ×Ù ¹
    ×ÓÖº ר × ÔÖ Ñ Ø Ú × ×ÓÒ Ô ÖØ ÙÐ ÖÑ ÒØ ÙØ Ð × Ô Ö Ð ÒÓ Ó       Ö Ð Ð ×Ø º ÈÙ ×ØÓ
    ÕÙ Ð Ð ×Ø × Ö ÙÐ Ö¸ remove prev()¸ ÒÚÓ           × Ð ÒÓ Ó       Ö ¸ ×ÙÔÖ Ñ Ð ÙÐØ ÑÓ
    ÒÓ Ó Ð Ð ×Ø × Ñ Ð ÖÑ ÒØ ¸ remove next() ×ÙÔÖ Ñ Ð ÔÖ Ñ ÖÓº
        ÍÒ ÔÐ ÓÒ Ö Ø               Ð ÙÒÓ× ÐÓ× Ñ ØÓ Ó× ÜÔÐ Ó× × ÑÔÐ ¬ Ñ ÒØ
    ÙÒ ÖÙØ Ò      ÒÚ Ö× ÓÒ ÒÓ Ó× Ð Ð ×Ø
82                                                           Cap´
                                                                    ıtulo 2. Secuencias



¾   Ñ Ñ ÖÓ× ÔÙ Ð Ó×     Dlink    +≡                       ´ µ ½ ¾
      size_t reverse_list()
      {
        if (is_empty())
          return 0;
        Dlink tmp_head; // cabecera temporal donde se guarda lista invertida
            // recorrer toda la lista this, eliminar primero e insertar en tmp_head
        size_t counter = 0;
        for (/* nada */; not is_empty(); counter++)
          tmp_head.insert(remove_next()); // eliminar e insertar en tmp_head
        swap(&tmp_head); // tmp_head == lista invertida; this vac´a ==> swap
                                                                 ı
        return counter;
      }
          Ô ÖØ      ÒÚ ÖØ Ö Ð Ð ×Ø ¸ reverse list() ÔÖÓÚ          Ð Ö ÓÖÖ Ó Ô Ö ÓÒØ Ö Ð Ò¹
    Ø         ÒÓ Ó× ÒØ         ÕÙ Ö ØÓÖÒ Ð ÙÒ ÓÒº
               ÙÒ Ð ×Ø ¸ ÓÑÓ Ô ÖØ ÖÐ ÔÓÖ Ð ÒØÖÓ Ò Ó× Ð ×Ø × Ð Ñ ×ÑÓ Ø Ñ ÒÓ ÍÒ ØÖÙ Ó
      ÓÒ× ×Ø Ò Ú ÒÞ Ö Ó× ÔÙÒØ ÓÖ ×º ÈÓÖ                  Ø Ö ÓÒ¸ ÙÒ ÔÙÒØ ÖÓ Ú ÒÞ ÙÒ Ô ×Ó¸
    Ñ ÒØÖ × ÕÙ Ð ÓØÖÓ Ú ÒÞ Ó×         ½¿ º Ù Ò Ó Ð × ÙÒ Ó ÔÙÒØ ÖÓ × Ò Ù ÒØÖ Ð ¬Ò Ð Ð
    Ð ×Ø ¸ Ð ÔÖ Ñ ÖÓ × Ò ÓÒØÖ Ö Ò Ð ÒØÖÓ ×Ø × Ð ÔÙÒØÓ Ô ÖØ ÓÒº ר Ò ÓÕÙ ¸ ×
      Ð Ñ × Ù Ó Ô Ö Ô ÖØ ÓÒ Ö ÙÒ Ð ×Ø × ÑÔÐ ¸ Ô ÖÓ                  ÔÖÓ Ö Ñ Ö× Ù Ó× Ñ ÒØ
    ÐÓ× ×Ó× ÜØÖ ÑÓ×           ÖÓ¸ ÙÒÓ Ó Ó× Ð Ñ ÒØÓ׺
         È Ö Ð ×Ø × Ó Ð Ñ ÒØ ÒÐ Þ ×¸ Ü ×Ø ÙÒ Ò ÓÕÙ ÑÙ Ó Ñ × × ÑÔРݸ ÓÑÓ ØÓ Ó
    ÐÓ × ÑÔÐ ¸ Ñ × ÓÒ¬ Ð Ö ÓÖÖ Ö Ð Ð ×Ø ÔÓÖ                   ÜØÖ ÑÓº ÈÓÖ Ð Ð Ó ÞÕÙ Ö Ó ×
    Ö ÓÖÖ          Ð Ö         ÔÓÖ Ð Ö Ó            Ð ÞÕÙ Ö º Ò             Ø Ö ÓÒ¸ × Ð Ñ Ò
               ÜØÖ ÑÓ Ý × Ò× ÖØ Ò           ÙÒ     Ð × Ð ×Ø × Ö ×ÙÐØ Óº È Ö ÐÐÓ¸ × Ò ÑÓ× Ð
    Ñ ØÓ Ó split list(l, r)¸ Ð Ù Ð Ö            Ó×         Ö × Ð ×Ø × Ú × l Ý r¸ Ý Ô ÖØ ÓÒ
       this ÔÓÖ Ð ÒØÖÓ Ò Ó× Ô ÖØ ׸ Ð ÞÕÙ Ö            ÒlÝÐ Ö             Òr
¾    Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink +≡                                      ´ µ ¾ ¾
      size_t split_list(Dlink & l, Dlink & r)
      {
        size_t count = 0;
        while (not is_empty())
          {
            l.append(remove_next()); ++count;
            if (is_empty())
              break;
            r.insert(remove_prev()); ++count;
          }
        return count;
      }
            ÙÒ Ð ×Ø Ý ÙÒÓ ×Ù× ÒÓ Ó׸ ÔÙ × Ö ÓÒÚ Ò ÒØ Ô ÖØ ÓÒ ÖÐ Ò ÙÒ ÒÓ Ó
      Óº È Ö ÐÐÓ¸ × ÔÖÓÚ Ð ÙÒ ÓÒ cut list() ÙÝ ÑÔÐ ÒØ ÓÒ × Ð × Ù ÒØ
¾   Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink +≡                      ´ µ ¾
      void cut_list(Dlink * link, Dlink * list)
      {
        list->prev = prev;       // enlazar list a link (punto de corte)
        list->next = link;
     ½¿
          Ë ÔÙ    Ö ÕÙ Ð × ÙÒ Ó ÙÔÐ     Ò Ú ÐÓ     Ð ÔÖ Ñ ÖÓº
2.4. Listas Enlazadas                                                           83



         prev = link->prev;       // quitar de this todo lo que est´ a partir de link
                                                                   a
         link->prev->next = this;
         link->prev = list;       // colocar el corte en list
         list->prev->next = list;
     }

                                                    link
         this



                          A              B              C              D                E




                                     list




                          ÙÖ ¾º½¿ ÓÖØ        ÙÒ Ð ×Ø Ò ÙÒ ÒÓ Ó    Ó
          Ð ×ÕÙ Ñ      ר Ð ÓÖ ØÑÓ × ÐÙ×ØÖ Ò Ð ¬ ÙÖ ¾º½¿º cut list() Ô ÖØ ÓÒ this
     Ò Ð ÒÓ Ó ÙÝ Ö ÓÒ × link¸ Ð Ù Ð            Ô ÖØ Ò Ö Ð Ð ×Ø thisº ÄÓ× ÒÓ Ó×
    Ð ÞÕÙ Ö        link × ÔÖ × ÖÚ Ò Ò this¸ Ñ ÒØÖ × ÕÙ ÐÓ× Ö ×Ø ÒØ ׸ Ò ÐÙ Ó link¸ ×
     ÓÔ Ò listº
         ÄÓ× Ù×Ó× Dlink ×ÓÒ × ÐÓ× Ñ ×ÑÓ× ÕÙ Ð Slink × ÖÖÓÐÐ Ó Ò Ð ×Ù ¹
    × ÓÒ Ü ¾º º¾ ´Ô Ò µº ÈÓ ÑÓ×             Ö ÙÒ Ð × ser ÙÒ Dlink ÔÓÖ Ö Ú ÓÒ
    ÔÙ Ð ¸ Ó      ÖÐ Ô ÖØ ÙÒ ÒÓ Ó Ó Ð ÔÓÖ Ð Ö ÓÒ ÙÒ Dlink ÓÑÓ ØÖ ÙØÓ
    Ð Ð×ºÄ        Ö Ò × Ò Ð Ö ×Ô ØÓ Slink × ×Ù Ú Ö× Ø Ð ¸ ÜÔÖ × ÔÓÖ Ð Ö ÕÙ Þ
        Ð × ÓÔ Ö ÓÒ × ÕÙ ÑÓ× ×ØÙ Ó¸ Ð × Ù Ð × × Ö Ò Ñ ×           Ð×      × ÖÖÓÐÐ Ö ÕÙ
    Ð × ÓÔ Ö ÓÒ × Slinkº
          Ð Ù Ð ÕÙ ÓÒ Slink¸ Ô Ö × ØÙ ÓÒ × Ò ÕÙ × Ù× Ò Ö ×ØÖÓ× ÕÙ ÓÒØ Ò Ò Dlink¸
    × Ö ÕÙ Ö Ò Ñ ÖÓ× ÕÙ Ò Ö Ò ÙÒ ÓÒ × ÓÒÚ Ö× ÓÒ ÙÒ Dlink                 ÙÒ Ð × ÕÙ
     ÓÒØ Ò ÙÒ ØÖ ÙØÓ Dlinkº Ò ×Ø × ÒØ Ó¸ Ý Ó× ÔÓ× Ð             × ÔÖÓ Ð ×¸ ÙÒÕÙ ÒÓ
       Ò Ö Ð × ÓÒÚ Ö× ÓÒ      ÙÒ Ð × × ÑÔÐ Ó ÓÒÚ Ö× ÓÒ        ÙÒ Ð × Ô Ö Ñ ØÖ Þ º
      ר × ÔÓ× Ð     × × Ò ÐÓ Ò Ò ÐÓ× × Ù ÒØ × Ñ ÖÓ×
¿    Ñ ÖÓ× ÓÒÚ Ö× ÓÒ Dlink Ð × ¿ ≡                                   ´ µ
     # define DLINK_TO_TYPE(type_name, link_name) 
     inline static type_name * dlink_to_##type_name(Dlink * link) 
     { 
       type_name * ptr_zero = 0; 
       size_t offset_link   = reinterpret_cast<size_t>(&(ptr_zero->link_name)); 
       char * address_type = reinterpret_cast<char*>(link) - offset_link; 
       return reinterpret_cast<type_name *>(address_type); 
     }

     # define LINKNAME_TO_TYPE(type_name, link_name) 
     inline static type_name * link_name##_to_##type_name(Dlink * link) 
     {
84                                                         Cap´
                                                              ıtulo 2. Secuencias



     type_name * ptr_zero = 0; 
     size_t offset_link   = reinterpret_cast<size_t>(&(ptr_zero->link_name)); 
     char * address_type = reinterpret_cast<char*>(link) - offset_link; 
     return reinterpret_cast<type_name *>(address_type); 
 }
  ¬Ò ×
 DLINK TO TYPE¸ Ò Ú Ö Ù×    º
 LINKNAME TO TYPE¸ Ù×      Ò ÙÒ × ¾   Ò   º
 ÌÓ Ó× ÐÓ× Ñ ÖÓ× Ò Ö Ò ÙÒ ÙÒ ÓÒ           ÓÒÚ Ö× ÓÒ ÕÙ ÓÒÚ ÖØ ÙÒ ÔÙÒØ ÖÓ link
Ø ÔÓ Dlink Ò ÙÒ ÔÙÒØ ÖÓ ÙÒ Ð × ÕÙ ÓÒØ Ò Ð Dlinkº
      Ð Ñ ÖÓ DLINK TO TYPE Ò Ö ÙÒ ÙÒ ÓÒ Ò Ö Ð ÓÒ ÒÓÑ Ö dlink to type()º Ð
Ñ ÖÓ LINKNAME TO TYPE Ö        ÙÒ Ô Ö Ñ ØÖÓ ÐÐ Ñ Ó link name¸ Ð Ù Ð    Ö ÓÖÖ ×¹
ÔÓÒ Ö Ü Ø Ñ ÒØ ÓÒ Ð ÒÓÑ Ö Ð ÑÔÓ ÒØÖÓ Ð Ð × º Ä Ö ÞÓÒ × Ö ×Ø
 ÙÒ ÓÒ × ÕÙ Ð Ô ÖÑ Ø Ð Ù×Ù Ö Ó ×Ø ÒØÓ× ÒÓÑ Ö × ÙÒ ÓÒ × Ô Ö ×Ø ÒØÓ× ÒÓÑ Ö ×
      ÑÔÓ× ×ØÓ × Ò ×Ô Ò× Ð Ò ÐÓ× ×Ó× Ò ÕÙ Ð Ð × ÓÒØ Ò Ó× Ó Ñ × ÒÐ ×
  Ó Ð ×º ÄÓ× Ñ ÖÓ× DLINK TO TYPE Ý LINKNAME TO TYPE    Ò ÙØ Ð Þ Ö× ÒØÖÓ Ð Ð ×
ÕÙ Ù× Ð Ø ÔÓ Dlinkº
Iterador de Dlink
   Dlink ÜÔÓÖØ ÙÒ      Ø Ö ÓÖ ´Ú Ö Ü ¾º¿ ´Ô Ò ¾µµ ÙÝÓ ×ÕÙ Ñ × ÔÖ × ÒØ ÓÑÓ × Ù
Ñ Ñ ÖÓ× ÔÙ Ð Ó×     Dlink    +≡                        ´   µ   ¾
 class Iterator
 {
     ØÖ ÙØÓ× Dlink::Iterator
    Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ Dlink::Iterator
 };
   È Ö Ñ ÒØ Ò Ö Ð ×Ø Ó Ð Ø Ö ÓÖ Ö ÕÙ Ö ÑÓ× Ó× Ñ Ñ ÖÓ×
 ØÖ ÙØÓ× Dlink::Iterator ≡                                         ´   µ
 Dlink * head;
 Dlink * curr;
        × Ð ÒÓ Ó
     head            Ö Ð Ð ×Ø º curr × Ð ÒÓ Ó ØÙ Ð Ð Ø Ö ÓÖº
  À Ý Ú Ö × Ñ Ò Ö × ÓÒרÖÙ Ö ÙÒ Ø Ö ÓÖ
Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ Dlink::Iterator ≡           ´ µ
 Iterator(Dlink * head_ptr) : head(head_ptr), curr(head->get_next())
 {
   // Empty
 }
 Iterator(const Iterator & itor) : head(itor.head), curr(itor.curr)
 {
   // Empty
 }
  ÍÒ Ø Ö ÓÖ ÔÙ     × Ò Ö×
Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ Dlink::Iterator        +≡       ´   µ
 Iterator   & operator = (const Iterator & itor)
 {
   head =   itor.head;
   curr =   itor.curr;
   return   *this;
2.4. Listas Enlazadas                                                   85



 }
  ÍÒ Ø Ö ÓÖ ÔÙ Ö ÙØ Ð Þ Ö× ¸ ÐÓ ÕÙ Ö ÕÙ Ö ÙÒ ÓÒ × Ö Ò       ÓÒ
Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ Dlink::Iterator   +≡      ´ µ
 void reset_first()
 {
   curr = head->get_next();
 }
 void reset_last()
 {
   curr = head->get_prev();
 }
reset first() ÔÓ×  ÓÒ Ð Ø Ö ÓÖ ×Ó Ö Ð ÔÖ Ñ Ö Ð Ñ ÒØÓº reset last() ÔÓ× ÓÒ Ð
Ø Ö ÓÖ ×Ó Ö Ð ÙÐØ ÑÓ Ð Ñ ÒØÓº
    Ü ×Ø Ò × ØÙ ÓÒ × ×Ô Ð × Ò Ð × Ù Ð × × × Ò Ð Þ Ö ÙÒ Ø Ö ÓÖ Ô ÖØ Ö
ÙÒ Ð Ñ ÒØÓ ØÙ Ð Ý ÓÒÓ Ó
 Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ Dlink::Iterator   +≡       ´ µ
 void set(Dlink * new_curr)
 {
   curr = new_curr;
 }
 void reset(Dlink * new_head)
 {
   head = new_head;
   curr = head->get_next();;
 }
set()  ÓÐÓ Ð Ø Ö ÓÖ ÙÒ ÒÙ ÚÓ ÒÓ Ó ØÙ и Ñ ÒØÖ × reset() ÓÐÓ Ò Ð Ø Ö ÓÖ
ÙÒ ÒÙ Ú Ð ×Ø º
    Ð Ð Ñ ÒØÓ ØÙ Ð Ð Ø Ö ÓÖ ×           Ý × Ú Ö ¬ Ñ ÒØ
 Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ Dlink::Iterator     +≡     ´ µ
 bool has_current() const
 {
   return curr != head;
 }
 Dlink * get_current()
 {
   return curr;
 }
 bool is_in_first() const { return curr == head->next; }
 bool is_in_last() const { return curr == head->prev; }
  È Ö Ú ÒÞ Ö Ð Ø Ö ÓÖ ÙØ Ð Þ ÑÓ× Ð × × Ù ÒØ × ÔÖ Ñ Ø Ú ×
Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ Dlink::Iterator    +≡         ´ µ
 void prev()
 {
   curr = curr->get_prev();
 }
 void next()
 {
   curr = curr->get_next();
 }
86                                                          Cap´
                                                               ıtulo 2. Secuencias



     Ñ ÒÙ Ó ÔÙ Ò ÓÑ Ò Ö× Ø Ö ÓÖ × Ò ÙÒ for ÕÙ × Ñ Ò Ð Ø Ö ÓÒ ×Ó Ö ÙÒ
 ÖÖ ÐÓº ÓÑÓ ÙÒ Ð ×Ø ÒÓ Ø Ò        ×Ó Ö ØÓ¸ Ð ÓÒ ÓÒ Ø Ö ÓÒ ÒÓ            ×Ö
ÙÒ ÓÑÔ Ö ÓÒ ÔÓÖ ÔÓ× ÓÒ Ð Ø ÔÓ i < nº Ò ÙÒ Ð ×Ø ݸ Ò Ò Ö Ð¸ Ô Ö × Ù Ò ×
ÕÙ × Ñ Ò ÔÙÐ Ò ÓÒ Ø Ö ÓÖ ×¸ Ð ÓÑÔ Ö ÓÒ        × Ö ÒØÖ Ø Ö ÓÖ ×º ÈÙ ×ØÓ ÕÙ
ÒÓ × ÔÙ     ÓÒÓ Ö Ð ÔÓ× ÓÒ ÒØÖÓ Ð × Ù Ò Ô Ö ØÓ × Ð × × ØÙ ÓÒ ×¸ ÒÓ ×
ÔÓ× Ð ÑÔÐ Ö ÐÓ× ÓÑÔ Ö ÓÖ × Ö Ð ÓÒ Ð × <, <=, >, >=¸ Ô ÖÓ × × ÔÙ   ÓÑÔ Ö Ö
×Ù Ù Ð Ó Ö Ò Ø Ð ÓÑÓ × Ù
 Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ Dlink::Iterator  +≡      ´ µ
  bool operator == (const Iterator & it) const { return curr == it.curr; }
  bool operator != (const Iterator & it) const { return curr != it.curr; }
      ÍÒ ×Ø ÐÓ ØÖ   ÓÒ Ð    Ù×Ó     Ð ÓÑÔ Ö ÓÒ ÒØÖ Ø Ö ÓÖ × × ÐÙ×ØÖ Ò ×Ø         ѹ
ÔÐÓ
       for (Dlink::Iterator curr(list); curr != end; curr.next())

        ÓÒ   end × ÙÒ Ø Ö ÓÖ ×Ó Ö Ð Ð ×Ø list ÔÙÒØ Ò Ó Ð ¬Ò к ר × Ð ×Ø ÐÓ      Ð
      Ð ÓØ   ר Ò Ö stdc++º end × ÕÙ Ú Ð ÒØ
       Dlink::Iterator end(list);
       list.reset_last();
       list.next();

      × ÔÓ× Ð Ò× ÖØ Ö Ö ×Ô ØÓ Ð Ð Ñ ÒØÓ ØÙ Ð Ð Ø Ö ÓÖº È Ö ÐÐÓ¸ ר ÓÒ ÒÚÓ Ö
×Ó Ö Ð Ð Ñ ÒØÓ ØÙ Ð Ù ÐÕÙ Ö Ð × ÔÖ Ñ Ø Ú × Ò× Ö ÓÒ insert() Ó append()º
      Ü ×Ø Ò × ØÙ ÓÒ × Ò Ð × ÕÙ × Ö ÕÙ Ö Ð Ñ Ò Ö Ð Ð Ñ ÒØÓ ØÙ Ð Ð Ø Ö ÓÖº Ò
 ר ×Ó¸ ÒÓ × ÔÓ× Ð        ØÙ Ö del() ×Ó Ö Ð ÒÓ Ó ØÙ и ÔÙ × ÔÓ Ö Ô Ö Ö× Ð ×Ø Ó
  Ð Ø Ö ÓÖº È Ö ×ÓÐÚ ÒØ Ö ×Ø × ØÙ ÓÒ¸ Ð Ð × Dlink::Iterator ÜÔÓÖØ ÙÒ ÙÒ ÓÒ
    Ð Ñ Ò ÓÒ ×Ó Ö Ð ÒÓ Ó ØÙ Ð ÕÙ            Ð Ø Ö ÓÖ Ò Ð ÒÓ Ó ×Ù ×ÓÖ Ð Ð Ñ Ò Ó
 Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ Dlink::Iterator        +≡            ´ µ
  Dlink * del()
  {
    Dlink * current = get_current(); // obtener nodo actual
    next(); // avanzar al siguiente nodo
    current->del(); // eliminar de la lista antiguo nodo actual
    return current;
  }
    Ö ØÓÖÒ Ð ÒÐ Ð Ñ Ò Ó Ñ Ò Ö Ø Ð ÕÙ Ð Ð ÒØ ÔÙ
del()                                             ×ÔÓÒ Ö Ð Ò Ð
ÓÖÑ ÕÙ ÔÖ ¬ Ö º
   ÓÑÓ ÑÔÐÓ Ù×Ó Dlink::Iterator ÓÒ× Ö ÑÓ× Ð × Ù ÒØ Ñ ØÓ Ó
Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink +≡                      ´ µ
  void remove_all_and_delete()
  {
    for (Iterator itor(this); itor.has_current(); delete itor.del()) ;
  }
 ר Ñ ØÓ Ó Ð Ñ Ò ØÓ Ó× ÐÓ× ÒÓ Ó× Ý ×ÙÑ ÕÙ Ð Ñ ÑÓÖ                   ÒÓ Ó Ù × Ò
Ñ ÒØ newº
2.4. Listas Enlazadas                                                                        87



2.4.8      El TAD Dnode<T> (nodo doble)
 Ò ÙÒ Ò Ú Ð ×ÙÔ Ö ÓÖ Ö ×Ô ØÓ Dlink¸ Ð Ì Dnode<T> ÑÓ Ð Þ ÙÒ ÒÓ ÓÔ ÖØ Ò ÒØ
  ÙÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ            Ö ÙÐ Öº Dnode<T> × ¬Ò     ÑÔÐ ÒØ Ò Ð
Ö ÚÓ ØÔÐ ÒÓ ºÀ            ÙÝ ×ØÖÙ ØÙÖ × Ð × Ù ÒØ
ØÔÐ ÒÓ ºÀ ≡
  template <typename T> class Dnode : public Dlink
  {
     Ñ ØÓ Ó× ÔÖ Ú Ó× Dnode<T>
     Ñ ØÓ Ó× ÔÙ Ð Ó× Dnode<T>
  };
  ¬Ò ×
  Dnode¸   Ù×   Ò ÙÒ × ¸ ¼ ¸ ¾ß ¸ ½ ß ¸ ½   ¸½   ¸ ¼ ¸ ¼ ¸ Ò           ¾º
   Dnode<T>   × ÙÒ Dlink ÔÙ Ð Ó ÔÓÖ Ö Ú ÓÒº Ä ÙÒ                        ÖÒ          Ö×    Ò ÕÙ
Dnode<T> ÐÑ     Ò ÙÒ Ð Ñ ÒØÓ Ø ÔÓ T
Ñ ØÓ Ó× ÔÖ Ú Ó× Dnode<T> ≡                                                  ´   µ
  mutable T data;
    ÄÓ× Ñ ØÓ Ó× Dlink ÕÙ Ö ØÓÖÒ Ò ÔÙÒØ ÖÓ× Dlink*              Ò ×Ó Ö Ö Ö× Ô Ö ÕÙ
Ö ØÓÖÒ Ò ÔÙÒØ ÖÓ× Ø Ô Ó× Dnode<T>*
 Ñ ØÓ Ó× ÔÙ Ð Ó× Dnode<T> ≡                                        ´    µ
  Dnode<T> *& get_next() { return reinterpret_cast<Dnode<T>*&>(next); }
  Dnode<T> *& get_prev() { return reinterpret_cast<Dnode<T>*&> (prev); }
  Dnode<T>* remove_prev() { return static_cast<Dnode<T>*>(Dlink::remove_prev()); }
  Dnode<T>* remove_next() { return static_cast<Dnode<T>*>(Dlink::remove_next()); }
Í× × Dnode      º
Ä ÙÒ ÙÒ ÓÒ ×ØÓ× Ñ ØÓ Ó× × ØÙ Ö Ð ÓÒÚ Ö× ÓÒ                             Dnode<T>º         ÐÑ Ò Ó
  ÐÓ× ÒÐ × × ÑÔÐ ÒØ ÔÓÖ Ð Ñ ØÓ Ó Ð Ð × × Dlinkº
     Ð ×Ó Ð ØÓ × Ö Ð Þ ÔÓÖ
 Ñ ØÓ Ó× ÔÙ Ð Ó× Dnode<T> +≡               ´ µ
  T & get_data() { return data; }
  ÍÒ ÔÙÒØÓ ×ÙÑ Ñ ÒØ ÑÔÓÖØ ÒØ × Ð Ø ÔÓ                ØÓ       Dnode<T>          ר × ÜÔÓÖØ
Ñ ÒØ Ð × Ù ÒØ         Ð Ö ÓÒ
Ñ ØÓ Ó× ÔÙ Ð Ó× Dnode<T> +≡                               ´    µ
  typedef T dnode_type;
     ר Ð Ö ÓÒ Ô ÖÑ Ø ÕÙ ÔÖÓ Ö Ñ × Ò Ö Ó× ÓÒÓÞ Ò Ð Ø ÔÓ        ØÓ
Dnode<T>º
        ÈÓÖ ÑÔÐÓ¸ × × Ø Ò ÙÒ Dnode<T> Ó Ð Ø ÔÓ Ò Ö Ó Node¸ ÒØÓÒ × ÙÒ
Ö Ñ ÒØÓ ÔÖÓ Ö Ñ ÔÓ Ö × Ö
  typename Node::dnode_type data;


    Ð Ù Ð Ð Ö ÙÒ Ú Ö Ð ÒÓÑ Ö data Ð Ø ÔÓ ÒÚÓÐÙ Ö Ó Ò Node¸ Ð Ù Ð × Ð
Ñ ×ÑÓ Ø ÔÓ Ò Ö Ó Tº
   À Ý ÙÒ Ñ ØÓ Ó ÙÝÓ Ù×Ó × Ü Ô ÓÒ Ð¸ Ô ÖÓ ÕÙ ÔÙ × Ö ÜØÖ ÓÖ Ò Ö Ñ ÒØ ÙØ Ð
 Ò ÖØ × Ö ÙÒר Ò ×
Ñ ØÓ Ó× ÔÙ Ð Ó× Dnode<T> +≡                         ´ µ
  static Dnode * data_to_node(T & data)
  {
88                                                         Cap´
                                                              ıtulo 2. Secuencias



      Dnode * zero = 0;
      long offset = (long) &(zero->data);
      char * addr = (char*) (&data);
      return (Dnode*) (addr - offset);
  }
Í× × Dnode     º

Iterador de Dnode<T>
   Dnode<T> ÜÔÓÖØ ÙÒ  Ø Ö ÓÖ ÙÝ × Ñ ÒØ × ÒØ       Ð Dlink::Iterator º
ÈÙ ×ØÓ ÕÙ Ð ×Ø Ó Ý ÓÒØÖÓÐ Ð Ø Ö ÓÖ Ý ×Ø ÑÔÐ ÒØ Ó ÔÓÖ Dlink::Iterator ¸ Ð
 ×Ô ¬ ÓÒ Dnode<T> ÁØ Ö ØÓÖ ×ÓÐÓ × Ö Ñ Ø Ð ×Ó Ö Ö        ÐÓ× ÓÒרÖÙ ØÓÖ × Ý
  Ð Ó Ø Ò ÓÒ Ð Ð Ñ ÒØÓ ØÙ к

2.4.9     El TAD Dlist<T> (lista circular doblemente enlazada)
  Ò Ð × Ù ÒØ Ò Ú Ð Ñ Ò Ó Ð ×Ø × Ó Ð Ñ ÒØ ÒÐ Þ ×¸ Ò ÓÒØÖ ÑÓ× Ð Ø ÔÓ
Dlist<T>¸     Ð Ù Ð Ñ Ò ÙÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ ¸ Ö ÙÐ Ö¸ ÓÒ ÒÓ Ó  Ö¸
    ÒÓ Ó× Ø ÔÓ Dnode<T>º
    Dlist<T> ×      ¬Ò ÑÔÐ ÒØ Ò Ð Ö ÚÓ ØÔÐ Ð ×ØºÀ ¸ ÙÝ ×ØÖÙ ØÙÖ × Ð
× Ù ÒØ
 ØÔÐ Ð ×ØºÀ ≡
      ¬Ò ÓÒ ÒÓ Ó× Ó Ð × ¼
     ÒÚÓÐØÓÖ Ó ÒÓ Ó× Ó Ð × ¼
   Ä ×Ø Ó Ð Ò Ö ½
   Ä ×Ø × Ó Ð × ÜØÖ ÑÓ× ½

2.4.9.1      El problema de los destructores virtuales
 Ò Ð Ñ ×ÑÓ ×Ø ÐÓ ÕÙ   Slist<T>¸ Ð  Ð × Dlist<T>       ÜÔÓÖØ Ö ÙÒ ×Ù Ð ×
Dlist<T>::Node ÕÙ   ¬Ò ÐÓ× ÒÓ Ó× Dlist<T>º × Ñ ×ÑÓ¸ ÙÒ Ù×Ù Ö Ó Dlist<T>
ÔÙ Ñ Ò Ö ÒÓ Ó× ÓÑÔÐ Ó× Ñ ÒØ Ö Ú ÓÒ Dlist<T>::Node ÔÓÖ ÑÔÐÓ¸
ÔÓ Ö ÜÔÖ × Ö ÐÓ × Ù ÒØ
          class Window : public Dlist<int>::Node { /* ... */ };

      Ð Ñ ×ÑÓ ÑÓ Ó ÕÙ Slist<T>¸ Ð Ð ÒØ ÔÙ ÙØ Ð Þ Ö Òר Ò × Window Ò
ØÓ × Ð × ÔÖ Ñ Ø Ú × Dlist<T>º Window ÔÙ × Ö ÙÒ Ø ÔÓ ÓÑÔÐ Ó ÕÙ Ö Ö Ò
ÓØÖ × ×ØÖÙ ØÙÖ ×    ØÓ× Ý ÕÙ Ñ Ò Ñ ÑÓÖ º            Ñ ÑÓÖ × Ö Ð Ö ÔÓÖ Ð
  רÖÙ ØÓÖ Windowº
    È Ö ÕÙ Ö Ú ÓÒ × Dlist<T>::Node ÔÙ Ò ÒÚÓ Ö Ð ×ØÖÙ ØÓÖ Window¸
 × Ò ×Ô Ò× Ð ÕÙ Dlist<T>::∼Node ×         Ð Ö Ó Ú ÖØÙ Ðº
    Ë Dlist<T>::∼Node Ù × Ú ÖØÙ Ð¸ ÒØÓÒ × ÐÓ× ×ØÖÙ ØÓÖ × Òר Ò × Ö Ú ×
   Dlist<T>::Node × Ö Ò ÒÚÓ    Ó× Ý Ð × × Ñ ÒØ × ÐÓ× ×ØÖÙ ØÓÖ × Ò Ð × Ð × ×
  Ö Ú × × Ö Ò Ö ×Ô Ø ×º ÈÓÖ ÓØÖ Ô ÖØ ¸ Ô Ö ÕÙ Dlist<T>::∼Node × Ú ÖØÙ Ð ×
Ö ÕÙ Ö ÙÒ ÔÙÒØ ÖÓ Ð ×ØÖÙ ØÓÖ Ð Ð × Ö Ú ¸ ÐÓ ÕÙ ÑÔÐ ÙÒ ×Ô Ö Ó Ò
 ×Ô Ó × ÒÓ × Ò × Ö Ó ÒÚÓ Ö Ð ×ØÖÙ ØÓÖ Ð Ð × Ö Ú º ÓÑÓ Ð × Ð ×Ø ×
 ÒÐ Þ × ÔÙ Ò × Ö Ö ØÖ Ö Ñ ÒØ Ö Ò ×¸ ÙÒ ×ØÖÙ ØÓÖ Ú ÖØÙ Ð ÒÒ × Ö Ó ÔÙ
   ÖÖ Ö ÙÒ Óר Ò ×Ô Ó ÓÒ× Ö Ð º             ÑÓ׸ Ô٠׸ Ò ÓÒØÖ Ö ÙÒ ×ÓÐÙ ÓÒ ÕÙ
2.4. Listas Enlazadas                                                                                              89




              Dlink                                                                                  Dlink::Iterator
  #prev: Dlink *                                                               +Iterator()
  #next: Dlink *                                                               +Iterator(in head_ptr:Dlink*)
  +Dlink()                                                                     +Iterator(in head_ptr:Dlink*,in curr_ptr:Dlink*)
  +Dlink(link:const Dlink&)                                                    +Iterator(in Iterator:itor)
  +reset(): void                                                               +operator =(in itor:Iterator): Iterator&
  +isEmpty(): bool                  +exporta                                   +operator =(in itor:Iterator): Iterator
  +insert(node:Dlink*)                                                         +reset_first(): void
  +append(node:Dlink*)                                                         +reset_last(): void
  +get_next(): Dlink*                                                          +get_current(): Dlink*
  +del(): void                                                                 +has_current(): bool
  +remove_prev(): Dlink*                                                       +prev(): void
  +remove_next(): Dlink*                                                       +next(): void

                                                                                               T:class
                                                                            Dnode
                   Node:<template <class> class
                   T:class                               +get_next(): Dnode<T>*&
                                                         +get_prev(): Dnode<T>*&                         +exporta
    MetaDlistNode
                                                         +remove_prev(): Dnode<T>*&                                                      T:class
                                                         +remove_next(): Dnode<T>*&                                    Dnode::Iterator
                                                         +Dnode()
                                                                                                               +get_current(): Dnode<T>*
                      T:class                            +Dnode(_data:const T&)
                                                                                                               +del(): Dnode<T>
                      Node_Type:template <class> class   +operator =(_data:const T&): Dnode&
        GenDlist                                         +get_data(): T&
                              +exporta
+get_first(): Node*
+get_last(): Node*
+remove_first(): Node*
+remove_last(): Node*
                                                                                                                                         T:class
                                                                                                                    GenDlist<T>::Iterator
                                                                                                               +get_current(): Dnode<T>*
                                                                     +con               T:class
GenDlist<Dlist_Node, T>                                                                                        +del(): Dnode<T>
                                                                                 Dlist_Node
    Especialización

                                     GenDlist<Dlist_Node_Vtl, T>
                                           Especialización                    +con                        T:class
                                                                                          Dlist_Node_Vtl


                                                                                              class T:
                                                   T:class                   DynDlist
                   T:class
                                        DlistVtl               +DynDlist()                           +exporta
                   Dlist
                                   Con nodos virtuales         +insert(_data:const T&): void                                             T:class
                                                               +append(_data:const T&): void                        DynDlist<T>::Iterator
                                                               +get_first(): T&
                                                               +get_last(): T&                                 +get_current(): T
                                                               +remove_first(): T                              +del()
                                                               +remove_last(): T                               +insert(in item:T)
                                                               +~DynDlist()                                    +append(in item:T)




               ÙÖ ¾º½              ÖÑ          Ò Ö Ð ÍÅÄ        Ð × Ð × × ALEPH Ô Ö Ð ×Ø × ÒÐ Þ                      × ÓÐ×
90                                                       Cap´
                                                                ıtulo 2. Secuencias



    Ð Ô ÖÑ Ø Ð Ù×Ù Ö Ó ÙØ Ð Þ Ö Ñ × ÐØ ÖÒ Ø Ú × × ÙÒ ×Ù ÓÒÚ Ò Ò º × Ö¸ ÕÙ Ð
          × Ù× Ð ×Ø × ÒÓ Ó× ÓÒ ×ØÖÙ ØÓÖ × Ú ÖØÙ Ð × Ó ÒÓº
       ÍÒ ×ÓÐÙ ÓÒ ×Ø ÔÖÓ Ð Ñ ÓÒ× ×Ø Ò ÔÖÓÚ Ö Ó× Ð × × Ö ÒØ × ÒÓ Ó×
¼      ¬Ò ÓÒ ÒÓ Ó× Ó Ð × ¼ ≡                                    ´ µ
          template <typename T>
      class Dlist_Node : public Dnode<T>
      {
        Dlist_Node() : Dnode<T>() { /* Empty */ }
        Dlist_Node(const T & _data) : Dnode<T>(_data) { /* Empty */ }
      };
          template <typename T>
      class Dlist_Node_Vtl : public Dlist_Node<T>
      {
        Dlist_Node_Vtl() : Dlist_Node<T>() { /* Empty */ }
        virtual ~Dlist_Node_Vtl() { /* Empty */ }
        Dlist_Node_Vtl(const T & _data) : Dlist_Node<T>(_data) { /* Empty */ }
      };
    Í× × Dnode    º
       Ë × Ö ÕÙ Ö ÙÒ Ð ×Ø ÙÝÓ× ÒÓ Ó× ÒÚÓÕÙ Ò ÐÓ× ×ØÖÙ ØÓÖ × Ð × Ð × × Ö Ú ×¸
     ÒØÓÒ × Ð Ð ÒØ ÙØ Ð Þ ÒÓ Ó× Ø ÔÓ Dlist Node Vtlº Ð Ñ ×ÑÓ ÑÓ Ó¸ × Ð Ð ÒØ
    ÒÓ Ö ÕÙ Ö ÒÚÓ Ö ÐÓ× ×ØÖÙ ØÓÖ ×¸ ÒØÓÒ × ×Ø ÙØ Ð Þ ÒÓ Ó× Ø ÔÓ Dlist Node ÓÒ
     Ð ÓÒ× Ù ÒØ ÓÖÖÓ Ò ×Ô Óº
         ÓÒ× Ö ÑÓ× ÙÒ ÔÖ Ñ Ø Ú ÓÖ Ò Ñ ÒØÓ Ò Ö ×Ó Ö Ð ×Ø × ÒÐ Þ ×
                  template <class Node, typename Key>
              void ordenar(Node * head_list)
              {
                /* ... */
                Node * node = head_list->get_next();
                /* ... */
              }


         ÍÒ Ð ÓÖ ØÑÓ  ÓÖ Ò Ñ ÒØÓ Ö ÕÙ Ö Ö ÓÖÖ Ö ÒÓ Ó× Ð Ð ×Ø º ×ØÓ ×           ØÖ Ú ×
         get next() Ý get prev()ºÙ ÐÕÙ Ö Ø ÔÓ Ð × Ö Ú          Dlist Node ÔÙ Ò ÙØ ¹
    Ð Þ Ö× ÓÑÓ ÒÓ Óº Ë Ò Ñ Ö Ó¸ ÔÙ ×ØÓ ÕÙ get next() Ö ØÓÖÒ ÙÒ ÔÙÒØ ÖÓ Dlist Node¸
      Ð ÓÑÔ Ð ÓÖ Ö Þ Ö ØÓ × Ð × Ð Ò × ÓÒ × × Ò Ð Ö ×ÙÐØ Ó get next() ÙÒ ÔÙÒ¹
    Ø ÖÓ ÙÒ Ð × Ö Ú           Dlist Nodeº
        È Ö Ú Ø Ö Ð ÔÖÓ Ð Ñ ÒØ Ö ÓÖ¸ Ö ÕÙ Ö ÑÓ× ÕÙ get next() Ý get prev() Ö ØÓÖÒ Ò
    ÔÙÒØ ÖÓ× Ð Ð × Ö Ú Ý ÒÓ Ð Ð × Dlist Nodeº ÍÒ ×ÓÐÙ ÓÒ × ÙØ Ð Þ Ö ÙÒ Ð ×
      ÒÚÓÐØÓÖ    Ð Ð × ÒÓ Ó ÙØ Ð Þ ÕÙ        ØÙ Ð × ÓÒÚ Ö× ÓÒ × Ý Ö ØÓÖÒ ÔÙÒØ ÖÓ× Ð
    Ø ÔÓ ÓÖÖ ØÓº Ì Ð Ð × Ø Ò Ð × Ù ÒØ ×Ô ¬ ÓÒ
¼      ÒÚÓÐØÓÖ Ó ÒÓ Ó× Ó Ð × ¼ ≡                                     ´ µ
          template <template <class> class Node, typename T>
      class MetaDlistNode : public Node<T>
      {
        MetaDlistNode() { /* Empty */ }
        MetaDlistNode(const T& _data) : Node<T>(_data) { /* Empty */ }
        MetaDlistNode(const MetaDlistNode<Node, T> & node) : Node<T>(node)
        { /* Empty */ }
2.4. Listas Enlazadas                                                            91



        MetaDlistNode<Node, T> *& get_next()
        {
          return reinterpret_cast<MetaDlistNode<Node, T> *&>(Node<T>::get_next());
        }
        MetaDlistNode<Node, T> *& get_prev()
        {
          return reinterpret_cast<MetaDlistNode<Node, T> *&>(Node<T>::get_prev());
        }
      };
       MetaDlistNode         ÒÓ Ø Ò Ñ Ñ ÖÓ× ØÓ Ò ÙÒ ÓÒ × Ú ÖØÙ Ð ×º Ä Ð × × Ö Ú
    ÔÙ Ð Ñ ÒØ            ÙÒ Ð × Ô Ö Ñ ØÖÓ Node<T> ÕÙ         × Ö × Ò ÒØ Dlist Nodeº
      Ò ×Ò ¸ Ð          ÖÓÐ      MetaDlistNode ×    Ö ÒØ Þ Ö ÕÙ Ð × ÙÒ ÓÒ × get next()
    Ý get prev() ×      ÑÔÖ Ö ØÓÖÒ Ò ÔÙÒØ ÖÓ× Ð Ñ ×ÑÓ Ø ÔÓº
         ÐÑ Ò Ó          Ð ×Ø × × Ö Ð Þ ¸ ÒØÓÒ ×¸ Ò ÙÒ ÓÒ ÒÓ Ó× Ø ÔÓ MetaDlistNode
½    Ä ×Ø Ó Ð Ò         Ö ½ ≡                                          ´ µ
          template <template <class> class Node_Type, typename T>
      class GenDlist : public MetaDlistNode<Node_Type, T>
      {
           Å Ñ ÖÓ× ÔÙ Ð Ó×        Ò Ð ×Ø ½
      };
      ¬Ò ×
      GenDlist¸   Ù×   Ò ÙÒ × ½     Ò   ¾º
    GenDlist<T>     Ö Ô ÖØ     ÒØ Ö Þ ÑÔÐ ÒØ ÓÒ             Dnode<T>º Ò Ò     ÙÖ ¸ Ð
     ÖÒ          ÕÙ this × Ð ÒÓ Ó     Ö Ð Ð ×Ø º            ÓÖ ÓÒ Ö Ø ÑÓ× Ó× ×Ô Ð¹
    Þ ÓÒ × GenDlist<T>
½   Ä ×Ø × Ó Ð × ÜØÖ ÑÓ× ½ ≡                                           ´ µ
          template <typename T>
      class Dlist : public GenDlist<Dlist_Node, T>
      {
        typedef typename GenDlist<Dlist_Node, T>::Node Node;
        typedef typename GenDlist<Dlist_Node, T>::Iterator Iterator;
      };
          template <typename T>
      class DlistVtl : public GenDlist<Dlist_Node_Vtl, T>
      {
        typedef typename GenDlist<Dlist_Node_Vtl, T>::Node Node;
        typedef typename GenDlist<Dlist_Node_Vtl, T>::Iterator Iterator;
      };
    Í× × GenDlist ½ º
      Ë Ð Ù×Ù Ö Ó Ö ÕÙ Ö Ñ Ò Ö ÒÓ Ó× ÓÒ ÒÚÓ ÓÒ ×ØÖÙ ØÓÖ × Ð × × Ö Ú ×
     ÐÓ× ÒÓ Ó׸ ÒØÓÒ × ×Ø ÙØ Ð Þ Ð Ð × DlistVtl<T> ÐÓ ÓÒØÖ Ö Ó ÙØ Ð Þ Dlist<T>º
      Dlist<T> Ý DlistVtl<T> ×ÓÒ Ñ Ö × ×Ô      Ð Þ ÓÒ × GenDlist<T>º ÈÙ ×ØÓ ÕÙ
     Ý Ö Ú ÓÒ ÔÙ Ð ¸ ÐÓ× Ñ ØÓ Ó× ×Ø Ò ÓÒØ Ò Ó× Ò GenDlist<T>º
      GenDlist<T> ÙØ Ð Þ ÒÓ Ó×     Ø ÔÓ Node Type<T>º ×ØÓ ×        Ñ Ò Ö × ÑÔÐ
    Ñ ÒØ
½   Å Ñ ÖÓ× ÔÙ Ð Ó× Ò Ð ×Ø ½ ≡                              ´½µ ¾
      typedef MetaDlistNode<Node_Type,T> Node;
92                                                      Cap´
                                                               ıtulo 2. Secuencias



    Ä × ÙÒ ÓÒ × GenDlist<T> × Ñ Ò Ò¸ ÒØÓÒ ×¸ Ò ÙÒ ÓÒ GenDlist<T>::Nodeº
        ÈÙ ×ØÓ ÕÙ GenDlist<T> Ö Ú ÔÙ Ð Ñ ÒØ Node Type<T>¸ GenDlist<T> ÔÓ×
      ØÖ Ú × this ÙÒ ÒÓ Ó        Öº
        À Ý Ó× Ñ Ò Ö × Ò× ÖØ Ö Ò GenDlist<T> ÔÓÖ Ð Ö ÒØ Ó ÔÓÖ Ð ¬Ò к ÄÓ× Ñ ØÓ Ó×
     ר Ò ÑÔÐ ÒØ Ó× ÔÓÖ ÐÓ× Ñ Ñ ÖÓ× insert() Ý append() Ô ÖØ Ò ÒØ × Dnode<T>º
        È Ö Ð ÓÒ×ÙÐØ ¸      ÑÓ× ÒרÖÙÑ ÒØ Ö ÙÒ Ô ÖØ Ò GenDlist<T> ÕÙ Ö Ð Ð
     ÓÒÚ Ö× ÓÒ      GenDlist::Nodeº      ÓÒ×ÙÐØ ר       ÔÓÖ Ð × × Ù ÒØ × ÙÒ ÓÒ ×
¾    Å Ñ ÖÓ× ÔÙ Ð Ó× Ò Ð ×Ø ½ +≡                        ´½µ ½ ¾
     Node * get_first()
     {
       return this->get_next();
     }
     Node * get_last()
     {
       return this->get_prev();
     }
         ÈÙ ×ØÓ ÕÙ Ð Ð Ñ Ò ÓÒ Ö ØÓÖÒ Ð ÒÓ Ó Ð Ñ Ò Ó¸ ר Ø Ñ Ò Ö ÕÙ Ö ÓÒÚ Ö× ÓÒ
          GenDlist::Node
¾   Å Ñ ÖÓ× ÔÙ Ð Ó×     Ò Ð ×Ø ½   +≡                    ´½µ     ¾   ¾
     Node * remove_first()
     {
       Node* retValue = this->get_next();
       retValue->del();
       return retValue;
     }
     Node * remove_last()
     {
       Node* retValue = this->get_prev();
       retValue->del();
       return retValue;
     }


    2.4.9.2   Iterador de Dlist<T>

    Ð Ù Ð ÕÙ Dlink Ý Dnode<T>¸ GenDlist<T> ÜÔÓÖØ ÙÒ ×Ù Ð ×                       ØÖ¹
    ÓÖ GenDlist<T>::Iterator ÙÝ ÑÔÐ ÒØ ÓÒ × ×Ô ¬ ÓÑÓ × Ù
¾   Å Ñ ÖÓ× ÔÙ Ð Ó× Ò Ð ×Ø ½ +≡                   ´½µ ¾
     class Iterator : public Node::Iterator
     {
       Iterator(GenDlist<Node_Type, T> & list) : Dnode<T>::Iterator(&list) { }
       Iterator() : Dnode<T>::Iterator() { /* empty */ }
       Iterator(const Iterator & it) : Dnode<T>::Iterator(it) { /* Empty */ }
       Iterator & operator = (const Iterator & it)
       {
         Dnode<T>::Iterator::operator = (it);
         return *this;
       }
       Node * get_current()
       {
2.4. Listas Enlazadas                                                                93



          return reinterpret_cast<Node*>(Dnode<T>::Iterator::get_current());
        }
        Node * del() { return static_cast<Node*>(Dnode<T>::Iterator::del()); }
      };
    Í× × Dnode       Ò   GenDlist   ½º


    2.4.10       El TAD DynDlist<T>
    Ä × Ð × × Dnode<T> Ý Dlist<T> ×ÓÒ ×Ù¬ ÒØ Ñ ÒØ Ú Ö× Ø Ð × ÓÑÓ Ô Ö Ö Ð Þ Ö ÔÐ ¹
      ÓÒ × ÓÑÔÐ × ÕÙ Ö ÕÙ Ö Ò Ð ×Ø × Ó Ð Ñ ÒØ ÒÐ Þ ×º Ë Ò Ñ Ö Ó¸ ר × Ð × × ÙÒ
    Ö ÕÙ Ö Ò ÕÙ Ð ÔÖÓ Ö Ñ ÓÖ ÓÑÔÖ Ò           ÐÑ ÒØ ×Ù× ×ÙØ Ð Þ × Ù×Ó Ò Ô ÖØ ÙÐ Ö¸
     Ð Ñ Ò Ó Ñ ÑÓÖ º
         Ò ÙÒ ÙÐØ ÑÓ Ò Ú Ð¸ × Ò ÑÓ× Ð Ð × DynDlist<T>¸ Ð Ù Ð ÑÓ Ð Þ ÙÒ Ð ×Ø Ó Ð ¹
    Ñ ÒØ ÒÐ Þ         Ö ÙÐ Ö ÓÒ Ñ Ò Ó ÒØ ÖÒÓ Ñ ÑÓÖ º DynDlist<T> × ×Ô ¬
     ÑÔÐ ÒØ Ò Ð Ö ÚÓ ØÔÐ ÝÒ Ð ×ØºÀ ¿
¿    ØÔÐ ÝÒ Ð ×ØºÀ ¿ ≡
          template <typename T>
      class DynDlist : public Dnode<T>
      {
         Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿
      };
      ¬Ò ×
      DynDlist¸   Ù× Ò ÙÒ × ¿ß ¸ ¸ ½¼¾ ¸ ½¼ ¸ ½¼ ¸ ½¼ ¸ ½ ¸ ¾¾¼¸ ¾ ¿ ¸ ¾ ¸ ¼¿ ¸ ¼ ¸ ¼ ¸ ¿ ¸
           ¿ ¸     ß ¸ ¸   ¸ ¸ ¾ß ¸ ½ß ¿¸ ½¸           ¸ ¼¿ ¸ ½ ß½ ¸ ¾¿¸ Ò ¾ º
    Í× × Dnode      º
       Ä           DynDlist<T>× ÕÙ ×ÓÔÓÖØ ØÓ Ð ÙÒ ÓÒ Ð     ÕÙ ÖÖ ×ØÖ ÑÓ× ×
    Dlink × Ò Ò ×         Ô Ò× Ö Ò Ð Ñ Ò Ó ÔÙÒØ ÓÖ ×¸ ÒÓ Ó× Ý Ñ ÑÓÖ º
        DynDlist<T> Ö       ÔÙ Ð Ñ ÒØ ×Ù ÑÔÐ ÒØ ÓÒ Ð Ð × Dlist<T> Ý ÙÒ Ù Ò
    Ô ÖØ ×Ù ÒØ Ö Þº Ä Ö ×ÔÓÒ× Ð          × Ò Ð DynDlist<T> × Ð Ñ Ò Ó Ñ ÑÓ¹
    Ö º
         Ð ÙÒ Ó ØÖ ÙØÓ DynDlist<T> × num elem¸ Ð Ù Ð ÓÒØ Ð Þ Ð ÒØ
     Ð Ñ ÒØÓ× ÕÙ ÔÓ× Ð Ð ×Ø Ý ÔÙ Ó × ÖÚ Ö× Ñ ÒØ
¿    Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ ≡                      ´¿µ ¿
      const size_t & size() const { return num_elem; }
      Ä ÓÒרÖÙ ÓÒ × ÑÙÝ × ÑÔÐ ¸ Ô٠׸ Ð Ü Ô ÓÒ Ð Ñ Ò Ó Ñ ÑÓÖ Ý Ð
    ÓÒØ Ð Þ ÓÒ Ð ÒÙÑ ÖÓ Ð Ñ ÒØÓ׸ ØÓ Ó ×Ø ÑÔÐ ÒØ Ó × Ð Ð × Dlist<T>
¿   Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡            ´¿µ ¿ ¿
      DynDlist() : num_elem(0) { /* Empty */ }
    Í× × DynDlist ¿ º
         Ð Ù Ð ÕÙ Ò Dlist<T>¸ ÔÓ ÑÓ× Ò× ÖØ Ö Ð Ñ ÒØÓ× ÔÓÖ Ð ÔÖ Ò Ô Ó Ó ¬Ò Ð              Ð
    Ð ×Ø
¿    Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡                ´¿µ ¿
      T & insert(const T & _data)
      {
        Dnode<T> * p = new Dnode<T> (_data);
        Dnode<T>::insert(p);
94                                               Cap´
                                                    ıtulo 2. Secuencias



      ++num_elem;
      return p->get_data();
  }
  T & append(const T & _data)
  {
    Dnode<T> * p = new Dnode<T> (_data);
    Dnode<T>::append(p);
    ++num_elem;
    return p->get_data();
  }
Í× × Dnode   º
  Ä × Ñ ×Ñ × ÓÔ Ö ÓÒ × × ¬Ò Ô Ö Ð ×Ø × ×    Ö¸ × ÔÙ       ÓÒ Ø Ò Ö ÙÒ Ð ×Ø
ÒØ Ö Ø ÒØÓ ÔÓÖ Ð ÔÖ Ò Ô Ó ÓÑÓ ÔÓÖ Ð ¬Ò Ð
Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡              ´¿µ     ¿
  size_t insert_list(DynDlist & list)
  {
    Dlink::insert_list(&list);
    num_elem += list.num_elem;
    list.num_elem = 0;
    return num_elem;
  }
  size_t append_list(DynDlist & list)
  {
    Dlink::append_list(&list);
    num_elem += list.num_elem;
    list.num_elem = 0;
    return num_elem;
  }
Í× × DynDlist ¿ º
     Ð ×Ó ÙÒ × Ù Ò DynDlist<T> × Ö Ð Þ ÔÓÖ ÙÒÓ ×Ù× ÜØÖ ÑÓ× Ð ÔÖ Ñ Ö
Ó Ð ÙÐØ ÑÓ Ð Ñ ÒØÓ
 Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡           ´¿µ
  T & get_first()
  {
    return this->get_next()->get_data();
  }
  T & get_last()
  {
    return this->get_prev()->get_data();
  }
 Ñ Ó× Ñ ØÓ Ó× Ö ØÓÖÒ Ò Ö Ö Ò × Ð ØÓ Ò ÐÙ Ó ÒØÖÓ Ð Ð ×Ø º ×ØÓ × Ò ¬ ÕÙ
Ð Ù×Ù Ö Ó ÔÙ ÑÓ ¬ ÖÐÓ× Ö Ø Ñ ÒØ º
   ÌÖ ÓÒ ÐÑ ÒØ ¸ Ð Ð Ñ Ò ÓÒ × Ö Ð Þ ÔÓÖ Ð ÙÒÓ ÐÓ× ÜØÖ ÑÓ×
Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡               ´¿µ
  T remove_first()
  {
    Dnode<T> * ptr = this->remove_next();
      Ó Ø Ò Ö ØÓ Ý Ð Ö Ö ÔØÖ
  }
2.4. Listas Enlazadas                                                   95



  T remove_last()
  {
    Dnode<T> * ptr = this->remove_prev();
       Ó Ø Ò Ö ØÓ Ý Ð Ö Ö ÔØÖ
  }
Í× × Dnode   º
Ó Ø Ò Ö ØÓ Ý Ð Ö Ö ÔØÖ          ≡                         ´   µ
  T retVal = ptr->get_data();
  delete ptr;
  --num_elem;
  return retVal;

                   ×ÙÔÖ Ñ Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ¸ remove last() Ð ÙÐØ ÑÓº
      remove first()                                                ÖÒ
   Ð ÓÒ×ÙÐØ ¸ Ð Ð Ñ Ò ÓÒ Ö ØÓÖÒ ÓÔ × ÐÓ× Ú ÐÓÖ ×¸ ÒÓ Ö Ö Ò ×¸ ÔÙ × Ð ÒÓ Ó
 ×      Ü ×Ø Ö ×ÔÙ × Ð Ö Ö Ð Ñ ÑÓÖ Ó ÙÔ ÔÓÖ Ð ÒÓ Óº
    × ÔÓ× Ð Ú Ö ÙÒ Ð ×Ø ×ØÓ × Ð Ñ Ò Ö ØÓ Ó× ×Ù× Ð Ñ ÒØÓ×
Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡                     ´¿µ
  void empty()
  {
    while (not this->is_empty())
      delete this->remove_next();
    num_elem = 0;
  }
ר ÔÖ Ñ Ø Ú       × Ö ÒÚÓ    ÔÓÖ Ð ×ØÖÙ ØÓÖ
Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡                ´¿µ
  ~DynDlist()
  {
    empty();
  }
Í× × DynDlist ¿ º
     Ò Ð ÙÒ × Ö ÙÒר Ò × × ÑÙÝ ÙØ Ð ÔÓ Ö Ð Ñ Ò Ö ÙÒ Ð Ñ ÒØÓ ÕÙ ×       ÑÓ×
Ô ÖØ Ò     Ð × ÙÒ
 Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡              ´¿µ
  void remove(T & data)
  {
    Dnode<T> * p = data_to_node(data);
    p->del();
    delete p;
    --num_elem;
  }
Í× × Dnode   º
   ÍÒ ÔÖ Ñ Ø Ú × Ò Ð Ô Ö Ð × ÑÔ ÒÓ Ý Ð Ò         Ð ÙÒÓ× Ð ÓÖ ØÑÓ× × swap()º
  ÓÑÓ ØÓ Ó Ð ØÖ Ó Ý Ù ÑÔÐ ÒØ Ó × Ð Ð ×        Dlink¸ÒÙ ×ØÖ ÔÖ Ñ Ø Ú ×ÓÐÓ ×
Ö Ñ Ø Ø Ô Ö ÒÚÓ Ö
 Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡               ´¿µ
  void swap(DynDlist & l)
  {
    Aleph::swap(num_elem, l.num_elem);
96                                                       Cap´
                                                            ıtulo 2. Secuencias



      this->Dlink::swap(&l);
  }
Í× × DynDlist ¿ º
   ÇØÖ ÓÖÑ        ÑÓ ¬ ÓÒ ÙÒ Ð ×Ø Ò Ñ × Ð Ô ÖØ ÓÒ ÕÙ Ø Ø Ú º                רÓ
ÔÙ Ö Ð Þ Ö× × Ð Ñ ØÓ Ó Dlink::split list()
 Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡          ´¿µ
  void split_list(DynDlist & l, DynDlist & r)
  {
    Dlink::split_list(l, r);
    l.num_elem = r.num_elem = num_elem/2;
    if (num_elem % 2 == 1) // ¿es num_elem impar?
      l.num_elem++;
    num_elem = 0;
  }
Í× × DynDlist ¿ º

2.4.10.1     Iterador de DynDlist<T>

À ר Ð ÔÖ × ÒØ ¸ Ð Ò× Ö ÓÒ¸ Ð Ñ Ò ÓÒ Ý ÓØÖ × ÓÔ Ö ÓÒ × ÑÓ ¬ ÓÒ ×Ø Ò
Ö ×ØÖ Ò × ÐÓ× ÜØÖ ÑÓ× Ð Ð ×Ø º Ë ÙÒ ÔÐ ÓÒ Ö ÕÙ Ö ÑÓ ¬ ÓÒ Ò ÔÓ× ÓÒ ×
    Ö ÒØ ׸ ÒØÓÒ × ×Ø ÔÙ × ÖÚ Ö×    ÙÒ Ø Ö ÓÖ ÙÒ Ó ÓÔ Ö ÓÒ × ×Ô Ð ×
×Ó Ö Ð Ð Ñ ÒØÓ ØÙ Ð
 Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡                ´¿µ
  class Iterator : public Dnode<T>::Iterator
  {
    DynDlist * list_ptr; // puntero a la lista
    int        pos;      // posici´n del elemento actual en la secuencia
                                  o
     Ñ ØÓ Ó× Ø Ö ÓÖ DynDlist<T>
  };
Í× × Dnode        Ò   DynDlist   ¿º
Ä Ð × Ù Ö ÙÒ ÔÙÒØ ÓÖ Ð Ð ×Ø ÓÒ              Ð ÔÖÓÔÓ× ØÓ Ñ ÒØ Ò Ö Ð ÓÒØ ÓÖ
 Ð Ñ ÒØÓ×     ר Ñ Ò Ö × ÔÙ    ØÙ Ð Þ Ö    Ð ÓÒØ ÓÖ Ù Ò Ó ×    ÙØ Ò ÓÔ Ö ÓÒ ×
×Ó Ö Ð Ø Ö ÓÖ ÕÙ ÑÓ ¬ÕÙ Ò Ð ÒØ               Ð Ñ ÒØÓ׺
     Ð ØÖ ÙØÓ pos Ö ­ Ð ÔÓ× ÓÒ ÓÖ Ò Ð      ÒØÖÓ Ð × Ù Ò      Ð Ð Ñ ÒØÓ ØÙ Ð Ý
ÔÙ Ó × ÖÚ Ö× Ñ ÒØ
 Ñ ØÓ Ó× Ø Ö ÓÖ DynDlist<T> ≡                              ´   µ
  const int & get_pos() const { return pos; }
  È Ö Ñ ÒØ Ò Ö ÓÖÖ Ø Ñ ÒØ Ð ×Ø Ó ×Ø Ú ÐÓÖ¸       ÑÓ× ×Ó Ö Ö Ö Ð × ÙÒ ÓÒ ×
   ÚÒ      Ð Ø Ö ÓÖ¸ Ñ Ò Ö Ø Ð ÕÙ ØÙ Ð Ò ×Ù Ú ÐÓÖ
Ñ ØÓ Ó× Ø Ö ÓÖ DynDlist<T> +≡                   ´ µ
  const int & next()
  {
    Dnode<T>::Iterator::next();
    pos++;
    return pos;
  }
Í× × Dnode    º
2.4. Listas Enlazadas                                                           97



     Ð Ñ Ò Ó Ð ÔÓ× ÓÒ Ð Ð Ñ ÒØÓ ØÙ Ð Ð Ø Ö ÓÖ Ø Ñ Ò Ö ÕÙ Ö ×Ó Ö Ö Ö
ÐÓ× Ñ ØÓ Ó× reset first() Ý reset last()º
    È Ö Ö Ö ÙÒ Ø Ö ÓÖ¸ ×ÓÐÓ × Ö ÕÙ Ö ÙÒ Ð ×Ø Ó ÔÓÖ ÓÔ  ÓØÖÓ Ø Ö ÓÖ
 Ñ ØÓ Ó× Ø Ö ÓÖ DynDlist<T> +≡                     ´ µ
  Iterator(DynDlist<T> & _list)
    : Dnode<T>::Iterator(_list), list_ptr(&_list), pos(0)
  { /* Empty */ }
  Iterator(const Iterator & it)
    : Dnode<T>::Iterator(it), list_ptr(it.list_ptr), pos(it.pos)
  { /* Empty */ }
  Iterator() : list_ptr(NULL){ /* empty */ }
  Iterator & operator = (const Iterator & it)
  {
    Dnode<T>::Iterator::operator = (it);
    list_ptr = it.list_ptr;
    pos      = it.pos;
    return *this;
  }
Í× × Dnode       Ò   DynDlist   ¿º
  has current() ×          Ö     Ð Ð × × Dlinkº
  Dlist<T> ØÖ             Ò ÙÒ ÓÒ ÒÓ Ó× Ý ÒÙ ×ØÖÓ Ø Ö ÓÖ    ØÖ   Ö Ò ÙÒ ÓÒ
Ð Ñ ÒØÓ× Ø ÔÓ Tº        ÈÓÖ × Ö ÞÓÒ   ÑÓ× ×Ó Ö Ö Ö get current()
Ñ ØÓ Ó× Ø Ö ÓÖ     DynDlist<T>     +≡                  ´ µ
  T & get_current() { return Dnode<T>::Iterator::get_current()->get_data(); }
Í× × Dnode   º
   Ä Ò× Ö ÓÒ Ý ×ÙÔÖ × ÓÒ Ñ ÒØ Ð Ø Ö ÓÖ             Dlist<T> × Ö Ø ÔÓÖÕÙ
Dlist<T>   Ñ Ò Ð Ñ ÒØÓ× Ø ÔÓ Dnode<T> ÕÙ ÔÓ× Ò ×Ù× ÔÖÓÔ × ÔÖ Ñ Ø Ú ×
Ò× Ö ÓÒ Ý ×ÙÔÖ × ÓÒº Ò ÒÙ ×ØÖÓ ×Ó¸ ÒÓ × ÔÓ× Ð Ö Ð Þ Ö ×ØÓ ÔÓÖÕÙ Ñ Ò ÑÓ× Ð ¹
Ñ ÒØÓ× Ò Ö Ó× Ø ÔÓ Tº × Ô٠׸ Ö ÕÙ Ö ÑÓ× ÕÙ Ð Ø Ö ÓÖ ÜÔÓÖØ ÙÒ ÓÒ × ÕÙ
Ô ÖÑ Ø Ò Ò× ÖØ Ö Ý Ð Ñ Ò Öº
   Ä Ò× Ö ÓÒ Ð ÔÖ × ÒØ ÑÓ× Ó Ð × Ñ ×Ñ × ÓÖÑ × ÕÙ DynDlist<T>
 Ñ ØÓ Ó× Ø Ö ÓÖ DynDlist<T> +≡                      ´ µ
  void insert(const T & _data)
  {
    Dnode<T>::Iterator::get_current()->insert(new Dnode<T>(_data));
    ++list_ptr->num_elem;
  }
  void append(const T & _data)
  {
    Dnode<T>::Iterator::get_current()->append(new Dnode<T>(_data));
    ++list_ptr->num_elem;
  }
Í× × Dnode   º
  Ä × ÓØÖ × Ñ Ò Ö × Ò× ÖØ Ö ×ÓÒ Ð ×Ø × ÒØ Ö × Ô ÖØ Ö Ð Ð Ñ ÒØÓ ØÙ Ð
Ñ ØÓ Ó× Ø Ö ÓÖ DynDlist<T> +≡                       ´ µ
  void insert_list(const DynDlist & list)
  {
    Dnode<T>::Iterator::get_current()->insert_list(&list);
98                                                        Cap´
                                                             ıtulo 2. Secuencias



     list_ptr->num_elem += list.num_elem;
     list.num_elem = 0;
  }
  void append_list(const DynDlist & list)
  {
    Dnode<T>::Iterator::get_current()->append_list(&list);
    list_ptr->num_elem += list.num_elem;
    list.num_elem = 0;
  }
Í× × Dnode       Ò   DynDlist   ¿º
  Ä ×ÙÔÖ × ÓÒ Ð Ú ÑÓ× ÓÑÓ Ð ×ÙÔÖ × ÓÒ Ð Ð Ñ ÒØÓ ØÙ Ð
Ñ ØÓ Ó× Ø Ö ÓÖ DynDlist<T> +≡                   ´ µ
  T del()
  {
    Dnode<T> * ptr = Dnode<T>::Iterator::get_current();
    T ret_val = ptr->get_data();
    Dnode<T>::Iterator::next();
    ptr->del();
    delete ptr;
    --list_ptr->num_elem;
    return ret_val;
  }
Í× × Dnode   º
  Ä ÓÔ Ö ÓÒ del() ÔÙ × Ö ÑÙÝ Ö ×ØÖ Ø Ú Ò Ð × ÒØ Ó ÕÙ Ú ÒÞ Ð Ø Ö ÓÖ
  Ñ ×¸ ÐÓ     Ò ÙÒ ×ÓÐÓ × ÒØ Óº ÆÓ× ÓÒÚ Ò ¸ Ô٠׸ Ó Ö Ö Ð ÔÖ Ñ Ø Ú × Ð Ñ Ò ÓÒ
 ÓÒØ ÜØÙ Ð × × Ö¸ Ð ÔÖ          ×ÓÖ Ó ×Ù ×ÓÖ Ð Ð Ñ ÒØÓ ØÙ Ð
Ñ ØÓ Ó× Ø Ö ÓÖ DynDlist<T> +≡                         ´ µ
  T remove_prev()
  {
    Dnode<T> * curr_ptr = Dnode<T>::Iterator::get_current();
    Dnode<T> * ptr = curr_ptr->remove_prev();
    T ret_val = ptr->get_data();
    delete ptr;
    --list_ptr->num_elem;
    return ret_val;
  }
  T remove_next()
  {
    Dnode<T> * curr_ptr = Dnode<T>::Iterator::get_current();
    Dnode<T> * ptr = curr_ptr->remove_next();
    T ret_val = ptr->get_data();
    delete ptr;
    --list_ptr->num_elem;
    return ret_val;
  }
Í× × Dnode   º
    Ä ÙÐØ Ñ ÓÔ Ö ÓÒ ÑÓ ¬ ÓÒ ÙÒ Ð ×Ø Ò Ñ Ñ ÒØ ÙÒ Ø Ö ÓÖ ÔÙ
× Ö ÑÙÝ ÙØ Ð Ò Ð ÙÒÓ× ×Ó× × ØÖ Ø Ð ÓÖØ ÙÒ Ð ×Ø Ô ÖØ Ö Ð ÔÓ× ÓÒ ØÙ Ð
  Ð Ø Ö ÓÖ
2.4. Listas Enlazadas                                                          99



Ñ ØÓ Ó× Ø Ö ÓÖ     DynDlist<T>     +≡                      ´ µ
  size_t cut_list(DynDlist & list)
  {
    list_ptr->Dnode<T>::cut_list(Dnode<T>::Iterator::get_current(), &list);
    list.num_elem = list_ptr->num_elem - pos; // actualizar cardinalidad de list
    list_ptr->num_elem -= pos; // actualizar cardinalidad de ptr_list.
    return list.num_elem;
  }
Í× × Dnode     Ò    DynDlist   ¿º
    Ð Ø Ö ÓÖ Ô ÖÑ Ø ÙÒ Ñ Ò Ö ÓÒ × Ý ÜÔÖ × Ú           ÓÔ Ö Ð ×Ø ×
 ÓÔ Ö Ð ×Ø    ≡                                                     ´ µ
  for (typename DynDlist<T>::Iterator itor(const_cast<DynDlist&>(list));
    itor.has_current();itor.next())
  this->append(itor.get_current());
Í× × DynDlist ¿ º
  ÄÓ ÕÙ Ô ÖÑ Ø ÑÔÐ ÒØ Ö Ð × Ò ÓÒ Ý Ð ÓÒרÖÙ ØÓÖ ÓÔ
Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡               ´¿µ
  DynDlist<T> & operator = (const DynDlist & list)
  {
    while (not this->is_empty()) // vaciar this
      this->remove_first();
       ÓÔ Ö Ð ×Ø
      return *this;
  }
Í× × DynDlist ¿ º
     Ð Ñ ×ÑÓ ÑÓ Ó¸ Ð ÓÒרÖÙ ØÓÖ ÓÔ
Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡                      ´¿µ
  DynDlist(const DynDlist & list) : Dnode<T>(list)
  {
    this->reset();
    num_elem = 0;
       ÓÔ Ö Ð ×Ø
  }
Í× × Dnode     Ò    DynDlist   ¿º
Ä ÐÐ Ñ this->reset() × Ò ×Ô Ò× Ð Ô Ö × ÙÖ Ö ÕÙ Ð Ð ×Ø ר ÐÓ Ñ ÒØ
Ú º Ë ÒÓ × Ö Ð Þ × × ¸ ÒØÓÒ × Ð Ú ÐÓÖ this¸ ÕÙ ÙÒ        ÒÓ Ó       Ö¸
 ÓÖÖ ×ÔÓÒ Ö Ð ÓÔ          listº
    Ë Ð ÓÒ ÓÒ Ð ×Ø ÑÔÓ× Ð Ø Ð        ×Ó Ö ØÓ ×Ù× Ð Ñ ÒØÓ׸      ØÓ×
 ÒØ Ö Þ ÔÙ × Ö ÐØ Ñ ÒØ × Ð ×ÔÓÒ Ö Ð ÓÔ Ö ÓÖ        ×Ó ÔÓÖ ÔÓ× ÓÒ
 Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡               ´¿µ
  T & operator [] (const size_t & n)
  {
    DynDlist<T>::Iterator it(*this);
    for (int i = 0; i < n and it.has_current(); i++, it.next()) ;
    return it.get_current();
  }
Í× × DynDlist ¿ º
100                                                             Cap´
                                                                         ıtulo 2. Secuencias



      2.4.11       Aplicaci´n: aritm´tica de polinomios
                           o        e
        ÓÒ× Ö ÑÓ× ÙÒ Ì ÕÙ ÑÓ Ð              ÔÓÐ ÒÓÑ Ó× Ý ×Ù× ÓÔ Ö ÓÒ × × ×º Ì Ð Ì         ר
      Ö Ð Þ Ó Ò Ð Ö ÚÓ ÔÓÐ ÒÓѺ           ½¼¼ ¸ Ð Ù Ð ×     ¬Ò ÓÒØ ÒÙ ÓÒ
½¼¼    ÔÓÐ ÒÓѺ ½¼¼ ≡
          class Polinomio
          {
               Å Ñ ÖÓ× ÔÖ Ú Ó× ÈÓÐ ÒÓÑ Ó ½¼¾
               ÒØ Ö Þ ÈÓÐ ÒÓÑ Ó ½¼¼
          };
          ÁÑÔÐ Ñ ÒØ ÓÒ        Ñ ØÓ Ó× ÈÓÐ ÒÓÑ Ó ½¼¿

         À Ý Ú Ö × Ñ Ò Ö × Ö Ö ÙÒ ÔÓÐ ÒÓÑ Ó¸ Ð ÔÖ Ñ Ö × ÔÓÖ ÓÑ × ÓÒ
½¼¼    ÒØ Ö Þ ÈÓÐ ÒÓÑ Ó ½¼¼ ≡                             ´½¼¼ µ ½¼¼
          Polinomio();
        ר ÓÒרÖÙ ØÓÖ Ö Ð ÔÓÐ ÒÓÑ Ó 0x0º
          È Ö ÓÒרÖÙ Ö ÙÒ ÔÓÐ ÒÓÑ Ó Ù ÐÕÙ Ö ¸ Ð ÔÙÒØÓ          Ô ÖØ    × Ö ÙÒ ÔÓÐ ÒÓÑ Ó   ÙÒ
      ×ÓÐÓ Ø ÖÑ ÒÓ
½¼¼     ÒØ Ö Þ ÈÓÐ ÒÓÑ Ó ½¼¼ +≡                                ´½¼¼ µ ½¼¼ ½¼¼
          Polinomio(const int& coef, const size_t & pot);
       ר ÓÒרÖÙ ØÓÖ Òר Ò         Ð ÔÓÐ ÒÓÑ Ó coef xpot ÔÓÖ   ÑÔÐÓ
      Polinomio p(20, 7);

          ÁÒר Ò ÙÒ ÔÓÐ ÒÓÑ Ó ÓÒ Ú ÐÓÖ 20x7º
          Ë ÕÙ Ö ÑÓ× ÓÒרÖÙ Ö ÙÒ ÔÓÐ ÒÓÑ Ó Ñ × ÓÑÔÐ Ó¸ ÒØÓÒ × ÔÓ ÑÓ× ×ÙÑ Ö Ú Ö Ó×
      Ø ÖÑ ÒÓ× Ñ ÒØ Ð ÓÔ Ö ÓÖ ×ÙÑ
½¼¼     ÒØ Ö Þ ÈÓÐ ÒÓÑ Ó ½¼¼ +≡                        ´½¼¼ µ ½¼¼ ½¼¼
          Polinomio operator + (const Polinomio&) const;
      ÈÓÖ       ÑÔÐÓ¸ Ô Ö ÓÒרÖÙ Ö Ð ÔÓÐ ÒÓÑ Ó 20x7 + 3x3 + x2 + 20¸ ÔÓ ÑÓ×      ØÙ Ö
                  Polinomio p(Polinomio(20, 7) + Polinomio(3, 3) +
                              Polinomio(1, 2) + Polinomio(20, 0));


         ÈÓÖ Ö ÞÓÒ ×  ¬ Ò ÕÙ               × ÙØ Ö ÑÓ× ÔÓר Ö ÓÖÑ ÒØ ¸ × ÓÒÚ Ò ÒØ Ó Ö Ö Ð
      × Ù ÒØ Ú Ö× ÓÒ Ð ×ÙÑ
½¼¼    ÒØ Ö Þ ÈÓÐ ÒÓÑ Ó ½¼¼ +≡                                 ´½¼¼ µ ½¼¼ ½¼¼
          Polinomio& operator += (const Polinomio&);
      Å        ÒØ ר ÓÔ Ö ÓÖ¸ Ð ÔÓÐ ÒÓÑ Ó ÒØ Ö ÓÖ ÔÙ        ÓÒרÖÙ Ö× ÓÑÓ × Ù
                  Polinomio p(20, 7);
                  p += Polinomio(3, 3) + Polinomio(1, 2) + Polinomio(20, 0);

           Ð ÔÖÓ Ù ØÓ Ó× ÔÓÐ ÒÓÑ Ó× × ×Ô ¬ Ñ                ÒØ Ð ÓÔ Ö ÓÖ *
½¼¼    ÒØ Ö Þ ÈÓÐ ÒÓÑ Ó ½¼¼ +≡                                 ´½¼¼ µ ½¼¼ ½¼½
          Polinomio operator * (const Polinomio&) const;
2.4. Listas Enlazadas                                                              101




         ÇØÖ × ÓÔ Ö ÓÒ ×¸ ÕÙ × Ð Ò             Ö Ó׸ ×ÓÒ
½¼½    ÒØ Ö Þ ÈÓÐ ÒÓÑ Ó ½¼¼ +≡                               ´½¼¼ µ ½¼¼ ½¼½
        Polinomio operator - (const Polinomio&) const;
        Polinomio operator / (const Polinomio&) const;
        Polinomio operator % (const Polinomio&) const;
        ר × ÓÔ Ö ÓÒ × ÓÖÖ ×ÔÓÒ Ò Ð ×Ù ×ØÖ ÓÒ¸ Ú × ÓÒ Ý Ö × ÙÓº
          Ä × ÔÐ ÓÒ × ÕÙ ÙØ Ð Ò ÔÓÐ ÒÓÑ Ó× Ö ÕÙ Ö Ö Ò ÙÒ ÓÖÑ              Ö ×Ù×
      Ø ÖÑ ÒÓ׺ È Ö ÐÐÓ¸      ÑÓ× ÔÖÓÚ Ö ÙÒ ÓÒ ÙÒØÓ Ñ Ò ÑÓ ÔÖ Ñ Ø Ú ×º ÍÒ ØÖ ÙØÓ
       × Ò Ð ÙÒ ÔÓÐ ÒÓÑ Ó × ÓÒÓ Ö Ð ÒØ             Ø ÖÑ ÒÓ×
½¼½     ÒØ Ö Þ ÈÓÐ ÒÓÑ Ó ½¼¼ +≡                         ´½¼¼ µ ½¼½ ½¼½
        const size_t & size() const;


         Ê ÕÙ Ö ÑÓ× ÓÒÓ Ö         ÙÒÓ     ÐÓ× Ø ÖÑ ÒÓ׸ ×ØÓ ÐÓ ÔÓ ÑÓ×       ÖÑ     ÒØ
½¼½    ÒØ Ö Þ ÈÓÐ ÒÓÑ Ó ½¼¼     +≡                           ´½¼¼ µ ½¼½ ½¼½
        size_t get_power(const size_t & i) const;
      get power()Ö ØÓÖÒ Ð ÔÓØ Ò ÓÖÖ ×ÔÓÒ ÒØ Ð i¹ × ÑÓ Ø ÖÑ ÒÓ Ö ÒØ        ÖÓ
       ×ÙÑ Ò Ó ÕÙ ÐÓ× Ø ÖÑ ÒÓ× Ð ÔÓÐ ÒÓÑ Ó ×Ø Ò ÓÖ Ò Ó× × Ð Ñ ÝÓÖ ×Ø Ð Ñ ÒÓÖ
      ÔÓØ Ò º Ð Ñ ×ÑÓ ÑÓ Ó¸ Ð ÓÔ Ö ÓÒ
½¼½    ÒØ Ö Þ ÈÓÐ ÒÓÑ Ó ½¼¼ +≡                        ´½¼¼ µ ½¼½ ½¼½
        const int & get_coef(const size_t & i) const;
      Ö ØÓÖÒ Ð Ó ¬ ÒØ ÓÖÖ ×ÔÓÒ ÒØ Ð i¹ × ÑÓ Ø ÖÑ ÒÓº
            Ð Ö Ó Ð ÔÓÐ ÒÓÑ Ó ÔÙ ÓÒ×ÙÐØ Ö× Ñ ÒØ
½¼½     ÒØ Ö Þ ÈÓÐ ÒÓÑ Ó ½¼¼ +≡                                    ´½¼¼ µ ½¼½
        const size_t & get_degree() const;


      2.4.11.1   Implementaci´n de polinomios
                             o

      ÍÒ ÔÖ Ñ Ö Ø ÒØ ÓÒ ÓÑÓ ×ØÖÙ ØÙÖ                 ØÓ Ô Ö Ö ÔÖ × ÒØ Ö ÙÒ ÔÓÐ ÒÓÑ Ó × ÙÒ
       ÖÖ ÐÓº È Ö ÙÒ ÔÓÐ ÒÓÑ Ó         Ö Ó n¸ × Ö × ÖÚ ÙÒ ÖÖ ÐÓ          Ñ Ò× ÓÒ n + 1¸ Ð Ù Ð
       ÓÒØ Ò ÐÓ× Ó ¬ ÒØ ׺ ÆÓ × Ò × Ö Ó ÐÑ Ò Ö Ð ÔÓØ Ò ¸ ÔÙ × ×Ø × Ö ÔÖ × ÒØ
      Ñ ÒØ Ð ÔÖÓÔ Ó Ò             Ð ÖÖ ÐÓº
             Ò Ô Ö Ò ¸ Ð ÖÖ ÐÓ Ó Ö Ú ÒØ × ÒÓÑ Ò Ð × ÔÓÖ ÑÔÐÓ¸ Ð ×ÙÑ × Ö Ø ¹
      Ñ ÒØ Ð ×ÙÑ Ú ØÓÖ ×º Ä Ñ ÒØ Ð Ñ ÒØ ¸ Ð ÖÖ ÐÓ ÔÙ                    ×Ô Ö Ö ÙÒ ÒØ
            ×Ô Ó ÑÔÖ × ÓÒ ÒØ ÔÓÖ ÑÔÐÓ¸ Ð ÔÓÐ ÒÓÑ Ó 20x100 Ö ÕÙ Ö ÙÒ ÖÖ ÐÓ 101
       Ð Ñ ÒØÓ× Ô Ö ÐÑ Ò Ö ÙÒ ×ÓÐÓ Ó ¬ ÒØ ÙÒ ×Ô Ö Ó Ð 99±º
           ÄÓ× ÔÓÐ ÒÓÑ Ó× ×ÓÒ ÑÙÝ Ú Ö×Ó׺ Ä ÑÙÐØ ÔÐ ÓÒ Ý Ú × ÓÒ ÖÖÓ Ò ÔÓÐ ÒÓÑ Ó×
       Ö Ó× Ö ÒØ × ×Ù× ÓÔ Ö Ò Ó׺ Ò ÙÒ Ñ ÒØ ÓÒ ×                      ØÙ Ò ÑÙ × ÓÔ Ö ÓÒ ×¸
       ×      ×Ô Ö Ö ÕÙ Ó× ÔÓÐ ÒÓÑ Ó× Ø Ò Ò ×Ù× Ö Ó× Ö ÒØ ׺ Ò Ò ÙÖ ¸ ÑÙ ×
      Ú × ÙÒ ÔÓÐ ÒÓÑ Ó × ×Ô Ö Ó × Ö¸ Ú Ö Ó× ×Ù× Ó ¬ ÒØ × ×ÓÒ ÒÙÐÓ׺ ÈÓÖ ×Ø ×
      Ö ÞÓÒ ×¸ ÙÒ Ð ×Ø ÒÐ Þ ÕÙ ×ÓÐÓ ÐÑ Ò Ø ÖÑ ÒÓ× Ö ÒØ ×                    ÖÓ × Ð ×ØÖÙ ØÙÖ
         ÓÒ Ô Ö Ö ÔÖ × ÒØ Ö ÙÒ ÔÓÐ ÒÓÑ Óº
           Ä ¬ ÙÖ ¾º½ ÐÙ×ØÖ Ð Ö ÔÖ × ÒØ ÓÒ ÓÒ Ð ×Ø × Ó Ð Ñ ÒØ ÒÐ Þ × Ð ÔÓÐ ÒÓÑ Ó
      4x 6 + 2x3 − 1x2 + x + 7º Ä Ð ×Ø   ר ÓÖ Ò         × Ð Ñ ÝÓÖ ×Ø Ð Ñ ÒÓÖ ÔÓØ Ò º
        Ð ÓÖ Ò × × Ò Ð Ô Ö         ÐØ Ö Ð ¬ Ò          ÐÓ× Ð ÓÖ ØÑÓ׺
102                                                                Cap´
                                                                            ıtulo 2. Secuencias



                        4 6             2 3      -1 2           1 1            7 0




                                                   H


                   ÙÖ ¾º½ Ê ÔÖ × ÒØ ÓÒ          4x6 + 2x3 − x2 + x + 7   ÓÒ Ð ×Ø × ÒÐ Þ   ×

        È Ö Ö ÔÖ × ÒØ Ö ÙÒ ÔÓÐ ÒÓÑ Ó ÔÓ ÑÓ× ÙØ Ð Þ Ö Ð Ì DynDlist<T>¸ Ð Ù Ð Ö
      ÓÑÓ Ô Ö Ñ ØÖÓ ÙÒ Ø ÔÓ ÕÙ Ð Ö ÐÓ× Ð Ñ ÒØÓ× Ù Ö Ö Ò Ð Ð ×Ø × Ö¸ ÐÓ× Ô Ö ×
      Ó ¬ ÒØ ¹ÔÓØ Ò
½¼¾   Å Ñ ÖÓ× ÔÖ Ú Ó× ÈÓÐ ÒÓÑ Ó ½¼¾ ≡                      ´½¼¼ µ ½¼¾
        struct Termino
        {
          int    coef;
          size_t pot;
             Å Ñ ÖÓ× Ì ÖÑ ÒÓ ½¼¾
        };
        ¬Ò ×
        Termino¸   Ù×    Ò ÙÒ × ½¼¾ß½¼ º
       Ä Ð ×Ø ÒÐ Þ      ÓÒØ Ò ¸ ÒØÓÒ ×¸ Ø ÖÑ ÒÓ×
½¼¾   Å Ñ ÖÓ× ÔÖ Ú Ó× ÈÓÐ ÒÓÑ Ó ½¼¾ +≡                           ´½¼¼ µ ½¼¾ ½¼¾
        DynDlist<Termino> terminos;
      Í× × DynDlist ¿ Ò       Termino   ½¼¾ º
       À Ý Ó× ÓÖÑ × ÓÒרÖÙ Ö ÙÒ Ø ÖÑ ÒÓ
½¼¾   Å Ñ ÖÓ× Ì ÖÑ ÒÓ ½¼¾ ≡                                              ´½¼¾ µ ½¼¾
        Termino() : coef(0), pot(0) { /* empty */ }
        Termino(const int & c, const size_t & p) : coef(c), pot(p) { /* empty */ }
      Í× × Termino ½¼¾ º

         Ò Ú Ð ÔÖ Ú Ó × ÑÔÓÖØ ÒØ ÓÒרÖÙ Ö ÙÒ Polinomio Ô ÖØ Ö ÙÒ Ø ÖÑ ÒÓ
½¼¾   Å Ñ ÖÓ× ÔÖ Ú Ó× ÈÓÐ ÒÓÑ Ó ½¼¾ +≡                ´½¼¼ µ ½¼¾ ½¼
        Polinomio(const Polinomio::Termino & termino)
        {
          terminos.append(termino);
        }
      Í× × Termino ½¼¾ º

       Ä ×ÙÑ Ø ÖÑ ÒÓ× × ¬Ò ÓÑÓ × Ù
½¼¾   Å Ñ ÖÓ× Ì ÖÑ ÒÓ ½¼¾ +≡                                     ´½¼¾ µ ½¼¾ ½¼¿
        Termino& operator += (const Termino & der)
        {
          coef += der.coef;
          return *this;
        }
      Í× × Termino ½¼¾ º
2.4. Listas Enlazadas                                                                         103



         Ä ÑÙÐØ ÔÐ ÓÒ ÓÖÞÓ× Ñ ÒØ       ÔÖÓ Ù Ö ÙÒ ÒÙ ÚÓ Ø ÖÑ ÒÓ¸ ÔÓÖ × Ö ÞÓÒ                           ¹
      ÑÓ× ÑÔÐ ÒØ Ö ×ØÖ Ø Ñ ÒØ Ð ÓÔ Ö ÓÖ *
½¼¿   Å Ñ ÖÓ× Ì ÖÑ ÒÓ ½¼¾ +≡                               ´½¼¾ µ ½¼¾
        Termino operator * (const Termino & der) const
        {
          return Termino(coef*der.coef, pot + der.pot);
        }
      Í× × Termino ½¼¾ º
           ¬Ò Ð ÓÒרÖÙ ÓÒ ÙÒ Ø ÖÑ ÒÓ¸ ÔÓ ÑÓ× ¬Ò Ö Ð ÓÒרÖÙ ÓÒ                                ÔÓÐ ÒÓÑ Ó×
½¼¿   ÁÑÔÐ Ñ ÒØ ÓÒ Ñ ØÓ Ó× ÈÓÐ ÒÓÑ Ó ½¼¿ ≡           ´½¼¼ µ ½¼¿
        Polinomio::Polinomio(const int & coef, const size_t & pot)
        {
          terminos.append(Termino(coef, pot));
        }
        Polinomio::Polinomio() { /* empty */ }
      Í× × Termino ½¼¾ º


      Suma de polinomios
            Ä ×ÙÑ          Ó× ÔÓÐ ÒÓÑ Ó× P1 =    n
                                                 i=0 cix
                                                         i   Ý P2 =   m
                                                                      j=0 djx
                                                                              j   ×   ¬Ò ÓÑÓ
                                                 Ñ Ü(n,m)
                                     P1 + P2 =               (ck + dk)xk .
                                                   k=0

        × Ð Ó Ø Ò Ö ÙÒ Ð ÓÖ ØÑÓ ¬ ÒØ ¸ ÔÙ × Ð × Ð ×Ø × ×Ø Ò ÓÖ Ò × ÔÓÖ ÔÓØ Ò º Ò ×Ø
      × ÒØ Ó¸ × ÔÖ Ö Ð ÑÔÐ Ñ ÒØ Ö Ð ÓÔ Ö ÓÖ +=¸ ÔÙ × × ÒÓ× ÓÖÖ ÑÓ× Ð Ö Ö ÒÙ ÚÓ×
      Ø ÖÑ ÒÓ× Ô Ö Ð ÔÓÐ ÒÓÑ Ó Ö ×ÙÐØ Óº    ר ÑÓ Ó¸ Ð ÓÔ Ö ÓÖ + ÔÓ ÑÓ× × Ö ÖÐÓ Ò
       ÙÒ ÓÒ += ÓÑÓ × Ù
½¼¿    ÁÑÔÐ Ñ ÒØ ÓÒ Ñ ØÓ Ó× ÈÓÐ ÒÓÑ Ó ½¼¿ +≡               ´½¼¼ µ ½¼¿ ½¼¿
        Polinomio Polinomio::operator + (const Polinomio & der) const
        {
          Polinomio ret_val(*this); // inicie valor de retorno en operando derecho
          ret_val += der; // s´mele operando derecho
                              u
          return ret_val;
        }
        Ä ×ÙÑ × ÜØÖ Ñ Ñ ÒØ × ÑÔÐ ÔÓÖÕÙ ×Ù Ý                            Ò Ð ÐÐ Ñ          Ð ÓÔ Ö ÓÖ +=¸ Ð
      Ù Ð ÔÓ× Ð × Ù ÒØ רÖÙ ØÙÖ
½¼¿   ÁÑÔÐ Ñ ÒØ ÓÒ Ñ ØÓ Ó× ÈÓÐ ÒÓÑ Ó ½¼¿ +≡                            ´½¼¼ µ ½¼¿ ½¼
        Polinomio & Polinomio::operator += (const Polinomio& der)
        {
             ÁÑÔÐ ÒØ ÓÒ        ÈÓÐ ÒÓÑ Ó ÓÔ Ö ØÓÖ · ½¼¿
            return *this;
        }
           ÒØ ×      ØÙ Ö Ð ×ÙÑ ÓÑÓ Ø Ð¸                 ÑÓ× Ú Ö ¬ Ö ÕÙ Ò Ò ÙÒÓ             ÐÓ× Ó× ÔÓÐ ¹
      ÒÓÑ Ó× ÓÖÖ ×ÔÓÒ Ð Ð Ñ ÒØÓ Ò ÙØÖÓ
½¼¿    ÁÑÔÐ ÒØ ÓÒ ÈÓÐ ÒÓÑ Ó ÓÔ Ö ØÓÖ ·              ½¼¿ ≡                    ´½¼¿ µ ½¼
        if (der.terminos.is_empty())
104                                                                  Cap´
                                                                             ıtulo 2. Secuencias



        return *this;
      if (terminos.is_empty())
        {
          *this = der;
          return *this;
        }
     Ë Ñ Ó× ÔÓÐ ÒÓÑ Ó× ÒÓ ×ÓÒ ÒÙÐÓ׸ ÒØÓÒ ×                  ÑÓ× Ö ÓÖÖ ÖÐÓ׺ È Ö ÐÐÓ Ù× ÑÓ× ÙÒ
     Ø Ö ÓÖ ÔÓÖ    ÔÓÐ ÒÓÑ Ó ÓÔ Ö Ò Ó
½¼    ÁÑÔÐ ÒØ ÓÒ ÈÓÐ ÒÓÑ Ó ÓÔ Ö ØÓÖ · ½¼¿               +≡        ´½¼¿ µ ½¼¿ ½¼
      DynDlist<Termino>::Iterator it_izq(terminos);
      DynDlist<Termino>::Iterator it_der(const_cast<DynDlist<Termino>&>(der.terminos));
     Í× × DynDlist ¿ Ò    Termino   ½¼¾ º
        Ä ¬ ÙÖ ¾º½       ÑÔÐ ¬ Ð ÔÓÐ ÒÓÑ Ó 6x6+7x5−x4+3x2+4x ÓÑÓ ÓÔ Ö Ò Ó ÞÕÙ Ö Ó¸
     Ý 8x8 + x6 − 2x2 + 2 ÓÑÓ ÓÔ Ö Ò Ó Ö Óº
                                     ØÓÖ ÞÕ


                  6x6           7x5               −x4              3x2               4x



                  8x8           x6               −2x2              2



                                    itor der

                                       ÙÖ ¾º½ ËÙÑ            ÔÓÐ ÒÓÑ Ó×

           ÓÖ Ö ÓÖÖ Ö ÑÓ× Ð × Ð ×Ø × Ø ÖÑ ÒÓ× ×Ø ÕÙ ÙÒÓ ÐÓ× Ø Ö ÓÖ × Ð Ò ×Ù
     ¬Ò Ð ×Ø
½¼    ÁÑÔÐ ÒØ ÓÒ ÈÓÐ ÒÓÑ Ó ÓÔ Ö ØÓÖ · ½¼¿ +≡        ´½¼¿ µ ½¼ ½¼
      while (it_izq.has_current() and it_der.has_current())
        {
               ÈÖÓ × Ö Ø ÖÑ ÒÓ× ØÙ Ð × ½¼
           }
       Ë Ò izq Ý der Ð × ÔÓØ Ò ×               ÐÓ× Ø ÖÑ ÒÓ× ØÙ Ð ×        ÐÓ× Ø Ö ÓÖ × ÞÕÙ Ö Ó Ý
      Ö Ó Ö ×Ô Ø Ú Ñ ÒØ
½¼   ÈÖÓ × Ö Ø ÖÑ ÒÓ× ØÙ Ð × ½¼ ≡                                         ´½¼ µ ½¼
      const size_t & izq = it_izq.get_current().pot;
      const size_t & der = it_der.get_current().pot;
     izq Ý der     Ò ÔÖÓ × Ö× × ÙÒ ÐÓ× × Ù ÒØ × ×Ó×
       ½º Ë Ð ÔÓØ Ò      Ð izq × Ñ ÒÓÖ ÕÙ der¸ ÒØÓÒ × der ר Ö ÔÖ × ÒØ Ò Ð Ö ×ÙÐØ Óº
            ÓÑÓ Ð Ð ×Ø ר ÓÖ Ò ¸ × × ÙÖÓ ÕÙ this ÒÓ ÓÒØ Ò ÙÒ Ø ÖÑ ÒÓ ÓÒ Ð Ñ ×Ñ
          ÔÓØ Ò       derº ר × Ð × ØÙ ÓÒ ÓÒ ÐÓ× Ø ÖÑ ÒÓ× 6x6 Ý 8x8    ÐÓ× ÔÓÐ ÒÓÑ Ó×
           ÞÕÙ Ö Ó Ý Ö Ó¸ Ö ×Ô Ø Ú Ñ ÒØ º
2.4. Listas Enlazadas                                                        105



                    ÑÓ× Ö Ö ÙÒ ÒÙ ÚÓ Ø ÖÑ ÒÓ ÓÔ  der  Ò× ÖØ ÖÐÓ Ò this ´ Ð ÔÓÐ ÒÓÑ Ó
               ÞÕÙ Ö Óµº Ä ÓÔ        der     ÔÖ Ö izq Ò this¸ ÔÙ × Ð Ö ×ÙÐØ Ó
                ר Ö ÓÖ Ò Óº
               Ä × ÓÒ × ÒØ Ö ÓÖ × × ØÖ Ù Ò Ð × Ù ÒØ Ó Ó
     ½¼         ÈÖÓ × Ö Ø ÖÑ ÒÓ× ØÙ Ð × ½¼ +≡        ´½¼ µ ½¼ ½¼
                 if (izq < der)
                   {     // insertar a la izquierda del actual de it_izq
                     it_izq.append(Termino(it_der.get_current().coef, der));
                     it_der.next(); // mirar el pr´ximo t´rmino de polinomio derecho
                                                  o      e
                     continue;
                   }
               Í× × Termino ½¼¾ º
               append()   ×Ó Ö it izq Ö ÒØ Þ ÕÙ Ð ÒÙ ÚÓ Ø ÖÑ ÒÓ × ÔÖ      ×ÓÖ Ð ØÙ Ð
               ÞÕÙ Ö Óº ÄÙ Ó Ú ÒÞ ÑÓ× Ð Ø Ö ÓÖ Ö Ó¸ ÔÙ × Ð Ø ÖÑ ÒÓ ÔÓØ Ò der Ý
                  × Ó ÔÖÓ × Óº Ò ÐÑ ÒØ ¸ Ö Ô Ø ÑÓ× Ð ÔÖÓ Ñ ÒØÓº
            ¾º Ë Ð × ÔÓØ Ò × ×ÓÒ Ù Ð ×¸ ÒØÓÒ ×    ÑÓ× ×ÙÑ Ö ÐÓ× Ó ¬ ÒØ ׸ Ú ÒÞ Ö Ñ Ó×
               Ø Ö ÓÖ × Ý Ö Ô Ø Ö Ð ÔÖÓ Ñ ÒØÓº ר × Ð × ØÙ ÓÒ ÓÒ ÐÓ× Ø ÖÑ ÒÓ× 6x6 Ý x6
                  ÐÓ× ÔÓÐ ÒÓÑ Ó× ÞÕÙ Ö Ó Ý Ö Ó Ö ×Ô Ø Ú Ñ ÒØ º
     ½¼         ÈÖÓ × Ö Ø ÖÑ ÒÓ× ØÙ Ð × ½¼ +≡             ´½¼ µ ½¼ ½¼
                 if (izq == der)
                   {      // calcular coeficiente resultado
                     it_izq.get_current() += it_der.get_current(); // llama a += de Termino
                     it_der.next(); // avanzar al pr´ximo t´rmino del polinomio derecho
                                                    o      e
                     if (it_izq.get_current().coef == 0) // verificar si suma anula el t´rmino
                                                                                        e
                       {    // s´, borrarlo del polinomio izquierdo (coeficiente cero)
                                ı
                         it_izq.del();
                         continue;
                       }
                   }
               Í× × Termino ½¼¾ º

     ¿º Ò Ð ÙÐØ ÑÓ ×Ó ´ ÞÕ > Öµ¸ izq × Ö Ô ÖØ Ð Ö ×ÙÐØ Óº ÈÙ ×ØÓ ÕÙ izq Ý Ô ÖØ Ò
          this¸ × ÑÔÐ Ñ ÒØ Ú ÒÞ ÑÓ× Ð Ø Ö ÓÖ ÞÕÙ Ö Ó Ý Ö Ô Ø ÑÓ× Ð ÔÖÓ   Ñ ÒØÓº ר
         × Ð × ØÙ ÓÒ ÓÒ ÐÓ× Ø ÖÑ ÒÓ× 7x5 Ý −2x2 ÐÓ× ÔÓÐ ÒÓÑ Ó× ÞÕÙ Ö Ó Ý Ö Ó Ö ×Ô ¹
        Ø Ú Ñ ÒØ º
     ½¼        ÈÖÓ × Ö Ø ÖÑ ÒÓ× ØÙ Ð × ½¼ +≡                   ´½¼ µ ½¼
                 it_izq.next();

                Ð ÔÖÓ ×Ó Ø Ö Ø ÚÓ ÒØ Ö ÓÖ ÙÐÑ Ò Ù Ò Ó Ð ÙÒÓ ÐÓ× Ø Ö ÓÖ × Ð ÒÞ Ð ¬Ò Ð
              ÙÒ Ð × Ð ×Ø ׺ Ò ×Ø ×Ó ÕÙ ÔÓÖ Ö ÓÖÖ Ö ÙÒ Ð ×Ø º Ë Ð Ð ×Ø ÔÓÖ Ö ÓÖÖ Ö ×
          Ð ÞÕÙ Ö ¸ ÒÓ         ÑÓ×     Ö Ò ¸ ÔÙ × ×Ù× Ð Ñ ÒØÓ׸ ÕÙ ×ÓÒ Ô ÖØ Ð Ö ×ÙÐØ Ó¸ Ý
            ר Ò Ò ÐÙ Ó× Ò thisº Ë ¸ ÔÓÖ Ð ÓÒØÖ Ö Ó¸ Ð Ð ×Ø ÕÙ Ö ×Ø ÔÓÖ Ö ÓÖÖ Ö × Ð Ö ¸
            ÒØÓÒ ×      ÑÓ× ÓÔ Ö ØÓ Ó× ×Ù× Ø ÖÑ ÒÓ× Ö ×Ø ÒØ × Ò× ÖØ ÖÐÓ× × Ù Ò ÐÑ ÒØ Ò Ð
          Ð ×Ø ÞÕÙ Ö
½¼         ÁÑÔÐ ÒØ ÓÒ ÈÓÐ ÒÓÑ Ó ÓÔ Ö ØÓÖ · ½¼¿ +≡                   ´½¼¿ µ ½¼
           while (it_der.has_current()) // copia t´rminos restantes de derecho al izquierdo
                                                  e
             {
106                                                                               Cap´
                                                                                          ıtulo 2. Secuencias



               terminos.append(Termino(it_der.get_current().coef, it_der.get_current().pot));
               it_der.next();
           }
     Í× × Termino ½¼¾ º


     Multiplicaci´n de polinomios
                 o
        Ä ÑÙÐØ ÔÐ         ÓÒ    Ó× ÔÓÐ ÒÓÑ Ó× P1 =               n
                                                                 i=0 cix
                                                                         i    Ý P2 =      m
                                                                                          j=0 djx
                                                                                                  j   ×      ¬Ò ÓÑÓ
                                                 n               m
                                        P1P2 =         cix   i
                                                                       kjxj     .
                                                 i=0             j=0

       ר ÜÔÖ × ÓÒ ×Ù Ö ÙÒ Ð ÓÖ ØÑÓ × Ó Ò ×ÙÑ                                 ÔÖÓ Ù ØÓ× Ô Ö Ð ×¸ Ð Ù Ð ÔÙ
     Ö ×ÙÑ Ö× ÓÑÓ × Ù
     Algoritmo 2.1 (Multiplicaci´n de dos polinomios)
                                o
        Ä ÒØÖ ×ÓÒ Ó× ÔÓÐ ÒÓÑ Ó× P1 = n cixj Ý P2 =
                                           i=0
                                                                                       m
                                                                                       j=0 djx
                                                                                               j          Ö Ó× n Ý m
     Ö ×Ô Ø Ú Ñ ÒØ º
         Ä × Ð × ÙÒ ÔÓÐ ÒÓÑ Ó R ÓÖÖ ×ÔÓÒ ÒØ Ð ÔÖÓ Ù ØÓ P1P2º
        ½º ÁÒר Ò ÙÒ ÔÓÐ ÒÓÑ Ó ÒÙÐÓ Rº
        ¾º Ê Ô Ø Ô Ö i = 0 ר n
               ´ µ Ë R = cixi × P2
               ´ µ R=R+R
          ÓÖ ÔÓ ÑÓ× Ó ¬ Ö Ð ÓÔ Ö ÓÖ * ÓÑÔÐ Ø Ñ ÒØ Ö Ñ Ò × ÒØ                                             Ð Ð ÓÖ ØÑÓ ¾º½
½¼   ÁÑÔÐ Ñ ÒØ ÓÒ Ñ ØÓ Ó× ÈÓÐ ÒÓÑ Ó ½¼¿ +≡            ´½¼¼ µ                                       ½¼¿
       Polinomio Polinomio::operator * (const Polinomio & der) const
       {
         Polinomio result;
         if (terminos.is_empty() or der.terminos.is_empty())
           return result;
         for (DynDlist<Termino>::Iterator
                it_izq(const_cast<DynDlist<Termino>&>(terminos));
              it_izq.has_current(); it_izq.next())
           result += der.multiplicado_por(it_izq.get_current());
         return result;
       }
     Í× × DynDlist ¿ Ò     Termino   ½¼¾ º
          Ð if Ú Ö ¬ ÕÙ × Ð ÙÒÓ ÐÓ× ÔÓÐ ÒÓÑ Ó× × ÒÙÐÓ¸ ÒØÓÒ × Ð ÔÖÓ Ù ØÓ × ÒÙÐÓº Ð
     for × Ü Ø Ñ ÒØ Ð Ú Ö× ÓÒ Ó ¬         Ð Ð ÓÖ ØÑÓ ¾º½      Ø ÖÑ ÒÓ Ð ÔÓÐ ÒÓÑ Ó
      ÞÕÙ Ö Ó × ÑÙÐØ ÔÐ ÒØ Ö Ñ ÒØ ÔÓÖ Ð ÔÓÐ ÒÓÑ Ó Ö Ó Ý Ð Ö ×ÙÐØ Ó × ÙÑÙÐ Ó
2.5. Pilas                                                                  107



      Ò Ð ÔÓÐ ÒÓÑ Ó resultº Ð Ö Ñ ÒØÓ der.por termino(it izq.get current() ÓÖÖ ×¹
     ÔÓÒ      Ð ÑÙÐØ ÔÐ ÓÒ ÙÒ ÔÓÐ ÒÓÑ Ó ÔÓÖ ÙÒ Ø ÖÑ ÒÓ ÓÔ Ö ÓÒ ÕÙ ¬Ò ÑÓ×
      ÓÒØ ÒÙ ÓÒ
½¼    Å Ñ ÖÓ× ÔÖ Ú Ó× ÈÓÐ ÒÓÑ Ó ½¼¾ +≡                    ´½¼¼ µ ½¼¾
      Polinomio multiplicado_por(const Termino & term) const
      {
        Polinomio result;
        if (terminos.is_empty() or term.coef == 0)
          return result;
        for (DynDlist<Termino>::Iterator it(const_cast<DynDlist<Termino>&>(terminos));
             it.has_current(); it.next())
          result.terminos.append(Termino(it.get_current().coef * term.coef,
                                         it.get_current().pot + term.pot) );
        return result;
      }
     Í× × DynDlist ¿ Ò      Termino   ½¼¾ º

          Ð Ð ÓÖ ØÑÓ × × Ò ÐÐÓº Ë Òר Ò ÙÒ ÔÓÐ ÒÓÑ Ó result ÓÒ Ú ÐÓÖ Ò Ð Ù Ð Ð
     ÔÓÐ ÒÓÑ Ó ÒÙÐÓº ÄÙ Ó¸ ÔÓÖ      Ø ÖÑ ÒÓ Ð ÔÓÐ ÒÓÑ Ó¸ × ÑÙÐØ ÔÐ ÔÓÖ Ð Ø ÖÑ ÒÓ
     ÓÔ Ö Ò Ó Ý Ð Ö ×ÙÐØ Ó × Ò× ÖØ ÓÖ Ò Ñ ÒØ Ò resultº

     2.5      Pilas
     ÍÒ Ô Ð      × ÙÒ ×ØÖ ÓÒ ­Ù Ó ÓÒ× ×Ø ÒØ ÙÒ × Ù Ò                 Ð Ñ ÒØÓ× Ò Ð Ù Ð
     Ð × ÓÔ Ö     ÓÒ × Ò× Ö ÓÒ¸ ÓÒ×ÙÐØ Ý Ð Ñ Ò ÓÒ ×        ÙØ Ò ÔÓÖ ÙÒ ×ÓÐÓ ÜØÖ ÑÓº Ä
     ÔÖÓÔ          × Ò Ð × ÕÙ Ð ÙÐØ ÑÓ Ð Ñ ÒØÓ Ò Ò× ÖØ Ö× × ÑÔÖ × Ö Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ
      Ò ÐÑÒ      Ö× º Ì Ð ÔÖÓÔ   × ÓÒÓ ÓÑÓ Í ÈË ´ÍÐØ ÑÓ Ò ÒØÖ Ö¸ ÈÖ Ñ ÖÓ Ò Ë Ð Öµ½ º
                                          push              pop
                                                 ØÓÔ
                                                  8
                                                  7
                                                  6
                                                  4
                                                  3
                                                  2
                                                  1




                                       ÙÖ ¾º½    ×ØÖ   ÓÒ    ÙÒ Ô Ð

          Ö ¬ Ñ ÒØ ¸ ÔÓ ÑÓ× Ú Ö ÙÒ Ô Ð ÓÑÓ ÙÒ Ö Ô ÒØ ÓÒ ÙÒ ×ÓÐ ÒØÖ Ø Ð ÓÑÓ
      Ò Ð ¬ ÙÖ ¾º½ º Ù Ò Ó × Ò× ÖØ ÙÒ Ð Ñ ÒØÓ¸ ÐÓ× Ð Ñ ÒØÓ× ÔÖ Ú Ñ ÒØ Ò× ÖØ ¹
      Ó× × ÑÔÙ Ò              Óº ÈÓÖ × Ö ÞÓÒ¸ Ð ÓÔ Ö ÓÒ    Ò× Ö ÓÒ × ÒÓÑ Ò
      ÓÑÙÒÑ ÒØ ÔÙ× º Ð ÜØÖ ÑÓ Ð Ö Ô ÒØ ¸ ÔÓÖ ÓÒ ÒØÖ Ò Ý × Ð Ò ÐÓ× Ð Ñ ÒØÓ׸
     × ÒÓÑ Ò ØÓÔ ¸ Ð Ù Ð × Ð ÙÒ Ó ÔÙÒØÓ Ñ Ò ÔÙÐ ÓÒ Ð Ô Ð º
      ½
           Ò Ò Ð × ÄÁ Ç ´Ð ר Ò¸ ¬Öר ÓÙØµº
108                                                      Cap´
                                                            ıtulo 2. Secuencias



       Ð ÓÖ Ñ ÒØ         Ð Ò Ó¸ Ù Ò Ó × Ø Ú ÙÒ ×ÙÔÖ × ÓÒ¸ Ð Ö ×ÓÖØ ÑÔÙ ÐÓ× Ð ¹
Ñ ÒØÓ×           ÖÖ Ý Ð Ð Ñ ÒØÓ × ØÙ Ó Ò Ð ØÓÔ × ÐØ            Ù Ö º ÈÓÖ × Ö ÞÓÒ¸
   Ð ×ÙÔÖ × ÓÒ ÙÒ Ô Ð × Ð ÒÓÑ Ò ÓÑÙÒÑ ÒØ ÔÓÔ º
      ÍÒ Ô Ð × ÙØ Ð Þ Ù Ò Ó × Ö ÕÙ Ö ÙÒ ­Ù Ó ÔÖÓ × Ñ ÒØÓ Ð Ñ ÒØÓ× ÒÚ Ö×Ó
   Ð × ÙÒ           Ó × ÖÚ ÓÒ Ó     ÒØÖ    × Ö¸ × Ð Ñ × Ö ÒØ Ñ ÒØ Ó × Ö¹
Ú Ó ×Ø Ð Ñ × ÒØ Ù Ñ ÒØ Ó × ÖÚ Óº Ù ÐÕÙ Ö Ô ØÖÓÒ ÔÖÓ × Ñ ÒØÓ ÕÙ Ú × Ø
  Ð Ñ ÒØÓ× ÙÒ ÓÒ ÙÒØÓ Ò ×Ø ÓÖ Ò × ×Ù× ÔØ Ð          ÑÔÐ ÒØ Ö× ÓÒ ÙÒ Ô Ð º
      Ä Ú Ö Ð Ó Ö Ð ÙÒÓ× ÑÔÐÓ× Ð × ÔÐ Ò Ô Ð º Ù ÐÕÙ Ö ÒÓ×ÓØÖÓ× Ö
  ÜÔ Ö Ò Ó Ð Ö Ö Ò ÔÓÔÙÐ Ö ÕÙ Ö Þ ÐÓ× ÙÐØ ÑÓ× × Ö Ò ÐÓ× ÔÖ Ñ ÖÓ× º
       Ð Ð Ú Ó Ñ ÒÙ Ð ÔÐ ØÓ× Ò ÙÒ Ö       ÖÓ ÓÑ ×Ø Ó × Ù Ð × ÔÐ Ò Ô Ð º ÈÖÓ ¹
    Ð Ñ ÒØ ¸ ÐÓ× ÔÐ ØÓ× × Ô Ð Ò × ÙÒ Ð ÓÖ Ò      ÙÐÑ Ò ÓÒ Ð ÓÑ            × Ö¸
  Ð ØÓÔ Ð Ô Ð ÓÒØ Ò Ð ÔÐ ØÓ Ð ÙÐØ Ñ Ô Ö×ÓÒ Ò ÙÐÑ Ò Ö ×Ù ÓÑ º Ù Ò Ó
Ð Ú ÑÓ× ÐÓ× ÔÐ ØÓ׸ ÐÓ× Ò ÓÒ ÑÓ× Ý ÐÓ× Ô Ð ÑÓ× Ò Ð × ÙÒ Ó Ö Ô ÒØ Ð Ö          ÖÓº
ÈÓר Ö ÓÖÑ ÒØ ¸ Ò Ù ÑÓ× ÐÓ× ÔÐ ØÓ× Ý ÐÓ× Ô Ð ÑÓ× Ò Ð × ÙÖÖ ÖÓº ר ÑÔÐÓ ÙØ ¹
Ð Þ ØÖ × Ô Ð × Ý Ö ­ ÙÒ Ø ÔÓ ÔÖÓ × Ñ ÒØÓ Ò Ð Ù Ð ÐÓ ÑÔÓÖØ ÒØ × ÙÐÑ Ò Ö
  ¬ ÞÑ ÒØ Ð ØÖ Ó Ý ÒÓ Ð ÓÖ Ò Ò ÕÙ ÐÓ× ÔÐ ØÓ× ×ÓÒ ÔÖÓ × Ó׺

2.5.1   Representaciones de una pila en memoria
À Ý Ó× Ñ ØÓ Ó× Ô Ö Ö ÔÖ × ÒØ Ö ÙÒ Ô Ð ÖÖ ÐÓ× Ý Ð ×Ø × ÒÐ Þ ×º Ò Ñ × Ö ¹
ÔÖ × ÒØ ÓÒ ×¸ ÐÓ× Ð Ñ ÒØÓ× × ×ÔÓÒ Ò × Ù Ò ÐÑ ÒØ × ÙÒ Ð Ñ ×ÑÓ ÓÖ Ò Ð
ÔÐ º
     Ò ÙÒ ÖÖ ÐÓ × Ö ÕÙ Ö Ñ ÒØ Ò Ö Ð Ò    Ð ÙÐØ ÑÓ Ð Ñ ÒØÓº Ä ÔÖ Ñ Ö ÒØÖ
 ÐÑ Ò Ð Ð Ñ ÒØÓ Ñ × ÒØ ÙÓ¸ Ñ ÒØÖ × ÕÙ Ð Ò Ö Ö Ò Ð ØÓÔ Ñ × ÙÒÓº Ä
¬ ÙÖ ¾º½ ÐÙ×ØÖ ÙÒ Ô Ð 5 Ð Ñ ÒØÓ× ÓÒØ Ò Ò ÙÒ ÖÖ ÐÓ 11 Ð Ñ ÒØÓ׺
                           ¼ ½ ¾ ¿                      ½¼
                          T0 T1 T2 T3 T4


                      Ð Ñ ÒØÓ Ñ × ÒØ ÙÓ        ØÓÔ

               ÙÖ ¾º½ Ê ÔÖ × ÒØ ÓÒ         ÙÒ Ô Ð Ñ    ÒØ ÙÒ ÖÖ ÐÓ
     Ò ÙÒ Ð ×Ø ÒÐ Þ Ö ÕÙ Ö ÑÓ× Ñ ÒØ Ò Ö ÙÒ ÔÙÒØ ÓÖ Ð ÔÖ Ñ Ö ÒÓ Óº ÈÙ ×ØÓ ÕÙ
×ÓÐÓ ÒÓ× ÒØ Ö × Ð ØÓÔ ¸ Ð × Ù Ò      Ð Ð ×Ø ר ÒÚ ÖØ      × Ö¸ Ð ÔÖ Ñ Ö ÒÓ Ó
   Ð Ð ×Ø ÐÑ Ò Ð ØÓÔ Ý Ð ÙÐØ ÑÓ ÐÑ Ò Ð Ñ × ÒØ ÙÓº Ä ¬ ÙÖ ¾º½ ÐÙ×ØÖ Ð
Ö ÔÖ × ÒØ ÓÒº
    Ä × Ð ÓÒ Ö ÔÖ × ÒØ ÓÒ Ô Ò Ö Ð × Ö ÙÒר Ò ×º Ò ÐÓ ÕÙ Ø Ò Ð ×¹
Ô Ó¸ ÕÙ Þ ÙÒ ØÓÖ ÓÒ× Ö Ð × Ð Ñ Ü Ñ ÒØ                Ð Ñ ÒØÓ× ÕÙ ÔÙ ÓÒØ Ò Ö
Ð ÔÐ ¸ Ð Ù Ð Ô Ò         Ð ÔÐ ÓÒº
    Ä × Ð ×Ø × ÖÖ Ò ÙÒ ×Ó Ö Óר ÔÓÖ Ð Ñ ÒØÓ      Ó Ð ÔÙÒØ ÓÖ       ÓÒ Ðº Ë ×
 ÓÒÓ Ð Ñ Ü Ñ ÒØ             Ð Ñ ÒØÓ× Ý Ð ÔÐ ÓÒ Ð ÔÖÓÚ ¸ ÒØÓÒ × ×Ø Ð ÖÓ
ÕÙ Ð ÖÖ ÐÓ × Ñ × ÓÑÔ ØÓ ÕÙ Ð Ð ×Ø º
    ÇØÖÓ ØÓÖ Ú ÐÙ Ö × Ð Ú Ö ÓÒ Ñ Ü Ñ Ð Ø Ñ ÒÓ Ð Ô Ð º ÈÓ ÑÓ× ÓÒÓ Ö Ð
Ñ Ü ÑÓ¸ Ô ÖÓ × ×Ø × ÑÙÝ ÔÓ Ó ÔÖÓ Ð ¸ ÒØÓÒ ×¸ Ò ÔÖÓÑ Ó¸ ÔÙ × Ö Ñ × Ö ØÓ
 Ò ×Ô Ó ÙÒ Ö ÔÖ × ÒØ ÓÒ ÓÒ Ð ×Ø × ÕÙ Ò ÓÕÙ Ð Ø Ñ ÒÓ ÔÖÓÑ Óº Ä × Ð ÓÒ
2.5. Pilas                                                                     109



                  tope                                             Ð Ñ ÒØÓ Ñ × ÒØ ÙÓ




                     ÙÖ ¾º½ Ê ÔÖ × ÒØ ÓÒ        ÙÒ Ô Ð ÓÒ Ð ×Ø × ÒÐ Þ    ×

     ×       ØÙ Ö ÓÒ× Ö Ò Ó Ð ×Ú ÓÒ Ø Ô                Ð Ø Ñ ÒÓ Ð Ô Ð º Ë l Ð Ø Ñ ÒÓ
     ÔÖÓÑ Ó Ð Ô Ð ¸ σl Ð ×Ú ÓÒ Ø Ô ¸ lmax Ð Ø Ñ ÒÓ Ñ Ü ÑÓ ÕÙ ÔÙ                 Ð ÒÞ Ö
     Ð Ô Ð ¸ Ts Ð ×Ô Ó Ó ÙÔ Ó ÔÓÖ ÙÒ Ð Ñ ÒØÓ Ð Ô Ð Ý ps Ð ×Ô Ó Ó ÙÔ Ó ÔÓÖ ÙÒ
       ÔÙÒØ ÓÖ¸ ÒØÓÒ ×¸ ×
                                  (l + σl)(Ts + ps) ≤ lmaxTs ,                    ´¾º¾¼µ
       ÒØÓÒ ×¸ Ò ÔÖÓÑ Ó¸ Ð Ð ×Ø Ó ÙÔ Ö Ñ ÒÓ× ×Ô Ó ÕÙ Ð ÖÖ ÐÓº
           Ò ÐÓ ÕÙ ÓÒ ÖÒ Ð Ø ÑÔÓ             Ù ÓÒ¸ Ð ÖÖ ÐÓ × Ð Ö ÔÖ × ÒØ ÓÒ Ñ × Ö Ô º
     ÈÙ ×ØÓ ÕÙ ÐÓ× Ð Ñ ÒØÓ× Ð ÖÖ ÐÓ ×ÓÒ × Ù Ò Ð × Ò Ñ ÑÓÖ ¸ Ð ÐÓ Ð            ×Ô Ð Ý
     Ø ÑÔÓÖ Ð × ÔÖÓÚ          Ý Ð         Ð ÓÑÔÙØ ÓÖ ÐÓ Ö ×Ù ÓÑ Ø Óº ר ÒÓ × Ð ×Ó
       ÓÒ Ð × Ð ×Ø × ÓÒ ÐÓ× ÒÓ Ó× ×Ø Ö Ò Ò Ö ÓÒ × Ñ ÑÓÖ               Ö ÒØ ׺
         ÈÓÖ ÓØÖ Ô ÖØ ¸ Ù Ò Ó × Ò× ÖØ Ó × ×ÙÔÖ Ñ ÙÒ Ð Ñ ÒØÓ Ò ÙÒ Ð ×Ø ÒÐ Þ ¸
     ÔÙ ÒÚÓ Ö× Ð Ñ Ò ÓÖ Ñ ÑÓÖ º Ð Ñ Ò Ó Ñ ÑÓÖ ÑÔÓÒ ÙÒ ×Ó Ö Óר
           ÓÒ Ð Ò ÙÒ Ð ×Ø Ö ×Ô ØÓ Ð ÖÖ ÐÓº Ä ¬ Ò               Ð Ñ Ò ÓÖ Ñ ÑÓÖ Ô Ö
       Ô ÖØ Ö ÙÒ ÐÓÕÙ × ÑÙÝ Ú Ö Ð Ý ÔÙ × Ö ÔÖÓÔÓÖ ÓÒ Ð Ð ÒØ                      ÐÓÕÙ ×
       Ô ÖØ º Ä Ñ ×Ñ ÓÒ× Ö ÓÒ × Ú Ð Ù Ò Ó × Ð Ö ÙÒ ÐÓÕÙ º
         ÍÒ Ô Ð ÔÙ ÒרÖÙÑ ÒØ Ö× Ö Ø Ñ ÒØ Ñ ÒØ Ð Ø ÔÓ DynDlist<T> ¬Ò Ó
       Ò Ü ¾º º½¼ ´Ô Ò ¿µº Ë Ñ Ö ÑÓ× Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ Ð Ð ×Ø ÓÑÓ Ð ØÓÔ ¸ ÒØÓÒ ×
     push(item) ÕÙ Ú Ð      insert(item)¸ pop() remove first() Ý top() get first()º

     2.5.2   El TAD ArrayStack<T> (pila vectorizada)
        Ð × ÑÔ ÒÓ ÙÒ Ô Ð ÑÔÐ ÒØ Ñ ÒØ ÙÒ ÖÖ ÐÓ × Ø Ò Ü Ð ÒØ ÕÙ Ú Ð Ð
     ÔÒ         Ö ÜÔÐ ØÓ Ð Ñ Ò ×ÑÓ ÑÔÐ ÒØ ÓÒº
          ArrayStack<T> ×Ô Ö Ü Ô ÓÒ × Ù Ò Ó × Ü            Ð Ô         Ð ÖÖ ÐÓ Ó
       Ù Ò Ó × ÒØ ÒØ          Ö Ð ØÓÔ     ÙÒ Ô Ð Ú º ×Ô Ö Ö ×Ø × Ü Ô ÓÒ × Ø Ò
     ÙÒ Ð ÖÓ Óר Ò × ÑÔ ÒÓ ÕÙ ÔÙ × Ö ÑÔÓÖØ ÒØ × Ð Ô Ð × ÙØ Ð Þ ÑÙÝ Ñ ÒÙ Óº
           Ü ×Ø Ò ÑÙ × ÔÐ ÓÒ × Ò Ð × Ù Ð × × ÔÙ ÓÒÓ Ö Ð Ø Ñ ÒÓ Ñ Ü ÑÓ Ð Ô Ð
     Ý Ò Ð × ÕÙ × ÒÒ × Ö Ó ÓÒ× Ö Ö Ð × ÓÖ º ÈÓÖ ÓØÖ Ô ÖØ ¸ ÙÒ × ÓÖ Ò Ø ÚÓ
       × ÙÒ ÖÖÓÖ ÔÖÓ Ö Ñ ÓÒ Ú Ö ¬ Ö Ò Ð × ÔÖ Ñ Ö × Ø Ô × ÙÒ ÔÖÓÝ ØÓº ÈÓÖ ×
     Ö ÞÓÒ¸ Ð Ì FixedStack<T> ÑÓ Ð Þ Ð × Ñ ×Ñ × ÔÖ Ñ Ø Ú × ÕÙ ArrayStack<T> ÓÒ
     Ð       ÖÒ       ÕÙ ÒÓ ×     ØÙ Ò Ú Ö ¬ ÓÒ × Ý ÒÓ × ×Ô Ö Ò Ü Ô ÓÒ ×º     ר
     Ñ Ò Ö ¸ ÔÐ ÓÒ × ÕÙ ÓÒÓÞ Ò Ð Ñ Ü ÑÓ Ø Ñ ÒÓ Ô Ð × Ò ¬ Ò Ð Ò Ò
       Ò Ú ÐÓ           ÔÓÖ Ð Ù× Ò      Ú Ö ¬ ÓÒ ×º
          È Ð × ÑÔÐ ÒØ × ÓÒ ÖÖ ÐÓ× × ¬Ò Ò Ò Ð Ö ÚÓ ØÔÐ ÖÖ ÝËØ ºÀ ½¼ ¸ Ð Ù Ð
       ÜÔÓÖØ Ó× Ø ÔÓ× ÔÖ Ò Ô Ð × ArrayStack<T> Ý FixedStack<T>
½¼     ØÔÐ ÖÖ ÝËØ ºÀ ½¼ ≡
        template <typename T, const size_t dim = 100>
      class ArrayStack
110                                                                  Cap´
                                                                              ıtulo 2. Secuencias



        {
             Ñ Ñ ÖÓ× ÔÖ Ú Ó×           Ô Ð Ú ØÓÖ Þ      ½½¼
             Ñ Ñ ÖÓ× ÔÙ Ð Ó×           ArrayStack<T>   ½½¼
        };
            template <typename T, const size_t dim = 100>
        class FixedStack
        {
        };
        ¬Ò ×
        ArrayStack¸   Ù×       Ò ÙÒ × ½½¼ ¸ ½½ ¸ ½¾ ¸ ¾ ß ¸ Ò   ¿¾ º
        FixedStack¸   Ù×       Ò ÙÒ × ½ ¿ ¸     ¸ Ò ½ º
        ÄÓ× Ó× Ø ÔÓ×               ØÓ× ÔÓ× Ò ÐÓ× Ñ ×ÑÓ× ØÖ ÙØÓ× ×ØÓ× ×ÓÒ
½½¼   Ñ Ñ ÖÓ× ÔÖ Ú Ó×              Ô Ð Ú ØÓÖ Þ ½½¼ ≡                              ´½¼ µ
        T      array[dim];
        size_t head;
      array  × ÙÒ ÖÖ ÐÓ ×Ø Ø Ó     Ð Ñ ÒØÓ× Ø ÔÓ T ÓÒ Ñ Ò× ÓÒ dimº dim × ÙÒ
      Ô Ö Ñ ØÖÓ Ð ÔÐ ÒØ ÐÐ ÕÙ Ö ÔÖ × ÒØ Ð Ñ Ò× ÓÒ Ð ÖÖ ÐÓ Ý ÓÒ ÙÒ Ú ÐÓÖ ÔÓÖ
      ÓÑ × ÓÒ 100º
         head × Ð Ò        Ð ÔÖÓÜ Ñ ÒØÖ      ×ÔÓÒ Ð º Ì Ñ Ò Ò        Ð ÒØ
       Ð Ñ ÒØÓ× Ð Ô Ð º head - 1 × Ð Ò     Ð Ð Ñ ÒØÓ ØÓÔ º
         Ä ÓÒרÖÙ ÓÒ ÙÒ Ô Ð ×ÓÐÓ Ö ÕÙ Ö Ò Ð Þ Ö head
½½¼    Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayStack<T> ½½¼ ≡                 ´½¼ µ ½½¼
        ArrayStack() : head(0) { /* empty */ }
      Í× × ArrayStack ½¼ º
        È Ö Ò× ÖØ Ö ÙÒ Ð Ñ ÒØÓ × Ù× Ð Ñ ØÓ Ó push()
½½¼   Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayStack<T> ½½¼ +≡                             ´½¼ µ ½½¼ ½½¼
        T & push(const T & data) throw(std::exception, std::overflow_error)
        {
          if (head >= dim)
            throw std::overflow_error ("array stack overflow");
             ÔÙ×      Ø ½½¼
        }

½½¼   ÔÙ×       Ø ½½¼      ≡                                                     ´½½¼ µ
        array[head++] = data;
        return array[head - 1];

           Ò Ð ÙÒ × ÔÐ ÓÒ ×¸ × Ö ÕÙ Ö Ô ÖØ Ö ×Ô Ó Ò Ð Ô Ð × Ò ÕÙ ÙÒ × ÓÒÓÞ Ò
      ÐÓ× Ú ÐÓÖ × Ò× Ö ÓÒº Ë Ò ×ØÓ ÔÙ ÐÓ Ö Ö× Ñ ÒØ ÙÒ × Ö ÓÒ× ÙØ Ú
      pushes      ØÓ× Ú Ó× ¸ × Ñ × ¬ ÒØ Ó Ö Ö ÙÒ ×ÓÐ ÓÔ Ö ÓÒº Ì Ð ÓÔ Ö ÓÒ ×
         ÒÓÑ Ò pushn() Ý × ÑÔÐ ÒØ ÓÑÓ × Ù
½½¼    Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayStack<T> ½½¼ +≡        ´½¼ µ ½½¼ ½½½
        T & pushn(const size_t & n = 1) throw(std::exception, std::overflow_error)
        {
          if (head + n > dim)
            throw std::overflow_error ("array stack overflow");
               Ô ÖØ Ö Ò Ð Ñ ÒØÓ× ½½½
        }
2.5. Pilas                                                               111



        Ô ÖØ Ö Ð ØÓÔ ¸ Ð Ù×Ù Ö Ó ArrayStack<T> ÔÙ Ö Ö Ò Ö ÐÓ× n Ð Ñ ÒØÓ×
      Ò× ÖØ Ó× ÕÙ ÒÓ Ò × Ó Ò Ð Þ Ó× Ý × × Ò ÖÐ × ×Ù Ú ÐÓÖ Ù Ò Ó × Ò × Ö Óº
           Ô ÖØ Ö Ò Ð Ñ ÒØÓ× ½½½ × ÑÙÝ × ÑÔÐ ÓÒ ÙÒ ÖÖ ÐÓ ×Ø ÓÒ Ò Ö Ñ ÒØ Ö head
½½½    Ô ÖØ Ö Ò Ð Ñ ÒØÓ× ½½½ ≡                               ´½½¼ µ
       head += n;
       return array[head - 1];
        È Ö × Ö ÙÒ Ð Ñ ÒØÓ Ð Ô Ð ¸ ÙØ Ð Þ ÑÓ× pop()
½½½   Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayStack<T> ½½¼ +≡             ´½¼ µ   ½½¼ ½½½
       T pop()
       {
           ÔÓÔ Ø ½½½
       }

½½½   ÔÓÔ Ø ½½½    ≡                                                  ´½½½ µ
       return array[--head];

        ÈÓÖ Ö ÞÓÒ × ¬ Ò ¸ Ø Ñ Ò × × Ð Ó Ö Ö ÙÒ ÔÖ Ñ Ø Ú ÕÙ Ð Ö Ú Ö Ó×
      Ð Ñ ÒØÓ× Ò ÙÒ ×ÓÐ ÓÔ Ö ÓÒ
½½½   Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayStack<T> ½½¼ +≡  ´½¼ µ ½½½ ½½½
       T popn(const int & n)
       {
           Ð Ö Ö Ò Ð Ñ ÒØÓ× ½½½
       }
       Ò Ð ÙÒÓ× ÓÒØ ÜØÓ׸ ר ÓÔ Ö ÓÒ × Ð ÐÐ Ñ ÑÙÐØ ÔÓÔ º
½½½   Ð Ö Ö Ò Ð Ñ ÒØÓ× ½½½ ≡                                          ´½½½ µ
       head -= n;
       return array[head];

          À Ý Ú Ö × ÓÖÑ ×    ÓÒ×ÙÐØ Ö Ð Ô Ð ØÓ × × Ö Ð Þ Ò Ö ×Ô ØÓ Ð ØÓÔ Ý Ö ØÓÖÒ Ò
      ÙÒ Ö Ö Ò       ÙÒ Ð Ñ ÒØÓ ÒØÖÓ Ð Ô Ð º Ä ÔÖ Ñ Ö ÓÖÑ × Ð Ð Ð Ñ ÒØÓ Ò Ð
      ØÓÔ
½½½    Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayStack<T> ½½¼ +≡            ´½¼ µ ½½½ ½½½
       T & top()
       {
           Ö ØÓÖÒ Ö Ö Ö Ò       Ð ØÓÔ ½½½
       }

½½½   Ö ØÓÖÒ Ö Ö Ö Ò        Ð ØÓÔ ½½½   ≡                             ´½½½ µ
       return array[head - 1];

         ÇØÖÓ Ø ÔÓ ÓÒ×ÙÐØ ¸ Ñ ÒÓ× Ö Ù ÒØ Ô ÖÓ ÔÓ× Ð Ò Ð ÙÒ × ÔÐ ÓÒ ×¸ × ÓÒÓ Ö
      Ð i¹ × ÑÓ Ð Ñ ÒØÓ Ö ×Ô ØÓ Ð ØÓÔ
½½½   Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayStack<T> ½½¼ +≡           ´½¼ µ ½½½ ½½¾
       T & top(const int & i)
       {
          Ö ÖÒ      Ð i¹ × ÑÓ Ö   ×Ô ØÓ ØÓÔ ½½½
       }
      ÍÒ Ú Þ Ú Ð Ó Ð Ö Ò Ó          ×Ó¸ Ð Ð Ñ ÒØÓ ×      ÓÑ      ÒØ
½½½   Ö ÖÒ      Ð i¹ × ÑÓ Ö ×Ô ØÓ ØÓÔ ½½½ ≡                           ´½½½ µ
       return array[head - i - 1];
112                                                         Cap´
                                                                     ıtulo 2. Secuencias




         Ò Ð ÙÒ × Ó × ÓÒ × ÙÒ Ô Ð × Ö ÙØ Ð Þ Ð ÓÒ ÓÒ ÕÙ ×Ø × ÔÖ Ú Ñ ÒØ
      Ú    º Î Ö Ð Ô Ð ÑÔÐ ÒØ     ÓÒ ÙÒ ÖÖ ÐÓ × ÙÒ ÓÔ Ö ÓÒ ÜØÖ Ñ Ñ ÒØ Ö Ô
½½¾    Ú Ö Ô Ð ½½¾ ≡                                          ´½½¾ µ
        head = 0;
      ר    Ð    ÑÖ         Ó Ö Ö× Ò ÙÒ ÔÖ Ñ Ø Ú
½½¾   Ñ Ñ ÖÓ× ÔÙ Ð Ó×        ArrayStack<T>   ½½¼ +≡           ´½¼ µ ½½½ ½½¾
        void empty() { Ú Ö Ô Ð ½½¾ }
        ÈÓ ÑÓ× ÓÒ×ÙÐØ Ö ÙÒ ÔÖ        Ó ÕÙ ÒÓ×   × Ð Ô Ð ×Ø Ó ÒÓ Ú
½½¾   Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayStack<T> ½½¼ +≡             ´½¼ µ ½½¾ ½½¾
       bool is_empty() const { Ô Ð Ú      ½½¾ }
½½¾   ÔÐ Ú      ½½¾ ≡                                            ´½½¾ µ
        return head == 0;
        Ä ÒØ         Ð Ñ ÒØÓ× Ð Ô Ð × Ö Ø Ñ ÒØ Ð Ú ÐÓÖ head
½½¾   Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayStack<T> ½½¼ +≡            ´½¼ µ ½½¾
        const size_t & size() const { return head; }
            Ò Ú Ð ÒØ Ö Þ¸ FixedStack<T> × ÒØ        ArrayStack<T>º ÈÓÖ Ö ÞÓÒ ×
       ÓÑÔ Ø Ð ¸ × ÔÖ Ö Ð ¬Ò Ö Ð × Ñ ×Ñ × Ü Ô ÓÒ × ArrayStack<T> Ò Ð ×
      ÔÖ Ñ Ø Ú × FixedStack<T>º     ר ÑÓ Ó¸ FixedStack<T> × ÔÐ Ð Ò          רÓ
       ÓÒ × ÙØ Ð ArrayStack<T>º
            Ò Ú Ð ÑÔÐ ÒØ ÓÒ¸ FixedStack<T> × ÑÙÝ × Ñ Ð Ö ArrayStack<T>º Ä ¹
        Ö Ò ÔÖ Ò Ô Ð Ö × Ò ÕÙ FixedStack<T> ÒÓ ØÙ Ú Ö ¬ ÓÒ              × ÓÖ Ò
        ×Ô Ö Ü Ô ÓÒ ×º Ö ×ØÓ¸       ÔÖ Ñ Ø Ú FixedStack<T> × ÒØ         ×Ù Ô Ö Ò
      ArrayStack<T>º

      2.5.3    El TAD ListStack<T> (pila con listas enlazadas)
        Ð Ì ListStack<T> ÑÓ Ð Þ ÙÒ Ô Ð ÑÔÐ ÒØ Ñ ÒØ Ð ×Ø × ÒÐ Þ ×º Ð ÓÒÓ¹
         Ö Ð Ø ÔÓ ÑÔÐ ÒØ ÓÒ¸ Ð Ù×Ù Ö Ó ÓÒÓ ÐÓ× Óר × Ò ×Ô Ó Ý Ø ÑÔÓ¸ × ÓÑÓ Ð ×
         Ò Ò × Ò Ú Ö× Ø Ð      ÑÔ ÖØ × ÔÓÖ Ð Ò ØÙÖ Ð Þ Ò Ñ     Ð × Ð ×Ø × ÒÐ Þ ×º
          ListStack<T> ×     × Ò Ð Ì Snode<T>¸ Р٠и Ò × Ò ¸ ÓÒØ Ò ØÓ Ó ÐÓ Ò ¹
      × Ö Ó Ô Ö Ñ Ò Ö Ð × Ð ×Ø ׺ ListStack<T> × ¬Ò Ò Ð Ö ÚÓ ØÔÐ Ð ×ØËØ ºÀ ½½¾
½½¾    ØÔÐ Ð ×ØËØ ºÀ ½½¾ ≡
            template <typename T>
        class ListStack : private Snode<T>
        {
            ØÖ ÙØÓ× ListStack<T> ½½¾
           Ñ ØÓ Ó× ÔÙ Ð Ó× ListStack<T>       ½½¿
        };
        ¬Ò ×
        ListStack¸ Ù×   Ò ÙÒ × ½½¿ß½ º
      Í× × Snode ½ º
      Å ÒØ Ö Ú ÓÒ Snode<T>¸ this ÙÒ                    ÒÓ Ó        Ö    Ð Ð ×Ø ÙÝÓ ÔÖ Ñ Ö
      Ð Ñ ÒØÓ × ÑÔÖ × Ö Ð ÒÓ Ó ØÓÔ Ð Ô Ð º
         ListStack<T> ÔÓ× ÙÒ ØÖ ÙØÓ ÙÒ Ó
½½¾    ØÖ ÙØÓ× ListStack<T> ½½¾ ≡                                       ´½½¾ µ
        size_t num_nodes;
2.5. Pilas                                                                          113



                                               T:class
                                             Snode



                                                          T:class
                                            ListStack
                                    -num_nodes: size_t
                                    +ListStack()
                                    +push(node:Node*): void
                                    +pop(): Node*
                                    +top(): Node*
                                    +is_empty(): bool
                                    +size(): size_t




                                                            T:class
                                           DynListStack
                                   +top(): T&
                                   +push(_data:const T&): T&
                                   +pop(): T
                                   +~DynListStack(): virtual




                   ÙÖ ¾º¾¼       Ö Ñ ÍÅÄ       Ð × Ð × × Ú Ò ÙÐ       ×    ListStack<T>


       Ð Ù Ð ÓÒØ Ð Þ Ð         ÒØ       ÒÓ Ó× ÕÙ ÔÓ× Ð Ô Ð º
         ListStack<T>        ÜÔÓÖØ Ó× × ÒÓÒ ÑÓ× ÒÓ Ó
½½¿   Ñ ØÓ Ó× ÔÙ Ð Ó×    ListStack<T>    ½½¿ ≡                             ´½½¾ µ ½½¿
        typedef Snode<T> Node;
      Í× × Snode ½ º
           Ò Ú Ð ÒØ Ö Þ¸ Ð × ÓÔ Ö ÓÒ × ListStack<T> Ñ Ò Ò ÒÓ Ó×          Ð ÔÐ º
      Item × ÙÒ × ÒÓÒ ÑÓ Ó Ö Ó ÔÓÖ ÓÑÔ Ø Ð       ÓÒ Ú Ö× ÓÒ × ÒØ Ö ÓÖ ×º
          Ð ÓÒרÖÙ ØÓÖ ListStack<T> ×ÓÐÓ × Ö Ñ Ø Ò Ö Ð ÓÒØ ÓÖ ÒÓ Ó×
½½¿   Ñ ØÓ Ó× ÔÙ Ð Ó× ListStack<T> ½½¿ +≡              ´½½¾ µ ½½¿ ½½¿
        ListStack() : num_nodes(0) { /* Empty */ }
      Í× × ListStack ½½¾ º
        Ä ÓÔ Ö ÓÒ push() × ¬Ò Ò ÙÒ ÓÒ                    ÙÒ ListStack<T>::Node
½½¿   Ñ ØÓ Ó× ÔÙ Ð Ó× ListStack<T> ½½¿ +≡                         ´½½¾ µ    ½½¿ ½½
        void push(Node * node)
        {
          ++num_nodes;
          this->insert_next(node);
        }
      push() ÒÓ Ò Ö Ò Ò ÙÒ Ü Ô ÓÒ¸ ÔÙ × ×Ù ÙÒ        Ö ×ÔÓÒ× Ð     × ÒÐ Þ Ö Ð ÒÓ Ó
      Ð Ð ×Ø º ÈÙ ×ØÓ ÕÙ this × Ð      Ö ¸ insert next() × ÑÔÖ Ò× ÖØ Ö node Ð Ö ÒØ
         Ð Ð ×Ø ¸ Ð Ù Ð × ÑÔÖ × ÓÖÖ ×ÔÓÒ ÓÒ Ð ØÓÔ º
114                                                           Cap´
                                                                      ıtulo 2. Secuencias



        ËÙÔÖ Ñ Ö Ð ØÓÔ ÕÙ Ú Ð ×ÙÔÖ Ñ Ö Ð ÒÓ Ó Ð Ö ÒØ             Ð Ð ×Ø º ×ØÓ × Ö ØÓ × ÙÒ
     Ð ÒØ Ö Þ Snode<T>
½½    Ñ ØÓ Ó× ÔÙ Ð Ó× ListStack<T> ½½¿ +≡                    ´½½¾ µ ½½¿ ½½
       Node * pop()
       {
         --num_nodes;
         return this->remove_next();
       }
         Ð ØÓÔ ÔÙ    ÓÒ×ÙÐØ Ö× Ñ ÒØ
½½   Ñ ØÓ Ó× ÔÙ Ð Ó× ListStack<T> ½½¿          +≡                  ´½½¾ µ   ½½
       Node * top() const
       {
         return static_cast<Node*>(this->get_next());
       }


     2.5.4    El TAD DynListStack<T>
       Ð Ì ListStack<T> Ñ Ò Ô Ð × Ò ÙÒ ÓÒ ÒÓ Ó× ÙÒ Ð ×Ø ÒÐ Þ º רÓ
     Ó Ð Ð Ù×Ù Ö Ó ÓÒØÖÓÐ Ö Ý Ú Ö ¬ Ö Ø ÐÐ × Ð Ñ Ò Ó Ñ ÑÓÖ º Ä Ö ×ÔÓÒ× Ð
         ListStack<T> × Ð Ñ Ò Ó     ÐÓ× ÒÓ Ó× Ð Ö ×ÔÓÒ× Ð       Ð Ð ÒØ × Ô ÖØ Ö Ý
     Ð Ö Ö ÐÓ× ÒÓ Ó׺ ÓÑÓ ÑÓ× ÔÖ Ò Ó Ò Ó × ÓÒ × ÒØ Ö ÓÖ ×¸ Ñ Ò Ö ÐÓ× ÒР׸
     Ø ÔÓ× Ý Ñ ÑÓÖ ÔÙ Ö Ð Þ Ö× Ó ÙÒ ×ÓÐÓ Ì ¸ Ö Ú Ó Ì Ñ × × Ò ÐÐÓ׺
           Ð Ì DynListStack<T> ÙÑÔÐ Ð ÓÑ Ø Ó Ñ Ò ÓÒ Ó Ò Ð Ô ÖÖ Ó ÒØ ¹
     Ö ÓÖº DynListStack<T> ¬Ò ÙÒ Ô Ð ÑÔÐ ÒØ            ÓÒ Ð ×Ø × ÒÐ Þ × × ÑÔÐ × Ý
      ÓÒ Ñ Ò Ó       Ñ ÑÓÖ Ò ÐÙ Óº DynListStack<T> ר ¬Ò Ó Ò Ð Ö ÚÓ
     ØÔÐ ÝÒÄ ×ØËØ ºÀ ½½
½½   ØÔÐ ÝÒÄ ×ØËØ ºÀ ½½         ≡
           template <typename T>
       class DynListStack : public ListStack<T>
       {
          Ñ ØÓ Ó× DynSlist<T> ½½
       };
       ¬Ò ×
       DynListStack¸ Ù×     Ò ÙÒ × ½½ ¸ ¾¼½¸   ¸ ¿ ¸   ¸   ¸ Ò     º
     Í× × ListStack ½½¾ º
        DynListStack<T> ÐÑ Ò      ØÓ×        Ð Ø ÔÓ Ò Ö Ó Tº Ð Ö Ú Ö ÔÙ Ð Ñ ÒØ
     ListStack<T>¸ DynListStack<T> Ö            Ö Ò Ô ÖØ ×Ù ÑÔÐ ÒØ ÓÒ Ý ×Ù ÒØ Ö Þº
     Ð Ñ Ò Ó Ð ×Ø × ÐÓ ÔÓÖØ ¸ ÒØÓÒ ×¸ ListStack<T>º Ä × ÔÖ Ñ Ø Ú × ÕÙ ÒÓ Ô Ò Ò
      Ð Ø ÔÓ T¸ is empty() Ý size()¸ × Ö Ò Ö Ø Ñ ÒØ º Ä × ÓØÖ × ÔÖ Ñ Ø Ú ×¸ ÕÙ ×
      Ô Ò Ò ListStack<T>¸             Ò ×Ó Ö Ö Ö× Ô Ö ÕÙ Ñ Ò ÔÙÐ Ò ØÓ× Ø ÔÓ Tº
          ÓÑ ÒÞ ÑÓ× ÔÓÖ Ð × ÔÖ Ñ Ø Ú × Ñ × × Ò ÐÐ ×
½½   Ñ ØÓ Ó× DynSlist<T> ½½ ≡                                 ´½½ µ ½½
       T & top() const
       {
         return ListStack<T>::top()->get_data();
       }
     Í× × ListStack ½½¾ º
2.5. Pilas                                                                           115



     top() ÓÒ×ÙÐØ         Ð ÒÓ Ó ØÓÔ Ð Ð × × Ý Ö ØÓÖÒ ÙÒ Ö Ö Ò Ð ØÓº
        push()              Ò× ÖØ Ö ÙÒ ØÓ Ø ÔÓ Tº ×ØÓ Ö ÕÙ Ö ¸ Ô ÖØ Ö Ð ÒÓ Ó¸ ÓÔ ÖÐ Ð
      ØÓ ÒÚÓ Ö Ð push() ListStack<T>
½½   Ñ ØÓ Ó× DynSlist<T> ½½ +≡                                ´½½ µ      ½½   ½½
       T & push(const T & item)
       {
         typename ListStack<T>::Node *ptr = new typename ListStack<T>::Node (item);
         ListStack<T>::push(ptr);
         return ptr->get_data();
       }
     Í× × ListStack ½½¾ º
     push() Ö ØÓÖÒ ÙÒ Ö Ö Ò Ð ØÓ ÓÒØ Ò Ó Ò Ð ØÓÔ º
        Ä Ð ÓÖ pop() × ÜØÖ Ö Ð ÒÓ Ó ListStack<T>¸ ÓÔ Ö Ð ØÓ Ö ØÓÖÒ Ö Ý
     Ð Ö Ö Ð Ñ ÑÓÖ º ר ÓÒ Ù Ø × ×Ô ¬ ÓÑÓ × Ù
½½    Ñ ØÓ Ó× DynSlist<T> ½½ +≡                 ´½½ µ ½½ ½½
       T pop()
       {
         typename ListStack<T>::Node* ptr = ListStack<T>::pop();
         T retVal = ptr->get_data();
         delete ptr;
         return retVal;
       }
     Í× × ListStack ½½¾ º
           ÈÙ ×ØÓ ÕÙDynListStack<T>         × Ö ×ÔÓÒ× Ð    Ð ÑÒ Ó                     Ñ ÑÓÖ ¸
     DynListStack<T>::∼DynListStack            Ð Ö Ö ØÓ Ð Ñ ÑÓÖ º                  × Ô٠׸ ÒÓ×
     × ÙÖ ÑÓ×         Ú     Ö ØÓ Ð Ô Ð Ò Ø ÑÔÓ     רÖÙ ÓÒ
½½   Ñ ØÓ Ó×    DynSlist<T> ½½ +≡                                     ´½½ µ ½½
       virtual ~DynListStack()
       {
         while (not this->is_empty())
           pop();
       }
     Í× × DynListStack ½½ º
     ÆÓØ ÑÓ× ÕÙ    is empty() Ô   ÖØ Ò    ListStack<T> Ñ      ÒØÖ × ÕÙ    pop() DynListStack<T>º



     2.5.5    Aplicaci´n: un evaluador de expresiones aritm´ticas infijas
                      o                                    e
      Ò Ð ÓÑ Ò Ó Ð Ñ Ø Ñ Ø ¸ Ý Ú Ö × Ñ Ò Ö × Ö ÔÖ × ÒØ Ö ÙÒ ÓÔ Ö ÓÒ Ò Ö º
          ÙÒ ×ÙÑ ÙÒ ÓÒÚ Ò ÓÒ Ö              Ð ÔÓ× ÓÒ Ð ÓÔ Ö ÓÖ Ý ÐÓ× ÓÔ Ö Ò Ó׺ Ò
     ÒÓØ ÓÒ prefija¸ Ð ÓÔ Ö ÓÖ ÔÖ        ÐÓ× ÓÔ Ö Ò Ó׺ Ò ÒÓØ ÓÒ sufija½ ¸ Ð ÓÔ Ö ÓÖ
     ×Ù      ÐÓ× ÓÔ Ö Ò Ó׺ Ò ÒÓØ ÓÒ infija¸ Ð ÓÔ Ö ÓÖ × ÓÐÓ ÒØÖ ÐÓ× Ó× ÓÔ Ö Ò Ó׺
     ÈÓÖ ÑÔÐÓ¸ ÔÓ ÑÓ× Ö ÔÖ × ÒØ Ö Ð ×ÙÑ        Ó× ÓÔ Ö Ò Ó× x y ÓÑÓ × Ù
        ¯ ÈÖ ¬     +xy

        ¯ ËÙ¬     xy+
       ½
           Ò Ò Ð × × ØÖ Ù Ó ÓÑÓ ÔÓר¬Üº    ÐÐ ÕÙ Ð ÙÒÓ× Ø ÜØÓ× Ð   ÒÓÑ Ò Ò ÔÓר¬ º
116                                                      Cap´
                                                            ıtulo 2. Secuencias



   ¯  ÁÒ¬ x + y
    Ä ÒÓØ ÓÒ ÔÖ ¬ × ÔÖÓÜ Ñ Ð × Ñ Ø Ñ Ø × ØÖ ÓÒ Ð ×º Ð Ö ×ÙÐØ Ó Ú ÐÙ Ö
ÙÒ ÙÒ ÓÒ f ÓÒ Ó× ÓÔ Ö Ò Ó× x y × ÒÓØ ÓÑÙÒÑ ÒØ ÓÑÓ f(x, y)º Ð Ñ ×ÑÓ
ÑÓ Ó¸ Ð ÓÑÔÓ× ÓÒ ÙÒ ÓÒ Ð × ÒÓØ ÓÑÓ h(f(x, y)º
    Ä × ÒÓØ ÓÒ × ÔÖ ¬ Ý ×Ù¬ Ô ÖÑ Ø Ò ÙÒ ÒØ         Ö ØÖ Ö      ÓÔ Ö Ò Ó׺ ר
 × ÙÒ Ö Ò Ú ÒØ Ô Ö ÒÓØ Ö ÙÒ ÓÒ × ÑÙÐØ Ú Ö Ð × Ò ÓÐ Ù ÐÕÙ Ö º              Ñ ×¸
 Ù Ò Ó Ý Ú Ö × ÓÔ Ö ÓÒ ×¸ Ð × ÒÓØ ÓÒ × ÔÖ ¬ Ý ×Ù¬ Ô ÖÑ Ø Ò ÜÔÖ × Ö ØÓ × Ð ×
ÓÔ Ö ÓÒ × × Ò Ò ×         Ô Ö ÒØ × ×º ÈÓÖ ÑÔÐÓ¸ Ð ÓÖÑ ×Ù¬        x ∗ (y + z) ×
yz + x∗º
    È Ö Ú ÐÙ Ö ÙÒ ÜÔÖ × ÓÒ ÔÖ ¬ Ó ×Ù¬ × ÙØ Ð Þ ÙÒ Ô Ð º Ð Ð ÓÖ ØÑÓ Ô Ö Ú ÐÙ Ö
 ÜÔÖ × ÓÒ × ×Ù¬ × × × Ö ÓÑÓ × Ù
Algoritmo 2.2 (Evaluaci´n de expresi´n sufija)
                       o            o           Ä ÒØÖ      Ð Ð ÓÖ ØÑÓ × ÙÒ
× ÙÒ       ÓÒØ Ò Ò Ó ÙÒ ÜÔÖ × ÓÒ ×Ù¬       ÓÑÔÙ ×Ø ÔÓÖ ÓÔ Ö ÓÖ × Ý ÓÔ Ö Ò Ó×
ÒÙÑ Ö Ó׺
   Ä × Ð × Ð Ú ÐÓÖ ÓÖÖ ×ÔÓÒ ÒØ Ð Ö ×ÙÐØ Ó ¬Ò к
    Ð Ð ÓÖ ØÑÓ ÙØ Ð Þ ÙÒ Ô Ð Ô Ö Ù Ö Ö Ö ×ÙÐØ Ó× Ô Ö Ð × Ý ÙÒ Ú Ö Ð ÐÐ Ñ
 ¬     ØÙ Ð Ó × ÑÔÐ Ñ ÒØ Ð ¬ º Ä ¬       ÓÒØ Ò Ð × Ñ ÓÐÓ¸ ÓÔ Ö Ò Ó Ù ÓÔ Ö ÓÖ¸
ÕÙ × ×Ø ÔÖÓ × Ò Óº
Algoritmo

  ½º Ê Ô Ø Ñ ÒØÖ × Ð ¬     ÒÓ ×Ø Ð ¬Ò Ð     Ð × ÙÒ º
       ´µË Ð ¬    × ÙÒ ÓÔ Ö ÓÖ =⇒ × ÕÙ Ó× Ú ÐÓÖ × Ð Ô Ð ¸ ØÙ Ð ÓÔ Ö ÓÒ
             ÔÓÖ Ð ÓÔ Ö ÓÖ Ð Ó¸ Ý ÐÑ Ò Ð Ö ×ÙÐØ Ó Ò Ð Ô Ð º
       ´ µ ÐÓ ÓÒØÖ Ö Ó¸ × Ð ¬   × ÓÔ Ö Ò Ó =⇒ Ñ Ø ÐÓ Ò Ð Ô Ð º
  ¾º Ù Ò Ó × Ð Ò Ð ¬Ò Ð Ð × Ù Ò ¸ Ð Ö ×ÙÐØ Ó ÐÑ Ò Ó Ò Ð Ô Ð × Ð
    Ö ×ÙÐØ Ó Ð ÜÔÖ × ÓÒº Ë Ð Ô Ð ×Ø Ú Ó ×Ø ÓÒØ Ò Ñ ×   Ó× Ú ÐÓÖ ×¸
     ÒØÓÒ × Ð ÜÔÖ × ÓÒ ×Ù¬ ÓÒØ Ò Ð ÙÒ ÖÖÓÖº
    ÍÒ Ð ÓÖ ØÑÓ × Ñ Ð Ö ÔÙ        Ù Ö× Ô Ö Ú ÐÙ Ö ÜÔÖ × ÓÒ × ÔÖ ¬ ׺
    Ä ÒÓØ ÓÒ ×Ù¬ ÙÒØÓ ÓÒ Ð Ð ÓÖ ØÑÓ ¾º¾ × ÓÑÙÒ Ò Ð ÙÒ × Ð ÙÐ ÓÖ ×
  ÓÐ× ÐÐÓ¸ ÒØ ÙÓ× ÔÖÓ × ÓÖ × Ý Ò Ð ÙÒÓ× Ð Ò Ù × ÔÖÓ Ö Ñ ÓÒº
    ÈÓÖ ×ÙÔÙ ×ØÓ¸ Ð ÒÓØ ÓÒ Ò¬ × Ð Ñ × Ñ Ð Ö¸ Ô ÖÓ ×Ø ×ÓÐÓ Ô ÖÑ Ø ÐÓ ×ÙÑÓ
  Ó× ÓÔ Ö Ò Ó׺ Ò Ò ÙÖ ¸ Ð ÔÖ            Ò      Ð × ÓÔ Ö ÓÒ × ÔÙ Ö ÕÙ Ö Ö Ð Ù×Ó
    Ô Ö ÒØ × ×º      Ù×    רӏ ÜÔÖ × ÓÒ × ÓÑÔÐ      × ×ÓÒ ÒÓÖÑ ÐÑ ÒØ Ñ × Ð Ö × Ò
 ÓÖÑ Ò¬ ÕÙ ×Ù× ÕÙ Ú Ð ÒØ × ÔÖ ¬ Ó Ó ×Ù¬ Óº ר              Ó ×Ù Ö ÕÙ Ñ Ò ÔÙÐ Ö Ý
 Ú ÐÙ Ö ÜÔÖ × ÓÒ × Ò¬ × × Ñ × ÓרÓ×Ó Ò ×Ô Ó Ý Ò Ø ÑÔÓ ÕÙ Ò Ð × ÓØÖ × Ó×
ÒÓØ ÓÒ ×º ÈÓ× Ð Ñ ÒØ ÔÓÖ ×Ø Ö ÞÓÒ¸ Ð ÙÒÓ× Ö ÒØ ×                 Ð ÙÐ ÓÖ × Ñ ÒÓ
ÔÖ ¬ Ö Ò Ð ÒÓØ ÓÒ ×Ù¬ º
       Ü ×Ø ÙÒ Ð ÓÖ ØÑÓ ÑÙÝ ¬ ÒØ Ô Ö Ú ÐÙ Ö ÙÒ ÜÔÖ × ÓÒ Ò¬ ¸ Ð Ù Ð Ö ÕÙ Ö Ó×
Ô Ð ×º ÍÒ Ô Ð ÐÑ Ò ÓÔ Ö Ò Ó× Ý Ö ×ÙÐØ Ó× Ô Ö Ð × Ð ÓØÖ ÐÑ Ò ÓÔ Ö ÓÖ × Ý
Ô Ö ÒØ × × ÕÙ Ö ÔÖ × ÒØ Ò Ð ÔÖ      Ò º
       ÒØ ×     ÜÔÐ Ö Ð Ð ÓÖ ØÑÓ¸ Ö ÕÙ Ö ÑÓ× Ð ÙÒ Ñ ÕÙ Ò Ö          × ÕÙ     ØÙ Ð
ÔÖÓ × Ñ ÒØÓ Ð            Ò       Ö Ø Ö × Ý ÕÙ ÒÓ× Ò ÕÙ × ×Ø ÑÓ× Ò ÔÖ × Ò
2.5. Pilas                                                                   117



     ÙÒ ÓÔ Ö Ò Ó Ù ÓÔ Ö ÓÖº È Ö ÐÐÓ¸ ¬Ò ÑÓ× ÐÓ× ÔÓ× Ð × Ú ÐÓÖ ×       ¬ × ÕÙ ÔÙ Ò
      Ò ÓÒØÖ Ö× Ò ÙÒ      Ò
½½    Ø ÔÓ ¬ ½½ ≡
       enum Token_Type { Value, Operator, Lpar, Rpar, End, Error };
       ¬Ò ×
       Token Type¸    Ù×     Ò ÙÒ × ½½   Ò ½¾¼ º
     Value Ö ÔÖ × ÒØÙÒ ÓÔ Ö Ò Ó¸ Operator Ö ÔÖ × ÒØ ÙÒÓ ÐÓ× ÓÔ Ö ÓÖ × +, −, ∗, Ó /¸
     Lpar Ý Rpar Ö ÔÖ
                   × ÒØ Ò ÐÓ× Ô Ö ÒØ × × ÞÕÙ Ö Ó Ý Ö Ó Ö ×Ô Ø Ú Ñ ÒØ ¸ End Ö ÔÖ × ÒØ
      Ð ¬Ò Ð      Ò Ý¸ ¬Ò ÐÑ ÒØ ¸ Error Ò ÕÙ × Ò ÓÒØÖÓ ÙÒ × Ñ ÓÐÓ ÕÙ ÒÓ ÔÙ
     × Ö ÓÒ× Ö Ó Ò ÓÔ Ö Ò Ó Ò ÓÔ Ö ÓÖº
           ÓÖ ÔÓ ÑÓ× ¬Ò Ö ÙÒ ÖÙØ Ò ÕÙ Ð Ð           Ò Ý ÒÓ× Ò ÕÙ ÕÙ Ø ÔÓ ¬ ×
      ר Ð Ý Ò Ó
½½    ÖÙØ Ò Ð ØÓÖ ¬ × ½½ ≡
       Token_Type lexer(char *& str, size_t & len)
       {
              Ù ÖÔÓ        Ð Ü Ö ½½
       }
     Í× × Token Type ½½ º
     lexer()   Ò×Ô ÓÒ × Ù Ò ÐÑ ÒØ Ð       Ò       Ö Ø Ö × ÓÒØ Ò Ò str Ô ÖØ Ö
       Ð × Ñ ÓÐÓ str + lenº Ð ¬Ò Ð Ð ÐÐ Ñ ¸ str ÔÙÒØ Ð ÔÖ Ñ Ö × Ñ ÓÐÓ Ð ¬ º
      Ð Ú ÐÓÖ str ÔÙ ÑÓ ¬ Ö× ¸ ÔÙ × ÔÙ Ò          Ö ×Ô Ó× Ò Ð Ò Ó ÕÙ ÒÓ     Ò
     ÔÖÓ × Ö× º
         lexer() Ö ØÓÖÒ Ð Ø ÔÓ    ¬ ÕÙ ×      Ø Ø Óº Ð Ô Ö Ñ ØÖÓ len × ÑÓ ¬
     Ô Ö Ò Ö Ð ÐÓÒ ØÙ Ò Ö Ø Ö × Ð ¬            ØÙ Ð Ò ÓÒØÖ º
         ÄÓ× Ú ÐÓÖ × ÐÓ× Ô Ö Ñ ØÖÓ× × Ò Ò Ð × Ù ÒØ ÑÓ Ó
½½     Ù ÖÔÓ Ð Ü Ö ½½ ≡                                   ´½½ µ ½½
       str += len;
       len = 1;
         ÒÓÖ Ö ×Ô Ó× Ò Ð Ò Ó ½½
     ÈÓÖ ¬Ò ÓÒ¸ Ð Ò×Ô ÓÒ ÓÑ ÒÞ Ò str + lenº Ð Ò Ó¸ Ð ÐÓÒ ØÙ    Ð ¬                ÕÙ
     × Ò Ù ÒØÖ × Ö Ð Ñ ÒÓ× ÙÒ ÙÒ º
        ÁÒ      Ð Ò×Ô ÓÒ¸ Ð ÖÙØ Ò  ÒÓÖ Ö ÐÓ× ×Ô Ó× Ò Ð Ò Ó׺ ×ØÓ ×                ¬Ò
        ÐÑ ÒØ ÓÑÓ
½½     ÒÓÖ Ö ×Ô Ó× Ò Ð Ò Ó ½½ ≡                          ´½½ µ
       while (isblank(*str))
         str++;
     isblank()    × ÙÒ ÜØ Ò× ÓÒ ÆÍ Ð          Ð ÓØ  ר Ò Ö Ð Ð Ò Ù        Ý Ö ØÓÖÒ ÙÒ
     Ú ÐÓÖ Ö ÒØ          ÖÓ × Ð × Ñ ÓÐÓ Ô Ö Ñ ØÖÓ ÓÖÖ ×ÔÓÒ ÙÒ Ð Ò Ó Ó Ø ÙÐ ÓÖº
         ÈÓÖ × ÑÔÐ      ¸ ÒÙ ×ØÖÓ Ú ÐÙ ÓÖ ×ÓÐÓ ÔØ ÐÓ× ÓÔ Ö ÓÖ × +¸ −¸ ∗ Ý /¸ ÐÓ× Ù Ð ×
     Ö ÔÖ × ÒØ Ò Ð × ÓÔ Ö ÓÒ × Ö ØÑ Ø × Ð × ×º Ð Ñ ×Ñ Ñ Ò Ö ¸ ÐÓ× ÓÔ Ö Ò Ó× ×ÓÐÓ
     ×ÓÒ ÒÙÑ ÖÓ× ÒØ ÖÓ׺ Ë ÐÚÓ ÙÒ ÓÔ Ö Ò Ó¸ Ð ÐÓÒ ØÙ      ÙÒ ¬     × ÙÒÓº Î Ö ¬ ÑÓ׸
     Ô٠׸ × Ð × Ñ ÓÐÓ Ò ÓÒØÖ Ó ÓÖÖ ×ÔÓÒ ÙÒ ÓÔ Ö ÓÖ
½½     Ù ÖÔÓ Ð Ü Ö ½½ +≡                                ´½½ µ ½½ ½½
       switch (*str)
       {
        case ’(’: return Lpar;
        case ’)’: return Rpar;
118                                                          Cap´
                                                                     ıtulo 2. Secuencias



       case   ’+’:
       case   ’-’:
       case   ’*’:
       case   ’/’: return Operator;
       case   ’0’: return End;
      }
     Ë Ð ­Ù Ó × Ð Ð switch¸ ÒØÓÒ × Ð ÙÒ ÔÓ× Ð     ÓÖÖ Ø × Ò ÓÒØÖ Ö ÙÒ ÓÔ Ö Ò Óº
     ÆÓ× Ö ÓÖ ÑÓ׸ ÒØÓÒ ×¸ ÕÙ Ð        Ò ÓÖÖ ×ÔÓÒ     ÙÒ ÓÔ Ö Ò Ó
½½    Ù ÖÔÓ Ð Ü Ö ½½ +≡                            ´½½ µ ½½ ½½
      if (not isdigit(*str))
        return Error;
     isdigit()   × ÙÒ ÙÒ ÓÒ Ð          Ð ÓØ  ר Ò Ö Ð Ð Ò Ù      Ý Ö ØÓÖÒ ÙÒ Ú ÐÓÖ
         Ö ÒØ      ÖÓ × Ð × Ñ ÓÐÓ Ô Ö Ñ ØÖÓ ÓÖÖ ×ÔÓÒ ÙÒ ØÓº
         Ë Ð ­Ù Ó ÒÓ Ö ØÓÖÒ ÖÖÓÖ¸ ÒØÓÒ × ÓÒØ Ð Þ ÑÓ× Ð ÒØ         ØÓ× ÔÓÖ Ð Ö
     Ý Ö ØÓÖÒ ÑÓ× Ð Ó Ó ¬ Value
½½     Ù ÖÔÓ Ð Ü Ö ½½ +≡                                   ´½½ µ ½½
      char* base = str + 1;
      while (isdigit(*base++))
        len++;
      return Value;
      Ù Ò Ó lexer() Ö ØÓÖÒ ÙÒ ÓÔ Ö ÓÖ¸  ÑÓ× ØÓÑ Ö ÓÒ × × ÙÒ Ð ÔÖ    Ò    Ð
     ÓÔ Ö ÓÖº È Ö ÐÐÓ¸ Ð ÓÖ ÑÓ× ÙÒ ÙÒ ÓÒ ÕÙ ¸ Ó ÙÒ ÓÔ Ö ÓÖ¸ Ø ÖÑ Ò ×Ù ÔÖ ¹
       Ò
½½    ÙÒ ÓÒ ÔÖ Ò ½½ ≡
      unsigned   precedence(const char & op) // $ < ( < +- < */
      {
        switch   (op)
          {
          case   ’$’:    return 0;
          case   ’(’:    return 1;
          case   ’+’:
          case   ’-’:    return 2;
          case   ’/’:
          case   ’*’:    return 3;
          }
      }
       ¬Ò ×
      precedence¸   Ù×   Ò ÙÒ ½¾½ º
      precedence() Ø Ò ÓÑÓ Ô Ö Ñ ØÖÓ ÙÒ × Ñ ÓÐÓº ÈÙ ×ØÓ ÕÙ ÐÓ× ÓÔ Ö ÓÖ × ×ÓÒ     ÙÒ
     ×ÓÐÓ × Ñ ÓÐÓ¸ ÔÓ ÑÓ× ÒØ ¬ Ö Ð Ó ÙÖÖ Ò      Ð ÓÔ Ö ÓÖ Ñ ÒØ Ò×Ô ÓÒ Ö Ø
        Ð      Òº
         À Ý ÙÒ ÓÔ Ö ÓÖ ¬ Ø Ó¸ °¸ ÓÒ Ð Ñ ÒÓÖ ÔÖ     Ò ¸ ÙÝÓ ÖÓÐ × ÜÔÐ Ö Ñ × ¹
     Ð ÒØ º Ð Ô Ö ÒØ × × ÞÕÙ Ö Ó × ÓÒ× Ö ÙÒ ÓÔ Ö ÓÖ Ò Ð × Ù ÒØ Ò Ú Ð ÔÖ       Ò º
     Ä ×ÙÑ Ý Ö ×Ø Ó ÙÔ Ò Ð ÔÖÓÜ ÑÓ Ò Ú Ð ÔÖ        Ò º Ò ÐÑ ÒØ ¸ ÐÓ× ÓÔ Ö ÓÖ × ÓÒ
     Ñ × ÔÖ      Ò ×ÓÒ Ð ÔÖÓ Ù ØÓ Ý Ð Ú × ÓÒº
         Ë lexer() Ö ØÓÖÒ Value¸ ÒØÓÒ × Ò × Ø ÑÓ× Ó Ø Ò Ö ÙÒ     Ò      Ö Ø Ö × ÕÙ
      ÓÒØ Ò Ð ÒÙÑ ÖÓº Ì Ð ÙÒ ÓÒ Ð Ö Ð Þ ÑÓ× Ð × Ù ÒØ ÑÓ Ó
½½     ÙÒ ÓÒ ÓÒÚ ÖØ Ö ¬           Ò ½½ ≡
2.5. Pilas                                                             119



       char * str_to_token(char * token_str, const size_t & len)
       {
         static char buffer[256];
         strncpy(buffer, token_str, len);
         buffer[len] = ’0’;
         return buffer;
       }
       ¬Ò ×
       str to token¸   Ù×   Ò ÙÒ ½¾¼ º
     str to token()  ÜØÖ ÙÒ ÓÔ Ð ÒÙÑ ÖÓ ÓÒØ Ò Ó Ò token strº
          Ð Ð ÓÖ ØÑÓ Ú ÐÙ ÓÒ Ù× Ö Ó× Ô Ð × ÓÑÓ × Ù
½½   Ô Ð × Ú ÐÙ ÓÒ ½½ ≡                                   ´½¾¼ µ
       ArrayStack<int> val_stack;
       ArrayStack<char> op_stack;
     Í× × ArrayStack ½¼ º
          Ð Ð ÓÖ ØÑÓ Ö Ð Þ ÓÔ Ö ÓÒ × Ò Ð Ò ÓÒ ÓÖÑ Ò Ð Þ Ð       Ò    ÒØÖ º Ä
     ÓÔ Ö ÓÒ ÙÒ Ñ ÒØ Ð × × Ö Ó× ÓÔ Ö Ò Ó× Ð Ô Ð val stack Ý ÙÒ ÓÔ Ö ÓÖ Ð
     Ô Ð op stack¸ ÐÙ Ó ØÙ Ö Ð ÓÔ Ö ÓÒ Ý¸ ¬Ò ÐÑ ÒØ ¸ ÐÑ Ò Ö Ð Ö ×ÙÐØ Ó ÒÙ ÚÓ
      Ò Ð Ô Ð val stackº ר Ô ØÖÓÒ × ÑÓ ÙÐ Ö Þ Ò Ð × Ù ÒØ ÖÙØ Ò
½½    ÙÒ ÓÒ         Ù ÓÒ ÓÔ Ö ÓÒ Ò Ô Ð × ½½ ≡
       void apply(ArrayStack<int>& val_stack, ArrayStack<char>& op_stack)
       {
         const char the_operator = op_stack.pop();
         const int right_operand = val_stack.pop();
         const int left_operand = val_stack.pop();
         int result;
         switch (the_operator)
           {
           case ’+’: result = left_operand + right_operand; break;
           case ’-’: result = left_operand - right_operand; break;
           case ’*’: result = left_operand * right_operand; break;
           case ’/’: result = left_operand / right_operand; break;
           }
         val_stack.push(result);
       }
       ¬Ò ×
       apply¸ Ù×   Ò     ÙÒ ½¾½º
     Í× × ArrayStack   ½¼ º
     apply()    ×ÙÑ ÕÙ Ð ÓÔ Ö Ò Ó Ö Ó Ù Ò× ÖØ Ó Ò Ð Ô Ð ×ÔÙ × Ð ÞÕÙ Ö Óº
      ×ØÓ × ÐÓ ÒÓÖÑ Ð × Ð   Ò     ÒØÖ × Ò Ð Þ      ÞÕÙ Ö       Ö º
          ÓÖ ×ÔÓÒ ÑÓ× Ð × ÖÖ Ñ ÒØ × Ò × Ö × Ô Ö × ÖÖÓÐÐ Ö ÙÒ ÖÙØ Ò ÕÙ Ú ÐÙ
     ÙÒ ÜÔÖ × ÓÒ Ò¬ º ÆÙ ×ØÖ ÖÙØ Ò × ÐÐ Ñ Ö eval() Ý Ø Ò Ö Ð × Ù ÒØ רÖÙ ØÙÖ
½½    ÙÒ ÓÒ Ú ÐÙ ÓÒ ÜÔÖ × ÓÒ Ò¬ ½½ ≡
       int eval(char* input)
       {
          Ú Ö Ð × Ú Ð ½¾¼
           Ò Ð Þ ÓÒ    Ú Ð ½¾¼
         while (true)
           {
120                                                        Cap´
                                                                    ıtulo 2. Secuencias



                  Ð Ö ÔÖÓÜ Ñ ¬      ½¾¼
                  switch (current_token)
                    {
                    case Value:
                       ÔÖÓ × Ö ÓÔ Ö Ò Ó ½¾¼
                   case Lpar:
                       ÔÖÓ × Ö Ô Ö ÒØ × × ÞÕÙ Ö Ó ½¾½
                   case Operator:
                       ÔÖÓ × Ö ÓÔ Ö ÓÖ ½¾½
                   case Rpar:
                       ÔÖÓ × Ö Ô Ö ÒØ × × Ö Ó ½¾½
                   case End:
                       ÔÖÓ × Ö ¬Ò     ÒØÖ     ½¾½
                   }
              }
        }
            input × Ð       Ò     Ö Ø Ö × ÕÙ ÓÒØ Ò Ð ÜÔÖ × ÓÒ Ò¬ º
            eval() Ö ÕÙ   Ö × Ù ÒØ × Ú Ö Ð ×
½¾¼   Ú Ö Ð × Ú Ð ½¾¼ ≡                                                 ´½½ µ
        Ô Ð × Ú ÐÙ ÓÒ ½½
        Token_Type current_token;
        unsigned token_len = 0;
      Í× × Token Type ½½ º
      current token  ×Ð ¬       ØÙ Ð Ó × ÖÚ  ÒÐ   Ò     ÒØÖ Ý token len × Ð
      ÐÓÒ ØÙ Ð ¬ Ò Ö Ø Ö ×º ÁÒ ÐÑ ÒØ ÒÓ Ý Ò Ò ÙÒ ¬ ¸ ÔÓÖ ÐÓ ÕÙ token len
           × Ö ÖÓº
         Ä ÔÐ      ÓÔ Ö ÓÖ × Ö ÕÙ Ö ÙÒ ÒØ Ò Ð ×Ô Ð ÕÙ ×    Ð Ñ ÒÓÖ ÔÖ   Ò
      ÔÓ× Ð º Ì Ð ÒØ Ò Ð × Ð Ú ÐÓÖ ° ÕÙ × Ò× ÖØ Ò ÐÑ ÒØ Ò op stack
½¾¼     Ò Ð Þ ÓÒ Ú Ð ½¾¼ ≡                                   ´½½ µ
        op_stack.push(’$’);
            ×ÔÙ × Ð Ò Ð Þ ÓÒ¸ Ð ÖÙØ Ò ÓÑ ÒÞ Ø Ö Öº Ð Ù ÖÔÓ Ø Ö Ø ÚÓ Ð Ð ×
      ¬ × ÔÖ × ÒØ × Ò Ð ÒØÖ Ý ÐÙ Ó ÔÖÓ × Ð ¬ × ÙÒ ×Ù Ø ÔÓº Ä Ö Ð ¬ ÓÒ× ×Ø
      × ÑÔÐ Ñ ÒØ Ò ÙÒ ÒÚÓ ÓÒ lexer()
½¾¼    Ð Ö ÔÖÓÜ Ñ ¬ ½¾¼ ≡                                   ´½½ µ
        current_token = lexer(input, token_len);
          Ù Ò ÓÐ ¬       × ÙÒ ÓÔ Ö Ò Ó¸ ÐÓ ÒØÖÓ Ù ÑÓ× Ò Ð Ô Ð       ÓÔ Ö Ò Ó×
½¾¼   ÔÖÓ × Ö ÓÔ Ö Ò Ó ½¾¼ ≡                                            ´½½ µ
        {
            const int operand = atoi(str_to_token(input, token_len));
            val_stack.push(operand);
            break;
        }
      Í× × str to token ½½ º
      ÈÖ Ú Ñ ÒØ Ý ÕÙ     ØÙ Ö Ð ÓÒÚ Ö× ÓÒ Ð      Ò      Ö Ø Ö × ×Ù Ö ÔÖ × ÒØ ÓÒ
      ÒÙÑ Ö º
         ÈÓ ÑÓ× ÒØÖÓ Ù Ö Ð ÓÔ Ö ÓÖ Ò Ð Ô Ð ¸ Ô ÖÓ ÒØ × ÔÓ ÑÓ× ÙØ Ö ØÓ × Ð ×
      ÓÔ Ö ÓÒ × ÕÙ ×Ø Ò Ò Ð Ô Ð     ÓÔ Ö ÓÖ × ÓÒ Ñ ÝÓÖ Ó Ù Ð ÔÖ       Ò ÕÙ Ð
2.5. Pilas                                                                        121



      ÓÔ Ö ÓÖ ØÙ к ר ÐØ ÖÒ Ø Ú × ÔÖ Ö Ð ÔÓÖÕÙ ×Ñ ÒÙÝ Ð ÓÒ×ÙÑÓ Ò ×Ô Ó
         Ð × Ô Ð ×º
          È Ö ÑÔÐ ¬ Ö¸ ÓÒ× Ö ÑÓ× Ð ÜÔÖ × ÓÒ 100 − 20 ∗ 5 + 7 Ý ×ÙÔÓÒ ÑÓ× ÕÙ Ð ¬
        ØÙ Ð × Ð ÓÔ Ö ÓÖ Ö ×Ø º Ò ×Ø ÑÓÑ ÒØÓ¸ val stack ÓÒØ Ò < 100 > Ý op stack
      < ° > Ý ÒÓ ÔÓ ÑÓ×       ØÙ Ö Ò Ò ÙÒ ÓÔ Ö ÓÒ ÔÓÖÕÙ Ð ÓÔ Ö ÓÖ ¬ Ø Ó ° Ø Ò Ñ ÒÓÖ
      ÔÖ      Ò ÕÙ Ð ÓÔ Ö ÓÖ −º Ù Ò Ó Ò ÓÒØÖ ÑÓ× Ð ÓÔ Ö ÓÖ ∗¸ Ø ÑÔÓ Ó ÔÓ ÑÓ×
          ØÙ Ö Ò Ò ÙÒ ÓÔ Ö ÓÒ ÔÓÖÕÙ Ð ÔÖÓ Ù ØÓ Ø Ò Ñ ÝÓÖ ÔÖ             Ò ÕÙ Ð Ö ×Ø º ¹
      Ò ÐÑ ÒØ ¸ Ù Ò Ó ÒÓ× Ò ÓÒØÖ ÑÓ× Ð ÓÔ Ö ÓÖ +¸ val stack ÓÒØ Ò < 100, 20, 5 > Ý
      op stack < °, −, ∗ >º ÕÙ        ØÙ ÑÓ× Ð ÔÖÓ Ù ØÓ¸ ÔÙ × ×Ø Ø Ò Ñ ÝÓÖ ÔÖ        Ò ÕÙ
      Ð ×ÙÑ ¸ ÐÓ ÕÙ ÒÓ×       Ð × Ô Ð × Ò ÐÓ× ×Ø Ó× < 100, 100 > Ý < °, − >¸ Ö ×Ô Ø Ú Ñ ÒØ º
      ÈÓר Ö ÓÖÑ ÒØ ¸ ØÙ ÑÓ× Ð Ö ×Ø ¸ ÔÙ × ×Ø Ø Ò Ð Ñ ×Ñ ÔÖ              Ò ÕÙ Ð ×ÙÑ º Ð
      Ø ÖÑ ÒÓ ×Ø ÓÔ Ö ÓÒ ÒØÖÓ Ù ÑÓ× Ð ÓÔ Ö ÓÖ + Ò Ð Ô Ð ÐÓ ÕÙ ÒÓ×                    Ð ×Ø Ó
         Ð × Ô Ð × Ò < 0 > Ý < °, + >º
          Ä ÓÒ Ù Ø ÒØ Ö ÓÖ × ÑÓ Ð Þ ¸ ÒØÓÒ ×¸ Ó Ð × Ù ÒØ ÓÖÑ
½¾½    ÔÖÓ × Ö ÓÔ Ö ÓÖ ½¾½ ≡                                              ´½½ µ
        {
            while (precedence(op_stack.top()) >= precedence(*input))
              apply(val_stack, op_stack);
            op_stack.push(*input); // introducir operador en op_stack
            break;
        }
      Í× × apply ½½     Ò   precedence   ½½ º
          ÄÓ× Ô Ö ÒØ × × Ò Ð ÜÔÖ × ÓÒ × Ò¬ × ×ÓÒ ÙØ Ð Þ Ó× Ô Ö ÑÓ ¬ Ö Ð ÔÖ Ò ÔÓÖ
      ÓÑ × ÓÒ ÐÓ× ÓÔ Ö ÓÖ ×º Ù Ò Ó Ð ¬ × ÙÒ Ô Ö ÒØ × × ÞÕÙ Ö Ó¸ ÐÓ ÒØÖÓ Ù ÑÓ×
       Ò Ð Ô Ð ÓÔ Ö ÓÖ ×
½¾½    ÔÖÓ × Ö Ô Ö ÒØ × × ÞÕÙ Ö Ó ½¾½ ≡                             ´½½ µ
        {
            op_stack.push(*input); // introducir parentesis en op_stack
            break;
        }
           Ð Ô Ö ÒØ × × Ö Ó Ò Ö Ð ¬Ò Ð ÙÒ ÜÔÖ × ÓÒ ÕÙ         × Ö Ú ÐÙ º Ù Ò Ó
       Ò ÓÒØÖ ÑÓ× Ð Ô Ö ÒØ × × Ö Ó¸ ÙØ Ö ÑÓ× ØÓ × Ð × ÓÔ Ö ÓÒ × ÒØÖ ÐÓ× Ô Ö ÒØ × ×º
      È Ö ÐÐÓ¸ ÐÐ Ñ ÑÓ× ×Ù × Ú Ñ ÒØ apply() ר ÕÙ Ð Ô Ö ÒØ × × ÞÕÙ Ö Ó × Ò ÓÒ¹
      ØÖ Ó Ò Ð ØÓÔ Ð Ô Ð
½¾½    ÔÖÓ × Ö Ô Ö ÒØ × × Ö Ó ½¾½ ≡                             ´½½ µ
        {
            while (op_stack.top() != ’(’)
              apply(val_stack, op_stack);
            op_stack.pop(); /* saca el parentesis izquierdo */
            break;
        }
      Í× × apply ½½ º
           Ð ¬Ò Ð ÒØÖ ÐÓ Ò lexer() Ù Ò Ó Ö ØÓÖÒ Ð Ú ÐÓÖ Endº Ò ×Ø ÑÓÑ ÒØÓ¸
      × Ð ÜÔÖ × ÓÒ Ù ÓÖÖ Ø ¸ ÒÓ× Ö ×Ø Ú ÐÙ Ö Ð × ÓÔ Ö ÓÒ × ÕÙ × Ò Ù ÒØÖ Ò Ò Ð Ô Ð
         ÓÔ Ö Ò Ó׸ ÐÓ Ù Ð × ¬Ò Ð × Ù ÒØ Ñ Ò Ö
½¾½    ÔÖÓ × Ö ¬Ò ÒØÖ ½¾½ ≡                                      ´½½ µ
        {
122                                                        Cap´
                                                              ıtulo 2. Secuencias



      while (op_stack.top() != ’$’)
        apply(val_stack, op_stack);
      op_stack.pop(); // debe ser ’$’
      const int ret_val = val_stack.pop();
      return ret_val;
  }
Í× × apply ½½ º

2.5.6    Pilas, llamadas a procedimientos y recursi´n
                                                   o
ÍÒÓ ÐÓ× Ù×Ó× Ñ × ØÖ × Ò ÒØ Ð × Ð Ô Ð × Ð ×Ø ÓÒ ÐÐ Ñ               × ÔÖÓ     Ñ ÒØÓ×
  ÙÒ ÔÖÓ Ö Ñ º ÓÒ× Ö ÑÓ× Ð × Ù ÒØ Ö Ñ ÒØÓ Ó Ó
int fct_1(int i) { /* ... */ }

int fct_2(int i)
{
  int x;
  x = fct_1(i);
  ...
}

int fct_3(int j)
{
  int x;
  x = fct_2(j);
  ...
}

void main()
{
  int y;
  y = fct_3(3);
  ...
}


       ÓÖ Ü Ñ Ò ÑÓ× ÐÓ× Ú ÒØÓ× ÒÚÓÐÙ Ö Ó× Ð ÐÐ Ñ              fct 3() × main()º
      Ù Ò Ó × Ð ÒÞ Ð ÐÐ Ñ           fct 3()¸ Ð ­Ù Ó       ÓÒØÖÓÐ × ÐØ     Ð Ö ÓÒ
    Ñ ÑÓÖ       fct 3() Ý ÓÑ ÒÞ            ÙØ ÖÐ º ÈÓר Ö ÓÖÑ ÒØ ¸ Ù Ò Ó × Ð ÒÞ Ð
ÐÐ Ñ       fct 2()¸ Ý Ð ­Ù Ó       ÓÒØÖÓÐ × ÐØ     ÒÙ ÚÓ       Ð Ö ÓÒ fct 2()º
   Ò ÐÑ ÒØ ¸ × Ð ÒÞ Ð ÙÒ ÓÒ fct 1() Ý Ð ­Ù Ó × ÐØ            ÒÙ ÚÓ     Ð Ö ÓÒ
fct 1()º
      Ù Ò Ó fct 1() ¬Ò Ð Þ ¸ Ð ­Ù Ó ÔÖÓ Ö Ñ Ö ÓÖÖ Ð Ñ ÒÓ ÒÚ Ö×Ó ×Ø main()º
ÈÐ ÒØ ÑÓ׸ ÒØÓÒ ×¸ Ð × × Ù ÒØ × ÔÖ ÙÒØ ×
    ¯ Ä × ÙÒ ÓÒ × fct 2() Ý fct 3() Ø Ò Ò Ô Ö Ñ ØÖÓ×        ÒÓÑ Ö i Ý Ú Ö Ð × ÐÓ Ð ×
         ÒÓÑ Ö xº ÓÑÓ ×          Ö Ò Ò ÒØÖ × ÐÓ× Ô Ö Ñ ØÖÓ× Ý Ú Ö Ð ×
    ¯    ÓÑÓ × ×Ø ÓÒ Ð Ñ ÑÓÖ Ô Ö ÐÓ× Ô Ö Ñ ØÖÓ× Ý Ú Ö Ð × ÐÓ Ð × ÙÒ ÔÖÓ ¹
       Ñ ÒØÓ
2.5. Pilas                                                                                                 123



      ¯  ÓÑÓ        Ð ­Ù Ó ÓÒØÖÓÐ Ô Ö × ÐØ Ö ÙÒ ÙÒ ÓÒ Ý Ö Ö × Ö Ù Ò Ó ÙÐÑ Ò
       Ð ÐÐ Ñ      Ð ÙÒ ÓÒ
  רÓ× ÔÖÓ Ð Ñ × ×ÓÒ Ö ×Ù ÐØÓ× ÔÓÖ Ð ÓÑÔ Ð ÓÖ¸ Ð × ×Ø Ñ ÓÔ Ö Ø ÚÓ Ý Ð Ö Û Ö ØÖ Ú ×
    ÙÒ Ô Ð º Ä Ñ ÝÓÖ        ÐÓ× ÔÖÓ × ÓÖ × Ñ Ò Ò Ó× Ö ×ØÖÓ× ×Ô Ð × ÓÑÙÒÑ ÒØ
   ÒÓÑ Ò Ó× SB Ý SPº רÓ× Ö ×ØÖÓ× Ñ Ò Ò Ð ÒÓÑ Ò              Ô Ð Ð × ×Ø Ñ º SB × Ð
  Ö ÓÒ × ÙÒ Ô Ð Ý SP × Ð Ö ÓÒ ØÙ Ð Ð ØÓÔ Ð Ô Ð º Ù Ò Ó ×
ÙÒ ÔÙ× ×Ó Ö Ð Ô Ð Ð × ×Ø Ñ ¸ SP × Ö Ñ ÒØ Óº Ð Ñ ×ÑÓ ÑÓ Ó¸ Ù Ò Ó ×
ÙÒ pop()¸ SP × Ò Ö Ñ ÒØ Óº
      Ù Ò Ó Ð ÓÑÔ Ð ÓÖ ÔÖÓ × ÙÒ ÐÐ Ñ           ÙÒ ÙÒ ÓÒ¸ ÔÓÖ ÑÔÐÓ¸ fct 1() ×
main()¸ ×     Ò Ö ¸ ÒØ × ÐÐ Ñ Ö Ð ÙÒ ÓÒ¸ Ð × Ù ÒØ × Ù Ò                Ô× Ù Ó Ó Ó
×Ó Ö Ð Ô Ð × ×Ø Ñ
     ½º ÍÒ push() Ô Ö     Ð ×Ô Ó        Ð Ö ×ÙÐØ Ó ÕÙ Ö ØÓÖÒ fct 1()º
     ¾º Î Ö Ó× pushes Ô Ö ÐÓ× Ô Ö Ñ ØÖÓ×            fct 1()º
     ¿º ÍÒ push() Ô Ö Ð      Ö     ÓÒ    ØÙ Ð       Ð ­Ù Ó    Ð ÔÖÓ Ö Ñ º
      º ÍÒ ÒרÖÙ ÓÒ × ÐØÓ   Ð Ö ÓÒ                             Ð ÙÒ ÓÒ fct 1()¸ Ð Ù Ð ÐÐ Ú            Ð ­Ù Ó
         ÓÒØÖÓÐ   Ð Ò Ó Ð ÙÒ ÓÒ fct 1()º
      º ÍÒ Ú Þ ÕÙ fct 1() Ý × Ó          ÙØ ¸ Ð ­Ù Ó ÔÖÓ Ö Ñ Ö Ö × Ö Ð ÔÙÒØÓ ÔÓר Ö ÓÖ
         ÓÒ ×      ØÙÓ Ð × ÐØÓº È Ö ÐÐÓ¸ Ð ÓÑÔ Ð ÓÖ Ò Ö ÙÒ pop() ÕÙ Ö ÙÔ Ö Ð Ö ÓÒ
           Ö ØÓÖÒÓ Ð Ô Ð º Ð Ö Ö × Ö main()¸ ×          ØÙ Ò Ú Ö Ó× pops ÓÖÖ ×ÔÓÒ ÒØ × Ð
          ÒØ      pushes ÕÙ ×      ÞÓ Ô Ö Ô × Ö ÐÓ× Ô Ö Ñ ØÖÓ׺
      º    Ò ÐÑ ÒØ ¸ ×      ÙÒ ÙÐØ ÑÓ pop() ÕÙ Ö ÙÔ Ö              Ð Ö ×ÙÐØ Ó      fct 1()º

º
    Pseudo c´digo 2.5.1:
            o                    רÖÙ ØÙÖ           Ó Ó ÒÖ            Ô Ö Ð ÐÐ Ñ              funcion 1()

     Ð ÓÑÔ Ð ÓÖ Ø Ñ Ò Ò Ö Ó Ó                                ÓÒ Ð Ð ÔÖ Ò Ô Ó Ý Ð ¬Ò Ð               Ð ÙÒ ÓÒ
fct 1()   Ó Ð × Ù ÒØ ×ÕÙ Ñ
     ½º    Ð Ò Ó    Ð ÙÒ ÓÒ ×        ØÙ Ò Ú Ö Ó× pushes ÔÖÓÔÓÖ ÓÒ Ð × Ð ÒÙÑ ÖÓ                ÚÖ     Ð × ÐÓ Ð ×
            fct 1()º
     ¾º Ð Ó Ó Ð ÙÒ ÓÒ × Ò Ö ÓÒ Ö Ö Ò × Ð × Ú Ö                              Ð × ÐÓ Ð × Ô ÖØ        × Ò Ð ÔÙÒØÓ
        ÒØ Ö ÓÖ Ý ÐÓ× Ô Ö Ñ ØÖÓ× Ô ÖØ Ó× Ý ÓÔ Ó× Ò ¾º º½º
     ¿º Ð Ö ×ÙÐØ Ó       Ð ÙÒ ÓÒ Ø Ñ        Ò×       Ù Ö     Ò Ð ×Ô    Ó Ô ÖØ Ó Ò Ð ÔÙÒØÓ ½              ¾º º½º
      º    Ð ¬Ò Ð Ð ÙÒ ÓÒ¸ Ð ÓÑÔ Ð ÓÖ Ò ÙÒ ÒØ             pops Ù Ð Ð   ÒØ                               pushes
          Ù× Ô Ö Ð × Ú Ö Ð × ÐÓ Ð ×º רÓ× pops Ð Ö Ò Ð Ñ ÑÓÖ Ù× ÔÓÖ Ð × Ú Ö                          Ð × ÐÓ Ð ×º
      º Ë     ÙÒ pop() ÕÙ Ö ÙÔ Ö Ð              Ö     ÓÒ      Ö ØÓÖÒÓ Ð ÒÚÓ ÒØ        fct 1()      Ý × × ÐØ    Ð
        ÔÙÒØÓ    ¾º º½º
Pseudo c´digo 2.5.2:
        o                    רÖÙ ØÙÖ               Ó Ó ÒÖ          Ô Ö Ð ÐÐ Ñ           Ð    funcion 1()

       Ò Ö ÐÑ ÒØ ¸ ÙÒ push() ÕÙ Ú Ð Ö ×Ø Ö Ð Ö ×ØÖÓ SP Ð Ø Ñ ÒÓ ÐÓ ÕÙ × Ð
 Ò× ÖØ º Ë Ñ ØÖ Ñ ÒØ ¸ ÙÒ pop() ÕÙ Ú Ð ÙÒ ×ÙÑ º È Ö Ð × ÙÒ ÓÒ × fct 2() Ý
fct 3()¸ Ð ÓÑÔ Ð ÓÖ Ò Ö Ó Ó× × Ñ Ð Ö × ¾º º½ Ý ¾º º¾º
    Ä Ò ÓÖÑ ÓÒ Ô ÖØ Ò ÒØ ÙÒ ÐÐ Ñ           ÔÖÓ Ñ ÒØÓ ÕÙ × Ù Ö Ò Ð Ô Ð
124                                                                      Cap´
                                                                                 ıtulo 2. Secuencias



     × ×Ø Ñ × ÓÒØ Ù º Ð ÐÓÕÙ ÓÑÔÙ ×ØÓ ÔÓÖ Ð Ú ÐÓÖ Ö ØÓÖÒÓ¸ Ô Ö Ñ ØÖÓ׸ Ö ÓÒ
         Ö ØÓÖÒÓ Ý Ú Ö Ð × ÐÓ Ð × × ÒÓÑ Ò Ö ×ØÖÓ        Ø Ú ÓÒ º
           Ð ×ÓÔÓÖØ     ÙØ ÚÓ Ô Ö Ð × ÐÐ Ñ × ÔÖÓ Ñ ÒØÓ× × ÑÔÐ ÒØ ÓÒ ÙÒ Ô Ð
     ÔÓÖÕÙ Ð ÔÖÓ Ö Ñ ­ÙÝ ØÖ Ú × Ð × ÙÒ ÓÒ × Ó ÙÒ × ÔÐ Ò Í È˺ ÍÒ Ú Þ ÕÙ
     × Ð ÒÞ fct 3()¸ Ð ÔÖÓ Ö Ñ            Ö Ö × Ö ÔÓÖ Ð Ñ ÒÓ ÒÚ Ö×Ó main() Ô × Ò Ó
     ÔÓÖ fct 2() Ý fct 1()º
           ÙÒÕÙ Ð Ö ÙÖ× ÓÒ × ÙÒ Ø Ò           ÔÖÓ Ö Ñ ÓÒ ×Ø ÒØ ÔÓ ÖÓ× ¸ × ÑÔÓÖ¹
     Ø ÒØ ÔÖ Ò Ö ÕÙ ÓÒÐÐ Ú Óר × ÑÔÓÖØ ÒØ × Ò ×Ô Ó Ý Ø ÑÔÓº ÓÑÓ ÑÔÐÓ¸
      ÓÒ× Ö ÑÓ× Ð ÙÒ ÓÒ ØÓÖ Ð ÑÔÐ ÒØ Ö ÙÖ× Ú Ñ ÒØ
½¾        ØÓÖ Ð Ö ÙÖ× ÚÓ ½¾ ≡
      int fact(const int & n)
      {
        if (n <= 1)
          return 1;
        return n*fact(n-1);
      }
     Ä Ú Ö× ÓÒ Ö ÙÖÖ ÒØ Ð ØÓÖ Ð × ÙÒ Ñ Ð ÑÔÐÓ Ð Ù×Ó Ò ¬ ÒØ     Ð Ö ÙÖ× ÓÒ¸
     Ô٠׸ Ô ÖØ × Ö ÜØÖ Ñ Ñ ÒØ Ò ¬ ÒØ ¸ Ð ÓÒØÖ Ô ÖØ Ø Ö Ø Ú × ÑÙÝ ¬ ÒØ
     Ý Ñ × Ð ÑÔÐ ÒØ Öº Ë Ò Ñ Ö Ó¸       ØÓ×   Ø Ó׸ ×Ù Ó ¬ ÓÒ Ö ÙÖÖ ÒØ ×
     ÑÙÝ Ð ÓÑÔÖ Ò Ö ÔÓÖÕÙ Ö ­         ÒØ Ñ ÒØ Ð ¬Ò ÓÒ Ñ Ø Ñ Ø º
                                    SB          Ê ×ÙÐØ   Ó
                                                                    fact(4)
                                            Ö    ÓÒ       Ö ØÓÖÒÓ
                                              Ê ×ÙÐØ     Ó
                                                ¿                   fact(3)
                                            Ö    ÓÒ       Ö ØÓÖÒÓ
                                              Ê ×ÙÐØ     Ó
                                                ¾                   fact(2)
                                            Ö    ÓÒ       Ö ØÓÖÒÓ
                                              Ê ×ÙÐØ     Ó
                                                ½                   fact(1)
                                            Ö    ÓÒ      Ö ØÓÖÒÓ
                                    SP




                     ÙÖ ¾º¾½    Ô        Ð Ô Ð × ×Ø Ñ ÓÒ Ð ÐÐ Ñ                  fact(1)

         Ä ¬ ÙÖ ¾º¾½ ÐÙ×ØÖ Ð ×Ø Ó Ð Ô Ð × ×Ø Ñ Ù Ò Ó × Ð ÒÞ Ð ÐÐ Ñ
     fact(1)º      Ú Þ ÕÙ ×   ØÙ ÙÒ ÐÐ Ñ Ö ÙÖ× Ú ¸ × ×Ø Ò ×Ô Ó Ô Ð Ð
     Ö ×ÙÐØ Ó Ð ÐÐ Ñ Ö ÙÖ× Ú ¸ Ð Ô Ö Ñ ØÖÓ Ý Ð Ö ÓÒ Ö ØÓÖÒÓº Ð Ñ ×ÑÓ ÑÓ Ó¸
     ÔÓÖ     ÐÐ Ñ ¸ × ×Ø Ò Ø ÑÔÓ ÐÓ× ØÖ × pushes Ý ÐÓ× ØÖ × popsº
     2.5.6.1    Consejos para la recursi´n
                                        o

     Ë ×Ø ÑÓ× × Ò Ò Ó ÙÒ Ð ÓÖ ØÑÓ Ý ÒÓ× × Ñ × Ð ØÖ        Ö ÓÒ Ð Ö ÙÖ× ÓÒ¸ ÒØÓÒ ×¸
         Ò Ø Ò Ö× Ò Ù ÒØ Ð × × Ù ÒØ × ÓÒ× Ö ÓÒ ×
       ½º ÌÓ Ó Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓ      Ø Ò Ö ÙÒ ×Ó × ÓÒ ÒÓ Ó ÙÖÖ Ò Ò ÙÒ ÐÐ Ñ
          Ö ÙÖ× Ú º
       ¾º Ð Ð ÓÖ ØÑÓ       ÔÖÓ Ö × Ö Ý ÓÒÚ Ö Ö Ò Ø ÑÔÓ ¬Ò ØÓ Ò ÓÒØÖ Ö Ð ×ÓÐÙ ÓÒº
          ÈÓÖ        ÐÐ Ñ Ö ÙÖ× Ú ¸ Ð ÒØÖ          ×Ñ ÒÙ Öº Ë ×Ø ÒÓ × Ð ×Ó¸ Ý
             ר ÒØ × ÔÖÓ Ð     × ÕÙ Ð Ö ÞÓÒ Ñ ÒØÓ ×Ù Ý ÒØ Ð Ð ÓÖ ØÑÓ ×Ø ÖÖ Óº
2.5. Pilas                                                                                                                         125



     ¿º Ú Ø Ð ÙÐÓ× Ö Ô Ø Ó׺ ר × Ð ÔÖ Ò Ô Ð Ô Ð ÖÓ Ð Ö ÙÖ× ÓÒº ÍÒ ÑÔÐÓ
       ÒÓØ Ð ×ÓÒ ÐÓ× ÒÙÑ ÖÓ×    ÓÒ    ÙÝ ¬Ò ÓÒ Ñ Ø Ñ Ø × Ð × Ù ÒØ

                                         (n) =
                                                     1                                            ×    n≤1
                                                            (n − 1) +              (n − 2)        ×    n>1

       Ä Ó ¬ ÓÒ Ö ÙÖ× Ú ÕÙ                               Ð ÙÐ Ð i¹ × ÑÓ ÒÙÑ ÖÓ                                 ÓÒ        ×       ×ÔÖ Ò
         ×Ù ¬Ò ÓÒ Ñ Ø Ñ Ø
½¾      ÙÒ ÓÒ    ÓÒ ½¾ ≡
           int fib(const int & n)
           {
             if (n <= 1)
               return 1;
             return fib(n - 1) + fib(n - 2);
           }

 ÆÓØ ÑÓ× ÕÙ      (n − 2) ×   Ð ÙÐ 2 Ú ×º Ä ÔÖ Ñ Ö Ù Ò Ó × ÐÐ Ñ ÜÔÐ Ø Ñ ÒØ
     (n − 2) Ð × ÙÒ      ÒØÖÓ Ð ÐÐ Ñ         (n − 1)º ר ÙÔÐ        ÐÐ Ñ × ×
   ÜÔ Ò ÜÔÓÒ Ò ÐÑ ÒØ Ñ              ÕÙ ÙÑ ÒØ nº Ä ¬ ÙÖ ¾º¾¾ ÐÙ×ØÖ Ð ÒØ
 ÐÐ Ñ × fib() Ô Ö Ð Ô ÕÙ Ò × Ð n = 5º
                                                                          fib(5)



                                          fib(4)                                                               fib(3)


                          fib(3)                   fib(2)                                    fib(2)                     fib(1)




                 fib(2)        fib(1)       fib(1)          fib(0)                  fib(1)            fib(0)




             fib(1)   fib(0)




                                        ÙÖ ¾º¾¾ ÄÐ Ñ                 ×    fib()      ÔÖ        n=5


   Ù Ò Ó × × Ò ÙÒ Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓ¸                                     ÑÓ× Ö ÓÖ ÖÒÓ× ÕÙ ÒÓ Ý Ò Ð ÙÐÓ×
 Ö ÙÒ ÒØ ׺ ÈÓÖ ÐÓ Ò Ö Ð¸ Ð Ö ÙÒ Ò                                       Ö ÕÙ Ö ÒÓØ Ö ÐÓ× Ð ÙÐÓ× Ö Ð Þ Ó× Ò
  Ð ÙÒ ×ØÖÙ ØÙÖ    ØÓ× ×Ô Ðº
 2.5.6.2     Eliminaci´n de la recursi´n
                      o               o

 À Ý ØÖ × Ñ Ò Ö × ÓÒÓ × Ô Ö Ð Ñ Ò Ö Ð Ö ÙÖ× ÓÒ¸ Ð Ù Ð × Ñ Ò ÓÒ Ö ÑÓ× Ò ÐÓ×
 ×Ù ¹Ô ÖÖ Ó× ×Ù × Ù ÒØ ׺
 Eliminaci´n de la recursi´n cola
          o               o
    Ë ÙÒ ÔÖÓ Ñ ÒØÓ P(x) Ø Ò ÓÑÓ ÙÐØ Ñ ÒרÖÙ ÓÒ ÙÒ                                                     ÐÐ Ñ   P(y)¸ ÒØÓÒ × ×
 ÔÓ× Ð Ö ÑÔÐ Þ Ö P(y) ÔÓÖ ÙÒ × Ò ÓÒ x = y Ý ÙÒ × ÐØÓ                                                   Ð Ò Ó Ð ÔÖÓ Ñ ÒØÓº
126                                                        Cap´
                                                                   ıtulo 2. Secuencias



     ÈÓÖ ÑÔÐÓ¸ Ð Ö ÓÖÖ Ó Ò¬Ò ØÓ ÐÓ× ÒÓ Ó×            ÙÒ Ð ×Ø ÒÐ Þ       ÔÓ Ö    ¬Ò Ö× ¸
     Ö ÙÖ× Ú Ý ÖÖÓÒ Ñ ÒØ ¸ Ð × Ù ÒØ ÑÓ Ó
½¾    Ê ÓÖÖ Ó Ö ÙÖ× ÚÓ Ð ×Ø ÒÐ Þ ½¾ ≡
           template <typename T>
       void recorrer(Snode<T> * head, void (*visitar)(Snode<T>*))
       {
         if (head->is_empty())
           return;
         (*visitar)(head->get_next());
         recorrer(head->get_next());
       }
     Í× × Snode ½ º
      ר ÔÖÓ Ñ ÒØÓ ÔÙ ØÖ Ò× ÓÖÑ Ö× Ñ              ÒØ Ð Ñ Ò ÓÒ       Ð Ö ÙÖ× ÓÒ ÓÐ Ò
½¾   Ê ÓÖÖ Ó ÒÓ¹Ö ÙÖ× ÚÓ Ð ×Ø ÒÐ Þ ½¾         ≡
           template <typename T>
       void recorrer(Snode<T> * head, void (*visitar)(Snode<T>*))
       {
        start:
         if (head->is_empty())
           return;
         (*visitar)(head->get_next());
         head = head->get_next();
         goto start;
       }
     Í× × Snode ½ º
         ÅÙ × Ú × × ÔÓ× Ð Ð Ñ Ò Ö Ð Ö ÙÖ× ÓÒ ÓÐ ÙÒ × Ð ÙÐØ Ñ ÒרÖÙ ÓÒ ÒÓ × ÙÒ
     ÐÐ Ñ Ö ÙÖ× Ú º ÈÓÖ ÑÔÐÓ¸ Ð ÙÐØ Ñ ÒרÖÙ ÓÒ Ð Ú Ö× ÓÒ Ö ÙÖ× Ú Ð ØÓÖ Ð
          ØÓÖ Ð Ö ÙÖ× ÚÓ ½¾ ÒÓ × Ð ÐÐ Ñ   fact(n - 1)¸ × ÒÓ Ð ÐÐ Ñ   returnº Ò
       ר ×Ó ÔÓ ÑÓ× Ð Ñ Ò Ö Ð Ö ÙÖ× ÓÒ ÓÐ Ý Ó Ø Ò Ö Ð × Ù ÒØ Ú Ö× ÓÒ
½¾       ØÓÖ Ð ÒÓ Ö ÙÖ× ÚÓ ½¾ ≡
       int fact(const int & n)
       {
         int result = 1;
        start:
         if (n <= 1)
           return result;
         result *= n;
         n--;
         goto start;
       }


     Emulaci´n de los registros de activaci´n
            o                              o
         ÈÓ ÑÓ× ×ÙÔÖ Ñ Ö Ð Ö ÙÖ× ÓÒ × ÑÙÐ ÑÓ× Ð × ÐÐ Ñ × Ö ÙÖ× Ú × Ý ÐÓ× Ö ×ØÖÓ×
       Ø Ú ÓÒº È Ö ÐÐÓ       ÑÓ× ¬Ò Ö ÙÒ Ô Ð ÓÒ ÐÓ× × Ù ÒØ × ØÖ ÙØÓ×
        ½º ÄÓ× Ú ÐÓÖ × ÐÓ× Ô Ö Ñ ØÖÓ׺ Ò ×Ó ÕÙ × ØÖ Ø ÙÒ ÙÒ ÓÒ¸ × Ò ÐÙÝ Ð
           Ú ÐÓÖ Ö ØÓÖÒÓº
        ¾º ÄÓ× Ú ÐÓÖ × Ð × Ú Ö Ð × ÐÓ Ð ×º
2.5. Pilas                                                                      127



      ¿º ÍÒ Ò         ÓÒ ÕÙ × Ò Ð Ð Ö ÓÒ Ö ØÓÖÒÓº               Ú ÐÓÖ Ò       ÓÒ
           ÓÖÖ ×ÔÓÒ Ö ÙÒ ÔÙÒØÓ Ö ØÓÖÒÓ Ò Ð ÔÖÓ Ñ ÒØÓ Ö ÙÖ× ÚÓº
       ÍÒ Ú Þ ¬Ò Ð Ô Ð ¸ × ÑÓ ¬ Ð ÔÖÓ Ñ ÒØÓ Ö ÙÖ× ÚÓ ÓÑÓ × Ù
      ½º Ë Ò         Ð ×        Ò ÓÐ    Ð Ö ÓÒ Ò Ð Þ ÓÒ Ð Ô Ð º
      ¾º Ë ÓÐÓ Ò Ø ÕÙ Ø × × ÐØÓ Ò ÐÓ× ÔÙÒØÓ× × Ð             Ð × ÐÐ Ñ × Ö ÙÖ× Ú ×º
      ¿º Ð Ü Ô ÓÒ Ð ×                 Ò Ð Þ ÓÒ¸ Ð Ù ÖÔÓ Ð ÙÒ ÓÒ × ÒÚÙ ÐÚ ÓÒ
          ÙÒ Ð ÞÓ Ö Ô Ø Ø ÚÓ ÙÝ ÓÒ ÓÒ Ô Ö          × ÕÙ Ð Ô Ð ×Ø Ú º
        º ÄÓ× ÔÙÒØÓ× ÓÒ        Ý ÐÐ Ñ × Ö ÙÖ× Ú × × ×Ùר ØÙÝ Ò ÔÓÖ ÙÒ push() ÐÓ ÕÙ
          × Ö Ð Ö ×ØÖÓ        Ø Ú ÓÒ Ý ÙÒ × ÐØÓ Ð Ò Ó Ð Ð ÞÓº
        º ÄÓ× ÔÙÒØÓ× ÓÒ Ð ÔÖÓ Ñ ÒØÓ Ö ÙÖ× ÚÓ Ö ØÓÖÒ × ×Ùר ØÙÝ Ò ÔÓÖ ÙÒ pop()
          × Ù Ó ÙÒ switch ÕÙ Ø ÖÑ Ò ¸ × ÙÒ Ð Ò                ÓÒ × ÐØÓ Ð Ö ×ØÖÓ
            Ø Ú ÓÒ¸ Ð Ö ÓÒ × ÐØÓº
       ÈÓÖ ÑÔÐÓ¸ Ô Ö Ð Ð ÙÐÓ Ð i¹ × ÑÓ ÒÙÑ ÖÓ            ÓÒ ¸ ÑÓ ¬ ÑÓ× Ð ÙÒ ÓÒ
           ÓÒ ½¾ Ð × Ù ÒØ ÑÓ Ó
½¾   Î Ö× ÓÒ Ö ÙÖ× Ú Ñ ÓÖ            ÓÒ ½¾ ≡
      int fib(const int & n)
      {
        if (n <= 1)
          return 1;
        const int f1 = fib(n - 1);
        const int f2 = fib(n - 2);
        return f1 + f2;
      }
     ר ÓÖÑ      Ð Ø Ð Ð Ñ Ò ÓÒ Ð Ö ÙÖ× ÓÒº
         ¬Ò ÑÓ× Ð × Ù ÒØ רÖÙ ØÙÖ Ô Ö Ð Ö ×ØÖÓ               Ø Ú ÓÒ
½¾   Ê ×ØÖÓ Ø Ú ÓÒ ½¾ ≡                                                 ´½¾ µ
      # define P1 1
      # define P2 2

      struct Activation_Record
      {
        int n;
        int f1;
        int result;
        char return_point;
      };
       ¬Ò ×
      Activation Record¸   Ù×   Ò ÙÒ ½¾ º
          ÓÒ Ñ Ö × Ð Ð Ö ¸ Ð    ×Ó              Ù ÐÕÙ Ö    ÐÓ× ÑÔÓ× ×      ØÙ   ØÖ Ú ×
      Ð ÙÒÓ ÐÓ× × Ù ÒØ × Ñ ÖÓ×
½¾        ×Ó Ö ×ØÖÓ Ø Ú ÓÒ ½¾ ≡                                         ´½¾ µ
      #   define   NUM(p)            ((p)->n)
      #   define   F1(p)             ((p)->f1)
      #   define   RESULT(p)         ((p)->result)
      #   define   RETURN_POINT(p)   ((p)->return_point)
128                                                     Cap´
                                                                     ıtulo 2. Secuencias



             Ä Ú Ö× ÓÒ ÒÓ Ö ÙÖ× Ú ¸ ÓÒ Ô Ð ¸ ÕÙ Ð ÙÐ Ð i¹ × ÑÓ ÒÙÑ ÖÓ         ÓÒ   ¸Ð   ¬¹
          Ò ÑÓ× Ò Ð Ö ÚÓ ¬ ר º ½¾ ÙÝ ¬Ò ÓÒ × Ð × Ù ÒØ
½¾         ¬ ר º ½¾ ≡
             Ê ×ØÖÓ Ø Ú ÓÒ ½¾
                ×Ó Ö ×ØÖÓ Ø Ú ÓÒ ½¾
            int fib_st(const int & n)
            {
                  Ù ÖÔÓ   ¬ ר ½¾
            }
               Ò Ò ÓÒÓ× Ð Ñ ØÓ Ó¸ ÐÓ ÔÖ Ñ ÖÓ × ¬Ò Ö Ð ÔÖ Ñ ÙÐÓ      Ð ÖÙØ Ò
½¾         Ù ÖÔÓ ¬ ר ½¾ ≡                                              ´½¾ µ
            ArrayStack<Activation_Record> stack;
            Activation_Record * caller_ar = &stack.pushn();
            Activation_Record * current_ar = &stack.pushn();
            NUM(current_ar) = n;
                ÑÙÐ ÓÒ     Ö ÙÖ× ÓÒ ½¾
          Í× × Activation Record ½¾   Ò   ArrayStack   ½¼ º
                 ÐÓ Ð Ö Ó Ð ÖÙØ Ò ¸ Ñ Ò Ö ÑÓ× Ó× ÔÙÒØ ÓÖ ×º caller ar Ö ÔÖ × ÒØ Ð Ö ×¹
          ØÖÓ        Ø Ú ÓÒ Ð ÒÚÓ ÒØ º Ê ÕÙ Ö ÑÓ× ×Ø Ö ×ØÖÓ       Ø Ú ÓÒ ÔÓÖÕÙ     ÑÓ×
           Ù Ö Ö Ð Ö ×ÙÐØ Ó Ð ÐÐ Ñ         ØÙ Ð ÕÙ ÑÙÐ ÑÓ׸ Ð Ù Ð × Ù Ö Ò Ð Ö ×ØÖÓ
                Ø Ú ÓÒ Ð ÒÚÓ ÒØ Ý ÒÓ Ð ÒÚÓ Óº
              current ar × Ð Ö ×ØÖÓ     Ø Ú ÓÒ Ð ÐÐ Ñ       ØÙ к
                  ÓÖ ÑÙÐ ÑÓ× Ð Ù ÖÔÓ Ð ÔÖÓ Ñ ÒØÓ Ö ÙÖ× ÚÓº È Ö ÐÐÓ¸ ÓÑ ÒÞ ÑÓ× ÔÓÖ
           ÓÐÓ Ö Ð Ó Ó ÑÓ×ØÖ Ó Ò Î Ö× ÓÒ Ö ÙÖ× Ú Ñ ÓÖ                 ÓÒ ½¾ Ý ÐÙ Ó
          ×Ùר ØÙ ÑÓ× ÔÓÖ × Ñ ÒØÓ× Ó Ó ÕÙ ÑÙÐ Ò Ð Ö ÙÖ× ÓÒ
½¾          ÑÙÐ ÓÒ Ö ÙÖ× ÓÒ ½¾ ≡                                       ´½¾ µ
            start:
                   ×Ó × Ö ÙÖ× ÓÒ ½¾
                ÐÐ Ñ    ¬ ´Ò ¹ ½µ ½¾
            p1: /* punto de retorno de fib(n - 1) */
                Ö ØÓÖÒÓ × ¬ ´Ò ¹ ½µ ½¾
                ÐÐ Ñ    ¬ ´Ò ¹ ¾µ ½¾
            p2: /* punto de retorno de fib(n - 2) */
                Ö ØÓÖÒÓ × ¬ ´Ò ¹ ¾µ ½¾
            return_from_fib:
                Ö ØÓÖÒ Ö × ¬ ½¾
                  ר Ò Ù ÑÓ× Ù ØÖÓ Ø ÕÙ Ø × × ÐØÓ Ð ­Ù Ó        Ù ÓÒ
                ¯ start × Ð ÔÙÒØÓ ÓÒ     × Ò    Ð Ñ ØÓ Ó Ö ÙÖ× ÚÓº   Ú Þ ÕÙ × ÑÙÐ ÙÒ
                  ÐÐ Ñ Ö ÙÖ× Ú ¸ × ØÙ Ð Þ Ò ÐÓ× ÔÙÒØ ÖÓ× ÐÓ× Ö ×ØÖÓ×     Ø Ú ÓÒ Ý × × ÐØ
                         ר ÔÙÒØÓº
     ½¾            ÐÐ Ñ Ö ÙÖ× Ú ¬ ½¾ ≡                                  ´½¾ µ
                   caller_ar = &stack.top(1);
                   current_ar = &stack.top();
                   goto start;

                   ר × Ñ ÒØÓ    Ó Ó ×ÙÑ ÕÙ ÙÒ ÒÙ ÚÓ Ö ×ØÖÓ        Ø Ú ÓÒ × Ó ÔÖ ¹
                 Ú Ñ ÒØ Ò× ÖØ Ó Ò Ð Ô Ð º ÈÓÖ × Ö ÞÓÒ¸ ØÙ Ð Þ ÑÓ× ÐÓ× ÔÙÒØ ÓÖ × ÐÓ×
                 Ö ×ØÖÓ×    Ø Ú ÓÒ ÒØ × × ÐØ Ö Ð Ò Ó Ð ÔÖÓ Ö Ñ º
2.5. Pilas                                                                    129



            Ä ÔÖ Ñ Ö Ð Ò      Ð ÔÖÓ Ö Ñ Ö ÙÖ× ÚÓ ÔÖÓ × Ð ×Ó × ¸ Ð Ù Ð × ÑÙÝ × Ñ Ð Ö
             Ò Ð Ú Ö× ÓÒ ÒÓ Ö ÙÖ× Ú
½¾             ×Ó × Ö ÙÖ× ÓÒ ½¾ ≡                                ´½¾ µ
             if (NUM(current_ar) <= 1)
               {
                 RESULT(caller_ar) = 1;
                 goto return_from_fib;
               }

                Ð Ù Ð ÕÙ Ò Ð Ú Ö× ÓÒ Ö ÙÖ× Ú ¸ Ð ÓÒ ÓÒ × Ú ÐÙ ×Ó Ö Ð Ô Ö Ñ ØÖÓ n
               Ð Ö ×ØÖÓ ØÙ к Ë ÑÓ× Ð ×Ó × ¸ ÒØÓÒ × ÓÐÓ ÑÓ× Ð Ö ×ÙÐØ Ó Ò Ð
            Ö ×ØÖÓ       Ø Ú ÓÒ Ð ÒÚÓ ÒØ Ý ÒÚ ÑÓ× Ð ­Ù Ó ÔÖÓ Ö Ñ          Ð Ô ÖØ
            ÕÙ ÑÙÐ Ð Ö ØÓÖÒ Ö × Ð ÙÒ ÓÒ Ö ÙÖ× Ú º
            Ë ÒÓ ×       Ò Ð ÔÖÓ ×Ó × ¸ ÒØÓÒ × Ý ÕÙ ÑÙÐ Ö Ð ÐÐ Ñ      fib(n - 1)¸
            Ð Ù Ð × Ö Ð Þ ÓÑÓ × Ù
½¾           ÐÐ Ñ      ¬ ´Ò ¹ ½µ ½¾ ≡                           ´½¾ µ
             RETURN_POINT(current_ar) = P1;
             NUM(&stack.pushn()) = NUM(current_ar) - 1; /* crea un registro de activaci´n */
                                                                                       o
              ÐÐ Ñ    Ö ÙÖ× Ú    ¬ ½¾
     Ä ÔÖ Ñ Ö Ð Ò Ñ Ö Ð Ö ÓÒ Ö ØÓÖÒÓº Ä × ÙÒ Ô ÖØ Ð Ö ×ØÖÓ          Ø Ú ÓÒ
        Ð ÒÙ Ú ÐÐ Ñ     Ò ×Ù Ô Ö Ñ ØÖÓ n × ÙÒ Ð ÐÐ Ñ fib(n - 1)º
¯      Ù Ò Ó × Ý Ð ÙÐ Ó fib(n - 1)¸ Ö ØÓÖÒ Ö × ¬ ½¾ Ò×Ô ÓÒ Ö Ð
     Ú ÐÓÖ RETURN VALUE Ð Ö ×ØÖÓ ØÙ Ð      Ø Ú ÓÒ Ý × Ô Ö Ø Ö    ÕÙ Ý ÕÙ
     × ÐØ Ö Ð ­Ù Ó     Ð Ø ÕÙ Ø p1º Ò ×Ø ÑÓÑ ÒØÓ       ÑÓ× ÑÙÐ Ö Ð × Ò ÓÒ
     int f1 = fib(n - 1)
½¾          Ö ØÓÖÒÓ × ¬ ´Ò ¹ ½µ ½¾      ≡                               ´½¾ µ
             F1(current_ar) = RESULT(current_ar);

   ÄÙ Ó ÑÙÐ ÑÓ× Ð ÐÐ Ñ            fib(n - 2)
½¾     ÐÐ Ñ    ¬ ´Ò ¹ ¾µ ½¾        ≡                                    ´½¾ µ
             NUM(&stack.pushn()) = NUM(current_ar) - 2; /* crea un registro de activaci´n */
                                                                                       o
             RETURN_POINT(current_ar) = P2;
              ÐÐ Ñ    Ö ÙÖ× Ú    ¬ ½¾
     ÐÐ Ñ         ¬ ´Ò ¹ ¾µ ½¾
                          × × ÒØ       ÐÐ Ñ      ¬ ´Ò ¹ ½µ ½¾ º ÄÓ ÙÒ Ó ÕÙ
    Ñ × ÕÙ Ð Ú ÐÓÖ Ð Ô Ö Ñ ØÖÓ n ÓÖÖ ×ÔÓÒ n − 2º
¯ ÍÒ Ú Þ Ð ÙÐ Ó fib(n - 2)¸ Ö ØÓÖÒ Ö × ¬ ½¾ × ÐØ Ö Ð ­Ù Ó        p2º Ò ×Ø
   ÑÓÑ ÒØÓ¸ ÑÙÐ ÑÓ× Ð × Ò ÓÒ int result = f1 + f2
½¾     Ö ØÓÖÒÓ × ¬ ´Ò ¹ ¾µ ½¾ ≡                            ´½¾ µ
             RESULT(caller_ar) = F1(current_ar) + RESULT(current_ar);

¯      Ò ÐÑ ÒØ ¸ return from fib × Ð ÔÙÒØÓ ÓÒ × ÑÙÐ Ð ÒרÖÙ ÓÒ return Ð ÔÖÓ¹
        Ñ ÒØÓ Ö ÙÖ× ÚÓº Ì Ð ÑÙÐ ÓÒ ÓÒ× ×Ø Ò
½¾         Ö ØÓÖÒ Ö × ¬ ½¾ ≡                                ´½¾ µ
             stack.pop(); /* cae en el registro del invocante */
             if (stack.size() == 1)
130                                                             Cap´
                                                                   ıtulo 2. Secuencias



         return RESULT(caller_ar);
       caller_ar = &stack.top(1);
       current_ar = &stack.top();
       switch (RETURN_POINT(current_ar))
         {
         case P1: goto p1;
         case P2: goto p2;
         }

         Ú Þ ÕÙ × Ö ØÓÖÒ     ÙÒ ÙÒ ÓÒ × Ð Ñ Ò ÙÒ Ö ×ØÖÓ          Ø Ú ÓÒ × × Ð
  ÓÑ Ø Ó Ð pop()º Ë Ð Ô Ð ÓÒØ Ò ÙÒ Ö ×ØÖÓ¸ ÒØÓÒ × Ð ­Ù Ó ×Ø Ø ÖÑ Ò Ò Ó
Ð ÐÐ Ñ        Ò Ð Ý Ð Ö ×ÙÐØ Ó ¬Ò Ø ÚÓ × Ò Ù ÒØÖ Ò RESULT(caller ar)º          ÐÓ
  ÓÒØÖ Ö Ó¸ × ØÙ Ð Þ Ò ÐÓ× ÔÙÒØ ÓÖ × ÐÓ× Ö ×ØÖÓ×       Ø Ú ÓÒ Ý × Ø ÖÑ Ò ÓÒ
×         Ö ØÓÖÒ Öº
     Ä ÖÙØ Ò ÒØ Ö ÓÖ Ü       ÙÒ × ÑÔ ÒÓ Ò Ö ÓÖ ×Ù Ú Ö× ÓÒ Ö ÙÖ× Ú º        ÒØÖ ¸
  Ð Ì ArrayStack<T> Ò ÙÒ ×Ó Ö Óר            Ú Ð ÓÒ          × ÓÖ ÕÙ ÒÓ Ø Ò Ð
Ú Ö× ÓÒ Ö ÙÖ× Ú º À Ý ÓØÖ × Ù ÒØ × ×Ó Ö Óר ¸ Ð Ò         ÓÒ × ÐØÓ × ÙÒ ÕÙ ÒÓ
Ø Ò Ð Ú Ö× ÓÒ Ö ÙÖ× Ú º
     ÈÓ ÑÓ× ØÙ Ö Ñ ÓÖ × ×Ó Ö Ð Ú Ö× ÓÒ ÒÓ Ö ÙÖ× Ú º Ò ÔÖ Ñ Ö ÐÙ Ö¸ ÔÓ ÑÓ×
  Ð Ñ Ò Ö Ð ÑÔÓ f1 Ð Ö ×ØÖÓ           Ø Ú ÓÒ Ý ÙØ Ð Þ Ö resultº     ר ÑÓ Ó ×¹
Ñ ÒÙ ÑÓ× Ð ÒØ            pushesº ÇØÖ Ñ ÓÖ × ×Ñ ÒÙ Ö Ð       ÒØ       Ó × ÖÚ ÓÒ ×
    Ð Ô Ð ¹ ÒרÖÙ ÓÒ top()¹º Ä Ô ÖØ ÐÐ Ñ Ö ÙÖ× Ú ¬ ½¾ ÔÓ Ö ¬Ò Ö×
  ÓÑÓ
        caller_ar = current_ar;
        ++current_ar;
        goto start;

   ÈÙ ×ØÓ ÕÙ Ð Ö ×ØÖÓ Ð ÒÚÓ ÒØ Ô × Ö × Ö Ð ØÙ и ÒÓ Ý Ò ×           Ó × ÖÚ Ö
Ð Ô Ð º ÈÙ ×ØÓ ÕÙ Ð Ô Ð ×Ø ÑÔÐ ÒØ     ÓÒ ÙÒ ÖÖ ÐÓ¸ Ð × Ù ÒØ Ö ×ØÖÓ  Ø Ú ÓÒ
× Ö Ð Ú ÒÓ current ar ÔÓÖ ×Ó ÐÓ Ò Ö Ñ ÒØ ÑÓ׺
   ÍÒ ÓÔØ Ñ Þ ÓÒ ¬Ò Ð ÓÒ× ×Ø Ò ÓÐÓ Ö Ö ÓÒ × Ö Ð × × ÐØÓ Ò ÐÙ Ö Ø ¹
ÕÙ Ø ×º ר Ñ ØÓ Ó Ð Ñ Ò Ö Ð switch Ý Ð if Ö ØÓÖÒ Ö × ¬ ½¾ ¸ ÔÙ × Ð
­Ù Ó × ÐØ Ö Ö Ø Ñ ÒØ Ð Ö ÓÒ               º × ÓÖØÙÒ Ñ ÒØ ¸ Ò Ð Ð Ò Ù C Ò
 ÐC ++ ÔÓ× Ò Ñ     Ò ×ÑÓ× ÕÙ Ô ÖÑ Ø Ò ÐÑ Ò Ö Ö ÓÒ × × ÐØÓ½ º Ì Ò Ö ÑÓ׸
 ÒØÓÒ ×¸ ÕÙ ÔÖÓ Ö Ñ Ö Ð ÙÒ × Ô ÖØ × Ð ÖÙØ Ò Ò Ò× Ñ Ð ÓÖº
Eliminaci´n total de la recursi´n
         o                     o
     ÓÑÓ Ý ÐÓ ÑÓ× Ú ×ØÓ¸ Ð Ñ Ò Ö Ð Ö ÙÖ× ÓÒ ÒÓ × ØÖ Ú Ðº Ä ÜÔ Ö Ò Ò ÕÙ
 × ÑÙÝ       Ð Ó Ø Ò Ö ÙÒ Ú Ö× ÓÒ ÒÓ Ö ÙÖ× Ú ÕÙ × Ñ × ¬ ÒØ ÕÙ ×Ù ÕÙ Ú Ð ÒØ
Ö ÙÖ× ÚÓº ÈÓÖ × Ö ÞÓÒ¸ Ð Ð Ñ Ò ÓÒ Ð Ö ÙÖ× ÓÒ ÙÒ Ð ÓÖ ØÑÓ Ò ØÙÖ ÐÑ ÒØ
Ö ÙÖ× ÚÓ ×ÓÐÓ           Ö× × Ð Ô ÖØ Ö ÙÖ× Ú ×Ø ÒØÖÓ Ð Ñ ÒÓ Ö Ø Ó           Ù ÓÒ
Ý × Ú Ø Ð ÙÑ ÒØ Ö Ð × ÑÔ ÒÓº Ò Ð Ñ ÝÓÖ           Ð × Ó × ÓÒ ×¸ × ÔÖ Ö Ð ØÖ    Ö
 ÓÒ Ð Ú Ö× ÓÒ Ö ÙÖ× Ú º
 ½
       Ð Ü Ô ÓÒ Ð Ò× Ñ Ð ÓÖ¸ Ð ÙØÓÖ ÒÓ ÓÒÓ Ò Ò ÙÒ Ð Ò Ù ÕÙ ÔÓ× ×Ø Ñ Ò ×ÑÓº Ä ×
ÔÖ Ñ Ø Ú × longjmp() Ý setjmp() Ð    Ð ÓØ   ר Ò Ö Ð Ð Ò Ù      Ô ÖÑ Ø Ò Ù Ö Ö Ö ÓÒ ×
­Ù Ó Ý × ÐØ Ö ÐР׺ Ä Ñ ÒØ Ð Ñ ÒØ ¸ ÒÙ ×ØÖÓ× ØÓ׸ ×Ù× Óר × Ò Ø ÑÔÓ Ý Ò ×Ô Ó ×ÓÒ ×ÙÔ Ö ÓÖ ×
ÕÙ Ð Ù Ö Ö Ò          ÓÒ ×º
2.6. Colas                                                                         131



      Ü ×Ø Ò × ØÙ ÓÒ × Ò Ð × ÕÙ Ð Ø Ñ ÒÓ Ð Ô Ð Ð × ×Ø Ñ × Ô ÕÙ ÒÓº Ò ×ØÓ×
   ×Ó׸ Ð Ö ÙÖ× ÓÒ × Ô Ð ÖÓ× ¸ ÔÙ × ÙÑ ÒØ Ð × ÔÓ× Ð     ×  × ÓÖ      Ô Ð º Ë ØÙ ¹
  ÓÒ × ×Ø Ø ÔÓ ×ÓÒ ÔÖÓ Ö Ñ × ÑÔÓØÖ Ó׸ Ø ÑÔÓ Ö Ð Ó ÔÐ ÓÒ × Ô Ö Ð Ð × ÓÒ
Ú Ö Ó× ­Ù Ó× ´Ø Ö ×µ         Ù ÓÒº Ò ×Ø ×Ó¸ ¬Ò ÔÖÓØ Ö Ð Ô Ð Ð × ×Ø Ñ ¸ ×
 Ùר ¬ Ð ¹ Ð ÙÒ × Ú × × Ò Ð¹ ×ÔÓÒ Ö ÙÒ Ú Ö× ÓÒ ÒÓ Ö ÙÖ× Ú ÕÙ Ñ Ò ×Ù
ÔÖÓÔ Ô Ð º
      Ò Ð ÔÖ Ø ¸ Ð Ù×Ó Ð Ö ÙÖ× ÓÒ × ÙÒ Ù ×Ø ÓÒ ÓÑÓ             º Ë ÐÓ× ÓÒ ÔØÓ×
 Ò Ö ÒØ × Ð Ð ÓÖ ØÑÓ ×ÓÒ Ö ÙÖ× ÚÓ׸ ÒØÓÒ × × ÔÖ Ö Ð ØÖ      Ö Ò Ø ÖÑ ÒÓ× Ö ÙÖ¹
× ÚÓ׸ ÔÙ × Ý Ñ × × ÙÖ           ÒØ Ò Ñ ÒØÓº Ë ÔÓÖ Ö ÞÓÒ ×  × ÑÔ ÒÓ Ó ×Ô Ó ×
      Ò × Ö Ó Ð Ñ Ò Ö Ð Ö ÙÖ× ÓÒ¸ ÒØÓÒ × × ÔÖ Ö Ð ÓÖÑÙÐ Ö ÓÒ ÔØÓ× Ø Ö Ø ÚÓ׸
 Ò ÐÙ Ö        Ð Ñ Ò Ö Ð Ö ÙÖ× ÓÒ ÙÒ Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓº ÍÒ ÑÔÐÓ ÒÓØ Ð × Ð
Ñ ×Ñ ÙÒ ÓÒ ØÓÖ Ð ÙÝ ¬Ò ÓÒ Ø Ö Ø Ú ×
                                            n
                                     n! =         i .
                                            i=1

 ר    ¬Ò ÓÒ ÒÓ× ÓÒ Ù ÙÒ Ú Ö× ÓÒ Ø Ö Ø Ú × Ò Ò Ò ÙÒ Ö ÞÓÒ Ñ ÒØÓ Ö ÙÖ× ÚÓº
    Ð ÙÒ × Ú × × ÔÙ         Ò ÓÒØÖ Ö ÙÒ ×ÓÐÙ ÓÒ Ò Ð Ø º ÈÓÖ ÑÔÐÓ¸ ÓÑÓ ¹
ÑÓ×ØÖ Ö ÑÓ× Ò Ü º º¾¸ Ð i¹ × ÑÓ ÒÙÑ ÖÓ       ÓÒ ÔÙ      ¬Ò Ö× ÓÑÓ
                                        √         n           √        n
                              1      1+ 5                  1− 5
                       (n) = √                        −                    .
                               5       2                     2

ÍÒ Ð ÓÖ ØÑÓ × Ó Ò ×Ø ÜÔÖ × ÓÒ ÒÓ Ö ÕÙ Ö Ò Ò ÙÒ Ø Ö ÓÒ Ò Ö ÙÖ× ÓÒº
     Ò ¬Ò Ø Ú ¸ ÐÓ Ñ × × ÑÔÐ × Ñ ÒÙ Ó ÐÓ ÓÒ Óº Ë Ô Ò× Ö Ö ÙÖ× Ú Ñ ÒØ × Ñ ×
× ÑÔÐ ¸ ÒØÓÒ × ØÖ Ò× ÔÓÖ Ð ÓÖ ØÑÓ× Ö ÙÖ× ÚÓ׺ Ë Ð Ú Ö× ÓÒ Ö ÙÖ× Ú × ÑÙÝ Ò ¬ ÒØ ¸
 Ð ØÓÖ Ð Ó ÐÓ× ÒÙÑ ÖÓ×         ÓÒ ¸ ÔÓÖ ÑÔÐÓ׸ ÒØÓÒ × Ù×ÕÙ ×ÓÐÙ ÓÒ × ÕÙ
  ×Ñ ÒÙÝ Ò ÐÓ× Ð ÙÐÓ× Ö Ô Ø Ó× Ó ÙØ Ð ÓÒ ÔØÓ× Ø Ö Ø ÚÓ× ÕÙ Ð ÓÒ ÙÞ Ò
 Ð ÓÖ ØÑÓ× Ø Ö Ø ÚÓ׺

2.6    Colas
ÍÒ ÓÐ         × ÙÒ × Ù Ò ÓÒ Ó× ÜØÖ ÑÓ×           ×Óº Ä Ò× Ö ÓÒ ×  ØÙ ÔÓÖ ÙÒ
  ÜØÖ ÑÓ¸   Ð ×ÙÔÖ × ÓÒ ÔÓÖ Ð ÓØÖÓº Ð ÜØÖ ÑÓ     Ò× Ö ÓÒ × ÒÓÑ Ò ÓÑÙÒÑ ÒØ
   ÓÐ Ó      ØÖ × ÖÓ Ó¸ Ò ×Ù× ÓÖÑ ×¸ × ÓÒ × Ö Ö Ó Ø Ð º Ð ÜØÖ ÑÓ ×ÙÔÖ × ÓÒ ×
ÐÐ Ñ           Þ ¸ Ö ÒØ Ó¸ Ò ×Ù× ÓÖÑ × × ÓÒ ×¸ ÖÓÒØ Ó       º
                                 ÓÐ                                Þ
                                ØÖ × ÖÓ                        Ö ÒØ
                                Ö Ö                            ÖÓÒØ

              ÔÙØ                                                              Ø
                           Tn   Tn−1 Tn−2                 T2   T1




                         ÙÖ ¾º¾¿ Î × ÓÒ ×ØÖ Ø                  ÙÒ ÓÐ
   Ä ¬ ÙÖ ¾º¾¿ ÐÙ×ØÖ ÙÒ Ú × ÓÒ ×ØÖ Ø  ÙÒ ÓÐ º ÄÓ× Ð Ñ ÒØÓ× ÒØÖ Ò ÔÓÖ Ð
 ÜØÖ ÑÓ ÞÕÙ Ö Ó Ñ ÒØ Ð ÓÔ Ö ÓÒ put()º Ð Ñ ×ÑÓ ÑÓ Ó¸ ÐÓ× Ð Ñ ÒØÓ× × Ð Ò ÔÓÖ
 Ð ÜØÖ ÑÓ Ö Ó Ñ ÒØ Ð ÓÔ Ö ÓÒ get()º Ñ Ó× ÜØÖ ÑÓ× ×ÓÒ Ó × ÖÚ Ð ×º
132                                                     Cap´
                                                           ıtulo 2. Secuencias



     Ð ØÖ × ÖÓ ÙÒ ÓÐ ÒÓØ Ð Ð Ñ ÒØÓ Ñ × Ö ÒØ Ñ ÒØ Ò× ÖØ Ó Ý Ð Ö ÒØ
 Ð Ñ ÒÓ× Ö ÒØ Ñ ÒØ Ò× ÖØ Óº ר ÒÓ ÓÒ Ö ÒØ × ÙÒ Ñ ÒØ Ð Ò Ð ÙÒÓ×
 Ð ÓÖ ØÑÓ× Ý × ÒÓÑ Ò È ÈË ´ÈÖ Ñ ÖÓ Ò ÒØÖ Ö¸ ÈÖ Ñ ÖÓ Ò Ë Ð Öµ Ó¸ Ò Ò Ð ×¸ Á Ç
´ Öר ÁÒ¸ Öר ÇÙØµº ÈÓ ÑÓ× Ö ÕÙ ÐÓ× Ð Ñ ÒØÓ× Ð ÓÐ ×Ø Ò ÓÖ Ò Ó× ×
 Ð Ñ × ÓÚ Ò ×Ø Ð Ñ × ÒØ ÙÓº ר Ô ØÖÓÒ Ö Ø Ö Þ ÐÓ× ÓÒØ ÜØÓ× Ð ÓÖ ØÑ Ó× Ò
ÐÓ× Ù Ð × ÙÒ ÓÐ ÔÙ Ù× Ö× º
      Ð Ù Ð ÕÙ ÓÒ Ð × Ô Ð ×¸ Ð × ÓÐ × ×ÓÒ ÑÙÝ ÓÑÙÒ × Ò Ð Ú Ö Ðº Ò ÓÒØÖ ÑÓ×
   ÑÔÐÓ× Ø Ô Ó× Ò Ð × ÓÐ × ×Ô Ö ÑÙ Ó× × ÖÚ Ó× ÒÙ ×ØÖ ×Ó               º ÙÒÓ
Ú ÑÓ× Ð Ò       ÑÓ× Ö ÙÒ ÓÐ Ô Ö ÓÑÔÖ Ö Ð ÒØÖ             Ù ÐÑ ÒØ ¸    ÑÓ× Ö
ÓØÖ ÓÐ Ô Ö Ò Ö × Ö Ð × Ð º Ù Ò Ó Ú ÑÓ× Ð Ò Ó             ÑÓ×     Ö ÓÐ º Ù Ò Ó
 ÓÒ Ù ÑÓ× ÙÒ ÖÖÓ Ý ÖÖ ÑÓ× ÙÒ × Ñ ÓÖÓ × ÓÖÑ ÙÒ ÓÐ º
2.6.1     Variantes de las colas
ÍÒ Ú Ö ÒØ Ñ × Ò Ö Ð Ð ÓÖ Ò Á Ç ÓÒ× ×Ø Ò Ú Ö Ð ÓÖ Ò × Ð Ñ × Ö ÒØ ¹
Ñ ÒØ         Ó ×Ø Ð Ñ ÒÓ× Ö ÒØ Ñ ÒØ              Óº Ð ÓÖ Ò Ò× Ö ÓÒ Ý ÜØÖ ÓÒ
 × Ð Ñ ×ÑÓ¸ Ô ÖÓ Ý ÙÒ ÓÔ Ö ÓÒ         ÓÒ Ð         ×Ó Ó ÓÒ×ÙÐØ º Ù ÐÕÙ Ö Ð Ñ ÒØÓ
    Ð ÓÐ ÔÙ × Ö           Ó¸ Ô ÖÓ ×Ø      ×Ó Ù× ÕÙ Ð Ð Ñ ÒØÓ × ×ÔÐ
 Ð ØÖ × ÖÓº    ר ÑÓ Ó¸ Ð Ö ÒØ × Ð Ð Ñ ÒØÓ ÕÙ Ø Ò Ñ × Ø ÑÔÓ × Ò Ö Ö Ò Ö× ¸
Ñ ÒØÖ × ÕÙ Ð ØÖ × ÖÓ × Ð ÕÙ Ø Ò Ñ ÒÓ× Ø ÑÔÓº ר ÔÓÐ Ø Ó Ö ÑÔÓÖØ Ò Ò
ÔÖÓ Ð Ñ × ÕÙ Ñ Ò ÔÙÐ Ò ÓÒ ÙÒØÓ×        ØÓ×      Ö ÒÐ      ¬Ò Ø º Ù Ò Ó × Ò Ö ×
ÙÒ ÒÙ ÚÓ Ð Ñ ÒØÓ Ò ÙÒ ÓÒ ÙÒØÓ ÐÐ ÒÓ¸ Ý ÕÙ × Ð ÓÒ Ö ÙÒ Ð Ñ ÒØÓ ×ÙÔÖ Ñ Öº Ë Ð
     ×Ó Ð ÓÒ ÙÒØÓ Ü    ÐÓ Ð      Ø ÑÔÓÖ Ð¸ ÐÓ Ù Ð ×Ù     Ò ÑÙ Ó× ÓÒØ ÜØÓ× ÔÐ ¹
Ø ÚÓ׸ ÒØÓÒ × Ð Ñ ÓÖ Ð Ñ ÒØÓ ×ÙÔÖ Ñ Ö × Ð Ñ ÒÓ× Ö ÒØ Ñ ÒØ ÙØ Ð Þ Óº Ò ÙÒ
 ÓÐ ÕÙ Ñ Ò Ð ÓÖ Ò             ×Ó¸ ר Ð Ñ ÒØÓ × Ò Ù ÒØÖ Ò Ð Ö ÒØ º
     ÇØÖ Ú Ö ÒØ ÑÔÓÖØ ÒØ × Ô ÖÑ Ø Ö Ð Ò× Ö ÓÒ Ý ×ÙÔÖ × ÓÒ ÔÓÖ ÐÓ× Ó× ÜØÖ ÑÓ׺
  ר Ú Ö ÒØ × ÒÓÑ Ò            ÓÐ Ó ÔÓÐÓ ½ º Ò ÖØ Ñ              ¸ ÙÒ ÓÐ × ÙÒ
 ÓÖÑ Ò Ö Ð Ô Ð Ý           ÓÐ º Ù ÐÕÙ Ö       Ð × Ó× ×ØÖÙ ØÙÖ × ÔÙ ÑÓ Ð Þ Ö×
Ñ ÒØ ÙÒ ÓÐ º Ä Ñ Ð Ò ØÓÖÒÓ Ð Ì Dlink ´Ü ¾º º µ × ÙÒ ÔÓÐÓº

2.6.2     Aplicaciones de las colas
  Ò Ò Ö Ð¸ ÐÓ× × ×Ø Ñ × ÔÖÓ Ö Ñ Ó× ÙØ Ð Þ Ò ÓÐ × Ô Ö Ø Ò Ö ×ÓÐ ØÙ × Ó Ð Ùר
  × ÔÐ Ò Á Ǻ ÈÓÖ ÑÔÐÓ¸ ÙÒ × ÖÚ ÓÖ Ï ÔÙ Ò ÓÐ Ö ×ÓÐ ØÙ ×                Ù×ÕÙ
Ô Ò × ÙÒ Ð ÓÖ Ò ÐÐ             º ÅÙ Ó× × ×Ø Ñ × ÓÒØÖÓÐ ØÖ Ò× ÓÒ × Ò ÓÐ Ò Ð ×
×ÓÐ ØÙ × × ÖÚ Ó× ÔÓÖ ÑÔÐÓ¸ ØÖ Ò× ÓÒ × ¬Ò Ò Ö ×º
      Ð ÖÓÐ ÙÒ Ñ ÒØ Ð Ð ×Ó ØÛ Ö       Ö × ØÖ Ò×Ñ Ø Ö Ô ÕÙ Ø × Ò ÓÖÑ ÓÒ ÒØÖ
ÐÓ× Ú Ö×Ó× ÒÓ Ó× ÙÒ Ö º Ð ÔÖÓ Ö Ñ Ò Ö Ó                ר ØÖ Ò×Ñ × ÓÒ × ÒÓÑ Ò
   ÒÖÙØ ÓÖ Ó Ò Ñ Ò ÓÖ º Ò Ö ÐÑ ÒØ ¸ ÙÒ ÒÖÙØ ÓÖ ÔÖÓ × ×Ù× Ô ÕÙ Ø × × ÙÒ
ÙÒ × ÔÐ Ò Á Ǻ
    ÄÓ× × ×Ø Ñ × ÓÔ Ö Ø ÚÓ× Ø Ñ Ò ÙØ Ð Þ Ò ÓÐ × Ô Ö ÓÑÔ ÖØ Ö Ö ÙÖ×Ó× ÒØÖ Ú Ö×Ó×
Ù×Ù Ö Ó׺ ÌÖ ÓÒ ÐÑ ÒØ ¸ ÔÖÓ ×Ó× ÕÙ ÖÖ Ò ÙÒ × ×Ø Ñ × Ò× ÖØ Ò Ò ÙÒ ÓÐ º Ð
ÔÖÓ ×Ó Ò Ð Ö ÒØ × ÜØÖ Ý ×           ÙØ ÙÖ ÒØ ÙÒ Ø ÑÔÓ ÐÐ Ñ Ó Ù ÒØÙѺ Ù Ò Ó
 Ð Ù ÒØÙÑ ÜÔ Ö ¸ Ð ÔÖÓ ×Ó × Ò× ÖØ ÒÙ ÚÓ Ò Ð ÓÐ Ý Ð × ×Ø Ñ ÓÔ Ö Ø ÚÓ ÜØÖ
 Ð × Ù ÒØ ÔÖÓ ×Ó Ð ÓÐ º
 ½
      Ò Ò Ð ×¸   ÕÙ º
2.6. Colas                                                                        133



   Ü ×Ø ØÓ ÙÒ Ö Ñ Ð Ñ Ø Ñ Ø ¸ ÓÒÓ              ÓÑÓ Ø ÓÖ     ÓР׸ Ð Ù Ð ÑÓ Ð Þ
ÒØ     × ×ØÖ Ø × ÕÙ × Ò ÓÐ Ò Ô Ö ×ÓÐ Ø Ö Ð ÙÒ × ÖÚ Óº ÙÒÕÙ Ð Ñ Ø Ñ Ø
ÖÖÓ Ö ×ÙÐØ Ó× Ò Ð Ø Ó× ÑÙÝ ÙØ Р׸ Ð ÙÒÓ× ÑÓ ÐÓ× ×ÓÒ Ø Ò ÓÑÔÐ Ó× ÕÙ × Ò × Ö Ó
× ÑÙÐ ÖÐÓ× º Ì Ð × × ×Ø Ñ × × ÑÙÐ ÓÒ Ù× Ò ÒØ Ò× Ú Ñ ÒØ ÓР׺

2.6.3   Representaciones en memoria de las colas
  Ð Ù Ð ÕÙ Ð Ô Ð ¸ ÙÒ ÓÐ × ÙÒ × Ù Ò       Ð Ñ ÒØÓ× Ð ÙÒ Ø ÔÓº ÓÑÓ Ø Ð¸ Ý
 Ó× ÓÖÑ × × × Ö ÔÖ × ÒØ Ö ÙÒ ÓÐ ÓÒ ÙÒ ÖÖ ÐÓ Ó ÓÒ ÙÒ Ð ×Ø º
   Ä ÑÔÐ ÒØ ÓÒ Ð ÓÐ ÓÒ ÙÒ ÖÖ ÐÓ × × Ñ Ð Ö Ð Ô Ð º Ä           Ö Ò ×ØÖ
 Ò ÕÙ      ÑÓ× Ñ Ò Ö ÐÓ× Ó× ÜØÖ ÑÓ× Ö Ó¸     ÑÓ× Ñ ÒØ Ò Ö Ó× ÓÒØ ÓÖ × ÙÒÓ
Ô Ö Ð ÓÐ ¸ ÓØÖÓ Ô Ö Ð    Þ º Ä ¬ ÙÖ ¾º¾ ÐÙ×ØÖ ÙÒ ÓÐ ÑÔÐ ÒØ Ñ ÒØ ÙÒ
 ÖÖ ÐÓº
                          ¼ ½ ¾ ¿                             ½¼
                          T0 T1 T2 T3 T4


                           Þ                       ÓÐ

                   ÙÖ ¾º¾        ÓÐ ÑÔÐ ÒØ         Ñ     ÒØ ÙÒ ÖÖ ÐÓ
    È Ö Ò× ÖØ Ö¸ ÓÔ ÑÓ× Ð Ð Ñ ÒØÓ Ò Ö Ñ ÒØ ÑÓ× Ð ÓÐ º È Ö Ð Ñ Ò Ö¸ ÓÔ ÑÓ×
 Ð Ú ÐÓÖ Ö ØÓÖÒÓ Ò Ö Ñ ÒØ ÑÓ× Ð         Þ º Ä ÓÐ ×Ø ÐÐ Ò Ù Ò Ó Ð ÒØ
 Ð Ñ ÒØÓ× × Ù Ð Ð Ñ Ò× ÓÒ Ð Ú ØÓÖº
    ÆÓØ ÑÓ× ÕÙ Ð Ð Ñ Ò ÓÒ Ð Ñ ÒØÓ× ÔÙ            Ö ×Ô Ó× ×ÔÓÒ Ð × Ð ÞÕÙ Ö
   Ð Ò         Þ º × Ô٠׸ Ð Ò× Ö ÓÒ Ý ×ÙÔÖ × ÓÒ     Ò ÓÒ× Ö Ö ×Ø Ö ÙÐ Ö º
  ×ØÓ ÔÙ Ñ Ò Ö× Ñ ÒØ ÙÒ if ÕÙ Ú Ö ¬ÕÙ × Ð Ò ÒÓ × Ò Ù ÒØÖ Ò Ð ÓÖ
   Ð ÖÖ ÐÓ¸ Ó Ñ ÒØ Ð ÙÒ ÓÒ ÑÓ ÙÐÓº
    È Ö Ð × ÓÐ × × ÔÖ Ö Ð ÕÙ Ð Ð ×Ø × Ö ÙÐ Ö¸ ÔÙ × ÔÓ ÑÓ×            Ö Ð Ö ÒØ
Ý Ð ØÖ × ÖÓ Ñ ÒØ ÙÒ ×ÓÐÓ ÔÙÒØ ÓÖº Ë × ØÖ Ø         ÙÒ Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ ¸
ÓÖ Ò ÑÓ× ÐÓ× Ð Ñ ÒØÓ× × Ð Ö ÒØ ר Ð ØÖ × ÖÓ Ý Ñ ÒØ Ò ÑÓ× ÙÒ ÔÙÒØ ÓÖ Ð
ÙÐØ ÑÓ Ð Ñ ÒØÓ ´¬ ÙÖ ¾º¾ µº    ר ÑÓ Ó¸ ÔÓ ÑÓ× Ò× ÖØ Ö Ý Ð Ñ Ò Ö × Ð ÔÙÒØ ÖÓ
  Ð ÓÐ º
                                                                           rear

             1             2               3              4            5




                 ÙÖ ¾º¾        ÓÐ ÑÔÐ ÒØ       Ñ       ÒØ ÙÒ Ð ×Ø × ÑÔÐ
  Ä × Ð ×Ø × Ó Ð Ñ ÒØ ÒÐ Þ × ÔÙ Ò × Ö ÙÒ Ù Ò × Ó Ò Ô Ö Ð × ÓÐ × ÓÖ ¹
Ò   × × ÙÒ Ð Ø ÑÔÓ       ×Ó Ý Ô Ö Ð × ÓÐ × ´Ü ¾º º½µº Ä Ú ÒØ × ÕÙ Ð ×ÙÔÖ × ÓÒ
  ÙÒ Ð Ñ ÒØÓ × Ö Ø ÓÒ ÙÒ ÒÓ Ó Ó Ð ¸ Ñ ÒØÖ × ÕÙ Ò ÙÒ Ð ×Ø × ÑÔÐ        Ö ÕÙ
Ñ ÒØ Ò Ö Ð ÔÙÒØ ÖÓ Ð ÔÖ    ×ÓÖº
134                                                         Cap´
                                                                    ıtulo 2. Secuencias



         Ð Ø ÔÓ DynDlist<T> ×ØÙ Ó Ò Ü ¾º º½¼ ´Ô Ò ¿µ ÒÓ× ÔÖÓÔÓÖ ÓÒ ÙÒ Ñ Ò Ö
       Ö Ø      ÑÔÐ Ñ ÒØ Ö ÙÒ ÓÐ º Ë Ú ÑÓ× Ð ÙÐØ ÑÓ Ð Ñ ÒØÓ ÓÑÓ Ð ØÖ × ÖÓ¸ ÒØÓÒ × Ð
     ÓÔ Ö ÓÒ get() × ÑÔÐ ÒØ Ñ ÒØ return remove first() Ý put(item) Ñ ÒØ
     append(item)º Ð ØÖ × ÖÓ Ý Ð Ö ÒØ × Ó × ÖÚ Ò ØÖ Ú ×    get last() Ý get first()¸
     Ö ×Ô Ø Ú Ñ ÒØ º

     2.6.4    El TAD ArrayQueue<T> (cola vectorizada)
       Ò ×Ø × ÓÒ × ÖÖÓÐÐ Ö ÑÓ× ÙÒ ÑÔÐ ÒØ ÓÒ       ÓÐ × Ñ ÒØ ÖÖ ÐÓ× ×Ø Ø Ó׺
     ÁÑÔÐ ÒØ Ö ÑÓ× Ó× Ì ÑÙÝ × Ñ Ð Ö × ArrayQueue<T> Ý FixedQueue<T>º Ñ Ó×
     Ø ÔÓ× ×ÓÒ × ÒØ Ó× × ÐÚÓ ÕÙ FixedQueue<T> ÒÓ ØÙ Ú Ö ¬ ÓÒ ×      × ÓÖ º
         ÄÓ× Ø ÔÓ× × ¬Ò Ò Ò Ð Ö ÚÓ ØÔÐ ÖÖ ÝÉÙ Ù ºÀ ½¿    Ð × Ù ÒØ Ñ Ò Ö
½¿    ØÔÐ ÖÖ ÝÉÙ Ù ºÀ ½¿ ≡
          template <typename T>
      class ArrayQueue
      {
            ØÖ ÙØÓ× ÓÐ Ú ØÓÖ Þ ½¿
           Ñ ØÓ Ó× ÔÖ Ú Ó× ÓÐ Ú ØÓÖ Þ ½¿
           Ñ ØÓ Ó× ÔÙ Ð Ó× ArrayQueue<T> ½¿
           Ó × ÖÚ ÓÖ × ÓÐ Ú ØÓÖ Þ ½¿
      };
          template <typename T>
      class FixedQueue
      {
      };
       ¬Ò ×
      ArrayQueue¸   Ù×   Ò ÙÒ × ½¿   Ò ¾¼ º
          Ñ × Ð × × ÑÓ Ð Þ Ò ÓÐ × Ð Ñ ÒØÓ× Ò Ö Ó× Ø ÔÓ T ÑÔÐ ÒØ × Ñ ÒØ
     ÙÒ ÖÖ ÐÓ ×Ø Ø Óº ArrayQueue<T> Ú Ö ¬ × ÓÖ × Ù Ò Ó Ð ÖÖ ÐÓ ×Ø Ú Ó Ó ÐÐ ÒÓº
     ÍÒ × ÓÖ ÔÖÓÚÓ ÙÒ Ü Ô ÓÒº FixedQueue<T> ÒÓ ØÙ Ò Ò ÙÒ Ú Ö ¬ ÓÒ Ò
       Ò Ö Ò Ò ÙÒ Ü Ô ÓÒº Ä Ù× Ò         ר × Ú Ö ¬ ÓÒ × ÓÒÐÐ Ú ÙÒ Ð Ö Ò Ò
      Ò × ÑÔ ÒÓº
         Ä Ñ Ò× ÓÒ Ð ÖÖ ÐÓ ÒØ ÖÒÓ ×Ø Ö ×ØÖ Ò        ÙÒ ÔÓØ Ò Ü Ø 2º
½¿     ØÖ ÙØÓ× ÓÐ Ú ØÓÖ Þ ½¿ ≡                             ´½¿ µ ½¿
      const size_t two_pow;
      const size_t dim;
      T *          array;

      Ð ÔÙÒØ ÖÓ array ÓÒØ Ò ÐÓ× Ð Ñ ÒØÓ×       Ð ÓÐ º dim Ö ÔÖ × ÒØ Ð Ñ Ò× ÓÒ Ð ÖÖ ÐÓ
     ÒØ ÖÒÓ¸ Ð Ù Ð × ÙÒ ÔÓØ Ò Ü Ø             2 Ø Ð ÕÙ dim == 2two pow º
          Ð Ö ÒØ Ð ÓÐ ×Ø         Ó ÔÓÖ
½¿     ØÖ ÙØÓ× ÓÐ Ú ØÓÖ Þ ½¿ +≡                           ´½¿ µ ½¿    ½¿
      size_t front_index; /* index of oldest inserted item */
               × ÐÒ
     front index       Ð Ð Ñ ÒØÓ Ñ × ÒØ ÙÓ Ò Ð ÓÐ            ×     Ö¸ array[front index]
     ÓÒØ Ò Ð Ö ÒØ Ð ÓÐ
½¿   Ö ÒØ Ð ÓÐ ½¿ ≡                                                   ´½¿ µ
      array[front_index]
2.6. Colas                                                                    135



          Ð ØÖ × ÖÓ Ð ÓÐ ×Ø Ò         Ó ÔÓÖ
½¿     ØÖ ÙØÓ× ÓÐ Ú ØÓÖ Þ ½¿        +≡                   ´½¿ µ ½¿     ½¿
       size_t rear_index;
     rear index Ò     Ð ÔÓ× ÓÒ       Ð ÔÖ Ñ Ö Ð         ×ÔÓÒ Ð Ô Ö Ò× ÖØ Ö ×         Ö¸
     array[rear index - 1] ÓÒØ Ò     Ð Ð Ñ ÒØÓ Ñ × Ö    ÒØ Ò Ð ÓÐ º
                                     ¼ ½ ¾ ¿
                                    T0 T1 T2 T3 T4


                                front index              rear index


                        ÙÖ ¾º¾ ÇÖ Ò Þ ÓÒ Ð ÖÖ ÐÓ Ò ArrayQueue<T>
         ÄÓ× Ú ÐÓÖ × front index Ý rear index × Ò Ò Ò ÖÓº Ä ¬ ÙÖ ¾º¾ ÐÙ×ØÖ Ð
      ר Ó Ð ÖÖ ÐÓ Ý ÐÓ× Ò × ×ÔÙ × Ò× ÖØ Ö ÐÓ× ÔÖ Ñ ÖÓ× Ò Ó Ð Ñ ÒØÓ× Ò ÙÒ
      ÖÖ ÐÓ 8 Ð Ñ ÒØÓ׺
         Ì ÒØÓ Ô Ö Ò× ÖØ Ö¸ ÓÑÓ Ô Ö Ð Ñ Ò Ö¸ ר ÓÒ Ò Ö Ñ ÒØ Ö Ð Ò             ÓÖÖ ×ÔÓÒ¹
        ÒØ º Ë ÕÙ Ö ÑÓ× Ò× ÖØ Ö¸ Ò Ö Ñ ÒØ ÑÓ× rear index × ÕÙ Ö ÑÓ× Ð Ñ Ò Ö¸ Ò Ö Ñ Ò¹
     Ø ÑÓ× front indexº
           Ù Ò Ó Ð ÙÒÓ ÐÓ× Ò × Ð ÒÞ Ð Ñ Ò× ÓÒ Ð ÖÖ ÐÓ¸ ÐÓ Ò ÑÓ× ÒÙ ÚÓ
      Ò ÖÓ ×ØÓ × ÑÙÐ Ð Ö ÙÐ Ö º È Ö ×ØÓ¸ ר ÓÐÓ Ö ÙÒ if ×ÔÙ × Ð Ò Ö Ñ ÒØÓ
     ÕÙ Ú Ö ¬ÕÙ × × Ð ÒÞ Ð Ñ Ò× ÓÒ × Ø Ð × Ð ×Ó¸ ÒØÓÒ × Ö Ò ÑÓ× Ð Ò                   Ò
       ÖÓº ÈÓ ÑÓ× Ú Ø Ö Ð if ×        Ú Þ ÕÙ Ò Ö Ñ ÒØ ÑÓ× ÙÒ Ò       Ð ÙÐ ÑÓ× Ð ÑÓ ÙÐÓ
        Ð Ñ Ò× ÓÒ Ð ÖÖ ÐÓº          ר ÑÓ Ó¸ Ð Ú ÐÓÖ Ð Ò × ÑÔÖ ×Ø Ö ÓÑÔÖ Ò Ó
      ÒØÖ 0 Ý dim − 1º ר Ñ ØÓ Ó Ð Ò Ð Þ Ð Ó Ó¸ Ô ÖÓ × Ñ × Ð ÒØÓ ÕÙ ÓÒ Ð ifº ×
     Ô Ö ×ÓÐÚ ÒØ Ö ×Ø ÔÖÓ Ð Ñ ¸ ÕÙ ÓÖÞ ÑÓ× Ð Ñ Ò× ÓÒ ÕÙ × ÔÓØ Ò Ü Ø                  2¸
     Ô٠׸ Ò ×Ø ×Ó¸ Ð ÑÓ ÙÐÓ ÔÙ          Ð ÙÐ Ö× ÑÙÝ Ö Ô Ñ ÒØ ØÖ Ú × ÙÒ and ÐÓ Óº
     ÈÓÖ Ø ÒØÓ¸ ÙÒÓ ÐÓ× ØÖ ÙØÓ× × Ö ÙÒ Ñ × Ö            Ø× Ô Ö Ð ÙÐ Ö Ð ÑÓ ÙÐÓ
½¿     ØÖ ÙØÓ× ÓÐ Ú ØÓÖ Þ ½¿ +≡                            ´½¿ µ ½¿ ½¿
       const size_t mask;
          × Ø ÒØ ÓÖ Ð ÙÐ Ö Ð ÒÙÑ ÖÓ Ð Ñ ÒØÓ× Ñ ÒØ Ð Ú ÐÓÖ ×ÓÐÙØÓ rear index
     − front indexº Ä Ñ ÒØ Ð Ñ ÒØ ¸ Ø Ò ÑÓ× ÙÒ Ñ Ù   ¸ ÔÙ × Ð Ö ×Ø × ÖÓ Ù Ò Ó
     Ð ÓÐ ×Ø ÐÐ Ò º ÆÓ Ý ÓØÖ ÐØ ÖÒ Ø Ú ¸ ÒØÓÒ ×¸ ÕÙ ÓÒØ Ð Þ Ö Ö Ø Ñ ÒØ Ð
       ÒØ        Ð Ñ ÒØÓ× Ò ÙÒ ØÖ ÙØÓ
½¿    ØÖ ÙØÓ× ÓÐ Ú ØÓÖ Þ ½¿ +≡                          ´½¿ µ ½¿
       size_t num_items;
       ÄÓ× ØÖ ÙØÓ×          Ð ÓÐ × Ò Ò ÓÑÓ × Ù
½¿   Ñ ØÓ Ó× ÔÙ Ð Ó×    ArrayQueue<T> ½¿ ≡                     ´½¿ µ ½¿
       ArrayQueue(const size_t & tp = 8)
         : two_pow(tp), dim(1<<two_pow), array(NULL), front_index(0),
           rear_index(0), mask(dim - 1), num_items(0)
       {
         array = new T [dim];
       }
     Í× × ArrayQueue ½¿ º
136                                                      Cap´
                                                                 ıtulo 2. Secuencias



        Ä ÓÔ Ö ÓÒ       Ò Ö Ñ ÒØ Ö ÙÒ Ò Ý ÐÙ Ó Ð ÙÐ Ö Ð ÑÓ ÙÐÓ × Ö        ØÙ ÔÓÖ ÐÓ×
     ÑÓ ¬ ÓÖ × Ð         ÓÐ º × ÑÙÝ ÑÔÓÖØ ÒØ ¸ Ô٠׸ × ÙÖ ÖÒÓ×        ÖÐ ÓÖÖ Ø Ñ ÒØ º
     È Ö ÐÐÓ¸ Ð ÑÓ ÙÐ   Ö Þ ÑÓ× Ý Ð ×Ð ÑÓ× Ò ÙÒ ×ÓÐ ÓÔ Ö ÓÒ
½¿    Ñ ØÓ Ó× ÔÖ Ú Ó×      ÓÐ Ú ØÓÖ Þ ½¿ ≡                     ´½¿ µ ½¿
      void increase_index(size_t & i, const size_t & inc = 1) const
      {
        i += inc;
        i &= mask;
      }
     increase index()  Ò Ö Ñ ÒØ i Ò inc ÙÒ        × Ý Ð ÙÐ Ð ÑÓ ÙÐÓ Ñ ÒØ Ð Ñ × Ö º
          Ð Ñ ØÓ Ó Ð ÑÓ ÙÐÓ ÔÙ       ÔÐ Ö× Ø Ñ Ò ÓÒ Ö ×Ø × Ò ÐÙ Ö ×ÙÑ ×º Ù Ò Ó
     × Ö Ñ ÒØ ÙÒ ÒØ ÖÓ × Ò × ÒÓ ÓÒ Ú ÐÓÖ ÖÓ¸ Ð × ÓÖ Ò Ø ÚÓ Ù× ÕÙ Ð ÒØ ÖÓ
        ÕÙ Ö Ð Ñ ÝÓÖ Ú ÐÓÖº ÈÙ ×ØÓ ÕÙ Ð Ñ Ò× ÓÒ × ÔÓØ Ò          Ó׸ Ð ÑÓ ÙÐÓ Ö ÓÑÓ
     Ö ×ÙÐØ Ó Ð Ñ Ò× ÓÒ Ñ ÒÓ× ÙÒÓº           ÑÓ× × ÙÖ ÖÒÓ׸ ÑÔ ÖÓ¸ ÕÙ Ð × Ö ×Ø × ×
      ÔÐ ÕÙ Ò ×Ó Ö ÒØ ÖÓ× × Ò × ÒÓ Ý¸ ÔÓÖ ×ÙÔÙ ×ØÓ¸ ÕÙ Ð Ö ØÑ Ø × Ò Ö º
         Ë × × ÓÒ×ÙÐØ Ö Ð ØÖ × ÖÓ¸ × Ò × Ö Ó          Ö array[rear index - 1]º ÈÙ ×ØÓ
     ÕÙ ×Ø ÓÔ Ö ÓÒ ÔÙ          ÖÖÓ Ö ÙÒ × ÓÖ Ò Ø ÚÓ¸ Ð ×Ð ÑÓ× Ò ÙÒ ×ÓÐ ÙÒ ÓÒ
     ÕÙ ÒÓ× Ö ÒØ ÙÒ ÓÔ Ö ÓÒ ÓÖÖ Ø
½¿    Ñ ØÓ Ó× ÔÖ Ú Ó× ÓÐ Ú ØÓÖ Þ ½¿ +≡                         ´½¿ µ ½¿
      T & rear_item(const size_t & i = 0)
      {
        return array[static_cast<size_t> ((rear_index - i - 1) & mask)];
      }
½¿   Ñ ØÓ Ó× ÔÙ Ð Ó×   ArrayQueue<T> ½¿ +≡              ´½¿ µ ½¿ ½¿
      T & put(const T & item) throw(std::exception,std::overflow_error)
      {
        if (num_items >= dim)
          throw std::overflow_error ("Array queue is full");
           ÔÙØ Ò ÓÐ Ú ØÓÖ Þ    ½¿
      }
     put()  Ò Ö Ð Ü Ô ÓÒ std::overflow error × × ÒØ ÒØ Ò× ÖØ Ö Ò ÙÒ ÓÐ ÐÐ Ò º
     Ä Ò× Ö ÓÒ ÓÑÓ Ø Ð × ÓÑÓ × Ù
½¿    ÔÙØ Ò ÓÐ Ú ØÓÖ Þ ½¿ ≡                                  ´½¿ µ
      array[rear_index] = item;
      T & ret_val = array[rear_index];
      increase_index(rear_index);
      num_items++;
      return ret_val;
          Ò ÐÙ Ö Ò× ÖØ Ö ÙÒ Ð Ñ ÒØÓ¸ × ÔÓ× Ð Ô ÖØ Ö ×Ô Ó¸ Ó × ÔÐ Ò Á Ǹ
     Ô Ö n Ð Ñ ÒØÓ׺ ×ØÓ × Ø Ò Ö Ô Ó ØÖ Ú × ÙÒ ÖÖ ÐÓ ÕÙ Ú Ð Ð Ô Ò ÜÔÓÖØ Ö Ð
      ÙÒ ÓÒ Ð      Ò Ð × Ù ÒØ Ñ ØÓ Ó
½¿    Ñ ØÓ Ó× ÔÙ Ð Ó× ArrayQueue<T> ½¿ +≡         ´½¿ µ ½¿ ½¿
      T & putn(const size_t & n) throw(std::exception, std::overflow_error)
      {
        if (num_items + n >= dim)
          throw std::overflow_error ("Array queue is full");
           ÔÙØÒ Ò ÓÐ Ú ØÓÖ Þ    ½¿
      }
2.6. Colas                                                                       137



     Ä ÔÖ Ñ Ö Ô ÖØ Ú Ö ¬      Ð × ÓÖ ¸ Ð × ÙÒ × Ö Ñ Ø           Ò Ö Ñ ÒØ Ö rear index
½¿    ÔÙØÒ Ò ÓÐ Ú ØÓÖ Þ      ½¿        ≡                               ´½¿ µ
      increase_index(rear_index, n);
      num_items += n;
      return rear_item();
       Ä ×ÙÔÖ × ÓÒ × × × Ñ ØÖ     put()
½¿   Ñ ØÓ Ó× ÔÙ Ð Ó× ArrayQueue<T> ½¿ +≡                    ´½¿ µ ½¿   ½¿
      T get()
      {
           Ø Ò ÓÐ Ú ØÓÖ Þ         ½¿
      }
      ÓÒ Ð ×ÙÔÖ × ÓÒ ÓÒ× ×Ø Ò
½¿     Ø Ò ÓÐ Ú ØÓÖ Þ ½¿ ≡                                             ´½¿ µ
      num_items--;
      T ret_val = Ö ÒØ     Ð ÓÐ ½¿          ;
      increase_index(front_index);
      return ret_val;
        Ä ÓÒØÖ Ô ÖØ      putn()         × getn() ×   Ö¸ Ð Ö Ö n Ð Ñ ÒØÓ× ÔÓÖ Ð Ö ÒØ     Ð
     ÓÐ
½¿   Ñ ØÓ Ó× ÔÙ Ð Ó×   ArrayQueue<T> ½¿ +≡              ´½¿ µ ½¿ ½¿
      T & getn(const size_t & n) throw(std::exception, std::underflow_error)
      {
           ØÒ Ò ÓÐ Ú ØÓÖ Þ         ½¿
      }

½¿     ØÒ Ò ÓÐ Ú ØÓÖ Þ       ½¿    ≡                                   ´½¿ µ
      num_items -= n;
      increase_index(front_index, n);
      return array[front_index];

       Ä ÓÒ×ÙÐØ ÔÓÖ Ð Ö ÒØ × Ö Ð Þ Ñ ÒØ
½¿   Ñ ØÓ Ó× ÔÙ Ð Ó× ArrayQueue<T> ½¿ +≡                    ´½¿ µ ½¿   ½¿
      T & front(const size_t & i = 0)
      {
         Ö ØÓÖÒ Ö i¹ × ÑÓ Ð Ñ ÒØÓ Ð Ö       ÒØ ½¿
      }

½¿   Ö ØÓÖÒ Ö i¹ × ÑÓ Ð Ñ ÒØÓ Ð Ö ÒØ ½¿         ≡                       ´½¿ µ
      return array[front_index + i];

       Ä ÓÒ×ÙÐØ ÔÓÖ Ð ØÖ × ÖÓ Ø Ñ Ò × × Ñ ØÖ
½¿   Ñ ØÓ Ó× ÔÙ Ð Ó× ArrayQueue<T> ½¿ +≡                          ´½¿ µ ½¿
      T & rear(const size_t & i = 0) throw(std::exception, std::underflow_error)
      {
         Ö ØÓÖÒ Ö i¹ × ÑÓ Ð Ñ ÒØÓ Ð ØÖ × ÖÓ ½¿
      }

½¿   Ö ØÓÖÒ Ö i¹ × ÑÓ Ð Ñ ÒØÓ Ð ØÖ × ÖÓ ½¿      ≡                      ´½¿ µ
      return rear_item(i);
138                                                                       Cap´
                                                                                  ıtulo 2. Secuencias



          Ò ÐÑ ÒØ ¸ Ø Ò ÑÓ× ÐÓ× Ð × Ó× Ó × ÖÚ ÓÖ ×
½¿   Ó × ÖÚ ÓÖ × ÓÐ Ú ØÓÖ Þ ½¿ ≡                                                        ´½¿ µ
       const size_t & size() const { return num_items; }
       bool is_empty() const { return num_items == 0; }
       const size_t & capacity() const { return dim; }
        Ä ÑÔÐ ÒØ ÓÒ FixedQueue<T> × ÑÙÝ × Ñ Ð Ö                          ArrayQueue<T>º           Ä ÙÒ
        Ö Ò × Ö ÕÙ FixedQueue<T> ÒÓ Ú Ö ¬ × ÓÖ ×º

     2.6.5    El TAD ListQueue<T> (cola con listas enlazadas)
      Ð Ì ListQueue<T> ÑÓ Ð Þ ÙÒ ÓÐ ÑÔÐ ÒØ     Ñ ÒØ ÙÒ Ð ×Ø × ÑÔÐ ¹
     Ñ ÒØ ÒÐ Þ   Ö ÙÐ Öº ListQueue<T> ר ×Ô ¬ Ó ÑÔÐ ÒØ Ó Ò Ð Ö ÚÓ
     ØÔÐ Ð ×ØÉÙ Ù ºÀ ½¿
½¿   ØÔÐ Ð ×ØÉÙ Ù ºÀ ½¿        ≡
           template <typename T>
       class ListQueue
       {
          ÆÓ      ListQueue<T> ½¿
           ØÖ ÙØÓ× ListQueue<T> ½¿
          Å ØÓ Ó× ÔÙ Ð Ó× ListQueue<T>              ½¿
       };
       ¬Ò ×
       ListQueue¸   Ù×   Ò ÙÒ × ½¿ Ò ½ ¼ º
        Ä × ÓÔ Ö ÓÒ ×              ListQueue<T> ×        ×Ô ¬ Ò Ò ÙÒ ÓÒ               ÒÓ Ó× × ÑÔÐ ×    Ø ÔÓ
     ListQueue<T>::Node
½¿   ÆÓ         ListQueue<T> ½¿ ≡                                                       ´½¿ µ
           typedef Snode<T> Node;
           typedef ListQueue Set_Type;
           typedef Node * Item_Type;
     Í× × ListQueue ½¿     Ò   Snode   ½ º
        Ä Ð ×Ø ר ÓÖ Ò Ó× × Ð          Þ ×Ø Ð ÓÐ º       ר ÑÓ Ó¸¸ Ñ ÒØ Ò Ò Ó ÙÒ
     ÔÙÒØ ÖÓ Ô Ö Ð ÓÐ ¸ ÔÓ ÑÓ× Ð Ñ Ò Ö Ò Ø ÑÔÓ ÓÒר ÒØ º Ä ¬ ÙÖ ¾º¾ ÑÙ ×ØÖ ÙÒ
      ×ÔÓ× ÓÒ ÓÐ ÑÔÐ ÒØ Ñ ÒØ Ð ÞÓ× × ÑÔÐ × Ø ÔÓ Snode<T>º
        Ä ÓÒ¬ ÙÖ ÓÒ Ð ¬ ÙÖ ¾º¾ × Ò Ö Ð ×ÓÐÓ Ù Ò Ó Ð Ð ×Ø ÒÓ ×Ø Ú º ×
     Ò Ú Ø Ð ¸ Ô٠׸ Ø Ò Ö ÕÙ Ñ Ò Ö Ó× ×Ó× ÙÒÓ Ò Ö Ð Ý ÙÒÓ Ù Ò Ó Ð ÓÐ ×Ø Ú º
           ÓÖ ÔÓ ÑÓ× ÓÑ ÒÞ Ö ÒØÖÓ Ù Ö ÐÓ× ØÖ ÙØÓ× ListQueue<T>
½¿     ØÖ ÙØÓ× ListQueue<T> ½¿ ≡                           ´½¿ µ ½¿
       Node * rear_ptr;
     rear ptr × Ö Ð ÔÙÒØ ÖÓ Ð ÓÐ Ö ÙÐ Ö   Ð Ñ ÒØÓ×                             Ø ÔÓ   Snode<T>º       Ð ÓØÖÓ
      ØÖ ÙØÓ × Ð ÒÙÑ ÖÓ Ð Ñ ÒØÓ× ÕÙ ÔÓ× Ð ÓÐ
½¿     ØÖ ÙØÓ× ListQueue<T> ½¿ +≡                                          ´½¿ µ ½¿
       size_t num_nodes;
     ÄÓ× Ú ÐÓÖ × ÒØ Ö ÓÖ × Ö ÕÙ Ö Ò × Ö Ò                Ó× ÔÓÖ Ð ÓÒרÖÙ ØÓÖ
½¿    Å ØÓ Ó× ÔÙ Ð Ó× ListQueue<T> ½¿               ≡                          ´½¿ µ ½¿
       ListQueue() : rear_ptr(NULL), num_nodes(0) { /* empty */ }
     Í× × ListQueue ½¿ º
2.6. Colas                                                                                      139



                                                               T:class
                                             ListQueue
                                     -rear_ptr: Node *
                                     -num_nodes: size_t
                                     +ListQueue()
                                     +put(node:Node *): void
                                     +get(): Node*
                                     +front(): Node*
                                     +rear(): Node*
                                     +size(): size_t
                                     +is_empty(): bool




                                                                T:class
                                           DynListQueue
                                    -Node: ListQueue<T>::Node
                                    +put(data:const T&): T&
                                    +get(): T
                                    +front(): T&
                                    +rear(): T&
                                    +~DynListQueue(): virtual


                  ÙÖ ¾º¾           Ö Ñ ÍÅÄ         Ð × Ð × × Ú Ò ÙÐ       ×       ListQueue<T>


                    rear ptr


                               ½               ¾                  ¿



                           ÙÖ ¾º¾        ÓÐ ÑÔÐ ÒØ         Ñ      ÒØ     Snode<T>


        Ì Ò ÑÓ× Ó× ÑÓ Ó×             ×   Ö × ÙÒ       ÓÐ    ר Ú              ×   rear ptr == NULL   Ó×
     num nodes == 0º
       Ä Ò× Ö ÓÒ ÔÓ× Ð × Ù ÒØ רÖÙ ØÙÖ
½¿   Å ØÓ Ó× ÔÙ Ð Ó× ListQueue<T> ½¿ +≡                               ´½¿ µ ½¿        ½¿
      void put(Node * node)
      {
        if (num_nodes > 0)
          rear_ptr->insert_next(node);
        num_nodes++;
        rear_ptr = node;
      }
        put() ÒÓ   ×Ô Ö Ò Ò ÙÒ Ü Ô ÓÒ ÔÓÖÕÙ ÒÓ Ý Ñ Ò Ó Ñ ÑÓÖ º × ÑÔÓ× Ð
     ÕÙ  put() Ö    × × Ð ÒÓ Ó Ù ÓÖÖ Ø Ñ ÒØ Ô ÖØ Óº
        Ä Ð Ñ Ò ÓÒ × ÙÒ ÔÓ Ó Ñ × ÓÑÔÐ       ÔÓÖÕÙ     Ú Ö ¬ Ö × ÓÖ Ò Ø ÚÓ Ý
     ÕÙ Ð ÓÐ Ú Ò Ú
½¿    Å ØÓ Ó× ÔÙ Ð Ó× ListQueue<T> ½¿ +≡           ´½¿ µ ½¿ ½ ¼
140                                                      Cap´
                                                                 ıtulo 2. Secuencias



      Node * get()
        Node * ret_val = rear_ptr->remove_next();
        num_nodes--;
        if (num_nodes == 0)
          rear_ptr = NULL;
        return ret_val;
      }
       Ä ÓÒ×ÙÐØ ×        ¬Ò       Ó× ÓÖÑ ×
½¼   Å ØÓ Ó× ÔÙ Ð Ó×   ListQueue<T>    ½¿ +≡                  ´½¿ µ ½¿
      Node * front() const
      {
        return rear_ptr->get_next();
      }
      Node * rear() const
      {
        return rear_ptr;
      }
     front()   Ö ØÓÖÒ Ð ÒÓ Ó ÔÓÖ Ð Ö ÒØ Ý rear() Ð ÒÓ Ó ÔÓÖ Ð ÓÐ º

     2.6.6     El TAD DynListQueue<T> (cola din´mica con listas enlazadas)
                                               a
       Ð Ì DynListQueue<T> ÑÓ Ð Þ ÙÒ ÓÐ ÑÔÐ ÒØ                ØÖ Ú × ÙÒ Ð ×Ø × ÑÔÐ ¹
     Ñ ÒØ ÒÐ Þ       Ö ÙÐ Öº DynListQueue<T> ר ×Ô ¬ Ó ÑÔÐ ÒØ Ó Ò Ð Ö ÚÓ
      ØÔÐ ÝÒÄ ×ØÉÙ Ù ºÀ ½ ¼ º
         DynListQueue<T> Ö           Ô ÖØ Ð ÒØ Ö Þ ÑÔÐ ÒØ ÓÒ ListQueue<T>º Ð
     ÙÒ Ó ÖÓÐ DynListQueue<T> × Ñ Ò Ö Ð Ñ ÑÓÖ Ý Ñ Ò ÔÙÐ Ö ØÓ× ÙÒ Ø ÔÓ
        Ò Ö Ó T Ò ÐÙ Ö ÒÓ Ó× ÙÒ Ð ×Ø ÒÐ Þ º ÈÙ ×ØÓ ÕÙ ×Ø ÔÖÓ ×Ó Ý ÐÓ ÑÓ×
     Ö Ð Þ Ó Ô Ö Ð × Ð ×Ø × Ý Ð × Ô Ð ×¸ ÓÐÓ Ö ÑÓ× Ò ×Ø × ÓÒ ØÓ Ð ÑÔÐ ÒØ ÓÒ Ö Ø
       DynListQueue<T>
½¼   ØÔÐ ÝÒÄ ×ØÉÙ Ù ºÀ ½ ¼    ≡
          template <typename T>
      class DynListQueue : public ListQueue<T>
      {
        typedef typename ListQueue<T>::Node Node;
        T & put(const T & data) throw(std::exception, std::bad_alloc)
        {
          Node * ptr = new Node (data);
          ListQueue<T>::put(ptr);
          return ptr->get_data();
        }
        T get() throw(std::exception, std::underflow_error)
        {
          Node * ptr = ListQueue<T>::get();
          T ret_val = ptr->get_data();
          delete ptr;
          return ret_val;
        }
        T & front() const throw(std::exception, std::underflow_error)
        {
2.7. Estructuras de datos combinadas - Multilistas                                 141



      return ListQueue<T>::front()->get_data();
    }
    T & rear() const throw(std::exception, std::underflow_error)
    {
      return ListQueue<T>::rear()->get_data();
    }
    virtual ~DynListQueue()
    {
      while (not this->is_empty())
        get();
    }
  };
  ¬Ò ×
  DynListQueue¸ Ù×       Ò ÙÒ × ½ ¸ ¾ ¸ ¿¼ ¸ ¾¸ ¿¸ ¿¾¸ ¿¿ ¸   ¸ Ò      º
Í× × ListQueue ½¿    º


2.7      Estructuras de datos combinadas - Multilistas
   ÓÒ× Ö ÑÓ× ÙÒ Ð ×Ø        ×ØÙ ÒØ × ÙÒ ÙÖ×Ó ×ØÖÙ ØÙÖ              ØÓ׺ ÄÓ× ÒÓÑ Ö ×¸
  Ô ÐÐ Ó× Ý ÙÐ         ÒØ      ÔÙ Ò Ö ÔÖ × ÒØ Ö× Ñ ÒØ         Ò×        Ö Ø Ö ×º Ä ×
ÒÓØ × ÔÙ Ò Ö ÔÖ × ÒØ Ö× Ñ ÒØ ÒØ ÖÓ׺ ÌÓ ×Ø Ò ÓÖÑ ÓÒ Ð ×ØÖÙ ØÙÖ ÑÓ×
  Ò ÙÒ Ö ×ØÖÓ Ý Ù× ÑÓ× ÙÒ ÖÖ ÐÓ Ö ×ØÖÓ× Ô Ö Ö ÔÖ × ÒØ Ö Ð Ð ×Ø º ר Ñ Ò Ö
ÓÖ Ò Þ Ö ÐÓ× ØÓ׸ ÕÙ ÔÓ× Ð Ñ ÒØ Ý ÒÓ× × Ò ØÙÖ Ð ¸ × ÙÒ ÑÔÐÓ ÓÑ Ò ÓÒ ×
  ÒØÖ Ú Ö× × ×ØÖÙ ØÙÖ ×        ØÓ׺
     Ë ÙÒ ÐÓ× Ö ÕÙ Ö Ñ ÒØÓ× Ð ÔÖÓ Ð Ñ ¸ ÙÒ × Ù Ò        Ð Ñ ÒØÓ× ÔÙ Ö ÔÖ × ÒØ Ö×
  ÓÑÓ ÙÒ ÖÖ ÐÓ Ó ÓÑÓ ÙÒ Ð ×Ø º ÓÑÙÒÑ ÒØ ¸ ÙÒ Ñ ØÖ Þ × Ö ÔÖ × ÒØ ÓÑÓ ÙÒ ÖÖ ÐÓ
      ÖÖ ÐÓ׺ ÈÓ ÑÓ×       Ö ÐÓ Ñ ×ÑÓ ÓÒ Ð ×Ø × × Ö¸ ÔÓ ÑÓ× Ø Ò Ö ÙÒ Ð ×Ø
Ð ×Ø × Ó ÖÖ ÐÓ Ð ×Ø × Ó ÙÒ Ð ×Ø           ÖÖ ÐÓ× Ä × Ö ×ÔÙ ×Ø × ×ÓÒ ¬ÖÑ Ø Ú ×º
       ÒÐÒ Ù      ¸ ÙÒ Ñ ØÖ Þ × Ö ÔÖ × ÒØ Ñ ÒØ ÙÒ ÖÖ ÐÓ ¬Ð ׸ ÓÒ                 ¬Ð
  ׸ Ø Ñ Ò¸ ÙÒ ÖÖ ÐÓº × Ô٠׸ ÔÓ Ö ÑÓ× Ð Ö Ö ÐÓ × Ù ÒØ
         DynSlist<int> mat[5];

    ÕÙ Ø Ò ÑÓ× ÙÒ ÖÖ ÐÓ Ð ×Ø × ÓÒ                  mat[i]   Ö¬Ö     ÙÒ Ð ×Ø ÒÐ Þ   º
   Ì Ñ Ò ÔÓ Ö ÑÓ× Ð Ö Ö
         typedef int Arreglo[5];

         DynSlist<Arreglo> mat;

   ÄÓ ÕÙ ÒÓ× ¬Ò ÙÒ Ð ×Ø ÒÐ Þ                   ÖÖ ÐÓ×     Ñ Ò× ÓÒ 5º
   Á Ù ÐÑ ÒØ ¸ ÔÓ ÑÓ× Ð Ö Ö
         DynSlist< DynSlist<int> > mat;


   Ô Ö ¬Ò Ö ÙÒ Ð ×Ø Ð ×Ø ׺
   ÄÓ× ÑÔÐÓ× ÒØ Ö ÓÖ × ÔÙ Ò ÑÓ Ð Þ Ö× Ô ÖØ Ö Ì ÓÒÓ Ó׺ × ÔÓ× Ð ÕÙ
Ø Ò ÑÓ× ÕÙ    Ö Ò Ú Ð Ý Ñ Ò Ö Ö Ø Ñ ÒØ Ð × Ð ×Ø ׺ ÓÑÓ ÑÔÐÓ¸ ÓÒ× Ö
ÙÒ ÔÐ ÓÒ ÕÙ Ñ Ò ÔÙÐ Ñ ØÖ × ÑÙÝ ÐØ × Ð ¸ Ð ÓÖ Ò Ñ ÐÐÓÒ × ¬Ð × Ý
142                                                         Cap´
                                                               ıtulo 2. Secuencias



 ÓÐÙÑÒ ×º Ì Ð × ÔÐ ÓÒ × ×ÓÒ ÓÑÙÒ × Ò ÔÖÓ Ð Ñ × ÔÖÓ Ö Ñ ÓÒ Ð Ò Ð Ý ÒØ Ö
   Ð Ú Ö Ðº Ä × Ð         ר × Ñ ØÖ × ÓØ Ð Ñ ÑÓÖ      Ù ÐÕÙ Ö ÓÑÔÙØ ÓÖº
     ר Ð ÖÓ ÕÙ ÒÓ Ø Ò ÑÓ× ×Ô Ó Ô Ö ÐÑ Ò Ö ÙÒ Ñ ØÖ Þ      ÐÐÓÒ × Ð Ñ ÒØÓ×
   Ó Ð Ö ÔÖ × ÒØ ÓÒ Ð × º ÑÔ ÖÓ¸ ÙÒÕÙ Ð × Ñ ØÖ × ×ÓÒ ÒÓÖÑ ×¸ Ð Ñ ÝÓÖ
   Ð × Ú × ×Ø × ÔÓ× Ò ÑÙ × ÑÓ× Ð Ñ ÒØÓ× ÒÙÐÓ׺ ÈÓ ÑÓ׸ Ô٠׸ ÔÐ Ö Ð Ñ ×ÑÓ
ÔÖ Ò Ô Ó ÕÙ Ò ÐÓ× ÔÓÐ ÒÓÑ Ó× ×ÓÐÓ Ù Ö ÑÓ× ÐÓ× Ð Ñ ÒØÓ× Ö ÒØ ×     ÖÓº Ó
 ר Ð Ò Ñ ÒØÓ¸ Ñ Ò ÑÓ× Ð × Ù ÒØ Ø ÔÓ ×Ô Ð ÒÓ Ó
                                   i j ØÓ
                                                 ÈÙÒØ ÖÓ Ð ÔÖÓÜ Ñ    ÓÐÙÑÒ

                                   ÈÙÒØ ÖÓ Ð ÔÖÓÜ Ñ ¬Ð

ÕÙ ÒÓ× Ö ÔÖ × ÒØ ÙÒ ÒØÖ      ÙÒ Ñ ØÖ Þ mat[i, j] ÓÒ ÐÓ× × Ù ÒØ × ØÖ ÙØÓ×
   ¯ ÁÒ       ¬Ð × Ö Ð Ú ÐÓÖ iº
   ¯ ÁÒ        ÓÐÙÑÒ × Ö Ð Ú ÐÓÖ jºº
   ¯ Î ÐÓÖ   Ð ØÓ Ö ÒØ       ÖÓ ÓÒØ Ò Ó Ò mat[i, j]º
   ¯ ÈÙÒØ ÖÓ Ð × Ù ÒØ mat[i + x, j] ÓÒ Ú ÐÓÖ   Ö ÒØ      ÖÓº
   ¯ ÈÙÒØ ÖÓ Ð × Ù ÒØ mat[i, j + y] ÓÒ Ú ÐÓÖ   Ö ÒØ      ÖÓº
    ר Ñ Ò Ö ¸ Ð Ñ ØÖ Þ    ⎛                 ⎞
                               1 −5 0 0 10
                              ⎜0 0 1 −2 0 ⎟
                              ⎜           ⎟
                              ⎜           ⎟
                              ⎜0 0 0 1  0⎟ ,
                              ⎜           ⎟
                              ⎝0 0 0 0  0⎠
                               0 0 0 1  0
ÔÙ      Ö ÔÖ × ÒØ Ö× ÓÑÓ Ò Ð ¬ ÙÖ ¾º¾ º
       ÓÑÓ Ú ÑÓ× Ò Ð ¬ ÙÖ ¾º¾ ¸ Ø Ò ÑÓ× 5 Ð ×Ø × ¬Ð × Ý 5 Ð ×Ø × ÓÐÙÑÒ ×º
Ð ×Ø ÔÓ× ÙÒ ÒÓ Ó            Ö ¸ Р٠и Ô Ö Ñ ÓÖ Ö Ð Ö Ô Þ         ×Ó¸ ÓÒÚ Ò ÓÐÓ Ö
  Ò ÙÒ ÖÖ ÐÓº × Ô٠׸ Ø Ò Ö ÑÓ× ÙÒ ÖÖ ÐÓ 5                Ö × Ô Ö Ð × ¬Ð × Ý ÓØÖÓ 5
        Ö × Ô Ö Ð × ÓÐÙÑÒ ×º
         Ó ÙÒ ÒÓ Ó Ù ÐÕÙ Ö ¸ Ð Ð Ñ ÒØÓ        Ð Ö        Ò Ð ÔÖÓÜ Ñ ÒØÖ           ÒÐ
Ñ ×Ñ ¬Ð ÓÒ ÙÒ Ú ÐÓÖ Ö ÒØ 0 Ð ÓÐÙÑÒ × Ú Ö Ù ÔÓÖ Ð Ò                         Ð ÓÐÙÑÒ º
    Ð Ñ ×ÑÓ ÑÓ Ó¸ Ð Ð Ñ ÒØÓ              Ó Ò Ð ÔÖÓÜ Ñ ÒØÖ         Ò Ð Ñ ×Ñ ÓÐÙÑÒ
  ÓÒ ÙÒ Ú ÐÓÖ Ö ÒØ           ÖÓ Ð ¬Ð × Ú Ö Ù ÔÓÖ Ð Ò             Ð ¬Ð º
     Ä Ö ÔÖ × ÒØ ÓÒ Ð ¬ ÙÖ ¾º¾ Ö ÓÑÔ Ò× ÓÒ Ö × × Ð ÒÙÑ ÖÓ                      ÒØÖ ×
ÒÙÐ × × ÑÙÝ Ö Ò º ÈÓÖ ÑÔÐÓ¸ ÙÒ Ñ ØÖ Þ 104x104 Ó ÙÔ Ö 400 × 106 ÝØ × Ò ÙÒ
  ÖÕÙ Ø ØÙÖ 32 Ø×º Ë ÙÒ 4± ÐÓ× Ð Ñ ÒØÓ× ×ÓÒ Ö ÒØ ×                 ÖÓ¸ ÕÙ Ö ÔÖ × ÒØ Ò
4 Ñ ÐÐÓÒ ×       Ð Ñ ÒØÓ׸ Ð Ö ÔÖ × ÒØ ÓÒ ÓÒ ÑÙÐØ Ð ×Ø × Ó ÙÔ Ö (4 + 4 + 4 + 4 + 4) ×
0, 04 × 100×6 = 80 × 106 ÝØ ׺
     Ä ×ÙÑ ¸ Ö ×Ø Ý Ú × ÓÒ Ñ ØÖ × ×ÓÒ Ð × ÔÖÓ Ö Ñ Ö ÓÒ Ñ ØÖ × × ×
  Ò Ð ×ØÖÙ ØÙÖ Ð ¬ ÙÖ ¾º¾ º È Ö ÓØÖ × ÓÔ Ö ÓÒ × ÔÙ × Ö Ñ × ÓÒÚ Ò ÒØ Ø Ò Ö
Ð ÞÓ× Ð ¬Ð Ý Ð ÓÐÙÑÒ ÔÖ              ×ÓÖ ×º
       Ð Ð ÓÖ ØÑÓ Ò Ó Ô Ö ÑÙÐØ ÔÐ Ö Ñ ØÖ × n × n × Ù Óº ×ØÓ × Ò ¬ ÕÙ ×Ù
Ø ÑÔÓ           Ù ÓÒ × ÔÖÓÔÓÖ ÓÒ Ð n3º ÓÒ Ñ ÐÐÓÒ × ÓÐÙÑÒ × Ý ¬Ð ׸ ÒÓ Ý ÑÙ ×
2.8. Notas bibliogr´ficas
                   a                                                                143


                0            1            2               3               4




 0            0 0   1      0 1   −5                                     0 4    10




 1                                      1 2   1         1 3    −2




 2                                                      2 3     1




 3




 4                                                      4 3     1




           ÙÖ ¾º¾ ÍÒ Ñ ØÖ Þ ×Ô Ö        Ö ÔÖ × ÒØ   Ñ         ÒØ ÑÙÐØ Ð ×Ø ×

 ×Ô Ö ÒÞ × Ó Ø Ò Ö ÙÒ Ù Ò × ÑÔ ÒÓ × × Ó ÑÓ× Ð Ö ÔÖ × ÒØ ÓÒ × Ù Ò Ðº ËÓ Ö
Ñ ØÖ × ×Ô Ö × Ö ÔÖ × ÒØ × ÓÒ ÑÙÐØ Ð ×Ø × Ð Ø ÑÔÓ × ÑÙ Ó Ñ ÒÓÖ¸ ÔÙ × Ð ×
 ÒØÖ × Ð × Ñ ØÖ × ×ÓÒ Ú × Ø × Ò Ð Ñ ×ÑÓ ÓÖ Ò Ð × Ð ×Ø × Ý ÒÓ Ý Ò ×
    Ò× ÖØ Ö ÖÓ× Ò Ð Ñ ØÖ Þ Ö ×ÙÐØ Óº Ò ¬Ò Ø Ú ¸ Ð ÙÖ ÓÒ Ô Ò     Ð ÒØ
    Ð Ñ ÒØÓ× Ö ÒØ ×       ÖÓº

2.8   Notas bibliogr´ficas
                    a
ÄÓ× ÓÖ Ò × Ð × ×ØÖÙ ØÙÖ × × × × Ö ÑÓÒØ Ò Ñ             Ó× ÐÓ× ÒÓ× ¿¼ Ð × ÐÓ
  ÙÖ ÒØ ÐÓ× × ÖÖÓÐÐÓ× ÔÖÓ Ö Ñ × Ô Ö ÐÓ× ÔÖ Ñ ÖÓ× ÓÑÔÙØ ÓÖ ×º ר ÔÓ ×
ØÒ Ö Ò         ר Ö ØÓÖ¸ ÕÙ ×Ø ÒÓ × × ÒØ ÙØÓÖ Þ Ó Ô Ö Ó Ö Ö ÙÒ × ÙÖ×Ó
  רÓÖ Ó ×Ó Ö Ð ÓÖ Ò Ð × ×ØÖÙ ØÙÖ ×         ØÓ× ÕÙ Ö ÔÖ × ÒØ Ò × Ù Ò × Ò Ð ÙÒ ×
   Ð ×Ø Ò ×       Ù×ÕÙ ØÖ Ø × Ò ×Ø Ô ØÙÐÓº È Ö ÙÒ ÖÑÓ×Ó Ô ÒÓÖ Ñ              ר
 Ô × ÓÒ ÒØ רÓÖ ¸ × Ö ØÓ ÔÓÖ ÙÒÓ ×Ù× ÔÖÓØ ÓÒ ×Ø ׸ Ö Ø Ö ÑÓ× Ö ÓÑ Ò Ö Ð × ÓÒ
  רÓÖ ÓÒØ Ò Ò Ð ÔÖ Ñ Ö ÚÓÐÙÑ Ò ÃÒÙØ               ´Ô Ò × ¹ µº
    ÈÓÖ ×Ù Ö Ø Ö × Ù Ò Ð ÒÒ ØÓ ¸ Ð ÒÓ ÓÒ             ÖÖ ÐÓ Ù Ñ Ò         × ÐÓ×
ÔÖ Ñ ÖÓ× ÔÖÓ Ö Ñ × ÓÑÔÙØ ÓÖº Ò Ò ÙÖ ¸ Ð ÖÖ ÐÓ Ø Ò ×Ù ÕÙ Ú Ð ÒØ Ú ¹
ØÓÖ Ò Ñ Ø Ñ Ø º ÈÓÖ ÐÓ ÒØ Ö ÓÖ¸ × Ö ÑÙÝ Ú ÒØÙÖ Ó Ù Ö Ð ÙÒ ÙØÓÖ Ü ÐÙ¹
× Ú º ÑÔ ÖÓ¸       × Ò Ð Ö Ð ÓÖØÖ Ò ¾ ÓÑÓ Ð ÔÖ Ñ Ö Ð Ò Ù         ÔÖÓ Ö Ñ ÓÒ Ý Ð
ÔÖ Ñ ÖÓ Ò ×ÓÔÓÖØ Ö ÖÖ ÐÓ× ØÖ Ú × Ð ÔÖÓÔ Ó Ð Ò Ù º
     Ð Ò ÓÕÙ       × ÒÓ Ð Ö ÖÕÙ          Ð × × Dlink ר ÔÖ Ñ Ò Ñ ÒØ Ò×Ô Ö Ó
 Ò ÙØ Ð Ø Ö Ó× × Ò Ó× Ô Ö Ð Ñ ÖÓ¹ÒÙ Ð Ó Chorus ½ ¸ × ×Ø Ñ ×Ó Ö Ð Ù Ð ×Ø Ö ¹
ØÓÖ Ö Ð ÞÓ ×Ù× ×ØÙ Ó× Ó ØÓÖ Ð ×º Ð ÙÒ × Ð ÓØ × ÔÖÓ Ö Ñ ÓÒ Ù× Ò Ò ÓÕÙ ×
144                                                            Cap´
                                                                  ıtulo 2. Secuencias



× Ñ Ð Ö ×¸ ÒØÖ Ð × Ù Ð ×              ר Ö net.datastructures Ö ÔÓÖØ        Ò º
        Ò Ð Ñ ×ÑÓ × ÒØ Ó ÐÓ ÖÖ ÐÓ׸ Ð × Ð ×Ø × ÒÐ Þ × Ù ÖÓÒ × Ù ÖØ × Ò ¹
Ô Ò ÒØ Ý × Ô Ö Ñ ÒØ Ò ÐÓ× ÔÖ Ñ Ò Ó× Ý Ý Ö ÒÓ× ÓÒØ ÜØÓ× ÓÑÔÙØ ÓÒ Ð ×º
Ë Ò Ñ Ö Ó¸            × Ò Ð Ö Ð ÁÈÄ ´ÁÒ ÓÖÑ Ø ÓÒ ÈÖÓ ×× Ò Ä Ò Ù µ ½¿ ¸ ÓÑÓ Ð ÔÖ Ñ Ö
Ð Ò Ù ÕÙ Ò ÓÖÔÓÖÓ Ð × Ð ×Ø × ÙÒ Ð Ò Ù                  ÔÖÓ Ö Ñ ÓÒº Ä Ð × Ô ØÓÖ Þ ÓÒ
  ÓÒ× ×Ø ÒØ Ö Ø Ò ÙÐÓ× Ô Ö Ö ÔÖ × ÒØ Ö ÐÓÕÙ × Ñ ÑÓÖ Ý ­ × Ô Ö ÐÓ× ÔÙÒ¹
Ø ÖÓ× Ô Ö Ò ÙÒ ÖØ ÙÐÓ Æ Û ÐÐ Ý Ë Û ×Ó Ö ÔÖÓ Ö Ñ ÓÒ ÓÒ ÁÈÄ ½¾ º
      ÄÓ× ÖÖ ÐÓ׸ Ð ×Ø ׸ Ô Ð × Ý ÓÐ × Ý ×ÓÒ Ô ÖØ ÐÓ× Ð Ò Ù × ÑÙÝ ÐØÓ Ò Ú Ð ÑÓ ¹
  ÖÒÓ× ÒØÖ ÐÓ× ÕÙ            × Ò Ð Ö Perl ½ Ý Python ½ º רÓ× Ð Ò Ù × × Ö ÙÒ× Ö Ò
  Ò ÐÓ× Ð Ò Ù × ÐÐ Ñ Ó× × Ö ÔØ Ò ¸ Ø ÖÑ ÒÓ Ñ ÙÖ Ó ÔÓÖ ÂÓ Ò Ãº ÇÙר Ö ÓÙØ ½
  Ò ÙÒ Ð Ö Ý Ú × ÓÒ Ö Ó ÖØ ÙÐÓ Ñ Ò ÓÒ Ó Ò Ð × ÓÒ Ð Ó Ö ¬                       ר Ô ØÙÐÓº
      Ä Ù×ÕÙ          Ò Ö × ÙÒ ÔÖ Ò Ô Ó          Ù×ÕÙ Ñ Ð Ò Ö Ó¸ Р٠и × ÙÒ ÃÒÙØ ¸
× Ö ÑÓÒØ ר Ð Ñ ×Ñ Å ×ÓÔÓØ Ñ ¸ ÔÖ ÙÖ×ÓÖ Ð Ú Ð Þ ÓÒ Ý ÓÝ Ò Ñ × Ö¹
    Ð Ñ ÒØ Ò ÕÙ Ð         Ò ÒÓÑ Ö Ð ÔÖÓÔ Ú Ð Þ ÓÒº ÓÒ×ÙÐØ × Ð ØÖ Ó ×ØÓÖ Ó
       Ó Ö Å ÒÒ Ò Ê Ö Ï Ð Ò Ö ×Ó Ö ÐÓ× ÓÖ Ò × Ð Ù×ÕÙ                           ÒÖ º
        Ô ÖØ ×Ù× Ò ÓØ × ×ØÓÖ ×              × ÙÒ       Ð × Ñ × ×ÓÐ × Ö Ö Ò × ÓÖÑ Ð × Ò
  Ð ÑÔÓ          Ð ÓÖ ØÑÓ× Ý ×ØÖÙ ØÙÖ ×           ØÓ׺ Ä × ×ØÖÙ ØÙÖ × Ð Ò Ð × ×ÓÒ ØÖ Ø ×
     Ñ Ò Ö ÑÙÝ ÓÖÑ Ð Ý ÓÒ ÔÐ ÓÒ × Ö Ð ×º Ä ÔÖ Ñ Ö                      ÓÒ Ù Ö Ø          Ò
ÙÒ ÔÓ Ò ÕÙ Ð ÔÓ Ö ÓÑÔÙØ ÓÒ Ð ÙÒ Ñ ÕÙ Ò ÙÒ Ö ÑÙÝ Ó Ý Ð Ð Ò Ù
  Ò× Ñ Ð ÓÖ Ö Ð ÙÒ ÐØ ÖÒ Ø Ú × Ö Ô Ö ÔÖÓ Ö Ñ Ö ÔÐ ÓÒ × ÐØÓ × ÑÔ ÒÓº
ÈÓÖ ×Ø Ö ÞÓÒ¸ Ð Ø ÜØÓ ÃÒÙØ ÓÒØ Ò ÙÒ ÑÔÐ Ñ                             ØÖÙ Ó× ÙØ Ð Þ Ö ÓÒ
  רÖÙ ØÙÖ × Ð Ò Ð ×º
        Ð Ð × Ó Ý ÒØ ÙÓ Ø ÜØÓ Ï ÖØ ¾½ ¸ Ù × Ö ØÓ ÙÖ ÒØ ÐÓ× ÒÓ× ¼ Ð × ÐÓ º
Ô × Ö ×Ù           ¸ ÓÝ Ò        ר Ø ÜØÓ ÓÒØ ÒÙ ×Ø ÒØ Ú ÒØ Ý ÔÖ × ÒØ ÙÒ ÜÔÓ× ÓÒ
     Ð × ×ØÖÙ ØÙÖ × Ð Ò Ð × ×ÙÔ Ö ÓÖ Ð ÒÓÖÑ º             Ñ ×¸ Ï ÖØ ÓÒ× Ö ÙÒ Ü Ð ÒØ Ý
  ÓÑÔÐ ØÓ Ô ØÙÐÓ Ð Ö ÙÖ× ÓÒº
        Ð Ð ÖÓ Ë Û ½ ¸ ר Ö ÔÐ ØÓ                     Ð ÓÖ ØÑÓ× ÓÒ ×ØÖÙ ØÙÖ × Ð Ò Ð × ÔÓÖ
     ÑÔÐÓ¸ Ð ÓÖ ØÑÓ× ÓÖ Ò Ñ ÒØÓ Ð ×Ø ׺ Ò Ú Ð ÔÖ Ø Ó¸ ר ׸ Ò ÒÙ ×ØÖ ÓÔ Ò ÓÒ¸
Ð Ñ ÓÖ Ö Ö Ò º                  Ñ Ò ÓÒ Ö¸ ÑÔ ÖÓ¸ ÕÙ ÐÓ× Ð ÓÖ ØÑÓ× ÕÙ Ù× Ò ×ØÖÙ ØÙÖ ×
Ð Ò Ð × ×Ø Ò ×ØÖ Ù Ó× ÐÓ Ð Ö Ó Ð Ø ÜØÓ Ò Ô ØÙÐÓ× ÕÙ ÒÓ Ò × Ö Ñ ÒØ ØÖ Ø Ò
      רÖÙ ØÙÖ × Ð Ò Ð ×º
      Ä Û×Ý Ò Ò Ö              ÔÖ × ÒØ Ò Ð ÙÒÓ× ØÖÙ Ó× ÒØ Ö × ÒØ × ÓÒ Ð ×Ø × ÒÐ Þ ×º
      Ä Ø Ò          Ð × ÒØ ÖÑ Ö ¸ ÙØ Ð Þ ÔÓÖ BitArray Ý DynArray<T> Ô Ö ×Ø Ò¹
  Ù Ö ÐÓ× ×Ó× Ð ØÙÖ ÐÓ× × Ö ØÙÖ Ð Ò Ð Þ ÒØ Ò× Ú Ñ ÒØ Ë ÓØØ Å Ý Ö ½¼ º
        Ð ÔÖÓ Ð Ñ ÂÓ× × Ò Ð Ø Ñ ÒØ ØÖ Ø Ó ÔÓÖ Ö Ñ¸ ÃÒÙØ Ý È Ø × Ò                      º
      Ä Ö ØÑ Ø           ÔÓÐ ÒÓÑ Ó× ÜÔÐ          Ò Ü ¾º º½½ × ÑÔÐ Ñ ÒØ × ÖÖÓÐÐ ÔÓÖ
     Ó¸ ÀÓÔ ÖÓ Ø Ý ÍÐÐÑ Ò ½ º ÍÒ ÐØ ÖÒ Ø Ú ÔÙ             Ò ÓÒØÖ Ö× Ò Ð Ø ÜØÓ Ò ÐÓÔ Ó
       ÓÖÑ Ò¸ Ä × Ö×ÓÒ Ý Ê Ú ×Ø º
        Ð Ð ÓÖ ØÑÓ      Ú ÐÙ ÓÒ         ÜÔÖ × ÓÒ × Ò¬ × × ÖÖÓÐÐ Ó Ò Ü ¾º º Ù ØÓÑ Ó
     ÙÒ Ø ÜØÓ ×Ó Ö ÔÖÓ Ö Ñ ÓÒ × ×Ø Ñ × È Ø Ö Ð Ò ÖØ ¿ º ר Ð ÖÓ ×Ø Ø Ò
Ñ ×ØÖ Ð Ý ÓÒ × Ñ ÒØ × Ö ØÓ ÕÙ ÐÓ Ö ÓÑ Ò ÑÓ× ÓÒ Ö × Ô Ö ÙÒ ÒØÖÓ Ù ÓÒ
  Ð ÑÔÓ Ð ÔÖÓ Ö Ñ ÓÒ × ×Ø Ñ ×¸ ÓÑÔ Ð ÓÖ ×¸ Ò× Ñ Ð ÓÖ × Ý Ö ÓÖ ×º
2.9. Ejercicios                                                               145



2.9    Ejercicios
  ½º ÈÓÖ ÕÙ Ð Ù×ÕÙ         Ò Ö ÒÓ         ÙØ Ð Þ Ö× Ô Ö Ð Ñ ÒØÓ× ÓÖ Ò Ó× Ò ÙÒ
      Ö ÚÓ ÐÑ Ò Ó Ò Ñ ÑÓÖ × ÙÒ Ö
  ¾º ÁÑÔÐ ÒØ ÒØ Ö Ñ ÒØ Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð             רÖÙ ØÙÖ       ØÓ× ×ØÙ Ó
      Ò Ü ½º¿ Ñ ÒØ ÖÖ ÐÓ× ×ÓÖ Ò Ó׺
  ¿º ÁÑÔÐ ÒØ ÒØ Ö Ñ ÒØ Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð             רÖÙ ØÙÖ       ØÓ× ×ØÙ Ó
      Ò Ü ½º¿ Ñ ÒØ ÖÖ ÐÓ× ÓÖ Ò Ó׺
   º ÜÔÐ ÕÙ ÓÑÓ × Ð Ñ Ò ×ÑÓ              ×Ó Ö ØÓ ÐÓ× Ð Ñ ÒØÓ× ÙÒ Ñ ØÖ Þº
   º Ò Ò Ö Ð¸ ÜÔÐ ÕÙ ÓÑÓ × Ð Ñ Ò ×ÑÓ                 ×Ó Ö ØÓ ÐÓ× Ð Ñ ÒØÓ× ÙÒ
      ÖÖ ÐÓ n¹ Ñ Ò× ÓÒ Ðº
   º × Ò ÑÔÐ ÒØ ÙÒ Ì ÕÙ ÑÓ Ð ÖÖ ÐÓ× n Ñ Ò× ÓÒ Ð ×º
   º × Ö ÙÒ ÑÔÐ ÒØ ÓÒ ÐÓ Ñ × ¬ ÒØ ÔÓ× Ð Ð ÖÙØ Ò DynArray<T>copy()
     × ÙÒ Ð × Ò     ÓÒ ×     × Ò Ü ¾º½º º¿ ´Ô Ò ¾µº
   º × Ö ÙÒ Ð ÓÖ ØÑÓ ¬ ÒØ ÕÙ           ØÙ Ð Ò× Ö ÓÒ ÓÖ Ò        Ò ÙÒ DynArray<T>º
   º × Ö ÙÒ Ð ÓÖ ØÑÓ ¬ ÒØ ÕÙ                  ØÙ Ð Ð Ñ Ò ÓÒ ÓÖ Ò             Ò ÙÒ
     DynArray<T>º

 ½¼º ËÙÔÓÒ ÙÒ ÔÖÓ ×Ó ÓÒ ÙÒ Ñ ÑÓÖ ØÓØ Ð ×ÔÓÒ Ð                M ÝØ × Ý ÙÒ Ñ Ü ÑÓ
     Ô ÖÑ Ø Ó ÔÓÖ ÙÒ ÐÐ Ñ       new     S ÝØ ׺     ÓÒ× Ö ÙÒ ÖÖ ÐÓ Ò Ñ Ó
      Ð Ñ ÒØÓ× Ø Ñ ÒÓ T º Ë Ð ÓÒ ÐÓ× Ø Ñ ÒÓ×            Ö ØÓÖ Ó¸ × Ñ ÒØÓ Ý ÐÓÕÙ
     ÕÙ Ñ Ü Ñ Ò Ð Ñ Ò× ÓÒ ÙÒ DynArray<T>º
 ½½º × Ö Ð ×Ó Ö Ö         Ð Ñ ØÓ Ó DynArray<T>::cut(l, r)¸ Ð Ù Ð Ð Ö ØÓ Ð
     Ñ ÑÓÖ ÒØÖ [0..l - 1] Ý r+1..dim ´dimµ × Ð Ñ Ò× ÓÒ ØÙ Ð Ð ÖÖ ÐÓº
 ½¾º Ä      Ð ÓØ ALEPH ÑÔÐ ÒØ ÙÒ ÔÖÓØÓØ ÔÓ Ð Ì              Ð     Ð ÓØ stdc++ ÐÐ ¹
     Ñ Ó vector<T>¸ Ð Ù Ð ÜÔÓÖØ ÙÒ ÖÖ ÐÓ Ò Ñ Óº Ð Ø ÔÓ Ò Ù ×Ø ÓÒ × Ò¹
      Ù ÒØÖ Ò Ð Ö ÚÓ Vector.Hº
      ´ µ Ê Ú × Ñ ÒÙ Ó× Ñ ÒØ Ð ÑÔÐ ÒØ ÓÒ Ò Vector.Hº ÈÖÙ Ð ¸ Ù×ÕÙ ÖÖÓÖ ×¸
           Ú ÒØÙ ÐÑ ÒØ ÔÙÖ Ð Ý Ú ÒØÙ ÐÑ ÒØ Ñ ÓÖ ×Ù ¬ Ò º
      ´ µ ÓÑÔ Ö Ö Ø Ñ ÒØ Vector.H ÓÒ ÓØÖ × ÑÔÐ ÒØ ÓÒ × stdc++º
 ½¿º × Ö    ÙÒ Ð ÓÖ ØÑÓ ¬ ÒØ ÕÙ ÒÚ ÖØ ÙÒ ÖÖ ÐÓº ÈÓÖ ÑÔÐÓ¸ Ð ÒÚ ÖØ Ö
    ABCDEFG ×         ÖÖÓ Ö GFEDCBAº
 ½ º × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ð Ñ Ò ÐÓ× Ð Ñ ÒØÓ× ÙÔÐ Ó× ÙÒ ÖÖ ÐÓ ÓÖ Ò Óº
 ½ º × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ð Ñ Ò ÐÓ× Ð Ñ ÒØÓ× ÙÔÐ Ó× ÙÒ ÖÖ ÐÓ ×ÓÖ ¹
    Ò Óº
 ½º     Ó ÙÒ ÖÖ ÐÓ ×ÓÖ Ò Ó n − 1 Ð Ñ ÒØÓ× ÒØ ÖÓ× ÓÑÔÖ Ò Ó× ÒØÖ 1 Ý n¸
     × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÒÓ ÓÒØ Ò     ÐÓ× Ò Ó׸ Ó ×  ÙÒ ×ÓÐ Ô × ¸ ÕÙ
      Ø ÖÑ Ò Ð Ð Ñ ÒØÓ ÐØ ÒØ º ´·µ
146                                                              Cap´
                                                                    ıtulo 2. Secuencias



 ½ º ÓÒ× Ö Ð ÓÔ Ö ÓÒ ÖÓØ ÓÒ ÙÒ ÖÖ ÐÓº ÈÓÖ ÑÔÐÓ¸ ÖÓØ Ö 3 Ú ×                Ð
      ÞÕÙ Ö Ð ÖÖ ÐÓ ABCDEFGHI ÖÖÓ ÓÑÓ Ö ×ÙÐØ Ó DEFGHIABCº × Ò ÙÒ
      Ð ÓÖ ØÑÓ Ò Ö Ð¸ ÕÙ ÒÓ ÓÒØ Ò      ÐÓ× Ò Ó× ´×ÓÐÓ ÐÓ× ÙÒ ×ÓÐ Ô × µ¸
     ÕÙ ÖÓØ m Ú × ÙÒ ÖÖ ÐÓ        Ñ Ò× ÓÒ nº ´··µ
 ½ º ËÙÔÓÒ ÙÒ × Ù Ò S =< s1, s2, . . . sn >º Ä ÓÔ Ö ÓÒ void rotar derecha(S, n)
      ÖÓØ S n ÔÓ× ÓÒ ×        Ð Ö º ÈÓÖ ÑÔÐÓ¸
               rotar derecha(< 1, 2, 3, 4, 5, 6, 7 >, 3) =< 5, 6, 7, 1, 2, 3, 4 >

      ×ÙÑ Ò Ó × Ù Ò × ÑÔÐ ÒØ × ÓÒ Ð ×Ø × Ö ÙÐ Ö × Ó Ð Ñ ÒØ ÒÐ Þ × ÕÙ
    ÙØ Ð Þ Ò ÒÓ Ó     Ö ¸ × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÑÔÐ ÒØ rotar derecha(S, n) Ò
    Ø ÑÔÓ ÔÖÓÔÓÖ ÓÒ Ð Ð Ø Ñ ÒÓ Ð ÖÖ ÐÓ Ý × Ò Ù× Ö ×Ô Ó ÕÙ Ö Þ Ò ÙÒ ÓÒ
       Ð ÖÖ ÐÓº Ò ÓØÖ × Ô Ð Ö ×¸ ÒÓ     Ù× Ö Ð ×Ø × Ó ÖÖ ÐÓ׺
 ½º        ÙÒ     Ò        Ö Ø Ö × ÕÙ ÓÒØ Ò Ô Ð Ö ×¸ ×ÙÔÓÒ ÙÒ ÓÔ Ö ÓÒ
     Ùר ¬ ÓÒ Ð          Ò      Ö Ø Ö × ÙÒ Ñ Ü ÑÓ nº ÈÓÖ Ùר ¬ Ö¸ × ÒØ Ò
    ÕÙ × ÓÐÓÕÙ Ò ØÓ × Ð × Ô Ð Ö × ÔÓ× Ð × Ò Ü Ø Ñ ÒØ n Ö Ø Ö × ÒØ Ö Ð Ò Ó
    ÔÖÓÔÓÖ ÓÒ ÐÑ ÒØ Ð Ò Ó׺ ÈÓÖ ÑÔÐÓ¸ Ð           Ò
             Esta es una prueba de justificaci´n
                                              o

      Ø Ò ÙÒ ÐÓÒ ØÙ      ¿¾ Ö Ø Ö ×º Ë Ùר ¬           ¿¼ Ö Ø Ö ×¸ ÒØÓÒ × Ð Ö ×ÙÐØ Ó
       ×
             Esta   es    una    prueba      de

      × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ùר ¬ÕÙ ÙÒ     Ò     Ö Ø Ö × ÙÒ Ñ Ü ÑÓ n Ñ ÒÓÖ
    ÕÙ Ð ÐÓÒ ØÙ     Ð    Ò º Ð Ð ÓÖ ØÑÓ   Ø Ò Ö Ó× × Ð × Ð     Ò Ùר ¬¹
         ÝÐ     Ò ÜØÖ ÔÓÖ Ð Ö º
 ¾¼º ÓÒ× Ö n Ð Ñ ÒØÓ× ÒØ ÖÓ׸ ÐÑ Ò Ó× Ò ÙÒ ÖÖ ÐÓ¸ ÓÑÔÖ Ò Ó× ÒØÖ 0 Ý
    m, m    nº

      ´ µ Í× Ð Ø ÔÓ BitArray Ô Ö × Ò Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ø ÖÑ Ò Ð ÙÒ Ð Ñ ÒØÓ
            ÐØ ÒØ º
      ´ µ ËÙÔÓÒ ÕÙ m × ×Ù¬ ÒØ Ñ ÒØ Ô ÕÙ ÒÓ Ô Ö ÕÙ ØÓ Ó× ÐÓ× ÒÙÑ ÖÓ× ÕÙ Ô Ò
           Ò Ñ ÑÓÖ º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÓÒרÖÙÝ ÙÒ ÖÖ ÐÓ ÕÙ ÓÒØ Ò ÐÓ×
           Ð Ñ ÒØÓ× ÐØ ÒØ ׺
      ´ µ ËÙÔÓÒ ÕÙ n × ÑÙÝ Ö Ò ¸ Ô ÖÓ ÕÙ Ð ÖÖ ÐÓ ÙÒ                  Ò Ñ ÑÓÖ º
          ËÙÔÓÒ ÓÒ ÓÒ × ÑÙÝ Ö ×ØÖ Ø Ú × Ñ ÑÓÖ ÒÓ × ÔÓ× Ð Ù× Ö ÙÒ ÖÖ ÐÓ
                Ø×¸ Ò Ò Ò Ö Ð Ù ÐÕÙ Ö ÓØÖ ×ØÖÙ ØÙÖ        ØÓº ÑÔ ÖÓ¸ × × ÔÓ× Ð
          ÙØ Ð Þ Ö Ö ÚÓ× Ò ÑÓ Ó ÔÔ Ò × Ö¸ ×ÓÐÓ × ÔÙ Ò× ÖØ Ö Ð ¬Ò Ð Ð
           Ö ÚÓº
             º Í× Ð ÔÖ Ò Ô Ó    Ù×ÕÙ     Ò Ö Ô Ö × Ò Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ø Ö¹
               Ñ Ò Ð ÙÒ Ð Ñ ÒØÓ ÐØ ÒØ º ´···µ
             º Í× Ð ÔÖ Ò Ô Ó    Ù×ÕÙ     Ò Ö Ô Ö × Ò Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÓÒ×¹
               ØÖÙÝ ÙÒ Ö ÚÓ ÓÒ ÐÓ× ÒÙÑ ÖÓ× ÐØ ÒØ ׺ ´· ¹ÐÙ Ó Ö ×ÓÐÚ Ö ÒØ Ö ÓÖ¹µ
2.9. Ejercicios                                                                147



 ¾½º ÓÒ× Ö Ð × Ð      ÓÒ Ð ØÓÖ       ÙÒ Ð Ñ ÒØÓ ÓÒØ Ò Ó Ò ÙÒ ÖÖ ÐÓ         n     й
    Ñ ÒØÓ× ÒØ ÖÓ׺
      ´ µ × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ × Ó Ð ØÓÖ Ñ ÒØ ÙÒ Ð Ñ ÒØÓ Ð ÖÖ ÐÓº
      ´ µ ËÙÔÓÒ    ÓÖ ÕÙ ÒÓ × ÓÒÓ n Ý ÕÙ Ð ¬Ò Ð Ð ÖÖ ÐÓ ÓÖÖ ×ÔÓÒ ÙÒ
           Ð Ñ ÒØÓ ÒØ Ò Ð ÓÒ Ú ÐÓÖ Ò Ö Ó FINº × Ò ÙÒ Ð ÓÖ ØÑÓ ¬ ÒØ ÕÙ
          × Ð ÓÒ Ð ØÓÖ Ñ ÒØ ÙÒ Ð Ñ ÒØÓ Ð ÖÖ ÐÓº
      ´ µ ÓÖ ×ÙÑ ÕÙ ÐÓ× ÒØ ÖÓ× ×Ø Ò ÐÑ Ò Ó× Ò ÙÒ Ð ×Ø × ÑÔÐ Ñ ÒØ Ò¹
          Ð Þ º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ      ØÙ ÙÒ ×ÓÐ Ô × Ý × Ð ÓÒ Ð ØÓÖ ¹
          Ñ ÒØ ÙÒ Ð Ñ ÒØÓ Ð Ð ×Ø º ´··µ
 ¾¾º ÓÒ× Ö Ð × Ù ÒØ ÔÖÓØÓØ ÔÓ         ÙÒ ÓÒ
     template <typename T> int select(T a[], const size_t & n, const int & i);

      Ð Ù Ð Ö ØÓÖÒ Ð Ò     ¹ × ÑÓ Ñ ÒÓÖ Ð Ñ ÒØÓ Ò Ð ÖÖ ÐÓ ×ÓÖ Ò Ó a[] ÕÙ
      ÓÒØ Ò n Ð Ñ ÒØÓ׺ × Ö ÙÒ ÑÔÐ ÒØ ÓÒ ÕÙ ÒÓ ÑÓ ¬ÕÙ Ð Ô ÖÑÙØ ÓÒ
       Ð ÖÖ ÐÓ Ò ÙØ Ð ÖÖ ÐÓ× ÙÜ Ð Ö ×º ´·µ
 ¾¿º ÜØ Ò Ð Ì DynArray<T> Ô Ö Ñ Ò Ö Ñ ØÖ ׺ ËÙÔÓÒ Ò Ó ÕÙ Ð Ì ×
    ÐÐ Ñ Ó DynMatrix<T>
      ´ µ ÈÙ ÑÔÐ ÒØ Ö× ×Ø Ì     Ô ÖØ Ö Ð Ì DynArray<T>
      ´ µ ÈÙ Ö Ð Þ Ö× ÙÒ ÑÔÐ ÒØ ÓÒ Ò Ô Ò ÒØ Ñ × ¬ ÒØ
      ´ µ ÓÑÓ × Ö Ð ÓÖÑ Ý Ù Ð × Ð × ÙÒ ÓÒ × Ð Ð × ÔÖÓÜÝ ×Ó Ö Ð Ì
          DynMatrix<T>

 ¾ º ÜØ Ò Ð Ì DynArray<T> Ô Ö Ñ Ò Ö ÖÖ ÐÓ× ÑÙÐØ Ñ Ò× ÓÒ Ð ×º
 ¾ º Ä Ñ ÝÓÖ       ÐÓ× Ì ÕÙ Ñ Ò Ò Ð ×Ø × ÒÓ ÙØ Ð Þ Ò Ñ ÑÓÖ º Æ Ò ÙÒÓ ×ØÓ×
     Ì Ú Ö ¬ × Ð Ö ÓÒ ÙÒ Ó ØÓ ÕÙ Ò× ÖØ Ó Ð Ñ Ò × Ú Ð º × Ò ÙÒ
     Ñ ØÓ Ó ÕÙ Ú Ö ¬ÕÙ × ÙÒ Ö ÓÒ Ó ØÓ × Ú Ð º ´·µ
 ¾ º Ò Ð Ñ ×ÑÓ ×Ô Ö ØÙ Ð ÔÖ ÙÒØ ÒØ Ö ÓÖ¸ × Ò ÙÒ Ñ ØÓ Ó ÕÙ ¸ Ñ ×
     Ú Ö ¬ Ö × Ð ÔÙÒØ ÖÓ × Ú Ð Ó¸ Ú Ö ¬ÕÙ ÕÙ Ð Ö ÓÒ ÓÖÖ ×ÔÓÒ             ÙÒ Ó ØÓ
       Ð Ø ÔÓ ×Ô Ö Ó ÔÓÖ Ð ÙÒ ÓÒº ´··µ
 ¾ º ×Ô ¬ÕÙ Ù Ð × ÝÙ × ÔÓ Ö Ó Ö Ö ÙÒ ÓÑÔ Ð ÓÖ Ô Ö              Ð Ø Ö Ð ÑÔÐ ÒØ ÓÒ
       Ò Ö Ñ ÒØ Ð ÓÒÚ Ö× ÓÒ ÙÒ Slink Ð Ö ×ØÖÓ ÕÙ ÐÓ Ò ÐÙÝ º ´···µ
 ¾ º ×Ô ¬ÕÙ Ù Ð × ÝÙ × ÔÓ Ö Ó Ö Ö Ð Ð Ò Ù               ÔÖÓ Ö Ñ ÓÒ Ô Ö ÑÔÐ ÒØ Ö
       Ò Ö Ñ ÒØ Ð ÓÒÚ Ö× ÓÒ ÙÒ Slink Ð Ö ×ØÖÓ ÕÙ ÐÓ Ò ÐÙÝ º ´···µ
 ¾ º × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ù ÒØ Ð ÒÙÑ ÖÓ ÒÓ Ó× Ò ÙÒ Ð ×Ø × ÑÔÐ Ñ ÒØ Ò¹
     ÐÞ º
 ¿¼º ×ØÙ Ý × ÙØ Ð × ÒÓ ÐÓ× Ì Slist<T> Ý DynSlist<T>º                    ÕÙ ÓÖÑ ×
     ÔÙ Ò ÜØ Ò Ö× Ó Ñ ÓÖ Ö×          Ù Ð × ×ÓÒ ×Ù× ÔÖÓ Ð Ñ × ×Ø Ò ÓÑÔÐ ØÓ×
148                                                             Cap´
                                                                   ıtulo 2. Secuencias



 ¿½º ÁÑÔÐ ÒØ ¸ Ò ØÖ Ñ ÒØÓ Ð Ø ÑÔÓ        Ù ÓÒ¸ ÙÒ Ì ÐÐ Ñ Ó Single Link ÕÙ
     Ø Ò Ü Ø Ñ ÒØ ÐÓ× Ñ ×ÑÓ× Ñ ØÓ Ó× ÕÙ Ð Ð × Dlinkº
 ¿¾º × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ù ÒØ Ð ÒÙÑ ÖÓ Ó ÙÖÖ Ò × ÙÒ Ð Ñ ÒØÓ x Ò ÙÒ
     Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ º
 ¿¿º      Ó ÙÒ ÔÙÒØ ÓÖ ptr ÙÒ ÒÓ Ó ÙÒ Ð ×Ø ÒÐ Þ ¸ × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ
        Ø ÖÑ Ò Ð ÔÓ× ÓÒ ÓÖ Ò Ð ptr ÒØÖÓ Ð Ð ×Ø º × Ò ×Ù Ð ÓÖ ØÑÓ Ô Ö
     ÕÙ ÙÒ ÓÒ ÓÒ Ð ×Ø × × ÑÔÐ × Ý Ó Ð ×º
 ¿ º × ÙØ Ö Ú Ñ ÒØ ÐØ ÖÒ Ø Ú × Ô Ö ÑÔÐ ÒØ Ö Ð ×Ù ×ØÖ ÓÒ ÔÓÐ ÒÓÑ Ó׺
 ¿ º × ÙØ Ö Ú Ñ ÒØ ÓÑÓ ÑÔÐ ÒØ Ö ÐÓ× Ð ÓÖ ØÑÓ×        Ú × ÓÒ Ý Ö × ÙÓ ÔÓÐ ¹
     ÒÓÑ Ó׺ Ö Ú ÜÔÖ × ÓÒ × Ð Ø ÑÔÓ         Ù ÓÒº
 ¿ º ÁÑÔÐ ÒØ Ð Ì ÈÓÐ ÒÓÑ Ó¸ ÜÔÐ Ó Ð Ü ¾º º½½ ´Ô Ò ½¼¼µ¸ Ñ ÒØ Ð ×Ø × × Ñ¹
     ÔÐ Ñ ÒØ ÒÐ Þ ×º Í× Ð Ì Snode<T> Ó Slinkº
 ¿ º ÓÒ× Ö Ó× Ð ×Ø × ÒØ ÖÓ× Ó Ð Ñ ÒØ ÒÐ Þ ×¸ Ö ÙÐ Ö ×¸ ÓÒ ÒÓ Ó          Ö¸
        ÒÓÑ Ò × l1 Ý l2¸ Ö ×Ô Ø Ú Ñ ÒØ º
       ÓÒ× Ö Ð ÓÔ Ö ÓÒ
              const bool similar(Dnode<int> & l1, Dnode<int> & l2)

    Ä Ù Ð Ö ØÓÖÒ true × Ð × Ð ×Ø × ÓÒØ Ò Ò Ü Ø Ñ ÒØ ÐÓ× Ñ ×ÑÓ× ÒØ ÖÓ× Ð× ¸
     Ò ×Ó ÓÒØÖ Ö Óº
      × Ö Ð ÓÖ ØÑÓ× ÕÙ ÑÔÐ ÒØ Ò Ð ÓÔ Ö ÓÒ Ô Ö Ð × × Ù ÒØ × × ØÙ ÓÒ ×
     ´ µ Ä × Ó× Ð ×Ø × ×Ø Ò ÓÖ Ò × Ð Ñ ÒÓÖ Ð Ñ ÝÓÖ ÒØ ÖÓº
     ´ µ Ä × Ð ×Ø × ÒÓ ×Ø Ò ÓÖ Ò ×º
 ¿ º × Ò ¸ ÒרÖÙÑ ÒØ          Ò ÓÖÔÓÖ Ð Ì     Slink Ð × ÓÔ Ö ÓÒ ×   Ð Ì
    Dlink insert list()¸ append list() Ý concat listº ´·µ
 ¿ º ÓÒ× Ö Ð × Ù ÒØ ÔÖÓØÓØ ÔÓ ÙÒ ÓÒ
      void permutar_pares(Dlink * lista);

    Ä ÙÒ ÓÒ ØÓÑ                  Ô Ö ÒØÖÓ Ð × Ù Ò         ÐÓ× ÒØ Ö Ñ º ÈÓÖ              ѹ
    ÔÐÓ¸ × l =< 1, 2, 3, 4, 5, 6, 7, 8, 9 >¸ ÒØÓÒ ×¸ ÐÙ Ó permutar pares(l)¸         l =<
    2, 1, 4, 3, 6, 5, 8, 7, 9 >º
      × Ö Ð ÙÒ ÓÒ Ò Ù ×Ø ÓÒº
  ¼º ÓÒ× Ö Ð × Ù ÒØ ÔÖÓØÓØ ÔÓ ÙÒ ÓÒ
      void conmuta_pares(Dlink * l1, Dlink * l2);

      Ä ÙÒ ÓÒ ÒØ Ö Ñ ÐÓ× Ð Ñ ÒØÓ× ÔÓ× ÓÒ Ô Ö l1 ÓÒ ÐÓ× ÔÓ× ÓÒ Ô Ö
          l2º ÈÓÖ      ÑÔÐÓ¸ × l1 =< 1, 2, 3, 4, 5, 6, 7 > Ý l2 =< a, b, c, d, e >¸ ÒØÓÒ ×¸
      ÐÙ Ó conmuta pares(l1, l2) Ð × Ð ×Ø × Ú Ò Ò Ò l1 =< a, 2, c, 4, e, 7 > Ý
      l2 =< 1, b, 3, d, 5 >º
        × Ö Ð ÙÒ ÓÒ Ò Ù ×Ø ÓÒº
2.9. Ejercicios                                                                         149



     ½º × Ö ÙÒ Ð ÓÖ ØÑÓ Ø Ö Ø ÚÓ ÕÙ Ð ÙÐ Ð i¹ × ÑÓ ÒÙÑ ÖÓ                ÓÒ º
     ¾º × Ö ÙÒ Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓ ÕÙ ÓÑÔÙØ Ð i¹ × ÑÓ ÒÙÑ ÖÓ                  ÓÒ Ý ÕÙ
        ÒÓ Ö ÙÒ         Ð ÙÐÓ׺ ´·µ
     ¿º × Ö ÙÒ Ú Ö× ÓÒ Ð Ð ÓÖ ØÑÓ ÓÒ Ô Ð × ÖÖÓÐÐ Ó Ò ¾º º º¾ Ô Ö Ð ÙÐ Ö Ð
        i¹ × ÑÓ ÒÙÑ ÖÓ           ÓÒ ÕÙ ÒÓ Ö ÙÒ Ò Ð ÙÐÓ׺ ´·µ
      º × Ö ÙÒ Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓ ÕÙ ÓÒÚ ÖØ ÙÒ                Ò      Ö Ø Ö × ÕÙ ÓÒØ Ò
        ÙÒ ÒØ ÖÓ ×Ù Ö ÔÖ × ÒØ ÓÒ ÒØ Ö º Ò ÓØÖ × Ô Ð Ö ×¸ × Ö ÙÒ ÖÙØ Ò ÕÙ
         ÓÒÚ ÖØ ÙÒ ÒØ ÖÓ ÐÑ Ò Ó Ò ÙÒ char* ÙÒ ÒØ ÖÓ Ø ÔÓ intº
      º Ò ÙÒ Ø Ð ÖÓ             Ö Þ n × n × ÕÙ ×½ ¸ × × ØÙ ÙÒ      ÐÐÓ Ò Ð × ÓÓÖ Ò ×
        x0, y0º × Ö       ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ò Ù ÒØÖ ¸ × Ü ×Ø ¸ ÙÒ Ö Ù Ö Ñ ÒØÓ ÓÑÔÐ ØÓ Ð
        Ø Ð ÖÓ n2 − 1 ÑÓÚ Ñ ÒØÓ× Ø Ð ÕÙ              × ÕÙ × Ú × Ø Ó Ü Ø Ñ ÒØ ÙÒ
        Ú Þº ´··µ
      º       Ó ÙÒ Ø Ð ÖÓ         Ö Þ 8 × 8 × Õ٠׸ × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÓÐÓÕÙ Ó Ó
        Ö Ò × Ò Ð Ø Ð ÖÓ Ñ Ò Ö Ø Ð ÕÙ Ò Ò ÙÒ Ö Ò ÔÙ                Ñ Ò Þ Ö Ù ÐÕÙ Ö
            Ð × ÓØÖ ×º ´··µ
      º Ê ×Ù ÐÚ Ð ÔÖÓ Ð Ñ ÒØ Ö ÓÖ Ð × Ó Ó Ö Ò × Ô Ö Ò ÓÒØÖ Ö ØÓ × Ð × ×ÓÐÙ ÓÒ ×
             Ö ÒØ ׺ ´·µ
      º El problema del morral
              Ó ÙÒ Ó Ø ÚÓ O Ý ÙÒ ÓÐ ÓÒ Ô ×Ó× P = {p1, p2, . . . , pn, pi} ∈ N ¸ × Ô
           Ø ÖÑ Ò Ö × Ü ×Ø ÙÒ × Ð ÓÒ Ô ×Ó× P ⊂ P Ø Ð ÕÙ ∀p ∈P =)º     i

          ר ÔÖÓ Ð Ñ × ÓÒÓ Ó ÓÑÓ Ð ÔÖÓ Ð Ñ Ð ÑÓÖÖ Ð ÔÓÖÕÙ Ð ÓÖ Þ Ð × ¹
        Ð ÓÒ Ö Ù Ð × Ö × ÐÐ Ú Ö Ò ÙÒ ÑÓÖÖ Ð Ñ Ò Ö Ø Ð ÕÙ ÒÓ × ÔÓÖØ Ñ × O
          ÐÓ Ö ÑÓ׺
        È Ö Ð ÔÖÓ Ð Ñ Ð ÑÓÖÖ Ð
           ´ µ × Ö ÙÒ Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓº
           ´ µ Ð Ñ Ò Ð Ö ÙÖ× ÓÒ Ð Ð ÓÖ ØÑÓ ÒØ Ö ÓÖº
           ´ µ × Ö ÙÒ Ð ÓÖ ØÑÓ Ø Ö Ø ÚÓ ÕÙ ÒÓ ÙØ Ð Ô Ð º ´··µ
      º            ÙÒ     ÓÐ   ÓÒ     Ó ØÓ× S = {s1, s2, . . . , sn, si} ÓÒ Ô ×Ó× P =
       {p1, p2, . . . , pn, pi} ∈ R Ý Ú ÐÓÖ × V = {v1, v2, . . . , vn, vi} ∈ R¸ × Ô Ò ÓÒØÖ Ö
       ÙÒ ×Ù ÓÒ ÙÒØÓ S ⊂ S¸ ÕÙ Ñ Ü Ñ Ð Ú ÐÓÖ ØÓØ Ð ∀s∈S vi Ö ×ØÖ Ò Ó ÙÒ ¹
       Ô                Ô ×Ó× ∀s∈S pi ≤ C × Ö¸ ÕÙ ØÓ Ó× ÐÓ× Ó ØÓ× ÕÙ Ô Ò Ò ÙÒ ÑÓÖÖ Ð
             Ô            Cº
         × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ö ×Ù ÐÚ ×Ø Ú Ö ÒØ Ð ÔÖÓ Ð Ñ Ð ÑÓÖÖ Ðº ´··µ
     ¼º × Ö ÙÒ Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓ ÕÙ Ò Ö Ð × n! Ô ÖÑÙØ ÓÒ × n Ð Ñ ÒØÓ×
       x1, x2, . . . , xn ÓÒ ÙÒ ÓÒ×ÙÑÓ       ×Ô Ó ÓÒר ÒØ ¸ ÕÙ ÒÓ Ö Þ × ÙÒ nº ´··µ
 ½
          ÒÐ   Ö        Ö ×Ø ¸ ÙÒ × ÕÙ × ÙÒÓ   ÐÓ× Ù ÖÓ× Ð Ø Ð ÖÓº
150                                                          Cap´
                                                                ıtulo 2. Secuencias



  ½º Ä ÙÒ ÓÒ          ÖÑ Ò A(m, n) ר     ¬Ò       Ð ÓÖÑ × Ù ÒØ
                              ⎧
                              ⎪n + 1
                              ⎪                        m=0
                              ⎨
                     A(m, n) = A(m − 1, 1)             m > 0, n = 0
                              ⎪
                              ⎪
                              ⎩A(m − 1, A(m, n − 1))   m, n > 0

      ´ µ × Ö ÙÒ ÖÙØ Ò Ö ÙÖ× Ú ÕÙ         Ð ÙÐ Ð ÙÒ    ÓÒ             ÖÑ Òº   ÙÐ ×Ð
          ÓÑÔÐ          Ø ÑÔÓ Ð ÙÒ      ÓÒ ´·µ
      ´ µ × Ö ÙÒ ÙÒ ÓÒ Ø Ö Ø Ú ÕÙ          Ð ÙÐ Ð ÙÒ    ÓÒ            ÖÑ Òº   Ù Ð ×Ð
          ÓÑÔÐ          Ø ÑÔÓ Ð ÙÒ      ÓÒ ´·µ
  ¾º Ë Ò A Ý B Ó× Ð ×Ø × ÒÐ Þ × ÓÖ Ò       ׺ ÓÒ× Ö     Ð Ñ Þ Ð ÓÖ Ò        AÝ
     B¸ ÙÝÓ Ö ×ÙÐØ Ó × ÙÒ Ð ×Ø Ù× ÓÒ     Ý ÓÖ Ò          ÐÓ× ÒÓ Ó× A Ý Bº × Ö
     ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ñ Þ Ð Ó× Ð ×Ø ×
      ´ µ Ë ÑÔÐ Ñ ÒØ ÒÐ Þ ×º
      ´ µ Ó Ð Ñ ÒØ ÒÐ Þ ×º
  ¿º ÁÑÔÐ Ñ ÒØ ÙÒ     Ð ÓØ ÕÙ      ØÙ ØÓ × Ð × Ú Ö ¬ ÓÒ × Ø ÔÓ Ò Ø ÑÔÓ
        Ù ÓÒ Ø Ð ÓÑÓ Ù ÔÐ ÒØ Ó Ò Ö Ó ¾ º ´··µ
   º ÁÑÔÐ ÒØ Ð ÓÒרÖÙ ØÓÖ ÓÔ Ý Ð ÓÔ Ö ÓÖ × Ò ÓÒ Ô Ö Ð Ð × DynArray<T>
       ¬Ò Ò Ü ¾º½º º ´·µ
   º ×Ô ¬ÕÙ ¸ × Ò ÑÔÐ ÒØ ØÓØ ÐÑ ÒØ Ð Ì DynMatrix<T> Ñ Ò ÓÒ Ó Ò Ð
     ÔÖÓ Ð Ñ ¾¿º
   º ×Ò        ÑÔÐ ÒØ ÙÒ Ì ÕÙ Ñ Ò           ÖÖ ÐÓ×        Ø× Ý ÕÙ ÙØ Ð Ð Ì
     DynArray<T>º

   º × Ò ÑÔÐ ÒØ ÙÒ Ì ÕÙ Ñ Ò Ñ ØÖ ×                   Ø×º
   º ÁÑÔÐ ÒØ ÙÒ Ì ÐÐ Ñ Ó DynArrayStack<T>¸ Ð Ù Ð Ñ Ò Ô Ð × ÑÔÐ ÒØ × ÓÒ
      ÖÖ ÐÓ× Ò Ñ Ó׺ Ð ÖÖ ÐÓ        × Ö ÓÒØÖ Ó Ò Ñ Ñ ÒØ º
   º ÁÑÔÐ ÒØ ÙÒ Ì ÐÐ Ñ Ó DynArrayQueue<T>¸ Ð Ù Ð Ñ Ò ÓÐ × ÑÔÐ ÒØ × ÓÒ
      ÖÖ ÐÓ× Ò Ñ Ó׺ Ð ÖÖ ÐÓ        × Ö ÓÒØÖ Ó Ò Ñ Ñ ÒØ º
  ¼º ÁÑÔÐ ÒØ Ð ×Ù ×ØÖ ÓÒ ÔÓÐ ÒÓÑ Ó׺
  ½º ÁÑÔÐ ÒØ Ð Ú × ÓÒ ÔÓÐ ÒÓÑ Ó׺ ´··µ
  ¾º ÁÑÔÐ ÒØ Ð ÓÔ Ö ÓÒ Ö × ÙÓ ÔÖÓ Ù ØÓ Ð Ú × ÓÒ            Ó× ÔÓÐ ÒÓÑ Ó׺ ´··µ
  ¿º ÅÓ ¬ÕÙ Ð Ì Polinomio Ô Ö ÕÙ           ÐÓ× Ø ÖÑ ÒÓ× Ú × Ð × Ð Ù×Ù Ö Ó Ý Ô ÖÑ Ø
           ÖÐÓ× ¬ ÞÑ ÒØ Ñ ÒØ ÙÒ Ø Ö ÓÖº
   º ÁÑÔÐ ÒØ ÙÒ ÙÒ ÓÒ ÕÙ Ð ÙÐ Ð Ö Ú              ÙÒ ÔÓÐ ÒÓÑ Óº
   º ÁÑÔÐ ÒØ ÙÒ ÙÒ ÓÒ ÕÙ Ð ÙÐ Ð ÒØ Ö Ð ÙÒ ÔÓÐ ÒÓÑ Óº
   º ÅÓ ¬ÕÙ Ð Ì ÔÓÐ ÒÓÑ Ó Ô Ö ÕÙ ÙØ Ð Ó ¬ ÒØ × Ò ÔÙÒØÓ ­ÓØ ÒØ º
2.9. Ejercicios                                                                    151



   º ÁÑÔÐ ÒØ ÙÒ ÙÒ ÓÒ ÕÙ Ú ÐÙ ÙÒ ÔÓÐ ÒÓÑ Óº
   º × Ö ÙÒ Ð ÓÖ ØÑÓ ÙÒ ×ÓÐ Ô × ÕÙ Ò Ù ÒØÖ Ð Ñ ÒÓÖ Ð Ñ ÒØÓ ÙÒ
     Ð ×Ø ÒÐ Þ º
   º        ÙÒ Ð ×Ø Ö ÙÐ Ö Ó Ð Ñ ÒØ ÒÐ Þ ¸ × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÓÐÓÕÙ ÐÓ×
     ÒÓ Ó× ÕÙ ×Ø Ò Ò ÔÓ× ÓÒ × ÑÔ Ö × ×ÔÙ × ÐÓ× ÕÙ ×Ø Ò Ò ÔÓ× ÓÒ × Ô Ö ×º
     Ë        ÔÖ × ÖÚ Ö Ð ÓÖ Ò Ö Ð Ø ÚÓ ÒØÖ ÐÓ× ÒÓ Ó׺
  ¼º ÓÒ× Ö Ð Ð Ñ Ò ÓÒ ÐÓ× Ð Ñ ÒØÓ× Ö Ô Ø Ó× ÙÒ Ð ×Ø º × Ò ÙÒ Ð ÓÖ ØÑÓ
     ÕÙ ¬ÐØÖ ÐÓ× Ð Ñ ÒØÓ× Ö Ô Ø Ó× ÙÒ Ð ×Ø º Ê Ð Ô Ö ÐÓ× × Ù ÒØ × ×Ó×
       ´ µ Ä Ð ×Ø × × ÑÔÐ Ñ ÒØ ÒÐ Þ º
      ´ µ Ä Ð ×Ø × Ó Ð Ñ ÒØ ÒÐ Þ º
        Ò Ñ Ó× ×Ó׸ Ð Ö ×ÙÐØ Ó         ÓÑÔÓÒ Ö×        Ó× Ð ×Ø ׺ ÍÒ ÓÖÖ ×ÔÓÒ ÒØ Ð
     ¬ÐØÖ Ó Ð ÓØÖ ÓÖÖ ×ÔÓÒ ÒØ ÐÓ× Ð Ñ ÒØÓ× ×ÙÔÖ Ñ Ó׺
  ½º ËÙÔÓÒ Ó× Ð ×Ø × × ÑÔÐ Ñ ÒØ ÒÐ Þ × A Ý B Ý Ð × ÓÔ Ö ÓÒ × ÙÒ ÓÒ ÒØ Ö¹
     × ÓÒº × Ö Ð ÓÖ ØÑÓ× ÕÙ Ð ÙÐ Ò Ð ÙÒ ÓÒ ÒØ Ö× ÓÒ ×
      ´ µ Ä × Ð ×Ø × ×Ø Ò ÓÖ Ò ×º
      ´ µ Ä × Ð ×Ø × ÒÓ ×Ø Ò ÓÖ Ò ×º
       Ò Ð Ð × ÑÔ ÒÓ          ÙÒÓ ÐÓ× Ð ÓÖ ØÑÓ׺
  ¾º ËÙÔÓÒ Ó× Ð ×Ø × ÒÐ Þ × A Ý Bº ÓÒ× Ö Ð ÓÔ Ö ÓÒ Ù× ÓÒ ÙÝÓ Ö ×ÙÐØ Ó
     × Ö ÙÒ ×ÓÐ Ð ×Ø ÙÝÓ× ÔÖ Ñ ÖÓ× Ð Ñ ÒØÓ× ÓÖÖ ×ÔÓÒ Ò Ð Ð ×Ø A × Ù ÔÓÖ
     ÐÓ× Ð Ñ ÒØÓ× Ð Ð ×Ø Bº × Ö ÙÒ Ð ÓÖ ØÑÓ Ù× ÓÒ Ô Ö            ÙÒÓ ÐÓ×
     × Ù ÒØ × ×Ó×
      ´µ   Ä ×Ø   × × ÑÔÐ × ÒÓ Ö ÙÐ Ö ×º
      ´µ   Ä ×Ø   × × ÑÔÐ × Ö ÙÐ Ö ×º
      ´µ   Ä ×Ø   × Ó Ð × ÒÓ Ö ÙÐ Ö ×º
      ´µ   Ä ×Ø   × Ó Ð × Ö ÙÐ Ö ×º
  ¿º ÓÒ× Ö Ð ÔÖÓ Ð Ñ                  ÒÚ ÖØ Ö ÐÓ× Ð Ñ ÒØÓ× ÙÒ Ð ×Ø Ò ÙÒ ×ÓÐ Ô × ¸
    × Ò Ù× Ö ÙÒ ×ØÖÙ ØÙÖ                ØÓ      ÓÒ Ð Ý × Ò ÓÔ Ö ÐÓ× ÓÒØ Ò Ó× ÐÓ× ÒÓ Ó׺
      × Ö Ð ÓÖ ØÑÓ× Ô Ö
      ´µ   ÍÒ     Ð ×Ø   × ÑÔÐ Ñ ÒØ    ÒÐ Þ º
      ´µ   ÍÒ     Ð ×Ø   × ÑÔÐ Ñ ÒØ    ÒÐ Þ    Ö ÙÐ Öº
      ´µ   ÍÒ     Ð ×Ø     Ó Ð Ñ ÒØ   ÒÐ Þ º ÈÖÓÔÓÒ Ð Ñ ÒÓ× Ó× Ð ÓÖ ØÑÓ׺
      ´µ   ÍÒ     Ð ×Ø     Ó Ð Ñ ÒØ   ÒÐ Þ    Ö ÙÐ Öº ÈÖÓÔÓÒ Ð Ñ ÒÓ× Ó× Ð ÓÖ ØÑÓ׺
   º ËÙÔÓÒ Ð × ØÙ ÓÒ × Ù ÒØ
152                                                        Cap´
                                                              ıtulo 2. Secuencias



       0      1       2      3       4      5        6            7        8       9




      ´ µ ÜÔÐ ÕÙ ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ø ÖÑ Ò × Ð Ð ×Ø Ò Ù ×Ø ÓÒ Ø Ò Ó ÒÓ ÙÒ ÐÓ
         ݸ × Ü ×Ø ÙÒ ÐÓ¸ Ù Ð × Ð ÒÓ Ó ÓÑ ÒÞÓ Ý Ù Ð × ×Ù ÐÓÒ ØÙ º
            × ÙØ Ð × ÑÔ ÒÓ ×Ù Ñ ØÓ Óº
      ´ µ ×ÙÑ ÕÙ × ÑÔÓ× Ð Ñ ÒØ Ò Ö Ð ÙÒ ×ØÖÙ ØÙÖ            ØÓ Ó × Ö Ö ×Ó Ö
         ÐÓ× ÒÓ Ó׺ ËÓÐÓ × ÔÓ× Ð Ð ÙÒ × Ð × Ñ ÑÓÖ º
            º Å Ò ÓÒ Ð ÙÒ × Ò Ö Ó Ö Ð ÓÒ ×Ø × Ö ×ØÖ ÓÒ × × ÔÐ Ö Òº
            º ÓÒ Ð × Ö ×ØÖ ÓÒ ×     ׸ ÜÔÐ ÕÙ ÙÒ Ñ ØÓ Ó ÕÙ Ó ÙÔ ×Ô Ó ÓÒ×¹
              Ø ÒØ Ý ÕÙ Ø ÖÑ Ò × Ü ×Ø ÙÒ ÐÓ¸ Ò Ù Ð ÒÓ Ó Ý Ù ÒØ ÐÓÒ ØÙ º
            º Ù Ð × Ð × ÑÔ ÒÓ Ð Ñ ØÓ Ó ÒØ Ö ÓÖ
  º ÁÑ Ò Ð × Ù ÒØ × ØÙ ÓÒ

                                            x




       Ð ÔÖÓ Ð Ñ ÓÒ× ×Ø Ò Ø ÖÑ Ò Ö Ù Ð × Ð ÒÓ Ó           ÒØ Ö×       ÓÒ¸ Ù ÒØÓ× ÒÓ Ó×
      ÔÖ     Ò x Ò      Ð ×Ø ¸ Ý Ù ÒØÓ× ÒÓ Ó× ×Ù Ò   xº

      ´ µ ËÙÔÓÒ Ò Ó ÕÙ × ÔÙ Ñ Ö Ö Ù ÐÕÙ Ö ÒÓ Ó¸ × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÒÓ
           ÓÒØ Ò     ÐÓ× Ò Ó׺
      ´ µ Ô ÖØ Ö        ÓÖ ×ÙÑ ÕÙ ÒÓ × ÔÙ Ñ Ö Ö Ð ÙÒ ÒÓ Óº × Ò ÙÒ Ð¹
           ÓÖ ØÑÓ Ò Ó × Ó Ò Ó× ÐÓ× Ò Ó׺ Ð Ð ÓÖ ØÑÓ ÔÙ Ó ÙÔ Ö
           ×Ô Ó ÔÖÓÔÓÖ ÓÒ Ð Ð ÒÙÑ ÖÓ ÒÓ Ó׺
      ´ µ × Ò ÙÒ Ð ÓÖ ØÑÓ × Ó Ò Ó× ÐÓ× Ò Ó× ÕÙ Ó ÙÔ ×Ô Ó ÓÒר ÒØ º
      ´ µ × Ò ÙÒ Ð ÓÖ ØÑÓ × Ó Ò ÐÓ× × ÑÔР׸ ÒÓ Ò Ó׸ ÕÙ Ó ÙÔ ×Ô Ó
           ÓÒר ÒØ º
  º ÓÒ× Ö Ð ÓÔ Ö ÓÒ Ô ÖØ ÓÒ ÙÒ Ð ×Ø Ò Ó× Ð ×Ø ×             Ù Ð Ø Ñ ÒÓº Ä
   ÔÖ Ñ Ö Ð ×Ø ÓÖÖ ×ÔÓÒ    ÐÓ× n/2 ÔÖ Ñ ÖÓ× Ð Ñ ÒØÓ× Ð × ÙÒ     ÐÓ× n/2 Ð ¹
   Ñ ÒØÓ× Ö ×Ø ÒØ ׺ × Ö Ð ÓÖ ØÑÓ× × Ó× Ò ÐÓ× × ÑÔÐ × Ô Ö Ô ÖØ ÓÒ Ö
    ´ µ ÍÒ Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ º
    ´ µ ÍÒ Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ      Ö ÙÐ Öº
    ´ µ ÍÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ º
    ´ µ ÍÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ       Ö ÙÐ Öº
2.9. Ejercicios                                                                     153



   º × Ö ÙÒ ÔÖÓ Ñ ÒØÓ Ò Ö Ð¸ × Ó Ò ÐÓ× × ÑÔР׸ ÕÙ          ØÙ ÙÒ m¹
    Ô ÖØ ÓÒº × Ö¸ ×ÔÙ × Ð ÓÔ Ö ÓÒ¸ Ð Ð ×Ø × Ô ÖØ Ò m Ð ×Ø × Ø Ñ ÒÓ
    n/mº

   º × Ö ÙÒ ÔÖÓ Ö Ñ ÕÙ ÑÙ Ú Ð Ñ ÒÓÖ Ð Ñ ÒØÓ ÙÒ Ð ×Ø Ð ÔÖ Ñ Ö ÔÓ× ÓÒº
   º × Ö ÙÒ ÔÖÓ Ö Ñ ÕÙ ÑÙ Ú Ð Ñ ÝÓÖ Ð Ñ ÒØÓ ÙÒ Ð ×Ø Ð ÙÐØ Ñ ÔÓ× ÓÒº
  ¼º Ò × ÐÓ× Ó× Ö Ó× ÔÖ Ú Ó׸ × Ö ÙÒ ÔÖÓ Ö Ñ ÕÙ ÓÖ Ò ÙÒ Ð ×Ø Ó Ð ¹
    Ñ ÒØ ÒÐ Þ º
  ½º × Ò ÑÔÐ ÒØ ÙÒ Ì ÕÙ ÑÓ Ð ÙÒ Ô Ð ÑÔÐ ÒØ          ÓÒ ÖÖ ÐÓ× Ò Ñ Ó׺
      × ÙØ ØÓ × Ð × ÓÔ ÓÒ ×¸ Ú ÒØ × Ý ×Ú ÒØ × ×Ù × ÒÓº
  ¾º × Ò ÑÔÐ ÒØ ÙÒ Ì ÕÙ ÑÓ Ð ÙÒ ÓÐ ÑÔÐ ÒØ           ÓÒ ÖÖ ÐÓ× Ò Ñ Ó׺
      × ÙØ ØÓ × Ð × ÓÔ ÓÒ ×¸ Ú ÒØ × Ý ×Ú ÒØ × ×Ù × ÒÓº
  ¿º ÓÒ× Ö ÙÒ Ð ×Ø Ö ÙÐ Ö ÓÖÑ Ø Ð ÕÙ Ð Ð ×Ø ÔÙ Ö ÓÖÖ Ö× ¬ ÞÑ ÒØ Ò
     Ñ × Ö ÓÒ ×º
      ´ µ ÓÒ× Ö ÙÒ ÙÒ ÓÒ           f(p1, p2) = p3   Ø Ð ÕÙ   f(p1, p3) = p2, f(p2, p3) =
          p1, ∀pi, pj, pk ∈ N , pi = pj = pkº
             Ó ÙÒ ÒÓ Ó ÓÒ ÙÒ ×ÓÐÓ ÑÔÓ Ô Ö ÙÒ Ö ÓÒ Ñ ÑÓÖ ¸ ÜÔÐ ÕÙ ÙÒ
         Ñ ØÓ Ó ÕÙ ÙØ Ð ÙÒ ÙÒ ÓÒ ÓÑÓ Ð ÒØ Ö ÓÖ Ô Ö Ö ÓÖÖ Ö Ð Ð ×Ø Ò ÐÓ× Ó×
         × ÒØ Ó× ÙÒ Ù Ò Ó ÙÒ ÒÓ Ó ÓÒØ Ò ÙÒ ×ÓÐÓ ÔÙÒØ ÓÖº ´··µ
      ´ µ Ò Ù ÒØÖ ÓÔ Ö ÓÒ × ÕÙ ÔÙ Ò Ù× Ö× Ô Ö ÑÔÐ ÒØ Ö Ð ÙÒ ÓÒ f Ð
         ÔÖ ÙÒØ ÒØ Ö ÓÖº ´·µ
      ´ µ Ò × Ð × Ö ×ÔÙ ×Ø × ÒØ Ö ÓÖ ×¸ × Ò ÑÔÐ ÒØ ÙÒ Ì ÕÙ ÑÓ Ð
         ÙÒ Ð ×Ø Ö ÙÐ Ö Ö ÓÖÖ Ð Ò Ñ Ó× × ÒØ Ó× Ý ÕÙ Ù× ÙÒ ×ÓÐÓ ÔÙÒØ ÓÖ ÔÓÖ
         ÒÓ Óº ´··µ
   º ÁÑÔÐ ÒØ ÐÓ× Ñ ØÓ Ó× pushn()¸ popn() Ý empty() ¬Ò Ó× Ò ArrayStack<T>¸
     Ô Ö Ð Ð × ListStack<T>º ÈÓÖ ÕÙ ÒÓ Ò × Ó ÑÔÐ ÒØ Ó× Ö Ø Ñ ÒØ ÒØÖÓ
        Ð Ð×
   º ÜÔÐ ÕÙ ÓÑÓ ÑÔÐ ÒØ Ö ÙÒ Ô Ð Ñ ÒØ Ó× ÓР׺
   º ÜÔÐ ÕÙ ÓÑÓ ÑÔÐ ÒØ Ö ÙÒ ÓÐ Ñ ÒØ Ó× Ô Ð ×º
   º È Ö ÓÒÚ ÖØ Ö ÙÒ ÒÙÑ ÖÓ Ò × ½¼ × Ú ×Ù × Ú Ñ ÒØ ÒØÖ Ó× ×Ø ÕÙ Ð
      Ó ÒØ Ú Ò Ò ÖÓ Ý Ò              Ú × ÓÒ × ÐÑ Ò Ð Ö ×ØÓ¸ Ð Ù Ð × ÙÒ ØÓ
       Ð ÕÙ Ú Ð ÒØ Ò × Ò Ö º
     ÈÓÖ ÑÔÐÓ¸ 3710 ÔÙ      Ð ÙÐ Ö× Ò Ò Ö Ó ÓÑÓ
                                  37 ÑÓ 2 = 1
                                  18 ÑÓ 2 = 0
                                   9 ÑÓ 2 = 1
                                   4 ÑÓ 2 = 0
                                   2 ÑÓ 2 = 0
                                   1 ÑÓ 2 = 1
154                                                           Cap´
                                                                 ıtulo 2. Secuencias



             ר ÑÓ Ó¸ 3710 = 1001012º
         ÁÑÔÐ ÒØ ¸ usando una pila¸ Ð ÖÙØ Ò
                          void imprime2(const int & n);

         Ä Ù Ð ÑÔÖ Ñ Ð ÕÙ Ú Ð ÒØ Ò Ö Ó Ð Ô Ö Ñ ØÖÓ nº
   º     Ê Ð ÙÒ ÔÖÓ Ö Ñ ÕÙ Ú ÐÙ ÙÒ ÜÔÖ × ÓÒ ÔÖ ¬ º
   º     Ê Ð ÙÒ ÔÖÓ Ö Ñ ÕÙ Ú ÐÙ ÙÒ ÜÔÖ × ÓÒ ×Ù¬ º
  ¼º       ÜÔ Ò Ð Ú ÐÙ ÓÖ            ÜÔÖ × ÓÒ × Ò¬ × Ô Ö ÕÙ     ØÙ ÓÔ Ö ÓÒ ×       ÜÔÓ¹
         Ò Ò ÓÒ¸ ØÖ ÓÒÓÑ ØÖ Ý ÐÓ Ö ØÑÓ׺
  ½º     ÅÓ ¬ÕÙ Ð Ú ÐÙ ÓÖ             ÜÔÖ × ÓÒ × Ò¬ × Ô Ö ÕÙ ¸ Ò ÐÙ Ö      Ú ÐÙ Ö Ð Ü¹
         ÔÖ × ÓÒ¸ Ò Ö Ð ÜÔÖ × ÓÒ ×Ù¬ º ÁÒ ÐÙÝ Ð × ÓÔ Ö ÓÒ ×              ÜÔÓÒ Ò ÓÒ¸
         ØÖ ÓÒÓÑ ØÖ Ý ÐÓ Ö ØÑÓ׺
  ¾º     ÅÓ ¬ÕÙ Ð Ú ÐÙ ÓÖ             ÜÔÖ × ÓÒ × Ò¬ × Ô Ö ÕÙ ¸ Ò ÐÙ Ö      Ú ÐÙ Ö Ð Ü¹
         ÔÖ × ÓÒ¸ Ò Ö Ð ÜÔÖ × ÓÒ ÔÖ ¬ º ÁÒ ÐÙÝ Ð × ÓÔ Ö ÓÒ ×             ÜÔÓÒ Ò ÓÒ¸
         ØÖ ÓÒÓÑ ØÖ Ý ÐÓ Ö ØÑÓ׺
  ¿º        × Ò ÑÔÐ ÒØ ÙÒ Ì ÕÙ ÑÓ Ð                 ÓÐ × ÑÔÐ ÒØ × ÓÒ ÖÖ ÐÓ׺
   º        × Ò ÑÔÐ ÒØ ÙÒ Ì ÕÙ ÑÓ Ð                 ÓÐ × ÑÔÐ ÒØ × ÓÒ Ð ×Ø ׺
   º        × ÙØ Ð × ÐØ ÖÒ Ø Ú ×        × ÒÓ ÙÒ Ì ÕÙ ÑÓ Ð Ñ ØÖ × ×Ô Ö ×
         Ö ÔÖ × ÒØ × ÓÒ ÑÙÐØ Ð ×Ø ׺ ÜÔÐ ÕÙ ÓÑÓ × Ö Ð Þ Ö Ò Ð × ÓÔ Ö ÓÒ × ×ÙÑ ¸
         Ö ×Ø ¸ ÑÙÐØ ÔÐ ÓÒ ÒÚ Ö× ÓÒº
     º       Ð ÙÐ ÐÓ× Óר × Ò ×Ô Ó ÙÒ Ñ ØÖ Þ Ö ÔÖ × ÒØ Ñ ÒØ ÑÙÐØ Ð ×Ø ׺ ÈÖÓ¹
         ÔÓÖ ÓÒ ÙÒ ÜÔÖ × ÓÒ Ò Ð Ø Ò ÙÒ ÓÒ Ð Ñ Ò× ÓÒ Ð Ñ ØÖ Þ Ý Ð ÔÓÖ¹
            ÒØ        Ð Ñ ÒØÓ× ÒÙÐÓ׺
     º      × Ò ÑÔÐ ÒØ ÙÒ Ì ÕÙ ÑÓ Ð Ñ ØÖ × ×Ô Ö × Ö ÔÖ × ÒØ × ÓÒ ÑÙй
         Ø Ð ×Ø ׺ ÁÑÔÐ ÒØ Ð × ÓÔ Ö ÓÒ × ×ÙÑ ¸ Ö ×Ø ¸ ÑÙÐØ ÔÐ ÓÒ ÒÚ Ö× ÓÒº ´··µ

Bibliograf´
          ıa
 ½            Ó¸ ÂÓ Ò º ÀÓÔ ÖÓ Ø¸ Ò Â «Ö Ý º ÍÐÐÑ Òº Ì
          Ð Ö Îº                                             × Ò Ò              Ò ÐÝ× ×
         Ó ÓÑÔÙØ Ö Ð ÓÖ Ø Ñ׺   ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ÍË ¸ ½ º
 ¾ º Ϻ     Ù× Ò Ïº Ⱥ À × Ò º ÇÊÌÊ Æº Á          ÌÖ Ò× Ø ÓÒ× ÓÒ             Ð ØÖÓÒ
     ÓÑÔÙØ Ö׸ ¹½¿´ µ ¿ ¾ß¿ ¸ ½ º
 ¿ È Ø Ö Ð Ò ÖØº ×× Ñ Ð Ö׸ ÓÑÔ Ð Ö׸ Ò ÔÖÓ Ö Ñ ØÖ Ò×Ð Ø ÓÒº                   ÓÑÔÙØ Ö
   Ë Ò ÈÖ ×׸ ½ º
   ̺ Àº ÓÖÑ Ò¸ º º Ä × Ö×ÓÒ¸ Ò Êº ĺ Ê Ú ×Øº ÁÒØÖÓ Ù Ø ÓÒ ØÓ Ð ÓÖ Ø          Ñ׺ ÅÁÌ
   ÈÖ ×׸ Ñ Ö ¸ Å ¸ ÍË ¸ ½ º
2.9. Bibliograf´
               ıa                                                                155



     ź ̺ ÓÓ Ö Ò Êº Ì Ñ ×× º Ø ËØÖÙ ØÙÖ × Ò Ð ÓÖ Ø Ñ× Ò Â Ú º ÂÓ Ò
     Ï Ð Ý ² ËÓÒ׸ ½ º
     ʺ ĺ Ö Ñ¸ º º ÃÒÙØ ¸ Ò Çº È Ø × Ò º ÓÒ Ö Ø Å Ø Ñ Ø ×                      ÓÙÒ¹
        Ø ÓÒ ÓÖ ÓÑÔÙØ Ö Ë Ò º              ×ÓÒ¹Ï ×Ð Ý ÈÙ º¸ ½ º
       ÓÒ Ð º ÃÒÙØ º ÙÒ Ñ ÒØ Ð Ð ÓÖ Ø Ñ׸ ÚÓÐÙÑ ½ Ó Ì                  ÖØ Ó ÓÑÔÙØ Ö
     ÈÖÓ Ö ÑÑ Ò º        ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ÍË ¸ Ø Ö Ø ÓÒ¸ ½ º
     À ÖÖÝ Êº Ä Û × Ò Ä ÖÖÝ Ò Ò Ö º              Ø ËØÖÙ ØÙÖ × Ò Ì Ö Ð ÓÖ Ø Ñ׺
     À ÖÔ Ö ÓÐÐ Ò× ÈÙ Ð × Ö׸ Æ Û ÓÖ ¸ ½ ½º
      Ó Ö Å ÒÒ Ò Ê Ö Ï Ð Ò Öº Ì ÓÖ Ò Ó Ø                         Ò ÖÝ¹× Ö Ô Ö Ñº
     Ì Ò Ð Ê ÔÓÖØ Ê ÔÓÖØ¸ ËØ Ò ÓÖ ÍÒ Ú Ö× ØÝ¸ ËØ Ò ÓÖ ¸ ¸ ½ º
½¼   Ë ÓØØ Ñ Ý Öº ÅÓÖ « Ø Ú C++ ¿ Ò Û Û Ý× ØÓ ÑÔÖÓÚ ÝÓÙÖ ÔÖÓ Ö Ñ× Ò
        × Ò׺       ×ÓÒ¹Ï ×Рݸ ½ º ÁË Æ ¼¹¾¼½¹ ¿¿ ½¹ º
½½   Æ ÓÐ × Æ Ø Ö ÓØ Ò ÂÙÐ Ò Ë Û Ö º Î Ð Ö Ò            ÔÖÓ Ö Ñ ×ÙÔ ÖÚ × ÓÒ Ö Ñ ÛÓÖ º
       Ð ØÖº ÆÓØ × Ì ÓÖº ÓÑÔÙØº Ë ¸ ´¾µ¸ ¾¼¼¿º
½¾     ÐÐ Ò Æ Û ÐÐ Ò Âº º Ë Ûº ÈÖÓ Ö ÑÑ Ò Ø ÐÓ Ø ÓÖÝ Ñ Ò º ÁÒ ÈÖÓ Ò ×
     Ó Ø ½ Ï ×Ø ÖÒ ÂÓ ÒØ ÓÑÔÙØ Ö ÓÒ Ö Ò ¸ Ô × ¾¿¼ß¾ ¼º ÁÊ ¸ ½ º
½¿     ÐÐ Ò Æ Û Ðи º º Ë Û¸ Ò Àº º Ë ÑÓÒº ÑÔ Ö Ð ÜÔÐÓÖ Ø ÓÒ× Û Ø Ø ÐÓ
     Ø ÓÖÝ Ñ Ò º ÁÒ Ï ×Ø ÖÒ ÂÓ ÒØ ÓÑÔÙØ Ö ÓÒ Ö Ò ¸ ÚÓÐÙÑ ½ ¸ Ô × ¾½ ß
     ¾¿ ¸ ½ º
½    ÂÓ Ò Ãº ÇÙר Ö ÓÙØº Ë Ö ÔØ Ò À Ö¹Ð Ú Ð ÔÖÓ Ö ÑÑ Ò ÓÖ Ø ¾½×Ø ÒØÙÖݺ Á
       ÓÑÔÙØ Ö¸ ¿½´¿µ ¾¿ß¿¼¸ ½ º
½    ÈºÂºÅ Ö Ò Ì Ö ËÓ ØÛ Ö ÓÙÒ Ø ÓÒº Ì ÆÍ Æ Æ ÓÑ Ô º
½    ź ÊÓÞ Ö¸ κ ÖÓ×× ÑÓÚ¸ º ÖÑ Ò ¸ Áº ÓÙÐ ¸ ź Ò¸ ź Ù ÐÐ ÑÓÒØ¸ º À Ö¹
     ÖÑ ÒÒ¸ º Ã × Ö¸ ˺ Ä Ò ÐÓ ×¸ Ⱥ Ä ÓÒ Ö ¸ Ò Ïº Æ Ù Ù× Öº ÀÇÊÍË ×ØÖ ÙØ
     ÓÔ Ö Ø Ò ×Ýר Ñ׺ ÍË ÆÁ ÓÑÔÙØ Ò ËÝר Ñ׸ ½´ µ ¿¼ ß¿ ¼¸ ½ º
½    ÊÓ ÖØ Ë Û º Ð ÓÖ Ø Ñ× Ò È ÖØ× ½ß ÙÒ Ñ ÒØ Ð׸ Ø ×ØÖÙ ØÙÖ ×¸
     ×ÓÖØ Ò ¸ × Ö Ò º          ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ÍË ¸ ½ º
½      º Ú Ò ÊÓ××ÙÑ Ò º ĺ Ö ¸ ÂÖº¸ ØÓÖ׺ Ò ÁÒØÖÓ Ù Ø ÓÒ ØÓ ÈÝØ ÓÒº Æ ØÛÓÖ
     Ì ÓÖÝ ÄØ ¸ Ë ÔØ Ñ Ö ¾¼¼¿º
½    Ä ÖÖÝ Ï ÐÐ Ò Ê Ò Ð Äº Ë Û ÖØÞº ÈÖÓ Ö ÑÑ Ò È Öк Ç³Ê ÐÐÝ ² ××Ó Ø ×¸ ÁÒ º¸
     ½ ¼º
¾¼     Ö Ý Ï Ø×ÓÒº Ñ ÐÐÓ ¹ Ù Ñ ÐÐÓ Ð Ö Öݺ Ú Ð Ð ÓÒ http://dmalloc.com/º
¾½   Æ Ð Ù× Ï ÖØ º Ð ÓÖ Ø Ñ× + Ø ËØÖÙ ØÙÖ × = ÈÖÓ Ö Ñ׺ ÈÖ ÒØ ¹À ÐÐ Ë Ö × Ò
       ÙØÓÑ Ø ÓÑÔÙØ Ø ÓÒº ÈÖ ÒØ ¹À Ðи ÍÔÔ Ö Ë Ð Ê Ú Ö¸ ÆÂ ¼ ¸ ÍË ¸ ½ º
Cap´
   ıtulo 3

Cr´
  ıtica de algoritmos

  Ò ×Ø Ô ØÙÐÓ ×ØÙ Ö ÑÓ× Ð ÙÒ × Ø Ò ×            Ò Ð × × Ý Ú Ö ¬ ÓÒ    ÓÖÖ Ø ØÙ
 ÙÝÓ ¬Ò × Ö Ø Ö Ð ÓÖ ØÑÓ׺ Ö Ø Ö ÔÖÓÚ Ò Ð Ö Ó κριτικ ς ´ Ö Ø Ó×µ¸ ÕÙ × ¹
Ò¬       Ð ÕÙ Ö Ø ¸ Р٠и ×Ù Ú Þ¸ Ö Ú Ð Ú Ö Ó Ö Ó κρ νω ´ Ö ÒÓµ Ý ÓÒÒÓØ
× Ô Ö Ö¸ × ÖÒ Ö¸ ר Ò Ù Ö¸ Ö Ö½ º Ö Ø Ö ÓÒ× ×Ø ¸ Ô٠׸ Ò × Ô Ö Ö ¸ × Ð ÓÒ Ö
Ð Ó×        ÒØ Ö ×    ØÓ× ×ØÙ ÖÐ º È ÖÓ¸ Ô Ö ÕÙ Ð ×ØÙ ÑÓ× Ì ÒØÓ × Ð ×
Ô Ö×Ô Ø Ú × Ð Ó Ö ÒØ ¸ ÓÑÓ × Ð × ÐÓ× Ò ¬ Ö Ó× Ð Ó Ö ¸ Ð Ö Ø ×
 ÓÒ ÔÖ Ø Ò× ÓÒ Ñ ÓÖ Ö Ð Òº
     À Ý Ó× Ñ Ò Ö × Ú Ö ÙÒ Ö Ø º ÍÒ × ÓÒ ÒØÖ Ò ÐÓ ÒØ ÖÒÓ ¾ Ý Ø Ò Ð
ÔÖÓ ×Ó          ÙÖ Ð Ó Ö º ר Ø ÔÓ Ö Ø × Ñ × ÔÖÓÔ Ó ÒØÖ ÐÓ× Ó Ö ÒØ × ´ÔÖ ¹
Ø ÒØ ×µ ÕÙ ÒØÖ ÐÓ× Ò ¬ Ö Ó× ÕÙ Ö Ò ´Ù× Òµ Ð Ó Ö º
       Ð ÓØÖ       Ø Ð Ö Ø × Ð ÒÓÑ Ò ÜØ ÖÒ Ý Ø Ò Ð ÔÖ                  ÓÒ ×Ó Ð
    Ð Ó Ö × Ö¸ ÓÑÓ Ð ÒØÓÖÒÓ Ó ×Ó            ÔÖ Ó ×ÔÖ           Ð Ò Ð ÓÖºÄ
 Ö Ø ÜØ ÖÒ × ÙÒ Ñ ÒØ Ð Ý ÔÖ Ñ Ö Ö ×Ô ØÓ Ð ÒØ ÖÒ ¸ ÔÙ × ×Ø Ø Ò Ð ×Ø ÒÓ
    Ð ÓÖº
     Ä Ö Ø ÜØ ÖÒ × ÓÒ ÒØÖ Ò Ð ÕÙ × Ð Ó Ö ¸ ÐÓ ÕÙ ×Ø Ö ÔÖ × ÒØ ×Ó ÐÑ ÒØ
 ÓÑÓ Ò Ñ ÒØÖ × ÕÙ Ð Ö Ø ÒØ ÖÒ × ÓÒ ÒØÖ Ò Ð ÓÑÓ × Ö Ð Þ Ð Ó Ö º
     Ä Ò ÑÓ ÖÒ ×Ù Ð Ù× Ö Ð Ø ÖÑ ÒÓ Ò Ð × × Ô Ö Ö Ö Ö ÙÒ ×Ø ÐÓ Ø Ò Ó
     ×ØÙ Ó ÒØ ÖÒÓ Ò Ð Ù Ð Ð Ó×       ×ØÙ Ó × Ú Ò Ô ÖØ × Ô Ö ×ØÙ ÖÐ × ÔÓÖ
× Ô Ö Óº Ò Ð × × ÔÖÓÚ Ò Ð Ö Ó ν λυσις ´ Ò Ð × ×µ Ý Ò ÙÐØ Ñ Òר Ò               Ð
Ú Ö Ó ναλ ω¸ Ð Ù Ð Ø Ñ Ò × Ò ¬ ×ÓÐØ Ö ´ ν µ¸ ר ÒØ Ú Ñ ÒØ ¸ ÔÓÖ Ô ÖØ ׸ Ý
 × Ô Ö Ö ´λ ωµ ÐÓ ÕÙ ÓÖÖ ×ÔÓÒ ÓÒ ×Ù ÔÖ Ñ Ö Ô ÓÒ Ò Ð ºÊº º º ר Ò Ù Ö
Ý × Ô Ö Ö Ð × Ô ÖØ × ÙÒ ØÓ Ó º    ÑÓ× Ð Ö Ö Ú Ñ ÒØ Ñ ÒØ ÕÙ Ö Ø Ö × ÑÙ Ó
Ñ × ÕÙ Ò Ð Þ Ö Ý¸ Ô Ö ÔÖ Ò Ö ÐÐÓ¸ ÕÙ Þ ÐÓ Ñ ÓÖ × Ñ Ö Ö Ð ÒØÓÒ ÑÓ Ò Ð × ×¸
 Ù Ð × × ÒØ × × ¸ ÔÖÓÚ Ò ÒØ Ð Ö Ó σ νθεσις ´× ÒØ × ×µ ÕÙ ¸ ºÊº º º Ü Ø¸ × Ò ¬
   ÓÑÔÓ× ÓÒ ÙÒ ØÓ Ó ÔÓÖ Ð Ö ÙÒ ÓÒ ×Ù× Ô ÖØ × º ÓÑÓ ÑÓ× ÔÖ ÖÐÓ¸ Ò
 ר ÓÒØ ÜØÓ ÓÑÔÓÒ Ö ÔÖÓ Ö Ñ ×¸ Ó × ¸ × ÒØ Ø Þ ÖÐÓ׸ Ø Ò Ñ × × ÒØ Ó Ô Ö ÒÓ×ÓØÖÓ×
ÕÙ × ÓÑÔÓÒ ÖÐÓ׸ × Ö¸ ÕÙ Ò Ð Þ ÖÐÓ׺ ËÙÖ ¸ ÒØÓÒ ×¸ Ð × Ù ÒØ ÔÖ ÙÒØ ¸ ÕÙ
     Ö ÑÓ× ÖØ Ù Ò Ó ÔÖÓ Ö Ñ ÑÓ׸ Ò Ð Þ ÑÓ× Ó × ÒØ Ø Þ ÑÓ× Ó Ñ Ó× ÈÐ ÒØ Ó
   ÓØÖÓ ÑÓ Ó Ö ÑÓ× ÔÖÓ Ö Ñ × Ô ÖØ Ö ÙÒ ØÓ Ó ÕÙ ÐÙ Ó × ÓÑÔÓÒ ÑÓ× Ó Ô ÖØ Ö
    Ô ÖØ × ÕÙ ×ÔÙ × ÓÑÔÓÒ ÑÓ׸ Ñ × Ó× × Ó Ò Ò ÙÒ
       ÙÒ Ö Ø ×Ù Ð Ð ¬ Ö× Ð       ÓÒרÖÙ Ø Ú Ó ×ØÖÙ Ø Ú º ÀÓÝ × Ó ÔÓÖ ÕÙ
  ½
   ÍÒ Ö       × ÙÒ ×Ô       ÓÐ ÓÖ ÓÒ ÕÙ ÒØ Ù Ñ ÒØ × Ð ÑÔ      Ð ØÖ Ó Ð ÔÓÐÚÓ Ý ÓØÖ ×
ÑÔÙÖ Þ ×º ÉÙ Þ ÔÓÖ ×Ø   Ô ÓÒ × Ñ × ÔØ Ð      Ö ÕÙ Ö Ø Ö ÒÓ × Ò ¬    Ú Öº
 ¾
   Ë ÙÒ ¾¼ º

                                        ½
158                                                  Cap´
                                                        ıtulo 3. Cr´
                                                                   ıtica de algoritmos



Ð Ö Ø × ÓÒרÖÙ Ø Ú Ý ÒÓ ×ØÖÙ Ø Ú º ÈÓÖ ÕÙ ×ØÓ× Ø ÚÓ× ÉÙ × ÓÒרÖÙÝ
Ó ×ØÖÙÝ Å × Ò Ô ÖØ ÙÐ Ö¸ ÔÓÖ ÕÙ ÙÒ Ö Ø ÔÓ Ö × Ö ×ØÖÙ Ø Ú × ÓÖÖ ØÓ
     Ö ÕÙ ÙÒ Ó Ö × ÓÒרÖÙÝ ¸ × ÒØ Ó ÔÓÖ Ð Ù Ð ÙÒ Ö Ø ¸ ×Ó Ö ØÓ Ó¸ Ù Ò Ó
 ר Ö Ú Ð ÖÖÓÖ ×¸ ÙÝ × ×ÙÒ ÓÒ × Ý ÒÑ Ò × Ñ ÓÖ Ò Ð Ó Ö ¸ ÔÙ                         ÓÒ× Ö Ö×
 ÓÒרÖÙ Ø Ú º ÙÒÕÙ ÑÓ×              Ó ÕÙ Ø ÑÓÐÓ Ñ ÒØ Ð Ö Ø Ö ÓÒÐÐ Ú ÖÓÑÔ Ö ¸
ÒÓ       ÑÓ× ÔØ Ö ÕÙ ÙÒ Ö Ø               רÖÙÝ Ð Ø Ö ÐÑ ÒØ ÙÒ Ó Ö ØÓ Ó ÐÓ ÓÒØÖ Ö Ó¸
Ñ ÒØÖ × Ñ × Ù Ý ÔÖ × × ÙÒ Ö Ø ¸ Ñ × ÓÒרÖÙ Ø Ú ×¸ ÔÙ × ×Ø Ô ÖÑ Ø
Ñ ÓÖ Ö Ð Ó Ö º ÄÓ ÒØ Ö ÓÖ × ÓÖÖ ØÓ ÙÒ¸ Ò ÐÙ× Ú ¸ × ÙÒ Ö Ø Ö Ú Ð ÕÙ ÒÓ Ø Ò
× ÒØ Ó ÓÒרÖÙ Ö Ð Ó Ö Ô٠׸ Ð ¬Ò Ý Ð Ó¸ ר × ÙÒ ÓÒÓ Ñ ÒØÓ ÔÖ Ø Óº ÓÑÓ
 ׸ ÒØÓÒ ×¸ ÕÙ ÙÒ Ö Ø ÔÙ                Ð ¬ Ö×          רÖÙ Ø Ú
     Ç ÙÖÖ ÕÙ Ð Ö ÞÓÒ Ð Ö Ø                  ר ÔÓ × ÒØÖ Ò Ð Ò Ú ÙÓ¸ Ó × Ò Ð
Ô Ö×ÓÒ Ð         Ð Ó Ö ÒØ ¸ ÕÙ Ò × Ð Ö Ø Ó¸ Ý Ð Ö Ø ÒØ ¸ Ò ÐÙ Ö ÓÒ ÒØÖ Ö×
×Ó Ö Ð Ó Ö ÓÑÓ ÙÒ ØÓ Óº Ò ×Ø Ñ Ö Ó¸ Ù Ò Ó Ð Ó Ö ÒØ                       ר ÔÓ × Ù ÙÒ
 Ö Ø ¸ × ÑÙÝ ÔÓ× Ð ÕÙ ¸ Ò ÐÙ Ö ÓÒ× Ö ÖÐ                          Ð × ÒØ Ó Ð Ó Ö ¸ ÕÙ × ÐÐ
Ý ÓÑÓ ×Ø × Ö Ð Þ ¸ × ÓÒ ÙÒ ÓÒ ÕÙ Ò × Ð Ó Ö ÒØ Ý ÓÑÓ × Ð ÓÑÓ ÙØÓÖº ÈÓÖ
Ð Ñ ×Ñ × Ö ÞÓÒ ×¸ Ñ ÒÙ Ó¸ Ð Ö Ø ÒØ Ò ÙÖÖ Ò Ð Ñ ×ÑÓ Ý ÖÖÓ ÓÒ ÒØÖ ×Ù Ö Ø
´× ×Ó ÓÖ × Ð ÔÙ Ø Ð Ö × µ Ò Ð Ô Ö×ÓÒ Ð                        Ð Ó Ö ÒØ ¸ × Ö¸ Ò Ð ÙØÓÖ¸ Ò
   ØÖ Ñ ÒØÓ Ð × ÒØ Ó Ð Ó Ö Ý ×Ù ÒרÖÙÑ ÒØ ÓÒº Ò Ð Ñ Ö Ó ÓÒ ×Ø ¸ Ð Ö Ø
 × ÓÒרÖÙ Ø Ú × × ÐÓ Ö ÒØ ÖÔÖ Ø Ö ÓÑÓ ÐÓ Ó¸ Ñ ÒØÖ × ÕÙ × ×ØÖÙ Ø Ú Ù Ò Ó ×
 ÒØ Ò ÓÑÓ Ö ÔÖÓ º Ð ÔÖÓ Ð Ñ × ÕÙ Ð ÓÒ ÙÒ Ö Ð ÕÙ ×                             ÓÒ Ð ÕÙ Ò     ¸
Ó¸ Ð ÓÑÓ ×            ÓÒ Ð ÓÑÓ × ÕÙ Ò ÐÓ             ¸ × Ô Ö Ð Ú ÐÓÖ × Ò Ð Ð Ö Ø ¸
 Ù Ð ÒÓ × ÓØÖÓ ÕÙ Ñ ÓÖ Ö¸ Ô Ö× Ù Ö Ð Ü Ð Ò Ý¸ Ò ÙÐØ Ñ ÓÒ× Ù Ò ¸ Ð Ò Ò
 Ð Ù Ð ØÖ × Ò Ð Ó Ö º
        Ó Ö ÑÓ× Ð Ó ØÓ ×ØÙ Ó ×Ø Ô ØÙÐÓ × Ó× Ô Ö×Ô Ø Ú × Ð ¬                                Ý
Ð ¬ Ò º
     Ä ¬         ÓÒ ÖÒ ÕÙ × ÐÓ Ö Ð ØÓ × Ö¸ ÕÙ Ð Ð ÓÖ ØÑÓ Ð Ò Ð ¬Ò
    Ö ×ÓÐÚ Ö Ð ÔÖÓ Ð Ñ Ô Ö Ð Ù Ð Ù ×Ø Ò Óº ×ØÓ × Ð ÓÖÖ Ø ØÙ º
     Ä ¬ Ò Ø Ò ÕÙ Ø Ò Ò ÙÒ Ð ÓÖ ØÑÓ Ó ÔÖÓ Ö Ñ Ö Ð Þ ×Ù ×ÓÐÙ ÓÒ ÐÓ ÕÙ
 ÑÔÐ         Ö ÕÙ ¸ Ô Ö ÔÓ Ö Ð Ö ¬ Ò ¸ ÔÖ Ú Ñ ÒØ                                Ö× × Ó ¬ Þº
ÈÓ ÑÓ× Ö¸ ÒØÓÒ ×¸ ÕÙ Ð ¬ Ò Ø Ò ÓÑÓ × ÔÙ × Ö Ñ ÓÖ ¬ Þº
     Ë ÙÒ ÔÖÓ Ö Ñ ÒÓ × ÓÖÖ ØÓ¸ ÒØÓÒ × ÔÓ× Ð Ñ ÒØ ÒÓ Ø Ò × ÒØ Ó Ð Ö
 ¬ Ò º ÈÓÖ ×Ó¸ Ð ÓÖÖ Ø ØÙ ÔÖ Ñ Ð ¬ Ò ¸ ÔÙ × Ò Ú Ð Ð ÙÐØ Ñ × ÒÓ
× Ð ÒÞ Ð ØÓ × Ö¸ × ÒÓ × Ö ×Ù ÐÚ Ð ÔÖÓ Ð Ñ º
     È Ö ×ØÙ Ö Ð ¬ Ò × Ö Ð Þ Ò Ò Ð × ×º Ò ×Ø × ÒØ Ó                         Ò ÔÖ ÙÒØ × ÓÑÓ
  Ù ÒØÓ ÙÖ Ð ÔÖÓ Ö Ñ           Ù ÒØÓ× Ö ÙÖ×Ó× ÓÑÔÙØ ÓÒ Ð × ÓÒ×ÙÑ Ð × ÒØ Ó Ö Ø Ó
×Ó Ö ×Ø Ð × ÔÖ ÙÒØ × Ø ÖÑ Ò Ö Ð Ø Ð                               ÙÒ ÔÖÓ Ö Ñ Ý Ð × Ö ÙÒר Ò¹
    × Ò ÕÙ ×Ø ÔÙ Ó              Ù× Ö× º
      ÙÖ ÒØ ÙÒ Ò Ð × ×¸ × ÑÙÝ ÔÓ× Ð ÕÙ × Ö Ú Ð Ò ÓØÖ × ÓÖÑ × Ó Ú Ö ÒØ × Ô Ö Ö Ð ¹
Þ Ö Ð Ð ÓÖ ØÑÓ Ó ÔÖÓ Ö Ñ Ð ÙÒ ×               ÐÐ × ÐÓ Ñ ÓÖ Ö Ò¸ ÓØÖ × ÐÓ ÑÔ ÓÖ Ö Ò Ý ÓØÖ ×
   Ú Ð Ö Ò Ð ÓÖ ØÑÓ× ÑÙÝ ×Ø ÒØÓ׺ Ò Ò ÙÖ ¸ Ð ÒØÖ Ò Ñ ÒØÓ Ò Ð Ò Ð × ×                       й
 ÓÖ ØÑÓ× Ö ÕÙ Ö ×Ù ÓÑÔÖ × ÓÒ            к ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ò Ð Þ Ö Ð ÓÖ ØÑÓ× × ÙÒ
Ð × Ñ ÓÖ × Ñ Ò Ö ×          Ò Ö ÓÒÓ Ñ ÒØÓ ×Ó Ö ×Ù × ÒÓº
      Ù Ò Ó × Ø Ò Ð ÖÓ Ð ÔÖÓ Ð Ñ ¸ ÙÒ Ò Ð × × ÔÙ Ò Ö ×Ô ØÓ× ÓÖÖ Ø ØÙ º
ÈÓÖ ÑÔÐÓ ÜØÖ ÑÓ¸ ÙÒ ÙÖ ÓÒ ÒÙÐ ¸ ÕÙ ÒÓ Ø Ò × ÒØ Ó ÓÒ Ö ØÓ¸ ÔÙ Ö Ò Ö¸
ÒÓ ×ÓÐÓ ÙÒ ÖÖÓÖ Ò Ð Ò Ð × ×¸ × ÒÓ Ò Ð Ð ÓÖ ØÑÓ Ñ ×ÑÓº
      Ò ÐÓ ÕÙ × Ù ¸ ÒØÓÒ ×¸ ÓÖ Ö ÑÓ× Ó× Ø Ñ × ÔÖ Ò Ô Ð × Ð Ò Ð × × Ð ÓÖ ØÑÓ×
3.1. An´lisis de algoritmos
       a                                                                                    159



Ý ×Ù ÓÖÖ Ø ØÙ º Ñ Ó× Ø Ò Ò Ð Ö Ø ÒØ ÖÒ ¸ Р٠и ÒÓ                            ÑÓ× ÓÐÚ Ö¸ ÒÓ Ø Ò
× ÒØ Ó × Ò ÙÒ Ô Ö×Ô Ø Ú   Ö Ø ÜØ ÖÒ º

3.1       An´lisis de algoritmos
            a
ÁÒØÙ Ø Ú Ñ ÒØ ¸ Ý Ó× Ñ ØÖ × ÙÒ Ñ ÒØ Ð × Ý Ð Ñ ÒØ Р׸ Ð × Ù Ð ×¸ Ò Ø ÓÖ ¸
Ô ÖÑ Ø Ò Ù ÒØ ¬ Ö Ð Ð           ÙÒ Ð ÓÖ ØÑÓ
   ½º Ä ÙÖ ÓÒ Ð            Ù ÓÒ¸ ÓÑÙÒÑ ÒØ ÐÐ Ñ       Ø ÑÔÓ      Ù ÓÒ ¸ Ð Ù Ð
       ÓÒ× ×Ø Ò Ñ Ö Ð Ø ÑÔÓ × ÕÙ × Ò             Ð ÔÖÓ Ö Ñ ×Ø ÕÙ × ÙÐÑ Ò º
        Ò ×Ø × ÒØ Ó¸ Ñ ÒØÖ × ÙÒ ÔÖÓ Ö Ñ Ñ ÒÓ× ÙÖ ¸ Ñ ÓÖ ×Ø ׺
   ¾º Ä ÒØ            ÓÒ×ÙÑÓ ÓØÖÓ× Ö ÙÖ×Ó׿ Ò Ô ÖØ ÙÐ Ö¸ Ð Ñ ÑÓÖ º Å ÑÓ× ÐÓ×
        ÝØ × Ñ ÑÓÖ Ý ÓØÖÓ× Ö ÙÖ×Ó× ÕÙ Ó ÙÔ ÙÒ ÔÖÓ Ö Ñ ÙÖ ÒØ ×Ù Ù ÓÒº
        ÒØÖ Ó× ÔÖÓ Ö Ñ × ÓÑÔ Ö Ö¸ Ð ÕÙ ÓÒ×ÙÑ Ñ ÒÓ× Ö ÙÖ×Ó× × Ð Ñ ÓÖº
Ì ÒØÓ Ð ÙÖ ÓÒ¸ ÓÑÓ Ð ÓÒ×ÙÑÓ Ö ÙÖ×Ó׸ Ô Ò Ò Ð ÓÒ¬ ÙÖ ÓÒ Ð
 ÒØÖ º ÍÒÓ ÐÓ× ØÓÖ × Ñ × ÑÔÓÖØ ÒØ × ×Ø ÓÒ¬ ÙÖ ÓÒ¸ Ô ÖÓ ÒÓ Ð ÙÒ Ó¸ × Ð
Ø Ñ ÒÓ Ð ÒØÖ ¸ Ô٠׸ Ñ ÒØÖ × Ñ ÝÓÖ × ×Ø ¸ ÔÓ× Ð Ñ ÒØ Ñ ÝÓÖ × Ð ÒØ
  ØÓ× ÔÖÓ × Ö Ý Ñ ÝÓÖ × ÙÖ ÓÒ × Ý ÒØ         × Ö ÙÖ×Ó× Ý ÕÙ ×Ø Öº Ò ×Ø
ÓÖ Ò         ׸ Ò ÐÓ ÕÙ × Ù ¸ ÒÓ× Ö Ö Ö ÑÓ× T (n) ÓÑÓ ÙÒ ÙÒ ÓÒ ÕÙ × Ö Ð
 ÓÑÔÓÖØ Ñ ÒØÓ ÙÒ Ð ÓÖ ØÑÓ¸ × ÙÒ ×Ù ÙÖ ÓÒ Ó ×Ù ÓÒ×ÙÑÓ Ö ÙÖ×Ó׸ Ð Ø Ñ ÒÓ
   Ð ÒØÖ nº


                                                          Td1 (n)




                                                                    Td2 (n)




            ¼
                      n1        n2                                                   n

                                     ÙÖ ¿º½ ÍÒ     ÑÔÐÓ      Td


    Ð Ø Ñ ÒÓ n × ÙÒ         Ô ÖØ    Ð ÓÒ¬ ÙÖ ÓÒ¸ Р٠и Ò × ¸ ÓÒ× ×Ø Ò Ð ÓÖ Ò Ó
Ô ÖÑÙØ ÓÒ Ò ÕÙ Ð            Ô Ö Ð ÒØÖ       Ð ÔÖÓ Ö Ñ º ÈÙ ×ØÓ ÕÙ ÓÒÓ Ö ØÓ × Ð ×
Ô ÖÑÙØ ÓÒ × ÔÓ× Ð ×           ÙÒ ÒØÖ     × ÑÙÝ Ð ÓÖ Ó×Ó ´Ý ×Ù Ø ÚÓµ¸ Ò Ð Ò Ð × ×
ÙÒ Ð ÓÖ ØÑÓ × ×Ù Ð Ò        ÑÔÐ Ö Ð ÙÒÓ× ×Ø ר Ó׸ ÐÓ× Ù Ð × ÐÓ× ÔÖ Ò Ô Ð × ×ÓÒ Ð
ÔÖÓÑ Ó Ó ×Ô Ö ÒÞ Ý          Ð Ñ Ü ÑÓº
  ¿
      “otros”   ÔÓÖÕÙ Ð Ø ÑÔÓ        Ù ÓÒ ÔÙ   Ø Ñ Ò ÓÒ× Ö Ö× ÓÑÓ ÙÒ Ö ÙÖ×Óº
160                                                Cap´
                                                      ıtulo 3. Cr´
                                                                 ıtica de algoritmos



    Ä × Ó × ÖÚ ÓÒ × ÒØ Ö ÓÖ × ×ÙÔÓÒ Ò ÕÙ Ð Ø Ñ ÒÓ Ð ÒØÖ ÔÙ                     ÜÔÖ × Ö×
 Ò ÙÒ ÓÒ ÙÒ ×ÓÐ Ú Ö Ð ¸ ÐÓ Ù Ð ÒÓ × ÑÔÖ × Ð ×Óº Ò Ð ÙÒ × Ö ÙÒר Ò ×¸
 Ð Ø Ñ ÒÓ¸ Ù ÓØÖ Ù ÒØ ¬ ÓÒ Ö                   Ð ÒØÖ ¸ × ¬Ò Ò Ñ ÒØ ÙÒ ÙÒ ÓÒ
ÑÙÐØ Ú Ö Ð º רÓ× ×Ó× ×ÓÒ¸ ÔÓÖ ×ÙÔÙ ×ØÓ¸ Ñ × ÓÑÔÐ Ó× ÕÙ Ð ÙÒ Ú Ö Ð º
         Ó× Ó× Ð ÓÖ ØÑÓ× A1 Ý A2¸ ÕÙ Ö ×Ù ÐÚ Ò Ð Ñ ×ÑÓ ÔÖÓ Ð Ñ ¸ Ù Ð ÐÓ× Ó× ×
Ñ ÓÖ Ç Ø Ú             ÓÒ Ñ ÒØ        Ð Ò Ó¸ ÔÓ ÑÓ× Ð ÙÐ Ö ÔÖ ÓÖ ¸ Ó × ¸ × Ò ÙØ Ö
ÐÓ× Ð ÓÖ ØÑÓ׸ Ð × ÙÒ ÓÒ ×          ÙÖ ÓÒ Td (n) Ý Td (n) Ý Ð × ÙÒ ÓÒ ×
                                             1         2
                                                                                ÓÒ×ÙÑÓ
     ×Ô Ó Te (n) Ý Te (n)º Ë ØÙÚ × ÑÓ× ×Ø × ÙÒ ÓÒ ×¸ ÒØÓÒ × Ø Ò Ö ÑÓ× Ö Ø Ö Ó×
              1       2
   ר ÒØ Ó Ø ÚÓ× Ý ÔÖ ×Ó× Ô Ö            Öº ÈÓÖ ÑÔÐÓ¸ × Td Ü × Ð × ÓÖÑ × Ñ Ü Ñ ×
    Ð ¬ ÙÖ ¿º½¸ ÒØÓÒ × × Ö ÑÓ× ÕÙ ¸ Ô Ö ÒØÖ × Ñ ÝÓÖ × n2 Td (n) × Ñ ÓÖ     2
ÕÙ Td (n)¸ ÔÙ × ×Ø ÙÐØ Ñ × Ð ÕÙ Ø Ò Ñ ÝÓÖ ÙÖ ÓÒº
          1
      Ð Ò Ð × × ÒØ Ö ÓÖ ×ÓÐÓ × ÔÓ× Ð × × ÔÙ Ò ÓÒÓ Ö ÔÖ ÓÖ Ð × ÓÖÑ × Td (n)          1
Ý Td (n)º Ä Ñ ÒØ Ð Ñ ÒØ ¸ ×ÙÑ Ö Ø Ð ÔÓ× Ð
      2
                                                    ÒÓ × Ô Ö Ò Ö Ð ×Ø ¸ Ô٠׸ Ô Ö Ð
   ×Ó Ò Ö Ð¸ × ÜØÖ Ñ Ñ ÒØ               Ð Ð ÙÐ Ö ÔÖ ÓÖ Td(n)º È Ö ÔÖ Ò Ö Ð ÔÓÖÕÙ
     ר ¬ ÙÐØ × Ò × Ö Ó ÓÑÔÖ Ò Ö ÕÙ Ð ÙÐ Ö Td(n) Ö ÕÙ Ö ÓÒØ Ö Ð ÒØ
      ÒרÖÙ ÓÒ × ÕÙ         ÙØ Ö Ð × Ù Ò ¬Ò Ø ÒÓÑ Ò              Ð ÓÖ ØÑÓº
       ÓÖØÙÒ Ñ ÒØ ¸ ÒÓ × ÓÒÚ Ò ÒØ ÓÒÓ Ö ÓÒ ÔÖ × ÓÒ Td(n)¸ Ô٠׸ Ð ÔÓ×ØÖ ¸ Ð
  ÙÖ ÓÒ Ö Ð Ô Ò Ö               ØÓÖ × ×Ù Ø ÚÓ× ÕÙ ÑÓ ¬ Ö Ò Ð ÓÖÑ Ü Ø Td(n)º
  Ò ØÓ¸ Td(n) Ø Ò Ö ÓÖÑ × Ö ÒØ × × ÙÒ Ð × Ö ÙÒר Ò ×                      Ù ÓÒ Ð Ð Ó¹
Ö ØÑÓº ÒØÖ Ø Ð × Ö ÙÒר Ò ×                ר Ö Ð × × Ù ÒØ × Ö Ø Ö ×Ø ×
    ¯ Caracter´  ısticas materiales del computador Ü ×Ø Ò ÑÙ × ÖÕÙ Ø ØÙÖ × ¹
         Ö ÒØ ×     ÓÑÔÙØ ÓÖ ×º Ð ÙÒ × ÖÕÙ Ø ØÙÖ × × ÔÖ ×Ø Ò Ñ ÓÖ Ô Ö ÙÒ Ð ×
          ÔÖÓ Ð Ñ × ÕÙ ÓØÖ ×º ÈÓ× Ð Ñ ÒØ ¸ ÙÒ Ð ÓÖ ØÑÓ Ø Ò Ö ÙÖ ÓÒ × ×Ø ÒØ × Ò
        ÖÕÙ Ø ØÙÖ × ×Ø ÒØ ׺
         ÙÒ ÒØÖ ÖÕÙ Ø ØÙÖ × ÓÑÓ Ò ×¸ Ü ×Ø Ò Ö Ò ×                  × ÔÓÖ Ð Ú ÐÓ         Ð
       Ö ÐÓ ¸ ÒØ         Ñ ÑÓÖ ¸ × ×Ø Ñ ÓÔ Ö Ø ÚÓ¸ ÒÙÑ ÖÓ ÔÖÓ ×Ó× ÕÙ ØÙ ÐÑ ÒØ
        Ð Ö Ù Ð ÓÑÔÙØ ÓÖ¸ ÒØÖ ÓØÖÓ× ØÓÖ × ÕÙ Ò Ò Ò Ð ÙÖ ÓÒ ÙÒ ÔÖÓ¹
        ÖѺ
    ¯ Caracter´  ısticas de la codificaci´n ÙÒ Ð ÓÖ ØÑÓ × ÒרÖÙÑ ÒØ
                                             o                                  Ò Ð ÙÒ
       ÐÒÙ         ÔÖÓ Ö Ñ ÓÒº Ä Ò Ù × Ö ÒØ × ÕÙ Ó ¬ÕÙ Ò Ð Ñ ×ÑÓ Ð ÓÖ ØÑÓ
       ÔÖÓ Ù Ö Ò ÔÖÓ Ö Ñ × ÓÒ ÙÖ ÓÒ × Ö ÒØ ׺
         Ò Ò ÙÖ ¸ ÐÓ× ÔÖÓ Ö Ñ ÓÖ × Ø Ñ Ò ¬ Ö Ò Ò ×Ù× ×Ø ÐÓ× Ó ¬ ÓÒº ÍÒ
        Ð ÓÖ ØÑÓ ÑÔÐ ÒØ Ó ÔÓÖ Ó× ÔÖÓ Ö Ñ ÓÖ × Ò ÙÒ Ñ ×ÑÓ Ð Ò Ù Ý ÙØ Ó Ò
       ÙÒ ×ÓÐÓ ÓÑÔÙØ ÓÖ ÔÖÓ Ð Ñ ÒØ Ü Ö                Ö Ò × Ò Ð Ø ÑÔÓ            Ù ÓÒº
    ¯ Caracter´  ısticas del c´digo generado por el compilador ÐÓ× ÓÑÔ Ð ÓÖ ×
                               o
         ¬ Ö Ò Ò Ð ØÖ Ù ÓÒ Ð Ó Ó Ù ÒØ Ð Ó ØÓº × ×Ø ÒØ ÔÖÓ Ð ÕÙ Ó×
        ÓÑÔ Ð ÓÖ × Ö ÒØ × Ò Ö Ò ØÖ Ù ÓÒ × Ö ÒØ × ÙÒ Ñ ×ÑÓ ÔÖÓ Ö Ñ Ý¸
       ÔÓÖ Ø ÒØÓ¸ Ó× ÔÖÓ Ö Ñ × Ü Ö Ò Ø ÑÔÓ×                 Ù ÓÒ Ö ÒØ ׺
      רÓ× ØÓÖ ×¸ ÒØÖ ÓØÖÓ× Ñ ×¸ Ø ÖÓ Ò Ó× ÒØÖ × ¸             Ò Ñ × Ö ÙÓ¸ ݸ Ñ ×¸
 ÑÔÖ Ø Ó¸ ÒÓ ×ÓÐÓ ÓÒÓ Ö Ð ÓÖÑ Ü Ø T (n)¸ × ÒÓ ÜÔÖ × Ö Ð Ø ÑÔÓ                     Ù ÓÒ
    ÙÒ ÔÖÓ Ö Ñ Ò Ð ÙÒ ÙÒ             ×Ô ¬ Ý ÔÖ × º         ÑÓ׸ Ô٠׸ Ò Ö ÙÒ Ö Ø Ö Ó
     Ò Ð × × ÕÙ ÐÙ ÐÓ× ØÓÖ × Ñ Ò ÓÒ Ó׺
3.1. An´lisis de algoritmos
            a                                                                     161



     3.1.1   Unidad o paso de ejecuci´n
                                     o
       ÓÑÓ Ý ÐÓ × Ò Ð ÑÓ׸ Ò Ð Þ Ö ÙÒ Ð ÓÖ ØÑÓ ÓÒ× ×Ø Ò ÓÒØ Ö Ð ÒØ          ÒרÖÙ ÓÒ ×
     Ó Ô ×Ó×         Ù ÓÒ ÕÙ ×Ø        ÙØ º ÉÙ × ÙÒ Ô ×Ó           Ù ÓÒ Ò ÔÖ Ò Ô Ó¸
     ÔÓ ÑÓ× Ö ÕÙ × Ð Ñ Ò Ñ ÒרÖÙ ÓÒ ÕÙ × ÔÙ                   ÙØ Öº ר ÒÓ ÓÒ ×Ø Ð
     ÙÒ Ö ÒÓ Ñ Ò ÑÓ ÕÙ ÒÓ× Ô ÖÑ Ø Ù ÒØ ¬ Ö Ð ÙÖ ÓÒ ÙÒ Ð ÓÖ ØÑÓ × Ò ÓÒ× Ö Ö
      Ð Ø ÑÔÓ ×ÓÐÙØÓ          Ù ÓÒº ÉÙ × ÓÒ× Ö ÓÑÓ ÙÒ Ñ Ò Ñ ÒרÖÙ ÓÒ Ä ×
      ÓÒ× Ö ÓÒ × ÒØ Ö ÓÖ × Ö ­ Ò ÐÓ           Ð ÕÙ × × ÒØ Ö ×Ø ÙÑ Ö Ðº ÈÓÖ Ø Ð Ö ÞÓÒ¸
      ÓÒ× Ö Ö ÑÓ× ÙÒ Ô ×Ó          Ù ÓÒ ÓÑÓ Ù ÐÕÙ Ö × Ù Ò           Ù ÓÒ ÙÝ ÙÖ ÓÒ
     × ÓÒר ÒØ º ÌÖ Ò× ÑÓ× ÔÓÖ ÐÓ ÓÒר ÒØ × Ò × Ö Ù Ð × Ð ÙÖ ÓÒ Ö Ðº
         ÈÖÓÔ ÑÓ× Ð ÒØ Ò Ñ ÒØÓ Ñ ÒØ Ð ÙÒÓ× ÑÔÐÓ׺ Ä × Ù ÒØ ÒרÖÙ ÓÒ
½½       ÑÔÐÓ ½ Ô ×Ó      Ù ÓÒ ½ ½ ≡                                 ´½ ½ µ
                    x = y;
     × ÓÒ× Ö ÙÒ Ô ×Ó      Ù ÓÒº             Ú Þ ÕÙ Ð ­Ù Ó Ô × ÔÓÖ ×Ø ÒרÖÙ ÓÒ¸ ×Ù
       Ù ÓÒ Ø Ò Ö ÙÒ ÙÖ ÓÒ Ñ Ü Ñ           ÓÒר ÒØ Ñ ÒØ ÓØ º Ò Ð Ñ ×ÑÓ × ÒØ Ó
½½     ÑÔÐÓ ¾ Ô ×Ó   Ù ÓÒ ½ ½ ≡                                     ´½ ½ µ
                    x = y + z;
      ÙÝ ÙÖ ÓÒ × Ñ ÝÓÖ ÕÙ Ð ÑÔÐÓ ½ Ô ×Ó               Ù ÓÒ ½ ½ ¸ Ø Ñ Ò ×Ø ÓÒר Ò¹
     Ø Ñ ÒØ ÓØ ÔÓÖ Ø ÒØÓ¸ Ð ÑÔÐÓ ¾ Ô ×Ó                Ù ÓÒ ½ ½ Ø Ñ Ò × ÓÒ× Ö
     ÙÒ Ô ×Ó        Ù ÓÒº
        ÍÒ × Ù Ò          ÒרÖÙ ÓÒ × Ø Ð ÓÑÓ Ð × Ù ÒØ
½½      ÑÔÐÓ ¿ Ô ×Ó       Ù ÓÒ ½ ½ ≡                               ´½ ½ µ
                    x = h;
                    if (x <   y)
                      {
                        x =   y + z;
                        a =   b*c;
                      }
                    else
                      {
                        x =   p + q + r;
                        a =   b + c;
                      }
     ÔÙ     ÓÒ× Ö Ö× Ñ × ÓרÓ× ÕÙ     ÑÔÐÓ ¾ Ô ×Ó       Ù ÓÒ ½ ½ ¸ × Ò Ñ Ö Ó¸
     Ò Ô Ò ÒØ Ñ ÒØ Ð Ú ÐÓÖ Ð ÔÖ         Ó Ý ÐÓ Ð Ö ÕÙ ÔÙ × Ö Ð         Ù ÓÒ
      Ù ÐÕÙ Ö    ÐÓ× ÐÓÕ٠׸ ÑÔÐÓ ¿ Ô ×Ó        Ù ÓÒ ½ ½ × ÙÒ Ô ×Ó       Ù ÓÒ¸
     ÔÙ × ×Ø Ø Ò ÙÒ ÙÖ ÓÒ ÕÙ ÔÙ        ÓØ Ö× ÔÓÖ ÙÒ ÓÒר ÒØ º
          Ð ÐÓÕÙ Ö Ô Ø Ø ÚÓ
½½      ÑÔÐÓ Ô ×Ó         Ù ÓÒ ½ ½ ≡                          ´½ ½ µ
                    for (i = 0; i < 100000; i++)
                      a[i] = b[i] + c[i];
     Ø Ñ Ò Ø Ò ÙÒ ÙÖ ÓÒ ÓÒר ÒØ Ý × ÓÒ× Ö ¸ ÓÒ× Ù ÒØ Ñ ÒØ ¸ ÙÒ Ô ×Ó                  ¹
      Ù ÓÒº
           Ò ÐÑ ÒØ ¸ Ð  Ù ÓÒ × Ù Ò Ð ØÓ Ó× ÐÓ× ÐÓÕÙ × ÒØ Ö ÓÖ ×
½½    ÍÐØ ÑÓ ÑÔÐÓ Ô ×Ó        Ù ÓÒ ½ ½ ≡
                       ÑÔÐÓ ½ Ô ×Ó      Ù ÓÒ ½ ½
                       ÑÔÐÓ ¾ Ô ×Ó      Ù ÓÒ ½ ½
162                                            Cap´
                                                  ıtulo 3. Cr´
                                                             ıtica de algoritmos



                    ÑÔÐÓ ¿ Ô ×Ó      Ù ÓÒ ½ ½
                    ÑÔÐÓ Ô ×Ó        Ù ÓÒ ½ ½
Ø Ñ Ò × ÙÒ Ô ×Ó           Ù ÓÒ¸ ÔÙ × ×Ù ÙÖ ÓÒ¸ Ô × Ö ÕÙ ÓÑÔÖ Ò               Ð
ØÓ Ó× ÐÓ× ÐÓÕÙ × ÒØ Ö ÓÖ ×¸ Ø Ñ Ò × ÓÒר ÒØ º
       Ô ÖØ Ö ×Ø ÑÓÑ ÒØÓ¸ ÙÒ unidad de ejecuci´n se define como una secuencia
                                                 o
de instrucciones cuya duraci´n es constanteº ×ØÓ ÓÒÐÐ Ú ÖÖÓÖ ×¸ Ô ÖÓ Ö ÓÖ ÑÓ×
                               o
ÕÙ Ð Ø ÑÔÓ           Ù ÓÒ Ú Ö × ÙÒ Ö ÙÒר Ò × Ò × Ð Ð ÓÖ ØÑÓº Ù ÐÕÙ Ö
× Ð Ø Ñ ÒÓ Ý ×ÔÓ× ÓÒ Ð ÒØÖ ¸ ÙÒ ­Ù Ó                  Ù ÓÒ × ÑÔÖ Ø Ò Ö ÙÖ ÓÒ
 ÓÒר ÒØ        Ú Þ ÕÙ Ô × ÔÓÖ Ð ÙÒ ÒרÖÙ ÓÒ × Ù Ò Ðº Ò Ð Ñ ×ÑÓ ×Ô Ö ØÙ
    Ö ÞÓÒ Ñ ÒØÓ¸ Ù ÐÕÙ Ö × Ù Ò        ÒרÖÙ ÓÒ × ÓÒ ÙÖ ÓÒ ÓÒר ÒØ Ø Ñ Ò ×
 ÓÒ× Ö ÙÒ ÙÒ                Ù ÓÒº
      × ÑÔÓÖØ ÒØ ר Ö Ð × Ö ¬ Ó ÕÙ ÑÔÓÒ ÒÙ ×ØÖÓ ÓÒ ÔØÓ ÙÒ                        ¹
 Ù ÓÒ Ð ÓÒ× Ö Ö ÓÑÓ ÓÒר ÒØ ¸ ÐÓ ÕÙ            Ó ×¸ Ò Ð Ñ ÝÓÖ       ÐÓ× ×Ó׸ Ú Ö ¹
 Ð º Ð ÓÒ ÔØÓ ÕÙ Ô Ö ¸ ÔÓÖ ÑÔÐÓ¸ ÙÒ × Ù Ò              Þ ÒרÖÙ ÓÒ × ÓÒ ÙÒ ÙÒ
Ñ ÐÐÓÒ¸ ÔÙ × Ò Ñ Ó× ×Ó× × ÓÒÓ Ò Ð × ÓÒר ÒØ × Þ Ý ÙÒ Ñ ÐÐÓÒ¸ Ö ×Ô Ø Ú Ñ ÒØ º
Ë Ò Ñ Ö Ó¸ ר Ð ÖÓ ÕÙ ÑÙÝ ÔÖÓ Ð Ñ ÒØ Ð             Ù ÓÒ Ð ÔÖ Ñ Ö × Ù Ò ÙÖ
10 5 Ú   × Ñ ÒÓ× ÕÙ Ð × ÙÒ º Ó Ð ÓÒ Ò              Ð × Ö ¬ Ó ÒØ Ö ÓÖ¸ Ð Ú ÒØ     Ð
 ÓÒ ÔØÓ × ÕÙ Ð Ö Ø Ö ÓÒר ÒØ ÒÓ × Ô Ö ÓÒ ÐÓ Ú Ö Ð Ð ÒØÖ º Ò Ô Ð ¹
 Ö × Ñ × × ÑÔР׸ × Ù Ò ×         Ù ÓÒ ÙÝ × ÐÓÒ ØÙ × × Ò ×Ø ÒØ × Ô ÖÓ ÓÒר ÒØ ׸
× ÑÔÖ Ø Ò Ö Ò ÙÖ ÓÒ × ÓÒר ÒØ × ÕÙ ÒÓ ×ÓÒ Ø × ÔÓÖ Ð Ø Ñ ÒÓ Ð ÒØÖ º
  ×ØÓ ÙÐØ ÑÓ × ÐÓ ÔÖ Ð Ð ÓÒ ÔØÓº
3.1.2   Aclaratoria sobre los m´todos de ordenamiento
                               e
  Ò ×Ø Ô ØÙÐÓ ÒÓ× × ÖÚ Ö ÑÓ×         Ð ÙÒÓ× Ñ ØÓ Ó× ÓÖ Ò Ñ ÒØÓ Ô Ö ÐÙ×ØÖ Ö Ð
 Ò Ð××       Ð ÓÖ ØÑÓ׸ ÔÙ × ×ØÓ× ÔÐ ÒØ Ò Ò ØÙÖ ÐÑ ÒØ Ð Ø Ñ ÒÓ Ð ÒØÖ          Ò
   × Ð ÒØ              Ð Ñ ÒØÓ× ÓÖ Ò Öº Ò Ò ÙÖ ¸ Ð Ô ÖÑÙØ ÓÒ Ð × Ù Ò
    ÒØÖ Ò          Ò Ð × ÑÔ ÒÓ Ð Ñ ÝÓÖ          ÐÓ× Ñ ØÓ Ó× ÓÖ Ò Ñ ÒØÓº ÈÓÖ ×Ø
Ö ÞÓÒ¸ Ù Ò Ó × Ò Ð Þ ÙÒ Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓ¸ Ý ÕÙ ÓÒ× Ö Ö¸ ÔÓÖ ÐÓ Ò Ö Ð
 ÓÒ Ö Ø Ö Ó× ×Ø ר Ó׸ Ð ÓÖÑ Ð Ô ÖÑÙØ ÓÒº
      Ô ÖØ      ÙÒ Ö ÓÑÓ ÙÒ Ù Ò Ú ÙÐÓ           Ò× Ò ÒÞ Ô Ö Ð Ò Ð × × Ý × ÒÓ
 Ð ÓÖ ØÑÓ׸ ÐÓ× Ñ ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ×ÓÒ Ô ÖØ ÐÓ× ÓÒÓ Ñ ÒØÓ× × Ò Ð × ØÓ Ó
 Ù Ò ÔÖÓ Ö Ñ ÓÖº Ò ØÓ¸ Ð ÓÖ Ò Ñ ÒØÓ × Ù× Ò ÙÒ ÑÔÐ Ñ ÔÖÓ Ð Ñ ×
Ñ × ÓÑÔÐ Ó׺ ÈÓÖ ÑÔÐÓ¸ Ò Ö Ó׸ Ñ ØÓ ÕÙ ×ØÙ Ö ÑÓ× Ò Ð Ô ØÙÐÓ Ü ¸ Ú ×
× Ö ÕÙ Ö Ò ÓÖ Ò Ö Ö Ð ÓÒ × ÓÑÓ ÔÖ ÔÖÓ × Ñ ÒØÓ Ð ÙÒÓ× Ð ÓÖ ØÑÓ׺ ÇØÖÓ ÑÔÐÓ
ÒÓØ Ð × Ò Ù ÒØÖ Ò Ð × ÖÓÒ ÓÒÚ ÜÓ ¸ ÔÖÓ Ð Ñ                Ð ÓÑ ØÖ ÓÑÔÙØ ÓÒ Ð
ÕÙ ÓÒ× ×Ø Ò Ò ÓÒØÖ Ö ÙÒ ÔÓÐ ÓÒÓ ÕÙ ÒÚÙ ÐÚ                ÙÒ ÓÒ ÙÒØÓ ÔÙÒØÓ׺ ÍÒ
 Ð ÓÖ ØÑÓ × ÑÔÐ Ý ¬ ÒØ Ô Ö ×Ø ÔÖÓ Ð Ñ Ö ÕÙ Ö ÓÖ Ò Ö ÐÓ× ÔÙÒØÓ× × ÙÒ ×Ù×
 ÓÓÖ Ò ×º
    ÄÓ× Ñ ØÓ Ó× ÓÖ Ò Ñ ÒØÓ¸ × ÓÑÓ ÓØÖÓ× ÙØ Ð Ø Ö Ó× Ö Ð ÓÒ Ó׸ Ö × Ò Ò Ð
 Ö ÚÓ tpl sort utils.Hº
3.1.3   Ordenamiento por selecci´n
                                o
Ê Ð ÑÓ× ÒÙ ×ØÖÓ ÔÖ Ñ Ö Ò Ð × × ØÖ Ú × Ð ÒÓ ÓÒ Ô ×Ó Ù ÓÒº È Ö ÐÐÓ ÓÒ¹
× Ö ÑÓ× Ð Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓ × Ð ÓÒ¸ Ð Ù Ð ÔÙ ÔÐ ×Ñ Ö× Ô ØÓÖ Ñ ÒØ
 ÓÑÓ × Ù
3.1. An´lisis de algoritmos
            a                                                                                         163


                                                               swap[a[i], a[j])

                                                                        ×ÓÖ Ò
                     ÇÖ Ò    ×ÓÐÙØÓ                j     × i ר n − 1 Ô Ö
                                                       Ò ÓÒØÖ Ö Ð Ñ ÒÓÖ Ð Ñ ÒØÓ
                                               i                                     j

       Ò ×Ø Ð ×           Ö Ñ ¸ Ð Ö Ø Ò ÙÐÓ ÔÖ Ò Ô Ð Ö ÔÖ × ÒØ Ð ÖÖ ÐÓº ÄÓ× ×Ù ¹
     Ö Ø Ò ÙÐÓ× ÒØ ÖÒÓ× Ö ÔÖ × ÒØ Ò Ô ÞÓ× Ð ÖÖ ÐÓ ÕÙ ÓÒ ÖÒ Ò ×Ù ×Ø Ó ÓÖ ¹
     Ò Ñ ÒØÓº Ä × ­ ׸ ÙÒØÓ ÓÒ Ð ÙÒ ÒÓÑ Ö Ú Ö Ð ¸ Ò ÙÒ ÓÒØ ÓÖ Ó Ø Ö ÓÖ
      ÙÒØÓ ÓÒ ×Ù × ÒØ Ó Ø Ö ÓÒº
        ÆÙ ×ØÖ ÑÔÐ ÒØ ÓÒ Ð ÓÖ Ò Ñ ÒØÓ ÔÓÖ × Ð ÓÒ × ×ØÖÙ ØÙÖ Ð × Ù ÒØ ÑÓ Ó
      ÙÝ ÑÔÐ ÒØ ÓÒ ×
½¿    Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ ≡                                   ½¿
          template <typename T, class Compare>
      void selection_sort(T * a, const size_t & n)
      {
        for (int i = 0, min, j; i < n - 1; ++i)
          {
                Ë ÑÒ Ð Ò              Ñ ÒÓÖ ÒØÖ · ½ Ý Ò ¹ ½ ½ ¿
               if (Compare () (a[min], a[i]))
                 Aleph::swap(a[min], a[i]);
           }
      }
       Ä Ù×ÕÙ               Ð Ñ ÒÓÖ Ð Ñ ÒØÓ × Ö Ð Þ × Ù Ò ÐÑ ÒØ                   Ð × Ù ÒØ Ñ Ò Ö
½¿   Ë ÑÒ Ð Ò               Ñ ÒÓÖ ÒØÖ · ½ Ý Ò ¹ ½ ½ ¿ ≡                                  ´½ ¿ µ
      for (min = i, j = i + 1; j < n; ++j)
        if (Compare () (a[j], a[min]))
          min = j;
      Ð Ñ ÝÓÖ Óר Ð if Ò ÐÙ Ó Ò Ð ÐÓÕÙ Ë Ñ Ò Ð Ò              Ñ                          ÒÓÖ ÒØÖ    ·½Ý
     Ò ¹ ½ ½ ¿ × ÕÙ Ð ÔÖ        Ó×      ÖØÓº Ë ×Ø Ù × Ð ×Ó¸ Ð                            ÙÖ ÓÒ Ð if ÙÒ
     Ô ÖÑ Ò ÓÒר ÒØ Ñ ÒØ ÓØ º ÓÒ ÐÙ ÑÓ׸ Ô٠׸ ÕÙ Ð ÐÓÕÙ                                  ÒØÖÓ Ð for ØÓÑ
     ÙÒ ÙÒ           Ù ÓÒº ÈÓÖ ÐÓ Ø ÒØÓ¸ Ð ÐÓÕÙ Ë Ñ Ò Ð Ò                                 Ñ ÒÓÖ ÒØÖ     ·
     ½ÝÒ¹½½¿           ÙØ n − i − 1 Ô ×Ó×      Ù ÓÒ¸ Ð Ù Ð ÔÙ                            ÔÖÓÜ Ñ Ö× ¸ ÓÒ ÙÒ
     Ð ÖÓ ÖÖÓÖ¸ n − iº     ר ÑÓ Ó¸ Ð Ñ ØÓ Ó ØÓÑ
               n−2           n−1        n−1
                                                               n(n − 1)   n(n − 1)
     T (n) =         n−i=          n−         i = (n − 1)n −
                                                                  2
                                                                        =   Ù ÓÒ
                                                                             2
                                                                                         È ×Ó×
               i=0           i=1        i=1
                                                                             ´¿º½µ
       ×ØÓ ÒÓ× Ö Ú Ð ÕÙ ¸ Ò Ô Ò ÒØ Ñ ÒØ      ÕÙ Ø Ò ÑÓ× ÙÒ ÓÑÔÙØ ÓÖ ÑÙÝ Ö Ô Ó
     Ó ÑÙÝ Ð ÒØÓ¸ Ý Ñ × Ó× Ò Ö × × ÔÖ × ÒØ × Ò ¿º½º½¸ Ð Ø ÑÔÓ           Ù ÓÒ Ö
      Ù Ö Ø Ñ ÒØ × ÙÒ Ð ÒÙÑ ÖÓ         Ð Ñ ÒØÓ× ÕÙ ×Ø ÑÓ× ÓÖ Ò Ò Óº ÈÙ      Ò ÓÒ¹
     ØÖ Ö× Ð ÙÒ Ñ ØÓ Ó¸ Ó Ø ÚÓ¸ ÕÙ Ö Ø Ö Ð Ø ÑÔÓ             Ù ÓÒ¸ × Ò ÓÒ× Ö Ö ÐÓ×
      ×Ô ØÓ× Ö Ð Ø ÚÓ× Ä Ö ×ÔÙ ×Ø × ¬ÖÑ Ø Ú Ý Ð ÓÖ Ö ÑÓ× Ò Ð × Ù ÒØ ×Ù ¹× ÓÒº
           Ü Ø Ñ ÒØ Ð Ñ ×ÑÓ Ð ÓÖ ØÑÓ ÔÙ ÒרÖÙÑ ÒØ Ö× Ô Ö ÓÖ Ò Ö Ð ×Ø × Ó Ð Ñ ÒØ
      ÒÐ Þ × ÙÝÓ ÒÓ Ó         Ö ×     Ø ÔÓ Dlinkº È ÖÓ Ô Ö ÐÐÓ¸ × ÓÒÚ Ò ÒØ ÒרÖÙ¹
     Ñ ÒØ Ö ÙÒ ÖÙØ Ò ÕÙ Ù×ÕÙ Ð Ñ ÒÓÖ Ð Ñ ÒØÓ ÙÒ Ð ×Ø ÒÐ Þ
½¿    Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡                              ½¿ ½
164                                           Cap´
                                                 ıtulo 3. Cr´
                                                            ıtica de algoritmos



     template <class Compare>
 Dlink * search_min(Dlink & list)
 {
   typename Dlink::Iterator it(list);
   Dlink * min = it.get_current();
   for (it.next(); it.has_current(); it.next())
     {
       Dlink * curr = it.get_current();
       if (Compare () (curr, min))
         min = curr;
     }
   return min;
 }
 ¬Ò ×
 search min¸   Ù×   Ò ÙÒ × ½   Ò ½   º
     × ÜØÖ Ñ Ñ ÒØ ÑÔÓÖØ ÒØ ÒÓØ Ö ÕÙ Ð Ñ ØÓ Ó            ÓÖ Ò Ñ ÒØÓ Ö       Ð
Ø ÔÓ Dlink¸ × Ð Ù Ð ÒÓ × ÔÙ         ÓÒÓ Ö Ò Ö Ñ ÒØ Ð Ø ÔÓ ØÓ ÕÙ Ô ÖÑ Ø
Ö Ð Þ Ö Ð × ÓÑÔ Ö ÓÒ × ÕÙ ÓÒ Ù Ö Ò Ð ÓÖ Ò Ñ ÒØÓº ÂÙר Ñ ÒØ ¸ ר × Ð ¬Ò Ð
 Ð × Compare¸ Ð Ù Ð      ÑÔÐ ÒØ Ö Ð ÓÔ Ö ÓÖ bool Compare::operator () (Dlink
*, Dlink *) Ý ÕÙ × Ò Ö         ÓÑÔ Ö Ö Ó× ÒÓ Ó× ÔÙÒØ Ó× ÔÓÖ Ú Ö Ð × Dlink*º
ÈÓ Ö ÑÓ× ÑÔÐ ÒØ Ö Ð ÓÖ Ò Ñ ÒØÓ Ð ×Ø × Ô ÖØ Ö Ð Ø ÔÓ Dnode<T>¸ × Ù Ð
Ý ÓÒÓ Ö ÑÓ× ÙÒ Ø ÔÓ       × º È ÖÓ ×Ø     × ÓÒ Ü ÐÙ Ö Ð ÓÖ Ò Ñ ÒØÓ Ð ×Ø ×
   × × Ò ÓØÖÓ× Ù×Ó× Dlink ÔÓÖ ÑÔÐÓ¸ ×ÙÔÓÒ ÑÓ× Ð × Ù ÒØ רÖÙ ØÙÖ ÒÓ Ó
        struct Nodo
        {
          Dlink enlace_lista_1;
          Dlink enlace_lista_2;
          Dlink enlace_lista_3;
          D1 d1;
          D2 d2;
          D3 d3;
        };

     ר Ð × ÒÓ Ó ÒÓ ÔÓ Ö ÓÖ Ò Ö× ÔÓÖ ÙÒ ÖÙØ Ò Ò Ö         ÓÖ Ò Ñ ÒØÓ ×
 Ò ÙÒ Dnode<T>¸ ÔÙ × Ð Ø ÔÓ ÑÔÐÓ Nodo ÒÓ × ÙÒ Dnode<T>º Ò Ò ÙÖ ¸ Nodo
Ø Ò ØÖ × ÒÐ × ÕÙ × Ò Ò Ò Ð ×Ø × Ö ÒØ ׺ ÓÑÓ ÓÖ Ò ÑÓ× Ò Ö Ñ ÒØ
× ÙÒ Ù ÐÕÙ Ö      Ð × ØÖ × Ð ×Ø × Ä Ö ×ÔÙ ×Ø ÓÒ× ×Ø Ò Ð Ö Ð ÓÑÔ Ö ÓÒ
bool Compare::operator () (Dlink *, Dlink *)º ÈÓÖ    ÑÔÐÓ¸ × × ÑÓ× ÓÖ Ò Ö
Ð Ð ×Ø 1 × ÙÒ Ð ØÖ ÙØÓ d1¸ ÔÓ ÑÓ×       ÖÐÓ ÓÑÓ × Ù
        struct Comparar_D1
        {
          bool operator () (Dlink * l1, Dlink* l2)
          {
            Nodo * n1 = Dlink::dlink_to_Node(l1);
            Nodo * n2 = Dlink::dlink_to_Node(l2);
            return n1->d1 < n2->d1;
          }
        }

     Ò ÐÓ Ñ ÒØ ¸ ÔÓ ÑÓ× Ö Ð Þ Ö ÓÑÔ Ö ÓÒ × Ô Ö ÐÓ× Ø ÔÓ× D2 Ý D3 Ý × ÓÖ Ò Ö
ÔÓÖ ÐÓ× ÒÐ × enlace lista 2 Ý enlace lista 3º
3.1. An´lisis de algoritmos
           a                                                                      165



        ÓÒ ÐÓ ÒØ Ö ÓÖ Ò Ñ ÒØ ¸ Ð ÓÖ Ò Ñ ÒØÓ ÔÓÖ × Ð     ÓÒ × ÜÔÐ    ÔÓÖ × Ñ ×ÑÓ
½   Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡                                   ½¿ ½
          template <class Compare>
      void selection_sort(Dlink & list)
      {
        Dlink aux;
        while (not list.is_empty())
          {
            Dlink * min = search_min <Compare> (list); // menor de list
            min->del(); // saque menor de list
            aux.append(min); // ins´rtelo ordenado en aux;
                                   e
          }
        list.swap(&aux);
      }
    Í× × search min ½ ¿ º
     ר Ú Ö× ÓÒ ÜÔÖ × Ñ ÓÖ Ð ÔÖ Ò Ô Ó Ð Ñ ØÓ Ó Ù× Ö Ð Ñ ÒÓÖ Ð Ñ ÒØÓ Ò× ÖØ ÖÐÓ
     Ò ÙÒ Ð ×Ø º Ä Ð ×Ø Ö ×ÙÐØ ÒØ ר Ö ÓÖ Ò º Ð Ñ ØÓ Ó × Ð Ñ ×ÑÓ ÕÙ ÔÐ ÑÓ×
     Ù Ò Ó ÓÖ Ò ÑÓ× Ö ×º
        Ð Ù× Ö
       bool Compare::operator () (Dlink *, Dlink *)


         ÓÑÓ Ö Ø Ö Ó Ò Ö Ð ÓÑÔ Ö ÓÒ ÔÖ Ø Ò × ÖÚ Ö Ô Ö ØÓ × Ð × Ö ÙÒר Ò ×
    ÓÖ Ò Ñ ÒØÓ Ð ×Ø × ÒÐ Þ ×º Ë Ò Ñ Ö Ó¸ Ò Ð Ñ ÝÓÖ        Ð × Ö ÙÒר Ò ×¸ ×
    ØÖ Ø Ö ÓÖ Ò Ö ÙÒ Ð ×Ø       Dnode<T>¸ Ò Ð Ù Ð × × ÓÒÓ Ð Ø ÔÓº È Ö Ò ÙÐÞ Ö
     Ð ×ÙÒØÓ¸ × Ò Ö ÑÓ× Ð Ú Ö× ÓÒ Ò Ö
       bool Compare::operator () (Dnode<T> *, Dnode<T> *)

      Ð Ù Ð × Ö Ð Ö Ø Ö Ó ÓÑÔ Ö ÓÒ ÔÓÖ ÓÑ × ÓÒ
½   Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡                                   ½   ½
          template <typename T, class Compare>
      class Compare_Dnode
      {
        bool operator () (Dlink * l1, Dlink * l2) const
        {
          Dnode<T> * n1 = static_cast<Dnode<T>*>(l1);
          Dnode<T> * n2 = static_cast<Dnode<T>*>(l2);
          return Compare () (n1->get_data(), n2->get_data());
        }
      };
      ¬Ò ×
      Compare Dnode¸   Ù×   Ò ÙÒ × ½   Ò ½   º
    Í× × Dnode º
        ר ÑÓ Ó¸ ÔÓ ÑÓ× ÜÔÓÖØ Ö ÙÒ ×Ô Ð Þ ÓÒ selection sort() ÕÙ ÓÒ× Ö
    ÙÒ Ö Ø Ö Ó ÓÑÔ Ö ÓÒ ÐÓ× ÓÒØ Ò Ó× ÐÓ× ÒÓ Ó×
½    Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡                      ½    ½
          template <typename T, class Compare>
      void selection_sort(Dnode<T> & list)
      {
166                                                    Cap´
                                                              ıtulo 3. Cr´
                                                                         ıtica de algoritmos



          selection_sort < Compare_Dnode<T, Compare> > (list);
      }
    Í× × Compare Dnode ½        Ò    Dnode   º

    3.1.4    B´squeda secuencial
              u
      ÒØ × Ô × Ö ×ØÙ Ö ÙÒ ÓÖÔÙ× Ó Ø ÚÓ Ô Ö Ò Ð Þ Ö Ð ÓÖ ØÑÓ׸ ÔÖ × ÒØ ÑÓ× ÙÒÓ
    ÐÓ× ×Ô ØÓ× ÕÙ Ñ ÒÙ Ó ÓÑÔÐ Ò Ð Ò Ð × × Ó × Ð ÓÒ ÙÒ Ð ÓÖ ØÑÓ× Ð Þ Öº È Ö
     ÐÐÓ¸ ÒÓ× Ú Ð Ö ÑÓ× ÙÒÓ ÐÓ× Ð ÓÖ ØÑÓ× Ñ × × ÑÔР׸ ÔÓÔÙÐ Ö × Ý ÙØ Ð × Ð Ù×ÕÙ
    × Ù Ò Ðº ÓÑ Ò ÑÓ× ÔÓÖ ÙÒ ÖÖ ÐÓ¸ ÙÝ Ù×ÕÙ ÔÙ ÔÐ ×Ñ Ö× ¸ × Ò Ò ×
         ÜÔÐ ÓÒ ÔÖ Ú ¸ Ð × Ù ÒØ Ñ Ò Ö
½    Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡                                ½    ½
          template <typename T, class Equal> inline
      int sequential_search(T * a, const T & x, const int & l, const int & r)
      {
        for (int i = l; i <= r; i++)
          if (Equal () (a[i], x)) return i;
        return Not_Found;
      }
      ¬Ò ×
      sequential search¸   Ù×       Ò ÙÒ × ½ ¸ ¿ ¸ ½ ¸ Ò ½ º
         sequential search() Ù× × Ù Ò ÐÑ ÒØ Ò Ð ÖÖ ÐÓ a¸ ÒØÖ ÐÓ× Ò            × l Ý r¸
     Ð Ð Ñ ÒØÓ xº Ë Ð Ù×ÕÙ          × Ü ØÓ× ¸ ÒØÓÒ × × Ö ØÓÖÒ Ð Ò        ÓÒØ ÒØ ÚÓ Ð
     Ð Ñ ÒØÓ ÐÓ ÓÒØÖ Ö Ó¸ × Ö ØÓÖÒ Not Foundº
         sequential search() ÑÔÐ      ÓÑÓ Ö Ø Ö Ó     ÙÐ      Ð ÓÔ Ö ÓÖ () Ð Ð ×
    Ô Ö Ñ ØÖ Þ Equalº
            Ù ÒØÓ× Ô ×Ó×      Ù ÓÒ ÓÒ×ÙÑ ×Ø Ð ÓÖ ØÑÓ Ä ×ÙØ Ð Þ ×Ù Ò Ð × × × ÕÙ
    Ð ÙÖ ÓÒ              Ù ÓÒ Ô Ò       Ó× ØÓÖ × ´½µ Ð Ô ÖÑÙØ ÓÒ Ð ÖÖ ÐÓ a Ý ´¾µ
       Ð Ú ÐÓÖ     Ù×ÕÙ xº
         Î ÑÓ×ÐÓ × Ð Ô Ö×Ô Ø Ú Ð Ú ÐÓÖ xº Ë x ÒÓ ×Ø ÓÒØ Ò Ó Ò Ð ÖÖ ÐÓ¸
     ÒØÓÒ ×¸ Ò Ô Ò ÒØ Ñ ÒØ Ð Ô ÖÑÙØ ÓÒ¸ Ð for ×             ÙØ Ö ÓÑÔÐ Ø Ñ ÒØ ¸ Ö ÞÓÒ
    ÔÓÖ Ð Ù Ð Ð Ð ÓÖ ØÑÓ ÓÒ×ÙÑ r − l = n Ô ×Ó×         Ù ÓÒº ÐÓ ÓÒØÖ Ö Ó¸ ÒØÓÒ ×¸
    Ð ÙÖ ÓÒ Ô Ò Ö              Ð Ô ÖÑÙØ ÓÒ ×Ô ¬ Ñ ÒØ ¸ Ð ÔÓ× ÓÒ Ò ÓÒ ×
     Ò Ù ÒØÖ x ÒØÖÓ Ð ÖÖ ÐÓº Ë × Ò Ù ÒØÖ Ò Ð ÔÖ Ñ Ö ÔÓ× ÓÒ¸ ÒØÓÒ × Ð ÙÖ ÓÒ
     × ÙÒ Ô ×Ó         Ù ÓÒº Ë × × Ò Ù ÒØÖ Ò Ð ÙÐØ Ñ ÒØÓÒ × ×ÓÒ n − 1º Ù Ð × Ó Ö
    ÆÓ ÐÓ × ÑÓ׸ Ô ÖÓ × ÔÓ ÑÓ× Ø Ò Ö ÙÒ ÜÔ Ø Ø Ú          ÐÓ ÕÙ Ú ×Ù Ö Ý ×Ø Ð
     ÜÔÖ × Ð ÓÒ ÔØÓ ×Ô Ö ÒÞ ×Ø ר º
         Ë Ð Ô ÖÑÙØ ÓÒ × Ð ØÓÖ ¸ ÒØÓÒ × Ð ×Ô Ö ÒÞ × Ö ÔÓÖ Ð ÒØÖÓº Ä ÙÖ ÓÒ
     ×Ô Ö × Ö l+r º 2
          ÙÐÑ Ò ÑÓ× ×Ø × ÓÒ ÓÒ Ð × Ú Ö× ÓÒ × Ò Ö × Ð Ù×ÕÙ ×Ó Ö Ð ×Ø ×
½    Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡                                  ½   ½
          template <typename T, class Equal> inline
      Dnode<T> * sequential_search(Dnode<T> & list, const T & x)
      {
        for (typename Dnode<T>::Iterator it(list); it.has_current(); it.next())
          {
            Dnode<T> * curr = it.get_current();
            if (Equal () (curr->get_data(), x))
3.1. An´lisis de algoritmos
           a                                                                      167



                return curr;
            }
          return NULL;
      }
    Í× × Dnode           Ò   sequential search   ½       º
           ×        Ð
                  ÔØ Ö ×Ø × Ù×ÕÙ × Ð Ì Dlist<T>º Ì Ñ Ò ÔÙ Ò Ù× Ö× Ô Ö Ð
    Ø ÔÓ DynDlist<T>¸ Ô ÖÓ Ö ÕÙ ÒØ ÖÚ Ò Ö ÒØ ÖÒ Ñ ÒØ º ÈÓÖ ÐÐÓ¸ Ú Ð Ð Ô Ò Ó Ö Ö
    ÙÒ ÒØ Ö Þ       Ù×ÕÙ ×Ó Ö DynDlist<T>
½    Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡                            ½     ½
          template <typename T, class Equal> inline
      T * sequential_search(DynDlist<T> & list, const T & x)
      {
        Dnode<T> * ret = sequential_search<T, Equal >(static_cast<Dnode<T>&>(list), x);
        return ret != NULL ? &ret->get_data() : NULL;
      }
    Í× × Dnode          ¸ DynDlist ¿ ¸ Ò   sequential search     ½   º

    3.1.5       Implantaci´n del problema fundamental mediante DynArray<T>
                          o
    ÉÙ Þ Ð Ñ Ò Ö Ñ × × ÑÔÐ Ý Ú Ö× Ø Ð ÒרÖÙÑ ÒØ Ö Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð ¬Ò Ó
     Ò Ü ½º¿ ´Ô Ò ½ µ × Ñ ÒØ Ð Ø ÔÓ DynArray<T>º Ò ×Ø ×Ó¸ ØÖ Ò× ÑÓ× ÔÓÖ ÙÒ
     ÖÖ ÐÓ ×ÓÖ Ò Ó ÕÙ ÔÙ Ö Ö Ý Ö Ö Ò Ñ Ñ ÒØ º Ä Ú ÒØ                Ð ×ÓÖ Ò
     × ÕÙ ÒÓ Ö ÕÙ Ö ÑÓ× Ö Ö Ý ÖÖ Ö Ö × ÒØ Ò× Ö ÓÒ × Ý Ð Ñ Ò ÓÒ ×º Ä ×Ú ÒØ
     × ÕÙ Ð Ù×ÕÙ          × Ö× Ù Ò Ð
½   ØÔÐ ÝÒ ÖÖ Ý × ØºÀ ½ ≡
          template <typename T, class Equal = Aleph::equal_to<T> >
      class DynArray_Set : public DynArray<T>
      {
      public:
        T & insert(const T & item)
        {
           (*this)[this->size()] = item;
           return this->access(this->size() - 1);
        }
        T * search(const T & item)
        {
           int i = Aleph::sequential_search<T, Equal>(*this, item, 0, this->size() - 1);
           return (i >= 0 and i < this->size()) ? &this->access(i) : NULL;
        }
        void remove(T & item)
        {
           item = access(this->size() - 1);
           this->cut(this->size() - 1);
        }
      };
    Í× × DynArray ¾ Ò          sequential search     ½       º
    Ä ÖÙØ Ò sequential search() Ö Ð Þ ¸ ÓÑÓ ÓÑÓÒ Ñ Ñ ÒØ × Ò¬ Ö ¸ ÙÒ Ù×ÕÙ
    × Ù Ò Ð ×Ó Ö Ð ÖÖ ÐÓ Ò Ñ Ó º
          Î ×   Ü   ¿º½º ´Ô Ò ½ µ Ô Ö Ñ × Ø ÐÐ ×
168                                           Cap´
                                                     ıtulo 3. Cr´
                                                                ıtica de algoritmos



    3.1.6    B´squeda de extremos
              u
    ÍÒ ×Ó ×Ô Ð Ð Ù×ÕÙ          × Ð Ø ÖÑ Ò ÓÒ ÙÒ Ú ÐÓÖ ÜØÖ ÑÓ ÙÒ × Ù Ò
     × Ö¸ Ð Ú ÐÓÖ Ñ Ò ÑÓ Ó Ñ Ü ÑÓº ØÖ Ú × Ð Ð ×      ÓÑÔ Ö ÓÒ Ò Ö ¸ רÓ
    ÔÙ Ö ×ÓÐÚ Ö× ¸ Ô Ö ÖÖ ÐÓ׸ Ð × Ù ÒØ ÑÓ Ó
½    Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡                        ½    ½
          template <typename T, class Compare> inline
      int search_extreme(T * a, const int & l, const int & r)
      {
        T extreme_index = l;
        for (int i = l + 1; i <= r; i++)
          if (Compare () (a[i], a[extreme_index])) // ¿se ve un nuevo menor?
            extreme_index = i; // s´
                                   ı
        return extreme_index;
      }
       search extreme() Ù× Ð Ð Ñ ÒØÓ ÜØÖ ÑÓ × ÙÒ Ð Ö Ø Ö Ó           ÓÑÔ Ö ÓÒ
    Compareº Ë Ò Ñ Ö Ó¸ ÓÒ ×Ø × ÒØ Ü × ÒÓ ÕÙ × Ñ ÒØ Ñ ÒØ Ð ÖÓ ÕÙ × ØÖ Ø
    Ù× Ö Ð Ñ Ò ÑÓ Ó Ð Ñ Ü ÑÓº È Ö Ð Ö ¬ Ö Ð ×ÙÒØÓ¸ Ù× Ö ÑÓ× Ó× ×Ø ÒØ × ÙÒ ÓÒ ×
½   Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡                             ½   ½
          template <typename T> inline
      int search_min(T * a, const int & l, const int & r)
      {
        return search_extreme<T, Aleph::less<T> > (a, l, r);
      }
          template <typename T> inline
      int search_max(T * a, const int & l, const int & r)
      {
        return search_extreme<T, Aleph::greater<T> > (a, l, r);
      }
    Í× × search min ½ ¿ º
          ÙÐ ×Ð       Ö Ò ÓÒ Ð Ù×ÕÙ Ô ÖØ ÙÐ Ö ÕÙ ×ØÙ ÑÓ× Ò Ð ×Ù ¹× ÓÒ
    ÔÖ     ÒØ Ä ×ØÖÙ ØÙÖ × ÔÖ Ø Ñ ÒØ Ð Ñ ×Ñ ÙÒ Ð ÞÓ r − l = n Ô ×Ó× Ð               ¹
    ÖÒ Ö          Ò Ð Ø Ò ÓÒº È Ö ÙÒ Ô ÖÑÙØ ÓÒ Ð ØÓÖ ¸ Ð Ù×ÕÙ          Ü ØÓ× × ÔÖÓ¹
    ÔÓÖ ÓÒ Ð n Ò ÔÖÓÑ Ó¸ Ñ ÒØÖ × ÕÙ Ð Ù×ÕÙ           ÙÒ ÜØÖ ÑÓ Ö ÕÙ Ö ¸ × ÑÔÖ ¸ ܹ
     Ñ Ò Ö Ð ØÓØ Ð       Ð × Ù Ò º ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð ÙÖ ÓÒ search extreme()
     × ÔÖÓÔÓÖ ÓÒ Ð n Ô Ö ØÓ Ó× ÐÓ× ×Ó׺
        È Ö ÓÑÔÐ Ø Ö ×Ø ×Ù ¹× ÓÒ¸       ÑÓ× ÔÖÓ Ö Ñ Ö search extreme() Ô Ö Ð × Ð ×Ø ×
       × × Ò Dlink¸ ÐÓ ÕÙ ÔÐ ÒØ Ð × Ù ÒØ ÑÓ Ó
½    Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡                               ½    ½
          template <class Compare> inline
      Dlink * search_extreme(Dlink * list)
      {
        typename Dlink::Iterator it(*list);
        Dlink * curr_min = it.get_current();
        for (it.next(); it.has_current(); it.next())
          {
            Dlink * curr = it.get_current();
            if (Compare () (curr, curr_min))
              curr_min = curr;
3.1. An´lisis de algoritmos
       a                                                                          169



       }
     return curr_min;
 }
 ר ÙÒ ÓÒ × ×Ô          Ð Þ Ô Ö Ð Ö ×ØÓ      Ð× Ð××      Ð     Ö ÖÕÙ   ÖÚ   ×   Dlinkº

3.1.7   Notaci´n O
              o
Ä ÒÓ ÓÒ Ô ×Ó        Ù ÓÒ ÒÓ× Ô ÖÑ Ø Ó Ò ÓÒØÖ Ö ÙÒ ÔÖÓÜ Ñ ÓÒ Td(n) Ô               Ö Ð
ÓÖ Ò Ñ ÒØÓ ÔÓÖ × Ð ÓÒº ÙÐÐ ¸ Ò Ð ÓÕÙ         Ð × ÒÑ Ò×     × Td(n)¸ ÔÓ            ÑÓ×
 Ò ÓÒØÖ Ö ÙÒ Ô ØÖÓÒ ÓÒר Ò      Ö     ÐÓ ÕÙ     ¸ ÒÐ      Ù ÓÒ ÓÒ Ö Ø              ÙÒ
 Ð ÓÖ ØÑÓ¸ × Ñ ÓÑÓ Ú Ö Ð º Ò Ð ÓÖ ÞÓÒØ            ÕÙ ÐÐ Ð Ò ¸ Ø Ò × ÒØ            ÓÐ
× Ù ÒØ ¬Ò ÓÒ
Definici´n 3.1 (Notaci´n O) Ë Ò Ó× ÙÒ ÓÒ
         o           o                       × T (n) Ý F(n)º ÒØÓÒ ×¸ ×           ÕÙ
T (n) × O(f(n))¸ ÒÓØ Ó ÓÑÓ T (n) = O(f(n))¸ ×Ý ×ÓÐÓ × ∃ c, n1 | T (n) ≤ cn2 , n ≥ n1º
    Ù Ò Ó ÑÓ× ÕÙ T (n) = O(f(n)) ר ÑÓ× ÔÖÓÜ Ñ Ò Ó Ð ÓÑÔÓÖØ Ñ ÒØÓ T (n)
  ÙÒ ÙÒ ÓÒ Ö ÒØ ݸ Ô Ö ÕÙ Ø Ò × ÒØ Ó ÔÖ Ø Ó¸ Ñ × × Ò ÐÐ º ¬ÖÑ ÑÓ׸ ÔÓÖ
   ÑÔÐÓ¸ ÕÙ T (n) = n2 +n+1 = O(n2)º Ë ×ØÓ × ÓÖÖ ØÓ¸ ÒØÓÒ × ∃ c, n1 | T (n) ≤ cn2º
Ë Ð ÓÒ ÑÓ× c = 1 ÒØ ÒØ ÑÓ× ÑÓ×ØÖ Ö Ð ¬ÖÑ ÓÒº
   È Ö ÔÖÓ Ö ÕÙ n2 + n + 1 = O(n2) ÔÐ ÒØ ÑÓ× Ð Ò Ù ÓÒ n2 + n + 1 ≤ cn2, n ≥
n1 =⇒ (1 − c)n2 + n + 1 ≤ 0º ÄÓ ÕÙ ÖÖÓ   ÓÑÓ Ö ×
                                     −1 ±     1 − 4(1 − c)
                                n=                         .
                                            2(1 − c)
Ë ×Ð    ÓÒ ÑÓ× c = 7/4 Ø Ò ÑÓ× ÓÑÓ Ö × n0 = −2/3, n1 = 2º × Ô٠׸ c =
7/4, n1 = 2 ÓÒ¬ÖÑ Ò ÕÙ n2 + n + 1 = O(n2)º
      ÑÓ×ØÖ Ö ÕÙ T (n) = O(f(n)) Ô Ö Ð ÙÒ ÙÒ ÓÒ f(n) ÒÓ ÑÔÐ ÕÙ ÒÓ Ü ×Ø Ò
ÓØÖ × ÙÒ ÓÒ × ÕÙ × Ø × Ò Ð ¬Ò ÓÒº            Ó¸ × ÔÓ× Ð    Ö ÕÙ Ý Ñ ÓÖ ×
 ÙÒ ÓÒ × ÕÙ ÓØÖ ×º ÈÓÖ ÑÔÐÓ¸ ×ÓÒ ÑÓ×ØÖ Ð × Ð × × Ù ÒØ × ¬ÖÑ ÓÒ ×
                                     n
                                           i2 = O(n4)                            ´¿º¾µ
                                     i=1
                                      n
                                           i2 = O(n3)                            ´¿º¿µ
                                     i=1
                                      n
                                           i2 = O(n2)                            ´¿º µ
                                     i=1

Ô ÖÓ Ð ÙÐØ Ñ ¬ÖÑ ÓÒ × Ð Ñ × ÔÖ × Ð × ØÖ ׺
    ÈÙ ×ØÓ ÕÙ Ý Ó× Ò Ó Ò Ø × ´c, n1µ Ý ÙÒ ×ÓÐ × Ù Ð ¸ ÑÓ×ØÖ Ö T (n) =
O(f(n)) ÔÙ      ×Ö  Ð Ò Ð ÙÒÓ× ×Ó× Ñ Ø Ñ Ø Ó׸ Ô ÖÓ¸ ÔÓÖ ÐÓ Ò Ö Ð Ò Ð Ò Ð × ×
     Ð ÓÖ ØÑÓ׸ Ð ÑÓ×ØÖ ÓÒ × × Ò ÐÐ º Ò Ð ÙÒÓ× ×Ó׸ ÔÙ × Ö ÙØ Ð ÔÖ ¬ Ö ÙÒ
Ú ÐÓÖ Ð ÓÒר ÒØ c Ý Ö ×ÓÐÚ Ö
                             Ð →∞ T (n) − c f(n) ≤ 0
                            n−
                               Ñ                                       ´¿º µ
   Ä ¬ÖÑ ÓÒ T (n) = O(f(n)) ×ÓÐÓ Ø Ò           ÙÒ Ö ÓÒ Ö ×Ô ØÓ Ð Ù Ð º          No es
correcto decir O(f(n)) = T (n)¸ ÔÙ × ÒÓ Ö     ­ Ð × ÙÐ        Ð ¬Ò ÓÒº
170                                               Cap´
                                                     ıtulo 3. Cr´
                                                                ıtica de algoritmos



   ÄÓ ÓÒ Ó Ù Ò Ó × ¬ÖÑ ÕÙ T (n) = O(f(n)) × ÕÙ f(n) ÓØ × ÒØÓØ Ñ ÒØ
Ð ÙÒ ÓÒ T (n)º Ò Ú Ð × ÒØÓØ Ó¸ Ð Ñ ÓÖ ÔÖÓÜ Ñ ÓÒ × ÕÙ Ð × ÒØÓØ        f(n) ×
Ô Ö Ð Ð Ð T (n)º À Ý ×Ó× Ò ÕÙ × ÔÙ        ÑÓ×ØÖ Ö ÕÙ f(n) ÒÓ × × ÒØÓØ Ñ ÒØ
Ô Ö Ð Ð T (n) Ý ×ØÓ × ÜÔÖ × Ñ ÒØ Ð × Ù ÒØ ¬Ò ÓÒ
Definici´n 3.2 (Notaci´n o) Ë Ò Ó× ÙÒ ÓÒ × T (n) Ý F(n)º ÒØÓÒ ×¸ ×
         o            o                                                            ÕÙ
T (n) × o(f(n))¸ ÒÓØ Ó ÓÑÓ T (n) = o(f(n))¸ × Ý ×ÓÐÓ × ∃c, n1 | T (n) < cf(n) , n ≥ n1º


                               cT (n)




                                                g(n)

                                                                  f(n)




                      T (n)




                                    n1                       n2           n



                                                × ÒØÓØ ×




           ÙÖ ¿º¾      ÑÔÐÓ Ò Ö Ð        ÙÒ ÓÒ × ÕÙ ×      ÓØ Ò × ÒØÓØ Ñ ÒØ
    Ä           ×ØÙ Ö ÙÒ Ð ÓÖ ØÑÓ Ñ ÒØ ÓÔ Ö ÓÒ × O × Ó Ø Ò Ö Ð ÔÖÓÜ Ñ ÓÒ
 × ÒØÓØ Ñ × Ö Ò Ð Ø ÑÔÓ                 Ù ÓÒº ÈÓ ÑÓ× ØÖ    Ö ÓÒ ÙÒ ÔÖÓÜ Ñ ÓÒ
Ý ÒÓ ÓÒ ÙÒ Ö ×ÙÐØ Ó Ü ØÓ ÔÓÖÕÙ ÐÓ ÕÙ ÒÓ× ÓÒ ÖÒ × Ð Ø Ò Ò               T (n) Ò Ð
 Ð ÓÖ ØÑÓ Ò × ¸ × Ò ÓÒ× Ö Ö ÐÓ× Ø ÐÐ × ×Ù Ø ÚÓ× Ö ÙÒר Ò Ð × Ô ÖØ Ò ÒØ × Ð Ø ÔÓ
   Ö Û Ö ¸ ÓÑÔ Ð ÓÖ¸ Ý ÓØÖÓ× ØÓÖ × ÔÖ Ú Ñ ÒØ Ñ Ò ÓÒ Ó׺ ÈÓ ÑÓ׸ Ô٠׸ ×ÙÑ Ö
ÕÙ Ð ÓÒר ÒØ c ×ØÖ Ð × Ö Ò × Ö ÙÒר Ò Ð ×                 Ù ÓÒº Ä × Ö Ò ×
  × ÑÔ ÒÓ        × ÔÓÖ ÓØÖÓ× ØÓÖ × Ö ÔÖ × ÒØ Ò Ö ÒØ × ÓÒר ÒØ × ÙÝÓ Ú ÐÓÖ ÒÓ ÒÓ×
 ÓÒ ÖÒ º Ò Ð Ñ ×ÑÓ × ÒØ Ó¸ Ð ÓÖÑ Ü Ø T (n) ÒÓ × Ö Ð Ú ÒØ ¸ × ÒÓ Ð Ø Ò Ò
 × ÒØÓØ     Ô ÖØ Ö Ð ÓÒר ÒØ n1º
      Ò Ð ÙÒÓ× ×Ó׸ ÔÙ Ò ÓÒÚ Ò ÖÒÓ× Ð × ¬Ò ÓÒ × Ô Ö ÐÓ× ÕÙ Ú Ð ÒØ × Ò Ö ÓÖ ×
    O(f(n)) Ý o(f(n)) ×     Ö¸ × ÒØÓØ × ÕÙ ×Ø Ò ÔÓÖ     Ó T (n)º
Definici´n 3.3 (Notaci´n Ω) Ë Ò Ó× ÙÒ ÓÒ × T (n) Ý F(n)º ÒØÓÒ ×¸ ×
        o            o                                                          ÕÙ
T (n) × Ω(f(n))¸ ÒÓØ Ó ÓÑÓ T (n) = Ω(f(n))¸ × Ý ×ÓÐÓ × ∃c, n1 | T (n) ≥ cf(n) , n ≥
n1º
3.1. An´lisis de algoritmos
       a                                                                                   171



Definici´n 3.4 (Notaci´n ω) Ë Ò Ó× ÙÒ ÓÒ × T (n) Ý F(n)º ÒØÓÒ ×¸ ×
         o           o                                                            ÕÙ
T (n) × ω(f(n))¸ ÒÓØ Ó ÓÑÓ T (n) = ω(f(n)) × Ý ×ÓÐÓ × ∃c, n1 | T (n) > cf(n) , n > n1º

   ÈÖ Ò      Ö ÕÙ Ð ÔÖÓÜ Ñ ÓÒ × ÒØÓØ                 O(f(n))         × ÔÖÐÐ   T (n)   ÒÙÒ ÑÓ×
Ð × Ù ÒØ     ¬Ò ÓÒ
Definici´n 3.5 (Notaci´n Θ) Ë Ò Ó× ÙÒ ÓÒ × T (n) Ý F(n)º ÒØÓÒ ×¸ ×
         o           o                                                                     ÕÙ
T (n) × Θ(f(n))¸ ÒÓØ Ó ÓÑÓ T (n) = Θ(f(n))¸ × Ý ×ÓÐÓ × T (n) = O(f(n))                Ý T (n) =
Ω(f(n))º ÈÓ ÑÓ×      Ö¸ Ø Ñ Ò¸ T (n) = Θ(f(n)) ⇐⇒ T (n) = O(f(n))                     Ý f(n) =
O(T (n))º

    Ä ¬ ÙÖ ¿º¾ Ô ØÓÖ Þ T (n) Ý Ð ÙÒ × ÙÒ ÓÒ × ÕÙ Ð ÓØ Ò × ÒØÓØ Ñ ÒØ ¸ ÔÓÖ
     Ó Ý ÔÓÖ ÖÖ º
    Á ÒØ ¬ÕÙ ÑÓ׸ Ò ÔÖ Ñ Ö ÐÙ Ö¸ Ð ÙÒ ÓÒ T (n)¸ Ð Ù Ð × Ö        ÔÓØ Ø Ñ ÒØ
 Ð Ø ÑÔÓ          Ù ÓÒ ÙÒ Ð ÓÖ ØÑÓº Ò Ð ¬ ÙÖ ¸ Ð ÙÒ ÓÒ g(n) ר ÔÓÖ Ò Ñ
    T (n) Ô Ö ØÓ Ó n ≥ n1 ×      Ö¸ T (n) = o(g(n))º Ä ¬Ò ÓÒ o ¿º¾ ÒÓ× Ô ÖÑ Ø
ÑÙÐØ ÔÐ Ö T (n) ÔÓÖ Ð ÙÒ ÓÒר ÒØ c ÑÓ Ó ÕÙ T (n) × Ñ ÝÓÖ ÕÙ g(n)º È ÖÓ ×ØÓ
 × ÖÖ Ð Ú ÒØ Ò Ð ÓÕÙ         ÐÓ Ò¬Ò ØÓ¸ ÔÙ × Ð Ô Ò ÒØ g(n) ´Ú Ò× ×Ù× ÔÙÒØÓ×
 ÓÖØ µ × Ñ ÝÓÖ ÕÙ Ð T (n)º ÓÒ× Ù ÒØ Ñ ÒØ ¸ ÒÓ ÑÔÓÖØ Ù ÒØ × Ð ÒÓÖÑ
   Ð ÓÒר ÒØ ¸ Ò Ð ÙÒ Ð Ò ¸ g(n) × ÑÔÖ ×Ó Ö Ô × Ö T (n)º
       Ð Ñ ×ÑÓ ×Ø ÐÓ Ö ÞÓÒ Ñ ÒØÓ ÔÙ Ù× Ö× Ô Ö ÓÒר Ø Ö T (n) = ω(f(n))º Ò Ð
 ÓÖ ÞÓÒØ ÐÓ× Ö Ò × ÒÙÑ ÖÓ׸ T (n) ×Ó Ö Ô × Ö f(n)º
         ÓÖ ×Ø ÑÓ× ÔÖ Ô Ö Ó× Ô Ö ÓÑÔÖ Ò Ö Ð × ÒØ Ó Ð ÓÒ ÔØÓ Θ¸ Ð Ù Ð ÔÙ
 ÔÖ Ö× Ò Ð ¬ ÙÖ ¿º¿º




                                                     c 1 f(n)

                     T (n)




                                         c 2 f(n)


                                                                × ÒØÓØ ×


                                    n1



                ÙÖ ¿º¿       ÑÔÐÓ Ò Ö Ð             ÙÖÚ × ÒØÓØ Ñ ÒØ Ô Ö Ð Ð
    Ç × ÖÚ ÑÓ× ÔÖ Ñ ÖÓ Ð ÙÖÚ c2f(n)¸ ÙÝ × ÒØÓØ × Ô Ö Ð Ð Ð T (n)º ÍÒ ÖØÓ
Ú ÐÓÖ ÓÒר ÒØ c2        ÕÙ T (n) = Ω(f(n))º ÓÖ Ò¸ ר Ö ÓÒ ÑÙÐØ ÔÐ Ö f(n)
ÔÓÖ ÙÒ ÓÒר ÒØ c1 > c2 Ô Ö ÕÙ T (n) = O(f(n))º ÈÓÖ Ø ÒØÓ¸ T (n) = Θ(f(n))
172                                                    Cap´
                                                          ıtulo 3. Cr´
                                                                     ıtica de algoritmos



3.1.7.1    Algebra de O
           ´

 Ò Ð ÑÙÒ Ó ÐÓ Ò¬Ò ØÓ¸ ÐÓ ÕÙ        Ð    Ö Ò × Ð Ø Ò Ò ÕÙ ÐÐ Ú Ð ÙÖÚ º
ËÙÑ × Ý ÔÖÓ Ù ØÓ× ÓÒר ÒØ × ×ÓÒ × ÖØ Ð × Ò Ð ÓÑ Ò Ó Ð ÒÓØ ÓÒ Oº רÓ
ÔÓ× Ð Ø ÙÒ Ð Ö ×Ó Ö Ð ÒÓØ ÓÒ O ÕÙ × ÑÔÐ ¬ ÓÒ× Ö Ð Ñ ÒØ Ð Ò Ð × ×
   ÙÒ Ð ÓÖ ØÑÓº È Ö ÐÐÓ¸ Ô ÖÑ Ø × ÒÓ× ÒÙÒ Ö Ð × × Ù ÒØ × Ö Ð × × ×¸ ÙÝ ×
  ÑÓ×ØÖ ÓÒ × × Ð Ò        Ö Ó×
                             O(f(n)) + O(g(n)) = O(Ñ           Ü(f(n), g(n)))      ´¿º µ
                                       c O(f(n)) = O(f(n))                         ´¿º µ
                                      O(O(f(n))) = O(f(n))                         ´¿º µ
                               O(f(n)) O(g(n)) = O(f(n) g(n))                      ´¿º µ
                                     O(f(n) g(n)) = f(n) O(g(n))                  ´¿º½¼µ
                T (n) = n + n
                         k     k−1
                                     + · · · + n + c = O(nk)                      ´¿º½½µ
                                           ÐÓ   k
                                                    n = O(n)                      ´¿º½¾µ
     Ò Ó × ÓÒ × Ø Ò ÑÓ× ÕÙ ÓÑÔ Ö Ö ÙÒ ÓÒ × ÓÒ Ð Ó ØÓ   Ø ÖÑ Ò Ö Ù Ð × Ð
Ñ ÝÓÖº       ØÓ× Ð Ö ÓÖ¸ Ó × Ð ÓÑÔ Ö ÓÒ ×    Ð ×Ø Ð Ö¸ ÔÐ ÒØ ÑÓ× Ð Ö Ó
Ó Ö ÞÓÒ ÒØÖ Ð × ÙÒ ÓÒ × ÓÑÓ Ö Ø Ö Ó ÓÑÔ Ö ÓÒ Ý ÓÒ× Ù ÒØ      × ÓÒº   ר
ÑÓ Ó                             ⎧
                                     ⎪0 =⇒
                                     ⎪               f(n) = o(g(n))
                                     ⎨
                          ÐÑ   f(n)
                                    = ∞ =⇒
                               g(n) ⎪
                                                     g(n) = o(f(n))               ´¿º½¿µ
                        n→∞          ⎪
                                     ⎩c =⇒           f(n) = Θ(g(n))


3.1.7.2    An´lisis de algoritmos mediante O
             a

 ÓÑÓ Ý ÖØÓ ÐÓ ÑÓ× Ö Ð Ó¸ Ò ÔÖÓ Ö Ñ ÓÒ Ð ¬Ò Ù ÒØ × ØÓ Ó × × Ù Ò º
 Ò Ð Þ Ö ÙÒ Ð ÓÖ ØÑÓ Ö ÕÙ Ö ¸ ÒØÓÒ ×¸ Ó × ÒÖÓÐÐ Ö Ð Ñ Ü Ñ × Ù Ò    Ù ÓÒ
ÔÓ× Ð ¸ Ó × ÒÖÓÐÐ Ö Ð × Ù Ò              Ù ÓÒ ÔÖÓ Ð º
   È Ö ÒØ Ò Ö Ð × ÒØ Ó          × ÒÖÓÐÐ Ö ¸ ÓÒ× Ö ÑÓ× Ð × Ù ÒØ Ù Ð
  for (int i = 0; i < 3; ++i)
    printf("Prueba %dn", i);

      × ÒÖÓÐÐ Ö ×Ø Ù Ð ÕÙ Ú Ð             ×Ö ÖÐ          Ù ÓÒ ÓÑÓ ÙÒ × Ù Ò
          int i = 0;
          if (i < 3)
          printf("Prueba %dn", i);
          ++i;
          if (i < 3)
          printf("Prueba %dn", i);
          ++i;
          if (i < 3)
          printf("Prueba %dn", i);
          ++i;
          if (i < 3) ;
3.1. An´lisis de algoritmos
       a                                                                     173



    ÆÓØ ÑÓ× ÕÙ ×ÓÐÓ Ò Ð ÙÐØ ÑÓ if Ð ÔÖ        Ó i < 3 × Ð×Ó¸ ÔÓÖ ÐÓ ÕÙ Ð ÑÔÖ × ÓÒ
× ÑÔÖ ×        ÙØ ݸ Ò ×Ø ×Ó Ô ÖØ ÙÐ Ö¸ Ð if ÓÑÔÐ ØÓ × ÓÒ× Ö ÙÒ Ô ×Ó
    Ù ÓÒ º ÈÙ ×ØÓ ÕÙ Ù ÔÓ× Ð        × ÒÖÓÐÐ Ö Ð Ù Ð Ò 11 ÒרÖÙ ÓÒ ×       ÙÖ ÓÒ
 ÓÒר ÒØ ¸ Ð Ù Ð Ò × × ÙÖ ÓÒ ÓÒר ÒØ º ÈÓÖ ÐÓ Ø ÒØÓ¸ Ð Ù Ð ÓÒ ÓÖÑ ÙÒ Ô ×Ó
       Ù ÓÒ Ý ×Ù Ø ÑÔÓ     ÙÖ ÓÒ × O(1)º
     Ò Ð ÓÑ Ò Ó O¸ Ð ÖØ        Ò Ð Þ Ö ÙÒ Ð ÓÖ ØÑÓ ÓÒ× ×Ø Ò ÒØ ¬ Ö × Ù Ò ×
       Ù ÓÒ ÕÙ ÓÑÔÓÖØ Ò ÙÒ ÓÒ ×          ÙÖ ÓÒ Ö ÒØ × Ý ÔÐ Ö Ö Ð ×         ÓÒØ Ó
×Ó Ö ØÓ Ó¸ Ð × Ð ×ÙÑ Ý Ð ÔÖÓ Ù ØÓº
     Ò Ð × ÒØ Ó ÐÓ Ö Ò ÜÔÐ Ó¸ ×ÓÒ ÔÐ Ð × Ð × × Ù ÒØ × Ö Ð × Ô Ö ÐÓ× Ð × Ó×
 ÐÓÕÙ × ÔÖÓ Ö Ñ ÓÒ ÔÖÓ ÙÖ Ð
   ½º Instrucciones secuenciales: Ð       Ù ÓÒ      Ó× ÒרÖÙ ÓÒ × × Ù Ò Ð × ÓÒ
      Ø ÑÔÓ T1(n) = O(f1(n)), T2(n) = O(f2(n)) ØÓÑ Ò Ð ×ÙÑ T1(n) + T2(n)¸ Р٠и
      ÔÓÖ Ð Ö Ð ´¿º µ ´ Ð ×ÙÑ µ¸ ØÓÑ O(Ñ Ü(f1(n), f2(n)))º
   ¾º Instrucciones de decisi´n: ×ÙÑ ÑÓ׸ ÓÑÓ ×Ó Ò Ö Ð¸ Ð × Ù ÒØ רÖÙ ØÙÖ
                             o

     if   ´ O(f1(n)) µ
        O(f2(n))
     else
        O(f3(n))

       Ò ×Ø ×Ó¸ Ð Ø ÑÔÓ        Ù ÓÒ ×Ø Ö      Ó ÔÓÖ O(f1(n))+Ñ Ü(O(f2(n)), O(f3(n)))º
       ÕÙ ×Ø ÑÓ× ÓÒ× Ö Ò Ó ÐÓ Ô ÓÖ × Ö¸ Ð            Ù ÓÒ Ð ÐÓÕÙ Ñ × ÓרÓ×Óº
       Ú ÒØÙ ÐÑ ÒØ ¸ × ÙÒ Ð ×ØÖ Ù ÓÒ       ÖØ ØÙ Ð ÔÖ        Ó Ð if¸ ÔÙ      ÓÒ¹
     × Ö Ö× Ð ×Ô Ö ÒÞ º
  ¿º Instrucciones de repetici´n: Ð
                              o         Ù ÓÒ ÙÒ Ö Ô Ø ÓÒ ÓÒ Ð × Ù ÒØ ×¹
     ØÖÙ ØÙÖ
     for   ´ O(f1(n)) µ
           O(f2(n))

     × Ö ÔÓÖ Ð Ö Ð Ð ÔÖÓ Ù ØÓº Ð Ø ÑÔÓ                Ù ÓÒ ×Ø ¸ Ô٠׸ Ø ÖÑ Ò Ó
     ÔÓÖ O(f1(n)) Ú × Ð       Ù ÓÒ Ð ÐÓÕÙ ÒØ ÖÒÓ          Óר O(f2(n)) ×     Ö¸
     O(f1(n)) × O(f2(n)) = O(f1(n) × f2(n))º
     È Ö Ò Ð Þ Ö ÙÒ Ö Ô Ø ÓÒ Ò               Ò ×ØÙ Ö× ×Ù× Ô Ò Ò × ÓÒ ÐÓ× ÐÓ×
      ÜØ ÖÒÓ׺ Ü ×Ø Ò Ú Ö× × ÓÖÑ ×¸ Ð × Ù Ð × ÒÓ Ò × Ö Ñ ÒØ ÓÖÖ ×ÔÓÒ Ò ÓÒ
     Ð ×ØÖÙ ØÙÖ ÒØ Ö ÓÖº Ò Ð Ò × Ò Ö Ð ×¸ Ð ØÖÙ Ó Ô Ö Ò Ð Þ Ö ÙÒ Ö Ô Ø ÓÒ
      ÓÒ× ×Ø Ò Ú Ö Ù Ö Ð ÒØ            Ú × ÕÙ ×Ø ×       ØÙ º
     ÈÓÖ ÐÓ Ò Ö Ð¸ Ð Ò Ð × × ÙÒ Ö Ô Ø ÓÒ × Ö Ð Þ × Ð Ù Ð Ñ × ÒØ ÖÒÓ
       ר Ð Ñ × ÜØ ÖÒÓº
    × × Ð Ö ÞÓÒ ÔÓÖ Ð Ù Ð Ð ÒרÖÙ ÓÒ ÒØÖÓ Ð if ÒÓ × ÓÐÓ   Ò ÒØ   º
174                                                           Cap´
                                                                 ıtulo 3. Cr´
                                                                            ıtica de algoritmos



         ½ ·¼
         ½ ·¼
         ½¼¼¼¼
            ½¼¼
                ½
                    ½     ½¼    ½¼¼ ½¼¼¼ ½¼¼¼¼ ½¼¼¼¼¼½ ·¼ ½ ·¼ ½ ·¼ ½ ·¼
                                                         n
                                                                                 √
                            O(n)                         O(2n)                 O( n)
                           O(n2)                      O(Ð (n))                  O(1)
                           O(n3)                     O(n Ð (n))

                                           √
         ÙÖ ¿º          ÙÖÚ ×   Ð   (n),       n, n, n Ð (n), n2, n3, 2n   × Ð × ÐÓ Ö ØÑ ×
     Ä ÙÖ ÓÒ ÙÒ Ð ÓÖ ØÑÓ × Ö Ñ Ø             ÒØ ¬ Ö ×Ù× × Ù Ò ×          Ù ÓÒ Ý ¹
× ÒÖÓÐÐ ÖÐ × Ò ÙÒ ×ÓÐ º Ë Ù Ò × ÐÓÒ ØÙ ¬ × Ö¸ Ô ×Ó×                  Ù ÓÒ¸ ×ÓÒ O(1)º
Ë Ù Ò × ÐÓÒ ØÙ ÔÖÓÔÓÖ ÓÒ ÐÑ ÒØ Ú Ö Ð ×ÓÒ O(n)º Ë Ù Ò × × Ù Ò ×
ÐÓÒ ØÙ ÔÖÓÔÓÖ ÓÒ ÐÑ ÒØ Ú Ö Ð ×ÓÒ O(n2)º Ë Ù Ò × ÐÓÒ ØÙ Ù Ö Ø Ñ ÒØ
Ú Ö Ð ×ÓÒ O(n3)º Ë Ù Ò Ó ×Ø × Ù Ò              Ö ÞÓÒ Ñ ÒØÓ¸ ÒÓ ×      Ð ÒØÙ Ö ÕÙ Ð
 ÓÒ ÙÒØÓ ÔÓ× Ð × ÙÒ ÓÒ × × Ö ÔØÓÖ × Ð Ø ÑÔÓ               Ù ÓÒ ÙÒ Ð ÓÖ ØÑÓ ×Ø
  Ö ÙÒ× Ö ØÓ ÙÒ Ô ÕÙ Ò Ñ Ð ¸ ÙÝ × ÙÖÚ × × ÐÙ×ØÖ Ò Ò Ð ¬ ÙÖ ¿º º
      Ò Ð × ×Ù ¹× ÓÒ × ×Ù × Ù ÒØ × ×ØÙ Ö ÑÓ× ÙÒ Ð ×            Ð ÓÖ ØÑÓ ÒÓÑ Ò
    Ú Ö» ÓÑ Ò Ö ¸ Ð Ù Ð Ú Ð ÒØÖ               Ò Ó× Ô ÖØ × ÔÖÓÜ Ñ Ñ ÒØ ٠Р׺
    ÒØÖÓ     ר Ð ×       Ð ÓÖ ØÑÓ¸ ÕÙ ÐÐÓ× ÕÙ ØÖ     Ò ×Ó Ö ×ÓÐÓ ÙÒ       Ð × Ô ÖØ ×
   Ú × Ò Ó Ð ÓØÖ × Ò ÔÖÓ × Ö ×ÓÒ O(Ð (n)) Ñ ÒØÖ × ÕÙ ÕÙ ÐÐÓ× ÕÙ Ö ÕÙ Ö Ò
ÔÖÓ × Ö Ð Ò Ð Ý ÒØ Ö Ñ ÒØ Ð × Ó× Ô ÖØ × ×ÓÒ O(n Ð (n))º
      Ü ×Ø ÓØÖ Ð ×      ÔÖÓ Ð Ñ ÙÝ ×ÓÐÙ ÓÒ¸ ÔÓÖ ÐÓ Ò Ö Ð ÑÙÝ × ÑÔÐ ¸ ÓÒ× ×Ø Ò
   Ð ÙÐ Ö Ý Ò Ð Þ Ö ØÓ × Ð × Ô ÖÑÙØ ÓÒ × × Ù Ò × ×ÓÐÙ ÓÒ ÔÓ× Ð ×º Ù Ò Ó ÐÓ×
 Ð Ñ ÒØÓ× ÒÓ ×Ø Ò Ö Ô Ø Ó׸ Ð ÒÙÑ ÖÓ Ô ÖÑÙØ ÓÒ × ÙÒ × Ù Ò × n!º Ù Ò Ó¸
ÔÓÖ Ð ÓÒØÖ Ö Ó¸ × ×Ø Ò Ö Ô Ø Ó׸ × mn ÓÒ m × Ð ÒØ                      Ð Ñ ÒØÓ× Ý n
Ð ÐÓÒ ØÙ         Ð × Ù Ò º Ñ × × ØÙ ÓÒ × ×Ø Ò ÓØ × × ÒØÓØ Ñ ÒØ ÔÓÖ Ð
 ÙÒ ÓÒ f(n) = 2n¸ Ð Ù Ð ÒÓ × ÔÓÐ ÒÓÑ º ÈÓÖ × Ö ÞÓÒ¸ Ð ÓÖ ØÑÓ× ÙÝÓ Ø ÑÔÓ
     Ù ÓÒ × O(2n) ×ÓÒ ÒÓÑ Ò Ó× ÒÓ¹ÔÓÐ ÒÓÑ Ð × Ó¸ ÖÓÒ Ñ Ñ ÒØ ¸ ÆÈº
     ÆÓ × × × Ô Ö ÐÓ× ÔÖÓ Ð Ñ × ÆÈ Ü ×Ø Ò Ð ÓÖ ØÑÓ× ÓÖÖ ØÓ× ÓÒ ×ÓÐÙ ÓÒ ×
ÔÓÐ ÒÓÑ ×º Ò ØÓ Ó ×Ó¸ ר ÕÙ ÒÓ × ÑÙ ×ØÖ ÐÓ ÓÒØÖ Ö Ó¸ ÐÓ× ÔÖÓ Ð Ñ × ÆÈ
×ÓÒ ÒØÖ Ø Ð × Ò Ð × ÒØ Ó ÕÙ ¸ ÙÒ Ô Ö ÙÒ Ô ÕÙ Ò × Ð ¸ ÒÓ Ü ×Ø Ò Ö ÙÖ×Ó×
 ÓÑÔÙØ ÓÒ Ð × ÕÙ Ô ÖÑ Ø Ò ÙØ Ö Ð Ð ÓÖ ØÑÓº ÈÓÖ × Ö ÞÓÒ¸ ÐÓ× ÔÖÓ Ð Ñ × ÆÈ ×ÓÒ
Ø Ð Ó× ÒØÖ Ø Ð × Ó Ö ÙÐ Ó× º
      À Ö ÙР׸ Ð ÖÓ Ñ ØÓÐÓ Ó Ö Ó
3.1. An´lisis de algoritmos
           a                                                                         175



    3.1.8       Ordenamiento por inserci´n
                                        o
    ÈÓÒ ÑÓ× Ò ÔÖ Ø Ð Ø ÓÖ    Ð ÒÓØ ÓÒ O Ñ                   ÒØ Ð × ÒÓ Ý Ò Ð × ×   × ÑÔ ÒÓ
       ÓØÖÓ Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓ¸ ÒÓÑ Ò Ó                      Ò× Ö ÓÒ ¸ ÙÝÓ ×ÕÙ Ñ    ÒÖÐ×
     Ó×ÕÙ      Ð × Ù ÒØ ÑÓ Ó
                         a[j] = tmp

                                            tmp = a[i]

                                 j                          ×ÓÖ Ò
                         A[j] >= A[i]

                     j    ÇÖ Ò Ö Ð Ø ÚÓ i
    ÈÖ Ñ ÖÓ¸ Ð Ð Ñ ÒØÓ Ò Ð ÒØÖ a[i] × Ù Ö Ò tmpº À Ð ÞÕÙ Ö               Ð Ò i¸
    Ø Ò ÑÓ× ÓÖ Ò Ö Ð Ø ÚÓ × Ö¸ ÐÓ× Ð Ñ ÒØÓ× ×Ø Ò ÓÖ Ò Ó× Ñ × ÒÓ Ò × Ö Ñ ÒØ Ò
    ×Ù ÔÓ× ÓÒ ¬Ò Ø Ú º ÄÙ Ó¸ Ð Ò j Ö ØÖÓ          Ô ÖØ Ö i - 1 ר Ò ÓÒØÖ Ö ÙÒ
     Ð Ñ ÒØÓ Ñ ÒÓÖ Ó Ù Ð ÕÙ tmp Ò Ð ÒØ Ö Ò Ð Ø Ö ÓÒ¸        Ð Ñ ÒØÓ × Ú ÓÔ Ò Ó
          Ð Ö          Ñ Ò Ö Ø Ð Ö Ò Ó ÙÒ Ö º Ù Ò Ó j ×                Ø Ö Ö¸ a[j]
    Ø Ò ÙÒ Ö         ÓÒ ÓÐÓ ÑÓ× Ð Ú ÐÓÖ a[i] Ñ ÑÓÖ Þ Ó Ò tmpº
       ÍÒ ÑÔÐ ÒØ ÓÒ × ÓÑÓ × Ù
½    Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡                             ½    ½
         template <typename T, class Compare>
     void insertion_sort(T * a, const size_t & l, const size_t & r)
     {
       for (int i = l, j; i <= r; ++i)
         {
           T tmp = a[i]; // memorice a[i], pues ser´ sobre escrito
                                                   a
                   Ö ÙÒ Ö             ÓÒ    Ò× ÖØ Ö ØÑÔ ½
                a[j] = tmp; // inserte tmp en la brecha
            }
     }
            ÖÒ    Ð Ñ ØÓ Ó ÒØ Ö ÓÖ¸ Ð ÒØ Ö Þ insertion sort() ØÓÑ ÐÓ× Ò ×
    ÞÕÙ Ö Ó Ý Ö Ó ÒØÖ ÐÓ× Ù Ð × × × ÓÖ Ò Ö Ð ÖÖ ÐÓº ר ÒØ Ö Þ × Ö ÙØ Ð Ô Ö
    ÓÑ Ò Ö ×Ø Ñ ØÓ Ó ÓÒ ÓØÖÓ× Ñ × ×Ӭר Ó׺ Ò ÐÓ ÕÙ × Ù ¸ ×ÙÑ Ö ÑÓ× l = 0 Ý r
    = n - 1
½        Ö ÙÒ Ö              ÓÒ    Ò× ÖØ Ö ØÑÔ ½    ≡                    ´½   µ
     for (j = i; j > l and Compare() (tmp, a[j - 1]); --j)
       a[j] = a[j - 1]; // desplazar hacia la derecha

     Ð    ÐÓ ÜØ ÖÒÓ ØÙ r − l + 1 = n Ø Ö ÓÒ ×º ÈÓÖ ÐÓ Ø ÒØÓ¸ ר × O(n)º
        È Ö ×ØÙ Ö Ð ÐÓ ÒØ ÖÒÓ             Ö ÙÒ Ö            ÓÒ Ò× ÖØ Ö ØÑÔ ½
    Ö ÕÙ Ö ÑÓ× ÓÒÓ Ö Ð ÒÙÑ ÖÓ Ú × ÕÙ ×Ø Ø Ö º ר ÒØ                 ÔÒ     Ð Ú ÐÓÖ
      Ð ÔÖ       Ó j > l and Compare() (tmp, a[j - 1])¸ ÙÝÓ Ö ×ÙÐØ Ó Ô Ò        Ð
    Ô ÖÑÙØ ÓÒ ÐÓ× Ð Ñ ÒØÓ× Ò Ð ÒØ ÖÚ ÐÓ [l, i − 1]º Ò ×Ø × ÒØ Ó      ÑÓ× ÓÒ× Ö Ö
    Ú Ö × ÔÓ× Ð       ×
       ½º Ë Ð ÒØ ÖÚ ÐÓ [l, i − 1] ר ÓÖ Ò Ó¸ ÒØÓÒ × ÒÓ ×   ØÙ Ò Ò ÙÒ Ö Ô Ø ÓÒ Ý Ð
             ÐÓ × O(1)º Ò ×Ø ×Ó¸ Ð Ñ ØÓ Ó × O(n) × O(1) = O(n)º
176                                              Cap´
                                                        ıtulo 3. Cr´
                                                                   ıtica de algoritmos



       ¾º Ë Ð ÒØ ÖÚ ÐÓ [l, i − 1] ר ÓÖ Ò Ñ ÒØ ÒÚ ÖØ Ó × Ö¸ ×Ù× Ð Ñ ÒØÓ× ×Ø Ò
           ÓÖ Ò Ó× × Ð Ñ ÝÓÖ ×Ø Ð Ñ ÒÓÖ¸ ÒØÓÒ × Ð ÐÓ Ø Ö i − l = i Ú ×¸ ÐÓ
           ÕÙ ÒÓ× O(i)º ÈÙ ×ØÓ ÕÙ i Ô Ò           n¸ ÔÓ ÑÓ×     Ö Ö Ø Ñ ÒØ ÕÙ Ð
             ÐÓ × O(n)º ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð Ñ ØÓ Ó × O(n) × O(n) = O(n2)º
        Ä × × ØÙ ÓÒ × ÔÐ ÒØ × ÓÒ× Ö Ò Ó× × Ò Ö Ó×              Ù ÓÒ Ð Ñ ÓÖ ×Ó¸
     Ù Ò Ó Ð ÖÖ ÐÓ ×Ø ÓÖ Ò Ó¸ Ý Ð Ô ÓÖ¸ Ù Ò Ó Ð ÖÖ ÐÓ ×Ø ÓÑÔÐ Ø Ñ ÒØ ÒÚ ÖØ Óº
    Ë Ð ×ÔÓ× ÓÒ Ð ÖÖ ÐÓ × Ð ØÓÖ ¸ ÒØÓÒ ×¸               ÙÒÓ ÐÓ× × Ò Ö Ó× Ø Ò ÙÒ
    ÔÖÓ Ð           Ó ÙÖÖ Ò         1
                                   n! ÙÒ ÑÙÝ      ÔÖÓ Ð       ÙÒ Ón × ÖÒ º ×
    Ô٠׸ Ò ÙÒ ×Ó Ó Ò Ð ÓØÖÓ¸ Ð Ò Ð × × Ô        Ü Ö Ñ ÒØ ÓÔØ Ñ ×Ø Ó Ô × Ñ ×Ø ¸ ÓÒ
     Ð ÓÒ× Ù ÒØ Ô Ð ÖÓ × Ö ÖÖ Ð ×Ø Ð ÑÓÑ ÒØÓ ÜÔÖ × Ö Ð × ÑÔ ÒÓ Ð Ñ ØÓ Óº
    È Ö ÔÖ Ö ÐÓ ÕÙ ×Ù Ö               ÑÓ× ÓÒ× Ö Ö Ð ×Ó ×Ô Ö Óº
        Ë ÓÒ× Ö ÑÓ× Ð × Ù Ò ÓÑÓ ÙÒ Ô ÖÑÙØ ÓÒ Ð ØÓÖ ¸ ÒØÓÒ × Ð Ú ÐÓÖ Ð
     Ò         Ö j Ø Ò ÙÒ ÔÖÓ Ð            ÙÒ ÓÖÑ ÒØÖ l i − 1º Ð ÒÙÑ ÖÓ ×Ô Ö Ó
     Ø Ö ÓÒ × Ð ÐÓ Ö ÙÒ Ö                      ÓÒ Ò× ÖØ Ö ØÑÔ ½ × Ö Ð ×Ô Ö ÒÞ
        ÙÒ ×ØÖ Ù ÓÒ ÙÒ ÓÖÑ × Ö Ø ÒØÖ l i − 1 Ý Ð ÐÓ Ö Ô Ø Ö r−l+1 Ú ×º רÓ
                                                                     2
     × O(n)¸ ÐÓ ÕÙ ÒÓ× ÓÑÓ ÓÒ ÐÙ× ÓÒ          × ÑÔ ÒÓ Ð Ñ ØÓ Ó O(n) × O(n) = O(n2)
     Ð Ñ ×ÑÓ Ö ×ÙÐØ Ó Ð Ô ÓÖ ×Óº
          ÓÑÔ Ö ÑÓ× Ð Ñ ØÓ Ó Ò× Ö ÓÒ ÓÒ Ð × Ð ÓÒº Ù Ð × Ð Ñ ÓÖ Ë Ü¹
      Ñ Ò ÑÓ× Ð Ö Ñ ÒØ Ð Ö ×ÙÐØ Ó¸ ÒØÓÒ × ÔÓ ÑÓ× ÓÒ ÐÙ Ö¸ ÖÖÓÒ Ñ ÒØ ¸ ÕÙ ×ÓÒ
     ÕÙ Ú Ð ÒØ × ¹ÕÙ ÐÓ ×ÓÒ¸ × ÒØÓØ Ñ ÒØ ¹º ÑÔ ÖÓ¸ Ð Ð ÞÓ ÒØ ÖÒÓ Ð Ñ ØÓ Ó × ¹
    Ð ÓÒ ´ Ë Ñ Ò Ð Ò             Ñ ÒÓÖ ÒØÖ · ½ Ý Ò ¹ ½ ½ ¿ µ × ÑÔÖ Ø Ö n − i + 1
    Ú ×¸ Ò Ô Ò ÒØ Ñ ÒØ Ð Ô ÖÑÙØ ÓÒ a[i+1 .. n -1] Ñ ÒØÖ × ÕÙ Ð ÒØ
         Ø Ö ÓÒ × Ð Ð ÞÓ ÒØ ÖÒÓ Ð Ò× Ö ÓÒ ´ Ö ÙÒ Ö                    ÓÒ Ò× ÖØ Ö
    ØÑÔ ½ µ Ô Ò             Ð Ô ÖÑÙØ ÓÒ a[l .. i - 1] º È Ö ÔÖ Ò Ö ×Ø         Ó¸ ×
     ÓÒÚ Ò ÒØ ÔÖÓ ÙÒ Þ Ö Ð Ò Ð × × Ð Ñ ØÓ Ó         Ò× Ö ÓÒ Ô Ö Ð ×Ó ÔÖÓÑ Óº Ë
      ÔÖÓÜ Ñ ÑÓ× Ð ÒÙÑ ÖÓ Ö Ô Ø ÓÒ × Ð Ð ÞÓ ÒØ ÖÒÓ 2 ¸ ÒØÓÒ × Ø Ò ÑÓ× ÓÑÓ ¹
                                                          i

    × ÑÔ ÒÓ
                                    n−1
                                          i   n(n − 1)
                                            =          ;
                                          2      4
                                    i=1

    ÕÙ × ÕÙ Ú Ð ÒØ Ð Ñ Ø          Ø ÑÔÓ Ð Ñ ØÓ Ó × Ð ÓÒº Ë Ò Ð × ÙÖÚ ×
     Ñ Ó× Ñ ØÓ Ó× ×ÓÒ Ù Ö Ø ×¸ Ð Ð Ò× Ö ÓÒ × Ò Ö ÓÖ Ð Ð × Ð ÓÒº
       ÈÓÖ ×Ù × ÑÔÐ        ÑÔÐ ÒØ ÓÒ¸ ×Ù Ó Óר ÓÒר ÒØ Ý ×Ù Ù Ò × ÑÔ ÒÓ Ô Ö
    Ô ÖÑÙØ ÓÒ × Ù × ¹ÓÖ Ò × ´O(n)µ¸ Ð Ñ ØÓ Ó Ò× Ö ÓÒ × ÙÒ Ü Ð ÒØ ÐØ ÖÒ Ø Ú
    Ô Ö ÓÖ Ò Ö × Ù Ò × Ô ÕÙ Ò ×º
       Ä Ú Ö× ÓÒ Ô Ö Ð ×Ø × × Ñ × × Ò ÐÐ ¸ ÔÙ × ÒÓ × Ö ÕÙ Ö Ò Ñ Ò Ö Ò × Ø Ò ×ÓÐÓ
    Ö ÓÖÖ Ö Ð Ð ×Ø Ö Ò× ÖØ Ò Ó ÓÖ Ò Ñ ÒØ Ò ÓØÖ Ð ×Ø             ÒÓ Ó Ó × ÖÚ Óº ר
      ØÚ      Ùר ¬ Ð ÔÖ × Ò       Ð ÔÖ Ñ Ø Ú × Ù ÒØ
½    Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡                                ½   ½
         template <class Compare>
     void insert_sorted(Dlink & list, Dlink * p)
     {
       typename Dlink::Iterator it(list);
       ÆÓØ ÕÙ Ø Ò × ÒØ Ó ÓÑÔ Ö Ö a[i+1 .. r] ÓÒ a[l .. i - 1] Ò       ÙÒÓ      ÐÓ× Ñ ØÓ Ó׺ Ò
       ØÓ¸ ÔÓÖ  Ô ÖÑÙØ ÓÒ a[i+1 .. r]¸ Ü ×Ø ÓØÖ ÓÑÔÐ Ñ ÒØ Ö a[l   .. i - 1]   ÕÙ Ø Ò Ð Ñ ×Ñ
    ÔÖÓ Ð º
3.1. An´lisis de algoritmos
           a                                                                      177



            while (it.has_current() and Compare () (it.get_current(), p))
              it.next();
            if (it.has_current())
              it.get_current()->append(p); // insertar a la derecha de current
            else
              list.append(p);
        }
        ¬Ò ×
        insert sorted¸   Ù×   Ò ÙÒ ½       º
         insert sorted() Ò× ÖØ        Ð ÒÓ Ó p Ò Ð Ð ×Ø ÓÖ Ò list × ÙÒ Ð Ö Ø Ö Ó Óѹ
    Ô   Ö ÓÒ Compareº ÓÒ ×Ø          ÔÖ Ñ Ø Ú ¸ Ð ÓÖ Ò Ñ ÒØÓ ÔÓÖ Ò× Ö ÓÒ ÕÙ ÓÒ × Ñ ÒØ
     ¬Ò Ó
½   Å ØÓ Ó×        ÓÖ Ò Ñ ÒØÓ ½ ¿          +≡                      ½   ½
            template <class Compare>
        void insertion_sort(Dlink & list)
        {
          Dlink aux;
          while (not list.is_empty())
            insert_sorted<Compare>(aux, list.remove_next());
          list.swap(&aux);
        }
    Í× × insert sorted ½ º
    insert sorted()     ÙØ ÙÒ ×ÓÐ Ø Ö ÓÒ × Ù Ò × ÓÒר ÒØ ׺ Ä ÙÖ ÓÒ
    Ð Ø Ö ÓÒ Ô Ò Ö         Ð Ô ÖÑÙØ ÓÒ Ð × Ù Ò list Ý Ð Ú ÐÓÖ ÐÑ Ò Ó
     Ò Ð ÒÓ Ó pº ר × Ð Ñ ×Ñ × ØÙ ÓÒ ÕÙ ÓÒ Ð Ú Ö× ÓÒ Ô Ö ÖÖ ÐÓ׺ Ð Ø ÑÔÓ
       insert sorted() ׸ ÒØÓÒ ×¸ O(n) Ô Ö Ð Ô ÓÖ ×Ó Ý Ô Ö Ð ×Ô Ö Óº Ä Ò× Ö ÓÒ
     × ÐÐ Ñ      × ÓØÖÓ ÐÓÕÙ Ø Ö Ø ÚÓ ÙÝÓ Ø ÑÔÓ ×¸ ÓÒ ÖØ ØÙ ¸ O(n)¸ ÔÙ × Ý ÕÙ
    Ö ÓÖÖ Ö ØÓ Ð Ð ×Ø º × Ô٠׸ ÓÑÓ × ×Ô Ö Ö× ¸ Ð Ñ ØÓ Ó × O(n2)º
        ÆÓ× Ö ×Ø ÜÔÓÖØ Ö ×Ô Ð Þ ÓÒ × ÔÓÖ ÓÑ × ÓÒ Ô Ö Ð Ø ÔÓ Dnode<T>
½    Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡                               ½   ½¾
            template <typename T, class Compare>
        void insertion_sort(Dnode<T> & list)
        {
          insertion_sort < Compare_Dnode<T, Compare> > (list);
        }
    Í× × Compare Dnode ½       Ò   Dnode       º

    3.1.9      B´squeda binaria
                u
    Ð Ò Ð × × Ð Ñ ØÓ Ó Ò× Ö ÓÒ Ó × Ð ÓÒ ØÖ Ú × ÓÔ Ö ÓÒ × O × × ÑÔÐ Ý
     Ö ØÓº Ò ÑÙ × Ó × ÓÒ ×¸ ×Ó Ö ØÓ Ó Ò Ð ÓÖ ØÑÓ× Ö ÙÖ× ÚÓ׸ × ÔÐ ÒØ Ö ÙÒ
     Ù ÓÒ Ö ÙÖÖ Ò º ÁÐÙ×ØÖ ÑÓ× ×Ø      Ñ ÒØ Ð Ú Ö× ÓÒ Ö ÙÖ× Ú Ð Ù×ÕÙ
     Ò Ö ×Ó Ö ÙÒ ÖÖ ÐÓ ÓÖ Ò Ó
½   Å ØÓ Ó× Ù×ÕÙ ½ ≡
            template <typename T, class Compare>
        int binary_search_rec(T * a, const T & x, const int & l, const int & r)
        {
          const int m = (l + r) / 2;
178                                                   Cap´
                                                         ıtulo 3. Cr´
                                                                    ıtica de algoritmos



      if (l > r)
        return m;
      if (Compare() (x, a[m]))
        return binary_search_rec<T, Compare>(a, l, m - 1);
      else if (Compare() (a[m], x))
        return binary_search_rec<T, Compare>(a, m + 1, r);
      return m; // encontrado
 }


     Ð Ð ÓÖ ØÑÓ Ù× Ö ÙÖ× Ú Ñ ÒØ ÙÒ Ó ÙÖÖ Ò            Ð Ð Ñ ÒØÓ x Ò ÙÒ ÖÖ ÐÓ ÕÙ
 ר ÓÖ Ò Ó ÒØÖ l Ý rº Ë l > r¸ ÒØÓÒ × Ð Ö Ò Ó           Ù×ÕÙ    ר Ú Ó Ý Ø Ò ÑÓ×
Ð ÖØ ØÙ        ÕÙ Ð Ð Ñ ÒØÓ x ÒÓ × Ò Ù ÒØÖ ÒØÖÓ Ð Ö Ò Óº               ÐÓ ÓÒØÖ Ö Ó¸
 Ò×Ô ÓÒ ÑÓ× Ð Ð Ñ ÒØÓ × ØÙ Ó Ò Ð ÒØÖÓ × ×Ø ÓÒØ Ò Ð Ú ÐÓÖ x¸ ÒØÓÒ × m
 × Ð Ö ×ÙÐØ Óº Ë ÒÓ¸          ÑÓ׸ × ÙÒ Ð ÓÖ Ò x¸ Ò Ù Ð ÐÓ× Ó× ×Ù Ö Ò Ó×
     ÑÓ× Ù× Ö Ð ÞÕÙ Ö Ó Ó Ð Ö Óº
      ×ÙÑ ÑÓ× ÕÙ Ð Ö Ò Ó [l, r] ×      Ö ÒÐ      nº
      Ù Ò Ó n ≤ 0 Ð Ð ÓÖ ØÑÓ Ø ÖÑ Ò Ò Ø ÑÔÓ ÓÒר ÒØ O(1)º Ë ¸ ÔÓÖ Ð ÓÒØÖ Ö Ó¸
 Ü ×Ø Ò Ð Ñ ÒØÓ× ÒØÖÓ Ð Ö Ò Ó¸ ÒØÓÒ × ÔÙ Ò Ó ÙÖÖ Ö Ó× Ó× × Ó Ð Ð Ñ ÒØÓ ×
 Ò Ù ÒØÖ Ò Ð ÒØÖÓ¸ Ó Ý ÕÙ Ù× Ö Ö ÙÖ× Ú Ñ ÒØ Ò Ð ÙÒ                  Ð × Ô ÖØ ÓÒ ×º
ÈÙ ×ØÓ ÕÙ Ð Ô ÖØ ÓÒ Ó ÙÖÖ Ü Ø Ñ ÒØ ÔÓÖ Ð ÒØÖÓ¸ Ð Ö ×ØÓ Ð Ø ÑÔÓ × ÓÒ×ÙÑ
×Ó Ö ÔÖÓÜ Ñ Ñ ÒØ Ð Ñ Ø              Ð ÒØÖ º ÈÐ ÒØ ÑÓ׸ Ô٠׸ Ð × Ù ÒØ Ù ÓÒ
Ö ÙÖÖ ÒØ
                         T (n) =
                                  O(1)           × n≤0 .                     ´¿º½ µ
                                  T (n/2) + O(1) × n ≥ 1
    ÆÓØ ÑÓ× ÕÙ Ü ×Ø ÙÒ Ð ÖÓ ÖÖÓÖ Ò Ð Ö ÙÖÖ Ò Ð ÐÐ Ñ Ö ÙÖ× Ú Ó ÙÖÖ ×Ó¹
  Ö T ((n − 1)/2) Ý ÒÓ ×Ó Ö T (n/2) ÓÑÓ × ÜÔÖ × Ò ´¿º½ µº ר ÖÖÓÖ¸ ÕÙ           ÐØ
Ñ Ò ÔÙÐ Ö T (n)¸ × ×ÔÖ Ð ¸ ÔÙ × ÙÒ Ô ×Ó            Ù ÓÒ Ñ ÒÓ× ÒÓ ÐØ Ö Ö Ð Óѹ
ÔÓÖØ Ñ ÒØÓ × ÒØÓØ Ó T (n)º
        ØÙ ÑÓ× Ð ØÖ Ò× ÓÖÑ ÓÒ n = 2k =⇒ k = Ð (n) ×ØÓ ×ÙÑ ÕÙ n × ÙÒ
ÔÓØ Ò Ü Ø 2¸ ÐÓ Ù Ð × ÑÙ × Ú × ÒÓ × Ö Ð ×Ó¸ × × Ú Ð Ó Ò Ð ÓÑ Ò Ó
Ð ÒÓØ ÓÒ Oº Ä Ö ÙÖÖ Ò ´¿º½ µ × ÜÔÖ × ¸ ÒØÓÒ ×

                           T (2k) =
                                          × k=0 .
                                        O(1)
                                                             ´¿º½ µ
                             T (2k−1) + 1 × k > 0

   ÄÓ ÒØ Ö × ÒØ Ð ØÖ Ò× ÓÖÑ ÓÒ × ÕÙ ÜÔÖ × Ö Ø Ñ ÒØ Ð Ö ÙÖÖ Ò ÓÑÓ
ÙÒ ×ÙÑ ØÓÖ º Ò ØÓ¸ ÜÔ Ò Ò ÓÐ Ø Ò ÑÓ×
                       T (2k) = T (2k−1) + 1 = T (2k−2) + 1 + 1
                              = T (200) + 1 + · · · + 1 + 1 = k + 1              ´¿º½ µ
        ÓÖ Ö Ð Þ ÑÓ× Ð ØÖ Ò× ÓÖÑ ÓÒ ÒÚ Ö×
                                      T (n) = Ð (n) + 1 ,                        ´¿º½ µ
Ð Ù Ð Ð Ö Ñ ÒØ × O(Ð (n)) ÙÒ ¬ Ò ×Ô Ø ÙÐ Öº Ä Ù×ÕÙ          Ò Ö ×¸ Ò
 Ð Ô ÓÖ ×Ó¸ O(Ð (n))º Ë Ö ÕÙ Ö ÙÔÐ Ö Ð ÒØÖ Ô Ö ÕÙ Ð Ð ÓÖ ØÑÓ ÑÓÖ ÙÒ
ÙÒ       Ø ÑÔÓ Ñ ×º
3.1. An´lisis de algoritmos
       a                                                                           179



3.1.10   Errores de la notaci´n O
                             o
À Ý Ó× ÓÒ × ×Ø ÒØ ÒÓØ Ð × Ð ÒÓØ ÓÒ Oº Ò ÔÖ Ñ Ö ÐÙ Ö¸ ÐÐ Ó Ø Þ
Ð ÑÔÖ × ÓÒº ÈÓ ÑÓ× ÒØ ÖÔÖ Ø Ö ÕÙ Ð × ÓÒר ÒØ × Ð ¬Ò ÓÒ c Ý n1 ×ÓÖ Ò
Ð × Ó× Ò Ö × × ×Ù Ø Ú × ÕÙ Ý ÑÓ× × Ò Ð Ó ´Ø ÔÓ ÓÑÔÙØ ÓÖ¸ ºººµº Ò × ÙÒ
 Òר Ò ¸ Ð ÒÓØ ÓÒ Ô ÖÑ Ø ×ØÙ Ö ÙÒ ÓÒ × T (n) Ð Ø ÑÔÓ ÙÒ Ð ÓÖ ØÑÓ Ó
ÙÒ Ñ ØÓ Ó ÓÒ× Ö Ð Ñ ÒØ Ñ × × Ò ÐÐÓ ÕÙ Ð ÓÒØ Ó Ý Ð Ö ØÖ ÓÒ Ðº
     È ÖÓ ØÓ Ó Ø Þ ÓÒ ÖÖ ÙÒ ÔÖ Ó¸ ÔÓÖ ÖØÓ ×Ø ÒØ Ó Ø ÚÓ Ý Ò Ö Ð
ØÓ Ó Ø Þ ÓÒ¸ Ù Ð × Ð Ó ÙÐØ Ñ ÒØÓ                ÕÙ ÐÐÓ ×Ù Ø ÚÓ ÕÙ ¸ ÒÓ ×ÓÐÓ Ò ÑÙ Ó×
   ×Ó× ÔÙ × Ö ÑÔÓÖØ ÒØ × ÑÓ¸ × ÒÓ × ÖÐ × Ò Ð × ÑÓ¸ ÔÙ × × ÖÖ × × Ò ×ÙÔÖ ÑÓ
ÐÐ Ñ Ó Ú Ö º
        ×ÔÙ × Ò Ð Þ Ö Ð Ñ ØÓ Ó Ò× Ö ÓÒ Ý ÓÑÔ Ö ÖÐÓ ÓÒ Ð × Ð ÓÒ¸ ÔÓ ÑÓ×
Ö × ÐØ Ö ÕÙ Ð ÒÓØ ÓÒ O ×ÓÐÓ ÖÖÓ Ð ÓÖÑ              T (n) Ô Ö ÒØÖ     × ÑÙÝ Ö Ò ×º
      Ó¸ Ð ÑÔÖ × ÓÒ Ð ÒÓØ ÓÒ O × ¸ ÒØÖ ÓØÖÓ× ×Ô ØÓ׸ ÐÓ× ÕÙ × Ö ×ÙÑ Ò
  Ò Ð × × Ù ÒØ × Ó × ÖÚ ÓÒ ×
    ½º ÆÓ × ÓÒ× Ö Ò ÐÓ× Óר × ÓÒר ÒØ × Ð Ð ÓÖ ØÑÓ Ð ÔÖÓÔ                  ¬Ò ÓÒ O
          × ÖØ Ð × ÓÔ Ö ÓÒ × ÕÙ ØÓÑ Ò Ø ÑÔÓ ÓÒר ÒØ Ò O(1)º
    ¾º ÄÓ× Óר × Ú Ö Ð ×¸ Ô ÖÓ Ò Ö ÓÖ × Ð ÙÖÚ ÓÑ Ò ÒØ ¸ Ø ÑÔÓ Ó × ÓÒ× Ö Òº
       ÈÓÖ ÑÔÐÓ¸ ×ÙÔÓÒ ÑÓ× ÙÒ Ð ÓÖ ØÑÓ Ù Ö Ø Ó ÓÒ ÙÒ × Ò Ð ÔÖ ÔÖÓ ¹
       × Ñ ÒØÓ O(n)¸ ÐÙ Ó ÙÒ × O(n2) ÓÒ ×              ÙØ Ð Ð ÓÖ ØÑÓ Ò × Ý¸ ¬Ò ÐÑ ÒØ ¸
       ÙÒ × ¬Ò Ð ÔÓרÔÖÓ × Ñ ÒØÓ O(n)º Ò ×Ø ×Ó¸ Ð Ø ÑÔÓ                         Ù ÓÒ ×¹
       ØÖ       Ó ÔÓÖ O(n) + O(n2) + O(n) = O(n2)º ÓÖ Ò¸ Ð Ö ×ÙÐØ Ó ¬Ò Ð O(n2)
       Ó ÙÐØ ÓÑÔÐ Ø Ñ ÒØ Ó× Óר × ÓÒ× Ö Ð × ×Ó Ó× Ð Ð ÓÖ ØÑÓ Ð ÔÖ Ý Ð
       ÔÓרÔÖÓ × Ñ ÒØÓ¸ ÐÓ× Ù Ð ×¸ ÙÒ Ù Ò Ó ×ÓÒ Ð Ò Ð ×¸ ÔÙ Ò × Ö ÓרÓ× × ÑÓ× ×
         ÓÒÐÐ Ú Ò ÙÒ ÓÒר ÒØ ÑÙÝ ÐØ º
    ¿º Ð Ö Ø Ö Ö Ð T (n) × × ÓÒ ØÓØ ÐÑ ÒØ ÔÓÖ Ð ÓØ ÓÒ O(f(n)) Ô٠׸ Ò
       Ð Ñ ÝÓÖ         Ð × Ú ×¸ T (n) = f(n) Ò ×Ø × ÒØ Ó¸           × Ò Ð Ö ÕÙ O(f(n))
       ×ÓÐÓ Ø Ò × ÒØ Ó Ô Ö ÒØÖ × Ñ ÝÓÖ × ÕÙ Ð ÓÒר ÒØ n1 ÔÐ ÒØ                      ÒÐ
          ¬Ò ÓÒ ¿º½º Ò ÓØÖ × Ô Ð Ö ×¸ ¬ÖÑ Ö ÕÙ T (n) = O(f(n)) × ÓÒÓ Ð Óѹ
       ÔÓÖØ Ñ ÒØÓ T (n) ÒØ × n1º
     Ä Ö ¬ ¿º × Ò Ð ¸ ÖØ × Ò Ñ ÒØ             Ð Ò Ó¸ Ð ÓÑ Ò Ó ÓÒ Ð ÒÓØ ÓÒ O ×
  ÓÒ¸ ÖØ ØÙ ¸ Ú Ö        Ä ÒÓØ ÓÒ O × ÖØ Ö Ñ ÒØ ÔÖ × Ò Ð ÓÑ Ò Ó ÐÓ Ò¬Ò ØÓ
´Ó Ð Ø ÖÒ µ¸ Ô ÖÓ ×Ø ÓÑ Ò Ó ÔÙ × Ö ÑÙÝ ×ØÖ ØÓ Ý Ð ÒÓ Ð ÙÒ Ö Ð
  ÓÒ Ö Ø º ÈÓÖ ×Ó¸ ÓÑÓ Ò ØÓ Ó ÐÓ Ó Ø ÚÓ¸ Ý ÕÙ Ò Ö ÓÒ ×ÙÑÓ Ù Óº
       Óר × ÑÙÝ Ö Ò ×¸ Ò ÓÖ Ð ×¸ Ô ÖÓ ÓÒר ÒØ ׸ ÔÙ Ò ÕÙ Ö ÓÑÔÐ Ø Ñ ÒØ
Ó ÙÐØÓ× ÔÓÖ ÙÒ Ò Ð × × Oº ÄÓ Ñ ×ÑÓ ÔÙ ×Ù Ö ÓÒ ÓØÖÓ× Óר × × ÒØÓØ Ñ ÒØ
 Ò Ö ÓÖ × Ô ÖÓ ÓÒר ÒØ Ñ ÒØ ×ÙÔ Ö ÓÖ ×º Ò Ò ÙÖ ¸ Ð Ó ÙÐØ Ñ ÒØÓ ØÓØ Ð Ð ÓÖÑ
    T (n)¸ ÔÙ        ÖÖ Ö ×ÓÖÔÖ × × × Ð    Ù ÓÒ ×ÓÐÓ Ø Ò × ÒØ Ó Ô Ö × Ð × Ò Ö ÓÖ ×
   Ð ÓØ × ÒØÓØ n1 Ð ¬Ò ÓÒ ¿º½º ÉÙ Þ ÐÓ Ô ÓÖ¸ ÔÓÐ Ø Ñ ÒØ                     Ð Ò Ó¸ × ÕÙ
ÙÒ Ú Þ ÔÙ Ð Ó ÙÒ Ò Ð × × O¸ Ð ÓÒÓ Ñ ÒØÓ               ÕÙ ÐÐÓ× Óר × Ý × Ò Ð Ó× Ø Ò Ò
   × ÔÙÐØ Ö× Ô Ö × ÑÔÖ º
180                                         Cap´
                                               ıtulo 3. Cr´
                                                          ıtica de algoritmos



                ∞

                                                   ∞
                                                 ÓÑ Ò Ó Ü ØÓ   Ð ÒÓØ   ÓÒ O



                      Ê       Ð




                                            n1     ∞




                ÙÖ ¿º ÁÐÙ×ØÖ ÓÒ Ö ¬     Ð ÓÑ Ò Ó       Ð ÒÓØ ÓÒ O

3.1.11    Tipos de an´lisis
                     a
  ÓÑÓ Ý Ö Ø Ö Ø Ú Ñ ÒØ ÐÓ ÑÓ× Ó¸ Ý Ð ÓÖ ØÑÓ× ÕÙ ÒÓ ×ÓÐÓ Ô Ò Ò Ð Ø Ñ ÒÓ
    Ð ÒØÖ ¸ × ÒÓ¸ Ø Ñ Ò¸ Ð ÓÖÑ Ò ÕÙ × ÔÖ × ÒØ Ð ÒØÖ º Ð Ñ ØÓ Ó
 Ò× Ö ÓÒ Ó Ö ÙÒ Ù Ò ÑÔÐÓº
    ÈÓÖ ÐÓ Ò Ö Ð¸ Ù Ò Ó × Ò Ð Þ ÙÒ Ð ÓÖ ØÑÓ × ÓÒ× Ö Ò Ó× Ô Ö×Ô Ø Ú ×º Ä
ÔÖ Ñ Ö ÓÒ× ×Ø Ò Ò Ð Þ ÖÐÓ Ô Ö Ð ÒØÖ ÕÙ Ù× Ð Ô ÓÖ Ù ÓÒ Ð × ÙÒ Ô Ö
Ð ÒØÖ        ×Ô Ö º
       × × ÑÔÖ × Ö ÕÙ Ö Ð Ò Ð × × Ô Ö Ð Ô ÓÖ ÒØÖ ¸ ÔÙ × ×Ø ÔÐ ÒØ ÙÒ ÓØ
     Ù ÓÒº Ð Ô ÓÖ ×Ó ÒÓ× Ó Ö ÙÒ ×Ô            Ö ÒØ     Ö    Ð Ø ÑÔÓ     Ù ÓÒ¸
ÔÙ × Ù ÐÕÙ Ö ÓØÖ ÒØÖ           Ö ÒØ Ð Ô ÓÖ × Ö Ñ ÓÖº ר Ö ÒØ × ÔÖ Ð
 Ù Ò Ó × Ö ÕÙ Ö Ò Ð ÓÖ ØÑÓ× ÓÒ Ö ÕÙ Ö Ñ ÒØÓ×        Ù ÓÒ ÙÖÓ׸ ÕÙ ÒÓ × ÔÙ Ò
­ Ü Ð Þ Ö Ý Ò ÐÓ× Ù Ð × ÒÓ × ÔÙ Ø Ò Ö Ð ÐÙ Ó Ø Ò Ö ÙÒ Ñ Ð         Ù ÓÒº
      Ð Ò Ð × × Ô Ö Ð ÒØÖ    ×Ô Ö ÔÐ ÒØ ÙÒ ÔÖ        ÓÒ¸ ÙÒ ÜÔ Ø Ø Ú Ö      Ð
Ø ÑÔÓ           Ù ÓÒ Ñ × ÔÖÓ Ð º Ë ØÖ Ø ÙÒ ×Ô Ö ÒÞ × Ö¸ ÐÓ ÕÙ × ×Ô Ö
ÕÙ ×Ù         ÑÙ × Ú ×¸ Ô ÖÓ ÒÓ × ÑÔÖ º Ä ÔÖÓÔÓÖ ÓÒ Ú × ÕÙ Ð Ð ÓÖ ØÑÓ
× ÓÑÔÓÖØ Ö ÓÑÓ ÐÓ ×Ô Ö Ó Ô Ò Ö             Ð Ú Ö ÒÞ      Ð ÒØÖ º × Ñ ÒØ ¸
 ר Ø ÔÓ       Ò Ð × × × ÔÙ ÔÐ ÒØ Ö Ò Ó× × ØÙ ÓÒ ×º Ä ÔÖ Ñ Ö Ù Ò Ó Ð ÒØÖ
 ×Ô Ö ×          ר ÒØ ÔÖÓ Ð × Ö¸ Ù Ò Ó Ð Ú Ö ÒÞ           Ð ÒØÖ × Ô ÕÙ Ò º
Ä × ÙÒ × ØÙ ÓÒ Ù Ò Ó × ÔÐ ÒØ ÓÑÓ Ö ÕÙ Ö Ñ ÒØÓ × Ø × Ö Ð ÔÖÓÑ Ó
   ×Ó× × Ò ÑÔÓÖØ Ö Ð ÙÒ × Ñ Ð × Ù ÓÒ × Ù× × ÔÓÖ ÙÒ Ñ Ð ÒØÖ º Ò Ñ ×
× ØÙ ÓÒ × × ÑÔÓÖØ ÒØ ÓÒÓ Ö Ð Ú Ö ÒÞ º

3.2      Algoritmos dividir/combinar
ÍÒ Ø Ò Ð ÒØ Ô Ö Ö ×ÓÐÚ Ö ÙÒ ÔÖÓ Ð Ñ ÓÒ× ×Ø Ò Ú ÖÐÓ Ò Ó× ÔÖÓ Ð Ñ × Õ¹
Ù Ø Ø ÚÓ׸ ÙÝ × ÓÑÔÐ       ׸ Ñ ÒÙ Ó ÜÔÖ × × Ò ÙÒ ÓÒ Ð × Ð ¸ ×ÓÒ Ñ ÒÓÖ ×
ÕÙ Ð × Ð ÔÖÓ Ð Ñ Ò Ðº Ð ÔÖÓ ×Ó           Ú × ÓÒ × Ö Ô Ø Ö ÙÖÖ ÒØ Ñ ÒØ ÓÒ
ÙÒ      Ð × Ô ÖØ × ×Ø Ð ÒÞ Ö ÓÑÔÐ        × Ô ÖØ ÙÐ Ö × ÙÝ ×ÓÐÙ ÓÒ × ÓÒÓ º
   Ô ÖØ Ö     ר ÑÓÑ ÒØÓ¸ × ÓÑ Ò ÙÒ Ô Ö ×ÓÐÙ ÓÒ × Ô Ö Ò ÓÒØÖ Ö Ð ×ÓÐÙ ÓÒ
3.2. Algoritmos dividir/combinar                                                      181



 Ð ÔÖÓ Ð Ñ Ò Ö Ð ÔÖ Ñ Ò Ñ ÒØ Ú Óº Ð ÓÑ Ò ÓÒ                           Ó× ×ÓÐÙ ÓÒ × Ô Ö
Ó Ø Ò Ö Ð ×ÓÐÙ ÓÒ ÓÑÔÐ Ø × Ð ÒÓÑ Ò ÓÑ Ò ÓÒ Ó ÓÒÕÙ ×Ø º
     È Ö ÔÐ Ö ×Ø Ø Ò × Ö ÕÙ Ö ´½µ × Ö Ú Ö Ð ÔÖÓ Ð Ñ Ý ´¾µ × Ö ÓÑ Ò Öº
  ר × Ð Ô ÖØ ×Ù Ø Ú × Ñ Ò Ð × ÒÓ ÙÒ Ð ÓÖ ØÑÓ Ú Ö» ÓÑ Ò Öº ÈÓÖ ÓÒØÖ ×Ø ¸
Ð ×ØÖÙ ØÙÖ Ý Ò Ð × × ×Ø Ð ×            Ð ÓÖ ØÑÓ× Ø Ò ÙÒ ×ÕÙ Ñ ÑÙÝ Ó Ø ÚÓº
         Ó ÙÒ ÔÖÓ Ð Ñ P ÓÒ ÒØÖ          Ø Ñ ÒÓ n¸ ÙÒ Ð ÓÖ ØÑÓ Ú Ö» ÓÑ Ò Ö¸ ÙÝ
 ÙÖ ÓÒ × × Ö ÔÓÖ Ð ÙÒ ÓÒ T (n) Ý ÕÙ Ö ×Ù ÐÚ P × ×ØÖÙ ØÙÖ ¸ Ñ Ò Ö
   Ò Ö Ð Ý Ó Ø Ú ¸ Ò Ð × Ô ÖØ × × Ù ÒØ ×
    ½º Identificaci´n de un problema particular y su soluci´n
                     o                                         o
        ר Ô ÖØ ÒØ ¬ ÙÒ ×ÓÐÙ ÓÒ Ô ÖØ ÙÐ Ö Ð ÔÖÓ Ð Ñ Ô Ö ÙÒ Ø Ñ ÒÓ Ô ÖØ ÙÐ Ö
            ÒØÖ n < nbº Ò ×Ø × ¸ × Ö ÕÙ Ö ÓÒÓ Ö ÓÑÓ Ö ×ÓÐÚ Ö Ð ÔÖÓ Ð Ñ Ô Ö
       Ð Ó ÙÖÖ Ò         ÒØÖ Ô ÖØ ÙÐ Öº
           ר Ô ÖØ × Ð ÐÐ Ñ       × º
         ×ÙÑ ÑÓ× ÕÙ Ð ×ÓÐÙ ÓÒ × Ù ×Ø T (nb)º ÈÙ ×ØÓ ÕÙ nb × ÓÒר ÒØ ¸ ÐÓ Ñ ×
       ÔÖÓ Ð × ÕÙ T (nb) × ÓÒר ÒØ ¸ ÔÓÖ ÐÓ ÕÙ ¸ Ð Ñ ÝÓÖ              Ð × Ú ×¸ Ð Óר
          T (nb) = O(1), n ≤ nbº

    ¾º Divisi´no
        Ò ×Ø Ô ÖØ × Ú Ð ÔÖÓ Ð Ñ Ò Ó× Ô ÖØ ÓÒ × ÕÙ Ø Ø Ú × Ø Ñ ÒÓ× n1 ≈
       n2 ≈ n º
              2
         ×ÙÑ ÑÓ× ÕÙ Ð Ú × ÓÒ Ù ×Ø O(fd(n))º
    ¿º Recursi´n o
        ר Ô ÖØ ÓÒ× ×Ø Ò Ö ×ÓÐÚ Ö Ö ÙÖ× Ú Ñ ÒØ              Ô ÖØ ÓÒ Ý Ó Ø Ò Ö ×ÓÐÙ¹
         ÓÒ × s1(n1) Ý s2(n2)º
       ÈÙ ×ØÓ ÕÙ Ó ÙÖÖ Ò ÐÐ Ñ × Ö ÙÖ× Ú ×¸ Ð Óר × × ÓÒÓ Ó ×Ø Ø ÒØÓ ÒÓ ×
        ÓÒÓÞ Ð Óר Ð ×Ó × Ý Ð ÓÑ Ò ÓÒº ÑÔ ÖÓ¸ Ñ ÒÙ Ó Ð Óר
       ÔÙ       ÜÔÖ × Ö× Ö ÙÖ× Ú Ñ ÒØ ÓÑÓ T (n1) + T (n2)¸ ÔÙ × Ð × ÐÐ Ñ × Ö ÙÖ× Ú ×
       × ÓÖÖ ×ÔÓÒ Ò ÓÒ Ð Ñ ×Ñ ÙÒ ÓÒ            ÙÖ ÓÒ¸ Ô ÖÓ Ô Ö ÒØÖ × Ñ ÒÓÖ ×º
     º Combinaci´n  o
        Ò ×Ø × × ÓÑ Ò Ò Ð × ×ÓÐÙ ÓÒ × s1(n1) Ý s2(n2) Ö ×ÙÐØ ÒØ × Ð × ÐÐ Ñ ×
       Ö ÙÖ× Ú × Ò ÙÒ ×ÓÐÙ ÓÒ ¬Ò Ø Ú Ð ÔÖÓ Ð Ñ º
         ×ÙÑ ÑÓ× ÕÙ Ð ÓÑ Ò ÓÒ Ù ×Ø O(fc(n))º
       ÐÓ ÕÙ Ò ×Ø ÓÒØ ÜØÓ ÐÐ Ñ ÑÓ× ÓÑ Ò Ö ¸ Ò Ò Ð ×¸ ØÖ      ÓÒ ÐÑ ÒØ ¸ × Ð ÒÓÑ Ò ÓÒÕÙ ×¹
Ø Ö º ÓÖ       Ò¸ Ô Ö ÒÓ×ÓØÖÓ׸ Ñ Ö ÒÓ׸ ÕÙ Ò × Ù ÑÓ× ÓÒÕÙ ×Ø Ó× Ý Ú × ÐÐ Ó׸ Ð Ø ÖÑ ÒÓ ÔÙ
× Ö Ð Ó¸ ÔÙ × Ú × Ð Ð Ò Ù            Ð ÙÒ ÓÖÑ Ò Ù ØÖ ÑÔ ×º Ä ÜÔÖ × ÓÒ Ú Ö Ý ÓÒÕÙ ×Ø Ö
ÔÖÓÚ Ò Ð Ö ÓØ ÔÓÐ Ø Ó¹Ñ Ð Ø Ö Ý ÒÓ Ø Ò Ò ÕÙ Ú Ö ÓÒ ÐÓ× Ð ÓÖ ØÑÓ× Ý ÓÒ Ð ×ÓÐÙ ÓÒ ÔÖÓ ¹
Ð Ñ × ÙÑ ÒÓ× ØÓ Ó ÐÓ ÓÒØÖ Ö Ó      ÓÖ Ò Ó ÙÒ Ú ×Ø ÒØ            Ö Ú × ÑÓ× ÔÖÓ Ð Ñ ×º Ú Ö ÙÒ
ÔÖÓ Ð Ñ Ò Ó× Ñ × Ô ÕÙ ÒÓ× Ø Ò ÑÙ Ó × ÒØ Ó Ô ÖÓ ×Ó Ö Ö ×ÓÐÚ Ö ÓÒ ÓÒÕÙ ×Ø Ö ØÖ Ú ×
×Ù× ×ÓÐÙ ÓÒ × ÔÙ Ö Ò Ù Ö Ô Ò× Ö ÕÙ Ú Ò Ó × ÓÒÕÙ ×Ø Ó¸ Ô ÓÖ¸ ÕÙ Ô Ö Ö ×ÓÐÚ Ö ÔÖÓ Ð Ñ ×
   Ý ÕÙ ÓÒÕÙ ×Ø Öº
182                                                              Cap´
                                                                         ıtulo 3. Cr´
                                                                                    ıtica de algoritmos



        Ë ÙÒ ÐÓ ÜÔÖ × Ó¸ Ð ÙÖ ÓÒ                    ÙÒ Ð ÓÖ ØÑÓ Ú Ö» ÓÑ Ò Ö × ÓÖÑÙÐ Ñ                          ÒØ
     Ð × Ù ÒØ Ö ÙÖÖ Ò
                  ⎧
                  ⎪O(fb(n))
                  ⎨                                                                               , n ≤ nb
           T (n) = O(fd(n)) +
                  ⎪                        T (n1)        +      T (n2)          + O(fc(n))        , n > nb   ´¿º½ µ
                  ⎩
                          Ú × ÓÒ   ÔÖ Ñ Ö Ô ÖØ      ÓÒ       × ÙÒ   Ô ÖØ   ÓÒ     ÓÑ Ò       ÓÒ

         ÅÙÝ Ñ ÒÙ Ó¸ Ð ×ØÖÙ ØÙÖ       ÙÒ Ð ÓÖ ØÑÓ Ú Ö» ÓÑ Ò Ö × ÔÖ ×Ø    ÐÑ ÒØ
       ×Ù Ñ Ò Ó ÓÒ ÙÖÖ ÒØ × Ö¸ Ð × Ô ÖØ ÓÒ × ÔÙ Ò ØÖ Ø Ö× ÔÓÖ ÐÓ× Ó ÔÖÓ ×Ó×
           Ù ÓÒ ×Ø ÒØÓ׺ Ë ×ØÓ× ÐÓ× ×ÓÒ ÙØ Ó× ÔÓÖ ÔÖÓ × ÓÖ × Ñ Ø Ö Ð × ×Ø Ò¹
     ØÓ׸ ÒØÓÒ × ÐÓ× ×Ù ¹ÔÖÓ Ð Ñ × ÔÙ Ò Ö ×ÓÐÚ Ö× × ÑÙÐØ Ò Ñ ÒØ ݸ ר ÑÓ Ó¸ Ñ ×
     Ö Ô Ñ ÒØ ÕÙ ÙÒ ×ÓÐÓ ÔÖÓ × ÓÖº Ä Ú ÐÓ         ¸ ÔÓÖ ×ÙÔÙ ×ØÓ¸ Ô Ò Ð ÒØ
        ÔÖÓ × ÓÖ × ÕÙ × ×ÔÓÒ ¸ Ð Ò ÓÐ Ð Ð ÓÖ ØÑÓ Ô Ö Ð Ð Þ Ö Ý Ð × Ú ÖØÙ ×
       Ð × Ò ÓÖ Ó ÔÖÓ Ö Ñ ÓÖ ÕÙ Ö Ð Ð Ô Ö Ð Ð Þ ÓÒº

     3.2.1     Ordenamiento por mezcla
        ÑÔÐ ¬ÕÙ ÑÓ× Ð × ÒÓ Ý Ò Ð × ×                     ÙÒ Ð ÓÖ ØÑÓ Ú Ö» ÓÑ Ò Ö Ñ ÒØ ÙÒ Ð Ó¹
     Ö ØÑÓ ÓÖ Ò Ñ ÒØÓ ÒÓÑ Ò Ó                             ÑÞÐ ¸ Ð Ù Ð× ×Ö        ÓÒØ ÒÙ ÓÒ
½¾    Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡                                                          ½        ½
        ÑÞÐ      ÖÖ ÐÓ× ½ ¿
           template <typename T, class Compare>
       void mergesort(T * a, const int & l, const int & r)
       {
         if (l >= r)
           return;
         const int m = (l + r)/2;
         mergesort<T, Compare>(a, l, m);
         mergesort<T, Compare>(a, m + 1, r);
         merge<T, Compare>(a, l, m, r);
       }
     Í× × merge ½ ¿   Ò    mergesort   ½     º
          Ð Ð ÓÖ ØÑÓ × ÓÖÖ ×ÔÓÒ Ü Ø Ñ ÒØ ÓÒ Ð Ô ØÖÓÒ Ú Ö» ÓÑ Ò Öº Ä ×
       ÓÑ Ò ÓÒ Ð Ö Ð Þ Ð ÔÖÓ Ñ ÒØÓ merge()¸ Ð Ù Ð × Ò Ö             Ñ Þ Ð Ö Ó×
     Ô ÖØ ÓÒ × ÓÖ Ò ×º ÒØ × Ò Ö Ð Ø ÑÔÓ            Ù ÓÒ¸ Ö ÕÙ Ö ÑÓ× ÓÒÓ Ö ÓÑÓ
     ×     ØÙ Ð Ñ Þ Ð Ý Ò Ð Þ Ö ×Ù × ÑÔ ÒÓº
     3.2.1.1    Mezcla (merge)

     Ä Ñ Þ Ð ×ÙÑ Ó× × Ù Ò × ÓÖ Ò ×¸ Ò ÐÓ× ÒØ ÖÚ ÐÓ× [l, m] Ý [m + 1, r]º Ë
     ØÙÚ × ÑÓ× Ó× ÖÖ ÐÓ× ÓÖ Ò Ó׸ ÒØÓÒ × ÔÓ Ö ÑÓ× Ñ Þ Ð ÖÐÓ× Ò ÙÒ Ø Ö ÖÓ ÔÓÖ ¹
     ÖÖ Óº         Ø Ö ÓÒ¸ ÓÑÔ Ö ÑÓ× Ð Ð Ñ ÒØÓ ØÙ Ð        ÖÖ ÐÓ¸ ÓÔ ÑÓ× Ð Ñ ÒÓÖ
         ÐÓ× Ó× Ð ÖÖ ÐÓ Ö ×ÙÐØ Ó Ý Ú ÒÞ ÑÓ× Ð Ð Ñ ÒØÓ ØÙ Ð Ò Ð ÖÖ ÐÓ ÕÙ ÓÒØ Ò
       Ð Ñ ÒÓÖ Ð Ñ ÒØÓº
           Ò ÒÙ ×ØÖ × ØÙ ÓÒ¸ Ø Ò ÑÓ× ÙÒ ÖÖ ÐÓ Ô ÖØ ÓÒ Ó Ò Ó× Ô ÖØ × ÕÙ Ø Ø Ú × ÕÙ
     Ý ×Ø Ò ÓÖ Ò ×º Ð ÔÖÓ ×Ó Ñ Þ Ð ÓÔ Ö Ð ÖÖ ÐÓ a[]                ÙÒÓ ÙÜ Ð Ö ÕÙ
     ÐÐ Ñ Ö ÑÓ× b[]º ÆÓ × ÔÓ× Ð Ú Ö Ð Ù×Ó ÙÒ ÖÖ ÐÓ        ÓÒ Ðº
3.2. Algoritmos dividir/combinar                                                                       183



        ÓÒ Ñ Ö × × ÑÔÐ ¬ Ö Ð Ñ Þ Ð ¸ Ö Ð Þ Ö ÑÓ× Ð ÓÔ                            Ð ÖÖ ÐÓ a              Ð × ÙÒ Ó
     ÖÖ ÐÓ b × ÙÒ Ð × Ù ÒØ ×ÕÙ Ñ
                    l                                  m                                            r
                a              a[l..m]                                  a[m + 1..r]

                        ÓÔ ÔÖ Ñ Ö Ñ Ø    ÖÖ ÐÓ ½   ¿   ÓÔ   ÒÚ ÖØ   × ÙÒ Ñ Ø    ÖÖ ÐÓ ½   ¿

                    l                                  m                                            r
                b              a[l..m]                                  a[m + 1..r]

       × Ö¸ ÒØÖ 0 Ý m ÓÔ ÑÓ× Ð ÖÖ ÐÓ ÒÓÖÑ ÐÑ ÒØ ¸ Ñ ÒØÖ × ÕÙ ÒØÖ m + 1 Ý r ÐÓ
      ÒÚ ÖØ ÑÓ׺       ר ÓÖÑ ¸ Ù Ò Ó ×     ØÙ Ð Ñ Þ Ð ¸ ÐÓ× Ñ ÝÓÖ × Ð Ñ ÒØÓ× ÙÒ Ö Ò
        ÒØ Ò Ð × Ò ØÙÖ Ð × ÕÙ ÒÓ× ÓÖÖ Ö Ò ÙÒ × ÙÒ Ö Ô Ø ÓÒ ÙÒØÓ ÓÒ ÙÒ if ÕÙ
     ×Ó Ö Ù Ð Ð × Ó× Ñ Ø × Ý ÕÙ Ö Ð Þ Ö Ð Ö ×ØÓ Ð ÓÔ º
½¿      ÓÔ ÔÖ Ñ Ö Ñ Ø ÖÖ ÐÓ ½ ¿ ≡                                      ´½ ¿ µ
      for (i = l; i <= m; i++)
        b[i] = a[i];

½¿     ÓÔ   ÒÚ ÖØ   × ÙÒ Ñ Ø            ÖÖ ÐÓ ½ ¿      ≡                                      ´½ ¿ µ
      for (j = r, i = m + 1; i <= r; i++, j--)
        b[i] = a[j];

       ÍÒ Ú Þ ÓÔ × Ð × Ô ÖØ ÓÒ × Ò Ð ÖÖ ÐÓ b¸ ÔÖÓ                                 ÑÓ×             Ñ Þ Ð ÖÐ × Ò Ð
     ÖÖ ÐÓ a ÓÑÓ × Ù
                    l                                  m                                            r
                b                  a[l..m]                  a[m + 1..r]
                         i                                                                    j



                    l              min(b[i], b[j])                                                 r
                a
                                  k

     ÄÓ Ù Ð × ÑÔÐ ÒØ Ð × Ù ÒØ ÑÓ Ó
½¿    Ñ Þ Ð ÖÑØ ×½ ¿ ≡                                                                        ´½ ¿ µ
      for (k = l, i = l, j = r; k <= r; k++)
        if (Compare() (b[i] < b[j]))
          a[k] = b[i++];
        else
          a[k] = b[j--];
     Ý ÕÙ ÓÑÔÐ Ø ØÓ Ó ÐÓ Ò × Ö Ó Ô Ö ÔÖÓ Ö Ñ Ö Ð ÖÙØ Ò                         merge()
½¿    ÑÞÐ     ÖÖ ÐÓ× ½ ¿ ≡                                                                     ´½ ¾µ
          template <typename T, class Compare>
      void merge(T * a, const int & l, const int & m, const int & r)
      {
        int i, j, k;
        T b[r - l + 1];
184                                                        Cap´
                                                              ıtulo 3. Cr´
                                                                         ıtica de algoritmos



       ÓÔ ÔÖ Ñ Ö Ñ Ø ÖÖ ÐÓ ½ ¿
       ÓÔ ÒÚ ÖØ × ÙÒ Ñ Ø ÖÖ ÐÓ ½ ¿
      Ñ Þ Ð ÖÑØ ×½ ¿
 }
  ¬Ò ×
 merge¸   Ù×     Ò ÙÒ ½ ¾º
  Ð Ô Ö Ñ ØÖÓ m × Ð ÒØÖÓ              Ð Ô ÖØ ÓÒº
3.2.1.2        An´lisis del mergesort
                 a

È Ö Ò Ð Þ Ö Ð mergesort() Ù× ÑÓ× Ð               Ù ÓÒ ´¿º½ µ Ý ÔÐ ÒØ ÑÓ×
                                        O(1)                     ,n ≤ 1
                            T (n) =                                           .               ´¿º½ µ
                                        2T (n/2) + O(fc(n))      ,n > 1

 ÓÒ   O(fc(n)) × Ð   ÓÑÔÐ        Ø ÑÔÓ Ð ×      ÓÑ Ò ÓÒ¸ Ó ×       Ð ÙÒ ÓÒ
merge()º Ð Ö Ñ ÒØ   ¸ ÐÓ× ÐÓÕÙ × ÓÔ ÔÖ Ñ Ö Ñ Ø ÖÖ ÐÓ ½ ¿ Ý ÓÔ ÒÚ Ö¹
Ø × ÙÒ Ñ Ø ÖÖ ÐÓ ½ ¿ ÓÒ×ÙÑ Ò n/2 Ô ×Ó×             Ù ÓÒ¸ ÐÓ ÕÙ ÐÓ×     O(n)º
  Ð ÐÓÕÙ Ñ Þ Ð Ö Ñ Ø × ½ ¿ ÓÒ×ÙÑ Ü Ø Ñ ÒØ n ÙÒ           ×       Ù ÓÒ ÐÓ ÕÙ
ÐÓ      Ø Ñ Ò O(n)º ÈÓÖ Ø ÒØÓ¸ merge() ÓÒ×ÙÑ O(n) + O(n) + O(n) = O(n)º
 ר ÑÓ Ó¸ ´¿º½ µ × ÔÐ ÒØ ÓÑÓ
                                         O(1)                 ,n ≤ 1
                              T (n) =                                     .                   ´¿º¾¼µ
                                         2T (n/2) + O(n)      ,n > 1

 ר Ö ÙÖÖ Ò            Ø Ñ Ò ÔÙ         Ö ×ÓÐÚ Ö× ×ÙÑ Ò Ó n = 2k =⇒ k = Ð (n) Ó × ¸
 ×ÙÑ ÑÓ× ÕÙ        n    × ÙÒ ÔÓØ Ò       Ü Ø 2º È Ö n > 1¸ ´¿º¾¼µ × ÔÐ ÒØ ÓÑÓ
          T (2k) = 2T (2k−1) + O(2k) =⇒ ´ Ú ÑÓ× ØÓ Ð            Ù ÓÒ              ÒØÖ   2kµ
          T (2k)   T (2k−1)
                 =          + O(1)
            2k       2k−1
                   T (2k−2)
                 =          + O(1) + O(1) = O(1) + · · · + O(1) +O(1)
                     2k−2
                                                            kÚ    ×
                       = O(k) + 1                                                             ´¿º¾½µ
      Ð Ö Ö × Ö Ð ÔÐ ÒÓ n Ø Ò ÑÓ× ÕÙ ´¿º¾½µ × ÔÐ ÒØ                ÓÑÓ
                           T (n)
                                 = O(Ð (n)) + O(1) =⇒
                             n
                           T (n) = O(n Ð (n)) + O(n) = O(n Ð (n)) ;                           ´¿º¾¾µ
Ô Ö n = 2kº Ð Ù Ð ×Ø × ÒØÓØ Ñ ÒØ ÓØ Ó ÔÓÖ O(n Ð (n))º Ò Ð Ò¬Ò ØÓ Ð ÑÙй
Ø ÔÐ         n ÒÓ     Ø Ð ÓÑÔÓÖØ Ñ ÒØÓ × ÒØÓØ Ó¸ ÔÙ × ×Ø ÒÓ Ø Ð Ö ÙÖÖ Ò º
  Ò ÓØÖÓ× Ø ÖÑ ÒÓ׸ Ð ÕÙ n × Ó ÒÓ ÔÓØ Ò Ü Ø           Ó× ÒÓ Ñ Ö Ð       Ó
ÕÙ T (n) × O(n Ð (n))º
     Ð Ñ ØÓ Ó ÔÓÖ Ñ Þ Ð × O(n Ð (n)) Ô Ö ØÓ Ó× ÐÓ× ×Ó× Ñ ÓÖ¸ Ô ÓÖ Ý ÔÖÓÑ Óº
ÆÓØ ÑÓ× ÕÙ Ð Ð ÓÖ ØÑÓ Ò × ÒÓ ×Ø Ò Ù Ð ÓÖÑ              Ð ÒØÖ   × ÑÔÖ Ù ×Ø
O(n Ð (n)) Ò Ô Ò ÒØ Ñ ÒØ       Ð ×ÔÓ× ÓÒ ÐÓ× Ð Ñ ÒØÓ× Ò Ð ÖÖ ÐÓº
3.2. Algoritmos dividir/combinar                                               185



    3.2.1.3   Estabilidad del mergesort

         ÙÒ Ø Ð Ö ×ØÖÓ׸ × Ö¸ ÙÒ ÖÖ ÐÓ ÓÒ ÓÐÙÑÒ × Ø ÔÓ× Ù Ð × Ó Ö ÒØ ׸
    ÙÒ Ð Ú ÔÖ Ñ Ö × ÙÒ ÕÙ ÒÓ × Ö Ô Ø Ò ÙÒ ¬Ð º ÈÓÖ ÑÔÐÓ¸ Ð ÒÙÑ ÖÓ ÙÒ Ó
         ÒØ     Ò ÓÒ Ð ÒÓ ×Ø × Ò Ó Ô Ö Ö Ô Ø Ö× º ÍÒ Ð Ú × ÙÒ Ö × ÙÒ ÕÙ
    ÔÙ Ö Ô Ø Ö× Ò Ó× Ó Ñ × ¬Ð × ÔÓÖ ÑÔÐÓ׸ ÐÓ× ÒÓÑ Ö × Ý Ô ÐÐ Ó׺
          Ó Ð ¬Ò ÓÒ ÒØ Ö ÓÖ¸ ÙÒ Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓ × Ð ¬           ר Ð × ¸ Ð
    ÓÖ Ò Ö ÔÓÖ Ð Ú × ÙÒ Ö ÙÒ × Ù Ò          Ö ×ØÖÓ× ÔÖ Ú Ñ ÒØ ÓÖ Ò ÔÓÖ Ð Ú
    ÔÖ Ñ Ö ¸ ÒØÓÒ × Ð × Ð Ú × × ÙÒ Ö × Ö Ô Ø × × ÓÒ× ÖÚ Ò ÓÖ Ò × × ÙÒ Ð Ð Ú
    ÔÖ Ñ Ö º
        Ò Ð × ÒØ Ó ÐÓ ÒØ Ö ÓÖ¸ Ð Ñ ØÓ Ó Ñ Ö ×ÓÖØ × ×Ø Ð º
    3.2.1.4   Coste en espacio

     Ð ÓÒ×ÙÑÓ Ñ ÑÓÖ × ÓØÖÓ Óר ÕÙ × ÑÔÖ            ÓÒ× Ö Ö× Ð ÑÓÑ ÒØÓ Ò Ð Þ Ö
    ÙÒ Ð ÓÖ ØÑÓº Ò ×Ø × ÒØ Ó¸ Ð ÓÖ Ò Ñ ÒØÓ ÖÖ ÐÓ× ÔÓÖ Ñ Þ Ð × ÙÒ Ù Ò ÑÔÐÓ¸
    ÔÙ × Ð ÖÙØ Ò merge() Ö ÕÙ Ö ÙÒ ÖÖ ÐÓ ÔÖÓÔÓÖ ÓÒ Ð n ÐÓ ÕÙ ÑÔÐ ÕÙ Ð Ñ ØÓ Ó
     Ò Ù ×Ø ÓÒ Ö ÕÙ Ö ×Ô Ó ÔÖÓÔÓÖ ÓÒ Ð O(n)º × Ô٠׸ × × × ÙØ Ð Þ Ö ×Ø Ñ ØÓ Ó¸
     ÒØÓÒ ×        × ÙÖ Ö× Ð ×ÔÓÒ Ö Ð ×Ô Ó        ÓÒ Ð Ö ÕÙ Ö Ó Ô Ö ×Ù Ù ÓÒº
    3.2.1.5   Ordenamiento por mezcla de listas enlazadas

      Ð ÓÖ Ò Ñ ÒØÓ ÔÓÖ Ñ Þ Ð Ù ÓÒ     Ó ÑÙÝ ÓØÖÓÖ ¸ Ù Ò Ó            ÑÙÝ ÔÓ Ñ ÑÓÖ Ý
    ÐÓ× Ñ Ó× ÐÑ Ò Ñ ÒØÓ × ÙÒ Ö Ó Ö Ò ÒØ × Ñ Ò Ø                 × Ð ÒØ × Ñ ×º Ò ÕÙ ÐÐÓ×
    Ø ÑÔÓ׸ ÓÖ Ò Ö Ö ÕÙ Ö Ð Ñ Þ Ð      Ú Ö × ÒØ ׺
          ÙÒÕÙ ÓÝ Ò        ×ÔÓÒ ÑÓ× ÑÙÝ ÜØ Ò× × Ñ ÑÓÖ       × Ý Ñ Ó×          ÐÑ ¹
    Ò Ñ ÒØÓ Ñ × ÚÓ ÒÓ × Ù Ò Ð ×¸ Ð ÓÖ Ò Ñ ÒØÓ ÔÓÖ Ñ Þ Ð     ÒÓ × Ô Ö Ò Ó ×ÓÐ ØÓº
    ÌÓ Ó ÐÓ ÓÒØÖ Ö Ó¸ × ÙÒ Ñ ØÓ Ó ÓÒ Ö ÒØ O(n Ð (n)) ÕÙ      Ô ÖÑ Ø ÓÖ Ò Ö Ø Ú ¹
    Ñ ÒØ Ð ×Ø × ÒÐ Þ × Ý ÕÙ ¸ Ò Ò ÙÖ ¸ ÒÓ Ö ÕÙ Ö ×Ô         Ó     ÓÒ Ðº Ì Ð Ñ Þ Ð ×
     ×Ô ¬ ÓÑÓ × Ù
½    Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡                                   ½¾ ½
         template <class Compare>
     void merge_lists(Dlink & l1, Dlink & l2, Dlink & result)
     {
       while (not l1.is_empty() and not l2.is_empty())
         if (Compare () (l1.get_next(), l2.get_next()))
           result.append(l1.remove_next());
         else
           result.append(l2.remove_next());
       if (l1.is_empty())
         result.concat_list(&l2);
       else
         result.concat_list(&l1);
     }
    Ò ÓÒ×ÓÒ Ò ÓÒ ×Ù Ö Ø Ö × Ù Ò ¸ Ð ÓÖ Ò Ñ ÒØÓ ÔÓÖ Ñ Þ Ð        ÙÒ Ð ×Ø
    ÒÐ Þ Ø Ò Ü Ø Ñ ÒØ Ð Ñ ×Ñ ×ØÖÙ ØÙÖ ÕÙ ×Ù Ú Ö× ÓÒ Ô Ö ÖÖ ÐÓ׺
½   Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡                         ½  ½
          template <class Compare>
186                                                      Cap´
                                                                ıtulo 3. Cr´
                                                                           ıtica de algoritmos



      void mergesort(Dlink & list)
      {
        if (list.is_unitarian_or_empty())
          return;
        Dlink l, r;
        list.split_list(l, r);                    //    dividir en dos listas
        mergesort <Compare> (l);                  //    ordenar la primera
        mergesort <Compare> (r);                  //    ordenar la segunda
        merge_lists <Compare> (l, r, list);       //    mezclarlas
      }
      ¬Ò ×
      mergesort¸   Ù×   Ò ÙÒ × ½ ¾ Ò    ¼½º
       Ä   Ð ÓØ   ¬Ò ×Ô Ð Þ ÓÒ × Ô Ö Ð × ÓØÖ × Ð × ×                      Ð ×Ø × Ñ   ÒØ Ð ÙØ ¹
    Ð Þ ÓÒ Ð Ð × Compare Dnodeº

    3.2.2       Ordenamiento r´pido (Quicksort)
                              a
     ÓÒ× Ö ÑÓ× ÙÒ ÖÖ ÐÓ ×ÓÖ Ò Ó a[] Ý Ð ÒÚÓ ÓÒ pivot = partition(a, l, r)¸
    Ð Ù Ð Ô ÖØ ÓÒ Ð ÖÖ ÐÓ Ò Ó× Ô ÖØ × Ò Ö Ð × ÓÑÓ × Ô ØÓÖ Þ Ò Ð × Ù ÒØ ¬ ÙÖ
          l                                                                              r
              ÌÓ Ó Ñ ÒÓÖ Ó Ù Ð ÕÙ    a[pivot] pivote      ÌÓ Ó Ñ ÝÓÖ Ó Ù Ð ÕÙ     a[pivot]
                                                pivot

        Ä      Ù ÓÒ pivot = partition(a, l, r) ØÙ Ð ÙÒ × ÓÔ Ö ÓÒ × ×Ó Ö Ð ÖÖ ¹
     ÐÓ Ý Ö ØÓÖÒ ÙÒ Ò pivot Ø Ð ÕÙ Ð ÖÖ ÐÓ × Ø × Ð Ô ÖØ ÓÒ × ÙÒ Ð ×ÕÙ Ñ
    Ô ØÓÖ Þ Óº × Ö¸ ×ÔÙ × ÒÚÓ Ö partition()¸ Ð Ð Ñ ÒØÓ a[pivot] × Ò Ù Ò¹
    ØÖ Ò ×Ù ÔÓ× ÓÒ ¬Ò Ø Ú ÒØÖÓ ÐÓ ÕÙ × Ö Ð × Ù Ò ÓÖ Ò Ó × ¸ Ð ÒØÖ
    a[pivot] ÓÖÖ ×ÔÓÒ      Ð Ô ÚÓØ¹ × ÑÓ Ñ ÒÓÖ Ð Ñ ÒØÓ Ð ÖÖ ÐÓº Ð ÖÖ ÐÓ × Ó ¹
    Ú Ó¸ × ÙÒ a[pivot]¸ Ò Ó× Ô ÖØ × ×ÓÖ Ò ×¸ ÕÙ ÔÙ Ò ÓÖ Ò Ö× Ö ÙÖ× Ú
     Ò Ô Ò ÒØ Ñ ÒØ ÓÑÓ × Ù
½    Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡                                ½   ½¼
          template <typename T, class Compare>
      void quicksort_rec(T * a, const int & l, const int & r)
      {
        if (l >= r)
          return;
        const int pivot = partition <T, Compare> (a, l, r);
        quicksort_rec <T, Compare> (a, l, pivot - 1);
        quicksort_rec <T, Compare> (a, pivot + 1, r);
      }
    Í× × partition ½ º

          ר ÔÖÓ        Ñ ÒØÓ × Ð Ñ ÓÖ Ñ ØÓ Ó            ÓÖ Ò Ñ ÒØÓ      ר     ÓÝ ÓÒÓ Óº ËÙ
    Ö Ò Ñ ÒØÓ × Ø Ò ×Ô Ø ÙÐ Ö ÕÙ ×Ù × Ù Ö ÓÖ ¸ º ºÊº ÀÓ Ö ¸ ÐÓ Ù¹
    Ø ÞÓ ÕÙ ×ÓÖØ ¾ Ó × ¸ ÓÖ Ò Ñ ÒØÓ Ö Ô Ó¸ Ó¸ Ö Ú Ñ ÒØ ¸ Ò ×Ø ÐÐ ÒÓ¸
          ÒÐ     Ø ÓÖ Ò Ð Ï ÖØ ÑÔÐ     Ð Ø ÖÑ ÒÓ ÒÚ ÒØÓÖ º
3.2. Algoritmos dividir/combinar                                                                         187



      ÐÖÔ Óº Ä ×Ò          Ð Ñ ØÓ Ó ×Ù Ý Ò Ð Ñ Ò Ö         ØÙ Ö Ð Ô ÖØ ÓÒ Ô ÖÓ
     ÒØ × ×ØÙ ÖÐ ¸ × ÒØ Ö × ÒØ ÙÒ Ñ ÒØ Ö Ð Ò Ð × × Ð Ð ÓÖ ØÑÓº
         ÓÒÚ Ò ÒÓØ Ö ÕÙ Ð ×ØÖÙ ØÙÖ Ú Ö» ÓÑ Ò Ö Ð ÕÙ ×ÓÖØ ¬ Ö Ð Ö Ñ ÒØ
    ×Ù ØÖ ÓÒ Ð ÓÖ Ò Ó Ø ÚÓº Ä × ÐÐ Ñ × Ö ÙÖ× Ú × Ó ÙÖÖ Ò Ð ¬Ò Ð Ð ÖÙØ Ò × Ò
    ÕÙ × ÒÓØ ÜÔÐ Ø Ñ ÒØ ÙÒ ×           ÓÑ Ò ÓÒº        Ó¸ × Ò Ð ÔÖÓÔ Ô ÖØ ÓÒ
      Ð ÖÖ ÐÓ Ù Ò Ó Ó ÙÖÖ Ð ÓÑ Ò ÓÒ¸ Ô٠׸ ÙÒ Ú Þ Ö Ð Þ Ð Ô ÖØ ÓÒ¸        Ô ÖØ
    ÔÙ ÓÖ Ò Ö× ¸ Ò Ô Ò ÒØ Ñ ÒØ ¸ ÔÓÖ × Ô Ö Óº
         Ð Ø ÑÔÓ      Ù ÓÒ × Ö Ø Ö Þ ÔÓÖ Ð × Ù ÒØ Ù ÓÒ Ö ÙÖÖ ÒØ
                                      O(1)                                              ,n ≤ 1
                        T (n) =                                                                  ;       ´¿º¾¿µ
                                      O(fp(n)) + T (Ô ÚÓØ −l) + T (r − Ô ÚÓØ ) , n > 1

    ÓÒ O(fp(n)) Ö Ø Ö Þ Ð ÙÖ ÓÒ                           partition()º          Ô ÚÓØ × Ð Ò          Ð Ð Ñ ÒØÓ
    Ò ØÓÖÒÓ Ð Ù Ð × Ö Ð Þ Ð Ô ÖØ ÓÒº
    3.2.2.1       Partici´n
                         o

    Ä Ô ÖØ ÓÒ × Ð Ô ÖØ Ñ × Ð       Ý ÓÑÔÐ       Ð ÕÙ ×ÓÖØº ×ÙÑ ÑÓ× ÙÒ Ð Ñ ÒØÓ
     Ô ÚÓØ ÕÙ Ö ÔÖ × ÒØ Ö Ð Ð Ñ ÒØÓ Ô ÖØ ÓÒ Ý ÕÙ     Ð ÙÒ ÓÖÑ ¸ ÕÙ ÜÔÐ Ö ÑÓ×
    Ñ × Ð ÒØ ¸ × ÓÐÓ Ò a[r]º ÁÒ ÑÓ× ÒÙ ×ØÖÓ ×ØÙ Ó Ñ ÒØ Ó × ÖÚ ÓÒ Ð
    × Ù ÒØ ¬ ÙÖ
                                               swap(a[i], a[j])                                      r
          l      ++i                      i                          j                 −−j           pivot
          while a[i] < pivot                                             while a[j] > pivot

     ÚÒ       ר ÔÖ Ñ Ö Ð Ñ ÒØÓ Ñ ÝÓÖ ÕÙ Ô ÚÓØ ½     ÚÒ   ר ÔÖ Ñ Ö Ð Ñ ÒØÓ Ñ ÒÓÖ ÕÙ Ô ÚÓØ ½
        Ä ¬ ÙÖ Ö ÔÖ × ÒØ Ð ÖÖ ÐÓ ÒØÖ l Ý rº i × ÙÒ Ò ÔÓÖ Ð Ð Ó ÞÕÙ Ö Ó Ð
     ÖÖ ÐÓ Ý j × ÔÓÖ Ð Ð Ó Ö Óº i × ÑÙ Ú           Ð Ö ¸ ÐÓ ÕÙ ÑÔÐ ÕÙ
     Ò Ö Ñ ÒØ Ö× Ñ ÒØÖ × ÕÙ j × ÑÙ Ú         Ð ÞÕÙ Ö ¸ ÔÓÖ ÐÓ ÕÙ ×      Ö Ñ ÒØ Öº
    ÄÓ× Ú ÐÓÖ × Ò Ð × ×ØÓ× Ò × × ÓÐÓ Ò Ò ÙÒ ÔÓ× ÓÒ ÔÖ Ú ×Ù ÔÖ Ñ Ö ×Ó
     × Ö¸ i Ò l - 1 Ý j Ò rº
        ÄÙ Ó Ò Ó× ÐÓ× Ò ×¸ Ð ÖÙØ Ò ÒØÖ Ò ÙÒ Ð ÞÓ ÙÝÓ Ù ÖÔÓ ÓÒ× ×Ø Ò Ù× Ö
    ÙÒ ÒÚ Ö× ÓÒ Ö Ð Ø Ú Ð Ô ÚÓØ × Ö¸ ÙÒ Ô Ö Ð Ñ ÒØÓ× ÕÙ ×Ø Ò ÒÚ ÖØ Ó× Ò ÓÖ Ò
    Ö ×Ô ØÓ Ð Ô ÚÓØ º Ð ÔÖ Ñ ÖÓ ×ØÓ× Ð Ñ ÒØÓ× × Ù× ÔÓÖ Ð ÞÕÙ Ö
½     ÚÒ        ר ÔÖ Ñ Ö Ð Ñ ÒØÓ Ñ ÝÓÖ ÕÙ Ô ÚÓØ ½ ≡               ´½ µ
         // avance mientras a[i] < a[pivot]
     while (Compare() (a[++i], pivot)) { /* no hay cuerpo */ }
      Ò Ð ÒרÖÙ ÓÒ a[++i]¸ Ð Ö          a[i] × Ö Ð Þ   ×ÔÙ × Ð Ò Ö Ñ ÒØÓº ÈÓÖ Ø ÒØÓ¸
     Ð ÔÖ Ñ Ö ×Ó Ó ÙÖÖ ×Ó Ö a[l]º Ð ×ÔÐ Þ Ñ ÒØÓ i Ñ × ×Ó Ö Ô × Ö r¸ ÔÙ ×
     Ð Ô ÚÓØ ÙÒ        ÒØ Ò Ð Ý Ð ÓÑÔ Ö ÓÒ × ÔÓÖ × Ù Ð          ×ØÖ Ø º ÈÓÖ Ø ÒØÓ¸ i
    ÒÙÒ         Ö ÙÒ Ò       Ù Ö Ð Ö Ò Ó [l, r]º
        Ä Ù×ÕÙ       Ð Ð Ñ ÒØÓ ÒÚ Ö× ÓÒ Ð Ð Ó Ö Ó × × Ñ Ð Ö¸ Ô ÖÓ ÕÙ ÒÓ Ø Ò ÑÓ×
    ÙÒ ÒØ Ò Ð ÔÓÖ ÐÓ ÕÙ        ÑÓ× Ú Ö ¬ Ö ÕÙ j ÒÓ ×Ó Ö Ô × l
½     ÚÒ       ר ÔÖ Ñ Ö Ð Ñ ÒØÓ Ñ ÒÓÖ ÕÙ Ô ÚÓØ ½ ≡                ´½ µ
     while (Compare() (pivot, a[--j])) // avance mientras a[pivot]< a[j]
       if (j == l) // ¿se alcanz´ el borde izquierdo?
                                o
         break; // s´ ==> hay que terminar la iteraci´n
                    ı                                o
188                                                Cap´
                                                          ıtulo 3. Cr´
                                                                     ıtica de algoritmos



        Ë i Ý j ÒÓ × ÖÙÞ Ò ´i < jµ¸ ÒØÓÒ × Ü ×Ø ÙÒ ÒÚ Ö× ÓÒ ÕÙ × ÓÖÖ ÒØ Ö Ñ¹
       Ò Ó a[i] ÓÒ a[j]º
        Ë ¸ ÔÓÖ Ð ÓÒØÖ Ö Ó¸ ÐÓ× Ò × i Ý j × ÖÙÞ Ò ´i >= jµ¸ Ð ÔÖÓ ×Ó Ô ÖØ ÓÒ ÙÐÑ Ò
    Ý Ð Ò i ÓÒר ØÙÝ Ð ÔÙÒØÓ Ô ÖØ ÓÒº Ò ×Ø ÑÓÑ ÒØÓ¸ × ÒØ Ö Ñ ÓÒ Ð
    Ô ÚÓØ i Ú Ð ÖÖ ÐÓ Ò Ó× Ô ÖØ × Ð ÞÕÙ Ö ÓÒØ Ò Ð Ú × Ñ ÒÓÖ × Ó Ù Ð ×
     Ð Ô ÚÓØ ¸ Ñ ÒØÖ × ÕÙ Ð Ö           ÓÒØ Ò Ð Ú × Ñ ÝÓÖ × Ó Ù Ð ×º
          × ÔÓ× Ð ÕÙ Ð Ö Ò Ó [l, i] ÓÒØ Ò Ð Ú × Ù Ð × Ð Ô ÚÓØ ×ØÓ ×Ù       × j ÖÙÞ
      i ×       Ö¸ × ÒÓ × Ò Ù ÒØÖ ÙÒ Ð Ú Ð Ð Ó Ö Ó ÕÙ × Ñ ÒÓÖ ÕÙ Ð Ô ÚÓØ
      i ÕÙ     ÔÓ× ÓÒ Ó Ò ÙÒ Ð Ú Ù Ð Ð Ô ÚÓØ º
          ÓÒ Ð × ÜÔÐ ÓÒ × ÒØ Ö ÓÖ × ÔÖÓÔ ×¸ ר ÑÓ× Ð ×ØÓ× Ô Ö ÑÓ×ØÖ Ö Ð Ô ÖØ ÓÒ
½       ¬Ò ÓÒ Ô ÖØ ÓÒ            ÖÖ ÐÓ ½ ≡
         template <typename T, class Compare>
     int partition(T * a, const int & l, const int & r)
     {
          ËÐ      ÓÒ Ö Ô ÚÓØ ½ ¿
          T pivot = a[r]; // elemento pivot
          int i = l - 1, // ındice del primer elemento a la izquierda mayor que pivot
                             ´
              j = r;      // ´ndice del primer elemento a la derecha mayor que pivot
                             ı
          while (true)
            {
                ÚÒ        ר ÔÖ Ñ Ö Ð Ñ ÒØÓ Ñ ÝÓÖ ÕÙ Ô ÚÓØ ½
                ÚÒ        ר ÔÖ Ñ Ö Ð Ñ ÒØÓ Ñ ÒÓÖ ÕÙ Ô ÚÓØ ½
               if (i >= j)
                 break;
                   // En este punto hay una inversi´n a[i] > a[pivot] > a[j]
                                                   o
               Aleph::swap(a[i], a[j]); // Eliminar la inversi´n
                                                              o
            }
          Aleph::swap(a[i], a[r]);
          return i;
     }
      ¬Ò ×
     partition¸   Ù×   Ò ÙÒ × ½ ¸ ½ ¼¸ ½ ¿ ¸ ½ ¸ ½ ¸ Ò ½   º
     Ä ÖÙØ Ò ØÓÑ ÓÑÓ Ô Ö Ñ ØÖÓ× Ð ÖÖ ÐÓ Ý ÐÓ× Ð Ñ Ø × ÞÕÙ Ö Ó Ý Ö Ó¸ ÒÓÑ Ò ¹
     Ó× l Ý r¸ Ö ×Ô Ø Ú Ñ ÒØ º
       Ä ÔÖ Ñ Ö Ð Ò       Ð Ñ ØÓ Ó × ÙÒ Ô ×Ó ÙÒ Ñ ÒØ Ð Ò Ð × ÑÔ ÒÓ Ð ÕÙ ×ÓÖØ Ý
     ÓÒ× ×Ø Ò × Ð ÓÒ Ö ÙÒ Ð Ñ ÒØÓ ÕÙ ÙÒ          Ô ÖØ ÓÒ ÓÖ Ð ÖÖ ÐÓº Ì Ð Ð Ñ ÒØÓ
    × ÒÓÑ Ò Ô ÚÓØ º ÈÓÖ ÓÖ ¸ ×ÙÑ ÑÓ× ÕÙ × Ð ÓÒ ÑÓ× Ð ÙÐØ ÑÓ Ð Ñ ÒØÓ ×
        Ö a[r]º
         Ü ×Ø Ò ÓØÖ × ÓÖÑ ×     × Ó Ö Ð Ð Ñ ÒØÓ Ô ÚÓØ ÕÙ ×ÓÒ Ñ × ÓרÓ× × Ò Ø ÑÔÓ
     ÓÒר ÒØ ¸ Ô ÖÓ ÕÙ Ñ ÓÖ Ò Ð ×Ô Ö ÒÞ        ÙÖ ÓÒ Ð ÓÖ Ò Ñ ÒØÓº Ù ÐÕÙ Ö ×
     Ð Ñ ØÓ Ó¸ ÒÓ× Ö Ñ Ø Ö ÑÓ× ÓÐÓ Ö Ð Ô ÚÓØ Ò Ð ÜØÖ ÑÓ Ö Óº             ר ÑÓ Ó¸
    ÙÒ ÑÓ ¬ ÓÒ Ð Ò ÓÕÙ              × Ð ÓÒ Ô ÚÓØ ÒÓ Ø Ð Ö ×ØÓ Ð Ð ÓÖ ØÑÓ
    Ô ÖØ ÓÒº
    3.2.2.2     An´lisis del quicksort
                  a

     Ð Ò Ð × × Ð ÕÙ ×ÓÖØ Ö ÕÙ Ö Ö ×ÓÐÚ Ö Ð        Ù ÓÒ ´¿º¾¿µ¸ Р٠и ×Ù Ú Þ¸ Ö ÕÙ Ö    Ð
     Ò Ð × × Ð Ô ÖØ ÓÒº
3.2. Algoritmos dividir/combinar                                                   189



     Ù ÐÕÙ Ö × Ð ×ÔÓ× ÓÒ Ð ÖÖ ÐÓ¸ Ð while Ñ × ÜØ ÖÒÓ ÖÓÑÔ Ù Ò Ó × ÖÙ Ò
ÐÓ× Ò × i Ý jº È Ö ÕÙ ×ØÓ ×Ù Ø Ò Ò ÕÙ Ó ÙÖÖ Ö Ü Ø Ñ ÒØ r−l+1 Ò Ö Ñ ÒØÓ×
Ý Ö Ñ ÒØÓ׺ ÈÓÖ Ø ÒØÓ¸ × n = r − l + 1¸ ÒØÓÒ × Ð Ø ÑÔÓ    Ù ÓÒ × O(n)º
ËÙר ØÙÝ Ò Ó ×Ø Ø ÑÔÓ Ò Ð Ù ÓÒ ´¿º¾¿µ ÔÙ      ÔÖÓÜ Ñ Ö×
                             O(1)                                   ,n ≤ 1
               T (n) =                                                       .    ´¿º¾ µ
                             O(n) + T (Ô ÚÓØ −l) + T (r − Ô ÚÓØ) , n > 1

   Ë ×ÙÔÓÒ ÑÓ× ÙÒ Ô ÖÑÙØ ÓÒ Ð ØÓÖ ¸ ÒØÓÒ × Ð ×Ô Ö ÒÞ ×Ó Ö Ð ÔÙÒØÓ
Ô ÖØ ÓÒ × × ØÙ Ò l+r ¸ Ó × ¸ Ò Ð ÒØÖÓ Ð ÖÖ ÐÓ¸ ÔÓÖ ÐÓ ÕÙ Ð Ù ÓÒ ´¿º¾ µ
                  2
ÔÙ    ÔÖÓÜ Ñ Ö× ÓÑÓ
                                         O(1)              ,n ≤ 1
                             T (n) =                                ;             ´¿º¾ µ
                                         O(n) + 2T (n/2)   ,n > 1

Ð Ù Ð × O(n Ð (n))º
      Ð × ÑÔ ÒÓ Ð ÕÙ ×ÓÖØ              × O(n Ð (n)) Ô Ö Ð ×Ó ×Ô Ö Ó Ý Ô Ö Ð Ñ ÓÖ ×Óº
      Ð Ô ÓÖ ×Ó ÔÙ Ó ÙÖÖ Ö              Ù Ò Ó Ð Ô ÚÓØ × Ùר Ñ ÒØ Ð Ñ ÝÓÖ ØÓ Ó× ÐÓ×
 Ð Ñ ÒØÓ× ÒØÖ i Ý jº Ò ×Ø              × ÓÖØÙÒ × ØÙ ÓÒ¸ Ð Ô ÖØ ÓÒ ÞÕÙ Ö × ÐÓÒ ¹
ØÙ r − l − 1¸ Ñ ÒØÖ × ÕÙ Ð               Ð Ö        × 0º Ò ÓØÖ × Ô Ð Ö ×¸ ÒÓ × ÐÓ Ö Ú Ö
    Ø Ú Ñ ÒØ º Ä Ù ÓÒ ´¿º¾             µ × ÜÔÖ × ÓÑÓ
                                        O(1)               ,n ≤ 1
                         T (n) =                                    ;             ´¿º¾ µ
                                        O(n) + T (n − 1)   ,n > 1

Ð Ù Ð × O(n2)º Ð ÕÙ ×ÓÖØ Ú Ò ¸ Ò Ð Ô ÓÖ ×Ó¸ Ð Ð ÒØÓ ¾ º Ù Ò ÔÖÓ Ð ×
ÕÙ       Þ ÐÓ Ô ÓÖ Ð Ù Ð ÕÙ Ò Ð Ú ¸ ÑÙÝ ÔÓ Óº È Ö ÒØÙ Ö ×Ø             Ó¸ ÔÐ ÒØ ÑÓ×
 Ð ÙÒÓ× ÑÙÝ Ñ ÐÓ× ×Ó× º
    ÍÒ ÑÙÝ Ñ Ð ×Ó ×Ø        Ó¸ Ô Ö Ó Ñ ÒØ ¸ Ù Ò Ó Ð ÖÖ ÐÓ ×Ø ÓÖ Ò Óº Ò ×Ø
× ØÙ ÓÒ¸ Ð Ô ÚÓØ × ÑÔÖ × Ð Ñ ÝÓÖ Ð Ñ ÒØÓ¸ Ð Ù Ð Ý × Ò Ù ÒØÖ Ò ×Ù ÔÓ× ÓÒ
   ¬Ò Ø Ú Ð Ô ÖØ ÓÒ ÞÕÙ Ö × ÐÓÒ ØÙ n − 1 Ñ ÒØÖ × ÕÙ Ð Ö                    × ÒÙÐ º Ä
ÔÖÓ Ð            ר Ò ÓÖØÙÒ Ó × n! ¸ ÔÙ × ×ÓÐÓ Ü ×Ø ÙÒ ÔÓ× Ð
                                  1
                                                                  ÒØÖ Ð × n! ÔÓ× Ð ×º
    ÍÒ ×Ó Ð Ö Ñ ÒØ Ô ÓÖ ÕÙ Ð ÒØ Ö ÓÖ ×              Ù Ò Ó Ð ÖÖ ÐÓ ×Ø ÓÖ Ò Ñ ÒØ
 ÒÚ ÖØ Óº ר ×ÔÓ× ÓÒ Ù× ÙÒ Ô ÖØ ÓÒ ÞÕÙ Ö ÒÙÐ Ý ÙÒ Ö                             ÐÓÒ ¹
ØÙ n − 1º Ä ÔÖÓ Ð           × ÒØ Ð ×Ó ÒØ Ö ÓÖ n! º      1

     ÉÙ Ø Ò ÔÖÓ Ð × Ø Ò Ö ÙÒ Ñ Ð ×Ó Ò ×Ø ר ¸ ר Ö ×ÔÙ ×Ø Ð                     Ð Ú¹
Ö ÒÞ º Ë Ð Ô ÖÑÙØ ÓÒ × Ð ØÓÖ ¸ ÒØÓÒ × Ð Ô ÖØ ÓÒ Ú Ö Ö × ÙÒ ÙÒ ×ØÖ Ù ÓÒ
ÙÒ ÓÖÑ × Ö (r−l+1) −1 ÔÓÖ ÐÓ ÕÙ Ð ÔÙÒØÓ Ô ÖØ ÓÒ × ×Ú Ö ÒØÖÓ Ð Ö Ò Ó
                         2
                       2
   ¬Ò Ó ÔÓÖ      12 ¸ ÐÓ ÕÙ
               (n) −1
                2
                              ÖÖÓ ÙÒ ÖÖÓÖ ×Ô Ö Ó 29± ÔÖÓÜ Ñ Ñ ÒØ º Ò ÓØÖÓ×
Ø ÖÑ ÒÓ׸ ÙÒ ×Ô          Ñ Ð ×Ó ×Ô Ö Ó Ô ÖØ ÓÒ × ÕÙ ×Ø ×             ÔÖÓÔÓÖ ÓÒ 1/3
ÔÖÓÔÓÖ ÓÒ ÕÙ ÙÒ Ú            Ð ÖÖ ÐÓ Ñ Ò Ö            ØÚ º    Ñ ×¸ ר       ×Ú ÒØÙÖ
Ø Ò Ö ÕÙ Ó ÙÖÖ Ö ÓÒ Ð Ñ ÝÓÖ          Ð × Ô ÖØ ÓÒ × Ù ×Ø ÓÒ ÐØ Ñ ÒØ ÑÔÖÓ Ð × Ð ×
Ô ÖÑÙØ ÓÒ × × ×ØÖ ÙÝ Ò × ÙÒ ÙÒ Ò×                 ÙÒ ÓÖÑ º
3.2.2.3   An´lisis de consumo de espacio del quicksort
            a

ÄÓ× Ð ÓÖ ØÑÓ× Ö ÙÖ× ÚÓ× ÓÒÐÐ Ú Ò ÙÒ Óר Ò ×Ô Ó Ó Ð Ô Ð º Ò ×Ø × ÒØ Ó¸
ÙÒ Ð ÓÖ ØÑÓ Ú Ö» ÓÑ Ò Ö ÓÒ×ÙÑ ×Ô Ó Ô Ð Ù Ò Ó Ñ ÑÓÖ Þ ÙÒ            Ð×
190                                            Cap´
                                                       ıtulo 3. Cr´
                                                                  ıtica de algoritmos



       Ú × ÓÒ ×     ØÓ× ÔÖÓ × Ö Ö ÙÖ× Ú Ñ ÒØ Ð ÓØÖ º  ר ÑÓ Ó¸ ÓÒ ÓÖÑ ÙÑ ÒØ Ò
     Ð × Ú × ÓÒ ×¸ Ñ ÝÓÖ Ñ ÑÓÖ × Ö ÕÙ Ö º
           Ð ÕÙ ×ÓÖØ ÔÙ × Ö ÑÙÝ ÓרÓ×Ó Ò ×Ô Ó × Ó ÙÖÖ Ò Ñ Ð × Ô ÖØ ÓÒ × ×Ù × Ú ×º
       ÔÖ Ò ÑÓ× ×ØÓ Ñ Ö Ò Ó Ð Ô ÓÖ ØÓ Ó× ÐÓ× Ñ ÐÓ× ×Ó׸ Ð Ù Ð Ó ÙÖÖ Ù Ò Ó Ð
      ÖÖ ÐÓ ×Ø ÒÚ Ö× Ñ ÒØ ÓÖ Ò Óº Ò ×Ø × ØÙ ÓÒ¸ × ÙÒ ¬Ò ÓÒ Ô ÖØ ÓÒ
          ÖÖ ÐÓ ½ ¸ Ð ÖÖ ÐÓ × ÑÔÖ × Ô ÖØ ÓÒ Ò
     pivotquick sort rec<T, Compare>(a, l+1, r-1)          quick sort rec<T, Compare>(a, r+1, r)
                          ÇÖ Ò ÒÚ ÖØ Ó                      ∅
       l                                               r
         ÐÓ ÕÙ ¸ × ÙÒ Ð ÑÔÐ ÒØ ÓÒ quicksort rec()¸ Ù× Ð × ÐÐ Ñ × Ö ÙÖ× Ú × ´ ÓÐÓ¹
          × ÓÒ Ô Ö Ñ ØÖÓ× Ö Ð ×µ quicksort rec(a, l, r-1) Ý quicksort rec(a, r+1,
     r)¸ Ù×ØÓ Ò × ÓÖ Ò Ö ×Ô Ø ÚÓº
         ÆÓØ ÑÓ× ÕÙ ×Ø ÓÖ Ò ÐÐ Ñ × ÑÔ Ð Ð Ô ÖØ ÓÒ Ñ × Ô ÕÙ Ò Ñ ÒØÖ × ×
         ØÙ Ð ÐÐ Ñ Ö ÙÖ× Ú ×Ó Ö Ð Ô ÖØ ÓÒ Ñ × Ö Ò ÙÝÓ Ø Ñ ÒÓ × r − l − 1º
     ×Ù Ú Þ¸ ÔÙ ×ØÓ ÕÙ Ð Ö ×ØÓ Ð ÖÖ ÐÓ ×Ø ÒÚ Ö× Ñ ÒØ ÓÖ Ò Ó¸ Ð × Ù ÒØ ÒÚÓ ÓÒ
       quicksort rec(a, l, r - 1) Ù×         ÒÙ ÚÓ Ð Ô ÓÖ Ô ÖØ ÓÒ¸ ÔÓÖ ÐÓ ÕÙ × ÚÙ ÐÚ
      ÑÔ Ð Ö Ð Ô ÖØ ÓÒ Ú Ñ ÒØÖ × × ÐÐ Ñ Ö ÙÖ× Ú Ñ ÒØ Ð Ô ÖØ ÓÒ Ø Ñ ÒÓ r−l−
     2º ר ÔÖÓ ×Ó       Ñ Ð × Ô ÖØ ÓÒ × ÓÒØ ÒÙ ×Ø ÕÙ × ÓÖ Ò ÒØ Ö Ñ ÒØ Ð ÖÖ ÐÓº
           Ð Ô ÓÖ ×Ó Ð ÕÙ ×ÓÖØ ×ÓÐÓ ÑÔ Ð Ô ÖØ ÓÒ × Ú ×º È Ö ÔÖ × Ö Ð Óר Ò
      ×Ô Ó ×Ø × ÐÐ Ñ × Ú Ò × Ý ÕÙ ÓÒØ Ö Ð ÒØ                   Ú × ÕÙ × ÐÐ Ñ Ö ÙÖ× ¹
     Ú Ñ ÒØ Ð ÕÙ ×ÓÖØ¸ Р٠Р׸ Ü Ø Ñ ÒØ ¸ Ð ÒÙÑ ÖÓ Ð Ñ ÒØÓ× n Ó × ¸ O(n)º ÍÒ
     ÑÙÝ Ñ Ð ×Ó Ð ÕÙ ×ÓÖØ ÔÙ ¸ ÐÑ ÒØ ¸ Ù× Ö ÙÒ × ÓÖ                  ÔÐ º
         È Ö Ú Ø Ö ×ØÓ¸        ÑÓ× × ÙÖ ÖÒÓ× ÕÙ Ð ÔÖ Ñ Ö ÐÐ Ñ Ö ÙÖ× Ú ×             ØÙ
     ×Ó Ö Ð Ô ÖØ ÓÒ Ñ × Ô ÕÙ Ò ¸ ÑÓ Ó Ø Ð ÕÙ × ÑÔ Ð Ñ ÒÓ׸ Ô٠׸ Ñ ÒÓÖ Ø Ñ ÒÓ
        Ô ÖØ ÓÒ¸ Ó ÙÖÖ Ö ÙÒ Ñ ÒÓÖ ÒØ            ÐÐ Ñ × Ö ÙÖ× Ú ×º        ר Ñ Ò Ö ¸ ÙÒ
     ÑÙÝ Ð Ö Ú Ö ÓÒ quicksort rec()¸ ÕÙ Ñ Ò Ñ Þ Ð ÓÒ×ÙÑÓ Ô Ð ¸ × ÒÙÒ
      ÓÑÓ × Ù
½¼    Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡                                  ½ ½¿
           template <typename T, class Compare>
       void quicksort_rec_min(T * a, const int & l, const int & r)
       {
         if (r <= l)
           return;
         const int pivot = partition<T, Compare>(a, l, r);
         if (pivot - l < r - pivot) // ¿cual es la partici´n m´s peque~a?
                                                           o  a       n
           {     // partici´n izquierda m´s peque~a
                           o             a       n
             quicksort_rec_min<T, Compare>(a, l, pivot - 1);
             quicksort_rec_min<T, Compare>(a, pivot + 1, r);
           }
         else
           {     // partici´n derecha m´s peque~a
                           o           a       n
             quicksort_rec_min<T, Compare>(a, pivot + 1, r);
             quicksort_rec_min<T, Compare>(a, l, pivot - 1);
           }
       }
     Í× × partition ½ º
3.2. Algoritmos dividir/combinar                                                                191



       ר Ú Ö× ÓÒ ÒÚÓ Ð Ö ÙÖ× ÓÒ × Ð Ñ ÒÓÖ ×Ø Ð Ñ ÝÓÖ Ô ÖØ ÓÒ¸ ÐÓ Ù Ð
    Ö ÒØ Þ ÙÒ ÓÒ×ÙÑÓ Ô Ð Ñ Ò ÑÓº           Ù ÒØÓ × ØÖ Ø ×Ø ÓÒ×ÙÑÓ È Ö Ö ×ÔÓÒ Ö
 Ð Ù ×Ø ÓÒ¸         ÑÓ× ÔÖ Ñ ÖÓ ÒØ ¬ Ö Ù Ð × Ð Ñ Ü ÑÓ Ø Ñ ÒÓ ÕÙ ÔÙ ØÓÑ Ö ÙÒ
 Ñ ÒÓÖ Ô ÖØ ÓÒ Ý ×ÙÑ Ö ÕÙ ÐÐÓ Ó ÙÖÖ Ö ÙÖ× Ú Ñ ÒØ Ò              ÐÐ Ñ Ö ÙÖ× Ú º Ð
 Ñ Ü ÑÓ ÕÙ           Ð ÑÓ× × ÔÖ × ÒØ Ù Ò Ó Ð Ô ÖØ ÓÒ Ó ÙÖÖ Ü Ø Ñ ÒØ ÔÓÖ Ð ÒØÖÓ¸
  Р٠и ÒÓ ×ÓÖÔÖ Ò ÒØ Ñ ÒØ ¸ × Ð Ñ ÓÖ ×Ó Ô ÖØ ÓÒ Ò Ú ÐÓ              ÓÖ Ò Ñ ÒØÓ
 Ý Ó ÙÖÖ ¸ ÐÓ ×ÙÑÓ¸ O(Ð (n)) Ú ×¸ ÕÙ × Ð Ñ ÝÓÖ ÔÖÓÔÓÖ ÓÒ Ú × ÕÙ ÔÓ ÑÓ×
   Ú Ö Ð ÖÖ ÐÓº ÈÓÖ Ø ÒØÓ¸ quicksort rec min() Ø Ò ÙÒ ÓÒ×ÙÑÓ ×Ô Ó O(Ð (n))
  Ò Ð Ô ÓÖ ×Ó¸ Óר Ô Ö Ø Ñ ÒØ Ñ Ò Ð ÙÒ Ô Ö Ô Ð × Ô ÕÙ Ò ×º
       Ð Ò Ð × × ÔÖ     ÒØ Ø Ñ Ò ÒÓ× Ù ÒØ Ö             Ð ÒÙÑ ÖÓ ÒÚÓ ÓÒ × Ö ÙÖ¹
 × Ú × ÕÙ Ó ÙÖÖ Ö Ò Ò Ð Ñ ÓÖ ×Ó Ð ÕÙ ×ÓÖØ × Ö¸ Ù Ò Ó ØÓ × Ð × Ô ÖØ ÓÒ ×
 Ó ÙÖÖ Ò ÔÓÖ Ð ÒØÖÓº Ò ×Ø ×Ó¸              ÐÐ Ñ      Ð ÕÙ ×ÓÖØ Ó × ÓÒ Ó× ÐÐ Ñ ×
 Ö ÙÖ× Ú × ×Ó Ö Ô ÖØ ÓÒ × Ð Ñ ×ÑÓ Ø Ñ ÒÓº ÈÓÖ Ø ÒØÓ¸ Ð ØÓØ Ð ÐÐ Ñ × Ö ÙÖ× Ú ×
 ÕÙ ØÓÑ Ö Ð Ñ ÓÖ ×Ó Ð ÕÙ ×ÓÖØ ר Ö                Ó ÔÓÖ
                                      Ð (n)
                                              2i ≤ 2Ð   (n)+1
                                                                −1 ;                           ´¿º¾ µ
                                         i

  ÓÒ n    × Ð ÒØ          Ð Ñ ÒØÓ׺ Ä ×ÙÑ ØÓÖ Ü Ø Ó ÙÖÖ Ö × n = 2k − 1 Ó × ¸
 × n+1     × ÙÒ ÔÓØ Ò Ü Ø          2º Ò ×Ø    ×Ó¸ ØÓ × Ð × Ô ÖØ ÓÒ × Ó × ÓÒ ×
 × ÑÔÖ ×ÓÒ Ü Ø Ñ ÒØ Ð Ñ ×ÑÓ Ø Ñ ÒÓº Ä ¬ ÙÖ ¿º Ô ØÓÖ Þ ØÓ × Ð × ÐÐ Ñ ×
 Ö ÙÖ× Ú × ÕÙ Ó ÙÖÖ Ò Ô Ö n = 15 Ò ÙÒ ×ØÖÙ ØÙÖ ÒÓÑ Ò           Ö ÓÐ ¸ Ð Ù Ð × Ö
   ×ØÙ      Ò Ð Ô ØÙÐÓ º

                                                    qs(0, 14)


                      qs(0, 6)                                                     qs(8, 14)


       qs(0, 2)                     qs(4, 6)                           qs(8, 10)               qs(12, 14)


qs(0, 0)         qs(2, 2)     qs(4, 4)       qs(6, 6)           qs(8, 8)    qs(10, 10) qs(12, 12) qs(14, 14)



   ÙÖ ¿º רÖÙ ØÙÖ      Ð × Ô ÖØ ÓÒ × Ý ÐÐ Ñ                       × Ö ÙÖ× Ú × Ô Ö Ð Ñ ÓÖ ×Ó Ð
 ÕÙ ×ÓÖØ Ý ½ Ð Ñ ÒØÓ׺
    ÈÖ ×Ø ÑÓ× Ø Ò ÓÒ ×Ô Ð Ð Ö Ñ ¿º           ÒØ ¬ÕÙ ÑÓ× Ð ÔÖ Ñ Ö ÐÐ Ñ qs(0,
 14) ½¼ º ר ÐÐ Ñ      Ò Ö Ð × ÐÐ Ñ × qs(0, 6) Ý qs(8, 14)º Ð Ð ÓÖ ØÑÓ × Ð ¹
  ÓÒ qs(0, 6) Ô Ö ÓÒØ ÒÙ Ö Ð Ö ÙÖ× ÓÒ Ý ÑÔ Ð qs(7, 14)º ×Ù Ú Þ¸ qs(0, 6)
  ÑÔ Ð qs[4, 6] Ý ÔÖÓ× Ù Ö ÙÖ× Ú Ñ ÒØ ×Ó Ö qs(0, 2)º Ù Ò Ó × ÐÐ ÔÓÖ ÔÖ Ñ Ö
 Ú Þ Ð ×Ó × ¸ Ð Ô Ð ÓÒØ Ò Ð × ÐÐ Ñ × qs(0, 14)¸ qs(7, 14)¸ qs(4, 6)¸ qs(2,
 2) Ô Ò ÒØ × ÔÓÖ Ö Ð Þ Öº
  ½¼
       Ð ÒÓÑ Ö     Ð Ñ ØÓ Ó   × Ó   Ö Ú Ó ÔÓÖ ÓÒÓÑ                ×Ô Óº
192                                              Cap´
                                                    ıtulo 3. Cr´
                                                               ıtica de algoritmos



   Ä Ñ Ü Ñ ÒØ             ÐÐ Ñ × ÑÔ Ð Ö ×Ø      ÔÓÖ Ð Ñ Ü Ñ ÔÖÓ ÙÒ
  Ð Ö ÓÐ × qs(0, 14) ר Ù ÐÕÙ Ö ×Ó × qs(i, i)º Ù ÐÕÙ Ö × Ð Ú ÐÓÖ Ý
Ø Ñ ÒÓ Ð ÒØÖ ¸ × × ÔÖÓ × ÔÖ Ñ ÖÓ Ð Ô ÖØ ÓÒ Ñ × Ô ÕÙ Ò ¸ ÒØÓÒ × Ð ÓÒ×ÙÑÓ
 Ò Ô Ð ÒÓ ×Ó Ö Ô × O(Ð (n))º
3.2.2.4   Selecci´n del pivote
                 o

Ë Ð Ô ÖÑÙØ ÓÒ Ð ÖÖ ÐÓ × Ð ØÓÖ ¸ ÒØÓÒ ×¸ Ð × Ð ÓÒ Ð Ô ÚÓØ ÔÓÖ Ð Ö
   Ð ÖÖ ÐÓ¸ Ø Ð ÓÑÓ ×Ø Ð ÔÖ × ÒØ Ð ÑÓ× ØÖ Ø Ó¸ Ø Ñ Ò × Ð ØÓÖ º ÈÓÖ Ø ÒØÓ¸
Ô Ö Ô ÖÑÙØ ÓÒ × Ð ØÓÖ ×¸ ÒÙ ×ØÖ Ú Ö× ÓÒ Ð ÕÙ ×ÓÖØ               ÓÑÔÓÖØ Ö× O(n Ð (n))¸
 Ò Ð ×Ó ×Ô Ö Óº Ò Ò ÙÖ ¸ Ð Ú Ö ÒÞ ´29±µ Ò                  ÕÙ ¸ Ò ×Ó Ñ Ð ×Ù ÖØ ¸
 Ð ÕÙ ×ÓÖØ ÙÒ × Ö Ô Óº
      Ð Ö ÞÓÒ Ñ ÒØÓ ÒØ Ö ÓÖ ÔÖ ×ÙÑ ÕÙ Ð Ô ÖÑÙØ ÓÒ × ×ØÖ ÙÝ ÙÒ ÓÖÑ Ñ ÒØ
 Ù ×Ø ÓÒ ÔÐ Ù× Ð      ÓÒ Ò Ð ÑÙÒ Ó Ó Ø ÚÓ Ð ×Ø ר ¸ Ô ÖÓ ÕÙ ÔÙ Ô Ö
      Ò      Ò Ð ÑÙÒ Ó Ö Ðº ÌÓ Ó Ô Ò         ÕÙ × ÐÓ ÕÙ × ÓÖ Ò Ý ×                ÓÒ
ÔÖÓÚ Ò Ð × Ù Ò º Ò Ð Ú Ó ÙÖÖ ÕÙ ÐÓ× ÕÙ Ý ÐÓ× ×                           × × ÑÔÖ ×ÓÒ
× × Ó׺
    ÈÓÖ ÓØÖ Ô ÖØ ¸ Ð Ô ÓÖ ×Ó Ð ÕÙ ×ÓÖØ × Ø Ò × Ú Ö Ñ ÒØ Ð Ñ ØÓ×Ó ÕÙ Ò Ò ÙÒ
 ÔÐ ÓÒ × Ö ÔÙ ×Ù Ý Ö ×Ó Ö Ð × Ð × ÑÔ ÒÓ × ÐÓ Ö Ø Óº
    ÄÓ ÒØ Ö ÓÖ Ùר ¬ ÓÒ×ÙÑ Ö ÙÒ ÔÓ Ó Ø ÑÔÓ ÓÒר ÒØ Ô Ö ÓÖÞ Ö¸ Ò Ð Ñ
ÔÓ× Ð ¸ ÕÙ Ó ÙÖÖ Ò Ù Ò × Ô ÖØ ÓÒ ×º Ä Ñ ÓÖ Ñ Ò Ö             Ð Ñ Ò Ö ÙÒ × × Ó × Ð ØÓÖ¹
 Þ Ö ÜÔÐ Ø Ñ ÒØ º Ä           × ÓÖÞ Ö ÕÙ Ù ÐÕÙ Ö × Ð Ô ÖÑÙØ ÓÒ¸ Ð × Ð ÓÒ Ð
Ô ÚÓØ Ó Þ ÙÒ Ö Ø Ö Ó Ð ØÓÖ Ó¸ Р٠и Ø Ð ÓÑÓ ÐÓ Ö Ù ÑÓ׸ ÔÖÓ Ð ×Ø Ñ ÒØ
   Ù× Ù ÒÓ× ×Ó׺
      Ò ×Ø ÓÖ Ò          ׸ ÙÒ ÔÖ Ñ Ö ×ØÖ Ø     ÓÒ× ×Ø Ö Ò Ð ØÓÖ Þ Ö Ð Ô ÖØ ÓÒ
 × Ö¸ Ò ×ÓÖØ Ö Ð ØÓÖ Ñ ÒØ Ð × Ð ÓÒ Ð Ò                  Ð Ô ÚÓØ º Ð Ò Ô ÚÓØ × Ö ¸
 ÒØÓÒ ×¸ ÙÒ ÒÙÑ ÖÓ Ð ØÓÖ Ó ÒØÖ l Ý rº         ר ÑÓ Ó¸ Ð Ð ØÓÖ           Ý ÒÓ Ô Ò
    ÑÓ Ó Ð ÙÒÓ Ð Ú ÐÓÖ Ð Ô ÖÑÙØ ÓÒº
    Ä Ø Ò ÒØ Ö ÓÖ × Ù Ò ¸ Ô ÖÓ ÒÓ Ú Ø Ð ÔÓ× Ð                    ÕÙ Ð Ô ÚÓØ Ð ØÓÖ Ó
   Ù× ÙÒ Ñ Ð Ô ÖØ ÓÒº ÍÒ Ø Ò Ô Ö ×Ñ ÒÙ Ö ×Ø ÔÓ× Ð                       × ×ÓÖØ Ö Ú Ö Ó×
 Ò × Ý × Ð ÓÒ Ö ÓÑÓ Ô ÚÓØ Ð Ú ÐÓÖ Ð Ñ Ò º ×ØÓ ÓÒÐÐ Ú Ð ¬ ÙÐØ
ÕÙ Ý ÕÙ Ú Ö ¬ Ö ÕÙ ÐÓ× ×ÓÖØ Ó× ÒÓ × Ö Ô Ø Ò¸ ÐÓ ÕÙ × Ð ÓÖ ØÑ Ñ ÒØ Ò ÓÖÖÓ×Ó
ݸ Ò ÙÖ ÓÒ ÓÒר ÒØ ¸ ÓרÓ×Óº ÈÓÖ × Ö ÞÓÒ¸ × ÔÖ Ö Ð ÒÓ Ú Ö ¬ Ö Ö Ô Ø Ò Ý
× ÑÔÐ Ñ ÒØ × Ð ÓÒ Ö Ð Ñ Ò ¸ × Ó ÙÖÖ Ò Ö Ô Ø Ò ×º Ê ×Ø ÔÓÖ                     Ö Ù ÒØÓ×
×ÓÖØ Ó× ×      Ò Ö Ð Þ Öº Å ÒØÖ × Ñ ÝÓÖ × ×Ø ÒØ ¸ Ñ ÝÓÖ ÔÓ× Ð                 × ØÒÖ
    Ó Ø Ò Ö ÙÒ Ù Ò Ô ÚÓØ ¸ Ô ÖÓ¸ Ø Ñ Ò¸ × Ø Ò Ö Ñ ÝÓÖ ÓÒ×ÙÑÓ Ø ÑÔÓ ÓÒר ÒØ
Ý Ñ ÝÓÖ ÑÔ ØÓ Ò Ð × ÑÔ ÒÓº
    Ä Ð ØÓÖ Þ ÓÒ × ÙÒ ÔÖ Ò Ô Ó Ð ÓÖ ØÑ Ó Ø Ò ÒØ             ×Ñ ÒÙ Ö Ð Ñ Ð ×Ù ÖØ Ó
  ÚÓÖ Ö Ð Ù Ò º Ð ÔÖ Ò Ô Ó ÓÖ × ÓÒÓ Ó Ó Ð ÖÓØÙÐÓ                     Ð ÓÖ ØÑÓ× Ð ØÓÖ ¹
Þ Ó× Ý ÓÒר ØÙÝ ØÓ ÙÒ Ö Ñ Ð Ð ÓÖ ØÑ º Ò ×Ø Ø ÜØÓ × ×ØÙ Ö Ò Ú Ö× ×
 Ð × × Ð ØÓÖ Þ ÓÒº
    ÍÒ ×ÕÙ Ñ ÕÙ ÒÓ Ö ÕÙ Ö Ò Ö Ö Ò × Ð ØÓÖ Ó× × ØÓÑ Ö ÐÓ× Ò × ÜØÖ ÑÓ× l¸ r
Ñ× ÐÒ           Ð ÒØÖÓ Ý × Ó Ö Ð × Ñ Ò Ð × ØÖ × ÒØÖ ×º Ë Ò¸ ÓÑÓ × ÑÔÖ ¸
Ð Ð ØÓÖ          ÔÒ         Ð Ô ÖÑÙØ ÓÒ¸ Ø Ò Ö ÕÙ         Ö Ô ÖÑÙØ ÓÒ × × × × ÔÓÖ
ÐÓ× ØÖ × Ð Ó× Ô Ö ÕÙ Ó ÙÖÖ ÙÒ ÑÙÝ Ñ Ð ×Ó Ð Ó ÔÓ Ó ÔÖÓ Ð                    ÓÒ Ö Ô ÖÓ
3.2. Algoritmos dividir/combinar                                                 193



     ×Ù× ÔØ Ð    Ó ÙÖÖ Ö Ó × Ö Ö Ñ ÒØ ÔÖÓÚÓ Ó½½ º Ò ×Ø × ÒØ Ó¸ Ð × Ù ÒØ
     ÖÙØ Ò × Ð ÓÒ Ð Ô ÚÓØ × ÙÒ ÐÓ Ö Ò ÜÔÐ Ó
½¿    Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡                      ½¼ ½¿
          template <typename T, class Compare>
      int select_pivot(T * a, const int & l, const int   & r)
      {
        if (l - r <= 2)
          return r;
        const int m = (r + l) / 2;                       // ındice del centro
                                                            ´
        const int p = Compare () (a[l], a[m]) ? m : l;   // p = max(a[l], a[m])
        return Compare () (a[r], a[m]) ? r : p;          // retornar min(a[r], a[m])
      }
        Ä ÖÙØ Ò ÒØ Ö ÓÖ Ô ÖÑ Ø ÓÑÔÐ Ø Ö Ð Ñ ØÓ Ó ¬Ò Ø ÚÓ          Ô ÖØ ÓÒ      Ð × Ù ÒØ
     ÑÒÖ
½¿   Ë Ð ÓÒ Ö Ô ÚÓØ ½ ¿ ≡                                               ´½ µ
      const int p = select_pivot <T, Compare> (a, l, r);
      Aleph::swap(a[p], a[r]);


     3.2.2.5   Quicksort sin recursi´n
                                    o

       ÓÒÓ Ó Ð Ô ØÖÓÒ        ÑÒ        ×Ô Ó Ð ÕÙ ×ÓÖØ¸ Ö ×ÙÐØ ØÖ Ø ÚÓ¸       ØÓ× Ð ¹
        Ö Ö Ð Ö ÔÓÖ Ð ÙÐÓ ÓÒר ÒØ ¸ ÒØ ÒØ Ö Ó Ø Ò Ö ÙÒ Ú Ö× ÓÒ ÒÓ Ö ÙÖ× Ú Ð Ñ ØÓ Óº
       × Ñ ×ÑÓ¸ Ð Ô ØÖÓÒ Ð Ð ÓÖ ØÑÓ Ø Ö Ø ÚÓ Ý × ÓÒÓ           × Ð × ÒÓ Ð Ú Ö× ÓÒ
      Ø Ö Ø Ú Ð Ù×ÕÙ           Ò Ö ´Ü ¾º½º½º¾ ´Ô Ò ¿¾µµº
           Ð ÕÙ ×ÓÖØ      Ù× Ö ÙÒ Ô Ð Ô Ö Ö ÓÖ Ö ÙÒ Ô ÖØ ÓÒ Ñ ÒØÖ × ÓÖ Ò Ð ÓØÖ º
       ר × Ð      Ö Ò ÓÒ Ð Ù×ÕÙ          Ò Ö Ø Ö Ø Ú ¸ Ð Ù Ð ÒÓ Ö ÕÙ Ö ÙÒ Ô Ð ÔÓÖÕÙ
     ÒÓ × Ö ÕÙ Ö Ö ÓÖ Ö Ð Ô ÖØ ÓÒ ÕÙ × × ÖØ ×ÔÙ × Ð Ú × ÓÒº
           × Ô٠׸ Ù× Ö ÑÓ× ÙÒ Ô Ð      Ô Ö × ÕÙ ÓÒØ Ò Ò ÐÓ× Ò × ÞÕÙ Ö Ó Ý Ö Ó
         Ð Ô ÖØ ÓÒº      Ö ×ØÓ¸ ÓÒ ÓÒ         Ð ×Ø Ó ÙÒ ÔÖÓÔ          Ö    ÓÒ Ý ÙÒ
     Ö ×ÔÓÒ× Ð ×ØÙ Ó¸ Ð × Ù ÒØ ÖÙØ Ò ÒÓ            ÔÐ ÒØ Ö ÔÖÓ Ð Ñ × ÓÑÔÖ Ò× ÓÒ
½¿    Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡                                   ½¿ ½
          template <typename T, class Compare>
      void quicksort(T * a, const int & l, const int & r)
      {
        typedef typename Aleph::pair<int, int> Partition;
        FixedStack<Partition, 32> stack;
        stack.push(Partition(l, r)); // empile todo el arreglo como partici´n inicial
                                                                           o
        while (stack.size() > 0)
          {
            const Partition p = stack.pop();
            const int pivot   = partition <T, Compare> (a, p.first, p.second);
            if (pivot - p.first < p.second - pivot) // ¿cu´l partici´n m´s peque~a?
                                                           a        o   a       n
              {     // partici´n izquierda m´s peque~a
                              o             a       n
                stack.push(Partition(pivot + 1, p.second));
                stack.push(Partition(p.first, pivot - 1));
              }
      ½½
          Ò × ÙÖ     × ×Ø Ñ ×¸ ÙÒ Ø Ò        Ò     ÓÒ × ÖÚ Ó¸ ÐÐ Ñ     Ø ÕÙ ÔÓÖ ÓÑÔÐ
     Ð ÓÖ ØÑ ¸ ÓÒ× ×Ø Ò ÜÔÐÓØ Ö Ñ ÐÓ× ×Ó× Ð Ð ÓÖ ØÑÓº Ò ×Ø × ÒØ Ó¸ ÔÙ Ö Ó ÙÖÖ Ö ÙÒ × ØÙ ÓÒ
     Ò Ð Ù Ð Ð Ö Ñ ÒØ × Ð          ÙÒ × ×Ø Ñ Ñ Ð × Ô ÖØ ÓÒ ×    ØÓ×   Ù× Ö ×Ù ÓÐ Ô×Óº
194                                                Cap´
                                                          ıtulo 3. Cr´
                                                                     ıtica de algoritmos



                 else
                   {     // partici´n derecha m´s peque~a
                                   o           a       n
                     stack.push(Partition(p.first, pivot - 1));
                     stack.push(Partition(pivot + 1, p.second));
                   }
             }
      }
      ¬Ò ×
      quicksort¸ Ù×     Ò ÙÒ × ½ ¸ ¾ ¸ Ò        º
    Í× × FixedStack   ½¼ Ò partition ½ º

    3.2.2.6       Quicksort sobre listas enlazadas

       ØÓ Ó× ÐÓ× Ð ÓÖ ØÑÓ× ÓÖ Ò Ñ ÒØÓ¸ ÕÙ Þ Ð Ñ × × ÑÔÐ            ÜÔÖ × Ö× ×   Ð ÕÙ ×ÓÖØ
    ×Ó Ö Ð ×Ø × ÒÐ Þ ×º Ä × Ù ÒØ ÖÙØ Ò ÐÓ Ò
½    Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡                                      ½¿ ½
          template <class Compare>
      void quicksort(Dlink & list)
      {
        if (list.is_unitarian_or_empty())
          return;
        Dlink * pivot = list.remove_next();
        Dlink smaller, bigger;         // listas de menores y mayores que pivot
          Ô ÖØ ÓÒ Ö Ð ×Ø ½
          quicksort <Compare> (bigger);
          quicksort <Compare> (smaller);
          list.concat_list(&smaller);    // restaurar las listas ordenadas en list
          list.append(pivot);
          list.concat_list(&bigger);
      }
    Í× × quicksort ½ ¿ º

        Ä ×ØÖÙ ØÙÖ Ð Ð ÓÖ ØÑÓ ÒÓ × Ò Ñ ×Ø Ö Ó× ¸ ÔÙ × × ÓÖÖ ×ÔÓÒ ÓÒ Ð ×ÕÙ Ñ
       Ð Ð ÓÖ ØÑÓ Ô ÖØ ÓÒ Ö Ð × Ù Ò Ò Ð Ô ØÖÓÒ smaller−→pivot−→biggerº Ä
    Ð ×Ø smaller ×ÓÐÓ ÓÒØ Ò ÐÓ× Ð Ñ ÒØÓ× Ñ ÒÓÖ × ÕÙ pivot¸ Ñ ÒØÖ × ÕÙ Ð Ð ×Ø bigger
    ÐÓ× Ñ ÝÓÖ ×º
            ÓÖ ÒÓ× Ö ×Ø ×Ô ¬ Ö Ð Ô ÖØ ÓÒ¸ Ð Ù Ð × ÓÒ× Ö Ð Ñ ÒØ Ñ × × Ò ÐÐ ÕÙ
      ÓÒ ÐÓ× ÖÖ ÐÓ×
½    Ô ÖØ ÓÒ Ö Ð ×Ø ½ ≡                                      ´½ ½ µ
      while (not list.is_empty())
      {
        Dlink * p = list.remove_next();
        if (Compare () (p, pivot))
          smaller.append(p);
        else
          bigger.append(p);
      }
3.2. Algoritmos dividir/combinar                                            195



    3.2.2.7   Mejoras al quicksort

    Ê Ú × ÑÓ× Ð ÔÖÓ Ñ ÒØÓ           Ô ÖØ ÓÒ     ¬Ò ÓÒ Ô ÖØ ÓÒ         ÖÖ ÐÓ ½
    Ý ÐÓ× ÓÖ Ò Ñ ÒØÓ×        × Ð ÓÒ Ò× Ö ÓÒ ÔÖ × ÒØ Ó× Ò Ü ¿º½º¿ ´Ô Ò ½ ¾µ
    Ý Ü ¿º½º ´Ô Ò ½ µ¸ Ö ×Ô Ø Ú Ñ ÒØ º ÍÒ ÔÖ Ñ Ö Ñ Ö Ò          ÕÙ ×ØÓ× Ñ ØÓ Ó×
         ÓÖ Ò Ñ ÒØÓ Ø Ò Ò Ñ ÒÓ× ÒרÖÙ ÓÒ × ÕÙ Ð ÔÖÓ Ñ ÒØÓ Ô ÖØ ÓÒ Ð ÕÙ ¹
    ×ÓÖØº ÍÒ Ö Ú × ÓÒ Ñ × Ù Ó× Ö Ú Ð ÕÙ ÐÓ× Ñ ØÓ Ó× ÓÖ Ò Ñ ÒØÓ¸ ÕÙ ×ÓÒ O(n2)¸
      ÓÒØ Ò Ò Ñ ÒÓ× if¸ Ñ ÒÓ× ÐÐ Ñ × Compare() Ý Ñ ÒÓ× ÓÑÔ Ö ÓÒ × Ò × ÕÙ
      Ð ÔÖÓ Ñ ÒØÓ Ô ÖØ ÓÒº
         ÄÓ× ÓÑ ÒØ Ö Ó× ÒØ Ö ÓÖ × Ùר ¬ Ò Ð Ó × ÖÚ ÓÒ ÑÔ Ö     ÕÙ ÐÓ× Ñ ØÓ Ó×
    × Ð ÓÒ Ò× Ö ÓÒ ×ÓÒ Ñ × Ö Ô Ó× ÕÙ Ð ÕÙ ×ÓÖØ Ô Ö ÖÖ ÐÓ× Ô ÕÙ ÒÓ׺ ÓÑÓ ×
    ÔÓ× Ð ×ØÓ Ê ÓÖ ÑÓ× ÕÙ Ð ÒÓØ ÓÒ O Ó ÙÐØ ÐÓ× Óר × ÓÒר ÒØ × Ý ÕÙ ×Ø ×ÓÐÓ
    Ö        ×ÔÙ × ÙÒ Ú ÐÓÖ ÒØÖ        ×Ô ¬ Óº À ÕÙ ¸ Ò Ð ÕÙ ×ÓÖØ¸ ÙÒ Ù Ò ×Ó
      ÕÙ ÐÐÓ× Óר × ÕÙ Ó ÙÐØ Ð ÒÓØ ÓÒ Oº
         ÍÒ Ñ ÓÖ ×Ù ×Ø Ò Ð Ð ÕÙ ×ÓÖØ ÓÒ× ×Ø Ò ÓÒÑÙØ Ö ÓØÖÓ Ñ ØÓ Ó ÓÖ ¹
    Ò Ñ ÒØÓ Ô Ö Ø Ñ ÒÓ× Ô ÖØ ÓÒ Ô ÕÙ ÒÓ׺ Ù ÒØÓ × ÐÓ Ñ × Ö Ò ÕÙ ÔÙ × Ö
    ÐÓ Ô ÕÙ ÒÓ Ô Ò ¸ × Ñ ÒØ ¸ Ð Ö Û Ö Ý Ð ÓÑÔ Ð ÓÖº ÈÙ ×ØÓ ÕÙ Ð Ñ ØÓ Ó
          Ò× Ö ÓÒ Ü     Ñ ÓÖ × Ø ÑÔÓ× ÓÒר ÒØ × ÕÙ Ð × Ð ÓÒ¸ ÐÓ ÒØ Ö Ö ÑÓ× Ð
    × Ù ÒØ Ú Ö× ÓÒ Ñ ÓÖ         Ð ÕÙ ×ÓÖØ
½    Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡                              ½   ½
         template <typename T, class Compare>
     void quicksort_insertion(T * a, const int & l, const int & r)
     {
       if (r <= l)
         return;
       const int pivot = partition<T, Compare>(a, l, r);
       const int l_size = pivot - l; // tama~o partici´n izquierda
                                            n         o
       const int r_size = r - pivot; // tama~o partici´n derecha
                                            n         o
       bool left_done = false; // true si partici´n izquierda est´ ordenada
                                                  o                a
       bool right_done = false; // true si partici´n derecha est´ ordenada
                                                  o             a
       if (l_size <= Aleph::Insertion_Threshold) // ¿partici´n izquierda peque~a?
                                                             o                n
         {     // s´ ==> ord´nela por inserci´n
                   ı         e                o
           insertion_sort<T, Compare>(a, l, pivot - 1);
           left_done = true;
         }
       if (r_size <= Aleph::Insertion_Threshold) // ¿partici´n derecha peque~a?
                                                             o              n
         {     // s´ ==> ord´nela por inserci´n
                   ı         e                o
           insertion_sort<T, Compare>(a, pivot + 1, r);
           right_done = true;
         }
       if (left_done and right_done)
         return; // ambas particiones ordenadas por inserci´n
                                                           o
       if (left_done) // ¿partici´n izquierda ordenada por inserci´n?
                                 o                                 o
         {     // s´; s´lo resta ordenar recursivamente la partici´n derecha
                   ı   o                                           o
           quicksort_insertion<T, Compare>(a, pivot + 1, r);
           return;
         }
       if (right_done) // ¿partici´n derecha ordenada por inserci´n?
                                  o                               o
         {     // s´; s´lo resta ordenar recursivamente la partici´n izquierda
                   ı   o                                           o
           quicksort_insertion<T, Compare>(a, l, pivot - 1);
196                                                          Cap´
                                                                ıtulo 3. Cr´
                                                                           ıtica de algoritmos



                return;
            }
              // En este punto, ambas particiones no fueron ordenadas por inserci´n
                                                                                 o
          if (l_size < r_size) // ordenar de primero la partici´n m´s peque~a
                                                               o   a       n
            {     // partici´n izquierda m´s peque~a
                            o             a       n
              quicksort_insertion <T, Compare> (a, l, pivot - 1);
              quicksort_insertion <T, Compare> (a, pivot + 1, r);
            }
          else
            {     // partici´n derecha m´s peque~a
                            o           a       n
              quicksort_insertion <T, Compare> (a, pivot + 1, r);
              quicksort_insertion <T, Compare> (a, l, pivot - 1);
            }
  }
Í× × partition ½ º

    Ð Ú ÐÓÖ Ü ØÓ Insertion Threshold × Ö Ð Ø ÚÓ Ý Ô Ò          Ð × ÓÒ                                ÓÒ ×
Ñ Ø Ö Ð × Ý ÓÔ Ö Ø Ú ×º ÍÒ Ú ÐÓÖ ÒØÖ 20 Ý 30 × ×Ù¬ ÒØ Ò Ð ÑÓÑ ÒØÓ Ö                                    ÓÒ
   ר Ø ÜØÓ½¾ º
3.2.2.8          Claves repetidas

  ÙÒÕÙ Ð Ð ÓÖ ØÑÓ Ô ÖØ ÓÒ ¬Ò ÓÒ Ô ÖØ ÓÒ            ÖÖ ÐÓ ½ ÙÒ ÓÒ ¹
 Ù Ñ ÒØ Ô Ö Ð Ú × Ö Ô Ø ×¸ ÔÓ Ö ÔÖÓÚ Ö× Ð ÔÖÓ ×Ó Ô ÖØ ÓÒ Ô Ö ÓÒ¹
× Ö Ö Ö Ô Ø Ò Ý Ö Ð Þ Ö ÙÒ Ô ÖØ ÓÒ ÓÒ Ð ÓÖÑ × Ù ÒØ
      l                                                                                          r

          Ð Ñ ÒØÓ× Ñ ÒÓÖ × ÕÙ Ô ÚÓØ         Ð Ñ ÒØÓ× Ù Ð × Ô ÚÓØ         Ð Ñ ÒØÓ× Ñ ÝÓÖ × ÕÙ Ô ÚÓØ

    ר Ø ÔÓ Ô ÖØ ÓÒ × Ð ÒÓÑ Ò          Ð ØÖ ÔÐ ÓÖÑ Ó Ò Ö ÓÐ Ò × ¸ Ò
  ÓÒÓÖ Ð Ò ÓÒ Ð           × Ö Ïº      ×ØÖ ¸ Ð ÔÖ Ñ Ö ÓÑ Ö ÕÙ × ÓÒÓ          Ö
Ö ÔÓÖØ Ó Ð × Ù Ö Ñ ÒØÓ Ð Ñ ØÓ Óº Ä Ú ÒØ             ר ×ÕÙ Ñ × ÕÙ ØÓ × Ð ×
 Ð Ú × Ö Ô Ø × ÕÙ Ò Ð ÒØÖÓ Ý Ð × ÒÚÓ ÓÒ × Ö ÙÖ× Ú × ×      ØÙ Ò ×Ó Ö ÓÒ ÙÒØÓ×
Ñ × Ô ÕÙ ÒÓ× ÕÙ ÒÓ ÓÒØ Ò Ò Ö Ô Ø Ò ×¸ ÐÓ ÕÙ Ð Ö Ð ÓÖ Ò Ñ ÒØÓº
    Ä Ô ÖØ ÓÒ     ÑÓ ¬ Ö× Ñ Ò Ö Ø Ð ÕÙ Ð × Ö Ô Ø Ò × × Ú Ý Ò ÓÐÓ Ò Ó ÔÓÖ
ÐÓ× ÜØÖ ÑÓ× Ò ÙÒ ×ÕÙ Ñ × Ñ Ð Ö Ð × Ù ÒØ
      l                                                                                          r
           ÙÐ          Ñ ÒÓÖ                      ×ÓÖ Ò                      Ñ ÝÓÖ          ÙÐ
                   p                i                                j               q


ÄÙ Ó¸ Ù Ò Ó ÐÓ× Ò × × ÖÙ Ò¸ × Ö Ð Þ Ò ÐÓ× ÒØ Ö Ñ Ó× Ò × Ö Ó× Ô Ö                                     Ö Ð
 ÖÖ ÐÓ ØÖ ÔÐ Ñ ÒØ Ô ÖØ ÓÒ Óº
   ÄÓ× Ø ÐÐ × Ð Ð ÓÖ ØÑÓ ×   Ò ÓÑÓ Ö Óº
 ½¾
          Ò Ò ÖÓ ¾¼¼ ¸ ÔÖÓ × ÓÖ ×       ¿     Þ¸ ÓÒ ¾Å             ľº
3.2. Algoritmos dividir/combinar                                             197



    3.2.2.9    Quicksort concurrente o paralelo

      Ò Ð ÕÙ ×ÓÖØ ÓÒ Ð ×Ø × ÒÐ Þ × × ÑÙÝ ÐÑ ÒØ ÔÖ Ò× Ð ×Ù Ð                      Ô Ö¹
     Ð Ð Þ ÓÒº Ò ØÓ¸ ÓÑÓ ÐÙ Ó Ð Ô ÖØ ÓÒ Ð Ô ÚÓØ Ý × Ò Ù ÒØÖ Ò ×Ù ÔÓ× ÓÒ
       ¬Ò Ø Ú ÒØÖÓ Ð ÓÖ Ò ×ÓÐÙØÓ¸ Ð × Ô ÖØ ÓÒ × ÔÙ Ò ÓÖ Ò Ö× Ò Ô Ò ÒØ Ñ ÒØ ¸
    ÔÓÖ × Ô Ö Ó¸ ÔÓÖ ×Ø ÒØÓ× Ð ÓÖ ØÑÓ׸ Ú Ö ÒØ × Ý¸ Ò ÐÓ ÕÙ ÓÒ ÖÒ Ð ÔÖÓÔÓ× ØÓ ר
    Ó × ÖÚ ÓÒ¸ ÔÓÖ ÔÖÓ × ÓÖ × Ö ÒØ ׺ ÓÑÓ Ñ Ò Ö Ñ × Ñ Ð Ö               ÔÖ Ò Ö Ð
     ×ÙÒØÓ¸ ÓÒ× Ö ÑÓ× ÙÒ Ñ ÞÓ        Ö × ÓÖ Ò Ö Ý ØÖ × Ô Ö×ÓÒ ×¸ ÙÒ Ô Ö Ô ÖØ ÓÒ Ö
    Ý Ð × Ó× Ö ×Ø ÒØ × Ô Ö ÓÖ Ò Öº Å ÒØÖ × Ð ÔÖ Ñ Ö Ö Ð Þ Ð Ô ÖØ ÓÒ¸ Ð × Ó× Ö ×Ø ÒØ ×
          Ò ×Ô Ö Ö Ô ÖÓ ÙÒ Ú Þ ÕÙ Ð Ô ÖØ ÓÒ ×Ø ÙÐÑ Ò ¸ ÒØÓÒ × Ð × Ô Ö×ÓÒ × Ò Ö¹
          × ÓÖ Ò Ö ÔÙ Ò Ö Ð Þ Ö Ð ÓÖ Ò Ñ ÒØÓ × Ò ÕÙ ÒØ Ö¬ Ö Ò ÒØÖ ÐÐ × Ý ÓÒ Ð
    ÓÖ Ò ¬Ò Ð Ð Ñ ÞÓº Ù Ò Ó Ð × Ô ÖØ ÓÒ × ×Ø Ò ÓÖ Ò ×¸ Ð Ô ÖØ ÓÒ ÓÖ ÙÒØ ÐÓ×
    Ñ ÞÓ׸ ÓÒ ÐÓ ÕÙ Ø Ò ÙÒ Ñ ÞÓ ÓÑÔÐ Ø Ñ ÒØ ÓÖ Ò Óº Ä Ó × ÖÚ ÓÒ × ÒØ Ô Ö
     Ð ÓÖ Ò Ñ ÒØÓ ÓÒ ÖÖ ÐÓ׸ ÙÒÕÙ ÙÒ ÔÓ Ó Ñ ×            Ð ÒØ Ò Ö¸ Ó Ð Ö Ø Ö
     ÓÔ ÕÙ × Ö ÕÙ Ö º
    3.2.2.10    B´ squeda aleatoria de clave
                 u

      Ù Ò Ó ÒØ ÒØ ÑÓ× Ö Ð Þ Ö Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð Ñ ÒØ ÖÖ ÐÓ׸ ÒÓ× Ò ÓÒØÖ ÑÓ×
     ÓÒ ÙÒ ×ÝÙÒØ Ú º Ë ÓÖ Ò ÑÓ׸ ÒØÓÒ × ÔÓ ÑÓ× ÑÔÐ Ö Ð ¬ ÒØ Ù×ÕÙ                ¹
    Ò Ö ¸ Ô ÖÓ Ø Ò ÑÓ× ÙÒ Ò× Ö ÓÒ Ý ×ÙÔÖ × ÓÒ O(n)º ÈÓÖ Ð ÓÒØÖ Ö Ó¸ × Ñ ÒØ Ò ÑÓ×
    Ð × ÙÒ          ×ÓÖ Ò ¸ ÒØÓÒ × Ø Ò ÑÓ× ÙÒ Ò× Ö ÓÒ ÑÙÝ Ö Ô O(1)¸ Ô ÖÓ ÙÒ
     Ù×ÕÙ Ý ×ÙÔÖ × ÓÒ Ð ÒØ × O(n)º Ò Ð Ñ ÝÓÖ          Ð × Ó × ÓÒ ×¸ Ð Ö ÞÓÒ × Ö
    Ö ×ÓÐÚ Ö Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð × Ð Ù×ÕÙ ¸ Ö ÞÓÒ ÔÓÖ Ð Ù Ð ÔÙ Ö ÑÓ× ÓÖ Ò Ö
       Ú Þ Ò Ù Ò Ó Ó Ù Ò Ó ×Ø ÑÓ× × ÙÖÓ× ÕÙ ÒÓ Ö Ò Ñ × Ò× Ö ÓÒ ×º È ÖÓ ÐÐÓ
     ÙÒ × ÓרÓ×Ó Ý Ð Ñ Ø Ð ×ÓÐÙ ÓÒ ÙÒ ×Ô ØÖÓ Ô ÕÙ ÒÓ × ØÙ ÓÒ ×º
        ÍÒ ÐØ ÖÒ Ø Ú         Ù×ÕÙ ¸ Ö ÒØÖ Ð ÓÖ Ò Ý Ð ×ÓÖ Ò¸ ÕÙ Ô ÖÑ Ø Ñ¹
    ÔÐ ÒØ Ö Ð ÓÒ ÙÒØÓ ÙÒ Ñ ÒØ Ð Ñ ÒØ × Ù Ò ×¸ × × ÖÚ Ð Ô ÖØ ÓÒ Ð ÕÙ ×ÓÖØ
     ÜÔÐ       Ò Ü ¿º¾º¾º½ ´Ô Ò ½ µº Ò ØÓ¸ ÔÓ ÑÓ× × ÖÚ ÖÒÓ× Ð Ñ ØÓ Ó × ÖÖÓÐÐ Ó
     Ò ¬Ò ÓÒ Ô ÖØ ÓÒ                ÖÖ ÐÓ ½ ´Ü ¿º¾º¾º½ ´Ô Ò ½ µµ Ô Ö ÑÔÐ ÒØ Ö Ð
     Ù×ÕÙ ×Ó Ö ÙÒ ÖÖ ÐÓ ×ÓÖ Ò Ó
½    Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡                                 ½ ½
          template <typename T, class Compare>
      int random_search(T * a, const T & x, const int & l, const int & r)
      {
        if (l > r)
          return Not_Found;
        const int pivot = partition<T, Compare>(a, l, r);
        if (Compare() (x, a[pivot]))
          return random_search<T, Compare>(a, x, l, pivot - 1);
        else if (Compare() (a[pivot], x))
          return random_search<T, Compare>(a, x, pivot + 1, r);
        return pivot; // elemento encontrado en el ındice x
                                                   ´
      }
    Í× × partition ½ º
       Ä        Ð Ð ÓÖ ØÑÓ × Ô ÖØ ÓÒ Ö Ð ØÓÖ Ñ ÒØ Ð ÖÖ ÐÓ Ý Ó Ø Ò Ö Ð ÔÙÒØÓ
    Ô ÖØ ÓÒ pivotº Ê ÓÖ ÑÓ× ÕÙ Ð Ô ÚÓØ × ÑÔÖ × Ò Ù ÒØÖ Ò ×Ù ÔÓ× ÓÒ ÓÖ¹
      Ò ¬Ò Ø Ú º ÈÓÖ Ø ÒØÓ¸ Ð ÓÖ Ò x Ö ×Ô ØÓ pivot Ø ÖÑ Ò Ò Ù Ð Ð × Ó×
198                                              Cap´
                                                        ıtulo 3. Cr´
                                                                   ıtica de algoritmos



    Ô ÖØ ÓÒ × × ÓÒØ ÒÙ Ö ÙÖ× Ú Ñ ÒØ Ð Ù×ÕÙ º
        ÈÓÖ ×ÙÔÙ ×ØÓ¸ × ÙÒ Ð Ò Ð × × Ü ¿º¾º¾º½ ´Ô Ò ½ µ¸ Ð Ð ÓÖ ØÑÓ Ö ÓÖÖ ÒØ Ö ¹
    Ñ ÒØ Ð ÖÖ ÐÓº Ê ÞÓÒ ÔÓÖ Ð Ù Ð × Ð Ú Ö ÕÙ Ð Ù×ÕÙ        Ò Ö Ð ÒÓ ÔÓ Ö ÔÓÝ Ö×
     ÒØ Ö Ñ ÒØ Ò random search()º È ÖÓ × ÔÓ Ö ¸ ÑÔ ÖÓ¸ Ñ ÒØ Ò Ö ÙÒ Ð ×Ø ÓÖ Ò
       Ô ÚÓØ × Ô ÖØ Ö Ð Ù Ð Ö Ð Þ Ö Ù×ÕÙ × × Ù Ò Ð × ÕÙ × Ö Ò ÓÒ× Ö Ð Ñ ÒØ
    Ñ × ÓÖØ × ÕÙ Ö ÓÖÖ Ö ÒØ Ö Ñ ÒØ Ð ÖÖ ÐÓº
         Ð Ò Ð × × ÓÖÑ Ð ×Ø Ð ÓÖ ØÑÓ × Ð ÓÑÓ Ö Óº Ä Ù×ÕÙ                Ð ØÓÖ Þ
     × Ô Ö Ø Ñ ÒØ ÔÐ Ù× Ð ÓÒ Ð ×Ø × ÒÐ Þ ×º Ð ÔÖ Ò Ô Ó ´Ý Ð Ð ÓÖ ØÑÓ Ö ×ÙÐØ ÒØ µ ×
     Ð Ñ ×ÑÓ Ô ÖØ ÓÒ Ö Ð Ð ×Ø × ÙÒ Ð Ô ÚÓØ Ý ÐÙ Ó     Ö Ò Ù Ð Ð × Ó× Ô ÖØ ÓÒ ×
     ÓÒØ ÒÙ Ö Ð Ù×ÕÙ
½    Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡                              ½ ½
          template <typename T, class Compare>
      Dnode<T> * dlink_random_search(Dlink & list, const T & x)
      {
        if (list.is_empty())
          return NULL;
        Dnode<T> * pivot = static_cast<Dnode<T>*>(list.remove_next());
        Dnode<T> item(x);
        Dnode<T> * item_ptr = &item; // puntero a una celda que contiene a x
        Dlink smaller; // lista de los menores que pivot
        Dlink bigger; // lista de los mayores que pivot
           Ô ÖØ ÓÒ Ö Ð ×Ø ½
          Dnode<T> * ret_val = NULL;
          if (Compare () (item_ptr, pivot))
            ret_val = dlink_random_search <T, Compare> (smaller, x);
          else if (Compare () (pivot, item_ptr))
            ret_val = dlink_random_search <T, Compare> (bigger, x);
          else
            ret_val = pivot;
          list.swap(&smaller);
          list.append(pivot);
          list.concat_list(&bigger);
          return ret_val;
      }
    Í× × Dnode      º
        ÈÓÖ ÓÒÓÑ          Ó Ó¸ dlink random search() ×ÙÑ ÕÙ × Ù× ×Ó Ö ÙÒ Ð ×Ø
          Dlinkº ×ØÓ Ö ÕÙ Ö ÕÙ Ð Ù×Ù Ö Ó ×ÙÖØ ÙÒ Ð ×          ÓÑÔ Ö ÓÒ ÕÙ ÓÒ× Ö
    Ó ØÓ× Ø ÔÓ Dlink Ý ÒÓ Dnode<T> ÐÓ ÕÙ               Ð ×ÙÒØÓ Ð Ó Ò ÓÖÖÓ×Ó¸ ÔÙ × Ð
    Ù×Ù Ö Ó       ÓÒÚ ÖØ Ö ÐÓ× ÔÙÒØ ÖÓ× Ð Ø ÔÓ Dlink Dnode<T>º ÓÑÓ Ý ÐÓ ÜÔÐ ÑÓ×
     Ò Ü ¿º½º¿ ´Ô Ò ½ µ¸ Ð Ð × Ò Ö Compare Dnode ÒÓ× ÔÓ× Ð Ø Ð ÑÔÐ ÒØ ÓÒ
    random search() Ô Ö Ó ØÓ×         Ø ÔÓ Dnode<T> Ý Ö Ú Ó׺
    3.2.2.11       Selecci´n aleatoria sobre secuencia desordenadas
                          o

       Ó Ð Ñ ×ÑÓ ÙÒ Ñ ÒØÓ Ð Ð ÓÖ ØÑÓ ÒØ Ö ÓÖ¸ × ÔÓ× Ð ÑÔÐ ÒØ Ö Ð × Ð ÓÒ Ð ØÓ¹
    Ö × Ö¸ Ù× Ö Ð i¹ × ÑÓ Ñ ÒÓÖ Ð Ñ ÒØÓ ÒØÖÓ Ð × Ù Ò º ×ØÓ × ÐÐ Ú           Ó
      Ð × Ù ÒØ Ñ Ò Ö
½    Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡                           ½    ½
            template <typename T, class Compare> static inline
3.2. Algoritmos dividir/combinar                                             199



      const T & __random_select(T * a, const int & i, const int & l, const int & r)
      {
        const int pivot = partition<T, Compare>(a, l, r);
        if (i == pivot)
          return a[i];
          if (i < pivot) // ¿est´ en partici´n izquierda?
                                a           o
          return __random_select<T, Compare>(a, i, l, pivot - 1);
        else
          return __random_select<T, Compare>(a, i - (pivot - l + 1), pivot + 1, r);
      }
    Í× × partition ½ º
       ÁÑÔÓÖØ ÒØ × Ò Ð Ö ÕÙ ÕÙ Ð ÔÖÓ Ð Ñ × ×                Ö ×Ù ÐÚ Ñ × Ö Ô Ó ÓÒ
    random select() ÕÙ Ñ      ÒØ Ð Ñ Ö Ù×ÕÙ × Ù Ò          к Ò ØÓ¸ Ò ÙÐØ ÑÓ ×Ó
    Ð × Ð ÓÒ × Ö O(n2)½¿ º
         × ÓÒÚ Ò ÒØ Ú Ö ¬ Ö ÕÙ Ð Ú ÐÓÖ i × Ö ÙÒ× Ö           Ð Ö Ò Ó [l, r]º  ØÓ×
      ÓÖÖ Ö ÙÖ ÓÒ       Ð ÙÐÓ¸ ÓÐÓ ÑÓ× Ð Ú Ö ¬ ÓÒ ÙÒ      ×ÓÐ Ú Þ¸ ÒØÖÓ Ð ÒØ Ö Þ
    ÔÙ Ð ¸ Ò ÐÙ Ö         ÖÐÓ      ÐÐ Ñ Ö ÙÖ× Ú º         ר ÑÓ Ó¸ Ð ÖÙØ Ò ÔÙ Ð ×
      ¬Ò ×
½    Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡                                 ½     ½
          template <typename T, class Compare>
      const T & random_select(T * a, const int & i, const int & n)
      {
        if (i >= n)
          throw std::out_of_range("index out of range");
        return __random_select(a, i, 0, n - 1);
      }
        È Ö Ð × Ð ÓÒ Ð ØÓÖ ÓÒ Ð ×Ø × ÒÐ Þ       ×    ÑÓ× Ò Ö Ð ÔÖÓ ×Ó Ô ÖØ ÓÒ Ö
    Ð ×Ø ½    Ð ÓÒØ Ð Þ ÓÒ Ð × Ö Ò Ð            ×   Ð × Ó× Ô ÖØ ÓÒ × Ö ×ÙÐØ ÒØ ׺ רÓ
    × ÔÙ Ö Ð Þ Ö Ð × Ù ÒØ Ñ Ò Ö
½    Ô ÖØ ÓÒ Ö Ð ×Ø Ý ÓÒØ Ö ½ ≡                                      ´½      µ
      while (not list.is_empty())
      {
        Dlink * p = list.remove_next();
        if (Compare () (p, pivot)) // ¿p < pivot?
          {
            smaller.append(p); ++smaller_count;
          }
        else
          {
            bigger.append(p); ++bigger_count;
          }
      }

½    Å ØÓ Ó×         ÓÖ Ò Ñ ÒØÓ ½ ¿      +≡                              ½
          template <class Compare>
      Dlink * dlink_random_select(Dlink & list, const size_t & i)
      {
        if (list.is_empty())
      ½¿
           Î ×   Ö    Ó ¾¾   Ô ØÙÐÓ ¾º
200                                             Cap´
                                                   ıtulo 3. Cr´
                                                              ıtica de algoritmos



        return NULL;
      Dlink * pivot = list.remove_next();
      Dlink smaller; // lista de los menores que pivot
      Dlink bigger; // lista de los mayores que pivot
      size_t smaller_count = 0, // cantidad de elementos de smaller
             bigger_count = 0; // cantidad de elementos de bigger
      Ô ÖØ ÓÒ Ö Ð ×Ø Ý ÓÒØ Ö ½
      Dlink * ret_val = NULL;
      if (i == smaller_count)
        ret_val = pivot;
      else if (i < smaller_count)
        ret_val = dlink_random_select <Compare> (smaller, i);
      else
        ret_val = dlink_random_select <Compare> (bigger, i - (smaller_count + 1));
      list.concat_list(&smaller);
      list.append(pivot);
      list.concat_list(&bigger);
      return ret_val;
 }



3.3      An´lisis amortizado
           a
  ÓÒ× Ö ÑÓ× ÙÒ × ØÙ ÓÒ Ò Ð Ù Ð ÕÙ Ö ÑÓ× ×ØÙ Ö Ð × ÑÔ ÒÓ ÙÒ Ì Ó ÙÒ
 רÖÙ ØÙÖ         ØÓ׺ Ä ÒÓØ ÓÒ O ÒÓ× ÔÖÓÔÓÖ ÓÒ ÙÒ Ñ Ò ×ÑÓ × Ò ÐÐÓ Ý Ó Ø ÚÓ
Ô Ö Ò ÐÞ ÖÐ Ø Ò Ò              Ð ÙÖÚ      ÙÖ ÓÒ ÙÒ Ð ÓÖ ØÑÓº Ë Ò Ñ Ö Ó¸ Ù Ò Ó
 Ò Ð Þ ÑÓ× Ð × ÑÔ ÒÓ ÙÒ Ì                ÑÓ× ÓÒ× Ö Ö ÓØÖÓ× ×Ô ØÓ×         ÓÒ Ð ×
    ¯ ÍÒ Ì       Ø Ò Ú Ö × ÓÔ Ö ÓÒ × ÙÝÓ× × ÑÔ ÒÓ× ÔÙ Ò × Ö Ö ÒØ × Ý ÕÙ
      ÔÙ Ò × Ö× Ò Ð ÓÖ ØÑÓ× ×Ø ÒØÓ׺ ÈÓÖ Ø ÒØÓ¸ Ò Ð Þ Ö ÙÒ Ì ÔÙ Ö ÕÙ Ö Ö
       Ò Ð Þ Ö ×Ø ÒØÓ× Ð ÓÖ ØÑÓ׺
    ¯ ÈÓÖ ÐÓ     Ò Ö Ð¸ ÙÒ Ì ×Ù Ý       Ò ÙÒ ×ØÖÙ ØÙÖ        ØÓ׺ Ò ×Ø × ÒØ Ó¸ ×Ù
       Ò Ð × × Ö ÕÙ Ö ÓÒ× Ö Ö Ð ×Ø Ó ØÙ Ð Ð ×ØÖÙ ØÙÖ               ØÓ׸ ÔÙ × ×Ø ÑÙÝ
      ÔÖÓ Ð Ñ ÒØ Ø Ò Ö Ð ÓÒ Ö Ø ÓÒ Ð × ÑÔ ÒÓ Ð ÓÔ Ö ÓÒº
    ¯ Ð ×Ø Ó        Ð ×ØÖÙ ØÙÖ       ØÓ× Ô Ò      Ð Ô ÖÑÙØ ÓÒ ÓÔ Ö ÓÒ × ÕÙ ×
      ×Ù ×Ó Ö Ð Ì º Ë Ù Ò × ÓÔ Ö ÓÒ ×Ø ÒØ × ÔÖÓ Ù Ö Ò Ø ÑÔÓ× ×Ø ÒØÓ׺
        Ð Ö ×Ô ØÓ¸ Ù ÒØÓ ÑÓÖ Ö           ØÙ Ö n ÓÔ Ö ÓÒ × ×Ó Ö ÙÒ Ì         ÔÓ ÑÓ×
       ר Ð Ö ÙÒ ÓØ Ò Ô Ò ÒØ Ð Ú ÐÓÖ Ð Ô ÖÑÙØ ÓÒ
  × Ð × Ó× ×¸ Ú ÑÓ× ÐÓ× ÔÖÓ Ð Ñ × Ð Ñ ÖÓ Ù×Ó Ð ÒÓØ ÓÒ O Ð Ò Ð Þ Ö ÙÒ
Ì º È Ö ÐÐÓ¸ Ü Ñ Ò ÑÓ× Ð Ì DynListStack<T> ´Ü ¾º º ´Ô Ò ½½ µµ Ý ÙÒ
× ÙÒ         Ù ÐÕÙ Ö       ÓÔ Ö ÓÒ × ×Ó Ö ×Ø Ì         Ò Ô ÖØ ÙÐ Ö¸ ÓÒ× Ö ÑÓ× Ð ×
× Ù Ò × ÔÓ× Ð × ÕÙ ÓÑÔÓÖØ Ò pushes Ý popsº Ë Ö Ñ ÑÓÖ ÑÓ× Ð ÑÔÐ ÒØ ÓÒ
    DynListStack<T>¸ ÒØÓÒ × ÔÓ ÑÓ× ÔÖ Ò Ö ÕÙ Ø ÒØÓ push() ÓÑÓ pop()
ØÓÑ Ò O(1)º ÈÓÖ Ø ÒØÓ¸ Ù ÐÕÙ Ö × Ù Ò           n ÓÔ Ö ÓÒ × ×Ó Ö DynListStack<T>
ØÓÑ nO(1) = O(n)º               ÑÓ× Ö Ð Þ Ö ÒÙ ×ØÖÓ ÔÖ Ñ Ö Ò Ð × × ×Ó Ö Ð ÓÑÔÓÖ¹
Ø Ñ ÒØÓ ÙÒ Ì ÓÑÓ ÙÒ ØÓ Óº
3.3. An´lisis amortizado
             a                                                                              201



           ÓÖ Ò ÑÓ× Ð Ì DynListStack<T> Ð ÓÔ Ö ÓÒ popn(n)¸ Ð Ù Ð ÜØÖ                          n
      Ð Ñ ÒØÓ× Ð Ô Ð ½ º Ì Ð ÓÔ Ö ÓÒ ÔÙ Ö Ð Þ Ö× Ð × Ù ÒØ ÑÓ Ó
¾¼½   ÔÙ× Ò Ô Ö DynListStack<T> ¾¼½ ≡
            template <typename T>
        void popn(DynListStack<T> & stack, const size_t & n)
        {
          if (n > stack.size())
            throw std::overflow_error("Stack overflow");
          for (int i = 0; i < n and stack.size() > 0; ++i)
            stack.pop();
        }
      Í× × DynListStack ½½ º
      Ë Ð Ô Ð ÓÒØ Ò n Ð Ñ ÒØÓ׸ ÒØÓÒ × Ð Óר    popn() × O(n) Ô Ö Ð Ô ÓÖ ×Óº
      ËÙÔÓÒ ÑÓ× ÕÙ Ö ÑÓ× Ð Ú Ö× ÓÒ ÜØ Ò      Ð Ì DynListStack<T> ÓÒ Ð × × ¹
       Ù ÒØ × ×Ô ¬ ÓÒ × Ö Ò Ñ ÒØÓ × × Ò Ð Ò Ð × × ØÖ ÓÒ Ð½

                               ÆÓÑ Ö     ÓÔ Ö   ÓÒ    ¬ Ò     Ô ÓÖ   ×Ó
                                   push(item)               O(1)
                                     pop()                  O(1)
                                    popn(n)                 O(n)

         Ù ÒØÓ Ù ×Ø ÙÒ × Ù Ò                n ÓÔ Ö ÓÒ × ÓÒ× ÙØ Ú × ×Ó Ö ÙÒ Ó ØÓ
      DynListStack<T>      È Ö Ö ×ÔÓÒ Ö ÔÓÖ Ð Ô ÓÖ ×Ó¸ ØÓÑ ÑÓ× Ð ÓÔ Ö ÓÒ popn()¸
      ÕÙ × Ð Ñ × ÓרÓ× ¸ Ý Ð ÙÐ ÑÓ× Ð Óר             ÙØ ÖÐ n Ú × ÓÒ× ÙØ Ú ×º ØÖ Ú ×
          ר Ö ÞÓÒ Ñ ÒØÓ¸ ÐÐ ÑÓ× Ð ÓÒ ÐÙ× ÓÒ ÕÙ Ð Óר ØÓØ Ð × n × O(n) = O(n2)º
      È ÖÓ ×Ø Ö ÞÓÒ Ñ ÒØÓ ÒÓ × Ùרӏ ÔÙ × Ð × ÑÔ ÒÓ popn() Ô Ò                 Ð ÒØ ¹
               Ð Ñ ÒØÓ× Ò Ð Ô Ð º ÍÒ ÐÐ Ñ         popn(n) ØÓÑ O(n)¸ Ô ÖÓ¸ Ð × × Ù ÒØ ×
      ØÓÑ Ö Ò O(1)¸ ÔÙ × ×       ÙØ Ò ×Ó Ö ÙÒ Ô Ð Ú º
           Ð Ò Ð × × ÒØ Ö ÓÖ¸ Ñ × ×Ù Ø ÚÓ¸ ÕÙ ÓÒ× Ö Ð × Ö ÙÒר Ò ×            ÒÚÓ ÓÒ
        popn()¸ ÒÓ× Ö Ú Ð ÕÙ Ù ÐÕÙ Ö × Ù Ò         n ÓÔ Ö ÓÒ × ×¸ Ò ÔÖÓÑ Ó¸ O(n)º
          ÍÒ Ø Ò         Ú Ò Ù Ö ÕÙ ÒØ ÒØ ÓÒ ÖØÓ Ü ØÓ Ó Ø Þ Ö Ð Ò Ð × × Ø ÔÓ×
        ×ØÖ ØÓ×       ØÓ× × ÒÓÑ Ò Ò Ð × × ÑÓÖØ Þ Ó º Ä           × ÔÓÒ Ö Ö ÐÓ× Óר ×
      ÓÔ Ö ÓÒ × ÙÒ Ì           ØÖ Ú × ÙÒ ÔÓØ Ò Ð ×ØÖ ØÓ Ó Ö ØÓ׺
      3.3.1   An´lisis potencial
                a
       Ò ×Ø Ð ×       Ò Ð××       ÑÓ× Ò ÓÒØÖ Ö ÙÒ ÙÒ ÓÒ ÔÓØ Ò Ð Φ : D −→ R ÓÒ
      D Ö ÔÖ × ÒØ Ð ×ØÖÙ ØÙÖ        ØÓ× ×Ù Ý ÒØ Ð Ì Ý R × Ð ÓÒ ÙÒØÓ ÐÓ× ÒÙÑ ÖÓ×
      Ö Ð ×º D × ¬Ò ÓÑÓ D = {D0} ∪ {D1, D2, . . . , Dn}¸ ÓÒ D0 × Ð ×Ø Ó Ò Ð
      Ð ×ØÖÙ ØÙÖ       ØÓ× Ý {D1, D2, . . . , Dn} ×ÓÒ ÐÓ× ×Ø Ó× ×Ù × Ù ÒØ × Ö ×ÙÐØ ÒØ × ÙÒ
      × ÙÒ        ÓÔ Ö ÓÒ × ×Ó Ö Ð Ì º
             ÕÙ Ñ Ò Ö ÔÙ Ù× Ö× Ð ÙÒ ÓÒ ÔÓØ Ò Ð Ô Ö Ò Ð Þ Ö ÙÒ Ì È Ö ÓÖ Ö
      Ð ÔÖ ÙÒØ ¸ ÔÐ ÒØ ÑÓ× Ð × Ù ÒØ                    Óר ÑÓÖØ Þ Ó Ô Ö Ð i¹ × Ñ ÓÔ Ö ÓÒ
       ½
          ÇÔ Ö ÓÒ ÕÙ Ù ¬Ò Ô Ö Ð Ì ArrayStack<T> × ÖÖÓÐÐ Ó Ò Ü ¾º º¾ ´Ô Ò ½¼ µ Ý ÕÙ
      ØÓÑ  O(1)º
        ½
           Ð Ö ×ØÓ Ð × ÓÔ Ö ÓÒ × size()¸ is empty() Ý top() × ÓÑ Ø Ò ÔÓÖÕÙ Ø Ò Ò Ø ÑÔÓ ÓÒר ÒØ Ý
      ÒÓ Ö Ð Þ Ò ÑÓ ¬ ÓÒ × ×Ó Ö Ð ×ØÖÙ ØÙÖ         ØÓ׺
202                                                                      Cap´
                                                                            ıtulo 3. Cr´
                                                                                       ıtica de algoritmos



×Ó Ö ÙÒ Ì
                                             i   = Øi +     Φ(Di) − Φ(Di−1)                         ´¿º¾ µ
                                                             Ö Ò       ÔÓØ Ò   Ð ΔΦ i

Øi × Ð ÙÖ ÓÒ         Ù ÓÒ Ð i¹ × Ñ ÓÔ Ö ÓÒ¸ Ñ ÒØÖ × ÕÙ ΔΦ × Ð          Ö Ò¹                 i
        ÔÓØ Ò Ð ÒØÖ Ð ÓÔ Ö ÓÒ ØÙ Ð Ý Ð ÒØ Ö ÓÖ¸ Ð Ù Ð Ö ÔÖ × ÒØ Ð ÓÒ×ÙÑÓ Ó
Ð ÓÑÔ Ò× ÓÒ Ò Ö × ÙÒ ÕÙ Ð Ö Ò Ð × ÔÓ× Ø ÚÓ Ó Ò Ø ÚÓº Ò ×Ø ×Ó¸
 Ð ÔÓØ Ò Ð ÒÓØ ÙÒ ×Ô           Ò Ö ÕÙ × ×Ø Ó × Ò ÒØÖ ÙÒ ÓÔ Ö ÓÒ Ý
ÓØÖ ½ º

     Ð Óר ÑÓÖØ Þ Ó ÑÓ Ð Þ Ð         Ó    ÕÙ Ð ÙÒ × ÓÔ Ö ÓÒ × Ù ×Ø Ò Ñ ×
ÕÙ ÓØÖ ×¸ Ô ÖÓ¸ Ø Ñ Ò¸ Ð ÕÙ ÓØÖ × ÓÔ Ö ÓÒ × ÙÑ ÒØ Ò Ð ÔÓØ Ò Ð Ð ×ØÖÙ ¹
ØÙÖ        ØÓ× Ñ Ò Ö Ø Ð ÕÙ ×ÔÓÒ Ò Ò Ö Ù Ò Ó ØÙ Òº
    Ä Ù ÓÒ ´¿º¾ µ ÒÓ× ÓÒ Ù       ¬Ò Ö Ð Óר ØÓØ Ð n ÓÔ Ö ÓÒ × Ð × Ù ÒØ
 ÓÖÑ
          n             n
Ì(n) =          Øi =               i   − (Φ(Di ) − Φ(Di−1 ))
          i=1           i=1
                                                      ΔΦi
                        n                n                  n
                    =          i   −             Φ(Di ) +         Φ(Di−1 ) =⇒                          ´¿º¾ µ
                        i=1             i=1                 i=1
          n              n               n                   n
      =         i   =         Øi +               Φ(Di ) −         Φ(Di−1 )
          i=1           i=1             i=1                 i=1
                         n
                    =         Øi + Φ(D1 ) + Φ(D2 ) + · · · + Φ(Dn ) − Φ(D0 ) + Φ(D1 ) + · · · + Φ(Dn−1 )
                        i=1
                         n
                    =         Øi + Φ(Dn ) − Φ(D0 )                                                     ´¿º¿¼µ
                        i=1


    È Ö ÕÙ Ð ÔÓØ Ò Ð Ø Ò × ÒØ Ó¸ × Ñ Ò ×Ø Ö ¬Ò Ö Φ Ñ Ò Ö Ø Ð ÕÙ ¸ Ô Ö ØÓ
Ô ÖÑÙØ ÓÒ ÔÓ× Ð ÓÔ Ö ÓÒ ×¸ Φ(Dn) ≥ Φ(D0) × Ö¸ ÕÙ Ð                    Ö Ò ÔÓØ Ò Ð
ØÓØ Ð ÒØÖ Ð ×Ø Ó Ò Ð Ð ×ØÖÙ ØÙÖ                ØÓ× Ý Ð ÙÐØ Ñ ÓÔ Ö ÓÒ × ÑÔÖ ×
ÔÓ× Ø ÚÓ¸ ÔÙ × × ÒÓ¸ Ò Ð ÙÒ ÑÓÑ ÒØÓ Ð ×ØÖÙ ØÙÖ        ØÓ× Ö Ö        ÔÓØ Ò Ð¸ ÐÓ Ù Ð
Ô Ö ÒÓ Ø Ò Ö × ÒØ Ó Ò ÒÙ ×ØÖÓ ÓÒØ ÜØÓ Ø ÖÖ Ò Ð   ½ º ÈÓ ÑÓ× ×ÙÑ Ö ÕÙ Φ(D ) ≥ 0¸
                                                                             0
ÔÙ × Ð          ÙÒ ×ØÖÙ ØÙÖ      ØÓ× × ÓØÓÖ Ö ÔÓØ Ò      Ð × ÙØÙÖ × ÓÔ Ö ÓÒ ×º Ó
 ר ×ÙÒ ÓÒ¸ Φ(Dn) − Φ(D0) ≥ 0¸ ÐÓ ÕÙ ¸ Ò ÙÒ ÓÒ ´¿º¿¼µ¸ ÒÓ× ÓÒ Ù               ¬ÖÑ Ö
 ½
        Ð ÙÒ Ú Ñ Ò Ö ¸ Ð Ð Ò Ù        ÒØ ¬ ר ÑÓ ÖÒÓ ÙÒ ÒÓ ÐÓ Ö Ó ÑÔÓ Ö Ö ÓÑÔÐ Ø Ñ ÒØ
 Ð × ÒØ Ó Ò ×ØÖ Ð Ð Ô Ð Ö ÔÓØ Ò ¸ Ö Þ                ÔÓØ Ò Ð ¸ Ù Ð × ÙÒ ÒÓ ÓÒ Ñ Ò         Ò ×Ø
× ÓÒº Ù Ò Ó ÑÓ× ÕÙ ÙÒ ×ØÙ ÒØ Ø Ò Ð ÔÓØ Ò Ð × Ö Ö ÐÐ ÒØ ¸ ÒÓ ÒÓ× ×Ø ÑÓ× Ö ¬Ö Ò Ó Ð
ÒÓ ÓÒ ×          Ò Ö ÒÓ ×Ø ÑÓ×       Ò Ó Ð Ó × ÓÑÓ Ð Ø Ò ×Ù¬ ÒØ × ÐÓÖ ×º Ò ×Ø ×Ó¸              Ö
ÕÙ Ø Ò ÔÓØ Ò Ð ÜÔÖ × ÕÙ Ð ÔÓ× Ø Ð ÒØÓ× ÕÙ Ð Ô ÖÑ Ø Ö Ò Ú Ò Ö Ü Ð ÒØ ¸ Ô ÖÓ ÒÓ               ÑÓ×
ÕÙ ÐÓ ×º Ò ÒÙ ×ØÖÓ ÑÔÐÓ Ð ÔÓØ Ò Ð × ÙÒ ÓÒ ÓÒ Ò ×Ô Ò× Ð Ô Ö Ð Ö ÐÐ ÒØ Þ¸ Ô ÖÓ ÒÓ
ÙÒ Ö ÒØ º Ð Ô Ò× Ñ ÒØÓ Ö Ó ÒØ ÙÓ ×Ø Ò Ù ÐÓ× Ø ÖÑ ÒÓ× ν ργειεα ´ Ò Ö µ ÕÙ ÓÖÖ ×ÔÓÒ
 Ð ÐÓ ÕÙ ÓÝ ÓÒÒÓØ ÑÓ× ÓÑÓ Ò Ö           Ý δψ ναμις ´ ÝÒ Ñ ×µ¸ ÕÙ ÓÖÖ ×ÔÓÒ     ÐÓ ÔÓØ Ò Ð¸ Ý ÙÝ
ØÖ Ù ÓÒ Ð Ø Ò × ÔÓØ ÒØ º Ä Ô Ð Ö εργον ´ Ö ÓÒµ × Ò Ð Ù ÖÞ Ô Ö Ó Ö Ö Ó ÐÓ ÕÙ ÓÝ
 ÓÒÒÓØ ÑÓ× ÓÑÓ ØÙ Ö¸ ÓÒ Ö ÑÔÐ            Ó Ð ØÓº Ò Ö ÔÖÓÚ Ò Ð ÓÑÔÓ× ÓÒ Ð ÔÖ ¬ Ó εν ´ Òµ
ÕÙ × Ò ¬         ÒØÖÓ ¸ ÓÒ ργεια ´ Ö µ¸ ÓÖÑ Ö Ø Ñ ÒØ Ö Ð ÓÒ           ÓÒ ργον ´ Ö ÓÒµº
   È Ö ÐÓ× Ö Ó× Ò Ö ÓÒר ØÙ Ð ØÓ Ð ÔÖ × Ò ¸ Ñ ÒØÖ × ÕÙ Ð ÔÓØ Ò Ö ÐÓ ÕÙ ÔÓ× Ð Ø
 Ð ØÓº
   ½
     Å × ÒÓ¸ ÕÙ Þ ¸ Ò ÐÓ Ú ÒÓº
3.3. An´lisis amortizado
       a                                                                                              203



Ð   × ÙÐ        × Ù ÒØ                               n             n
                                      Ì(n) =              Øi ≤             i                        ´¿º¿½µ
                                                    i=1          i=1

       Ó Ð × ÔÖ Ñ × × ÔÐ ÒØ ׸ Ð × Ù Ð ´¿º¿½µ ÒÓ× ÑÙ ×ØÖ ÕÙ (n) ÓØ ×Ù¹
Ô Ö ÓÖÑ ÒØ Ì(n)¸ Ö ÞÓÒ ÔÓÖ Ð Ù Ð ÔÓ ÑÓ× ØÖ      Ö ÓÒ × ÙÖ Ñ ÒØ (n) Ý ÐÓ×
Ô ÓÖ × ×Ó× Øi × ÙÒ           ÙÒ Ð × ÓÔ Ö ÓÒ × Ð Ì Ý Ð × ÔÓ× Ð × Ô ÖÑÙØ ÓÒ ×
   × Ù Ò × ÓÔ Ö ÓÒº
     ÓÒ× Ö ÑÓ× Ð Ú Ö× ÓÒ ÜØ Ò          Ð Ì DynListStack<T> Ý ¬Ò ÑÓ× Φ : D −→
R ÓÑÓ Ð       ÒØ          Ð Ñ ÒØÓ× ÕÙ Ø Ò Ð Ô Ð Ð Ø ÖÑ ÒÓ ÙÒ ÓÔ Ö ÓÒ¸ ÔÓÖ ÐÓ
ÕÙ Φ(D0) = 0º ×ØÙ ÑÓ× ÐÓ ÕÙ Ó ÙÖÖ ÓÒ ÐÓ× ÔÓØ Ò Ð × Ñ Ö Ò Ó Ð ÙÒ × Ù Ò
   ÓÔ Ö ÓÒ Ô ÖØ ÙÐ Ö ÔÓÖ ÑÔÐÓ¸ Ð ÑÓ×ØÖ ÔÓÖ Ð Ø Ð × Ù ÒØ
            i ÇÔ Ö ÓÒ Øi            Φ(Di )        ΔΦi = Φ(Di ) − Φ(Di−1 )      i   = Øi +ΔΦi
            ¼     ¹    ¹              0                            ¹                  ¹
            ½  push() 1               1                           1                  2
            ¾  push() 1               2                           1                  2
            ¿  push() 1               3                           1                  2
                  pop()     1         2                          −1                  0
                 push()     1         3                           1                  2
                 popn(3)    3         0                          −3                  0

   Ð ¬Ò Ð       ÙÒ push()¸ Ð Ø Ñ ÒÓ                Ð Ô Ð × Ò Ö Ñ ÒØ Ò ÙÒÓ¸ ÔÓÖ ÐÓ ÕÙ × ÑÔÖ
× ÙÑÔÐ
                                              i   = 1 + 1              ;
                                                    ti      ΔΦ i

× Ð i¹ × Ñ ÓÔ Ö ÓÒ × push()º
    Ð ¬Ò Ð ÙÒ popn(k)¸ Φ(Di) = Ni−1−k ÓÒ Ni−1 × Ð ÒØ        Ð Ñ ÒØÓ× ÒØ ×
      ØÙ Ö popn()º   ר ÑÓ Ó¸ ÐÙ Ó      ÙØ Ó ÙÒ popn(k)¸ Ð Óר ÑÓÖØ Þ Ó
×Ö
                                i   = k + Ni−1 − k − Ni = 0 ;
                                          k               ΔΦ i

     Ú Þ ÕÙ Ð i¹ × Ñ ÓÔ Ö ÓÒ × popn(k)º ÆÓØ ÑÓ× ÕÙ Ð Óר                                  pop()   × ÕÙ Ú ¹
Ð ÒØ popn(1)º
     Ò × ÒØ × ×¸ Ò Ô Ò ÒØ Ñ ÒØ   Ð Ô ÖÑÙØ ÓÒ Ð × Ù Ò                                        ÓÔ Ö ÓÒ¸ ÐÓ×
 Óר × ÑÓÖØ Þ Ó× Ð Ì DynListStack<T> ×ÓÒ ÐÓ× × Ù ÒØ ×
                                     ÆÓÑ Ö               ÓÔ Ö    ÓÒ
                                              push(item)                   2
                                                pop()                      0
                                               popn(n)                     0

     ÓÖ ×ØÙ ÑÓ× Ð Óר ØÓØ Ð n ÓÔ Ö ÓÒ × ÓÒ× ÙØ Ú × ×Ó Ö Ð Ì                                    DynListStack<T>º
ÈÓ ÑÓ× Ú Ö Ð × ÓÔ Ö ÓÒ × Ò n1 push() Ý n2 popn() ´Ö ÓÖ ÑÓ× ÕÙ                                   pop() ⇐⇒
popn(1)µº ÈÓÖ Ø ÒØÓ

                 Ì(n) ≤    (n) = O(n1) × 2 + O(n2) × 0 = O(n1) = O(n)
204                                                           Cap´
                                                                 ıtulo 3. Cr´
                                                                            ıtica de algoritmos



 × Ô٠׸ Ð Óר ÔÖÓÑ Ó ÔÓÖ ÓÔ Ö ÓÒ¸ ÒØÖ Ù ÐÕÙ Ö Ô ÖÑÙØ ÓÒ                           n   ÓÔ Ö ÓÒ ×
ר     Ó ÔÓÖ
                         Øi ≤ (n) = O(n) = O(1)
                              n      n

3.3.2   An´lisis contable
          a
  Ò ÙÒ Ò Ð × × ÑÓÖØ Þ Ó ÓÒØ    и      ÓÔ Ö ÓÒ × Ð × Ò ÙÒ ÒØ       ÓÒר ÒØ
ÐÐ Ñ    Ö ØÓ¸ × Ó       Ù     Ó× Ñ ÒØ × ÙÒ Ð Ò ØÙÖ Ð Þ Ð ÓÔ Ö ÓÒ¸ Ð Ù Ð ÒÓ
Ò × Ö Ñ ÒØ × ÓÖÖ ×ÔÓÒ         ÓÒ Ð Óר Ö Ð Ò ÙÖ ÓÒº Ë Ð Óר Ò ÙÖ ÓÒ Ð
i¹ × Ñ ÓÔ Ö ÓÒ × Øi¸ Ý i ×Ù   Óר Ö ØÓ¸ ÒØÓÒ × Ö ÕÙ Ö ÑÓ× × Ø × Ö
                                   n                           n
                              =            i    ≥   Ì(n) =          Øi                     ´¿º¿¾µ
                                  i=1                         i=1

Ô Ö Ù ÐÕÙ Ö × Ù Ò ÔÓ× Ð n ÓÔ Ö ÓÒ × ×Ó Ö Ð Ì Ó ×ØÖÙ ØÙÖ     ØÓ׺ Ð
 Óר ÑÓÖØ Þ Ó Ð Ì Ó ×ØÖÙ ØÙÖ   ØÓ× Ô Ö ÙÒ × Ù Ò     n ÓÔ Ö ÓÒ × ×
                                                      n
                                               =      i=1 i
                                                      n
                                                                                           ´¿º¿¿µ
Ä × ÙÐ           × Ð Ñ ×Ñ ÕÙ Ð ÜÔÖ ×        Ò ´¿º¿½µ¸ Ô ÖÓ ×ÙÑ Ò Ó ÕÙ Ð
 Óר ÑÓÖØ Þ Ó i × ÓÒר ÒØ Ô Ö         ÓÔ Ö ÓÒ ´ÐÓ Ù Ð Ö ×ÙÐØÓ Ð ×Ó Ô Ö Ð
Ì DynListStack<T>µº Ë Ò Ñ Ö Ó¸ Ð Ö ÞÓÒ Ñ ÒØÓ Ô Ö Ð × Ð ÓÒ Ð Ö ØÓ
      ÓÔ Ö ÓÒ¸ ÙÒÕÙ Ò×Ô Ö Ó Ò Ð          ÔÓØ Ò Ð¸ ר ÔÖ ×Ø Ó Ð Ö ÓØ Ñ Ö¹
  ÒØ к Ä       × ÕÙ × ÑÔÖ          Ö Ö ØÓ Ô Ö Óר Ö Ù ÐÕÙ Ö × Ù Ò
ÓÔ Ö ÓÒº Ò ×Ø × ÒØ Ó¸ ÐÓ× Ö ØÓ×          ÓÔ Ö ÓÒ      Ò × Ð ÓÒ Ö×    ÑÓ Ó
Ø Ð ÕÙ ¬Ò Ò Ò ÓÒ Ö ØÓ× ÓØÖ ×º
          ÖØ Ñ Ò Ö ¸ Ð × Ò ÓÒ Ö ØÓ× ÔÙ ÒØ ÖÔÖ Ø Ö× ÓÑÓ ÙÒ ÙÒ ÓÒ ÔÓ¹
Ø Ò Ð × Ö Ø Ý ÔÓÖ Ô ÖØ × × ÙÒ Ð ÓÔ Ö ÓÒº
    ÈÓÖ ÑÔÐÓ¸ × Ò ÑÓ× Ð Ì       ÜØ Ò Ó DynListStack<T> ÐÓ× × Ù ÒØ × Ö ØÓ×
 ÑÓÖØ Þ Ó×
                            ÆÓÑ Ö              ÓÔ Ö    ÓÒ      Ö       ØÓ×
                                  push(item)                       2
                                    pop()                          0
                                   popn(n)                         0

È Ö Ö Ò ÖÐ × ÒØ Ó Ð Ö ÞÓÒ Ñ ÒØÓ ÕÙ ÒÓ× ÓÒ Ù          ר × Ð ÓÒ Ö ØÓ׸         ¹
ÑÓ× Ó × ÖÚ Ö ÕÙ ÒÓ ÔÙ       Ö ÙÒ pop() × ÒØ × ÒÓ Ù Ó ÙÒ push()º        ר ÑÓ Ó¸
ÔÓ ÑÓ× Ö ÕÙ Ù Ò Ó ×          ØÙ ÙÒ push() ×       Ò Ó× ´2µ Ö ØÓ׸ ÙÒÓ ÓÖÖ ×ÔÓÒ¹
   ÒØ Ð Óר Ò ÙÖ ÓÒ Ý ÓØÖÓ         Ó Ò ÔÖ ×Ø ÑÓ Ó Ö ÒØ Ô Ö Óר Ö Ð ÙÖ ÓÒ
    ÜØÖ ÓÒ Ð Ð Ñ ÒØÓ Ù Ò Ó ×           ØÙ ×Ù pop()º ÈÙ ×ØÓ ÕÙ Ð × ÓÔ Ö ÓÒ × Ò
× Ó Óר × ÔÓÖ Ð ÒØ Ó ÔÓÖ Ð push()¸ pop() Ý popn() ÒÓ Ø Ò Ò Ö ØÓ׸ ÔÙ × ×Ù×
 Óר × Ò × Ó ÑÓÖØ Þ Ó× ÔÓÖ Ð push()º
     ÓÒ ÐÓ× Óר × ÑÓÖØ Þ Ó× ÒØ Ö ÓÖ ×¸ ÔÓ ÑÓ× Ð ÙÐ Ö ÙÒ ÓØ Ô Ö Ð Óר ÑÓÖ¹
Ø Þ Ó Ð Ì DynListStack<T>¸ Ð Ù Ð ÒÓ Ü Ö
                                               2n
                                       ≤          = 2 = O(1)
                                                n
3.3. An´lisis amortizado
       a                                                                                  205



     Ð Ø ÖÑ ÒÓ Ö ØÓ ¸ ÔÖÓÚ Ò ÒØ Ð Ú Ö Ó Ð Ø ÒÓ Ö Ö ¸ × Ò ¬ Ö Ö¸ ÓÒ¬ Ö¸
  Ö     Ò ÙÒ Ô Ö×ÓÒ º ÌÖ ×Ø Ñ ÒØ ¸ ÓÝ Ò         Ð ÑÙÒ Ó ÓÒÓÑ Ó ÑÔÐ Ð Ø ÖÑ ÒÓ
 Ö ØÓ Ô Ö Ö Ö Ö ÙÒ ÒØ                  Ò ÖÓ ÕÙ × ÓØÓÖ Ò ÔÖ ×Ø ÑÓ¸ ÓÑÓ × Ð ÔÖ ¹
×ÙÒ ÓÒ       ÙÒ       Ù × Ù ÒØ ¬ Ð Ó¸ Ò Ò ÙÖ ¸ רÙÚ × Ú Ò ÙÐ            Ð ÔÓ Ö
  ÓÒÓÑ Ó½ º
     Ð Ø ÖÑ ÒÓ ÑÓÖØ Þ Ö × Ù× Ò Ð ÑÙÒ Ó Ò Ö Ó Ý × × ÐÐ ÕÙ ÔÖÓÚ Ò
Ð Ñ Ø ÓÖ ÓÒ ×Ø Ø ÔÓ          Ò Ð × ×º ÙÖ Ó× Ñ ÒØ ¸ ÑÓÖØ Þ Ö ÔÖÓÚ Ò Ð Ö Ò ×¸ Ð
 ٠и ×Ù Ú Þ¸ ÔÖÓÚ Ò Ð Ð Ø Ò Ñ Ú Ð ÑÓÖØ Þ Ö º Ð ÔÖ ¬ Ó Ò           ÔÖÓÜ Ñ    ¸
Ñ ÒØÖ × ÕÙ ÑÓÖØ × × Ò ¬ ÑÙ ÖØ º ÑÓÖØ Þ Ö × Ò ¬ Ö ¸ ÒØÓÒ ×¸ Ð ÔÖÓÜ Ñ
   Ð ÑÙ ÖØ ¸ Ô ÖÓ Ð Ø ÖÑ ÒÓ × Ù× × Ð             Å Ô Ö ÓÒÒÓØ Ö Ð ÔÖÓÜ Ñ
Ð ÑÙ ÖØ ÙÒ Ù º
3.3.3   Selecci´n del potencial o cr´ditos
               o                    e
È Ö ÕÙ ÙÒ Ò Ð × × ÑÓÖØ Þ Ó Ø Ò × ÒØ Ó¸ × × Ò Ð Ò ÓÒØÖ Ö ÙÒ Ù Ò ÙÒ ÓÒ
ÔÓØ Ò Ð Ó ÐÓ Ö Ö ÒØ ÖÔÖ Ø Ö Ð × ÓÔ Ö ÓÒ × Ò ÙÒ ÓÒ ×Ù ØÖ Ó Ý Ð Ñ Ò Ö Ò ÕÙ
 ÐÐ × ÑÓÖØ Þ Ò Ó ÓÒ×ÙÑ Ò Ö ØÓ× ÒØÖ × º
       ÙÒ ÖØ ÓÖÑ ¸ Ð Ò Ð × × ÑÓÖØ Þ Ó × ×Ù Ø ÚÓ Ò Ð × ÒØ Ó ÕÙ Ð Ò
Ð ÙÒ ÓÒ ÔÓØ Ò Ð Ð ×Ù Ø Ú           × Ð Ì Ý ×Ù ×ØÖÙ ØÙÖ             ØÓ׺ ׸ ÒØÓÒ ×¸
  ÙÖ ÒØ Ð ×ØÙ Ó Ý × Ð ÓÒ Ð ÙÒ ÓÒ ÔÓØ Ò Ð ´Ó ÐÓ× Ö ØÓ× ÔÓÖ ÓÔ Ö ÓÒµ¸
 Ù Ò Ó × ØÖ Ø Ò Ø Ð × ×Ù Ø Ú       ׺
    ÈÓÖ ÐÓ Ò Ö Ð¸ Ð ÙÒ ÓÒ ÔÓØ Ò Ð         ÔÓÒ Ö Ö Ð ×Ø Ó Ð ×ØÖÙ ØÙÖ            ØÓ׺
  Ò Ð ×Ó ÙÒ × Ù Ò ¸ Ð Ø Ñ ÒÓ ×¸ Ñ ÒÙ Ó¸ ÙÒ Ù Ò × Ó Ò º
    ÍÒ Ñ Ò Ö          Ð Ø Ö Ð Ò Ð × × ÑÓÖØ Þ Ó ÙÒ ÓÔ Ö ÓÒ ÓÒ× ×Ø Ò Ú ÖÐ
 Ò Ø Ô × × Ù Ò Ð ×¸ Ò Ð Þ Ö         ÙÒ ÔÓÖ × Ô Ö Ó Ý ÐÙ Ó ×ÙÑ ÖР׺ ËÙÔÓÒ ÑÓ× ÕÙ
ÙÒ × Ù Ò        ÓÔ Ö ÓÒ × Ý ÙÒ ÓÔ Ö ÓÒ ØÙ             Ò Ð i¹ × Ñ Ú Þ ÓÒ Óר ÑÓÖ¹
Ø Þ Ó i ÒØÖ Ð ×Ø Ó Di−1 Ý Diº ÓÖ ×ÙÔÓÒ ÑÓ× ÕÙ Ð × Di−1 −→ Di ÔÙ
  Ú Ö× Ò Ð × × × D1, D2, . . . Dk¸ Ñ Ò Ö Ø Ð ÕÙ Di−1 = D0 Ý Di = Dkº Ë Øj Ð
 Óר Ô × Ö Ð ×Ø Ó Dj−1 Dj¸ ÒØÓÒ ×
                                                    k
                                             Øi =         Øj                           ´¿º¿ µ
                                                    j=1

Ë ÙÒ ´¿º¾ µ¸ Ð Óר ÑÓÖØ Þ Ó             Øi ÔÙ             ¬Ò Ö× ÓÑÓ
                           k             k

                                j   =         (Øj +Φ(Dj) − Φ(Dj−1))
                          j=1           j=1
                                         k
                                    =         Øj   + Φ(Dk) − Φ(D0)
                                        j=1
                                    =   Øi +Φ(Di) − Φ(Di−1)
                                    =   i                                              ´¿º¿ µ
 ½
       Ð           Ð ÙÐØ Ñ Ö Ú × ÓÒ   ר × Ö ØÓ¸ Ð ÔÖ Ñ Ó ÆÓ Ð Ð È Þ ¾¼¼              × Ó ÓÒ¹
  Ö Ó Ð ÈÖÓ ×ÓÖ Ò Ð ÅÙ ÑÑ            ÙÒÙ׸ ÙÒ ÓÖ Ð Ò Ó Ö Ñ Ò ´ Ò Ó ÖÙÖ Ðµº             Ð ÒÓ
 Ò Ù ×Ø ÓÒ ÓÒ         Ñ ÖÓ¹ Ö ØÓ× ÔÖ ×Ø Ø Ö Ó× ÑÙÝ ÔÓ Ö × Ñ Ø Ö ÐÑ ÒØ ¸ × Ò Ò Ò ÙÒ     Ö ÒØ Ó
   Ö ØÓ ÓÒÓÑ ¸ Ô ÖÑ Ø Ò ÓÐ × ÓÒ ÖÓÒØ Ö ×Ù ÔÓ Ö Þ Ñ Ø Ö Ðº ÆÓ ×ÓÖÔÖ Ò ÒØ Ñ ÒØ ¸        Ð ¼±
ÐÓ× ÔÖ ×Ø Ø Ö Ó× Ö ÒØ Ö Ò ÓÑÔÐ Ø Ñ ÒØ Ð ÔÖ ×Ø ÑÓ¸ ÙÒÕÙ ¸ Ø Ñ Ò¸ Ð ± ÐÓ× ÔÖ ×Ø        Ø Ö Ó× ×ÓÒ
ÑÙ Ö ×º
206                                             Cap´
                                                   ıtulo 3. Cr´
                                                              ıtica de algoritmos



ÈÓÖ Ø ÒØÓ¸ Ð Óר ÑÓÖØ Þ Ó Ð ÓÔ Ö ÓÒ × Ð ×ÙÑ ÐÓ× Óר × ÑÓÖØ Þ Ó× ×Ù×
 Ø Ô ×º
        Ñ × ÐÓ× ÓÒÓ Ñ ÒØÓ× ×Ó Ö Ð ×ØÖÙ ØÙÖ  ØÓ× Ý Ð Ø Ò        Ò Ð × ×¸
 Ò Ð Ù×ÕÙ Ý × Ð ÓÒ ÙÒ ÙÒ ÓÒ ÔÓØ Ò Ð ÒØ ÖÚ Ò Ò Ð ÜÔ Ö Ò ¸ Ð ÖØ Ý
Ð ×Ù ÖØ º

3.4     Correctitud de algoritmos
  Ù Ò Ó Ð ÑÓ× Ö            Ð ÓÖÖ Ø ØÙ ÙÒ Ð ÓÖ ØÑÓ Ó ÔÖÓ Ö Ñ ¸ ÒÓ× Ö Ö ÑÓ× ÕÙ
 ר ÐÓ Ö Ð ¬Ò Ô Ö Ð Ù Ð Ù ×Ø Ò Óº ÈÙ ×ØÓ ÓØÖÓ ÑÓ Ó¸ Ð ÓÖÖ Ø ØÙ ÓÒ ÖÒ
   ÐÓ ÕÙ Ð ÔÖ Ò Ô Ó     ר Ô ØÙÐÓ ÒÓÑ Ò ÑÓ× ¬            ¸ ÐÓ Ù Ð¸ Ò Ð ×Ó ÙÒ
ÔÖÓ Ö Ñ ¸ ÕÙ Ú Ð         Ö ÕÙ ×Ø ÒÓ ÖÖÓ Ñ Ð × Ö ×ÔÙ ×Ø ׺ Ñ ÒÙ Ó ×ØÓ ÒÓ ×
× Ò ÐÐÓ      Ø ÖÑ Ò Ö ÔÓÖÕÙ ÒÓ × ×Ø ÕÙ Ð ÔÖÓ Ö Ñ ×Ø ÓÔ Ö Ø ÚÓ ÕÙ × ÔÙ
Ú Ö ¬ Ö × × Ó ÒÓ ÓÖÖ ØÓº
     Ä ¬      ÕÙ ¸ Ö ÓÖ ÑÓ׸ ÒÓ × ÐÓ Ñ ×ÑÓ ÕÙ Ð ¬ Ò ¸ × ÙÞ ÔÓÖ ÓÑÔÐ Ø ØÙ
Ý Ñ Ò Ñ Ð º ÈÓÖ ÓÑÔÐ Ø ØÙ           ÑÓ× ÕÙ Ð ØÓ¸ Ó × Ð ¬Ò¸ × Ð Ò               й
Ñ ÒØ º ÈÓÖ Ñ Ò Ñ Ð           ÑÓ× ÕÙ ÒÓ ×       ØÙ Ð Ó      ÓÒ Ð Ð ¬Ò ÐÓ ÕÙ Ò Ð
Ð Ò Ù Ø ÒÓ Ö Ø Ó × ÒÓÑ Ò              ØÓ ÓÐ Ø Ö Ð ÜÔÖ × ÓÒ ÕÙ ÓÑÙÒÑ ÒØ Ò
ÕÙ Ð ÓÒ× Ù ÓÒ Ð ¬Ò ÖÖ              ØÓ×     ÓÒ Ð × ÕÙ Ö Ù ÒØ Ñ ÒØ ×ÓÒ Ò × Ð ×º
      Ð   ÂÙÐ Ó ½ × Ð ÒÞÓ ÔÓÖ Ú Þ ÔÖ Ñ Ö Ð Ó Ø ÙÖÓÔ Ó Ö Ò º ÁÒÑ ØÓ
 Ð Ð ÒÞ Ñ ÒØÓ¸ Ð Ó Ø ÑÔ ÞÓ ×Ú Ö× ×Ù ØÖ Ý ØÓÖ Ú ÖØ Ð Ý Ó ×ØÖÙ Ö× ¼
× ÙÒ Ó× ×Ô٠׺ Ä × ÒÚ ×Ø ÓÒ × ÙÐØ Ö ÓÖ × Ö Ú Ð ÖÓÒ ÕÙ ÙÒ ÖÙØ Ò ØÖ Ø ÒÙÑ ÖÓ×
 Ò ÔÙÒØÓ ­ÓØ ÒØ ÓÑÓ × ÐÐÓ× ×ØÙÚ × Ò Ö ÔÖ × ÒØ Ó× Ò Ö ØÑ Ø ÒØ Ö º Ä Ú Ö× ÓÒ
 ÒØ Ö ÓÖ Ð Ó Ø ¸ Ö Ò          ÑÒ         ÒØ ÖÓ× Ý Ð ÖÙØ Ò Ò Ù ×Ø ÓÒ ÒÓ × Ú Ö ¬ Ó
 Ü Ùר Ú Ñ ÒØ Ô Ö Ð ÒÙ Ú Ú Ö× ÓÒ Ð Ó Ø º Ä ÖÙØ Ò Ö Ò ÓÖÖ Ø ½ ¸ ½¼ º
3.4.1   Planteamiento de una demostraci´n de correctitud
                                       o
ÍÒ ÒØ ÖÔÖ Ø ÓÒ ÓÖÖ Ø ØÙ ×ØÖ Ò Ø ÖÑ Ò Ö × Ð ÔÖÓ Ö Ñ ÖÖÓ Ö ×ÔÙ ×Ø ×
 ÓÖÖ Ø × Ô Ö ØÓ × Ð × ÒØÖ × ÔÓ× Ð ×º Ò ÙÒ ÓÒ ×ØÓ¸ ÔÙ ×ØÓ ÕÙ Ò Ð Ñ ÝÓÖ
Ð × Ó × ÓÒ × ÐÓ× Ú ÐÓÖ × ÔÓ× Ð × ÒØÖ ×ÓÒ Ó ÑÙÝ Ö Ò × Ó Ò¬Ò ØÓ׸ ÙÒ ÔÖÙ
 ÓÖÖ Ø ØÙ Ö ÕÙ Ö Ð × ¬ Ö Ð ÒØÖ          Ò ØÓ Ó× ÐÓ× ×Ù ÓÒ ÙÒØÓ× ÔÓ× Ð × ÕÙ ÓÒ ÓÖÑ Ò
Ð ÒØÖ º
     ÄÓ ÒØ Ö ÓÖ ÔÙ ÔÐ ÒØ Ö× ÓÖÑ ÐÑ ÒØ ÓÑÓ × Ù º Ë I Ð ÓÒ ÙÒØÓ ÓÑ Ò Ó
 ÒØÖ        ÙÒ ÔÖÓ Ö Ñ Ý R Ð ÓÒ ÙÒØÓ Ö ×ÙÐØ Óº ÒØÓÒ ×¸ ÙÒ ÔÖÙ                ÓÖÖ Ø ¹
ØÙ         Ü Ñ Ò Ö Ð Ð ÓÖ ØÑÓ Ý Ø ÖÑ Ò Ö Ò ÙÒ ÓÒ Ð Ñ ×ÑÓ ´ ÙÖ ÓÒ ×¸ Ð ÞÓ׸
 Ø Ø Ö µ¸ ÐÓ× ×Ù ÓÒ ÙÒØÓ× ÒØÖ I = I1 ∪ I2 ∪ · · · ∪ In¸ ÙÒØÓ ÓÒ ×Ù× ×Ù ÓÒ ÙÒØÓ×
    × Ð R = R1, R2, . . . , Rnº ÆÓØ ÑÓ× ÕÙ ÐÓ× ×Ù ÓÒ ÙÒØÓ× Ö ×ÙÐØ Ó ÔÙ Ò ×ÓÐ Ô Ö×
 ÒØÖ × Ó × ÕÙ ÐÓ× Ö ×ÙÐØ Ó× ÒÓ Ø Ò Ò ÔÓÖ ÕÙ × Ö Ü ÐÙÝ ÒØ ׺
     Ä ÔÖÙ        ÓÖÖ Ø ØÙ ÓÒ× ×Ø ¸ ÒØÓÒ ×¸ Ò Ú Ö ¬ Ö × Ô Ö          ×Ù ÓÒ ÙÒØÓ Ii Ð
 Ð ÓÖ ØÑÓ Ó ÔÖÓ Ö Ñ ÖÖÓ Ð × Ð Riº ÈÙ ×ØÓ ÕÙ Ñ ÒÙ Ó Ii Ý Ri ×ÓÒ ÑÙÝ Ö Ò ×
Ó Ò¬Ò ØÓ׸ Ð ÔÖÙ × Ö Ð Þ ÓÒ ÐÓ× Ú ÐÓÖ × ÖÓÒØ Ö ÐÓ× ×Ù ÓÒ ÙÒØÓ׺
     ÈÓÖ ÑÔÐÓ¸ ÙÒ Ò×Ô ÓÒ Ñ × ÔÖÓ ÙÒ              Ð ÓÖ Ò Ñ ÒØÓ ÔÓÖ × Ð ÓÒ ×ØÙ Ó
 Ò Ü ¿º½º¿ ´Ô Ò ½ ¾µ Ö Ú Ð ÕÙ Ð ÐÓÕÙ Ë Ñ Ò Ð Ò                  Ñ ÒÓÖ ÒØÖ · ½ Ý
Ò ¹ ½ ½ ¿ × ÑÔÖ Ò Ù ÒØÖ Ð Ñ Ò ÑÓ ÒØÖ i+1 Ý n-1¸ ÔÙ × ØÓ Ó Ð Ö Ò Ó (i..n) ×
 Ò×Ô ÓÒ Óº ÈÓÖ Ø ÒØÓ¸ Ë Ñ Ò Ð Ò Ñ ÒÓÖ ÒØÖ · ½ Ý Ò ¹ ½ ½ ¿ × ÓÖÖ ØÓº
3.4. Correctitud de algoritmos                                                 207



    ÈÓÖ ÓØÖ Ô ÖØ ¸ Ð for Ñ × ÜØ ÖÒÓ Ö ÓÖÖ ØÓ Ó Ð ÖÖ ÐÓ ÒØÖ [0..n − 1) ×ÓÐÓ ÐØ
 Ð ÙÐØ ÑÓ Ð Ñ ÒØÓ Ð ÖÖ ÐÓ Ð Ù Ð × Ö Ò×Ô ÓÒ Ó ÔÓÖ Ë Ñ Ò Ð Ò Ñ ÒÓÖ
 ÒØÖ · ½ Ý Ò ¹ ½ ½ ¿ º
    ÈÓÖ Ø ÒØÓ¸ ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ× Ð ÖÖ ÐÓ ×ÓÒ Ò×Ô ÓÒ Ó× Ô Ö                Ø Ö¹
Ñ Ò Ö Ð Ñ Ò ÑÓº          Ð Ð ÓÖ ØÑÓ Ô Ö     × Ö¸ Ô٠׸ ÓÖÖ ØÓº      Ð ÓÒ ÙÒØÓ
      ÒØÖ    Ù I = {ÌÓ × Ð × Ô ÖÑÙØ ÓÒ × ÔÓ× Ð ×} Ý Ð             ×Ð     R =
{ÌÓ × Ð × Ô ÖÑÙØ ÓÒ × ÓÖ Ò       ×}º

3.4.2   Tipos de errores
ÍÒ ÖÖÓÖ Ò ÙÒ ÔÖÓ Ö Ñ ÔÙ        ÓÑ Ø Ö× ÙÖ ÒØ Ð × × Ù ÒØ × × ×
Dise˜o: ÔÖ Ñ × × Ò ÓÖÖ Ø ×¸ ×ÙÑ × ÙÖ ÒØ Ð × ÒÓ
     n                                                  ÙÒ Ð ÓÖ ØÑÓ¸ ÑÙÝ ÔÓ× Ð ¹
     Ñ ÒØ ÓÒ ÙÞ Ò Ö ×ÙÐØ Ó× Ò ÓÖÖ ØÓ׺
Prueba de correctitud del algoritmo: Ú × Ð ÓÖÖ Ø ØÙ            ÙÒ Ð ÓÖ ØÑÓ ÒÓ ×
     × Ò ÐÐ          ÑÓ×ØÖ Öº Ò ×Ø × ÒØ Ó Ý Ó× Ð × × Ò Ö Ð ×            ÖÖÓÖ × Ò Ð
     ÔÖÙ
        ½º ÉÙ Ð × Òר Ò × ÔÓ× Ð × ÒØÖ ÒÓ ×Ø Ò ÓÑÔÐ Ø Ñ ÒØ Ù ÖØ ׸ ×Ó
            Ò Ð Ù Ð ÒÓ × × Ö × Ð Ð ÓÖ ØÑÓ × ÓÖÖ ØÓ Ó ÒÓ Ô Ö Ð Ð ×             ÒØÖ
            Ù× ÒØ º
        ¾º ÉÙ Ð ÙÒ Ó Ñ × Ð × ÔÖÙ × ×Ø ÖÖ º
     ÈÓ× Ð Ñ ÒØ ¸ ÐÓ× ÖÖÓÖ × Ò Ð ÔÖÙ      ÓÖÖ Ø ØÙ ×ÓÒ ÐÓ× Ñ × × Ö Ó׸ ÔÙ × Ò Ù Ò
     ÐÓ ÕÙ × ÒÓÑ Ò ÓÑÓ Ð× Ô Ö Ô ÓÒ Ð Ð ÓÖ ØÑÓ ÔÓ Ö Ó ÒÓ ×Ø Ö ÓÖÖ ØÓ¸
     Ô ÖÓ ¬ÖÑ ÑÓ׸ × Ò ÖØ ØÙ ¸ ÕÙ ÐÓ ×º
Codificaci´n: ÐÓ× Ð ÓÖ ØÑÓ×
           o                     Ò ØÖ Ù Ö× ÙÒ Ð Ò Ù        ÔÖÓ Ö Ñ ÓÒº ר ×
     × ÐÐ Ñ Ó ¬ ÓÒ Ý ÙÖ ÒØ ÐÐ × × Ó Ò Ð × Ö ÔÖ × ÒØ ÓÒ × ÐÓ× ØÓ× Ó
     Ð ÓÖÑ          רÖÙ ØÙÖ    ØÓ׸ × ÓÑÓ Ð × Ö ÔÖ × ÒØ ÓÒ × Ð × × Ù Ò ×
          Ù ÓÒ Ð Ð ÓÖ ØÑÓ × ÙÒ ÐÓ× ÑÓ ÐÓ× Ð Ð Ò Ù ´Û Ð ¸ ÓÖ¸ ¸ Ø Ø Ö µº
Ejecuci´n y falla de programas de verificaci´n: ÓÑÓ Ñ Ò ÓÒ Ö ÑÓ× ÔÓר Ö ÓÖ¹
        o                                    o
     Ñ ÒØ ¸ Ô Ö Ú ÐÙ Ö ÓÖÖ Ø ØÙ × ÑÔÐ Ò Ú Ö×Ó× Ø ÔÓ× ÔÖÓ Ö Ñ ×º Ò ×Ø
     × ÒØ Ó¸ ÙÒ Ù ÖØ Ð ×          ÖÖÓÖ ÔÙ Ò Ù Ö× ÔÓÖ Ð        Ó ÕÙ ÙÒÓ ÐÓ×
     ÔÖÓ Ö Ñ × Ù× Ó× Ô Ö Ú Ö ¬ Ö ÓÖÖ Ø ØÙ × Ò ÓÖÖ ØÓº
 ÒØ ר × Ô Ö×Ô Ø Ú × Ð ÓÖÖ Ø ØÙ ¸ ÙÒ Ó Ð            Ó ÕÙ ×Ø Ò × × ÔÖ Ò
 ÙÒ Ó×         ÙØ Ð ÔÖÓ Ö Ñ Ý × Ö ×Ù ÐÚ Ð ÔÖÓ Ð Ñ ¸ ÙÒ ÔÖÓ Ö Ñ ÓÖ          ¸ Ô ÖÑ ¹
Ò ÒØ Ñ ÒØ ¸ ×ÙÑ Ö ÙÒ Ø ØÙ          Ù Ö ×Ô ØÓ Ð ÓÖÖ Ø ØÙ º

3.4.3   Prevenci´n y detecci´n de errores
                o           o
À Ý Ó× Ò ÓÕÙ × ÓÑÔÐ Ñ ÒØ Ö Ó× ÒØÖ × Ô Ö Ð Ö ÓÒ Ð ÓÖÖ Ø ØÙ             ÙÒ ÔÖÓ Ö Ñ
  ½º ÈÖ Ú Ò ÓÒ ÓÑÓ Ú Ø Ö ÓÑ Ø Ö ÙÒ ÖÖÓÖ
  ¾º Ø ÓÒ ÓÑÓ Ø Ø ÖÐÓ ÐÓ Ñ × ÔÖÓÒØÓ ÔÓ× Ð
208                                                                   Cap´
                                                                         ıtulo 3. Cr´
                                                                                    ıtica de algoritmos



    Ä ÔÖ Ú Ò ÓÒ Ö ÕÙ Ö ÙÒ       Ø ØÙ Ö Ø ÔÓÖ Ô ÖØ Ð ÔÖÓ Ö Ñ ÓÖ Ò Ð × ÒØ Ó
   ÕÙ ÔÖ Ò        ×Ù× ÖÖÓÖ × Ý Ù×ÕÙ Ñ Ò Ö × ÒÓ ÚÓÐÚ Ö ÓÑ Ø ÖÐÓ׺
    Ä Ò ÓÖÖ Ø ØÙ × ÑÔÖ × ÓרÓ× Ò Ð × ÒØ Ó ÕÙ               Ð ÙÒ Ñ Ò Ö      ÖÖ
Ô Ö × Ô ÖÓ Ý × ØÙ ÓÒ × Ò Ð × Ù Ð × × Ñ × Ó ÓרÓ× º ÈÓÖ ÑÔÐÓ¸ ÙÒ ÐÐ
 Ò ÙÒ ÔÖÓ Ö Ñ ÓÒØÖÓÐ ÓÖ ÙØ Ò Ó× Ò ÙÒ ÓÑÔÙØ ÓÖ Ò Ù×ØÖ Ð ÔÙ             Ù× Ö ÙÒ
ÔÖ        ÔÐ ÒØ ÕÙ Ø Ò Ð        Ò ÔÖÓ Ù Ø Ú Ñ × ÓרÓ×Ó × ÙÒ ÐÐ Ò ÙÒ ÔÖÓ Ö Ñ
   Ñ × ÓÒ Ö Ø ÙÒ × Ø Ð Ø ¸ ÔÓÖ ÑÔÐÓº
    Ä Ø ÓÒ ÓÖÞÓ× Ñ ÒØ Ö ÕÙ Ö ÙÒ Ò Ð × × Ò×Ô Ø ÚÓ Ð Ð ÓÖ ØÑÓ Ó ÔÖÓ¹
 Ö Ñ º Ù Ò Ó Ð Ò Ð × × × Ö Ð Þ × Ò ÙØ Ö Ð ÔÖÓ Ö Ñ Ò Ù ×Ø ÓÒ¸ × Ð ÒÓ¹
Ñ Ò ×Ø Ø Ó º Ò ÐÓ Ñ ÒØ ¸ Ù Ò Ó Ð Ò Ð × × × Ú Ð Ð           Ù ÓÒ Ð ÔÖÓ Ö Ñ ×
Ð ÐÐ Ñ      Ò Ñ Ó º Ð ÔÖ ÙÒØ         Ù Ð × Ñ ÓÖ Ä Ö ×ÔÙ ×Ø × ÕÙ Ù ÒØÓ ÒØ ×
× Ø Ø ÙÒ ÖÖÓÖ Ñ ÒÓ× ÓרÓ×Ó ×Ø ׺ ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ô Ö Ó Ð ØÓÖ Ó ØÙ Ö
 Ò Ð × × ×Ø Ø Ó ÒØ × ÒרÖÙÑ ÒØ Ö ÙÒ ÔÖÓ Ö Ñ º È Ö ÔÖÓÜ Ñ Ö Ð ÒØ Ò Ñ ÒØÓ
 ר ×ÙÒØÓ¸ ÓÒ× Ö ÑÓ× Ð × Ù ÒØ Ö ¬
                 Costo de corrección
                 de un error



                                                                                  Producción

                                                           Pruebas



                                        Codificación




                                       Diseño estructura             Tiempo de desarrollo de un sistema
                                       de código
                                Diseño arquitectural

               Requerimientos



Ä Ö ¬ Ô ØÓÖ Þ Ð × Ö ÒØ × Ø Ô × Ð ÐÐ Ñ Ó ÐÓ                       × ÖÖÓÐÐÓ ×Ó ØÛ Ö º
  ÙÖ ÒØ Ð × ØÖ × ÔÖ Ñ Ö × × × × Ù Ò Ó × ØÓÑ Ò × ÓÒ ×              × ÒÓ    Ð ÓÖ ØÑÓ× Ý
Ñ Ò ×ÑÓ× × ×Ø Ñ ¸ Ñ ÒØÖ × ÕÙ ÙÖ ÒØ Ð × ØÖ × Ö ×Ø ÒØ × × Ù Ò Ó Ø Ô Ñ ÒØ ×
   Ø Ø Ò ÐÓ× ÖÖÓÖ ×¸ × Ò Ó ÐÓ×      × ÒÓ ÐÓ× Ñ × ÓרÓ×Ó׺ ÈÓ ÑÓ× Ö ÕÙ Ð Óר
    ÙÒ ÖÖÓÖ Ý ×Ù ÓÖÖ ÓÒ × Ö Ø Ñ ÒØ ÔÖÓÔÓÖ ÓÒ Ð Ð ÑÓÑ ÒØÓ Ò ÕÙ × Ø Ø º
  ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ñ ÒØÖ × Ñ × Ø Ö × Ø Ø ÙÒ ÖÖÓÖ¸ Ñ × ÑÔ ØÓ Ò Óר × ×Ø
Ø Òº
         Ð Ö ­ Ü ÓÒ ÒØ Ö ÓÖ ×         ×ÔÖ Ò Ö ÙÒ Ù ÖØ × ÒØ Ó ÔÖ Ù ÓÒ ÕÙ ×
        ×ÙÑ Ö ÙÖ ÒØ Ð × ØÖ × ÔÖ Ñ Ö × Ø Ô × Ð ÐÓ         × ÖÖÓÐÐÓº Ð ÔÖÓ Ð Ñ × Ó¸
Ý ×Ø × Ð ØÖ ÑÔ Ð ÕÙ ×Ù ÙÑ Ò ÑÙ Ó× Ò Ò ÖÓ× Ý ÔÖÓ Ö Ñ ÓÖ ×¸ × ÕÙ ¸ Ù Ò Ó
× Ö Ð Þ ÙÒ ÒÙ ÚÓ × ×Ø Ñ Ý × ØÓÑ Ò × ÓÒ ×             × ÒÓ¸ ÒÓ × ÓÒÓ Ò Ù Ð × × Ö Ò
×Ù× ÓÒ × Ò ¬              Ý ¬ Ò º         ÓÖ    Ò¸ ÑÙ × Ú × ×            Ò Ð ØÖ ÑÔ
    ØÓÑ Ö      × ÓÒ ×     × ÒÓ × Ò ÓÒÓ Ö ÔÖ ÓÖ ×Ù× ÓÒ ×º ÓÒ× Ù ÒØ Ñ ÒØ ¸
ÑÙ × Ú × × Ò Ù ÒØÖ Ò ÖÖÓÖ ×            × ÒÓ¸ ÕÙ ×ÓÒ ÐÓ× Ñ × ÓרÓ×Ó׸ ÙÖ ÒØ Ð ×
     ÒרÖÙÑ ÒØ ÓÒº ÓÑÓ × ÔÙ             ×Ñ ÒÙ Ö ×Ø Ö × Ó Ä Ö ×ÔÙ ×Ø × Ö Ð Þ Ò Ó
3.4. Correctitud de algoritmos                                                209



ÑÓ ÐÓ×       × ÒÓ Ý Ú Ö ¬ Ò ÓÐÓ× ÒØ ×   ×Ù ÑÔÐ Ñ ÒØ ÓÒ ÓÑÓ ×       ÓרÙÑ Ö       Ö
 Ò ÓØÖ × Ö Ñ × Ð Ò Ò Ö º
3.4.3.1   Disciplina de programaci´n
                                  o

  Ù Ò × ×ÓÒ Ð × ÓרÙÑ Ö ×¸ Ù Ò ×          Ò × Ö Ð × Ó Ö ×º ÍÒ ÓרÙÑ Ö × ÙÒ      ØÓ
   ÕÙ Ö Ó       ÓÒÓ Ñ ÒØÓ× ÔÖ Ø Ó׸ ÓÑÔÖÓ Ó׸ × Ù ÖØÓ× ÙÖ ÒØ               ÙÖ ×
 Ù Ò × Ó Ö ×º Ò ÔÖÓ Ö Ñ ÓÒ¸ ÓÑÓ Ò Ù ÐÕÙ Ö ÓØÖ ÔÖ Ø ¸ ÐÓ× ÔÖ Ø ÒØ × ÓÖ Ò
 ÓרÙÑ Ö ×¸ Ù Ò × ÓרÙÑ Ö ×¸ ÔÓÖÕÙ × ÒÓ × Ð × ÑÓÖ Ö Ð ÔÖ Ø º Ù Ò Ó ÙÒ Ó×¹
ØÙÑ Ö Ú Ò ÓÑÙÒ ÒØÖ ØÓ Ó× ´Ó Ð Ñ ÝÓÖ Ô ÖØ µ ÐÓ× ÔÖ Ø ÒØ ׸ ÒØÓÒ × ×Ø
   Ú Ò Ò ÒÓÖÑ º
     Ä Ó × ÖÚ Ò         ÙÒ ÓרÙÑ Ö ¸ Ñ × ÙÒ ÙÒ ÒÓÖÑ ¸ Ö ÕÙ Ö ¸ × ÙÒ × ×
 ÔÖ Ò Þ Ó Ñ ×ØÖÓ¸ ÙÒ × Ù ÖÞÓ ÓÒ× ÒØ ÚÓÐÙÒØ ÔÓÖ Ö ÓÖ Ö ÔÐ Ö Ð ÒÓÖÑ
Ý ÙÒ Ù ÖÞ              Ö Ø Ö ÔÓÖ ÒÓ ØÖ Ò× Ö ÖÐ º ר × Ù ÖÞÓ Ý Ù ÖÞ × Ð ÒÓÑ Ò
    × ÔÐ Ò º
     ÀÓÝ Ò          Ð × Ù Ò × ÓרÙÑ Ö × × Ð × ÐÐ Ñ Ù Ò × ÔÖ Ø × Ô ÖÓ Ð Ö ¹
 ÙÒ Ò           ר Ð ¬ Ø ÚÓ ÔÐ ÒØ ÙÒ Ñ Ù                 ÓÒ Ð ÒÓ ÓÒ ÔÖ Ø ¸ Ö ÞÓÒ
ÔÓÖ Ð Ù Ð × Ù Ö ÑÓ× Ù× Ò Ó ÓרÙÑ Ö Ó¸ Ù Ò Ó ×Ø × Ó Ø Ú ÒØÖ ÐÓ× ÔÖ Ø ¹
  ÒØ ׸ ÒÓÖÑ º
       Ù Ð × ×ÓÒ Ð × ÓרÙÑ Ö × ÔÖÓ Ö Ñ ÓÒ ÕÙ ×Ù Ý Ò ØÖ × ÔÖÓ Ö Ñ × ÓÖ¹
Ö ØÓ× ÆÙÑ ÖÓ×Ó׸ ÚÓÐÙÑ ÒÓ×Ó× ÒØ Ö × ÒØ × Ø ÜØÓ× Ò × Ó × Ö ØÓ× ×Ó Ö ×Ø ×ÙÒØÓº
ÆÓ ݸ Ô٠׸ ×Ô Ó Ò ×Ø ×Ù ¹× ÓÒ Ô Ö ÔÖ × ÒØ Ö Ý × ÙØ Ö ØÓ Ó ÐÓ Ò Ö ÒØ
Ð × ÔÐ Ò         ÔÖÓ Ö Ñ ÓÒº È ÖÓ × ÔÓ ÑÓ׸ Ö Ñ Ø ÖÒÓ× Ð × Ù ÒØ       ÐÓ Ó      Ö¹
 Ö ÀÓÐØÞÑ ÒÒ ½½ Ô Ö Ð × Ö ØÙÖ ÔÖÓ Ö Ñ × ÓÖÖ ØÓ× Ö Ø Ó׺
Dec´logo de Holtzmann
   a

  ½º ÆÓ Ù× Ö goto¸ longjmp Ó Ö ÙÖ× ÓÒ Ö Ø Ó Ò Ö Ø º
     Ë ÐÚÓ Ð ÙÒ × Ü Ô ÓÒ × Ô ÖØ ÙÐ Ö ×¸ Ð ÒרÖÙ ÓÒ goto × Ó ÓÐ              ×
           ÙÒ × Ù ÒØ ×       × ÔÓÖÕÙ Ú ÓÒØÖ Ð Ð Ð            Ó Óº Ò Ò ÙÖ ¸
     ÐÓ× Ò Ð Þ ÓÖ × ×Ø Ø Ó× Ø Ò Ò × Ö × ¬ ÙÐØ × Ô Ö ÒØ ÖÔÖ Ø Ö ÕÙ ×Ù         ÓÒ
     ÙÒ gotoº ÄÓ Ñ ×ÑÓ Ó ÙÖÖ ÓÒ Ð ÓÒ ÙÒØÓ ÒרÖÙ ÓÒ × longjmp Ð Ð ÓØ
      ר Ò Ö Cº
     ÊÙØ Ò × Ö ÙÖ× Ú ×¸ Ö Ø Ó Ò Ö Ø Ñ ÒØ ¸ ×ÓÒ Ø Ñ Ò ÑÙÝ            Ð×   Ò ÐÞ Ö
     ÔÓÖ Ò Ð Þ ÓÖ × ×Ø Ø Ó׺ Ò Ò ÙÖ ¸ Ð Ö ÙÖ× ÓÒ Ù× ÑÔÐ Ø Ñ ÒØ Ð Ô Ð Ð
     × ×Ø Ñ ¸ ÙÝ ×Ø ÓÒ ×         Ð    ÓØ Öº
     À ݸ ÔÓÖ ×ÙÔÙ ×ØÓ¸ Ü Ô ÓÒ ×º ÅÙÝ Ò Ô ÖØ ÙÐ Ö¸ Ò ×Ø Ø ÜØÓ¸ ÓÒ Ð Ö ÙÖ× ÓÒ
       Ö Ø º Ò × × ÒØ Ó¸ ÔÓ ÑÓ× Ö ÕÙ ×ÓÐÓ         ÙØ Ð Þ Ö Ö ÙÖ× ÓÒ Ô Ö ÙÒ ÓÒ ×
      ÙÝ ÓÖÖ Ø ØÙ Ý × Ó ÑÓ×ØÖ Ý ÙÝÓ ÓÒ×ÙÑÓ Ô Ð × Ö ÒØ                      ר Ö
        ÓØ Óº Ò ×Ó× ×Ó׸ Ð ÙÒ ÓÒ Ö ÙÖ× Ú ÔÙ ×Ù ×Ø ØÙ Ö× ÔÓÖ ÙÒ ØÖÓÒ Ó Ó
      Ò Ö× ÙÒ Ò Ð Þ ÓÖ ÕÙ Ð ÙÒ ÓÒ Ò Ù ×Ø ÓÒ × ÓÖÖ Ø º
  ¾º Ë ÑÔÖ × ÙÖ Ö ÕÙ ØÓ Ó Ð ÞÓ Ø ÖÑ Ò º
         Ù ÒØ × Ú × ÒÓ ÑÓ× ÙØ Ó ÙÒ ÔÖÓ Ö Ñ ÕÙ ÒÓ Ø ÖÑ Ò Ò Ð ×Ó Ò Ö Ð¸
     ÐÓ× ÔÖÓ Ö Ñ × ÒÓ Ø ÖÑ Ò Ò ¹ Ù Ò Ó ×Ø Ò × Ò Ó× Ô Ö Ø ÖÑ Ò Ö¹ ÔÓÖÕÙ Ò Ò
210                                                Cap´
                                                      ıtulo 3. Cr´
                                                                 ıtica de algoritmos



        Ð ÞÓ× Ø ÖÒÓ×½ º
        Ä Ö Ð ÓÒ× ×Ø ¸ ÒØÓÒ ×¸ Ò Ú Ò Ö Ö ÒØ                     ÕÙ        Ð ÞÓ Ð ÔÖÓ¹
          Ö Ñ ´while¸ do-while¸ Ó forµ Ø ÖÑ Ò º            Ú Þ ÕÙ × ÔÖÓ Ö Ñ ÙÒ Ð ÞÓ
        ÔÖ ÙÒØ × Ý Ö ×ÔÓÒ × ÓÑÓ × × ÙÖ ÕÙ ×Ø × ÑÔÖ Ø ÖÑ Ò º
        Ä ÙÒ Ü Ô ÓÒ ×Ø Ö Ð × Ù Ò Ó × × Ö ÙÒ Ð ÞÓ ÕÙ Ñ ×                       Ø ÖÑ Ò Öº
        ÆÓÖÑ ÐÑ ÒØ ×ØÓ Ó ÙÖÖ Ò ÔÖÓ Ö Ñ × Ø Ö Ø ÚÓ× ÔÓÖ ÑÔÐÓ¸ ÙÒ × ÖÚ ÓÖº Ò ×Ø
           ×Ó¸ Ð Ö Ð × × ÙÖ Ö ÕÙ ¸ Ò ØÓ¸ Ð Ð ÞÓ ÒÙÒ Ø ÖÑ Ò º
     ¿º ÆÓ ÙØ Ð Þ Ö Ñ ÑÓÖ Ò Ñ            ×ÔÙ ×         Ö Ò Ð Þ Ó Ð ÔÖÓ Ö Ñ º
          Ò Ð ×Ô Ö ØÙ        ר Ø ÜØÓ¸ Ð Ö Ð × independizar toda abstracci´n delo
        uso de memoria din´micaº a         Ò ÓØÖ × Ô Ð Ö ×¸ Ù ÐÕÙ Ö Ð ÓÖ ØÑÓ Ó ×ØÖÙ ¹
        ØÙÖ        ØÓ×        ÓÒ Ö× × Ò Ô Ò Ò Ò Ñ ÑÓÖ Ò Ñ º
        ÈÓÖ Ñ ÑÓÖ Ò Ñ              ÒØ Ò ÑÓ× ÐÐ Ñ × malloc()/free()¸ new/delete¸
        sbrk()¸ alloca() ݸ Ò Ò Ö Ð¸         Ù ÐÕÙ Ö ÓØÖ ÔÖ Ñ Ø Ú     Ñ Ò Ó Ñ ÑÓ¹
        Ö º ÈÓÖ Ò Ð Þ ÓÒ ÒØ Ò ÑÓ× Ð ÔÖ Ñ Ö ×                  ÙÒ ÔÖÓ Ö Ñ Ò Ð Ù Ð ×
            Ð Ö Ò Ð × ×ØÖÙ ØÙÖ ×       ØÓ× Ý Ñ × Ð × × Ú Ö Ð × Ý × Ð × × Ò Ò ×Ù×
        Ú ÐÓÖ × ÔÖ Ñ Ò Ó׺
        Ä Ö ÞÓÒ × Ö ×Ø Ö Ð × Ó Ð º Ò ÔÖ Ñ Ö ÐÙ Ö¸ Ð ÒÑ Ò× Ñ ÝÓÖ                 Ñ Ò¹
         ×ÑÓ×        Ñ Ò ×ØÖ ÓÒ Ñ ÑÓÖ ÒÓ Ó Ö Ò ÓØ × ÓÒר ÒØ × ×Ó Ö Ð Ø ÑÔÓ
             Ù ÓÒº Ñ           ÕÙ × ×Ø ÓÒ Ñ × Ñ ÑÓÖ ¸ Ñ × Ö Ñ ÒØ ÓÒ Ó ÙÖÖ Ò Ð
         ×Ô Ó          Ö ÓÒ Ñ ÒØÓ¸ ÐÓ ÕÙ       Ö     Ð × ÑÔ ÒÓ Ý Ð ÔÖÓ Ð           Ü ØÓ
            Ö × ÖÚ ÓÒº ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ñ ÒØÖ × Ñ × ÙÖ ÙÒ ÔÖÓ Ö Ñ ¸ Ñ × ÔÖÓ Ð
         × ÕÙ Ð Ö × ÖÚ ÓÒ ÙÒ ÐÓÕÙ Ñ ÑÓÖ ÐÐ º ר Ù ÒØ ÔÓØ Ò Ð                         ÐÐ
               ÑÔÓ× Ð Ó Ö Ö ÙÒ Ö ÒØ              ÓÖÖ Ø ØÙ ´ × Ð Ô Ö×Ô Ø Ú Ñ Ò Ó
            Ñ ÑÓÖ µº
          Ò × ÙÒ Ó ÐÙ Ö¸ Ð Ñ Ò Ó Ñ ÑÓÖ × ÓÖ Ò ÙÒ Ö Ò ÔÖÓÔÓÖ ÓÒ ÖÖÓÖ ×¸
        Ö ÞÓÒ ÔÓÖ Ð Ù Ð ÙÒ ÓÖÑ           Ú Ö ×Ø ÔÓØ Ò Ð ÖÖÓÖ ÓÒ× ×Ø ¸ × ÑÔÐ Ñ ÒØ ¸
         Ò ÒÓ Ù× Ö Ñ ÑÓÖ Ò Ñ º Ç × ÖÚ ÑÓ× ÕÙ Ð Ù×Ó ÙÒ Ö ÓÐ ØÓÖ                    ×ÙÖ
        ´ Ö         ÓÐÐ ØÓÖµ ÒÓ Ú      ר ÔÖ Ò Ô Ó¸ × ÒÓ ÕÙ Ñ × ÐÓ Ò Ùר ¬ ¸ ÔÙ × Ð
           ר ÓÒ Ñ ÑÓÖ × ×Ó Ö ÙÒ Ö ÓÐ ØÓÖ Ü                  ÑÙ Ñ × Ò ÖØ ÙÑ Ö Ý
        Ø Ò Ñ ÒÓ× × ÑÔ ÒÓ ÕÙ ÙÒ Ñ Ò ÓÖ ØÖ ÓÒ Ðº
        ÄÓ× ÖÖÓÖ × Ñ Ò Ó Ñ ÑÓÖ × Ö Ò Ö Ú Ñ ÒØ ØÖ Ø Ó× Ò Ü ¿º º¿º¿ ´Ô Ò ¾¾½µº
        ÈÖÓ Ö Ñ × × Ò Ó× Ô Ö Ô ÖØ Ö ×Ù× Ö ÙÖ×Ó× ÓÑÔÙØ ÓÒ Ð × ÙÖ ÒØ ×Ù Ò Ð¹
         Þ ÓÒ ÒÓ ×ÓÐÓ ×ÓÒ Ñ × Ð ×           × ÙÖ Ö ÓÖÖ Ø ØÙ ¸ × ÒÓ ÕÙ Ø Ò Ò Ü Ö
        Ñ × × ÑÔ ÒÓº
          Ò ÙÒ ÓÒ        ר Ö Ð ¸ ÒÓ× ×Ø Ú Ó Ð Ù×Ó Ñ ÑÓÖ Ò Ñ                    Ä Ö ×¹
        ÔÙ ×Ø × Ö Ð Ø Ú º ÆÓØ ÑÓ׸ Ò ÔÖ Ñ Ö ÐÙ Ö¸ ÕÙ ÐÓ× × ÒÓ×          Ð ÓÖ ØÑÓ× Ý ×¹
        ØÖÙ ØÙÖ ×       ØÓ× ÕÙ ØÖ Ø ÑÓ× Ò ×Ø Ø ÜØÓ × Ó Ò¸ Ò ×Ù Ñ ÝÓÖ ¸ ר Ö Ð º
                 Ó¸ ר Ð ÔÖ × ÒØ ÑÓ× ÔÐ Ó Ð ÔÖ Ò Ô Ó ¬Ò¹ ¹¬Ò ÔÖ × ÒØ Ó Ò ½º º¾¸
         ÙÝ Ó × ÖÚ Ò ÓÒ Ù ÔÖ Ñ ÖÓ ×ØÖ Ö × Ò ÓÒ× Ö Ö Ð Ñ Ò Ó Ñ ÑÓÖ
 ½
      Ñ ÒÙ Ó¸ Ð ÜÔÖ × ÓÒ × Ð ÞÓ Ò¬Ò ØÓ º Ë Ò Ñ Ö Ó¸ Ò Ñ Ø Ñ Ø ¸ × ÓÑÓ Ò ÓØÖÓ× ÓÑ Ò Ó׸ Ð
   Ø ÚÓ Ò¬Ò ØÓ × Ù× Ò Ð × ÒØ Ó ÔÖÓÔÓÖ ÓÒ × ÒØ Ó Ô Ö Ð Ù Ð¸ Ò Ð ÓÔ Ò ÓÒ    ר ×Ù × Ö ÔØÓÖ¸
ÒÓ Ò      Ð Ø ÑÔÓº È Ö Ð Ø ÑÔÓ Ò × Ü ×Ø Ð      Ø ÚÓ Ø ÖÒÓ º
3.4. Correctitud de algoritmos                                                       211



        ÓÑÓ Ò ØÓ ÐÓ ÑÓ×            Ó Ý Ö ÑÓ× ØÖ Ú ×           ר Ø ÜØÓº ÄÓ× Ì        Ô Ò¹
           ÒØ × Ñ ÑÓÖ ´ ÓÒ ÔÖ ¬ Ó Ò ÒÓÑ Ö             Ð × ÝÒ µ¸ Ö Ú Ò ÙÒ Ú Ö× ÓÒ
        Ò Ô Ò ÒØ Ð Ñ Ò Ó Ñ ÑÓÖ º
         Ü ×Ø Ò ÔÖÓ Ð Ñ × ÙÝ × ×ÓÐÙ ÓÒ × ×ÓÒ Ð Ö × Ò ÙÖ ÓÒ Ý Ô Ö ÐÓ× Ù Ð × ×
        Ò ÐÙ Ð Ð Ñ Ò Ó Ñ ÑÓÖ º Ò ×Ø Ð ×                    ÔÖÓ Ð Ñ × Ò Ò ÐÓ× Ö Ó× Ý
       ÓØÖ × Ð × × ÔÐ ÓÒ ×º
   º   Å Ü ÑÓ ¼ Ð Ò × ÔÓÖ ÖÙØ Ò º
       Ä Ú × ÓÒ Ý ÓÑÔÖ Ò× ÓÒ ÙÑ Ò           ÙÒ ÖÙØ Ò ÓÑÓ ÙÒ ÙÒ                ÔÖÓ Ö Ñ ×
       Ö Ñ Ø ÐÓ Ú × Ð Ò ÙÒ Ó           Ô Ô Ð Ó × ¸ ÔÖÓÜ Ñ Ñ ÒØ ¼ Ð Ò ×º ÊÙØ Ò ×
       ÕÙ Ü Ò ×Ø ÐÓÒ ØÙ × Ö Ñ ÒØ Ò Ò Ú Ö × Ó × ´Ó Ô ÒØ ÐÐ ×µ ݸ ÔÓÖ ×ÙÔÙ ×ØÓ¸
       Ø Ò Ò Ñ × ÔÖÓ Ð            Ö Ñ ÒØ Ö Ð ÓÑÔÖ Ò× ÓÒº
   º   Å Ò ÑÓ Ó× ÒÚ Ö ÒØ × ´Ó × ÖØÓ×µ ÔÓÖ ÙÒ ÓÒº
       ÍÒ ÒÚ Ö ÒØ × ÙÒ ÓÒ ÓÒ ÕÙ × ÑÔÖ                    Ö       ÙÑÔÐ Ö× º ËÙ Ò ÙÑÔРѹ
         ÒØÓ ÒÓØ Ö ¸ ÒØÓÒ ×¸ ÙÒ ÖÖÓÖº
       Ä × ×Ø ר × Ò Ù×ØÖ Ð × ÔÖÙ                 ÔÖÓ Ö Ñ × Ò Ò Ó ÙÖÖ Ò              ÖÖÓÖ
        ÒØÖ ½¼ Ý ½¼¼ Ð Ò × Ó Óº ÈÓÖ Ø ÒØÓ¸ Ð Ù×Ó ÒÚ Ö ÒØ × ÓÑÓ ÔÖ ÓÒ ÓÒ ×¸
       ÔÓר ÓÒ ÓÒ × ÒÚ Ö ÒØ × ÕÙ ×               Ò Ñ ÒØ Ò Ö Ò Ð ÞÓ׸ ÙÒ Ó Ð Ö Ð
        ÒÑ Ø Ñ ÒØ ÒØ Ö ÓÖ¸             ÚÓÖ Ö Ð Ð             Ð Ó Ó ÔÓÖ ×Ñ ÒÙ ÓÒ
       Ð × ÔÖÓ Ð         × Ó ÙÖÖ Ò         ÖÖÓÖ Ý ÙÑ ÒØÓ ×Ù Ø ÓÒº
       Ä × ÒÚ Ö ÒØ × ÒÓ Ø Ò Ð ØÓ ÙÒ ÖÙØ Ò ¸ ÙÒÕÙ × ×Ù × ÑÔ ÒÓº ÈÓÖ
        ר Ö ÞÓÒ¸ Ñ Ò ×ÑÓ×          ÒÚ Ö ÒØ × ÔÙ Ò × Ð Ø Ö× Ó                  Ö×     ÐØÓ
       Ö Ò Ñ ÒØÓº Å × Ð ÒØ ¸ Ò Ü ¿º º¿º¿ ´Ô Ò ¾½ µ¸ Ð Ö ÑÓ× ×Ó Ö Ð Ù×Ó
        ÒÚ Ö ÒØ ׺
   º        Ð Ö Ò Ð Ó ØÓ× ÐÓ Ñ × Ö ÔÓ× Ð ×Ù ÔÖ Ñ Ö Ù×Óº
       Ä ÓÖÖÙÔ ÓÒ          ØÓ× × ÓØÖ      Ð × Ó ÙÖÖ Ò × ÔÖ Ò Ô Ð ×        ÖÖÓÖº Ù ÒØ ×
       Ú × ÒÓ ÒÓ× ÑÓ× Ò ÓÒØÖ Ó Ò Ð × ØÙ ÓÒ Ñ ×Ø Ö Ó× Ò Ð ÕÙ ÙÒ Ú Ö Ð
       ÒÓ Ø Ò Ð Ú ÐÓÖ ×Ô Ö Ó
       ÍÒ       Ð × Ú ÖØÙ × Ð Ó ÙÐØ Ñ ÒØÓ        Ò ÓÖÑ ÓÒ × ÕÙ Ð Ñ Ø Ð ÓÖÖÙÔ ÓÒ
        Ð Ñ ØÓ Ù×Ó Ð ØÓº Ë × ØÖ Ø                 ÙÒ Ì ¸ Ò Ö Ð Þ Ó¸ ÔÓÖ ×ÙÔÙ ×ØÓ¸
       Ð ÓÖÖÙÔ ÓÒ ÙÒÓ ×Ù× ØÖ ÙØÓ× ×ÓÐÓ ÔÙ                      Ö× ÙÒÓ ×Ù× Ñ ØÓ Ó׺
       È Ö Ó Ó ÙÖÖ Ò Ú Ð ÐÓ× Ó ØÓ× Ù×Ó ÒØ ÖÒÓ ÙÒ ÖÙØ Ò º
       ÈÓÖ Ø ÒØÓ¸ Ð Ö Ö ÙÒ Ó ØÓ ÐÓ Ñ × Ö ÔÓ× Ð ×Ù ÔÖ Ñ Ö Ù×Ó ÚÓÖ ÕÙ Ð
       Ó ØÓ ×ÓÐÓ Ü ×Ø Ò ×Ù Ñ ØÓ Ù×Óº Ò Ò ÙÖ ¸ Ò Ð Þ ÓÒ ÒÑ Ø Ð
           Ð Ö ÓÒ Ð Ñ Ò Ð ÔÓ× Ð              ÓÖÖÙÔ ÓÒ ÒØÖ Ð        Ð Ö ÓÒ Ý ×Ù ÔÖ Ñ Ö
       ÙØ Ð Þ ÓÒº
   º   Ë ÑÔÖ Ú Ö ¬ Ö Ú ÐÓÖ Ö ØÓÖÒÓ ÙÒ ÙÒ ÓÒ × ÓÑÓ ×Ù× Ô Ö Ñ ØÖÓ× ÒØÖ
       Ý× Ð º
         Ò Ô Ð Ö × Ñ × ÔÖ × ×¸       ÔÙÒØÓ ÒÚÓ ÒØ ÙÒ ÙÒ ÓÒ                 Ú Ö ¬ Ö Ô ÖØ ¹
       Ò Ò Ð ÓÑ Ò Ó Ð Ú ÐÓÖ Ö ØÓÖÒÓ × ÓÑÓ ×Ù× Ô Ö Ñ ØÖÓ× × Ð º Ð
       Ñ ×ÑÓ ÑÓ Ó¸        ÙÒ ÓÒ       Ú Ö ¬ Ö ÕÙ ÐÓ× Ô Ö Ñ ØÖÓ× Ö        Ó× Ø Ñ Ò ×Ø Ò
          ÒØÖÓ ×Ù ÓÑ Ò Óº
212                                                Cap´
                                                      ıtulo 3. Cr´
                                                                 ıtica de algoritmos



    º Å Ò Ñ Ð Ù×Ó Ð ÔÖ ÔÖÓ × ÓÖ Ò ÐÙ× ÓÒ Ö ÚÓ× Ý ×Ô ¬ ÓÒ Ñ ÖÓ×
      × ÑÔР׺
         ÙÒÕÙ ÐÓ× ÔÖ ÔÖÓ × ÓÖ × ×ÓÒ ÑÙÝ ÔÓ ÖÓ×Ó× ÓÑÓ Ñ Ó× ¹ Ó Ô Ö ÜØ Ò Ö
        Ð Ð Ò Ù ¸ ÐÐÓ× ÒÓ ×ÓÒ ÓÑÔ Ð ÓÖ ×º ÍÒ ÔÖ ÔÖÓ × ÓÖ ÒÓ Ú Ö ¬ Ð × ×Ø Ñ
      Ø ÔÓ× Ý¸ Ò Ò ÙÖ ¸ ÔÙ           Ò Ö Ö ÒרÖÙ ÓÒ × ÕÙ ÓÑÔ Ð Ò¸ ÕÙ ÓÖÖ ÒØ Ñ ÒØ
        ÙÒ ÓÒ Ò¸ Ô ÖÓ ÕÙ ×Ø Ò ØÓØ ÐÑ ÒØ Ó ÙÐØ × Ð Ñ Ö              Ð ÔÖÓ Ö Ñ ÓÖº
         ÓÒ× Ù ÒØ Ñ ÒØ ¸ ×         Ú Ø Ö Ð ÓÒ Ø Ò ÓÒ ÒÓÑ Ö ×¸ ÐÓ× Ô Ö Ñ ØÖÓ× Ú ¹
      Ö Ð × Ý ÐÓ× Ñ ÖÓ× Ö ÙÖ× ÚÓ׺ Ä Ü Ô ÓÒ Ð Ö Ð × Ô Ö ×Ô ØÓ× ÕÙ ÒÓ
      ÔÙ ÑÔÐ ÒØ Ö Ð Ð Ò Ù ¸ Ò ÙÝÓ ×Ó ×                    Ù× Ö Ô Ö ÒØ × × ÔÓÖ      ÙÒ
            ÜÔ Ò× ÓÒ Ð Ñ ÖÓº
      Ê ÓÖ ÑÓ× ÕÙ C Ý C++ Ø Ò Ò ÙÒ ÓÒ × ÒÐ Ò ÕÙ ×ÓÒ ÕÙ Ú Ð ÒØ × Ò ÙÒ ÓÒ ¹
      Ð      Ý × ÑÔ ÒÓ Ð Ñ ÝÓÖ             ÐÓ× Ñ ÖÓ׸ ÓÒ Ð Ú ÐÓÖ Ò Ó ÕÙ Ù× Ò Ð
      × ×Ø Ñ Ø ÔÓ× Ð ÓÑÔ Ð ÓÖº
    º Ê ×ØÖ Ò Ð Ù×Ó ÔÙÒØ ÓÖ × ÒÓ Ñ × ÙÒ Ò Ú Ð                      Ö ÖÒ º
      ÍÒ Ö Ö Ò × ÙÒ                ×Ó ÐÓ ÕÙ ÓÒØ Ò Ð ÔÙÒØ ÖÓº Ò ×Ø × ÒØ Ó¸ Ð
      Ö Ð ×Ø Ð ÕÙ ÒÓ × ÔÙ Ò Ù× Ö Ó× Ó Ñ × Ö Ö Ò × ÔÓÖ ÑÔÐÓ¸ Ð Ó
        ÓÑÓ **ptr = ...º
      È Ö ÓÑ ÒÞ Ö¸ Ñ × ÙÒ Ò Ú Ð × ÓÑÔÐ Ó                    ÓÑÔÖ Ò Ö ÙÒ Ô Ö ÐÓ× Ñ ×
      Ú ÖØÙÓ×Ó× ÔÖÓ Ö Ñ ÓÖ ×º Ò × ÙÒ Ó ÐÙ Ö¸ Ø Ñ Ò ×                  Ð    ×ØÙ Ö ÔÓÖ ÐÓ×
        Ò Ð Þ ÓÖ × ×Ø Ø Ó׺
      ÈÓÖ ×ÙÔÙ ×ØÓ¸ Ý ×Ó× Ò ÕÙ Ð                 Ð Ö ÓÒ ÔÙÒØ ÖÓ× ÔÙÒØ ÖÓ× × Ò ¹
      × Ö ¸ Ô ÖÓ ×ØÓ ÒÓ Ò × Ö Ñ ÒØ             ÖÖ Ú ÓÐ ÓÒ Ð Ö Ð º È Ö ÙÒ ÑÔÐÓ
           × Ù Ñ ÒØÓ      ר Ö Ð ¸ Ú × Ð ÑÔÐ ÒØ ÓÒ DynArray<T> ÔÖ × ÒØ
        Ò Ü ¾º½º ´Ô Ò ½µº
  ½¼º Ë ÑÔÖ ÓÑÔ Ð ÓÒ ØÓ Ó× ÐÓ× Ð ÖØ × Ð ÓÑÔ Ð ÓÖ                Ð Ø Ó× Ý Ù× Ò Ð Þ ÓÖ ×
            Ó Óº
      Ä Ñ ÝÓÖ Ô ÖØ        ÐÓ× ÓÑÔ Ð ÓÖ × ÑÓ ÖÒÓ× ØÙ Ò Ú Ö ¬ ÓÒ ×                    ÖÖÓÖ ×
      Ø Ô Ó׺ ÈÓÖ ÕÙ Ö ÞÓÒ Ö Ò                 × ÖØ Ö× × × Ú Ö ¬ ÓÒ × Ä ÖÙ Ö ×¹
      ÔÙ ×Ø × ÕÙ ÑÙ Ó× ÔÖÓ Ö Ñ ÓÖ × ×ÓÒ Ñ Ð Ö Ó× Ý ÔÖ ¬ Ö Ò × ÐØ Ö ÙÒ ÖÖÓÖ Ó
        Ð ÖØ Ð ÓÑÔ Ð ÓÖ ÓÒ Ø Ð ÔÖÓ× Ù Ö¸ ÓÒ Ñ × ÔÖÓ Ð                         ÖÖÓÖ Ò Ð Ù¹
      ØÙÖÓ¸ ×Ù ÔÖÓÝ ØÓº Ð Ñ ×ÑÓ Ö ÞÓÒ Ñ ÒØÓ ÔÐ Ô Ö ÐÓ× Ò Ð Þ ÓÖ × ×Ø Ø Ó× Ó
         Ò Ñ Ó׺
          Ú × Ó ÙÖÖ ÐÓ ÕÙ × ÒÓÑ Ò Ð×Ó ÔÓ× Ø ÚÓ × Ö¸ ÙÒ Ö ÔÓÖØ Ó Ð ÖØ
      ÙÒ ÖÖÓÖ ÕÙ ÒÓ Ü ×Ø º ÈÓÖ ÐÓ Ò Ö Ð¸ רÓ× Ö ÔÓÖØ × Ó ÙÖÖ Ò Ò ÓÑ Ò ÓÒ ×
        Ó Ó ÒØÖ Ò × Ð × Ù Ð ×¸            ØÓ× Ð Ð Ö ¸ × ÔÖ Ö Ð ÑÓ ¬ ÖÐ × Ô Ö
      ÕÙ Ð ÓÑÔ Ð ÓÖ ÒÓ ÖÖÓ Ñ Ò× × Ð ÖØ Ó ÖÖÓÖº
       ØÖ Ú × Ð Ú Ò Ö Ð ÔÖÓ Ö Ñ ÓÒ¸ ×                 Ó × ÖÚ Ó ÕÙ ØÖ × Ð ÓÖÖ ÓÒ
ÙÒ ÖÖÓÖ × Ø Ò          Ò ÓÒØÖ Ö ÓØÖÓ Ö Ð ÓÒ Ó Ó ÙÒÓ ÒÙ ÚÓ ÒØÖÓ Ù Ó ÔÓÖ Ð Ñ ×Ñ
 ÓÖÖ ÓÒº Ì Ñ Ò ×            ÒÓØ Ó ÙÒ Ö × ×Ø Ò Ò ØÙÖ Ð ¸ Ú Ó× ¸ ÔÓÖ Ô ÖØ Ð ÔÖÓ¹
 Ö Ñ ÓÖ ÔÖÓÑ Ó¸ Ò Ñ Ö Ö Ñ ÒÙ Ó× Ñ ÒØ Ð ÓÖ Ò Ð ÖÖÓÖº Ì Ð Ø ØÙ × Ú Ó×
ÔÓÖÕÙ ÒÓ ×Ø ÓÒ ÓÖÖ Ö Ð ÖÖÓÖ¸ × ÒÓ¸ Ò ×Ó ÕÙ ØÖ × Ð Ñ ×ÑÓ ×Ù Ý Þ ÙÒ
3.4. Correctitud de algoritmos                                          213



Ñ Ð Ø ØÙ ¸ Ò ÓÒØÖ Ö Ò ÕÙ ÓÒ× ×Ø Ø Ð Ø ØÙ          ÑÓ Ó ÕÙ ×Ø ÔÙ   ÒÑ Ò Ö×
ݸ ÓÒ× Ù ÒØ Ñ ÒØ ¸ ÒÓ Ö Ô Ø Ö Ð Ñ ×Ñ Ð ×      ÖÖÓÖº
    ÌÓÑ Î Ò Ð ¸ ÙÒÓ ÐÓ× ÔÖ Ò Ô Ð × × ÖÖÓÐÐ ÓÖ × Multics ¸ ¾ ¸ ÕÙ Þ Ð ØÓ
Ñ × ÑÔÓÖØ ÒØ Ò × ×Ø Ñ × ÓÔ Ö Ø ÚÓ׸ × ÔÐ ÒØ ØÖ × ÔÖ ÙÒØ × ¿ ÕÙ ÙÒ × ÖÖÓÐÐ ÓÖ
× ÑÔÖ          Ö×        Ú Þ ÕÙ Ø Ø ÙÒ ÖÖÓÖ Ý ÕÙ ÐÓ Ò Ñ Ò Ò        × Ù ÖÖ Ð
  Ø ØÙ ÓÖ Ò Ö     ÐÓ× ÖÖÓÖ ×º
Las preguntas actitudinarias de Van Cleck

  ½º Ë Ò ÓÒØÖ Ö Ð ÖÖÓÖ Ó Ð Ñ ×Ñ Ð ×           ÖÖÓÖ Ò ÓØÖ Ô ÖØ Ð ÔÖÓ Ö Ñ
     ÈÐ ÒØ Ö× ×Ø ÔÖ ÙÒØ ÓÒÐÐ Ú ×Ø Ð Ö ÙÒ Ô ØÖÓÒ Ô Ö Ð ÖÖÓÖ Ý Ò ÙÒ ÓÒ Ð
     Ñ ×ÑÓ Ù× Ö Ò Ð Ö ×ØÓ Ð ÔÖÓ Ö Ñ ÓØÖ × Ô Ö ÓÒ × Ð Ô ØÖÓÒº ÄÓ× ÐÐ Þ Ó×
       Ð Ô ØÖÓÒ ×ÓÒ ÐÙ Ö × ÔÖÓ Ð × Ö Ô Ø Ò        Ð ÖÖÓÖº
  ¾º Ù Ð × ÓØÖÓ× ÖÖÓÖ × ×Ø Ö Ò Ö Ð ÓÒ Ó× ÓÒ Ð Ò ÓÒØÖ Ó Ó ÓÒ ×Ù ÓÖÖ ÓÒ
     È ÖØ Ò Ó Ð ÔÓ× Ð             ÕÙ Ð ÓÖÖ ÓÒ ÒØÖÓ ÙÞ ÙÒ ÒÙ ÚÓ ÖÖÓÖ¸ ÓÖ Ö
      ר ÔÖ ÙÒØ ÓÒ ÖÓÒØ ÔÐ ÒØ Ö ÙÒ ÓÖÖ ÓÒ ÒØ ÖÖÓ Ö ÕÙ ×Ù Ö ÙÒ Ú Þ
     ÕÙ ×Ø × Ö Ð º ×Ù Ú Þ¸ ×ØÓ Ô × ÔÓÖ ÑÓ×ØÖ Ö Ö ÙÖÓ× Ñ ÒØ ÕÙ Ð ÓÖÖ ÓÒ
     × ÓÖÖ Ø Ó × ¸ ÕÙ ÒÓ ÓÒØ Ò Ð ÙÒ ÖÖÓÖº
  ¿º ÉÙ ×         Ö      Ö Ô Ö ÔÖ Ú Ò Ö ÓÑ Ø Ö ÒÙ ÚÓ Ð ÖÖÓÖ
     ÍÒ Ú Þ Ö ×ÔÓÒ × Ð × Ó× ÔÖ ÙÒØ × ÒØ Ö ÓÖ ×¸ ×          ר Ð Ö¸ Ò ÙÒ ÓÒ Ð
     Ô ØÖÓÒ Ò ÓÒØÖ Ó¸ ÙÒ ÔÖÓØÓ ÓÐÓ ÕÙ Ú Ø Ö Ô Ø Ö Ð ÓÑ Ø Ñ ÒØÓ Ð ÖÖÓÖº
     ÉÙ Þ ×Ø × Ð ÔÖ ÙÒØ Ñ × ÒÖ ÕÙ ÓÖ Ô Ö Ð ÔÖÓ Ö Ñ ÓÖ¸ ÔÙ × ×Ù ÓÖ
     ÔÐ ÒØ ÙÒ Ò× Ò ÒÞ º
3.4.3.2    An´lisis est´tico
             a         a

Compilador y sistema de tipos
     Ð × ×Ø Ñ  Ø ÔÓ× Ð Ð Ò Ù      ÔÖÓ Ö Ñ ÓÒ¸ Ò ÓÒ ÙÒ ÓÒ ÓÒ Ð ÓÑÔ Ð ÓÖ¸
Ö Ð Þ Ò ÙÒ ÒÓÖÑ ØÖ Ó Ú Ö ¬ ÓÒ ÓÖÖ Ø ØÙ Ð Ú Ð Ö Ð ÓÖÖ ×ÔÓÒ Ò × Ð
ÔÖÓ Ö Ñ Ö ×Ô ØÓ Ð × ×Ø Ñ     Ø ÔÓ Ð Ð Ò Ù º ÓÑÓ ÑÔÐÓ ØÖ Ú Ð¸ Ô ÖÓ ÒÓØ Ð ¸
 ÓÒ× Ö ÑÓ×
          int x;
          string s;

          s = x; // Violaci´n de tipo. ERROR DE COMPILACI´N
                           o                             O


    ÄÓ× ÖÖÓÖ ×    ÓÑÔ Ð ÓÒ Ò × Ó Ù×         Ó Ù× ÓÒ Ý Ñ Ð ÓÒ ÒØÖ ÐÓ× ÔÖÓ¹
 Ö Ñ ÓÖ × ÒÓÚ Ð × Ý Ð ÙÒÓ× Ú ÒÞ Ó׺ Ù ÒØÓ× ÒÓ×ÓØÖÓ× Ð ÙÒ Ú Þ ÑÓ× Ô Ö¹
Ñ Ò Ó ÐÓÕÙ Ó× ÔÓÖÕÙ ÙÒ ÔÖÓ Ö Ñ ÒÓ ÒÓ× ÓÑÔ Ð
    ÍÒ Ñ Ö Ñ × Ö Ø        Ð ÔÖÓ Ð Ñ ÒØ Ö ÓÖ ÒÓ× Ô ÖÑ Ø ÔÖ Ò Ö ÕÙ ¸ × ÐÚÓ ÙÒ
 ÖÖÓÖ Ð ÓÑÔ Ð ÓÖ Ó Ð Ð Ò Ù       ÔÖÓ Ö Ñ ÓÒ¸ Ù ×Ø ÓÒ ÑÔÖÓ Ð Ô ÖÓ Ø Ð ¸ ÙÒ
 ÖÖÓÖ ÓÑÔ Ð ÓÒ Ø Ò Ð Ö Ò ÓÒ            ÕÙ ÒÓ× Ù ÖÞ Ò Ö ÒØ Ö Ð ÓÑ Ø Ñ ÒØÓ
ÙÒ ÖÖÓÖ ÓÑÓ ÔÖÓ Ö Ñ ÓÖ ×º Ò Ð ÑÔÐÓ ÒØ Ö ÓÖ¸ ÒÓ Ø Ò × ÒØ Ó × Ò Ö ÙÒ ÒØ ÖÓ
  ÙÒ      Ò      Ö Ø Ö ×º
214                                         Cap´
                                               ıtulo 3. Cr´
                                                          ıtica de algoritmos



    ÈÓÖ ÐÓ Ò Ö Ð ÐÓ× ÓÑÔ Ð ÓÖ × Ô Ö Ñ ØÖ Þ Ò ×Ù× ÑÓ Ó×   Ø ÓÒ Ý ØÖ Ø Ñ ÒØÓ
    ÖÖÓÖ ×º ÓÒ×ÙÐØ × Ð Ñ ÒÙ Ð Ð ÓÑÔ Ð ÓÖ GNU gcc Ô Ö Ñ × Ø ÐР׺ Ò ØÓ Ó
  ×Ó¸ ÓÑÓ Ý ÐÓ Ø Ð        Ñ Ö Ð ÀÓÐØÞÑ ÒÒ¸ ÓÑÔ Ð × ÓÒ ØÓ Ð Ø ÓÒ
 ÖÖÓÖ × Ý Ð ÖØ × Ð Ø Ó׺ ÆÓ × ÔÖÓ×      ר ÕÙ Ð ÓÑÔ Ð ÓÖ       ÖÖÓ Ö Ð ÖØ ×
Ý ÖÖÓÖ ×º
Analizadores externos
   Ê ×ÙÐØ ÕÙ Ð Ù×ÕÙ          ÖÖÓÖ × Ò Ð Ó Ó Ù ÒØ         ÙÒ ÔÖÓ Ö Ñ × ÔÙ
 ÙØÓÑ Ø Þ Ö Ô Ö Ú Ð Ö ÕÙ ×Ø × ÐÓ× ×Ø Ò Ö × Ó ¬ ÓÒ Ð Ð Ò Ù Ù ÓØÖÓ×
 ר Ð Ó× ÔÓÖ Ð ÖÙÔÓ ØÖ Óº ÉÙ Þ Ð ÑÔÐÓ Ñ × Ö ÔÙØ Ó ×ØÓ × lint ½ ¸ ÙÒ
 Ò Ð Þ ÓÖ ×Ø Ø Ó Ù ÒØ × Ô Ö Ð Ð Ò Ù C ÕÙ         Ú Ò Ó × Ò Ð Ô Ö Ð × ÖÖÓÐÐÓ
   ÔÖÓ Ö Ñ × Ò C¸       Ù ÒØ     Ð    Ð      Ð × ×Ø Ñ    Ø ÔÓ×    ר Ð Ò Ù º
lint ÙÒ × ÑÔÐ Ñ ÒØ Ù× Óº
   À Ý ÙÒ × Ù ÒØ × ÖÖ Ñ ÒØ ׸ Ò ×Ù × ÓÖØÙÒ Ñ ÝÓÖ             Ù×Ó ÓÑ Ö Ð¸ ÕÙ
Ö Ð Þ Ò Ò Ð × × ×Ø Ø Ó   ÓÖÖ Ø ØÙ    ÙÒ ÔÖÓ Ö Ñ º Ä Ñ ÒØ Ð Ñ ÒØ ¸ ÙÒ Ü ×¹
Ø Ò ÔÓ × ÖÖ Ñ ÒØ × Ð Ö × ÕÙ Ö Ð Ò ÙÒ Ò Ð × × ×Ø Ø Ó Ð Ñ ×ÑÓ Ò Ú Ð ÕÙ ÓØÖ ×
 ÓÑ Ö Ð ×º ÈÓ ÑÓ× Ø Ö¸ ÑÔ ÖÓ¸ LC-LINT¸ ÓÑÔÐ Ñ ÒØ Ö Ó Ð Ð Ö lint ½ ¸ Ý
Flawfinder ¾ Ý its4 ¼ ÓÖ ÒØ Ó× Ð Ù×ÕÙ             ÖÖÓÖ × × ÙÖ º
Meta-compilaci´n
              o
    Å Ø ¹ ÓÑÔ Ð ÓÒ ÓÒ× ×Ø Ò Ó Ö Ö ÙÒ ÓÑÔ Ð ÓÖ ÜØ Ò× Ð Ò Ð × ÒØ Ó ÕÙ Ð
Ù×Ù Ö Ó ÔÙ     Ò Ö ÒÙ Ú × Ö Ð ×     ÓÑÔ Ð ÓÒ × ÙÒ Ð ÓÒÓ Ñ ÒØÓ ÔÐ Ø ÚÓ Ð
Ù×Ù Ö Óº ר     Ø Ò ÑÙ Ó × ÒØ Ó ÔÓÖÕÙ Ð ÓÑÔ Ð ÓÖ ÔÓ× Ð Ñ ÕÙ Ò Ö Ò × Ö
Ô Ö Ð Ú Ö ¬ ÓÒ ÙØÓÑ Ø ¸ Ô ÖÓ ÒÓ ÔÓ× Ð ÓÒÓ Ñ ÒØÓ ×Ó Ö Ð Ø ÔÓ ÔÐ ÓÒº
ÈÓÖ Ð ÓÒØÖ Ö Ó¸ Ð Ó ¬ ÓÖ × ÔÓ× ÕÙ Ð ÓÒÓ Ñ ÒØÓ¸ Ô ÖÓ ÓÐ              Ð ÐØ
 ÕÙ ÐÐ Ñ ÕÙ Ò Ö º Ä      × × ¸ ÔÓÖ Ø ÒØÓ¸ Ò Ð ÔÖ Ò Ô Ó ¬Ò¹ ¹¬Òº
    ÈÓÖ ÑÔÐÓ¸ ÙÒ Ù×Ù Ö Ó ÔÓ Ö ×Ô ¬ Ö ÕÙ Ð × Ò ÓÒ ÒØÖ ÔÙÒØ ÖÓ× ×Ø ÔÖÓ¹
       Ý ÕÙ Ô Ö ØÓ ÐÐ Ñ       Ð ÓÔ Ö ÓÖ new ×Ó Ö ÙÒ ÔÙÒØ ÖÓ     Ò ÓÒØÖ Ö× ÔÓÖ
 Ð ÙÒ Ô ÖØ ÓØÖ ÐÐ Ñ     Ð ÓÔ Ö ÓÖ deleteº Ð Ñ ×ÑÓ ÑÓ Ó¸ Ø Ð ÜØ Ò× ÓÒ Ð ÓÑÔ ¹
Ð ÓÖ ÔÓ Ö Ô ÖÑ Ø Ö Ú Ö ¬ Ö ×Ø Ø Ñ ÒØ ÕÙ ÕÙ Ð new Ó ÙÖÖ ÒØ × ÕÙ Ð deleteº
    Ë ÔÙ Ò ÔÖÓÚ Ö¸ Ø Ñ Ò¸ Ð × ÔÖÓÔ               × ØÖ Ò× ÓÖÑ ÓÒ Ð × Ð ÓÑÔ Ð ÓÖ
Ô Ö Ö Ð Þ Ö ÓÒ × × Ñ ÒØ ׺ ÈÓÖ ÑÔÐÓ¸ ÕÙ Ð ÓÑÔ Ð ÓÖ ÑÔÐ ÒØ Ð ÔÖ Ñ Ö
Ö Ð ÀÓÐØÞÑ ÒÒ Ý ×ÔÐ Ð ×Ø ÓÒ Ñ ÑÓÖ Ð ×                         Ò Ð Þ ÓÒº
    Ê ÔÓÖØ ×    Ò Ð Ö Ø Ð ¸ Ò Ò ÕÙ Ð Ñ Ø ¹ ÓÑÔ Ð ÓÒ × Ö ÙÒ ÐÓ× ÔÖ Ò¹
  Ô Ð × Ñ Ó× Ú Ö ¬ ÓÒ ÓÖÖ Ø ØÙ Ò ÐÓ× ÒÓ× Ú Ò ÖÓ׺ Å ÒØ ר Ø Ò ¸
 Ò Ð Ö Ø Ð ¸ Ý Ò Ò ÓÒØÖ Ó Ñ Ð ×               ÖÖÓÖ × Ò Ä ÒÙܸ ÇÔ Ò Ë Ý ÑÙ Ó× Ý
 ÓÑÔÐ Ó× × ×Ø Ñ × ÓÑ Ö Ð ×º
    Ä Ñ ÒØ Ð Ñ ÒØ ¸ ÐÓ× ÔÖÓ Ö Ñ × Ö ×ÙÐØ ÒØ × Ð × ÒÚ ×Ø ÓÒ ×       ÒÐÖ Ø Ø ¸
ÒÓ ×ÓÒ Ð Ö        ×Óº
Exploraci´n del espacio global de estado
         o
   ÍÒ Ø Ò    Ö Ò Ó×     Ú Ö ¬ ÓÒ      ÓÖÖ Ø ØÙ Ö ÕÙ Ö ØÖ Ù Ö Ð ÔÖÓ Ö Ñ
 ÙÒ Ñ ÕÙ Ò     ר Ó ¬Ò ØÓ ÕÙ Ö ÔÖ × ÒØ ÐÓ× Ö ÒØ × ×Ø Ó× ÐÓ× ÔÖÓ Ö Ñ ×º
ÈÙ ×ØÓ ÕÙ ÒÓ ×ÔÓÒ ÑÓ×     ×Ô Ó Ô Ö ÜÔÐ Ö ÓÖÑ ÐÑ ÒØ ÕÙ × ÙÒ ÙØÓÑ Ø ¸
3.4. Correctitud de algoritmos                                                     215



ÐÓ ÒØÙ Ö ÑÓ× Ô ØÓÖ Ñ ÒØ Ñ ÒØ Ð × Ù ÒØ Ý × ÑÔÐ × ÑÓ ÙØÓÑ Ø ¸ Ö ×ÙÐØ ÒØ                 Ð
ÔÖÓ Ö Ñ ÕÙ Ð ÙÐ Ð Ñ ÒÓÖ ÒØÖ Ó× ÒÙÑ ÖÓ× x, y
                                          0
                                  x<y             not x<y

                                  1                2

                                 min=y           min=y

                                          3

                                              ret=min

                                          4

         Ö ÙÐÓ ÓÖÖ ×ÔÓÒ       ÙÒ ×Ø Ó ¸ Ñ ÒØÖ × ÕÙ           ­      × ÙÒ ØÖ Ò× ÓÒ
 ÒØÖ Ó× ×Ø Ó׺ Ð Ñ Ó ×Ø Ó Ó ÙÖÖ Ù Ò Ó ×                    ÙØ Ð ÒרÖÙ ÓÒ ×Ó
Ð ØÖ Ò× ÓÒº Ð ×Ø Ó Ò Ð × ÒÓØ ÓÒ ÙÒ ­                    ×Ð ÕÙ Ð ÐÐ ¸ Ñ ÒØÖ × ÕÙ
ÙÒÓ ¬Ò Ð ÓÒ ÓØÖ ­         ÕÙ Ð × Ð º
    ÍÒ Ú Þ Ó Ø Ò Ó Ð ´Ó ÐÓ×µ ÙØÓÑ Ø ×¸ ÙÒ × ÑÙÐ ÓÖ × Ò Ö              ÜÔÐÓÖ Ö ØÓ × Ð ×
 ÓÑ Ò ÓÒ × ×Ø Ó× ÔÓ× Ð × Ò Ð Ù×ÕÙ                   ÖÖÓÖ × × ÒØ Ø Ó× Ý × Ñ ÒØ Ó׺ ÍÒ
 ÖÖÓÖ × ÒØ Ø Ó × Ø ÐÓ ÓÑÓ ÙÒ ÖÖÓÖ Ò Ö Ð Ù ÐÕÙ Ö Ð × ÔÖÓ Ö Ñ ÔÓÖ Ñ¹
ÔÐÓ׸ ÕÙ ÙÒ ÔÖÓ Ö Ñ Ñ × ÙØ Ð ÙÒ ÔÓÖ ÓÒ ×Ù Ó Ó¸ Ó ÕÙ Ð ÔÖÓ Ö Ñ ÒØÖ
 Ò ÙÒ ×Ø Ó ÐÓÕÙ Ó Ø ÖÒÓ Ò Ð Ù Ð × ×Ô Ö ÔÓÖ ÙÒ Ú ÒØÓ ÕÙ Ñ × Ó ÙÖÖ Ö ´ ¹
ÐÓ µ¸ Ó ÕÙ × ÒØÖ Ò Ð           Ù ÓÒ ÙÒ Ð ÞÓ Ò¬Ò ØÓº ÍÒ ÖÖÓÖ × Ñ ÒØ Ó Ø Ò Ð ¬Ò Ð
ÔÖÓ Ö Ñ Ý Ô Ö ×Ô ¬ ÖÐÓ × ÙØ Ð Þ ¸ ÔÓÖ ÐÓ Ò Ö Ð¸ ÐÓ Ø ÑÔÓÖ Ð¾¼ Ó ÙØÓÑ Ø ×
ÔÖ        Ó× ´Ó     Ù µ¾½ º Ð ÔÖÓ ×Ó Ú Ö ¬ ÓÒ × Ñ ÒØ Ñ ÒØ ÐÓ Ø ÑÔÓ¹
Ö Ð ´Ó ÙØÓÑ Ø ×        Ù µ × Ð ÒÓÑ Ò “Verificaci´n de modelo” ´ ÅÓ Ð
                                                     o                                ¹
 Ò µº
      × Ð × Ó× ×¸ Ð Ú Ö ¬ ÓÒ ÔÓÖ ×Ø Ñ ØÓ Ó Ô Ö              ר ÒØ × ÑÔÐ º È ÖÓ¸ Ò Ð
Ö Ð ¸ ÐÓ× ÙØÓÑ Ø × Ö ×ÙÐØ ÒØ × ÙÒ ÔÖÓ Ö Ñ Ö Ð ×ÓÒ ÜØÖ Ñ Ñ ÒØ Ö Ò × Ý
ÒÓ × ÑÔÖ Ü ×Ø ÙÒ Ñ ØÓ Ó Ø ÖÑ Ò ×Ø Ô Ö ØÖ Ù Ö ÔÖÓ Ö Ñ ×                  ÙØÓÑ Ø ×º
      ר Ñ ØÓ Ó Ú Ö ¬ ÓÒ × ÑÙ Ó Ñ × ÒØ Ö × ÒØ Ù Ò Ó × Ú Ö ¬ Ò ÔÖÓ Ö Ñ ×
 ÓÒ ÙÖÖ ÒØ × × Ö¸ ÔÖÓ Ö Ñ × ÓÑÔÙ ×ØÓ× ÔÓÖ Ú Ö Ó× ÔÖÓ Ö Ñ × ÕÙ ×               ÙØ Ò × ¹
ÑÙÐØ Ò Ñ ÒØ º È ÖÓ ÕÙ × Ö ÕÙ Ö ÓÒרÖÙ Ö ÙÒ ÙØÓÑ Ø ÐÓ Ð ÓÑÔÙ ×ØÓ ÔÓÖ Ð
 ÓÑ Ò ÓÒ ÐÓ× ×Ø Ó× ØÓ Ó× ÐÓ× ÙØÓÑ Ø ×º
    Ì ÓÖ Ñ ÒØ ¸ Ð ÜÔÐÓÖ ÓÒ ÐÓ Ð Ð ×Ô Ó ×Ø Ó × Ô Þ                      Ø Ø Ö Ù ÐÕÙ Ö
 ÖÖÓÖ × ÒØ Ø Ó Ý ØÓ Ó× ÐÓ× × Ñ ÒØ Ó× Ò ÙÒ ÓÒ Ð ¬Ò ¬Ò Óº Ò Ð ÔÖ Ø ¸ ÑÔ ÖÓ¸
× Ø Ò Ð ÔÖÓ Ð Ñ ÕÙ Ð ×Ô Ó ×Ø Ó Ð ÙØÓÑ Ø ÐÓ Ð × ÜÔÐÓ× ÚÓ O(2n)º
  Ü ×Ø Ò Ø Ò ×¸ × × Ò × ÖÖÓÐÐÓ× Ø ÓÖ Ó׸ ÕÙ Ô ÖÑ Ø Ò Ð Ö ÓÒ ×Ø ÔÖÓ Ð Ñ ¸
× Ò Ó Ð × Ñ × ÑÔÓÖØ ÒØ × Ð × × Ù ÒØ ×
   ½º Ð ÓÖ ØÑÓ× × Ñ ÓÐ Ó× Ð          ÓÒ× ×Ø Ò ×Ù ×Ø ØÙ Ö Ð ÙØÓÑ Ø ¸ Ó Ô ÖØ       и ÔÓÖ
       ÙÒ ÓÖÑÙÐ ÐÓ º ÈÓÖ ÑÔÐÓ¸ Ô Ö Ð ÙØÓÑ Ø ÒØ Ö ÓÖ¸ × Ö ÔÓ× Ð ×Ù ×Ø ØÙ Ö
       Ð × ØÖ Ò× ÓÒ × × Ð ×Ø Ó ½              Ð ÔÓÖ ÙÒ ØÖ Ò× ÓÒ ÙÝÓ ÔÖ          Ó×Ö
       x < y ÓÖ ÒÓØ x < y, Ö Ø Ñ Ò ÔÙ × Ð ­Ù Ó      Ù ÓÒ ÒÙÒ × Ø Ò Ö            Ù×
       Ð × ØÖ Ò× ÓÒ × ×ÙÔÖ Ñ ×º
 ¾¼
   Ä ÐÓ   Ø ÑÔÓÖ Ð × ÙÒ ÐÓ      ÔÖ      Ó× ÙÝÓ× Ù ÒØ ¬ ÓÖ × ÓÒ× Ö Ò Ð Ø ÑÔÓ ¿½ º
 ¾½
   ÍÒ ÙØÓÑ Ø     ÔÖ     Ó× × ÙÒÓ ÙÝ × ØÖ Ò× ÓÒ × ×ÓÐÓ ÓÒØ Ò Ò ÔÖ  Ó× ÐÓ Ó× Ö Ð ÓÒ Ó×
ÓÒ ÙÒ ÙØÓÑ Ø Ö ×ÙÐØ ÒØ Ð ÑÓ ÐÓ ¸ ¾¾ º
216                                              Cap´
                                                    ıtulo 3. Cr´
                                                               ıtica de algoritmos



  ¾º Ê Ù ÓÒ ÔÓÖ ÓÖ Ò Ô Ö Ð ×Ø Ø Ò ¸ ÕÙ × Ö Ú                Ð ÙÒÓ× Ö ×ÙÐØ Ó×
     Ñ Ø Ñ Ø Ó׸ ÓÒ× ×Ø ¸ ÑÙÝ ÖÓ××Ó ÑÓ Ó¸ Ò ×Ùר ØÙ Ö Ð Ö ×    Ò × ØÖ Ò× ¹
      ÓÒ × × Ù Ò Ð ×¸ ÕÙ ÒÓ Ø Ò Ò ÙÖ ÓÒ ×¸ ÔÓÖ ÙÒ ×ÓÐ ØÖ Ò× ÓÒº Ð ÓÖ Ò
     Ô Ö Ð × ÔÐ     Ò Ñ Ý Ö ÙÖ× Ú Ñ ÒØ Ù Ò Ó × ØÖ Ø Ð ÙØÓÑ Ø ÐÓ Ðº
     ÈÓÖ ÑÔÐÓ¸ Ð ÙØÓÑ Ø
                                       0

                                           tmp=x

                                       1

                                           x=y

                                       2

                                           y=tmp

                                       3


      ÔÙ ×Ù ×Ø ØÙ Ö× ÔÓÖ Ð × Ù ÒØ ÓÒØ ÒØ ÚÓ          Ó× ×Ø Ó× Ý ÙÒ ØÖ Ò× ÓÒ Óѹ
      ÔÙ ×Ø ÔÓÖ Ð × ØÖ × ÒרÖÙ ÓÒ ×
                                       0

                                           tmp=x
                                           x=y
                                           y=tmp

                                       1


      ÍÒ × ÑÙÐ ÓÖ ÔÙ       Ò Ñ Ñ ÒØ Ø Ø Ö Ý ØÙ Ö ×Ø Ð × Ö Ù ÓÒº
   ¿º ×ØÖ ÓÒ Ò × ÑÔÐ ¸ ר Ø Ò × × Ò Ó × ÖÚ Ö ÓÒ ÙÒØÓ×               ר Ó× Ý
          ×ØÖ Ö ×Ù ÒØ Ö Þ Ñ Ò Ö Ò Ö Ðº Ð ÓÒ ÙÒØÓ ÓÒ× Ö Ó × ×Ù ×Ø ØÙÝ ÔÓÖ
      ÙÒ ÙØÓÑ Ø Ö Ù Ó ÙÝÓ ÖÓÐ × × ÑÙÐ Ö Ð Ö ×ÙÐØ Ó Ò Ö Ðº
    Ä × Ø Ò × ÒØ Ö ÓÖ × Ô ÖÑ Ø Ò Ö Ù Ö¸ ÑÙÝ ÓÒ× Ö Ð Ñ ÒØ ¸ Ð ×Ô Ó
 ר Óº Ò Ò ÙÖ ¸ ÓØÖ Ø Ò ¸ ÐÐ Ñ               ×ÙÔ ÖØÖ Þ ½ ¸ ÕÙ Ü Ñ Ò Ö ÑÓ×
 Ò Ü º¿º¾ ´Ô Ò       µ¸ ×     Ò Ð Ù×Ó Ø Ð × × × Ò Ø ÓÒ ÓÐ × ÓÒ¸ Ô ÖÑ Ø
Ö Ù Ö ØÓ Ú Ñ × Ð ×Ô Ó ÐÓ Ð ×Ø Óº ÄÓ ÒØ Ö ÓÖ¸ ÙÒ Ó Ð ÓÒÓ Ñ ÒØÓ Ð ×
   Ò × ×Ø ר ׸ Ò          ÕÙ × ÔÓ× Ð ÜÔÐÓÖ Ö × ØÓ Ó Ó¸ ØÓ Ó ¿ ¸ Ð ×Ô Ó
    ר Ó × × Ö Ð Þ Ò ×Ù¬ ÒØ × × ÑÙÐ ÓÒ × Ð ØÓÖ ×º
    ÉÙ Þ Ð ÜÔÓÒ ÒØ Ñ × ÔÓÔÙÐ Ö       ר Ð ×     Ú Ö ¬ ÓÒ × spin/promela ½¿¸
½ ¸ ½¾¸ ¿ º promela × ÙÒ Ð Ò Ù       ×Ô ¬ ÓÒ ÔÖÓ Ö Ñ × ´ÒÓ ÙÒ Ð Ò Ù
ÔÖÓ Ö Ñ ÓÒµ Ý spin × ×Ù × ÑÙÐ ÓÖº
     Ð Ò ÓÕÙ Ö ÕÙ Ö ÕÙ Ð ÔÖÓ Ö Ñ × ×Ô ¬ÕÙ Ò promela¸ ÐÓ ÕÙ Ò ÙÒ Ô ×Ó
     ÓÒ Ð Ý ÙÒ Ù ÒØ ÔÓØ Ò Ð ÖÖÓÖ Ð ØÖ ×Ð Ö Ð ×Ô ¬ ÓÒ Ò promela            Ð
ÐÒÙ          ÔÖÓ Ö Ñ ÓÒº Ä Ò ×         ר Ò ÓÕÙ ×         ÕÙ ÙÒ ÒÓ × ÓÒÓ
  Ò Ö ÐÑ ÒØ ÓÑÓ × ØÖ Ù ÙÒ ÔÖÓ Ö Ñ Ò ÙÒ Ð Ò Ù            ÔÖÓ Ö Ñ ÓÒ       ÙÒ
 ÙØÓÑ Ø        ר Ó ¬Ò ØÓº
    spin × Ð Ö     × ½ ½º
3.4. Correctitud de algoritmos                                                   217



   Ê ÒØ Ñ ÒØ × Ò × Ù ÖØÓ Ø Ò × Ø Ú × Ô Ö ØÖ Ù Ö ÙÒ ÔÖÓ Ö Ñ Ö Ð ¹
Þ Ó Ò ÙÒ Ð Ò Ù      ÔÖÓ Ö Ñ ÓÒ ÙÒ ÙØÓÑ Ø × ÙÒ Ð Ò ØÙÖ Ð Þ Ð ÔÐ ÓÒº
 ×ØÓ Ô ÖÑ Ø ÙØÓÑ Ø Þ Ö Ð ÔÖÓ ×Ó Ú Ö ¬ ÓÒ × Ò Ò ×       Ô × Ö ÔÓÖ Ð ×
ÑÓ Ð Þ ÓÒ Ò ÓØÖÓ Ð Ò Ù º
3.4.3.3   An´lisis din´mico
            a         a

Sistema operativo
       Ð Ö Û Ö Ý Ð ÔÖÓÔ Ó × ×Ø Ñ ÓÔ Ö Ø ÚÓ Ø Ò Ò Ñ Ó× Ô Ö Ø Ø Ö ÖÖÓÖ × ÙÖ ÒØ
Ð       Ù ÓÒ ÔÖÓ Ö Ñ ×º Ò Ð ×Ó Ð Ö Û Ö ¸ ÔÓÖ ÑÔÐÓ¸ ÔÙ                   Ø Ø Ö× ÙÒ
   Ú × ÓÒ ÔÓÖ ÖÓº Ò Ð ×Ó ÓÑ Ò Ó           Ö Û Ö Ý × ×Ø Ñ ÓÔ Ö Ø ÚÓ¸ ÔÙ      Ø Ø Ö×
ÙÒ Ú ÓÐ ÓÒ Ñ ÑÓÖ ´× Ñ ÒØ Ø ÓÒ ÙÐØµ¸ ÖÖÓÖ Ø Ñ Ò Ù× ÒØ                   × ×Ô Ö ÓÒ ×
Ý Ñ Ð ÓÒ × Ò ÐÓ× ÔÖÓ Ö Ñ ÓÖ × ÒÓÚ Ð ×¸ Ô ÖÓ Ò Ö Ð ÑÙÝ ÓÖØÙÒ Ó¸ ÔÙ × Ò
  Ð ÓÑ Ø Ñ ÒØÓ ÙÒ ÖÖÓÖ Ý Ð ×ÙÒ ÓÒ ×Ù ÓÒ ÓÖÖ Ø Ú º
Invariantes
     ÍÒ ÒÚ Ö ÒØ Ó × ÖØÓ × ÙÒ ÔÖ           Ó ÐÓ Ó ÕÙ × ÓÐÓ Ò Ð ÙÒ ÔÙÒØÓ ÙÒ
ÔÖÓ Ö Ñ Ý ÙÝ ÖØ ØÙ Ú Ö ¬ × × ÙÑÔÐ Ò Ð × ÔÖ Ñ × ×                  Ù ÓÒ ×ÙÔÙ ×Ø × ÔÓÖ
 Ð × Ò ÓÖ Ð Ð ÓÖ ØÑÓ Ó Ð ÔÖÓ Ö Ñ ÓÖº
     Ä       × ×Ø ÒØ × ÑÔÐ Ð ÔÖ         Ó × Ú ÐÙ ×ÓÐÓ Ù Ò Ó Ð ­Ù Ó        Ù ÓÒ Ô ×
ÔÓÖ Ð ÒÚ Ö ÒØ º Ò × ÑÓÑ ÒØÓ¸ × Ú ÐÙ Ð ÔÖ             Ó Ý¸ × ×Ø × Ð×Ó¸ ÒØÓÒ × × Ð
ÒÓØ ¬ Ð ÔÖÓ Ö Ñ ÓÖ Ñ ÒØ Ð ÙÒ Ú ÒØÓ ÔÓÖ ÐÓ Ò Ö Ð¸ Ð ÓÖØÓ Ð ÔÖÓ Ö Ñ º Ð
 Ú ÒØÓ Ð Ô ÖÑ Ø ÔÖ Ò Ö ÕÙ ¸ ´½µ Ó Ð × ÓÒ ÓÒ × Ö ÕÙ Ö × Ô Ö               ÙØ Ö Ð ­Ù Ó
 Ò ÖØÓ ÔÙÒØÓ ÒÓ × ×Ø Ò ÙÑÔÐ Ò Ó¸ Ó ´¾µ Ð ÓÑ Ø Ó ÙÒ ÖÖÓÖ Ö ÞÓÒ Ñ ÒØÓº Ð
 Ù ÐÕÙ Ö ÐÓ× Ó× ×Ó׸ × ×Ø Ò ÔÖ × Ò              ÙÒ ÖÖÓÖº
     Ä Ñ Ò Ö Ñ × × ÑÔÐ       ÒØ ÖÔÖ Ø Ö ÙÒ ÒÚ Ö ÒØ × Ò ÓÖÑ            ÔÖ ÓÒ ÓÒ Ó
ÔÓר ÓÒ ÓÒ ÙÒ ÖÙØ Ò º ÆÓØ ÑÓ× ÕÙ ×Ø                 ÔÙ       ÔÐ Ö×     Ù ÐÕÙ Ö ­Ù Ó
         Ù ÓÒ × Ö¸ Ð ÔÖ Ò Ô Ó ÙÒ ­Ù Ó¸ ר Ð ÑÓ× ÔÖ ÓÒ ÓÒ × ÕÙ                      Ò
 ÙÑÔÐ Ö× Ô Ö ÕÙ ×        ÙØ Ó ÓÖÖ Ø Ñ ÒØ º Ð Ñ ×ÑÓ ÑÓ Ó¸ ÐÙ Ó Ð                Ù ÓÒ
   Ð ­Ù Ó¸ Ð ×Ø Ó Ö Ñ Ó Ø Ð ÓÖÑ ÕÙ                     Ò ÙÑÔÐ Ö× Ð ÙÒ × ÔÓר ÓÒ ¹
  ÓÒ ×º       ÔÖ ÓÒ ÓÒ Ó ÔÓר ÓÒ ÓÒ ÒÓ × ÓØÖ Ó× ÕÙ ÙÒ ÒÚ Ö ÒØ º
       Ð ÙÒÓ× ÑÔÐÓ× ÔÙ Ò Ð Ö ¬ Ö Ð          º
     Ë × Ò Ö ÑÓ× ÙÒ ÔÖ Ñ Ø Ú Ô Ö Ð ÙÐ Ö Ð Ö Þ Ù Ö √x ÙÒ ÒÙÑ ÖÓ Ö Ð¸
 ÒØÓÒ × × × Ð ÓÐÓ Ö ÓÑÓ ÔÖ ÓÒ ÓÒ Ð ÔÖ                    Ó x ≥√ º Ä Ú ÓÐ ÓÒ
                                                               0                 ר
ÔÖ ÓÒ ÓÒ Ú Ò Ö ÕÙ Ò Ð ÙÒ Ô ÖØ ¸ ÒØ × ÒÚÓ √Ö x¸ × ÓÑ Ø Ó ÙÒ ÖÖÓÖº
    Ð Ñ ×ÑÓ ÑÓ Ó¸ ÔÓ Ö ÑÓ× ÓÐÓ Ö ÓÑÓ ÔÓר ÓÒ ÓÒ x2 = x¸ ÙÝ Ú ÓÐ ÓÒ¸
 ÓÒ ÓÒ ÕÙ Ð ÔÖ ÓÒ ÓÒ ÒÓ Ý × Ó Ú ÓÐ ¸ ÔÖÓ Ð Ñ ÒØ Ò Ö ÙÒ ÖÖÓÖ
 Ò Ð ÒרÖÙÑ ÒØ ÓÒ √xº
     ÍÒ Ú ÒØÙ Ð Ù ×Ø ÓÒ Ñ ÒØÓ Ð × ÒÚ Ö ÒØ × × ÕÙ ×Ø × ÓÒ×ÙÑ Ò Ø ÑÔÓ                 ¹
 Ù ÓÒº ÓÒ× Ù ÒØ Ñ ÒØ ¸ ×Ù Ù×Ó Ü × ÚÓ ÔÙ ÑÔ Ø Ö Ð Ø ÑÔÓ                  Ù ÓÒº ÆÓØ ¹
ÑÓ× ÕÙ ×Ø Óר ¸ ÙÒÕÙ ÓÒר ÒØ ¸ ÐÑ ÒØ ÔÙ ØÓÖÒ Ö× ÓÒ ÖÓ×Ó × ¸ ÔÓÖ ÑÔÐÓ¸
 ר ÓÒØ Ò Ó ÒØÖÓ ÙÒ Ð ÞÓº ÈÓÖ × Ö ÞÓÒ¸ ÑÙ Ó× ÔÖÓ Ö Ñ ÓÖ × ×ÙÔ Ø Ò Ð Ù×Ó
     ÒÚ Ö ÒØ × Ð Ó Ó       × ÖÖÓÐÐÓ Ý ÒÓ Ð Ó Ó ÔÖÓ Ù ÓÒº ÈÓÖ ÐÓ Ò Ö Ð¸ Ò C Ý
 Ð C++¸ ×ØÓ × ÙØÓÑ Ø Þ Ñ ÒØ Ñ ÖÓ× ÓÒ ÓÒ Ð ×º Ä Ñ Ò Ö Ø Ô × ÓÑÔ Ð Ö
ÒÚ Ö ÒØ × × Ð Ñ ÖÓ DEBUG ר ¬Ò Óº
218                                              Cap´
                                                    ıtulo 3. Cr´
                                                               ıtica de algoritmos



      Ò ÑÙ × Ó × ÓÒ × × ÑÔÓÖØ ÒØ           Ö Ð × ÒÚ Ö ÒØ × Ò Ó Ó ÔÖÓ Ù ÓÒ¸ ÔÙ ×
 ÖÖÓ Ò Ò Ó× Ó ÙÖÖ Ò               ÖÖÓÖº Ò ×Ø × Ó × ÓÒ ×¸ ÒÓ ×         ÓÖØ Ö Ð ÔÖÓ Ö Ñ º
    Ä       Ð ÓØ     ר Ò Ö C ÓÒØ Ò ÙÒ ÙÒ ÓÒ ÐÐ Ñ assert(predicado)¸ ÙÝ
 ÙÒ ÓÒ × Ú Ö ¬ Ö ÙÒ ÒÚ Ö ÒØ º ÆÓ Ó ×Ø ÒØ ¸ ר ÔÖ Ñ Ø Ú × ÓרÓ× Ò Ø ÑÔÓ
        Ù ÓÒ¸ Ö ÞÓÒ ÔÓÖ Ð Ù Ð ×Ù Ù×Ó × Ù ×Ø ÓÒ Ð Ô Ö Ó Ó ÔÖÓ Ù Ø ÚÓº
      Ü ×Ø Ò Ð ÓØ × ×Ô Ð Þ × Ò Ð Ù×Ó                  ÒÚ Ö ÒØ ׺ ÉÙ Þ ÙÒ        Ð×Ñ×
ÔÓÔÙÐ Ö × × GNU nana ¿¼ ¸ ÙÝ × ÓÒ ×¸ Ö ×Ô ØÓ Ð assert() ØÖ ÓÒ Ð¸ ÔÙ Ò
Ö ×ÙÑ Ö× Ò
   ½º × Ò Ô Ö Ð ¬ Ò Ò ÙÖ ÓÒ Ý ×Ô Óº                              Ó¸ Ð Ú Ö ¬ ÓÒ × Ø Ò
        ¬ ÒØ ÕÙ ÑÙ × Ú × ÒÓ Ú Ð Ð Ô Ò Ð Ñ Ò Ö ÒÚ Ö ÒØ × Ò Ð Ó Ó ÔÖÓ¹
         Ù ÓÒº
   ¾º Ä        ÓÒ ØÓÑ Ö ÒØ ÙÒ Ú ÓÐ ÓÒ ÒÚ Ö ÒØ × ÓÒ¬ ÙÖ Ð º Ë ÔÙ ¸ ÒØÖ
       ÓØÖ × Ó× ×
        ´ µ ÅÓ ¬ Ö Ð         ÓÒ ØÓÑ Ö ÒØ ÙÒ Ú ÓÐ ÓÒ             ÒÚ Ö ÒØ ÔÓÖ ÑÔÐÓ׸
               ÓÖØ Ö× ¸ Ö Ò Ö¸ ÒÚ Ö ÙÒ ÔÙÖ ÓÖ Ó¸ × ÑÔÐ Ñ ÒØ ¸ Ö ÔÓÖØ Ö Ý ÓÒØ ÒÙ Öº
        ´ µ À Ð Ø Ö Ó × Ð Ø Ö × Ð Ø Ú Ñ ÒØ Ð Ú ÐÙ ÓÒ ÒÚ Ö ÒØ ׸ Ø ÒØÓ Ù¹
            Ö ÒØ Ð ÓÑÔ Ð ÓÒ ÓÑÓ ÙÖ ÒØ Ð              Ù ÓÒº
   ¿º ÒÖ ÕÙ          ÓÒ ÓØÖ × Ð × × ÓÖÑ Ð × ÔÖ Ñ Ø Ú × ÕÙ Ô ÖÑ Ø Ò Ú Ö ¬ ÓÒ × Ò¹
       Ú Ö ÒØ × Ñ × ÓÑÔР׺
    º Å ÓÒ ÔÖ × Ý ÔÓÖØ Ø Ð Ð Ø ÑÔÓ                  Ù ÓÒº
    Î ÑÓ× Ð ÙÒ × Ð × ÔÖ Ñ Ø Ú × GNU nana Ñ × ÑÔÓÖØ ÒØ × Ô Ö Ñ Ò Ö ÒÚ Ö ¹
 ÒØ ×
Invariantes basadas en asertos            ר Ð ×       ÒÚ Ö ÒØ ׸ Ð ÔÖ Ò Ô Ð ×
                      void I(pred)

      Ä Ù Ð Ú Ö ¬ ÕÙ pred × ÖØÓ¸ Ò ÙÝÓ ×Ó Ò Ø ÚÓ ÑÔÖ Ñ ÙÒ Ñ Ò×
       ÖÖÓÖ Ý ÓÖØ º
      ÍÒ ÓÖÑ ÓÒ ÓÒ Ð Ú ÐÙ Ö ÙÒ ÒÚ Ö ÒØ × Ñ ÒØ
                      void IG (bool pred, bool cond)

      Ä Ù Ð Ú ÐÙ Ð ÔÖ           Ó pred ÓÑÓ ÒÚ Ö ÒØ ×ÓÐÓ × Ð ÔÖ     Ó cond × ÖØÓº
       ר ÓÖÑ Ô ÖÑ Ø ¬Ò Ö ×Ó× ×Ô Ð ×º
        Ú × × Ò × Ö Ó Ñ ÒØ Ò Ö ×Ø Ó ÔÖ Ú Ó¸ ÔÓÖ ÐÓ Ò Ö Ð ×ØÓ Ó ÙÖÖ ÓÒ Ð ×
      ÔÓר ÓÒ ÓÒ ×º Ò ×Ø ×Ó¸ ×ÓÒ ÒØ Ö × Ð × × Ù ÒØ × ÔÖ Ñ Ø Ú ×
        ¯ void ID (instrucci´n) Ô ÖÑ Ø
                                 o             ÙØ Ö ÙÒ ÒרÖÙ ÓÒ¸ ÒÓÖÑ ÐÑ ÒØ ¸ ÙÒ
              Ð Ö ÓÒ Ú Ö Ð º
        ¯ void IS (Asignaci´n) o       Ô ÖÑ Ø Ö Ð Þ Ö ÙÒ × Ò ÓÒ ÙÒ Ú Ö Ð
              ÐÖ         Ó ID()º
             ÙÒÕÙ ID() IS() ×ÓÒ × ÒØ Ø Ñ ÒØ × Ñ Ð Ö ×¸ Ð ÔÖ Ñ ÖÓ        Ù× Ö× Ô Ö
              Ð Ö Ö Ý Ð × ÙÒ Ó Ô Ö × Ò Ö¸ ÔÙ × Ð Ó Ó         Ò Ö ÓÒ      ÒØ ¬ ÓÒ
            ×ÙÑ ×Ø ÙÒ ÓÒ Ð º
3.4. Correctitud de algoritmos                                                   219



                                      ØÙ ÙÒ × Ò ÓÒ ÓÒ ÓÒ Ð
        ¯ void ISG (instrucci´n, bool pred)
                             o
          ÕÙ Ð ÔÖ   Ó pred × ÖØÓº
     ÈÓÖ ÑÔÐÓ¸ ÙÒ Ó Ó ÕÙ Ð ÙÐ Ð Ö Þ Ù Ö     ÙÒ ÒÙÑ ÖÓ Ö Ð ÔÓ Ö
     ÔÐ ÒØ Ö× Ð × Ù ÒØ ÑÓ Ó
¾½    Ö Þ Ù Ö ¾½ ≡
       float ra´z_cuadrada(const float & x)
               ı
       {
         I(x >= 0); // precondici´n exigiendo que x sea positivo
                                 o

            // c´lculo de la ra´z de x, el cual se guarda en ret_val
                a              ı

            I(ret_val*ret_val == x); // Resultado debe ser igual a x
            ID(float ret_plus = ret_val + 1); // Declara variable adicional
            I(x < ret_plus*ret_plus); // y menor que el producto (ret_val+1)^2
       }

        × Ð Ð Ò Ù C × ÔÓ× Ð ÓÐÓ Ö ÙÒ × Ù Ò       ÒרÖÙ ÓÒ × ÓÑÓ ÙÒ ×ÓÐ
     × Ô Ö × ÔÓÖ Ð ÓÔ Ö ÓÖ ÓÑ º ×ØÓ × ÑÔÓÖØ ÒØ    Ö × ÐØ Ö Ò ×Ø ÓÒØ ÜØÓ¸
     ÔÓÖÕÙ × ÐÓ ÕÙ Ô ÖÑ Ø Ò ÐÓ Ö ÙÒ × Ù Ò ÓÑÔÐ Ø      ÒרÖÙ ÓÒ × Ò Ð ÙÒ
     ÔÖ Ñ Ø Ú    ÒÚ Ö ÒØ × ÔÓÖ ÑÔÐÓ
                             ID(int i = 0, j = x + y);



 Verificaci´n por cuantificadores de l´gica de predicados
          o                         o                     ÖÚ Ó Ð Ð Ö
       ÔÖÓ Ö Ñ ÓÒ ÔÓÖ ÓÒØÖ ØÓ× ¾ ¸ GNU nana Ó Ö Ú Ö ¬  ÓÒ × Ñ × Ö ¬Ò × Ó
     Ð ÓÖÑ      Ù ÒØ ¬ ÓÖ × ÐÓ Ó׺ ÒØÖ ÐÓ× Ñ × ÑÔÓÖØ ÒØ × ÔÓ ÑÓ× Ò Ö
       ¯ bool A(inicio,condici´n,iteraci´n,pred)
                              o         o          ÓÖÖ ×ÔÓÒ ÒØ Ð Ù ÒØ ¬¹
            ÓÖ Ô Ö ØÓ Ó ´∀µ¸ Ð Ù Ð × ÓÖÖ ×ÔÓÒ ÓÒ
                                 for (inicio; condici´n; iteraci´n)
                                                     o          o
                                   if (condici´n) return false;
                                              o

                                 return true;


        ¯ bool E (inicio,condici´n,next,pred)
                                o                         ÓÖÖ ×ÔÓÒ ÒØ Ð Ù ÒØ ¬   ÓÖ
             Ü ×Ø Ò      Ý ÕÙ ×      ¬Ò ×
                                 for (inicio; condici´n; iteraci´n)
                                                     o          o
                                   if (pred) return true;

                                 return false;

              ×       Ö¸ ×    ÖØÓ × Ð Ñ ÒÓ× Ò ÙÒ
                                              Ð × Ø Ö ÓÒ × × ÙÑÔÐ Ð ÔÖ     Óº
        ¯   long C (inicio,condici´n,next,pred) ÓÒØ ÓÖ
                                  o                         Ó ÙÖÖ Ò × ÙÒ ÔÖ ¹
                Ó ÓÒ× ×Ø ÒØ Ò
                                 int count = 0;
                                 for (inicio; condici´n; iteraci´n)
                                                     o          o
                                   if (pred)
                                     ++count;
220                                            Cap´
                                                   ıtulo 3. Cr´
                                                              ıtica de algoritmos




                           return count;
         ¯ bool E1 (inicio,condici´n,next,pred)
                                  o                    Ú Ö ¬ ÕÙ Ð ÔÖ      Ó ×
             ÙÑÔÐ Ü Ø Ñ ÒØ ÙÒ Ú Þº Ë ÔÙ         ÒØ ÖÔÖ Ø Ö Ð × Ù ÒØ Ñ Ò Ö
                           bool seen = false;
                           for (inicio; condici´n; iteraci´n)
                                               o          o
                             if (pred)
                               if (seen)
                                 return false;
                               else
                                 seen = true;

                           return seen;

         ÓÑÓ ÑÔÐÓ¸ ÓÒ× Ö ÑÓ× Ú Ö ¬ Ö Ð Ô ÖØ Ò Ò          Ü ÐÙ× Ú    ÙÒ Ð Ñ ÒØÓ ×¹
       Ô ¬ Ó ÙÒ Ð ×Ø ÒÐ Þ
¾¾¼     Ô ÖØ Ò Ò Ð ×Ø ÒÐ Þ ¾¾¼ ≡
         E1(typename DynDlist::iterator<int> it(l), it.has_current(), it.next(),
            it.get_current() == x);
       Í× × DynDlist ¿ º

   Ò ×Ø ÔÙÒØÓ × Ñ Ò ×Ø Ö × Ò Ð Ö ÕÙ GNU nana ÔÓ× ÐÓ× Ñ ×ÑÓ× Ø ÔÓ× Ù ÒØ ¬ ÓÖ ×
 × Ò Ð Ó× Ô Ö ÓÒØ Ò ÓÖ × Ð          Ð ÓØ ר Ò Ö C++º
    GNU nana × ÙÒ      Ð ÓØ ÑÙ Ó Ñ × Ö ¸ Ø ÒØÓ Ò ×Ô ¬ ÓÒ             ÒÚ Ö ÒØ ׸
  ÓÑÓ Ò ÓØÖ × ÙÒ ÓÒ Ð      ׺ Ä × Ø Ò Ñ ÒØ Ð Ñ ÒÙ Ð ¿¼ Ô Ö Ñ × Ò ÓÖÑ ÓÒº
 Pruebas
     ÍÒ ÔÖÙ      × ÙÒ ÜÔ Ö Ñ ÒØÓ ÓÒ× ×Ø ÒØ Ò ÙØ Ö Ð ÔÖÓ Ö Ñ Ô Ö Ú Ö ¬ Ö ×
  ÙÒ ÓÒ ÓÖÖ Ø Ñ ÒØ º ÖÓ××Ó ÑÓ Ó¸ Ü ×Ø Ò Ó× Ø ÔÓ× ÔÖÙ            ´½µ        Ò Ö¸
  Ò Ð Ù Ð × ×Ø Ð Ò ÒØÖ × Ý × Ð × ÓÖÖ Ø × Ú Ö ¬ Ö× ÙÖ ÒØ Ð ÜÔ Ö Ñ ÒØÓ
 Ý ´¾µ         Ð Ò ¸ Ò Ð Ù Ð × Ø ÖÑ Ò Ò ÒØÖ × ÕÙ Ú Ö ¬ÕÙ Ò ÕÙ Ð ­Ù Ó Ô ×
 ÔÓÖ ØÓ × Ð × Ô ÖØ × Ð ÔÖÓ Ö Ñ º
     ÈÓÖ ØÖ ÓÒ¸ Ð × ÔÖ٠׸ Ò Ô ÖØ ÙÐ Ö Ð ×   ¹Ò Ö ¸ Ð × Ö Ð Þ Ò Ô Ö×ÓÒ × ×Ø ÒØ ×
  Ð Ó ¬ ÓÖ ÐÐ Ñ × ÔÖÓ ÓÖ × ´Ø ר Ö×µº
     Ä × ÔÐ Ò ÑÔ ÖØ ÔÓÖ Å Ù Ö ¾½ ´Ú Ö Ü ¿º º¿º½ ´Ô Ò ¾¼ µµ              ÓרÙÑ Ö
 ÕÙ ÙÒ ÔÖÓ Ö Ñ ÓÖ × ÑÔÖ Ö Ð ÔÖÙ ×           Ð Ò Ô Ö ØÓ Ó ×Ù Ó Óº
       Ü ×Ø ØÓ ÙÒ Ò Ô Ö ÔÖÓ Ö ÔÖÓ Ö Ñ × ÙÝÓ Ñ ØÓ Ý ÜØ Ò× ÓÒ ×Ø Ò Ù Ö
     Ð Ò Ò ×Ø Ø ÜØÓº Ñ × ÐÓ× Ó× ÙØÓÖ × ÒØ Ö ÓÖ ×¸ Ð Ñ ÓÖ Ö Ö Ò ÕÙ ×
  ר Ö ØÓÖ ÓÒÓ Ô Ö Ð ÖØ Ð × ÔÖÙ × × Ø ØÙÐ Ì ÖØ Ó ËÓ ØÛ Ö Ì ×Ø Ò
 ÔÓÖ º º ÅÝ Ö× ¾ º
 Generaci´n autom´tica de prueba
         o       a
      Ò Ð Ö Ø Ð Ò × ÖÖÓÐÐ Ó ÙÒ Ø Ò ¸ ÔÖ Ñ Ò Ñ ÒØ ×           Ò Ò Ð × × ×Ø Ø Ó
    Ð Ó Ó Ù ÒØ ¸ ÓÒ× ×Ø ÒØ Ò Ò Ö Ö ÒØÖ × Ð ÔÖÓ Ö Ñ ÕÙ            ÙØ Ò ØÓ Ó ÐÓ×
   Ñ ÒÓ×        Ù ÓÒ ÔÓ× Ð × Ð ÔÖÓ Ö Ñ    º Ô ÖØ     Ò ÓÒØÖ Ö Ð × ÒØÖ × ÕÙ
  Ù Ö Ò ØÓ Ó× ÐÓ ×Ó× ÔÓ× Ð ×¸ × Ò Ö Ò ÒØÖ × ÕÙ ×ÓÑ Ø Ò Ð ÔÖÓ Ö Ñ Ñ Ü ÑÓ×
  × Ù ÖÞÓ× × ÙÒ × ÑÔ ÒÓ¸ ÓÒ ÓÒ × Ö Ø × ÓÒ ÙÖÖ Ò ¸ × ÙÖ ¸ Ø Ø Ö ¸ ÕÙ
3.4. Correctitud de algoritmos                                                 221



  Ò Ô ÖÑ Ø Ó Ò ÓÒØÖ Ö ÖÖÓÖ × Ò Ñ Ò          ÓÖ ×   × ×Ø Ñ     Ö ÚÓ Ò ÔÖÓ Ù ÓÒ ×
      ÒÓ׺
Manejo de memoria
   Ð Ñ Ò Ó Ñ ÑÓÖ Ò Ñ × ÙÒ Ù ÒØ                       ÖÖÓÖ Ø Ò ÓÑÙÒ ÕÙ Ñ Ö   ÓÒ× Ö Ö
ר ×Ù ¹× ÓÒ Ð × ¬ Ö Ý × Ö Ö Ð × Ð × ×                ÖÖÓÖº
      Fugas de memoria (memory leaks)
   ÍÒ Ù       Ñ ÑÓÖ Ó¸ Ò Ò Ð ×¸ ÙÒ Ñ ÑÓÖÝ Ð    × ÙÒ ÐÓÕÙ ÕÙ × Ö × ÖÚ
Ý ÕÙ Ñ × Ò Ð Ú      Ð ÔÖÓ Ö Ñ × Ð Ö º ÈÓÖ ÑÔÐÓ¸ × Ø Ò ÑÓ× Ð × Ù ÒØ
 Ò ¬ ÒØ ¸ Ò Ð ÒØ Ò ÓÖÖ Ø Ú Ö× ÓÒ Ð swap() ÒØÖ ÖÖ ÐÓ×
          void array_swap(int * a, int * b, const size_t n)
          {
             int * tmp = new int [n];

              for (int i = 0; i < n; ++i)
                tmp[i] = a[i];

              for (int i = 0; i < n; ++i)
                a[i] = b[i];

              for (int i = 0; i < n; ++i)
                b[i] = tmp[i];
          }

     ÒØÓÒ ×¸    Ú Þ ÕÙ × ÒÚÓÕÙ array swap() ×  Ö Ô ÖØ Ó¸ Ô Ö × ÑÔÖ ¸
ÙÒ ÖÖ ÐÓ tmp n Ð Ñ ÒØÓ׺ Ë array swap() × ÒÚÓ Ñ ÒÙ Ó¸ ÒØÓÒ × Ð ÔÖÓ Ö Ñ
 ÓÐ Ô× Ö Ò ÔÓ Ó Ø ÑÔÓ ÔÓÖ ÐØ Ñ ÑÓÖ º
    Ä Ö Ð Ô Ö Ú Ø Ö ×Ø ÖÖÓÖ × ÕÙ ØÓ Ó ÐÓÕÙ Ñ ÑÓÖ        Ð Ö Ö× ÒÑ ¹
Ø Ñ ÒØ ×ÔÙ × ÕÙ ×Ø Ý ÒÓ × Ö ÕÙ Ö º
      Acceso fuera de bloque
   Å ÒÓ× Ö Ù ÒØ      ÕÙ ÙÒ Ù         Ñ ÑÓÖ ¸ Ø Ñ Ò ÓÑÙÒ Ý¸ Ñ ÒÙ Ó¸ Ñ × Ö Ú ¸
ÙÒ ×Ó Ù Ö            ÐÓÕÙ ÓÒ× ×Ø Ò Ð Ð ØÙÖ Ó × Ö ØÙÖ   ÙÒ ÞÓÒ Ñ ÑÓÖ ÕÙ
ÒÓ ×    Ô ÖØ Óº        Ð ×Ó Ñ × Ø Ô Ó × × Ö Ö Ù×ØÓ ×ÔÙ × Ð ¬Ò ÙÒ ÐÓÕÙ
Ñ ÑÓÖ Ö × ÖÚ Ó       ÓÒ malloc() Ó newº ÈÓÖ ÑÔÐÓ
          int * tmp = new int [n];

          for (int i = 0; i <= n; ++i)
             tmp[i] = a[i];

    ר Ó Ó ÓÒ ÖØ ØÙ × Ö Ö ÙÒ ÒØ ÖÓ Ñ × Ò Ð ÖÖ ÐÓ tmpº Ò Ð Ñ ÓÖ
  ÐÓ× ×Ó׸ Ó ÙÖÖ Ö ÙÒ × Ñ ÒØ Ø ÓÒ ÙÐØ Ò Ð Ô ÓÖ¸ Ð ÖÖÓÖ Ô × Ö Ø ÑÔÓÖ ÐÑ ÒØ
 × Ô Ö Ó ×Ø ÕÙ Ø ÑÔÓ ×ÔÙ × ´ÕÙ Þ ÑÙ Ó ×ÔÙ ×µ ÔÖ × ÒØ × ÒØÓÑ × Ø Ñ Ò
ÖÖ Ø Ó× Ò Ð × ÒØ Ó ÕÙ ×ÓÒ Ú Ö Ð ×¸ ÔÙ Ò Ó × Ö¸ Ò ÐÙ× Ú ¸ Ò ÓÐ       × Ò Ö¹
  ÒÓ ´ × Ò Ù µ   ¾¾ º

 ¾¾
   ÈÓÖ Ð Ð Ö × Ó Ð Ñ Ò Ï ÖÒ Ö À × Ò Ö ÕÙ Ò × Ù Ö Ó Ð ÔÖ Ò Ô Ó ÓÑÓÒ ÑÓ Ö           Ð
ÑÔÓ× Ð      Ó × ÖÚ Ö Ð ×Ø Ó Ö Ð ÙÒ Ô ÖØ ÙÐ ØÓÑ ¸ ÔÙ × Ð Ñ ×Ñ Ó × ÖÚ ÓÒ Ñ              Ð
ר Óº
222                                         Cap´
                                               ıtulo 3. Cr´
                                                          ıtica de algoritmos



     Ä Ö Ð Ô Ö Ú Ø Ö ×Ø ÖÖÓÖ × Ð Ó Ú         × ÑÔÖ Ö Ú × Ö ÙÖÓ× Ñ ÒØ Ð     ×Ó
Ñ      ÒØ ÙÒ ÔÙÒØ ÓÖº ÈÓÖ × Ö ÞÓÒ¸ ×ÓÒ Ù Ò × ÓרÙÑ Ö ×
    ½º Í× Ö ÒÓÑ Ö × ÔÙÒØ ÖÓ× ÕÙ Ò ÕÙ Ò Ð Ö Ñ ÒØ ÕÙ × ØÖ Ø       ÙÒ ÔÙÒØ ÖÓº Ð
       Ñ Ò ×ÑÓ ÒÓÑ Ö Ñ ÒØÓ ÚÓÖ ØÓ × ×Ù¬ Ö Ð ÒÓÑ Ö ÓÒ ptr            ר ÑÓ Ó¸
       ÙÒ ÖÖ Ñ ÒØ ר ÐÓ grep ÔÙ        Ò ÓÒØÖ Ö Ð × Ó ÙÖÖ Ò × Ù×Ó ÙÒ ÔÙÒ¹
       Ø ÓÖ Ý Ô ÖÑ Ø Ö Ð ÔÖÓ Ö Ñ ÓÖ¸ Ó ÙÒ ÖÖ Ñ ÒØ ÙØÓÑ Ø Þ ¸ Ò Ð Þ Ö Ð
        ÓÖÖ Ø ØÙ º
    ¾º ×Ð Ð Ù×Ó ÔÙÒØ ÖÓ× ÓÑÓ ÖÖ ÐÓ× Ò ÓÔ Ö ÓÒ × Ò Ö ×¸ Ö Ó Ö Ù× Ð ×¸
       ÕÙ ÓÒ ÒØÖ Ò Ð Ú Ö ¬ ÓÒ          ÓÖÖ Ø ØÙ Ò ÙÒ ×ÓÐ ÔÓÖ ÓÒ         Ó Óº
       ÍÒ ÑÔÐÓ Ö ÔÖ × ÒØ Ø ÚÓ ÐÓ ÓÒר ØÙÝ Ò Ð × ÙÒ ÓÒ × fill dir to null()¸
       release segment()¸ ÒØÖ ÓØÖ × ×Ô ¬     × Ò Ü ¾º½º º¾ ´Ô Ò µº
    ¿º Ú Ø Ö Ð Ù×Ó Ñ × ÙÒ Ò Ö ÓÒ Ñ ÒØÓ ÔÓÖ ÔÙÒØ ÖÓº ÈÓÖ ÑÔÐÓ
                     **int_ptr = 5;

      ÒÓ ×Ø Ö Ô ÖÑ Ø Óº Ä Ü Ô ÓÒ ×Ø Ö Ð × Ù Ò Ó × ØÖ Ø Ò ÖÖ ÐÓ× ÓÑÓ
      ÔÙÒØ ÖÓ× Ý Ø Ò ÑÓ× ÖÖ ÐÓ× ÖÖ ÐÓ׸ Ø Ð × ÓÑÓ ÐÓ ÑÓ׸ ÔÓÖ ÑÔÐÓ× Ô Ö
       Ð Ñ ØÓ Ó access() DynArray<T> ´Ü ¾º½º º¿ ´Ô Ò ¿µµ Ó ÓÒ ÐÓ× ÖÖ ÐÓ×
      ÑÙÐØ ¹ Ñ Ò× ÓÒ Ð × ´Ü ¾º¾ ´Ô Ò ½µµº
    Direcci´n de devoluci´n inv´lida
           o             o     a
    ÍÒ ÒÚÓ ÓÒ Ü ØÓ× malloc() Ó new Ö ØÓÖÒ ÙÒ ÔÙÒØ ÖÓ       Ð ÐÓÕÙ Ö × ÖÚ Óº Ð
Ñ Ò ×ÑÓ        ÚÓÐÙ ÓÒ¸ Ñ ÒØ free() Ó delete¸     Ö Ö       Ü Ø Ñ ÒØ Ð Ñ ×ÑÓ
Ú ÐÓÖ ÔÙÒØ ÖÓ ÕÙ ÒØÖ Ó malloc() Ó deleteº Ä Ö Ö ÙÒ Ö       ÓÒ Ñ ÑÓÖ ÕÙ ÒÓ
   Ý × Ó Ö ØÓÖÒ ÔÓÖ Ð Ñ Ò ÓÖ Ñ ÑÓÖ ×¸ Ô٠׸ ÙÒ × Ö Ó ÖÖÓÖ ÔÖÓ Ö Ñ ÓÒ
ÕÙ ÓÑÔÖÓÑ Ø Ð ×Ø Ó Ð ÔÐ ÓÒ Ý ÙÝ × ÓÒ× Ù Ò × ×ÓÒ Ò ÖØ × Ý¸ ÔÓÖ ÐÓ
  Ò Ö Ð¸ Ô ÖÑ Ò Ò Ò Ø Ø Ð × ÙÖ ÒØ Ð ÙÒ Ø ÑÔÓº
      ÒØÖ Ö ÙÒ Ö ÓÒ ÒÚ Ð        Ð Ñ Ò ÓÖ Ñ ÑÓÖ × ÙÒ ÖÖÓÖ Ñ × ÓÑÙÒ
ÐÓ ÕÙ ÔÙ Ö Ô Ò× Ö× º ÉÙ Þ Ð ×Ó Ñ × Ö Ù ÒØ Ó ÙÖÖ ÓÒ ÔÙÒØ ÖÓ× ×Ó Ö Ð × ×
   Ö Ú × Ý Ð ÙÒ × ØÖ Ò× ÓÖÑ ÓÒ × Ö ×ÙÐØ ÒØ × Ð ×Ø Ò º ÇØÖ ÔÓ× Ð         ×Ù
 Ù Ò Ó × Ñ Ò Ò ÑÙÐØ ¹ רÖÙ ØÙÖ × ÔÓÖ ÑÔÐÓ¸ ÙÒ ÑÙÐØ ¹Ð ר º
    Verificadores din´micos de memoria
                    a
    ÄÓ× ÖÖÓÖ × Ñ ÑÓÖ Ù ÖÓÒ ÙÒ Ô Ö ÒÒ ÓÐÓÖ              Þ Ò Ð Ô × Ó ×Ø ÕÙ
 Ô Ö ÖÓÒ ÔÖÓ Ö Ñ ×¸ Ò ×Ù Ñ ÝÓÖ Ò ÓÖÑ              Ð ÓØ ׸ Ô Ö Ø Ø ÖÐÓ× × Ò Ó
ÐÓ× Ñ × ÔÓÔÙÐ Ö × ÒØÖ ÐÐÓ× electric fence ½ Ý dmalloc ½ º ÓÒ ×Ø ×ÕÙ Ñ ×
Ö ÕÙ Ö ÝÙ        Ð ÔÖ ÔÖÓ × ÓÖ¸ Ð Ù Ð ÒÓ ×Ø ÓÑÔÐ Ø Ñ ÒØ ×ÔÓÒ Ð Ò C++ Ý Ð
 Ò Ò Ñ ÒØÓ ÙÒ             Ð ÓØ ¸ Ð Ù Ð ÒØ Ö ÔØ Ð × ÐÐ Ñ × malloc() Ý free()º
    ÍÒ ÒÙ ÚÓ Ý Ú Ö× Ø Ð ÔÖÓ Ö Ñ           Ú Ö ¬ ÓÒ       Ô Ö Ó Ö ÒØ Ñ ÒØ
valgrind ¾ ¸ ¾ ¸ Ð Ù Ð ÒÓ Ö ÕÙ Ö       Ð ÓØ × ÒÓ ÕÙ ÒØ Ö ØÙ ×Ó Ö Ð ÙØ Ð
Ö ×ÙÐØ ÒØ º
    ÄÓ× Ñ Ò ×ÑÓ×         Ø ÓÒ ×ÓÒ ÐÓ× Ñ ×ÑÓ׺ Ò ÔÖ Ñ Ö ÐÙ Ö¸       Ö ÓÒ
  ÐÓÕÙ Ñ ÑÓÖ ¸ ÙÒØÓ ÓÒ ×Ù ÔÓ× ÓÒ Ü Ø Ö × ÖÚ ÓÒ¸ Ð Ò Ý ÒÓÑ Ö Ð Ö ÚÓ¸
× ÒÓØ Ò ÙÒ Ø Ð           Ñ Ò Ö Ø Ð ÕÙ Ð ¬Ò Ð Ð ÔÖÓ Ö Ñ Ð × ÒØÖ × Ò Ð Ø Ð
3.5. Eficacia y eficiencia                                                      223



 ÓÖÖ ×ÔÓÒ Ò Ù × Ñ ÑÓÖ º Ð Ñ ×ÑÓ ÑÓ Ó¸ ÙÒ                ÒØÖ     Ö ÓÒ ÒÚ Ð
ÔÙ       Ø Ø Ö× ÔÓÖÕÙ Ð Ö ÓÒ ÒÓ × Ò Ù ÒØÖ Ò Ð         Ø Ðº
      Ù Ò Ó × ×ÓÐ Ø ÙÒ ÐÓÕÙ ¸ × Ô ÖØ ÙÒ ÔÓ Ó Ñ ×      Ñ Ò Ö Ø Ð ÓÐÓ Ö Ö × ¸
Ð × Ù Ð × ×ÓÒ ÞÓÒ × ÓÒ Ú ÐÓÖ × ×Ô Ð ×¸     Ð Ó Ð       ÐÓÕÙ ¸ ÔÓ ÔÓ× Ð
 × Ö ØÙÖ ¸ Ý ÙÝ Ô ØÓÖ Þ ÓÒ × ÓÑÓ × Ù
           ptr

  Ð Ð Ö Ö ÙÒ ÐÓÕÙ        Ñ ÑÓÖ × Ö Ú × Ð Ú ÐÓÖ Ð Ö ¸ × ×Ø × Ö ÒØ Ð
 Ò Ó¸ ÒØÓÒ × ÔÙ × Ö × ÒØÓÑ ÕÙ ×                 × Ö ØÓ ÔÓÖ Ù Ö ÙÒ ÐÓÕÙ º
     Ä × Ú Ö ¬ ÓÒ × ÒØ Ö ÓÖ ×¸ Ò Ô ÖØ ÙÐ Ö¸ Ð × Ö ×¸ ÒÓ Ö ÒØ Þ Ò Ø ÓÒ Ô Ö ØÓ Ó×
ÐÓ× ×Ó׺
       Ð Ò ÓÕÙ     valgrind × Ð Ó × Ñ Ð Ö ÐÓ× ×Ó× ÒØ Ö ÓÖ × Ô ÖÓ ÒÓ ÒØ Ö ÔØ Ð
    Ð ÓØ Ò × º Ò ×Ù ÐÙ Ö¸ valgrind ÒØ Ö ÔØ ¸ ×Ó Ö Ð ÙØ Ð ¸ Ð × ÐÐ Ñ × Ö Ø ×
  Ö × ÖÚ ÓÒ Ñ ÑÓÖ ´malloc()¸ free()¸ sbrk()¸ new¸ delete¸ ºººµ ݸ Ò Ò ÙÖ ¸
 ÒØ Ö ÔØ ÐÓ× ×Ó× Ñ ÑÓÖ Ý ÓØÖ × ÓÔ Ö ÓÒ × Ð                 ׺ ÄÙ Ó ÙØ Ð ÔÖÓ Ö Ñ
ݸ ÙÖ ÒØ Ð        Ù ÓÒ Ú Ú Ö ¬ Ò Ó Ý Ö ÔÓÖØ Ò Ó ÐÓ× Ú ÒØÙ Ð × ÖÖÓÖ ×º valgrind
  ×Ñ ÒÙ Ó Ö Ò Ó× Ñ ÒØ Ð Ø ÑÔÓ Ú Ö ¬ ÓÒ Ò ÐÓ ÕÙ ÓÒ ÖÒ Ð Ñ Ò Ó
Ñ ÑÓÖ Ý ÓØÖ × Ð × × ÖÖÓÖ ×º
         Ó ÐÓ× Ó× Ò ÓÕÙ ÔÖ × ÒØ Ó׸ Ð ÔÖÓ Ö Ñ ×         ÙØ ÓÒ× Ö Ð Ñ ÒØ Ñ × Ð ÒØÓ¸
ÐÓ ÕÙ Ò Ö ÙÒר Ò × ×Ô Ð × ÔÙ                Ö ×Ù Ù×Ó ÓÑÔÐ Óº
Depuradores
      Ú ×¸ ÙÒ ÖÖÓÖ ÒÓ × Ø Ø ÔÓÖ ÐÓ× Ò Ð Þ ÓÖ × ×Ø Ø Ó× Ó Ò Ñ Ó× × ÒÓ ÕÙ ×
 ÓÒÓ ×Ù ÔÖ × Ò ÔÓÖÕÙ Ð ÔÖÓ Ö Ñ ÖÖÓ Ö ×ÙÐØ Ó× Ò ÓÖÖ ØÓ׺ ËÙ Ù×ÕÙ        × ÙÒ
 ÖØ ÕÙ Ô Ò           Ð ÜÔ Ö Ò ¸ Òר ÒØÓ ÒØÙ ÓÒ Ð ÔÖÓ Ö Ñ ÓÖ Ô Ö Ò ÓÒØÖ Ö
Ô ÖØ × ÕÙ Ó Ö Þ Ò Ô ×Ø × Ö         Ð ÖÖÓÖº Ò ×Ø ÓÖ Ò       ׸ ÙÒ  Ð× Ð××
   ÔÖÓ Ö Ñ × Ñ × ÙØ Ð × ÕÙ Ü ×Ø Ò ×ÓÒ ÐÓ× ÔÙÖ ÓÖ ×¸ ÔÖÓ Ö Ñ × ×Ô Ð Þ Ó× Ò
Ó × ÖÚ Ö Ð     Ù ÓÒ Ð ÔÖÓ Ö Ñ Ý Ö Ð ÓÒ ÖÐ Ð Ó Ó Ù ÒØ º
    ÍÒÓ ÐÓ× ÔÙÖ ÓÖ × Ñ × Ð Ö × × Ð GNU gdb ¿ ¸ ÙÒØÓ ÓÒ Ð ÙÒÓ× ×Ù×
 ÖÓÒØ Ð × ´ ÖÓÒØ¹ Ò × µ¸ Ø Ð × ÓÑÓ Ð ddd º

3.5    Eficacia y eficiencia
    ר × ÐØÙÖ × Ð × ÙÖ×Ó¸ ÒÓ×     × Ö Ð ÖÓ ÕÙ Ð ¬          ÔÖ Ñ Ð ¬ Ò º Ð
¬Ò Ð Ù ÒØ ׸ ÕÙ Ú Ð Ð Ó ÑÙÝ ¬ ÒØ × ÒÓ × ÓÖÖ ØÓ º ÈÙ × Ò¸ Ò Ð ÙÒÓ×
ÔÖÓ Ð Ñ × Ð ¬       ÔÙ     ÓÑÔÖÓÑ Ø Ö Ð ¬ Ò Ý Ú Ú Ö× ×                    ÓÖÖ Ø ¹
Ñ ÒØ ¸ ÒØÓÒ × ÔÙ × Ö ÑÙÝ Ò ¬ ÒØ ݸ ÔÓ× Ð Ñ ÒØ ¸ Ò ÔÐ Ð º È Ö ÔÖ Ò Ö
Ð Ù ×Ø ÓÒ¸ Ñ Ö ÑÓ× ÙÒ ÑÔÐÓ Ñ ×ØÖ Ð ÑÓ×ØÖ Ø ÚÓ Ð × Ú × ØÙ × ÒÚÓÐÙ Ö × Ò
Ð Ö ×ÓÐÙ ÓÒ ÙÒ ÔÖÓ Ð Ñ Ý ÐÓ× ÓÑÔÖÓÑ ×Ó× ÕÙ Ñ ÒÙ Ó × ÔÖ × ÒØ Ò ÒØÖ ÓÖÖ ¹
Ø ØÙ ´ ¬ µ Ý ¬ Ò º Ð × ÙÖ×Ó ×Ø Ò×Ô Ö Ó Ò ËØ Ú Ò Ë Ò                   ×Ù Ü Ð ÒØ
Ð ÖÓ Ì Ð ÓÖ Ø Ñ × Ò Å ÒÙ Ð ¿ º
      ÓÒ× Ö ÑÓ× ÙÒ ÓÒ ÙÒØÓ P = {p1, p2, p3, . . . , pn} n ÔÙÒØÓ× Ò Ð ÔÐ ÒÓº
ÔÙÒØÓ × ¬Ò ÔÓÖ ×Ù× ÓÓÖ Ò × ÖØ × Ò × (x, y)º Ð ÔÖÓ Ð Ñ ÓÒ× ×Ø ¸ ÒØÓÒ ×¸
 Ò Ò ÓÒØÖ Ö ÙÒ ÓÖ Ò Ú × Ø ÒØÖ ØÓ Ó× ÐÓ× ÔÙÒØÓ× Ñ Ò Ö Ø Ð ÕÙ Ð ÐÓÒ ØÙ Ð
Ö ÓÖÖ Ó × Ñ Ò Ñ º
224                                                Cap´
                                                      ıtulo 3. Cr´
                                                                 ıtica de algoritmos



    ר ÔÖÓ Ð Ñ × ÑÙÝ ÓÑÙÒ Ò ÑÙ Ó× ÓÒØ ÜØÓ׺
   ÀÝÚÖ ×ÑÒÖ×          ÓÖ Ö Ð ×ÓÐÙ ÓÒ   ר ÔÖÓ Ð Ñ º ÉÙ Þ Ð Ñ × Ò
× Ñ ÒØ Ð ÙÖ ×Ø        Ð Ú ÒÓ Ñ × Ö ÒÓ       Ó ÙÒ ÔÙÒØÓ pi¸ Ð ÔÖÓÜ ÑÓ ÔÙÒØÓ
  ÓÒ Ø Ö × Ð Ñ × Ö ÒÓ piº Ì Ð ÙÖ ×Ø ÓÒÐÐ Ú Ð Ð ÓÖ ØÑÓ ¿º½º




                            0                        0


             ÙÖ ¿º ÍÒ ×ÓÐÙ ÓÒ ÓÒ Ð         ÙÖ ×Ø         Ð Ú ÒÓ Ñ × Ö ÒÓ


Algoritmo 3.1 (Camino m´s corto seg´n la heur´
                              a       u            ıstica del vecino m´s cercano)
                                                                         a
Ä ÒØÖ        Ð Ð ÓÖ ØÑÓ × Ð ÓÒ ÙÒØÓ P = {p1, p2, p3, . . . , pn}º Ä × Ð × ÙÒ × Ù Ò¹
   S =< p1, p2, . . . , pn >º

  ½º Ë S =< ∅ > Ð × Ù Ò ÒÙÐ
  ¾º Ë Ð ÓÒ ÙÒ ÔÙÒØÓ p ∈ P Ý Ò ÐÓ S
  ¿º P − {p}
    º Ê Ô Ø Ñ ÒØÖ × P = ∅
       ´ µ Ë Ð ÓÒ q ∈ P | q × Ð ÔÙÒØÓ Ñ × Ö ÒÓ p
       ´ µ ÓÒ Ø Ò q Sº
       ´ µ P = P − {q}
       ´ µ p=q
    º Ä × Ù Ò S × Ð ×ÓÐÙ ÓÒ
     ר Ð ÓÖ ØÑÓ × ×Ø ÒØ × ÑÔÐ ¸ Ö ÞÓÒ ÔÓÖ Ð Ù Ð × ÑÙÝ Ð          ÓÑÔÖ Ò Ö Ý
   Ö Ð Þ Öº ÈÓ ÑÓ× Ð Ñ Ö¸ Ø Ñ Ò¸ ÕÙ Ð Ð ÓÖ ØÑÓ × ÑÙÝ ¬ ÒØ ÙÒ Ú Þ ÕÙ
× ÓÒ Ø Ò ÙÒ ÔÙÒØÓ Ð × Ù Ò S¸ Ð ÔÙÒØÓ ÒÙÒ Ñ × ÚÙ ÐÚ ÓÒ× Ö Ö× º ×
Ô٠׸ Ð Ø ÑÔÓ          Ù ÓÒ × O(n)º Ä Ñ ÒØ Ð Ñ ÒØ ¸ Ð Ð ÓÖ ØÑÓ ÒÓ × ÓÖÖ ØÓ¸ Ý
Ô Ö Ô Ö Ø ÖÒÓ×       ÐÐÓ¸ ÓÒ× Ö ÑÓ× Ð × Ù ÒØ ÓÒØÖ ÑÔÐÓ¸ ÓÑ ÒÞ Ò Ó × Ð
ÔÙÒØÓ 0


             ½                    ¾        ¿
            ¹¾¿                   ¹         ¹½ ¼ ½       ¿           ½¿


 ÓÒ ×Ø ×ÔÓ× ÓÒ ÔÙÒØÓ׸ Ð Ð ÓÖ ØÑÓ ¿º½¸ Ô Ö Ó Ñ ÒØ ¸ Ù× Ð × × Ù Ò ×
Ñ × Ð Ö × Ý ÒÓ Ð × Ñ × ÓÖØ ׸ Ð × Ù Ð × ×ÓÒ Ð × Ù ÒØ ÑÓ Ó
3.5. Eficacia y eficiencia                                                                           225



                ¹¾¿                         ¹           ¹½ ¼ ½    ¿                 ½¿



    ÓÒ× Ö ÑÓ× ÓØÖ ÙÖ ×Ø Ñ × ÓÑÔÐ              ÐÔ Ö                     ÔÙÒØÓ× Ñ × Ö ÒÓ ¸ Ð Ù Ð
ØÖ      ÓÒ ÐÓ× ÔÙÒØÓ× ÜØÖ ÑÓ×     Ñ ÒÓ× Ô Ö Ð ×º ÙÖ                   ÒØ Ð      Ù ÓÒ Ð Ð ÓÖ ØÑÓ¸
× Ø Ò Ö ÙÒ ÓÒ ÙÒØÓ        Ñ ÒÓ× Ô Ö Ð ×º Ð ÔÖÓ Ö ×Ó                   Ð Ð ÓÖ ØÑÓ ÓÒ× ×Ø Ò Ø Ö¹
Ñ Ò Ö Ý ÓÒ Ø Ö Ð Ô Ö ÔÙÒØÓ× ÜØÖ ÑÓ× Ñ × Ö ÒÓ×                          ÑÓ Ó Ø Ð ÕÙ Ð ÓÒ Ü ÓÒ ×
ÙÒ Ñ ÒÓ Ý ÒÓ × ÓÖÑ ÙÒ ÐÓº ר ÙÖ ×Ø ÓÒ Ù                                Ð Ð ÓÖ ØÑÓ ¿º¾º
Algoritmo 3.2 (Camino m´s corto seg´n la heur´
                                a           u             ıstica del par de puntos m´s cercano)
                                                                                    a
Ä ÒØÖ         Ð Ð ÓÖ ØÑÓ × Ð ÓÒ ÙÒØÓ P = {p1, p2, p3, . . . , pn}º Ä × Ð × ÙÒ × Ù Ò¹
   S =< p1, p2, . . . , pn >º
     Ð Ð ÓÖ ØÑÓ ÙØ Ð Þ ÙÒ ÓÒ ÙÒØÓ S = {S1, S2, . . . , Sm}        Ñ ÒÓ× Ô Ö Ð ×º
        Ó ÙÒ Ô Ö         Ñ ÒÓ× Ô Ö Ð × p1 = (r, s), p2 = (t, v) Ð ÙÒ ÓÒ ×Ø(p1, p20 Ð ÙÐ
Ð ×Ø Ò Ñ Ò Ñ ÒØÖ Ð Ô Ö ÔÙÒØÓ× ÜØÖ ÑÓ× ÐÓ× Ñ ÒÓ× p1 Ý p2º Ð Ñ ×ÑÓ
ÑÓ Ó¸ Ð ÙÒ ÓÒ ÓÒ Ø Ö(p1, p2) ÓÒרÖÙÝ ÙÒ Ñ ÒÓ Ô Ö Ð¸ ÔÖÓ Ù ØÓ ÓÒ Ø Ö p1
Ý p2¸ Ø Ð ÕÙ Ð ×Ø Ò             ÓÒ Ü ÓÒ ÒØÖ p1 Ý p2 × Ñ Ò Ñ º
   ½º ר Ò = ∞
   ¾º S = P × Ö¸ Ò ÐÑ ÒØ ¸ ÐÓ× Ñ ÒÓ× Ô Ö Ð × ×Ø Ò ÓÒ ÓÖÑ Ó× ÔÓÖ ×ÓÐÓ
      ÔÙÒØÓ×
   ¿º Ê Ô Ø Ñ ÒØÖ × |S| > 1
       ´ µ ∀(r, s), (t, v) ∈ S
             º Ë ×Ø((r, s), (t, v)) < ר Ò =⇒
                   º ר Ò = ר((r, s), (t, v))
                   º p1 = (r, s)
                   º p2 = (t, v)
                  Ð ÙÐÑ Ò Ö ×Ø × ÓÒ¸ p1 Ý p2 ×ÓÒ ÐÓ× Ñ ÒÓ× Ô Ö Ð × Ñ × ÔÖÓÜ ÑÓ׺
       ´ µ S = S − p1 − p2
       ´ µ p = ÓÒ Ø Ö(p1, p2)
       ´ µ S = S ∪ {p}
    º ÓÒ Ø ÐÓ× ÔÙÒØÓ× ÜØÖ ÑÓ× Ð × Ù Ò Ö ×ÙÐØ ÒØ Ò S º ×ØÓ ÓÒ ÓÖÑ Ð ÐÓ
      ¬Ò к
     Ð Ð ÓÖ ØÑÓ ¿º¾ ØÖ            ÓÖÖ Ø Ñ ÒØ Ô Ö ØÓ × ×ÔÓ× ÓÒ × ÔÙÒØÓ× ÕÙ ÑÓ×
ÔÖ × ÒØ Óº È Ö Ð ÑÔÐÓ ÒØ Ö ÓÖ¸ Ð Ð ÓÖ ØÑÓ ÓÑ ÒÞ Ö ÓÒרÖÙÝ Ò Ó ÐÓ× Ñ ÒÓ×
Ô Ö Ð × (3, 4)¸ (3, 4, 5)¸ (3, 4, 5, 6)¸ (2, 3, 4, 5, 6)¸ (2, 3, 4, 5, 6, 7) Ý (1, 2, 3, 4, 5, 6, 7)º
     Ð Ð ÓÖ ØÑÓ ¿º¾ × Ñ × ÓÑÔÐ Ó Ý Ñ ÒÓ× ¬ ÒØ ÕÙ Ð ¿º½¸ Ô ÖÓ ÙÒ ÔÓ ÑÓ×
    Ö ÕÙ ÙÒ × ¬ ÒØ ¸ ÔÙ × ×ÓÐÓ × ÓÒ× Ö Ò ÐÓ× ÔÙÒØÓ× ÜØÖ ÑÓ×                                Ñ ÒÓ× Ô Ö Ð ×
ÐÓ× ÔÙÒØÓ× Ò ÐÙ Ó× Ò Ð Ñ Ó                  Ñ ÒÓ× Ô Ö Ð × Ñ × ÚÙ ÐÚ Ò ÓÒ× Ö Ö× º
     ÑÔ ÖÓ¸ Ð ÙÖ ×Ø            Ð Ô Ö ÔÙÒØÓ× Ñ × Ö ÒÓ Ø ÑÔÓ Ó × ÓÖÖ Ø º ÓÒ× Ö ¹
ÑÓ× Ð × Ù ÒØ ×ÔÓ× ÓÒ ÔÙÒØÓ×
226                                                      Cap´
                                                            ıtulo 3. Cr´
                                                                       ıtica de algoritmos


                                                               1+d
                 1                              3                                5



              1−d



                2                                   4                            6

                             1+d


 ר ×ÔÓ× ÓÒ ×ÓÐÓ Ø Ò Ó× Ø ÔÓ×         ר Ò × 1 − d Ý 1 + dº ÍÒ ÔÓ× Ð ÚÓÐÙ ÓÒ
  Ð ÓÒ ÙÒØÓ S × ÙÒ Ð Ð ÓÖ ØÑÓ ¿º¾ × Ö Ñ × Ó Ñ ÒÓ× Ð × Ù ÒØ
                     S   =    {(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)}
                         → {(1, 2), (3, 3), (4, 4), (5, 5), (6, 6)}
                         → {(1, 2), (3, 4), (5, 5), (6, 6)}
                         → {(1, 2), (3, 4), (5, 6)}
                         → {(1, 2, 4, 3), (5, 6)}
                         → {(1, 2, 4, 3, 5, 6)      ;}

 ÙÝ ×Ø Ò ØÓØ Ð × 3(1 − d) + 2(1 + d) + (2(1 + d))2 + (1 − d)2º ר ר Ò ×
Ñ ÝÓÖ ÕÙ Ð Ñ Ò Ñ 4(1 + d) + 2(1 − d)¸ Ù Ð × Ð Ô Ö Ñ ØÖÓ Ð Ö Ø Ò ÙÐÓ ÓÒ ÓÖÑ Ó
ÔÓÖ ÐÓ× ÔÙÒØÓ׺ Ð Ð ÓÖ ØÑÓ ¿º¾ ÒÓ ×¸ Ô٠׸ ÓÖÖ ØÓº
   Ä ÙÒ ×ÓÐÙ ÓÒ ÓÖÖ Ø ÓÒÓ             ר      ÔÓÖ Ð × Ù ÒØ Ð ÓÖ ØÑÓ
Algoritmo 3.3 (Camino m´s corto entre un conjunto de puntos) Ä ÒØÖ
                         a                                                     Ð
 Ð ÓÖ ØÑÓ × Ð ÓÒ ÙÒØÓ P = {p1, p2, p3, . . . , pn}º Ä × Ð   × ÙÒ × Ù Ò S =<
p1, p2, . . . , pn >º
     Ð Ð ÓÖ ØÑÓ Ö ÕÙ Ö ÓÒרÖÙ Ö ÙÒ ÓÒ ÙÒØÓ Ω = {ω1, ω2, . . . , ωm} ÓÒ ÓÖÑ Ó ÔÓÖ
ØÓ × Ð × Ô ÖÑÙØ ÓÒ × ÔÓ× Ð × ÐÓ× ÔÙÒØÓ× P º
   ½º ר Ò = ∞
   ¾º Ö ×ÙÐØ Ó = ∅
   ¿º Ë Ω Ð ÓÒ ÙÒØÓ ØÓ × Ð × Ô ÖÑÙØ ÓÒ × (P)
    º ∀ω∈Ω
       ´ µ Ë c Ð ×Ø Ò ØÓØ Ð Ó Ø Ò        Ö ÓÖÖ Ö ÐÓ× ÔÙÒØÓ× Ò Ð ÓÖ Ò Ð Ô Ö¹
           ÑÙØ ÓÒ ω
       ´ µ Ë c < ר Ò =⇒
             º ר Ò = c
             º Ö ×ÙÐØ Ó = ω
    ÌÓ × ÐÓ× ÔÓ× Ð × Ñ ÒÓ× × ÓÒ× Ö Ò Ý ×ÓÐÓ × × Ó Ð Ñ ÒÓÖ Óר º Ð Ð Ó¹
Ö ØÑÓ Ò × × × ÑÔÐ ¸ ÙÒÕÙ ÒÓ ÓÒ× Ö ÓÑÓ ÓÒרÖÙ Ö Ð ÓÒ ÙÒØÓ Ô ÖÑÙØ ÓÒ ×¸
ÐÓ Ù Ð ÒÓ × ÙÒ Ø Ö ÑÙÝ × ÑÔÐ º Ð Ð ÓÖ ØÑÓ ×¸ Ô٠׸ ÓÖÖ ØÓº ÁÒ Ð ÞÑ ÒØ ¸ Ø Ð ÓÑÓ
× ÔÐ ÒØ ¸ × Ø Ò Ò ¬ ÒØ ÕÙ ×ÓÐÓ ÔÓ Ö        ÙØ Ö× Ò ÓÑÔÙØ ÓÖ × Ú ÒÓ׺ È Ö
 ÔÖ Ò Ö ×ØÓ Ò Ð ÑÓ× Ð ¬ Ò º
3.5. Eficacia y eficiencia                                                             227



    Ð ÒÙÑ ÖÓ       ÜÔÐÓÖ ÓÒ × ÕÙ Ö Ð Þ Ð Ð ÓÖ ØÑÓ ¿º¿ × Ù Ð Ð ÒØ
Ô ÖÑÙØ ÓÒ × ÕÙ Ü ×Ø Ò ÒØÖ ÐÓ× n ÔÙÒØÓ× Ó × ¸ O(2n)¸ ÙÒ ¬ Ò ÒØÖ Ø Ð ÙÒ
Ô Ö ÔÓ Ó× ÔÙÒØÓ׺ Ú ×¸ Ð ÓÖÖ Ø ØÙ Ý Ð ¬ Ò Ö ÔÖ × ÒØ Ò ÓÒØÖ                   ÓÒ ×
Ò× ÐÚ Ð ×º
     ÙÒÕÙ Ë Ò ÔÖ × ÒØ ר ÔÖÓ Ð Ñ ÓÑÓ ÙÒ ÓÑÔÖÓÑ ×Ó ÒØÖ ÓÖÖ Ø ØÙ ¸ ¬ Ò¹
   Ý Ð           ÔÖÓ Ö Ñ ÓÒ ¿ ¸ ÐÓ Ù Ð Ò ÖØ Ñ           × ÓÖÖ ØÓ¸ × Ö Ô Ö ÑÓ×
ÙÒ ÔÓ Ó Ý ÔÐ ÒØ Ö ÑÓ× ÒÙ ×ØÖÓ× Ö ÙÑ ÒØÓ× Ó Ð × × Ù ÒØ × Ó × ÖÚ ÓÒ ×
  ½º Ä Òר Ò        Ð ÔÖÓ Ð Ñ Ð Ú Ò ÓÖ Ú ÖÓ ÕÙ ×Ø ÑÓ× ØÖ Ø Ò Ó × Ò Ö Ð Ò Ð
     × ÒØ Ó ÕÙ × ØÖ Ø Ö ×ÓÐÚ ÖÐÓ Ô Ö ØÓ Ó× ÐÓ ×Ó× ÔÓ× Ð ×º Ë Ò Ñ Ö Ó¸ Ò Ð
     Ú Ö Ð¸ × × ÑÔÖ × ×ÔÓÒ Ñ × Ò ÓÖÑ ÓÒ Ö                   Ð × Ð × × ÒØÖ º
     ÈÓÖ ÑÔÐÓ¸ × × Ö ÕÙ Ö × Ö ×ÓÐÚ Ö Ð ÔÖÓ Ð Ñ Ô Ö ÔÐ Ò ¬ Ö ×ÓÐ ÙÖ × ×Ó Ö
     ÙÒ Ó Ð Ð ØÖÓÒ ¸ ÒØÓÒ × × × ÕÙ Ð × ÓÒ¬ ÙÖ ÓÒ × ÔÙÒØÓ× ÓÒ ÓÖÑ Ò
     ÔÓÐ ÓÒÓ× ÑÓÒÓØÓÒÓ× Ý ÕÙ Ô Ö ×ØÓ× Ð ÙÖ ×Ø        Ð Ú ÒÓ Ñ × Ö ÒÓ ÖÖÓ
     ×ÓÐÙ ÓÒ × ÓÖÖ Ø ×º
  ¾º Ò ÓØÖ × Ó × ÓÒ ×¸ Ð       Ö Ò ÒØÖ Ð ×ÓÐÙ ÓÒ ÓÔØ Ñ Ý ÙÒ Ù Ò Ò ÓÒØÖ
        ÙÖ ×Ø Ñ ÒØ ÒÓ × ÑÙÝ ÒÓØ Ð º Ò ×ØÓ× ×Ó׸ Ð Ø ÑÔÓ            × ÖÖÓÐÐÓ Ý ¹
      Ù ÓÒ ÙÒ Ð ÓÖ ØÑÓ Ù ÒÓ ÔÙ × Ö Ñ ÒÓÖ ÕÙ Ð ÙÒÓ ÓÔØ ÑÓº
       Ò Ð ÓÖ ØÑÓ× Ý × ×Ø Ñ ×¸ × ÓÑÓ Ò ÓØÖÓ× ÓÑ Ò Ó× Ð Ò Ò Ö ¸ × ÔÖÓÒÙÒ
     ÙÒ ÔÖÓÚ Ö Ó ÕÙ Ö Þ ÕÙ ÐÓ Ñ ÓÖ × Ò Ñ Ó ÐÓ Ù ÒÓ º
       ÐÓ ÒØ Ö ÓÖ × ×ÔÖ Ò ÕÙ Ð Ð ÓÒ × Ù × Ò Ó ÕÙ Ð ¬                  ÔÖ Ñ Ð
 ¬ Ò º
3.5.1   La regla del 80-20
  Ò ½ ¼ Ð Ò Ò ÖÓ Ö Ò Ó¹ Ø Ð ÒÓ Î Ð Ö Ó È Ö ØÓ × Ò ÐÓ ÕÙ Ò ÁØ Ð Ð ¼± Ð
Ö ÕÙ Þ × ×ØÖ Ù ÑÙÝ Ò Ùר Ñ ÒØ ÒØÖ Ð ¾¼± Ð ÔÓ Ð ÓÒº ËÙ Ó × ÖÚ ÓÒ
 Ù ÓÖÖÓ ÓÖ      Ò Ð ÙÒ × ÓØÖ × Ð Ø ØÙ × Ý ÓÒØ ÜØÓ× Ó Ð ÔÖ Ò Ô Ó È Ö ØÓ ¾¿ º
      Ò Ð ÙÒÓ× ÓÒØ ÜØÓ× Ò ÐÓ× Ù Ð × ×      Ð      ¬ Ò ¸ Ð ÔÖ Ò Ô Ó È Ö ØÓ
× Ó ÔÐ Ó Ô Ö Ö Ø Ö Þ Ö ÙÒ Ö Ð ÓÒ ÒØÖ Ö ÙÖ×Ó× ÓÒ×ÙÑÓ Ó ÔÖÓ Ù ÓÒ Ý ÐÓ×
    ÒØ × ÓÒ×ÙÑ ÓÖ × Ó ÔÖÓ Ù ØÓÖ ×º À Ý Ò     ÓÒ × ÑÔ Ö × ÕÙ Ð ÔÖ Ò Ô Ó ÔÐ
  ÐÓ× × ×Ø Ñ × ÓÑÔÙØ ÓÒ Ð ×º Ò ØÓ¸ × Ó × ÖÚ Ó¸ ÒØÖ ÓØÖ × Ó× ×¸ ÕÙ
   ½º Ð ¼± Ð Ñ ÑÓÖ ÓÒ×ÙÑ ÔÓÖ ÙÒ ÔÖÓ Ö Ñ × Ù× ÔÓÖ Ð ¾¼± Ð ÔÖÓ Ö Ñ º
   ¾º Ð ¼± Ð Ø ÑÔÓ           Ù ÓÒ × ÓÒ×ÙÑ Ó ÔÓÖ Ð ¾¼± Ð ÔÖÓ Ö Ñ º
   ¿º Ð ¼± ÐÓ× ×Ó× × Ó × Ö Ð Þ Ó ÔÓÖ Ð ¾¼± Ð ÔÖÓ Ö Ñ º
     º Ð ¼± Ð × Ù ÖÞÓ       × ÖÖÓÐÐÓ ÙÒ × ×Ø Ñ × Ö Ð Þ Ó ×Ó Ö Ð ¾¼± Ð Ñ ×ÑÓº
 ¾¿
      ×Ö       Ñ ÒØ Ô Ö Ð ÙÒÓ× ÔÙ ÐÓ׸ Ð ÔÖ Ò Ô Ó È Ö ØÓ Ø Ò Ó ÙÒ ÔÐ ÓÒ ÓÒÓÑ ¸ Ó¸
Ñ ÓÖ       Ó¸ ÓÒÓÑ ×Ø ¸ ÕÙ   Ô ÖÑ Ø Ó ×Ù Ö ÖÐÓ Ñ × ÓÑÓ ÙÒ ÔÖ Ò Ô Ó Ò ØÙÖ Ð    ØÓ   ÓÒÓÑ ¸
ÕÙ ÓÑÓ ÙÒ Ú Ò            Ò ¬ Ò Ó Ò Ùר ×Ó Ðº
  ÆÓØ × ¸ × Ò Ñ Ö Ó¸ ÕÙ Ò ÐÓ ÕÙ Ø Ò Ð × Ö × Ö ÙÑ ÒÓ¸ Ð × Ö Ð × ÓÒÓÑ × ×ÓÒ ÙÐØÙÖ Ð ×¸ ÒÓ
Ò ØÙÖ Ð ×º Ë Ø Ò Ù Ð Ö ×Ô ØÓ¸ ÔÖ ÙÒØ × ¸ ÔÓÖ ÑÔÐÓ¸ × Ð Ò ÖÓ Ò ØÙÖ Ð        × Ð ÒÓ ÓÒ Ó
    Ò ÖÓ ÙÒ ÓÒÓ Ñ ÒØÓ ÒÒ ØÓ¸ Ñ       Ó Ò ÒÙ ×ØÖÓ× Ò ×¸ × ÒØ × ÒÙ ×ØÖÓ Ò Ñ ÒØÓ
228                                              Cap´
                                                    ıtulo 3. Cr´
                                                               ıtica de algoritmos



  Ò ÔÖÓ Ö Ñ ÓÒ¸ ר Ô ØÖÓÒ × Ð ÒÓÑ Ò Ð Ö Ð Ð ¼¹¾¼ º Ä Ö Ð                    × Ó
×ÓÐ Ñ ÒØ ÓÑÔÖÓ          ÐÓ Ð Ö Ó Ð ×ØÓÖ         Ð ÔÖÓ Ö Ñ ÓÒ Ý ØÖ Ú ×     Ú Ö×Ó×
× ×Ø Ñ × ÓÔ Ö Ø ÚÓ׸    ××       ØÓ׸ Ý Ú Ö × ÔÐ ÓÒ ×º
    Ä Ö Ð ¼¹¾¼ ÒÓ × ÙÒ × ÑÔÐ Ö ÞÓÒ ÒÙÑ Ö Ó ÔÖÓÔÓÖ ÓÒº Ë ØÖ Ø Ð Ú Ð Ó× × ÑÓ
 ÓÒÓ Ñ ÒØÓ ÕÙ Ö ÔÖ × ÒØ Ð × Ö ÕÙ Ð ¬ Ò                ÙÒ ÔÖÓ Ö Ñ ×Ø Ø ÖÑ Ò
ÔÓÖ ÙÒ Ô ÖØ ÓÖÖ ×ÔÓÒ ÒØ Ð ¾¼±º ÈÓÖ Ø ÒØÓ¸ Ù Ò Ó × × Ñ ÓÖ Ö ÙÒ ÔÖÓ Ö Ñ
Ó× ¸       ÖÐÓ Ñ × ¬ ÒØ ¸      ÑÓ×     ÖÐÓ ×Ó Ö ÕÙ Ð ¾¼± Ý ÒÓ Ô Ö ÖÒÓ× Ò Ñ ÓÖ Ö¸
 ÙØ ÐÑ ÒØ ¸ Ð Ö ×Ø ÒØ ¼±º

3.5.2   ¿Cu´ndo atacar la eficiencia?
           a
ÄÓ ÒØ Ö ÓÖ Ö Ù ÖÞ Ð ¬ÖÑ ÓÒ ÕÙ Ð ¬             ÔÖ Ñ Ð ¬ Ò ¸ ÔÙ × ×Ø ÕÙ ÒÓ
ÐÓ Ö ÑÓ× Ð ØÓ¸ ÒÓ ÔÓ ÑÓ× ÒØ ¬ Ö × ¾¼± Ð ÔÖÓ Ö Ñ ×Ó Ö Ð Ù Ð                Ö ÑÓ×
     ÓÒ ÒØÖ ÖÒÓ× × × × ÑÓ× Ñ ÓÖ Ö Ð ¬ Ò º Å × ÙÒ¸ × Ð ÓÖ ÑÓ× ÔÖÓ Ö Ñ ×
 ¬ × ÕÙ × Ø × Ò Ð × ÜÔ Ø Ø Ú ×¸ Ú Ð Ð Ô Ò Ñ ÓÖ Ö ×Ù ¬ Ò È Ö Ö ×ÔÓÒ Ö
 ×ØÓ      ÑÓ× Ñ ÓÖ ÔÖ ÙÒØ ÖÒÓ× × Ø Ò ÑÓ× ÙÒ ÔÖÓ Ö Ñ ¬ Þ ´ ÓÖÖ ØÓµ¸ Ù Ò Ó ×
ÕÙ Ý ÕÙ Ø Ö Ð ¬ Ò                À Ý Ú Ö × ÓÒ ÓÒ ×¸ × Ò Ó Ð × Ñ × ÓÑÙÒ × Ð ×
× Ù ÒØ ×
    ¯ Ð ÔÖÓ Ö Ñ Ö ×ÙÐØ ÒØ ÒÓ    ÓÑ Ø Ð ×ÓÐÙ ÓÒ Ò ÙÒ ÙÖ ÓÒ ÔØ Ð Ô Ö ×Ù
       ÔÐ ÓÒ × Ò ÑÓ× ÙÒ ÔÖÓ Ö Ñ ¸ ÐÓ Ó ¬ ÑÓ׸ ÓÑÔÖÓ ÑÓ× ÕÙ × ÓÖÖ ØÓ¸
      Ô ÖÓ Ù Ò Ó ÐÓ ÙØ ÑÓ× ÒÓ× Ô Ö Ø ÑÓ× ÕÙ ×Ù ÙÖ ÓÒ              Ù ÓÒ ÒÓ ÙÑÔÐ
      Ð × ÜÔ Ø Ø Ú ×º
    ¯    Ñ Ó Ò Ð × ÓÒ ÓÒ × Ñ ÒØ Ð × Ù×Ó Ð ÔÖÓ Ö Ñ Ø Ò ÑÓ× ÙÒ ÔÖÓ Ö Ñ
       ÓÖÖ ØÓ ÕÙ ÙÑÔÐ Ð × ÜÔ Ø Ø Ú ×º ÍÒ          ÓÒØ ÙÒ Ñ Ó¸ ÔÓÖ ÑÔÐÓ¸ ×
       ÙÑ ÒØ Ð × Ð        ÒØÖ Ý Ð ÔÖÓ Ö Ñ            × Ö ¬ ÒØ º
    ¯ Í×Ó   Ð ÔÖÓ Ö Ñ ÓÑÓ ÙÒ ÓÑÔÓÒ ÒØ         ÓØÖÓ ÔÖÓ Ö Ñ Ó × ×Ø Ñ Ø Ò ÑÓ× ÙÒ
      ÔÖÓ Ö Ñ ÓÖÖ ØÓ Ý ¬ ÒØ Ý × ÒÓ× ÔÐ ÒØ Ö Ù× ÖÐÓ ÓÑÓ Ô ÖØ ÓØÖÓ ÔÖÓ Ö Ñ º
      Ë Ò Ñ Ö Ó¸ Ð ÓÑÔÓÒ ÒØ Ò Ù ×Ø ÓÒ ÒÓ Ø Ò Ð ×Ù¬ ÒØ ¬ Ò Ô Ö × ÙÖ Ö
      Ð ¬ Ò ÐÓ Ð Ð ÔÖÓ Ö Ñ º
Ë ÙÒ ÔÖÓ Ö Ñ        Ó Ò      Ò Ð ÙÒ      ר × ÓÒ ÓÒ ×¸ ÒØÓÒ × ÔÙ          Ú Ö Ö×
Ð Ò ×               ÖÐÓ Ñ × ¬ ÒØ º Ë ¸ Ð ÓÒØÖ Ö Ó¸ Ð ÔÖÓ Ö Ñ × Ø × ØÓ × Ð ×
 ÜÔ Ø Ø Ú ×¸ ÒØÓÒ × × ÔÖ Ö Ð Ú Ø Ö Ð           ØÓ Ð × ÙÒ Ó × ×Ø Ñ       ¸ Р٠и
Ô Ö Ö × Ò Ó ÖÓÓ × ººº × Ø ÑÓר Ò ÖÓÙ× ×Ýר Ñ Ñ Ò Ú Ö × Ò× ¾ º
3.5.3   Maneras de mejorar la eficiencia
ÍÒ Ú Þ Ú Ö Ó ÕÙ Ö ÕÙ Ö ÑÓ×             Ö Ñ × ¬ ÒØ ÙÒ ÔÖÓ Ö Ñ ¸ Ø Ò ÑÓ× Ú Ö × ÐØ Ö¹
Ò Ø Ú ×¸ ÓÑ Ò Ð × ÒØÖ × ¸ Ô Ö Ñ        ÓÖ Ö Ð ¬ Ò    ÒØÖ Ð × Ñ × Ù×Ù Ð × Ø Ò ÑÓ×
  ½º Á ÒØ ¬ ÓÒ Ý Ñ ÓÖ Ñ ÒØÓ            Ð ¾¼± Ù ÒØ            Ð Ö Ð      È Ö ØÓ¸ ×Ó
      Ø Ò ÑÙ Ó × ÒØ Ó¸ ÔÙ × ÐÐÓ        Ò ¬ Ö Ð ¼± Ð ÔÖÓ Ö Ñ º
  ¾º Ñ Ó Ð ÓÖ ØÑÓ Ú ×¸ ×Ó              Ö ØÓ Ó    Ó Ð × Ð Ð ÒØÖ ¸ × Ð ÔÖÓÔ Ó
       Ð ÓÖ ØÑÓ Ð Ù ÒØ   Ò¬ Ò           º Ò ×Ø ×Ó ÔÙ       Ú Ö Ö× Ò × Ö Ó × Ò Ö
 ¾
      × Ð Ñ × Ô Ð ÖÓ×Ó × ×Ø Ñ ÕÙ Ð Ù Ò ÔÙ   ×ÒÖº
3.5. Eficacia y eficiencia                                                       229



    ÙÒ Ð ÓÖ ØÑÓ Ñ × ¬ ÒØ ÓÑÔÙØ ÓÒ ÐÑ ÒØ º ÈÓÖ ÑÔÐÓ¸ Ø Ð Ú Þ ÙÒ ÔÖÓ ×Ó
      Ö Ø Ó ÙÒ × ×Ø Ñ Ù× Ð ÙÒ Ñ ØÓ Ó × Ò ÐÐÓ ÓÖ Ò Ñ ÒØÓ ÙÝ ÓÑÔÐ
      × O(n2) Ò ×Ø ×Ó¸ Ð Ñ ØÓ Ó ÔÓ Ö ×Ù ×Ø ØÙ Ö× ÔÓÖ Ð ÙÒÓ O(n Ð n)¸ Ð Ù Ð
      × ÓÒ× Ö Ð Ñ ÒØ Ñ × ¬ ÒØ º
 ¿º Ñ Ó Ò Ð Ø ØÙ ÔÖÓ Ö Ñ ÓÒ ÓØÖ ÔÓ× Ð                       Ò ¬ Ò ÔÙ             Ö×
       ÙÒ Ø ØÙ ÔÓÖ Ô ÖØ ÐÓ× ÔÖÓ Ö Ñ ÓÖ × ÕÙ ÒØÖÓ ÙÞ Ò ¬ Ò º Ñ ÒÙ Ó¸
      ×ØÓ Ó ÙÖÖ ÒØÖ ÔÖÓ Ö Ñ ÓÖ × ÒÓÚ Ð ×º
    ÍÒ ÑÔÐÓ ÒÓØ Ð Ý Ö Ð ÐÓ ÓÒר ØÙÝ Ð Ô ×              Ô Ö Ñ ØÖÓ× ÔÓÖ Ú ÐÓÖ Ò C++º
       Ò ØÓ¸ Ò ×Ø Ð Ò Ù ¸ × ÒÓ × Ø Ò Ð Ù Ó                 Ù Ó¸ Ð Óר Ð Ô ×
    Ô Ö Ñ ØÖÓ× ÔÓÖ Ú ÐÓÖ ÔÙ × Ö ÐØ × ÑÓ¸ ÔÙ ×        ÒÚÓ ÓÒ ÙÒ ÓÒ Ö ÕÙ Ö ÙÒ
      ÓÔ           Ó ØÓ Ô Ö Ñ ØÖÓ¸ Р٠и × ÙÒ Ð Ò ÓÐ Ð Ó ØÓ¸ ÔÙ           ÓÒ×ÙÑ Ö
        ר ÒØ Ø ÑÔÓº
  º Ñ Ó Ñ ÒØ Ð Ö                   ÙÒÓ× ¾¼ ÒÓ׸ Ù Ò Ó ÙÒ ÔÖÓ Ö Ñ ÓÖ ÕÙ Ö ÐÓ Ö Ö
      Ð ÙÒÓ× ØÓ× Ú ×Ù Ð × ×Ô Ð ×¸ ÙÑ ÒØ            ÜÔÐ Ø Ñ ÒØ Ð Ú ÐÓ           Ö ÐÓ
    Ý Ù× ÙÒ ÓÐ×              ÐÓ ×Ó Ö Ð ÔÖÓ × ÓÖ Ô Ö Ø ÒÙ Ö Ð ÐÓÖ ÔÖÓ Ù Óº
       ÕÙ ÐÐ Ð Ñ Ø Ý Ñ Ö Ø Ò Ô ÖÑ Ø ÔÖ Ö ÕÙ ÔÖÓ × ÓÖ × Ñ × Ú ÐÓ ×
    ¹Ó ÔØ ÓÒ × × ×¹ Ö Ò ×ÓÐÙ ÓÒ Ð ÔÖÓ Ð Ñ º
    ÍÒ ÔÖÓ Ð Ñ         ¬ Ò ÔÙ          Ø Ö×       Ù ÖÞ ÖÙØ ÙÑ ÒØ Ò Ó Ð ÔÓ Ö
      ÓÑÔÙØ ÓÒ Ðº Ô ÖØ          Ñ Ó× × Ó׸ Ð ×Ø ÐÓ × Ö ØÓ Ò Ð Ô ÖÖ Ó ÒØ Ö ÓÖ¸
        Ý Ú Ö Ó× Ñ × ÐÓ Ð ×º Ò ÔÖ Ñ Ö ÐÙ Ö¸ ÔÙ ×Ù ×Ø ØÙ Ö× Ð ÓÑÔ Ð ÓÖ ÔÓÖ ÙÒÓ
    ÕÙ        ØÙ ÓÔØ Ñ Þ ÓÒ × Ö × Ú × ×Ô Ð ×º Ò × ÙÒ Ó ÐÙ Ö¸ ÔÙ             ÕÙ Ö Ö×
        Ö Û Ö ×Ô Ð Þ Ó Ó¸ × ÑÔÐ Ñ ÒØ ¸ Ñ × ÔÓØ ÒØ Ú ÐÓ             ÔÖÓ × ÓÖ¸ Ò¹
    Ø           Ñ ÑÓÖ ¸ ÒØ            × Ó¸ Ø ÒÓÐÓ        ÐÑ Ò Ñ ÒØÓ¸ ÒÙÑ ÖÓ
    ÔÖÓ × ÓÖ ×¸ Ø Ø Ö º
ר ׸ ÖÓ××Ó ÑÓ Ó¸ Ð Ð × ¬ ÓÒ Ð × Ñ Ò Ö × Ó Ø Ú × Ò ÕÙ × ÔÙ Ñ ÓÖ Ö Ð
¬ Ò º ÄÓ Ñ ×¸ Ý ÐÓ ÕÙ Ú Ò Ö ¸ × Ò ÓÐ ×Ù Ø Ú Ý Ô ÖØ Ð ÓÖÔÙ× ×ØÙ Ó
  ר Ø ÜØÓº
3.5.4   Perfilaje (profiling)
    Ó ÙÒ ÔÖÓ Ö Ñ Ð Ù Ð × × ×ØÙ Ö ×Ù ¬ Ò ¸ Ù Ð × ×ÓÒ Ð × Ô ÖØ × Ð
ÔÖÓ Ö Ñ ÕÙ Ö ÔÖ × ÒØ Ò ÕÙ Ð ¾¼± Ö Ø Ó Ô ÖØ Ð ÓÒÓ Ñ ÒØÓ Ð ÔÖÓ Ö Ñ ÓÖ¸
 Ò Ð Ø ÖÑ Ò ÓÒ ×Ø Ö ×ÔÙ ×Ø ¸ ÔÙ Ù× Ö× ÙÒ Ð × ×Ô Ð ÔÖÓ Ö Ñ ÐÐ Ñ Ó
 Ô Ö¬Ð ÓÖ ´ ÔÖÓ¬Ð Ö µº
       Ñ Ò Ö Ð Ñ ÒØ и ÙÒ ÔÖÓ¬Ð Ö × ÙÒ ÔÖÓ Ö Ñ ÕÙ ¸ Ó¹ × ×Ø Ó ÔÓÖ Ð ÓÑÔ Ð ÓÖ¸
ÑÙ ×ØÖ Ð       Ù ÓÒ ÙÒ ÔÖÓ Ö Ñ Ý Ö         ר ר × ×Ó Ö Ð ÔÓ× ÓÒ          Ù ÓÒ
  Ð ÔÖÓ Ö Ñ º ÈÓÖ ÐÓ Ò Ö Ð¸ ÙÒ ÔÖÓ¬Ð Ö Ó Ö  Ó× Ö ¬ Ó× ÙÒ Ñ ÒØ Ð ×
   ½º Ð Ô Ö¬Ð ÔÐ ÒÓ Ð Ù Ð ÑÙ ×ØÖ Ð ÙÖ ÓÒ ÓÒ×ÙÑ ÔÓÖ           ÖÙØ Ò Ý Ð ÒØ
         Ú × ÕÙ Ù ÒÚÓ º
   ¾º Ð Ö Ó ÐÐ Ñ × Ð Ù Ð ÑÙ ×ØÖ ¸ Ô Ö            ÙÒ ÓÒ¸ Ù Ð × Ù ÖÓÒ Ð × ÙÒ ÓÒ ×
      ÕÙ Ð ÐÐ Ñ ÖÓÒ Ý Ù ÒØ × Ú × ×ØÓ Ó ÙÖÖ Óº
230                                             Cap´
                                                   ıtulo 3. Cr´
                                                              ıtica de algoritmos



Ë Ò Ó ×Ø Ò ÓÕÙ           Ò ÓÐ ×Ø ר ¸ Ð ÔÖ × ÓÒ Ð ÔÖÓ¬Ð Ö Ô Ò         Ð ÙÖ ÓÒ
ØÓØ Ð Ð ÔÖÓ Ö Ñ Ñ ÝÓÖ ÙÖ ÓÒ¸ Ñ ÝÓÖ ÔÖ × ÓÒº Ô × Ö              ר Ø ÔÓ ÑÔÖ ¹
  × ÓÒ¸ ר Ò ÓÕÙ Ø Ò Ð ÒÓÖÑ Ú ÒØ          ÕÙ ÒÓ ÑÔ Ø Ñ × Ó ×Ó Ö Ð ÙÖ ÓÒ
Ô ÖÑ Ø Ò ÓÐ        ÙØ Ö× Ú ÐÓ       × Ö Ò × Ð Ø ÑÔÓ Ö Ðº
      Ð ÔÖ Ò Ô Ð ÜÔÓÒ ÒØ Ð ÔÖÓ¬Ð Ö ×Ø ר Ó × GNU gprofº À Ý Ú Ö Ó× ÖÓÒØ¹ Ò ×
 Ö ¬ Ó× ÕÙ Ú Ö× Ø Ð Þ Ò Ð Ú ×Ù Ð Þ ÓÒ ÐÓ× Ô Ö¬Ð × ÖÖÓ Ó× ÔÓÖ GNU gprof × Ò Ó Ð
Ñ × ÒÓØ Ð        ÐÐÓ× kprofº Valgrind Ø Ñ Ò ÔÓ× ÙÒ Ü Ð ÒØ ÔÖÓ¬Ð Ö ×Ø ר Óº
    ÇØÖÓ Ò ÓÕÙ Ô Ö¬Ð ¸ Ñ × Ø ÖÑ Ò ×Ø ¸ ÓÒ× ×Ø Ò ÓÐÓ Ö ÓÒØ ÓÖ × Ö ØÓ× Ò
      ÖÙØ Ò Ý Ñ ÓÖ × Ø ÑÔÓº Ð Ò ÓÕÙ × ÑÙ Ó Ñ × ÔÖ ×Ó ÕÙ Ð ×Ø ר Ó
Ô ÖÓ Ø Ò Ð ÔÖÓ Ð Ñ         ÕÙ ×¹ Ð Ö Ù ÖØ Ñ ÒØ Ð Ø ÑÔÓ           Ù ÓÒ     Ò ÓÐÓ
 Ò ÔÐ Ð Ô Ö ÔÖÓ Ö Ñ × ÓÒ Ö ÕÙ Ö Ñ ÒØÓ× Ø ÑÔÓ Ö Ðº ÍÒ ÔÖÓØÓØ ÔÓ Ð Ö          ר
 Ð × ÔÖÓ¬Ð Ö × FunctionCheck ¾ º
3.5.5   Localidad de referencia
ÈÓÖ ÐÓ Ò Ö Ð¸ Ð ×Ó ÐÓ× ØÓ× ÔÓÖ Ô ÖØ ÙÒ ÔÖÓ Ö Ñ Ü ÙÒ Ô ØÖÓÒ Ö Ô Ø Ø ÚÓ
   ÒÓÑ Ò Ó ÐÓ Ð           Ö Ö Ò º Ù Ò Ó×               ÙÒ ØÓ¸ Ü ×Ø ÙÒ ÐØ ÔÖÓ ¹
  Ð         ÕÙ ×Ø ×            Ó ÒÙ ÚÓ Ò ÙÒ Ø ÑÔÓ ÔÖÓÜ ÑÓº ר Ø ÔÓ ÐÓ Ð
    Ö Ö Ò × Ð Ð¬                Ø ÑÔÓÖ Ð º ÍÒ ÑÙÝ × ÑÔÐ ÑÔÐÓ × Ð Òר Ò ÓÒ
ÙÒ Ú Ö Ð ¸ Р٠и ×Ó Ö ØÓ Ó × × × Ù Ò Ù Ò × ÓרÙÑ Ö × ÔÖÓ Ö Ñ ÓÒ¸                  Ö
       Ö× Ô Ö Ð ØÙÖ Ó × Ö ØÙÖ Ò ÙÒ Ø ÑÔÓ ÑÙÝ ÔÖÓÜ ÑÓº
    ÇØÖÓ Ô ØÖÓÒ ÓÒ× ×Ø Ò            Ö ÙÒ ØÓ Ö ÒÓ Ò Ñ ÑÓÖ            ÓØÖÓ Ö ÒØ Ñ ÒØ
        Óº      ר Ð ×      ÐÓ Ð         Ö Ö Ò × Ð Ð¬              ×Ô Ð Ý¸ ÙÒ Ù Ò
    ÑÔÐÓ¸ ÐÓ ÓÒר ØÙÝ Ð ×Ó Ú ØÓÖ × Ý Ñ ØÖ ׺
    Ä ÐÓ Ð           Ö Ö Ò ¸ ÙÒ Ó Ð ÓÒÓ Ñ ÒØÓ Ð Ö Ð Ð ¼¹¾¼¸ ÒØÙÝ ÙÒ
Ñ Ò ×ÑÓ ÑÙÝ ÙØ Ð Þ Ó Ô Ö Ñ ÓÖ Ö Ð Ö Ò Ñ ÒØÓ ÒÓÑ Ò Ó                     ¸Ú Ö Ó Ö Ò ×
ÕÙ × Ò ¬         × ÓÒ Ö Ý ÕÙ Ð ÓÖ Þ Ð ØÖ Ò×Ô Ö Ò         Ð Ñ Ò ×ÑÓº ÍÒ           × ÙÒ
 ÓÒ ÙÒØÓ ×ØÖ ØÓ¸ ¬Ò ØÓ¸ ×Ùר ÒØ Ó Ò ÙÒ ×ØÖÙ ØÙÖ              ØÓ׸ ÕÙ × ÒØ ÔÓÒ ÙÒ
 ÓÒ ÙÒØÓ        ØÓ× ÑÙ Ó Ñ ÝÓÖ Ý ÙÝÓ ×Ó × ÒÓØ Ð Ñ ÒØ Ñ × Ö Ô Ó ÕÙ Ð ÓÒ ÙÒØÓ
      ØÓ׺ Ù Ò Ó ×            ÔÓÖ Ú Þ ÔÖ Ñ Ö ÙÒ Ð Ñ ÒØÓ Ð ÓÒ ÙÒØÓ¸ ר × Ù Ö
 Ò Ð         º ÄÓ× × Ù ÒØ ×      ×Ó× × Ö Ð Þ Ò ×Ó Ö Ð      ¸ ÕÙ × ÑÙ Ó Ñ × Ö Ô Óº
ÈÙ ×ØÓ ÕÙ Ð            × ¬Ò ØÓ¸ ÔÓ× Ð Ñ ÒØ ר Ú Ò ÐÐ ÒÓº Ò ×Ø ×Ó¸ ×
× Ð ÓÒ Ö ÙÒ ÒØÖ            Ð        Ô Ö Ð Ñ Ò Ö Ñ Ò Ö ÕÙ ÔÙ ×Ù ×Ø ØÙ Ö× ÔÓÖ Ð
ÒÙ Ú º ÈÓÖ ÐÓ Ò Ö Ð¸ × Ð Ñ Ò Ð ÒØÖ ÕÙ Ø Ò Ñ × Ø ÑÔÓ × Ò Ù× Ö× º
           × ×ÓÒ Ø Ô Ñ ÒØ Ù× Ó× Ò Ð × ÔÐ Ø ÓÖÑ ×       Ö Û Ö Ô Ö Ô Ð ÖÐ        ÖÒ
      × ÑÔ ÒÓ ÕÙ Ü ×Ø ÒØÖ Ð ÈÍ Ý Ð Ñ ÑÓÖ º ÈÓÖ Ð Ñ ×Ñ Ö ÞÓÒ ÐÓ× × ×Ø Ñ ×
ÓÔ Ö Ø ÚÓ× ÐÓ× Ù× Ò Ô Ö Ô Ð Ö Ð × × ÒØÖ Ð Ñ ÑÓÖ Ý Ð × Óº Ò Ñ × × ØÙ ÓÒ ×¸
×Ù Ð Ù Ö Ö× Ò Ð             ¸ ÒÓ ×ÓÐÓ Ð ØÓ Ö Ò         Ó¸ Ð Ù Ð Ù Ö Ð ÐÓ Ð
Ö Ö Ò Ø ÑÔÓÖ Ð¸ × ÒÓ¸ Ø Ñ Ò¸ ÐÓ× ØÓ× Ý ÒØ ׸ Ñ Ò Ö ÕÙ Ø Ñ Ò × Ù Ö
Ð ÐÓ Ð         ×Ô Ðº
     Ò Ü º¿º¿ ´Ô Ò         µ ×ØÙ Ö ÑÓ× ÙÒ Ò ÓÕÙ Ò Ö Ð                Ô Ö Ù× Ö× ×Ó Ö
 ÓÒ ÙÒØÓ× Ò Ñ ÑÓÖ º

3.5.6   Tiempo de desarrollo
ÄÓ× Ñ ÒØ × ÐÓ× Ö Ò Ó×Ó× Ý ÑÓ ÖÒÓ× Ð Ò Ù ×         × Ö ÔØ Ò Ø Ð × ÓÑÓ Perl¸
Python Ý Ruby¸ ÐÓ× Ù Ð × Ð Ø Ò ÑÙ × ÑÓ Ð × ÖÖÓÐÐÓ Ö Ô Ó ÔÖÓØÓØ ÔÓ× Ý ÔÐ ¹
3.6. Notas bibliogr´ficas
                   a                                                        231



    ÓÒ ×¸ Ø Ò Ò Ð × Ù ÒØ ÔÖÓÚ Ö Ó Ð Ø ÑÔÓ ÙÑ ÒÓ × Ñ × ÑÔÓÖØ ÒØ ÕÙ Ð
Ø ÑÔÓ         ÈÍ ¾ º ÓÒ ×ØÓ ÜÔÖ × Ò ÙÒ Ð Ñ ÒØÓ ¬         Ý ¬ Ò ÕÙ Ñ ÒÙ Ó
 × × Ù Ó ¸ Ò ÐÙ× Ú ¸ ÓÑÔÐ Ø Ñ ÒØ ×ÔÖ Ó Ð Ø ÑÔÓ                      × ÖÖÓÐÐÓ ÙÒ
ÔÖÓ Ö Ñ º
    ÅÓ ÐÓ× Ý ÔÖÓØÓØ ÔÓ× ×ÓÒ ÙÒ Ñ ÒØ Ð × Ò Ò Ò Ö ¸ Ô ÖÓ ÔÓÖ ÙÒ ÜØÖ Ò Ö ÞÓÒ
ÔÓ Ó× Ò Ò ÖÓ× ×Ó ØÛ Ö ×Ù Ð Ò Ù× ÖÐÓ× Ù Ò Ó × Ò Ù ÒØÖ Ò ÒØ × ÒÓ× ×Ó ØÛ Ö
ÒÓÚ Ó×Ó Ó ÕÙ ÒÓ Ø Ò Ò ÜÔ Ö Ò Ò Ö Ð Þ ÖÐÓº Ò ØÓ Ó ×Ó¸ Ô Ö            ×ÙÖ Ó Ð ÓÖ Ö
ÔÖÓ Ö Ñ × ÙÝÓ Ø ÑÔÓ         × ÖÖÓÐÐÓ × ÑÙ Ó Ñ ÝÓÖ ÕÙ Ð Ú        Ð ÔÖÓ Ö Ñ Ò ¹
 Ù ÓÒ Ó¸ Ò ÐÙ× Ú ¸ ÐÓ Ù Ð × Ô Ø Ø Ñ ÒØ Ñ × ÓÑÙÒ¸ ÕÙ ÒÓ × Ò ¬ ÒØ × Ó¸ ÑÙ Ó
Ô ÓÖ¸ Ò ¬ ׺
    Ë ÙÒ Ð × ÓÒ× Ö ÓÒ × ÒØ Ö ÓÖ ×¸ ÓÒ ÐÙÝ ÑÓ× ÓÒ Ð × × Ù ÒØ × Ö ÓÑ Ò ÓÒ ×
Ø Ò ÒØ ×        Ð Ö Ö Ð Ø ÑÔÓ       × ÖÖÓÐÐÓ
   ½º ÈÖ Ñ Ð × ÑÔÐ              × ÒÓ ÔÓÖ Ð × ÑÔ ÒÓ¸ Ô٠׸ ÓÑÓ Ö Ø Ö Ñ ÒØ ÐÓ
         ÑÓ× × Ò Ð Ó¸ Ð ¬       ÔÖ Ñ Ð ¬ Ò º ÈÓÖ Ø ÒØÓ¸ Ô Ò× Ò ÓÔØ Ñ Þ ÓÒ
      ×ÓÐÓ × ×      × ÙÖ Ó Ð ¬Ò Ý × Ö ÕÙ Ö Ñ × ¬ Ò º
   ¾º ÁÒÚ ÖØ ØÓ Ó Ð Ø ÑÔÓ Ò × Ö Ó Ò Ö ÒØ Þ Ö ÓÖÖ Ø ØÙ         ÐÓ× × ÒÓ× ÒØ ×
      ÔÖÓ Ö Ð Ó ¬ ÓÒº
        Ò Ú ÖØÙ      ר Ö ÓÑ Ò ÓÒ¸ Ù× ÑÓ ÐÓ× Ý Ú Ö ÕÙ ÐÓ× Ü Ùר Ú Ñ ÒØ º Ë
       Ü ×Ø Ò ×Ô ¬ ÓÒ × ¬ Ò ¸ ÒØÓÒ × Ú Ö ÕÙ Ð × Ò ÐÓ× ÑÓ ÐÓ׺
       ÈÖÓØÓØ Ô Ö Ô Ñ ÒØ ÔÖÓØÓØ ÔÓ× ÐÓ× ÑÓ ÐÓ× Ý Ú Ö ¬ Ó× Ý ÓÒÚ Ð ÐÓ× ÓÒ
      Ð × ÓÒ ÓÒ × ×Ô Ö ×              Ù ÓÒº Ò ×Ø × ÒØ Ó¸ × Ô Ö Ø Ñ ÒØ ÔÐ Ù× Ð
      Ù× Ö Ð Ò Ù × ÕÙ Ô ÖÑ Ø Ò × ÖÖÓÐÐ Ö Ø Ú Ñ ÒØ ÔÖÓØÓØ ÔÓ× ¸ Ò ÐÙ× Ú ¸ × Ð
       ¬ Ò × × Ø × ØÓÖ ¸ × Ö Ð × ÖÖÓÐÐÓ ¬Ò Ø ÚÓ Ò Ð Ð Ò Ù            ÔÖÓØÓØ Ô Óº

3.6     Notas bibliogr´ficas
                      a
  Ð ÓÖ Ò Ñ ÒØÓ¸ ÓÑÓ Ó Ö Ö Ð ÓÑ Ö ¸ × Ò Ù ÒØÖ Ò ØÓ ÙÐØÙÖ Ý ÔÓ ÙÑ Ò º
ÈÙ Ö        Ö× ÕÙ Ð Ñ ØÓ Ó × Ð ÓÒ ×          ÙØÓÖ ÙÑ Ò ¸ ÔÙ × ÒÓ × Ò Ù ÒØÖ
 Ð ÒÓÑ Ö       Ð ÙÒ Ò Ú ÙÓ ÕÙ × ØÖ ÙÝ Ô Ö × Ñ ×ÑÓ ×Ù ÙØÓÖ º
     ÄÓ× ×ØÓÖ ÓÖ ×       Ð ÓÑÔÙØ ÓÒ ØÖ ÙÝ Ò Ð ÓÖ Ò Ñ ÒØÓ ÔÓÖ Ñ Þ Ð
ÂÓ Ò ÚÓÒ Æ ÙÑ ÒÒ ÙÒ        Ð × Ñ ÒØ × Ñ × Ò Ð × Ð × ÐÓ º Ð Ñ ØÓ Ó           Ò¹
× Ö ÓÒ × Ð ØÖ ÙÝ ÃÓÒÖ Ù× ¸ ÕÙ Ò Ø Ñ Ò × Ð ØÖ ÙÝ Ð × Ù Ö Ñ ÒØÓ Ð
 ÓÑÔÙØ ÓÖ Ø Ð¾ º
      Ð ÕÙ ×ÓÖØ Ù × Ù ÖØÓ ÔÓÖ ÖÐ × ÒØ ÓÒÝ Ê Ö ÀÓ Ö Ò ½ ½ º ×
 ÒØÓÒ × ×Ø Ð ÔÖ × ÒØ ¸ Ð Ñ ØÓ Ó × Ó ÒØ Ò× Ú Ñ ÒØ ×ØÙ Óº ÃÒÙØ ½ Ó Ö
ÙÒ ÑÙÝ Ø ÐÐ Ó ×ØÙ Ó × ÓÑÓ ÙÒ Ü Ð ÒØ Ö Ù ÒØÓ ×ØÓÖ Ó Ð ÕÙ ×ÓÖØ Ý Ñ ×
Ñ ØÓ Ó× ÓÖ Ò Ñ ÒØÓº
     ÊÓ ÖØ Ë Û ¸ Ó Ð ØÙØÓÖ           ÃÒÙØ ¸ ÓÒ× ÖÓ ×Ù Ø × × Ó ØÓÖ Ð Ð ×ØÙ Ó Ð
ÕÙ ×ÓÖØº ÓÑÓ Ø Ð¸ Ë Û ¿ × ÙÒ Ü Ð ÒØ Ö Ö Ò Ô Ö Ð Ò Ð × × Ð Ñ ØÓ Ó
Ý ×Ù× Ú Ö ÒØ × ÔÐ Ø Ú ×º
     Ä ÒÓØ ÓÒ O¸ ÙÒ Ñ ÒØÓ × Ò Ð Ð Ò Ð × × Ð ÓÖ ØÑÓ׸ Ù ÓÖ Ò ÐÑ ÒØ ÓÒ¹
        ÔÓÖ Ð Ñ Ø Ñ Ø Ó Ð Ñ Ò È ÙÐ     Ñ ÒÒ Ò ½ ¿ º
 ¾
    × Ù Ó ÔÓÖ ÔÖ Ñ Ö Ú Þ ÔÓÖ ×Ø Ö ØÓÖ Ð Ô Ð Ö     Ö Ò × Ó È ÐѺ
 ¾
    Ù× ÓÒ Ó ×Ù ÓÑÔÙØ ÓÖ Ò Ð ÔÓ        Ð Ð Ñ Ò Ò Þ º ÉÙ Þ ÔÓÖ ÐÐÓ¸ Ð ÒÓ   × Ó ÑÙÝ
Ñ Ò ÓÒ Ó ÔÓÖ Ð ×ØÓÖ º
232                                             Cap´
                                                   ıtulo 3. Cr´
                                                              ıtica de algoritmos



     Ë ÙÒ Ì Ö Ò ¿ ¸ Ð Ò Ð × × ÑÓÖØ Þ Ó Ù × ÖÖÓÐÐ Ó ÔÓÖ Åº ʺ ÖÓÛÒ¸
ÊÓ ÖØ º Ì Ö Ò¸ ˺ ÀÙ Ð ×ØÓÒ Ý Ãº Å Ð ÓÖÒ ¿ º Ò ×Ù ÖØ ÙÐÓ¸ Ì Ö Ò ØÖ ÙÝ Ð
   × Ù Ö Ñ ÒØÓ Ð Ñ ØÓ Ó ÔÓØ Ò Ð         Ò Ð º ËÐ ØÓÖ Ñ ÒØÖ × ÕÙ Ð Ð ¬ Ø ÚÓ ÑÓÖ¹
Ø Þ Ó × Ð ØÖ ÙÝ Ì Ö Ò Ý ËÐ ØÓÖ ¿ º
     Ä          Ú Ö ¬ ÓÒ        ÓÖÖ Ø ØÙ ×      Ò ÒÚ Ö ÒØ × × Ó ÔÓÔÙÐ Ö × Ð
Ñ ×ÑÓ Ò Ó Ð ÔÖÓ Ö Ñ ÓÒº Ë Ò Ñ Ö Ó¸ Ð Ö ×Ô ØÓ Ú Ð Ð Ô Ò ×Ø Ö Ð ØÖ Ó
        Ú ÊÓ× Ò ÐÙÑ ¿¿¸ ¿¾ º
     Ä ×Ô ¬ ÓÒ Ý Ú Ö ¬ ÓÒ ÙØÓÑ Ø                ÔÖÓ Ö Ñ × Ù Ò        ¬Ò Ð × ÐÓ×
 ÒÓ× ¼ Ô ÖÓ ÒÓ Ù ×Ø ¬Ò Ð Ð                     Ð ¼ ÕÙ × ØÙÚÓ Ð ÖÓ¸ ÓÒ ÐÓ× ØÖ Ó×
        ¬ÖÓÔÙÐÓ Ø Ð ¸ ÕÙ Ð ÙØÙÖÓ Ð Ú Ö ¬ ÓÒ × ×Ø Ñ × × Ö ÓÖÑ Ð Ý
 ÙØÓÑ Ø Ñ ÒØ º
     Ë Ùר      Ú Ò ÙÒ ÔÖÓ Ö Ñ ÓÖ¸ ÒØÓÒ ×¸ ÕÙ Þ ¸ Ð ÙÒ        ÑÔÖ Ò Ö Ð Ö ÓÒ
    ÙÒ Ó Ö ÓÑÔÐ Ò ÙÒ × ×Ø Ñ ÓÑÔÙØ ÓÒ Ð ÕÙ Ö ÕÙ Ö Ð Ô ÖØ Ô ÓÒ ÑÙ Ó×
ÔÖÓ Ö Ñ ÓÖ ×º Ò × ÒØÓÒ ×¸ Ö ÕÙ Ö Ö ÓÑ Ò Ö Ð × Ù Ò × ÓרÙÑ Ö × Ý ÒÓÖÑ Ð Þ ÖÐ ×
 ÒØÖ ÐÓ× ÔÖÓ Ö Ñ ÓÖ ×º Ò × ÑÓÑ ÒØÓ           Ö ÓÒÓ Ö ÑÙÝ Ò Ö          Ð ÁÒ Ò Ö
   Ð ËÓ ØÛ Ö º Ò Ð ÒØ Ö Ò¸ ÔÖ Ñ ÖÓ ÓÑ Ò Ð × Ö ÔÖÓ Ö Ñ ÓÖ Ý ÓÑ Ò ÔÓÖ Ð Ö Ð
ÔÖ Ñ Ö Ð ÖÓ¸ Ò Ø ÑÔÓ Ý Ò Ü Ð Ò ¸ ÁÒ Ò Ö Ð ËÓ ØÛ Ö Ì ÅÝØ Ð Å Ò¹
ÅÓÒØ ×× Ý× ÓÒ ËÓ ØÛ Ö Ò Ò Ö Ò                  Ö Ö Èº ÖÓÓ × º
       Ð ÑÔÓ ×Ó Ö × ÔÐ Ò Ý Ù Ò × ÓרÙÑ Ö × ÔÖÓ Ö Ñ ÓÒ Ø Ò ÒØ × ÔÖÓ Ù Ö
ÔÖÓ Ö Ñ × ÓÖÖ ØÓ× × ÑÙÝ Ú ×ØÓº ÆÓ ݸ Ô٠׸ ×Ù¬ ÒØ ×Ô Ó Ò ×Ø Ø ÜØÓ Ô Ö
  × ÖÒ Ö Ð Ö ×Ô ØÓº Ë Ò Ñ Ö Ó¸ ÒØ Ð ÔÓ× Ð               Ö Ñ ÒØ ÓÒ Ð Ð ØÓÖ ÒØ
Ð ÜØ Ò× Ú Ö              Ù ÒØ ׸ × × Ò Ð Ö ×ÔÓÒ× Ð      Ò ×Ø ×Ù ¹× ÓÒ Ñ Ò ÓÒ Ö
 ÜÔÐ Ø Ñ ÒØ ÐÓ× ÔÖ Ò Ô Ð × Ø ÜØÓ× Ö Ö Ò
    ½º ÏÖ Ø Ò ËÓÐ Ó ¾½ ËØ Ú Å Ù Ö Ú Ö× ×Ó Ö ÓÑÓ × Ö Ö ÔÖÓ Ö Ñ ×
        ÕÙ ÒÓ ÓÒØ Ò Ò ÖÖÓÖ ×º ÙÒÕÙ Ô Ö Þ ÑÙÝ Ó× Ó¸ Å Ù Ö Ò× Ò ÙÒ × ÔÐ Ò
        ÕÙ Ù ÖÞ Ó ¬ Ö ÔÖÓ Ö Ñ × ÓÖÖ ØÓ׺ È Ö Ö ×ÙÑ Ö¸ Å Ù Ö Ð Ö ÙÒ Ñ ÒÓ
         Ò ØÓÖÒÓ Ð × ØÖ × ÔÖ ÙÒØ × Î Ò Ð º
    ¾º Ì ÈÖ Ø Ó ÈÖÓ Ö ÑÑ Ò ½                   à ÖÒ Ò Ý È × ÙÒ Ð ÖÓ ×Ó Ö Ð ×
         Ù Ò × ÓרÙÑ Ö × ÔÖÓ Ö Ñ ÓÒ¸ × Ö ØÓ ÓÒ ÑÙ          ÙØÓÖ ¸ ÔÙ × ×Ù× ÙØÓÖ ×
        ×ÓÒ ÔÖ Ø ÒØ × ÒÚÓÐÙ Ö Ó× Ò Ü Ð× × Ó Ö × ×Ó ØÛ Ö º
        Ò ÐÑ ÒØ ¸ Ó ÓÑÔÐ Ø ¾¿ ËØ Ú Å ÓÒÒ ÐÐ × ÙÒ ØÖ Ø Ó Ò ÐÓÔ Ó
×Ó Ö Ù Ò × ÓרÙÑ Ö × Ò ÔÖÓ Ö Ñ ÓÒº

3.7   Ejercicios
  ½º ÑÙ ×ØÖ Ð × ¬ÖÑ ÓÒ × Ü ¿º¾ ´Ô Ò ½ µ¸ Ü ¿º¿ ´Ô Ò ½ µ Ý Ü ¿º ´Ô Ò ½ µº
  ¾º ÑÙ ×ØÖ ØÓ × Ð × Ö Ð × Ð Ö × ÒÙÒ         × Ò Ü ¿º½º º½ ´Ô Ò ½ ¾µº
  ¿º Ê ×Ù ÐÚ Ü Ø Ñ ÒØ Ð × × Ù ÒØ × Ö ÙÖÖ Ò ×
      ´µ
                                       1,   n=1
                             T (n) =
                                       3T (n − 1) + 2,   n>2
3.7. Ejercicios                                                                        233



       ´µ
                                1,   n=1
                     T (n) =
                                2T (n/2) + 1,   n ≥ 2, n   ÔÓØ Ò     Ü Ø       2

       ´µ
                  T (n) =
                            1   ×    n=1
                            2T (n/2) + 6n − 1,    n ≥ 2, n   ÔÓØ Ò       Ü Ø       2

       ´µ
                                 T (n) =
                                           1                  ×    n≤1
                                           2T (n/2) + Ð n     ×    n>1

   º ÓÒ× Ö Ð × Ù ÒØ ÙÒ ÓÒ
       unsigned int misterio(unsigned int & n)
       {
         if (n == 0)
           return 0;
         unsigned int suma = 0;
         for (unsigned int i = 1; i <= n; i++)
           suma += 2*i - 1;
         return suma;
       }

     ÉÙ Ö ØÓÖÒ Ð ÙÒ ÓÒ
   º × Ò ÙÒ Ð ÓÖ ØÑÓ Ô ÖØ ÓÒ ØÖ ÔÐ Ø Ð ÓÑÓ Ð ÜÔÐ Ó ÒÜ ¿º¾º¾º ´Ô Ò ½ µº
   º × Ò Ð ÔÖÓ Ñ ÒØÓ × Ö ØÓ Ò Ñ Þ Ð          ÖÖ ÐÓ× ½ ¿     ÑÓ Ó Ø Ð ÕÙ Ð
     ÖÖ ÐÓ × ÙÒ Ö Ó ×ÓÐÓ ÓÒ×ÙÑ Ð Ñ Ø     Ð ×Ô Óº × Ö¸ × Ð ÖÖ ÐÓ ×Ø
     ÒØÖ [l .. r]¸ ÒØÓÒ × Ð Ñ Ò× ÓÒ Ð ÖÖ ÐÓ b       × Ö r−l−1 º
                                                          2


   º  × Ò ÙÒ Ð ÓÖ ØÑÓ Ò Ö Ó¸ ÕÙ × × ÖÚ Ð Ô ØÖÓÒ Ò Ö Ó Iterator¸ ÕÙ ÓÖ Ò
    ÔÓÖ × Ð ÓÒ ÙÒ × Ù Ò º × Ò Ð Ð ÓÖ ØÑÓ ÓÖÑ Ø Ð ÕÙ × ÐÓ Ñ × ¬ ÒØ
    ÔÓ× Ð Ò ÖÖ ÐÓ× Ý Ð ×Ø × Ó Ð Ñ ÒØ ÒÐ Þ ×º
   ºÄ ÑÞÐ         Ó× × Ù Ò × ÓÖ Ò × Ù×      Ò Ð Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓ ÔÓÖ
    Ñ Þ Ð Ö ÕÙ Ö ÓÔ Ö ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ× ÐÓ× ÖÖ ÐÓ× Ñ Þ Ð Ö Ò ÙÒ ÖÖ ÐÓ
     ÙÜ Ð Öº × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ×Ñ ÒÙÝ Ð ×Ô Ó         ÓÒ Ð Ð Ñ Ø º
   º Ò Ð Ð Ø ÑÔÓ          Ù ÓÒ Ð × Ù ÒØ × Ù Ó ÔÖÓ Ö Ñ
       void programa(int l, int r)
       {
         if (l >= r)
           return;

        O(1)

        int m = (l + r) / 2;
234                                                 Cap´
                                                       ıtulo 3. Cr´
                                                                  ıtica de algoritmos



           programa(l, m - 1);
           programa(m + 1, r);
       }

 ½¼º        Ó Ð × Ù ÒØ ÔÖÓ Ö Ñ
       int programa(int l, int r, int A[])
       {
         if (r < l)
           return 0;
         for (int i = l; i < r; i++)
           x = x + A[i];
         int y = 0;
         y += x + programa(l, r - 1, A);
         return y;
       }

       ´ µ Ò Ð Ð Ø ÑÔÓ      Ù ÓÒ
       ´ µ È Ö Ð ÖÖ ÐÓ ½¸¾¸¿¸ ¸ ¸ º ÉÙ Ú ÐÓÖ ÚÙ ÐÚ Ð ÐÐ Ñ                programa(3,
             5, A)

 ½½º È Ö          ÙÒÓ    ÐÓ× × Ù ÒØ × ÔÖÓ Ö Ñ ×¸ Ò Ð      Ð Ø ÑÔÓ      Ù ÓÒ
      ´µ
             void f()
             {
             int i = 0;
             for(int j = i; j > -1; j++);
             }

       ´µ
             void g(int n)
             {
               for (int j = 2n; j <   Ð     n; j /= 2)
                 i++;
             }

       ´µ
             void h(int n)
             {
               for (int x = 1; x < n; x += 2)
                 printf("impar: %d", x);
             }
       ´µ
             void f(int N)
             {
               int n = 1;
               do
                 {
3.7. Ejercicios                                                                    235



                   n *= 2;
                   for (z = 0; z < n; z++)
                     printf("%dn", z);
                 }
               while (n < N);
           }

 ½¾º ÓÒ× Ö ÙÒ ÖÖ ÐÓ ÓÒ n Ö ÒØ × ÒØ ÖÓ× ×ÓÖ Ò Ó× ÓÑÔÖ Ò Ó× ÒØÖ 0
    Ý m, m nº Ë Ö ÕÙ Ö Ø ÖÑ Ò Ö ÙÒ ÒÙÑ ÖÓ ÐØ ÒØ ÒØÖ ÐÓ× ÒØ ÖÓ× ÓÒ ÙÒ
     Óר Ò ×Ô Ó O(1)º ÄÓ ÙÐØ ÑÓ × Ò ¬ ÕÙ ÒÓ × ÔÙ Ò ÙØ Ð Þ Ö ×ØÖÙ ØÙÖ ×
      ØÓ× ÙÜ Ð Ö × ÙÝÓ ×Ô Ó Ö Þ Ò ÙÒ ÓÒ Ð Ø Ñ ÒÓ Ð ÖÖ ÐÓº
    ÈÓÖ ÑÔÐÓ¸ Ô Ö m = 1000 Ý ÙÒ ÖÖ ÐÓ A = [ 0 1 2 3 37 28 36 273 2721 99 327 7 354 6 84]¸
    500 ∈ A × ÙÒ ×ÓÐÙ ÓÒº
        /

       ´ µ ÈÖÓÔÓÒ ÙÒ Ð ÓÖ ØÑÓ      Ù ÖÞ ÖÙØ ÕÙ Ö ×Ù ÐÚ Ð ÔÖÓ Ð Ñ º × Ö¸
                                Ù×ÕÙ Ò Ð ÖÖ ÐÓ ×Ø ÒÓ Ò ÓÒØÖ Ö Ð Ú ÐÓÖ iº
           ∀i ∈ [0..m], 0 ≤ i ≤ m
       ´ µ Ò Ð Ö ÙÖÓ× Ñ ÒØ Ð Ð ÓÖ ØÑÓ ÒØ Ö ÓÖ Ô Ö Ð Ñ ÓÖ¸ Ô ÓÖ Ý ×Ó ÔÖÓÑ Óº
       ´ µ ÈÖÓÔÓÒ ¸ ÜÔÐ ÕÙ Ý × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ö ×Ù ÐÚ Ð ÔÖÓ Ð Ñ Ò O(n Ð m)
           Ô Ö Ð Ô ÓÖ ×Óº
       ´ µ Ó Ð Ü ×Ø Ò      Ð Ð ÓÖ ØÑÓ Ð ÔÖ ÙÒØ ÒØ Ö ÓÖ¸ × ÙØ Ù Ð Ý Ò Ù Ð ×
            Ö ÙÒר Ò × ÙÒ Ð ÓÖ ØÑÓ × Ñ ÓÖ¸ Ð O(n Ð m) Ó Ð × Ò Ó Ò ½¾ º
 ½¿º       Ð ÙÐ Ð Ø ÑÔÓ      Ù ÓÒ Ð Ð ÓÖ ØÑÓ ÑÙÐØ ÔÐ ÓÒ ÔÓÐ ÒÓÑ Ó× × Ö¹
       ÖÓÐÐ Ó Ò Ð ×Ù ¹× ÓÒ ½¼¼º
 ½º      Ð Ñ Ò Ð Ö ÙÖ× ÓÒ ÓÐ Ð Ñ ØÓ Ó quicksort rec()º
 ½º    Ê Ð ÙÒ ×ØÙ Ó ×Ø ר Ó Ö              ÐÓ× Ø Ñ ÒÓ× Ô ÖØ ÓÒ × Ô ÖØ Ö Ð ×
        Ù Ð × Ð ÓÖ Ò Ñ ÒØÓ ÔÓÖ Ò× Ö ÓÒ × Ñ × Ö Ô Ó ÕÙ Ð ÕÙ ×ÓÖØº
 ½º    ÁÑÔÐ ÒØ Ð ÓÖ Ò Ñ ÒØÓ ÔÓÖ × Ð ÓÒ ÓÒ Ð ×Ø × × ÑÔÐ Ñ ÒØ ÒÐ Þ × Ð Ø ÔÓ
       Snode<T>º

 ½º    ÁÑÔÐ ÒØ Ð ÓÖ Ò Ñ ÒØÓ ÔÓÖ Ò× Ö ÓÒ ÓÒ Ð ×Ø × × ÑÔÐ Ñ ÒØ ÒÐ Þ × Ð Ø ÔÓ
       Snode<T>º

 ½º    ÁÑÔÐ ÒØ Ð ÓÖ Ò Ñ ÒØÓ ÔÓÖ Ñ Þ Ð ÓÒ Ð ×Ø × × ÑÔÐ Ñ ÒØ ÒÐ Þ × Ð Ø ÔÓ
       Snode<T>º

 ½º    ÁÑÔÐ ÒØ ÙÒ ÕÙ ×ÓÖØ Ø Ö Ø ÚÓ ÕÙ ÓÖ Ò Ð ×Ø × × ÑÔÐ Ñ ÒØ ÒÐ Þ × Ð Ø ÔÓ
       Snode<T>º

 ¾¼º   ÁÑÔÐ ÒØ Ð ÕÙ ×ÓÖØ ÓÒ Ð ×Ø × × ÑÔÐ Ñ ÒØ ÒÐ Þ × Ð Ø ÔÓ Snode<T>º
 ¾½º     × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ô ÖØ ÓÒ ÙÒ Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ        Ö ÙÐ Ö ÓÒ
       ÒÓ Ó        Ö Ð Ø ÔÓ Snode<T>º Ð ÔÖÓØÓØ ÔÓ × Ð × Ù ÒØ
               Snode<T> * partir(Snode<T> & list, Snode<T> & l1, Snode<T> & l2);
236                                            Cap´
                                                  ıtulo 3. Cr´
                                                             ıtica de algoritmos



       ÁÒ ÐÑ ÒØ ¸ l1 Ý l2 ר Ò Ú ×º Ð ¬Ò Ð Ð ÐÐ Ñ × Ö ØÓÖÒ Ð Ð Ñ ÒØÓ
       Ô ÚÓØ Ð Ô ÖØ ÓÒ Ð Ð ×Ø list ÕÙ Ú Ý l1 ÓÒØ Ò ÐÓ× Ð Ñ ÒØÓ× Ñ ÒÓÖ ×
       ÕÙ Ð Ô ÚÓØ Ñ ÒØÖ × ÕÙ l2 ÐÓ× Ñ ÝÓÖ ×º
 ¾¾º      × Ò ÑÔÐ ÒØ ÙÒ ÕÙ ×ÓÖØ ÒÓ Ö ÙÖ× ÚÓ ×Ó Ö Ð ×Ø × Ó Ð × Ø ÔÓ Dnode<T>º
 ¾¿º      × Ò ÑÔÐ ÒØ ÙÒ ÕÙ ×ÓÖØ ÒÓ Ö ÙÖ× ÚÓ ×Ó Ö Ð ×Ø × × ÑÔÐ × Ø ÔÓ Snode<T>º
 ¾º       × Ò ÑÔÐ ÒØ ÙÒ ÕÙ ×ÓÖØ ×Ó Ö Ð ×Ø × Ó Ð × ÓÒ Dnode<T> ÕÙ × Ð ÓÒ Ð
       Ñ Ò ÒØÖ Ð ÙÒÓ× ÐÓ× Ð Ñ ÒØÓ× ÓÒר ÒØ Ñ ÒØ × ÕÙ Ð × Ð Ð ×Ø º
 ¾º      × Ö Ð ÕÙ ×ÓÖØ Ô Ö Ð ×Ø × Ó Ð Ñ ÒØ ÒÐ Þ × Ñ Ò Ö Ø Ð ÕÙ Ð ØÓÖ
       Ð × Ð ÓÒ Ð Ô ÚÓØ º
 ¾º       × Ò ÑÔÐ ÒØ Ð × Ù ÒØ ÔÖ Ñ Ø Ú
          int select_pivot(T a[], const int & l, const int & r, const int& n)

       Ä Ù Ð ×ÓÖØ Ð Þ Ö n Ò × ÒØÖ l Ý r Ý × Ð ÓÒ Ð Ò           ÓÖÖ ×ÔÓÒ ÒØ
       Ð Ñ Òº
       ÆÓ Ú Ö ¬ÕÙ Ö Ô Ø Ò ÒØÖ ÐÓ× Ò ×º
 ¾º    ÅÓ ¬ÕÙ Ð ÕÙ ×ÓÖØ Ô Ö Ð ×Ø × ÒÐ Þ × ÔÖ × ÒØ Ó Ò Ü ¿º¾º¾º ´Ô Ò ½ µ
       Ô Ö ÕÙ Ö Ð ÙÒ Ñ ÓÖ × Ð ÓÒ Ð Ô ÚÓØ º
 ¾º      ×ØÙ Ð ÓÒ×ÙÑÓ ×Ô Ó Ò Ô Ð ÕÙ Ó × ÓÒ Ð Ñ Ö ×ÓÖØ            Ó Ð × ÐÐ Ñ ×
       Ö ÙÖ× Ú ×º
 ¾º    ÅÓ ¬ÕÙ Ð ÕÙ ×ÓÖØ Ô Ö Ð ×Ø × ÒÐ Þ × ÔÖ × ÒØ Ó Ò Ü ¿º¾º¾º ´Ô Ò ½ µ
       Ô Ö ÕÙ Ñ Ò Ñ Ð ÓÒ×ÙÑÓ ×Ô Ó Ò ×Ù× ÐÐ Ñ × Ö ÙÖ× Ú ×º
 ¿¼º       ÐÓ× Ñ ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ÔÖ × ÒØ Ó× Ò ×Ø Ô ØÙÐÓ¸ Ù Ð × Ö Ð Ñ ÓÖ
       Ô Ö ÓÖ Ò Ö Ð ×Ø × ÒÐ Þ ×
 ¿½º     Ð Ñ ×ÑÓ Ö Ó ÕÙ Ð ÒØ Ö ÓÖ¸ Ô ÖÓ ×Ø Ú Þ ÒÓ ÔÙ       Ö Ö Ô Ø Ò ÒØÖ ÐÓ×
        Ò × ×ÓÖØ Ó׺
 ¿¾º      × Ò ÑÔÐ ÒØ ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ò Ù ÒØÖ Ð i¹ × ÑÓ Ñ ÒÓÖ Ð Ñ ÒØÓ ÙÒ
       Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ     ×ÓÖ Ò ´Snode<T>µº
 ¿¿º      × Ò ÑÔÐ ÒØ ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ò Ù ÒØÖ Ð i¹ × ÑÓ Ñ ÒÓÖ Ð Ñ ÒØÓ ÙÒ
       Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ      ×ÓÖ Ò ´Dnode<T>µº
 ¿º       × Ò ÑÔÐ ÒØ Ð ×ÕÙ Ñ ØÖ ÔÐ Ô ÖØ ÓÒ Ñ ÒØÓ ÜÔÐ Ó Ò Ü ¿º¾º¾º ´Ô Ò ½ µ
       Ô Ö Ñ Ò Ö Ð Ú × Ö Ô Ø ×º
 ¿º      Ò Ð Ö ÙÖÓ× Ñ ÒØ ¸ Ô Ö ÐÓ× ×Ó× ×Ô Ö Ó Ý Ô ÖÓ¸ Ð × ÑÔ ÒÓ Ð ÔÖ Ñ Ø Ú
       random search()º

 ¿º      × Ö Ð random search() Ô Ö Ð ×Ø × × ÑÔÐ Ñ ÒØ ÒÐ Þ × Ø ÔÓ Slinkº
 ¿º      Ò Ð Ö ÙÖÓ× Ñ ÒØ ¸ Ô Ö ÐÓ× ×Ó× ×Ô Ö Ó Ý Ô ÖÓ¸ Ð × ÑÔ ÒÓ Ð ÔÖ Ñ Ø Ú
       random select()º
3.7. Bibliograf´
               ıa                                                           237



 ¿ º ÁÑÔÐ ÒØ Ð random search() ÓÒ Ð ×Ø × × ÑÔÐ × Ø ÔÓ Snode<T>º
 ¿ º ÁÑÔÐ ÒØ Ð random select() ÓÒ Ð ×Ø × × ÑÔÐ × Ø ÔÓ Snode<T>º
  ¼º ÁÑÔÐ ÒØ Ð ÓÒ ÙÒØÓ ÙÒ Ñ ÒØ Ð ÓÒ ÖÖ ÐÓ× ×ÓÖ Ò Ó× × Ó Ò Ð × ÔÖ Ñ Ø ¹
     Ú × random search() Ý random select()º
  ½º ÁÑÔÐ ÒØ Ð ÓÒ ÙÒØÓ ÙÒ Ñ ÒØ Ð ÓÒ Ð ×Ø × × ÑÔÐ × Ø ÔÓ Snode<T> × Ó Ò
     Ð × ÔÖ Ñ Ø Ú × random search() Ý random select()º
  ¾º ÁÑÔÐ ÒØ Ð ÓÒ ÙÒØÓ ÙÒ Ñ ÒØ Ð ÓÒ Ð ×Ø × Ó Ð × Ø ÔÓ Dnode<T> × Ó Ò Ð ×
     ÔÖ Ñ Ø Ú × random search() Ý random select()º
  ¿º ×ØÙ Ð ¬ Ò              Ð Ð ÓÖ ØÑÓ ¿º¾º
   º ÜØ Ò GNU nana Ô Ö ÕÙ Ñ Ò ÐÓ× Ù ÒØ ¬ ÓÖ × ÕÙ Ú Ö ¬ÕÙ Ò ÓÒØ Ò ÓÖ ×
         Ð    Ð ÓØ ALEPHº
   º È Ö ØÓ Ó× ÐÓ× Ì       × Ò Ó× ×Ø Ð ÔÖ × ÒØ ¸ Ú Ö ¬ÕÙ Ð ÔÐ ÓÒ Ð × Ö Ð ×
         ÀÓÐØÞÑ ÒÒ ½½ ÔÖ × ÒØ × Ò Ü ¿º º¿º½ ´Ô Ò ¾¼ µº

Bibliograf´
          ıa
 ½ Ð ØÖ Ò º Ú Ð Ð ÓÒ http://www.pf-lug.de/projekte/haya/efence.phpº
 ¾ Ð Û¬Ò Öº Ú Ð Ð ÓÒ http://www.dwheeler.com/flawfinder/º
 ¿ È ÙÐ      Ñ ÒÒº       Ò ÐÝØ ×       Ð ÒØ ÓÖ º Ð ÒØ ÓÖ ¸ ÔØº ¾º º º Ì Ù ¹
   Ò Ö¸ Ä ÔÞ ¸ ½ º
     Ö Ö Èº ÖÓÓ ×º Ì ÅÝØ Ð Å Ò¹ÅÓÒØ ×× Ý× ÓÒ ËÓ ØÛ Ö Ò Ò Ö Ò ¸
   ¾¼Ø ÒÒ Ú Ö× ÖÝ Ø ÓÒº            ×ÓÒ Ï ×Рݸ Ê Ò ¸ Å ×׺¸ × ÓÒ Ø ÓÒ¸ ½ º
   º Ù º Ï × ÓÒ ¹ÓÖ Ö ÐÓ Ò ¬Ò Ø ÙØÓÑ Ø º º Å Ø º ÄÓ                  ÖÙÒ Ð Ò
   Å Ø º¸ ß ¾¸ ½ ¼º
     º º ÓÖ ØÓ¸ º Àº Ë ÐØÞ Ö¸ Ò º ̺ Ð Ò Òº ÅÙÐØ × ß Ø ¬Öר × Ú Ò Ý Ö׺ ÁÒ
   ËÔÖ Ò ÂÓ ÒØ ÓÑÔÙØ Ö ÓÒ Ö Ò ¸ Ô × ½ß ¿º ÁÈË ÈÖ ×׸ Å Ý ½ ¾º
       Û×ÓÒ Ò Ð Ö¸ Ú Ù           Ò¸ Ë Ø À ÐРѸ Ò Ý ÓÙ¸ Ò Ò Ñ Ò               к
     Ù × × Ú ÒØ         Ú ÓÖ     Ò Ö Ð ÔÔÖÓ ØÓ Ò ÖÖ Ò ÖÖÓÖ× Ò ×Ýר Ñ× Ó ¸
     Ù Ùר ¼ ¾¼¼½º
       Û×ÓÒ Êº Ò Ð Ö¸ Ò Ñ Ò Ð ¸ Ò Ý ÓÙ¸ Ò Ë Ø À ÐРѺ                  Ò ×Ýר Ñ
   ÖÙÐ × Ù× Ò ×Ýר ѹ×Ô ¬ ¸ ÔÖÓ Ö ÑÑ Ö¹ÛÖ ØØ Ò ÓÑÔ Ð Ö ÜØ Ò× ÓÒ׺ ÁÒ ÈÖÓ Ò ×
   Ó Ø Ø ËÝÑÔÓ× ÙÑ ÓÒ ÇÔ Ö Ø Ò ËÝר Ñ × Ò Ò ÁÑÔÐ Ñ ÒØ Ø ÓÒ¸ Ô ×
   ½ß½ ¸ ¾¼¼¼º
     º º ʺ ÀÓ Ö º Ð ÓÖ Ø Ñ× ÉÙ ×ÓÖØº ÓÑÑÙÒ Ø ÓÒ× Ó Ø                Ÿ ´ µ ¿¾½¸
   ½ ½º
½¼ È Ö ÀÓÐ Ö¸ Â Ò¹Å Ö Â Þ Õ٠и Ò ÖØÖ Ò Å Ý Öº Ä ØØ Ö× ÈÐ Ò Ø Ð Ñ
    ÓÖ Ö Ò º ÓÑÔÙØ Ö¸ ¿¼´ µ ¸ ¸ Å Ý ½ º
238                                            Cap´
                                                  ıtulo 3. Cr´
                                                             ıtica de algoritmos



½½ ÀÓÐØÞÑ ÒÒº Ì       ÔÓÛ Ö Ó ½¼ ÊÙÐ × ÓÖ      Ú ÐÓÔ Ò × ØÝ¹ Ö Ø Ð Ó º       ÇŹ
      ÈÍÌ Ê Á     ÓÑÔÙØ Ö¸ ¿ ¸ ¾¼¼ º
½¾ º º ÀÓÐÞÑ ÒÒº Ì ËÔ Ò ÅÓ Ð                  Ö¸ ÈÖ Ñ Ö Ò Ê Ö Ò Å Ò٠к
             ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ×× Ù× ØØ×¸ ¾¼¼¿º
½¿        Ö Ö Âº ÀÓÐÞÑ ÒÒº × Ò Ò Î Ð Ø ÓÒ Ó ÓÑÔÙØ Ö ÈÖÓØÓ ÓÐ׺ ÈÖ ÒØ À Ðи
       Ò Ð ÛÓÓ Ð «×¸ ÆÂ¸ ½ ½º
½         Ö Ö Âº ÀÓÐÞÑ ÒÒº Ì ÑÓ Ð             Ö ×Ô Òº Á      ÌÖ Ò× Ø ÓÒ× ÓÒ ËÓ ØÛ Ö
        Ò Ò Ö Ò ¸ ¾¿´ µ ¾ ß¾ ¸ Å Ý ½ º
½         Ö Ö Âº ÀÓÐÞÑ ÒÒº Ò Ò ÐÝ× × Ó Ø×Ø Ø × Ò º ÓÖÑ Ð Å Ø Ó × Ò ËÝר Ñ
          × Ò¸ ½¿´¿µ ¾ ß¿¼ ¸ ½ º
½     Â Ò¹Å Ö Â Þ ÕÙ Ð Ò ÖØÖ Ò Å Ý Öº Ç Ø Ø ÒÓÐÓ Ý × Ò Ý ÓÒØÖ Ø
      Ì Ð ××ÓÒ× Ó Ö Ò º ÓÑÔÙØ Ö¸ ¿¼´½µ ½¾ ß½¿¼¸  ÒÙ ÖÝ ½ º Ë Ð×Ó Ð ØØ Ö× ½¼ º
½     ˺ º ÂÓ Ò×ÓÒº ÄÁÆÌ C ÔÖÓ Ö Ñ              Öº ÁÒ ÍÆÁ ÈÖÓ Ö ÑÑ Ö Å Ò٠к ÄÄ
      Ä ×º¸ 7   th   Ø ÓÒ¸ ½ º
½       Ö Ò Ïº à ÖÒ Ò Ò ÊÓ È º Ì ÈÖ Ø Ó ÈÖÓ Ö ÑÑ Ò º                        ×ÓÒ¹Ï ×Рݸ
      Ê Ò ¸Å ¸½ º
½       ÓÒ Ð º ÃÒÙØ º ËÓÖØ Ò Ò Ë Ö Ò ¸ ÚÓÐÙÑ ¿ Ó Ì                     ÖØ Ó ÓÑÔÙØ Ö
      ÈÖÓ Ö ÑÑ Ò º          ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ÍË ¸ × ÓÒ Ø ÓÒ¸ ½ º
¾¼      Ð × Ö Å ÁÒØÝÖ ¸ ØÓÖº Ø Ö Î ÖØÙ º ÍÒ Ú Ö× ØÝ Ó ÆÓØÖ Ñ ÈÖ ×׸ ½ º
¾½    ËØ Ú Å Ù Ö º ÏÖ Ø Ò ×ÓÐ Ó Å ÖÓ×Ó Ø³× Ø Ò ÕÙ × ÓÖ Ú ÐÓÔ Ò Ù ¹ Ö
          ÔÖÓ Ö Ñ׺ ÅÁ ÊÇËÇ Ì¸ ½ ¿º
¾¾     º Å ÒÒ Ò º ÈÒÙ Ð º ËÔ ¬ Ø ÓÒ Ò Ú Ö ¬ Ø ÓÒ Ó ÓÒ ÙÖÖ ÒØ ÔÖÓ Ö Ñ× Ý
      ι ÙØÓÑ Ø º ÁÒ ÓÒ Ö Ò Ö ÓÖ Ó Ø ½ Ø                Å ËÝÑÔÓ× ÙÑ ÓÒ ÈÖ Ò ÔÐ × Ó
      ÈÖÓ Ö ÑÑ Ò Ä Ò Ù × ´ÈÇÈĵ¸ Ô × ½ß½¾¸ ½ º
¾¿    ËØ Ú Å ÓÒÒ Ðк Ó ÓÑÔÐ Ø º Å ÖÓ×Ó Ø ÈÖ ×׸ Ê ÑÓÒ ¸ Ï º¸ ½ ¿º
¾         ÖØÖ Ò Å Ý Öº × Ò Ý ÓÒØÖ Ø¸ ÓÑÔÓÒ ÒØ× Ò               Ù Ò º ÂÇÇȸ ½½´ µ ß
         ¸½ º
¾       º º ÅÝ Ö׺ Ì ÖØ Ó ËÓ ØÛ Ö Ì ×Ø Ò º ÂÓ Ò Ï Ð Ý ² ËÓÒ׸ ½ º
¾     Æ ÓÐ × Æ Ø Ö ÓØ Ò ÂÙÐ Ò Ë Û Ö º Î Ð Ö Ò            ÔÖÓ Ö Ñ ×ÙÔ ÖÚ × ÓÒ Ö Ñ ÛÓÖ º
        Ð ØÖº ÆÓØ × Ì ÓÖº ÓÑÔÙØº Ë ¸ ´¾µ¸ ¾¼¼¿º
¾     Æ ÓÐ × Æ Ø Ö ÓØ Ò ÂÙÐ Ò Ë Û Ö º Î Ð Ö Ò            ÔÖÓ Ö Ñ ×ÙÔ ÖÚ × ÓÒ Ö Ñ ÛÓÖ º
        Ð ØÖº ÆÓØ × Ì ÓÖº ÓÑÔÙØº Ë ¸ ´¾µ¸ ¾¼¼¿º
¾        Å Ò Ö Ð Î Û Ó Ø ÅÙÐØ × ËÝר Ñ Ú ÐÓÔÑ ÒØº º º ÓÖ ØÓ Ò º ̺ Ð Ò¹
         Òº ÁÒ ÓÒ Ö Ò ÓÒ Ê × Ö             Ö Ø ÓÒ× Ò ËÓ ØÛ Ö Ì ÒÓÐÓ Ý¸ ÈÖÓÚ Ò ¸
      Ê Ó Á×Ð Ò ¸ Ç ØÓ Ö ½ º
¾       º È ÖÖ Øº ÙÒ Ø ÓÒ      º http://www710.univ-lyon1.fr/~perret/fnccheck/profiler.htmlº
                                                                y
3.7. Bibliograf´
               ıa                                                           239



¿¼ ÈºÂºÅ Ö Ò Ì Ö ËÓ ØÛ Ö ÓÙÒ Ø ÓÒº Ì ÆÍ Æ Æ ÓÑ Ô º
¿½ º ÈÒÙ Ð º Ì Ø ÑÔÓÖ Ð ÐÓ Ó ÔÖÓ Ö Ñ׺ ÁÒ Ó × ¸ Ô × ß ¸ ½ º
¿¾ Ú Ëº ÊÓ× Ò ÐÙѺ ÓÖÖ Ø ÓÒ ØÓ             ÔÖ Ø Ð ÔÔÖÓ ØÓ ÔÖÓ Ö ÑÑ Ò Û Ø
    ×× ÖØ ÓÒ× º Á    ÌÖ Ò× Ø ÓÒ× ÓÒ ËÓ ØÛ Ö Ò Ò Ö Ò ¸ ¾½´¿µ ¾ ¸ Å Ö ½ º
¿¿ Ú Ëº ÊÓ× Ò ÐÙѺ ÔÖ Ø Ð ÔÔÖÓ ØÓ ÔÖÓ Ö ÑÑ Ò Û Ø ×× ÖØ ÓÒ׺ Á
   ÌÖ Ò× Ø ÓÒ× ÓÒ ËÓ ØÛ Ö Ò Ò Ö Ò ¸ ¾½´½µ ½ ß¿½¸  ÒÙ ÖÝ ½ º
¿ Ì Ó º ÊÙÝ× Ò Ö Ö Âº ÀÓÐÞÑ ÒÒº Ú Ò ËÈÁÆ ØÙØÓÖ Ðº ÁÒ ËÙ× ÒÒ Ö
    Ò Ä ÙÖ ÒØ ÅÓÙÒ Ö¸ ØÓÖ׸ ÅÓ Ð             Ò ËÓ ØÛ Ö ¸ ½½Ø ÁÒØ ÖÒ Ø ÓÒ Ð ËÈÁÆ
   ÏÓÖ × ÓÔ¸ Ö ÐÓÒ ¸ ËÔ Ò¸ ÔÖ Ð ½¹¿¸ ¾¼¼ ¸ ÈÖÓ Ò ×¸ ÚÓÐÙÑ ¾ Ó Ä ¹
   ØÙÖ ÆÓØ × Ò ÓÑÔÙØ Ö Ë Ò ¸ Ô × ¿¼ ß¿¼ º ËÔÖ Ò Ö¸ ¾¼¼ º
¿ ÊÓ ÖØ Ë Û º Ð ÓÖ Ø Ñ× Ò È ÖØ× ½ß ÙÒ Ñ ÒØ Ð׸ Ø ×ØÖÙ ØÙÖ ×¸
   ×ÓÖØ Ò ¸ × Ö Ò º        ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ÍË ¸ ½ º
¿ ËØ Ú Ò Ëº Ë Ò º Ì         Ð ÓÖ Ø Ñ × Ò Å Ò٠к ËÔÖ Ò Ö¹Î ÖÐ ¸ ÖÐ Ò¸ Ö¹
   Ñ ÒÝ » À Ð Ö ¸ ÖÑ ÒÝ » ÄÓÒ ÓÒ¸ Íà » Ø º¸ ½ º
¿ Ê Ö ËØ ÐÐÑ Ò Ò ÊÓÐ Ò Àº È × º               Ù Ò ÛØ           Ø ÆÍ ×ÓÙÖ ¹
   Ð Ú Ð Ù Öº Ö ËÓ ØÛ Ö ÓÙÒ Ø ÓÒ¸ ÁÒ º¸ ÔÙ ¹ Ë Ö¸ º¼ ÓÖ                  Ú Ö× ÓÒ
    º Ø ÓÒ¸ ½ ¿º ÈÖ Ú ÓÙ× Ø ÓÒ ÔÙ Ð × ÙÒ Ö Ø ØÐ Ì                Ñ Ò٠к Ù Ùר
   ½ ¿º
¿ ÊÓ ÖØ º Ì Ö Òº ÑÓÖØ Þ ÓÑÔÙØ Ø ÓÒ Ð ÓÑÔÐ Ü ØÝº Ë Ð ×¸ ¿¼ ß¿½ ¸ ½ º
¿ ̺ Ú Ò ÎÐ º Ì Ö ÕÙ ×Ø ÓÒ× ÓÙØ             Ù ÝÓÙ ¬Ò º ½ º
 ¼ ÂÓ Ò Î ¸ º ̺ ÐÓ ¸ Ì ÝÓ× ÃÓ ÒÓ¸ Ò                ÖÝ Å Ö Ûº ÁÌË         ר Ø
   ÚÙÐÒ Ö Ð ØÝ × ÒÒ Ö ÓÖ Ò ·· Ó º ÁÒ ½ Ø ÒÒÙ Ð ÓÑÔÙØ Ö Ë ÙÖ ØÝ
     ÔÔÐ Ø ÓÒ× ÓÒ Ö Ò º Ÿ              Ñ Ö ¾¼¼¼º
 ½ Ö Ý Ï Ø×ÓÒº Ñ ÐÐÓ ¹ Ù Ñ ÐÐÓ Ð Ö Öݺ Ú Ð Ð ÓÒ http://dmalloc.com/º
 ¾ Æ Ð Ù× Ï ÖØ º Ð ÓÖ Ø Ñ× + Ø ËØÖÙ ØÙÖ × = ÈÖÓ Ö Ñ׺ ÈÖ ÒØ ¹À ÐÐ Ë Ö × Ò
     ÙØÓÑ Ø ÓÑÔÙØ Ø ÓÒº ÈÖ ÒØ ¹À Ðи ÍÔÔ Ö Ë Ð Ê Ú Ö¸ ÆÂ ¼ ¸ ÍË ¸ ½ º
 ¿ È ÖÖ ÏÓÐÔ Ö Ò        Ò × Ä ÖÓݺ Ê Ð Ð × Ò Û Ø ÓÙØ ÓÐÐÓ× ÓÒ Ø Ø ÓÒº ÁÒ
     Óר × ÓÙÖ ÓÙ Ø ×¸ ØÓÖ¸ ÓÑÔÙØ Ö            Î Ö ¬ Ø ÓÒ¸ Ø ÁÒØ ÖÒ Ø ÓÒ Ð ÓÒ¹
     Ö Ò ¸ Î ³ ¿¸ ÐÓÙÒ ¸ Ö ¸ ÂÙÒ ¾ ¹ ÂÙÐÝ ½¸ ½ ¿¸ ÈÖÓ Ò ×¸ ÚÓÐÙÑ
        Ó Ä ØÙÖ ÆÓØ × Ò ÓÑÔÙØ Ö Ë Ò ¸ Ô × ß ¼º ËÔÖ Ò Ö¸ ½ ¿º
   ÂÙÒ Ò Ò ¸ Ò Ë Ö¸ Ò Û×ÓÒ Ò Ð Öº ÔÐÓ                   Ð ØÛ ظ Ò Ö Ð ×Ýר Ñ
    ÓÖ ¬Ò Ò × Ö ÓÙ× ×ØÓÖ ×Ýר Ñ ÖÖÓÖ׺ ÁÒ ÈÖÓ Ò × Ó Ø Ø ËÝÑÔÓ× ÙÑ ÓÒ
   ÇÔ Ö Ø Ò ËÝר Ñ × Ò Ò ÁÑÔÐ Ñ ÒØ Ø ÓÒ¸ ¾¼¼ º
   Ⱥ ¬ÖÓÔÙÐÓ¸ º Ï ×Ø¸ Àº ÊÙ Ò¸ º ÓÛ Ò¸ Ò º Ö Ò º ÌÓÛ Ö × Ò ÐÝ× Ò
    Ò ×ÝÒØ × Þ Ò ÔÖÓØÓ ÓÐ׺ Á           ÌÖ Ò× Ø ÓÒ× ÓÒ ÓÑÑÙÒ Ø ÓÒ¸ ÓÑѹ
   ¾ ´ µ ½¾¼½¿ ½¸ ½ ¼º
     Ò Ö × ÐÐ Ö Ò ÓÖÓØ ÄÙØ Ù׺                 ¹ Ö Ö Ô Ð ÖÓÒØ¹ Ò ÓÖ ÍÆÁ
       Ù Ö׺ ËÁ ÈÄ Æ ÆÓØ ×¸ ¿½´½µ ¾¾ß¾ ¸ ½ º
Cap´
   ıtulo 4

´
Arboles

   ÙÒÕÙ ØÙ ÐÑ ÒØ ÓÒ Ø Ò Ò Ð ÓÐÚ Ó¸ ×                            ÑÙ Ó Ø ÑÔÓ¸ ×Ó ÕÙ Ð
  ÖÒ         ÒØ      Ý × ÒØ Ó ÙÒ Ó× × Ð ÐÐ Ñ × Ò Ó ÕÙ º × Ý ÙÖ ÒØ
         × ÒÑ ÑÓÖ Ð ×¸ Ò ×ØÖ Ð × Ý Ð Ò ×¸ × Ö ÕÙ Ð ÕÙ                  Ð Ó × ×ØÙ      Ô ÖØ Ö
     ×Ù ÓÒØ ÜØÓ ÓÖ Òº ÄÓ ÕÙ ÓÖ ÚÙÐ ÖÑ ÒØ ÐÐ Ñ ÑÓ× ÙØÙÖÓ¸ Ò ×ØÖ ÐÑ ÒØ ×
Ð ÒÓÑ Ò              ר ÒÓ Ó × ¸          ÓÒ × Ú º Ù Ò Ó × ÕÙ Ö × Ö ÕÙ Ö ´ ×
  ÓÒ Ú Ò µ Ý ÕÙ Ú Ò Ö ´                    ÓÒ Ú µ ÙÒ Ó× ¸ × ×ØÙ              Ý × ÖØ      ×Ù
     Ò ÐÓ        × Ö¸ ×Ù ÓÖ Ò Ý Ú Ò Ö Ô ÖØ Ö ×Ù Ò × ×º
        Ð Ø ÖÑ ÒÓ Ò ÐÓ ¸ ÕÙ ÓÒØ Ò                   ÒÙ× ½ ¸ ÔÖÓÚ Ò Ð Ð Ø Ò Ò ÐÓ ¸ Ð
  Ù Ð ÔÖÓÚ Ò ×Ù Ú Þ Ð Ö Ó γενεαλογ α Ý × Ò ¬ Ð ×ØÙ Ó Ð Ñ ÒÓ × Ð
ÓÖ Ò ´ Ò × ×µ ר Ð ÔÖ × ÒØ º ÀÓÝ Ò Ð Ò ÐÓ Ø Ò                             ×ØÙ Ö× ÓÑÓ ÙÒ
× ÙÒ             Ú ÒØÓ× Ö ×Ô ØÓ ÙÒ ÑÓÚ Ñ ÒØÓ ÜØ ÖÒÓ Ý ÒÓ ÐÓ× Ú ÒØÓ× ÐÐ Ñ Ó
Ø ÑÔÓº ר Ø ÔÓ ×ØÙ Ó × Ð ÐÐ Ñ ¸ ÔÓÖ ÐÓ Ò Ö Ð¸ À רÓÖ º
      ÀÙ Ó ÔÓ ×¸ × Ò Ñ Ö Ó¸ Ò ÕÙ Ð ÙÒÓ× Ò ÐÓ ×Ø × × ÒØ Ò ÕÙ Ð ÕÙ                        ÙÒ
  Ó× ÒÓ × Ö Ñ Ø ÙÒ Ñ Ö Ý ÙÒ × Ù Ò                         Ú ÒØÓ׸ × ÒÓ Ú Ö× × Ý Ú Ö Ð ×
× Ù Ò × ÕÙ ÔÖÓÚ Ò Ò × ÙÒ ÑÓÑ ÒØÓ ÒÓÑ Ò Ó ÓÖ Ò¸ ÓÒÚ Ö Ò                                 ÓØÖÓ
ÑÓÑ ÒØÓ ÐÐ Ñ Ó ÔÖ × ÒØ ¸ Ý ÔÖÓ× Ù Ò                Ð Ó ÔÓÖ Ú Ò Ö ÕÙ × ÐÐ Ñ ×Ø ÒÓº ÕÙ ¹
ÐÐÓ× Ò ÐÓ ×Ø × × Ô Ö Ø ÖÓÒ ÕÙ ÓÒÚ Ú Ò ÓÒ Ø ×Ø Ó× ÕÙ                       Ò ÓÑÔ Ò Ó ×Ù×
  × Ò ÒØ × Ý ÕÙ Ð × ×Ó Ö Ú Ú Ö Ò ÐÐÓ× Ý ×Ù× × Ò ÒØ ׺ × Ñ ×ÑÓ¸ × × Ò ÖÓÒ
ÔÓÖ Ð         Ó ÕÙ Ð × ÔÖÓÔ × ÓÖÑ × ÕÙ ÐÐÓ× Ø ×Ø Ó× Ò                    Ò ×Ù Ú Ò Ö Ý      º
   Ð Ò ÖÓ ÕÙ Ð Ø ×Ø Ó ÓÝ × Ð Ñ ÒØ                Ó Ð ÒÓÑ Ö          Ö ÓРݸ Ð Ü Ô ÓÒ
Ð ÙÐØÙÖ Ø ÒÓÐÓ ¾ ר ÔÓ ¸ Ò Ð × Ö ×Ø ÒØ × Ð Ö ÓÐ                         Ù× Ó Ø ÒØÓ ×ÓÑ ÖÓ¸
   ØÖ Ú × Ð ×            × Ý Ð Ø ØÙ ׸ ÕÙ × Ó Ð ÜØÖ ÑÓ ×Ù ØÓ Ú Ò Ö ÓÒº
       ÈÓÖ ÕÙ ×ÓÑ Ö             Ô ÖØ ×Ù ÐÐ Þ ¸ ÑÓÒÙÑ ÒØ Ð Ý ÐÓÒ Ú ¸                   ÚÖ ×
Ö ÞÓÒ ×º ÍÒ         Ð × ÔÖ Ò Ô Ð ×¸      Ö Ò ÒØ Ö × Ô Ö ÒÙ ×ØÖÓ ÓÒØ ÜØÓ¸ Ö ×Ù ×ØÖÙ ØÙÖ
    Ò Ö ¸ × ÓÑÓ ×Ù ÚÓÐÙ ÓÒº ÍÒ Ö ÓÐ ÓÑ ÒÞ Ò Ð ÑÙÒ Ó ÓÑÓ ÙÒ × Ñ ÐÐ Ø ÕÙ
Ð ÒØ Ñ ÒØ ÒÖ Þ Ý Ö Ñ Ö Ò Ó Ý Ù× Ò Ó Ð ÐÙÞ Ò ÙÒ ØÖ Ñ Ö ÖÕÙ ÕÙ ØÖ Þ ×Ù
       ¸ ×Ù Ò ÐÓ Ý ÕÙ ØÖ Ò× Ñ Ò Ö ×Ù ×Ø ÒÓº ÙÒÕÙ ÔÓÖ ÐÓ Ò Ö Ð ÙÒ Ö ÓÐ
ÐÓ Ñ Ö ÑÓ× ÓÑÓ ÙÒ Ö ÓÐ × Ö¸ ÓÑÓ ÙÒ ØÓ Ó¸ Ò Ó × ÓÒ × Ñ Ö ÑÓ× ×Ù× Ô ÖØ ×
Ö Þ¸ ØÖÓÒ Ó¸ Ö Ñ ×¸ Ó ×¸ ­ÓÖ ×¸ ºººº Å ÒØÖ × Ñ × Ö × ×Ø                  Ð Ö Þ¸ Ñ × ÒØ Ù
  × Ð Ö ÓÒ Ð Ö ÓÐ ÕÙ Ñ Ö ÑÓ× Ò ÐÓ Ñ ÒØ ¸ Ñ ÒØÖ × Ñ × ÐØ Ó ÑÔÐ ×Ø ׸
Ñ × ÓÚ Ò × Ð Ô ÖØ Ö ×Ô ØÓ ÓØÖ × Ò Ö ÓÖ × Ó Ñ × ÒØ ÖÒ ×º ר Ô ØÖÓÒ ×ØÖÙ ØÙÖ Ð¸
ÕÙ ÒÓ × ÓÖÖ ×ÔÓÒ ÓÒ ÙÒ Ñ Ö × Ù Ò ¸ Ô Ö Ò ÙÒ ÒÙÑ Ö × Ñ Ú Ö
  ½
      Î × Ý Ö Ù Ö × Ü ½º¾º¿º ´Ô Ò ½ µº
  ¾
      Ç ÕÙ Þ ¸ Ñ ÓÖ Ó¸ Ð ÒØ ¹ ÙÐØÙÖ º

                                            ¾½
242                                                           Cap´        ´
                                                                 ıtulo 4. Arboles



 ÓÒØ ÜØÓ× ÒÙ ×ØÖ Ú            ÐÓ× Ù Ð × ÒÓ × Ô Ð ÓÑÔÙØ ÓÒº
       ÐÓ× ØÓ× Ý     Ó× ÙÑ ÒÓ× Ð × ÐÐ Ñ ÑÓ× ×ØÓ× ¸ ÔÙ × ×ØÓ× ×Ø Ò º Ë Ö ÙÑ ÒÓ
×ÓÐÓ Ø Ò × ÒØ Ó ÓÒ ÐÓ× ÓØÖÓ× × Ö × ÙÑ ÒÓ׺ Å × ÙÑ ÒÓ× ×ÓÑÓ× Ò Ð Ñ               Ò ÕÙ
Ñ × ÒÓ× Ý ÑÓ× Ò Ö Ð ÓÒ Ó ÓÒ ÐÓ× ÓØÖÓ׺               Ð ÙÒ Ñ Ò Ö ÔÓ Ö ÑÓ× Ö ÕÙ
 ÓÑÓ ÙÑ ÒÓ× ÒÓ× ×Ø Ò Ù ÑÓ× ÒØÖ ÒÓ×ÓØÖÓ× ÔÓÖÕÙ ÐÓ× ×ØÓ× ÕÙ Ö ÑÓ× Ý ×Ø ¹
ÑÓ× Ô Ö Ð ÓØÖÓ ×ÓÒ Ð ÙÒ Ñ Ò Ö              Ö ÒØ ׺ ÍÒ ÒØ ÙÓ Ý ÖÑÓ×Ó ÔÖÓÚ Ö Ó Ò Ù
Ö Þ ÙÒ ×ØÓ Ò Ö ÙÒ Ø ØÙ ¸ ÙÒ Ø ØÙ Ò Ö ÙÒ Ö Ø Ö Ý ÙÒ Ö Ø Ö
   Ò Ö ÙÒ ×Ø ÒÓ º Ë Ò Ö Ð Þ ÑÓ׿ ÒÙ ×ØÖ ÒØ ¸ Ó Ð                  Ð Ù Ò ÓØÖÓ¸ ÔÓ ÑÓ×
Ô Ò× Ö Ò Ð Ö Ø Ö Ý           Ö Ñ ÑÓÖ Ò Ð × Ø ØÙ × Ý ×ØÓ× ÕÙ ÓÒ Ù ÖÓÒ ÕÙ ÐÐ ×
   Ø ØÙ ׺ ÁÒ Ò Ó Ò ÙÒ Ö Ø Ö Ø Ò ÑÓ×                 Ö       ÓÑÓ × ÔÖÓÝ Ø Ð ×Ø ÒÓº
ÆÓ Ò Ð À Ö Ð ØÓ¸ ÕÙ Ò                ÐÐ Ñ Ö× Ð Ð ÄÙÑ ÒÓ×Ó Ý ÒÓ Ð Ó× ÙÖÓ ¸         ÕÙ
   Ð Ö Ø Ö ÙÒ ÓÑ Ö × ×Ù ×Ø ÒÓ º ÓÑÓ ÙÒ ÔÓØ Ø Ó Ý ÑÙÝ Ö Ù Ó Ñ¹
ÔÐÓ¸ ÓÒ× Ö ÑÓ× Ð Ö × ¸ Р٠и Ò ÖØ ÓÖÑ ¸ ר Ð Ö Ý ÕÙ ¸ ×Ù Ú Þ¸ ר ÙÒ
   Ö Ø Ö Ñ ×ØÓ×Óº Ä Ñ ×Ø ¸ Ù Ò Ó × Ö ÙÒ× Ö                ÒØÖÓ ÙÒ ÙØ ÒØ ÒÓ ÓÒ
       Ò¸ ר ÙÒ ×Ø ÒÓ ÒÑ Ö Ó Ò Ð Ù Ò Ú ×Ù Ý ÒØ Ð                                Ò ÕÙ
 Ò Ñ ×Ø × ÓÑÔ ÖØ º Ä Ú              ÙÑ Ò ×Ø ÔÐ Ò         ÑÙ Ó× Ñ × ×ØÓ׸ Ð ×ÓÒÖ × ¸
 Ð ÐÐ ÒØÓ¸ Ð Ö ØÓ¸ Ð ×ÓÑ ÖÓ¸ ººº × ÓÑÓ ×Ù× ÓÒ× Ù ÒØ × Ø ØÙ ׸ Ð Ô Ö ¸ Ð
ØÖ ר Þ ¸ Ð ÒÓ Ó¸ Ð ÙÖ Ó× ¸ ºººº Ö Ø Ö × Ñ Ö Ò ÕÙ ÐÐ × Ø ØÙ × Ð Ñ ×ØÓ×Ó¸
 Ð ×ØÙØÓ¸ Ð ÔÖ Ñ Ó¸ Ð × ÓÒ¬ Ó¸ Ð Ô Ö× Ú Ö ÒØ ¸ ºººº Ô Ò Ò Ó Ð Ú Ò Ö Ý
Ð ×Ù ÖØ ¸ ×Ó× Ö Ø Ö × ÓÒ Ù Ó× ÔÙ Ò ×Ø Ò Ö Ò ÙÒ Ô Ö ¸ ÙÒ ÔÓÐ Ø Ó¸ ÙÒ ÔÓ Ø ¸
ÙÒ Ù ÖÖ ÖÓ¸ ÙÒ ¬ÐÓ×Ó Ó¸ ºººº ÌÓ Ó ×Ø × ÙÖ×Ó ÔÙ × ÒØ Ø Þ Ö× ¸ ÙÒ Ñ Ò Ö ÙÒ Ø ÒØÓ
Ö Ù ¸ Ñ × Ñ × ÔÖ Ò× Ð ¸ Ó Ð × Ù ÒØ                  ÖÑ

         risa        sonrisa         llanto          grito          asombro




       alegr´a
            ı       picard´a
                          ı         tristeza         enojo        curiosidad




       amistoso         astuto     deprimido      desconfiado    perseverante




        Padre       Pol´tico
                       ı             Poeta         Guerrero        Fil´sofo
                                                                      o




                                    Destino

  ¿
          Ò ÐÓ º
      Ë ÙÒ Ð Ø      À       Öº
243



     Ò ÐÓ× ×ØÓ׸ ÐÓ× ÒÙ ×ØÖÓ× Ý ÐÓ× Ð ÓØÖÓ¸ × ×Ø Ò ÒÙ ×ØÖÓ× ×Ø ÒÓ׺
         ÒØ ×     ÓÖ Ö ÓÖÑ ÐÑ ÒØ Ð ÓÒ ÔØÓ ÓÑÔÙØ ÓÒ Ð Ö Óи ÑÔ Ô ÑÓ×ÒÓ× ÙÒ
   ÔÓ Ó Ñ × ÓÒ Ð           ×ØÖ Ø      Ö ÓÐ Ò ÙÒ ÓÒØ ÜØÓ Ñ × ÓØ ÒÓº
         Ò Ð ÒØÓÖÒÓ Ò ÐÓ Ó            ר ÔÓ ¸ ÕÙ Þ × Ð Ö ÓÐ Ò ÐÓ Ó ¸ Ð Ù Ð
   ØÖ Þ × Ò Ò ¸ Ý ÙÝ Ö ÔÖ × ÒØ ÓÒ Ò Ö Ð × ÐÙ×ØÖ Ò Ð ¬ ÙÖ º½¸ ÙÒ ÑÔÐ Ö
   Ö ÔÖ × ÒØ ÒØ ÙÐØÙÖ Ð Ð ×ØÖÙ ØÙÖ Ö ÓÐ Ý ×Ù × Ñ Ð Ö Ô ØÓÖ Ý Ö ÖÕÙ ÓÒ
   ×Ù Ô Ö Ò ÓÒ Ò ØÙÖ Ðº

Bisabuelo   Bisabuela Bisabuelo      Bisabuela Bisabuelo      Bisabuela Bisabuelo        Bisabuela




    Abuelo paterno          Abuela paterna           Abuelo materno          Abuela materna




                     Pap´
                        a                                             Mam´
                                                                         a




                                              Hijo



                        ÙÖ º½ ÓÖÑ       ÒÖÐ      ÙÒ Ö ÓÐ Ò ÐÓ Ó

              ÖÒ       ×Ù ×Ø Ö ÓØ ÔÓ Ò ØÙÖ Ð¸ Ò Ð Ö ÓÐ Ò ÐÓ Ó Ð × × Ñ ÐÐ × ´ÐÓ× ×¹
      Ù ÐÓ×µ × Ò Ù ÒØÖ Ò Ò Ð × Ó ×¸ Ñ ÒØÖ × ÕÙ Ð ÙÐØ ÑÓ × Ò ÒØ Ò Ð Ö Þº Ò
    Ð Ñ ×ÑÓ × ÒØ Ó Ò ÐÓ Ó¸ ÙÒÕÙ Ñ × Ò Ú Ù Ð ×Ø ¸ ÙÒ Ô ØÖÓÒ × Ñ Ò Ð Ñ × ¬ Ð ÓÒ
    Ð Ö ÓÐ Ò ØÙÖ Ð × Ð Ö ÓÐ Ò ×Ø Ó ¸ Ð Ù Ð ØÖ Þ Ð × × Ò Ò Ý ÙÝ ×ØÖÙ ØÙÖ
      × ¸ Ô ÖÓ ÒÓ Ò Ö Ð¸ × ÐÙ×ØÖ Ò Ð ¬ ÙÖ º¾º
         Ð Ö ÓÐ Ò ÐÓ Ó Ò Ö Ð Ð ¬ ÙÖ º½ × Ò Ö Ó Ò Ð × ÒØ Ó ÕÙ
   Ñ Ñ ÖÓ Ø Ò Ü Ø Ñ ÒØ Ó× Ò ×ØÖÓ× Ö ØÓ× Ð Ô Ö Ý Ð Ñ Ö º Ò Ñ Ó¸ Ð
   ÒÙÑ Ö          Ð Ö ÓÐ Ò ×Ø Ó Ô Ò Ö Ð Ö Ø Ö ÔÖÓÐ ¬ Ó Ð Ñ Ð º
         Ò ÔÖÓ Ö Ñ ÓÒ × Ñ Ò Ð ×ØÖ ÓÒ                   Ö ÓÐ Ô Ö Ö ÔÖ × ÒØ Ö Ö ÖÕÙ ×
    ÓÑÔÙØÓ¸ ÓÖ Ò × ×Ô Ð ×              ØÓ× Ó × ØÙ ÓÒ × ÕÙ Ø Ò Ò ÐÓ× Ö ÓÐ × ÙÐØÙÖ Ð ×
    ¸ Ò ÐÙ× Ú ¸ Ò ØÙÖ Ð ×º          Ó¸ Ò Ð Ô ØÙÐÓ ½ ÒØÖÓ Ù ÑÓ× Ð ÓÒ ÔØÓ           Ö Ò¹
           Ð × × Ý ×Ù Ö Ø Ö Ò ÐÓ Ó º
         Ò ÓÑÔÙØ ÓÒ¸ Ð × ÔÐ ÓÒ × Ð Ö ÓÐ ×ÓÒ ÑÙÝ Ú Ö× × Ý Ú Ò × Ð Ö Ù¹
   Ô Ö ÓÒ ¬ ÒØ           Ð Ú ×¸ ר Ð Ö ×ÓÐÙ ÓÒ Ò Ð Ø         ÜÔÖ × ÓÒ × Ð Ð ÙÐÓ ÓÖÑ Ðº
     Ð Ö ÓÐ ÙÒ Ñ ÒØ ÑÙ Ó× ×ÕÙ Ñ × Ö ÙÔ Ö ÓÒ Ý Ö ÓÒרÖÙ ÓÒ Ò ÓÖÑ ÓÒ¸
   Ø ÒØÓ Ò Ñ ÑÓÖ ÔÖ Ñ Ö ¸ ÓÑÓ Ò × ÙÒ Ö º ÌÓ Ó ÔÖÓ ×Ó ØÖ Ù ÓÒ¸ ÔÓÖ Ñ¹
   ÔÐÓ¸ Ð ÓÑÔ Ð ÓÒ          Ð ÙÒ Ð Ò Ù        ÔÖÓ Ö Ñ ÓÒ¸ ÙØ Ð Þ Ð Ö ÓÐ ÓÑÓ ×ØÖÙ ØÙÖ
    ÙÒ Ñ ÒØ к Ð Ð ÙÐÓ ÓÖÑ Ð ÙØÓÑ Ø Ó × Ö¸ Ð Ð ÙÐÓ ÜÔÖ × ÓÒ × Ò Ð Ø ×¸
244                                                             Cap´        ´
                                                                      ıtulo 4. Arboles



                                          Individuo



          Primog´nito
                e                                              Hijo 2        Hijo 3



    Nieto 1       Nieto 2                     Nieto 3                                 Nieto 4



Bizn 1    Bizn 2 Bizn 3 Bizn 4         Bizn 5      Bizn 6     Bizn 7 Bizn 8            Bizn 9   Bizn 10



biz-biz



                         ÙÖ º¾ ÓÖÑ        ×       ÙÒ Ö ÓÐ Ò ×Ø Ó

   ÔÓÖ ÑÔÐÓ Ð Ñ Ø ×¸ Ö Ú ×¸ ÒØ Ö Ð ×¸ Ø Ø Ö ¸ Ù× Ð Ö ÓÐ ÓÑÓ ×ØÖÙ ØÙÖ       Ö Ô¹
   Ö × ÒØ ÓÒ Ð × ÜÔÖ × ÓÒ ×º
       ÍÒ Ð ÓÖ        ר Ô ØÙÐÓ × Ö ÓÖÑ ÖÒÓ× ÓÒ ÐÓ× Ð Ò Ñ ÒØÓ× × Ó×      ØÓ×
    ÙÑÔÐ Ö ÐÓ× × Ù ÒØ × Ó Ø ÚÓ×
      ½º ÓÒÓ Ö ÐÓ× ÓÒ ÔØÓ× × Ó× Ý ÓÑÓ Ò Þ Ö Ø ÖÑ ÒÓÐÓ ×º
      ¾º ÓÑÔÖ Ò Ö ÐÓ× Ð ÓÖ ØÑÓ× ÙÒ Ñ ÒØ Ð × Ý ÔÖ Ô Ö Ö Ð Ð ØÓÖ Ò Ð × ÖÖÓÐÐÓ
           Ð ÓÖ ØÑÓ× Ñ × ÓÑÔÐ Ó׺
      ¿º ÈÖ Ô Ö ÖÒÓ× Ô Ö Ð ×ØÙ Ó ×ØÖÙ ØÙÖ × Ö Óи ×Ô Ð Þ ×¸ ÕÙ × Ö Ò × ÖÖÓ¹
         ÐÐ × Ò ÓØÖÓ× Ô ØÙÐÓ× ×Ø Ø ÜØÓº
       ÈÖ × ÒØ Ð          ÒØÙ Ø Ú Ý Ò ÐÓ      Ð Ö Óи × ÓÑÓ ×Ù ÒØ Ö × Ò Ð Óѹ
   ÔÙØ ÓÒ¸ ר ÑÓ× ÔÖ ×ØÓ× Ô Ö Ò Ö ÓÖÑ ÐÑ ÒØ ÒÙ ×ØÖÓ ×ØÙ Óº

   4.1    Conceptos b´sicos
                     a
    ÓÑ Ò ÑÓ× ÔÓÖ ÙÒ      ¬Ò ÓÒ Ñ Ø Ñ Ø
                  ´
   Definici´n 4.1 (Arbol)
          o                ÍÒ Ö ÓÐ T × ¬Ò ÔÓÖ ÙÒ ÓÒ ÙÒØÓ N          = {n1, n2, . . . , nn}
   ÙÒÓ Ó Ñ × ÒÓ Ó× ÕÙ × Ø × Ò Ð × × Ù ÒØ × ÓÒ ÓÒ ×
     ½º Ü ×Ø ÙÒ ÒÓ Ó ×Ô Ð × Ò Ó Ö Þ(T ) ∈ N º
     ¾º Ð ÓÒ ÙÒØÓ N − {Ö Þ(T )} ÔÙ Ô ÖØ ÓÒ Ö× Ò m Ö ÓÐ × T 1, T 2, . . . , T m Ø Ð ÕÙ
                            {Ö Þ(T )} ∪ T 1 ∪ T 2 ∪ · · · ∪ T m = T
                                        T1 ∩ T2 ∩ · · · ∩ Tm = ∅
4.1. Conceptos b´sicos
                a                                                                  245



           ÙÒÓ ÐÓ× ÓÒ ÙÒØÓ× T 1, T 2, . . . , T m ×ÓÒ “sub´rboles” T º
                                                          a
      Ð ÓÒØ Ò Ó ÙÒ ÒÓ Ó ni ∈ T × Ö ÔÖ × ÒØ ÓÑÓ Ã (ni)¸ Р٠и Ñ ÒÙ Ó¸ × Ð
ÐÐ Ñ Ð Ú º
     Ä ¬ ÙÖ º¿ ÐÙ×ØÖ ÙÒ ÑÔÐÓ ÓÒ Ð Ö Þ × Ð ÒÓ Ó Ø ÕÙ Ø Ó ÓÒ Ð Ð ØÖ A
Ý Ð × Ö × ÐÓ× ×Ù Ö ÓÐ × A ר Ò Ø ÕÙ Ø Ó× ÓÒ B¸ C¸ D Ý E¸ Ö ×Ô Ø Ú Ñ ÒØ º
ÆÓØ ÑÓ× ÕÙ Ð Ö ÓÐ Ù Ó Ò Ð ¬ ÙÖ º¿ ר ÒÚ ÖØ Ó Ð Ö Þ ×Ø Ò Ð Ô ÖØ
×ÙÔ Ö ÓÖ Ý Ð × Ó × Ò Ð Ô ÖØ Ò Ö ÓÖº
      Ú ÒØ Ñ ÒØ ¸ Ü ×Ø ØÓ Ó ÙÒ Ö ÓØ Ò ÐÓ Ó Ô Ö × Ö Ö ÙÒ Ö Óк ÙÒ ÒÓ Ó
   Ö Ø Ñ ÒØ ÓÒ Ø Ó Ð Ö Þ × Ð ÐÐ Ñ                     Óº    Ü Ô ÓÒ Ð Ö Þ¸ ØÓ Ó ÒÓ Ó
Ø Ò ÙÒ “padre”º        Ó ÙÒ ÒÓ Ó ni¸ ÐÐ Ñ Ö ÑÓ× Ô Ö (ni) Ð Ô Ö         ni     Ó×(ni)
  Ð ÓÒ ÙÒØÓ ÓÖÑ Ó ÔÓÖ ÐÓ× Ó× ÒÑ ØÓ× niº Ð Ñ ×ÑÓ ÑÓ Ó¸ Ó ÙÒ ÒÓ Ó n¸
    Ó(n, i) ÒÓØ Ð i¹ × Ñ Ö Ñ nº Ë Ó(n, i) = ∅¸ ÒØÓÒ × n ÒÓ Ø Ò ÙÒ i¹ × Ñ
ÖѺ
       ÙÒ ÒÓ Ó ÕÙ ÒÓ Ø Ò     Ó× × Ð ÐÐ Ñ “hoja”¸ ÔÙ × Ð ÓÖ Þ Ð Ó            ÙÒ Ö ÓÐ
  Ò Ð × ÒØ Ó ÕÙ × ÙÒ Ø ÖÑ Ò ÓÒº
      Ô ÖØ Ð Ö Þ¸ Ð Ö ×ØÓ ÐÓ× ÒÓ Ó× × Ð × ÐÐ Ñ “descendientes” Ð ÒÓ Ó Ö Þ(T )º
                                            A



                   B                C                   D                  E



               F       G            H           I               J          K



          L        M       O        P           Q               R      S       T



                                U       V


                               ÙÖ º¿ ÍÒ Ö ÓÐ                    ÑÔÐÓ

   ÍÒ Ö ÓÐ ÓÒØ Ò ÒÓ Ó× Ý Ö Ó׺ ÍÒ ÒÓ Ó ×Ó ÙÒ Ð Ñ ÒØÓ Ð ÙÒ Ø ÔÓ Ò Ö Ó T º
ÍÒ Ö Ó Ö ÔÖ × ÒØ ÙÒ Ö Ð ÓÒ ÒØÖ ÐÓ× Ó× ÒÓ Ó× ÒÚÓÐÙ Ö Ó׺
     ÒÓÑ Ò Ö ÑÓ× T Ð ÓÒ ÙÒØÓ Ò¬Ò ØÓ ØÓ Ó× ÐÓ× Ö ÓÐ × ÔÓ× Ð ×º
   ÍÒ arborescencia × ¬Ò ÓÑÓ ÙÒ ÓÒ ÙÒØÓ                 ÖÓ Ó Ñ × Ö ÓÐ × × ÙÒØÓ׺
   ÍÒ camino < n0, n1, . . . , nn−1, nn > × ÙÒ × Ù Ò ÓÖÖ ×ÔÓÒ ÒØ ÒÓ Ó× ÒØ Ö¹
 ÓÒ Ø Ó× ÔÓÖ Ö Ó× Ô ÖØ Ò ÒØ × Ð Ö ÓÐ Ø Ð ÕÙ Ó(n0) = n1 | Ó(n1) = n2 | · · · |
  Ó(nn−1) = nnº ÍÒ Ñ ÒÓ × ÒÓØ ÔÓÖ Cn ,n ÓÒ ns × Ð ÒÓ Ó Ò Ó Ð Ñ ÒÓ
                                                s   t
Ý nt × Ð ÒÓ Ó ¬Ò Ð Ð Ñ ÒÓº
   Ä “longitud del camino”¸ ÒÓØ              ÓÑÓ | Cn ,n |¸ × Ð ÒØ
                                                            s   t         ÒÓ Ó× ÕÙ
 ÓÒØ Ò Ð Ñ ÒÓº
246                                                                Cap´        ´
                                                                      ıtulo 4. Arboles



    ÄÓ× “ancestros” ni¸ ÒÓØ Ó ÓÑÓ Ò ×ØÖÓ×(ni)¸ × Ð ÓÒ ÙÒØÓ ÓÒ ÓÖÑ Ó
ÔÓÖ ÐÓ× ÒÓ Ó× Ô ÖØ Ò ÒØ × Ð Ñ ÒÓ CÖ Þ(T),Ô Ö (n ) × Ö¸ Ð × Ù Ò                     ÒÓ Ó×
ÔÖ       ×ÓÖ × × Ð Ö Þ ×Ø niº
                                                      i



         Ó× Ó× ÒÓ Ó× ni, nj ∈ T ¸ ÒØÓÒ ×¸ nj × Ò ×ØÖÓ ni × Ý ×ÓÐÓ × ¸ nj ∈
 Ò ×ØÖÓ×(ni)º
     Ð ÙÒÓ× × ÙÖ×Ó× ÙØ Ð Þ Ò ÙÒ ÒÓ ÓÒ “edad de nodo”¸ Ð Ù Ð ×Ø                    ÔÓÖ ×Ù
ÔÓ× ÓÒ ÒØÖÓ Ð Ñ ÒÓ ×Ù× Ò ×ØÖÓ׺                       ר ÑÓ Ó¸ Ó ÙÒ Ñ ÒÓ Cn ,n =<
                                                                               0   n
n0, n1, . . . , nn−1, nn >¸       ÑÓ× ÕÙ ni × Ñ × Ú Ó ´Ó Ñ ÝÓÖµ ÕÙ Ù ÐÕÙ Ö ni+c ∈
Cn ,n º
  i+1     n      Ð Ñ ×ÑÓ ÑÓ Ó¸ ÑÓ× ÕÙ ni × Ñ × ÓÚ Ò ´Ó Ñ ÒÓÖµ ÕÙ Ù ÐÕÙ Ö ni−c ∈
Cn ,n º
  0     i−1
         Ó ÙÒ ÒÓ Ó ni ∈ Cn ,n =< n0, n1, . . . , nn−1, nn >¸ Ð ÓÒ ÙÒØÓ Ó×(ni) × ÐÐ Ñ Ó
                            0   n
Ð i¹ × Ñ Ò Ö ÓÒº
     Ð “grado” ni ÒÓØ Ó ÓÑÓ Ö Ó(ni)¸ × Ð ÒØ                        ×Ù Ö ÓÐ × ÕÙ ÓÒØ Ò
 Ð ÒÓ Ó niº
     Ð “orden” Ó “grado” ÙÒ Ö ÓÐ × ¬Ò ÓÑÓ Ð ÒÙÑ ÖÓ Ñ Ü ÑÓ Ö Ñ × ÕÙ
ÔÙ Ø Ò Ö Ù ÐÕÙ Ö ÒÓ Ó Ð Ö Óк
    Ë Ð Ö Ó ÙÒ ÒÓ Ó × Ù Ð Ð ÓÖ Ò Ð Ö Óи ÒØÓÒ × ÑÓ× ÕÙ Ð ÒÓ Ó ×Ø
 ÓÑÔÐ ØÓº Ù Ò Ó ÙÒ Ö ÓÐ ÔÓ× ÑÙ Ó× ÒÓ Ó× Ò ÓÑÔÐ ØÓ× Ý ×ØÓ× ÔÓ× Ò ÑÙÝ ÔÓ ×
Ö Ñ ×¸ ÒØÓÒ × ÑÓ× ÕÙ Ð Ö ÓÐ × ×Ô Ö Óº Ð Ñ ×ÑÓ ÑÓ Ó¸ Ù Ò Ó Ý ÑÙ Ó×
ÒÓ Ó× ÓÑÔÐ ØÓ× ÑÓ× ÕÙ Ð Ö ÓÐ × Ò×Óº
     Ð “nivel de un nodo” ni¸ ÒÓØ Ó ÓÑÓ Ò Ú Ð(ni)¸ × ¬Ò Ö ÙÖ× Ú Ñ ÒØ ÓÑÓ
× Ù
                       Ò Ú Ð(ni) = 0 + Ò Ú Ð(Ô Ö (n )) × ni = 0 Þ(T )
                                     1                    × n >
                                                                Ö
                                                  i          i

    Ä “altura de un nodo” ni¸ ÒÓØ        ÓÑÓ h(ni) × ¬Ò ÓÑÓ Ð ÒÙÑ ÖÓ ÒÓ Ó×
Ñ ÒÓ× ÙÒÓ ÕÙ Ý × ni ר ÙÒ Ó × ØÙ                       Ò Ð Ñ × ÐØÓ Ò Ú Ðº
    Ì Ñ Ò ÔÙ         ¬Ò Ö× Ö ÙÖ× Ú Ñ ÒØ ÓÑÓ × Ù
   h(ni) =
              0                                                     × ni × ÙÒ Ó
              1 + Ñ Ü(h( Ó1(ni)), h( Ó2(ni)), . . . , h( Óm(ni)))      ÐÓ ÓÒØÖ Ö Ó
    Ä “altura de un ´rbol” T × ¬Ò ÓÑÓ Ð ÐØÙÖ Ö Þ(T ) × Ö¸ h(Ö Þ(T ))º
                      a
    Ä “cardinalidad de un ´rbol” T ¸ ÒÓØ
                             a                      ÓÑÓ |T |¸ × ¬Ò ÔÓÖ Ð ÒÙÑ ÖÓ ØÓØ Ð
   ÒÓ Ó× Ð Ö Óк
    ÁÐÙ×ØÖ Ö ÑÓ× Ð ÙÒÓ×     רÓ× ÓÒ ÔØÓ× Ñ ÒØ Ð ¬ ÙÖ º¿º Ä Ö Þ × Ð ÒÓ Ó
 Ø ÕÙ Ø Ó ÓÒ A Ý ×Ø × ØÙ         Ò Ð Ò Ú Ð 0º Ð Ö Ó Ö Þ(T ) × 4¸ ÕÙ Ø Ñ Ò
 ÓÖÖ ×ÔÓÒ Ð ÓÖ Ò Ð Ö Óк ÄÓ× Ó× A ×ÓÒ B¸ C¸ D Ý Eº Ô Ö (B) = Ô Ö (C) =
Ô Ö (D) = Ô Ö (E) = Aº Ä ÐØÙÖ A × 5¸ ÕÙ ÓÖÖ ×ÔÓÒ Ð ÐÓÒ ØÙ Ð Ñ ÒÓ
Ñ × Ð Ö Ó × Aº Ì Ð Ñ ÒÓ ×Ø           Ó ÔÓÖ CA,U = A, C, H, P, U Ó CA,V = A, C, H, P, V |
|CA,V | = 5º
        ÓÖ ÓÒ× Ö ÑÓ× ÙÒ ÒÓ Ó Ô ÖØ ÙÐ Ö¸ ÔÓÖ ÑÔÐÓ Hº Ì Ò ÑÓ×
    ¯ Ö Ó(H) = 3

    ¯ Ô Ö (H) = C

      ¯ h(H) = 3 = |CH,U| = |CH,V |

         Ö Ø × ÓÒ ×Ø Ø ÖÑ ÒÓÐÓ        ÓÒ× Ö Ò Ó           ÒÓ Ó   Ð ¬ ÙÖ º¿º
4.2. Representaciones de un arbol
                            ´                                                    247



4.2     Representaciones de un ´rbol
                               a
ÌÖ ÓÒ ÐÑ ÒØ ¸ רÓ× Ö ÓÐ × ×ØÖ ØÓ× × Ù Ò Ð Ö Ú × ÐÓ× Ò ØÙÖ Ð ×¸ ÓÑÓ Ò Ð
¬ ÙÖ º¿º × Ö¸ Ð Ö Þ Ò Ð Ô ÖØ ×ÙÔ Ö ÓÖ Ý ×Ù× × Ò ÒØ × Ò Ð × Ô ÖØ × Ò Ö ÓÖ ×º
 ר Ö ÔÖ × ÒØ ÓÒ × ÓÒ Ò Ð Ñ ÝÓÖ           Ð × × ØÙ ÓÒ ×¸ Ô ÖÓ Ð ÙÒÓ× ÔÖÓ Ð Ñ × ×
ÔÖ ×Ø Ò Ô Ö ÓØÖ × Ö ÔÖ × ÒØ ÓÒ × Ñ × ÓÒÚ Ò ÒØ ׺
4.2.1   Conjuntos anidados


                                    Ä Å

                        Ã Ë Ì                    Í Î
                                           À      È
                                                Ç   É

                                    Â Ê            Á


                             ÙÖ º     ÓÒ ÙÒØÓ× Ò         Ó×

     Ò ×Ø Ö ÔÖ × ÒØ ÓÒ Ð Ö Þ × ÙÒ ÓÒ ÙÒØÓ ÒÓÑ Ö Ö Þ(T ) ÓÒ ×Ù Ö ÓÐ × ÓÑÓ
×Ù ÓÒ ÙÒØÓ׺ ÈÓÖ ÑÔÐÓ¸ Ð ¬ ÙÖ º ÐÙ×ØÖ Ð ÕÙ Ú Ð ÒØ Ò ÓÒ ÙÒØÓ× Ò Ó× Ð
 Ö ÓÐ Ð ¬ ÙÖ º¿º
     ר Ö ÔÖ × ÒØ ÓÒ ÔÙ ÙÒ Ñ ÒØ Ö× ×Ó Ö ×ØÖÙ ØÙÖ ×      ØÓ× ×Ô Ð Þ × Ò
 ÓÒ ÙÒØÓ׺
4.2.2   Secuencias parentizadas
ÄÓ× ÓÒ ÙÒØÓ× Ò Ó× ÒÓÖ Ò Ð ÓÖ Ò Ô Ö ÓÒ                   ÐÓ× ×Ù Ö ÓР׸ Ð Ù Ð Ò Ð ÙÒ ×
× ØÙ ÓÒ × ÔÙ × Ö ÑÔÓÖØ ÒØ º Ë × × Ñ ÒØ Ò Ö             ר ÓÖ Ò¸ ÙÒ Ö ¬Ò Ñ ÒØÓ ÓÒ× ×Ø
 Ò Ö ÔÖ × ÒØ Ö ÐÓ× ÓÒ ÙÒØÓ× ÒØÖ Ô Ö ÒØ × ×º Ò ×Ø        ×Ó¸ Ð ×Ó Ø Ú      Ö ÔÖ × ÒØ Ð
ÓÖ Ò       Ô Ö ÓÒ ÐÓ× ×Ù Ö ÓР׺ È Ö Ð Ö ÓÐ              Ð × ¬ ÙÖ × º¿ Ý º ¸ × Ø Ò Ð
× Ù ÒØ Ö ÔÖ × ÒØ ÓÒ Ô Ö ÒØ Þ
         (A(B(F(L)(M))(G))(C(H(O)(P(U)(V))(Q)))(D(I)(J(R)))(E(K(S)(T ))))

ר Ö ÔÖ × ÒØ ÓÒ Ø Ò Ð Ú ÒØ  ÕÙ × Ð Ò Ð Ý Ö ­ ÓÒ Ü Ø ØÙ Ð ØÓÔÓÐÓ
 Ð Ö Óк
   ÓÒ× Ö ÑÓ× Ð Ú ÐÙ ÓÒ ÙØÓÑ Ø      ÜÔÖ × ÓÒ × Ð Ö ×º ÓÑÓ ÑÔÐÓ¸
×ÙÑ ÑÓ× Ð ÜÔÖ × ÓÒ Ð Ö
                              3x4 + 3x3y2 + x2 − 1
                                                   .
                                      4x2z
   ÍÒ ÓÑÔ Ð ÓÖ ÔÓ Ö ØÖ Ù Ö ×Ø ÜÔÖ × ÓÒ Ð Ö ÓÐ Ð ¬ ÙÖ º ¸ Ð Ù Ð
Ú ÐÙ Ö× Ñ Ò Ö × Ò ÒØ Ó × ¸ × Ð × Ó × ×Ø Ð Ö Þº ר ÓÖ Ò Ö ­
248                                                                          Cap´        ´
                                                                                ıtulo 4. Arboles



                                                                     /



                                           +                                                   ∗



      ∗                             ∗                            ^           −1       4       ^          z



3         ^          3        ^                    ^         x           2                x          2



      x         4         x        3           y       2



                         ÙÖ º       Ö ÓÐ       Ð ÜÔÖ × ÓÒ Ò¬     3x4 +3x3 y2 +x2 −1
                                                                       4x2 z




¬ ÐÑ ÒØ Ð × ÔÓ× Ð × Ý Ú Ð × Ñ Ò Ö × Ò ÕÙ Ð ÜÔÖ × ÓÒ ÔÙ         Ú ÐÙ Ö× × Ò ÕÙ ×
Ô Ö ×Ù × ÒØ Ó Ð Ö Óº
      Ò Ñ Ø Ñ Ø ¸ Ð ÓÑÔÓ× ÓÒ ÙÒ ÓÒ × ×Ù Ð × Ö Ö× Ñ Ò Ö ÔÖ ¬ × Ö¸
 Ð ÒÓÑ Ö Ð ÙÒ ÓÒ Ù ÓÔ Ö ÓÒ ÔÖ ¬ ¸ ÒØ                ¸ ÐÓ× ÓÔ Ö Ò Ó׺ ÈÓÖ ÑÔÐÓ¸
f(x, y) Ö ÔÖ × ÒØ ÙÒ ÙÒ ÓÒ f ÓÒ Ó× ÓÔ Ö Ò Ó׺ Ç ÙÖÖ ÕÙ Ð × Ù Ò Ô Ö ÒØ Þ
ÙÒ Ö ÓÐ ÜÔÖ × ÓÒ × × ÔÖ ¬ º Ò Ð Ó ÙÖÖ Ò ¸ Ð Ö ÓÐ Ð ¬ ÙÖ º × Ö ÔÖ × ÒØ
 ÓÑÓ
     ´»´·´¶´¿µ ´ ´Üµ´ µµ µ ´¶´¿µ ´ ´Üµ´¿µµ ´ ´Ýµ´¾µµ µ ´ ´Üµ´¾µµ ´ ¹½ µµ ´¶ ´ µ ´ ´Üµ´¾µ µ ´Þµ µ µ
Ä ÐÒ Ð         Ð Ö ÔÖ × ÒØ ÓÒ Ô Ö ÒØ Þ ÔÙ ÙØ Ð Þ Ö× Ô Ö Ð ØÖ Ò×Ñ × ÓÒ
 Ö ÓÐ × Ò ÙÒ Ö º Ð × Ø Ó ÓÖ Ò Ð ÓÑÙÒ ÓÒ Ó Ø Ò ÙÒ Ö ÔÖ × ÒØ ÓÒ Ô Ö ÒØ ¹
Þ ÕÙ × Ñ Ð Ò ÙÒ Ñ Ò× º Ð Ö Ö Ð Ö ÓÐ Ô Ö ÒØ Þ Ó¸ Ð × Ø Ó ×Ø ÒÓ Ö Ð Þ
Ð ØÖ Ò× ÓÖÑ ÓÒ ÒÚ Ö× ¹ × Ñ Ð ¹ Ý Ó Ø Ò ÙÒ ÓÔ Ü Ø Ð Ö Óк
     Ò Ð Ñ ÝÓÖ     ÐÓ× Ð Ò Ù × ÔÖÓ Ö Ñ ÓÒ¸ Ò ÖØ ÐÙ Ó× Ð ØÖÓÒ Ó×     Ð ÙÐÓ
ݸ Ò Ò Ö Ð¸ Ò Ð Ò Ò Ö ¸ Ð × ÜÔÖ × ÓÒ × × ÓÐÓ Ò Ò ÓÖÑ Ò¬ Ý ÐÓ× Ô Ö ÒØ × ×
× ÓÐÓ Ò Ò ÓÒ ÕÙ Ö ÑÓ× ÑÓ ¬ Ö Ð ÔÖ        Ò     ÐÓ× ÓÔ Ö ÓÖ ×º   ר ÑÓ Ó¸
Ð ÜÔÖ × ÓÒ ÒØ Ö ÓÖ ÔÓ Ö × Ö Ö× Ò ÓÖÑ Ò¬ ÓÑÓ
    (3*x^4 + 3*x^3*y^2 + x^2 - 1)/ (4*x^2*z)

   Ä Ù Ð × Ð Ú Ö× ÓÒ Ö ×ÙÑ     Ð ÜÔÖ × ÓÒ Ò¬ ÓÖÖ ×ÔÓÒ ÒØ Ð Ö ÓÐ Ð
¬ ÙÖ º º Ä ÜÔÖ × ÓÒ Ò¬ × ÙÒ Ö ÔÖ × ÒØ ÓÒ Ð Ò Ð Ð Ö ÓÐ Ý Ö ÕÙ Ö Ð Ù×Ó
Ô Ö ÒØ × × Ô Ö ×Ô ¬ Ö Ð ÓÖ Ò    Ô Ö ÓÒ ÐÓ× ÒÓ Ó× Ü Ø Ñ ÒØ      Ð Ñ ×Ñ
Ñ Ò Ö Ò ÕÙ          Ö× ÓÒ Ð ÔÖ    Ò Ò Ð × ÜÔÖ × ÓÒ × Ð Ö ×º
4.2. Representaciones de un arbol
                            ´                                                 249



4.2.3   Indentaci´n
                 o
ÍÒ Ñ Ò Ö ÓÒÚ Ò ÒØ Ý Ö Ø Ô Ö Ù Ö Ö ÓÐ × Ô ÕÙ ÒÓ׸ Ò Ð Ù Ð ÒÓ × Ô Ö
Ð ×ØÖÙ ØÙÖ ¸ ÓÒ× ×Ø Ò Ò ÒØ Ö ÔÓÖ Ò Ú Ðº Ä × ÜÔÐ Ñ ÒØ Ð × Ù ÒØ
 Ð ÓÖ ØÑÓ
Algoritmo 4.1 (Dibujo de un ´rbol en modo texto)
                            a                         Ä ÒØÖ      Ð Ð ÓÖ ØÑÓ × ÙÒ
Ö ÓÐ Ò ×Ù Ö ÔÖ × ÒØ ÓÒ Ö ¬ Ð × º Ä × Ð            × Ð Ö ÔÖ × ÒØ ÓÒ Ò ÒØ        Ð
Ö Óк
    Ð Ð ÓÖ ØÑÓ Ø Ò ÙÒ Ô Ö Ñ ØÖÓ ÐÐ Ñ Ó s¸ ¬Ò Ó ÓÑÓ Ð ÒÙÑ ÖÓ           ×Ô Ó× Ò
Ð Ò Ó × Ô Ö ÓÒ ÓÖ ÞÓÒØ к
    Ð Ð ÓÖ ØÑÓ × Ö ÙÖ× ÚÓ ÓÒ ÔÖÓØÓØ ÔÓ void dibujar(Node * x)º Ä ÔÖ Ñ Ö ÐÐ Ñ
         ÙØ Ö× ÓÒ Ð Ö Þ pº
  ½º ÁÑÔÖ Ñ Ö pº
  ¾º ∀y ∈ Ó×(x)
      ´ µ ÁÒ ÒØ Ö s ×Ô Ó×        Ð Ö º
      ´ µ dibujar(y);
      ´ µ ÁÒ ÒØ Ö s ×Ô Ó×        Ð ÞÕÙ Ö º
  ¿º Ë x × ÙÒ Ó =⇒
      ´ µ Ë ÐØ Ð Ò º
    Ð Ö ÓÐ Ð × ¬ ÙÖ × º¿ Ý º Ø Ò Ð × Ù ÒØ Ö ÔÖ × ÒØ ÓÒ Ò ÒØ
        A       B       F       L
                                M
                        G
                C       H       O
                                P       U
                                        V
                                Q
                D       I
                        J       R
                E       K       S
                                T



4.2.4   Notaci´n de Deway
              o
Ä ×ØÖÙ ØÙÖ ÓÒ Ý ÓÒØ Ò Ó ×Ø Ø ÜØÓ Ò Ô ØÙÐÓ׸ × ÓÒ ×¸ Ø Ø Ö ¸ × ÓÖÖ ×ÔÓÒ
 ÓÒ ÙÒ Ö ÓÖ × Ò Ò Ð Ù Ð ÐÓ× Ô ØÙÐÓ× ×ÓÒ Ö ÓÐ × × ÙÒØÓ׺ Ä × × ÓÒ × ÙÒ
  Ô ØÙÐÓ ×ÓÒ ÐÓ× ×Ù Ö ÓÐ × Ð Ö Þ Ý¸ Ð Ú Þ¸ Ð × ×Ù ¹× ÓÒ × ×ÓÒ ÐÓ× ×Ù Ö ÓÐ × ÙÒ
× ÓÒº ר רÖÙ ØÙÖ ÓÒ Ó             ÙÒ Ö ÖÕÙ × ÙÒ Ð Ö             ×ØÙ Óº ÈÙ × Ò¸
 Ð Ò ÓÕÙ ÙØ Ð Þ Ó Ô Ö ÒÙÑ Ö Ö         × ÓÒ ÓÒר ØÙÝ ÙÒ Ñ Ò Ö           Ö ÔÖ × ÒØ Ö
ÙÒ Ö Óк Ð Ñ ØÓ Ó Ò Ù ×Ø ÓÒ × ÒÓÑ Ò “notaci´n decimal de Deway”¸ ÔÓÖ
                                                      o
 Ò ÐÓ      ÙÒ ÒÓØ ÓÒ × Ñ Ð Ö Ù× Ô Ö Ð × ¬ Ö Ð ÖÓ× Ò Ð ÓØ ׺ × Ñ ÒØ ¸
Ð ÒÓØ ÓÒ           Û Ý × ÙÒ Ñ Ò Ö     ÒÙÑ Ö Ö       ÒØ ¬ Ö ÙÒ ÚÓ Ñ ÒØ        ÒÓ Ó
250                                                                               Cap´        ´
                                                                                     ıtulo 4. Arboles



  Ð Ö Óк Ð Ö ÓÐ          Ð × ¬ ÙÖ × º¿ Ý º ÔÙ                Ö ÔÖ × ÒØ Ö× Ñ             ÒØ ÐÓ× × Ù ÒØ ×
ÒÙÑ ÖÓ×     ÛÝ
             (1 : A), (1.1 : B), (1.2 : C), (1.3 : D), (1.4 : E), (1.1.1 : F), (1.1.2 : G),
          (1.2.1 : H), (1.3.1 : I), (1.3.2 : J), (1.4.1 : K), (1.1.1.1 : L), (1.1.1.2 : M),
               (1.2.1.1 : O), (1.2.1.2 : P), (1.2.1.3 : Q), (1.3.2.1 : R), (1.4.1.1 : S),
                                          (1.4.1.2 : T ), (1.2.1.2.1 : U), (1.2.1.2.2 : V)


     Ð Ú ÐÓÖ Ò Ó Ð ÒÓØ ÓÒ            Û Ý × ÕÙ × ÔÖ × ÖÚ ÒØ Ö Ñ ÒØ Ð ÓÖÑ
   Ð Ö ÓÐ × Ò Ò ×        Ùר Ö× ÙÒ ÓÖ Ò × Ù Ò º Ð Ö ÓÐ ÔÙ Ö ×Ø ÙÖ Ö×
 Ò Ô Ò ÒØ Ñ ÒØ Ð ÓÖ Ò Ò ÕÙ × ÔÖ × ÒØ Ò ÐÓ× ÒÓ Ó׺
    ÍÒ Ö ÔÖ × ÒØ ÓÒ ×        Ò Ð ÒÓØ ÓÒ       Û Ý ÔÙ × Ö ÑÙÝ ÙØ Ð Ò Ð ÙÒ ×
× ØÙ ÓÒ × ÓÒ Ð ÓÒרÖÙ ÓÒ Ð Ö ÓÐ × ÐØ Ñ ÒØ Ò Ñ º Ì Ñ Ò ÔÙ                 ¹
 Ù Ö× Ô Ö Ð ØÖ Ò×Ñ × ÓÒ Ö ÑÓØ      Ö ÓÐ × ÑÙÝ Ö Ò × ÕÙ ÒÓ Ø Ò Ò       Ò ÙÒ
×ÓÐÓ Ñ Ò× º

4.3     Representaciones de ´rboles en memoria
                            a
    × Ñ ÒØ ¸ Ü ×Ø Ò Ó× Ñ Ò Ö × Ö ÔÖ × ÒØ Ö ÙÒ Ö ÓÐ Ò Ñ ÑÓÖ ÔÓÖ ÖÖ ÐÓ× Ý ÔÓÖ
Ð ×Ø × ÒÐ Þ ×º Ñ × Ö ÔÖ × ÒØ Ò ÙÒ ÒØ ÖÑ Ó ÒØÖ Ú ÐÓ       Ý ×Ô Óº
4.3.1   Listas enlazadas
 Ò ×Ø Ö ÔÖ × ÒØ ÓÒ¸              ÒÓ Ó × ×ØÖÙ ØÙÖ × ÙÒ Ð ÓÖÑ × Ù ÒØ
                                         clave                  R SIBLING

                                                   L CHILD

 ÙÝÓ× ÑÔÓ×        ÒØ Ö × ×ÓÒ
   ¯ R SIBLING ÔÙÒØ ÓÖ Ð ÒÓ Ó ÓÖÖ ×ÔÓÒ ÒØ Ð          ÖÑ ÒÓ Ö Óº
   ¯ L CHILD ÔÙÒØ ÓÖ ×Ù        Ó Ñ × Ð ÞÕÙ Ö º
   ÄÓ× ÑÔÓ× R SIBLING ÓÒ ÓÖÑ Ò ÙÒ Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ              ÖÑ ÒÓ׺ Ä
       Ö     ר Ð ×Ø × Ð ÒÓ Ó Ñ × Ð ÞÕÙ Ö º Ä ÒØÖ           ר Ð ×Ø × Ð ÑÔÓ
L CHILD Ð ÒÓ Ó Ô Ö º
   ÄÓ× ÑÔÓ× L CHILD ÓÒ ÓÖÑ Ò ÙÒ Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ           Ò Ö ÓÒ ×º     Ó
ÙÒ ÒÓ Ó x¸ L CHILD(x) × ×Ù Ó Ñ × Ð ÞÕÙ Ö L CHILD(L CHILD(x)) × Ð Ò ØÓ
Ñ × Ð ÞÕÙ Ö          x L CHILD(L CHILD(L CHILD(x))) × Ð ÞÒ ØÓ Ñ × Ð ÞÕÙ Ö
   x Ý × ×Ù × Ú Ñ ÒØ Ô Ö Ð Ö ×ØÓ      Ð × Ò Ö ÓÒ ×º
      Ñ ÒÙ Ó¸ Ð Ó Ñ × Ð ÞÕÙ Ö            ÙÒ ÒÓ Ó × Ð Ø Ð   ÔÖ ÑÓ Ò ØÓ º
   Ä ¬ ÙÖ º ÐÙ×ØÖ Ð Ö ÔÖ × ÒØ ÓÒ ÓÒ Ð ×Ø × Ð Ö ÓÐ ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ º º
   Ë ÒÓ Ý Ñ × ÖÑ ÒÓ× Ó Ò Ö ÓÒ ×¸ ÒØÓÒ × Ð ÔÙÒØ ÓÖ ÓÖÖ ×ÔÓÒ ÒØ ×
Ñ Ö ÓÒ Ð Ú ÐÓÖ ×Ô Ð NULLº
     ר Ö ÔÖ × ÒØ ÓÒ × ÓÑÔ Ø Ý ­ Ü Ð ¸ ÔÙ × Ð ÓÖ Ò Ý Ö Ò Ð              Ð Ö ÓÐ
ÔÙ       ÙÑ ÒØ Ö× Ó ×Ñ ÒÙ Ö× Ò Ñ Ñ ÒØ º Ð ×Ô Ó Ó ÙÔ Ó ÔÓÖ              ÒÓ Ó ×
4.3. Representaciones de arboles en memoria
                         ´                                                         251



/

+                                                                       *

*                     *                                  ^      -1      4     ^          z

3       ^             3      ^             ^             x      2              x         2

        x      4             x      3      y      2




               ÙÖ º Ê ÔÖ × ÒØ ÓÒ ÓÒ Ð ×Ø × Ð Ö ÓÐ            Ð ¬ ÙÖ º

 ÓÒר ÒØ Ò Ô Ò ÒØ Ð ÓÖ Ò Ð Ö ÓÐ Ý Ð Ö Ó Ð ÒÓ Óº Ð ×Ô Ö Ó Ò
ÒÓ Ó× Ò ÓÑÔÐ ØÓ× ´ÔÓÖ Ð × Ö Ñ × ÒÓ ÙØ Ð Þ ×µ × Ô ÕÙ ÒÓ R SIBLING Ò Ð ÒÓ Ó Ñ ×
Ð Ö                Ð ×Ø       ÖÑ ÒÓ׸ Ý L CHILD Ò Ð ÙÐØ ÑÓ × Ò ÒØ               Ð ×Ø
     Ò Ö ÓÒ ×º
    ÈÖ         Ö ÙÒ ÒÓ Ó Ð i¹ × Ñ Ò Ö ÓÒ × Ò × Ö Ó                  Ö Ð × i−1 Ò Ö ¹
  ÓÒ × ÒØ Ö ÓÖ ×º È Ö        Ö Ð j¹ × ÑÓ ÖÑ ÒÓ¸ × Ò × Ö Ó         Ö ÐÓ× j − 1 ÖÑ ÒÓ×
ÔÖ      ÒØ ׺ Ë Ð ÓÖ Ò Ð Ö ÓÐ × ÓÒÓ Ó¸ ÒØÓÒ × Ð Ø ÑÔÓ                  ×Ó ×Ø ÓØ Ó
Ý ÔÓÖ ÐÓ Ø ÒØÓ ÔÙ      ÓÒ× Ö Ö× ÓÒר ÒØ º
    Ä Ú Ö× Ø Ð          Ð ×ØÖÙ ØÙÖ ÔÙ Ñ ÓÖ Ö× × × ÙØ Ð Þ Ò Ð ×Ø × Ó Ð Ñ ÒØ Ò¹
Ð Þ ×º ÅÙ Ó× Ð ÓÖ ØÑÓ× ÕÙ Ö ÕÙ Ö Ò Ö Ö × Ö ×Ù× Ò ×ØÖÓ× ÔÙ Ò Ò ¬ Ö×
 ר ÜØ Ò× ÓÒº        Ó ÙÒ ÒÓ Ó¸ ÙÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ Ô ÖÑ Ø Ö ÙÔ Ö Ö ÒÑ ¹
   Ø Ñ ÒØ Ð Ô Ö º Ð ÒÐ           Ó Ð ×Ø        Ó ÔÓÖ Ð ÔÙÒØ ÖÓ Ð Ó Ñ × Ð ÞÕÙ Ö
Ý Ð ÔÙÒØ ÖÓ Ð Ô Ö º Ð Ñ ×ÑÓ ÑÓ Ó¸ Ð Ð ×Ø ÒÐ Þ ÔÙ × Ö ÐÓ× ÖÑ ÒÓ׸
 Ò ÙÝÓ ×Ó Ð ÒÐ           Ó Ð ×Ø       Ó ÔÓÖ ÐÓ× ÔÙÒØ ÖÓ× Ð ÖÑ ÒÓ ÞÕÙ Ö Ó Ý Ö Ó¸
Ö ×Ô Ø Ú Ñ ÒØ º

4.3.2   Arreglos
    Ó ÙÒ Ö ÓÐ ÓÖ Ò m¸          ÒÓ Ó ÓÒØ Ò Ð ×Ô Ó Ô Ö Ð ØÓ Ý ÙÒ ÖÖ ¹
 ÐÓ m¹ Ñ Ò× ÓÒ Ð     ÔÙÒØ ÓÖ × ×Ù× m ×Ù Ö ÓР׺ Ð Ú ÐÓÖ NULL Ò Ð Ù× Ò
   Ð Ö Ñ ÓÖÖ ×ÔÓÒ ÒØ º
     ר Ö ÔÖ × ÒØ ÓÒ Ø Ò ÙØ Ð Þ Ö Ñ × ×Ô Ó ÕÙ Ð × Ð ×Ø × ÒÐ Þ ×º Ð ×Ô Ö Ó
   Ñ ÑÓÖ Ò ÒÓ Ó× Ò ÓÑÔÐ ØÓ× ÔÙ × Ö ÑÔÓÖØ ÒØ × Ð Ö ÓÐ × ÑÙÝ ×Ô Ö Óº Ò
Ð Ó ÙÖÖ Ò ¸ Ò Ð Ö ÓÐ ÓÖ Ò 4 Ù Ó Ò Ð ¬ ÙÖ º ¸ ×ÓÐÓ ÙÒ ÒÓ Ó ×Ø ÓÑÔÐ ØÓ
 ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð Ö ×ØÓ ÐÓ× ÒÓ Ó× Ò ÓÑÔÐ ØÓ× ×Ô Ö         Ð Ñ ÒÓ× ÙÒ Ð Ò
ÔÙÒØ ÖÓ× ÒÙÐÓ׺
    Ä Ö ÔÖ × ÒØ ÓÒ × ×Ø Ø Ò Ð × ÒØ Ó ÕÙ Ð ÓÖ Ò Ð Ö ÓÐ ÒÓ × Ð
ÑÓ ¬ Öº ר Ò ÓÕÙ ÒÓ × ÓÒÚ Ò ÒØ Ô Ö ÓÒרÖÙ Ö ÙÒ Ö ÓÐ ÓÖ Ò × ÓÒÓ Óº
  Ò ÑÙ Ó× ×Ó׸ × ÓÒÚ Ò ÒØ       ØÙ Ö Ð ÓÒרÖÙ ÓÒ ÓÒ Ð Ö ÔÖ × ÒØ ÓÒ Ð ×Ø ×
 ÒÐ Þ × Ý ÐÙ Ó ÓÒÚ ÖØ ÖÐÓ Ð Ö ÔÖ × ÒØ ÓÒ Ú ØÓÖ Þ º
     Ð    ×Ó ÙÒ Ò Ö ÓÒ × ÕÙ Ú Ð ÒØ Ð Ð × Ð ×Ø × ÒÐ Þ ×¸ Ô ÖÓ Ð ×Ó
 Ù ÐÕÙ Ö Ð × Ö Ñ × × Ö ØÓ ר Ö Ø Ö ×Ø × Ð ÕÙ                  ר Ö ÔÖ × ÒØ ÓÒ
Ñ × Ö Ô ÕÙ ×Ù ÓÒØÖ Ô ÖØ ÓÒ Ð ×Ø × ÒÐ Þ ×º
252                                                                                      Cap´        ´
                                                                                            ıtulo 4. Arboles



                                                                    /




                                          +                                                 *



       *                              *                ^           -1           4           ^       Þ


 3          ^             3       ^             ^           Ü           2           x           2


       x         4            x           3             y          2


                     ÙÖ º Ê ÔÖ × ÒØ ÓÒ ÓÒ ÖÖ ÐÓ× Ð Ö ÓÐ                                 Ð ¬ ÙÖ º

   ÍÒ ÐØ ÖÒ Ø Ú Ô Ö ×Ø Ò ÓÕÙ × ÙØ Ð Þ Ö ÙÒ ÖÖ ÐÓ Ô Ö × <ÔÙÒØ ÖÓ Ö Ñ ¸ ÓÖ¹
  Ò Ð Ö Ñ >º ר ×ÕÙ Ñ ÙØ Ð Þ ÙÒ ×Ô Ó ÔÓÖ ÒÓ Ó ÔÖÓÔÓÖ ÓÒ Ð Ð ÒÙÑ ÖÓ
Ö Ñ × Ý ÔÙ     Ò Ö ×Ô Ó × Ð Ö ÓÐ × ×Ø ÒØ ×Ô Ö Óº Ë Ð ÒÙÑ ÖÓ Ö Ñ × ×
×Ù× ÔØ Ð × Ö ÑÙÝ Ö Ò ¸ Ð ÖÖ ÐÓ ÔÙ        ר Ö ÓÖ Ò Ó ÔÓÖ ÓÖ Ò Ð Ö Ñ Ý Ð
Ö Ñ ÔÙ × Ö ÐÓ Ö ØÑ Ñ ÒØ ÐÓ Ð Þ Ð Ñ ÒØ Ð Ù×ÕÙ             Ò Ö º ×ØÓ Ô Ò Ð Þ
  Ð Ò× Ö ÓÒ Ý Ð Ð Ñ Ò ÓÒ¸ ÔÙ × Ý ÕÙ Ö Ö Ý ÖÖ Ö Ö × Ò Ð ÖÖ ÐÓº

4.4        ´
           Arboles Binarios
   ÓÖ ÔÖÓ Ö ÑÓ× ×ØÙ Ö ÙÒ Ð × ×Ô Ð     Ö ÓÐ ÒÓÑ Ò       Ö ÓÐ Ò ¹
Ö Ó º Ð Ö ÓÐ Ò Ö Ó × Ð × ÓÒ ÔØÙ Ð ÙÒ ÑÔÐ   Ñ     Ð ÓÖ ØÑÓ× Ý ×¹
ØÖÙ ØÙÖ ×   ØÓ׺
Definici´n 4.2 (Arbol binario) ÍÒ Ö ÓÐ Ò Ö Ó T × ÙÒ ÓÒ ÙÒØÓ ¬Ò ØÓ
       o       ´                                                                                    ÖÓ Ó Ñ ×
ÒÓ Ó× ¬Ò Ó Ö ÙÖ× Ú Ñ ÒØ ÓÑÓ × Ù
      ⎧
      ⎪
      ⎪
      ⎪
                      ∅                   ÒÓØ       Ð Ö ÓÐ ⎧ Ö Ó Ú Ó
                                                           Ò
      ⎪
      ⎨                                                     ⎪ n
                                                            ⎪
                                                            ⎨                            × Ð ÒÓ Ó Ö Þ
T=
      ⎪ < Ä(T ), Ö
      ⎪              Þ(T ), Ê(T ) >       ÐÓ ÓÒØÖ Ö Ó |         Ä(T )       × Ð ×Ù Ö ÓÐ Ò Ö Ó ÞÕÙ Ö Ó
      ⎪
      ⎪                                                     ⎪
                                                            ⎪
      ⎩                                                     ⎩   Ê(T )        × Ð ×Ù Ö ÓÐ Ò Ö Ó Ö Ó
                                                                                                        ´ º½µ

      Ð ÓÒØ Ò Ó ÙÒ ÒÓ Ó ni × ÒÓØ ÓÑÓ Ã (ni)º
       ÒÓÑ Ò Ö ÑÓ× B Ð ÓÒ ÙÒØÓ Ò¬Ò ØÓ ØÓ Ó× ÐÓ× Ö ÓÐ × Ò Ö Ó× ÔÓ× Ð ×º
    Ä     ¬Ò ÓÒ       Ö ÓÐ Ò Ö Ó ×       Ö ÒØ     Ð    ¬Ò ÓÒ        Ö ÓÐ
 Ò Ü º½ ´Ô Ò ¾ µº Ä ×Ø Ò ÓÒ Ð Ö Ð Þ Ð ÒÓ ÓÒ × ÒØ Ó Ð Ö Ñ º Ò Ð Ó Ù¹
ÖÖ Ò ¸ ÐÓ× Ö ÓÐ × Ò Ö Ó× ÐÙ×ØÖ Ó× Ò Ð ¬ ÙÖ º ×ÓÒ Ö ÒØ × Ó Ð ¬Ò ÓÒ º¾
 ÑÔ ÖÓ¸ Ó Ð ¬Ò ÓÒ º½¸ ÐÐÓ× ×ÓÒ Ù Ð ×º ר            ÖÒ      × ÒØ Ó ×¸ ÔÖ × ¹
Ñ ÒØ ¸ Ð Ö Ø Ö ×Ø ÕÙ ÒÓ× Ö ÒØ Þ Ö ÙÒ ÓÖÖ ×ÔÓÒ Ò ÙÒ ÚÓ ÒØÖ ÙÒ Ö ÓÐ
´
4.4. Arboles Binarios                                                         253



 Ò Ö Ó Ý ÙÒÓ m¹Ö Ó Ù ÐÕÙ Ö º




                            ÙÖ º   Ó× Ö ÓÐ × Ò Ö Ó×        Ö ÒØ ×


4.4.1   Representaci´n en memoria de un ´rbol binario
                    o                   a
ÄÓ× Ö ÓÐ × Ò Ö Ó× × Ö ÔÖ × ÒØ Ò Ò Ñ ÑÓÖ ÓÒ ÖÖ ÐÓ׺ Ë Ò Ñ Ö Ó¸ ÔÙ ×ØÓ ÕÙ
Ð Ñ Ò× ÓÒ Ð ÖÖ ÐÓ × Ó׸ Ð Ö ÔÖ × ÒØ ÓÒ × ÔÖ Ø Ñ ÒØ Ð Ñ ×Ñ ÕÙ ÓÒ
Ð ×Ø × ÒÐ Þ ×º Ä ¬ ÙÖ º ÐÙ×ØÖ ÙÒ ÑÔÐÓº
                                        G

                              S                       X

                        B          H          A              Z


                ÙÖ º Ê ÔÖ × ÒØ ÓÒ Ò Ñ ÑÓÖ                 ÙÒ Ö ÓÐ Ò Ö Ó

   Ú ÒØÙ ÐÑ ÒØ ¸ ÔÙ         ÓÒÚ Ò Ö ÙÒ Ø Ö Ö ÔÙÒØ ÖÓ ÔÓÖ ÒÓ Ó ÓÖÖ ×ÔÓÒ ÒØ Ð ÒÓ Ó
Ô Öº
4.4.2   Recorridos sobre ´rboles binarios
                         a
ÄÓ× Ö ÓÐ × Ý ÐÓ× Ö ÓÐ × Ò Ö Ó× Ö ÔÖ × ÒØ Ò ÓÖ Ò × Ö ÖÕÙ Ó׺ È ÖÓ Ö ÓÖ ÑÓ× ÕÙ
 Ð ÓÑÔÙØ ÓÖ ×ÓÐÓ ÔÖÓ × × Ù Ò × × Ö¸ ÒÓ ÔÙ               ר Ò Ù Ö¸ Ò Ð Ñ ×ÑÓ × ÒØ Ó
   ÒÙ ×ØÖ Ô Ö Ô ÓÒ¸ ÕÙ ÙÒ Ö ÓÐ × ÙÒ Ö Óк
      ÓÒ× Ö ÑÓ× Ð ÔÖÓ Ð Ñ       ÓÒØ Ö Ð ÒÙÑ ÖÓ ÒÓ Ó× ÕÙ ÔÓ× ÙÒ Ö ÓÐ Ò Ö Óº
È Ö × Ð × Ô ÕÙ Ò ×¸ ÓÑÓ × Ö × ÙÑ ÒÓ× ÒÓ ×Ø ÑÓ× Ö ×ØÖ Ò Ó× ÔÓÖ Ð ØÓÔÓÐÓ           Ð
 Ö Óк         Ó¸ ÔÓ ÑÓ× ÓÖÖ Ö ØÓ × Ð × ÓÒ Ü ÓÒ × ÒØÖ ÐÓ× Ö Ó× Ý ÙÒ ×ÓÑÓ× Ô ×
    ÓÒØ Ö ÐÓ× ÒÓ Ó׺ ÓÒ× Ö ÑÓ× ÓÖ Ð Ú ÐÙ ÓÒ Ð ÜÔÖ × ÓÒ (x2 + x + 1)2y¸ Ð
 Ù Ð ÔÙ Ö ÔÖ × ÒØ Ö× Ñ ÒØ ÙÒ Ö ÓÐ Ò Ö Ó × Ñ Ð Ö Ð Ð ¬ ÙÖ º½¼º ÈÓ ÑÓ×
 ÓÑ ÒÞ Ö Ð Ú ÐÙ ÓÒ ×Ó Ö Ù ÐÕÙ Ö           ÐÓ× ØÖ × ×Ù Ö ÓÐ × ÕÙ ÔÓ× Ò Ó ×º ÈÓÖ
   ÑÔÐÓ¸ ÔÓ Ö ÑÓ× Ú ÐÙ Ö x 2¸ ÐÙ Ó 2y¸ ÐÙ Ó x + 1 Ý × ¸ ×Ù × Ú Ñ ÒØ º ÆÓØ ÑÓ× ÕÙ

 ר ÓÖ Ò        Ú ÐÙ ÓÒ ÒÓ ÓÒ× Ö ×Ø Ò × ÒØÖ Ö Ñ × ÔÓÖ ÑÔÐÓ¸ Ð ÕÙ Ý
 ÒØÖ Ð Ö Ñ x2 Ý 2yº
    ÆÙ ×ØÖ Ú × ÓÒ ÒÓ× Ô ÖÑ Ø ÑÔÖÓÚ × Ö Ú Ö× × × Ù Ò × Ö ÓÖÖ Ó Ó ÔÖÓ ¹
× Ñ ÒØÓ ×Ó Ö Ð Ö Óк Ò ÙÒ ÓÑÔÙØ ÓÖ¸ ÑÔ ÖÓ¸ ÓÒ Ð Ö ÔÖ × ÒØ ÓÒ ÒÓ Ó Ò Ö Ó
     ¸ Ð Ú × ÓÒ ×Ø ר Ö ×ØÖ Ò ÔÓÖ Ð × × Ù ÒØ × ÓÒ ÓÒ ×
   ½º Ð ÔÖ Ñ Ö ÒÓ Ó Ó × ÖÚ Ð × Ð Ö Þº ÓÒ× Ù ÒØ Ñ ÒØ ¸ × × ÑÓ× Ñ Ö Ö Ð ÙÒ
      ×Ù Ö ÓÐ Ò Ô ÖØ ÙÐ Ö¸ ÒØÓÒ × ×       Ö ÓÖÖ Ö        Ò Ö ÓÒ × Ò ÒØ ×
      Ð Ö Þº
254                                                           Cap´        ´
                                                                 ıtulo 4. Arboles



                                                  *

                             +                            *

                    ^                 +               2        y

                x        2        x          1

            ÙÖ º½¼ ÜÔÖ × ÓÒ Ð     Ö       Ö ÔÖ × ÒØ   ÓÒ ÙÒ Ö ÓÐ Ò Ö Ó

  ¾º     × ÙÒ ÒÓ Ó Ù ÐÕÙ Ö ×ÓÐÓ × ÔÙ Ò Ú Ö ×Ù× Ó× Ó× Ñ ÒØ ÐÓ× ÑÔÓ× Ä(T )
      Ý Ê(T )º
     Ü ×Ø Ò Ù ØÖÓ Ô ØÖÓÒ × × Ù Ò × ÖÕÙ Ø Ô × Ó Ö ÓÖÖ Ó× Ô Ö ÔÖÓ × Ö ÙÒ
 Ö ÓÐ Ò Ö Ó
   ½º Algoritmo 4.2 (Recorrido prefijo)
       ´ µ Î × Ø Ð Ö Þº
       ´ µ Î × Ø Ð Ö Ñ ÞÕÙ Ö Ò ÔÖ ¬ Óº
       ´ µ Îר Ð Ö Ñ Ö           Ò ÔÖ ¬ Óº
   ¾º Algoritmo 4.3 (Recorrido infijo)
       ´ µ Î × Ø Ð Ö Ñ ÞÕÙ Ö Ò Ò¬ Óº
       ´ µ Î × Ø Ð Ö Þº
       ´ µ Îר Ð Ö Ñ Ö           Ò Ò¬ Óº
   ¿º Algoritmo 4.4 (Recorrido sufijo)
       ´ µ Î × Ø Ð Ö Ñ ÞÕÙ Ö Ò ×Ù¬ Óº
       ´ µ Îר Ð Ö Ñ Ö           Ò ×Ù¬ Óº
       ´ µ Î × Ø Ð Ö Þº
    º Algoritmo 4.5 (Recorrido por niveles)
       ´ µ Ê ÔØ ×         ¼ ר Ð h(T ) − 1 Ð Ö ÓÐ
             ¯ ÁÑÔÖ Ñ ØÓ Ó× ÐÓ× ÒÓ Ó×    Ð Ò Ú Ð i ÓÖ Ò Ó× ÞÕÙ Ö     Ö º
    ÅÙ Ó× Ø ÜØÓ× ÒÓÑ Ò Ò ÐÓ× Ö ÓÖÖ Ó× ÔÖ ¬ Ó¸ Ò¬ Ó Ý ×Ù¬ Ó ÓÑÓ ÔÖ ÓÖ Ò¸ ÒÓÖ Ò
Ý ÔÓרÓÖ Ò¸ Ö ×Ô Ø Ú Ñ ÒØ Ò Ð ×ÑÓ× ÔÖ ÓÖ Ö¸ ÒÓÖ Ö Ý ÔÓרÓÖ Öº
      ÔÐ Ò Ó Ð × ¬Ò ÓÒ × ×Ó Ö Ð Ö ÓÐ Ð ¬ ÙÖ º½½¸ Ø Ò ÑÓ× Ð × Ù ÒØ Ö ÓÖÖ Ó
ÔÖ ¬ Ó
                                   G S B X A Z                            ´ º¾µ
    ÈÖ Ñ ÖÓ Ú × Ø ÑÓ× Ð Ö Þ ´Gµ¸ ÐÙ Ó Ð ×Ù Ö ÓÐ ÞÕÙ Ö Ó ´S Bµ Ý ÐÙ Ó Ð ×Ù Ö ÓÐ
  Ö Ó ´X A Zµº
´
4.4. Arboles Binarios                                                                 255



                                        G

                                   S               X

                            B                 A           Z

                  ÙÖ º½½     Ö ÓÐ Ò Ö Ó Ô Ö            ÑÔÐ ¬ Ö Ö ÓÖÖ Ó×

   È Ö Ð Ö ÓÖÖ Ó Ò¬ Ó Ø Ò ÑÓ×
                                   B S G A X Z                                       ´ º¿µ
  ÈÖ Ñ ÖÓ Ú × Ø ÑÓ× Ð Ö Ñ ÞÕÙ Ö          Ò Ò¬ Ó ´B Sµ¸ ÐÙ Ó Ð Ö Þ ´Gµ Ý ÙÐÑ Ò ÑÓ×
ÓÒ Ð ×Ù Ö ÓÐ Ö Ó ´A X Zµº
   Ð Ö ÓÖÖ Ó ×Ù¬ Ó ×
                                   B S A Z X G                                      ´ºµ
    ÈÖ Ñ ÖÓ Ú × Ø ÑÓ× Ð Ö Ñ ÞÕÙ Ö Ò ×Ù¬ Ó ´B Sµ¸ ÐÙ Ó Ð Ö Ñ               Ö      ´A Z Xµ
ݸ ÔÓÖ ÙÐØ ÑÓ¸ Ð Ö Þ (Gµº
      Ò ÐÑ ÒØ ¸ Ð Ö ÓÖÖ Ó ÔÓÖ Ò Ú Ð × ×
                                   G S X B A Z                                       ´ºµ
     Ñ ÒÙ Ó¸ Ð × Ù Ò     Ð Ö ÓÖÖ       Ó Ö Ø Ö Þ Ð ØÓÔÓÐÓ   Ð Ö Óк Ò ØÓ¸ ÐÓ×
Ö ÓÖÖ Ó× ×Ø Ò ÒØ Ñ Ñ ÒØ Ö Ð ÓÒ          Ó× ÓÒ ÑÙ Ó× ÐÓ× Ð ÓÖ ØÑÓ× ×Ó Ö Ö ÓÐ × Ý
  Ö Ø ÖÞ Ò Ð Ó Ö       ×Ù ÓÖÑ º          ÓÒ× Ö ÑÓ× Ð Ö ÓÐ   ÜÔÖ × ÓÒ × Ð Ö ×
ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ º½¼º ËÙ Ö ÓÖÖ         Ó ×Ù¬ Ó ×
                                x 2∧ x 1 + + 2 y ∗ ∗                                 ´ºµ
ÕÙ × Ð ÜÔÖ × ÓÒ ×Ù¬        Ð ÜÔÖ × ÓÒ Ð       Ö     ´Ú    Ü   ¾º º ´Ô Ò ½½ µµº
   Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó ×
                             ∗ + ∧x2 + x1 ∗ 2y                                      ´ºµ
Ð Ù Ð ÔÙ   Ú ÐÙ Ö× ÔÓÖ Ð Ö                  ÓÖÑ Ò ÐÓ          Ð Ú ÐÙ ÓÒ       ÙÒ ÜÔÖ × ÓÒ
Ò¬ º
     ÓÖ ÓÒ× Ö ÑÓ× ÙÒ Ð ÓÖ ØÑÓ            ÑÔÖ × ÓÒ Ð Ö ÓÐ Ò¬ Óº
Algoritmo 4.6 (Impresi´n infija, parentizada, de un ´rbol binario) Ä
                      o                            a                              ÒØÖ      Ð
 Ð ÓÖ ØÑÓ × Ð Ö Þ p ÙÒ Ö ÓÐ Ò Ö Óº Ä × Ð          × Ð Ö ÓÖÖ Ó Ò¬ Ó¸               Ô Ö ÒØ ¹
Þ Ó ´Ú × Ü º¾º¾ ´Ô Ò ¾ µµº
    Ð Ð ÓÖ ØÑÓ × Ö ÙÖ× ÚÓ ÓÒ ÔÖÓØÓØ ÔÓ void       imprimir(Node *nodo);      ÓÒ ÒÓ Ó ×
Ð Ö Þ Ð Ö ÓÐ ÑÔÖ Ñ Öº Ä ÔÖ Ñ Ö ÐÐ Ñ                           ÙØ Ö× ÓÒ Ð Ö Þº
  ½º Ë nodo == NULL Ø ÖÑ Ò º
  ¾º ÁÑÔÖ Ñ ´ º
  ¿º imprimir(LLINK(nodo));
256                                                                     Cap´        ´
                                                                           ıtulo 4. Arboles



   º ÁÑÔÖ Ñ Ð × Ñ ÓÐÓ ÓÒØ Ò Ó Ò ÒÓ Óº
   º imprimir(RLINK(nodo));
   º ÁÑÔÖ Ñ µ º

                                            ·
                                                           ·

                             Ü      ¾                 Ü        ½


                             Ü      ¾       ·         Ü    ·   ½

                       ÙÖ º½¾ ÈÖÓÝ        ÓÒ Ò¬           ÙÒ Ö ÓÐ Ò Ö Ó

   È Ö Ð Ö ÓÐ       Ð ¬ ÙÖ º½¼¸ Ð Ð ÓÖ ØÑÓ ÖÖÓ Ð × Ù Ò
                        ((((x) ∧ (2)) + ((x) + (1))) + ((2) ∗ (y))) ;                ´ºµ
Ð Ù Ð × ÙÒ × Ù Ò Ò¬ ¸ Ú Ð ¸ Ð ÜÔÖ × ÓÒ Ð Ö º Ò ÓØÖ × Ô Ð Ö ×¸ Ð
  Ð ÓÖ ØÑÓ º Ó Ø Ò ÙÒ Ö ÔÖ × ÒØ ÓÒ Ô Ö ÒØ Þ               Ð Ö ÓÐ Ö ÒØ Ð Ö ÔÖ × ÒØ ÓÒ
         Ò Ü º¾º¾ ´Ô Ò ¾ µº ר Ö ÔÖ × ÒØ ÓÒ Ø Ñ Ò ÓÒ× ÖÚ Ð ÓÖÑ Ð Ö ÓÐ Ý
Ô ÖÑ Ø Ö ÓÒרÖÙ Ö ×Ù ÓÖÑ ÓÖ Ò Ðº
      ÍÒ ÓÖÑ Ú ×Ù Ð            ÒØ ÖÔÖ Ø Ö Ð Ö ÓÖÖ Ó Ò¬ Ó¸ ÕÙ Ö ÕÙ Ö ÕÙ ÕÙ ÐÓ× ÒÓ Ó×
  ר Ò ×Ù¬ ÒØ Ñ ÒØ × Ô Ö Ó׸ ÓÒ× ×Ø Ò Ñ Ò Ö Ð ÔÖÓÝ ÓÒ ÙÒ ÐÙÞ ×Ó Ö Ð
Ö Þº Ð Ö ÓÖÖ Ó Ò¬ Ó × ÔÖÓÝ Ø Ö Ò ÙÒ ÔÐ ÒÓ × ØÙ Ó                   Ó Ð Ö Óк Ä ¬ ÙÖ º½¾
  ×ÕÙ Ñ Ø Þ Ð         º
       ÓÒ× Ö ÑÓ× ÓÖ ÙÒ ÔÖÓ Ð Ñ ÒÚ Ö×Ó                  Ó Ð ÙÒ Ö ÓÖÖ Ó Ù ÐÕÙ Ö ¸ ÓÑÓ
Ó Ø Ò Ö Ð Ö ÓÐ Ä Ö ×ÔÙ ×Ø Ó¬ Ð × ÕÙ ÒÓ × ÔÓ× Ð º Ä Ö ×ÔÙ ×Ø Ó¬ Ó× ×
ÕÙ ØÓ Ó Ô Ò              Ð Ø ÔÓ     Ö ÓÐ Ò Ö Óº      Ð ÙÒ Ñ Ò Ö ¸ ÙÒ Ö ÓÖÖ Ó¸ ÙÒ Ó Ð
  ÓÒÓ Ñ ÒØÓ Ö              Ð Ø ÔÓ Ð Ö Óи ÓÒÐÐ Ú ×Ù¬ ÒØ Ò ÓÖÑ ÓÒ ×Ó Ö ×Ù ØÓÔÓÐÓ º
   Ò Ð Ó ÙÖÖ Ò ¸ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó Ô ÖÑ Ø ÒØ ¬ Ö ÒÑ Ø Ñ ÒØ Ð Ö Þ Ý Ð Ö Þ
    Ð ×Ù Ö ÓÐ ÞÕÙ Ö Óº È ÖÓ ×Ø Ò ÓÖÑ ÓÒ ÔÓÖ × ×ÓÐ ÒÓ × ×Ù¬ ÒØ Ô Ö Ö ÓÒרÖÙ Ö
  Ð Ö ÓÐ ÓÖ Ò Ðº Ë Ö ÕÙ Ö Ð Ó Ñ ×º
       Ü ×Ø Ò Ú Ö Ó× Ñ ØÓ Ó× Ô Ö Ó Ø Ò Ö Ð ÓÖÑ ÓÖ Ò Ðº ÌÓ Ó× Ö ÕÙ Ö Ò Ò ÓÖÑ ÓÒ
       ÓÒ Ðº ÍÒ ÔÖ Ñ Ö Ñ ØÓ Ó × Ò Ö Ð Ñ Ø ÓÖ × Ð Ö ÓÖÖ Ó Ð Ö ÔÖ × ÒØ ÓÒ Ô Ö¹
  ÒØ Þ       ÜÔÐ        Ò Ü º¾º¾ ´Ô Ò ¾ µ × ÙÒ ÑÔÐÓ Ð Ð ÓÖ ØÑÓ º                  ÑÔÖ × ÓÒ
 Ò¬ Ô Ö ÒØ Þ         × ÓØÖÓ ÑÔÐÓº
        Ù Ð ×Ð       Ö Ò ÒØÖ Ð × Ö ÔÖ × ÒØ ÓÒ × Ô Ö ÒØ Þ × Ü º¾º¾ ´Ô Ò ¾ µ Ý
Ð          ÔÓÖ Ð Ð ÓÖ ØÑÓ º È Ö Ö ×ÔÓÒ Ö¸ Ó × ÖÚ ÑÓ× Ð Ö ÔÖ × ÒØ ÓÒ Ô Ö ÒØ Þ
    Ð Ö ÓÐ Ð ¬ ÙÖ º½¼
                                (∗(+(∧(x)(2))(+(x)(1)))(∗(2)(y)))                    ´ºµ
   Ð Ð Ñ Ò Ö ÐÓ× Ô Ö ÒØ × ×¸ Ð ÜÔÖ × ÓÒ Ö ×ÙÐØ ÒØ × ÒØ            Ð ÜÔÖ × ÓÒ ´ º µ × Ö¸
  × Ð Ö ÓÖÖ Ó ÔÖ ¬ Óº
´
4.4. Arboles Binarios                                                            257



   Ä Ö ÔÖ × ÒØ ÓÒ Ô Ö ÒØ Þ      Ü º¾º¾ ´Ô Ò ¾ µ × ÙÒ Ú Ö× ÓÒ ÜØ Ò       Ð
Ö ÓÖÖ Ó ÔÖ ¬ Óº Ð Ñ ×ÑÓ ÑÓ Ó¸ Ð Ö ÔÖ × ÒØ ÓÒ ÓÒרÖÙ ÔÓÖ Ð Ð ÓÖ ØÑÓ º ×
ÙÒ Ú Ö× ÓÒ ÜØ Ò      Ð Ö ÓÖÖ Ó Ò¬ Óº Ñ × Ö ÔÖ × ÒØ ÓÒ × ÓÒØ Ò Ò Ò ÓÖÑ ÓÒ
×Ù¬ ÒØ Ô Ö Ö ÓÒרÖÙ Ö Ð Ö ÓÐ ÓÖ Ò Ðº
   ÇØÖ ÐØ ÖÒ Ø Ú Ô Ö Ö ÓÒרÖÙ Ö Ð Ö ÓÐ ÓÖ Ò Ð ÓÒ× ×Ø Ò ÓÑ Ò Ö Ð Ò ÓÖ¹
Ñ ÓÒ       Ó× Ö ÓÖÖ Ó× Ö ÒØ × ×Ó Ö Ð Ñ ×ÑÓ Ö ÓÐ Ø Ò ÕÙ ÜÔÐ Ö ÑÓ× Ò
Ü º º½¿ ´Ô Ò ¾ ½µº

                                                   *

                                +                           *

                      +                  ^              2        y

                 x         1        x         2

              ÙÖ º½¿ Ö ÓÐ       ÓÔ Ö ÓÒ × ÕÙ Ú Ð ÒØ Ð        Ð ¬ ÙÖ º½¼

      ÓÒ Ð Ö ÓÖÖ Ó Ò¬ Ó ÒÓÖÑ Ð¸ × Ò Ô Ö ÒØ × ×¸ ÒÓ × ÔÓ× Ð ÓÒרÖÙ Ö Ð ÙÒ Ö ÓÐ ÔÓÖÕÙ
 × ÑÔÓ× Ð ÓÒÓ Ö Ð ÔÖ          Ò º
    ÅÙ Ó× Ø ÔÓ×      Ö ÓÐ × ÔÙ Ò ÓÒרÖÙ Ö× ÓÒ Ø Ò ×ÓÐÓ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó Ó ×Ù¬ Óº
  Ü ×Ø Ò ×Ó× Ò ÐÓ× Ù Ð × ÒÓ × Ò × Ö Ó Ó Ø Ò Ö ÙÒ Ö ÓÐ ÒØ Ó Ð ÓÖ Ò Ð¸ Ô ÖÓ ×
 ÕÙ Ú Ð ÒØ        ØÓ× Ð ×ØÖ ÓÒº ÍÒ ÑÔÐÓ ÒÓØ Ð ×Ø                     Ó ÔÓÖ ÐÓ× Ö ÓÐ ×
     ÜÔÖ × ÓÒ × Ð Ö × ÔÓÖ ÑÔÐÓ¸ Ð Ö ÓÐ Ð ¬ ÙÖ º½¿ × Ö ÒØ Ò ÓÖÑ
Ô ÖÓ ÕÙ Ú Ð ÒØ Ò ÓÔ Ö ÓÒ Ð Ö ÓÐ Ð ¬ ÙÖ º½¼º Ô × Ö Ð × Ñ Ù                        ׸ ×
ÑÙÝ ÑÔÓÖØ ÒØ ÔÖ Ò Ö ÕÙ ¸              ÙÒ ÜÔÖ × ÓÒ ÔÖ ¬ Ó ×Ù¬ ¸ × ÔÓ× Ð ÓÒרÖÙ Ö
 ÙØÓÑ Ø Ñ ÒØ ÙÒ Ö ÓÐ ÕÙ Ö ÔÖ × ÒØ ÓÖÖ Ø Ñ ÒØ Ð Ú ÐÙ ÓÒ Ð ÜÔÖ × ÓÒº
  ×ØÓ × ÑÙÝ ÑÔÓÖØ ÒØ ÔÓÖÕÙ           Ð ÙÒ Ñ Ò Ö Ð ÜÔÖ × ÓÒ ×Ù¬ ÔÓ× ×Ù¬ ÒØ
 Ò ÓÖÑ ÓÒ Ô Ö ÓÒרÖÙ Ö ÙÒ Ö Óи Ö Ó¸ Ô Ö Ö ×ÓÐÚ Ö Ð ÔÖÓ Ð Ñ º Ò ÓØÖ × Ô Ð Ö ×¸
 Ò Ð ×Ó Ð × ÜÔÖ × ÓÒ × Ð Ö ×¸ ÔÓ Ö ÑÓ× ÓÔØ Ö ÔÓÖ ÓÒרÖÙ Ö Ð Ö ÓÐ ÕÙ               ØÙ
Ð Ú ÐÙ ÓÒ ÞÕÙ Ö               Ö º          ØÓ× Ð ÔÖÓ Ð Ñ ¸ Ð ×ÓÐÙ ÓÒ ×Ø          ÝÐ
 Ñ Ù          ÒÓ × ÑÔÓÖØ ÒØ º × Ô٠׸ × ÑÔÖ ÔÓ Ö ÑÓ× ØÖ             Ö ÓÒ ÜÔÖ × ÓÒ ×
×Ù¬ ׸ ÙÒ ÓÖÑ ¬ Þ Ý ÑÙÝ ÓÑÔ Ø                ÐÑ Ò Ö ÜÔÖ × ÓÒ × Ð Ö ×º

4.4.3   Un TAD gen´rico para ´rboles binarios
                  e          a
  ÒØ ×     ÓÖ Ö Ð ÓÖ ØÑÓ× ÕÙ ÒÓ× ÒØÖ Ò Ò Ò Ð Ö ÓÖÖ Ó       Ö ÓР׸ ר Ð Ö ÑÓ×
ÙÒ Ì ×Ó Ö Ð Ù Ð ÙÒ Ñ ÒØ Ö ÑÓ× Ð Ñ ÝÓÖ          Ð × ×ØÖÙ ØÙÖ × Ö ÓÐ Ò Ö Ó
 ר Ø ÜØÓº
    ÅÓ Ð Þ Ö ÑÓ× ÑÔÐ ÒØ Ö ÑÓ× ÙÒ Ñ Ò ×ÑÓ Ò Ö Ó Ô Ö ÓÒרÖÙ Ö ÒÓ Ó× Ò ¹
Ö Ó× º ÐÓ Ð Ö Ó      ר Ø ÜØÓ × ÖÖÓÐÐ Ö ÑÓ× Ö ÒØ × ×ØÖÙ ØÙÖ ×       Ö ÓÐ Ò Ö Óº
Ä Ñ ÝÓÖ        ÐÐ × × ÑÔÖ Ñ Ò Ö Ò ØÖ × ØÖ ÙØÓ× × Ó× ÙÒ Ð Ú ¸ ÙÒ ÔÙÒØ ÖÓ
   Ð Ö Ñ ÞÕÙ Ö Ý ÙÒ ÔÙÒØ ÖÓ Ð Ö Ñ Ö º Ë ÙÒ Ð Ø ÔÓ                  Ö Óи Ð ÒÓ Ó
ÔÙ     ÓÒØ Ò Ö Ð ÙÒ Ò ÓÖÑ ÓÒ         ÓÒ Ð  ÓÒØÖÓк      ÑÓ׸ ÒØÓÒ ×¸ Ò ÓÒØÖ Ö
ÙÒ ÓÖÑ        ¬Ò Ö Ò Ö Ñ ÒØ ÒÓ Ó× Ò Ö Ó× Ù ÐÕÙ Ö Ò ÓÐ Ó ÐÓ× × Ù ÒØ ×
Ö ÕÙ Ö Ñ ÒØÓ×
258                                                          Cap´        ´
                                                                    ıtulo 4. Arboles



      ½º   Soporte para atributos generales   Ó ÙÒ ÒÓ Ó Ò Ö Ó¸     ÔÓ Ö        Ö×
             Ð Ð Ú Ý ×Ù× Ö Ñ × × Ò ÒØ ׺ רÓ× ØÖ ÙØÓ× ×ÓÒ ÓÑÙÒ × ØÓ Ó× Ð ×
           Ð × × ÒÓ Ó× Ò Ö Ó× ÔÓ× Ð ×º
      ¾º Especificaci´n de atributos opcionales Ú ÒØÙ ÐÑ ÒØ ¸
                       o                                            ÔÓ× Ð Ø Ö× Ð
              Ð Ö Ö ØÖ ÙØÓ× ÔÖÓÔ Ó× ÙÒ Ð × Ô ÖØ ÙÐ Ö ÒÓ Ó Ò Ö Óº
      ¿º Soporte opcional para destructores virtuales Ð Ù×Ù Ö Ó ÔÙ ØÖ        Ö ÓÔ¹
            ÓÒ ÐÑ ÒØ ÓÒ ÒÓ Ó× ÕÙ ÔÓ× Ò ×ØÖÙ ØÓÖ × Ú ÖØÙ Ð ×º
        º Soporte para nodos centinelas especiales ÒÓÖÑ ÐÑ ÒØ ¸ Ð Ö ÓÐ Ú Ó ×
          × Ò Ð Ñ ÒØ Ð Ú ÐÓÖ ×Ô Ð NULLº È Ö ÖØ × ×ØÖÙ ØÙÖ × Ö Óи × ÓÒÚ ¹
          Ò ÒØ ÕÙ ×Ø Ö ÓÐ Ú Ó × Ö ÔÖ × ÒØ Ñ ÒØ ÙÒ Òר Ò Ô ÖØ ÙÐ Ö ÒÓ Óº
           × ÖÖÓÐÐ Ö ÑÓ× ÙÒ ×ÓÐÙ ÓÒ ×        Ò Ñ ÖÓ× ÕÙ × ÜÔ Ò Ò             Ð××
    Ô Ö Ñ ØÖ Þ ×º ÄÓ× Ñ ÖÓ× × ¬Ò Ò Ò Ð Ö ÚÓ ØÔÐ ÒÆÓ ºÀ ´Ò Ú Ö ¬Ò µ º
         ØÔÐ ÒÆÓ ºÀ ´Ò Ú Ö ¬Ò µ ÜÔÓÖØ Ó× Ñ ÖÓ׺ Ð ÔÖ Ñ ÖÓ × ¬Ò Ð × Ù ÒØ
    ÑÓ Ó
¾    Ñ ÖÓ× ÜØ ÖÒÓ× BinNode<Key> ¾ ≡                              ¾
     # define DECLARE_BINNODE(Name, height, Control_Data)              
     INIT_CLASS_BINNODE(Name, height, Control_Data)                    
     };                                                                
     template <typename Key> Name<Key> * const Name<Key>::NullPtr = NULL; 
     INIT_CLASS_BINNODE(Name##Vtl, height, Control_Data)               
     virtual ~Name##Vtl() { /* empty */ }                              
     };                                                                
     template <typename Key> Name##Vtl<Key> * const Name##Vtl<Key>::NullPtr = NULL
      ¬Ò ×
     DECLARE BINNODE¸   Ù×   Ò ÙÒ × ¾ ¼ ¸ ¿½ ¸ Ò       º
        DECLARE BINNODE() Ò Ö Ó× Ð × × Ô Ö Ñ ØÖ Þ         × ÕÙ Ö ÔÖ × ÒØ Ò ÒÓ Ó× Ò Ö Ó×
    Ô ÖØ Ò ÒØ × Ð ÙÒ Ð ×              Ö ÓÐ Ò Ö Óº Ð Ô Ö Ñ ØÖÓ Name × Ð ÒÓÑ Ö ÔÖ ¬ Ó
    Ð × Ð × × ÕÙ × × Ò Ò Ö Öº Ð Ñ ÖÓ × ÜÔ Ò                  Ó× Ð × × × ÒØ × Name
    Ý NameVtlº Ä ÙÒ          Ö Ò × ÕÙ NameVtl ÔÓ× ÙÒ ×ØÖÙ ØÓÖ Ú ÖØÙ Ðº
          Ð Ô Ö Ñ ØÖÓ height Ö ÔÖ × ÒØ ÙÒ ×Ø Ñ Ó Ð ÐØÙÖ Ñ Ü Ñ ÕÙ ÔÙ              Ð ÒÞ Ö
     Ð Ö ÓÐ Ò Ö Óº ÅÙ Ó× Ð ÓÖ ØÑÓ× ×Ó Ö Ö ÓÐ × Ò Ö Ó× ×ÓÒ Ö ÙÖ× ÚÓ׸ ÔÓÖ ÐÓ ÕÙ Ð
     ÓÒ×ÙÑÓ ×Ô Ó Ò Ô Ð × ÙÒ ØÓÖ ÓÒ× Ö Öº Ò ×Ø × ÒØ Ó¸ Ð ØÖ ÙØÓ height
    Ó Ö ÙÒ ÔÖÓÜ Ñ Ó Ð ÐØÙÖ Ñ Ü Ñ Ð Ö ÓÐ Ò Ö Ó¸ ÙÝÓ Ú ÐÓÖ × ÖÚ ÐÓ× Ð Ó¹
    Ö ØÑÓ× ØÓÑ Ö ÔÖ Ú × ÓÒ × Ö           Ð ÓÒ×ÙÑÓ Ò Ô Ð º
           Ò ÐÑ ÒØ ¸ Ð Ô Ö Ñ ØÖÓ Control Data × ÙÒ Ð × ÕÙ Ö ÔÖ × ÒØ Ò ÓÖÑ ÓÒ
     ÓÒØÖÓÐ Ð ÒÓ Ó Ò Ö Ó Ô ÖØ Ò ÒØ ÙÒ ×Ô Ð Þ ÓÒ¸ Ð Ù Ð Ú Ö × ÙÒ Ð Ø ÔÓ
         Ö ÓÐ Ò Ö Ó ÕÙ × Ñ Ò º ÈÓÖ ÑÔÐÓ¸ ÐÓ× Ö ÓÐ × ÖÓ Ó¹Ò ÖÓ¸ ÕÙ ×ØÙ Ö ÑÓ×
     Ò Ü º ´Ô Ò ½¿µ ÐÑ Ò Ò ÙÒ ÓÐÓÖº ר ÕÙ ÑÓ× ÕÙ Control data ÒÓ ×Ø ר ¹
    Ò        Ù× Ö× ÔÓÖ Ð Ù×Ù Ö Ó ¬Ò Ð
        ÅÙ Ó× Ø ÔÓ×        Ö ÓÐ × Ò Ö Ó× × ÙØ Ð Þ Ò Ô Ö ÓÒרÖÙ Ö Ñ Ô Ó× ÒØÖ Ð Ú ×
     Ð ÙÒ ÓÑ Ò Ó Ý Ð Ñ ÒØÓ×           Ð ÙÒ Ö Ò Óº Ò ×Ø × ØÙ ÓÒ¸ ÐÓ ÕÙ × Ö ÕÙ Ö ×
    ÕÙ          ÒÓ Ó ÐÑ Ò ÙÒ Ð Ñ ÒØÓ Ð Ö Ò Ó Óº ÈÙ ×ØÓ ÕÙ ÒÙ ×ØÖ ÔÖ Ø Ò× ÓÒ
     × Ò Ö ¸ ÒÓ ÔÓ ÑÓ× Ù× Ö Control Data¸ ÔÙ × × ÒÓ ÒÚ Ð Ö ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ ÙÒ
    Ì       Ö ÓÐ ÖÓ Ó Ò Ö Óº
           Ò Ò Ð ×¸ ÒØ Ò Ð × × Ö   × ÒØ Ò Ð ´ ÓÒ × µ
´
    4.4. Arboles Binarios                                                             259



       ÍÒ Ñ Ò Ö Ö Ð Þ Ö ÙÒ Ñ Ô Ó × Ñ ÒØ Ö Ò             ÒØ Ö Þº ËÙÔÓÒ ÑÓ× ÕÙ
    Ö ÕÙ Ö ÑÓ× ÙÒ Ñ Ô Ó Ñ ÒØ Ö ÓÐ × ÖÓ Ó¹Ò ÖÓº ÈÓÖ ÑÔÐÓ¸ ÙÒ Ñ Ô Ó ÒØÖ ÒÙÑ ÖÓ×
          ÙÐ Ý Ô ÐÐ Ó׸ ÔÙ  ×Ô ¬ Ö× Ð × Ù ÒØ ÑÓ Ó
                                             RbNode<int>
                                   -key: int
                                   -lLink: RbNode *
                                   -rlink: RbNode *
                                   +RbNode(k:const int &)
                                   +RbNode(node:const RbNode &)
                                   +RbNode()
                                   +reset(): void
                                   +get_key(): int&
                                   +getL(): RbNode*&
                                   +getR(): RbNode*&




                                                  Persona
                             +apellidos: string
                             +apellidos(): string
                             +modificar_apellidos(in a:string): void



      Ò ×Ø ×Ó¸ ÑÔÐ ÒØ ÑÓ× ÙÒ Ñ Ô Ó ¬ Ó Ò Ð × ÒØ Ó ÕÙ ×Ø ÓÒØ Ò Ö Ô Ö ×
    Ø ÔÓ [int,string]º
        Ë × ÑÓ× ÙÒ Ñ Ô Ó Ò Ö Ó¸ Ð Ù Ð × Ñ × ÓÑÔÐ ØÓ¸ ÒØÓÒ × Ð Ð × Ö Ú
          × Ö ÙÒ ÔÐ ÒØ ÐÐ ¸ ÐÓ Ù Ð¸ Ò Ð ×Ó ÒÙ ×ØÖÓ ÑÔÐÓ¸ ÔÙ ×Ô ¬ Ö×   Ð
    × Ù ÒØ Ñ Ò Ö
                                        RbNode<Key>
                            -key: Key
                            -lLink: RbNode<Key> *
                            -rlink: RbNode<Key> *
                            +RbNode(k:const Key &)
                            +RbNode(node:const RbNode<Key> &)
                            +RbNode()
                            +reset(): void
                            +get_key(): Key&
                            +getL(): RbNode<Key>*&
                            +getR(): RbNode<Key>*&


                                                                  key:class Key
                                                                  data:Data
                                            Mapppig
                       +apellidos: string
                       +apellidos(): string
                       +modificar_apellidos(in a:string): void



        ÄÓ× Ö ÓÐ × Ö ÕÙ Ö Ò ÙÒ Ú ÐÓÖ ×Ô Ð Ô Ö Ö ÔÖ × ÒØ Ö Ð Ö ÓÐ Ú Óº Ì Ð Ú ÐÓÖ
    × ÐÑ Ò Ò Ð ØÖ ÙØÓ ×Ø Ø Ó Name<T>::NullPtr¸ Ð Ù Ð                    Ò Ð Þ Ö×
     ÜÔÐ Ø Ñ ÒØ Ð Ú ÐÓÖ       Ö ÓÐ Ú Óº ÈÓÖ ÓÑ × ÓÒ¸ DECLARE BINNODE() ×ÙÑ ÕÙ Ð
     Ö ÓÐ Ú Ó × Ð Ú ÐÓÖ NULLº
          Ð ÙÒ × Ú × × ÓÒÚ Ò ÒØ ÕÙ NullPtr ÔÙÒØ ÙÒ ÒÓ Ó ÒØ Ò Ð Ô ÖØ ÙÐ Öº Ò
     ר × × ØÙ ÓÒ ×     ÑÓ× Ù× Ö Ð Ñ ÖÓ DECLARE BINNODE SENTINEL()¸ Ð Ù Ð × ¬Ò
      Ð × Ù ÒØ ÑÓ Ó
¾    Ñ ÖÓ× ÜØ ÖÒÓ× BinNode<Key> ¾ +≡                          ¾ ¾¼
     # define DECLARE_BINNODE_SENTINEL(Name, height, Control_Data)                
     INIT_CLASS_BINNODE(Name, height, Control_Data)
260                                                                  Cap´        ´
                                                                             ıtulo 4. Arboles



         Name(SentinelCtor) :                                           
           Control_Data(sentinelCtor), lLink(NullPtr), rLink(NullPtr) {}
         static Name sentinel_node;                                     
       };                                                               
       template <typename Key>                                          
       Name<Key> Name<Key>::sentinel_node(sentinelCtor);                
       template <typename Key>                                          
       Name<Key> * const Name<Key>::NullPtr = &Name<Key>::sentinel_node;
       INIT_CLASS_BINNODE(Name##Vtl, height, Control_Data)              
       virtual ~Name##Vtl() { /* empty */ }                             
       private:                                                         
         Name##Vtl(SentinelCtor) :                                      
           Control_Data(sentinelCtor), lLink(NullPtr), rLink(NullPtr) {}
         static Name##Vtl sentinel_node;                                
       };                                                               
       template <typename Key>                                          
       Name##Vtl<Key> Name##Vtl<Key>::sentinel_node(sentinelCtor);      
       template <typename Key>                                          
       Name##Vtl<Key> * const Name##Vtl<Key>::NullPtr =                 
         &Name##Vtl<Key>::sentinel_node
       ¬Ò ×
       DECLARE BINNODE SENTINEL¸   Ù×   Ò ÙÒ × ¿ ¿¸     ¸    ¸ Ò   ½º
           Ð ÒÓ Ó Ò Ö Ó Ñ × × ÑÔÐ ¸ ÐÐ Ñ Ó BinNode<Key>¸ ×              ¬Ò Ò ÙÒ ×ÓÐ Ð Ò
¾¼    Ð×   BinNode<Key> ¾ ¼ ≡
       DECLARE_BINNODE(BinNode, 1024, Empty_Node);
       ¬Ò ×
       BinNode¸ Ù×    Ò ÙÒ    × ¿¿ ¸ ¿ ß ¸ ¿ ½ ¸ Ò    ¿¾ º
       BinNodeVtl¸ Ù×   Ò     ÙÒ × ¿¿ Ò ¿¾ º
     Í× × DECLARE BINNODE ¾    º
          Ä Ð × BinNode<Key> ×Ô ¬ Ð Ñ × × ÑÔÐ ÒÓ Ó Ô ÖØ Ò ÒØ ÙÒ Ö ÓÐ Ò Ö Óº
     Ë Ò ÓÒÓ Ö Ð Ø ÔÓ Ö ÓÐ Ò Ö Ó ÕÙ × ØÖ Ø ¸ ×Ù ÐØÙÖ × ×Ø ÒØ Ú Ö Ð Ý Ô Ò
        Ð ÓÖ Ò Ò ÕÙ Ð × Ð Ú × × Ò Ò× ÖØ ׺ ÈÓÖ ×Ø Ö ÞÓÒ¸ Ð Ø Ñ ÒÓ ÙÒ Ô Ð ÕÙ
     ÓÔ Ö ×Ó Ö ÙÒ Ö ÓÐ Ò Ö Ó       × Ö ÐÓ ×Ù¬ ÒØ Ñ ÒØ Ö Ò Ô Ö ÕÙ Ô ÖÑ Ø ÐØÙÖ ×
      Ð Ú ×º ÓÑÓ × ÑÙÝ         Ð Ø ÖÑ Ò Ö Ð Ñ Ü Ñ ÐØÙÖ ÕÙ ÔÓ Ö Ð ÒÞ Ö ÙÒ Ö ÓÐ
       Ò Ö Ó Ò Ö Ð¸ Ð ¬ ÑÓ× Ò ÙÒ Ú ÐÓÖ Ö Ò ¸ Ô ÖÓ Ú ÖØ ÑÓ× ÕÙ ×ØÓ ÒÓ Ð Ñ Ò Ð
     ÔÓ× Ð          ÙÒ × ÓÖ     ÔÐ º
          BinNode<Key> ÒÓ Ø Ò ØÖ ÙØÓ×       ÓÒØÖÓÐ ×Ô Ð × ÔÓÖ ×Ó¸ ÓÐÓ ÑÓ× Ð Ð ×
     Ú Aleph::Empty Node¸ Ð Ù Ð ×Ø ¬Ò Ò Ð Ð Ð ÓØ º
          ÈÖ     Ð Ø Ö Ð Ð Ð ¸ × ÜÔÓÖØ Ò ÐÓ× × Ù ÒØ × Ñ ÖÓ×
¾¼    Ñ ÖÓ× ÜØ ÖÒÓ× BinNode<Key> ¾ +≡                             ¾
       # define LLINK(p) ((p)->getL())
       # define RLINK(p) ((p)->getR())
       # define KEY(p)   ((p)->get_key())
            Ó ÙÒ ÒÓ Ó p¸ Ð          ×Ó Ð Ð Ú × Ö Ð Þ ÓÒ KEY(p)¸ Ð ×Ó Ð Ö Ñ ÞÕÙ Ö
      ÓÒ LLINK(p) Ý Ð ×Ó             Ð ÖÑ Ö         ÓÒ RLINK(p)º
        ÍÒÓ ÐÓ× ØÖ ÙØÓ×              ÙÒ ÒÓ Ó Ò Ö Ó Ñ × ÑÔÓÖØ ÒØ × ÐÓ ÓÒ ÓÖÑ Ð Ø ÔÓ Ð Ú ¸
      Ð Ù Ð × Ò Ö Ñ ÒØ              × ÕÙ Ð Ñ ÒØ Ð ÒÓÑ Ö key typeº ÍÒ ÙÒ ÓÒ Ò Ö
     ÔÙ     ÓÒÓ Ö Ð Ø ÔÓ           Ð Ú ÙÒ ÒÓ Ó Ñ ÒØ Ð ÒרÖÙ ÓÒ
              typename Node::key_type
´
4.4. Arboles Binarios                                                         261



                                                                 class Key:
                                   BinNode
          +getKey(): Key&
          +getL(): Name*&
          +getR(): Name*&
          +Name(k:const Key&)
          +Name(control_data:const Control_Data&,k:const Key&)
          +Name(node:const Name&)
          +Name(control_data:const Control_Data&)
          +Name()
          +reset(): void




                  ÙÖ º½         Ö Ñ ÍÅÄ        Ð Ð×    BinNode<Key>


   Ä Ù Ð Ö ¬ Ö Ð Ø ÔÓ    Ð Ú Ð ÒÓ Óº Å ÒØ ר ÒØ Ö Þ¸ × ÔÙ           ×ÒÖ
 Ó Ó Ò Ö Ó¸ × Ò Ò ×         ×Ô ¬ Ö¸ Ò  ÓÒÓ Ö ÜÔÐ Ø Ñ ÒØ ¸ Ð Ø ÔÓ Ð Ú
ÕÙ Ð Ö Ð ÒÓ Óº
   ËÙÔÓÒ ÑÓ× ÕÙ × ÑÓ× ÙÒ ÒÓ Ó ÕÙ Ù Ö ÓÑÓ ØÖ ÙØÓ ÓÒØÖÓÐ Ð ÐØÙÖ Ð
ÒÓ Óº ¬Ò ÑÓ׸ ÒØÓÒ ×¸ ÙÒ Ð × ÕÙ ÓÒØ Ò Ø Ð ØÖ ÙØÓ Ý ÒÓ× Ú Ð ÑÓ× ÐÓ× Ñ ÖÓ×
  Ð × Ù ÒØ ÓÖÑ
       class Altura
       {
       private:
          size_t altura;
       public:
          Altura() { /* Empty */ }
          Altura(size_t a) : altura(a) { /* empty */ }
          size_t dar_altura() const { return altura; }
       };
       DECLARE_BINNODE(Nodo, 255, Altura);
       SET_BINNODE_NULL_POINTER(NULL, Nodo);

     Ð Ñ ÖÓ × ÜÔ Ò      Ó× Ð × × ÔÐ ÒØ ÐÐ ÒÓÑ Ò × Nodo<Key> Ý NodoVtl<Key>¸
Ö ×Ô Ø Ú Ñ ÒØ º Ä × Ð × × ×ÓÒ × ÒØ ׸ × ÐÚÓ ÕÙ NodoVtl<Key> ¬Ò ÙÒ ×¹
ØÖÙ ØÓÖ Ú ÖØÙ Ðº
    Ä ×ØÖÙ ØÙÖ Nodo<Key> × Ð × Ù ÒØ
    template <typename Key, size_t _MaxHeight = 255>
class Nodo : public Altura
{
public:
  static Nodo * NullPtr;
  static const size_t MaxHeight = _MaxHeight;
  typedef Key key_type;

private:
  Key key;
  Nodo * lLink;
  Nodo * rLink;
262                                                         Cap´        ´
                                                               ıtulo 4. Arboles



public:
  Key & get_key() { return key; }
  Nodo *& getL() { return lLink; }
  Nodo *& getR() { return rLink; }
  Nodo(const Key & k) : key(k), lLink(NullPtr), rLink(NullPtr) { }
  Nodo(const Altura & control_data, const Key& k) :
    Altura(control_data), key(k), lLink(NullPtr), rLink(NullPtr) { }
  Nodo(const Altura & control_data) :
    Altura(control_data), lLink(NullPtr), rLink(NullPtr) { }
  Nodo() : lLink(NullPtr), rLink(NullPtr) { }
  Nodo(EmptyCtor) { }
  void reset() { rLink = lLink = NullPtr; }
};

    template <typename Key, size_t _MaxHeight>
BinNode<Key, _MaxHeight> * BinNode<Key, _MaxHeight>::NullPtr = NULL;

    Ä × Ð × × Nodo<Key> Ý NodoVtl<Key> Ö ÔÖ × ÒØ Ò Ñ Ð × ÒÓ Ó× Ò Ö Ó× ÓÒ
 ØÖ ÙØÓ× ÓÒØÖÓÐ ¬Ò Ó× Ò Ð Ð × Altura Ý ÓÒ Ð Ú Ò Ö Keyº Ð ×Ó Ð
 Ð Ú ×Ø       Ó ÔÓÖ get key() Ý ÐÓ× ×Ó× Ð × Ö Ñ × ÞÕÙ Ö Ý Ö        ÔÓÖ getL() Ý
getR()¸ Ö ×Ô Ø Ú Ñ ÒØ º
    Nodo<Key> Ö        ÔÙ Ð Ñ ÒØ Alturaº ÈÓÖ Ø ÒØÓ¸ ÙÒ Nodo<Key> ׸ Ø Ñ Ò¸
Ø ÔÓ alturaº      ר ÑÓ Ó¸ Nodo<Key> Ø Ò       ×Ó ØÓ Ð ÒØ Ö Þ ÔÙ Ð      Alturaº
    À Ý Ò Ó Ñ Ò Ö × ÓÒרÖÙ Ö ÙÒ Nodo<Key> Ö ÔÖ × ÒØ × ÔÓÖ ÐÓ× Ò Ó ÓÒרÖÙ ¹
ØÓÖ × Ò Ö Ó× ÐÓ× Ù Ð ×¸ Ü Ô ÓÒ Ð ÕÙ ÒØÓ¸ × ÜÔÐ Ò ÔÓÖ × ×ÓÐÓ׺ Ë × Ö ¹
ÕÙ Ö ÙÒ ÒÓ Ó ÒØ Ò Ð ¸ ר × Òר Ò Ñ ÒØ Ð ÕÙ ÒØÓ ÓÒרÖÙ ØÓÖ¸ Ð Ù Ð Ö ÕÙ Ö
ÕÙ Node::Node(SentinelCtor) × ¬Ò Ò Ð Ð × Alturaº
    Ä ÔÐ ÒØ ÐÐ Nodo<Key> Ø Ò Ó× ØÖ ÙØÓ× ×Ø Ø Ó׺ Node::NullPtr × Ð ÔÙÒ¹
Ø ÓÖ Ð Ö ÓÐ Ú Óº Ò Ð Ñ ÝÓÖ             Ð × × ØÙ ÓÒ ×¸ ר ÔÙÒØ ÖÓ Ø Ò Ö Ð Ú ÐÓÖ
ÒÙÐÓ Ò ÓØÖ × Ó × ÓÒ ×¸ Node::NullPtr Ö ÓÒ Ö Ð ÒÓ Ó ÒØ Ò Ð º Ð Ú ÐÓÖ
Node::NullPtr            ¬Ò Ö× ÜÔÐ Ø Ñ ÒØ ÔÓÖ Ð ÒÚÓ ÒØ DECLARE BINNODE Ñ ¹
   ÒØ Ð Ñ ÖÓ SET BINNODE NULL POINTERº ר Ñ ÖÓ ØÓÑ ÓÑÓ Ô Ö Ñ ØÖÓ× Ð ÒÓÑ Ö
   Ð Ð × ÒÓ Ó Ý Ð ÔÙÒØ ÖÓ Ð ÒÓ Ó ÒØ Ò Ð º
     Ð × ÙÒ Ó ØÖ ÙØÓ ×Ø Ø Ó ÓÖÖ ×ÔÓÒ       ÙÒ Ú ÐÓÖ ×Ø Ñ Ó    ÐØÙÖ Ñ Ü Ñ ¸ ÕÙ
ÔÙ × Ö Ö ÕÙ Ö Ó ÔÓÖ Ð ÙÒÓ× Ð ÓÖ ØÑÓ× Ô Ö Ø ÖÑ Ò Ö Ð Ø Ñ ÒÓ ×Ù× Ô Ð ×º
    ÍÒ Nodo<Key> ÔÙ Ö ÙØ Ð Þ Ö× º ÈÓÖ ÑÔÐÓ¸ ÔÓ Ö ÑÓ× ÜØÖ ÖÐÓ ÙÒ Ö ÓÐ
 Ò× ÖØ ÖÐÓ Ò ÓØÖÓº Ò ×Ø ×Ó¸ Ð ×Ø Ó Ð ÒÓ Ó          × Ö Ö Ò Óº È Ö ÐÐÓ × ÔÖÓÚ
 Ð Ñ ØÓ Ó reset()º

4.4.4   Contenedor de funciones sobre ´rboles binarios
                                      a
ÅÙ × ÓÔ Ö ÓÒ × ×Ó Ö Ö ÓÐ × Ò Ö Ó× × Ò Ô×ÙÐ Ò Ò ÙÒ            Ð ÓØ   ×Ô ¹
  Ð ÕÙ ÓÒØ Ò Ö Ð ÓÖ ØÑÓ× Ø Ô Ó× ×Ó Ö Ö ÓÐ × Ò Ö Ó× Ý ÕÙ × ¬Ò Ò Ð
 Ö ÚÓ tpl binNodeUtils.Hº
    Ä Ð ÓØ ÓÒØ Ò Ð ÓÖ ØÑÓ× Ø Ô Ó× ×Ó Ö Ö ÓÐ × Ò Ö Ó× ÔÓÖ ÑÔÐÓ¸ Ù ÓÒ
   Ö ÓÖÖ Ó׸ ÙÔÐ ÓÒ Ö ÓР׸ Ø Ø Ö º
    Ä Ñ ÝÓÖ Ô ÖØ Ð × ÙÒ ÓÒ × BinNode Utils ¾ ¿ ×ÓÒ ÔÐ ÒØ ÐÐ × ÓÒ Ð ÓÖÑ
  Ò Ö Ð × Ù ÒØ
´
     4.4. Arboles Binarios                                                            263



        template <class Node> funci´n (...) { ... }
                                   o

          × Ö¸ Ð Ø ÔÓ Ô Ö Ñ ØÖ Þ Ó × ÙÒ ÒÓ Ó Ò Ö Ó Ò Ö Ó Nodeº Ð ÓÒØÖ ØÓ Ñ Ò ÑÓ
     Ô Ö ÕÙ Ð Ð ÓØ ÓÔ Ö × ÕÙ Node ÜÔÓÖØ Ð × ÙÒ ÓÒ × BinNode<Key> ¬Ò ×
      Ò tpl binNode.Hº

     4.4.5   Recorridos recursivos
     Ä ÖÙØ Ò    Ö ÓÖÖ Ó × Ö Ñ Ø ×Ù ÙÒ ÓÒ ×                Ö ÓÖÖ Öº × Ô٠׸ ÙÒ ÖÙØ Ò
     Ö ÓÖÖ Ó Ò¬ Ó Ø Ò Ö Ð × Ù ÒØ ÔÖÓØÓØ ÔÓ
         template <class Node> inline
     int inOrderRec(Node * root, void (*visitFct)(Node*, int, int))

         Ä ÙÒ ÓÒ inOrderRec() Ö ÓÖÖ Ò ÓÖÑ Ò¬ Ð Ö ÓÐ Ò Ö Ó ÓÒ Ö Þ root Ý
     Ö ØÓÖÒ Ð ÒÙÑ ÖÓ ÒÓ Ó× Ú × Ø Ó׺     Ú Þ ÕÙ × Ú × Ø ÙÒ ÒÓ Ó¸ ×     ØÙ ÙÒ
     ÐÐ Ñ      Ð ÙÒ ÓÒ ÔÙÒØ ÔÓÖ visitFct¸ Ð Ù Ð      ÓÖÖ ×ÔÓÒ Ö× ÓÒ Ð × Ù ÒØ
     ÔÖÓØÓØ ÔÓ
         template <class Node>
     void visitFct(Node* node, int level, int position)

         node × ÙÒ ÔÙÒØ ÖÓ Ð ÒÓ Ó Ú × Ø Ó¸ level × Ð Ò Ú Ð Ó Ð ÔÖÓ ÙÒ            Ð ÒÓ Ó
     Ö ×Ô ØÓ Ð Ö Þ Ý position × ×Ù ÔÓ× ÓÒ ÒØÖÓ Ð Ö ÓÖÖ Óº
         inOrderRec() × ÙÒ ÛÖ ÔÔ Ö ÙÒ ÙÒ ÓÒ Ö ÙÖ× Ú ¸ ר Ø ¸ Ò Ö                      ØÙ Ö
      Ð Ö ÓÖÖ Ó¸ Ð Ù Ð × Ö Ú Ö Ø Ñ ÒØ Ð ¬Ò ÓÒ
¾¿      ÙÒ ÓÒ × BinNode Utils ¾ ¿ ≡                               ¾¿
          template <class Node> inline static
      void __inorder_rec(Node * node, const int& level, int & position,
                         void (*visitFct)(Node *, int, int))
      {
        if (node == Node::NullPtr)
          return;
        __inorder_rec(static_cast<Node*>(LLINK(node)), level + 1, position, visitFct);
        (*visitFct)(node, level, position);
        ++position;
        __inorder_rec(static_cast<Node*>(RLINK(node)), level + 1, position, visitFct);
      }
         Ð Ò Ú Ð level × Ò Ö Ñ ÒØ Ò     ÐÐ Ñ ¸ Ñ      ÒØÖ × ÕÙ Ð position Ò     Úר º
     ÆÓØ ÑÓ× ÕÙ position × ÙÒ Ô Ö Ñ ØÖÓ ÔÓÖ Ö Ö Ò       ¸ ÔÙ × ×Ø Ö ÕÙ Ö ØÙ Ð Þ Ö× Ò
         Úר º
        È Ö ÕÙ Ð ÖÙØ Ò × ÓÒ× ×Ø ÒØ ¸ Ð ÐÐ Ñ            Ò Ð     Ö Ð Þ Ö× ÓÒ Ú ÐÓÖ ×
       level Ý position Ù Ð ×     ÖÓº ר × Ð ØÖ       Ó inOrderRec()
¾¿    ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                                ¾¿ ¾
          template <class Node> inline
      int inOrderRec(Node * root, void (*visitFct)(Node*, int, int))
      {
        int position = 0;
        __inorder_rec(root, 0, position, visitFct);
        return position;
      }
264                                                          Cap´        ´
                                                                    ıtulo 4. Arboles



       inOrderRec()Ö ØÓÖÒ Ð ÒÙÑ ÖÓ ÒÓ Ó× ÕÙ ÓÒØ Ò Ð Ö Óк
      ÄÓ× Ö ÓÖÖ Ó× ÔÖ ¬ Ó Ý ×Ù¬ Ó × ¬Ò Ò Ñ Ò Ö Ò ÐÓ
¾    ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                    ¾¿             ¾
         template <class Node> inline static
     void __preorder_rec (Node * p, const int & level, int & position,
                          void (*visitFct)(Node*, int, int))
     {
       if (p == Node::NullPtr)
         return;
       (*visitFct)(p, level, position);
       ++position;
       __preorder_rec(static_cast<Node*>(LLINK(p)), level + 1, position, visitFct);
       __preorder_rec(static_cast<Node*>(RLINK(p)), level + 1, position, visitFct);
     }
         template <class Node> inline
     int preOrderRec(Node * root, void (*visitFct)(Node*, int, int))
     {
       int position = 0;
       __preorder_rec(root, 0, position, visitFct);
       return position;
     }
         template <class Node> inline static
     void __postorder_rec(Node * node, const int & level, int & position,
                          void (*visitFct)(Node*, int, int))
     {
       if (node == Node::NullPtr)
         return;
       __postorder_rec(static_cast<Node*>(LLINK(node)), level + 1, position, visitFct);
       __postorder_rec(static_cast<Node*>(RLINK(node)), level + 1, position, visitFct);
       (*visitFct)(node, level, position);
       ++position;
     }
         template <class Node> inline
     int postOrderRec(Node * root, void (*visitFct)(Node*, int, int))
     {
       int position = 0;
       __postorder_rec(root, 0, position, visitFct);
       return position;
     }
        ÌÓ × Ð × ÔÖ Ñ Ø Ú ×    Ö ÓÖÖ Ó      ÙÒ ÓÒ × BinNode Utils ¾ ¿ Ø Ò Ò ÓÑÓ
    ÔÖ Ñ Ö Ô Ö Ñ ØÖÓ Ð Ö Þ     Ð Ö ÓÐ Ò Ö Óº Ð × ÙÒ Ó Ô Ö Ñ ØÖÓ × ÙÒ ÙÒ ÓÒ Ú × Ø
      Ð ÒÓ Ó ÕÙ ÔÖÓÚ Ð Ð      ÒØ Ð      Ð ÓØ º Ä ÙÒ ÓÒ × Ö ÒÚÓ        ÙÖ ÒØ Ð Ú × Ø
      ÓÖ ×Ù Ö ÓÖÖ Óº
        ÆÓØ ÑÓ× ÕÙ Ð ÓÒ       ÓÒ   ÔÖ       Ð Ö ÙÖ× ÓÒ × Ð Ú × Ø Ö ÙÒ ÒÓ Ó ÒÙÐÓº

    4.4.6   Recorridos no recursivos
     Ð ×ØÙ Ó ÐÓ× Ö ÓÖÖ Ó× × ÙÒÓ ÐÓ× Ñ ÓÖ × ÒØÖ Ò Ñ ÒØÓ× Ò Ð ÓÖ ØÑ Ö ÓР׸
    ÔÙ × ÓØÖÓ× Ð ÓÖ ØÑÓ× Ó   Ò Ô ØÖÓÒ × ÙÒ Ö ÓÖÖ Ó Ó ÓÑ Ò ÓÒ ×      ÐÐÓ׺
     ÓÑ Ò ÑÓ× ÔÓÖ Ð Ú Ö× ÓÒ Ñ × × ÑÔÐ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó
´
    4.4. Arboles Binarios                                                         265



¾     ÙÒ ÓÒ ×     BinNode Utils ¾ ¿ +≡                          ¾ ¾
          template <class Node> inline
      size_t simple_preOrderStack(Node * node, void (*visitFct)(Node *, int, int))
      {
        if (node == Node::NullPtr)
          return 0;
        ArrayStack<Node *, Node::MaxHeight> stack;
        stack.push(node);
        Node * p;
        size_t count = 0;
        while (not stack.is_empty())
          {
            p = stack.pop();
            (*visitFct) (p, stack.size(), count++);
            if (RLINK(p) != Node::NullPtr)
              stack.push(RLINK(p));
            if (LLINK(p) != Node::NullPtr)
              stack.push(LLINK(p));
          }
        return count;
      }
    Í× × ArrayStack ½¼ º
         Ð Ô ØÖÓÒ Ø Ö Ø ÚÓ Ð Ð ÓÖ ØÑÓ × × ÑÔÐ Ú × Ø ¸ ÒØÖÓ ÙÞ Ð Ö ÓÐ Ö Ó¸ ÐÙ Ó
     Ð ÞÕÙ Ö Ó Ý × ÕÙ Ð Ô Ð º ÈÙ ×ØÓ ÕÙ Ð Ö ÓÐ ÞÕÙ Ö Ó Ù ÒØÖÓ Ù Ó ×ÔÙ × Ð
      Ö Ó¸ Ð ÞÕÙ Ö Ó × Ö Ð ÔÖ Ñ ÖÓ ÜØÖ Ö× Ý Ú × Ø Ö× º
        Ç × ÖÚ ÑÓ× ÕÙ Ð Ò Ú Ð Ð ÒÓ Ó × ÓÖÖ ×ÔÓÒ ÓÒ Ð Ø Ñ ÒÓ ØÙ Ð Ð Ô Ð
           ÓÖ Ò¸ × ÙÒ Ð ¬Ò ÓÒ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó¸ Ð Ö ÓÐ ÞÕÙ Ö Ó × Ú × Ø ÒÑ ¹
       Ø Ñ ÒØ ×ÔÙ × Ú × Ø Ö Ð ÒÓ Óº ÈÓ ÑÓ׸ ÒØÓÒ ×¸ Ñ ÓÖ Ö Ð Ð ÓÖ ØÑÓ × ¸ Ò
    ÐÙ Ö Ù Ö Ö Ò Ô Ð Ð Ö ÓÐ Ö Ó¸ Ù Ö ÑÓ× ×Ù Ô Ö Ý ×ÙÑ ÑÓ× ÕÙ ØÓ Ó ÒÓ Ó
     ÜØÖ Ó Ð Ô Ð Ý Ù Ú × Ø Óº ר Ô ØÖÓÒ ÓÒ Ù Ð Ð ÓÖ ØÑÓ × Ù ÒØ
¾     ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                            ¾  ¾
          template <class Node> inline
      size_t preOrderStack(Node * node, void (*visitFct)(Node *, int, int))
      {
        if (node == Node::NullPtr)
          return 0;
        ArrayStack<Node *, Node::MaxHeight> stack;
        Node *p = node;
        size_t count = 0;
        while (true)
          {
            (*visitFct)(p, stack.size(), count++);
            if (LLINK(p) != Node::NullPtr)
              {
                stack.push(p); // push porque p y RLINK(p) faltan por visitarse
                p = LLINK(p); // avanzar a la izquierda
                continue; // ir a visitar ra´z rama izquierda
                                            ı
              }
            while (true)
              {
266                                                            Cap´        ´
                                                                      ıtulo 4. Arboles



                   if (RLINK(p) != Node::NullPtr)
                     {
                       p = RLINK(p); // avanzar a la derecha
                       break;        // ir a visitar ra´z rama derecha
                                                       ı
                     }
                   if (stack.is_empty())
                     return count; // fin
                   p = stack.pop(); // sacar para ir a rama derecha
               }
           }
      }
    Í× × ArrayStack ½¼ º
            ÙÒ ÖØ Ñ Ò Ö ¸ ØÓ Ó Ö ÓÖÖ Ó Ø Ò Ð Ó ÔÖ ¬ Ó¸ ÔÙ × ØÓ Ó Ö ÓÐ ×
      ØÖ Ú × Ð × Ö × ×Ù× ×Ù Ö ÓР׺ ÈÓÖ Ø ÒØÓ¸ × ÒØÙ Ø Ú Ñ ÒØ ×Ô Ö Ð ÕÙ Ð
    Ö ÓÖÖ Ó Ò¬ Ó Ø Ò ÙÒ ×ØÖÙ ØÙÖ × Ñ Ð Ö Ð ÔÖ ¬ Ó¸ ÔÙ × Ð        ÖÒ ×Ò Ð × Ð
    ÑÓÑ ÒØÓ Ò ÕÙ × Ú × Ø Ð Ö Þº
         Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó Ú × Ø Ð Ö Þ ÒØ × ÓÒØ ÒÙ Ö ÔÓÖ Ð Ö Ñ ÞÕÙ Ö ¸ Ñ ÒØÖ × ÕÙ
     Ð Ò¬ Ó ÐÓ       ×ÔÙ × Ú Ò Ö × Ð Ö Ñ ÞÕÙ Ö º            Ó ×ØÓ¸ ÔÓ ÑÓ× ÔÖ × ÒØ Ö
    Ð Ú Ö× ÓÒ ÒÓ Ö ÙÖ× Ú Ð Ö ÓÖÖ Ó Ò¬ Ó
¾     ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                           ¾    ¾
          template <class Node> inline
      size_t inOrderStack(Node * node, void (*visitFct)(Node *, int, int))
      {
        if (node == Node::NullPtr)
          return 0;
        ArrayStack<Node *, Node::MaxHeight> stack;
        Node *p = node;
        size_t count = 0;
        while (true)
          {
            if (LLINK(p) != Node::NullPtr)
              {
                stack.push(p); // push porque p y RLINK(p) faltan por visitarse
                p = LLINK(p); // avanzar a la izquierda
                continue; // continuar bajando por la rama izquierda
              }
            while (true)
              {
                (*visitFct)(p, stack.size(), count++);
                if (RLINK(p) != Node::NullPtr)
                  {
                    p = RLINK(p); // avanzar a la derecha
                    break;        // ir a visitar ra´z rama derecha
                                                    ı
                  }
                if (stack.is_empty())
                  return count;
                p = stack.pop(); // sacar para ir a rama derecha
              }
          }
      }
´
    4.4. Arboles Binarios                                                                      267



    Í× × ArrayStack ½¼ º
         Ð Ö ÓÖÖ Ó ×Ù¬ Ó × Ñ × ÓÑÔÐ Ó Ý ÓרÓ×Ó ÔÓÖÕÙ Ð × ÑÔ Ð Ö Ý ÕÙ Ú Ö ¬ Ö
    × × ÔÖÓÚ Ò × Ð ÞÕÙ Ö Ó Ð Ö º ÍÒ Ñ Ò Ö                  ר Ò Ù Ö ×Ø Ð ×
    ÔÖÓÚ Ò Ò ÓÒ× ×Ø Ò Ñ Ö Ö Ð ÒÓ Ó ÑÔ Ð Ó ÓÒ Ð × ÒØ Ó Ð Ö ÓÖÖ Óº           ר
    ÑÓ Ó¸ ÔÓ ÑÓ× ¬Ò Ö Ð × Ù ÒØ Ô Ð
¾       Ð Ö ÓÒ Ô Ð ×Ù¬ ¾ ≡
      typedef Aleph::pair<Node*, char> Postorder_Pair;
      ArrayStack<Postorder_Pair, Node::MaxHeight> stack;
    Í× × ArrayStack ½¼ º
     Ð char      Ð Ô Ð Ù Ö ÐÓ× Ú ÐÓÖ × × Ù ÒØ ×
       ¯ ’i’ ÁÒ       ÕÙ × ÑÔ ÐÓ ÒØ ×       × Ò Ö ÔÓÖ Ð Ö Ñ ÞÕÙ Ö º
       ¯ ’l’ ÁÒ       ÕÙ × ÑÔ ÐÓ Ö Ö ×Ó Ð Ö Ñ ÞÕÙ Ö º
       ¯ ’r’ ÁÒ       ÕÙ × ÑÔ ÐÓ Ö Ö ×Ó Ð Ö Ñ Ö º × Ò ×Ø ×Ó ÕÙ ×
          Ú × Ø Ö Ð ÒÓ Óº
    ÍÒ Ö ÓÖÖ Ó ×Ù¬ Ó × Ó Ò ×ØÓ× ÔÖ Ò Ô Ó× ×Ø ÑÔÐ ÒØ Ó Ò Ð Ð ÓØ      Ó Ð ÒÓѹ
     Ö postOrderStack()º Î × Ð Ù ÒØ Ô Ö Ñ ÝÓÖ × Ø ÐÐ × ×Ó Ö Ð ÒרÖÙÑ ÒØ ÓÒ
        ר Ð ÓÖ ØÑÓº

    4.4.7     C´lculo de la cardinalidad
               a
    ÈÖÓ Ð Ñ ÒØ ¸ Ð ÔÐ ÓÒ Ñ × × Ò ÐÐ   ÐÓ× Ö ÓÖÖ Ó× × Ð ÙÐ Ö Ð                          Ö ÒÐ
    ÙÒ Ö ÓÐ Ò Ö Ó¸ Ð Ù Ð ÔÙ ¬Ò Ö× Ö ÙÖ× Ú Ñ ÒØ ÓÑÓ
                                             0                       × T =∅
                                |T | =                                                        ´ º½¼µ
                                             | Ä(T )| + 1 + | Ê(T )| × T = ∅


           ר      ¬Ò ÓÒ ×       ÖÚ          Ö Ø Ñ ÒØ Ð Ð ÓÖ ØÑÓ
¾     ÙÒ ÓÒ ×    BinNode Utils ¾ ¿ +≡                                          ¾   ¾
          template <class Node> inline
      size_t compute_cardinality_rec(Node * node)
      {
        if (node == Node::NullPtr)
          return 0;
        return (compute_cardinality_rec(LLINK(node)) + 1 +
                compute_cardinality_rec(RLINK(node)));
      }


    4.4.8     C´lculo de la altura
               a
    Ê ÙÖ× Ú Ñ ÒØ ¸ Ð ÐØÙÖ            ÙÒ Ö ÓÐ Ò Ö Ó T ×              ¬Ò ÓÑÓ
                                         0                           × T =∅
                           h(T ) =                                                            ´ º½½µ
                                         1 + Ñ Ü(h(Ä(T )), h(Ê(T ))) × T = ∅
268                                                        Cap´        ´
                                                                  ıtulo 4. Arboles



       ר ÑÓ Ó¸ × Ò ÑÓ× ÙÒ Ð ÓÖ ØÑÓ ÓÑÔÐ Ø Ñ ÒØ Ö Ñ Ò × ÒØ               Ð   ¬Ò ÓÒ
¾    ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                       ¾           ¾
         template <class Node> inline
     size_t computeHeightRec(Node * node)
     {
       if (node == Node::NullPtr)
         return 0;
       const size_t left_height = computeHeightRec(LLINK(node));
       const size_t right_height = computeHeightRec(RLINK(node));
       return 1 + Aleph::max(left_height, right_height);
     }
     ¬Ò ×
     computeHeightRec¸   Ù×   Ò ÙÒ ¿ ¼ º

    4.4.9    Copia de ´rboles binarios
                      a
       Ó ÙÒ Ö ÓÐ Ò Ö Ó T ¸ ÓÔ ÖÐÓ ÓÒ× ×Ø Ò Ó Ø Ò Ö ÙÒ Ö ÓÐ Ò Ö Ó T ÙÝ ÓÖÑ
    Ý ÓÒØ Ò Ó × ÓÖÖ ×ÔÓÒ Ü Ø Ñ ÒØ ÓÒ T º ר Ð ÓÖ ØÑÓ ÔÙ        ¬Ò Ö× Ö ÙÖ× Ú ¹
    Ñ ÒØ ÓÑÓ × Ù
¾    ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                       ¾   ¾
         template <class Node> inline
     Node * copyRec(Node * src_root) throw(std::exception, std::bad_alloc)
     {
       if (src_root == Node::NullPtr)
         return (Node*) Node::NullPtr;
       Node * tgt_root = new Node(*src_root);
           LLINK(tgt_root) = copyRec<Node>(static_cast<Node*>(LLINK(src_root)));
           RLINK(tgt_root) = copyRec<Node>(static_cast<Node*>(RLINK(src_root)));
       return tgt_root;
     }
     ¬Ò ×
     copyRec¸   Ù×   Ò ÙÒ ¿ ½ º
         Ò ×Ø Ó Ó × ÑÔÓÖØ ÒØ ÓÑ ÒØ Ö Ð Ñ Ò Ó Ö ÙÖ× ÚÓ              Ø ÔÓ׺ ÆÓØ ¹
    ÑÓ× ÕÙ copyRec() ÓÔ Ö ÓÐ × Ò Ö Ó× ÓÒ ÒÓ Ó× Ø ÔÓ Node¸ Ð Ù Ð ÔÓ Ö
       ÖÚ Ö   ÙÒ Ð ×       ÒÓ Ó     Ö ÓÐ Ò Ö Óº ÈÓÖ × Ö ÞÓÒ¸ Ð ÐÐ Ñ Ö ÙÖ¹
    × Ú copyRec<Node>(LLINK(src root))     ×Ô ¬ Ö ÜÔÐ Ø Ñ ÒØ Ð Ø ÔÓ Node¸ ÔÙ ×
    × ÒÓ¸ Ò Ð ×Ó ÕÙ × ØÖ Ø ÙÒ Ð × Ö Ú ¸ Ð ÓÑÔ Ð ÓÖ ÒÚÓ Ö copyRec()
     ÓÒ Ð Ð × × Ð Ù Ð ÓÖÖ ×ÔÓÒ Ò LLINK(tgt root) Ý RLINK(tgt root)º Ë Ð Ð ×
    Node × ×Ø ÒØ    Ð Ð × ÕÙ Ö ØÓÖÒ Ò LLINK(tgt root) Ý RLINK(tgt root)¸ ÒØÓÒ ×
    Ó ÙÖÖ Ö ÙÒ ÓÒ­ ØÓ Ø ÔÓ׺
        Ä ÓÔ × ÙÒ Ð ÓÖ ØÑÓ ÙÒ Ñ ÒØ Ð Ô Ö ÑÔÐ ÒØ Ö Ð ÓÒרÖÙ ØÓÖ ÓÔ Ý Ð ÓÔ Ö ÓÖ
        × Ò ÓÒ Ò Ø ÔÓ× ×ØÖ ØÓ× ÕÙ Ñ Ò ÔÙÐ Ò Ö ÓÐ × Ò Ö Ó׺

    4.4.10      Destrucci´n de ´rboles binarios
                         o     a
     Ù ÐÕÙ Ö Ì ÕÙ Ñ Ò ÔÙÐ Ö ÓÐ × Ò Ö Ó×   ר Ö Ò Ô                          רÖÙ Ö ØÓ Ó Ð
    Ö Óк × Ö¸ ÒÚÓ Ö Ð ×ØÖÙ ØÓÖ Ý Ð Ö Ö Ð Ñ ÑÓÖ Ó ÙÔ                    ÔÓÖ      ÒÓ Ó Ð
´
    4.4. Arboles Binarios                                                                                  269



    Ö Óк ×ØÓ × Ö Ð Þ Ð × Ù ÒØ ÓÖÑ
¾    ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                                                ¾         ¾
         template <class Node> inline
     void destroyRec(Node *& root)
     {
       if (root == Node::NullPtr)
         return;
       destroyRec((Node*&) LLINK(root));
       destroyRec((Node*&) RLINK(root));
       delete root;
       root = (Node*) Node::NullPtr;
     }
      ¬Ò ×
     destroyRec¸    Ù×     Ò ÙÒ × ¿ ½   Ò ¿¾ º
       ÉÙ Ø ÔÓ Ö ÓÖÖ Ó Ü       ר Ð ÓÖ ØÑÓ Ð Ö Ñ ÒØ ¸ Ð ÓÖÑ × ×Ù¬ Ð Ö Þ
    × Ð Ö ÐÙ Ó Ð Ö Ö Ð × Ó× Ö Ñ ×º ÇØÖ × Ú Ö ÒØ × Ö ÙÖ× Ú × ×Ø Ð ÓÖ ØÑÓ¸ ÕÙ
    × Ùר Ò ÐÓ× Ñ × Ö ÓÖÖ Ó׸ ×ÓÒ ÔÓ× Ð × Ý Ð      × Ò Ö Ó׺
    4.4.11     Comparaci´n de ´rboles binarios
                        o     a
      Ú × × Ò × Ö Ó ÓÑÔ Ö Ö Ó× Ö ÓÐ × Ò Ö Ó׺                           × Ñ ÒØ ¸           Ý Ó× Ö Ø Ö Ó× ÕÙ
    ÔÖ × ÒØ Ö ÑÓ× ÓÒØ ÒÙ ÓÒº
    4.4.11.1     Similaridad
       Ó× Ó× Ö ÓÐ × Ò Ö Ó× T1 Ý T2¸ ×                   ÕÙ   T1   ××ÑÐ Ö       T2¸   Ý×         ÒÓØ ÓÑÓ
                                 T1 = T2 = ∅                                                    ∨
               T1        T2 ⇐⇒                                                                            ´ º½¾µ
                                 T1 = T2 = ∅    ∧       Ä(T1 ) Ä(T2 ) ∧ Ê(T1 ) Ê(T2 )
     ר ¬Ò ÓÒ ×Ù Ö Ð × Ù ÒØ Ó Ó Ö ÙÖ× ÚÓ
¾    ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                                                ¾         ¾¼
         template <class Node> inline
     bool areSimilar(Node * t1, Node * t2)
     {
       if (t1 == Node::NullPtr and t2 == Node::NullPtr)
         return true;
       if (t1 == Node::NullPtr or t2 == Node::NullPtr)
         return false;
       return (areSimilar(LLINK(t1), LLINK(t2)) and areSimilar(RLINK(t1), RLINK(t2)));
     }


    4.4.11.2     Equivalencia
       Ó× Ó× Ö ÓÐ × Ò Ö Ó× T1 Ý T2¸ ×                   ÕÙ   T1   × ÕÙ Ú Ð ÒØ        T2¸   Ý×       ÒÓØ ÓÑÓ
                     T1 = T2 = ∅                                                                                     ∨
    T1 ≡ T2 ⇐⇒
                     T1 = T2 = ∅   ∧    Ã      (Ö   Þ(T1 )) = Ã   (Ö   Þ(T2 )) ∧ Ä(T1 ) ≡ Ä(T2 ) ∧ Ê(T1 ) ≡ Ê(T2 )
                                                                                                         ´ º½¿µ
270                                                            Cap´        ´
                                                                       ıtulo 4. Arboles



         ×    Ö¸ T1 Ý T2 ×ÓÒ × Ñ Ð Ö × Ý ÐÓ× ÓÒØ Ò Ó× ÒÓ Ó ×ÓÒ Ü Ø Ñ ÒØ ÐÓ× Ñ ×ÑÓ׺
     Ä      ¬Ò ÓÒ ÕÙ Ú Ð Ò ÒÓ× ÖÖÓ Ð × Ù ÒØ ÑÔÐ ÒØ ÓÒ Ö ÙÖ× Ú
¾¼       ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                         ¾   ¾¼
             template <class Node, class Equal> inline
         bool areEquivalents(Node * t1, Node * t2)
         {
           if (t1 == Node::NullPtr and t2 == Node::NullPtr)
             return true;
           if (t1 == Node::NullPtr or t2 == Node::NullPtr)
             return false;
           if (not Equal () (KEY(t1), KEY(t2)))
             return false;
           return (areEquivalents<Node, Equal>(LLINK(t1), LLINK(t2)) and
                   areEquivalents<Node, Equal>(RLINK(t1), RLINK(t2)));
         }


     4.4.12       Recorrido por niveles
       Ò ×Ø Ð ×        Ö ÓÖÖ Ó ÙÒ ÓÐ      ×Ö     Ö Ø Ñ ÒØ Ð ÓÖ Ò Ò ÕÙ ×         Ò ÔÖÓ × Ö
     ÐÓ× ÒÓ Ó×
¾¼     ÙÒ ÓÒ ×       BinNode Utils ¾ ¿ +≡                           ¾¼ ¾¾
             template <class Node> inline
         void levelOrder(Node *          root,
                          void           (*visitFct)(Node*, int, bool),
                          const size_t & queue_size)
         {
           const size_t two_power =
               static_cast<size_t>(std::log((float)queue_size)/std::log(2.0) + 1);
           ArrayQueue<Aleph::pair<Node*, bool> > queue(two_power);
           queue.put(root);
           for (int pos = 0; not queue.is_empty(); pos++)
             {
                Aleph::pair<Node*, bool> pr = queue.get();
                Node *& p = pr.first;
                (*visitFct) (p, pos, pr.second);
                if (LLINK(p) != Node::NullPtr)
                  queue.put(Aleph::pair <Node*, bool> (LLINK(p), true));
                if (RLINK(p) != Node::NullPtr)
                  queue.put(Aleph::pair <Node*, bool> (RLINK(p), false));
             }
         }
     Í× × ArrayQueue ½¿ º
          × ÔÓ× Ð ¸ Ò ØÖ Ñ ÒØÓ ÑÙ Ó Ñ × Ø ÑÔÓ¸ Ñ × ÒÓ Ð ×Ô Ó¸ × Ò Ö ÙÒ Ð Ó¹
     Ö ØÑÓ Ö ÙÖ× ÚÓ Ô Ö Ö ÓÖÖ Ö ÔÓÖ Ò Ú Ð ×º ר Ú Ö× ÓÒ × Ð Ò Ö Óº
         Ä ÙÒ ÓÒ Ú × Ø Ø Ò Ð × Ù ÒØ ÔÖÓØÓØ ÔÓ
                 (*visitFct)(Node* p, int pos, bool is_left)

            × Ð ÒÓ Ó Ú × Ø Ó¸ pos × Ð ÔÓ× ÓÒ Ð ÒÓ Ó Ú × Ø Ó ÒØÖÓ Ð Ö ÓÖÖ Ó Ý is left
             p
      × ÙÒ Ú ÐÓÖ ÐÓ Ó ÙÝÓ Ú ÐÓÖ × true × Ð ÒÓ Ó × ÞÕÙ Ö Óº ÍÒ Ð × ÔÐ ÓÒ × Ø Ô ×
´
4.4. Arboles Binarios                                                              271



   Ð Ö ÓÖÖ Ó ÔÓÖ Ò Ú Ð × × Ô Ö Ð Ù Ó Ö ÓР׸ Ò ÙÝÓ ×Ó × ÙØ Ð × Ö × p ×
Ó ÒÓ ÙÒ Ó ÞÕÙ Ö Óº
     Ä ÐÓ      Ð Ð ÓÖ ØÑÓ × ÔÖÓÚ Ö Ð ÔÖÓÔ              Á Ç Ð ÓÐ Ô Ö Ö ÒØ Þ Ö Ð
ÓÖ Ò Ú × Ø Ö ÕÙ Ö Óº ר Ð ÖÓ ÕÙ Ð ÔÖ Ñ Ö ÒÓ Ó Ú × Ø Ö × Ð Ö Þ¸ ÔÓÖ ÐÓ ÕÙ Ð
Ñ Ø ÑÓ× Ò Ð ÓÐ Ý ÓÑ ÒÞ ÑÓ׺              Ú Þ ÕÙ × Ú × Ø ÙÒ ÒÓ Ó¸ ØÓ Ó× ×Ù× ÓÑÔ Ò ÖÓ×
    Ò Ú Ð Ó Ò Ö ÓÒ       Ò × Ö ÐÓ× × Ù ÒØ × ÜØÖ Ö Ð ÓÐ º ×ØÓ × Ö ÒØ Þ ÔÓÖÕÙ
      Ú Þ ÕÙ Ú × Ø ÑÓ× ÙÒ ÒÓ Ó ÒØÖÓ Ù ÑÓ× Ò Ð ÓÐ ×Ù Ó ÞÕÙ Ö Ó Ý ÐÙ Ó ×Ù Ó
   Ö Óº רÓ× Ó× Ú Ò ×Ø Ö Ò Ð ÓÐ ×ÔÙ × ÐÓ× Ò ×ØÖÓ× ×Ù Ò Ú Ð ÒØ Ö ÓÖ
Ý ×ÔÙ × ×Ù× ÓÑÔ Ò ÖÓ× Ò Ú Ð ÕÙ ×Ø Ò Ð Ð Ó ÞÕÙ Ö Óº Ò Ð ¬ ÙÖ º½ ¸
ÐÓ× ÔÖÓÜ ÑÓ× ÒÓ Ó× Ò Ð ÓÐ ×ÓÒ ÐÓ× ÖÑ ÒÓ× Ö Ó× Ð ØÙ Ð ×ØÓ× ÒÓ Ó× Ù ÖÓÒ
 ÒØÖÓ Ù Ó× Ù Ò Ó × ×Ø          Ò Ð Ò Ú Ð ÙÒÓº ×ÔÙ × Ú Ò Ò ÐÓ× ÒÓ Ó× Ð Ò Ú Ð ØÖ × ÕÙ
 Ù ÖÓÒ ÒØÖÓ Ù Ó× Ù Ò Ó × ÔÖÓ × ÖÓÒ ÐÓ× ÖÑ ÒÓ× ÞÕÙ Ö Ó× Ð ÒÓ Ó ØÙ к


                                         ØÙ Ð

                                           Ö ÒØ
                               ÌÖ × ÖÓ


         ÙÖ º½     ר Ó       Ð ÓÐ Ù Ò Ó × ÔÖÓ × Ð ÒÓ Ó Ò            Ó ÓÒ ­

     ר Ö ÓÖÖ Ó × Ð Ñ × ÓרÓ×Ó ÐÓ× Ù ØÖÓ¸ ÔÙ × × ÔÙ Ö ÕÙ Ö Ö ÐÑ Ò Ö
ÑÙ × ÑÓ× ÒÓ Ó× Ò Ð ÓÐ º Ë Ð × Ó × Ð Ö ÓÐ Ø Ò Ò ×Ø Ö Ò Ð Ñ ×ÑÓ Ò Ú Ð¸
 ÒØÓÒ ×¸ ÔÓÖ      Ò Ú Ð ÕÙ × × Ò ¸ × Ö ÕÙ Ö Ö ÐÑ Ò Ö Ð Ó Ð Ð ÒØ
   ÒÓ Ó× ×Ø ÐÐ Ö Ð Ò Ú Ð ÓÒ × Ò Ù ÒØÖ Ò Ð × Ó ×º
   ËÙÔÓÒ ÑÓ× ÕÙ Ð ÒØ             ÒÓ Ó×       Ò Ú Ð × ÔÓØ Ò Ü Ø  Ó× Ó × ¸
     Ò Ú Ð Ð Ö ÓÐ ×Ø ÐÐ ÒÓº ÒØÓÒ ×¸ ×ÙÑ Ò Ó ÐØÙÖ ÓÒÓ h¸ ÔÓ ÑÓ× ÜÔÖ × Ö
Ð ÒØ          ÒÓ Ó× n ÓÑÓ h−1 2iº × Ö¸ Ø Ò Ö ÑÓ× 2h−1 ÒÓ Ó× ÐÑ Ò Ó× Ò Ð
                             i=0
 ÓÐ Ù Ò Ó ÒÓ× ØÓÕÙ ÔÖÓ × Ö Ð ÙÐØ ÑÓ Ò Ú Ðº
   ÈÙ ×ØÓ ÕÙ Ð ÓÖÑ           ÙÒ Ö ÓÐ ÔÙ × Ö ×Ø ÒØ Ö ØÖ Ö ¸ Ð ÔÖ Ñ Ø Ú
levelOrder() Ö        ÓÑÓ Ô Ö Ñ ØÖÓ Ð Ø Ñ ÒÓ Ñ Ü ÑÓ Ð ÓÐ Ý Ð     Ð Ð ÒØ
 Ð ×Ø Ñ Ö ÙÒ Ø Ñ ÒÓ      Ù Ó × ÙÒ ×Ù ÔÐ ÓÒº
4.4.13   Construcci´n de ´rboles binarios a partir de recorridos
                   o     a
  ÓÒ× Ö ÑÓ× Ð ÔÖÓ Ð Ñ     ÐÑ Ò Ö Ò ÙÒ × Ù Ò ÙÒ Ö ÓÐ Ö ÔÖ × ÒØ Ó Ò Ñ ÑÓ¹
Ö º ר ÔÖÓ Ð Ñ × ÐØÓ ÒØ Ö × Ò × ØÙ ÓÒ × ÓÒ Ö ÕÙ Ö ÑÓ× Ù Ö Ö Ð Ö ÓÐ Ò
ÙÒ Ö ÚÓ Ó ØÖ Ò×Ñ Ø ÖÐÓ Ò ÙÒ Ñ Ò× º
     Ù ÐÕÙ Ö Ø Ò ÕÙ × Ù Ò Ð ÙÒ Ö ÓÐ ´ÐÓ ÐÑ Ò Ò ÙÒ × Ù Ò µ ר ×
 Ò ×Ù× Ö ÓÖÖ Ó׺ Ò Ü º º¾ ´Ô Ò ¾ ¿µ ×ØÙ ÑÓ× Ð ÙÒ × Ø Ò × ÕÙ Ô ÖÑ Ø Ò
Ö ÓÒרÖÙ Ö ÙÒ Ö ÓÐ Ò Ö Ó Ô ÖØ Ö ÙÒÓ ×Ù× Ö ÓÖÖ Ó׺ ÆÓ× ×Ø       ÓÒ ÙÒ ×ÓÐÓ
Ö ÓÖÖ Ó ÔÓÖÕÙ ÓÒÓ ÑÓ× Ð ¬Ò Ð Ö Óк Ë ×Ø ÓÒÓ Ñ ÒØÓ ÒÓ × × ÕÙ Ð ¸ Ó ×
ÕÙ Ö ÑÓ× × Ù Ò Ð Þ Ö Ñ Ò Ö Ò Ö Ð¸ ÒØÓÒ × Ý Ó× Ñ Ò Ö × × ÐÚ Ö Ð Ö Óк
   ÆÓØ × ÕÙ × ÙÒ Ð ÕÙ Ú Ð Ò    ÒØÖ Ö ÓÐ × Ý Ö ÓÐ × Ò Ö Ó× × ×Ù¬ ÒØ ÓÒ ×ØÙ Ö ÐÓ× Ò Ö Ó׺
272                                                                                Cap´        ´
                                                                                           ıtulo 4. Arboles



     ÍÒ ÓÒ× ×Ø Ð Ð ÙÐ Ö ×Ù × Ù Ò Ó Ó Ý ÐÙ Ó ÐÑ Ò Ö Ð × Ð Ú × Ò ÔÖ ¬ Ó
     Ø Ò ÕÙ × Ö Ú Ð Ö Ý ×ØÙ Ö Ò Ü º º¼º ´Ô Ò ¿¾½µº Ä × ÙÒ ÓÒ× ×Ø Ò
      Ù Ö Ö Ó× Ö ÓÖÖ Ó× Ù Ð ×ÕÙ Ö Ý Ô ÖØ Ö ÐÐÓ× Ö ÓÒרÖÙ Ö Ð Ö ÓÐ ÓÖ Ò Ðº
         ÈÙ ×ØÓ ÕÙ Ý ÑÓ× ×ØÙ Ó ÐÓ× Ö ÓÖÖ Ó׸ ÒÓ×    × Ö × Ò ÐÐÓ Ú ×ÐÙÑ Ö Ö ÖÙØ Ò ×
     ÕÙ ØÓÑ Ò ÙÒ Ö ÓÐ Ý ÐÓ × Ù Ò Ð Òº ÄÓ ÕÙ ÕÙ Þ ÒÓ × Ò Ø Ò Ð × Ð ÒÚ Ö× ÓÒ
      × Ö¸ Ö ÓÒרÖÙ Ö Ð Ö ÓÐ Ô ÖØ Ö ×Ù× × Ù Ò ×º
        Ä × Ù ÒØ ÖÙØ Ò Ö ÓÒרÖÙÝ ÙÒ Ö ÓÐ Ò Ö Ó Ô ÖØ Ö ×Ù× Ö ÓÖÖ Ó× ÔÖ ¬ Ó
      Ò¬ Ó
¾¾     ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                       ¾¼ ¾¿
           template <template <class> class Node, typename Key> inline
       Node<Key> * build_tree(DynArray<Key> & preorder,
                              const int & l_p, const int & r_p,
                              DynArray<Key> & inorder,
                              const int & l_i, const int & r_i)
       {
         if (l_p > r_p) // ¿est´ vac´o el recorrido?
                               a    ı
           return Node <Key> ::NullPtr;
         Node<Key> * root = new Node <Key> (preorder[l_p]); // crear la ra´z
                                                                          ı
         if (r_p == l_p)
           return root; // recorrido de longitud 1
                Ð ÙÐ Ò Ð ÔÓ× ÓÒ              ÔÖ ÓÖ Ö Ð Ô Ò ÒÓÖ Ö ¾ ¿
            LLINK(root) = build_tree <Node, Key> (preorder, l_p + 1, l_p + i,
                                                  inorder, l_i, l_i + (i - 1));
            RLINK(root) = build_tree <Node, Key> (preorder, l_p + i + 1, r_p,
                                                  inorder, l_i + i + 1, r_i);
            return root;
       }
     Í× × DynArray ¾º
           Ä ÓÒרÖÙ ÓÒ Ð Ö ÓÐ ÔÙ                   Ô ØÓÖ Þ Ö×           Ð × Ù ÒØ Ñ Ò Ö
                                                 l_p                                     r_p
                                 preorder[] k                 L_p              R_p


                                   inorder[]            L_i         k          R_i
                                                l_i                 i                   r_i

           build_tree(preorder,l_p+1,lp+i,inorder,l_i,l_i+(i-1));         build_tree(preorder,l_p+i+1,r_p,inorder,l_i+i+1,r_i);
                                                                    k




        preorder[] × ÙÒ ÖÖ ÐÓ ÕÙ ÓÒØ Ò Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó ÒØÖ ÐÓ× Ò    × l p Ý r pº
       Ð Ñ ×ÑÓ ÑÓ Ó¸ inorder[] × ÙÒ ÖÖ ÐÓ ÕÙ ÓÒØ Ò Ð Ö ÓÖÖ Ó Ò¬ Ó ÒØÖ ÐÓ×
      Ò × l i Ý r iº Ä ÖÙØ Ò Ö ØÓÖÒ Ð Ö Þ Ð ÒÙ ÚÓ Ö ÓÐ Ò Ö Óº
        Ä ÐÓ       Ð Ð ÓÖ ØÑÓ × × ÑÔÐ º Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ ÙÒ Ö ÓÖÖ Ó ÔÖ ¬ Ó × Ð
     Ö Þ Ð Ö Óи Ð Ù Ð Ù× ÑÓ× Ò Ð Ö ÓÖÖ Ó Ò¬ Ó Ý Ó Ø Ò ÑÓ× Ð ×ÔÐ Þ Ñ ÒØÓ iº Ð
      Ò i Ú Ð Ö ÓÖÖ Ó Ò¬ Ó Ò Ó× Ô ÖØ × ÐÓ× Ð Ñ ÒØÓ× Ð ÞÕÙ Ö ÕÙ ×ÓÒ l i ..
     i - 1 Ý ÕÙ Ô ÖØ Ò Ò Ð Ö Ñ ÞÕÙ Ö ¸ Ñ ÒØÖ × ÕÙ ÐÓ× Ð Ñ ÒØÓ× Ð      Ö ×ÓÒ i
     + 1 .. r i Ý ÕÙ Ô ÖØ Ò Ò Ð Ö Ñ       Ö º Ñ Ó× Ø ÔÓ× Ö ÓÖÖ Ó ÒÓ Ú ÒÞ Ò
     Úר ÖÐ Ö Ñ Ö           ר Ø ÒØÓ ÒÓ × Ý Ú × Ø Ó Ð ØÓØ Ð   Ð ×Ù Ö ÓÐ ÞÕÙ Ö Ó
´
     4.4. Arboles Binarios                                                        273



     Ý Ð Ö Þº ÈÓÖ Ø ÒØÓ¸ Ù×ØÓ ÒØ × ÓÑ ÒÞ Ö Ú × Ø Ö Ð Ö Ñ Ö ¸ Ñ            Ó× Ö ÓÖÖ Ó×
        Ò Ú × Ø Ó Ð Ñ ×Ñ ÒØ        ÒÓ Ó× ´Ð Ö Ñ ÞÕÙ Ö Ý Ð Ö Þµº ×ØÓ       Ú Ò ÕÙ
     ÐÓ× Ö ÓÖÖ Ó× ÔÖ ¬ Ó Ò¬ Ó Ð Ö Ñ Ö          ר Ò ÓÒØ Ò Ó× Ò Ñ Ó×       ÖÖ ÐÓ× ÒØÖ
     l p + i + 1 Ý r pº
         Ä Ø ÓÒ Ö ÓÐ Ú Ó × Ö Ð Þ Ù Ò Ó ÐÓ× Ö ÓÖÖ Ó× ×ÓÒ Ú Ó× ×               Ö¸ Ù Ò Ó
     ÐÓ× Ò × ÐÓ× Ö ÓÖÖ Ó× × ÖÙÞ Òº
         Ä Ô ÖØ Ñ × Ð          × Ù× Ö Ð ÔÓ× ÓÒ Ö Ð Ø Ú   Ð Ö Þ ÒØÖÓ         Ð Ö ÓÖÖ Ó
      Ò¬ Óº ×ØÓ ÐÓ Ö Ð Þ ÑÓ× Ù Ó× Ñ ÒØ Ñ ÒØ Ò×Ô ÓÒ × Ù Ò Ð
¾¿       Ð ÙÐ Ò Ð ÔÓ× ÓÒ ÔÖ ÓÖ Ö Ð Ô Ò ÒÓÖ Ö ¾ ¿ ≡              ´¾ ¾µ
       int i = 0;
       for (int j = l_i; j <= r_i; ++j)
         if (inorder[j] == preorder[l_p])
           {
             i = j - l_i;
             break;
           }


     4.4.14       Conjunto de nodos en un nivel
      Ò Ð ÙÒ × × ØÙ ÓÒ × × Ò × Ö Ó ÓÒÓ Ö Ù Ð × ×ÓÒ ÐÓ× ÒÓ Ó× ÙÒ Ö ÓÐ ÕÙ × Ò¹
      Ù ÒØÖ Ò Ò ÙÒ Ø ÖÑ Ò Ó Ò Ú Ð i º ÔÓÖ ÑÔÐÓ¸ Ù Ò Ó × Ù Ò Ö ÓР׸     ØÓ×
       Ùר Ö Ð × ÔÓ× ÓÒ × ÐÓ× ÒÓ Ó× Ò ÙÒ Ò Ú Ð Ø ÖÑ Ò Óº
        Ä × Ù ÒØ ÖÙØ Ò Ö ÓÖÖ Ö ÙÖ× Ú Ñ ÒØ Ð Ö ÓÐ ÓÒ Ö Þ root Ý Ù Ö Ò
     Ð Ð ×Ø level list ÐÓ× ÒÓ Ó× ÕÙ × Ò Ù ÒØÖ Ò Ò Ð Ò Ú Ð levelº Ð Ô Ö Ñ ØÖÓ
     current level ÒÓØ Ð Ò Ú Ð Ð ÒÓ Ó ÕÙ × ×Ø Ú × Ø Ò Ó
¾¿     ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                         ¾¾ ¾
           template <class Node> inline static
       void __compute_nodes_in_level(Node * root,
                                     const int & level,           // nivel deseado
                                     const int & current_level,   // nivel actual
                                     DynDlist<Node*> & level_list)
       {
         if (root == Node::NullPtr)
           return;
         if (current_level == level)
           {
             level_list.append(root);
             return; // no vale la pena descender m´s
                                                   a
           }
         __compute_nodes_in_level(LLINK(root), level, current_level + 1, level_list);
         __compute_nodes_in_level(RLINK(root), level, current_level + 1, level_list);
       }
     Í× × DynDlist ¿ º
          Ð Ö ÓÐ × Ö ÓÖÖ Ò ÔÖ ¬ Ó Ý ÐÓ× ÒÓ Ó× × Ù Ö Ò Ò Ð Ð ×Ø ÔÓÖ Ò Ú Ð ÞÕÙ Ö
         Ö º         ÖÒ    Ð Ö ÓÖÖ Ó ÔÓÖ Ò Ú Ð ×¸ ÒÓ × Ò × Ö Ó Ù× Ö ÙÒ ÓÐ º
         ÕÙ Ú Ð     Ð ÔÖÓ ÙÒ   Ö ÙÖ× Ú º
274                                                             Cap´        ´
                                                                       ıtulo 4. Arboles



        Ä ÖÙØ Ò ÒØ Ö ÓÖ    ÐÐ Ñ Ö× ÔÓÖ Ð ÕÙ ÙÒ Ö              ÒØ Ö Þ¸ Р٠и × ×Ô ¬
       Ð × Ù ÒØ ÓÖÑ
¾     ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                                ¾¿ ¾
          template <class Node> inline
      void compute_nodes_in_level(Node * root, const int & level, DynDlist<Node*>& list)
      {
        __compute_nodes_in_level(root, level, 0, list);
      }
    Í× × DynDlist ¿ º

    4.4.15    Hilado de ´rboles binarios
                        a
       × Ð Ù Ö ÕÙ ÙÒ Ö ÓÐ Ò Ö Ó n ÒÓ Ó× ÓÒ×ÙÑ 2n ÔÙÒØ ÓÖ ×º È ÖÓ ÕÙ Þ
    ÒÓ × Ø Ò Ð ÔÖ Ò Ö ÕÙ Ô Ö Ù ÐÕÙ Ö Ö ÓÐ Ò Ö Ó Ð ÒØ                         ØÓØ Ð ÔÙÒ¹
    Ø ÖÓ× ÓÒ Ð Ú ÐÓÖ NULL × ÑÔÖ × Ñ ÝÓÖ ÕÙ Ð ÒØ                 ÔÙÒØ ÖÓ× × Ò Ó׺ Å ×
         Ð ÒØ ´ÔÖÓÔÓ× ÓÒ Ü º¾ ´Ô Ò ¾ µµ ÑÓ×ØÖ Ö ÑÓ× Ð Ú Ö                   ר ¬ÖÑ ÓÒº
           ×ÙÑ Ò Ó Ú Ö Þ Ð ¬ÖÑ ÓÒ ÒØ Ö ÓÖ¸ Ð ÙÒÓ× Ò Ù ×Ø ÓÒ Ó Ð ×Ô Ö Ó
      ×Ô Ó Ù× Ó ÔÓÖ ÐÓ× ÔÙÒØ ÖÓ× ÒÙÐÓ׺ Ø ÒÓÖ Ð ÓÖÖ ¸ ÔÙ Ò ÓÒ× Ö Ö× Ð × × ¹
      Ù ÒØ × Ô Ö×Ô Ø Ú ×
        ½º ÈÓ ÑÓ× Ø Ò Ö ØÖ × Ø ÔÓ× ÒÓ Ó× ÓÑÔÐ ØÓ¸ Ò ÓÑÔÐ ØÓ Ý Ó º                ÒÓ Ó Ó Ù¹
            Ô Ö Ð ×Ô Ó Ü ØÓ × ÙÒ Ð Ø ÔÓ ÒÓ Óº ÈÓÖ ×ÙÔÙ ×ØÓ¸              ÒÓ Ó Ø Ò Ö ÕÙ
            Ø Ò Ö ÙÒ ÑÔÓ       ÓÒ Ð ÕÙ Ò ÕÙ ×Ù Ø ÔÓº
              ר ×ÓÐÙ ÓÒ × ÙÒ ÐØ ÖÒ Ø Ú ÑÔÓÖØ ÒØ Ý Ô Ð Ð × Ý Ö ÕÙ Ö Ñ ÒØÓ× Ö Ø Ó×
                 ×Ô Óº ÐÐ ÓÐ ¸ × Ò Ñ Ö Ó¸ ר Ø ×ÑÓ Ò Ð × ÒØ Ó ÕÙ × Ð Ö ÓÐ
               Ñ       Ò Ñ Ñ ÒØ ¸ ÒØÓÒ × Ð Ø ÔÓ ÒÓ Ó ÔÙ         Ñ Öº Ì Ñ Ò Ð × ÓÔ Ö ¹
              ÓÒ × ×Ó Ö ×ØÓ× Ö ÓÐ × ×ÓÒ Ñ × ÓÑÔÐ × ÔÓÖÕÙ ×Ø ×        Ò ×Ø Ò Ù Ö ÐÓ× Ø ÔÓ×
                ÒÓ Ó׺
        ¾º ÍØ Ð Þ Ö ÐÓ× ÔÙÒØ ÓÖ × ÒÙÐÓ× Ô Ö ÐÑ Ò Ö Ò ÓÖÑ ÓÒ            ÓÒ Ðº ÕÙ ×ÙÖ Ð
            ÔÖ ÙÒØ Ù Ð Ò ÓÖÑ ÓÒ Ô Ö ÕÙ
         È ÖÐ × Ý Ì ÓÖÒØÓÒ ½ × Ù Ö ÖÓÒ ÙÒ Ù×Ó Ò Ò Ó×Ó ÐÓ× ÔÙÒØ ÖÓ× ÒÙÐÓ׺ Ð Ñ ØÓ Ó
      ÓÒ× ×Ø Ò Ö ÑÔÐ Þ Ö ÔÙÒØ ÖÓ× ÒÙÐÓ× ÔÓÖ ÐÓ× ÕÙ Ú Ý Ò            ÓØÖ × Ô ÖØ × Ð Ö Óк
    Ä           × Ð Ø Ö Ð Ö ÓÖÖ Ó Ý¸ ÓÒ× Ù ÒØ Ñ ÒØ ¸ ÐÓ× Ð ÓÖ ØÑÓ׺
              Ó ÙÒ ÒÓ Ó p¸ Ò ÓÑÔÐ ØÓ Ù Ó ¸ Ð ÔÖ Ò Ô Ó ×Ø    Ó ÔÓÖ Ð × Ó× Ö Ð × × Ù ÒØ ×
         ¯ LLINK(p) ÔÙÒØ Ð ÒÓ Ó ÔÖ         ×ÓÖ Ò¬ Óº
         ¯ RLINK(p) ÔÙÒØ Ð ÒÓ Ó ×Ù ×ÓÖ Ò¬ Óº

         Ä ¬ ÙÖ º½ ÐÙ×ØÖ Ð Ð Ó               ÙÒ Ö Óк ÄÓ× ÐÓ× ×ÓÒ Ö ÔÖ × ÒØ Ó× Ñ ÒØ
    Ð Ò × ÓÖØ ׺
             ÓÖ ×ØÙ ÑÓ× ÓÑÓ           Ö Ð Þ Ö× Ð Ö ÓÖÖ Ó Ò¬ Óº È Ö ÐÐÓ Ú ÑÓ× ÙÒ Ð Ó¹
    Ö ØÑÓ ÕÙ Ù×ÕÙ Ð ×Ù ×ÓÖ Ò¬ Óº
    Algoritmo 4.7 (B´ squeda del sucesor en un arbol hilado)
                    u                          ´                    Ä        ÒØÖ   Ð Ð Ó¹
    Ö ØÑÓ × ÙÒ ÔÙÒØ ÓÖ p ÙÒ ÒÓ Óº Ä × Ð × Ð ×Ù ×ÓÖ Ò¬ Ó                 pº

      ½º Ë   RLINK(p)   × ÙÒ ÐÓ =⇒ Ö ØÓÖÒ   RLINK(p)º
´
           4.4. Arboles Binarios                                                                                                                                                                                                                                                                     275



                                                                                                                                                                                                                                                     T
                                                                                                                                                                                                                                                     º º º
                                                                                                                                                                                                                                                     º º
                                                                                                                                                                                                                                                     º º
                                                                                                                                                                                                                                                     º º
                                                                                                                                                                                                                                                     º
                                                                                                                                                                                                                                                     º º
                                                                                                                                                                                                                                                     º º
                                                                                                                                                                                                                                                     º º
                                                                                                                                                                                                                                                     º º
                                                                                                                                                                                                                                                     º º
                                                                                                                                                                                                                                                     º º
                                                                                                                                                                                                                                                     º º
                                                                                                                                                                                                                                                     º º
                                                                                                                                                                                                                                                     º º
                                                                                                                                                                                                                                                     º º
                                              D                                                                                                                                                                                                      ºº
                                                                                                                                                                                                                                                     ºº
                                                                                                                                                                                                                                                     ºº
                                                                                                                                                                                                                                                      ºº
                                                                                                                                                                                                                                                     ºº  º                                                                         Z
                                         º
                                         º                                                                                                                                                                                                            ºº
                                                                                                                                                                                                                                                      ººº
                                         º
                                         º     º
                                               º                                                                                                                                                                                                      ºº
                                                                                                                                                                                                                                                      º                                                                            º
                                                                                                                                                                                                                                                                                                                                   º
                                         º
                                         º     º
                                               º                                                                                                                                                                                                      º
                                                                                                                                                                                                                                                      ºº                                                                           º
                                                                                                                                                                                                                                                                                                                                   º
                                                                                                                                                                                                                                                                                                                                   º
                                         ºº    º                                                                                                                                                                                                      ºº
                                                                                                                                                                                                                                                      ººº                                                                          º
                                          º
                                          º    º
                                               º                                                                                                                                                                                                      ºº
                                                                                                                                                                                                                                                      ºº                                                                           º
                                                                                                                                                                                                                                                                                                                                   º
                                                                                                                                                                                                                                                                                                                                   º
                                          º
                                          º   º                                                                                                                                                                                                       ºº
                                                                                                                                                                                                                                                      ºº                                                                           º
                                                                                                                                                                                                                                                                                                                                   º
                                          º
                                          º   º
                                              º                                                                                                                                                                                                       ºº
                                                                                                                                                                                                                                                      ºº                                                                           º
                                          º
                                          º   º
                                              º                                                                                                                                                                                                       ºº
                                                                                                                                                                                                                                                      ºº                                                                           º
                                                                                                                                                                                                                                                                                                                                   º
                                                                                                                                                                                                                                                                                                                                   º

                         º
                              C   º
                                          º
                                          º
                                          º
                                          º
                                          º
                                          º
                                          º
                                          º
                                          º
                                              º
                                              º
                                              º
                                              º
                                              º
                                              º
                                              º
                                                                                                                                                                                                                                       R              ºº
                                                                                                                                                                                                                                                      º
                                                                                                                                                                                                                                                      º
                                                                                                                                                                                                                                                      ºº
                                                                                                                                                                                                                                                      ºº
                                                                                                                                                                                                                                                      ºº
                                                                                                                                                                                                                                                      ºº
                                                                                                                                                                                                                                                      º
                                                                                                                                                                                                                                                                                                           X    º
                                                                                                                                                                                                                                                                                                                                   º
                                                                                                                                                                                                                                                                                                                                   º
                                                                                                                                                                                                                                                                                                                                   º
                                                                                                                                                                                                                                                                                                                                   º
                                                                                                                                                                                                                                                                                                                                   ºº
                         º        º
                                  º       º   º
                                              º                                                                                                                                                                                         º º           ºº
                                                                                                                                                                                                                                                      ºº                                                        º                   º
                                                                                                                                                                                                                                                                                                                                    º
                         º        º
                                  º       º   º                                                                                                                                                                                         º º
                                                                                                                                                                                                                                        º º           ºº
                                                                                                                                                                                                                                                      ºº                                                   º    º                   º
                         º
                         º
                         º         º º
                                   º º    º
                                          º
                                          º
                                              º
                                              º
                                              º                                                                                                                                                                                         º º
                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                        º º
                                                                                                                                                                                                                                            º         ºº
                                                                                                                                                                                                                                                      ºº
                                                                                                                                                                                                                                                                                                           º
                                                                                                                                                                                                                                                                                                           º
                                                                                                                                                                                                                                                                                                           º    º
                                                                                                                                                                                                                                                                                                                º                   º
                                                                                                                                                                                                                                                                                                                                    º
                                                                                                                                                                                                                                                                                                                                    º
                         º
                         º         º º
                                    º º       º
                                              º                                                                                                                                                                                         º º
                                                                                                                                                                                                                                        º º           ºº
                                                                                                                                                                                                                                                      ºº                                                   º
                                                                                                                                                                                                                                                                                                           º    º
                                                                                                                                                                                                                                                                                                                º                   º
                                                                                                                                                                                                                                                                                                                                    º
                         º
                         ºº
                                    º º
                                    º º
                                    º º
                                     º        º
                                              º
                                              º
                                                                                                                                                                                                                                        º º
                                                                                                                                                                                                                                        º º
                                                                                                                                                                                                                                         º    º      ºº
                                                                                                                                                                                                                                                      º
                                                                                                                                                                                                                                                     ºº
                                                                                                                                                                                                                                                     º                                                     º
                                                                                                                                                                                                                                                                                                           º
                                                                                                                                                                                                                                                                                                           º    º
                                                                                                                                                                                                                                                                                                                º                   º
                                                                                                                                                                                                                                                                                                                                    º
                                                                                                                                                                                                                                                                                                                                    º
                          º
                          º          º º
                                     º º
                                     º        º
                                              º                                                                                                                                                                                          º
                                                                                                                                                                                                                                         º
                                                                                                                                                                                                                                         º
                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                               º     ºº
                                                                                                                                                                                                                                                     º
                                                                                                                                                                                                                                                     ºº
                                                                                                                                                                                                                                                                                                           º
                                                                                                                                                                                                                                                                                                           º    º
                                                                                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                                                                                º                   º
                                                                                                                                                                                                                                                                                                                                    º
                          º
                          º
                          º           ºº
                                       ººº
                                      ºº      º
                                              º                                                                                                                                                                                          º
                                                                                                                                                                                                                                         º
                                                                                                                                                                                                                                         º      º ºº
                                                                                                                                                                                                                                               º ºº
                                                                                                                                                                                                                                                º ºº ºº                                                    º
                                                                                                                                                                                                                                                                                                           º
                                                                                                                                                                                                                                                                                                           º
                                                                                                                                                                                                                                                                                                           º
                                                                                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                                                                                º                   º
                                                                                                                                                                                                                                                                                                                                    º
                                                                                                                                                                                                                                                                                                                                    º
               B          º
                          º
                          º
                                       ºº
                                        º     º
                                              º
                                              º         E                                                                                                                                                                                º
                                                                                                                                                                                                                                         º       ºº º º
                                                                                                                                                                                                                                                 º ºº
                                                                                                                                                                                                                                                  ººº º                             V                      º    º
                                                                                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                                                                                º       Y           º
                                                                                                                                                                                                                                                                                                                                    º
                          º
                          º
                          º
                                              º
                                              º
                                              º
                                                                                                                                                                                                                                         º
                                                                                                                                                                                                                                         º
                                                                                                                                                                                                                                         º
                                                                                                                                                                                                                                         º          º º
                                                                                                                                                                                                                                                   ºº ºº
                                                                                                                                                                                                                                                                                                           º
                                                                                                                                                                                                                                                                                                           º
                                                                                                                                                                                                                                                                                                           º    º
                                                                                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                                                                                                    º
                                                                                                                                                                                                                                                                                                                                    º
                                                                                                                                                                                                                                                                                                                                    º
                                                                                                                                                                                                                                                                                                                                    º
          º        º      º
                          º                   º
                                              º
                                              º                                                                                                                                                                                          º             º
                                                                                                                                                                                                                                                       º                       º        º                   º
                                                                                                                                                                                                                                                                                                            º   º
                                                                                                                                                                                                                                                                                                                º   º               º
                                                                                                                                                                                                                                                                                                                                    º
                                                                                                                                                                                                                                                                                                                                    º
          º        º
                   º      º
                          º                   º         º     º                                                                                                                                                                          º
                                                                                                                                                                                                                                         º
                                                                                                                                                                                                                                         º             º
                                                                                                                                                                                                                                                       º                       º        º                   º
                                                                                                                                                                                                                                                                                                            º   º
                                                                                                                                                                                                                                                                                                                º   º   º           º
          º
          º        º
                   º º                        º
                                              º        ºº
                                                        º    º
                                                             º                                                                                                                                                                           º             º
                                                                                                                                                                                                                                                       º                       º
                                                                                                                                                                                                                                                                               º        º                   º   º º º
                                                                                                                                                                                                                                                                                                                    º   º
                                                                                                                                                                                                                                                                                                                        º           º
                                                                                                                                                                                                                                                                                                                                    º
          º
          º         º º
                    º º   º                   º
                                              º        º
                                                       º     º
                                                             º                                                                                                                                                                           º
                                                                                                                                                                                                                                         º             º
                                                                                                                                                                                                                                                       º                       º
                                                                                                                                                                                                                                                                               º        º
                                                                                                                                                                                                                                                                                        º                   º
                                                                                                                                                                                                                                                                                                            º   º º
                                                                                                                                                                                                                                                                                                                º º
                                                                                                                                                                                                                                                                                                                º º
                                                                                                                                                                                                                                                                                                                        ºº
                                                                                                                                                                                                                                                                                                                         º          º
                                                                                                                                                                                                                                                                                                                                    º
          º
          º         º º
                     º º  º                   º
                                              º
                                              º        º     º                                                                                                                                                                           º
                                                                                                                                                                                                                                         º             º
                                                                                                                                                                                                                                                       º                       º
                                                                                                                                                                                                                                                                               º        º
                                                                                                                                                                                                                                                                                        º                   º
                                                                                                                                                                                                                                                                                                            º   º º      ºº         º
                                                                                                                                                                                                                                                                                                                                    º
                                                                                                                                                                                                                                                                                                                                    º
           º
           º         º º
                     º º                      º
                                              º      ºº      º
                                                             º
                                                             º                                                                                                                                                                           º
                                                                                                                                                                                                                                         º             º
                                                                                                                                                                                                                                                       º
                                                                                                                                                                                                                                                       º                       ºº       º                   º
                                                                                                                                                                                                                                                                                                            º   º º
                                                                                                                                                                                                                                                                                                                º º
                                                                                                                                                                                                                                                                                                                º º       º
                                                                                                                                                                                                                                                                                                                          º        ºº
           º
           º         º º
                     º º                      º
                                              º      º
                                                     º       º
                                                             º                                                                                                                                                                           º
                                                                                                                                                                                                                                         º             ºº                       º
                                                                                                                                                                                                                                                                                º       º
                                                                                                                                                                                                                                                                                        º                   º
                                                                                                                                                                                                                                                                                                            º   º º
                                                                                                                                                                                                                                                                                                                º º        º
                                                                                                                                                                                                                                                                                                                           º       º
           º          º º
                      º º
                      º                       º
                                              º     º
                                                    º        º                                                                                                                                                                           º
                                                                                                                                                                                                                                         º              º                       º       º
                                                                                                                                                                                                                                                                                        º                   º   º º
                                                                                                                                                                                                                                                                                                                º º        ºº      º
                                                                                                                                                                                                                                                                                                                                   º
           º
           º          º º
                       ºº                     º º
                                               º º           º
                                                             º
                                                             º                                                                                                                                                                           ºº             º
                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                        º                       º
                                                                                                                                                                                                                                                                                º       º
                                                                                                                                                                                                                                                                                        º                   º
                                                                                                                                                                                                                                                                                                            º   ºº
                                                                                                                                                                                                                                                                                                                ºº          º º
                                                                                                                                                                                                                                                                                                                             º º   º
           º           ºº                      º º                                                                                                                                                                                        º             º                       º       º                   º   ºº           º º
A   º
           º
           º
           º
           º
           º
           º
           º
                       ºº
                        º                      º º
                                               º º
                                                ººº
                                                 ºº
                                                ºº
                                                             º
                                                             º
                                                             º
                                                             º
                                                             º
                                                             º
                                                             º
                                                                                                                                                                                 N                                                        º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                                    U    º
                                                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                                                                 W          º
                                                                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                                                                ºº
                                                                                                                                                                                                                                                                                                                 ºº           º º
                                                                                                                                                                                                                                                                                                                              º º
                                                                                                                                                                                                                                                                                                                               ººº
                                                                                                                                                                                                                                                                                                                               ººº
                                                                                                                                                                                                                                                                                                                                ºº
    º
    º      º                                                ºº                                                                                                                   º º                                                      º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º             º
                                                                                                                                                                                                                                                        º                º
                                                                                                                                                                                                                                                                         º      º       º    º
                                                                                                                                                                                                                                                                                             º   º          º
                                                                                                                                                                                                                                                                                                            º
    º º
    º      º                                                º                                                                                                                    º º                                                      º             º            º   º      º       º º  º   º
                                                                                                                                                                                                                                                                                                 º          º
     º º
     º º   º
                                                            º
                                                            º
                                                            º
                                                                                                                                                                                 º º
                                                                                                                                                                                 º º
                                                                                                                                                                                 º º
                                                                                                                                                                                 º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                        º           º
                                                                                                                                                                                                                                                                    º
                                                                                                                                                                                                                                                                     º
                                                                                                                                                                                                                                                                     º   ºº º
                                                                                                                                                                                                                                                                          º º   º
                                                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                                                        º º
                                                                                                                                                                                                                                                                                        º º
                                                                                                                                                                                                                                                                                        º º
                                                                                                                                                                                                                                                                                                 ºº
                                                                                                                                                                                                                                                                                                  º
                                                                                                                                                                                                                                                                                                  º
                                                                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                                                            º
     º º
      º º  º                                                º
                                                            º                                                                                                                    º º                                                      º
                                                                                                                                                                                                                                          º             º
                                                                                                                                                                                                                                                        º           º
                                                                                                                                                                                                                                                                    º     º º
                                                                                                                                                                                                                                                                           º º          º º
                                                                                                                                                                                                                                                                                        º º        º        º
      º º
      º º
      º º                                                   º
                                                            º                                                                                                                    º º
                                                                                                                                                                                 º º  º                                                   º
                                                                                                                                                                                                                                          º             ºº         º       º º
                                                                                                                                                                                                                                                                           º º
                                                                                                                                                                                                                                                                           º º          º º        º
                                                                                                                                                                                                                                                                                                   º        º
                                                                                                                                                                                                                                                                                                            º
      ºº º                                                  º
                                                            º                                                                                                                    º º
                                                                                                                                                                                 º                                                        º              º
                                                                                                                                                                                                                                                         º        º
                                                                                                                                                                                                                                                                  ºº       º º
                                                                                                                                                                                                                                                                            º º         º º
                                                                                                                                                                                                                                                                                        º º         º
                                                                                                                                                                                                                                                                                                    º
                                                                                                                                                                                                                                                                                                    º      º
                                                                                                                                                                                                                                                                                                           º
                                                                                                                                                                                                                                                                                                           º
       º º
       º º                                                  º
                                                            º                                                                                                                    º º                                                      º
                                                                                                                                                                                                                                          º              º
                                                                                                                                                                                                                                                         º        º
                                                                                                                                                                                                                                                                  º         º º
                                                                                                                                                                                                                                                                            º           º º
                                                                                                                                                                                                                                                                                        º º          º
                                                                                                                                                                                                                                                                                                     º     º
                                                                                                                                                                                                                                                                                                           º
       º º
        ºº
        ºº                                                  º
                                                            º
                                                                                                                                                                                 º º
                                                                                                                                                                                 º º
                                                                                                                                                                                 º º
                                                                                                                                                                                  º º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º              º
                                                                                                                                                                                                                                                         º
                                                                                                                                                                                                                                                         º       º
                                                                                                                                                                                                                                                                 º
                                                                                                                                                                                                                                                                            º º
                                                                                                                                                                                                                                                                             ºº
                                                                                                                                                                                                                                                                             ººº        º ºº
                                                                                                                                                                                                                                                                                        ºº
                                                                                                                                                                                                                                                                                        ºº           º º
                                                                                                                                                                                                                                                                                                      º º  º
        ºº
         º                                                  º
                                                            º
                                                            º
                                                            º
                                                            º
                                                            º
                                                                                                                  I                                                               º
                                                                                                                                                                                  º º
                                                                                                                                                                                  º º
                                                                                                                                                                                  º º
                                                                                                                                                                                  º º
                                                                                                                                                                                  ºº
                                                                                                                                                                                     º                        P                           º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                                         ºº
                                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                                          º ºº
                                                                                                                                                                                                                                                          º ºº
                                                                                                                                                                                                                                                           º º
                                                                                                                                                                                                                                                           º º
                                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                                º            ºº
                                                                                                                                                                                                                                                                              º         ºº
                                                                                                                                                                                                                                                                                         º
                                                                                                                                                                                                                                                                                         º             º º
                                                                                                                                                                                                                                                                                                       ºººº
                                                                                                                                                                                                                                                                                                       º º
                                                                                                                                                                                                                                                                                                        ºº
                                                                                                                                                                                                                                                                                                        ºº
                                                            º
                                                            º                                                º
                                                                                                             º                                                                    ºº
                                                                                                                                                                                  ºº                     º
                                                                                                                                                                                                         º        º
                                                                                                                                                                                                                  º                       º                ººº
                                                                                                                                                                                                                                                            ººº
                                                                                                                                                                                                                                                            ºº
                                                            º
                                                            º                                                º
                                                                                                             º     º
                                                                                                                   º                                                              ºº
                                                                                                                                                                                  ºº                     º
                                                                                                                                                                                                         º        º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º
                                                            º                                                º     º                                                              º                      º        º                       º
                                                            º
                                                            º
                                                            º
                                                                                                             º
                                                                                                             º
                                                                                                             º     º
                                                                                                                   º                                                              ºº
                                                                                                                                                                                  ºº
                                                                                                                                                                                  ºº º
                                                                                                                                                                                                         ºº       º
                                                                                                                                                                                                                  º                       º
                                                                                                                                                                                                                                          º
                                                            º
                                                            º                                                º
                                                                                                             º     º
                                                                                                                   º                                                              ºº                      º
                                                                                                                                                                                                          º       º
                                                                                                                                                                                                                  º                       º
                                                                                                                                                                                                                                          º
                                                            º                                                º     º
                                                                                                                   º                                                              ºº
                                                                                                                                                                                  ºº                      º
                                                                                                                                                                                                          º       º
                                                                                                                                                                                                                  º                       º
                                                            º
                                                            º                                                º    º
                                                                                                                  º                                                               ºº
                                                                                                                                                                                  ºº                      º       º                       º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º
                                                            º
                                                            º                                                º
                                                                                                             º    º
                                                                                                                  º                                                               º                       º
                                                                                                                                                                                                          º       º
                                                                                                                                                                                                                  º                       º
                                                                                                                                                                                                                                          º
                                                            º                                                º    º                                                               ºº
                                                                                                                                                                                  ºº                      º       º
                                                            º
                                                            º
                                                            º
                                                            º
                                                            º
                                                            º
                                                            º
                                                                                                  H          º
                                                                                                             º
                                                                                                             º
                                                                                                             º
                                                                                                             º
                                                                                                             º
                                                                                                                  º
                                                                                                                  º
                                                                                                                  º
                                                                                                                  º
                                                                                                                  º
                                                                                                                  º
                                                                                                                  º
                                                                                                                                           K                                      ºº
                                                                                                                                                                                  ºº
                                                                                                                                                                                  ºº
                                                                                                                                                                                  ºº
                                                                                                                                                                                  º
                                                                                                                                                                                  ºº
                                                                                                                                                                                  ºº
                                                                                                                                                                                     º         O          º
                                                                                                                                                                                                          º
                                                                                                                                                                                                          º
                                                                                                                                                                                                          º
                                                                                                                                                                                                          º
                                                                                                                                                                                                          º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                           Q              º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º
                                                            º
                                                            º                                          º
                                                                                                       º     º
                                                                                                             ºº   º
                                                                                                                  º                   º
                                                                                                                                      º                                           ºº º         º   º
                                                                                                                                                                                                   º
                                                                                                                                                                                                   º      º
                                                                                                                                                                                                          º       º
                                                                                                                                                                                                                  º    º
                                                                                                                                                                                                                       º   º              º
                                                            º
                                                            º                                     º    º
                                                                                                       º      º
                                                                                                              º   º                   º     º                                     ºº
                                                                                                                                                                                   º           º   º      º       º    º   º             º
                                                                                                                                                                                                                                         º
                                                            º
                                                            º
                                                            º
                                                                                                  º
                                                                                                  º
                                                                                                  º
                                                                                                  º
                                                                                                       ºº º
                                                                                                        º º   º
                                                                                                              º
                                                                                                                  º
                                                                                                                  º                   º
                                                                                                                                      º
                                                                                                                                      º
                                                                                                                                            º
                                                                                                                                            º
                                                                                                                                            º                                      ºº
                                                                                                                                                                                   º
                                                                                                                                                                                   ºº         º
                                                                                                                                                                                              º
                                                                                                                                                                                               º   ºº º
                                                                                                                                                                                                    º º   º
                                                                                                                                                                                                          º
                                                                                                                                                                                                                  º º
                                                                                                                                                                                                                  º º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                  º º
                                                                                                                                                                                                                      º    º
                                                                                                                                                                                                                           ºº            º
                                                                                                                                                                                                                                         º
                                                                                                                                                                                                                                         º
                                                            º
                                                            º
                                                            º                                     º
                                                                                                  º     º º
                                                                                                         º º
                                                                                                         º º
                                                                                                                  º
                                                                                                                  º                   º
                                                                                                                                      º     º
                                                                                                                                            º                                      ºº
                                                                                                                                                                                   ºº        º
                                                                                                                                                                                             º      º º
                                                                                                                                                                                                     º º
                                                                                                                                                                                                     º º
                                                                                                                                                                                                     º º          º º
                                                                                                                                                                                                                  º º º     º
                                                                                                                                                                                                                            º            º
                                                                                                                                                                                                                                         º
                                                                                                                                                                                                                                         º
                                                            º
                                                            º                                     º
                                                                                                  º      º º
                                                                                                         º º      º
                                                                                                                  º
                                                                                                                  º
                                                                                                                                      º
                                                                                                                                      º
                                                                                                                                      º     º                                      ºº
                                                                                                                                                                                   ºº
                                                                                                                                                                                   ºº       º
                                                                                                                                                                                            ºº       º º
                                                                                                                                                                                                     º            º º
                                                                                                                                                                                                                  º º
                                                                                                                                                                                                                  º º
                                                                                                                                                                                                                             º
                                                                                                                                                                                                                             º
                                                                                                                                                                                                                             º           º
                                                                                                                                                                                                                                         º
                                                                                                                                                                                                                                         º
                                                            º
                                                            º
                                                            º
                                                                                                  º
                                                                                                  º
                                                                                                  º
                                                                                                          º º
                                                                                                          º º
                                                                                                          º
                                                                                                          º º
                                                                                                                  º
                                                                                                                  º                   º
                                                                                                                                      ºº
                                                                                                                                           º
                                                                                                                                           º
                                                                                                                                            º                                      ºº
                                                                                                                                                                                   ºº
                                                                                                                                                                                   ºº
                                                                                                                                                                                   º º ºº
                                                                                                                                                                                      º º
                                                                                                                                                                                           º
                                                                                                                                                                                           º
                                                                                                                                                                                            º         º º
                                                                                                                                                                                                      º º
                                                                                                                                                                                                      º º
                                                                                                                                                                                                      º º
                                                                                                                                                                                                                  º º
                                                                                                                                                                                                                  º º
                                                                                                                                                                                                                  ºº
                                                                                                                                                                                                                              º
                                                                                                                                                                                                                              º
                                                                                                                                                                                                                              º
                                                                                                                                                                                                                              º          º
                                                                                                                                                                                                                                         º
                                                                                                                                                                                                                                         º
                                                            º                                     º               º                    º   º                                                                      ººº
                                                                                                                                                                                                                  ºº           º        º
                                                            º                                     º
                                                                                                  º        ºº
                                                                                                           ºº
                                                                                                            ºº    º                    º   º
                                                                                                                                           º                                       º º º
                                                                                                                                                                                   º
                                                                                                                                                                                   º ºº ºº
                                                                                                                                                                                                       ºº
                                                                                                                                                                                                       ººº                     ºº       º
                                                                                                                                                                                                                                        º
                                                            º
                                                            º
                                                            º
                                                            º
                                                            º
                                                            º
                                                            º
                                                            º
                                                                          F    º
                                                                                                  º
                                                                                                  º
                                                                                                  º
                                                                                                  º
                                                                                                  ºº
                                                                                                           ºº     º
                                                                                                                  º
                                                                                                                  º
                                                                                                                  º
                                                                                                                  º
                                                                                                                  º
                                                                                                                  º
                                                                                                                  º
                                                                                                                           J   º
                                                                                                                                       º
                                                                                                                                       º
                                                                                                                                       º
                                                                                                                                       º
                                                                                                                                       º
                                                                                                                                       º
                                                                                                                                           º
                                                                                                                                           º
                                                                                                                                           º
                                                                                                                                           º
                                                                                                                                           º
                                                                                                                                           º
                                                                                                                                           º                    º
                                                                                                                                                                     M             º º
                                                                                                                                                                                   º ººº
                                                                                                                                                                                   º ºº
                                                                                                                                                                                  º ºº
                                                                                                                                                                                  º
                                                                                                                                                                                                       ºº
                                                                                                                                                                                                        º          ºº
                                                                                                                                                                                                                   ºº           º
                                                                                                                                                                                                                                ºº
                                                                                                                                                                                                                                 º º
                                                                                                                                                                                                                                  º º
                                                                                                                                                                                                                                  º º
                                                                                                                                                                                                                                   º º
                                                                                                                                                                                                                                   ºº º
                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                        º
                                                            º              º   º                   º
                                                                                                   º              º
                                                                                                                  º        º   º       º
                                                                                                                                       º   º                    º    º            º
                                                                                                                                                                                  º                                                 ºº
                                                                                                                                                                                                                                    ººº
                                                            º
                                                            º              º   º                   º              º
                                                                                                                  º        º   º
                                                                                                                               º       º   º                    º    º
                                                                                                                                                                     º            º
                                                            º
                                                            º
                                                            º
                                                            º
                                                                          º
                                                                          ºº   º
                                                                               º
                                                                               º
                                                                                                   º
                                                                                                   º
                                                                                                   º
                                                                                                   º
                                                                                                                  º
                                                                                                                  º
                                                                                                                  º
                                                                                                                          º
                                                                                                                          º
                                                                                                                          º
                                                                                                                           º    º º
                                                                                                                               º º     º
                                                                                                                                       º
                                                                                                                                           º
                                                                                                                                           º
                                                                                                                                           º
                                                                                                                                           º
                                                                                                                                                                º
                                                                                                                                                                º
                                                                                                                                                                º    ºº
                                                                                                                                                                      º
                                                                                                                                                                                  º
                                                                                                                                                                                  º
                                                                                                                                                                                  º
                                                            º
                                                            º            ºº    º                   º              º
                                                                                                                  º      º      º º
                                                                                                                                 º º
                                                                                                                                 º º   º   º                    º
                                                                                                                                                                º     º           º
                                                                                                                                                                                  º
                                                             º
                                                             º           º
                                                                         º     º
                                                                               º                   º
                                                                                                   º              º
                                                                                                                  º     ºº
                                                                                                                         º       º º
                                                                                                                                 º º       º
                                                                                                                                           º                    ºº     º
                                                                                                                                                                       º
                                                                                                                                                                       º          º
                                                                                                                                                                                  º
                                                             º
                                                             º          º
                                                                        º
                                                                        º      º
                                                                               º
                                                                               º                   º
                                                                                                   º              º
                                                                                                                  º
                                                                                                                  º     º
                                                                                                                        º         º º
                                                                                                                                  º º      º
                                                                                                                                           º                     º
                                                                                                                                                                 º      º
                                                                                                                                                                        º        ºº
                                                             º
                                                             º         º                           º
                                                                                                   º              ºº ºº           º º
                                                                                                                                  º º      º                     º
                                                                                                                                                                 º      º        º
                                                             º
                                                             º
                                                             º         º
                                                                       º       º
                                                                               º
                                                                               º                   º
                                                                                                   º               º ºº
                                                                                                                   º º             º º
                                                                                                                                   ºº      º
                                                                                                                                           º                     º
                                                                                                                                                                 º
                                                                                                                                                                         º
                                                                                                                                                                         ºº      º
                                                                                                                                                                                 º
                                                              º
                                                              º
                                                              º ºº
                                                              º
                                                              º º
                                                               º º
                                                               º º
                                                               º º
                                                                     º
                                                                      º
                                                                      º        º
                                                                               º
                                                                               º
                                                                               º
                                                                               º
                                                                               º
                                                                               º   º
                                                                                       G           º
                                                                                                   º
                                                                                                   º
                                                                                                   º
                                                                                                   º
                                                                                                   º
                                                                                                   º
                                                                                                                   º º
                                                                                                                   º º
                                                                                                                    ººº
                                                                                                                    ººº
                                                                                                                     º
                                                                                                                                    ºº
                                                                                                                                    ºº
                                                                                                                                     º     º
                                                                                                                                           º
                                                                                                                                           º
                                                                                                                                           º
                                                                                                                                           º
                                                                                                                                           º
                                                                                                                                           º
                                                                                                                                                     L   º
                                                                                                                                                                 º
                                                                                                                                                                 º
                                                                                                                                                                 º
                                                                                                                                                                 º
                                                                                                                                                                 º
                                                                                                                                                                 º
                                                                                                                                                                 º
                                                                                                                                                                          º
                                                                                                                                                                          º º
                                                                                                                                                                           º º
                                                                                                                                                                            º º
                                                                                                                                                                            ºº º
                                                                                                                                                                            ººº
                                                                                                                                                                             ººº
                                                                                                                                                                               º
                                                                                                                                                                                 º
                                                                                                                                                                                 º
                                                                ººº
                                                                ºº º
                                                                 ºº            º   º
                                                                                   º   º           º
                                                                                                   º                                       º
                                                                                                                                           º         º   º
                                                                                                                                                         º       º
                                                                               º º
                                                                               º º º   º
                                                                                       º
                                                                                       º           º
                                                                                                   º                                       º
                                                                                                                                           º        ºº   º
                                                                                                                                                         º       º
                                                                                                                                                                 º
                                                                               º º
                                                                               º
                                                                               º º      º
                                                                                        º          º
                                                                                                   º                                       º
                                                                                                                                           º        º
                                                                                                                                                    º     º º
                                                                                                                                                          º º    º
                                                                               º º
                                                                               º º      ºº         º
                                                                                                   º
                                                                                                   º                                       º
                                                                                                                                           º       º      º º
                                                                                                                                                           º º   º
                                                                               º º
                                                                               º º       º
                                                                                         º        ºº                                       º
                                                                                                                                           º
                                                                                                                                           º      º
                                                                                                                                                  ºº       º º
                                                                                                                                                           º º
                                                                               º º
                                                                               º º        º
                                                                                          º       º                                        º     ºº        º º
                                                                                                                                                            º
                                                                               º º        ºº      º
                                                                                                  º                                        º
                                                                                                                                           º
                                                                                                                                           º º   º
                                                                                                                                                 º          º º
                                                                                                                                                            º º
                                                                                                                                                            º º
                                                                               º º
                                                                               ºº          ºº º   º                                         º º
                                                                                                                                            º º              º º
                                                                               ºº
                                                                               ºº
                                                                               ºº           º º
                                                                                             º º                                            º º
                                                                                                                                            º º              ºº
                                                                                                                                                              ºº
                                                                                                                                                              ºº
                                                                                ºº            ºººº
                                                                                             º º
                                                                                              ºº
                                                                                               ºº
                                                                                                                                            º º
                                                                                                                                             ººº
                                                                                                                                             ººº
                                                                                                                                              ºº
                                                                                                                                                               º




                                                                                                                  ÙÖ º½                                  ÑÔÐÓ                           Ö ÓÐ Ð Ó

                      ¾º Ë RLINK(p) × Ð Ú ÐÓÖ ÒØ Ò Ð ¬Ò Ö ÓÖÖ Ó =⇒ Ö ØÓÖÒ ÆÍÄĺ
                      ¿º p = RLINK(p)
                       º Ê Ô Ø Ñ ÒØÖ × ÕÙ LLINK(p) ÒÓ × ÙÒ ÐÓ
                                              ¯ p = LLINK(p)

                º Ê ØÓÖÒ p
                Ä Ú ÒØ      Ð Ð Ó ×Ð      Ð    Ô Ö Ö ÓÖÖ Ö Ð Ö Óк Ð Ö ÓÖÖ Ó Ò¬ Ó Ö ÕÙ Ö
              Ø ÖÑ Ò Ö Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ Ð Ö ÓÖÖ Ó¸ ÐÙ Ó Ò ÐÐ Ñ Ö ×Ù × Ú Ñ ÒØ Ð Ð ÓÖ ØÑÓ º
              ר ÐÐ Ö Ð ÙÐØ ÑÓ Ð Ñ ÒØÓº
                 Ð Ð Ó Ö ÕÙ Ö ×Ø Ò Ù Ö × ÙÒ ÔÙÒØ ÓÖ × ÙÒ Ó Ó ÙÒ ÐÓº ÙÒÕÙ ÙÒ Ø
           ÔÓÖ ÔÙÒØ ÖÓ × ×Ù¬ ÒØ Ô Ö ×Ô ¬ Ö Ø Ð ×Ø Ò ÓÒ¸ ÐÓ× × ×Ø Ñ × Ñ ÑÓÖ               ÐÓ×
            ÓÑÔÙØ ÓÖ × ÑÓ ÖÒÓ× ØÖ       Ò ÔÓÖ ÝØ ׺ Ë Ö ÕÙ Ö Ð Ñ ÒÓ× ÙÒ ÝØ Ô Ö ÙØ Ð Þ Ö
           ÐÓ× Ó× Ø× Ò × Ö Ó׺ Ä × Ñ ÕÙ Ò × ÁË ÔÙÖ × ÒÓ Ö ×ØÖ Ò Ò Ð Ø Ñ ÒÓ ÙÒ ÐÓÕÙ
               Ñ ÑÓÖ × ÔÓ× Ð ¸ Ô٠׸ Ô ÖØ Ö Ð ÝØ ÜØÖ º Ò Ñ ÕÙ Ò × ÊÁË ¸ ÐÓ× Ö ×ØÖÓ× Ý
           ×Ù× ÑÔÓ×         Ò ×Ø Ö Ð Ò Ó× Ð Ø Ñ ÒÓ Ð Ô Ð Ö Ñ ÑÓÖ º Ò ÓÒ× Ù Ò ¸
            Ò Ö ÙÒ ÝØ ÜØÖ ÔÙ × Ò ¬ Ö ÙÒ Ò Ö Ñ ÒØÓ Ð Ø Ñ ÒÓ Ð Ö ×ØÖÓ Ñ ÝÓÖ ÙÒ
             ÝØ ¸ ÔÙ × Ö ÕÙ Ð Ò Ö Ð ÝØ ÜØÖ             ÙÒ Ö ÓÒ ÕÙ ×            Ù   Ð Ø Ñ ÒÓ
               Ð ÔÐ Öº
                ÍÒ Ø Ò Ô Ö Ö ÓÒÓ Ö Ó×              ÐÓ× ÓÒ× ×Ø Ò ØÙ Ö ÙÒ ØÖ Ò× ÓÖÑ ÓÒ¸
            ÒÚ Ö× Ð ¸ ÕÙ ÐÐ Ú Ð Ú ÐÓÖ ÙÒ ÔÙÒØ ÓÖ ÙÒ Ú ÐÓÖ ÓÑÔÖ Ò Ó ÒØÖÓ Ð × ÞÓÒ ×
            ÜØ ÖÒ × Ð Ñ Ò ÓÖ Ñ ÑÓÖ º Ù Ò Ó × Ü Ñ Ò ÙÒ ÔÙÒØ ÓÖ¸ × Ú Ö ¬ × ×Ø ×
            Ò Ù ÒØÖ ÒØÖÓ Ð Ö Ò Ó Ú Ð Ó × Ø Ð × Ð ×Ó¸ ÒØÓÒ × × ØÖ Ø ÙÒ ÔÙÒØ ÓÖ
           ÐÓ ÓÒØÖ Ö Ó¸ × ØÖ Ø ÙÒ ÐÓ Ý¸ ÔÓÖ ×ÙÔÙ ×ØÓ¸        Ö Ð Þ Ö× Ð ØÖ Ò× ÓÖÑ ÓÒ ÒÚ Ö×
276                                                          Cap´        ´
                                                                    ıtulo 4. Arboles



     ÒØ × Ö Ö Ò Ö Ð ÔÙÒØ ÓÖº ÍÒ Ó ×Ø ÙÐÓ ×Ø Ø Ò × Ð ÔÓÖØ Ð              ÒØÖ
        Ö ÒØ × ÔÐ Ø ÓÖÑ × Ö Û Ö ¸ × ×Ø Ñ ÓÔ Ö Ø ÚÓ¸ ÓÑÔ Ð ÓÖ Ý Ð Ò Ù º
       Ä ØÖ Ò× ÓÖÑ ÓÒ ØÖ ÓÒ Ð ÓÒ× ×Ø Ò Ö ×Ø ÖÐ ÙÒ Ö ÓÒ ÙÒ Ú ÐÓÖ ÕÙ × ÙÖ
    ÕÙ Ð Ö ×Ø ר Ö ÒØÖÓ Ð ÞÓÒ           ØÓ× Ó Ó Ó Ó¸ ÔÓÖ × ÓÖ Ñ ÒØÓ¸ ÒØÖÓ
    Ð ÞÓÒ Ð Ô Ð º Ä Ö ×Ø × ÔÓ× Ð ×ÓÐÓ × Ð Ø Ñ ÒÓ Ð ÞÓÒ Ñ ÑÓÖ × Ñ ÒÓÖ Ó
      Ù Ð Ð ×ÙÑ Ð × ÓØÖ × ÞÓÒ ×º Ú ×¸ ×ØÓ ÒÓ × ÔÓ× Ð º
                              ÆÓ Ó           Ö

                                             G

                              S                      X

                          B          H           A          Z



                ÙÖ º½ Ê ÔÖ × ÒØ ÓÒ Ò Ñ ÑÓÖ               ÙÒ Ö ÓÐ Ò Ö Ó Ð Ó

          Ð ÙÒ × ÒØ Ù × Ñ ÕÙ Ò × ÁË Ø Ò Ò Ð Ø Ñ × × Ò ¬ Ø ÚÓ Ö × ÖÚ Ó Ô Ö Ð
    × ÒÓº ÓÑÓ ÐÓ× ÔÙÒØ ÓÖ × ÙØ Ð Þ Ò ÒÒ × Ö Ñ ÒØ ר × ÒÓ¸ ÔÙ × Ð × Ö ÓÒ ×
    Ò Ø Ú × ÒÓ Ø Ò Ò × ÒØ Ó¸ ר Ø ÔÓ ÙØ Ð Þ Ö× Ô Ö ÒÓØ Ö × Ð ÔÙÒØ ÓÖ Ö Ó ÒÓ
    ÙÒ ÐÓº Ä × Ñ ÕÙ Ò × ÑÓ ÖÒ × ×ÓÒ ÊÁË ¸ Ý Ð × ÔÓ × ÁË ÕÙ Ü ×Ø Ò Ø Ò Ò ÑÙ ×
     ÙÒ ÓÒ Ð       × ÊÁË º ÀÓÝ Ò ¸ Ð Ð Ò ÓÒ Ð × Ö ÓÒ × Ñ ÑÓÖ × ÙÒ
    Ð × ÙÒ ÓÒ Ð       × ÓÑÙÒ × ÒØÖ ÐÓ× Ó× Ø ÔÓ× Ñ ÕÙ Ò º Ä Ð Ò ÓÒ ÑÔÐ ÕÙ Ð ×
      Ö ÓÒ × Ñ ÑÓÖ ¸ ¹ÐÓ× Ú ÐÓÖ × ÐÓ× ÔÙÒØ ÓÖ ×¹ × ÑÔÖ ×Ø Ò Ð Ò Ó× Ð Ø Ñ ÒÓ
        Ð ÔÐ Ö        Ñ ÑÓÖ º Ò Ð Ñ ÝÓÖ         ÖÕÙ Ø ØÙÖ × ÑÓ ÖÒ ×¸ Ð ÐÓÒ ØÙ     Ð
    Ô Ð Ö Ò Ø× × ÑÔÖ × ÔÓØ Ò Ü Ø               Ó× × Ö¸ ÔÙ ÜÔÖ × Ö× ÓÑÓ 2      n¸ ÕÙ

     × Ù Ð 2 8 ÝØ ׺ ×ØÓ ÑÔÐ ÕÙ ØÓ Ó ÔÙÒØ ÓÖ Ú Ð Ó × ÑÔÖ Ø Ò Ö ÐÓ× n − 3
                  n
                n− 2

      Ø× Ñ ÒÓ× × Ò ¬ Ø ÚÓ× ÓÐÓ Ó× Ò ÖÓº רÓ× Ø× ÔÙ Ò ÙØ Ð Þ Ö× Ô Ö ÐÑ Ò Ö
     Ò ÓÖÑ ÓÒ         ÓÒ Ð Ò Ð Ó ÙÖÖ Ò ¸ Ð Ø Ñ ÒÓ× × Ò ¬ Ø ÚÓ ÙÒ ÔÙÒØ ÓÖ ÔÙ
     ÙÒ Ö ÓÑÓ Ò         ÓÖ ÕÙ × Ò Ð × Ð ÔÙÒØ ÓÖ × Ó ÒÓ ÙÒ ÐÓº
         À Ý Ú Ö × Ñ Ò Ö × Ñ Ò ÔÙÐ Ö Ð Ø Ñ ÒÓ× × Ò ¬ Ø ÚÓ ÙÒ ÔÙÒØ ÓÖº ÉÙ Þ Ð
    Ñ × × Ò ÐÐ × Ñ ÒØ ÓÔ Ö ÓÒ × ÐÓ × ×Ó Ö Ð ÔÙÒØ ÓÖ ÓÑÓ × Ù º
¾       Ø ÖÑ Ò Ö × ÙÒ ÔÙÒØ ÓÖ × ÙÒ ÐÓ ¾ ≡
     template <class Node> inline bool isThread(Node * p)
     {
       return (Node*) (((long) p) & 1);
     }

¾     ÓÒÚ ÖØ Ö ÙÒ ÔÙÒØ ÓÖ Ò ÙÒ ÐÓ ¾          ≡
     template <class Node> inline Node * makeThread(Node * p)
     {
       return (Node*) ( ( (long)p) | 1);
     }

¾     ÓÒÚ ÖØ Ö ÙÒ ÐÓ Ò ÔÙÒØ ÓÖ ¾         ≡
     template <class Node> inline Node * makePointer(Node * p)
     {
       return (Node*) (((long) p) & -2);
´
4.4. Arboles Binarios                                                                                     277



 }

         Ð ÙÒ Ñ Ò Ö ¸ Ð Ð Ó ÔÐ ÒØ ÙÒ Ò ÐÓ ÕÙ Ú Ð ÒØ Ð             Ö Ò ÒØÖ Ð
Ð ×Ø × ÒÐ Þ × Ö ÙÐ Ö × Ý Ð × ÒÓ Ö ÙÐ Ö ×º Ò ×Ø × ÒØ Ó¸ ÙÒ Ö ÓÐ Ð Ó × Ô Ö
ÙÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ º Ð Ù Ð ÕÙ Ò Ð × Ð ×Ø × Ö ÙÐ Ö ×¸ × ×Ø ÒØ × Ð
ÙØ Ð Þ Ö ÙÒ ÒÓ Ó        Ö º Ð Ð ÞÓ ÞÕÙ Ö Ó Ð ÒÓ Ó      Ö ÔÙÒØ Ö Ð ÔÖ Ñ Ö ÒÓ Ó
 Ò¬ Óº Ð Ð ÞÓ Ö Ó ÔÙÒØ Ö Ð Ö Þº Ð ÐÓ ÞÕÙ Ö Ó Ð ÔÖ Ñ Ö ÒÓ Ó Ò¬ Ó Ý Ð
Ð ÞÓ Ö Ó Ð ÙÐØ ÑÓ ÒÓ Ó Ò¬ Ó ÔÙÒØ Ö Ò Ð ÒÓ Ó             Öº
    Ä ¬ ÙÖ º½ ÐÙ×ØÖ ÙÒ ÑÔÐÓ Ð Ö ÔÖ × ÒØ ÓÒ Ò Ñ ÑÓÖ               ÙÒ Ö ÓÐ Ð Ó
ÙØ Ð Þ Ò Ó ÙÒ ÒÓ Ó         Ö º È Ö ÒÓØ Ö Ð Ö Ñ Ò × Ò ÓÒ ÙÒ Ð ×Ø ÒÐ Þ ¸ ØÓÑ Ð
  Ö ÓÐ ÔÓÖ ÐÓ× ÒÓ Ó× B Ý Z Ý ×Ø Ö º

4.4.16     Recorridos pseudo-hilados
Ë Ò Ð Ö ÔÖ × ÒØ ÓÒ Ð                 Ö ÓÐ × Ø Ò ×Ù× ÓÒ × ×Ó Ö Ð Ö Ò Ñ ÒØÓ
ÐÓ× Ö ÓÖÖ Ó׸ Ð Ð Ó × Ñ ×           Ð ÑÔÐ ÒØ Ö ÕÙ Ð Ö ÔÖ × ÒØ ÓÒ ØÖ ÓÒ Ðº Ë
ÓÔØ × ÑÓ× ÔÓÖ Ð Ö ÔÖ × ÒØ ÓÒ ØÖ ÓÒ Ð¸ Ü ×Ø Ö ÙÒ Ð ÙÒ ÓÖÑ              ÔÖÓÚ Ö ÐÓ×
ÔÙÒØ ÖÓ× ÒÙÐÓ× ×Ô Ö         Ó× Ä Ö ×ÔÙ ×Ø × ¬ÖÑ Ø Ú ÐÓ× ÔÙÒØ ÖÓ× ÒÙÐÓ× ÔÙ Ò
Ù× Ö× ÓÑÓ ÐÓ× Ø ÑÔÓÖ Ð ×º
        Ó ÙÒ Ö ÓÐ Ò Ö Ó ÓÒ Ö Þ r¸ Ù ÕÙ ÑÓ× Ù Ð × ×Ù ÔÖ           ×ÓÖ Ò¬ Óº ×ØÓ ×
 ÕÙ Ú Ð ÒØ      Ø ÖÑ Ò Ö Ù Ð × Ð ÙÐØ ÑÓ ÒÓ Ó ÕÙ × Ú × Ø Ò Ò¬ Ó ×Ù Ö Ñ ÞÕÙ Ö º
ÈÓ ÑÓ× Ø ÖÑ Ò Ö ØÖ × ×Ó×
    ¯ Ë Ä(r) = NULL =⇒ r ÒÓ Ø Ò ÔÖ         ×ÓÖº
    ¯ Ë Ä(r) = NULL =⇒ Ø Ò ÑÓ× Ó× ×Ó×

        ½º Ë Ê(Ä(r)) = NULL =⇒ Ä(r) × ÔÖ         ×ÓÖº Ë Ä(r) ÒÓ Ø Ò Ö Ñ Ö ¸
            ÒØÓÒ × Ä(r) × Ð ÔÖ       ×ÓÖ rº
                                                                        º
                                                                              r
                                                                        º
                                                                        º
                                                                        º
                                                                        º
                                                                        º
                                                                         º
                                                                         º
                                                                         º
                                                                         º
                                                                         º

                                             Ä(r)
                                                                         ºº
                                      →
                                                                          º
                                                                          º
                                                                          º
                           Predecesor−              ºº
                                                    ºº
                                                     º
                                                                          º
                                                                          º
                                                                          º
                                                                          º
                                                                          º
                                                                          º
                                                                          º
                                                      ººº                 º
                                                                          º
                                                        ºº
                                                        ºº
                                                         ºº               º
                                                                          º

                                                                                      Ê(r)
                                                          ºº              º
                                                                          º
                                                                          º
                                                           ºº
                                                            ºº
                                                             ºº           º
                                                              ºº          º
                                                                          º
                                                               ºº
                                                                ºº
                                                                ºº       º
                                                                         º
                                                                   ºººº º
                                                                  ººº ºº
                                                                  ºººººº
                                                                     ºº



                                Ä(Ä(r))

         ¾º Ë Ê(Ä(r))   = NULL =⇒    Ð ÔÖ       ×ÓÖ × Ð × Ò ÒØ Ñ × Ð                                  Ö
            Ä(r)º
                                                                                  r

                                      Ä(r)
                                                                                             Ê(r)
                           Ä(Ä(r))              Ê(Ä(r))
                                                                              ←− Predecesor

    Ð ÔÖ      ×ÓÖ   Ð Ö Þ      ÙÒ Ö ÓÐ Ò Ö Ó × Ð ÒÓ Ó Ñ × Ð                                   Ö     ×Ù ×Ù Ö ÓÐ
ÞÕÙ Ö Óº
278                                                             Cap´        ´
                                                                       ıtulo 4. Arboles



         ÈÓÖ × Ñ ØÖ ¸ Ð ×Ù ×ÓÖ Ð Ö Þ ÙÒ Ö ÓÐ Ò Ö Ó × Ð ÒÓ Ó Ñ × Ð ÞÕÙ Ö
    ×Ù ×Ù Ö ÓÐ Ö Óº
             Ó ÙÒ Ö ÓÐ Ò Ö Ó Ö Þ r¸ Ð Ö ÓÖÖ Ó Ò¬ Ó ÔÙ      × Ò Ö× ÓÒ ÐÓ× × Ù ÒØ ×
    Ð Ò Ñ ÒØÓ×
        ½º ÒØ ×       × Ò Ö      Ð Ö Ñ ÞÕÙ Ö ¸ Ø ÖÑ Ò Ð ÔÖ         ×ÓÖ rpº
        ¾º À Ê(rp) = r × Ö¸ ÓÐÓÕÙ ÙÒ ÐÓ Ö Ó rp Ô Ö ÕÙ ÔÙÒØ Ð Ö Þ r
           ´ÕÙ × Ð ×Ù ×ÓÖ rpµº
        ¿º rp × Ð ÙÐØ ÑÓ ÒÓ Ó Ò Ò¬ Ó Ð Ö Ñ ÞÕÙ Ö        rº Ù Ò Ó ÐÓ Ú × Ø ¸ Ö ÙÔ Ö r
           Ñ ÒØ Ð Ú ÐÓÖ Ê(rp)º ÒØ × Ú × Ø Ö r¸ × ÙÖ × Ö ×Ø ÙÖ Ö Ê(rp) Ð Ú ÐÓÖ
           ÒÙÐÓº
          ר ÑÓ× Ò Ô              ÓÖ Ö ÙÒ Ð ÓÖ ØÑÓ Ò¬ Ó ÕÙ Ù× ÐÓ× Ô Ö Ð × Ý ÙÝ
     ÓÖÑ Ò Ö Ð × Ö Ð × Ù ÒØ
¾      ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                           ¾ ¾
         template <class Node> inline
     void inOrderThreaded(Node * root, void (*visitFct)(Node*))
     {
       if (root == Node::NullPtr)
         return;
       Node *p = root, *r = Node::NullPtr, *q;
             Ö ÓÖÖ Ó Ò¬ Ó Ð Ó ¾
     }
         × Ö Ð ÒÓ Ó ÕÙ × Ú × Ø Ó ÙÒ ÒÓ Ó Ö Ö ×Ó Ô Ö Ö
         p                                            Ð Ö º
         q× Ð Ö ÓÒ ÙÒ ÒÓ Ó ×Ó Ö Ð Ù Ð Ü ×Ø ÙÒ ÐÓ Ø ÑÔÓÖ Ðº r × ÙÒ ÔÙÒØ ÖÓ Ð
    Ô Ö pº
¾    Ö ÓÖÖ Ó Ò¬ Ó Ð Ó ¾ ≡                                 ´¾ µ
     while (p != Node::NullPtr)
       {
         q = LLINK(p);
         if (q == Node::NullPtr)
           { // No hay rama izq ==> visitar p
             (*visitFct)(p);
             r = p;
             p = RLINK(p);
             continue;
           }
              × Õ Ð ÔÖ      ×ÓÖ Ò¬ Ó   Ô¾
              if (q != r) // tiene p un predecesor?
                { // si ==> dejar un hilo para luego subir a visitar p
                  RLINK(q) = p; // Aqu´ se coloca el hilo
                                      ı
                  p = LLINK(p); // Seguir bajando por la izquierda
                  continue;
                }
              (*visitFct)(p);
              RLINK (q) = Node::NullPtr; // Borrar hilo
              r = p;
              p = RLINK(p); // avanzar a la rama derecha
          }
´
    4.4. Arboles Binarios                                                        279



        Ð Ñ Ò ×ÑÓ Ð Ð ÓÖ ØÑÓ ÒÓ × ØÖ Ú Ðº È Ö ÔÖ Ö ÓÑÔÐ Ø Ñ ÒØ ×Ù ÙÒ¹
     ÓÒ Ñ ÒØ¸ × Ò × Ö ÙÒ    Ù ÓÒ Ñ Ò٠и Ð Ù Ð × Ð Ð Ð ØÓÖº
¾   × Õ Ð ÔÖ ×ÓÖ Ò¬ Ó Ô ¾ ≡                            ´¾ µ
         // avanzar hacia el nodo m´s a la derecha de la rama izquierda
                                   a
     while (q != r and RLINK(q) != Node::NullPtr)
       q = RLINK(q);

          Ð Ð Ó Ô Ö Ð × ÑÙÝ ÑÔÓÖØ ÒØ ÔÓÖÕÙ ÔÙ Ù× Ö× Ò Ð ÓÖ ØÑÓ× ×Ó Ö Ö ÓÐ × Ò
    ÐÓ× Ù Ð × ×    Ð Ó ÙØ Ð Þ Ö Ô Ð Ó Ö ÙÖ× ÓÒ¸ ÔÙ × ÒÓ× ÓÖÖ ×Ô Ó Ò Ô Ð ¸ ÐÓ ÕÙ ÒÓ×
       Ö ÒØ Þ ÙÒ Ö ÓÖÖ Ó × ÙÖÓ¸ × Ò ÔÖ Ó ÙÔ ÓÒ ÔÓÖ × ÓÖ      Ô Ð º ÓÒ× Ù ÒØ Ñ ÒØ ¸
     Ð Ð Ó        × Ö Ð ÓÔ ÓÒ × Ó Ö × Ð ÐØÙÖ Ð Ö ÓÐ × × ÓÒÓ º
        À ݸ × Ò Ñ Ö Ó¸ ØÖ × ÔÖÓ Ð Ñ × ÓÒ Ð Ð Óº Ð ÔÖ Ñ ÖÓ × ÕÙ Ð Ð ÓÖ ØÑ ×
    Ñ × ÓÑÔÐ       º Ð × ÙÒ Ó ÐÓ ÓÒר ØÙÝ Ð Ú ÒØÙ Ð ÓÒ×ÙÑÓ Ø ÑÔÓ Ö ÕÙ Ö Ó Ô Ö
     Ò ÓÒØÖ Ö Ð ÒÓ Ó ÔÖ     ×ÓÖ ÒØ ×       Ö ÙÒ Ò Ú Ð Ð ÞÕÙ Ö º Ò ÐÑ ÒØ ¸ Ð ÙÐØ ÑÓ
    ÔÖÓ Ð Ñ × ÕÙ ÐÓ× Ð ÓÖ ØÑÓ× ÕÙ ÙØ Ð Ò Ð Ó Ô Ö Ð ÒÓ ×ÓÒ Ö ÒØÖ ÒØ × × Ö¸ ÒÓ
    ÔÙ Ò ÙØ Ö× ÓÒ ÙÖÖ ÒØ Ñ ÒØ ×Ó Ö Ð Ñ ×ÑÓ Ö Óк
    4.4.17     Correspondencia entre ´rboles binarios y m-rios
                                     a
     Ü ×Ø ÙÒ Ñ ØÓ Ó Ò Ö Ð Ô Ö Ö ÔÖ × ÒØ Ö ÙÒ Ö ÓÖ × Ò ÓÑÓ ÙÒ Ö ÓÐ Ò Ö Ó Ý
    Ú Ú Ö× º Ð ÔÖÓ Ñ ÒØÓ × ÜÔÐ Ò Ð × Ù ÒØ Ð ÓÖ ØÑÓ
    Algoritmo 4.8 (Conversi´n de un arbol m-rio a uno binario equivalente)
                           o          ´
       Ä ÒØÖ     × ÙÒ Ö ÓÐ m¹Ö Ó Tm ∈ T º
       Ä × Ð × ÙÒ Ö ÓÐ Ò Ö Ó T ∈ B ÕÙ Ú Ð ÒØ Tm
      ½º   T = ∅º

      ¾º   ∀ni ∈ Tm   ÔÐ ÕÙ Ð × × Ù ÒØ × Ö Ð ×
           ´ µ Ð Ó Ñ × Ð ÞÕÙ Ö             niÒ Tm × Ð    Ó ÞÕÙ Ö Ó    ni ∈ T º
           ´ µ Ð ÖÑ ÒÓ ÒÑ Ø Ñ ÒØ            Ð Ö         ni Ò Tm × Ð   Ó Ö Ó       ni
               Ò Tº
      ר Ð ÓÖ ØÑÓ ÔÖÓ Ù ÙÒ Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ Ð m¹Ö Ó Óº ÈÙ ×ØÓ ÕÙ Ð Ö Þ ÙÒ
     Ö ÓÐ Tm ÒÓ Ø Ò ÖÑ ÒÓ׸ Ð Ö Þ Ð Ö ÓÐ Ò Ö Ó Ö ×ÙÐØ ÒØ ÒÙÒ Ø Ò Ó Ö Óº
      ר Ó × ÖÚ ÓÒ ÒÓ× ÓÒ Ù       ÜØ Ò Ö Ð Ð ÓÖ ØÑÓ º Ô Ö ÕÙ Ñ Ò Ö ÓÖ × Ò ×¸
    ÐÓ Ù Ð ÓÒ× ×Ø ¸ × ÑÔÐ Ñ ÒØ ¸ Ò ÓÒ× Ö Ö Ð × Ö × ÐÓ× Ö ÓÐ × Ð Ö ÓÖ × Ò
     ÓÑÓ ÖÑ ÒÓ× ÙÒ ÔÖ Ñ Ö Ö Þ ¬ Ø º Ò ×Ø ×Ó ×                    ÓÔØ Ö ÙÒ Ö Ø Ö Ó Ô Ö
       Ø ÖÑ Ò Ö Ð ÓÖ Ò Ò ÕÙ ÐÓ× Ö ÓÐ × Ð Ö ÓÖ × Ò × ÔÖÓ × Ò Ý ÕÙ ÓÒ× ×Ø Ò
    Ñ Ö ÖÐÓ× ÞÕÙ Ö          Ö º
         À Ý ÙÒ Ñ Ò Ö Ú ×Ù Ð      ÒØ ÖÔÖ Ø Ö Ð Ð ÓÖ ØÑÓ º ¸ Ð Ù Ð × ÓÑÓ × Ù
        ½º Ò Ò Ò ÙÒ Ð ×Ø ÒÐ Þ ÐÓ× Ó×                   ÑÐ º
        ¾º Ð Ñ Ò ÐÓ× Ö Ó× Ü ÔØÓ Ð ÕÙ Ú          Ð Ó Ñ × Ð ÞÕÙ Ö º
280                                                           Cap´        ´
                                                                 ıtulo 4. Arboles



                A                              D                 E



        B                C                 I       J             K



    F       G            H                         R         S           T



L       M       O        P        Q



                    U        V



                                 ÙÖ º½ ÍÒ Ö ÓÖ × Ò

     Ð Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ ÓÒØ Ò Ð Ñ ×Ñ ÒØ                   Ö Ó× ÕÙ Ð m¹ Ö Óº ÈÓÖ
     Ð ÞÓ Ú ÖØ Ð Ð Ñ Ò Ó¸ Ü ×Ø ÙÒ Ð ÞÓ ÓÖ ÞÓÒØ Ð Ò Óº
    Ä ¬ ÙÖ º½ ÐÙ×ØÖ Ð Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ Ð Ö ÓÖ × Ò                  Ð ¬ ÙÖ º½
ÐÙ Ó         ÙØ Ö Ð ÒØ ÖÔÖ Ø ÓÒ Ú ×Ù Ð Ð Ð ÓÖ ØÑÓ º º
     Ð Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ       Ð ¬ ÙÖ º½ × Ü Ø Ñ ÒØ Ð Ö ÔÖ × ÒØ ÓÒ Ñ ¹
   ÒØ Ð ×Ø × ÒÐ Þ × Ð Ö ÓÖ × Ò ×ÕÙ Ñ Ø Þ                Ò Ð ¬ ÙÖ º½ º      Ó ÙÒ ÒÓ Ó
 Ù ÐÕÙ Ö Ò Ð Ö ÔÖ × ÒØ ÓÒ ÓÒ Ð ×Ø × ÒÐ Þ ×¸ Ð ÔÙÒØ ÓÖ                Ð Ð ×Ø       Ó×
 ÙÒ       ÔÙÒØ ÓÖ Ð ×Ù Ö ÓÐ ÞÕÙ Ö Óº Ò ÐÓ Ñ ÒØ ¸ Ð ÔÙÒØ ÓÖ              ÐÓ× ÖÑ ÒÓ×
 ÙÒ        ÔÙÒØ ÓÖ        Ð ×Ù Ö ÓÐ Ö Óº
    Ë × × ÒØ Ò Ö ÙÐÓ¸ Ö Ð ¬ ÙÖ º½ ÙÒÓ× 45◦ Ò Ð × ÒØ Ó ÓÖ Ö Ó Ý ×Ø Ö ÙÒ
ÔÓÕÙ Ø Ò ÐÓ× Ð ÞÓ׺     Ú Ö ÙÒ Ö ÓÐ ÓÒ Ð ÓÖÑ Ð ¬ ÙÖ º¾¼º
    Ä ÓÖÖ ×ÔÓÒ Ò × ÒÝ Ø Ú Ð ÓÒÚ Ö× ÓÒ ÙÒ Ö ÓÐ m¹Ö Ó ÖÖÓ ÙÒ ÙÒ Ó
 Ö ÓÐ Ò Ö Óº Ì Ñ Ò × ÒÚ Ö× Ð Ý ×Ù Ð ÓÖ ØÑÓ ÐÑ ÒØ               ٠к
    ÈÙ ×ØÓ ÕÙ T Ý Tb(T ) ×ÓÒ ÕÙ Ú Ð ÒØ × Ô Ö ØÓ Ó T ¸ Ð × Ñ Ò ÔÙÐ ÓÒ × ÕÙ ×        Ò
×Ó Ö ÙÒ Ö ÓÐ m¹Ö Ó ÔÙ Ò Ô Ö Ø Ñ ÒØ Ö Ð Þ Ö× ×Ó Ö ×Ù ÕÙ Ú Ð ÒØ Ò Ö Óº
          ÙÒ Ö ÓÖ × Ò ¸ Ü ×Ø Ò Ó× Ñ Ò Ö × Ð Ñ ÒØ Ð × Ö ÓÖÖ ÖÐ ×
    ¯ Recorrido prefijo

        ½º Î × Ø Ð Ö Þ Ð ÔÖ Ñ Ö Ö ÓÐ ´ Ð Ñ × Ð ÞÕÙ Ö µº
        ¾º Ê ÓÖÖ Ò ÔÖ ¬ Ó ÐÓ× ×Ù Ö ÓÐ × Ð ÔÖ Ñ Ö Ö Óк
        ¿º Ê ÓÖÖ Ò ÔÖ ¬ Ó ÐÓ× Ö ÓÐ × Ö ×Ø ÒØ × ÞÕÙ Ö    Ö            º
    ¯ Recorrido sufijo

        ½º Ê ÓÖÖ Ò ×Ù¬ Ó ÐÓ× ×Ù Ö ÓÐ × Ð ÔÖ Ñ Ö Ö ÓÐ ´ Ð Ñ × Ð ÞÕÙ Ö µº
´
4.4. Arboles Binarios                                                           281



                  A                              D                 E



         B                 C                I         J            K



    F         G            H                          R        S           T



L        M        O        P       Q



                       U       V



             ÙÖ º½ Ê ÔÖ × ÒØ ÓÒ ÓÒ Ð ×Ø ×        Ð Ö ÓÖ × Ò        Ð ¬ ÙÖ º½

         ¾º Î × Ø Ð Ö Þ Ð ÔÖ Ñ Ö Ö Óк
         ¿º Ê ÓÖÖ Ò ×Ù¬ Ó ÐÓ× Ö ÓÐ × Ö ×Ø ÒØ ×       ÞÕÙ Ö     Ö       º
        ÓÖ    Ð ÙÐ ÑÓ× Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó   Ð Ö ÓÖ × Ò          Ð ¬ ÙÖ º½
                      A B F L MG C H O P U V Q D I J R E K S T                 ´ º½ µ
     ר Ö ÓÖÖ Ó ÓÖÖ ×ÔÓÒ Ü Ø Ñ ÒØ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó Ð Ö ÓÐ Ò Ö Ó ÕÙ Ú ¹
Ð ÒØ Ð ¬ ÙÖ º¾¼º ×ÔÙ × ØÓ Ó¸ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó × Ð Ñ Ò Ö ØÓÔÓÐÓ Ñ ÒØ
Ò ØÙÖ Ð Ð ×Ø Ö ÐÓ× ÒÓ Ó× Ò ÙÒ Ö Óк
     Ð Ö ÓÖÖ Ó ×Ù¬ Ó Ð Ö ÓÖ × Ò     Ð ¬ ÙÖ º½ ×
                      L M F G B O U V P Q H C AI R J D S T K E ,               ´ º½ µ
 Ð Ù Ð no ÓÖÖ ×ÔÓÒ Ð Ö ÓÖÖ Ó ×Ù¬ Ó Ð Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ ´¬ ÙÖ º¾¼µº Ò ×Ù
ÐÙ Ö¸ Ð × Ù Ò ´ º½ µ ÓÖÖ ×ÔÓÒ Ð Ö ÓÖÖ Ó Ò¬ Ó Ð Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ Ð
¬ ÙÖ º¾¼º ר ÕÙ Ú Ð Ò          Ö ÓÖÖ Ó× ´×Ù¬ Ó Ò ÙÒ Ö ÓÖ × Ò ⇐⇒ Ò¬ Ó Ò ×Ù
 ÕÙ Ú Ð ÒØ Ò Ö Óµ × ÙÒ Ò Ò Ð ÓÖ ØÑ ¸ ÔÙ × Ð Ö ÓÖÖ Ó ×Ù¬ Ó × Ñ × ÓרÓ×Ó
    ÑÔÐ ÒØ Ö ÕÙ ÐÓ× Ö ÓÖÖ Ó× ÔÖ ¬ Ó Ò¬ Óº
     Ò Ö ×ÙÑ Ò¸       ÙÒ Ö ÓÖ × Ò Ý Ð Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ Ð ÙÐ Ó × ÙÒ Ð
 Ð ÓÖ ØÑÓ º ¸ Ø Ò ÑÓ× Ð × × Ù ÒØ × ÓÖÖ ×ÔÓÒ Ò × ÒØÖ ÐÓ× Ö ÓÖÖ Ó×
   ½º Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó Ð Ö ÓÖ × Ò ÓÖÖ ×ÔÓÒ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó Ð Ö ÓÐ
        Ò Ö Ó ÕÙ Ú Ð ÒØ º
   ¾º Ð Ö ÓÖÖ Ó ×Ù¬ Ó Ð Ö ÓÖ × Ò ÓÖÖ ×ÔÓÒ Ð Ö ÓÖÖ Ó Ò¬ Ó Ð Ö ÓÐ Ò Ö Ó
       ÕÙ Ú Ð ÒØ º
282                                                             Cap´        ´
                                                                   ıtulo 4. Arboles



                                                       A

                   B                                                     D

          F                                        C        I                               E

 L             G                              H                      J                  K

      M                 O                                        R            S

                                     P                                            T

                            U             Q

                                 V



               ÙÖ º¾¼ Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ Ð Ö ÓÐ           Ð ¬ ÙÖ º½

       Ò ÙÒ Ö ÓÖ × Ò ¸ ÐÓ× Ö ÓÖÖ Ó× Ò¬ Ó Ý ÔÓÖ Ò Ú Ð × ÒÓ ÔÙ Ò ¬Ò Ö× ÓÒ ÔÖ ¹
  × ÓÒº Ð Ö Ñ ÒØ ¸ Ý Ú Ö × Ñ Ò Ö ×          ¬Ò Ö Ð Ö ÓÖÖ Ó Ò¬ Ó ×Ó Ö ÙÒ Ö ÓÖ × Ò¹
    ¸ ÔÙ × Ü ×Ø Ò Ú Ö × Ñ Ò Ö × ÓÐÓ Ö Ð Ö Þ ÒØÖ ×Ù× ×Ù Ö ÓР׺ Ð Ñ ×ÑÓ ÑÓ Ó¸
   Ý Ú Ö × ÓÖÑ ×         ¬Ò Ö Ð Ö ÓÖÖ Ó ÔÓÖ Ò Ú Ð × Ò ÙÒ Ö ÓÖ × Ò º
     Ä ÕÙ Ú Ð Ò        ÒØÖ Ö ÓÖ × Ò × Ý Ö ÓÐ × Ò Ö Ó× ×             ×ÙÑ ÑÔÓÖØ Ò
ÔÖ Ø º Ù ÐÕÙ Ö ÔÖÓ Ð Ñ Ö ÔÖ × ÒØ Ó ÓÒ Ö ÓÖ × Ò × ÔÙ Ö ÔÖ × ÒØ Ö× Ý Ö ¹
×ÓÐÚ Ö× Ò Ð ÔÐ ÒÓ ÐÓ× Ö ÓÐ × Ò Ö Ó× Ð Ò ÓÕÙ ÒÚ Ö×Ó Ø Ñ Ò × ÔÓ× Ð º ÓÑÓ
   × Ò ÓÖ × Ý ÔÖÓ Ö Ñ ÓÖ ×¸ ÔÓ ÑÓ× × Ó Ö Ð Ö ÔÖ × ÒØ ÓÒ Ñ ×           Ù     Ò ÙÒ ÓÒ
      ÓÒ × Ø Ð × ÓÑÓ Ð ÓÑÔÖ Ò× ÓÒ Ð ÔÖÓ Ð Ñ ¸ Ð ¬ Ò                   Ù ÓÒ¸ Ð × ÑÔÐ ¹
            Ð ×ÓÐÙ ÓÒ Ý Ð Ö ÙØ Ð Þ ÓÒ Ð ÓÖ ØÑÓ× Ý Ó Ó× Ü ×Ø ÒØ ׺
       Ð Ð Ó Ð Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ ÔÙ × Ö ÙØ Ð Ò ÖØ × Ð × × ÔÖÓ Ð Ñ ×º Ä
¬ ÙÖ º¾½ ÑÙ ×ØÖ Ð Ö ÓÐ Ò Ö Ó Ð Ó ÕÙ Ú Ð ÒØ Ð Ö ÓÖ × Ò                   Ð ¬ ÙÖ º½ º
  Ð Ù Ö ×Ø Ö ÔÖ × ÒØ ÓÒ ÓÒ Ð ×Ø × ÒÓ× Ô ÖÑ Ø Ö ÔÖ Ò Ö Ý ÓÖÖÓ ÓÖ Ö Ð × Ò ¬¹
     Ó ÐÓ× ÐÓ× Ý ×Ù ÙØ Ð Þ ÓÒ Ô Ö Ö Ö × Ö ×Ó Ö ÐÓ× Ò ×ØÖÓ׺ È Ö ÐÐÓ¸ Ö ÓÖ ÑÓ×
ÕÙ Ð Ö ÓÖÖ Ó Ò¬ Ó Ò Ð Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ × ÓÖÖ ×ÔÓÒ ÓÒ Ð Ö ÓÖÖ Ó ×Ù¬ Ó
 Ò Ð Ö ÓÖ × Ò º ÈÓÖ ÐÓ Ø ÒØÓ¸ Ð Ü Ô ÓÒ ÐÓ× ÒÓ Ó× Ñ × Ð ÞÕÙ Ö Ý Ñ × Ð
   Ö          Ð Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ ¸ ÔÓ ÑÓ× ÓÒ ÐÙ Ö ÓÒ Ð × × Ù ÒØ × Ó × ÖÚ ÓÒ ×
   Ò Ö Ð × ×Ó Ö ÐÓ× ÐÓ× Ý ×Ù × ÒØ Ó Ö ×Ô ØÓ Ð Ö ÓÐ m¹Ö Ó
    ½º ÍÒ ÐÓ Ö Ó ÔÙÒØ ¸ × ÑÔÖ ¸ ×Ù Ô Ö ¸ ÔÙ × ×Ø × Ð ×Ù ×ÓÖ ×Ù¬ Ó Ò Ð
         Ö ÓÖ × Ò º
    ¾º ÍÒ ÐÓ ÞÕÙ Ö Ó ÒÓØ ÕÙ Ð ÒÓ Ó × Ó Ò Ð Ö ÓÐ m¹Ö Ó ×ØÓ ×                      Ù
           Ö Ø Ñ ÒØ Ð ÕÙ Ú Ð Ò º
          Ð ÒÓ Ó ×Ø ÒÓ Ð ÐÓ ÓÖÖ ×ÔÓÒ ÓÒ Ð ÔÖ           ×ÓÖ ×Ù¬ Ó Ò Ð Ö ÓÐ m¹Ö Óº ÕÙ
        Ø Ò ÑÓ× Ó× ×Ó×
         ´ µ Ë Ð Ó × Ð ÒÓ Ó Ñ × Ð ÞÕÙ Ö Ò Ð Ö ÓÐ m¹Ö Ó¸ ÕÙ ÔÙ               ÒØ ¬ Ö×
4.5. Un TAD gen´rico para ´rboles
                    e          a                                                                                                                                                                                                                                                          283



                                                                                                                                                                                             A
                                                                                                                                                                                             º
                                                                                                                                                                                             º
                                                                                                                                                                                             º     º
                                                                                                                                                                                                   º
                                                                                                                                                                                             º
                                                                                                                                                                                             º     º
                                                                                                                                                                                                   º
                                                                                                                                                                                             º
                                                                                                                                                                                             º     º
                                                                                                                                                                                                   º
                                                                                                                                                                                             º
                                                                                                                                                                                             º     º
                                                                                                                                                                                                   º
                                                                                                                                                                                             º
                                                                                                                                                                                             º
                                                                                                                                                                                             º     º
                                                                                                                                                                                                   º
                                                                                                                                                                                                   º
                                                                                                                                                                                             º
                                                                                                                                                                                             º    ºº
                                                                                                                                                                                             º    º
                                                             B                                                                                                                               º
                                                                                                                                                                                             ºº
                                                                                                                                                                                              º
                                                                                                                                                                                              º
                                                                                                                                                                                              º
                                                                                                                                                                                              º
                                                                                                                                                                                                  º
                                                                                                                                                                                                  º
                                                                                                                                                                                                  º
                                                                                                                                                                                                  º
                                                                                                                                                                                                  º
                                                                                                                                                                                                  º
                                                                                                                                                                                                  º
                                                                                                                                                                                                                                                                D
                                                            º º
                                                            º º                                                                                                                               º
                                                                                                                                                                                              º   º
                                                                                                                                                                                                  º                                                             º º
                                                                                                                                                                                                                                                                º º  º
                                                            º º
                                                            º º
                                                            º º
                                                                                                                                                                                              º
                                                                                                                                                                                              º
                                                                                                                                                                                              º
                                                                                                                                                                                                  º
                                                                                                                                                                                                  º
                                                                                                                                                                                                  º
                                                                                                                                                                                                                                                                º º
                                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                                º º
                                                            º º
                                                            º º
                                                            º                                                                                                                                 º
                                                                                                                                                                                              º   º
                                                                                                                                                                                                  º                                                             º º
                                                                                                                                                                                                                                                                º º
                                                            º º                                                                                                                               º
                                                                                                                                                                                              º   º
                                                                                                                                                                                                  º                                                             º º
                                                                                                                                                                                                                                                                º º
                                                            º º º                                                                                                                             º
                                                                                                                                                                                              º   º
                                                                                                                                                                                                  º                                                             º º
                                                            º º
                                                            º º
                                                            º º
                                                            º º
                                                                                                                                                                                              º
                                                                                                                                                                                              º
                                                                                                                                                                                              º
                                                                                                                                                                                                  º
                                                                                                                                                                                                  º
                                                                                                                                                                                                  º                                                             º º
                                                                                                                                                                                                                                                                º º
                                                                                                                                                                                                                                                                º º
                                                                                                                                                                                                                                                                º º
                                                            º                                                                                                                                 º
                                                                                                                                                                                              º   º
                                                                                                                                                                                                  º                                                             º º
                                 F     º
                                                            º º
                                                             º º
                                                             º º
                                                             º
                                                             º º
                                                             º º
                                                             º º
                                                             º º                                                                                                           º
                                                                                                                                                                                C             º
                                                                                                                                                                                              º
                                                                                                                                                                                              º
                                                                                                                                                                                              º
                                                                                                                                                                                              º
                                                                                                                                                                                              º
                                                                                                                                                                                              º
                                                                                                                                                                                              º
                                                                                                                                                                                              º
                                                                                                                                                                                                  º
                                                                                                                                                                                                  º
                                                                                                                                                                                                  º
                                                                                                                                                                                                  º
                                                                                                                                                                                                  º
                                                                                                                                                                                                  º
                                                                                                                                                                                                  º
                                                                                                                                                                                                  º
                                                                                                                                                                                                  º
                                                                                                                                                                                                                  I                                              º º
                                                                                                                                                                                                                                                                 º
                                                                                                                                                                                                                                                                 º
                                                                                                                                                                                                                                                                 º º
                                                                                                                                                                                                                                                                 º º
                                                                                                                                                                                                                                                                 º º
                                                                                                                                                                                                                                                                 º ºº
                                                                                                                                                                                                                                                                                                                           º
                                                                                                                                                                                                                                                                                                                                E
                                 º     º
                                       º                     º º                                                                                                           º
                                                                                                                                                                           º    º             º   º           º    º                                             º º
                                                                                                                                                                                                                                                                 º º                                                       º
                                                                                                                                                                                                                                                                                                                           º
                                 º
                                 º
                                 º    º
                                      º                      º º
                                                             ºº                                                                                                            º
                                                                                                                                                                           º    º
                                                                                                                                                                                ºº            º
                                                                                                                                                                                              º
                                                                                                                                                                                              º
                                                                                                                                                                                                  º
                                                                                                                                                                                                  º
                                                                                                                                                                                                  º          ºº
                                                                                                                                                                                                              º    º
                                                                                                                                                                                                                   º                                             º º
                                                                                                                                                                                                                                                                 º                                                         º
                                                                                                                                                                                                                                                                                                                           º
                                 º    º
                                      º                      ºº
                                                             ºº                                                                                                            º
                                                                                                                                                                           ºº    º
                                                                                                                                                                                 º            º
                                                                                                                                                                                              º   º
                                                                                                                                                                                                  º          º
                                                                                                                                                                                                             º     º
                                                                                                                                                                                                                   º                                             ºº
                                                                                                                                                                                                                                                                 ººº                                                       º
                                                                                                                                                                                                                                                                                                                           º
                                                                                                                                                                                                                                                                                                                           º
                                 º
                                 º    º                      ººº                                                                                                            º     º
                                                                                                                                                                                  º           º
                                                                                                                                                                                              º
                                                                                                                                                                                              º   º
                                                                                                                                                                                                  º         º
                                                                                                                                                                                                            º      º
                                                                                                                                                                                                                   º                                             ºº                                                        º
                                 º
                                 º    º                      º
                                                             ºº                                                                                                             º      º
                                                                                                                                                                                   º          º   º        º       º                                             ºº
                                                                                                                                                                                                                                                                 ºº                                                         º
                                 º
                                 º
                                      º
                                      º
                                      º                      ºº
                                                             ºº
                                                             ºº
                                                                                                                                                                            º
                                                                                                                                                                            º
                                                                                                                                                                            º      ºº
                                                                                                                                                                                    º        ºº
                                                                                                                                                                                              º   º
                                                                                                                                                                                                  º
                                                                                                                                                                                                  º       º
                                                                                                                                                                                                          º
                                                                                                                                                                                                           º
                                                                                                                                                                                                           º       º
                                                                                                                                                                                                                   º                                             ºº
                                                                                                                                                                                                                                                                 ºº
                                                                                                                                                                                                                                                                 ººº                                                        º
                                                                                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                                                                            º
                                 º
                                 º    º
                                      º                      ºº                                                                                                             º
                                                                                                                                                                            º        º
                                                                                                                                                                                     º       º
                                                                                                                                                                                             º    ºº     º
                                                                                                                                                                                                         º         º
                                                                                                                                                                                                                   º                                             ºº                                                         º
                                                                                                                                                                                                                                                                                                                            º
                                 º
                                 º    º
                                      º                      ºº
                                                             ºº
                                                             º                                                                                                              º
                                                                                                                                                                            º         º
                                                                                                                                                                                      º º
                                                                                                                                                                                      º º    º
                                                                                                                                                                                             º     º
                                                                                                                                                                                                   º º
                                                                                                                                                                                                   º ºº  º        º
                                                                                                                                                                                                                  º                                              ºº
                                                                                                                                                                                                                                                                 º
                                                                                                                                                                                                                                                                 º                                                          º
                                                                                                                                                                                                                                                                                                                            º
      L    º
                                 ºº
                                  º
                                  º
                                  º
                                  º
                                  º
                                      º
                                      º
                                      º
                                      º
                                      º
                                      º
                                      º     º
                                                G            ºº
                                                             ºº
                                                             ºº
                                                             ºº
                                                             ºº
                                                             ºº
                                                             º
                                                             º
                                                                                                                                                             H              º
                                                                                                                                                                            º
                                                                                                                                                                            º
                                                                                                                                                                            º
                                                                                                                                                                            º
                                                                                                                                                                            º
                                                                                                                                                                            º
                                                                                                                                                                            º
                                                                                                                                                                                       º º
                                                                                                                                                                                       ºº º
                                                                                                                                                                                        ºº º
                                                                                                                                                                                        ººº
                                                                                                                                                                                          ºº
                                                                                                                                                                                                   º º
                                                                                                                                                                                                    º º
                                                                                                                                                                                                    ºººº
                                                                                                                                                                                                     ººº
                                                                                                                                                                                                      ºº
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                                                   J             ºº
                                                                                                                                                                                                                                                                 ºº
                                                                                                                                                                                                                                                                 ºº
                                                                                                                                                                                                                                                                 ºº
                                                                                                                                                                                                                                                                 ºº
                                                                                                                                                                                                                                                                 ºº
                                                                                                                                                                                                                                                                 º
                                                                                                                                                                                                                                                                 º
                                                                                                                                                                                                                                                                                                              K             º
                                                                                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                                                                            º
           º
           º                      º
                                  º   º
                                      º     º
                                            º   º            ºº
                                                             º
                                                             ºº                                                                                              º     º
                                                                                                                                                                   º
                                                                                                                                                                   º        º
                                                                                                                                                                            º                                     º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                              º    º             ºº
                                                                                                                                                                                                                                                                 ºº
                                                                                                                                                                                                                                                                 º                                            º    º
                                                                                                                                                                                                                                                                                                                   º
                                                                                                                                                                                                                                                                                                                   º        º
                                                                                                                                                                                                                                                                                                                            º
          º
          º                       º
                                  º
                                  º
                                      º
                                      º
                                      º
                                      º    º
                                           ºº   º
                                                ºº
                                                 º           ºº
                                                             ºº
                                                             ºº
                                                                                                                                                             º
                                                                                                                                                             º
                                                                                                                                                             º
                                                                                                                                                                   ºº
                                                                                                                                                                    º
                                                                                                                                                                            º
                                                                                                                                                                            º
                                                                                                                                                                            º                                     º
                                                                                                                                                                                                                  º                           º
                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                                   º
                                                                                                                                                                                                                                                   º
                                                                                                                                                                                                                                                   ºº            ºº
                                                                                                                                                                                                                                                                 ºº
                                                                                                                                                                                                                                                                 ºº
                                                                                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                                                                                              º    ºº
                                                                                                                                                                                                                                                                                                                    º
                                                                                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                                                                            º
          º
          º                       º
                                  º   º
                                      º   ºº     ºº          ºº
                                                             ººº                                                                                             º       º      º
                                                                                                                                                                            º
                                                                                                                                                                            º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                  º                           ºº    º
                                                                                                                                                                                                                                                    º            ºº
                                                                                                                                                                                                                                                                 ºº                                           º
                                                                                                                                                                                                                                                                                                              º     ºº
                                                                                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                                                                            º
          º
          º                       º
                                  º   º º
                                      º º º
                                          º       ºº         ºº
                                                             ºº                                                                                              º
                                                                                                                                                             º
                                                                                                                                                             º       º
                                                                                                                                                                     º º    º                                     º
                                                                                                                                                                                                                  º                            º
                                                                                                                                                                                                                                               º     º
                                                                                                                                                                                                                                                     º           ºº
                                                                                                                                                                                                                                                                 ºº
                                                                                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                                                                                              º      º
                                                                                                                                                                                                                                                                                                                     º º    º
                                                                                                                                                                                                                                                                                                                            º
          º
          º
          º                       º
                                  º
                                  º   º º
                                      º º
                                      º º
                                                   º
                                                   ºº
                                                    º
                                                             º
                                                             ºº
                                                             ºº
                                                            ºº
                                                                                                                                                             º
                                                                                                                                                             º
                                                                                                                                                             º
                                                                                                                                                                      º º
                                                                                                                                                                      º º
                                                                                                                                                                      º º
                                                                                                                                                                       º º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                      º
                                                                                                                                                                                                                                                      º
                                                                                                                                                                                                                                                      ºº         ºº
                                                                                                                                                                                                                                                                 ºº
                                                                                                                                                                                                                                                                 ºº
                                                                                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                                                                                                      º º
                                                                                                                                                                                                                                                                                                                      º º
                                                                                                                                                                                                                                                                                                                      º
          º                       º
                                  º   º º            º      º º
                                                            º                                                                                                 º
                                                                                                                                                              º        º º                                        º
                                                                                                                                                                                                                  º                            º       º        ºº º                                          º
                                                                                                                                                                                                                                                                                                              º        º º
                                                                                                                                                                                                                                                                                                                       º º
                                                                                                                                                                                                                                                                                                                       º º
          º
          º
          º                       º
                                  º
                                  º
                                      º º
                                      º º
                                      ºº
                                      ººº
                                                     ºº
                                                      º º º º º
                                                            º
                                                            º ºº                                                                                              º
                                                                                                                                                              º
                                                                                                                                                                       º º
                                                                                                                                                                        º º
                                                                                                                                                                        ºº
                                                                                                                                                                         ººº
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                        ºº
                                                                                                                                                                                                                                                         º º º  º º
                                                                                                                                                                                                                                                                º º
                                                                                                                                                                                                                                                                   º                                          º
                                                                                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                                                                                              º         º º
                                                                                                                                                                                                                                                                                                                        º º
                                                                                                                                                                                                                                                                                                                         ºº
          º
          º
          º
          º
          º
          º      º
                     M            º
                                  º
                                  º
                                  º
                                  º
                                  º
                                  º
                                  º
                                       ºº
                                       ºº              º º º
                                                       ºº º º
                                                        ºº
                                                        ººº º
                                                          ºº º
                                                           º º
                                                               º
                                                               º
                                                               º
                                                               º
                                                                              O                                                                               º
                                                                                                                                                              º
                                                                                                                                                              º
                                                                                                                                                              º
                                                                                                                                                              º
                                                                                                                                                              º
                                                                                                                                                              º
                                                                                                                                                                         ºº
                                                                                                                                                                          ºº                                      º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                                  R   º
                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                          º º º
                                                                                                                                                                                                                                                           ºº º º
                                                                                                                                                                                                                                                          ºº º º
                                                                                                                                                                                                                                                           ººº º
                                                                                                                                                                                                                                                             ºº º
                                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                                                   º
                                                                                                                                                                                                                                                                   º
                                                                                                                                                                                                                                                                   º
                                                                                                                                                                                                                                                                                   S    º
                                                                                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                                                                                         ºº
                                                                                                                                                                                                                                                                                                                          ºº
          º
          º
          º      º
                 º
                 º   º
                     º            º
                                  º                            º
                                                               º              º    º
                                                                                   º                                                                          º                                                   º
                                                                                                                                                                                                                  º           º
                                                                                                                                                                                                                              º       º
                                                                                                                                                                                                                                      º
                                                                                                                                                                                                                                      º        º
                                                                                                                                                                                                                                               º                   º
                                                                                                                                                                                                                                                                   º               º    º
                                                                                                                                                                                                                                                                                        º                      º
                                                                                                                                                                                                                                                                                                               º
          º
          º     º    ºº           º
                                  º                            º
                                                               º             º
                                                                             ºº    º
                                                                                   º                                                                          º
                                                                                                                                                              º                                                   º
                                                                                                                                                                                                                  º          º         º
                                                                                                                                                                                                                                       º       º
                                                                                                                                                                                                                                               º                   º              º
                                                                                                                                                                                                                                                                                  ºº   º
                                                                                                                                                                                                                                                                                       º                       º
                                                                                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                                                                               º
          º
          º     º
                º     º
                      ºº          º
                                  º                            º
                                                               º             º
                                                                             º     º                                                                          º
                                                                                                                                                              º                                                   º
                                                                                                                                                                                                                  º         ºº
                                                                                                                                                                                                                             º         º       º
                                                                                                                                                                                                                                               º                   º
                                                                                                                                                                                                                                                                   º             ºº    º
                                                                                                                                                                                                                                                                                       º                       º
          º
          º º  º
               º       º          º
                                  º                            º
                                                               º            º      º
                                                                                   º                                                                          º
                                                                                                                                                              º                                                   º
                                                                                                                                                                                                                  º         º           º
                                                                                                                                                                                                                                        º      º
                                                                                                                                                                                                                                               º                   º
                                                                                                                                                                                                                                                                   º             º     º                       º
                                                                                                                                                                                                                                                                                                               º
          º º
          º º           º
                        º         º                            º
                                                               º           º
                                                                           º       º
                                                                                   º                                                                          ºº                                                  º
                                                                                                                                                                                                                  º        º
                                                                                                                                                                                                                           º            ºº º   º                   º
                                                                                                                                                                                                                                                                   º            º
                                                                                                                                                                                                                                                                                º      º
                                                                                                                                                                                                                                                                                       º                       º
                                                                                                                                                                                                                                                                                                               º
          º º           º         º
                                  º                            º           º                                                                                   º                                                  º       º              º º                        º           º      º                       º
          º º
          º º
          º º
                         º
                         ºº
                          º
                                 º
                                 º
                                 º
                                                                º
                                                                º
                                                                º
                                                                º        º
                                                                          º
                                                                          º
                                                                          º       º
                                                                                  º
                                                                                   º
                                                                                   º                                                                           º
                                                                                                                                                               º                                                  º
                                                                                                                                                                                                                  ºº     º
                                                                                                                                                                                                                         º
                                                                                                                                                                                                                          º
                                                                                                                                                                                                                          º               º º
                                                                                                                                                                                                                                          º º
                                                                                                                                                                                                                                          º º
                                                                                                                                                                                                                                           º º
                                                                                                                                                                                                                                                                    º
                                                                                                                                                                                                                                                                    º
                                                                                                                                                                                                                                                                    º         º
                                                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                                               º       º
                                                                                                                                                                                                                                                                                       º                       º
                                                                                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                                                                               º
          º º
          º ºº            ºº
                           º º   º
                                 º                              º
                                                                º       º
                                                                        º         º                                                                            º
                                                                                                                                                               º                                                   º
                                                                                                                                                                                                                   º ºº
                                                                                                                                                                                                                   º ºº                    º º
                                                                                                                                                                                                                                           ºº                       º
                                                                                                                                                                                                                                                                    º        ºº        º
                                                                                                                                                                                                                                                                                       º                       º
                                                                                                                                                                                                                                                                                                               º
           ºº               ºº ºº                                       º         º                                                                            º                                                   º ºº                     ºº                      º        º         º
           ºº
            ºº              º º
                             ºº
                             ººº
                              ºº
                               º
                                                                 º
                                                                 º
                                                                 º ºº
                                                                 º ºº
                                                                 º º
                                                                  º º
                                                                  ººº º
                                                                   ºº
                                                                   ºº
                                                                                  º
                                                                                  º
                                                                                  º
                                                                                  º
                                                                                  º
                                                                                  º
                                                                                                                              P     º
                                                                                                                                                               º
                                                                                                                                                               º
                                                                                                                                                               º
                                                                                                                                                               º
                                                                                                                                                               º
                                                                                                                                                               º
                                                                                                                                                                                                                    º º
                                                                                                                                                                                                                    ºººº
                                                                                                                                                                                                                     ººº
                                                                                                                                                                                                                     ºº
                                                                                                                                                                                                                                            ºº
                                                                                                                                                                                                                                             ºº                      º
                                                                                                                                                                                                                                                                     º ºº
                                                                                                                                                                                                                                                                     º º
                                                                                                                                                                                                                                                                      º º
                                                                                                                                                                                                                                                                      ºººº
                                                                                                                                                                                                                                                                       ºº º
                                                                                                                                                                                                                                                                       ºº
                                                                                                                                                                                                                                                                            º          º
                                                                                                                                                                                                                                                                                       º
                                                                                                                                                                                                                                                                                       º
                                                                                                                                                                                                                                                                                       º
                                                                                                                                                                                                                                                                                       º
                                                                                                                                                                                                                                                                                       º
                                                                                                                                                                                                                                                                                       º     º
                                                                                                                                                                                                                                                                                                 T             º
                                                                                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                                                                               º
                                                                                  º
                                                                                  º                                           º
                                                                                                                              º     º
                                                                                                                                    º                          º
                                                                                                                                                               º                                                                                                                       º
                                                                                                                                                                                                                                                                                       º    ºº   º
                                                                                                                                                                                                                                                                                                 º             º
                                                                                                                                                                                                                                                                                                               º
                                                                                  º
                                                                                  º
                                                                                  º                                           º
                                                                                                                              º    º
                                                                                                                                   º                           º
                                                                                                                                                               º                                                                                                                       º
                                                                                                                                                                                                                                                                                       º    º
                                                                                                                                                                                                                                                                                            º    º
                                                                                                                                                                                                                                                                                                 º             º
                                                                                                                                                                                                                                                                                                               º
                                                                                  º                                           º    º
                                                                                                                                   º                           º
                                                                                                                                                               º                                                                                                                       º
                                                                                                                                                                                                                                                                                       º   ºº     º
                                                                                                                                                                                                                                                                                                  º
                                                                                                                                                                                                                                                                                                  º            º
                                                                                                                                                                                                                                                                                                               º
                                                                                  º
                                                                                  º
                                                                                  º                                           º
                                                                                                                              º    º
                                                                                                                                   º                           º
                                                                                                                                                               º                                                                                                                       º º
                                                                                                                                                                                                                                                                                       º º º
                                                                                                                                                                                                                                                                                           º       º           º
                                                                                                                                                                                                                                                                                                               º
                                                                                  º                                           º
                                                                                                                              º    º
                                                                                                                                   º                           º
                                                                                                                                                               º                                                                                                                       º º
                                                                                                                                                                                                                                                                                       º           ºº
                                                                                                                                                                                                                                                                                                    º          º
                                                                                                                                                                                                                                                                                                               º
                                                                                  º
                                                                                  º
                                                                                  º                                           º
                                                                                                                              º    º
                                                                                                                                   º                           º
                                                                                                                                                               º                                                                                                                       º º
                                                                                                                                                                                                                                                                                       º º          ºº         º
                                                                                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                                                                               º
                                                                                  º                                           º
                                                                                                                              º    º
                                                                                                                                   º                           º
                                                                                                                                                               º                                                                                                                       º º
                                                                                                                                                                                                                                                                                       º º
                                                                                                                                                                                                                                                                                       º º           º        º
                                                                                                                                                                                                                                                                                                              º
                                                                                  º
                                                                                  º                                           º    º                           º
                                                                                                                                                               º                                                                                                                       º
                                                                                                                                                                                                                                                                                       º º            º
                                                                                                                                                                                                                                                                                                      º
                                                                                                                                                                                                                                                                                                      º º     º
                                                                                                                                                                                                                                                                                                              º
                                                                                  º                                           º    º                           º                                                                                                                       ºº              º º
                                                                                  º
                                                                                  º
                                                                                  º
                                                                                  º
                                                                                  º
                                                                                  º
                                                                                  º
                                                                                  º
                                                                                                   U    º
                                                                                                                              ºº
                                                                                                                               º
                                                                                                                               º
                                                                                                                               º
                                                                                                                               º
                                                                                                                               º
                                                                                                                                   º
                                                                                                                                   º
                                                                                                                                   º
                                                                                                                                   º
                                                                                                                                   º
                                                                                                                                   º       º
                                                                                                                                               Q               º
                                                                                                                                                               º
                                                                                                                                                               º
                                                                                                                                                               º
                                                                                                                                                               º
                                                                                                                                                               º
                                                                                                                                                               º
                                                                                                                                                               º
                                                                                                                                                                                                                                                                                        ºº
                                                                                                                                                                                                                                                                                        ºº
                                                                                                                                                                                                                                                                                         º             º º
                                                                                                                                                                                                                                                                                                        ºº º
                                                                                                                                                                                                                                                                                                        ºº º
                                                                                                                                                                                                                                                                                                         ººº
                                                                                                                                                                                                                                                                                                           ºº
                                                                                  º
                                                                                  º           ºº        º
                                                                                                        º                      º
                                                                                                                               º   º
                                                                                                                                   º
                                                                                                                                   º      ºº   º
                                                                                                                                               º               º
                                                                                                                                                               º
                                                                                  º
                                                                                  º           º
                                                                                              º
                                                                                              º        º
                                                                                                       º                       º
                                                                                                                               º   º      º
                                                                                                                                          º
                                                                                                                                          º    º
                                                                                                                                               º               º
                                                                                                                                                               º
                                                                                  º
                                                                                  º          º
                                                                                             º         º
                                                                                                       º                       º
                                                                                                                               º   º
                                                                                                                                   º     º      º
                                                                                                                                                º
                                                                                                                                                º             º
                                                                                                                                                              º
                                                                                  º
                                                                                  º         º          º
                                                                                                       º                       º
                                                                                                                               º   º
                                                                                                                                   º º   º
                                                                                                                                         º       º            º
                                                                                  º        º
                                                                                           ºº          º
                                                                                                       º                       º
                                                                                                                               º   º º
                                                                                                                                   º º           ºº           º
                                                                                                                                                              º
                                                                                                                                                              º
                                                                                  º
                                                                                  º       ºº           º
                                                                                                       º                       º   º º            º
                                                                                                                                                  º
                                                                                                                                                  º           º
                                                                                                                                                              º
                                                                                  º
                                                                                  ºº     º             º
                                                                                                       º                       º
                                                                                                                               º   º º
                                                                                                                                   º º º           º         ºº
                                                                                   º     º
                                                                                         º             º
                                                                                                       º                       º
                                                                                                                               º   º º
                                                                                                                                   º º              º
                                                                                                                                                    º
                                                                                                                                                    º        º
                                                                                                                                                             º
                                                                                   º º
                                                                                   º ºº                º                       º   ººº
                                                                                    º ºº
                                                                                    ºººº
                                                                                     ººº
                                                                                      ºº
                                                                                                       º
                                                                                                       º
                                                                                                       º
                                                                                                       º
                                                                                                       º
                                                                                                       º
                                                                                                       º     º
                                                                                                                 V             º
                                                                                                                               º
                                                                                                                               º
                                                                                                                               º
                                                                                                                               º
                                                                                                                               º
                                                                                                                               º
                                                                                                                               º
                                                                                                                                    ºº
                                                                                                                                    ºº               º
                                                                                                                                                     ºº º
                                                                                                                                                       ºº ºº
                                                                                                                                                      º º
                                                                                                                                                        ºº º
                                                                                                                                                         ºº
                                                                                                                                                          ºº
                                                                                                                                                           º
                                                                                                                                                             º
                                                                                                                                                             º
                                                                                                       º
                                                                                                       º     º
                                                                                                             º   º
                                                                                                                 º             º
                                                                                                                               º
                                                                                                       º    º
                                                                                                            º
                                                                                                            º    º
                                                                                                                 ºº            º
                                                                                                                               º
                                                                                                       º
                                                                                                       º    º     º
                                                                                                                  º            º
                                                                                                                               º
                                                                                                                               º
                                                                                                       º
                                                                                                       º º º
                                                                                                           º       º           º
                                                                                                                               º
                                                                                                       º º
                                                                                                       º º         ºº
                                                                                                                    º          º
                                                                                                       º º
                                                                                                       º º          ºº        ºº
                                                                                                       º º
                                                                                                       º º
                                                                                                       º º           ºº       º
                                                                                                                              º
                                                                                                       ºº
                                                                                                       ºº             ºº
                                                                                                                       º º    º
                                                                                                                              º
                                                                                                        ºº
                                                                                                        ºº               ºº ºº
                                                                                                                        º º
                                                                                                                        ºº º
                                                                                                                         ººº
                                                                                                                           ºº



                                      ÙÖ º¾½ Ö ÓÐ Ò Ö Ó¸ Ð Ó¸ ÕÙ Ú Ð ÒØ Ð Ö ÓÐ                                                                                                                                               Ð ¬ ÙÖ º½

                         Ò Ð ÕÙ Ú Ð ÒØ Ò Ö Ó ÔÓÖÕÙ × ÙÒ Ó ÞÕÙ Ö Ó¸ ÒØÓÒ × Ð ÐÓ ÔÙÒØ
                        ÙÒ Ø Ó ÔÖ ÑÓ Ò ØÓ Ò Ð ÙÒ Ò Ö ÓÒº ÆÓØ ÑÓ× ÕÙ ÔÙ ØÖ Ø Ö×    ÙÒ
                        Ø Ó Ö ØÓ Ó ÙÒ Ø Ó Ò Ò Ö ÓÒ × ÒØ Ö ÓÖ ×¸ × ÙÒ Ð ÔÖÓ ÙÒ      Ð
                          Ó º
                     ´ µ Ò Ð ×Ó ÓÒØÖ Ö Ó¸ × Ð Ó ÒÓ × Ð Ñ × Ð ÞÕÙ Ö Ò Ö ÓÐ m¹Ö Ó¸
                         ÒØÓÒ ×¸ Ð ÐÓ ÔÙÒØ ¸ × ÑÔÖ ¸ ×Ù ÖÑ ÒÓ ÞÕÙ Ö Óº

     4.5                 Un TAD gen´rico para ´rboles
                                   e          a
     ÄÓ× Ö ÓÐ × Ò Ö Ó× ÒÓ× Ô ÖÑ Ø Ò Ö ×ÓÐÚ Ö ÙÒ ÑÔÐ Ú Ö ÔÖÓ Ð Ñ ×º ÆÓ Ó ×Ø ÒØ ¸
      Ò Ð ÙÒ × Ó × ÓÒ × ÔÙ ÔÖ Ö Ö× ÙÒ Ö ÓÐ Ð ÙÒ ÓÖ Ò Óº Ò ×Ø × ÒØ Ó¸ ר
     × ÓÒ ØÖ Ø Ö ×Ó Ö Ð × ÒÓ ÑÔÐ ÒØ ÓÒ ÙÒ Ì ÕÙ ÑÓ Ð ÙÒ Ö Óк
           Ð Ì Ò Ù ×Ø ÓÒ × Ò Ù ÒØÖ Ò Ð Ö ÚÓ ØÔÐ ØÖ ÒÓ ºÀ ¾ ¿ ¸ ÙÝ ×ØÖÙ ØÙÖ
       Ò Ö Ð × ÓÑÓ × Ù
¾¿    ØÔÐ ØÖ ÒÓ ºÀ ¾ ¿ ≡
          template <class T>
      class Tree_Node
      {
          ØÖ ÙØÓ× Tree Node<T> ¾
         Å ØÓ Ó× ÔÖ Ú Ó× Tree Node<T> ¾
         Å ØÓ Ó× ÔÙ Ð Ó× Tree Node<T> ¾
      };
          Å ØÓ Ó× ÙØ Ð Ø Ö Ó×                                                     Ö ÓÐ × ¾
           Ò Ð Ð ÓÖ ÓÒ      ר Ì × ÓÒØÓ ÓÒ Ð × Ú Ð Ó× × ÝÙ ×                                                                                                                                          ÐÓ× Ô Ö Ð ÔÓ                                          ×ØÙ ÒØ × ÂÓ×
      Ö ØÓ ´Ñ ×ØÖ µ Ý ÂÙ Ò Ù ÒØ × ´ÔÖ Ö Óµº
284                                                                Cap´        ´
                                                                          ıtulo 4. Arboles



         Ð Ì Tree Node<T> ÑÓ Ð Þ ÙÒ ÒÓ Ó ÙÒ Ö ÓÐ Ò Ö Ð Ð Ù Ð Ù Ö ÙÒ ØÖ ¹
     ÙØÓ Ò Ö Ó Ø ÔÓ T ×Ô ¬ Ó Ð × Ù ÒØ ÓÖÑ
¾     ØÖ ÙØÓ× Tree Node<T> ¾ ≡                      ´¾ ¿µ ¾
      T data;
    Ð Ù Ð ÔÙ               Ö× Ñ    ÒØ
¾   Å ØÓ Ó× ÔÙ Ð Ó×    Tree Node<T> ¾    ≡                        ´¾ ¿µ ¾
      T & get_key() { return get_data(); }
      T & get_data() { return data; }
      typedef T key_type;
        ÆÙ ×ØÖ ÔÖ Ñ Ö    × ÓÒ    × ÒÓ ÓÒ× ×Ø Ò × Ó Ö Ð Ö ÔÖ × ÒØ ÓÒ Ò Ñ ÑÓÖ º
    ÈÙ ×ØÓ ÕÙ ÔÖ Ø Ò ÑÓ× Ú Ö× Ø Ð Ý Ò Ö Ð ¸ ØÖ Ò× Ö ÑÓ× ÔÓÖ Ð Ö ÔÖ × ÒØ ÓÒ ÓÒ
    Ð ×Ø ׸ ÔÙ × ×Ø Ó Ö Ñ × Ò Ñ ×ÑÓ ÕÙ ×Ù ÓÒØÖ Ô ÖØ ÓÒ ÖÖ ÐÓ׺ ÓÒ× Ù ÒØ ¹
    Ñ ÒØ ¸ Ö ÕÙ Ö ÑÓ× Ó× ÒÐ × Ó Ð ×
¾      ØÖ ÙØÓ× Tree Node<T> ¾ +≡                    ´¾ ¿µ ¾    ¾
      Dlink child;
      Dlink sibling;
       child ÒÐ Þ     ÐÓ× Ó× Ñ × Ð ÞÕÙ Ö Ý sibling ÒÐ Þ                ÐÓ× ÖÑ ÒÓ× ×Ù      ×Ó
    ר     Ó ÔÓÖ ÐÓ× × Ù ÒØ × Ñ ØÓ Ó×
¾   Å ØÓ Ó× ÔÙ Ð Ó× Tree Node<T> ¾ +≡              ´¾ ¿µ           ¾      ¾
      Dlink * get_child_list() { return &child; }
      Dlink * get_sibling_list() { return &sibling; }
        ÅÙ × Ú ×¸ ÐÙ Ó Ó Ø Ò Ö ÙÒ ÔÙÒØ ÖÓ Dlink Ó × child Ó sibling¸ Ò ¹
    × Ø Ö ÑÓ× ÓÒÚ ÖØ ÖÐÓ ÙÒ Tree Node<T>º È Ö ÐÐÓ¸ Ò Ö ÑÓ× ÙÒ ÓÒ × ÓÒÚ Ö× ÓÒ
    Ñ ÒØ ÐÓ× Ñ ÖÓ× Ó Ö Ó× ÔÓÖ Ð Ð × Dlink ´Ü ¾º º ´Ô Ò µµ
¾    Å ØÓ Ó× ÔÖ Ú Ó× Tree Node<T> ¾ ≡                     ´¾ ¿µ ¾
      LINKNAME_TO_TYPE(Tree_Node, child);
      LINKNAME_TO_TYPE(Tree_Node, sibling);
    Í× × LINKNAME TO TYPE ¿º
         ×Ù Ú Þ¸ ר Ô Ö Ñ ØÓ Ó× ÒÓ× Ô ÖÑ Ø          ¬Ò Ö Ð     ×Ó ÐÓ× ÒÓ Ó× Ð ÒØÓÖÒÓ
    ÙÒ Tree Node<T>
¾    Å ØÓ Ó× ÔÖ Ú Ó× Tree Node<T> ¾ +≡                            ´¾ ¿µ ¾
      Tree_Node   *   upper_link() { return child_to_Tree_Node(child.get_prev()); }
      Tree_Node   *   lower_link() { return child_to_Tree_Node(child.get_next()); }
      Tree_Node   *   left_link() { return sibling_to_Tree_Node(sibling.get_prev()); }
      Tree_Node   *   right_link() { return sibling_to_Tree_Node(sibling.get_next()); }
        ×     Ö¸ Ð Ô Ö Ý Ð Ó¸ ØÖ Ú × upper link() Ý lower link()¸ Ò ×Ó ÕÙ
    × ØÖ Ø     ÙÒ ÒÓ Ó ÕÙ × Ð Ñ × Ð ÞÕÙ Ö ¸ Ý ÐÓ× ÖÑ ÒÓ× ÞÕÙ Ö Ó Ý Ö Ó¸
    left link() Ý right link()¸ × × ØÖ Ø       Ù ÐÕÙ Ö ÓØÖÓ ÒÓ Ó Ö ÒØ Ð ÔÖ ÑÓ Ò ØÓº
        Ë Ò Ð × Ð ×Ø × ×ÓÒ Ö ÙÐ Ö ×¸ ÐÐ × ÒÓ Ø Ò Ò ÒÓ Ó       Ö º ÈÓÖ ×Ø Ö ÞÓÒ¸ ÑÓ×
     ר Ö ÑÙÝ Ô Ò ÒØ × Ù Ð × Ð ÜØÖ ÑÓ                Ð ×Ø º Ò ×Ø × ÒØ Ó¸ Ñ Ö Ö ÑÓ×
          ÒÓ Ó ÓÒ Ò Ö × ÕÙ ÒÓ× Ò Ö Ò Ð Ø ÔÓ ÒÓ Ó × ÙÒ ÕÙ ×Ø × ÜØÖ ÑÓ
     Ð ÙÒ Ð ×Ø º È Ö ÐÐÓ¸ ¬Ò ÑÓ× ÐÓ× × Ù ÒØ × Ø×
¾      ØÖ ÙØÓ× Tree Node<T> ¾ +≡                                 ´¾ ¿µ ¾
      struct Flags
      {
        unsigned int is_root             : 1;
4.5. Un TAD gen´rico para ´rboles
                   e          a                                                    285



       unsigned int is_leaf          : 1;
       unsigned int is_leftmost      : 1;
       unsigned int is_rightmost     : 1;
       Flags() : is_root(1), is_leaf(1), is_leftmost(1), is_rightmost(1) { }
     };
     Flags flags;
    Ä Ó × ÖÚ ÓÒ Ý ÑÓ ¬ ÓÒ ×Ø × Ò Ö × ¬Ò Ò ÐÓ× × Ù ÒØ × Ñ ØÓ Ó× ×Ó Ö ÙÒ
    ÒÓ Ó
¾    Å ØÓ Ó× ÔÙ Ð Ó× Tree Node<T> ¾ +≡    ´¾ ¿µ ¾    ¾
     bool   is_root() const { return flags.is_root; }
     bool   is_leaf() const { return flags.is_leaf; }
     bool   is_leftmost() const { return flags.is_leftmost; }
     bool   is_rightmost() const { return flags.is_rightmost; }
     void   set_is_root(const bool & value) { flags.is_root = value; }
     void   set_is_leaf(const bool & value) { flags.is_leaf = value; }
     void   set_is_leftmost(const bool & value) { flags.is_leftmost = value; }
     void   set_is_rightmost(const bool & value) { flags.is_rightmost = value; }


    4.5.1   Observadores de Tree Node<T>
      Ô ÖØ    Ð × Ò Ö × Ý Ð ØÓ Ò Ö Ó¸ × ÙÒ Tree Node<T> ÔÙ Ò Ó × ÖÚ Ö×
    ×Ù× ÒÓ Ó× Ý ÒØ × × Ö¸ ×Ù Ô Ö ¸ ×Ù Ó Ñ × Ð ÞÕÙ Ö Ý ×Ù× ÖÑ ÒÓ׺
      ÓÑ Ò ÑÓ× ÔÓÖ ÐÓ× ÖÑ ÒÓ׸ ÐÓ× Ù Ð × ×ÓÒ ÐÓ× Ó × ÖÚ ÓÖ × Ñ × × ÑÔÐ ×
¾    Å ØÓ Ó× ÔÙ Ð Ó× Tree Node<T> ¾ +≡                  ´¾ ¿µ ¾    ¾
     Tree_Node * get_left_sibling()
     {
       if (is_leftmost())
         return NULL;
       return left_link();
     }
     Tree_Node * get_right_sibling()
    get right sibling()× × Ñ ØÖ Ñ ÒØ × Ñ Ð Ö get left sibling()º
         × ÙÒ ÒÓ Ó × ÔÙ         Ö ×Ù× Ó× ÜØÖ ÑÓ× Ð Ñ × Ð ÞÕÙ Ö Ý Ð Ñ ×
     Ð Ö
¾   Å ØÓ Ó× ÔÙ Ð Ó× Tree Node<T> ¾ +≡              ´¾ ¿µ ¾   ¾
     Tree_Node * get_left_child()
     {
       if (is_leaf())
         return NULL;
       return lower_link();
     }
     Tree_Node * get_right_child()
     {
       if (is_leaf())
         return NULL;
       Tree_Node * left_child = lower_link();
       return left_child->left_link();
     }
286                                                        Cap´        ´
                                                                  ıtulo 4. Arboles



         Ñ Ó× Ñ ØÓ Ó× ÔÙ Ò Ö Ö Ö Ð Ñ ×ÑÓ ÒÓ Ó Ò ×Ó ÕÙ this Ø Ò ÙÒ ×ÓÐÓ Ó
    Ó ×Ø Ú Óº
        Ò ×Ó ÕÙ Ð Ö Ó Ð ÒÓ Ó × Ñ ÝÓÖ ÕÙ Ó׸ Ð Ö ×ØÓ ÐÓ× ÒÓ Ó× ÔÙ
          Ö× Ñ ÒØ get left sibling() Ý get right sibling()º
             ØÓ× Ð Ú Ö× Ø Ð ¸ ÔÙ    ÓÒÚ Ò ÖÒÓ× Ð ×Ó × ÙÒ Ð ÓÖ Ò Ð
¾    Å ØÓ Ó× ÔÙ Ð Ó× Tree Node<T> ¾ +≡             ´¾ ¿µ ¾  ¾
     Tree_Node * get_child(const int & i)
     {
       Tree_Node * c = get_left_child();
       for (int j = 1; c != NULL and j < i; ++j)
         c = c->get_right_sibling();
       return c;
     }
       Ð Ñ ØÓ Ó Ö ØÓÖÒ NULL × index × Ñ ÝÓÖ Ó Ù Ð ÕÙ Ð Ö Ó Ð ÒÓ Óº
        Ò ÐÑ ÒØ ¸ Ð ÙÐØ ÑÓ Ó × ÖÚ ÓÖ ÓÒ ÖÒ Ð ÒÓ Ó Ô Ö
¾   Å ØÓ Ó× ÔÙ Ð Ó× Tree Node<T> ¾ +≡               ´¾ ¿µ ¾ ¾
     Tree_Node * get_parent()
     {
       if (is_root())
         return NULL;
       Tree_Node * p = this;
       while (not ISLEFTMOST(p)) // retroceda hasta ser el nodo m´s a la izquierda
                                                                 a
         p = p->left_link();
       return p->upper_link();
     }
       ÄÓ× Ö ÓÐ × ÔÙ Ò ×Ó Ö× Ò ÙÒ Ö ÓÖ × Ò

    4.5.2   Modificadores de Tree Node<T>
      Ù Ò Ó × Ö ÙÒ ÒÙ ÚÓ ÒÓ Ó × ×ÙÑ Ö Þ ÙÒ Ö Óк À Ý Ó× Ø ÔÓ× Ò× Ö ÓÒ
     ÓÑÓ ÖÑ ÒÓ Ý ÓÑÓ Óº Ë ÙÒ Ð Ø ÔÓ Ò× Ö ÓÒ¸ Ð ÒÓ Ó ÔÙ         Ö × Ö Ö Þº
        À Ý Ó× ÓÖÑ × Ò× ÖØ Ö ÓÑÓ ÖÑ ÒÓ Ð ÞÕÙ Ö Ý Ð Ö º Ë Ð ÒÓ Ó
      ÖÑ ÒÓ × Ö Þ¸ ÒØÓÒ × Ð ÒÓ Ó Ò× ÖØ Ó × Ù × Ò Ó Ö Þº Ò ×Ø ×Ó¸ ØÖ Ø ÑÓ× ÓÒ
    ÙÒ Ö ÓÖ × Ò × ÕÙ Ð Ñ ÒØ ÐÓ× ÖÑ ÒÓ׺ Ò ×Ó ÓÒØÖ Ö Ó¸ Ð ÒÓ Ó Ò× ÖØ Ó
     ÓÑÔ ÖØ Ð Ñ ×ÑÓ Ô Ö º
        Ä Ò× Ö ÓÒ ÓÑÓ ÖÑ ÒÓ Ö Ó × ×Ô ¬            Ð × Ù ÒØ ÓÖÑ
¾    Å ØÓ Ó× ÔÙ Ð Ó× Tree Node<T> ¾ +≡              ´¾ ¿µ ¾ ¾
     void insert_right_sibling(Tree_Node * p)
     {
       if (p == NULL)
         return;
       if (not is_root())
         p->set_is_root(false);
       p->set_is_leftmost(false);
       Tree_Node * old_next_node = get_right_sibling();
       if (old_next_node != NULL)
         p->set_is_rightmost(false);
       this->set_is_rightmost(false);
       this->sibling.insert(SIBLING_LIST(p));
4.5. Un TAD gen´rico para ´rboles
                   e          a                                                 287



     }
        Ä Ò× Ö     ÓÒ ÓÑÓ ÖÑ ÒÓ ÞÕÙ Ö Ó × ÙÒ ÔÓ Ó Ñ × ÓÑÔÐ   ÔÓÖÕÙ p ÔÙ
      Ú ÒÖ Ð      Ó Ñ × Ð ÞÕÙ Ö Ò ÙÝÓ ×Ó¸ Ð ÒØ ÙÓ Ñ × ÞÕÙ Ö       × Ö×
    Ð Ð ×Ø        Ó× child Ý ×Ùר ØÙ Ö× ÔÓÖ pº
¾    Å ØÓ Ó× ÔÙ   Ð Ó× Tree Node<T> ¾ +≡           ´¾ ¿µ ¾ ¾
     void insert_left_sibling(Tree_Node * p)
     {
       if (p == NULL)
         return;
       if (not this->is_root())
         p->set_is_root(false);
       p->set_is_rightmost(false);
       Tree_Node * old_next_node = this->get_left_sibling();
       if (old_next_node != NULL)
         p->set_is_leftmost(false);
       else if (not this->child.is_empty()) // verifica si p devendr´ m´s a la izquierda
                                                                     a a
         {     // this es el m´s a la izquierda ==> p pasar´ a ser el primog´nito
                              a                             a                e
           Tree_Node * parent = this->get_parent();
           Tree_Node * left_child = this->get_left_child();
           CHILD_LIST(this)->del(); // sacar this de lista de hijos
           if (parent != NULL)               // ahora meter a p en la lista de hijos
             parent->insert(p);
           else
             left_child->append(p);
         }
       this->set_is_leftmost(false);
       this->sibling.append(SIBLING_LIST(p));
     }
         Ñ × ÔÖ Ñ Ø Ú ×¸ insert right sibling() insert left sibling()¸ Ò× ÖØ Ò ÔÓÖ
    Ð ÞÕÙ Ö Ý Ö          Ý Ö ÕÙ Ö Ò ÕÙ Ð ÒÓ Ó Ò× ÖØ Ö ×Ø Ú Óº
        Ð × ÙÒ Ó Ø ÔÓ Ò× Ö ÓÒ × Ö¸ ÓÑÓ Ó¸ ÔÙ Ö Ð Þ Ö× ÓÑÓ Ð Ó Ñ ×
    Ð ÞÕÙ Ö Ó Ð Ñ × Ð Ö º À ÕÙ Ð Ð ÞÕÙ Ö
¾    Å ØÓ Ó× ÔÙ Ð Ó× Tree Node<T> ¾ +≡                ´¾ ¿µ ¾   ¾
     void insert_leftmost_child(Tree_Node * p)
     {
       if (p == NULL)
         return;
       p->set_is_root(false);
       if (this->is_leaf())
         {
           this->set_is_leaf(false);
           CHILD_LIST(this)->insert(CHILD_LIST(p));
         }
       else
         {
           Tree_Node * old_left_child_node = this->lower_link();
           old_left_child_node->set_is_leftmost(false);
           p->set_is_rightmost(false);
           CHILD_LIST(old_left_child_node)->del();
           CHILD_LIST(this)->insert(CHILD_LIST(p));
288                                                             Cap´        ´
                                                                       ıtulo 4. Arboles



                SIBLING_LIST(old_left_child_node)->append(SIBLING_LIST(p));
            }
     }
    Ì Ñ Ò Ü ×Ø ×Ù ÕÙ Ú Ð ÒØ ÔÓÖ Ð Ö ¸ ÐÐ Ñ Ó insert rightmost child()º
          ÙÒÕÙ Ú ÒØÙ ÐÑ ÒØ × ÔÓ× Ð ÓÒרÖÙ Ö ÙÒ Ö ÓÖ × Ò Ñ ÒØ Ð ÙÒ × ×Ø ×
     Ð × × Ò× Ö ÓÒ¸ × ÔÖ Ö Ð ÓÒרÖÙ Ö Ö ÓÐ × Ý ÐÙ Ó Ò Ò ÖÐÓ× Ò ÙÒ Ö ÓÖ × Ò
    Ñ ÒØ Ð × Ù ÒØ Ñ ØÓ Ó
¾   Å ØÓ Ó× ÔÙ Ð Ó× Tree Node<T> ¾ +≡                ´¾ ¿µ ¾ ¾
     void insert_tree_to_right(Tree_Node * tree)
     {
       tree->set_is_leftmost(false);
       Tree_Node * old_next_tree = this->get_right_tree();
       if (old_next_tree != NULL)
           tree->set_is_rightmost(false);
       this->set_is_rightmost(false);
       SIBLING_LIST(this)->insert(SIBLING_LIST(tree));
     }
        Ð Ô Ö Ñ ØÖÓ tree  ÑÔ Ö Ø Ú Ñ ÒØ × Ö ÙÒ Ö ÓÐ ×                Ö¸   tree   Ø Ò ÕÙ × Ö
    ÙÒ Ö Þ ÐÓ ÓÒØÖ Ö Ó × ÓÒ× Ö ÙÒ ÖÖÓÖº

    4.5.3       Observadores de ´rboles
                                a
    Ö ÓÖ × Ò × ÓÒרÖÙ × Ñ ÒØ insert tree to right() ÔÙ                    ÓÒ×ÙÐØ Ö×   ØÖ Ú ×
     ÐÓ× × Ù ÒØ × Ñ ØÓ Ó×
¾   Å ØÓ Ó× ÔÙ Ð Ó× Tree Node<T> ¾ +≡          ´¾ ¿µ ¾                    ¾
     Tree_Node * get_left_tree()
     Tree_Node * get_right_tree()
        רÓ× Ñ ØÓ Ó× Ö ØÓÖÒ Ò Ð Ö ÓÐ × ØÙ Ó Ð ÞÕÙ Ö Ó Ö          this¸ Ö ×Ô Ø Ú ¹
    Ñ ÒØ º
        Ú ÒØÙ ÐÑ ÒØ ¸ ×ÓÐÓ × Ð ÔÖ Ñ Ö Ö ÓÐ Ð Ö ÓÖ × Ò Ó × ¸ × Ð Ñ × Ð
    ÞÕÙ Ö ¸ ÔÙ ÓÒ×ÙÐØ Ö× Ð Ö ÓÐ Ñ × Ð Ö          Ð Ö ÓÖ × Ò Ñ ÒØ × Ù ÒØ
¾   Å ØÓ Ó× ÔÙ Ð Ó× Tree Node<T> ¾ +≡                    ´¾ ¿µ ¾
     Tree_Node * get_last_tree()


    4.5.4       Recorridos sobre Tree Node<T>
     Ð ÔÖ Ñ Ö Ö Ó Ð Ì Ö Ò ÜÔÐ Ó × Ð × ÖÖÓÐÐÓ ÐÓ× Ö ÓÖÖ Ó׺ ÓÒ× Ö ¹
    ÑÓ׸ Ò ÔÖ Ñ Ö ÐÙ Ö¸ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó Ö ÙÖ× ÚÓ ÙÒ Ö ÓÐ
¾   Å ØÓ Ó× ÙØ Ð Ø Ö Ó×  Ö ÓÐ × ¾ ≡                       ´¾ ¿µ ¾
         template <class Node> static inline
     void __tree_preorder_traversal(Node * root, const int & level,
                                    const int & child_index,
                                    void (*visitFct)(Node *, int, int))
     {
       (*visitFct)(root, level, child_index);
       Node * child = root->get_left_child();
       for (int i = 0; child != NULL;
            i++, child = child->get_right_sibling())
4.5. Un TAD gen´rico para ´rboles
                   e          a                                                    289



            __tree_preorder_traversal(child, level + 1, i, visitFct);
     }
        Ä ÖÙØ Ò Ö ÓÖÖ Ö ÙÖ× Ú Ñ ÒØ ¸ Ò ÔÖ ¬ Ó¸ Ð Ö ÓÐ ÓÒ Ö Þ rootº Ò   Úר ¸×
    ÒÚÓ Ð ÙÒ ÓÒ ÔÙÒØ ÔÓÖ (*visitFct)¸ ÙÝÓ× Ô Ö Ñ ØÖÓ× ×ÓÒ Ð ÒÓ Ó Ú × Ø Ó¸ ×Ù
    Ò Ú Ð ÒØÖÓ Ð Ö ÓÐ Ý ×Ù ÓÖ Ò Ð ÓÑÓ Ó Ö ×Ô ØÓ ×Ù Ô Ö º
         tree preorder traversal() ÒÓ ×Ø    ר Ò   ÓÑÓ ÒØ Ö Þ ÔÙ Ð º Ò ×Ù ÐÙ Ö¸
      × Ò ÑÓ× Ó× ÔÖ Ñ Ø Ú × ÔÙ Ð × Ö ÓÖÖ Ó ÔÖ ¬ Ó ÕÙ ÐÐ Ñ Ò Ð Ú Ö× ÓÒ ×Ø Ø ¸
    ÙÒ Ô Ö ÙÒ Ö ÓÐ Ý ÓØÖ Ô Ö ÙÒ Ö ÓÖ × Ò
¾    Å ØÓ Ó× ÙØ Ð Ø Ö Ó×  Ö ÓÐ × ¾ +≡                 ´¾ ¿µ ¾    ¾
         template <class Node> inline
     void tree_preorder_traversal(Node * root, void (*visitFct)(Node *, int, int))
     {
       __tree_preorder_traversal(root, 0, 0, visitFct);
     }
         template <class Node> inline
     void forest_preorder_traversal(Node * root,
                                    void (*visitFct)(Node *, int, int))
     {
       for (/* nada */; root != NULL; root = root->get_right_tree())
         __tree_preorder_traversal(root, 0, 0, visitFct);
     }
         Ð Ö ÓÖÖ Ó ×Ù¬ Ó × ÑÙÝ × Ñ Ð Ö Ý ÓÑÔÖ Ò× Ð ÐÙ Ó       ×ØÙ   Ó Ð Ö ÓÖÖ Ó ÔÖ ¬ Óº
    4.5.5    Destrucci´n de Tree Node<T>
                      o
    ÈÖ      Ö Ð Ì Tree Node<T> Ñ Ò Ñ Ñ ÒØ ÓÔ Ö Ø ÚÓ ÒÓ× × × Ò Ð Ð            רÖÙ ÓÒ¸
    ÙÝ ×Ô ¬ ÓÒ × ÓÑÓ × Ù
¾   Å ØÓ Ó× ÙØ Ð Ø Ö Ó× Ö ÓÐ × ¾ +≡               ´¾ ¿µ ¾    ¾¼
         template <class Node> inline
     void destroy_tree(Node * root)
     {
       if (not IS_UNIQUE_SIBLING(root))
         SIBLING_LIST(root)->del(); // no ==> sacarlo de lista de hermanos
           // recorrer los sub´rboles de derecha a izquierda
                              a
       for (Node * p = root->get_right_child(); p != NULL; /* nada */)
         {
           Node * to_delete = p;           // respaldar sub´rbol a borrar p
                                                           a
           p = p->get_left_sibling();      // Avanzar p a hermano izquierdo
           destroy_tree(to_delete);        // eliminar recursivamente arbol
                                                                      ´
         }
       if (root->is_leftmost()) // to_delete == m´s izquierda ==> sacarlo lista hijos
                                                 a
         CHILD_LIST(root)->del();
       delete root;
     }
         template <class Node> inline
     void destroy_forest(Node * root)
     {
       while (root != NULL) // recorre los arboles de izquierda a derecha
                                           ´
         {
           Node * to_delete = root;          // respalda ra´z
                                                           ı
290                                                              Cap´        ´
                                                                         ıtulo 4. Arboles



                 root = root->get_right_sibling(); // avanza a siguiente arbol
                                                                         ´
                 SIBLING_LIST(to_delete)->del(); // elimine arbol de lista de arboles
                                                              ´                ´
                 destroy_tree(to_delete);          // Borre el arbol
                                                                ´
             }
      }


     4.5.6       B´squeda por n´mero de Deway
                  u            u
     ÈÐ ÒØ ÑÓ×ÒÓ× Ð Ù×ÕÙ              ÙÒ ÒÓ Ó Ò ÙÒ Ö ÓÐ       Ó ×Ù ÒÙÑ ÖÓ       ¹
     Û Ý ´Ü º¾º ´Ô Ò ¾ µµº Ò × × ÒØ Ó¸ ¬Ò ÑÓ× ÙÒ Ñ ÒÓ                Û Ý ÓÑÓ ÙÒ
     × ÙÒ           ÒØ ÖÓ× Ù Ö      Ò ÙÒ ÖÖ ÐÓ Ø ÔÓ int path[] Ý Ð Ñ Ø     ÓÒ ÙÒ
     Ú ÐÓÖ Ò Ø ÚÓ ÕÙ Ò         Ð ¬Ò Ð × Ù Ò º Ä ÔÖ Ñ Ø Ú ÙÒ Ñ ÒØ Ð Ù×ÕÙ
        Û Ý × Ð × Ù ÒØ
¾¼    Å ØÓ Ó× ÙØ Ð Ø Ö Ó×   Ö ÓÐ × ¾ +≡                ´¾ ¿µ ¾   ¾¼
          template <class Node> static inline
      Node * __deway_search(Node * node, int path [],
                            const int & idx, const size_t & size)
      {
        if (node == NULL)
          return NULL;
        if (path[idx] < 0) // verifique si se ha alcanzado el nodo
          return node;
            // avance hasta el pr´ximo hijo path[0]
                                 o
        Node * child = node->get_left_child();
        for (int i = 0; i < path[idx] and child != NULL; ++i)
          child = child->get_right_sibling();
        return __deway_search(child, path, idx + 1, size); // siga en pr´ximo nivel
                                                                        o
      }
        Ä ÖÙØ Ò Ö ØÓÖÒ NULL × Ð ÒÓ Ó ÓÒ Ð ÒÙÑ ÖÓ  Û Ý ×Ô ¬ Ó Ò path[] ÒÓ
     × Ò Ù ÒØÖ Ò Ð Ö ÓÐ Ð Ö ÓÒ Ø Ð ÒÓ Ó¸ Ò ×Ó ÓÒØÖ Ö Óº
        Ä ÔÖ Ñ Ø Ú ÒØ Ö ÓÖ × ÔÖ Ú ÔÓÖÕÙ ÙÒ Ú Ö× ÓÒ Ñ × ÓÑÔÐ Ø ¸ ÕÙ Ò ÐÙÝ
      Ù×ÕÙ     Ò ÙÒ Ö ÓÖ × Ò ¸ ÔÙ ÑÔÐ ÒØ Ö× Ø Ð ÓÑÓ × Ù
¾¼    Å ØÓ Ó× ÙØ Ð Ø Ö Ó× Ö ÓÐ × ¾ +≡            ´¾ ¿µ ¾ ¼ ¾ ½
          template <class Node> inline
      Node * deway_search(Node * root, int path [], const size_t & size)
      {
        for (int i = 0; root != NULL; i++, root = root->get_right_sibling())
          if (path[0] == i) return __deway_search(root, path, 1, size);
        return NULL;
      }


     4.5.7       C´lculo del n´mero de Deway
                  a           u
     Ò ÑÙ Ó× ÓÒØ ÜØÓ× ¸ ÙÒ ÔÖÓ Ð Ñ ÑÔÓÖØ ÒØ ÓÒ× ×Ø Ò Ù× Ö ÙÒ ÒÓ Ó Ò Ð Ö ÓÐ Ý
     ÒØÓÒ × Ø ÖÑ Ò Ö ×Ù ÒÙÑ ÖÓ     Û Ýº È Ö ÐÐÓ¸ ÔÐ ÒØ ÑÓ× ÙÒ Ö ÓÖÖ Ó ÔÖ ¬ Ó Ð
           Ò Ô ÖØ ÙÐ Ö Ô Ö ÔÖÓ Ö Ñ × ÕÙ Ö ÕÙ Ö Ò ÓÑÓ ÒØÖ   Ð ÒÙÑ ÖÓ   ÛÝ    ÙÒ ÒÓ Óº
4.5. Un TAD gen´rico para ´rboles
                    e          a                                                   291



      Ö ÓÐ ÓÒ ÙÒ ÖÖ ÐÓ ÕÙ ÓÒØ Ò       Ð ÒÙÑ ÖÓ      Û Ý ØÙ Ð Ð ÒÓ Ó Ú × Ø Ó × ÙÒ Ð
     × Ù ÒØ ÔÖÓØÓØ ÔÓ
¾½    Å ØÓ Ó× ÙØ Ð Ø Ö Ó× Ö ÓÐ × ¾   +≡                  ´¾ ¿µ   ¾¼ ¾½
          template <class Node, class Equal> inline static
      Node * __search_deway(Node * root, const typename Node::key_type & key,
                            const size_t & current_level, int deway [],
                            const size_t & size, size_t & n);
      search deway()      Ù× Ö ÙÖ× Ú Ñ ÒØ Ò Ð Ö ÓÐ ÙÝ Ö Þ × root Ð Ð Ú keyº
     ÐÐ Ñ Ö ÙÖ× Ú ¸ × Ò Ö Ñ ÒØ Ð Ò Ú Ð current level¸ Ð Ù Ð × Ù× Ô Ö ØÙ Ð Þ Ö Ð
     ÒÙÑ ÖÓ       Û Ý ÐÑ Ò Ó Ò Ð ÖÖ ÐÓ deway Ý ÙÝ Ô               × sizeº Ð Ô Ö Ñ ØÖÓ n
     Ø Ò × ÒØ Ó × × Ò Ù ÒØÖ Ð Ð Ú Ý ÐÑ Ò Ð ÐÓÒ ØÙ Ð ÒÙÑ ÖÓ                   Û Ýº
         Ä ÖÙØ Ò ÒØ Ö ÓÖ × Ò          ÔÓÖ Ð × Ù ÒØ ÒØ Ö Þ ÔÙ Ð
¾½    Å ØÓ Ó× ÙØ Ð Ø Ö Ó×    Ö ÓÐ × ¾ +≡                  ´¾ ¿µ ¾ ½ ¾ ½
          template <class Node, class Equal> inline
      Node * search_deway(Node * root, const typename Node::key_type & key,
                          int deway [], const size_t & size, size_t & n)
      {
        n = 1; // valor inicial de longitud de n´mero de Deway
                                                u
        for (int i = 0; root != NULL; i++, root = root->get_right_sibling())
          {
            deway[0] = i;
            Node * result = __search_deway <Node, Equal> (root, key, 0, deway, size, n);
            if (result != NULL)
              return result;
          }
        return NULL;
      }
       ÆÓ× Ö ×Ø ÔÓÖ ¬Ò Ö Ð ÖÙØ Ò ÕÙ Ö ÓÖÖ Ö Ò ÔÖ ¬ Ó Ð Ö ÓÐ Ð Ù×ÕÙ                   Ð
     ÐÚ
¾½   Å ØÓ Ó× ÙØ Ð Ø Ö Ó× Ö ÓÐ × ¾ +≡              ´¾ ¿µ ¾ ½ ¾ ¾
          template <class Node, class Equal> inline static
      Node * __search_deway(Node * root, const typename Node::key_type & key,
                            const size_t & current_level, int deway [],
                            const size_t & size, size_t & n)
      {
        if (root == NULL)
          return NULL;
        if (Equal () (KEY(root), key))
          {
            n = current_level + 1; // longitud del arreglo deway
            return root;
          }
        Node * child = root->get_left_child();
        for (int i = 0; child != NULL; i++, child = child->get_right_sibling())
          {
            deway[current_level + 1] = i;
            Node * result = __search_deway <Node, Equal>
              (child, key, current_level + 1, deway, size, n);
            if (result!= NULL)
              return result;
292                                                                 Cap´        ´
                                                                             ıtulo 4. Arboles



                 }
               return NULL;
          }


      4.5.8       Correspondencia entre Tree Node<T> y ´rboles binarios
                                                       a
        Ò ×Ø ×Ù ¹× ÓÒ ÑÔÐ ÒØ Ö ÑÓ× Ð ÓÖÖ ×ÔÓÒ Ò ÒØÖ Ö ÓÐ × m¹Ö Ó× Ý Ò Ö Ó×
       ÜÔÐ       Ñ ÒØ Ð Ð ÓÖ ØÑÓ º ÔÖ × ÒØ Ó Ò Ü º º½ ´Ô Ò ¾ µ½¼ º
            Ð ÔÖ Ñ Ö Ð ÓÖ ØÑÓ ÕÙ × ÖÖÓÐÐ Ö ÑÓ× × Ö Ð Ð ÓÒÚ Ö× ÓÒ ÙÒ Ö ÓÐ m¹Ö Ó¸
       ÑÔÐ ÒØ Ó Ñ ÒØ Ð Ì Tree Node<T>¸                  ÙÒ Ö ÓÐ Ò Ö Ó ÑÔÐ ÒØ Ó ØÖ Ú ×
         Ð Ì BinNode<Key>º Ù Ò Ó ÑÓ× ÑÔÐ ÒØ Ó ØÖ Ú × Ð Ì ººº ¸ ÒÓ×
      Ö Ö ÑÓ× ÕÙ Ð Ö ÓÐ m¹Ö Ó Ý Ò Ö Ó × ÙÒ Ñ ÒØ Ò Ò Ð × Ð × × Tree Node<T> Ý
      BinNode<Key>¸ Ö ×Ô Ø Ú Ñ ÒØ ¸ Ô ÖÓ no necesariamente son exactamente de estas
      dos clases¸ × ÒÓ ÕÙ ¸ ÔÙ Ö Ò × Ö¸ ÔÓÖ    ÑÔÐÓ¸ Ð × × Ö Ú ×º
           Ä ÓÒÚ Ö× ÓÒ ÙÒ Ö ÓÐ m¹Ö Ó           ÙÒÓ Ò Ö Ó × ÜÔÖ × Ö Ø Ñ ÒØ × ÙÒ Ð ×
      Ô ÙØ × Ð Ð ÓÖ ØÑÓ º × Ö¸ Ò Ð Ö ÓÐ Ò Ö Ó¸ ØÓ Ö Ñ ÞÕÙ Ö ÓÖÖ ×ÔÓÒ
      ÙÒ Ó Ñ × Ð ÞÕÙ Ö             Ð Ö ÓÐ m¹Ö Ó Ñ ÒØÖ × ÕÙ ØÓ Ö Ñ Ö         ÓÖÖ ×ÔÓÒ
       Ð × Ù ÒØ ÖÑ ÒÓº Ë ÙÒ ×ØÓ× Ð Ò Ñ ÒØÓ׸ Ð ÑÔÐ ÒØ ÓÒ Ö ×ÙÐØ ÒØ × ÓÑÓ × Ù
¾¾     Å ØÓ Ó× ÙØ Ð Ø Ö Ó×   Ö ÓÐ × ¾ +≡                    ´¾ ¿µ ¾ ½ ¾ ¾
              template <class TNode, class BNode>
          BNode * forest_to_bin(TNode * root)
          {
            if (root == NULL)
              return BNode::NullPtr;
            BNode * result = new BNode (root->get_key());
            LLINK(result) = forest_to_bin<TNode, BNode>(root->get_left_child());
            RLINK(result) = forest_to_bin<TNode, BNode>(root->get_right_sibling());
            return result;
          }
               Ä ÖÙØ Ò Ñ Ò Ó× Ø ÔÓ× Ò Ö Ó׺ Ð ÔÖ Ñ ÖÓ¸ TNode¸ × ÙÒ ÒÓ Ó m¹Ö Ó × Ó Ò Ð
      Ì Tree Node<T>º Ð × ÙÒ Ó Ø ÔÓ × BNode¸ Ð Ù Ð Ö ÔÖ × ÒØ Ð ÒÓ Ó Ò Ö Ó Ý
       ר Ö × Ó Ò BinNode<Key>º Ä Ú Ö ¬ ÓÒ              רÓ× Ø ÔÓ× × Ö Ð Þ ÑÔÐ Ø Ñ ÒØ
       Ò Ø ÑÔÓ Òר Ò ÓÒ Ð ÔÐ ÒØ ÐÐ Ù Ò Ó × ÓÑÔ Ð Ò Ð × ØÖ × Ô ÒÙÐØ Ñ × Ð Ò × Ý
      × Ú Ö ¬ Ð Ü ×Ø Ò          ÐÓ× Ñ ØÓ Ó× ÕÙ × ÒÚÓ Òº
          Ä ÓÒÚ Ö× ÓÒ ÙÒ Ö ÓÐ Ò Ö Ó            ÙÒÓ m¹Ö Ó × ÙÒ ÔÓ Ó Ñ × Ð ÓÖ Ó× Ö ÞÓÒ ÔÓÖ
      Ð Ù Ð ÒÓ× ÓÒÚ Ò × ÓÑÔÓÒ ÖÐ Ò ÖÙØ Ò × ×Ô ¬ × Ý × Ô Ö × ÕÙ               ØÙ Ò ÓÒ ×
       ÓÒ Ö Ø × Ý ÑÓ ÙÐ Ö Þ ×º Ò ×Ø × ÒØ Ó¸ Ý Ó× ÓÒ × Ô Ö ÙÒ Tree Node<T>
           ½º ÁÒ× Ö ÓÒ ÔÖ ÑÓ Ò ØÓ ÓÑÓ Ý ÐÓ × ÑÓ׸ Ò ÙÒ Ö ÓÐ Ò Ö Ó ÙÒ Ö Ñ
               ÞÕÙ Ö Ö ÔÖ × ÒØ ÙÒ ÔÖ ÑÓ Ò ØÓ Ò Ð Ö ÓÐ m¹Ö Ó ÕÙ Ú Ð ÒØ º Ù Ò Ó Ò ÙÒ
              ÒÓ Ó Ò Ö Ó Ñ Ö ÑÓ× ×Ù Ó ÞÕÙ Ö Ó ÐÓ Ò× ÖØ ÑÓ× Ò Ð Ö ÓÐ m¹Ö Ó ÓÑÓ ÔÖ ¹
              ÑÓ Ò ØÓº        ר ÑÓ Ó¸ ÔÐ ÒØ ÑÓ× Ð ×Ù ÖÙØ Ò × Ù ÒØ
     ¾¾        Å ØÓ Ó× ÙØ Ð Ø Ö Ó×   Ö ÓÐ × ¾ +≡             ´¾ ¿µ ¾ ¾ ¾ ¿
                      template <class TNode, class BNode> inline static
                  void insert_child(BNode * lnode, TNode * tree_node)
           Ò Ð × ÒÓ ÑÔÐ ÒØ ÓÒ Ð × ÙÒ ÓÒ × ÜÔÐ
          ½¼
                                                         × Ò ×Ø ×Ù ¹×     ÓÒ × Ñ Ò ×Ø Ö × Ò Ð Ö Ð
      Ô ÖØ Ô ÓÒ ÙÒ Ñ ÒØ Ð ÂÙ Ò Ù ÒØ ׺
4.5. Un TAD gen´rico para ´rboles
                      e          a                                                    293



               {
                   if (lnode == BNode::NullPtr)
                     return;
                   TNode * child = new TNode(KEY(lnode));
                   tree_node->insert_leftmost_child(child);
               }

          Ð Ô Ö Ñ ØÖÓ lnode × ÙÒ ÒÓ Ó Ò Ö Ó ÕÙ × Ó ÞÕÙ Ö Óº Ð Ô Ö Ñ ØÖÓ tree node ×
        ÙÒ ÒÓ Ó m¹Ö Ó ÕÙ Ú Ð ÒØ Ð ÒÓ Ó Ò Ö Ó Ô Ö lnodeº
     ¾º ÁÒ× Ö ÓÒ        ÖÑ ÒÓ Ò ÐÓ Ñ ÒØ ¸ Ù Ò Ó Ò Ð ÒÓ Ó Ò Ö Ó Ñ Ö ÑÓ× ×Ù Ó Ö Ó
        ÐÓ Ò× ÖØ ÑÓ× Ò Ð Ö ÓÐ m¹Ö Ó ÓÑÓ ×Ù ÖÑ ÒÓ Ö Óº ×ØÓ ÓÒ Ù           Ð × Ù ÒØ
        ×Ù ÖÙØ Ò
     ¾¿        Å ØÓ Ó× ÙØ Ð Ø Ö Ó×  Ö ÓÐ × ¾ +≡         ´¾ ¿µ ¾ ¾ ¾ ¿
                   template <class TNode, class BNode> inline static
               void insert_sibling(BNode * rnode, TNode * tree_node)
               {
                 if (rnode == BNode::NullPtr)
                   return;
                 TNode * sibling = new TNode(KEY(rnode));
                 tree_node->insert_right_sibling(sibling);
               }

        Ð Ô Ö Ñ ØÖÓ rnode × ÙÒ ÒÓ Ó Ò Ö Ó ÕÙ × Ó Ö Óº Ð Ô Ö Ñ ØÖÓ tree node ×
       ÙÒ ÒÓ Ó m¹Ö Ó ÕÙ Ú Ð ÒØ Ð ÒÓ Ó Ò Ö Ó Ô Ö rnodeº
             ÓÖ ×Ø ÑÓ× Ð ×ØÓ× Ô Ö ÑÔÐ ÒØ Ö Ð Ð ÓÖ ØÑÓ ÕÙ      Ð ÙÐ Ð Ö ÓÐ m¹Ö Ó ÕÙ Ú Ð ÒØ
         ÙÒÓ Ò Ö Ó
¾¿      Å ØÓ Ó× ÙØ Ð Ø Ö Ó×  Ö ÓÐ × ¾ +≡                      ´¾ ¿µ ¾ ¿ ¾ ¿
             template <class TNode, class BNode> inline static
         void bin_to_tree(BNode * broot, TNode * troot)
         {
           if (broot == BNode::NullPtr)
             return;
           insert_child(LLINK(broot), troot);
           TNode * left_child = troot->get_left_child();
           bin_to_tree(LLINK(broot), left_child);
           insert_sibling(RLINK(broot), troot);
           TNode * right_sibling = troot->get_right_sibling();
           bin_to_tree(RLINK(broot), right_sibling);
         }
             Ð Ô Ö Ñ ØÖÓ broot × Ð Ö Þ             ÙÒ Ö ÓÐ Ò Ö Ó ÙÒ Ñ ÒØ Ó Ò Ð
       Ì     BinNode<Key>º Ð Ô Ö Ñ ØÖÓ troot ×     Ð Ö Þ ÙÒ Ö ÓÐ m¹Ö Ó¸ ÙÒ Ñ ÒØ Ó Ò
        ÐÌ     Tree Node<T>¸ ÕÙ Ú Ð ÒØ  brootº
            Ò ÐÑ ÒØ ¸ Ð ÒØ Ö Þ ÔÙ Ð Ý ¬Ò Ø Ú ÕÙ Ö Ð Ö Þ Ò Ð Ý ×Ô Ö Ð ÓÒ¹
       רÖÙ ÓÒ Ö ÙÖ× Ú ¸ × ¬Ò Ð × Ù ÒØ ÓÖÑ
¾¿      Å ØÓ Ó× ÙØ Ð Ø Ö Ó× Ö ÓÐ × ¾ +≡                ´¾ ¿µ ¾ ¿
             template <class TNode, class BNode> inline
         TNode * bin_to_forest(BNode * broot)
         {
294                                                                     Cap´        ´
                                                                           ıtulo 4. Arboles



      if (broot == BNode::NullPtr)
        return NULL;
      TNode * troot = new TNode (KEY(broot));
      bin_to_tree(broot, troot);
      return troot;
 }


4.6      Algunos conceptos matem´ticos de los ´rboles
                                a             a
ÄÓ× Ö ÓÐ × × Ò Ù ÒØÖ Ò ÒØÖ Ð × ×ØÖÙ ØÙÖ × Ñ × ÒØ Ö × ÒØ × Ý ÓÑÔÐ ×              Ð
Ñ Ø Ñ Ø ÓÑ Ò ØÓÖ º Ê ÕÙ Ö ÑÓ׸ × Ò Ñ Ö Ó¸ ÙÒ ÓÖÔÙ× Ñ Ø Ñ Ø Ó¸ Ñ Ò ÑÓ¸
ÕÙ ÒÓ× Ô ÖÑ Ø ÓÖ Ö Ð Ò Ð × × Ð × Ö ÒØ × ×ØÖÙ ØÙÖ × Ö ÓÐ ÕÙ ÐÙ Ó ×ØÙ ¹
Ö ÑÓ׺
    ÆÓ× ÓÒ ÖÒ ÓÒÓ Ö ÕÙ Ø ÒØÓ ÙÒ Ö ÓÐ × Ô Ö           ÙÒ Ö Óи Ô٠׸ Ô Ö Ð ÙÒ ×
× ØÙ ÓÒ × ÓÑÔÙØ ÓÒ Ð ×¸ Ñ ÒØÖ × Ñ × ÙÒ Ö ÓÐ × ÙÒ Ö Óи ÒØÓÒ × Ñ × ¬ ÒØ
 × ×Ù ÙØ Ð Þ ÓÒº ÆÓØ ÑÓ× ÕÙ ÙÒ Ð ×Ø      Ð Ñ ÒØÓ× Ò      Ò Ð ÓÒ ÔØÓ         Ö ÓÐ
 ÑÔ ÖÓ¸ Ó Ú Ñ ÒØ × ÐÓ× Ö ÓÐ × ØÙÚ × Ò ØÓÔÓÐÓ × × Ñ Ð Ö × Ð × Ð ×Ø ׸ ÒØÓÒ × × Ö
ÔÖ Ö Ð ÙØ Ð Þ Ö Ð ×Ø ׺

4.6.1     Altura de un ´rbol
                       a
ÍÒ ÔÖ Ñ Ö Ò    ÓÖ Ö     ÕÙ Ø Ò Ù ÒÓ ÔÙ × Ö ÙÒ Ö ÓÐ × ÓÒÓ Ö Ð × ÐØÙÖ ×
ÔÓ× Ð × Ò ÙÒ ÓÒ Ð ÒÙÑ ÖÓ ÒÓ Ó׸ Ô Ö ÐÐÓ × ÙØ Ð ×ØÙ Ö Ð × Ù ÒØ ÔÖÓÔÓ× ÓÒº
Proposici´n 4.1
         o         Ë   T   ÙÒ Ö ÓÐ m¹Ö Ó ÓÒ n ÒÓ Ó׺ ÒØÓÒ ×
                             ÐÓ   m (n(m     − 1) + 1)   ≤ h(T ) ≤ n                  ´ º½ µ
Demostraci´n
          o

     ¯ h(T ) ≥ ÐÓ m (n(m − 1) + 1)
       Ä ÐØÙÖ ÙÒ Ö ÓÐ × Ñ Ò Ñ Ù Ò Ó Ð ÒÙÑ ÖÓ ÒÓ Ó× ÓÑÔÐ ØÓ× × Ñ Ü ÑÓº
       È Ö ÓÑÔÖ Ò Ö ×ØÓ¸ ÓÒ× Ö ÑÓ× ÓÒרÖÙ Ö ÔÖÓ Ö × Ú Ñ ÒØ ÙÒ Ö ÓÐ m¹Ö Ó Ú ¹
       Ø Ò Ó Ò ÐÓ ÔÓ× Ð ÙÑ ÒØ Ö ×Ù ÐØÙÖ º Ô ÖØ Ö Ð Ö ÓÐ Ú Ó¸ ×ÓÐÓ ÔÓ ÑÓ×
        ÓÐÓ Ö Ð ÒÓ Ó Ö Þº ÄÙ Ó¸ Ø Ò ÑÓ× m ×Ô Ó× ×ÔÓÒ Ð × Ò Ð Ò Ú Ð 1º ÈÓר ¹
       Ö ÓÖÑ ÒØ ¸      ÙÒÓ ÐÓ× m ÒÓ Ó× Ð Ò Ú Ð 1 Ø Ñ Ò Ø Ò m Ð × ×ÔÓÒ Ð ×
       ÕÙ ×Ø Ö Ò Ò Ð Ò Ú Ð 2 × Ö m × m Ð × ÕÙ ÔÙ Ò ÓÐÓ Ö× Ò Ð Ò Ú Ð 2º
         ÓÒØ ÒÙ Ò Ó ×Ø Ð Ò         Ö ÞÓÒ Ñ ÒØÓ¸ × Ð Ó × ÖÚ Ö ÕÙ  Ò Ú Ð i ÔÙ
        ÓÒØ Ò Ö ÐÓ ×ÙÑÓ mi ÒÓ Ó׺ ÈÓÖ Ø ÒØÓ¸ Ð ÒÙÑ ÖÓ ÒÓ Ó× ÙÒ Ö ÓÐ ÓÒרÖÙ Ó
           ר ÓÖÑ ÔÙ        ÜÔÖ × Ö× ÓÑÓ
                             h(T)−1
                       n≤                mi = m0 + m1 + m2 + · · · + mh(T)−1          ´ º½ µ
                                  i=0

       ÅÙÐØ ÔÐ Ò Ó ´ º½ µ ÔÓÖ m Ø Ò ÑÓ×
                                  h(T)−1
                       mn≤                 = m1 + m2 + · · · + mh(T)−1 + mh(T)        ´ º½ µ
                                   i=0
4.6. Algunos conceptos matem´ticos de los ´rboles
                            a             a                                      295



     Ê ×Ø Ò Ó ´ º½ µ Ñ ÒÓ× ´ º½ µ¸ Ø Ò ÑÓ×
                                        m n − n ≤ mh(T) − 1 =⇒
                                  n(m − 1) + 1 ≤ mh(T) =⇒
                         ÐÓ   m (n(m   − 1) + 1)   ≤ h(T )

   ¯ h(T ) ≤ n
       È Ö ×Ø ×Ó¸ × Ù ÑÓ× Ð Ð Ò           Ö ÞÓÒ Ñ ÒØÓ ÒÚ Ö× Ð ÔÙÒØÓ ÒØ Ö ÓÖ × Ö¸
        ÓÒרÖÙ ÑÓ× ÔÖÓ Ö × Ú Ñ ÒØ ÙÒ Ö ÓÐ m¹Ö Ó ØÖ Ø Ò Ó × ÑÔÖ      ÙÑ ÒØ Ö ×Ù ÐØÙÖ º
       Ì Ð Ö ÓÐ × ÕÙ Ð ÕÙ Ø Ò Ü Ø Ñ ÒØ n Ò Ú Ð × Ý ÙÒ ÒÓ Ó ÔÓÖ Ò Ú Ðº È٠׸ ר
        Ö ÓÐ Ø Ò ÐØÙÖ n
      ר ÔÖÓÔÓ× ÓÒ Ö Ú Ð ÓØ × Ô Ö Ð Ñ × ÓÖØÓ Ý Ð Ö Ó Ñ ÒÓ × Ð Ö Þ ×Ø ÙÒ
 Ó Ò ÙÒ ÓÒ Ð Ö Ò Ð                    Ð Ö Óк ËÙÔÓÒ Ò Ó n ÒÓ Ó׸ Ð Ö ÓÐ Ñ × ÓÖØÓ
ÔÓ× Ð Ø Ò ÐØÙÖ h(T ) = ÐÓ m (n(m − 1) + 1) ¸ Ñ ÒØÖ × ÕÙ Ð Ñ × ÐØÓ h(T ) = nº
    ÄÓ× Ö ÓÐ × ÓÒ ÐØÙÖ Ñ Ò Ñ ×ÓÒ              Ö Ò ÑÔÓÖØ Ò ÓÑÔÙØ ÓÒ Ð¸ ÔÙ × ÐÐÓ×
   Ö ÒØ Þ Ò Ð Ñ ÝÓÖ ¬ Ò         ÑÙ Ó× ÐÓ× Ð ÓÖ ØÑÓ× ×Ó Ö Ö ÓР׺ Ð              ØÙ и
 Ü ×Ø Ò ÔÓ Ó× ×ÕÙ Ñ × Ò ÐÓ× Ù Ð × × ÔÙ Ö ×ØÖ Ò Ö Ð ÐØÙÖ ¸ Ò Ñ Ý ¬ ÞÑ ÒØ ¸
Ô Ö ÕÙ ×Ø × Ñ Ò Ñ º × Ô٠׸ ÑÙ × Ú × × Ò × Ö Ó Ñ ÒØ Ò Ö Ö ÓÐ × ÙÝ
 ÐØÙÖ ÒÓ × Ñ Ò Ñ º Ä Ð                  ר ÙÐØ Ñ Ð ×       Ö ÓÐ × × Ñ Ò ÕÙ Ø ÒØÓ
 רÓ× Ö ÓÐ × × Ö Ò ÐÓ×            ÐØÙÖ Ñ Ò Ñ Ý ÒÓ Ö ÐÑ ÒØ ÔÓÖ Ð Ú ÐÓÖ ×Ù ÐØÙÖ º
Ê ÕÙ Ö ÑÓ׸ ÒØÓÒ ×¸ ÙÒ Ñ                 ÓÒ Ð ÕÙ ÒÓ× Ò ÕÙ ÕÙ Ø Ò Ù ÒÓ × Ð Ö Óк
  Ð Ñ Ö Ó ÓÒ ÔØÙ Ð ×Ø Ñ              × ÒÓÑ Ò ÐÓÒ ØÙ Ð Ñ ÒÓ ÒØ ÖÒÓ» ÜØ ÖÒÓ ¸
Ý × ÒÙÒ Ö Ò Ð ×Ù ¹× ÓÒ × Ù ÒØ º
4.6.2   Longitud del camino interno/externo
Definici´n 4.3 (Nodo externo) Ë T ÙÒ Ö ÓÐ m¹Ö Ó
       o                                                 ÓÒ n ÒÓ Ó× Ý × ni Ð ÙÒ ÒÓ Ó
Ò ÓÑÔÐ ØÓ T Ø Ð ÕÙ Ö Ó(ni) = m < mº ÒØÓÒ                 ׸ ÐÓ× ÒÓ Ó× ÜØ ÖÒÓ× ni ×
 ¬Ò Ò ÓÑÓ ÐÓ× Ö Ó(ni) − m ×Ù Ö ÓÐ × ÐØ ÒØ ׺
     Ò ÓØÖ × Ô Ð Ö ×¸ ÙÒ ÒÓ Ó ÜØ ÖÒÓ × ØÓ Ó ÔÙÒØ ÖÓ ÒÙÐÓº ÓÒ× Ù ÒØ Ñ ÒØ ¸ ÙÒ
ÒÓ Ó ÒØ ÖÒÓ × ØÓ Ó ÒÓ Ó Ô ÖØ Ò ÒØ Ð Ö Óк
      Ñ ÒÙ Ó × ÓÒÚ Ò ÒØ Ý Ñ × Ð Ò Ð Þ Ö ÙÒ Ö ÓÐ ÓÒ ÙÒ Ú Ö× ÓÒ ×Ô Ð Ò ÕÙ
× ÑÙ ×ØÖ Ò ØÓ Ó× ×Ù× ÒÓ Ó× ÜØ ÖÒÓ׺ ÌÖ ÓÒ ÐÑ ÒØ ¸ ÐÓ× ÒÓ Ó× ÒØ ÖÒÓ× × Ö ÔÖ × Ò¹
Ø Ò ÓÒ Ö ÙÐÓ× Ý ÐÓ× ÜØ ÖÒÓ× ÓÒ Ð Ò × ÓÖ ÞÓÒØ Р׺ Ä ¬ ÙÖ º¾¾ ÐÙ×ØÖ Ð Ú Ö× ÓÒ
 ÜØ Ò        ÙÒ Ö ÓÐ Ò Ö Óº




                              ÙÖ º¾¾       Ö ÓÐ Ò Ö Ó ÜØ Ò Ó

  ÈÓÖ ØÖ ÓÒ¸ Ò ÜÔÖ × ÓÒ × Ð            Ö     ׸ ÙÒ ÒÓ Ó ÒØ ÖÒÓ ×   ÒÓØ ÓÑÓ ni Ý ÙÒÓ
ÜØ ÖÒÓ ÓÑÓ nxº
296                                                                           Cap´        ´
                                                                                     ıtulo 4. Arboles



    Proposici´n 4.2
             o        Ë     T   ÙÒ Ö ÓÐ m¹Ö Ó ÓÒ n ÒÓ Ó× ÒØ ÖÒÓ׺ ÒØÓÒ ×¸ Ð ÒÙÑ ÖÓ
    ÒÓ Ó× ÜØ ÖÒÓ× ×
                                              (m − 1) n + 1             ´ º½ µ
    Demostraci´n
              o    × Ð ÖÓ ÕÙ Ü ×Ø Ò m × n ÔÙÒØ ÓÖ ×º ÐÓ× n ÒÓ Ó׸ n − 1 Ø Ò Ò
    Ô Ö ´Ð Ö Þ ÒÓµº Ü ×Ø Ò¸ ÒØÓÒ ×¸ n − 1 Ö Ñ × Ó ÔÙÒØ ÓÖ × Ö ÒØ × ÒÙÐÓ¸ ÔÓÖ
    ÐÓ ÕÙ Ð ÒÙÑ ÖÓ ÒÓ Ó× ÜØ ÖÒÓ× ×Ø Ö        Ó ÔÓÖ Ð ØÓØ Ð  ÔÙÒØ ÓÖ × Ñ ÒÓ× Ð
      ÒØ      ÔÙÒØ ÓÖ × ÒÓ ÒÙÐÓ׺ ×ØÓ ×
                                mn − (n − 1) = (m − 1)n + 1

      ÈÓÖ Ð ÔÖÓÔÓ× ÓÒ º¾¸ Ô Ö ÙÒ Ö ÓÐ Ò Ö Ó n ÒÓ Ó׸ Ü ×Ø Ò 2n ÔÙÒØ ÓÖ ×¸ n−1
    ÔÙÒØ ÓÖ × ÒÓ Ó× ÒØ ÖÒÓ× Ý n + 1 ÒÓ Ó× ÜØ ÖÒÓ׺
    Definici´n 4.4 (Cardinalidad del nivel) Ë
              o                                             T ÙÒ Ö ÓÐ m¹Ö Ó¸ ÒØÓÒ × Ð Ö Ò ¹
    Ð        Ð Ò Ú Ð i¸ ÒÓØ |nivel(i)|¸ × ¬Ò                ÓÑÓ Ð ÒÙÑ ÖÓ ÒÓ Ó× ÒØ ÖÒÓ× Ò Ð
    Ò Ú Ð iº
    Definici´n 4.5 (Longitud del camino interno/externo) Ë T ÙÒ Ö ÓÐ m¹Ö Ó
            o                                                                                    ÓÒ n
    ÒÓ Ó׺ Ä ÐÓÒ ØÙ Ð Ñ ÒÓ ÒØ ÖÒÓ Ð Ö ÓÐ T ¸ ÒÓØ       ÓÑÓ ÁÈÄ(T )¸ × ¬Ò                         ÓÑÓ
                      ÁÈÄ(T ) =                Ò Ú Ð(ni) =            i × | Ò Ú Ð (i)|          ´ º¾¼µ
                                     ∀ni ∈T                      ∀i
                                  ni ÒÓ Ó ÒØ ÖÒÓ

          Ò ÐÓ Ñ ÒØ ¸ Ð ÐÓÒ ØÙ        Ð Ñ ÒÓ ÜØ ÖÒÓ¸ ÒÓØ                    ÓÑÓ ÈÄ(T )¸ ×   ¬Ò ÓÑÓ
                                    ÈÄ(T ) =                    Ò Ú Ð(nx)                       ´ º¾½µ
                                                   ∀nx ∈T
                                               nx ÒÓ Ó ÜØ ÖÒÓ

       È Ö Ð Ö ÓÐ         Ð ¬ ÙÖ º¾¾¸ Ð ÐÓÒ ØÙ              Ð Ñ ÒÓ ÒØ ÖÒÓ ×
                      ÁÈÄ(T ) = 0 + 1 + 1 + 2 + 2 + 2 + 2 + 3 + 3 + 3 = 19
    Ý Ð ÐÓÒ ØÙ     Ð Ñ ÒÓ ÜØ ÖÒÓ ×
                      ÈÄ(T ) = 3 + 3 + 3 + 3 + 3 + 4 + 4 + 4 + 4 + 4 + 4 = 39
         Ð Ð ÙÐÓ Ð ÐÓÒ ØÙ Ð Ñ ÒÓ × ÙÒ Ñ ÒØ Ð Ô Ö Ð Ò Ð × × ÑÔ Ö Ó      ¹
    × ÑÔ ÒÓ Ð ÓÖ ØÑÓ× × Ó× Ò Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ ÙÒ Ð ×        Ö ÓÐ Ò Ö Ó
     ×Ô Ð ÕÙ ×ØÙ Ö ÑÓ× Ñ × Ð ÒØ º ×ØÓ Ùר ¬ × Ò Ö ÙÒ ÔÖ Ñ Ø Ú ÕÙ Ð ÙÐ
     Ð ÁÈÄ
¾      ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                 ¾   ¾
         template <class Node> inline static
     size_t __internal_path_length(Node * p, const size_t & level)
     {
       if (p == Node::NullPtr)
         return 0;
       return level + __internal_path_length(LLINK(p), level + 1) +
              __internal_path_length(RLINK(p), level + 1);
     }
4.6. Algunos conceptos matem´ticos de los ´rboles
                                a             a                                               297



       Ð Ô Ö Ñ ØÖÓ level Ò   Ð Ò Ú Ð ØÙ Ð Ð ÒÓ Ó Ú × Ø Ó Ý Ø Ñ Ò     Ò Ð Þ Ö×
    Ò ÖÓº Ä ÒØ Ö Þ ÔÙ Ð internal path length rec() ÙÒ ÔÙ ×         ÛÖ ÔÔ Ö ÕÙ
      ÙØ Ð ÐÐ Ñ Ò Ð
¾    ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                            ¾ ¿¿¾
         template <class Node> inline
     size_t internal_path_length(Node * p)
     {
       return __internal_path_length(p, 0);
     }

    Proposici´n 4.3
             o        Ë    T   ÙÒ Ö ÓÐ m¹Ö Ó¸ ÒØÓÒ ×
                                          m
                                |T | =         |T i| + 1                                    ´ º¾¾µ
                                         i=1
                                          m
                          ÁÈÄ(T )    =         ÁÈÄ(T i) + |T | − 1                          ´ º¾¿µ
                                         i=1
                                          m
                          ÈÄ(T )     =          ÈÄ(T i)    +    (m − 1)|T | + 1             ´ º¾ µ
                                         i=1
    Demostraci´n
              o      È Ö ´ º¾¾µ¸ × Ú ÒØ ÕÙ |T | × Ð ×ÙÑ Ð × Ö Ò Ð           × ×Ù×
    ×Ù Ö ÓÐ × Ñ × ×Ù Ö Þº
         Ò Ù ÒØÓ ´ º¾¿µ¸ ÒÓØ ÑÓ× ÕÙ Ð ÒÓ Ó Ö Þ T ÒÓ Ø Ò Ò Ò Ò Ð ÐÓÒ ØÙ
      Ð Ñ ÒÓ¸ ÔÙ × ×Ù Ò Ú Ð × 0º Ù Ò Ó Ð ÙÐ ÑÓ× Ð × ÐÓÒ ØÙ × ÐÓ× Ñ ÒÓ× ÐÓ×
    ×Ù Ö ÓÐ × T ¸ ×ÙÑ ÑÓ× ÕÙ ÐÓ× ÒÓ Ó× ×Ø Ò ÙÒ Ò Ú Ð Ò Ö ÓÖ × Ö¸               ÒÓ Ó
     × ×ÙÑ Ó Ò ÙÒ Ò Ú Ð Ñ ÒÓ׺ ÈÓÖ ÑÔÐÓ¸ Ð Ö Þ T           i¸ ÕÙ  Ò T ר Ò Ð Ò Ú Ð 1
    × ÔÓÒ Ö ÓÒ 0 Ò ÐÙ Ö 1 ÐÓ Ñ ×ÑÓ ×Ù                 ÓÒ Ð Ö ×ØÓ ÐÓ× ÒÓ Ó׺ × Ô٠׸
    Ô Ö Ó Ø Ò Ö Ð Ú ÐÓÖ ÁÈÄ(T )¸          ÑÓ× ×ÙÑ Ö 1       ÒÓ Ó ÓÒ× Ö Ó × Ö¸ Ð
      ÒØ        ÒÓ Ó× |T | − 1¸ ÔÙ × Ð Ö Þ ÒÓ Ù ÒØ º
          Ò ÐÑ ÒØ ¸ Ô Ö ´ º¾ µ¸ Ð Ö ÞÓÒ Ñ ÒØÓ × Ü Ø Ñ ÒØ Ð Ñ ×ÑÓ ÕÙ Ô Ö ´ º¾¿µ¸
    ×ÓÐÓ ÕÙ Ð ÒÙÑ ÖÓ ÒÓ Ó× ÜØ ÖÒÓ× ×¸ × ÙÒ ´ º½ µ ´ÔÖÓÔÓ× ÓÒ º¾µ¸ (m − 1)|T | + 1

         ר × ÒØ       × ×ÓÒ ÙÒ Ñ ÒØÓ×              ÑÙ ×        Ð × ÑÓ×ØÖ ÓÒ × ÒÚÓÐÙ Ö        × Ò
    ÐÓ× Ö ÓР׺
    Proposici´n 4.4
             o        Ë    T   ÙÒ Ö ÓÐ m¹Ö Óº ÒØÓÒ ×
                                    ÈÄ(T ) = (m − 1) ÁÈÄ(T ) + m |T |                       ´ º¾ µ
    Demostraci´n (por inducci´n sobre la cardinalidad de T )
               o             o                                                    ×ÙÑ Ö ÑÓ× ÕÙ k
    Ö ÔÖ × ÒØ Ð Ö Ò Ð      ÙÒ Ö ÓÐ Tkº
       ¯ |Tk| = 0    Ò ×Ø ×Ó¸ ÈÄ(T0) = (m − 1) ÁÈÄ(T0) + m |T0| = 0º Ä ÔÖÓÔÓ× ÓÒ ×
              ÖØ Ô Ö Ð ×Ó × º
       ¯   |Tk+1| = k + 1 Ò ×Ø ×Ó¸ ×ÙÑ ÑÓ× ÕÙ Ð ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö ØÓ Ó k Ý
           ÔÖÓ ÑÓ× Ú Ö ¬ Ö × × ÖØ Ô Ö k + 1º
298                                                                                Cap´        ´
                                                                                      ıtulo 4. Arboles



        ÓÑ ÒÞ ÑÓ× ÔÓÖ ÔÐ ÒØ Ö Ð Ö ×Ø Ð Ù ÓÒ ´ º¾ µ Ñ ÒÓ× ´ º¾¿µ Ò ÙÒ ÓÒ
      ÐÓ× Ö ×ÙÐØ Ó× Ð ÔÖÓÔÓ× ÓÒ º¿ ´ Ù ÓÒ × ´ º¾ µ Ý ´ º¾¿µµ
                                     m                                                 m
       ÈÄ(Tk+1 ) − ÁÈÄ(Tk+1 ) =            ÈÄ(Tk+1 ) + (m − 1)|Tk+1 | + 1 −
                                               i
                                                                                            ÁÈÄ(Tk+1 ) + |Tk+1 | − 1
                                                                                                 i

                                     i=1                                              i=1
                                      m                                               m
                                 =         ÈÄ(Tk+1 ) + (m − 1)(k + 1) + 1 −
                                               i
                                                                                           ÁÈÄ(Tk+1 ) − (k + 1) + 1
                                                                                                i

                                     i=1                                             i=1
                                      m                                        m
                                 =         ÈÄ(Tk+1 ) + mk + m − 2k −
                                               i
                                                                                    ÁÈÄ(Tk+1 )
                                                                                         i
                                                                                                                   ´ º¾ µ
                                     i=1                                      i=1


         ÓÖ ÔÐ ÑÓ× Ð          ÔÓØ × × Ò Ù Ø Ú ×Ó Ö Ð Ø ÖÑ ÒÓ                   m
                                                                               i=1    ÈÄ(Tk+1)
                                                                                          i

                                     m                                                                  m
       ÈÄ(Tk+1 ) − ÁÈÄ(Tk+1 ) =            (m − 1) ÁÈÄ(Tk+1 ) + m|Tk+1 | + mk + m − 2k −
                                                        i          i
                                                                                                              ÁÈÄ(Tk+1 )
                                                                                                                   i

                                     i=1                                                                i=1
                                               m                      m                                  m
                                 =   (m − 1)         ÁÈÄ(Tk+1 ) + m
                                                          i
                                                                            |Tk+1 | + mk + m − 2k −
                                                                              i
                                                                                                              ÁÈÄ(Tk+1 )
                                                                                                                   i

                                               i=1                    i=1                               i=1
                                                m
                                 =   (m − 2)         ÁÈÄ(Tk+1 ) + 2mk + m − 2k
                                                          i
                                                                                                                    ´ º¾ µ
                                               i=1


      ÆÓØ ÑÓ× ÕÙ ¸ ÔÓÖ ´ º¾¾µ¸ m |Tk+1| = (k+1)−1 = kº Ä ×ÙÑ ØÓÖ m ÁÈÄ(Tk+1)
                                    i                                      i

      ÔÙ Ö ÑÔÐ Þ Ö× ÔÓÖ ÁÈÄ(Tk+1) − k¸ ÕÙ × Ð Ö ×ÙÐØ Ó         ×Ô Ö Ð ×ÙÑ ØÓÖ
                                i=1                                i=1

        ´ º¾¿µ Ú ÐÙ      Ò Tk+1
          ÈÄ(Tk+1 ) − ÁÈÄ(Tk+1 ) = (m − 2)(ÁÈÄ(Tk+1 ) − k) + 2mk + m − 2k
                                 = (m − 2) ÁÈÄ(Tk+1 ) − mk + 2k + 2mk + m − 2k                        =⇒
                       ÈÄ(Tk+1 ) = (m − 1) ÁÈÄ(Tk+1 ) + m(k + 1)                                        ´ º¾ µ
     ÕÙ × Ð Ñ ×Ñ ÜÔÖ × ÓÒ Ð ÔÖÓÔÓ× ÓÒ Ú ÐÙ Ô Ö k + 1 ÒÓ Ó×
   ר ÔÖÓÔÓ× ÓÒ ÒÓ× ÝÙ Ö      ×ØÙ Ö ÐÓ× Ð Ñ Ø × Ö Ð ÓÒ Ó× ÓÒ Ð ÐÓÒ ØÙ                                          Ð
 Ñ ÒÓ¸ ÐÓ× Ù Ð × × ×Ø Ð Ò Ò Ð × Ù ÒØ ÔÖÓÔÓ× ÓÒº
Proposici´n 4.5
         o         Ë    T   ÙÒ Ö ÓÐ m¹Ö Ó          n    ÒÓ Ó׺ ÒØÓÒ ×
            ÐÓ   m (n(m   − 1)) m ÐÓ m (n(m−1)+1) + mn
                                                       ≤ ÁÈÄ(T ) ≤
                                                                   n(n − 1)
                                                                  ´ º¾ µ
                                m−1                                   2
Demostraci´n È Ö
           o               ÑÓ×ØÖ Ö ÁÈÄ(T ) ≤ 2 ¸ ÔÐ ÒØ ÑÓ× Ð ÐÓÒ ØÙ Ð
                                             n(n+1)
                                                                Ñ ÒÓ Ð
 Ö ÓÐ Ñ ÝÓÖ ÐØÙÖ ÔÓ× Ð º Ì Ð Ö ÓÐ × ÕÙ Ð ÙÝÓ× ÒÓ Ó׸ ÓÒ Ü Ô ÓÒ Ð Ö Þ Ý
Ð Ó ¸ ×ÓÐÓ Ø Ò Ò ÙÒ Ö Ñ º Ä ÐÓÒ ØÙ Ð Ñ ÒÓ ×Ø Ö ÓÐ ×Ø          ÔÓÖ
                                             n
                                                        n(n − 1)
                                 ÁÈÄ(T ) =         i=
                                                           2
                                             i=0

   È Ö ÑÓ×ØÖ Ö Ð ÓØ Ò Ö ÓÖ ÔÐ ÒØ ÑÓ× Ð ÐÓÒ ØÙ Ð Ñ ÒÓ ÜØ ÖÒÓ Ð Ö ÓÐ
ÐØÙÖ Ñ Ò Ñ h Ò ÙÒ ÓÒ Ð ÔÖÓÔÓ× ÓÒ º ´Ô º ¾ µ
                        ÈÄ(T )    ≤ hmh = (m − 1) ÁÈÄ(T ) + mn =⇒
                                    hmh + mn
                       ÁÈÄ(T )    ≥
                                      m−1
                                                                                                       ´ º¿¼µ
4.6. Algunos conceptos matem´ticos de los ´rboles
                            a             a                                                                                    299



   ÈÓÖ Ð ÔÖÓÔÓ× ÓÒ º½ ´Ô º ¾ µ¸ ÓÒÓ ÑÓ× Ð Ú ÐÓÖ Ñ Ò ÑÓ hº ËÙר ØÙ ÑÓ׸ Ô٠׸
Ð Ô ÖØ ÞÕÙ Ö        ´ º½ µ Ò ´ º¿¼µ
             ÁÈÄ(T ) ≥ ÐÓ m (n(m − 1)) m
                                         ÐÓ (n(m−1)+1) + mn                     m

                                                                       m−1
    ÎÖ × Ð××       Ö ÓÐ × ÒÓ ÓØ Ò Ð ÐØÙÖ ¸ Ô ÖÓ ×ÓÒ¸ Ò ÓÖÑ ¸ Ù ÒÓ׺ Ð ÁÈÄ ×
ÙÒ Ñ ØÖ ÕÙ Ô ÖÑ Ø ÓÑÔ Ö Ö Ö ÓÐ × ÒØÖ × Ý Ø ÖÑ Ò Ö ÕÙ Ø Ò Ù ÒÓ × ÙÒÓ
Ö ×Ô ØÓ Ð ÓØÖÓº
       ÑÓ× ÕÙ ÙÒ ÒÓ Ó ×Ø ÐÐ ÒÓ Ù Ò Ó ×Ø ÓÒØ Ò ØÓ Ó× ×Ù× Ó׺ ÈÓÖ Ð ÓÒØÖ Ö Ó¸
    ÑÓ× ÕÙ ÙÒ ÒÓ Ó ×Ø Ò ÓÑÔÐ ØÓ Ù Ò Ó Ð ÐØ Ð Ñ ÒÓ× ÙÒ Óº
4.6.3     ´
          Arboles completos
  ÓÒ× Ö ÑÓ× Ð Ñ Ò Ö           ÓÒרÖÙ Ö ÙÒ Ö ÓÐ m¹Ö Ó n ÒÓ Ó× ÙÝ ÐÓÒ ØÙ Ð Ñ ÒÓ
× Ñ Ò Ñ º È Ö ÓÒרÖÙ Ö Ø Ð Ö Óи             ÑÓ× ÓÐÓ Ö Ð Ñ ÝÓÖ ÒØ       ÒÓ Ó× Ò ÐÓ×
Ò Ú Ð × Ò Ö ÓÖ × ÒÓ         ÑÓ× ÓÐÓ Ö ÒÓ Ó× Ò ÙÒ Ò Ú Ð ×ÙÔ Ö ÓÖ ×Ø ÕÙ ÒÓ × Ý Ò
 ÓÑÔÐ Ø Ó ØÓ Ó× ÐÓ× Ò Ú Ð × ÔÖ        ×ÓÖ ×º
    Ë Ù Ò Ó ×Ø Ð Ò           Ö ÞÓÒ Ñ ÒØÓ¸ ÔÓ ÑÓ× Ú Ö ÕÙ ×ÓÐÓ ÙÒ ÒÓ Ó¸ Ð Ö Þ¸ ÔÙ
 ר Ö ×Ø Ò 0 Ð Ö Þº ÐÓ ×ÙÑÓ m ÒÓ Ó× ÔÙ Ò ×Ø Ö ×Ø Ò 1 Ð Ö Þº
   ÐÓ ×ÙÑÓ m × m = m2 ÒÓ Ó× ÔÙ Ò ×Ø Ö ×Ø Ò 2º Ò Ò Ö Ð¸ ÐÓ ×ÙÑÓ m ×
m × m · · · × . . . m = mi ÒÓ Ó× ÔÙ Ò ×Ø Ö Ò Ð i¹ × ÑÓ Ò Ú Ðº × Ô٠׸ Ð ÐÓÒ ØÙ    Ð
  Ñ ÒÓ ÒØ ÖÒÓ ×Ø Ö ÓÐ × Ö Ð ×ÙÑ ÐÓ× ÔÖ Ñ ÖÓ× n Ø ÖÑ ÒÓ× Ð × × Ö ×
        0, 1, 1, . . . 1, 2, 2, . . . 2, 3, 3, . . . , 3, 4, 4, . . . , 4, . . . ,    mh−1, mh−1, · · · , mh−1            .
                m          m2    Ú    ×     m3   Ú    ×      m4   Ú    ×             ÒØ          ÒÓ Ó× Ò Ð ÙÐØ ÑÓ Ò Ú Ð

   Ë    ÙÒ Ö ÓÐ n ÒÓ Ó׸ ÐØÙÖ h¸ ÙÝÓ× ÒÓ Ó× ×Ø Ò Ð × Ñ Ò Ñ × ×Ø Ò ×
         T
Ð Ö Þº ÈÓ ÑÓ׸ ÒØÓÒ ×¸ ÒÓØ Ö ÙÒ ÜÔÖ × ÓÒ    × Ô Ö Ð ÐÓÒ ØÙ Ð Ñ ÒÓ
              h−2
 ÁÈÄ(T ) =           i mi + (h − 1)n                  ´n × Ð               ÒØ             ÒÓ Ó× Ò Ð ÙÐØ ÑÓ Ò Ú Ðµ ´ º¿½µ
               i=0

    È Ö ÓÒØ Ö Ð ÒÙÑ ÖÓ ÒÓ Ó× Ò Ð ÙÐØ ÑÓ Ò Ú Ð Ö ÞÓÒ ÑÓ× ÓÑÓ × Ù º h−1 mi
                                                                     i=0
× Ö Ð ØÓØ Ð ÒÓ Ó× × Ð ÙÐØ ÑÓ Ò Ú Ð ×ØÙÚ × ÓÑÔÐ Ø Ñ ÒØ ÐÐ ÒÓº ÓÖ Ò¸ × Ð
ÙÐØ ÑÓ Ò Ú Ð ÒÓ ×ØÙÚ × ÓÑÔÐ ØÓ¸ ÒØÓÒ × ÐØ Ö Ò h−1 mi − n ÒÓ Ó× Ô Ö ÓÑÔÐ Ø Ö
                                                  i=0
 Ð Ò Ú Ðº    Ñ ×¸ × Ð ÙÐØ ÑÓ Ò Ú Ð ×ØÙÚ × ÓÑÔÐ ØÓ¸ ÒØÓÒ × Ö Ò mh−1 ÒÓ Ó× Ò
 Ð ÙÐØ ÑÓ Ò Ú Ðº Ë n Ð ÒÙÑ ÖÓ ÒÓ Ó× Ò Ð ÙÐØ ÑÓ Ò Ú Ð¸ ÒØÓÒ ×
                                                 h−1                                       h−1
                        n = mh−1 −                        mi − n            = mh−1 −             mi + n                       ´ º¿¾µ
                                                  i=0                                      i=0

× Ö¸ Ð Ñ Ü ÑÓ ÒÙÑ ÖÓ ÒÓ Ó× Ò Ð ÙÐØ ÑÓ Ò Ú Ð Ñ ÒÓ× ÐÓ× ÒÓ Ó× ÕÙ                                                       ÐØ Ò Ô Ö
ÓÑÔÐ Ø Ö Ð Ò Ú Ðº
   Ð Ö ×ÓÐÚ Ö Ð × ×ÙÑ ØÓÖ × ÒÚÓÐÙ Ö ×¸ Ø Ò ÑÓ×
    ÁÈÄ(T ) = (h − 1)m
                                     h−1 −(h − 2)mh − m                  mh − 1
                                      (m − 1)2
                                                        + (h − 1) mh−1 −
                                                                         m−1
                                                                                +n                                            ´ º¿¿µ

   Ä ×ÓÐÙ ÓÒ ¬Ò Ð                    ´ º¿¿µ ×         Ð        ÓÑÓ          Ö Óº
300                                                                Cap´        ´
                                                                      ıtulo 4. Arboles



    ÇØÖ ÓÖÑ      Ö ×ÓÐÚ Ö ´ º¿½µ Ý ´ º¿¿µ¸ × ÔÐ ÒØ Ò Ó ÙÒ ×ÙÑ ØÓÖ            ר ÒØ ÕÙ Ò¹
ÚÓÐÙ Ö ÐÓ Ö ØÑÓ×                          n
                               ÁÈÄ(T ) =     ÐÓ m i ;                              ´ º¿ µ
                                       i=1

  ÙÝ ×ÓÐÙ ÓÒ Ø Ñ Ò × Ð Ò Ö Ó Ý ÕÙ ÔÙ Ö ×ÓÐÚ Ö× ÔÓÖ × ÓÑÔÓ× ÓÒ
Ð ×ÙÑ ØÓÖ Ò Ó× Ô ÖØ ׺
     ÄÓ× Ö ÓÐ × ÓÑÔÐ ØÓ׸ ÕÙ ×ÓÒ ÐÓÒ ØÙ       Ñ ÒÓ Ñ Ò Ñ ¸ ×ÓÒ ÑÙÝ ÑÔÓÖØ ÒØ ׸
ÔÙ × Ö ÔÖ × ÒØ Ò Ð Ñ ÝÓÖ ¬ Ò ÔÓ× Ð ×Ó Ö ÑÙ Ó× Ð ÓÖ ØÑÓ׺
     ÍÒ ÔÖÓÔ       ÑÙÝ ÒØ Ö × ÒØ ÐÓ× Ö ÓÐ × ÓÑÔÐ ØÓ× ×Ø      ÔÓÖ Ð   Ó ÕÙ
  ÐÐÓ× ÔÙ Ò Ö ÔÖ × ÒØ Ö× × Ù Ò ÐÑ ÒØ Ò Ñ ÑÓÖ Ñ ÒØ ÙÒ ÖÖ ÐÓº Ä ¬ ÙÖ º¾¿
 ÐÙ×ØÖ ÙÒ Ö ÓÐ ØÖ Ò Ö Ó ÓÑÔÐ ØÓ ÓÒ     ÒÓ Ó ×Ø Ø ÕÙ Ø Ó ÓÒ ×Ù Ö ×Ô Ø ÚÓ Ò
    ÒØÖÓ ÙÒ ÖÖ ÐÓ × Ù Ò Ðº Ä ×ÔÓ× ÓÒ ÐÓ× Ò × ÓÖÖ ×ÔÓÒ ÙÒ Ö ÓÖÖ Ó
ÔÓÖ Ò Ú Ð ×º
                                                1


               2                                        3                            4


   5           6            7          8                9            10          11 12 13


14 15 16   17 18 19   20 21 22     23 24 25     26 27 28          29 30 31    32 33 34


   ÙÖ º¾¿ Ö ÓÐ ØÖ Ò Ö Ó ÓÑÔÐ ØÓ ÒÓ Ó× ÒÙÑ Ö Ó× × ÙÒ ÔÓ× ÓÒ Ò ÖÖ ÐÓ × Ù Ò¹
  Ð

    È Ö ×Ø Ò Ù Ö ×Ø Ö ÔÖ × ÒØ ÓÒ Ð           ÜÔÐ     Ò Ü º¿º¾ ´Ô Ò ¾ ½µ¸ Ð ÒÓ¹
Ø Ö ÑÓ× ÓÑÓ Ö ÔÖ × ÒØ ÓÒ Ñ ÒØ ÖÖ            ÐÓ × Ù Ò Ð º
    Ë i Ð Ò           ÙÒ ÒÓ Ó ni ÒØÖÓ        ÙÒ Ö ÓÐ n ÒÓ Ó× Ö ÔÖ × ÒØ Ó ÓÒ ÙÒ
 ÖÖ ÐÓº Ë T (i, j) Ð j¹ × ÑÓ ×Ù Ö ÓÐ Ð     Ö Þ ÙÒ ×Ù Ö ÓÐ ÓÒ Ò i ´ÐÓ× Ò ×
 ÓÑ ÒÞ Ò Ò 1µº ÒØÓÒ ×
                                       m+i−2                i−1
                      Ô Ö   (ni) =
                                         m
                                                    =
                                                             m
                                                                                   ´ º¿ µ
                          T (i, j) = m(i − 1) + 1 + j                              ´ º¿ µ
    ר × ÓÖÑÙÐ × ÙÒ ÓÒ Ò Ô Ö Ù ÐÕÙ Ö ÓÖ Ò Ö Óк ÈÓÖ ×Ù× Ú ÒØ ׸ Ð ÒÑ Ò×
Ñ ÝÓÖ      ÙØÓÖ × Ý Ó ¬ ÓÖ × ÔÖ ¬ Ö Ò ×Ø Ö ÔÖ × ÒØ ÓÒ Ô Ö Ð ÓÖ ØÑÓ× ÕÙ Ñ Ò ¹
 Ò Ö ÓÐ × ÓÑÔÐ ØÓ׸ ÒÓØ Ð Ñ ÒØ ÐÓ× Ô× Ò Ö Ó׸ ÙÒ ×ØÖÙ ØÙÖ ÑÙÝ Ú Ö× Ø Ð ÕÙ
Ô ÖÑ Ø ¸ ÒØÖ ÓØÖ × Ó× ×¸ ÓÖ Ò Ö ¬ ÒØ Ñ ÒØ ÑÔÐ ÒØ Ö ÓÐ × ÔÖ ÓÖ º
4.7. Heaps                                                                                                                 301



4.7         Heaps
  ÓÑ Ò ÑÓ× ×Ø × ÓÒ ×                          ÐÓ      ×ØÖ ØÓ ÒØÖÓ Ù Ò Ó Ð                       ¬Ò ÓÒ               Ð ×ØÖÙ ¹
ØÙÖ     ØÓ× ×Ø × ÓÒ
Definici´n 4.6 (Heap)
       o                    ÍÒ     Ô ½½ T × ÙÒ Ö ÓÐ ÓÒ Ð × Ó× × Ù ÒØ × ÔÖÓÔ ×
  ½º   Forma       Ð Ö ÓÐ × ÓÑÔÐ ØÓ¸ ÐÓ ÕÙ ÑÔÐ ÕÙ ¸ Ô ØÓÖ Ñ ÒØ ¸ Ü Ð × Ù ÒØ
       ÓÖÑ



  ¾º   Orden ∀ni ∈ T =⇒ à (                        Ó1(ni)) < à           (ni) ∧    à      (     Ó2(ni)) < à              (ni) ∧
       · · · ∧ Ã ( Óm(ni)) < Ã                      (ni)

    Ë ÙÒ Ð Ö Ó Ð Ö Óи ÙÒ Ô ÔÙ × Ö Ò Ö Ó¸ ØÖ Ò Ö Ó Ó          Ù ÐÕÙ Ö ÓØÖÓ
ÓÖ Òº À         Ù ÒØ   Ð ÕÙ Ú Ð Ò ÒØÖ ÐÓ× Ö ÓÐ × Ò Ö Ó× Ý Ð × Ö ÓÖ × Ò ×
´Ú Ö Ü º º½ ´Ô Ò ¾ µµ¸ Ò ×Ø Ø ÜØÓ ×ÓÐÓ ÓÒ× Ö Ö ÑÓ× ÐÓ× Ô× Ò Ö Ó׺ ÈÓÖ Ø ÒØÓ¸
× × ØÖ Ø      ÙÒ Ö ÓÐ Ò Ö Ó¸ ÒØÓÒ × Ð ÔÖÓÔ       ÓÖ Ò ÔÙ    ÜÔÖ × Ö× ÓÑÓ
∀ni ∈ T =⇒ Ã (Ä(n1)) < Ã (ni) ∧ Ã (Ê(n1)) < Ã (ni)º

                                                                               2

                                   14                                                                               38

              68                                         31                                         69                      145

      104               98                    56                    48                   87                    80        228      156

134     149        99        188        243        166        112        185       217        200        207


                                              ÙÖ º¾ ÍÒ                   Ô Ò ÖÓ

   Ä ÓÒ       ÙÒ Ô × Ö ×ÙÑ Ò Ó× Ö Ø Ö ×Ø ×
  ½º Ð Ñ ÒÓÖ Ð Ñ ÒØÓ ÙÒ ÓÒ ÙÒØÓ     Ð Ú × × Ò Ù ÒØÖ ¸ Ö Ø Ñ ÒØ ¸ ÔÓÖ ÓÒ¹
    × ÙÒ       Ð ÔÖÓÔ        ÓÖÑ ¸ Ò Ð Ö Þ Ð Ö ÓÐ      Ó ÓØÖÓ ÑÓ Ó¸ Ð
     ÓÒ×ÙÐØ Ð Ñ ÒÓÖ Ð Ñ ÒØÓ × O(1)º
 ½½
     Ò Ö × Ð ÓÑÔÖ × ÓÒ¸ ÔÖ × ÖÚ Ö ÑÓ× Ð Ø ÖÑ ÒÓ Ò ×Ù ÚÓÞ Ò ÐÓ× ÓÒ ¸ × Ò ØÖ Ù ÓÒº
Ñ Ò ÓÒ Ö¸ Ñ ×¸ ÕÙ Ð Ø ÖÑ ÒÓ          Ô ÔÐ ÒØ Ð ÙÒ × Ñ Ù         ׺ Ð Ö ×Ô ØÓ¸ × Ñ Ò ×Ø Ö  Ö
 Ó× Ð Ö ØÓÖ ×
   ½º Ò Ò Ð ×¸ Ð Ø ÖÑ ÒÓ       Ô Ø Ò Ú Ö × Ô ÓÒ ×¸ Ô ÖÓ¸ Ò ÒÙ ×ØÖÓ ×Ó¸ ÓÒÒÓØ ÙÒ ÑÓÒØÓÒ ¸
        ÙÐØÓ Ó Ô Ð       Ó× ×º ÈÓÖ ÑÔÐÓ¸       Ô Ó    ÖØÝ ÐÓØ × ¸ Ö ¬ Ö  ÙÒ Ô Ð    ÖÓÔ ×Ù º
   ¾º Ò Ð × Ò × ÓÑÔÙØ ÓÒ Ð ×             Ô ×     ÙØ Ð Þ Ó Ô Ö ÓÒÒÓØ Ö Ó× Ó× ×º Ä ÔÖ Ñ Ö
       ÓÒ ÖÒ ÙÒ ×Ô               Ö ÓÐ Ò Ö Ó¸ Ð Ù Ð × Ð ×Ù ØÓ        ×ØÙ Ó Ð ÔÖ × ÒØ × ÓÒº
      Ä × ÙÒ Ö ¬ Ö Ð Ñ Ò ×ØÖ ÓÒ Ñ ÑÓÖ Ò ÙÒ ÔÖÓ ×Óº
302                                                                   Cap´        ´
                                                                                    ıtulo 4. Arboles



              ¾º Ù ÐÕÙ Ö ÑÓ ¬ ÓÒ Ð Ô¸ ÒØ Ò ÑÓ× ÙÒ Ò× Ö ÓÒ Ó Ð Ñ Ò ÓÒ¸ Ù ×Ø
                 O(Ð (n))º ÁÒØÙ Ø Ú Ñ ÒØ ¸ ×ØÓ × ÙÒ ÓÒ× Ù Ò     Ð ÔÖÓÔ     ÓÖÑ ¸ Ð
                  Ù Ð Ö ÒØ Þ ÕÙ Ð ÐØÙÖ ×Ø ÓØ          O(Ð (n))º

               Ä ×ØÖÙ ØÙÖ         ØÓ× ÔÖ Ö Ô Ö ÑÔÐ ÒØ Ö ÙÒ Ô × ÙÒ ÖÖ ÐÓ ÕÙ ÐÑ Ò
            Ð Ö ÓÖÖ Ó ÔÓÖ Ò Ú Ð × Ð Ö ÓÐ ÓÑÔÐ ØÓº ÈÓÖ ÑÔÐÓ¸ Ð Ô Ð ¬ ÙÖ º¾ ÔÙ
           Ö ÔÖ × ÒØ Ö× ÓÒ Ð × Ù ÒØ × Ù Ò
            ¾½ ¿      ¿½     ½     ½¼             ¼ ¾¾ ½   ½¿ ½     ½     ¾ ¿½    ½½¾ ½   ¾½ ¾¼¼ ¾¼
           Ð Ù Ð × ÐÑ Ò Ò ÙÒ ÖÖ ÐÓ array[] ×Ô ¬                   Ó Ð × Ù ÒØ ÑÓ Ó
¿¼¾         Ñ Ñ ÖÓ× ÔÖ Ú Ó× ArrayHeap<Key> ¿¼¾ ≡                            ´¿¼¿ µ ¿¼¾
             T * array;
              Ä Ö Þ¸ Ó × ¸ Ð Ñ ÒÓÖ Ð Ñ ÒØÓ Ð ÓÒ ÙÒØÓ¸ × Ò Ù ÒØÖ Ò
¿¼¾         Ê Þ Ð Ô ¿¼¾ ≡
             array[1];
           ÆÓØ ÑÓ× ÕÙ × array[1] Ý ÒÓ array[0] × ÔÓÖ ÐÐÓ ÕÙ Ð ÖÖ ÐÓ × Ô ÖØ Ô Ö dim + 1º
              È Ö Ñ Ò Ö ×Ø רÖÙ ØÙÖ          ØÓ׸   ÑÓ× ×Ô ¬ Ö Ð Ñ Ò× ÓÒ Ð ÖÖ ÐÓ Ý
            ÓÒØ Ö Ð ÒØ        Ð Ñ ÒØÓ× Ð Ô Ñ ÒØ
¿¼¾        Ñ Ñ ÖÓ× ÔÖ Ú Ó× ArrayHeap<Key> ¿¼¾ +≡            ´¿¼¿ µ ¿¼¾ ¿¼¾
             const size_t dim;
             size_t       num_items;
                   Ó ÙÒ Ò        i¸ ÐÓ×      ×Ó× Ð Ô Ö Ý ÐÓ× Ó× × ×Ô ¬ Ò          Ð × × Ù ÒØ × ÓÖÑ ×
             ½º   Padre  Ò ×Ø           ×Ó ÒÓ× × ÑÓ× Ò ´ º¿ µ
      ¿¼¾         ÊÙØ Ò × Ô ¿¼¾           ≡                                        ¿¼¾
                   static size_t u_index(const size_t & i)
                   {
                     return i >> 1; // divide i entre 2
                   }

      ¾º   Hijo izquierdo:   × ÙÒ ´ º¿ µ
      ¿¼¾         ÊÙØ Ò ×    Ô ¿¼¾ +≡                                        ¿¼¾ ¿¼¿
                   static size_t l_index(const size_t & i)
                   {
                     return i << 1; // multiplica i por 2
                   }

      ¿º   Hijo derecho:  Ø Ñ Ò × ÙÒ ´ º¿ µ
      ¿¼¾         Ñ Ñ ÖÓ× ÔÖ Ú Ó× ArrayHeap<Key> ¿¼¾          +≡        ´¿¼¿ µ ¿¼¾ ¿¼
                   static size_t r_index(const size_t & i)
                   {
                     return (i << 1) + 1; // multiplica i por 2 y suma 1
                   }

             רÓ× Ð ÙÐÓ× Ö Ú Ð Ò ÙÒ Ú ÒØ  Ð Ô Ò Ö Ó Ö ×Ô ØÓ Ù ÐÕÙ Ö ÓØÖÓ ÓÖ Ò ÐÓ×
           ÔÖÓ Ù ØÓ× Ý Ú × ÓÒ × ÔÙ Ò Ö Ð Þ Ö× Ö Ô Ñ ÒØ Ñ ÒØ ×ÔÐ Þ Ñ ÒØÓ×             Ø×¸
           ÐÓ× Ù Ð × ×ÓÒ ×Ù ×Ø Ò ÐÑ ÒØ Ñ × Ö Ô Ó× ÕÙ ÐÓ× ÔÖÓ Ù ØÓ× Ý Ú × ÓÒ × ÕÙ Ó Ö Ð
           ÔÖÓ × ÓÖ Ó ÙÒ        Ð ÓØ º
4.7. Heaps                                                                     303



           ÄÓ×     Ô×    Ò Ö Ó× ÑÔÐ ÒØ Ó× Ñ     ÒØ ÖÖ ÐÓ× × ×Ô ¬ Ò Ò Ð Ö ÚÓ
      ØÔÐ ÖÖ ÝÀ ÔºÀ ¿¼¿ ¸ ÙÝ ×Ô ¬             ÓÒ Ò Ö Ð × ÓÑÓ × Ù
¿¼¿   ØÔÐ ÖÖ ÝÀ ÔºÀ ¿¼¿     ≡
              template <typename T, class Compare = Aleph::less<T> >
          class ArrayHeap
          {
             Ñ Ñ ÖÓ× ÔÖ Ú Ó× ArrayHeap<Key> ¿¼¾
             Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayHeap<Key> ¿¼
          };
            ר Ð × Ô Ö Ñ ØÖ Þ    ÑÔÐ ÒØ ÙÒ        Ô Ò ÖÓ     Ð Ñ ÒØÓ× Ø ÔÓ Ò Ö Ó T¸
      Ñ      ÒØ ÙÒ ÖÖ ÐÓ ×Ø Ø Ó Ý ÓÒ Ö Ø Ö Ó      ÓÑÔ Ö ÓÒ ×Ø Ð Ó Ò Ð Ð × Compareº
      4.7.1      Inserci´n en un heap
                        o
       ÓÒ× Ö ÑÓ× ÙÒ Ô Ò Ö Ó Ø Ñ ÒÓ n Ý Ð Ò× Ö ÓÒ ÙÒ ÒÙ ÚÓ Ð Ñ ÒØÓ xº À Ý
      ÙÒ ×ÓÐÓ ÐÙ Ö¸ ÒØÖÓ Ð Ö Óи Ò Ð Ù Ð ÔÙ    Ò Ö× ÙÒ ÒÙ ÚÓ Ð Ñ ÒØÓ × Ò ÐØ Ö Ö Ð
      ÔÖÓÔ         ÓÖÑ Ø Ð ÐÙ Ö × Ô ØÓÖ Þ Ò Ð × Ù ÒØ ¬ ÙÖ

                                                    x

         Ö ÒØ Þ Ð ÔÖÓÔ        ÓÖÑ ¸ Ö ×Ø ÔÓÖ Ú Ö ¬ Ö ÓÒ¬ÖÑ Ö Ý¸ Ú ÒØÙ ÐÑ ÒØ Ö ×Ø Ù¹
      Ö Ö¸ Ð ÓÖ Òº È Ö ÐÐÓ¸ ÒÓ× Ú Ð Ö ÑÓ× Ð ÖÙØ Ò
¿¼¿    ÊÙØ Ò × Ô ¿¼¾ +≡                                       ¿¼¾ ¿¼
              template <typename T, class Compare> inline
          void sift_up(T * ptr, const size_t & l, const size_t & r)
          {
            for (size_t p, i = r; i > l; i = p)
              {
                p = u_index(i); // ındice del padre (c = i/2)
                                   ´
                if (Compare () (ptr[p], ptr[i])) // ¿satisface propiedad orden?
                  return; // si, todo el arreglo es un heap
                Aleph::swap(ptr[p], ptr[i]); // intercambie y restaure en nivel p
              }
          }
            Ä ÒØÖ          sift up() × ÙÒ ÖÖ ÐÓ¸ ÓÒØ ÒØ ÚÓ    ÙÒ Ô Ò Ö Ó ÒØÖ l Ý r − 1¸
       ÓÒ ÙÒ Ú ÒØÙ Ð Ú ÓÐ ÓÒ Ð ÔÖÓÔ                 ÓÖ Ò Ò array[n] Ð × Ð × ÙÒ Ô
        Ò Ö Ó¸ Ò ÓÖÑ Ý ÓÖ Ò¸ ÒØÖ l Ý r¸ ÓÒ Ð Ú ÒØÙ Ð Ú ÓÐ ÓÒ ÓÖÖ         º Ð ÔÖÓ ×Ó ×
          ÑÔÐ ¬ Ò Ð ¬ ÙÖ º¾ º × Ñ ÒØ ¸ sift up() × Ú Ö ¬ × Ü ×Ø ÙÒ Ú ÓÐ ÓÒ
           ÓÖ Ò ÒØÖ ptr[i] Ý ptr[p]º Ë Ø Ð × Ð ×Ó¸ ÒØÓÒ × ÒØ Ö Ñ ×Ù× Ð Ñ ÒØÓ× Ý
       × Ò ÔÖÓ × Ö Ð Ò Ú Ð Ò Ö ÓÖ × ÒÓ¸ ÒØÓÒ ×¸ ØÓ Ó Ð Ö ÓÐ × ÙÒ Ôº Ð ÔÖÓ ×Ó
       ÓÒØ ÒÙ ×Ø ÕÙ Ð Ô Ö × Ñ ÒÓÖ Ó × Ð Ò Ð Ö Þº
                  ÑÓ× ÔÖ ×Ø Ö ×Ô Ð Ù Ó Ð          Ó ÕÙ ÒØ ÖÚ ÐÓ Ð Ô × [1 . . . n] Ý ÒÓ
      [0 . . . n − 1]¸ ÓÑÓ ØÖ    ÓÒ ÐÑ ÒØ × Ñ Ò Ò ÐÓ× ÖÖ ÐÓ× Ò Ð Ò Ù C Ý C++º ÓÒ× ¹
       Ù ÒØ Ñ ÒØ ¸ Ð Ö ÓÒ ptr              ר Ö ×ÔÐ Þ      Ò ÙÒ ÙÒ º
               Ð Óר sift up() × ÜÔÖ × ÔÓÖ Ð × Ù ÒØ Ð Ñ
      Lema 4.1 Ë        T ÙÒ     Ô Ò ÖÓ    n Ð Ñ ÒØÓ× ÓÒ ÙÒ Ú ÓÐ ÓÒ Ú ÒØÙ      Ð    ÓÖ Ò
       Ò array[n]º      ÒØÓÒ ×¸ Ð ÙÖ ÓÒ     sift up(array, 1, n) × O(Ð (n))º
304                                                                                                                           Cap´        ´
                                                                                                                                      ıtulo 4. Arboles


                                                    33                                                                                 33


                             59                                              39                                 59                                              39


                 118                    108                   61                  79                118                    108                   61                  79


           143         135        123         169        66        81         100 113        143          135        123         169        66        38         100 113


       256 198 145 138 170 152 182 227 190 144 120                      38                 256 198 145 138 170 152 182 227 190 144 120                     81
                                              ´µ                                                                                 ´ µ
                                                    33                                                                                 33


                             59                                              39                                 59                                              38


                 118                    108                   38                  79                118                    108                   39                  79


           143         135        123         169        66        61         100 113        143          135        123         169        66        61         100 113


       256 198 145 138 170 152 182 227 190 144 120                      81                 256 198 145 138 170 152 182 227 190 144 120                     81
                                              ´µ                                                                                 ´ µ


                                   ÙÖ º¾ ÇÔ Ö ÓÒ sift up() ×Ó Ö Ð Ú ÐÓÖ                                                                ÐÚ    38


     Demostraci´n
               o      Ð Ø ÑÔÓ         Ù ÓÒ sift up() ר Ö ÓÑ Ò Ó ÔÓÖ Ð ÒØ
        ÒØ Ö Ñ Ó× ÕÙ Ó × ÓÒ Ð Ð Ñ ÒØÓ Ú ÓÐ ØÓÖ Óº Ò ×Ø × ÒØ Ó¸ ÐÓ Ô ÓÖ ÕÙ ÔÙ
     Ó ÙÖÖ Ö × ÕÙ Ð Ð Ñ ÒØÓ Ú ÓÐ ØÓÖ Ó Ú Ò Ð Ö Þ T º ÈÓÖ Ø ÒØÓ¸ Ð ÒØ     Ñ ÜÑ
        ÒØ Ö Ñ Ó× × ÔÖÓÔÓÖ ÓÒ Ð Ð ÐØÙÖ Ð Ö Óк ÈÙ ×ØÓ ÕÙ T × ÓÑÔÐ ØÓ¸ Ý × ÙÒ
     × ×ÔÖ Ò       Ð ÔÖÓÔÓ× ÓÒ º½¸ ×Ù ÐØÙÖ ×Ø ÓØ ÔÓÖ O(Ð (n))
        Å ÒØ sift up()¸ × × ÑÔÐ Ò Ö ÙÒ ÒÙ ÚÓ Ð Ñ ÒØÓ key Ð Ô
¿¼     Ò Ö Ð Ñ ÒØÓ Ð Ô ¿¼ ≡                                     ´¿¼ µ
      array[++num_items] = key; // colocar nuevo elemento
      sift_up <T, Compare> (array, 1, num_items); // restaurar propiedad de orden
     ÐÓ Ù Ð¸ ÔÓÖ Ð Ð Ñ º½¸ × O(Ð                              (n))º

     4.7.2        Eliminaci´n en un heap
                           o
     Ä Ð Ñ Ò ÓÒ ÔÙ ÔÐ ÒØ Ö×            Ó× Ñ Ò Ö × ´½µ Ð Ñ Ò ÓÒ Ð Ö Þ Ý ´¾µ Ð Ñ ¹
     Ò ÓÒ Ù ÐÕÙ Ö Ð Ñ ÒØÓº Ò Ö Ð ¸ Ð ×Ó ´¾µ × Ò Ö Ð Ý ÓÑÔÖ Ò Ð ´½µ¸ Ô ÖÓ¸
      Ò ÚÓÖ Ð × ÑÔÐ        ¸ ØÖ Ø Ö ÑÓ× Ð ÔÖ Ñ ÖÓ ÔÓÖ × Ô Ö Óº
         ÓÒ× Ö ÑÓ׸ Ô٠׸ Ð Ð Ñ Ò ÓÒ Ð Ñ ÒÓÖ Ð Ñ ÒØÓ ÙÒ Ô × Ö¸ ×Ù Ö Þº
       × Ð Ô Ö×Ô Ø Ú       ÓÖÑ ÙÒ Ô¸ Ð Ñ Ò Ö Ð Ö Þ ÕÙ Ú Ð ¸ Ô ØÓÖ Ñ ÒØ ¸ ÐÓ
     × Ù ÒØ
                                            ÑÒ
                                                                                                x

     ÐÓ ÕÙ ¸ ÑÓÖ ÓÐÓ Ñ ÒØ ¸ ÒÓ × ÙÒ Ôº À ݸ ÒÙ ÚÓ¸ ÙÒ Ñ Ò Ö                                                                                           Ö ×Ø ÙÖ Ö Ð
      ÓÖÑ ¸ Ð Ù Ð ÕÙ Ú Ð ¸ Ô ØÓÖ Ñ ÒØ ¸ ÐÓ × Ù ÒØ
                                                                                       x

                                                                                            x
4.7. Heaps                                                                                                                                                                       305



      × Ö¸ Ð ÙÐØ ÑÓ Ð Ñ ÒØÓ ×Ó Ö × Ö       Ð Ö Þº Ð ÓÖ Ñ ÒØ ¸ Ð Ô × ÓÖØ ÔÓÖ Ð
     ÙÐØ ÑÓ Ò Ú Ð Ð Ö ÓРݸ ÓÒ × Ô ÞÓ ¸ × Ö ÐÐ Ò Ð Ù Ó         Ó ÔÓÖ Ð Ö Þº
          Ð ÒÙ ÚÓ Ð Ñ ÒØÓ Ö Þ ÑÙÝ ÔÖÓ Ð Ñ ÒØ Ú ÓÐ Ö Ð ÔÖÓÔ     ÓÖ Ò¸ Ð Ù Ð ÔÙ
     Ö ×Ø ÙÖ Ö× Ñ ÒØ Ð ÔÖÓ Ñ ÒØÓ sift down()¸ Ò Ö Ó ÒØ Ö Ñ Ö Ð Ñ ÒØÓ×
       Ð Ô ×Ø ÕÙ Ð ÔÖÓÔ              ÓÖ Ò × Ö ×Ø ÙÖ º
         sift down() × Ð Ö Ñ ÒØ Ñ × ÓÑÔÐ Ó ÕÙ sift up()¸ ÔÙ × Ý ÕÙ Ñ Ö Ö ÐÓ× Ó×
        Ó× Ð Ú ÒØÙ Ð Ð Ñ ÒØÓ Ú ÓÐ ÓÖ Ý × Ó Ö Ô Ö ÒØ Ö Ñ Ö Ð Ñ ÒÓÖ        ÐÐÓ׺
      ר ÑÓ Ó¸ × Ö ÒØ Þ Ð ÔÖÓÔ           ÓÖ Òº Ð ÔÖÓ ×Ó ÓÒØ ÒÙ Ò Ð × Ù ÒØ Ò Ú Ð
        ר ÕÙ ÐÓ× Ó× Ó× × Ò Ñ ÝÓÖ × Ó × Ð Ò Ð ÙÐØ ÑÓ Ò Ú Ðº
                                                            81                                                                                        38


                                 59                                                     38                                 59                                              81


                   118                        108                       39                    79             118                        108                        39            79


            143           135          123           169          66          61         100 113      143           135          123           169           66          61 100 113


          256 198 145 138 170 152 182 227 190 144 120                              33              256 198 145 138 170 152 182 227 190 144 120
                                                    ´µ                                                                                       ´ µ
                                                             38                                                                                      38


                                  59                                                39                                    59                                              39


                    118                        108                       81                  79             118                        108                        61            79


             143           135          123           169          66          61 100 113            143           135          123           169           66          81 100 113


           256 198 145 138 170 152 182 227 190 144 120                                             256 198 145 138 170 152 182 227 190 144 120
                                                    ´µ                                                                                   ´ µ


          ÙÖ º¾ ÇÔ Ö ÓÒ sift down() ×Ó Ö Ð Ö Þ 33 Ò Ð                                                                                        Ô Ö ×ÙÐØ ÒØ                       Ð ¬ ÙÖ
     º¾
¿¼   ÊÙØ Ò ×               Ô ¿¼¾         +≡                                                                                                  ¿¼¿ ¿¼
          template <typename T, class Compare> inline
      void sift_down(T * ptr, const size_t & l, const size_t & r)
      {
        size_t i = l, c;
        while (true)
          {
            c = l_index(i); // ındice del hijo izquierdo (c = i/2)
                               ´
            if (c > r) // ¿hay hijo izquierdo?
              return; // no ==> termine
            if (c + 1 <= r) // ¿hay hijo derecho?
              if (Compare () (ptr[c + 1], ptr[c])) // s´ ==> escoja el menor
                                                       ı
                c++;
            if (Compare () (ptr[i], ptr[c])) // ¿Satisface propiedad de orden?
              return; // s´ ==> termine
                           ı
            Aleph::swap(ptr[c], ptr[i]);
            i = c;
          }
      }
          Ä ÖÙØ Ò ØÓÑ ÙÒ Ô ÒØÖ [l + 1 . . . r] Ý Ö ×Ø ÙÖ Ð ÔÖÓÔ                                                                                                   ÓÖ Òº              ×ÔÙ ×
            ØÙ Ð ÐÐ Ñ ¸ Ð × Ù Ò      Ú Ò ÙÒ Ô ÓÑÔÐ ØÓ ÒØÖ                                                                                                 [l . . . r]º
306                                                           Cap´        ´
                                                                      ıtulo 4. Arboles



        Ä ÙÖ ÓÒ      sift down()   × Ö Ú Ð Ò Ð × Ù ÒØ Ð Ñ
     Lema 4.2 Ë T ÙÒ        Ô Ò Ö Ó n Ð Ñ ÒØÓ× ÓÒ ÙÒ Ú ÓÐ ÓÒ Ú ÒØÙ Ð ÓÖ Ò Ò
     array[1]º ÒØÓÒ ×¸ Ð     ÙÖ ÓÒ sift down(array, 1, n) × O(Ð (n))º
     Demostraci´n
               o    ÐØ     ÑÔÓ        Ù ÓÒ sift down() ר ÓÑ Ò Ó ÔÓÖ Ð ÒØ
         ÒØ Ö Ñ Ó× ÕÙ Ó × ÓÒ Ð Ð Ñ ÒØÓ Ú ÓÐ ØÓÖ Óº Ò ×Ø × ÒØ Ó¸ ÐÓ Ô ÓÖ ÕÙ ÔÙ
     Ó ÙÖÖ Ö × ÕÙ Ð Ð Ñ ÒØÓ Ú ÓÐ ØÓÖ Ó Ð Ò Ð Ñ Ü ÑÓ Ò Ú Ð T Ó × ¸ ×Ù ÐØÙÖ º ÈÓÖ
     Ø ÒØÓ¸ Ð ÒØ       Ñ ÜÑ       ÒØ Ö Ñ Ó× × ÔÖÓÔÓÖ ÓÒ Ð Ð ÐØÙÖ Ð Ö Óк ÓÑÓ T
      × ÓÑÔÐ ØÓ ݸ × ÙÒ Ð ÔÖÓÔÓ× ÓÒ º½¸ ×Ù ÐØÙÖ ×Ø ÓØ ÔÓÖ O(Ð (n))
          ÓÒ ÐÓ ÒØ Ö ÓÖ Ò Ñ ÒØ ¸ ÔÓ ÑÓ× ÔÐ ÒØ Ö Ð Ð Ñ Ò ÓÒ Ð × Ù ÒØ ÑÓ Ó
¿¼     Ð Ñ Ò Ö Ö Þ Ò Ô ¿¼ ≡                                     ´¿¼ µ
      array[1] = array[num_items--]; // sobreescribir la ra´z con ´ltimo elemento
                                                           ı      u
      sift_down <T, Compare> (array, 1, num_items); // Restaurar propiedad de orden
     Р٠и × ÙÒ Ð Ð Ñ º¾¸ × O(Ð (n))º
          Ä × ÙÒ Ñ Ò Ö         Ð Ñ Ò Ö¸ Ñ × Ò Ö Ð¸ × ÔÐ ÒØ Ò ÓÒÓ× Ð ×ÙÔÖ × ÓÒ ÙÒ
      Ð Ñ ÒØÓ Ù ÐÕÙ Ö º È Ö ÐÐÓ¸ × ÑÔÐ Ñ ÒØ ÔÐ ÑÓ× Ð Ñ ×ÑÓ ÔÖ Ò Ô Ó Ð ÔÖ Ñ Ö
     Ø ÔÓ Ð Ñ Ò ÓÒ ×Ó Ö × Ö Ö Ð Ð Ñ ÒØÓ ÕÙ × ÑÓ× Ð Ñ Ò Ö ÓÒ Ð ÙÐØ ÑÓ Ð
     × ÙÒ ºÄ          Ö Ò ÓÒ Ð ÔÖ Ñ Ö Ñ ØÓ Ó × ÕÙ ÕÙ ÔÙ Ò ÔÖ × ÒØ Ö× Ú ÓÐ ÓÒ ×
        Ð ÓÖ Ò ÔÓÖ Ð Ô Ö Ó ÔÓÖ ÐÓ× Ó׺
          ÄÐ Ñ Ö ÑÓ× Ð ÖÙØ Ò Ò Ö Ð ×ÙÔÖ × ÓÒ sift down up()¸ ÔÙ × ÐÐ × Ö Ñ Ø ×ÓÐÓ
         × × ÓÒ ×
¿¼    ÊÙØ Ò × Ô ¿¼¾ +≡                                        ¿¼ ¿¼
          template <typename T, class Compare> inline
      void sift_down_up(T * ptr, const size_t & l, const size_t & i, const size_t & r)
      {
        sift_down <T, Compare> (ptr, i, r);
        sift_up <T, Compare> (ptr, 1, i);
      }
      Ä ÖÙØ Ò Ö       ÙÒ array[] ÓÒØ ÒØ ÚÓ ÙÒ Ð Ñ ÒØÓ ÔÓ× Ð Ñ ÒØ Ú ÓÐ ÓÖ Ð
     ÔÖÓÔ          ÓÖ Ò Ò Ð ÔÓ× ÓÒ iº ÈÖ Ñ ÖÓ Ú Ö ¬ × Ý Ú ÓÐ ÓÒ ÒØÖ ×Ù× Ó×
     ÐÙ Ó ÒØÖ ×Ù Ô Ö º
          ÓÒ Ð ÖÙØ Ò ÒØ Ö ÓÖ¸ ÔÓ ÑÓ× ÔÐ ÒØ Ö Ð Ð Ñ Ò ÓÒ Ð i¹ × ÑÓ Ð Ñ ÒØÓ Ð Ô
¿¼     Ð Ñ Ò Ö Ð Ñ ÒØÓ ¿¼ ≡
      array[i] = array[num_items--]; // sobreescribir i con ultimo elemento
                                                            ´
      sift_down_up <T, Compare> (array, 1, i, n);


     4.7.3   Colas de prioridad
      Ü ×Ø ÙÒ ÑÔÐ × Ñ Ñ × ØÙ ÓÒ × Ò Ð × Ù Ð × Ò Ñ Ñ ÒØ × Ö ÕÙ Ö Ñ Ò Ö
     ÙÒ ÓÒ ÙÒØÓ Ð Ú × Ý ÓÒÓ Ö Ð Ñ ÒÓÖ Ð Ñ ÒØÓ Ò Ù ÐÕÙ Ö ÑÓÑ ÒØÓº È Ö Ø Ð Ø ÔÓ
         Ö ÙÒר Ò ¸ × ÑÔÐ ÙÒ Ì ÓÒÓ Ó ÓÑÓ ÓÐ ÔÖ ÓÖ           º
          Ò ÓÔ Ö ÓÒ Ý × ÑÔ ÒÓ¸ Ð ÓÐ ÔÖ ÓÖ    × Ö ×ÙÑ Ò Ð Ø Ð × Ù ÒØ
                           ÆÓÑ Ö    ÓÔ Ö    ÓÒ   ¬ Ò   Ô ÓÖ   ×Ó
                             insert(item)          O(Ð (n))
                                top()               O(1)
                              remove(n)            O(Ð (n))
4.7. Heaps                                                                     307



        Ä × ÓÐ × ÔÖ ÓÖ × ÑÓ Ð Þ Ò Ö Ø Ñ ÒØ Ñ ÒØ Ð Ì ArrayHeap<Key>¸
     Ý ÒØÖÓ Ù Ó¸ Ý Ð Ì BinHeap<Key>¸ ÕÙ × Ö ØÖ Ø Ó Ò Ü º º º
        Ä Ò Ö array allocated Ò × × Ô ÖØÓ Ó ÒÓ Ð ÖÖ ÐÓ Ý × ¬Ò ×
¿¼    Ñ Ñ ÖÓ× ÔÖ Ú Ó× ArrayHeap<Key> ¿¼¾ +≡           ´¿¼¿ µ ¿¼¾
      mutable bool array_allocated;
     ÓÒ ×Ø Ò Ö Ð ×ØÖÙ ØÓÖ × × ×                  Ó ÒÓ Ð Ö Ö Ð Ñ ÑÓÖ
¿¼   Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayHeap<Key> ¿¼      ≡                 ´¿¼¿ µ ¿¼
      virtual ~ArrayHeap()
      {
        if (array_allocated and array != NULL)
          delete [] array;
      }
       Ä ÓÒ×ÙÐØ Ð Ñ ÒÓÖ × Ð ÓÔ Ö ÓÒ Ñ × × ÑÔÐ Ý Ö Ô              ÙÒ        Ô
¿¼   Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayHeap<Key> ¿¼ +≡        ´¿¼¿ µ        ¿¼     ¿¼
      T & top()
      {
        return array[1];
      }
        Ä Ò× Ö ÓÒ Ý Ð Ñ Ò ÓÒ Ø Ñ Ò ×ÓÒ ÑÙÝ × Ò ÐР׸ Ó ÕÙ ØÓ Ó Ð ØÖ            ÓÝ
     × ÓÖ ÐÞ Ó
¿¼    Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayHeap<Key> ¿¼ +≡          ´¿¼¿ µ ¿¼ ¿¼
      T & insert(const T & key) throw(std::exception, std::overflow_error)
      {
        if (num_items >= dim)
          throw std::overflow_error("Heap out of capacity");
            Ò Ö Ð Ñ ÒØÓ Ð     Ô ¿¼
        return array[num_items];
      }
      T getMin()
      {
        T ret_val = array[1];
            ÐÑÒ ÖÖ Þ Ò      Ô ¿¼
          return ret_val;
      }
     Ê ÓÖ ÑÓ× ÕÙ ¸ × ÙÒ × ×ÔÖ Ò        ÐÓ× Ð Ñ × º½ Ý º¾¸ ÐÓ× ÐÓÕÙ × Ò Ö Ð Ñ ÒØÓ
      Ð Ô ¿¼ Ý Ð Ñ Ò Ö Ö Þ Ò Ô ¿¼ ×ÓÒ O(Ð (n))º ÈÙ ×ØÓ ÕÙ Ð Ö ×ØÓ Ð ÒØÓÖÒÓ
       insert() Ý getMin() × O(1)¸ ÒØÓÒ × ×Ø × ÓÔ Ö ÓÒ × ×ÓÒ O(Ð (n))º

     4.7.3.1   Modificaci´n de prioridad
                        o

       × ÔÐ Ù× Ð ÑÓ ¬ Ö Ð Ú ÐÓÖ ÔÖ ÓÖ      ÙÒ Ð Ñ ÒØÓ Ô ÖØ ÙÐ Öº ÓÑÓ ×Ø ÓÔ¹
      Ö ÓÒ ÒÓ ÐØ Ö ØÓÔÓÐÓ Ñ ÒØ Ð Ö Óи Ð ÔÖÓÔ           ÓÖÑ ×Ø Ö ÒØ Þ º ÄÓ
     ÙÒ Ó ÕÙ      ÑÓ× Ö ÓÖ Ö × ÕÙ Ð ÓÖ Ò × ÔÖ × ÖÚ ¸ ÐÓ ÕÙ × Ö Ð Þ Ñ ÒØ Ð
     × Ù ÒØ ÓÔ Ö ÓÒ
¿¼    Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayHeap<Key> ¿¼ +≡               ´¿¼¿ µ ¿¼
      void update(T & data)
      {
        const size_t i = &data - array;
308                                                                   Cap´        ´
                                                                              ıtulo 4. Arboles



           sift_down_up <T, Compare> (array, 1, i, num_items);
       }
     Ä ÖÙØ Ò ×ÙÑ ÕÙ Ð Ú ÐÓÖ            ÔÖ ÓÖ         Ð i¹ × Ñ ÒØÖ          Ð ÖÖ ÐÓ    × Ó ÑÓ ¹
     ¬    Ý Ö ×Ø ÙÖ Ð ÔÖÓÔ              ÓÖ Òº
     4.7.4      Heapsort
       ÓÒ× Ö ÑÓ× ÓÖ Ò Ö ÙÒ ÖÖ ÐÓ array[] n Ð Ñ ÒØÓ׺ ÍÒ Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓ¸
      ר Ð   ¸ ÓÒ Ö Ò Ñ ÒØÓ O(n Ð (n)) Ô Ö Ð Ô ÓÖ ×Ó¸ Ù Ð × Ñ ÓÖ ÕÙ Ð Ô ÓÖ ×Ó
               ½¾

        Ð ÕÙ×ÓÖØ¸ ÔÙ      ÜÔÐ Ö× Ò Ó× × ×
         ½º
          Ù Ö Ò ÙÒ ÓÐ ÔÖ ÓÖ            ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ× Ð ÖÖ ÐÓº
         ¾º
          ÜØÖ      Ø Ö Ø Ú Ñ ÒØ    Ð ÓÐ Ý Ù Ö Ð Ð Ñ ÒØÓ ÜØÖ Ó Ò Ð ÔÓ× ÓÒ
         Ø Ö ÓÒ iº ÈÙ ×ØÓ ÕÙ Ð ÓÐ × ÑÔÖ Ö ØÓÖÒ Ð Ñ ÒÓÖ Ð Ñ ÒØÓ¸ Ð ¬Ò Ð ×Ø
         Ø Ö ÓÒ Ð ÖÖ ÐÓ ×Ø Ö ÓÖ Ò Óº
     ר ÔÖ Ò Ô Ó ÔÙ Ö Ð Þ Ö× Ð × Ù ÒØ ÑÓ Ó
¿¼   À Ô×ÓÖØ ÓÒ ÓÐ        ÔÖ ÓÖ  ¿¼ ≡
       ArrayHeap<T, n> heap;
       for (int i = 0; i < n; ++i) // inserta elementos de array en heap
         heap.insert(array[i]);
       for (int i = 0; i < n; ++i) // extrae ordenadamente del heap y guarda en array
         array[i] = heap.getMin();
                    Ô×      ÑÓÖ
                              O(n) × O(Ð (n)) = O(n Ð (n))º
                                                     ÈÓÖ Ø ÒØÓ¸ Ð ÔÖÓ Ñ ÒØÓ ×
     O(n Ð (n)) + O(n Ð (n)) = O(n Ð (n))¸ Ò Ô Ò ÒØ Ñ ÒØ Ð Ô ÖÑÙØ ÓÒ Ð ÖÖ ÐÓº
     Ë Ò Ñ Ö Ó¸ Ð Ù×Ó Ð Ô Ö ÕÙ Ö ÐÑ Ò Ö ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ× Ð ÖÖ ÐÓ¸ ÔÓÖ ÐÓ
     ÕÙ Ð ÓÒ×ÙÑÓ ×Ô Ó × O(n) Ö Ø Ö ×Ø Ò × Ð Ò ÑÙ × Ö ÙÒר Ò ×º
         ÆÓ ×    Ð ÔÖ Ò Ö ÕÙ ÔÓ ÑÓ× ÙØ Ð Þ Ö Ð ÔÖÓÔ Ó ÖÖ ÐÓ ÕÙ ÔÖ Ø Ò ÑÓ× ÓÖ¹
       Ò Ö Ô Ö Ù Ö Ö Ð Ôº È Ö ÐÐÓ¸ × Ò × Ö Ó ÒÚ ÖØ Ö Ð ÓÒ ÓÒ ÓÖ Ò ÑÓ Ó
     Ø Ð ÕÙ Ð Ö Þ ÐÑ Ò Ð Ñ ÝÓÖ ÒØÖ ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ׺ ×ØÓ × Ö Ð Þ      ÐÑ ÒØ
     Ñ ÒØ ÙÒ Ð × ÒÚÓÐØÓÖ ÕÙ Ö Ð Ð ÒÚ Ö× ÓÒ     ½¿

¿¼      ÓÑÔ Ö ÓÒ ÒÚ ÖØ ¿¼ ≡
           template <class T, class Compare>
       struct Inversed_Compare
       {
         bool operator () (const T & op1, const T & op2) const
         {
           return Compare () (op2, op1);
         }
       };
               ר ÑÓ Ó¸ Ð ÔÖ Ñ Ö      × ÔÙ    ÔÐ ÒØ Ö× ¸ Ô ØÓÖ Ñ ÒØ ¸        Ð × Ù ÒØ Ñ Ò Ö
                    À Ô ÒØÖ 1 i − 1             ×ÓÖ Ò

                                       i
      ½¾
          Ê Ú × × ¸ × × Ò × Ö Ó¸ Ò Ü ¿º¾º½º¿ ´Ô Ò ½ µ¸ Ð ÓÒ ÔØÓ     ר Ð        ÙÒ Ñ ØÓ Ó   ÓÖ ¹
     Ò Ñ ÒØÓº
       ½¿
           ר Ð × ÒÚÓÐØÓÖ ×Ø ¬Ò            Ò Ð Ö ÚÓ ahFunction.Hº
4.7. Heaps                                                                    309



     Ð Ù Ð Ö ÓÖÖ Ð ÖÖ ÐÓ ×      2 ר n¸      ÙØ Ò
                                              Ó¸       Ø Ö ÓÒ i¸ sift up <T,
                                              × Ö¸ ÓÖÖ Ò Ó Ð Ú ÒØÙ Ð Ú Ó¹
      Inversed Compare<T, Compare> >(arreglo, i)
     Ð ÓÒ ÕÙ ÖÖ Ö Ò× ÖØ Ö ÙÒ ÒÙ ÚÓ Ð Ñ ÒØÓ Ò Ð ÔÓ× ÓÒ iº Ä ÔÖ Ñ Ö × ÔÙ
      Ó ¬ Ö× ¸ ÒØÓÒ ×¸ ÓÑÓ × Ù
¿¼     ÓÒÚ ÖØ Ö ÖÖ ÐÓ Ò ÙÒ Ô ÓÒ × Ø ÙÔ´µ ¿¼ ≡              ´¿¼ µ
      for (int i = 2; i <= n; ++i)
        sift_up <T, Aleph::Inversed_Compare<T, Compare> > (array, 1, i);
     Ä        × ÓÑ ÒÞ Ö × Ð Ô ÓÑÔÖ Ò Ó ÒØÖ [1 . . . 1] Ý ÐÙ Ó¸          Ø Ö ÓÒ i¸ ×
      ×ÙÑ ÙÒ Ò× Ö ÓÒ Ò Ð ÔÓ× ÓÒ iº Ð ÖÖ ÐÓ ÒØÖ [1 . . . i]] × Ð Ö ×Ø ÙÖ Ð ÔÖÓÔ
            Ô Ñ ÒØ sift up(array, 1, i)º
           Ð ¬Ò Ð Ð ÔÖ Ñ Ö × ¸ ØÓ Ó Ð ÖÖ ÐÓ × ÙÒ Ô ÙÝÓ Ñ Ü ÑÓ Ð Ñ ÒØÓ ×
      Ò Ù ÒØÖ Ò Ð Ö Þº Ô ÖØ Ö Ð     Ó ÕÙ Ð ÔÓ× ÓÒ ¬Ò Ø Ú Ð Ñ ÝÓÖ Ð Ñ ÒØÓ
      × n¸ ÔÐ ÒØ ÑÓ× Ð × ÙÒ × Ð × Ù ÒØ ÑÓ Ó
              swap(ptr[1], ptr[i])


             À Ô ÒØÖ 1 i              ÇÖ Ò    ¬Ò Ø ÚÓ

                                  i

     Ð Ù Ð × ÑÔÐ ÒØ ×
¿¼    ÇÖ Ò Ö Ô ÖØ Ö Ð Ô ¿¼      ≡                              ´¿¼ ¿½¼ µ
      for (int i = n; i > 1; --i)
        {
          Aleph::swap(array[1], array[i]); // colocar en la ra´z i-´simo item
                                                              ı    e
          sift_down <T, Aleph::Inversed_Compare<T, Compare> > (array, 1, i - 1);
        }
       ÖÓ××Ó ÑÓ Ó¸ × ÒØ Ö Ñ array[1] ÓÒ array[i]¸ ÐÓ ÕÙ ¬ Ð ÓÖ Ò ¬Ò Ø ÚÓ Ò Ð
     ÒØ ÖÚ ÐÓ [i . . . n]º ר ÒØ Ö Ñ Ó × ÕÙ Ú Ð ÒØ ÕÙ × Ù × Ð Ñ Ò Ó Ð Ô Ð
     Ñ ÒÓÖ Ð Ñ ÒØÓ × Ö¸ Ð Ð Ö Þº × Ô٠׸ sift down(array, 1, i - 1) Ö ×Ø ÙÖ
      Ð Ô ÒØÖ [1 . . . i − 1]º
           ÓÒ ÐÓ ÒØ Ö ÓÖ¸ ÔÓ ÑÓ× ¬Ò ÕÙ Ø Ö Ð Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓ
¿¼   ÊÙØ Ò × Ô ¿¼¾ +≡                                       ¿¼ ¿½¼
          template <typename T, class Compare>
      void heapsort(T * array, const size_t & n)
      {
        --array; //desplazar una posici´n hacia atr´s ==> array[1] == primer elemento
                                       o           a
           ÓÒÚ ÖØ Ö ÖÖ ÐÓ Ò ÙÒ Ô ÓÒ × Ø ÙÔ´µ ¿¼
          ÇÖ Ò Ö Ô ÖØ Ö Ð Ô ¿¼
      }
          Ü ×Ø ÙÒ Ñ Ò Ö ÐØ ÖÒ Ý Ø Ò ¬ Þ Ð ÐÓÕÙ ÓÒÚ ÖØ Ö ÖÖ ÐÓ Ò ÙÒ Ô ÓÒ
     × Ø ÙÔ´µ ¿¼ ¸ ÕÙ ÐÓ Ö ¸ Ñ × ¬ ÒØ Ñ ÒØ ¸ Ò O(n)¸   Ô ¬Þ Ö Ð ÖÖ ÐÓº È Ö
      ÔÖÓÜ Ñ ÖÒÓ׸ ÓÒ× Ö ÑÓ× Ð ÔÖ Ñ Ö Ô ×    Ð Ô×ÓÖØ Ð × Ù ÒØ ÓÖÑ

                  ×ÓÖ Ò                  À Ô ÒØÖ i + 1 Ý n
                                  i
310                                                                              Cap´        ´
                                                                                          ıtulo 4. Arboles



      Ó × ¸ ÙÒ ÖÖ Ó × Ð ÙÐØ Ñ ÔÓ× ÓÒ array[n] ר Ð ÔÖ Ñ Ö                                array[1]º   ÈÓ ÑÓ×
      Ö Ð Þ Ö ×ØÓ Ñ ÒØ sift down()
¿½¼      ÓÒÚ ÖØ Ö ÖÖ ÐÓ Ò ÙÒ Ô ÓÒ × Ø ÓÛÒ´µ ¿½¼ ≡
        for (int i = n - 1; i > 1; --i)
          sift_down <T, Aleph::Inversed_Compare<T, Compare> > (array, i, n);
       Ð Ò Ð××           ר ÐÓÕÙ × ÙÒ ÔÓ Ó Ñ × ×ÙØ к                        ÐÐ Ñ        sift down()   Ù ×Ø
      O(Ð (r) − Ð   (l))¸ ÐÓ ÕÙ ÒÓ×
                            n−1                        n−1
                                  O(Ð (r) − Ð (l)) =             Ð                                     ´ º¿ µ
                                                                     r
                                                             O               = O(n) ;
                                                                     l
                            i=1                        i=1

       Óר ÕÙ × Ñ ÓÖ ÕÙ Ð O(n Ð (n)) ×Ó Ó Ð ÐÓÕÙ ÓÒÚ ÖØ Ö ÖÖ ÐÓ Ò ÙÒ Ô
       ÓÒ × Ø ÙÔ´µ ¿¼ º
          À ݸ ÙÒ¸ ÙÒ Ñ ÓÖ Ñ × × ÔÖ Ò ÑÓ× Ð         Ó ÕÙ ¸ Ô Ö l > n¸ array[l..n]
                                                                     2
       ׸ ÓÒ ÖØ ØÙ ¸ ÙÒ Ô Ò ÔÖÓÔ         ÓÖ Ò¸ Ô٠׸ Ô Ö ∀l > n =⇒ 2l > n × Ö¸
                                                   ÓÒÚ ÖØ Ö ÖÖ ÐÓ Ò ÙÒ Ô ÓÒ
                                                              2
      ÒÓ Ý × Ò ÒØ ׺ ÈÓÖ Ø ÒØÓ¸ Ð Ú ÐÓ
      × Ø ÓÛÒ´µ ¿½¼ ¸ ÔÙ ÙÔÐ Ö× Ð × Ù ÒØ Ñ Ò Ö
¿½¼      ÓÒÚ ÖØ Ö ÖÖ ÐÓ Ò ÙÒ Ô ÓÒ × Ø ÓÛÒ´µ Ñ ÓÖ Ó ¿½¼ ≡         ´¿½¼ µ
        for (int i = n/2; i >= 1; --i)
          sift_down <T, Aleph::Inversed_Compare<T, Compare> > (array, i, n);
      ÐÓ ÕÙ ÒÓ× ÖÖÓ Ð × Ù ÒØ ÒÙ Ú Ú Ö× ÓÒ Ñ ÓÖ                           Ð     Ô×ÓÖØ
¿½¼    ÊÙØ Ò × Ô ¿¼¾ +≡                                                                    ¿¼
            template <typename T, class Compare>
        void faster_heapsort(T * array, const size_t & n)
        {
          --array; // desplazar una posici´n hacia atr´s ==> array[1] == primer elemento
                                          o           a
             ÓÒÚ ÖØ Ö ÖÖ ÐÓ Ò ÙÒ Ô ÓÒ × Ø ÓÛÒ´µ Ñ ÓÖ Ó ¿½¼
            ÇÖ Ò Ö Ô ÖØ Ö Ð Ô ¿¼
        }


      4.7.5   Aplicaciones de los heaps
      ÄÓ× Ô× ×ÓÒ ÑÙÝ ÑÔÓÖØ ÒØ × Ò × ØÙ ÓÒ × Ò Ð × Ù Ð × × Ö ÕÙ Ö Ñ ÒØ Ò Ö Ý ÓÒÓ Ö
      Ö Ô Ñ ÒØ ÐÓ× Ú ÐÓÖ × Ð Ñ Ø × ÙÒ ÓÒ ÙÒØÓ × ÙÒ Ð ÙÒ Ö Ø Ö Ó ÓÖ Ò × Ö¸
      ×Ù´×µ Ñ ÒÓÖ´ ×µ Ð Ñ ÒØÓ´×µ Ó ×Ù´×µ Ñ ÝÓÖ´ ×µº À Ý ÙÒ ÒØ × Ó × ÓÒ × Ò ÕÙ ×ØÓ ×
      Ò × Ö Óº        ÕÙ ÙÒ Ð ×Ø Ò ÓÑÔÐ Ø Ð × ÕÙ Ö ÑÓ× ×ÓÒ Ð × Ñ × ÔÓÔÙÐ Ö ×
         ½º Aritm´tica flotante Ô Ö Ð ÔÖ × ÓÒ ÔÙÒØÓ ­ÓØ ÒØ ¸ × Ö Ø Ó Ð ÓÖ Ò Ò ÕÙ
                    e
            × Ö Ð Ò Ð × ÓÔ Ö ÓÒ ×¸ Р٠и × ÒÙÒ Ò × Ö Ñ ÒØ ¸ ÓÖÖ ×ÔÓÒ ÓÒ Ð
             ÜÔÖ × Ó ÔÓÖ Ð ÔÖÓ Ö Ñ ÓÖº ÈÓÖ ÑÔÐÓ¸ Ð ×ÙÑ Ô Ö ÔÖ × ÓÒ × ÙÒ ÒÙÑ ÖÓ
            ÑÙÝ Ô ÕÙ ÒÓ × ×ÙÑ Ó ´Ó ÑÙÐØ ÔÐ Ò Óµ ÙÒÓ Ö Ò º ÍÒ ×ÕÙ Ñ           ÐØ ÔÖ ¹
              × ÓÒ Ñ ÒØ Ò Ò ÙÒ Ô ÐÓ× ÓÔ Ö Ò Ó׸ Ñ Ò Ö Ø Ð ÕÙ Ð ×ÙÑ ÔÖ Ú Ð ÐÓ×
            ÓÔ Ö Ò Ó× Ô ÕÙ ÒÓ׺
         ¾º Simulaci´n a eventos discretos ÑÙ × × ØÙ ÓÒ × Ð Ú Ö Ð × ÑÓ Ð Þ Ò Ý
                       o
             ×ØÙ Ò Ñ ÒØ Ú ÒØÓ× º ÖÓ××Ó ÑÓ Ó¸ ÙÒ Ú ÒØÓ × ÙÒ Ö ÔÖ × ÒØ ÓÒ Ó Ø Ú
                 Ð ÙÒ ×Ù ×Ó ÒØ Ö × ÒØÖÓ Ð × ØÙ ÓÒ ÕÙ × × ×ØÙ Öº ÓÑÓ Ó ØÓ¸
            ÙÒ Ú ÒØÓ Ø Ò Ó× ØÖ ÙØÓ× ÙÒ Ñ ÒØ Ð ×
4.7. Heaps                                                                    311



     ´ µ Ì ÑÔÓ Ó ÙÖÖ Ò teº
     ´µ       ÓÒ ÑÓ ¬ ÒØ ×Ó Ö Ð ×Ø Ó Ð × ×Ø Ñ ¸ Ð Ù Ð × Ú Ò Ð ÑÓ ¹
         ¬ ÓÒ Ð × Ú Ö Ð × Ð ÑÓ ÐÓ Ý¸ ×Ó Ö ØÓ Ó¸ Ò Ð Ò Ö ÓÒ ÒÙ ÚÓ×
           Ú ÒØÓ× Ò Ð ÙØÙÖÓº
    ÄÓ× × ×Ø Ñ × × ÑÙÐ ÓÒ Ñ ÒØ Ò Ò ÙÒ Ø ÑÔÓ × ÑÙÐ Ó ÓÖÖ ×ÔÓÒ ÒØ Ð Ø ÑÔÓ
     Ò ÕÙ ×      ÙØ Ð × ÑÙÐ ÓÒ Ð Ú ÒØÓ ØÙ к ÁÒ ÐÑ ÒØ ¸ × ÔÖÓ Ö Ñ Ò Ð ÙÒÓ×
     Ú ÒØÓ× Ò Ð ×        ÙØ Ö× Ò Ð ÙÒÓ× Ø ÑÔÓ× ¬ Ó׺ ÈÓÖ ÑÔÐÓ¸ ÓÒ× Ö ÑÓ×
    ØÖ × Ú ÒØÓ× Ò Ð ×        ÙØ Ö× Ò ØÖ × Ø ÑÔÓ×
                                                                          t
                       e1         e2                     e3

      Ð Ø ÑÔÓ × ÑÙÐ ÓÒ ÓÑ ÒÞ Ò Ð Ø ÑÔÓ te ¸ ÕÙ × Ù Ò Ó Ó ÙÖÖ Ö e1º ÄÓ×
                                                     1
     Ú ÒØÓ× × ÓÐÓ Ò Ò ÙÒ Ð ×Ø ÓÖ Ò ÔÓÖ Ø ÑÔÓº Ð × ÑÙÐ ÓÖ¸ × ×Ø Ñ Ø Ñ ÒØ ¸
     ÜØÖ       Ð Ð ×Ø Ð ÔÖÓÜ ÑÓ Ú ÒØÓ Ò Ð Ø ÑÔÓº ×ØÓ × ÐÓ Ñ Ö Ú ÐÐÓ×Ó ÙÒ
    × ÑÙÐ ÓÖ Ú ÒØÓ× × Ö ØÓ׸ ÔÙ × Ð Ø ÑÔÓ × × ÑÙÐ Ñ ÒØ ×ÔÐ Þ Ñ ÒØÓ×
       × Ö ØÓ× ÒØÖ ÐÓ× Ú ÒØÓ׸ Ý ÒÓ ÓÒØ ÒÙ Ñ ÒØ ÓÑÓ     Ò Ð Ú Ö Ðº
            Ú ÒØÓ Ò Ö ÒÙ ÚÓ× Ú ÒØÓ׸ ÙÝÓ× Ø ÑÔÓ× Ó ÙÖÖ Ò × ÓÒÓ Ò ÙÖ ÒØ
    Ð Ò Ö ÓÒº ËÙÔÓÒ ÑÓ× ÕÙ e1 Ò Ö ÐÓ× Ú ÒØÓ× e1 , e1 , e1 ¸ ÙÝÓ× Ø ÑÔÓ×
                                                              1   2   3
    Ó ÙÖÖ Ò × Ô ØÓÖ Þ Ò ×
                                                                          t
                       e1 e13 e12 e2           e11       e3

     Ç × ÖÚ ÑÓ× ÕÙ ÐÓ× ÒÙ ÚÓ× Ú ÒØÓ× e1 , e1 Ó ÙÖÖ Ö Ò ÒØ × ÕÙ e2 ×ØÓ ÕÙ Ö
                                       3   2
                                                                               Ö
     ÕÙ Ð ÔÖÓÜ ÑÓ Ú ÒØÓ × ÑÙÐ Ö × e1 Ý ÒÓ e2¸ Ù Ð Ö Ð ÕÙ ×Ø ÔÖÓ Ö Ñ Ó
                                       3
      ÒØ × × ÑÙÐ Ö e1º Ð × ÑÙÐ ÓÖ × Ô Ö Ø          ×ØÓ ÔÓÖÕÙ Ð Ð ×Ø ר ×ØÖ Ø ¹
     Ñ ÒØ ÓÖ Ò ÔÓÖ Ø ÑÔÓº Å ÒØ Ò Ö ÙÒ × Ù Ò ÓÖ Ò ÔÓÖ Ø ÑÔÓ ÒÓ ×ÓÐÓ
      × ÓרÓ×Ó Ò ÙÖ ÓÒ¸ × ÒÓ ÒÙØ и ÔÙ × ÐÓ ÕÙ Ò Ö Ð        × Ö ÕÙ Ö × ÓÒÓ Ö Ð
     ÔÖÓÜ ÑÓ Ú ÒØÓ Ñ × ÒÑ ØÓ Ò Ø ÑÔÓ × Ö¸ Ð Ñ ÒÓÖº
     Ä Ð ×Ø      Ú ÒØÓ× ÙÒ × ÑÙÐ ÓÖ × ÑÔÐ Ñ ÒØ Ñ ÒØ ÙÒ Ôº Ð × ÑÙ¹
     Ð ÓÖ ÜØÖ      Ð Ô Ð Ñ ÒÓÖ Ú ÒØÓ Ò Ð Ø ÑÔÓº Ð Ô Ô ÖÑ Ø ¸ Ø Ñ Ò¸
     × ÑÙÐ Ö ¬ ÒØ Ñ ÒØ Ð Ò Ð ÓÒ              ÙÒ Ú ÒØÓº È Ö ÐÐÓ¸ × Ù× Ð ÓÔ¹
      Ö ÓÒ sift down up()º
  ¿º C´digos de Huffman × Ö Ò ×ØÙ Ó× Ò Ü º½¿ ´Ô Ò ¿ ¿µº
       o

   º B´squeda Ò ÓÒØÖ Ö ÐÓ× m Ñ ÒÓÖ × Ð Ñ ÒØÓ× ÙÒ ÓÒ ÙÒØÓ
       u                                                                  Ö Ò Ð¹
         n     m ÔÓÖ   ÑÔÐÓ¸ ÓÒÓ Ö ÐÓ× 1000 Ñ ÒÓÖ × Ð Ñ ÒØÓ× ÒØÖ ÙÒ ÓÒ ÙÒØÓ
     109 Ð Ú ×º  Ò ×Ø ×Ó¸ ×       Ù× Ö ÙÒ      Ô ¬Ò ØÓ × Ö¸ ÙÒÓ ÙÝ Ô
      ר Ð Ñ Ø      mº   Ñ       ÕÙ Ð Ô × Ú ØÙ Ð Þ Ò Ó¸ ×               ÓÒÓ Ö Ð
     Ñ ÝÓÖ Ð Ñ ÒØÓ ÒØÖ ÐÓ× m ÐÑ Ò Ó׸ Ñ Ò Ö Ø Ð ÕÙ ×Ø × ×Ù ×Ø ØÙ Ó
     ÔÓÖ Ð ÒÙ ÚÓ Ñ ÒÓÖ Ò ÓÒØÖ Óº
   º Procesamiento ordenado: Ò Ò Ö Ð¸ ØÓ × ØÙ ÓÒ Ò Ð Ù Ð × Ö ÕÙ Ö ÔÖÓ ¹
     × Ö ÔÖ Ñ ÖÓ Ð Ñ ÒÓÖ Ð Ñ ÒØÓ¸ × ÑÙÝ ×Ù× ÔØ Ð           ÓÒ× Ö Ö ÙÒ Ôº
312                                                        Cap´        ´
                                                                    ıtulo 4. Arboles



      4.7.6    El TAD BinHeap<Key>
      À Ý × ØÙ ÓÒ × Ð ÓÖ ØÑ ׸ ×Ó Ö ØÓ Ó ÕÙ ÐÐ × ÕÙ ×Ô Ö Ò Ò Ö Ð ¸ Ò Ð × Ù Ð × ÒÓ
      × Ø Ò         Ü Ø Ð ÒØ             Ð Ñ ÒØÓ× ÕÙ × ÔÖÓ × Ö Òº ר × ÓÒÓ Ñ ÒØÓ¸
       ÙÒ Ó Ð × Ð ¸ ÔÙ         ÓÑÔÐ Ö Ý ÓÑÔÖÓÑ Ø Ö ÓÒ× Ö Ð Ñ ÒØ Ð Ù×Ó ÙÒ ÖÖ ¹
       ÐÓ¸ Ô٠׸ Ð Ñ ÒÓ× ÒÙ ×ØÖ ÑÔÐ ÒØ ÓÒ ArrayHeap<Key>¸ Ö ÕÙ Ö ÕÙ ÓÒÓÞ ÑÓ× ×Ù
        Ñ Ò× ÓÒº Ë Ð Ñ Ò× ÓÒ × ÑÙÝ Ö Ò Ý × Ù× Ò Ú Ö Ó× Ô× ´ÐÓ Ù Ð ÔÙ × Ö Ð
         ×Ó Ò Ð ÓÖ ØÑÓ× ×Ó Ö Ö Ó×µ¸ ÒØÓÒ × × ÔÙ Ò ÙÖÖ Ö Ò ÙÒ ×Ô Ö Ó Ñ ÑÓÖ
       ÑÔÓÖØ ÒØ º Ë Ð Ñ Ò× ÓÒ × Ô ÕÙ Ò ¸ ÒØÓÒ × × ÔÙ × Ö ¬ Ö ÔÖÓ × Ñ ÒØÓ
       ÐØ × Ð º Ò ×ØÓ× Ø ÔÓ× × ØÙ ÓÒ × ×            ÓÒ× Ö Ö ÙÒ Ô ÐØ Ñ ÒØ Ò Ñ Ó
      ÕÙ ÓÒ×ÙÑ Ñ ÑÓÖ Ü Ø Ñ ÒØ ÔÖÓÔÓÖ ÓÒ Ð Ð ÒØ                   Ð Ñ ÒØÓ× ÕÙ Ñ Ò º
          ÍÒ ÐØ ÖÒ Ø Ú ¸ Ð        Ò Ö Ó¸ Ø ÒØÓ Ò ×ØÙ Ó ÓÑÓ Ò × ÒÓ ÑÔÐ ÒØ ÓÒ¸
       × ÙØ Ð Þ Ö ÖÖ ÐÓ× Ò Ñ Ó× Ð Ø ÔÓ DynArray<T> × ÖÖÓÐÐ Ó Ò Ü ¾º½º ´Ô Ò ½µº
        ר Ú Ö ÒØ ¸ ÙÒÕÙ Ñ × ­ Ü Ð ÕÙ Ð Ñ ÖÓ ÖÖ ÐÓ ×Ø Ø Ó¸ Ø Ñ Ò ÔÙ Ò ÙÖÖ Ö Ò
      ÐÓ× Ñ ×ÑÓ× ÔÖÓ Ð Ñ ×¸ ÔÙ × × Ø Ò ÙÒ ×Ô Ö Ó          Ó Ð × ÒØÖ × ÒÓ Ù× × Ð
        Ö ØÓÖ Ó¸ × Ñ ÒØÓ Ý ÐÓÕÙ º
          ÍÒ ×Ú ÒØ          ÑÔÐ Ñ ÒØ Ö ÙÒ Ô Ñ ÒØ ÙÒ ÖÖ ÐÓ × ÕÙ ¸ ÔÙ ×ØÓ ÕÙ ÐÓ×
       Ð Ñ ÒØÓ× × ÑÙ Ú Ò¸ ÒÓ × ÔÙ Ò Ñ ÒØ Ò Ö ÔÙÒØ ÓÖ × ×Ó Ö ÐÐÓ׺ ר Ò ÓÒÚ Ò ÒØ
      ÔÙ Ô Ð Ö× × Ò Ð ArrayHeap<Key> Ù Ö ÑÓ× ÔÙÒØ ÖÓ× Ø Ô Ó× ÐÓ× ØÓ× Ý ÔÖÓ¹
       Ö Ñ ÑÓ× Ð Ð ×         ÓÑÔ Ö ÓÒ Ô Ö ÕÙ ÓÔ Ö ×Ó Ö ÔÙÒØ ÖÓ× Ø Ô Ó׺ È ÖÓ ×ØÓ
       ÓÒ×ÙÑ ×Ô Ó Ý ÙÖ ÓÒ           ÓÒ Ð ×     Ó Ð ÔÙÒØ ÓÖ ÜØÖ Ý ×Ù Ö Ö Ò º
            Ò × × ÓÒ × ÖÖÓÐÐ Ö ÑÓ× ÙÒ ×ÓÐÙ ÓÒ ×                 Ò ÒÓ Ó× Ò Ö Ó× Ð
      Ø ÔÓ BinNode<Key> Ý ¬Ò Ò Ð Ö ÚÓ
¿½¾    ØÔÐ ÒÀ ÔºÀ ¿½¾ ≡
            ¬Ò ÓÒ ÒÓ Ó BinHeap<Key> ¿½
           template <template <class> class NodeType,
                     typename Key,
                     class Compare = Aleph::less<Key> >
       class GenBinHeap
       {
         typedef NodeType<Key> Node;
           ØÖ ÙØÓ× BinHeap<Key> ¿½¿
          Å Ñ ÖÓ× ÔÖ Ú Ó× BinHeap<Key> ¿½
          Å Ñ ÖÓ× ÔÙ Ð Ó× BinHeap<Key> ¿½
       };
           template <class Key, typename Compare = Aleph::less<Key> >
       class BinHeap : public GenBinHeap<BinHeapNode, Key, Compare>
       {
         typedef BinHeapNode<Key> Node;
       };
           template <class Key, typename Compare = Aleph::less<Key> >
       class BinHeapVtl : public GenBinHeap<BinHeapNodeVtl, Key, Compare>
       {
         typedef BinHeapNodeVtl<Key> Node;
       };
         GenBinHeap<NodeType, Key, Compare ÑÔÐ ÒØ     ÙÒ Ô Ò Ö Ó Ñ ÒØ ÒÓ Ó× ¹
      Ò Ö Ó× Ø ÔÓ NodeTypeº BinHeap<Key, Compare>     Ý BinHeapVtl<Key, Compare> ×ÓÒ
       ×Ô     Ð Þ ÓÒ × Ô Ö Ñ Ò Ö Ó ÒÓ ×ØÖÙ ØÓÖ × Ú ÖØÙ Ð × Ò ÐÓ× ÒÓ Ó׺
4.7. Heaps                                                                          313



           ÈÙ ×ØÓ ÕÙ ÙÒ Ô Ò Ö Ó × ÙÒ Ö ÓÐ Ò Ö Ó¸ × Ô Ò× Ö ÕÙ Ð Ø ÔÓ BinNode<Key>
         ר Ô Ö ÑÔÐ Ñ ÒØ Ö ÙÒ Ô ÐØ Ñ ÒØ Ò Ñ Ó Ô ÖÓ Ý Ó× ¬ ÙÐØ ×
          ½º Ð Ì BinNode<Key> ÒÓ Ø Ò Ñ Ó Ö ØÓ ÓÒÓ Ö Ð Ô Ö ¸ Ð Ù Ð × Ö ÕÙ Ö
              Ò Ð ÓÔ Ö ÓÒ × sift up() Ý sift down()º
             À Ý Ó× Ñ Ò Ö × ×ÓÖØ Ö ×Ø Ó ×Ø ÙÐÓº Ä ÔÖ Ñ Ö × Ñ ÒØ ÙÒ Ô Ð
             ÕÙ Ù Ö Ð Ñ ÒÓ                 ×Ó × Ð Ö Þ ×Ø Ð ÒÓ Ó ×Ó Ö Ð Ù Ð × ¹
              ÙØ sift up() Ó sift down()º Ä × ÙÒ ÓÒ× ×Ø Ò Ñ ÒØ Ò Ö¸ ÔÓÖ                 ÒÓ Ó¸
             ÙÒ ÔÙÒØ ÖÓ      ÓÒ Ð Ð Ô Ö º
               Ð ÔÖ Ñ Ö Ò ÓÕÙ Ø Ò Ð Ú ÒØ            ÕÙ ÓÒ×ÙÑ Ñ ÒÓ× ×Ô Ó ÕÙ Ð × ÙÒ Ó¸
             Ô ÖÓ Ð Ñ Ò Ó Ð Ô Ð × Ð Ö Þ ×Ø Ð ÒÓ Ó ÓÔ Ö ÓÒ ÓÒ×ÙÑ ÙÒ
             Ø ÑÔÓ O(Ð (n))º
          ¾º Ù Ò Ó Ó ÙÖÖ ÙÒ Ò× Ö ÓÒ Ó Ð Ñ Ò ÓÒ¸ × Ò × Ö Ó                Ö Ð Ô Ö Ð ÒÓ Ó
             Ñ× Ð Ö              Ð ÙÐØ ÑÓ Ò Ú Ð¸ ÔÙ × ÔÙ Ö ÕÙ Ö Ö× ØÙ Ð Þ Ö ×Ù× ÒР׺
             Ë last Ð ÒÓ Ó Ñ × Ð Ö                Ð ÙÐØ ÑÓ Ò Ú Ðº ÓÑÓ ÓÒÓ Ö ×Ø ÒÓ Ó Ý ×Ù
             Ô Ö È Ö Ø ÑÓ×ÒÓ× ÕÙ last Ý ×Ù Ô Ö ÔÙ Ò Ñ Ö                       Ú Þ ÕÙ Ó ÙÖÖ
             ÙÒ ÑÓ ¬ ÓÒ ×Ó Ö           Ôº
             ÍÒ Ò ÓÕÙ Ô Ö Ø ÖÑ Ò Ö last ÓÒ× ×Ø Ò Ú Ö ×Ù × Ú Ñ ÒØ Ð Ú ÐÓÖ                    Ö¹
                ÒÐ       Ð Ôº Ë Ð Ö Ò Ð              × n¸ ÒØÓÒ × n ÑÓ 2 ÒÓ× Ò × last
              × Ó ÞÕÙ Ö Ó Ó Ö Óº ËÙ × Ú Ñ ÒØ ¸ n ÑÓ 4 ÒÓ×                × Ð Ô Ö last
              × × Ò ÒØ ÞÕÙ Ö Ó Ó Ö Óº Ð ÔÖÓ Ñ ÒØÓ × Ö Ô Ø ×Ø Ð ÒÞ Ö Ð
             Ö Þ × Ö¸ ר ÕÙ n/i = 1º Ò ×Ø ÑÓÑ ÒØÓ¸ Ø Ò ÑÓ× Ð ÒÙÑ ÖÓ                      Û Ý¸
              ÒÚ ÖØ Ó¸ last ݸ Ô ÖØ Ö Ð¸ ØÓ ×Ù × Ò Ò º
               Ð Ð ÙÐÓ ÒØ Ö ÓÖ × O(Ð (n))¸ Ø ÒØÓ Ò ×Ô Ó ÓÑÓ Ò ÙÖ ÓÒº ÈÙ Ö Ô Ò¹
             × Ö× ÕÙ Ð Ñ ÒØ Ò Ö Ô ÖÑ Ò ÒØ Ñ ÒØ Ð × Ù Ò                ÛÝ        last¸ ÓÖÖ
             Ø ÑÔÓ¸ Ô ÖÓ¸ Ò Ð Ô ÓÖ ×Ó¸ ÔÙ × Ö Ò × Ö Ó ØÙ Ð Þ ÖÐ ×Ø Ð Ö Þ Ý ×ØÓ
              Ù ×Ø O(Ð (n))º
            Ò ÒÙ ×ØÖÓ × ÒÓ ØÖ Ò× Ö ÑÓ× ÔÓÖ Ð Ö Ô Þº È Ö ×ÓÖØ Ö Ð ÔÖ Ñ Ö Ó ×Ø ÙÐÓ¸
      Ù× Ö ÑÓ× ÙÒ ÔÙÒØ ÖÓ Ð Ô Ö ¸ Ð Ù Ð ÔÓ× Ð Ø ØÓ Ó Ð ÓÒØ ÜØÓ Ô Ö Ð × ÓÔ Ö ÓÒ ×
           ÒØ Ö Ñ Ó ÒØÖ Ò Ú Ð × Ö ÕÙ Ö × ÔÓÖ sift up() Ý sift down()º
           È Ö Ú Ø Ö Ð × ÙÒ Ó Ó ×Ø ÙÐÓ¸ ÔÖÓÚ Ö ÑÓ× ÐÓ× n + 1 ÔÙÒØ ÖÓ× ÒÙÐÓ× Ð Ô
      Ô Ö Ñ ÒØ Ò Ö ÙÒ Ð ×Ø ¸ Ó Ð Ñ ÒØ ÒÐ Þ ¸ Ö ÙÐ Ö¸ ÐÓ× ÒÓ Ó× ÓÖ                 ÐÓ× ÙÐØ ÑÓ×
      Ò Ú Ð × × Ö¸ ÙÒ Ð ×Ø ÓÒ ÓÖÑ ÔÓÖ ÐÓ× ÒÓ Ó× Ó × Ý¸ Ú ÒØÙ ÐÑ ÒØ ¸ Ð ÒÓ Ó
      Ô Ö last¸ Ð Ù Ð × Ò ÓÑÔÐ ØÓ Ù Ò Ó last × Ó ÞÕÙ Ö Óº ÍÒ Òר Ò                         ר
       רÖÙ ØÙÖ         ØÓ× ÔÙ Ô ØÓÖ Þ Ö× ÓÑÓ Ò Ð ¬ ÙÖ º¾ º last × ÑÔÖ ÔÙÒØ Ð
      ÒÓ Ó Ñ × Ð Ö             Ð ÙÐØ ÑÓ Ò Ú Ðº head × ÙÒ ÒÓ Ó       Ö ¸ ÒØ Ò Ð ¸ ÕÙ Ô ÖÑ Ø
      ØÖ Ø Ö Ñ Ò Ö Ò Ö Ð Ð ÒØ Ö Ñ Ó ÒØÖ Ð Ö Þ Ý Ð ÙÒÓ ×Ù× Ó× Ó׺ root ×
      ÙÒ ÔÙÒØ ÖÓ Ö Ö Ò ¸ Ô ÖÑ Ò ÒØ ¸ Ð Ö Þ¸ ÕÙ ×                  Ö      headº Ê ÕÙ Ö ÑÓ׸
       ÒØÓÒ ×¸ ÐÓ× × Ù ÒØ × ØÖ ÙØÓ× Ô Ö Ð Ì BinHeap<Key>
¿½¿      ØÖ ÙØÓ× BinHeap<Key> ¿½¿ ≡                                       ´¿½¾µ
          Node      head_node;
          Node *    head;
          Node *&   root;
          Node *    last;
          size_t    num_nodes;
314                                                                   Cap´        ´
                                                                              ıtulo 4. Arboles



                          head
                                                    1
                                 root


                             2                                                    3




                4                        5                      6                         7




           8          9           10           11       12          last




                          ÙÖ º¾ Ê ÔÖ × ÒØ ÓÒ Ð Ì             BinHeap<Key>


     Ð ÙÐØ ÑÓ ØÖ ÙØÓ¸ num nodes¸ ÓÒØ Ð Þ Ð Ö Ò Ð                    Ð      Ôº
       ÍÒ BinHeap<Key> × Ò Ð Þ Ý ¬Ò Ð Þ ×
¿½   Å Ñ ÖÓ× ÔÙ Ð Ó× BinHeap<Key> ¿½ ≡                                  ´¿½¾µ ¿½
       GenBinHeap() : head(&head_node), root(RLINK(head)), last(&head_node), num_nodes(0)
       { /* empty */ }
       virtual ~GenBinHeap() { /* Empty */ }
        Ä × ÓÒ× Ö ÓÒ ×  × ÒÓ ÒØ Ö ÓÖ × ÒÓ× ÐÐ Ú Ò              ÓÐÓ Ö Ð × Ù ÒØ Ò ÓÖÑ ÓÒ
         ÓÒ Ð ÔÓÖ ÒÓ Ó
¿½      ¬Ò ÓÒ ÒÓ Ó BinHeap<Key> ¿½ ≡                                             ´¿½¾µ
       class BinHeapNode_Data
       {
         struct Control_Fields // Definici´n de banderas de control
                                          o
         {
           int is_leaf : 4; // true si el nodo es hoja
           int is_left : 4; // true si el nodo es hijo izquierdo
         };
         BinHeapNode_Data * pLink; // puntero al padre
         Control_Fields control_fields;
         BinHeapNode_Data() : pLink(NULL)
         {
           control_fields.is_leaf = true;
           control_fields.is_left = true;
         }
         BinHeapNode_Data *& getU() { return pLink; }
         Control_Fields & get_control_fields() { return control_fields; }
       };
       DECLARE_BINNODE(BinHeapNode, 64, BinHeapNode_Data);
     Í× × DECLARE BINNODE ¾ º
         ר Ð × ÒÓ Ó Ùר ¬ ¬Ò Ö ÐÓ× Ñ ÖÓ× × Ù ÒØ ×             ÚÓÖ         Ð Ð        Ð   Ó Ó
¿½      ¬Ò ÓÒ Ñ ÖÓ× BinHeap<Key> ¿½ ≡
       # define PREV(p)          (p->getL())
       # define NEXT(p)          (p->getR())
4.7. Heaps                                                                     315



      #   define   ULINK(p)        reinterpret_cast<Node*&>((p)->getU())
      #   define   IS_LEAF(p)      ((p)->get_control_fields().is_leaf)
      #   define   IS_LEFT(p)      ((p)->get_control_fields().is_left)
      #   define   CTRL_BITS(p)    ((p)->get_control_fields())
        Ë IS LEAF(p) == true¸ ÒØÓÒ × NEXT(p) Ý PREV(p) ÓÒØ Ò Ò Ð ×Ù ×ÓÖ Ý ÔÖ    ×ÓÖ
       Ð Ð ×Ø      Ó ×º Ë ¸ ÔÓÖ Ð ÓÒØÖ Ö Ó¸ IS LEAF(p) == false¸ ÒØÓÒ × ÐÓ× Ñ ×ÑÓ×
      ÑÔÓ× × Ù× Ò ÓÑÓ LLINK(p) Ý RLINK(p)º
        Å ÒØ Ð ÑÔÓ IS LEAF(p) ÔÓ ÑÓ× Ø ÖÑ Ò Ö × p Ô ÖØ Ò Ó ÒÓ Ð Ð ×Ø
     ÒÐ Þ
¿½   Å Ñ ÖÓ× ÔÖ Ú Ó× BinHeap<Key> ¿½ ≡                       ´¿½¾µ ¿½
      static bool is_in_list(Node * p)
      {
        if (IS_LEAF(p))
          return true;
        return ULINK(LLINK(p)) == RLINK(LLINK(p));
      }
       Ð × ÙÒ Ó return Ú Ö ¬ × p × Ð Ô Ö last Ý ×Ø × ×Ù Ó ÞÕÙ Ö Ó ½ º
      ÇØÖÓ ÔÖ     Ó ÕÙ Ö ÕÙ Ö Ö ÑÓ× × ÓÒÓ Ö × ÙÒ ÒÓ Ó Ø Ò Ó ÒÓ ÙÒ ÖÑ ÒÓ
¿½   Å Ñ ÖÓ× ÔÖ Ú Ó× BinHeap<Key> ¿½ +≡             ´¿½¾µ ¿½ ¿½
      static bool has_sibling(Node * p)
      {
        return ULINK(p) != RLINK(p);
      }
          Í× ÑÓ× ×Ø Ñ ØÓ Ó ÔÓÖÕÙ ÓÔ Ö ÙÒ ×           p   × Ô ÖØ   Ð Ð ×Ø ÒÐ Þ   º
     4.7.6.1   Intercambio entre nodos

     ÉÙ Þ Ð ÖÙØ Ò × Ò Ð ÒÙ ×ØÖ ÑÔÐ ÒØ ÓÒ × Ð ÕÙ ÒØ Ö Ñ Ó× ÒÓ Ó× Ò Ú Ðº
     ÄÐ Ñ Ö ÑÓ× ×Ø ÖÙØ Ò swap with parent(p)¸ Ý ×Ù Ñ × ÓÒ × ÒØ Ö Ñ Ö Ð ÒÓ Ó p
       ÓÒ ×Ù Ô Ö º ר × Ð ÖÙØ Ò Ñ × ÓÑÔÐ               Ð ÑÔÐ ÒØ ÓÒ ÔÓÖÕÙ Ð ÒØ Ö Ñ Ó
             ר Ò Ù Ö ÐÓ× ×Ó× Ô ÖØ ÙÐ Ö × Ò ÐÓ× Ù Ð × p ÒÓ Ø Ò Ù ÐÓ ´ Ù Ò Ó ×ÓÐÓ Ý Ó×
     Ó ØÖ × ÒÓ Ó×µ Ý Ð ×Ó Ò ÕÙ p ר Ò ÙÐØ ÑÓ Ò Ú Ð¸ × ØÙ ÓÒ Ò Ð Ù Ð p × Ô ÖØ Ð
     Ð ×Ø º
         Ä ÖÙØ Ò swap with parent() × ×Ø ÒØ ÓÑÔÐ               Ý ÒÓ × ÑÙ ×ØÖ Ò ×Ø Ø ÜØÓ
     ´ ÐÐ ÔÙ Ü Ñ Ò Ö× Ò Ð Ð ÓØ µº swap with parent() ÓÔ Ö Ò Ô Ò ÒØ Ñ ÒØ
         Ð × ØÙ ÓÒ p ÒØÖÓ Ð Ôº ÈÓ ÑÓ׸ Ô٠׸ ÑÔÐ ÖÐ Ô Ö                      ØÙ Ö ÐÓ× Ò¹
     Ø Ö Ñ Ó× Ö ÕÙ Ö Ó× ÔÓÖ sift up() Ý sift down()¸ Р٠Р׸ ÙÒ Ú Þ Ö Ð Þ Ð ÓÔ¹
       Ö ÓÒ swap with parent()¸ ×ÓÒ ÑÙ Ó Ñ × × ÑÔÐ × ÕÙ ×Ù ÓÒØÖ Ô ÖØ ÓÒ ÖÖ ÐÓ×
¿½    Å Ñ ÖÓ× ÔÖ Ú Ó× BinHeap<Key> ¿½ +≡                     ´¿½¾µ ¿½ ¿½
      virtual void sift_up(Node * p)
      {
        while (p != root and Compare() (KEY(p), KEY(ULINK(p))))
          swap_with_parent(p);
      }
      virtual void sift_down(Node * p)
      {
      ½
          È Ö ÔÖ    Ò Ö ×Ø   ×Ó¸      ÙØ × Ð ÖÙØ Ò ÓÒ p=6 Ò Ð ¬ ÙÖ º¾ º
316                                                            Cap´        ´
                                                                       ıtulo 4. Arboles



           while (not IS_LEAF(p))
             {
               Node * cp = LLINK(p); // guarda el menor hijo de p
               if (has_sibling(cp))
                 if (Compare() (KEY(RLINK(p)), KEY(LLINK(p))))
                   cp = RLINK(p);
               if (Compare() (KEY(p), KEY(cp)))
                 return;
               swap_with_parent(cp);
             }
      }


     4.7.6.2    Inserci´n en BinHeap<Key>
                       o

     Ä ÖÙØ Ò sift up() ÒÓ× Ô ÖÑ Ø ×Ô ¬ Ö Ð ÔÖ Ñ Ö ÖÙØ Ò ÔÙ Ð               BinHeap<Key>
     Ð Ò× Ö ÓÒ¸ Ð Ù Ð × ¬Ò Ð × Ù ÒØ ÑÓ Ó
¿½    Å Ñ ÖÓ× ÔÙ Ð Ó× BinHeap<Key> ¿½ +≡            ´¿½¾µ ¿½          ¿½
      Node * insert(Node * p)
      {
        if (root == NULL) // ¿heap est´ vac´o?
                                       a   ı
          { // S´, inicialice
                ı
            root       = p;
            LLINK(p)   = RLINK(p) = p;
            ULINK(p)   = head;
            IS_LEAF(p) = true;
            IS_LEFT(p) = false; /* root is right child of header node */
            last      = root;
            num_nodes = 1;
            return p;
          }
                   // inserci´n general
                              o
        Node * pp = RLINK(last); // padre de actual last
        LLINK(p) = last;
        ULINK(p) = pp;
        if (IS_LEFT(last))
          { // p ser´ hijo derecho
                    a
            IS_LEFT(p)       = false;
            RLINK(p)         = RLINK(pp);
            LLINK(RLINK(pp)) = p;
            RLINK(pp)        = p;
          }
        else
          { // p ser´ hijo izquierdo
                    a
            IS_LEFT(p) = true;
            RLINK(p)   = pp;
            IS_LEAF(pp) = false; // si p es izquierdo ==> pp era hoja
            LLINK(pp)   = p;
          }
        RLINK(last) = p;
        last        = p;
        num_nodes++;
4.7. Heaps                                                                    317



          sift_up(last);
          return p;
      }


     4.7.6.3   Eliminaci´n del m´
                        o       ınimo elemento de un BinHeap<Key>

     È Ö Ð Ð Ñ Ò ÓÒ ÔÓÖ Ð Ö Þ¸ ÔÐ ÑÓ× Ð Ñ ×Ñ ×ØÖ Ø      ÜÔÐ       Ò Ü º º¾ ´Ô Ò ¿¼ µ
      ÒØ Ö Ñ Ö Ð Ö Þ ÔÓÖ last Ý ÐÙ Ó ÓÖØ Ö ÔÓÖ lastº È Ö ÐÐÓ¸ ÒÓ× Ú Ð ÑÓ× Ò ÔÖ Ñ Ö
     ÐÙ Ö ÙÒ ÖÙØ Ò swap root with last()¸ ÙÝ Ñ × ÓÒ × ÒØ Ö Ñ Ö Ð Ö Þ ÓÒ last
     Ý ÕÙ ÒÓ × ÑÙ ×ØÖ Ò ×Ø Ø ÜØÓ ´ ÐÐ Ø Ñ Ò ÔÙ × Ö Ü Ñ Ò          ÒÐ      Ð ÓØ µº
         È ØÓÖ Ñ ÒØ ¸ swap root with last()¸ Ò Ú Ð ÐÓ× ÒÓ Ó׸ ÒÓ ×Ù× ÓÒØ Ò Ó׸
     Ö Ð Þ Ð × Ù ÒØ ÓÔ Ö ÓÒ
                                           ÖÓÓØ

                                                last

        ÐØ ÓÖØ Ö Ð ÒÓ Ó Ñ × Ð Ö                 Ð ÙÐØ ÑÓ Ò Ú Ð¸ ÐÓ Ù Ð × Ö Ð Þ ×
¿½   Å Ñ ÖÓ× ÔÖ Ú Ó× BinHeap<Key> ¿½      +≡              ´¿½¾µ   ¿½   ¿½
      Node * remove_last()
      {
        Node * ret_val = last;
        Node * pp       = ULINK(last);
        Node * new_last = LLINK(last);
        if (IS_LEFT(last))
          {
            IS_LEAF(pp) = true;
            LLINK(pp)   = new_last;
          }
        else
          {
            RLINK(pp)          = RLINK(last);
            LLINK(RLINK(last)) = pp;
          }
        RLINK(LLINK(last)) = pp;
        last = new_last;
        num_nodes--;
        ret_val->reset();
        return ret_val;
      }
         ר Ñ ÕÙ Ò Ö ÒÓ× Ô ÖÑ Ø     ¬Ò Ö getMin() Ü Ø Ñ ÒØ ÓÑÓ ÜÔÐ                   Ó
     Ò Ü º º¾ ´Ô Ò ¿¼ µ × Ö¸ ÒØ Ö Ñ Ö root ÓÒ last¸ ÐÙ Ó ÓÖØ Ö ÔÓÖ last
¿½   Å Ñ ÖÓ× ÔÙ Ð Ó× BinHeap<Key> ¿½ +≡           ´¿½¾µ ¿½ ¿½
      Node * getMin()
      {
        Node *ret_val = root;
        if (num_nodes == 1)
          {
            root = NULL;
318                                                            Cap´        ´
                                                                       ıtulo 4. Arboles



               ret_val->reset();
               num_nodes = 0;
               return ret_val;
             }
           swap_root_with_last();
           remove_last();
           sift_down(root);
           ret_val->reset();
           return ret_val;
      }


     4.7.6.4    Actualizaci´n en un heap
                           o

      Ð Ù Ð ÕÙ ÓÒ ArrayHeap<Key>¸ × ÔÐ Ù× Ð ÑÓ ¬ Ö Ð Ú ÐÓÖ ÔÖ ÓÖ                     ÙÒ ÒÓ Ó
     Ô ÖØ ÙÐ Öº Ò ×Ø ×Ó¸ ØÙ ÑÓ× Ð Ñ ×Ñ ÓÖÖ ÓÒ
¿½    Å Ñ ÖÓ× ÔÙ Ð Ó× BinHeap<Key> ¿½ +≡          ´¿½¾µ ¿½ ¿½
      void update(Node * p)
      {
        sift_down(p);
        sift_up(p);
      }


     4.7.6.5    Eliminaci´n de cualquier elemento en un BinHeap<Key>
                         o

     ÉÙ Þ ÙÒ Ð × ÓÔ Ö ÓÒ × ÕÙ Ñ × Ó Ö × ÒØ Ó ÓÒ ×Ø Ø ÔÓ ÑÔÐ ÒØ ÓÒ                      Ô
      ×Ð        Ð Ñ Ò Ö¸ Ö ØÖ Ö Ñ ÒØ ¸ Ù ÐÕÙ Ö Ð Ñ ÒØÓ¸           Ð Ö ÓÒ Ð ÒÓ Óº ÍÒ
        ÑÔÐÓ ×Ø × ØÙ ÓÒ × Ð Ò Ð ÓÒ ÙÒ Ú ÒØÓ¸ Ø ÒØÓ Ò ÙÒ × ×Ø Ñ × ÑÙÐ ÓÒ
        Ú ÒØÓ× × Ö ØÓ׸ ÓÑÓ Ò ÙÒ Ñ Ò ÓÖ Ú ÒØÓ× Ò Ø ÑÔÓ Ö Ð ½ º Ò ×Ø ×Ó¸ Ø ¹
     Ò Ò Ó ÙÒ ÔÙÒØ ÓÖ Ð Ú ÒØÓ¸ Ù Ð ÔÙ ¸ ÔÓÖ ÑÔÐÓ¸ Ö Ú Ö BinHeap<Time>::Node¸
     ÔÙ      Ð Ñ Ò Ö× Ð Ô Ù ÐÕÙ Ö Ð Ñ ÒØÓ׺
          × ÓÒÚ Ò ÒØ Ö Ð Þ Ö ÕÙ Ò Ð ÑÔÐ ÒØ ÓÒ Ð Ô ÓÒ ÖÖ ÐÓ׸ ר ÓÔ Ö ÓÒ
     Ö ÕÙ Ö ÙÒ ÖÖ            Ö    ÕÙ × O(n)º
         È Ö Ð Ñ Ò Ö node × ÓÔ Ö Ô Ö Ó ×Ù ÓÒØÖ Ô ÖØ ArrayHeap<Key> ´½µ × ¹
     × ÒÐ Þ last Ð Ö ÓÐ Ý × Ö ×Ô Ð Ò ÙÒ Ú Ö Ð p ×ØÓ × Ö Ð Þ ÓÒ Ð ÓÔ Ö ÓÒ¸
     Ý ¬Ò ¸ remove last()º ÄÙ Ó¸ ´¾µ × ×Ù ×Ø ØÙÝ Ð ÒÓ Ó Ð Ñ Ò Ö node ÔÓÖ p ݸ
     ¬Ò ÐÑ ÒØ ¸ ×       ÙØ sift down() Ý sift up() Ô Ö Ùר Ö Ð ÔÖÓÔ           ÓÖ Òº
          Ð Ô ×Ó ´¾µ       Ð ÓÔ Ö ÓÒ ÒØ Ö ÓÖ × Ú Ð Ð ÓÔ Ö ÓÒ replace node(Node *
     node, Node * new node)¸ ÙÝÓ ÖÓÐ × Ö ÑÔÐ Þ Ö ÒØÖÓ Ð Ö ÓÐ Ò Ö Ó Ð ÒÓ Ó node
     ÔÓÖ new nodeº ÌÓ Ó Ð ÓÒØ ÜØÓ Ò × Ö Ó ×Ø          Ó¸ ÔÙ ×      ÒÓ Ó ÓÒØ Ò ÙÒ ÔÙÒØ ÖÓ
       ×Ù Ô Ö º ר ÓÔ Ö ÓÒ ÔÙ           ÓÒ×ÙÐØ Ö× Ò Ð     Ð ÓØ º
            ÓÖ ¸ ×ÓÐÓ ÒÓ× Ö ×Ø Ö Ñ Ø ÖÒÓ× Ð Ø Ò ÜÔÐ            Ô Ö ÑÔÐ ÒØ Ö Ð Ð Ñ Ò ÓÒ
        ÙÒ ÒÓ Ó node
¿½    Å Ñ ÖÓ× ÔÙ Ð Ó× BinHeap<Key> ¿½ +≡                      ´¿½¾µ ¿½ ¿¾¼
      Node * remove(Node * node) throw(std::exception, std::underflow_error)
      {
      ½
          Ò ALEPH¸ Ü ×Ø ÙÒ Ì ¸ ÐÐ Ñ Ó TimeoutQueue¸ ÙÝÓ ¬Ò × ÑÓ Ð Þ Ö ÙÒ Ñ Ò    ÓÖ     Ú ÒØÓ×
     ÔÖÓ Ö Ñ Ó× ÔÓÖ Ð Ö ÐÓ Ð × ×Ø Ñ º Ä ÑÔÐ ÒØ ÓÒ TimeoutQueue     Ù×Ó Ð Ì     BinHeap<Key>
     Ý Ó Ö ¸ ÒØÖ ×Ù× ÙÒ ÓÒ ×¸ Ð Ò Ð ÓÒ ÙÒ Ú ÒØÓ ÔÖ Ú Ñ ÒØ ÔÖÓ Ö Ñ Óº
4.7. Heaps                                                                   319



          if (node == root)
            return getMin();
          if (node == last)
            return remove_last();
          Node * p = remove_last();
          if (node == last)
            {
              remove_last();
              insert(p);
              return node;
            }
          replace_node(node, p);
          update(p);
          node->reset();
          return node;
      }


     4.7.6.6   Destrucci´n de BinHeap<Key>
                        o

       Ð Ù Ð ÕÙ ÓÒ ÓØÖÓ× Ò ÓÕÙ × ×ÓÐÙ ÓÒ Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð ÕÙ ÑÓ× ×ØÙ ¹
        Ó ×Ø Ð ÔÖ × ÒØ ¸ Ò ÐÙ Ö Ñ Ò Ö Ö Ø Ñ ÒØ Ð × Ð Ú × Ð ÓÒ ÙÒØÓ¸ Ð Ì
     BinHeap<Key> Ñ Ò         ÐÓ× ÒÓ Ó× ÕÙ Ð × ÓÒØ Ò Òº Ð Ñ ×ÑÓ ÑÓ Ó¸ Ò ÙÒ ÓÒ Ð ÔÖ Ò¹
       Ô Ó ¬Ò¹ ¹¬Ò¸ ÓØÖÓ Ì ¸ Ò ÒÙ ×ØÖÓ ×Ó DynBinHeap<Key>¸ × Ò Ö            ÑÒ ÖÐ×
      Ð Ú × × Ò ÕÙ Ð Ù×Ù Ö Ó Ø Ò ÔÓÖ ÕÙ Ô Ò× Ö Ò ÐÓ× ÒÓ Ó× ÓÑÓ Ó ØÓ× Ñ Ò ÔÙÐ ÓÒ
        Ð Ôº
           Ù Ò Ó ÑÔÐ ÒØ ÑÓ× ÙÒ Ú Ö× ÓÒ Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð ×            Ò Ð Ú × Ý ÒÓ Ò
     ÐÓ× ÒÓ Ó× ÕÙ Ð ÓÒØ Ò Ò¸ ÙÒ ÓÔ Ö ÓÒ ÙÒ Ñ ÒØ Ð Ð Ì                 × × Ð ÔÓ× Ð
         Ð Ö Ö ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ× ¹Ý ØÓ Ð Ñ ÑÓÖ Ó ÙÔ ¹ Ò ÙÒ ×ÓÐ ÓÔ Ö ÓÒº ר ×
      Ð ×Ó¸ ÔÓÖ ÑÔÐÓ¸ Ð × ÓÔ Ö ÓÒ × remove all and delete() ´Ü ¾º º ´Ô Ò µµ
     Ý destroyrec() ´Ü º º½¼ ´Ô Ò ¾ µµ × Ò × Ô Ö Ð × Ð ×Ø × ÒÐ Þ × Ý ÐÓ× Ö ÓÐ ×
       Ò Ö Ó׸ Ö ×Ô Ø Ú Ñ ÒØ º
           Ò Ð ×Ó ÙÒ Ô Ò Ñ Ó ÓÑÓ BinHeap<Key>¸ Ó Ð ×ØÖÙ ØÓÖ Ð Ì
     DynBinHeap<Key>¸ ÒÓ × ÔÓ× Ð ÒÚÓ Ö Ð ÓÔ Ö ÓÒ destroyRec()¸ ÔÙ ×                 Ù×
         Ð ÓÑÔÐ            Ð ÒÓ Ó ÙÒ BinHeap<Key> ÒÓ × ×ÔÓÒ Ð Ú ÐÓÖ NullPtr¸ Ð
      Ù Ð × × ÖÚ destroyRec() Ô Ö Ö ÓÒÓ Ö Ð × Ó ×º
          ÍÒ Ø ÒØ ÓÒ Ô Ö ØÖ Ø Ö ÓÒ ×Ø ÔÖÓ Ð Ñ ¸ × Ö¸ Ô Ö Ð Ñ Ò Ö ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ×
         BinHeap<Key>¸ × ÙÒ ÐÓ Ð × Ù ÒØ ר ÐÓ
¿½      Ð Ñ Ò Ö ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ× Ð BinHeap<Key> ¿½ ≡
      while (not this->is_empty())
        delete getMin();
       ר ÐÓÕÙ ÙÑÔÐ Ð ÙÒ ÓÒ¸ Ô ÖÓ ÜÔ Ò× × ÙÒ Óר Ò Ø ÑÔÓ ÕÙ ÔÙ              Ú ÒÖ
      ÑÔÓÖØ ÒØ ¸ ÔÙ × × O(n Ð (n))¸ ÕÙ × Ñ ÝÓÖ ÕÙ O(n)¸ Ð Ø ÑÔÓ ÕÙ ÒÓ× ÐÐ Ú Ð ¹
     ÖÖ Ó ÐÓ× Ð Ñ ÒØÓ× Ý ×Ù ÓÖÖ ×ÔÓÒ ÒØ Ð Ñ Ò ÓÒº × ×Ø Ô Ö×Ô Ø Ú × ÒÓ×
     Ö Ú Ð Ò × Ö Ó ÔÖÓÚ Ö × Ð Ì BinHeap<Key> ÙÒ ÔÖ Ñ Ø Ú ÕÙ Ð Ñ Ò ØÓ Ó× ÐÓ×
      Ð Ñ ÒØÓ× Ò O(n)º Ò Ø Ð × ÒØ Ó¸ Ö ÑÓ× ÙÒ Ö ÓÖÖ Ó ×Ù¬ Ó¸ Ö ÙÖ× ÚÓ¸ ÕÙ Ð Ö ÐÓ×
     ÒÓ Ó× Ð Ô
¿½    Å Ñ ÖÓ× ÔÖ Ú Ó× BinHeap<Key> ¿½ +≡                    ´¿½¾µ ¿½
      static void __postorder_delete(Node * p, Node * incomplete_node)
320                                                         Cap´        ´
                                                                     ıtulo 4. Arboles



       {
            if (IS_LEAF(p))
              {
                delete p;
                return;
              }
            __postorder_delete(LLINK(p), incomplete_node);
            if (p != incomplete_node)
              __postorder_delete(RLINK(p), incomplete_node);
            delete p;
       }
      ÈÙ ×ØÓ ÕÙ Ò Ð ×ØÖÙ ØÙÖ        ØÓ× × ÓÑ Ò Ð ×ØÖÙ ØÙÖ Ö ÓÐ Ò Ö Ó ÓÒ Ð ×Ø
       Ó Ð Ñ ÒØ ÒÐ Þ ¸ ×       Ø Ò Ö ×Ô Ð Ù Ó Ù Ò Ó Ð ÙÐØ ÑÓ ÒÓ Ó ´lastµ¸ ×
      ÞÕÙ Ö Ó ×ÓÐÓ Ò ×Ø ×Ó p × Ö ÙÒ ÒÓ Ó ÙÒ ×ÓÐÓ Ó¸ ÔÓÖ ÐÓ ÕÙ Ð ÐÐ Ñ        Ð
        Ö     × Ö Ò ÓÖÖ Ø Ý Ù× ÒØ ÙÒ Ó Ð Ð Ñ Ò ÓÒº
           ר ÖÙØ Ò × ÒÚÓ ÔÓÖ Ð × Ù ÒØ ÒØ Ö Þ ÔÙ Ð
¿¾¼    Å Ñ ÖÓ× ÔÙ Ð Ó× BinHeap<Key> ¿½ +≡                ´¿½¾µ ¿½
       void remove_all_and_delete()
       {
         if (root == NULL)
           return;
         if (num_nodes <= 3)
           {
             while (not this->is_empty())
               delete getMin();
             return;
           }
         if (IS_LEFT(last))
           __postorder_delete(root, ULINK(last));
         else
           __postorder_delete(root, NULL);
         root = NULL;        // reiniciar como si se hubiese llamado a constructor
         last = &head_node;
         num_nodes = 0;
       }
         Ó ÕÙ Ð Ô × ÙÒ Ö ÓÐ ÓÑÔÐ ØÓ¸ Ð Ö × Ó             × ÓÖ    ÔÐ         Ó Ð Ö Ù× ÓÒ
      × Ñ Ò ÑÓº
         Ä ÖÙØ Ò remove all and delete() × ÒÚÓ         ÔÓÖ Ð ×ØÖÙ ØÓÖ Ð Ì     DynBinHeap<Key>¸
      Р٠и ÓÑÓ × ×ÙÔÓÒ Ö× ¸ × ÙÒ ÜØ Ò× ÓÒ            BinHeap<Key> ÓÖ ÒØ       ÑÒ Ö
      Ð Ú ×º    ר ÑÓ Ó¸ Ð ×ØÖÙ ÓÒ × O(n)º

      4.8      Enumeraci´n y c´digos de ´rboles
                        o     o         a
         ÓÖ ÑÓ× ÙÒ ÔÖÓ Ð Ñ ÓÑ Ò ØÓÖ Ó ÕÙ ¸ × Ò Ø Ò ÐÓ× Ö ÓР׸ Ö Ð ÓÒ ÑÙ¹
        Ó× ÓØÖÓ× ÔÖÓ Ð Ñ × ÓÑ Ò ØÓÖ Ó× Ù ÒØÓ× Ö ÓÐ × Ö ÒØ × ÔÙ Ò ÓÒרÖÙ Ö× ÓÒ
      n ÒÓ Ó× ÈÓÖ      ÑÔÐÓ¸ רÓ× ×ÓÒ ØÓ Ó× ÐÓ× ÔÓ× Ð × Ö ÓÐ × 4 ÒÓ Ó×
4.8. Enumeraci´n y c´digos de ´rboles
              o     o         a                                          321




   Ê ÓÖ ÑÓ× ÕÙ Ü ×Ø ÙÒ ÓÖÖ ×ÔÓÒ Ò ÙÒ ÚÓ ÒØÖ ÐÓ× Ö ÓÐ × Ý ÐÓ× Ö ÓÐ × ¹
Ò Ö Ó× ´Ü º º½ ´Ô Ò ¾ µµº        Ó ÙÒ Ö ÓÐ Ù ÐÕÙ Ö        n ÒÓ Ó׸ ÒØÓÒ ×¸
× ÙÒ Ü º º½ ´Ô Ò ¾ µ¸ Ð Ö Þ ×Ù ÕÙ Ú Ð ÒØ Ò Ö Ó ÒÓ Ø Ò Ö Ñ Ö º
Ê ×Ø Ò¸ ÒØÓÒ ×¸ n − 1 ÒÓ Ó× Ô Ö ÓÑ Ò Ö Ò Ð Ö Ñ ÞÕÙ Ö º ÈÓÖ ÐÓ Ø ÒØÓ¸ Ð
ÒÙÑ ÖÓ ÔÓ× Ð × Ö ÓÐ × ÕÙ × ÔÙ Ò ÓÒרÖÙ Ö ÓÒ n ÒÓ Ó× × ÕÙ Ú Ð ÒØ Ð ÒÙÑ ÖÓ
    Ö ÓÐ × Ò Ö Ó× ÕÙ × ÔÙ Ò ÓÒרÖÙ Ö ÓÒ n − 1 ÒÓ Ó׺ ÈÓ ÑÓ× Ö ×ÓÐÚ Ö ×Ø ÔÖÓ¹
 ÐÑ       ÓÒØ Ó Ò Ð ÓÒØ ÜØÓ Ñ × Ñ Ð Ö Ý¸ ÕÙ Þ Ñ × × ÑÔÐ ¸ ÐÓ× Ö ÓÐ × Ò Ö Ó׺
4.8.0.7   C´digos de un arbol binario
           o            ´

 ÓÑ Ò ÑÓ× ÔÓÖ ÒÙÒ Ö Ð ÓÒ ÔØÓ Ó Ó ÙÒ Ö ÓÐ Ò Ö Óº È Ö ÐÐÓ                Ù ÑÓ×
ÙÒ Ö ÓÐ ÜØ Ò Ó ¹ ÓÒ ×Ù× ÒÓ Ó× ÜØ ÖÒÓ×¹ Ø Ð ÓÑÓ Ð Ð ¬ ÙÖ º¾ º




  ÙÖ º¾ ÍÒ Ö ÓÐ Ò Ö Ó ÜØ Ò Ó ÒÓ Ó× ÒØ ÖÒÓ× Ø ÕÙ Ø Ó× ÓÒ a ÒÓ Ó× ÜØ ÖÒÓ×
ÓÒ b

Definici´n 4.7
       o       Ë ÙÒ Ö ÓÐ Ò Ö Ó T n ÒÓ Ó׺ Ë ¬Ò Ó Ó(T ) : B −→ {a, b}∗
ÓÑÓ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó Ð Ö ÓÐ ÜØ Ò Ó ÓÒ ×Ù× n ÒÓ Ó× ÒØ ÖÒÓ× ×Ø Ò Ø ÕÙ Ø Ó×
ÓÒ a Ý ×Ù× ÜØ ÖÒÓ× ÓÒ bº
   ÈÓÖ ÑÔÐÓ¸ Ô Ö Ð Ö ÓÐ Ð ¬ ÙÖ º¾ ¸ Ó Ó(T ) = aaaabbabbaabbbababbº
     ×ØÙ ÑÓ× ÓÑÓ × Ö Ø Ö Þ ÙÒ Ô Ð Ö Ó Ó(T ) ∈ {a, b}∗ º           ÒØÖ ¸
×ÙÑ ÑÓ× ÕÙ L ⊂ {a, b}  ∗ × Ð Ð Ò Ù ÕÙ Ö Ø Ö Þ ÙÒ Ó Ó ÙÒ Ö Óк L
× ÐÐ Ñ Ó Ð Ò Ù      ÄÙ × Û Þ¸ Ò ÓÒÓÖ Ð Ñ Ø Ñ Ø Ó ÔÓÐ Ó Â Ò ÄÙ × Û Þº
Proposici´n 4.6
         o        ÐÐÒ Ù       ÄÙ × Û Þ¸    ØÓ Ó× ÐÓ× Ó Ó× ÔÓ× Ð × ×Ø   ¬Ò Ó
ÔÓÖ
                                 L = aLL ∪ b                           ´ º¿ µ
     Ò ÓØÖ × Ô Ð Ö ×¸ L = Ó Ó(B)º
   Ä ÜÔÖ × ÓÒ ´ º¿ µ × ÙÒ ¬Ò ÓÒ Ö ÙÖ× Ú Ð ÓÒ ÙÒØÓ L Ý × Ò ¬ ÕÙ ÙÒ
Ô Ð Ö L × Ð Ö ×ÙÐØ Ó       ÓÒ Ø Ò Ö a ÓÒ Ó× Ô Ð Ö × × Ù × ÕÙ Ô ÖØ Ò Þ Ò Ð
 ÓÒ ÙÒØÓ L Ó ÓÒ Ð Ð ØÖ bº ÄÓ Ñ × ÒØ Ö × ÒØ   ר Ø ÔÓ    ¬Ò ÓÒ × ÕÙ ÑÓ×
  ¬Ò Ó ÙÒ ÓÒ ÙÒØÓ Ò¬Ò ØÓ Ô Ð Ö × Ò ÙÒ ×ÓÐ ÜÔÖ × ÓÒ Ö ÙÖ× Ú º
322                                                                             Cap´        ´
                                                                                   ıtulo 4. Arboles



Demostraci´n
          o              ÈÖ       ÑÓ×ØÖ Ö       L =     Ó Ó(B)       ÑÓ×      ÑÓ×ØÖ Ö   L⊂   Ó Ó(B) Ý
L ⊃ Ó Ó(B)

     ¯ aLL ∪ b ⊂     Ó Ó(B) Ë T = ∅¸ Ø Ò ÑÓ× ÕÙ Ó Ó(∅) = b ⊂ aLL ∪ bº Ë T = ∅¸
           ÒØÓÒ × T ÔÙ        ÜÔÖ × Ö× ÓÑÓ T =< Ä(T ), Ö Þ(T ), Ê(T ) >º ÈÓÖ Ð ¬Ò ÓÒ
               Ó Ó¸ Ó Ó(< Ä(T ), Ö Þ(T ), Ê(T ) >) = a Ó Ó(Ä(T )) Ó Ó(Ê(T )) ⊂
           Ó Ó(B)
     ¯     Ó Ó(B) ⊂ aLL ∪ b Ë w ∈ Lº Ë |w| = 1 =⇒ w = Ó Ó(∅) = bº
             ÐÓ ÓÒØÖ Ö Ó¸ |w| > 1 =⇒ w = auv, u, v ∈ L ÓÒ a ÓÖÖ ×ÔÓÒ Ð Ö Þ ÙÒ
           Ö ÓÐ T Ñ ÒØÖ × ÕÙ u = Ó Ó(Ä(T )) Ý v = Ó Ó(Ê(T ))
    Ù Ò Ó Ø Ò ÑÓ× ÙÒ Ô Ð Ö w = uv × Ö¸ ÕÙ ÔÙ             ÓÑÔÓÒ Ö× Ð ÓÒ Ø ¹
Ò ÓÒ ÓØÖ × Ó× Ô Ð Ö × u Ý v¸ ÒØÓÒ × u × Ð         ÕÙ × ÔÖ ¬ Ó wº ÈÓÖ ÑÔÐÓ¸
× w = abbba¸ ÒØÓÒ × , a, ab, abb, abbb, abbba ×ÓÒ ÔÖ ¬ Ó× w½ º
    Ò ÐÓ ÕÙ Ö ×Ô Ø ÐÓ× ÔÖ ¬ Ó׸ ÒÓØ Ö ÑÓ×
 u≤v           ×   u   × ÔÖ ¬ Ó    v
 u<v           ×   u   × ÔÖ ¬ Ó    v   Ý u = vº Ò ×Ø           ×Ó¸   ÑÓ× ÕÙ    u   × ÔÖ ¬ Ó ÔÖÓÔ Ó   v

ÈÖ Ð           ÑÔÐÓ ÒØ Ö ÓÖ¸ a < abbba¸ Ô ÖÓ abbba ≤ abbbaº
Definici´n 4.8 (Conjunto prefijo)
       o                          ÍÒ ÓÒ ÙÒØÓ Ô Ð Ö × × ÔÖ ¬ Ó × Ò Ò ÙÒ ×Ù×
Ô Ð Ö × × ÔÖ ¬ Ó Ð ÙÒ Ð × ÓØÖ ×º ×ØÓ ×¸ Ó ÙÒ Ð Ò Ù X¸ ×            ÕÙ X × ÙÒ
Ð Ò Ù ÔÖ ¬ Ó ⇐⇒ ∀u, v ∈ X¸ u Ý v ÒÓ ×ÓÒ ÔÖ ¬ Ó× ÒØÖ × º × Ö¸ u ≤ v =⇒ u = vº
    ÈÓÖ ÑÔÐÓ¸ X = {ab, baa, bab}º
Lema 4.3 Ë X ÙÒ Ð Ò Ù        ÔÖ ¬ Ó Ý u, v, u , v ∈ Xº ÒØÓÒ ×¸ uv = u v =⇒ u = u                     Ý
v = v º Ò ÓØÖÓ× Ø ÖÑ ÒÓ׸ × u, v, u , v ∈ X | u = u , v = v =⇒ uv = u v º
Demostraci´n (por contradicci´n)
           o                  o                         ËÙÔÓÒ ÑÓ× ÕÙ X × ÙÒ Ð Ò Ù ÔÖ ¬ Ó ×
   Ö¸ uv = u v =⇒ u = u Ó v = v º È                     Ö    Ð Ø Ö Ð ÓÑÔÖ Ò× ÓÒ¸ ×ÙÔ ÖÔÓÒ ÑÓ× Ð ×
Ô Ð Ö × uv Ý u v ÓÑÓ × Ù
                                                    u          v
                                                u          v

    Ò Ð       Ö Ñ × ÔÖ ÕÙ u ≤ uº ÈÓ ÑÓ× Ñ Ò Ö ÓØÖ × ×ÙÔ ÖÔÓ× ÓÒ × Ý
×ÙÔÓÒ Ö ÓØÖÓ× ÔÖ ¬ Ó׺ Ò ØÓ Ó ×Ó¸ × Ð ÖÓ ÕÙ Ó u ≤ u Ó v ≤ v º Ë Ò Ñ Ö Ó¸ ÔÙ ×ØÓ
ÕÙ ÑÓ× Ó ÕÙ X × ÙÒ ÓÒ ÙÒØÓ ÔÖ ¬ Ó¸ × ÑÔÓ× Ð ÕÙ u × ÔÖ ¬ Ó uº ÈÙ ×ØÓ
ÕÙ Ð Ò ÓÒ Ð Ð Ñ × Ð× ¸ Ð Ð Ñ × ÖØÓ
    ר Ð Ñ ÒÓ× ÔÖÓÔÓÖ ÓÒ Ð Ö ÙÑ ÒØÓ ÔÖ Ò Ô Ð Ô Ö ÑÓ×ØÖ Ö Ð ÔÖÓÔÓ× ÓÒ × ¹
 Ù ÒØ
Proposici´n 4.7 (Huffman 1952 [9])
         o                                               ÐÐÒ Ù       ÄÙ × Û Þ × ÔÖ ¬ Óº
 ½
         Ð × Ñ ÓÐÓ      ÒÓØ Ð Ô Ð Ö Ú       º
4.8. Enumeraci´n y c´digos de ´rboles
              o     o         a                                                                323



Demostraci´n (por contradicci´n inductiva sobre la longitud de una palabra)
          o                  o
ËÙÔÓÒ ÑÓ× ÕÙ Ð Ð Ò Ù      ÄÙ × Û Þ ÒÓ × ÔÖ ¬ Ó¸ ÒØÓÒ × ∃u, v, x ∈ L | ux = vº
   ¯ |u| = 1:   Ò ×Ø ×Ó¸ u = b =⇒ x = =⇒ v = b¸ Ô ÖÓ L ÒÓ ÓÒØ Ò                            ÐÓ ÕÙ
        ÑÔÐ ÕÙ L × ÔÖ ¬ Ó Ô Ö ØÓ × Ð Ô Ð Ö × ÐÓÒ ØÙ 1º
   ¯      ÓÖ ×ÙÑ ÑÓ× ÕÙ L × ÔÖ ¬ Ó Ô Ö ØÓ × Ð × Ô Ð Ö × u, v ∈ L ÐÓÒ ØÙ ÒÓÑ Ò Ð
       Ý Ü Ñ Ò Ö ÑÓ× × ∃u, x ∈ L | ux = vº × Ö¸ × Ü ×Ø ÙÒ Ô Ð Ö                            Ñ ÝÓÖ
       ÐÓÒ ØÙ ÕÙ ÔÙ × Ö ÓÑÔÙ ×Ø ÓÒ ÙÒ Ô Ð Ö Ô ÖØ Ò ÒØ Lº
       Ë Ò u1, u2, v1, vx, x ∈ L | |u1| < |u| , |u2| < |u| , |u2| < |u| , |v1| < |v| , |v2| < |v|º
       Ê Ð ÑÓ× Ð × × Ù ÒØ × × ÓÑÔÓ× ÓÒ ×
                                             u = au1u2
                                             v = av1v2

         ÔÐ Ø ÑÓ×
                                 au1u2x = av1v2 =⇒ u1u2x = v1v2

        ×ØÓ ÒÓ× ÖÖÓ Ó× ×Ó× Ü Ñ Ò Ö
         ½º |u1| ≤ |v1| Ò ×Ø ×Ó¸ u Ý v × ×ÙÔ ÖÔÓÒ Ò               Ð ÓÖÑ × Ù ÒØ
                                       u1               u2              x
                                            v1                  v2

            Ä ÙÒ ÔÓ× Ð            × ÕÙ u1 = v1¸ ÔÙ × ÐÓ ÓÒØÖ Ö Ó u1 × Ö ÔÖ ¬ Ó
            v1¸ Ô ÖÓ ÐÐÓ ÒÓ × × ÔÓÖ Ð    ÔÓØ × × Ò Ù Ø Ú º ÈÓÖ ÐÓ Ø ÒØÓ¸ x = ∈ Lº Ð
                                                                             /
            ÔÐ ÒØ Ñ ÒØÓ ×¸ ÒØÓÒ ×¸ ÓÒØÖ ØÓÖ Óº
         ¾º |v1| < |u1| < |u| Ò ×Ø ×Ó¸ u Ý v × ×ÙÔ ÖÔÓÒ Ò Ð ÓÖÑ × Ù ÒØ
                                      u1                u2              x
                                      v1               v2

                ÒÙ ÚÓ¸ v1 ÒÓ ÔÙ × Ö ÔÖ ¬ Ó u1¸ ÔÙ × × ÒÓ × ÓÒØÖ           Ð ÔÓØ × ×
             Ò Ù Ø Ú º ÈÓÖ ÐÓ Ø ÒØÓ¸ v1 = u1 Ý x = ∈ Lº/

        Ñ Ó× ×Ó׸ ÓÒ |u1| = |v1| | |u1| < |u|, |v1| < |v|¸ ÓÒØÖ Ò Ð ÔÓØ × × Ò Ù Ø Ú º
       ÈÓÖ ÐÓ Ø ÒØÓ¸ Ð ÔÓØ × × × ÖØ
Proposici´n 4.8 ∀T1, T2 ∈ B, T1 = T2 ⇐⇒
         o                                   Ó Ó(T1) = Ó Ó(T2)º
Demostraci´n
          o         Ä ÔÖÙ       × ×ØÖÙ ØÙÖ Ò Ó× Ô ÖØ ×
   ¯ Inyectividad (=⇒):          ÔÐ Ö ÑÓ× Ò Ù ÓÒ ×Ó Ö Ð × Ö Ò Ð                  ×     T1   Ý T2º

       ∀T1, T2 ∈ B, T1 = T2 =⇒     Ó Ó(T1) = Ó Ó(T2)º
       Caso base: Ë T1 = ∅, T2 = ∅ =⇒            Ó Ó(T1) = b, Ó Ó(T2) = auv,         u, v ∈ L =⇒
            Ó Ó(T1) = Ó Ó(T2)º
324                                                                       Cap´        ´
                                                                             ıtulo 4. Arboles



      Hip´tesis inductiva: Ë T1 = ∅, T2 = ∅
         o                                               Ý   |T1| = |T2| =⇒ |    Ó Ó(T1)|   =
          | Ó Ó(T2)| =⇒ Ó Ó(T1) = Ó Ó(T2)º
            Ë   |T1| = |T2|   ÒØÓÒ ×

                              w1 =   Ó Ó(T1) = au1v1     u1 =   Ó     Ó(Ä(T1))
                                                         v1 =   Ó     Ó(Ê(T1))
                              w2 =   Ó Ó(T2) = au2v2     u2 =   Ó     Ó(Ä(T2))
                                                         v2 =   Ó     Ó(Ê(T2))

               ÓÖ ÕÙ Ð ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö Ó× Ö ÓÐ × ÙÒ Ñ ×Ñ Ö Ò Ð
            ÒÓÑ Ò Ð Ý ÔÖÓ ÑÓ× × Ð ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö Ö ÓÐ ×               Ö ÒÐ
            Ñ ÝÓÖº ÈÓÖ Ð ÔÓØ × × Ò Ù Ø Ú ¸ Ø Ò ÑÓ× ÕÙ Ó u1 = u2 Ó v1 = v2º     ÑÓ×
            Ö ×ÔÓÒ Ö ×
                                        au1v1 = au2v2                        ´ º¿ µ
            È Ö ÐÐÓ¸ ÔÐ ÒØ ÑÓ× Ð × Ù ÒØ Ð Ñ
            Lema 4.4  Ë Ò u1, u2, v1, v2 ∈ Lº Ë u1 = u2 Ó v1 = v2¸ ÒØÓÒ × u1v1 = u2v2º
            Demostraci´n Ä
                       o          ÑÓ×ØÖ ÓÒ × Ö Ú Ð Ð Ñ º¿º Ë Ò ÑÓ× Ð
            Ð Ñ º¿¸ Ø Ò ÑÓ× ÕÙ u1 = u2 Ó v1 = v2 =⇒ u1v1 = u2v2 ÓÒ u1, u2, v1, v2 ∈
            {Ä Ò Ù   ÔÖ ¬ Ó}º ÑÔ ÖÓ¸ ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ º × ÑÓ× ÕÙ L × ÙÒ Ð Ò Ù
            ÔÖ ¬ Óº × Ô٠׸ Ð Ð Ñ × ÖØÓº
              Ð Ð Ñ º ÒÓ× Ö ÒØ Þ ÕÙ ´ º¿ µ × ÖØÓ Ô Ö Ö ÓÐ × Ò Ö Ó×         Ö Ò¹
            Ð      Ñ ÝÓÖ¸ ÐÓ ÕÙ ÑÔÐ ÕÙ Ó Ó(T ) : B −→ L × ÒÝ Ø Ú º
            Ä ÒÝ Ø Ú         ÔÖÙ ∀T1, T2 ∈ B, T1 = T2 =⇒ Ó Ó(T1) = Ó Ó(T2)
  ¯ Suprayectividad:            Ò ×Ø     ×Ó¸     ÑÓ× ÑÓ×ØÖ Ö ÕÙ
                                     ∀w ∈ L ∃T ∈ B |   Ó Ó(T ) = w                      ´ º ¼µ
      Ä ÑÓ×ØÖ ÓÒ × ÔÓÖ Ò Ù ÓÒ ×Ó Ö Ð ÐÓÒ ØÙ                      wº   Ä     ÔÓØ × × Ò Ù Ø Ú ×
      ´ º ¼µº
        – |w| = 1 =⇒     Ó Ó(∅) = b =⇒ ´ º ¼µ × ÖØÓ Ô Ö |w| = 1º
        –      ÓÖ ×ÙÑ ÑÓ× ÕÙ ´ º ¼µ × ÖØÓ Ô Ö ØÓ Ó |w| = n Ý Ú Ö ¬ ÑÓ× × Ð
              ÔÓØ × × × × Ø ×     Ô Ö |w| = n + 1º
            Ë |w| = n + 1¸ Ð Ô Ð Ö w = auv × Ø × |auv| = 1 + |u| + |v|º ÈÓÖ Ð
              ÔÓØ × × Ò Ù Ø Ú ¸ ∃Tu ∈ B | Ó Ó(Tu) = u Ý ∃Tv ∈ B | Ó Ó(Tv) = v Ø Ð
            ÕÙ | Ó Ó(Tu)| + | Ó Ó(Tv)| = n =⇒ |w| = 1 + |u| + |v| = n + 1
ÈÙ ×ØÓ ÕÙ Ó Ó(T ) : B −→ L × ÒÝ Ø Ú Ý ×ÙÔÖ Ý Ø Ú ¸ Ó Ó(T ) : B −→ L ×
  Ý Ø Ú º ÍÒÓ ÐÓ× Ø ÓÖ Ñ × ÙÒ Ñ ÒØ Ð × Ð Ø ÓÖ         ÓÒ ÙÒØÓ× ×Ø Ð ÕÙ ×
ÙÒ ÙÒ ÓÒ f : A −→ B × Ý Ø Ú ÒØÓÒ × |A| = |B|º ÈÓÖ ×Ø Ø ÓÖ Ñ ¸ ÔÓ ÑÓ× ÓÒ ÐÙ Ö
ÕÙ |B| = |L|º ÄÓ ÕÙ ÑÙ ×ØÖ ÕÙ Ó Ó(T1) = Ó Ó(T2) =⇒ ∀T1, T2 ∈ B, T1 = T2
4.8. Enumeraci´n y c´digos de ´rboles
              o     o         a                                                              325



      ÓÖ Ú ÑÓ× ÓÑÓ ×              Ö Ø Ö Þ ÙÒ Ô Ð Ö Ò Lº È Ö ÐÐÓ¸ ¬Ò ÑÓ×
                         |w|a =         Ð ÒÙÑ ÖÓ     Ó ÙÖÖ Ò ×     a      Òw
                         |w|b =         Ð ÒÙÑ ÖÓ     Ó ÙÖÖ Ò ×     b      Òw
Proposici´n 4.9
         o


                  w ∈ L ⇐⇒
                                 ´µ   |w|b = 1 + |w|a       Ý                               ´ º ½µ
                                 ´µ   ∀u, v, |u| < |w| | w = uv =⇒ |u|a ≥ |u|b
Demostraci´n
          o

 ´ µ Ë T ÙÒ Ö ÓÐ Ò Ö Ó Ù ÐÕÙ Ö ÓÒ w = Ó Ó(T )ºº ÈÓÖ Ð ¬Ò ÓÒ Ó Ó¸
     × ÑÓ× ÕÙ |w|a = |T | × Ö¸ Ð ÒÙÑ ÖÓ ÒÓ Ó× ÒØ ÖÒÓ׺ ÈÓÖ Ð ÔÖÓÔÓ× ÓÒ º¾¸
     × ÑÓ× ÕÙ T ÜØ Ò Ó Ø Ò 2|T |+1 ÒÓ Ó× × Ö n ÒÓ Ó× ÒØ ÖÒÓ× Ý n+1 ÒÓ Ó×
      ÜØ ÖÒÓ׺ × Ô٠׸ |w| = 2|T | + 1 = 2|w|a + 1 = |w|a + |w|b =⇒ |w|b = |w|a + 1
 ´ µ ´ Ò Ù ÓÒ ×Ó Ö |w|µ
          ¯ |w| = 1 =⇒ w = b =⇒ u =             =⇒ |u|a = 0 ≥ |u|b = 0º   ´µ ×    ÖØÓ Ô Ö Ð ×Ó
                  ׺
          ¯   Ë    |w| = n + 1Ý ×ÙÑ ÑÓ× ´ µ ÖØÓ Ô Ö ØÓ            Ó |w| < n + 1º ÈÓÖ ¬Ò ÓÒ¸
              w Ø Ò ÕÙ ×Ø Ö ÓÑÔÙ ×ØÓ ÓÑÓ w = auv                   Ð × Ñ ÓÐÓ a ÔÓÖ Ð ÔÓØ Ø
              Ö Þ ÙÒ Ö ÓÐ Ò Ö Ó Ý u Ý v ÐÓ× Ó Ó×                  Ð × Ö Ñ ÞÕÙ Ö Ý Ö ¸
              Ö ×Ô Ø Ú Ñ ÒØ º
                ÓÒ× Ö ÑÓ× ÙÒ ÔÖ ¬ Ó w Ù ÐÕÙ Ö w¸ Ð                 Ù Ð ÔÙ      Ø Ò Ö Ð ÙÒ      Ð×
              × Ù ÒØ × ÓÒ¬ ÙÖ ÓÒ ×
                                        w   a           u                 v
                                 ×Ó ½   w   a           u
                                 ×Ó ¾   w   a           u           v

               Ò Ð ×Ó ½¸ |u | < |u|¸ ÔÓÖ ÐÓ ÕÙ Ð ÔÓØ × × Ò Ù Ø Ú × ÖØ ÒØÖ u Ý uº
              ÈÓÖ ÐÓ Ø ÒØÓ¸ |u |a ≥ |u |b ݸ Ó Ú Ñ ÒØ ¸ |au | ≥ |u |º
               Ò Ð ×Ó ¾¸ |v | < |v|¸ ÔÓÖ ÐÓ ÕÙ Ð ÔÓØ × × Ò Ù Ø Ú × ÖØ ÒØÖ v Ý
              v ÐÓ ÕÙ Ô ÖÑ Ø        Ø ÖÑ Ò Ö ÕÙ |uv |a ≥ |uv |b ݸ Ò ÓÒ× Ù Ò ¸ |auv |a ≥
              |auv |b

    ר ÔÖÓÔÓ× ÓÒ ÒÓ× ÙÒ Ñ Ò Ö ¬ ÒØ × Ñ Ú Ö ¬ Ö × ÙÒ × Ù Ò                                       Ø×
× ÙÒ Ô Ð Ö ÄÙ × Û Þ Ó × ¸ × ÙÒ Ô Ð Ö × ÓÖÖ ×ÔÓÒ ÓÒ Ð Ó Ó                                       ÙÒ
Ö ÓÐ Ò Ö Óº
4.8.0.8       C´digos de Dick
               o

ÍÒ ÐØ ÖÒ Ø Ú Ô Ö Ó ¬ Ö Ö ÓР׸ ÓÑÔÐ Ø Ñ ÒØ ÕÙ Ú Ð ÒØ ÐÓ× Ó Ó× Ð
× ÓÒ ÒØ Ö ÓÖ¸ × Ø ÕÙ Ø Ö Ð Ö ÓÐ ÜØ Ò Ó Ñ Ò Ö    Ö ÒØ Ð × Ö Ñ × ÞÕÙ Ö ×
 ÓÒ a Ý Ð × Ö × ÓÒ b Ø Ð ÓÑÓ Ð Ö ÓÐ Ð ¬ ÙÖ º¾ º
326                                                                 Cap´        ´
                                                                       ıtulo 4. Arboles




  ÙÖ º¾        Ö ÓÐ Ò Ö Ó ÜØ Ò Ó Ö Ñ × ÞÕÙ Ö × Ø ÕÙ Ø              × ÓÒ a Ö Ñ × Ö     ×
ÓÒ b
   ÍÒ Ô Ð Ö         ¸ ÒÓØ       ÓÑÓ (T ) : B −→ {a, b}∗ × Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó
ÙÒ Ö ÓÐ Ø ÕÙ Ø Ó ÓÒ ×Ù× Ö Ñ × ÞÕÙ Ö × Ò a Ý ×Ù× Ö Ñ × Ö × Ò bº ÈÓÖ ÑÔÐÓ¸
Ô Ö Ð Ö ÓÐ Ð ¬ ÙÖ º¾
                                 (T ) = aaaabbabbaabbbabab

       ×   Ð Ó Ø Ò Ö ÙÒ ¬Ò ÓÒ Ö ÙÖ× Ú                 ÙÒ Ô Ð Ö         º Ò ÔÖ Ñ Ö ÐÙ¹
  Ö¸    ¬Ò ÑÓ×        (∅) = º È Ö ÙÒ Ö ÓÐ ÒÓ Ú Ó¸ Ò ×Ù Ú Ö× ÓÒ ÜØ Ò             ¸ T =<
Ä(T ), Ö Þ(T ), Ê(T ) >,    (< Ä(T ), Ö Þ(T ), Ê(T ) >= a     (Ä(T ))b (Ê(T ))º × Ô٠׸
× D × Ð ÓÒ ÙÒØÓ ØÓ × Ð × Ô Ð Ö ×                     ¸ ÒØÓÒ ×
                                       D = aDbD ∪

Proposici´n 4.10
         o           Ë   D   ÐÐÒ Ù             ØÓ × Ð × Ô Ð Ö ×      ¸ ÒØÓÒ ×
                                           Db = L

 Ò ÓØÖ × Ô Ð Ö ×¸ Ó Ó(T ) =           (T )bº
Demostraci´n
          o

                 D = aDbD ∪             ÓÒ Ø Ò ÑÓ× Ð         Ù ÓÒ ÓÒ b =⇒
                Db = (aDbD ∪ )b =⇒
                Db   = a Db Db ∪b              × ÙÒ ´ º¿ µ
                L            L    L

     ר ÑÓ× Ò Ô                ÓÖÑÙÐ Ö ÙÒ ÒÙ ÚÓ ÔÖÓ Ð Ñ ÓÑ Ò ØÓÖ Ó Ù ÒØ × ÜÔÖ ¹
× ÓÒ × ÕÙ ÙØ Ð Ò n Ô Ö ÒØ × × ÞÕÙ Ö Ó× Ý n Ô Ö ÒØ × × Ö Ó× ×Ø Ò Ð Ò              × ÈÓÖ
   ÑÔÐÓ¸ ((()())())¸ × ÙÒ ÜÔÖ × ÓÒ Ð Ò        ¸ Ñ ÒØÖ × ÕÙ ()(((()()))())) ÒÓ ÐÓ × ¹ ÐØ
ÙÒ Ô Ö ÒØ × × ÞÕÙ Ö Ó¹º
    Ä Ö ×ÔÙ ×Ø ר           ÔÓÖ Ð ÒØ         ÔÐ Ö×              ÐÓÒ ØÙ 2nº Ò ØÓ¸
× ÓÒ× Ö ÑÓ× Ð Ö Ø Ö a ÓÑÓ Ð Ô Ö ÒØ × × ÞÕÙ Ö Ó Ý Ð b ÓÑÓ Ð Ö Ó¸ ÙÒ
ÔÐ Ö              Ö ÔÖ × ÒØ ÙÒ ÜÔÖ × ÓÒ ÓÒ Ô Ö ÒØ × × Ò ÓÖÑ º
4.8.1      N´meros de Catalan
            u
   ÓÖ Ö ØÓÑ ÑÓ× Ð ÔÖÓ Ð Ñ    ÓÒØ Ö Ð ÒØ        Ö ÓÐ × Ò Ö Ó× ÕÙ ÓÒØ Ò Ò n−1
ÒÓ Ó׺ ÆÓØ ÑÓ× ÕÙ ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ º ¸ ÓÒØ Ö Ð ÒÙÑ ÖÓ Ö ÓÐ × × ÕÙ Ú Ð ÒØ
 ÓÒØ Ö Ð ÒÙÑ ÖÓ Ô Ð Ö × ÄÙ × Û Þ ÐÓÒ ØÙ 2n + 1 Ó Ð ÒÙÑ ÖÓ Ô Ð Ö ×
           ÐÓÒ ØÙ 2nº
4.8. Enumeraci´n y c´digos de ´rboles
              o     o         a                                                             327



Proposici´n 4.11
         o               Ð ÒÙÑ ÖÓ ØÓØ Ð       Ö ÓÐ × Ò Ö Ó×         Ö ÒØ × ÓÒ n ÒÓ Ó× ×
                                      Cn =
                                              1  2n
                                             n+1 n
                                                               .                           ´ º ¾µ
    ÓÒ Cn × ÓÒÓ Ó ÓÑÓ Ð n¹ × ÑÓ ÒÙÑ ÖÓ                             Ø Ð Ò¸ Ò ÓÒÓÖ Ð Ñ Ø Ñ Ø Ó
     ÐÙ Ò Ø Ð Òº
Demostraci´n
          o  Ü ×Ø ÙÒ ÑÓ×ØÖ ÓÒ Ð ×      ×                           Ò ÔÐ ÒØ Ö Ð × Ù ÒØ      Ù ÓÒ
Ö ÙÖÖ ÒØ
                                       1                   n=0
                               Cn =        n−1
                                                                                           ´ º ¿µ
                                           i=0 CiCn−i−1    n>0 .
    ×  Ö¸ ÓÐÓ ÑÓ× Ð ÒÓ Ó Ö Þ Ý ÓÒØ ÑÓ× Ð ÒÙÑ ÖÓ ×Ù Ö ÓÐ × ÞÕÙ Ö Ó× Ý Ð ÒÙÑ ÖÓ
   ×Ù Ö ÓÐ × Ö Ó׺ Ð Ö ÓÐ ÞÕÙ Ö Ó ÔÙ ÓÑ ÒÞ Ö × Ð Ú Ó ×Ø Ð ÕÙ Ø Ò
n−1 ÒÓ Ó׺ Ë ÙÒ ×Ù Ö ÓÐ ÞÕÙ Ö Ó Ø Ò i ÒÓ Ó׸ ÒØÓÒ × Ð Ö Ó Ø Ò n−i−1 ÒÓ Ó׺
ÈÓÖ Ð Ö Ð Ð ÔÖÓ Ù ØÓ¸ Ø Ò ÑÓ× CiCn−i−1 Ö ÓÐ × ÔÓ× Ð × ÙÝÓ ×Ù Ö ÓÐ ÞÕÙ Ö Ó Ø Ò
i ÒÓ Ó׺ Ò ÐÙ Ö   Ö ×ÓÐÚ Ö ×Ø Ù ÓÒ Ö ÙÖÖ ÒØ ¸ ÒÙ ×ØÖ ÑÓ×ØÖ ÓÒ ×Ø Ö ×
 Ò ÙÒ ÒØ ÖÔÖ Ø ÓÒ ÓÑ ØÖ ÔÐ ÒØ          ÔÓÖ ÃÖ Ö Ý ËØ Ò×ÓÒ ½¾ º




                     ÙÖ º¿¼        Ñ ÒÓ        Ø Ð Ò Ð Ö ÓÐ          Ð ¬ ÙÖ º¾

   ÈÙ ×ØÓ ÕÙ Ð ÓÖÖ ×ÔÓÒ Ò       ÒØÖ Ö ÓÐ × m¹Ö Ó× Ý Ò Ö Ó× × ÒÝ Ø Ú ´Ú Ö
Ü º º½ ´Ô Ò ¾ µµ¸ ÓÒØ Ö Ð ÒÙÑ ÖÓ Ö ÓÐ × n ÒÓ Ó× × ÕÙ Ú Ð ÒØ ÓÒØ Ö Ð
ÒÙÑ ÖÓ Ö ÓÐ × Ò Ö Ó× n ÒÓ Ó׺ ×ØÓ ÕÙ Ú Ð ÓÒØ Ö Ð ÒÙÑ ÖÓ Ô Ð Ö ×
ÄÙ × Û Þ ÐÓÒ ØÙ 2n + 1¸ ٠и ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ º½¼¸ × ÕÙ Ú Ð ÒØ ÓÒØ Ö Ð
ÒÙÑ ÖÓ Ô Ð Ö ×            ÐÓÒ ØÙ 2nº
     Ü ×Ø ÙÒ ÒØ ÖÔÖ Ø ÓÒ Ö ¬      ÙÒ Ô Ð Ö          ´Ó ÄÙ × Û Þµ ÒÓѹ
Ò        Ñ ÒÓ     ØÐÒº        ÙÒ Ô Ð Ö w = w1w2 . . . w2n+1 ∈ L ÍÒ Ñ ÒÓ
  Ø Ð Ò × ÓÖÑ Ó ÔÓÖ ÙÒ × Ù Ò       ÔÙÒØÓ× Ò Ð ÔÐ ÒÓ
                                                                   x = xi−1 + 1 × wi = a
    P(w) =   p = (x, y) | ∀wi ∈ w1 w2 . . . w2n+1 ∈ L, y = i   Ý                           ´ º µ
                                                                   x = xi−1 − 1 × wi = b

   Ð Ñ ÒÓ      Ø Ð Ò ÓÖÖ ×ÔÓÒ ÒØ Ð Ó Ó Ð Ö ÓÐ Ð ¬ ÙÖ º¾ × ÑÙ ×ØÖ Ò
Ð ¬ ÙÖ º¿¼º
    Ë ÙÒ Ð ÔÖÓÔÓ× ÓÒ º ¸ |u|a ≥ |u|b Ô Ö ØÓ Ó u ÔÖ ¬ Ó ÔÖÓÔ Ó w ∈ L¸ ×ØÓ ÑÔÐ
ÕÙ ØÓ Ó Ñ ÒÓ         Ø Ð Ò Ñ × ØÖ ×Ô × Ö Ð x ÒØ × Ð ¬Ò Ð Ð Ô Ð Ö º ÓÒØ Ö
 Ð ÒÙÑ ÖÓ Ô Ð Ö ×            ÐÓÒ ØÙ 2n × ÕÙ Ú Ð ÒØ ÓÒØ Ö Ð ÒÙÑ ÖÓ        Ñ ÒÓ×
     Ø Ð Ò Ò Ö Ð × ÕÙ ÔÙ Ò ÓÖÑ Ö× ÓÒ n a × Ý n b × Ø Ð ÕÙ ÒÙÒ ÖÙ Ò Ð Ò Ú Ð xº
328                                                                          Cap´        ´
                                                                                ıtulo 4. Arboles



     Ð ÒÙÑ ÖÓ ØÓØ Ð Ñ ÒÓ× ÔÓ× Ð × Ø Ð Ò¸ ÕÙ ÖÙ Ò Ó ÒÓ Ð x¸ ר      Ó
ÔÓÖ Ð ÒÙÑ ÖÓ Ô Ð Ö × ÕÙ × ÔÙ Ò ÓÖÑ Ö ÓÒ n a × Ý n b ׺ ר ÓÒØ Ó ÔÙ
Ú ×Ù Ð Þ Ö× Ñ ÒØ Ð × Ù ÒØ ¬ ÙÖ
                                           1 2 3 4 . . . 2n



                                                  a1 a2 . . . an

×      Ö¸ Ð ÒÙÑ ÖÓ ÓÑ Ò ÓÒ × 2n Ð × ÒÙÑ Ö × Ò n a × Ð ÒØ
b × ×ÓÒ Ð × Ð × Ö ×Ø ÒØ ׺     ר ÑÓ Ó¸ ÓÒ ÐÙ ÑÓ× ÕÙ 2n × Ð ØÓØ Ð
                                                     n            Ñ ÒÓ×
  Ø Ð Ò ÔÓ× Ð × ÕÙ ÔÙ      ÓÒ ÓÖÑ ÙÒ Ô Ð Ö ÓÑÔÙ ×Ø ÔÓÖ Ð Ð ØÓ {a, b}∗ º
ר ÑÓ Ó¸ ÔÓ ÑÓ× ÔÐ ÒØ Ö
                   Cn =
                           2n
                           n
                              −       ÒØ              Ñ ÒÓ× ÕÙ ÖÙÞ Ò Ð              x             ´º µ
  Ê ÕÙ Ö ÑÓ׸ Ô٠׸ ÓÒØ Ö Ð ÒØ                         Ñ ÒÓ× ÕÙ ÖÙÞ Ò Ð             x    Ý ÕÙ Ø ÖÑ Ò Ò
Ò Ð x¸ ÓÖÖ ×ÔÓÒ ÒØ ÙÒ Ô Ð Ö                      w ∈ D | |w|a = |w|bº
                                                   /                 Ë
                       P = {(0, 0), (1, y1), . . . , (2n − 1, y2n−1), (2n, 0)} ,
ÙÒ ÓÒ ÙÒØÓ ÔÙÒØÓ× ÕÙ Ö ÔÖ × ÒØ ÙÒ Ñ ÒÓ  Ø Ð Ò ÕÙ ÖÙÞ Ð                                     x   ÓÖÖ ×ÔÓÒ¹
  ÒØ ÙÒ Ô Ð Ö w ∈ Dº ÈÓÖ ÑÔÐÓ¸ Ð × Ù ÒØ Ñ ÒÓ
                   /                               ØÐÒ




ÓÖÖ ×ÔÓÒ Ð Ô Ð Ö aabbbaabbaab ∈ D¸  /
   Ë p = (x , −1) ∈ P Ð ÔÖ Ñ Ö ÔÙÒØÓ P ÔÓÖ                          Ó Ð        x¸       ÒØÓÒ × ÔÓ ÑÓ×
 × ÓÑÔÓÒ Ö
         P(w) = P(uv) = P(u) ∪ P(v) = {(0, 0), (1, y1), . . . , (x , −1)} ∪ (P(w) − P(u))
È Ö ØÓ Ó P(w) = uv, w ∈ D, u ÓÖÖ ×ÔÓÒ Ð ÔÖ ¬ Ó w ÒØÖ {(0, 0), . . . , (x , −1)} ×
                      /
   Ö¸ Ð ÔÖ ¬ Ó ×Ø Ð ÔÖ Ñ Ö ÔÙÒØÓ ÕÙ ×Ø ÔÓÖ    Ó Ð xº ¬Ò ÑÓ× Ð Ñ ÒÓ
× Ù ÒØ
                                P (w) = P (u) ∪ (P(w) − P (u)) ;
u × Ð     ÓÑÔÐ Ñ ÒØÓ u × Ö¸ Ð Ô Ð Ö ÓÖÖ ×ÔÓÒ ÒØ                                Ñ Ö ØÓ × Ð × Ð ØÖ ×
a ÔÓÖ b   Ý ØÓ × Ð × Ð ØÖ × b ÔÓÖ aº P (u) × ¬Ò ÓÑÓ
                 P (w) = {(−2 − x, y) ∈ P(u) | 1 ≤ x ≤ x − 1, (x, y) ∈ P(u)

    ÈÖ      Ð     ÑÔÐÓ ÒØ Ö ÓÖ¸ aabbbaabbaab ∈ D × Ô ÖØ ÓÒ
                                             /                                            ÒØÓÒ × ÓÑÓ
bbaaa.aabbaab      Ý Ø Ò Ð × Ù ÒØ Ñ ÒÓ       ØÐÒ
4.8. Enumeraci´n y c´digos de ´rboles
              o     o         a                                                  329




        ÓÑ ØÖ Ñ ÒØ ¸ P (w) = P (uv) | u¸ ÕÙ × Ð ÔÖ ¬ Ó ÓÖÖ ×ÔÓÒ ÒØ Ð Ñ ÒÓ
       Ø Ð Ò P(uv) ר Ð ÔÖ Ñ Ö ÔÙÒØÓ          Ó Ð x¸ ÔÙ × Ö ÒØ ÖÔÖ Ø Ó ÓÑÓ u
   ×ÔÐ Þ Ó 2 ÙÒ       × ÔÓÖ       Ó Ð xº
    Ä Ö Ð ÓÒ P(w) −→ P (w) | ∀w ∈ D × ÙÒ ÙÒ ÓÒ Ý Ø Ú º ÓÑ ØÖ Ñ ÒØ ¸
                                       /
∀P(w1), P(w2), P(w1) = P(w2) =⇒ P (w1) = P (w2) Ø Ò Ö ÙÒ Ñ Ò ÙÒ º ÄÓ Ñ ×ÑÓ
×Ù       ∀P (w1), P (w2), P (w1) = P (w2) =⇒ P(w1) = P(w2)º
    Ê ØÓÑ Ò Ó ´ º µ¸ ÓÒØ Ö Ð ÒÙÑ ÖÓ            Ñ ÒÓ× ÕÙ ÖÙÞ Ò Ð x × ÕÙ Ú Ð ÒØ
    ÓÒØ Ö Ð ÒÙÑ ÖÓ         Ñ ÒÓ× ÕÙ Ô ÖØ Ò × (0, −2) Ý ÖÖ Ò (0, 2n)º Ù ÐÕÙ Ö
  Ñ ÒÓ ×Ø ÓÖÑ                ÓÖÖ ×ÔÓÒ Ö n + 1 Ð ØÖ × a Ý n − 1 Ð ØÖ × bº È ÖØ Ò Ó ×
−2¸ × Ö ÕÙ Ö Ò 2 Ð ØÖ × a Ñ × ÕÙ Ð Ð ØÖ bº × Ô٠׸ Ü ×Ø Ò n+1   2n
                                                                       Ñ ÒÓ× ÕÙ ÖÙÞ Ò
 Ð xº ËÙר ØÙ ÑÓ× Ò ´ º µ
                               2n    2n          1  2n
                        Cn =      −         =
                                n   n+1         n+1 n
   ÄÓ× ÒÙÑ ÖÓ×   Ø Ð Ò Ø Ò Ò ÙÒ ÑÔÓÖØ Ò ØÖ × Ò ÒØ Ð Ò Ð ÓÑ Ò ØÓÖ ¸ ÔÙ ×
Ü ×Ø Ò ÑÙ × × ØÙ ÓÒ × ÓÒØ Ó ÒØ ¬ × Ñ ÒØ ר Ð × ÒÙÑ ÖÓº ÒØÖ
Ð ÙÒ × Ð × ÔÐ ÓÒ × Ø Ò ÑÓ×
   ¯   Ä ÒØ           Ñ Ò Ö × Ò ÕÙ ÙÒ ÔÓÐ ÓÒÓ Ö ÙÐ Ö ÓÒÚ ÜÓ n + 2 Ð Ó× ÔÙ
       × Ö ÓÖØ Ó Ò n ØÖ Ò ÙÐÓ׺ ÈÓÖ ÑÔÐÓ¸ Ý 1 6 = 5 Ö ÒØ × Ñ Ò Ö × ÓÖØ Ö
                                               4 3
       ÙÒ Ô ÒØ ÓÒÓ Ò ØÖ Ò ÙÐÓ׺
   ¯     Ð ÒÙÑ ÖÓ Ñ Ò Ö × Ò ÕÙ n ÒÙÑ ÖÓ× ÔÙ Ò × Ö ÑÙÐØ ÔÐ Ó× ×Ó Ø Ú Ñ ÒØ
        ÓÒ 2n Ô Ö ÒØ × ×º ÈÓÖ ÑÔÐÓ¸ Ý 1 6 = 5º
                                       4 3

       (n1(n2(n3n4)))   (n1((n2n3)n4)) ((n1n2)(n3n4))   ((n1(n2n3))n4) (((n1n2)n3)n4)


   ¯    Ð ÒÙÑ ÖÓ  ÜÔÖ × ÓÒ × Ô Ö ÒØ Þ × ÓÒ n Ô Ö ÒØ × × ÞÕÙ Ö Ó× Ý n Ô Ö ÒØ × ×
         Ö Ó× ÕÙ ×Ø Ò Ð Ò       ׺
   ¯    Ð ÒÙÑ ÖÓ Ö ÓÐ × Ò Ö Ó× n ÒÓ Ó׺
   ¯    Ð ÒÙÑ ÖÓ Ö ÓÐ × n + 1 ÒÓ Ó׺
330                                                        Cap´        ´
                                                              ıtulo 4. Arboles




            ÙÖ º¿½     Ö ÒØ × Ñ Ò Ö ×   ÓÖØ Ö ÙÒ Ô ÒØ ÓÒÓ Ò 3 ØÖ Ò ÙÐÓ×

   ¯     Ð ÒÙÑ ÖÓ      Ñ ÒÓ× ÐÓÒ ØÙ 2n Ò ÙÒ Ñ ÐÐ n × n ÕÙ ×Ø Ò ÔÓÖ          Ó
       Ð      ÓÒ Ðº ÈÓÖ ÑÔÐÓ¸ Ô Ö ÙÒ Ñ ÐÐ 4 × 4¸ Ý 1 8 = 14 Ñ ÒÓ×
                                                   5 4                    Ö ÒØ ×
       ÕÙ Ô × Ò        Ó Ð     ÓÒ Ðº




           ÙÖ º¿¾      Ö ÒØ × Ñ ÒÓ×      Ó   Ð     ÓÒ Ð Ò ÙÒ Ñ ÐÐ   4×4


   ¯     Ð ÒÙÑ ÖÓ Ô Ð Ö ×               ÐÓÒ ØÙ 2n Ó Ð ÒÙÑ ÖÓ Ô Ð Ö × ÄÙ × Û Þ
           ÐÓÒ ØÙ 2n + 1º
   ¯     Ð ÒÙÑ ÖÓ       Ñ ÒÓ× Ò Ð ÔÐ ÒÓ¸ ÓÒ ÓÖÑ Ó× ÔÓÖ 2n ÔÙÒØÓ׸ ÕÙ Ô ÖØ Ò ×
       (0, 0) Ý Ø ÖÑ Ò Ò Ò (2n, 0) ÕÙ ÒÓ ÖÙÞ Ò Ð   xº



4.9     ´
        Arboles binarios de b´squeda
                             u
ËÙÔÓÒ ÑÓ× ÕÙ 1300 Ñ ÐÐÓÒ × Ô Ö×ÓÒ × ×Ø Ò ×Ù× Ö Ø × Ð × ÖÚ Ó Ø Ð ÓÒ Óº        Ó Ð
ÒÓÑ Ö ÙÒ ×Ù × Ö ÔØÓÖ¸ ÓÑÓ Ú Ö Ù Ö ×Ù ÒÙÑ ÖÓ Ø Ð ÓÒ Ó Ë ÐÓ× Ö ×ØÖÓ× ÕÙ ¹
ÐÐ × 1300 Ñ ÐÐÓÒ × Ô Ö×ÓÒ × ×Ø Ò ÓÖ Ò Ó× Ð Ø Ñ ÒØ Ò ÙÒ Ö ÚÓ¸ ÒØÓÒ × Ð
  Ù×ÕÙ       Ò Ö ÒÓ× Ô ÖÑ Ø Ö Ò ÓÒØÖ Ö Ð ÒÙÑ ÖÓ      ÐÙÐ Ö      Ò Ë ÙÒÒ Ò ¹
ÙÒ ÏÙ Ò ÐÓ ×ÙÑÓ Ð 1300000000 = 31 ÒØ ÒØÓ׺
    Ä Ù×ÕÙ         Ò Ö Ü ÕÙ Ð × Ù Ò             ØÓ× ×Ø ÓÖ Ò Ý ×ØÓ ×          Ð
   Ö ÒØ Þ Ö¸ ÔÙ × × ×Ô Ö Ö ÕÙ Ñ ÒÙ Ó Ô Ö Þ Ò ÒÙ ÚÓ× ×Ù × Ö ÔØÓÖ × Ý × Ô Ö Þ¹
   Ò ÓØÖÓ׺ ØÙ Ð Þ Ö Ò Ð Ò ÙÒ × Ù Ò ÓÖ Ò              ÒÙÑ ÖÓ× Ø Ð ÓÒ Ó× × Ö ÑÙÝ
 Ò ¬ ÒØ ¸ ÔÙ × Ð Ò× Ö ÓÒ Ý ×ÙÔÖ × ÓÒ Ò ÙÒ × Ù Ò ÓÖ Ò           × O(n)º
       ÓÖØÙÒ Ñ ÒØ ¸ × Ò ÒÓ ÔÓ ÑÓ× Ñ ÒØ Ò Ö × Ò Óר × ÑÔÓÖØ ÒØ × ÙÒ × Ù Ò
ÓÖ Ò ¸ × ÔÓ ÑÓ× × ÑÙÐ ÖÐ Ñ ÒØ ÙÒ Ö ÓÐ Ò Ö Ó ÕÙ ÑÙÐ Ð Ù×ÕÙ                   ÒÖ
Ý ÕÙ ÒÓ× Ó Ö Þ ÓÖ Ò Ñ ÒØÓ Ý Ö Ô Þ Ô Ö Ð × ÓÔ Ö ÓÒ × Ò× Ö ÓÒ¸ Ù×ÕÙ Ý
×ÙÔÖ × ÓÒº
´
     4.9. Arboles binarios de b´squeda
                               u                                                                         331



                    ´
     Definici´n 4.9 (Arbol binario de b´ squeda)
            o                         u                         Ë ÙÒ Ö ÓÐ Ò Ö Ó T =< Ä(T ), Ö Þ(T ), Ê(T ) >¸
     ÒØÓÒ ×¸ T × ÙÒ Ö ÓÐ Ò Ö Ó     Ù×ÕÙ ´                       µ × Ý ×ÓÐÓ ×
                                           ∀ni ∈ Ä(T ) =⇒ Ã   (ni ) < Ã     (Ö Þ(T ))    Ý
                         T∈          ⇐⇒
                                           ∀ni ∈ Ê(T ) =⇒ Ã   (ni ) > Ã     (Ö Þ(T ))

         ר Ö Ð × ÓÒÓ ÓÑÓ Ð ÔÖÓÔ       Ó ÓÒ ÓÒ ÓÖ Ò ÙÒ Ö ÓÐ Ò Ö Ó
      Ù×ÕÙ º
        È Ö ×Ñ ÒÙ Ö Ð ÐÓÒ ØÙ Ð × ÙÖ×Ó¸ Ò ÑÙ Ó× ÓÒØ ÜØÓ× ÙØ Ð Þ Ö ÑÓ× ÔÖ
       ÒÓØ Ö ÙÒ Ö ÓÐ Ò Ö Ó   Ù×ÕÙ º

                                                                                                                     490

51

                                     125

                                   104                                                       371

                    72                                                310                                      439

               71             89                       218                       330                      406    460

          65             82                     192           296          315     345             393

     55                                     158    207    289     303                   368    391   403

                                          135



                                         ÙÖ º¿¿ ÍÒ Ö ÓÐ Ò Ö Ó             Ù×ÕÙ

              Ó ÙÒ ÒÓ Ó Ù ÐÕÙ Ö ¸ ØÓ Ó× ÐÓ× ÒÓ Ó× Ò Ð ×Ù Ö ÓÐ ÞÕÙ Ö Ó         ÒØ Ò Ö Ð Ú×
     Ñ ÒÓÖ ×¸ Ñ ÒØÖ × ÕÙ ØÓ Ó× ÐÓ× ÒÓ Ó× Ò Ð ×Ù Ö ÓÐ Ö Ó           Ò Ø Ò Ö Ð Ú × Ñ ÝÓÖ ×º
       Ð Ö ÓÐ Ð ¬ ÙÖ º¿¿ × Ø × Ð ¬Ò ÓÒº
           Ð ÓÖ Ò × ×Ø Ù Ò Ó × Ó × ÖÚ Ð Ö ÓÖÖ Ó Ò¬ Óº È Ö Ð Ö ÓÐ Ð ¬ ÙÖ º¿¿¸
      Ð Ö ÓÖÖ Ó Ò¬ Ó × 51 55 65 71 72 82 89 104 125 135 158 192 207 218 289
     296 303 310 315 330 345 368 371 391 393 403 406 439 460 490 º ר ÓÖ Ò
      × Ù Ð            Ð ¬Ò ÓÒ Ú × Ø ÐÓ× ÒÓ Ó× Ð ÞÕÙ Ö ¸ ÐÓ× Ù Ð × ×ÓÒ Ñ ÒÓÖ × Ð
     Ö Þ¸ ÐÙ Ó Ú × Ø Ð Ö Þ Ý¸ ¬Ò ÐÑ ÒØ ¸ Ú × Ø ÐÓ× ÒÓ Ó× Ð Ö ¸ ÕÙ ×ÓÒ Ñ ÝÓÖ × ÕÙ
     Ð Ö Þº
          Ä ÔÖÓÔ               ÓÖ Ò ÙÒ Ö ÓÐ Ò Ö Ó       Ù×ÕÙ Ô ÖÑ Ø Ó ¬ ÖÐÓ ÓÒ Ð
     Ö ÓÖÖ Ó ÔÖ ¬ Ó Ó ×Ù¬ Óº × Ö¸ ÔÓ ÑÓ× Ö ÓÒרÖÙ Ö ÓÑÔÐ Ø Ñ ÒØ ÙÒ                    Ô ÖØ Ö
         ×Ù Ö ÓÖÖ Ó ÔÖ ¬ Óº
          Ë n0, n1, . . . , n|T|−1 Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó ÙÒ   T =< Ä(T ), Ö Þ(T ), Ê(T ) >º Ð Ö ¹
      ÓÖÖ Ó ÔÖ ¬ Ó ÒÓ× ÔÖÓÔÓÖ ÓÒ Ö Ø Ñ ÒØ Ö Þ(T ) = n0 Ý Ö Þ(Ä(T )) = n1º Ä ÔÖÓÔ
         ÓÖ Ò ÒÓ× Ö ÒØ Þ ÕÙ Ö Þ(Ê(T )) × Ö Ð ÔÖ Ñ Ö ÒÓ Ó Ò Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó ÕÙ ×
332                                                           Cap´        ´
                                                                       ıtulo 4. Arboles



      Ñ ÝÓÖ Ó Ù Ð ÕÙ Ö Þ(T )º × Ô٠׸ ÔÐ ÑÓ× ×Ø Ö ÞÓÒ Ñ ÒØÓ Ö ÙÖ× ÚÓ Ý Ó Ø Ò ÑÓ×
       Ð Ð ÓÖ ØÑÓ × Ù ÒØ
¿¿¾     ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                       ¾ ¿¿¾
            template <class Node> inline
        Node * preorder_to_binary_search_tree(DynArray<typename Node::key_type> & preorder,
                                              const int & l, const int & r)
        {
          if (l > r)
            return Node::NullPtr;
          Node * root = new Node(preorder[l]);
          if (l == r)
            return root;
           Ë first greater Ð ÔÖ Ñ Ö ÒÓ Ó Ñ ÝÓÖ ÕÙ Ð Ö Þ ¿¿¾
          LLINK(root) = preorder_to_binary_search_tree<Node>(preorder, l + 1, first_greater - 1);
          RLINK(root) = preorder_to_binary_search_tree<Node>(preorder, first_greater, r);
          return root;
        }
      Í× × DynArray ¾º
         right root × Ð ÔÖ Ñ Ö ÒÓ Ó¸      ÞÕÙ Ö       Ö ¸ ÕÙ × Ñ ÝÓÖ ÕÙ Ð Ö Þ
      ´preorder[inf]µ ר ÒÓ Ó × Ð Ö Þ Ð ×Ù Ö ÓÐ Ö Óº È Ö ÐÓ Ð Þ ÖÐÓ¸ Ö ÓÖÖ ÑÓ×
      Ð Ò ÐÑ ÒØ Ð ÖÖ ÐÓ
¿¿¾    Ë first greater Ð ÔÖ Ñ Ö ÒÓ Ó Ñ ÝÓÖ ÕÙ Ð Ö Þ ¿¿¾ ≡      ´¿¿¾ µ
        int first_greater = l + 1;
        while ( (first_greater <= r) and (preorder[first_greater] < preorder[l]))
          ++first_greater;
           ר ÒÓ Ó Ô ÖØ ÓÒ Ð ÖÖ ÐÓ Ò Ó× Ô ÖØ ׺ Ä ÔÖ Ñ Ö ÓÑÔÖ Ò        ÒØÖ l + 1
      Ý right root - 1¸ ÓÖÖ ×ÔÓÒ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó Ð ×Ù Ö ÓÐ ÞÕÙ Ö Óº Ä × ÙÒ
      Ô ÖØ ¸ ÓÑÔÖ Ò      ÒØÖ right root Ý r¸ ÓÖÖ ×ÔÓÒ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó Ð ×Ù Ö ÓÐ
        Ö Óº
      4.9.1   B´squeda en un ABB
               u
        ÓÒ× Ö ÑÓ× T ∈      Ý ÙÒ Ð Ú k Ù× Ö× Ò Ð Ö Óк È Ö         ÖÐÓ¸ Ò×Ô ÓÒ ¹
      ÑÓ× Ã (T )¸ × k = Ã (T )¸ ÒØÓÒ × k × Ó Ò ÓÒØÖ Óº ÐÓ ÓÒØÖ Ö Ó¸ ÓÑÔ Ö ¹
      ÑÓ× k < Ã (T ) × Ð ÔÖ     Ó × ÖØÓ¸ ÒØÓÒ × Ù× ÑÓ× Ò Ð ×Ù Ö ÓÐ ÞÕÙ Ö Ó
      ÐÓ ÓÒØÖ Ö Ó¸ Ù× ÑÓ× Ò Ð ×Ù Ö ÓÐ Ö Óº Ë ÙÖ ÒØ ר ÔÖÓ ×Ó ÒÓ× Ò ÓÒØÖ ÑÓ×
       ÓÒ ÙÒ ×Ù Ö ÓÐ Ú Ó¸ ÒØÓÒ × ÓÒ ÐÙ ÑÓ× ÕÙ k ÒÓ × Ò Ù ÒØÖ ÒØÖÓ Ð Ö Óк
           Ð × Ù ÒØ Ð ÓÖ ØÑÓ Ö ­ ר ÔÖÓ ×Ó
¿¿¾     ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                        ¿¿¾ ¿¿¿
            template <class Node, class Compare> inline
        Node * searchInBinTree(Node * root, const typename   Node::key_type & key)
        {
          while (root != Node::NullPtr)
            if (Compare () (key, KEY(root)))            //   ¿Est´ en rama izquierda?
                                                                 a
              root = static_cast<Node*>(LLINK(root));   //   baje a rama izquierda
            else if (Compare() (KEY(root), key))        //   ¿Est´ en rama derecha?
                                                                 a
              root = static_cast<Node*>(RLINK(root));   //   baje a rama derecha
            else
              break;                                    //   se encontr´!
                                                                       o
´
      4.9. Arboles binarios de b´squeda
                                u                                                  333



           return root;
       }
        ¬Ò ×
       searchInBinTree¸   Ù×   Ò ÙÒ ¿¿ º
            ר ÔÖ Ñ Ø Ú Ù× Ò Ð Ö ÓÐ ÙÒ ÒÓ Ó ÓÒ Ú ÐÓÖ Ð Ú key Ý Ö ØÓÖÒ ×Ù Ö ÓÒ
      × Ð Ð Ú × Ò ÓÒØÖÓ Ó Node::NullPtr ÐÓ ÓÒØÖ Ö Óº
          searchInBinTree() × ÙØ Ð Þ Ò Ð Ñ ÝÓÖ        Ì ÙÒ Ñ ÒØ Ó× Ò            º
            Ð × ÑÔ ÒÓ       ר Ð ÓÖ ØÑÓ Ô Ò         Ù Ò ÕÙ Ð Ö Ó ×Ø Ð Ö Óк Ë ×Ø
      Ø Ò       ר Ö ÓÑÔÐ ØÓ¸ ÒØÓÒ × ×Ù ÐØÙÖ Ø Ò      Ð |T | º    ר ÑÓ Ó¸ × Ö ÒØ Þ ÑÓ×
      ÕÙ Ð Ö ÓÐ × ÕÙ Ð Ö Ó¸ ÒØÓÒ × Ð Ù×ÕÙ            Ò ÙÒ Ö ÓÐ Ò Ö Ó ÒÓ Ö ÕÙ Ö Ö Ñ ×
       Ð |T | ÓÑÔ Ö ÓÒ × Ü Ø Ñ ÒØ Ð Ñ ×Ñ Ð                   × ÖÚ Ó Ð Ù×ÕÙ        ÒÖ º
        Ð ØÖÙ Ó ×¸ Ô٠׸ ÐÓ Ö Ö ÕÙ Ð × Ò× Ö ÓÒ × Ý ×ÙÔÖ × ÓÒ × Ð Ö ÓÐ ÐÓ Ñ ÒØ Ò Ò Ò
       ÕÙ Ð Ö Óº
      4.9.1.1   B´ squeda del menor y del mayor elemento de un ABB
                 u

      Ë ÑÓ× ÕÙ Ð Ö ÓÖÖ Ó Ò¬ Ó ÙÒ             ÑÙ ×ØÖ Ð × Ù Ò ÓÖ Ò º ÈÓÖ Ø ÒØÓ¸
       Ð Ñ ÒÓÖ Ý Ð Ñ ÝÓÖ ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ× Ð ÓÒ ÙÒØÓ ×Ø Ö Ò Ó× ÔÓÖ Ð ÔÖ Ñ Ö Ý
      ÙÐØ ÑÓ Ð Ñ ÒØÓ× Ð Ö ÓÖÖ Ó Ò¬ Ó¸ ÐÓ× Ù Ð × × ÒØ ¬ Ò Ô ØÓÖ Ñ ÒØ ¸ Ñ Ò Ö
         Ò Ö Ð¸ Ò Ð × Ù ÒØ ¬ ÙÖ
                                           T



                                   L(T )          R(T )
                    M´nimo −→
                     ı                                    ←− M´ximo
                                                              a

      ÈÖ T∈       ¸ Ð Ñ Ò ÑÓ × Ò Ù ÒØÖ Ò Ð ÒÓ Ó Ñ × Ð ÞÕÙ Ö ¸ Ñ ÒØÖ × ÕÙ Ð
      Ñ Ü ÑÓ Ò Ð Ñ × Ð Ö º        ר ÓÒÓ Ñ ÒØÓ¸ ×   Ù Ò ÐÓ× × Ù ÒØ × Ð ÓÖ ØÑÓ×
¿¿¿    ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                      ¿¿¾ ¿¿
           template <class Node>
       Node * find_min(Node * root)
       {
         while (LLINK(root) != Node::NullPtr)
           root = static_cast<Node*>(LLINK(root));
         return root;
       }
           template <class Node>
       Node * find_max(Node * root)
       {
         while (RLINK(root) != Node::NullPtr)
           root = static_cast<Node*>(RLINK(root));
         return root;
       }
           Ñ × ÔÖ Ñ Ø Ú × Ö Ò ÙÒ ÒÓ Ó Ö Þ ÙÒ        Ý Ö ØÓÖÒ Ò Ð Ñ Ò ÑÓ Ý Ñ Ü ÑÓ¸
      Ö ×Ô Ø Ú Ñ ÒØ º
          Ë Ð       ר ÕÙ Ð Ö Ó¸ ÒØÓÒ × find min() Ý find max() Ø Ò Ò ÓÑÔÐ
      O(Ð n)º
334                                                           Cap´        ´
                                                                      ıtulo 4. Arboles



     4.9.1.2   B´ squeda del predecesor y sucesor
                u

         ÓT∈       ¸ Ù Ð × Ð ×Ù ×ÓÖ Ã (T )? ÈÓÖ Ð ÔÖÓÔ         ÓÖ Ò ÙÒ    ¸
     × ÑÓ× ÕÙ ×Ø ×Ù ×ÓÖ¸ × Ü ×Ø ¸ × Ò Ù ÒØÖ Ò Ð ÒÓ Ó Ñ × Ð ÞÕÙ Ö     Ð ÖÑ
       Ö      Ý Ð ÓÒ ÓÒ     Ü ×Ø Ò ×¸ Ùר Ñ ÒØ ¸ ÕÙ Ü ×Ø ÙÒ Ö Ñ Ö º ÐÓ
      ÒØ Ö ÓÖ¸ ×   Ù Ð Ð ÓÖ ØÑÓ × Ù ÒØ
¿¿     ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                       ¿¿¿ ¿¿
          template <class Node> inline
      Node * find_successor(Node * p, Node *& pp)
      {
        pp = p;
        p = static_cast<Node*>(RLINK(p));
        while (LLINK(p) != Node::NullPtr)
          {
            pp = p;
            p = static_cast<Node*>(LLINK(p));
          }
        return p;
      }
        find successor() Ö ØÓÖÒ Ð ÒÓ Ó ×Ù ×ÓÖ p Ý ×Ù Ô Ö Ò Ð Ô Ö Ñ ØÖÓ ppº Ä
     ÐÐ Ñ       Ö Ð Þ Ö× ×Ó Ö p Ý ×Ù Ô Ö º
         ÄÓ Ð ÒØ find successor() × ÕÙ ÒÓ × Ö ÕÙ Ö ÙÒ ÓÔ Ö ÓÖ ÓÑÔ Ö ÓÒº
     Ä ØÓÔÓÐÓ    Ð Ö ÓÐ ÔÖÓÔÓÖ ÓÒ Ð Ö ×ÙÐØ Óº
                                             T



                      L(T )                                        R(T )
                              ←−Predecesor       Sucesor−→


        ÙÖ º¿ Í        ÓÒ × Ò Ö Ð × Ð ÒÓ Ó ÔÖ       ×ÓÖ Ý ×Ù ×ÓÖ     Ð Ö Þ   ÙÒ Ö ÓÐ T
        Ä Ù×ÕÙ        Ð ÔÖ    ×ÓÖ × Ò ÐÓ º
     4.9.1.3   B´ squedas especiales sobre un ABB
                u

       Ò Ð ÙÒ × ÒÓ Ø Ò Ü Ô ÓÒ Ð × Ó × ÓÒ × × Ö ÕÙ Ö Ò ÓÒØÖ Ö ÙÒ ÒÓ Ó ÕÙ ¸ Ò ÐÙ Ö
          ÓÖÖ ×ÔÓÒ Ö× ÓÒ Ð Ð Ú ¸      Ð ÙÒ ÓÖÑ Ù Ö ÓØÖ Ö Ð ÓÒ ÓÒ ÐÐ º Ò ×Ø
     × ØÙ ÓÒ Ò Ò Ó× Ø ÔÓ×        Ù×ÕÙ     Ð Ð Ô Ö ÙÒ Ð Ú Ô ÖØ Ò ÒØ Ð Ö ÓÐ
     Ý Ð Ð ÕÙ × Ö Ð Ô Ö ÙÒ Ð Ú ÒÓ Ô ÖØ Ò ÒØ º
         Ä ÔÖ Ñ Ö Ù×ÕÙ × ÜÔÖ × Ð × Ù ÒØ ÑÓ Ó
¿¿      ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                        ¿¿ ¿¿
          template <class Node, class Compare> inline
      Node * search_parent(Node * root, const typename Node::key_type & key,
                           Node *& parent)
      {
        while (true)
          if (Compare () (key, KEY(root)))
´
     4.9. Arboles binarios de b´squeda
                               u                                                             335



             {
                 if (LLINK(root) == Node::NullPtr)
                   return root;
                 parent = root;
                 root = static_cast<Node*>(LLINK(root));
             }
           else if (Compare () (KEY(root), key))
             {
               if (RLINK(root) == Node::NullPtr)
                 return root;
               parent = root;
               root = static_cast<Node*>(RLINK(root));
             }
           else
             return root;
       }
        search parent() Ù× Ð Ð Ú key Ò Ð                        ÙÝ Ö Þ × rootº Ä ÖÙØ Ò Ö ØÓÖÒ Ð
     ÒÓ Ó ÕÙ ÓÒØ Ò key Ý ×Ù ÒÓ Ó Ô Ö × Ù Ö                      Ò Ð Ô Ö Ñ ØÖÓ ÔÓÖ Ö Ö Ò parent¸
      Ð ÙÐ      Ò Ð Þ Ö× Ò Ð Ô Ö Ð Ö Þº
         ÓÒ× Ö ÑÓ× Ð × Ù ÒØ           ÑÔÐÓ
                                                       50

                                           25                 80

                                      10          30               90

       Ð Ö ÓÐ ÓÒØ Ò Ð × Ð Ú × 10, 25, 30, 50, 80, 90 ÒØÖ ÙÒ ÓÒ ÙÒØÓ Ò¬Ò ØÓ ÔÓ× Ð × Ú ¹
     ÐÓÖ ×º Ë Ð Ö ÓÐ Ö × Ò ØÙÖ ÐÑ ÒØ × Ö¸ ×ÓÐÓ ÔÓÖ ×Ù× ÔÙÒØ ׸ Ò ÓÒ ÓÐÓ Ö
     ÒÙ Ú × Ð Ú × º Ä Ö ×ÔÙ ×Ø × Ú Ò Ò Ð Ö ÓÐ × Ù ÒØ
                                                           50

                                    25                                 80

                         10                    30           [51..79]               90

                 [−∞..9] [11..24]   [26..29]    [31..49]                [81..89]   [91..∞]

      Ð ÙÒ Ó ×Ô Ó ½ ÔÓÖ ÓÒ ÔÙ          Ö Ö Ò ØÙÖ ÐÑ ÒØ ÙÒ        × ØÖ Ú × ×Ù×
     ÒÓ Ó× ÜØ ÖÒÓ׺     Ó ÓØÖÓ ÑÓ Ó¸ ÕÙ Ð Ú Ó ÕÙ Ö ÔÖ × ÒØ ÙÒ ÒÓ Ó ÜØ ÖÒÓ ×
     Ó ÙÔ Ó × Ñ ÒØ ÔÓÖ ÙÒ ÒÙ ÚÓ ÒÓ Ó ÒØ ÖÒÓº
         ÄÙ Ó     ÜÔÖ × Ó ÐÓ ÒØ Ö ÓÖ¸ ÕÙ Ö × ÒØ Ó Ô Ò× Ö ÙÒ Ù×ÕÙ       ÙÒ Ö Ò Ó
     ÕÙ ÒÓ ×Ø Ò Ð Ö Óк Ç × ¸ Ù× Ö ÐÓ× ÔÙÒØÓ× ÔÓÖ ÓÒ ÔÙ       Ö Ö ÙÒ       ºÌÐ
      Ù×ÕÙ Ð ÒרÖÙÑ ÒØ Ð ÙÒ ÓÒ
¿¿     ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                        ¿¿ ¿¿
           template <class Node, class Compare> inline
       Node * search_rank_parent(Node * root, const typename Node::key_type & key)
      ½
          Ò ×Ø Ô ÖÖ Ó Ð × ÒÓ ÓÒ ×     ×Ô Ó ¸ Ò ØÙÖ Ð Ý      × Ó × ÒÙÒ Ò Ò Ð × ÒØ Ó   Ð Ò
      × ÑÓ ÖÒ º Ë Ù× Ò ÓÑ ÐÐ × Ý Ò × × Ø Ð Ó ÔÓÖÕÙ Ø Ð ×        × ÕÙ ¸ × Ò Ø Ñ Ò ×ÓÒ ×ØÖ Ø ×
      Ò ÒÙ ×ØÖÓ ÑÙÒ Ó ÓØ ÒÓ¸ ×ÓÒ ÙÒ Ñ × ×ØÖ Ø × Ò Ð × ÙÖ×Ó Ð ÔÖÓ Ö Ñ ÓÒ           ÓÑÔÙØ ÓÖ ×
     Ñ Ü Ñ Ù Ò Ó Ð ÓÒ ÔØÓ         Ö ÓÐ Ò Ö Ó ×¸ ÓÑÓ Ø Ð¸ ÔÙÖ ×ØÖ ÓÒº
336                                                          Cap´        ´
                                                                     ıtulo 4. Arboles



      ÙÝ ÑÔÐ Ñ ÒØ ÓÒ ÔÙ Ó × ÖÚ Ö× Ò Ð  Ð ÓØ º
       Ä ÖÙØ Ò Ù× Ð Ð Ú key Ò ÙÒ Ö ÓÐ ÓÒ Ö Þ root Ý Ö ØÓÖÒ Ð ÒÓ Ó ÕÙ × Ö
     Ô Ö ÙÒ Ð Ú keyº
     4.9.2    El TAD BinTree<Key>
       ÒØ ×    ÒØÖÓ Ù Ö ÐÓ× Ð ÓÖ ØÑÓ× Ò× Ö ÓÒ Ý ×ÙÔÖ × ÓÒ¸ × ÓÒÚ Ò ÒØ ÒØÖÓ Ù Ö
     ÒÙ ×ØÖÓ Ì        × ÕÙ ÑÓ Ð Þ ÙÒ Ö ÓÐ Ò Ö Ó      Ù×ÕÙ º Ì Ð Ì × ×Ô ¬
      Ò Ð Ö ÚÓ ØÔÐ ÒÌÖ ºÀ ¿¿ ÙÝ ×ØÖÙ ØÙÖ × Ð × Ù ÒØ
¿¿    ØÔÐ ÒÌÖ ºÀ ¿¿ ≡
           template <template <typename> class NodeType, typename Key, class Compare>
       class GenBinTree
       {
            ¬Ò ÓÒ × ÔÙ Ð × BinTree<Key> ¿¿
          Ñ Ñ ÖÓ× ØÓ BinTree<Key> ¿¿
          Å ØÓ Ó× BinTree<Key> ¿¿
       };
           template <typename Key, class Compare = Aleph::less<Key> >
       class BinTree : public GenBinTree<BinNode, Key, Compare>
       { /* empty */ };
           template <typename Key, class Compare = Aleph::less<Key> >
       class BinTreeVtl : public GenBinTree<BinNodeVtl, Key, Compare>
       { /* empty */ };
     Í× × BinNode ¾ ¼ Ò   BinNodeVtl   ¾¼º
           ØÔÐ ÒÌÖ ºÀ ¿¿           ¬Ò ØÖ × Ð × ×
          ¯ GenBinTree<NodeType, Key, Compare>      ÕÙ × Ð Ð × Ò Ö ÕÙ ÑÔÐ ÒØ Ð
         ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð ×ØÖÙ ØÙÖ ×                 ØÓ×½ Ñ ÒØ ÙÒ        º ר Ð × ×ÓÐÓ
          ר ר Ò           ÑÔÐ ÒØ Ö Ý ÒÓ × Ù×Ó Ð Ð ÒØ º
       ¯ BinTree<Key> ÕÙ × ÙÒ Ð × Ô Ö Ñ ØÖ Þ              ÕÙ ÑÔÐ ÒØ Ð ÔÖÓ Ð Ñ ÙÒ Ñ Ò¹
         Ø Ð ØÖ Ú × ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ                   ÒÓ Ó× Ò Ö Ó× ÓÒ Ð Ú × Ø ÔÓ Keyº
           ר Ð × × ÑÔÐ ÒØ            Ö Ø Ñ ÒØ ÔÓÖ Ö Ú ÓÒ ÔÙ Ð           GenBinTreeº ×
         Ô٠׸ ×Ù ÒØ Ö Þ × Ü Ø Ñ ÒØ Ð Ñ ×Ñ ÕÙ GenBinTreeº
       ¯ BinTreeVtl<Key> ÕÙ × ÕÙ Ú Ð ÒØ Ð BinTree<Key> × ÐÚÓ ÕÙ ÐÓ× ÒÓ Ó× ÔÓ× Ò
            רÖÙ ØÓÖ × Ú ÖØÙ Ð ×º
       ÈÖ       Ð Ø Ö ÐÓ× Ð ÓÖ ØÑÓ׸ ØÓ Ó× ÐÓ× Ø ÔÓ× ×ØÖ ØÓ× × Ó× Ò Ö ÓÐ × Ò Ö Ó×
     Ù×ÕÙ ÙØ Ð Þ Ö Ò ÙÒ ÒÓ Ó            Ö
¿¿   Ñ Ñ ÖÓ× ØÓ BinTree<Key> ¿¿ ≡                                      ´¿¿ µ
       Node    headNode;
       Node * head;
       Node *& root;
     headNode   Ö ÔÖ × ÒØ Ð ÒÓ Ó  Ö ¸ head × Ð Ö ÓÒ Ð                   Ö Ý root   × ÙÒ
     Ö ÖÒ        Ð Ð ÞÓ Ö Ó headº Ò ÓØÖÓ× Ø ÖÑ ÒÓ׸ RLINK(head)      == rootº
      ½
          Ê ÓÖ Ö Ü ½º¿ ´Ô Ò ½ µº
´
     4.9. Arboles binarios de b´squeda
                               u                                                                             337



         Ä × ÔÖ Ñ Ø Ú × GenBinTree Ñ Ò ÔÙÐ Ò ÒÓ Ó× Ò Ö Ó× ÙÝ ×Ô ¬                                   ÓÒ × ÜÔÓÖØ
      Ð Ù×Ù Ö Ó Ð × Ù ÒØ ÑÓ Ó
¿¿       ¬Ò ÓÒ × ÔÙ Ð × BinTree<Key> ¿¿ ≡                       ´¿¿                             µ
         typedef NodeType<Key> Node;
      Ð Ø ÔÓ × Ö BinTree<Key>::Node Ô Ö ÒÓ Ó× ÓÑÙÒ × Ó BinTreeVtl<Key>::Node Ô Ö
     ÒÓ Ó× ÓÒ ×ØÖÙ ØÓÖ × Ú ÖØÙ Ð ×º
                                                       GenBinTree esta clase
                                                       esta destinada solo a implantar
                                                       no es de uso del cliente




                                                                       class NodeType, class Key, class Compare:
                                    GenBinTree
       -headNode: Node
       -head: Node *
       -root: Node *
       -<<GenBinTree(const GenBinTree<NodeType,
                      Key>& )>> GenBinTree()
       -<<GenBinTree & operator =(const GenBinTree &)>> operator =()
       -remove(p:Node*,pp:Node*)
       +GenBinTree()
       +search(key:const Key&): Node *
       +~GenBinTree(): virtual
       +getRoot(): Node*&
       +verifyBin(): bool
       +reset(): void
       +remove(key:const Key&): Node*




                          Key:
               BinTree<Key>
             +BinTree()                                    Key:
                                                    BinTreeVtl

                                                 +BinTreeVtl()



                 ÙÖ º¿             Ö Ñ ÍÅÄ           Ð × Ð × × ÓÒ ÖÒ ÒØ ×            BinTree<Key>

       Ä Ù×ÕÙ × Ö Ñ Ø ÒÚÓ Ö                         searchInBinTree()
¿¿   Å ØÓ Ó× BinTree<Key> ¿¿ ≡                                                     ´¿¿ µ ¿¿
       Node * search(const Key & key)
       {
         return searchInBinTree <Node, Compare>(root, key);
       }
     Í× × searchInBinTree ¿¿¾ º
       ÍÒ Ó × ÖÚ ÓÖ × Ò Ð¸ ×Ó Ö ØÓ Ó Ô Ö ÔÓ Ö Ð Ö Ö Ð Ñ ÑÓÖ Ó ÙÔ                                           ÔÓÖ Ð
     Ö ÓÐ Ò Ö Ó¸ × Ð ÓÒ×ÙÐØ Ð Ö Þ
¿¿   Å ØÓ Ó× BinTree<Key> ¿¿ +≡                 ´¿¿ µ ¿¿ ¿¿
       Node*& getRoot() { return root; }


     4.9.3    Inserci´n en un ABB
                     o
     Ä Ò× Ö ÓÒ Ó      Ð Ö Ñ ÒØÓ Ò ØÙÖ Ð ÙÒ Ö ÓÐ × Ö¸ ÔÓÖ Ð × ÔÙÒØ × Ù
      Ó ×º   Ó ÙÒ ÒÓ Ó Ò× ÖØ Ö p¸ ÑÓ× Ò ÓÒØÖ Ö ÙÒ ÒÓ Ó ÜØ ÖÒÓ Ô Ö ×Ùר ØÙ ÖÐÓ
338                                                                  Cap´        ´
                                                                             ıtulo 4. Arboles



     ÔÓÖ p Ñ Ò Ö Ø Ð ÕÙ ÒÓ × Ú ÓÐ Ð ÔÖÓÔ               ÓÖ Ò ÙÒ     º ×ÙÑ Ò Ó ÕÙ
     Ð × Ð Ú × ÒÓ × Ö Ô Ø Ò¸ ÓÒ ÓÒ ÕÙ ×           ÓÖ ÑÔÓÒ ÑÓ× Ð Ì BinTree<Key>¸
      Ü ×Ø ÙÒ ×ÓÐÓ ÒÓ Ó ÜØ ÖÒÓ Ô Ö ×Ùר ØÙ Ö ÔÓÖ pº ÈÓÖ ÑÔÐÓ¸ ÓÒ× Ö ÑÓ× Ò× ÖØ Ö ÙÒ
     ÒÓ Ó ÕÙ ÓÒØ Ò Ú ÐÓÖ Ð Ú 27
                                                                23

                      23                                   15                  47

                15              47                   10                   31        59

           10              31           59                           27


       ´ µ ÒØ ×      27                              ´ µ ÄÙ Ó   27


           РܹÒÓ Ó¹ ÜØ ÖÒÓ ¸ Ó ÞÕÙ Ö Ó Ð 31¸ Ù ×Ùר ØÙ Ó ÔÓÖ ÙÒÓ ÒØ ÖÒÓ ÓÒ Ú ÐÓÖ
     27¸  Р٠и ØÖ Ú × ×Ù× Ó× ÒÓ Ó× ÜØ ÖÒÓ׸ Ö Ó× Ö × Ò Ð Ö Óк Ä ÔÖ Ñ Ö
      ר       ÔÓÖ Ð Ð ÞÓ ÞÕÙ Ö Ó Ð 27 Ý ÔÙ      Ð Ö Ö Ð Ú × ÒØÖ [24..26]¸ Ñ ÒØÖ × ÕÙ
     Ð × ÙÒ Ö          Ð Ö ÔÖ × ÒØ Ð Ð ÞÓ Ö Ó Ý ÔÓ Ö Ð Ö Ö Ð Ú × ÒØÖ [28..30]º
           Ð Ö Ó ÒØ Ö ÓÖ ÒÓ× Ò         ÕÙ Ô Ö      ØÙ Ö ÙÒ Ò× Ö ÓÒ × Ñ Ò ×Ø Ö Ù× Ö
      Ð ÒÓ Ó ÜØ ÖÒÓ ×Ù ×Ø ØÙ Öº ÓÖ Ò¸              ØÓ×      ÒÐ Þ Ö Ð ÒÙ ÚÓ ÒÓ Ó¸ × Ö ¹
     ÕÙ Ö Ó Ø Ò Ö ÙÒ ÔÙÒØ ÖÓ Ð ÕÙ × Ö Ð Ô Ö Ð ÒÓ Ó Ò× ÖØ Ö ¹ Ò Ð ÑÔÐÓ¸ ÙÒ
     ÔÙÒØ ÖÓ Ð ÒÓ Ó ÓÒ Ð Ú 31¹º Ë Ò ×Ø              ÓÒ ÔÙ ÒרÖÙÑ ÒØ Ö× Ñ ÒØ Ð
     ÖÙØ Ò search rank parent() Ñ Ò ÓÒ        Ò Ü º º½º¿ ´Ô Ò ¿¿ µ¸ × ÔÖ Ö Ð ¸        ¹
     ØÓ× Ð × ÑÔÐ         ¸ Ñ ÑÓÖ Þ Ö ×Ø ÔÙÒØ ÖÓ Ö Ð Þ Ò Ó ÙÒ Ù×ÕÙ Ö ÙÖ× Ú Ý ÐÙ Ó
      Ò× ÖØ Ò Ó Ð ÒÙ ÚÓ ÒÓ Óº ר × Ð Ò ÓÕÙ Ð × Ù ÒØ Ð ÓÖ ØÑÓ
¿¿     ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                               ¿¿ ¿¿
           template <class Node, class Compare> inline
       Node * insert_in_binary_search_tree(Node *& root, Node * p)
       {
         if (root == Node::NullPtr)
           return root = p;
         if (Compare () (KEY(p), KEY(root)))        // ¿p < root?
           return insert_in_binary_search_tree <Node, Compare> // insertar en izquierdo
             (static_cast<Node*&>(LLINK(root)), p);
         else if (Compare () (KEY(root), KEY(p)))   // ¿p > root?
           return insert_in_binary_search_tree <Node, Compare> // insertar en derecho
             (static_cast<Node*&>(RLINK(root)), p);
         return Node::NullPtr;                  // clave repetida ==> no hay inserci´n
                                                                                    o
       }
       ¬Ò ×
       insert in binary search tree¸   Ù×    Ò ÙÒ × ¿¿    Ò ¿   º
         Ä ÖÙØ Ò Ò× ÖØ Ð ÒÓ Ó p Ò Ð      ÓÒ Ö Þ root Ý Ö ØÓÖÒ Ð Ö Þ Ð Ö ÓÐ Ò Ö Ó
     Ö ×ÙÐØ ÒØ Ò ×Ó ÕÙ Ð Ò× Ö ÓÒ Ø Ò Ü ØÓ × Ö¸ × Ð Ð Ú ÓÒØ Ò Ò p ÒÓ
     × Ò Ù ÒØÖ Ò Ð Ö Óк ÐÓ ÓÒØÖ Ö Ó¸ ÔÙ ×ØÓ ÕÙ ÒÓ × Ô ÖÑ Ø Ò Ð Ú × ÙÔÐ     ׸ ×
     Ö ØÓÖÒ Node::NullPtrº
         ÆÓØ ÑÓ× ÕÙ Ð Ô Ö Ñ ØÖÓ root × Ô × ÔÓÖ Ö Ö Ò ¸ Ô٠׸ Ò Ð ×Ó ×          Ð
     Ö ÙÖ× ÓÒ¸ × ÑÓ ¬ Ð Ö Þº
´
     4.9. Arboles binarios de b´squeda
                               u                                                                                            339



       Å ÒØ Ð ÒØ Ö ÓÖ ÖÙØ Ò                           Ò Ö ¸ Ð ÑÔÐ ÒØ ÓÒ Ð Ñ ØÓ Ó insert() × Ñ Ö
     Ù ×Ø ÓÒ ÓÖÑ
¿¿   Å ØÓ Ó× BinTree<Key> ¿¿                         +≡                       ´¿¿ µ ¿¿             ¿½
       Node * insert(Node *p)
       {
         return insert_in_binary_search_tree<Node, Compare>(root, p);
       }
     Í× × insert in binary search tree ¿¿ º

     4.9.4    Partici´n de un ABB por clave (split)
                     o
       Ò ×Ø ÓÔ Ö ÓÒ¸ ÙÒ Ö ÓÐ T ÓÒ × Ù Ò Ò¬ Ò Ö Si =< k1, k2, k3, . . . , kn > ×
     Ô ÖØ ÓÒ × ÙÒ ÙÒ Ð Ú kx Ò Ó× Ö ÓÐ × T< Ý T> Ø Ð ÕÙ Si =< k1, k2, k3, . . . , > |        <
     ∀ki ∈ T<, ki < kx Ý Si =< . . . , kn > | ∀ki ∈ T>, ki > kxº
                                   >
         Ä ÔÖ Ñ Ø Ú ÕÙ ÒÓ× Ö Ð Þ Ð Ô ÖØ ÓÒ × ÒÓÑ Ò split key rec(T, kx, T<, T>)
      ÓÒ T × Ð Ö ÓÐ Ô ÖØ ÓÒ Ö¸ kx × Ð Ð Ú                Ô ÖØ ÓÒ Ý T< Ý T> ×ÓÒ ÐÓ× Ö ÓÐ ×
     Ö ×ÙÐØ ÒØ × Ð Ô ÖØ ÓÒº
          Ð ÔÖ Ò Ô Ó Ö ÙÖ× ÚÓ Ð Ô ÖØ ÓÒ × × ÑÔÐ Ý × Ô ØÓÖ Þ Ò Ð Ö Ñ × Ù ÒØ
                split key rec(T, k x , T < , T > )
                                                                     split key rec(T, k x , T < , T > )
                K(T )
                                                                      K(T )
                                                                                 if k x >   Ã    (T )
                                                                                                          split key rec(R(T), k x , R(T), T > )



      L(T )                   R(T )
                                                             L(T )

                                                                                    T<                            T>

                                                                         T<                                          T>
                                                     =⇒
         ´ µ Ë ØÙ ÓÒ Ò         Ð                                     ´ µ ÄÙ Ó          split()          ÒÖ Þ

         ÄÐ Ñ ÑÓ× kx Ð Ð Ú          Ô ÖØ ÓÒ Ý ×ÙÔÓÒ ÑÓ× kx > à (T )º Ò ×Ø ×Ó¸ ×
         ØÙ ÙÒ ÐÐ Ñ Ö ÙÖ× Ú split key rec(Ê(T ), kx, T<, T>) ×Ó Ö Ê(T )¸ Ð Ù Ð
      ÖÖÓ Ó× Ö ÓÐ × T< Ý T> ÔÖÓ Ù ØÓ Ô ÖØ ÓÒ Ö Ê(T ) ÓÒ kxº Ð Ö ×ÙÐØ Ó ¬Ò Ø ÚÓ ×
     T< =< Ä(T ), T, Ä(T ) > ÓÒ Ä(T ) = T<º Ä ÓØÖ Ô ÖØ ÓÒ¸ T>¸ × Ö Ø Ñ ÒØ Ð Ö ÓÐ
     T> = T>º
         Ë kx < Ã (T ) Ð Ð ÓÖ ØÑÓ × × Ñ ØÖ Ñ ÒØ ÒØ Óº
          Ð ×Ó ×           Ð Ö ÙÖ× ÓÒ × Ð Ô ÖØ ÓÒ ×Ó Ö Ð Ö ÓÐ Ú Ó¸ Ð Ù Ð ÖÖÓ Ó×
      Ö ÓÐ × Ú Ó׺
          ÓÒ ÐÓ ÒØ Ö ÓÖ¸ Ð Ð ÓÖ ØÑÓ Ö ×ÙÐØ ÒØ     Ö × Ö ÓÑÔÖ Ò× Ð × Ò ¬ ÙÐØ ×
¿¿     ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                             ¿¿ ¿ ½
       # define SPLIT split_key_rec<Node, Compare>
           template <class Node, class Compare> inline
       bool split_key_rec(Node * root, const typename Node::key_type & key,
                          Node *& ts, Node *& tg)
       {
         if (root == Node::NullPtr)
340                                                                                                Cap´        ´
                                                                                                      ıtulo 4. Arboles



        {      // key no se encuentra en arbol ==> split tendr´ ´xito
                                         ´                    a e
            ts = tg = Node::NullPtr;
            return true;
        }
      if ( Compare() (key, KEY(root)) ) // ¿key < KEY(root)?
        if (SPLIT(static_cast<Node*&>(LLINK(root)), key,
                  ts, static_cast<Node*&>(LLINK(root))))
          {
            tg = root;
            return true;
          }
        else
          return false;
      if ( Compare() (KEY(root), key) ) // ¿key > KEY(root)?
        if (SPLIT(static_cast<Node*&>(RLINK(root)), key,
                  static_cast<Node*&>(RLINK(root)), tg))
          {
            ts = root;
            return true;
          }
        else
          return false;
      return false; // clave existe en arbol ==> se deja intacto
                                       ´
 }
 ¬Ò ×
 split key rec¸      Ù×     Ò ÙÒ × ¿ ½ Ò ¿ º
                                                  19
                                                                             29    split key rec(29, 19, ...)
                     split key rec(13, 19, ...)

                                       13                                               45
                                                          split key rec(25, 19, ...)

                            8                                      25             30               77
                                      split key rec(20, 19, ...)

                       1         12                    20               27                   53         91

        split key rec(15, 19, ...)          15               22

             split key rec(18, 19, ...)           18

                                     ÙÖ º¿ ÌÖ Þ Ó                    ÙÒ Ð Ò                Ú × ÓÒ

                   Ø Ò Ù ØÖÓ Ô Ö Ñ ØÖÓ׸ Ó×
     split key rec()                              ÒØÖ Ý Ó× × Ð º ÄÓ×
 ÒØÖ ×ÓÒ Ð Ö Þ Ð Ö ÓÐ Ô ÖØ ÓÒ Ö root Ý Ð Ð Ú Ô ÖØ ÓÒ keyº ÄÓ× Ô Ö Ñ ØÖÓ×
   × Ð ×ÓÒ Ó× Ö ÓÐ × ts Ý tgº ×ÔÙ × Ð ÐÐ Ñ ¸ ts ÓÒØ Ò Ð Ð Ú × Ñ ÒÓÖ ×
ÕÙ key Ý tg ÓÒØ Ò Ð × Ñ ÝÓÖ × Ó Ù Ð ×º
   Ë Ð Ð Ú ÒÓ × Ò Ù ÒØÖ Ò Ð Ö Óи ÒØÓÒ × split key rec() Ö ØÓÖÒ true Ô Ö
 Ò Ö ÕÙ Ð Ö ÓÐ Ù Ô ÖØ ÓÒ Óº          ÐÓ ÓÒØÖ Ö Ó¸ ×    Ð Ö ÓÐ ÒØ ØÓ Ý × Ö ¹
ØÓÖÒ falseº
   È ØÓÖ Ñ ÒØ ¸ Ð Ô ÖØ ÓÒ ÔÙ ÒØ ÖÔÖ Ø Ö× ÓÑÓ Ð ØÖ Þ Ó ÙÒ Ð Ò Ú ×ÓÖ
× ÙÒ Ð Ð Ú     Ô ÖØ ÓÒº Ä ¬ ÙÖ º¿ ÐÙ×ØÖ Ø Ð Ð Ò ÓÒ Ð Ú 19 Ý × Ò Ò Ð ×
´
     4.9. Arboles binarios de b´squeda
                               u                                                        341



     ÐÐ Ñ × Ö ÙÖ× Ú × Ð Ô ÖØ ÓÒº × Ð ÒÓ Ó Ö Þ 29¸ × Ø ÖÑ Ò ÕÙ                ÑÓ× Ô ÖØ ¹
       ÓÒ Ö Ð Ö Ñ ÞÕÙ Ö      Ö Þ 13¸ ÔÙ × 19 × Ñ ÒÓÖ ÕÙ 29º split key rec(13, 19, ts,
     tg) Ö ØÓÖÒ Ð Ô ÖØ ÓÒ Ð ×Ù Ö ÓÐ ÓÒ Ö Þ 13º Ð Ô Ö Ñ ØÖÓ ts × Ð Ö ÓÐ T< Ö ×ÙÐØ Ó
        split key rec (29, 19, ts, tg)¸ Ñ ÒØÖ × ÕÙ Ð Ö ÓÐ T> × Ö < tg, 29, Ê(29) >º
          ÓÒ Ð ÖÙØ Ò ÒØ Ö ÓÖ¸ Ý ×Ø ÑÓ× Ð ×ØÓ× Ô Ö × Ö Ö Ð Ú Ö× ÓÒ Ð Ô ÖØ ÓÒ Ð
     Ì BinTree<Key>
¿½    Å ØÓ Ó× BinTree<Key> ¿¿ +≡                         ´¿¿ µ ¿¿ ¿ ¿
       bool split(const Key & key, GenBinTree & l, GenBinTree & r)
       {
         return split_key_rec<Node, Compare>(root, key, l.root, r.root);
       }
     Í× × split key rec ¿¿ º

     4.9.5    Uni´n exclusiva de ABB (join exclusivo)
                 o
       ÓÒ× Ö ÑÓ× Ó× Ö ÓÐ × T< Ý T> Ö ×ÙÐØ ÒØ × split key rec() Ý Ð ÓÔ Ö ÓÒ ÒÚ Ö×
      Ô Ö T< Ý T> Ò ÙÒ Ö ÓÐ T º Ê ÓÖ ÑÓ× ÕÙ Ò ×Ø ×Ó¸ T< Ý T> ×ÓÒ Ü ÐÙÝ ÒØ ׺
     ÄÐ Ñ ÑÓ× ×Ø ÓÔ Ö ÓÒ join exclusive(T<, T>)¸ Ð Ù Ð Ö ØÓÖÒ Ð Ö ÓÐ ÓÖÖ ×ÔÓÒ¹
        ÒØ ÙÒ Ö T< ÓÒ T>º Ð ¬ ÑÓ× Ð ÓÔ Ö ÓÒ             Ü ÐÙ× Ú ÔÓÖÕÙ × ÑÓ× ÕÙ ÐÓ×
     Ö Ò Ó× Ð Ú × ÒÓ × ×ÓÐ Ô Ò Ý ÕÙ T< ∩ T> = ∅¸ ÐÓ Ù Ð × ÙÒ ÓÒÓ Ñ ÒØÓ ÑÙÝ Ú Ð Ó×Ó¸
     ÔÙ × ÒÓ× Ô ÖÑ Ø Ö Ð Þ Ö ÙÒ Ð ÓÖ ØÑÓ Ô ÖØ ÙÐ Ö Ô Ö ×Ø ×Ó ÓÒ Ñ ÓÖ × ÑÔ ÒÓ ÕÙ
      Ð Ð ÙÒ ÓÒ Ò Ö Ð × ÐÓ× ÒØ ÖÚ ÐÓ× × ×ÓÐ Ô Ò Ó ÐÓ× Ð Ñ ÒØÓ× × ÓÑÔ ÖØ Òº
         Ä × Ù ÒØ ¬ ÙÖ ÐÙ×ØÖ ÐÓ× ÓÑÔÓÒ ÒØ × Ò Ö Ð × T< Ý T> ÕÙ Ö ÕÙ Ö ÑÓ× Ò¹
     Ø ¬ Ö Ô Ö × Ò Ö join exclusive(T<, T>)
                                      join exclusive(T<,T> )
                           T<                                        T>


               L(T < )                R(T < )             L(T > )             R(T > )




       Ð ×ÓÐÙ ÓÒ × Ô ØÓÖ Þ          Ð × Ù ÒØ ÑÓ Ó
                                       T<
                                                           T>
                          L(T < )
                                    join exclusive(R(T<),L(T> ))
                                                                    R(T > )




      Ð ×Ó × Ð Ð ÓÖ ØÑÓ × ÕÙ Ð ÙÒÓ ÐÓ× Ó× Ö ÓÐ × × Ú Óº
        ÄÓ ÒØ Ö ÓÖ ÒÓ× ÓÒÐÐ Ú Ð × Ù ÒØ Ð ÓÖ ØÑÓ
¿½     ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                 ¿¿ ¿ ¿
           template <class Node> inline
       Node * join_exclusive(Node *& ts, Node *& tg)
       {
         if (ts == Node::NullPtr)
           return tg;
         if (tg == Node::NullPtr)
342                                                             Cap´        ´
                                                                   ıtulo 4. Arboles



        return ts;
      LLINK(tg) = join_exclusive(RLINK(ts), LLINK(tg));
      RLINK(ts) = tg;
      Node * ret_val = ts;
      ts = tg = Node::NullPtr; // deben quedar vac´os despu´s del join
                                                  ı        e
      return ret_val;
 }
  ¬Ò ×
 join exclusive¸   Ù×   Ò ÙÒ × ¿ ¿ Ò       ¿º
  ר ÖÙØ Ò ÒÓ× × Ö           ×ÙÑ ÙØ Ð      Ô Ö × ÑÔÐ ¬ Ö ÓÒ× Ö Ð Ñ ÒØ Ð Ð ÓÖ ØÑÓ
Ð Ñ Ò ÓÒ ÙÒ              º
4.9.6    Eliminaci´n en un ABB
                  o
Ä Ð Ñ Ò ÓÒ ÔÓÖ Ð Ú Ü       Ó× × × Ù× Ö Ð ÒÓ Ó ÕÙ ÓÒØ Ò Ð Ð Ú Ý ÐÙ Ó
ÕÙ Ø ÖÐÓ Ð Ö Óк È ÖÓ Ý ÙÒ ¬ ÙÐØ ØÓÔÓÐÓ     Ô Ö ÕÙ Ø Ö Ð ÒÓ Óº ÓÒ× ¹
Ö ÑÓ× ÙÒ ÒÓ Ó p ÕÙ Ø Ö×    ÙÒ    Ý Ð × Ù ÒØ    ÖÑ
                                           q

                                                p




                                        L(p)        R(p)


Ë Ð Ø Ö ÐÑ ÒØ ÕÙ Ø ÑÓ× p¸ ÒØÓÒ ×        ÑÓ×     Ö Ð Ó ÓÒ ÐÓ× ØÖ × Ö Ó× ÕÙ ÕÙ Ò
 ×Ù ÐØÓ× × × Ô Ö p q −→ p¸ p −→ L(p) Ý p −→ R(p)º                     ÓÒ ÐÑ ÒØ ¸ Ô Ö
ÔÓ Ö ÑÓ ¬ Ö ÓÖÖ Ø Ñ ÒØ q¸              ÑÓ× ×Ø Ò Ù Ö Ü Ø Ñ ÒØ × p × Ó ÞÕÙ Ö Ó
Ó Ö Óº
    Ë ÓÒÓ Ò Ó× Ñ Ò Ö × ØÖ Ø Ö ÓÒ Ð ¬ ÙÐØ ÒØ Ö ÓÖ
   ½º ËÙ ×Ø ØÙ ÑÓ× p ÔÓÖ ×Ù ÒÓ Ó ÔÖ     ×ÓÖ Ò Ä(p)¸ Ó ÔÓÖ ×Ù ×Ù ×ÓÖ Ò Ê(p)º
      À Ý Ó× ÔÙÒØÓ× ÙÒ Ñ ÒØ Ð × ÕÙ           ÑÓ× ÒÓØ Öº ÈÖ Ñ ÖÓ¸ Ø ÒØÓ Ð ÔÖ       ×ÓÖ
       ÓÑÓ Ð ×Ù ×ÓÖ p × ÑÔÖ ×ÓÒ Ò ÓÑÔÐ ØÓ׺ Ò Ð ×Ó Ð ÔÖ                  ×ÓÖ¸ ר ר
          Ó ÔÓÖ Ð ÒÓ Ó Ñ × Ð ÞÕÙ Ö            Ä(p)¸ Ð Ù Ð Ø Ò ÕÙ × Ö Ò ÓÑÔÐ ØÓ¸
      ÔÙ × × ÒÓ ÓÒØÖ Ö Ð           Ó ÕÙ Ð ÔÖ         ×ÓÖ × Ð Ñ × Ð ÞÕÙ Ö º Ð
      Ö ÞÓÒ Ñ ÒØÓ × Ñ ØÖ Ó Ó ÙÖÖ ÓÒ Ð ×Ù ×ÓÖº
      ÈÙ ×ØÓ ÕÙ Ð ÒÓ Ó ×Ùר ØÙ Ö ×Ø Ò ÓÑÔÐ ØÓ¸ Ø Ò ÑÓ× ×Ù¬ ÒØ ×Ô Ó Ô Ö
       ÒÐ Þ Ö Ð × ØÖ × Ö Ñ × × ÒØ Ö Ñ ÑÓ× Ð ÒÓ Ó ×Ù ×Ø ØÙØÓ ÔÓÖ p¸ Ô٠׸ ÔÓÖ ÑÔÐÓ
       Ò Ð ÔÖ       ×ÓÖ¸ ×Ù Ö Ñ ÞÕÙ Ö ÐØ ÒØ × ×Ù ×Ø ØÙÝ ÔÓÖ Ä(p)º
      Ä × ÙÒ Ù ×Ø ÓÒ ÒÓØ Ö × ÕÙ Ð ÔÖ            ×ÓÖ Ý Ð ×Ù ×ÓÖ ×ÓÒ ÐÓ× Ó× ÙÒ Ó× ÔÓ× ¹
       Ð × ÒÓ Ó× Ò ÓÑÔÐ ØÓ× ÒØ Ö Ñ Ö¸ Ô٠׸ ÐÓ ÓÒØÖ Ö Ó¸ × Ú ÓÐ Ö Ð ÔÖÓÔ
         ÓÖ Ò ÙÒ            º
      ÍÒ Ð ÓÖ ØÑÓ Ð ÒØ            × Ó Ò ×Ø ÔÖ Ò Ô Ó × ×Ø ÒØ Ð ÓÖ Ó×Ó¸ Ô٠׸ Ô Ö
          ØÙ Ö ÓÖÖ Ø Ñ ÒØ ÐÓ× ÒØ Ö Ñ Ó׸ × Ö ÕÙ Ö Ò Ñ ÒØ Ò Ö ÔÙÒØ ÖÓ× p¸ ×Ù
      Ô Ö ¸ Ð ÔÖ         ×ÓÖ Ý Ð Ô Ö Ð ÔÖ      ×ÓÖº Ò Ò ÙÖ ¸ × Ð ÔÖ            ×ÓÖ ÒÓ
´
      4.9. Arboles binarios de b´squeda
                                u                                                    343



             × Ó ¸ Ý ÕÙ       ØÙ Ö ÙÒ Ô ×Ó   ÓÒ Ð ÓÒ× ×Ø ÒØ Ò ÓÖØÓ¹ Ö Ù Ø Ö p Ò ×Ù
            ÒÙ Ú ÔÓ× ÓÒ ÓÒ Ð Ö ÓÐ ÕÙ ×Ø ÓÒØ Ò º
            Ä Ð Ò           Ð ÕÙ     Ð ÑÓ× Ò Ð Ô ÖÖ Ó ÒØ Ö ÓÖ ÓÒ× ×Ø Ò ÒÓ ÒØ Ö Ñ Ö
            ÐÓ× ÓÒØ Ò Ó× ÐÓ× ÒÓ Ó׸ ÔÙ × ×    ØÖ Ð Ó ÖÒ            Ú ÒØÙ Ð × ×ØÖÙ ØÙÖ ×
                  ØÓ× ÕÙ ÔÙÒØ Ò ÐÐÓ׺
              ר ÓÖÑ ×Ø Ò ×Ù×Ó¸ ÔÙ × Ð ÓØÖ Ñ Ò Ö ¸ ÕÙ ÜÔÐ Ö ÑÓ× ÒÑ Ø ¹
            Ñ ÒØ ¸ ÒÓ ×ÓÐÓ × ÑÙ Ó Ñ × × ÑÔÐ ¸ × ÒÓ Ñ × ¬ ÒØ º             ØÓ Ó× ÑÓ Ó׸
             Ò Ü º º½º¾ ´Ô Ò ¼¾µ × ÑÙ ×ØÖ ×Ø Ø Ò º
          ¾º Ð Ö ÓÐ ÙÝ Ö Þ × p × ×Ùר ØÙÝ ÔÓÖ Ð Ö ÓÐ Ö ×ÙÐØ ÒØ Ð ÙÒ ÓÒ Ü ÐÙ× Ú
            ×Ù× Ö Ñ ×º Ò ÙÒ ÓÒ ×ØÓ¸ × ×ÔÖ Ò Ð × Ù ÒØ Ð ÓÖ ØÑÓ
     ¿¿        ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                     ¿½ ¿
               # define REMOVE remove_from_search_binary_tree<Node, Compare>

                   template <class Node, class Compare> inline
               Node * remove_from_search_binary_tree(Node *&                         root,
                                                     const typename Node::key_type & key)
               {
                 if (root == Node::NullPtr)
                   return Node::NullPtr;
                 if (Compare () (key, KEY(root)))       // ¿key < KEY(root)?
                   return REMOVE(static_cast<Node*&>(LLINK(root)), key);
                 else if (Compare () (KEY(root), key)) // ¿key > KEY(root)?
                   return REMOVE(static_cast<Node*&>(RLINK(root)), key);
                 Node * ret_val = root; // respaldar root que se va a borrar
                 root = join_exclusive(static_cast<Node*&>(LLINK(root)),
                                       static_cast<Node*&>(RLINK(root)));
                 return ret_val;
               }
               ¬Ò ×
               remove from search binary tree¸   Ù×   Ò ÙÒ × ¿ ¿   Ò ¿   º
             Í× × join exclusive ¿ ½ º
        Ð Ô Ö Ñ ØÖÓ root × Ð Ö Þ Ð       ¸ Ð Ù Ð × ÔÓÖ Ö Ö Ò ¸     ÓÖÑ Ø Ð ÕÙ ×
      ÑÓ ¬ÕÙ Ð Ö Þ Ù Ò Ó × Ò Ù ÒØÖ Ð Ð Ú º Ð × ÙÒ Ó Ô Ö Ñ ØÖÓ × Ð Ð Ú Ñ ×Ñ
       Ð Ñ Ò Öº
            Ð Ù Ð ÕÙ ÓÒ Ð Ò× Ö ÓÒ¸ Ð Ñ ØÓ Ó Ð Ñ Ò ÓÒ BinTree<Key> Ú Ò ÑÙÝ
      × ÑÔÐ
¿¿     Å ØÓ Ó× BinTree<Key> ¿¿ +≡                      ´¿¿ µ ¿ ½ ¿
          Node * remove(const Key & key)
          {
            return remove_from_search_binary_tree<Node, Compare>(root, key);
          }
      Í× × remove from search binary tree ¿ ¿ º

      4.9.7     Inserci´n en ra´ de un ABB
                       o       ız
       Ò Ð Ð ÓÖ ØÑÓ Ò× Ö ÓÒ × ÖÖÓÐÐ Ó Ò Ü º º¿ ´Ô Ò ¿¿ µ¸ Ð Ö ÓÐ Ö ÔÓÖ ÐÓ×
      ÒÓ Ó× ÜØ ÖÒÓ׺ Ð ÙÒ × Ú × × ÔÖ Ö Ð ÕÙ Ð ÒÙ ÚÓ ÒÓ Ó Ú Ò Ö Þ Ð Ö Óк
344                                                              Cap´        ´
                                                                        ıtulo 4. Arboles



        Ä Ø Ò ÒØ Ö ÓÖ ÚÓÖ Ð ÐÓ Ð               Ö Ö Ò Ò Ð × ÒØ Ó ÕÙ ÐÓ× ÒÓ Ó×
      Ö ÒÓ× Ð Ö Þ ×ÓÒ ÐÓ× Ö ÒØ Ñ ÒØ Ò× ÖØ Ó׺
        ÁÒ× ÖØ Ö ÙÒ ÒÙ ÚÓ ÒÓ Ó ÓÑÓ Ö Þ × ÑÙÝ Ð ÐÙ Ó ÕÙ × ×ÔÓÒ              Ð Ô Ö¹
    Ø ÓÒ split key rec() × ÖÖÓÐÐ      Ò Ü º º ´Ô Ò ¿¿ µº ÌÓ Ó ÐÓ ÕÙ Ý ÕÙ         Ö
     × Ô ÖØ ÓÒ Ö × ÙÒ Ð Ð Ú      Ò× Ö ÓÒ Ý ÐÙ Ó Ø ÖÐ ×Ø Ð Ú ÐÓ× Ö ÓÐ × Ö ×ÙÐØ ÒØ ×
       Ð Ô ÖØ ÓÒ
¿     ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                         ¿¿ ¿
        template <class Node, class Compare> inline
      Node * insert_root(Node *& root, Node * p)
      {
        Node * l = Node::NullPtr, * r = Node::NullPtr; // guarda resultados de split
        if (not split_key_rec<Node, Compare>(root, KEY(p), l, r))
          return Node::NullPtr;
        LLINK(p) = l;
        RLINK(p) = r;
        root = p;
        return root;
      }
      ¬Ò ×
      insert root¸ Ù×      Ò ÙÒ ¿   º
    Í× × split key rec   ¿¿ º
       Ä ÖÙØ Ò Ö ØÓÖÒ       Node::NullPtr ×     Ð Ö ÓÐ ÓÒØ Ò ÙÒ ÒÓ Ó ÓÒ Ð Ú    Ù Ð Ð ÒÓ Ó
       Ò× Ö ÓÒ pº




                  ÙÖ º¿        Ö ÓÐ Ö ×ÙÐØ ÒØ    512   Ò× Ö ÓÒ × Ð ØÓÖ × Ò Ð Ö Þ

    4.9.8    Uni´n de ABB (join)
                o
      ÓÒ× Ö ÑÓ× T1, T2 ∈       Ý Ð ÓÔ Ö ÓÒ ÙÒ ÓÒ T1 ∪ T2º Ò ÒÙ ×ØÖ ÒØ Ö Þ¸ Ð
    ÙÒ ÓÒ × ÒÓÑ Ò Ö join(T1, T2, d)¸ Ð Ù Ð Ö ØÓÖÒ ÙÒ            ÔÖÓ Ù ØÓ ÙÒ Ö Ð ×
     Ð Ú × T1 ÓÒ Ð × T2º ÈÙ ×ØÓ ÕÙ ÑÓ× ÓÖ Ó ÒÓ Ø Ò Ö Ð Ú × Ö Ô Ø ×¸ Ð ×
     Ú ÒØÙ Ð × Ö Ô Ø Ò × ÒØÖ T1 Ý T2 × Ù Ö Ö Ò Ò ÙÒ         ÙÜ Ð Ö ÐÐ Ñ Ó d¸ Ð Ù Ð
     × ÙÒ Ô Ö Ñ ØÖÓ ÔÓÖ Ö Ö Ò     join()º     ÑÓ× ÔÖ Ú Ö ×ØÓ ÔÓÖÕÙ ÐÓ× Ö ÓÐ × ÙÒ Ö
    ÔÙ Ò         Ö× ÓÒרÖÙ Ó Ò Ô Ò ÒØ Ñ ÒØ º
        ÍÒ ÔÖ Ñ Ö ÓÖÑ        ÑÔÐ ÒØ Ö Ð join() × Ö ÓÖÖ Ö Ò ÔÖ ¬ Ó ÙÒ Ö Óи ÔÓÖ Ñ¹
    ÔÐÓ T2¸ Ö Ò× ÖØ Ò Ó ×Ù× Ð Ú × Ò Ð ÓØÖÓ Ö ÓÐ T1º
´
    4.9. Arboles binarios de b´squeda
                              u                                                                         345



       ÇØÖ Ñ Ò Ö ¸ ÕÙ Þ Ñ × ÓÒ×ÓÒ ÓÒ Ð Ö ÙÖ× ÓÒ Ò Ö ÒØ                             ÙÒ Ö ÓÐ Ò Ö Ó¸ ×
    ÐÙ×ØÖ Ò Ð × Ù ÒØ     ÖÑ
                                         insert root(K(T1 ), T2 )
                     T1                                        T1                         T2



                                        T2
                                                                                 L(T2 )        R(T2 )
            L(T1 )        R(T1 )                      L(T1 )          R(T1 )


                                                        join(L(T1 ),L(T2 ))        join(R(T1 ),R(T2 ))

    ÌÓÑ ÑÓ× Ð Ö Þ ÙÒÓ ÐÓ× Ö ÓÐ × Ý Ð Ò× ÖØ ÑÓ× ÓÑÓ Ö Þ Ð ÓØÖÓº Ò Ð ×Ó
    Ð ¬ ÙÖ ØÓÑ ÑÓ× Ð Ö Þ Ð Ö ÓÐ T1 Ý Ð Ò× ÖØ ÑÓ× Ò T2 Ô Ö Ó Ø Ò Ö T2º ÄÙ Ó
     Ò× ÖØ Ö Ö Þ(T1)¸ Ð × Ö Ñ × ×Ù ÐØ × L(T1) Ý R(T1) × ÙÒ Ò Ö ÙÖ× Ú Ñ ÒØ ÓÒ Ð × Ö Ñ ×
     ÞÕÙ Ö Ý Ö              T2 Ó × ¸ Ä(T2) = join(L(T1), L(T2)) Ý Ê(T2) = join(R(T1), R(T2))º
          ÓÒ Ð ÔÖ Ò Ô Ó ÒØ Ö ÓÖ Ð ÖÓ¸ ÔÓ ÑÓ× × Ò Ö ÙÒ Ð ÓÖ ØÑÓ
¿     ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                                   ¿ ¿¾
          template <class Node, class Compare> inline
      Node * join(Node * t1, Node * t2, Node *& dup)
      {
        if (t1 == Node::NullPtr)
          return t2;
        if (t2 == Node::NullPtr)
          return t1;
        Node * l = static_cast <Node*> (LLINK(t1)); // respaldos de ramas de t1
        Node * r = static_cast <Node*> (RLINK(t1));
        t1->reset();
            // mientras la clave ra´z de t1 est´ contenida en t2
                                   ı           e
        while (insert_root<Node, Compare>(t2, t1) == Node::NullPtr)
          {     // s´ ==> s´quelo de t1 e ins´rtelo en dup
                    ı      a                 e
            Node * p = remove_from_search_binary_tree(t1, KEY(t1));
            insert_in_binary_search_tree<Node, Compare>(dup, t1);
          }
        LLINK(t2) = join<Node, Compare>(l, static_cast<Node*>(LLINK(t2)), dup);
        RLINK(t2) = join<Node, Compare>(r, static_cast<Node*>(RLINK(t2)), dup);
        return t2;
      }
    Í× × insert in binary search tree ¿¿ ¸ insert root ¿ ¸ Ò        remove from search binary tree      ¿¿º
         ÓÖ Ò ÓÖÔÓÖ ÑÓ× ×Ø Ú Ö× ÓÒ Ð Ñ ØÓ Ó ÓÖÖ ×ÔÓÒ ÒØ Ò BinTree<Key>
¿   Å ØÓ Ó× BinTree<Key> ¿¿ +≡                         ´¿¿ µ ¿ ¿
      void join(GenBinTree & tree, GenBinTree & dup)
      {
        root = Aleph::join<Node, Compare> (root, tree.root, dup);
        tree.root = Node::NullPtr;
      }


    4.9.9     An´lisis de los ´rboles binarios de b´squeda
                a             a                    u
    ÌÓ × Ð × ÓÔ Ö ÓÒ × ×ØÙ   × ×Ó Ö ÙÒ                          Ò Ö Ð Þ Ö Ù×ÕÙ × ×Ù Ø ÑÔÓ
      Ù ÓÒ¸ Ô Ò ¸ ÔÓÖ Ø ÒØÓ¸ Ð Ø ÑÔÓ                  Ù×ÕÙ       ¸ Ð Ù Ð ×Ø ÓØ Ó ÔÓÖ Ð ÐØÙÖ
346                                                                              Cap´        ´
                                                                                    ıtulo 4. Arboles




                        ´ µ insert root()                              ´ µ insert in search binary tree()




                                            ´ µ join()      Ö ÓÐ × ´ µ Ý ´ µ

                              ÙÖ º¿          ÑÔÐÓ        join()        Ö ÓÐ × Ò Ö Ó×
  Ð Ö Óк ÓÒ× Ù ÒØ Ñ ÒØ ¸ ÐÓ ØÖ × Ò ÒØ Ð Ò Ð Ò Ð × × × ÓÒÓ Ö Ù Ð × Ö Ð Ò Ú Ð
ÔÖÓÑ Ó ÙÒ ÒÓ Óº
      Ò ÐÓ ÕÙ × Ù ÒÙ ×ØÖÓ Ò Ð × ×¸ ×ÙÔÓÒ Ö ÑÓ× ÕÙ Ð ÓÖ Ò Ò× Ö ÓÒ Ð × Ð Ú ×
 × Ð ØÓÖ Ó × Ö¸ ÙÒ ÓÖÑ Ñ ÒØ ×ØÖ Ù Óº × ¸ Ó ÙÒ Ö ÓÐ T ¸ Ý |T |! ÓÖ Ò ×
    Ö ÒØ × Ò× Ö ÓÒ ÕÙ ÔÙ Ò ÔÖÓ Ù Ö C|T| = |T|+1 2|T| Ö ÓÐ × Ò Ö Ó× Ö ÒØ ׺
                                                1
                                                   |T|
   ÓÖ Ò¸ × ÔÓ× Ð ÑÓ×ØÖ Ö¸ ÔÖ Ö Ð Ñ ÒØ ÔÓÖ Ò Ù ÓÒ¸ ÕÙ ∀|T |, C|T| < |T |!º ÄÓ
ÕÙ ÑÔÐ ÕÙ Ð ÙÒÓ× Ö ÓÐ × × Ö Ô Ø Ö Ò Ô Ö Ô ÖÑÙØ ÓÒ × Ò× Ö ÓÒ Ö ÒØ ׺
Proposici´n 4.12
         o      Ë T ÙÒ Ö ÓÐ Ò Ö Ó      Ù×ÕÙ    n ÒÓ Ó× ÓÒרÖÙ Ó Ð ØÓÖ ¹
Ñ ÒØ × ÙÒ ÙÒ × Ù Ò       Ò× Ö ÓÒ Ð ØÓÖ º ÆÓ Ý ×ÙÔÖ × ÓÒ ×º Ë Ò
  ¯ Sn Ð ÒÙÑ ÖÓ  ÒÓ Ó× Ú × Ø Ó× ÙÖ ÒØ ÙÒ Ù×ÕÙ     Ü ØÓ× ¸ Ý
  ¯ Un Ð ÒÙÑ ÖÓ   ÒÓ Ó× Ú × Ø Ó× ÙÖ ÒØ ÙÒ Ù×ÕÙ     ÐÐ º
    ÒØÓÒ ×
             ËÒ         = 2 1+
                                    1
                                    n
                                      Hn       −    3      ≈    1.386 Ð n       = O(Ð n)Ý

           ÍÒ = 2Hn+1 − 2 ≈                              1.386 Ð (n + 1)       = O(Ð n)

 ÓÒ ËÒ Ý ÍÒ ÒÓØ Ò ÐÓ× ÔÖÓÑ Ó×                        Sn    Ý Un¸ Ö ×Ô Ø Ú Ñ ÒØ Ñ ÒØÖ × ÕÙ          Hn   ×
Ð n¹ × ÑÓ ÒÙÑ ÖÓ ÖÑÓÒ Ó½ º
 ½
     Hn =   n   1
            i=1 i   º
´
4.9. Arboles binarios de b´squeda
                          u                                                        347



Demostraci´n
          o            Ð ÒÙÑ ÖÓ ÒÓ Ó× Ú × Ø Ó× Ò ÙÒ Ù×ÕÙ    Ü ØÓ× × Ð ÐÓÒ ØÙ
   Ð Ñ ÒÓ × Ö Þ(T ) ר Ð ÒÓ Ó Ò ÓÒØÖ Óº Ë ni × Ð ÒÓ Ó Ò ÓÒØÖ Ó¸ ÒØÓÒ ×
|CÖ Þ(T),n | = Ò Ú Ð (ni) + 1¸ ÔÙ × Ð Ò Ú Ð ÓÑ ÒÞ × ÖÓº ÈÓÖ ¬Ò ÓÒ ÔÖÓÑ Ó¸
Ø Ò ÑÓ×
       i




                          ËÒ    =
                                        1
                                        n
                                                      (Ò Ú Ð (ni) + 1)
                                            ∀ni ∈T

                                =
                                        1
                                        n
                                                      Ò Ú Ð(ni)       +       1
                                            ∀ni ∈T

                                =
                                        1
                                        n
                                          ÁÈÄ(T )         +    1                  ´º µ
ËÙר ØÙ ÑÓ× ´ º¾ µ Ò ´ º µ ´ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ º µ
                             Ë = ÈÄ(T ) − 2n +
                                Ò
                                                  n
                                                                      1           ´º µ
       ÓÖ ÔÐ ÒØ ÑÓ× ÙÒ Ù ÓÒ × Ñ Ð Ö Ô Ö ÙÒ Ù×ÕÙ Ò ÖÙ ØÙÓ× º ÈÙ ×ØÓ ÕÙ
 Ð ÒÓ Ó ÒÓ × Ò Ù ÒØÖ Ò Ð Ö Óи Ð Ù×ÕÙ     × Ò Ö ×Ø ÙÒ ÒÓ Ó ÜØ ÖÒÓº Ð
ÒÙÑ ÖÓ ÒÓ Ó× Ú × Ø Ó× Ò ÙÒ Ù×ÕÙ Ò ÖÙ ØÙÓ× ×¸ Ô٠׸ ÕÙ Ú Ð ÒØ Ð ÐÓÒ ØÙ
   Ð Ñ ÒÓ × Ð Ö Þ ×Ø Ð ÒÓ Ó ÜØ ÖÒÓº ÈÓ ÑÓ׸ ÒØÓÒ ×¸ ÔÐ ÒØ Ö Ð ÔÖÓÑ Ó
    ÐÓÒ ØÙ × ÒØÖ ØÓ Ó× ÐÓ× Ñ ÒÓ× × Ð Ö Þ ×Ø ÙÒ ÒÓ Ó ÜØ ÖÒÓº ×ØÓ ×
                            ÍÒ      =
                                             1
                                            n+1
                                                                   Ò Ú Ð(nx)
                                                           ∀nx
                                                      nx ÒÓ Ó ÜØ ÖÒÓ

                                    =
                                              ÈÄ(T ) =⇒
                                 n+1
                       ÈÄ(T ) = (n + 1) ÍÒ                                        ´º µ
ËÙר ØÙ ÑÓ× ´ º µ Ò ´ º µ
                                        Í
                            ËÒ = (n + 1)n Ò −2n                   +       1       ´º µ
   Ä Ù ÓÒ ´ º µ ÒÓ× ÔÐ ÒØ Ð × Ó× Ò Ó Ò Ø × ÕÙ ÒØ ÒØ ÑÓ× Ò ÓÒØÖ Öº È Ö
ÔÓ Ö Ö ×ÓÐÚ ÖÐ Ö ÕÙ Ö ÑÓ× ÙÒ × ÙÒ        Ù ÓÒ¸ Ò Ô Ò ÒØ ´ º µ¸ ÕÙ Ø Ñ Ò
ÒÓ× Ö Ð ÓÒ ËÒ Ý ÍÒ¸
   ËÙÔÓÒ ÑÓ× ÕÙ Ð Ô ÖÑÙØ ÓÒ Ò× Ö ÓÒ × n0n1n2 . . . nn−2nn−1º ÆÓØ ÑÓ× ÕÙ Ð
  ÒØ         ÒÓ Ó× ÕÙ × Ú × Ø Ò Ù Ò Ó × Ù× Ü ØÓ× Ñ ÒØ Ð ÒÓ Ó ni × ÕÙ Ú Ð ÒØ
  ÙÒÓ Ñ × Ð ÒÙÑ ÖÓ ÒÓ Ó× ÕÙ × Ú × Ø ÖÓÒ ÙÖ ÒØ Ð Ù×ÕÙ Ò ÖÙ ØÙÓ× ÕÙ ×
Ö Ð ÞÓ ÙÖ ÒØ Ð Ò× Ö ÓÒ niº ×ØÓ ×ÓÐÓ × ÓÖÖ ØÓ × × ×ÙÑ ÕÙ ÒÓ Ý ×ÙÔÖ × ÓÒ ×º
Ä Ù× Ò           ×ÙÔÖ × ÓÒ × Ö ÒØ Þ ÕÙ ÐÓ× ÒÓ Ó× ÒÙÒ       Ñ Ò ÐÙ Ö Ò Ð Ö Óк
ÈÓ ÑÓ׸ ÒØÓÒ ×¸ Ö ÕÙ
                                     Ë = Í ¹½ +1                       ´ º ¼µ
       ÓÖ ¸ ÔÓÖ Ð Ñ ×Ñ ¬Ò ÓÒ ÔÖÓÑ Ó¸ ÔÓ ÑÓ× ÔÐ ÒØ Ö ÙÒ ÒÙ Ú Ù ÓÒ
                Ò Ë = (ͼ +1) + (ͽ +1) + (; +1) + · · · + (ÍÒ¹½ +1)
                                                          n
                                        n−1
                    = 1     +
                                    1
                                    n
                                              Í                                   ´ º ½µ
                                        i=0
348                                                                                 Cap´        ´
                                                                                       ıtulo 4. Arboles



          Á Ù Ð ÑÓ× ´ º ½µ ÓÒ ´ º µ
                      (n + 1) ÍÒ −2n
                                                                         n−1

                             n
                                           +     1 = 1           +
                                                                     1
                                                                     n
                                                                               Í        =⇒
                                                                         i=0
                                                           n−1
                                      (n + 1) ÍÒ =               Í   +     2n                      ´ º ¾µ
                                                           i=0

           Ú ÐÙ ÑÓ× ´ º ¾µ Ô Ö   n−1     Ý Ó Ø Ò ÑÓ×
                                                 n−2
                                      n ÍÒ¹½ =         Í   +     2(n − 1)                          ´ º ¿µ
                                                 i=0

          Ê ×Ø ÑÓ× ´ º ¾µ Ñ ÒÓ× ´ º ¿µ
                          (n + 1) ÍÒ −         n ÍÒ¹½ =        ÍÒ¹½ + 2            =⇒
                                                   ÍÒ      =   ÍÒ¹½ + n + 1
                                                                        2
                                                                                                   ´º µ
ÄÓ ÕÙ ÙÒ Ù ÓÒ Ö ÙÖÖ ÒØ ÍÒ ÕÙ ÔÓ ÑÓ× Ö ×ÓÐÚ ÖÐ ÔÓÖ ÜÔ Ò× ÓÒ ×Ù × Ú
  ר Ð ÙÐØ ÑÓ Ø ÖÑ ÒÓ Í¼ = 0
                   ÍÒ = ÍÒ¹½ + n + 1
                                 2


                                 =    ÍÒ¹¾ + n + n + 1
                                             2     2


                                 =    ÍÒ¹¿ + n − 1 + n + n + 1
                                               2     2     2


                                 =    ͽ + 3 + · · · + n − 1 + n + n + 1
                                           2             2     2     2


                                 =    ͼ + 2 + 3 + · · · + n − 1 + n + n + 1
                                           2 2               2     2     2

                                         1 1         1  1  1
                                 = 2      + + ··· +    + +
                                         2 3        n−1 n n+1

          Ä ×Ö      n 1
                    i=1 i × Ð n¹ × ÑÓ ÒÙÑ ÖÓ ÖÑÓÒ Óº × ÔÙ ×
    ÍÒ     =   2(Hn+1 − 1) = 2Hn+1 − 2 ≈ 2(ÐÒ (n + 1) − γ) − 2 ≈ 1, 386 Ð                (n + 1)   ´º µ
¾¼

            ÓÖ ×Ùר ØÙ ÑÓ× ´ º µ Ò ´ º µ
                               (n + 1)2(Hn+1 − 1) − 2n
                        ËÒ   =
                                          n
                                                       + 1
                               n+1
                             =      (2(Hn+1 − 1)) − 1
                                 n
                                 n+1          1
                             = 2       Hn +        −1   − 1
                                  n         n+1
                                     n+1
                             = 2         Hn − 3 ≈ 2 ÐÒ n ≈ 1, 386 Ð n
                                      n
     ¾¼
           Ð × Ñ ÓÐÓ γ ÒÓØ Ð ÓÒר ÒØ      ÙÐ Ö Ö Ø Ö Þ ÔÓÖ
                                 γ = Ð Ñ (Hn − ÐÒ n) ≈ 0, 5772156649 . . .
                                    n−→ ∞
º
4.10. El TAD DynMapTree<Tree, Key, Range, Compare>                           349




               ÙÖ º¿ ÍÒ Ö ÓÐ Ò Ö Ó         Ù×ÕÙ        512 Ð Ú × Ð ØÓÖ ×

    ÆÙ רÖÓ Ò Ð × × ×ÙÔÓÒ ÕÙ ÒÓ Ý ×ÙÔÖ × ÓÒ × ÒØ Ö Ð × ÒØÖ Ð × Ò× Ö ÓÒ ×º Ë Ð ×
×ÙÔÖ × ÓÒ × ×ÓÒ ÙØ × ×ÔÙ × Ð × Ò× Ö ÓÒ × ×Ø Ú Ö Ð Ö Óи Ð × ÑÔ ÒÓ
 ÙÒ × O(Ð n)¸ ÔÙ × Ð × ÔÖ Ñ × × Ð ÔÖÓÔÓ× ÓÒ º½¾ ÙÒ ×ÓÒ ÖØ ׺
      Ð Ò Ð × × ÓÒ ×ÙÔÖ × ÓÒ × ÒØ Ö Ð × ÒØÖ Ð Ò× Ö ÓÒ × × ÙÒ ÔÖÓ Ð Ñ ÜØÖ Ñ ¹
Ñ ÒØ ¬ ÙÐØÓ×Ó ÕÙ Ð               ØÙ Ð ÒÓ × Ó Ö ×Ù ÐØÓ × Ø × ØÓÖ Ñ ÒØ º Ä ¬ ÙÐØ
 ×ØÖ Ò ÕÙ Ð Ð Ñ Ò ÓÒ ØÙ ÙÒ               × ÓÒ ÕÙ ÒÓ × Ð ØÓÖ Ù Ò Ó Ò Ð ÙÒ ÓÒ Ü¹
 ÐÙ× Ú × Ó Ù Ð × Ö Ð Ö Þ Ð ×Ù Ö ÓÐ Ö ×ÙÐØ ÒØ º ÆÓ × × Ü Ø Ñ ÒØ ÓÑÓ Ñ Ò ¹
  Ö Ð × ÔÖÓ Ð        × Ð × Ô ÖÑÙØ ÓÒ × ÒØ רÓ× ×ÔÐ Þ Ñ ÒØÓ׺ Ò Ò ÙÖ ¸
 × ÑÔÓÖØ ÒØ ÒÓØ Ö ÕÙ Ð Ð ÓÖ ØÑÓ ×ÙÔÖ × ÓÒ × ÖÖÓÐÐ Ó Ò Ü º º ´Ô Ò ¿ ¾µ
ÔÐ ÒØ ÙÒ × Ñ ØÖ ÑÔÓÖØ ÒØ º Ù Ò Ó × ×ÙÔÖ Ñ ÙÒ ÒÓ Ó ÓÑÔÐ ØÓ Ý ×                  ØÙ
 Ð join exclusive()¸ Ð ÒÓ Ó Ö Þ Ð Ö ÓÐ Ö ×ÙÐØ ÒØ × Ð ×Ù Ö ÓÐ ÞÕÙ Ö Óº ר
     × ÓÒ Ù× ÕÙ Ð ÒÙÑ ÖÓ ÒÓ Ó× ÔÓÖ Ð Ð Ó ÞÕÙ Ö Ó Ð ÔÙÒØÓ                 Ð Ñ Ò ÓÒ
   ×Ñ ÒÙÝ º ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð Ö Þ Ð Ö ÓÐ Ø Ò            ×ÔÐ Þ Ö×     Ð ÞÕÙ Ö ¸ ÐÓ
ÕÙ Ö ÙÒ √ ÕÙ Ð Ö Óº ×ØÙ Ó× ÑÔ Ö Ó× ÖÖÓ Ò ÙÒ ÐÓÒ ØÙ ÔÖÓÑ Ó Ð Ñ ÒÓ
                ×
Ø Ò ÒØ O( n)º
    Ä ÔÖÓÔÓ× ÓÒ º½¾ ÒÓ× ÑÙ ×ØÖ ÕÙ ¸ × ÒÓ × ÒØ Ö Ð Ò ×ÙÔÖ × ÓÒ × ÓÒ Ò× Ö ÓÒ ×¸
 Ð × ÑÔ ÒÓ ×Ô Ö Ó Ð Ù×ÕÙ Ý Ð Ò× Ö ÓÒ × O(Ð n)¸ ÐÓ Ù Ð                   ÙÒ Ö ÓÐ ¹
Ò Ö Ó ÙÒ ÐØ ÖÒ Ø Ú ×Ø ÒØ ÔØ Ð Ô Ö ÑÔÐ ÒØ Ö Ø Ð × × Ñ ÓÐÓ× Ò × ØÙ ÓÒ ×
  ÓÒ Ð ÓÖ Ò          Ò× Ö ÓÒ × Ð ØÓÖ Ó Ý Ð ÒÙÑ ÖÓ ×ÙÔÖ × ÓÒ × ÒØ Ö Ð × ×
Ö Ð Ø Ú Ñ ÒØ Ô ÕÙ ÒÓ ÔÓÖ ÑÔÐÓ¸ Ð Ø Ð × Ñ ÓÐÓ× ÙÒ ÓÑÔ Ð ÓÖº Ä Ñ ÒØ Ð ¹
Ñ ÒØ ¸ Ü ×Ø Ò × ØÙ ÓÒ × ÓÒ Ð ÓÖ Ò Ò× Ö ÓÒ ÔÓ Ö × Ö × × Óº ÈÓÖ ÑÔÐÓ¸
ÐÓ× Ô ÐÐ Ó× Ò ×Ø ÐÐ ÒÓ ×Ø Ò × × Ó× ÔÖÓ Ð Ñ ÒØ ¸ ÙÒ Ô ÐÐ Ó ÓÑÓ Ä ÓÒ × Ö Ñ ×
 Ö Ù ÒØ ÕÙ ÃÒÙØ º

4.10    El TAD DynMapTree<Tree, Key, Range, Compare>
  Ä Ì BinTree<Key>¸ × ÓÑÓ ÓØÖÓ× Ì Ô Ö              ÕÙ ×ØÙ Ö ÑÓ× Ò Ð Ô ØÙÐÓ
Ü ¸      ØÙ Ò ØÓ × ×Ù× ÓÔ Ö ÓÒ × Ò ÙÒ ÓÒ      ÒÓ Ó× Ý ÒÓ Ò ÙÒ ÓÒ Ð Ø ÔÓ
 Ð Ú º Ä × Ö ÞÓÒ × Ô Ö ×ØÓ × ÙÒ Ñ ÒØ Ò Ò Ð ÔÖ Ò Ô Ó ¬Ò ¬Ò Ý Ý Ò × Ó Ù ×
 ÒØ Ö ÓÖÑ ÒØ º
       ÓÑÓ × ÑÔÐ ÒØ ÙÒ ÓÒ ÙÒØÓ Ð Ú × Ñ ÒØ Ò Ó ÔÓÖ Ð ÙÒ Ð ×               Ó
   ÓØÖ Ñ Ò Ö ¸ ÓÑÓ × Ö ×Ù ÐÚ Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð Ñ ÒØ ÙÒ
    ALEPH ÑÔÐ ÒØ Ð ÓÒ ÙÒØÓ ÙÒ Ñ ÒØ Ð ÓÒ Ö ÓÐ × Ò Ö Ó×         Ù×ÕÙ      Ó×
Ñ Ò Ö ×º Ä ÔÖ Ñ Ö × Ñ ÒØ Ð Ø ÔÓ DynSetTree<Tree,Key,Compare>¸ Ð Ù Ð Ò¹
350                                                          Cap´        ´
                                                                     ıtulo 4. Arboles



     רÖÙÑ ÒØ ÙÒ ÓÒ ÙÒØÓ Ð Ú × Ø ÔÓ Key ÑÔÐ ÒØ Ó Ñ ÒØ Ð ÙÒ Ð ×                Ö ÓÐ
       Ò ÖÓ      Ù×ÕÙ Tree<Key> Ý Ö Ø Ö Ó ÓÑÔ Ö ÓÒ Compareº Ä × ÙÒ Ñ Ò Ö
      × Ñ ÒØ ÙÒ Ð ×          Ñ Ô Ó ÐÐ Ñ DynMapTree<Tree, Key, Range, Compare>¸
      ÙÝ     Ö Ò ÓÒ DynSetTree × ÕÙ Ð ÙÐØ Ñ Ù Ö Ô Ö × Ó × ¸ Ñ Ò ÙÒ ÓÒ ÙÒØÓ
      Ö Ò Ó Ð Ñ Ô Ó Ó ÙÒ ÓÒº
         ÌÓ Ó× ÐÓ× Ì      ÙÒ Ñ ÒØ Ó× Ò             ר Ø ÜØÓ Ü Ò Ð Ñ ×Ñ ÒØ Ö¹
       Þ ÕÙ Ð Ì BinTree<Key>º ÈÓÖ × Ö ÞÓÒ¸ DynSetTree<Tree,Key,Compare> Ý
     DynMapTree<Tree, Key, Range, Compare> ÔÙ Ò ÒרÖÙÑ ÒØ Ö Ù ÐÕÙ Ö Ð ×        ÓÒ¹
      ÙÒØÓ ÑÔÐ Ñ ÒØ Ó Ñ ÒØ Ö ÓÐ × Ò Ö Ó×          Ù×ÕÙ º
          Ò ×Ø × ÓÒ × ÖÖÓÐÐ Ö ÑÓ× Ð Ñ × ÓÑÔÐ Ó             ÐÓ× Ì Ñ Ò ÓÒ Ó׸ Ð
      Ð × DynMapTree<Tree, Key, Range, Compare>º ËÙ ÙÒ ÓÒ × ÑÔÐ ÒØ Ö ÙÒ ÓÒ¹
      ÙÒØÓ      Ð Ú × Ó ÙÒ Ñ Ô Ó      Ð Ú × Ò ÙÒ ÓÑ Ò Ó         Ð Ñ ÒØÓ× Ò ÙÒ ÓÒ¹
      ÙÒØÓ Ö Ò Ó Ñ ÒØ ÙÒ Ð ×                   º Ð Ì     Ò Ù ×Ø ÓÒ × ¬Ò Ò Ð
      Ö ÚÓ ØÔÐ ÝÒÅ ÔÌÖ ºÀ ¿ ¼
¿¼    ØÔÐ ÝÒÅ ÔÌÖ ºÀ ¿ ¼ ≡
           template <
              template <typename /* Key */, class /* Compare */> class Tree,
              typename Key,
              typename Range,
              class Compare = Aleph::less<Key>
              >
      class DynMapTree
      {
          Å Ñ ÖÓ× ÔÖ Ú Ó× DynMapTree<Tree, Key, Range, Compare> ¿ ¼
          Å Ñ ÖÓ× ÔÙ Ð Ó× DynMapTree<Tree, Key, Range, Compare> ¿ ½
      };
         Ð × × Ò Ñ × Ö Ú × DynMapTree<Tree, Key, Range, Compare> ¿             ¾
        DynMapTree<Tree, Key, Range, Compare> Ø        Ò Ù ØÖÓ Ô Ö Ñ ØÖÓ× Ð × º Ä Ð ×
     Tree Ö ÔÖ × ÒØ Ð Ø ÔÓ       ÓÒ Ð Ù Ð × ×            ÑÔÐ ÒØ Ö Ð Ñ Ô Óº ÒØÖ ÐÓ× Ø ÔÓ×
     ÔÓ× Ð ×¸ ÒØÖ ÐÓ× × ÖÖÓÐÐ Ó× Ò ×Ø Ø ÜØÓ¸ Ø Ò ÑÓ× BinTree<Key>¸ Rand Tree<Key>¸
     Treap<Key>¸ Avl Tree<Key>¸ Rb Tree<Key> Ý Splay Tree<Key>º           Ð Ü Ô ÓÒ
     BinTree<Key>¸ Ð Ö ×ØÓ       Ð × Ð × × ÓÖÖ ×ÔÓÒ             ×Ô Ð ×¸ ÓÒ ÔÖ ×Ø ÓÒ ×
     ÔÖÓÔ × × ÙÒ Ð Ø ÔÓ Ö Óи ÕÙ ÑÔÐ ÒØ Ò Ð × Ñ ×Ñ × ÓÔ Ö ÓÒ × ÕÙ BinTree<Key>º
          ר ÑÓ Ó¸ Ð Ù×Ù Ö Ó DynMapTree<Tree, Key, Range, Compare> × Ð ÓÒ ¸
     × ÙÒ ×Ù× Ö Ø Ö Ó× Ù Ð         Ý Ö ÕÙ Ö Ñ ÒØÓ¸ Ð Ð ×           ÕÙ × Ù× Öº
          Ð Ô Ö Ñ ØÖÓ Ð × Key Ö ÔÖ × ÒØ Ð Ø ÔÓ           ØÓ ÓÖÖ ×ÔÓÒ ÒØ Ð ÓÑ Ò Ó Ð
     Ñ Ô Óº
          Ð Ô Ö Ñ ØÖÓ Range Ö ÔÖ × ÒØ Ð Ø ÔÓ         ØÓ Ð Ö Ò Ó Ð Ñ Ô Óº Ë ÐÓ ÕÙ ×
        × × Ñ Ö Ñ ÒØ Ñ ÒØ Ò Ö ÙÒ ÓÒ ÙÒØÓ            Ð Ú ×¸ ÒØÓÒ × ×Ø Ô Ö Ñ ØÖÓ ×
      ÓÖÖ ×ÔÓÒ Ö ÓÒ ÙÒ Ð × Ú          ÔÓÖ ÑÔÐÓ¸ Empty Node¸ Ð Ù Ð Ù ¬Ò Ó Ý Ù× Ó
     Ô Ö Ð Ì BinNode<Key>º
           Ò ÐÑ ÒØ ¸ Ð ÙÐØ ÑÓ Ô Ö Ñ ØÖÓ¸ ÓÒר ØÙÝ Ð Ð ×         ÓÑÔ Ö ÓÒ ÒØÖ Ð Ú ×
     Ø ÔÓ Keyº
          ÓÒ ÐÓ        ÒØ Ö ÓÖ     Ò Ñ ÒØ ¸       ÔÓ ÑÓ× ÔÐ ÒØ Ö ÐÓ×            ØÖ ÙØÓ×
       DynMapTree<Tree, Key, Range, Compare>
¿¼   Å Ñ ÖÓ× ÔÖ Ú Ó×     DynMapTree<Tree, Key, Range, Compare>   ¿¼ ≡       ´¿ ¼ µ ¿ ½
      Tree<Key, Compare> tree;
4.10. El TAD DynMapTree<Tree, Key, Range, Compare>                              351



       size_t               num_nodes;
     tree  × ÙÒ Òר Ò               ÓÒ Ð Ú Key Ý num nodes         × Ð ÒØ           ÒÓ¹
      Ó× ÕÙ ÓÒØ Ò Ð Ö ÓÐ      treeº    ר ÒØ      × ÓÒØ           Ð Þ Ò Ð × ÔÖ Ñ Ø Ú ×
        DynMapTree<Tree, Key, Range, Compare> ÕÙ Ò× ÖØ Ò Ó        Ð Ñ Ò Ò ÒÓ Ó× Ý × Ó ¹
     × ÖÚ Ð º
         Ð Ì BinTree<Key> Ý Ñ × Ì Ö Ð ÓÒ Ó׸ ÓÔ Ö Ò ×Ó Ö ÒÓ Ó× ÕÙ ÐÑ ¹
     Ò Ò ÙÒ Ð Ú Ò Ö       Ø ÔÓ Keyº ÓÖ Ò¸ Ô Ö Ð Ñ Ô Ó Ö ÕÙ Ö ÑÓ× ÙÒ ØÓ
        Ñ × Ø ÔÓ Range¸ Ð Ù Ð × ×Ô ¬ ÔÓÖ Ö Ú ÓÒ Ð Ø ÔÓ Ò Ö Ó Tree<Key,
     Compare>::Node
¿½   Å Ñ ÖÓ× ÔÖ Ú Ó×      DynMapTree<Tree, Key, Range, Compare> ¿ ¼ +≡      ´¿ ¼ µ   ¿¼
       struct Node : public Tree<Key, Compare>::Node
       {
         Range data;
         Node() { /* Empty */ }
         Node(const Key & _key) : Tree<Key, Compare>::Node(_key) { /* empty */ }
         Range & get_data() { return data; }
       };
     DynMapTree<Tree, Key, Range, Compare> ÓÔ Ö      ÒØ ÖÒ Ñ ÒØ ÓÒ ÒÓ Ó× Ð Ø ÔÓ Node¸
     ÐÓ× Ù Ð × × ÓÖ Ò Ò ÔÓÖ Ð Ú Ø ÔÓ Key¸ Ò Ú Ð        Ð Ö ÓÐ Ò Ö Ó ÕÙ × ÙØ Ð ¸ Ô ÖÓ
          ÒÓ Ó ÓÒØ Ò ÙÒ Ô Ö Ø ÔÓ (Key, Range)º
        ÄÓ× ÓÒרÖÙ ØÓÖ × ÔÓÖ ÓÑ × ÓÒ Ý ÓÔ ÔÙ Ò ÒØÓÒ × ¬Ò Ö× ÙÒØÓ ÓÒ Ð ×¹
     ØÖÙ ØÓÖ
¿½    Å Ñ ÖÓ× ÔÙ Ð Ó× DynMapTree<Tree, Key, Range, Compare> ¿ ½ ≡ ´¿ ¼ µ ¿ ½
       DynMapTree() : num_nodes(0) { /* empty */ }
       DynMapTree(DynMapTree & src_tree) : num_nodes(src_tree.num_nodes)
       {
         Node * src_root = static_cast<Node*>(src_tree.tree.getRoot());
           tree.getRoot() = copyRec(src_root);
       }
       virtual ~DynMapTree()
       {
         if (num_nodes > 0)
           destroyRec(tree.getRoot());
       }
     Í× × copyRec ¾   Ò   destroyRec   ¾   º
      È Ö Ò× ÖØ Ö
¿½   Å Ñ ÖÓ× ÔÙ Ð Ó×      DynMapTree<Tree, Key, Range, Compare>   ¿ ½ +≡    ´¿ ¼ µ ¿ ½ ¿ ¾
       Range * insert(const Key & key, const Range & data)
       {
         Node * node = new Node (key);
         node->data = data;
         if (tree.insert(node) == NULL)
           {
             delete node;
             return NULL;
           }
         ++num_nodes;
         return &node->data;
       }
352                                                           Cap´        ´
                                                                      ıtulo 4. Arboles



     Ä ÖÙØ Ò Ö ØÓÖÒ Ð ÒØ         ÒÓ Ó× ÕÙ Ø Ò Ð Ö Óк ÈÙ ×ØÓ ÕÙ ÒÓ × Ô ÖÑ Ø Ò
      Ð Ñ ÒØÓ× Ö Ô Ø Ó׸ ר ÒØ   ÔÙ     ÓØ Ö× Ô Ö × Ö × Ó ÙÖÖ Ó Ó ÒÓ Ð Ò× Ö ÓÒº
        È Ö Ð Ð Ñ Ò ÓÒ¸ ×ÓÐÓ ×Ø Ð Ð Ú ¸ Ý ×Ø × Ö Ð Þ Ñ ÒØ Ð × Ù ÒØ Ñ ØÓ Ó
¿¾    Å Ñ ÖÓ× ÔÙ Ð Ó× DynMapTree<Tree, Key, Range, Compare> ¿ ½ +≡ ´¿ ¼ µ ¿ ½ ¿ ¾
       size_t remove(const Key & key)
       {
         Node * node = static_cast<Node*>(tree.remove(key));
         if (node == NULL)
           return num_nodes;
         delete node;
         return --num_nodes;
       }
     remove() Ö ØÓÖÒ Ð ÒØ          Ð Ñ ÒØÓ׸ ÐÓ ÕÙ Ô ÖÑ Ø ¸ Ð Ù Ð ÕÙ insert()¸ Ø Ö¹
     Ñ Ò Ö × Ù Ó Ó ÒÓ Ð Ñ Ò ÓÒº
         À Ý Ó × ÓÒ × Ò Ð × Ù Ð × × × Ð Ð Ñ Ò Ö ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ׺ È Ö ÐÐÓ¸ Ù× ÑÓ×
      Ð Ñ ØÓ Ó empty()
¿¾   Å Ñ ÖÓ× ÔÙ Ð Ó× DynMapTree<Tree, Key, Range, Compare> ¿ ½ +≡ ´¿ ¼ µ ¿ ¾ ¿ ¾
       void empty()
       {
         num_nodes = 0;
         destroyRec(tree.getRoot());
       }
     Í× × destroyRec ¾   º
      À Ý Ó× Ñ Ò Ö ×         ÓÒ×ÙÐØ Ö
¿¾   Å Ñ ÖÓ× ÔÙ Ð Ó×      DynMapTree<Tree, Key, Range, Compare>   ¿ ½ +≡    ´¿ ¼ µ ¿ ¾
       bool test_key(const Key & key)
       {
         Node * node = static_cast<Node*>(tree.search(key));
         return node != NULL;
       }
       Range * test(const Key & key)
       {
         Node * node = static_cast<Node*>(tree.search(key));
         return node != NULL ? &(node->get_data()) : NULL;
       }
     Ä ÔÖ Ñ Ö ¸ test key() × ×Ø Ò Ô Ö ÓÒ ÙÒØÓ× ÕÙ ×ÓÐÓ ÓÒØ Ò Ò Ð Ú ×¸ Ñ ÒØÖ × ÕÙ
     Ð × ÙÒ ¸ test()¸ Ô Ö Ñ Ô Ó׺
         ÇØÖ Ñ Ò Ö     Ò× ÖØ Ö Ý Ù× Ö Ð Ñ ÒØÓ× × Ñ ÒØ Ð ÓÔ Ö ÓÖ []¸ Ð Ù Ð Ò Þ
      Ð Ú × Ý Ö ØÓÖÒ Ñ Ò × ÒØÖÓ Ð Ö Ò Óº ÈÓÖ ×ÙÔÙ ×ØÓ¸ ר ×ÕÙ Ñ ×ÓÐÓ Ø Ò × ÒØ Ó
     × × ØÖ Ø ÙÒ Ñ Ô Ó Ý ÒÓ ÙÒ ÓÒ ÙÒØÓ Ð Ú ×º
            Ð Ì DynMapTree<Tree, Key, Range, Compare> ÔÓ ÑÓ× ×Ô Ð Þ Ö Ú Ö× ×
      Ð × × × ÙÒ Ð Ø ÔÓ Ö ÓÐ Ò Ö Ó       Ù×ÕÙ ÔÓÖ ÑÔÐÓ
¿¾      Ð × × Ò Ñ × Ö Ú × DynMapTree<Tree, Key, Range, Compare> ¿ ¾ ≡ ´¿ ¼ µ
           template <typename Key, typename Type, class Compare = Aleph::less<Key> >
       class DynMapBinTree : public DynMapTree<BinTree, Key, Type, Compare>
           { /* Empty */ };

           template <typename Key, typename Type, class Compare = Aleph::less<Key> >
4.11. Extensiones a los ´rboles binarios
                             a                                                      353



      class DynMapAvlTree : public DynMapTree<Avl_Tree, Key, Type, Compare>
          { /* empty */ };
        Ð × ÙÒ Ó Ø ÔÓ¸ DynMapAvlTree¸ × ÙÒ Ñ Ô Ó × Ó Ò Ö ÓÐ × Îĸ ÙÒ Ð ×
      ×Ô Ð    Ö ÓÐ Ò Ö Ó      Ù×ÕÙ ¸ ÙÝ ÐØÙÖ ×Ø Ø ÖÑ Ò ×Ø Ñ ÒØ ÓØ ¸ Ý
     ÕÙ ×ØÙ Ö ÑÓ× Ò Ü º ´Ô Ò        µº À Ý Ñ × Ð × × × ÙÒ ÐÓ× Ø ÔÓ× Ö ÓÐ × Ò Ö Ó׺

     4.11    Extensiones a los ´rboles binarios
                               a
       Ä Ì BinTree<Key> Ý ×Ù× Ö Ú Ó× ´Ú Ö Ü ´Ô Ò ¿µµ ×ÓÒ ÓÒ Ó× Ô Ö Ö Ð ¹
     Þ Ö ÙÒ ×ÓÐÙ ÓÒ Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð ÓÒ Ð × ÓÔ Ö ÓÒ × Ò× Ö ÓÒ¸ Ù×ÕÙ Ý
      Ð Ñ Ò ÓÒ Ò O(Ð (n))º ×ØÓ × ÙÒ Ö Ò Ô ×Ó Ö ×Ô ØÓ ÙÒ ÖÖ ÐÓ ÓÒ Ð Ò× Ö ÓÒ
     Ý Ð Ð Ñ Ò ÓÒ ×ÓÒ O(n)º Ë Ò Ñ Ö Ó¸ ÙÒ ÖÖ ÐÓ ÓÖ Ò Ó ÒÓ× Ó Ö Ð ÐØ ÖÒ Ø Ú
           Ù× Ö Ð i¹ × ÑÓ Ñ ÒÓÖ Ð Ñ ÒØÓ Ò O(1) Ñ ÒØÖ × ÕÙ Ò ÙÒ               ר ÓÔ Ö ÓÒ
     Ö ÕÙ Ö ÙÒ Ö ÓÖÖ Ó Ò¬ Ó ÕÙ × O(n)º
           Ü ×Ø ÙÒ ×ØÖÙ ØÙÖ           ØÓ¸ ×       Ò ÙÒ       ¸ ÕÙ ÒÓ× Ô ÖÑ Ø Ñ ÒØ Ò Ö ÙÒ
      ÓÒ ÙÒØÓ Ð Ú × ÓÒ Ð × × Ù ÒØ × ÓÔ Ö ÓÒ × Ý ×Ù× Ø ÑÔÓ×
         ¯ ÁÒ× Ö ÓÒ¸ Ù×ÕÙ       Ý Ð Ñ Ò ÓÒ ÙÒ Ð Ú Ò O(Ð (n))º
         ¯       ×Ó Ð i¹ × ÑÓ Ð Ñ ÒØÓ Ð Ö ÓÖÖ Ó Ò¬ Ó Ò O(Ð (n))º
         ¯ ÓÒÓ Ñ ÒØÓ          Ð ÔÓ× ÓÒ Ò¬          ÙÒ Ð Ú Ò O(Ð (n))º
           Ð ÔÖ Ò Ô Ó ÙÒ Ñ ÒØ Ð Ð ×ØÖÙ ØÙÖ             ØÓ× ×Ù Ý Ò ÐÑ Ò Ö Ð Ö Ò Ð ¹
             Ð Ö ÓÐ Ò        ÒÓ Óº È Ö ÐÐÓ¸ ÒÓ× Ú Ð Ö ÑÓ× Ð × Ù ÒØ ¬Ò ÓÒ
                     ´
     Definici´n 4.10 (Arbol con rangos)
            o                            ÍÒ Ö ÓÐ Ò Ö Ó ÓÒ Ö Ò Ó× × ÙÒ Ö ÓÐ Ò Ö Ó
     ÓÒ ÙÒ ÑÔÓ         ÓÒ Ð Ò      ÒÓ Ó¸ ÒÓØ Ó (n)¸ ÕÙ ÐÑ Ò Ð Ö Ò Ð         Ý Ð
     Ù Ð× Ø×
                        ∀n ∈ T,   (n) =   (Ä(n)) + 1 + (Ê(n)),   (∅) = 0

        ÍÒ       ÔÙ    × Ö ÜØ Ò Ó Ý ÐÓ ¬Ò ÑÓ× ÓÑÓ × Ù
                     ´
     Definici´n 4.11 (Arbol binario de b´ squeda extendido)
            o                          u                          ÍÒ Ö ÓÐ Ò Ö Ó    Ù×ÕÙ
     ÜØ Ò Ó T × ÙÒ Ö ÓÐ Ò Ö Ó       Ù×ÕÙ     ÓÒ Ö Ò Ó׺
           Ð ÖÓÒ ÑÓ           Ö ¬ Ö ÙÒ Ö ÓÐ Ò Ö Ó       Ù×ÕÙ    ÜØ Ò Óº
          Ä ¬ ÙÖ º ¼ ÐÙ×ØÖ ÙÒ              º Ð ÑÔÓ ×ÙÔ Ö ÓÖ × Ð Ð Ú Ý Ð Ò Ö ÓÖ × Ð
       Ö ÒÐ          Ð ×Ù Ö Óк Ò Ð ¬ ÙÖ ¸       ÒÓ Ó Ø Ò ÙÒ Ø ÕÙ Ø ¸ ÕÙ ÒÓ ÓÖÑ Ô ÖØ
         Ð ×ØÖÙ ØÙÖ         ØÓ׸ ÓÖÖ ×ÔÓÒ ÒØ ×Ù ÔÓ× ÓÒ Ò¬ º
              Ó ni ∈ T | in      ¸ ÒØÓÒ ×¸ (Ä(n)) ÒÓ× Ð ÔÓ× ÓÒ Ò¬         ni Ö ×Ô ØÓ Ð
     ×Ù Ö ÓÐ ÓÒ Ö Þ niº ר × Ð ÓÒÓ Ñ ÒØÓ ÕÙ ÒÓ× Ô ÖÑ Ø Ö                Ö Ð Ö ÓÐ ÔÓÖ ×Ù
     ÔÓ× ÓÒ Ò¬ º
           ר ÑÓ× Ð ×ØÓ× Ô Ö × Ò Ö ÙÒ Ò Ö ×ØÖÙ ØÙÖ           ×ØÖ ÓÒ × Ý Ó Ó ÕÙ ÒÓ×
     Ñ Ò Ö ÓÐ × ÜØ Ò Ó׺ Ä ÔÖ Ñ Ö × ÓÒ× ×Ø Ò ¬Ò Ö Ð ×ØÖÙ ØÙÖ                    ÙÒ ÒÓ Ó
       Ò Ö Ó ÓÑÔÓÒ ÒØ ÙÒ               ¸ Ð Ù Ð × ¬Ò Ò Ð Ö ÚÓ ØÔÐ ÒÆÓ ØºÀ ¿ ¿
¿¿    ØÔÐ ÒÆÓ ØºÀ ¿ ¿ ≡
      class BinNodeXt_Data
      {
354                                                                             Cap´        ´
                                                                                       ıtulo 4. Arboles


                                                                                                    25
                                                                                                    253
                                                                                                    30
                                                                                  19                        28
                                                                                  156                       284
                                                                                  25                         4
         2                                                                              21                27    29
         20                                                                             168               256   299
         19                                                                              5                 2     1
0                  4                                                                20    22          26
0                  44                                                               161   181         255
2                  16                                                                1     3           1
    1         3                                                               18                24
    10        32                                                              130               237
    1         1                                                               14                 2
                                            9                                                 23
                                            76                                                208
                                            13                                                 1
                             6                             12
                             46                            99
                             4                             8
                        5              8         10               14
                        45             58        89               101
                        1              2         2                 5
                                  7                   11        13    15
                                  50                  92        100   122
                                  1                   1          1     3
                                                                            17
                                                                            129
                                                                             2
                                                                        16
                                                                        125
                                                                         1




                                            ÙÖ º ¼ ÍÒ Ö ÓÐ Ò Ö Ó ÜØ Ò Ó

        size_t count; // cardinalidad del arbol
                                          ´
        BinNodeXt_Data() : count(1) { /* empty */ }
        BinNodeXt_Data(SentinelCtor) : count(0) { /* empty */ }
        size_t & getCount() { return count; }
        const size_t & size() const { return count; }
        void reset() { count = 1; }
      };
      DECLARE_BINNODE_SENTINEL(BinNodeXt, 255, BinNodeXt_Data);
      # define COUNT(p) ((p)->getCount())
       ÈÖ Ñ Ø Ú × × × ×Ó Ö BinNodeXt<Key> ¿
    Í× × DECLARE BINNODE SENTINEL ¾ º
4.11. Extensiones a los ´rboles binarios
                            a                                                      355



        Ä Ö ÒÐ          × Ù Ö Ò Ð ØÖ ÙØÓ count¸ Ð Ù Ð Ø Ò ×Ù Ó × ÖÚ ÓÖ Ý ÑÓ ¬¹
        ÓÖ ¬Ò Ó× Ò Ð Ô ÖØ ÔÙ Ð         Ð Ð × BinNodeXt<Key>º
          Ò ÙÒ         × × Ð ÙØ Ð Þ Ö ÙÒ ÒÓ Ó ÒØ Ò Ð ×Ô Ð ÕÙ Ö ÔÖ × ÒØ Ð Ö ÓÐ
    Ú Óº Ä Ú ÒØ          Ð ÒØ Ò Ð × ÕÙ ×Ù ÑÔÓ count × ÑÔÖ × ÖÓ¸ ÐÓ ÕÙ Ú Ø
    Ð Ò ×           Ú Ö ¬ Ö × Ð ÒÓ Ó       Ó × Ð ÒÙÐÓ Ó ÒÓ Ò ÕÙ ÐÐÓ× Ð ÓÖ ØÑÓ× ÕÙ
    ÔÖ ÙÒØ Ò Ð Ö Ò Ð º Ä Ö Ò Ð                ∅ × 0¸ ÕÙ × Ð Ñ ×ÑÓ Ú ÐÓÖ Ð ÔÓ× ÓÒ
     Ò¬       ÙÒ ÒÓ Ó Ò ÓÑÔÐ ØÓ ÔÓÖ Ð ÞÕÙ Ö º
          Ð ÒÓ Ó ÒØ Ò Ð × ÙÒ Òר Ò ×Ø Ø         BinNodeXt<Key> ÙÝÓ ×Ô Ó × Ö × Ö¹
    Ú Ó Ò Ð Ñ ÖÓ DECLARE BINNODE SENTINELº
    4.11.1   Selecci´n por posici´n
                    o            o
       ÓT ∈          ÓÒ Ö Þ r¸ × × Ò ÓÒØÖ Ö Ð i¹ × ÑÓ Ð Ñ ÒØÓ Ò Ð ÔÓ× ÓÒ Ò¬ º Ä
    רÖÙ ØÙÖ      ØÓ׸ ÙÒ       Ð Ù×Ó Ð ÒÓ Ó ÒØ Ò Ð ¸ Ó Ö ÙÒ ×ÓÐÙ ÓÒ ÓÑÔÐ Ø Ñ ÒØ
     ÒÖÐ ×       Ö¸ × Ò Ò Ò ÙÒ ×Ó Ô ÖØ ÙÐ Ö¸ Ð Ù Ð × Ô ØÓÖ Þ Ð × Ù ÒØ ÑÓ Ó
                                        T
                                        (r) select rec(r, i)
                     if i <   (L(r))         if i > (L(r)) + 1

     select rec(L(r), i)                            select rec(R(r), i - COUNT(LLINK(r)) - 1)

                              L(T )             R(T )
                              (L(r))            (R(r))


    Å Ò ÓÒ Ô ÖØ ÙÐ Ö Ñ Ö Ð ÐÐ Ñ Ö ÙÖ× Ú ÔÓÖ Ð Ö º Ò Ö ÐÑ ÒØ                    Ð Ò Ó¸
     Ù Ò Ó Ù× ÑÓ× ÔÓÖ Ð Ö ¸ ÐÓ             ÑÓ× Ö Ð Ø Ú Ñ ÒØ ×Ó Ö ÙÒ Ö ÓÐ ÕÙ ÓÒ¹
    Ø Ò (Ê(r)) ÒÓ Ó׸ Ô ÖÓ Ð ÔÓ× ÓÒ i Ð ÐÐ Ñ ÓÖ Ò Ð Ø Ò ÙÒ Ö ÓÐ ÓÒ (r)
    ÒÓ Ó׺       ÑÓ× Ô٠׸ ÓÑÔ Ò× Ö Ð ÐÐ Ñ    ÓÒ Ð ÒØ           ÒÓ Ó× ÕÙ Ð Ö ÓÖÖ Ó
     Ò¬ Ó       Ù Ò Ó × Ú ÔÓÖ Ð Ö º ×ØÓ × (L(r)) Ð ×Ù Ö ÓÐ ÞÕÙ Ö Ó Ñ × Ð
    Ö Þº
          ÓÒ ÐÓ ÒØ Ö ÓÖÑ ÒØ ÜÔÙ ×ØÓ ÓÑÔÖ Ò Ó¸ Ð Ð ÓÖ ØÑÓ Ö ×ÙÐØ ÒØ       × Ö × Ò ÐÐÓ
¿    ÈÖ Ñ Ø Ú × × × ×Ó Ö BinNodeXt<Key> ¿ ≡                  ´¿ ¿µ ¿
         template <class Node> inline
     Node * select_rec(Node * r, const size_t & i)
     {
       if (i == COUNT(LLINK(r)))
         return r;
       if (i < COUNT(LLINK(r)))
         return select_rec(static_cast<Node*>(LLINK(r)), i);
       return select_rec(static_cast<Node*>(RLINK(r)), i - COUNT(LLINK(r)) - 1);
     }


      Ä Ú Ö× ÓÒ Ø Ö Ø Ú Ø Ñ Ò × ÑÙÝ × Ò ÐÐ ¸ Ñ × × ÙÖ Ý ÑÙ Ó Ñ × ¬ ÒØ
¿   ÈÖ Ñ Ø Ú × × × ×Ó Ö BinNodeXt<Key> ¿ +≡         ´¿ ¿µ ¿  ¿
         template <class Node> inline
     Node * select(Node * r, const size_t & pos)
     {
       for (size_t i = pos; i != COUNT(LLINK(r)); /* nada */)
356                                                                 Cap´        ´
                                                                           ıtulo 4. Arboles



              if (i   < COUNT(LLINK(r)))
                r =   static_cast<Node*>(LLINK(r));
              else
                {
                  i   -= COUNT(LLINK(r)) + 1;
                  r   = static_cast<Node*>(RLINK(r));
                }
          return r;
     }


    4.11.2     C´lculo de la posici´n infija
                a                  o
          ÙÒ Ð Ú Ü ×Ø ÒØ Ò Ð         ¸ × ÑÓ× Ð ÙÐ Ö ×Ù ÔÓ× ÓÒ Ò¬ × Ö¸ ×Ù
    ÓÖ Ò ÒØÖÓ Ð ÓÒ ÙÒØÓ Ð Ú ×º ר ÔÖÓ Ð Ñ × Ö ×Ù ÐÚ Ö ÙÖ× Ú Ñ ÒØ Ð × Ù ÒØ
    ÑÓ Ó
¿    ÈÖ Ñ Ø Ú × × × ×Ó Ö BinNodeXt<Key> ¿ +≡       ´¿ ¿µ ¿   ¿
         template <class Node, class Compare> inline
     size_t inorder_position(Node * r, const typename Node::key_type & key, Node *& node)
     {
       if (Compare () (key, KEY(r)))
         return inorder_position(static_cast<Node*>(LLINK(r)), key, node);
       else if (Compare () (KEY(r), key))
         return inorder_position(static_cast<Node*>(RLINK(r)), key, node) + COUNT(LLINK(r)) + 1;
       else
         return COUNT(LLINK(r));
     }
        Ä ÖÙØ Ò Ö    ÓÑÓ ÒØÖ Ð Ö Þ Ð Ö ÓÐ r Ý Ð Ð Ú keyº Ð Ø Ö Ö Ô Ö Ñ ØÖÓ¸
    node¸ ×    × Ð Ý × ÙÒ ÒÓ Ó ÕÙ ÓÒØ Ò Ð Ð Ú key ר Ö ×ÙÐØ Ó Ø Ò × ÒØ Ó ×ÓÐÓ
    × Ð Ð Ú Ù Ò ÓÒØÖ º Ð Ú ÐÓÖ Ö ØÓÖÒÓ × Ð ÔÓ× ÓÒ key ÒØÖÓ Ð Ö ÓÖÖ Ó
     Ò¬ Óº Ò ×Ó ÕÙ key ÒÓ × Ò Ù ÒØÖ Ò Ð Ö Óи ÒØÓÒ × × Ö ØÓÖÒ ÙÒ Ú ÐÓÖ
    Ò Ø ÚÓº

    4.11.3     Inserci´n por clave en ´rbol binario extendido
                      o               a
    Ä Ò× Ö ÓÒ ÔÓÖ Ð Ú × ÒØ        Ð ÙÒ                  ÔÖ × ÒØ     ÒÜ º º¿ ´Ô Ò ¿¿ µ¸ × ÐÚÓ
    ÕÙ Ò × Ø ÑÓ× ØÙ Ð Þ Ö ÐÓ× ÓÒØ ÓÖ ×
¿    ÈÖ Ñ Ø Ú × × × ×Ó Ö BinNodeXt<Key> ¿         +≡              ´¿ ¿µ ¿   ¿
         template <class Node, class Compare> inline
     Node * insert_by_key_xt(Node *& r, Node * p)
     {
       if (r == Node::NullPtr)
         return r = p;
       Node * q;
       if (Compare () (KEY(p), KEY(r)))
         {
           q = insert_by_key_xt<Node, Compare>(static_cast<Node*&>(LLINK(r)), p);
           if (q != Node::NullPtr)
             ++COUNT(r);
         }
4.11. Extensiones a los ´rboles binarios
                            a                                                     357



         else if (Compare ()(KEY(r), KEY(p)))
           {
             q = insert_by_key_xt<Node, Compare>(static_cast<Node*&>(RLINK(r)), p);
             if (q != Node::NullPtr)
               ++COUNT(r);
           }
         else
           return (Node*) Node::NullPtr; // clave duplicada
         return q;
     }
         Ä × ÒØ Ü × Ý × Ñ ÒØ     ×ÓÒ Ð × Ñ ×Ñ × ÕÙ Ô Ö ÐÓ×   º

    4.11.4    Partici´n por clave
                     o
    Ä Ô ÖØ ÓÒ ÔÓÖ Ð Ú ÜÔÐ        Ò Ü º º ´Ô Ò ¿¿ µ ÔÙ ÑÔÐ ÒØ Ö× ÓÒ Ð Ñ ×Ñ
     רÖÙ ØÙÖ Ô Ö ÙÒ
¿    ÈÖ Ñ Ø Ú × × × ×Ó Ö BinNodeXt<Key> ¿ +≡        ´¿ ¿µ ¿ ¿
     # define SPLIT split_key_rec_xt<Node, Compare>

         template <class Node, class Compare> inline
     bool split_key_rec_xt(Node * root, const typename Node::key_type & key,
                           Node *& l, Node *& r)
     {
       if (root == Node::NullPtr)
         {
           l = r = Node::NullPtr;
           return true;
         }
       if (Compare() (key, KEY(root)))
         {
           if (not SPLIT(LLINK(root), key, l, LLINK(root)))
             return false;
           r = root;
           COUNT(r) -= COUNT(l);
         }
       else if (Compare() (KEY(root), key))
         {
           if (not SPLIT(RLINK(root), key, RLINK(root), r))
             return false;
           l = root;
           COUNT(l) -= COUNT(r);
         }
       else
         return false; // clave duplicada
       return true;
     }
      ¬Ò ×
     split key rec xt¸   Ù×   Ò ÙÒ ¿   º
358                                                         Cap´        ´
                                                                   ıtulo 4. Arboles



    4.11.5    Inserci´n en ra´
                     o       ız
      ÓÒ Ð ÙÒ ÓÒ ÒØ Ö ÓÖ¸ ÔÓ ÑÓ× ÑÔÐ ÒØ Ö Ð Ò× Ö ÓÒ Ò Ð Ö Þ Ó Ð Ñ ×ÑÓ ×ÕÙ Ñ
    ÕÙ Ð × ÖÖÓÐÐ     Ò Ü º º ´Ô Ò ¿ ¿µ
¿    ÈÖ Ñ Ø Ú × × × ×Ó Ö BinNodeXt<Key> ¿ +≡         ´¿ ¿µ ¿ ¿
          template <class Node, class Compare> inline
      Node * insert_root_xt(Node *& root, Node * p)
      {
        if (root == Node::NullPtr)
          return p;
        if (not split_key_rec_xt<Node, Compare>(root, KEY(p), LLINK(p), RLINK(p)))
          return Node::NullPtr;
        COUNT(p) = COUNT(LLINK(p)) + COUNT(RLINK(p)) + 1;
        root = p;
        return p;
      }
      ¬Ò ×
      insert root xt¸ Ù×     Ò ÙÒ   º
    Í× × split key rec xt   ¿ º

    4.11.6    Partici´n por posici´n
                     o            o
      ר ÓÔ Ö ÓÒ × Ô Ö            Ð Ô ÖØ ÓÒ ÔÓÖ Ð Ú ¸ ÓÒ Ð Ü Ô ÓÒ ÕÙ Ð ÔÙÒØÓ
    Ô ÖØ ÓÒ × Ö ×Ô ØÓ ÙÒ ÔÓ× ÓÒ i Ð Ö ÓÖÖ Ó Ò¬ Óº Ä Ô ÖØ ÓÒ Ö ×ÙÐØ Ò Ó×
     Ö ÓÐ × Tl =< k1k2 . . . kl > Ý Tr =< ki . . . kn >º
        Ë ÐÚÓ ÕÙ i ר Ù Ö Ö Ò Ó × Ö¸ i ≥ (T )¸ Ð Ð ÓÖ ØÑÓ × ÑÔÖ Ø Ò Ü ØÓº
        È Ö ×Ø × ØÙ ÓÒ¸ × Ò ÑÓ× Ð × Ù ÒØ Ð ÓÖ ØÑÓ Ö Ñ Ò × ÒØ Ð Ô ÖØ ÓÒ Ö ÙÖ¹
    × Ú ÔÓÖ Ð Ú
¿    ÈÖ Ñ Ø Ú × × × ×Ó Ö BinNodeXt<Key> ¿ +≡               ´¿ ¿µ ¿ ¿
          template <class Node> inline
      void split_pos_rec(Node * r, const size_t & i, Node *& ts, Node *& tg)
      {
        if (i == COUNT(r)) // ¿Es la ultima posici´n (que est´ vac´a)?
                                     ´            o          a    ı
          {
            ts = r;
            tg = Node::NullPtr;
            return;
          }
        if (i == COUNT(LLINK(r))) // ¿se alcanz´ la posici´n de partici´n?
                                               o          o            o
          {
            ts = LLINK(r);
            tg = r;
            LLINK(tg) = Node::NullPtr;
            COUNT(tg) -= COUNT(ts);
            return;
          }
        if (i < COUNT(LLINK(r)))
          {
            split_pos_rec(static_cast<Node*>(LLINK(r)), i, ts, static_cast<Node*&>(LLINK(r)));
            tg = r;
4.11. Extensiones a los ´rboles binarios
                            a                                                                  359



              COUNT(r) -= COUNT(ts);
            }
          else
            {
              split_pos_rec(static_cast<Node*>(RLINK(r)), i - (COUNT(LLINK(r)) + 1),
                            static_cast<Node*&>(RLINK(r)), tg);
              ts = r;
              COUNT(r) -= COUNT(tg);
            }
      }
      ¬Ò ×
      split pos rec¸   Ù×   Ò ÙÒ ¿    º

    4.11.7     Inserci´n por posici´n
                      o            o
      ÓÒ× Ö ÑÓ× Ð Ö ÓÖÖ Ó Ò¬ Ó k0, k1, k2, . . . , ki−1, ki, ki+1, . . . , kn º Ù Ò Ó Ò× ÖØ ÑÓ×
                                                                            1
    kp  Ò Ð i¹ × Ñ ÔÓ× ÓÒ¸ Ð Ö ÓÖÖ Ó Ö ×ÙÐØ ÒØ × k0, k1, k2, . . . , ki−1, kp, ki, ki+1, . . . , kn
                                                                                                  1
     ×     Ö¸ Ô ÖØ Ö Ð ÔÓ× ÓÒ i¸ ÐÓ× Ð Ñ ÒØÓ× × ×ÔÐ Þ Ò                           Ð Ö              Ð
    ÔÓ× ÓÒ Ò¬ kp × i¸ ×Ù ÔÖ         ×ÓÖ × ki−1 Ý ×Ù ×Ù ×ÓÖ × kiº Ð Ð ÓÖ ØÑÓ ÕÙ
    ÔÖÓÔÓÒ ÑÓ× × ÑÙÝ × Ò ÐÐÓ × ÒÓ× Ò×Ô Ö ÑÓ× Ð                  Ò× Ö ÓÒ Ò Ð Ö Þ ÔÖ × ÒØ Ó
     Ò Ü º º ´Ô Ò ¿ ¿µ ´Ô º ¿ ¿µ
¿    ÈÖ Ñ Ø Ú × × × ×Ó Ö BinNodeXt<Key> ¿ +≡                   ´¿ ¿µ ¿         ¿
          template <class Node> inline
      void insert_by_pos_xt(Node *& r, Node * p, const size_t & pos)
      {
        split_pos_rec(r, pos, static_cast<Node*&>(LLINK(p)), static_cast<Node*&>(RLINK(p)));
        COUNT(p) = COUNT(LLINK(p)) + 1 + COUNT(RLINK(p));
        r = p;
      }
    Í× × split pos rec ¿    º
       Ë ÐÚÓ ÕÙ pos ר Ù Ö       Ö Ò Ó Ó × ÕÙ × Ù Ð Ó ×Ó Ö Ô × Ð ÒØ
     Ð Ñ ÒØÓ׸ Ð Ò× Ö ÓÒ × ÑÔÖ Ø Ò Ö Ü ØÓº
       ÆÓØ ÑÓ× ÕÙ Ð Ò× Ö ÓÒ ÔÓÖ ÔÓ× ÓÒ ÔÙ Ú ÓÐ Ö Ð ÓÒ ÓÒ ÓÖ Ò ÙÒ                                      º
    4.11.8     Uni´n exclusiva de ´rboles extendidos
                  o               a
    Ä ÙÒ ÓÒ Ü ÐÙ× Ú ÔÖ × ÒØ    Ò Ü º º ´Ô Ò ¿ ½µ × ×ØÖÙ ØÙÖ ÐÑ ÒØ ÒØ Ò ×Ù
    Ú Ö× ÓÒ Ô Ö Ö ÓÐ × ÜØ Ò Ó׺ ÄÓ ÙÒ Ó ÕÙ    ÑÓ× ÑÓ ¬ Ö × Ð ØÙ Ð Þ ÓÒ
    ÐÓ× ÓÒØ ÓÖ ×
¿    ÈÖ Ñ Ø Ú × × × ×Ó Ö BinNodeXt<Key> ¿ +≡       ´¿ ¿µ ¿    ¿¼
          template <class Node> inline
      Node * join_exclusive_xt(Node *& ts, Node *& tg)
      {
        if (ts == Node::NullPtr)
          return tg;
        if (tg == Node::NullPtr)
          return ts;
        LLINK(tg) = join_exclusive_xt(RLINK(ts), LLINK(tg));
        RLINK(ts) = tg;
360                                                           Cap´        ´
                                                                      ıtulo 4. Arboles



           COUNT(tg) = COUNT(LLINK(tg)) + 1 + COUNT(RLINK(tg)); // actualizar contadores
           COUNT(ts) = COUNT(LLINK(ts)) + 1 + COUNT(RLINK(ts));
           Node * ret_val = ts;
           ts = tg = Node::NullPtr; // deben quedar vac´os despu´s del join
                                                       ı        e
           return ret_val;
       }
       ¬Ò ×
       join exclusive xt¸   Ù×   Ò ÙÒ ¿ ¼º

     4.11.9      Eliminaci´n por clave en ´rboles extendidos
                          o               a
     Ð Ñ Ò Ö ÔÓÖ Ð Ú Ò ÙÒ Ö ÓÐ ÜØ Ò Ó Ø Ñ Ò × ÑÙÝ × Ñ Ð Ö Ð ×ØÙ
     Ò Ü º º ´Ô º ¿ ¾µ ÓÒ Ð     ÓÒ ÕÙ Ý ÕÙ ØÙ Ð Þ Ö ÐÓ× ÓÒØ ÓÖ × Ò Ð Ñ ÒÓ
        Ù×ÕÙ
¿¼   ÈÖ Ñ Ø Ú × × × ×Ó Ö BinNodeXt<Key> ¿ +≡   ´¿ ¿µ ¿     ¿¼
       # define REMOVE remove_by_key_xt<Node, Compare>

           template <class Node, class Compare> inline
       Node * remove_by_key_xt(Node *& root, const typename Node::key_type & key)
       {
         if (root == Node::NullPtr)
           return (Node*) Node::NullPtr; // clave no encontrada
         Node * ret_val = Node::NullPtr;
         if (Compare () (key, KEY(root)))
           {
             ret_val = REMOVE(static_cast<Node*&>(LLINK(root)), key);
             if (ret_val != Node::NullPtr) // ¿hubo eliminaci´n?
                                                             o
               --COUNT(root); // S´ ==> actualizar contador
                                  ı
             return ret_val;
           }
         else if (Compare () (KEY(root), key))
           {
             ret_val = REMOVE(static_cast<Node*&>(RLINK(root)), key);
             if (ret_val != Node::NullPtr) // ¿hubo eliminaci´n?
                                                             o
               --COUNT(root); // S´ ==> actualizar contador
                                  ı
             return ret_val;
           }
         ret_val = root; // clave encontrada ==> eliminar
         root = join_exclusive_xt(static_cast<Node*&>(LLINK(root)),
                                  static_cast<Node*&>(RLINK(root)));
         return ret_val;
       }
     Í× × join exclusive xt ¿    º

     4.11.10      Eliminaci´n por posici´n en ´rboles extendidos
                           o            o     a
     Ë Ð ÔÓ× ÓÒ Ò¬ × Ú Ð ¸ ÒØÓÒ ×¸ Ð Ù Ð ÕÙ ÓÒ Ð Ò× Ö ÓÒ Ý Ð Ô ÖØ ÓÒ¸ Ð
      Ð Ñ Ò ÓÒ × ÑÔÖ Ø Ò Ü ØÓ Ý × ¬Ò ÓÑÓ × Ù
¿¼    ÈÖ Ñ Ø Ú × × × ×Ó Ö BinNodeXt<Key> ¿ +≡  ´¿ ¿µ ¿ ¼ ¿ ¿
              template <class Node> inline
4.12. Rotaci´n de ´rboles binarios
            o     a                                                        361



  Node * remove_by_pos_xt(Node *& root, const size_t & pos)
  {
    if (COUNT(LLINK(root)) == pos) // ¿posici´n encontrada?
                                             o
      {     // Si ==> guarde nodo y realice join exclusivo
        Node * ret_val = root;
        root = join_exclusive_xt(static_cast<Node*&>(LLINK(root)),
                                 static_cast<Node*&>(RLINK(root)));
        return ret_val;
      }
    Node * ret_val; // guarda valor de retorno de llamada recursiva
    if (pos < COUNT(LLINK(root)))
      ret_val = remove_by_pos_xt(static_cast<Node*&>(LLINK(root)), pos);
    else
      ret_val = remove_by_pos_xt(static_cast<Node*&>(RLINK(root)),
                                 pos - (COUNT(LLINK(root)) + 1));
    if (ret_val != Node::NullPtr) // ¿hubo eliminaci´n?
                                                    o
      --COUNT(root); // Si ==> el arbol con ra´z root perdi´ un nodo
                                  ´           ı             o
    return ret_val;
  }
Í× × join exclusive xt ¿   º

4.11.11     Desempe˜o de las extensiones
                   n
Ë ÙÒ Ð ÔÖÓÔÓ× ÓÒ Ü º½¾ ´Ô Ò ¿ µ¸ ÙÒ × Ù Ò        Ò× Ö ÓÒ Ð ØÓÖ ÔÖÓ Ù ÙÒ
 Ö ÓÐ ÕÙ Ò ÔÖÓÑ Ó ×Ø ÕÙ Ð Ö Óº ÓÒ× Ù ÒØ Ñ ÒØ ¸ × ÓÒרÖÙ ÑÓ× ÙÒ       ÔÓÖ
Ò× Ö ÓÒ Ð Ú × Ð ØÓÖ ×¸ ÒØÓÒ × ÐÓ× × ÑÔ ÒÓ× ÙÒ ÓÒ × ÕÙ ÒÓ ÑÓ ¬ÕÙ Ò Ð
 Ö ÓÐ × Ö Ò O(Ð (n)) ר × Ð ×Ó Ð × Ð ÓÒ¸ Ø ÖÑ Ò ÓÒ Ð ÓÖ Ò Ò¬ Ó Ý Ð
Ò× Ö ÓÒ ÔÓÖ Ð Ú º
     Ò Ð Ô ØÙÐÓ ×ØÙ Ö ÑÓ× Ú Ö× × Ø Ò × Ô Ö Ñ ÒØ Ò Ö ÕÙ Ð Ö Ó× Ö ÓÐ ×
  Ò Ö Ó×     Ù×ÕÙ ÕÙ Ñ Ò Ò O(Ð (n)) Ò ØÓ × Ð × ÓÔ Ö ÓÒ ×º ÓÒ Ù ÐÕÙ Ö
 ר × Ø Ò ×¸ × ÑÔÖ × ÔÓ× Ð Ñ ÒØ Ò Ö ÐÓ× Ö Ò Ó׺

4.12      Rotaci´n de ´rboles binarios
                o     a
Ä ¬ ÙÖ º ½ ÑÙ ×ØÖ Ó×            ÕÙ Ú Ð ÒØ × × ÙÒ Ð ÔÖÓÔ      ÓÖ Òº       ÙÒÓ
 ÐÐÓ× ÔÙ Ó Ø Ò Ö× Ô ÖØ Ö Ð ÓØÖÓ ØÖ Ú × ÙÒ ØÖ Ò× ÓÖÑ ÓÒ ÐÐ Ñ           ÖÓØ ÓÒ º
  Ð Ö ÓÖÖ Ó Ò¬ Ó Ð Ö ÓÐ º ½´ µ × (αAβ)Bχ¸ Ñ ÒØÖ × ÕÙ Ð Ð º ½´ µ × αA(βBχ)º
Ä ÓÔ Ö ÓÒ ÖÓØ ÓÒ ÒÓ Ø Ð ÔÖÓÔ                    ÓÖ Ò ÙÒ      º
      Ð Ö ÓÐ º ½´ µ × Ó Ø Ò Ô ÖØ Ö Ð Ö ÓÐ º ½´ µ Ñ ÒØ ÙÒ ÖÓØ ÓÒ              Ð
   Ö       Ù ÓÖ Ö      Ð ÒÓ Ó Bº Ò ÐÓ Ñ ÒØ ¸ Ð Ö ÓÐ º ½´ µ × Ó Ø Ò Ô ÖØ Ö Ð
 Ö ÓÐ º ½´ µ Ñ ÒØ ÙÒ ÖÓØ ÓÒ               Ð ÞÕÙ Ö Ù ÒØ ¹ ÓÖ Ö      Ð ÒÓ Ó Aº
     À Ý Ó× Ö Ø Ö ×Ø × ÑÔÓÖØ ÒØ × ÙÒ ÖÓØ ÓÒ ÕÙ ÑÔÐ ¬ Ö ÑÓ× ÓÒ Ð
ÖÓØ ÓÒ         Ð Ö
    ½º Ð ÒÓ Ó A ×Ñ ÒÙÝ Ò ÙÒ Ò Ú Ð¸ Ñ ÒØÖ × ÕÙ Ð Ò Ú Ð Ð ÒÓ Ó B Ð Ö ÓÐ ÓÖ Ò Ð
        ÙÑ ÒØ Ò ÙÒÓº
    ¾º Ä Ö Ñ α ×Ñ ÒÙÝ ÒØ Ö Ñ ÒØ Ò ÙÒ Ò Ú Ð¸ Ñ ÒØÖ × ÕÙ Ð Ö Ñ χ ÙÑ ÒØ
        ÒØ Ö Ñ ÒØ Ò ÙÒ Ò Ú Ðº
362                                                                              Cap´        ´
                                                                                         ıtulo 4. Arboles


                                          p                q
                                              B                    A
                                q                                                p
                                     A                                       B
                                                  χ        α

                            α             β                             β        χ

                                                      ⇐⇒
                                         ´µ                            ´ µ

                                    ÙÖ º ½ ÊÓØ ÓÒ          ÙÒ Ö ÓÐ Ò Ö Ó

            ÓÖ Ú ÑÓ× ÓÑÓ ÑÔÐ ÒØ Ö Ð ÖÓØ ÓÒ                     Ð         Ö       ºË     p   Ð Ö Þ Ð Ö ÓÐ
     ÖÓØ Ö¸ ÒØÓÒ ×
¿¾     ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                                               ¿     ¿¾
          template <class Node> inline
      Node * rotate_to_right(Node * p)
      {
        Node * q = static_cast<Node*>(LLINK(p));
        LLINK(p) = RLINK(q);
        RLINK(q) = p;
        return q;
      }
          rotate to right() Ö
                            ØÓÖÒ Ð ÒÙ Ú Ö Þ Ð Ö ÓÐ ÐÙ Ó Ð ÖÓØ ÓÒº                              ÓÒ ×Ø Ú ÐÓÖ
        Ö ØÓÖÒÓ ÔÙ    ØÙ Ð Þ Ö× Ð Ô Ö Ð Ö ÓÐ Ö ×ÙÐØ ÒØ º ÈÓÖ ÐÓ Ò Ö Ð¸                         ר ÔÖ Ñ Ø Ú
     × ÙØ Ð Þ Ò Ð ÓÖ ØÑÓ× Ö ÙÖ× ÚÓ× ÕÙ ÒÚÓ Ò ÖÓØ ÓÒ × ×Ù Ö ÓР׺
         È Ö Ð ÓÖ ØÑÓ× Ø Ö Ø ÚÓ׸ × Ñ × ÓÒÚ Ò ÒØ ÙØ Ð Þ Ö ÙÒ Ú Ö× ÓÒ Ð                         ÖÓØ ÓÒ ÕÙ
         ØÙ Ð ØÙ Ð Þ ÓÒ Ð Ô Ö º È Ö ÐÐÓ¸        ÑÓ× Ô × Ö Ð Ô Ö Ð ×Ù                           Ö ÓÐ ÕÙ × Ö
     ÖÓØ Ó
¿¾     ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡                                 ¿¾
          template <class Node> inline
      Node * rotate_to_right(Node * p, Node * pp)
      {
        Node *q = static_cast<Node*>(LLINK(p));
        LLINK(p) = RLINK(q);
        RLINK(q) = p;
        if (static_cast<Node*>(LLINK(pp)) == p) // actualizaci´n del padre
                                                              o
          LLINK(pp) = q;
        else
          RLINK(pp) = q;
        return q;
      }
     pp   × Ð Ô Ö Ð ÒÓ Ó pº
          Ä × Ú Ö× ÓÒ × ÔÓÖ Ð ÞÕÙ Ö ×ÓÒ × Ñ ØÖ ׺
4.13. C´digos de Huffman
            o                                                                                   363



     4.12.1    Rotaciones en ´rboles binarios extendidos
                             a
      ÓÒ Ö ÓÐ × ÜØ Ò Ó× Ý ÕÙ Ø Ò Ö Ù Ó       Ùר Ö ÐÓ× ÓÒØ ÓÖ ×º Ê ØÓÑ Ò Ó Ð
       ×Ó Ò Ö Ð ÖÓØ ÓÒ ÐÙ×ØÖ Ó Ò Ð ¬ ÙÖ º ½¸ Ø Ò ÑÓ× ÙÒ Ö ÓÐ Ò Ö Ó (αAβ)Bχ
     ÕÙ × ÑÓ× ÖÓØ Öº ÈÓÖ Ð ¬Ò ÓÒ Ö ÓÐ ÜØ Ò Ó¸ Ø Ò ÑÓ× ÕÙ
                          (B) =      (α) + 1 + (β) + 1 + (χ)                           .
                          |B|        |α|    |{A}|       |β|         |{B}|     |χ|

       ×ÔÙ ×    ÖÓØ Ö ×         ÙÑÔÐ Ö
                          (A) =     (α) + 1 +           (β) + 1 + (χ)                  .
                          |A|       |α|    |{B}|        |β|       |{B}|     |χ|

         × Ô٠׸ Ð ÔÖ Ñ Ø Ú       ÖÓØ ÓÒ            Ð         Ö      ×Ö
¿¿   ÈÖ Ñ Ø Ú × × × ×Ó Ö   BinNodeXt<Key> ¿   +≡                                    ´¿ ¿µ ¿ ¼
          template <class Node> inline
      Node * rotate_to_right_xt(Node* p)
      {
        Node * q = static_cast<Node*>(LLINK(p));
        LLINK(p) = RLINK(q);
        RLINK(q) = p;
        COUNT(p) -= 1 + COUNT(LLINK(q));
        COUNT(q) += 1 + COUNT(RLINK(p));
        return q;
      }


     4.13      C´digos de Huffman
                o
     Ä Ö ÔÖ × ÒØ ÓÒ ×Ø Ø ÜØÓ ÓÒ× ×Ø Ò ÙÒ × Ö            × Ñ ÓÐÓ× Ð Ø ÒÓ׸ Ö × Ó׸ Ö ¹
      Ó× Ý ÓØÖÓ× Ñ × ÓÒÚ Ò Ó× × ÑÙÒ Ó× ÐÓ× × Ó× Ý Ñ Ø Ñ Ø Ó׺ Ò Ô Ô Ð¸ ÓÒ
      Ð       Ù Ó ÓÖÑ ØÓ¸ ÐÓ× × Ñ ÓÐÓ× ÓÒ ÓÖÑ Ò ÙÒ × Ù Ò Ú ×Ù ÐÑ ÒØ Ð Ð ÔÓÖ ÙÒ
        ×Ô ÒÓ Ð ÒØ º
            Ð    ÓÒ Ö Ù Ö Ð ×Ô Ó Ó ÙÔ Ó ÔÓÖ ÙÒ Ø ÜØÓ ´Ó × Ù Ò µ × Ð ÒÓÑ Ò
        ÓÑÔÖ Ñ Ö º Ò Ð Ð ÓÖ ÓÒ ÙÒ Ø ÜØÓ¸ Ý ÙÒ ÓÑÔÖÓÑ ×Ó ÒØÖ Ð ÓÑÔÖ × ÓÒ Ý
     Ð Ð Ð º Ò Ö × Ð Ð Ð ¸ × × Ö ¬ Ð ÓÑÔÖ × ÓÒ¸ Ý × × ÓÑÓ                         × Öº
     Ë ¸ ÔÓÖ ÑÔÐÓ¸ Ð Ð ØÖ × ÑÙÝ Ô ÕÙ Ò ¸ Ù× ÑÓ× Ñ ÒÓ× ×Ô Ó¸ Ô Ô Ð¸ Ô ÖÓ Ð Ø ÜØÓ ×
           Ñ ÒÓ× Ð Ð º ÈÓÖ Ð ÓÒØÖ Ö Ó¸ × Ð Ð ØÖ × ÑÙÝ Ö Ò ¸ ÒØÓÒ × Ö ÕÙ Ö ÑÓ× Ñ ×
      ×Ô Ó¸ Ö Ó¸ Ñ × Ô Ô Ð Ó Ô ÒØ ÐÐ º
           Ò Ð Ö ÔÖ × ÒØ ÓÒ      ÖÒ Ø      ÐÓ× × Ñ ÓÐÓ× ÙÒ Ø ÜØÓ × Ù× ÙÒ Ó Ó
        Ø×º Ò ÒÙ ×ØÖ × Ö ÙÒר Ò ×¸ ÙÒ Ó Ó × ÙÒ Ù Ö Ó Ö ÔÖ × ÒØ ÓÒ × Ñ ÓÐÓ×
     Ñ ÒØ ÓÑ Ò ÓÒ ×               Ø×º ÍÒ ÑÔÐÓ ÒÓØ Ð ÐÓ ÓÒר ØÙÝ Ð Ó Ó Ë ÁÁ Ð
      Ù Ð Ñ Ô × Ù Ò × × Ø Ø× ÙÒ × Ñ ÓÐÓ ¸ Ò Ð × Ù ÒØ Ø Ð ¸ Ð ÙÒ × ×Ù×
     Ó ÙÖÖ Ò ×
                                Ë Ñ ÓÐÓ Î ÐÓÖ       Ò Ö Ó Î ÐÓÖ             Ñ Ð
                                            1000001                    65
                                            1100010                    98
                                            1111011                   123
364                                                                  Cap´        ´
                                                                        ıtulo 4. Arboles



    À Ý ÓØÖÓ× × ×Ø Ñ × Ó ¬ ÓÒ                 Ö Ø Ö ×¸ ÐÓ× Ù Ð × ÙÒÓ ÑÙÝ ÒÓØ Ð × Ð
unicode¸     ÜØ Ò× Ð ¸ × Ù Ò × ÐÓÒ ØÙ Ú Ö Ð Ý ÓÒ Ð ÔÖ Ø Ò× ÓÒ × ÖÚ Ö
ØÓ Ó× ÐÓ× × Ñ ÓÐÓ× ØÓ × Ð × Ð Ò Ù ×º
       × Ò ÑÓ× Σ ÓÑÓ Ð ÓÒ ÙÒØÓ ØÓ Ó× ÐÓ× ÔÓ× Ð × × Ñ ÓÐÓ× ÕÙ ÔÙ                     ÓÒØ Ò Ö
ÙÒ Ø ÜØÓº Ò ×Ø ×Ó¸ ÔÓ ÑÓ× Ó ¬ Ö ÐÓ× |Σ| × Ñ ÓÐÓ× ÓÒ Ð |Σ| Ø×º ÓÖ Ó Ð
 Ó Ó¸ Ù ÐÕÙ Ö ÒØ ´Ó ÔÖÓ Ö Ñ µ ÔÙ                 ÒØ ÖÔÖ Ø Ö ¾½ ÙÒ Ø ÜØÓº
    Ë ÓÒ× Ö ÑÓ× ÙÒ Ø ÜØÓ Ô ÖØ ÙÐ Ö Tx ÙÝÓ× × Ñ ÓÐÓ× × Ö Ñ Ø Ò ÙÒ ÓÒ ÙÒØÓ
S ⊂ Σ¸ ÒØÓÒ × ÔÓ Ö ÑÓ× Ó ¬ ÖÐÓ ÓÒ Ð |S| ≤ Ð |Σ|                 Ø×º È Ö ÐÐÓ¸ ÓÒרÖÙ ÑÓ×
ÙÒ Ø Ð Ñ Ô Ó × Ñ ÓÐÓ× × Ù Ò ×                   Ø× Ý ÒÓ× × ÖÚ ÑÓ× ÐÐ Ô Ö ÒØ ÖÔÖ Ø Ö
 Ð Ø ÜØÓº Ì Ò ÑÓ× ÕÙ ÙÒ ÔÖ Ñ Ö ÓÖÑ              ÓÑÔÖ × ÓÒº Ë Ò Ñ Ö Ó¸ ר Ñ ØÓ Ó Ø Ò
Ð Ú ÒØÙ Ð ×Ú ÒØ              ÕÙ Ð Ø ÜØÓ      Ð Ö× ÔÓÖ ÒØ Ô Ó             ØÓ× ÓÒרÖÙ Ö Ð
Ø Ð º ×ØÓ ÔÙ × Ö ÔÖÓ Ð Ñ Ø Ó Ò Ð ÙÒ × Ö ÙÒר Ò ×¸ Ð Ð ØÙÖ ÙÒ Ö ÚÓ ÔÓÖ
   ÑÔÐÓ¸ Ý ÔÖÓ Ø ÚÓ Ò ÓØÖ ×¸ Ð ØÖ Ò×Ñ × ÓÒ ÙÒ Ø ÜØÓº
    ÇØÖÓ Ò ÓÒÚ Ò ÒØ Ð Ò ÓÕÙ ÒØ Ö ÓÖ × ÕÙ                    × Ñ ÓÐÓ Ó ÙÔ Ð Ñ ×Ñ ÒØ ¹
          Ø×¸ Ò Ô Ò ÒØ Ñ ÒØ            ×Ù Ö Ù Ò           Ô Ö ÓÒ Ò Ð Ø ÜØÓº Ë Ù× × ÑÓ×
× Ù Ò × ÐÓÒ ØÙ Ú Ö Ð ¸ ÒØÓÒ × ÔÓ Ö ÑÓ× × Ó Ö × Ù Ò × ÑÙÝ ÓÖØ × Ô Ö
× Ñ ÓÐÓ× ÑÙÝ Ö Ù ÒØ × Ý Ö Ð × Ñ × Ð Ö × Ô Ö × Ñ ÓÐÓ× Ö Ö Ô Ö ÓÒº Ä
 × × Ð ÓÒ Ö ÐÓ× × Ñ ÓÐÓ× ÙÒ Ø¸ ÐÙ Ó ÐÓ×                Ó׸ Ý × ×Ù × Ú Ñ ÒØ × ÙÒ Ù Ò
 Ö Ù ÒØ × Ð Ô Ö ÓÒ Ð × Ñ ÓÐÓ Ò Ð Ø ÜØÓº ÈÓÖ ÑÔÐÓ¸ Ð Ð Ò Ó¸ ÒÓØ Ó¸ Ô Ö
  ר Ò Ù ÖÐÓ¸ ÓÑÓ ¸ Ý Ð            ¸ ÕÙ ×ÓÒ ÑÙÝ Ö Ù ÒØ ׸ ÔÓ Ö Ò × Ö Ð × Ù Ò × 0 Ý
1¸ Ö ×Ô Ø Ú Ñ ÒØ Ñ ÒØÖ × ÕÙ Ð             ¸ ¸        Ý     ÔÓ Ö Ò ÒÓØ Ö× ÓÑÓ 00¸ 01¸
10 Ý 11º ÈÙ Ö ÑÓ× ÓÒØ ÒÙ Ö ÓÒ × Ù Ò × Ñ × Ð Ö × ×Ø                     Ö Ö ÓÑÔÐ Ø Ñ ÒØ
 Ð ÓÒ ÙÒØÓ Sº È ÖÓ × ¸ Ò ÖÙØÓ¸ ר Ò ÓÕÙ ÔÐ ÒØ ÙÒ Ñ Ù                        Ò× ÐÚ Ð ÜÔÖ ¹
× ¸ ÔÓÖ Òר Ò Ô ÖØ ÙÐ Ö Ò Ð × Ù Ò 001¸ ÔÙ × ÒÓ × ÔÙ                      ר Ò Ù Ö × × ØÖ Ø
            Ó       Ó      º
    Ä Ñ Ù              ÒØ Ö ÓÖ × ×ÓÐÚ ÒØ × ¸ Ò ØÖ Ñ ÒØÓ Ð ÒØ                   ÓÑ Ò ÓÒ ×
ÔÓ× Ð ×        Ø×¸ Ù× ÑÓ× ÙÒ Ó Ó ÔÖ ¬ Ó¸ Ò Ð × ÒØ Ó Ð ¬Ò ÓÒ º                ¾¾ ×     Ö¸ ÕÙ
Ò Ò ÙÒ × Ù Ò si ÐÓÒ ØÙ i × ÔÖ ¬                     Ð ÙÒ ÓØÖ        Ö ÒÐ        ×ÙÔ Ö ÓÖº Ë
 × Ó ÑÓ× Ô ÖÑÙØ ÓÒ × × Ù Ò × ÔÖ ¬ ׸ ÒØÓÒ × ÔÓ ÑÓ׸ × Ò ÔÖÓ Ð Ñ Ð ÙÒÓ¸
  ר Ò Ù ÖÐ × ÒØ ÖÔÖ Ø ÖÐ × Ò ÙÒ Ø ÜØÓº Å × ÙÒ¸ ÔÓ ÑÓ× ÙØ Ð Þ Ö × Ù Ò ×                     ¸
Ð × Ù Ð ×¸ ÓÑÓ ÓÖÓÐ Ö Ó Ð × ÔÖÓÔÓ× ÓÒ × º Ý º½¼¸ ×ÓÒ ÔÖ ¬ ׺
    À Ý ÙÒ Ñ ÓÖ ÙÒ Ñ × ×Ù ×Ø Ò Ð Ò Ù× Ö ÙÒ Ó ¬ ÓÒ ÔÖ ¬ ÔÓ ÑÓ× Ñ ¹
Ô Ö Ò O(1)¸ Ò Ð Ò ÓÒ Ð Ð ØÙÖ Ð Ø ÜØÓ¸ ×Ù Ó ¬ ÓÒº È Ö ÐÐÓ¸ Ù× ÑÓ× ÙÒ
 Ö ÓÐ Ò Ö Ó ÙÝ × Ó × Ó ¬ Ò ÐÓ× × Ñ ÓÐÓ× Sº ÈÓÖ ÑÔÐÓ¸ Ô Ö S = { , a, e, i, b, c}¸
 Ù ÐÕÙ Ö Ö ÓÐ Ò Ö Ó 6 Ó × Ó ¬ S Ò Ð Ó ÙÖÖ Ò ¸ Ð Ö ÓÐ × Ù ÒØ
 ¾½
      À ÕÙ ÙÒ Ó Ø Þ ÓÒ ÙÒ          ÓÒ ÕÙ Ò Ð Ñ ØÓ ÙÑ ÒÓ × ÑÙÝ ×Ù Ø Ú º
 ¾¾
       Ò Ð × ÓÒ Ü º º¼º ´Ô Ò ¿¾½µ × Ù× ÖÓÒ ÐÓ× × Ñ ÓÐÓ× a ÔÓÖ 0 Ý b ÔÓÖ 1 º
4.13. C´digos de Huffman
           o                                                                               365




                              b    c                               Ë Ñ ÓÐÓ       Ó     Ó
                                                                                 000
                                                                                 001
              a      e   i
                                        ÖÖÓ       Ð × Ù ÒØ Ñ Ô Ó                 010
                                                                                 011
                                                                                  10
                                                                                  11


         Ð ÔÖÓÔÓ× ØÓ  ר × ÓÒ × ÔÖ × ÒØ Ö Ñ Ò ×ÑÓ× Ô Ö      Ó ¬ Ö× ÙÒ ×
      Ø× Ù× Ò Ó Ö ÓÐ × Ó Ó× Ý Ô Ö ÓÒרÖÙ Ö ×ØÓ× ÙÐØ ÑÓ× ÓÔØ Ñ Ñ ÒØ º

    4.13.1        Un TAD para ´rboles de c´digo
                              a           o
      Ò Ð ÓÒØ ÜØÓ Ð Ó ¬ ÓÒ × ÑÔÖ ÔÓ ÑÓ× ×Ø Ò Ù Ö Ó× ÒØ × ÙÒÓ Ó ¬ ÓÖ¸
    ÕÙ ØÓÑ ÙÒ Ø ÜØÓ Ý ÐÓ ÓÑÔÖ Ñ ¸ Ý ÓØÖÓ Ó ¬ ÓÖ ÕÙ ØÓÑ Ð Ø ÜØÓ ÓÑÔÖ Ñ Ó Ý
    ÐÓ Ó ¬ Ð × Ù Ò ÓÖ Ò Ðº
        È Ö Ó ¬ Ö Ù× Ö ÑÓ× Ð × Ù ÒØ Ð ×
¿      Ð × Ó ¬ ÓÖ ¿ ≡
      class Huffman_Encoder_Engine
      {
           Ñ Ñ ÖÓ× ÔÖ Ú Ó×      Ó ¬ ÓÖ ¿
           Ñ Ñ ÖÓ× ÔÙ Ð Ó×      Ó ¬ ÓÖ ¿
      };
         ר   Ð× × Ò Ö          ÓÒרÖÙ Ö ÙÒ Ö ÓÐ ÔÖ ¬ Ó× ÓÔØ ÑÓ Ý Ó ¬ Ö Ø ÜØÓ× Ò
     ÙÒ ÓÒ    Ð Ö ÓÐ ÒØ Ö ÓÖº ÈÓÖ ÓÔØ ÑÓ ÔÖ Ø Ò ÑÓ× Ö ÕÙ ÙÒ Ø ÜØÓ Ó ¬ Ó ÓÒ ÐÓ×
    ÔÖ ¬ Ó×   Ð Ö ÓÐ ÓÔØ ÑÓ Ó ÙÔ Ð Ñ ÒÓ× ×Ô Ó ÔÓ× Ð º
       ÈÖ       Ó ¬ Ö Ù× Ö ÑÓ× Ð × Ù ÒØ Ð ×
¿     Ð×      Ó ¬ ÓÖ ¿ ≡
      class Huffman_Decoder_Engine
      {
           Ñ Ñ ÖÓ× ÔÖ Ú Ó×        Ó ¬ ÓÖ ¿
           Ñ Ñ ÖÓ× ÔÙ Ð Ó×        Ó ¬ ÓÖ ¿
      };
       Ä × Ð × × Ý ÓØÖ × ¬Ò ÓÒ × × Ò Ù ÒØÖ Ò Ò Ð Ö ÚÓ ÀÙ«Ñ ÒºÀ ´Ò Ú Ö ¬Ò µ º
        Ó ¬ Ö Ý Ó ¬ Ö ÙÒ × Ù Ò Ö ÕÙ Ö             Ú Ö × ×ØÖÙ ØÙÖ ×   ØÓ׺ Ä
    ÔÖ Ñ Ö     ÐÐ × × Ð ÔÖÓÔ Ó Ö ÓÐ Ó Ó׸ Ð Ù Ð × ¬Ò Ð × Ù ÒØ ÑÓ Ó
¿    Ñ Ñ ÖÓ× ÔÖ Ú Ó× Ó ¬ ÓÖ ¿ ≡                         ´¿ µ ¿
      BinNode<string> * root;
    Í× × BinNode ¾ ¼ º
¿   Ñ Ñ ÖÓ× ÔÖ Ú Ó×          Ó ¬     ÓÖ ¿     ≡                        ´¿    µ
      BinNode<string> * root;
    Í× × BinNode ¾ ¼ º
366                                                              Cap´        ´
                                                                        ıtulo 4. Arboles



    root    ׸ Ò Ñ × Ð × ×¸ Ð Ö Þ ÙÒ Ö ÓÐ ÔÖ ¬ Ó׺ ÈÓר Ö ÓÖÑ ÒØ ¸ Ø ÐÐ Ö ÑÓ×
    ÙÒ Ð ÓÖ ØÑÓ Ô Ö ÓÒרÖÙ Ö ×Ø Ö ÓÐ Ñ Ò Ö ÓÔØ Ñ ´Ü º½¿º¿ ´Ô Ò ¿ µµº Ð
    Ñ ×ÑÓ ÑÓ Ó¸ Ø Ñ Ò ÔÐ ÒØ Ö ÑÓ× ÙÒ Ö Ø Ö Ó         ¬ Ò Ý ÑÓ×ØÖ Ö ÑÓ× ×Ù ÓÔØ ¹
    Ñ ÓÒ ´Ü º½¿º ´Ô Ò ¿ ¿µµº Ò Ð ÒØ Ö Ò¸ Ý ÕÙ × Ò Ð Ö ÕÙ Ð Ö ÓÐ ÙÝ Ö Þ
     × root ÓÒØ Ò        Ò × ´stringµ Ý ÒÓ × Ñ ÓÐÓ× Ë ÁÁº Ä Ö ÞÓÒ × ÕÙ ¸ Ò ÐÙ Ö
    × Ñ ÓÐÓ× ÔÙÒØÙ Ð ×¸ ÔÙ     ר Ð Ö× Ð ÙÒ Ö Ù Ò          Ô Ö ÓÒ Ö × × ÒØ Ö × Ý
     Ó ¬ Ö× ÒØ Ö Ñ ÒØ Ò ÙÒ × Ù Ò               Ø×º
        Æ × Ø ÑÓ× ÙÒ Ø Ð           × Ñ ÓÐÓ× Ò Ð Ù Ð ÐÑ Ò ÑÓ× ×Ù× Ö Ù Ò ×
     Ô Ö ÓÒ Ý ÕÙ ÒÓ× Ô ÖÑ Ø ÓÒרÖÙ Ö ÙÒ Ö ÓÐ ÔÖ ¬ Ó׺ Ð Ø ÔÓ            ר Ø Ð ×
      ¬Ò ×
¿        Ð Ö ÓÒ × ÀÙ«Ñ Ò ¿ ≡                                      ¿
      class Huffman_Node;
      typedef DynMapTree<Treap_Vtl, string, Huffman_Node *> Symbol_Map;
        Ä Ø Ð Ñ Ô × Ñ ÓÐÓ× Ø ÔÓ string ÒÓ Ó× ÙÒ Ô ÕÙ Ù× Ö ÑÓ× Ô Ö
      Ø ÖÑ Ò Ö ÓÔØ Ñ Ñ ÒØ ÐÓ× ÔÖ ¬ Ó׺ Ð Ô Ö Ñ ØÖÓ Treap Vtl × ÙÒ Ð × ×Ô Ð
     Ö ÓÐ Ò Ö Ó       Ù×ÕÙ ÐÐ Ñ Ó ÌÖ Ô¸ Ð Ù Ð × Ö ØÖ Ø Ó Ò Ü º¿ ´Ô Ò      µº Ë
    Ø Ò ÑÓ× Ð ÙÒ ¬ ÙÐØ Ò ÔØ Ö Ð Ø ÔÓ Treap Vtl¸ ÒØÓÒ × ÔÓ ÑÓ× ÙØ Ð Þ Ö¸ ÓÒ Ð
    Ñ ×Ñ ÒØ Ö Þ Ý¸ ÔÖÓ Ð Ñ ÒØ ÓÒ × ÑÔ ÒÓ × Ñ Ð Ö¸ Ð Ø ÔÓ BinTreeVtl ÔÖ Ú Ñ ÒØ
     ×ØÙ Ó Ò Ü º º¾ ´Ô Ò ¿¿ µº
        ÈÓÖ Ö ÞÓÒ × ÕÙ ÜÔÐ Ö ÑÓ× ÔÖÓÒØ Ñ ÒØ ¸ ÙÒ Ö ÓÐ ÔÖ ¬ Ó× × ÓÒרÖÙÝ Ô ÖØ Ö
       ÙÒ Ô Ð Ù Ð ×Ù× ÒÓ Ó× ×ÓÒ Ø ÔÓ Huffman Node Ý × ¬Ò Ò Ð × Ù ÒØ ÓÖÑ
¿        Ð Ö ÓÒ × ÀÙ«Ñ Ò ¿ +≡                               ¿    ¿
      typedef BinNode< Aleph::pair<string, size_t> > Freq_Node;
      struct Huffman_Node : public BinHeap<size_t>::Node
      {
        BinNode<string> * bin_node;
      };
    Í× × BinNode ¾ ¼ º
         ÖÓ××Ó ÑÓ Ó¸ Huffman Node × ÙÒ ÒÓ Ó Ò Ö Ó ÙÒ Ô ÙÝ Ð Ú ¸          ѹ
       ÒØ get key()¸ × Ð Ö Ù Ò         Ô Ö ÓÒ Ó ×Ø ר  ÙÒ × Ñ ÓÐÓº Ð ÒÓ Ó Ò
     Ù ×Ø ÓÒ ÓÒØ Ò ÙÒ ÔÙÒØ ÓÖ ÙÒ ÒÓ Ó ÒØÖÓ Ð Ö ÓÐ ÔÖ ¬ Ó׺
         Ð Ø ÔÓ      Ô × ¬Ò Ð × Ù ÒØ Ñ Ò Ö
¿       Ð Ö ÓÒ × ÀÙ«Ñ Ò ¿ +≡                          ¿     ¿
      typedef BinHeap<size_t> Huffman_Heap;
     Ò ÙÒ ÓÒ ×Ø Ø ÔÓ¸ ¬Ò ÑÓ× Ð × × Ù ÒØ × ÙÒ ÓÒ × ÙÜ Ð Ö ×
¿      Ð Ö ÓÒ × ÀÙ«Ñ Ò ¿ +≡                            ¿               ¿
      static inline const size_t & get_freq(Huffman_Node * huffman_node)
      static inline void increase_freq(Huffman_Node * huffman_node)
      static inline void set_freq(Huffman_Node * huffman_node, const size_t & freq)
       ÓÖ ÔÓ ÑÓ× ¬Ò Ö Ð Ô ÒØÖÓ Ð Ó ¬                   ÓÖ Ý ×Ù Ø Ð         × Ñ ÓÐÓ×
¿   Ñ Ñ ÖÓ× ÔÖ Ú Ó× Ó ¬ ÓÖ ¿ +≡                          ´¿   µ ¿      ¿
      Huffman_Heap heap;
      Symbol_Map   symbol_map;
       ÈÓÖ ÑÔÐÓ¸         symbol map["a"].get key()   Ö ØÓÖÒ Ð     Ö ÙÒ           ×Ó    Ð
    × Ñ ÓÐÓ "a"º
4.13. C´digos de Huffman
           o                                                                     367



       Ä ÙÐØ Ñ ×ØÖÙ ØÙÖ              ØÓ× × Ð Ø Ð   Ó Ó׸ Ð Ù Ð Ö ÕÙ Ö Ð     ¬Ò ÓÒ Ð
    × Ù ÒØ Ø ÔÓ
¿       Ð Ö ÓÒ × ÀÙ«Ñ Ò ¿           +≡                                  ¿
      typedef DynMapTree<Treap_Vtl, string, BitArray> Code_Map;
    Í× × BitArray ¿ º
¿   Ñ Ñ ÖÓ× ÔÖ Ú Ó×         Ó ¬ ÓÖ ¿       +≡            ´¿   µ ¿   ¿
      Code_Map code_map;

        ר Ø Ð × ÙØ Ð Þ Ô Ö Ó ¬ Ö ÙÒ Ø ÜØÓº Ä           × Ð Ö × Ù Ò ÐÑ ÒØ Ð Ø ÜØÓ
    Ý Ò ÓÒØÖ Ö Ò Ð Ø Ð       Ó Ó× Ð ÓÖÖ ×ÔÓÒ ÒØ Ó Ó            ØÓ×    Ò Ö Ö Ð Ø ÜØÓ
     Ó ¬ Óº Ð Ù Ð ÕÙ ÓÒ Ð Ø Ð             × Ñ ÓÐÓ׸ Ð    Ó Ó× × ÑÔÐ Ñ ÒØ ÓÒ ÙÒ
    ÌÖ Ô ´Ü º¿ ´Ô Ò      µµº
       À Ý ÓØÖÓ× ØÖ ÙØÓ×      ÓÒ Ð × ÕÙ Ù× Ö ÑÓ× Ò Ð Ð × Huffman Encoder Engine
¿    Ñ Ñ ÖÓ× ÔÖ Ú Ó× Ó ¬ ÓÖ ¿ +≡                       ´¿ µ ¿      ¿
      string end_symbol;
      size_t text_len;
       end symbol¸
                 ÕÙ Ø Ñ Ò × ÙØ Ð Þ Ò Huffman Decoder Engine¸ × ÙÒ × Ñ ÓÐÓ ×Ô ¹
       Ð ÕÙ ÒÓØ Ð ¬Ò Ð Þ ÓÒ ÙÒ Ø ÜØÓ ×Ù ¬Ò ÓÒ Ó ÝÙ             Ø ÖÑ Ò Ö Ù Ò Ó
     ÙÐÑ Ò ÙÒ × Ù Ò        Ø× ÓÖÖ ×ÔÓÒ ÒØ ÙÒ Ø ÜØÓ Ó ¬ Óº text len Ò Ð
    ÐÓÒ ØÙ Ð Ø ÜØÓ × Ò Ó ¬ Öº

    4.13.2    Decodificaci´n
                         o
     Ð ØÓ ÕÙ ¸ Ó Ø Ú Ñ ÒØ ¸ ÑÓ× ÒÓÑ Ò Ó ÒØ ÖÔÖ Ø Ö ¸ ÐÓ ÔÓ ÑÓ× ÒÓØ Ö ÓÑÓ
        Ó ¬ Öº       ר ÑÓ Ó¸ ×ÙÑ Ò Ó ÙÒ Ö Þ root ÙÒ Ö ÓÐ ÔÖ ¬ Ó× Ý ÙÒ
    ÔÙÒØ ÖÓ p¸ Ð × Ù ÒØ ÓÖÑ ¸ ÔÓ ÑÓ× Ó ¬ Ö ÙÒ × Ù Ò bit stream
    bit stream len Ø×¸ Ñ   ÒØ Ð × Ù ÒØ ÖÙØ Ò
¿    Ñ Ñ ÖÓ× ÔÙ Ð Ó×     Ó ¬ ÓÖ ¿ ≡                        ´¿ µ
      void decode(BitArray & bit_stream, const size_t & bit_stream_len, ostream & output)
      {
        BinNode<string> * p = root;
        for (int i = 0; i < bit_stream_len; ++i)
          {
             if (bit_stream.read_bit(i) == 0)
               p = LLINK(p);
             else
               p = RLINK(p);
            if (is_leaf(p)) // ¿es hoja?
              {     // s´ ==> escribir sm´bolo y reiniciar a ra´z
                        ı                ı                     ı
                const string & symbol = p->get_key();
                if (symbol == end_symbol) // ¿se alcanza final?
                  break;
                output << symbol;
                p = root;
              }
          }
      }
    Í× × BinNode ¾ ¼ Ò   BitArray   ¿ º
368                                                                 Cap´        ´
                                                                           ıtulo 4. Arboles



    Ä         × Ô ÖØ Ö × Ð Ö Þ Ð Ö ÓРݸ × ÙÒ Ð Ú ÐÓÖ         Ø Ð Ó¸ × Ò Ö      Ð
     ÞÕÙ Ö Ó Ö            ר Ô Ö Ö Ò Ð ÙÒ Ó ¾¿ º Ò × ÒØÓÒ ×¸ Ð ÔÖ ¬ Ó Ð Ó ×
     ÓÖÖ ×ÔÓÒ ÓÒ ÙÒ × Ñ ÓÐÓº
          × Ô٠׸ Ô Ö    Ó ¬ Ö ÙÒ × Ù Ò         Ø×¸ Ð Ù×Ù Ö Ó      Òר Ò Ö ÙÒ Ó ØÓ
        Ø ÔÓ Huffman Decoder Engine¸ ÙÝÓ ÓÒרÖÙ ØÓÖ Ö      Ð Ö Þ Ð Ö ÓÐ Ó Ó Ý Ð
    × Ñ ÓÐÓ ÓÒ× Ö Ó ÓÑÓ ¬Ò Ð ÒØÖ º ÄÙ Ó¸ × ÒÚÓ Ð Ñ ØÓ Ó decode()¸ Ð Ù Ð
     ÖÖÓ ×Ù × Ð Ð Ô Ö Ñ ØÖÓ outputº ÓÒÓ Ó Ð Ö Óи Ð ÔÖÓ ×Ó              Ó ¬ ÓÒ ×
    Ö Ð Ø Ú Ñ ÒØ × Ò ÐÐÓº

    4.13.3       Algoritmo de Huffman
         Ó ÙÒ ÓÒ ÙÒØÓ n × Ñ ÓÐÓ׸ ÕÙ Ö ÑÓ× ÓÒרÖÙ Ö ÙÒ Ö ÓÐ Ó Ó× Ü Ø Ñ ÒØ n
      Ó ×º À Ò Ó ×ØÖ ÓÒ ÕÙ ×Ø × Ó × ÙÒ Ò ÒÓ Ó× ÜØ ÖÒÓ׸ ÒØÓÒ ×¸ ÔÓÖ Ð
    ÔÖÓÔÓ× ÓÒ º¾¸ Ù ÐÕÙ Ö Ö ÓÐ n− 1+ n = 2n− 1 ÒÓ Ó׸ ÓÒ Ù ÐÕÙ Ö Ô ÖÑÙØ ÓÒ
    × Ñ ÓÐÓ× ÓÑÓ Ó × ÓÒר ØÙÝ ÙÒ Ö ÓÐ Ó Ó׺ ÈÓÖ Ð ÔÖÓÔÓ× ÓÒ º½½¸ × ÑÓ× ÕÙ
     Ü ×Ø Ò C2n−1 = 2n 2(2n−1)
                     1
                         2n−1     Ö ÒØ × Ö ÓÐ × Ó Óº ËÙÖ Ò¸ ÒØÓÒ ×¸ Ð × ÔÖ ÙÒØ ×
       Ù Ð × Ó Ö ÓÑÓ ÓÒרÖÙ ÖÐÓ
        ÀÙ«Ñ Ò        × Ù Ö Ó ÙÒ Ñ ØÓ Ó Ô Ö ÓÒרÖÙ Ö ÙÒ Ö ÓÐ ÔÖ ¬ Ó× Ð Ù Ð Ô ÖØ
    ÙÒ ÓÒ ÙÒØÓ Ò Ó ÓÒ ÐÓ× × Ñ ÓÐÓ× Ý ×Ù× Ö Ù Ò × Ô Ö ÓÒº × Ö¸ ÙÒ ÓÒ ÙÒØÓ
        ÒÓ Ó× Ð Ø ÔÓ Huffman Node Ý × Ö ØÓº ÄÐ Ñ ÑÓ× ×Ø ÓÒ ÙÒØÓ heap¸ Ð Ù Ð ×
     ÑÔÐ ÒØ Ñ ÒØ ÙÒ Ôº
        È Ö ÓÒרÖÙ Ö ÙÒ ÒÙ ÚÓ ÒÓ Ó huffman node¸ ÔÖ Ñ ÖÓ Ý ÕÙ × Ð ÓÒ Ö ÐÓ× Ó× ÒÓ Ó×
     ÓÒ Ñ ÒÓÖ × Ö Ù Ò × Ð × Ù ÒØ ÓÖÑ
¿    × Ð ÓÒ Ö ÐÓ× Ó× ÒÓ Ó× Ñ ÒÓÖ Ö Ù Ò ¿ ≡                        ´¿ µ
      Huffman_Node * l_huffman_node =                 // nodo izquierdo
        static_cast <Huffman_Node *> (heap.getMin());
      Huffman_Node * r_huffman_node =                 // nodo derecho
        static_cast <Huffman_Node *> (heap.getMin());
        ÓÒ ×ØÓ× Ó× ÒÓ Ó׸ × ÓÒרÖÙÝ ÙÒ ×Ù ¹ Ö ÓÐ               ÀÙ«Ñ Ò       Ð × Ù ÒØ ÓÖÑ
¿     Ö Ö ÙÒ ÒÙ ÚÓ ÒÓ Ó ÀÙ«Ñ Ò ¿ ≡                                           ´¿    µ
      BinNode <string> * bin_node = new BinNode <string>;
      Huffman_Node * huffman_node = new Huffman_Node (bin_node);
      LLINK(bin_node) = l_huffman_node->bin_node;
      RLINK(bin_node) = r_huffman_node->bin_node;
      const size_t new_freq = get_freq(l_huffman_node) + get_freq(r_huffman_node);
      Aleph::set_freq(huffman_node, new_freq);
    Í× × BinNode ¾ ¼ º
       Ð ÒÙ ÚÓ ÒÓ Ó × ÓÒרÖÙÝ ÓÑÓ Ô Ö ÐÓ× Ó× Ñ ÒÓÖ × ÓÒØ Ò Ó× Ò Ð Ôº ×
    ÑÔÓÖØ ÒØ ר Ö ÕÙ Ð ÒÙ ÚÓ ×Ù ¹ Ö ÓÐ × Ø ÔÓ BinNode<string>¸ ÕÙ × Ð Ø ÔÓ
     Ð Ö ÓÐ ÀÙ«Ñ Ò Ý ÒÓ Ø ÔÓ Huffman Nodeº
      Ä Ñ Ò Ö ¬Ò Ø Ú Ô Ö ÓÒרÖÙ Ö ÙÒ Ö ÓÐ ÔÖ ¬ Ó× × Ö Ð Þ ×
¿   Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ó ¬ ÓÖ ¿ ≡                      ´¿ µ ¿ ¼
      BinNode<string> * generate_huffman_tree(
                                              )
      {
        while (heap.size() > 1)
      ¾¿
           ÆÓØ ÑÓ× ÕÙ ÙÒ ÔÖ ¬ Ó Ù Ö   Ö Ñ Ñ Ö ÒÞ ÓÒ Ð ÒÙÑ ÖÓ      ÛÝ    Ð    Ó º
4.13. C´digos de Huffman
           o                                                                                                                                                                                     369



            {
                     × Ð ÓÒ Ö ÐÓ× Ó× ÒÓ Ó× Ñ ÒÓÖ Ö Ù Ò                                                             ¿
                      Ö Ö ÙÒ ÒÙ ÚÓ ÒÓ Ó ÀÙ«Ñ Ò ¿
              delete l_huffman_node;
              delete r_huffman_node;
              heap.insert(huffman_node);
            } // Al salir del while, queda en el heap un solo nodo que contiene
              // la ra´z del arbol de prefijos
                      ı      ´

           Huffman_Node * huffman_root = static_cast <Huffman_Node *> (heap.getMin());
           root = huffman_root->bin_node;
           delete huffman_root;
           build_encoding_map(); // construir mapeo de c´digos
                                                        o
           return root;
      }
    Í× × BinNode ¾ ¼ º




                                                                        10                                                                    10                    17



       4     6            7    10       15   16                     4        6        7     10       15        16                     4            6            7        10     15       16

      i      c        b        e             a            =⇒    i            c        b     e                  a            =⇒        i            c        b            e               a

                                                                                                                                                                     58



                              25                                                      25              33                                                   25                  33



                     10            15   16           17                      10            15    16            17                             10                15        16            17

                                        a                                                        a                                                                        a

                 4        6                      7        10             4        6                        7        10                    4            6                            7        10

      =⇒     i            b                  b            e    =⇒       i         b                        b           e        =⇒    i            b                                b        e




       ÙÖ º ¾ ÓÒרÖÙ ÓÒ                                        ÙÒ Ö ÓÐ                      ÀÙ«Ñ Òº Ä × Ö                                     ×             ÐÓ× ×Ù ¹ Ö ÓÐ × ×
     Ò Ù ÒØÖ Ò Ò Ð Ôº
       ÍÒ Ú Þ ÕÙ × Ò Ö Ð Ö ÓÐ ÀÙ«Ñ Ò¸                                                                             ÑÓ׸   ØÓ×   Ó ¬ Ö¸ ¹
    ÒÖÖ Ð ÑÔÓ         × Ñ ÓÐÓ× Ó Ó× ÔÖ ¬ Ó׺                                                                    ר Ø Ö Ð Ö Ð Þ Ð ÔÖ Ñ Ø Ú
    build prefix encoding()¸ Ð Ù Ð × ÒרÖÙÑ ÒØ                                                                 Ð × Ù ÒØ ÓÖÑ
¿    Ñ Ñ ÖÓ× ÔÖ Ú Ó× Ó ¬ ÓÖ ¿ +≡                                                                                           ´¿        µ ¿                   ¿¼
      void build_prefix_encoding(BinNode<string> * root, BitArray & array, const size_t & len)
      {
        if (is_leaf(root))
          {
            string & str = root->get_key();
            code_map.insert(str, BitArray(array, len));
            return;
          }
        array[len] = 0; // ir hacia la izquierda
370                                                               Cap´        ´
                                                                          ıtulo 4. Arboles



           build_prefix_encoding(LLINK(root), array, len + 1);
           array[len] = 1; // ir hacia la derecha
           build_prefix_encoding(RLINK(root), array, len + 1);
       }
     Í× × BinNode ¾ ¼ Ò    BitArray   ¿ º
        Ä ÖÙØ Ò × ÓÖÖ ×ÔÓÒ ÓÒ ÙÒ Ö ÓÖÖ Ó ÔÖ ¬ Ó¸ Ö ÙÖ× ÚÓ¸ Ð Ö ÓÐ ÀÙ«Ñ Ò ÓÒ
     Ö Þ rootº Ñ         ÕÙ × Ú Ö ÓÖÖ Ò Ó¸ Ð ÔÖ ¬ Ó root¾ × Ú Ñ ÒØ Ò Ò Ó Ò Ð
      ÖÖ ÐÓ     Ø× array Ý ×Ù ÐÓÒ ØÙ × Ñ ÒØ Ò Ò Ð Ô Ö Ñ ØÖÓ lenº Ù Ò Ó × Ð ÒÞ
     ÙÒ Ó ¸ × Ö¸ Ù Ò Ó Ý Ø Ò ÑÓ× Ð ÔÖ ¬ Ó ÓÑÔÐ ØÓ Ð × Ñ ÓÐÓ¸ Ò× ÖØ ÑÓ× Ò Ð
     Ñ Ô Ó code map Ð ÙÔÐ <× Ñ ÓÐÓ¸ array>º
        build prefix encoding() × Ø Ú     ÔÓÖ Ð × Ù ÒØ ÔÖ Ñ Ø Ú
¿¼    Ñ Ñ ÖÓ× ÔÖ Ú Ó× Ó ¬ ÓÖ ¿ +≡                     ´¿ µ ¿ ¿ ½
       void build_encoding_map()
       {
         const size_t h = computeHeightRec(root);
         BitArray array(h * symbol_map.size());
         symbol_map.empty();
         build_prefix_encoding(root, array, 0);
       }
     Í× × BitArray ¿   Ò   computeHeightRec   ¾   º
          Ð ÓÖ Ò Ñ Ò ÔÙÐ ÓÒ Ð Ð × Huffman Encoder Engine × ÓÑÓ × Ù
       ½º ¬Ò Ö × Ñ ÓÐÓ× ÓÒ ×Ù× Ö Ù Ò ×º
       ¾º Ò Ö Ö Ö ÓÐ ÔÖ ¬ Ó׺
       ¿º Ó ¬ Ö Ø ÜØÓ׺
      Ò ×Ø × ÓÒ ÑÓ× Ö Ð Þ Ó Ð × ÙÒ × º Ä ÔÖ Ñ Ö × Ö ÜÔÐ        Ò Ð × Ù ÒØ
     ×Ù ¹× ÓÒ¸ Ñ ÒØÖ × ÕÙ Ð Ø Ö Ö × Ö ÜÔÐ   Ò Ü º½¿º º
     4.13.4      Definici´n de s´
                        o      ımbolos y frecuencias
       ÒØ ×    ÓÒרÖÙ Ö Ð Ö ÓÐ ÔÖ ¬ Ó× × ÙÒ Ð Ð ÓÖ ØÑÓ ÒØ Ö ÓÖ¸      ÑÓ× Ò Ö ÐÓ×
     × Ñ ÓÐÓ× Ý ×Ù× Ö ×Ô Ø Ú × Ö Ù Ò ×º À Ý Ó× Ñ Ò Ö ×      ÖÐÓº Ä ÔÖ Ñ Ö ÓÒ× ×Ø
      Ò ×Ô ¬ Ö Ö Ø Ñ ÒØ Ð × Ñ ÓÐÓ Ý ×Ù ÓÖÖ ×ÔÓÒ ÒØ Ö Ù Ò ¸ ÐÓ Ù Ð ×
     Ñ ÒØ set freq(str, freq) ÓÒ str × Ð × Ñ ÓÐÓ           ¬Ò Ö Ý freq ×Ù Ö Ù Ò
      ×Ó     º Ð Ñ ØÓ Ó Ò Ù ×Ø ÓÒ × ×Ô ¬ ÓÑÓ × Ù
¿¼    Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ó ¬ ÓÖ ¿ +≡                      ´¿ µ ¿     ¿¼
       void set_freq(const string & str, const size_t & freq)
        Ä ÓØÖ ÓÖÑ      Ò Ö Ö Ù Ò × × Ô ÖØ Ö ÙÒ Ø ÜØÓ¸ ÒØ ¬ Ö ×Ù× × Ñ ÓÐÓ×
     Ý ÓÒØ Ð Þ Ö ×Ù× Ö Ù Ò ×    Ô Ö ÓÒº ×ØÓ ×   Ñ ÒØ read input(input)¸
      ÓÒ input × Ð Ø ÜØÓ Ô ÖØ Ö Ð Ù Ð × × ÓÒØ Ð Þ Ö Ð × Ö Ù Ò ×
¿¼    Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ó ¬ ÓÖ ¿ +≡             ´¿ µ ¿ ¼ ¿ ½
       void read_input(char * input
                       )
      ¾
           Î Ð Ð Ô Ò Ö ÓÖ Ö ÕÙ ×Ø ÔÖ ¬ Ó × ÙÒ Ô Ð Ö      ´Ú ×    Ü   º º¼º ´Ô Ò ¿¾ µµº
4.13. C´digos de Huffman
            o                                                                     371



        read input() ×Ù Ý  ×Ó Ö Ð ÖÙØ Ò update freq(curr token)¸ Ð Ù Ð × Ö Ñ Ø
      Ù× Ö curr token Ò Ð Ñ Ô Ó × Ñ ÓÐÓ׸ Ö Ö ÙÒ ÒÙ Ú ÒØÖ × ÒÓ ×Ø Ñ Ô Ó¸
     Ò Ö Ñ ÒØ Ö Ò ÙÒÓ Ð Ö Ù Ò Ý ØÙ Ð Þ Ö Ð Ô
¿½   Ñ Ñ ÖÓ× ÔÖ Ú Ó× Ó ¬ ÓÖ ¿ +≡                     ´¿ µ ¿ ¼ ¿ ¾
       void update_freq(const string & str)
       {
         Huffman_Node * huffman_node      = NULL;
         Huffman_Node ** huffman_node_ptr = symbol_map.test(str);
         if (huffman_node_ptr == NULL) // ¿Fue definido previamente el s´mbolo?
                                                                        ı
           { // No ==> crear una entrada en symbol_map e insertarlo en heap
             auto_ptr<BinNode<string> > bin_node_auto ( new BinNode<string> (str) );
             huffman_node = static_cast<Huffman_Node*>
               (heap.insert(new Huffman_Node(bin_node_auto.get())));
             symbol_map.insert(str, huffman_node);
             bin_node_auto.release();
           }
         else
           huffman_node = *huffman_node_ptr; // Ya definido, recuperarlo
         increase_freq(huffman_node);
         heap.update(huffman_node);
       }
     Í× × BinNode ¾ ¼ º
         ÈÙ ×ØÓ ÕÙ Ð ¬Ò ÐÓ× Ñ ØÓ Ó× read input() × Ñ Ö Ö Ð × Ö Ù Ò × Ý ÓÒרÖÙ Ö Ð
      ÒØÖ ¸ רÓ× ÙÐÑ Ò Ò ÓÒ Ð Ò Ö ÓÒ Ð Ö ÓÐ Ó Ó×
¿½       Ò Ö Ö Ö ÓÐ ¿ ½ ≡
       set_end_of_stream("");
       generate_huffman_tree(with_freqs);


     4.13.5     Codificaci´n de texto
                         o
     ÍÒ Ú Þ ÓÒרÖÙ Ó ÙÒ Ö ÓÐ ÀÙ«Ñ Ò¸ ÔÓ ÑÓ× Ó ¬ Ö Ð Ø ÜØÓ Ñ ÒØ Ù ÐÕÙ Ö
        ÐÓ× Ñ ØÓ Ó× encode(input, bit stream)º input × Ð Ø ÜØÓ Ó ¬ Ö Ý bit stream
      × ÙÒ BitArray Ð Ø ÔÓ ¬Ò Ó Ò Ü ¾º½º¿ ´Ô Ò ¿ µ
¿½   Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ó ¬ ÓÖ ¿ +≡                              ´¿ µ ¿ ¼
       size_t encode(char * input, BitArray & bit_stream)
       {
         char * curr_stream = input;
         char curr_token[Max_Token_Size];
         curr_token[1] = ’0’;
         size_t bit_stream_len = 0;
         while (*curr_stream != ’0’)
           {
             curr_token[0] = *curr_stream++;
             append_code(bit_stream, bit_stream_len, code_map[curr_token]);
           }
         append_code(bit_stream, bit_stream_len, code_map[""]);
         return bit_stream_len;
       }
     Í× × BitArray ¿ º
372                                                                                                                                                Cap´        ´
                                                                                                                                                                                        ıtulo 4. Arboles



                                       Ð × ÙÒ Ó Ô Ö Ñ ØÖÓ encode() × Ð ÖÖ ÐÓ       Ø× ÕÙ ÓÒØ Ò Ð Ø ÜØÓ Ó ¬ Óº
                                   Ð ÔÖÓ ×Ó¸ ÙÒ Ú Þ Ò Ö Ó Ð Ñ Ô Ó ÓÒ ÐÓ× ÔÖ ¬ Ó׸ × ÑÙÝ × Ò ÐÐÓ Ù× Ö Ð × Ñ ÓÐÓ
                                  Ð Ó Ò Ð Ñ Ô Ó Ý ÓÒ Ø Ò Ö Ð ÖÖ ÐÓ       Ø× Ð ÔÖ ¬ Óº Ì Ð Ø Ö Ð Ö Ð Þ Ð ÔÖ Ñ Ø Ú
                                  ÔÖ Ú append code()¸ Ð Ù Ð × ÒרÖÙÑ ÒØ Ð × Ù ÒØ ÑÓ Ó
                  ¿¾               Ñ Ñ ÖÓ× ÔÖ Ú Ó× Ó ¬ ÓÖ ¿ +≡                             ´¿ µ ¿ ½
                                      static void append_code(BitArray & bit_stream, size_t & bit_stream_len,
                                                              const BitArray & symbol_code)
                                      {
                                        const size_t symbol_code_size = symbol_code.size();
                                        if (bit_stream_len + symbol_code_size > bit_stream.size())
                                          bit_stream.resize(5 * (bit_stream_len + symbol_code_size) / 4);
                                        for (int i = 0; i < symbol_code_size; i++)
                                          bit_stream[bit_stream_len++] = symbol_code[i];
                                      }
                                  Í× × BitArray ¿ º
                                           Ð × Ù ÒØ Ø ÜØÓ
                                               ÅÙ ÖØ                  ÒØÓÒ ØÓ    Ð       Ñ ÓÖ Ó                                                     Å × Ù ØÖÓ ÔÖ ÑÓ× À Ö        ×
                                                  Ö Ó             Ö      ÄÓÖ                                                                           Ó×        Ò Ñ º
                                                                                                                                                    ÄÓ ÕÙ Ò ÓØÖÓ× ÒÓ ÒÚ           Ò¸
                                                                                                                                                    Ý ÐÓ ÒÚ          Ò ÒѺ
                                               ÎÓ ×       ÑÙ ÖØ ×ÓÒ ÖÓÒ                                                                                Ô ØÓ× ÓÐÓÖ ÓÖ ÒØÓ¸
                                                 Ö      Ð Ù      ÐÕÙ Ú Öº                                                                           Ñ     ÐÐÓÒ ×     Ñ Ö¬Ð¸
                                               ÎÓ × ÒØ Ù × ÕÙ          Ö Ò                                                                          Ý ×Ø ÙØ × Ñ × Ó
                                               ÚÓÞ      Ð Ú Ð Ú ÖÓÒ Ðº                                                                                ÓÒ     ØÙÒ Ý ÞÑ Òº
                                               Ä × Ð ÚÓ ×Ó Ö Ð × ÓØ ×                                                                                  Ý ÒØÓÒ ØÓ Ð       Ñ ÓÖ Ó¸
                                               ÑÓÖ × Ó×            к                                                                                   ÒÓ      ÙÒ    ÑÔ Ö ØÖ Þ
                                                 Ò Ð ÐÙ            × ÐØÓ×                                                                              Ù Ö Ø       Ð ÎÖ Ò
                                                   ÓÒ Ó×         Ð Òº                                                                               ÔÓÖÕÙ Ø Ú × ÑÓÖ Öº
                                                  ÒÓ ÓÒ × Ò Ö Ò Ñ                                                                                      Ý       Ö Ó     Ö ¸
                                               ×Ù ÓÖ Ø        ÖÑ × ¸                                                                                ÐÐ Ñ     Ð     Ù Ö      ÚÐ
                                               Ô ÖÓ Ö Ò Ù ØÖÓ ÔÙÒ Ð ×                                                                                   Ñ Ø ÐÐ ×        ÕÙ Ö Ó
                                               Ý ØÙÚÓ ÕÙ ×Ù ÙÑ Öº                                                                                     ÓÑÓ Ò          Ñ Þº
                                                 Ù Ò Ó Ð × ×ØÖ ÐÐ × Ð Ú Ò
                                               Ö ÓÒ × Ð Ù Ö ×¸
                                                Ù Ò Ó ÐÓ× Ö Ð × ×Ù Ò Ò                                                                              ÌÖ × ÓÐÔ ×       × Ò Ö ØÙÚÓ
                                               Ú ÖÓÒ ×         Ри                                                                                 Ý × ÑÙÖ Ó       Ô Ö¬Ðº
                                               ÚÓ ×      ÑÙ ÖØ ×ÓÒ ÖÓÒ                                                                              Î Ú ÑÓÒ        ÕÙ ÒÙÒ
                                                 Ö      Ð Ù      ÐÕÙ Ú Öº                                                                           × ÚÓÐÚ Ö      Ö Ô Ø Öº
                                                                                                                                                    ÍÒ Ò Ð Ñ Ö Ó×Ó ÔÓÒ
                                                                                                                                                    ×Ù      Þ Ò ÙÒ Ó Òº
                                                ÒØÓÒ Ó ÌÓÖÖ × À Ö      ¸                                                                            ÇØÖÓ×     ÖÙ ÓÖ Ò× Ó¸
                                                  Ñ ÓÖ Ó     ÙÖ Ö Ò¸                                                                                  Ò Ò ÖÓÒ ÙÒ Ò Ðº
                                               ÑÓÖ ÒÓ    Ú Ö ÐÙÒ ¸                                                                                       Ù Ò Ó ÐÓ× Ù ØÖÓ ÔÖ ÑÓ×
                                               ÚÓÞ    Ð Ú Ð Ú ÖÓÒ Ð                                                                                 ÐÐ Ò        Ò Ñ ¸
                                                ÕÙ Ò Ø      ÕÙ Ø Ó Ð Ú                                                                              ÚÓ ×      ÑÙ ÖØ      × ÖÓÒ
                                                 Ö    Ð Ù      ÐÕÙ Ú Ö                                                                                 Ö     Ð Ù      ÐÕÙ Ú Öº

                                          Ö ÕÙ Ö             10368               ÝØ × Ò Ë ÁÁ Ý Ò Ö Ð × Ù ÒØ Ö ÓÐ                                                                    ÀÙ«Ñ Ò
                                                                                                                 1296

       511                                                                                                                                                                                                       785

 243                                                       268                                                          356                                                                                                                             429

119 124                                              125                                                       143    175     181                                                                                            206                                    223
 e a
             60                                        65        66                                              77         87                                        94                                               101         105                        110         113
                                                       n                                                         r          o
          29      31                                         33        33                                                                45                                              49                        49 52 52              53               55 55 56 57
          m                                                  t                                                                                                                                                     u d c                                  l s i n
               15      16                                         16                          17                                    22             23                               24        25                                     26       27
               b                                                  .                                                                                                                                                                  v
                     8                           8                                   8                 9                         11 11        11        12                     12    12 12         13                                     13       14
                    j                                                                                                            g p                                                 q ´ı                                                 ,
                                      4           4                          4            4        4       5                               5 6 6              6            6     6              6        7                                      7 7
                                                 V                                                                                        C h z                                 A              n
                                                                                                                                                                                               ~                                               y G
                              2            2                             2       2    2 2 2 2 2 3                                                         3       3     3 3                          3       4
                                                                        Y            e
                                                                                     ´ F ! T M ´o                                                        B             E f                          L
                          1       1     1 1                                   1 1                                                                              1 2                                        2 2
                         ?             U :                                   D ¿                                                                              Z H                                        ¡ ´a
                               0 1
                              ¬ O
4.13. C´digos de Huffman
       o                                                                        373



    Ð Ù Ð ÐÓ ÓÑÔÖ Ñ     5932   ÝØ ׺

4.13.6   Optimaci´n de Huffman
                 o
Ë ÙÒ ºÊº º º¸ ÓÔØ Ñ ÓÒ × Ò ¬               ÓÒ Ý ØÓ ÓÔØ Ñ Ö º Ð Ú Ö Ó ÓÔØ ¹
Ñ Ö ¹Ù ÓÔØ Ñ Þ Ö ¹ ÓÒÒÓØ ¸ ºÊº º º Ü Ø¸ Ù× Ö Ð Ñ ÓÖ Ñ Ò Ö            Ö Ð Þ Ö ÙÒ
   ØÚ      º ÓÖ Ò¸ Ò Ð ×ØÖ ØÓ × ÒØ Ó ÙÒ Ú Ö× Ð ¸ Ü ×Ø ÙÒ Ñ ÓÖ Ñ Ò Ö
    Ö Ð Þ Ö ÙÒ Ø Ú      º Ê ×ÔÓÒ Ö ¬ÖÑ Ø Ú Ñ ÒØ Ý Ö Ù ÒØ ×Ó Ö Ð ×ÙÔÙ ×Ø
Ñ ÓÖ Ñ Ò Ö × ÑÙÝ Ð Óº Ë Ô Ö ÙÒ ÖØÓ ×ÙÒØÓ ×ÙÑ ÑÓ× Ý ÑÓ×ØÖ ÑÓ× ÙÒ ÓÔØ ¹
Ñ ÓÒ¸ ÒØÓÒ ×¸ Ò Ð ×ÙÒØÓ Ò Ù ×Ø ÓÒ¸ Ñ × Ö Ö × Ö ÑÓ× Ñ ÓÖ ÖÐÓ Ô Ö ÕÙ ×
 Ð ÓÔØ ÑÓ Ý × Ð Ñ ÓÖ º ÄÓ ÕÙ × Ñ ÓÖ × Ö Ð Ø ÚÓ Ð × Ö ÙÒר Ò ×¸ Ý ×Ø × Ø Ò Ò
 Ð ÑÓÑ ÒØÓ¸ Ð ÐÙ Ö¸ Ô ÖÓ¸ ×Ó Ö ØÓ Ó¸ ÕÙ Ò ×º ×ÙÑ Ö ÓÔØ Ñ ÓÒ × Ò ÓÒ× Ö ÓÒ
  Ö ÙÒר Ò Ð ÓÒÐÐ Ú Ô Ð ÖÓ Ô Ö Ð × Ô ÖØ × Ð ÓÒØ ÜØÓ ÕÙ ÒÓ Ù ÖÓÒ ×ÓÔ × ×º
    ÉÙ Þ ÙÒ Ù ÖØ Ú Ò ÙÐØÙÖ Ð Ð × Ò ÕÙ Ñ ÒÙ Ó ÓÒÐÐ Ú ÙÒ ÓÔØ ¹
Ñ ÓÒ × Ò Ù ÒØÖ Ò ×Ù Ö Þ Ø ÑÓÐÓ º Ò Ð Ø Ò ÓÔØ ÑÓ× ÓÒÒÓØ                       Ö ×¹
ØÓ Ö Ø Ó ¸ Ô ÖØ Ò ÒØ ÐÓ× ÓÔØ Ñ Ø × ¸ ÕÙ Ò × Ö Ò ÐÓ× Ñ Ñ ÖÓ× Ð × Ò Ó ÖÓ¹
Ñ ÒÓ¸ ÐÓ× ÔÖ ÙÖ×ÓÖ × ÐÓ× ÓÐ Ö × ÒÙ ×ØÖ ÔÓ º Ì Ð Ô Ö ÕÙ Ò Ð ÒØ Ù
ÊÓÑ ÐÓ× ÕÙ ÓÞ Ò ÔÐ ÒÓ× Ö Ó׸ ÕÙ Ò × Ø Ò Ñ ÝÓÖ Ô                          Ð ÓÒ¸
Ó × ¸ optaban ´ ÓÔØ ØÙ× µ¸ Ö Ò ÐÓ× ÒÓ Ð ×º
    Ê Ð Þ Ð Ð Ö ØÓÖ ÒØ Ö ÓÖ¸ ÔÓ ÑÓ× ÔÖ ÙÒØ ÖÒÓ× × ÙÒ Ö ÓÐ ÀÙ«Ñ Ò
ÓÔØ ÑÓ È Ö ÓÒ ÖÓÒØ Ö Ð ÔÖ ÙÒØ ¸         ÑÓ× ÔÐ ÒØ ÖÒÓ× ÙÒ Ö Ø Ö Ó ÕÙ ÒÓ× ÔÓÒ Ö
 Ð Óר ÙÒ × Ñ ÓÐÓ Ò ÙÒ ÓÒ ×Ù Ö Ù Ò               Ô Ö ÓÒ Ý ÕÙ ÒÓ× ÓÒ ÙÞ ÙÒ
 ÓÖÑ Ò Ö Ð Ý ÙÒ          × Ù Ö Ö Ð Ñ ÓÖ Ö ÓÐ Ó Ó׺
Definici´n 4.12 (Longitud ponderada del camino) Ë ÙÒ Ö
       o                                                          ÓÐ Ò Ö Ó T Ò Ð Ù Ð
       Ó ne ∈ T × Ð × Ò ÙÒ Óר Ó ÔÓÒ Ö ÓÒ w(ne)º                   ÒØÓÒ ×¸ Ð ÐÓÒ ØÙ
ÔÓÒ Ö      Ð Ñ ÒÓ¸ ÒÓØ      ÓÑÓ ÛÔÐ(T )¸ × ¬Ò ÓÑÓ
                        ÛÔÐ(T ) =            Ò Ú Ð(ne) × w(ne)                 ´º µ
                                    ne × Ó

   È Ö Ð Ö ÓÐ     Ð ¬ ÙÖ º ¿¹ Ø Ò ÑÓ×
                 ÛÔÐ(T ) = 2 × (7 + 6) + 3 × (15 + 16 + 10 + 4) = 161
     Ù ÒØÓ Ñ ÒÓÖ ÐØÙÖ Ø Ò ÙÒ Ó ¸ Ñ ÒÓÖ × ×Ù Ò Ò ×Ó Ö Ð ÛÔк Ä           ×
 ÓÒרÖÙ Ö ÙÒ Ö ÓÐ Ó Ó× ÙÝÓ ÛÔÐ(T ) × Ñ Ò ÑÓ ×Ø × Ð Ö Ø Ö Ó ÓÔØ Ñ ÓÒº Ì Ð
 Ö ÓÐ × ÒÓÑ Ò        ÀÙ«Ñ Ò ¸ Ò ÓÒÓÖ ×Ù × Ù Ö ÓÖ¸ ÕÙ Ò × Ù Ö Ó Ð × Ù ÒØ
ÔÖÓÔÓ× ÓÒ
Proposici´n 4.13 (Optimaci´n de Huffman - Huffman [8] 1951) Ë N = {n1, n2, . . . , nn}
          o               o
ÙÒ ÓÒ ÙÒØÓ ÒÓ Ó× ÓÒ Ô ×Ó× w(n1), w(n2), . . . , w(nn)º Ë T ÙÒ Ö ÓÐ ÔÖ ¬ Ó ÓÒ¹
רÖÙ Ó × ÙÒ Ð Ð ÓÖ ØÑÓ ÀÙ«Ñ Ò ´Ü º½¿º¿ ´Ô Ò ¿ µµº ÒØÓÒ ×¸ ∀T = T =⇒
ÛÔÐ(T ) ≤ ÛÔÐ(T )º
    ÄÓ ÒØ Ö ÓÖ ÕÙ Ú Ð    Ö ÕÙ Ð Ö ÓÐ ÔÖ ¬ Ó× T × Ñ Ò ÑÓ × ÙÒ ×Ù ÐÓÒ ØÙ
ÔÓÒ Ö       Ð Ñ ÒÓº
374                                                                            Cap´        ´
                                                                                  ıtulo 4. Arboles




                                                                                          13

                                          7     6
                                          b     c
            15     16       10     4                       15      16     10      4
                   a        e      i                               a      e       i
                                                    =⇒
                 ´ µ Ö ÓÐ        Ó Ó× ÒØ Ö ÓÖ               ´ µ ÒØ Ö ÓÖ × Ò Ó × Ý


                                   ÙÖ º ¿       Ö ÓÐ × ÔÖ ¬ Ó×     ÑÔÐÓ

Demostraci´n
          o       Ä ÔÖÙ            × ÓÒרÖÙ Ö ÔÓÖ Ò Ù ÓÒ ×Ó Ö Ð                 Ö ÒÐ             T   Ý×
ÚÐ Ö      Ð × Ù ÒØ Ð Ñ
Lema 4.5 Ë T ÙÒ Ö ÓÐ ÓÒ Ô ×Ó× Ò ×Ù× Ó ×º Ë Ò n1 Ý n2 Ð × Ó× Ó × T ÓÒ Ô ×Ó
Ñ Ò ÑÓº ÓÒ× Ö ÑÓ× ÙÒ Ö ÓÐ T Ø Ð ÕÙ ×Ø ÓÒØ Ò Ð × Ñ ×Ñ × Ó × ÕÙ T Ü ÔØÓ
ÕÙ Ð × Ó × n1 Ý n2 × ×Ù ×Ø ØÙÝ Ò ÔÓÖ ÙÒ Ó n+ ÓÒ w(n+) = w(n1) + w(n2)º
 ÒØÓÒ ×¸ × ÔÓ× Ð ÓÒרÖÙ Ö ÙÒ Ö ÓÐ T Ø Ð ÕÙ ¾
                                       ÛÔÐ(T ) ≤ ÛÔÐ(T ) − w(n+)                                  ´º µ
ÈÓÖ ÑÔÐÓ¸ Ð ¬ ÙÖ º ¿¹ ÐÙ×ØÖ ÙÒ T ÔÓ× Ð Ò Ð Ù Ð × Ð ×ÙÔÖ Ñ Ò Ð × Ó × b Ý
cº Ò ×Ø     ×Ó¸ wpl(T ) = 13 + 3 × (15 + 16 + 10 + 4) = 148
Demostraci´n À Ý ØÖ × ÔÓ× Ð × × ØÙ ÓÒ ×
            o                                    ÓÒ× Ö Ö Ô Ö n1, n2 ∈ T
  ½º n1 Ý n2 ×ÓÒ ÖÑ ÒÓ× Ò ×Ø ×Ó¸ ÐÓ× ×ÙÔÖ Ñ ÑÓ× Ý ÓÐÓ ÑÓ× Ò ×Ù Ô Ö n3¸
     ÕÙ Ú Ò Ò Ó ¸ w(n3) = w(n1) + w(n2)º Ò ×Ø Ö Óи n3 ר Ò ÙÒ Ò Ú Ð
      Ò Ö ÓÖ i − 1¸ ÔÓÖ ÐÓ ÕÙ
       ÛÔÐ(T ) = ÛÔÐ(T ) − i×(w(n1)+w(n2)) + (i−1)×(w(n1)+w(n2)) = ÛÔÐ(T )−(w(n1) + w(n2))
                                                                                                      w(n3 )

         Ð Ù Ð ¬ Ö Ü Ø Ñ ÒØ ÛÔÐ(T ) Ò w(n3)º
     ¾º n1 Ý n2 ר Ò Ò Ð Ñ ×ÑÓ Ò Ú Ð ×ÙÑ ÑÓ× s1 ÓÑÓ Ð ÖÑ ÒÓ n1 ´ Ð ×Ó ×
        × Ñ ØÖ Ó ÓÒ n2µº ÒØÓÒ ×¸ ÔÓ ÑÓ× ÒØ Ö Ñ Ö s1 ÓÒ n2 Ý × Ô Ö Ö Ò Ð
          ×Ó ÒØ Ö ÓÖº
     ¿º n1 Ý n2 ר Ò Ò Ò Ú Ð × ×Ø ÒØÓ× Ð Ù Ð ÕÙ Ò Ð ÔÙÒØÓ ÒØ Ö ÓÖ¸ ×ÙÑ ÑÓ× s1
         ÓÑÓ Ð ÖÑ ÒÓ n1º Ð Ñ ×ÑÓ ÑÓ Ó¸ ×ÙÑ ÑÓ× ÕÙ Ò Ú Ð(n1) > Ò Ú Ð(n2)º
        ÈÓ ÑÓ× Ô ØÓÖ Þ Ö ×Ø × ØÙ ÓÒ Ð × Ù ÒØ ÑÓ Ó
 ¾
      × × Ò Ð ×Ø Ò Ù Ö Ð ÓÒ ÓÒ ÔÓ× Ð              Ò Ð ÒÙÒ Ó Ð Ð Ñ ×                   Ö¸ ÔÙ    Ò ÓÒØÖ Ö×
ÙÒ     ×ÔÓ× ÓÒ ØÓÔÓÐÓ    ÓÒ ÐÓ× ÒÓ Ó× Ö ×Ø ÒØ × ÕÙ × Ø × Ð × ÙÐ º
4.13. C´digos de Huffman
       o                                                                                     375




                               n2                                                           s1

              p                                                           p

      s1          n1                                          n2              n1




                                     ÒØ Ö Ñ       ÑÓ×
                                                   =⇒
                                    n2   ÓÒ s 1



       ÓÒ× Ö ÑÓ× Ð Ò       Ò        ÕÙ Ø Ò Ð ×Ù Ö ÓÐ               s1   ×Ó Ö ÛÔÐ(T )¸ Ð Ù Ð ÔÙ
      ÜÔÖ × Ö× ×
                           σ(s1) =                      w(nx) × Ò Ú Ð (nx)
                                      ∀nx ∈ Ó (s1 )

      Ù Ò Ó Ö Ð Þ ÑÓ× Ð ÒØ Ö Ñ Ó ÒØÖ s1 Ý n2¸ Ð Ú ÐÓÖ                      σ(s1)   ×Ñ ÒÙÝ   σ(s1)¸
     ÔÙ × Ò Ú Ð(s1) = Ò Ú Ð(n1) Ò T º ÈÓÖ Ø ÒØÓ
              ÛÔÐ(T ) = ÛÔÐ(T ) + Ò Ú Ð(n1) × w(n2) − σ(s1) + σ(s1) ≤ ÛÔÐ(T )
      Ð ×Ó Ò ÕÙ ×ÓÒ Ù Ð × × Ù Ò Ó s1 × ÙÒ Ó º
        ÓÖ ¸ Ù Ò Ó ØÙ ÑÓ× Ð Ù× ÓÒ n1 Ý n2 Ò n+¸ Ö Ö × ÑÓ× Ð × ØÙ ÓÒ Ð
     ÔÖ Ñ Ö ×Ó
     ÛÔÐ(T ) = ÛÔÐ(T )+(Ò Ú Ð(n1)−1)×(w(n1)+w(s))−σ(s1)+σ(s1 ) ≤ ÛÔÐ(T )−w(n+)
      Ð ×Ó Ù Ò Ó Ò Ú Ð(n1) < Ò Ú Ð(n2) × × Ñ ØÖ Ó
    ר Ð Ñ × Ð ÙÒ Ñ ÒØÓ ÑÓ×ØÖ Ø ÚÓ ÕÙ ÒÓ× Ô ÖÑ Ø Ö Ú Ò Ö ÕÙ Ô Ö Ù ÐÕÙ Ö
Ö ÓÐ T ≤ T =⇒ ÛÔÐ(T ) ≤ ÛÔÐ(T )º
   Ê ØÓÑ ÑÓ× Ð ÑÓ×ØÖ ÓÒ Ð ÔÖÓÔÓ× ÓÒ Ý ÔÐ ÒØ ÑÓ× Ò Ù ÓÒ ×Ó Ö Ð Ö ¹
ÒÐ       Ð Ö ÓÐ ÀÙ«Ñ Ò T
  ½º È Ö |T | ≤ 2 Ð Ö ×ÙÐØ Ó × Ö ØÓº
  ¾º ÓÖ ×ÙÑ ÑÓ× ÕÙ Ð ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö ØÓ Ó Ö ÓÐ ÀÙ«Ñ Ò Ý Ú Ö ¹
     ¬ÕÙ ÑÓ× ×Ù Ú Ö        Ô Ö Tn+1 × Ö ∀Tn+1 = Tn+1 =⇒ ÛÔÐ(Tn+1) < ÛÔÐ(Tn+1)º
     Ë Ò n1 Ý n2 Ð × Ó× ÔÖ Ñ Ö × Ó × ÕÙ × Ð ÓÒ Ð Ð ÓÖ ØÑÓ ÀÙ«Ñ Òº ÓÖ
      ÓÒ× Ö ÑÓ× ÔÐ Ö Ð Ð Ñ º Tn+1 Ý Tn+1 ÓÒ ÐÓ× ÒÓ Ó× n1 Ý n2 Ý ÔÖÓ Ù Ö Ó×
      Ö ÓÐ × Tn Ý Tnº
     ÈÙ ×ØÓ ÕÙ n1 Ý n2 ×ÓÒ ÐÓ× ÒÓ Ó× ÓÒ Ñ ÒÓ× Ô ×Ó¸ רÓ× ×ÓÒ ÖÑ ÒÓ× Ò Ð Ö ÓÐ
        ÀÙ«Ñ Òº ÈÓÖ Ø ÒØÓ ÛÔÐ(Tn) = ÛÔÐ(Tn+1) − w(n1) − w(n2)¾ º
 ¾
     ×ØÓ × Ú Ò Ó Ò Ð ÔÖ Ñ Ö Ô ÖØ         Ð    ÑÓ×ØÖ ÓÒ       ÐÐ Ñ º º
376                                                                Cap´        ´
                                                                      ıtulo 4. Arboles



      È Ö Ð Ö ÓÐ Tn × ÑÓ׸ × ÙÒ Ð Ð Ñ º ¸ ÕÙ ÛÔÐ(Tn) ≤ ÛÔÐ(Tn+1) − (w(n1) +
      w(n2))º   ÓÖ Ò¸ ÙÒÕÙ ÕÙ Þ Ô Ö Þ Ó Ú Ó¸ |Tn| = |Tn| < |Tn+1| = |Tn+1|º ÈÓÖ
      Ø ÒØÓ¸ ÔÓ ÑÓ× ÔÐ Ö Ð ÔÓØ × × Ò Ù Ø Ú Ô Ö ÓÒ ÐÙ Ö ÕÙ ÛÔÐ(Tn) ≤ ÛÔÐ(Tn)

4.13.6.1    Conclusi´n
                    o

Ê Ô ØÙÐ ÑÓ× Ð Ù×Ó Ð Ð ÓÖ ØÑÓ ÀÙ«Ñ Ò Ñ ÒØ Ð Ó× Ð × × ÕÙ                  ÑÓ×
ÔÖ × ÒØ Öº Ð ÒØ Ó ¬ ÓÖ × Ú Ð ÙÒ Òר Ò            Huffman Encoder Engine¸ Ñ Ò¹
ØÖ × ÕÙ Ð Ó ¬ ÓÖ ×Ù ÓÒØÖ Ô ÖØ            Huffman Decoder Engineº Ç Ú Ñ ÒØ ¸
 Ñ × Òר Ò ×        Ò ÔÓÒ Ö×    Ù Ö Ó Ò Ù× Ö Ð Ñ ×ÑÓ Ö ÓÐ ÀÙ«Ñ Òº Ë Ò Ñ¹
   Ö Ó¸ ÕÙ Ô Ö ÙÒ Ø ÐÐ ÒØ Ö × ÒØ Ô Ö Ó ¬ Ö Ó Ó ¬ Ö Ð Ø ÜØÓ ÒÓ
  ÐØ Ð Ö ÓÐ ÀÙ«Ñ Òº ×ØÓ × Ú ÒØ Ò Ð Ó ¬ ÓÖ¸ Ô٠׸ ר × Ö Ñ Ø Ð Ö ÐÓ×
× Ñ ÓÐÓ× Ð Ø ÜØÓ Ý¸ ØÖ Ú × Ð Ñ Ô Ó Ó Ó׸ Ñ Ø Ö ÐÓ× ÓÖÖ ×ÔÓÒ ÒØ × ÔÖ ¬ Ó׺
È ÖÓ¸ ÓÑÓ Ö Ð Ó ¬ ÓÖ Ä Ö ×ÔÙ ×Ø ר                 ÔÓÖ Ð Ø ÓÖ    ÔÖ ¬ Ó× ÑÔ Ö¹
Ø Ò Ü º º¼º ´Ô Ò ¿¾½µº Ò ØÓ¸ ÙÒ Ø ÜØÓ Ó ¬ Ó × ÙÒ × Ù Ò                 ÔÐ Ö×
         ´Ü º º¼º ´Ô Ò ¿¾ µµ¸ Р٠и ÓÑÓ ÓÖÓÐ Ö Ó Ð ÔÖÓÔÓ× ÓÒ Ü º ´Ô Ò
¿¾¾µ¸ × ÔÖ ¬ Óº ×ØÓ ÑÔÐ ÕÙ ¸        ÙÒ × Ù Ò       ÔÖ ¬ Ó׸ ÔÓ ÑÓ× Ö ÓÒÓ ÖÐÓ×
 ÒØÖ × º Ä Ø Ò Ò Ù ×Ø ÓÒ × Ð            Ö Óº

4.14       ´
           Arboles est´ticos optimos
                      a      ´
ÄÓ× Ö ÓÐ × Ò Ö Ó× ×ÓÒ × Ò Ó× Ô Ö ÑÙÐ Ö Ð Ù×ÕÙ           Ò Ö º ËÙ ÓÒ ÔÖ Ò Ô Ð
 × ÕÙ Ô ÖÑ Ø Ò Ò× Ö ÓÒ × Ý ×ÙÔÖ × ÓÒ × Ò O(Ð (n))º ÓÖ Ò¸ × Ð ÓÒ ÙÒØÓ Ð Ú ×
 Ù × ×Ø Ø Ó × Ö¸ ÒÓ Ó ÙÖÖ Ò× Ö ÓÒ × Ò ×ÙÔÖ × ÓÒ ×¸ ׸ ÔÓÖ ÑÔÐÓ¸ ÙÒ Ö ÓÐ
  Ò Ö Ó ÐØÙÖ Ñ Ò Ñ ¬ ÒØ
      ÓÒ× Ö ÑÓ× ×ÔÓÒ Ö Ð × Ð Ú × Ò ÙÒ ÖÖ ÐÓ ÓÖ Ò Ó Ý ØÙ Ö Ð Ù×ÕÙ           ÒÖ º
  ÓÒ ×Ø Ò ÓÕÙ ¸ Ø Ò ÑÓ× ÙÒ Ö ÓÐ ÐÓÒ ØÙ            Ñ ÒÓ Ñ Ò ÑÓº     Ñ ×¸ ÓÖÖ ÑÓ×
 ×Ô Ó¸ ÔÙ × ÒÓ Ö ÕÙ Ö ÑÓ× ÙØ Ð Þ Ö ÔÙÒØ ÖÓ׺ ÓÑÓ ÔÙÒØÓ ¬Ò и    ÑÓ× Ö Ñ Ö Ö ÕÙ
 Ð ÖÖ ÐÓ ÔÖÓÚ      ÐÓ×     × Ð ÓÑÔÙØ ÓÖº
    Ä Ù×ÕÙ       Ò Ö ×ÙÑ ÕÙ Ð Ö Ù Ò                  ×Ó × ÕÙ Ø Ø Ú Ô Ö ØÓ × Ð ×
 Ð Ú × Ý ×ØÓ ÒÓ × ÖØÓ Ò Ð ÙÒÓ× ×Ó׺ Ð ÙÒ × Ð Ú × ×           Ò Ñ × ÕÙ ÓØÖ ×º À Ý
× ØÙ ÓÒ × Ò ÕÙ Ð Ö Ù Ò ×Ø ר                  ×Ó ÔÙ ÓÒÓ Ö× ÒØ × ÓÒרÖÙ Ö Ð
 Ö Óк Ò ×ØÓ× ×Ó׸ ÙÒ Ö Ø Ö Ó ÓÔØ Ñ Ð          ÓÒ× ×Ø Ò Ñ Ò Ñ Þ Ö Ð ÒØ      ØÓØ Ð
 ×Ô Ö        Ù×Õ٠׺ ÁÒØÙ Ø Ú Ñ ÒØ ¸ ר Ñ Ò Ñ Þ ÓÒ × ÐÓ Ö ÓÐÓ Ò Ó ÐÓ× ÒÓ Ó×
    ×Ó Ñ × Ö Ù ÒØ Ö ÒÓ× Ð Ö Þº Ð ÓÒ ÔØÓ ÕÙ ÒÓ× Ô ÖÑ Ø Ö Ò ÓÒØÖ Ö Ö ÓÐ ×
ÓÔØ ÑÓ× ×Ù Ý Ò Ð ¬Ò ÓÒ × Ù ÒØ
Definici´n 4.13 (Longitud del camino interna ponderada) Ë
        o                                                             ÙÒ Ö ÓÐ T n
ÒÓ Ó׺ Ë P = {pi | pi × Ð Ô ×Ó Ð ÒÓ Ó ni ∈ T | ∀i pi = 1}º            ÒØÓÒ ×¸ Ð ÄÓÒ ¹
ØÙ     Ð Ñ ÒÓ ÒØ ÖÒ ÔÓÒ Ö      ×     ¬Ò ÓÑÓ
                                    n
                         Ci(T ) =         (Ò Ú Ð (ni) + 1)pi                     ´º µ
                                    i=1
                                     n
                                          Ò Ú Ð(ni) pi   +     1
                                    i=1
´
4.14. Arboles est´ticos ´ptimos
                 a      o                                                                             377



                              z     x                                x                          z

                      y                   y                y                   z       x

                 x                              z     x        z           y                y
                     ´µ                 ´ µ               ´µ              ´µ               ´µ

                          ÙÖ º            Ö ÓÐ × Ò Ö Ó×            Ù×ÕÙ            ØÖ × ÒÓ Ó×

        Ó ÙÒ ÓÒ ÙÒØÓ n Ð Ú × ÓÒ ×Ù× ÔÖÓ Ð             ×      ×Ó¸ Ð ÔÖÓ Ð Ñ ÓÒ× ×Ø
  Ò Ò ÓÒØÖ Ö ÙÒ Ö ÓÐ n ÒÓ Ó× ÙÝÓ Ci × Ñ Ò ÑÓº            Ó ÓØÖÓ ÑÓ Ó¸ ٠и ÒØÖ
ØÓ Ó× ÐÓ× ÔÓ× Ð × Ö ÓÐ × n Ð Ú ×¸ Ø Ò Ð Ci Ñ Ò ÑÓ ÓÑÓ ÑÔÐÓ¸ ÓÒ× Ö ÑÓ×
  Ð ÓÒ ÙÒØÓ ÒÓ Ó× {X, Y, Z} ÓÒ Ô ×Ó× {1/9, 3/9, 5/9}º Ë ÙÒ Ð ÔÖÓÔÓ× ÓÒ º½½ Ü ×Ø Ò
4 3 = 5 Ñ Ò Ö ×       ×ÔÓÒ Ö ØÖ × ÒÓ Ó× Ò ÙÒ Ö ÓÐ Ò Ö Ó        Ù×ÕÙ ¸ Ð × Ù Ð × ×
1 6

 ÐÙ×ØÖ Ò Ò Ð ¬ ÙÖ º º Ä × ÐÓÒ ØÙ ×          Ñ ÒÓ ÔÓÒ Ö × Ô Ö           Ö ÓÐ ×ÓÒ
                                          (a)       1   3 5  14
                                        Ci       = 3 +2 + =
                                                    9   9 9  9
                                          (b)       1   3  5  21
                                        Ci       = 1 +2 +3 =
                                                    9   9  9   9
                                          (c)       1 3   5  15
                                        Ci       = 2 + +2 =
                                                    9 9   9  9
                                          (d)      1   3  5  20
                                        Ci       =   +3 +2 =
                                                   9   9  9  9
                                          (e)       1   3 5  16
                                        Ci       = 2 +3 + =
                                                    9   9 9  9
  ×ØÓ ÖÖÓ Ð Ö ÓÐ ´ µ ÓÑÓ Ð ÓÔØ ÑÓ Ö ×ÙÐØ Ó ×ÓÖÔÖ Ò ÒØ Ý Ö Ú Ð ÓÖ ÕÙ ÐÓ
ÓÔØ ÑÓ ÒÓ Ò × Ö Ñ ÒØ × ÐÓ ØÖ ÓÒ ÐÑ ÒØ Ù ÒÓ¸ Ô٠׸ Ò ÒÙ ×ØÖÓ ÑÔÐÓ¸ Ð Ö ÓÐ
ÓÔØ ÑÓ × Ð Ñ × × ÕÙ Ð Ö Ó × ÙÒ ÐÓ× Ö Ø Ö Ó× ØÖ ÓÒ Ð ×º
     Ð ÑÔÐÓ ÒØ Ö ÓÖ ÒÓ× ÙÒ             Ö   Ð × ÓÑÔÐ      × Ò Ö ÒØ × ÙÒ Ð Ó¹
Ö ØÑÓº ÈÓ Ö ÑÓ× Ò Ö Ö ØÓ Ó× ÐÓ× Ö ÓÐ ×   Ù×ÕÙ ÔÓ× Ð × ÓÒ n Ð Ú × Ý ÒØÓÒ ×
Ñ Ö Ð × ÐÓÒ ØÙ ×       Ñ ÒÓ ÔÓÒ Ö × Ô Ö × Ð ÓÒ Ö Ð Ñ ÒÓÖº Ç Ú Ñ ÒØ ¸ ר
Ø Ò × ÑÙÝ ÓרÓ× Ò Ø ÑÔÓ Ý ×Ô Óº
     Ð ÔÖ Ñ Ö Ô ×Ó   Ð ÓÒ× Ù ÓÒ ÙÒ Ð ÓÖ ØÑÓ × ÔÖ Ò Ö ÕÙ × ÙÒ Ö ÓÐ ×
ÓÔØ ÑÓ¸ ÒØÓÒ × ×Ù× Ó× Ö Ñ × Ø Ñ Ò ÐÓ ×ÓÒº ÓÖÑ Ð Þ ÑÓ× ×Ø     Ó Ò Ð × Ù ÒØ
ÔÖÓÔÓ× ÓÒ
Proposici´n 4.14
           o              Ë       T ∈ B   ÙÒ Ö ÓÐ Ò Ö Ó              Ù×ÕÙ          ÓÔØ ÑÓº ÒØÓÒ ×¸ Ä(T ) Ý
Ê(T ) ×ÓÒ ÓÔØ ÑÓ׺
Demostraci´n ´ÈÓÖ ÓÒØÖ
              o                                 ÓÒµ Ë k1, k2, . . . , kl, . . . , kn Ð Ö ÓÖÖ Ó Ò¬ Ó ÙÒ
T ∈           Ò Ö Ð n ÒÓ Ó×                    ÓÒ Ö Þ Ò Ð Ú klº                 ר ÑÓ Ó¸ L(T ) ÓÒØ Ò Ð ×
 Ð Ú × {k1, k2, . . . , kl−1} Ý R(T )         Ð × Ð Ú × {kl+1, . . . , kn}º ÈÓ ÑÓ׸ ÒØÓÒ ×¸ × ÙÒ Ð
378                                                                                    Cap´        ´
                                                                                          ıtulo 4. Arboles



  ¬Ò ÓÒ º½¿¸ ÔÐ ÒØ Ö Ci Ò ÙÒ ÓÒ                      Ð Ö Þ kl¸ Ð × Ù ÒØ ÑÓ Ó¾
                                       l−1                             n
                   Ci(T ) = pl +             (Ò Ú Ð (ki) + 1)pi +             (Ò Ú Ð (ki) + 1)pi
                                       i=1                           i=l+1
                                                      l−1                               n
                           = pl + Ci(Ä(T )) +               pi + Ci(Ê(T )) +                   pi
                                                      i=1                              i=l+1
                                n
                           =         pi + Ci(Ä(T )) + Ci(Ê(T ))                                        ´º µ
                               i=1

ËÙÔÓÒ ÑÓ× ÕÙ Ð Ö ÓÐ ÓÔØ ÑÓ ÓÒØ Ò ÙÒ L(T ) Ó R(T ) ÕÙ ÒÓ × ÓÔØ ÑÓº Ò ×Ø
  ×Ó¸ × ÙÒ ´ º µ¸ Ci(T ) ÙÑ ÒØ Ö Ú ÐÓÖ¸ ÐÓ ÕÙ ÓÒØÖ  Ð ×ÙÔÓ× ÓÒ ÕÙ T ×
ÓÔØ ÑÓº Ä ÔÖÓÔÓ× ÓÒ ×¸ Ô٠׸ Ú Ö Ö
4.14.1       Objetivo del problema
     Ó ÙÒ ÖÖ ÐÓ ÓÖ Ò Ó K = [k1, k2, . . . , kn]                     n Ð Ú × Ý ÙÒ ÖÖ ÐÓ Ô Ö Ð ÐÓ
P = [p1, p2, . . . , pn]      ÔÖÓ Ð           ×            ×Ó¸ Ð ÔÖÓ Ð Ñ ÓÒ× ×Ø ¸ Ö ÙÖ× Ú Ñ ÒØ
    Ð Ò Ó¸ Ò Ø ÖÑ Ò Ö Ù Ð Ð Ú kl¸ ÒØÖ Ð × n ÔÓ× Ð ×¸                             ÓÐÓ Ö× ÓÑÓ Ö Þ Ð
 Ö ÓÐ ¬Ò Ð T º ÍÒ Ú Þ ÕÙ × Ö Ð ×Ø × Ð ÓÒ¸ Ð Ö ×ØÓ Ð × Ð Ú × ÕÙ Ö Ò Ò Ä(T )
Ý Ê(T ) ÕÙ ØÓØ ÐÑ ÒØ ¬Ò Ó¸ ÔÙ × ×Ø ×                           Ò × Ø × Ö Ð ÔÖÓÔ                  ÓÖ Ò
ÙÒ Ö ÓÐ Ò Ö Óº ÄÓ× ×Ù Ö ÓÐ × × ÓÒרÖÙ Ö Ò Ö ÙÖ× Ú Ñ ÒØ ÔÐ Ò Ó Ð Ñ ×ÑÓ ÔÖ Ò¹
  Ô Ó ×Ó Ö [k1, k2, . . . , kl−1] Ý [p1, p2, . . . , pl−1] Ô Ö Ä(T ) Ý [kl+1, . . . , kn] Ý [pl+1, . . . , pn]¸
Ô Ö Ê(T )º
      ×ØÓ ÒÓ× ÓÒ Ù            ÙÒ ¬Ò ÓÒ Ö ÙÖ× Ú Ð Ó×ØÓ × pi,j = j pl Ý Ci,j Ð               l=i
 Ó×ØÓ ØÓØ Ð Ð Ö ÓÐ Ò Ö Ó ÓÔØ ÑÓ ÓÑÔÙ ×ØÓ ÔÓÖ Ð × Ð Ú × ÕÙ Ú Ò × ki ר kjº
  ÒØÓÒ ×
                     j
          Ci,j = Ñ Ò                                                                                   ´ º ¼µ
                                                                                                1
                           pi,l−1(1 + Ci,l−1) +       pl         + pl+1,j(1 + Cl−1,j)
                    l=i                                                                        pi,j
                               Ö ÓÐ ÞÕÙ Ö Ó       kl ÓÑÓ Ö Þ           Ö ÓÐ    Ö   Ó

  Ð ÔÖÓ Ñ ÒØÓ × ÜÔÓÒ Ò Ð × ÐÓ ÔÐ ÑÓ× Ö Ø Ñ ÒØ º ÆÓ Ó ×Ø ÒØ ¸ ÐÓ× Ö ÓÐ ×
ÓÔØ ÑÓ×         Ò × Ø × Ö Ð ÔÖÓÔ           ÓÖ Ò Ý¸ Ò ×Ø × ÒØ Ó¸ Ü ×Ø Ò ÐÓ ×ÙÑÓ n(n+1)
                                                                                  2
     Ö ÒØ × Ñ Ò Ö ×       ×ØÖ Ù Ö Ð ÓÒ ÙÒØÓ K Ò ÙÒ Ö ÓÐ Ò Ö Óº ÈÓ ÑÓ׸ ÒØÓÒ ×¸
   × Ò Ö ÙÒ Ð ÓÖ ØÑÓ × Ò ÒØ ÕÙ ÓÑ Ò ÔÓÖ ÓÒרÖÙ Ö ØÓ Ó× ÐÓ× n−1 Ö ÓÐ × ÓÔØ ÑÓ×
    2 ÒÓ Ó׺      Ô ÖØ Ö ×Ø Ö ×ÙÐØ Ó¸ ÓÒרÖÙ ÑÓ× ÐÓ× n − 2 Ö ÓÐ × ÓÔØ ÑÓ× 3 ÒÓ Ó×
Ý × ×Ù × Ú Ñ ÒØ º
     ÄÓ× Óר × ÐÓ× ×Ù Ö ÓÐ × ÓÔØ ÑÓ× × ÐÑ Ò Ò Ò ÙÒ Ñ ØÖ Þ COST[] n × n¸ ÓÒ
        ÒØÖ COST(i,j) Ö ÔÖ × ÒØ Ð Ó×ØÓ Ð Ö ÓÐ ÓÔØ ÑÓ ÒØÖ i Ý jº Ð ÙÐ ÑÓ×
 Ø Ö Ø Ú Ñ ÒØ ר Ñ ØÖ Þ ÔÓÖ           ÓÒ Ð × ×Ø ÐÐ Ö Ð          ÓÒ Ð COST(1,n)¸ Ð Ù Ð
  ÓÒØ Ò Ð Ó×ØÓ ÓÔØ ÑÓ Ð Ö ÓÐ n ÒÓ Ó׺
       Ð Ð ÓÖ ØÑÓ ØÓÑ ÓÑÓ ÒØÖ           Ó× ÖÖ ÐÓ×       Ñ Ò× ÓÒ n¸ ÓÒ n Ö ÔÖ × ÒØ Ð
ÒÙÑ ÖÓ         Ð Ú ×º Ð ÔÖ Ñ ÖÓ ÐÓ ÐÐ Ñ ÑÓ× keys[] Ý ÓÒØ Ò Ð × Ð Ú ×º Ð × ÙÒ Ó ÐÓ
ÐÐ Ñ ÑÓ× [p] Ý ÓÒØ Ò Ð × Ö Ù Ò ×                 ×Ó Ô Ö       ÐÚº
  ¾
      Ê ÓÖ ÑÓ× ÕÙ ÙÒ Ò Ú Ð Ò L(T ) Ó R(T ) ר               × × Ó Ò ÙÒÓ Ö ×Ô ØÓ T º ÈÓÖ × Ö ÞÓÒ¸
  n
  i=l+1 (Ò Ú Ð(ki )pi ¸ Ò ÓÒ Ò Ú Ð(ki ) × Ö ¬ Ö             T¸ × Ci (L(T )) Ð Ö ÞÓÒ Ñ ÒØÓ × Ð Ñ ×ÑÓ
ÔÖ    Ci (R(T ))
´
    4.14. Arboles est´ticos ´ptimos
                     a      o                                                             379



         Ð Ð ÓÖ ØÑÓ Ö ÕÙ Ö ÓØÖ Ñ ØÖ Þ TREE[] ÕÙ ÐÑ Ò Ð × Ö              × ÐÓ× Ö ÓÐ × ÓÔØ ÑÓ׺
        Ó ÙÒ Ó×ØÓ ÓÔØ ÑÓ COST(i,j)¸ TREE(i,j) ÓÒØ Ò Ð Ò                  Ð Ö Þ Ð Ö ÓÐ Ò Ö Ó
    ÓÔØ ÑÓ ÒØÖÓ Ð ÖÖ ÐÓ keysº
    4.14.2         Implantaci´n del problema
                             o
    ÁÑÔÐ ÒØ ÑÓ× ÒÙ ×ØÖÓ Ð ÓÖ ØÑÓ Ò Ð Ö ÚÓ ÓÔ ÒÌÖ ºÀ                 ¿      ÙÝ ×ØÖÙ ØÙÖ × Ð
    × Ù ÒØ
¿    ÓÔ ÒÌÖ ºÀ ¿ ≡
         ¬Ò ÓÒ Ñ ÖÓ× ÓÔ ÒÌÖ ¿
       ÈÖÓØÓØ ÔÓ× ÙÒ ÓÒ × ÙÜ Ð Ö × ÓÔ ÒÌÖ ´Ò Ú Ö ¬Ò µ
        ÙÒ ÓÒ × ÙÜ Ð Ö × ÓÔ ÒÌÖ ¿ ¼
          template <class Node, typename Key>
      Node * build_optimal_tree(Key keys[], double p[], const int & n)
      {
               Ð Ö ÓÒ      Ñ ØÖ × ÒØ ÖÒ × ¿
          compute_optimal_costs(cost, p, n, tree);
          return compute_tree<Node, Key> (keys, tree, n, 1, n);
      }

    Í× × compute optimal costs ¿ ¼   Ò   compute tree   ¿½ º
          Ð Ö ÚÓ ÜÔÓÖØ ÙÒ ÙÒ ÓÒ ÔÖ Ò Ô Ð ÐÐ Ñ build optimal tree()º Ä ÒØÖ
       Ð ÙÒ ÓÒ × ÙÒ ÖÖ ÐÓ ÓÖ Ò Ó Ð Ú × keys[]¸ ÙÒ ÖÖ ÐÓ Ô Ö Ð ÐÓ ÔÖÓ Ð         ×
            ×Ó ÔÓÖ    i¹ × Ñ Ð Ú Ý Ð  Ñ Ò× ÓÒ n ÐÓ× Ö ×Ô Ø ÚÓ× ÖÖ ÐÓ׺ Ä × Ð ×
    Ð Ö Þ ÙÒ Ö ÓÐ Ò Ö Ó ÓÔØ ÑÓ ÓÒ ÓÖÑ Ð × ÔÖÓ Ð           ×     ׺
        Ä × Ð Ú × Ý ÔÖÓ Ð      × × ÓÐÓ Ò Ò ÖÖ ÐÓ× ×Ø Ø Ó׺       Ù×     Ð Ö Ò ×¹
      Ð ¸ Ð × Ñ ØÖ × ÒØ ÖÒ × ×ÓÒ Ñ ×    Ð × Ñ ÒØ Ò Ö ×Ø Ø ×º ÈÓÖ × Ö ÞÓÒ¸ ݸ
     Ò Ò ÙÖ ¸ Ô Ö ÒÓ Ð Ñ Ø ÖÒÓ× ÔÓÖ Ð Ö Ñ ÒØ ÓÒ Ñ ÑÓÖ ¸ Ù× Ö ÑÓ× ÖÖ ÐÓ×
      Ò Ñ Ó×
¿        Ð Ö ÓÒ Ñ ØÖ × ÒØ ÖÒ × ¿ ≡                              ´¿ µ
      DynArray <int> tree((n + 1)*(n + 1));
      DynArray <double> cost((n + 1)*(n + 1));
    Í× × DynArray ¾º
       tree[] × ÙÒ Ñ ØÖ Þ ÕÙ ÐÑ Ò Ò          ×             Ð Ô Ö Ñ ØÖÓ ÖÖ ÐÓ keys Ð ÙÒ ÓÒ
    build optimal tree()º cost[] × ÙÒ Ñ ØÖ Þ ÕÙ              ÐÑ Ò Óר × ÐÓ× Ö ÓÐ × Ô Ö Ð ×
    Ö ÕÙ Ö Ó× Ô Ö ÓÒרÖÙ Ö Ð Ö ÓÐ ÓÔØ ÑÓº
         Ð    ×Ó ÓÑÓ Ñ ØÖ Þ ÙÒ ÒØÖ                      ÙÒ ÖÖ ÐÓ Ò Ñ Ó ×        ¬Ò   Ð × Ù ÒØ
    ÑÓ Ó
¿      ¬Ò ÓÒ Ñ ÖÓ× ÓÔ ÒÌÖ ¿ ≡                                              ´¿    µ
      # define COST(i,j) (cost[(i)*(n+1) + (j)])
      # define TREE(i,j) (tree[(i)*(n+1) + (j)])
      ¬Ò ×
      COST¸   Ù×    Ò ÙÒ × ¿ ¼ Ò ¿ ½ º
      TREE¸   Ù×    Ò ÙÒ × ¿ ¼ Ò ¿ ½ º
    TREE(i,j)   ÐÑ Ò Ð Ò        Ð Ö Þ ÙÒ Ö ÓÐ ÓÔØ ÑÓ Ô Ö Ð ÕÙ ÓÒØ Ò Ð × Ð Ú ×
    ÒØÖ i Ý jº Ð ¬Ò и Ð Ö Þ Ð Ö ÓÐ ÓÔØ ÑÓ ¬Ò Ø ÚÓ × Ö keys[TREE(1, n)]¸ Ð Ö Þ Ð
     Ö ÓÐ ÞÕÙ Ö Ó keys[TREE(1, TREE(1,n) - 1)]¸ Ø Ø Ö º
       COST(i,j) ÐÑ Ò Ð Ó×ØÓ Ð Ö ÓÐ Ò Ö Ó ÓÒ Ð Ú × ÒØÖ keys[i] Ý keys[j]º
380                                                                         Cap´        ´
                                                                                    ıtulo 4. Arboles



        ÓÑÓ × Ð ÓרÙÑ Ö ¸ ØÓ Ó Ñ ÖÓ                         × Ö Ò ¬Ò Ó Ð ¬Ò Ð Ð Ö ÚÓ
¿¼   ÁÒ ¬Ò ÓÒ Ñ ÖÓ× ÓÔ ÒÌÖ ¿ ¼ ≡
       # undef COST
       # undef TREE
     Í× × COST ¿    Ò   TREE   ¿        º
           ÓÖ ¬Ò ÑÓ× Ð ÙÒ ÓÒ compute optimal cost()¸ Ð Ù Ð × ×ØÖÙ ØÙÖ Ò Ó×
      ÐÓÕÙ ×
¿¼     ÙÒ ÓÒ × ÙÜ Ð Ö × ÓÔ ÒÌÖ ¿ ¼ ≡                   ´¿ µ ¿ ¼
           static inline
       void compute_optimal_costs(DynArray <double> & cost,
                                  double              p[],
                                  const int &         n,
                                  DynArray <int>    & tree)
       {
           ÁÒ Ö ×ØÖÙ ØÙÖ × ÒØ ÖÒ × ¿ ¼
            ÓÒרÖÙ Ö Óר × ÓÔØ ÑÓ× ¿ ¼
       }
       ¬Ò ×
       compute optimal costs¸      Ù×       Ò ÙÒ ¿    º
     Í× × DynArray ¾º
     compute optimal cost()   Ð ÙÐ Ð × Ñ ØÖ × Óר × COST[] Ý ÐÓ× Ò × Ð × Ö ×
          ×Ù Ö ÓÐ ÓÔØ ÑÓ Ò TREE[]º Ð ÔÖ Ñ Ö ÐÓÕÙ ÁÒ Ö ×ØÖÙ ØÙÖ × ÒØ ÖÒ × ¿ ¼ ¸
     ÓÐÓ ÐÓ× Ú ÐÓÖ × Ò Ð × Ò Ð × Ö ×Ô Ø Ú × Ñ ØÖ ×
¿¼   ÁÒ Ö ×ØÖÙ ØÙÖ × ÒØ ÖÒ × ¿ ¼ ≡                              ´¿ ¼ µ
       int i, j, k;
       for (i = 1; i <= n; ++i)
         {
           COST(i, i - 1) = 0;
           TREE(i, i) = i;
         }
     Í× × COST ¿    Ò   TREE   ¿        º
          Ð × ÙÒ Ó ÐÓÕÙ × Ð ÕÙ Ð ÙÐ ÐÓ× Óר × ¬Ò Ø ÚÓ׺ ÈÖ Ñ ÖÓ ÓÒ ÐÓ× ×Ù Ö ÓÐ ×
        2 ÒÓ Ó׸ ÐÙ Ó ÓÒ ÐÓ×     3¸ Ý × ×Ù × Ú Ñ ÒØ ר Ó Ø Ò Ö Ð Ú ÐÓÖ COST(0, n-1)
     Ý Ð Ö Þ Ö ×ÙÐØ ÒØ Ò TREE(0, n-1)
¿¼     ÓÒרÖÙ Ö Óר × ÓÔØ ÑÓ× ¿ ¼ ≡                                 ´¿ ¼ µ
       for (i = 0; i    < n; ++i)
         for (j = 1;    j <= n - i; ++j)
           {
             k             = j + i;
             TREE(j,    k) = min_index(cost, j, k, n);
             COST(j,    k) = sum_p(p, j, k) +
                             COST(j, TREE(j, k) - 1) + COST(TREE(j, k) + 1, k);
              }
     Í× × COST ¿   ¸ min index ¿ ½ ¸ sum p ¿ ¼ ¸ Ò        TREE   ¿   º
     sum p()   ØÙ Ð ×ÙÑ Ð × ÔÖÓ                       Ð     × ÒØÖ j Ý k Ý ×     ¬Ò ÓÑÓ × Ù
¿¼     ÙÒ ÓÒ × ÙÜ Ð Ö × ÓÔ ÒÌÖ ¿ ¼                   +≡                  ´¿   µ ¿¼ ¿½
       static inline double sum_p(double p[], const int & i, const int & j)
       {
´
     4.14. Arboles est´ticos ´ptimos
                      a      o                                                            381



           double sum = 0.0;
           for (int k = i - 1; k < j; ++k)
             sum += p[k];
           return sum;
       }
       ¬Ò ×
       sum p¸   Ù×    Ò ÙÒ ¿ ¼ º
        min index() Ö ØÓÖÒ ÙÒ Ò               l¸ ÓÑÔÖ Ò Ó ÒØÖ j Ý k¸ Ø Ð ÕÙ COST(j,   l - 1) +
     COST(l + 1, k) × Ñ Ò ÑÓº               ר Ú ÐÓÖ × Ð ÙÐ Ñ ÒØ ÖÖ Ó Ö ØÓ             l ÒØÖ j
     Ýk
¿½     ÙÒ ÓÒ × ÙÜ Ð Ö × ÓÔ ÒÌÖ ¿ ¼              +≡              ´¿   µ ¿¼ ¿½
       static inline int min_index(DynArray <double>& cost,
                                   const int & j, const int & k, const int & n)
       {
         int ret_val;
         double min_sum = 1e32;
         for (int i = j; i <= k; ++i)
           {
             const double sum = COST(j, i - 1) + COST(i + 1, k);
             if (sum < min_sum)
               {
                 min_sum = sum;
                 ret_val = i;
               }
           }
         return ret_val;
       }
       ¬Ò ×
       min index¸    Ù×       Ò ÙÒ ¿ ¼ º
     Í× × COST ¿          Ò   DynArray ¾º
            Ð ÓÖÑ ÔÐ ÒØ ¸ min index() × O(n)¸ ÙÝ ÐÐ Ñ Ó ÙÖÖ ÒØÖÓ Ó× Ð ÞÓ×
     O(n)º ÄÓ ÒØ Ö ÓÖ ÑÔÐ       ÕÙ ÒÙ ×ØÖÓ Ð ÓÖ ØÑÓ × O(n3) ÙÒ Ø ÑÔÓ ÑÙ Ó Ñ ÓÖ ÕÙ
      Ð ÜÔÓÒ Ò Ð ÕÙ ÔÖÓ Ù Ö Ð Ð ÓÖ ØÑÓ Ù ÖÞ ÖÙØ ¸ Ô ÖÓ ÙÒ Ù ×Ø ÓÒ Ð Ô Ö
     Ú ÐÓÖ × n ÑÙÝ Ö Ò ×º Ä Ù×ÕÙ                Ð Ò   Ñ Ò ÑÓ Ð ÙÐ Ó Ò min index()
     ÔÙ Ñ ÓÖ Ö× × ÐÓ Ö ÑÓ× ÑÓ×ØÖ Ö ÕÙ Ð ×Ù Ö ÓÐ Ñ Ò ÑÓ × Ò Ù ÒØÖ Ò Ð Ö Ò Ó
     TREE(j, k - 1) ≤ TREE(j, k) ≤ TREE(j + 1, k)º Ò ×Ø       ×Ó¸ ÔÙ     ÑÓ×ØÖ Ö× ÕÙ
      Ð Ð ÓÖ ØÑÓ × O(n 2)¸ ÐÓ ÕÙ ×   Ð     ÓÑÓ Ö Óº
         ÆÓ× Ö ×Ø ÓÒרÖÙ Ö Ð Ö ÓÐ Ô ÖØ Ö Ð Ñ ØÖ Þ TREEº Ð Ò         Ð Ö Þ × TREE(1,n)¸
      Ð ×Ù ×Ù Ö ÓÐ ÞÕÙ Ö Ó × TREE(1, TREE(1,n)) Ý × ×Ù × Ú Ñ ÒØ º ר ÑÓ× Ð ×ØÓ׸
     Ô٠׸ Ô Ö × Ò Ö Ð ÖÙØ Ò
¿½     ÙÒ ÓÒ × ÙÜ Ð Ö × ÓÔ ÒÌÖ ¿ ¼ +≡                         ´¿ µ ¿ ½
           template<class Node, typename Key> static inline
       Node * compute_tree(Key keys[], DynArray<int>& tree,
                           const int & n, const int & i, const int & j)
       {
         if (i > j)
           return Node::NullPtr;
         Node * root = new Node (keys[TREE(i, j) - 1]);
         LLINK(root) = compute_tree <Node, Key>(keys, tree, n, i, TREE(i, j) - 1);
382                                                                  Cap´        ´
                                                                        ıtulo 4. Arboles



                                                 54

                                     38                    66

                               29          42         63        69

                         24                                          71

                     7                                                    98

                 3                                                             108

             0

      ÙÖ º       Ö ÓÐ Ò Ö Ó ÓÔØ ÑÓ        14   Ð Ú × ×ØÖ Ù × ÒÓÑ ÐÑ ÒØ ÓÒ p = 0, 5

      RLINK(root) = compute_tree <Node, Key>(keys, tree, n, TREE(i, j) + 1, j);
      return root;
 }
  ¬Ò ×
  compute tree¸ Ù× Ò ÙÒ    ¿   º
Í× × DynArray ¾ Ò TREE ¿   º


4.15      Notas bibliogr´ficas
                        a
Ë ÔÙ Ö          Ö ÕÙ Ð ÒÓ ÓÒ Ñ Ø Ñ Ø          Ö ÓÐ Ý ×Ù× ÓÒ ÔØÓ× ÙÒ Ñ ÒØ Ð × ×ÓÒ
Ö ×ÙÐØ Ó     Ú Ö × Ö × Ý Ò Ö ÓÒ × Ò Ð Ø ÓÖ           ÓÒ ÙÒØÓ׺ Ð ÚÓÐÙÑ Ò ½ Ð ÖØ
Ó ÓÑÔÙØ Ò ÔÖÓ Ö ÑÑ Ò             ÃÒÙØ ½¼ ¸ Ö ÓÔ Ð ÐÓ× Ò Ó× Ð Ó Ö ¬ Ó× ×Ó Ö ÐÓ×
ÓÖ Ò × Ñ Ø Ñ Ø Ó× ÐÓ× Ö ÓР׺ Ð Ñ ×ÑÓ ÑÓ Ó¸ ÃÒÙØ × ÙÒ Ð × Ñ ÓÖ × Ö ¹
Ö Ò × Ô Ö ÓÑÔÐ Ø Ö Ð × Ñ Ø Ñ Ø × ×Ó           × ÐÓ× Ö ÓÐ × ÔÖ × ÒØ × Ò ×Ø Ø ÜØÓ
Ý ÓØÖÓ× Ø ÔÓ×        Ö ÓÐ × ÕÙ ÒÓ ×ØÙ ÑÓ׺ × ÖÖÓÐÐÓ× Ñ Ø Ñ Ø Ó× Ñ × ÔÖÓ ÙÒ Ó×
ÔÙ Ò Ò ÓÒØÖ Ö× Ò ÙÒ Ø ÜØÓ ÓÖÑ Ð ×Ó Ö Ø ÓÖ            Ö Ó׺ Ò Ð Ó ÙÖÖ Ò ¸ Ö ÓÑ Ò¹
   ÑÓ× Ð Ð × Ó À Ö Öݸ Ö Ô Ì ÓÖÝ º × ÖÖÓÐÐÓ× Ö ÒØ × ÔÙ Ò Ò ÓÒØÖ Ö×
 Ò Ð Ø ÜØÓ ÓÑ Ò ØÓÖ Ð Ð ÓÖ Ø Ñ×           ÃÖ Ö Ý ËØ Ò×ÓÒ ½¾ º
    ÄÓ× Ó Ó× ÙÒ Ö ÓÐ Ò Ö Ó¸ Ð Ð Ò Ù           ÄÙ × Û Þ Ý Ð Ð Ö ÒÓØ ÓÒ ÔÓÐ ¸
 Ù ÖÓÒ ×ØÙ Ó× ÔÓÖ Ð Ñ Ø Ñ Ø Ó ÔÓÐ Ó Â Ò ÄÙ × Û Þ ½ º Ð ÓÖÔÙ× ÓÑÔÖ × ÓÒ
 ÓÑÓÒ Ñ Ñ ÒØ ÐÐ Ñ Ó           ÀÙ«Ñ Ò Ù × Ù ÖØÓ ÔÓÖ Ú ÀÙ«Ñ Ò Ò ½ ¾¸ Ò
 ÕÙ Ð ÒØÓÒ × ×ØÙ ÒØ Ó¬ Ð º ÁÒØ Ö × ÒØ Ñ ÒØ ¸ ÀÙ«Ñ Ò Ñ × ÕÙ ×Ó Ô Ø ÒØ Ö ×Ù×
   × Ù Ö Ñ ÒØÓ׺
    È Ö ÙÒ Ö Ú × ÓÒ Ý Ò Ð × × Ð Ø ÓÖ         Ó Ó× Ö ÓÐ Ò Ö Ó¸ Ö ÓÑ Ò ÑÓ× Ð
ÓÖ         Öר Ð Ý È ÖÖ Ò ¾ º
    Ë ÙÒ ÃÒÙØ ½½ ÐÓ× Ö ÓÐ × Ò Ö Ó×         Ù×ÕÙ Ù ÖÓÒ × Ù ÖØÓ× Ò Ô Ò ÒØ ¹
Ñ ÒØ ÔÓÖ Ú Ö Ó× ÒÚ ×Ø ÓÖ × ÙÖ ÒØ Ð                ½ ¼º ÒÙ ÚÓ¸ Ð Ð ØÓÖ × Ö Ñ Ø Ó
  Ð Ó Ö ÃÒÙØ ½½ Ô Ö ÓÒ×ÙÐØ Ö Ð × Ö Ö Ò × Ü Ø ×º
    ÌÓ Ó× ÐÓ× Ð ÖÓ× ×ØÖÙ ØÙÖ ×        ØÓ× ÓÒ× Ö Ò Ú Ö Ó× Ô ØÙÐÓ× ÐÓ× Ö ÓР׺ Ò
 × × ÒØ Ó¸ Ù ÐÕÙ Ö ÓØÖÓ Ø ÜØÓ × ÖÚ      Ö ÖÒ           ÓÒ Ðº Ë Ò Ñ Ö Ó¸ Ò ÐÓ ÕÙ
4.15. Notas bibliogr´ficas
                    a                                                              383



    Ö ÓÐ × × Ö ¬ Ö ¸ Ò Ò ÙÒ Ð ÖÓ¸ Ò ÐÙ Ó ÔÓÖ ×ÙÔÙ ×ØÓ Ð ÔÖ × ÒØ ¸ ÔÙ         ÓÒ× Ö Ö×
 ÓÑÔÐ ØÓº ÍÒ Ø ÜØÓ Ö ÒØ ¸           Ø ËØÖÙ ØÙÖ × Ù× Ò        Ò ++         Ä Ò × Ñ¸ Ù¹
  Òר Ò Ý Ì Ò Ò ÙÑ ½¿ ¸ Ü              ÑÔÐ × Ö ­ Ü ÓÒ × ÔÖ Ø × Ý ÔÖ × ÒØ ÔÐ ÓÒ ×
Ö Ð ×¸ ÒÓØ Ð Ñ ÒØ ¸ Ð Ú ÐÙ ÓÒ ÜÔÖ × ÓÒ × Ö ØÑ Ø × Ñ ÒØ Ö ÓÐ × Ð Ó׺
    ÄÓ× Ö ÓÐ × Ð Ó× Ù ÖÓÒ × Ù ÖØÓ× ÔÓÖ º º È ÖÐ × Ý º Ì ÓÖÒØÓÒ ½ º ÙÒÕÙ
×Ù Ù×Ó × ¬ ÙÐØÓ×Ó¸ ר Ð ×            Ö ÓÐ × Ù×      Ò ÔÐ ÓÒ × ×Ø ר ׸ ØÓÖ ×
Ø ÜØÓ× Ý ÔÐ ÓÒ × Ö ¬ × ÕÙ Ñ Ò Ò Ö Ò × ÚÓÐÙÑ Ò × Ò ÓÖÑ ÓÒº
    ÄÓ× Ö ÓÐ × ÓÒ Ö Ò Ó ÔÖ × ÒØ Ó× Ò Ü º½½ ´Ô Ò ¿ ¿µ Ù ÖÓÒ × ÖÖÓÐÐ Ó× ÔÓÖ
 ר Ö ØÓÖ Ô Ö Ð ÔÖ × ÒØ ØÖ Ó ÓÑÓ ÒרÖÙÑ ÒØÓ                     Ø Ó ÓÒ × ÙÖ           Ò
× Ó × ÖÖÓÐÐ Ó× ÔÖ Ú Ñ ÒØ º Ä × × ×Ó Ö Ð Ù×Ó Ö Ò Ó× Ô Ö Ð Ú ØÓÖ Þ ÓÒ
 Ö ÓÐ × × ÔÖ × ÒØ Ô Ö ÙÒ Ð ×               Ö ÓÐ ÕÙ Ð Ö Ó ÒÓÑ Ò Ó ÎÄ ÔÓÖ Ö Ò º
  Ô Ö ÒØ Ñ ÒØ ¸ Ð ØÖ Ó           Ö Ò × Ô ÓÒ ÖÓ Ò ÐÓ× Ð ÓÖ ØÑÓ× ÓÒ Ø Ò ÓÒ Ý Ô Ö¹
Ø ÓÒº
    ÄÓ× Ó Ó× ÀÙ«Ñ Ò ×ÓÒ ÓÑÓÒ ÑÓ×                    Ú º ÀÙ«Ñ Ò ÕÙ Ò ÐÓ× × Ù Ö Ó
 ÙÖ ÒØ Ð Ö Ð Þ ÓÒ ×Ù× Ø × × Ó ØÓÖ Ðº
    ÄÓ×       Ô׸ ÙÒØÓ ÓÒ Ð           Ô×ÓÖØ¸ Ù ÖÓÒ ÔÖ × ÒØ Ó× ÔÓÖ ÔÖ Ñ Ö Ú Þ ÔÓÖ
º Ϻ º Ï ÐÐ Ñ× ½ Ý Êº Ϻ ÐÓÝ º
      Ò Ð ÓÔ Ò ÓÒ ×Ø Ö ØÓÖ¸ Ð Ñ × ÙØ ÒØ Ý Ñ ×ØÖ Ð ÜÔÐ ÓÒ ×Ó Ö                     Ô× Ð
ÓÖ         ÒØÐ Ý Ò ÈÖÓ Ö ÑÑ Ò È ÖÐ× ½ º Ä ÜÔÐ ÓÒ × Ø Ò Ü Ð× ÕÙ ×
ÑÙ Ó× ÒÓ× ´½ µ Ù Ò Ó ×Ø Ö ØÓÖ ×ØÙ Ó ÐÓ× Ô׸ ר ÒÓ ÔÙ                       ×ÔÖ Ò Ö×
×Ù ×ÕÙ Ñ ÔÖ × ÒØ ÓÒ ÐÓ× Ô׺ Ë ÖÚ ¸ Ô٠׸ ר ÔÖ × ÒØ Ô ÖÖ Ó ÓÑÓ ÔÐ Ø ×
Ý Øº
      ÓÖÑ Ö¸ Ä × Ö×ÓÒ Ý Ê Ú ×Ø ¿ ÔÖ × ÒØ Ò × ÖÖÓÐÐÓ× ÐØ ÖÒ Ø ÚÓ× Ö ÓÐ × ÜØ Ò Ó×
Ô Ö ÓØÖ Ð ×           Ö ÓÐ ÕÙ Ð Ö Ó ÐÐ Ñ Ó ÖÓ Ó¹Ò ÖÓº
      Ð ÓÖ Ð × Ó Ë Û ¸ Ð ÓÖ Ø Ñ× Ò È ÖØ× ½ß ½ ¸ × Ö Ø Ö Þ ÔÓÖ
 ÜÔÓÒ Ö ÑÙ Ó× Ð ÓÖ ØÑÓ׸ ÓÖÑ ÑÙÝ ÓÒ × Ô ÖÓ Ú × Ò ÓÑÔÐ Ø Ý Ò ØÖ Ñ ÒØÓ
   Ð ÓÖÑ Ð ×ÑÓº Ô × Ö ÐÐÓ¸ Ð Ë Û × ÙÒ Ð × Ñ ÓÖ × Ö Ö Ò × Ô Ö Ò Ö
 Ð ÙÒ Ð ÓÖ ØÑÓ ×Ô ¬ Óº
      Ð ÚÓÐÙÑ Ò ¿ Ð ÖØ Ó ÓÑÔÙØ Ö ÔÖÓ Ö ÑÑ Ò                ÃÒÙØ ½½ ÓÒØ Ò ÙÒ Ò Ð × ×
Ñ Ø Ñ Ø Ó ×Ø ÒØ Ü Ùר ÚÓ ÐÓ× Ö ÓÐ × Ò Ö Ó×                     Ù×ÕÙ Ý ÐÓ× Ö ÓÐ ×
ÓÔØ ÑÓ׺
      Ð ÁÒØÖÓ Ù Ø ÓÒ ØÓ Ð ÓÖ Ø Ñ×              ÓÖÑ Ò¸ Ä × Ö×ÓÒ Ý Ê Ú ×Ø ¿ ¸ ÓÒ× Ö ÙÒ
  Ô ØÙÐÓ Ð × ÜØ Ò× ÓÒ × ×Ó Ö Ö ÓÐ × Ò Ö Ó׺ ÙÒÕÙ ×Ø Ô ØÙÐÓ × × Ò ÙÒ Ð ×
Ô ÖØ ÙÐ Ö        Ö ÓÐ ÐÐ Ñ Ó ÖÓ Ó¹Ò ÖÓ ´Ú Ö Ü º ´Ô Ò ½¿µµ¸ Ð × ÜØ Ò× ÓÒ × ÔÖÓÔ¹
Ù ×Ø × ÔÙ Ò Ù× Ö× ×Ó Ö ÔÖ Ø Ñ ÒØ Ù ÐÕÙ Ö Ð ×                  Ö ÓÐ Ò Ö Ó      Ù×ÕÙ º
      Ð Ð ÓÖ ØÑÓ Ò× Ö ÓÒ Ò Ð Ö Þ ÔÖ × ÒØ Ó Ò Ü º º ´Ô Ò ¿ ¿µ Ù × Ù ÖØÓ
ÔÓÖ ËØ Ô ×ÓÒ Ý Ö ÔÓÖØ Ó Ò Ñ Ø Ó ÓÖ ÓÒרÖÙ Ø Ò Ò ÖÝ × Ö ØÖ × Ý Ñ Ò
 Ò× ÖØ ÓÒ× Ø Ø ÖÓÓØ ½ º ר ØÖ Ó Ñ Ö Ó ÙÒ ØÓ ×Ó Ö ÐÓ× Ö ÓÐ × Ò Ö Ó׸ ÔÙ ×
  Ó Ô ÒÙ Ú × × Ý Ù×Ó׸ ÒÓØ Ð Ñ ÒØ ¸ ÐÓ× Ð ÓÖ ØÑÓ× ÓÒ Ø Ò ÓÒ Ý Ô ÖØ ÓÒ
ÔÖ × ÒØ Ó× Ò Ü º º ´Ô Ò ¿ µ Ý Ü º½½º ´Ô Ò ¿ µ Ý ÐÓ× Ö ÓÐ × Ð ØÓÖ Þ Ó× ÕÙ
× Ö Ò ÔÖ × ÒØ Ó× Ò Ü º¾ ´Ô Ò            µº
    ÄÓ× Ö ÓÐ × Ò Ö Ó×            Ù×ÕÙ ÓÔØ ÑÓ× Ù ÖÓÒ ÔÖÓÔÙ ×ØÓ× Ý ×ØÙ Ó× ÔÓÖ
ÀÙ Ý ÌÙ Ö Ò ½ ½ º
384                                                          Cap´        ´
                                                                ıtulo 4. Arboles



4.16    Ejercicios
  ½º ÅÓ ¬ÕÙ Ð Ð ÓÖ ØÑÓ º½ Ô Ö ÕÙ ÑÔÖ Ñ ÙÒ Ö ÓÐ Ö ØÖ Ö Ñ ÒØ Ö Ò ÕÙ
     ÒÓ ÕÙ Ô Ò Ð Ñ Ó ÑÔÖ × ÓÒ ´Ô ÒØ ÐÐ Ó ÑÔÖ ×ÓÖ µ ´·µ
  ¾º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ØÓÑ ÓÑÓ ÒØÖ ÙÒ × Ù Ò                    ×ÓÖ Ò ´ÙÒ Ð ×Ø Ó
     ÙÒ Ú ØÓÖ¸ ÔÓ Ó ÑÔÓÖØ µ¸ Ô Ö × <Î ÐÓÖ ÒÓ Ó¸ ÆÙÑ ÖÓ             Û Ý>¸ Ý Ö ØÓÖÒ Ð
       Ö ÓÐ Ö ÔÖ × ÒØ Ó ÓÒ Ð ×Ø × ÒÐ Þ × Ý ÓÒ ÖÖ ÐÓ׺
  ¿º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ØÓÑ          ÒØÖ ÙÒ Ö ÓÐ Ù ÐÕÙ Ö Ý Ö ØÓÖÒ ÙÒ × Ù Ò
     ÓÖ Ò          ÒÙÑ ÖÓ×       Û Ýº ÓÒ× Ö ÐÓ× Ó× Ø ÔÓ× Ö ÔÖ × ÒØ ÓÒ Ð ×Ø ×
       ÒÐ Þ × Ý ÖÖ ÐÓ׺
   º × ÙØ Ý × Ò ÙÒ ×ØÖÙ ØÙÖ               ØÓ ÓÖ ÒØ         Ð ÒÓØ ÓÒ        Û Ýº ×¹
       ÙØ Ð ÙÒÓ× ÓÒØ ÜØÓ× Ò ÐÓ× Ù Ð × ×Ù × ÒÓ × Ö Ùר ¬ Óº
   º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ù×ÕÙ ÙÒ Ð Ú Ò ÙÒ Ö ÓÐ Ò¹ Ö Ó Ö ÔÖ × ÒØ Ó Ñ ÒØ
     Ð ×Ø × ÒÐ Þ ×º × ÙØ ×Ó Ö Ð × Ö ÒØ × ×ØÖ Ø ×               Ù×ÕÙ º
   º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ù ÒØ Ð ÒÙÑ ÖÓ ÒÓ Ó× Ò ÙÒ Ö ÓÐ Ò¹ Ö Ó Ö ÔÖ × ÒØ Ó
     Ñ ÒØ Ð ×Ø × ÒÐ Þ ×º
   º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ö ÓÖÖ Ò ×Ù¬ Ó ÙÒ Ö ÓÐ Ö ÔÖ × ÒØ Ó ÓÒ Ð ×Ø ׺
   º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ × Ö Ð Ö ÔÖ × ÒØ ÓÒ Ô Ö ÒØ Þ                 ÙÒ Ö Óк
   º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÓÒÚ ÖØ ÙÒ Ö ÓÐ Ö ÔÖ × ÒØ Ó ÓÒ Ð ×Ø × ÒÐ Þ × Ò
     ×Ù ÕÙ Ú Ð ÒØ Ö ÔÖ × ÒØ Ó ÓÒ ÖÖ ÐÓ׺ Ê Ð Ó× Ö ×ÔÙ ×Ø × Ð ÔÖ Ñ Ö ÓÒ¹
     × Ö Ò Ó ÓÒÓ Ó Ð ÓÖ Ò Ð Ö Óи Ð × ÙÒ ÓÒ× Ö Ò ÓÐÓ × ÓÒÓ Óº
 ½¼º ÓÒ         ÓÑÓ Ð Ñ Ø Ö Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó Ô Ö ÕÙ ÓÒØ Ò Ð Ò ÓÖÑ ÓÒ Ö ¹
     ÕÙ Ö Ô Ö Ö ÓÒרÖÙ Ö Ð Ö ÓÐ ÓÖ Ò Ðº
 ½½º ÓÒ         ÓÑÓ Ð Ñ Ø Ö Ð Ö ÓÖÖ Ó ×Ù¬ Ó Ô Ö ÕÙ ÓÒØ Ò Ð Ò ÓÖÑ ÓÒ Ö ¹
     ÕÙ Ö Ô Ö Ö ÓÒרÖÙ Ö Ð Ö ÓÐ ÓÖ Ò Ðº
 ½¾º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÓÒרÖÙÝ ÙÒ Ö ÓÐ Ò Ö Ó Ô ÖØ Ö ÐÓ× Ö ÓÖÖ Ó× Ò¬ Ó
     Ý ×Ù¬ Óº
 ½¿º ÅÓ ¬ÕÙ Ð Ö ÓÖÖ Ó ÔÓÖ Ò Ú Ð × level order ´Ü º º½¾ ´Ô Ò ¾ ¼µµ Ô Ö ÕÙ Ù×
     ÙÒ ÙÒ ÓÒ Ú × Ø ÕÙ Ö             Ð Ò Ú Ð Ý Ð ÔÓ× ÓÒ ÒØÖÓ Ð Ö ÓÖÖ Óº
 ½ º × Ò ÙÒ Ð ÓÖ ØÑÓ ÒÓ Ö ÙÖ× ÚÓ ÕÙ ÓÔ             Ö ÓÐ × Ò Ö Ó׺ ´·µ
 ½ º × Ò ÙÒ Ð ÓÖ ØÑÓ ÒÓ Ö ÙÖ× ÚÓ ÕÙ ×ØÖÙÝ             Ö ÓÐ × Ò Ö Ó׺ ´·µ
 ½ º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ö ÓÖÖ Ò ÔÖ ¬ Ó ÙÒ Ö ÓÐ Ò Ö Ó Ð Óº
 ½ º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ö ÓÖÖ Ò ×Ù¬ Ó ÙÒ Ö ÓÐ Ò Ö Ó Ð Óº
 ½ º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ð ÙÒ Ö ÓÐ Ò Ö Óº Ä ÒØÖ              × ÙÒ Ö ÓÐ Ò Ö Ó ÒÓÖÑ Ð
     Ð × Ð × Ð Ñ ×ÑÓ Ö Óи Ô ÖÓ ×Ù× ÒÓ Ó× ×Ø Ò Ð Ó× × ÙÒ º º½ º
 ½º       Ó ÙÒ Ö ÓÐ Ò Ö Ó¸ × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ          ØÙ Ð ÓÔ Ð º
4.16. Ejercicios                                                         385



 ¾¼º ËÙÔÓÒ ÙÒ Ö ÓÐ Ò Ö Ó ÙÝÓ× ÒÓ Ó× Ø Ò Ò ÙÒ ÑÔÓ           ÓÒ Ð ÐÐ Ñ Ó PLINK
     Ý ÕÙ ÒÓØ Ð ÒÓ Ó Ô Ö º          Ó ÙÒ ÒÓ Ó Ù ÐÕÙ Ö p¸ × Ò Ð ÓÖ ØÑÓ× ÒÓ
     Ö ÙÖ× ÚÓ× Ý × Ò Ô Ð Ô Ö
      ´ µ Ø ÖÑ Ò Ö Ð ÒÓ Ó ÔÖ     ×ÓÖ Ý¸
      ´ µ Ø ÖÑ Ò Ö Ð ÒÓ Ó ×Ù ×ÓÖº
 ¾½º ÄÓ× Ö ÓÖÖ Ó× Ô× Ù Ó¹ Ð Ó× ÒÓ ÓÒ× Ö Ò Ð ÔÓ× ÓÒ Ð ÒÓ Ó Ò Ð Ö ÓÖÖ Ó Ò
     ×Ù Ò Ú Ðº ÅÓ ¬ÕÙ Ð × ÙÒ ÓÒ × Ò Ù ×Ø ÓÒ Ô Ö ÕÙ × Ò ÐÙÝ Ò ×ØÓ× Ô Ö Ñ ØÖÓ׺
     ´··µ
 ¾¾º × Ò ÙÒ ÖÙØ Ò Ö ÙÖ× Ú ÕÙ Ö ÓÖÖ ÔÓÖ Ò Ú Ð × ÙÒ Ö ÓÐ Ò Ö Ó Ý Ù× ×Ô ¹
       Ó O(1)º ´·µ
 ¾¿º × Ò ÙÒ Ð ÓÖ ØÑÓ ÒÓ Ö ÙÖ× ÚÓ ÕÙ      ØÙ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó ×Ó Ö ÙÒ Ö ÓÖ ×¹
       Ò ×Ô ¬           Ñ ÒØ Ð Ì Tree Node<T>º
 ¾ º × Ò ÙÒ Ð ÓÖ ØÑÓ ÒÓ Ö ÙÖ× ÚÓ ÕÙ       ØÙ Ð Ö ÓÖÖ Ó ×Ù¬ Ó ×Ó Ö ÙÒ Ö ÓÖ ×¹
       Ò ×Ô ¬           Ñ ÒØ Ð Ì Tree Node<T>º
 ¾ º ÓÒ× Ö ÐÓ× × Ù ÒØ × Ö ÓÖÖ Ó× ×Ó Ö ÙÒ Ö ÓÖ × Ò
       Prefijo     ¾ ½ ¿ ½ ½ ½¾          ½¼ ½½ ½ ½¿ ½ ½ ½ ¾¼
       Sufijo    ½¾¿           ½¼ ½½ ½¾ ½¿ ½ ½ ½ ½ ½ ½ ¾¼
            Ù Ð Ö ÓÖ × Ò º
 ¾º       ¬Ò     ÑÔÐ ÒØ Ð × Ñ Ð Ö         ÒØÖ Ó× Ö ÓÐ × ×Ô ¬ Ó× Ñ ÒØ
        Ð Ì Tree Node<T>º
 ¾º       ¬Ò     ÑÔÐ ÒØ Ð ÕÙ Ú Ð Ò        ÒØÖ Ó× Ö ÓÐ × ×Ô ¬ Ó× Ñ ÒØ
        Ð Ì Tree Node<T>º
 ¾º       × Ò ÙÒ Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓ ÕÙ ÑÔÐ ÒØ Ð ÓÔ      ÙÒ Ö ÓÐ ×Ô ¬ Ó Ñ ¹
           ÒØ Ð Ì Tree Node<T>º
 ¾º       × Ò ÙÒ Ð ÓÖ ØÑÓ ÒÓ Ö ÙÖ× ÚÓ ÕÙ ÑÔÐ ÒØ Ð ÓÔ      ÙÒ Ö ÓÐ ×Ô ¬ Ó
       Ñ ÒØ Ð Ì Tree Node<T>º
 ¿¼º      × Ò ÙÒ Ð ÓÖ ØÑÓ ÒÓ Ö ÙÖ× ÚÓ ÕÙ Ö Ð Ð Ù×ÕÙ ÔÓÖ ÒÙÑ ÖÓ      Û Ýº
 ¿½º        Ù Ð Ö ÓÖ × Ò ÕÙ Ú Ð ÒØ Ð × Ù ÒØ Ö ÓÐ Ò Ö Ó
386                                                                                                        Cap´        ´
                                                                                                              ıtulo 4. Arboles



                                                         9

                                         6                                                                               21

                                4            7                                             16                                 22

           1                         5           8           10                                      18                                 24

                   2                                                        13                  17         19                      23        25

                        3                                         11             14                             20

                                                                       12             15

 ¿¾º           Ù        Ð Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ                         Ð Ö ÓÖ × Ò               × Ù ÒØ

                                                     1                                                    14                        26                 27



                            2                                 8        9      10           17        18        19        20         28            29   30   31



       3       4            5        6       7       11      12        13                       21        22



                       15       16                                                              23        24        25


 ¿¿º ÓÑÔÐ Ø Ð ×ÓÐÙ ÓÒ                            Ð        Ù ÓÒ ´ º¿¿µº ´··µ
 ¿ º ÓÑÔÐ Ø Ð ×ÓÐÙ ÓÒ                            Ð        Ù ÓÒ ´ º¿ µº ´·µ
 ¿ º Ë (ni) Ð Ö Ò Ð                                      Ð Ö ÓÐ Ò Ö Ó ÙÝ Ö Þ × niº                              ÑÙ ×ØÖ ÕÙ
                                                      ÁÈÄ(T ) =                            (ni)
                                                                       ∀ni T|ni ÒØ ÖÒÓ


 ¿ º Ò Ö Ð Ð ÜÔÖ × ÓÒ ÒØ Ö ÓÖ Ô Ö                                       Ö ÓÐ × m¹Ö Ó׺
 ¿ º × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ ØÖ Ò× ÓÖÑ                                       ÙÒ Ö ÓÐ m¹Ö Ó ÓÑÔÐ ØÓ¸ Ö ÔÖ × ÒØ Ó ÓÒ
    Ð ×Ø ׸ Ò ÙÒ ÖÖ ÐÓ × Ù Ò Ðº
 ¿ º × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ ØÖ Ò× ÓÖÑ                                       ÙÒ Ö ÓÐ Ò Ö Ó ÓÑÔÐ ØÓ Ò ÙÒ ÖÖ ÐÓ × ¹
      Ù Ò Ðº
 ¿ º × Ö ÙÒ Ú Ö× ÓÒ ÒÓ Ö ÙÖ× Ú Ð                                            Ð ÓÖ ØÑÓ ÕÙ              Ð ÙÐ Ð ÐØÙÖ                    ÙÒ Ö ÓÐ
       Ò Ö Óº
4.16. Ejercicios                                                               387



  ¼º ÓÒ× Ö Ð × × Ù ÒØ × Ð Ò × Ð Ð ÓÖ ØÑÓ ÔÖ × ÒØ Ó Ò Ü º º ´Ô Ò ¾ µ Ô Ö
    Ð ÓÔ    ÙÒ Ö ÓÐ Ò Ö Ó
                     I(RLINK(tgt_root) == Node::NullPtr);
                     if (LLINK(tgt_root) != Node::NullPtr)
                       destroyRec(LLINK(tgt_root));
                     delete tgt_root;

      ´ µ ÈÓÖ ÕÙ Ð × ÖØÓ Ø Ò × ÒØ Ó
      ´ µ Ð if Ý Ð ×ØÖÙ ÓÒ Ð ×Ù Ö ÓÐ ÞÕÙ Ö Ó ×ÓÒ Ö ÙÒ ÒØ ׸ ÔÓÖ ÕÙ
  ½º × Ö        ÙÒ Ú Ö× ÓÒ Ö ÙÖ× Ú       Ð Ð ÓÖ ØÑÓ          רÖÙ ÓÒ ÑÓ×ØÖ Ó Ò
     Ü º º½¼ ´Ô Ò ¾ µ ÕÙ Ð Ö ÐÓ× ÒÓ Ó× Ò ÔÖ ¬ Óº

  ¾º × Ö        ÙÒ Ú Ö× ÓÒ Ö ÙÖ× Ú       Ð Ð ÓÖ ØÑÓ          רÖÙ ÓÒ ÑÓ×ØÖ Ó Ò
     Ü º º½¼ ´Ô Ò ¾ µ ÕÙ Ð Ö ÐÓ× ÒÓ Ó× Ò Ò¬ Óº

  ¿º × Ö ÙÒ Ú Ö× ÓÒ ÒÓ Ö ÙÖ× Ú ¸ ×Ù¬ Ó¸ Ð Ð ÓÖ ØÑÓ              רÖÙ ÓÒ ÑÓ×ØÖ Ó Ò
     Ü º º½¼ ´Ô Ò ¾ µ ÕÙ ¸ Ò ×Ó           ÕÙ Ó ÙÖÖ ÙÒ × ÓÖ          ÔÐ ¸     Ð Ö ÓÐ
      Ò ÙÒ ×Ø Ó ÓÒ× ×Ø ÒØ º
   º × Ö ÙÒ ÔÖÓ Ö Ñ ÕÙ Ö ÓÖÖ ÙÒ Ö ÓÐ Ò Ö Ó ÔÓÖ Ò Ú Ð ×              Ö      ÞÕÙ Ö º
   º ÁÑÔÐ ÒØ Ð Ö ÓÖÖ Ó ×Ù¬ Ó Ñ ÒØ Ô× Ù Ó¹ Ð Óº ´··µ
   º ÅÓ ¬ÕÙ Ð Ö ÓÖÖ Ó Ò¬ Ó Ô× Ù Ó¹ Ð Ó Ô Ö Ó Ø Ò Ö ÙÒ Ö ÓÖÖ Ó Ò¬ Ó ÒÚ Ö×Ó
      × Ö¸ Ð Ö ÓÖÖ Ó Ò¬ Ó           Ö       ÞÕÙ Ö º ´·µ
   º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ö             ÓÑÓ ÒØÖ       Ð ÒÙÑ ÖÓ         Û Ý ÙÒ ÒÓ Ó
      Ù ÐÕÙ Ö Ý Ð Ö ÓÐ Ò Ö Ó ÓÒ Ö × Ð ÒÓ Ó Ý Ö ØÓÖÒ Ð ÒÓ Ó Ò Ù ×Ø ÓÒº
   º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ØÓÑ           ÒØÖ ÙÒ Ö ÓÐ Ò Ö Ó Ý ÓÒרÖÙÝ ÙÒ ÓÒ ÙÒØÓ
      ÓÑÔÙ ×ØÓ ÔÓÖ ØÓ Ó× ÐÓ× ÒÓ Ó× Ö ÔÖ × ÒØ Ó× Ò ÒÙÑ ÖÓ×          Û Ýº
   º Ò × ÐÓ ÔÐ ÒØ Ó Ð Ò Ó Ü º ´Ô Ò ¿¾¼µ¸ Ð ÙÐ Ð ÒÙÑ ÖÓ Ö ÓÖ ×¹
        Ò × ÔÓ× Ð × ÕÙ × ÔÙ Ò ÔÐ ÒØ Ö ÓÒ n ÒÓ Ó׺
  ¼º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ø ÖÑ Ò × ÙÒ × Ù Ò                  Ø× ÓÖÖ ×ÔÓÒ ÙÒ Ô Ð ¹
       Ö ÄÙ × Û Þº
  ½º      Ó ÙÒ Ö ÓÐ Ò Ö Ó¸ × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ò Ö Ð Ô Ð Ö                ÄÙ × Û Þ
      ÓÖÖ ×ÔÓÒ ÒØ º
  ¾º ÑÙ ×ØÖ ÕÙ Ð Ð Ò Ù                  × ÔÖ ¬ Óº
  ¿º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÑÔÖ Ñ Ð Ö ÓÖÖ Ó ÔÓÖ Ò Ú Ð × ÒÚ Ö×Ó ÙÒ Ö ÓÐ Ò Ö Óº
       × Ö¸ ÔÖ Ñ ÖÓ × Ð ×Ø Ò ÞÕÙ Ö              Ö    ÐÓ× ÒÓ Ó× Ð ÙÐØ ÑÓ Ò Ú Ð ÐÙ Ó
     ÐÓ× Ð Ô ÒÙÐØ ÑÓ Ý × ×Ù × Ú Ñ ÒØ ר ÐÐ Ö Ð Ö Þº
   º      Ó ÙÒ Ö ÓÐ Ò Ö Ó Ù ÐÕÙ Ö ¸ Ð Ö ÓÖÖ Ó ÓÑÔÐ Ñ ÒØÓ ÔÓÖ Ò Ú Ð × × ¬Ò Ó
      ÓÑÓ Ð Ð ×Ø Ó ÐÓ× ÒÓ Ó× ÕÙ ÐØ Ò ÔÓÖ Ò Ú Ð Ô ÖØ Ö Ð Ö Þ ×Ø Ð ÒÓ Ó
     Ñ ÝÓÖ ÐØÙÖ º ÈÓÖ ÑÔÐÓ¸ Ô Ö Ð Ö ÓÐ Ð ¬ ÙÖ º ¸ Ð Ö ÓÖÖ Ó ÓÑÔÐ Ñ ÒØÓ
      × 7, 8, 11, 14, 15 × Ö¸ ÐÓ× ÒÓ Ó× ÕÙ ÐØ Ö Ò Ô Ö ÕÙ Ð Ö ÓÐ ×Ø ÓÑÔÐ ØÓ
        ר ×Ù ÐØÙÖ º
388                                                                 Cap´        ´
                                                                       ıtulo 4. Arboles


                                             ½
                          ¾                                 ¿


                              ½¼     ½½          ½¾    ½¿       ½       ½

                              ÙÖ º        Ö ÓÐ Ò Ö Ó   ÑÔÐÓ

       ´µ  ×Ò     ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ð ÙÐ Ð Ö ÓÖÖ Ó ÓÑÔÐ Ñ ÒØÓ              ÙÒ Ö ÓÐ Ò Ö Óº
          ×ÙÑ     ÕÙ ÐÓ× ÒÓ Ó× ×Ø Ò Ø ÕÙ Ø Ó× ÔÓÖ Ò Ú Ð Ô ÖØ Ö          Ð ÔÓ× ÓÒ ÖÓº
         ´·µ
       ´µ ×Ò     ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ò Ö ÙÒ Ö ÓÐ ÓÑÔÐ Ñ ÒØÓº ×ØÓ ×¸ ÙÒ Ö ÓÐ ÙÝ ×
          Ó ×    Ò Ò ÓÒ ÐÓ× ÒÓ Ó× ÐØ ÒØ × Ð Ö ÓÐ Ô Ö ÕÙ Ð Ö ÓÐ ×Ø ÓÑÔÐ ØÓº
         ´·µ
   º      × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÔÓ ÙÒ Ö ÓÐ Ò Ö Ó × Ö¸ ÕÙ Ð Ñ Ò Ð Ñ Ò Ñ
         ÒØ         ÒÓ Ó× Ô Ö ÚÓÐÚ ÖÐÓ ÙÒ Ö ÓÐ ÓÑÔÐ ØÓº
   º      × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ò Ù ÒØÖ Ð Ñ × Ð Ö Ó Ñ ÒÓ ÔÓÖ Ð Ö              ÓÒØ Ò Ó Ò
       ÙÒ Ö ÓÐ Ò Ö Óº
   º      × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÓÒרÖÙÝ ÙÒ Ö ÓÐ Ò Ö Ó Ô ÖØ Ö ÙÒ Ô Ð Ö
       ÄÙ × Û Þº ´·µ
   º      × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ò Ö ÙÒ Ö ÓÐ Ò Ö Ó n ÒÓ Ó× ÓÒ n × ÙÒ Ú ÐÓÖ
        ÓÒר ÒØ º ´·µ
   º      × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ø ÖÑ Ò × ÙÒ ÜÔÖ × ÓÒ Ð Ö Ø Ò ×Ù× Ô Ö ÒØ × ×
          Ð Ò Ó׺ ´·µ
  ¼º      × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ò Ö ÙÒ Ö ÓÐ Ò Ö Ó Ð ØÓÖ Ó n ÒÓ Ó׺ Ä ÒØ n
        × ÙÒ Ô Ö Ñ ØÖÓ Ð Ð ÓÖ ØÑÓ Ý ØÓ Ó× ÐÓ× Ö ÓÐ ×     Ò Ø Ò Ö Ð Ñ ×Ñ ÔÖÓ Ð º
       ´··µ
  ½º      × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÓÒרÖÙÝ ÙÒ Ö ÓÐ Ò Ö Ó              Ù×ÕÙ      Ô ÖØ Ö ×Ù
       Ö ÓÖÖ Ó ×Ù¬ Óº
  ¾º        Ó ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ ¸ × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÓÒרÖÙÝ ÙÒ × Ù Ò
            Ò× Ö ÓÒ ÕÙ Ö ÔÖÓ ÙÞ ÙÒ Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ º
  ¿º      × Ò ÑÔÐ ÒØ ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ð ×Ø ÐÓ× Ö Ò Ó× Ð Ú × ÕÙ ÒÓ × Ò Ù ÒØÖ Ò
        Ò Ð Ö Óк
   º      × Ò ÙÒ ÒÓ Ó Ò Ö Ó ÕÙ ¸ Ñ × Ð Ð Ú ¸ Ø Ò ÙÒ ÒÐ                Ó Ð Dlinkº ÅÓ¹
         ¬ÕÙ Ð × ÖÙØ Ò × Ò× Ö ÓÒ Ý Ð Ñ Ò ÓÒ Ò Ö ÓÐ Ò Ö Ó             Ù×ÕÙ Ô Ö ÕÙ
        Ð ÑÔÓ Dlink ÙÒ            ÐÓ× ÜÔÐ ØÓ׺ Ð Ö ÓÖÖ Ó Ð Ð ×Ø           ÓÖÖ ×ÔÓÒ Ö
        Ð Ö ÓÖÖ Ó Ò¬ Ó Ò Ð Ö ÓÐ Ò Ö Óº
   º      × Ò ÙÒ Ú Ö× ÓÒ Ø Ö Ø Ú ¸ × Ò Ù× Ö Ô Ð ¸ Ð ÔÖÓ Ñ ÒØÓ insert in binary search tree()º
4.16. Ejercicios                                                                                              389



   º    × Ò ÙÒ Ú Ö× ÓÒ Ø Ö Ø Ú ¸ × Ò Ù× Ö Ô Ð ¸ Ð ÔÖÓ Ñ ÒØÓ remove from search binary tree()º
   º    × Ò ÙÒ Ú Ö× ÓÒ Ø Ö Ø Ú ¸ × Ò ÙØ Ð Þ Ö Ô Ð ¸ Ð ÔÖÓ Ñ ÒØÓ split key rec()º
   º     Ù ÐÓ× Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ              ÓÖÖ ×ÔÓÒ ÒØ × Ð Ô ÖØ ÓÒ Ð × Ù ÒØ
       Ö ÓÐ × ÙÒ Ð Ð Ú 250
                                                                                         244


                                                                 122                                        279


                         41                                                        203                266           293


                5             49                                   156                214      255      270    291    297


        4           36                            66                       163              245   264


                                             65             73         159    189


                                        63             72


                                   54



   º × Ö ÙÒ Ú Ö× ÓÒ Ð Ð Ñ Ò ÓÒ ÙÒ Ö ÓÐ Ò Ö Ó                    Ù×ÕÙ ÕÙ ¸ Ù Ò Ó
    × ØÖ Ø ×ÙÔÖ Ñ Ö ÙÒ ÒÓ Ó ÓÑÔÐ ØÓ¸ × Ó Ð Þ Ö Ù Ð × Ö Ð ÒÓ Ó × Ð ÓÒ Ö
     ÓÑÓ Ö Þ Ð join exclusive() Ù Ð × × Ö Ò Ð × Ú ÒØ × ×Ø Ò ÓÕÙ
  ¼º × Ò ÙÒ Ú Ö× ÓÒ Ø Ö Ø Ú ¸ × Ò Ù× Ö Ô Ð ¸ Ð ÔÖÓ Ñ ÒØÓ remove from binary tree()º
      ÝÙ Ö Ú × ÐÓ× ÙÒ Ñ ÒØÓ× ÜÔÐ Ó× Ò Ü º º ´Ô Ò ¿ ¾µ¹½º
  ½º ÑÙ ×ØÖ ÕÙ × ÒÓ Ý Ð Ú × ÙÔÐ             ׸ ÒØÓÒ × join() Ý join preorder() ×ÓÒ
     ÕÙ Ú Ð ÒØ ׺ × Ö¸ ÔÖÓ Ù Ò Ü Ø Ñ ÒØ Ð Ñ ×ÑÓ Ö Óк
  ¾º Ù Ð Ö ÓÐ Ò Ö Ó Ö ×ÙÐØ ÒØ Ô Ö Ð × × Ù ÒØ × × Ù Ò × Ò× Ö ÓÒ
       ´    µ    ¾¾¼ ½ ¼¼ ¿½ ¿ ½¾¾¿ ½¿¿ ¿¾ ½ ½¾¼                         ½¼½ ½ ¾ ½ ½¿½ ¿
       ´    µ    ½¾¼ ¾ ¾¼ ½¼¿ ½¼ ¿¿½ ¿½ ¿½ ½¾¼¿ ½¾                           ¼    ½ ¾¾ ½¾¿½
       ´    µ    ½ ¼ ½¾     ¿ ½½ ¿ ½¿ ½ ½¼ ½ ¼                                 ½½       ¿ ½¼
       ´    µ        ¼½ ½          ¿ ½¼¾    ½ ¾ ¾                          ¿ ½½ ¿ ¿
       ´    µ                ½         ½ ¿ ½½ ¾                           ½½½ ¿ ½ ¾¾
       ´    µ    ¿         ½ ½ ¼ ½½½½ ½¾¼ ½½ ½  ¿½                       ½¼½ ¾ ½¼       ½ ½½   ½¿ ¿
  ¿º         Ù      Ð Ö ÓÐ Ò Ö Ó Ö ×ÙÐØ ÒØ Ô Ö Ð × × Ù ÒØ × × Ù Ò ×                               Ò× Ö ÓÒ Ò Ð
       Ö Þ
        ´ µ ¾ ½ ½ ¼ ½ ½ ¿ ¼ ½¾¿ ½¿ ½ ¿¾                           ½ ¾¿½ ½¼       ¾ ½¾ ¼ ½¾½ ¿¾¼
390                                                                       Cap´        ´
                                                                             ıtulo 4. Arboles



       ´    µ     ¼ ¼ ¿ ½½ ¿¾     ½¾ ¿ ½¿¼¿      ¼     ¾¿      ½¾½
       ´    µ   ½ ½ ¿¾¼ ½¼¾ ¼ ¿¾ ¾ ¼ ½½½         ½¾½½ ½¾ ½¼     ½¼ ½¿ ¿
       ´    µ   ¾¼½ ¼ ½½¿ ½¼ ½½ ¾¼¿ ¼ ½ ¾ ¾ ½¿ ¼ ½ ¼          ¾¼ ½
       ´    µ    ¾¼ ¾¾½ ½ ½½ ½¾¼¼ ½¾½ ½¾ ½¼ ½ ½¼ ¿ ½½¾ ¿           ¿ ½¾¿
        ´   µ    ¾ ½¼      ¿ ½¼ ½        ½½¾ ¾½¿      ½ ½½ ½½
  º             Ó× ÐÓ× × Ù ÒØ × Ö ÓÖÖ Ó× ÔÖ ¬ Ó×      Ö ÓÐ × Ò Ö Ó×         Ù×ÕÙ
       ´    µ ½¼ ¿ ½¼¼ ½ ¿ ½¾ ½ ½                       ½    ¿ ½½ ½¿¿¿º
       ´    µ ½½ ¿ ½ ½½ ¾ ¾¾ ½¼ ¼             ¿    ¾¼ ½¼¼¿   ½¿ ½ ½¾ ¼
       ´    µ     ¾ ¾ ¼ ½½ ¾¿¼ ¾ ¼ ¼          ½     ¾ ¼½ ½ ¼ ½¾ ¼ ½½ ½ ¿½
       ´    µ    ¾¼ ½ ¿ ½ ½ ½¿ ¿ ½ ¾ ¾½       ¼    ¼¼ ¼     ½¼ ½ ½ ½¿¾
       ´    µ ½½¾ ¼ ¼ ½½¾¼ ¾ ½¿ ¾ ¾           ¾    ¼ ½      ½½ ¼ ½ ¿ ½¿

       ´µ            Ù Ð Ö ÓÐ ÓÖÖ ×ÔÓÒ ÒØ º
       ´µ           Ð ÙÐ Ð ÁÈĺ
  º             Ó× ÐÓ× × Ù ÒØ × Ö ÓÖÖ Ó× ×Ù¬ Ó×      Ö ÓÐ × Ò Ö Ó×         Ù×ÕÙ
       ´    µ   ½¾¿     ¼      ½¼¼ ¿½ ¿¼¿ ½¾ ¼ ½¿ ¿ ½¿ ¾ ½¾¼ ½ ½¿ ½¼ ¿ ¾¿¼
       ´    µ   ½ ½½   ½¾ ½¼½ ¿ ¾ ½¼ ½¼ ½¼¾ ½¾ ½¾ ½¾ ½½½ ½ ½¿ ¼
       ´    µ         ¼ ½ ½       ½     ½     ¾ ½¼½¿ ½¿ ½ ½ ½¼ ½½ ¾ ½¼¿¾
       ´    µ   ¾¿¼ ¿½ ¿½ ½¼ ¿¿ ¿ ¿                ½ ¿¾ ½½ ¿ ¼½ ½¾ ¿¿
       ´    µ   ¿¼ ¿ ½ ¿     ¿      ½¼ ½¼¼½      ½¾ ½ ½ ¾¾         ¾½ ½¼¿

       ´µ            Ù Ð Ö ÓÐ ÓÖÖ ×ÔÓÒ ÒØ º
       ´µ           Ð ÙÐ Ð ÁÈĺ
       ´µ           ÑÙ ×ØÖ ÕÙ Ð ×ÙÑ ØÓÖ ÔÐ ÒØ           Ò ´ º¿ µ ´Ü º º ´Ô Ò ¿¼ µµ ׸ Ò
                     ØÓ¸ O(n)º
  º ÓÒ× Ö ÙÒ Ô ØÖ Ò Ö Ó ×                    Ö¸ ÙÒ Ö ÓÐ ØÖ Ò Ö Ó ÓÑÔÐ ØÓ ´ ÓÒ Ð ÔÖÓÔ
   ØÖ Ò ÙÐ Öµ Ø Ð ÓÑÓ

                                                               1



                            2                                         3                            4



                5           6            7             8              9              10         11 12 13



      14 15 16         17 18 19     20 21 22       23 24 25    26 27 28           29 30 31   32 33 34
4.16. Ejercicios                                                             391



        ¸ Ñ ×¸ ÓÒ Ð ÔÖÓÔ        ÓÖ Ò Ó × ÕÙ Ô Ö      Ð Ú Ð Ö Óи Ð × Ð Ú ×
         × Ò ÒØ × × ÑÔÖ ×ÓÒ Ñ ÝÓÖ ×º
        ÓÒ× Ö Ð × Ù ÒØ ÓÔ Ö ÓÒ ×Ó Ö ÙÒ ÒÓ Ó Ù ÐÕÙ Ö p ÙÒ Ô ØÖ Ò Ö Ó
              Node *   child(Node * p, int i)

       p¸   ÓÑÓ Ý × Ó¸ × ÙÒ ÒÓ Ó ÙÒ Ô ØÖ Ò Ö Óº i × Ð ÓÖ Ò Ð Ð Ó × Ö
        ´ µ i == 0 Ð Ó Ñ × Ð ÞÕÙ Ö º
        ´ µ i == 1 Ð Ó Ð ÒØÖÓº
        ´ µ i == 2 Ð Ó Ñ × Ð Ö º
       ÈÙ       ×ÙÑ Ö¸ ÙÒÕÙ ×Ó ÒÓ × × Ò Ð Ð ÔÖÓ Ð Ñ ¸ ÕÙ Ò Ù× Ò              ÙÒ Ó
       child() Ö ØÓÖÒ NULLº
         Ð Ó Ø ÚÓ       ר ÔÖÓ Ð Ñ × × Ù Ö Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ò Ù ÒØÖ Ð × Ù Ò
            ÓÖ Ò Ð ×¸ Ô Ö Ñ ØÖÓ× child()¸ Ø Ð × ÕÙ ØÖ Ú × ÐÐ Ñ × ×Ù × Ú × ×
        Ò ÓÒØÖ Ö Ð ÙÐØ ÑÓ Ð Ñ ÒØÓ Ð Ô ØÖ Ò Ö Óº ÈÓÖ ÑÔÐÓ¸ Ô Ö Ð ¬ ÙÖ ÒØ Ö ÓÖ¸
       Ð × Ù Ò × 2, 0, 2¸ Р٠и Ô ÖØ Ò Ó × Ð Ö Þ 1 Ô ÖÑ Ø child(1, 2) = 4
       −→ child(4, 0) = 11 −→ child(11, 2) = 34 Ð × Ù Ð × × Ñ Ó Ò Ò Ð ÒÓ Ó
        Ø ÕÙ Ø Ó ÓÒ 34º
   º       Ò Ö Ð Ð ÔÖÓ Ð Ñ ÒØ Ö ÓÖ Ô Ö      Ô× n¹Ö Ó׺
   º     ÜÔÐ ÕÙ ÓÑÓ ÔÙ ÓÖ Ò Ö× ÙÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ Ñ ÒØ Ð Ô×ÓÖØ
        ÓÒ ÓÒ×ÙÑÓ ×Ô Ó O(1)º
   º     Ò × Ð Ö ­ Ü ÓÒ Ð Ö Ó ÒØ Ö ÓÖ¸ ÑÔÐ ÒØ Ð Ô×ÓÖØ ×Ó Ö Ð ×Ø × Ø ÔÓ
       Dnode<T>º

  ¼º       × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ö ÓÖÖ ÙÒ × Ù Ò        n Ð Ñ ÒØÓ× Ý Ò Ù ÒØÖ ÐÓ× m  n
       Ñ ÒÓÖ × Ð Ñ ÒØÓ׺ ÜÔÐ ÕÙ Ø ÐÐ Ñ ÒØ ÓÑÓ × ÙØ Ð Þ Ð Ô Ô Ö ÓÒØ Ò Ö
       Ý Ñ ÒØ Ò Ö¸ Ü Ø Ñ ÒØ ¸ m Ð Ñ ÒØÓ× Ñ           ÕÙ × Ò×Ô ÓÒ Ð × Ù Ò º
  ½º       × Ò ÙÒ Ì DynArrayHeap<T> ÙÒ Ñ ÒØ Ó Ò Ð Ì DynArray<T>
       ´Ü ¾º½º ´Ô Ò ½µµº × ÙØ ÐÓ× Ø Ñ ÒÓ×            Ù Ó× Ð Ö ØÓÖ Ó¸ × Ñ ÒØÓ Ý
         ÐÓÕÙ º         ÙÒ Ö Ø Ö Ó Ù ÒÓ Ô Ö ÓÖØ Ö Ð ÖÖ ÐÓ Ñ Ò Ö Ø Ð ÕÙ Ð ÓÒ¹
       ×ÙÑÓ Ñ ÑÓÖ × Ñ Ò ÑÓº
  ¾º   ÅÓ ¬ÕÙ Ð Ì BinHeap<Key> Ô Ö ÕÙ                  ÒÓ Ó ÔÖ × Ò   Ð ÔÙÒØ ÓÖ Ð
       Ô Öº
  ¿º   ÅÓ ¬ÕÙ Ð Ì BinHeap<Key> Ô Ö ÔÖ × Ò Ö Ð Ð ×Ø                 Ó ×º ÍØ Ð Ô Ö¹
       Ñ Ò ÒØ Ñ ÒØ ÙÒ × Ù Ò ÕÙ Ð Ö Ù Ð ÒÙÑ ÖÓ                  Û Ý last¸ Ñ Ò Ö
       Ø Ð ÕÙ        ÑÓ ¬ ÓÒ Ð Ô Ð Ù× Ô Ö Ù Ö ÐÓ× ÒÓ Ó× ØÙ Ð Þ Öº
   º       ÑÙ ×ØÖ ÔÓÖ Ò Ù ÓÒ ÕÙ ÙÒ Ô n ÒÓ Ó× Ø Ò n/2 Ó ×º
   º      ÓÒ× Ö ÙÒ Ð ×Ø ÒÐ Þ Ö ÔÖ × ÒØ Ñ ÒØ Ð Ì Dnode<int>º ÓÒ× Ö
       Ð × Ù ÒØ ÒØ Ö Þ
392                                                                           Cap´        ´
                                                                                 ıtulo 4. Arboles



        Dnode<int> * los_mas_grandes(Dnode<int> & l, int m)

       Ä Ù Ð Ö ØÓÖÒ ÙÒ ÒÙ Ú Ð ×Ø ÓÒØ ÒØ Ú       Ð × ÓÔ × ÐÓ× m Ñ ÝÓÖ × ÒÙÑ ÖÓ×
        ÐÑ Ò Ó× Ò lº
         × Ò ÒרÖÙÑ ÒØ Ð ÖÙØ Ò Ò Ù ×Ø ÓÒ Ð Ñ Ò Ö Ñ × ¬ ÒØ × Ò ÕÙ ×
       Ø Ò ÕÙ ÓÖ Ò Ö Ð Ð Ð ×Ø º
   º     × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ØÓÑ ÓÑÓ ÒØÖ        Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó Ò¬ Ó ÙÒ Ö ÓÐ
       Ý Ö ØÓÖÒ ÓÑÓ × Ð Ð Ö ÓÖÖ Ó ÔÓÖ Ò Ú Ð ×º ÆÓ ×          ÓÒרÖÙ Ö Ð Ö Óк
   º     × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ö      ÓÑÓ ÒØÖ      Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó ÙÒ Ö ÓÐ Ò Ö Ó
            Ù×ÕÙ Ý Ö ØÓÖÒ ×Ù ÁÈĺ ÆÓ ×       ÓÒרÖÙ Ö Ð Ö Óк
   º     × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ö      ÓÑÓ ÒØÖ       Ð Ö ÓÖÖ Ó ×Ù¬ Ó ÙÒ Ö ÓÐ Ò Ö Ó
            Ù×ÕÙ Ý Ö ØÓÖÒ ×Ù ÁÈĺ ÆÓ ×       ÓÒרÖÙ Ö Ð Ö Óк
   º     × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ù ÒØ Ð ÒØ           ÒÓ Ó× Ò Ð i¹ × ÑÓ Ò Ú Ð ÙÒ Ö ÓÐ
         Ò Ö Óº ´·µ
  ¼º     × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ù ÒØ Ð ÒØ              ÒÓ Ó× Ò ÓÑÔÐ ØÓ× ÒÓ Ó × ÙÒ
        Ö ÓÐ Ò Ö Óº
  ½º     × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ù ÒØ Ð ÒØ            ÒÓ Ó× ÐÐ ÒÓ× ÙÒ Ö ÓÐ Ò Ö Óº
  ¾º   ËÙÔÓÒ ÕÙ         ÒÓ Ó ÔÓ× ÙÒ ÑÔÓ        ÓÒ Ð nextº × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ
        ÒÐ ØÓ Ó× ÒÓ Ó× Ð Ö ÓÐ × ÙÒ Ð Ö ÓÖÖ Ó Ò¬ Óº
  ¿º   È Ö ÐÓ× × Ù ÒØ × Ô Ö × Ö ÓÐ × Ö ÔÖ × ÒØ Ó× ÓÒ ×Ù× Ö ÓÖÖ Ó× ÔÖ ¬ Ó׸ ÓÒ×¹
       ØÖÙÝ Ð Ö ÓÐ ÔÖÓ Ù ØÓ Ð ÓÔ Ö ÓÒ join()º
        ´ µ     ¯   ½      ¾ ¾¾ ¿            ½          ½¾¿ ½¼ ½¾¾
                ¯     ½¿     ¾½ ¿¿ ¼ ½¾               ¾ ½¼ ½¾ ½ ¿
        ´ µ     ¯   ½¾ ¾ ¾¿ ¾¼ ½ ½½ ¾½ ½¼ ¾ ¿½ ½ ¼ ½¾½ ½¾
                ¯   ¿¿ ¾ ½ ½½                ¾     ¼ ½½¼ ½¼ ½ ½ ¾
        ´µ      ¯   ½¾ ¾ ¾ ¿¾ ½¾¿ ½¼¼         ½ ¼ ¿ ½¼ ½½ ½¿ ½¿
                ¯    ¾ ¿ ¿½ ¾        ½ ½¿½ ½½¼       ½¼ ½½ ½¾ ½ ¿
        ´ µ     ¯    ¼ ½¿ ½½ ½ ¾ ½¾¾           ¿          ½½ ½
                ¯   ¿¿ ¾¿ ¾¾ ¾ ½ ¾½ ¿ ¿            ¿ ½¼ ½½ ½¿
        ´µ      ¯    ½½       ¾ ½¼½     ¾        ¼ ½ ½¼ ½½ ½¿
                ¯     ½¾        ¾¿    ½ ½¾¿ ½¼¿ ½ ½½ ½¾ ½ ¼
        ´µ      ¯   ½¾¿       ½ ¿¿ ½½¾        ¼ ½¼ ½¼ ½¼ ½¾½ ½¾¾ ½
                ¯      ¾¼ ½ ¾ ¿ ½¿             ¾ ½ ½¼         ½ ¾
   º          Ó× 2 Ö ÓÐ × Ò Ö Ó× T1 Ý T2¸ ×    ¬Ò Ð Ö Ð ÓÒ × × Ñ ØÖ Ó ¸ ÒÓØ                       ÓÑÓ
       T1      T2 ÓÑÓ
                         T1 = T2 = ∅ =⇒ T1     T2      ∨
       T1     T2 ⇐⇒
                         T1 = T2 = ∅ =⇒ ∗ Ö   Þ(T1 )   ∗Ö   Þ(T2 ) ∧ Ä(T1 )    Ê(T2 ) ∧ Ä(T1 )   Ê(T2 )

         × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ØÓÑ               ÓÑÓ ÒØÖ           Ó× Ö ÓÐ × Ý          Ø ÖÑ Ò × ×ÓÒ
       × Ñ ØÖ Ó׺
4.16. Ejercicios                                                            393



   º × Ò ÑÔÐ ÒØ ÙÒ Ú Ö× ÓÒ Ø Ö Ø Ú ¸ × Ò Ù× Ö Ô Ð ¸ Ð Ð ÓÖ ØÑÓ inorder position()º
   º ÅÓ ¬ÕÙ Ð ÔÖ Ñ Ø Ú insert in pos() ÜÔÐ               Ò Ü º½½º¿ ´Ô Ò ¿ µ Ô Ö ÕÙ
     Ú Ð ÕÙ Ð Ð Ú Ð ÒÓ Ó Ò× ÖØ Ö ÒÓ Ú ÓÐ Ð ÔÖÓÔ                      ÓÖ Ò ÙÒ     º
   º × Ò ÙÒ Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓ ÕÙ Ð ÙÐ Ð ÔÓ× ÓÒ Ò¬                   ÙÒ Ð Ú Ð Ö Óк
   º     Ó ÙÒ Ö ÓÐ Ò Ö Ó      Ù×ÕÙ      ÓÒ Ö Ò Ó× Ý ÙÒ Ð Ú            Ù×ÕÙ ¸ × Ò ÙÒ
      Ð ÓÖ ØÑÓ ÕÙ Ö ØÓÖÒ Ð ÔÓ× ÓÒ Ò¬           Ð Ð Ú × ×Ø × Ò Ù ÒØÖ Ò Ð Ö Óи Ó
     Ð ÔÓ× ÓÒ Ò¬ ÕÙ ØÓÑ Ö Ð Ð Ú ×ÔÙ × Ð Ò× Ö ÓÒº
   º ÁÑÔÐ ÒØ ÙÒ Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓ ÕÙ Ö Ð Ð ÙÒ ÓÒ Ò Ö Ð                 Ó×    º
½¼¼º ÁÑÔÐ ÒØ ÙÒ Ð ÓÖ ØÑÓ Ø Ö Ø ÚÓ¸ ÕÙ ÒÓ Ù× Ô Ð ¸ ÕÙ Ö Ð Ð ÙÒ ÓÒ Ò Ö Ð Ó×
            º
½¼½º × Ò ÙÒ Ì         × Ó Ò Ö ÓÐ × ÓÒ Ö Ò Ó ÕÙ ÑÓ Ð ÖÖ ÐÓ× ¬ ÒØ ׺
½¼¾º × Ò ÙÒ Ú Ö× ÓÒ Ø Ö Ø Ú ¸ × Ò Ù× Ö Ô Ð ¸ Ð Ð ÓÖ ØÑÓ split key rec() Ý ÕÙ
      Ð Ö ÓÐ ÒØ ØÓ × Ð Ð Ú Ý × Ò Ù ÒØÖ Ò Ð Ö Óк ´··µ
½¼¿º × Ò ÙÒ Ú Ö× ÓÒ Ø Ö Ø Ú             Ð ÙÒ ÓÒ split pos rec() ÜÔÐ                Ò
     Ü º½½º ´Ô Ò ¿ µº

½¼ º × Ò ÙÒ ÖÙØ Ò ÕÙ Ù×ÕÙ ÙÒ Ð Ú Ò ÙÒ Ö ÓÐ Ò Ö Ó Ý¸ Ò ×Ó Ò ÓÒØÖ ÖÐ ¸
     ÖÓØ Ð ÒÓ Ó ×Ø Ð Ö Þº
½¼ º ÑÙ ×ØÖ ÕÙ Ð Ö ÓÐ Ò Ö Ó ÔÖÓ Ù Ó ÔÓÖ insert in binary search tree()
      ÓÒ Ð × Ù Ò       Ò× Ö ÓÒ S =< k1, k2, . . . , kn > × Ü Ø Ñ ÒØ Ù Ð Ð ÔÖÓ Ù Ó
     ÔÓÖ insert root() ×Ó Ö Ð × Ù Ò ÒÚ ÖØ S =< kn, kn−1, . . . , k1 >º
½¼ º × Ò ÙÒ Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓ¸ × Ó Ò ÖÓØ ÓÒ ×¸ ÕÙ Ö Ð Ð Ò× Ö ÓÒ ÔÓÖ Ð
     Ö Þ Ò ÙÒ      º Ð Ð ÓÖ ØÑÓ         Ù× Ö Ð ÒÓ Ó ÜØ ÖÒÓ ÕÙ Ð Ö Ö Ð ÒÙ ÚÓ
     ÒÓ Ó Ý ×ÔÙ × ÖÓØ Ö Ö ÙÖ× Ú Ñ ÒØ ×Ù Ô Ö ×Ø ÕÙ ×Ø Ú Ò Ò Ö Þº
½¼ º ´Sugerido por Andr´s Arciaµ ÜÔÐ ÕÙ Ð ÓÔ Ö ÓÒ ÕÙ Ö Ð Þ Ð × Ù ÒØ
                           e
     ÖÙØ Ò
             Node * program(Node * root)
             {
               if (root == NullPtr)
                 return NullPtr;
               while (RLINK(root) != NullPtr)
                 root = rotate_to_left(RLINK(root));
               program(LLINK(root));
               return root;
             }


½¼ º  × Ò ÙÒ ÖÙØ Ò ÕÙ × Ð ÓÒ ÙÒ ÒÓ Ó Ò Ð i¹ × Ñ ÔÓ× ÓÒ Ý ÐÓ ÖÓØ Ð ÒÓ Ó
      ר Ð Ö Þº
½¼ º ÑÙ ×ØÖ ÕÙ Ð × ÔÖ Ñ Ø Ú × insert root rec() Ý insert root() × ÑÔÖ ÔÖÓ¹
     Ù Ò Ö ÓÐ × ÕÙ Ú Ð ÒØ ׺
394                                                              Cap´        ´
                                                                    ıtulo 4. Arboles



½½¼º        Ó ÙÒ Ö ÓÐ Ò Ö Ó         Ù×ÕÙ Ý Ð Ð ÓÖ ØÑÓ            Ò× Ö ÓÒ ÔÖ × ÒØ Ó Ò
       Ü   º º¿ ´Ô Ò ¿¿ µ¸ Ð ÙÐ Ð Ú Ö ÒÞ ×Ó Ö Ð ÒÙÑ ÖÓ ÒÓ Ó× Ú × Ø Ó× Ò ÙÒ
         Ù×ÕÙ º ´··µ
½½½º    ÈÓÖ ÕÙ Ð Ú ÐÓÖ Node::MaxHeight = 80 ×              Ù Ó Ô Ö Ö ÓÐ × Ò Ö Ó×
         Ù×ÕÙ
½½¾º        Ó ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ Ý Ð Ð ÓÖ ØÑÓ Ò× Ö ÓÒ Ò Ð Ö Þ ÔÖ × ÒØ Ó
        Ò Ü º º ´Ô Ò ¿ ¿µ¸ Ð ÙÐ Ð × ×Ô Ö ÒÞ × Ý Ú Ö ÒÞ × Ð × ÒØ              × ÒÓ Ó×
       Ú × Ø Ó× Ò Ù×ÕÙ × Ü ØÓ× × Ò ÖÙ ØÙÓ× ×º ´··µ
½½¿º        Ó ÙÒ        ¸ × Ò ÙÒ Ð ÓÖ ØÑÓ ¬ ÒØ ÕÙ ÜØÖ ÙÒ Ö Ò Ó Ð Ú × ÒØÖ
       i Ý j¸ j > iº ´··µ

½½ º        Ó× Ó× Ö ÓÐ ×         A1 Ý A2¸ × Ò ÙÒ Ð ÓÖ ØÑÓ ¬ ÒØ ÕÙ Ò× ÖØ A1
       Ô ÖØ Ö Ð ÔÓ× ÓÒ i A2º
½½ º     ÓÒ× Ö Ð ÔÖ Ñ Ø Ú remove by pos() ÜÔÐ             Ò Ü º½½º ´Ô Ò ¿ ¼µº × Ò
       ÙÒ Ú Ö× ÓÒ ×          Ò Ð Ñ Ò ÓÒ Ð Ö Þ Ý ÓÒ Ø Ò ÓÒ ÐÓ× ×Ù Ö ÓÐ ×
       Ö ×Ø ÒØ ׺
½½ º   ÅÓ ¬ÕÙ ÐÓ× Ð ÓÖ ØÑÓ× Ò× Ö ÓÒ¸ Ð Ñ Ò ÓÒ¸ ÓÒ Ø Ò ÓÒ Ý Ô ÖØ ÓÒ Ô Ö
       ÕÙ ÙÒ ÓÒ Ò Ò Ö ÓÐ × Ò Ö Ó×           Ù×ÕÙ      ÜØ Ò Ó׺
½½ º      × Ò ÙÒ Ð ÓÖ ØÑÓ Ø Ö Ø ÚÓ ¬ ÒØ ÕÙ           ØÙ Ð ÓÒ Ø Ò ÓÒ          Ó× Ö ÓÐ ×
          Ò Ö Ó׺ ´·µ
½½ º      × Ò ÙÒ Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓ ¬ ÒØ ÕÙ           ØÙ Ð ÙÒ ÓÒ      Ó× Ö ÓÐ × Ò Ö Ó׺
½½ º      × Ò ÙÒ Ð ÓÖ ØÑÓ Ø Ö Ø ÚÓ ¬ ÒØ ÕÙ          ØÙ Ð ÙÒ ÓÒ       Ó× Ö ÓÐ × Ò Ö Ó׺
       ´·µ
½¾¼º      × Ò ÙÒ Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓ ¬ ÒØ ÕÙ             ØÙ Ð ÒØ Ö× ÓÒ         Ó× Ö ÓÐ ×
          Ò Ö Ó׺
½¾½º      × Ò ÙÒ Ð ÓÖ ØÑÓ Ø Ö Ø ÚÓ ¬ ÒØ ÕÙ            ØÙ Ð ÒØ Ö× ÓÒ          Ó× Ö ÓÐ ×
          Ò Ö Ó׺ ´·µ
½¾¾º      × Ò ÙÒ Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓ ¬ ÒØ ÕÙ          ØÙ Ð      ÖÒ        Ó× Ö ÓÐ × Ò ¹
       Ö Ó× T1 ÝT2º ×ØÓ ×¸ T1 − T2     Ö ØÓÖÒ Ö Ð Ö ÓÐ Ò Ö Ó T1 Ü ÔØÓ ÕÙ ÐÐ × Ð Ú ×
       ÕÙ × Ò Ù ÒØÖ Ò Ò T2º
½¾¿º     × Ö ÙÒ ÔÖÓ Ö Ñ ÕÙ Ò× ÖØ Ð × n Ð Ú × Ñ Ò Ö ÕÙ Ð Ö ÓÐ ÕÙ                  ÕÙ Ð ¹
         Ö Óº ´·µ
½¾ º     Ò Ù ÒØÖ ÙÒ ÜÔÖ × ÓÒ Ò Ð Ø ÕÙ Ò Ö Ð ×Ù × ÓÒ Ò× Ö ÓÒ × Ô Ö ÕÙ Ð
        Ö ÓÐ ÕÙ       ÕÙ Ð Ö Óº ´··µ
       Ayuda: ÓÒ× Ö n = 2k ×            Ö¸ n × ÙÒ ÔÓØ Ò Ü Ø            Ó׺
½¾ º   Ê Ð ÙÒ Ð ÓÖ ØÑÓ ÕÙ           ØÙ Ð ÙÒ ÓÒ       Ó× Ö ÓÐ × Ò Ö Ó×      Ù×ÕÙ     ܹ
       Ø Ò Ó׺ Ð Ö ÓÐ Ö ×ÙÐØ ÒØ ÒÓ          Ø Ò Ö Ð Ú × Ö Ô Ø ×º
4.16. Ejercicios                                                                                                                 395



            ½¾ º Ê Ð ÙÒ Ð ÓÖ ØÑÓ ÕÙ         ØÙ Ð ÒØ Ö× ÓÒ Ó× Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ
                  ÜØ Ò Ó׺ Ð Ö ÓÐ Ö ×ÙÐØ ÒØ ÒÓ       Ø Ò Ö Ð Ú × Ö Ô Ø ×º
            ½¾ º ÅÓ ¬ÕÙ Ð × ÖÙØ Ò × insert root rec() insert root() ÔÖ × ÒØ × Ò º º Ô Ö
                 ÕÙ Ñ Ò Ò Ö ÓÐ × Ò Ö Ó× ÜØ Ò Ó׺
            ½¾ º     ØÙ Ñ         ×   Ö Ò Ñ ÒØÓ Ô Ö ØÓ Ó× ÐÓ× Ö ÓÖÖ Ó× ÑÔÐ ÒØ Ó× Ò
                 BinNode Utilsº     ÙÒ Ö ÔÓÖØ Ø ÐÐ Ó ×Ù× ÜÔ Ö Ñ ÒØÓ× ÕÙ × Ò Ð ÔÓÖ
                 Ú Ö× ÓÒ Ö ÓÖÖ Ó Ð ÒÙÑ ÖÓ ÒÓ Ó× Ý Ð Ø ÑÔÓ ØÓØ Ð Ö ÓÖÖ Óº
            ½¾ º × Ò ÑÔÐ ÒØ ÙÒ Ø ÔÓ ×ØÖ ØÓ              ØÓ ÕÙ Ö ÔÖ × ÒØ ÙÒ Ö ÓÐ Ò Ö Ó ÕÙ
                 Ó ÙÔ ×Ô Ó Ñ Ò ÑÓº × Ö¸ Ð ÑÔÐ ÒØ ÓÒ                Ö Ñ Ò Ö ÐÓ× ØÖ × Ø ÔÓ×
                 ÒÓ Ó× × Ò Ð Ó× Ò Ü º º½ ´Ô Ò ¾ µ¹½ ÓÑÔÐ ØÓ¸ Ò ÓÑÔÐ ØÓ Ý Ó º
            ½¿¼º × Ò ÙÒ Ì           Ù×Ó Ò Ö Ð ÕÙ ÑÓ Ð Ö ÓÐ × n¹Ö Ó× × Ó× Ò Ð Ì
                 DynArray<T>º

            ½¿½º       × n Ð Ú ×¸ ÑÙ ×ØÖ ÕÙ Ü ×Ø Ò n(n ) Ö ÓÐ × Ò Ö Ó× Ö ÒØ × ÕÙ ÐÑ ¹
                                                      2
                                                                                     1


                 Ò Ò Ð × n Ð Ú ×º
            ½¿¾º     Ó Ð × Ù ÒØ Ö ÓÐ ÀÙ«Ñ Ò

                                                       539


                                           217                                                                                                          322


            103                                 114                                                                 143                                              179


           48          55                      55     59                                                       68         75                                  88          91
                                                e

 24        24     26        29                      29 30                                        33                35 37 38                                  44    44
            l                                        i o                                                            r s                                       a

12    12        13 13 14                  15                16                                                17          18                        20            21 23
 d               m t                                                                                                      u                                        n n

     6 6                7 7       7        8                8                    8                    8        9               10                       10
     b q                . f                ,                g                                                  p                                        y

                              3       4                                 4                4        4       4                    5                5
                              v                                                                   D                            c

                                  2 2                               2       2        2       2        2 2                               2           3
                                  o u
                                  ´ ´                                                                 E L                                           h

                                                                1 1 1 1 1 1 1 1                                                     1       1
                                                                T R ´ ´ S ´ J B
                                                                    a ı   e                                                                 x

                                                                                                                                   0 1
                                                                                                                                   ¬ P


                        Ó ¬ÕÙ Ð × Ù ÒØ                          Ò           Ø×
                  ½¼¼¼½¼½¼¼¼¼½½½½¼½¼½½¼½½½½¼¼¼¼½¼¼¼½½½½¼¼½½½¼¼¼¼¼¼¼¼½½½½½¼½¼½½¼½¼½¼¼
                  ¼½¼½½½¼½½¼½½¼½½½½¼¼½¼½¼¼¼½½½½½½½¼¼½¼¼½½¼¼½¼¼½¼¼½½¼½¼½½¼¼¼¼½¼½¼½¼½¼
396                                                               Cap´        ´
                                                                     ıtulo 4. Arboles



      ¼¼½½½½½½½¼½½¼½½¼½½½¼½¼¼¼½¼½½¼¼½½¼½½¼¼¼½¼¼¼½¼½½¼½½¼¼½¼½¼½½½½¼½¼¼¼½½

      ½½½½½½¼¼½¼½½½½¼½¼½½¼¼½¼½¼¼¼½½½½½½¼½¼¼¼¼½½¼¼¼¼½¼½¼¼¼½¼¼½¼¼¼½½½½¼¼½¼

      ¼½½½¼¼½¼½¼½½½½¼½½½½½½½¼¼¼½½½¼¼½½½¼¼¼½½¼¼¼¼½¼½½½½¼½½¼½¼½½¼¼½½½¼¼¼¼¼
      ¼½¼½½½½¼¼¼½¼¼½¼½½¼½¼¼½¼½¼½¼¼½¼½½½¼¼½½½½½½¼½¼¼¼¼½½½¼¼½¼½¼½½½½½¼½½½¼

      ½½¼¼½¼¼¼½½½¼¼¼½¼½½½½¼½½½¼¼¼½½¼¼¼½½¼½½¼¼½½½¼¼½¼½¼½½½½¼½½½½½½½¼½¼¼¼¼

      ½½½½½¼½½½¼¼½½¼¼¼¼½¼¼¼¼¼¼½¼¼½½¼½½¼¼½½¼½½¼¼½¼½¼½¼½½½½¼½½½¼¼¼½¼½¼¼½¼½
      ½½¼¼½½½½½½¼½¼¼¼¼¼¼¼½¼¼¼¼¼½¼¼½½½½½½¼¼½½¼½¼½½¼½½¼½½½¼¼¼¼¼¼½½¼½¼¼½½½½
      ¼¼¼¼½½½¼½½¼¼½¼½½½¼½¼½¼½½½¼½¼½¼½½¼½¼½¼¼¼½¼½¼½¼½½¼½½½½½¼½¼½¼½¼½½¼¼½¼

      ½¼½½½½¼½½½¼¼¼½½½½¼½¼½½¼¼½¼½¼¼¼½½¼¼½½¼½¼½½¼½¼½¼¼¼½¼¼¼½¼¼¼¼¼½¼¼½½½½½
      ½¼¼½½¼½¼½½¼½½¼½½½¼¼¼¼¼¼½½¼½¼¼½½½½¼¼¼¼½½½¼½½¼¼½¼½½½¼½¼½½¼½½½½½¼½¼¼¼

      ¼½½½½½¼¼¼½½½½¼¼½¼½¼½½¼¼¼¼¼¼¼¼½½½½½½¼¼½½¼½½¼½½¼¼½¼½¼¼½¼½½½½½¼½½½½¼½
      ¼½¼½½½¼½¼¼½¼½¼½¼¼½½¼½¼½¼¼¼¼½½¼½½¼¼¼½½¼½½½¼¼¼½¼½½¼½¼½¼½½½½¼½½½½½½½½

      ¼¼¼¼½¼¼½¼½½½¼¼½¼¼½½¼¼½½½½¼½½½½½½½¼¼¼¼½½½¼½½¼¼½¼½½½½¼½½¼½½¼½½½½¼¼½½

      ½½½¼¼½¼¼½¼½¼½½¼½½½½¼¼½½¼½¼½¼½¼½¼½½¼¼¼½¼½¼½½¼¼¼¼½½½½¼¼½¼¼¼½½¼¼¼¼¼¼¼
      ½½¼¼¼½½½¼½¼½½½¼¼¼½½½¼¼½½½½¼½¼½¼½½¼¼½¼½¼¼½¼¼½¼½¼½¼½½½¼¼¼¼¼¼½¼½½½¼¼¼

      ½½½¼¼½½½½½¼¼¼¼¼½¼¼½¼¼¼½¼½½¼½½½½¼¼½½¼½¼¼¼¼¼½½½¼½½¼¼½¼½½½¼¼¼½¼½½½½¼½
      ¼½½½½¼½¼¼½½¼½¼¼¼¼¼¼¼¼½¼½½½½¼½¼½½½¼¼¼¼¼¼½¼½½½½¼½½½¼½½¼½½¼¼½¼½¼¼½½¼¼

      ½¼½½½½½½¼¼¼¼¼¼½¼½¼½¼½¼½½½¼½½¼½½¼½¼½½½¼¼¼½½¼¼½¼½¼¼½¼½½½½½¼½½¼¼½½¼¼½

      ½¼½¼½½¼½¼½¼¼¼½¼¼¼½¼¼¼¼¼½¼¼½½½½½½¼¼½½¼½¼½½¼½½¼½½½¼¼¼¼¼¼½½¼½¼¼½½½½¼¼
      ¼½½½¼¼½¼½¼½½½½½¼¼½¼¼½¼¼½¼¼½½¼¼½¼½¼½½½½¼½½½½½½½¼¼¼½½½¼¼½½½½¼¼¼½½¼½½

      ¼½¼¼½½½¼¼½½¼½¼¼¼¼¼¼¼½¼½½½¼¼¼½½½¼¼½½½¼½¼½¼¼¼½½¼½½½½¼¼¼½½¼½¼½¼½½½½½½

      ¼¼½½½½¼½½½½½½½¼¼¼½¼½½½½¼½¼½½½½¼¼¼½½¼½¼½¼½¼½½¼¼¼¼¼¼¼¼½½½½¼½¼½½½¼¼½¼

      ¼½½¼¼½¼¼½¼½¼½¼½¼½½¼½¼¼¼¼¼½½½¼½½¼¼½¼½½½½¼¼½¼½½½¼½¼½½¼½½½½½¼¼¼¼¼¼½¼½

      ½½¼¼¼½½½¼¼½½½¼¼½¼½¼½½¼¼½¼½¼¼½½¼¼½½½¼¼½½½¼¼¼½¼½½½½¼½¼½½½½¼¼¼½½¼½½¼¼
      ¼¼½½½¼¼½¼¼½¼½¼½¼½¼¼¼½½¼¼½½¼½¼½½¼½¼½¼¼¼½¼¼¼½¼¼¼¼¼½¼¼½½½½½½¼¼½½¼½¼½½

      ¼½½¼½½½¼¼¼¼¼¼½½¼½¼¼½½½½¼¼¼¼½½½¼½½¼¼½¼½½½½¼½½½¼½½½½¼¼½¼½½½½½½½¼½½½¼

      ¼½¼½½¼¼½¼½½½½¼½¼¼¼½½¼¼½½½½¼¼¼½¼½¼½¼½¼½½½¼¼½¼¼¼½¼½½¼½½¼¼½¼½¼½½¼½¼¼½

      ½½¼¼¼¼½½¼¼½½¼½¼½¼¼¼¼½½¼¼¼¼½½½¼½¼¼¼¼½¼½½½½½½¼¼½¼½¼¼½½½¼½½½½½¼½¼½¼¼½

      ¼½¼½¼½¼¼¼½½¼¼½½½½¼¼¼¼½¼¼¼¼¼½½½¼½½¼¼½½½½½½½¼¼½¼¼¼½½¼½½½¼¼¼¼¼¼½¼½¼½¼

      ¼¼½½½¼¼¼½¼½½¼½½¼¼½¼½½¼½½¼½¼¼½½½¼¼½½¼½¼½¼½½½½½½½¼¼½¼¼¼½½¼½½½¼¼½½½¼¼
      ¼½¼½½¼½½¼¼½¼½½¼½½¼½¼¼½½½¼¼¼¼½½½½½½½¼½½¼½½¼½½½½¼¼½¼¼¼¼¼¼½½½¼¼½¼½½½¼

      ¼¼¼¼¼½¼¼¼¼½¼½¼½½½½¼½½½½½½½½¼¼¼½½½¼½½¼½¼¼½½½¼¼¼¼½½¼¼½½¼½¼½½¼½¼½½½½½
      ½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½¼¼¼¼½½½¼¼½½½½¼¼½½¼¼¼¼¼¼½¼½½½½¼¼¼½¼

      ½½½¼½½¼¼½½¼½¼½¼½½½½¼¼¼¼½½½½¼½½½½¼¼½½¼¼¼¼¼¼½¼½¼½¼½½¼½¼½¼½½½¼½¼¼¼


½¿¿º Ë S ÙÒ × Ù Ò Ó ¬           × ÙÒ Ð Ð ÓÖ ØÑÓ ÀÙ«Ñ Òº × Ò ÙÒ Ð ÓÖ ØÑÓ
     ÕÙ Ð Ð × Ù Ò ¸ ר Ò ÐÓ× ÔÖ ¬ Ó× ×Ø ÒØÓ× Ý Ö ØÓÖÒ Ð Ö ÓÐ ÀÙ«Ñ Ò
      ÓÖÖ ×ÔÓÒ ÒØ ÐÓ× ÔÖ ¬ Ó׺ ´·µ
½¿ º Ù Ð × Ð ÕÙ Ú Ð Ò ÒØÖ ÙÒ Ô Ð Ö              Ý ÙÒ ÒÙÑ ÖÓ   ÛÝ
½¿ º Ð ÙÐ Ð Ö ÓÐ ÓÔØ ÑÓ Ô Ö ÐÓ× × Ù ÒØ × ÓÒ ÙÒØÓ× Ð Ú × Ý ÔÖÓ Ð    ×
      ´ µ 10 17 30 31 63 68 74 80 88 93 99 103 114 143 14
          0.00003 0.00046 0.00320 0.01389 0.04166 0.09164 0.15274 0.19638 0.19638 0.15274
          0.09164 0.04166 0.01389 0.00320 0.00046
      ´ µ 17 39 42 53 54 66 75 85 89 90 96 98 115 119 143
          0.00047 0.00470 0.02194 0.06339 0.12678 0.18594 0.20660 0.17708 0.11806 0.06121
          0.02449 0.00742 0.00165 0.00025 0.00002
4.16. Bibliograf´
                ıa                                                                    397



       ´ µ 6 8 12 40 59 62 65 69 90 103 109 118 128 134 138
           0.00475 0.03052 0.09156 0.17004 0.21862 0.20613 0.14724 0.08113 0.03477 0.01159
           0.00298 0.00058 0.00008 0.00001 0.00000
       ´ µ 18 21 34 41 53 54 56 57 65 77 98 104 122 124 131
           0.00000 0.00000 0.00001 0.00008 0.00058 0.00298 0.01159 0.03477 0.08113 0.14724
           0.20613 0.21862 0.17004 0.09156 0.03052

½¿ º     Ð ÙÐ Ð × ×ØÖ Ù ÓÒ × ÔÖÓ Ð Ô Ö                 ÙÒÓ ÐÓ× Ö ÓÐ × Ð ÔÖ ÙÒØ
      ÒØ Ö ÓÖº
½¿ º ÄÓ× Ö ÓÐ × ×Ø Ø Ó× ÓÔØ ÑÓ× ÔÖ × ÒØ Ó× Ò Ü º½ ´Ô Ò ¿ µ ×ÙÑ Ò ÕÙ Ð ×
      Ð Ú × Ù× Ö × ÑÔÖ ×Ø Ò ÔÖ × ÒØ ׺ ÓÒ× Ö Ð ÔÖÓ Ð Ñ               ÓÒרÖÙ Ö ÙÒ Ö ÓÐ
     ÓÔØ ÑÓ ÓÒ × ÔÓ× Ð            ØÙ Ö Ù×ÕÙ × Ò ÖÙ ØÙÓ× ×º × ×Ø ×Ó¸ × ¬Ò ÙÒ
      ÖÖ ÐÓ         ÓÒ Ð q     Ñ Ò× ÓÒ n + 1 ÓÒ          qi Ö ÔÖ × ÒØ Ð ÔÖÓ     Ð
          ÕÙ ÙÒ Ð Ú         Ù×ÕÙ     ר ÓÑÔÖ Ò        ÒØÖ ki Ý ki+1 Ø Ð ÕÙ i=1 pi +
                                                                              n
        n
        i=0  qi = 1º

      ´ µ È Ö ×Ø Ú Ö ÓÒ Ð ÔÖÓ Ð Ñ ¸ ¬Ò Ð ÐÓÒ ØÙ Ð Ñ ÒÓ ÔÓÒ Ö º
      ´ µ ÅÓ ¬ÕÙ Ð Ð ÓÖ ØÑÓ ÔÖ × ÒØ Ó Ò Ü º½ ´Ô Ò ¿ µ Ô Ö ÕÙ × ÓÒ× Ö Ò
             Ù×ÕÙ × Ò ÖÙ ØÙÓ× ×º
              ÝÙ      ÓÒ× Ö ÕÙ Ð Ù×ÕÙ Ò ÖÙ ØÙÓ× × Ö Ð Þ                   ÙÒ ÒÓ Ó Ü¹
            Ø ÖÒÓº ´·µ
½¿ º ´Tomado y traducido de Lewis-Denenberg [14]µ Ë ÙÒ ÐÓ× Ø ÖÑ ÒÓ× ÔÖ × ÒØ ¹
       Ó× Ò Ü º½ ´Ô Ò ¿ µ¸ × TREE(j,k)¸ 1 ≤ j ≤ k ≤ n¸ Ð Ö Þ Ð Ö ÓÐ Ò Ö Ó
     ÓÔØ ÑÓ Ô Ö Ð ÓÒ ÙÒØÓ Ð Ú × kj, . . . , kkº
      ´ µ ÑÙ ×ØÖ ÕÙ × 1 ≤ j ≤ k ≤ n¸ ÒØÓÒ × Ü ×Ø Ò Ö ÓÐ × ÓÔØ ÑÓ× Ø Ð ÕÙ
            TREE(j,k - 1) ≤ TREE(j,k) ≤ TREE(j,k)º ÁÒØÙ Ø Ú Ñ ÒØ ¸ ×ØÓ ÕÙ Ö         Ö
            ÕÙ Ò Ö ÙÒ ÒÙ Ú Ð Ú Ð ÜØÖ ÑÓ Ö Ó Ð × Ù Ò ÒÓ Ù× ÕÙ
            Ð Ö Þ Ð Ö ÓÐ ÓÔØ ÑÓ × ×ÔÐ              Ð Ö º Ò ÐÓ Ñ ÒØ ¸ ×Ù            ÐÓ
            Ñ ×ÑÓ × Ð Ð Ú × Ò× ÖØ ÔÓÖ Ð ÜØÖ ÑÓ ÞÕÙ Ö Óº
      ´ µ ÑÙ ×ØÖ ÕÙ Ð Ù×ÕÙ             Ð ×Ù Ö ÓÐ ÓÔØ ÑÓ × Ö ×ØÖ Ò      TREE(j,k - 1)
            ≤ TREE(j,k) ≤ TREE(j,k)¸ ÒØÓÒ ×¸ Ô Ö        Ú ÐÓÖ i Ð Ð ÓÖ ØÑÓ ÔÖ × Ò¹
            Ø Ó Ò Ü º½ ´Ô Ò ¿ µ¸ Ð for (j = ...) × O(n) ݸ ÔÓÖ Ò ¸ Ð Ð ÓÖ ØÑÓ
             ÐÓ Ð × O(n2)º
            Ayuda: ÆÓ × ÔÙ             ØÙ Ö Ð ÔÖÙ × × Ù× ÙÒ Ð Ñ Ø Ô Ö Ð
            for (j = ...) Ý ÒØÓÒ × ÑÙÐØ ÔÐ Ö ÔÓÖ nº        Ò ×Ù ÐÙ Ö¸      Ò ×ÙÑ Ö×
            ÔÓÖ × Ô Ö Ó Ð × ÐÓÒ ØÙ × ÐÓ× Ö Ò Ó× Ù× Öº

Bibliograf´
          ıa
 ½ º ĺ ÒØÐ Ýº ÈÖÓ Ö ÑÑ Ò È ÖÐ׺     ×ÓÒ¹Ï ×Рݸ ½ º
 ¾ º Öר Ð Ò º È ÖÖ Òº Ì ÓÖÝ Ó Ó ×º           Ñ ÈÖ ×׸ Æ Û ÓÖ ¸ ½ º
 ¿ ̺ Àº ÓÖÑ Ò¸ º º Ä × Ö×ÓÒ¸ Ò Êº ĺ Ê Ú ×Øº ÁÒØÖÓ Ù Ø ÓÒ ØÓ Ð ÓÖ Ø Ñ׺ ÅÁÌ
   ÈÖ ×׸ Ñ Ö ¸ Å ¸ ÍË ¸ ½ º
398                                                         Cap´        ´
                                                               ıtulo 4. Arboles



        º º Ö Ò º Ä Ò Ö Ð ×Ø× Ò ÔÖ ÓÖ ØÝ ÕÙ Ù × × Ð Ò         Ò ÖÝ ØÖ ׺ È Ø × ×¸
        ÓÑÔÙØ Ö Ë Ò        Ô ÖØÑ ÒØ¸ ËØ Ò ÓÖ ÍÒ Ú Ö× ØÝ¸ ½ ¾º
      ʺ Ϻ ÐÓÝ º Ð ÓÖ Ø Ñ ¾ ÌÖ ×ÓÖØ ¿º ÓÑѺ Ÿ ¼½¸ ½ º
        Ö Ò À Ö Öݺ Ö Ô Ì ÓÖݺ           ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ½ º
      ̺ º ÀÙ Ò º º ÌÙ Öº ÇÔØ Ñ Ð ÓÑÔÙØ Ö × Ö ØÖ × Ò Ú Ö Ð Ð Ò Ø
       ÐÔ Ø Ó ×º ËÁ Šº ÔÔÐ Å Ø º¸ ¾½ ½ ß ¿¾¸ ½ ½º
        º º ÀÙ«Ñ Òº Ñ Ø Ó ÓÖ Ø ÓÒרÖÙ Ø ÓÒ Ó Ñ Ò ÑÙÑ Ö ÙÒ Ò Ý Ó ×º ÈÖÓ º
      ÁºÊº º¸ ¼ ½¼ ß½½¼½¸ ½ ½º
          Ú º ÀÙ«Ñ Òº Ñ Ø Ó ÓÖ Ø ÓÒרÖÙ Ø ÓÒ Ó Ñ Ò ÑÙÑ¹Ö ÙÒ Ò Ý Ó ×º
      ÈÖÓ Ò × Ó Ø ÁÊ ¸ ¼´ µ ½¼ ß½½¼½¸ Ë ÔØ Ñ Ö ½ ¾º
½¼       ÓÒ Ð º ÃÒÙØ º ÙÒ Ñ ÒØ Ð Ð ÓÖ Ø Ñ׸ ÚÓÐÙÑ ½ Ó Ì              ÖØ Ó ÓÑÔÙØ Ö
      ÈÖÓ Ö ÑÑ Ò º        ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ÍË ¸ Ø Ö Ø ÓÒ¸ ½ º
½½       ÓÒ Ð º ÃÒÙØ º ËÓÖØ Ò Ò Ë Ö Ò ¸ ÚÓÐÙÑ ¿ Ó Ì                 ÖØ Ó ÓÑÔÙØ Ö
      ÈÖÓ Ö ÑÑ Ò º        ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ÍË ¸ × ÓÒ Ø ÓÒ¸ ½ º
½¾       ÓÒ Ð Äº ÃÖ Ö Ò ÓÙ Ð × Êº ËØ Ò×ÓÒº ÓÑ Ò ØÓÖ Ð Ð ÓÖ Ø Ñ׺ Ê ÈÖ ×׸
      ½ º ÁË Æ ¼¹ ¿¹¿ ¹ º
½¿           Ý Ä Ò × Ñ¸ ÅÓ× Ù Òר Ò¸ Ò ÖÓÒ Åº Ì Ò Ò ÙѺ Ø ×ØÖÙ ØÙÖ ×
      Ù× Ò        Ò ··º ÈÖ ÒØ ¹À Ðи ÍÔÔ Ö Ë Ð Ê Ú Ö¸ ÆÂ ¼ ¸ ÍË ¸ ½ º
½     À ÖÖÝ Êº Ä Û × Ò Ä ÖÖÝ Ò Ò Ö º            Ø ËØÖÙ ØÙÖ × Ò Ì Ö Ð ÓÖ Ø Ñ׺
      À ÖÔ Ö ÓÐÐ Ò× ÈÙ Ð × Ö׸ Æ Û ÓÖ ¸ ½ ½º
½     º ÄÙ × Û Þº Ç ÞÒ Þ Ò Ù ÔÓØÖ Þ          ÐÓ Ñ Ø Ñ ØÝ ÞÒ ´ÓÒ Ø ÑÔÓÖØ Ò
       Ò Ò × Ó Ñ Ø Ñ Ø ÐÓ µº Æ Ù ÈÓÐ× ¸ ½¼ ¼ ß ¾¼¸ ½ ¾ º
½       º º È ÖÐ × Ò º Ì ÓÖÒØÓÒº ËÝÑ ÓÐ Ñ Ò ÔÙÐ Ø ÓÒ Ý Ø Ö      Ð ×Ø×º ÓÑÑÙÒ ¹
      Ø ÓÒ× Ó Ø       Ÿ ¿´ µ ½ ß¾¼ ¸ ÔÖ Ð ½ ¼º
½     ÊÓ ÖØ Ë Û º Ð ÓÖ Ø Ñ× Ò È ÖØ× ½ß ÙÒ Ñ ÒØ Ð׸ Ø ×ØÖÙ ØÙÖ ×¸
      ×ÓÖØ Ò ¸ × Ö Ò º        ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ÍË ¸ ½ º
½       º º ËØ Ô Ò×ÓÒº Ñ Ø Ó ÓÖ ÓÒרÖÙ Ø Ò Ò ÖÝ × Ö ØÖ × Ý Ñ Ò Ò× Ö¹
      Ø ÓÒ× Ø Ø ÖÓÓØº ÁÒØ ÖÒ Ø ÓÒ Ð ÂÓÙÖÒ Ð Ó ÓÑÔÙØ Ö Ò ÁÒ ÓÖÑ Ø ÓÒ Ë Ò ×¸
       ´½µ ½ ß¾ ¸ ÖÙ ÖÝ ½ ¼º
½     º Ϻ º Ï ÐÐ Ñ׺ Ð ÓÖ Ø Ñ ¾¿¾ À ÈËÇÊ̺ ÓÑѺ Ÿ ¿ ß¿ ¸ ½ º
Cap´
   ıtulo 5

Tablas hash

Ä Ø ÒÓÐÓ            ØÖ Ò× ÓÖÑ Ó Ð Þ Ð ÑÙÒ Ó × Ó¸ ÓÑÙÒ Ò ×Ô Ò× Ð Ô Ö Ð
Ú ¸ ÕÙ ÓÑÔÖ Ò               × ØÓØ Ð     ÐÐ Ñ ÔÐ Ò Ø º ÈÙ Ö ÑÓ× Ö ÕÙ ×Ø
ÒÓ Ñ ÒÓ× ÙÒ × ÐÓ ØÓ Ô Ö×ÓÒ ×Ó                ÐÓ Ò ØÙÖ Ð Ð Ò ØÙÖ Ð Þ × Ö¸ Ð ÑÙÒ Ó
ÐÐ ÒÓ      Ö ¸ Ø ÖÖ Ý Ù ÓÒ × ×Ø Ò Ù Ò ÐÓ× ØÖ × Ö Ò × Ö ÒÓ× Ñ Ò Ö Ð¸ Ú Ø Ð Ý
  Ò Ñ Ð Ý Ò Ð Ù Ð Ô Ò × × ÒÓØ Ò Ô Ö Ð × ÐÓ ÙÑ ÒÓº ÀÓÝ Ò ¸ ÔÖ Ø Ñ ÒØ
ÒÓ Ý ×Ô Ó Ð ÔÐ Ò Ø ÕÙ ÒÓ ×Ø Ô ÖÑ Ó ÔÓÖ ÐÓ ÙÑ ÒÓ¸ Ø Ð ÜØÖ ÑÓ ÕÙ Ô Ö
ÑÙ Ó× ÙÒ ×ØÖÙ ØÙÖ             ÓÒ Ö ØÓ¸ ÓÒ Ð ÕÙ × ÓÒÚ Ú × Ð Ò Ñ ÒØÓ¸ Ð × Ô Ö
  ÓÑÔÐ Ø Ñ ÒØ Ò ØÙÖ Ðº
    ÍÒ Ñ Ö           Ö ×Ó Ö Ð Þ Ø ÖÖ ×ØÖ ÒÓ× ÔÖÓÔÓÖ ÓÒ ÙÒ Ù Ò                  Ö
  Ù ÒØÓ Ð Ø ÒÓÐÓ           ØÖ Ò× ÓÖÑ Ó Ð ÑÙÒ Óº Ä Ú ×Ø ר Ð Ò         ÔÓÖ ÔÓÐ ÓÒÓ× Ý
Ð Ò × Ö ÙÐ Ö ×¸ Ô × Ö ÕÙ ×ØÓ× Ô ÖØ ÖÓÒ                ×ØÖ ÓÒ × Ñ Ø Ñ Ø ×¸ ÕÙ ÒÓ ×ÓÒ
Ò ØÙÖ Ð ×º Ä Ô Ö×Ô Ø Ú Ö              Ð Þ Ø ÖÖ Ò Ð ÒÓ× Ö Ú Ð Ô ÖØ   ÐÓ× ÔÖÓ ÙÒ × ÑÓ×
   Ñ Ó× ÕÙ ×Ø          ×Ù Ö Ó Ð Ó × ÖÚ Ö Ò Ð Ø ÖÖ ÔÓÐ ÓÒÓ× Ý Ð Ò × Ô Ö Ø ×º
        ÐÓ× Ú Ö× × ÑÓ× Ó ØÓ× Ø ÒÓÐÓ Ó×             ÓÝ Ò ¸ ÙÒÓ ÒÓ Ø Ò ÑÓ ÖÒÓ¸ Ô ÖÓ
ÕÙ        ÓÒØÖ Ù Ó × Ú Ñ ÒØ × Ñ Ó Ð ÑÙÒ Ó¸ ÐÓ Ò ÖÒ Ð ÙØÓÑÓÚ Ðº ¹
Ø Ò ÑÓÒÓ× ÙÒ Ö Ú ÑÓÑ ÒØÓ Ý Ñ Ø ÑÓ× ÓÑÓ × Ö Ð ÑÙÒ Ó × ÒÓ Ü ×Ø × ×Ø
  ÖØ ØÓº
      Ð ÙØÓÑÓÚ Ð¸ ÕÙ ÓÝ ÒÓ× × Ò ØÙÖ Ð ¸ × ÙÒ Ñ Ó ØÖ Ò×ÔÓÖØ × Ò Ð Ô Ö ÒÙ ×ØÖ
 ÓÖÑ Ú º ¸ × Ò Ñ Ö Ó¸ × ÑÔÖ × ÓÒ ÒØ Ù Ò Ð Ò ÒØ ÒÓ× ÔÙ × Ö½º
        Ñ Ò Ö ÙÒ ÔÓ Ó × ÑÔÐ ×Ø ¸ ÔÓ ÑÓ× Ö ÕÙ Ù Ò Ó ÙÒ ÙØÓÑÓÚ Ð ÒÓ ×Ø Ò
ÑÓÚ Ñ ÒØÓ ×Ø Ó ÙÔ ÙÒ ×Ô Óº ÌÓ                ØÚ       ÙÑ Ò ÕÙ Ù ÒØ ÓÒ Ð ÙØÓÑÓÚ Ð
Ô ÖØ ÙÐ Ö ÓÑÓ Ñ Ó ØÖ Ò×ÔÓÖØ ¸ Ò ØÖ Ñ ÒØÓ Ð ØÖ Ò×ÔÓÖØ ÔÙ Ð Ó¸                  ÓÒ× ¹
Ö Ö Ð ×Ø ÓÒ Ñ ÒØÓº ÄÓ× ÒØÖÓ× ÓÑ Ö Ð ×                ÓÝ ¸ ÓÒÓ× ÙÒ Ø ÔÓ ×Ó ÐÑ ÒØ
Ô ÖØ ÙÐ Ö         ÙÒ Ú ¸ Ò             ÓÖ × Ð ÓÒ×ÙÑ ×ÑÓ × Ò Ö Ò Ó         ר ÔÓ Ý
   Ö Ø Ö ×Ø Ô ÙÐ Ö ÙÒ ×ØÖ ØÓ ×Ó Ð¸ ×ÓÒ Ù ÒÓ× ÑÔÐÓ׺
    ÍÒ ÔÖÓ Ð Ñ         ÒØ Ö × Ù Ò Ó × × Ò ÙÒ Ó Ö Ú Ð Ò ÙÒ Ñ ÒØ ÓÒ ÒÓ Ü ×Ø
ØÖ Ò×ÔÓÖØ ÔÙ Ð Ó ¹ Ù ×Ø ÓÒ ÕÙ          Ö    × Ö ÑÙÝ Ü Ô ÓÒ Ð¹ ÓÒ× ×Ø Ò ÒØ ÖÖÓ Ö ÔÓÖ
Ð ÒØ             ×ÙÔ Ö¬ Ô Ö Ð ×Ø ÓÒ Ñ ÒØÓº ÍÒ ÔÖ Ñ Ö Ô ×Ó ÓÒ× ×Ø Ò ×Ø Ñ Ö Ð
   ÒØ      ×Ô Ö          ÙØÓÑÓÚ Ð × Ý ×      ÖÐ Ô          Ò ÐÙ Ö × Ð ×Ø ÓÒ Ñ ÒØÓº
      ÖÓ××Ó ÑÓ Ó¸ ÙÒ ×Ø ÓÒ Ñ ÒØÓ ÔÙ Ô ØÓÖ Þ Ö× Ð × Ù ÒØ ÑÓ Ó
  ½
      Ð ØÖ Ò× ÓÖÑ ÓÒ ÕÙ ×Ø Ð    ÑÔ ÖØ Ó ÙÒ    Ù     ÓÑÓ Å Ö ¸   ר ÒØ Ö ÔÖ × ÒØ Ø Ú
ÐÓ Ò ØÙÖ Ð ¸ × ÙÒ Ù Ò Ò   ÓÖº



                                        ¿
400                                                                              Cap´
                                                                                    ıtulo 5. Tablas hash


                                                                                                           11

                      6             2               7                              M−2

 0       1        2       3        ººººººººººººººººººººººººººººººººººººººº
                                                                                                 M−2 M−1


   Ò Ö Ñ ÒØ ¸ Ð ×Ø ÓÒ Ñ ÒØÓ Ø Ò M ÔÙ ×ØÓ× ÔÓ× Ð × ÒÙÑ Ö Ó× × Ù Ò ÐÑ ÒØ º
ÄÓ× ÙØÓÑÓÚ Ð × ÖÖ Ò × Ù Ò ÐÑ ÒØ Ý × ×Ø ÓÒ Ò Ò Ð ÔÖ Ñ Ö ÔÙ ×ØÓ ×ÔÓÒ Ð º Ð
 ÓÒÓ Ñ ÒØÓ ÓÒ×ÓÐ Ó Ö ÓÑ Ò ÕÙ Ø Ð Ô              ÖÖÓ ÙÒ ÔÓÖ ÒØ       ÔÐ Ò ØÙ
 ÒØÖ Ð ± Ý ¼±º × Ö¸ × ÙÒ ÐÓ ×Ô Ö Ó¸               Ö ÙÒ ×Ó Ö ÒØ ÒØÖ Ð ¾ ± Ý
½¼ ±º
     ÉÙ Ø Ò ÕÙ Ú Ö Ð × ØÙ ÓÒ Ð ×Ø ÓÒ Ñ ÒØÓ ÓÒ ÐÓ× Ð ÓÖ ØÑÓ× Ý ×ØÖÙ ¹
ØÙÖ ×      ØÓ× ÓÒ× Ö ÑÓ× ÙÒ ÓÒ ÙÒØÓ Ò Ö Ó K         Ð Ú ×¸ ÒØÖÓ ÙÒ ÔÓ× Ð
 ÓÑ Ò Ó K¸ Ý ÙÒ ×Ø ÓÒ Ñ ÒØÓ ÓÒ Ô       M ÕÙ Ð Ö Ö Ð × Ð Ú ×º        ÓÖ ÓÒ¹
× Ö ÑÓ× Ð Ü ×Ø Ò       ÙÒ ÙÒ ÓÒ ÒÝ Ø Ú ¾ h(k) : K −→ [0, M − 1]¸ Ð Ù Ð ÔÙ
Ô ØÓÖ Þ Ö× ×
                                   K                                   [0..M − 1]
                                                                           i     0
                                        1

                                        2
                                                                             M−1    1
                                                                             1      2
                                        i




                                        M−1

                                                                             2      M−1

       Ó ÐÓ ÒØ Ö ÓÖ¸ ÔÓ ÑÓ× ÒØÖÓ Ù Ö ÓÖÑ ÐÑ ÒØ Ð ÓÒ ÔØÓ                                 Ø Ð     × Ó     Ø Ð
       ×Ô Ö× ÓÒ ¿
Definici´n 5.1 (Tabla Hash) Ë
       o                                       ÙÒ ÓÒ ÙÒØÓ          Ð Ú × K Ô ÖØ Ò             ÒØ × ÙÒ ÓÑ Ò Ó
Kº ÍÒ Ø Ð     × × ¬Ò ÓÑÓ
   ½º ÍÒ ÖÖ ÐÓ Ø ÔÓ K M ÒØÖ ×º ÈÓÖ ÐÓ Ò Ö Ð¸ |K| = M¸ ÙÒÕÙ ÔÙ Ö Ò
       Ó Ò Öº
   ¾º ÍÒ ÙÒ ÓÒ h(k) : K −→ [0, M − 1] ÐÐ Ñ ÙÒ ÓÒ × º
      ÙÒ Ö ×ØÖÓ Ð Ö ÒØ ÙÒ Ð Ú Ò ÙÒ Ø Ð × × Ð ÒÓÑ Ò “cubeta” Ó
×Ù ÕÙ Ú Ð ÒØ Ò ÐÓ× ÓÒ “bucket”º
    Å ÒØ Ð ÖÖ ÐÓ Ý Ð ÙÒ ÓÒ h(k) : K −→ [0, M − 1] ÔÓ ÑÓ× Ù× Ö ÙÒ Ø Ð ×
Ô Ö ÑÔÐ ÒØ Ö Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð ×ØÖÙ ØÙÖ ×        ØÓ׺ Ë A[M] ÙÒ ÖÖ ÐÓ
Ô Ö × Ø ÔÓ K × {0, 1} × Ö¸ A[i].key Ò Ð Ð Ú ¸ Ñ ÒØÖ × ÕÙ A[i].busy Ò
× Ð ÒØÖ      ר Ó ÙÔ Ó ÒÓº ÒØÓÒ ×¸ ÖÓ××Ó ÑÓ Ó¸ Ð × ØÖ × ÓÔ Ö ÓÒ × × × ×
Ö Ð Þ Ò Ð × Ù ÒØ ÑÓ Ó
Inserci´n de clave k:
       o

             ½º   i = h(k)    ÑÓ   M
  ¾
             ×
      h : D −→ R   ÕÙ × ÒÝ Ø Ú ⇐⇒ ∀x, y ∈ D =⇒ h(x) = h(y)º ÍÒ ÙÒ ÓÒ ÒÝ Ø Ú Ø Ñ Ò
× ÐÐ Ñ   ÙÒÓ ÙÒÓ º
   ¿
     ÔÓÖ × ¸ ר    × ÓÐ    × ÓÒ     Ð ÙÒÓ× ØÖ Ù ØÓÖ × Ð ×Ø ÐÐ ÒÓº Ò Ð ×Ó ÓÒ Ö ØÓ¸ Ð
ØÖ Ù ÓÒ ×Ø ÐÐ Ò ¿       Ø ËØÖÙ ØÙÖ × Ò Ð ÓÖ Ø Ñ×       Ó¸ ÀÓÔ ÖÓ Ø Ý ÍÐÐÑ Ò ¾ º
5.1. Manejo de colisiones                                                            401



        ¾º   A[i].key = k
        ¿º   A[i].busy = 1

B´ squeda de clave k:
 u

        ½º   i = h(k)   ÑÓ   M
        ¾º   if (A[i].busy == 1) return true; else return false;

Eliminaci´n de clave k:
         o

         ½º i = h(k) ÑÓ M
         ¾º A[i].busy = 0
    ÆÓØ ÑÓ× ÕÙ Ò Ò ÙÒ Ð × ÓÔ Ö ÓÒ × ÓÒØ Ò Ø Ö ÓÒ ×º ÈÓÖ Ø ÒØÓ¸ Ð Óר Ð ×
ØÖ × ÓÔ Ö ÓÒ × Ô Ò Ö Ø Ñ ÒØ Ð Óר h(k) : K −→ [0, M − 1]º ÓÒ× Ù ÒØ ¹
Ñ ÒØ ¸ × h(k) : K −→ [0, M − 1] × O(1)¸ ÒØÓÒ × Ð × ØÖ × ÓÔ Ö ÓÒ × ×ÓÒ O(1)º À ÕÙ ¸
Ô٠׸ Ð Ö Ò Þ           ר רÖÙ ØÙÖ        ØÓ׺
    Ë h(k) : K −→ [0, M − 1] ÒÓ × ÒÝ Ø Ú ¸ ÒØÓÒ × × ÔÓ× Ð ÕÙ Ó× Ð Ú × ×Ø ÒØ ×
ki, kj ∈ K Ð ÙÒ ÓÒ × Ð × × Ò Ð Ñ ×ÑÓ Ú ÐÓÖ Ó × ¸ h(ki) = h(kj)º Ò ×Ø                  ×Ó¸
     ÑÓ× ÕÙ Ü ×Ø ÙÒ “colisi´n”º Ä Ñ ÝÓÖ
                                o                   Ð × Ú × ÒÓ ÓÒÓ ÑÓ× ÓÒ Ü Ø ØÙ
 Ð ÓÒ ÙÒØÓ Ð Ú × K ⊂ K¸ ÐÓ Ù Ð            Ñ × ÔÓ× Ð ÙÒ ÓÐ × ÓÒº
      × Ð × Ó× ×¸ Ô Ö ÕÙ ÙÒ Ø Ð × ÓÒ ÙÒ ÙÒ ÓÒ h(k) : K −→ [0, M − 1] ÒÓ Ò¹
Ý Ø Ú × Ø × ÓÔ Ö ÓÒ × Ò O(1)¸ ר                 ÓÒØ ÑÔÐ Ö Ó× Ö ÕÙ Ö Ñ ÒØÓ× × Ò Ð ×
   ½º Ð ÓÑÔÙØÓ Ð ÙÒ ÓÒ h(k) : K −→ [0, M − 1]                Ö Ð Þ Ö× Ò O(1)¸ ÓÒ ÙÒ ÑÙÝ
       ÔÓ Ó Óר ÓÒר ÒØ Ý ×Ù ÓÑÔÓÖØ Ñ ÒØÓ                ÑÙÐ Ö ÙÒ ×ØÖ Ù ÓÒ × Ö Ø
       ÙÒ ÓÖÑ ÒØÖ [0, M − 1]º
       ÈÙ ×ØÓ ÕÙ ÔÙ Ò          Ö ÓÐ × ÓÒ ×¸ ר ×      Ò Ö Ù Ö× Ð Ñ Ò ÑÓ ÔÓ× Ð ×Ø
        × Ð × ÒØ Ó ÕÙ h(k) : K −→ [0, M − 1] ÑÙÐ Ð Ð ØÓÖ               º
   ¾º ÈÓÖ Ð Ñ ×Ñ ÔÓ× Ð            Ø Ò Ö ÓÐ × ÓÒ ×¸ ÙÒÕÙ Ù × Ñ Ò Ñ ¸ ×          Ø Ò Ö ÙÒ
        ×ØÖ Ø Ô Ö Ñ Ò ÖÐ × × Ö¸ ×                       Ö¸ × ×Ø Ñ Ø Ñ ÒØ ¸ ÕÙ      Ö ÓÒ
        ÕÙ ÐÐ × ÒÙ Ú × Ð Ú × ÕÙ ÓÐ Ò Ò ÓÒ ÓØÖ × Ý ÔÖ × ÒØ × Ò Ð Ø Ð º Ä ×ØÖ Ø
             × Ö Ø Ð ÕÙ ÒÓ × Ö ¬ÕÙ Ð Ø ÑÔÓ O(1) Ð Ñ Ó Ô Ö ÙÒ Ø Ð × º

5.1     Manejo de colisiones
  ÓÑÓ Ý ÐÓ ÑÓ× × Ò Ð Ó¸ × ÒÓ × ÓÒÓ Ð ÓÒ ÙÒØÓ                  Ð Ú × ÕÙ × Ò× ÖØ Ö Ò Ò
Ð Ø Ð ¸ ÒØÓÒ × ×ÓÒ ÔÓ× Ð × Ð × ÓÐ × ÓÒ ×º ÉÙ Ø Ò ÔÖÓ          Ð × ×ÓÒ ÍÒ Ñ Ö      ÙÒ
  Ð Ö ÔÖÓ Ð Ñ ÒÓ× Ò      ×Ù ÔÖÓ Ð º
5.1.1   La paradoja del cumplea˜os
                               n
Ê Ð¹ Þ Ö ÑÓ× Ð ÔÖÓ Ð           ÓÐ × ÓÒ Ñ ÒØ ÙÒ Ð × Ó ÔÖÓ Ð Ñ  Ð Ø ÓÖ
ÔÖÓ Ð        ׺ ËÙÔÓÒ ÑÓ× ÙÒ ÖÙÔÓ n Ô Ö×ÓÒ ×¸ ÕÙ Ø Ò ÔÖÓ Ð × ÕÙ Ó×
Ô Ö×ÓÒ × Ø Ò Ò Ð Ñ ×Ñ           ÙÑÔÐ ÒÓ× º
   ÄÓ× Ø ÜØÓ× ÔÖÓ Ð       × Ó Ö Ò ÙÒ ×ÓÐÙ ÓÒ ÔÖ × ×Ø ÔÖÓ Ð Ñ º Ò Ö ×
Ð × ÑÔÐ        Ý Ð ÓÖÖÓ    ×Ô Ó¸ ÕÙ ÐÓ Ó Ö ÑÓ× Ñ ÒØ ÙÒ Ú Ñ × ÓÖØ ¸
Ô ÖÓ Ñ × ÑÔÖ × º
402                                                                Cap´
                                                                      ıtulo 5. Tablas hash



   Ë ÙÒ    xi,j   ÙÒ Ú Ö Ð Ð ØÓÖ         ¬Ò            Ð × Ù ÒØ ÑÓ Ó

           xi,j =
                     0   × Ð × Ô Ö×ÓÒ × i Ý j ÒÓ ÙÑÔÐ Ò ÒÓ× Ð Ñ ×ÑÓ                   ´ º½µ
                     1   × Ð × Ô Ö×ÓÒ × i Ý j ÙÑÔÐ Ò ÒÓ× Ð Ñ ×ÑÓ
  ÓÖ    ¬Ò ÑÓ× Ð × Ù ÒØ Ú Ö Ð Ð ØÓÖ
                                       X=            xi,j                             ´ º¾µ
                                              ∀i=i

 ÙÝ ×Ô Ö ÒÞ E(X)¸ Ò Ú ÖØÙ Ð × ¬Ò ÓÒ × ÔÐ ÒØ ׸ ÒÓ× ÔÖÓÔÓÖ ÓÒ Ð                      ÒØ
×Ô Ö     Ô Ö × Ô Ö×ÓÒ × ÕÙ ÙÑÔÐ Ò ÒÓ× Ð Ñ ×ÑÓ º
  ÈÓÖ ¬Ò ÓÒ
                                   E(X) = E            xi,j    ;                      ´ º¿µ
                                               ∀i=i

Ð Ù Ð ÔÙ     ÔÐ ÒØ Ö× ÓÑÓ
                                   E(X) =          E(xi,j) .                          ´ºµ
                                            ∀i=i

 ×ØÓ ÒÓ× ÔÐ ÒØ Ð Ò ×                Ð ÙÐ Ö E(xi,j)¸ Р٠Р׸ ÔÓÖ ¬Ò ÓÒ¸ ×
              E(xi,j) = 0 × P(xi,j = 0) + 1 × P(xi,j = 1) = P(xi,j = 1) .             ´ºµ
Ä Ù ×Ø ÓÒ Ö ÕÙ Ö ¸ Ô٠׸ Ð ÙÐ Ö P(xi,j =             1)     ×    Ö¸ Ð ÔÖÓ Ð        ÕÙ Ó×
Ô Ö×ÓÒ × Ô ÖØ ÙÐ Ö × ÙÑÔÐ Ò ÒÓ× Ð Ñ ×ÑÓ                   Ý ×Ø ¸ Ð Ò Ö ÙÐ        Ð ÙÒÓ׸ ×
                                                       1
                                    P(xi,j = 1) =         .
                                                      365
    ÆÓ ×ÓÖÔÖ Ò ÒØ Ñ ÒØ ¸ Ð ÙÒÓ× Ò ÙÖÖ Ò Ò Ð ÖÖÓÖ Ô Ò× Ö ÕÙ × ØÖ Ø    ÙÒ
ÔÖÓ Ð         ÓÒ ÓÒ Ð¸ ÐÓ Ù Ð ÒÓ × Ð ×Óº È Ö ÔÖ Ò ÖÐÓ¸ Ñ Ò ÑÓ×ÒÓ× ÕÙ
ÒÓ× Ò ÓÒØÖ ÑÓ× Ò ÙÒ ÖÙÔÓ Ý ÒÓ× ÔÖ ÙÒØ ÑÓ× Ù Ò ÔÖÓ Ð × ÕÙ ØÙ ÙÑÔÐ × ÒÓ×
 Ð Ñ ×ÑÓ ÕÙ ÝÓ Ä Ö ×ÔÙ ×Ø × 1/365¸ Ô٠׸ Ð ÝÓ ÓÒÓ Ö Ñ           ÙÑÔÐ ÒÓ×
Ö Ú Ð Ð ×Ù ×Ó ÒØ Ö × ÔÖÓ Ð ÒØÖ ØÓ Ó× ÐÓ× 365 ÔÓ× Ð ×º
     × ÔÙ ×
                                           n(n − 1)
                         E(X) =
                                 n 1
                                  2 365
                                        =
                                             730
                                                    .               ´ºµ
ÄÓ Ù Ð¸ Ð ÔÐ ÒØ Ö Ð       × ÙÐ     E(xi,j) ≥ 1 ÒÓ× ÖÖÓ    ÓÑÓ Ö ×
                           √                  √
                            2921 − 1            2921 + 1
                    n1 = −           , n2 =              ≈ 27, 523138 .
                              2                   2
  ×ØÓ ÑÔÐ ÕÙ Ô Ö ÙÒ ÖÙÔÓ 28 Ô Ö×ÓÒ × × ×Ô Ö Ó Ò ÓÒØÖ Ö ÙÒ Ô Ö ÓÒ Ð Ñ ×Ñ
          ÙÑÔÐ ÒÓ× Ô Ö Ð Ó Ð Ô Ö×ÓÒ × ´n = 56, E(X) = 56×55 = 4.2192µ¸ ÔÓ ÑÓ×
                                                       730
 ×Ô Ö Ö Ù ØÖÓ Ô Ö × Ô Ö×ÓÒ × ÓÒ Ð Ñ ×ÑÓ ÙÑÔÐ ÒÓ׺
    È Ö ÙÒ ×Ù ×Ó Ò Ô Ö Ò         Ð ØÓÖ Ó Ò Ô Ò ÒØ ÓÑÓ ÐÓ × Ð
Ò Ñ ÒØÓ¸ Ð ÔÖÓ Ð            ÓÐ × ÓÒ × ×Ø ÒØ ÐØ ¸ ÐÓ ÕÙ Ò        Ð Ò ×
ÔÖ Ô Ö Ö× ×Ù Ú ÒØÙ Ð º Ò ÐÓ ÕÙ × Ù ¸ × ÙØ Ö ÑÓ× Ú Ö × ×ØÖ Ø × Ô Ö ÐÑ ¹
   Ò Ö ÓÐ × ÓÒ × Ò ÙÒ Ø Ð × º
5.1. Manejo de colisiones                                                            403



5.1.2     Estrategias de manejo de colisiones
 ÓÒ× Ö ÑÓ× ÙÒ ÓÒ ÙÒØÓ Ò Ö Ó               Ð Ú × ÓÐ Ò ÒØ × Kc = {k1, k2, . . . , kn} Ó × ¸
∀ki, kj ∈ Kc =⇒ h(ki) = h(kj)º Ë ÓÒÓ Ò Ó× ÖÙÔÓ× Ø Ò × Ô Ö Ð             Ö ÓÒ ÓÒ ÙÒØÓ×
    ÓÐ × ÓÒ ×
Encadenamiento Ð × ÓÐ × ÓÒ × × ÒÐ Þ Ò Ò ÙÒ Ó Ú Ö × Ð ×Ø × ÒÐ Þ                   × ÙÖ Ó
         ÒØÖÓ Ð Ñ ×Ñ Ø Ð º
Direccionamiento abierto        Ð × ÓÐ × ÓÒ × × ÓÐÓ Ò Ö Ø Ñ ÒØ ÒØÖÓ Ð ÔÖÓÔ
      Ø Ðº
      ÙÒ      ר × Ø Ò × Ø Ò ×Ù× Ú ÒØ × Ý ×Ú ÒØ × Ý ×            Ù × ÙÒ Ð ÓÒØ ÜØÓ
   Ù×Óº

5.1.3     Encadenamiento
Ä       ÙÒ Ñ ÒØ Ð Ð Ò Ò Ñ ÒØÓ × ÕÙ Ð × ÓÐ × ÓÒ × × Ù Ö Ò Ò ÙÒ Ð ×Ø × ÑÔÐ
Ó Ó Ð Ñ ÒØ ÒÐ Þ º Ù Ò Ó ÐÓ× ÒÓ Ó× Ð Ð ×Ø × Ù Ö Ò Ù Ö Ð Ø Ð ¸ ÑÓ×
ÕÙ × ØÖ Ø     Ò Ò Ñ ÒØÓ × Ô Ö Óº Ò Ð × ÒØ Ó ÒÚ Ö×Ó¸ Ù Ò Ó ÐÓ× ÔÖÓÔ Ó× ÒÓ Ó×
  Ð Ð ×Ø ×ÓÒ Ô ÖØ Ð Ø Ð ¸ ÑÓ× ÕÙ × ØÖ Ø       Ò Ò Ñ ÒØÓ ÖÖ Óº
5.1.3.1    Encadenamiento separado

 Ò ×Ù ÓÖÑ Ñ × × ÑÔÐ ¸ Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó × ÑÔÐ ÒØ Ñ ÒØ ÙÒ Ø Ð
   ÔÙÒØ ÖÓ× Ð ×Ø × × ÑÔÐ Ñ ÒØ ÒÐ Þ ×¸ ÙÝ Ö ÔÖ × ÒØ ÓÒ ÔÙ Ú ×Ù Ð Þ Ö× Ð
× Ù ÒØ ÑÓ Ó
                              0          k10   k1
                              1
                              2          k8
                              3
                              4
                              5          k9     k5     k2
                              6
                              7
                              8          k3
                              9
                              10         k7     k4
                              11




                            M−2
                            M−1          k11    k6



Ä ¬ ÙÖ ÑÙ ×ØÖ ÙÒ ÓÒ ÙÒØÓ 12 Ð Ú × ki ÓÒ i Ö ÔÖ × ÒØ Ð ÓÖ Ò Ò× Ö ÓÒº
        ÒØÖ   Ò Ð ÖÖ ÐÓ × ÙÒ ÔÙÒØ ÓÖ Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ Ð Ð ×Ø ÒÐ Þ
 ÓÐ × ÓÒ ×º
    ÌÓ × Ð × ÓÔ Ö ÓÒ × Ö ÕÙ Ö Ò Ð ÙÐ Ö j = h(k) ÑÓ M¸ ÓÒ k × ÙÒ Ð Ú
 ר Ñ Ò Ö ¸ Ð ÒØÖ tabla[j] × Ð ÔÙÒØ ÖÓ Ð Ð ×Ø ÒÐ Þ º ÍÒ Ú ÐÓÖ ÔÙÒØ ÓÖ
ÒÙÐÓ Ò ÕÙ Ð Ð ×Ø ר Ú         × Ö¸ ÕÙ ÒÓ Ý Ò Ò ÙÒ Ð Ñ ÒØÓ ×Ó Ó Ð Ò j
    ר × Ð ØÖ Ù ÓÒ Ð Ø Ö Ð Ð Ø ÖÑ ÒÓ Ù× Ó Ò Ò Ð × ÓÔ Ò      Ö ×Ò º
404                                                            Cap´
                                                                      ıtulo 5. Tablas hash



     Ò Ð ÖÖ ÐÓº ÐÓ ÓÒØÖ Ö Ó¸ Ü ×Ø ÙÒ Ð ×Ø ÒÐ Þ     Ð Ú × ÓÐ Ò ÒØ × Ò                Ò ×º
     Ò Ð ÑÔÐÓ Ð ÒØÖ 11 ÑÙ ×ØÖ Ó× Ð Ú × k7, k4 ÙÝÓ Ú ÐÓÖ ÙÒ ÓÒ ×                    ÖÖÓ Ó Ð
    Ñ ×ÑÓ Ö ×ÙÐØ Ó ´10µº
         Ò ALEPH ר Ø ÔÓ Ø Ð ×Ø ÑÔÐ ÒØ Ó Ò Ð Ö ÚÓ ØÔÐ Ð × ºÀ ¼                         ¸ ÙÐ
    ÑÔÐ ÒØ Ý ÜÔÓÖØ Ú Ö × Ð × × Ô Ö Ñ ØÖ Þ ×¸ Ð × Ù Ð ×¸ Ð Ñ × ÑÔÓÖØ ÒØ                 ×
¼   ØÔÐ Ð × ºÀ ¼ ≡
          template <typename Key, class BucketType, class Cmp>
      class GenLhashTable
      {
        typedef BucketType Bucket;
           ÈÖÓØÓØ ÔÓ ÔÙÒØ ÖÓ ÙÒ ÓÒ × ¼
           Å Ñ ÖÓ× ØÓ       ÒÄ × Ì Ð ¼
           Å ØÓ Ó× ÔÙ Ð Ó×   ÒÄ × Ì Ð ¼
      };
           Ù Ø×      LhashTable<Key>            ¼
         ¬Ò ×
      GenLhashTable¸      Ù×    Ò ÙÒ      ¼ º
          GenLhashTable<Key, BucketType> ÑÔÐ ÒØ           ØÓ Ó Ð Ñ Ò Ó Ò Ö Ó   Ð Ø Ð     ×
     Ò   Ð Ù Ð Ð × Ù Ø × ×ÓÒ Ø ÔÓ BucketTypeº
    Cubetas
        Ä Ñ Ò Ö Ñ × × ÑÔÐ Ñ Ò Ö ÙÒ Ù Ø Ò                        Ò Ö× Ô Ö   Ñ ÒØ × Ñ     ÒØ
     Ð Ø ÔÓ Dnode<T> ×ØÙ Ó Ò Ü ¾º º ´Ô Ò µ
¼      Ù Ø × LhashTable<Key> ¼ ≡                                    ´¼ µ ¼
          template <typename Key>
      class LhashBucket : public Dnode<Key>
      {
        LhashBucket(const LhashBucket & bucket) : Dnode<Key>(bucket) { /* empty */ }
        LhashBucket() { /* Empty */ }
        LhashBucket(const Key & key) : Dnode<Key>(key) { /* Empty */ }
        Key & get_key() { return this->get_data(); }
      };
          template <typename Key>
      class LhashBucketVtl : public Dnode<Key>
      {
        LhashBucketVtl(const LhashBucketVtl & bucket) : Dnode<Key>(bucket) { /* empty */ }
        LhashBucketVtl() { /* Empty */ }
        virtual ~LhashBucketVtl() { /* Empty */ }
        LhashBucketVtl(const Key & key) : Dnode<Key>(key) { /* Empty */ }
        Key & get_key() { return this->get_data(); }
      };
         ¬Ò ×
      LhashBucket¸   Ù×        Ò ÙÒ × ¼     Ò       ¿ º
    Í× × Dnode º
           Ð ÑÔÐ Ó Ð Ø ÔÓ Dnode<T> ÒÓ× Ð Ø Ö Ò Ñ ÒØ Ð × ÓÔ Ö ÓÒ × Ò Ô ÖØ ÙÐ Ö
    Ð       Ð Ñ Ò ÓÒ¸ Ð Ù Ð Ò ÙÒ Ð ×Ø × ÑÔÐ Ö ÕÙ Ö Ö Ñ ÒØ Ò Ö ÙÒ ÔÙÒØ ÖÓ Ð Ð Ñ ÒØÓ
    ÔÖ       ×ÓÖº
          Ä ÙÒ     ר Ò ÓÒ ÒØÖ ÙÒ Ð × Ý Ð ÓØÖ × Ð ÔÖ × Ò      Ð ×ØÖÙ ØÓÖ Ú ÖØÙ Ðº
          À Ý Ó× Ñ Ò Ö × ×Ó Ö ÓØÖÓ× ØÓ× Ð Ð Ú Ø ÔÓ Key ¬Ò Ò Ð Ù Ø
5.1. Manejo de colisiones                                                         405



           ½º Ë      Ö ÙÒ Ö ×ØÖÓ¸ ÔÓÖ ÑÔÐÓ            Ø ÔÓ Record¸ ÕÙ ÓÒØ Ò ØÓ Ó× ÐÓ×
                  ØÓ×    ÒØ Ö ×¸ Ò ÐÙ Ð Ð Ú          Ø ÔÓ Keyº     ×ÔÙ × ×    Ð Ö ÙÒ Ù¹
                  Ø ´LhashBucket<Record> Ó LhashBucketVtl<Record>¸ Ý × ¬Ò Ð ÓÔ Ö ÓÖ
                Record::operator==(const Record&) Ô Ö ÕÙ ×ÓÐÓ ÓÑÔ Ö Ð Ð Ú         Ø ÔÓ Ã Ýº
                Ä Ø Ð × ÔÙ          ¬Ò Ö× Ñ ÒØ Ù ÐÕÙ Ö ÐÓ× ØÖ × Ø ÔÓ× GenLhashTable¸
                LhashTable Ó LhashTableVtlº ÄÓ× Ó× ÙÐØ ÑÓ× Ø ÔÓ× × ÓÖÖ ×ÔÓÒ Ò ÓÒ Ø Ð × ÕÙ
                Ñ Ò Ò Ù Ø × × Ò Ó ÓÒ ×ØÖÙ ØÓÖ × Ú ÖØÙ Ð × Ý × ¬Ò Ò ÔÓÖ ×Ô Ð Þ ÓÒ
                GenLhashTable
     ¼            Ù Ø×     LhashTable<Key> ¼ +≡                      ´¼ µ ¼
                      template <typename Key, class Cmp = Aleph::equal_to<Key> >
                  class LhashTable : public GenLhashTable<Key, LhashBucket<Key>, Cmp>
                  {
                    // ...
                  };
                      template <typename Key, class Cmp = Aleph::equal_to<Key> >
                  class LhashTableVtl : public GenLhashTable<Key, LhashBucketVtl<Key>, Cmp>
                  {
                    // ...
                  };
                  ¬Ò ×
                  LhashTable¸ Ù×     Ò ÙÒ × ¿¾¸ ¿¿¸ Ò   º
                  LhashTableVtl¸ Ò   Ú Ö Ù× º
                Í× × GenLhashTable    ¼ Ò LhashBucket ¼ º

    ¾º Ë        Ö Ú ÙÒ Ð ×Derivada               Ù ÐÕÙ Ö     Ð × Ð × × Ù Ø × LhashBucket<Key> Ó
         LhashBucketVtl<Key> Ò ÓÒ               × ÓÐÓÕÙ Ò ÐÓ× ØÓ× ÕÙ × Ö ÕÙ Ö Ò ×Ó Ö Ð Ø ÔÓ
         Keyº
         Ä Ø Ð × × Òר Ò Ñ ÒØ LhashBucket<Key> Ó LhashBucketVtl<Key>¸ × ÙÒ
         × Ö ÕÙ Ö Ó ÒÓ ×ØÖÙ ØÓÖ × Ú ÖØÙ Ð ×º Ä Ò× Ö ÓÒ Ý Ð Ð Ñ Ò ÓÒ ÔØ Ò Ù Ø ×
            Ø ÔÓ Derivada¸ ÔÙ × ×ÓÒ Ù Ø × ÔÓÖ Ö Ò º Ä Ù×ÕÙ Ö ØÓÖÒ ÙÒ Ù Ø
         Ð Ñ Ð LhashBucket<Key>¸ Ð Ù Ð         ÓÒÚ ÖØ Ö× ÜÔÐ Ø Ñ ÒØ Derivada × ×
         Ö ÕÙ Ö ÓÒÓ Ö Ð Ù Ø Derivadaº
         Atributos de LhashTable<Key>
            Ç Ú Ñ ÒØ ¸ ÙÒ ØÖ ÙØÓ × Ò Ð¸ Ð Ù Ð Ð Ö ÑÓ× Ñ × Ð ÒØ ¸ × Ð ÙÒ ÓÒ × ¸
         ÕÙ ØÖ Ò× ÓÖÑ ÙÒ Ð Ú     Ø ÔÓ Key ÙÒ Ò ØÙÖ Ðº Ì Ð ÙÒ ÓÒ  Ø Ò Ö Ð ÔÖÓØÓØ ÔÓ
         × Ù ÒØ
¼         ÈÖÓØÓØ ÔÓ ÔÙÒØ ÖÓ ÙÒ ÓÒ × ¼ ≡                         ´¼ µ
           typedef size_t (*Hash_Fct)(const Key &);
         Ð Ø ÔÓ LhashTable<Key> Ñ ÒØ Ò ¸ Ô٠׸ ÙÒ ÔÙÒØ ÖÓ            ר Ø ÔÓ
¼        Å Ñ ÖÓ× ØÓ        ÒÄ × Ì Ð ¼ ≡                                 ´¼ µ ¼
           Hash_Fct hash_fct;
         Ä Ñ × ÓÒ   ר Ø ÔÓ × Ñ Ò Ö                   ÓÖÑ   ÒÖ   Ð ÙÒ ÓÒ × º ÌÓ Ó ÓÒרÖÙ ØÓÖ
           Ø Ð × Ö ÕÙ Ö ×Ø ÙÒ ÓÒº
            Å      ÒØ    static cast<Derivada*>(cubeta)º
406                                                         Cap´
                                                                   ıtulo 5. Tablas hash



        Ð × ÙÒ Ó ØÖ ÙØÓ × Ð Ø Ð Ñ ×Ñ ×                Ö¸ Ð ÖÖ ÐÓ        ÔÙÒØ ÖÓ×   Ù Ø ×¸ Ð
    Ù Ð × ¬Ò Ð × Ù ÒØ Ñ Ò Ö
¼   Å Ñ ÖÓ× ØÓ       ÒÄ × Ì Ð ¼ +≡                         ´¼ µ     ¼      ¼
      typedef Dnode<Key>                       BucketList; // Tipo lista de cubetas
      typedef typename Dnode<Key>::Iterator    BucketItor; // Iterador de lista cubetas
      typedef Dnode<Key>                       Node;       // Sin´nimo de nodo
                                                                 o
      BucketList *                             table;
    Í× × Dnode   º
    À Ý ÙÒ ÔÓ Ó     ÞÙ Ö × ÒØ Ø ÕÙ    Ð Ø Ð × Ð Ö ÓÒ ×º Ò Ò ÙÖ ¸ Ý ÙÒ
      Ð Ö ÓÒ ÙÒ Ø Ö ÓÖ¸ Ð Ù Ð Ô ÖÑ Ø Ö ÓÖÖ Ö ÙÒ Ð ×Ø   ÓÐ × ÓÒ ×º
        Ð Ö ×ØÓ ÐÓ× ØÖ ÙØÓ× × ¬Ò Ò ÓÑÓ × Ù
¼   Å Ñ ÖÓ× ØÓ        ÒÄ × Ì Ð ¼ +≡                  ´¼ µ ¼
      size_t M;                    //   Tama~o de la tabla
                                            n
      size_t N;                    //   N´mero de elementos que tiene la tabla
                                         u
      size_t busy_slots_counter;   //   Cantidad de entradas del arreglo ocupadas
      bool remove_all_buckets;     //   Indica si se deben liberar las cubetas
                                   //   cuando se llame al destructor
          Ð ØÖ ÙØÓ busy slots counter Ù ÒØ Ð ÒØ            ÒØÖ × Ð ÖÖ ÐÓ table[]
    ÕÙ ×Ø Ò Ú ×º × ÙÒ Ò ÓÖÑ ÓÒ ÑÙÝ ÑÔÓÖØ ÒØ Ô Ö ÓÒÓ Ö Ð Ò Ú Ð             ×Ô Ö× ÓÒ
    Ð ÙÒ ÓÒ × º Ë N < M¸ ÒØÓÒ × Ð Ö Ó Ù×Ý ×ÐÓØ× ÓÙÒØ Ö ÒÓ×
                                                   N                    Ð     ØÚ
        Ð ÙÒ ÓÒ × Ò Ø ÖÑ ÒÓ×         ×Ô Ö× ÓÒº ÍÒ Ú ÐÓÖ Ô ÕÙ ÒÓ Ò ÕÙ Ý ÑÙ ×
     ÓÐ × ÓÒ ×º
          Ð Ù×Ù Ö Ó LhashTable<Key> Ø Ò Ð Ö ×ÔÓÒ× Ð            Ô ÖØ Ö Ð Ñ ÑÓÖ Ô Ö
    Ð × Ù Ø ×¸ × ÓÑÓ¸ Ú ÒØÙ ÐÑ ÒØ ¸ Ð Ð Ö ÖР׺ × ÙØ ÑÓ× Ð Ö ÞÓÒ × Ö ×ØÓ
     Ù Ò Ó Ð ÑÓ× Ð ÔÖ Ò Ô Ó ¬Ò¹ ¹¬Ò ´Ü ½º º¾ ´Ô Ò ¾¾µµ Ý ÐÓ ÑÓ× ÔÐ Ó ÐÓ Ð Ö Ó
       ÐÓ× ×Ø ÒØÓ× Ì ÕÙ ÑÓ× × Ò Óº Ò × × ÒØ Ó¸ × ×Ø ÒØ ÙØ Ð Ø Ò Ö ÙÒ ÖÙØ Ò
     ÕÙ Ú Ð ÒØ remove all and delete() Dlink ´Ü ¾º º ´Ô Ò µµ Ó destroyRec()
    ÐÓ× Ö ÓÐ × Ò Ö Ó× ´Ü º º½¼ ´Ô Ò ¾ µµº × Ô٠׸ Ð ØÖ ÙØÓ remove all buckets()
    Ð Ò         Ð ×ØÖÙ ØÓÖ LhashTable<Key> ÕÙ         Ð Ö Ö ØÓ Ð Ñ ÑÓÖ º
         Ë × × Ú Ö Ð Ø Ð ¸ ÒØÓÒ × ÔÙ ÒÚÓ Ö× Ð Ñ ØÓ Ó empty()
¼    Å ØÓ Ó× ÔÙ Ð Ó×      ÒÄ × Ì Ð ¼ ≡                       ´¼ µ ¼
      void empty()
      {
        for (int i = 0; i < M; ++i)
          for (BucketItor itor(table[i]); itor.has_current(); /* nothing */)
            delete static_cast<Bucket*>(itor.del());
        busy_slots_counter = 0;
        N                  = 0;
      }


    Inserci´n
           o
       ÍÒ ×ÙÒØÓ ÒØ Ö × × Ð ÐÙ Ö Ð Ð ×Ø Ò ÕÙ            Ò× ÖØ Ö× ÙÒ ÒÙ Ú              ÓÐ × ÓÒ
    Ð ÔÖ Ò Ô Ó¸ Ð ¬Ò Ð Ù ÓÖ Ò Ö Ð Ð ×Ø º Ù ÐÕÙ Ö ×Ø × Ú Ö ÒØ × ÒÓ Ù× Ö              Ò Ö Ô Ö¹
    Ù× ÓÒ Ò Ð × ÑÔ ÒÓ¸ Ô ÖÓ × × × ÑÔÐ Ñ ÒØ ÒÐ Þ ¸ ÒØÓÒ × Ð ÔÖ Ö Ò                   × ÔÓÖ Ð
    Ö ÒØ ¸ ÑÓ Ó ÕÙ Ð Ò× Ö ÓÒ × ÐÓ Ñ × ÓÒר ÒØ Ñ ÒØ Ö Ô º Ë Ð Ð ×Ø                   × Óи
    ÒØÓÒ × ÕÙ × Ò× ÖØ Ð ÔÖ Ò Ô Ó Ó ¬Ò Ð × Ò Ö ÒØ Ò Ø ÑÔÓº
5.1. Manejo de colisiones                                                    407



        ÇØÖÓ ØÓÖ     ÒØ Ö × × ÓÒ× Ö Ö Ó ÒÓ Ö Ô Ø Ò      Ð Ú ×º     ÖÒ      ÐÓ×
     Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ ¸ Ò ÙÒ Ø Ð × × ÔÖ Ö Ð ÒÓ Ú Ö ¬ Ö Ö Ô Ø Ò ÔÓÖÕÙ
    × ÒÓ × Ö ÕÙ Ö ÙÒ Ù×ÕÙ Ò Ð Ð ×Ø      ÓÐ × ÓÒ ×  Ú Þ ÕÙ ×     ØÙ ÙÒ Ò× Ö ÓÒº
           ÓÖ ÔÓ ÑÓ× ×Ô ¬ Ö Ð Ò× Ö ÓÒ Ò LhashTable<Key>¸ Ð Ù Ð × Ö Ð Þ ¸ ÑÙÝ
    × Ò ÐÐ Ñ ÒØ ¸ ×
¼    Å ØÓ Ó× ÔÙ Ð Ó×     ÒÄ × Ì Ð ¼ +≡             ´¼ µ ¼      ¼
        Bucket * insert(Bucket * bucket)
        {
          const size_t i = (*hash_fct)(bucket->get_key()) % M;
          if (table[i].is_empty()) // ¿est´ vac´a la lista table[i]?
                                          a    ı
            ++busy_slots_counter; // s´ ==> actualizar contador de ocupaci´n
                                       ı                                  o
          table[i].append(bucket); // insertar cubeta al final
          ++N;
          return bucket;
        }
    Ë Ð ÐÐ Ñ        (*hash fct)(key)   × O(1)¸ ÒØÓÒ × insert() ׸ ÓÒ ÖØ ØÙ     Ø ÖÑ ¹
    Ò ×Ø ¸ O(1)º
    B´squeda
     u
       Ä      Ù×ÕÙ     ÓÒ× ×Ø Ò Ð ÙÐ Ö Ð ÒØÖ     Ð Ø Ð Ñ ÒØ Ð ÙÒ ÓÒ × Ý
    ÐÙ Ó    Ò Ö ÓÖÖ Ö Ð i¹ × Ñ Ð ×Ø ר ÕÙ × Ò Ù ÒØÖ k Ó ×Ø ÕÙ × ÐÐ Ù Ð ¬Ò и Ò
     ÙÝÓ     ×Ó × ØÖ Ø ÙÒ Ù×ÕÙ         ÐÐ
¼    Å ØÓ   Ó× ÔÙ Ð Ó×       ÒÄ × Ì Ð ¼ +≡           ´¼ µ ¼    ¼
        Bucket * search(const Key & key) const
        {
          const size_t i = (*hash_fct)(key) % M;
          if (table[i].is_empty())
            return NULL;
          for (BucketItor it(table[i]); it.has_current(); it.next())
            {
              Bucket * bucket = static_cast<Bucket*>(it.get_current());
              if (Cmp() (bucket->get_key(), key))
                return bucket;
            }
          return NULL;
        }
        Ð × ÑÔ ÒÓ      ר ÖÙØ Ò   ÔÒ       Ð ÐÓÒ ØÙ      Ð Ð ×Ø   table[i]º

    Eliminaci´n
             o
          Ä Ð Ñ Ò ÓÒ × Ö Ø Ý ÓÒ ÙÖ ÓÒ Ü Ø Ñ ÒØ ÓÒר ÒØ ÙÒ Ú Þ ÕÙ × ÓÒÓ
    Ð      Ö ÓÒ Ð Ù Ø
¼       Å ØÓ Ó× ÔÙ Ð Ó× ÒÄ × Ì Ð ¼ +≡          ´¼ µ ¼     ¿½
        Bucket * remove(Bucket * bucket)
        {
          Bucket * next = // guarda pr´xima colisi´n
                                      o           o
            static_cast<Bucket*>(bucket->get_next());
          bucket->del(); // eliminar de su lista de colisiones
          if (next->is_empty()) // ¿la lista devino vac´a?
                                                       ı
408                                                          Cap´
                                                                ıtulo 5. Tablas hash



        --busy_slots_counter; // s´ ==> actualizar contador de listas ocupadas
                                  ı
      --N;
      return bucket;
 }


5.1.3.2    An´lisis del encadenamiento separado
             a

ÈÓÖ × ÑÔÐ          Ö Ø ¸ ×ÙÑ Ö ÑÓ× ÙÒ Ø Ð ÓÒ× ×Ø ÒØ ÙÒ ÖÖ ÐÓ ÒÓ Ó×            Ö
  Ð ×Ø ×      ÓÐ × ÓÒ × Ö ÙÐ Ö × Ý Ó Ð Ñ ÒØ ÒÐ Þ × Ð Ø ÔÓ Dnode<T> ×ØÙ Ó
 Ò Ü ¾º º ´Ô Ò µº            Ó Ð Ñ ×ÑÓ ×Ô Ö ØÙ¸ Ø Ñ Ò ×ÙÑ Ö ÑÓ× ÕÙ Ð Ò× Ö ÓÒ
× ÑÔÖ × Ö Ð Þ Ð ¬Ò Ð Ð Ð ×Ø º
      Ð × ÑÔ ÒÓ Ð Ò× Ö ÓÒ × Ö Ø Ñ ÒØ O(1) Ñ ÒØ Ð ÓÔ Ö ÓÒ append()
 ÒÐ          Ö ÕÙ ÖÖÓ Ð ÙÒ ÓÒ × º
      Ð × ÑÔ ÒÓ Ð Ð Ñ Ò ÓÒ Ô Ò               Ð × ÑÔ ÒÓ Ð Ù×ÕÙ º ×Ù Ú Þ¸ Ð
  × ÑÔ ÒÓ Ð Ù×ÕÙ ¸ Ü ØÓ× Ó ÐÐ ¸ Ô Ò                 Ð ÐÓÒ ØÙ Ð Ð ×Ø º ÈÓÖ Ø ÒØÓ¸
 Ð × ÑÔ ÒÓ ×Ô Ö Ó ×Ø Ö ÓÑ Ò Ó ÔÓÖ Ð ÐÓÒ ØÙ ×Ô Ö                Ð Ð ×Ø º
      Ò ÐÓ ÕÙ × Ù       ÒÙ ×ØÖÓ Ò Ð × ×¸ M ÒÓØ Ð ÐÓÒ ØÙ Ð ÖÖ ÐÓ ÒØ ÖÒÓ Ý N Ð
ÒÙÑ ÖÓ Ð Ñ ÒØÓ× ÕÙ ÓÒØ Ò Ð Ø Ð º α = N/M Ò               Ð ØÓÖ       Ö  Ð Ø Ð
 × Ö¸ ÕÙ Ø Ò ÐÐ Ò ×Ø Ð Ø Ð º ÓÒ ×Ø Ø ÖÑ ÒÓÐÓ                × ¸ ÔÓ ÑÓ× ÒØÖÓ Ù Ö
ÒÙ ×ØÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð
Lema 5.1 Longitud esperada de una lista de colisiones
    Ë h(k) : K −→ [0, M − 1] ÙÒ ÙÒ ÓÒ × O(1) ÕÙ ×ØÖ ÙÝ ÙÒ ÓÖÑ Ñ ÒØ ÐÓ×
 Ð Ñ ÒØÓ× K         [0, M − 1]º Ë T ÙÒ Ø Ð   ×     ÐÓÒ ØÙ M ÓÒ Ö ×ÓÐÙ ÓÒ
 ÓÐ × ÓÒ × ÔÓÖ Ò Ò Ñ ÒØÓ × Ô Ö Ó Ý ÕÙ ÓÒØ Ò N Ð Ñ ÒØÓ׺ Ë |li| Ð ÒÙÑ ÖÓ
ÒÓ Ó× Ð i¹ × Ñ Ð ×Ø Ò T [i]º ÒØÓÒ ×¸ Ð ÐÓÒ ØÙ ×Ô Ö        li ×

                                     li =
                                          N
                                          M
                                             =α                              ´ºµ
Demostraci´n ÈÙ ×ØÓ
             o            ÕÙ    h(k) : K −→ [0, M − 1]   ×    ×ØÖ ÙÝ ÙÒ ÓÖÑ Ñ ÒØ ¸
P(h(k) = i) = M Ô Ö ÙÒ
               1
                           ÐÚ    Ù ÐÕÙ Ö k ∈ Kº
   Ë P(k ∈ li) Ð ÔÖÓ        Ð         ÕÙ Ð Ð Ú × Ð Ö         Ò Ð i¹ × Ñ Ð ×Ø Ó¹
ÖÖ ×ÔÓÒ ÒØ Ð ÒØÖ T [i]º Ð Ö Ñ ÒØ ¸ × ÙÒ Ð Ó × ÖÚ ÓÒ Ð Ô ÖÖ Ó ÒØ Ö ÓÖ¸
P(k ∈ li) = P(h(k) = i) = Mº × Ô٠׸ Ø Ò ÑÓ× N Ð Ú × ÙÒ ÓÖÑ Ñ ÒØ Ö Ô ÖØ × Ò M
                           1

Ð ×Ø ׺      Ð ×Ø li × ÓÖÖ ×ÔÓÒ ÓÒ ÙÒ ×ØÖ Ù ÓÒ ÒÓÑ Ð ÓÒ Ô Ö Ñ ØÖÓ p = M        1

Ý N ÒØ            Ò× ÝÓ׺ ÈÓÖ Ø ÒØÓ¸ Ð Ñ    × NM1


        ר Ð Ñ × Ö Ú Ò ÐÓ× Ó× × Ù ÒØ × ÕÙ ÓÒØ Ð Þ Ò Ð ÒØ               Ù Ø × ÕÙ
× Ú × Ø Ò Ò ÙÒ Ù×ÕÙ          ÐÐ Ý Ü ØÓ× ¸ Ö ×Ô Ø Ú Ñ ÒØ º
Lema 5.2 Cantidad de cubetas inspeccionadas en una b´ squeda fallida sobre
                                                        u
una tabla hash con resoluci´n de colisiones por encadenamiento separado
                             o
    Ë h(k) : K −→ [0, M − 1] ÙÒ ÙÒ ÓÒ × O(1) ÕÙ ×ØÖ ÙÝ ÙÒ ÓÖÑ Ñ ÒØ ÐÓ×
 Ð Ñ ÒØÓ× K         [0, M − 1]º Ë T ÙÒ Ø Ð    ×    ÐÓÒ ØÙ M ÓÒ Ö ×ÓÐÙ ÓÒ
 ÓÐ × ÓÒ × ÔÓÖ Ò Ò Ñ ÒØÓ × Ô Ö Ó Ý ÕÙ ÓÒØ Ò N Ð Ñ ÒØÓ׺ ÒØÓÒ ×¸ Ð ÒÙÑ ÖÓ
      Ù Ø × ÕÙ × Ò×Ô     ÓÒ Ò Ò ÙÒ Ù×ÕÙ            ÐÐ    ×
                                    UN = α =
                                               N
                                               M
                                                                                 ´ºµ
5.1. Manejo de colisiones                                                                  409



Demostraci´n
          o    Ë k ÙÒ Ð Ú ÕÙ ÒÓ ×Ø ÒØÖÓ Ð Ø Ð º Ð ÔÖ Ñ Ö Ô ×Ó
Ð   Ù×ÕÙ   × Ó Ø Ò Ö li = T [h(k)]º ר ÑÓ Ó¸ Ð ÒÙÑ ÖÓ Ù Ø × Úר Ö ×
 ÓÖÖ ×ÔÓÒ ÓÒ Ð ÒÙÑ ÖÓ ÒÓ Ó× li¸ ÔÙ × × Ò × Ö Ó Ö ÓÖÖ Ö ÒØ Ö Ñ ÒØ li
Ô Ö ×Ø Ö × ÙÖÓ× ÕÙ k ÒÓ × Ò Ù ÒØÖ Ò Ð Ø Ð º ÈÓÖ Ð Ð Ñ º½¸ × ÑÓ× ÕÙ
li = α

Lema 5.3 Cantidad de cubetas inspeccionadas en una b´squeda exitosa sobre
                                                       u
una tabla hash con resoluci´n de colisiones por encadenamiento separado
                             o
   Ë h(k) : K −→ [0, M − 1] ÙÒ ÙÒ ÓÒ × O(1) ÕÙ ×ØÖ ÙÝ ÙÒ ÓÖÑ Ñ ÒØ ÐÓ×
 Ð Ñ ÒØÓ× K       [0, M − 1]º Ë T ÙÒ Ø Ð    ÐÓÒ ØÙ M ÓÒ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ ×
ÔÓÖ Ò Ò Ñ ÒØÓ × Ô Ö Ó Ý ÕÙ ÓÒØ Ò N Ð Ñ ÒØÓ׺ Ë k ∈ K ÙÒ Ð Ú Ù ÐÕÙ Ö º
    ÒØÓÒ ×¸ Ð ÒÙÑ ÖÓ ×Ô Ö Ó     ÒÓ Ó× ÕÙ × Ú × Ø Ò Ò ÙÒ Ù×ÕÙ                     Ü ØÓ× ×
                                     SN = 1 +
                                                 α
                                                   −
                                                 2 2M
                                                     1
                                                                                ´ºµ
Demostraci´n Ë K = {k0, k1, . . . , kN−1}¸ Ð ÓÒ ÙÒØÓ
           o                                             Ð Ú × ÔÖ × ÒØ × Ò Ð Ø Ð ¸
 ÓÒ i Ö ÔÖ × ÒØ Ð ÓÖ Ò Ò× Ö ÓÒ × Ö k0 × Ð ÔÖ Ñ Ö Ð Ú Ò× ÖØ ¸ Ñ ÒØÖ ×
ÕÙ kN−1 × Ð ÙÐØ Ñ º
        ØÓ× Ð × ÑÔÐ     ¸ ×ÙÑ Ö ÑÓ× ÕÙ ÒÓ × Ô ÖÑ Ø Ò Ð Ú × ÙÔÐ             ׸ ÐÓ ÕÙ
Ö ÕÙ Ö ÙÒ Ù×ÕÙ × Ù Ò Ð ×Ó Ö ÙÒ Ð ×Ø Ù Ò Ó × Ö Ð Þ ÙÒ Ò× Ö ÓÒº
   Ë pi Ð ÔÖÓ Ð        ÕÙ × Ù×ÕÙ Ð Ð Ú ÔÖ × ÒØ kiº
   Ë lk Ð ÒÙÑ ÖÓ Ð Ñ ÒØÓ× ÕÙ ÔÖ
          i
                                            Ò ki Ò ×Ù Ð ×Ø      ÓÐ × ÓÒ ×º ÒØÓÒ ×
                                                 N−1
                                     E(lki ) =         pilki .
                                                 i=0

 ×ÙÑ Ò Ó ÕÙ Ù ÐÕÙ Ö Ð Ú Ø       Ò Ù Ð ÔÖÓ Ð            × Ö Ù× ¸ ÒØÓÒ × pi = 1/Nº
  ×ÔÙ × Ò× ÖØ Ö Ð Ð Ú ki¸       Ý i Ð Ñ ÒØÓ× Ò Ð Ø Ð ¸ ÐÓ ÕÙ ¸ × ÙÒ Ð Ð Ñ º½¸
ÕÙ Ð ÐÓÒ ØÙ      Ð Ð ×Ø ÓÒ       Ö × ki × lk = i/Mº Ç × ÕÙ Ô Ö Ò ÓÒØÖ Ö ki
                                                        i
  Ý ÕÙ Ö ÓÖÖ Ö M Ù Ø × ÔÖ
               i
                                    ×ÓÖ ×¸ ÔÙ × ki × Ò× ÖØÓ Ð ¬Ò Ð Ð Ð ×Ø Ý ÒÓ ×
Ô ÖÑ Ø Ò ÙÔÐ Ó׺ ×ØÓ ÓÒØ         Ð Þ ÙÒ ØÓØ Ð M + 1¸ ÔÙ × Ý ÕÙ
                                                 i
                                                                        Ö Ð Ù Ø
ÕÙ ÓÒØ Ò kiº
       ר ÑÓ Ó¸ Ð ÒÙÑ ÖÓ        ×Ô Ö Ó            Ù Ø×              Ü ÑÒ Ö× Ö
                               N−1                                  N−1
                                          i                     1         i
                   E(lki ) =         pi     +1          =                   +1
                                          M                     N         M
                               i=0                                  i=0
                                          N−1        N−1
                               1     1                                  N−1
                          =                     i+          1       =       +1
                               N     M                                  2M
                                          i=0        i=0
                               α    1
                          =      −    +1
                               2   2M
    ÓÒ ×ØÓ× Ó× Ö     ÒØ × Ð Ñ ×¸ ר ÑÓ× Ð ×ØÓ× Ô Ö ÒÙÒ Ö Ý ÑÓ×ØÖ Ö Ð ÔÖÓÔÓ× ÓÒ
× Ù ÒØ
Proposici´n 5.1 Desempe˜ o esperado de una tabla hash con resoluci´n de co-
          o             n                                         o
lisiones por encadenamiento separado
410                                                      Cap´
                                                            ıtulo 5. Tablas hash



    Ë h(k) : K −→ [0, M − 1] ÙÒ ÙÒ ÓÒ × O(1) ÕÙ ×ØÖ ÙÝ ÙÒ ÓÖÑ Ñ ÒØ ÐÓ×
 Ð Ñ ÒØÓ× K          [0, M − 1]º Ë T ÙÒ Ø Ð    ÐÓÒ ØÙ M ÓÒ Ö ×ÓÐÙ ÓÒ      ÓÐ ¹
× ÓÒ × ÔÓÖ Ò Ò Ñ ÒØÓ × Ô Ö Ó Ý ÕÙ ÓÒØ Ò ÙÒ Ñ Ü ÑÓ ÓØ Ó N Ð Ñ ÒØÓ׺
  ÒØÓÒ ×¸ Ð × ÑÔ ÒÓ ×Ô Ö Ó Ð × ÓÔ Ö ÓÒ × Ò× Ö ÓÒ¸ Ù×ÕÙ Ý Ð Ñ Ò ÓÒ
 × O(α) = O(1)º
Demostraci´no     Ð ÔÙÒØÓ ÖÙ Ð Ð ÑÓ×ØÖ ÓÒ × ÔÖ Ò Ö ÕÙ Ø ÒØÓ M ÓÑÓ
N ×ÓÒ Ú ÐÓÖ × ÓÒר ÒØ Ñ ÒØ      ÓØ Ó׺ ÈÓÖ ÓØ Ó ÒØ Ò ÑÓ× ÕÙ ¸ × Ò N ÔÙ
× Ö Ñ ÝÓÖ ÕÙ M¸ רÓ× Ú ÐÓÖ × ×Ø Ò ÓØ Ó× Ñ Ü ÑÓ× ÓÒÓ Ó׸ Ö ÞÓÒ ÔÓÖ Ð Ù Ð α
Ø Ñ Ò ×Ø ÓØ Ó ÙÒ Ú ÐÓÖ Ñ Ü ÑÓ ÓÒר ÒØ º Ð Ö Ó ×ØÓ¸ ÔÓ ÑÓ× × Ô Ö Ö
ÙÒ Ð × ÓÔ Ö ÓÒ ×
Inserci´n
        o     Ò ×Ø ×Ó × Ö Ð Þ ÙÒ Ù×ÕÙ        ÐÐ ¸ Р٠и × ÙÒ Ð Ð Ñ º¾¸ ×Ô Ö
       Ò×Ô ÓÒ Ö α = O(1) Ù Ø ×º
B´squeda
 u

      ½º Ë Ð Ù×ÕÙ      × ÐÐ ¸ ÒØÓÒ × Ð Ð Ñ º¾ ÔÐ             Ý Ð ×Ô Ö ÒÞ ×
                                          α = O(1)                           ´ º½¼µ
      ¾º Ë Ð Ù×ÕÙ      × Ü ØÓ× ¸ ÒØÓÒ × Ð Ð Ñ º¿ ÔÐ          Ý Ð ×Ô Ö ÒÞ ×
                                    1+
                                         α
                                         2
                                           −
                                              1
                                             2M
                                                = O(1)                       ´ º½½µ
Eliminaci´n
         o         Ò ×Ø ×Ó × Ö Ð Þ ÙÒ Ù×ÕÙ       Ü ØÓ× ¸ Ð Ù Ð Ò Ð Ø Ñ ÒØ Ö ÓÖ
      × ÑÓרÖÓ × Ö O(1)
   Ê ×Ô ØÓ Ð Ì LhashTable<Key>¸ Ð ÑÓ×ØÖ ÓÒ ×ÓÐÓ Ø Ò Ð Ù×ÕÙ ¸ Ô٠׸
ÔÓÖ ×Ù ÙÒ ÓÒ Ð ¸ Ò ×Ø Ì Ø ÒØÓ Ð Ò× Ö ÓÒ ÓÑÓ Ð Ð Ñ Ò ÓÒ ×ÓÒ O(1)º
   ÍÒ Ú ÒØ           Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó × ÕÙ Ð ÒÙÑ ÖÓ Ð Ñ ÒØÓ× N ÔÙ × Ö
Ñ ÝÓÖ ÕÙ Ð Ø Ñ ÒÓ Ð Ø Ð Mº Ä Ò× Ö ÓÒ ÒÓ Ø Ò ¸ ÒØÓÒ ×¸ ÔÓÖÕÙ ÔÖ Ó ÙÔ Ö×
ÔÓÖ Ð × ÓÖ ¸ ÐÓ ÕÙ ÒÓ× ÔÖÓÔÓÖ ÓÒ ­ Ü Ð              Ö ÙÒר Ò ×º    ÐÓ× Ò ÓÕÙ ×
ØÖ ÓÒ Ð × Ô Ö Ñ Ò Ö ÓÐ × ÓÒ ×¸ ר × Ð ÙÒ Ó ÕÙ Ô ÖÑ Ø N > M × Ò ÕÙ ÑÙ Ó
×     Ö     Ð Ö Ò Ñ ÒØÓ ×Ô Ö Óº
   ÆÓØ ÑÓ× ÕÙ Ð × ÑÔ ÒÓ Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó × ÙÒ ÔÖ                ÓÒ¸ ÕÙ Ø Ò
ÔÖÓ Ð ÐÐ × º ÍÒ Ò Ó Ö ×ÔÙ ×Ø ÒÓ× Ð × ÔÖÓÔÓÖ ÓÒ Ð Ú Ö ÒÞ ¸ Ð Ù Ð ×
   ÐÑ ÒØ Ð ÙÐ Ð Ð ÔÖÙ             Ð Ð Ñ º½ Ò Ð ÕÙ Ø ÖÑ Ò ÑÓ× ÕÙ Ð ÐÓÒ ØÙ
ÙÒ Ð ×Ø       ÓÐ × ÓÒ × × ×ØÖ ÙÝ ÒÓÑ ÐÑ ÒØ ÓÒ Ô Ö Ñ ØÖÓ p = M Ý N ÒØ
                                                                1

    Ò× ÝÓ׺ ÈÓÖ Ø ÒØÓ¸ Ð Ú Ö ÒÞ ×
                      Ú Ö=   σ2 =
                                    N
                                    M
                                      1−
                                         1
                                         M
                                                = α−
                                                         α
                                                         M
                                                                             ´ º½¾µ
 Ù ÒØÓ Ñ ÝÓÖ × M¸ Ñ × ÔÖÓÜ Ñ      × Ð Ú Ö ÒÞ Ð Ú ÐÓÖ α = liº Å ÒØÖ × Ñ ÝÓÖ ×
Ð ÒØ          Ð Ñ ÒØÓ׸ Ñ ÝÓÖ Ø Ò   × Ö Ð Ú Ö ÒÞ º Ë Ò Ñ Ö Ó¸ ר Ó × ÖÚ ÓÒ
 × Ò Ð Ö Ó α ݸ Ùר Ñ ÒØ ¸ Ð ÔÖÓÔÓ× ØÓ Ð ÙÐØ Ñ ÜÔÖ × ÓÒ × Ö ­ Ö Ð            Ó
  ÕÙ ¸ Ñ ÝÓÖ Ö Ó¸ Ó × ¸ Ñ ÝÓÖ ÔÐ Ò ØÙ ¸ Ñ ÝÓÖ × Ð Ú Ö ÒÞ º
5.1. Manejo de colisiones                                                         411



5.1.3.3   Encadenamiento cerrado

  Ð Ù Ð ÕÙ Ò Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó¸ Ò ×Ø ×ØÖ Ø Ð × ÓÐ × ÓÒ × × Ò Ò Ò
 Ò Ð ×Ø × ÒÐ Þ ×¸ Ô ÖÓ Ð   Ö Ò ×ØÖ Ò ÕÙ Ð × Ù Ø × Ö × Ò Ò Ð ÔÖÓÔ Ø Ð º
  Ù Ò Ó Ó ÙÖÖ ÙÒ ÓÐ × ÓÒ¸ × ×ÓÒ   Ð Ò ÐÑ ÒØ Ð Ø Ð Ò Ù×ÕÙ     ÙÒ Ù Ø
Ú º Ä Ø Ð ÑÔÐÓ Ð ×Ù ¹× ÓÒ ÒØ Ö ÓÖ¸ ÓÒ Ð × Ñ ×Ñ × Ð ×Ø × ÓÐ × ÓÒ ×¸ ×
Ú ×ÐÙÑ Ö ×
                                    0   k1
                                    1   k10
                                    2   k8
                                    3   k11
                                    4
                                    5   k2
                                    6   k5
                                    7   k9
                                    8   k3
                                    9
                                   10 k4
                                   11 k7




                                 M−2
                                 M − 1 k6



ÆÓØ ÑÓ× Ð ÓÐ × ÓÒ {k6, k11}¸ Ð Ù Ð Ö ÕÙ Ö Ó ÓÒØ ÒÙ Ö Ð ×ÓÒ   Ó ÔÓÖ Ð ÔÖ Ò Ô Ó Ð Ø Ð
  ר Ð ÒÞ Ö Ð Ù ÖØ ÒØÖ             Ð Ø Ð × Ö¸ Ð ×ÓÒ          ÓÐÒ Ð        × Ö Ö ÙÐ Öº
    Ð ×ÓÒ Ó Ö ÕÙ Ö ÙÒ ÓÖÑ             ר Ò Ù Ö × ÙÒ Ù Ø       ר Ó ÒÓ Ú º Ä Ñ Ò Ö
 Ò Ö ØÖ ÓÒ Ð × Ù× Ö ÙÒ Ø ÓÒ Ú ÐÓÖ BUSY Ô Ö Ò                 Ö Ó ÙÔ ÓÒ¸ Ó¸ EMPTY Ô Ö
Ò Ö ×ÔÓÒ Ð º
B´squeda
 u
   Ä Ù×ÕÙ        ×   ÒØ      Ð   Ð Ò          Ò Ñ ÒØÓ × Ô Ö Óº
Eliminaci´n
         o
    Ä Ð Ñ Ò ÓÒ¸ ÕÙ Ö ÕÙ Ö Ð Ù×ÕÙ ¸ × Ö Ñ Ø Ñ Ö Ö Ð ÒØÖ ÕÙ ÓÒØ Ò
 Ð Ð Ñ ÒØÓ Ð Ñ Ò Ö ÓÑÓ Empty ݸ Ò ×Ó ÕÙ ×ÔÙ × Ý Ò ÓÐ × ÓÒ ×¸ ×
  ÓÖØÓ¹ Ö Ù Ø Ö Ð ÒÐ        Ð Ð Ñ ÒØÓ ÔÖ  ×ÓÖ Ô Ö ÕÙ ÔÙÒØ Ð Ð Ñ ÒØÓ ×Ù ×ÓÖº
    ÍÒ ×Ó ×Ô ÐÑ ÒØ Ô ÖØ ÙÐ Ö Ó ÙÖÖ Ù Ò Ó × Ð Ñ Ò Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ ÒØÖÓ
    ÙÒ Ð ×Ø      ÓÐ × ÓÒ ×º Ò ×Ø × ØÙ ÓÒ¸ Ð ÓÖØÓ¹ Ö Ù ØÓ ÒÓ × ÔÙ Ö Ð Þ Ö
  Ö Ø Ñ ÒØ ¸ ÔÙ × ÒÓ × Ø Ò ÙÒ ÓÐ × ÓÒ ÕÙ ÔÖ            Ð Ð Ñ ÒØÓ Ð Ñ Ò Óº È Ö
Ö ×ÓÐÚ Ö ×ØÓ¸ Ð × ÙÒ Ó Ð Ñ ÒØÓ Ò Ð Ð ×Ø × ÑÙ Ú          Ð ÔÓ× ÓÒ Ð Ñ Ò ÓÒ Ý¸
  Ô ÖØ Ö ×Ø ÔÓ× ÓÒ¸ × Ö Ð Þ Ð ÓÖØÓ¹ Ö Ù ØÓ              Ð Ø Ö Ö Ð Ñ ÒØÓ ÓÐ Ò ÒØ º
È Ö ÙÒ ÔÓØ Ø Ó ÓÒ ÙÒØÓ ÓÐ × ÓÒ × {ki, kj, kk, kl}¸ Ð × ØÙ ÓÒ × ÔÙ ÒØ ÖÔÖ Ø Ö
Ô ØÓÖ Ñ ÒØ ×
     Ò Ò Ð ×¸ Ð Ù×ÕÙ        ÙÒ Ù Ø ÓÒ ×Ø ØÙ× EMPTY × Ð ÒÓÑ Ò     ÔÖÓ Ò º ËÓÒ    Ö × Ð
Ø ÖÑ ÒÓ ÕÙ Ù× Ö ÑÓ× Ò ×Ø ÐÐ ÒÓ Ô Ö Ö Ö ÖÒÓ× Ð Ô Ð Ö ÒØ Ö ÓÖº
412                                                        Cap´
                                                              ıtulo 5. Tablas hash




                              ki                  kj


                              kj




                              kk                  kk

                              kl                  kl



ÈÙ ×ØÓ ÕÙ ÓÒ ×Ø Ø Ò ÐÓ× Ð Ñ ÒØÓ× ÔÙ Ò ÑÓÚ Ö×      ×Ù ÔÓ× ÓÒ ÓÖ Ò Ð Ò¹
× Ö ÓÒ¸ ר ×ÕÙ Ñ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ × ÒÓ Ô ÖÑ Ø Ñ ÒØ Ò Ö ÔÙÒØ ÖÓ× Ð Ñ ÒØÓ×
  Ð ÓÒ ÙÒØÓ ÐÑ Ò Ó Ò Ð Ø Ð × ØÙ ÓÒ Ò × Ð Ò Ð ÙÒÓ× ×Ó׺
Inserci´n
       o
   Ä Ò× Ö ÓÒ × Ð ÓÔ Ö ÓÒ Ñ × ÓÑÔÐ              Ò ×Ø ×ÕÙ Ñ Ý × Ö Ð Þ ÓÑÓ × Ù
  ½º i = h(k) ÑÓ M
  ¾º Ë A[i].busy == EMPTY =⇒
       ´ µ A[i].key = k
       ´ µ A[i].busy = BUSY
       ´ µ Ì ÖÑ Ò Öº
  ¿º      ÐÓ ÓÒØÖ Ö Ó =⇒
       ´ µ Ê ÓÖÖ Ö Ð Ð ×Ø ÒÐ Þ   ר Ð ÙÐØ ÑÓ Ð Ñ ÒØÓ × k ×Ù ÔÓ× ÓÒ Ò Ð
            Ø Ðº
       ´ µ Ô ÖØ Ö k Ù× Ö Ð Ò ÐÑ ÒØ Ò Ð Ø Ð Ð ÔÖ Ñ Ö ÒØÖ    ÓÒ Ú ÐÓÖ EMPTY
            × i Ð Ò       ר ÒØÖ º
       ´ µ A[i].key = k
       ´ µ A[i].busy = BUSY
       ´ µ A[j].next = A[i]
5.1.3.4   An´lisis informal del encadenamiento cerrado
            a

    × ÖÒÓ× Ð ×ÙÑ Ö ÕÙ × M ≈ ∞¸ ÒØÓÒ × Ð Ò Ð × × × ÔÖÓÜ Ñ Ó Ð Ò ¹
Ò Ñ ÒØÓ × Ô Ö Óº ר ×ÙÔÓ× ÓÒ Ð Ó ÖÖ Ð ×Ø ¸ ÒÓ× Ô ÖÑ Ø ÔÖ Ò Ö ÕÙ ¸ Ô Ö
M   N¸ × ÙÒ ÐÓ× Ð Ñ × ´ º¾µ Ý ´ º¿µ¸ Ð Ò Ð × × ÔÙ ÔÖÓÜ Ñ Ö×
                                   SN ≈
                                          α
                                          2
                                            −
                                               1
                                              2M
                                                 +1                           ´ º½¿µ
                                   UN   ≈ α                                   ´ º½ µ
                                   ÚÖ   ≈ α−
                                              α
                                              M
                                                                              ´ º½ µ
 Ò Ð ×Ù ¹× ÓÒ Ü º½º º¿ ´Ô Ò             ¾¼µ ÔÖ × ÒØ Ö ÑÓ× ÙÒ Ò Ð × × Ñ × ÓÖÑ Ð ÕÙ ×
 ÔÐ Ð ×Ø ×ØÖ Ø º
5.1. Manejo de colisiones                                                              413



    Å ÒØÖ × Ñ ÒÓÖ × Ð Ö α¸ Ñ × ÔÖ × Ý Ö Ð ×Ø × Ð ÔÖÓÜ Ñ ÓÒº À ר
ÕÙ Ú ÐÓÖ α × ÙÑÔÐ Ð ÔÖÓÜ Ñ ÓÒ Ð Ò Ð × × ÓØÖ Ø Ò ¸ ÜÔÐ Ó Ò
Ü º½º º ´Ô Ò          ¾ µ¸ ÒÓ× Ô ÖÑ Ø Ú ×ÐÙÑ Ö Ö ÕÙ Ð ÔÖÓÜ Ñ ÓÒ × Ù Ò ×Ø ÙÒ
   ØÓÖ        Ö α = 0, 7 × Ö¸ ÙÒ ÔÓÖ ÒØ             Ó ÙÔ ÓÒ Ð ¼±º
    ÄÓ ÒØ Ö ÓÖ ÒÓ× Ò ÕÙ × × ÑÓ× ÒרÖÙÑ ÒØ Ö Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð ÓÒ ÙÒ
Ø Ð × Ý × ÑÔ ÒÓ ×Ô Ö Ó O(1)¸ ÒØÓÒ ×                    ÑÓ× ×Ø Ñ Ö Ð ÒØ         ×Ô Ö
     Ð Ñ ÒØÓ× ÕÙ Ú ÑÓ× Ù Ö Ö Ý¸ Ò ÙÒ ÓÒ Ð ×Ø Ñ ÓÒ¸ × Ó Ö M ÑÓ Ó ÕÙ
ÒÓ× × Ø ×       Ð Ú ÐÓÖ α Ô Ö Ð Ù Ð ÐÓ× Ö ×ÙÐØ Ó× ×ÓÒ Ù ÒÓ׸ Ñ × ÙÒ Ñ Ö Ò Ó ØÓÖ
     ÖÖÓÖº Ë ¸ ÔÓÖ ÑÔÐÓ¸ ×Ô Ö ÑÓ× 1000 Ð Ñ ÒØÓ׸ ÒØÓÒ × × Ó ÑÓ× M = 1465¸ ÐÓ
 Ù Ð Ù Ö Ð ¼± Ñ Ò ÓÒ Ó¸ Ñ × ÙÒ ± ÓÑÓ ØÓÖ ÖÖÓÖ Ò Ò Ö Ð º
    ÍÒ Ñ ÓÖ Ô Ö ×Ø Ò ÓÕÙ ÓÒ× ×Ø Ò ÑÔÐ Ö ÙÒ Ö ÓÒØ Ù Ð Ø Ð Ü ÐÙ¹
× Ú Ñ ÒØ º Ò ×Ø ×Ó Ð Ø Ð Ø Ò ÙÒ Ø Ñ ÒÓ M + C ÒØÖ ×º Ù Ò Ó Ó ÙÖÖ ÙÒ
 ÓÐ × ÓÒ¸ ÒØÓÒ × Ð ×ÓÒ Ó Ð Ò Ð × Ö Ð Þ ÒØÖ Ð Ö Ò Ó [M..C)º Ê ×ÙÐØ Ó× ÑÔ Ö Ó×
Ö ÔÓÖØ Ó× ÔÓÖ ¾¿ Ò Ò ÕÙ ÙÒ Ú ÐÓÖ C ≈ 1.14M × ×Ù¬ ÒØ Ô Ö ×Ô Ö Ö                  Ò×
 ÓÐ × ÓÒ ×      Ó× Ð Ñ ÒØÓ׺ ×ØÓ Ø Ò × ÒØ Ó Ð ÐÙÞ Ð Ô Ö Ó Ð ÙÑÔÐ ÒÓ׸ Ð
 Ù Ð Ô Ø ÒØ ÐÓ ×Ø ÒØ ÔÖÓ Ð ÕÙ × ÙÒ ÓÐ × ÓÒ                 Ó× Ð Ñ ÒØÓ× Ô ÖÓ ÙÒ Ò Ð × ×
Ô Ö ÓÐ × ÓÒ × ØÖ × Ó Ñ × Ð Ñ ÒØÓ× ÒÓ× Ò             ÑÙ Ñ ÒÓ× ÔÖÓ Ð º
         ר ר Ó ØÖ Ø Ñ ÒØÓ Ð × Ø Ð × × ¸ ÔÖÓ Ð Ñ ÒØ Ð ÙÒ Ð ØÓÖ Ý
Ó × ÖÚ Ó¸ ÓÑÓ ×Ú ÒØ                ר Ò ÓÕÙ ¸ Ð Ð Ñ Ø ÓÒ ÕÙ × ÑÔÓÒ ×Ó Ö Ð Ñ Ü ÑÓ
ÒÙÑ ÖÓ Ð Ñ ÒØÓ× ÕÙ ÔÓ ÑÓ× Ù Ö Ö Ò ÙÒ Ø Ð × ÓÒ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ ×
ÔÓÖ Ò Ò Ñ ÒØÓ ÖÖ Óº                   Ó Ð Ñ ×Ñ Ð Ò      Ô Ò× Ñ ÒØÓ¸ Ø Ñ Ò × ÔÙ Ö
Ó × ÖÚ Ö¸ ÓÑÓ Ú ÒØ           Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó¸ ÕÙ ×Ø Ô ÖÑ Ø Ù Ö Ö Ñ × Ð ¹
Ñ ÒØÓ× ÕÙ Ð Ú ÐÓÖ Mº ٠Р׸ ÒØÓÒ ×¸ Ð × ÒØ Ó ×Ø Ø Ò
      Ð ×ÓÑ ÖÓ Ý Ð ×ÓÖÔÖ ×             Ñ Ö Ó ÑÙ Ó× ×ØÙ ÒØ ׸ Ò ÐÙ× Ú ¸ Ð ÙÒÓ×
 ×ØÙ Ó×Ó׸ Ù Ò Ó × Ö Ð Þ ÕÙ ¸ ÓÒ× Ö Ò Ó ÓÖÖ Ø Ñ ÒØ ÐÓ× ØÓÖ × ÒÚÓÐÙ Ö Ó׸
 Ò Ô ÖØ ÙÐ Ö¸ Ð Ú ÐÓÖ ×Ô Ö Ó N¸ ÐÓ× Ò ÓÕÙ × ÕÙ Ö ×Ù ÐÚ Ò ÓÐ × ÓÒ × ÒØÖÓ
Ð Ñ ×Ñ Ø Ð Ø Ò Ò × Ö Ñ ÓÖ × ÑÔ ÒÓ ÕÙ Ð Ò Ò Ñ ÒØÓ × Ô Ö Óº Ä
 ÔÖ Ò× ÓÒ ×Ø Ö Ð              ×     Ð Ø Ñ ÒØ Ð × × Ù ÒØ × Ó × ÖÚ ÓÒ ×
   ½º Ò Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó Ð × Ù Ø × × Ô ÖØ Ò Ý Ð Ö Ò ØÖ Ú × Ð Ñ Ò ¹
           ÓÖ Ñ ÑÓÖ º Ð Ñ Ò Ó Ñ ÑÓÖ Ò Ñ ¸ Ø ÒØÓ Ô Ö Ö × ÖÚ ÖÐ ÓÑÓ Ô Ö
       Ð Ö ÖÐ ¸ ÒÓ ×ÓÐÓ ØÓÑ ÙÒ Ø ÑÔÓ Ñ × Ö ×Ô ØÓ ÙÒ Ò ÓÕÙ                Ö ×ÓÐÙ ÓÒ
        ÓÐ × ÓÒ × ÕÙ Ð × ÓÐÓÕÙ ÒØÖÓ Ð Ñ ×Ñ Ø Ð ¸ × ÒÓ ÕÙ ×Ù × ÑÔ ÒÓ × Ú Ö ¹
        Ð × ÙÒ Ð Ö            Ð Ñ Ò ÓÖ Ö ÕÙ ¸ ×Ù Ú Þ¸ Ô Ò              ÓÒ ÓÒ × Ø Ð ×
        ÓÑÓ Ö Ù Ò           Ö × ÖÚ ÓÒ Ý Ð Ö Ó Ý Ð ÒØ          ØÙ Ð ÐÓÕÙ × Ö × ÖÚ Ó׺
       È Ö Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó¸ Ð Ô ÖØ Ó Ø Ð ÓÔ Ö ÓÒ Ò× Ö ÓÒ¸
       Ñ ÒØÖ × ÕÙ Ð Ð Ö ÓÒ Ð Ð Ñ Ò ÓÒº ÈÓÖ Ð ÓÒØÖ Ö Ó¸ ÓÒ Ð Ò Ò Ñ ÒØÓ
          ÖÖ Ó Ý Ñ × ×ØÖ Ø × ÕÙ ÓÐÓ Ò Ð × ÓÐ × ÓÒ × ÒØÖÓ Ð Ñ ×Ñ Ø Ð ¸ ÒÓ
       × Ù× Ð Ñ Ò ÓÖ Ñ ÑÓÖ º
         Ð Ù Ò ÔÙ Ö ×Ù Ö Ö Ø Ò Ö ÔÖ ¹ Ô ÖØ Ó ÙÒ ÓÒ ÙÒØÓ Ù Ø ×¸ Ô ÖÓ¸ ÒÓ × ×ØÓ
       Ô Ö Ó ÙÒ Ò ÓÕÙ ÖÖ Ó º
   ¾º Ò Ð Ò Ò Ñ ÒØÓ ÖÖ Ó Ý Ñ × ×ØÖ Ø × ÕÙ ÓÐÓÕÙ Ò ÓÐ × ÓÒ × ÒØÖÓ
           Ð Ñ ×Ñ Ø Ð ¸ Ð ×ÓÒ Ó Ð Ò Ð × Ö Ð Þ ×Ó Ö Ù Ø × ÕÙ ×Ø Ò ÓÒØ Ù × Ò
   Ò Ò Ò Ö ¸ ×Ù Ð Ù× Ö× Ð Ø ÖÑ ÒÓ ØÓÖ      × ÙÖ       Ô Ö ÜÔÖ × Ö ÙÒ ×Ó Ö ¹ Ð ÙÐÓ Ò ÓÒ× ¹
Ö ÓÒ Ð Ò ÖØ ÙÑ Ö Ð ÑÓ ÐÓ¸ ÖÖÓÖ ×           Ð ÙÐÓ Ò ×Ù× Ú Ö× × × × Ý      Ø ×¸ Ý ÖÖÓÖ × Ò Ð ×
 Ö × ×Ô Ö ×º
414                                                     Cap´
                                                           ıtulo 5. Tablas hash



      Ñ ÑÓÖ ¸ ÐÓ ÕÙ ÔÖÓÚ       Ð      Ð Ö Û Ö º ÈÓÖ Ð ÓÒØÖ Ö Ó¸ ÓÒ Ð Ò ¹
      Ò Ñ ÒØÓ × Ô Ö Ó¸ Ð × Ù Ø × ×Ø Ò Ò Ö ÓÒ × Ñ ÑÓÖ × ÓÒØ Ò٠׺ ÈÓÖ
       ÓÒ× Ù ÒØ ¸ Ô Ö Ð Ñ ×ÑÓ ÓÒ ÙÒØÓ ÓÐ × ÓÒ ×¸ ×Ù Ò×Ô ÓÒ ÒØÖÓ Ð ÔÖÓÔ
      Ø Ð Ø Ò × Ö ÓÒ× Ö Ð Ñ ÒØ Ñ × Ö Ô ÕÙ ×Ù Ò×Ô ÓÒ ÐÓ Ð Ö Ó ÙÒ
          Ò      Ù Ø × × ÓÒØ ÒÙ × Ò Ð Ñ ÑÓÖ ¸ ÔÙ × Ð ÔÖ Ñ ÖÓ ÔÖÓÚ    Ð
      Ý Ð ÓØÖÓ ÒÓº
5.1.4     Direccionamiento abierto
  ÓÑÓ Ý ÐÓ Ò ÑÓ׸ Ò Ð Ö ÓÒ Ñ ÒØÓ ÖØÓ ØÓ ÓÐ × ÓÒ × Ö ×Ù ÐÚ ÒØÖÓ
Ð Ø Ð × Ò ÔÙÒØ ÓÖ          Ð ÓÐ × ÓÒº
     ÙÒ Ñ ÒØ ÐÑ ÒØ ¸ Ð × Ð × ÓÒØ Ò Ò Ö ×ØÖÓ× ÓÒ Ð Ú ÐÓÖ            Ð Ú Ý ÙÒ Ñ Ö ¸
   ÒÓÑ Ò    ר ØÙ× ¸ ÓÒ ØÖ × ÔÓ× Ð × Ú ÐÓÖ ×
EMPTY Ð        Ð ×Ø ×ÔÓÒ Ð Ô Ö ÐÑ Ò Ö ÙÒ Ð Ú º
BUSY Ð       Ð ×Ø Ó ÙÔ ÔÓÖ ÙÒ Ð Ú º
DELETED Ð         Ð ÓÒØ Ò ÙÒ ÒØÖ ÕÙ Ò Ð ÙÒ ÑÓÑ ÒØÓ ÓÒØÙÚÓ ÙÒ Ð Ú Ý
      ÕÙ ÐÙ Ó Ù ÓÖÖ º Å × Ð ÒØ Ú Ö ÑÓ× ÔÓÖ ÕÙ × Ò × Ö ×Ø Ñ Ö º
    ÍÒ Ù Ø tabla[i] ÔÙ ×Ø Ö Ó ÙÔ             ÓÑÓ Ö ×ÙÐØ Ó Ö ØÓ Ð ÙÒ ÓÒ × Ó
ÔÓÖÕÙ × ÙÒ ÓÐ × ÓÒ Ý Ù × Ó ÔÓÖ Ð ÙÒ Ø Ò                 ×ÓÒ Óº Ù ÐÕÙ Ö ÐÓ× Ó×
  ×Ó× × ×Ø Ò Ù Ñ ÒØ ÓÑÔÖÓ ÓÒ Ð ÔÖ                   Ó h(Ø Ð [i]) = iº Ë Ð ÔÖ    Ó
 × ÖØÓ¸ ÒØÓÒ × Ð Ð Ú ÒÓ Ù ÙÒ ÓÐ × ÓÒº
5.1.4.1    Sondeo ideal (sondeo uniforme)

ÈÙ ×ØÓ ÕÙ Ð × ÓÐ × ÓÒ ×      Ò ×Ø Ö ÒØÖÓ Ð ÔÖÓÔ Ø Ð ¸ Ð ×ØÖ Ø × Ö Ñ Ø
 Ò ÓÒØÖ Ö ÙÒ Ù Ø ÙÝÓ Ú ÐÓÖ × ×Ø ÒØÓ EMPTYº ÈÙ             Ö× ÕÙ Ð ×ØÖ Ø
  ×Ô Ö× ÓÒ ÖÖ ´ Ö ÓÒ Ñ ÒØÓ ÖØÓµ × ÙÒ ×ØÖ Ø                 ×ÓÒ Óº
       ٠Р׸ ÒØÓÒ ×¸ Ð ×ØÖ Ø       ×ÓÒ Ó Ð Ë ÔÖ ×ÙÑ ÕÙ × ÕÙ ÐÐ ÕÙ
 Ò×Ô ÓÒ Ð ØÓÖ Ñ ÒØ Ð × Ù Ø × × Ö¸ Ù Ò Ó Ó ÙÖÖ ÙÒ ÓÐ × ÓÒ¸ Ð ÔÖÓÜ Ñ
 Ù Ø ×ÓÒ Ö Ò ÓÒ ÓÐÓ Ö Ð ÓÐ × ÓÒ                 × Ð ÓÒ Ö× Ð ØÓÖ Ñ ÒØ Ò Ð Ò¹
Ø ÖÚ ÐÓ [0, M− 1]º Ì Ô Ñ ÒØ ¸ ר ×ÙÔÓ× ÓÒ × ÓÒÓ       ÓÑÓ hashing o dispersi´n
                                                                            o
universal Ý × Ð           Ð ÔÓÖÕÙ    Ð Þ ÐÓ ÕÙ × Ö Ð Ñ ÓÖ × ÑÔ ÒÓ Ù ÐÕÙ Ö
 ×ØÖ Ø       ÖÖ       Ñ Ò Ó ÓÐ × ÓÒ ×º
Lema 5.4 (Peterson 1957 [27]) Cantidad de cubetas inspeccionadas en una
b´ squeda fallida sobre una tabla hash con resoluci´n de colisiones por direc-
  u                                                o
cionamiento y sondeo ideal
    Ë h(k) : K −→ [0, M − 1] ÙÒ ÙÒ ÓÒ × O(1) ÕÙ ×ØÖ ÙÝ ÙÒ ÓÖÑ Ñ ÒØ ÐÓ×
 Ð Ñ ÒØÓ× K         [0, M − 1]º Ë T ÙÒ Ø Ð    ×     ÐÓÒ ØÙ M ÓÒ Ö ×ÓÐÙ ÓÒ
 ÓÐ × ÓÒ × ÔÓÖ Ö ÓÒ Ñ ÒØÓ ÖØÓ Ý ÕÙ ÓÒØ Ò N Ð Ñ ÒØÓ׺ Ë k ∈ K ÙÒ Ð Ú
Ù ÐÕÙ Ö º ÒØÓÒ ×¸ Ð ÔÖÓÑ Ó         Ù Ø × ÕÙ × Ú × Ø Ò Ò ÙÒ Ù×ÕÙ         ÐÐ     ×
                                        M+1
                                UN =
                                       M−N+1
                                                                             ´ º½ µ
5.1. Manejo de colisiones                                                                                                                      415



Demostraci´n
          o              ÒÙÒ ÑÓ× UN                             Ð × Ù ÒØ Ñ Ò Ö
                  UN =
                              ËÙÑ         Ð

                                         ÌÓØ Ð
                                                 ÒØ

                                                          ÓÒ¬ ÙÖ
                                                                   ×ÓÒ   Ó×      i

                                                                       ÓÒ × ÔÓ× Ð ×
                                                                                     Ù   Ø × Ò Ù×ÕÙ

                                                                                           Ð Ø     Ð    ×
                                                                                                              ÐÐ
                                                                                                                    =
                                                                                                                          πi
                                                                                                                          πN
                                                                                                                                           ´ º½ µ
    Ë Ø Ò ÑÓ× M Ù Ø × ÒÙÑ Ö × ÒØÖ 1 Ý M Ð × Ö Ô ÖØ ÑÓ× Ð × N Ð Ú × Ò× ÖØ ׸
 ÒØÓÒ × Ð ØÓØ Ð Ñ Ò Ö × ÔÓ× Ð ×              ÖÐÓ × M Ó × ¸ Ð ØÓØ Ð ÓÒ¬ ÙÖ ÓÒ ×
                                                   N
ÔÓ× Ð × Ð Ø Ð × ×ØÓ × πNº
    Ë i Ð ÒØ             Ù Ø × ÕÙ × Ò×Ô ÓÒ Ò Ò ÙÒ Ù×ÕÙ               ÐÐ ÓÒ ×ÓÒ Ó
    к
    È Ö ÕÙ × ÓÒ×ÙÑ Ò i ×ÓÒ Ó׸ Ð × ÔÖ Ñ Ö × i − 1 Ù Ø ×          Ò Ø Ò Ö ×Ø ØÙ× BUSY¸
Ñ ÒØÖ × ÕÙ Ð ×Ø ØÙ× Ð ÙÐØ Ñ             × Ö EMPTYº Ò i ×ÓÒ Ó× × Ö Ú × Ò i − 1 Ù Ø ×
ÕÙ ÓÒØ Ò Ò Ð Ú × Ñ ÒØÖ × ÕÙ Ð i¹ × Ñ Ù Ø ×ÓÒ                ר Ú º Ä ÒØ
  ×ÔÓ× ÓÒ × Ò ÕÙ × ×ÓÒ Ò i − 1 Ð Ú × × ÕÙ Ú Ð ÒØ Ð ÒØ                     ÑÒÖ×
  ×ØÖ Ù Ö Ð × N − i + 1 Ð Ú × Ö ×Ø ÒØ × Ò Ð × M − k Ù Ø × Ö ×Ø ÒØ × × Ö N−i+1   M−i

Ô Ö ÙÒ ×ÔÓ× ÓÒ Ð Ú × Ô ÖØ ÙÐ Öº Ð ØÓØ Ð ÔÓ× Ð × Ð ×ÙÑ Ô Ö ØÓ Ó× ÐÓ× Ú ÐÓÖ ×
ÔÓ× Ð × i
          M                                   M
                   M−i                                      M−i
πi =            i
                  N−i+1
                                     =                i
                                                           M−N−1
                                                                                          ´ÈÓÖ × Ñ ØÖ               n
                                                                                                                    k
                                                                                                                         =
                                                                                                                               n
                                                                                                                              n−k
                                                                                                                                    µ
          i=1                                 i=1
            M−1      M−2                      1        0
      =          +2       + · · · + (M − 1)       +M
           M−N−1    M−N−1                   M−N−1    M−N−1
          M−1                                                            M−1                                       M−1
      =         (M − i)
                          i
                        M−N−1
                                                           = M
                                                                                       i
                                                                                     M−N−1
                                                                                                            −            i
                                                                                                                                i
                                                                                                                              M−N−1
                                                                                                                                               ´ º½ µ
          i=0                                                            i=0                                       i=0

  ÓÖ ¸    ØÓ×     ÔÐ Ö Ð ÔÖÓÔ                                                 Ð ×ÙÑ ØÓÖ Ð Ò                             ×ÙÔ Ö ÓÖ        ÐÓ× Ó ¬¹
  ÒØ × ÒÓÑ Ð × ¸ Ú ÑÓ× ÜÔÖ × Ö Ð                                             ØÓÖ i ÓÑÓ i + 1
                                   M−1                                           M−1
                                                 i                                                            i
                 πi     =      M                                             −           (i + 1 − 1)
                                               M−N−1                                                        M−N−1
                                    i=0                                          i=0
                                              M−1                                        M−1
                                                              i                                                i
                        =      (M − 1)                                               −            (i + 1)                                  ´ º½ µ
                                                            M−N−1                                            M−N−1
                                              i=0                                         i=0

                                                      (A)                                                   (B)

´ µ × Ð ÙÐ Ð                 Ö Ø Ñ ÒØ ÔÓÖ Ð ÔÖÓÔ                                          Ð ×ÙÑ ØÓÖ                     Ð Ò         ×ÙÔ Ö ÓÖ
                                                       M                                   M
                        (A) = (M − 1)                                    = (m − 1)                     ´ÔÓÖ × Ñ ØÖ µ                       ´ º¾¼µ
                                                      M−N                                  N

  Ð Ù ÒØÓ ´ µ¸ ÔÓ ÑÓ× ×ÓÖ Ö½¼ Ð                                               ØÓÖ (i − 1) × ÑÙÐØ ÔÐ ÑÓ× Ý Ú ÑÓ× ÔÓÖ
                      `n ´    `      ´
      Ê Ù Ö × ÕÙ k =         ÔÙ × ÐÓ× k Ð Ñ ÒØÓ× ÓÑ Ò Ó× × ÑÔÖ ×Ó Ö Ò n − kº
                                n
                               n−k
      Ä ÔÖÓÔ    Ò Ù ×Ø ÓÒ × × ¬Ò ÓÑÓ
                                                           n
                                                                         !                !
                                                                   k             n+1
                                                                             =                .
                                                          k=0
                                                                   m             m+1

 ÍÒ Ü Ð ÒØ Ö Ö Ò               ×Ó Ö ÓÔ Ö ÓÒ × ÓÒ Ó ¬ ÒØ × ÒÓÑ Ð × ÐÓ ÓÒר ØÙÝ Ð Ø ÜØÓ                                                     ÓÒ Ö Ø
Å ØÑ Ø × ½ º
 ½¼
                                                                   !                     !
                                                               n         n n−1
                                                                       =                      .
                                                               m         m m−1
416                                                                     Cap´
                                                                           ıtulo 5. Tablas hash



(M − N − 1)
                                       M−1
                             M−N                         i
                   (B)   =                   (i + 1)
                             M−N                       M−N−1
                                       i=0
                                       M−1
                                                i+1                      M+1
                         =   (M − N)                        = (M − N)
                                                M−N                     M−N+1
                                         i=0
                                         M+1
                         =   (M − N)                   ´ÔÓÖ × Ñ ØÖ µ                      ´ º¾½µ
                                          N

ËÙר ØÙÝ Ò Ó ´ µ Ý ´ µ Ò ´ º½ µ
                                   M                       M+1
              πi    =    (M − 1)          − (M − N)
                                   N                        N
                                    M!                   (M + 1)!
                    =    (M − 1)            − (M − N)
                                 (m − N)!N!           (M − N + 1)!N!
                                    M!                     (M + 1)M!
                    =    (M − 1)            − (M − N)
                                 (m − N)!N!           (M − N + 1)(M − N)!N!
                                  M         M−N           M+1      M
                    =    (M + 1)       1−            =                                    ´ º¾¾µ
                                  N       M−N+1         M−N+1 N


      Ð ×Ùר ØÙ Ö ´ º¾¾µ Ý Ð Ú ÐÓÖ πN = m Ò ´ º½ µ Ó Ø Ò ÑÓ× ´ º½ µ
                                        N

      ÓÒ ÓÖÑ M, N −→ ∞¸ Ð ÜÔÖ × ÓÒ ´ º½ µ Ø Ò
                                               − +
                              −1
                             UN    =     Ð Ñ MM N 1 1 = (1 − α)−1
                                       M,N− →∞  +
                                                                                          ´ º¾¿µ
  Ð Ö ×ÙÐØ Ó ÔÖÓÜ Ñ M+1 ≈ α¸ ÐÓ ÕÙ Ò Ð Ö Ð
                         N
                                                ÔÙ × Ö ÔÖ ×Ó¸ ÔÙ × ×Ù Ð Ù× Ö×
ÙÒ Ù Ø Ñ × ÕÙ Ð Ú ÐÓÖ ÔÖ Ú ×ØÓ M ÕÙ ÙÒ               ÒØ Ò Ð Ô Ö Ø Ò Ö Ð ×ÓÒ Ó
 Ò ØÓ Ó× ÐÓ× ×Ó׺
     ÁÒØÙ Ø Ú Ñ ÒØ ¸ Ð ÔÖÓ Ð          ÕÙ Ð Ò× Ö ÓÒ Ó ÙÖÖ Ò Ð ÔÖ Ñ Ö ×ÓÒ Ó ´ Ð
   Ö ØÓ Ö ×ÙÐØ ÒØ Ð ÙÒ ÓÒ × µ × αº Ð Ñ ×ÑÓ ÑÓ Ó¸ Ð ÔÖÓ Ð               Ö ÕÙ Ö Ö×
  Ó× ×ÓÒ Ó׸ × α Ò ¬Ò¸ Ò Ö ÐÑ ÒØ ¸ Ð ÔÖÓ Ð
                  2º                                   Ö ÕÙ Ö Ö× k ×ÓÒ Ó× Ð ×
 × αkº
     Ä ÒØ            ×ÓÒ Ó× ÕÙ × Ö Ð Þ Ò Ò ÙÒ Ù×ÕÙ      Ü ØÓ× ×Ø ÜÔÖ × ÔÓÖ Ð
Ð Ñ × Ù ÒØ
Lema 5.5 (Peterson 1957 [27]) Cantidad de cubetas inspeccionadas en una
b´squeda exitosa sobre una tabla hash con resoluci´n de colisiones por di-
  u                                               o
reccionamiento y sondeo ideal
    Ë h(k) : K −→ [0, M − 1] ÙÒ ÙÒ ÓÒ × O(1) ÕÙ ×ØÖ ÙÝ ÙÒ ÓÖÑ Ñ ÒØ ÐÓ×
 Ð Ñ ÒØÓ× K         [0, M − 1]º Ë T ÙÒ Ø Ð ×    ÐÓÒ ØÙ M ÓÒ Ö ×ÓÐÙ ÓÒ
 ÓÐ × ÓÒ × ÔÓÖ Ö ÓÒ Ñ ÒØÓ ÖØÓ Ý ÕÙ ÓÒØ Ò N Ð Ñ ÒØÓ׺ Ë k ∈ K ÙÒ Ð Ú
Ù ÐÕÙ Ö º ÒØÓÒ ×¸ Ð ÔÖÓÑ Ó                     Ù Ø × ÕÙ × Ú × Ø Ò Ò ÙÒ Ù×ÕÙ           Ü ØÓ× ×
                                         M+1
                                  SN =
                                          N
                                             HM+1 − HM−N+1                                ´ º¾ µ
5.1. Manejo de colisiones                                                                417



Demostraci´n Ë Si Ð ÔÖÓÑ Ó
             o                       Ù Ø × ÕÙ            × ×ÓÒ       Ò Ò ÙÒ Ù×ÕÙ       Ü ØÓ×
×Ó Ö ÙÒ Ø Ð ÓÒ i Ð Ñ ÒØÓ׺
      Ð ÙÒ Ñ ÒØÓ Ð ÑÓ×ØÖ ÓÒ × ÜÔÖ × Ö                    ÙÒ Ù×ÕÙ ×Ó Ö ÙÒ Ø Ð ÕÙ
 ÓÒØ Ò i Ð Ñ ÒØÓ× Ò ÙÒ ÓÒ Ð Ù×ÕÙ            ÐÐ            ÕÙ Ù Ó Ö Ð Þ Ö× Ô Ö Ò× ÖØ Ö
 Ð i¹ × ÑÓ Ð Ñ ÒØÓ Ó × Si = Ui−1º
      Ð ÔÖÓÑ Ó SN ÔÙ    ÜÔÖ × Ö× ¸ Ò Ø ÖÑ ÒÓ×             ´ º½ µ¸     Ð × Ù ÒØ Ñ Ò Ö
                                     N−1
                                 1
                          Si =             Ui
                                 N
                                     i=0
                                     N−1                      N−1
                                 1          M+1    M+1                1
                            =                    =
                                 N         M−i+1    N               M−i+1
                                     i=0                      i=0
                                 M+1
                            =        HM+1 − HM−N+1
                                  N
     Ó Ð Ñ ×Ñ               ÔÖÓÜ Ñ ÓÒ       M, N −→ ∞   Ý Ð     ÔÖÓÜ Ñ ÓÒ      ÐÓ× ÒÙÑ ÖÓ×
 ÖÑÓÒ Ó×½½
                                             +
                  Ð Ñ Si
                M,N− →∞
                                 =     Ð Ñ MN 1 ÐÒ (M + 1) − ÐÒ (M − N + 1)
                                     M,N− →∞

                                 =     ÐÑ
                                     M,N−→∞
                                                1
                                                  ÐÒ M + 1
                                                α M−N+1
                                 =
                                     1
                                       ÐÒ 1
                                     α 1−α
                                                                                       ´ º¾ µ
     ÓÑÓ Ý ÐÓ ÑÓ× Ò   Ó¸ Ð ×ÓÒ Ó Ð × ÐÓ ÕÙ × ÔÖ ×ÙÑ ÖÖÓ Ö Ð Ñ ÓÖ
  × ÑÔ ÒÓº Ò Ð ÔÖ Ø × ÖÖ Ð ÔÓÖÕÙ ¸ Ô ÖØ       ÕÙ × Ñ × Ó         Ð ÒÖÖ
×ÓÒ Ó× Ð ØÓÖ Ó× Ò Ô Ò ÒØ × Ô Ö Ù ÐÕÙ Ö ÓÒ ÙÒØÓ Ð Ú ×¸ × ÔÓ× Ð ¸ ÙÒÕÙ
ÑÙÝ ÑÔÖÓ Ð Ò Ð Ñ       Ò ÕÙ M × Ñ × Ö Ò ¸ ÕÙ Ð ×ÓÒ Ó Ð ÒÓ Ò Ù ÒØÖ
ÙÒ Ù Ø ×ÔÓÒ Ð º Ð ×ÓÒ Ó       Ð Ý Ð × ÓØ × ÜÔÖ × × ÔÓÖ ´ º¾¿µ Ý ´ º¾ µ ÒÓ×
ÔÖÓÔÓÖ ÓÒ Ò ÙÒ Ö Ö Ò     × ÑÔ ÒÓ Ô Ö ÓØÖÓ× Ò ÓÕÙ × ×ÓÒ Ó ÕÙ ×ØÙ Ö ÑÓ×
 ÒÑ Ø Ñ ÒØ º
5.1.4.2      Sondeo lineal

Ð ×ÓÒ Ó Ð Ò Ð × ÑÙÝ × Ñ Ð Ö Ð Ð Ò                   Ò Ñ ÒØÓ ÖÖ Ó × Ó ÙÖÖ ÙÒ ÓÐ × ÓÒ¸
ÒØÓÒ × Ð ÔÖÓÜ Ñ Ð      ×ÓÒ Ö × Ö Ð ×                Ù ÒØ ×ÔÓÒ Ð ¸ ÙÝ Ñ Ö × ×Ø ÒØ
   EMPTY¸ Ö ×ÙÐØ ÒØ Ð Ò×Ô ÓÒ × Ù Ò                   Ð Ô ÖØ Ö Ð Ò        Ó ÔÓÖ Ð ÙÒ ÓÒ
  × º Ä Ø Ð ÑÔÐÓ ÕÙ ÑÓ× ÑÓ×ØÖ Ó Ô                   Ö Ð × Ó× ×ØÖ Ø × ÒØ Ö ÓÖ × × Ô ØÓÖ Þ
×
 ½½
      Hn ≈ ÐÒ n + O(1)º
418                                                         Cap´
                                                                   ıtulo 5. Tablas hash



                                         0    k1    E
                                         1    k10   B
                                         2    k8    E
                                         3    k11   B
                                         4          E
                                         5    k2    B
                                         6    k5    B
                                         7    k9    B
                                         8    k3    B
                                         9          E
                                         10   k4    B
                                         11   k7    B
                                                    E



                                                    E
                                       M−2          E
                                       M − 1 k6     B


    ÆÓØ ÑÓ× ÕÙ Ð ×ØÖ Ù ÓÒ Ð × Ð Ú × × ÒØ            Ð Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó¸
    ÔÙ × ×ÓÒ Ö ×ÙÐØ ÒØ × Ð Ñ ×ÑÓ Ø ÔÓ ×ÓÒ Óº
        ALEPH Ø Ò ÙÒ Ì ¸ ÒÓÑ Ò Ó OLHashTable<Key,Record>¸ ÕÙ ÑÔÐ ÒØ ÙÒ
    Ø Ð × ÓÒ Ö ×ÓÐÙ ÓÒ          ÓÐ × ÓÒ × ÔÓÖ Ö ÓÒ Ñ ÒØÓ ÖØÓ Ý ×ÓÒ Ó Ð Ò Ðº Ð
    Ì Ò Ù ×Ø ÓÒ × ÜÔÓÖØ Ò Ð Ö ÚÓ ØÔÐ ÓÐ × ºÀ ½
½    ØÔÐ ÓÐ × ºÀ ½ ≡
       template <typename Key, typename Record, class Cmp = Aleph::equal_to<Key> >
     class OLhashTable
     {
        Å Ñ ÖÓ× ÔÙ Ð Ó× OLHashTable<Key,Record> ½
     };
       OLHashTable<Key,Record>     Ö ÔÖ × ÒØ ÙÒ Ø Ð × ¸ ÓÒ Ö ×ÓÐÙ ÓÒ  ÓÐ × ÓÒ ×
       ÖØ Ý ×ÓÒ Ó Ð Ò Ð        Ù Ø ×¸ Ò Þ ÔÓÖ Ð Ú × Ø ÔÓ Key Ý ÕÙ Ù Ö Ö ×ØÖÓ×
      Ø ÔÓ Recordº
    B´squeda
     u
     Ä Ù×ÕÙ        ÙÒ Ð Ú × Ö Ñ Ø
½   Å Ñ ÖÓ× ÔÙ Ð Ó× OLHashTable<Key,Record>             ½   ≡    ´½ µ ½
     Record * search(const Key & key)
     {     // Comenzar desde ındice hash y sondear linealmente hasta
                             ´
           // encontrar una cubeta EMPTY
       for (int i = (*hash_fct)(key) % M, c = 0; c < M and table[i].status != EMPTY;
            ++c, ++i)
         if (table[i].status == BUSY) // ¿Hay una clave en la cubeta?
           if (Cmp() (table[i].key, key)) // Comparar la clave
             return &table[i].record;
       return NULL; // No se encuentra la clave
     }
         Ð Ð ÞÓ × Ø Ò Ù Ò      Ó × ×ÓÒ ÙÒ Ð ÙÝÓ ×Ø ØÙ× × EMPTYº ÍÒ Ð ÓÒ
    ר ØÙ× Ù Ð BUSY × Ö Ú ×    Ô Ö Ú Ö ¬ Ö × ÓÒØ Ò Ð Ð Ú   Ù×ÕÙ º ÍÒ Ð ÓÒ
    ר ØÙ× DELETED ÒÓ ÓÒØ Ò      Ð Ú ¸ Ô ÖÓ ÓÑÓ ×Ø Ò Ð Ñ ÒÓ ÙÒ ÓÐ × ÓÒ¸ Ý ÕÙ
     ÓÒØ ÒÙ Ö Ð ×ÓÒ Ó ×Ó Ö Ð    × Ù ÒØ Ù Ø º
5.1. Manejo de colisiones                                                   419



    Inserci´n
           o
       Ä Ò× Ö ÓÒ × Ö Ñ Ø Ò ÓÒØÖ Ö Ð ÔÖ Ñ Ö Ù Ø ¸ × Ö ×ÙÐØ ÒØ Ö Ø Ð ÙÒ ÓÒ
     × Ó Ð ×ÓÒ Ó Ð Ò Ð¸ ÓÒ ×Ø ØÙ× ×Ø ÒØÓ BUSYº ×ØÓ × ÔÐ ÒØ Ñ ÒØ Ð × Ù ÒØ
    Ñ ØÓ Ó
½   Å Ñ ÖÓ× ÔÙ Ð Ó× OLHashTable<Key,Record> ½ +≡ ´ ½ µ ½ ½
     Record * insert(const Key & key, const Record & record)
     {
       if (N >= M)
         throw std::overflow_error("Hash table is full");
       int i = (*hash_fct)(key) % M;
       while (table[i].status != BUSY) // Sondear linealmente cubetas disponibles
         i = (i + 1) % M;
           // i contiene celda con DELETED o EMPTY ==> ocuparla
       table[i].key    = key;
       table[i].record = record;
       table[i].status = BUSY;
       N++;
       return &table[i].record;
     }


    Eliminaci´n
             o
         Ä Ð Ñ Ò ÓÒ × Ð ÓÔ Ö ÓÒ ÔÓÐ Ñ      ר ×ØÖ Ø ¸ Ô ÖÓ × ÙÒ Ñ ÒØ ÐÑ ÒØ
    × ÑÔÐ ´½µ Ò ÓÒØÖ Ö Ð Ù Ø ÕÙ ÓÒØ Ò Ð Ð Ú Ð Ñ Ò Ö Ý ´¾µ Ñ Ö ÖÐ ÓÒ DELETEDº
         Ä × Ù Ø × Ñ Ö × ÓÑÓ DELETED Ö ÔÖ × ÒØ Ò ÙÒ Óר     ÓÒ Ð Ð Ù×ÕÙ ¸
    ÔÙ × ×Ø ×     Ò Ò×Ô ÓÒ Ö× ÙÒÕÙ ÒÓ ÓÒØ Ò Ò Ð Ú ×º ×ØÓ ÔÐ ÒØ ÙÒ ÔÖÓ Ð Ñ
         ÒØÖÓÔ Ñ        ÕÙ ÙÑ ÒØ Ð ÒØ         Ð Ñ Ò ÓÒ ×¸ ÔÙ Ò Ó Ó ÙÖÖ Ö Ð ¹
    × ÓÖØÙÒ × ØÙ ÓÒ Ø Ò Ö ÕÙ Ö Ú × Ö ØÓ × Ð × Ù Ø × Ð Ø Ð Ò ÙÒ Ù×ÕÙ
      ÐÐ     ÙÒÕÙ Ð Ø Ð ÓÒØ Ò ÑÙÝ ÔÓ Ó× Ð Ñ ÒØÓ׺ ÓÒ× Ù ÒØ Ñ ÒØ ¸ ÓÒ Ö ¹
      ÓÒ Ñ ÒØÓ ÖØÓ Ð × Ð Ñ Ò ÓÒ ×     Ò × Ö Ü Ô ÓÒ Ð ×º
    Mejoras a la eliminaci´n
                          o
        Ä ÒØÖÓÔ Ù× ÔÓÖ Ð ÙÑÙÐ ÓÒ Ù Ø × ÓÒ ×Ø ØÙ× DELETED ÔÙ ÓÒØÖ Ö¹
    Ö ×Ø Ö× Ñ ÒØ ÙÒ Ø Ò ÕÙ ÖÖ Ð Ö                     ÔÓÖ Ð Ù Ø Ð Ñ Ò     ÒØÖÓ
       Ð      Ò     ÓÐ × ÓÒ ×º   ר ÑÓ Ó¸ Ð ÙÐØ Ñ Ù Ø      Ð    Ò ÔÙ Ñ Ö Ö×
     ÓÒ Ð Ú ÐÓÖ EMPTYº ÈÙ ×ØÓ ÕÙ Ð Ð Ñ Ò ÓÒ Ö ÕÙ Ö ÙÒ Ù×ÕÙ ¸ Ð ÒØ Ö Þ Ô Ö
     Ð Ñ Ò Ö × ÔÐ ÒØ Ò ÙÒ ÓÒ ÙÒ ÔÙÒØ ÖÓ Ð Ö ×ØÖÓ ÕÙ × × Ð Ñ Ò Öº           ר
    ÑÓ Ó¸ Ð Ù×Ù Ö Ó ÔÙ ¸ Ú ÒØÙ ÐÑ ÒØ ¸ ÓÖÖ Ö Ð Ö Ô Ø ÓÒ Ð ØÖ Ó        Ù×ÕÙ º
         Ó ×ØÓ¸ ÒÓ      Ö ×ÙÐØ Ö   Ð ÓÑÔÖ Ò Ö Ð ÖÙØ Ò    Ð Ñ Ò ÓÒ
½    Å Ñ ÖÓ× ÔÙ Ð Ó× OLHashTable<Key,Record> ½ +≡          ´½ µ ½
     void remove(Record * record)
     {
       Bucket * bucket = record_to_bucket(record);
       int i           = bucket - &table[0]; // ındice cubeta a eliminar (brecha)
                                                ´
       for (int j = (i + 1) % M; true; ++j) // cerrar la brecha i
         switch (table[j].status)
           {
           case BUSY:
             if (Cmp () ((*hash_fct)(table[j].key), bucket->key)) // ¿hay colisi´n?
                                                                                 o
420                                                            Cap´
                                                                  ıtulo 5. Tablas hash



             {     // contiene colisi´n ==> mover su contenido hacia table[i]
                                     o
                 table[i].key    = table[j].key;
                 table[i].record = table[i].record;
                 table[i].status = BUSY;
                 table[j].status = DELETED; // deviene DELETED, eventualmente
                                            // candidata a EMPTY
                 i = j; // table[j] deviene cubeta brecha
              }
            break;
          case DELETED: // en este caso, la cubeta i no puede marcarse con
                        // EMPTY porque si no rompe la cadena de sondeo lineal
            i = j; // table[j] deviene cubeta brecha
            break;
          case EMPTY: // en este caso j ser´a la cubeta que detendr´a la b´squeda,
                                           ı                       ı      u
                      // pero, puesto que i est´ m´s atr´s y no interrumpe la
                                               a a      a
                      // b´squeda, la marcamos con EMPTY y terminamos
                          u
            table[i].status = EMPTY;
            N--;
            return; // terminar
          }
 }
  ר ÖÙØ Ò ÖÖ Ð Ö      ÓÒ ×Ø ØÙ× DELETED Ý Ñ Ö Ð ÙÐØ Ñ Ù Ø Ð         Ò
 ÓÐ × ÓÒ × ÓÑÓ EMPTYº
      ÙÒÕÙ ×Ø Ñ ÓÖ Ñ ÓÖ Ð ÔÖÓ ×Ó Ù×ÕÙ ¸ ר Ö Ð ÒØ Þ Ð Ð Ñ Ò ÓÒº
Ë Ð × Ð Ñ Ò ÓÒ × ×ÓÒ Ü Ô ÓÒ Ð ×¸ ÒØÓÒ × × ÔÖ Ö Ð ÙØ Ð Þ Ö Ð ÑÙÝ × ÑÔÐ Ð Ó¹
Ö ØÑÓ Ñ Ö Ö Ð Ù Ø ÓÒ DELETED Ý Ö Ñ ÒØ Ö Nº
     Ä Ñ ÓÖ ÔÐ ÒØ Ð Ñ ×ÑÓ ÔÖÓ Ð Ñ ÑÓÚ Ñ ÒØÓ Ù Ø × ÕÙ Ø Ò Ð Ò ¹
Ò Ñ ÒØÓ ÖÖ Óº ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ø ÑÔÓ Ó × ÔÙ Ò Ñ ÒØ Ò Ö ÔÙÒØ ÖÓ× Ð Ñ ÒØÓ×
    Ð Ø Ðº
5.1.4.3    An´lisis informal del sondeo lineal
             a

 Ð Ò Ð × × ÕÙ ÔÖ × ÒØ Ö ÑÓ× Ò ×Ø ×Ù ¹× ÓÒ ×Ø × Ó Ò ÐÓ× Ö ×ÙÐØ Ó× ÔÖ × ÒØ Ó×
ÔÓÖ Ë Û Ý Ð ÓÐ Ø ¾ Ý × ÙÒ Ñ ÒØ Ò Ò Ð × Ù ÒØ ÔÖÓÔÓ× ÓÒ¸ Ù Ð Ù Ð
ÔÖ Ñ Ö Ð ÓÖ ØÑÓ ÕÙ ÃÒÙØ Ò Ð ÞÓ Ü ØÓ× Ñ ÒØ
Proposici´n 5.2 (Knuth 1962 [19]) Cantidad de cubetas accedidas en direc-
           o
cionamiento abierto y sondeo lineal
    Ë h(k) : K −→ [0, M − 1] ÙÒ ÙÒ ÓÒ × O(1) ÕÙ ×ØÖ ÙÝ ÙÒ ÓÖÑ Ñ ÒØ ÐÓ×
 Ð Ñ ÒØÓ× K         [0, M − 1]º Ë T ÙÒ Ø Ð  ×   ÐÓÒ ØÙ M ÓÒ Ö ×ÓÐÙ ÓÒ
 ÓÐ × ÓÒ × ÔÓÖ Ö ÓÒ Ñ ÒØÓ ÖØÓ Ý ×ÓÒ Ó Ð Ò Ðº Ë k ∈ K ÙÒ Ð Ú Ù ÐÕÙ Ö º
 ÒØÓÒ ×¸ Ð ÔÖÓÑ Ó          Ù Ø × ÕÙ × Ú × Ø Ò Ò ÙÒ Ù×ÕÙ             ÐÐ       ×
                          N−1
                                     (N − 1)!
                 1 1
             UN = +
                 2 2            Mi(N    − i − 1)!
                                                  =
                                                    1
                                                    2
                                                      1+
                                                          1
                                                         1−α
                                                                 +O
                                                                         1
                                                                         N
                                                                                 ;   ´ º¾ µ
                          i=0

Ý Ð ÔÖÓÑ Ó Ô Ö ÙÒ Ù×ÕÙ                 Ü ØÓ× ×
                          N−1
                 1 1
             SN = +
                 2 2
                                i
                                      N!
                                    Mi(N
                                       − i)!
                                             =
                                               1
                                               2
                                                 1+
                                                        1
                                                    (1 − α)2
                                                                +O
                                                                         1
                                                                         N
                                                                                 .   ´ º¾ µ
                          i=0
5.1. Manejo de colisiones                                                                421



Demostraci´n
          o    ÈÓÖ ×Ù ÓÑÔÐ    ¸ Ð ÑÓ×ØÖ ÓÒ ×                             Ò    Ö Óº ÓÒ×ÙÐØ ×
Ë    Û    Ý Ð ÓÐ Ø ¾ Ý ÃÒÙØ ½ ¸ ¾¼ Ô Ö ÐÓ× Ø ÐÐ ×
Corolario 5.1 Desempe˜ o esperado de una tabla hash con resoluci´n de coli-
                        n                                       o
siones por direccionamiento abierto y sondeo lineal
   Ë h(k) : K −→ [0, M − 1] ÙÒ ÙÒ ÓÒ × O(1) ÕÙ ×ØÖ ÙÝ ÙÒ ÓÖÑ Ñ ÒØ ÐÓ×
 Ð Ñ ÒØÓ× K        [0, M − 1]º Ë T ÙÒ Ø Ð  ÐÓÒ ØÙ M ÓÒ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ ×
ÔÓÖ Ö ÓÒ Ñ ÒØÓ             ÖØÓ Ý ×ÓÒ Ó Ð Ò Ðº ÒØÓÒ ×¸ Ð × ÑÔ ÒÓ ×Ô Ö Ó Ð ×
ÓÔ Ö ÓÒ × Ò× Ö ÓÒ¸ Ù×ÕÙ Ý Ð Ñ Ò ÓÒ × O(α) = O(1)º
Demostraci´n M ר
              o              ÓØ Ó ÙÒ Ú ÐÓÖ ÓÒר ÒØ º ÈÙ ×ØÓ ÕÙ Ð Ø Ð × ÖÖ ¸
N <= M¸ ÐÓ ÕÙ ÑÔÐ          ÕÙ α × ÓÒר ÒØ º Ò Ú ÖØÙ         ר     Ó¸ Ð × ÜÔÖ × ÓÒ ×
´ º¾ µ Ý ´ º¾ µ ×ÓÒ ÓÒר ÒØ ׺
     Ä Ò× Ö ÓÒ ×Ø Ø ÖÑ Ò ÔÓÖ Ð Ù×ÕÙ               ÐРݸ ÔÙ ×ØÓ ÕÙ ´ º¾ µ × ÓÒר ÒØ ¸
  Ð × ÑÔ ÒÓ ×Ô Ö Ó Ø Ñ Ò × ÓÒר ÒØ º Ö Ó¸ Ð Ò× Ö ÓÒ × O(1)º
     Ä Ù×ÕÙ         ÐÐ Ò         Ò Ð Ñ ×Ñ × ØÙ ÓÒ ÕÙ Ð Ò× Ö ÓÒº Ä Ù×ÕÙ Ü ØÓ×
    ÔÒ       ´ º¾ µ¸ Ð Ù Ð Ø Ñ Ò × ÓÒר ÒØ º
     Ä Ð Ñ Ò ÓÒ ÓÒ Ð Ì OLHashTable<Key,Record> × Ø ÖÑ Ò ×Ø Ñ ÒØ ÓÒ×¹
Ø ÒØ º Ù ÐÕÙ Ö ÓØÖÓ Ì           × Ó Ò Ð ×ÓÒ Ó Ð Ò Ð ÕÙ Ö ÕÙ Ö ÙÒ Ù×ÕÙ          Ò
  Ò ÐÓ× ×Ó× ÒØ Ö ÓÖ ×
       ÓÖ ÕÙ ÑÓ× ÑÓ×ØÖ Ó Ð ÔÖÓÔÓ× ÓÒ ÕÙ ÒÓ× Ö Ø Ö Þ Ð × ÑÔ ÒÓ Ð ×ÓÒ Ó
Ð Ò Ð¸ Ñ Ø ÑÓ× Ö              ÐÓ ÕÙ ÐÐ ÒÓ× Ö Ú Ð º Ä ¬ ÙÖ × º½ Ý º¾ ÐÙ×ØÖ Ò ÐÓ× ¹
× ÑÔ ÒÓ× Ô Ö Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó¸ ×ÓÒ Ó Ð Ò Ð Ý ×ÓÒ Ó Ð Ô Ö Ð Ù×ÕÙ
   ÐÐ Ý Ü ØÓ× ¸ Ö ×Ô Ø Ú Ñ ÒØ º
                                                          +
                               ËÓÒ Ó    Ð        3                 3
                                                          +
                     Ò    Ò Ñ ÒØÓ × Ô Ö Ó                         3
            º                                            +        3
                              ËÓÒ Ó Ð Ò Ð +             +        3
                                                        +       3
                                                       +        3
                                                      +        3
                                                      +       3
           ¿º                                        +       3
                                                              3
                                                    +       3
                                                    +      33
              ¿                                    +      3
                                                  +
                                                  +       3
                                                 +      33
                                                +      33
           ¾º                                  ++     3
                                                      3
                                              +
                                              +     33
                                            ++    33
                                                   3
                                           + 333
                                            +
                                          + 333
              ¾                          ++ 33
                                        ++333
                                       ++ 3
                                      ++ 33
                                     ++ 33
           ½º                       ++ 3
                                   ++ 3
                                  +3333
                                 +3333
                                ++
                              +333
                                +
                               +33
                           +++3
                           +++3
                          +333
                         +333
                     33333
                    33333
                     ++++
                    ++++
              ½ 3333
                ++++
                 333
                 +++
              ¼     ¼º½      ¼º¾   ¼º¿      ¼º       ¼º        ¼º   ¼º   ¼º    ¼º
                                                     α


          ÙÖ º½       ÒØ           Ù Ø × Ò×Ô              ÓÒ    × Ò ÙÒ Ù×ÕÙ         ÐÐ
     Ð ×ÓÒ Ó Ð Ò Ð × Ö Ô Ö Ð Ù×ÕÙ Ü ØÓ× Ù Ò Ó Ð Ø Ð × Ò Ù ÒØÖ Ò ÙÒ
 ¼± ÔÐ Ò ØÙ Ô ÖØ Ö ÐÐ ¸ Ð Ô Ò ÒØ Ú Ò ÑÔÓÖØ ÒØ Ý Ð ÒØ         Ù Ø×
ÕÙ × Ò×Ô ÓÒ Ò ÙÑ ÒØ ÒÓØ Ð Ñ ÒØ º ÒØ × Ð ¼± Ð ÒØ       Ò×Ô ÓÒ × ×
 Ò ÔÖÓÑ Ó Ñ ÒÓÖ ÕÙ ØÖ ׸ ÐÓ Ù Ð × ÔØ Ð × ÑÓ   Ù ÒØ Ð     º
422                                                                            Cap´
                                                                                  ıtulo 5. Tablas hash



     Ò Ù ÒØÓ Ð Ù×ÕÙ         ÐÐ ¸ Ð ×ÙÒØÓ ÑÔ ÓÖ ÒØ × Ô Ö Ð ×ÓÒ Ó Ð Ò Ðº
Ô ÖØ Ö Ð ¼± × Ò×Ô ÓÒ Ò Ò ÔÖÓÑ Ó Ù ØÖÓ Ù Ø × Ò ÙÒ Ù×ÕÙ               ÐÐ ¸ ÐÓ
ÕÙ × ÕÙ Ú Ð ÒØ      Ö ÕÙ × ×ÓÒ Ò Ù ØÖÓ Ù Ø × Ò ÙÒ Ò× Ö ÓÒº Ì Ò ÑÓ׸ Ô٠׸
ÙÒ Ñ Ö Ò ÒØÖ Ð ¼± Ý Ð ¼± Ò Ð Ù Ð Ð ×ÓÒ Ó Ð Ò Ð × Ò ÔÖÓÑ Ó ÔØ Ð º
   Ù Ð × Ð ÔÓÖ ÒØ    ÔÐ Ò ØÙ Ò ÕÙ ÔÓ ÑÓ× ØÖ    Ö ÓÒ Ð ×ÓÒ Ó Ð Ò Ð Ñ Ò Ö
× ÙÖ
    Ä ÔÖ ÙÒØ ÒØ Ö ÓÖ Ö ÕÙ Ö Ù ×Ø ÓÒ Ö Ù Ð¸ ÒØÖ Ð × Ó× ÙÖÚ ×¸ × Ð Ñ × Ö ÔÖ ¹
× ÒØ Ø Ú Ó ÕÙ Þ Ñ ÓÖ¸ Ó¸ Ù Ð ÒØÖ Ð × Ó× Ù×ÕÙ × × Ð Ñ × ÑÔÓÖØ ÒØ ÈÓÖ
ÐÓ Ò Ö Ð Ð Ù×ÕÙ Ó ÓÒ×ÙÐØ ÐÓ ÕÙ Ý ×Ø Ò ÙÒ ÓÒ ÙÒØÓ × Ñ × Ö Ù ÒØ ÕÙ Ð
  Ù×ÕÙ      ÐÐ º Ò ×Ø × ÒØ Ó¸ Ð Ö ¬ º¾ × Ð Ñ × ÑÔÓÖØ ÒØ º Ó ×Ø Ö Ø Ö Ó
Ý Ð ÓÒÓ Ñ ÒØÓ ÑÔ Ö Ó¸ ÔÓ ÑÓ× Ö ÕÙ Ð ×ÓÒ Ó Ð Ò Ð × ÓÖ Ð ×Ø ÙÒ
Ñ Ü ÑÓ ÒØÖ Ð ¼ Ý ¼± ÔÐ Ò ØÙ º ÉÙ Ø ÒØÓ Ù ×Ø Ð ¿¼¹¾¼±            ×Ó ÙÔ ÓÒ
ÍÒ Ô Ö×Ô Ø Ú ÒØ Ö × ÒØ Ô Ö ÓÖ Ö ×Ø ÔÖ ÙÒØ ÒÓ× Ð ÔÖÓÔÓÖ ÓÒ ÓÑÔ Ö Ö Ð
 ×Ô Ó Ó ÙÔ Ó ÔÓÖ Ð Ò Ò Ñ ÒØÓ × Ô Ö Óº

                                    ËÓÒ Ó    Ð        3                                      +
             º       Ò         Ò Ñ ÒØÓ × Ô Ö Ó                         +
                                   ËÓÒ Ó Ð Ò Ð        +
                                                                      +
                                                                     +
                                                                     +       3
            ¿º                                                      +
                                                                             3
                                                                   +
                                                                   +        3
               ¿                                                 +
                                                                  +        3
                                                                           3
                                                                ++        3
                                                               +         3
                                                                         3
            ¾º                                               +
                                                              +
                                                              +        3
                                                                       3
                                                                        3
                                                            +
                                                            +         3
                                                          ++       333
                                                                     3
               ¾                                         ++
                                                        ++      33
                                                                33
                                                                   3
                                                       ++ 3333
                                                      ++ 3333
                                                    ++
                                                     +    3
            ½º                                    +++ 3333
                                                 +++ 3333
                                               +++
                                             +3333333
                                              +++
                                            +3333333
                                         +++
                                          ++
                                       ++3333
                                       ++333
                                  +++++ 3
                                 ++++++
                                +3333333
                               +3333333
               ½ +333
                 333+
                  +++
                  +++  ++++++++3
                      333333333
                     333333333
                      ++++++++
                 ¼       ¼º½      ¼º¾    ¼º¿     ¼º       ¼º         ¼º       ¼º       ¼º    ¼º
                                                          α


            ÙÖ º¾          ÒØ            Ù Ø × Ò×Ô             ÓÒ        × Ò ÙÒ Ù×ÕÙ              Ü ØÓ×
     ÉÙ × ÐÓ ÕÙ    Ö    Ð ×ÓÒ Ó Ð Ò Ð¸ Ø Ò ÒÓØ Ð Ò Ð × Ö ¬ ׸ Ö ×Ô ØÓ Ð ×ÓÒ Ó
    Ð Ä Ö ×ÔÙ ×Ø × ÓÒÓ          Ó Ð ÖÓØÙÐÓ       ÖÙÔ Ñ ÒØÓ ÔÖ Ñ Ö Ó º × Ú ÒØ
ÕÙ Ù ÐÕÙ Ö Ð Ú ÓÐ × ÓÒ h(k1) = i ÔÓØ Ò ÙÒ ÓÐ × ÓÒ h(k2) = i + 1º ÓÒ ÓÖÑ
 ÙÑ ÒØ Ð ÒØ          Ð Ñ ÒØÓ׸ × ÓÖÑ Ò        Ò × Ð Ò Ð × ÓÐ × ÓÒ × Ò ØÓÖÒÓ Ð
ÔÓ× ÓÒ iº Ë Ò Ñ Ö Ó¸ Ò Ð ÔÖ Ø ¸ ר ×          Ò × ×ÓÒ ØÓÐ Ö Ð × ×Ø Ð ÔÓÖ ÒØ
   ÔÐ Ò ØÙ ÜÔÖ × Ó ´ ¼±µ¸ ÔÙ × ×Ù ÓÒØ Ù         Ò Ð ÖÖ ÐÓ ÔÖÓÚ        Ð        Ð
 ÓÑÔÙØ ÓÖ  ½¾ º

     ÓÒ ÒÙ ×ØÖ ÑÔÐ ÒØ ÓÒ Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó Ø Ò ÑÓ× ÙÒ Ó ÙÔ ÓÒ Ò
Ñ ÑÓÖ
                            SL = 2MSpST + 2NSpST .                        ´ º¾ µ
  ÓÒ Sp × Ð ×Ô Ó Ó ÙÔ Ó ÔÓÖ ÙÒ ÔÙÒØ ÖÓ Ý ST × Ð ×Ô Ó Ó ÙÔ Ó ÔÓÖ Ð Ð Ú º
 ½¾
      רÓ× ÔÓÖ ÒØ × ÔÙ         Ò ÓÖÖÓ ÓÖ Ö× ´Ó Ö ÙØ Ö× µ Ñ          ÒØ    cachegrind   ¾ º
5.1. Manejo de colisiones                                                      423



    Ò Ð Ñ ×ÑÓ × ÒØ Ó¸ ÓÒ Ð Ö      ÓÒ Ñ ÒØÓ      ÖØÓ Ø Ò ÑÓ× ÙÒ Ó ÙÔ ÓÒ      Ñ ÑÓ¹
Ö
                                 SO = M(ST + 1)                              ´ º¾ µ
   Ð Ö Ñ ÒØ ¸ SO < SL¸ ÐÓ ÕÙ ÒÓ × Ò ¬ ÕÙ ÒÓ ÔÙ Ö Ù Ö× Ð ÓÒ×ÙÑÓ Ñ ÑÓÖ
    Ð Ò Ò Ñ ÒØÓ × Ô Ö Óº ÈÓÖ ÑÔÐÓ¸ ÔÓ ÑÓ× Ù× Ö Ð ×Ø × × ÑÔÐ × Ý ÙÒ Ø Ð
ÔÙÖÓ× ÔÙÒØ ÖÓ׺
     Ä × Ö ¬ × º½ Ý º¾ ÑÙ ×ØÖ Ò ÓÒØÙÒ ÒØ Ñ ÒØ Ð ×ÙÔ Ö ÓÖ            Ø ÓÖ    Ð Ò ¹
    Ò Ñ ÒØÓ × Ô Ö Ó Ò Ù ÒØÓ Ð ÒØ                 ×ÓÒ Ó× ÕÙ × Ö Ð Þ Ò Ô Ö Ù ÐÕÙ Ö
 Ù×ÕÙ º È ÖÓ¸ ÓÑÓ Ý ÐÓ Ò ÑÓ× Ò Ü º½º¿º ´Ô Ò ½¾µ¸ Ð ×ÓÒ Ó Ð Ò Ð ÔÖÓÚ
 Ð            Ð ÓÑÔÙØ ÓÖ¸ ÙÒ ÔÐ ÒÓ        Ù ÓÒ ÕÙ × Ú Ö Ó× ÓÖ Ò × Ñ Ò ØÙ Ñ ×
Ú ÐÓÞ ÕÙ Ð ×Ó Ö Ñ ÒØ Ó Ð Ñ ÑÓÖ ¸ × Ò ÔÖÓÚ Ö Ð                     ¸ ÕÙ Ö ÕÙ Ö Ö Ð
 Ò Ò Ñ ÒØÓ × Ô Ö Óº Ò Ò ÙÖ ¸ Ð Ò× Ö ÓÒ Ð Ñ Ò ÓÒ Ö ÕÙ Ö Ò Ô Ð Ö Ð
Ñ Ò ÓÖ Ñ ÑÓÖ Ò Ñ ¸ Ñ ÒØÖ × Ð Ö ÓÒ Ñ ÒØÓ ÖØÓ ÒÓº
       Ù Ò Ó × Ø Ò Ð ÒØ          ×Ô Ö       Ð Ú × Ñ Ò Ö¸ Ð Ö ÓÒ Ñ ÒØÓ ÖØÓ
 ÓÒ ×ÓÒ Ó Ð Ò Ð ×¸ ÔÖÓ Ð Ô ÖÓ ×ÓÖÔÖ Ò ÒØ Ñ ÒØ ¸ ÙÒ ÓÒ ÐÓ× Ö ÙÑ ÒØÓ× Ò Ñ ÒÓ¸
 Ð Ñ ÓÖ Ò ÓÕÙ Ô Ö Ñ Ò Ö ÙÒ Ø Ð × º Ä × Ö ÞÓÒ × × ÔÙ Ò Ö ×ÙÑ Ö Ò
     ¯ × ÑÙÝ × ÑÔÐ        ÑÔÐ ÒØ Ö¸ ÐÓ ÕÙ ÑÔÐ ÙÒ Ó Óר ÓÒר ÒØ º
     ¯ ÆÓ ÙØ Ð Þ Ð Ñ Ò      ÓÖ Ñ ÑÓÖ Ò Ñ º
     ¯ ÔÖÓÚ        Ð         Ð ÓÑÔÙØ ÓÖº
        Ù Ò Ó × ÑÔÖ Ø Ó Ð ×ÓÒ Ó Ð Ò Ð ÓÑÓ ×Ú ÒØ × ÔÓ ÑÓ× ÒÙÒ Ö
     ¯ Ð Ö       ÓÒ Ñ ÒØÓ ÖØÓ ×Ø ×ÙÔ Ø Ó ÙÒ ×Ø Ñ ÓÒ ÓÖÖ Ø Ð ÒÙÑ ÖÓ
            Ð Ñ ÒØÓ× Ñ Ò Öº Ë ×ØÓ ÐÐ ¸ ÒØÓÒ × Ð ÖÙÔ Ñ ÒØÓ Ö               ÓÒ× Ö ¹
         Ð Ñ ÒØ Ð × ÑÔ ÒÓº
          Ò Ó × ÓÒ × ÒÓ × ÔÓ× Ð ×ÔÓÒ Ö ÙÒ Ù Ò ×Ø Ñ ÓÒº Ò ×ØÓ× ×Ó׸ ×
         ÓÑÓ × × × ÙÒ Ø Ð × Ò Ö Ð¸ × ÔÖ Ö Ð Ð Ò Ò Ñ ÒØÓ × Ô Ö Óº
     ¯ Ä Ð Ñ Ò ÓÒ Ò Ð ×ÓÒ Ó Ð Ò Ð ÓÒÐÐ Ú Ú ÒØÙ Ð × Ò ÓÒÚ Ò ÒØ ׺ Ð Ð ÓÖ ØÑÓ
         Ð Ñ Ò ÓÒ ÕÙ × ÖÖÓÐÐ ÑÓ× Ø Ò Ð ×Ú ÒØ          ÑÓÚ Ö ´ÔÓÖ ÓÔ µ ÐÓ× ÓÒØ Ò Ó×
           Ð × Ù Ø ×º ÆÓ ÔÓ ÑÓ׸ Ô٠׸ Ñ ÒØ Ò Ö ÔÙÒØ ÖÓ× ÐÓ× Ð Ñ ÒØÓ× ÙÒ Ø Ð
         ÓÒ ×ÓÒ Ó Ð Ò Ðº
       Ë Ô Ð ÑÓ× Ð Ð Ñ Ò ÓÒ Ñ × × ÑÔÐ ¸ ×              Ö¸ ×ÓÐÓ Ñ Ö Ö Ð Ù Ø ÓÒ
       DELETED¸ ÒØÓÒ × ÒÓ ÔÓ ÑÓ× Ô ÖÑ Ø Ö ÑÙ × Ð Ñ Ò ÓÒ ×¸ ÔÙ × ×Ø ×          Ö Ò
       Ð Ù×ÕÙ º
        × ÔÓ× Ð ×ÙÔ Ö Ö Ð ×ÓÒ Ó Ð Ò Ð Ä Ù ×Ø ÓÒ ÕÙ Ú Ð Ò ÓÒØÖ Ö ÙÒ ÓÖÑ
 Ú Ø Ö Ð ÖÙÔ Ñ ÒØÓ ÔÖ Ñ Ö Óº ÓÖ × ×Ø ÔÖ ÙÒØ Ò Ð × ×Ù ¹× ÓÒ × ×Ù × ¹
 Ù ÒØ ׺
5.1.4.4   Sondeo cuadr´tico
                      a

  Ð ×ÓÒ Ó Ù Ö Ø Ó × ÙÒ Ñ ÒØ ÐÑ ÒØ × ÑÔÐ º Ë Ó ÙÖÖ ÙÒ ÓÐ × ÓÒ Ò Ð ÔÓ× ÓÒ i¸
 ÒØÓÒ × Ð ÔÖÓÜ Ñ Ù Ø ×ÓÒ Ö ×Ø           ÔÓÖ i2 ÑÓ Mº Ä          ר ×ØÖ Ø
 × Ú Ø Ö Ð ÖÙÔ Ñ ÒØÓ ÔÖ Ñ Ö Ó Ý Ð ÓÖÑ ÓÒ        Ò × Ð Ò Ð × ÓÐ × ÓÒ × ÕÙ ×ÓÒ
Ð × ÕÙ    Ö Ò Ð × ÑÔ ÒÓ Ò Ð ×ÓÒ Ó Ð Ò Ðº
424                                                       Cap´
                                                                 ıtulo 5. Tablas hash



         È ÖÓ ×Ø ×ØÖ Ø     ÓÒÐÐ Ú Ð ÔÖÓ Ð Ñ       ÕÙ ×        Ð Ö ÒØ Þ Ö ÕÙ ØÓ × Ð ×
     Ù Ø × × Ò ×ÓÒ      ׸ ÔÙ × i2 ÑÓ M ÒÓ Ò × Ö Ñ ÒØ Ù Ö ØÓ Ó Ð Ö Ò Ó [0, M)º
      Ù Ò Ó Ð Ø Ð Ð ÒÞ Ð ¼± ÔÐ Ò ØÙ ÒÓ Ý Ö ÒØ                   ×ÓÐÙØ    ÕÙ Ð ×ÓÒ Ó
     Ù Ö Ø Ó Ò Ù ÒØÖ ÙÒ Ù Ø ×ÔÓÒ Ð º
         Ï ×× ¿¼ ÑÙ ×ØÖ ÕÙ × ÔÓ× Ð Ò ÓÒØÖ Ö Ø Ð Ù Ø × M × ÔÖ ÑÓº Ò Ò ÙÖ ¸
     ÓÒ M ÔÖ ÑÓ Ý M = 4k + 3 Ð ×ÓÒ Ó Ù Ö Ø Ó Ò×Ô ÓÒ ØÓ Ð Ø Ð º
          Ð ×ÓÒ Ó Ù Ö Ø Ó ÑÔ Ð ÓÖÑ ÓÒ               Ò × Ð Ò Ð × ÓÐ × ÓÒ¸ Ô ÖÓ ÒÓ ÑÙÐ
     Ð ×ÓÒ Ó Ð ÔÓÖÕÙ Ð ÓÔ Ö ÓÒ i2 Ò × Ð ØÓÖ Ò × ÑÙÐ ÙÒ ÓÑÔÓÖØ Ñ ÒØÓ Ð ØÓ¹
    Ö Óº ÓÒ× Ù ÒØ Ñ ÒØ ¸ ÓÒ Ð ×ÓÒ Ó Ù Ö Ø Ó × ÔÖ × ÒØ Ð ÖÙÔ Ñ ÒØÓ × ÙÒ Ö Ó
    Ý Ð ÓÖÑ ÓÒ         Ò × Ò ØÓÖÒÓ Ð × ÓÐ × ÓÒ × i2 ÑÓ Mº Ì Ò Ð ×Ú ÒØ ¸ Ñ ×¸
        × Ö Ñ × ÓÑÔÐ Ó ÑÔÐ ÒØ Ö Ý ÑÔÓÒ Ö Ö ×ØÖ ÓÒ Ð × Ð ÓÒ M ÙÒ ÒÙÑ ÖÓ
    ÔÖ ÑÓ¸ Ð Ó ÕÙ ÒÓ × ÑÔÖ × ÔÓ× Ð º
    5.1.4.5   Doble hash

       × ÔÓ× Ð ÒרÖÙÑ ÒØ Ö Ð ×ÓÒ Ó Ð ÓÒ× Ö ÑÓ× ×ÔÓÒ Ö M ר ÒØ × ÙÒ ÓÒ ×
       × {h1(k), h2(k), . . . , hM(k)} ÓÒ ÓÑÔÓÖØ Ñ ÒØÓ× Ð ØÓÖ Ó× Ò Ô Ò ÒØ × Ò ×Ø
    × ØÙ ÓÒ¸ ÔÓ ÑÓ× ×ÓÒ Ö ÐÑ ÒØ × ÒÚÓ ÑÓ× ÔÖ Ñ Ò Ñ ÒØ h1(k) ݸ × Ý
     ÓÐ × ÓÒ¸ ÒØÓÒ × ×ÓÒ ÑÓ× Ð × Ù Ø × Ò Ð ÓÖ Ò h2(k), h3(k), . . . , hM(k) ר Ò ÓÒ¹
    ØÖ Ö ÙÒ Ù Ø ×ÔÓÒ Ð º ר × Ò Ö Ó × Ô Ö Ø Ñ ÒØ Ø Ð ¸ Ô ÖÓ Ý                     × ÖÒÓ×
     Ú ÒØ ×Ù ¬ ÙÐØ ¸ ÒÓ ×ÓÐÓ Ò Ù ÒØÓ Ð × Ð M¸ × ÒÓ Ò Ù ÒØÓ ×Ù Ò Ö Ð
    Ö ×Ô ØÓ Ð Ø Ñ ÒÓ M¸ × ÓÑÓ Ð Ø ÔÓ Ð Ú Ô Ö Ð Ù Ð × ÒרÖÙÑ ÒØ Ð Ñ Ð
     ÙÒ ÓÒ × × º
           Ô × Ö Ð × ÓÒ× Ö ÓÒ × ÒØ Ö ÓÖ ×¸ Ü ×Ø ÙÒ Ü Ð ÒØ Ý Ö Ð Ø Ú Ñ ÒØ Ö Ø
    ÑÒÖ         ÑÙÐ Ö Ð ×ÓÒ Ó Ð ÓÒ× ×Ø ÒØ Ò ÙØ Ð Þ Ö Ó× ÙÒ ÓÒ × × Ô Ö ÐÓ× ÔÖ Ñ Ö
    Ý × ÙÒ Ó ×ÓÒ Ó׸ Ö ×Ô Ø Ú Ñ ÒØ º Ë ÐÓ× Ó× ×ÓÒ Ó× Ð ØÓÖ Þ Ó× Ù× Ò ÓÐ × ÓÒ¸ Ò¹
    ØÓÒ × Ù× ÑÓ× ×ÓÒ Ó Ð Ò Ðº Ä             ÙÒ Ñ ÒØ Ð × ÑÙÐ Ö Ð ×ÓÒ Ó Ð Ô Ö Ð ÔÖ Ñ Ö
     ÓÐ × ÓÒº ÁÒØÙ Ø Ú Ñ ÒØ ¸ × Ö ÓÖ ÑÓ× Ð Ô Ö Ó          Ð ÙÑÔÐ ÒÓ׸ ×ØÓ Ø Ò × ÒØ Ó
    ÔÓÖÕÙ Ð ÔÖÓ Ð                 ØÖ ÔÐ Ó Ñ × ÓÐ × ÓÒ Ö ÜÔÓÒ Ò ÐÑ ÒØ ´α3, α4, . . . Ý ×
    ×Ù × Ú Ñ ÒØ µº
          Ú ÒØÙ ÐÑ ÒØ ¸ × Ô Ö Ø Ñ ÒØ Ö Ð Þ Ð ¸ ÙÒÕÙ Ò Ø ÑÔÓ ÓÒר ÒØ Ñ × ÓרÓ×Ó¸
    ÙÒ ØÖ ÔРݸ Ò Ò Ö Ð¸ ÙÒ m¹ × º
          Ò ALEPH¸ ÙÒ Ø Ð × ÓÒ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ × ÔÓÖ Ö ÓÒ Ñ ÒØÓ ÖØÓ
    Ý Ó Ð ÙÒ ÓÒ × × ÜÔÓÖØ ÔÓÖ Ð Ì ODhashTable<Key, Record>¸ Ð Ù Ð ×
     ×Ô ¬ Ò Ð Ö ÚÓ ØÔÐ Ó × ºÀ ¾
¾    ØÔÐ Ó × ºÀ ¾ ≡
         template <typename Key, typename Record, class Cmp = Aleph::equal_to<Key> >
     class ODhashTable
     {
        Å Ñ ÖÓ× ÔÖ Ú Ó× ODhashTable<Key, Record> ¾
        Å Ñ ÖÓ× ÔÙ Ð Ó× ODhashTable<Key, Record> ¾
     };
      ¬Ò ×
     ODhashTable¸   Ù×   Ò ÙÒ   ¾ º
        Ò Ð ÔÖ Ø ¸ ODhashTable<Key, Record>                × Ò ÒØ Ö Þ         ÒØ
    OLHashTable<Key,Record>¸ Ð ÙÒ Ö Ò ×ØÖ                 Ò ÕÙ Ð ÓÒרÖÙ ØÓÖ Ö ÕÙ Ö Ð
    × ÙÒ      ÙÒ ÓÒ × º
5.1. Manejo de colisiones                                                       425



    El problema de la eliminaci´n con el doble hash
                               o
           Ù Ò Ó ×ØÙ ÑÓ× Ð ×ÓÒ Ó Ð Ò Ð¸ ÜÔÐ ÑÓ× Ð ÔÖÓ Ð Ñ ÕÙ ÔÐ ÒØ Ð × ÑÔ ÒÓ
     Ð       Ó ÕÙ Ð × Ù Ø ×            Ò Ñ Ö Ö× ÓÒ Ð Ú ÐÓÖ DELETEDº Ò ÕÙ Ð ÒØÓÒ ×
       × ÖÖÓÐÐ ÑÓ× ÙÒ Ø Ò Ö Ñ Ò × ÒØ Ð ÖÖ ÙÖ                Ö     ¸ ÕÙ ÔÐ ÑÓ× Ð Ì
    OLHashTable<Key,Record> Ý ÕÙ ÒÓ× Ô ÖÑ Ø Ô ÙÐ Ø Ò Ñ ÒØ Ö Ð Ñ Ò Ò Ó Ð ×Ø ØÙ×
    DELETEDº ÓÒ Ð Ó Ð          × ÒÓ × ÔÓ× Ð ×Ø Ø Ò ÔÓÖÕÙ ÔÙ Ò Ü ×Ø Ö Ð Ú × Ø Ð ×
    ÕÙ h1(k) = h2(k)¸ ÐÓ ÕÙ ÔÙ          ÖÖ Ö ÙÒ × ØÙ ÓÒ Ò Ð ÕÙ × ÑÔÓ× Ð Ø ÖÑ Ò Ö
    × Ð Ð Ú ÓÐ × ÓÒÓ Ò Ð ÔÖ Ñ Ö Ó × ÙÒ Ó ×ÓÒ Óº
          Ò Ò Ö Ð Ð ÔÖÓ Ð Ñ × Ð Ñ ×ÑÓ × Ù× ÑÓ× ØÖ × Ó Ñ × ÙÒ ÓÒ × × Ó¸ × ×
       × Ù Ö × Ð ×Ó¸ ÑÔÐ Ö ÑÓ× ×ÓÒ Ó Ðº
          Ò Ò ÙÖ ¸ Ð Ñ ØÓ Ó                ÖÖ Ö Ö ×         Ù Ø × ÓÒ ×Ø ØÙ× DELETED
    ´Ü º½º º¾ ´Ô Ò ½ µµ ÑÙ Ú ÐÓ× ÓÒØ Ò Ó× Ð × Ù Ø × ÑÓÚ Ñ ÒØÓ Ò × Ð Ò
     Ð ÙÒ × × ØÙ ÓÒ ×º
         Ë Ù× ÑÓ× Ó Ð × ¸ ÓÑÓ¸ ÒØÓÒ ×¸ ØÖ Ø ÑÓ× ÓÒ Ð Ð Ñ Ò ÓÒ À Ý Ó× Ò ÓÕ٠׸
       × Ù ÖØÓ× ÔÓÖ ÔÖ Ñ Ö Ú Þ ÔÓÖ Ó× ÒÚ ×Ø ÓÖ × ÔÓÒ × × ½ ¸ ÕÙ ÒÓ ÑÙ Ú Ò Ð ×
     Ù Ø × Ý ÕÙ ×Ù Ú Þ Ð Ñ Ò Ò Ð ÒØÖÓÔ Ù× ÔÓÖ Ð × Ù Ø × DELETED
        ½º Ë Ñ ÒØ Ò Ð Ù ÒØ Ð × Ù Ø × ÓÒ ×Ø ØÙ× DELETEDº Ù Ò Ó Ð Ò Ú Ð               Ö
                Ù Ø × DELETED Ð Ò ÙÒ ÙÑ Ö Ð Ó¸ ÔÓÖ ÑÔÐÓ¸ ÙÒ ¿¼±¸ ØÓ × Ð × Ù Ø ×
            ÓÒ Ú ÐÓÖ DELETED × Ñ Ö Ò ÓÒ Ú ÐÓÖ EMPTYº ÄÙ Ó¸ × Ö ÓÖÖ ÒØ Ö Ñ ÒØ Ð Ø Ð
           Ý × Ü Ñ Ò Ù Ð × Ù Ø × ÓÒ ×Ø ØÙ× BUSY × Ò Ù ÒØÖ Ò Ò ÙÒ           Ò ×ÓÒ Ó
           Ø Ð ÕÙ × Ö ÕÙ Ö Ñ Ö Ö Ù Ø × ÒØ ÖÑ × ÓÒ ×Ø ØÙ× DELETEDº
             ר Ø Ò Ø Ò Ð Ò ÓÒÚ Ò ÒØ ÕÙ ÓÒ×ÙÑ Ø ÑÔÓ O(M)¸ ÐÓ Ù Ð × ×Ø ÒØ
           ÒÓØ Ð Ö ×Ô ØÓ Ð × ÑÔ ÒÓ ×Ô Ö Ó O(1)º               Ñ ×¸ ×     Ð ÔÓ× Ð Ø Ö Ð
               Ù ÓÒ Ð × Ñ × ÓÔ Ö ÓÒ × Ñ ÒØÖ × ×          ØÙ ר Ð ÑÔ Þ º
             Ú ÒØÙ ÐÑ ÒØ ¸ Ò Ñ ÒÓ× Ó Ø Ò Ö ÕÙ ÑÓÚ Ö Ð ÙÒ × Ù Ø ×¸ ÕÙ ÐÐ × ÓÐ Ò¹
              ÒØ × ÓÒ ×Ø ØÙ× BUSY¸ ÕÙ × Ò ÔÖÓ Ù ØÓ Ð ×ÓÒ Ó Ð Ò Ð¸ ÔÙ Ò Ö ¹ÐÓ Ð Þ Ö×
           Ñ ÒØ × ÑÔÐ Ö ¹ Ò× Ö ÓÒº
        ¾º Ä ÓØÖ Ø Ò ¸ Ò Ð Ò Ý ÓÒ ÙÖ ÓÒ ÓÒר ÒØ ¸ × Ñ ÒØ Ò Ö ÙÒ ÓÒØ ÓÖ
           ×ÓÒ Ó× Ò         Ù Ø ÕÙ ÒÓÑ Ò Ö ÑÓ× probe counterº ÁÒ ÐÑ ÒØ ¸              Ù¹
              Ø Ø Ò ×Ø ØÙ× EMPTY Ý ÓÒØ ÓÖ Ò ÖÓº ÓÒ ÓÖÑ Ó ÙÖÖ Ò Ò× Ö ÓÒ × Ý Ð ×
            Ù Ø × ×Ø Ò Ò ÙÒ          Ò     ×ÓÒ Ó¸ × Ò Ö Ñ ÒØ Ò ÐÓ× ÓÒØ ÓÖ × Ð × Ù¹
              Ø × ÓÑÔÓÒ ÒØ × Ð          Ò º Ò ÐÓ Ñ ÒØ ¸ Ù Ò Ó Ó ÙÖÖ Ò Ð Ñ Ò ÓÒ ×¸ ×
               Ö Ñ ÒØ Ò Ð × Ù Ø × ÒØÖ Ð ÔÖ Ñ Ö ×ÓÒ Ó Ý Ð Ù Ø Ð Ñ Ò º Ù Ò Ó Ð
            ÓÒØ ÓÖ ÙÒ Ù Ø ÓÒ ×Ø ØÙ× DELETED Ú Ò ÖÓ¸ ÒØÓÒ ×¸ ÔÙ ×ØÓ ÕÙ Ð Ù¹
              Ø ÒÓ ÖÓÑÔ Ò Ò ÙÒ         Ò ×ÓÒ Ó¸ ר ÔÙ Ñ Ö Ö× ÓÒ × ÙÖ               ÓÑÓ
           EMPTYº

         È Ö Ð Ø ÔÓ ODhashTable<Key, Record> ÑÔÐ Ö ÑÓ× Ð × ÙÒ Ø Ò º
    Atributos de ODhashTable<Key, Record>
          Ò ÙÒ ÓÒ Ð Ø Ò       Ð Ñ Ò ÓÒ ÕÙ Ö Ò ÑÓ× ÔÖ × ÒØ Ó Ý × Ð                ÓÒ Ó¸
    ÐÓ ÔÖ Ñ ÖÓ ÕÙ   ÑÓ×    Ö × ¬Ò Ö Ð ×ØÖÙ ØÙÖ Ð Ù Ø
¾    Å Ñ ÖÓ× ÔÖ Ú Ó× ODhashTable<Key, Record> ¾ ≡  ´¾µ ¾
     struct Bucket
     {
426                                                             Cap´
                                                                       ıtulo 5. Tablas hash



        Key                key;              //   clave
        Record             record;           //   registro
        unsigned           status     : 4;   //   status EMPTY, DELETED o BUSY
        unsigned           probe_type : 4;   //   sondeo: FIRST_PROBE SECOND_PROBE LINEAR_PROBE
        unsigned short     probe_counter;    //   contador de sondeos
      };
         ÄÓ× ØÖ × ÔÖ Ñ ÖÓ× ØÖ ÙØÓ× ×         ¬Ò Ò         ÓÖÑ       ÒØ         Ð Ù Ø
    OLHashTable<Key,Record>º Ð ØÖ ÙØÓ probe type Ò               × ÙÒ Ð Ú ÐÑ Ò         Ò
    Ð Ù Ø × Ö ×ÙÐØ ÒØ Ð ÔÖ Ñ ÖÓ ´FIRST PROBEµ Ó × ÙÒ Ó ´SECOND PROBEµ ×ÓÒ Ó× Ó
       Ð ×ÓÒ Ó Ð Ò Ð ´LINEAR PROBEµ Ô ÖØ Ö Ð Ø Ö Ö ÓÐ × ÓÒº
         ÆÓØ ÑÓ× ÕÙ status Ý probe type ×ÓÒ ÑÔÓ×           Ø× ´Ò Ð ×µ Ý ÕÙ Ñ Ó× ÓÒ ÓÖÑ Ò
    ÙÒ ÝØ Ü ØÓº
           Ð ÙÐØ ÑÓ ØÖ ÙØÓ¸ probe counter¸ Ò ¸ Ø Ð ÓÑÓ ÐÓ            ÑÓ× ÜÔÐ Ö¸ Ð Ò¹
    Ø            Ð Ú × ÕÙ ÓÐ Ò Ò Ò ÙÒ      Ò      ÓÐ × ÓÒ × ÕÙ Ô ÖØ × Ð ÔÖ Ñ Ö ×ÓÒ Ó
      ÓÒ Ð ÔÖ Ñ Ö ÙÒ ÓÒ × ¸ ר Ð ÙÐØ ÑÓ ×ÓÒ Ó ÓÒ Ð × ÙÒ ÙÒ ÓÒ × Ó ÓÒ
      Ð ÙÒ ÒØ             ×ÓÒ Ó× Ð Ò Ð ×º ÈÓÖ ÑÔÐÓ¸ probe counter == 4¸ ÒØÓÒ × ×ØÓ
     Ò ÕÙ × Ù Ø ×Ø Ò Ð Ñ ÒÓ ×ÓÒ Ó ÕÙ ÓÑ ÒÞ ÔÓÖ Ð ÔÖ Ñ Ö ÙÒ ÓÒ
        × ¸ ÐÙ Ó ÔÓÖ Ð × ÙÒ ÙÒ ÓÒ × ¸ Ñ × Ó× Ù Ø × ×ÓÒ                  × Ð Ò ÐÑ ÒØ º
         ÄÓ× ØÖ ÙØÓ× Ð ÔÖÓÔ Ø Ð × ¬Ò Ò Ð × Ù ÒØ Ñ Ò Ö
¾    Å Ñ ÖÓ× ÔÖ Ú Ó× ODhashTable<Key, Record> ¾ +≡ ´ ¾ µ ¾ ¾
      Bucket *   table;                       //   arreglo de cubetas
      Hash_Fct   first_hash_fct;              //   primera funci´n hash
                                                                o
      Hash_Fct   second_hash_fct;             //   segunda funci´n hash
                                                                o
      size_t     M;                           //   tama~o de la tabla
                                                       n
      size_t     N;                           //   n´mero de cubetas ocupadas
                                                    u
      size_t     deleted_entries_counter;     //   n´mero de cubetas DELETED
                                                    u
      size_t     empty_entries_counter;       //   n´mero de cubetas EMPTY
                                                    u
    ÐÓ× Ù Ð × × Ò Ð Þ Ò Ò Ð ÓÒרÖÙ ØÓÖ Ð × Ù ÒØ Ñ Ò Ö
¾    Å Ñ ÖÓ× ÔÙ Ð Ó× ODhashTable<Key, Record> ¾ ≡                     ´¾µ ¾
      ODhashTable(Hash_Fct __first_hash_fct, Hash_Fct __second_hash_fct,
                  const size_t & len)
        : table(new Bucket[len]),
          first_hash_fct(__first_hash_fct), second_hash_fct(__second_hash_fct),
          M(len), N(0), deleted_entries_counter(0), empty_entries_counter(M)
      { /* empty */ }
    Í× × ODhashTable ¾ º

    B´squeda
     u
        Ð × ÓÔ Ö ÓÒ × ÕÙ Ö ÕÙ Ö Ò ×ÓÒ Ó׸ Ð Ù×ÕÙ × Ð Ñ × × ÑÔÐ
¾   Å Ñ ÖÓ× ÔÙ Ð Ó× ODhashTable<Key, Record> ¾ +≡ ´ ¾ µ ¾                        ¾
      Record * search(const Key & key)
      {
        int i = (*first_hash_fct)(key) % M; // primer sondeo con primera funci´n hash
                                                                              o
        if (table[i].status == EMPTY)
          return NULL;
        if (table[i].status == BUSY and Cmp() (table[i].key, key))
          return &table[i].record;
        i = (*second_hash_fct)(key) % M; // Segundo sondeo con segunda funci´n hash
                                                                            o
5.1. Manejo de colisiones                                                     427



         if (table[i].status == BUSY and Cmp() (table[i].key, key))
           return &table[i].record;
             // sondeo lineal a partir del ındice dado por segunda funci´n hash
                                           ´                            o
         for (int count = 0; count < M and table[i].status != EMPTY; count++)
           {
             advance_index(i);
             if (table[i].status == BUSY and Cmp() (table[i].key, key))
               return &table[i].record;
           }
         return NULL; // sondeo no encontr´ la clave
                                          o
     }


    Inserci´n
           o
       È Ö Ñ ÓÖ Ö Ð ÓÑÔÖ × ÓÒ Ð Ð ÓÖ ØÑÓ Ò× Ö ÓÒ¸ ÓÒ ÓÒ × Ò Ð Ô Ö Ð Ð ¹
     Ð    Ý ÓÖÖ Ø ØÙ ¸ Ò Ô×ÙÐ Ö ÑÓ× Ð Ö × ÖÚ ÓÒ Ð Ù Ø Ò Ð × Ù ÒØ ÖÙØ Ò
¾   Å Ñ ÖÓ× ÔÖ Ú Ó× ODhashTable<Key, Record> ¾ +≡ ´ ¾ µ ¾ ¾
     Record* allocate_bucket(Bucket & bucket, const unsigned char & probe_type,
                             const Key & key, const Record &        record)
     {
       ++N;
       if (bucket.status == EMPTY)
         --empty_entries_counter;
       else
         --deleted_entries_counter;
       bucket.key        = key;
       bucket.record     = record;
       bucket.status     = BUSY;
       bucket.probe_type = probe_type;
       bucket.probe_counter++;
       return &bucket.record;
     }
      ¬Ò ×
     allocate bucket¸   Ù×   Ò ÙÒ   ¾ º
     Ä ÖÙØ Ò Ö     ÙÒ Ù Ø Ò Ð Ù Ð × × Ò× ÖØ Ö ÔÓÖ ÓÔ Ð Ô Ö ´key,recordµ
     ÓÒ ×ÓÒ Ó Ø ÔÓ probe type ´FIRST PROBE¸ SECOND PROBE Ó LINEAR PROBEµº
        Ä ÖÙØ Ò ÒØ Ö ÓÖ Ô ÖÑ Ø ÓÒ ÒØÖ Ö Ð Ò× Ö ÓÒ Ò Ð ×ÙÒØÓ ÒØ Ö × ×Ø ×ØÙ Ó
    Ð Ñ Ò Ö ×ÓÒ Ö ÓÒ Ó× ÙÒ ÓÒ × × Ý ÐÙ Ó Ð Ò Ð × Ó ÙÖÖ Ò ØÖ × Ó Ñ × ÓÐ × Ó¹
    Ò ×º × Ñ ÒØ ¸ Ò Ô Ò ÒØ Ñ ÒØ          ×Ù ×Ø ØÙ׸      Ù Ø ×ÓÒ          ÙÖ ÒØ Ð
     Ò× Ö ÓÒ¸     Ò Ö Ñ ÒØ Ö× Ð ×Ù ÓÒØ ÓÖ ÓÐ × ÓÒ ×
¾    Å Ñ ÖÓ× ÔÙ Ð Ó× ODhashTable<Key, Record> ¾ +≡ ´ ¾ µ ¾ ¾
     Record* insert(const Key & key, const Record & record)
     {
       if (N >= M)
         throw std::overflow_error("Hash table is full");
       int i = (*first_hash_fct)(key) % M; // sondeo con primera funci´n hash
                                                                      o
       if (table[i].status != BUSY) // ¿cubeta disponible?
         return allocate_bucket(table[i], FIRST_PROBE, key, record);
       table[i].probe_counter++; // por aqu´ se sondear´ colisi´n ==> incrementar contador
                                           ı           a       o
       i = (*second_hash_fct)(key) % M; // sondeo con segunda funci´n hash
                                                                   o
428                                                        Cap´
                                                                  ıtulo 5. Tablas hash



          if (table[i].status != BUSY) // ¿cubeta disponible?
            return allocate_bucket(table[i], SECOND_PROBE, key, record);
          do // sondear linealmente a partir de ındice de segundo sondeo e
                                                 ´
              // incrementar cada contador de cubeta sondeada
            {      // por esta cubeta se sondear´ una colisi´n ==> incrementar contador
                                                a           o
               table[i].probe_counter++;
               advance_index(i);
            }
          while (table[i].status == BUSY); // parar si DELETED o EMPTY
          return allocate_bucket(table[i], LINEAR_PROBE, key, record); // listo
      }
    Í× × allocate bucket ¾ º

    Eliminaci´n
             o
        Ä Ð Ñ Ò ÓÒ × Ð ÓÔ Ö ÓÒ Ñ × Ð          ר Ì º ר ׸ Ò ÐÓ ÕÙ ÓÒ ÖÒ
     Ð ×ÓÒ Ó¸ ÒÚ Ö× Ð Ò× Ö ÓÒ ÐÓ× ÓÒØ ÓÖ × Ð × Ù Ø × ×ÓÒ         ×   Ò Ö¹
    Ñ ÒØ Ö× º Ò Ò ÙÖ ¸ × ÙÖ ÒØ ר ÓÔ Ö ÓÒ ÕÙ × Ø Ø Ò Ù Ø × ÕÙ ÔÙ Ò
    Ñ Ö Ö× ÓÑÓ EMPTY Ð Ú Ö ¬ Ö ÕÙ ×Ù× ÓÒØ ÓÖ × Ú Ò Ò Ò ÖÓº
         × Ô٠׸   ØÓ× ÜÔÖ × Ö Ð Ð Ñ Ò ÓÒ ×ÓÐÓ Ò Ø ÖÑ ÒÓ× Ð ×ÓÒ Ó¸ Ð Ö Ñ ÒØÓ
       Ð ÓÒØ ÓÖ ÙÒ Ù Ø Ý ×Ù Ú ÒØÙ Ð Ñ Ö Ó ÓÑÓ EMPTY × Ö Ð Þ Ñ ÒØ Ð
    × Ù ÒØ ÖÙØ Ò
¾    Å Ñ ÖÓ× ÔÖ Ú Ó× ODhashTable<Key, Record> ¾ +≡ ´ ¾ µ ¾ ¾
      void decrease_probe_counter(Bucket * bucket)
      {
        bucket->probe_counter--;
        if (bucket->probe_counter == 0) // ¿puede marcarse EMPTY sobre la cubeta?
          {
            bucket->status = EMPTY;
            --deleted_entries_counter;
            ++empty_entries_counter;
          }
      }
      ¬Ò ×
      decrease probe counter¸   Ù×   Ò ÙÒ   ¾º
         Ð Ñ ×ÑÓ ÑÓ Ó¸ Ð Ù Ø Ð Ñ Ò Ö × ×¹Ð Ö      Ñ               ÒØ ÙÒ ÖÙØ Ò × Ñ ØÖ
    Ð allocate bucket() ÑÔÐ Ó Ô Ö Ð Ò× Ö ÓÒ
¾   Å Ñ ÖÓ× ÔÖ Ú Ó× ODhashTable<Key, Record> ¾ +≡                ´¾µ    ¾
      void deallocate_bucket(Bucket * bucket)
      {
        bucket->probe_counter--;
        if (bucket->probe_counter == 0)
          {
            bucket->status     = EMPTY;
            bucket->probe_type = NO_PROBED;
            ++empty_entries_counter;
          }
        else
          {
            bucket->status = DELETED;
5.1. Manejo de colisiones                                                   429



              ++deleted_entries_counter;
            }
          --N;
      }
      ¬Ò ×
      deallocate bucket¸   Ù×   Ò ÙÒ    ¾º
          Ð Ù Ð ÕÙ Ò Ð × Ø Ð × × ÒØ Ö ÓÖ ×¸ Ð Ð Ñ Ò ÓÒ Ö       ÙÒ ÔÙÒØ ÖÓ Ð Ö ×ØÖÓ¸
    ÐÓ ÕÙ       Ñ × × ÑÔÐ Ð Ð ÓÖ ØÑÓ¸ ÔÙ × ÓÖÖ Ó Ó Ô Ö Ð Ù×ÕÙ             Р٠غ
      רӏ ÙÒ Ó Ð × Ó× ÖÙØ Ò × ÒØ Ö ÓÖ ×¸ ÒÓ× Ô ÖÑ Ø Ö × Ò Ö ÙÒ Ð Ñ Ò ÓÒ ÕÙ ×ÓÐÓ
    × ÓÒ ÒØÖ Ò Ö Ñ ÒØ Ö ÐÓ× ÓÒØ ÓÖ × ÒØÖ Ð ÔÖ Ñ Ö ×ÓÒ Ó Ý Ð Ù Ø Ð Ñ Ò Öº
         ÕÙ ¸ Ô٠׸ Ð ÙØ Ð    Ð ØÖ ÙØÓ probe type¸ ÔÙ × ×Ø ÒÓ× Ô ÖÑ Ø Ø ÖÑ Ò Ö Ò
    ÕÙ ÔÙÒØÓ Ð           Ò ×ÓÒ Ó × Ò Ù ÒØÖ Ð Ù Ø
¾    Å Ñ ÖÓ× ÔÙ Ð Ó× ODhashTable<Key, Record> ¾ +≡ ´ ¾ µ ¾ ¿¼
      void remove(Record * record)
      {
        Bucket * bucket = record_to_bucket(record);
        if (bucket->probe_type != FIRST_PROBE)
          {
            const int i_fst_probe = (*first_hash_fct)(bucket->key) % M;
            decrease_probe_counter(&table[i_fst_probe]);
            if (bucket->probe_type == LINEAR_PROBE)
              { // cubeta fue apartada durante sondeo lineal ==> decrementar segundo
                // sondeo y a partir de aqu´ decrementar todas las cubetas hasta
                                           ı
                // llegar a la que vamos a eliminar
                const int i_snd_probe = ((*second_hash_fct)(bucket->key) % M);
                decrease_probe_counter(&table[i_snd_probe]);
                int i                = i_snd_probe;
                const int last_index = bucket_to_index(bucket);
                for (advance_index(i); i != last_index; advance_index(i))
                  decrease_probe_counter(&table[i]);
              }
          }
        deallocate_bucket(bucket);
      }
    Í× × deallocate bucket ¾     Ò   decrease probe counter   ¾ º

    5.1.4.6    An´lisis informal del doble hash
                 a

     ÓÑÓ Ý ÐÓ ÑÓ× Ö Ø Ö Ó¸ Ð Ó Ð × ÑÙÐ Ð ×ÓÒ Ó                  к Ç × ÖÚ ÓÒ ×
    ÑÔ Ö × ½ Ò Ò ÕÙ ×Ø ÑÙÐ ÓÒ × ×Ø ÒØ ÖØ Ö º × Ô٠׸ Ò Ð ÔÖ Ø ¸ Ð
    ÓÑÔÓÖØ Ñ ÒØÓ Ð Ó Ð × × ÕÙ Ô Ö Ð Ð Ð ×ÓÒ Ó Ð Ý Ð × ÙÖÚ × ÑÓ×ØÖ ×
    Ò Ð × ¬ ÙÖ × º½ ´Ô º ¾½µ Ý º¾ ´Ô º ¾¾µ ÓÖÖÓ ÓÖ Ò × × Ú Ö ÓÒº
         Ð ¼± ÔÐ Ò ØÙ ¸ Ð Ó Ð × Ö Ð Þ ½¼ ×ÓÒ Ó× Ô Ö ÙÒ Ù×ÕÙ          ÐРݸ ÑÙÝ
    ÑÔÓÖØ ÒØ ¸ ¾¸ ×ÓÒ Ó× Ô Ö ÙÒ Ù×ÕÙ       Ü ØÓ× º ר × ÓØ ׸ ÜÔÖ × × Ò ÙÒ ÓÒ
       α Ò Ô Ò ÒØ × Ð Ú ÐÓÖ        M¸    Ò ÕÙ Ð × ÑÔ ÒÓ ×Ô Ö Ó Ð Ù×ÕÙ ¸
    Ü ØÓ× Ó ÐÐ ¸ × ÓÒר ÒØ º ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð Ò× Ö ÓÒ Ý Ð Ù×ÕÙ        ÓÒ Ð Ó Ð
      × ×ÓÒ O(1) ר ÙÒ ¼± ÔÐ Ò ØÙ º ×ÔÙ ×           ר ÙÑ Ö Ð¸ Ð × ÑÔ ÒÓ ÔÙ
       Ö Ö× O(M)º
430                                                          Cap´
                                                                     ıtulo 5. Tablas hash



         Ë × Ó ÑÓ׸ ÔÓÖ × ÙÖ ¸ ÙÒ ¼± ÓÑÓ ØÓÐ Ö Ò                   ÔÐ Ò ØÙ ¸ ÒØÓÒ × Ð ½¼¹
     ¾¼±         Ö Ò Ö ×Ô ØÓ Ð ×ÓÒ Ó Ð Ò Ð ÔÙ Ó Ö ÖÒÓ× ÙÒ Ò Ò ÑÔÓÖØ ÒØ Ò
      ×Ô Ó ÕÙ Ú Ö × ÙÒ × Ð Ø Ñ ÒÓ Ð Ð Ú Ý Ð Ö ×ØÖÓº Ù Ð × Ð Ò Ò Ò
     Ø ÑÔÓ
            ÓÖ Ö Ð ÔÖ ÙÒØ ÒØ Ö ÓÖ × Ð Ó ÔÓÖÕÙ Ð Ó Ð × ÒÓ ×ÓÐÓ × Ò Ø ÑÔÓ
      ÓÒר ÒØ Ñ × ÓרÓ×Ó ÕÙ Ð ×ÓÒ Ó Ð Ò Ð¸ × ÒÓ ÕÙ × ×Ø ÒØ ÔÖÓ Ð ÕÙ Ð × ÙÒ Ó
     ×ÓÒ Ó Ù× ÙÒ ÖÙÔØÙÖ Ð                    º × ÕÙ ¸ ÔÓÖ ×Ù × ÑÔÐ       Ý Ù Ò × ÑÔ ÒÓ
       Ò Ö Ð¸ Ð ×ÓÒ Ó Ð Ò Ð × Ð × Ó Ò               ØÓ Ô Ö ÓÒ ÙÒØÓ× Ô ÕÙ ÒÓ× Ý Ñ ÒÓ× Ò
     ÐÓ× Ù Ð × × ×Ø Ñ Ð Ð Ø Ñ ÒÓ¸ Ó Ò × ØÙ ÓÒ × ÔÖÓ Ö Ñ ÓÒ Ö Ô Ø Ð × ÓÑÓ Ð
     ÔÖÓØÓØ Ô Ó Ó Ð ÓÒØ Ò Ò º
         Ä ÓÒ           Ð Ó Ð × × ÔÖ            Ù ÒØÓ Ñ ÝÓÖ × × Ò M Ý N Ò ÐÓ× Ù Ð × ÐÓ× ½¼
     ×ÓÒ Ó× ÕÙ ØÓÑ Ð Ù×ÕÙ                 ÐÐ Ý Ð Ò× Ö ÓÒ¸ ×ÓÒ ÒÓØ Ð × Ñ Ñ ÒØ Ñ ÓÖ × ÕÙ
     ÐÓ× ¿ ×ÓÒ Ó× ÕÙ Ò ÔÖÓÑ Ó ØÓÑ Ö Ð Ù×ÕÙ                  ÐÐ × Ð Ø Ð ×ØÙÚ × Ð ¼±
     ÔÐ Ò ØÙ º Ò Ù ÒØÓ Ð ×Ô Ó¸ Ñ ÝÓÖ × Ú ÐÓÖ × M Ý N¸ Ñ ÝÓÖ × Ð ×Ô Ö Ó Ò
      Ù Ø × Ú × ÕÙ Ö ÕÙ Ö Ö ÑÓ× ÓÒ Ð ×ÓÒ Ó Ð Ò Ðº
         È × Ó Ð ¼± ÔÐ Ò ØÙ ¸ Ð Ó Ð × Ü                   ÖÙÔ Ñ ÒØÓ × ÙÒ Ö Ó Ý × Ö Ò
     ×Ù× ÓÔ Ö ÓÒ ×º × ÜØÖ Ñ Ñ ÒØ ÑÔÓÖØ ÒØ Ö ÒØ Þ Ö ×Ø ÓØ º
          Ò × ÒØ × ×¸ ÐÓ× Ö Ø Ö Ó× ÕÙ ÓÒ Ù Ò × Ó Ö Ó Ð × ÓÑÓ ×ØÖ Ø                 ×ÓÒ Ó
     × Ö ×ÙÑ Ò Ò
        ½º Ö Ò ÒØ                Ð Ú ×¸ ÐÓ ÕÙ ÑÔÐ ÕÙ Ð Ú ÐÓÖ × Ó Ö M × ÐØÓ Ý Ð
             ×Ô Ö Ó Ò Ù Ø × ×Ó ÙÔ × × Ñ ÝÓÖ ÓÒ Ð ×ÓÒ Ó Ð Ò Ðº
        ¾º ÈÓ Ó Ñ Ö Ò           ×Ô Ö Ó ÔÓÖ ÑÔÐÓ¸ ÔÓ Ñ ÑÓÖ º
         Ë Ð ×Ø Ñ Ó ×Ó Ö N × ÔÖ ×Ó Ý ÒÓ ÑÙÝ Ö Ò ¸ ÒØÓÒ × Ð ×ÓÒ Ó Ð Ò Ð × Ð
     × Ð ÓÒ × × N × Ö Ò ¸ ÒØÓÒ × Ó Ð × º Ë Ð ×Ø Ñ Ó N × ÑÔÖ ×Ó¸
      ÒØÓÒ × Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó × Ð Ñ ÓÖ ×ØÖ Ø º

     5.1.5   Reajuste de dimensi´n en una tabla hash
                                o
     ÄÙ Ó ÐÓ× Ò Ð × × Ö Ð Þ Ó׸ ÒÓ             Óר ÖÒÓ× ÔÖ Ò Ö ÕÙ ¸ Ò Ô Ò ÒØ Ñ ÒØ
         Ð ×ØÖ Ø Ô Ö ØÖ Ø Ö ÓÒ Ð × ÓÐ × ÓÒ ×¸ Ù ÒØÓ Ñ × Ô ÕÙ ÒÓ × α¸ Ñ ÒÓÖ × Ð
     ÔÖÓ Ð            ÓÐ × ÓÒ Ý¸ ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ñ ÓÖ × Ð × ÑÔ ÒÓ Ð ×ØÖ Ø º ÈÓÖ
     ÓØÖ Ô ÖØ ¸ ÙÒÕÙ × Ó × ÓÒ Ð¸ Ð Ñ Ð ×Ù ÖØ Ü ×Ø ݸ Ú ÒØÙ ÐÑ ÒØ ¸ Ó Ð ÓÒ ÙÒØÓ
          Ð Ú × ×ÙÔ Ö Ð ×Ø Ñ ÓÒ N¸ Ó Ð Ñ Ð Þ Ö Ù× ÙÒ ÒØ                     ÐØ     ÓÐ × ÓÒ ×º
      ÈÙ          Ö× Ð Ó Ð Ö ×Ô ØÓ
         À Ý Ó× Ñ Ò Ö × ØÖ Ø Ö ÓÒ Ð Ñ Ð ×Ù ÖØ º Ä ÔÖ Ñ Ö ¸ ×            Ò Ð Ò Ò Ñ ÒØÓ
     × Ô Ö Ó Ý ÕÙ × Ö ÜÔÐ           Ò Ü º½º ´Ô Ò ¿¿µ¸ Ö Ù          Ð ÖÖ ÐÓ Ý Ð × Ù Ø × Ô Ö
        Ö ÒØ Þ Ö ÙÒ ÐÓÒ ØÙ Ñ Ü Ñ              Ð ×Ø     ÓÐ × ÓÒ ×º Ä × ÙÒ ¸ Ó ØÓ           ר
     ×Ù ¹× ÓÒ¸ ÓÒ× ×Ø × ÑÔÐ Ñ ÒØ Ò Ô ÖØ Ö ÙÒ ÒÙ ÚÓ ÖÖ ÐÓ ÓÒ M Ñ ÝÓÖ Ý Ö Ù Ö
     Ð × Ð Ú ×º
              ר ÑÓ Ó¸ Ð Ö Ùר ÓÒ Ð Ó Ð × ÔÙ ÔÐ ÒØ Ö× Ð × Ù ÒØ Ñ Ò Ö
¿¼    Å Ñ ÖÓ× ÔÙ Ð Ó× ODhashTable<Key, Record> ¾ +≡                  ´¾µ ¾
       const size_t & resize(const size_t & new_size)
       {
         Bucket * new_table      = new Bucket [new_size]; // aparta nuevo arreglo
         Bucket * old_table      = table; // respaldar valores de la antigua tabla
5.1. Manejo de colisiones                                                      431



          const size_t old_M      = M;
          table                   = new_table; // reiniciar tabla a nuevo arreglo
          M                       = new_size;
          empty_entries_counter = M;
          deleted_entries_counter = 0;
          N                       = 0;
          for (int i = 0; i < old_M; ++i) // recorrer antigua tabla y reinsertar
            if (old_table[i].status == BUSY)
              insert(old_table[i].key, old_table[i].record);
          delete [] old_table;
          return M;
      }
         Ä ÓÔ Ö ÓÒ ×¸ ÓÒ ÔØÙ Ð Ý ×ØÖÙ ØÙÖ ÐÑ ÒØ ¸ × Ò ÐÐ       ÒØ Ô Ö Ð ×ÓÒ Ó Ð Ò Ðº
       Ð Ö Ø Ö Ó Ô Ö ÒÚÓ ÖÐ ÐÓ Ø ÖÑ Ò Ð ÕÙ Ð Ú ÐÓÖ α ×ÙÔ Ö Ó × ÔÖÓÜ Ñ Ð ÙÑ Ö Ð
      Ò ÕÙ × ÔÖ       ÙÒ Ù Ò × ÑÔ ÒÓº Ò Ð ×Ó Ð Ó Ð × ¸ ÔÙ Ö ÑÓ× ÒÚÓ Ö Ð
     Ö Ùר Ù Ò Ó ÒÓ× ÔÖÓÜ Ñ ÑÓ× Ð ¼± ÔÐ Ò ØÙ º
           × ÔÐ Ù× Ð Ö Ùר Ö × ÙÒ ÙÒ ÔÐ Ò ØÙ          ×Ô Ö Ó      Ù Ø × ×Ø ×ØÖ Ø
     Ø Ò ×Ø ÒØ × ÒØ Ó × Ð × Ò× Ö ÓÒ × × Ò Ý Ð Ø Ð × Ù× ÔÖ Ò Ô ÐÑ ÒØ Ô Ö Ð
       Ù×ÕÙ º Ò ×Ø ×Ó¸ ÔÙ Ö ÑÓ× Ö Ùר Ö Ð Ø Ð ÙÒ M Ò Ö ÓÖ Ñ Ò Ö ÕÙ
        ×Ñ ÒÙÝ ÑÓ× Ð ×Ô Ö Ó Ò Ù Ø × Ý Ö ×Ô Ø ÑÓ× Ð ÙÑ Ö Ð            × ÑÔ ÒÓº
         À Ý Ó× Ù ×Ø ÓÒ Ñ ÒØÓ× ×Ø ÓÔ Ö ÓÒº Ð ÔÖ Ñ ÖÓ            ÐÐÓ× × ×Ù Óר O(M) +
     O(M ) ÙÖ ÓÒ Ò Ð Ù Ð × Ö ÔÖÓ          Ø ÚÓ ÙØ Ö Ù ÐÕÙ Ö ÓØÖ ÓÔ Ö ÓÒº ר Ú Ò¹
     ØÙ Ð ÔÖÓ Ð Ñ × Ñ Ø ¸ Ñ × ÒÓ × Ú Ø Ð ØÓ Ó¸ ÓÒØ Ð Þ Ò Ó Ð ÙÒ Ø ÑÔÓ Ó Ó
      × Ö¸ ÙÒ Ú Þ ÕÙ α Ú Ò Ö Ò Ð ÙÑ Ö Ð¸ ÒØÓÒ × ×Ô Ö ÑÓ× ÔÓÖ ÙÒ Ø ÑÔÓ ÔÖÙ¹
        ÒØ Ú Ö × ÒÓ Ó ÙÖÖ Ò ÓÔ Ö ÓÒ × × ÜÔ Ö Ð Ø ÑÔÓ ×Ô Ö ¸ ÒØÓÒ × ÔÖÓ ÑÓ×
        Ö Ùר Ö Ó Ð ×Ô Ö ÒÞ ÕÙ ÒÓ ×ØÓÖ ÑÓ× Ð × ÓØÖ × ÓÔ Ö ÓÒ ×º
           Ð × ÙÒ Ó Ù ×Ø ÓÒ Ñ ÒØÓ¸ Ú Ð Ó ×ÓÐÓ Ô Ö Ð × Ø Ð × ÖÖ ×¸ × ÕÙ × ÑÙ Ú Ò ÐÓ×
      ÓÒØ Ò Ó× Ð × Ù Ø ×º ÓÒ Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó¸ ÒÓ Ø Ò ÑÓ× ×Ø ÔÖÓ Ð Ñ º
           Ð Ö Ùר Ò Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó Ø Ò Ó× Ú ÒØ ׺ Ä ÔÖ Ñ Ö ¸ Ý Ñ Ò¹
       ÓÒ ¸ × Ð ÔÓ× Ð           N > Mº Ä × ÙÒ Ö            Ò × ÑÔÐ         ØÓÑ Ö ÔÖ Ú ¹
     × ÓÒ × Ô Ö Ô ÖÑ Ø Ö Ð Ò× Ö ÓÒ ÙÖ ÒØ Ð ÔÖÓ ×Ó Ö Ùר º
¿½    Å ØÓ Ó× ÔÙ Ð Ó×      ÒÄ × Ì Ð ¼ +≡                       ´¼ µ ¼
      size_t resize(const size_t & new_size)
      {
        BucketList * new_table = new BucketList [new_size];
        BucketList * old_table = table; // guardar estado de la tabla actual
        const size_t old_size = M;
        table                  = new_table; // hacer tabla vac´a con arreglo new_table
                                                              ı
        M                      = new_size;
        busy_slots_counter     = 0;
        N                      = 0;
        for (int i = 0; i < old_size; ++i) // reinsertar cubetas en nueva tabla
              // recorrer lista colisiones en old_table[i]
          for (BucketItor it(old_table[i]); it.has_current(); /* Nada */)
            insert(static_cast<Bucket*>(it.del())); // eliminar e insertar en table[]
        delete [] old_table; // liberar memoria antigua tabla
        return M;
      }
432                                                     Cap´
                                                                ıtulo 5. Tablas hash



     5.1.6    Manejo din´mico de cubetas (TAD DynLhashTable<Key, Record>)
                        a
        ÙÐ × Ð ÑÒÖ Ñ× ÒÖÐ              ÜÔÓÖØ Ö ÙÒ Ì         × Ó Ò ÙÒ Ø Ð ×
     Ë ØÖ Ø Ö       ÙÒ Ñ Ô Ó ÒØÖ Ð Ú × Ý Ö ×ØÖÓ׸ ÙÝ ÒØ Ö Þ Ý Ù×Ó ×ÓÒ ×¹
     Ø ÒØ × Ñ Ð Ö × ÐÓ× Ñ Ô Ó× ÕÙ Ö Ð Þ ÑÓ× ÓÒ Ö ÓÐ × Ò Ö Ó×        Ù×ÕÙ ´Ø ÔÓ
     DynMapTree<Tree, Key, Range, Compare>¹ Ü º½¼ ´Ô Ò ¿ µµº
         ÄÓ× Ø ÔÓ× Ø Ð × × OLHashTable<Key,Record> Ý ODhashTable<Key, Record>
     × Ø × Ò ×Ø Ö ÕÙ Ö Ñ ÒØÓ ÓÒ Ð × ÐÚ         ÕÙ ×ØÓ× Ð Ñ Ø Ò Ð ÒØ       ÐÚ×
      Ð Ú ÐÓÖ M × Ð ÓÒ Ó Ò ÓÒרÖÙ ÓÒº Ð Ì LhashTable<Key> ÒÓ Ø Ò ×Ø
     ÔÖÓ Ð Ñ ¸ Ô ÖÓ ×Ø Ò Ñ Ò Ö ×ØÖÓ× Ö Ø Ñ ÒØ Ò ØÖ Ø ÓÒ Ð Ñ ÑÓÖ Ò Ñ º
         À Ý ÙÒ ÐØ ÖÒ Ø Ú ÕÙ ¸ Ò ØÖ Ñ ÒØÓ ÙÒ ÔÓ Ó Ø ÑÔÓ ÓÒר ÒØ ¸ × ÖÖÓÐÐ ¹
     Ö ÑÓ× Ò Ü º½º ´Ô Ò ¿¿µº ÈÓÖ ÐÓ× ÑÓÑ ÒØÓ׸ Ò ×Ø × ÓÒ ÜØ Ò Ö ÑÓ× Ð Ø ÔÓ
     LhashTable<Key> Ô Ö ÕÙ Ñ Ò ÙÒ Ö Ò Ó ×Ó      Ó Ð ÓÒ ÙÒØÓ Ð Ú × Ý ØÖ Ø ÓÒ Ð
     Ñ ÑÓÖ Ò Ñ º Ð Ø ÔÓ Ò Ù ×Ø ÓÒ ÐÓ ÒÓÑ Ò ÑÓ× DynLhashTable<Key, Record>¸
      Ð Ù Ð ÑÓ Ð Þ ÙÒ Ø Ð × ¸ ÓÒ Ö ×ÓÐÙ ÓÒ          ÓÐ × ÓÒ × Ò Ò ¸ ÕÙ ×Ó
      Ð Ñ ÒØÓ× Ø ÔÓ key ÓÒ Ö ×ØÖÓ× Ø ÔÓ Record Ý ÕÙ × ×Ô ¬ Ò Ð Ö ÚÓ
      ØÔÐ ÝÒÄ × ºÀ ¿¾ ¸ ÙÝ ×ØÖÙ ØÙÖ Ò Ö Ð × ÓÑÓ × Ù
¿¾    ØÔÐ ÝÒÄ × ºÀ ¿¾ ≡
           template <typename Key, typename Record, class Cmp = Aleph::equal_to<Key> >
       class DynLhashTable : public LhashTable<Key>
       {
          Å Ñ ÖÓ× ÔÖ Ú Ó× DynLhashTable<Key, Record> ¿¾
         typedef typename DynLhashTable<Key, Record>::Hash_Fct Hash_Fct;
          Å Ñ ÖÓ× ÔÙ Ð Ó× DynLhashTable<Key, Record> ¿¿
       };
     Í× × LhashTable ¼ º
         Ä Ø Ð × ÔÙ               Ö× ÓÑÓ ÙÒ ÖÖ ÐÓ ÓÒ ÐÓ× Ò × ×ÓÒ Ð Ú ×
     Ø ÔÓ key Ý ÐÓ× ÓÒØ Ò Ó×     Ð ÖÖ ÐÓ ×ÓÒ Ö ×ØÖÓ×   Ø ÔÓ Recordº È Ö ÐÐÓ¸
     DynLhashTable<Key, Record> ÜÔÓÖØ ×Ó Ö Ö × Ð ÓÔ Ö ÓÖ []º
          ÓÑÓ × Ú ¸ DynLhashTable<Key, Record> Ö ¸ Ø ÒØÓ Ô ÖØ ×Ù ÒØ Ö Þ ÓÑÓ
     Ô ÖØ    ×Ù ÑÔÐ ÒØ ÓÒ¸ LhashTable<Key>º Å ØÓ Ó× ÓÑÓ ÐÓ× Ó × ÖÚ ÓÖ × Ý Ð
     Ö Ùר Ý ×Ø Ò ÑÔÐ ÒØ Ó× ÔÓÖ LhashTable<Key>º ÄÓ Ñ ×ÑÓ × ÔÙ        ÖÔÖ Ð
     Ñ Ò Ó Ð ×ØÖ Ø º Ä Ð ÓÖ DynLhashTable<Key, Record> × Ö Ñ Ø ¸ ÒØÓÒ ×¸
       Ð ¬Ò ÓÒ Ð Ö Ò Ó Ý Ð Ñ Ò Ó Ñ ÑÓÖ º
        Ä      ¬Ò ÓÒ Ð Ö Ò Ó × Ö Ð Þ Ñ ÒØ ÙÒ Ù Ø                    ÖÚ
     LhashTable<Key>::Bucket
¿¾   Å Ñ ÖÓ× ÔÖ Ú Ó×      DynLhashTable<Key, Record> ¿¾ ≡       ´ ¿¾ µ ¿¿
       struct DLBucket : public LhashTable<Key>::Bucket
       {
         Record record;
         DLBucket(const Key & key, const Record & _record)
           : LhashTable<Key>::Bucket(key), record(_record) { /* Empty */ }
       };
       ¬Ò ×
       DLBucket¸ Ù×    Ò ÙÒ   ¿¿º
     Í× × LhashTable   ¼ º
        ÍÒ Ú Þ ¬Ò Ð Ù Ø ¸ Ð × ÓÔ Ö ÓÒ × ÔÖ Ò Ô Ð × ×ÓÒ ÓÒ ÔØÙ ÐÑ ÒØ × Ò ÐР׸
     ÔÙ × Ð Ñ Ò Ó Ð ×ØÖ Ø Ý ×Ø ÒרÖÙÑ ÒØ Ó Ò LhashTable<Key>º Ä Ò× Ö ÓÒ
5.1. Manejo de colisiones                                                         433



     ׸ Ô٠׸ ÓÑÓ × Ù
¿¿   Å Ñ ÖÓ× ÔÙ Ð Ó×      DynLhashTable<Key, Record> ¿¿ ≡        ´ ¿¾ µ ¿¿
       Record * insert(const Key & key, const Record & record)
       {
         DLBucket * bucket = new DLBucket (key, record);
         LhashTable<Key>::insert(bucket);
         return &bucket->record;
       }
     Í× × DLBucket ¿¾     Ò   LhashTable   ¼ º
     Ð Ó Ó × Ð Ò Ð ÔÓÖÕÙ Ð ×ØÖ Ø Ý ×Ø ÑÔÐ ÒØ               Ò LhashTable<Key>º
       Ä Ù×ÕÙ × Ö Ñ Ø ÙÒ ÛÖ ÔÔ Ö Ð Ù×ÕÙ                   LhashTable<Key>
¿¿   Å Ñ ÖÓ× ÔÙ Ð Ó× DynLhashTable<Key, Record> ¿¿       +≡     ´ ¿¾ µ ¿¿ ¿¿
       Record * search(const Key & key)
       {
         DLBucket * bucket = static_cast<DLBucket*>(LhashTable<Key>::search(key));
         return bucket != NULL ? &bucket->record : NULL;
       }
     Í× × DLBucket ¿¾     Ò   LhashTable   ¼ º

      Ä Ð Ñ Ò ÓÒ Ö ÕÙ Ö ØÖ Ò× ÓÖÑ Ö ÙÒ Ö ×ØÖÓ ÙÒ Ù Ø
¿¿   Å Ñ ÖÓ× ÔÖ Ú Ó× DynLhashTable<Key, Record> ¿¾ +≡              ´ ¿¾ µ    ¿¾
       static DLBucket * record_to_bucket(Record * rec)
       {
         DLBucket * ret_val = 0;
         size_t offset = reinterpret_cast<size_t>(&ret_val->record);
         return reinterpret_cast<DLBucket*>(reinterpret_cast<size_t>(rec) - offset);
       }
     Í× × DLBucket ¿¾ º
     ÓÒ ×Ø Ñ ØÓ Ó¸ Ð Ð Ñ Ò ÓÒ Ø Ñ Ò × ÑÙÝ × ÑÔÐ
¿¿   Å Ñ ÖÓ× ÔÙ Ð Ó× DynLhashTable<Key, Record> ¿¿       +≡       ´ ¿¾ µ     ¿¿
       void remove(Record * record)
       {
         DLBucket* bucket = record_to_bucket(record);
         LhashTable<Key>::remove(bucket);
         delete bucket;
       }
     Í× × DLBucket ¿¾     Ò   LhashTable   ¼ º
        Ä      Ð   ÓÒ × ÒרÖÙÑ ÒØ Ð Ì DynLhashTable<Key,            Record>       Ò   ¸ ÙÒ
     Ú Þ Ñ ×¸ Ð ÓÒ     Ð ÔÖ Ò Ô Ó ¬Ò¹ ¹¬Ò ´Ü ½º º¾ ´Ô Ò ¾¾µµº

     5.1.7   Tablas hash lineales
     ÍÒ ÓÒ ÓÒ ×Ó Ö Ð Ù Ð × ×Ùר ÒØ Ò Ð × ÔÖ         ÓÒ ×   × ÑÔ ÒÓ ÕÙ ÒÓ× Ó Ö Ò
     Ð × Ú Ö× × ×ØÖ Ø × Ô Ö ØÖ Ø Ö ÓÒ Ð × ÓÐ × ÓÒ × × ÕÙ Ð ØÓÖ     Ö α ÒÓ Ü
       Ð ÙÑ Ö Ð Ô Ö Ð Ù Ð × ÙÑÔÐ Ð ÔÖ     ÓÒº Ù ÒØÓ Ñ ÝÓÖ × Ð Ö ¸ Ò Ô Ò Ò¹
     Ø Ñ ÒØ Ð ×ØÖ Ø Ô Ö ØÖ Ø Ö ÓÒ Ð × ÓÐ × ÓÒ ×¸ Ñ ÝÓÖ × Ö Ð ÔÖÓ Ð           ÕÙ
     ×     Ö      Ð × ÑÔ ÒÓº
434                                                     Cap´
                                                               ıtulo 5. Tablas hash



        Ë ÑÓ× ÕÙ Ð ØÓÖ          Ö α ÔÙ      ×Ñ ÒÙ Ö× × Ö Ùר ÑÓ× Ð Ø Ð ÙÒ Ñ ÝÓÖ
    Ú ÐÓÖ M Ý Ö Ù ÑÓ× Ð × Ù Ø ×º È ÖÓ¸ ÓÑÓ Ý ÐÓ × ÑÓ׸ ר Ö Ùר Ø Ò ÙÒ
    ÔÖ Ó O(M)+O(M )º Ä ×ØÖÙ ØÙÖ ÕÙ ØÖ Ø Ö ÑÓ× Ò ×Ø ×Ù ¹× ÓÒ Ø Ò Ð Ù ×Ø ÓÒ
     ÔÙ Ö× ÙÑ ÒØ Ó Ð ÖÖ ÐÓ Ò Ñ Ñ ÒØ ÁÒØÙ Ø Ú Ñ ÒØ ¸                ÑÓ× × Ö ÕÙ ×ØÓ
     × ÔÓ× Ð × Ù× ÑÓ× ÙÒ ÖÖ ÐÓ Ò Ñ Ó Ð Ø ÔÓ ×ØÙ Ó Ò Ü ¾º½º ´Ô Ò ½µº ÈÓÖ
     ר Ð Ó¸ ÒÓ Ø Ò ÑÓ× Óר × ÑÔÓÖØ ÒØ × ¹Ñ ÝÓÖ × ÕÙ O(1)¹ ÕÙ Ô Ö ÔÓÖ Ð       Ó
    Ö ÐÓ Ð Þ Ö Ð Ø Ð º Ð ×ÙÒØÓ × Ö Ð     Ò ÓÒØÖ Ö ÙÒ Ñ Ò Ö      Ñ Ö Ò Ñ Ñ ÒØ
     Ð Ú ÐÓÖ Mº
           Ð Ò ÓÕÙ    Ø Ð × ÕÙ ×ØÙ Ö ÑÓ× ÒרÖÙÑ ÒØ Ö ÑÓ× Ò ×Ø ×Ù ¹× ÓÒ¸
     Ù Ð Ö Ð Þ Ð ×Ø ÓÒ     ÒÑ        M¸ × Ð   ÒÓÑ Ò ×Ô Ö× ÓÒ Ð Ò Ð ´Ð Ò Ö × Ò µº
    Ä Ø Ò Ù × Ù ÖØ ÔÓÖ Ú Þ ÔÖ Ñ Ö Ô Ö ÐÑ Ò Ñ ÒØÓ × ÙÒ Ö Ó ¾ Ý ×Ø
    ÔÖ × ÒØ ÓÒ ×Ø ×         Ò Ð Ä Ö×ÓÒ ¾¾ º
           Ð Ò ÓÕÙ ÙØ Ð Þ ÙÒ ÖÖ ÐÓ Ò Ñ Ó DynArray<T>º           Ð Ú ÐÓÖ    M Ú Ö
      Ò Ñ Ñ ÒØ Ò ÙÒ ÓÒ αº              ר ÑÓ Ó Ð × ÔÖ      ÓÒ ×     × ÑÔ ÒÓ × ÑÔÖ
    × ÙÑÔÐ Ò × Ò Ò ×           Ô Ö ÔÓÖ Ð Ö Ùר º
        Ä Ø Ð × Ð Ò Ð ×Ø ÑÔÐ ÒØ Ñ ÒØ Ð Ø ÔÓ LinearHashTable<Key> ¸ Ð Ù Ð
    × ×Ô ¬ Ò Ð Ö ÚÓ ØÔÐ Ð ÒÀ × ºÀ ¿ ¸ ÙÝ ×Ô ¬ ÓÒ                    × × Ð × Ù ÒØ
¿    ØÔÐ Ð ÒÀ × ºÀ ¿ ≡
          template <typename Key,
                    template <class> class BucketType,
                    class Cmp = Aleph::equal_to<Key> >
      class GenLinearHashTable
      {
         Å Ñ ÖÓ× ÔÖ Ú Ó× LinearHashTable<Key> ¿
         Å Ñ ÖÓ× ÔÙ Ð Ó× LinearHashTable<Key> ¿
      };
          template <typename Key, class Cmp = Aleph::equal_to<Key> >
      class LinearHashTable : public GenLinearHashTable<Key, LhashBucket, Cmp>
      {
        // ...
      };
        template <typename Key, class Cmp = Aleph::equal_to<Key> >
      class LinearHashTableVtl : public GenLinearHashTable<Key, LhashBucketVtl, Cmp>
      {
        // ...
      };
    Í× × LhashBucket ¼ º
       GenLinearHashTable<Key, BucketType × Ð Ø ÔÓ Ò Ö Ó ÕÙ ÑÔÐ ÒØ Ð Ø Ð    ×
    ÐÒ  и Ñ ÒØÖ × ÕÙ LinearHashTable<Key, Cmp> Ý LinearHashTableVtl<Key, Cmp>
    ×ÓÒ ÐÓ× Ø ÔÓ× ÜÔÓÖØ Ó× Ô Ö Ð Ù×Ó ÕÙ Ñ Ò Ò Ù Ø × × Ò Ý ÓÒ ×ØÖÙ ØÓÖ Ú ÖØÙ Ðº
       Ä × ×ØÖÙ ØÙÖ ×      Ð × Ù Ø × ×ÓÒ Ü Ø Ñ ÒØ Ð × Ñ ×Ñ × ÕÙ Ð × Ð Ø ÔÓ
    LhashTable<Key> ×ØÙ       Ó Ò Ü º½º¿º½ ´Ô Ò ¼¿µº
    5.1.7.1   Expansi´n/contracci´n de una tabla hash lineal
                     o           o

    Ë Ò Ó table[] ÙÒ ÖÖ ÐÓ Ò Ñ Ó¸ ×Ù Ñ Ò× ÓÒ × ÙÑ ÒØ Ý × ÓÒØÖ            Ò Ñ Ñ ÒØ
     Ò Ø ÑÔÓ O(1)º È Ö ÐÐÓ¸ × Ñ Ò Ò ÐÓ× × Ù ÒØ × ØÖ ÙØÓ× ÙÑ Ö Ð ×
¿    Å Ñ ÖÓ× ÔÖ Ú Ó× LinearHashTable<Key> ¿ ≡            ´¿ µ ¿
5.1. Manejo de colisiones                                                                                               435



         float upper_alpha; // factor de carga superior
         float lower_alpha; // factor de carga inferior
           LinearHashTable<Key>    Ñ ÒØ Ò Ô ÖÑ Ò ÒØ Ñ ÒØ Ð ØÓÖ          Ö α = N/Mº
          ×ÔÙ × ÙÒ Ò× Ö ÓÒ¸ α ×     ÓÑÔ Ö ÓÒ upper alpha × α ≥ ÙÔÔ Ö ÐÔ ¸ ÒØÓÒ × Ð
        Ø Ð × ÜÔ Ò Ø ÒØ × ÙÒ        × ÓÑÓ × Ò × Ö Ó Ô Ö ÐÐ Ú Ö Ð Ö ÙÒ Ú ÐÓÖ Ò Ö ÓÖ
           ÙÔÔ Ö ÐÔ     ÙÖ ÒØ ר ÔÖÓ ×Ó¸ Ð ÙÒ × Ù Ø × ×ÓÒ Ö Ù     ׺ Ë Ñ ØÖ Ñ ÒØ ¸ ×
        ÐÙ Ó ÙÒ Ð Ñ Ò ÓÒ α ≤ ÐÓÛ Ö ÐÔ ¸ ÒØÓÒ × Ð Ø Ð × ÓÒØÖ ÙÒ Ó Ñ × Ú ×
           ר ÕÙ Ð Ö ×Ø ÔÓÖ         Ó ÐÓÛ Ö ÐÔ     Ù ÐÑ ÒØ ¸ Ð ÙÒ × Ù Ø × × Ö Ù Òº
          Ð ØÖÙ Ó Ð ×Ô Ö× ÓÒ Ð Ò Ð ×ØÖ ¸ Ô٠׸ Ò Ð Ñ Ò Ö Ò ÕÙ Ð Ò ÐÑ ÒØ × ÜÔ Ò
        Ý ÓÒØÖ Ð Ø Ð ¸ × ÓÑÓ Ò Ð ÓÖÑ Ò ÕÙ × Ñ Ò Ð ÙÒ ÓÒ × º
            ÄÓ× Ú ÐÓÖ × Ò Ð × upper alpha Ý lower alpha × ×Ô ¬ Ò ÙÖ ÒØ Ð ÓÒ¹
        רÖÙ ÓÒ ÙÒ Ó ØÓ LinearHashTable<Key> ¸ Ð Ù Ð ÜÔÓÖØ ÑÓ ¬ ÓÖ × ÕÙ Ô Ö¹
        Ñ Ø Ò Ùר Ö Ò Ñ Ñ ÒØ ÐÓ× Ú ÐÓÖ × ÙÑ Ö Ð ×       Ö º
              Ð ×Ø Ó ÜÔ Ò× ÓÒ Ó ÓÒØÖ ÓÒ Ð Ø Ð ¸ × Ñ ÒØ Ò Ñ ÒØ ÐÓ× × Ù ÒØ ×
          Ó× ØÖ ÙØÓ×
¿        Å Ñ ÖÓ× ÔÖ Ú Ó× LinearHashTable<Key> ¿ +≡ ´ ¿ µ ¿ ¿
         size_t p; // ındice de la lista que se particiona (o aumenta)
                      ´
         size_t l; // cantidad de veces que se ha duplicado la tabla
             Ð ÖÖ ÐÓ × ÑÔÖ Ö Ó Ö ÔÓÖ ×Ù ÜØÖ ÑÓ Ö Óº Ð Ò                                                   p   × Ö ÖÒ
         Ó× Ñ Ò Ö ×
          ½º table[p + M] × Ð ÒØÖ      Ð ÖÖ ÐÓ ÔÓÖ ÓÒ ×Ø × ÜÔ Ò                                            Ó ÓÒØÖ ¸ × ÙÒ
              × Ð ÓÔ Ö ÓÒ Ý Ð Ú ÐÓÖ Ð ØÓÖ         Ö αº
          ¾º table[p] ÓÒØ Ò Ð Ð ×Ø      ÓÐ × ÓÒ × ÕÙ × Ô ÖØ ÓÒ Ö ×                                        Ó ÙÖÖ × ÙÒ Ü¹
              Ô Ò× ÓÒº Ù Ò Ó Ó ÙÖÖ ÙÒ ÜÔ Ò× ÓÒ¸ Ð ÙÒ × Ù Ø × Ð                                            Ð ×Ø table[p] ×
              Ô × Ò Ð Ð ×Ø table[M + p]º Ë Ñ ØÖ Ñ ÒØ ¸ Ù Ò Ó Ó ÙÖÖ                                          ÙÒ ÓÒØÖ ÓÒ¸
              ØÓ × Ð × Ù Ø × table[M + p] × ØÖ ×Ð Ò table[p]º
                Ù Ò Ó × ÜÔ Ò × Ò Ö Ñ ÒØ Ð Ò p × Ñ ØÖ Ñ ÒØ ¸ ×                                                 Ö Ñ ÒØ Ù Ò Ó
              × ÓÒØÖ º
                                           M                                 M
                                0    1     2 3        4       5     0    1   2 3     4       5   6
                                p                                        p
                                    ´ µ ר Ó Ò            Ð       ´ µ ÄÙ Ó       Ð   ÔÖ Ñ Ö          ܹ
                                                                  Ô Ò× ÓÒ
                       M                       M                                         M
             0   1     2 3      4    5     6   7 8            9     0    1   2   3   4       5   6    7       8   9       10
                                p                                    p

                     ´ µ ÄÙ Ó            ÜÔ Ò× ÓÒ ×               ´ µ ÄÙ Ó       ÜÔ Ò× ÓÒ × ´ Ð Ú ÐÓÖ             M   ×        Ù¹
                                                                  ÔÐ µ

                         ÙÖ º¿ ÈÖÓ ×Ó                     ÜÔ Ò× ÓÒ ÐÓ            Ð Ø Ð ÔÖ            M=5

            È Ö ÔÓ Ö Ð ÙÐ Ö Ð ØÓÖ      Ö ¸     ÑÓ× ÓÒÓ Ö Ò ØÓ Ó ÑÓÑ ÒØÓ Ð Ø Ñ ÒÓ
            ÐÓ Ó ØÙ Ð Ð Ø Ð ´M µ ר Ú ÐÓÖ ÐÓ Ñ ÒØ Ò Ö ÑÓ× Ò Ð × Ù ÒØ ØÖ ÙØÓ
    ¿        Å Ñ ÖÓ× ÔÖ Ú Ó× LinearHashTable<Key> ¿ +≡ ´ ¿ µ ¿ ¿
              size_t MP; // guarda el valor p + M
436                                                        Cap´
                                                                      ıtulo 5. Tablas hash



                Ò Ò ÙÖ ¸ ר ØÖ ÙØÓ ÒÓ× ÔÓÒ           Ö Ø ×ÔÓ× ÓÒ Ð Ð ÙÐÓ p + Mº
                Ù Ò Ó p = 2M¸ Ð Ø Ñ ÒÓ ÐÓ Ó Ð Ø Ð × ÙÔÐ Ý × Ö Ò Ò M = 2M¸
              p = 0 Ý MP = Mº Ò ØÓ Ó ÑÓÑ ÒØÓ 0 ≤ p ≤ 2lM − 1º Ä ÙÒ ÓÒ Ð ØÖ ÙØÓ l
               ׸ ÒØÓÒ ×¸ ÓØ Ö Ð ÓÒØÖ ÓÒ Ð Ú ÐÓÖ ÓÖ Ò Ð M ÕÙ Ý × Ó ×Ô ¬ Ó
               Ò ÓÒרÖÙ ÓÒº
                Ò       ÜÔ Ò× ÓÒ» ÓÒØÖ ÓÒ Ý ÕÙ ×Ø Ö Ô Ò ÒØ Ð ÔÖ        Ó p == 2Mº È Ö
                 Ò Ö ÙÒ ÔÓ Ó Ø ÑÔÓ       Ð ÙÐÓ¸ Ð ÔÖÓ Ù ØÓ 2M × Ù Ö Ò Ð ØÖ ÙØÓ ÅÅ =
              2M
    ¿         Å Ñ ÖÓ× ÔÖ Ú Ó×     LinearHashTable<Key>    ¿   +≡      ´¿ µ   ¿    ¿
               size_t MM; // producto 2*M

         Ð ÔÖÓ ×Ó ÜÔ Ò× ÓÒ × ÐÙ×ØÖ Ò Ð ¬ ÙÖ º¿ Ô Ö M = 5º
             Ò Ú ÖØÙ     ÐÓ ÜÔÐ Ó¸ Ð ÑÓÑ ÒØÓ   ÜÔ Ò Ö Ð Ø Ð ÐÓ× Ú ÐÓÖ ×           p¸ l¸ M],
        [[MP Ý MM ×    ØÙ Ð Þ Ò Ð × Ù ÒØ Ñ Ò Ö
¿          ØÙ Ð Þ Ö ×Ø Ó ÜÔ Ò× ÓÒ ¿ ≡                            ´¿ µ
         ++p;
         ++MP;
         if (p == M) // (p == 2*M) ¿debe duplicarse el tama~o de la tabla?
                                                           n
           {     // s´ ==> modificar el tama~o de la tabla a 2*M
                     ı                      n
             ++l;   // Cantidad de veces que se ha duplicado la tabla
             p = 0;
             MP = M = MM; // se les asigna 2*M
             MM = multiply_by_two(MM);
           }
          Ë Ñ ØÖ Ñ ÒØ ¸ Ð ÓÒØÖ ÓÒ Ð Ø Ð × Ð ÔÖÓ ×Ó ÒÚ Ö×Ó
¿         ØÙ Ð Þ Ö ×Ø Ó ÓÒØÖ ÓÒ ¿ ≡                                      ´¿ µ
         if (p == 0) // ¿debe dividirse entre 2 el tama~o de la tabla?
                                                       n
           {     // s´ ==> actualizar tama~o de la tabla a M/2
                     ı                     n
             --l; // Cantidad de veces que se ha duplicado la tabla disminuye
             MM = M; // se divide entre dos
             M = divide_by_two(M);
             p = M - 1;
           }
         else
           --p;   // no ==> s´lo reducir ındice p
                             o           ´
         --MP;
           Ð Ò ÓÕÙ Ò Ñ Ó     ÜÔ Ò× ÓÒ» ÓÒØÖ ÓÒ ÔÐ ÒØ ÙÒ ÔÖÓ Ð Ñ ÓÒ Ð Ø ÖÑ ¹
        Ò ÓÒ Ð Ò     Ò Ð Ø Ð Ý Ð Ú ÐÓÖ ÕÙ ÖÖÓ Ð ÙÒ ÓÒ × º         ÙÒ Ð Ú k¸
        ØÖ ÓÒ ÐÑ ÒØ Ð Ò    Ò Ð Ø Ð × Ø ÖÑ Ò Ñ ÒØ
                                        h(k)   ÑÓ   M ;

        Ô ÖÓ ×Ø Ú ÐÓÖ Ö Ð Ö Ò Ó ÒØÖ × [0, M − 1] Ý    ÔÓÖ Ù Ö Ð Ö Ò Ó ÒØÖ ×
          ÜÔ Ò × [M, M + p]º Ð ÔÖÓ Ð Ñ × Ö ×Ù ÐÚ Ñ ÒØ Ð Ú ÐÓÖ p Ý ÑÓ ¬ Ò Ó Ð
        ÐÐ Ñ     Ð ÙÒ ÓÒ ×      Ð × Ù ÒØ Ñ Ò Ö
¿        Å Ñ ÖÓ× ÔÖ Ú Ó× LinearHashTable<Key> ¿ +≡ ´ ¿ µ ¿ ¿
         size_t call_hash_fct(const Key & key) const
5.1. Manejo de colisiones                                                                                   437



      {
          const size_t hash = (*hash_fct)(key);
          const size_t i = hash % M;
          return i < p ? hash % MM : i;
      }
      ¬Ò ×
      call hash fct¸   Ù×     Ò ÙÒ × ¿        Ò    ¼º
     Ê ÓÖ ÑÓ× ÕÙ p × Ð Ò  Ð Ð ×Ø                           ÜÔ Ò× ÓÒ» ÓÒØÖ              ÓÒº Ò Ð Ö Ò Ó [0, M − 1]
    Ð Ø Ð ÓÒØ Ò Ù Ø × × Ò × ÔÓÖ
                                         (¶    ×   Ø)( Ý) ÑÓ         M    ;                                   ´ º¿¼µ
    Ñ ÒØÖ × ÕÙ Ò Ð Ö Ò Ó [M, M + p] Ð × Ù Ø × × × Ò Ò ÔÓÖ
                                         (¶   ×    Ø)( Ý) ÑÓ         2M       .                               ´ º¿½µ
     Ù Ò Ó p = 2M¸ ÒØÓÒ × ØÓ Ó Ð Ö Ò Ó [0, 2M − 1] ÔÙ                         × Ö Ù ÖØÓ ÓÒ Ð ÑÓ ÙÐÓ
    2Mº
         Ù Ò Ó Ó ÙÖÖ ÙÒ ÜÔ Ò× ÓÒ × Ô ÖØ ÓÒ Ð Ð ×Ø          ÓÐ × ÓÒ × ÙÝÓ Ò      ÒÐ
    Ø Ð × pº Ä Ð ×Ø Ð Ð ×Ø       ÓÐ × ÓÒ × table[p] × Ö ÓÖÖ ÒØ Ö Ñ ÒØ Ý × ÒÚÓ
    call hash fct() Ô Ö       Ð Ú º ÕÙ ÐÐ × Ð Ú × ÙÝÓ Ò       × Ð Ñ ×ÑÓ ×Ù ÒØÖ
    p Ô ÖÑ Ò Ò Ò Ð Ð ×Ø ¸ Ñ ÒØÖ × ÕÙ ÕÙ ÐÐ × ÙÝÓ Ò        × ×Ø ÒØÓ M + p ×ÓÒ ÑÓÚ ×
          table[M + p]º Ä ¬ ÙÖ º ÐÙ×ØÖ ÐÓ× ×Ø Ó× ÒØ × Ý ×ÔÙ ×         ÙÒ ÜÔ Ò× ÓÒº
                                                                                   0              70     10

           0            70          10                                             1          206                      11

     p=11              206         266        11    1676        86     p=2 2
                                                                       M=5
    M=5 2                                                                  3                      13     77

           3            13          77                                             4              99     94            14

           4            99          94        14                                   5          435        15            35

           5           435          15        35                                   6           266       1676          86

           6                                                                       7

                     ´ µ ÒØ ×        ÜÔ Ò Ö table[2]                              ´ µ table[2] ÜÔ Ò           table[6]

                             ÙÖ º         ÑÔÐÓ     Ô ÖØ ÓÒ» ÓÒØÖ          ÓÒ            ÙÒ Ð ×Ø
          Ð ÔÖÓ ×Ó          Ô ÖØ ÓÒ       ÙÒ ÒØÖ           × Ö ØÓ ÔÙ              ÒרÖÙÑ ÒØ Ö×         Ð × Ù ÒØ
     ÓÖÑ
¿    È ÖØ ÓÒ Ö Ð ×Ø          ¿ ≡                                                            ´¿ µ
      BucketList * src_list_ptr = table.test(p);
      if (src_list_ptr != NULL) // ¿table[p] est´ escrita?
                                                a
        if (not src_list_ptr->is_empty()) // ¿table[p] no est´ vac´a’
                                                             a    ı
          {
            BucketList * tgt_list_ptr = NULL;
438                                                          Cap´
                                                                    ıtulo 5. Tablas hash



                     // recorrer lista colisiones y mover cubetas de table[p+M]
                 for (BucketItor it(*src_list_ptr); it.has_current(); /* nada */)
                   {
                     Bucket * bucket = static_cast<Bucket*>(it.get_current());
                     it.next(); // avance al siguiente elemento de la lista
                     const Key & key = bucket->get_key();
                     const int i = (*hash_fct)(key) % MM;
                     if (i == p) // ¿pertenece esta clave a table[p]?
                       continue; // s´ ==> clave sigue en table[p] ==> procese siguiente
                                     ı
                     if (tgt_list_ptr == NULL)
                       tgt_list_ptr = &table.touch(MP);
                         // bucket no pertenece a table[p] sino a table[p+m] ==>
                         // eliminar bucket de table[i] e insertarlo en table[p+m]
                     bucket->del();
                     tgt_list_ptr->append(bucket);
                   }
                 if (src_list_ptr->is_empty()) // ¿table[p] qued´ vac´a?
                                                                o    ı
                   --busy_slots_counter; // s´ ==> un slot vac´o
                                             ı                ı
                 ++busy_slots_counter; // uno nuevo por table[p+M]
             }
     Ð ÐÓÕÙ ÓÒ× Ö Ð ÔÓ× Ð           ÕÙ Ð Ð ×Ø table[p] ר Ú Ó¸ Ò ÐÙ× Ú ¸ ÕÙ
      Ñ × Ý × ÓÖ Ö Ò       º Ð Ñ ×ÑÓ ÑÓ Ó¸ × Ò Ò ÙÒÓ ÐÓ× Ð Ñ ÒØÓ× table[p]
    Ô × table[MP]¸ ÒØÓÒ × × ÔÓ× Ð ÕÙ Ð ÒØÖ table[MP] ÒÓ Ó ÙÔ Ñ ÑÓÖ º
        ÒØ Ò × ´× ÔÖ ×ÙÑ µ Ð × Ú × ØÙ × Ð ÜÔ Ò× ÓÒ¸ ÔÓ ÑÓ× × Ö Ö ÙÒ ÖÙØ Ò
    ÕÙ Ð Ö Ð Ý ÕÙ × ÒÚÓ             Ú Þ ÕÙ Ó ÙÖÖ ÙÒ Ò× Ö ÓÒ
¿    Å Ñ ÖÓ× ÔÖ Ú Ó× LinearHashTable<Key> ¿ +≡ ´ ¿ µ ¿ ¿
     void expand()
     {      // expandir la tabla hasta que la carga est´ debajo de upper_alpha
                                                       e
       for (float alpha = 1.0*N/MP; alpha >= upper_alpha; alpha = 1.0*N/MP)
         {
                 È ÖØ ÓÒ Ö Ð ×Ø ¿
                   ØÙ Ð Þ Ö ×Ø Ó ÜÔ Ò× ÓÒ ¿
             }
     }
      ¬Ò ×
     expand¸     Ù×   Ò ÙÒ × ¼ Ò        º
     ÆÓØ ÑÓ× ÕÙ Ð ÜÔ Ò× ÓÒ ×ÓÐÓ ×      ÐÙ Ö × × Ü        Ð ØÓÖ         Ö º
         Ð ÔÖÓ ×Ó ÓÒØÖ ÓÒ ÔÙ ÒØ ÖÔÖ Ø Ö× Ð ÒÚ Ö× Ð ÜÔ Ò× ÓÒ Ô × Ö ÐÓ×
     Ð Ñ ÒØÓ× Ð Ð ×Ø table[M + p]        Ð Ð ×Ø table[p] Ø Ñ Ò × ÐÙ×ØÖ Ò Ð ¬ ÙÖ
     º × × ÒØ ÖÔÖ Ø      Ö        ÞÕÙ Ö º Ò ×Ø ×Ó¸ Ð ÔÖÓ ×Ó ¹ ÓÒØÖ ÓÒ¹ ×
    ÑÙ Ó Ñ × Ö Ô Ó¸ ÔÙ × ÒÓ × Ò × Ö Ó Ö ÓÖÖ Ö Ò Ò ÙÒ       Ð × Ð ×Ø ׸ ×ÓÐÓ ÓÒ Ø Ò ÖÐ
    table[M + p] table[p]¸ Ð Ù Ð Ð Ö Ð Þ       Ö Ø Ý ÓÒר ÒØ Ñ ÒØ ÙÒ ÓÔ Ö ÓÒ Ð
    Ì Dlink ´Ü ¾º º ´Ô Ò µµ
¿     Ù× ÓÒ Ö Ð ×Ø ¿ ≡                                              ´¿ µ
     if (MP < table.size()) // ¿Existe table[MP]]?
       {
         BucketList * src_list_ptr = table.test(MP);
         if (src_list_ptr != NULL) // ¿existe entrada para table[p+M]?
           {
5.1. Manejo de colisiones                                                           439



                      if (not src_list_ptr->is_empty()) // ¿est´ vac´a table[p+M]?
                                                               a    ı
                        {     // no ==> fusionar las listas
                          BucketList & tgt_list = table.touch(p); // asegura table[p]
                          tgt_list.concat_list(src_list_ptr);
                          --busy_slots_counter; // table[p+M] devino vac´a
                                                                        ı
                        }
                      table.cut(MP); // eventualmente liberar memoria de table[p+M]
                  }
          }
       Ä ÖÙØ Ò     ÓÒØÖ ÓÒ¸ Ù Ð × ÒÚÓ ÓÒ                      Ð Ñ Ò ÓÒ¸ ×    ¬Ò ¸ ÒØÓÒ ×¸
    Ð × Ù ÒØ ÓÖÑ
¿    Å Ñ ÖÓ× ÔÖ Ú Ó× LinearHashTable<Key> ¿                +≡        ´¿ µ    ¿
      void contract()
      {      // contraer la tabla hasta que la carga est´ por debajo de lower_alpha
                                                        e
        for (float alpha = (1.0*N)/MP; alpha <= lower_alpha and MP > len;
             alpha = (1.0*N)/MP)
          {
                       ØÙ Ð Þ Ö ×Ø Ó     ÓÒØÖ   ÓÒ ¿
                      Ù× ÓÒ Ö Ð ×Ø ¿
              }
      }
      ¬Ò ×
      contract¸       Ù×   Ò ÙÒ    ¼ º
        ÄÓ ÒÓÚ Ó×Ó ÙÒ Ø Ð × Ð Ò Ð × Ð ÔÖÓ ×Ó ÜÔ Ò× ÓÒ» ÓÒØÖ ÓÒº Ö ×ØÓ¸
     רÖÙ ØÙÖ ÐÑ ÒØ ¸ Ð × ÓÔ Ö ÓÒ × ×ÓÒ ÒØ × Ð × Ð Ö ×ØÓ ÐÓ× Ò ÓÕÙ × ×ØÙ Ó׺
    5.1.7.2           B´ squeda en LinearHashTable<Key>
                       u

    Ä Ù×ÕÙ ¸ ÓÑÓ × ØÖ ÓÒ ÙÒ Ø Ð × ¸ × Ð ÓÔ Ö ÓÒ Ñ × × ÑÔÐ
¿    Å Ñ ÖÓ× ÔÙ Ð Ó× LinearHashTable<Key> ¿ ≡ ´¿ µ ¼
      Bucket * search(const Key & key)
      {
        const int i = call_hash_fct(key);
        BucketList * list = table.test(i);
        if (list == NULL) // ¿Ha sido escrita alguna vez table[i]?
          return NULL; // No ==> el elemento no se encuentra en la tabla
        if (list->is_empty())
          return NULL;
            // buscar key en la lista de cubetas
        for (BucketItor it(*list); it.has_current(); it.next())
          {
            Bucket * bucket = static_cast<Bucket*>(it.get_current());
            if (Cmp() (key, bucket->get_key()))
              return bucket;
          }
        return NULL;
      }

    Í× × call hash fct ¿ º
440                                                        Cap´
                                                                  ıtulo 5. Tablas hash



    Ä Ò ÙÖ          ר Ù×ÕÙ Ö ×Ô ØÓ ÐÓ× ÓØÖÓ× Ø ÔÓ× Ø Ð × × Ð       Ó
    ÕÙ ¸ ÔÙ ×ØÓ ÕÙ Ð ÖÖ ÐÓ Ò Ñ Ó Ô ÖØ Ñ ÑÓÖ Ò ÙÒ ÓÒ Ð ÔÖ Ñ Ö × Ö ØÙÖ ¸ ×
    ÔÖÓ Ð ÕÙ Ý Ò ÒØÖ × ÕÙ ÒÓ Ý Ò × Ó Ô ÖØ ׺
    5.1.7.3   Inserci´n en LinearHashTable<Key>
                     o
¼   Å Ñ ÖÓ× ÔÙ Ð Ó×      LinearHashTable<Key> ¿ +≡         ´¿ µ ¿       ¼
      Bucket* insert(Bucket * bucket)
      {
        const int i       = call_hash_fct(bucket->get_key());
        BucketList & list = table.touch(i); // asegura memoria para table[i]
        if (list.is_empty())
          ++busy_slots_counter;
        list.append(bucket);
        ++N;
        expand();
        return bucket;
      }
    Í× × call hash fct ¿   Ò   expand   ¿ º

    5.1.7.4   Eliminaci´n en LinearHashTable<Key>
                       o
¼   Å Ñ ÖÓ× ÔÙ Ð Ó×      LinearHashTable<Key> ¿ +≡            ´¿ µ       ¼
      Bucket * remove(Bucket * bucket)
      {
        Bucket * next = static_cast<Bucket*>(bucket->get_next());
        bucket->del(); // elimine de lista de colisiones
        if (next->is_empty()) // ¿lista de colisiones qued´ vac´a?
                                                          o    ı
          --busy_slots_counter; // s´ ==> un slot vac´o
                                    ı                ı
        --N;
        contract();
        return bucket;
      }
    Í× × contract ¿ º

    5.1.7.5   An´lisis de la dispersi´n lineal
                a                    o

     ÒØ × ÒÙÒ Ö Ð ÔÖÓÔÓ× ÓÒ ÙÒ Ñ ÒØ и × Ñ Ò ×Ø Ö ÒÓØ Ö ÕÙ ¸ × ÐÚÓ Ð × ÜÔ Ò× ÓÒ ×
    Ý ÓÒØÖ ÓÒ ×¸ ÙÒ Ø Ð × Ð Ò Ð × × Ñ Ð Ö ÙÒ Ø Ð × ØÖ ÓÒ Ð ÓÒ Ö ×ÓÐÙ ÓÒ
       ÓÐ × ÓÒ × ÔÓÖ Ò Ò Ñ ÒØÓ × Ô Ö Óº ÓÑÓ Ø Ð¸ ÒÓ ÒÓ×    × Ö ÜØÖ ÒÓ Ò Ð Þ Ö Ð
     ×Ô Ö× ÓÒ Ð Ò Ð Ô ÖØ Ö Ð Ò Ð × × Ö Ð Þ Ó ÓÒ Ð Ò Ò Ñ ÒØÓ × Ô Ö Óº
    Proposici´n 5.3 (Larson 1988 [22]) Cantidad de cubetas revisadas en una
             o
    b´ squeda sobre una tabla hash lineal
      u
        Ë h(k) : K −→ [0, M − 1] ÙÒ ÙÒ ÓÒ × O(1) ÕÙ ×ØÖ ÙÝ ÙÒ ÓÖÑ Ñ ÒØ ÐÓ×
     Ð Ñ ÒØÓ× K         [0, M − 1]º Ë T ÙÒ Ø Ð  × Ð Ò Ð ÐÓÒ ØÙ M ÓÒ N Ð ¹
    Ñ ÒØÓ׺ ÒØÓÒ ×¸ Ð ÔÖÓÑ Ó              Ù Ø × ÕÙ × Ú × Ø Ò Ò ÙÒ Ù×ÕÙ       ÐÐ   ×
                                        α ≤ UN ≤
                                                    9
                                                   16
                                                      +α   ;                      ´ º¿¾µ
5.1. Manejo de colisiones                                                                                    441



Ý Ð ÔÖÓÑ Ó Ô Ö ÙÒ Ù×ÕÙ                            Ü ØÓ× ×
                                1+
                                        1
                                          +
                                        M α
                                            1
                                              ≤ SN ≤ 1 +
                                                         1  9
                                                           + α
                                                         M 16
                                                                                       .                   ´ º¿¿µ
Demostraci´n
          o      Ë l Ð ÐÓÒ ØÙ         ÙÒ Ð × Ð ×Ø × ÓÐ × ÓÒ × Ò Ð Ò                                     Ò Ñ ÒØÓ
× Ô Ö Óº Ë ÙÒ Ð Ð Ñ º½ ´ Ù ÓÒ ´ º µ¸ Ô º ¼ µ¸ l = N/Mº
   ÄÓ× Ð Ñ × º¾ ´ Ù ÓÒ ´ º µ¸ Ô º ¼ µ Ý º¿ ´ Ù ÓÒ ´ º µ¸ Ô º ¼ µ¸ ÕÙ ×ØÙ ÑÓ×
 ÓÒ Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó¸ ÔÐ ÒØ Ò ÐÓ× ÔÖÓÑ Ó× Ù Ò Ó ÒÓ Ó ÙÖÖ Ò ÜÔ Ò× ÓÒ ×
Ó ÓÒØÖ ÓÒ ×º Ò ×Ø × ÒØ Ó¸ ×ÙÑ Ò Ó ÙÒ ØÓÖ                Ö y¸ ÔÓ ÑÓ× ¬Ò Ö Ð ×
× Ù ÒØ × ÙÒ ÓÒ ×
                                  u(y) = y ;                            ´ º¿ µ
Ô Ö Ð ÔÖÓÑ Ó Ù Ø × ÕÙ × Ò×Ô ÓÒ Ò ÙÒ Ù×ÕÙ Ò ÖÙ ØÙÓ× Ý
                                             s(y) = 1 +
                                                             1
                                                               +
                                                             y M
                                                                 1
                                                                             ;                             ´ º¿ µ
Ô Ö Ð Ð ÔÖÓÑ Ó Ù Ø × ÕÙ × Ò×Ô ÓÒ Ò ÙÒ Ù×ÕÙ                            Ü ØÓ× º
    ÍÒ Ñ Ö Ñ × Ù Ó× ¸ Ô ÖÑ Ø ÒØ ÖÔÖ Ø Ö u(y) Ý s(y) Ò Ð Ñ ×ÑÓ × ÒØ Ó Ù Ò Ó
p=0 ×          Ö¸ Ù Ò Ó ÒÓ Ó ÙÖÖ Ó Ò Ò ÙÒ ÜÔ Ò× ÓÒ¸ Ð ÜÔ Ò× ÓÒ                ÙÔÐ Ö
 Ð Ú ÐÓÖ M ´Ú ×        ØÙ Ð Þ Ö ×Ø Ó ÜÔ Ò× ÓÒ ¿ µ Ó Ð ÓÒØÖ ÓÒ                   Ú Ö
 ÒØÖ M ´Ú ×             ØÙ Ð Þ Ö ×Ø Ó ÓÒØÖ ÓÒ ¿ µº
    È Ö Ø Ð × Ð Ò Ð Ø Ñ ÒÓ M¸ ×Ù× M Ð ×Ø × ÓÐ × ÓÒ × ÔÙ Ò ×ØÖ Ù Ö× Ò
    ¯ p ÔÖ Ñ Ö × Ð ×Ø × ÕÙ      Ò × Ó Ô ÖØ ÓÒ ×º
    ¯ M − P Ð ×Ø × ÕÙ ÒÓ       Ò × Ó Ô ÖØ ÓÒ ×¸ Ý
    ¯ p Ð ×Ø × Ö ×ÙÐØ ÒØ ×         Ö Ô ÖØ ÓÒ Ó Ð × ÔÖ Ñ Ö × p Ð ×Ø ׺
Ä × ØÙ ÓÒ × ÔÙ Ô ØÓÖ Þ Ö Ñ Ò Ö Ô ÖØ ÙÐ Ö ´p = 2µ¸ × ÓÑÓ Ø Ñ Ò Ñ Ò Ö
   Ò Ö Ð¸ ×
                                 p                                          p+M
                                                   . . .
                                                    M

    Ä × Ð ×Ø × ÕÙ ÒÓ Ò × Ó Ô ÖØ ÓÒ × ÓÒØ Ò Ò¸ Ò ÔÖÓÑ Ó¸ l Ù Ø ×º
       Ó Ð ×ÙÔÓ× ÓÒ Ð ØÓÖ        Ô Ö Ð ÙÒ ÓÒ × ¸ ÙÒ Ð ×Ø ÐÓÒ ØÙ ÔÖÓÑ Ó
l × Ô ÖØ ÓÒ Ò Ó× Ð ×Ø ×     Ø Ñ ÒÓ ÕÙ Ø Ø ÚÓ l/2º
     Ò ÙÒ ÓÒ ÐÓ ¬Ò Ó¸ Ð ØÓØ Ð Ù Ø × × Ö Ô ÖØ ÒØÓÒ × Ò
    N=          p
                    l
                    2
                             + (M − p)l +                   p
                                                                 l
                                                                 2
                                                                                 = pl + (M − p)l = Ml      ´ º¿ µ
                              ÒÓ Ô ÖØ   ÓÒ    ×
         Ô ÖØ       ÓÒ   ×                         Ö ×ÙÐØ ÒØ ×       Ô ÖØ   ÓÒ

    Ð    ØÓÖ             Ö       ÙÒ Ø Ð             × Ð Ò Ð ×Ø ¸ ÒØÓÒ ×¸ ¬Ò Ó ÔÓÖ
                                                           p+M
                                         α=
                                               Ml
                                              p+M
                                                  =⇒ l = α
                                                            M
                                                                                                           ´ º¿ µ
    Ë x = p/M Ó × ¸ Ð ÔÖÓÔÓÖ ÓÒ                         Ð ×Ø × ÕÙ           Ò × Ó Ô ÖØ ÓÒ      ׺       ר ÑÓ Ó¸
´ º¿ µ × ¬Ò ÓÑÓ
                                                    l = α(1 + x)                                           ´ º¿ µ
442                                                          Cap´
                                                                ıtulo 5. Tablas hash



       ´ º¿ µ ÔÖÓÚ Ò Ð Ð Ò Ð       Ð ÒØ      ×Ô Ö        Ù Ø × Ò ÙÒ Ð ×Ø ÕÙ
ÒÓ    × Ó Ô ÖØ ÓÒ       ÙÑ ÒØ Ð Ò ÐÑ ÒØ α         2αº
     Ù ÐÕÙ Ö Ù×ÕÙ ¸ Ü ØÓ× Ó ÐÐ ¸ Ø Ò ÔÖÓ Ð x Ö Ð Þ Ö× ×Ó Ö ÙÒ Ð ×Ø
Ô ÖØ ÓÒ Ó Ö ×ÙÐØ ÒØ ÙÒ Ô ÖØ ÓÒº Ð Ñ ×ÑÓ ÑÓ Ó¸ Ý ÙÒ ÔÖÓ Ð (1 − x)
   ÕÙ Ð Ù×ÕÙ         Ô Ö Ò ÙÒ Ð ×Ø ÕÙ ÒÓ × Ó Ô ÖØ ÓÒ º
   Ë ¬Ò ÑÓ× U(x) ÓÑÓ Ð ÒØ            ×Ô Ö      Ù Ø × Ú × Ø Ö Ò ÙÒ Ù×ÕÙ
 ÐÐ Ù Ò Ó ÙÒ ÔÖÓÔÓÖ ÓÒ x Ð × Ð ×Ø × Ð Ø Ð Ò × Ó Ô ÖØ ÓÒ ×¸ ÒØÓÒ ×¸
× ÙÒ ´ º¿ µ¸ Ù Ð ÒÓ× Ò Ð ÒØ             ×Ô Ö      Ù Ø × ÕÙ × Ú × Ø Ö Ò¸ U(x) ×
  ¬Ò ÓÑÓ
                                                α(1 + x)
      U(x) = x u(l/2) + (1 − x) u(l) = x u                 + (1 − x) u(α(1 + x))
                                                   2
             =
                 α
                 2
                   (2 + x − x2)                                                    ´ º¿ µ
       Ð Ñ ×Ñ Ñ Ò Ö ¸ × ¬Ò ÑÓ× S(x) ÓÑÓ Ð ÒØ           ×Ô Ö      Ù Ø × Úר Ö
 Ò ÙÒ Ù×ÕÙ         Ü ØÓ× Ù Ò Ó ÙÒ ÔÖÓÔÓÖ ÓÒ x Ð × Ð ×Ø × Ð Ø Ð Ò × Ó Ô ÖØ ¹
 ÓÒ ×¸ ÒØÓÒ ×¸ × ÙÒ ´ º¿ µ¸ Ù Ð ÒÓ× Ò Ð ÒØ                  ×Ô Ö    Ù Ø × ÕÙ
× Ú × Ø Ö Ò¸ S(x) × ¬Ò ÓÑÓ
                                                α(1 + x)
       S(x) = x s(l/2) + (1 − x) s(l) = x s                + (1 − x) s(α(1 + x))
                                                   2
                    1    α(1 + x)               1   α(1 + x)
            = x     1+ +          + (1 − x) 1 +   +
                   M      2×2                   M      2

            = 1+
                 1    α
                   + (2 + x − x2)
                 M 4
                                                                                   ´ º ¼µ
    Ò Ñ Ó× Ø ÔÓ×    Ù×ÕÙ ¸ Ð Ñ Ò ÑÓ ×Ô Ö Ó Ù Ø × Ö Ú × × Ó ÙÖÖ Ù Ò Ó
Ð Ø Ð ÒÓ ×     ÜÔ Ò Ó ´x = 0µ Ó Ù Ò Ó Ð ÜÔ Ò× ÓÒ     ÙÔÐ Ó Ð Ø Ñ ÒÓ Ð
Ø Ð ´x = 1µº    ר ÑÓ Ó¸ Ð × ÓØ × Ò Ö ÓÖ × ×Ø Ò ¬Ò × ÔÓÖ
                           UN = U(0) = α
                                                1   α
                           SN = S(0) = 1 +        +
                                                M 2
ÆÓØ ÑÓ׸ ÓÑÓ Ö ×Ô Ö Ö× ¸ ÕÙ ×Ø × ×ÓÒ Ð × Ñ ×Ñ × ÓØ × ÕÙ Ô Ö Ð Ò ¹
Ò Ñ ÒØÓ × Ô Ö Ó × Ò ÜÔ Ò× ÓÒ» ÓÒØÖ ÓÒº
     Ò ÐÓ Ñ ÒØ ¸ Ð Ñ Ü ÑÓ ×Ô Ö Ó        Ù Ø × Ö Ú × × Ó ÙÖÖ Ù Ò Ó x = 1/2 =⇒
p = M/2¸ ÔÙ × ´ º¿ µ Ý ´ º ¼µ ×ÓÒ Ñ Ü ÑÓ× Ù Ò Ó x − x2 × Ñ Ü ÑÓº ×ØÓ ÕÙ Ú Ð
   Ö ÕÙ M/2 Ð ×Ø × Ò × Ó Ô ÖØ ÓÒ × Ò M/2 Ð ×Ø ×        ÓÒ Ð ×¸ Ñ ÒØÖ × ÕÙ Ö ×Ø Ò
M/2 Ð ×Ø × × Ò Ô ÖØ ÓÒ Öº × ÔÙ ×
                                          9
                         UN = U(0) =        α
                                          8
                                                1  9
                         SN = S(0) = 1 +          + α
                                                M 16
    Ð Óר    ÐÓ Ð Ö Ó     ÙÒ      ÐÓ   ÜÔ Ò× ÓÒ¸ ר        Ø ÖÑ Ò Ó ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ
× Ù ÒØ º
Proposici´n 5.4 (Larson 1988 [22]) Coste promedio de b´ squeda en una tabla
         o                                            u
hash lineal
5.1. Manejo de colisiones                                                                            443



        Ë   TÙÒ Ø Ð × Ð Ò Ð ÐÓÒ ØÙ M ÓÒ N Ð Ñ ÒØÓ׺ ÒØÓÒ ×¸ Ð Óר ÔÖÓÑ ¹
    Ó       Ù×ÕÙ   ÐÓ Ð Ö Ó ÙÒ ÐÓ ÜÔ Ò× ÓÒ ×Ø Ø ÖÑ Ò Ó ÔÓÖ
                                              UN
                                                   M
                                                        =
                                                            13
                                                            12
                                                               α   ;                               ´ º ½µ
Ô Ö ÙÒ Ù×ÕÙ             ÐÐ    Ý
                                                (13α + 12)M + 12
                                  SN
                                      M
                                           =
                                                      12M
                                                                            ;                      ´ º ¾µ
Ô Ö ÙÒ Ù×ÕÙ              Ü ØÓ× º
Demostraci´n
          o            Ð Ö ×ÙÐØ Ó × Ð          Ö Ø Ñ ÒØ                ÒØ Ö Ö ´ º¿ µ Ý ´ º ¼µ
                                                   1
                                  UN
                                          M
                                              =
                                                       α
                                                       2
                                                         (2 + x − x2)      x                       ´ º ¿µ
                                                  0

Ý
                                       1
                              M
                             SN   =        1+
                                                  1  α
                                                    + (2 + x − x2) x
                                                  M 4
                                                                                                   ´º µ
                                      0

      × Ô٠׸ Ò ×Ø Ø ÔÓ Ø Ð ¸ Ð ØÓÖ        Ö × ÑÔÖ Ô ÖÑ Ò                                   ÓÒר ÒØ Ñ ÒØ
    ÓØ Ó¸ ÐÓ ÕÙ ÔÓ× Ð Ø ÒÙÒ Ö Ð ÓÖÓÐ Ö Ó × Ù ÒØ º
Corolario 5.2 Desempe˜ o de las operaciones en una tabla hash lineal
                       n
   Ë h(k) : K −→ [0, M − 1] ÙÒ ÙÒ ÓÒ × O(1) ÕÙ ×ØÖ ÙÝ ÙÒ ÓÖÑ Ñ ÒØ                                     ÐÓ×
 Ð Ñ ÒØÓ× K        [0, M − 1]º Ë T ÙÒ Ø Ð    × Ð Ò Ð ÐÓÒ ØÙ M ÓÒ N                                    й
Ñ ÒØÓ× Ý ØÓÖ      Ö αl ≤ alpha ≤ alphaº ÒØÓÒ ×¸ Ð × ÑÔ ÒÓ ×Ô Ö Ó                                      Ð×
ÓÔ Ö ÓÒ × Ò× Ö ÓÒ¸ Ù×ÕÙ Ý Ð Ñ Ò ÓÒ × O(1)º
Demostraci´n
          o        Ä Ò× Ö ÓÒ Ö ÕÙ Ö ÙÒ Ù×ÕÙ           ÐÐ ¸ Ð Ù Ð Ö ÕÙ Ö Ö ÓÖÖ Ö¸
× ÙÒ ´ º ½µ¸    13
                12 αÙ Ø × Ò ÔÖÓÑ Óº ÈÙ ×ØÓ ÕÙ α × ÓÒר ÒØ ¸ ´ º ½µ × ÓÒר ÒØ Ý
Ð Ò× Ö ÓÒ × O(1)º ÄÓ Ñ ×ÑÓ Ó ÙÖÖ Ô Ö Ð Ù×ÕÙ             ÐÐ º
    È Ö ÙÒ Ù×ÕÙ          Ü ØÓ× × Ö ÓÖÖ Ò¸ × ÙÒ ´ º µ¸  (13α+12)M+12
                                                            12M      Ù Ø ×¸ ÒØ
ÕÙ Ø Ñ Ò × ÓÒר ÒØ ¸ ÔÙ × α × ÓÒר ÒØ º Ä Ù×ÕÙ              Ü ØÓ× ×¸ ÔÓÖ Ø ÒØÓ¸ O(1)º
    Ë Ð Ð Ñ Ò ÓÒ × ÓÑÓ Ð × Ò ÑÓ׸ ÒØÓÒ × ×Ø × O(1) ÓÖÑ Ø ÖÑ Ò ×Ø º
Ë × × Ò Ð Ù×ÕÙ ¸ ÒØÓÒ × ×Ø Ö Ø Ö Þ ÔÓÖ Ð Ù×ÕÙ                        Ü ØÓ× ¸ Ð Ù Ð Ý
   ÑÓ×ØÖ ÑÓ× × O(1)
    Ä Ö Ò ÓÒ              ר Ø ÔÓ Ø Ð × ÕÙ ÒÓ Ý Ò ×                       ÙØ Ö Ð Ó×¹
ØÓ×Ó Ö Ùר Ô Ö Ñ ÒØ Ò Ö Ð ØÓÖ              Ö Ð Ú ÐÓÖ ÕÙ Ó Ö Þ Ð × ÑÔ ÒÓ ×Ô ¹
Ö Ó Ð Ö × Ò Ñ Ñ ÒØ Ùר                    Ò Ø ÑÔÓ ÓÒר ÒØ º ÁÒ Ô Ò ÒØ Ñ ÒØ
Ð ÒØ             Ð Ñ ÒØÓ׸ Ð Ö × ÑÔÖ ×Ø Ö ÓØ ݸ ÔÓÖ Ø ÒØÓ¸ Ð × ÑÔ ÒÓ × Ö
   ÓÒר ÒØ Ñ ÒØ ×Ô Ö Ó º ׸ Ô٠׸ ר Ò ÓÕÙ ÓÒ Ó Ô Ö ØÓ × Ð × × ØÙ ÓÒ × Ò
ÕÙ × Ö ÕÙ Ö ÙÒ Ø Ð × ÈÓÖ ×ÙÔÙ ×ØÓ ÕÙ ÒÓ ÔÓÖ Ú Ö × Ö ÞÓÒ ×º
      Ò ÔÖ Ñ Ö ÐÙ Ö¸ Ù× Ð ÖÖ ÐÓ Ò Ñ Ó¸ ÔÓÖ Ñ × ÕÙ ÒÓ× Ý ÑÓ× × ÓÖÞ Ó Ò
ÙÒ       Ù ÓÒ       ÐØÓ × ÑÔ ÒÓ Ù Ò Ó × Ò ÑÓ× Ð Ø ÔÓ DynArray<T>¸ ר             ÖÖ
 Óר × ÓÒר ÒØ × Ñ ÝÓÖ × ÕÙ Ð Ð ÖÖ ÐÓ ÓÒØ ÙÓ ØÖ ÓÒ Ð ÕÙ ÑÔÐ ÑÓ× ÓÒ Ð
 Ò Ò Ñ ÒØÓ × Ô Ö Óº × Ô٠׸ Ô Ö × ØÙ ÓÒ × Ò Ð × Ù Ð × × ×Ø Ñ ÓÖÖ Ø Ñ ÒØ
 Ð Ú ÐÓÖ N¸ Ð ×Ô Ö× ÓÒ Ð Ò Ð × Ð Ò ÓÕÙ Ñ × Ð ÒØÓ ØÓ Ó× ÐÓ× ÕÙ ÑÓ× ×ØÙ Óº
     Ó ÓØÖÓ ÑÓ Ó¸ × × ×Ø Ò Ô                 ר Ñ Ö ÓÖÖ Ø Ñ ÒØ N¸ ÙÒ ÓÒ ÙÒ ÖØÓ
Ñ Ö Ò Ò ÖØ ÙÑ Ö ¸ ÒØÓÒ × × ÔÖ Ö Ð ÓÔØ Ö Ð ÙÒÓ ÐÓ× Ò ÓÕÙ × ÕÙ Ý
444                                                      Cap´
                                                            ıtulo 5. Tablas hash



   ÑÓ× ×ØÙ Ó Ò ÙÒ ÓÒ Ð × ÓÒ× Ö ÓÒ ×                   × Ò Ü º½º º º ÄÓ× Ö ÙÑ ÒØÓ×
×ÓÒ × ÑÔÐ × × ÑÔÐ         Ý Ñ ÓÖ × ÑÔ ÒÓº
    ËÙÖ ÒØÓÒ × Ð ÔÖ ÙÒØ Ù Ò Ó              ÑÓ× Ù× Ö ×Ô Ö× ÓÒ Ð Ò Ð º À Ý Ó× × Ò Ö¹
 Ó× ÙÒ Ñ ÒØ Ð ×
   ½º Ù Ò Ó ÒÓ × ÓÒÓÞ Ð ×Ø Ñ ÓÒ N¸ Ù Ð × Ð × ØÙ ÓÒ Ù Ò Ó × Ñ Ò Ò
       ÓÒ ÙÒØÓ× Ñ Ò Ö Ò Ö Ðº
   ¾º Ù Ò Ó¸ ÙÒÕÙ × ÓÒÓÞ ÙÒ ×Ø Ñ ÓÒ Ñ Ü Ñ                   N¸ ר ­Ù ØÙ Ö Ù ÒØ ¹
      Ñ ÒØ ÒØÖ Ú ÐÓÖ × ÜØÖ ÑÓ׺
     Ò × ÒØ × ×¸ Ð ×Ô Ö× ÓÒ Ð Ò Ð Ø Ò Ð Ó Ð ÓÒ            Ü Ö × ÑÔ ÒÓ ×Ô Ö Ó
    O(1) ÓÒ ÙÒ ÓÒ×ÙÑÓ         Ñ ÑÓÖ ÔÖÓÔÓÖ ÓÒ Ð Ð ÒØ                 Ð Ñ ÒØÓ× ÕÙ ×
Ñ Ò Òº           × Ö Ð ÓÔ ÓÒ Ù Ò Ó × ØÖ Ø Ò ÓÒ ÙÒØÓ× Ò Ö Ð × ÔÓÖ ÑÔÐÓ¸ ÐÓ× Ñ Ô Ó×
   Ð Ò Ù × ÓÑÓ python Ó perl Ó Ð ÔÖÓÔÙ ×Ø Ð ×Ø Ò Ö C++ Ñ Ô Ó × ¸ ÐÐ Ñ
hash mapº


5.2     Funciones hash
ÌÓ Ó× ÐÓ× Ö ×ÙÐØ Ó× Ò Ð Ø Ó×      × ÑÔ ÒÓ ×Ó Ö ÐÓ× ×ÕÙ Ñ × Ö ×ÓÐÙ ÓÒ         ÓÐ ¹
× ÓÒ × ×ÙÑ Ò ÕÙ h(k) : K −→ [0, M − 1] × O(1) Ý ÕÙ ×Ø ÑÙÐ ÙÒ ×ØÖ Ù ÓÒ
    ÔÖÓ Ð       ÙÒ ÓÖÑ º Ë Ò ×Ø × ÔÖ Ñ × ×¸ Ò Ò ÙÒÓ   ÕÙ ÐÐÓ× Ö ×ÙÐØ Ó× × Ú Ö Þº
  × Ó Ú Ñ ÒØ × Ò Ð¸ ÒØÓÒ ×¸ ÕÙ Ð ÙÒ ÓÒ × ÙÑÔÐ ×ØÓ× Ö ÕÙ × ØÓ׺ È ÖÓ Ý
ÑÙ Ó Ñ × ÕÙ ×ØÓ× Ñ ÖÓ× Ö ÕÙ × ØÓ× Ù Ò Ó × × Ò ÙÒ ÙÒ ÓÒ × º
5.2.1   Interfaz a la funci´n hash
                           o
Ê ÔÐ ÒØ ÑÓ× h(k) : K −→ [0, M − 1] Ò Ø ÖÑ ÒÓ× ÓÑÔÙØ ÓÒ Ð ×      Ó Ð × Ù ÒØ Ø ÔÓ¹
ÒØ Ö Þ
         template <typename Key> size_t hash_fct(const Key & key);

    Á ÐÑ ÒØ ¸ Ð ÙÒ ÓÒ ØÓÑ ÙÒ Ð Ú Ò Ö          Ø ÔÓ Key Ý Ð ØÖ Ò× ÓÖÑ ÙÒ Ò¹
Ø ÖÓ ÒØÖ 0 Ý Ð Ñ × Ö Ò ÒØ ÖÓ ÕÙ ÔÙ Ö ÔÖ × ÒØ Ö× Ò Ð Ø ÔÓ size tº Ê ÓÖ ÑÓ×
ÕÙ Ð Ò        ÒØÖÓ Ð Ø Ð × Ð ÙÐ Ñ ÒØ
         (*hash_fct)(key) mod M;

    Ä Ò ØÙÖ Ð Þ       Key ÒÓ Ò × Ö Ñ ÒØ × ÒÙÑ Ö ¸ Ò ÙÝÓ ×Ó       ÑÓ× Ò ÓÒ¹
ØÖ Ö ÙÒ ØÖ Ò× ÓÖÑ ÓÒ key           Ð Ø ÔÓ size tº × ÕÙ ×Ø Ð ÑÓ× Ð × Ù ÒØ
ÔÖÓØÓ ÓÐÓ Ô Ö Ð Ö ×ÙÐØ Ó (*hash fct)(key)
   ½º Ë Key ÒÓ × ÒÙÑ Ö Ó¸ ÒØÓÒ × ØÖ Ò× ÓÖÑ ÖÐÓ Ð Ø ÔÓ size tº
   ¾º ×ÙÑ Ò Ó ÕÙ key Ý × Ò Ù ÒØÖ Ò Ð ÓÑ Ò Ó size t ¹ÔÓÖ Ú Ö Ø Ó ÔÓÖ
      Ð ØÖ Ò× ÓÖÑ ÓÒ ÒØ Ö ÓÖ¹¸ ×Ô Ö× Ö key¸ ÐÓ Ñ × ÕÙ × ÔÙ ¸ Ò ÐÓ ÔÓ× Ð
       ÓÒ ÑÙÐ ÓÒ Ð ØÓÖ ¸            Ð ÓÑ Ò Ó size tº ר ×Ô Ö× ÓÒ ×¸ Ò × ¸ Ð
      ØÖ Ò× ÓÖÑ ÓÒº
      ÈÙ ×ØÓ ÕÙ Ò ALEPH × ÑÔÖ ÙÐÑ Ò ÑÓ× Ð Ø ÖÑ Ò ÓÒ h(k) : K −→ [0, M − 1]
       ÓÒ Ð ÐÐ Ñ (*hash fct)(key) mod M¸ ר ÓÔ Ö ÓÒ¸ ÓÑÓ Ú Ö ÑÓ× ÔÖÓÒØ ¹
      Ñ ÒØ ¸ Ø Ñ Ò ÔÙ × Ö Ô ÖØ Ð ×Ô Ö× ÓÒº
5.2. Funciones hash                                                                   445



5.2.2      Holgura de dispersi´n
                              o
  Ð Ñ ÝÓÖ ÒØ ÖÓ ÔÓ× Ð ×Ø ×ÙÔ Ø Ó Ð Ñ ÝÓÖ Ú ÐÓÖ ÕÙ × ÔÙ Ö ÔÖ × ÒØ Ö ÓÒ Ð Ø ÔÓ
size tº Ð       ÒØ ÔÓ× Ð          ר ÒØÓ× Ú ÐÓÖ × ÕÙ ÔÙ ÖÖÓ Ö h(k) : K −→ [0, M − 1]
× Ð ÒÓÑ Ò ÓÐ ÙÖ              ×Ô Ö× ÓÒ Ñ ÒØÖ × Ñ ÝÓÖ × Ð ÒØ                    ÒÙÑ ÖÓ× ×¹
Ø ÒØÓ× ÕÙ ÔÙ         Ò Ö Ö Ð ÙÒ ÓÒ × ¸ Ñ ÝÓÖ × ×Ù ÓÐ ÙÖ                ×Ô Ö× ÓÒº × Ô٠׸
 Ò ÒÙ ×ØÖÓ ÓÒØ ÜØÓ¸ ÙÒ Ö ÕÙ Ö Ñ ÒØÓ Ð ÙÒ ÓÒ × × Ø Ò Ö Ð Ñ ÝÓÖ ÓÐ ÙÖ
   ×Ô Ö× ÓÒ ÔÓ× Ð º
       Ò ÔÖÓ Ö Ñ ÓÒ¸ Ð ¬Ò Ù ÒØ ׸ ØÓ Ó Ø ÔÓ               ØÓ ÔÙ Ö ÔÖ × ÒØ Ö× ÓÑÓ ÙÒ
× ÙÒ             Ø×º Ù ÐÕÙ Ö × Ð Ò ÓÐ Ð ÓÑ Ò Ó K¸ ∀ki, kj ∈ K, ki = kj =⇒
ki Ý kj Ø Ò Ö Ò × Ù Ò ×          Ø× ר ÒØ ׺ Ò ×Ø × ÒØ Ó¸ × ×Ø ÒØ × Ð ÕÙ
h(k) : K −→ [0, M − 1] ÓÒ× Ö todos¸ ÐÓ× Ø×              ÙÒ Ð Ú ¸ ÔÙ ×       ר Ñ Ò Ö ×
     Ð Ø Ñ ÓÖ Ð Ö Ô ÖØ Ö K Ò Ð ×Ô ØÖÓ size t ݸ ÔÓÖ Ø ÒØÓ¸ × ÙÑ ÒØ Ð Ô
   ×Ô Ö× ÓÒº È ÖÓ ÒÓ ×Ø ÓÒ ÓÒ× Ö Ö ØÓ Ó× ÐÓ× Ø×º È Ö ÓÑÔÖ Ò Ö ÐÐÓ¸ Ü Ñ Ò ÑÓ×
ÙÒ Ø Ô × ØÙ ÓÒ Ð ÑÙÒ Ó Ö Ð ÔÖÓ Ö Ñ ÓÒº
        ÓÒ× Ö ÑÓ× ÓÑÓ Ð Ú × × ÑÔÐ ×          Ò×         Ö Ø Ö × ´char*µ Ý h(k) ÓÑÓ Ð
×ÙÑ ÐÓ× Ö Ø Ö × Ð                Ò º h(k) Ò          Ò Ð Ö Ò Ó [0, n−1 si]º Ë size t ר
                                                                    i=0
Ö ÔÖ × ÒØ Ó ÓÒ 32 Ø×¸ Ð Ú ÐÓÖ Ñ Ü ÑÓ Ö ÔÖ × ÒØ Ö ÓÒ size t × 232 = 4294967296
    i=0 siº Ë Ø Ò ÑÓ× Ð Ú × Ð      Ø × ÙÝ ÐÓÒ ØÙ × 30 Ö Ø Ö ×¸ ÒØÓÒ × ÓÒ
    n−1

Ú ÐÓÖ ×       Ö Ø Ö × ÒØÖ [65, 90] ∪ [61, 122]½¿ ¸ Ð Ö Ò Ó h(k) × [61 × 30, 122 × 30] =
[1950, 3660] ×ØÓ ÑÔÐ ÕÙ          ÑÓ× Ð Ó 232 −3660+1950 Ú ÐÓÖ × ÔÓ× Ð × ÕÙ ÔÓ Ö
ØÓÑ Ö h(k) Ö ÔÖ × ÒØ Ó ÓÒ size t × M > 1710¸ ÒØÓÒ ×¸ ÓÒ ÖØ ØÙ ¸ M − 1710
 ÒØÖ × Ñ × × Ö Ò              × Ý Ù ÐÕÙ Ö × Ð Ø Ò ÕÙ Ð                    ÓÒ Ð × ÓÐ × ÓÒ ×
 ÓÑÔÐ Ø Ñ ÒØ Ú Ò º ÍÒ Ø Ð × ÓÒ × ÙÒ ÓÒ ÔÙ ÐÐ Ñ Ö× ÙÒ Ø Ð Ñ × º
5.2.3      Plegado o doblado de clave
  ÓÒ× Ö Ö ØÓ Ó× ÐÓ× Ø× ÙÒ Ð Ú ×Ø ×ÙÔ Ø Ó Ð Ø Ñ ÒÓ Ð Ø ÔÓ size t ½ ¸ Ð
 Ù Ð ×Ø Ø ÖÑ Ò Ó ÔÓÖ Ð × Ö Ø Ö ×Ø ×         Ö Û Ö Ý Ð ÓÑÔ Ð ÓÖº Ì Ñ Ò¸ ×
    ØÙ ÑÓ× ÓÔ Ö ÓÒ × Ö ØÑ Ø × ÓÑÓ Ð ÑÔÐ ¬          Ò Ð ×Ù ¹× ÓÒ ÔÖ       ÒØ ¸
ÔÓ ÑÓ× Ø Ò Ö ÙÒ × ÓÖ º
      Ð Ø Ò ØÖ ÓÒ Ð Ô Ö ÓÒ ÖÓÒØ Ö ×Ø ÔÖÓ Ð Ñ × Ð ÓÒÓ            Ó Ð Ô ÖØ Ô Ó
 ÔÐ Ó Ó Ó Ð Ó º ÈÐ Ö ÙÒ Ð Ú ÓÒ× ×Ø Ò × ÓÒ ÖÐ Ò Ô ÞÓ× Ñ × Ô ÕÙ ÒÓ×
Ý ÓÑ Ò ÖÐÓ× ÓÒ ×ÙÑ ×¸ Ó ×½ Ü ÐÙ× ÚÓ× Ó ×ÔÐ Þ Ñ ÒØÓ׺
    ÍÒ Ð Ú       n ÝØ ×      ÔÐ Ö× Ò sizeof(size t) ÝØ ׺ Ë ÙÒ Ð Ò ÓÐ
Ð Ð Ú ÔÓ ÑÓ× × Ð ÓÒ Ö Ô ÞÓ× ¸ ÔÓÖ ÑÔÐÓ¸ n/sizeof(size t) Ò ÙÒ ÓÖ Ò
 × Ó Ó Ô Ö Ú Ö Ð ÙÒ Ô ÖØ ÙÐ Ö × × Óº ÈÓÖ ÑÔÐÓ¸ × Ø Ò ÑÓ× ÙÒ Ð Ú            ¾¼
 ÝØ ׸ Ý sizeof(size t) == 4¸ ÒØÓÒ × ÔÓ ÑÓ× ÓÒ× Ö Ö Ð × Ò Ð × Ñ × × Ò ¬ Ø Ú ×
   ÐÓ× ÝØ × ÒØÖ Ð ×
 ÈÐ Ó ÙÒ           Ò Ý Ò ÝØ × ≡
          char buf[sizeof(size_t)];
          char * ptr = (char*) key + 6; // comienzo del centro en 20 bytes
          for (int i = 0; i < 4; ++i)
            {
 ½¿
       רÓ× ×ÓÒ ÐÓ× Ú ÐÓÖ × Ë ÁÁ Ô Ö ÐÓ× × Ñ ÓÐÓ× Ð Ø ÒÓ× ÒÓ   ÒØÙ Ó׺
 ½
      Ç Ð Ø ÔÓ ÕÙ × ÙØ Ð ÓÑÓ Ö Ò Ó × ÙÒ × Ð ×Óº
 ½
       Ó × × Ð ÔÐÙÖ Ð Þ ÓÒ        Óº
446                                                                Cap´
                                                                      ıtulo 5. Tablas hash



               buf[i] = (ptr[0]>>4) | (ptr[1]>>4);
               ptr += 2;
           }
    Ò ÔÓ× ÙÒ Ù Ò ×Ô Ö× ÓÒ¸ Ò Ð × ÒÓ ÙÒ Ù Ò ÔÐ Ó × ÓÒÚ Ò ÒØ
Ò Ö Ð ÞÓÒ         Ð Ð Ú Ò Ð Ù Ð × ÔÖ × ÒØ Ñ × Ú Ö× ¸ ÔÙ × × × Ð ÞÓÒ
 ÓÒ Ñ ÝÓÖ ÔÓØ Ò Ð Ô Ö ÑÙÐ Ö Ð ×      Ð ØÓÖ   º Ë Ñ ØÖ Ñ ÒØ ¸ Ð × ÞÓÒ × ÓÒ
Ñ ÒÓÖ Ú Ö     ×ÓÒ Ñ × Ù× ÒØ × Ö Ô Ø Ò ×º

5.2.4     Heur´
              ısticas de dispersi´n
                                 o
 Ò × ÒØ × ×¸ Ô Ö Ð ÙÐ Ö h(k) : K −→ [0, M − 1] Ø Ò ÑÓ× ÐÓ× × Ù ÒØ × Ö ÕÙ Ö Ñ ÒØÓ×
   ½º ÉÙ × ÑÙÝ Ö Ô ¸ ÒÓ ×ÓÐÓ O(1)¸ × ÒÓ ÕÙ ×Ù Ø ÑÔÓ ÓÒר ÒØ ×                  Óº
   ¾º ÉÙ Ø Ò ×Ù¬ ÒØ ÓÐ ÙÖ               ×Ô Ö× ÓÒº
   ¿º ÉÙ ÐÓ× Ö ×ÙÐØ Ó× Ö Ø Ö Ò ÙÒ ×ØÖ Ù ÓÒ ÔÖÓ Ð                         ÙÒ ÓÖÑ º
     רÓ× ØÖ × Ö ÕÙ Ö Ñ ÒØÓ׸ Ð Ñ ×      Ð × Ð Ø Ö ÖÓ¸ ÔÙ × Ð × Ð ÓÒ × ÔÖ Ò × Ò Ð
  Ò Ö ÓÒ ÒÙÑ ÖÓ× Ð ØÓÖ Ó× ½ Ò Ò ÕÙ × ÖØÓ                         и ÔÓÖ ÒÓ Ö ÑÔÓ× Ð ¸
  Ò Ö Ö ÒÙÑ ÖÓ× Ð ØÓÖ Ó× Ô ÖØ Ö           ØÓ× ÕÙ ÒÓ ÐÓ× ×ÓÒ ½ º Æ       ¸ ר Ð ÔÖ × ÒØ ¸
      × Ù ÖØÓ ÙÒ Ø Ò             ×Ô Ö× ÓÒ Ò Ö Ð ÕÙ ÑÙÐ ÙÒ ×ØÖ Ù ÓÒ ÙÒ ÓÖÑ ¸
Ô ÖÓ × × ÓÒÓ Ò Ü Ð ÒØ × ÙÖ ×Ø × ÕÙ ¸ ÓÔ Ö × ×Ó Ö ÙÒ Ö ÔÖ × ÒØ ÓÒ ÒÙÑ Ö ¸
 ÑÙÐ Ò Ð Ð ØÓÖ         º
5.2.4.1    Dispersi´n por divisi´n
                   o            o

  Ð Ñ ØÓ Ó      ×Ô Ö× ÓÒ Ñ × ÔÓÔÙÐ Ö × Ùר Ñ ÒØ Ð ÕÙ ÑÓ× ÑÔÐ Ó ØÖ Ú ×
ØÓ Ó× ÐÓ× Ø ÔÓ× × ÖÖÓÐÐ Ó×
                                  h(k) = k ÑÓ M                   ´º µ
È ÖÓ Ò ×Ø Ø ÔÓ ÙÒ ÓÒ × Ö Ø Ð × Ð ÓÒ Ð Ú ×ÓÖ Ó × ¸ Ð Ú ÐÓÖ M¸ Р٠и
   Ñ ÒÙ Ó¸ × Ð ÔÖÓÔ Ó Ø Ñ ÒÓ Ð Ø Ð ½ º
    Ë ÑÓ× ÕÙ Ù ÐÕÙ Ö ÒØ ÖÓ k n ØÓ× ÔÙ             ÜÔÖ × Ö× ÓÑÓ
                                         n−1
                                    k=         di × b i    ;
                                         i=0

ÓÒ           di × ÙÒ     ØÓ Ý b × Ð ×      Ð × ×Ø Ñ ÒÙÑ Ö Óº Ò ×Ø × ÒØ Ó¸ Ð          Ú × ÓÒ
ÒØ Ö      k/M ÔÙ        ÜÔÖ × Ö× ÓÑÓ
                                               n−1
                                               i=0 di ×   bi
                                 k
                                 M
                                   =
                                                  M
                                                               .                     ´º µ
 ½
    Ò ÔÖÓ Ö Ñ ÓÒ¸      Ö ÑÔÓ× Ð        × ÑÙÝ Ù ÖØ ¸ ÔÙ × ÐÓ Ú ÖØÙ Ð ×Ô Ó Ô Ö ÑÙ Ó ÔÓ× Ð º
 ½
    Ò ÐÓ ÕÙ × Ù ¸      ÑÓ× ×Ø Ö Ô Ò ÒØ × Ð     Ó ÕÙ M ÒÓ Ò × Ö Ñ ÒØ × Ð Ø Ñ ÒÓ Ð
Ø Ðº
5.2. Funciones hash                                                                               447



    Ð Ö ×ØÓ Ð Ú × ÓÒ¸ k ÑÓ M¸ ÔÙ ÒØ ÖÔÖ Ø Ö× ÓÑÓ                                  k ÑÓ M = k − k k/M
ÐÓ Ù Ð¸ × ÙÒ ´ º µ¸ ÔÙ  ÜÔÖ × Ö× ÓÑÓ
                                                    n−1
                                                    i=0 di ×   bi
                     k ÑÓ M = k −
                                                           M
                                          n−1                      n−1
                                                                   i=0 di ×      bi
                                    =           di × b i −
                                                                        M
                                                                                       .        ´º µ
                                          i=0

 ר ÜÔÖ × ÓÒ ÒÓ× Ô ÖÑ Ø Ú Ö ÕÙ ÐÓ× ×ÙÑ Ò Ó× Ñ ÒÓ× × Ò ¬ Ø ÚÓ׸ ÕÙ ÐÐÓ× Ø Ð × ÕÙ
di × ni < M¸× ÑÔÖ ÓÒ ÓÖÑ Ò Ô ÖØ k ÑÓ M¸ ÔÙ × ×ØÓ× ÒÓ ×ÓÒ¸ Ò Ø ÖÑ ÒÓ× Ð Ø¹
Ö Ð ×¸ ÒØ Ö Ñ ÒØ Ú × Ð × ÔÓÖ Mº × Ô٠׸ ´ º µ ÔÙ        ÜÔÖ × Ö× Ö ÙÖ× Ú Ñ ÒØ
ÓÑÓ
         k ÑÓ M =                   di × bi +                  di × bi       ÑÓ M
                         ∀i|di ×bi <M                ∀i|di ×bi ≥M

                                                                    di × bi
                     =              di × bi +                                     ÑÓ M ÑÓ M;     ´ º µ
                                                                      M
                         ∀i|di ×bi <M               ∀i|di ×bi ≥M

                               ÁÒ Ú × Ð                             Ê ×ØÓ     Ö ×ØÓ×

 Ó × ¸ ØÓ Ó× ÐÓ× ×ÙÑ Ò Ó× k ÕÙ ÒÓ ×ÓÒ ÒØ Ö Ñ ÒØ Ú × Ð × ÔÓÖ M Ñ × Ð Ö ×ØÓ
Ð ×ÙÑ ÐÓ× Ö ×ØÓ×½ º
      Ð ÔÖ Ñ Ö ×ÙÑ Ò Ó         ´ º µ ÐÓ ÐÐ Ñ Ö ÑÓ× ÐÓ Ò Ú × Ð Ý Ð × ÙÒ Ó
  Ð Ö ×ØÓ Ö ×ØÓ× º
      ר ÒØ ÖÔÖ Ø ÓÒ Ð Ö ×ØÓ ÒÓ× Ð Ø ÔÖ Ò Ö Ð ØÖ × Ò Ò ÕÙ Ø Ò Ð                     ¹
 Ù × Ð ÓÒ Ð Ú ×ÓÖ M ×Ó Ö Ð ÓÒ× Ö ÓÒ                      ØÓ× Ð × Ù Ò ÕÙ ÜÔÖ ×
  kº     ´ º µ × ÔÙ Ú Ö ÕÙ ÐÓ× ÙÒ Ó× ØÓ× ÕÙ × ÓÒØ Ð Þ Ö Ò ÓÒ × ÙÖ                 ×ÓÒ
ÐÓ× Ð ÓÑÔÓÒ ÒØ Ò Ú × Ð º Ð Ö ×ØÓ Ö ×ØÓ× Ô Ò                  Ð ÑÙÐØ ÔÐ     Ö ×Ô ØÓ
Mº Ë ÙÒ ×       Ð Ú ÐÓÖ M¸ Ð ÓÔ Ö ÓÒ ÑÓ ÙÐÓ ØÓÑ Ö Ò Ù ÒØ Ó ÒÓ Ð ÙÒÓ× ØÓ×
kº ÍÒ     ÑÔÐÓ ÔÙ       ÝÙ Ö ÕÙ ÐÐÓ× ÕÙ ÙÒ ÒÓ ÐÓ Ò Ö Ð Þ Óº Ë Ø Ò ÑÓ× M = 100
Ý ×         Ñ Ð¸ ÒØÓÒ × Ð Ö ×ØÓ ×ÓÐÓ ×Ø Ø ÖÑ Ò Ó ÔÓÖ ÐÓ Ò Ú × Ð ¸ ÔÙ × ÐÓ× Ö ×ØÓ×
Ö ×Ø ÒØ × ×ÓÒ ÒÙÐÓ× Ý ÓÒ ÐÐÓ× Ð Ö ×ØÓ Ö ×ØÓ׺ ÓÒ M = bw ÒÓ ÑÔÓÖØ Ù Ð × Ð Ú ÐÓÖ
   k¸ Ð Ö ×ØÓ ×ÓÐÓ ÓÒ× Ö ÐÓ× w ÙÐØ ÑÓ×      ØÓ× kº Ë ¸ ÔÓÖ ÑÔÐÓ¸ ÐÓ× ÙÐØ ÑÓ× ØÓ×
    k ר Ò × ×     Ó× ×Ø Ö ÒØÖ 20 Ý 30 Ý M = 100¸ ÒØÓÒ × h(k) ר Ö × × Ó ×
Ö Ò Ó ÐÓ ÕÙ ÖÖÙÑ ØÓ × Ð × ÜÔ Ø Ø Ú ×               × ÑÔ ÒÓ¸ ÔÙ × h(k) ר Ö ÑÙ Ó
× Ö Ð ØÓÖ º
    Ì ÑÔÓ Ó ×Ø M = 2w¸ ÔÙ × ÔÙ Ö Ü ×Ø Ö Ð ÙÒ Ô ØÖÓÒ ÑÙÐØ ÔÐ                     Ò ÐÓ×
×ÙÑ Ò Ó× di × biº ÈÓÖ ÑÔÐÓ¸ 75312 ÑÓ 150 = 12 = 75312 ÑÓ 100 Ù Ò Ó Ñ Ö ÑÓ×
ÕÙ 150 = 10 × 5 × 3¸ ÒÓ ×ÓÐÓ Ú ÑÓ× ÙÒ ÑÙÐØ ÔÐ          ÓÑÓ Ô Ö Ù Ò Ó M = 100¸ × ÒÓ
ÕÙ ¸ ÓÑÓ          ×ÙÑ Ò Ó Ð Ö ×ØÓ Ö ×ØÓ× × ÑÙÐØ ÔÐÓ 5 Ð Ò Ò                 ÙÒ ØÓ
 × ×Ù ÑÙÐØ ÔÐ        ÔÓÖ 3 Ò Ø ÖÑ ÒÓ× Ñ × × ÑÔР׸         ØÓ Ø Ò ÔÖÓ Ð        1/3
ÒÓ × Ö ÓÒ× Ö Óº Ò Ò ÙÖ ¸ Ð ×ÙÑ Ö ×ØÓ× Ø Ñ Ò Ø Ò Ù Ò ÔÖÓ Ð
× Ö ÑÙÐØ ÔÐÓ ØÖ ׺
 ½
     ×   ÒÓØ Ö ÕÙ                                                   !
                                           n−1
                           k   ÑÓ   M=           (di × b ) ÑÓ M
                                                       i
                                                                        ÑÓ   M    ;
                                           i=0

Ó × ¸ Ð Ö ×ØÓ × ÔÙ       ¬Ò Ö¸ × ÑÔÐ Ñ ÒØ ¸ ÓÑÓ Ð Ö ×ØÓ ÐÓ× Ö ×ØÓ׺ × ÖÖÓÐÐ ÑÓ× Ð Ö ÔÖ × ÒØ ÓÒ
× ÙÒ k ÑÓ M = k −    k/M     ÔÓÖÕÙ ÓÒ× Ö ÑÓ× ÕÙ Ô ÖÑ Ø ÔÖ Ò Ö Ñ ÓÖº
448                                                            Cap´
                                                                  ıtulo 5. Tablas hash



     Ä × ÓÒ× Ö ÓÒ × ×Ó Ö Ð ÑÙÐØ ÔÐ               ÕÙ ÑÓ× Ö Ð Þ Ó ×ÓÒ Ú Ð × Ô Ö
 Ù ÐÕÙ Ö × ÒÙÑ Ö           Ò Ô ÖØ ÙÐ Ö Ð Ò Ö º
        Ù Ò Ó × Ð ÓÒ ÑÓ× Ð Ñ ØÓ Ó         Ú × ÓÒ ÓÑÓ ÙÒ ÓÒ × ¸       ÑÓ× ×Ø Ö ×ÙÑ ¹
Ñ ÒØ Ô Ò ÒØ ×           ר ÑÙÐØ ÔÐ      ¸ ÔÙ × Ð Þ Ö ÔÙ      Ù ÖÒÓ× Ò ÓÒØÖ º Ë ÒÓ
  ×ÔÓÒ ÑÓ× Ø ÑÔÓ Ó Ò ÑÓ Ô Ö ×ØÙ Ö Ð ÑÙÐØ ÔÐ                  ¸ ÒØÓÒ × ÔÓ ÑÓ× × Ð ¹
  ÓÒ Ö M ÓÑÓ ÙÒ ÒÙÑ ÖÓ ÔÖ ÑÓ¸ ÐÓ ÕÙ × ÙÖ ÕÙ Ò Ò ÙÒÓ ÐÓ× ×ÙÑ Ò Ó× k
Ø Ò Ð ÙÒ Ö Ð ÓÒ ÑÙÐØ ÔÐ               º
        Ð Ñ ØÓ Ó     Ú × ÓÒ ÙÒ Ó ÙÒ × Ð ÓÒ M¸ ÓÑÓ Ú ×ÓÖ Ý Ð Ú Þ ÓÑÓ
Ø Ñ ÒÓ Ð Ø Ð ¸ × Ð Ñ ØÓ Ó                ×Ô Ö× ÓÒ Ñ × ÔÓÔÙÐ Öº Ð Ò ÓÕÙ     ALEPH
 ÓÒÐÐ Ú Ö Ø Ñ ÒØ ר Ñ ØÓ Ó¸ ÙÒÕÙ ÒÓ Ð × Ð ÓÒ M ÓÑÓ ÔÖ ÑÓ¸ Ù Ð ×
   Ð       Ð Ù×Ù Ö Ó Ð Ì º Ò × ¸ ר Ñ ØÓ Ó × ×Ø ÒØ × Ò ÐÐÓ Ý Ö Ô Ó¸ Ô ÖÓ ÒÓ ×
       Ù ØÓ × Ð × Ö ÙÒר Ò × ÔÓÖ ÑÔÐÓ¸ × ÐÓ Ù× ÑÓ× Ö Ø Ñ ÒØ ¸ ÒÓ × ÑÔÖ ×
     и Ò ÙÒ ÓÒ Ø Ñ ÒÓ ÓÖ Ò Ð Ó Ð Ö Ùר ¸ × ÙÖ Ö ÕÙ M × ÔÖ ÑÓº
5.2.4.2     Dispersi´n por multiplicaci´n
                    o                  o

 ר Ñ ØÓ Ó Ø Ò Ð Ú ÒØ            ÕÙ ÔÙ         ÔØ Ö× Ô Ö Ù ÐÕÙ Ö Ø Ñ ÒÓ        Ø Ðº
Definici´n 5.2 (Fraccional de un n´mero real) Ë
         o                       u                          x ÙÒ ÒÙÑ ÖÓ Ö Ð ÔÓ× Ø ÚÓ¸ Ð
 Ö ÓÒ Ð x¸ ÒÓØ Ó ÓÑÓ {x}¸ × Ð Ô ÖØ Ö ÓÒ Ð                    xº ÈÓÖ ÑÔÐÓ¸ {1, 6252345} =
0, 6252345º

      Ð Ñ ØÓ Ó     ÑÙÐØ ÔÐ   ÓÒ ¬Ò ÙÒ ÙÒ ÓÒ ×                Ð × Ù ÒØ ÑÓ Ó
                                   h(k) = {k θ} M      ;                          ´º µ
 ÓÒ     θ   × ÙÒ ØÓÖ ÑÙÐØ ÔÐ ÓÒº
       ÙÐ      × Ö Ð Ú ÐÓÖ Ð ØÓÖ θ º Ë × ÑÓ× ÑÙÐ Ö Ð Ð ØÓÖ         ¸ ÒØÓÒ ×
×Ù Ò ÓÒ × ÒØ Ó Ö ÕÙ Ô Ö ÚÓÖ ÖÐ Ð × Ó Ò                × Ö Ð Ó ÖÖ ÓÒ Ðº ÈÙ ×
   Ò¸ Ö ×ÙÐØ ÕÙ Ð Ñ Ø Ñ Ø ÒÓ× × Ù Ö ÙÒ Ð × Ò¬Ò Ø            ÒÙÑ ÖÓ× ÐÐ Ñ Ó×
  ÖÖ ÓÒ Ð × Ò Ð × ÒØ Ó ÕÙ ÒÓ ÔÙ Ò ÜÔÖ × Ö× ÓÑÓ ÙÒ Ö ÞÓÒ ´ Ö ÓÒµ ݸ Ý
      × Ð × ÓÒ× Ö ÓÒ × ×Ó Ö Ð ÑÙÐØ ÔÐ      M Ò Ð ×Ù ¹×    ÓÒ ÒØ Ö ÓÖ¸ × ÑÓ×
ÕÙ Ð × Ö ÞÓÒ × ´ Ö ÓÒ ×µ Ø Ò Ò × × Ö Ð × Ð Ú ×º
Proposici´n 5.5 (Tur´n-1958) ½
             o                 a
     Ë θ ÙÒ ÒÙÑ ÖÓ ÖÖ ÓÒ Ð Ý n ÙÒ ÒØ ÖÓ ÔÓ× Ø ÚÓº            ÒØÓÒ × ÐÓ× n + 1 Ö ÓÒ Ð ×
{θ}, {2θ}, {3θ}, . . . , {nθ} Ø Ò Ò ÐÓ ×ÙÑÓ ØÖ × ÐÓÒ ØÙ ×   ר ÒØ × Ý Ð ÔÖÓÜ ÑÓ Ö ÓÒ Ð
{(n + 1)θ} × Ð             Ò ÙÒ Ð × Ñ ÝÓÖ × ÐÓÒ ØÙ ׺
Demostraci´n
          o          Î × ÃÒÙØ ½
       Ð ÓÒÓ Ñ ÒØÓ ÕÙ ÒÓ× ÔÓÖØ ר Ø ÓÖ Ñ × ØÖ Ù Ò Ð × Ù ÒØ × Ó × ÖÚ ÓÒ ×
     ½º {kθ} Ý {(k + 1)θ} ÔÙ Ò ×Ø Ö × Ô Ö Ó× ÔÓÖ ØÖ × ×Ø Ò × ÔÓ× Ð × Ý¸
     ¾º {kθ} Ý {(k + 1)θ} ר Ò Ò ÒØÖ × ÒØÖ Ð × Ó× Ñ ÝÓÖ × ÐÓÒ ØÙ ׺ ר × Ô Ö ÓÒ
         × ÐÓ ÕÙ ÑÙÐ Ð Ð ØÓÖ        º
 ½
       Ø Ó ÔÓÖ ÃÒÙØ ½ º
5.2. Funciones hash                                                                                        449



                     ½                                                                                 3
                                              3
                ¼º                                                                 3
                          3
                ¼º                                         3
                                                                                               3
                ¼º                    3
                                                                           3
                ¼º    3
                                                   3
         {ϕk}
          ^     ¼º            3
                                                                                       3

                ¼º                                             3
                                                                                                   3
                                          3
                ¼º¿                                                            3
                        3
                ¼º¾                                    3
                                                                                           3
                ¼º½               3
                                                                   3
                   ¼3
                    ¼ ½ ¾ ¿                            ½¼ ½½ ½¾ ½¿ ½ ½ ½ ½ ½ ½ ¾¼ ¾½


                              ÙÖ º Î ÐÓÖ × Ð Ö                     ÓÒ Ð {kϕ}
                                                                          ^


      ÃÒÙØ ½ ×Ù Ö ÕÙ                                     √
                                                  −1      5−1
                                  θ=ϕ=ϕ
                                    ^                  =               ,
                                                           2
 × ÙÒ Ù Ò × Ð ÓÒ Ò ÑÙ Ó× ×Ó× Ý ÒÓÑ Ò              ר ×Ô Ö× ÓÒ         ÓÒ º
È ÖÓ¸ ÔÓÖ ÕÙ × Ù ÒÓ ×Ø ÒÙÑ ÖÓ ϕ × Ð Ö ÔÖÓ Ó ÐÓ ÕÙ × ÓÒÓ ÓÑÓ Ð
                                    ^
 ÔÖÓÔÓÖ ÓÒ ÙÖ Ó Ð Ö Ó Ú ÒÓ ¸ Ô٠׸ × Ø ÑÔÓ× ÒÑ ÑÓÖ Ð ×¸ ×                 ÕÙ
 × Ð ÔÖÓÔÓÖ ÓÒ ÓÒ ÕÙ ÐÓ× Ó× × ÓÖ ÖÓÒ Ð ÑÙÒ Ó¾¼ º Ä ÔÖÓÔÓÖ ÓÒ ϕ¸ ÕÙ ¸ ÓÑÓ
Ú ÑÓ׸ × ÖÖ ÓÒ Ð¸ ÐÓ ÕÙ Ò Ö ¸ ÕÙ Þ ¸ ×ÙÑ Ò Ó ÙÒ Ó× Ö ÓÒ Ð¸ ÕÙ Ý Ð Ó
    ÖÖ ÓÒ Ð Ò ÐÓ Ú ÒÓ¸ ÒÓ ×ÓÐÓ × Ù Ù Ò Ð Ò ØÙÖ Ð Þ ¸ × ÒÓ ÕÙ       ÓÑÔÖÓ Ó
× Ö ×Ø ÒØ Ù Ò Ò ÙÒ ÑÔÐ Ñ                ÓÑ Ò Ó× ÑÙ× ¸ ÖÕÙ Ø ØÙÖ ¸ Ò Ò Ö ×¸
 Ø Ø Ö º Î Ð Ð Ô Ò ÓÒר Ø Ö Ð ×ØÖ Ù ÓÒ ÑÙÐØ ÔÐ Ø Ú ¸ ÓÒ ÙÒÓ× ÔÓ Ó× Ú ÐÓÖ ×
k¸ ØÖ Ú ×    Ó × ÖÚ ÓÒ Ð Ö ¬ º ¸ Ð Ù Ð ÓÒר Ø ÑÓ× ÕÙ Ð Ú × × Ù Ò Ð ×
  ר Ò Ò Ð ×Ô Ö× ÓÒ ÔÓÖ ÑÔÐÓ¸ h(5) = 0 Ý h(6) = 4¸ Ô ÖÓ¸ Ñ ×¸ Ð Ô Ö Ò
Ð ÔÖÓÔ Ö ¬         Ò ÔÙ Ö × Ö Ð ÙÒ ×ØÖ Ù ÓÒ ÙÒ ÓÖÑ º
       Ú ÑÓ׸ Ô٠׸ ÕÙ Ð ×Ô Ö× ÓÒ ÔÓÖ ÑÙÐØ ÔÐ ÓÒ Ö Ô ÖØ ÐÓ× ÔÖÓ Ù ØÓ× ÓÒ ×Ù¬¹
   ÒØ ר Ò ¸ ÐÓ× ÒØ Ö Ð × Ò Ð ÙÒ ÓÖ Ò Ô Ö ÒØ Ý × Ò Ô Ò ÒØ Ð Ú ÐÓÖ Mº
  Ò Ò ÙÖ ¸ ר Ñ ØÓ Ó Ø Ò Ð Ú ÒØ          Ø Ò Ö × Ö Ñ × Ö Ô Ó ÕÙ Ð      Ú × ÓÒ¸
ÔÙ × × Ñ × Ö Ô Ó ÑÙÐØ ÔÐ Ö ÕÙ Ú Öº À ݸ Ñ ×¸ ÙÒ ØÖÙ Ó Ô Ö ÑÙÐØ ÔÐ Ö
Ö Ô Ñ ÒØ ¸ ÕÙ ÒÓ× ÓÖÖ Ð Óר         Ô Ð Ö Ð Ö ØÑ Ø Ò ÔÙÒØÓ ­ÓØ ÒØ º
    Ë w Ð ÐÓÒ ØÙ       Ð Ð Ú Ò Ø× Ý × Ó ÑÓ× M = 2zº × Ö × ÐØ Ö¸ Ò ÔÖ Ñ Ö
ÐÙ Ö¸ ÓÑÓ M = 2z¸ h(k) ÔÙ Ö ÔÖ × ÒØ Ö× ÓÒ z Ø×º
    Ë σ = kθ Ö ÔÖ × ÒØ Ó Ò w Ø×º Ð ÔÖÓ Ù ØÓ ÒØ ÖÓ kσ ¹ÒÓ Ò ÔÙÒØÓ ­ÓØ ÒØ ¹
Ø Ò ÙÒ ÐÓÒ ØÙ         2w Ø× Ú         Ò Ó× Ô Ð Ö × w Ø× p0 Ý p1 Ø Ð × ÕÙ
kσ = p1 kθ + p0{kθ}º È ØÓÖ Ñ ÒØ ¸ ÔÓ ÑÓ× Ñ Ö Ö Ð ×ÙÒØÓ     Ð × Ù ÒØ Ñ Ò Ö
 ¾¼
      Ò Ü º º¾º¾ ´Ô Ò ½½µ × ÜÔÐ ÙÒ ÔÓ Ó Ñ × Ð Ð ÙÐÓ ×Ø ÒÙÑ ÖÓ Ý ×Ù Ö Ð ÓÒ ÓÒ ÐÓ× ÒÙÑ ÖÓ×
       ÓÒ º Ò Ü º ´Ô Ò        µ × Ö Ð Þ Ò Ð ÙÒ × Ö Ö Ò × ×ØÓÖ × Ð Ù×Ó    ר ÔÖÓÔÓÖ ÓÒº
450                                                                                 Cap´
                                                                                       ıtulo 5. Tablas hash



                                                                             w bits
                                                                                k                1
                                                    ×                    σ = θ2w

                           p1 = kθ                             h(k)              p0 = {kθ}
                                                      ,
                                                               z bits
    ר ÑÓ Ó¸ ÐÓ× z Ø× Ñ × × Ò ¬ Ø ÚÓ× p0 Ö ÔÖ × ÒØ Ò Ð Ú ÐÓÖ h(k) h(k) ×
Ó Ø Ò ÓÒ ×ÔÐ Þ Ö z Ø×            Ð ÞÕÙ Ö     p0 Ó ÓÒ ÙÒ and Ö ØÑ Ø Ó ÒØÖ p0 Ý
Ð Ô Ð Ö ÓÒ ÓÖÑ 11 . . . 1 00 . . . 0 º Ò Ö Ò Ó× Ò ÙÖ ¸ × ÒÓ× × ÙÖ ÑÓ× ÕÙ
                   z Ú × w−z Ú ×
σ × ÑÔ Ö¸ ÒØÓÒ × ×Ø Ñ ØÓ Ó Ö ÒØ Þ ÕÙ Ð Ô Ð Ö p0 ×         ×ØÖ ÙÝ ÙÒ ÓÖÑ Ñ ÒØ
Ø Ð ÓÑÓ ÐÓ Ú Ò Ð × Ù ÒØ Ø ÓÖ Ñ
Proposici´n 5.6 (Lewis-Denemberg 1991 [23]) ´Aleatoriedad de {kθ})
          o
   Ë σ = θ2z Ø Ð ÕÙ σ × ÑÔ Öº Ë K Ð ÓÒ ÙÒØÓ Ð Ú ×¸ Ð Ù Ð ×Ø Ö ÔÖ ×                                      ÒØ Ó
 ÓÒ Ô Ð Ö × w Ø×º Ë kσ = p1 kθ + p0{kθ} | k ∈ Kº ÒØÓÒ ×¸ Ô Ö Ù ÐÕÙ                                      ÖÔÖ
    Ð Ú × ×Ø ÒØ × k1, k2 ∈ K
                                    σk1 ÑÓ 2w = σk2 ÑÓ 2w                                               ´ º ¼µ
      Ó     ÓØÖÓ ÑÓ Ó¸ × ÙÒ Ð ¬ ÙÖ ÒØ Ö ÓÖ
                                    k1θ , {k1θ} = k2θ , {k2θ}                   .                       ´ º ½µ
                                    p1         p0         p1            p0

Ä ÔÖÓÔÓ× ÓÒ × ÕÙ Ú Ð ÒØ ÒÙÒ Ö ÕÙ Ô Ö Ð × Ô Ð Ö × Ñ ÒÓ× × Ò ¬ Ø Ú × {k1θ} =
{k2θ}º
Demostraci´n
           o      ×ÙÑ ÑÓ× k1 < k2 Ý × Dk = k2 − k1º Ð Ö ÙÑ ÒØÓ Ð ÔÖÙ
 ×ØÖ Ò ÑÓ×ØÖ Ö ÕÙ (σk2 ÑÓ 2w) − (σk1 ÑÓ 2w) = σ(k2 − k1) ÑÓ 2w = σDk ÑÓ
2w = 0 ÐÓ Ù Ð Ø Ò × ÒØ Ó ÔÓÖÕÙ Dk = 0 Ý Ð ÑÓ ÙÐÓ Ü      Ð ÔÖÓÔ        ×ØÖ ÙØ Ú º
    Ë Ò σ = i=0 σi2
              w−1    i Ý D =
                          k
                              w−1
                              i=0 di2
                                     iº Ð ÔÖÓ Ù ØÓ σDk ÔÙ     ÜÔÖ × Ö× ÓÑÓ
                   w−1                   w−1
          σDk =          σi2i    ×             di2i
                   i=0                   i=0
              =   σ020 +   σ12 + · · · + σw−12w−1 × d020 + d121 + · · · + dw−12w−1
                                1

                  2w−2     i
              =                 σjdi−j 2i                                                               ´ º ¾µ
                  i=0     j=0

Ë   dp Ð ÔÖ Ñ Ö Ø Ñ ÒÓ× × Ò ¬                   Ø ÚÓ Dk ÙÝÓ Ú ÐÓÖ × 1                         ר ÑÓ Ó dp−1 =
dp−2 = · · · = d0 = 0º  × ÖÒÓ×                 Ð ÖÓ ÕÙ Ð ×ÙÑ ØÓÖ ÒØ ÖÒ                       ´ º ¾µ × ÒÙÐ Ô Ö
i < pº    ÓÖ Ò¸ Ô Ö i = p
                                          p
                                               σjdp−j = σ0dp ,
                                         j=0

ÔÙ × ÐÓ× ×ÙÑ Ò Ó× Ö ×Ø ÒØ × ×ÓÒ ÒÙÐÓ× Ó ÕÙ dp−j = 0 Ô Ö j < pº  ר ÑÓ Ó¸ Ð Ø
p    σDk × 1¸ ÐÓ ÕÙ ÑÔÐ      ÕÙ Dk = 0 Ý σk1 ÑÓ 2w = σk ÑÓ 2w Ô Ö ØÓ Ó k = k
                                                       2                1    2
5.2. Funciones hash                                                             451



    Ð Ø ÓÖ Ñ ÒØ Ö ÓÖ ÑÔÐ ÕÙ ØÓ × Ð × Ð Ú × ÔÓ× Ð × w Ø× × ×ØÖ ÙÝ Ò
ÙÒ ÓÖÑ Ñ ÒØ Ò Ð Ô Ð Ö p0 = {kθ}º ÈÓÖ ×ÙÔÙ ×ØÓ¸ Ö Ò ÓÐ × ÓÒ × ÒØÖ ÐÓ× z Ø×
Ñ × × Ò ¬ Ø ÚÓ× ÕÙ ÓÒ ÓÖÑ Ò h(k)º
    ר Ø Ò ×          Ù ÑÙÝ Ò Ô Ö ÙÒ Ø Ð × Ð Ò Ð Ò Ð Ù Ð Ð Ø Ñ ÒÓ M ×
 ÙÔÐ º      Ñ ×¸ ÒÓ ×    Ð ÔØ ÖÐ Ô Ð Ö ×      Ø× ÐÓÒ ØÙ Ö ØÖ Ö º

5.2.5      Dispersi´n de cadenas de caracteres
                   o
 À Ý ÙÒ Ú ×Ø ÒØ          × ØÙ ÓÒ × Ò ÕÙ Ð Ò Þ ÓÒ × Ö Ð Þ ÔÓÖ ÙÒ         Ò
   Ö Ø Ö ×º ׸ Ô٠׸ ÑÔÓÖØ ÒØ Ñ Ø Ö ×Ó Ö Ð ×Ô Ö× ÓÒ        Ò ×¸ Ô ÖØ      ÕÙ ¸
  ÓÑÓ ÐÓ ÑÔÐ ¬ ÑÓ× Ò Ü º¾º¾ ´Ô Ò       µ¸ × Ö Ð Ø Ú Ñ ÒØ Ð ÓÒרÖÙ Ö ÙÒ Ô × Ñ
  ÙÒ ÓÒ × º Ë ÒÓ × ×ÔÓÒ Ð Ø ÑÔÓ Ý Ò ÑÓ¸ ÒØÓÒ × × ÓÒÚ Ò ÒØ ØÖ Ò× Ö ÔÓÖ Ò
  ÓÒÓ × Ý ¬ ÒØ × ÙÒ ÓÒ × × º Ä × × Ù ÒØ × ×ÓÒ ÔÙ Ð × Ý        Ù Ò × ÑÔ ÒÓ
    ½º
½      À×       Öר Ò      ½ ≡
          size_t berstein_hash(unsigned char * str)
          {
            size_t hash = 5381;
            int c;
            while (c = *str++)
              hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
            return hash;
          }

         Ä × Ö ÞÓÒ × ×Ó Ö Ð × Ó Ò      Ð Ú ÐÓÖ Ò Ð 5381 Ý Ð ÒÙÑ ÖÓ Ñ   Ó   33    ÙÒ
         ÒÓ Ò × Ó × Ù ÖØ ׺
    ¾º
½        À×     Ð × ×Ø Ñ × Ñ ¾      ½ ≡
          size_t sdbm_hash(unsigned char * str)
          {
            size_t hash = 0;
            int c;
            while (c = *str++)
              hash = c + (hash << 6) + (hash << 16) - hash;
            return hash;
          }


5.2.6      Dispersi´n universal
                   o
ÈÓÖ ÑÙÝ Ù Ò ÕÙ × ÙÒ ÙÒ ÓÒ                 ×Ô Ö× ÓÒ¸ ר ÔÙ    Ô Ö Ö Ò ÙÒ × Ö
 ÓÐ × ÓÒ × Ý¸ ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ò Ö Ö × Ö Ñ ÒØ Ð × ÑÔ ÒÓ ÙÒ Ø Ð × º Ä
Ñ Ð ×Ù ÖØ ¸ ÑÔÖÓ Ð Ò Ð Þ Ö Ô ÖÓ ÔÓ× Ð ¸ ÒÓ Ò × Ö Ñ ÒØ ÔÓ Ö × Ö Ð Ù× ÒØ
   ÙÒ × Ö        ÓÐ × ÓÒ ×º ËÙÔÓÒ ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ ÕÙ × Ø Ò ÓÒÓ Ñ ÒØÓ Ü ØÓ
Ð ÙÒ ÓÒ × ÕÙ × ÑÔÐ Ò Ð ÙÒ Ø ÖÑ Ò                     ÔÐ ÓÒº ÈÙ Ö Ó ÙÖÖ Ö ÕÙ ×
 ÓÒÓ Ñ ÒØÓ × ÙØ Ð Ô Ö Ò Ö Ö Ò× Ö ÓÒ × ÓÐ Ò ÒØ × ÕÙ            Ö Ò Ð × ÑÔ ÒÓº
452                                                               Cap´
                                                                     ıtulo 5. Tablas hash



     ÙÖ Ó× Ñ ÒØ ¸ Ø Ð ÓÑÓ ÐÓ ×ØÙ ÑÓ× ÓÒ Ð ÕÙ ×ÓÖØ ´Ü ¿º¾º¾º ´Ô Ò ½ ¾µµ¸ ÙÒ
ÑÒÖ          Ú Ø Ö Ð Ñ Ð ×Ù ÖØ ¸ × ÓÑÓ Ø Ñ Ò Ò ×Ø ×Ó¸ Ð Ñ Ð ¸ × Ñ ÒØ
 Ð ØÓÖ Þ ÓÒ ÐÓ ÕÙ ÕÙ Þ ÕÙ Ú Ð              Ö ÕÙ Ð Ñ Ð ×Ù ÖØ × ÓÑ Ø ÓÒ Ð Þ Ö¾½ º
    ÍÒ × ÑÔÐ Ñ Ò Ö           Ð ØÓÖ Þ Ö × Ù× Ö Ó× ÙÒ ÓÒ ×     ×Ô Ö× ÓÒ h1(k) Ý h2(k)º
  Ù Ò Ó Ó ÙÖÖ ÙÒ Ò× Ö ÓÒ¸ × × Ð ÓÒ Ð Þ Ö ÒØÖ h1 Ý h2 Ð ÙÒ ÓÒ × ÕÙ ×
 ÑÔÐ Ö º Ù Ò Ó × Ö ÕÙ Ö Ù× Ö¸ × ÓÑ ÒÞ ÓÒ Ù ÐÕÙ Ö                  Ð × ÙÒ ÓÒ ×º Ë Ð
 Ð Ú × Ò Ù ÒØÖ ¸ ÒØÓÒ × ÕÙ ÐÐ × Ð ÙÒ ÓÒ ÓÒ ÕÙ ÔÙ Ó              Ö× Ò× ÖØ Ó¾¾ ÐÓ
 ÓÒØÖ Ö Ó¸ × ÔÖÙ      ÓÒ Ð ÓØÖ ÙÒ ÓÒº
    Ç Ú Ñ ÒØ ר Ø Ò ÒÐ ÒØ ÐÓ× Ð ÓÖ ØÑÓ׸ Ô ÖÓ ÓÑ Ø Ð ÙÒ Ñ Ð × × Ó Ò Ð
× ÙÒ          Ò× Ö ÓÒ Ð Ú ×º
     Ò Ð Ñ ×ÑÓ ×Ô Ö ØÙ Ð ØÓÖ Þ ÓÒ¸ Ò ÐÙ Ö Ù× Ö Ý × Ó Ö × ÑÙÐØ Ò Ñ ÒØ Ó×
Ó Ñ × ÙÒ ÓÒ ×        ×Ô Ö× ÓÒ¸ ÔÓ Ö ÑÓ× × Ð ÓÒ Ö ÙÒ Ð Þ Ö         Ú Þ ÕÙ Ð Ø Ð ¹
Ú Ò Ú º ר Ø Ø ÒÓ Ö                   Ò ÐÓ ×ÓÐÙØÓ Ð × ÑÔ ÒÓ Ý ÖÓÑÔ ÓÑÔÐ Ø Ñ ÒØ
 Ð ÙÒ × × Ó × ÓÖØÙÒ Ó Ó Ñ Ð Ó×Óº
    Ä × Ù ÒØ ¬Ò ÓÒ ×Ø Ð ÙÒ Ö ÕÙ Ö Ñ ÒØÓ ÕÙ                  ÙÒ ÓÒ ÙÒØÓ ÙÒ ÓÒ ×
     ×Ô Ö× ÓÒ      ÔØ Ð × ¾¿


Definici´n 5.3 (Familia universal de funciones hash) Ë
       o                                                                  H = {h0(k), h2(k), . . . , hW−1(k)}
ÙÒ ÓÐ ÓÒ ÙÒ ÓÒ ×           ×Ô Ö× ÓÒ × ÙÒ ÓÑ Ò Ó K                     Ð Ö Ò Ó [0, M)º Ë          ÕÙ
H × ÙÒ Ú Ö× Ð × Ý ×ÓÐÓ ×

                                      |{∀hi, hj ∈ H | hi(k1) = hj(k2)}|   1
                    ∀k1, k2 ∈ K =⇒                                      ≤
                                                      |H|                 M

     Ó ÓØÖÓ ÑÓ Ó¸ Ð Ñ Ü ÑÓ Ô ÖÑ Ø Ó ÓÐ × ÓÒ × ÕÙ ÔÙ Ò Ó ÙÖÖ Ö ÓÒ Ó× Ô Ö ×
    Ð Ú × × ÐÓ ×ÙÑÓ H/Mº
   À × Ó ÑÓ×ØÖ Ó ÕÙ Ô Ö ÙÒ Ñ Ð ÙÒ Ú Ö× Ð               Ö Ò Ð |H| Ð × ÑÔ ÒÓ ×
 ÓÑÔÐ Ø Ñ ÒØ ÕÙ Ô Ö Ð Ò ØÓ × Ð × ×ØÖ Ø × Ö ×ÓÐÙ ÓÒ ÕÙ ÑÓ× ×ØÙ Ó ¾ º
Á Ù ÐÑ ÒØ ¸ ×     ÑÓ×ØÖ Ó¾ ÕÙ Ô Ö K = {0, 1, . . . , M − 1} | |K| = L Ý
                              hi,j(k) = (ik + b) ÑÓ L    ÑÓ   M       ,                       ´ º ¿µ
 ÒØÓÒ ×
                              H = {hi,j(k) | 1 ≤ i ≤ L ∧ 1 ≤ j ≤ L}               ´º µ
       Ì Ò ÑÓ׸ Ô٠׸ ÙÒ Ñ ØÓ Ó Ô Ö      ×ÔÓÒ Ö    L   ÙÒ ÓÒ × × Ý Ö Ð Þ Ö Ð ØÓÖ Þ ÓÒº

5.2.7      Dispersi´n perfecta
                   o
À Ý Ó × ÓÒ × Ò ÕÙ Ð ÓÒ ÙÒØÓ Ð Ú × Ò Þ Ö × ¬Ò ØÓ Ý ÓÒÓ Óº Ò ×Ø ×Ó¸ ×
ÔÓ× Ð × Ò Ö ÙÒ ÙÒ ÓÒ × Ý Ø Ú Ý ÓÑÔÐ Ø ¸ ÓÒ ¬ Ò                ÓÑÔÙØÓ O(1)¸
ÕÙ Ñ Ô ØÓ Ó Ð ÓÒ ÙÒØÓ         ÐÚ×     Ð Ö Ò Ó [0, M)º Ð Ø ÑÔÓ      ×Ó ×Ø
  Ö ÒØ Þ Ó × Ö O(1) Ý ÒÓ × Ö ÕÙ Ö Ñ Ò Ö ÓÐ × ÓÒ × ´Ð ÙÒ ÓÒ × × Ý Ø Ú µº
  ¾½
        Þ Ö ÔÖÓÚ Ò      Ð Ö      Þ Ö ÕÙ × Ò ¬             Ó ¸ Ô ÖÓ Ø Ñ Ò ­ÓÖ × º
  ¾¾
     ÆÓØ ÑÓ× ÕÙ ÔÙ        Ó ÙÖÖ Ö h1 (k) = h2 (k)¸ Ö ÞÓÒ ÔÓÖ Ð Ù Ð ÒÓ × ÔÙ × Ö Ù Ð Ù Ð ÙÒ ÓÒ
Ù× Ô Ö Ò× ÖØ Öº
  ¾¿
     Ä ÓÒÒÓØ ÑÓ×          ÔØ Ð × ÔÓÖÕÙ Ð ¬Ò ÓÒ × Ö Ð ÞÓ ÔÓר Ö ÓÖ            ÐÓ× × Ù Ö Ñ ÒØÓ׺
  ¾
     ÈÙ     ÓÒ×ÙÐØ Ö×   ÓÖÑ Ò¸ Ä × Ö×ÓÒ Ý Ê Ú ×Ø Ó ÃÒÙØ ½ º
  ¾
      ÓÒ×ÙÐØ × Ä Û ×¹   Ò Ò Ö ¾¿ Ô Ö Ø ÐР׺
5.3. Otros usos de las tablas hash y de la dispersi´n
                                                       o                            453



          ÙÒ ÙÒ ÓÒ × ÓÑÓ Ð × Ö Ø × Ð ÒÓÑ Ò Ô Ö Ø Ý Ü ×Ø Ò Ú Ö ×
    Ø Ò × Ý ÔÖÓ Ö Ñ × ÓÒ×ÙÑ Ó× Ô Ö Ò Ö Ö Ð ÙÒ ÓÒ Ò Ù ×Ø ÓÒº
        Ë Ò Ð × × ØÙ ÓÒ × Ò ÕÙ × ÓÒÓ ØÓ Ó Ð ÓÒ ÙÒØÓ Ð Ú × ×ÓÒ Ó × ÓÒ Ð ×¸ Ø Ñ¹
    ÔÓ Ó ×ÓÒ Ü Ô ÓÒ Ð ×º ÓÒ× Ö ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ ÙÒ       ÓÒ Ö Ó Ö Ò × Ö Ö Ó
     ר Ø Ñ ÒØ Ò ÙÒ Î º Ò ×Ø ×Ó¸ Ú Ð Ô Ö Ø Ñ ÒØ Ð Ô Ò Ö Ö Ò Ñ ÑÓÖ
    ÙÒ ÙÒ ÓÒ × Ô Ö Ø ÕÙ Ñ Ô Ð Ô Ð Ö                Ð Ù    ÓÒ × Ò Ð Î º
         Ò GNU Ü ×Ø ÙÒ Ü Ð ÒØ Ý Ò Ö Ð ÔÖÓ Ö Ñ ¸ ÐÐ Ñ Ó gperf ½ ¸ Ô Ö Ò Ö Ö ÙÒ¹
      ÓÒ × × Ô Ö Ø × Ù ÐÕÙ Ö Ø ÔÓ Ð Ú º

    5.3     Otros usos de las tablas hash y de la dispersi´n
                                                          o
    5.3.1   Identificaci´n de cadenas
                       o
    Ë ÙÒ Ð ÓÒ            ÙÒ ÙÒ ÓÒ        ×Ô Ö× ÓÒ¸ ר ÔÙ ÙØ Ð Þ Ö× ¸ ÓÒ ÔÖÓ Ð
     Ø ÒÓ Ò ÙÒ ÓÒ          Ð      Ð ÙÒ ÓÒ × ¸ Ô Ö Ö ÓÒÓ Ö ÙÒ ×Ù ¹× Ù Ò             ÒØÖÓ
        ÓØÖ º Ä       ÙÒ Ñ ÒØ Ð × ÕÙ Ô Ö Ó× × Ù Ò × s1 = s2 Ð ÔÖÓ Ð                 ÕÙ
    h(s1) = h(s2) × ×Ø ÒØ         × Ð ÙÒ ÓÒ × × Ù Ò º
          ר × Ð ÔÖ Ò Ô Ó      Ð ÓÖ ØÑÓ×      Ù×ÕÙ        Ô ØÖÓÒ × Ò×Ô Ö Ó× Ò ÙÒ Ð Ö
     Ð ÓÖ ØÑÓ ÐÐ Ñ Ó         Ê Ò¹Ã ÖÔ ½ ¸ Ò ÓÒÓÖ Ð × ÔÖ Ñ Ö × Ô Ö×ÓÒ × ÕÙ ÐÓ ×¹
     Ù Ö ÖÓÒº Ù ÓÖ Ò ÐÑ ÒØ ÓÒ             Ó Ô Ö Ð Ù×ÕÙ           ×Ù ¹ Ò ×       Ö Ø Ö ×º
    Ä         × Ð ÙÐ Ö ÔÖ Ú Ñ ÒØ ÙÒ Ù ÐÐ          Ø Ð Ö ´¬Ò ÖÔÖ ÒØµ Ò Ð × Ù ÒØ ÓÒØ ÜØÓ
     Ð ÓÖ ØÑ Ó C»C++
¿      Ð ÓÖ ØÑÓ Ò Ó Ê Ò¹Ã ÖÔ ¿ ≡
     int rabin_karp_search(char * str, char * sub)
     {      // guardar longitudes de las cadenas involucradas
       const size_t m = strlen(sub);
       const size_t n = strlen(str);
            Ð ÙÐ Ö Ò Ô ×Ù Ý Ô ÙÖÖ Ù ÐÐ ×     Ø Ð Ö × ×Ù Ý   ×ØÖ ¼
          ÅÙÐØ ÔÐ Ò Ó Ø      Ù ÐÐ   ØÐ Ö
             // recorrer la cadena str en b´squeda de la sub-cadena sub
                                           u
         for (int i = 0; i < n - m + 1; ++i)
           {
             if (fp_sub == fp_curr) // ¿coinciden las huellas digitales?
               {     // s´ ==> verificar si &str[i] se corresponde con la sub-cadena
                         ı
                 for (char * aux = str[i], int k = 0; k < m; ++k)
                   if (aux[k} != sub[k])
                     break; // falso positivo
                 return i; // str[i] contiene la cadena
               }
                Ð ÙÐ Ö Ù ÐÐ    Ø Ð Ö Ô ÙÖÖ Ô Ö ×ØÖ ·½
           }
         return -1; // sub-cadena no se encuentra
     }
     ÓÑÓ Ú ÑÓ׸ Ð Ð ÓÖ ØÑÓ × ×ØÖÙ ØÙÖ ÐÑ ÒØ × ÑÔÐ Ý ÑÙÝ × Ñ Ð Ö Ð Ù×ÕÙ      Ò
    ÖÙØÓ Ð ×Ù ¹ Ò ¸ Ð Ù Ð × O(n × m)º         ×ØÓ × ×ÔÖ Ò Ó × ÖÚ Ö ÕÙ Ô Ö ÕÙ
    Ð Ð ÓÖ ØÑÓ Ê Ò¹Ã ÖÔ Ú Ð Ð Ô Ò Ö ×Ô ØÓ Ð Ù ÖÞ ÖÙØ ×               Ò ÙÑÔÐ Ö
    Ó× Ó× ×
454                                                                            Cap´
                                                                                  ıtulo 5. Tablas hash



   ½º Ð Ð ÙÐÓ Ð ÐÓÕÙ             Ð ÙÐ Ö Ù ÐÐ       Ø Ð Ö Ô ÙÖÖ Ô Ö ×ØÖ ·½
      × Ö Ö Ô Ó¸ O(1)¸ ÔÖ Ö Ð Ñ ÒØ º
   ¾º Ä ÒØ              Ð×Ó× ÔÓ× Ø ÚÓ×       × Ö Ô ÕÙ Ò ¸ ÔÙ × ×Ù Ó ÙÖÖ Ò  ÖÖ Óѹ
      Ô Ö Ö ÐÓ× m Ö Ø Ö × Ð ×Ù ¹ Ò º ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ò Ð Ñ                  Ò ÕÙ ×
        Ø Ø Ò Ñ × Ð×Ó× ÔÓ× Ø ÚÓ¸ Ð Ð ÓÖ ØÑÓ Ê Ò¹Ã ÖÔ Ø Ò Ö                O(n × m)
      × Ñ ØÖ Ñ ÒØ ¸ Ñ ÒÓ× Ð×Ó× ÔÓ× Ø ÚÓ× Ö Ò Ð Ð ÓÖ ØÑÓ O(n)º
     Ð Ð ÙÐÓ Ð Ù ÐÐ            Ø Ð Ö ÒÓ × ÓØÖ Ó× ÕÙ ÙÒ ÙÒ ÓÒ × ¬Ò ¸ ×Ó Ö
ÙÒ       Ò       Ö Ø Ö × Ò Ö ×ØÖ Ð × Ù ÒØ Ñ Ò Ö
                                           | ×ØÖ |−1
                            h(רÖ) =                   רÖi ×B| ×ØÖ |−1−i ÑÓ   M   ;              ´º µ
                                             i=0

 ÓÒ     B      ×Ð× Ð × ×Ø Ñ       Ó ¬ ÓÒ ´Ö ܵ ÙÒ × Ñ ÓÐÓ Ô ÖØ Ò ÒØ ÙÒ
    Ò       Ö Ø Ö × Ý ×ØÖi × Ð i¹ × ÑÓ × Ñ ÓÐÓ Ð × Ù Ò ×ØÖº
     × Ñ Ò ×Ø Ö Ö ÓÖ Ö Ü º¾º º½ ´Ô Ò          µ Ð ÔÖÓÔ  ×ØÖ ÙØ Ú ÕÙ ÒÓ× Ò
ÕÙ Ð Ö ×ØÓ Ð ×ÙÑ × Ù Ð Ð Ö ×ØÓ Ð ×ÙÑ ÐÓ× Ö ×ØÓ×        ¾ Ó ×

                (i + k) ÑÓ M = (i ÑÓ M) + (k ÑÓ M) ÑÓ M .               ´º µ
Ä ÔÖÓÔ          ×ØÖ ÙØ Ú Ð ÑÓ ÙÐÓ Ø Ñ Ò × ÔÐ Ð ÔÖÓ Ù ØÓ × Ö
                   (ik) ÑÓ M = (i ÑÓ M)(k ÑÓ M) ÑÓ M .                  ´º µ
  ÔÖ Ò Ö Ð Ö Ø Ö ×ØÖ ÙØ ÚÓ Ð ÑÓ ÙÐÓ ÒÓ× × ÑÙÝ ÙØ Ð ÔÓÖÕÙ ÒÓ× Ô ÖÑ Ø Ð ÙÐ Ö
´ º µ Ò ÙÒ ÓÒ ÐÓ× ÑÓ ÙÐÓ×
                    | ×ØÖ |−1
      h(רÖ)    =               רÖi ×B| ×ØÖ |−1−i ÑÓ M             ÑÓ M
                      i=0
                    | ×ØÖ |−1
                =               (רÖi ÑÓ M) B| ×ØÖ |−1−i        ÑÓ M      ÑÓ M         ÑÓ M
                      i=0
                    | ×ØÖ |−1
                =               (רÖi ÑÓ M) (B| ×ØÖ |−1−i        ÑÓ M) ÑÓ M        ÑÓ M       ÑÓ M;
                      i=0
                                                                                                  ´ º µ
 ÐÓ Ù Ð × ×ÙÑ Ñ ÒØ Ö Ò Ó×Ó¸ ÔÙ × ÒÓ× Ú Ø ÔÖ Ó ÙÔ ÖÒÓ× ÔÓÖ Ð Ú ÒØÙ Ð × ÓÖ
ÒÙÑ Ö Ó Ð × ×ÙÑ × Ý ÔÓØ Ò ×º
   Ê Ò Ý Ã ÖÔ ½ ÑÙ ×ØÖ Ò ÓÑÓ h(רÖ) ×Ô Ö× ÑÙÝ Ò ÓÒ ÓÖÑ Ð Ú ÐÓÖ M
× × Ð ÓÒ ÓÑÓ ÙÒ ÒÙÑ ÖÓ ÔÖ ÑÓº
     ÓÒ Ð ÓÒÓ Ñ ÒØÓ ´ º µ¸ ÔÓ ÑÓ× Ó ¬ Ö Ð ÐÓÕÙ Ò Ð
   Ð ÙÐ Ö Ò Ô ×Ù Ý Ô ÙÖÖ Ù ÐÐ × Ø Ð Ö × ×Ù Ý ×ØÖ ¼     ≡    ´ ¿µ
 const size_t radix = 256; // radix de un s´mbolo
                                            ı
 size_t fp_sub = 0;
 size_t fp_curr = 0;
 for (int i = 0; i < m; ++i)
   {
     fp_sub = (radix*fp_sub + sub[i]) % M;
     fp_sub = (radix*fp_curr + str[i]) % M;
   }
 ¾
     Î × Ø Ñ Ò ´ º µ Ý Ð ÒÓØ           Ô         Ð Ô Ò          º
5.3. Otros usos de las tablas hash y de la dispersi´n
                                                   o                             455



 Ð ÐÓÕÙ ØÓÑ O(m)º Ä Ù ÐÐ          Ø Ð Ö pf sub ×ÓÐÓ × Ð ÙÐ ÙÒ Ú Þ¸ Ô ÖÓ Ð     Ð
×Ù ¹ Ò         ×ØÖ Ò Ð ÔÓ× ÓÒ i         Ð ÙÐ Ö× n − i Ú ×º Ë Ù× Ö ÑÓ× Ð Ñ ×ÑÓ
ÔÖÓ Ñ ÒØÓ ÕÙ Ô Ö Ð ÐÓÕÙ          Ð ÙÐ Ö Ò Ô ×Ù Ý Ô ÙÖÖ Ù ÐÐ × Ø Ð Ö × ×Ù Ý
   ×ØÖ ¼ ¸ ÒØÓÒ × Ð Ð ÓÖ ØÑÓ Ê Ò¹Ã ÖÔ × Ö O(n × m) ÓÒ ÙÒ Óר ÓÒר ÒØ
Ñ ÝÓÖ ÕÙ Ð Ð ÓÖ ØÑÓ Ù ÖÞ ÖÙØ º Ð ØÖÙ Ó Ð Ð ÓÖ ØÑÓ Ö × Ò ÕÙ Ð Ù ÐÐ            ØÐ
Ô Ö Ð ×Ù ¹ Ò ×ØÖi+1 ÐÓÒ ØÙ m¸ ÕÙ Ö ×ÙÑ Ö ÑÓ× ÓÑÓ h(רÖi+1)¸ ÔÙ          Ð ÙÐ Ö×
 Ò Ø ÑÔÓ Ò Ô Ò ÒØ m Ò ÙÒ ÓÒ Ð Ú ÐÓÖ ÔÖ Ú Ó h(רÖi) ØÓ Ó ÐÓ ÕÙ               ÑÓ×
    Ö × Ö ×Ø ÖÐ h(רÖi+1) Ð ÔÖ Ñ Ö ×ÙÑ Ò Ó h(רÖi)¸ ÔÙ × ×Ø Ý ÒÓ × Ô ÖØ
Ð Ù ÐÐ      Ø Ð¸ Ý Ò ÖÐ Ð ÒÙ ÚÓ ×ÙÑ Ò Ó Ô Ö ×ØÖi+1º       ×ØÓ ×   Ù ÓÑÔÙØ Ö
h(רÖi+1) × ÙÒ

               h(רÖi+1) = B h(stri) + רÖi+m − Bm   רÖi ÑÓ   M    ;          ´º µ
 ר Ø Ò × ÐÐ Ñ          ×Ô Ö× ÓÒ ÒÖÓÐÐ ´ × ÖÓÐÐ           µº       Ó ×ØÓ× Ø ÖÑ ÒÓ׸ Ð
Ú ÐÓÖ fp curr Ô Ö Ð i¹ × Ñ Ø Ö ÓÒ × Ð ÙÐ ×
    Ð ÙÐ Ö Ù ÐÐ Ø Ð Ö Ô ÙÖÖ Ô Ö ×ØÖ ·½  ≡                           ´ ¿µ
 fp_curr = (radix*(fp_curr - str[i]*fact) + str[i + m]) % M;

ÅÙÐØ ÔÐ Ò Ó    Ø     Ù ÐÐ   ØÐ Ö     ≡                              ´ ¿µ
 const size_t fact = (size_t) pow(radix, m - 1); // radix^(m-1)

      Ð Ñ ØÓ Ó       Ù ÐÐ   Ø Ð Ö × ÔÐ     ÙÒ ÑÔÐ ÒØ           × ØÙ ÓÒ ×º Ò
ÔÖ Ñ Ö ÐÙ Ö¸ Ð Ð ÓÖ ØÑÓ ÔÙ          Ö× Ñ × Ò Ö Ð Ô Ö Ö ÓÒÓ Ö Ô ØÖÓÒ × Ó ØÖ ¹
   Ñ Ò× ÓÒ Ð × × ÐÓ× Ó ØÓ× Ò Ð ÔÐ ÒÓ Ó ×Ô Ó × ÓÒ× Ö Ò ÓÑÓ Ñ ØÖ × Ó ÖÖ ÐÓ×
ØÖ Ñ Ò× ÓÒ Ð ×¸ ÐÓ× Ù Ð ×¸ Ð ¬Ò Ù ÒØ ׸ Ô Ö Ò Ò × Ù Ò ×º
    ÍÒ Ò Ò             ר Ð ÓÖ ØÑÓ × ÕÙ Ð ÐÓÒ ØÙ    Ð ×Ù ¹× Ù Ò       Ù× Ö ÒÓ
 Ò       ÙÖ ÒØ Ð ÖÖ Ó Ð × Ù Ò Ò Ð ÕÙ × Ù× ×ØÓ ÓÒØÖ ×Ø ÓÒ ÓØÖÓ×
 Ð ÓÖ ØÑÓ× ÕÙ × ÒÐ ÒØ Ò Ñ           ÕÙ Ð × Ù Ò      Ù× Ö × Ñ ÝÓÖ ÐÓÒ ØÙ º
      Ð Ú ÐÓÖ M ÔÙ × Ð ÓÒ Ö× Ð ØÓÖ Ñ ÒØ ¸ Ñ Ò Ö Ø Ð ÕÙ ÙÒ ÔÓØ Ø Ó
   Ú Ö× Ö Ó ÒÓ ÔÙ      Ø Ö Ð Ð ÓÖ ØÑÓ ÓÐÓ Ò Ó ÓÑÓ ÙÒ ÒØÖ ÙÒ × Ù Ò
  Ù× Ö ÕÙ Ù× ÑÙ × ÓÐ × ÓÒ ×º
      ÓÑÔ ÖØ Ö Ð Ö Ñ ÒØ Ð ÓÒÓ Ñ ÒØÓ × ÙÒ ÓÒ ÓÒ × Ò Ð Ô Ö × Ö × Ö ÙÑ ÒÓº
È ÖÓ Ù Ö× Ð Ñ Ö ØÓ ÓØÖÓ ÒÓ ×ÓÐÓ ÔÙ           ÖÖ Ö ÜÔÐÓØ ÓÒ Ð ÔÖÓ ÑÓ¸ × ÒÓ ÕÙ
Ú ÓÒØÖ Ð × Ò          Ð Ú Ò ÓÑÙÒ º Ð Ù Ö× Ð× Ñ ÒØ ÙÒ × Ù Ö Ñ ÒØÓ
×Ò        ÖÐÓ    Ó × Ð ÒÓÑ Ò ÔÐ Ó º Ò Ð × Ù Ö Ñ ÒØÓ              ׸ × ÓÑÓ Ò
 Ù ÐÕÙ Ö ÓØÖÓ Ó Ö Ö¸ × ÔÙ ÔÐ Öº È Ö ÐÓ × Ö ØÓ¸ Ý Ò Ò Ö Ð Ô Ö ØÓ ÔÖÓ Ù ÓÒ
Ö ÔÖ × ÒØ Ð ÓÑÓ ÙÒ × Ù Ò ¸ ÔÙ ÑÓ ¬ Ö× Ð Ð ÓÖ ØÑÓ Ê Ò¹Ã ÖÔ Ô Ö
Ú Ö ¬ Ö ÙØÓÑ Ø Ñ ÒØ × Ú ÒØÙ ÐÑ ÒØ ×          ÓÑ Ø Ó Ð ÙÒ ÔÐ Óº Ò ×Ø ×Ó¸ ×
  × Ò ÙÒ ÙÒ ÓÒ × ÕÙ ÑÓ Ð Ð × Ù Ò ×Ó×Ô Ó× ÔÐ Óº
5.3.2   Supertraza
Ä ÓÑÔÙØ ÓÒ ×Ø ÐÐ Ò          ÔÖÓ Ð Ñ × ÕÙ Ñ Ò Ò ÓÒ ÙÒØÓ×          ØÓ× ÑÙÝ Ö Ò ×
ÑÙ Ó×        ÐÐÓ× ÒØÖ Ø Ð × Ò Ð × ÒØ Ó ÕÙ Ð ÒØ                 ØÓ× × ÜÔÓÒ Ò Ðº
À Ý Ó × ÓÒ × Ò Ð × Ù Ð × ÙÒ ØÓ Ó Ö ×ÙÐØ Ó         Ù Ö Ö×      ØÓ× ÒÓ Ö Ô Ø Ö ×Ù
  Ð ÙÐÓ Ý¸ ×Ó Ö ØÓ Ó¸ ÒÓ Ö Ô Ø Ö ÐÓ× ØÓ× ÕÙ ×Ù Ò Ð Ö Ò × Ù ÖØÓº
      ÓÒ× Ö ÑÓ× ÙÒ × Ù Ò        ÒÖ         ØÓ× < d1 −→ d2 −→ d3 −→ · · · −→ dn >
Ø Ð ÕÙ d2 Ô Ò        Ð Ð ÙÐÓ d1 Ý × × Ù Ò Ð Ý Ò Ö Ñ ÒØ Ô Ö ØÓ Ó ØÓ di+1¸
456                                                           Cap´
                                                                 ıtulo 5. Tablas hash



ÕÙ Ö ÕÙ Ö Ð ÙÐ Ö diº Ä                   ÙÖ Ö           ØÓ di Ò ÙÒ Ø Ð × × ÕÙ ¸ × ÙÒ
Ð Ò ÓÐ Ð ÔÖÓ Ð Ñ ¸ ÔÙ Ó ÙÖÖ Ö ÕÙ Ð Ð ÙÐÓ ÙÒ ØÓ di Ô Ö Þ Ö Ô Ø Ó × ×Ø
  × Ð ×Ó¸ ÒØÓÒ ×¸ Ð Ð ÙÐÓ ØÓ Ð × Ù Ò ×Ù ¹× Ù ÒØ di ´di+1 −→ di+1 −→
· · · −→ di+k >µ × Ö Ô Ø       ÒÙ ÚÓº
      ÌÓÑ ÑÓ× ÓÑÓ ÑÔÐÓ ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ù ÖÞ ÖÙØ × Ù Ö Ñ Ò Ö × ÓÐÓ Ö
n Ö Ò × Ò ÙÒ Ø Ð ÖÓ               Ö Þ × Ò ÕÙ ×Ø × × Ñ Ò Òº × Ö¸ ÓÑ ÒÞ ÑÓ× ÔÓÖ
  ÓÐÓ Ö ÙÒ Ö Ò Ò Ð × ÕÙ a1 Ý ÔÖÓ× Ù ÑÓ× Ö ÙÖ× Ú Ñ ÒØ ÓÐÓ Ö Ð × Ù ÒØ Ò
Ð × ÙÒ             × ÕÙ × b × Ò ÕÙ ×Ø Ñ Ò                 a1º ÓÑ ÒÞ Ò Ó ÔÓÖ b1 Ú ÑÓ× ÕÙ
Ð Ö Ò Ñ Ò Þ Ð ÔÙ ×Ø Ò a1 ÐÓ Ñ ×ÑÓ Ó ÙÖÖ × Ð ÓÐÓ ÑÓ× Ò b2º ר × Ó×
  ÓÑ Ò ÓÒ ×¸ ÕÙ ¬Ò Ø Ú Ñ ÒØ ÒÓ ÓÒ Ù Ò Ð ×ÓÐÙ ÓÒ¸ ×ÓÒ ÓÒÚ Ò ÒØ × Ù Ö ÖÐ ×
         ØÓ× ÕÙ ¸ Ò ÙÒ Ø Ð ÖÓ n × n × ÕÙ × ÒÓ Ö Ô Ø ÑÓ× Ð Ð ÙÐÓ Ò Ú ÒÓº È Ö
  ÐÐÓ¸ Ð × Ù Ò ÜÔÐÓÖ × Ù Ö Ò ÙÒ Ø Ð º
        ÙÒÕÙ Ð ÔÖÓ Ð Ñ ÒØ Ö ÓÖ ÔÙ Ö ×ÓÐÚ Ö× × Ò Ò ×                    ÙÒ Ø Ð ¸ ר ÐÙרÖ
  Ó× ×Ô ØÓ× ÒØ Ö × ´½µ Ð                    Ù Ö Ö ×Ø Ó         Ð ÙÐÓ Ô Ö Ú Ø Ö Ö Ô Ø ÓÒ Ý
´¾µ Ð          Ó ÕÙ ÓÒ ÓÖÑ ÙÑ ÒØ Ð Ñ Ò× ÓÒ Ð Ø Ð ÖÓ Ý Ð ÒØ                           Ö Ò×
  ÙÑ ÒØ Ð ÒØ                ר Ó׺ È Ö ÙÒ Ø Ð ÖÓ          Ñ Ò× ÓÒ n ÑÙÝ Ö Ò ¸ Ð ÒØ
       ר Ó× ÔÙ × Ö Ò ÓÖ Ð º
        Ò Ð ÓÑ Ò Ó Ð ÜÔÐÓÖ ÓÒ Ö Ó× Ò Ñ Ó× ×Ø Ó¸ × × Ù Ö Ó ÙÒ ÑÙÝ
 ÒØ Ö × ÒØ Ø Ò ÐÐ Ñ             ×ÙÔ ÖØÖ Þ ½ º Ò ÐÙ Ö Ù Ö Ö ÒØ Ö Ñ ÒØ Ð ×Ø Ó
        Ð ÙÐÓ¸ × × Ò ÙÒ ÙÒ ÓÒ            ×Ô Ö× ÓÒ Ý × Ñ Ö Ò ÙÒ Ø Ð           Ø× ×Ù Ô Ö ÓÒº
   ר Ñ Ö         ÙÑ ÒØ ÓÒ× Ö Ð Ñ ÒØ Ð Ô                        ÐÑ Ò Ñ ÒØÓ¸ ÔÙ × ×ÓÐÓ ×
Ö ÕÙ Ö ÙÒ Ø ÔÓÖ ×Ø Ó¸ ÐÓ ÕÙ ÙÑ ÒØ Ð Ô                            ØÖ Ø Ö ÓÒ Ð × Ð Ð ÔÖÓ¹
  Ð Ñ º Ë Ò Ñ Ö Ó¸ ÒÓ Ý Ñ Ò Ö Ø ÖÑ Ò ×Ø                    × Ö × ÙÒ × ÐÑ Ò Ó Ò Ð
Ø Ð ÓÖÖ ×ÔÓÒ Ð ×Ø Ó ØÙ Ð                    Ð ÙÐÓ Ó × ØÖ Ø ÓØÖÓ ×Ø Ó ÕÙ Ù× ÓÐ × ÓÒº
   Ò ÓØÖ × Ô Ð Ö ×¸ × ÑÔÓ× Ð Ö ÒØ Þ Ö ÕÙ ØÓ Ó× ÐÓ× ×Ø Ó× × Ù Ö Òº
      ÁÑÔÓ× Ð        Ò Ö ÒØ Þ Ö ÒÓ Ü ÐÙÝ ×Ù ÔÖÓ Ð º Ä Ò ÖØ ÙÑ Ö ÒØ Ö ÓÖ ×
  Ø          ÙØ Ò Ó Ð Ø Ò ÓÒ ×Ø ÒØ × ÙÒ ÓÒ × ×                 Ñ Ò Ö Ó Ö Ö ÙÒ Ù Ò
  ÜÔ Ø Ø Ú         Ù Ö Ö ØÓ Ó× ÐÓ× ×Ø Ó× ÔÓ× Ð ×º
5.3.3   Cache (el TAD Hash Cache<Key,Data> )
ÍÒÓ ÐÓ× ÔÖ Ò Ô Ð × Ù×Ó× Ð × Ø Ð ×       ×Ô Ö× ÓÒ × Ð ÒרÖÙÑ ÒØ              ÓÒ      ׺
   ÍÒ       × ÙÒ Ø Ð ×Ó Ø Ú ¸ ¬Ò Ø Ô ÖÓ          ×Ó Ö Ô Ó¸ ÕÙ ×              ÓÐÓ ÒØÖ ÙÒ
ÔÖÓ Ö Ñ Ý ÙÒ ÓÒ ÙÒØÓ      ØÓ׺ È Ö ÕÙ × Ö ÓÑÔ Ò× Ð ÙØ Ð Þ ÓÒ                 ÙÒ    ¸ ר
     × Ö ÑÙ Ó Ñ × Ö Ô Ó ÕÙ Ð × ÑÔÐ      ×Ó Ð ÓÒ ÙÒØÓ       ØÓ׺ È           ØÓÖ Ñ ÒØ ¸ Ð
 ×ÙÒØÓ ÔÙ ÒØ ÖÔÖ Ø Ö× Ð × Ù ÒØ ÑÓ Ó



                 Programa                                Medio contentivo
                     a                Cache a               de datos
                 velocidad           velocidad             a velocidad
                                        Vc                     Vd
                    Vp
5.3. Otros usos de las tablas hash y de la dispersi´n
                                                   o                                    457



  Ò ÙÒ × ØÙ ÓÒ Ð ÓÖ ØÑ ¸ Ð ÔÖÓ Ö Ñ ×               ÙØ ÙÒ Ú ÐÓ           vp Ý            ØÓ×
   ÙÒ ÓÒ ÙÒØÓ ÕÙ ÓÔ Ö Ú ÐÓ             vdº Ð        ¸ ÓÔ Ö Ú ÐÓ         vc | vp < vc < vdº
      ר ÑÓ Ó¸ Ù Ò Ó × × Ù× Ö ÙÒ ØÓ¸ × Ö Ú × ÔÖ Ñ ÖÓ Ð                      ݸ × × Ò Ù Ò¹
ØÖ ¸ ÒØÓÒ × × Ö ÙÔ Ö Ð ØÓ × Ò Ò ×                   Ô Ö Ð Óר ÕÙ           ÖÖ         ÖÐÓ
Ú ÐÓ        vdº Ä     × ×Ùר ÒØ Ò Ð Ö Ð ¼¹¾¼ Ñ Ò ÓÒ              Ò Ü ¿º º½ ´Ô Ò ¾¾ µº
     Ä ÔÐ Ö            ÔÖÓÚ Ò Ð Ú Ö Ó ÐÓ              Ö ÕÙ × Ò ¬ × ÓÒ Ö Ý               ÐÓ
     ÐÙ× ÓÒ ÔÓÖÕÙ Ú × ×Ø × Ñ Ò ØÖ ×Ô Ö ÒØ Ñ ÒØ × Ö¸ Ð ÔÖÓ Ö Ñ
  ÐÓ× ØÓ× ×ÙÑ Ò Ó ÕÙ × Ò Ù ÒØÖ Ò Ò ÙÒ Ñ Ó ×Ô Ö Ó × Ò ÓÒÓ Ñ ÒØÓ Ö
    Ð Ü ×Ø Ò       Ð        ר × Ð × ØÙ ÓÒ¸ ÔÓÖ ÑÔÐÓ¸ Ò Ö Û Ö º ÄÓ× Ö Ò × ×
Ø Ñ Ò Ð ÐÐ Ñ Ò ÒØ ¹Ñ ÑÓÖ ´ ÒØ Ñ ÑÓ Ö µ¸ ×Ó Ö ØÓ Ó Ô Ö Ð Ö Û Ö º
     À Ý ÙÒ Ú ×Ø ÒØ             Ö ÙÒר Ò × Ò ÕÙ Ð Ù×Ó ÙÒ                        Ð   ÖÒ
 ÒØÖ ÙÒ ÑÙÝ ÐØÓ Ý ÔÓ Ö × ÑÔ ÒÓº Ä × ØÙ ÓÒ × Ø Ô × × ÔÙ Ò Ö ×ÙÑ Ö ÓÑÓ
× Ù
Medio de almacenamiento de datos distinto a memoria principal: ÐÓ× Ò Ú Ð ×
        ÐÑ Ò Ñ ÒØÓ¸ Ò ÓÖ Ò Ö ÒØ Ð Ú ÐÓ                     Ý Ö ÒØ Ð Ô                       ¸
       ÔÙ Ò Ð × ¬ Ö× ÓÑÓ
          ½º Å ÑÓÖ ÔÖ Ò Ô Ðº
          ¾º Å ÑÓÖ × ÙÒ Ö ´ × Ó× ÙÖÓ×µº
          ¿º Å ÑÓÖ Ø Ö Ö ´ ¹ÊÇŸ Î ¸ Ñ ÑÓÖ × ­ × ¸ ÒØ ×µº
           º Å ÑÓÖ Ö ÑÓØ ´ ×ÔÓÒ Ð ÔÓÖ Ö µº
         Ù Ò Ó ÐÓ× ØÓ× ÕÙ            ÙÒ ÔÖÓ Ö Ñ × Ò Ù ÒØÖ Ò Ò ÙÒ Ò Ú Ð Ñ ÑÓÖ
       Ñ × Ð ÒØÓ ÕÙ Ð Ñ ÑÓÖ ÔÖ Ò Ô Ð¸ ÒØÓÒ × ÙÒ               ÒØÖ Ð Ñ ÑÓÖ ÔÖ Ò Ô Ð Ý
        Ð Ñ Ó ÐÑ Ò Ñ ÒØÓ ÔÙ                  Ð Ö Ö ×Ùר Ò ÐÑ ÒØ Ð         Ù ÓÒº
Estructuras de datos est´ticas: ÔÓÖ Ö ÞÓÒ ×
                            a                         Ú Ö× Ò ÓÐ ¸ ÔÙ Ó ÙÖÖ Ö ÕÙ Ý
       ÕÙ ÑÔÐ Ö ÙÒ ×ØÖÙ ØÙÖ              ØÓ× ÕÙ ÒÓ ×        Ù          ÖØÓ ×Ø ÐÓ Ö Ù¹
       Ô Ö ÓÒº
       ÈÓÖ ÑÔÐÓ¸ ×ÙÔÓÒ ÑÓ× ÕÙ Ñ ÒØ Ò ÑÓ× Ò ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ ÙÒ ÓÒ¹
        ÙÒØÓ Ö ×ØÖÓ׺ Ð Ö ÓÐ × Ò Þ ÔÓÖ Ð ÙÒ Ð Ú ÔÖ Ò Ô Ð ÒÙÑ Ö ÔÓÖ Ò×¹
       Ø Ò ÙÒ ÒÙÑ ÖÓ          ÙÐ ¸ ÐÓ ÕÙ Ô ÖÑ Ø ÙÒ Ö ÙÔ Ö ÓÒ ×Ô Ö                 O(Ð (n))
       Ô Ö Ù ÐÕÙ Ö Ö ×ØÖÓº
         ÓÒ Ñ ÒÓ× Ö Ù Ò × Ö ÕÙ Ö Ö ÙÔ Ö Ö ÔÓÖ Ð ÙÒ Ð Ú Ð Ø × ÙÒ Ö
       ÙÒ Ô ÐÐ Ó¸ ÓÑÓ Ð × Ó ÖÕÙ Ø ÔÓº Ò ×Ø ×Ó¸ ÔÙ × Ö ÑÙÝ ÓרÓ×Ó¸ Ý ÔÖÓ Ð ¹
       Ñ ÒØ ÒÒ × Ö Ó¸ Ò Þ Ö Ñ ÒØ ÙÒ × ÙÒ Ó Ö ÓÐ Ò Ö Óº Ò ×Ù ÐÙ Ö¸ ÔÓ ÑÓ×
        Ù Ö Ö Ò ÙÒ        ¸ Ò Þ Ó ÔÓÖ Ô ÐÐ Ó¸ ÐÓ× Ö ×ØÖÓ× Ñ × Ö ÒØ Ñ ÒØ ÓÒ×Ùй
       Ø Ó׸ × Ò ÔÓÖ ÙÐ Ó ÔÓÖ Ô ÐÐ Ó¸ ÑÓ Ó Ø Ð ÕÙ Ú ÒØÙ ÐÑ ÒØ ÒÓ× ÓÖÖ ÑÓ×
       ÙÒ Ù×ÕÙ × Ù Ò Ð ×Ó Ö Ð ÓÒ ÙÒØÓ Ð Ú ×º
C´lculos que puedan repetirse: Ò ÑÙ × Ó × ÓÒ ×¸ × Ö ÕÙ Ö Ò Ö Ð Þ Ö Ð ÙÐÓ×
  a
        ÓÑÔÐ Ó× ×Ù× ÔØ Ð × Ö Ô Ø Ö× º Ò ×Ø ×Ó¸ ÔÓ ÑÓ× Ù Ö Ö Ò ÙÒ                          Ð
       × Ù Ò ÓÖ Ò Ö          Ð Ð ÙÐÓ Ý ×Ù Ö ×ÙÐØ Óº         ר ÑÓ Ó¸ × Ð Ò Ñ                Ð
       ÔÖÓ Ö Ñ Ö ÕÙ Ö ÒÙ ÚÓ Ð Ð ÙÐÓ¸ ר Ý × Ò Ù ÒØÖ ×ÔÓÒ Ð º
         Ò ×Ø × ØÙ ÓÒ ×Ù Ð Ù× Ö× Ô ÖØ Ð × Ù Ò ÓÖ Ò Ö                      Ð ÙÐÓ ÓÑÓ Ð Ú
           ÙÒ ÙÒ ÓÒ       ×Ô Ö× ÓÒº
458                                                      Cap´
                                                            ıtulo 5. Tablas hash



Ä ÑÔ×ÓÒ ¾½          ÙÒ Ü Ð ÒØ ÜÔÓ× ÓÒ Ð Ö ×Ô ØÓ × Ð Ô Ö×Ô Ø Ú Ð × ÒÓ
× ×Ø Ñ ×º
     ÍÒ Ö Ø Ö ×Ø ÑÙÝ ÑÔÓÖØ ÒØ             ÙÒ         × ÕÙ × ¬Ò ØÓ × Ö¸ Ø Ò ÙÒ
   Ô       Ñ Ü Ñ ¸ ÓÒ× Ö Ð Ñ ÒØ Ñ ÒÓÖ ÕÙ Ð Ð ÓÒ ÙÒØÓ Ó ØÓ Ð ×Ø ÓÒº
  Ù Ò Ó × Ö ÕÙ Ö Ò× ÖØ Ö ÙÒ ØÓ Ò ÙÒ             ÐÐ ÒÓ¸ ÒØÓÒ × Ý ÕÙ × Ð ÓÒ Ö ÙÒÓ
    ×Ù× ØÓ× ÓÒØ Ò Ó× Ý ×Ù ×Ø ØÙ ÖÐÓ ÔÓÖ Ð ÒÙ ÚÓº Ù Ð       × Ð ÓÒ Ö× Ë × Ó ÑÓ×
ÙÒ ØÓ ÕÙ × Ö Ö Ö Ò Ó Ò ÙÒ ÙØÙÖÓ Ö ÒÓ¸ ÒØÓÒ ×¸ Ò ÐÓ ÕÙ ÓÒ ÖÒ Ð ØÓ
× Ó¸ Ô Ö ÑÓ× Ð ÓÒ            Ð       º Ò ×Ø × ÒØ Ó¸ Ð ÐÓ Ð         Ö Ö Ò ×Ù Ö
× Ð ÓÒ Ö Ð ØÓ Ñ × ÒØ ÙÓº
     ÈÖÓ Ð Ñ ÒØ Ð Ø Ð × × Ð ×ØÖÙ ØÙÖ                 ØÓ× ÓÒ Ô Ö ÑÔÐ ÒØ Ö ÙÒ
 Ò Ñ ÑÓÖ ÔÖ Ò Ô Ðº × Ò ÐÑ ÒØ ÔÓÖ ÙÒ Ö ÞÓÒ × Ò ÔÖÓÑ Ó Ð ×ÕÙ Ñ Ö Ù¹
Ô Ö ÓÒ Ñ × Ö Ô Ó ÕÙ × ÓÒÓ º ÍÒ               × ÙÒ ÝÙ Ð × ÑÔ ÒÓ¸ Ô ÖÓ ×Ù ÓÒ
   ÔÒ      Ð Ô ØÖÓÒ     ×Óº ÆÓ ׸ Ô٠׸ Ö Ø Ó Ð Ø Ò Ö ÙÒ × ÑÔ ÒÓ Ö ÒØ Þ Ó¸ ÔÙ ×
× ×Ø Ù × Ð ×Ó¸ ÒØÓÒ × ÒÓ             Ö ÑÓ× Ù× Ö ÙÒ         º Ò Ò ÙÖ ¸ Ð ÙÒ ÓÒ
   × ÔÙ Ö ÔÖ × ÒØ Ö Ô ÖØ         ÐÓ ÕÙ × ÔÖ Ø Ò Ù Ö Öº ÓÑÓ ÑÔÐÓ× Ø Ò ÑÓ×
ÐÓ× Ù×Ó× × Ö ØÓ× Ò Ð × Ó× ×Ù ¹× ÓÒ × ÒØ Ö ÓÖ × Ý Ð ×Ô Ö× Ö Ð ÙÐÓ× ÕÙ ÔÙ Ò
Ö Ô Ø Ö× º
     ALEPH ÓÒØ Ò ÙÒ Ì ¸ ÐÐ Ñ Ó Hash Cache<Key,Data> ÙÝ ×Ô ¬               ÓÒ ×Ø
 ÓÒØ Ò Ò Ð Ö ÚÓ ØÔÐ ×                 ºÀ
 ØÔÐ ×         ºÀ     ≡
      template <typename Key, typename Data, class Cmp = Aleph::equal_to<Key> >
  class Hash_Cache
  {
      ÒØÖ      Hash Cache<Key,Data>
     Å Ñ ÖÓ× ÔÖ Ú Ó× Hash Cache<Key,Data>
     Å Ñ ÖÓ× ÔÙ Ð Ó× Hash Cache<Key,Data> ¾
  };
  ¬Ò ×
  Hash Cache¸   Ù×   Ò ÙÒ × ¾   Ò   º
   Hash Cache<Key,Data>     ÑÔÐ Ñ ÒØ ÙÒ         Ò Þ Ó ÔÓÖ Ð Ú × Ø ÔÓ Key¸ ÕÙ
 Ù Ö     ØÓ× Ø ÔÓ Data Ý  ÕÙ ×Ø ÑÔÐ ÒØ Ó Ñ ÒØ ÙÒ Ø Ð × º
   ÈÙ ×ØÓ ÕÙ ÙÒ        ר ר Ò Ó × Ö ¬Ò ØÓ Ý ÐÓ Ñ × Ö Ô Ó ÔÓ× Ð ¸ Ð Ù×Ó ÙÒ
Ø Ð × Ð Ò Ð ÒÓ Ô Ö       ÓÒ× Ð º À        ר ÓØ ÓÒ¸ ÔÓ ÑÓ× Ö ÕÙ Ù ÐÕÙ Ö
 Ò ÓÕÙ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ × ´Ý ×Ù× Ø ÔÓ× Ö Ð ÓÒ Ó×µ ÔÙ Ù× Ö× ÓÑÓ ØÖ × ÓÒ Ó
    ÑÔÐ ÒØ ÓÒº ÈÓÖ ×Ù × ÑÔÐ     ¸ Ù× Ö ÑÓ× Ð Ø ÔÓ LhashTable<Key>
 Å Ñ ÖÓ× ÔÖ Ú Ó× Hash Cache<Key,Data>          ≡         ´ µ
  LhashTable<Key, Cmp> hash_table;
Í× × LhashTable ¼ º
     ×ØÓ ÑÔÐ     ¬Ò Ö ÙÒ Ð ×    Ù Ø ¸Ð Ù Ð×         ¬Ò      Ð × Ù ÒØ ÑÓ Ó
  ÒØÖ      Hash Cache<Key,Data>   ≡                             ´   µ
  class Cache_Entry : public LhashTable<Key, Cmp>::Bucket
  {
    Data    data;
     Å Ñ ÖÓ× ÔÖ Ú Ó× ÒØÖ           Hash Cache<Key,Data>
     Å Ñ ÖÓ× ÔÙ Ð Ó× ÒØÖ           Hash Cache<Key,Data>
  }; // fin class Cache_Entry
  ¬Ò ×
5.3. Otros usos de las tablas hash y de la dispersi´n
                                                   o                                               459



  Cache Entry¸ Ù× Ò ÙÒ ×                 Ò       ¾ß º
Í× × LhashTable ¼ º
   Ð Ó × ÖÚ ÓÖ Ð Ð Ú ×                       Ö          LhashTable<Key, Cmp>::Bucket¸ Ý         Ð Ð ØÓ
× ¬Ò ÓÑÓ
 Å Ñ ÖÓ× ÔÙ Ð Ó× ÒØÖ           Hash Cache<Key,Data>                        ≡    ´       µ
  Data & get_data() { return data; }
   È Ö Ø ÖÑ Ò Ö Ù Ð ÐÓ× Ð Ñ ÒØÓ× ÓÒØ Ò Ó× Ò Ð    × Ð Ñ × ÒØ ÙÓ¸ Ð ×
Ù Ø × Ð Ø Ð × × ÓÖ Ò Ò Ò ÙÒ ÓÐ × Ð ÒØÖ Ñ × ÒØ Ù Ñ ÒØ              ¹
      ר Ð Ñ ÒÓ× Ö ÒØ Ñ ÒØ Ù× º Ò ÐÙ Ö Ù× Ö ÙÒ ÓÐ × Ô Ö ¸ ¬Ò ÑÓ×
Ð × Ù ÒØ ØÖ ÙØÓ ÒØ ÖÒÓ Ð ÒØÖ       Ð
Å Ñ ÖÓ× ÔÖ Ú Ó× ÒØÖ       Hash Cache<Key,Data> ≡  ´ µ
  Dlink       dlink_lru; // enlace a la cola lru
  ¬Ò ×
  dlink lru¸   Ù×   Ò ÙÒ         º
    Ë Ø Ò ÑÓ× ÙÒ ÔÙÒØ ÖÓ Ð ÑÔÓ dlink lru¸ ÒØÓÒ × Ð × Ù ÒØ Ñ ÖÓ                                    Dlink
´Ü ¾º º ´Ô Ò ¿µµ Ò Ö ÙÒ ÙÒ ÓÒ ÓÒÚ Ö× ÓÒ
 Å Ñ ÖÓ× ÔÖ Ú Ó× Hash Cache<Key,Data>     +≡    ´ µ
  LINKNAME_TO_TYPE(Cache_Entry, dlink_lru);
Í× × Cache Entry         ¸ dlink lru         ¸ Ò   LINKNAME TO TYPE   ¿º
Ý ÙÒ ÔÙÒØ ÖÓ Ð ØÖ ÙØÓ dlink lru × Ó Ø Ò Ñ ÒØ
 Å Ñ ÖÓ× ÔÖ Ú Ó× ÒØÖ          Hash Cache<Key,Data>                         +≡       ´       µ
  Dlink* link_lru() { return &dlink_lru; }
Í× × dlink lru       º
    ÄÊÍ × ÖÓÒ ÑÓ Ò Ð ×         Ð ×Ø Ö ÒØÐÝ Ù× ¸ Ù Ð Ð Ø Ö ÐÑ ÒØ × Ò ¬
 Ñ ÒÓ× Ö ÒØ Ñ ÒØ ÙØ Ð Þ Ó º Ò ÒÙ ×ØÖÓ × ÙÖ×Ó ×Ø ÐÐ ÒÓ ÑÔÐ Ö ÑÓ× Ð Ö ×
 Ñ × ÒØ Ù Ñ ÒØ        Ó º dlink lru × ÙÒ Ó Ð ÒÐ     ÒØÖÓ ÙÒ Ð ×Ø Ó Ð ¹
Ñ ÒØ ÒÐ Þ    Ö ÙÐ Ö¸ ÙÝÓ ×Ø Ó × Ñ ÒØ Ò × Ð Ó ØÓ Hash Cache<Key,Data>
Ñ ÒØ ÐÓ× × Ù ÒØ × ØÖ ÙØÓ×
Å Ñ ÖÓ× ÔÖ Ú Ó× Hash Cache<Key,Data>      +≡    ´ µ         ¼
  Dlink        lru_list; // cabecera de la lista lru
  size_t       num_lru; // n´mero de elementos en lista lru
                             u
  ¬Ò ×
  lru list¸   Ù×    Ò ÙÒ × ¾¸          ¿¸ Ò        º
    ÈÓÖ Ñ × ÒØ Ù ÕÙ ÔÙ × Ö ÙÒ ÒØÖ       Ò Ð       ¸ Ý × ØÙ ÓÒ × Ò Ð × Ù Ð × ×
Ö ÕÙ Ö ÕÙ ×Ø ÒÓ × ×Ù ×Ø ØÙÝ Ù Ò Ó Ð         ר ÐÐ ÒÓ Ò Ö × ÙÒ ÒÙ Ú ÒØÖ º
  ר Ø ÔÓ     ÒØÖ × Ñ Ö ÓÑÓ ØÖ Ò            ´lockedµ Ý ×   ÒØ ¬ Ñ ÒØ Ð
× Ù ÒØ ØÖ ÙØÓ
 Å Ñ ÖÓ× ÔÖ Ú Ó× ÒØÖ        Hash Cache<Key,Data>      +≡    ´ µ
  bool locked; // indica si la entrada est´ trancada
                                          a
    Ù Ò Ó Ó Ø Ò ÑÓ× Ð ÒØÖ Ñ × ÒØ Ù Ñ ÒØ        ¸ Ò × Ø ÑÓ× × Ö × ×Ø Ó
ÒÓ ÓÒØ Ò Ò Ð Ø Ð × º È Ö ÐÐÓ¸ Ñ ÒØ Ò ÑÓ× ÙÒ ØÖ ÙØÓ ÕÙ Ò      ר ר Ó
 Å Ñ ÖÓ× ÔÖ Ú Ó× ÒØÖ      Hash Cache<Key,Data>   +≡    ´ µ        ¼
  bool is_in_hash_table; // indica si la entrada est´ contenida dentro de
                                                    a
                         // la tabla hash
460                                                                                 Cap´
                                                                                           ıtulo 5. Tablas hash



       ÄÓ× ØÖ ÙØÓ×             Cache Entry         ÓÒ ÓÖÑ Ò Ð × Ù ÒØ רÖÙ ØÙÖ Ô ØÓÖ
                                                                       key
                                   dlink de hash
                                                                       data
                                                                       locked
                                                                   is in hash table
                                                               dlink inside
                                                         dlink lru


    ËÓÒ ØÖ × Ó Ð × ÒÐ × Ð Ð Ù Ø Ð Ø Ð × ´dlink                   × µ¸ dlink lru ÕÙ
     × Ð Ð ÓÐ ÓÖ Ò ÔÓÖ Ø ÑÔÓ                ×Ó Ý dlink inside ÕÙ × Ð Ð Ð ×Ø
     Ù Ø × ÕÙ ×Ø Ò ÒØÖÓ Ð Ø Ð × º
            ר ÐØÙÖ Ð ÜÔÐ ÓÒ ÕÙ Þ Ð Ù Ò Ý Ý ÔÐ ÒØ Ó ÓÑÓ Ó ÓÒ Ð Ù× Ö Ð
     Ò Ò Ñ ÒØÓ × Ô Ö Ó Ò ÐÙ Ö ÙÒ Ò ÓÕÙ ÖÖ Óº Ë ÙØ Ð Þ × ÑÓ× Ð ×ÓÒ Ó Ð Ò Ð¸
     ÒØÓÒ × Ø Ò Ö ÑÓ× Ð ÔÖÓ Ð Ñ     ÕÙ Ð × ÒØÖ × × ÔÙ Ò ÑÓÚ Ö Ý ÐÐÓ ÑÔ ÕÙ
    ÓØÖ ×ØÖÙ ØÙÖ       ØÓ ÔÙÒØ ÙÒ Ó ØÓ Cache Entryº ÓÒ Ð ×ÓÒ Ó ÔÓÖ Ó Ð ×
    Ø Ò ÑÓ× Ð ÔÖÓ Ð Ñ Ø Ò Ö ÕÙ ¬Ò Ö Ó× ÙÒ ÓÒ × × Ý ÙÒ ÔÓ Ó Ñ × Ø ÑÔÓ
      ר Öº
         × Ô٠׸ Ö ÑÓ× ÕÙ Ð Ì Hash Cache<Key,Data> ÒÓ Ô ÖØ Ò Ð Ö Ñ ÑÓÖ
    Ô Ö Ò Ò ÙÒ ÒØÖ cache entry ר × × Ô ÖØ Ò Ò ÙÒ ÖÖ ÐÓ ÓÒØ ÙÓ Ò Ø ÑÔÓ
     ÓÒרÖÙ ÓÒº     ר ÑÓ Ó¸ ÔÖÓÚ ÑÓ× Ð ÔÖÓÔ Ó            Ð ÓÑÔÙØ ÓÖ Ý ÒÓ ×Ô Ö ¹
       ÑÓ× Ø ÑÔÓ Ò ÐÐ Ñ × Ð Ñ Ò ÓÖ Ñ ÑÓÖ
       ÁÒ ÐÑ ÒØ ¸ ר × ÒØÖ × ×Ø Ò Ò ÓÐ × Ó Ð × Ù ÒØ ÒÐ
¼    Å Ñ ÖÓ× ÔÖ Ú Ó× ÒØÖ         Hash Cache<Key,Data>       +≡    ´ µ
     Dlink    dlink_inside; // enlace a la lista de entradas que
    ÙÝÓ ×Ø Ó × Ñ Ò               Ó Ò Hash Cache<Key,Data> Ñ                            ÒØ ÐÓ× ØÖ ÙØÓ×
¼   Å Ñ ÖÓ× ÔÖ Ú Ó×     Hash Cache<Key,Data>      +≡     ´ µ          ½
     Dlink inside_list; // lista de cubetas ya apartadas y metidas en tabla hash
     size_t cache_size; // m´ximo n´mero de entradas que puede contener el cache
                             a      u
      ¬Ò ×
     cache size¸ Ù×     Ò ÙÒ × ¾          Ò          º
     inside list¸ Ù×     Ò ÙÒ ×            Ò         º


                                                         cache-size
                   lru list                                                    .....
                 inside list




      ÙÖ º ר Ó Ò                 Ð Ð ÖÖ ÐÓ ÓÒØ ÙÓ                      Ù Ø ×º ÌÓ × Ð × ÒØÖ         × Ô ÖØ Ò Ò
     Ð Ð ×Ø ÐÖÙº
       ÄÓ× ÒÐ × Ð × ÓÐ × ÙÒ Cache Entry × Ñ Ò Ò Ð × Ù ÒØ ÑÓ Ó
      ½º lru list ÓÐ      ÒØÖ × ÓÖ Ò × × Ð Ñ × ÒØ Ù Ñ ÒØ                ר Ð
         Ñ × Ö ÒØ Ñ ÒØ           º ÁÒ ÐÑ ÒØ ¸ Ð     ר Ú Ó Ý ØÓ × ×Ù× ÒØÖ ×
         ÔÖ ¹ Ô ÖØ × ÒÐ Þ × ÔÓÖ ×Ø ÓÐ º
      ¾º inside list Ð ×Ø    ÒØÖ × Ò× ÖØ × Ò Ð Ø Ð × º ÁÒ ÐÑ ÒØ ¸ ר Ð ×Ø
          ר Ú ¸ ÔÙ × Ð        ÒÓ ÓÒØ Ò Ò Ò ÙÒ Ð Ñ ÒØÓº Ä × ÒØÖ × Ò ×Ø Ð ×Ø
5.3. Otros usos de las tablas hash y de la dispersi´n
                                                   o                      461



      Ø Ñ Ò ×Ø Ò ÓÖ Ò × × Ð Ñ × ÒØ Ù Ñ ÒØ                   ר Ð Ñ × Ö Ò¹
      Ø Ñ ÒØ       º ÆÓØ ÑÓ׸ × Ò Ñ Ö Ó¸ ÕÙ ÔÙ ×ØÓ ÕÙ ×Ø ÓÐ ×ÓÐÓ ÓÒØ Ò Ò¹
      ØÖ × ÐÓ Ñ ÒØ Ô ÖØ Ò ÒØ × Ð         ¸ ×Ù ×Ø Ó ÒÓ Ò × Ö Ñ ÒØ × Ð Ñ ×ÑÓ
      ÕÙ Ð Ð ÓÐ lru list¸ Ð Ù Ð ÓÖ Ò ÒØÖ × ÕÙ Ô ÖØ Ò Ò Ó ÒÓ Ð           º


                                                         45
                   lru list
                                                     false      0
                                                     true
               inside list
                                                                1
                                                    false
                              0                     false

                              1                      false      2
                                                     false
                              2                      375
                              3                                 3
                                                     true
                                                     true
                              4
                                                                4
                              5                      false
                                                     false
                              6                       58
                                                     false      5
                              7                      true
                              8
                                                     false      6
                              9                     false
                                                    479
                 locked list                            false   7
                                                        true




   ÙÖ º ר Ó ÙÒ               Ø Ñ ÒÓ ÓÒ Ø Ð ×         Ø Ñ ÒÓ ½¼º Ë   ÑÙ ×ØÖ Ð
 ÖÖ ÐÓ Ð Ø Ð × Ý Ð ÖÖ ÐÓ ÔÖ ¹ Ô ÖØ Ó Ù Ø ×º ÄÓ× ÒÐ × Ð               Ø Ð ×
×ÓÒ ÓÒØ ÙÓ׸ ÐÓ× Ð Ð ×Ø     ÒØÖ × ÕÙ ×Ø Ò ÒØÖÓ Ð Ø Ð ÔÙÒØ            Ó× Ý ÐÓ×
Ð Ð ×Ø ÄÊÍ ØÖ Þ Ó׺ Ä ÒØÖ      ÓÒ Ð Ú ¿ ¸ ÕÙ × ÓÐ × ÓÒ Ò Ð Ø Ð        × ÓÒ Ð
 Ð Ú ¸ ר ØÖ Ò        ÔÓÖ ×Ó Ô ÖØ Ò    Ð Ð ×Ø locked listº
       Ä ÙÒ ÙÒ ÓÒ Ð Ð ×Ø inside list × ÔÖÓÚ Ö ÙÒ Ø Ö ÓÖ × ÑÔÐ ×Ó Ö ÐÓ×
        Ð Ñ ÒØÓ× Ð     º
       Ë Ð Ø Ð ×Ø ÐÐ Ò ¸ ÒØÓÒ × inside list Ú Ò Ú º
    ¿º locked list Ä × ÒØÖ × ØÖ Ò × × × Ò lru list Ý × ÒØÖÓ Ù Ò Ò
       ÙÒ Ø Ö Ö Ð ×Ø ¬Ò ×
½       Å Ñ ÖÓ× ÔÖ Ú Ó× Hash Cache<Key,Data>    +≡  ´ µ    ¼  ¾
       Dlink locked_list; // lista de entradas trancadas
       size_t num_locked; // n´mero de elementos trancados
                              u
462                                                                Cap´
                                                                          ıtulo 5. Tablas hash



           Ð ÒÐ dlink lru × Ü ÐÙÝ ÒØ Ó Ð Ù Ø ×Ø Ò lru list Ó Ò locked list
         Ú ÒØÙ ÐÑ ÒØ ¸ ÙÒÕÙ ÒÓ     Ö    × Ö Ð ×Ó¸ ÔÙ    ÙÑ ÒØ Ö× Ð Ø Ñ ÒÓ Ð
         º È Ö ÐÐÓ¸ × Ô ÖØ ÙÒ ÒÙ ÚÓ ÖÖ ÐÓ Cache Entryº È Ö ÔÓ Ö Ð Ö ÖÐÓ׸ ÐÓ×
     ÐÓÕÙ ×     ÖÖ ÐÓ× Cache Entry × ÒÐ Þ Ò Ò ÙÒ Ð ×Ø ÕÙ ¬Ò ÑÓ× Ð × Ù ÒØ
    ÑÓ Ó
¾   Å Ñ ÖÓ× ÔÖ Ú Ó× Hash Cache<Key,Data>      +≡     ´ µ     ½ ¾
      typedef Dnode<Cache_Entry*> Chunk_Descriptor;
      Chunk_Descriptor chunk_list;
      ¬Ò ×
      chunk list¸ Ù×   Ò ÙÒ × ¾      Ò       º
    Í× × Cache Entry     Ò Dnode      º
     chunk list × Ð ÙÐØ ÑÓ ØÖ ÙØÓ Hash Cache<Key,Data> Ý ¬Ò Ð Ð ×Ø                      ÐÓÕÙ ×
    ´ ÖÖ ÐÓ× Cache Entryµº ר ÑÓ× Ð ×ØÓ× Ô Ö ¬Ò Ö Ð ÓÒרÖÙ ØÓÖ
¾    Å Ñ ÖÓ× ÔÙ Ð Ó× Hash Cache<Key,Data> ¾ ≡            ´ µ
      Hash_Cache(size_t (*hash_fct)(const Key&),
                 const size_t & __hash_size, const size_t & __cache_size)
        : hash_table(hash_fct, __hash_size, false),
          num_lru(0), cache_size(__cache_size), num_locked(0)
      {
            // apartar entradas del cache
        Cache_Entry * entries_array = new Cache_Entry [cache_size];
              // apartar el descriptor del arreglo
          std::auto_ptr<Chunk_Descriptor>
            chunk_descriptor (new Chunk_Descriptor (entries_array));
          chunk_list.insert(chunk_descriptor.get());
          for (int i = 0; i < cache_size; i++) // insertar Cache_Entry en lista lru
            insert_entry_to_lru_list(&entries_array[i]);
          chunk_descriptor.release();
      }
    Í× × Cache Entry    ¸ cache size ¼ ¸     chunk list   ¾¸   Hash Cache   ¸
       Ò insert entry to lru list ¾ º
    Ó × ÖÚ ÑÓ× ÕÙ Ð ÓÒרÖÙ ØÓÖ Ô Ð ÙÒ Ñ ØÓ Ó ÒØ ÖÒÓ insert entry to lru list()¸
     Р٠и ÙÒØÓ ÓÒ ÓØÖÓ× Ñ ØÓ Ó× ÔÖ Ú Ó× Ò ØÓÖÒÓ lru list¸ × ¬Ò Ò Ð × Ù ÒØ
    ÑÓ Ó
¾    Å Ñ ÖÓ× ÔÖ Ú Ó× Hash Cache<Key,Data>        +≡    ´ µ    ¾   ¿
      void insert_entry_to_lru_list(Cache_Entry * cache_entry)
      {
        num_lru++;
        lru_list.insert(cache_entry->link_lru());
      }
      void remove_entry_from_lru_list(Cache_Entry * cache_entry)
      {
        num_lru--;
        cache_entry->link_lru()->del();
      }
      ¬Ò ×
      insert entry to lru list¸ Ù×   Ò     ÙÒ × ¾ Ò       º
      remove entry from lru list¸ Ù×      Ò ÙÒ    º
    Í× × Cache Entry      Ò lru list        º
5.3. Otros usos de las tablas hash y de la dispersi´n
                                                       o                              463



      Ä Ñ ×Ñ Ð × ÖÙØ Ò × × ¬Ò Ô Ö Ð Ð ×Ø locked listº
          Ð ¬Ò Ð ÓÐ lru list ÒÓ × ÓØÖÓ ÕÙ ÒרÖÙÑ ÒØ Ö Ð ÓÖ Ò × ÙÒ Ð ×Óº À Ý
     Ú Ö × × ØÙ ÓÒ × Ò Ð Ù Ð × ×Ø ÓÐ Ø Ò ÕÙ ØÙ Ð Þ Ö×
        ½º Ù Ò Ó × Ò× ÖØ ÙÒ ÒÙ ÚÓ Ð Ñ ÒØÓ Ò Ð             ¸ Ó Ø Ò ÑÓ× ×Ù Cache Entry
              Ð Ö ÒØ   lru list¸ Ð Ù Ð ÓÒØ Ò Ð Ð Ñ ÒØÓ Ñ × ÒØ Ù Ñ ÒØ               Ó
           ¹Ö ÓÖ ÑÓ× ÕÙ ØÓ × Ð × ÒØÖ × Cache Entry × Ñ Ø Ò Ò ×Ø ÓÐ ÙÖ ÒØ Ð
            ÓÒרÖÙ ÓÒ Ð       ¹º
        ¾º Ù Ò Ó Ö Ö Ò ÑÓ× ÙÒ Ð Ñ ÒØÓ ÒØÖÓ Ð                    ÑÓ× ×Ô ¬ Ö ÕÙ ×Ø
            × Ð Ñ × Ö ÒØ Ñ ÒØ         Ó Ô Ö ÐÐÓ¸ Ð Ñ Ò ÑÓ× ×Ù Cache Entry ØÖ Ú × Ð
             Ó Ð ÒÐ dlink lru Ý ÐÓ Ö ¹ Ò× ÖØ ÑÓ× Ò Ð ØÖ × ÖÓº ×ØÓ ÐÓ Ö Ð Þ Ð × Ù ÒØ
           ÖÙØ Ò
    ¿       Å Ñ ÖÓ× ÔÖ Ú Ó× Hash Cache<Key,Data>         +≡     ´ µ       ¾  ¿
             void do_mru(Cache_Entry * cache_entry)
             {
               cache_entry->link_lru()->del(); // elimine de su posici´n actual
                                                                      o
               lru_list.insert(cache_entry->link_lru()); // col´quelo en el trasero
                                                               o
             }
             ¬Ò ×
             do mru¸ Ù×   Ò   ÙÒ × ¿ Ò          º
           Í× × Cache Entry       Ò lru list        º
           do mru()                 Ð ÒØÖ Ñ × Ö ÒØ Ñ ÒØ
                              cache entry                         º
        ¿º Ù Ò Ó Ð Ñ Ò ÑÓ× ÙÒ Ð Ñ ÒØÓ Ð        ÐÓ ÓÐÓ ÑÓ× Ò Ð Ö ÒØ ¸               ÓÒ ÕÙ
           ÒרÖÙÑ ÒØ Ð × Ù ÒØ ÖÙØ Ò
    ¿      Å Ñ ÖÓ× ÔÖ Ú Ó× Hash Cache<Key,Data>      +≡   ´ µ     ¿            ¿
             void do_lru(Cache_Entry * cache_entry)
             {
               cache_entry->link_lru()->del(); // elimine de su posici´n actual
                                                                      o
               lru_list.append(cache_entry->link_lru()); // ins´rtelo en el frente
                                                               e
             }
           Í× × Cache Entry      Ò   lru list       º
           do lru()               Ð ÒØÖ Ñ × ÒØ Ù Ñ ÒØ
                              cache entry                         º
         ÓÖ ×Ø ÑÓ× ÔÖ ×ØÓ× Ô Ö ÑÓ×ØÖ Ö ÙÒ ÖÙØ Ò Ö Ø ¸ Ð Ù Ð × Ð ÓÒ Ð ÒØÖ
    Ñ × ÒØ Ù ´ ÓÒØ Ò Ó ÒÓ Ò Ð         µÝÐ      Ð Ñ × Ö ÒØ Ñ ÒØ
¿   Å Ñ ÖÓ× ÔÖ Ú Ó× Hash Cache<Key,Data>        +≡      ´ µ     ¿
        void remove_entry_from_hash_table(Cache_Entry * cache_entry)
        {
          cache_entry->link_inside()->del();
          hash_table.remove(cache_entry);
          cache_entry->is_in_hash_table = false;
          do_lru(cache_entry);
        }
        Cache_Entry * get_lru_entry()
        {
              // obtenga la entrada m´s antigua -la menos recientemente accedida
                                     a
          Dlink * lru_entry_link = lru_list.get_prev();
464                                                                   Cap´
                                                                         ıtulo 5. Tablas hash



      Cache_Entry * cache_entry = dlink_lru_to_Cache_Entry(lru_entry_link);
          // si cache_entry contenida en tabla ==> eliminarlo
      if (cache_entry->is_in_hash_table)
        remove_entry_from_hash_table(cache_entry);
      do_mru(cache_entry); // la entrada deviene la m´s recientemente accedida
                                                     a
      return cache_entry;
  }
  ¬Ò ×
  get lru entry¸ Ù×   Ò ÙÒ         º
  remove entry from hash table¸ Ù×         Ò ÙÒ       º
Í× × Cache Entry    ¸ do mru ¿ ¸       Ò   lru list       º
 remove entry from hash table() Ð Ñ Ò cache entry     Ð Ø Ð × Ý Ð ØÓÖÒ ÓÑÓ
Ð ÒØÖ Ñ × ÒØ Ù Ñ ÒØ              º get lru entry() × Ð ÖÙØ Ò Ö Ø ÕÙ × Ð ÓÒ
Ð ÒØÖ Ñ × ÒØ Ù Ñ ÒØ               Ý ÕÙ × ÒÚÓ Ù Ò Ó × Ò× ÖØ ÙÒ ÒÙ ÚÓ Ð Ñ ÒØÓ
 Ò Ð      º
     ÜÔÐ Ó ×ØÓ¸ ÔÓ ÑÓ× ÑÓ×ØÖ Ö Ð Ò× Ö ÓÒ
 Å Ñ ÖÓ× ÔÙ Ð Ó× Hash Cache<Key,Data> ¾ +≡ ´ µ ¾
  Cache_Entry * insert(const Key & key, const Data & data)
  {
    Cache_Entry * cache_entry = get_lru_entry(); // obtener entrada m´s antigua
                                                                     a
    cache_entry->get_key()    = key;             // escribirle el par
    cache_entry->get_data() = data;
    inside_list.insert(cache_entry->link_inside()); // ins´rtela en inside_list
                                                           e
    hash_table.insert(cache_entry);            // insertarla en la tabla hash
    cache_entry->is_in_hash_table = true;
    return cache_entry;
  }
Í× × Cache Entry     ¸ get lru entry ¿ ¸ Ò        inside list   ¼ º
    Ð     Ñ ÒØ Ò ÙÒ ×Ù ¹ ÓÒ ÙÒØÓ ÐÓ× ÙÐØ ÑÓ× cache size Ð Ñ ÒØÓ×     Ó× ÓÒ
Ð ×Ô Ö ÒÞ ÕÙ ¸ × × Ö Ö Ò Ò ÒÙ ÚÓ¸ ÒØÓÒ × ÒÓ × Ô Ù ÙÒ Óר ÐØÓ ÔÓÖ ×Ù
 Ù×ÕÙ    Ò Ð ÓÒ ÙÒØÓ ÔÖ Ò Ô Ðº È Ö Ù× Ö Ò Ð       ÔÖÓÚ ÑÓ× Ð × Ù ÒØ ÖÙØ Ò
 Å Ñ ÖÓ× ÔÙ Ð Ó× Hash Cache<Key,Data> ¾ +≡ ´ µ
  Cache_Entry * search(const Key & key)
  {     // buscar en la tabla hash
    Cache_Entry * cache_entry = static_cast<Cache_Entry*>(hash_table.search(key));
    if (cache_entry != NULL) // ¿fue encontrada la clave?
      {     // s´ ==> hacerla la m´s recientemente usada
                ı                 a
        do_mru(cache_entry);
        move_to_inside_front(cache_entry);
      }
    return cache_entry;
  }
Í× × Cache Entry       Ò   do mru   ¿º
Ä Ù×ÕÙ       Ö Ö × Ð ÒØÖ     Ò Ð      Ò Ð × ÒØ Ó ÕÙ Ð    Ð Ñ ×Ö                            Ò¹
Ø Ñ ÒØ         º
   È Ö ØÖ Ò Ö ÙÒ ÒØÖ        × Ö¸ Ô Ö × ÙÖ Ö ÕÙ ÐÐ ÒÓ × ×      Ð
 Ù Ò Ó Ó ÙÖÖ ÙÒ Ò× Ö ÓÒ¸ × ÑÔÐ Ð × Ù ÒØ Ñ ØÓ Ó
 Å Ñ ÖÓ× ÔÙ Ð Ó× Hash Cache<Key,Data> ¾ +≡ ´ µ
  void lock_entry(Cache_Entry * cache_entry)
5.3. Otros usos de las tablas hash y de la dispersi´n
                                                   o                            465



  {
      remove_entry_from_lru_list(cache_entry);
      insert_entry_to_locked_list(cache_entry);
      cache_entry->lock();
  }
Í× × Cache Entry     Ò   remove entry from lru list     ¾º
Ò ÐÓ Ñ ÒØ ¸ Ð ÒØÖ × ÔÙ         ×ØÖ Ò Ö
Å Ñ ÖÓ× ÔÙ Ð Ó× Hash Cache<Key,Data>                  ¾ +≡      ´   µ
  void unlock_entry(Cache_Entry * cache_entry)
  {
    remove_entry_from_locked_list(cache_entry);
    insert_entry_to_lru_list(cache_entry);
    cache_entry->unlock();
  }
Í× × Cache Entry     Ò   insert entry to lru list     ¾º
    Ä Ð Ñ Ò ÓÒ ÙÒ Ð Ñ ÒØÓ Ò Ð           ÔÙ Ô Ö Ö ÙÒ ÓÔ Ö ÓÒ Ö ÙÒ ÒØ
   ÒÒ × Ö ¸ ÔÙ × ×Ø ÓÒ Ø Ò ×ÓÐÓ ÒÓ       Ö Ñ × ÙÒ ÒØÖ Ô Ö ÕÙ ×Ø × Ð
  Ð      º Ë Ò Ñ Ö Ó¸ Ð ÓÒÓ Ñ ÒØÓ ÖØ ÖÓ ÕÙ ÙÒ Ð Ú Ñ × × Ö             ÒÓ
×ÓÐÓ Ô ÖÑ Ø ×ÔÓÒ Ö ×Ù ÒØÖ Ô Ö ÙÒ Ò× Ö ÓÒ¸ × ÒÓ ÕÙ ÔÓØ Ò   ÓØÖ × Ð Ú ×
   Ò ¬ Ö× Ð       º ÈÓÖ ×Ó¸ × ÙÒ Ð Ò ÓÐ Ð ÔÐ ÓÒ¸ ÔÙ Ó ÒÓ × Ö ÑÙÝ Ú Ð Ó×
Ð × Ù ÒØ ÔÖ Ñ Ø Ú      Ð Ñ Ò ÓÒ
 Å Ñ ÖÓ× ÔÙ Ð Ó× Hash Cache<Key,Data> ¾ +≡ ´ µ
  void remove(Cache_Entry * cache_entry)
  {
    remove_entry_from_hash_table(cache_entry);
  }
Í× × Cache Entry     Ò   remove entry from hash table      ¿º
    Ä × Ð ÓÒ Ð Ø Ñ ÒÓ Ð            ÔÙ × Ö Ö Ø Ô Ö Ð × ÑÔ ÒÓ ÐÓ Ð ÙÒ
× ×Ø Ñ º ÍÒ Ô          Ò×Ù¬ ÒØ ÔÙ         Ö ÕÙ Ð × Ò× Ö ÓÒ × Ö ÑÔÐ Ò ÒØÖ ×
ÕÙ × Ö Ò Ö Ö Ò       ׺ Ë ×ØÓ Ó ÙÖÖ ¸ ÒØÓÒ × Ð Ù×ÕÙ × ÑÔÖ × Ö Ú Ò Ý Ð
   × ÑÔ ÒÓ Ð ×Ó ÐÓ Ð ×           Ö Ö ÙÒ ÔÙÒØÓ Ô ÓÖ ÕÙ × ÒÓ × ØÙÚ × Ð          º
    ר ÒÓÑ ÒÓ × Ð ÒÓÑ Ò Ø Ö × Ò        ¾ Ý ÔÙ     × Ö ×ÙÑ Ñ ÒØ ÓרÓ×Ó × Ð
× ÑÔÐ Ò Ð Ñ ÒÓ Ö Ø Ó ÙÒ × ×Ø Ñ Ù ×Ø ÓÒ ÕÙ ×Ù Ð × Ö Ð ×Óº
      × Ô٠׸ Ù Ò Ó × ÓÔØ ÔÓÖ Ð ÑÔÐ Ó ÙÒ            ¸×       ¸ Ò Ð Ñ ÝÓÖ Ñ
ÔÓ× Ð ¸ ×ÔÓÒ Ö ÙÒ ×Ø Ñ ÓÒ ÔÖ ×             Ð Ö Ð ÓÒ Ö Ö Ò Ð ÓÒ ÙÒØÓº Ò
 ×ØÓ ÔÙ × Ö ÑÙÝ ÑÔÓÖØ ÒØ Ð Ö Ð ÓÒ ¼¹¾¼ ´Ü ¿º º½ ´Ô Ò ¾¾ µµ¸ Ô ÖÓ¸ Ù ÒØ
   Ð Óר ÕÙ ÔÙ        ÖÖ Ö ÙÒ Ñ Ó Ó ÖÖÓÖ Ò Ð ×Ø Ñ ÓÒ¸ × Ö ÓÑ Ò Ð ÕÙ Ð
Ø Ñ ÒÓ Ð         ÔÙ      Ùר Ö× Ò Ø ÑÔÓ         Ù ÓÒº Ä        × ÕÙ × ÙÖ ÒØ Ð
     Ù ÓÒ × Ö Ú Ð Ò × Ö Ó      Ö ÙÒ Ùר ¸ ÒØÓÒ × ×Ø × ÔÓ× Ð ¸ ÐÓ Ù Ð ×Ø
× Ö ÙÒ Ò ÓÕÙ Ò Ñ Ó ÓÑÓ Ð ÙÒ Ø Ð × Ð Ò Ðº Ò Ú ÖØÙ                   רӏ × Ò ÑÓ×
Ð × Ù ÒØ ÖÙØ Ò       ÜÔ Ò× ÓÒ
 Å Ñ ÖÓ× ÔÙ Ð Ó× Hash Cache<Key,Data> ¾ +≡ ´ µ
  void expand(const size_t & plus_size)
  {
 ¾
   Ä ØÖ Ù ÓÒ Ð Ø Ö Ð   ר Ø ÖÑ ÒÓ ×    Ð ÔÓÖÕÙ Ô Ò× ÑÓ× ÕÙ ÒÓ Ü ×Ø ÙÒ ÕÙ Ú Ð ÒØ Ö ØÓ
 ר ÐÐ ÒÓº Ò Ð ÓÒØ ÜØÓ Ð      ¸ Ø Ö × Ò Ð ÓÖ Þ ­ Ð Ö ¸ Ô٠׸ ÔÓÖ ÐÓ Ò Ö Ð¸ Ù Ò Ó ÙÒ
       ÒØÖ Ò ×Ø ר Ó ÖÖ ÙÒ Ô Ò Ð          Ñ × Ó × Ú Ö ×Ó Ö Ð × ×Ø Ñ ÕÙ ÐÓ Ù× º
466                                                                Cap´
                                                                      ıtulo 5. Tablas hash



      const size_t new_cache_size = cache_size + plus_size;
      Cache_Entry * entries_array = new Cache_Entry [plus_size];
      std::auto_ptr<Chunk_Descriptor>     // apartar el descriptor
        chunk_descriptor (new Chunk_Descriptor (entries_array));
              // Calcular nuevo tama~o de tabla y relocalizar sus entradas
                                    n
      const float curr_hash_ratio    = 1.0*cache_size/hash_table.capacity();
      const size_t new_hash_capacity = new_cache_size/curr_hash_ratio;
      hash_table.resize(new_hash_capacity);
      for (int i = 0; i < plus_size; i++) // meter nuevas entradas en lru_list
        insert_entry_to_lru_list(&entries_array[i]);
      chunk_list.insert(chunk_descriptor.release());
      cache_size = new_cache_size;
  }
Í× × Cache Entry        ¸ cache size ¼ ¸ chunk list ¾ ¸ expand ¿ ¸ insert entry to lru list ¾ ¸
   Ò lru list       º
 ÆÓ× Ö ×Ø ÙÒ Ø ÐÐ ÙÐØ ÑÓ ÙÒ Ø Ö ÓÖ ×Ó Ö ÐÓ× Ð Ñ ÒØÓ× Ð
Å Ñ ÖÓ× ÔÙ Ð Ó× Hash Cache<Key,Data> ¾ +≡           ´ µ
  class Iterator : public Dlink::Iterator
  {
    Iterator(Hash_Cache & cache) : Dlink::Iterator(&cache.inside_list) { }
    Cache_Entry * get_current()
    {
      return Cache_Entry::dlink_inside_to_Cache_Entry(Dlink::Iterator::get_current());
    }
  };
Í× × Cache Entry        ¸ Hash Cache   ¸ Ò   inside list   ¼ º
ÈÙ ×ØÓ ÕÙ × Ø Ö ×Ó Ö Ð Ð ×Ø inside list¸ ×ÓÐÓ ÐÓ× Ð Ñ ÒØÓ× ÓÒØ Ò Ó× Ò Ð
×ÓÒ Ú ×ØÓ׺ ÈÙ ×ØÓ ÕÙ ×Ø Ð ×Ø ר ÓÖ Ò ÔÓÖ Ø ÑÔÓ           ×Ó¸ Ð ÓÖ Ò Ú × Ø ×
  × Ð Ñ × Ö ÒØ Ñ ÒØ             Ó ×Ø Ð Ñ ÒÓ× Ö ÒØ Ñ ÒØ            Óº

5.4      Notas bibliogr´ficas
                       a
  Ò ×Ù Ü Ð×Ó Ð ÖÓ ×Ó Ö ÔÖÓ Ö Ñ ÓÒ¸ Ú Ò Ö Ä Ò Ò ¾ Ñ Ò ÓÒ ¸ Ñ Ø ÓÖ Ñ ÒØ ¸
ÕÙ × Ð Ð ØÓ × ×Ø Ö Ò ÙÒ ×Ð × ÖØ Ý Ð               × Ò × Ó Ö ÙÒ ×ÓÐ ×ØÖÙ ¹
ØÙÖ        ØÓ׸ ÒØÓÒ × ×Ø × Ö Ð Ø Ð × º ÔÓÖ ÕÙ ÙÒ ÔÖÓ Ö Ñ ÓÖ Ú ÖØÙÓ×Ó ÓÒ¹
× Ö Ø Ò Ú Ø Ð ×Ø רÖÙ ØÙÖ ÉÙ Þ ÔÓÖÕÙ Ð ÒÓ × ÙÒÓ ÒÓ × ÙÒÓ ÐÓ× × Ö ×
Ø Ô Ñ ÒØ ÓÑ Ò Ó× ÔÓÖ ÙÒ             Ø ÖÑ Ò ×Ø Ð ÑÙÒ Óº
     Ò ÐÓ ÓÒ Ö ØÓ Ð ÔÖÓ Ö Ñ ÓÒ¸ ÔÓ ÑÓ× Ö ÕÙ Ð ×Ô Ö× ÓÒ × ÙÒ Ø Ò
 ÓÑÔÐ Ø Ñ ÒØ ×         Ò Ð ÔÖÓ Ð          × Ö¸ ÖÙ Ñ ÒØ       Ð Ò Ó¸ Ò ×Ó ÕÙ
 Ò ×ØÖ ÐÑ ÒØ ÐÐ Ñ ÑÓ× Ð ×Ù ÖØ Ó Þ Ö¸ Ý ÕÙ ÓÝ × Ñ Ö ÓÒ × Òº ÓÑÓ × Ö
 ÜØÖ Ò ×Ø ¬Ð ÔÓÖ Ð Ø ÖÑ Ò ×ÑÓ ÕÙ ÑÙÝ ÔÓ Ó× ÔÖÓ Ö Ñ ÓÖ × × Ô Ö Ø Ò ÕÙ
 ÑÔÐ Ö ÙÒ Ù Ò ÙÒ ÓÒ           ×Ô Ö× ÓÒ Ô Ö Ù× Ö Ò ÙÒ ÖÖ ÐÓ¸ × Ò ÔÖ Ó ÙÔ Ö×
Ð × ÓÐ × ÓÒ × Ò Ñ Ö Ö Ð × Ð ×¸ Ø Ò ÑÙ × Ñ ÓÖ × ÔÖÓ Ð             ×    Ò ÓÒØÖ Ö
Ö Ô Ñ ÒØ ÙÒ Ð Ú ÕÙ Ð Ñ Ö Ù×ÕÙ × Ù Ò Ðº
      Ð ÓÑ Ö ÕÙ Ó ÔÖ Ö Ö × Ö ÓÖØÙÒ Ó ÕÙ Ù ÒÓ¸ Ø Ò ÙÒ ÔÖÓ ÙÒ
Ô Ö×Ô Ø Ú Ð Ú º Ä ÒØ Ø Ñ Ö ÓÒÓ Ö ÕÙ ÙÒ Ö Ò Ô ÖØ Ð Ú                 ÔÒ
   Ð ×Ù ÖØ º Ñ Ó Ô Ò× Ö Ò ØÓ Ó ÐÓ Ø ÒØÓ ×Ó Ö ÐÓ ÕÙ ÒÓ Ø Ò ÑÓ× ÓÒØÖÓкºº ¾ º
 ¾
      ÈÖ Ñ ÙÐÓ     Ð Ô Ð ÙÐ Å Ø ÈÓ ÒØ º
5.5. Ejercicios                                                               467



  ר Ø ÙÒ Ô Ð ÙÐ ÏÓÓ Ý ÐÐ Ò ÒÓ× Ò                 ÙÒ ÔÓ Ó Ð × Ò ÕÙ Ò ×Ø ÔÓ
Ø Ò ÑÓ×          Ð Þ Öº À ÙÒÓ× ¾ ¼¼ ÒÓ× ÑÓ Ö ØÓ¸ ÕÙ Þ ÙÒÓ ÐÓ× ÔÖ Ñ ÖÓ× ÕÙ
Ô Ò×        ÒÐ         ØÙ Ð     ØÓÑÓ¸       ÕÙ Ò Ð Þ Ö Ý Ð ×ÔÓÒØ Ò               Ý
 ÓÒ× Ò º
     Å ÕÙ Ú ÐÓ Ú Ó Ò Ð ×Ù ÖØ ÙÒ ØÓÖ Ø ÖÑ Ò ÒØ Ô Ö Ð ×Ø ÒÓ ÐÓ× ÔÙ ÐÓ׺ Ð ¹
 ÓÖ Þ Ð Ú ÓÑÓ ÙÒ Ö Ó ÙÝÓ ­Ù Ö ÓØ ÒÓ Ð ×Ù ÖØ ÔÓ                 Ñ Ö ÙÒ ÒÙÒ ÓÒ¸
ÔÓÖ ÑÔÐÓº Ó × × ÒØ Ó Ð ÓÖ Ó¸ Ð Ö ÓÑ Ò                 ÔÖ Ô Ö Ö× Ô Ö Ù Ò Ó Ð ×Ù ÖØ
ØÓÖÒ × Ý ÐÓ Ð ÓÖ Þ        ÓÒ Ð ÓÒרÖÙ ÓÒ ÙÒ ÕÙ º Ò Ð Ú ÑÓ ÖÒ ×ØÓ ÔÙ
ØÖ Ù Ö× Ð ÓÖÖÓº Ò Ð Ú                Ð ÔÖÓ Ö Ñ ÓÒ ÙÒ ×ØÖ Ø            Ö ×ÓÐÙ ÓÒ
 ÓÐ × ÓÒ ×º
     Ë ÙÒ ÃÒÙØ Ð                   ×Ô Ö× ÓÒ Ù     × Ù ÖØ Ò Ô Ò ÒØ Ñ ÒØ ÔÓÖ
Àº Ⱥ ÄÙ Ò ½ Ý Ñ Ð Ø Ð                Ò ½ ¿º Ð ÙÐØ ÑÓ ÖØ ÙÐÓ Ñ Ò ÓÒ Ð ×ÓÒ Ó Ð ¹
Ò Ðº
      Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó Ý Ð Ñ ØÓ Ó           Ú × ÓÒ Ô Ö ÔÖ Ñ ÖÓ × Ù ÖØÓ ÔÓÖ
  ÙÑ Ý º
      Ð ×ÓÒ Ó Ð Ò Ð Ù ×Ù Ö Ó ÔÓÖ Ö× ÓÚ ½¼ ¸ ÙÝÓ Ò Ð × ×¸ ÜØÖ Ñ Ñ ÒØ ¬ Ùй
ØÓ×Ó¸ Ù × Ù ÖØÓ ÔÓÖ ÔÖ Ñ Ö Ú Þ ÔÓÖ ÃÒÙØ Ò ½ ¾¸ ÓÑÓ Ð Ñ ×ÑÓ ÐÓ ÜÔÐ Ò
ÙÒ ÒÓØ Ô           Ô Ò        ½ Ô º ¿º
      Ð ÑÓ ÐÓ ×ÓÒ Ó Ð¸ ÜØÖ Ñ Ñ ÒØ ÙØ Ð ÓÑÓ Ñ Ö Ó Ò Ð × × Ð × Ø Ò ×
    ×ÓÒ Ó¸ Ù ÒØÖÓ Ù Ó ÔÓÖ È Ø Ö×ÓÒ Ò ½ ¾ º
     Ä ÔÖ Ó         Ð ÙÑÔÐ ÒÓ× × ÙÒ ÔÖÓ Ð Ñ Ð × Ó Ð Ø ÓÖ            ÔÖÓ Ð       ׺
ÍÒ ÔÖ × ÒØ ÓÒ Ö ÙÖÓ× ÔÙ           Ò ÓÒØÖ Ö× Ò Ð Ð × Ó ÐÐ Ö ½½ º ר Ô Ö Ó Ù
   Ò Ö ÐÞ      Ò Ð Ð Ö ÙÒ ÓÒ Q Ê Ñ ÒÙ Ò ½¿ º ÍÒ Ò Ð × × ×Ù ÔÐ ÓÒ Ò
Ð ÔÖÓ Ö Ñ ÓÒ ÔÙ          Ò ÓÒØÖ Ö× Ò ½¾ º
     Ä Ø Ò ÔÖ × ÒØ          Ò ×Ø Ø ÜØÓ Ô Ö Ð Ñ Ò Ö Ð × Ð × Ñ Ö × DELETED ÓÒ Ð
 Ó Ð × Ù ÔÖ × ÒØ ÔÓÖ ÔÖ Ñ Ö Ú Þ Ò ½ º ÍÒ ÑÔÐ ÒØ ÓÒ ÓÒ Ö Ø ¸ Ô ÖØ
Ð ÕÙ ÜÔÙ ×Ø ÒÓ × ÓÒÓ ÔÙ Ð Ñ ÒØ º
     Ä ×Ô Ö× ÓÒ ÙÒ Ú Ö× Ð Ù × Ù ÖØ Ò ½ ÔÓÖ ÖØ Ö Ý Ï Ñ Ò º
     Ä ×Ô Ö× ÓÒ Ð Ò Ð Ù ÔÓÔÙÐ Ö Þ ÔÓÖ Ð È ÙÐ Ä Ö×ÓÒ ¾¾ Ý ×Ù × Ù Ö Ñ ÒØÓ Ù
Ö ÔÓÖØ Ó ÔÓÖ ÔÖ Ñ Ö Ú Þ Ò ½ ¼ ÔÓÖ Ï ØÓÐ Ä ØÛ Ò ¾ ¸ Ò Ð ÓÑ Ò Ó Ð × × ×
   ØÓ׺
     Ä ×Ô Ö× ÓÒ Ô Ö Ø Ô Ö           ¬Ò Ð × ÐÓ× × Ø ÒØ º ÍÒ ÖØ ÙÐÓ Ô Ö Ñ Ø Ó ×
          ÐÐ º

5.5    Ejercicios
  ½º × Ö ÙÒ Ð ÓÖ ØÑÓ Ð Ñ Ò ÓÒ ÙÒ Ø Ð × ÓÒ ÓÐ × ÓÒ × × Ô Ö Ñ ÒØ
      Ò Ò × Ò Ð ×Ø × × ÑÔÐ Ñ ÒØ ÒÐ Þ ×º
  ¾º Ä ÙÒ ÓÒ Ð Ñ Ò ÓÒ ÐÓ× Ì LhashTable<Key> Ý DynLhashTable<Key, Record>
     ÒÓ Ú Ö ¬ × Ð Ö ×ØÖÓ Ð Ñ Ò Ö Ô ÖØ Ò Ð Ø Ð º × ÙØ  Ö ÒØ × Ò ÓÕÙ ×
     ÔÖ      ØÙ Ö ×Ø Ú Ö ¬ ÓÒº
  ¿º ÑÙ ×ØÖ Ð ÔÖÓÔÓ× ÓÒ º¾º ´·µ
   º ÜÔÐ ÕÙ Ø ÐÐ Ñ ÒØ Ð ÓÒרÖÙ ÓÒ Ð ÜÔÖ × ÓÒ ´ º¾ µº
468                                                               Cap´
                                                                     ıtulo 5. Tablas hash



   º ×ÙÑ Ò Ó Ò              Ò Ñ ÒØÓ × Ô Ö Ó ÓÒ Ð ×Ø × × ÑÔÐ × Ý ÙÒ Ø Ð    ÔÙÖÓ× ÔÙÒ¹
    Ø ÖÓ׸ Ð ÙÐ Ð          ÓÒ×ÙÑÓ      ×Ô Óº   Ô ÖØ Ö      Ù Ð Ú ÐÓÖ α Ý ST Ð Ö ¹
      ÓÒ Ñ ÒØÓ ÖÖ           Ó × Ñ ÒÓ× ÓרÓ×Ó Ò ×Ô Ó
   º ÓÒ× Ö ÙÒ Ø            Ð × ÓÒ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ × ÔÓÖ Ò Ò Ñ ÒØÓ × Ô Ö Ó
    ´ ÓÒ Ð ×Ø × ÒÐ Þ         ×µ¸ ÙÒ Ø Ñ ÒÓ Ø Ð      M = 13 Ý ÙÒ ÙÒ ÓÒ × h(k) =
    k ÑÓ Mº

     ´µ Ù Ð Ø               Ð Ö ×ÙÐØ ÒØ         Ð × Ù ÒØ × Ù Ò       Ò× Ö ÓÒ
            23, 13, 20, 5, 7, 2, 40, 50, 30, 45, 12, 21, 33, 34


        ´ µ ×ÙÑ Ò Ó ÕÙ Ð × Ð Ú × ×Ø Ò ÒØÖ ½ Ý ½¼¼¸ ÕÙ ÒÓ × Ö Ô Ø Ò Ý ÕÙ
               Ð Ú Ø Ò Ð Ñ ×Ñ ÔÖÓ Ð                    Ù× Ö× ¸ Ð ÙÐ
                 º ÈÖÓ Ð          ÕÙ ÙÒ Ð Ú × Ò Ù ÒØÖ Ò Ð Ø Ð º
                 º ÈÖÓ Ð           ÕÙ ÙÒ Ð Ú × Ò Ù ÒØÖ Ò Ð Ø Ð Ý ÕÙ × Ö ÕÙ Ö
                   Ö ÓÖÖ Ö Ó× ´¾µ Ó Ñ × ÒÓ Ó× ÙÖ ÒØ ×Ù Ù×ÕÙ º
   º     ×ÙÑ ÙÒ Ø Ð × ÓÒ Ö ×ÓÐÙ ÓÒ                     ÓÐ × ÓÒ × ÓÒ Ò Ò Ñ ÒØÓ × Ô Ö Óº
         ×ÙÑ ÙÒ ÒØ             ×Ô Ö          Ð Ú × 105 ÓÒ ÙÒ ×Ú ÓÒ 104º ËÙ Ö
       ÙÒ Ø Ñ ÒÓ Ø Ð Ø Ð ÕÙ Ð ØÓÖ                       Ö α ÒÓ Ü          Ð 97 ±º Ð ÙÐ Ð
       ÐÓÒ ØÙ ×Ô Ö                  Ð ×Ø      ÓÐ × ÓÒ li Ý ×Ù ×Ú ÓÒ Ø Ô º
   º   Ä ×ØÖÙ ØÙÖ          Ù Ø ÙØ Ð Þ ÔÓÖ Ð Ì ODhashTable<Key, Record> ÙØ Ð Þ
       ÙÒ ÑÔÓ ×Ô Ð ÒÓÑ Ò Ó probe typeº                         ÙÞ Ð Ñ Ò Ö Ò ÕÙ × ÔÙ
          Ø ÖÑ Ò Ö Ò Ø ÑÔÓ             Ù ÓÒ Ð Ò ÓÖÑ ÓÒ ÔÓÖØ ÔÓÖ ×Ø ÑÔÓº                   Ó
           ÓØÖÓ¸ ÓÑÓ ÔÙ ÔÖ × Ò Ö×                 ר ÑÔÓ
   º     Ò Ð Ì ODhashTable<Key, Record>¸ ÙÞ ÙÒ Ñ Ò Ö ÔÖ × Ò Ö ÐÓ×
          ÑÔÓ× Ð Ù Ø status Ý probe typeº ´·µ
 ½¼º           ÙÒ Ø Ð × ÓÒ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ × ÔÓÖ Ö ÓÒ Ñ ÒØÓ ÖØÓ¸ ¹
         ÙÞ ÙÒ Ð ÓÖ ØÑÓ Ò Ö Ð Ó× × × ÕÙ Ö ÙÞ Ð Ñ Ò ÑÓ Ð ÒØ                             Ù Ø×
        ÓÒ ×Ø Ó DELETEDº Ð Ð ÓÖ ØÑÓ                ÔÓ Ö × Ö ÔÐ Ó Ô Ö Ù ÐÕÙ Ö ×ØÖ Ø
           Ö ×ÓÐÙ ÓÒ ÔÓÖ Ö ÓÒ Ñ ÒØÓ ÖØÓº
       Ä ÔÖ Ñ Ö × ÓÒ× ×Ø Ò Ü Ñ Ò Ö Ð Ø Ð Ý Ñ Ö Ö ÓÒ EMPTY ØÓ × Ð × ÒØÖ ×
        ÓÒ Ú ÐÓÖ DELETEDº Ä × ÙÒ × ×ØÙ Ð × Ù Ø × ÓÒ Ú ÐÓÖ BUSY Ý Ø ÖÑ Ò
        Ù Ð × Ù Ø × ÓÒ ×Ø Ó EMPTY               Ò× Ö Ñ           × Ð ×Ø Ó DELETED Ñ Ò Ö
       ÕÙ Ð Ð Ú ÔÙ × Ö ÐÓ Ð Þ º
       ÆÓ ר Ô ÖÑ Ø Ó ÑÓÚ Ö ÐÓ× Ö ×ØÖÓ× ÓÒØ Ò Ó× Ò Ð × Ù Ø ×º ´·µ
 ½½º     ÒÙÒ Ð × Ú ÒØ × Ý ×Ú ÒØ × Ð Ð ÓÖ ØÑÓ ÒÙÒ Ó Ò Ð ÔÖ ÙÒØ ÒØ Ö ÓÖº
 ½¾º       Ð ÙÐ ÙÒ ÜÔÖ × ÓÒ × Ñ Ð Ö ´ º¾ µ ÕÙ ÓÑÔ Ö Ð Óר Ò ×Ô Ó Ð Ì
       ODhashTable<Key, Record> ÓÒ Ð                OLHashTable<Key,Record>º

 ½¿º   Ë ÙÒ Ø Ð ×                Ø Ñ ÒÓ m = 23 ÓÒ Ö ×ÓÐÙ ÓÒ               ÓÐ × ÓÒ × ÔÓÖ Ö ¹
         ÓÒ Ñ ÒØÓ ÖØÓ Ý Ù×Ó              Ó× ÙÒ ÓÒ × ×
       ´µ   h1(k) = k    ÑÓ     23
5.5. Ejercicios                                                                   469



      ´µ   h2(k) = 1 + (k   ÑÓ   19)

       ×ÙÑ ÓÑÓ ×ÕÙ Ñ          × Ò ÓÒ      Ð Ñ ÒØÓ Ð ÓÖÑÙÐ (h1(k) + i × h2(k))
     ÑÓ m, m = 23¸ ÓÒ i × Ð ÒÙÑ ÖÓ ÓÐ × ÓÒ × k Ð ÑÓÑ ÒØÓ Ð Ò× Ö ÓÒº
      × Ö¸ × h1(k) ÒÓ Ø Ò ÓÐ × ÓÒ ´i = 0µ¸ ÒØÓÒ × Ð Ð Ñ ÒØÓ × Ò× ÖØ Ó Ò Ð
     ÔÓ× ÓÒ h1(k)º Ë Ý ÙÒ ÓÐ × ÓÒ¸ ÒØÓÒ × Ð Ð Ñ ÒØÓ × Ò× ÖØ Ó Ò h1(k) +
     h2(k) ×   Ý Ó× ÓÐ × ÓÒ ×¸ ÒØÓÒ × Ð Ð Ñ ÒØÓ × Ò× ÖØ Ó Ò h1(k) + 2h2(k)¸ Ý
      × ×Ù × Ú Ñ ÒØ º
      ´ µ × Ö Ð ÔÓ× ÓÒ ÒØÖÓ                 Ð Ø Ð ´Ó        Ù Ð Ø Ð µ ÐÙ Ó   Ð × Ù ÒØ
         × ÙÒ     Ò× Ö ÓÒ
                       4    13   27    31   28   26   40   23   47   1

      ´ µ ×ÙÑ ÕÙ Ó ÙÖÖ ÙÒ               ÓÒ×ÙÐØ ÒØÖ ÙÒ ØÓØ Ð 20 ÔÓ× Ð × Ð Ú ×º
           º Ù Ð × Ð ÔÖÓ              Ð         Ò ÓÒØÖ Ö Ð Ð Ú
           º Ù Ð × Ð ÔÖÓ              Ð        ÒÓ Ò ÓÒØÖ Ö Ð Ð Ú
           º Ù Ð × Ð ÔÖÓ               Ð       ÕÙ ÙÒ Ù×ÕÙ        Ü ØÓ× × Ö ×Ù ÐØ ÓÒ Ð
            ÔÖ Ñ Ö ÙÒ ÓÒ              ×
          Úº Ù Ð × Ð ÔÖÓ               Ð       ÕÙ ÙÒ Ù×ÕÙ        Ü ØÓ× × Ö ×Ù ÐØ ÓÒ Ð
            × ÙÒ ÙÒ ÓÒ                ×
 ½ºÀ       ÙÒ Ò Ð × × ÓÑÔ Ö Ø ÚÓ ÒØÖ ÐÓ× Ì DynLhashTable<Key, Record> Ý
     ODhashTable<Key, Record>º    ÒÙÒ Ú ÒØ ׸ ×Ú ÒØ ׸ × Ñ Ð ØÙ × Ý Ö¹
       Ò ×º
 ½º        ÙÒ Ø Ð × Ð Ò Ð¸ Ð ÙÐ Ð ÒØ           ×Ô Ö      ÐÐ Ñ × Ð ÙÒ ÓÒ
        ×      Ú Þ ÕÙ Ó ÙÖÖ ÙÒ Ò× Ö ÓÒ Ó Ù×ÕÙ º ´·µ
 ½ º Ä ÑÔÐ ÒØ ÓÒ DynLhashTable<Key, Record> Ö             LhashTable<Key> Ð
      ÑÔÐ ÒØ ÓÒ Ý Ô ÖØ ×Ù ÒØ Ö Þº ÈÙ ×ØÓ ÕÙ DynLhashTable<Key, Record> ×
        Ö Ú ÔÙ Ð Ñ ÒØ       LhashTable<Key>¸ Ý Ñ ØÓ Ó×      LhashTable<Key>¸
     ÕÙ ÒÓ ×ÓÒ Ô ÖØ      Ð ÒØ Ö Þ DynLhashTable<Key, Record>¸ ÕÙ ÔÙ Ò
     ÐÐ Ñ Ö× × ÙÒ Òר Ò           DynLhashTable<Key, Record>º ÈÓÖ    ÑÔÐÓ¸ Ð
     Ù×Ù Ö Ó ÔÓ Ö ÒÚÓ Ö Ð Ò× Ö ÓÒ LhashTable<Key> × ÙÒ Ó ØÓ Ø ÔÓ
     DynLhashTable<Key, Record>

              DynHashTable<int, Record> table;

              LhashTable<int>::Bucket bucket = new LhashTable<int>::Bucket (key);

              table.insert(bucket);

     ÜÔÐ ÕÙ ÙÒ Ñ Ò ×ÑÓ Ô Ö Ú Ø Ö ÕÙ ×ØÓ Ó ÙÖÖ º ×         Ö¸ Ô Ö ÑÔ Ö Ó¸
     Ò Ð Ô ÓÖ ÐÓ× ×Ó׸ Ô Ö Ø Ø Ö ÕÙ Ð Ù×Ù Ö Ó ÐÐ ÑÓ Ð Ò× Ö ÓÒ
    LhashTable<Key> Ý Ö ÔÓÖØ Ö ÙÒ ÖÖÓÖ Ò Ø ÑÔÓ      Ù ÓÒº
 ½ º ÓÒ× Ö Ð ÔÖÓ Ð Ñ Ð Ü ×Ø Ò           ÙÒ Ó ØÓº ×ØÓ ×¸ Ó ÙÒ ÔÙÒØ ÖÓ ÙÒ
    Ó ØÓ Ø ÔÓ¸ ÑÓ× Object¸ × × Ú Ö ¬ Ö × Ð Ö ÓÒ Ñ ÑÓÖ ÔÙÒØ
       Ø Ú Ñ ÒØ ÙÒ Ó ØÓ × Ø ÔÓº
470                                                       Cap´
                                                             ıtulo 5. Tablas hash



          × ÙØ ØÓ × Ð × ÐØ ÖÒ Ø Ú × ÔÓ× Ð × Ô Ö × Ò Ö ÙÒ × ×Ø Ñ Ò Ö Ð Ú Ö ¬ ÓÒ
             Ü ×Ø Ò     Ó ØÓ׺
 ½º    ÁÑÔÐ ÒØ Ð × Ð × × LhashTable<Key> Ý LhashTableVtl<Key> Ô Ö ÕÙ ÙØ Ð Ò
       Ð ×Ø × × ÑÔÐ Ñ ÒØ ÒÐ Þ × Ò ÐÙ Ö         Ó Ð Ñ ÒØ ÒÐ Þ ×º
 ½º    ÁÑÔÐ ÒØ Ð × Ð × × LhashTable<Key> Ý LhashTableVtl<Key> Ô Ö ÕÙ ÙØ Ð Ò
       Ð ×Ø × ÒÐ Þ × ÓÖ Ò ×º Ê Ð ÙÒ ×ØÙ Ó ÓÑÔ Ö Ø ÚÓ ÓÒ Ð ÑÔÐ ÒØ ÓÒ
       ØÖ ÓÒ Ð ÜÔÐ           Ò Ü º½º¿º½º
 ¾¼º       Ð ÙÐ Ð ÔÖÓ Ð          ÕÙ Ð ÓÔ Ö ÓÒ k ÑÓ 150 ×ÓÐÓ ØÓÑ Ò Ù ÒØ ÐÓ× Ó×
            ØÓ× Ñ ÒÓ× × Ò ¬ Ø ÚÓ׺
 ¾½º     ÓÒ× Ö ÙÒ Ø Ð × Ð Ò Ð ÓÒ Ú ÐÓÖ Ò Ð M = 5 Ý ÙÒ ØÓÖ             Ö Ñ Ü ÑÓ
       Ô ÖÑ Ø Ó αu = 0, 9º È Ö Ð × Ù ÒØ × Ù Ò              Ò× Ö ÓÒ
       181 186 10 6 5 58 191 22 113 7 83 118 138 122 16 18 150 39 48 157

          Ù   Ð ×Ø Ó Ö ×ÙÐØ ÒØ    Ð Ø Ð ÐÙ Ó      Ð × Ò× Ö ÓÒ ×º

Bibliograf´
          ıa
 ½ ØØÔ »»ÛÛÛº ÒÙºÓÖ »×Ó ØÛ Ö » Ô Ö »º
 ¾ Ó¸ ÀÓÔ ÖÓ Ø¸ Ò ÍÐÐÑ Òº Ø ËØÖÙ ØÙÖ × Ò Ð ÓÖ Ø Ñ׺                ×ÓÒ¹Ï ×Рݸ
   Ê Ò ¸ ½ ¿º
 ¿ Ó¸ ÀÓÔ ÖÓ Ø¸ Ò ÍÐÐÑ Òº רÖÙ ØÙÖ ×          ØÓ× Ý Ð ÓÖ ØÑÓ׺      ×ÓÒ¹Ï ×Ð Ý
   Á ÖÓ Ñ Ö Ò ¸ ½ º ÌÖ Ù Ò               Ñ Ö Ó Î Ö × Î ÐÐ Þ Ò Ý ÂÓÖ ÄÓÞ ÒÓ
   ÅÓÖ ÒÓº
      Ò Åº Ñ Ð¸ Ð Ò Åº Ó Ñ ¸ ƺ ÊÓ ×Ø Ö¸ Ò ÖØ ÙÖ Äº Ë Ñ٠к               Ì
   Ý Ö × ÙÒ ÖØ Ò ´ µº Ñ Ð ÓÖ Ò Ø Ø                Ó ÓÔ Ò Ö ×× Ò Û Ø Ð Ò Ö
   ÔÖÓ Ò ¸ Û Û × Ð Ø Ö Ò Ô Ò ÒØÐÝ Ö × ÓÚ Ö Ò ÔÙ Ð × ½¼ º¸ ½ ¿º
      Ò Ð Âº ÖÒר Òº È Ò Û            Ò Ð º ÖÒר Òº
      ÖØ Ö Ò Ï Ñ Òº ÍÒ Ú Ö× Ð Ð ×× × Ó × ÙÒ Ø ÓÒ׺ ÁÒ ËÌÇ           Å ËÝÑÔÓ¹
   × ÙÑ ÓÒ Ì ÓÖÝ Ó ÓÑÔÙØ Ò ´ËÌÇ µ¸ ½ º
   ʺº      ÐÐ º Å Ò Ñ Ð Ô Ö Ø × ÙÒ Ø ÓÒ× Ñ × ÑÔÐ º ÓÑÑÙÒ Ø ÓÒ× Ó Ø
       Ÿ ¾¿´½µ ½ ß½ ¸  ÒÙ ÖÝ ½ ¼º
   ̺ Àº ÓÖÑ Ò¸ º º Ä × Ö×ÓÒ¸ Ò Êº ĺ Ê Ú ×Øº ÁÒØÖÓ Ù Ø ÓÒ ØÓ Ð ÓÖ Ø Ñ׺ ÅÁÌ
   ÈÖ ×׸ Ñ Ö ¸ Å ¸ ÍË ¸ ½ º
     ÖÒÓÐ Áº ÙÑ Ýº ÁÒ Ü Ò ÓÖ Ö Ô Ö Ò ÓÑ ×× Ñ ÑÓÖÝ ×Ýר Ñ׺ ÓÑÔÙØ Ö× Ò
     ÙØÓÑ Ø ÓÒ¸ ´½¾µ ß ¸        Ñ Ö ½ º Öר Ô Ô Ö Ò ÓÔ Ò Ð Ø Ö ØÙÖ ÓÒ × Ò º
     Öר Ù× Ó × Ò Ý Ø Ò Ø ÑÓ ÙÐÙ× Ó Ú × ÓÒ Ý ÔÖ Ñ ÒÙÑ Öº Å ÒØ ÓÒ×
       Ò Ò ÓÖ ÓÐÐ × ÓÒ Ò Ð Ò ¸ ÙØ ÒÓØ ÓÔ Ò Ö ×× Ò º Ë ½¼ ÓÖ Ø Ð ØØ Öº
5.5. Bibliograf´
               ıa                                                                471



½¼     º Ⱥ Ö× ÓÚº Ó Ð Ý         º Æ Ù ËËËʸ ½½ ¾ ß ¿¼¸ ½ º Ê × ÓÚ ÖÝ Ò ¬Öר
     ÔÙ Ð Ø ÓÒ Ó Ð Ò Ö ÓÔ Ò Ö ×× Ò º Ë ¸ º
½½   Ϻ ÐÐ Öº Ò ÁÒØÖÓ Ù Ø ÓÒ ØÓ ÈÖÓ Ð ØÝ Ì ÓÖÝ Ò Ø× ÔÔÐ Ø ÓÒ׺ ÂÓ Ò
     Ï Ð Ý¸ ÔÙ ¹ÂÏ Ö¸ ½ ¼º Ë Ø × Ù×× ÓÒ Ó Ø ÖØ Ý Ô Ö ÓÜ Ò Ë Ø ÓÒ ¾º¿º
½¾   Ⱥ Ð ÓРظ º Ö Ý¸ Ò Äº Ì ÑÓÒ Öº ÖØ Ý Ô Ö Óܸ ÓÙÔÓÒ ÓÐÐ ØÓÖ׸                 Ò
      Ð ÓÖ Ø Ñ× Ò × Ð ¹ÓÖ Ò Þ Ò × Ö º Ì Ò Ð Ê ÔÓÖØ ËÌ Æ¹ ˹ ¹½½ ¸ Ô ÖØ¹
     Ñ ÒØ Ó ÓÑÔÙØ Ö Ë Ò ¸ ËØ Ò ÓÖ ÍÒ Ú Ö× ØÝ¸ ½ ¸ Ù Ùרº
½¿   È Ð ÔÔ Ð ÓРظ Ⱥ º Ö Ò Ö¸ Ⱥ à Ö× Ò Ó Ö¸ Ò Àº ÈÖÓ Ò Öº ÇÒ Ö Ñ ÒÙ Ò³×
     ɹ ÙÒ Ø ÓÒº Ì Ò Ð Ê ÔÓÖØ Êʹ½ ¼¸ ÁÒÖ ¸ ÁÒר ØÙØ Æ Ø ÓÒ Ð Ê Ö                   Ò
     ÁÒ ÓÖÑ Ø ÕÙ Ø Ò ÙØÓÑ Ø ÕÙ º
½    ʺ ĺ Ö Ñ¸ º º ÃÒÙØ ¸ Ò Çº È Ø × Ò º ÓÒ Ö Ø Å Ø Ñ Ø ×                      ÓÙÒ¹
        Ø ÓÒ ÓÖ ÓÑÔÙØ Ö Ë Ò º           ×ÓÒ¹Ï ×Ð Ý ÈÙ º¸ ½ º
½    Ì Ó ÙÒ Ò                 ÓØÓº ËØÙ × ÓÒ × Ò            ½º ÓÑÔ Ö ×ÓÒ Ó × Ò
      Ð ÓÖ Ø Ñ× Û Ø Ý Ð Ø ÓÒº ÂÓÙÖÒ Ð Ó Ø ÁÒ ÓÖÑ Ø ÓÒ ÈÖÓ ×× Ò ËÓ ØÝ Ó
     Â Ô Ò¸ ¿´½µ ½ß½¾¸      ½ ¼º
½        Ö Ö Âº ÀÓÐÞÑ ÒÒº Ò Ò ÐÝ× × Ó Ø×Ø Ø × Ò º ÓÖÑ Ð Å Ø Ó × Ò ËÝר Ñ
         × Ò¸ ½¿´¿µ ¾ ß¿¼ ¸ ½ º
½    à ÖÔ Ò Ê Òº Æ ÒØ Ö Ò ÓÑ Þ Ô ØØ ÖÒ¹Ñ Ø Ò Ð ÓÖ Ø Ñ׺ Á ÅÂÊ Á Å
     ÂÓÙÖÒ Ð Ó Ê × Ö Ò Ú ÐÓÔÑ ÒØ¸ ¿½¸ ½ º
½      ÓÒ Ð º ÃÒÙØ º Ë Ñ ÒÙÑ Ö Ð Ð ÓÖ Ø Ñ׸ ÚÓÐÙÑ ¾ Ó Ì ÖØ Ó ÓÑÔÙØ Ö
     ÈÖÓ Ö ÑÑ Ò º        ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ÍË ¸ Ø Ö Ø ÓÒ¸ ½ º
½      ÓÒ Ð º ÃÒÙØ º ËÓÖØ Ò Ò Ë Ö Ò ¸ ÚÓÐÙÑ ¿ Ó Ì                    ÖØ Ó ÓÑÔÙØ Ö
     ÈÖÓ Ö ÑÑ Ò º        ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ÍË ¸ × ÓÒ Ø ÓÒ¸ ½ º
¾¼     ÓÒ Ð º ÃÒÙØ º Ë Ð Ø È Ô Ö× ÓÒ Ò ÐÝ× × Ó Ð ÓÖ Ø Ñ׺ ËÄÁ ÈÙ Ð Ø ÓÒ׸
     ËØ Ò ÓÖ ¸ ¸ ÍË ¸ ¾¼¼¼º
¾½     ÙØÐ Ö Ïº Ä ÑÔ×ÓÒº À ÒØ× ÓÖ ÓÑÔÙØ Ö ×Ýר Ñ × Òº Á         ËÓ ØÛ Ö ¸ ½´½µ ½½ß¾ ¸
     Â ÒÙ ÖÝ ½ º
¾¾   Ä Ö×ÓÒº ÝÒ Ñ × Ø Ð ×º             Å ÓÑÑÙÒ Ø ÓÒ× Ó Ø               Ÿ ¿½¸ ½ º
¾¿   À ÖÖÝ Êº Ä Û × Ò Ä ÖÖÝ Ò Ò Ö º           Ø ËØÖÙ ØÙÖ × Ò Ì Ö Ð ÓÖ Ø Ñ׺
     À ÖÔ Ö ÓÐÐ Ò× ÈÙ Ð × Ö׸ Æ Û ÓÖ ¸ ½ ½º
¾    Ï ØÓÐ Ä ØÛ Òº Ä Ò Ö × Ò          Ò Û Ð ÓÖ Ø Ñ ÓÖ ¬Ð × Ò Ø Ð × Ö ×× Ò º ÁÒ
     Á Ç ¸ Ô × ¾ ¼ß¾ ¸ ½ ¼º
¾    Æ ÓÐ × Æ Ø Ö ÓØ Ò ÂÙÐ Ò Ë Û Ö º Î Ð Ö Ò           ÔÖÓ Ö Ñ ×ÙÔ ÖÚ × ÓÒ Ö Ñ ÛÓÖ º
       Ð ØÖº ÆÓØ × Ì ÓÖº ÓÑÔÙØº Ë ¸ ´¾µ¸ ¾¼¼¿º
¾    ÇÞ Ò Ø ÓÞ Ò ÜÙ׺ÝÓÖ Ùº º È Ò Û              Ð ÔÖÓÝ ØÓ × Ñº
472                                               Cap´
                                                     ıtulo 5. Tablas hash



¾ Ϻ Ϻ È Ø Ö×ÓÒº     Ö ×× Ò ÓÖ Ö Ò ÓÑ   ×× ×ØÓÖ º Á Å ÂÓÙÖÒ Ð Ó Ê × Ö
      Ò   Ú ÐÓÔÑ ÒØ¸ ½´¾µ¸ ÔÖ Ð ½ º
¾ ÊÓ ÖØ Ë Û Ò È Ð ÔÔ Ð ÓРغ Ò ÁÒØÖÓ Ù Ø ÓÒ ØÓ Ø Ò ÐÝ× × Ó Ð Ó¹
   Ö Ø Ñ׺   ×ÓÒ¹Ï ×Ð Ý ÈÙ Ð × Ò ÓÑÔ Òݸ ½ º
¾ È Ø Ö Ú Ò Ö Ä Ò Òº ÜÔ ÖØ ÈÖÓ Ö ÑÑ Ò ¹ Ô Ë Ö Ø×º ËÙÒËÓ Ø ÈÖ ×× ¹
   ÈÖ ÒØ À ÐÐ Ì ØØÐ ¹¸ ½ º ÁË Æ ¼¹½¿¹½ ¾ ¹ º
¿¼ ź º Ï ×׺ Ø ËØÖÙ ØÙÖ × Ò Ð ÓÖ Ø Ñ Ò ÐÝ× × Ò º ×ÓÒ Ï ×Рݸ ½ º
       Ë Ò       ÒÓØ Ò ¸ Ò Ñ Ò ÙÑÑ Ò ×¸ ³ ¾º
Cap´
   ıtulo 6

´
Arboles de b´squeda equilibrados
            u

ÉÙ Þ Ð ÙÒ Ú Þ Ð ÒÓ ÓÒ  ÕÙ Ð Ö Ó × ÒÓ× Ý Ô Ö             Ó    Ó ÙÒ        Ò ×ØÖ Ð¹
Ñ ÒØ ÒÑ ÑÓÖ Ð Ý ÙÝÓ ×Ô ØÓ Ú ×Ù Ð × Ð × Ù ÒØ




Ä Ñ Ò Ô ØÓÖ Þ ÙÒ ÖØ ØÓ ÒØ ÕÙ × ÑÓ¸ ÓÒ Ø Ò Ò                 ØÙ Ð Ð ×Ù×Ó¸ Ô ÖÓ ÙÒ
Ú ÒØ Ò Ð ÙÒÓ× × ×Ó× ÓÒØ ÜØÓ׸ ÙÝ ¬Ò Ð           × Ô × Ö Ó × ¸ Ñ Ö Ô ×Ó׺ Ä      ×
 ÓÐÓ Ö Ò ÙÒÓ ÐÓ× ÔÐ Ø ÐÐÓ× ÐÓ ÕÙ × × Ô × Ö¸ Ñ ÒØÖ × ÕÙ Ò Ð ÓØÖÓ × ÔÓÒ Ò Ô ×Ó×
    Ö ÖÒ      ØÙ ÐÑ ÒØ ÐÐ Ñ Ó× ÔÐÓÑ × º Ù Ò Ó ÐÓ× ÔÐ Ø ÐÐÓ× Ð ÒÞ Ò Ù Ð
 ÐØÙÖ ×      ÕÙ          ÕÙ Ð Ö ÙÑ           ÕÙÙ× ¸ ÕÙ × Ò ¬      Ù Ð Ý Ð Ö ÕÙ
 Ö Ð ÒÓÑ Ö ÖÓÑ ÒÓ Ð ÔÐÓÑ Ý ÙÒ Ú ÒØ ÓÑÓ ÙÒ Ñ                      Ö Ð Ô ×Ó Ó Ú ÐÓÖ
  ÓÒÓÑ Óº
     Ð ÖØ ØÓ Ò Ù ×Ø ÓÒ¸ Ó ÒÓ × Ð ÒÓÑ Ò Ð ÒÞ ¸ Ô ÖÓ ÒØ ÒÓ ÐÓ× ÖÓÑ ÒÓ×
Ø Ñ Ò ÐÓ Ñ ÒØ ÖÓÒ ÓÑÓ Ð Ö ¸ ÔÙ × ×ØÓ× Ö ¬Ò ÖÓÒ Ð Ñ Ò ×ÑÓ Ø Ð ÓÖÑ ÕÙ Ð
 Ö ÞÓ Ð Ð ÒÞ ÔÓ           ×ÔÐ Þ Ö× Ý ×Ùר ØÙ Ö Ð ÙÒ × ÔÐÓÑ × Ö Ö Ò º ×
 ÒØÓÒ ×¸ Ð Ð ÒÞ Ó Ð Ö          × Ñ ÓÐ Þ Ó × ØÙ ÓÒ × Ò Ð × Ù Ð × × Ò Ð Ð ÙÒ
 ×Ô        Ù Ð Ó ÕÙ Ð Ö Ó Ò Ô ÖØ ÙÐ Ö¸ × Ó Ð × Ñ ÓÐÓ Ð Ùר ¸ ÕÙ Þ Ð
Ú ÖØÙ Ñ ×      Ð ÙÐØ Ú Öº
     Ò Ð Ñ ØÓ ÐÓ× Ö ÓÐ × Ò Ö Ó׸ Ð ÕÙ Ð Ö Ó × Ô ØÓÖ Þ          Ó Ð Ý Ò ÓÒÓ
 Ñ Ò × Ù ÒØ
                                         T



                                 L(T )       R(T )


Ä × Ö Ñ × Ð Ö ÓÐ T Ø Ò Ò Ô ×Ó× ÕÙ Ú Ð ÒØ × × Ö¸ ÓÒØ Ò Ò Ð × Ñ ×Ñ × ÒØ      ×
   ÒÓ Ó׺ T ר Ö ¸ ÒØÓÒ ×¸ Ò ÕÙ Ð Ö Ó Ó ÕÙ Ð Ö Óº Ê ÙÖ× Ú Ñ ÒØ ¸ × ØÓ Ó× ÐÓ×
ÒÓ Ó× T ר Ò ÕÙ Ð Ö Ó׸ ÒØÓÒ × Ð ÐØÙÖ         T Ø Ò    O(Ð (n))¸ ÐÓ Ù Ð


                                         ¿
474                                Cap´        ´
                                      ıtulo 6. Arboles de b´ squeda equilibrados
                                                           u



ÕÙ Ð Ö Ò Ñ ÒØÓ Ð Ù×ÕÙ ×Ó Ö ÙÒ Ö ÓÐ × Ø Ñ Ò O(Ð                   (n))º  Ð Ù Ð ÕÙ
Ó ÙÖÖ ÓÒ Ð × Ú ÖØÙ ×¸ ÐÓ× Ö ÓÐ × ×ØÖ ØÓ× ×ÓÒ Ù ÒÓ× Ò Ð Ñ           Ò ÕÙ ×ØÓ× ×Ø Ò
 ÕÙ Ð Ö Ó׺

6.1      Equilibrio de ´rboles
                       a
 Ò ÙÒ ÔÖ Ñ Ö Òר Ò ¸ ÔÓ ÑÓ× ÒØ ÒØ Ö Ð ÒÞ Ö ÙÒ ÕÙ Ð Ö Ó × Ó Ò Ð × Ù ÒØ
  ¬Ò ÓÒ
Definici´n 6.1 (Equilibrio fuerte de Wirth [17]) ÍÒ Ö ÓÐ
       o                                                       Ò Ö Ó Ì × ÕÙ Ð Ö Ó
⇐⇒
                       ∀ni ∈ T , | | Ä(ni)| − | Ê(ni)| | ≤ 1

       Ó ×Ø ¬Ò ÓÒ¸ ÔÓ ÑÓ× × Ò Ö ÙÒ ÔÖ Ñ Ö Ð ÓÖ ØÑÓ ÕÙ ÒÓ× ÕÙ Ð Ö ÙÒ Ö Óк
ÆÙ רÖÓ Ð ÓÖ ØÑÓ ÙØ Ð Þ ÐÓ× Ö ÓÐ × ÜØ Ò Ó× ´    µ ÜÔÐ Ó× Ò Ü º½½ ´Ô Ò ¿ ¿µº
Ä × ÓÔ Ö ÓÒ × Ö ÕÙ Ö × Ð × Ò ÐÙ ÑÓ× Ò Ð Ö ÚÓ ØÔÐ Ð Ò ØºÀ ´Ò Ú Ö ¬Ò µ º
   ÍÒ Ð × Ú ÒØ × ÙÒ                 × Ð ÓÔ Ö ÓÒ × Ð ÓÒ ´Ü º½½º½ ´Ô Ò ¿ µµº
Å ÒØ ר ÓÔ Ö ÓÒ¸ ÔÓ Ö ÑÓ× × Ð ÓÒ Ö Ð Ð Ú Ð ÒØÖÓ Ý ÖÐ Ö Þ Ð Ö Óк
 Ð ÒÙÑ ÖÓ ÒÓ Ó× Ò Ñ Ó× Ð Ó× Ö Ö ÐÓ ×ÙÑÓ Ò ÙÒÓº Ë ÔÐ ÑÓ× ×Ø ÔÖÓ ¹
 Ñ ÒØÓ Ö ÙÖ× Ú Ñ ÒØ Ó Ø Ò ÑÓ× ÙÒ Ö ÓÐ ÕÙ Ð Ö Ó × ÙÒ Ï ÖØ º
   Ê ÕÙ Ö ÑÓ× ÙÒ ÙÒ ÓÒ ÕÙ × Ð ÓÒ ÙÒ ÒÓ Ó × ÙÒ ×Ù ÔÓ× ÓÒ Ò¬ Ý ÐÓ ×Ù      ר
Ð Ö Þº Ì Ð ÓÔ Ö ÓÒ × ¬Ò ÓÑÓ × Ù
 ÊÙØ Ò × ÕÙ Ð Ö Ó        ≡
     template <class Node> inline
 Node * select_gotoup_root(Node * root, const size_t & i)
 {
   if (i == COUNT(LLINK(root)))
     return root;
   if (i < COUNT(LLINK(root)))
     {
       LLINK(root) = select_gotoup_root(LLINK(root), i);
       root = rotate_to_right_xt(root);
     }
   else
     {
       RLINK(root) = select_gotoup_root(RLINK(root), i - COUNT(LLINK(root)) - 1);
       root = rotate_to_left_xt(root);
     }
   return root;
 }
  ¬Ò ×
 select gotoup root¸   Ù×   Ò ÙÒ   º
select gotoup root() × Ð ÓÒ Ð i¹ × ÑÓ ÒÓ Ó Ð Ö ÓÐ ÓÒ Ö Þ root Ý ÐÓ ×Ù  ר
Ð Ö Þº Ë ØÓÑ ÑÓ× ÙÒ Ö ÓÐ n ÒÓ Ó׸ × Ð ÓÒ ÑÓ× Ð ÒÓ Ó ÓÖÖ ×ÔÓÒ ÒØ Ð
ÔÓ× ÓÒ n/2 Ý ÐÓ ×Ù ÑÓ× ×Ø Ð Ö Þ¸ ÒØÓÒ ×¸ Ò Ú Ð Ð ÒÓ Ó n/2¸ Ð        ÖÒ
ÒÓ Ó× ÒØÖ ×Ù ×Ù Ö ÓÐ ÞÕÙ Ö Ó Ý Ö Ó × ÐÓ ×ÙÑÓ ÙÒÓº Ë ÔÐ ÑÓ× Ð Ñ ×ÑÓ
ÔÖ Ò Ô Ó Ö ÙÖ× Ú Ñ ÒØ ¸ Ù ÑÓ× Ð Ð ÓÖ ØÑÓ × Ù ÒØ
 ÊÙØ Ò × ÕÙ Ð Ö Ó      +≡
6.1. Equilibrio de ´rboles
                   a                                                                               475



      template <class Node> inline
  Node * balance_tree(Node * root)
  {
    if (COUNT(root) <= 1)
      return root;
    root         = select_gotoup_root(root, COUNT(root) / 2);
    LLINK(root) = balance_tree(LLINK(root));
    RLINK(root) = balance_tree(RLINK(root));
    return root;
  }
Í× × select gotoup root     º
                      ÔÙ Ö Ð Þ Ö× Ñ ÒØ Ð Ô ÖØ ÓÒ ÔÓÖ ÔÓ× ÓÒ ÜÔÐ
   select gotoup root()
 ÒÜ   º½½º ´Ô Ò ¿ µº ×ØÓ × Ð Ó     Ö Óº




                                         ´ µ ÒØ ×         ÐÒ        Ö




                                        ´ µ   ×ÔÙ ×        ÐÒ           Ö


        ÙÖ º½        ÑÔÐÓ       ÕÙ Ð Ö Ó        ÙÒ Ö ÓÐ Ð ØÓÖ Ó Ñ                 ÒØ   balance()

   Ë Ð Ö ÓÐ ÓÖ Ò Ð Ù ÓÒרÖÙ Ó Ô ÖØ Ö ÙÒ × Ù Ò Ð ØÓÖ ¸ ÒØÓÒ × ×Ù ÐØÙÖ
Ø Ò O(Ð n) Ý Ð × ÑÔ ÒÓ select gotoup root() ÐÐ Ñ Ó × balance tree()
 × O(Ð n)º Ò ×Ø ÑÓÑ ÒØÓ Ð Ö ÓÐ ÕÙ Ô ÖØ ÓÒ Ó Ò Ó× Ô ÖØ × ÕÙ Ø Ø Ú ×¸
ÙÒ ÓÒ ÙÒ ÓÒ×ÙÑÓ Ø ÑÔÓ ÔÖÓÔÓÖ ÓÒ Ð Ð Ñ Ø        Ð ÒØÖ º ÈÓ ÑÓ׸ Ô٠׸
ÔÐ ÒØ Ö Ð × Ù ÒØ Ù ÓÒ Ö ÙÖÖ ÒØ Ô Ö Ð × ÑÔ ÒÓ balance tree()

                          T (n) =
                                    1                           ×       n≤1
                                                                              .
                                    2T (n/2) + O(Ð n)           ×       n>1

ËÙÔÓÒ Ò Ó ÕÙ n × ÙÒ ÔÓØ Ò               Ü Ø         2¸   Ö Ð Þ ÑÓ× Ð ØÖ Ò× ÓÖÑ ÓÒ n = 2k =⇒
k = Ð nº ×ØÓ ÒÓ× ÔÐ ÒØ
                                    T (2k) = 2T (2k−1) + k .
476                                          Cap´        ´
                                                ıtulo 6. Arboles de b´ squeda equilibrados
                                                                     u



  Ú   Ò ÓÐ      Ù ÓÒ ÒØÖ         2k¸   Ø Ò ÑÓ×
             T (2k)        T (2k−1)   k
                      =             + k
               2k            2k−1    2
                           T (2k−2) k − 1   k
                      =       k−2
                                    + k−1 + k
                             2        2    2
                                                                                       k
                           T (2k−3) k − 2 k − 1  k                                          i
                      =       k−3
                                   + k−2 + k−1 + k = 1 +                                           =⇒
                             2      2     2     2                                           2i
                                                                                      i=1
                                 k                                            k
             T (n)
               n
                      = 1+
                                       i
                                       2i
                                              =⇒ T (n) = n + n
                                                                                    i
                                                                                    2i
                                                                                       .                      ´ º½µ
                                 i=1                                         i=1
                                                                               Sk

Ä ×ÓÐÙ ÓÒ Ð Ö ÙÖÖ Ò         Ô Ò ¸ Ô٠׸ Ð Ú ÐÓÖ                                Ð ×ÙÑ ØÓÖ           Sk =   k    i
                                                                                                          i=1 2i   ¸Ð
 Ù Ð ÔÙ Ö ×ÓÐÚ Ö× ÔÓÖ Ô ÖØÙÖ ÓÒ
                                                   k
                                                         i
                                     Sk =                   =⇒
                                                         2i
                                                   i=1
                                                    k
                                 k+1                     i+1
                          Sk +               =
                                 2k+1                    2i+1
                                                   i=0
                                                    k                  k
                                                             i                1
                                             =                    +                 =⇒
                                                         2i+1                2i+1
                                                   i=0                 i=0
                                                       Sk
                                                        2
                                                   k
                                                                      k+1
                                     Sk
                                     2
                                             =
                                                         2i+1
                                                             1
                                                                  −
                                                                      2k+1
                                                                           .                                  ´ º¾µ
                                                   i=0
                                                       Qk

      Ð Ú Þ¸ ´ º¾µ Ô Ò            Ð ×ÓÐÙ ÓÒ
                                       k
                           Qk =
                                             1
                                            2i+1
                                                   =
                                                       1   1            1
                                                         + 2 + · · · + k+1 .
                                                       2 2            2
                                                                                                              ´ º¿µ
                                     i=0

   ÅÙÐØ ÔÐ Ò Ó ´ º¿µ ÔÓÖ 2 Ø Ò ÑÓ×
                                 2Qk = 1 +
                                                   1   1         1
                                                     + 2 + ··· + k .
                                                   2 2          2
                                                                                                              ´ºµ
      ÓÖ Ö ×Ø ÑÓ× ´ º µ Ñ ÒÓ× ´ º¿µ ÐÓ ÕÙ ÒÓ×                          ÓÑÓ ×ÓÐÙ ÓÒ               ´ º¿µ
                                             Qk = 1 −
                                                               1
                                                             2k+1
                                                                  ;                                           ´ºµ
ÙÝÓ Ú ÐÓÖ¸ Ð ×Ùר ØÙ ÖÐÓ Ò ´ º¾µ ÒÓ× ÖÖÓ
                                                     k+1   k+2
                             Sk = 2 −
                                                 1
                                                 2k
                                                    − k =2− k
                                                      2     2
                                                                                                              ´ºµ
   ËÙר ØÙÝ Ò Ó ´ º µ Ò ´ º½µ Ø Ò ÑÓ×
  T (n) = n + n 2 −
                      k+1
                                  = n+n 2−
                                                         Ð       n+2
                                                                             = 3n − Ð n − 2, n ≥ 1 ;          ´ºµ
                       2k                                        n
´
6.2. Arboles aleatorizados                                                                   477



Ö ×ÙÐØ Ó ÕÙ × O(n Ð n)º
    balance tree() ׸ Ô٠׸ O(n Ð n)¸ ÙÒ Ø ÑÔÓ ÓרÓ×Ó × Ð ÙÒ ÓÒ × ÒÚÓ              Ö¹
 Ù ÒØ Ñ ÒØ º À ר Ð ÔÖ × ÒØ ¸ Ò             × Ù ÖØÓ ÙÒ Ð ÓÖ ØÑÓ ÔØ Ð ÕÙ ÑÓ ¹
¬ÕÙ ÙÒ         Ý ÕÙ Ö ÒØ ÙÒ ÓÒ ÓÒ ÕÙ Ð Ö Ó Ù ÖØ º Ê ÞÓÒ ÔÓÖ Ð Ù Ð ×
ÓÔØ Ó ÔÓÖ Ö Ð Ö Ð × ÓÒ ÓÒ ×           ÕÙ Ð Ö Ó Ô Ö      ÖÐ × Ñ ÒÓ× Ö ×ØÖ Ø Ú ×º Ë ÙÒ
Ð × Ø Ò × Ð ÓÖ ØÑ ׸ ÔÓ ÑÓ× ÔÐ ÒØ Ö Ð × Ù ÒØ Ð × ¬ ÓÒ ÐÓ× Ñ Ò ×ÑÓ×
 ÕÙ Ð Ö Ó ÓÒÓ Ó×
    ¯ Equilibrio Probabil´  ıstico: ר Ò ÓÕÙ ÓÒ× ×Ø Ò ØÓÑ Ö           × ÓÒ × Ð ØÓÖ ×
      Ø Ò ÒØ × Ö ×Ø Ð Ö Ð ÕÙ Ð Ö Óº ÄÓ× Ö ÓÐ × Ó Ø Ò Ó׸ Ó Ö Ò ÙÒ Ø ÑÔÓ
       ×Ô Ö Ó O(Ð n) Ô Ö ØÓ × Ð × ÓÔ Ö ÓÒ ×º
           ר Ð ×      ÕÙ Ð Ö Ó ×ØÙ Ö ÑÓ× Ó× ×ØÖÙ ØÙÖ × ÐÓ× Ö ÓÐ × Ð ØÓÖ Þ Ó× Ý
      ÐÓ× ØÖ Ô׺
    ¯ Equilibrio garantizado: Ò ×Ø        Ò ÓÕÙ × ÔÐ ÒØ Ò ÓÒ ÓÒ ×            ÕÙ Ð Ö Ó¸
      Ñ ÒÓ× Ö ×ØÖ Ø Ú × ÕÙ Ð Ù ÖØ ¸ ÕÙ Ô ÖÑ Ø Ò ÑÓ ¬ ÓÒ × O(Ð n) ×Ó Ö ÙÒ Ö ÓÐ
        Ò Ö Ó Ý ÕÙ ÓØ Ò Ð ÐØÙÖ O(Ð n)º ÄÓ× Ñ ØÓ Ó×                ר Ø ÔÓ Ó Ö Ò ÙÒ
         Ö ÒØ O(Ð n) Ò ØÓ × Ð × ÓÔ Ö ÓÒ ×º
          Ó ×Ø Ø ÔÓ       ÕÙ Ð Ö Ó ×ØÙ Ö ÑÓ× Ó× ×ØÖÙ ØÙÖ × ÐÓ× Ö ÓÐ × ÎÄ Ý ÐÓ×
       Ö ÓÐ × ÖÓ Ó¹Ò ÖÓ׺
    ¯ Equilibrio amortizado: ר Ò ÓÕÙ ÓÒ× ×Ø Ò              ÙØ Ö ÓÔ Ö ÓÒ × ×Ô Ð ×
        ÙÖ ÒØ Ð     Ù ÓÒ Ù ÐÕÙ Ö ÓÔ Ö ÓÒ Ñ Ò Ö Ø Ð ÕÙ Ð Ö ÓÐ Ø Ò                  ר Ö
       ÕÙ Ð Ö Óº      Ó ×Ø ÓÒ Ô ÓÒ¸ × Ö ÒØ Þ ÙÒ Óר ÑÓÖØ Þ Ó O(p Ð n)
      Ô Ö p ÓÔ Ö ÓÒ × ×Ù × Ú × ×Ó Ö Ð Ö Óк
        Ò ×Ø ÖÙÔÓ¸ Ð ÙÒ Ø Ò ÑÓÖØ Þ                ÓÒÓ     Ô Ö ÕÙ Ð Ö Ö Ö ÓÐ × × Ð
         ×ÔÐ Ó ´splayµ¸ ÑÔÐ         Ò ÐÓ× Ö ÓÐ × ×ÔРݺ

6.2        ´
           Arboles aleatorizados
ÍÒ Ö ÓÐ Ò Ö Ó        Ù×ÕÙ    Ð ØÓÖ Þ Ó ´     µ × ÙÒ Ö ÓÐ Ò Ö Ó       Ù×ÕÙ
 ÜØ Ò Ó ´         Ò Ü º½½ ´Ô Ò ¿ ¿µµ ÓÒ ÓÔ Ö ÓÒ × ×Ô Ð × ÕÙ Ö ÒØ Þ Ò ÕÙ
 Ð       × ÙÒ Ö ÓÐ Ð ØÓÖ Óº Ê ÓÖ ÑÓ× ÕÙ ÙÒ            × ÙÒ Ö ÓÐ Ò Ð ÕÙ
ÒÓ Ó ÐÑ Ò Ð Ö Ò Ð            Ð Ö ÓÐ Ð Ù Ð Ð × Ö Þº
    ÆÓØ ÑÓ× Ð ×Ø Ò ÓÒ ÕÙ      ÑÓ× ÒØÖ Ð ØÓÖ Ó Ý Ð ØÓÖ Þ Ó º ÁÒ ÓÖÑ ÐÑ ÒØ ¸
ÙÒ Ö ÓÐ Ð ØÓÖ Ó × ÕÙ Ú Ð ÒØ ÙÒ Ö ÓÐ Ò Ö Ó        Ù×ÕÙ     ÓÒרÖÙ Ó Ô ÖØ Ö
× Ù Ò × Ò× Ö ÓÒ Ð ØÓÖ × Ñ ÒØÖ × ÕÙ ÙÒÓ Ð ØÓÖ Þ Ó × ÙÒÓ Ø Ð ÕÙ ×Ù× ÓÔ Ö ¹
  ÓÒ × Ö ÒØ Þ Ò ÕÙ ×Ø × ÑÔÖ × Ð ØÓÖ Ó¸ Ò Ô Ò ÒØ Ñ ÒØ Ð Ø ÔÓ ÓÔ Ö ÓÒº
               ´
Definici´n 6.2 (Arbol binario de b´ squeda aleatorio (ABBA))
       o                         u                                              Ë    T   ÙÒ Ö ÓÐ
 Ò ÖÓ     Ù×ÕÙ    ÓÒ Ö Ò Ð      |T | = nº

   ¯   Ë   n = 0¸ ÒØÓÒ × T = ∅ × ÙÒ     º
   ¯   Ë   n > 0¸ ÒØÓÒ × T × ÙÒ     × Ý ×ÓÐÓ × Ä(T ) Ý Ê(T ) ×ÓÒ                    Ò Ô Ò ÒØ ׸
       Ý
                        P(| Ä(T )| = i | |T | = n) =                                        ´ºµ
                                                       1
                                                         ,   0 ≤ i < n, n > 0
                                                       n
478                                            Cap´        ´
                                                  ıtulo 6. Arboles de b´ squeda equilibrados
                                                                       u



     Ð ÔÙÒØÓ ÖÙ Ð Ð ¬Ò ÓÒ¸ ×Ô ¬ Ñ ÒØ Ð Ù ÓÒ ´ º µ¸ × ÕÙ Ù ÐÕÙ Ö
Ð × Ð Ú × Ð Ö ÓÐ Ø Ò Ü Ø Ñ ÒØ Ð Ñ ×Ñ ÔÖÓ Ð             × Ö Ð Ö Þ Ð Ö Óк ר
ÔÖÓÔ        × ÙÒ Ñ ÒØ Ð Ô Ö Ð × ÒÓ ÐÓ× Ð ÓÖ ØÑÓ× Ò× Ö ÓÒ Ý Ð Ñ Ò ÓÒº È Ö
ÔÖÓ Ù Ö ÙÒ       ¸ Ù ÐÕÙ Ö Ð Ú Ò× ÖØ Ö      Ø Ò Ö Ð ÙÒ ÔÓ× Ð          Ú ÒÖÐ
Ö Þ Ð Ö Óи Ó Ð Ö Þ Ð ÙÒÓ ×Ù× ×Ù Ö ÓР׺ Ð Ñ ×ÑÓ ÑÓ Ó¸ Ù Ò Ó × Ð Ñ Ò
ÙÒ Ð Ú ¸ Ù ÐÕÙ Ö       Ð × Ð Ú × Ö ×Ø ÒØ × Ø Ò Ö ÔÓ× Ð      ×    Ú ÒÖ Ö Þ Ð
 Ö ÓÐ Ó ×Ù× ×Ù Ö ÓР׺
6.2.1      El TAD Rand Tree<Key>
 ÒØ ×    ÜÔÐ Ö ÐÓ× Ð ÓÖ ØÑÓ׸ Ö ÕÙ Ö ÑÓ× Ð ÙÒ × × × Ô Ö ÙÒ Ì ÕÙ ÒÓ× ÑÓ Ð
ÙÒ       º Ì Ð Ì × ÒÓÑ Ò Gen Rand Tree<Key> Ý × Ò Ù ÒØÖ Ò Ð Ö ÚÓ
ØÔÐ Ö Ò ØÖ ºÀ        ÙÝ ×ØÖÙ ØÙÖ ÙÒ Ñ ÒØ Ð × Ð × Ù ÒØ
ØÔÐ Ö Ò ØÖ ºÀ     ≡
       template <template <typename> class NodeType, typename Key, class Compare>
  class Gen_Rand_Tree
  {
     typedef NodeType<Key> Node;
      Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Rand Tree<Key>
      Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Rand Tree<Key>
  };
    Ð × × ÔÙ Ð × Rand Tree<Key>
  ¬Ò ×
  Gen Rand Tree¸   Ù×   Ò ÙÒ               º
      Ð ÔÖ Ñ Ö Ô ×Ó Ô Ö ÑÔÐ ÒØ Ö Gen Rand Tree<Key> × ¬Ò Ö Ð ×ØÖÙ ØÙÖ                 Ð ÒÓ Ó
ÕÙ ÓÒ ÓÖÑ ÙÒ
 ØÔÐ Ö Ò ÆÓ ºÀ        ≡
  DECLARE_BINNODE_SENTINEL(RandNode, 80, BinNodeXt_Data);
  ¬Ò ×
  RandNode¸ Ù×    Ò ÙÒ       º
  RandNodeVtl¸ Ù×   Ò ÙÒ           º
Í× × DECLARE BINNODE SENTINEL ¾        º
    ÁÒØ ÖÒ Ñ ÒØ ¸ Ð Ì Gen Rand Tree<Key> ØÖ        ÓÒ Ð Ñ ×ÑÓ Ø ÔÓ ÒÓ Ó Ñ¹
ÔÐ Ó Ô Ö ÐÓ× Ö ÓÐ × ÓÒ Ö Ò Ó ×ØÙ Ó× Ò Ü º½½ ´Ô Ò ¿ ¿µ ÐÓ× ÒÓ Ó× Ù Ö Ò Ð
   Ö ÒÐ        Ð Ö ÓÐ Ý NullPtr × ÙÒ ÒÓ Ó ÒØ Ò Ð ÙÝ Ö Ò Ð        × ÖÓº
    Ä Ð × Gen Rand Tree<Key> Ö ÕÙ Ö ÙÒ Ò Ö ÓÖ ÒÙÑ ÖÓ× Ô× Ù Ó Ð ØÓ¹
Ö Ó׺ È Ö ÐÐÓ¸ ÒÓ× Ú Ð ÑÓ×        Ð     Ð ÓØ gsl½º Í× Ö ÑÓ× Ð Ò Ö ÓÖ ØÓÖ¹
Ò Ó ´ ÌÛ ×Ø µ¸ ØÙ ÐÑ ÒØ ÓÒÓ Ó ÓÑÓ Ð Ñ ÓÖ Ò Ö ÓÖ ÓÒÓ Ó ÒÙÑ ÖÓ×
× Ù Ó¹ Ð ØÓÖ Ó× ½¼¸ ¸ ½½ º ÍÒ ÔÙÒØ ÖÓ Ð Ó ØÓ gsl¸ Ò Ö ÓÖ ÒÙÑ ÖÓ× Ð ØÓÖ Ó׸
ÔÙ Ó Ø Ò Ö× Ñ ÒØ
 Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Rand Tree<Key>         ≡          ´ µ ¼
  gsl_rng * gsl_rng_object() { return r;}
 ØÖ Ú × ×Ø ÔÙÒØ ÖÓ¸ Ð Ù×Ù Ö Ó ÔÙ   ÐØ Ö Ö Ð Ò Ö ÓÖ ×Ù ÔÐ ÒÓ Ö × Óº
  ÄÓ× Ñ Ñ ÖÓ× ØÓ Gen Rand Tree<Key>
Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Rand Tree<Key>      ≡         ´ µ
  Node *    tree_root;
  gsl_rng * r;
  ½
      Gnu Scientific Library   º
´
6.2. Arboles aleatorizados                                                      479



tree root      × ÙÒ ÔÙÒØ ÓÖ Ð Ö Þ Ö ÓÐ Ð ØÓÖ Þ Óº r × ÙÒ ÔÙÒØ ÓÖ Ð Ó ØÓ
        Ò Ö ÓÒ ÒÙÑ ÖÓ× Ô× Ù Ó Ð ØÓÖ Ó× Ð   Ð ÓØ gslº
      Ä × Ð × × ÕÙ × ÜÔÓÖØ Ò Ð Ù×Ù Ö Ó
    Ð × × ÔÙ Ð × Rand Tree<Key>       ≡                  ´ µ
        template <typename Key, class Compare = Aleph::less<Key> >
    class Rand_Tree : public Gen_Rand_Tree<RandNode, Key, Compare>
        { /* empty */ };

        template <typename Key, class Compare = Aleph::less<Key> >
    class Rand_Tree_Vtl : public Gen_Rand_Tree<RandNodeVtl, Key, Compare>
        { /* empty */ };
Í× × Gen Rand Tree   ¸ RandNode   ¸ Ò   RandNodeVtl   º

6.2.1.1    Inserci´n en un ABBA
                  o

Ä        ×     Ð Ð ÓÖ ØÑÓ Ò× Ö ÓÒ × ØÙ Ö × ÓÒ × Ð ØÓÖ ×¸ Ò ÙÒ ÓÒ
Ð    ¬Ò ÓÒ º¾¸ ÕÙ Ø ÖÑ Ò Ò × Ð ÒÓ Ó Ò× ÖØ Ö Ú Ò Ó ÒÓ Ö Þ Ý¸          × ÑÓ Ó¸
  Ö ÒØ Ò ÕÙ Ð Ö ÓÐ Ò Ö Ó Ö ×ÙÐØ ÒØ × Ð ØÓÖ Óº È Ö ÐÐÓ¸ ÔÖ × ÒØ ÑÓ× Ð Ð ÓÖ ØÑÓ
× Ù ÒØ
 Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Rand Tree<Key>    +≡            ´ µ
    Node * random_insert(Node * root, Node * node)
    {
      if (root == Node::NullPtr)    // ¿inserci´n en ´rbol vac´o?
                                               o     a        ı
        return node;
      const long & n = COUNT(root);
          Ò Ö ÖÒ Ð ØÓÖ Ó ÒØÖ ¼ Ý Ò ¼ ;
      if (rn == n) // ¿Gana node el sorteo de ser ra´z?
                                                     ı
        return insert_root_xt <Node, Compare> (root, node); // s´, node ser´ ra´z
                                                                 ı          a   ı
      Node * result;
      if (Compare () (KEY(node), KEY(root))) // ¿insertar en arbol izquierdo?
                                                              ´
        {
           result = random_insert(LLINK(root), node); // inserta en rama izquierda
           if (result != Node::NullPtr) // ¿hubo inserci´n?
                                                        o
             {    // si ==> actualizar rama y contadores
               LLINK(root) = result;
               ++COUNT(root);
             }
        }
      else if (Compare() (KEY(root), KEY(node)))// ¿insertar en arbol derecho?
                                                                 ´
        {
           result = random_insert(RLINK(root), node); // inserta en rama derecha
           if (result != Node::NullPtr) // ¿hubo inserci´n?
                                                        o
             {    // si ==> actualizar rama y contadores
               RLINK(root) = result;
               ++COUNT(root);
             }
        }
      else
        return Node::NullPtr; // clave duplicada ==> no hay inserci´n
                                                                    o
      return result;
480                                    Cap´        ´
                                              ıtulo 6. Arboles de b´ squeda equilibrados
                                                                   u



      }
      ¬Ò ×
      random insert¸ Ù×       Ò ÙÒ   ¼ º
    Í× × insert root xt   ¿    º
      Ð ÔÙÒØÓ ÒØÖ Ð Ð Ò× Ö ÓÒ × Ð ×ÓÖØ Ó ØÙ Ó Ò Ò Ö ÖÒ Ð ØÓÖ Ó ÒØÖ ¼
    Ý Ò ¼ ¸ Р٠и Ò ÓÒ×ÓÒ ÓÒ Ð ¬Ò ÓÒ º¾¸      × Ð ÒÓ Ó Ò× ÖØ Ö Ú Ò Ö
    Ö Þ Ó ÒÓ
¼       Ò Ö ÖÒ Ð ØÓÖ Ó ÒØÖ ¼ Ý Ò ¼ ≡                   ´  µ
      const size_t rn = gsl_rng_uniform_int(r, n + 1);
       Ä Ò× Ö ÓÒ Ò Ð Ö Þ × Ö Ð Þ ÔÓÖ Ð ÖÙØ Ò insert root xt() ÜÔÐ          Ò
    Ü º½½º ´Ô Ò ¿ µº
       random insert() ÑÔÐ ÒØ Ð Ò× Ö ÓÒ Ð ØÓÖ Þ º Ä Ú Ö× ÓÒ ÔÙ Ð   Ð Ò× Ö ÓÒ
    Ô Ö Ð Ø ÔÓ Gen Rand Tree<Key> × ×Ô ¬ ÓÑÓ × Ù
¼    Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Rand Tree<Key>    +≡     ´ µ            ¼
      Node * insert(Node * p)
      {
        Node * result = random_insert(tree_root, p);
        if (result == Node::NullPtr)
          return NULL;
        tree_root = result;
        return p;
      }
    Í× × random insert        º

    6.2.1.2    Eliminaci´n en un ABBA
                        o

     Ò Ð Ð Ñ Ò ÓÒ Ò ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ ¸ Ð           × ÓÒ × Ó Ö Ð Ö Þ Ö ×ÙÐØ ÒØ
       Ð ÙÒ ÓÒ Ü ÐÙ× Ú × ÑÔÖ × Ð Ö Þ Ð ×Ù ¹ Ö ÓÐ ÞÕÙ Ö Ó ´Ü º½½º ´Ô Ò ¿ µµº
     ×ØÓ ÒØÖÓ Ù ÙÒ × × Ó Ò Ð ÕÙ Ð Ö Ó ÔÖÓ Ð ×Ø Ó Ò ÓÒØÖ Ð Ð ØÓÖ           º ËÓÖØ Ö
    ÙÒ ÓÖÑ Ñ ÒØ Ù Ð Ð × Ö × ¹ ÞÕÙ Ö Ó Ö ¹              Ö ÑÔÐ Þ Ö× ÒÓ ÙÒ ÓÒ ¸ ÔÙ ×
    ÒÓ × ÔÓÒ Ö Ð ÒØ            ÒÓ Ó× ÕÙ Ø Ò      ÖѺ
         Ð ØÖÙ Ó Ô Ö ÕÙ Ð ÙÒ ÓÒ Ü ÐÙ× Ú ÔÖÓ ÙÞ ÙÒ Ö ÓÐ Ð ØÓÖ Ó × ×ÓÖØ Ö¸ Ò ÙÒ ÓÒ
       Ð× Ö ÒÐ         ׸ Ù Ð Ð × Ö × Ú Ò Ö Ð Ö Þ Ð Ö ×ÙÐØ Óº ר         × ÔÐ ×Ñ
     Ò Ð Ð ÓÖ ØÑÓ × Ù ÒØ
¼    Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Rand Tree<Key>       +≡    ´ µ      ¼    ½
      Node * random_join_exclusive(Node * tl, Node * tr)
      {
        if (tl == Node::NullPtr)
          return tr;
        if (tr == Node::NullPtr)
          return tl;
        const size_t & m = COUNT(tl);
        const size_t & n = COUNT(tr);
              Ò Ö ÖÒ Ð ØÓÖ Ó ÒØÖ ½ Ý Ñ · Ò ½
          if (rn <= m)
            {    // rama izquierda gana sorteo
              COUNT(tl) += COUNT(tr);
              RLINK(tl) = random_join_exclusive(RLINK(tl), tr);
              return tl;
´
    6.2. Arboles aleatorizados                                                 481



            }
          else
            {
              COUNT(tr) += COUNT(tl);
              LLINK(tr) = random_join_exclusive(tl, LLINK(tr));
              return tr;
            }
      }
      ¬Ò ×
      random join exclusive¸   Ù×    Ò ÙÒ     ½ º
½         Ò Ö ÖÒ Ð ØÓÖ Ó ÒØÖ ½ Ý Ñ · Ò ½            ≡                 ´ ¼µ
      const size_t rn = 1 + gsl_rng_uniform_int(r, m + n);

      ÍÒ Ú Þ Ö Ð Þ          Ð ÙÒ ÓÒ Ü ÐÙ× Ú Ð ØÓÖ Þ ¸ Ð Ð Ñ Ò ÓÒ Ð ØÓÖ       Ò Ö ÓÐ
     Ò ÖÓ    Ù×ÕÙ          ÓÒ Ö Ò Ó× × ×ØÖÙ ØÙÖ ÐÑ ÒØ ÒØ   Ð ÙÒ
½   Ñ Ñ ÖÓ× ÔÙ Ð Ó×     Gen Rand Tree<Key>      +≡      ´ µ       ¼    ½
      Node * random_remove(Node *& root, const Key & key)
      {
        if (root == Node::NullPtr)
          return Node::NullPtr;
        Node * ret_val;
        if (Compare() (key, KEY(root)))
          {
            ret_val = random_remove(LLINK(root), key);
            if (ret_val != Node::NullPtr)
              COUNT(root)--;
            return ret_val;
          }
        else if (Compare() (KEY(root), key))
          {
            ret_val = random_remove(RLINK(root), key);
            if (ret_val != Node::NullPtr)
              COUNT(root)--;
            return ret_val;
          }
            // clave encontrada
        ret_val = root;
        root = random_join_exclusive(LLINK(root), RLINK(root));
        ret_val->reset();
        return ret_val;
      }
      ¬Ò ×
      random remove¸ Ù×   Ò ÙÒ           ½º
    Í× × random join exclusive      ¼º
     Ä ÐÓ       Ð Ð ÓÖ ØÑÓ × × Ò Ö Ö ÙÖ× Ú Ñ ÒØ ר Ð ÒÓ Ó Ð Ñ Ò Öº ÍÒ Ú Þ
     Ò ÓÒØÖ Ó ×Ø ÒÓ Ó¸ ×     ØÙ ÙÒ ÓÒ Ø Ò ÓÒ Ð ØÓÖ ÒØÖ Ð Ö Ñ ÞÕÙ Ö Ý
    Ð Ö ¸ Ð Ù Ð × Ð Ö ×ÙÐØ Ó Ð Ð Ñ Ò ÓÒº
         ÙÐÑ Ò ÑÓ× ×Ø × ÓÒ ÓÒ Ð ×ØÖÙ ØÙÖ Ð ÖÙØ Ò ÔÙ Ð     Ð Ñ Ò ÓÒ
½    Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Rand Tree<Key>    +≡        ´ µ    ½
      Node * remove(const Key & key)
482                                         Cap´        ´
                                               ıtulo 6. Arboles de b´ squeda equilibrados
                                                                    u



  {
      Node * ret_val = random_remove(tree_root, key);
      return ret_val != Node::NullPtr ? ret_val : NULL;
  }
Í× × random remove ½ º

6.2.2    An´lisis de los ´rboles aleatorizados
           a             a
Ä       ÒØÖ Ð Ò ×Ø Ò Ð × × × ÑÓ×ØÖ Ö ÕÙ ÐÓ× Ð ÓÖ ØÑÓ× Ò× Ö ÓÒ º¾º½º½ Ý
 Ð Ñ Ò ÓÒ º¾º½º¾¸ ÔÖÓ Ù Ò Ö ÓÐ × Ð ØÓÖ Ó× Ò Ð × ÒØ Ó Ð ¬Ò ÓÒ º¾º
Lema 6.1 (Mart´  ınez y Roura 1998 [8]) Ë Ò T< Ý T> ÐÓ× Ö ÓÐ ×                              Ò Ö Ó×
 Ù×ÕÙ ÔÖÓ Ù Ó× ÔÓÖ Ð ÐÐ Ñ           split key rec xt(T , x, T<, T>)                         ÑÔÐ ÒØ
× ÙÒ Ð Ð ÓÖ ØÑÓ ÜÔÐ Ó Ò Ü º½½º ´Ô Ò ¿ µº Ë T × ÙÒ Ö ÓÐ Ð                                     ØÓÖ Ó¸ Ò¹
ØÓÒ ×¸ T< Ý T> ×ÓÒ Ö ÓÐ × Ð ØÓÖ Ó× Ò Ô Ò ÒØ ׺       split key rec xt(Ê(T ), x, T< , T> )

                        T                             T<
                        y   y>x                       y



              Ä(T )           Ê(T )          Ä(T )         Ê(T< )                    T>

                                       =⇒
             ´ µ ÒØ ×         Ô ÖØ ¹                 ´ µ   ×ÔÙ ×    Ô ÖØ ÓÒ Ö
               ÓÒ Ö
                            ÙÖ º¾      split key rec xt(T , x, T<, T>)


Demostraci´n (Por inducci´n sobre n = |T |)
          o              o
n = 0:  × T = ∅¸ ÒØÓÒ × split key rec xt(T , x, T<, T>) ÔÖÓ Ù T< = T> = ∅¸ Ð
       Ù Ð × ÔÓÖ ¬Ò ÓÒ ÙÒ Ö ÓÐ Ð ØÓÖ Þ Óº Ð Ð Ñ ×¸ Ô٠׸ ÖØÓ Ô Ö n = 0º
n > 0:     ÓÖ ×ÙÑ ÑÓ× ÕÙ Ð Ð Ñ × ÖØÓ Ô Ö ØÓ Ó n Ý Ú Ö ¬ ÑÓ× × Ð Ð Ñ × ÖØÓ
     Ô Ö n + 1º
     Ë y = Ã (Ö Þ(T ))º Ë x > y¸ ÒØÓÒ × b Ö Þ(T<) = Ö Þ(T ) Ý Ð Ö ÓÐ
     T> Ý Ð ×Ù Ö ÓÐ          Ö Ó Ê(T<) × Ð ÙÐ Ò Ö ÙÖ× Ú Ñ ÒØ ÓÒ Ð ÐÐ Ñ
     split key rec xt(Ê(T ), x, T<, T>) ÈÓÖ ÔÖ Ñ ×          Ð Ð Ñ ¸ Ä(T ) × Ð ØÓÖ Ó Ò¹
         Ô Ò ÒØ ¸ ÔÙ × T Ø Ñ Ò ÐÓ ×º ÈÓÖ Ð ÔÓØ × × Ò Ù Ø Ú ¸ ÐÓ× Ö ÓÐ × Ê(T<)
     Ý T> ×ÓÒ Ð ØÓÖ Ó× Ò Ô Ò ÒØ ׸ ÔÙ × ÐÐÓ× ×ÓÒ Ð Ö ×ÙÐØ Ó Ð ÐÐ Ñ
     split key rec xt(Ê(T ), x, T<, T>)º
         Ð Ö ÞÓÒ Ñ ÒØÓ ÒØ Ö ÓÖ ÔÓ ÑÓ× ÓÒ ÐÙ Ö ÕÙ ÕÙ T> × Ð ØÓÖ Ó Ò Ô Ò ÒØ º
       ÉÙ       Ö     T< Ë      ÑÓ× ÕÙ ×Ù× Ö Ñ × ÞÕÙ Ö Ý Ö                ×ÓÒ Ð ØÓÖ ×
      Ò Ô Ò ÒØ ׺ ÆÓ× ÐØ ¸ ÒØÓÒ ×¸ ÑÓ×ØÖ Ö ÕÙ Ð Ù ÓÒ º × × Ø × Ô Ö
     T<º È Ö ÐÐÓ        ÑÓ× Ú Ö ¬ Ö ÕÙ ∀z ∈ T< , P(Ö Þ(T<) = z) = m ÓÒ m = |T<|º
                                                                       1

       ×ØÓ × ÕÙ Ú Ð ÒØ ÔÐ ÒØ Ö
                                          P(Ö Þ(T ) = z ∩ Ö Þ(T ) < x)
           P(Ö Þ(T<) = z | Ö Þ(T ) < x) =
                                                                            1/n   1
                                                                         =      =
                                                 P(Ö Þ(T ) < x)            m/n    m
´
6.2. Arboles aleatorizados                                                                      483



      Ë Ñ ØÖ Ñ ÒØ ¸ Ð Ñ ×ÑÓ Ö ÞÓÒ Ñ ÒØÓ × ÔÐ × x < y¸ ÒØ Ö Ñ Ò Ó ÐÓ× ÖÓÐ ×
         T< Ý T>¸ Ö ×Ô Ø Ú Ñ ÒØ

 Ð Ð Ñ º½ × ÙØ Ð ÔÓÖÕÙ Ð Ô ÖØ ÓÒ × ÙÒ ÓÔ Ö ÓÒ ÒØ ÖÒ Ð Ò× Ö ÓÒ¸ ÙÝ Ú Ð Þ
ר ÑÓ×ØÖ ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ × Ù ÒØ
Proposici´n 6.1 (Mart´
         o           ınez y Roura 1998 [8])   Ë T ÙÒ Ö ÓÐ Ð ØÓÖ Ó Ý ×                              p
ÙÒ ÒÓ Ó Ò× ÖØ Ö ÓÒ Ð Ú kº ÒØÓÒ ×¸ Ð            ÐÐ Ñ insert(T , p) ÑÔÐ ÒØ
Ò Ü º¾º½º½ ´Ô Ò       µ ÔÖÓ Ù ÙÒ Ö ÓÐ Ð ØÓÖ Óº
Demostraci´n (Por inducci´n sobre n = |T |)
          o              o

n = 0:  × T = ∅¸ ÒØÓÒ × insert(∅, p) = pº ÄÓ× ×Ù Ö ÓÐ × Ä(p) Ý Ê(p) ×ÓÒ Ú Ó׸ ÐÓ×
       ٠Р׸ ÔÓÖ ¬Ò ÓÒ¸ ×ÓÒ Ð ØÓÖ Ó׺ ËÓ Ö p × Ú Ö ¬ ÕÙ P(Ö Þ(p) = k) = 1 = |p| º
                                                                                1

        × Ô٠׸ insert(∅, p) = p × ÙÒ Ö ÓÐ Ð ØÓÖ Ó Ý Ð Ð Ñ × ÖØÓ Ô Ö n = 0º
n > 0:     ÓÖ ×ÙÑ ÑÓ× ÕÙ Ð Ð Ñ × ÖØÓ Ô Ö ØÓ Ó n Ý Ú Ö ¬ ÑÓ× × ÐÓ × Ô Ö
     n + 1º Ë T =insert(T , p)¸ × x = Ã (p) y = Ö Þ(T )º ÒØ ×              Ò× ÖØ Ö
     x, P(Ö Þ(T ) = y) = n ¸ ÔÙ × T × Ð ØÓÖ Óº
                         1

         Ô ÖØ Ö ×Ø × ×ÙÔÓ× ÓÒ ×¸ ÔÓ ÑÓ× ×Ø Ò Ù Ö Ó× ×Ó× ×ÔÙ × Ð Ò× Ö ÓÒ
     ´½µ ÕÙ y ÓÒØ ÒÙ ÓÑÓ Ö Þ T Ó ´¾µ ÕÙ x × Ð Ö Þ T
        ½º Ë Ö Þ(T ) = y¸ ÒØÓÒ × x       Ô Ö Ö Ò Ð ×ÓÖØ Ó Ò Ö ÖÒ Ð ØÓÖ Ó ÒØÖ
            ¼ Ý Ò ¼ Ö Ð Þ Ó ÔÓÖ Ð Ð ÓÖ ØÑÓ Ò× Ö ÓÒ Ý Ð ÔÖ          Ó rn == n
            × Ö Ð×Óº Ä ÔÖÓ Ð            ÕÙ Ð ÔÖ       Ó rn == n × Ð×Ó × n+1 ´ Ð
                                                                            n

             ÓÑÔÐ Ñ ÒØÓ ÔÖÓ Ð ×Ø Ó n+1 ¸ ÕÙ × Ð ÔÖÓ Ð
                                          1
                                                                  ÕÙ x × Ö Þ
            T µº × ÔÙ ×

                  ∀y ∈ T , P(Ö   Þ(T ) = y)           1                n                1
                                              =                 ×                  =
                                                      n               n+1              n+1
                                                  P(Ö Þ(T)=y)       P(Ö Þ(T )=y)

            Ò ×Ø ×Ó x × Ö Ò× ÖØ Ó Ò Ð ÙÒÓ ÐÓ× ×Ù Ö ÓÐ ×                      T     ݸ ÔÓÖ Ð   ÔÓØ × ×
           Ò Ù Ø Ú ¸ Ð Ö ×ÙÐØ Ó × Ö ÙÒ Ö ÓÐ Ð ØÓÖ Óº
       ¾º Ë Ö Þ(T ) = x¸ ÒØÓÒ × x Ð ÔÖ         Ó rn == n   ×Ö                 ÖØÓ ×ØÓ ×Ù       ÓÒ
          ÔÖÓ Ð        P(Ö Þ(T ) = x) = n+1 ¸ ÕÙ × ÐÓ ×Ô Ö Ó ×
                                         1
                                                                            ÙÒ Ð Ð ÓÖ ØÑÓº ÈÓÖ
          ÓØÖ Ô ÖØ ¸ T = < T<, x, T> >¸ ÓÒ T< Ý T> ×ÓÒ ÐÓ×                  Ö ÓÐ × Ö ×ÙÐØ ÒØ ×
          random join(T , x, T<, T>) ÐÓ× Ù Ð × ×ÓÒ¸ ÔÓÖ Ð Ð Ñ                º½¸ Ð ØÓÖ Ó×
     Ð Ö ×ÙÐØ Ó ÒØ Ö ÓÖ ÔÓ ÑÓ× ×Ø Ð Ö Ð ÓÖÓÐ Ö Ó × Ù ÒØ º
Corolario 6.1   Ë K = {k1, k2, . . . , kn} ÙÒ ÓÒ ÙÒØÓ Ð Ú × Ù ÐÕÙ Ö º Ë T ÙÒ Ö ÓÐ
 Ð ØÓÖ Þ Óº ÒØÓÒ ×¸ Ù ÐÕÙ Ö Ô ÖÑÙØ ÓÒ Ò× Ö ÓÒ K ×Ó Ö T ¸ × ÙÒ Ð Ð Ó¹
Ö ØÑÓ × ÖÖÓÐÐ Ó Ò Ü º¾º½º½ ´Ô Ò              µ¸ ÔÖÓ Ù ÙÒ Ö ÓÐ Ð ØÓÖ Þ Óº
     Ð ÓÖÓÐ Ö Ó ÓÒÐÐ Ú ÑÔÐ ÓÒ × ÑÔÓÖØ ÒØ ׺ Ò ÔÖ Ñ Ö ÐÙ Ö¸ Ù ÐÕÙ Ö × Ð
ÓÖ Ò Ò× Ö ÓÒ¸ × ÑÔÖ Ó Ø Ò Ö ÑÓ× ÙÒ Ö ÓÐ Ð ØÓÖ Þ Óº Ò ÓØÖ × Ô Ð Ö ×¸ Ð
 Ö ÓÐ Ö ×ÙÐØ ÒØ × ÕÙ Ú Ð ÒØ ÙÒ              ÓÒרÖÙ Ó Ô ÖØ Ö ÙÒ × Ù Ò        Ò× Ö ÓÒ
 Ð ØÓÖ º ÓÒ× Ù ÒØ Ñ ÒØ ¸ ØÓ Ó× ÐÓ× Ö ×ÙÐØ Ó× ÓÒÓ Ó× Ô Ö ÙÒ             ×ÓÒ ÔÐ Ð ×
 Ð Ñ × ÑÔÓÖØ ÒØ       ÐÐÓ× × Ð ÔÖÓÔÓ× ÓÒ º½¾ ÕÙ ÒÓ× ÔÖÓÑ Ð ÐØÙÖ Ð Ö ÓÐ
O(Ð n)º
484                                   Cap´        ´
                                         ıtulo 6. Arboles de b´ squeda equilibrados
                                                              u



    Ò Ù ÒØÓ Ð Ð Ñ Ò ÓÒ¸ Ð ÔÖ Ñ Ö Ô ×Ó Ô Ö Ò Ð Þ ÖÐ × ×ØÙ Ö Ð ÙÒ ÓÒ Ü ÐÙ× Ú
 Ð ØÓÖ ¸ Ð Ù Ð × Ò Ð Þ Ò Ð Ð Ñ × Ù ÒØ
Lema 6.2 (Mart´ ınez y Roura 1998 [8])         Ë Ò T< Ý T> Ó× Ö ÓÐ × Ð ØÓÖ Ó× Ò Ô Ò¹
  ÒØ × Ø Ð ÕÙ ∀kl ∈ T<, ∀kr ∈ T>, kl < kr       × Ö¸ ØÓ × Ð × Ð Ú × T< ×ÓÒ ×ØÖ Ø ¹
Ñ ÒØ Ñ ÒÓÖ × ÕÙ Ð × Ð Ú × T>º ÒØÓÒ              ׸ T = random join exclusive(T<, T>)
× ÙÒ Ö ÓÐ Ð ØÓÖ Óº
Demostraci´n (por inducci´n sobre m = |T<| y n = |T>|)
          o              o

m = 0 o n = 0:     Ó ×Ø ÔÖ     Ó¸ Ø Ò ÑÓ× Ó× ×Ó×
       ½º Ë m = 0 Ý n = 0¸ ÒØÓÒ × random join exclusive(T<, T>) = ∅¸ Р٠Р׸
          ÔÓÖ ¬Ò ÓÒ¸ Ð ØÓÖ Óº
       ¾º Ë m = 0 Ó n = 0¸ ÒØÓÒ × random join exclusive(T<, T>) Ö ØÓÖÒ Ð Ö ÓÐ
          ÒÓ Ú Ó Ð Ô Ö¸ Р٠Р׸ ÔÓÖ ÔÖ Ñ × Ð Ð Ñ ¸ Ð ØÓÖ Óº Ð Ð Ñ ×¸ Ô٠׸
            ÖØÓ Ô Ö m = 0 Ó n = 0º
m > 0 y n > 0: ×

        ¯ a=Ã      (Ö Þ(T>))¸
        ¯ b=Ã      (Ö Þ(T>)) Ý
        ¯ T = random join exclusive(T<, T>)

        ×ÙÑ ÑÓ× ÕÙ a Ò Ð ×ÓÖØ Ó       Ò Ö ÖÒ Ð ØÓÖ Ó ÒØÖ ½ Ý Ñ · Ò ½
          ØÙ Ó Ò Ð random join exclusive() × ÖÖÓÐÐ Ó Ò Ü º¾º½º¾ ´Ô Ò ¼µ
      Ó × ÕÙ Ð ÔÖ       Ó rn <= m × ÖØÓº ×ØÓ ÑÔÐ ÕÙ a × Ö Ð Ö Þ T º
      ÈÓ ÑÓ× Ó×ÕÙ Ö Ð Ö ÓÐ Ö ×ÙÐØ ÒØ Ð × Ù ÒØ ÑÓ Ó
                                          T = random join exclusive(T<, T> )
                                               a
                                                            random join exclusive(Ê(T< ), T> )


                                      Ä(T< )               T>


      ÈÓÖ Ð       רÖÙ ØÙÖ      Ð   Ð ÓÖ ØÑÓ Ý      Ð Ö ×ÙÐØ Ó            Ð ×ÓÖØ Ó¸ Ð   ÖÑ
      ÞÕÙ Ö         T  × Ä(T )¸ Ñ ÒØÖ × ÕÙ Ð      Ö        × Ð ÐÐ Ñ    Ö ÙÖ× Ú
      random join exclusive(Ê(T<), T>)º     ÓÖ      Ò¸ Ä(T ) × ÙÒ Ö ÓÐ Ð ØÓÖ Ó
      Ô٠׸ ÔÓÖ ÔÖ Ñ × Ð Ð Ñ ¸ T Ø Ñ Ò ÐÓ ×º Á Ù ÐÑ ÒØ ¸ ÔÓÖ Ð ÔÓØ × × Ò Ù Ø Ú ¸
      T> Ø Ñ Ò × Ð ØÓÖ Óº Ä(T ) Ý T> ×ÓÒ Ò Ô Ò ÒØ ׸ ÔÙ × Ä(T ) Ý Ê(T ) ×ÓÒ¸ ÔÓÖ
      ÔÖ Ñ × Ð Ð Ñ ¸ Ò Ô Ò ÒØ × Ý T> = random join exclusive(Ê(T<), T>)
      ׸ ÔÓÖ Ð       ÔÓØ × × Ò Ù Ø Ú ¸ Ò Ô Ò ÒØ º À Ò Ó ÑÓ×ØÖ Ó ÕÙ Ð ×
      ÖÑ×          T ×ÓÒ Ð ØÓÖ ×        Ò Ô Ò ÒØ ׸ ×ÓÐÓ ÒÓ× Ö ×Ø ÑÓ×ØÖ Ö ÕÙ
      ∀x ∈ T< ,   P(Ö Þ(T ) = x) = m+n º ×ØÓ ×
                                    1

                                                                         1   m    1
      P(Ö   Þ(T ) = x) = P(Ö Þ(Ä(T )) = x) × P(rn <= M ×        ÖØÓ) =     ×   =
                                                                         m m+n   m+n
    ÓÒ ×Ø Ð Ñ ¸ ר ÑÓ× Ò Ô                      ×ØÙ Ö Ð Ð Ñ Ò ÓÒ¸ Ð Ù Ð × Ò Ð Þ
Ò Ð ÔÖÓÔÓ× ÓÒ × Ù ÒØ
´
6.2. Arboles aleatorizados                                                         485



                     ınez y Roura 1998 [8]) Ë T ÙÒ
Proposici´n 6.2 (Mart´
         o                                                     Ö ÓÐ Ð ØÓÖ Ó Ý x ÙÒ Ð Ú
 ÓÒØ Ò    Ò T º Ë Ð ÐÐ Ñ      remove(T , x) Ý × T             Ð Ö ÓÐ Ð ØÓÖ Ó Ö ×ÙÐØ ÒØ
  ×ÔÙ × Ð ÐÐ Ñ      remove()º ÒØÓÒ ×¸ T × ÙÒ Ö ÓÐ             Ð ØÓÖ Óº
Demostraci´n (por inducci´n sobre n = |T |)
           o              o
n = 1:  ÒØÓÒ × T = ∅¸ Р٠Р׸ ÔÓÖ ¬Ò ÓÒ¸ Ð ØÓÖ Óº
n > 1: ÒØÓÒ × ×ÙÑ ÑÓ× ÕÙ Ð Ð Ñ × ÖØÓ Ô Ö ØÓ Ó |T | < n Ý Ú Ö ¬ ÑÓ× × Ø Ñ Ò
      × ÖØÓ Ô Ö nº ÕÙ ÔÓ ÑÓ× × Ô Ö Ö Ó× ×Ó×
       ½º Ë Ö Þ(T ) = x¸ ÒØÓÒ × x × Ð Ñ Ò Ó ÙÒÓ ÐÓ× ×Ù Ö ÓÐ × T ݸ ÔÓÖ Ð
            ÔÓØ × × Ò Ù Ø Ú ¸ ר Ð Ñ Ò ÓÒ ÖÖÓ ÙÒ Ö ÓÐ Ð ØÓÖ Óº
       ¾º Ë Ö Þ(T ) = x¸ ÒØÓÒ × remove(T , x) ØÙ Ð ÐÐ Ñ random join(Ä(T ), Ê(T ))
          Р٠и ÔÓÖ Ð Ð Ñ º¾¸ × ÙÒ Ö ÓÐ Ð ØÓÖ Óº ÈÓ ÑÓ× ¬ÖÑ Ö¸ ÒØÓÒ ×¸ ÕÙ
          Ä(T ) Ý Ê(T ) ×ÓÒ Ö ÓÐ × Ð ØÓÖ Ó× Ò Ô Ò ÒØ ׺ ÆÓ× Ö ×Ø ÔÓÖ ÓÑÔÖÓ Ö
          ÕÙ ∀y ∈ T , P(Ö Þ(T ) = y) = n−1 ¸ ÐÓ Ù Ð × Ú Ö ¬ ÓÑÓ × Ù
                                          1


              P(Ö Þ(T ) = y) = P(Ö Þ(T ) = y | Ö Þ(T ) = x) × P(Ö Þ(T ) = x) +
                                  P(Ö Þ(T ) = y | Ö Þ(T ) = x) × P(Ö Þ(T ) = x)
                              = P(Ö Þ(random join(Ä(T ), Ê(T ))) = y) ×
                                                                             1
                                                                                +
                                                                             n
                                                                    −
                                 P(Ö   Þ(T ) = y | Ö Þ(T ) = x) × n n 1
                                  1   1    1    n−1    1
                             =      ×   +     ×     =
                                 n−1 n    n−1    n    n−1



                      ÙÖ º¿ ÍÒ Ö ÓÐ Ð ØÓÖ Þ Ó           512   ÒÓ Ó×

       Ð × ÔÖÓÔÓ× ÓÒ × ÑÓ×ØÖ ×¸ ÔÓ ÑÓ× ÒÙÒ Ö Ð × Ù ÒØ ÓÖÓÐ Ö Óº
Corolario 6.2 Ë T × ÙÒ Ö ÓÐ Ð ØÓÖ Þ Ó Ù ÐÕÙ Ö ¸ ÒØÓÒ × Ù ÐÕÙ Ö × Ù Ò
 Ò× Ö ÓÒ × Ý Ð Ñ Ò ÓÒ × ÔÖÓ Ù ÙÒ Ö ÓÐ Ð ØÓÖ Óº
    Ë ÙÒ Ð ÓÖÓÐ Ö Ó ÒØ Ö ÓÖ¸ Ù ÐÕÙ Ö × Ð × Ù Ò           Ò× Ö ÓÒ¸ ÓÒ Ð Ñ Ò ÓÒ ×
 ÒØ Ö Ð × Ö ØÖ Ö ×¸ Ð Ö ÓÐ Ö ×ÙÐØ ÒØ × ÑÔÖ × Ð ØÓÖ Óº ÈÓ ÑÓ׸ Ô٠׸ ÓÒ ÐÙ Ö
ÕÙ Ò ÔÖÓÑ Ó Ð ÐØÙÖ Ð Ö ÓÐ Ð ØÓÖ Þ Ó × O(Ð n)º ÈÙ ×ØÓ ÕÙ Ð Ø ÑÔÓ Ð ×
ÓÔ Ö ÓÒ × Ò× Ö ÓÒ Ý Ð Ñ Ò ÓÒ Ô Ò              Ð ÐØÙÖ ¸ ÔÓ ÑÓ× ÓÒ ÐÙ Ö¸ Ø Ñ Ò¸
ÕÙ Ò ÔÖÓÑ Ó Ð Ò× Ö ÓÒ Ý Ð Ð Ñ Ò ÓÒ ×ÓÒ O(Ð n)º
    ÄÓ× Ö ÓÐ × Ð ØÓÖ Þ Ó× Ø Ò Ò Ó× Óר ×      ÓÒ Ð × Ö ×Ô ØÓ ÐÓ× Ò Ö Ó× Ð × Ó׺
  Ò ÔÖ Ñ Ö ÐÙ Ö¸ Ð ×ØÖÙ ØÙÖ     ÒÓ Ó ÙÒ          Ö ÕÙ Ö ×Ô Ó          ÓÒ Ð Ô Ö Ð¹
Ñ Ò Ö Ð Ö Ò Ð º Ò × ÙÒ Ó ÐÙ Ö¸ ÙÒ                   Ö ÕÙ Ö ÓÔ Ö ÓÒ ×         ÓÒ Ð ×
Ö ×Ô ØÓ ÙÒ          º ÙÖ ÒØ Ð Ò× Ö ÓÒ¸ × Ò × Ö Ó ØÙ Ö ÙÒ Ô ÖØ ÓÒ Ý ØÙ Ð Þ Ö
Ð× Ö ÒÐ          ׺
       Ô × Ö Ð × Ö ×ØÖ ÓÒ × ÒØ Ö ÓÖ ×¸ ÙÒ           Ø Ò Ð Ú ÒØ           ÐÑÒ Ö Ð
Ô Ð ÖÓ Ö ÔÖ × ÒØ Ó ÔÓÖ Ð × × Ó Ò Ð × Ù Ò           Ò× Ö ÓÒ Ý Ð × Ò× Ö ÓÒ × ÒØ Ö¹
  Р׺ Ò Ò ÙÖ ¸ Ð ÓÒØ ÓÖ ÔÖ × ÒØ Ò                ÒÓ Ó Ð Ø Ô Ö Ø Ý Ò ØÙÖ Ð¹
Ñ ÒØ Ð         ×Ó ÔÓÖ ÔÓ× ÓÒ¸ ÓÒ ØÓ × ×Ù× ÓÔ Ö ÓÒ × ×Ó        ׸ Ø Ð ÓÑÓ × ÜÔÐ Ó
 Ò Ü º½½ ´Ô Ò ¿ ¿µº ×ØÓ ÙÐØ ÑÓ × ÕÙ Þ Ð Ö Ò ÓÒ            ר ×ÕÙ Ñ        ÕÙ Ð Ö Óº
486                                     Cap´        ´
                                           ıtulo 6. Arboles de b´ squeda equilibrados
                                                                u



6.3      Treaps
   ÓÖ ×ØÙ Ö ÑÓ× ÓØÖÓ Ò ÓÕÙ               Ð ØÓÖ Þ ÓÒ Ö          ÐÑ ÒØ       Ö ÒØ    ÙÒ           Ð
 רÖÙ ØÙÖ ØÖ Ôº
Definici´n 6.3 (Treap)
       o                     Ë   T   ÙÒ Ö ÓÐ Ò Ö Ó Ò Ù Ð               ÒÓ Ó ni Ø Ò Ó× ÑÔÓ×
  × Ö
   ½º à (ni) ∈ K × Ð Ð Ú               Ù×ÕÙ ¸ ÓÒ K × ÙÒ ÓÒ ÙÒØÓ ÓÖ Ò Ð Ù ÐÕÙ Ö º
   ¾º ÈÊÁÇ(ni) ∈ P × Ð ÔÖ ÓÖ             Ð ÒÓ Ó¸ ÓÒ P × ÙÒ ÓÒ ÙÒØÓ ÓÖ Ò Ð Ù ÐÕÙ Ö º
      ÒØÓÒ ×¸ T × ÙÒ ØÖ Ô × Ý ×ÓÐÓ ×
    ¯ T ∈        × ÙÒ Ð × Ð Ú × Kº
    ¯ ∀ni ∈ T, ÈÊÁÇ(ni) ≤ ÈÊÁÇ(Ä(ni)) y ÈÊÁÇ(ni) ≤ ÈÊÁÇ(Ê(ni)) .
       Ä × ÙÒ ÔÖÓÔ               × ÒÓÑ Ò Ö Ð ÓÒ Ð Ò ×ØÖÓº Ë Ð × ÔÖ ÓÖ                       × ×ÓÒ
       ÙÒ ×¸ × Ö¸ × ×Ø × ÒÓ × Ö Ô Ø Ò¸ ÒØÓÒ × Ð ØÖ Ô × ÒÓÑ Ò Ó ÔÙÖÓ º
    Ä ÔÖ Ñ Ö ÔÖÓÔ             ÓÖÖ ×ÔÓÒ Ð ÓÖ Ò ÙÒ                        Ð × ÙÒ Ð ÓÖ Ò
   ÙÒ Ôº           ÐÐ ¸ Ô٠׸ Ð ÒÓÑ Ö ØÖ Ô ØÖ Ý Ôº
    ÈÓ ÑÓ× Ö Ø Ö Þ Ö ÙÒ ØÖ Ô ÓÑÓ ÙÒ × Ù Ò                       Ô Ö × ´ Ð Ú ¸ ÔÖ ÓÖ µ ÓÖÖ ×¹
ÔÓÒ ÒØ ÐÓ× ÓÒØ Ò Ó×                   ÒÓ Óº ÈÓÖ ÑÔÐÓ¸ Ð ØÖ Ô Ð ¬ ÙÖ º ÔÙ                      Ö ¹
Ø Ö Þ Ö× ÓÑÓ (1, 470)¸ (2, 537)¸ (3, 625)¸ (5, 658)¸ (7, 608)¸ (8, 652)¸ (14, 685)¸ (17, 713)¸
(19, 729)¸ (21, 575)¸ (22, 769)¸ (24, 571)¸ (27, 515)¸ (44, 734)¸ (45, 587)¸ (55, 511)¸ (56, 659)¸
(60, 854)¸ (61, 681)¸ (62, 457)¸ (65, 718)¸ (66, 718)¸ (77, 558)¸ (84, 649)¸ (86, 646)¸ (89, 454)¸
(92, 490)¸ (93, 725)¸ (94, 761)¸ (96, 440)
    ÍÒ ØÖ Ô Ø Ò ÙÒ ÔÖÓÔ               ÑÙÝ ÒØ Ö × ÒØ Ö Ø Ö Þ ÔÓÖ Ð × Ù ÒØ Ð Ñ º
Lema 6.3 (Lema de la unicidad del treap (Seidel - Aragon 1996) [13]) Ë K =
{k1, k2, . . . kn} ÙÒ ÓÒ ÙÒØÓ   Ð Ú × Ý P = {p1, p2, . . . pn} ÙÒ ÓÒ ÙÒØÓ ÔÖ ÓÖ      ׺
  ÒØÓÒ ×¸ Ð ÓÒ ÙÒØÓ {(k1, p1), (k2, p2), . . . (kn, pn), } ⊂ K × P Ø Ò ÙÒ ÙÒ Ó ØÖ Ôº
Demostraci´n (Por inducci´n sobre n)
                 o            o
n = 1:     Ò ×Ø      ×Ó Ü ×Ø ÙÒ ÙÒ Ó ØÖ Ô ÓÒ ÓÖÑ Ó ÔÓÖ ÙÒ Ô Ö ÙÒ Óº Ð Ð Ñ × ÖØÓ
      ÔÖ    n = 1º

n > 1:     ÓÖ ×ÙÑ ÑÓ× ÕÙ Ð Ð Ñ × ÖØÓ Ô Ö ØÓ Ó n Ý Ú Ö ¬ ÑÓ× ×Ù Ú Ö
     Ô Ö n + 1º ÈÙ ×ØÓ ÕÙ Ð × ÔÖ ÓÖ            × ×ÓÒ ÙÒ ×¸ Ð ØÖ Ô n + 1 ÒÓ Ó× ×ÓÐÓ
     ÔÙ Ø Ò Ö ÙÒ Ö Þ ÙÝ ÔÖ ÓÖ                  × Ð Ñ ÒÓÖ ØÓ ׺ Ë (ki, pi) Ð ÒÓ Ó
     Ö Þ Ð ØÖ Ôº ÍÒ Ú Þ Ø ÖÑ Ò Ð Ö Þ Ð ØÖ Ô Ý                         Ù×        Ð ÔÖÓÔ
         ÓÖ Ò ÙÒ        ¸ Ð ÓÒ ÙÒØÓ ÒÓ Ó× Ð × Ö Ñ × ÞÕÙ Ö Ý Ö                             ÕÙ
        Ø ÖÑ Ò Ó Ò K< = {(k1, p1), . . . , (Ki−1, pi−1)} Ý K> = {(ki+1, pi+1), . . . , (kn, pn)}¸
     Ö ×Ô Ø Ú Ñ ÒØ º ÈÓÖ Ð ÔÓØ × × Ò Ù Ø Ú ¸ K< Ý K>¸ ÙÝ × Ö Ò Ð                           × ×ÓÒ
      Ò Ö ÓÖ × n + 1¸ Ø Ò Ò ØÖ Ô× ÙÒ Ó׺ Ð Ð Ñ × ÖØÓ Ô Ö ØÓ Ó n
      Ò ÕÙ ÓÒ× ×Ø Ð Ð ØÓÖ             ÙÒ ØÖ Ô Ä Ö ×ÔÙ ×Ø × Ò Ù ÒØÖ Ò Ð × Ð ÓÒ
  Ð ÔÖ ÓÖ º Ù Ò Ó × Ö ÙÒ ÒÙ ÚÓ ÒÓ Ó¸ × × Ð ÓÒ Ð ÔÖ ÓÖ                      Ð ØÓÖ Ñ ÒØ ¸ ×
Ò× ÖØ Ð ÒÓ Ó × ÙÒ Ð Ð ÓÖ ØÑÓ Ð × Ó Ò× Ö ÓÒ Ò                   Ý Ð × Ú ÓÐ ÓÒ × Ú ÒØÙ Ð ×
 Ð Ö Ð ÓÒ Ð Ò ×ØÖÓ × ÓÖÖ Ò Ñ ÒØ ÖÓØ ÓÒ ×º
6.3. Treaps                                                                            487



                                                                                                         96
                                                                                                         440

                                                                                          89
                                                                                          454

                                                                      62                       92
                                                                      457                      490

 1                                                                              77                 93
470                                                                             558                725

                                                        55                  66         86            94
                                                        511                 718        646           761

                                             27            56            65        84
                                             515           659           718       649

   2                                                45            61
  537                                               587           681

                                          24     44            60
                                          571    734           854

                                   21
                                   575

                 7                     22
                608                    769

         3           8
        625         652

               5       14
              658      685

                             17
                             713

                               19
                               729


        ÙÖ º          ÑÔÐÓ     ØÖ Ôº     ÑÔÓ× ×ÙÔ Ö ÓÖ × Ö ÔÖ × ÒØ Ò Ð × Ð Ú × Ò Ö ÓÖ × ÔÖ ÓÖ ¹
         ×
      6.3.1    El TAD Treap<Key>
       Ð ÔÖ Ñ Ö Ô ×Ó Ò Ð × ÒÓ ÙÒ Ì ÕÙ ÒÓ× ÑÓ Ð ÙÒ ØÖ Ô × Ø ÖÑ Ò Ö Ð
      רÖÙ ØÙÖ Ð ÒÓ Ó ÕÙ ÐÓ ÓÒ ÓÖÑ º À Ý Ó× Ñ Ò Ö × Ò Ö Ð × ÑÔÐ ÒØ Ö ÙÒ ØÖ Ô
488                                    Cap´        ´
                                          ıtulo 6. Arboles de b´ squeda equilibrados
                                                               u



Ö ÙÖ× Ú Ó Ø Ö Ø Ú Ñ ÒØ º Ñ Ó× Ò ÓÕÙ × ×ÓÒ ÑÙÝ × Ò ÐÐÓ× Ý ÓÑÔ ÖØ Ò Ð ×ØÖÙ ØÙÖ
   Ð ÒÓ Óº ÈÓÖ × Ö ÞÓÒ¸ Ñ ÒØ Ò Ö ÑÓ× Ð ×ØÖÙ ØÙÖ Ð ÒÓ Ó Ò ÙÒ Ö ÚÓ × Ô Ö Ó
   ÒÓÑ Ò Ó ØÖ ÔÆÓ ºÀ         ¸ Ð Ù Ð × ×ØÖÙ ØÙÖ ÓÑÓ × Ù
 ØÖ ÔÆÓ ºÀ       ≡
  const long Max_Priority = ULONG_MAX;
  const long Min_Priority = 0;
  class TreapNode_Data
  {
    unsigned long priority;
    TreapNode_Data () : priority (Max_Priority) { /* empty */ }
    unsigned long & getPriority () { return priority; }
  };
  DECLARE_BINNODE_SENTINEL(TreapNode, 80, TreapNode_Data);
  # define PRIO(node) ( (node) -> getPriority () )
  ¬Ò ×
  TreapNode¸ Ù×   Ò ÙÒ          º
Í× × DECLARE BINNODE SENTINEL   ¾ º
      ÕÙ × ¬Ò Ð ÒÓ Ó Ò Ö Ó TreapNode<Key> ÕÙ ÐÑ Ò ÙÒ ÔÖ ÓÖ
Ñ ÒØ Ð Ñ ØÓ Ó getPriority() Ó Ð Ñ ÖÓ PRIOº Ð Ö ÚÓ ÜÔÓÖØ Ó× ÓÒר ÒØ ×
Min Priority Ý Max Priority ÕÙ ÓÖÖ ×ÔÓÒ Ò ÐÓ× Ú ÐÓÖ × Ñ Ò ÑÓ Ý Ñ Ü ÑÓ ÕÙ ÔÙ
Ø Ò Ö ÙÒ ÔÖ ÓÖ º
    ÍÒ TreapNode<Key> Ø Ò ÙÒ Ú ÐÓÖ Node::NullPtr ÔÙÒØ Ó ÙÒ ÒØ Ò Ð ÓÒ
ÔÖ ÓÖ     Ñ Ü Ñ º ר ÒÓ Ó ÙÒ          ÒØ Ò Ð Ô Ö Ø Ò Ö ÖÓØ ÓÒ × × Ò ÒØ ×
        Ó × Ð Ö Óк
    ÆÙ ×ØÖ ÑÔÐ ÒØ ÓÒ Ð ØÖ Ô Ö ÕÙ Ö         ÙÒ ÒÓ Ó       Ö Ô Ö      Ð Ö Þº Ì Ð
ÒÓ Ó Ø Ñ Ò ÙÒ          ÒØ Ò Ð Ô Ö Ø Ò Ö ÖÓØ ÓÒ × × Ò ÒØ ×          Ð Ö Þº
       ÓÖ ÔÖÓ ÑÓ× × ÖÖÓÐÐ Ö Ð Ì Treap<Key>
 ØÔÐ ØÖ ÔºÀ    ≡
       template <template <typename> class NodeType, typename Key, class Compare>
  class Gen_Treap
  {
      Å Ñ ÖÓ× Gen Treap<Key>
  };
     Ð × × ÔÙ Ð × Gen Treap<Key>
  ¬Ò ×
  Gen Treap¸   Ù×     Ò ÙÒ      º
       ÒØ ×         ÑÔÐ ÒØ Ö ÐÓ× ÓÒרÖÙ ØÓÖ ×¸ × Ò × Ö Ó   ¬Ò Ö ÐÓ× ØÖ ÙØÓ× ÒØ ÖÒÓ×
Gen Treap<Key>
Å Ñ ÖÓ×             Gen Treap<Key>    ≡                       ´    µ
  Node               head;
  Node *             head_ptr;
  Node *&            tree_root;
    head × ÙÒ ÒÓ Ó       Ö ¸ Ô Ö ÒØ Ò Ð     Ð Ö Þ¸ head ptr × ÙÒ ÔÙÒØ ÓÖ Ð
ÒÓ Ó       Ö Ý tree root × ÙÒ Ö Ö Ò ÔÙÒØ ÓÖ Ð Ö Þ Ð ØÖ Ôº
    ÍÒ ØÖ Ô Ö ÕÙ Ö ÙÒ ÙÒ ÓÒ ÕÙ Ò Ö ÒÙÑ ÖÓ× Ð ØÓÖ Ó× ÓÖÖ ×ÔÓÒ ÒØ × Ð ×
ÔÖ ÓÖ    ׺ È Ö ÐÐÓ¸ ÒÓ× Ú Ð ÑÓ× Ð      Ð ÓØ gsl¾º Í× Ö ÑÓ× Ð Ò Ö ÓÖ ØÓÖ¹
  ¾
      Gnu Scientific Library    º
6.3. Treaps                                                                      489



Ò Ó ´ ÌÛ ×Ø µ¸ ØÙ ÐÑ ÒØ ÓÒÓ Ó ÓÑÓ Ð Ñ ÓÖ Ò Ö ÓÖ                        ÒÙÑ ÖÓ× × Ù Ó¹
 Ð ØÓÖ Ó× ½¼¸ ¸ ½½
 Å Ñ ÖÓ× Gen Treap<Key> +≡             ´ µ                         ¼
  gsl_rng * r;
   Ä Ð × Gen Treap<Key> ÒÓ × Ô Ö Ù×Ó Ö ØÓ Ð Ð ÒØ ¸ ÔÙ × ×Ù ÖÓÐ × ÑÔÐ ÒØ Ö
ÙÒ ØÖ Ô Ò Ö Ó ÕÙ × Ò Ô Ò ÒØ ÕÙ ×Ù× ÒÓ Ó× × Ò Ú ÖØÙ Ð × Ó ÒÓº Ð Ð ÒØ
     Ù× Ö Ð ÙÒ Ð × × Ù ÒØ × Ð × ×
  Ð × × ÔÙ Ð × Gen Treap<Key>     ≡                    ´    µ
      template <typename Key, class Compare = Aleph::less<Key> >
  class Treap : public Gen_Treap<TreapNode, Key, Compare>
      { /* empty */ };
      template <typename Key, class Compare = Aleph::less<Key> >
  class Treap_Vtl : public Gen_Treap<TreapNodeVtl, Key, Compare>
      { /* empty */ };
Í× × Gen Treap   Ò   TreapNode   º

6.3.2    Inserci´n en un treap
                o
 ÓÒ ÔØÙ ÐÑ ÒØ ¸ Ð Ò× Ö ÓÒ ÙÒ ÒÓ Ó p ÔÙ       Ö Ø Ö Þ Ö× Ò Ó× Ô ÖØ ×
  ½º     ØÙ Ö ÙÒ Ò× Ö ÓÒ ÓÑÓ Ò         × Ö¸ ×Ù ×Ø ØÙ Ö Ð ÒÓ Ó ÜØ ÖÒÓ ÔÓÖ pº
  ¾º ÊÓØ Ö p¸ ÓÖÑ ÕÙ ×Ø ×Ù         Ò Ú Ð¸ ר ÕÙ ×Ù ÔÖ ÓÖ     ÒÓ Ú ÓÐ Ð Ö Ð ÓÒ
       Ò ×ØÖ Ðº
     ר ÑÓ× ÔÖ Ô Ö Ó× Ô Ö ÑÔÐ ÒØ Ö Ð Ð ÓÖ ØÑÓ Ò× Ö ÓÒ
ÁÒ× Ö ÓÒ Ò Gen Treap<Key>     ≡
  static Node * insert(Node * root, Node * p)
  {
    if (root == Node::NullPtr)
      return p;
    Node * insertion_result = NULL;
    if (Compare() (KEY(p), KEY(root)))
      {
        insertion_result = insert(LLINK(root), p);
        if (insertion_result == Node::NullPtr)
          return Node::NullPtr;
        LLINK(root) = insertion_result;
        if (PRIO(insertion_result) < PRIO(root))
          return rotate_to_right(root);
        else
          return root;
      }
    else if (Compare() (KEY(root), KEY(p)))
      {
        insertion_result = insert(RLINK(root), p);
        if (insertion_result == Node::NullPtr)
          return Node::NullPtr;
        RLINK(root) = insertion_result;
        if (PRIO(insertion_result) < PRIO(root))
490                                 Cap´        ´
                                           ıtulo 6. Arboles de b´ squeda equilibrados
                                                                u



               return rotate_to_left(root);
             else
               return root;
            }
          return Node::NullPtr;
     }
    insert()       ØÙ ÙÒ Ù×ÕÙ Ö ÙÖ× Ú          Ð Ð Ú ÓÒØ Ò       Ò Ð ÒÓ Ó pº Ë × Ò¹
     Ù ÒØÖ ÙÒ ÒÓ Ó ÓÒ Ø Ð Ð Ú ¸ ÒØÓÒ × × Ö ØÓÖÒ Node::NullPtr º
        Ë ¸ ÔÓÖ Ð ÓÒØÖ Ö Ó¸ ÒÓ × Ò Ù ÒØÖ Ð Ð Ú ¸ ÒØÓÒ × Ð Ö ÙÖ× ÓÒ × Ø Ò Ò Ð ÒÓ Ó
     ÜØ ÖÒÓ ÓÒ Ò ÐÑ ÒØ × Ò× ÖØ Ð ÒÓ Óº Ä × Ù Ò Ö ÙÖ× Ú Ö ØÓÖÒÓ× Ú Ö ¬
    × Ý ÙÒ Ú ÓÐ ÓÒ Ð Ö Ð ÓÒ Ò ×ØÖ Ð¸ Ð Ù Ð Ú ÒØÙ ÐÑ ÒØ × ÓÖÖ                  ÓÒ ÙÒ
    ÖÓØ ÓÒº
        Ä Ú Ö× ÓÒ ÒØ Ö ÓÖ insert() × ÙÒ Ñ Ñ ÖÓ ÔÖ Ú Ó¸ ר Ø Ó¸ ÙÝÓ ÖÓÐ × Ö Ð Þ Ö
    Ð Ò× Ö ÓÒ Ý ÓÖÖ Ö Ð × Ú ÓÐ ÓÒ × Ð Ö Ð ÓÒ Ò ×ØÖ Ðº Ä × Ð ÓÒ Ð ØÓÖ              Ð
    ÔÖ ÓÖ      Ý Ð ÒÚÓ ÓÒ Ò Ð Ð Ñ ØÓ Ó Ö ÙÖ× ÚÓ ×ÓÒ Ö Ð Þ Ó× ÔÓÖ Ð Ú Ö× ÓÒ ÔÙ Ð
       insert() ÙÝ       ¬Ò ÓÒ × ÓÑÓ × Ù
¼    Å Ñ ÖÓ× Gen Treap<Key>           +≡                ´   µ        ¼
     Node * insert(Node * p)
     {
       PRIO(p)       = gsl_rng_get(r); // selecci´n aleatoria de prioridad
                                                 o
       Node * result = insert(tree_root, p);
       if (result == Node::NullPtr)
         return NULL;
       tree_root = result;
       return p;
     }


    6.3.3    Eliminaci´n en treap
                      o
    Ä Ð Ñ Ò ÓÒ × ÓÒ ÔØÙ ÐÑ ÒØ Ñ × × ÑÔÐ ÕÙ Ð Ð × Ò ÙÒ           º ÈÖ Ñ ÖÓ ×       Ù×
     Ð ÒÓ Ó ÓÒ Ð Ð Ú     ÒØ Ö ×º ÍÒ Ú Þ Ù    Ó¸ Ð ÒÓ Ó × ÖÓØ Ñ Ò Ö ÕÙ ×Ù          Ó
    Ñ ÒÓÖ ÔÖ ÓÖ    ×Ù      Ò Ú Ðº Ð ÔÖÓ ×Ó ÓÒØ ÒÙ ×Ø ÕÙ Ð ÒÓ Ó Ð Ñ Ò Ö           ÚÒ
     Ó Ò × ÑÓÑ ÒØÓ Ð ÒÓ Ó × ×Ù ×Ø ØÙÝ ÔÓÖ Node::NullPtr º
        ËÓÖÔÖ Ò ÒØ Ñ ÒØ ¸ ÙÒ Ú Ö× ÓÒ Ø Ö Ø Ú Ð Ð Ñ Ò ÓÒ × ÐÑ ÒØ Ö Ð Þ            иÐ
     Ù Ð × ×ØÖÙ ØÙÖ Ò Ó× Ô ÖØ × ÕÙ × ÔÖ × ÒØ Ò ÓÑÓ × Ù
¼    Å Ñ ÖÓ× Gen Treap<Key>          +≡                     ´ µ    ¼
     Node * remove(const Key & key)
     {
            Ù× Ö ÒÓ Ó    ÐÑÒ ÖÔ ¼
          if (p == Node::NullPtr)
            return NULL; // clave no fue encontrada
          ÊÓØ Ö Ô ×Ø ÕÙ      ÚÒ     Ó    ½
          p->reset();
          return p;
     }
     Ð ÔÖ Ñ Ö ÐÓÕÙ ¸ Ù× Ö ÒÓ Ó           ÐÑÒ Ö Ô      ¼   ¸× Ò Ö      Ù     Ö Ð ÒÓ Ó
    ×ÙÔÖ Ñ Ö p Ý × ¬Ò ÓÑÓ × Ù
¼     Ù× Ö ÒÓ Ó Ð Ñ Ò Ö Ô ¼ ≡                                       ´ ¼ µ
6.3. Treaps                                                            491



     Node ** pp = &RLINK(head_ptr);
     Node * p = tree_root;
     while (p != Node::NullPtr)
       if (Compare() (key, KEY(p)))
         {
           pp = &LLINK(p);
           p = LLINK(p);
         }
       else if (Compare() (KEY(p), key))
         {
           pp = &RLINK(p);
           p = RLINK(p);
         }
       else
         break;
     ר ÐÓÕÙ       Ð Ö Ó× Ú Ö Ð ×º Ä Ú Ö Ð p Ù Ö Ð Ö ÓÒ Ð ÒÓ Ó ×ÙÔÖ Ñ Öº
    ÈÙ ×ØÓ ÕÙ Ò Ð × ÙÒ × Ð ÒÓ Ó p × Ö ÖÓØ Ó ×Ø ÕÙ Ú Ò Ó ¸ × Ò × Ö Ó¸
     Ò ÔÖ Ò Ô Ó¸ Ù Ö Ö Ð Ö ÓÒ Ð ÒÓ Ó Ô Ö Ø Ð ÕÙ Ñ Ò Ö ×Ø × ØÙ Ð Ò
         ÖÓØ ÓÒº ÓÑÓ Ð Ð ÓÖ ØÑÓ × Ø Ö Ø ÚÓ¸ × ÔÖ Ö Ð Ù Ö Ö Ð Ö ÓÒ Ð Ð
      ÒØÖÓ Ð ÒÓ Ó Ô Ö ÕÙ ÔÙÒØ p Ø Ð ÔÙÒØ ÓÖ × Ñ ÒØ Ò Ò Ð Ú Ö Ð ppº
         Ð × ÙÒ Ó ÐÓÕÙ ¸ ÊÓØ Ö Ô ×Ø ÕÙ Ú Ò Ó ½ × ×Ô ¬              Ð × Ù ÒØ
    ÑÓ Ó
½    ÊÓØ Ö Ô ×Ø ÕÙ Ú Ò Ó ½ ≡                                 ´ ¼ µ
      while ( Ô ÒÓ ×   Ó ½ )
       if (PRIO(LLINK(p)) < PRIO(RLINK(p)))
         {
           *pp = rotate_to_right(p);
           pp = &RLINK(*pp);
         }
       else
         {
           *pp = rotate_to_left(p);
           pp = &LLINK(*pp);
         }

     *pp = Node::NullPtr;
    Ä ÙÐØ Ñ Ð Ò × Ð ÕÙ ¬Ò ÐÑ ÒØ Ð Ñ Ò Ð ÒÓ Ó p Ð × Ò ÖÐ Ð Ð           Ð ÒÓ Ó ÕÙ
     ÔÙÒØ p Ð ÒÓ Ó ÜØ ÖÒÓ Node::NullPtr º
         Ð ÔÖ     Ó Ô ÒÓ × Ó     ½    ÓÒ× ×Ø Ò Ú Ö ¬ Ö × ÐÓ× ×Ù Ö ÓÐ × p ×ÓÒ
     ÜØ ÖÒÓ׺ ×ØÓ × Ö Ð Þ Ð × Ù ÒØ Ñ Ò Ö
½    Ô ÒÓ × Ó ½ ≡                                             ´ ½µ
     not (LLINK(p) == Node::NullPtr and RLINK(p) == Node::NullPtr)
          × Ð ÑÓÑ ÒØÓ Ö Ð Þ Ö ÙÒ Ó × ÖÚ ÓÒ ÒØ Ö × ÒØ Ð Ð Ñ Ò ÓÒ         ÙÒ ÒÓ Ó
    Ó ÙÖÖ Ü Ø Ñ ÒØ Ò Ð Ñ ×ÑÓ × Ø Ó ÓÒ ×Ø × Ù × Ò× ÖØ Óº Ê ÓÖ         ÑÓ× ÕÙ Ð
     Ò× Ö ÓÒ ÓÑ ÒÞ ÔÓÖ ÓÐÓ Ö Ð ÒÙ ÚÓ ÒÓ Ó ÓÑÓ Ó º Ë     ÑÓ× Ð Ñ Ò    Ö ÙÒ Ð Ú
    Ý ÐÙ Ó Ò× ÖØ ÖÐ ¸ Ð Ó Ð ÒÓ Ó Ò× Ö ÓÒ × Ü Ø Ñ ÒØ Ð Ñ ×Ñ ÕÙ         ÙÒÓ Ù
     Ð Ñ Ò º ÍÒ ÑÔÐÓ ×Ø × ØÙ ÓÒ × ÐÙ×ØÖ ÓÒ Ð ÒÓ Ó 38 Ð ¬ ÙÖ           ºº
        ÁÒØÙ Ø Ú Ñ ÒØ ר ÒÓÑ ÒÓ × Ú Ò Ó ÔÓÖ Ð Ð Ñ        Ð ÙÒ            Ð ØÖ Ô
492                                                      Cap´        ´
                                                            ıtulo 6. Arboles de b´ squeda equilibrados
                                                                                 u



                                                                                  5
                                                                                  8
             5                                                               1             12
             8                                                               70            28
        1                                 38                            0             8                        38
        70                                26                            24            38                       26
  0                   12                       39                                                         28        39
  24                  28                       30                                                         54        30
                 8                   28             40                                          21                       40
                 38                  54             36                                          69                       36
                           21                                      64                                22                                 64
                           69                                      97                                89                                 42
                                22                            43                                                                   43
                                89                            81                                                                   81
                                                         42                                                                   42
                                                         42                                                                   97
                                ´µ                                                                   ´ µ
             5                                                                    5
             8                                                                    8
        1             12                                                     1             12
        70            28                                                     70            28
  0              8                             39                       0             8                             39
  24             38                            30                       24            38                            30
                                          38        40                                                    28             40
                                          26        36                                                    54             36
                                     28                            64                           21             38                       64
                                     54                            42                           69             26                       42
                           21                                 43                                     22                            43
                           69                                 81                                     89                            81
                                22                       42                                                                   42
                                89                       97                                                                   97
                                ´µ                                                                   ´ µ

  ÙÖ º     ÑÔÐÓ     Ð Ñ Ò ÓÒ Ð Ð Ú 38 Ò ÙÒ ØÖ Ôº Ä ÔÓ× ÓÒ ¬Ò Ð Ð 38
ÒØ × ×ÙÔÖ Ñ ÖÐÓ × Ð Ñ ×Ñ ÕÙ Ð ÔÓ× ÓÒ Ò Ð Ò× Ö ÓÒº

´Ð Ñ º¿µº È Ö ÕÙ Ð ØÖ Ô × ÙÒ Ó ØÖ Ú ×                                    ØÓ × Ð × ÑÓ ¬                     ÓÒ ×¸ Ð Ò× Ö ÓÒ
Ý Ð Ñ Ò ÓÒ × ÑÔÖ      Ò Ú Ö Ð Ñ ×ÑÓ ØÖ Ôº
6.3.4        An´lisis de los treaps
               a
  Ò Ò Ð × × ÐÓ× ØÖ Ô× Ö ÕÙ Ö ×Ø Ð Ö ÙÒ ÔÖÓÔ   ÑÙÝ ×Ó          Ð Ð ØÓÖ
Ð ÔÖÓÔ         Ù× Ò      Ñ ÑÓÖ Ò Ð × × ÓÒ × Ð ØÓÖ ×º Ì Ð ÔÖÓÔ      ר
ÔÓÖ Ð × Ù ÒØ ÔÖÓÔÓ× ÓÒ
6.3. Treaps                                                                                493



Proposici´n 6.3
         o         ÍÒ ØÖ Ô T × ÙÒ Ö ÓÐ Ò Ö Ó Ð ØÓÖ Óº
     Ò ÓØÖ × Ô Ð Ö ×¸ ÙÒ ØÖ Ô × ÕÙ Ú Ð ÒØ ÙÒ                       ÓÒרÖÙ Ó Ô ÖØ Ö ÙÒ × ¹
 ÙÒ         Ò× Ö ÓÒ Ð ØÓÖ º
Demostraci´n ÈÙ ×ØÓ ÕÙ Ð × ÔÖ ÓÖ
             o                                    × ×ÓÒ × Ð ÓÒ × Ð ØÓÖ Ò Ô Ò ÒØ ¹
Ñ ÒØ ¸ ÔÓ ÑÓ× ×ÙÑ Ö ÕÙ ØÓ × Ð × ÔÖ ÓÖ                   × ×ÓÒ × Ó × ÒØ × ÕÙ × Ò Ð
× ÙÒ          Ò× Ö ÓÒº
    Ë K = {k1, k2, . . . , kn} ÙÒ × Ù Ò             Ò× Ö ÓÒ Ù ÐÕÙ Ö Ý × P = {p1, p2, . . . , pn}
ÙÒ ÓÒ ÙÒØÓ ÔÖ ÓÖ             × × Ð ÓÒ × Ð ØÓÖ Ò Ô Ò ÒØ Ñ ÒØ ÕÙ ×ÓÒ × Ò ×
  Ð × Ð Ú × K Ø Ð ÕÙ           Ô Ö (ki, pi) ÓÑÔÓÒ Ö ÙÒ ÒÓ Ó Ð ØÖ Ôº
    ÈÓÖ Ð Ð Ñ º¿¸ × ÑÓ× ÕÙ                  × Ð × Ð Ú × Ý ×Ù× ÔÖ ÓÖ     × Ð ØÖ Ô × ÙÒ Óº רÓ
 ÑÔÐ ÕÙ Ð ÓÖ Ò Ò× Ö ÓÒ ÒÓ Ø Ð ØÖ Ô Ö ×ÙÐØ ÒØ º                            ר ÑÓ Ó¸ × Ò Ô Ö
      Ò Ö Ð ¸ ÔÓ ÑÓ× ×ÙÑ Ö ÙÒ × Ù Ò                        Ò× Ö ÓÒ SABB ÕÙ Ú × Ð Ñ ÒÓÖ
   ר Ð Ñ ÝÓÖ ÔÖ ÓÖ              Ð Ù Ð ÔÓ ÑÓ× Ö Ð Þ Ö Ð × × Ù ÒØ × Ó × ÖÚ ÓÒ ×
   ½º Ê ×Ô ØÓ Ð ÓÒ ÙÒØÓ              Ð Ú × K¸ Ð ÔÖÓ Ð              ÕÙ SABB × Ð Ú ÐÓÖ ÙÒ
      Ô ÖÑÙØ ÓÒ ×Ô ¬ × |K|! ¸ ÔÙ × Ð ÓÖ Ò Ð Ô ÖÑÙØ ÓÒ ×Ø
                                       1
                                                                                      Ó ÔÓÖ Ð
      ÓÖ Ò Ð × ÔÖ ÓÖ              × ÕÙ ×ÓÒ × Ò × Ð ØÓÖ Ñ ÒØ                    Ð Ú º ÈÓÖ Ø ÒØÓ¸
      Ð × Ù Ò SABB ÓÖ Ò ÔÓÖ ÔÖ ÓÖ                        × Ð ØÓÖ ¸ ÔÙ × Ð × ÔÖ ÓÖ      × Ù ÖÓÒ
       × Ó × Ð ØÓÖ Ò Ô Ò ÒØ Ñ ÒØ º
   ¾º SABB ÒÓ Ù× ÖÓØ ÓÒ × Ò Ð ØÖ Ô¸ ÔÙ ×                        ÒÓ Ó × Ò× ÖØ Ó ÓÑÓ Ó Ý¸
      ÔÙ ×ØÓ ÕÙ Ù Ò× ÖØ Ó ÔÓÖ ÔÖ ÓÖ                    × Ò ÒØ ¸ Ð Ö Ð ÓÒ Ò ×ØÖ Ð Ñ × ×
      Ú ÓÐ º       ÐÓ ÒØ Ö ÓÖ¸ ÔÓ ÑÓ× ÓÒ ÐÙ Ö ÕÙ Ð Ò× Ö ÓÒ SABB Ó ÙÖÖ                         Ð
      Ñ ×Ñ Ñ Ò Ö ÕÙ Ò ÙÒ                  º
    ÈÙ ×ØÓ ÕÙ SABB × ÙÒ × Ù Ò Ð ØÓÖ Ý ÕÙ Ð Ò× Ö ÓÒ Ó ÙÖÖ ÓÑÓ Ò ÙÒ
     ¸ ÔÓ ÑÓ× ÓÒ ÐÙ Ö ÕÙ ÙÒ ØÖ Ô × ÕÙ Ú Ð ÒØ ÙÒ                        ÓÒרÖÙ Ó Ô ÖØ Ö ÙÒ
× ÙÒ          Ò× Ö ÓÒ Ð ØÓÖ




                                ÙÖ º ÍÒ ØÖ Ô           512   ÒÓ Ó×
   Ä ÔÖÓÔÓ× ÓÒ ÒØ Ö ÓÖ ÒÓ× Ö ÒØ Þ ÕÙ Ð Ø ÑÔÓ ×Ô Ö Ó Ô Ö Ð Ù×ÕÙ          Ò ÙÒ
ØÖ Ô × O(Ð n)º ÉÙ Ö         Ð × Ò× Ö ÓÒ × Ý ×ÙÔÖ × ÓÒ × Ç × ÖÚ ÑÓ× ÕÙ Ñ ×
ÓÔ Ö ÓÒ × ×Ø Ò ÓÑ Ò × ÔÓÖ Ð ÐØÙÖ Ð Ö ÓÐ Ý ÕÙ ×Ø × Ö ×ÙÐØ Ò Ò ØÖ Ô׺ Ä
  ÒØ Ñ Ü Ñ ÖÓØ ÓÒ × Ø Ñ Ò × ÙÒ ÓÒ Ð ÐØÙÖ º                ר Ñ Ò Ö ¸ ÔÓ ÑÓ×
 ÓÒ ÐÙ Ö ÕÙ Ð × ÓÔ Ö ÓÒ × Ò× Ö ÓÒ¸ Ù×ÕÙ Ý Ð Ñ Ò ÓÒ ×ÓÒ O(Ð n)º
494                                Cap´        ´
                                      ıtulo 6. Arboles de b´ squeda equilibrados
                                                           u



6.3.5   Prioridades impl´
                        ıcitas
ÄÓ× ØÖ Ô× ×ÓÒ Ö ÓÐ × Ð ØÓÖ Ó׺ ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð × ÑÔ ÒÓ Ð Ù×ÕÙ                  ×
 ÕÙ Ú Ð ÒØ ÐÓ× Ö ÓÐ × Ð ØÓÖ Þ Ó׺ Ò Ù ÒØÓ Ð ×Ô Ó¸ ÐÓ× Óר × Ø Ñ Ò ×ÓÒ
 ÕÙ Ú Ð ÒØ ׸ ÔÙ × Ñ Ó× Ö ÓÐ × Ö ÕÙ Ö Ò ÐÑ Ò Ö ÙÒ ÒØ ÖÓ         ÓÒ Ð ÔÓÖ ÒÓ Ó Ò
ÐÓ× Ö ÓÐ × Ð ØÓÖ Þ Ó× × Ð Ö Ò Ð         Ò ÐÓ× ØÖ Ô× × Ð ÔÖ ÓÖ º
    ËÓÖÔÖ Ò ÒØ Ñ ÒØ ¸ Ò ÙÒ ØÖ Ô ÔÓ ÑÓ× Ó Ú Ö Ð ÔÖ ÓÖ         × Ð ×Ù ×Ø ØÙ ÑÓ× ÔÓÖ
ÙÒ ÙÒ ÓÒ × ÕÙ ØÖ Ò× ÓÖÑ Ð Ð Ú ÙÒ Ú ÐÓÖ ÔÖ ÓÖ º                      ר Ñ Ò Ö ¸ Ð
ÔÖ ÓÖ     ÒÓ Ò × Ø ÐÑ Ò Ö× ¸ ÔÙ × ×Ø ÔÙ           Ð ÙÐ Ö× ÑÔÐ Ø Ñ ÒØ          ÚÞ
ÕÙ × Ö ÕÙ Ö º Ð ØÖ Ô Ó ÙÔ Ö ¸ ÒØÓÒ ×¸ ÙÒ ×Ô Ó ÕÙ Ú Ð ÒØ Ð ÙÒ               º
    È Ö ÕÙ ×Ø Ò ÓÕÙ × ¬ Þ¸ × Ò × Ö ÙÒ Ù Ò ÙÒ ÓÒ × º Ò ×Ø × ÒØ Ó¸
ØÓ Ð Ø ÓÖ         ÙÒ ÓÒ × × ÑÔ ÖØ Ò Ü º¾ ´Ô Ò            µ × ÔÐ Ð º

6.4     ´
        Arboles AVL
ÍÒ Ö ÓÐ Îĸ Ó ÙÒ      Îĸ × ÙÒ Ð × ×Ô         Ð    Ö ÓÐ Ò Ö Ó      Ù×ÕÙ        ¬Ò Ó
 ÓÑÓ × Ù
       o       ´
Definici´n 6.4 (Arbol AVL)      Ë   T   ÙÒ Ö ÓÐ Ò Ö Ó      Ù×ÕÙ   º Ë      ÕÙ   T   ×
 ÎÄ × Ý ×ÓÐÓ ×
                    ∀ni ∈ T,   −1 ≤ h(Ê(ni)) − h(Ä(ni)) ≤ 1                    ´ºµ
×     Ö¸ Ô Ö ØÓ Ó ÒÓ Ó¸ Ð   ÖÒ    ÐØÙÖ ÒØÖ Ð Ö Ñ ÞÕÙ Ö Ý Ö ÒÓ
Ü    Ö Ð ÙÒ º
   È Ö ÙØÙÖÓ× × ÙÖ×Ó׸ Ð      ÖÒ      ÐØÙÖ   ÙÒ ÒÓ Ó ni × ÒÓÑ Ò δ(ni)              =
h(Ê(ni)) − h(Ä(ni))º Ò ÓÒØ ÜØÓ×  Ó Ó¸ δ(ni) × ÒÓØ ÓÑÓ DIFF(n)º




                         ÙÖ º ÍÒ Ö ÓÐ ÎÄ          512   ÒÓ Ó×

    Ä ÓÒ ÓÒ ´ º µ × ÒÓÑ Ò ÓÒ ÓÒ ÎÄ Ý × Ñ ÒÓ× Ù ÖØ ÕÙ Ð ÕÙ Ð Ö Ó Ù ÖØ
   Ï ÖØ ¬Ò Ó Ò Ü º½ ´Ô Ò           µº Ä    × Ô Ö Ö ÙÒ ÔÓ Ó ÕÙ Ð Ö Ó Ò Ö ×
 Ð ÓÖ ØÑÓ× Ñ × ¬ ÒØ × ÕÙ Ö ÒØ Ò Ð ÓÒ ÓÒ Îĺ Å × Ð ÒØ ÑÓ×ØÖ Ö ÑÓ×
ÕÙ Ð ÐØÙÖ ÙÒ ÎÄ ×Ø ÐÓ Ö ØÑ Ñ ÒØ ÓØ º Ä Ò Ò ×ØÖ ¸ ÒØÓÒ ×¸
 Ò ÐÓ Ö Ö Ð ÓÖ ØÑÓ× ÑÓ ¬ ÓÒ ÐÓ Ö ØÑ Ó׺ ×ØÓ × Ø Ð × ÐÑ Ò ÑÓ× Ò
ÒÓ Ó Ò ÓÖÑ ÓÒ ×Ó Ö Ð ÕÙ Ð Ö Óº
    Ë ÓÒÓ Ò Ó× ÓÖÑ × ÑÔÐ ÒØ Ö ÙÒ Îĺ Ä ÔÖ Ñ Ö ¸ ÕÙ × Ð Ñ × ÔÓÔÙÐ Ö Ý
 ¬ ÒØ ¸ Ô ÖÓ Ø Ñ Ò Ð Ñ ×         и ÓÒ× ×Ø Ò ÐÑ Ò Ö Ò        ÒÓ Ó Ð    ÖÒ
     ÐØÙÖ ×º È Ö ÐÐÓ ×ÓÐÓ × Ö ÕÙ Ö Ò Ó× Ø×¸ ÐÓ× Ù Ð ×¸ Ó ÐÓ× Ö ÕÙ Ö Ñ ÒØÓ×
 Ð Ò ÓÒ Ô Ð Ö ÑÔÙ ×ØÓ× ÔÓÖ Ð × ÖÕÙ Ø ØÙÖ × ÑÓ ÖÒ ×¸         Ò ÜØ Ò Ö× ×Ø
Ð ÐÓÒ ØÙ       Ð Ô Ð Ö Ð ÖÕÙ Ø ØÙÖ º
´
6.4. Arboles AVL                                                             495



    Ä × ÙÒ ÑÔÐ ÒØ ÓÒ ÓÒ× ×Ø Ò ÐÑ Ò Ö Ò               ÒÓ Ó ×Ù ÐØÙÖ º ÈÙ ×ØÓ ÕÙ
 Ð Ö ÓÐ × ÐÓ Ö ØÑ Ñ ÒØ ÓØ Ó¸ ÙÒ ÝØ × ×Ù¬ ÒØ º ר ÐØ ÖÒ Ø Ú ÓÒ Ù
   Ð ÓÖ ØÑÓ× Ñ × × Ò ÐÐÓ׸ Ô ÖÓ Ñ ÒÓ× ¬ ÒØ ¸ Ô٠׸ Ù Ò Ó × ÑÓ ¬ Ð Ö Óи ×
Ö ÕÙ Ö Ò ØÙ Ð Þ Ö Ñ × ÒÓ Ó× ÓÒ ×Ù ÐØÙÖ º
     Ò ×Ø Ø ÜØÓ ÓÔØ Ö ÑÓ× Ð ÔÖ Ñ Ö ×Ø ÐÓ ÑÔÐ ÒØ ÓÒ × Ö¸ ÐÑ Ò Ö ÑÓ× Ð
    ÖÒ       ÐØÙÖ × Ò       ÒÓ Óº Ä ×ØÖÙ ØÙÖ ÙÒ ÒÓ Ó ÎÄ × ¬Ò Ò Ð Ö ÚÓ
  ÚÐÆÓ ºÀ       ¸ Ð Ù Ð Ø Ò Ð ×ØÖÙ ØÙÖ × Ù ÒØ
  ÚÐÆÓ ºÀ      ≡
  class AvlNode_Data
  {
    signed char diff; // diferencia de altura
    AvlNode_Data() : diff(0) { /* EMPTY */ }
    signed char & getDiff() { return diff; }
  };
  DECLARE_BINNODE(AvlNode, 40, AvlNode_Data);
  # define DIFF(p) ((p)->getDiff())
Í× × AvlNode Ò    DECLARE BINNODE   ¾ º

6.4.1    El TAD Avl Tree<Key>
  Ð Ì Gen Avl Tree<Key> ¬Ò ÙÒ Ð × Ò Ö           Ö ÓÐ ÎÄ Ò Ô Ò ÒØ
ÕÙ Ð ÒÓ Ó × Ú ÖØÙ Ð Ó ÒÓº Ä Ð × Ò Ù ×Ø ÓÒ × ¬Ò Ò Ð Ö ÚÓ ØÔÐ ÚкÀ                ¸
ÕÙ × ¬Ò ÓÒØ ÒÙ ÓÒ
 ØÔÐ ÚкÀ   ≡
      template <template <typename> class NodeType, typename Key, class Compare>
  class Gen_Avl_Tree
  {
    typedef NodeType<Key> Node;
     Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Avl Tree<Key>
     Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Avl Tree<Key>
  };
      template <typename Key, class Compare = Aleph::less<Key> >
  class Avl_Tree : public Gen_Avl_Tree<AvlNode, Key, Compare> { /* empty */ };
      template <typename Key, class Compare = Aleph::less<Key> >
  class Avl_Tree_Vtl : public Gen_Avl_Tree<AvlNodeVtl, Key, Compare> { /* empty */ };
Í× × AvlNodeº
    Ä × Ð × × Avl Tree Vtl<Key> Ý Avl Tree<Key> ¬Ò Ò Ö ÓÐ × ÕÙ Ñ Ò Ò ÒÓ Ó×
Ú ÖØÙ Ð × Ý ÒÓÖÑ Ð × Ö ×Ô Ø Ú Ñ ÒØ º
      ÙÒÕÙ ÔÓÖ ÐÓ Ò Ö Ð ÐÓ× Ð ÓÖ ØÑÓ× ×Ó Ö Ö ÓÐ × ×ÓÒ Ò ØÙÖ ÐÑ ÒØ ÜÔÖ × Ð × Ò
 ÓÖÑ Ö ÙÖ× Ú ¸ ÐÓ× Ö ÓÐ × ÎÄ ÒÓ Ò Ò Ò ×Ø Ø ÓÖ º Ä × ÑÔÐ ÒØ ÓÒ × Ö ÙÖ¹
× Ú × ÕÙ × ÓÒÓ Ò ×Ø Ò × × Ò ÐÑ Ò Ö Ò                 ÒÓ Ó ×Ù ÐØÙÖ Ý ØÙ Ð Þ ÖÐ
Ö ÙÖ× Ú Ñ ÒØ Ò          ÑÓ ¬ ÓÒº Ò ÒÙ ×ØÖÓ ×Ó¸ Ò Ö × ÐÓ Ö Ö ÙÒ ÑÔÐ ÒØ ÓÒ
Ñ × ¬ ÒØ ÕÙ Ð Ö ÙÖ× Ú ¸ ÙØ Ð Þ Ö ÑÓ× ÙÒ Ô Ð ¸ Ð Ù Ð × ×Ô ¬ ÓÑÓ × Ù
 Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Avl Tree<Key>        ≡             ´    µ
  FixedStack<Node *, Node::MaxHeight> avl_stack;
  ¬Ò ×
  avl stack¸ Ù×     Ò ÙÒ ×     ¸     ¸ ¼¼ß ¼¿¸ Ò   ¼º
Í× × FixedStack   ½¼ º
496                                   Cap´        ´
                                         ıtulo 6. Arboles de b´ squeda equilibrados
                                                              u



avl stack ×ÑÔÖ Ù Ö Ö Ð Ñ ÒÓ Ù×ÕÙ     × Ð Ö Þ ×Ø Ð ÒÓ Ó Ò× ÖØ Ó Ó
Ð Ñ Ò Óº ÈÙ ×ØÓ ÕÙ Ð ÐØÙÖ ÙÒ ÎÄ ×Ø ÓØ ¸ Ð Ô Ð ÒÓ Ö ÕÙ Ö Ú Ö ¬ ÓÒ ×
    × ÓÖ º
Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Avl Tree<Key> +≡   ´   µ
  Node      head_node;
  Node *    head_ptr;
  Node *&   root;
  Compare   cmp;

   head node   × ÙÒ ÒÓ Ó ÙÜ Ð Ö ÕÙ × Ö Ô Ö Ð ÒÓ Ó Ö Þº head ptr × ÙÒ ÔÙÒØ ÓÖ
 Ð ÒÓ Ó ÙÜ Ð Öº Ð Ù×Ó Ð ÒÓ Ó          Ö × ÑÙÝ ÙØ Ð Ô Ö Ò Ö Ð Þ Ö Ð × ÖÓØ ÓÒ ×º Ë
ÒÓ Ù× × ÑÓ× ×Ø         Ö ¸ ÒØÓÒ × Ð ÖÓØ ÓÒ Ð Ö Þ         Ö ØÖ Ø Ö× × Ô Ö Ñ ÒØ º
    head ptr × ÑÔÖ ×Ø Ö Ò× ÖØ Ó Ò Ð Ô Ð º            ØÓ× Ð ÓÖ ØÑ Ó׸ × ÓÒ× Ö Ö
ÕÙ Ð Ô Ð ×Ø Ú         Ù Ò Ó ×Ø ×ÓÐÓ ÓÒØ Ò Ð ÒÓ Ó           Ö º ÈÐ ÒØ ÑÓ׸ ÒØÓÒ ×¸
Ð × × Ù ÒØ × ÙÒ ÓÒ ×
 Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Avl Tree<Key>         +≡        ´   µ
  bool avl_stack_empty() { return avl_stack.top() == head_ptr; }
  void clean_avl_stack() { avl_stack.popn (avl_stack.size() - 1); }
  ¬Ò ×
  avl stack empty¸   Ù×   Ò ÙÒ × ¼¼ Ò ¼½ º
  clean avl stack¸   Ù×   Ò ÙÒ ×   ¸ ¼¼ß ¼¾¸ Ò   ¼º
Í× × avl stack       º
   avl stack empty() ÖØÓÖÒ ÖØÓ × avl stack ר ÐÓ Ñ ÒØ Ú º clean avl stack()
Ð ÑÔ Ð Ô Ð × Ö¸ ÜØÖ ØÓ Ó× ×Ù× Ð Ñ ÒØÓ׺
   ÈÓÖ ÓÒÚ Ò ÓÒ¸ Ð Ö Þ root × Ö Ð      Ö       Ð ÒÓ Ó      Ö head ptrº ÆÓØ ÑÓ×
ÕÙ root × ÙÒ Ö Ö Ò       RLINK (head ptr) Ý ÒÓ ÙÒ ÔÙÒØ ÖÓº ר Ö     ÒÓ× Ô ÖÑ Ø
ØÖ    Ö Ö Ø Ñ ÒØ ÓÒ RLINK (head ptr) Ñ ÒØ Ð ÒÓÑ Ö rootº
6.4.1.1     Inserci´n en un arbol AVL
                   o        ´

 ÓÒ× Ö ÑÓ× ÙÒ ÎÄ Ò Ð Ù Ð × Ö Ð Þ ÙÒ Ò× Ö ÓÒ Ð × Ò ÙÒ          ×                  Ö¸
Ð ÒÓ Ó × Ò× ÖØ ÓÑÓ Ó Ò Ð ÐÙ Ö Ó ÙÔ Ó ÔÓÖ Ð ÒÓ Ó ÜØ ÖÒÓ Ö ×ÙÐØ Ó                  Ð
Ù×ÕÙ º Ì Ð Ò× Ö ÓÒ Ð Ö Ð Þ Ð Ð ÓÖ ØÑÓ × Ù ÒØ
Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Avl Tree<Key>     ≡       ´  µ ¼½
  Node * insert(Node * p)
  {
    if (root == Node::NullPtr)
      {
        root = p;
        return p;
      }
    Node *pp = search_and_stack_avl(KEY(p));
    if (cmp (KEY(p), KEY(pp)))
      LLINK (pp) = p;
    else if (cmp (KEY(pp), KEY(p)))
      RLINK(pp) = p;
    else
      { // clave duplicada
        clean_avl_stack();
´
6.4. Arboles AVL                                                                             497



          return NULL;
        }
      restore_avl_after_insertion(KEY(p));
      return p;
  }
Í× × clean avl stack       ¸ restore avl after insertion ¼¼ ¸ Ò   search and stack avl   º
Ä ÙÒ ÓÒ search and stack avl() Ù× Ð Ð Ú ÓÒØ Ò                          Ò p Ý Ð Ú Þ Ù Ö ØÓ Ó
 Ð Ñ ÒÓ      Ù×ÕÙ   Ò Ð Ô Ð avl stack
 Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Avl Tree<Key>    +≡    ´                      µ
  Node * search_and_stack_avl(const Key & key)
  {
    Node * p = root;
    do // desciende en b´squeda de key y empila camino de b´squeda
                        u                                  u
      {
        avl_stack.push(p);
        if (cmp(key, KEY(p))) // ¿key < KEY(p)?
          p = LLINK(p);
        else if (cmp(KEY(p), key)) // ¿key > KEY(p)?
          p = RLINK(p);
        else
          return p; // clave duplicada
      }
    while (p != Node::NullPtr);
    return avl_stack.top();
  }
  ¬Ò ×
  search and stack avl¸   Ù×   Ò ÙÒ ×       Ò   ¼½ º
Í× × avl stack    º
 Ë KEY(p) Ý × Ò Ù ÒØÖ Ò Ð Ö Óи ÒØÓÒ × search and stack avl() Ö ØÓÖÒ Ð ÒÓ Ó
ÕÙ ÓÒØ Ò Ð Ð Ú º Ä ÙÔÐ ÓÒ × Ø Ø Ò Ð ÔÖ Ñ Ö ifº Ò ×Ó ÓÒØÖ Ö Ó¸ pp ×
 Ð Ô Ö Ð ÒÓ Ó Ò× ÖØ Ö pº Ð ÒÓ Ó p × Ò× ÖØ × Ñ ÒØ Ý × ØÙ Ð Þ Ð ØÓÖ
   ÐÒ     ppº

Restauraci´n de la condici´n AVL
          o               o
       ×ÔÙ × Ð Ò× Ö ÓÒ × ¸ × Ú Ö ¬ × Ó ÙÖÖ ÙÒ Ú ÓÐ ÓÒ Ð ÓÒ ÓÒ Îĸ Ð
 Ù Ð × Ö Ø Ö Þ Ò Ó× ×Ó× Ò Ö Ð ×º Ð ÔÖ Ñ ÖÓ ÐÐÓ× × ÐÙ×ØÖ Ò Ð ¬ ÙÖ º ´ µº
ÁÒ ÐÑ ÒØ ¸ Ð ÒÓ Ó y × Ò Ù ÒØÖ Ô Ö Ø Ñ ÒØ ÕÙ Ð Ö Ó¸ Ñ ÒØÖ × ÕÙ ×Ù Ô Ö
x ר Ð Ö Ñ ÒØ         × ÕÙ Ð Ö Ó        Ð Ö º Ç ÙÖÖ ¸ ÒØÓÒ ×¸ Ð Ò× Ö ÓÒ ÙÒ
Ú ÐÓÖ Ñ ÝÓÖ ÕÙ y¸ Ð Ù Ð          ÕÙ Ð Ö Ñ χ ÙÑ ÒØ        ÐØÙÖ º Ð ÒÓ Ó x ×Ù Ö ÙÒ
   × ÕÙ Ð Ö Ó ÕÙ Ú ÓÐ Ð ÓÒ ÓÒ Îĺ
    Ä Ú ÓÐ ÓÒ × Ö Ø Ò Ð ¬ ÙÖ º ´ µ × ÓÖÖ Ñ ÒØ ÙÒ ÖÓØ ÓÒ                        Ð
 ÞÕÙ Ö       Ð ÒÓ Ó y¸ ÙÝÓ Ö ×ÙÐØ Ó Ò Ö Ð × ÐÙ×ØÖ Ò Ð ¬ ÙÖ º ´ µº ÆÓØ ÑÓ× ÕÙ
 Ò Ð × Ó× ¬ ÙÖ × ¹ º ´ µ Ý º ´ µ¹ Ð Ú ÐÓÖ ÐØÙÖ ÐÓ Ð h + 2 Ô ÖÑ Ò ÒØ ØÓº ÈÓÖ
ÐÓ Ø ÒØÓ¸ × Ð × Ò Ò           T × ÎÄ ÒØ ×     Ð Ò× Ö ÓÒ¸ Ø Ñ Ò ÐÓ × ×Ô٠׺ Ò
ÓØÖ × Ô Ð Ö ×¸ Ô Ö Ð ×Ó           × ÕÙ Ð Ö Ó Ð ¬ ÙÖ º ´ µ¸ Ð ÓÖÖ ÓÒ Ö ×ÙÐØ ÒØ
   ×ÔÙ × Ð ÖÓØ ÓÒ ÔÖÓ Ù ÙÒ Ö ÓÐ ÒØ Ö Ñ ÒØ Îĺ
      Ð × ÕÙ Ð Ö Ó ÐÙ×ØÖ Ó Ò Ð ¬ ÙÖ º ´ µ Ø Ò ÙÒ ×Ó × Ñ ØÖ Ó ÕÙ Ó ÙÖÖ Ù Ò Ó
Ð Ò× Ö ÓÒ × ÔÖÓ Ù ÔÓÖ Ð ÞÕÙ Ö º Ö ¬ Ñ ÒØ ¸ Ð × ÕÙ Ð Ö Ó Ý ×Ù ÓÖÖ ÓÒ ×
498                                Cap´        ´
                                      ıtulo 6. Arboles de b´ squeda equilibrados
                                                           u

                T                                                    T
                x                                                    y
                2                                                    0
                          y                                x
                          1                                0
            α
                                                                          χ
       h
                     β                                α         β              h+1

                               χ                  h
                                    h+1


                                         =⇒
                    ´µ                                         ´ µ


                    ÙÖ º ÈÖ Ñ Ö ×Ó          Ò× Ö ÓÒ Ò ÙÒ Ö ÓÐ ÎÄ

Ú Ò Ù Ð ÕÙ Ð × ¬ ÙÖ × º ´ µ Ý º ´ µ Ö ­        × Ò ÙÒ ×Ô Óº
     ÄÓ× Ú ÐÓÖ × ÐÓ× ØÓÖ × Ô ÖÑ Ø Ò ÒØ ¬ Ö Ð × ØÙ ÓÒ          × ÕÙ Ð Ö Ó ÑÓ×ØÖ Ò
Ð ¬ ÙÖ º ´ µº         Ó ÙÒ ÒÓ Ó x ÓÒ ÙÒ × ÕÙ Ð Ö Ó¸ ÔÓ ÑÓ× Ö Ø Ö Þ Ö Ð × × Ù ÒØ ×
× ØÙ ÓÒ × Ý ×Ù× ÓÖÖ ×ÔÓÒ ÒØ × ÓÒ ×
    ½º Ë DIFF(x) == 2 and DIFF(y) == 1 =⇒ ×          ØÙ ÙÒ ÖÓØ ÓÒ × ÑÔÐ              Ð
         ÞÕÙ Ö º
    ¾º Ë DIFF(x) == -2 and DIFF(y) == -1 =⇒ ×          ØÙ ÙÒ ÖÓØ ÓÒ × ÑÔÐ            Ð
           Ö º
     ÄÓ× Ñ ØÓ Ó× rotateLeft() Ý rotateRight() ÖÓØ Ò Ð ÒÓ Ó p            Ð ÞÕÙ Ö Ý
   Ö        Ö ×Ô Ø Ú Ñ ÒØ º ÄÓ× Ñ ØÓ Ó×    Ò ØÙ Ð Þ Ö ÐÓ× ØÓÖ ×        ÕÙ Ð Ö Ó ÐÓ×
ÒÓ Ó× ÒÚÓÐÙ Ö Ó׺ Ð Ö ×Ô ØÓ¸ Ü ×Ø ÙÒ ×Ó ÕÙ ×ÓÐÓ Ó ÙÖÖ ÙÖ ÒØ Ð Ð Ñ Ò ÓÒ¸
 Ú ÐÙ Ó Ò Ð if Ý ÕÙ ÜÔÐ Ö ÑÓ× ÔÓר Ö ÓÖÑ ÒØ º             ÐÓ ÓÒØÖ Ö Ó¸ ÐÓ× ØÓÖ ×
   Ð Ò × ÓÐÓ Ò Ò ÖÓº × ÔÓ× Ð               Ù Ö ÐÓ× Ñ Ó× Ò ÐÓ× ØÓÖ × Ý Ùר ÖÐÓ×
  ØÖ Ú × ÓÔ Ö ÓÒ × Ö ØÑ Ø × ÑÔ ÖÓ¸ × Ö ÕÙ Ö Ò Ú Ö Ó× if Ô Ö                 ÖÐÓº ÈÓÖ ÐÓ
Ø ÒØÓ¸ × Ñ × × ÑÔÐ         Ö Ò Ö ÐÓ× ×Ó× Ý × Ò Ö ÐÓ× ØÓÖ × Ö Ø Ñ ÒØ º
       Ð × ÙÒ Ó ×Ó Ú ÓÐ ÓÒ Ð ÓÒ ÓÒ ÎÄ × ÐÙ×ØÖ Ò Ð ¬ ÙÖ º ´ µº Ð
 Ö ÓÐ ÎÄ T ×Ù Ö ÙÒ × ÕÙ Ð Ö Ó ÔÓÖ Ð Ö             Ò Ð ÒÓ Ó x¸ Ù× Ó ÔÓÖ ÙÒ ÙÑ ÒØÓ
     ÐØÙÖ Ð ÒÓ Ó z ÕÙ ×Ø Ô Ö Ø Ñ ÒØ ÕÙ Ð Ö Óº Ä Ò× Ö ÓÒ ÔÙ Ó ÙÖÖ Ö ÔÓÖ
 Ù ÐÕÙ Ö ÐÓ× Ð Ó× zº
       Ð × ÕÙ Ð Ö Ó × ÓÖÖ Ñ ÒØ Ó× ÖÓØ ÓÒ × ×Ù × Ú × Ð ÒÓ Ó zº ÈÖ Ñ ÖÓ¸
 Ð ÒÓ Ó z × ÖÓØ           Ð Ö ¸ ÐÙ Ó          Ð ÞÕÙ Ö º Ä ÓÖÖ ÓÒ × ÐÙ×ØÖ Ò
Ð ¬ ÙÖ º ´ µº ÒØ × Ý ×ÔÙ × Ð ÓÖÖ ÓÒ¸ Ð ÐØÙÖ ÐÓ Ð Ð Ö Óи h + 2¸ ×
Ð Ñ ×Ñ º ÓÒ× Ù ÒØ Ñ ÒØ ¸ × Ð × Ò Ò                  T × Îĸ ÒØÓÒ ×¸        ×ÔÙ × Ð
 Ò× Ö ÓÒ Ý ÔÓר Ö ÓÖ ÓÖÖ ÓÒ¸ Ð × Ò Ò Ø Ñ Ò × Îĺ
       Ð ×Ó ÐÙ×ØÖ Ó Ò Ð × ¬ ÙÖ × º ´ µ Ý º ´ µ Ø Ò ×Ù ÓÖÖ ×ÔÓÒ ÒØ × Ñ ØÖ Ó ÔÓÖ
Ð ÞÕÙ Ö ¸ Ð Ù Ð × ÕÙ Ú Ð ÒØ Ö ­ Ö Ð × ¬ ÙÖ × Ò ÙÒ ×Ô Óº
     Ä        ÒØ ¬ ÓÒ Ð × ØÙ ÓÒ           × ÕÙ Ð Ö Ó Ð ¬ ÙÖ º ´ µ¸ ÙÒØÓ ÓÒ ×Ù
 ÓÖÖ ÓÒ¸ × Ö Ø Ö Þ Ð × Ù ÒØ Ñ Ò Ö
´
6.4. Arboles AVL                                                                   499

           T
           x
           2
                                                                   T
                              y                                    z
                              −1                                   0
      α
                   z                                      x                    y
h                  −1                                     0                    1
                                   δ
                          χ            h                                χ
                                                      α       β                    δ
               β h−1                                              h−1
                                                  h

                                           =⇒
                   ´µ                                             ´ µ


                        ÙÖ º Ë ÙÒ Ó ×Ó          Ò× Ö ÓÒ Ò ÙÒ Ö ÓÐ ÎÄ

   ½º Ë DIFF(x) == 2 and DIFF(y) == -1 =⇒ ÔÖ Ñ ÖÓ × ÖÓØ Ð ÒÓ Ó z      Ð Ö
      Ý ÐÙ Ó      Ð ÞÕÙ Ö º
   ¾º Ë DIFF(x) == -2 and DIFF(y) == 1 =⇒ ÔÖ Ñ ÖÓ × ÖÓØ Ð ÒÓ Ó z              Ð
       ÞÕÙ Ö Ý ÐÙ Ó       Ð Ö º
    ÄÓ× Ñ ØÓ Ó× doubleRotateLeft() Ý doubleRotateRight() Ö Ð Þ Ò Ð × Ó Ð × ÖÓØ ¹
  ÓÒ × Ð ÞÕÙ Ö Ý Ö ¸ Ö ×Ô Ø Ú Ñ ÒØ º
    ÄÓ× ×Ó× ÔÖ × ÒØ Ó× Ò Ð × ¬ ÙÖ × º ´ µ Ý º ´ µ¸ ÙÒØÓ ÓÒ ×Ù× ÕÙ Ú Ð ÒØ ×
× Ñ ØÖ Ó׸ Ö Ø Ö Þ Ò × ØÙ ÓÒ × Ú ÓÐ ÓÒ Ð ÓÒ ÓÒ ÎÄ ÕÙ Ó ÙÖÖ Ò ÙÖ ÒØ
Ð Ò× Ö ÓÒº Ð × ¬ Ö ÑÓ× Ð × ÓÒ × ÓÖÖ ÓÒ Ò Ð × Ù ÒØ Ö Ò Ó
 Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Avl Tree<Key>        +≡      ´    µ
     enum Rotation_Type
     { ROTATE_LEFT, ROTATE_RIGHT, DOUBLE_ROTATE_LEFT, DOUBLE_ROTATE_RIGHT };
        ר Ø ÔÓ Ú ÐÓÖ × ÚÙ ÐØÓ ÔÓÖ ÙÒ ÖÙØ Ò ÕÙ Ü Ñ Ò ÙÒ ÒÓ Ó × ÕÙ Ð Ö Ó Ý
     Ø ÖÑ Ò ¸ Ò ÙÒ ÓÒ Ð Ø ÔÓ     × ÕÙ Ð Ö Ó¸ Ù Ð Ð × ÖÓØ ÓÒ    × Ö ÔÐ
    Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Avl Tree<Key>       +≡      ´ µ     ¼¼
     static Rotation_Type rotation_type(Node * p)
     {
       Node * pc; // guarda hijo de p
       if (DIFF(p) == 2) // hacia la izquierda
         {
           pc = RLINK(p);
           if (DIFF(pc) == 1 or DIFF(pc) == 0)
             return ROTATE_LEFT;
           return DOUBLE_ROTATE_LEFT;
         }
       pc = LLINK(p);
       if (DIFF(pc) == -1 or DIFF(pc) == 0)
         return ROTATE_RIGHT;
       return DOUBLE_ROTATE_RIGHT;
     }
500                                    Cap´        ´
                                               ıtulo 6. Arboles de b´ squeda equilibrados
                                                                    u



       ¬Ò ×
       rotation type¸   Ù×   Ò ÙÒ   ¼¼ º
     rotation type()    × ÐÐ Ñ ÔÓÖ ÙÒ ÙÒ ÓÒ Ù×Ó Ò Ö Ð ÕÙ Ö ×Ø ÙÖ Ð ÓÒ ÓÒ
       Îĺ ËÙ ×ØÖÙ ØÙÖ Ò Ö Ð ÓÖÖ ×ÔÓÒ       Ú Ö ¬ Ö ÐÓ× Ù ØÖÓ Ø ÔÓ× ÖÓØ ÓÒ Ò
      ÙÒ ÓÒ Ð ÒÓ Ó Ú ÓÐ ØÓÖ Ó Ð ÓÒ ÓÒ ÎÄ Ý Ð ØÓÖ ×Ù Óº ÆÓØ ÑÓ× ÕÙ
     rotation type()      ØÙ ÙÒ Ú Ö ¬ ÓÒ      ÓÒ Ð¸ DIFF(pc) == 0¸ ÓÖÖ ×ÔÓÒ ÒØ
     ÓØÖÓ ×Ó ÕÙ ×ÓÐÓ × ÔÖ × ÒØ Ò Ð Ð Ñ Ò ÓÒ Ý ÕÙ ÜÔÐ Ö ÑÓ× ÔÓר Ö ÓÖÑ ÒØ º
         ÄÓ ÒØ Ö ÓÖ ÔÖÓÔÓÖ ÓÒ ØÓ Ð ÙØ Ð Ö Ö ÕÙ Ö Ô Ö Ö ×Ø ÙÖ Ö Ð ÓÒ ÓÒ ÎÄ Ò
      Ù ÐÕÙ Ö ÐÓ× ×Ó× Ò× Ö ÓÒ
¼¼    Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Avl Tree<Key>      +≡       ´   µ       ¼¼
       static Node * restore_avl(Node * p, Node * pp)
       {
         Node ** link = LLINK(pp) == p ? &LLINK(pp) : &RLINK(pp);
         switch (rotation_type(p))
           {
           case ROTATE_LEFT:         return *link = rotateLeft(p);
           case ROTATE_RIGHT:        return *link = rotateRight(p);
           case DOUBLE_ROTATE_LEFT: return *link = doubleRotateLeft(p);
           case DOUBLE_ROTATE_RIGHT: return *link = doubleRotateRight(p);
           }
         return NULL;
       }
       ¬Ò ×
       restore avl¸ Ù×   Ò ÙÒ × ¼½ Ò ¼ º
     Í× × doubleRotateLeft¸ doubleRotateRight¸ rotateLeft¸ rotateRight¸   Ò   rotation type   º
       Ð Ñ ØÓ Ó restore avl() ØÓÑ Ó× ÒÓ Ó× ÓÑÓ Ô Ö Ñ ØÖÓ׺ Ð ÔÖ Ñ ÖÓ¸ p¸ × Ð ÒÓ Ó ÕÙ
     ×Ù Ö Ð × ÕÙ Ð Ö Ó Ð × ÙÒ Ó¸ pp¸ × Ð Ô Ö pº Ò ÙÒ ÓÒ Ð Ø ÔÓ             × ÕÙ Ð Ö Ó
       Ø ÖÑ Ò Ó ÔÓÖ rotation type()¸ restore avl() ÑÔÖ Ò Ð × ÓÒ × Ò × Ö × Ô Ö
     Ö ×Ø ÙÖ Ö Ð ÓÒ ÓÒ Îĺ
         À ר Ð ÔÖ × ÒØ ¸ ÑÓ× × ÖÖÓÐÐ Ó ÙÒ × Ö      ÖÙØ Ò × Ò Ö × ÓÖÖ Ö ÙÒ
     Ú ÓÐ ÓÒ Ð ÓÒ ÓÒ ÎÄ Ò ÙÒ ÒÓ Óº ÆÓ× Ö ×Ø Ø ÖÑ Ò Ö Ù Ð × Ð ÒÓ Ó ÕÙ ×Ù Ö
      Ð × ÕÙ Ð Ö Óº È Ö Ð Ò× Ö ÓÒ¸ ר ÓÒ Ñ ÑÓÖ Þ Ö Ð ÙÐØ ÑÓ ÒÓ Ó × ÕÙ Ð Ö Ó
      Ò Ð Ñ ÒÓ        Ù×ÕÙ ¸ ÔÙ × ×Ø × Ð ÙÒ Ó ×Ù× ÔØ Ð         ×Ù Ö Ö ÙÒ × ÕÙ Ð Ö Óº
     Í      Ó ×Ø ÒÓ Ó¸ × ØÙ Ð Þ ×Ù ØÓÖ Ý × Ú Ö ¬ × × Ö ÕÙ Ö ÑÔÖ Ò Ö ÓÒ ×
      ÓÖÖ Ø Ú × ÓÒ Ð Ñ ØÓ Ó restore avl()º
           ÓÖ ×ÓÐÓ ÒÓ× Ö ×Ø ÙÒ ÖÙØ Ò ÕÙ Ù×ÕÙ ÒØÖÓ Ð Ô Ð Ð ÒÓ Ó × ÕÙ Ð Ö Ó¸
       ØÙ Ð Ð ØÓÖ Ý¸ Ú ÒØÙ ÐÑ ÒØ ¸ ØÙ Ð ÓÖÖ ÓÒ
¼¼    Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Avl Tree<Key>        +≡      ´   µ ¼¼ ¼¿
       void restore_avl_after_insertion(const Key & key)
       {
         Node *pp = avl_stack.pop(); // padre del nodo insertado
              Ùר Ö     ØÓÖ Ð Ô Ö     Ð ÒÓ Ó Ò× ÖØ Ó ¼½
           if (avl_stack_empty())
             return; // pp es ra´z
                                ı
           Node *gpp; // padre de pp
              ØÙ Ð Þ Ö Ò ×ØÖÓ×      ÔÔ ¼½
           clean_avl_stack();
       }
       ¬Ò ×
´
     6.4. Arboles AVL                                                                            501



       restore avl after insertion¸ Ù×     Ò ÙÒ      º
     Í× × avl stack    ¸ avl stack empty     ¸ Ò   clean avl stack       º
       Ð ÐÓÕÙ     Ùר Ö ØÓÖ Ð Ô Ö Ð ÒÓ Ó Ò× ÖØ Ó                        ¼½   ÜØÖ      Ð ÔÖ Ñ Ö ÒÓ Ó Ò
     Ð Ô Ð ¸ ØÙ Ð Þ ×Ù ØÓÖ Ý Ú Ö ¬ × ×Ø ÒÓ × Ð Ö Þ
¼½      Ùר Ö ØÓÖ Ð Ô Ö Ð ÒÓ Ó Ò× ÖØ Ó ¼½ ≡                                        ´ ¼¼ µ
       if (key > KEY(pp)) // ajuste el factor del padre del nodo insertado
         DIFF(pp)++;
       else
         DIFF(pp)--;
       if (DIFF(pp) == 0)
         {    // en este caso, altura del ascendiente de pp no aumenta
           clean_avl_stack();
           return;
         }
     Í× × clean avl stack    º
            ØÙ Ð Þ Ö Ò ×ØÖÓ× ÔÔ ¼½ Ö Ú ×        Ò ×ØÖÓ gpp pp Ý ØÙ Ð Þ ×Ù ØÓÖº
     Ë Ð ØÓÖ Ð ÙÒ gpp × ÖÓ¸ ÒØÓÒ × Ð ÐØÙÖ gpp Ô ÖÑ Ò              ٠Рݸ ÔÙ ×ØÓ ÕÙ
     Ð × Ò Ò           gpp × Îĸ Ð Ö ×ØÓ Ð Ö ÓÐ × ÎÄ Ý Ð Ð ÓÖ ØÑÓ Ø ÖÑ Ò º        Ò
       ×Ó ÓÒØÖ Ö Ó¸ × Ö Ú × × Ý ÙÒ Ú ÓÐ ÓÒ Ð ÓÒ ÓÒ Îĸ Ð Ù Ð × ÓÖÖ º Ò
      ר ÙÐØ ÑÓ ×Ó Ð Ð ÓÖ ØÑÓ Ø Ñ Ò Ø ÖÑ Ò ¸ ÔÙ × × ÑÓ× ÕÙ Ò Ð Ò× Ö ÓÒ Ð Ö ÓÐ
      ÓÑÔÐ ØÓ × ÎÄ ÐÙ Ó        ØÙ Ö Ð ÔÖ Ñ Ö ÓÖÖ ÓÒ
¼½      ØÙ Ð Þ Ö Ò ×ØÖÓ× ÔÔ ¼½ ≡                               ´ ¼¼ µ
       do       // buscar nodo con factor igual a 0
         {
             gpp = avl_stack.pop();
                 // actualizar factores de equilibrio
             if (key > KEY(gpp))
               DIFF(gpp)++;
             else
               DIFF(gpp)--;
             if (DIFF(gpp) == 0)
               break; // no se necesita reajuste
             else if (DIFF(gpp) == -2 or DIFF(gpp) == 2) // ¿se viola condici´n AVL?
                                                                             o
               {      // se requiere reajuste
                 Node *ggpp = avl_stack.pop();
                 restore_avl(gpp, ggpp);
                 break;
               }
         }
       while (not avl_stack_empty());
     Í× × avl stack    ¸ avl stack empty     ¸ Ò   restore avl   ¼¼ º

     6.4.1.2    Eliminaci´n en un arbol AVL
                         o        ´

       רÖÙ ØÙÖ ÐÑ ÒØ ¸ Ð Ð Ñ Ò ÓÒ × Ú Ò ØÖ × Ô ×Ó× ´½µ Ù× Ö Ð ÒÓ Ó Ð Ñ Ò Ö¸
     ´¾µ Ð Ñ Ò ÖÐÓ Ý ´¿µ Ö Ú × Ö Ð ÓÒ ÓÒ ÎÄ Ý Ú ÒØÙ ÐÑ ÒØ Ö ×Ø ÙÖ ÖÐ º Ò × × ÒØ Ó¸
      Ð ÔÖÓ Ñ ÒØÓ × ÔÐ ÒØ          Ð × Ù ÒØ ÑÓ Ó
¼½    Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Avl Tree<Key>         +≡         ´    µ
       Node * remove(const Key & key)
502                                 Cap´        ´
                                            ıtulo 6. Arboles de b´ squeda equilibrados
                                                                 u



       {
           if (root == Node::NullPtr)
             return NULL;
           Node * p = search_and_stack_avl(key);
           if (no_equals<Key, Compare> (KEY(p), key))
             {     // clave no fue encontrada
               clean_avl_stack();
               return NULL;
             }
             Ð Ñ Ò ÓÒ ×        Ô ¼¾
           restore_avl_after_deletion(removed_key);
           return p;
       }
     Í× × clean avl stack   ¸ restore avl after deletion ¼ ¸ Ò   search and stack avl   º

     Eliminaci´n f´
              o ısica del nodo
            Ð Ñ Ò ÓÒ ×          Ô  ×¼¾    ÙÒ Ñ ÒØ Ò Ð ×ÕÙ Ñ ÐØ ÖÒ Ø ÚÓ Ð Ñ Ò ÓÒ
      ÜÔÐ Ó Ò Ü º º ¹½ ´Ô Ò ¿ ¾µ¸        Р٠и Ö ÓÖ ÑÓ׸ ÓÒ× ×Ø Ò Ö ÒØ Þ Ö ÕÙ Ð ÒÓ Ó
         Ð Ñ Ò Ö × Ò ÓÑÔÐ ØÓ ݸ Ò Ð       ×Ó ÕÙ × ÓÑÔÐ ØÓ¸ ÒØÓÒ × ×Ùר ØÙ ÖÐÓ ÔÓÖ Ð
     ×Ù ×ÓÖ Ó Ð ÔÖ    ×ÓÖº Ò ÒÙ ×ØÖÓ      ×Ó¸ ÓÔØ ÑÓ× ÔÓÖ Ð ×Ù ×ÓÖ Ý ÔÐ ÒØ ÑÓ× Ð × Ù ÒØ
      Ð ÓÖ ØÑÓ
¼¾      Ð Ñ Ò ÓÒ ×       Ô ¼¾ ≡                                              ´ ¼½ µ
       Key removed_key = KEY(p);
       Node * pp = avl_stack.top(1); // obtener padre de p
       while (true)
         {
            if (LLINK(p) == Node::NullPtr) // ¿incompleto por la izquierda?
              {      // S´, ate a pp el hijo de p
                          ı
                if (LLINK(pp) == p)
                  LLINK(pp) = RLINK(p);
                else
                  RLINK(pp) = RLINK(p);
                break;
              }
            if (RLINK(p) == Node::NullPtr) // ¿incompleto por la izquierda?
              {     // S´, ate a pp el hijo de p
                        ı
                if (LLINK(pp) == p)
                  LLINK(pp) = LLINK(p);
                else
                  RLINK(pp) = LLINK(p);
                break;
              }
                // en este punto, p es un nodo completo ==> intercambiar por sucesor
            Node * succ = swapWithSuccessor(p, pp);
            removed_key = KEY(succ);
         }
        if (pp == head_ptr) // verifique si se elimin´ la ra´z
                                                      o      ı
          {      // factores quedan inalterados y no se viola condici´n AVL
                                                                     o
             clean_avl_stack();
             return p;
´
     6.4. Arboles AVL                                                             503



          }
     Í× × avl stack   Ò   clean avl stack   º
     Ë Ó ÙÖÖ ÙÒ ÒØ Ö Ñ Ó Ð ÒÓ Ó Ð Ñ Ò Ö ÓÒ ×Ù ×Ù ×ÓÖ Ò¬ Ó¸ ÒØÓÒ × Ð ÒÓ Ó
      Ð Ñ Ò Ó ÒÓ × ÖÚ Ô Ö ØÙ Ð Þ Ö Ð ØÓÖ Ð ÒÓ Ó ×Ù ×ÓÖ¸ ÔÙ × Ü ×Ø ÙÒ Ú ÓÐ ÓÒ
     Ø ÑÔÓÖ Ð Ð ÔÖÓÔ          ÓÖ Ò ÙÒ         º ÈÓÖ ×Ø Ö ÞÓÒ¸ Ð Ú Ö Ð removed key
      ÐÑ Ò Ð Ð Ú × ÙÒ Ð Ù Ð × ØÙ Ð Þ Ö Ò ÐÓ× ØÓÖ × Ò Ð Ñ ÒÓ            Ù×ÕÙ º
          ÓÑÓ ×Ù ÒÓÑ Ö ÐÓ ÜÔÖ × ¸ Ð ÖÙØ Ò swapNodeWithSuccessor() ÒØ Ö Ñ p ÓÒ
     ×Ù ×Ù ×ÓÖ Ò¬ Óº Ð Ü Ô ÓÒ ÐÓ× ×Ô ØÓ× Ô ÖØ Ò ÒØ × ÐÓ× Ö ÓÐ × Îĸ Ð × Ù ÒØ
      ÑÔÐ ÒØ ÓÒ × ×ØÖÙ ØÙÖ ÐÑ ÒØ ÒØ Ô Ö Ð Ð Ñ Ò ÓÒ Ò ØÓ Ð ×                Ö ÓÐ ¹
     Ò ÖÓ     Ù×ÕÙ ÕÙ ×Ù Ý Þ Ò Ð ÒØ Ö Ñ Ó Ð ÒÓ Ó Ð Ñ Ò Ó ÓÒ ×Ù ×Ù ×ÓÖ ´Ó
     ÔÖ ×ÓÖµ Ò¬ Ó
¼¿    Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Avl Tree<Key>       +≡       ´   µ ¼¼ ¼
       Node* swapWithSuccessor(Node * p, Node *& pp)
       {     // Referencia al tope de la pila, pues p ser´ intercambiado con el
                                                         a
             // sucesor y la posici´n en la pila la ocupar´ el sucesor de p
                                   o                       a
         Node *& ref_to_stack_top = avl_stack.top();
             // encuentre el sucesor a la vez que actualiza la pila
         Node *fSucc = p;        // padre del sucesor
         Node *succ = RLINK(p); // b´squeda comienza desde RLINK(p)
                                     u
         avl_stack.push(succ);
         while (LLINK(succ) != Node::NullPtr) // descienda hasta el m´s a la izquierda
                                                                     a
           {
             fSucc = succ;
             succ = LLINK(succ);
             avl_stack.push(succ);
           }
             // actualice antigua entrada de pila ocupada por p. Equivalente a
             // intercambiar antiguo tope (antes de buscar sucesor) con el actual
         ref_to_stack_top = succ;
         avl_stack.top() = p;
         if (LLINK(pp) == p)             // actualice el nuevo hijo de pp (sucesor)
           LLINK(pp) = succ;
         else
           RLINK(pp) = succ;
         LLINK(succ) = LLINK(p);         // intercambie las ramas izquierdas
         LLINK(p)    = Node::NullPtr;
         if (RLINK(p) == succ)           // actualice ramas derechas
           {     // sucesor es exactamente el hijo derecho de p
             RLINK(p)    = RLINK(succ);
             RLINK(succ) = p;
             pp          = succ;
           }
         else
           {     // sucesor es el descendiente m´s a la izquierda de RLINK(p)
                                                a
             Node *succr = RLINK(succ);
             RLINK(succ) = RLINK(p);
             LLINK(fSucc) = p;
             RLINK(p)     = succr;
             pp           = fSucc;
           }
504                                                     Cap´        ´
                                                           ıtulo 6. Arboles de b´ squeda equilibrados
                                                                                u



        DIFF(succ) = DIFF(p);                             // intercambie factores de equilibrio
        return succ;
    }
Í× × avl stack            º

Restauraci´n de la condici´n AVL
          o               o
              T
              x
              2
                                                                                                   y
                                           y                                                       0
                                                                                 T
                                           1
                                                                                 x
                                                                                 0
                  α
            h+1                    β                                                                       χ
                          h
                                                χ
                                                                             α           β                     h+1
                                                        h+1
                                                                     h


                                                              =⇒
                                  ´µ                                                 ´ µ

                              ÙÖ º½¼ ÈÖ Ñ Ö ×Ó                 Ð Ñ Ò ÓÒ Ò ÙÒ Ö ÓÐ ÎÄ

    Ä ¬ ÙÖ º½¼´ µ ÐÙ×ØÖ Ð ÔÖ Ñ Ö ×Ó     × ÕÙ Ð Ö Ó Ù×                                    Ó ÔÓÖ ÙÒ Ð Ñ Ò ÓÒº
Ä ¬ ÙÖ ×ÙÔÓÒ ÙÒ Ð Ñ Ò ÓÒ Ò Ð Ö Ñ α ÕÙ Ð Ù× ÙÒ                                            ÔÖ          ÐØÙÖ º Ä
× ØÙ ÓÒ × ÒØ       Ð ¬ ÙÖ º ´ µ Ý ×Ù ÓÖÖ ÓÒ × Ñ Ð Ö ×                                      Ö¸ ÙÒ ÖÓØ ÓÒ
Ð ÞÕÙ Ö ÙÝÓ Ö ×ÙÐØ Ó¸ ÒØ Ó Ð ¬ ÙÖ º ´ µ¸ × ÔÖ × ÒØ                                        Ò Ð ¬ ÙÖ º½¼´ µº
             T
             x
             2
                                                                                              T
                                           y                                                  z
                                           −1                                                 0
        α                     z                                                  x                             y
h                             −                                                  −                             −
                                                    δ
                                                          h              α
                                                                                                                   δ
                      β                χ                           h−1               β                 χ
                                                                                                                       h

                                                              =⇒
                          ´µ                                                                 ´ µ


                              ÙÖ º½½ Ë ÙÒ Ó ×Ó                  Ð Ñ Ò ÓÒ Ò ÙÒ Ö ÓÐ ÎÄ
     Ó Ð ÒÓ Ó Ò Ð Ù Ð Ó ÙÖÖ Ð Ú ÓÐ ÓÒ¸ Ð ÒØ ¬ ÓÒ Ð ÔÖ Ñ Ö ×Ó × ÒØ
  Ð   Ð Ò× Ö ÓÒ × Ö¸ ØÓÖ × ÓÒ Ð Ñ ×ÑÓ × ÒÓ Ý ÙÒ ÙÒ                 ÖÒ º
È Ö ×Ø ×Ó¸ ÒØÓÒ ×¸ ÔÓ ÑÓ× Ö ÙØ Ð Þ Ö Ð ÖÙØ Ò rotation type()º Ë Ò Ñ Ö Ó¸
´
6.4. Arboles AVL                                                                505



       ÖÒ        Ð Ò× Ö ÓÒ¸ Ð Ö ÓÐ T ×Ù Ö ÙÒ Ô Ö         ÒÖÐ     ÐØÙÖ º Ò ØÓ¸
 ÒØ × Ð Ð Ñ Ò ÓÒ¸ Ð Ö ÓÐ T Ø Ò ÐØÙÖ Ò Ö Ð h + 3¸ Ñ ÒØÖ × ÕÙ ×ÔÙ ×
 Ð Ñ Ò Ö Ð ÐØÙÖ Ò Ö Ð × h + 2º ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð × Ò Ò               T ÔÙ     ×Ù Ö Ö
ÙÒ × ÕÙ Ð Ö Ó Ú ÓÐ ØÓÖ Ó Ð ÓÒ ÓÒ Îĺ
     Ä ¬ ÙÖ º½½´ µ ÑÙ ×ØÖ Ð × ÙÒ Ó ×Ó Ð Ñ Ò ÓÒ Ò ÙÒ Îĸ Ð Ù Ð Ø Ñ Ò
 × × Ñ Ð Ö Ð × ÙÒ Ó ×Ó Ð Ò× Ö ÓÒ ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ º ´ µº Ò Ð ¬ ÙÖ º½½´ µ¸
Ð Ö Ñ α ×Ù Ö ÙÒ Ô Ö           ÐØÙÖ          ÙÒ Ð Ñ Ò ÓÒ Ó ÙÒ Ùר          ÕÙ Ð Ö Óº
       ÖÒ        Ð ¬ ÙÖ º ´ µ¸ Ð ÒÓ Ó z ÔÙ     ר Ö Ô Ö Ø Ñ ÒØ ÕÙ Ð Ö Ó Ó ×Ù Ö Ö
ÙÒ Ð ÖÓ Ý ÒÓ Ú ÓÐ ØÓÖ Ó × ÕÙ Ð Ö Óº Ò ØÓ Ó ×Ó¸ Ð ÐØÙÖ z × h + 1º Ä ÓÖÖ ÓÒ
× ÔÖ × ÒØ Ò Ð ¬ ÙÖ º½½´ µ¸ ÕÙ × Ð Ñ ×Ñ ÕÙ Ô Ö Ð Ò× Ö ÓÒ ÔÖ × ÒØ                ÒÐ
¬ ÙÖ º ´ µ ÙÒ ÖÓØ ÓÒ Ó Ð ¸ ÖÙÞ ¸ Ð ÒÓ Ó z                Ð Ö       Ý ÐÙ Ó         Ð
 ÞÕÙ Ö º
     Ë Ñ Ð Ö Ð ÔÖ Ñ Ö ×Ó¸ Ð × ÙÒ Ó Ø Ñ Ò Ö Ù Ð ÐØÙÖ Ò Ö Ð Ð Ö ÓÐ T h + 3
  h + 2º ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ø Ñ Ò × Ò × Ö Ó Ö Ú × Ö Ð × Ò Ò             T Ò Ù×ÕÙ
    Ú ÓÐ ÓÒ × Ð ÓÒ ÓÒ ÎÄ Ù× × ÔÓÖ Ð Ùר º                     Ó ÙÒ ÒÓ Ó Ú ÓÐ ØÓÖ Ó
    Ð ÓÒ ÓÒ Îĸ Ð × ÙÒ Ó ×Ó × ÙÒ ÚÓ Ñ ÒØ ÒØ ¬ Ð ÐÓ× × ÒÓ× Ð ÒÓ Ó
Ú ÓÐ ØÓÖ Ó Ý ×Ù Ó ×ÓÒ ÒÚ Ö×Ó׺ ÈÙ ×ØÓ ÕÙ ×Ø × Ð Ñ ×Ñ × ØÙ ÓÒ ÕÙ ÓÒ Ð × ÙÒ Ó
   ×Ó Ú ÓÐ ÓÒ Ò Ð Ò× Ö ÓÒ¸ Ø Ñ Ò ÔÓ ÑÓ× Ö ÙØ Ð Þ Ö Ð ÖÙØ Ò rotation type()º
      Ð Ø Ö Ö Ý ÙÐØ ÑÓ ×Ó Ú ÓÐ ÓÒ Ù× Ó ÔÓÖ ÙÒ Ð Ñ Ò ÓÒ × ÐÙ×ØÖ Ò Ð
¬ ÙÖ º½¾´ µº ÕÙ Ð Ö Ñ α Ô Ö ÐØÙÖ                  Ó ÙÒ Ð Ñ Ò ÓÒ Ó ÙÒ Ùר
ÔÖ Ú Óº ר ×Ó Ý ×Ù ×ÓÐÙ ÓÒ ×ÓÒ Ô Ö Ó× Ð ÔÖ Ñ Ö ×Ó ÐÙ×ØÖ Ó Ò Ð × ¬ ÙÖ × º½¼´ µ
Ý º½¼´ µ¸ Ö ×Ô Ø Ú Ñ ÒØ º Ä      Ö Ò ×ØÖ Ò ÕÙ Ð ÒÓ Ó y ר ÕÙ Ð Ö Óº ר
   ×Ó Ø Ñ Ò × ÙÒ ÚÓ Ñ ÒØ ÒØ ¬ Ð Ð Ó Ð ÒÓ Ó Ú ÓÐ ØÓÖ Ó ×Ø ÕÙ Ð Ö Ó Ý
 Ù ÓÒ× Ö ¸ Ô ÖÓ ×Ø ÓÖ ÒÓ ÜÔÐ               ¸ Ò Ð × ÒÓ Ð ÖÙØ Ò rotation type()º
     Ä ÓÖÖ ÓÒ Ð Ø Ö Ö ×Ó ÓÒ× ×Ø Ò ÙÒ ÖÓØ ÓÒ × ÑÔÐ                  Ð ÞÕÙ Ö ÕÙ
 ÖÖÓ ÓÑÓ ×ÓÐÙ ÓÒ Ð × ØÙ ÓÒ × Ö Ø Ò Ð ¬ ÙÖ º½¾´ µº                   Ó ÕÙ y ר
 Ò ÐÑ ÒØ ÕÙ Ð Ö Ó¸ Ð ÐØÙÖ Ò Ö Ð T ÒÓ Ñ º ÈÓÖ ÐÓ Ø ÒØÓ¸ × Ð × Ò Ò
    T × Îĸ Ð Ö ÓÐ Ö ×ÙÐØ ÒØ       Ð ÓÖÖ ÓÒ Ø Ñ Ò ÐÓ × Ý Ð Ð Ñ Ò ÓÒ ÔÙ
 ÙÐÑ Ò Ö ÒØ רT ×Óº                                              T
                x                                                  y
                2                                                  −1
                          y                              x
                          0                              1
                                                                        χ
           α
      h                                              α                      h
                      β       χ                               β
                                                h
                                   h

                                        =⇒
                     ´µ                                      ´ µ


                    ÙÖ º½¾ Ì Ö Ö ×Ó       Ð Ñ Ò ÓÒ Ò ÙÒ Ö ÓÐ ÎÄ
     ÙÒÓ ÐÓ× ØÖ × ×Ó׸ Ø Ò ×Ù× ÕÙ Ú Ð ÒØ × × Ñ ØÖ Ó× ÐÑ ÒØ ÒØ ÖÔÖ Ø Ð ×
Ñ Ò Ò ÓÐÓ× Ö ­ Ó× Ò ÙÒ ×Ô Óº
   Ñ Ò Ö Ò Ö Ð¸ ×ÔÙ × Ð Ð Ñ Ò ÓÒ × ¸              ÑÓ× Ö ØÖÓ Ö Ò Ð Ñ ÒÓ
506                                     Cap´        ´
                                               ıtulo 6. Arboles de b´ squeda equilibrados
                                                                    u



         Ù×ÕÙ ¸ ØÙ Ð Þ Ö        ØÓÖ Ý Ö Ú × ÖÐÓ Ô Ö Ú Ö × Ü ×Ø Ð ÙÒ Ú ÓÐ ÓÒº Ë
    × Ò Ù ÒØÖ ÙÒ ØÓÖ ÕÙ Ö ÔÖ × ÒØ ÙÒ Ú ÓÐ ÓÒ¸ ÒØÓÒ ×           ÑÓ× ÓÖÖ ÖÐ × ÙÒ
    ÐÓ× ×Ó× ÔÖ × ÒØ Ó׺ Ë Ð ÓÖÖ ÓÒ ÓÖÖ ×ÔÓÒ Ð Ø Ö Ö ×Ó¸ ÒØÓÒ × Ð Ð ÓÖ ØÑÓ
    Ø ÖÑ Ò º ÐÓ ÓÒØÖ Ö Ó¸    ÑÓ× Ö Ô Ø Ö Ð ÔÖÓ Ñ ÒØÓ ×Ø Ò ÓÒØÖ Ö ÙÒ ØÓÖ ÕÙ
    ÒÓ Ö ÔÖ × ÒØ ÙÒ Ú ÓÐ ÓÒ Ó ×Ø Ò ÓÒØÖ ÖÒÓ× ÓÒ Ð Ö Þº ר ÓÒ Ù Ø × ÜÔÖ × Ò
    Ð × Ù ÒØ ÙÒ ÓÒ
¼    Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Avl Tree<Key>        +≡            ´  µ ¼¿
      void restore_avl_after_deletion(const Key & key)
      {
        Node * pp = avl_stack.top(1); // padre de p
        Node * ppp = avl_stack.popn(3); // elimina de pila p, su padre y su abuelo
        while (true)
          {    // actualice factores de equilibrio
            if (key >= KEY(pp))
              DIFF(pp)--;
            else
              DIFF(pp)++;
            if (DIFF(pp) == -2 or DIFF(pp) == 2) // verifique una violaci´n AVL
                                                                         o
              pp = restore_avl(pp, ppp);
            if (DIFF(pp) != 0 or pp == root)
              break; // altura global del arbol no ha cambiado ==> terminar
                                          ´
            pp = ppp; // avance al pr´ximo ascendiente
                                      o
            ppp = avl_stack.pop();
          }
          clean_avl_stack();
        }
      ¬Ò ×
      restore avl after deletion¸ Ù×    Ò   ÙÒ ¼½ º
    Í× × avl stack    ¸ clean avl stack      ¸ Ò restore avl ¼¼ º

    6.4.2    An´lisis de los ´rboles AVL
               a             a
     ÓÑ ÒÞ Ö ÑÓ× ÒÙ ×ØÖÓ Ò Ð × × ÔÓÖ Ð ÔÖ × ÒØ ÓÒ            Ð × Ù ÒØ ÔÖÓÔÓ× ÓÒ Ý × Ù× ÓÒ
      ×Ù× ÓÒ× Ù Ò ×
    Proposici´n 6.4 (Adelson Velsky - Landis, 1962 [1])
             o                                                      Ë   T   ÙÒ Ö ÓÐ ÎÄ ÓÒ n ÒÓ¹
     Ó׸ ÒØÓÒ ×
                     Ð (n + 1) ≤ h(T ) < 1.4404 Ð (n + 2) − 0.3277        ´ º½¼µ
    Demostraci´n Î Ö Ü º º¾º¾º
                o

        Ä ÑÓ×ØÖ ÓÒ × Ð Ó ¬ ÙÐØÓ× Ý × × ÖÖÓÐÐ Ö Ò Ø ÐÐ Ò Ð × × ÓÒ × ×Ù × ¹
     Ù ÒØ ׺ È ÖÓ ×Ù× ÓÒ× Ù Ò × Ô Ö Ð Ò Ð × × Ð × ÓÔ Ö ÓÒ × Ò× Ö ÓÒ Ý Ð Ñ ¹
    Ò ÓÒ ×ÓÒ ÑÙ Ó Ñ × Ú ÒØ ׺
        Ä ÔÖ Ñ Ö Ó × ÖÚ ÓÒ ÕÙ ÓÒÐÐ Ú Ð ÔÖÓÔÓ× ÓÒ º½¼ × ÕÙ Ð ÐØÙÖ Ñ Ü Ñ ÙÒ
     Ö ÓÐ ÎÄ × O(Ð n)º ÆÓ ÑÔÓÖØ Ù ÒØÓ Ö Þ Ð Ö Óи Ð ÙÑ ÒØÓ Ð ÐØÙÖ × ÑÔÖ
     × ÐÓ Ö ØÑ Óº
        Ê ×Ô ØÓ Ð Óר ÓÒר ÒØ Ø Ò ÑÓ׸ Ò Ð Ô ÓÖ ÐÓ× ×Ó׸ ÙÒ ÐØÙÖ ÙÒ 44± Ñ ÝÓÖ
    ÕÙ Ð      ÙÒ Ö ÓÐ Ô Ö Ø Ñ ÒØ ÕÙ Ð Ö Óº Ò Ð × × ØÙ ÓÒ × Ö ×Ø ÒØ ׸ Ð ÐØÙÖ ×
´
6.4. Arboles AVL                                                               507



Ñ ÒÓÖ Ý Ð Ø ÑÔÓ       Ù×ÕÙ      × Ñ ÓÖº ÓÖ Ò¸ ÕÙ Ø Ò ÓרÓ×Ó × ×Ø 44± Ë
Ö ÓÖ ÑÓ× ÐÓ× 1300 Ñ ÐÐÓÒ ×       ÒÓ× ÓÒ× Ö Ó× Ò Ò Ü º ¸ Ð ÒÓÑ Ö          Ò Ë ÙÒ¹
Ò Ò ÙÒ ÏÙ ÔÙ × Ö ÐÓ Ð Þ Ó Ò ÐÓ ×ÙÑÓ 1.44 Ð 1300000000 = 44 ÒØ ÒØÓ׸ 13
Ñ × ÕÙ ÓÒ ÙÒ Ö ÓÐ Ô Ö Ø Ñ ÒØ ÕÙ Ð Ö Ó Ý ×ØÓ ×ÓÐÓ × ×ÓÑÓ× ÑÙÝ × ÓÖØÙÒ Ó׺
    Ä ÓØ ÑÔÙ ×Ø ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ º½¼ Ø Ò Ö Ø Ñ ÒØ Ð Ù×ÕÙ º ÉÙ
    Ö       Ð Ò× Ö ÓÒ Ý Ð Ñ Ò ÓÒ Ä Ò× Ö ÓÒ Ö ÕÙ Ö ÙÒ Ù×ÕÙ ÕÙ ¸ ÔÓÖ Ð
ÔÖÓÔÓ× ÓÒ º½¼¸ × O(Ð n)º ÄÙ Ó¸ × Ö ØÖÓ           Ò Ð Ñ ÒÓ       Ù×ÕÙ Ô Ö Ú Ö¹
 ¬ Ö × Ý Ð ÙÒ × ÕÙ Ð Ö Ó¸ ÕÙ ÒÓ ØÓÑ Ñ × ØÖ × ÒÓ Ó׸ Ý ÕÙ ÐÓ                ¸ Ô٠׸
 ÓÒר ÒØ Ñ ÒØ ÓØ Óº Ë × Ò Ù ÒØÖ ÙÒ × ÕÙ Ð Ö Ó¸ ÒØÓÒ × ×Ø × ÓÖÖ Ò¸
  ÐÓ ×ÙÑÓ¸ Ó× ÖÓØ ÓÒ ×¸ Ð × Ù Ð × Ø Ñ Ò ×Ø Ò ÓÒר ÒØ Ñ ÒØ ÓØ ׺ ÈÓ ÑÓ×
 ÓÒ ÐÙ Ö¸ ÒØÓÒ ×¸ ÕÙ Ð Ò× Ö ÓÒ × O(Ð n) + O(1) + O(1) = O(Ð n)º
      Ð ÔÖ Ñ Ö Ô ×Ó Ð Ð Ñ Ò ÓÒ × ÙÒ Ù×ÕÙ ¸ Ð Ù Ð Ý ÓÒ ÐÙ ÑÓ× ÕÙ ØÓÑ
O(Ð n)º      ×Ô٠׸   ÑÓ× Ö ØÖÓ Ö Ò Ð Ñ ÒÓ          Ù×ÕÙ ¸ Ú Ö ¬ Ö × Ý × ÕÙ ¹
Ð Ö Ó Ý¸ × × Ð ×Ó¸ ÓÖÖ ÖÐÓº Ê ÓÖ ÑÓ× ÕÙ ÙÒ ÓÖÖ ÓÒ                × ÕÙ Ð Ö Ó ÔÙ
  Ù× Ö ÓØÖÓ × ÕÙ Ð Ö Ó Ò Ð × Ò Ò           Ð ÒÓ Ó ÓÖÖ Óº Ò Ð Ô ÓÖ ÐÓ× ×Ó׸
Ð ÔÖ Ñ Ö ÓÖÖ ÓÒ ÔÙ           Ù× Ö ÙÒ     Ò      ÓÖÖ ÓÒ × ×Ù × Ú × ÕÙ ÔÙ ÐÐ Ö
   ר Ð Ö Þº ÈÙ ×ØÓ ÕÙ Ð ÐØÙÖ × O(Ð n) Ð       Ò     ÓÖÖ ÓÒ × × ÐÓ ×ÙÑÓ O(Ð n)
× ×Ø ÐÐ × ×Ø Ð Ö Þº Ä Ð Ñ Ò ÓÒ ×¸ Ô٠׸ O(Ð n) + O(Ð n) = O(Ð n) Ñ ×
 ÓרÓ× ÕÙ Ð Ò× Ö ÓÒ Ô ÖÓ Ø Ñ Ò O(Ð n)º
      Ò ÓÒ ÐÙ× ÓÒ¸ ØÓ × Ð × ÓÔ Ö ÓÒ × ÙÒ Ö ÓÐ ÎÄ ×ÓÒ O(Ð n) Ô Ö Ð Ô ÓÖ ×Óº
Ë × Ö ÕÙ Ö Ò Ö ÒØ ×           × ÑÔ ÒÓ Ý × ×ÔÓÒ ÙÒ ÑÔÐ Ñ ÒØ ÓÒ¸ ÐÓ× Ö ÓÐ ×
  ÎÄ ×ÓÒ ÙÒ Ù Ò × Ó Ò º
6.4.2.1   ´
          Arboles de Fibonacci

È Ö ÑÓ×ØÖ Ö Ð ÔÖÓÔÓ× ÓÒ º½¼¸ × ÓÒÚ Ò ÒØ ×ØÙ Ö ÙÒ Ð × ×Ô                   Ð    Ö ÓÐ
  ÒÓÑ Ò Ó      ÓÒ º
Definici´n 6.5 (Arbol de Fibonacci) ÍÒ
       o       ´                             Ö ÓÐ      ÓÒ          ÓÖ Ò k¸ ÒÓÑ Ò Ó
Tk¸ ×  ¬Ò Ö ÙÖ× Ú Ñ ÒØ ÓÑÓ
                  ⎧
                  ⎪∅
                  ⎪
                  ⎨                                            ×   k=0
             Tk =
                  ⎪
                    ∅, 0, ∅                                    ×   k=1
                  ⎪
                  ⎩T ,
                       k−1  (k + 1) − 1, T   k−2 +   (k + 1)   ×   k≥2

  Ð ÙÐØ ÑÓ Ø ÖÑ ÒÓ¸ Tk−1, (k + 1) − 1, Tk−2 + (k + 1) ¸        ÒØ ÖÔÖ Ø Ö× Ù Ó× ¹
Ñ ÒØ º Ä Ö Ñ ÞÕÙ Ö ¸ Tk−1 × Ð Ö ÓÐ                ÓÒ        ÓÖ Ò k − 1º Ä Ö Þ Tk
 ר Ø ÕÙ Ø        ÓÒ (k + 1) − 1 ÓÒ          (i) × Ð i¹ × ÑÓ ÒÙÑ ÖÓ        ÓÒ º Ä
ÖÑ Ö            × Ð Ö ÓÐ     ÓÒ          ÓÖ Ò k − 2 Ô ÖÓ ÓÒ ØÓ Ó× ×Ù× ÒÓ Ó× ×ÙÑ Ó×
 Ò (k + 1)º
     Ä ¬ ÙÖ º½¿ ÑÙ ×ØÖ Ð Ö ÓÐ           ÓÒ Ô Ö k = 8º Ä Ö Ñ ÞÕÙ Ö × Ð Ö ÓÐ
T7º ×Ù Ú Þ¸ Ð Ö Ñ ÞÕÙ Ö         T7 × Ð Ö ÓÐ T6 ÕÙ Ò ×Ù Ú Þ Ø Ò         Ö Ñ ÞÕÙ Ö
   T5 Ý × ×Ù × Ú Ñ ÒØ º Ä Ö Ñ      Ö          Tk Ø Ò Ü Ø Ñ ÒØ Ð Ñ ×Ñ ÓÖÑ ÕÙ
Tk−1¸ Ô ÖÓ       ÒÓ Ó × Ò Ö Ñ ÒØ Ó Ò (k + 1)º ÈÓÖ ÑÔÐÓ¸ Ò Ð ¬ ÙÖ º½¿ ×
ÔÙ Ú Ö ¬ Ö ÕÙ Ð Ö Ñ Ö             ÔÖ Ò Ô Ð Ø Ò Ü Ø Ñ ÒØ Ð Ñ ×Ñ ÓÖÑ ÕÙ T6¸
 Ü ÔØÓ ÕÙ ÐÓ× Ú ÐÓÖ ×        ÒÓ Ó ×ÓÒ Ò Ö Ñ ÒØ Ó× Ò (9) = 34º
508                                                     Cap´        ´
                                                               ıtulo 6. Arboles de b´ squeda equilibrados
                                                                                    u



                                                                                              33

                                                            20                                                               46

                                         12                                      28                            41                       51

                            7                        17                   25             31              38             44         49        53

                4                   10          15         19        23        27     30 32         36        40    43 45         48 50 52

        2               6           9 11      14 16 18            22 24 26          29             35 37 39        42         47

    1       3       5           8          13                   21                             34

0



                                                ÙÖ º½¿ Ö ÓÐ                 ÓÒ           ÓÖ Ò 8

          Ð ¬ ÙÖ º½¿ × Ó × ÖÚ ÕÙ Ð Ø ÕÙ Ø           ÒÓ Ó × Ü Ø Ñ ÒØ ×Ù ÔÓ× ÓÒ
     Ò¬ º ר ØÖÙ Ó   ¿ ÒÓ× Ô ÖÑ Ø  ÒØÙ Ö Ð Ö Ò Ð          ÙÒ Ö ÓÐ     ÓÒ º Ä
    Ö Þ Ð Ö ÓÐ        ÓÒ      ÓÖ Ò 8 ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ º½¿ × (8 + 1) − 1 = 33º
    ÈÙ ×ØÓ ÕÙ ÐÓ× ÒÓ Ó× ×Ø Ò Ø ÕÙ Ø Ó× ÓÒ ×Ù ÔÓ× ÓÒ Ò¬ ¸ (7 + 2) = 33 × Ð
      ÒØ      ÒÓ Ó× ÕÙ ÔÖ      Ò Ð Ö ÓÐ ÞÕÙ Ö Óº È ÖÓ¸ ÔÓÖ ¬Ò ÓÒ¸ Ä(T8) = T7¸ ÔÓÖ
    ÐÓ ÕÙ ÔÓ ÑÓ× Ù Ö ÕÙ |T7| = (7 + 2) − 1º ÈÓ ÑÓ× Ó × ÖÚ Ö Ö ÒØ × Ö ÓÐ ×
        ÓÒ Ý ÓÖÖÓ ÓÖ Ö ×Ø ÒØÙ ÓÒ Ñ ÒØ Ð × Ù ÒØ ÔÖÓÔÓ× ÓÒ
    Proposici´n 6.5
             o                           Ð ÒÙÑ ÖÓ         ÒÓ Ó×      ÙÒ Ö ÓÐ              ÓÒ          ÓÖ Ò k ×           (k +
    2) − 1º
    Demostraci´n (por inducci´n sobre k)
              o              o

        ¯ k=0       Ò ×Ø ×Ó¸ |T0| = (0) = 0º Ä ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö k = 0º
        ¯   k>0      ÓÖ ×ÙÑ ÑÓ× ÕÙ Ð ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö ØÓ Ó k Ý Ú Ö ¬ ÑÓ× × ÙÒ
            ÐÓ × Ô Ö k + 1º
            ÈÓÖ ¬Ò ÓÒ
                                    |Tk+1| = |Tk| + 1 + |Tk−1|             ´ º½½µ
             × Ö¸ Ð ÒÙÑ ÖÓ ÒÓ Ó× Ð Ö Ñ ÞÕÙ Ö Ñ × Ð Ö Þ Ñ × Ð ÒÙÑ ÖÓ
            ÒÓ Ó× Ð Ö Ñ Ö º ÔÐ Ò Ó Ð ÔÓØ × × Ò Ù Ø Ú Ð Ù ÓÒ ´ º½½µ¸
            Ø Ò ÑÓ×
                                              |Tk+1| =          (k + 1) − 1 + 1 +         (k + 1) − 1
                                                     =          (k + 2) +        (k + 1) − 1
                                                     =          (k + 3) − 1
      ¿
         Ò Ö Ð ¸ Ð ÒØ Ö × ÔÖ Ñ Ö Ó ÐÓ× Ö ÓÐ ×   ÓÒ                                    × ØÓÔÓÐÓ Ó¸ Ô ÖÓ Ð Ñ Ò Ö Ò ÕÙ ÐÓ×
    Ø ÕÙ Ø ÑÓ× ÒÓ×  Ñ × ÔÖ Ò× Ð Ð × ÑÓ×ØÖ ÓÒ ×º
´
6.4. Arboles AVL                                                                  509



    Ä ÔÖÓÔÓ× ÓÒ ×¸ ÒØÓÒ ×¸ ÖØ Ô Ö ØÓ Ó k
  Ä ÐØÙÖ     ÙÒ Ö ÓÐ     ÓÒ Ø Ñ Ò × ÐÑ ÒØ ×Ù Ö Ð ÔÓÖ Ó × ÖÚ ÓÒº
 Ò Ð ×Ó Ð Ö ÓÐ ÓÖ Ò 8 ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ º½¿ × 8 × Ö¸ ×Ù ÓÖ Òº
Proposici´n 6.6
         o        Ä ÐØÙÖ       Ð Ö ÓÐ         ÓÒ        ÓÖ Ò k × kº
Demostraci´n (por inducci´n sobre k)
          o              o

   ¯ k=0      ר ×Ó × Ö ØÓ ÔÙ × Ð Ö ÓÐ Ú Ó Ø Ò ÐØÙÖ ÒÙÐ º
   ¯ k>0        ÓÖ ×ÙÑ ÑÓ× ÕÙ Ð ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö ØÓ Ó k Ý Ú Ö ¬ ÑÓ× Ô Ö
     k + 1º
     Ë Tk+1 Ð Ö ÓÐ               ÓÒ     ÓÖ Ò k + 1º ÒØÓÒ ×¸ h(Tk+1) = 1 +
     Ñ Ü(h(Tk), h(Tk−1))º      ÔÐ Ò Ó Ð ÔÓØ × × Ò Ù Ø Ú ¸ Ñ Ü(h(Tk), h(Tk−1)) =
     h(Tk) = k¸ ÔÓÖ ÐÓ ÕÙ   h(Tk+1) = 1 + k




                        ÙÖ º½         Ö ÓÐ         ÓÒ     ÓÖ Ò 13
  Ä ÔÖÓÔÓ× ÓÒ ÒØ Ö ÓÖ × ÙÒ Ñ ÒØ Ð Ô Ö ÑÓ×ØÖ Ö ÕÙ ÙÒ Ö ÓÐ                     ÓÒ      ×
 Îĸ Ù ×Ø ÓÒ ÕÙ Ö ×ÔÓÒ Ð ÔÖÓÔÓ× ÓÒ ÕÙ × Ù
Proposici´n 6.7
         o          ÍÒ Ö ÓÐ        ÓÒ      × Îĺ
Demostraci´n Ë Tk Ð Ö ÓÐ
              o                        ÓÒ       ÓÖ Ò kº ÓÒרÖÙ Ö ÑÓ× Ð ÑÓ×ØÖ ÓÒ
ÔÓÖ Ò Ù ÓÒ ×Ó Ö k
    ¯ k = 0 ר      ×Ó × Ö ØÓ ÔÙ × Ð Ö ÓÐ Ú Ó × Îĺ
    ¯ k = 1 Ò ×Ø       ×Ó T1¸ ÓÑÔÙ ×ØÓ ÔÓÖ ÙÒ ×ÓÐÓ ÒÓ Ó¸ × ÙÒ Ö ÓÐ Îĺ
    ¯ k>0       ÓÖ ×ÙÑ ÑÓ× ÕÙ Ð ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö ØÓ Ó k Ý Ú Ö ¬ ÑÓ× Ô Ö
      Tk+1º
      È Ö ÕÙ Tk+1 × Îĸ Ð           ÖÒ        ÐØÙÖ × ØÓ Ó× ×Ù× ÒÓ Ó× ÒÓ         Ü Ö
          ÙÒÓº ÈÓÖ ¬Ò ÓÒ¸ Ð × Ö Ñ × Tk+1 ×ÓÒ Ö ÓÐ ×               ÓÒ ¸ ÐÓ× Ù Ð ×¸ ÔÓÖ
      Ð ÔÓØ × × Ò Ù Ø Ú ¸ ×ÓÒ Îĺ × Ô٠׸ Ð ÙÒ Ó ÒÓ Ó Ò ÕÙ Ý ÕÙ Ú Ö ¬ Ö
      Ð ÓÒ ÓÒ ÎÄ × Ò Ð Ö Þ Tk+1º Ä                  ÖÒ         ÐØÙÖ × Ö Þ(Tk+1) ר
            ÔÓÖ δ(raiz(Tk+1)) = h(Ê(Tk+1)) − h(Ä(Tk+1)) = h(Tk−1) − h(Tk) Р٠и ÔÓÖ Ð
      ÔÖÓÔÓ× ÓÒ º ¸ × k − 1 − k = −1º ÈÙ ×ØÓ ÕÙ ØÓ Ó× ÐÓ× ÒÓ Ó× Tk+1 × Ø × Ò Ð
       ÓÒ ÓÒ Îĸ Tk+1 × ÎÄ Ý Ð ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö ØÓ Ó k
      Ù ÐÕÙ Ö Ö ÓÐ         ÓÒ     × Îĺ × ×Ø Ô Ö×Ô Ø Ú ¸ ÐÓ× Ö ÓÐ ×              ÓÒ
×ÓÒ      ÐØÓ ÒØ Ö ×¸ ÔÙ × ÒÓ× Ö Ø Ö Þ Ò Ö ÓÐ × ÎÄ          ÐØÙÖ Ñ Ü Ñ º È Ö ÔÖ Ö
 ר Ù ×Ø ÓÒ¸ Ö ÕÙ Ö ÑÓ× Ð × Ù ÒØ ¬Ò ÓÒ
510                               Cap´        ´
                                     ıtulo 6. Arboles de b´ squeda equilibrados
                                                          u



               ´
Definici´n 6.6 (Arbol AVL cr´
       o                   ıtico)     Ë T ÙÒ Ö ÓÐ ÎÄ     ÐØÙÖ hº Ë     ÕÙ    T
× Ö Ø Ó × Ý ×ÓÐÓ × ¸ Ð Ð Ñ Ò Ö ÙÒ ÒÓ Ó¸ Ð Ö ÓÐ     × Ö ÎÄ Ó Ô Ö ÐØÙÖ º
  Ä × Ù ÒØ ÔÖÓÔÓ× ÓÒ ÒÓ× ×Ø Ð Ð Ö Ø               ÙÒ Ö ÓÐ       ÓÒ º
Proposici´n 6.8 ÍÒ Ö ÓÐ
         o                   ÓÒ     × ÙÒ Ö             ÓÐ ÎÄ Ö Ø Óº
Demostraci´n (por inducci´n sobre k = |T |)
           o             o

  ¯ k=0      Ò ×Ø ×Ó¸ T0 = ∅ ÕÙ ¸ × Ò × ÔÓÖ ¬Ò ÓÒ Îĸ ÒÓ Ñ Ø Ð Ñ Ò ÓÒº
  ¯   k = 1 Ò ×Ø   ×Ó T1 × ÙÒ Ö ÓÐ ÓÒ ÓÖÑ Ó ÔÓÖ ÙÒ ×ÓÐÓ ÒÓ Óº Ð ØÙ Ö Ð ÙÒ
       Ð Ñ Ò ÓÒ ÔÓ× Ð × Ô Ö Ò T0¸ Р٠и ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ º ¸ Ø Ò Ñ ÒÓÖ
       ÐØÙÖ ÕÙ T1º Ð Ð Ñ × ÔÙ × ÖØÓ Ô Ö ×Ø ×Óº
  ¯   k = 2 Ò ×Ø       ×Ó × ØÖ Ø    T2¸ Ð Ù Ð ×ÓÐÓ × ÔÓ× Ð Ð Ñ Ò Ö Ó× ÒÓ Ó׺
      ÁÒ Ô Ò ÒØ Ñ ÒØ Ð ÒÓ Ó ÕÙ Ð Ñ Ò ÑÓ׸ Ð Ö ÓÐ Ô Ö Ò T1 Ó × ÕÙ ×
      Ô Ö ÐØÙÖ º
  ¯   k = 3 ÒØÓÒ × Ø Ò ÑÓ× T3

                                       T3        2


                                  T2        1        3 T0


                             T1        0

           ÕÙ Ø Ò ÑÓ× Ù ØÖÓ ×Ó×
        ½º Ë Ð Ñ Ò ÑÓ× Ð ÒÓ Ó 0¸ ÒØÓÒ × Ð Ö ÓÐ Ô Ö ÐØÙÖ º
        ¾º Ë Ð Ñ Ò ÑÓ× Ð ÒÓ Ó 3¸ ÒØÓÒ × Ð Ö ÓÐ        × Ö ÎÄ Ý Ù ÐÕÙ Ö Ùר
           ÕÙ ×        ÓÒÐÐ Ú ÙÒ Ô Ö       ÐØÙÖ º
        ¿º Ë Ð Ñ Ò ÑÓ× Ð ÒÓ Ó 1¸ ÒØÓÒ × Ð Ø Ö Ð Ö Þ 2 ÓÒ Ð Ó 0 Ð Ö ÓÐ Ô Ö
             ÐØÙÖ º
         º Ò ÐÑ ÒØ ¸ × Ð Ñ Ò ÑÓ× Ð Ö Þ 2¸ ÒØÓÒ × Ø Ò ÑÓ× Ó× ÐØ ÖÒ Ø Ú × Ô Ö
           ×Ùר ØÙ ÖÐ
            ´ µ ÓÐÓ ÑÓ× Ð ÒÓ Ó 1 ÓÑÓ Ö Þ¸ ÐÓ ÕÙ ÖÖ ÕÙ Ð Ö ÓÐ Ô Ö ÐØÙÖ º
           ´ µ ÓÐÓ ÑÓ× Ð ÒÓ Ó 3 ÓÑÓ Ö Þ¸ ÐÓ ÕÙ Ù× ÕÙ Ð Ö ÓÐ         × Ö Îĺ
  ¯   k>3        ÓÖ ×ÙÑ ÑÓ× ÕÙ Ð Ð Ñ × ÖØÓ Ô Ö ØÓ Ó k Ý Ú Ö ¬ ÑÓ× × ÙÒ ÐÓ ×
      Ô Ö k + 1º
       Ð Ö ÓÐ Tk+1 ÔÙ Ô ØÓÖ Þ Ö× ÓÑÓ
                                                Tk+1



                             Tk                        Tk−1
´
6.4. Arboles AVL                                                             511



     ÈÓÖ Ð ÔÓØ × × Ò Ù Ø Ú ¸ ÐÓ× Ö ÓÐ × Tk Ý Tk−1 ×ÓÒ Ö Ø Ó׸ × ÕÙ Ð Ð Ñ Ò Ö
      Ù ÐÕÙ Ö ÒÓ Ó ÐÐÓ× Ð Ö ÓÐ Ö             × Ö ÎÄ Ó Ô Ö Ö ÐØÙÖ º × Ô٠׸ Ð
     ÙÒ Ó ÔÙÒØÓ        Ù ÐÓ ÓÒר ØÙÝ Ð Ð Ñ Ò ÓÒ Ð Ö Þ Tk+1º
       Ð Ð Ñ Ò Ö Ð Ö Þ¸ ÕÙ × ÙÒ ÒÓ Ó ÓÑÔÐ ØÓ¸       ÑÓ× ×Ùר ØÙ ÖÐ ÔÓÖ Ð ÙÒÓ ÐÓ×
     ÒÓ Ó× Tk Ó Tk−1º Ì Ò ÑÓ× Ó× ×Ó×
        ½º ËÙר ØÙ ÑÓ× Ð Ö Þ ÔÓÖ ÙÒ ÒÓ Ó Tk × Tk Ô Ö ÐØÙÖ ¸ ÒØÓÒ × Tk+1 Ø Ñ Ò
           Ô Ö ÐØÙÖ º
           Ë Tk         × Ö Îĸ ÒØÓÒ × Tk+1 Ø Ñ Ò           × Ö Îĺ
        ¾º ËÙר ØÙ ÑÓ× Ð Ö Þ ÔÓÖ ÙÒ ÒÓ Ó Tk−1 × Tk−1          × Ö Îĸ ÒØÓÒ × Tk+1
           ØÑ Ò            × Ö Îĺ
           Ë Tk−1 Ô Ö ÐØÙÖ ¸ ÒØÓÒ × Ó ÙÖÖ ÙÒ Ú ÓÐ ÓÒ Ð ÓÒ ÓÒ ÎÄ Ò Ð
           Ö Þ Tk+1¸ ÔÙ × δ(Tk+1) = −2º Tk+1      ÔÙ × × Ö Îĺ
     ÈÙ ×ØÓ ÕÙ Tk+1 × ÙÒ ÎÄ Ö Ø Ó¸ ÒØÓÒ × Ð ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö ØÓ Ó k

    ×ØÙ Ó× ÐÓ× Ö ÓÐ ×   ÓÒ ¸ Ø Ò ÑÓ× ØÓ × Ð × ÖÖ Ñ ÒØ × Ö ÕÙ Ö × Ô Ö
Ð   ÑÓ×ØÖ ÓÒ Ð ÔÖÓÔÓ× ÓÒ º º
6.4.2.2   Demostraci´n de la proposici´n 6.4
                    o                 o

Ä ÐØÙÖ Ñ Ò Ñ ÙÒ Ö ÓÐ ÎÄ × Ð Ñ ×Ñ ÕÙ Ô Ö Ù ÐÕÙ Ö Ö ÓÐ Ò Ö Ó¸ Ð Ù Ð
 Ù ÑÓ×ØÖ        Ò Ð ÔÖÓÔÓ× ÓÒ º½º ÈÓÖ Ø ÒØÓ¸ ÒÓ× ÓÒ ÒØÖ Ö ÑÓ× Ò ×ØÙ Ö Ð ÐØÙÖ
Ñ Ü Ñ ÕÙ ÔÙ         Ð ÒÞ Ö ÙÒ Ö ÓÐ Îĺ
     ר ÑÓ× ÒØ Ö × Ó× Ò Ò ÓÒØÖ Ö ÙÒ Ñ Ò Ö          ×ÔÓÒ Ö n ÒÓ Ó× Ò ÙÒ Ö ÓÐ ÎÄ
   Ñ Ò Ö Ø Ð ÕÙ ×Ù ÐØÙÖ × Ñ Ü Ñ º Ò ÓØÖ × Ô Ð Ö ×¸         ÑÓ× ×ÔÓÒ Ö ÐÓ× n ÒÓ Ó×
 Ò ÙÒ Ö ÓÐ Ö Ø Óº ÓÑÓ × ÑÓ× Ð ÔÖÓÔÓ× ÓÒ º ¸ ÙÒ Ö ÓÐ               ÓÒ     × Ö Ø Óº
   Ð Ñ ×ÑÓ ÑÓ Ó¸ ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ º ¸ ÙÒ Ö ÓÐ         ÓÒ      × Îĺ ÓÒ × ÙÖ ¸
ÔÓ ÑÓ× Ù× Ö Ð ÓØ Ð ÐØÙÖ Ñ Ü Ñ ØÖ Ú × ÙÒ Ö ÓÐ                      ÓÒ º
          ÙÒ ÐØÙÖ ÒÓÑ Ò Ð h¸ ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ º ¸ Ð Ö ÓÐ          ÓÒ Th¸ ÎÄ Ý
 Ö Ø Ó¸ Ø Ò ¸ × ÙÒ Ð ÔÖÓÔÓ× ÓÒ º ¸ (h + 2) − 1 ÒÓ Ó׺ × Ô٠׸ ÔÐ ÒØ ÑÓ×
                            n ≥ |Th| =     (h + 2) − 1                     ´ º½¾µ
     Ù ÐÕÙ Ö Ö ÓÐ ÎÄ      ÐØÙÖ h Ø Ò ÕÙ Ø Ò Ö Ù Ð Ó Ñ × ÒÓ Ó× ÕÙ |Th|¸ ÔÙ ×
Th × Ö Ø Óº     ר ÑÓ Ó¸ ÐÓ ÙÒ Ó ÕÙ ÒÓ× Ö ×Ø × Ò ÓÒØÖ Ö ÙÒ ÜÔÖ × ÓÒ ÕÙ ÒÓ×
  ÒÓØ Ð n¹ × ÑÓÒÙÑ ÖÓ        ÓÒ Ý ×Ô Ö h Ð × Ù Ð ´ º½¾µº Ô ÖØ Ö Ð
 ÓÒÓ Ñ ÒØÓ ÕÙ       (0) = 0,   (0) = 1¸   ÑÓ× Ö ×ÓÐÚ Ö Ð Ù ÓÒ Ö ÙÖÖ Ò
                          (k) =       (k − 1) +   (k − 2) =⇒               ´ º½¿µ
                       (k + 2) =      (k + 1) +   (k) =⇒                   ´ º½ µ
   Ä Ù       ÓÒ ´ º½ µ × ÙÒ Ù ÓÒ Ö ÙÖÖ ÒØ ÓÑÓ Ò         × ÙÒ Ó ÓÖ Òº Ë ¹
ÒÓÑ Ò       ר Ñ Ò Ö ÔÓÖÕÙ × Ö Ñ Ò × ÒØ ÙÒ Ù ÓÒ Ö Ò Ð ÓÑÓ Ò
× ÙÒ Ó ÓÖ    Òº        Ó¸ Ð × Ù ÓÒ × Ö ÙÖÖ Ò × Ñ ÒÙ Ó × ÒÓÑ Ò Ò Ù ¹
 ÓÒ ×        Ö Ò × ¸ ÔÓÖ ×Ù × Ñ Ð ØÙ × ÓÒ Ð × Ù ÓÒ × Ö Ò Ð ×º Ò ×Ø × ÒØ Ó¸
512                                    Cap´        ´
                                          ıtulo 6. Arboles de b´ squeda equilibrados
                                                               u



Ð Ù ÓÒ ´ º½ µ × Ö Ñ Ò × ÒØ             ÙÒ Ù ÓÒ Ö Ò Ð Ð Ò Ð ÓÑÓ Ò           × ÙÒ Ó
ÓÖ Ò ÓÒ Ó ¬ ÒØ × ÓÒר ÒØ ×            × Ö¸ ÓÖÑ y + a1 y + a2 y = 0º
      ÓÖ ÔÓ ÑÓ× Ö ×ÓÐÚ Ö Ð Ù            ÓÒ Ö ÙÖÖ ÒØ ´ º½ µ Ñ ÒØ ÙÒ Ñ ØÓ Ó Ò ÐÓ Ó
Ö ×ÓÐÙ ÓÒ ÙÒ Ù ÓÒ Ö Ò                   к È Ö ÐÐÓ¸ Ð Ù Ð ÕÙ ÓÒ ÙÒ Ù ÓÒ Ö Ò Ð
 ÓÑÓ Ò      × ÙÒ Ó ÓÖ Ò¸ ÔÐ             ÑÓ× Ð ØÖ Ò× ÓÖÑ ÓÒ × Ù ÒØ
                               (k) = c ωk,     c, ω = 0, k ≥ 2 .                    ´ º½ µ
   ËÙר ØÙ ÑÓ× ´ º½ µ Ò ´ º½ µ¸ ÐÓ ÕÙ ÔÖÓÔÓÖ ÓÒ Ð            Ù ÓÒ Ö Ø Ö ×Ø      × Ù ÒØ
                                 c ωk+2 = c ωk+1 + c ωk ,                           ´ º½ µ
Р٠и Ð Ú Ö ÔÓÖ c ωk¸ ÔÙ             × ÑÔÐ ¬ Ö×     Ð Ð Ò Ö         Ù ÓÒ Ú Ò
                                      ω2 − ω − 1 = 0 ,                              ´ º½ µ
ÙÝ × Ö       × ×ÓÒ                           √
                                          1± 5
                                     ω=
                                            2
                                                  .                                 ´ º½ µ
      רÓ× ÒÙÑ ÖÓ× ×ÓÒ Ð Ò    Ö Ó׸ Ð ÒÙÑ ÖÓ ϕ Ý ϕ ÙÝÓ×
                                                  ^           Ú ÐÓÖ × ×ÓÒ
                                         √
                                      1+ 5
                              ϕ =
                                        2√
                                             ≈ 1.61803 ,                            ´ º½ µ
                                      1− 5
                              ϕ =
                               ^
                                        2
                                             ≈ 0.61803                              ´ º¾¼µ
           ר Ñ Ò Ö ¸ Ð ×ÓÐÙ ÓÒ Ò Ö Ð ×
                                       (k) = c1 ϕk + c2 ϕk
                                                        ^                           ´ º¾½µ
È Ö Ò ÓÒØÖ Ö ÐÓ× Ú ÐÓÖ ×     c1 Ý c2¸ ÑÓ× ÐÓ Ñ ×ÑÓ ÕÙ ÓÒ ÙÒ                 Ù ÓÒ Ö Ò Ð
ÔÐ ÒØ ÑÓ× ÙÒ × ×Ø Ñ           Ù ÓÒ × ÓÒ Ú ÐÓÖ × ÓÒÓ Ó×                  (k)º    Ò ×Ø ×Ó¸
ÙØ Ð Þ ÑÓ× (0) = 0 Ý        (1) = 1

                          (0) = 0 = c1 ϕ0 + c2 ϕ0 = c1 + c2
                                               ^                                    ´ º¾¾µ
                          (1) = 1 = c1 ϕ1 + c2 ϕ1 = c1 ϕ + c2 ϕ
                                               ^              ^                     ´ º¾¿µ
       Ð     Ù ÓÒ ´ º¾¾µ Ø Ò ÑÓ×
                                          c2 = −c1                                  ´ º¾ µ
Ý ×Ùר ØÙÝ Ò Ó ´ º¾ µ Ò ´ º¾¿µ
                 c1 ϕ − c1 ϕ = 1 =⇒ c1(ϕ − ϕ) = 1 =⇒ c1 =
                           ^               ^
                                                                1
                                                               ϕ−ϕ^
                                                                    =√
                                                                      1
                                                                                    ´ º¾ µ
                                                                       5
      ÓÑ Ò Ò Ó ´ º¾ µ Ý ´ º¾ µ Ò ´ º¾½µ
                                                 ϕk − ϕk
                                                       ^
                                    1      1
                             (k) = √ ϕk − √ ϕk =
                                              ^    √                                ´ º¾ µ
                                     5      5        5
´
6.5. Arboles rojo-negro                                                    513



  ÈÙ ×ØÓ ÕÙ ϕ < 1¸ Ð Ø ÖÑ ÒÓ ϕk Ú Ò ÜÔÓÒ Ò ÐÑ ÒØ ÑÙÝ Ô ÕÙ ÒÓ ÓÒ ÓÖÑ
              ^              ^
 Ö k¸ Ö Ó¸ ϕ × ×ÔÖ Ð Ò ´ º¾ µ√Ô Ö Ú ÐÓÖ × k ÑÙÝ Ö Ò ×º ÓÒ× Ù ÒØ ¹
            ^
Ñ ÒØ ¸ (k) × ×Ø ÒØ Ö ÒÓ ϕk/ 5 ÓÒ ÓÖÑ Ö kº × Ô٠׸ ÔÓ ÑÓ× Ø Ò Ö
ÙÒ ÜÔÖ × ÓÒ Ñ × × ÑÔÐ Ô Ö Ð ÙÐ Ö Ð k¹ × ÑÓ ÒÙÑ ÖÓ ÓÒ
                         ϕk
                   (k) = √      Ö ÓÒ      Ó Ð ÒØ ÖÓ Ñ × ÔÖÓÜ ÑÓ           ´ º¾ µ
                           5
ÐÓ Ù Ð ÒÓ× Ô ÖÑ Ø ÓÑÔÐ Ø Ö Ð ÑÓ×ØÖ ÓÒ         Ð ÔÖÓÔÓ× ÓÒ º º
      ÓÖ Ö ØÓÑ ÑÓ× Ð × Ù Ð ´ º½¾µ
            n ≥ |Th| =   (h + 2) − 1 =⇒                                   ´ º¾ µ
              >   √
                   ϕ h+2
                        Ö ÓÒ Ó Ð ÒØ          ÖÓ Ñ × Ö ÒÓ         − 1 =⇒   ´ º¾ µ
                    5
            n > √
                 ϕ h+2
                       −2                                                 ´ º¿¼µ
                  5
  ÆÓØ ÑÓ× ÕÙ Ð Ù ÓÒ ´ º¾ µ ר Ð ÕÙ Ð ÙÒ ÓÒ Ö ÓÒ Ó Ð ÒØ ÖÓ Ñ × Ö ÒÓ
    ÔÐ Ö× º È Ö ×Ô Ö h Ð Ò Ù ÓÒ ´ º¾ µ¸ × Ö Ò × Ö Ó ÓÒÓ Ö Ð ÒÚ Ö×
  Ð ÙÒ ÓÒ Ö ÓÒ Óº ÈÓÖ × Ö ÞÓÒ¸ Ö ×Ø ÑÓ× ÙÒ ÙÒ      ÐÐ Ó Ö Ó Ð
Ò Ù ÓÒ ´ º¾ µ ݸ Ô ÖØ Ö ÐÐ ¸ ÜÔÖ × ÑÓ× ÙÒ × Ù Ð ×ØÖ Ø
                               √
                   ϕh+2 <        5 (n + 2) =⇒
                                     √
                   h+2 <       ÐÓ ϕ [ 5 (n + 2)] =⇒ √
                      h <      ÐÓ ϕ (n + 2) + ÐÓ ϕ ( 5) − 2 =⇒
                               Ð (n + 2) − 0.3277 =⇒
                      h <
                                  Ð ϕ
                      h <      1.4404 Ð (n + 1) − 0.3277



6.5   ´
      Arboles rojo-negro
   ÓÖ ×ØÙ Ö ÑÓ× ÙÒ Ð ×         Ö ÓÐ Ò Ö Ó ÙÝÓ ×ÕÙ Ñ   Ð Ò Ø Ñ Ò × Ö Ò¹
Ø Þ Óº Ð ×ÕÙ Ñ × ÖÓÑ Ø Ó Ò Ð × ÒØ Ó ÕÙ ÐÓ× ÒÓ Ó× ×ÓÒ ÓÐÓÖ Ó× ÖÓ Ó Ó
Ò ÖÓ¸ Ö ×Ô Ø Ú Ñ ÒØ º Ä × Ö Ð × ÓÐÓÖ ÓÒ ÔÖÓÔÓÖ ÓÒ Ò Ö ÙÑ ÒØÓ× ÓÑ Ò ØÓÖ Ó׸
 Ò ÙÒ ÓÒ Ð × ÔÓ× Ð × ÓÑ Ò ÓÒ × ÓÐÓÖ ×¸ ÕÙ Ö ÒØ Þ Ò ÙÒ ÕÙ Ð Ö Óº
               ´
Definici´n 6.7 (Arbol rojo-negro)
       o                         ÍÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ¸ Ó ÊÆ¸ × ÙÒ Ö ÓÐ Ò Ö Ó
    Ù×ÕÙ ¸ ÓÒ ÙÒ ØÖ ÙØÓ      ÓÒ Ð Ò       ÙÒÓ ×Ù× ÒÓ Ó× ÒÓÑ Ò Ó ÓÐÓÖ ¸
ÕÙ × Ø × Ð × × Ù ÒØ × ÓÒ ÓÒ × ÒÓÑ Ò × ÖÓÑ Ø ×
   ¯ Condici´n crom´tica primaria ÙÒ ÒÓ Ó × ÖÓ Ó Ó Ò ÖÓº
             o      a

   ¯ Condici´n roja × ÙÒ ÒÓ Ó × ÖÓ Ó¸ ÒØÓÒ × ×Ù× Ó×
             o                                           Ó×   Ò × Ö Ò ÖÓ׺
       ×ØÓ Ö ÒØ Þ ÕÙ Ó× ÒÓ Ó× ÖÓ Ó× ÒÙÒ ÔÙ Ò ×Ø Ö ÓÒØ ÙÓ× Ò Ð Ñ ÒÓ
      Ù×ÕÙ º
   ¯ Condici´n negra Ù ÐÕÙ Ö Ñ ÒÓ
             o                         × Ð Ö Þ ×Ø ÙÒ ÒÓ Ó ÜØ ÖÒÓ ÓÒØ Ò
      Ð Ñ ×ÑÓ ÒÙÑ ÖÓ ÒÓ Ó× Ò ÖÓ׺
514                                                      Cap´        ´
                                                                ıtulo 6. Arboles de b´ squeda equilibrados
                                                                                     u



         ¯ Nodo externo negroÐÓ× ÒÓ Ó× ÜØ ÖÒÓ× ×ÓÒ Ò ÖÓ׺
         ר ¬Ò ÓÒ Ý ÐÓ× Ð ÓÖ ØÑÓ× Ö ×ÙÐØ ÒØ × ×Ø Ò Ù ÖØ Ñ ÒØ Ò×Ô Ö Ó× Ð Ü Ð×
    ÔÖ × ÒØ ÓÒ ÐÓ× Ö ÓÐ × ÖÓ Ó¹Ò ÖÓ         Ö ÏÓÓ ½ º ËÙ ¬Ò ÓÒ ¬ Ö Ð Ö ¹
    Ñ ÒØ ÓØÖÓ× ×ØÙ Ó×Ó× ÕÙ Ü Ò ÕÙ Ð Ö Þ × ÑÔÖ × Ò Ö º
        Ä ¬ ÙÖ º½ ÐÙ×ØÖ ÙÒ ÑÔÐÓ ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ò Ð Ù Ð ÐÓ× ÒÓ Ó× ÖÓ Ó×
     ר Ò ×ÓÑ Ö Ó׺
                                                                            48


                                         34                                                                    74


                  6                                          41                       53                                           90


          4               11                       38                  46        49                  69                  86                  96


     2        5       7             32        35        39        42                            64        73        78        87        93        98


                               28                                                          62



                                                   ÙÖ º½ ÍÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ

       Ä ÓÒ           ÓÒ Ò Ö Ùר ¬ ÙÒ ÒÙ ÚÓ ÓÒ ÔØÓ Ð ÐØÙÖ Ò Ö ¸ Ð Ù Ð ×                                                             ¬Ò ÓÑÓ
    × Ù
    Definici´n 6.8 (Altura negra en un nodo rojo-negro) Ë T ÙÒ Ö
            o                                              ÓÐ ÖÓ Ó¹Ò ÖÓ Ý
    ni ∈ T ÙÒ ÒÓ Ó Ù ÐÕÙ Ö   Tº Ë   ¬Ò Ð ÐØÙÖ Ò Ö       ni¸ ÒÓØ
                                                              ÓÑÓ (ni)¸
     ÓÑÓ Ð ÒÙÑ ÖÓ ÒÓ Ó× Ò ÖÓ× × ni ר Ù ÐÕÙ Ö ÒÓ Ó ÜØ ÖÒÓ    Tº

        ÆÓØ ÑÓ× ÕÙ Ð ÐØÙÖ Ò Ö ×Ø ¬Ò Ô Ö Ù ÐÕÙ Ö Ñ ÒÓ × Ö Þ(T )º רÓ
     × ÙÒ ÓÒ× Ù Ò      Ö Ø    Ð ÓÒ ÓÒ Ò Ö ÕÙ ÒÓ× Ö ÒØ Þ ÕÙ ×Ø ÐØÙÖ × Ð
    Ñ ×Ñ Ò Ô Ò ÒØ Ñ ÒØ Ð Ó ÕÙ × ÓÒ× Ö º
         Ð ÔÖ Ñ Ö Ô ×Ó     Ð × ÒÓ ÙÒ Ø ÔÓ ×ØÖ ØÓ   ØÓ × ×Ô ¬ Ö ÙÒ ÒÓ Ó
    ÖÓ Ó¹Ò ÖÓ
½    Ö ÆÓ ºÀ ½ ≡
     typedef unsigned char Color;
     # define COLOR(p) ((p)->getColor())
     # define RED      (0)
     # define BLACK    (1)
     class RbNode_Data
     {
       Color color; // RED o BLACK
       RbNode_Data() : color(RED) { /* empty */ }
       RbNode_Data(SentinelCtor) : color(BLACK) { /* empty */ }
´
    6.5. Arboles rojo-negro                                                        515



        Color& getColor() { return color; }
      };
      DECLARE_BINNODE_SENTINEL(RbNode, 128, RbNode_Data);
         ¬Ò ×
      RbNode¸ Ù×   Ò ÙÒ ½ º
    Í× × DECLARE BINNODE SENTINEL   ¾ º
       Ä Ð × RbNode ר × Ò Ô Ö ÙÑÔÐ Ö Ð × ÓÒ ÓÒ ×                     × º Ð ÓÒרÖÙ ØÓÖ
    ÔÓÖ ÓÑ × ÓÒ × ÑÔÖ Ö ÙÒ ÒÓ Ó ÖÓ Óº ÍÒ ÒÙ ÚÓ ÒÓ Ó ÖÓ Ó ÒÓ ÐØ Ö Ð ÐØÙÖ Ò Ö ¸ ÔÓÖ
     ÓÒ× Ù ÒØ ¸ × ÔÖ × ÖÚ Ð ÓÒ ÓÒ Ò Ö º                ØÓ× × Ø × Ö Ð ÙÐØ Ñ ÓÒ ÓÒ Ý
       Ð Ø Ö ÐÓ× Ð ÓÖ ØÑÓ׸ ÐÓ× Ö ÓÐ × ÖÓ Ó¹Ò ÖÓ Ù× Ò ÙÒ ÒÓ Ó ÒÙÐÓ ÒØ Ò Ð ÕÙ × Ò ÖÓº
       ÁÒØÙ Ø Ú Ñ ÒØ ÔÓ ÑÓ× ÔÖ Ö Ð ÕÙ Ð Ö Ó ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ ØÓ Ó ÒÓ Ó ×Ø
    Ô Ö Ø Ñ ÒØ Ò ÖÓ ¹ ÕÙ Ð Ö Ó × Ö¸ Ô Ö ØÓ Ó ÒÓ Ó¸ Ð               ÖÒ      ÐØÙÖ × Ò Ö ×
     ÒØÖ ×Ù× Ó× Ö Ñ × × ÒÙÐ º            Ó¸ Ð Ö ÓÐ ÖÓ Ó¹Ò ÖÓ ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ º½ ר
       ÔØ Ð Ñ ÒØ ÕÙ Ð Ö Óº




                             ÙÖ º½ ÍÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ     512   ÒÓ Ó×


    6.5.1       El TAD Rb Tree<Key>
      Ä Ì Gen Rb Tree<Key> ¬Ò ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ ÙÝ × ÓÔ Ö ÓÒ × ÔÖ Ò Ô Ð × ×ÓÒ
     Ò ÙÒ ÓÒ ÒÓ Ó× ÖÓ Ó¹Ò ÖÓ ¬Ò Ó× ÒØ Ö ÓÖÑ ÒØ º Ä ×ØÖÙ ØÙÖ ÔÖ Ò Ô Ð × ÓÑÓ
    × Ù
½    ØÔÐ Ö ØÖ ºÀ ½ ≡
          template <template <typename> class NodeType, typename Key, class Compare>
      class Gen_Rb_Tree
      {
        typedef NodeType<Key> Node;
         Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Rb Tree<Key> ½
         Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Rb Tree<Key> ½
      };
          template <typename Key, class Compare = Aleph::less<Key> >
      struct Rb_Tree : public Gen_Rb_Tree<RbNode, Key, Compare>
      { /* Empty */ };
          template <typename Key, class Compare = Aleph::less<Key> >
      struct Rb_Tree_Vtl : public Gen_Rb_Tree<RbNodeVtl, Key, Compare>
      { /* Empty */ };
    Í× × RbNode ½ º
          ÄÓ× ÙÒ Ñ ÒØÓ×       ÑÔÐ ÒØ ÓÒ ×ÓÒ ÑÙÝ × Ñ Ð Ö × ÐÓ× Ñ × Ö ÓÐ × Ò Ö Ó× ×¹
    ØÙ      Ó× ÙÒ ÒÓ Ó        Ö ¸ ÙÒÓ ÒØ Ò Ð Ý ÐÙ       ÓÒ Ù×Ó Ó ÒÓ Ð Ö ÙÖ× Ú º
516                                      Cap´        ´
                                                ıtulo 6. Arboles de b´ squeda equilibrados
                                                                     u



    ÄÓ× Ð ÓÖ ØÑÓ× ×ÓÒ Ñ × × Ò ÐÐÓ× ÕÙ ÐÓ× ÙÒ Ö ÓÐ Îĸ Ô ÖÓ ÒÓ ÐÓ ×Ù¬ ÒØ ÓÑÓ Ô Ö
    Ô ÖÑ Ø Ö ÙÒ ÑÔÐ ÒØ ÓÒ Ò ØÙÖ ÐÑ ÒØ Ö ÙÖ× Ú º
        ÍÒ      Ð×     × ÓÒ × ÕÙ ØÓÑ ÑÓ× ÔÖ ÓÖ × Ö Ð Þ Ö ÙÒ ÑÔÐ ÒØ ÓÒ Ø Ö Ø Ú
     × ×Ø      ÙÒ Ô Ð ¸ Ð Ù Ð Ùר ¬ ÐÓ× × Ù ÒØ × ØÖ ÙØÓ×
½    Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Rb Tree<Key> ½ ≡                   ´½µ ½
      Node                                      head_node; // nodo cabecera centinela
      Node *                                    head;      // puntero a cabecera centinela
      Node *&                                   root;
      FixedStack<Node*, Node::MaxHeight>        rb_stack;
    Í× × FixedStack ½¼ º
       Ä Ò× Ö ÓÒ Ý Ð Ñ Ò ÓÒ Ö ÕÙ Ö Ò ÑÔ Ð Ö Ð Ñ ÒÓ   Ù×ÕÙ                    º ר      ÓÒ ×
    Ö Ð Þ ÔÓÖ ÙÒ ÖÙØ Ò ×Ô ¬
½    Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Rb Tree<Key> ½ +≡        ´½µ ½                     ½
      Node * search_and_stack_rb(const Key & key)
      {
        Node * p = root;
        rb_stack.push(head);
        do
          {
            rb_stack.push(p);
            if (Compare () (key, KEY(p)))
              p = LLINK(p);
            else if (Compare () (KEY(p), key))
              p = RLINK(p);
            else
              return p;
          }
        while (p != Node::NullPtr);
        return rb_stack.top();
      }
      ¬Ò ×
      search and stack rb¸   Ù×   Ò ÙÒ × ½     Ò   ¾¼º

    6.5.1.1   Inserci´n en un arbol rojo-negro
                     o        ´

     Ò ÔÖ Ò Ô Ó¸ Ð Ò× Ö ÓÒ × Ü Ø Ñ ÒØ Ù Ð Ð Ò× Ö ÓÒ Ò ÙÒ Ö ÓÐ Ò Ö Ó ×Ø Ò Öº
    ÄÙ Ó¸ × × Ò × Ö Ó¸ ×     ØÙ Ò ÐÓ× Ùר × Ô Ö ÔÖ × ÖÚ Ö Ð Ð Ò
½    Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Rb Tree<Key> ½ ≡                   ´ ½ µ ¾¼
      Node * insert(Node * p)
      {
        if (root == Node::NullPtr)
          return root = p; // inserci´n en arbol vac´o
                                     o     ´        ı
        Node * q = search_and_stack_rb(KEY(p));
        if (Compare () (KEY(p), KEY(q)))
          LLINK(q) = p;
        else if (Compare () (KEY(q), KEY(p)))
          RLINK(q) = p;
        else
          {
            rb_stack.empty();
´
    6.5. Arboles rojo-negro                                                        517



              return NULL; // clave duplicada
            }
          fix_red_condition(p);
          return p;
      }
    Í× × fix red condition ½ Ò   search and stack rb   ½ º
    Ä ÖÙØ Ò ÑÔÐ ÒØ Ð Ò× Ö ÓÒ × Ð × º fix red condition() Ú Ö ¬ Ú ÓÐ ÓÒ ×
       Ð × ÓÒ ÓÒ × ÖÓÑ Ø × Ý Ð × ÓÖÖ × × Ð ×Óº
         Ò Ð ×Ó Ð Ò× Ö ÓÒ¸ Ð ØÖÙ Ó × Ò× ÖØ Ö ÙÒ ÒÓ Ó ÖÓ Ó¸ ÔÙ × ×Ø ÒÓ ÐØ Ö Ð
     ÓÒ ÓÒ Ò Ö ¸ Ö Ó¸ Ð Ð Ò        ÐØÙÖ × Ò Ö ×º ÑÔ ÖÓ¸ Ð Ò× Ö ÓÒ ÙÒ ÒÓ Ó ÖÓ Ó
    ÔÙ      Ù× Ö ÙÒ Ú ÓÐ ÓÒ Ð ÓÒ ÓÒ ÖÓ × Ð Ô Ö Ð ÒÓ Ó Ò× ÖØ Ó × ÖÓ Óº Ë Ð
    Ô Ö Ð ÒÓ Ó Ò× ÖØ Ó × Ò ÖÓ¸ ÒØÓÒ × Ð Ö ÓÐ Ö ×ÙÐØ ÒØ × ÖÓ Ó¹Ò ÖÓ Ý Ð Ð ÓÖ ØÑÓ
    Ø ÖÑ Ò º ÐÓ ÓÒØÖ Ö Ó¸ × Ò × Ö Ó Ö ×Ø Ð Ö Ð ÓÒ ÓÒ ÖÓ × Ò ÐØ Ö Ö Ð ÓÒ ÓÒ
    Ò Öº
        Ä ×ØÖÙ ØÙÖ fix red condition() × ÓÑÓ × Ù
½    Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Rb Tree<Key> ½ +≡           ´½µ ½       ¾¾
      void fix_red_condition(Node * p)
      {
        while (p != root)
          {
            Node * pp = rb_stack.pop(); // padre de p
            if (COLOR(pp) == BLACK) // ¿padre de p negro?
              break; // s´ ==> no hay nodos rojos consecutivos ==> terminar
                         ı
            if (root == pp) // ¿p es hijo directo de la ra´z?
                                                          ı
              {    // s´ ==> colorear ra´z de negro y terminar
                       ı                ı
                COLOR(root) = BLACK;
                break;
              }
            Node * ppp = rb_stack.pop(); // abuelo de p
            Node * spp = LLINK(ppp) == pp ? RLINK(ppp) : LLINK(ppp); // t´o de p
                                                                         ı
            if (COLOR(spp) == RED) // ¿t´o de p rojo?
                                        ı
              {     // intercambiar colores entre los niveles
                COLOR(ppp) = RED;
                COLOR(pp) = BLACK;
                COLOR(spp) = BLACK;
                p = ppp;
                continue; // avanzar al pr´ximo ancestro y verificar violaciones
                                          o
              }
            Node * pppp = rb_stack.pop(); // bisabuelo de p
            if (LLINK(pp) == p and LLINK(ppp) == pp)
              {
                rotate_to_right(ppp, pppp);
                COLOR(pp) = BLACK;
              }
            else if (RLINK(pp) == p and RLINK(ppp) == pp)
              {
                rotate_to_left(ppp, pppp);
                COLOR(pp) = BLACK;
              }
            else
518                                     Cap´        ´
                                           ıtulo 6. Arboles de b´ squeda equilibrados
                                                                u



          {
              if (RLINK(pp) == p)
                {
                  rotate_to_left(pp, ppp);
                  rotate_to_right(ppp, pppp);
                }
              else
                {
                  rotate_to_right(pp, ppp);
                  rotate_to_left(ppp, pppp);
                }
              COLOR(p) = BLACK;
           }
         COLOR(ppp) = RED;
         break; // ´rbol es rojo-negro ==> terminar
                   a
       }
      rb_stack.empty();
 }
  ¬Ò ×
 fix red condition¸   Ù×   Ò ÙÒ   ½ º
   Ð Ð ÓÖ ØÑÓ ØÓÑ ÓÑÓ ÒØÖ ÙÒ ÒÓ Ó p¸ ÕÙ × Ð ÒÓ Ó Ò× ÖØ Öº Ä × Ð × ÙÒ
 Ö ÓÐ ÖÓ Ó¹Ò ÖÓ ÓÒ Ð ÒÓ Ó p Ò× ÖØ Óº
       Ð Ò Ó Ð while¸ p × ÙÒ ÒÓ Ó ÖÓ Ó Ö Ò Ò× ÖØ Óº Ð ÙÒ × ÓÖÖ ÓÒ × ÔÙ Ò
  Ù× Ö ÓØÖ × Ú ÓÐ ÓÒ × ×Ó Ö Ð × Ò Ò           pº Ù Ò Ó ×ØÓ Ó ÙÖÖ ¸ p ×  ØÙ Ð Þ
ÕÙ ÔÙÒØ ×Ó Ö ÙÒ ÒÓ Ó ÖÓ Ó ÕÙ Ú ÓÐ Ð ÓÒ ÓÒ ÖÓ º
     Ë ÐÔ Ö         p × Ò ÖÓ¸ ÒØÓÒ × Ð ÒÙ ÚÓ ÒÓ Ó ÒÓ Ù× Ò Ò ÙÒ Ú ÓÐ ÓÒ Ý Ð
 Ð ÓÖ ØÑÓ Ø ÖÑ Ò º ר × Ð ÔÖ Ñ Ö Ú Ö ¬ ÓÒ Ð whileº
     Ë ¸ ÔÓÖ Ð ÓÒØÖ Ö Ó¸ pp × ÖÓ Ó¸ ÒØÓÒ × Ø Ò ÑÓ× Ó× ÒÓ Ó× ÖÓ Ó× ÓÒ× ÙØ ÚÓ× ÕÙ
Ú ÓÐ Ò Ð ÓÒ ÓÒ ÖÓ º Ä ÓÖÖ ÓÒ × Ö Ð Þ × ÙÒ ÐÓ× × Ù ÒØ × ×Ó×
    ½º p × Ó Ö ØÓ Ð Ö Þ ×Ø × ØÙ ÓÒ × Ú Ö ¬ Ò Ð × ÙÒ Ó if Ý × Ö ×Ù ÐÚ
         ÓÐÓÖ Ò Ó Ð Ö Þ Ò ÖÓ
                                  root             root
                                                      pp

                                          p                p
                                              =⇒



      Ð Ö ÓÐ Ö ×ÙÐØ ÒØ × ÖÓ Ó¹Ò ÖÓ Ý Ð Ð ÓÖ ØÑÓ Ø ÖÑ Ò º
  ¾º Ì Ó p × ÖÓ Ó ×Ø Ö ÙÒר Ò ¸ Ø Ø ÔÓÖ Ð Ø Ö Ö if¸ × ×ÓÖØ ÓÒ ÙÒ
     ÒØ Ö Ñ Ó ÓÐÓÖ × ÒØÖ ÐÓ× Ò Ú Ð ×º × Ö¸ Ð Ù ÐÓ p Ú Ò ÖÓ Ó Ý ×Ù× Ó×
       Ó× Ú Ò Ò Ò ÖÓ׺ ÄÓ× Ó× ×Ó× ÔÓ× Ð × × ÑÙ ×ØÖ Ò Ò Ð ¬ ÙÖ º½ º
     ÄÙ Ó ×Ø Ùר Ð Ô Ö ppp × ÔÓ Ö × Ö ÖÓ Ó¸ ÐÓ ÕÙ ÖÖ Ö ÙÒ Ú ÓÐ ÓÒ
        Ð ÓÒ ÓÒ ÖÓ º ÈÓÖ × Ö ÞÓÒ¸ ÙØ ÑÓ× p = ppp Ý Ú ÒÞ ÑÓ× ÙÒ ÒÙ Ú
     Ø Ö ÓÒº
  ¿º Ì Ó p × Ò ÖÓ Ò ×Ø ×Ó Ö Ð Þ ÑÓ× ÖÓØ ÓÒ × ÕÙ ØÖ Ò× ÓÖÑ Ò Ð ÔÖÓ Ð Ñ
      Ò ÙÒÓ ÐÓ× ÒØ Ö ÓÖ ×º
´
6.5. Arboles rojo-negro                                                                    519

                               ppp                                         ppp

                      pp                 spp                      pp                 spp

             p                                           p


                           χ         δ                                 χ         δ

         α        β                                  α        β

                               ppp             =⇒                          ppp

             pp                          spp             pp                          spp

                      p                                           p


         α                           δ               α                           δ

                  β        χ                                  β        χ

                                               =⇒

                      ÙÖ º½ ÁÒØ Ö Ñ Ó               ÓÐÓÖ × ÒØÖ ÐÓ× Ò Ú Ð ×

    À Ý Ó× ÔÓ× Ð × × ØÙ ÓÒ × Ò Ö Ð ×
     ´ µ ר × ØÙ ÓÒ × ÑÙ ×ØÖ Ò Ð ¬ ÙÖ º½ Ý × Ø Ø ÔÓÖÕÙ p¸ pp Ý ppp
         ר Ò ÓÑÔÐ Ø Ñ ÒØ Ð Ò Ó× ×         Ð ÞÕÙ Ö Ó          Ð Ö º ËÙ
           Ø ÓÒ Ý ÔÖÓ × Ñ ÒØÓ Ó ÙÔ ÐÓ× Ù ÖØÓ Ý ÕÙ ÒØÓ ifº
        Ä ÓÖÖ ÓÒ ÓÒ× ×Ø Ò ØÙ Ö ÙÒ ÖÓØ ÓÒ × ÑÔÐ            pp      ÐÐ Ó
        spp ×ØÓ       ÕÙ pp Ú Ò Ð Ö Þ Ð ×Ù Ö Óк ÈÓÖ ÙÐØ ÑÓ¸ × ÒØ Ö Ñ Ò
        ÐÓ× ÓÐÓÖ × pp Ý pppº
                               ppp                                pp

                      pp                 spp             p                 ppp

             p                                                                       spp


                           χ         δ               α        β        χ

         α        β                                                              δ

                                               =⇒

                 ÙÖ º½ ÊÓØ ÓÒ Ý ÓÐÓÖ ÓÒ Ô Ö Ö ×Ø ÙÖ Ö ÓÒ                    ÓÒ ÖÓ

     ´ µ × × ØÙ ÓÒ × ÐÙ×ØÖ Ò Ð ¬ ÙÖ º½ ¸ × ÔÖ × ÒØ Ù Ò Ó p¸ pp Ý ppp ÒÓ ×Ø Ò
         ÓÑÔÐ Ø Ñ ÒØ Ð Ò Ó׺ Ä ×ÓÐÙ ÓÒ ÓÒ× ×Ø Ò ÙÒ Ó Ð ÖÓØ ÓÒ ÖÙÞ
           p       Ð Ð Ó sppº Ò ×Ø ×Ó¸ p Ú Ò Ð Ö Þ Ð ×Ù Ö ÓÐ Ý ÐÓ×
         ÓÐÓÖ × p Ý ppp ×ÓÒ ÒØ Ö Ñ Ó׺
520                                      Cap´        ´
                                                 ıtulo 6. Arboles de b´ squeda equilibrados
                                                                      u

                                    ppp                                 p

                   pp                         spp              pp               ppp

                            p                                                             spp


               α                          δ                α        β       χ

                        β       χ                                                     δ

                                                     =⇒

               ÙÖ º½        Ó Ð ÖÓØ ÓÒ          p   Ý ÓÐÓÖ ÓÒ Ô Ö Ö ×Ø ÙÖ Ö ÓÒ            ÓÒ ÖÓ

             Ò Ð × Ó× × ØÙ ÓÒ × ÒØ Ö ÓÖ ×¸ Ð Ö ÓÐ Ö ×ÙÐØ ÒØ × ÖÓ Ó¹Ò ÖÓ Ý Ð Ð ÓÖ ØÑÓ
           Ø ÖÑ Ò º
          Ð ÙÒ × Ø Ö ÓÒ × ÔÙ Ò Ó ÙÖÖ Ö Ù Ò Ó ×           Ò Ð × ÙÒ Ó ×Ó¸ ÔÙ Ò Ó × Ö
     Ò × Ö Ó ×Ù Ö ×Ø Ð Ö Þº Ù Ò Ó ×ØÓ Ó ÙÖÖ ¸ Ð Ú ÒØÙ Ð Ú ÓÐ ÓÒ Ð ÓÒ ÓÒ
     ÖÓ ×Ñ ÒÙÝ Ó× Ò Ú Ð ×º        ר ÑÓ Ó¸ Ð ÒÙÑ ÖÓ Ñ Ü ÑÓ Ø Ö ÓÒ × ×Ø ÓØ Ó
     ÔÓÖ Ð ÐØÙÖ Ð Ö ÓÐ Ú          ÒØÖ Ó× ´h/2µº
     6.5.1.2   Eliminaci´n en un arbol rojo-negro
                        o        ´

      Ò ÔÖ Ò Ô Ó¸ Ð Ð Ñ Ò ÓÒ × × Ñ Ð Ö Ð         ÙÒ Ö ÓÐ Ò Ö Ó ×Ø Ò Öº ÄÙ Ó¸ × ×
     Ò × Ö Ó¸ × Ö Ð Þ Ò ÐÓ× Ùר × ÕÙ Ö ×Ø ÙÖ Ò Ð × ÓÒ ÓÒ × ÖÓÑ Ø ×º
¾¼    Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Rb Tree<Key> ½ +≡                  ´½µ ½
      Node* remove(const Key & key)
      {
        if (root == Node::NullPtr)
          return NULL;
        Node * q = search_and_stack_rb(key);
        if (no_equals<Key, Compare> (KEY(q), key)) // ¿clave no encontrada?
          {
            rb_stack.empty();
            return NULL;
          }
        Node * pq = rb_stack.top(1); // padre de 1
        Node * p; // hijo de q luego de que este ha sido eliminado
                                            ´
       repeat:   // Eliminaci´n tradicional en ´rbol binario de b´squeda
                             o                 a                 u
        if (LLINK(q) == Node::NullPtr)
          {
            if (LLINK(pq) == q)
              p = LLINK(pq) = RLINK(q);
            else
              p = RLINK(pq) = RLINK(q);
            goto end;
          }
        if (RLINK(q) == Node::NullPtr)
          {
            if (LLINK(pq) == q)
´
6.5. Arboles rojo-negro                                                                   521



           p = LLINK(pq) = LLINK(q);
         else
           p = RLINK(pq) = LLINK(q);
         goto end;
      }
    find_succ_and_swap(q, pq);
    goto repeat;
   end:
    if (COLOR(q) == BLACK) // ¿se elimin´ un nodo negro?
                                        o
      fix_black_condition(p);
    q->reset();
    rb_stack.empty();
    return q;
  }
Í× × find succ and swap¸ fix black condition ¾¾¸ Ò            search and stack rb   ½ º
    Ä ÖÙØ Ò Ù× Ð Ð Ú Ð Ú Þ ÕÙ ÑÔ Ð Ð Ñ ÒÓ Ù×ÕÙ º Ð ÒÓ Ó Ð Ñ Ò Ö
 × ÐÐ Ñ Ó q Ý ×Ù Ô Ö pqº Ð while ÑÔÐ ÒØ Ð Ð Ñ Ò ÓÒ ×            Ð ÒÓ Ó¸ Р٠и
 ר × ÐØÙÖ × Ð ×ØÙ Ó¸        × Ö ÓÑÔÖ × Ð Ô Ö Ð Ð ØÓÖº ×ÔÙ × Ð Ð Ñ Ò ÓÒ
 × ¸ Ü ×Ø Ð Ö × Ó Ú ÓÐ ÓÒ Ð ÓÒ ÓÒ Ò Ö ¸ ÔÙ × Ð ÒÓ Ó Ð Ñ Ò Ó ÔÙ
× Ö × Ó Ò ÖÓ¸ ÐÓ ÕÙ ÔÖÓÚÓ ÙÒ Ô Ö        Ò ÐØÙÖ Ò Ö º Ò Ð ÒØ ¸ ÐÐ Ñ Ö ÑÓ× p Ð
ÒÓ Ó Ð Ù Ð ÔÙ Ø Ò Ö ÙÒ ¬ Ø Ò ÒÓ Ó× Ò ÖÓ׺
    find succ and swap() ÒØ Ö Ñ     q ÓÒ ×Ù ×Ù ×ÓÖ Ò¬ Óº Ä ÖÙØ Ò × ×ØÖÙ ØÙÖ Ð¹
Ñ ÒØ ÒØ         Ð Ú Ö× ÓÒ Ô Ö Ö ÓÐ × ÎÄ ´Ü º º½º¾ ´Ô Ò ¼¾µµº
    find succ and swap()       × Ö Ñ Ð Ö Ð Ð ØÓÖº Ð ÙÒ Ó ÔÙÒØÓ Ö ÓÖ Ö × ÕÙ
× × Ð Ñ Ò ÙÒ ÒÓ Ó ÓÑÔÐ ØÓ¸ ÒØÓÒ × Ð ×Ù ×ÓÖ ¹Ó ÔÖ        ×ÓÖ¹ ÕÙ × ×Ùר ØÙÝ
  Ö Ö Ð Ñ ×ÑÓ ÓÐÓÖ Ð ÒÓ Ó Ð Ñ Ò Óº          ר Ñ Ò Ö ¸ Ð Ú ÓÐ ÓÒ Ú ÒØÙ Ð Ó ÙÖÖ
×Ó Ö ÙÒ ÒÓ Ó ÕÙ ÓÒ ÖØ Þ × Ò ÓÑÔÐ ØÓº
                                              pp

                                      p                  sp
                                      ¹
                                  α       β

                                                   snp    np



                     ÙÖ º¾¼ ÓÒ                 Ñ Ð Ö × ÓÒ ÒØ ×             ÒÓ Ó ÖÓ Ó

    Ä Ð Ñ Ò ÓÒ ×Ø Ò Ö Ò ÙÒ      × ÑÔÖ × Ö Ñ Ø Ð Ð Ñ Ò ÓÒ ÙÒ ÒÓ Ó ÙÝÓ
Ô Ö × Ò ÓÑÔÐ ØÓº Ä         × ØÙ Ö ÙÒ ÓÖØÓ¹ Ö Ù ØÓ ¹Ü º º ´Ô Ò ¿ ¾µ¹        Ð
   Ó q Ð Ù Ð ÒÓÑ Ò ÑÓ× pº Ë q × ÖÓ Ó¸ ÒØÓÒ × Ð Ö ÓÐ Ö ×ÙÐØ ÒØ × ÖÓ Ó¹Ò ÖÓº Ð
ÔÖÓ Ð Ñ ×ÙÖ Ù Ò Ó q × Ò ÖÓ¸ ÔÙ × × Ú ÓÐ Ð ÓÒ ÓÒ Ò Ö º Ò ×Ø ×Ó¸ Ö ÑÓ×
ÕÙ Ü ×Ø ÙÒ ¬ Ø ÙÒ ÒÓ Ó Ò ÖÓ Ò Ð Ñ ÒÓ × Ð Ô Ö Ð ÒÓ Ó Ð Ñ Ò Ó ×Ø
pº    Ñ Ò Ö Ò Ö Ð¸ Ð ×ØÖ Ø     Ö ×Ø ÙÖ ÓÒ Ð ÓÒ ÓÒ Ò Ö × Ò ÓÒØÖ Ö ÙÒ
ÒÓ Ó ÖÓ Ó Ò Ð × ÒÑ   ÓÒ × p Ø Ð ÓÑÓ × Ò      Ò Ð ¬ ÙÖ º¾¼º Ë × Ò Ù ÒØÖ Ø Ð
ÒÓ Ó¸ ÒØÓÒ × ×Ø ÔÙ Ô × Ö×          Ð Ð Ó Ð ¬ Ø Ý ÓÐÓÖ ÖÐÓ Ò ÖÓ Ô Ö ×
 ÓÑÔ Ò× Ö Ð ¬ غ Ð ØÖ Ó × Ö Ð Þ Ó ÔÓÖ Ð ÖÙØ Ò fix black condition()¸ Ð Ù Ð
522                                    Cap´        ´
                                               ıtulo 6. Arboles de b´ squeda equilibrados
                                                                    u



     ØÓÑ ÓÑÓ ÒØÖ ÙÒ ÒÓ Ó p ÓÒ ÙÒ ¬ Ø Ò ÙÒ ÒÓ Ó Ò ÖÓ ÕÙ                         × Ö Ö ×Ø ÙÖ Óº
     Ä × Ð × ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓº
        Ä ×ØÖÙ ØÙÖ Ð ÖÙØ Ò × Ð × Ù ÒØ
¾¾    Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Rb Tree<Key> ½ +≡          ´½µ                   ½
      void fix_black_condition(Node * p)
      {
        if (COLOR(p) == RED) // ¿p es rojo?
          {     // s´ ==> lo pintamos de negro y terminamos
                    ı
            COLOR(p) = BLACK; // esto compensa el d´ficit
                                                    e
            return;
          }
        Node * pp = rb_stack.popn(2); // padre de p
        while (p != root)
          {
            Node * sp = LLINK(pp) == p ? RLINK(pp) : LLINK(pp); // hermano de p
            if (COLOR(sp) == RED) // ¿hermano de p es rojo?
                   ÖÓØ Ö ×Ô         Ð Ð Ó Ô ÒØ Ö Ñ Ö ×Ù× ÓÐÓÖ × ¾¿
                   Ð ÙÐ Ö ÐÓ× ×Ó Ö ÒÓ× Ô ´ Ó× ×Ôµ ¾¿
                 if (COLOR(np) == RED) // ¿np es rojo?
                   {
                     ÖÓØ Ö ×Ô       Ô¸ Ö ÖÐ ÓÐÓÖ      ÔÔ Ý Ô ÒØ Ö Ò ÖÓ ÒÔ Ý ÔÔ ¾
                    return;
                   }
                 if (COLOR(snp) == RED) // ¿snp es rojo?
                   {
                     ÖÓØ Ö Ó Ð     ×ÒÔ Ý Ô ÒØ Ö   Ò ÖÓ ÔÔ ¾   ;
                     return;
                   }
                 if (COLOR(pp) == RED) // ¿pp es rojo?
                   {
                      ÒØ Ö Ñ Ö ÓÐÓÖ × Ô Ý ÔÔ ¾ ;
                     return;
                   }
                     // no hay nodo rojo en las adyacencias de p ==> desplazar el
                     // d´ficit hacia pp y repetir la iteraci´n
                         e                                   o
                 COLOR(sp) = RED;
                 p         = pp;
                 pp        = rb_stack.pop();
             }
      }
      ¬Ò ×
      fix black condition¸    Ù×   Ò ÙÒ ¾¼º
        Ä ÖÙØ Ò ÓÑ ÒÞ ÔÓÖ Ú ÐÙ Ö × Ð ÒÓ Ó ¬ Ø Ö Ó × ÖÓ Ó Ò × ×Ó ×Ø ÓÒ
     Ô ÒØ Ö p Ò ÖÓ Ý Ð Ö ÓÐ Ò Ö Ð × ÖÓ Ó¹Ò ÖÓ × ØÙ ÓÒ Ý ÓÖÖ ÓÒ ÐÙ×ØÖ × Ò Ð
     ¬ ÙÖ º¾½º
           Ò Ð ×Ó ÓÒØÖ Ö Ó¸ Ð Ð ÓÖ ØÑÓ ÒØÖ Ò ÙÒ ÐÓ ÕÙ Ù× ÙÒ ÒÓ Ó ÖÓ Ó Ò Ð ÞÓÒ
      ÒÑ Ö      Ò Ð ¬ ÙÖ º¾¼ Ô Ö ÒØ ÒØ Ö ×Ùר ØÙ Ö Ð ÒÓ Ó Ò ÖÓ Ý × ÓÑÔ Ò× Ö Ð ¬ غ
     Ä Ø Ö ÓÒ Ü Ñ Ò ÐÓ× ÒÓ Ó× Ð ÞÓÒ Ò Ð ÓÖ Ò sp¸ np¸ snp Ý pp¸ × ÙÒ ÐÓ× × Ù ÒØ ×
       ×Ó×
´
 6.5. Arboles rojo-negro                                                                        523

                                pq
                                RN
                                          q                                pq
                                               ←−
                                               Nodo a eliminar             RN
                                     p                                           p

                                                                  =⇒
                           ÙÖ º¾½ Ð Ñ Ò ÓÒ                ÙÒ ÒÓ Ó Ò ÖÓ ÓÒ            Ó ÖÓ Ó

     ½º   sp   ÖÓ Ó Ð × ØÙ ÓÒ Ý ×Ù ÓÖÖ              ÓÒ × ÑÙ ×ØÖ Ò Ò Ð ¬ ÙÖ º¾¾º
                                                                            sp

                                pp                                    pp
                                                                                         δ
                      p     -            sp                   p   -
                                                                                χ

                       α         β         χ        δ         α        β
                                                        =⇒

                                         ÙÖ º¾¾         ×Ó Ù Ò Ó sp × ÖÓ Ó

¾¿        ÖÓØ Ö ×Ô          ÐÐ Ó          Ô     ÒØ Ö Ñ Ö ×Ù× ÓÐÓÖ × ¾¿          ≡       ´ ¾¾µ
           {
                Node *& ppp = rb_stack.top(); // abuelo de p
                if (LLINK(pp) == p)
                  {
                    sp = LLINK(sp);
                    ppp = rotate_to_left(pp, ppp);
                  }
                else
                  {
                    sp = RLINK(sp);
                    ppp = rotate_to_right(pp, ppp);
                  }
                COLOR(ppp) = BLACK;
                COLOR(pp) = RED;
           }

           ר       ÓÒ ÙÑ ÒØ Ð ÒÓ Ó ¬ Ø Ö Ó Ò ÙÒ Ò Ú Ð¸ Ô ÖÓ   ÕÙ Ð ÒÙ ÚÓ ÖÑ ÒÓ
             p × Ò ÖÓ Ý ÕÙ ÒØÖ Ò Ð ÞÓÒ       Ñ Ð Ö × ÓÒ ÒØ × × Ö Ø Ò Ð ¬ ÙÖ º¾¼º
          Ë sp × Ò ÖÓ¸ ÒØÓÒ × Ý ÕÙ Ö Ú × Ö ×Ù× ×Ó Ö ÒÓ׸ Ô ÖÓ ÒØ ׸ × Ò × Ø Ð Ù¹
          Ð ÖÐÓ× Ð × Ù ÒØ Ñ Ò Ö
¾¿           Ð ÙÐ Ö ÐÓ× ×Ó Ö ÒÓ× Ô ´ Ó× ×Ôµ ¾¿ ≡                  ´ ¾¾µ
           Node * np, * snp; // sobrinos de nodo p
           if (LLINK(pp) == p) // ¿p es hijo izquierdo?
             {     // s´ ==> que sp es hijo derechos
                       ı
               np = RLINK(sp);
524                                  Cap´        ´
                                             ıtulo 6. Arboles de b´ squeda equilibrados
                                                                  u



               snp = LLINK(sp);
             }
           else
             {
               np = LLINK(sp);
               snp = RLINK(sp);
             }

¾º    ÖÓ Ó Ð × ØÙ ÓÒ × ÐÙ×ØÖ Ò Ð ¬ ÙÖ º¾¿ Ý × ÒØ ¬ ÔÓÖÕÙ np ר Ð Ò Ó
     np
         Ð Ö       ÓÒ spº Ä ×ÓÐÙ ÓÒ ÓÒ× ×Ø Ò ÖÓØ Ö sp  Ð Ð Ó p Ý ÓÐÓÖ Ö
   Ò ÖÓ np Ý ppº ÓÒ ×ØÓ Ò ÑÓ× Ð ÒÓ Ó Ò ÖÓ pp Ò Ð Ñ ÒÓ       p¸ ÐÓ ÕÙ ÓÑÔ Ò×
    Ð ¬ غ
 ¾        ÖÓØ Ö ×Ô    Ô¸ Ö ÖÐ ÓÐÓÖ ÔÔ Ý Ô ÒØ Ö Ò ÖÓ ÒÔ Ý ÔÔ ¾ ≡ ´ ¾¾µ
           Node * ppp = rb_stack.top();
           if (RLINK(sp) == np)
             rotate_to_left(pp, ppp);
            else
             rotate_to_right(pp, ppp);
           COLOR(sp) = COLOR(pp);
           COLOR(pp) = BLACK;
           COLOR(np) = BLACK;
                           pp                                                        sp
                           RN                                                        RN
                   p                                                        pp
                                     sp                                                           np
                   -
                                                                    p
                                             np

              α        β        χ                                                χ        δ

                                     δ                      α           β

                                                  =⇒

                                    ÙÖ º¾¿        ×Ó Ù Ò Ó np × ÖÓ Ó

¿º snp ÖÓ Ó Ð      × ØÙ ÓÒ × ÐÙ×ØÖ Ò Ð ¬ ÙÖ            º¾   × ÑÙÝ × Ñ Ð Ö Ð                    ÒØ Ö ÓÖ Ü ÔØÓ
   ÕÙ ÒÓ Ý         Ð Ò ÓÒ ÓÑÔÐ Ø          Ð Ö           º Ä ×ÓÐÙ ÓÒ Ø Ñ Ò                      × × Ñ Ð Ö ÖÓØ Ö
   snp Ó× Ú       ×      Ð Ð Ó p Ý ÐÙ Ó ÓÐÓÖ           Ö Ò ÖÓ pp Ý spº Ð                        Ù Ð ÕÙ Ð ×Ó
    ÒØ Ö ÓÖ¸ Ð      ÒÒ      Ð ÒÓ Ó Ò ÖÓ pp Ò Ð         Ñ ÒÓ      p ÓÑÔ Ò×                     Ð ¬ غ
 ¾        ÖÓØ Ö    Ó Ð ×ÒÔ Ý Ô ÒØ Ö Ò ÖÓ ÔÔ            ¾        ≡                         ´ ¾¾µ
           Node * ppp = rb_stack.top();
           if (LLINK(sp) == snp)
             {
               rotate_to_right(sp, pp);
               rotate_to_left(pp, ppp);
             }
           else
             {
               rotate_to_left(sp, pp);
´
    6.5. Arboles rojo-negro                                                                              525



                  rotate_to_right(pp, ppp);
                }
              COLOR(snp) = COLOR(pp);
              COLOR(pp) = BLACK;
                      pp                                                             snp
                      RN                                                              RN
              p                          sp                                 pp                 sp
              -
                               snp            np                   p                                np


         α        β                                                              χ         δ

                           χ         δ             φ           α        β                                φ

                                                         =⇒

                                         ÙÖ º¾          ×Ó Ù Ò Ó snp × ÖÓ Ó

º   pp  ÖÓ Ó Ð × ØÙ ÓÒ × ÑÙ ×ØÖ Ò Ð ¬ ÙÖ º¾ Ý × Ö ×Ù ÐÚ ÒØ Ö Ñ Ò Ó ÐÓ× ÓÐÓÖ ×
         pp ÓÒ spº ×ÔÙ × ×Ø Ùר ¸ Ð Ñ ÒÓ         p Ò ÙÒ ÒÓ Ó Ò ÖÓ ØÖ Ú ×
     ×Ù Ô Ö ¸ Ñ ÒØÖ × ÕÙ Ð Ñ ÒÓ        sp Ô ÖÑ Ò   ÓÒ Ð Ñ ×Ñ ÒØ        ÒÓ Ó×
     Ò ÖÓ׺ ר Ùר ×ÓÐÓ ÔÙ Ö Ð Þ Ö× × × Ò Ú ÐÙ Ó ÐÓ× ×Ó× ÒØ Ö ÓÖ ×¸ ÔÙ × ×
     ÔÓ Ö Ú ÓÐ Ö Ð ÓÒ ÓÒ ÖÓ × Ð ÙÒÓ ÐÓ× ×Ó Ö ÒÓ× p Ù × ÖÓ Óº
    ¾       ÒØ Ö Ñ Ö ÓÐÓÖ × Ô Ý ÔÔ ¾ ≡                        ´ ¾¾µ
              COLOR(pp) = BLACK;
              COLOR(sp) = RED;
                                         pp                        pp

                                     p        sp               p            sp
                                     -
                                      snp          np           snp              np

                                                         =⇒

                                     ÙÖ º¾       ×Ó Ù Ò Ó Ð Ô Ö             p   × ÖÓ Ó

º Æ Ò ÙÒÓ ÐÓ× Ñ Ð Ö × × ÖÓ Ó × ÐÓ× ×Ó× ÒØ Ö ÓÖ × ÐÐ Ò¸ ÒØÓÒ × ÒÓ Ý ÒÓ Ó× ÖÓ Ó×
   Ò Ð ÞÓÒ ÒÑ Ö         Ò Ð ¬ ÙÖ º¾¼º ÒØ ר × ØÙ ÓÒ¸ Ð ÙÒ × Ð × ×ÔÐ Þ Ö
   Ð ¬ Ø          ÐÔ Ö      p Ý ÐÙ Ó Ö Ô Ø Ö Ð ÔÖÓ Ñ ÒØÓ ÒØ Ö ÓÖ ÓÒ p = ppº Ð
     ×ÔÐ Þ Ñ ÒØÓ¸ ÐÙ×ØÖ Ó Ò Ð ¬ ÙÖ º¾ ¸ ÓÒ× ×Ø × ÑÔÐ Ñ ÒØ Ò ÓÐÓÖ Ö sp ÖÓ Óº
    ÓÒ ×ØÓ Ð Ñ Ò ÑÓ× ÙÒ ÒÓ Ó Ò ÖÓ Ô ÖØ Ö sp Ý ØÖ ×Ð ÑÓ× Ð ¬ Ø          ppº

         Ð Ð ÓÖ ØÑÓ Ø Ö × ÒÓ × Ò Ù ÒØÖ Ò ÒÓ Ó× ÖÓ Ó× Ò Ð ÞÓÒ ÒÑ Ö         ÒÐ
    ¬ ÙÖ º¾¼º Ä ÒØ       Ñ ÜÑ    Ø Ö ÓÒ × Ô Ò        × Ý Ó ÒÓ ÒÓ Ó× ÖÓ Ó× Ò Ð ×
     ÒÑ      ÓÒ × Ð Ñ ÒÓ Ù×ÕÙ       Ð Ð Ú Ð Ñ Ò º Ò Ð Ô ÓÖ ÐÓ× ×Ó׸ ÔÙ
    × Ö Ò × Ö Ó ×Ù Ö ×Ø Ð Ö Þº Ò ×Ø × ØÙ ÓÒ¸ Ð ¬ Ø Ó ÙÖÖ Ô Ö ØÓ Ó× ÐÓ× Ñ ÒÓ×
      × Ð Ö Þ ×Ø Ù ÐÕÙ Ö ÒÓ Ó ÒÙÐÓ¸ ÔÓÖ ÐÓ ÕÙ ÒÓ Ý Ú ÓÐ ÓÒ Ð ÓÒ ÓÒ Ò Ö º
526                             Cap´        ´
                                   ıtulo 6. Arboles de b´ squeda equilibrados
                                                        u

                        pp                             pp
                                                       -
                     p         sp                  p           sp
                     -
                      snp           np             snp              np

                                         =⇒

                     ÙÖ º¾     ×ÔÐ Þ Ñ ÒØÓ Ð ¬ Ø                         ÔÔ

     Ð Ñ ÒÓ Ñ × Ð Ö Ó ×     Ù Ò Ó Ð Ð Ñ Ò ÓÒ Ó ÙÖÖ Ò ÙÒ    Ð× Ó ×Ñ×
ÔÖÓ ÙÒ × Ò ÐØÙÖ Ò Ö º ×ØÓ ÑÔÐ ÕÙ Ð Ð Ó ÓÔÙ ×ØÓ p Ð Ö ÓÐ           ר Ö
Ô Ö Ø Ñ ÒØ Ð Ò Ó¸ ÔÙ × × ÒÓ Ð ÞÓÒ ÒÓ × Ö ÓÑÔÐ Ø Ñ ÒØ Ò Ö º Ð Ð Ñ º
ÒÓ× ÑÓ×ØÖ Ö ÕÙ Ð ÐØÙÖ    Ð ÞÓÒ ÓÑÔÐ Ø Ñ ÒØ Ò Ö × h/2 Ô Ö Ð Ô ÓÖ Ö Óк
Ä ÔÖÓÔÓ× ÓÒ º ÒÓ× ÑÓ×ØÖ Ö ÕÙ Ð ÐØÙÖ Ñ Ü Ñ × 2 Ð (n + 2) − 2º × Ô٠׸ Ð
 Ð Ñ Ò ÓÒ × O(Ð n) Ô Ö Ð Ô ÓÖ ×Óº

6.5.2   An´lisis de los ´rboles rojo-negro
          a             a
   ÓÑ Ò ÑÓ× ÔÓÖ Ö ÓÖ Ö ÕÙ Ð ÓÒ ÓÒ Ò Ö Ö ÒØ Þ ¸ ÔÓÖ × Ñ ×Ñ ¸ ÙÒ Ð Ò
Ò Ú Ð ÒÓ Ó× Ò ÖÓ׺ Ë ×ÓÐÓ × Ù ÒØ Ò ÐÓ× ÒÓ Ó× Ò ÖÓ׸ ÒØÓÒ ×¸ Ô Ö          ÒÓ Ó¸
Ð     ÖÒ         ÐØÙÖ × ÒØÖ Ð × Ó× Ö Ñ × × ÖÓº      Ó Ð ÐØÙÖ Ò Ö ¸ Ð Ö ÓÐ ×Ø
Ô Ö Ø Ñ ÒØ ÕÙ Ð Ö Óº Ð Ò Ð × × × Ò Ó ¸ ÒØÓÒ ×¸ Ò ×ØÙ Ö Ð ÑÔ ØÓ ÐÓ×
ÒÓ Ó× ÖÓ Ó× ×Ó Ö Ð ÐØÙÖ ÐÓ Ð Ð Ö Óк
    ÈÓÖ Ð ÓÒ ÓÒ ÖÓ ¸ Ð ÐØÙÖ           ÜÔÖ × Ö× Ò ÙÒ ÓÒ ÒÓ Ó× Ò ÖÓ׸ ÔÙ × ÒÓ
ÔÙ Ò         Ö Ó× ÒÓ Ó× ÖÓ Ó× ÓÒ× ÙØ ÚÓ׺ Ð ÒÙÑ ÖÓ Ñ Ü ÑÓ ÒÓ Ó× ÖÓ Ó× ÒÚÓÐÙ¹
  Ö Ó× ÒÓ ÔÙ     Ü Ö¸ Ô٠׸ Ð ÒÙÑ ÖÓ ÒÓ Ó× Ò ÖÓ× Ñ × ÙÒÓº Ñ Ò Ö ÒØÙ Ø Ú
ÔÓ ÑÓ× Ö ÕÙ Ò Ð Ô ÓÖ ×Ó Ð ÐØÙÖ Ñ Ü Ñ ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ ×Ø Ø ÖÑ ¹
Ò ÔÓÖ Ð ÐÓÒ ØÙ Ñ Ü Ñ Ò ÒÓ Ó× Ò ÖÓ× ÑÙÐØ ÔÐ             ÔÓÖ Ó׺ × Ö¸ ×ÙÑ ÑÓ×
ÕÙ Ð Ñ ÒÓ Ð Ö Ñ Ñ × Ð Ö ×Ø Ö ÔÐ ØÓ ÒÓ Ó× ÖÓ Ó× ÒØ Ö Ð Ó× ÒØÖ ÒÓ Ó×
Ò ÖÓ׺
     ÓÒ ×Ø × Ó × ÖÚ ÓÒ × Ò Ñ ÒØ ¸ ר ÑÓ× Ð ×ØÓ× Ô Ö ÒÙÒ Ö Ð ÔÖÓÔÓ× ÓÒ × Ù ÒØ º
Proposici´n 6.9 ´
         o          Ù ×ÝË     Û      ¹½       µË       T   ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ ÓÒ n ÒÓ Ó× Ý
 ÐØÙÖ hº ÒØÓÒ ×
                              h ≤ 2 Ð (n + 2) − 2                       ´ º¿½µ
Demostraci´n
           o     Ð Ò ÓÕÙ × × Ñ Ð Ö Ð ÙØ Ð Þ Ó Ò ÐÓ× Ö ÓÐ × ÎÄ ´ÔÖÓÔÓ× ÓÒ º µº
 × Ö¸ Ú ÑÓ× Ø ÖÑ Ò Ö Ù Ð × Ð Ö ÓÐ ÖÓ Ó¹Ò ÖÓ ÐØÙÖ h ÓÒ Ð Ñ Ü ÑÓ ÒÙÑ ÖÓ
  ÒÓ Ó׺ È Ö ÐÐÓ¸     ÑÓ× ÒØ ¬ Ö ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ö Ø Óº
               ´
Definici´n 6.9 (Arbol rojo-negro cr´
       o                          ıtico)      Ë T ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ      ÐØÙÖ h(T )º
Ë     ÕÙ T × Ö Ø Ó × Ý ×ÓÐÓ × Ð ÕÙ Ø ÖÐ       ÙÒ Ó Ð Ö ÓÐ           × Ö ÖÓ Ó¹Ò ÖÓ Ó
Ô Ö    ÐØÙÖ º
     Ð Ù Ð ÕÙ ÓÒ ÐÓ× Ö ÓÐ × Îĸ Ð Ö Ò Ð      ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ö Ø Ó ×
Ñ Ò Ñ Ð ÐØÙÖ h(T ) × Ö¸ × T × Ö Ø Ó¸ ÒÓ × ÔÓ× Ð Ø Ò Ö ÙÒ Ö ÓÐ Ð Ñ ×Ñ
 ÐØÙÖ ÓÒ Ñ ÒÓÖ ÒØ        ÒÓ Ó׺
´
6.5. Arboles rojo-negro                                                           527



       ÓÖ ÔÖÓ ÑÓ× ×ØÙ Ö Ù ÒØÓ× ÒÓ Ó× Ø Ò ÙÒ Ö ÓÐ Ö Ø Ó Ò ÙÒ ÓÒ                     ×Ù
 ÐØÙÖ º ÈÖ Ñ ÖÓ ÓÑ Ò ÑÓ× ÔÓÖ Ó × ÖÚ Ö Ð × Ö Ò × ÐØÙÖ Ò ÐÓ× ÒÓ Ó×                   ÙÒ
 Ö ÓÐ Ö Ø Óº
Lema 6.4  Ë T ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ö Ø Ó       ÐØÙÖ h(T ) > 1 ÓÒ Ö Ñ × Ä(T ) Ý Ê(T )
Ö ×Ô Ø Ú Ñ ÒØ º ÒØÓÒ × h(Ä(T )) = h(Ê(T ))º
Demostraci´n (por reducci´n al absurdo) ËÙÔÓÒ ÑÓ× ÕÙ Ü ×Ø ÙÒ Ö ÓÐ ÖÓ Ó¹
           o              o
Ò ÖÓ Ö Ø Ó ÓÒ h(Ä(T )) = h(Ê(T ))º ÈÙ ×ØÓ ÕÙ h(T ) > 1¸ ÔÓ ÑÓ× Ö ÑÔÐ Þ Ö
 Ù ÐÕÙ Ö Ð × Ö Ñ × ÔÓÖ ÓØÖÓ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ñ × Ô ÕÙ ÒÓ Ò ÐØÙÖ Ý Ö Ò Ð ¸ ÐÓ
ÕÙ ÖÖÓ Ö ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ         Ö ÒÐ      Ò Ö ÓÖº ×ØÓ Ù× ÙÒ ÓÒØÖ          ÓÒ¸
ÔÙ × ÑÓ× Ó ÕÙ T × Ö Ø Óº Ð Ð Ñ × ÔÙ × ÖØÓ
      ÓÖ Ú ÑÓ× Ù ÒØÓ× ×Ù Ö ÓÐ × Ö Ø Ó× Ü ×Ø Ò ÒØÖÓ ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ö Ø Óº
Lema 6.5 Ë T ÙÒ         Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ö Ø Ó       ÐØÙÖ h(T ) > 1º ÒØÓÒ ×¸ h(Ê(T )) =
h(T ) − 1 =⇒ Ê(T ) ×    Ö Ø Ó Ý ÔÓÖ ÐÓ Ø ÒØÓ Ñ Ò ÑÓº
    Ä × ØÙ ÓÒ × Ñ ØÖ ¸ × Ö¸ × h(Ä(T )) = h(T ) − 1¸ × ÕÙ Ú Ð ÒØ º
Demostraci´n (por reducci´n al absurdo) ËÙÔÓÒ ÑÓ× ÕÙ T × Ö Ø Ó Ý ÕÙ Ê(T ))
             o                  o
ÒÓ × Ö Ø Óº ÒØÓÒ ×¸ Ê(T ) ÔÓ Ö × Ö Ö ÑÔÐ Þ Ó ÔÓÖ ÙÒ ×Ù Ö ÓÐ T , h(T ) = h(T ) − 1
Ø Ð ÕÙ |T | < | Ê(T )|º ×ØÓ ÑÔÐ Ö ÕÙ T Ø Ò Ñ ÒÓ× ÒÓ Ó× Ð Ñ ×Ñ ÐØÙÖ ¸ ÐÓ Ù Ð
 × ÙÒ ÓÒØÖ         ÓÒ ÓÒ Ð ×ÙÔÓ× ÓÒ ÕÙ T × Ö Ø Ó
     ÓÒ ×Ø Ð Ñ ¸ ÔÓ ÑÓ× ×ØÙ Ö Ð ÓÑÔÓ× ÓÒ ÖÓÑ Ø                            ÙÒÓ ÐÓ×
×Ù Ö ÓÐ × ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ö Ø Óº
Lema 6.6 Ë     T   ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ö Ø Ó      ÐØÙÖ   h(T ) > 1º   ÒØÓÒ ×¸ h(Ê(T )) =
h(T ) − 1 =⇒

  ½º Ä(T ) ÒÓ Ø Ò ÒÓ Ó× ÖÓ Ó׺
  ¾º Ä(T ) × ÙÒ Ö ÓÐ Ô Ö Ø Ñ ÒØ ÕÙ Ð Ö Ó Ý ÓÑÔÐ ØÓº
Demostraci´n
          o

   ½º Ë Ä(T ) Ø Ò ÙÒ ÒÓ Ó ÖÓ Ó¸ ÒØÓÒ × ×Ø ÒÓ Ó ÔÙ × Ö ×ÙÔÖ Ñ Ó Ý ×Ùר ØÙ Ó ÔÓÖ
       Ð Ö ÓÐ Ú Óº Ð Ö ÓÐ Ö ×ÙÐØ ÒØ × ÖÓ Ó¹Ò ÖÓ Ô ÖÓ Ø Ò Ñ ÒÓ× ÒÓ Ó׸ ÐÓ ÕÙ Ú ÓÐ
      Ð ×ÙÔÓ× ÓÒ ÕÙ T × Ö Ø Óº
   ¾º ÈÙ ×ØÓ ÕÙ Ä(T ) ×ÓÐÓ ÓÒØ Ò ÒÓ Ó× Ò ÖÓ׸ Ð ÙÒ ÓÖÑ ÔÖ × ÖÚ Ö Ð ÓÒ ÓÒ
      Ò Ö × ÕÙ Ä(T ) × Ô Ö Ø Ñ ÒØ ÕÙ Ð Ö Ó Ý ÓÑÔÐ ØÓ
     ר Ð Ñ ÑÙ ×ØÖ ÕÙ Ð ÓÖÑ ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ö Ø Ó × Ð Ð ¬ ÙÖ º¾ º
  × Ö¸ Ð Ö Ñ Ñ ÒÓÖ ÐØÙÖ × ÒØ Ö Ñ ÒØ Ò Ö Ý Ô Ö Ø Ñ ÒØ Ð Ò                       º ÆÓØ
ÕÙ Ð Ð Ñ º Ø Ñ Ò Ò ÕÙ Ð ÓÖÑ Ð ×Ù Ö ÓÐ Ö Ó Ð ¬ ÙÖ º¾ ׸ Ò
Ø ÖÑ ÒÓ× Ö ÙÖ× ÚÓ׸ × Ñ Ð Ö Ð ¬ ÙÖ º¾ º ר Ó × ÖÚ ÓÒ × ÑÙÝ ÑÔÓÖØ ÒØ ÔÓÖÕÙ
ÒÓ× Ô ÖÑ Ø Ö Ð ÙÐ Ö ÙÒ ÓØ Ð ÒØ                  ÒÓ Ó× ÒÓ Ó× ÕÙ Ø Ò ÙÒ Ö ÓÐ Ö Ø Ó
 Ò ÙÒ ÓÒ ×Ù ÐØÙÖ º
    Ë T × ÖÓ Ó¹Ò ÖÓ¸ ÒØÓÒ × (Ä(T )) = (Ê(T ))º Ë ¸ Ñ ×¸ T × Ö Ø Ó¸ ÒØÓÒ ×
   (Ê(T )) = h(Ä(T ))¸ Ô٠׸ ÔÓÖ Ð Ð Ñ º ¸ Ä(T ) ×ÓÐÓ Ø Ò ÒÓ Ó× Ò ÖÓ׺ ÈÓÖ Ð Ð Ñ º ¸
× ÑÓ× ÕÙ h(Ê(T )) = h(T ) − 1º Ð Ñ ×ÑÓ ÑÓ Ó¸ Ø Ñ Ò ÔÓÖ Ð Ð Ñ º ¸ × Ê(T ) ×
 Ö Ø Ó¸ ÒØÓÒ × ×Ø            Ø Ò Ö Ð ÓÖÑ ÑÓ×ØÖ ÔÓÖ Ð Ð Ñ º º
528                                    Cap´        ´
                                          ıtulo 6. Arboles de b´ squeda equilibrados
                                                               u




                               h/2


                                                                  h−1




                       ÙÖ º¾         ÓÖÑ        ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ö Ø Ó

Lema 6.7   Ë   T   ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ö Ø Ó               ÐØÙÖ    h(T ) = hº   ÒØÓÒ ×¸

                                            (T ) =
                                                      h
                                                      2
                                                                                           ´ º¿¾µ
Demostraci´n (por inducci´n sobre la altura h)
          o              o

  ¯ h=0       Ò ×Ø ×Ó 0/2 = 0 Ý Ð ÔÓØ × ×         × ×Ú Ð º
  ¯   h>0      ÓÖ ×ÙÔÓÒ ÑÓ× ÕÙ Ð Ð Ñ × Ú Ð Ó Ô Ö ØÓ Ó Ö ÓÐ Th ÖÓ Ó¹Ò ÖÓ Ö Ø Ó
       ÐØÙÖ h Ý Ú Ö ¬ ÑÓ× × ÙÒ ÐÓ × Ô Ö Ð Ö ÓÐ Th+1 ÐØÙÖ h+1º Ä ÑÓ×ØÖ ÓÒ
         ÔÒ Ö Ð         Ó ÕÙ h × Ô Ö Ó ÑÔ Ö
        ½º Ë h × ÑÔ Ö =⇒ h + 1 × Ô Öº Ò ×Ø ×Ó¸ × ÓÐÓÖ ÑÓ× Ò ÖÓ Ð Ö Þ
           Th+1 Ø Ò ÑÓ×

                                 (Th+1) =            (Th) + 1 =⇒
                                                     h     h−1
                                            =          +1=     + 1 =⇒
                                                     2      2

                                                 h+1             h+1
                                            =
                                                  2
                                                     =
                                                                  2
                                                                                           ´ º¿¿µ

           Ð Ð Ñ × Ú Ð Ó Ô Ö h ÑÔ Öº
       ¾º Ë h × Ô Ö =⇒ h + 1 × ÑÔ Öº Ò ×Ø                       ×Ó¸ × ÓÐÓÖ ÑÓ×      ÖÓ Ó Ð Ö Þ
          Th+1 Ø Ò ÑÓ×

                                           (Th+1) =             (Th) =⇒
                                                                   h+1
                                                     =
                                                          h
                                                          2
                                                            =
                                                                    2
                                                                                           ´ º¿ µ

            Ð Ð Ñ × Ú Ð Ó Ô Ö h¸ Ô Ö Ó ÑÔ Ö
   Ä ÑÓ×ØÖ ÓÒ Ð Ð Ñ º               ÔÖ Ò× Ð Ð      Ó ÕÙ Ð ÓÐÓÖ Ð Ö Þ ÙÒ
 Ö ÓÐ ÖÓ Ó¹Ò ÖÓ ÔÙ × Ö Ò ÖÓ ×ÓÐ Ñ ÒØ × Ð ÐØÙÖ Ð Ö ÓÐ × Ô Öº
     Ð Ð Ñ º Ô ÖÑ Ø ÓÑÔÐ Ø Ö Ð ÔÖÙ         Ð Ø ÓÖ Ñ ÔÓÖÕÙ ÓÖ ÔÓ ÑÓ× Ð ÙÐ Ö
ÙÒ ÜÔÖ × ÓÒ ÕÙ Ò ÕÙ Ð ÒØ           ØÓØ Ð ÒÓ Ó× ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ö Ø Óº
   Ë Th × ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ö Ø Ó ÐØÙÖ h¸ ÒØÓÒ ×
                                |Th| = 1 + | Ä(Th)| + | Ê(Th)|                             ´ º¿ µ
´
6.5. Arboles rojo-negro                                                                            529



   ÈÓÖ ÐÓ× Ð Ñ × º Ý º ¸ ×                  ÑÓ× ÕÙ Ä(Th) ×ÓÐÓ Ø Ò ÒÓ Ó× Ò ÖÓ׸ ÔÓÖ Ò
                                             | Ä(Th)| = 2      (h−1)/2
                                                                         −1                       ´ º¿ µ
   ÈÓÖ ÓØÖ Ô ÖØ ¸ ÔÓÖ Ð Ð Ñ º ¸ × ÑÓ× ÕÙ Ê(Th) × Ö Ø Ó Ý ÕÙ ×Ù ÐØÙÖ × h − 1º
ËÙר ØÙ ÑÓ× ´ º¿ µ Ò ´ º¿ µ Ý Ó Ø Ò ÑÓ× ÙÒ Ù ÓÒ Ö ÙÖÖ ÒØ   ÐÑ ÒØ Ö ×ÓÐÙ Ð
                                             |Th| = |Th−1| + 2     (h−1)/2
                                                                                                  ´ º¿ µ
Р٠и Ð ÜÔ Ò Ö |Th−1|
                                |Th| = |Th−2| + 2         (h−2)/2
                                                                     +2   (h−1)/2
                                                                                                  ´ º¿ µ
   ¯   Ë   h   × Ô Ö =⇒
                          |Th| = |Th−2| + 2(h−2)/2 + 2(h−2)/2 = |Th−2| + 2h/2 =⇒
                                                         h/2
                                                |Th| =         2i = 2h/2+1 − 2                    ´ º¿ µ
                                                         i=1

   ¯   Ë   h   × ÑÔ Ö =⇒
                              |Th| = |Th−2| + 2(h−3)/2 + 2(h−1)/2 =⇒
                              |Th| = |Th−2| + 2−1 . 2(h−1)/2 + 2(h−1)/2| =⇒
                              |Th| = |Th−2| + 3 . 2(h−3)/2 =⇒
                                         (h−3)/2
               |Th| = |Th−2| + 3 .                 2i = 1 + 3 . 2(h−3)/2 − 3 = 3 . 2(h−3)/2 − 2   ´ º ¼µ
                                          i=0

    È Ö ÓÑÔÐ Ø Ö Ð ÑÓ×ØÖ ÓÒ¸ × n Ð ÒÙÑ ÖÓ ÒÓ Ó× ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ
 ÐØÙÖ hº n      × Ö Ñ ÝÓÖ Ó Ù Ð Ð ÒÙÑ ÖÓ ÒÓ Ó× Ð Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ö Ø Ó
 ÐØÙÖ hº ÌÓÑ Ò Ó Ð Ñ ÒÓÖ Ø ÖÑ ÒÓ Ö Ó Ð × Ù ÓÒ × ´ º¿ µ Ý ´ º ¼µ ÔÐ ÒØ ÑÓ×
                                                   n ≥ 2h/2+1 − 2 =⇒
                                            n + 2 ≥ 2h/2+1 =⇒
                                     Ð    (n + 2) ≥
                                                    h
                                                    2
                                                       + 1 =⇒
                                                h ≤ 2 Ð (n + 2) − 2

    Ä Ñ Ü Ñ ÐØÙÖ        ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ × ÔÖÓÜ Ñ Ñ ÒØ ÙÒ ¾ ± Ñ × Ö Ò
ÕÙ Ð Ñ Ü Ñ ÐØÙÖ         ÙÒ Ö ÓÐ ÎÄ ´2 Ð (n + 2) Ú Ö×Ù× 1.4404 Ð (n + 2)µº × Ô٠׸
 Ò Ð Ø Ñ ÒØ ¸ Ð × ÑÔ ÒÓ Ð Ù×ÕÙ              Ö × Ö ×ÙÔ Ö ÓÖ Ò ÐÓ× Ö ÓÐ × ÎÄ ÕÙ
 Ò ÐÓ× Ö ÓÐ × ÖÓ Ó¹Ò ÖÓº ÑÔ ÖÓ¸ ר      Ö Ò ÒÓ × × Ò ¬ Ø Ú º Ð × ÑÔ ÒÓ
 Ñ Ó× Ö ÓÐ × × ÑÙÝ × Ñ Ð Öº
530                                 Cap´        ´
                                            ıtulo 6. Arboles de b´ squeda equilibrados
                                                                 u



     6.6    ´
            Arboles splay
     ÄÓ× Ö ÓÐ × Ð ØÓÖ Þ Ó× Ý ÐÓ× ØÖ Ô× × Ò ×Ù× ÕÙ Ð Ö Ó× ×Ó Ö Ð ØÓÑ                   × ÓÒ ×
       Ð ØÓÖ ×º Ò ÔÖÓÑ Ó¸ Ð ÐØÙÖ           רÓ× Ö ÓÐ × Ú Ò ÐÓ Ö ØÑ         ÓÒ ÔÖÓ Ð         ×
     ÑÙÝ × Þ × Ø Ò Ö ÙÒ Ñ Ð ×Óº ÄÓ× Ö ÓÐ × ÎÄ Ý ÖÓ Ó¹Ò ÖÓ × Ò ×Ù× ÕÙ Ð Ö Ó× Ò
     Ö Ð × ×Ô Ð × ÕÙ × Ñ ÒØ Ò Ò Ò Ø ÑÔÓ× ÐÓ Ö ØÑ Ó׺ Ò ×Ø Ð ×                      Ö ÓÐ × Ð
       ÐØÙÖ Ñ Ü Ñ Ý¸ ÔÓÖ Ò ¸ Ð Ø ÑÔÓ              ×Ó¸ ר Ò ÐÓ Ö ØÑ Ñ ÒØ ÓØ Ó׺ Ü ×Ø
     ÙÒ Ø Ö Ö ÐØ ÖÒ Ø Ú         ÕÙ Ð Ö Ó ×       Ò ØÙ Ö ÑÓ ¬ ÓÒ × ×ØÖÙ ØÙÖ Ð × ×Ó Ö
       Ð Ö ÓÐ ÕÙ Ø Ò Ò ÚÓÐÚ ÖÐÓ ÕÙ Ð Ö Óº Ì Ð ÐØ ÖÒ Ø Ú × Ð Ó ØÓ ×ØÙ Ó×
       ר × ÓÒ ÐÓ× Ö ÓÐ × ×ÔРݺ
            ÓÒ× Ö ÑÓ× Ð × ØÖ × ÓÔ Ö ÓÒ × Ð × × ×Ó Ö ÙÒ Ø Ð            × Ñ ÓÐÓ× Ý ÙÒ ÖÖ ÐÓ
     ÕÙ ÐÑ Ò ÐÓ× Ð Ñ ÒØÓ× ×ÓÖ Ò Ñ ÒØ º ÓÑÓ Ú ÑÓ× Ò Ü ¾º½º½ ´Ô Ò ¿½µ¸ Ò
     ÙÒ ÖÖ ÐÓ Ð × ØÖ × ÓÔ Ö ÓÒ × ×ÓÒ O(n)º ÓÖ ÓÒ× Ö ÑÓ× ÙÒ ÑÓ ¬ ÓÒ ×Ó Ö Ð
      ÑÔÐ ÒØ ÓÒ ØÖ ÓÒ Ð             Ú Þ ÕÙ × Ö Ð Þ ÙÒ ×Ó¸ × ÔÓÖ Ù×ÕÙ ¸ Ò× Ö ÓÒ Ó
       Ð Ñ Ò ÓÒ¸ Ð Ð Ñ ÒØÓ × ÓÐÓ Ó Ò Ð ÔÖ Ñ Ö ÔÓ× ÓÒº Ó ×Ø Ö Ð ¸ Ð Ò× Ö ÓÒ Ý
       Ð Ñ Ò ÓÒ Ú Ò Ò O(1) Ô Ö ØÓ Ó× ÐÓ× ×Ó× Ý Ð Ù×ÕÙ             O(n) Ô Ö Ð Ô ÓÖ ×Óº Ë
     Ð ÔÐ ÓÒ Ü           ÐÓ Ð         Ö Ö Ò ¸ ÒØÓÒ × Ð Ù×ÕÙ Ø Ò × Ö O(1)¸ ÔÙ ×
     ÐÓ Ð Ñ ÒØÓ× Ö ÒØ Ñ ÒØ             Ó× × Ò Ù ÒØÖ Ò Ò Ð × ÔÖ Ñ Ö × ÔÓ× ÓÒ × Ð ÖÖ ÐÓº
       ÉÙ Ø Ò Ù Ò × ×Ø Ø Ò ÄÓ× Ò Ð × × ÓÖÑ Ð × Ý ÑÔ Ö Ó× ÑÙ ×ØÖ Ò ÕÙ × ÑÙÝ
       Ù Ò Ò ÑÙ Ó× ×Ó׺ Ù Ò Ó ÒÓ Ý ÐÓ Ð                  Ö Ö Ò ¸ Ð Ù×ÕÙ         × O(n) Ô Ö
     ÐÓ× ×Ó× ÔÖÓÑ Ó Ý Ô ÓÖ¸ ÙÒ × ÑÔ ÒÓ ÔØ Ð ×Ø × Ð × Ñ Ò ×º
           Ë ÔÙ      ÔÐ Ö Ð Ø Ò ÒØ Ö ÓÖ Ô Ö ÐÓ× Ö ÓÐ × Ò Ö Ó×              Ù×ÕÙ      Ä Ö ×¹
     ÔÙ ×Ø × ¬ÖÑ Ø Ú Ý Ð ÔÖ Ñ Ö Ø ÒØ ÓÒ × ÑÓÚ Ö Ð ÒÓ Ó Ö ÒØ Ñ ÒØ                           Ó
         ר Ð Ö Þº Ä Ò× Ö ÓÒ ÓÒ× ×Ø Ö Ò Ò× ÖØ Ö Ò Ð Ö Þ × ÙÒ ÐÓ× Ð ÓÖ ØÑÓ× ×ØÙ¹
           Ó× Ò Ü º º ´Ô Ò ¿ ¿µº Ð Ñ ×ÑÓ ÑÓ Ó¸ ÔÓ Ö ÑÓ× × Ò Ö ÙÒ ÖÙØ Ò × Ñ Ð Ö
       Ð select() ×ØÙ Ó Ò Ü º½½º½ ´Ô Ò ¿ µ ÕÙ Ù×ÕÙ ÙÒ Ð Ú Ý Ñ ÒØ ÖÓØ ¹
        ÓÒ × ×Ù × Ú × ×Ù Ð ÒÓ Ó Ò ÓÒØÖ Ó ×Ø Ð Ö Þº Ð Ù Ð ÕÙ ÓÒ ÐÓ× ÖÖ ÐÓ׸ ר
     Ø Ò         ÔÖÓ Ó Ø Ò Ö ÙÒ × ÑÔ ÒÓ Ù ÒÓ Ô Ö ÔÐ ÓÒ × ÕÙ Ü Ò ÐÓ Ð
     Ö Ö Ò º Ä Ñ ÒØ Ð Ñ ÒØ ¸ ÔÙ ×ØÓ ÕÙ Ð Ø Ò ÒÓ Ö Ð Þ Ò Ò ÙÒ Ùר                    ÕÙ Ð Ö Ó
     ×Ó Ö Ð Ö Óи ר ÔÖÓ Ð Ñ ÒØ ÒÓ × Ö ÑÙÝ ÕÙ Ð Ö Óº È ÓÖ ÙÒ¸ × ÐÓ× ×Ó× ×ÓÒ
     × × Ó×          ÙÒ ÜØÖ ÑÓ Ð ÓÖ Ò Ð × Ð Ú ×¸ Ð Ö ÓÐ ÔÙ                Ú Ò Ö × Ú Ö Ñ ÒØ
         × ÕÙ Ð Ö Óº
          ËÐ ØÓÖ Ý Ì Ö Ò ½       × Ù Ö ÖÓÒ ÙÒ Ø Ò            Ùר ÕÙ Ö ÒØ Þ ÕÙ Ð ÓרÓ
     ÔÖÓÑ Ó n ÓÔ Ö ÓÒ × × O(Ð n)º ËÙ Ø Ò × ÒÓÑ Ò                      ×ÔÐ Ý Ò Ý ÐÓ× Ö ÓÐ ×
     Ö ×ÙÐØ ÒØ × ×ÓÒ ÒÓÑ Ò Ó× Ö ÓÐ × ×ÔÐ Ý º × Ñ ÒØ ¸ Ð ×ÔÐ Ý Ò ÓÒ× ×Ø Ò
     ÐÐ Ú Ö ÙÒ ÒÓ Ó         Ó ×Ø Ð Ö Þ Ñ ÒØ ÓÔ Ö ÓÒ × ×Ô Ð × ÕÙ ÚÓÖ Ö Ò
      ÙØÙÖÓ× ×Ó׺
          Ä ÔÖ Ñ Ö Ð × ÓÔ Ö ÓÒ × × ÒÓÑ Ò Þ ¹Þ Ý × ÐÙ×ØÖ Ò Ð ¬ ÙÖ º¾ º Î ×Ø
      ÞÕÙ Ö         Ö ¸ Ð ÓÔ Ö ÓÒ × ÒÓÑ Ò zig zig right¸ Ñ ÒØÖ × ÕÙ Ò Ð × ÒØ Ó
       ÓÒØÖ Ö Ó × ÒÓÑ Ò zig zig leftº Ä ÓÔ Ö ÓÒ ×Ù Ð ÒÓ Ó A ØÖ × Ò Ú Ð × Ý × ¬Ò
       ÓÑÓ × Ù
¿¼    ÓÔ Ö ÓÒ × Þ ¿¼ ≡                                             ´ ¿¾ µ ¿½
          Ò ×Ø ÐÐ ÒÓ ÒÓ Ü ×Ø ÙÒ Ø ÖÑ ÒÓ ÕÙ Ù Ñ ÒØ Ö ­ Ð Ô Ð Ö ×ÔÐ Ý º Ò ÓÒØÖ ÑÓ× Ò
      ÔÐ Ó Ý Ò ×ÔÐ Ó Ð × ÔÖÓÜ Ñ ÓÒ × Ñ × Ö ÔÖ × ÒØ Ø Ú ×¸ Ô ÖÓ¸ ÒÙ ×ØÖÓ Ù Ó¸ Ö ÓÐ ×
       ×ÔÐ Ó× Ó Ö ÓÐ × ÔÐ Ó× ÒÓ ÜÔÖ × Ò ÐÓ× Ñ ×ÑÓ× × Ò ¬ Ó× ÕÙ ×ÔÐ Ý ØÖ × º ÈÓÖ × Ö ÞÓÒ¸
     ÔÖ Ö ÑÓ× ÙØ Ð Þ Ö Ð Ø ÖÑ ÒÓ ÓÖ Ò Ðº
´
     6.6. Arboles splay                                                                531

                                        p
                                        C
                                                         A
                               B
                                            δ                    B
                       A                                                  p
                                                     α
                                   χ                                      C
                                                             β
                   α       β
                                                                      χ       δ
                                                =⇒

                                       ÙÖ º¾ ÇÔ Ö ÓÒ Þ ¹Þ

      static Node * zig_zig_right(Node* p)
      {
        Node * q = LLINK(p);
        Node * r = LLINK(q);
        LLINK(p) = RLINK(q);
        LLINK(q) = RLINK(r);
        RLINK(q) = p;
        RLINK(r) = q;
        return r;
      }
     Ä ÓÔ Ö ÓÒ × Ñ ØÖ × ÕÙ Ú Ð ÒØ Ó × ÖÚ Ö Ð ¬ ÙÖ º¾       Ö       ÞÕÙ Ö Ý ×
      ÒÓÑ Ò zig zig left()¸ Ð Ù Ð × ÒרÖÙÑ ÒØ × Ñ ØÖ Ñ ÒØ × Ñ Ð Öº
                                        C                        p
                                                                 B
                       A
                               p                         A                C
                                            δ
                               B
                   α
                                                     α       β        χ       δ
                           β       χ
                                                =⇒

                                       ÙÖ º¾ ÇÔ Ö ÓÒ Þ ¹Þ

        Ä × ÙÒ ÓÔ Ö ÓÒ × ÒÓÑ Ò Þ ¹Þ Ý × ÐÙ×ØÖ Ò Ð ¬ ÙÖ º¾ º ר ÓÔ Ö ÓÒ
      × ÕÙ Ú Ð ÒØ ÙÒ Ó Ð ÖÓØ ÓÒº Ð Ù Ð ÕÙ Ð Þ ¹Þ ¸ Ð ÒÓ Ó p ×Ù ØÖ × Ò Ú Ð × Ý
     × ¬Ò ÓÑÓ × Ù
¿½    ÓÔ Ö ÓÒ × Þ ¿¼ +≡                               ´ ¿¾ µ ¿¼
      static Node * zig_zag_right(Node* p)
      {
        LLINK(p) = rotate_to_left(LLINK(p));
        return rotate_to_right(p);
      }
      Ð ÕÙ Ú Ð ÒØ × Ñ ØÖ Ó × ÒÓÑ Ò zig zag left()º
        Ä ÙÐØ Ñ ÓÔ Ö ÓÒ¸ ÕÙ × ÒÓÑ Ò Þ ¸ ÓÒ× ×Ø Ò                     ØÙ Ö ÙÒ ÖÓØ ÓÒ × ÑÔÐ Ý
532                                       Cap´        ´
                                                  ıtulo 6. Arboles de b´ squeda equilibrados
                                                                       u



     ×ÓÐÓ × Ö Ð Þ × Ð ÒÓ Ó ÕÙ Ú Ò Ö Ö Þ × Ò Ù ÒØÖ Ò Ð Ò Ú Ð 1 × Ö¸ Ü Ø Ñ ÒØ
     ÙÒ Ò Ú Ð Ò Ö ÓÖ Ð Ö Þ º
             Ó ÙÒ ÒÓ Ó x Ò ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ ¸ Ð ×ÔÐ Ý Ò      Ð ÒÓ Ó x ÓÒ× ×Ø Ò
     ×Ù ÖÐÓ ×Ø Ð Ö Þ Ñ ÒØ Ð × ÓÔ Ö ÓÒ × Þ ¸ Þ ¹Þ Ý Þ ¹Þ º ÄÓ× Ò Ð × × ÔÓר Ö ÓÖ ×
        ÑÓ×ØÖ Ö Ò ÕÙ × ×ØÓ × Ö Ð Þ ÔÓÖ     ×Ó¸ ÒØÓÒ × Ð Ó×ØÓ ÔÖÓÑ Ó n ×Ó×
      × O(Ð n)º
     6.6.1    El TAD Splay Tree<Key>
      Ð Ì Gen Splay Tree<Key> ÑÓ Ð Þ ÙÒ Ö ÓÐ Ò Ö Ó                         Ù×ÕÙ    Ò Ð ÕÙ
     Ù ÐÕÙ Ö       Ð × ÓÔ Ö ÓÒ × Ù× ÙÒ ×ÔÐ Ý Ò Ð ÒÓ Ó                    Óº Ð Ì    × ¬Ò
     Ò Ð Ö ÚÓ ØÔÐ ×ÔÐ Ý ØÖ ºÀ ¿¾ ¸ Ð Ù Ð × ¬Ò ÓÑÓ × Ù
¿¾   ØÔÐ ×ÔÐ Ý ØÖ ºÀ ¿¾ ≡
           template <template <typename> class NodeType, typename Key, class Compare>
       class Gen_Splay_Tree
       {
         typedef NodeType<Key> Node;
            ÓÔ Ö ÓÒ × Þ ¿¼
            Ñ Ñ ÖÓ× ÔÖ Ú Ó×         Gen Splay Tree<Key>    ¿¾
            Ñ Ñ ÖÓ× ÔÙ Ð Ó×         Gen Splay Tree<Key>   ¿
       };
           template <typename Key, class Compare = Aleph::less<Key> >
       struct Splay_Tree : public Gen_Splay_Tree<BinNode, Key, Compare> { /* Empty */ };
           template <typename Key, class Compare = Aleph::less<Key> >
       struct Splay_Tree_Vtl : public Gen_Splay_Tree<BinNodeVtl, Key, Compare>
       { /* Empty */ };
     Í× × BinNode ¾ ¼ Ò     BinNodeVtl   ¾¼º
          Ð Ì Gen Splay Tree<Key> ÒÓ Ö ÕÙ Ö ¬Ò Ö ÙÒ ÒÙ Ú Ð ×         ÒÓ Ó Ò Ö Ó¸
     ÔÙ × ÒÓ × Ò × Ö Ó ÐÑ Ò Ö Ò ÓÖÑ ÓÒ ×Ø Ó Ò             ÒÓ Óº
        Ä × ÓÔ Ö ÓÒ × Þ ¹Þ Ý Þ ¹Þ ÒÚÓÐÙ Ö Ò 4 ÒÓ Ó× ÕÙ ×ÓÒ Ü Ñ Ò Ó× Ó Ó×
     Ô Ö×Ô Ø Ú ×º ÈÖ Ñ ÖÓ¸ Ö ÕÙ Ö ÑÓ× Ø ÖÑ Ò Ö Ù Ð Ð × × × ÓÔ Ö ÓÒ × ÔÓ× Ð ×
         ÙØ Ö× º Ë ÙÒ Ó¸     ÑÓ× ÙØ Ö Ð ÓÔ Ö ÓÒ Ò Ù ×Ø ÓÒº Ð ×ÔÐ Ý Ò     ÙÒ ÒÓ Ó
     ÒÚÓÐÙ Ö ¸ ÒØÓÒ ×¸ ØÓ Ó× ÐÓ× ÒÓ Ó× Ð Ñ ÒÓ Ù×ÕÙ           × Ð Ö Þ ×Ø Ð ÒÓ Ó
      ÓÒ × Ö Ð Þ Ð ×ÔÐ Ý Ò º ÈÓÖ Ø ÒØÓ¸ Ù× ÑÓ× ÙÒ Ô Ð ÕÙ ÐÑ Ò Ð Ñ ÒÓ ÒØ ÖÓ
         Ù×ÕÙ
¿¾    Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Splay Tree<Key> ¿¾ ≡             ´ ¿¾ µ ¿¿
       struct Node_Desc
       {
         Node * node;
         Node ** node_parent;
       };
       ArrayStack<Node_Desc, Node::MaxHeight> splay_stack;
     Í× × ArrayStack ½¼ º
            ÒØÖ      Ð Ô Ð Ù Ö Ö ×ØÖÓ× Ø ÔÓ Node Desc¸ Ð Ù Ð ×Ù Ú Þ Ù Ö Ó×
     Ú ÐÓÖ × Ð ÒÓ Ó Ô ÖØ Ð Ñ ÒÓ Ù×ÕÙ Ý ÙÒ Ó Ð ÔÙÒØ ÓÖ ×Ù Ô Ö º Ð ÔÙÒØ ÖÓ
      Ó Ð Ô ÖÑ Ø      ØÙ Ö Ð × ÖÓØ ÓÒ × × Ò Ò × ÔÖ ÙÒØ Ö ÕÙ Ð Ó¸ ÞÕÙ Ö Ó Ó
       Ö Ó¸ × Ò Ù ÒØÖ Ð Ô Ö º
        Î ×    Ü   º ½ ´Ô Ò ¿ ¾µº
´
     6.6. Arboles splay                                                     533



        Ä     ÓÒ ×ÔÐ Ý Ø Ò      ÕÙ Ð Ö Ö Ð Ö Óи Ô ÖÓ ÒÓ Ü ÐÙÝ ÙÒ ×Ó ÑÙÝ × ÓÖ¹
     ØÙÒ Óº Ú ÒØÙ ÐÑ ÒØ ¸ splay stack ÔÙ Ø Ò Ö ÙÒ × ÓÖ ÕÙ           × Ö Ñ Ò Óº
     ÈÓÖ × Ö ÞÓÒ¸ ¬Ò ÑÓ× ÙÒ Ñ ØÓ Ó ×Ô Ð ÕÙ Ò× ÖØ ÙÒ ÒÓ Ó Ò Ð Ô Ð Ý ÕÙ Ú Ö ¬
      Ð × ÓÖ
¿¿    Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Splay Tree<Key> ¿¾ +≡ ´ ¿¾ µ ¿¾ ¿¿
       void push_in_splay_stack(Node * p, Node ** pp)
       {
         try { splay_stack.push(Node_Desc(p, pp)); }
         catch (std::overflow_error)
           {
             splay_stack.empty();
             throw;
           }
       }
       ¬Ò ×
       push in splay stack¸   Ù×   Ò ÙÒ × ¿¿ß¿ º
       Ä ÙÒ      Ö ×ÔÓÒ× Ð            push in splay stack() × ØÖ Ô Ö Ð    Ü Ô ÓÒ
     std::overflow errorº Ë ×ØÓ Ó ÙÖÖ ¸ ÐÓ ÙÒ Ó ÕÙ ×          × Ú Ö Ð Ô Ð ÒØ ×
     ÔÖÓÔ Ö Ð Ü Ô ÓÒº
        push in splay stack() × ÙØ Ð Þ         Ú Þ ÕÙ ×    ØÙ ÙÒ Ù×ÕÙ ¸ Ð Ù Ð ×
     Ö Ð Þ ÔÓÖ Ð ÖÙØ Ò × Ù ÒØ
¿¿    Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Splay Tree<Key> ¿¾ +≡ ´ ¿¾ µ ¿¿ ¿
       void search_and_push_in_splay_stack(const Key & key)
       {
         splay_stack.empty();
         Node ** pp = &RLINK(head);
         Node * p    = root;
         while (p != NULL) // buscar iterativamente key
           {
             push_in_splay_stack(p, pp);
             if (Compare()(key, KEY(p)))
               {
                  pp = &LLINK(p);
                  p = LLINK(p);
               }
             else if (Compare()(KEY(p), key))
               {
                  pp = &RLINK(p);
                  p = RLINK(p);
               }
             else
               return;
           }
       }
       ¬Ò ×
       search and push in splay stack¸   Ù×   Ò ÙÒ × ¿ Ò   ¿º
     Í× × push in splay stack ¿¿ º
                                   × ÙÒ ÖÙØ Ò ÑÙÝ ÑÔÓÖØ ÒØ Ð Ù Ð × Ò ×¹
        search and push in splay stack()
     Ô Ò× Ð ÓÑÔÖ Ò Öº × Ñ ÒØ ¸ Ð ÖÙØ Ò Ù× ÙÒ ÒÓ Ó ÓÒ Ð Ú key Ý ÑÔ Ð Ð
       Ñ ÒÓ Ù×ÕÙ Ò Ô Ò ÒØ Ñ ÒØ ÕÙ × Ò Ù ÒØÖ Ó ÒÓ Ð Ð Ú º Ë Ð Ù×ÕÙ
534                             Cap´        ´
                                       ıtulo 6. Arboles de b´ squeda equilibrados
                                                            u



     × Ü ØÓ× ¸ ÒØÓÒ × Ð ØÓÔ Ð Ô Ð ÓÒØ Ò Ð ÒÓ Ó Ò ÓÒØÖ Óº ÐÓ ÓÒØÖ Ö Ó¸ Ð ØÓÔ
     ÓÒØ Ò Ð ÙÐØ ÑÓ ÒÓ Ó ÒØ × Ð ÜØ ÖÒÓ ØÙÚÓ Ð Ù×ÕÙ º Ä ÖÙØ Ò × ÑÔÐ Ô Ö
    Ð × ØÖ × ÓÔ Ö ÓÒ × × × Ò× Ö ÓÒ¸ Ù×ÕÙ Ý Ð Ñ Ò ÓÒº
        ÄÓ× ØÖ ÙØÓ× Ö ×Ø ÒØ × Ý ×ÓÒ Ñ Ð Ö × Ð Ð ØÓÖ
¿    Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Splay Tree<Key> ¿¾ +≡ ´ ¿¾ µ ¿¿ ¿
     Node head_node;
     Node *head;
     Node *&root;
        Ä ×Ò        Ð ÑÔÐ ÒØ ÓÒ ×Ù Ý Ò ÙÒ ÖÙØ Ò splay() ÕÙ Ö Ð Þ Ð ×ÔÐ Ý Ò
      Ð ÒÓ Ó × ØÙ Ó Ò Ð ØÓÔ    Ð Ô Ð º splay() Ö ÕÙ Ö Ø ÖÑ Ò Ö Ð Ø ÔÓ ÓÔ Ö ÓÒ
        ÙØ Ö × ÙÒ Ð Ð Ò ÓÒ Ð Ñ ÒÓ         Ù×ÕÙ º ×ØÓ × Ö Ð Þ Ó ÔÓÖ Ð × Ù ÒØ
    ÖÙØ Ò
¿    Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Splay Tree<Key> ¿¾ +≡ ´ ¿¾ µ ¿ ¿
     enum Zig_Type { ZIG_LEFT, ZIG_RIGHT, ZIG_ZAG_LEFT, ZIG_ZAG_RIGHT,
                     ZIG_ZIG_LEFT, ZIG_ZIG_RIGHT };
     Zig_Type zig_type(Node *& p, Node **& pp)
     {
       Node_Desc first = splay_stack.pop();
       Node_Desc second = splay_stack.pop();
       Zig_Type ret = Compare()(KEY(second.node), KEY(first.node)) ? ZIG_LEFT : ZIG_RIGHT;
       if (splay_stack.is_empty())
         {
           p = second.node;
           pp = second.node_parent;
           return ret;
         }
       Node_Desc third = splay_stack.pop();
       pp              = third.node_parent;
       p               = third.node;
       if (ret == ZIG_LEFT)
         return Compare()(KEY(third.node), KEY(second.node)) ? ZIG_ZIG_LEFT : ZIG_ZAG_RIGHT;
       return Compare()(KEY(second.node), KEY(third.node)) ? ZIG_ZIG_RIGHT : ZIG_ZAG_LEFT;
     }
      ¬Ò ×
     zig type¸   Ù×   Ò ÙÒ   ¿ º
       zig type() Ö ØÓÖÒ Ð Ø ÔÓ ÓÔ Ö ÓÒ ÕÙ         Ö Ð Þ Ö× ×Ó Ö Ð ÒÓ Ó Ò Ð ØÓÔ
    Ð ÔÐ º      ÓÒ ÐÑ ÒØ ¸ Ð ÖÙØ Ò ÚÙ ÐÚ ÐÓ× Ú ÐÓÖ × p Ý pp ÓÖÖ ×ÔÓÒ ÒØ × Ð ÙÐØ ÑÓ
    ÒÓ Ó Ò Ð      Ò     Ð ÓÔ Ö ÓÒ Ý ×Ù Ô Ö º ר ÑÓ× Ð ×ØÓ× Ô Ö Ð ÖÙØ Ò splay()¸ Ð
     Ù Ð × ÑÙÝ × Ò ÐÐ ÙÒ Ú Þ ¬Ò Ð Ñ ÕÙ Ò Ö Ò × Ö
¿    Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Splay Tree<Key> ¿¾ +≡              ´ ¿¾ µ ¿
     void splay()
     {
       if (splay_stack.is_empty() or splay_stack.top().node == root)
         return;
       Node **pp, *p;
       while (true)
         {
           switch (zig_type(p, pp))
             {
´
    6.6. Arboles splay                                                        535



                   case ZIG_LEFT:      *pp =   rotate_to_left(p); break;
                   case ZIG_RIGHT:     *pp =   rotate_to_right(p); break;
                   case ZIG_ZIG_LEFT: *pp =    zig_zig_left(p); break;
                   case ZIG_ZIG_RIGHT: *pp =   zig_zig_right(p); break;
                   case ZIG_ZAG_LEFT: *pp =    zig_zag_left(p); break;
                   case ZIG_ZAG_RIGHT: *pp =   zig_zag_right(p); break;
                   }
                 if (splay_stack.is_empty())
                   break;
                 push_in_splay_stack(p, pp);
             }
      }
      ¬Ò ×
      splay¸ Ù×   Ò ÙÒ × ¿       Ò ¿º
    Í× × push in splay stack   ¿¿ Ò zig type ¿ º
    splay()   × Ð ÖÙØ Ò ÙÒ Ñ ÒØ Ð Ð Ì Gen Splay Tree<Key>º ÐÐ ×ÙÑ ÕÙ ×
       ØÙÓ ÙÒ ÐÐ Ñ ÔÖ Ú search and push in splay stack() Ý ÕÙ Ð ØÓÔ Ð Ô Ð
     ÓÒØ Ò Ð ÒÓ Ó ×Ó Ö Ð Ù Ð × × Ö Ð Þ Ö Ð ×ÔРݺ       Ú Þ ÕÙ ×     ÙØ Ù ÐÕÙ Ö
    ÓÔ Ö ÓÒ Ò× Ö ÓÒ¸ Ù×ÕÙ Ó Ð Ñ Ò ÓÒ¸ ×              Ö Ð Þ Ö ÙÒ ×ÔÐ Ý Ð Ö Óк Ä
            ר ÓÔ Ö ÓÒ × ÑÓÖØ Þ Ö ÐÓ× ×Ó× × ÓÖØÙÒ Ó× Ý ÕÙ Ð Ö Ö Ð Ö Óк
          Ð × ØÖ × ÓÔ Ö ÓÒ × ÙÒ Ñ ÒØ Р׸ Ð Ñ × × ÑÔÐ × Ð       Ù×ÕÙ ¸ Ð Ù Ð ×
      ¬Ò ÓÑÓ × Ù
¿    Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Splay Tree<Key> ¿ ≡              ´ ¿¾ µ ¿
      Node * search(const Key & key)
      {
        if (root == NULL)
          return NULL;
        search_and_push_in_splay_stack(key);
        splay();
        if (are_equals<Key, Compare>(key, KEY(root)))
          return root;
        return NULL;
      }
    Í× × search and push in splay stack ¿¿     Ò   splay   ¿ º
    Ä Ù×ÕÙ        × ÑÙÝ × Ò ÐÐ ÔÓÖÕÙ ØÓ Ð Ò Ö ×ØÖÙ ØÙÖ × Ò Ù ÒØÖ ÑÔÐ ÒØ ÔÓÖ
    ÐÓ× Ñ ØÓ Ó× ÔÖ Ú Ó× search and push in splay stack() Ý splay()º ÆÓØ ÕÙ Ð ×ÔÐ Ý
    × ÑÔÖ × Ö Ð Þ ¸ Ò Ô Ò ÒØ Ñ ÒØ ÕÙ Ð Ù×ÕÙ × ÐÐ Ó ÒÓº
        Ä Ò× Ö ÓÒ × Ð Ö Ñ ÒØ Ñ × ÓÑÔÐ          Ô ÖÓ¸ Ð Ù Ð ÕÙ ÓÒ Ð Ù×ÕÙ ¸ ØÓ Ó
     Ð ØÖ Ó × ÑÔÐ ÒØ Ó ÔÓÖ search and push in splay stack() Ý splay()
¿    Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Splay Tree<Key> ¿ +≡          ´ ¿¾ µ ¿     ¿
      Node * insert(Node * p)
      {
        if (root == NULL)
          {
            root = p;
            return root;
          }
        search_and_push_in_splay_stack(KEY(p));
        Node * pp = splay_stack.top().node;
536                                   Cap´        ´
                                             ıtulo 6. Arboles de b´ squeda equilibrados
                                                                  u



          if (Compare()(KEY(p), KEY(pp)))                        // meter p en la pila
            {
              LLINK(pp) = p;
              push_in_splay_stack(p, &LLINK(pp));
            }
          else if (Compare()(KEY(pp), KEY(p)))
            {
              RLINK(pp) = p;
              push_in_splay_stack(p, &RLINK(pp));
            }
          else
            {     // clave duplicada
              splay(); // de todos modos hacemos el splay
              return NULL;
            }
          splay();
          return root;
      }
    Í× × push in splay stack ¿¿ ¸ search and push in splay stack ¿¿ ¸ Ò   splay     ¿ º
       È Ö Ð Ð Ñ Ò ÓÒ × Ø Ò Ò Ó× ÐØ ÖÒ Ø Ú × Ð Ð Ñ Ò ÓÒ Ð × ÕÙ ÒØ ÙÒ ÒÓ Ó
     ÓÑÔÐ ØÓ × Ð ÓÒ Ð ×Ù ×ÓÖ Ó ÔÖ    ×ÓÖ¸ Ó Ñ ÒØ Ð ÓÔ Ö ÓÒ join() × ÖÖÓÐÐ
     Ò Ü º º ´Ô Ò ¿ µº ÈÓÖ × Ö Ð Ñ × × Ò ÐÐ Ý ÔÓ× Ð Ñ ÒØ Ð Ñ × ¬ Þ¸ × Ó ÑÓ×
    Ð × ÙÒ ÐØ ÖÒ Ø Ú
¿    Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Splay Tree<Key> ¿ +≡           ´ ¿¾ µ ¿
      Node * remove(const Key & key)
      {
        search_and_push_in_splay_stack(key);
        splay(); // Suba el nodo hasta la ra´z mediante el splay
                                            ı
        if (no_equals <Key, Compare> (KEY(root), key))
          return NULL; // key no est´
                                    a
        Node * p = root;
        root = join_exclusive(LLINK(root), RLINK(root));
        p->reset();
        return p;
      }
    Í× × join exclusive ¿ ½ ¸ search and push in splay stack ¿¿ ¸ Ò   splay   ¿ º
     Ð Ð ÓÖ ØÑÓ Ö Ð Þ Ð     Ù×ÕÙ       Ð ÒÓ Ó Ð Ñ Ò Ö Ý Ö Ð Þ ÙÒ ×ÔÐ Ý Ò Ô Ò ÒØ Ñ ÒØ
       ÕÙ Ð Ù×ÕÙ           Ý × Ó Ü ØÓ× Ó ÒÓº Ë Ð Ð Ú × Ò Ù ÒØÖ Ò Ð Ö Óи ÒØÓÒ ×
    Ð Ö Þ ÓÒØ Ò Ð ÒÓ       Ó Ð Ñ Ò Ö Ý Ð Ö ÓÐ Ö ×ÙÐØ ÒØ × Ð ÓÒ Ø Ò ÓÒ ×Ù× Ö Ñ ×º
     Ò ×Ó ÓÒØÖ Ö Ó¸ Ð      Ð ÓÖ ØÑÓ Ø ÖÑ Ò ¸ ÔÙ × ÒÓ × Ò × Ö Ó Ö Ð Þ Ö ÓØÖ ÓÔ Ö ÓÒº

    6.6.2    An´lisis de los ´rboles splay
               a             a
     Ð Ò Ð × × ÙÒ Ö ÓÐ ×ÔÐ Ý × Ô Ö Ñ Ø Ó Ð ÑÓÖØ Þ Óº
       ÌÓ × Ð × ÓÔ Ö ÓÒ × Ö Ð Þ Ò ÙÒ Ù×ÕÙ ¸ ÙÝÓ × ÑÔ ÒÓ Ô Ò                         Ð ÔÖÓ ÙÒ¹
             Ð ÒÓ Ó ÔÓר Ö ÓÖÑ ÒØ ¸ × Ö Ð Þ Ð ×ÔÐ Ý Ð ÒÓ Ó¸ ÙÝÓ × ÑÔ ÒÓ Ø Ñ Ò
      ÔÒ         Ð ÐÓÒ ØÙ Ð Ñ ÒÓ ÒØÖ Ð Ö Þ Ý Ð ÒÓ Óº Ä Ò× Ö ÓÒ Ý Ð Ù×ÕÙ
    Ø Ò Ò O(Ò Ú Ð(ni)) + O(Ò Ú Ð(ni)) = O(Ò Ú Ð(ni))¸ Ñ ÒØÖ × ÕÙ Ð Ð Ñ Ò ÓÒ Ø Ò
    O(Ò Ú Ð (ni)) + O(Ò Ú Ð (ni)) + O(Ò Ú Ð (ni)) = O(Ò Ú Ð (ni))¸ × Ò Ó Ò Ú Ð(ni) Ð Ò Ú Ð Ð
´
6.6. Arboles splay                                                                               537



ÒÓ Ó ×Ù ØÓ Ð ÓÔ Ö ÓÒ ×ÔРݺ ×ØÓ ÒÓ× ×Ù Ö ÕÙ Ð ÙÒ ÓÒ ÔÓØ Ò Ð       ÓÒ× Ö Ö
 Ð Ò Ú Ð ÐÓ× ÒÓ Ó× ÓÑÓ Ô ÖØ Ð Óר º
    Ä ÐÓÒ ØÙ Ð Ñ ÒÓ ÒØ ÖÒÓ¸ ÔÖ × ÒØ        Ò Ð ¬Ò ÓÒ Ü º ´Ô Ò ¾ µ¸ ÒÓ×
 ÖÖÓ ÙÒ Ñ ØÖ ÕÙ ÓÒ× Ö Ð Ò Ú Ðº            ÓÖ     Ò¸ Ð Ö Ø Ö    ÑÙÐ ÓÒ Ð
 Ù×ÕÙ     Ò Ö ¸ Ý Ð × Ò Ó Ð × × ÒØ Ö ÓÖ ×    Ö ÓÐ × Ò Ö Ó× ÕÙ ÑÓ× ×ØÙ Ó¸
×Ù Ö Ò ÕÙ ÓÒ× Ö ÑÓ× Ð ÐÓ Ö ØÑÓ Ò Ð ÙÒ ÓÒ ÔÓØ Ò Ð ÕÙ ÒÓ× ÔÓÒ Ö Ð Ò Ú Ðº
Definici´n 6.10 (Rango de un ´rbol)
       o                    a             Ë ÙÒ Ö ÓÐ Ò Ö Ó T n ÒÓ Ó׺ Ë (ni)
Ð      ÒØ        ÒÓ Ó× Ð ×Ù ¹ Ö ÓÐ ÓÒ Ö Þ Ò niº ÒØÓÒ ×¸ Ð Ö Ò Ó T ¸ ÒÓØ Ó
    ÓÑÓ r(T )¸ × ¬Ò ÓÑÓ
                                    r(T ) = Ð (T )                      ´ º ½µ
      ËÐ ØÓÖ Ý Ì Ö Ò ½ × Ð ÓÒ ÖÓÒ ÙÒ ÙÒ ÓÒ ÔÓØ Ò Ð ×           Ò Ð Ö Ò Ó ÙÒ
    Ö ÓÐ Ð × Ù ÒØ ÑÓ Ó
                     Φ(T )   =                 r(ni)   =                 Ð   (ni)               ´ º ¾µ
                                   ∀ni ∈T                    ∀ni ∈T
                                 ni × ÒØ ÖÒÓ               ni × ÒØ ÖÒÓ

 Ò ÖØ ÓÖÑ ¸ ר ÔÓØ Ò Ð × Ö Ñ Ò × ÒØ Ð ÁÈÄ(T ) Ò Ð × ÒØ Ó ÕÙ ÔÓÒ Ö
 Ù Ò ÕÙ Ð Ö Ó ×Ø T º Ä      Ö Ò ÓÒ× ×Ø Ò ÕÙ Φ(T ) ר ÓØ Ó ÔÓÖ O(n Ð (n))¸
Ñ ÒØÖ × ÕÙ Ð ÁÈÄ(T ) ÔÓÖ O(n2)º
   È Ö ÙÒ Ö ÓÐ ÓÑÔÐ ØÓ Ð Ö Ò Ó × Ô ÕÙ ÒÓ¸ ÔÓÖ ÑÔÐÓ¸ Ô Ö

                                 T=
                    Φ(T ) = Ð (9) + Ð (5) + 2 Ð (3) + 5 Ð (1) ≈ 8, 66           ;
Ñ ÒØÖ × ÕÙ ÓÒ ÙÒ Ö ÓÐ Ñ × × ÕÙ Ð Ö Ó Ð Ö Ò Ó × Ñ ÝÓÖ ÔÓÖ                            ÑÔÐÓ¸ Ô Ö
                                  T=


            Φ(T ) = Ð (9) + Ð (8) + Ð (7) + Ð (4) + 2 Ð (2) + 3 Ð (1) ≈ 17, 62          .
Å ÒØÖ × Ñ × ÕÙ Ð Ö Ó ×Ø ÙÒ Ö Óи Ñ ÒÓÖ × ×Ù ÔÓØ Ò Ð Ò ÐÓ Ñ ÒØ ¸ Ñ ÒØÖ ×
Ñ ÒÓ× ÕÙ Ð Ö Ó¸ Ñ ÝÓÖ ×Ø ׺
Proposici´n 6.10 ´Ä
         o              Ñ         ×Ó ÙÒ Ö ÓÐ ×ÔÐ Ý ¹ ËÐ ØÓÖ Ý Ì Ö Ò ½ ½ µ
   Ë T ÙÒ Ö ÓÐ ×ÔÐ     Ý Ý k ∈ T ÙÒ Ð Ú º Ë Ò i−1(k) Ý i(k) Ð × Ö Ò Ð      × Ð
×Ù ¹ Ö ÓÐ ÙÝ Ö Þ × k ÒØ × Ý ×ÔÙ × ÙÒ Ô ×Ó ÙÒ ×ÔÐ Ý ÙÒ ØÓØ Ð m Ô ×Ó׺
Ë Ò ri−1(k) Ý ri(k) ÐÓ× Ö Ò Ó× k ÒØ × Ý ×ÔÙ × ÙÒ Ô ×Ó Ð ×ÔÐ Ý ÙÒ ØÓØ Ð m
Ô ×Ó׺ ÒØÓÒ ×¸ Ð Óר ÑÓÖØ Þ Ó Ò Ð i¹ × ÑÓ Ô ×Ó¸ ¬Ò Ó ÓÑÓ i¸ ר ÓØ Ó
 ÓÑÓ
                              3ri(k) − 3ri−1(k)        × i<m
                         i≤                                               ´ º ¿µ
                              3ri(k) − 3ri−1(k) + O(1) × i = m
538                                        Cap´        ´
                                              ıtulo 6. Arboles de b´ squeda equilibrados
                                                                   u



Demostraci´n
          o       Ä ÑÓ×ØÖ ÓÒ ÓÒ× ×Ø Ò Ð ÙÐ Ö Ð Óר ÑÓÖØ Þ Ó Ô Ö              Ø ÔÓ
    ÓÔ Ö ÓÒ ÕÙ Ó ÙÖÖ ÙÖ ÒØ ÙÒ Ô ×Ó Ð ×ÔÐ Ý ÒØÖ ÐÓ× m Ö ÕÙ Ö Ó× Ô Ö ×Ù Ö k
   ר Ð Ö Þº       ר ÑÓ Ó
                                i = Øi +Φ(Ti) − Φi−1(Ti−1)                  ´º µ
  ÓÒ Ti−1 Ý Ti ×ÓÒ ÐÓ× Ö ÓÐ × ÒØ × Ý ×ÔÙ × ÙÒ Ô ×Ó Ò Ð ×ÔÐ Ý ÒØÖ ÐÓ× ØÖ ×
ÔÓ× Ð × Ø ÔÓ× ¬Ò Ó׺ Ë k Ð ÒÓ Ó ÕÙ ×Ù Ö Ò Ú Ð Ò ÙÒÓ ÐÓ× Ô ×Ó× Ð ×ÔРݸ
 ÒØÓÒ ×¸        ØÓ×     ר ÑÓ×ØÖ ÓÒ¸ ÔÐ ÒØ Ö ÑÓ× ÙÒ ÔÖ × ÒØ ÓÒ Ñ ÒÓ× ÔÖ ×
  ÐÐÑ           ×Ó
                        i ≤ 3ri(k) − 3ri−1(k) + O(1) , 1 ≤ i ≤ m            ´º µ
      Ò ÐÓ ÕÙ × Ù ¸ ØÖ Ø Ö ÑÓ× ÐÓ× ØÖ × ÔÓ× Ð × Ô ×Ó× ÕÙ Ó ÙÖÖ Ò Ò ÙÒ ×ÔÐ Ý
   ½º zig
                                       b                   k

                      Ti−1 =   k           χ      Ti = α            b

                           α       β            =⇒             β        χ



        Ò ×Ø ×Ó¸ Ð        ÙÖ ÓÒ ÓÒר ÒØ ÕÙ Ú Ð ÙÒ ÖÓØ ÓÒ¸ Ö ÞÓÒ ÔÓÖ Ð Ù Ð ×Ùѹ
        ÑÓ× Øi = 1º    Ð Þ ÒÓ ÐØ Ö Ð × Ö Ò Ð             × Ð × Ö Ñ × α¸ β Ý χ¸ ÔÓÖ ÐÓ ÕÙ
       ×Ù× Ö Ò Ó× ×     Ò ÐÒ ÒÐ           ÖÒ         ÔÓØ Ò Ðº ÈÓÖ ÐÓ Ø ÒØÓ¸ Ð   ÖÒ
       ÔÓØ Ò Ð ×ÓÐÓ    ÓÒØ Ò ÐÓ× Ö Ò Ó× ÐÓ× ÒÓ Ó× k Ý bº               ר ÑÓ Ó
                               i = 1 + ri(k) + ri(b) − ri−1(k) − ri−1(b)            ´º µ
       ÆÓØ ÑÓ׸ ÔÓÖ Ó × ÖÚ ÓÒ Ð ¬ ÙÖ Ð Þ ¸ ÕÙ i−1(b) = i(k)¸ ÔÓÖ ÐÓ ÕÙ
       ri(k) − ri−1(b) = 0¸ ÐÓ ÕÙ ÒÓ×

                                        i = 1 + ri(b) − ri−1(k)                     ´º µ
          Ð Ñ ×ÑÓ ÑÓ Ó¸ ri−1(b) ≥ ri(k)¸ ÔÓÖ ÐÓ ÕÙ ÔÓ ÑÓ× ÔÐ ÒØ Ö Ð × Ù Ð
       × Ù ÒØ
                                  i ≤ 1 + ri(k) − ri−1(k)                           ´º µ
                                       ≤ 3ri(k) − 3ri−1(k) + O(1)

  ¾º   zig-zig

                                       c                   k

                 Ti−1 =        b           δ      Ti = α            b

                       k           χ                           β            c

                  α        β                    =⇒                      χ       δ
´
6.6. Arboles splay                                                                            539



       Ò ×Ø ×Ó Ø ÑÔÓ Ó Ñ Ò Ð × Ö Ò Ð            × α¸ β¸ χ Ý δ¸ ÔÓÖ ÐÓ ÕÙ ÐÓ×
     Ö Ò Ó× Ô ÖÑ Ò Ò Ù Ð × ÒØÖ Ti−1 Ý Ti Ý × Ò Ð Ò ÑÙØÙ Ñ ÒØ Ò Ð Ð ÙÐÓ
        Ð Ö Ò Ð ÔÓØ Ò Ðº ÈÓÖ ÓØÖ Ô ÖØ ¸ Ð Þ ¹Þ × Ñ × ÓרÓ×Ó Ò ÙÖ ÓÒ ÕÙ Ð
     Þ º Ò ÓÑÔÐ         Ø ÑÔÓ¸ × ÔÙ        Ö ÕÙ Ð Þ ¹Þ   ØÙ ÙÒ ÖÓØ ÓÒ Ñ ×¸
     Ð Ù Ð × ÔÖÓÔÓÖ ÓÒ Ð 2 Ó × Ð Ó Ð Ð Þ º ÈÓÖ ÐÓ Ø ÒØÓ¸ Ð Óר ÑÓÖØ Þ Ó
     × ¬Ò ÓÑÓ
                   i   = 2 + ri(k) + ri(b) + ri(c) − ri−1(k) − ri−1(b) − ri−1(c)
     Ò ×Ø ×Ó¸ i−1(c) = i(k)¸ ÐÓ ÕÙ                        ÕÙ   ri−1(c) − ri(k) = 0¸   ÔÓÖ ÐÓ ÕÙ Ð
     ÜÔÖ × ÓÒ ÒØ Ö ÓÖ Ú Ò Ò
                              i   = 2 + ri(b) + ri(c) − ri−1(k) − ri−1(b)                    ´º µ
     Á Ù Ð ÕÙ Ô Ö Ð Þ ¸ ri−1(b) ≥ ri−1(k) Ý ri(k) ≥ ri(b)º ËÙ ×Ø ØÙ ÑÓ× Ò Ð                 Ù ÓÒ
      ÒØ Ö ÓÖ Ý Ð   ÑÓ× ÙÒ × Ù Ð
                                     i   ≤ 2 + ri(k) + ri(c) − 2ri−1(k)                     ´ º ¼µ
     Ë Ò
                                                i−1(k)        i(c)
                                         x=
                                                   (k)
                                                       , y=                            ´ º ½µ
                                                  i           i(k)
     ÈÙ ×ØÓ ÕÙ     i(k)   >   i−1(k)     Ý   i(k) > i(c)¸ ÒØÓÒ × x > 0      y > 0º Ò Ò   ÙÖ ¸
     x+y< 1      ÐÓ Ù Ð × Ú Ò                ÜÔÖ × Ò Ó Ð × Ö Ò Ð          × Ò ÙÒ ÓÒ ×Ù× ×Ù ¹
      Ö ÓÐ ×
                  1 + (α) + (β)1 + (β) + (χ)   2 + (α) + (β) + (χ) + (δ)
         x+y=                                =                                               ´ º ¾µ
                   3 + (α) + (β) + (χ) + (δ)   3 + (α) + (β) + (χ) + (δ)


         ÓÑÓ × ÓØ Ö Ð (x) + Ð (y) Ó¸ Ó ÓØÖÓ ÑÓ Ó¸ Ù Ð × Ö Ð Ñ Ü ÑÓ Ú ÐÓÖ
     ÕÙ ØÓÑ Ö Ð (x) + Ð (y) Ä Ö ×ÔÙ ×Ø × ØÖ Ø Ò Ð × Ù ÒØ Ð Ñ
     Lema 6.8 Ë Ò x, y ∈ R | x > 0, y > 0, x + y ≤ 1¸ ÒØÓÒ ×¸ Ð (x) + Ð (y) ≤ −2º
     Demostraci´n ÈÓÖ ÙÒ ÔÖÓÔ
                     o                  Ý ÓÒÓ ¸ Ð (x) + Ð (y) = Ð (xy)º Ä ÙÖÚ
        Ð ÐÓ Ö ØÑÓ × ÑÓÒÓØÓÒ Ñ ÒØ Ö ÒØ ݸ ÒØÖÓ Ð ÓÑ Ò Ó ÒÙ ×ØÖÓ ÒØ Ö ×¸
      Ü      Ð × Ù ÒØ ÓÖÑ
                  ½
                       lg(n)
               ¼º
                  ¼
              ¹¼º
                ¹½
              ¹½º
                ¹¾
              ¹¾º
                ¹¿
                    ¼      ¼º¾ ¼º    ¼º        ½      ½º¾    ½º      ½º       ¾
                                                         n
540                                                Cap´        ´
                                                      ıtulo 6. Arboles de b´ squeda equilibrados
                                                                           u



        Ð Ú ÐÓÖ       Ð   (xy)    × Ñ Ü ÑÓ Ù Ò Ó Ð ÔÖÓ Ù ØÓ xy × Ñ Ü ÑÓº                                         × Ð × ÓÒ ¹
        ÓÒ ×      x       y¸ xy    × Ñ Ü ÑÓ Ù Ò Ó x = y = 1/2 =⇒ Ð (xy) = −2
         ÓÖ ÜÔ Ò ÑÓ× Ð             (x) + Ð (y)

                                                           i−1(k)            i(c)
                      Ð   (x) + Ð (y) =            Ð              +Ð
                                                             i(k)            i(k)
                                           =       Ð       i−1(k) − Ð      i(k) +    Ð     i(c)   −Ð     i(k)
                                           =       Ð       i−1(k)   +Ð     i(c)   − 2Ð       i(k)
                                           = ri−1(k) + ri(c) − 2ri−1(k)                                              ´ º ¿µ
        Ò ÙÒ ÓÒ Ð Ð Ñ º ¸ ÔÐ ÒØ ÑÓ× Ð × Ù ÒØ                                        × ÙÐ
                                       ri−1(k) + ri(c) − 2ri(k) ≤ −2 =⇒
                                   2ri(k) − ri(k) − ri−1(k) − 2 ≥ 0                                                  ´º µ
        ÓÑÓ Ð Ö ×ÙÐØ Ó × ÔÓ× Ø ÚÓ ÐÓ ÔÓ ÑÓ× ×ÙÑ Ö Ð                                      × ÙÐ           ´ º ¼µ
                  i       ≤ 2 + ri(k) + ri(c) − 2ri−1(k) + 2ri(k) − ri(k) − ri−1(k) − 2
                          ≤ 3ri(k) − 3ri−1(k)
                          ≤ 3ri(k) − 3ri−1(k) + O(1)                                                                 ´º µ
  ¿º   zig-zag

                                               c

             Ti−1 =       a                            δ                                 k

                  α                k                                 Ti = a                         c

                              β        χ                     =⇒          α          β         χ         δ



        Ð Ö ÞÓÒ Ñ ÒØÓ Ò ×Ø ×Ó × ÓÑÔÐ Ø Ñ ÒØ × Ñ Ð Ö Ð ÒØ Ö ÓÖ ×Ø ´ º µº
       Ç × ÖÚ Ò Ó ÕÙ ri−1(a) ≥ ri−1(k)¸ Ý ÕÙ ri(k) ≥ ri(c)ÔÐ ÒØ ÑÓ× Ð × Ù ÒØ ¹
       × ÙÐ
                              i ≤ 2 + ri(a) + ri(c) − 2ri−1(k)             ´º µ
       Ë Ò
                                                            i(a)              i(c)
                                                   x=               , y=                                             ´º µ
                                                             i(k)             i(k)

         Ò ×Ø ÑÓÑ ÒØÓ                  × Ö Ð ÖÓ ÕÙ             x + y < 1¸           Ö ÞÓÒ ÔÓÖ Ð Ù Ð¸ ÔÐ Ò Ó Ð
       Ð Ñ º Ø Ò ÑÓ× ÕÙ
                                                         Ð
                                                      x + Ð y ≤ −2 =⇒
                                                   i(a)  i(ca)
                                         Ð          (k)
                                                        +Ð     ≤ −2 =⇒
                                             i            i(k)
                                    2ri(k) − ri(a) − ri(c) − 2 ≥ 0                                                   ´º µ
´
6.6. Arboles splay                                                                             541



      Ò ÐÑ ÒØ ¸ ×ÙÑ Ò Ó Ð Ð Ó ÞÕÙ Ö Ó               ´º µ Ð Ö Ó                ´ º µ¸ Ø Ò ÑÓ×
                             i   ≤ 2ri(k) − 2ri−1(k)                                       ´º µ
                                 ≤ 3ri(k) − 3ri−1(k) + O(1)

   ÄÓ× ØÖ × ×Ó× ÔÓ× Ð ×    ÙÒ Ô ×Ó Ð ×ÔÐ Ý ×Ø Ò ÓØ Ó× ÔÓÖ 3ri(k) − 3ri−1(k) + O(1)




                          ÙÖ º¿¼ ÍÒ Ö ÓÐ ×ÔÐ Ý              512   ÒÓ Ó×

    Ð ÐÑ          ×Ó × Ð ×           ÑÓ×ØÖ Ø Ú              ÙÒÓ× Ù ÒØÓ× Ø ÓÖ Ñ × ×Ó Ö ÐÓ×
Ö ÓÐ × ×ÔРݸ ÒØÖ ÐÐÓ× Ð × Ù ÒØ
Proposici´n 6.11
         o      Ð Óר ÑÓÖØ Þ Ó s ÙÒ ÓÔ Ö ÓÒ splay() ×Ó Ö ÙÒ ÒÓ Ó k
Ô ÖØ Ò ÒØ ÙÒ Ö ÓÐ ×ÔÐ Ý × O(Ð n)º
Demostraci´n Ä ÓÔ Ö ÓÒ ×ÔÐ Ý ÔÙ
          o                       Ñ Ò Ö× ÓÑÓ ÙÒ × Ù Ò       Ô ×Ó× Þ
× ÙÒ Ð ÓÖ ÒØ ÓÒ Ð ÒÓ Ó ÙÝÓ Ó×ØÓ ÑÓÖØ Þ Ó ØÓØ Ð ÔÙ ¬Ò Ö× ÓÑÓ
                                              m
                                      s   =         i   .
                                              i=1

    ר × Ù Ò         ÓÔ Ö ÓÒ × ÔÙ         Ô ØÓÖ Þ Ö×        Ð × Ù ÒØ ÑÓ Ó
                                                                      m
                                                                          º
                                                                          º
                                                                          º
                                                                      i+1

                                                                      i
                                               k
                                                                          º
                                                                          º
                                                                          º
                                                                      1
542                                             Cap´        ´
                                                   ıtulo 6. Arboles de b´ squeda equilibrados
                                                                        u



  Ð ÒÓ Ó k ×Ù          Ð Ö Þ Ñ ÒØ m − 1 ÓÔ Ö ÓÒ × Þ ¹Þ Ó Þ ¹Þ Ý ÙÒ m¹ × Ñ
ÓÔ Ö ÓÒ ÕÙ ÔÓ Ö × Ö Ù ÐÕÙ Ö             Ð × ØÖ × ÔÓ× Ð ×º Å × ÔÖ × Ñ ÒØ × ÑÓ׸ ÔÓÖ
 ÐÐ Ñ          ×Ó¸ ÕÙ ÐÓ× m − 1 ÔÖ Ñ ÖÓ× Ô ×Ó× ×Ø Ò ÓØ Ó× ÔÓÖ 3ri(k) − 3ri−1(k)¸ ÔÙ ×
 ר Ú ÐÓÖ ÓØ Ø ÒØÓ Ð Þ ¹Þ ÓÑÓ Ð Þ ¹Þ Ñ ÒØÖ × ÕÙ Ð ÙÐØ Ñ ÓÔ Ö ÓÒ ÔÙ Ö
× Ö Ù ÐÕÙ Ö        Ð × ØÖ ׸ Ö ÞÓÒ ÔÓÖ Ð Ù Ð × Ò × Ö Ó ÓØ ÖÐ Ð Ñ Ü ÑÓ × Ö¸
   3rm(k) − 3rm−1(k) + 1º
      Ò × ÐÓ ÒØ Ö ÓÖ¸ ÔÓ ÑÓ× ¬Ò Ö
          m−1
s     =           3ri (k) − 3ri−1 (k) + 3rm (k) − 3rm−1 (k) + 1
          i=1
            m−1                 m−1
      =           3ri (k)   −           3ri−1 (k)   + 3rm (k) − 3rm−1 (k) + 1
            i=1                   i=1

      =    3r1 (k) + 3r2 (k) + · · · + 3rm−1 (k) − 3r0 (k) + 3r1 (k) + · · · + 3rm−2 (k) + 3rm (k) − 3rm−1 (k) + 1
      =   3rm (k) − 3r0 (k) + 1
      ≤   3rm (k) + 1 = 1 + Ð n = O(Ð n)

     ÓÑÓ ÓÖÓÐ Ö Ó Ð ÔÖÓÔÓ× ÓÒ º½½ ÔÓ ÑÓ× ÒÙÒ Ö ÕÙ p ÓÔ Ö ÓÒ × ×Ó Ö
ÙÒ Ö ÓÐ ×ÔÐ Ý Ø Ò Ò Óר ÑÓÖØ Þ Ó O(p Ð n)º Ò ØÓ¸ ÓÑÓ Ý ÐÓ ÜÔÖ × ÑÓ×
 ÒØ Ö ÓÖÑ ÒØ ¸ Ð ÙÒ ÓÒ ÔÓØ Ò Ð ÓÒ× Ö Ð Ð       ÕÙ Ð Ö Ó Ð Ö Óи Ð Ù Ð
 Ù ÒØ Ô Ö Ð Ø ÑÔÓ      Ù×ÕÙ ÕÙ Ö Ð Þ ÙÒ ÓÔ Ö ÓÒ ÙÒ Ö ÓÐ ×ÔРݺ

6.7       Conclusi´n
                  o
  ר Ô ØÙÐÓ ØÖ ØÓ Ð ÕÙ Ð Ö Ó       Ö ÓÐ × Ò Ö Ó×        Ù×ÕÙ º Ä    ×Ù Ý ÒØ ×
Ñ Ò Ñ Þ Ö Ð ÒØ           ÒÓ Ó× Ò×Ô ÓÒ Ö Ò ÙÒ Ù×ÕÙ º
       Ø ÒÓÖ ÐÓ ÒØ Ö ÓÖ¸ ×ØÙ ÑÓ× Ú Ö × Ð × × ÕÙ Ð Ö Ó ÙÒØÓ ÓÒ ×Ù× Ö ÓÐ × ÓÖ¹
Ö ×ÔÓÒ ÒØ ׺ Ò ÔÖ Ñ Ö ÐÙ Ö¸ ÓÒ× Ö ÑÓ× Ð ÕÙ Ð Ö Ó Ù ÖØ Ï ÖØ Ý × ÖÖÓÐÐ ÑÓ×
ÙÒ Ð ÓÖ ØÑÓ O(n Ð n) ÕÙ ÕÙ Ð Ö ÙÒ             Ù ÐÕÙ Ö º Ð × ÖÖÓÐÐÓ ×Ø Ð ÓÖ ØÑÓ
ÒÓ× Ô ÖÑ Ø Ó Ô Ö Ø ÖÒÓ× Ð × Ú × ØÙ × Ý ¬ ÙÐØ × Ò Ö ÒØ × Ð ÕÙ Ð Ö Óº
      Ð Ö ×ØÓ Ð Ô ØÙÐÓ × ÓÒ× ÖÓ ×ØÙ Ö Ò Ó Ð × × Ö ÓÐ × ÕÙ Ð Ö Ó× Ð ¹
ØÓÖ Þ Ó׸ ØÖ Ô׸ Îĸ ÖÓ Ó¹Ò ÖÓ Ý ×ÔРݺ          ÙÒÓ ÓÒ ×Ù× Ú ÒØ × Ý ×Ú ÒØ ×
 ÓÒ× Ö Ö × ÙÒ Ð ÔÐ ÓÒº
      Ð ×Ù × Ö ÔØÓÖ Ð ÔÖ × ÒØ Ø ÜØÓ ÐÐ Ú Ó ÙÒ ×ØÙ Ó ÑÔ Ö Ó ×Ó Ö ÐÓ× Ö ÒØ ×
Ø ÔÓ× Ö ÓР׺ ÄÓ× Ö ×ÙÐØ Ó׸ × Ò Ö ÓÖ ×Ø ר Ó¸ ÑÙ Ó Ñ ÒÓ× × Ò ÜÔÖ × Ö ÒØ ÖÚ ÐÓ×
     ÓÒ¬ ÒÞ ¸ × ÑÙ ×ØÖ Ò Ò Ð × ¬ ÙÖ × º¿½¸ º¿¾¸ º¿ Ý º¿ Ö ×Ô Ø Ú Ñ ÒØ º Ä ×
 Ö ¬ × Ò Ù ×Ø ÓÒ ÓÖÖ ×ÔÓÒ Ò Ñ            × ×Ó Ö Ð × Ù ÒØ ÜÔ Ö Ñ ÒØÓ
   ½º Ë Ò Ö ÙÒ × Ù Ò Ð ØÓÖ                Ð Ú × Ò× Ö ÓÒº
   ¾º È Ö         Ø ÔÓ   Ö ÓÐ × Ö Ð Þ ¿ Ú × Ð Ò× Ö ÓÒ Ð × Ù Ò ÒØ Ö ÓÖ Ý¸
             ÔÓØ Ò Ü Ø ¾¸ ×          ØÙ Ò Ð × Ñ      ׺
    Ä ×Ñ        × ÓÒ × ÜÔÖ × Ø ÑÔÓ ÓÖÖ ×ÔÓÒ Ò ÐÓ× Ú ÐÓÖ × Ñ × Ö ÒÓ× Ð ÒØÖÓ Ð ÒØ ÖÚ ÐÓ
    ÓÒ¬ ÒÞ Ý Ù ÖÓÒ Ö Ð Þ Ó× ×Ó Ö ÙÒ ÁÒØ Ð È ÒØ ÙÑ ÁÁÁ ¼¼ Å Þº
  Å       × ×Ó Ö ÖÕÙ Ø ØÙÖ × Ö ÒØ × ¹ËÔ Ö Ý ÅÁÈ˹¸ ×ØÙ Ó× ×Ó Ö × × Ó× Ô Ö Ú Ö ¬ Ö ÓÒ × Ð
×ÔРݸ ÓØÖ × Ñ ØÖ × ¹ÒÙÑ ÖÓ ÖÓØ ÓÒ ×¸ ÔÓÖ ÑÔÐÓ¹ Ý Ò Ð × × Ñ × Ü Ùר ÚÓ× ÙÒ ×Ø Ò Ô Ò ÒØ ×
Ý × ÙÒ ÑÔÓ ÖØ Ð Ô Ö ØÖ Óº
6.7. Conclusi´n
             o                                                                              543



               ¼
                                 ÎÄ    3
               ¼         ÊÓ Ó¹Ò ÖÓ     +
                          Ð ØÓÖ Þ Ó    2                                                2
                                                                                        ×
                              ÌÖ Ô     ×                                            ×
                                                                                    2
               ¼               ËÔÐ Ý                                         2 2
                                                                             × ×
                               Ò ÖÓ                                  2 2
                                                                         2
                                                                         ×
               ¼       ÐØÙÖ Ñ Ò Ñ
          Ð                                                      2 2 ×
                                                                       ×
          Ø                                                        ×
          Ù                                                      ×
          Ö   ¿¼                                             2
                                                             ×
                                                         ×
                                                       × 2
                                                       2   + 3
                                                             +
                                                         3 3
                                                         +
                                     ×               3 3
                                                     + +
              ¾¼                   2 2
                                                   +
                                                 + 3
                                               + 3
                               × × ×         + 3
                                           + 3
                                 2       + 3
                                       3 3
                                       +
              ½¼             × 2 3 3 3
                             2     + +
                         × 2
                           ×   3 +
                               +
                           3 3
                           + +
                     × × 3
                       + 2
                       2
                       3 +
                   3 3
                   + 2
                   × +
                   2
               ¼32
                 ×
                 +
                   ¼                              ½¼                 ½         ¾¼
                                                  n=2   k




                               ÙÖ º¿½      ÐØÙÖ             Ö ÒØ ×

        Ä Ñ ÒÓÖ ÙÖ ÓÒ Ñ           ÒØÖ Ð × ØÖ × Ö Ô Ø ÓÒ × × ÓÒ× Ö ÓÑÓ Ð Ø ÑÔÓ
          ÙÖ ÓÒº
ÄÓ ÒØ Ö ÓÖ × Ö Ô Ø Ó Ú × × Ö¸ × Ò Ö ÖÓÒ × Ù Ò × Ð ØÓÖ × Ò× Ö ÓÒº
Ä × Ö ¬ × ÓÖÖ ×ÔÓÒ Ò ÐÓ× ÔÖÓÑ Ó׺
    Ä ¬ ÙÖ º¿½ ÐÙ×ØÖ Ð × ÐØÙÖ × ÐÓ× × × Ø ÔÓ×                ×ØÙ Ó× Ô Ö × Ù Ò ×
     Ò× Ö ÓÒ Ð ØÓÖ ×º ר Ñ            × ÙØ Ð ÔÓÖÕÙ ÒÓ× ÙÒ             Ð Ó×ØÓ Ñ Ü ÑÓ
 ÒÚÓÐÙ Ö Ó Ò Ð Ù×ÕÙ º Ò ×Ø × ÒØ Ó¸ Ð ¬ ÙÖ º¿½ Ú Ò Ý ÓÒ¬ÖÑ Ð Ø ÓÖ
    Ö     ÕÙ ÐÓ× Ö ÓÐ × ÖÓ Ó¹Ò ÖÓ Ý ÎÄ ×ÓÒ ÐÓ× ÕÙ Ø Ò Ò Ñ ÒÓ× ÐØÙÖ º Ä ×ÓÖÔÖ ×
 ר Ö ¬ × ÕÙ ¸ Ð Ñ ÒÓ× Ô Ö ÒØÖ × Ð ØÓÖ ×¸ ÐÓ× Ö ÓÐ × ÖÓ Ó¹Ò ÖÓ ÒÓ Ð ÒÞ Ò
Ð ÓØ Ø ÓÖ 2 Ð (n + 1) − 2º
    Ð ÐÓÒ ØÙ Ð Ñ ÒÓ ÒØ ÖÒÓ ÒÓ× Ò                Ù Ò ÕÙ Ð Ö Ó ×Ø Ð Ö Óк Ò ×Ø
× ÒØ Ó Ð ¬ ÙÖ º¿¾ Ú Ò ÕÙ Ð Ð                     ØÓ Ó× ÐÓ× Ö ÓÐ × × ÕÙ Ú Ð ÒØ ¸ × Ò Ó
Ð Ö Ñ ÒØ ÚÓÖ Ð             ÐÓ× Ö ÓÐ × ÎÄ Ý ÖÓ Ó¹Ò ÖÓº
    Ä × ¬ ÙÖ × º¿½ Ý º¿¾ × ÓÒ Ò Ð Ó×ØÓ Ð ÓÔ Ö ÓÒ ×ÔÐ Ý Ô Ö ÐÓ× Ö ÓÐ × Ð
Ñ ×ÑÓ ÒÓÑ Ö ¸ ÔÙ × Ð ÜÔ Ö Ñ ÒØÓ ÒÓ ÓÒ× Ö Ò ÑÙÐ Ð ÐÓ Ð                   Ö ÖÒ º Ò
 ר × ÒØ Ó¸ Ô Ö ÕÙ × Ù ÐÕÙ Ö             ÒØÖ Ð × Ð Ú × Ø Ò Ð Ñ ×Ñ ÔÖÓ Ð
  Ù× Ö× ¸ ÒØÓÒ × Ð Ö ÓÐ ×ÔÐ Ý × Ð Ñ × ÔÓ Ö × ÑÔ ÒÓº È ÖÓ ×ØÓ × ÔÙ × Ö
  Ð Ó×Ó¸ ÔÙ × Ð ÐÓ Ð           Ö Ö Ò Ù ÙÒ ÖÓÐ ÙÒ Ñ ÒØ Ð Ò Ð Ñ ÝÓÖ                  Ð×
 ÔÐ ÓÒ ×º Ò ÐÓ× Ö ÓÐ ×          ÐØÙÖ ÓØ ¸ ÐÓ× ÔÖÓ Ð ×Ø Ó× Ý ÐÓ× Ò Ö Ó× Ð × Ó׸
Ð × Ð Ú × Ñ × Ö ÒØ × Ø Ò Ò Ò ÓÒØÖ Ö×               Ð × Ó × Ñ ÒØÖ × Ñ × ÓÚ Ò × ÙÒ
 Ð Ú ¸ Ñ ÝÓÖ × Ð Ø ÑÔÓ ×Ô Ö Ó          Ù×ÕÙ º ×ØÓ ÒÓ ×Ù          ÓÒ ÙÒ Ö ÓÐ ×ÔÐ Ý Ð ×
 Ð Ú × Ö ÒØ Ñ ÒØ             × × Ò Ù ÒØÖ Ò Ö Ò × Ð Ö Þ¸ ÔÓÖ ÐÓ ÕÙ Ð × ÑÔ ÒÓ
      Ö    × Ö ÓÒ× Ö Ð Ñ ÒØ Ñ ÓÖ Ô Ö ÔÐ ÓÒ × ÓÒ ÐÓ Ð                   Ö ÖÒ º
    Ä × ÙÖ ÓÒ × Ò× Ö ÓÒ Ý Ð Ñ Ò ÓÒ Ô Ö ÐÓ× Ö ÓÐ × ×ÔÐ Ý ÒÓ × ÑÙ ×ØÖ Ò ÔÓÖÕÙ
×ÓÒ Ø Ò ÒÓØ Ð Ñ ÒØ ×ÙÔ Ö ÓÖ × Ð Ö ×ØÓ ÕÙ ×Ù Ú ×Ù Ð Þ ÓÒ Ó ×Ø ÙÐ Þ Ö ÔÖ Ö Ð ×
     Ö Ò × ÒØÖ Ð × Ñ × ÙÖÚ ×º
    Ë Ò ÐÓ× Ò Ó Ò ÓÕÙ × ÕÙ Ð Ö Ó Ó Ö Ò × ÑÔ ÒÓ× O(Ð n) Ô Ö Ð × ØÖ × ÓÔ ¹
544                                      Cap´        ´
                                                  ıtulo 6. Arboles de b´ squeda equilibrados
                                                                       u



        1.07374e+09
                                     AVL
                             Rojo−negro
                            Aleatorizado
                                  Treap
        3.35544e+07              Binario
                                   Splay
                             IPL mínimo

        1.04858e+06



              32768
IPL




               1024



                 32



                  1



            0.03125
                      0                    5               10            15          20
                                                                2**k




                          ÙÖ º¿¾ ÁÈÄ Ô Ö          Ö ÒØ ×        ´ Ò × Ð ÐÓ Ö ØÑ µ

      Ö ÓÒ × ÙÒ Ñ ÒØ Р׸ × ÖÙ Ð Ó × ÖÚ Ö ÕÙ Ô Ö Ð Ò× Ö ÓÒ Ý Ð Ñ Ò ÓÒ ØÓ Ó× ×ØÓ×
       Ò ÓÕÙ × ÕÙ Ð Ö Ó ÖÖ Ò Óר × ÓÒר ÒØ × × Ú Ö Ñ ÒØ Ñ ÝÓÖ × ÕÙ ÐÓ× ÙÒ
       Ð × Óº Ä × ¬ ÙÖ × º¿ Ý º¿ Ú Ò Ò Ö Ñ Ø Ñ ÒØ ר ×Ô ØÓ Ð                           Ð× Ó
       × Ð Ñ × Ö Ô Ó ×Ø 2       19 ÒÓ Ó× Ô Ö Ð    Ò× Ö ÓÒ Ý 2 14 ÒÓ Ó× Ô Ö Ð   Ð Ñ Ò ÓÒº
      Ô ÖØ Ö ×ØÓ× Ú ÐÓÖ ×¸ Ð           Ð × Ó × Ð Ö Ñ ÒØ Ò Ö ÓÖ Ô ÖÓ × Ø Ò Ù ÒÓ ÓÑÓ Ð
      ÖÓ Ó¹Ò ÖÓ Ý Ð Îĺ È Ö ×Ø ÙÐØ Ñ Ó × ÖÚ ÓÒ ÒÓ ×                 ÓÐÚ Ö ÕÙ ÐÓ× ÓÖ Ò ×
       Ò× Ö ÓÒ ×ÓÒ Ð ØÓÖ Ó׺
             Ò Ð × Ð ÓÒ ÙÒ Ö ÓÐ ÒÓ ×                  ×ÔÖ Ö Ð Ù×Ó ÙÒ              Ð × Óº Ò
      Ø Ð × ÒØ Ó¸ ÙÒ            ÓÒ× Ö Ö× ÒØ × ÕÙ Ù Ð ×ÕÙ Ö           ÐÓ× Ñ ØÓ Ó× ÕÙ Ð Ö Ó
         × ÖÖÓÐÐ Ó× Ò ×Ø Ô ØÙÐÓº Ä × Ð ÓÒ ÙÒ                           ÓÒ× Ö Ö ÐÓ× × Ù ÒØ ×
       ×Ô ØÓ×
          ½º Ä × Ð Ò ÙÒ ÓÒ Ð ÒÙÑ ÖÓ ÒÓ Ó× × Ô ÕÙ Ò Ó Ñ Ò º
          ¾º Ä × × Ù Ò × Ò× Ö ÓÒ ÒÓ            Ò ×Ø Ö ÓÒ× Ö Ð Ñ ÒØ × × ×¸ ÔÙ × ÙÒ
              × O(Ð n) Ô Ö Ò× Ö ÓÒ × Ð ØÓÖ ×º Ë Ð × × Ù Ò × Ò× Ö ÓÒ ×ÓÒ Ð ØÓÖ ×¸
              ÒØÓÒ × × ÔÙ       ÓÒ× Ö Ö ÙÒ        Ô Ö Ö Ò × × Ð ×º
          ¿º ÈÙ ×ØÓ ÕÙ Ð × Ð Ñ Ò ÓÒ × Ö Ò ÙÒ              ¸ Ð ÒÙÑ ÖÓ Ð Ñ Ò ÓÒ ×          ×Ö
             ÑÙ Ó Ñ ÒÓÖ ÕÙ Ð Ò× Ö ÓÒ ×º
           º Ð × ÑÔ ÒÓ O(Ð n) × ÔÖÓ Ð ×Ø Óº ÙÒ ÓÒ Ò× Ö ÓÒ × Ð ØÓÖ × Ý Ù× Ò
                 Ð Ñ Ò ÓÒ ×¸ ÙÒ         ÔÙ      Ü Ö ÙÒ ×Ó × ÓÖØÙÒ Óº ÈÓÖ ÐÓ Ø ÒØÓ¸ ÙÒ
                   ÒÓ     ÙØ Ð Þ Ö× × Ü ×Ø Ò Ö ÕÙ Ö Ñ ÒØÓ ×ÓÐÙØÓ×         × ÑÔ ÒÓº
           Ä        ×Ù Ý ÒØ        ÐÓ× Ò ÓÕÙ × Ð ØÓÖ Þ Ó× × Ð Ñ Ò Ö Ù ÐÕÙ Ö × × Ó Ò Ð
       Ò× Ö ÓÒ Ó Ð Ñ Ò ÓÒ Ñ ÒØ              × ÓÒ × Ð ØÓÖ × ÕÙ Ð ØÓÖ Þ Ò Ð Ö ÓÐ         Ò ÓÐÓ
       ÕÙ Ú Ð ÒØ ÙÒ           ÓÒרÖÙ Ó Ô ÖØ Ö ÙÒ × Ù Ò Ð Þ Öº ÓÒ× Ù ÒØ Ñ ÒØ ¸ ×
      ÔÙ ÑÔÐ Ö ÙÒ Ö ÓÐ Ð ØÓÖ Þ Ó Ó ÙÒ ØÖ Ô Ù Ò Ó × Ø Ñ × × Ó Ò Ð ÒØÖ º ÈÙ ×ØÓ
6.7. Conclusi´n
             o                                                             545




                                   ´ µ ÌÖ Ô




                                    ´ µ Ð ØÓÖ Ó




                                     ´ µ ËÔÐ Ý




                                      ´ µ ÎÄ




                                   ´ µ ÊÓ Ó¹Ò ÖÓ

  ÙÖ º¿¿          Ö ÒØ × ÑÓ ÐÓ×   ÕÙ Ð Ö Ó Ý ×Ù× Ö ÓÐ × Ö ×ÙÐØ ÒØ × Ô Ö Ð Ñ ×Ñ
× ÙÒ       512    Ð Ú × Ð ØÓÖ ×
546                                       Cap´        ´
                                             ıtulo 6. Arboles de b´ squeda equilibrados
                                                                  u



                 ½
                                 ÎÄ   3                                                          2
                 ½        ÊÓ Ó¹Ò ÖÓ   +                                                      2
                          Ð ØÓÖ Þ Ó   2                                             2
                                                                                        2
                 ½¾            ÌÖ Ô   ×
                                                                                2
                               Ò ÖÓ                                         2
                 ½¼                                                     2
                                                                  2 2                        × ×
        μ×   ×
                                                              2                     × ×
                                                       ×       3
                                                               +
                                                          23 3
                                                             +
                                                   × × 3 3 +
                                                      2
                                       2               + +
                                     2         × × 3 3
                                                 3 +
                                                     +
                               2 2
                                   2         × 3 +
                                             3 +
                   2 2 2 2 2 2           × × +
                                       × 3 3
                                           +
                  ¾× 3 3 3 3 3 3 3 3 3 3 +
                                 × × × +
                   3 × × × × × × + + +
                   + + + + + + +

                  ¼
                      ¼                          ½¼                 ½                   ¾¼
                                                 n=2      k




                          ÙÖ º¿ Ì ÑÔÓ         Ò× Ö ÓÒ Ô Ö           Ö ÒØ ×
ÕÙ Ð × ÑÔ ÒÓ × ÔÖÓ Ð ×Ø Ó¸ ×                Ö ÒØ Þ Ö Ð Ð       Ð Ò Ö ÓÖ ÒÙÑ ÖÓ×
Ô× Ù Ó Ð ØÓÖ Ó׺ ÙÒ ÓÒ ÙÒ Ù Ò Ò Ö ÓÖ ÒÙÑ ÖÓ× Ð ØÓÖ Ó׸ Ð × ÑÔ ÒÓ ÙÒ
 Ò ÓÕÙ Ð ØÓÖ Þ Ó × ×Ù× ÔØ Ð Ð Ò ÓÖØÙÒ Óº × Ô٠׸ ÐÓ× ÕÙ Ð Ö Ó× ÔÖÓ Ð ×Ø Ó×
ÒÓ       Ò Ù× Ö× × × ÔÖ × ÒØ Ò Ö ×ØÖ ÓÒ × Ù ÖØ ×        × ÑÔ ÒÓº
    Ä × ¬ ÙÖ × º¿ Ý º¿ Ú Ò Ò Ð Ö ÓÐ Ð ØÓÖ Þ Ó ÓÑÓ ÙÒÓ ÐÓ× Ñ × ÓרÓ×Ó׺
         Ó¸ Ô Ö Ð Ò× Ö ÓÒ¸ × ÔÖ ÙÒ             Ö     ÓÒ ÔÖ Ð ÓÒ ÓÖÑ ÙÑ ÒØ Ð
ÒÙÑ ÖÓ ÒÓ Ó׺ Ö              ÓÒ ÕÙ ÒÓ Ó ÙÖÖ ÓÒ Ð ÓØÖ ÐØ ÖÒ Ø Ú Ð ØÓÖ Þ        Ð ØÖ Ôº
 Ò Ð ÓÔ Ò ÓÒ Ð ÙØÓÖ¸ ×ØÓ × ÜÔÐ Ð ÔÓÖ Ð × × Ù ÒØ × Ö ÞÓÒ ×
   ½º ÄÓ× Ö ÓÐ × Ð ØÓÖ Ó× ×ÓÒ Ñ × × Ò× Ð × Ð Ð           Ð Ò Ö ÓÖ ÒÙÑ ÖÓ× Ð ØÓ¹
      Ö Ó× ÕÙ ÐÓ× ØÖ Ô׺ ÄÓ×        Ö ÕÙ Ö Ò ÒÙÑ ÖÓ× Ð Þ Ö ÒØÖ ÖÓ Ý Ð Ö Ò Ð
         Ð Ö ÓÐ Ñ ÒØÖ × ÕÙ Ð × ÔÖ ÓÖ       × ÐÓ× ØÖ Ô× ÙØ Ð Þ Ò ØÓ Ó Ð ×Ô ØÖÓ Ð
         Ò Ö ÓÖ ÒÙÑ ÖÓ× Ð ØÓÖ Ó׺ ר              Ó × ÑÔÓÖØ ÒØ      ÓÒ× Ö Ö ÔÓÖÕÙ
       Ð Ö Ò Ó Ö ×ØÖ Ò Ó ÐÓ× Ö ÓÐ × Ð ØÓÖ Ó× ÐÓ          Ñ × × Ò× Ð    ÐР׸ × × Ó× Ý
         Ñ × ÑÔ Ö ÓÒ × Ð Ò Ö ÓÖ ÒÙÑ ÖÓ× Ð ØÓÖ Ó׺
      ÇØÖÓ ×Ô ØÓ ÓÒ× Ö Ö × ÕÙ Ð ØÖ Ô ØÙ ÑÙ × Ñ ÒÓ× ÐÐ Ñ × Ð Ò Ö ÓÖ
           ÒÙÑ ÖÓ× Ð ØÓÖ Ó× ÕÙ Ð         º Ð ØÖ Ô Ò Ö ÙÒ Ð ØÓÖ Ó ÙÒ ×ÓÐ Ú Þ ÔÓÖ
       Ò× Ö ÓÒ Ñ ÒØÖ × ÕÙ Ð               ØÙ ×ÓÖØ Ó× Ò Ð Ò× Ö ÓÒ Ý Ò Ð Ð Ñ Ò ÓÒº
            Ñ ×¸ Ð         ÔÙ Ö Ð Þ Ö Ú Ö Ó× ×ÓÖØ Ó× Ò        ÓÔ Ö ÓÒº Ä ÒØ
       ×Ô Ö         ×ÓÖØ Ó× Ô Ò         Ð Ö ÒÐ          Ð Ö ÓÐ Ñ ÝÓÖ ÒØ
      ÒÓ Ó׸ Ñ ÝÓÖ Ð ÒÙÑ ÖÓ ×Ô Ö Ó ×ÓÖØ Ó׺ ר ÓÒ× Ö ÓÒ × × Ò Ð¸ ÔÙ ×
      ÑÙ Ó× Ò Ö ÓÖ × ×Ù Ö Ò           Ø     Ò Ð × ÒØ Ó ÕÙ ×Ù Ð ØÓÖ           ×Ñ ÒÙÝ
       ÓÒ ÓÖÑ ÙÑ ÒØ Ð ÒÙÑ ÖÓ ÐÐ Ñ ×º
   ¾º ÄÓ× Ð ÓÖ ØÑÓ× Ð ØÖ Ô ×ÓÒ Ñ × × ÑÔÐ × Ý Ø Ò Ò Ñ ÒÓ× Óר × ÓÒר ÒØ × ÕÙ ÐÓ×
         Ð       º
    Ä × Ù× ÓÒ ÒØ Ö ÓÖ Ú Ò Ð Ö Ñ ÒØ ÕÙ × Ü ×Ø Ò Ö ×ØÖ ÓÒ × Ò× ÐÚ Ð ×
  × ÑÔ ÒÓ Ý × ÒÓ Ý ×Ô Ó Ô Ö Ð Ñ Ð ×Ù ÖØ ¸ ÒØÓÒ × Ð × Ó Ò                         ØÓ ×
6.8. Notas bibliogr´ficas
                   a                                                                 547



                                                                          2
                                                                        2 ×
                                  ÎÄ   3                              ×
                           ÊÓ Ó¹Ò ÖÓ   +                              2 × 3
                           Ð ØÓÖ Þ Ó   2                            2     +
                                                                        3
                                ÌÖ Ô   ×                          2     +
                                Ò ÖÓ                              × × 3
                                                                      +
                                                                2
                                                                × 3 3
                                                                    +
                                                              2   +
                                                                3
                                                            2 × +
                                                              3
         μ×    ×                                          2 3 +
                                                            ×
                                                            +
                                                          3
                                                          ×
                                                          +
                                               3
                                               2
                   ¿                           +
                                             2 ×
                                             3
                                             +
                   ¾                     3 3
                                           2
                                     3 3 + × ×
                               3 3 3 + + 2 +
                                 2 + 2 2
                     3 3 3 3 3 + + × × × ×
                                   2
                     + + + + + 2 ×
                         2   2
                     2 × × × × ×
                           2
                   ½ × 2
                       ¼                     ½¼             ½            ¾¼
                                              n=2   k




                           ÙÖ º¿ Ì ÑÔÓ     Ð Ñ Ò ÓÒ Ô Ö         Ö ÒØ ×

ÙÒ Ö ÓÐ ÓÒ          ÐØÙÖ ÓØ       ÙÒ ÎÄ Ó ÙÒ ÖÓ Ó¹Ò ÖÓº Ë × × ÙÒ ÑÔÐ Ñ ÒØ ÓÒ
× Ò ÐÐ Ý ÕÙ         Ü     Ù Ò Ø ÑÔÓ¸ ÒØÓÒ ×¸ Ò Ð ÓÔ Ò ÓÒ Ð ÙØÓÖ¸ ÐÓ× ØÖ Ô× ×ÓÒ Ð Ñ ÓÖ
 ÐØ ÖÒ Ø Ú º        Ò ÐÑ ÒØ ¸ × × Ø Ò ÓÒÓ Ñ ÒØÓ ÙÒ Ù Ò ÐÓ Ð                  Ö ÖÒ ¸
 ÒØÓÒ × Ð          × ÑÔ ÒÓ ÐÓ× Ö ÓÐ × ×ÔÐ Ý ÔÙ × Ö ×Ô Ø ÙÐ Öº

6.8    Notas bibliogr´ficas
                     a
Ä      רÓÖ    ÐÓ× Ò ÓÕÙ ×    ÕÙ Ð Ö Ó ÙÒ Ö ÓÐ ÓÑ ÒÞ ÔÓÖ ÐÓ× Ö ÓÐ × Ò Ö Ó×
     Ù×ÕÙ     Ð × Ó׺ ÔÖ Ò Ô Ó ½ ¼¸ ÐÓ× ÒÚ ×Ø ÓÖ × Ý × Ò ÕÙ Ð × ÔÖÓÑ × ×
      × ÑÔ ÒÓ ÙÒ         ×ÓÐÓ Ö Ò Ú ÒØ × ÓÒ ÓÒ Ø Ò Ö × Ù Ò × Ò× Ö ÓÒ
 Ð ØÓÖ × Ý ÒÓ Ó ÙÖÖ Ö Ü × Ú × Ð Ñ Ò ÓÒ ×º
      Ò ½ ¾ × ÔÙ Ð ÖÓÒ ÐÓ× Ö ÓÐ × ÎÄ ÔÓÖ Ð×ÓÒ Î Ð× Ý Ý Ä Ò × ½ º À ר Ö ÒØ ¹
Ñ ÒØ ¸ רÓ× Ö ÓÐ × Ô ÖÑ Ò ÖÓÒ Ð × Ó Ò          ØÓ Ò Ð ÑÔÐ ÒØ ÓÒ Ø Ð ×
× Ñ ÓÐÓ× Ò Ñ ÑÓÖ ÔÖ Ò Ô Ðº ÙÒ ÓÝ Ò ¸ ר Ð ×           Ö ÓÐ × Ù× Ö Ù ÒØ Ñ ÒØ
Ý ÓÒ ÓÖÑ Ð ×Ø Ò Ö ÑÙ × ÔÐ ÓÒ ×º
      Ð ÒÙÑ ÖÓ ϕ × ÑÙÝ ÑÔÓÖØ ÒØ Ò ÑÙ Ó× ÐÙ Ö × Ð × Ñ Ø Ñ Ø ×º × ÔÖÓ Ð
ÕÙ ×Ù Ù×Ó ÔÖÓÚ Ò       Ð ÑÙÒ Ó ÖØ ר Ó Ô٠׸ × Ø ÑÔÓ× ÒÑ ÑÓÖ Ð ×¸ ϕ × Ó
 ÓÒ× Ö Ó ÓÑÓ Ð Ñ × ÐÐ ÔÖÓÔÓÖ ÓÒ ÒØÖ Ó× Ö ÒØ × Ø Ñ ÒÓ׺ × Ö Ïº ¹
  ×ØÖ ÜÔÓÒ ÐÓ× ÒÙÑ ÖÓ×          ÓÒ Ý Ð × ÓÒ ÙÖ ÓÖ ÒØ                Ð× Ò ×
 ÓÑÔÙØ ÓÒ Ð × º
      ר ÔÖÓÔÓÖ ÓÒ ×Ø ÓÒÑ Ò × ÒØ Ñ ÒØ ÔÖ × ÒØ ÐÓ Ð Ö Ó ØÓ Ð Ò ØÙÖ Ð Þ ¸ Ð Ò ØÓÑ ÙÑ Ò ¸
 Ò ÐÙ× Ú º ÓÑÓ ÑÔÐÓ× Ú Ò Ó×Ó׸ Ð ÓÑ Ð Ó × ÓÒ× Ö Ó ÔÓÖ ÐÓ× × ÙÐØÓÖ × ÓÑÓ Ð Ú × ÓÒ Ò ØÙÖ Ð
   ØÓ Ó Ð Ù ÖÔÓº ÈÙ × Ò¸ Ð ×Ø Ò        × Ð ×Ù ÐÓ Ð ÓÑ Ð Ó¸ Ú          ÒØÖ Ð ×Ø Ò     × Ð
ÓÑ Ð Ó ×Ø Ð        Þ × ϕº Ð Ñ ×ÑÓ ÑÓ Ó¸ Ü Ø Ñ ÒØ Ð Ñ ×Ñ ÔÖÓÔÓÖ ÓÒ × ÔÖ × ÖÚ         ÒØÖ Ð
     Þ Ý Ð ÕÙ      ÓÒ ϕ ר Ù        Ó Ò Ð ÔÙÒØ     Ð Ò Ö Þº ÌÓ × Ð × Ô ÖØ × Ð Ù ÖÔÓ ÙÑ ÒÓ
Ö ×Ô Ø Ò ×Ø ÔÖÓÔÓÖ ÓÒº
  Ä ÔÖÓÔÓÖ ÓÒ Ò Ù ×Ø ÓÒ × ÕÙ ¸ Ð Ú Ö ÙÒ × Ñ ÒØÓ Ò Ó× Ô ÖØ ׸           ÑÓ× x y¸ × × Ø ×
Ð × Ù ÒØ Ù ÓÒ x+y = y º Ë × Ö Ð Þ Ð ØÖ Ò× ÓÖÑ ÓÒ ϕ = y × Ø Ò Ð Ù ÓÒ Ú Ò
                     x
                           x
                                                                x
548                                 Cap´        ´
                                       ıtulo 6. Arboles de b´ squeda equilibrados
                                                            u



       ¬Ò Ð × ½ ¼ ÒÚ ×Ø ÓÒ × Ò Ö ÙÔ Ö ÓÒ Ð Ú × Ò ÐÑ Ò Ñ ÒØÓ × ÙÒ¹
   Ö Ó ÓÒ Ù ÖÓÒ ÙÒ ÒÙ Ú Ý ÔÓÔÙÐ Ö Ð ×            Ö ÓÐ Ð ¸ × Ù ÖØÓ ÔÓÖ Ý Ö º
  ר Ð ×       Ö ÓÐ Ò ÖÓ ÙÒ ÓÖÖ ÒØ         ÒÚ ×Ø ÓÒ ÕÙ ÓÒ Ù Ó Ú Ö× × ×ØÖÙ ØÙÖ ×
      Ù×ÕÙ     Ò Ñ ÑÓÖ ÔÖ Ò Ô Ð¸ ÒÓØ Ð Ñ ÒØ Ð Ö ÓÐ ¾¹¿ × Ù ÖØÓ ÔÓÖ ÀÓÔ ÖÓ Ø
Ý × Ö ØÓ ÔÓÖ Ó¸ ÀÓÔ ÖÓ Ø Ý ÍÐÐÑ Ò ¾ Ý Ð Ö ÓÐ Ò Ö Ó × Ñ ØÖ Ó ÕÙ × ÙÒ ×Ó
Ô ÖØ ÙÐ Ö Ð Ö ÓÐ         × Ù ÖØÓ ÔÓÖ Ý Ö ¿ º ÄÓ× Ö ÓÐ × ÖÓ Ó¹Ò ÖÓ ×ÓÒ ÙÒ ÕÙ Ú Ð ÒØ
  Ò Ö Ó ÙÒ Ø ÔÓ         Ö ÓÐ Ù Ø ÖÒ Ö Ó ÒÓÑ Ò Ó ÔÓÖ Ý Ö ¾¹¿¹ º ÁÑÔÐ ÒØ Ö Ö ÓÐ ×
¾¹¿¹ Ò Ñ ÑÓÖ × ÓÑÔÐ Ó ÔÓÖÕÙ Ò ÙÒ ÒÓ Ó                 Ò Ñ ÒØ Ò Ö× Ð Ú × ÓÖ Ò × Ý
ÔÙÒØ ÖÓ× ÐÓ× Ó׺ ר Ð Ö ØÓÖ × ÑÔÓÖØ ÒØ ÔÓÖÕÙ Ð × ÑÓ×ØÖ ÓÒ × Ö Ð
   Ö ÒØ        Ð Ò ÔÙ Ò Ö Ð Þ Ö× Ö Ø Ñ ÒØ ÓÒ ÐÓ× Ö ÓÐ × ¾¹¿¹ º
      Ò½ ¸ Ù ×ÝË Û                    ÔÖÓÚ ÖÓÒ ÙÒ ×ÓÑÓÖ¬×ÑÓ ÒØÖ ÐÓ× Ö ÓÐ × ¾¹¿¹
Ý ÐÓ× Ö ÓÐ × Ò Ö Ó×        Ù×ÕÙ Ý ÒÙÒ ÖÓÒ Ð Ö ÓÐ Ó ØÓ ר × ÓÒ Ð Ö ÓÐ
ÖÓ Ó¹Ò ÖÓº Ô ÖØ ÕÙ × Ñ × Ð ÑÔÐ ÒØ Ö ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ ÕÙ ÙÒ Ö ÓÐ ¾¹¿¹ ¸
Ð ¬Ò ÓÒ º ר Ð ÙÒ Ò ÓÕÙ ÓÑ Ò ØÓÖ Ó¸ Ò ØÙÖ Ð¸ Ô Ö Ú Ö ÔÓÖ ÕÙ ÐÓ× Ö ÓÐ ×
ÖÓ Ó¹Ò ÖÓ ×ÓÒ Ð Ò Ó׺ ÏÓÓ ½ ¸ Ó Ö ÙÒ Ü Ð ÒØ × Ñ Ô Ö×Ô Ø Ú ÐÓ× Ö ÓÐ ×
ÖÓ Ó¹Ò ÖÓ ×         Ò ×Ù× ÔÖÓÔ      × ÖÓÑ Ø ×        Ó Ð Ù Ð × ÓÒר ØÙÝÓ Ð × ÙÖ×Ó
     ר Ø ÜØÓº
    ÄÓ× ØÖ Ô× Ù ÖÓÒ × Ù ÖØÓ× ÔÓÖ ÎÙ ÐÐ Ñ Ò Ò ½ ½ Ý ×ØÙ Ó× Ò ÔÖÓ ÙÒ
ÔÓÖ Ë Ð Ý Ö ÓÒ ½¿ º ÈÓÖ ×Ù × ÑÔ ÒÓ Ý × Ò ÐÐ Þ¸ ר Ð ×             Ö ÓÐ × Ð × Ð ÓÒ
  ÚÓÖ Ø ÑÙ × ÔÐ ÓÒ ×º
    ÅÙ × Ö Ò × × ×ÓÒ × ÑÔÐ × Ý Ò ØÙÖ Ð × ÓÒ ÓÒ ÕÙ Ý Ý Ò × Ó Ö Ú ¹
Р׺ ÍÒ ÒÓØ Ð ÑÔÐÓ ÐÓ ÓÒר ØÙÝ Ò ÐÓ× Ö ÓÐ × Ð ØÓÖ Þ Ó× × Ù ÖØÓ× ÔÓÖ Å Ö¹
Ø Ò Þ Ý ÊÓÙÖ º ÙÖ ÒØ             × ÐÓ× Ø ÓÖ Ó× Ù× ÖÓÒ ÙÒ ×ØÖÙ ØÙÖ Ð ØÓÖ Ò ØÙÖ Ð
ÕÙ Ö ×ÓÐÚ × Ð × Ñ ØÖ         Ð Ð Ñ Ò ÓÒ ÙÒ         º Ô × Ö Ð ØÖ Ô ÎÙ ÐÐ Ñ Ò ½
Ý ÕÙ Ë Ð Ý Ö ÓÒ Ý Ò ÑÓ×ØÖ Ó ×Ù Ð ØÓÖ                    Ý ÕÙ Ú Ð Ò ÓÒ Ð         ½¿ ¸
 Ð Ö ÓÐ Ð ØÓÖ Þ Ó × ÙÒ ×ØÖÙ ØÙÖ Ò ØÙÖ Ð ÕÙ ÔÓÒ Ö ÔÖÓ Ð ×Ø Ñ ÒØ × ÙÒ Ð
 ÕÙ Ð Ö Ó Ù ÖØ Ï ÖØ ½ º
        × ÔÖ Ò Ô Ó× Ð ÓÑÔÙØ ÓÒ¸ ÐÓ× × Ò ÓÖ × × ×Ø Ñ × Ò ÙØ Ð Þ Ó Ð Þ¹
Ñ ÒØ ÙÖ ×Ø × ÙØÓ¹ Ùר ÒØ × ÕÙ ÑÙ Ú Ò Ð Ñ ÒØÓ× Ö ÒØ Ñ ÒØ                   Ó× ÔÓ× ¹
  ÓÒ × Ö Ô Ó ×Óº × Ð × Ù Ö Ñ ÒØÓ Ð Ò× Ö ÓÒ ÔÓÖ Ð Ö Þ ½ ¸ ÑÙ Ó×
ÔÖÓ Ö Ñ ÓÖ × Ù× ÖÓÒ ×Ø ×Ô ØÓ Ô Ö ÔÖÓÚ Ö Ð ÐÓ Ð                 Ö Ö Ò º È ÖÓ ÒÓ Ù
   ר ½ ¸ Ù Ò Ó ËÐ ØÓÖ Ý Ì Ö Ò ÔÙ Ð ÖÓÒ ÐÓ× Ö ÓÐ × ×ÔÐ Ý ½ ¸ ÕÙ × ×ÔÙ×Ó
ÙÒ Ö ÓÐ ÐÓ Ö ØÑ Ó Ò Ð × ÒØ Ó ÑÓÖØ Þ Óº Ò Ò ÙÖ ¸ ר Ù ÙÒÓ ÐÓ× ÔÖ Ñ ÖÓ×
 ×ØÙ Ó× ÓÒÚ Ò ÒØ × ×Ó Ö Ð Ò Ð × × ÑÓÖØ Þ Óº

6.9      Ejercicios
    ½º    Ù ÒØÓ× ÒÓ Ó× Ø Ò Ð Ö ÓÐ      Ð ¬ ÙÖ º½´ µ
ϕ 2 − ϕ − 1 = 0º
  ÈÙ ×ØÓ ÕÙ Ð Ñ ÝÓÖ ×ÓÑÓ× Ö Ý ÒØ ׸ Ò ÓÒÓÖ      Ó׸ Ö ÓÖ Ð ÍÒ Ú Ö×Ó ¹Ý Ð ÀÓÑ Ö Ò ÐÙ× Ú ¹
ϕ   × ÐÐ Ñ Ó Ð ÒÙÑ ÖÓ Ú ÒÓ¸ Ð ÒÙÑ ÖÓ    Ó׸ Ð Ö Ó ÓÖÓ Ó¸ ÖØ ר Ñ ÒØ ¸ Ð × ÓÒ ÙÖ ¸ ÔÙ ×
Ô Ö ÕÙ Ù Ð ÔÖÓÔÓÖ ÓÒ ÕÙ Ó× ÙØ Ð ÞÓ Ô Ö Ö Ö ÒÙ ×ØÖÓ ÑÙÒ Óº
    Ð ÒÓÑ Ö ϕ × Ò ÓÒÓÖ         ׸ ÓÒ× Ö Ó Ð Ñ × Ö Ò × ÙÐØÓÖ Ð ÒØ Ù Ö ¸ ÙØÓÖ Ð
 ר ØÙ      Ù× Ò Ð ÑÓÒØ ÇÐ ÑÔÓ¸ Ö Ð Þ      Ñ Ö¬Ð Ý ÓÖÓ¸ ÔÖÓÜ Ñ Ñ ÒØ Ò Ð ÒÓ ¼ º º ר
Ó Ö ¸ Ù Ò ÐÙ ÔÓÖ Ð ÔÓ Ø ÒØ Ô Ø Ö Ë ÓÒ¸ Ò ×Ù Ð Ö Ð ×Ø           Ð × × Ø Ñ Ö Ú ÐÐ × Ð ÑÙÒ Ó
 ÒØ ÙÓº
6.9. Ejercicios                                                                    549



  ¾º       × Ò Ð ÖÙØ Ò select gotoup root() ÔÖ × ÒØ Ò Ü º½ ´Ô Ò µ Ò ÙÒ ÓÒ
           Ð ÔÖÓ Ñ ÒØÓ insert by pos xt(()) ÜÔÐ Ó Ò Ü º½½º ´Ô Ò ¿ µº
  ¿º         ÙØ Ð × × Ù ÒØ × × Ù Ò × Ò× Ö ÓÒ Ò ÙÒ Ö ÓÐ Ð ØÓÖ Óº
       ´   µ   ½¾ ½ ¿ ¿¼ ½ ½ ½ ¼ ½¾ ¿      ½½ ½½¼ ½¿    ½ ½ ½ ½½ ½½¾ ½ ½
       ´   µ   ½ ¿ ½½ ¿ ½½½ ½¾ ½ ½¼½ ½¾ ¿ ½¾ ½ ½       ¾½ ½ ½¿ ½ ½ ½
       ´   µ   ½ ½ ½ ¾ ½¼ ½ ½ ½ ¿ ½¾ ½¼¾ ½¿ ½ ¾ ¿ ½ ½½          ½ ½ ¾ ½
       ´   µ   ½¼     ½¼    ¿ ½ ½ ¼ ½¿ ¿ ½ ¾ ½ ½ ½¼¼ ½½¾ ½  ¾ ½ ½ ¿ ½ ¼ ¿¿
       ´   µ   ½¾¿ ½ ¿ ½¿ ½ ¼ ½½ ½ ¼ ¾  ½¿    ¿ ½ ½ ½ ½¼ ¾ ½¼½

       È Ö ØÓ × Ð × × Ù Ò ×¸ ×ÙÑ Ð × Ù ÒØ × Ù Ò                  ÒÙÑ ÖÓ× Ð ØÓÖ Ó× ÒØÖ
       ½ Ý ½¼¼
         ¿½    ¿ ¾ ½½ ½¼ ¿ ¿ ¾¿ ¿ ½ ¿¼ ¿½ ½ ½¾ ¿ ¿¾        ¼ ¿ ¿¾ ½ ¿
       ¿ ½ ¾ ½¾ ½¿ ½ ¿ ½½ ¼ ¿¿     ¾      ½¿ ¿¼ ¾½ ½ ¿ ½ ¿ ½ ¿½ ¾¿ ¼ ¿
       ¿¼ ¿ ¿ ¼ ½ ¿ ¼ ½ ¿¼ ¾   ¾¿ ¿ ¼ ¿¿ ½¼ ¾¾ ¿ ¿¾ ¾ ½ ¼ ¿ ½¾ ½¼ ½¼ ¾
       ¿    ¾ ¾½ ¾ ½ ¾ ½ ¿ ¿ ¾ ¾¼ ¼ ¿½ ¾¼ ¼ ¿ ½¿ ½¿ ½ ¼ ¿           ¿ ¿
       ¿ ¿¾ ½    ½ ½ ¼ ¿¾ ¾ ½     ½¾ ¾ ¿¿ ¾
   º È Ö ÐÓ× × Ù ÒØ × Ö ÓÐ × Ð ØÓÖ Ó׸ ¬Ò Ó× ÔÓÖ ×Ù× Ö ÓÖÖ Ó× ÔÖ ¬ Ó׸ ÙØ
     Ð × × Ù Ò × Ð Ñ Ò ÓÒ         ×
      ´ µ Prefijo: ½½ ½ ½ ½ ½¼¾ ¿ ¼ ½ ¿ ½¼¿ ½¾ ½¾ ½ ¼ ½ ½ ¿ ½ ¾ ½ ¼ ½ ½
               Secuencia de eliminaci´n:
                                     o     ½¾ ½ ½ ½½ ½¾ ½ ¼ ½ ½ ½¼¾ ½ ¿
       ´µ      Prefijo: ½ ½ ¿ ½¼ ¼ ¿¿       ¿½ ¾¾ ¼ ½     ¾ ½ ½ ½ ½ ½½¾ ½¿ ½ ½
               Secuencia de eliminaci´n:
                                     o     ¿½ ½ ¾¾ ½ ½¼ ½½¾ ½ ½ ½ ½
       ´µ      Prefijo: ½¿¾   ¿ ¾ ½¾               ¼ ¾ ½¼ ½¼¾ ½ ¿ ½¿ ½ ½ ½ ½ ½
               Secuencia de eliminaci´n:
                                     o     ½ ½ ½ ½        ¾ ½        ¿
       ´µ      Prefijo:         ¾ ¾½ ½¿      ¿¼ ¿ ½ ½ ½¿¾ ½¼ ½¼½ ½ ¾ ½ ¼ ½ ½
               Secuencia de eliminaci´n:
                                     o     ¾ ½¿¾ ½¿ ½¼½ ½ ¼ ½ ½
       ´µ      Prefijo: ½ ¼ ¿ ¿ ¿ ½¿ ¿ ¾     ¿     ½½ ½     ¼ ½¾ ½¾¾ ½ ½¿ ½ ¾ ½ ½
               Secuencia de eliminaci´n:
                                     o       ¼ ¿ ½¾ ½ ¼ ½ ¾ ½¾¾ ½ ¿ ½¿

       È Ö ØÓ Ó× ÐÓ×      Ö Ó× ×ÙÑ Ð × Ù ÒØ × Ù Ò              ÒÙÑ ÖÓ× Ð ØÓÖ Ó× ÒØÖ ½
       Ý ½¼¼
       ½ ¿       ½¼¼      ¿ ¾¼ ¿ ¾ ½ ½¼¼    ¼     ¼ ½ ½ ¾½ ¾ ¼       ¼ ¿ ½ ¾¿
         ¼¿ ¾   ¿¿      ¿ ¼ ¿½ ¾   ¿ ½¾                ½ ¿ ¿ ¾½ ¿ ¾     ¼ ¿ ½¼¼
       ¿           ¿ ½¼ ½¿ ½¼¼ ½ ¿ ¼      ¿ ¿        ½      ¼ ¿¼ ¿¼        ¿ ¾
       ¿    ½ ¾     ½¾     ½¾     ¾ ¿¼ ¼ ¿  ¿¾ ¿                  ¿      ½
            ½ ¼ ¼½     ¼ ¿ ½¾ ½ ¾ ¾½ ¾ ¾ ¾      ¾ ¾ ¼½ ¼           ½
   º ×ØÙ Ð × ÑÔ ÒÓ Ð × Ù ÒØ Ð ÓÖ ØÑÓ Ô Ö Ð Ñ Ò Ö Ò ÙÒ Ö ÓÐ Ð ØÓÖ Þ Óº
    Ë Ð ÒÓ Ó Ð Ñ Ò Ö ×Ø Ò ÓÑÔÐ ØÓ¸ ÒØÓÒ × ×               ØÙ Ð Ð Ñ Ò ÓÒ ØÖ ÓÒ Ðº
    Ë ¸ ÔÓÖ Ð ÓÒØÖ Ö Ó¸ Ð ÒÓ Ó ×Ø ÓÑÔÐ ØÓ¸ ÒØÓÒ × × Ö Ð Þ ÙÒ ×ÓÖØ Ó Ô Ö × Ó Ö
     Ù Ð ÐÓ× ÒÓ Ó׸ Ð ÔÖ          ×ÓÖ Ó Ð ×Ù ×ÓÖ¸ × Ö ÒØ Ö Ñ Óº Ð ÔÖ      ×ÓÖ
    Ø Ò Ö ÙÒ ÔÖÓ Ð             1
                            | Ä(T)|   × Ö × Ð ÓÒ Ó¸ Ñ ÒØÖ × ÕÙ Ð ×Ù ×ÓÖ       ØÒÖ
    ÙÒ ÔÖÓ Ð            | Ê(T)| º ÈÖÙ
                           1
                                         Ó × ÔÖÙ ÕÙ Ð Ö ÓÐ Ö ×ÙÐØ ÒØ × Ð ØÓÖ Óº
    ´·µ
550                                Cap´        ´
                                      ıtulo 6. Arboles de b´ squeda equilibrados
                                                           u



   º Ò Ð Ù Ó× Ñ ÒØ Ð Ð ÓÖ ØÑÓ Ò× Ö ÓÒ Ò ÙÒ Ö ÓÐ Ð ØÓÖ Þ Ó Ý ×Ø Ñ
    Ð ÒØ        ×Ô Ö     ×ÓÖØ Ó× ÙÒØÓ ÓÒ ×Ù Ú Ö ÒÞ º
   º Ò Ð Ù Ó× Ñ ÒØ Ð Ð ÓÖ ØÑÓ Ð Ñ Ò ÓÒ Ò ÙÒ Ö ÓÐ Ð ØÓÖ Þ Ó Ý ×Ø Ñ
    Ð ÒØ        ×Ô Ö     ×ÓÖØ Ó× ÙÒØÓ ÓÒ ×Ù Ú Ö ÒÞ º
   º ÓÑÓ ×      Ñ Ò ÓÒ Ó¸ ÙÒÓ ÐÓ× ÔÖÓ Ð Ñ × ÐÓ× Ö ÓÐ × Ð ØÓÖ Þ Ó× × ÕÙ
    × Ö Ð Þ Ò ÑÙ Ó× ×ÓÖØ Ó× ÕÙ       Ò ÕÙ Ð Ò Ö ÓÖ ÒÙÑ ÖÓ× Ð ØÓÖ Ó× Ð¹
      Ò ×Ù ÔÙÒØÓ       Ø Ñ × Ö Ô Ñ ÒØ º ÈÖÓÔÓÒ ÙÒ ×ÕÙ Ñ ÕÙ Ñ Ò Ñ Ð ×
    ÔÓ× Ð     ×      Ø    Ð Ò Ö ÓÖ ÒÙÑ ÖÓ× Ð ØÓÖ Ó׺
   º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ò Ö ÙÒ Ö ÓÐ Ù×ÕÙ             Ð ØÓÖ Ó × Ö¸ ÕÙ ÓÖÖ ×¹
    ÔÓÒ Ð ¬Ò ÓÒ Ö ÓÐ Ð ØÓÖ Ó                 Ò Ü º¾ ´Ô Ò      µº
 ½¼º ÓÒ× Ö Ð × Ù ÒØ ÔÖÓØÓØ ÔÓ ÙÒ ÓÒ
           template <class Node> luka_to_tree(char *& cod)

         Ð Ù Ð Ö ØÓÖÒ Ð Ö ÓÐ Ò Ö Ó ÓÖÖ ×ÔÓÒ ÒØ Ð Ô Ð Ö ÄÙ × Û Þ ÐÑ ¹
       Ò       Ò cod ´Ú Ö Ü º ´Ô Ò ¿¾½µµº ×ÙÑ ÕÙ Ð Ô Ð Ö × ÓÖÖ Ø º × Ö Ð
        ÙÒ ÓÒ Ò Ù ×Ø ÓÒº
 ½½º   Ê Ð Ð × ÔÖÙ × ×Ø ר × Ô ÖØ Ò ÒØ × Ô Ö Ú Ö ¬ Ö × Ð ×ÓÖØ Ó Ò× Ö ÓÒ Ò
       Ð Ö Þ × ×ØÖ ÙÝ ÓÒ ÔÖÓ Ð               p = n+1 º
                                                  1


 ½¾º   Ê Ð Ð × ÔÖÙ × ×Ø ר × Ô ÖØ Ò ÒØ × Ô Ö Ú Ö ¬ Ö × Ð ×ÓÖØ Ó Ô Ö Ð × Ð ÓÒ
           Ð Ö Þ Ð Ð ÓÖ ØÑÓ          ÓÒ Ø Ò ÓÒ Ð ØÓÖ × ×ØÖ ÙÝ ÓÒ ÔÖÓ Ð
       p = m¸ ÓÒ m × Ð
             1
                                 ÒØ       ÒÓ Ó× Ð Ö ÓÐ ÞÕÙ Ö Óº
 ½¿º      × Ò ÙÒ Ð ÓÖ ØÑÓ ÙÒ ÓÒ              Ó× Ö ÓÐ × Ð ØÓÖ Ó× T1 Ý T2 Ø Ð ÕÙ Ð Ú ×
       Ô ÖØ Ò ÒØ × T1 ÔÙ Ò × Ö Ñ ÝÓÖ × ÕÙ Ð ÙÒ × Ð Ú × Ô ÖØ Ò ÒØ × T2º Ð
        Ð ÓÖ ØÑÓ        × Ö O(n Ð (n))º
 ½º       × Ò ÙÒ Ð ÓÖ ØÑÓ ÙÒ ÓÒ              Ó× Ö ÓÐ × Ð ØÓÖ Ó× T1 Ý T2 Ø Ð ÕÙ Ð Ú ×
       Ô ÖØ Ò ÒØ × T1 ÔÙ Ò × Ö Ñ ÝÓÖ × ÕÙ Ð ÙÒ × Ð Ú × Ô ÖØ Ò ÒØ × T2º Ð
        Ð ÓÖ ØÑÓ        × Ö O(n Ð (n))º
 ½º       × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ö Ð Ð Ò× Ö ÓÒ ÔÓÖ ÔÓ× ÓÒ Ò ÙÒ Ö ÓÐ Ð ØÓÖ Þ Óº
         Ð Ö ÓÐ Ö ×ÙÐØ ÒØ        × Ö Ð ØÓÖ Óº ÑÙ ×ØÖ ×Ù Ö ×ÔÙ ×Ø º ´·µ
 ½º       × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ö Ð Ð Ð Ñ Ò ÓÒ ÔÓÖ ÔÓ× ÓÒ Ò ÙÒ Ö ÓÐ Ð ØÓÖ Þ Óº
         Ð Ö ÓÐ Ö ×ÙÐØ ÒØ        × Ö Ð ØÓÖ Óº ÑÙ ×ØÖ ×Ù Ö ×ÔÙ ×Ø º ´·µ
 ½º       × Ò ÙÒ Ì ÕÙ Ú Ð ÒØ Gen Rand Tree<Key> Ò Ð Ù Ð ØÓ × Ð × ÓÔ Ö ÓÒ ×
       ÒÓ × Ò Ö ÙÖ× Ú ×º
 ½º         ÙØ Ð × × Ù ÒØ × × Ù Ò × Ò× Ö ÓÒ Ò ÙÒ ØÖ Ô
       ´ µ       ¾½ ¾½       ½ ½¾¿ ½ ½¾ ½ ¼ ½½ ½ ¾ ½¼  ¿¿ ¿ ¿
       ´ µ ½½ ¾ ½¾ ½¼ ½     ½¼¼ ½ ¾    ½ ½      ¼ ½¾ ½ ¿
       ´ µ ½ ½ ½ ½ ½¾¼ ½ ¾ ½½ ½¾¿ ½ ½ ½ ½ ½ ¿½ ½¼ ½ ¿ ½ ¾ ½
6.9. Ejercicios                                                                      551



        ´ µ ½¿¼ ½   ½ ¾ ½ ¾ ½¾ ½¾ ½ ¿ ¼ ½¾¾ ½¿ ½ ¼ ½ ½ ¿¼ ½ ½             ¿
        ´ µ ½ ½ ¿ ½¾¼ ½ ½      ½ ¼ ½ ½ ½¿ ¾ ½½ ½½ ¾½ ½¼ ½¼ ½ ¼ ½         ½ ½

       È Ö ØÓ × ÐÓ×       Ö Ó׸ Ù× Ð × Ù ÒØ × Ù Ò               ÒÙÑ ÖÓ× Ð ØÓÖ Ó×
       ¿¿ ½ ¾¿ ½        ¼½      ¿        ¿ ¿          ¾      ¾½ ¼
 ½ º È Ö ÐÓ× × Ù ÒØ × ØÖ Ô׸ ¬Ò Ó× ÔÓÖ ×Ù× Ö ÓÖÖ Ó× ÔÖ ¬ Ó׸             ÙØ Ð × × Ù Ò ×
        Ð Ñ Ò ÓÒ       ×
       ´µ    Prefijo: ½ ¾¾ ½        ½ ½¾      ¿¼    ¿ ½¾ ½¾ ½½ ½½¿ ½½½ ½ ¼ ½ ¿ ½ ½
             Secuencia de eliminaci´n: ½
                                   o          ¾¿ ½ ½½ ½½½ ¼ ½ ½ ½
       ´µ    Prefijo:         ½ ¾ ¿¾ ½      ¿ ½ ½¾ ¼ ½¼¾ ½¾ ½½ ½¼ ½¿ ½ ½ ½ ¾
             Secuencia de eliminaci´n:
                                   o     ½¼¼ ¿½ ½ ¼ ½     ½¼ ½ ½¼ ¾ ¿¾
        ´µ   Prefijo:         ¿ ½¿ ½ ¼    ½¿¿ ½½¾ ½ ½ ¿ ½ ½ ½ ½          ½½¿ ¿
             Secuencia de eliminaci´n:
                                   o     ½¿¿ ½ ½        ½    ½ ½ ½½
       ´µ    Prefijo: ½ ¼   ¿ ¾ ½             ½½¼ ½¼¾ ¿ ½¾ ½ ½ ½ ½ ½ ½ ½ ½ ½
             Secuencia de eliminaci´n:
                                   o     ¾¾ ¿ ¿ ¿ ½½ ½ ¼ ½¾¿ ½¾¿ ¾
        ´µ   Prefijo:   ½¾¾ ½½¿ ¾ ¾¾ ¾    ¾      ½ ¾ ½¿¿ ½¾ ½ ¿ ½¿ ½ ½ ½ ½ ½ ½ ½
             Secuencia de eliminaci´n:
                                   o     ½       ¼ ¾ ½ ¼ ¾ ½½ ½

 ¾¼º      × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÓÒרÖÙÝ ÙÒ ØÖ Ô Ó× × Ò Ó× ÖÖ ÐÓ× ÓÒ Ð Ú × Ý
       ÔÖ ÓÖ    ׺ Ð Ð ÓÖ ØÑÓ ÒÓ ÔÙ Ù× Ö Ð × ÔÖ Ñ Ø Ú × Ð ØÖ Ôº
 ¾½º      × Ò ÙÒ Ì ÕÙ Ú Ð ÒØ Gen Treap<Key> Ò Ð Ù Ð ØÓ × Ð × ÓÔ Ö ÓÒ × ÒÓ
       × Ò Ö ÙÖ× Ú ×º
 ¾¾º      × Ò ÙÒ Ð ÓÖ ØÑÓ O(n Ð (n)) ÕÙ    ØÙ Ð ÙÒ ÓÒ     Ó× ØÖ Ô׺
 ¾¿º      × Ò ÙÒ Ð ÓÖ ØÑÓ O(n Ð (n)) ÕÙ    ØÙ Ð ÒØ Ö× ÓÒ        Ó× ØÖ Ô׺
 ¾º       × Ò ÙÒ Ð ÓÖ ØÑÓ O(n Ð (n)) ÕÙ    ØÙ Ð Ô ÖØ ÓÒ ´×ÔРص      Ó× ØÖ Ô׺
 ¾º      ÓÒ× Ö ÙÒ ØÖ Ô Ò Ð Ù Ð Ð ÔÖ ÓÖ         ר      ÔÓÖ Ð ÒÙÑ ÖÓ            ×Ó׺
       Ñ ÝÓÖ ÒÙÑ ÖÓ        ×Ó׸ Ñ ÒÓÖ × Ð ÔÖ ÓÖ º       ר ÑÓ Ó Ð ØÖ Ô Ú Ò Ö
        ÙØÓ Ùר ÒØ Ò Ð × ÒØ Ó ÕÙ Ð × Ð Ú × Ö ÒØ Ñ ÒØ               × × Ò ÓÒØÖ Ö Ò
        Ò Ð Ö Þº ×ØÙ Ý ÓÑÔ Ö ×Ø Ñ ØÓ Ó ÓÒ Ð × Ð ÓÒ Ð ØÓÖ                 ÔÖ ÓÖ      ׺
 ¾º      ÓÒ× Ö Ð Ò× Ö ÓÒ ÔÓÖ Ð Ö Þ ÙÒ ØÖ Ô
                   Node * insert_root(Node * r, Node * p)


       Ä Ù Ð Ò× ÖØ Ð ÒÓ Ó p¸ ÓÒ Ð Ú         K(p)   Ý ÔÖ ÓÖ      ×Ó     Ð ØÓÖ Ñ ÒØ   P(p)¸
              ız Ð ØÖ Ô rº
       como ra´

       ´ µ ÁÒרÖÙÑ ÒØ Ð Ð ÓÖ ØÑÓ ÕÙ ÑÔÐ ÒØ insert root()º
       ´ µ ×ÙÑ Ò Ó ÕÙ Ð Ú ÐÓÖ P(p) × ÙÒ Ó Ò Ð ØÖ Ô Ö ×ÙÐØ ÒØ ¸ ÑÙ ×ØÖ ÕÙ
            Ð Ð ÓÖ ØÑÓ Ð ÔÖ ÙÒØ ÒØ Ö ÓÖ Ò Ö ÙÒ ØÖ Ôº
552                                  Cap´        ´
                                        ıtulo 6. Arboles de b´ squeda equilibrados
                                                             u



 ¾º        ÙØ Ð × × Ù ÒØ × × Ù Ò ×         Ò× Ö ÓÒ Ò ÙÒ Ö ÓÐ ÎÄ
      ´ µ ¾¿ ¾¼ ½      ½   ½   ½¼ ½¿ ¾¼ ½ ½ ¿ ½    ¾¿½   ½    ¾¿ ¾ ½¿ ¿¼ ½       ¾   ¼ ¿

      ´ µ ¾¼    ¾¾ ¾½ ¿ ½¾ ¾¾½ ¾¿¼ ½ ¾     ¾¼½ ¾¼ ¾½¾ ½ ¿         ½¿ ¾½     ½¾¾
          ½
      ´ µ ¾ ½ ½½¿ ½ ½ ½ ½    ¾ ½ ¾¾¿ ½¼ ½¾¾ ½ ½ ½¼¼ ½½ ½ ¾½ ¾ ½ ¾¾ ½ ¾ ½¾¿ ¾¾
          ¾ ¾½¾
      ´ µ ½    ¾ ½ ¿ ¾½¿ ¾¿¼ ¾ ½½ ½ ½        ¾¿½ ¼ ½ ¿ ½¼ ¾¾  ¾ ½¾ ½¿¾ ½ ½¿

      ´ µ ¿ ¾¿ ½ ¾ ¾ ½ ¾ ½     ½¼ ¿¼ ½ ¼ ¾ ½ ¾¿¾ ¿ ½ ¼ ½ ¼ ½¼¼ ½¿¿ ¼ ¾ ½¿ ½¾ ½ ¾¿ ½½
          ¾¿
 ¾ º È Ö ÐÓ× × Ù ÒØ × Ö ÓÐ × Îĸ ¬Ò Ó× ÔÓÖ ×Ù× Ö ÓÖÖ Ó× ÔÖ ¬ Ó׸                 ÙØ Ð ×
     × Ù Ò × Ð Ñ Ò ÓÒ         ×
      ´µ   Prefijo:    ½¿ ½¼¿ ¾ ¾¾ ½ ½¾         ¼   ½¾¿ ½¾½ ½¾ ½¿ ½ ½ ½ ¾ ½ ¾ ½   ½   ½ ¿
               ½     ¾¼ ½ ¾¿
           Secuencia de eliminaci´n:
                                 o         ½¾¿ ½¾½ ½ ½ ½¿ ½ ¿ ½¾ ¾¾ ¾¼ ¾ ½
      ´µ   Prefijo:  ½¾ ½ ¾ ¾½ ¾ ¾        ¿         ½½     ¾¼ ½ ½ ½ ¿ ½ ½ ¾ ½ ¼ ¾¾ ¾½½
               ¾½¿ ¾ ¾¿
           Secuencia de eliminaci´n:
                                 o    ½ ¾ ¾½½ ¾ ¾¿ ½¾      ¾ ½ ¾½
      ´µ   Prefijo: ½½¼    ¾ ½½ ½ ¾½ ¿ ½ ¼ ½¼¾ ½ ½ ½ ¿ ½ ½ ½ ½ ¾ ½ ½ ½ ¾½ ¾½¼
               ¾¼ ¾¾ ¾¾ ¾¿¼
           Secuencia de eliminaci´n: ¼ ¾½
                                 o          ¾¾ ½ ½ ¿ ½½ ½ ¾ ½ ¾ ½
      ´µ   Prefijo: ½ ½        ½¿     ½½ ¿ ½ ½ ¼ ½¾ ¾½ ¾¼¿ ½ ½ ¿ ¾¼½ ½ ¾ ¾½¿ ¾¼
               ¾¿¾ ¾¿½ ¾¾ ¾ ¿
           Secuencia de eliminaci´n: ½ ¾¾ ¾½¿ ¾¼
                                 o                     ½ ½ ¾¿½ ½½
      ´µ   Prefijo: ½ ¾ ½¿½      ¾ ½½¼ ½¼ ½½ ½ ½ ½ ½¿ ½ ¾ ½ ½ ½ ½ ½ ¿ ½ ¼ ¾¾¾
               ¾¼½ ¾½ ¾ ¾¿ ¾¿½ ¾
           Secuencia de eliminaci´n: ½ ½¿½ ¾¼½ ½
                                 o                   ½ ½ ¼ ½ ¾ ¾½ ¾¿ ½ ¾ ½

 ¾ºË        ÒÓ Ó ÙÒ Ö ÓÐ ÎÄ ÐÑ Ò ×Ù ÐØÙÖ ¸ Ù ÒØÓ× Ø× × Ö ÕÙ Ö Ò
 ¿¼º Ð ÙÐ Ð ÓÑÔÐ           Ø ÑÔÓ Ð ÙÒ ÓÒ is avl()º
 ¿½º ÁÑÔÐ ÒØ ÒØ Ö Ñ ÒØ ÙÒ Ì ÕÙ ÑÓ Ð Ö ÓÐ × ÎÄ Ò Ð Ù Ð         ÒÓ Ó Ù Ö
     ×Ù ÐØÙÖ º ´·µ
 ¿¾º × Ò ÙÒ Ð ÓÖ ØÑÓ O(n Ð (n)) ÕÙ ØÙ Ð ÙÒ ÓÒ     Ó× Ö ÓÐ × Îĺ
 ¿¿º × Ò ÙÒ Ð ÓÖ ØÑÓ O(n Ð (n)) ÕÙ ØÙ Ð Ô ÖØ ÓÒ ´×ÔРص    Ó× Ö ÓÐ × Îĺ
 ¿ º × Ò ÙÒ Ð ÓÖ ØÑÓ O(n Ð (n)) ÕÙ ØÙ Ð ÒØ Ö× ÓÒ        Ó× Ö ÓÐ × Îĺ
 ¿ º × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ø ÖÑ Ò × ÙÒ Ö ÓÐ Ò Ö Ó ×         ÓÒ º Ð ÙÐ ×Ù
      ÓÑÔÐ         Ø ÑÔÓº
 ¿ º × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ò Ö Ð Ö ÓÐ       ÓÒ        ÓÖ Ò kº
6.9. Ejercicios                                                                    553



 ¿º´           ÅÓ ÚÖ ¹ ½ ½ µ   ÑÙ ×ØÖ ÕÙ
                                                        √
                                           (n + 1)   1+ 5
                                   ÐÑ
                                   n→∞       (n)
                                                   =
                                                       2
                                                          .

         ÓÒ       (i) × Ð ¹ × ÑÓ ÒÙÑ ÖÓ       ÓÒ º
 ¿º    Ç Ø Ò ÙÒ ÜÔÖ × ÓÒ ÕÙ ÒÓØ Ð ÒÙÑ ÖÓ              Ó × ÙÒ Ö ÓÐ     ÓÒ º
 ¿º       ÑÙ ×ØÖ ÕÙ Ð Ò× Ö ÓÒ Ò ÙÒ Ö ÓÐ ÎÄ Ù× ÐÓ Ñ × ÙÒ ÖÓØ ÓÒ Ó Ð º
 ¼º      ÜÔÐ ÕÙ Ý × ÖÖÓÐÐ ÙÒ Ñ ØÓ Ó Ô Ö Ö ÓÒרÖÙ Ö ÙÒ Ö ÓÐ ÎÄ Ó Ð Ö ÓÖÖ Ó
       Ò¬ Ó Ð × Ð Ú × Ý ÐÓ× Ú ÐÓÖ ×        ÖÒ       ÐØÙÖ        ÒÓ Óº
  ½º      ÑÙ ×ØÖ ÕÙ Ô Ö ØÓ Ó Ö ÓÐ Îĸ Ü ×Ø ÙÒ ÓÐÓÖ ÓÒ ÖÓ Ó¹Ò ÖÓº ´·µ
  ¾º      × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ü Ñ Ò ÙÒ Ö ÓÐ Ò Ö Ó Ù ÐÕÙ Ö Ý Ø ÖÑ Ò × ×
        ÓÐÓÖ Ð º
  ¿º      × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÓÐÓÖ       ÖÓ Ó¹Ò ÖÓ ÙÒ Ö ÓÐ Ù ÐÕÙ Ö ÕÙ Ý Ô × Ó
        Ð Ø ×Ø Ð Ö Ó ÒØ Ö ÓÖº
   º        ÙØ Ð × × Ù ÒØ × × Ù Ò × Ò× Ö ÓÒ Ò ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ
       ´   µ   ½ ¾ ½¼ ½         ½ ½½   ½ ½½     ½ ½ ¾½       ½ ½¾        ½ ¾½¿ ½   ½ ¿
       ´   µ   ½½¼ ½ ½ ½ ¼ ½¼ ½¾ ¾ ¼ ¼ ¿ ½¼ ½ ¾¼            ½ ¿ ½ ½ ½¼½ ¾¼ ½ ½
       ´   µ   ½ ¾ ½ ¿ ¿½ ½¾ ¾¿      ¼ ¾ ½¾ ½ ½ ½¿¿ ½¿ ¾ ¿¾ ¿ ½¼¾ ¾¼¼ ¾¾¼           ¼
       ´   µ   ¾¾ ¾¾    ½ ½ ½ ½ ¾½ ¾ ¼ ¾¾ ¾¿ ½        ¼ ½ ¿ ¾ ¾ ½ ½ ¾ ½ ¾ ¾¾       ½
       ´   µ   ½ ¾ ½¼ ¼ ¾ ½½ ½¾ ¾¾½ ½¾¾ ½ ½¼ ½¾    ¾      ½ ¾¼ ¾½      ½ ¾½¿ ¿¾     ¾
               ½ ¾

   º È Ö ÐÓ× × Ù ÒØ × Ö ÓÐ × Îĸ ¬Ò Ó× ÔÓÖ ×Ù× Ö ÓÖÖ Ó× ÔÖ ¬ Ó׸               ÙØ Ð ×
     × Ù Ò × Ð Ñ Ò ÓÒ         ×
       ´µ      Prefijo:  ½ ½ ¿ ¼ ¼ ½ ¿ ½¾ ½¼ ½ ½ ½ ¿ ½ ½ ½ ½ ¿ ¾ ¾½ ¾½ ¾½½
                   ¾¿¾ ¾¾ ¾¿ ¾ ¾ ¾ ¾ ¼ ¾
               Secuencia de eliminaci´n: ¾ ½ ¿ ½ ¾¾ ½¼ ½
                                      o                             ¼ ¾½ ½ ½¾ ¾ ¼ ¾½ ¾
       ´µ      Prefijo: ½ ¼   ¿ ¾¼ ½ ¾ ¿¾ ½¿¿ ½ ½¿ ½ ¾ ¾ ¾½¿ ½ ½ ½ ½ ¼ ¾ ¾ ¾ ¼
                   ¾ ¾ ¾ ¾ ¾ ¾
               Secuencia de eliminaci´n: ¾ ¾ ¾ ½ ¼ ¾ ½ ¿¾ ¾ ¼ ¾ ¾ ½¿¿ ¾ ¾½¿ ¾ ¾ ½
                                      o
                   ½
       ´µ      Prefijo: ½¾ ¾ ¿ ½¾ ¿½ ¾         ¿ ½¼ ¿ ½¾ ¾ ½ ½ ½ ½ ¼ ½ ¿ ½ ¼ ½ ½ ¿ ¾¾
                   ¾¾ ¾ ¾ ¾ ¾ ½ ¾ ½ ¾
               Secuencia de eliminaci´n: ½ ¾ ½
                                      o            ¾ ¿½ ½¾ ¾ ½ ½ ¿ ½ ½¾ ¾ ½ ½ ¼ ¾ ½¼
       ´µ      Prefijo: ½     ¾¿ ½¿ ½¼ ¾¾ ¿ ¿¼ ½½ ¿ ½¿ ½¿ ½ ½ ¾ ¾ ½ ½ ½ ½ ¾¾
                   ½ ¾¾ ¾ ¾¾ ¾ ½¾ ¾
               Secuencia de eliminaci´n: ¾ ¾¾ ¾ ¾ ¾ ¾ ½¿ ¾ ¾ ½ ½¿ ½ ¾ ¿ ½ ½ ½¿
                                      o

       ´µ      Prefijo:  ½¼  ¿ ¾½ ¿ ¿ ¼ ½         ¿ ¼ ¼ ¿ ¾ ¾¾ ½     ½¾ ½¾ ½½¼ ½¿¼ ½
                   ½ ¿ ½ ¾¾ ½ ¾ ¿ ¾¿ ¾ ¼ ¾
554                                 Cap´        ´
                                       ıtulo 6. Arboles de b´ squeda equilibrados
                                                            u



            Secuencia de eliminaci´n:
                                  o     ½   ½¾ ½¿¼   ¿ ½ ¿¾   ¾ ¿½    ½¿   ½   ¾ ¾½

  º ´ÌÓÑ Ó Ý ØÖ Ù Ó È Ö ÖÖÝ ½¾ µ Ù ÙÒ Ö ÓÐ ÎÄ Ô Ö Ð Ù Ð Ð Ð Ñ¹
     Ò ÓÒ ÙÒ ÒÓ Ó Ö ÕÙ Ö Ó× ÖÓØ ÓÒ × Ó Ð ×º       Ù Ð Ö Óи ÒØ ¬ÕÙ Ð
    ÒÓ Ó Ð Ñ Ò Ö Ý ÜÔÐ ÕÙ ÔÓÖÕÙ Ó× ÖÓØ ÓÒ × ×ÓÒ Ò × Ö × Ý ×Ù¬ ÒØ ׺ ´·µ
  º ÓÒ× Ö Ð × Ù ÒØ ÔÖÓØÓØ ÔÓ    Ù×ÕÙ
                   template <typename T> int search(T a[], const T & x, int n)

      a     × ÙÒ ÖÖ ÐÓ ÓÖ Ò Ó n Ð Ñ ÒØÓ× Ò Ð Ù Ð × Ù× Ð Ð Ú xº
          Ð ¬Ò ר ÔÖÓ Ð Ñ × ÑÔÐ ÒØ Ö ÙÒ ×ÕÙ Ñ        Ù×ÕÙ   ÒÓÑ Ò Ó       ¹
          ÓÒ ¸ Ð Ù Ð ×ØÖÙ ØÙÖ Ð × Ó × ÖÚ ÓÒ × ×Ó Ö Ð ÖÖ ÐÓ Ð × Ù ÒØ Ñ Ò Ö
           ÒÖÐ
                                  0 1 2 3 4 5 6 7 8 9 10
                        Base      T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10

      Fk × Ð k¹ × ÑÓ ÒÙÑ ÖÓ       ÓÒ º i × Ð ÔÓ× ÓÒ Ò×Ô ÓÒ ØÙ и Ñ ÒØÖ ×
      ÕÙ  p Ý q ×ÓÒ ÐÓ× ÒÙÑ ÖÓ×       ÓÒ      ÓÖ Ò ÒÑ Ø Ñ ÒØ Ò Ö ÓÖ iº Ä
             Ð ×ÕÙ Ñ       Ù×ÕÙ     × ÓÑÔ Ö Ö x ÓÒ a[i] ݸ × x != a[i]¸ ÒØÓÒ ×¸
      × ÙÒ ÕÙ x × Ñ ÒÓÖ Ó Ñ ÝÓÖ a[i]¸ ×ÔÐ Þ Ö ÐÓ× ÒØ ÖÚ ÐÓ×        Ù×ÕÙ
      ÙÒ ÒØ ÖÚ ÐÓ Ñ ÒÓÖ Ó Ñ ÝÓÖ ÕÙ iº
      ´ µ ×ÙÑ Ò Ó ÕÙ n + 1 = Fk+1¸ × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÑÔÐ ÒØ Ð Ù×ÕÙ
               ÓÒ º
          ÝÙ ½ ÐÓ× Ò × q Ý p × ÑÔÖ ×ÓÒ ÒÙÑ ÖÓ× ÓÒ× ÙØ ÚÓ×              ÓÒ ¸
         Ñ ÒØÖ × ÕÙ × ÒÓ × ÑÔÖ × Ð ×Ó Ô Ö Ð Ò iº
          ÝÙ ¾ Ð Ú ÐÓÖ Ò Ð i × Fkº
          ÝÙ ¿ Ä ÓÒ ÓÒ Ô Ö              × ÕÙ x != a[i] Ý q == 0 or p == 1º ×
            Ö¸ Ð Ð Ñ ÒØÓ ÒÓ × Ò Ù ÒØÖ Ý ÒÓ × ÔÓ× Ð ×ÔÐ Þ Ö Ð ÒØ ÖÚ ÐÓ × Ò ÕÙ
         × ×Ð       Ð ÖÖ ÐÓº
      ´ µ Ò Ð Ð Ø ÑÔÓ         Ù ÓÒ Ð Ù×ÕÙ              ÓÒ º
      ´ µ ÓÑÓ ÔÙ         Ö× × n + 1 = Fk+1
   º ´ÌÓÑ Ó Ý ØÖ Ù Ó È Ö ÖÖÝ ½¾ µ ÑÙ ×ØÖ ÕÙ ∀n ∈ N Ü ×Ø ÙÒ Ö ÓÐ ÎÄ
     Ô Ö Ð Ù Ð Ð Ð Ñ Ò ÓÒ ÙÒ ÒÓ Ó Ö ÕÙ Ö Ü Ø Ñ ÒØ n ÖÓØ ÓÒ ×º ÁÒ ÕÙ
      ÓÑÓ × ÓÒרÖÙÝ Ø Ð Ö Óи Ò ÕÙ Ñ Ò Ö Ò Ö Ð Ð ÒÓ Ó Ð Ñ Ò Ö Ý ÜÔÐ ÕÙ
     ÔÓÖÕÙ n ÖÓØ ÓÒ × ×ÓÒ Ò × Ö ×º
   º × Ò ÙÒ Ð ÓÖ ØÑÓ O(n Ð (n)) ÕÙ   ØÙ Ð ÙÒ ÓÒ    Ó× Ö ÓÐ × ÖÓ Ó¹Ò ÖÓº
  ¼º × Ò ÙÒ Ð ÓÖ ØÑÓ O(n Ð (n)) ÕÙ   ØÙ Ð Ô ÖØ ÓÒ ´×ÔРص    Ó× Ö ÓÐ × ÖÓ Ó¹
     Ò ÖÓº
  ½º × Ò ÙÒ Ð ÓÖ ØÑÓ O(n Ð (n)) ÕÙ  ØÙ Ð ÒØ Ö× ÓÒ Ó× Ö ÓÐ × ÖÓ Ó¹Ò ÖÓº
  ¾º     ÙØ Ð × × Ù ÒØ × × Ù Ò × Ò× Ö ÓÒ Ò ÙÒ Ö ÓÐ ×ÔÐ Ý
6.9. Ejercicios                                                                 555



       ´ µ ½ ¿ ¾¾¼ ¾¼    ½¿ ¾¼ ¾ ¾ ½       ¾ ½ ¾ ¿½ ½      ½¾ ½ ¾¿ ½ ½ ¾ ¿
           ¾ ¼¾ ½½ ½ ¼       ¼ ¾ ¼ ½½
       ´ µ ¿ ½ ¾ ½¼ ¾          ¼ ½¼ ¾¼ ¿¾ ½ ½ ¾ ½ ¼ ¿ ¿¼     ½ ½ ½¼½ ¾ ¿ ¾¼ ¿
           ½ ½ ¿ ½ ¿
       ´ µ ½¿ ¾¼¼ ½ ½ ½ ¿ ¾¿ ¾¾½ ¿ ¿¿ ¾½ ¾¾ ¾ ¾½ ¾ ½ ¾ ¾ ¿ ½¼¼ ½ ¾ ½ ¾ ¾
           ½ ¿ ¾¼ ¿     ¾     ¾ ½
       ´ µ ½½¾ ½¾     ½ ¾¿          ¾ ¾¾ ¿   ¾¾ ¾ ¼ ½ ¾    ¾¿ ¿ ¾¿¾ ½½ ½ ¾
           ½¿ ¾¾ ¿¿ ¾ ¾¾ ½ ½ ½½½
       ´ µ ¾ ½ ½ ½ ¾¼ ¾ ½¾½ ½¾ ½¼ ¾ ½ ½ ¾ ¾ ¿      ½½ ½½ ½ ¾ ¿ ¾ ¾¼ ½ ¾¿ ¾¿
              ½ ½ ½ ¼ ½¿ ¾ ½ ½¼

  ¿º È Ö ÐÓ× × Ù ÒØ × Ö ÓÐ × Îĸ ¬Ò Ó× ÔÓÖ ×Ù× Ö ÓÖÖ Ó× ÔÖ ¬ Ó׸             ÙØ Ð ×
     × Ù Ò × Ð Ñ Ò ÓÒ         ×
       ´ µ Prefijo:       ½        ¾½ ¿ ¾ ¾ ¾ ¿ ¾¾ ¾¼         ½¿¼ ½ ½ ¾ ¾ ¾ ½ ¾¿
              ¾¿¼ ¾    ¾ ¼¾     ¾ ¼¾ ½¾ ¾
             Secuencia de eliminaci´n: ¾ ¾ ¾ ½
                                    o               ¿ ¾¾        ½ ¾¿ ¿       ¾¼ ¾½
       ´ µ   Prefijo: ¾ ¾ ½¼ ¿ ½ ½          ¼    ¿        ½ ¼ ¾¿ ½ ¼ ¾¿½ ½ ¼ ½ ¾ ½ ½
                 ¾¼ ¾¾ ¾½½ ¾½ ¾ ¾ ¼ ¾ ¼ ¾ ½ ¾ ¿
             Secuencia de eliminaci´n: ½¼ ¼
                                    o         ¾ ½ ½ ¾ ½ ¼ ¿ ½ ½ ¼ ¾¿½ ¾ ¾ ¼ ¾ ¿
       ´µ    Prefijo: ¾½ ¾½ ½ ½ ½ ½ ½¿¼ ½¾¾ ¾¿ ½ ½¼            ¾     ¼ ¿ ½½¿ ½ ½ ½
                 ¾¼¾ ¾¼¼ ¾½¿ ¾¿ ¾ ¾ ¾ ½ ¾ ¾ ¾ ¾
             Secuencia de eliminaci´n: ¾ ¾½¿ ½ ½¾¾
                                    o                    ¿ ½ ¾¿ ¾ ¾ ¾ ½ ½         ¾½
       ´ µ   Prefijo:      ¼ ½¼ ½ ¾ ½ ¿¼        ¾¾ ¾ ½       ¿ ¼ ½ ½ ¿ ½¿½ ½½ ½ ¿ ¾¿
                 ½ ½ ½¾ ¾ ¾¾ ½¾ ¿¾ ¾
             Secuencia de eliminaci´n: ½ ½¼ ¼ ¾ ¼ ½ ¾¿
                                    o                        ¾      ½ ¿ ¾ ½½ ¾
       ´µ    Prefijo: ¼ ¾ ¾¼ ½ ½¾ ¾ ½ ¾ ¿ ½¿       ½¿       ¼ ½¼ ½½ ½ ¾ ½ ¾¾¾ ¾½¿ ½ ¼
                 ½ ½ ½ ½ ¾½½ ¾ ¾ ½ ¾ ¾ ¿
             Secuencia de eliminaci´n: ½ ¾ ¼ ¾ ½ ¾ ¿
                                    o                      ¾¼ ¾ ½ ½½ ¾½¿ ¿ ½¿ ½¼

   º     Ù Ð Ö ÓÐ ÎÄ Ö ×ÙÐØ ÒØ          Ð Ñ Ò Ö Ð ÒÓ Ó 53 Ð Ö ÓÐ     Ð ¬ ÙÖ º½¿º
   º     Ó Ð × Ù ÒØ Ö ÓÐ ÎÄ
556                                                        Cap´        ´
                                                              ıtulo 6. Arboles de b´ squeda equilibrados
                                                                                   u



                                                            20


                              7                                                            33


          2                              12                             25                                      41


 0                4                9             15              22             28                  36                     46


      1       3       5           8 10      13        17        21 23      26        30        34        38          43             49


                          6            11     14 16 18                24     27 29 31           35 37 39           42 44       47        51


                                                           19                             32                  40          45    48 50 52


                                                                                                                                              53


          Ù Ð Ö ÓÐ Ö ×ÙÐØ ÒØ    Ð Ñ Ò Ö Ð ÒÓ Ó 0 ´ ÖÓµº
     º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ      ØÙ Ð Ô ÖØ ÓÒ ÙÒ Ö ÓÐ ×ÔРݺ                                                    ÑÙ ×ØÖ ÕÙ Ð
       ÐØÙÖ Ð Ö ÓÐ Ö ×ÙÐØ ÒØ × ÐÓ Ö ØÑ º

Bibliograf´
          ıa
 ½    º ź     г×ÓÒ¹Î Ð³× Ò º ź Ä Ò ×º Ò Ð ÓÖ Ø Ñ ÓÖ Ø ÓÖ Ò Þ Ø ÓÒ Ó
    Ò ÓÖÑ Ø ÓÒº ËÓÚ Ø Å Ø Ñ Ø × Ó Ð Ý¸ ¿ ½¾ ß½¾ ¿¸ ½ ¾º
 ¾ Ð Ö Îº Ó¸ ÂÓ Ò º ÀÓÔ ÖÓ Ø¸ Ò Â «Ö Ý º ÍÐÐÑ Òº Ì           × Ò Ò Ò ÐÝ× ×
   Ó ÓÑÔÙØ Ö Ð ÓÖ Ø Ñ׺           ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ÍË ¸ ½ º
 ¿ ÊÙ ÓÐ Ý Öº ËÝÑÑ ØÖ Ò ÖÝ ¹ØÖ × Ø ×ØÖÙ ØÙÖ Ò Ñ ÒØ Ò Ò Ð ÓÖ Ø Ñ׺
        Ø ÁÒ ÓÖÑ Ø ¸ ½´ µ ¾ ¼ß¿¼ ¸ ÆÓÚ Ñ Ö ½ ¾º
   ÊÙ ÓÐ Ý Ö Ò            Û Ö Åº Å Ö Øº ÇÖ Ò Þ Ø ÓÒ Ò Ñ ÒØ Ò Ò Ó Ð Ö
   ÓÖ Ö Ò ×º Ø ÁÒ ÓÖÑ Ø ¸ ½ ½ ¿ß½ ¸ ½ ¾º
     º Ϻ ×ØÖ º ÁÒ ÓÒÓÙÖ Ó ¬ ÓÒ º ÁÒ º ĺ Ù Ö Ò Åº ÖÓݸ ØÓÖ׸ ÈÖÓ Ö Ñ
      ÓÒרÖÙ Ø ÓÒ¸ ÚÓÐÙÑ      Ó Ä ØÙÖ ÆÓØ × Ò ÓÑÔÙØ Ö Ë Ò ¸ Ô × ß ¼º
   ËÔÖ Ò Ö Î ÖÐ ¸ ½ º
     ØØÔ »»ÛÛÛº ÒÙºÓÖ »×Ó ØÛ Ö » ×лº
      Ù × Ò Ë Û º               ÖÓÑ Ø Ö Ñ ÛÓÖ ÓÖ Ð Ò ØÖ ׺ ÁÒ Ç Ë Á
   ËÝÑÔÓ× ÙÑ ÓÒ ÓÙÒ Ø ÓÒ× Ó ÓÑÔÙØ Ö Ë Ò ´ Ç Ëµ¸ Ô × ß¾½¸ ½ º
      ÓÒÖ Ó Å ÖØ Ò Þ Ò Ë ÐÚ ÓÖ ÊÓÙÖ º Ê Ò ÓÑ Þ Ò ÖÝ × Ö ØÖ ׺ ÂÓÙÖÒ Ð Ó
   Ø        Ÿ ´¾µ ¾ ß¿¾¿¸ Å Ö ½ º
   Å ÓØÓ Å Ø×ÙÑÓØÓ Ò Ó× ÖÙ ÃÙÖ Ø º ÌÛ ×Ø             ËÊ Ò Ö ØÓÖ׺ Å ÌÖ Ò×¹
       Ø ÓÒ× ÓÒ ÅÓ Ð Ò Ò ÓÑÔÙØ Ö Ë ÑÙÐ Ø ÓÒ¸ ¾´¿µ ½ ß½ ¸ ÂÙÐÝ ½ ¾º
6.9. Bibliograf´
               ıa                                                            557



½¼ Å ÓØÓ Å Ø×ÙÑÓØÓ Ò        Ó×    ÖÙ ÃÙÖ Ø º ÌÛ ×Ø       ËÊ Ò Ö ØÓÖ× ÁÁº      Å
    ÌÖ Ò× Ø ÓÒ× ÓÒ ÅÓ Ð Ò Ò        ÓÑÔÙØ Ö Ë ÑÙÐ Ø ÓÒ¸ ´¿µ ¾ ß¾ ¸ ÂÙÐÝ ½ º
½½ Å ÓØÓ Å Ø×ÙÑÓØÓ Ò Ì Ù Æ × ÑÙÖ º Ì ÝÒ Ñ Ö Ø ÓÒ Ó ×ØÖ ÙØ
   Ö Ò ÓÑ ÒÙÑ Ö Ò Ö ØÓÖ׺ ÁÒ ÈÈË ¸ ½ º
½¾ Á Ò È Ö ÖÖݺ ÈÖÓ Ð Ñ× ÓÒ Ð ÓÖ Ø Ñ׺ ÈÖ ÒØ ¹À Ðи Ò Ð ÛÓÓ Ð «×¸ ÆÂ¸ ½ º
½¿ ʺ Ë Ð Ò º ʺ Ö ÓÒº Ê Ò ÓÑ Þ × Ö ØÖ ׺ Ð ÓÖ Ø Ñ ¸ ½ ´ » µ ß
        ¸ Ç ØÓ Ö»ÆÓÚ Ñ Ö ½ º
½ º º ËÐ ØÓÖ Ò ÊÓ ÖØ Ì Ö Òº Ë Ð ¹ Ùר Ò Ò ÖÝ Ë Ö ÌÖ ×º ÂÓÙÖÒ Ð Ó
   Ø        Ÿ ´¿¾µ ½ ß¾¼ ¸ ½ º
½ º º ËØ Ô Ò×ÓÒº Ñ Ø Ó ÓÖ ÓÒרÖÙ Ø Ò Ò ÖÝ × Ö ØÖ × Ý Ñ Ò Ò× Ö¹
   Ø ÓÒ× Ø Ø ÖÓÓØº ÁÒØ ÖÒ Ø ÓÒ Ð ÂÓÙÖÒ Ð Ó ÓÑÔÙØ Ö Ò ÁÒ ÓÖÑ Ø ÓÒ Ë Ò ×¸
     ´½µ ½ ß¾ ¸ ÖÙ ÖÝ ½ ¼º
½ Â Ò ÎÙ ÐÐ Ñ Òº        Ø ×ØÖÙ ØÙÖ ÓÖ Ñ Ò ÔÙÐ Ø Ò ÔÖ ÓÖ ØÝ Õ٠٠׺ ÓÑÑÙÒ Ø ÓÒ×
   Ó Ø        Ÿ ¾½´ µ ¿¼ ß¿½ ¸ ÔÖ Ð ½ º
½ Æ Ð Ù× Ï ÖØ º Ð ÓÖ Ø Ñ× + Ø ËØÖÙ ØÙÖ × = ÈÖÓ Ö Ñ׺ ÈÖ ÒØ ¹À ÐÐ Ë Ö × Ò
      ÙØÓÑ Ø ÓÑÔÙØ Ø ÓÒº ÈÖ ÒØ ¹À Ðи ÍÔÔ Ö Ë Ð Ê Ú Ö¸ ÆÂ ¼ ¸ ÍË ¸ ½ º
½      Ö ÏÓÓ º Ø ËØÖÙ ØÙÖ ×¸ Ð ÓÖ Ø Ñ׸ Ò È Ö ÓÖÑ Ò º                 ×ÓÒ¹Ï ×Рݸ
   Ê Ò ¸ ½ ¿º
Cap´
   ıtulo 7

Grafos

    ÒÙ ×ØÖÓ× × ÒØ Ó× × Ò×ÓÖ Ð ×¸ Ô Ö ÕÙ Ð Ú ×Ø × Ð ÕÙ Ó ÙÔ Ð Ñ ÝÓÖ Ô ÖØ
ÒÙ ×ØÖ Ô Ö Ô ÓÒº ÆÙ ×ØÖ Ñ ÑÓÖ Ý Ö Ù Ö Ó ×Ø Ò ÑÔÖ Ò Ó× Ò Ö Ò Ñ
 Ñ Ò × Ú ×٠Р׺ Ò ÑÙ × Ó × ÓÒ × ÔÖ Ö ÑÓ× ØÖ Ø Ö ÓÒ Ñ Ò × ÔÓÖÕÙ ÒÓ× ×ÓÒ
Ñ × ÓÒ Ö Ø × ÒÙ ×ØÖ Ô Ö Ô ÓÒ Ý ÒØ Ò Ñ ÒØÓ ÕÙ ÐÓ× ÓÒ ÔØÓ× ×ØÖ ØÓ׺ Ù Ò Ó
Ð ÑÓ× ÓÒ ÐÓ ÔÙÖ Ñ ÒØ ×ØÖ ØÓ¸ × ÑÙÝ ÔÓ× Ð ÕÙ ×Ó ÑÓ× ÙÒ Ñ Ò Ú ×٠к
  Ù Ò Ó × Ù ÑÓ× ØÖ × ¸ ÔÓÖ ÑÔÐÓ¸ × ÔÓ× Ð ÕÙ × ÒÓ× Ô Ö Þ ÙÒ Ñ Ò Ö Ð ¹
  ÓÒ       ÙÒ ØÖ ÔÐ      Ó Ð ØÓ 3 º
      Ò Ð ÓÒרÖÙ ÓÒ Ð ÓÒÓ Ñ ÒØÓ ÙÑ ÒÓ ×Ù Ð Ò ÙØ Ð Þ Ö× Ñ Ò × ÖØ ¬ Ð × Ô Ö
 ÜÔÖ × Ö Ñ ÓÖ × Ý ÓÒ ÔØÓ׸ Ó Ô Ö × ÒØ Ø Þ ÖÐ × Ò ÙÒ Ñ Ò ÕÙ Ò ÐÓ Ý Ö ×ÙÑ
ÐÓ× ×ÙÒØÓ× ÒØ Ö ×º Ä × Ñ Ò ×             ר Ø ÔÓ ×ÓÒ ÐÐ Ñ × ÓÑÙÒÑ ÒØ Ö ¬ Ó× º
ÄÓ× Ö ¬ Ó× ÖØ × ÒÓ× × Ö¸ ÙÖÚ × Ñ Ø Ñ Ø × Ù × Ò Ð                             ÖØ × ÒÓ
 ÓÓÖ Ò ×¸ Ô ÖÑ Ø Ò Ñ Ö Ö ÑÔÐ Ñ ÒØ Ð ÓÑÔÓÖØ Ñ ÒØÓ ÙÒ ÙÒ ÓÒ ÓÑÔÓÖ¹
Ø Ñ ÒØÓ ÕÙ ÔÙ        ר Ö Ó ÙÐØÓ Ò Ð Ñ Ö ÓÖÑÙÐ º ר Ð ×              Ö ¬ Ó × ÖØ ¬ Ð Ò
 Ð × ÒØ Ó ÕÙ ÒÓ × Ò Ù ÒØÖ Ò ØÙÖ ÐÑ ÒØ Ó × ¸ ÒÓ × ÓÖÖ ×ÔÓÒ ÓÒ ÙÒ Ñ Ò
ÔÖ          Ò Ð ÑÙÒ Ó Ò ØÙÖ Ðº
      Ü ×Ø ÙÒ ÑÔÐ Ú Ö             ÔÖÓ Ð Ñ × Ò Ð Ù Ð ×          Ò ÜÔÖ × Ö Ö Ð ÓÒ × ÒØÖ
 Ó× × Ð ÙÒ Ø ÔÓº ÉÙ Þ ÙÒ Ù Ò ÑÔÐÓ Ô Ö ×Ø Ø ÑÔÓ ÐÓ ÓÒר ØÙÝ ÙÒ Ñ Ô Ú Ð
ÕÙ Ö ÔÖ × ÒØ ÙÒ Ö            ÖÖ Ø Ö × ÒØÖ Ù ×º Ò Ð Ö ÓÑÔÙØ ÓÒ Ð¸ ר
Ø ÔÓ Ö ¬ Ó × Ð ÒÓÑ Ò ÓÖÑ ÐÑ ÒØ “grafo”º
      Ð Ø ÖÑ ÒÓ Ö Ó ÔÖÓÚ Ò Ð Ö Ó γρ φος ´ Ö Ó×µ¸ Ð Ù Ð × Ò ¬ × Ö ØÙÖ º Ä
 × Ö ØÙÖ × ÜÔÖ × ÓÒ × Ò×ÓÖ Ð½ ×Ó Ø Ò Ñ Ö Ú ÐÐÓ×Ó Ý Ñ ×Ø Ö Ó×Ó ÓÑÓ ÐÓ × Ð Ð Ò Ù º
  Ù Ò Ó Ð ÑÓ׸ ÒÓ Ö ÕÙ Ö ÑÓ× Ð ÔÖ × Ò      Ð × Ö ØÓÖ¾ ¸ × ÒÓ Ð ÙÒ × ÒØ Ó Ô Ö Ô ÓÒ Ý
 ÒØÖ Ò Ñ ÒØÓ ÓÑÓ Ð ØÓÖº ÄÓ× Ö ¬ Ó× ÓÒר ØÙÝ Ò ÙÒ Ð × ÔÖ Ñ Ö × ÓÖÑ × ÙÑ Ò ×
    Ö ÔÖ × ÒØ Ö ÓÒÓ Ñ ÒØÓ Ý Ð ÓÑÔÙØ ÓÒ Ý ÔÖÓ Ö Ñ ÓÒ ÒÓ × Ô Ò Ð Ö ÕÙ Þ
 ÜÔÖ × Ú ÐÓ Ö ¬ Óº
      Ò Ø ÖÑ ÒÓ× Ñ Ø Ñ Ø Ó׸ ÙÒ Ö Ð ÓÒ × ÙÒ ×Ù ÓÒ ÙÒØÓ ´R ⊆ A × Bµ
 Ð ÙÒ ÔÖÓ Ù ØÓ ÖØ × ÒÓ ÒØÖ Ó× ÓÒ ÙÒØÓ× A Ý Bº Ò ×Ø × ÓÒ ÒÓ× ÒØ Ö ¹
× Ò Ö Ð ÓÒ × ÒØÖ Ó× × ÙÒ Ñ ×ÑÓ Ø ÔÓ¸ ÔÓÖ ÐÓ ÕÙ ÐÓ× ÓÒ ÙÒØÓ× ÓÖ Ò Ý ×¹
Ø ÒÓ ×ÓÒ ÐÓ× Ñ ×ÑÓ× Ý Ð Ö Ð ÓÒ¸ Ð ¬                Ò Ö ¸ × Ö ¬ Ö Ð ÔÖÓ Ù ØÓ ÖØ ¹
× ÒÓ A × Aº À Ý Ú Ö Ó× ×ÕÙ Ñ × Ö ¬ Ó× Ô Ö ÜÔÖ × Ö ÙÒ Ö Ð ÓÒ Ò Ö º Ò
ÑØÑØ           × Ö Ù ÒØ ÙØ Ð Þ Ö ÐÓ×      Ö Ñ × × Ø Ð ×¸ Ô ÖÓ ×ØÓ× ×ÓÒ Ò ÓÖÖÓ×Ó×
  ½
      Ò × Ú ×٠и Ø Ø Ð Ó Ð ÙÒ ÓØÖ Ð × º
  ¾
     ÙÒÕÙ ÔÙ Ò Ô Ö Ö× Ð ÙÒ × ÑÓ ÓÒ ×       ÒØ ÖÔÖ Ø ÓÒ × ÒÚÓÐÙ Ö   × Ù Ò Ó× ×Ù    Ö ¹
Ø Ñ ÒØ Ð Ð ØÓÖº
560                                                                                Cap´
                                                                                      ıtulo 7. Grafos



Ô Ö Ð × Ö Ð ÓÒ × Ò Ö ×º Ò ÐÓ ÕÙ ÓÒ ÖÒ ×Ø ×ØÙ Ó¸ Ü ×Ø ÙÒ Ö ÔÖ ¹
× ÒØ ÓÒ Ö ¬ ÕÙ Ô ÖÑ Ø Ñ Ö Ö Ý ÒØ Ò Ö Ñ ÓÖ ÙÒ Ö Ð ÓÒº Ä ¬ ÙÖ º½ ÐÙ×ØÖ Ð
Ö Ð ÓÒ R = {(a, b), (a, c), (a, d), (b, a), (b, c), (b, d), (b, f), (b, e), (c, a), (c, b), (c, g), (c, f),
(c, h), (d, a), (d, b), (d, e), (g, c), (g, h), (f, c), (f, b), (f, h)} ⊆ A×A, A = {a, b, c, d, e, f, g, h}¸
   ÙÒ Ñ Ò Ö            Ö ÒØ ݸ Ò Ò Ö Ð Ñ × × ÑÔÐ ¸ ÕÙ ÙÒ                     Ö Ñ × Ø Ðº




                       ÙÖ º½          ÑÔÐÓ       Ö Ð ÓÒ ÜÔÖ ×             ÓÒ ÙÒ Ö ¬ Ó
         ÙÖ × ÓÑÓ Ð º½¹ × ÒÓÑ Ò Ò Ö Ó× º Ò Ð ÑÔÐÓ Ò Ù ×Ø ÓÒ¸ × ÔÖ ¹
   Ò Ú ×Ù ÐÑ ÒØ Ð × ÓÒ Ü ÓÒ × ÒØÖ ÐÓ× Ð Ñ ÒØÓ× Ð ÓÒ ÙÒØÓ Aº ÄÓ× Ð Ñ Ò¹
ØÓ× ×        Ù Ò Ò ÖÖ Ó× ÒØÖ Ö ÙÐÓ׸ Ñ ÒØÖ × ÕÙ Ð × Ö Ð ÓÒ × ÒØÖ ÐÐÓ× × Ò¹
     Ò Ñ ÒØ × Ð Ò × ÕÙ ÓÒ Ø Ò ÐÓ× Ö ÙÐÓ׺ × ÑÙÝ ÔÓ× Ð ÕÙ Ð Ð ØÓÖ Ð
× Ñ × × Ò ÐÐÓ ÔÖ Ö Ð Ö Ð ÓÒ Ñ ÒØ Ð ¬ ÙÖ º½¸ ÕÙ Ò ×Ù Ö ÔÖ × ÒØ ÓÒ
Ñ Ø Ñ Ø R = {(a, b), (a, c), (a, d), (b, a), (b, c), (b, d), (b, f), (b, e), (c, a), (c, b), (c, g),
(c, f), (c, h), (d, a), (d, b), (d, e), (g, c), (g, h), (f, c), (f, b), (f, h)}, A = {a, b, c, d, e, f, g, h}º
      ÒÐ Ö              Ö Ó׸ ÐÓ× Ð Ñ ÒØÓ× Ö Ð ÓÒ × ÒÓÑ Ò Ò Ú ÖØ × Ó ÒÓ Ó׸ Ñ ÒØÖ ×
ÕÙ Ð × Ö Ð ÓÒ × × ÐÐ Ñ Ò Ö ×Ø × Ó Ö Ó׺ Ò Ð ÑÔÐÓ Ð ¬ ÙÖ º½¹ ÐÓ× Ú ÖØ × ×
    Ù Ò ÓÒ Ö ÙÐÓ× Ø ÕÙ Ø Ó× ÓÒ ÐÓ× Ð Ñ ÒØÓ× Ð ÓÒ ÙÒØÓ A = {a, b, c, d, e, f, g, h}¸
Ô ÖÓ ÒÓ Ü ×Ø Ò Ò ÙÒ Ö ×ØÖ ÓÒ ×Ó Ö Ð ÓÖÑ Ú ×Ù Ð ÕÙ                                  Ø Ò Ö ÙÒ ÒÓ Ó ÔÓ Ö
      Ö× Ù Ó ÓÒ Ù Ö Ó׸ ØÖ Ò ÙÐÓ× Ó Ù ÐÕÙ Ö ÓØÖ ¬ ÙÖ º
     ÈÓÖ ÐÓ Ò Ö Ð¸ Ò Ñ Ø Ñ Ø Ð Ñ Ù                               ÒÓ × Ò Ú ×Ø º È ÖÓ Ú × ×¸ Ù×¹
Ø Ñ ÒØ ¸ Ò Ð Ô                       ÜÔÖ × Ö ÓÖÑ × Ö ¬ × Ö ÒØ × Ô Ö ÙÒ Ñ ×Ñ Ö Ð ÓÒ¸
 Ò ÓÒ Ö × Ð ÔÓ Ö                       ×ØÖ ÓÒ Ý Ö ÔÖ × ÒØ ÓÒ ÙÒ Ö Óº ÍÒ Ö Ó ×¸ Ô٠׸
ÙÒ ×ØÖÙ ØÙÖ                ØÓ× ÓÖ ÒØ                 Ð Ö ÔÖ × ÒØ ÓÒ Ö ¬                 Ð × Ö Ð ÓÒ × Ò¹
ØÖ Ð Ñ ÒØÓ× ÙÒ Ñ ×ÑÓ Ø ÔÓº Ä Ö ÞÓÒ ÕÙ ÑÓØ Ú ÐÓ× ÔÖÓ Ö Ñ ÓÖ ×¸ Ò Ò ÖÓ׸
Ñ Ø Ñ Ø Ó× Ý Ñ × ÔÖ Ø ÒØ × ÙØ Ð Þ Ö Ö Ó׸ × Ð ÓÑÓ                                     ÕÙ ÓÒÐÐ Ú Ô Ö Ð
 ÒØ Ò Ñ ÒØÓ Ð Ñ Ò Ö ×ØÖ ÓÒ × Ö ¬ ׺                                   ÑÓ× ÔÖ × ÒØ Ö Ð Ô Ö ÕÙ × Ð
            Ö Ó ÙÒ ×ØÖ ÓÒ Ò Ö Ð ÕÙ ÔÖ Ø Ò                             Ö Ö ÙÒ Ú ×Ø Ñ ÔÖÓ Ð Ñ ×
 Ò ÐÓ× Ù Ð × × ÔÙ Ò ÜÔÖ × Ö Ö Ð ÓÒ × ÒØÖ Ð Ñ ÒØÓ× ÙÒ Ñ ×ÑÓ Ø ÔÓ Ý ÒÓ× ×
Ñ × ÓÑÓ Ó Ú ×Ù Ð Þ ÖÐ × Ò ÙÒ Ö ¬ Óº
     Ë ÒÐ                     Ö Ó × Ú ×Ù Ð Ò ×Ù × ÒØ Ó × Ò×ÓÖ Ð¸ ×Ù ØÖ Ø Ñ ÒØÓ Ø Ò Ó×
Ô Ö×Ô Ø Ú × ×ØÙ Ó ÕÙ ÒÓ ÐÓ ×ÓÒ Ð Ñ Ø Ñ Ø ÓÑ Ò ØÓÖ Ý Ð ÔÖÓ Ö Ñ ÓÒº
      Ð ÓÒ ÔØÓ            Ö Ó Ý ×Ù× ÔÖÓ Ð Ñ × ×Ó Ó× Ü ×Ø Ò × ÑÙ Ó ÒØ × ÕÙ Ð
ÔÖÓ Ö Ñ ÓÒº ÈÙ ×ØÓ ÕÙ Ð Ñ ÝÓÖ                           ÐÓ× ÔÖÓ Ð Ñ × ÕÙ ÑÓ Ð Þ Ò ÐÓ× Ö Ó× Ö ¹
ÕÙ Ö Ò ÑÙ Ó ÓÑÔÙØÓ¸ ÙÖ ÒØ ÑÙ Ó Ø ÑÔÓ ×Ù ÒØ Ö × Ý ×ØÙ Ó ×ØÙÚÓ Ö × ÖÚ Ó ÐÓ×
Ñ Ø Ñ Ø Ó׺ Ä Ô Ö×Ô Ø Ú Ñ Ø Ñ Ø Ø Ò                               ÒÚ ×Ø Ö Ð Ö Ó ÓÑÓ ÙÒ Ö Ð ÓÒ
 × Ö¸ ÓÑ Ò ØÓÖ ÐÑ ÒØ º
7.1. Fundamentos                                                                                                      561



   Ä ÓØÖ Ô Ö×Ô Ø Ú Ð Ò Ð × × Ð ÓÒר ØÙÝ Ð ÔÖÓ Ö Ñ ÓÒ            Ð ÓÖ ØÑÓ× ×Ó Ö
 Ö Ó׺      Ó× Ð ÓÖ ØÑÓ× ÔÐ ÒØ Ò × Ó× Ð ÓÖ ÙÒ × Ð Ý ÓÑÔÐ                    ÕÙ
 ÙÒ ÒÓ × Ó ÓÖ             ר Ð ÔÖ × ÒØ º ÄÓ× Ð ÓÖ ØÑÓ× ×Ó Ö Ö Ó× ÓÒ Ù Ò Ð Ù×Ó
    Ú Ö× × ×ØÖÙ ØÙÖ ×       ØÓ× Ý Ð ÓÖ ØÑÓ׺ ÈÓÖ Ð ÒØ Ö ÙÒ ÑÔÐÓ¸ Ð Ð ÙÐÓ
  Ñ ÒÓ× ÓÔØ ÑÓ× ÔÙ Ö ÕÙ Ö Ö Ð ÓÖ ØÑÓ× ÓÖ Ò Ñ ÒØÓ Ý Ô× Ò Ö Ó׺

7.1    Fundamentos
  ÓÑÓ ÒØÙ Ø Ú Ñ ÒØ Ý ×      Ñ Ò ÓÒ Ó¸ ÙÒ Ö Ó G × ¬Ò ÓÖÑ ÐÑ ÒØ Ñ ÒØ
ÙÒ ÙÔÐ G =< V, A > ÓÑÔÙ ×Ø          Ó× ÓÒ ÙÒØÓ× V × Ð ÓÒ ÙÒØÓ Ú ÖØ × Ó ÒÓ Ó×
Ý A × Ð ÓÒ ÙÒØÓ     Ö ×Ø × Ó Ö Ó× Ò Ð ÑÔÐÓ Ð ¬ ÙÖ º¾¸ V × ÓÑÔÓÒ ÔÓÖ
                                 ¿º

Ð × Ð ØÖ × × Ð A ר Ð M¸ Ñ ÒØÖ × ÕÙ A ÐÓ ÓÑÔÓÒ Ò Ð × ÓÒ Ü ÓÒ × ÒÙÑ Ö ×
   × Ð 1 ר Ð 29º
                                                       29

                          B          2             J             3         H         4         M
                                                                                                         5
                 1              28        9                 15        8         16        7
                                                                                                             L
                                                   14                                          6
             A            10         D                           E         17                                    25
                                                                                 N
                                                                                               24
                     11        12             13       18             18        22        23                 I
                                                                                                    27
                          C          20            F             21        G         26        K



                                                   ÙÖ º¾ ÍÒ Ö Ó
    Ä ÒÙÑ Ö ÓÒ ÐÓ× Ö Ó× Ð × ¬ ÙÖ × º¾ Ý º¿ ÒÓ Ö ÔÖ × ÒØ Ñ Ò ØÙ × Ó Ø ÔÓ׺
Ë ÙÒ Ð × Ö Ø Ö ×Ø × Ð ÔÐ ÓÒ¸ ÐÓ× ÒÓ Ó× Ý Ö Ó× ÔÙ Ò ×Ó Ö× Ð × Ø ÔÓ×
   ØÓ׺ ÈÓÖ ÑÔÐÓ¸ ÙÒ Ö Ó Ú Ð           ÖÖ Ø Ö × Ù Ö Ö Ò ×Ù× ÒÓ Ó× ÐÓ× ÒÓÑ Ö ×
Ð × Ù × ÙÒØÓ ÓÒ Ò ÓÖÑ ÓÒ ØÙÖ ×Ø Ý × ÖÚ Ó× × Ó× ´ ר ÓÒ ×                    ×ÓÐ Ò ¸
  ÓØ Р׸ Ø Ø Ö µº ÄÓ× Ö Ó× Ö ÔÖ × ÒØ Ö Ò Ð × ÖÖ Ø Ö × Ý ÐÑ Ò Ö Ò Ð × ×Ø Ò ×
 ÒØÖ Ð × Ù × ÙÒØÓ ÓÒ ÙÒ Ð ¬ ÓÖ ÕÙ Ò × ×Ù Ð                     ´ ÙØÓÔ ×Ø ¸ ÖÖ Ø Ö ¸
ØÖÓ ¸ Ø Ø Ö µº Ñ ÒÙ Ó¸ ר Ð ×                  Ö Ó¸ Ò Ô ÖØ ÙÐ Ö ÕÙ Ð ÙÝÓ× Ö Ó×
 Ù Ö Ò ÒØ         ׸ × Ð ÒÓÑ Ò Ö Ó ÓÒ Ô ×Ó× ¸ ÔÓÖÕÙ Ð × ÒØ            × × ÔÓÒ Ö Ò
Ý × ÙØ Ð Þ Ò Ò Ð ÓÖ ØÑÓ× ÔÓÖ ÑÔÐÓ¸ Ô Ö Ð ÙÐ Ö Ð ×Ø Ò Ñ × ÓÖØ ÒØÖ Ó×
  ٠׺
      Ò Ð Ö Ó Ð ¬ ÙÖ º¾¸ Ù ÐÕÙ Ö Ö Ó Ö Ð ÓÒ ×Ù× ÒÓ Ó× Ò ÐÓ× Ó× × ÒØ Ó׺ ÈÓÖ
   ÑÔÐÓ¸ Ð Ö Ó 1 Ö ÔÖ × ÒØ Ð × Ö Ð ÓÒ × A → B Ý B → A¸ Ö ×Ô Ø Ú Ñ ÒØ º Ò Ø ÖÑ ÒÓ×
Ñ Ø Ñ Ø Ó׸ Ð Ö Ó 1 Ö ÔÖ × ÒØ (A, B), (B, A) ∈ A × Aº Ò Ô Ð Ö × Ñ Ø Ñ Ø ×¸ Ð
Ö Ð ÓÒ Ö ÔÖ × ÒØ ÔÓÖ Ð Ö Ó Ð ¬ ÙÖ º¾ × × Ñ ØÖ º
      Ù Ò Ó Ð Ö Ð ÓÒ ÒÓ × × Ñ ØÖ ¸ ÒØÓÒ × Ð Ö Ó × “dirigido” Ý ÐÓ× Ö Ó× × Ð ×
 ÓÐÓ Ò ­ × ÕÙ Ò Ò Ð × ÒØ Ó Ð Ö Ð ÓÒ ÒØÖ Ó× ÒÓ Ó׺ ÍÒ grafo dirigido
  ¿
     ÈÓÖ ÐÓ Ò Ö Ð¸ ÐÓ× ÔÖÓ Ö Ñ ÓÖ × Ù× Ò Ð Ø ÖÑ ÒÓ ÒÓ Ó ¸ Ñ ÒØÖ × ÕÙ ÐÓ× Ñ Ø Ñ Ø Ó× ÔÖ ¬ Ö Ò
 Ð Ø ÖÑ ÒÓ Ú ÖØ º Ð Ñ ×ÑÓ ÑÓ Ó¸ ÐÓ× ÔÖÓ Ö Ñ ÓÖ × ÙØ Ð Þ Ò Ð ÚÓ ÐÓ Ö Ó Ñ ÒØÖ × ÕÙ ÐÓ×
Ñ Ø Ñ Ø Ó× × Ò Ð Ò Ò ÔÓÖ Ù× Ö Ö ×Ø º ÈÙ ×ØÓ ÕÙ ×Ø Ø ÜØÓ × Ñ × Ô Ö ÔÖÓ Ö Ñ ÓÖ ×¸ × Ù× Ö Ò Ò
ÔÖ Ö Ò ÐÓ× Ø ÖÑ ÒÓ× nodo Ý arco¸ Ö ×Ô Ø Ú Ñ ÒØ º
562                                                                     Cap´
                                                                           ıtulo 7. Grafos



Ø Ñ Ò × ÒÓÑ Ò “digrafo”º Ä ¬ ÙÖ º¿ ÑÙ ×ØÖ ÙÒ ÑÔÐÓº ÆÓØ × ÕÙ Ð Ö Ó 1
  Ö Ó × Ð ÒÓ Ó A           Ð ÒÓ Ó B Ö ÔÖ × ÒØ (A, B) ∈ Rº Ð Ñ ×ÑÓ ÑÓ Ó¸ ÒÓØ ×
ÕÙ (B, A) ∈ R × ÜÔÖ × ÔÓÖ Ð Ù× Ò
          /                            Ð ÖÓ Ö Ó × B             Aº

                                        B       2   E
                                1
                                                            3
                            A               4   5       6       F
                                    9                       7
                                        C       8   D



                           ÙÖ º¿ ÍÒ             Ö ÓÓ Ö Ó Ö          Ó
      Ð ÒÙÑ ÖÓ          Ö Ó× ÓÒ Ø Ó× ÙÒ ÒÓ Ó × ÐÐ Ñ Ó Ð grado del nodoº              Ð
  Ö Ó Ð Ö Ó × Ð Ñ ÝÓÖ Ö Ó ÒØÖ ØÓ Ó× ×Ù× ÒÓ Ó׺                  Ó ÙÒ ÒÓ Ó v¸ ÐÓ× ÒÓ Ó×
   Ö Ø Ñ ÒØ ÓÒ Ø Ó× × v ØÖ Ú × ×Ù× Ö Ó× × ÐÐ Ñ Ò ÒÓ Ó× Ý ÒØ ׺ ÈÓÖ
    ÑÔÐÓ¸ Ò Ð Ö Ó Ð ¬ ÙÖ º¿¸ ÐÓ× ÒÓ Ó× Ý ÒØ × B ×ÓÒ {C, D, E}º ÄÓ× ÒÓ Ó×
   × ÐÓ× Ù Ð × × ÐÐ           Ö Ø Ñ ÒØ ÙÒ ÒÓ Ó v × ÒÓÑ Ò Ò nodos incidentesº È Ö
  Ð ÑÔÐÓ ÒØ Ö ÓÖ¸ A × Ð ÙÒ Ó ÒÓ Ó Ò ÒØ Bº ÍÒ Ö Ó × incidente ×Ó Ö Ð´ÐÓ×µ
ÒÓ Ó´×µ ÕÙ Ð ÓÒ Ø º ר Ö × ÔÐ Ð ÙÒ Ö Ó ÒÓ Ö Ó¸ Ô ÖÓ ÔÙ ÓÑÔÐ ¹
Ñ ÒØ Ö× × ÐÓ× ÒÙÑ ÖÓ× Ö Ó× ÒØÖ ÒØ × Ý × Ð ÒØ × × Ð × ÐÐ Ñ Ò “grado de entrada”
Ý “grado de salida”¸ Ö ×Ô Ø Ú Ñ ÒØ º
         Ó ÙÒ Ö Ó Ö Ó¸ ×Ù ÒÓ Ó ÓÖ Ò × Ð ÒÓÑ Ò                      Ý ÒØ Ý Ð ×Ø ÒÓ
   Ò ÒØ º
    ÍÒ “camino” È ∈ G ÙÒ Ö Ó G × ¬Ò ÓÑÓ ÙÒ × Ù Ò ÒØ Ö Ð
ÒÓ Ó× Ý Ö Ó× Gº À Ý Ú Ö × ÓÖÑ × ÜÔÖ × Ö ÙÒ Ñ ÒÓ¸ Ð × Ù Ð × Ô Ò Ò Ð
Ø ÔÓ       Ö Ó Ý Ð ÔÐ ÓÒº Ò Ð ×Ó Ð Ö Ó Ð ¬ ÙÖ º¾¸ Ð × Ù Ò È =
A → B → J → H → N → L → I Ò                 ÙÒ Ñ ÒÓ × Ð ÒÓ Ó A ר Ð ÒÓ Ó Iº
ÇØÖ Ñ Ò Ö ÔÙ × Ö Ö Ø Ñ ÒØ A, B, J, H, N, L, I¸ Ó Ñ ÒØ Ð × Ø ÕÙ Ø × ÐÓ×
  Ö Ó× 1, 2, 3, 16, 6, 25 ר ÙÐØ Ñ ÓÖÑ ×Ø ×ÙÔ Ø         ÕÙ ÐÓ× Ö Ó× ×Ø Ò Ø ÕÙ Ø Ó×
Ö ÕÙ × ØÓ ÕÙ ÒÓ × Ö ÙÒ× Ö            Ò Ð ¬Ò ÓÒ ÓÖÑ Ð         Ö Óº Ä ÐÓÒ ØÙ          ÙÒ
   Ñ ÒÓ × ÓÑÔÓÒ ÔÓÖ Ð ÒÙÑ ÖÓ Ö Ó× ÕÙ ×Ø ÓÒØ Ò Ó × ¸ Ð ÒÙÑ ÖÓ ÒÓ Ó×
Ñ ÒÓ× ÙÒÓº
    ÍÒ        Ð × ÔÐ ÓÒ × Ñ × ÑÔÓÖØ ÒØ × ÐÓ× Ö Ó× Ð ÓÒר ØÙÝ Ð Ù×ÕÙ
   Ñ ÒÓ× × ÙÒ Ð ÙÒ Ö ×ØÖ ÓÒ             º ÉÙ Þ Ð ÔÖÓ Ð Ñ Ñ × ÔÓÔÙÐ Ö × Ð Ù×ÕÙ
   Ð Ñ ÒÓ Ñ Ò ÑÓ ÒØÖ ÙÒ Ô Ö ÒÓ Ó׺
    ÍÒ Ñ ÒÓ ÙÝÓ ÔÖ Ñ Ö Ý ÙÐØ ÑÓ ÒÓ Ó × Ò Ù Ð × × ÒÓÑ Ò ciclo o circuitoº Ë
Ð ÐÓÒ ØÙ Ð ÐÓ × ÙÒÓ¸ ÒØÓÒ × Ð Ñ ÒÓ × Ð Ð ¬                     “simple”     “bucle” Ó
    “lazo”º Ð Ö Ó           Ð ¬ ÙÖ º¾ ÓÒØ Ò ÙÒ ×ÓÐÓ ÐÓ × ÑÔÐ Ò Ð ÒÓ Ó J × Ö¸ Ð
Ô Ö (J, J)º
    ÍÒ Ö Ó G =< V, A > × Ð ¬            conexo × Ô Ö ØÓ Ó× ÐÓ× Ô Ö × ÓÖ Ò Ó×     ÒÓ Ó×
(v1, v2) ∈ G Ü ×Ø ÙÒ Ñ ÒÓ × v1 ר v2º ÜÔÖ × Ó                  ÓØÖ Ñ Ò Ö ¸ ÙÒ Ö Ó ×
  ÓÒ ÜÓ × Ô Ö ØÓ Ó ÒÓ Ó Ð Ö Ó Ü ×Ø ÙÒ ÐÓ ÕÙ ÒÓ × × ÑÔÐ º
    ÍÒ Ö Ó ×             ÕÙ × total¸ completamente conexo Ó¸ × ÑÔÐ Ñ ÒØ ¸ completo¸
×        ÒÓ Ó Ð Ö Ó × Ý ÒØ Ð Ö ×ØÓº Ð Ö Ó ÙÒ Ö Ó ÓÑÔÐ ØÓ × ×Ù ÒÙÑ ÖÓ
    ÒÓ Ó׺ Ä ¬ ÙÖ º ÐÙ×ØÖ Ð Ö Ó ÓÑÔÐ ØÓ Ö Ó 5º
7.1. Fundamentos                                                                                          563



                                            A                          B




                                    C                                          D


                                                         F



                           ÙÖ º ÍÒ Ö Ó ÓÑÔÐ ØÓ                                           Ö Ó5

     Ð grafo complemento ÙÒ Ö Ó G¸ ÕÙ × ÒÓØ G¸ × Ð Ö Ó ÓÑÔÙ ×ØÓ ÔÓÖ
ÐÓ× Ö Ó× ÕÙ × Ö ÕÙ Ö Ö Ò Ô Ö ÕÙ G Ú Ò × ÓÑÔÐ ØÓº      Ó ÓØÖÓ ÑÓ Ó¸ Ð Ö Ó
 ÓÑÔÐ ØÓ      Ö Ó |V| Ñ ÒÓ× ÐÓ× Ö Ó× Gº Ä ¬ ÙÖ º ÐÙ×ØÖ ÙÒ ÑÔÐÓº Ä ÙÒ ÓÒ
   ÙÒ Ö Ó Ý ×Ù ÓÑÔÐ Ñ ÒØÓ × Ð Ö Ó ÓÑÔÐ ØÓ       Ö Ó |V|º Ð ÙÒÓ× Ð ÓÖ ØÑÓ×
Ö ÕÙ Ö Ò Ð ÙÐ Ö Ð Ö Ó ÓÑÔÐ Ñ ÒØÓ ÓØÖÓ× Ö ÕÙ Ö Ò Ð Ö Ó ÓÑÔÐ ØÓ¸ Ð Ù Ð ÔÙ
  Ð ÙÐ Ö× × × Ø Ò Ð ÓÑÔÐ Ñ ÒØÓ Ñ ÒØ Ð ÙÒ ÓÒ G ∪ Gº
                   A                    B                                  A                     B




               C                                D                 C                                   D


                               F                                                        F

                           ´µ                                                       ´ µ


                           ÙÖ º ÍÒ Ö Ó Ý ×Ù ÓÑÔÐ Ñ ÒØÓ
   Ä × × Ð × Ò ÒÙÑ ÖÓ ÒÓ Ó× Ý Ö Ó× ×ÓÒ ÐÓ× ØÓÖ × ÔÖ Ò Ô Ð × ÕÙ Ò Ò Ò
Ð Ø ÑÔÓ        Ù ÓÒ ÙÒ Ð ÓÖ ØÑÓ ×Ó Ö ÙÒ Ö Óº Ò Ð × ÜÔÖ × ÓÒ ×        Ð ÙÐÓ׸
ÔÖ     Ð Ø Ö Ð × ÙÖ×Ó¸ Ð × Ö Ò Ð  × ÐÓ× ÓÒ ÙÒØÓ× V Ý A ×Ù Ð Ò Ö ÔÖ × ÒØ Ö×
 Ö Ø Ñ ÒØ × Ò Ð × ÖÖ ×º
                                    B               2             J            3             H

                           1                4            6                 7        8
                                                                  14
                       A            9               D                          E        17       18
                                                                  1
                               11        12                  13       15                16

                                    C               10            F            17            G



                                        ÙÖ º ÍÒ ÑÙÐØ Ö Ó
     ÙÒ Ö Ó ÕÙ Ø Ò Ó× Ó Ñ × Ö Ó× ÕÙ ÓÒ Ø Ò ÐÓ× Ñ ×ÑÓ× ÒÓ Ó× × Ð ÒÓÑ Ò ¸
Ò Ô Ö Ö × × ÓÒ ÐÓ× ÓÒ ÙÒØÓ׸ “multigrafo”º Ä ¬ ÙÖ º ÐÙ×ØÖ ÙÒ ÑÔÐÓº ÍÒ ÑÙÐØ ¹
564                                                                                                                 Cap´
                                                                                                                       ıtulo 7. Grafos



 Ö Ó ÔÙ × Ö Ö Ó¸ Ò ÙÝÓ ×Ó × Ð ÐÐ Ñ multidigrafo Ó multigrafo dirigidoº
ÍÒ Ö Ó Ö ÙÒ ÒØ × Ø Ð          “paralelo”º
       Ó ÙÒ Ö Ó G =< V, A >¸ Ù ÐÕÙ Ö ×Ù ÓÒ ÙÒØÓ G =< V , A > | (V ⊆ V)(A ⊆ A |
∀a = (v1, v2) ∈ A =⇒ v1, v2 ∈ V ) ×  ÒÓÑ Ò subgrafo Gº Ä ¬ ÙÖ º ÐÙ×ØÖ Ó×
×Ù Ö Ó× Ð ÐÙ×ØÖ Ó Ò Ð ¬ ÙÖ º¾º Ù ÐÕÙ Ö ×Ù Ö Ó ÓÑÔÐ ØÓ × ÒÓÑ Ò cliqueº

                           B                                                    H             4            M
                                                                                                                          5
                  1              28                                                   16              7
                                                                                                                                  L
                                                    14                                                          6
              A            10             D                   E                  17                                                   25
                                                                                          N
                                                                                                                24
                      11        12             13       18                            22              23                          I
                                                                                                                     27
                           C              20        F                           G             26               K

                                     ´µ                                                               ´ µ


                                     ÙÖ º               Ó× ×Ù Ö Ó× Ð Ö Ó Ò º¾
      ÙÒ Ö Ó ÕÙ ÒÓ × ÓÒ ÜÓ × Ð ÐÐ Ñ “inconexo”º ÍÒ Ö Ó Ò ÓÒ ÜÓ G × ÓÑÔÓÒ
     Ö Ó× ÓÒ ÜÓ׸ ÐÓ× Ù Ð × × ÒÓÑ Ò Ò “subgrafos conexos de G”º
    ÍÒ Ö Ó ÓÒ ÜÓ × Ò ÐÓ× × ÒÓÑ Ò “´rbol”º Å Ò ×Ø Ö ÒÓØ Ö ÕÙ ×Ø × ÙÒ
                                         a
 ÒØ ÖÔÖ Ø ÓÒ Ö ÒØ Ð           Ö ÓÐ ØÖ Ø  Ò Ü º½ ´Ô Ò ¾ µ¸ ÔÙ × Ò ×Ø ×Ó ÒÓ
 × Ö ÕÙ × ØÓ ÒÓØ Ö ÙÒ ÒÓ Ó Ö Þ ÙÒÕÙ Ò ÑÔ            ÖÐÓº
    ÍÒ “´rbol abarcador” ÙÒ Ö Ó ÓÒ ÜÓ G × ÙÒ Ö ÓÐ ÓÑÔÙ ×ØÓ ÓÒ Ö Ó× G
         a
ÕÙ ÓÒØ Ò ØÓ Ó× ÐÓ× ÒÓ Ó× Gº Ä ¬ ÙÖ º ÐÙ×ØÖ ÙÒ Ö ÓÐ Ö ÓÖ Ð Ö Ó
ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ º¾º
                           B              2         J                       H                             M

                                                             15        8             16           7
                                                                                                                              L
                                                                                                            6
              A            10             D                       E             17                                                25
                                                                                      N
                                               13                      18
                                                                                                                              I
                                                                                                                    27
                            C             20        F             21        G                              K



                      ÙÖ º ÍÒ Ö ÓÐ                       Ö        ÓÖ Ð ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ º¾
     Ð ÙÒÓ× Ð ÓÖ ØÑÓ× Ö ÕÙ Ö Ò Ú Ö ¬ Ö × Ð Ö Ó × “bipartido” Ó Ò ÓÒØÖ ÖÐÓº ÍÒ
 Ö Ó × “bipartido” × ×Ø ÔÙ          Ú Ö× Ò Ó× ÓÒ ÙÒØÓ× × ÙÒØÓ× ÒÓ Ó× B Ý C
Ø Ð ÕÙ ÐÓ× Ö Ó× ÙÒ ÓÒ ÙÒØÓ ÓÒ Ø Ò ÒÓ Ó× B ÓÒ ÒÓ Ó× C Ý ÕÙ ÒÓ Ü ×Ø
 ÓÒ Ü ÓÒ ÒØÖ ÐÓ× ÒÓ Ó× ÙÒ Ñ ×ÑÓ ÓÒ ÙÒØÓº Ä ¬ ÙÖ º ÑÙ ×ØÖ ÙÒ ÑÔÐÓº
       Ð × ÒØ Ó Ú ×Ù Ð Ð ÓÒ ÔØÓ       Ö Ó ×ÙÖ Ð            ÓÐÓÖ ÓÒ × ×Ó ÑÓ×
 ÓÐÓÖ × ÐÓ× ÒÓ Ó× Ó Ö Ó׺ Ð ÔÖÓ Ð Ñ     ÓÐÓÖ Ö ÒÓ Ó× ÓÒ× ×Ø Ò Ô ÒØ Ö ÐÓ× ÒÓ Ó×
   Ñ Ò Ö Ø Ð ÕÙ Ó× ÒÓ Ó× Ý ÒØ × ÒÓ Ø Ò Ò Ð Ñ ×ÑÓ ÓÐÓÖº Ò Ð Ñ ×ÑÓ × ÒØ Ó¸
      Ò ÒÐ×   “spanning tree”º
7.1. Fundamentos                                                                                      565



        B                    H            D
                                                  A       A       B       C           D       E


    F       G            C       E


                                                      B       F       G           H       I       J
            A            I       J

                    ´µ                                                    ´ µ


                                      ÙÖ º ÍÒ Ö Ó Ô ÖØ Ó

 ÓÐÓÖ Ö Ö Ó× ÓÒ× ×Ø Ò Ô ÒØ ÖÐÓ× ÓÖÑ Ø Ð ÕÙ Ó× Ö Ó× ÕÙ Ò Ò ×Ó Ö Ð Ñ ×ÑÓ
ÒÓ Ó Ø Ò Ò ÓÐÓÖ × Ö ÒØ ׺
     Ó× Ö Ó× G1 =< V1, A1 > Ý G2 =< V2, A2 > ×ÓÒ ×ÓÑÓÖ Ó× × × ÔÓ× Ð Ñ Ö
Ð × Ø ÕÙ Ø × V1 ÔÓÖ Ð × V2 Ø Ð ÕÙ A1 = A2º Ä ¬ ÙÖ º½¼ ÑÙ ×ØÖ ÙÒ ÑÔÐÓº
                                                                          6
                     A                B
                                                                          1

                C                             D
                                                                                      2
                                                              4       3

                             F        G
                                                                              5




                                     ÙÖ º½¼       Ó× Ö Ó× ×ÓÑÓÖ Ó×
    ÍÒ Ö Ó × ÐÐ Ñ Ó planar × × ÔÓ× Ð       Ù ÖÐÓ Ò ÙÒ ÔÐ ÒÓ × Ò ÕÙ ×Ù× Ö Ó× ×
 ÖÙ Òº
    ÍÒ Ñ ÒÓ ÙÐ Ö ÒÓ × ÙÒÓ ÕÙ Ô × ÔÓÖ ØÓ Ó× ÐÓ× Ö Ó× Ü Ø Ñ ÒØ ÙÒ Ú Þº ר
Ø ÔÓ       Ñ ÒÓ Ø Ô ¬ Ð ÙÒ × × ØÙ ÓÒ × ÓÔØ Ñ ÓÒ ÔÓÖ ÑÔÐÓ¸ Ð Ö ÓÖÖ Ó ÙÒ
  ÖØ ÖÓº ÍÒ Ñ ÒÓ Ñ ÐØÓÒ ÒÓ × ÙÒÓ ÕÙ Ô × ÔÓÖ ØÓ Ó× ÐÓ× ÒÓ Ó× Ü Ø Ñ ÒØ ÙÒ
Ú Þº Ð Ù Ð ÕÙ Ð Ð × ÒØ Ö ÓÖ¸ ר Ø ÔÓ        Ñ ÒÓ Ø Ñ Ò ÑÓ Ð Þ × ØÙ ÓÒ ×
ÓÔØ Ñ ÓÒ ÔÓÖ ÑÔÐÓ¸ Ð Ñ ÒÓ ÕÙ               Ö ÙÒ Ú × Ø ÓÖ Ñ Ó Ô Ö Ù Ö Ö ØÓ ×
Ð × Ù × ×Ù Ö ×ÔÓÒ× Ð º
    ÄÓ× Ö Ó× Ö ÔÖ × ÒØ Ò ÙÒ Ð × ÔÖÓ Ð Ñ × Ñ × ÓÑÔÐ ÕÙ           Ù×Ó ÒØ Ò× ÚÓ
 ÑÔÐ ÒØ ÓÒ × Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð ×ØÖÙ ØÙÖ             ØÓ׺ Ä Ò ÓÐ ÔÖÓ Ð Ñ ×
 ÓÒ Ö Ó× ÔÙ        Ð × ¬ Ö× Ò Ù ØÖÓ Ø ÔÓ׺
      Ð ÔÖ Ñ Ö Ø ÔÓ ÔÖÓ Ð Ñ × Ð × ¬ Ò “de existencia”º        Ó ÙÒ Ö Ó Ý ÙÒÓ×
Ö ÕÙ Ö Ñ ÒØÓ× ×Ó Ö ×Ø ¸ Ü ×Ø ÙÒ Ö Ó ÕÙ × Ø × ÐÓ× Ö ÕÙ Ö Ñ ÒØÓ× ÈÓÖ ÑÔÐÓ¸
  × ÙÒ Ö Ó ÔÐ Ò Ö
      Ð × ÙÒ Ó Ø ÔÓ × Ø Ô ¬ Ò “de construcci´n”º ÍÒ Ú Þ ÕÙ × ÓÒÓ Ð Ü ×¹
                                             o
ØÒ         ÙÒ Ö Ó ×Ô Ð¸ ÒØÓÒ × ÓÑÓ ÓÒרÖÙ ÖÐÓ º Ð ÙÒ Ú × ÒÓ × Ò × Ö Ó
   Ø ÖÑ Ò Ö Ð Ü ×Ø Ò ÔÓÖÕÙ ×Ø × ÓÒÓ            ÒØ Ñ ÒÓ ÔÓÖ ÑÔÐÓ׸ Ô Ö Ð Ù¹
566                                                        Cap´
                                                              ıtulo 7. Grafos



Ð Ö Ð Ö ÓÐ Ö ÓÖ Ó Ð ÙÒ Ñ ÒÓº ÇØÖ × Ú × × ÓÒÚ Ò Ø ÖÑ Ò Ö Ð Ü ×Ø Ò
ÔÖ Ñ ÖÓ¸ ÒØ ×       ÓÖ Ö Ð ÓÒרÖÙ ÓÒ ÔÓÖ Òר Ò ¸ Ð Ù Ó ÙÒ Ö Ó ÔÐ Ò Öº
     Ð Ø Ö Ö Ø ÔÓ × Ø Ð Ò “de enumeraci´n” Ó “conteo”º ÍÒ Ú Þ ÕÙ × Ø ÖÑ Ò
                                       o
Ð Ü ×Ø Ò ¸ ÒØÓÒ × × × ÓÒÓ Ö Ð ÒØ                 ×ÓÐÙ ÓÒ ×º ÈÓÖ ÐÓ Ò Ö Ð¸ רÓ×
ÔÖÓ Ð Ñ × Ø Ò Ò Ñ × Ð ÒØ Ö × Ñ Ø Ñ Ø Ó ÕÙ ÔÐ Ø ÚÓº
      Ò ÐÑ ÒØ ¸ Ð ÙÐØ ÑÓ Ø ÔÓ ÔÖÓ Ð Ñ × ÒÓÑ Ò “de optimizaci´n” Ý ÓÒ× ×Ø
                                                                  o
 Ò ÓÒרÖÙ Ö Ð Ñ ÓÖ ×ÓÐÙ ÓÒ × ÙÒ Ð ÙÒ Ö Ø Ö Ó ÓÔØ Ñ ÓÒº Ò ÐÓ ÕÙ × Ù         ר
Ø ÜØÓ × Ò ÓÒØÖ Ö Ò ÑÙ Ó× ÑÔÐÓ× Ú Ö Ò Ó × Ð Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ ×Ø Ð
 ÓÒרÖÙ ÓÒ ÙÒ Ñ ÒÓ Ñ ÐØÓÒ ÒÓº

7.2     Estructuras de datos para representar grafos
Ë ÓÒÓ Ò Ó× ×ÕÙ Ñ × Ô Ö Ö ÔÖ × ÒØ Ö Ö Ó× Ò Ð Ñ ÑÓÖ          ÙÒ ÓÑÔÙØ ÓÖ Ñ ¹
ØÖ × Ó Ð ×Ø × ÒÐ Þ ×º


                              C               D



                       B              A             E



                              G               F




                                  ÙÖ º½½ ÍÒ Ö Ó

7.2.1   Matrices de adyacencia
ÈÙ ×ØÓ ÕÙ ÙÒ Ö Ó Ö ÔÖ × ÒØ Ú ×Ù ÐÑ ÒØ ÙÒ Ö Ð ÓÒ¸ Ð × Ñ ØÖ × Ô Ö Ò × Ö Ð ×¹
ØÖÙ ØÙÖ Ò ØÙÖ Ð º        Ó¸ ר × Ø Ò Ò ÙÒ ØÖ ÓÒ Ù×Ó Ü ØÓ× Ò Ð Ñ Ø Ñ Ø
Ô Ö ÜÔÖ × Ö Ý Ñ Ò ÔÙÐ Ö Ö Ð ÓÒ × Ò Ö × Ý¸ ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ö Ó׺
   ÍÒ Ñ ØÖ Þ ÕÙ Ö ÔÖ × ÒØ ÙÒ Ö Ó × ÒÓÑ Ò “de adyacencia”º Ë ØÖ Ø
ÙÒ Ñ ØÖ Þ Ù Ö M[V × V] ÙÝ × ÒØÖ × M(i, j) Ö ÔÖ × ÒØ Ò Ð ÓÒ Ü ÓÒ ÒØÖ Ð
ÒÓ Ó i Ý jº Ä Ñ Ò Ñ Ò ÓÖÑ ÓÒ Ò × Ö Ò             ÒØÖ      × ÙÒ Ø ÕÙ Ò ÕÙ
Ð Ü ×Ø Ò Ó ÒÓ Ð Ö Óº Ð Ö Ó Ð ¬ ÙÖ º½½ × Ö ÔÖ × ÒØ Ñ ÒØ Ð Ñ ØÖ Þ
ÑÓ×ØÖ     Ò Ð ¬ ÙÖ º½¾º ÍÒ ÖÓ Ò Ð Ù× Ò             Ö Ó¸ Ñ ÒØÖ × ÕÙ ÙÒ ÙÒÓ ×Ù
ÔÖ × Ò º
   Ë Ð Ø ÔÓ       ØÓ ×Ó Ó ÙÒ ÒÓ Ó ÒÓ × ÒØ ÖÓ¸ ÒØÓÒ × Ý ÕÙ ÑÔÐ ÒØ Ö ÙÒ
Ñ Ô Ó ÒÓ Ó×          Ò × Ð Ñ ØÖ Þº Ä Ñ Ò Ö Ñ × × ÑÔÐ           ÖÐÓ × Ñ ÒØ
ÙÒ ÖÖ ÐÓ ÒÓ Ó× ÙÝÓ× Ò × × ÓÖÖ ×ÔÓÒ Ò ÓÒ Ò × Ò Ð Ñ ØÖ Þº Ë Ð ÖÖ ÐÓ
 ר ÓÖ Ò Ó¸ ÒØÓÒ × Ð Ù×ÕÙ           Ò Ö ÜÔÐ    Ò Ü ¿º½º ´Ô Ò ½ µ Ò Ù ÒØÖ
ÑÙÝ ¬ ÞÑ ÒØ ÙÒ Ò            Ó ÙÒ ÒÓ Óº
7.2. Estructuras de datos para representar grafos                          567


                      ⎛       ⎞
                                   A    B C D E F G
                      ⎜       ⎟   ⎛                  ⎞
                      ⎜   A   ⎟     0    1 1 1 0 1 1
                      ⎜       ⎟   ⎜ 1
                      ⎜   B   ⎟   ⎜      0 1 0 1 1 1 ⎟
                                                     ⎟
                      ⎜       ⎟   ⎜ 1
                      ⎜
                      ⎜
                          C   ⎟
                              ⎟   ⎜      1 0 1 1 0 0 ⎟
                                                     ⎟
                      ⎜   D   ⎟   ⎜                  ⎟
                      ⎜       ⎟   ⎜ 1    0 1 0 1 0 0 ⎟
                      ⎜       ⎟   ⎜                  ⎟
                      ⎜   E   ⎟   ⎜ 0    1 1 1 0 1 0 ⎟
                      ⎝       ⎠   ⎜                  ⎟
                          F       ⎝ 1    1 0 0 1 0 1 ⎠
                          G         1    1 0 0 0 1 0

               ÙÖ º½¾ Å ØÖ Þ            Ý Ò    Ð Ö Ó Ò Ð ¬ ÙÖ º½½

    Ë ÐÓ× Ö Ó× ÒÓ Ø Ò Ò Ð ÙÒ Ø ÔÓ ×Ó Ó¸ ÒØÓÒ × Ð Ì BitArray¸ ×ØÙ Ó
 Ò Ü ¾º½º¿ ´Ô Ò ¿ µ¸ ÔÙ ÙØ Ð Þ Ö× ÓÑÓ ×            ÑÔÐ ÒØ ÓÒ Ð Ñ ØÖ Þ        ݹ
    Ò º ÈÓÖ ÐÓ ÓÒØÖ Ö Ó¸ × ÐÓ× Ö Ó× ×Ó Ò Ð ÙÒ Ø ÔÓ¸ ÒØÓÒ ×          ÒØÖ      Ð
Ñ ØÖ Þ ÔÓ Ö Ö ÔÖ × ÒØ Ö Ð Òר Ò       Ð Ø ÔÓ ÕÙ ×Ø Ö ×Ó     Ð Ö Óº Ò ×Ø ×Ó¸
Ö ÕÙ Ö ÑÓ× ÙÒ Òר Ò ×Ô Ð Ð Ø ÔÓ Ô Ö Ò Ö Ð Ù× Ò               Ð Ö Óº
    ÍÒ Ñ ØÖ Þ       Ý Ò Ó ÙÔ O(V 2) Ð × Óר ÐØÓ ÙÒ Ô Ö Ö Ó× Ñ Ò
 × Ð º ÈÓÖ ×Ø Ö ÞÓÒ¸ Ö ×ÙÐØ ÒØ Ö × ÒØ Ð Ù×Ó ×ØÖÙ ØÙÖ × Ö ÔÖ × ÒØ ÓÒ Ñ ¹
ØÖ × ×Ô Ö × ÕÙ ÒÓ Ó ÙÔ Ò ×Ô Ó ÔÓÖ ÒØÖ × ÒÙÐ × Ò ÒÙ ×ØÖÓ ×Ó¸ ÔÓÖ Ù× Ò
     Ö Ó׺
    ÍÒ ÔÖ Ñ Ö Ñ Ò Ö          ÓÖÖ Ö Ñ ÑÓÖ Ð ÓÒר ØÙÝ ÓÒ× Ö Ö Ð Ø ÔÓ Ö Óº Ë
Ð Ñ ØÖ Þ ÒÓ Ö ÔÖ × ÒØ ÙÒ Ö Ó¸ ÒØÓÒ × ×Ø ÓÒ ×ÓÐÓ Ù Ö Ö ÐÓ× Ð Ñ ÒØÓ× ×Ó Ö
Ó       Ó Ð        ÓÒ Ðº Ð Ñ ×ÑÓ ÑÓ Ó¸ × Ð Ö Ó ÒÓ ÓÒØ Ò Ð ÞÓ׸ ÒØÓÒ × ÒÓ ×
Ò × Ö Ó ÓÒ× Ö Ö Ð         ÓÒ Ðº
    ÍÒ Ñ ØÖ Þ ØÖ ÓÒ Ð Ö ÕÙ Ö ÙÒ ÐÓÕÙ Ñ ÑÓÖ ÓÒØ ÙÓ ÔÖÓÔÓÖ ÓÒ Ð O(V 2)º
    Ñ      ÕÙ ÙÑ ÒØ V ¸ × Ñ ×         Ð Ô Ö ÙÒ Ñ Ò ÓÖ Ñ ÑÓÖ Ò ÓÒØÖ Ö ÙÒ
  ÐÓÕÙ ÓÒØ ÙÓº ÍÒ ×ÕÙ Ñ ÙÒ ÓÒ ÐÑ ÒØ ÕÙ Ú Ð ÒØ ¸ ÓÒ× ×Ø Ò Ô ÖØ Ö ÙÒ ÖÖ ¹
 ÐÓ ÖÖ ÐÓ× ÙÝ Ö ÔÖ × ÒØ ÓÒ Ô ØÓÖ × ÑÙ ×ØÖ Ò Ð ¬ ÙÖ º½¿º Ò × ×Ó¸ Ð
Ñ Ò ÓÖ Ñ ÑÓÖ Ö ÕÙ Ö Ô ÖØ Ö V ÐÓÕÙ × ÓÒØ ÙÓ× Ø Ñ ÒÓ V ¸ ÐÓ Ù Ð × Ñ ×
    Ð ÕÙ ÙÒÓ ×ÓÐÓ V × V º Ò C++¸ ÙÒ Ñ ØÖ Þ          Ý Ò        Ö Ó× Ð Ø ÔÓ T ×
    ÐÖ Ò         Ð × Ù ÒØ ÑÓ Ó
  Ò Ð Þ Ö ÖÖ ÐÓ       ÖÖ ÐÓ× ≡
 T ** matriz = new T * [V];
 for (int i = 0; i < V; ++i)
   matriz[i] = new T [V];
     ר Ó Ó ÔÙ ÑÓ ¬ Ö× Ô Ö Ù× Ö Ð Ø ÔÓ BitArray¸ ÐÓ ÕÙ ×       ÓÑÓ Ö Óº
    À Ý Ð ÓÖ ØÑÓ× ÕÙ × × ÑÔ Ò Ò Ñ ÓÖ ÓÒ Ñ ØÖ ×        Ý Ò ÕÙ ÓÒ ×Ù ÓÒ¹
ØÖ Ô ÖØ ÕÙ Ù× Ð ×Ø × ÒÐ Þ ×º Ð ÙÒÓ× Ð ÓÖ ØÑÓ× ÓÒ Ñ ØÖ ×    Ý Ò Ö ÕÙ Ö Ò
ÓØÖ × Ñ ØÖ × Ô Ö Ñ ÒØ Ò Ö ×Ø Ó ×Ù× Ð ÙÐÓ׸ ÐÓ ÕÙ Ò Ö Ñ ÒØ Ð Óר Ò Ñ ÑÓ¹
Ö º
      Ô ÖØ Ð ÔÖÓÚ Ñ ÒØÓ Ð Ø ÔÓ         Ö Ó¸ ÓØÖ ÓÖÑ     ÓÖÖ Ö ×Ô Ó × Ù× Ö
ÙÒ ÖÖ ÐÓ ×Ô Ö Ó Ð Ø ÔÓ DynArray<T> ×ØÙ Ó Ò Ü ¾º½º ´Ô Ò ½µº
    ÍÒ Ñ ØÖ Þ        Ý Ò Ö ÕÙ Ö ÓÒÓ Ö ÔÖ ÓÖ Ð ÒÙÑ ÖÓ ÒÓ Ó׺ ÈÓÖ ×Ø
Ö ÞÓÒ¸ ר Ö ÔÖ × ÒØ ÓÒ ÒÓ × ÓÒÚ Ò ÒØ Ô Ö × ØÙ ÓÒ × Ò Ð × Ù Ð × Ð Ö Ó × Ð
 Ò× ÖØ Ò Ý Ð Ñ Ò Ò ÒÓ Ó× Ó Ö Ó× Ò Ñ Ñ ÒØ º
568                                                                    Cap´
                                                                          ıtulo 7. Grafos



                                A        0 1 1 1 0 1 1
                                B        1 0 1 0 1 1 1
                                C        1 1 0 1 1 0 0
                                D        1 0 1 0 1 0 0
                                E        0 1 1 1 0 1 0
                                 F       1 1 0 0 1 0 1
                                 G       1 1 0 0 0 1 0



   ÙÖ º½¿ ÖÖ ÐÓ           ÖÖ ÐÓ× ÓÖÖ ×ÔÓÒ ÒØ Ð Ñ ØÖ Þ                 Ý Ò     Ð ¬ ÙÖ º½½

7.2.2   Listas de adyacencia
    Ó ÙÒ ÒÓ Ó v Ô ÖØ Ò ÒØ ÙÒ Ö Ó¸ ×Ù Ð ×Ø     Ý Ò × ÓÑÔÓÒ ÔÓÖ ÐÓ× ÒÓ Ó×
 ÐÓ× Ù Ð × v ר ÓÒ Ø Ó Ñ ÒØ Ö Ó׺         ר ÑÓ Ó¸ Ô Ö Ö ÔÖ × ÒØ Ö ÙÒ Ö Ó Ò
Ñ ÑÓÖ ¸ × ÙØ Ð Þ Ò Ð ×Ø × Ý Ò ÔÖ            ÒÓ Ó Ð Ö Óº Ä ¬ ÙÖ º½ ÐÙרÖ
ÙÒ ÑÔÐÓº
                       A         B       C       D     F       G
                       B         A       C       G      F      E
                       C         A       D       B      E
                       D            E    D       A
                       E            D    C       B      F
                          F         B    G       A      E
                          G          B   A        F



                 ÙÖ º½ Ä ×Ø ×            Ý Ò          Ð Ö Ó Ò Ð ¬ ÙÖ º½½
         ÒÓ Ó ÙÒ Ð ×Ø           Ý Ò Ù Ö Ð Ö ÓÒ Ñ ÑÓÖ                      ÙÒ Ú ÖØ Ò
 Ð Ö Ó ÓÖÖ ×ÔÓÒ ÒØ Ð Ü ×Ø Ò                 ÙÒ Ö Óº ÈÙ ×ØÓ ÕÙ Ò ÙÒ Ö Ó ÐÓ× Ö Ó× ×ÓÒ
    Ö ÓÒ Ð ×¸ רÓ× × Ö ­ Ò Ó× Ú × Ò Ð Ö ÔÖ × ÒØ ÓÒ ÓÒ Ð ×Ø ×                Ý Ò Ó
× ¸ ÙÒ Ú Þ ÔÓÖ        ÒÓ Ó ÜØÖ ÑÓ            Ö Óº ÈÓÖ ÑÔÐÓ¸ Ò Ð Ö Ó Ð ¬ ÙÖ º½½¸
 Ð Ö Ó A ↔ B Ô Ö Ò Ð × Ð ×Ø ×            Ý Ò          ÐÓ× ÒÓ Ó A Ý Bº
    Ä ÙÔÐ              Ö Ó× Ò Ð × Ð ×Ø ×      Ý Ò          ÖÖ ÙÒ ×Ó Ö Ó×ØÓ       ×Ô Ó
 Ù Ò Ó ÐÓ× Ö Ó× ×Ó Ò Ð ÙÒ Ø ÔÓ           ØÓ¸ ÔÙ × × ÙÔÐ Ò ÓÖÑ ÓÒº ÈÓÖ ÓØÖ Ô ÖØ ¸
 Ð ÙÒÓ× Ð ÓÖ ØÑÓ× Ù Ö Ò ×Ø Ó              Ð ÙÐÓ Ò ÐÓ× Ö Ó׸ ÐÓ ÕÙ Ö ÕÙ Ö ¸ Ò ×Ó
Ñ ÒØ Ò Ö× Ð ÙÔÐ            Ñ Ò ÓÒ ¸ ÕÙ Ð ×Ø Ó × ØÙ Ð Ò Ó× Ö ÓÒ ×
Ñ ÑÓÖ        Ö ÒØ ׺ ÈÓÖ ×Ø Ö ÞÓÒ¸ × ÔÖ Ö Ð ×ØÖ Ö ÙÒ Ö Ó Ý Ù Ö Ö Ö ÓÒ ×
 ר Ò Ð × Ð ×Ø ×       Ý Ò ¸ Ò ÐÙ Ö Ù Ö Ö Ö ÓÒ × ÒÓ Ó׺
        ר Ñ Ò Ö ¸ Ð Ð ×Ø         Ý Ò          Ú Ò ÙÒ Ð ×Ø        Ö Ó׺ Ä ×Ø Ò ÓÒ Ð
ÒÓ Ó ×Ø ÒÓ × Ö Ð Þ × ÙÒ Ð ÒÓ Ó ÔÖÓÔ Ø Ö Ó Ð Ð ×Ø º Ò Ð ÑÔÐÓ Ð ¬ ÙÖ º½½
× ÒÓ× Ò ÓÒØÖ ÑÓ× Ò Ð Ð ×Ø            Ý Ò         Ð ÒÓ Ó B Ý Ò ÓÒØÖ ÑÓ× Ð Ö Ó A ↔ B¸
 ÒØÓÒ × × ÑÓ× ÕÙ × ØÖ Ø Ð Ö Ó ÓÒ × ÒØ Ó B ↔ Aº
     ÓÒ Ð ×ÕÙ Ñ ÒØ Ö ÓÖ × ÔÙ Ñ ÒØ Ò Ö ×Ø Ó Ò ÐÓ× Ö Ó× × Ò Ò ×                     Ð Ö
 ÓÒ Ð × ÙÔÐ        × ÒÓ Ó׺ ר ×ÕÙ Ñ Ø Ñ Ò ÙÒ ÓÒ ÓÒ Ö Ó× ÜÔ Ò× ×
   Ë Ù× Ú ÖØ     Ò ÐÙ Ö       ÒÓ Ó Ô Ö   ר Ò Ù ÖÐÓ   ÒÓ Ó Ò Ð Ð ×Ø     Ý   Ò º
7.3. Un TAD para grafos (List Graph<Node, Arc>)                                   569



ÙÒ Ó×ØÓ Ò Ñ ÑÓÖ Ð Ö Ñ ÒØ ×ÙÔ Ö ÓÖ ÕÙ Ð Ù Ö Ö ÐÓ× ÒÓ Ó׺
      Ä × Ð ×Ø ×     Ý Ò Ø Ò Ò Ú Ö × Ú ÒØ × Ö ×Ô ØÓ Ð × Ñ ØÖ ׺ Ä ÔÖ Ñ Ö
  ÐР׸ × ÕÙ Ð Óר Ò ×Ô Ó × Ü Ø Ñ ÒØ ÔÖÓÔÓÖ ÓÒ Ð Ð ÒÙÑ ÖÓ Ö Ó׺ ×ØÓ ×
ØÖ Ù Ò ÓÖÖÓ× Ñ ÑÓÖ Ù Ò Ó Ð Ö Ó × ×Ô Ö Óº
      Ä × ÙÒ Ú ÒØ × ÕÙ ×               Ð Ø ÓÔ Ö Ö Ð Ö Ó Ò ÙÒ ÓÒ ×Ù Ö Ø Ö Ö ¬ Ó
  × Ö¸ Ò ÙÒ ÓÒ ÒÓ Ó× Ý Ö Ó׺ ×ØÓ Ò Ò Ö Ð ÒÓ ×Ù                      ÓÒ ÙÒ Ð ÓÖ ØÑÓ ÕÙ
Ù× ÙÒ Ñ ØÖ Þ           Ý Ò Ð Ù Ð ÔÖÓ Ð Ñ ÒØ Ø Ò × ÒØ Ó Ñ Ø Ñ Ø Ó¸ Ô ÖÓ ÒÓ Ð
  Ö ¬ Ó ÕÙ × Ò Ð ÑÓ× Ð ÔÖ Ò Ô Ó Ð Ô ØÙÐÓº
      Ä ÙÐØ Ñ Ú ÒØ ÕÙ ÔÖ ÑÓ× Ò Ð Ö ÔÖ × ÒØ ÓÒ ÓÒ Ð ×Ø × × ×Ù ­ Ü Ð Ô Ö
  Ð Ñ Ò Ó Ñ ÑÓÖ Ý Ò Ñ ×ÑÓº ÈÙ ×ØÓ ÕÙ × Ô ÖØ Ñ ÑÓÖ Ò ÙÒ ÓÒ ÒÓ Ó×
Ý Ö Ó׸ × Ñ × × ÑÔÐ Ô Ö Ð Ñ Ò ÓÖ Ñ ÑÓÖ Ó Ø Ò Ö ÐÓÕÙ × ÙÒ Ò × Ò Ö Ó×
  Ò ÕÙ Ý ÔÓ Ñ ÑÓÖ Ó ×Ø ר ÑÙÝ Ö Ñ ÒØ º ÈÓÖ ÓØÖÓ Ð Ó¸ ÔÓÖ ×Ù Ö Ø Ö
     Ð ×Ø ׸ ר Ö ÔÖ × ÒØ ÓÒ × ÑÙ Ó Ñ × Ò Ñ Ô Ö ÓÔ Ö ÓÒ × ÒØ Ö Ð ×
 Ò× Ö ÓÒ Ý Ð Ñ Ò ÓÒ ×Ó Ö ØÓ Ó × Ð × Ð ×Ø × ×ÓÒ Ó Ð Ñ ÒØ ÒÐ Þ ×º
        ÓÑÓ ×Ú ÒØ ÔÓ ÑÓ× ÒØ ¬ Ö ÕÙ Ð Ú Ö ¬ ÓÒ                    Ü ×Ø Ò      ÙÒ Ö Ó ×
  Ò Ð ÔÖÓÑ Ó Ó Ô ÓÖ ÐÓ× ×Ó× O(V)¸ ÔÙ × × Ò × Ö ÙÒ Ù×ÕÙ                    Ò ÙÒ Ð ×Ø
    Ý Ò º ÓÒ ÙÒ Ñ ØÖ Þ¸ Ò Ñ Ó¸ ר Ú Ö ¬ ÓÒ × O(1) Ó O(Ð (n))º
        ÓÒ ÙÒ Ñ ØÖ Þ          Ý Ò ¸ ÐÓ× Ö Ó× Ô Ö Ò Ò Ð ÓÖ Ò Ó ÔÓÖ ×Ù× ¬Ð ×
´Ó ÓÐÙÑÒ ×µº Ò Ð ÑÔÐÓ Ð ¬ ÙÖ º½½¸ ÐÓ× Ö Ó×                  Ð ÒÓ Ó D × ÑÔÖ Ô Ö Ò
ÔÖ Ñ ÖÓ ÕÙ ÐÓ× ÕÙ Ú Ò             Ð ÒÓ Ó Eº ÓÒ Ð ×Ø ×    Ý Ò ¸ Ð ÓÖ Ò Ô Ö ÓÒ
     ÐÓ× Ö Ó× Ý¸ ÔÓÖ Ø ÒØÓ¸ ×Ù ÓÖ Ò ÔÖÓ × Ñ ÒØÓ × Ö Ð Ø ÚÓ ×Ù ÔÓ× ÓÒ ÒØÖÓ Ð
Ð ×Ø          Ý Ò º Ð Ú Þ¸ Ð ÓÖ Ò            Ô Ö ÓÒ Ô Ò       Ð ÓÖ Ò Ò× Ö ÓÒ Ò Ð
  Ö Óº Ô ÖØ Ð ×Ù ÖØ ¸ ÔÓÖ ÐÓ Ò Ö Ð ×ØÓ ÒÓ Ô Ö Ø Ò Ö ÑÔÐ ÓÒ ×                  × ÑÔ ÒÓº

7.3    Un TAD para grafos (List Graph<Node, Arc>)
   Ò ×Ø × ÓÒ ÔÖ × ÒØ Ö ÑÓ× Ð × ÒÓ ÑÔÐ ÒØ ÓÒ Ð Ì List Graph<Node, Arc>¸
  Ð Ù Ð ÔÖ Ø Ò ÑÓ Ð Þ Ö Ö Ó× Ò Ö Ð × ÕÙ ÔÙ Ò Ù× Ö× Ô Ö Ð Ñ ÝÓÖ             Ð××
     ÔÐ ÓÒ × ÓÒÓ × ×Ó Ö Ö Ó׺
       Ô × Ö ÕÙ Ò ×Ù × ÒØ Ó Ú ×Ù Ð ÙÒ Ö Ó Ô Ö × Ö ÑÙÝ Ò Ö Ð¸ ר ×ØÖ ÓÒ
     ÓÒ ÔØÓ × Ù× Ô Ö Ö ×ÓÐÚ Ö ÔÖÓ Ð Ñ × ÑÙÝ ×Ø ÒØÓ׺ ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ò ÓÒØÖ Ö
ÙÒ Ô ØÖÓÒ Ò Ö Ð ÕÙ Ô ÖÑ Ø ÑÓ Ð Þ Ö ÙÒ Ì ÕÙ ÙÒ ÓÒ Ô Ö ØÓ × Ð × Ð × ×
ÔÖÓ Ð Ñ × ×Ó Ö Ö Ó× × Ð Ó           к    Ñ ×¸ ÓÑÓ Ý      × Ö Ò × Ó¸ ÐÙ Ó
 Ò× ×Ø Ö Ò Ð ÔÖ Ò Ô Ó ¬Ò¹ ¹¬Ò ´Ü ½º º¾ ´Ô Ò ¾¾µµ¸ Ð Ò Ö Ð    Ø Ò ×Ù× Óר × Ò Ð
× ÒØ Ó ÕÙ Ð ÙÒ × ÔÐ ÓÒ × ÒÓ Ö ÕÙ Ö Ò Ð Ñ ÕÙ Ò Ö ×ÔÐ              Ô Ö ØÖ Ø Ö ÓÒ
ØÓ Ó× ÐÓ× ×Ó× ÔÓ× Ð ×º
      Ð Ó Ó Ô ÖØ Ò ÒØ       ÐÓ× Ì       ÙÒ Ñ ÒØ Ð × ×Ó Ö Ö Ó× × ×Ô ¬ Ò Ð
  Ö ÚÓ tpl graph.Hº
     ÈÙ Ö       Ö× ÕÙ ÙÒ        Ð × ÔÖ Ò Ô Ð × ¬ ÙÐØ × Ô Ö ÑÓ Ð Þ Ö ÙÒ Ì
  Ö Ó× × Ð       Ó ÕÙ ×Ø ÒÚÓÐÙ Ö ÓØÖ × Ð × × Ó ØÓº × Ò ÐÑ ÒØ ¸ ÙÒ Ö Ó
Ñ Ò ÒÓ Ó× Ý Ö Ó׸ ÐÓ× Ù Ð ×¸ Ò ÑÙ Ó× ×Ó׸ Ý ÕÙ ØÖ Ø ÖÐÓ× ÓÑÓ ÙÒ ×ØÖ ÓÒ
× Ô Ö ¸ ÙÒÕÙ Ö Ð ÓÒ ¸ Ð ÔÖÓÔ Ó Ö Óº ÍÒ ×Ô ØÓ × Ò Ð Ô Ö Ð ÓÑÔÖ × ÓÒ
  × Ð Ó × ÖÚ Ò      ÕÙ × Ò Ð ÑÓÑ ÒØÓ Ò ÕÙ × ¬Ò Ð Ö Ó¸ × Ö¸ Ù Ò Ó ×Ø
×      Ð Ö Ý × ÓÑÔ Ð ¸ ÕÙ × ÓÒÓ Ö Ò ÓÑÔÐ Ø Ñ ÒØ ÐÓ× Ø ÔÓ× ÒÓ Ó× Ý Ö Ó׺
          Ó ×Ù ÐØÓ Ò Ñ ×ÑÓ¸ List Graph<Node, Arc> ÓÒר ØÙÝ Ð ÔÖ Ò Ô Ð Ì
Ô ÖØ Ò ÒØ ÐÓ× Ö Ó׺ ר Ì Ô ÖÑ Ø ÓÔ Ö¸ × Ò Ö Ý ÑÓ ¬ Ö ×Ù ØÓÔÓÐÓ             Ö ¹
570                                                                      Cap´
                                                                                ıtulo 7. Grafos



    Ø Ö ×Ø × Ò × Ö × Ô Ö ÙÒ ÑÔÐ Ñ           Ð ÓÖ ØÑÓ׺ Ð ÓÖ ØÑÓ× × Ó× Ò Ñ ØÖ ×
          Ý Ò Ù× Ö Ò ÙÒ Ñ Ð       Ì ÓÖ ÒØ Ó× Ñ ØÖ × Map Matrix Graph<GT>¸
    Matrix Graph<GT> Ý Ady Mat<GT, Entry>¸ ÐÓ× Ù Ð × × Ö Ò Ø ÐÐ  Ñ ÒØ × ÖÖÓÐÐ ¹
     Ó× Ò Ü º ´Ô Ò      µº
    7.3.1      Grafos
    ÍÒ List Graph<Node, Arc> × ÙÒ Ð × ÕÙ ÑÓ Ð Þ ÙÒ Ö Ó ÑÔÐ Ñ ÒØ Ó ÓÒ Ð ×Ø ×
        Ý Ò º ËÙ× Ô Ö Ñ ØÖÓ× Ø ÔÓ ×ÓÒ Ð ÒÓ Ó Ý Ð Ö Ó¸ Ý × ¬Ò Ð × Ù ÒØ ÑÓ Ó
¼     Ö Ó× ¼ ≡
             template <typename __Graph_Node, typename __Graph_Arc>
        class List_Graph
        {
           Ì ÔÓ× List Graph<Node, Arc> ¼
           Å Ñ ÖÓ× ÔÖ Ú Ó× List Graph<Node, Arc>
           Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½
           ÁØ Ö ÓÖ × List Graph<Node, Arc>
        };
        ¬Ò ×
        List Graph¸   Ù×   Ò ÙÒ × ¼ ¸ ½ ¸     ¸   ¸   ¸   ¸   ß ½¸      ß ¸ Ò    ¼½º
     È Ö ÔÓ Ö Ù× Ö ÙÒ Ó ØÓ List Graph<Node, Arc> × Ò × Ö Ó   Ö ¬Ò Ó ÐÓ× Ø ÔÓ×
       ÒÓ Ó× Ý Ö Ó׸ Ù ×Ø ÓÒ Ð ÕÙ ÒÓ× Ó Ö ÑÓ× Ò Ð × ÔÖÓÜ Ñ × ×Ù ¹× ÓÒ ×º
       List Graph<Node, Arc> × Ö ÑÔÐ Ñ ÒØ ÙØ Ð Þ Ó Ô Ö Ð ÔÖÓ Ö Ñ ÓÒ Ò Ö
     ×    Ö¸ Ô Ö ÔÖÓ Ö Ñ Ö Ð ÓÖ ØÑÓ× ÕÙ ÙÒ ÓÒ Ò Ô Ö Ð × × Ò Ö Ð ×      Ö Ó׺
      Ò Ð ÔÖÓ Ö Ñ ÓÒ Ò Ö           ×   Ñ ÒÙ Ó Ò × Ö Ó ÓÒÓ Ö ÐÓ× ×Ù Ø ÔÓ×
    List Graph<Node, Arc>¸ ÐÓ× Ù Ð × ×  ¬Ò Ò ÓÒØ ÒÙ ÓÒ
¼    Ì ÔÓ× List Graph<Node, Arc> ¼ ≡                        ´ ¼µ
        typedef   List_Graph<__Graph_Node,   __Graph_Arc> Graph_Class;
        typedef   __Graph_Node               Node;
        typedef   __Graph_Arc                Arc;
        typedef   typename Node::Node_Type   Node_Type;
        typedef   typename Arc::Arc_Type     Arc_Type;
    Í× × List Graph ¼ º
           ÓÒ× Ö ÑÓ× Ð × Ù ÒØ Ö Ñ ÒØÓ             Ó Ó¸ Ð Ù Ð         ÑÔÐ ¬    Ð Ù×Ó    רÓ× Ø ÔÓ×
        template <class GT>
    void fct(GT & g)
    {
      typename GT::Arc * arc;

        typename GT::Arc_Type dato;
        // ...
    }

       Ä ÙÒ ÓÒ × Ò Ö Ý Ö              ÙÒ List Graph<Node, Arc> ÐÐ Ñ Ó GTº Ä ÔÖ Ñ Ö
    ÐÒ       Ð Ö ÙÒ ÔÙÒØ ÖÓ ÙÒ Ö Ó Ñ ÒØÖ × ÕÙ Ð × Ù ÒØ            Ð Ö ÙÒ Ú Ö Ð Ð
    Ñ ×ÑÓ Ø ÔÓ ÕÙ Ð ØÖ ÙØÓ ×Ó Ó Ð Ö Óº ÆÓØ ÑÓ× ÕÙ ×Ø Ó Ó × Ò Ö Ó Ò Ð
    × ÒØ Ó ÕÙ         Ö      ÓÔ Ö Ö ×Ó Ö Ù ÐÕÙ Ö ÓÑ Ò ÓÒ Ø ÔÓ× ÒÓ Ó× Ý Ö Ó׺
         Ò ÐÓ ÕÙ × Ù       Ð × × Ù ÒØ × ×Ù ¹× ÓÒ ×¸ Ñ Ò ÓÒ Ö ÑÓ× ÓÔ Ö ÓÒ × ×Ó Ö
    List Graph<Node, Arc> Ò Ú Ð         ÒØ Ö Þ Ý ÒÓ ÑÔÐ ÒØ ÓÒº
7.3. Un TAD para grafos (List Graph<Node, Arc>)                                        571



    7.3.2    Digrafos (List Digraph<Node, Arc>)
     Ð Ì ÕÙ ÑÓ Ð Þ         Ö Ó× × ÒÓÑ Ò                 List Digraph<Node, Arc>º Ì ÒØÓ
    ÒÚ Ð     רÖÙ ØÙÖ     ØÓ׸ ÓÑÓ Ò Ú Ð                  ÒØ Ö Þ¸ Ð List Graph<Node, Arc>
    Ø Ò × ØÓ Ó ÐÓ Ö ÕÙ Ö Ó Ô Ö Ñ Ò Ö                      Ö Ó׺     ÈÓÖ × Ö ÞÓÒ        ¬Ò Ö ÑÓ×
    List Digraph<Node, Arc> ÔÓÖ Ö Ò ÔÙ Ð                       List Graph<Node, Arc>   Ø Ð ÓÑÓ
    × ÔÖ × ÒØ ÓÒØ ÒÙ ÓÒ
½      Ö Ó× ½ ≡
          template <typename Node_Info, typename Arc_Info>
      class List_Digraph : public List_Graph<Node_Info, Arc_Info>
      {
        List_Digraph();
        List_Digraph(const List_Digraph & dg);
        List_Digraph & operator = (List_Digraph & dg);
      };
      ¬Ò ×
      List Digraph¸   Ù× Ò ÙÒ ×       Ò      º
    Í× × List Graph     ¼º
        Ä ÒØ Ö Þ List Digraph<Node, Arc> × ÒØ Ð List Graph<Node, Arc>
            Ó¸ ׸ ÔÓÖ Ö Ú ÓÒ Ð × ×¸ Ð Ñ ×Ñ º Ò Ú Ð ÑÔÐ Ñ ÒØ ÓÒ¸ Ð           ÖÒ
    Ö × Ò ÕÙ Ò List Graph<Node, Arc> × Ö ÙÒ Ð Ö Ó¸ × Ò Ø Ö Ð Ó Ö Ò
    ÐÓ× Ð ÓÖ ØÑÓ× Ý ÓÒ ÙÒ Ð ÖÓ ÓÒ×ÙÑÓ ×Ô Ó¸ Ô Ö Ö ÔÖ × ÒØ Ö Ð          Ö ÓÒ Ð
       Ð Ö Ó¸ Ñ ÒØÖ × ÕÙ Ò List Digraph<Node, Arc> ×ÓÐÓ × ÓÐÓ Ð Ö Ó Ò Ð Ð ×Ø
       Ý Ò         ×Ù ÒÓ Ó Ý ÒØ º
        ÈÙ          Ö × ØÙ ÓÒ × Ò Ð × Ù Ð × × Ò × Ö Ó Ø ÖÑ Ò Ö × ÙÒ Ó ØÓ Ø ÔÓ
    List Graph<Node, Arc> × Ó ÒÓ ÙÒ      Ö Óº È Ö ÐÐÓ¸ × ÔÖÓÚ Ð ÔÖ Ñ Ø Ú × Ù ÒØ
½    Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ ≡               ´ ¼µ ¾
      bool is_digraph() const;
    Ð Ù Ð Ö ØÓÖÒ      true   × Ð Ó ØÓ × ÙÒ       Ö Ó   false     ÐÓ ÓÒØÖ Ö Óº

    7.3.3    Nodos
    È Ö Ö ÔÖ × ÒØ Ö ÙÒ ÒÓ Ó ÙÒ Ö Ó¸ × ÙØ Ð Þ Ð Ì                  Graph Node<Node Type>¸   ÙÝ
     ×Ô ¬ ÓÒ Ò Ö Ð × ÓÑÓ × Ù
½      ¬Ò ÓÒ ÒÓ Ó Ö Ó ½ ≡
          template <typename Node_Info>
      class Graph_Node : public Dlink
      {
        typedef Graph_Node Node;
        typedef Node_Info Node_Type;
         Å Ñ ÖÓ× Graph Node<Node Type>             ¾
      };
           ¬Ò ÓÒ ÒÓ Ó Ö Ó ½ ÑÓ Ð Þ ÙÒ ÒÓ Ó Ô ÖØ Ò ÒØ ÙÒ Ö Ó ÑÔÐ Ò¹
    Ø Ó Ñ ÒØ Ð ×Ø ×        Ý Ò º ÍÒ Graph Node<Node Type> × ÙÒ Ð × ÔÐ ÒØ ÐÐ
     ÙÝÓ Ô Ö Ñ ØÖÓ × Ð Ø ÔÓ Ó ØÓ ×Ó Ó Ð ÒÓ Ó Ý ÕÙ × ÒÓÑ Ò Node Infoº Ë ×
      × ¸ ÔÓÖ ÑÔÐÓ¸ ÙÒ Ö Ó     ٠׸ ÒØÓÒ × Ð Ð Ò × Ù ÒØ
      Graph_Node<Ciudad> * nodo;
572                                                              Cap´
                                                                        ıtulo 7. Grafos



          Ð Ö ÙÒ ÔÙÒØ ÖÓ ÒÓ Ó ÓÒ ØÖ ÙØÓ Ø ÔÓ Ciudadº
        Ú ÒØÙ ÐÑ ÒØ ¸ × ÒÓ × Ö ÕÙ Ö Ò Ò ÙÒ ØÖ ÙØÓ Ô Ö ÙÒ ÒÓ Ó Ó¸ × × ÔÖ ¬ Ö ÓÐÓ ÖÐÓ
    Ò ÙÒ Ö Ú ÓÒ¸ ÒØÓÒ × ÔÓ ÑÓ× ×Ô ¬ ÖÐÓ ÓÒ ØÖ ÙØÓ× Ú Ó× Ð × Ù ÒØ
    ÓÖÑ
              Graph_Node<Empty_Class> node;

       Ð ØÖ ÙØÓ ÙÒ ÒÓ Ó × Ù Ö Ò Ð Ñ Ñ ÖÓ ØÓ node info¸ Ð Ù Ð ×                     ÐÖ
    ÓÑÓ × Ù
¾   Å Ñ ÖÓ× Graph Node<Node Type> ¾ ≡          ´ ½µ ¾
     Node_Info    node_info;
    Ý ÕÙ × Ó × ÖÚ Ý ÑÓ ¬ Ñ ÒØ
¾    Å Ñ ÖÓ× Graph Node<Node Type>        ¾ +≡           ´ ½µ    ¾      ¾
     Node_Info & get_info() { return node_info; }
         ÒØÖÓ ÙÒ List Graph<Node, Arc>¸           ÒÓ Ó Ô ÖØ Ò   ÙÒ Ð ×Ø Ö ÙÐ Ö Ó Ð ¹
    Ñ ÒØ ÒÐ Þ      ÒÓ Ó׺ Ð ÒÐ     ÒØÖÓ          × Ð ×Ø × this Ñ ÒØ Ö Ò ÔÙ Ð
      Dlinkº

    7.3.3.1    Inserci´n de nodos
                      o

    È Ö Ð ÓÑÔÖ Ò× ÓÒ ×Ø ×Ù ¹× ÓÒ Ý Ð × ×Ù ¹× Ù ÒØ × × Ò × Ö Ó ÔÖ Ò Ö ÕÙ
    ÙÒ Ö Ó List Graph<Node, Arc> Ù× Ó ØÓ× Ø ÔÓ List Graph<Node, Arc>::Node
    Ý ÒÓ ×ØÖ Ø Ñ ÒØ Ø ÔÓ Graph Node<Node Type>º
         ÙÒÕÙ     ×Ò       Ù         Ö        × Ö×     Ò Graph Node<Node Type>¸
    List Graph<Node, Arc>::Node ÔÓ Ö × Ö ÙÒ        Ö Ú ÓÒº ÈÓÖ ×Ø Ö ÞÓÒ¸   ØÓ×
    Ð ÓÑÔÐ Ø ØÙ      Ø ÔÓ׸ × Ò × Ö Ó Ò× ×Ø Ö Ò ÕÙ Ò ÙÒ List Graph<Node, Arc> Ð
    ÒÓ Ó × Ø ÔÓ List Graph<Node, Arc>::Nodeº
       À      Ð Ð Ö ØÓÖ ÒØ Ö ÓÖ ÔÓ ÑÓ× Ð Ö Ð Ò× Ö ÓÒ ÙÒ ÒÓ Ó Ò ÙÒ
    List Graph<Node, Arc>º À Ý Ó× ÓÔ Ö ÓÒ ×
¾    Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ ½ ¾
     inline virtual Node * insert_node(Node * node);
     inline virtual Node * insert_node(const Node_Type & node_info);
    Ä ÔÖ Ñ Ö Ú Ö× ÓÒ ØÓÑ ÙÒ ÒÓ Ó Ý Ö Ó¸ × Ö¸ ÙÝ ÓÒרÖÙ ÓÒ Ý Ù Ö Ð Þ ¸
    Ý ÐÓ Ò× ÖØ ÒØÖÓ Ð Ö Óº Ä × ÙÒ Ô ÖØ Ð Ñ ÑÓÖ Ô Ö ÙÒ Ó ØÓ Ø ÔÓ
    List Graph<Node, Arc>::Node¸ Ð × Ò Ð ØÖ ÙØÓ node info Ý ÐÙ Ó ÐÓ Ò× ÖØ ÒØÖÓ
      Ð Ö Óº
        Ë ÒÓ Ý Ñ ÑÓÖ ×Ù¬ ÒØ Ô Ö Ö Ö Ð ÒÓ Ó¸ ÒØÓÒ × × Ò Ö Ð Ü Ô ÓÒ
     ר Ò Ö bad allocº
             ØÓ×    ÒÓ Ö Ð ÒØ Þ Ö Ð × ÑÔ ÒÓ Ò Ñ Ó      List Graph<Node, Arc>¸
    insert node() ÒÓ Ö Ð Þ Ò Ò ÙÒ Ú Ð   ÓÒ   ÓÖÖ Ø ØÙ ÔÓÖ ÑÔÐÓ¸ Ð Ó Ð Ò¹
    × Ö ÓÒº
    7.3.3.2    Eliminaci´n de nodos
                        o

    È Ö Ð Ñ Ò Ö ÙÒ ÒÓ Ó ÙÒ Ö Ó ×ÓÐÓ ×Ø Ø Ò Ö ÙÒ ÔÙÒØ ÖÓ Ð Ñ ×ÑÓ
¾    Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ ¾                     ¿
     inline virtual void remove_node(Node * node);
7.3. Un TAD para grafos (List Graph<Node, Arc>)                                        573



    remove node()  Ð Ñ Ò Ð Ö Ó Ð ÒÓ Ó node ÙÒØÓ ØÓ Ó× ×Ù× Ö Ó× Ò ÒØ × Ý Ý ¹
      ÒØ ׺ ÌÓ Ð Ñ ÑÓÖ Ó ÙÔ ÔÓÖ Ð ÒÓ Ó Ý ×Ù× Ö Ó× × Ð Ö º
           Ó Ð Ñ ×ÑÓ ×Ô Ö ØÙ ÒÓ ×Ø Ö ÐÓ× Ò Ú Ð ÓÒ¸ remove node() ÒÓ Ö Ð Þ
    Ú Ö ¬ ÓÒ      ÓÖÖ Ø ØÙ ÔÓÖ ÑÔÐÓ¸ Ð Ð Ñ Ò ÓÒ ÙÒ ÒÓ Ó ÕÙ ÒÓ Ô ÖØ Ò Þ Ð
     Ö Óº
    7.3.3.3   Acceso a los nodos de un grafo

    Ë Ò Ð × ÓÔ Ö ÓÒ × Ò× Ö ÓÒ ÚÙ ÐÚ Ò Ð ÔÙÒØ ÖÓ Ð ÒÓ Ó Ò× ÖØ Ó¸ ÐÓ ÕÙ Ô ÖÑ Ø
     Ö ÓÖ ÖÐÓ ¸ ÔÙ Ö ÕÙ Ö Ö×    ×Ó ÐÓ× ÒÓ Ó× × ÙÒ List Graph<Node, Arc>º Ä
    ÔÖ Ñ Ø Ú × Ô Ö Ó Ø Ò Ö ÙÒ ÒÓ Ó Ù ÐÕÙ Ö Ð Ö Ó ×
¿    Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ ¾ ¿
      inline Node * get_first_node();
    Ä Ù Ð Ö ØÓÖÒ ÙÒ ÒÓ Ó Ù ÐÕÙ Ö ÓÒØ Ò Ó ÒØÖÓ Ð Ö Óº
       get first node() × ÙÒ ÔÙÒØÓ Ù ÐÕÙ Ö       ×Ó Ð Ö Óº ÆÓ                        Ö× Ò Ò ÙÒ
     ÓÒ× Ö ÓÒ Ö         Ð ÒÓ Ó ÕÙ Ö ØÓÖÒ Ö ×Ø ÔÖ Ñ Ø Ú º
         Ð ÒÙÑ ÖÓ ÒÓ Ó× ÕÙ ÓÒØ Ò ÙÒ List Graph<Node, Arc> ÔÙ                        ÓÒÓ Ö× Ñ ¹
       ÒØ
¿    Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ ¿                         ¿
      inline const size_t & get_num_nodes() const;


    B´squeda de nodos
     u
             Ó ÙÒ Ö Ó¸ ÔÙ ÔÐ ÒØ Ö× Ð Ù×ÕÙ         Ð ÙÒ ÒÓ Ó ÕÙ Ö ÙÒ Ð ÙÒ × Ö ¹
    Ø Ö ×Ø ׺ List Graph<Node, Arc> Ó Ö ØÖ × ÓÖÑ × Ù×ÕÙ ¸ × Ù Ò Ð ×¸ × Ö
    ÕÙ ×Ù Óר × O(n) ´|V| = nµ ÔÓÖ ÐÓ ÕÙ ÒÓ × Ö ÓÑ Ò ×Ù Ù×Ó × Ð Ù×ÕÙ      × ÑÙÝ
     Ö Ù ÒØ º
          × Ñ Ò ×Ø Ö × Ò Ð Ö ÕÙ × Ð ÔÐ ÓÒ Ö ÕÙ Ö Ù×ÕÙ × Ö Ù ÒØ ׸ ÒØÓÒ × ×
    ÔÖ Ö Ð Ò Þ Ö ÐÓ× ÒÓ Ó× Ò Ð ÙÒ ×ØÖÙ ØÙÖ            ØÓ× ×Ô Ð ÙÒ Ø Ð × Ó
     Ð ÙÒ Ð ×         Ö ÓÐ Ò Ö Ó    Ù×ÕÙ º
          Ð ÔÖ Ñ Ö Ø ÔÓ    Ù×ÕÙ    ר   Ó ÔÓÖ
¿    Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ ¿ ¿
           template <class Equal>
      Node * search_node(const Node_Type & node_info);
     Ò ×Ø ×Ó¸ × Ö Ð Þ ÙÒ Ù×ÕÙ × Ù Ò Ð ÓÒ Ö Ø Ö Ó          Ù Ð Equal ×Ó Ö ÐÓ×
     ØÖ ÙØÓ× Ð ÒÓ Óº Ä Ð × Equal Ô ÖÑ Ø ×Ø Ð Ö Ð ÙÒ Ö Ø Ö Ó × Ð Ø ÚÓ ×Ó Ö Ð ÙÒ
    Ô ÖØ ÐÓ× ØÖ ÙØÓ׺ Ë × × Ò ÓÑÔ Ö Ö ÒØ Ö Ñ ÒØ ÐÓ× ØÖ ÙØÓ׸ ÒØÓÒ × × ÔÙ
    Ù× Ö Ð × Ù ÒØ Ú Ö× ÓÒ ÔÓÖ ÓÑ × ÓÒ
¿    Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ ¿
      Node * search_node(const Node_Type & node_info);
       Ä × ÔÖ Ñ Ö × Ú Ö× ÓÒ × List Graph<Node, Arc> ÓÒØ Ò Ò ÒÚ Ö ÒØ × ÕÙ Ò ÖØÓ ÑÓ Ó Ô ÖÑ Ø Ò
    Ú Ð Ö ×Ù Ù×Óº ÆÓ Ó ×Ø ÒØ ¸ × Ð Ñ Ò ÖÓÒ ÔÓÖÕÙ Ð Ö    ÓÒ    × ÑÔ ÒÓ Ô Ö Ð ÓÖ ØÑÓ× ÔÖÓØÓØ Ô Ó×
     Ö Ø Ò × Ú Ö ÕÙ ÑÔ         ÙÒ Ó ¬ ÓÒ ÔÖÓ Ù Ø Ú º
574                                                           Cap´
                                                                 ıtulo 7. Grafos



Ð Ù Ð ÒÚÓ Ð ÓÔ Ö ÓÖ == Ð Ð × Node Typeº
    Ð × ÙÒ Ó Ø ÔÓ Ù×ÕÙ     ÓÒ× ×Ø Ò Ú Ö ¬ Ö × Ð ÙÒ ÒÓ Ó Ô ÖØ ÙÐ Ö × Ó ÒÓ Ô ÖØ
  Ð Ö Ó
 Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ ¿
 bool node_belong_to_graph(Node * node);
node belong to graph() Ö ØÓÖÒ true × node × Ô ÖØ Ð Ö Ó false ÐÓ ÓÒØÖ Ö Óº
      Ú × × Ö ÕÙ Ö Ù× Ö ÙÒ ÒÓ Ó ÓÒ Ö Ø Ö ×Ø × ÕÙ ÒÓ ×ÓÒ Ô ÖØ           ×Ù× ØÖ ¹
 ÙØÓ× Ø Ô Ó× ´ Ð × Node::Node Type Ó Node Infoµº ÈÓÖ ÑÔÐÓ¸ Ð ÙÒ Ò ÓÖÑ ÓÒ
ÓÐÓ      ÔÓÖ Ö Ú ÓÒ Graph Node<Node Type>º ÈÙ ×ØÓ ÕÙ ÒÓ Ý Ñ Ò Ö            ÓÒÓ¹
  Ö ÔÖ ÓÖ ×Ø × Ð × ×     Ö ÙÒר Ò ×¸ Ð ÙÒ ÓÖÑ ÕÙ × ÒÓ× Ó ÙÖÖ Ô Ö ÓÑÙÒ Ö
Ò ÓÖÑ ÓÒ ×Ó Ö Ð Ù×ÕÙ         × ÓÒ ÙÒ ÔÙÒØ ÖÓ ÓÔ Óº × Ô٠׸ ÒÙ ×ØÖ ÙÐØ Ñ Ð ×
 Ù×ÕÙ × Ö Ð Þ Ð × Ù ÒØ ÓÖÑ
Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ
      template <class Equal>
 Node * search_node(void * ptr);
Р٠и Ù× Ò Ó Ð Ö Ø Ö Ó Ù Ð bool Equal::operator() (Node * curr,              void *
ptr)¸ Ù× ÙÒ ÒÓ Ó ÓÒ Ö Ø Ö ×Ø × ×Ô ¬     × Ò Ð ÔÙÒØ ÓÖ ptrº
Iterador de nodos
        Ó ÙÒ List Graph<Node, Arc>     Ý ÙÒ Ñ Ò Ö Ö ÓÖÖ Ö ØÓ Ó× ×Ù× ÒÓ Ó׺ È Ö
 ÐÐÓ¸ List Graph<Node, Arc> ÜÔÓÖØ    Ð × Ù ÒØ ×Ù Ð ×
ÁØ Ö ÓÖ ×   List Graph<Node, Arc>      ≡                 ´ ¼µ
 class Node_Iterator : public Dlink::Iterator
 {
   inline Node_Iterator() { /* empty */ }
   inline Node_Iterator(List_Graph & _g);
   inline Node_Iterator(const Node_Iterator & it);
   inline Node_Iterator & operator = (const Node_Iterator & it);
   inline Node * get_current_node();
   Node * get_current() { return get_current_node(); }
 };
  ¬Ò ×
 Node Iterator¸ Ù× Ò ÙÒ × ¾ß ¸    ¸ ¼¸    ¸ ¼¼ ¸ ½¼ ¸ ¾¼ ¸ ¿ ¸    ¸      ¾¸     ¸
         ¸    ¸ ¾¸ ¿¸    ¸ ¸ ½ß ¿¸ ¾ ¸ ½ ¸ ¼¾ ¸ ½ ¸ ¾¾¸ ¾¿¸ Ò ¾ º
Í× × List Graph ¼ º
 Ä ÓÔ Ö ÓÒ get current node() Ö ØÓÖÒ Ð ÒÓ Ó ØÙ Ð Ò ÓÒ × Ò Ù ÒØÖ Ð Ø Ö ¹
 ÓÖº ÈÓÖ Ö ÞÓÒ × ÓÑÔ Ø Ð ¸ Ð Ñ ØÓ Ó ØÖ ÓÒ Ð get current() × ×Ó Ö Ö
Ô Ö ÕÙ ÒÚÓÕÙ get current node()º
   Node Iterator Ö ÓÖÖ ØÓ Ó× ÐÓ× ÒÓ Ó× Ð Ö Ó Ò Ô Ò ÒØ Ñ ÒØ          ×Ù× Ö Ð ÓÒ ×
    ÓÒ Ø Ú º ÈÙ ×ØÓ ÕÙ Ö Ú           Dlink::Iterator¸ Ð × ÓÔ Ö ÓÒ ×        ×ÔÐ Þ ¹
Ñ ÒØÓ Ý Ù      ÓÒ ×ÓÒ Ð × Ñ ×Ñ × next()¸ prev() Ý has current()º
     Ð ÓÖ Ò Ú × Ø Node Iterator            ÓÒ× Ö Ö× Ò Ø ÖÑ Ò Óº
   Ä × Ù ÒØ ÙÒ ÓÒ ÑÔÐ ¬ Ð Ö ÓÖÖ Ó ØÓ Ó× ÐÓ× ÒÓ Ó× Ð Ö Ó Ý Ð ÑÔÖ × ÓÒ¸
ÔÖ        ÙÒÓ ÐÐÓ׸ Ð ÒÙÑ ÖÓ Ö Ó×
    template <class GT>
void recorrer(GT & g)
{
7.3. Un TAD para grafos (List Graph<Node, Arc>)                                     575



    for (typename GT::Node_Iterator it(g); it.has_current(); it.next())
      print("%dn", g.get_num_arc(it.get_current_node());
}



Iterador de arcos de un nodo
     Ü ×Ø ÙÒ Ð ×    Ø Ö ÓÖ Ð Ù Ð Ö ÓÖÖ ÐÓ× Ö Ó× Ý ÒØ ×                 ÙÒ ÒÓ Óº ÈÓ× Ð ¹
Ñ ÒØ ר × Ð Ø Ö ÓÖ Ñ × ÔÓÔÙÐ Ö ÑÔÓÖØ ÒØ ¸ ÔÙ × × Ð ×                   Ù ÐÕÙ Ö Ö ÓÖÖ Ó
    ÓÑÔÙØÓ ×Ó Ö ÙÒ Ö Óº ËÙ ×Ô ¬ ÓÒ × ÓÑÓ × Ù
ÁØ Ö ÓÖ × List Graph<Node, Arc>     +≡         ´ ¼µ
    class Node_Arc_Iterator : public Dlink::Iterator
    {
         Å Ñ ÖÓ× ÔÖ Ú Ó×               Ø Ö ÓÖ ÆÓ
         Å Ñ ÖÓ× ÔÙ Ð Ó×              Ø Ö ÓÖ ÆÓ
    };
    ¬Ò ×
    Node Arc Iterator¸   Ù×  Ò ÙÒ × ¸     ¸    ¸ ¼ ¸ ½¾ ¸ ½ ¸ ½ ß½ ¸ ¾¾¸ ¾ ¸ ¾ ¸ ¾ ¸ ¾ ¸
         ¿¼ ¸ ¿ ¸ ¿ ¸         ¸
                              ¸ ¿¸ ¸ ¾ ¸     ¸     ¸ ¾¸    ¸ ¸ ½ß ¿¸ ¼ ¸ ¼ ¸ ½ ¸ ½ ¸
         ¿¿ ¸ ¼¸ ½ ¸      ß ¸ ½ ¸ ½ ¸ Ò ¾¿ º
    Ä × ÓÖÑ ×      Ð Ö Ö ´ ÓÒרÖÙ Öµ ÙÒ Ó ØÓ Node Arc Iterator × ÜÔÖ × Ò Ñ           ÒØ
ÐÓ× × Ù ÒØ × ÓÒרÖÙ ØÓÖ ×
 Å Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ ÆÓ                ≡                ´ µ
    inline Node_Arc_Iterator();
    inline Node_Arc_Iterator(Node * _src_node);
    inline Node_Arc_Iterator(const Node_Arc_Iterator & it);
Í× × Node Arc Iterator            º
ÁÒØ Ö × ÒØ Ó × ÖÚ Ö ÕÙ Ð Ó ØÓ ×Ó Ó ÙÒ Node Arc Iterator × ÙÒ ÒÓ Ó
Ô ÖØ Ò ÒØ ÙÒ Ö Ó Ý ÒÓ Ð Ö Ó Ñ ×ÑÓº
    Node Arc Iterator Ö ÕÙ Ö Ð ÓÔ Ö ÓÖ   × Ò ÓÒ¸ ÑÓ Ó Ø Ð ÕÙ × ÔÙ Ò
 ÓÔ Ö ×Ø Ó× Ø ÑÔÓÖ Ð × Ø Ö ÓÒº È Ö ÐÐÓ Ö ÕÙ Ö ÑÓ× Ð ÓÔ Ö ÓÖ =
 Å Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ ÆÓ            +≡      ´ µ
    inline Node_Arc_Iterator & operator = (const Node_Arc_Iterator & it);
Í× × Node Arc Iterator            º
   ÈÙ ×ØÓ ÕÙ Node Arc Iterator ׸ ÔÓÖ Ö Ú ÓÒ¸ Ð Ø ÔÓ Dlink::Iterator¸ ר
 ÓÒØ Ò ØÓ Ó× ×Ù× Ñ ØÓ Ó× ×Ó Ó× ´next()¸ prev()¸ has current()¸ Ø Ø Ö µº Ð
Ó ØÓ ØÙ Ð Ð Ø Ö ÓÖ ×          Ñ ÒØ
 Å Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ ÆÓ           +≡       ´ µ
      typedef Arc * Item_Type;
      typedef Node * Set_Type;
    inline Arc * get_current_arc();
    Arc * get_current() { return get_current_arc(); }
    inline Node * get_tgt_node();


get current arc() Ö ØÓÖÒ Ð Ö Ó ØÙ Ð ´ Ø ÔÓ Arcµ¸ Ñ ÒØÖ × ÕÙ get tgt node()
Ö ØÓÖÒ Ð ÒÓ Ó ×Ø ÒÓ Ð Ö Ó ØÙ Ð ´ Ð ÒÓ Ó ÓÖ Ò × Ð ÕÙ Ð ×Ó Ö Ð Ù Ð × Ø Ö µº
get tgt node() × ÑÙÝ ÙØ Ð ÔÓÖÕÙ Ò ×Ø  ×Ó × × ×Ø Ò Ù Ð ÒÓ Ó ×Ø ÒÓ × Ö¸
  ÕÙ Ð ÕÙ ×Ø ÓÒ Ø Ó Ð ÜØÖ ÑÓ Ð Ö Ó ØÙ Ð Ð ÒÓ Ó ÓÖ Ò ×Ó Ö Ð Ù Ð × ×Ø
 Ø Ö Ò Óº
576                                                           Cap´
                                                                 ıtulo 7. Grafos



  Ë Ñ Ð Ö Ð Ø Ö ÓÖ ×Ó Ö ÒÓ Ó׸ Ð Ñ ØÓ Ó get current() ר ×Ó Ö Ö          Ó Ô Ö ÕÙ
ÒÚÓÕÙ get current arc()].
  [[Node Arc Iterator × Ð ÔÖ Ò Ô Ð Ñ Ò ×ÑÓ Ô Ö Ñ Ò ÔÙÐ Ö Ö Ó× ÑÔÐ ÒØ Ó×
Ñ ÒØ Ð ×Ø × ÒÐ Þ ×º × ÑÔÓÖØ ÒØ ר Ö ÕÙ ÐÓ× Ö Ó× ÙÒ ÒÓ Ó × Ú × Ø Ò Ò
ÙÒ ÓÖ Ò Ò Ø ÖÑ Ò Ó¸ Р٠и       ÓÒ× Ö Ö× Ð ØÓÖ Ó ÔÓÖ Ù ÐÕÙ Ö ÔÐ ÓÒ ÕÙ
     Ù×Ó Node Arc Iteratorº

7.3.4    Arcos
ÍÒ Ö Ó ÙÒ Ö Ó × ¬Ò Ñ ÒØ Ð Ì                  Graph Arc<Arc Type>   ÓÑÓ × Ù
  ¬Ò ÓÒ   ÖÓ Ö Ó    ≡
     template <typename Arc_Info>
 class Graph_Arc : public Dlink
 {
   typedef Graph_Arc Arc;
   typedef Arc_Info Arc_Type;
     ØÖ ÙØÓ× Graph Arc<Arc Type>     ¾
    Å ØÓ Ó× Graph Arc<Arc Type>
 };
 ¬Ò ×
 Graph Arc¸   Ù×   Ò ÙÒ   º
    Graph Arc<Arc Type> ÑÓ Ð Þ ÙÒ Ö Ó Ô ÖØ Ò ÒØ ÙÒ Ö Ó ÑÔÐ ÒØ Ó Ñ ÒØ
Ð ×Ø ×     Ý Ò º Ð Ù Ð ÕÙ Graph Node<Node Type>¸ Graph Arc<Arc Type> ×
ÙÒ Ð × Ô Ö Ñ ØÖ Þ      ÙÝÓ Ø ÔÓ ×Ó Ó¸ Arc Info¸ ÓÒר ØÙÝ Ð Ò ÓÖÑ ÓÒ Ö Ð ¹
  ÓÒ     Ð ÖÓÝÐ Ù Ð×           Ñ ÒØ
 Å ØÓ Ó× Graph Arc<Arc Type>      ≡                  ´ µ ½
 Arc_Info & get_info() { return arc_info; }
   Ë ×    × ¸ ÔÓÖ     ÑÔÐÓ¸ ÙÒ Ö Ó       ÖÖ Ø Ö ×¸ ÒØÓÒ × Ð × Ù ÒØ Ð Ò
Arc<Carretera> * arco;

      Ð Ö ÙÒ ÔÙÒØ ÓÖ ÙÒ Ö Ó ÕÙ Ù× ÓÑÓ ØÖ ÙØÓ ÙÒ Ø ÔÓ Carreteraº
   ÍÒ Ö Ó ÓÒ Ø Ó× ÒÓ Ó× ÐÐ Ñ Ó× ÓÖ Ò Ý ×Ø ÒÓ ÕÙ ÔÙ Ò            Ö×              Ð
× Ù ÒØ Ñ Ò Ö
 Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ
 inline Node * get_src_node(Arc * arc);
 inline Node * get_tgt_node(Arc * arc);
 × ÑÓÑ ÒØÓ     Ð Ö Ö Ó× Ó× × Ò Ö Ð ÓÒ ÐÓ× Ñ ØÓ Ó× ×Ó Ö ÙÒ Ö Ó
  ½º Ò Ð ×Ó ÙÒ Ö Ó¸ רÓ× Ñ ØÓ Ó× ÒÓ Ò × Ö Ñ ÒØ Ø Ò Ò × ÒØ Ó × ÙÒ Ð
       Ö ÓÒ Ð Ö Ó × ÑÔÐ Ñ ÒØ ÓÒ ÓÖÑ Ò ÙÒ Ñ Ò Ö          ÓÒÓ Ö ÐÓ× ÒÓ Ó× ÕÙ
      ר ÓÒ Ø º Ò Ð ×Ó ÙÒ Ö Ó¸ ÔÓÖ ×ÙÔÙ ×ØÓ¸ get src node() Ö ØÓÖÒ Ð
     ÒÓ Ó Ý ÒØ Ý get tgt node() Ð Ò ÒØ º
  ¾º Ñ × ÔÖ Ñ Ø Ú ×¸ × ÓÑÓ Ð Ñ ÝÓÖ        Ð×        ×Ó ÙÒ Ö Ó¸ ×ÓÒ Ô ÖØ
     Ð Ð × List Graph<Node, Arc> Ý ÒÓ Ð Ð × Graph Arc<Arc Type>º רÓ
      ÑÔÐ ÕÙ         ÓÒÓ Ö× Ð Ö Ó Ô Ö ÔÓ Ö ÒÚÓ Ö ÙÒÓ ×ØÓ× Ñ ØÓ Ó׺
7.3. Un TAD para grafos (List Graph<Node, Arc>)                              577



   Ð Ó ÕÙ × Ø Ò × ÒØ Ó × ÓÒÓ Ö Ù Ð × Ð ÒÓ Ó ÕÙ ÓÒ Ø ÙÒ Ö Ó             Ó ÙÒ ÒÓ Ó
ÓÖ Òº È Ö ×ØÓ¸ × ÔÖÓÚ Ð × Ù ÒØ ÔÖ Ñ Ø Ú
 Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ
 inline Node * get_connected_node(Arc * arc, Node * node);
Ä Ù Ð × ÑÔÖ Ö ØÓÖÒ Ð ÒÓ Ó ÓÒ Ø Ó node¸ ÔÓÖ Ð Ö Ó arc Ò Ô Ò ÒØ Ñ ÒØ
ÕÙ × ÙÒ Ö Ó Ó Ö Óº
    Ç × ÓÒ ÐÑ ÒØ ¸ ÔÙ × Ö Ò × Ö Ó Ò Ö × ÙÒ ÒÓ Ó ×Ø Ó ÒÓ Ö Ð ÓÒ Ó ÓÒ ÓØÖÓ
  ØÖ Ú × ÙÒ Ö Óº È Ö ÐÐÓ¸ × ÔÖÓÔÓÖ ÓÒ Ð ÔÖ Ñ Ø Ú × Ù ÒØ
 Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ
 inline bool node_belong_to_arc(Arc * arc, Node * node) const;
Ä Ù Ð Ö ØÓÖÒ    true   ×   node   ר ÓÒ Ø Ó Ð Ö Ó arcº
7.3.4.1   Inserci´n de arcos
                 o

È Ö ¬Ò Ö ÙÒ      Ö Ó Ò ÙÒ Ö Ó        Ò    Ö× ¬Ò Ó Ò× ÖØ Ó Ò Ð Ö Ó ×Ù× Ó×
ÒÓ Ó× Ñ ÒØ      Ð × ÔÖ Ñ Ø Ú × ÓÖÖ ×ÔÓÒ ÒØ × ¬Ò × Ò Ü º¿º¿º½ ´Ô Ò ¾µº ÓÒ
Ð × Ö ÓÒ ×        ÐÓ× ÒÓ Ó׸ ÔÙ ÒÚÓ Ö× Ð × Ù ÒØ ÔÖ Ñ Ø Ú
 Å Ñ ÖÓ× ÔÙ Ð   Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ
 inline virtual Arc * insert_arc(Node * src_node, Node * tgt_node,
                                 const typename Arc::Arc_Type & arc_info);
src node Ý tgt node ×ÓÒ ÐÓ×
                          ÒÓ Ó× ÕÙ Ö Ð ÓÒ Ð Ö Óº Ë × ØÖ Ø ÙÒ Ö Ó¸ ÒØÓÒ ×
 Ð ÓÖ Ò ÒØÖ ÐÓ× ÒÓ Ó× ÒÓ Ø Ò ÑÔÓÖØ Ò º Ë ¸ ÔÓÖ Ð ÓÒØÖ Ö Ó¸ × ØÖ Ø ÙÒ Ö Ó¸
 ÒØÓÒ × src node × Ð ÒÓ Ó Ý ÒØ Ý tgt node Ð Ò ÒØ º arc info × Ð Ú ÐÓÖ
 ØÖ ÙØÓ Ð Ö Ó ÓÒ ÕÙ × × Ö ÖÐÓº
    insert arc() Ô ÖØ Ð Ñ ÑÓÖ Ö ÕÙ Ö      Ô Ö Ð Ö Ó¸ ÓÒרÖÙÝ Ð Ö Ó Ô Ö ÐÓ×
Ú ÐÓÖ × ×Ô ¬ Ó× ÔÓÖ ÐÓ× Ô Ö Ñ ØÖÓ׸ ÐÓ Ò× ÖØ Ò Ð Ö Ó Ý Ö ØÓÖÒ Ð Ö ÓÒ
Ñ ÑÓÖ Ð ÒÙ ÚÓ Ö Óº Ë ÒÓ Ý ×Ù¬ ÒØ Ñ ÑÓÖ ¸ × Ò Ö Ð Ü Ô ÓÒ bad allocº
7.3.4.2   Eliminaci´n de arcos
                   o

È Ö Ð Ñ Ò Ö ÙÒ Ö Ó¸ ×ÓÐÓ × Ö ÕÙ Ö ÓÒÓ Ö ×Ù Ö ÓÒ Ý ÒØÓÒ × Ú Ð Ö×         Ð Ñ ØÓ Ó
× Ù ÒØ
 Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ
 inline virtual void remove_arc(Arc * arc);
 Ð Ù Ð Ð Ñ Ò Ð Ö Ó Ð Ö Ó arc Ý Ð Ö Ð Ñ ÑÓÖ º
     Ð Ñ ØÓ Ó ÒÓ Ö Ð Þ Ò Ò ÙÒ Ú Ö ¬ ÓÒ        ÓÖÖ Ø ØÙ ÔÓÖ ÑÔÐÓ¸ Ð Ð Ñ Ò ÓÒ
   ÙÒ Ö Ó ÕÙ ÒÓ Ü ×Ø Ò Ð Ö Óº
    ÄÓ× Ñ ØÓ Ó× ÕÙ ÐØ Ö Ò Ð ØÓÔÓÐÓ ¸ ÒØ Ò × ¸ insert node()¸ remove node()¸
insert arc() Ý remove arc() ×ÓÒ Ú ÖØÙ Ð ×º ×ØÓ × × Ð Ô Ö ×Ù Ö Ù×Ó ÙÒ ÓÒ Ð ÔÓÖ
Ô ÖØ      ÜØ Ò× ÓÒ × Ó ×Ô Ð Þ ÓÒ × Ö Ú ×º
     Ð ÙÒÓ× Ð ÓÖ ØÑÓ× ×Ó Ö Ö Ó× Ö ÕÙ Ö Ò Ð Ñ Ò Ö ÓÒ ÙÒØÓ×     Ö Ó׸ Ö Ð Þ Ö ÙÒ
  Ð ÙÐÓ Ô Ö Ð Ý ÐÙ Ó Ö ×Ø ÙÖ ÖÐÓ׺ Ò ×Ø × × ØÙ ÓÒ × × × Ð ÕÙ Ð Ð Ñ ¹
Ò ÓÒ        Ö Ó × ØÓÔÓÐÓ ¸ ÓÒ Ö Ø Ö Ø ÑÔÓÖ Ð¸ Ý ÒÓ ÓÑÔÐ Ø ÓÑÓ × ÔÐ ÒØ
 ÓÒ remove arc()º È Ö ÐÐÓ¸ × ÔÖÓÚ Ð × Ù ÒØ ÔÖ Ñ Ø Ú
 Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ
 inline virtual void desconnect_arc(Arc * arc);
578                                                               Cap´
                                                                     ıtulo 7. Grafos



   ÍÒ Ö Ó × ÓÒ Ø Ó Ñ            ÒØ   desconnect arc() ÔÙ    ÓÒ Ø Ö×     ÒÙ ÚÓ ØÖ Ú ×
Å Ñ ÖÓ× ÔÙ Ð Ó×     List Graph<Node, Arc> ½ +≡             ´ ¼µ
 inline virtual Arc * connect_arc(Arc * arc);


7.3.4.3     Acceso a los arcos de un grafo

ÍÒ Ñ Ò Ö ÔÖ Ñ Ò     Ó Ø Ò Ö ÙÒ Ö Ó Ù ÐÕÙ Ö ÙÒ Ö Ó Ð ÓÒ ÓÖÑ Ð Ñ ØÓ Ó
Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ
 inline Arc * get_first_arc();
Ð Ù Ð Ö ØÓÖÒ ÙÒ Ö Ó Ù ÐÕÙ Ö Ð Ö Óº ÆÓ      Ò   Ö× ×ÙÔÓ× ÓÒ × Ö                   ÙÐ
Ö Ó × Ö Ö ØÓÖÒ Óº Ë Ò Ñ Ö Ó¸ ÐÓ× Ö Ó× ÒØÖÓ Ð Ö Ó ÔÙ Ò ÓÖ Ò Ö× Ñ                 ÒØ
Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ
 template <class Compare> inline void sort_arcs();
sort arcs<Compare>()     ÓÖ Ò ÐÓ× Ö Ó× × ÙÒ Ð Ö Ø Ö Ó         ÓÑÔ Ö ÓÒ
                                                                    Compare¸ Ð
 Ù Ð ÒÚÓ Ð ÓÔ Ö ÓÖ       bool Compare::operator () (Arc * a1, Arc * 2)º  Ð ÔÖÓ¹
 Ö Ñ ÓÖ × Ö ×ÔÓÒ× Ð    ÑÔÐ ÒØ Ö Ð ×Ó Ð ØÖ ÙØÓ Ð Ö Ó ÔÓÖ Ð Ù Ð × ÓÑÔ Ö
Ý Ð ÓÑÔ Ö ÓÒ Ñ ×Ñ º Ð ÓÖ Ò Ñ ÒØÓ × Ö Ð Þ Ò O(n Ð (n)) ÓÒ ÓÒ×ÙÑÓ
 ×Ô Ó O(1)º
     Ð ÒÙÑ ÖÓ Ö Ó× ÙÒ Ö Ó ÔÙ        ÓÒÓ Ö× Ñ ÒØ
 Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ
 inline const size_t & get_num_arcs() const;
 Ð ÒÙÑ ÖÓ Ö Ó× ÕÙ Ø Ò ÙÒ ÒÓ Ó Ñ ÒØ
Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½            +≡      ´ ¼µ
 inline const size_t & get_num_arcs(Node * node) const;


B´squeda de arcos
 u
   È Ö ÐÓ× Ö Ó× Ü ×Ø Ò Ù ØÖÓ Ø ÔÓ× Ù×ÕÙ ¸ ÐÓ× Ù Ð × × ÒÙÒ Ò ÓÒØ ÒÙ ÓÒ
  ½º Ù×ÕÙ ÔÓÖ ØÖ ÙØÓ Arc::Arc Type Ó Arc Info Ò ×Ø ×Ó ÔÓ ÑÓ× Ù× Ö
     Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ
                template <class Equal>
          Arc * search_arc(const Arc_Type & arc_info);
          Arc * search_arc(const Arc_Type & arc_info);

     Ä ÔÖ Ñ Ö Ú Ö× ÓÒ Ù× Ð Ö Ø Ö Ó     ÓÑÔ Ö ÓÒ Equal¸ ÐÓ ÕÙ Ô ÖÑ Ø × ÖÒ Ö
      Ð ÙÒ Ô ÖØ ÐÓ× ØÖ ÙØÓ× Ò Ð Ù×ÕÙ º Ä × ÙÒ Ú Ö× ÓÒ ÒÚÓ Ö Ø Ñ ÒØ
      Ð ÓÔ Ö ÓÖ bool Node Type::operator == (const Node Type & info)º
  ¾º ÈÖÙ       Ô ÖØ Ò Ò Ö Ð Þ ÔÓÖ
      Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ
          bool arc_belong_to_graph(Arc * arc);
   Ê ÓÖ ÑÓ× ÕÙ ×ÓÒ × ÒÓÒ ÑÓ׺
7.3. Un TAD para grafos (List Graph<Node, Arc>)                                      579



    Ë Ö ØÓÖÒ true × ÙÒ Ö Ó ÓÒ Ö ÓÒ arc Ô ÖØ Ò Ð Ö Ó false ÐÓ ÓÒØÖ Ö Óº
  ¿º Ü ×Ø Ò     ÙÒ Ö Ó ÒØÖ Ó× ÒÓ Ó× Ô Ö ÐÐÓ × Ù× Ð × Ù ÒØ ÙÒ ÓÒ
      ÙÒ ÓÒ × List Graph<Node, Arc>    ≡
             template <class GT, class SA>
         typename GT::Arc * search_arc(GT & g, typename GT::Node * src_node,
                                       typename GT::Node * tgt_node);

      Ð Ù Ð Ö ØÓÖÒ Ð Ö ÓÒ ÙÒ Ö Ó Ò ×Ó                   Ü ×Ø Ö Ð ÙÒÓ ÒØÖ ÐÓ× ÒÓ Ó×
    src node Ý tgt nodeº
           ÖÒ       ×Ù× ÖÙØ Ò × ÔÖ   ×ÓÖ ×¸ ÕÙ ×ÓÒ Ñ ØÓ Ó× List Graph<Node, Arc>¸
     ר Ú Ö× ÓÒ × ÙÒ ÙÒ ÓÒ ÜØ ÖÒ Ð Ð × º ×ØÓ Ô ÖÑ Ø ×Ô Ð Þ Ö Ú Ö× ÓÒ ×
    Ô ÖØ ÙÐ Ö × search arc() ÕÙ × ÖÒ Ò ÐÓ× Ö Ó× × ÙÒ Ð ÙÒ Ö Ø Ö Óº
    Ä ÔÖ Ñ Ø Ú ÙÒ ÓÒ Ô Ö Ö Ó׺
      Ò ×Ó ØÖ Ø Ö× ÙÒ ÑÙÐØ Ö Ó ´Ó ÑÙÐØ Ö Óµ Ý                  Ö Ñ × ÙÒ Ö Ó ÒØÖ
    ÐÓ× ÒÓ Ó× ÒÚÓÐÙ Ö Ó׸ × Ö ØÓÖÒ Ù ÐÕÙ Ö ÒØÖ ÐÓ× Ö ÙÒ ÒØ × × Ò ÓÒ× Ö ÓÒ
         Ð ÙÒ Ö Ø Ö Ó ×Ô ¬ Óº
   º Ù×ÕÙ       ×Ô Ð Þ          ר × Ð ×Ó Ù Ò Ó Ò Ð Ù×ÕÙ × × ×Ø Ò Ù Ö
     Ð ÙÒ ØÓ ÕÙ ÒÓ × Ô ÖØ ÐÓ× ØÖ ÙØÓ× Ð Ö Ó ´Arc Typeµº
     Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ                     ¾
             template <class Equal>
         Arc * search_arc(void * ptr);

     Ä ÖÙØ Ò Ö ØÓÖÒ Ð        Ö      ÓÒÐ Ö Ó ÕÙ × Ø ×            ÙÐ             ÔÓÖ bool
     Equal::operator () (Arc * arc, void *ptr)¸   Ó NULL        Ò ×Ó        ÕÙ × Ý Ò
     Ö ÓÖÖ Ó ØÓ Ó× ÐÓ× Ö Ó× × Ò × Ø × Ö Ð Ö Ø Ö Ó    ÙÐ           º
   ÌÓ × Ð × Ù×ÕÙ × ×ÓÒ O(E) Ô Ö Ð Ô ÓÖ ×Ó ´ Ù×ÕÙ                ÐÐ µº
Iterador sobre los arcos de un grafo
   ÄÓ× Ö Ó×      ÙÒ Ö Ó ÔÙ Ò Ó × ÖÚ Ö× Ñ         ÒØ Ð × Ù ÒØ Ø Ö ÓÖ
ÁØ Ö ÓÖ ×   List Graph<Node, Arc>      +≡                ´ ¼µ
 class Arc_Iterator : public Dlink::Iterator
 {
   inline Arc_Iterator() { /* empty */ }
   inline Arc_Iterator(List_Graph & _g);
   inline Arc_Iterator(const Arc_Iterator & it);
   inline Arc_Iterator & operator = (const Arc_Iterator & it);
   inline Arc * get_current_arc();
   Arc * get_current() { return get_current_arc(); }
 };
  ¬Ò ×
 Arc Iterator¸ Ù× Ò ÙÒ × ¾ß ¸          ¸ ¼ ¸   ß ¼¼¸ ½¼ ¸   ¸    ¸      ¸    ¸ ¿½¸ ¿ ¸
       ½ ¸ ½ ¸ ¼¿ ¸ ½ ¸ ¾¾¸ ¾ ¸ Ò    ¿¾ º
Í× × List Graph ¼ º
580                                                         Cap´
                                                                   ıtulo 7. Grafos



     Ð Ù Ð ÕÙ ÓÒ ÐÓ× Ø Ö ÓÖ × ×Ø Ø ÜØÓ¸ Arc Iterator ÓÒØ Ò Ð × ÙÒ ÓÒ × Ø Ô        ×
    next()¸ prev() Ý has current() ´ÔÓÖ Ö Ú ÓÒ Dlink::Iteratorµº Ä Ó Ø Ò         ÓÒ
      Ð Ö Ó Ú × Ø ØÙ Ð × Ö Ð Þ Ñ ÒØ get current arc()º
       Ë ÐÓ× Ö Ó× ÒÓ Ò × Ó ÓÖ Ò Ó׸ ÒØÓÒ × Ð ÓÖ Ò Ú × Ø × Ò Ø ÖÑ Ò Ó              ÐÓ
    ÓÒØÖ Ö Ó¸ Ð Ø Ö ÓÖ Ú × Ø Ö ÐÓ× Ö Ó× × ÙÒ Ð ÓÖ Ò ×Ø Ð Ó Ò Ð ÙÐØ Ñ ÒÚÓ         ÓÒ
     sort arcs()º

    7.3.5     Atributos de control de nodos y arcos
     Ò ÑÙ Ó× ×Ó׸ ÐÓ× Ð ÓÖ ØÑÓ× ×Ó Ö Ö Ó× Ö ÕÙ Ö Ò Ñ ÒØ Ò Ö ÙÒ ×Ø Ó     Ð ÙÐÓ Ò
    ×Ù× ÒÓ Ó× Ý Ö Ó׺ ÉÙ Þ Ð ×Ó Ñ × ÓÑÙÒ × Ñ Ö Ö Ó Ô ÒØ Ö ÓÑÓ Ú × Ø Ó ÙÒ
    ÒÓ Ó Ó ÙÒ Ö Óº
         Ò ×Ø × ÒÓ ÓÒØ ÑÔÐ ÑÓ× ØÖ × Ñ Ò Ö × ÐÐ Ú Ö ×Ø Ó¸ Ø ÒØÓ Ò ÐÓ× ÒÓ Ó× ÓÑÓ
     Ò ÐÓ× Ö Ó× Ø×       ÓÒØÖÓи ÓÒØ ÓÖ × Ý ÓÓ × º        Ð×     ר Ó × Ù Ö
      Ö Ø Ñ ÒØ Ò Ð ÒÓ Ó Ó Ò Ð Ö Óº
    7.3.5.1    Bits de control

           ØÓ×     Ô ÒØ Ö ÒÓ Ó× Ý Ö Ó× ×ÓÐÓ × Ö ÕÙ Ö     ÙÒ Øº ÈÓ Ö ÑÓ× Ñ ÒØ Ò Ö ÙÒ
      Ø ÔÓÖ      ÒÓ Ó Ý Ö Ó Ò ÙÒ Ú ÐÓÖ ÖÓ Ý¸ Ð ÔÖÓ × ÖÐÓ × ÙÒ Ð ÒØ Ö × Ð Ð ÓÖ ØÑÓ¸
    Ô ÒØ ÖÐÓ ÓÒ ÙÒÓº Ð ÔÖÓ Ð Ñ          ר Ø Ò × ÕÙ ÐÓ× Ð ÓÖ ØÑÓ× ÕÙ Ù× Ò Ð Ø
      Ú Ò Ò ÒÓ¹Ö ÒØÖ ÒØ ׺ ÈÓÖ ÑÔÐÓ¸ ÙÒ ÔÖÙ            ÓÒ Ø Ú      ÔÙ Ò×Ô ÓÒ Ö ÐÓ×
    ÒÓ Ó× ØÖ Ú × ÐÓ× Ö Ó× Ý Ô ÒØ ÖÐÓ× Ñ           ÕÙ ÐÓ× Ú × Ø º Ð Ö Ó × Ö ÓÒ ÜÓ × ×
    Ú × Ø Ò ØÓ Ó× ÐÓ× ÒÓ Ó× × Ö¸ × Ð ¬Ò Ð Ð Ø Ö ÓÒ ØÓ Ó× ÐÓ× ÒÓ Ó× ×Ø Ò Ô ÒØ Ó׺
       ÓÖ Ò¸ ÓØÖÓ Ð ÓÖ ØÑÓ ÕÙ ÒÚÓÕÙ ÔÖÙ × ÓÒ Ø Ú                  ÒÓ ÔÙ Ù× Ö Ð Ñ ×ÑÓ
      Ø Ù× Ó ÔÓÖ Ð ÔÖÙ          ÓÒ Ø Ú      Ô Ö Ô ÒØ Ö ×Ù× ÒÓ Ó׸ ÔÙ × ÓÑÔÖÓÑ Ø Ö Ð
     ÓÒ× ×Ø Ò       Ð Ø ×Ø ÓÒ Ø Ú º
        È Ö ØÖ Ø Ö ÓÒ Ð × ØÙ ÓÒ ÒØ Ö ÓÖ Ù× Ö ÑÓ× Ú Ö Ó× Ø× Ð × ¬ Ó× × ÙÒ Ð Ð ÓÖ ØÑÓ
    ÕÙ ÐÓ× ÙØ Ð º רÓ× × ×Ô ¬ Ò ÓÑÓ × Ù
¼       ¬Ò ÓÒ          Ø× ÓÒØÖÓÐ ¼ ≡
       ÆÙÑ ÖÓ         Ø ½
     class Bit_Fields
     {
       unsigned int depth_first     :   1;
       unsigned int breadth_first   :   1;
       unsigned int test_cycle      :   1;
       unsigned int is_acyclique    :   1;
       unsigned int test_path       :   1;
       unsigned int find_path       :   1;
       unsigned int kruskal         :   1;
       unsigned int prim            :   1;
       unsigned int dijkstra        :   1;
       unsigned int euler           :   1;
       unsigned int maximum_flow    :   1;
       unsigned int spanning_tree   :   1;
       unsigned int build_subtree   :   1;
       unsigned int convert_tree    :   1;
       unsigned int cut             :   1;
       unsigned int min             :   1;
7.3. Un TAD para grafos (List Graph<Node, Arc>)                                                  581



       Bit_Fields()
         : depth_first(0), breadth_first(0), test_cycle(0), find_path(0),
           kruskal(0), prim(0), dijkstra(0), euler(0), maximum_flow(0),
           spanning_tree(0), build_subtree(0), convert_tree(0), cut(0), min(0)
       { /* empty */ }
          Å ØÓ Ó× Ø× ÓÒØÖÓÐ ½
     };
     ¬Ò ×
     Bit Fields¸   Ù×    Ò ÙÒ     ¾º
    Bit Fields      × ÙÒ ØÖ ÙØÓ ÕÙ Ñ Ò            ÓÑÓ Ñ Ò ÑÓ 16 Ø× ר Ò Ó× ÐÐ Ú Ö ×Ø Ó
     Úר º
        Ù ÐÕÙ Ö Ø ÓÒØÖÓÐ ÔÙ                ÓÒ×ÙÐØ Ö× Ñ     ÒØ
½   Å ØÓ Ó× Ø× ÓÒØÖÓÐ ½ ≡                                             ´ ¼µ      ½
     bool get_bit(const int & bit) const
     {
       switch (bit)
         {
         case Aleph::Depth_First: return depth_first;
         // ...
         }
     }
        × ÓÑÓ Ø Ñ Ò¸ Ú ÒØÙ ÐÑ ÒØ ¸ ÔÙ               ÑÓ ¬ Ö×      ØÖ Ú ×
½   Å ØÓ Ó× Ø× ÓÒØÖÓÐ ½ +≡                                            ´ ¼µ          ½
     void set_bit(const int & bit, const int & value)
       {
         switch (bit)
           {
           case Aleph::Depth_First: depth_first     = value; break;
             // ...
          }
       }
        ÄÓ× Ø×      ÓÒØÖÓÐ ×Ø Ò ÒÙÑ Ö Ó× Ñ                Ñ ÒØ    × ÙÒ ×Ù ¬Ò ÔÖ Ø Ò Ó ÔÓÖ
    ÓØÖÓ× Ð ÓÖ ØÑÓ×
½    ÆÙÑ ÖÓ      Ø ½ ≡                                                       ´ ¼µ
     enum Graph_Bits
     {
       Depth_First,
       Breadth_First,
       Test_Cycle,
       Is_Acyclique,
       Test_Path,
       Find_Path,
       Kruskal,
       Prim,
       Dijkstra,
       Euler,
       Maximum_Flow,
       Spanning_Tree,
          ÒÐ   Ö        ÔÖÓ Ö Ñ ÓÒ¸ ÙÒ ÒÙÑ ÖÓ Ñ    Ó × ÙÒÓ ÕÙ × ÒÓÑ Ö Ó ÓÒ ÙÒ           ÒØ ¬   ÓÖº
582                                                                          Cap´
                                                                                    ıtulo 7. Grafos



        Build_Subtree,
        Convert_Tree,
        Cut,
        Min,
      };
       ÈÓÖ     ÑÔÐÓ¸ Ð Ð ÓÖ ØÑÓ      ÔÖÙ             ÐÓ ÒÚÓ Ö
     control_bits.set_bit(Test_Cycle, 1);

          ØÓ× Ô ÒØ Ö ÙÒ Ú × Ø º
          ÒÓ Ó Ý Ö Ó ÙÒ Ö Ó ÓÒØ Ò                   Ø×    ÓÒØÖÓÐ ×Ô ¬                Ó× ÓÑÓ × Ù
¾   Å Ñ ÖÓ× Graph Node<Node Type> ¾                +≡           ´ ½µ         ¾           ¿
      Bit_Fields control_bits;
    Í× × Bit Fields ¼º
¾     ØÖ ÙØÓ× Graph Arc<Arc Type>            ¾ ≡                       ´         µ       ¿
      Bit_Fields control_bits;
    Í× × Bit Fields ¼º
      Ò ÙÒ ÒÓ Ó ÐÓ× Ø× ÓÒØÖÓÐ ÔÙ Ò        Ö× Ñ                   ÒØ
¾   Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡                    ´ ¼µ                        ¾
      inline Bit_Fields & get_control_bits(Node * node);
    Í× × Bit Fields ¼º
    Ì Ñ Ò ÔÙ Ò ÓÐÓ Ö× ØÓ Ó× ÐÓ× Ø× Ò ÖÓ Ñ ÒØ
¾   Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡                    ´ ¼µ               ¾        ¾
      inline void reset_bit(Node * node, const int & bit);
    Ç × Ò Ö× ÙÒ Ø Ò Ô ÖØ ÙÐ Ö ØÖ Ú ×
¾   Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc>                ½ +≡     ´ ¼µ               ¾        ¾
      inline void set_bit(Node * node, const int & bit, const int & value);
      Ò ÐÓ Ñ ÒØ ¸ Ü ×Ø Ò Ð × Ñ ×Ñ × ÓÔ Ö ÓÒ × Ô Ö ÙÒ Ö Ó
¾   Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ                                 ¾        ¾
      inline Bit_Fields & get_control_bits(Arc * arc);
      inline void reset_bit(Arc * arc, const int & bit);
      inline void set_bit(Arc * arc, const int & bit, const int & value);
    Í× × Bit Fields ¼º
     Ë ÔÙ Ò Ö Ò Ö ÐÓ× Ø× ÓÒØÖÓÐ ØÓ Ó× ÐÓ× ÒÓ Ó× Ó Ö Ó×                                   ÙÒ Ö Ó Ñ      ÒØ
¾   Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ                                 ¾       ¿
      void reset_bit_nodes(const int & bit)
      {
        for (Node_Iterator itor(*this); itor.has_current(); itor.next())
          reset_bit(itor.get_current_node(), bit);
      }
      void reset_bit_arcs(const int & bit)
      {
        for (Arc_Iterator itor(*this); itor.has_current(); itor.next())
          reset_bit(itor.get_current_arc(), bit);
      }
    Í× × Arc Iterator    Ò   Node Iterator     º
       ÄÓ× Ù Ð × ÓÐÓ Ò Ò ÖÓ¸ × Ô Ö ÐÓ× ÒÓ Ó× Ó Ö Ó׸ Ð                     ع × ÑÓ           bit    ÓÒØÖÓк
7.3. Un TAD para grafos (List Graph<Node, Arc>)                                       583



    7.3.5.2   Contadores

    Ð × ÙÒ Ó Ò Ú Ð Ò Ñ Ò Ó ×Ø Ó Ô Ö ÙÒ ÒÓ Ó Ó Ö Ó × ÙÒ ÓÒØ ÓÖ ÒØ ÖÓº ÈÓÖ ÐÓ
     Ò Ö Ð¸ ר × Ù× Ô Ö Ø ÖÑ Ò Ö Ð ÒØ       Ú × Ø × Ó Ô Ö Ñ Ö Ö ÓÐÓÖ × º ËÙ
     ¬Ò ÓÒ Ô Ö ÙÒ ÒÓ Ó × ÓÑÓ × Ù
¿   Å Ñ ÖÓ× Graph Node<Node Type> ¾ +≡           ´ ½µ     ¾
      long counter;
    Ý Ô Ö ÙÒ Ö Ó
¿     ØÖ ÙØÓ× Graph Arc<Arc Type>           ¾ +≡          ´    µ     ¾
      long counter;
      Ð ÓÒØ ÓÖ ÔÙ               Ö× Ó Ö Ò Ö× ´ ÓÐÓ Ö× Ò ÖÓµ Ô Ö ÐÓ× ÒÓ Ó×
¿   Å Ñ ÖÓ× ÔÙ Ð Ó×      List Graph<Node, Arc>     ½ +≡       ´ ¼µ       ¾     ¿
      inline long & get_counter(Node * node);
      inline void reset_counter(Node * node);
    Ó Ô Ö ÐÓ× Ö Ó×
¿    Å Ñ ÖÓ× ÔÙ Ð Ó×     List Graph<Node, Arc>     ½ +≡       ´ ¼µ       ¿     ¿
      inline long & get_counter(Arc * arc);
      inline void reset_counter(Arc * arc);
      Á Ù ÐÑ ÒØ ÔÓ ÑÓ× Ö Ò Ö ÐÓ× ÓÒØ ÓÖ × ´ ÓÐÓ ÖÐÓ× Ò ÖÓµ                   ØÓ Ó× ÐÓ× ÒÓ Ó× Ó
    Ö Ó×
¿   Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ                     ¿
      void reset_counter_nodes()
      {
        for (Node_Iterator itor(*this); itor.has_current(); itor.next())
          reset_counter(itor.get_current_node());
      }
      void reset_counter_arcs()
      {
        for (Arc_Iterator itor(*this); itor.has_current(); itor.next())
          reset_counter(itor.get_current_arc());
      }
    Í× × Arc Iterator   Ò   Node Iterator     º

    7.3.5.3   Cookies

      Ü ×Ø Ò ÑÙ Ó× Ð ÓÖ ØÑÓ× ÕÙ Ö ÕÙ Ö Ò ×Ó Ö ×Ø Ó           Ð ÙÐÓ ÙÒ Ñ Ò Ö ÑÙÝ
    Ô ÖØ ÙÐ Ö Ð Ø ÔÓ Ð ÓÖ ØÑÓ Ý Ô Ö ÐÓ× Ù Ð × ÐÓ× Ø× ÓÒØÖÓÐ Ý ÓÒØ ÓÖ × ÒÓ ×ÓÒ ×Ù¹
    ¬ ÒØ ׺ Ä Ù×ÕÙ          Ð Ñ ÒÓ Ñ × ÓÖØÓ × ÙÒ ×ØÖ ¸ ÔÓÖ ÑÔÐÓ¸ Ò × Ø Ù Ö Ö
        ÖØ Ò ÓÖÑ ÓÒ Ø ÑÔÓÖ Ð Ò ÐÓ× Ö Ó׺ Ä ÓÖÑ Ý Ù×Ó         ר ר Ó × Ô ÖØ ÙÐ Ö Ð
     Ð ÓÖ ØÑÓ        ×ØÖ Ý ÔÓ× Ð Ñ ÒØ ÒÓ × ÖÚ Ô Ö ÓØÖÓ× Ð ÓÖ ØÑÓ׺
         Ê ÕÙ Ö ÑÓ׸ ÒØÓÒ ×¸ ÙÒ ÓÖÑ Ñ × ÑÔÐ           ×Ó Ö ×Ø Ó Ò Ö Óº ÈÙ ×ØÓ ÕÙ
     Ò ÑÙ × Ó × ÓÒ × Ð ×Ø Ó × Ø ÑÔÓÖ Ð × Ö¸ ×ÓÐÓ × Ö ÕÙ Ö ÙÖ ÒØ Ð            Ù ÓÒ
       Ð Ð ÓÖ ØÑÓ¸ ÒÓ × ÓÒÚ Ò ÒØ Ô Ö Ñ ØÖ Þ ÖÐÓ Ò ÙÒ ÔÐ ÒØ ÐÐ ÕÙ × Ð Ô × Ð ÒÓ Ó Ó
     Ö Ó Ù Ò Ó ×ØÓ× × Òר Ò Òº
         ÍÒ ÓÖÑ Ò Ö ¸ Ô ÖÓ Ð          ¸ Ô Ö ×Ó Ö Ò Ö Ñ ÒØ ØÓ× ÐÓ× ÒÓ Ó× ×
      ØÖ Ú × ÙÒ “cookie”º Ð Ø ÖÑ ÒÓ ÓÓ ÔÖÓÚ Ò             Ð ÔÖÓ Ö Ñ ÓÒ × ×Ø Ñ ×
584                                                                           Cap´
                                                                                 ıtulo 7. Grafos



Ý ÓÒÒÓØ ÙÒ Ô Ö Ñ ØÖÓ ÓÔ Ó ÕÙ × Ð ØÖ ×Ñ Ø ÙÒ ÙÒ ÓÒº Ò ÒÙ ×ØÖÓ ×Ó¸ ÙÒ
 ÓÓ × ÙÒ ÔÙÒØ ÖÓ ÓÔ Ó ÕÙ × Ð ×Ó          ÙÒ ÒÓ Ó Ó ÙÒ Ö Óº
    × Ô٠׸ ÐÓ× ÒÓ Ó× Ý ÐÓ× Ö Ó× ÔÓ× Ò ÙÒ ØÖ ÙØÓ cookie¸ ÙÝ ×Ô ¬ ÓÒ × Ð
× Ù ÒØ
 Å Ñ ÖÓ× Graph Node<Node Type> ¾ +≡               ´ ½µ    ¿  ¾
  void *       cookie;

  ØÖ ÙØÓ×      Graph Arc<Arc Type>           ¾ +≡            ´     µ      ¿        ½
  void *        cookie;

 ÄÓ× ÓÓ × ÔÙ Ò         Ö× Ñ ÒØ Ð × × Ù ÒØ × ÔÖ Ñ Ø Ú ×
Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ                               ¿
  inline void *& get_cookie(Node * node);
  inline void *& get_cookie(Arc * arc);
get cookie()Ö ØÓÖÒ ÙÒ Ö Ö Ò ÓÒ ÔÖ Ú Ð Ó× ÓÑÔÐ ØÓ׺
 ÄÓ× ÓÓ × ØÓ Ó× ÐÓ× ÒÓ Ó× Ó Ö Ó× ÔÙ Ò Ö Ò Ö× Ñ ÒØ
Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ
  void reset_cookie_nodes()
  {
    for (Node_Iterator itor(*this); itor.has_current(); itor.next())
      itor.get_current_node().cookie = NULL;
  }
  void reset_cookie_arcs()
  {
    for (Arc_Iterator itor(*this); itor.has_current(); itor.next())
      itor.get_current_arc().cookie = NULL;
  }
Í× × Arc Iterator        Ò   Node Iterator      º
  ËÙÔÓÒ ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ ÕÙ Ò × Ø ÑÓ× Ù Ö Ö Ò         ÒÓ Ó ÙÒ Ð ×Ø Ò Ñ
  Ú ÐÓÖ × Ö Ð ×º Ë Ø Ò ÑÓ× ÙÒ ÔÙÒØ ÓÖ ÙÒ ÒÓ Ó¸ ÒÓÑ Ò Ó node¸ ÒØÓÒ × ÙÒ
ÓÖÑ         ÖÐÓ × ÓÑÓ × Ù
 node->get_cookie() = new DynDlist<float>;

      Ù Ò Ó Ð Ù×Ù Ö Ó Ö ÕÙ Ö                 Ö Ð Ð ×Ø ¸ ÔÙ        ÖÐÓ Ñ        ÒØ ÙÒ ×Ø Ò
           static_cast<DynDlist<float>*>(node->get_cookie()) ...


   ÈÓÖ ×ÙÔÙ ×ØÓ¸ ÒÓ ÓÐÚ Ö×     ÒØÖ Ö Ñ ÑÓÖ                       Ð × ×Ø Ñ Ù Ò Ó ×Ø Ý ÒÓ ×
Ö ÕÙ Ö º Ì Ð ÓÒ × Ö Ð Þ ÓÑÓ × Ù
delete static_cast<DynDlist<float>*>(node->get_cookie())

    Ë Ð Ù×Ù Ö Ó Ö ÕÙ Ö ÙÒ ×Ø Ó ×ØÖÙ ØÙÖ Ó¸ ÒØÓÒ × ×Ø ÙØ Ð Þ ÙÒ ×ØÖÙ ØÙÖ
struct Ó class × ÙÒ ×   Ð ×Óº
      Ú × × Ò × Ö Ó Ù Ö Ö Ð ÙÒ Ò ÓÖÑ ÓÒ ×Ó             Ð Ö Ó¸ ÒÓ ÐÓ× ÒÓ Ó×
Ó Ö Ó× ÔÓÖ ÑÔÐÓ¸ Ð ÙÒ ÒÓ Ó Ó Ö Ó ÒØ Ò Ð      Ú ÐÓÖ Ø ÑÔÓÖ Ðº È Ö ×ØÓ× ×Ó׸
  ×ÔÓÒ ÑÓ× ÙÒ ÓÓ Ò Ð Ö Ó
 Å Ñ ÖÓ× ÔÖ Ú Ó× List Graph<Node, Arc>     ≡         ´ ¼µ
  void * cookie;
7.3. Un TAD para grafos (List Graph<Node, Arc>)                                    585



Å Ñ ÖÓ× ÔÙ Ð Ó×     List Graph<Node, Arc>     ½ +≡      ´ ¼µ
 void *& get_cookie() { return cookie; }


Mapeo entre nodos y arcos
  ÍÒ Ù×Ó ÑÔÓÖØ ÒØ Ð cookie       × ÑÔÐ ÒØ Ö   Ð Ñ Ô Ó ÒØÖ Ö Ó×        ÓÑÓÑÓÖ Ó× Ó ×Ó¹
ÑÓÖ Ó׺ Ò ÖØÓ× Ð ÓÖ ØÑÓ׸ Ò Ð Ó ÙÖÖ Ò           Ð Ð ÙÐÓ Ð Ö ÓÐ         Ö ÓÖ¸ ×
  Ð ÙÐ Ö ÙÒ Ö Ó     ÓÒ Ð ÓÖÖ ×ÔÓÒ ÒØ Ð Ö      ÓÐ Ö ÓÖº È Ö           ÒØ ¬ Ö ÒØÖÓ Ð
 Ö ÓÐ Ö ÓÖ Ù Ð × ×Ù ÒÓ Ó Ò Ð Ö Ó ÓÖ            Ò Ð¸ Ð cookie ÐÑ       Ò Ð Ñ Ò Ð
ÒÓ Ó ÒØÖÓ Ð Ö ÓÐ Ý Ú Ú Ö× º         ר Ø ÔÓ       Ð ÓÖ ØÑÓ× Ð × ÔÙ     × Ö ÑÙÝ ÙØ Ð Ð ×
× Ù ÒØ × ÔÖ Ñ Ø Ú ×
 Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc>        ½ +≡      ´ ¼µ
 static void map_nodes(Node * p, Node * q);
 static void map_arcs(Arc * p, Arc * q);
map nodes() Ñ Ô ÒØÖ × ÐÓ× ÒÓ Ó× p Ý q¸ Ö ×Ô Ø Ú Ñ ÒØ º Ë Ý Ü ×Ø ÙÒ Ñ Ô Ó
ÔÖ Ú Ó Ó × × p->get cookie() ÓÒØ Ò ÙÒ Ö ÓÒ¸ ÒØÓÒ × map nodes() Ö Ð Þ
ÙÒ Ñ Ô Ó ÓÑÔÙ ×ØÓº ÈÓÖ ÑÔÐÓ¸ ×ÙÔÓÒ ÑÓ× ÕÙ p Ý q ר Ò Ñ Ô Ó× ÒØÖ × Ý ÕÙ
Ö Ð Þ ÑÓ× Ð × Ù ÒØ ÐÐ Ñ
          map_nodes(q, t);

      ÒØÓÒ ×¸ Ð Ñ Ô Ó Ö ×ÙÐØ ÒØ × ÔÙ ÒØ ÖÔÖ Ø Ö ÓÑÓ p ←→ q ←→ t ←→ pº
      Ð Ñ Ô Ó ÒØÖ Ö Ó× Ö Ð Þ Ó Ñ ÒØ map arcs() Ø Ò × Ñ ÒØ × Ñ Ð Ö Ð ÐÓ×
ÒÓ Ó׺
    Ä × ÔÖ Ñ Ø Ú × Ñ Ô Ó Ô ÖÑ Ø Ò Ñ ÒØ Ò Ö       Ò × Ñ Ô Ó× Ý ÓÒר ØÙÝ Ò ÙÒ
ÑÒÖ         × ÑÔÐ ¬ Ö ÑÙ Ó× Ð ÓÖ ØÑÓ׺ Ä × ØÙ ÓÒ Ñ × ÓÑÙÒ Ø Ò Ð × Ð × ×
 Ð ÓÖ ØÑÓ× ÕÙ ÑÓ ¬ Ò Ð Ö Ó Ô Ö          ØÙ Ö ×Ù× Ð ÙÐÓ× ÐÓ ÕÙ     ÖÖ Ô Ö       Ð
 Ö Ó ÓÖ Ò Ðº È Ö Ú Ø Ö ×Ó¸ Ö Ð Þ ÑÓ× ÙÒ ÓÔ ÓÒ Ñ Ô Ó Ý ÓÔ Ö ÑÓ× ×Ó Ö Ð
 ÓÔ º ÄÓ× ÓÓ × Ð Ö Ó ÓÔ Ñ ÒØ Ò Ò Ð Ñ Ò Ð Ö Ó ÓÖ Ò Ðº ÈÓÖ ×ÙÔÙ ×ØÓ¸
 ×ØÓ Ø Ñ Ò Ö ÕÙ Ö ÕÙ × Ñ Ô Ò ÐÓ× Ö Ó× ÐÓ ÕÙ × Ö Ð Þ            Ñ Ò Ö × Ñ Ð Ö ÐÓ×
ÒÓ Ó׺
      Ð Ù×Ó ÐÓ× ÓÓ ×¸ ÙÒÕÙ ×Ø ÒØ ­ Ü Ð ¸ × ÑÙÝ Ð Ó ÔÓÖÕÙ ÒÓ ×Ø Ò
×ÓÑ Ø Ó× Ð × ×Ø Ñ      Ø ÔÓ× Ð ÓÑÔ Ð ÓÖº ÈÓÖ × Ö ÞÓÒ¸ × ÐØ Ñ ÒØ Ö ÓÑ Ò Ð
 × ÙÖ Ö× ÕÙ ÐÓ× ÓÓ × ×             Ò Ñ ÒØ ÙÒ ÓÒ × ÕÙ          ØÙ Ò Ð ÓÒÚ Ö× ÓÒ
Ø ÔÓº
7.3.5.4    Reinicio de nodos y arcos

ÌÓ Ó× ÐÓ× ØÖ ÙØÓ×      ÓÒØÖÓÐ ÙÒ ÒÓ Ó Ó ÙÒ Ö Ó¸ ×          Ö¸ ÐÓ× Ø×¸ Ð ÓÒØ ÓÖ Ý Ð
 ÓÓ ¸ ÔÙ Ò Ö Ò        Ö× ÓÑÔÐ Ø Ñ ÒØ Ñ ÒØ
 Å Ñ ÖÓ× ÔÙ Ð Ó×    List Graph<Node, Arc>     ½ +≡      ´ ¼µ
 inline void reset_node(Node * node);
 inline void reset_arc(Arc * arc);
   Ì Ñ Ò ÔÙ Ò Ö Ò Ö× ØÓ Ó× ÐÓ× ØÖ ÙØÓ×      ÓÒØÖÓÐ ØÓ Ó× ÐÓ× ÒÓ Ó× Ó
 Ö Ó× Ð Ö Óº Ò ×Ø × ÒØ Ó ÔÓ ÑÓ× ÐÙ×ØÖ Ö ÙÒ Ù×Ó ÓÒ Ö ØÓ      Ð× Ð××
Operate On Nodes()() Ý Operate On Arcs()()º
586                                                                Cap´
                                                                      ıtulo 7. Grafos



   × Ñ ÒØ ¸ ÐÓ ÕÙ × ÑÓ× × Ö ÓÖÖ Ö     ÒÓ Ó ÒÚÓ Ö reset() Ô Ö ØÖ ¹
ÙØÓ ÓÒØÖÓк ר Ø Ú      × ÔÙ ×Ô ¬ Ö Ñ ÒØ Ð × Ù ÒØ Ð × ÓÔ Ö ÓÒ
Å Ñ ÖÓ× ÔÖ Ú Ó× List Graph<Node, Arc>  +≡    ´ ¼µ
  struct Reset_Node
  {
    void operator () (List_Graph&, Node * node) const
    {
      node->control_bits.reset();
      node->counter = 0;
      node->cookie = NULL;
    }
  };
Í× × List Graph ¼ º
  ÓÖ × ÑÔÐ Ñ ÒØ         × Ö ÑÓ× Ð Ö Ò ÓÒ         ÐÓ× ÒÓ Ó× Ñ           ÒØ ÒÚÓ   ÓÒ
operate on nodes()      ÓÒ Reset Node ÓÑÓ ÓÔ Ö ÓÒ
Å Ñ ÖÓ× ÔÙ Ð Ó×      List Graph<Node, Arc> ½ +≡        ´ ¼µ
  void reset_nodes() { Operate_On_Nodes <Graph_Class, Reset_Node> () (*this); }
     Ò ÐÓ Ñ ÒØ ¸ Ð Ñ ×Ñ Ø Ò × ÔÐ Ô Ö Ö Ò Ö ÐÓ× Ö Ó׺
     × Ø Ô Ó¸ ÒØ × Ö Ð Þ Ö ÙÒ Ð ÙÐÓ ÕÙ ÒÚÓÐÙ Ö ÐÓ× ØÖ ÙØÓ×         ÓÒØÖÓи Ø ÒØÓ
   ÒÓ Ó× ÓÑÓ        Ö Ó׸ ÒÚÓ Ö reset nodes() Ý reset arcs() Ô Ö Ð ÑÔ ÖÐÓ×
Ú ÐÓÖ × ÙØ Ð Þ Ó× ÔÓÖ Ð ÙÐÓ× ÔÖ Ú Ó׺

7.3.6    Macros de acceso a nodos y arcos
      ØÓ×       ÐØ Ö Ð Ð Ð      Ó Ó¸ ÙÒÕÙ Ò ØÖ Ñ ÒØÓ Ð         ÒÓר Ó
× ÒØ Ø Ó Ð ÓÑÔ Ð ÓÖ¸ Ð ÑÔÐ ÒØ ÓÒ List Graph<Node, Arc> Ý Ð ÙÒÓ× Ð ÓÖ Ø¹
ÑÓ× Ù× Ò ÐÓ× × Ù ÒØ × Ñ ÖÓ×
 Å ÖÓ× Ô Ö Ö Ó×       ≡
  #   define   NODE_BITS(p)              ((p)->control_bits)
  #   define   NODE_COUNTER(p)           ((p)->counter)
  #   define   IS_NODE_VISITED(p, bit)   (NODE_BITS(p).get_bit(bit))
  #   define   NODE_COOKIE(p)            ((p)->cookie)
  #   define   ARC_COUNTER(p)            ((p)->counter)
  #   define   ARC_BITS(p)               ((p)->control_bits)
  #   define   IS_ARC_VISITED(p, bit)    (ARC_BITS(p).get_bit(bit))
  #   define   ARC_COOKIE(p)             ((p)->cookie)


7.3.7    Construcci´n y destrucci´n de List Graph<Node, Arc>
                   o             o
 × Ñ ÒØ ¸ ÙÒ Ö Ó ÔÙ     ÓÒרÖÙ Ö× ÔÓÖ ÓÑ × ÓÒ Ó ÔÓÖ ÓÔ × ÓØÖÓ Ö Ó
Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ
  inline List_Graph();
  inline List_Graph(const List_Graph & g);
Í× × List Graph ¼ º
 Ð ÔÖ Ñ Ö ÓÒרÖÙ ØÓÖ Ö ÙÒ Ö Ó Ú Ó ´× Ò ÒÓ Ó× Ý Ö Ó×µ Ð × ÙÒ Ó Ö Ð Þ ÙÒ ÓÔ
    Ö Ó gº
7.3. Un TAD para grafos (List Graph<Node, Arc>)                                587



  × ÔÓ× Ð × Ò ÖÐ ÙÒ Ö Ó ÓØÖÓ Ö Ó
Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc>       ½ +≡      ´ ¼µ
  inline List_Graph& operator = (List_Graph & g);
Í× × List Graph ¼ º
Ò ×Ø ×Ó¸ Ð Ö Ó ×Ø ÒÓ × ×ØÖÙÝ ÓÑÔÐ Ø Ñ ÒØ Ý × ÓÔ                   Ð Ù ÒØ gº
   Ð ×ØÖÙ ØÓÖ
Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ
  inline virtual ~List_Graph();
Í× × List Graph ¼ º
Ð Ñ Ò Ð Ö Ó ØÓ Ó× ÐÓ× ÒÓ Ó× Ý Ö Ó× ÕÙ ×Ø ÓÒØ Ò º ÌÓ Ð Ñ ÑÓÖ × Ð Ö º
   Ë ÔÙ    ÓÒרÖÙ Ö ÙÒ Ö Ó Ô ÖØ Ö ÙÒ Ö Ó¸ × ÓÑÓ Ø Ñ Ò × Ò ÖÐ ÙÒ
Ö Ó ÙÒ Ö Óº Ò × ×Ó¸ ÐÓ× Ö Ó× Ö Ó× ×ÓÒ ×Ùר ØÙ Ó× ÔÓÖ Ö Ó× Ö ÓÒ Ð ×
Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡         ´ ¼µ
  inline List_Graph(List_Digraph<Node, Arc> & g);
  inline List_Graph & operator = (List_Digraph<Node, Arc> & g);
Í× × List Digraph ½ Ò   List Graph   ¼º
   Ò Ó × ÓÒ × ÒÓ Ø Ò Ü Ô ÓÒ Ð ×¸ × Ö ÕÙ Ö ¸ Ñ × Ð ÓÔ Ð Ö Ó¸ ÙÒ Ñ Ô Ó
×ÓÑÓÖ Ó ÒØÖ Ð × ÓÔ ×º Ò ×Ø × ØÙ ÓÒ ×Ô Ð ÔÙ Ù× Ö× Ð × Ù ÒØ ÙÒ ÓÒ
 ÙÒ ÓÒ × List Graph<Node, Arc>       +≡
      template <class GT>
  void copy_graph(GT & gtgt, GT & gsrc, const bool & cookie_map = false);
 Р٠и Ò ×Ó ÕÙ Ð Ô Ö Ñ ØÖÓ cookie map ×              ÖØÓ¸ Ö Ð Þ ÙÒ Ñ Ô Ó Ý Ø ÚÓ
 ÒØÖ ÐÓ× Ó× Ö Ó× ØÖ Ú × ÐÓ× ÓÓ × ×Ù× ÒÓ Ó× Ý Ö Ó׺ Ð ¬Ò Ð Ð ÓÔ ¸ Ð
ÔÙÒØ ÖÓ cookie            ÒÓ Ó ÓÒØ Ò Ö Ð Ñ Ò Ò Ð Ö Ó ÓÔ Ù Ð × ÔÐ Ô Ö
ÐÓ× Ö Ó׺
     ÆÓØ × ÕÙ Ð ÓÔ Ñ Ô              × ÙÒ ÙÒ ÓÒ ÜØ ÖÒ Ð Ð × × Ö¸ ÒÓ × ÙÒ
Ñ ØÓ Ó List Graph<Node, Arc>º Ä Ö ÞÓÒ × ÕÙ × ÑÔÓ× Ð ÓÒÓ Ö Ð Ø ÔÓ ¬Ò Ð
    ÐÓ× ÒÓ Ó× Ý Ö Ó× ÙÒ Ð × ×            Ò List Graph<Node, Arc>º Ð      ÖÐ ÜØ ÖÒ
   Ð Ð × ¸ × ×Ø Ò ÔÓ× ÓÒ            ÓÒÓ Ö ÐÓ× Ø ÔÓ× Ò Ù ×Ø ÓÒ Ý Ö Ð Þ Ö Ð × ÓÔ ×
      ٠׺ ÓÒ× Ù ÒØ Ñ ÒØ ¸ ÒÓ × Ö ÓÑ Ò Ð ÕÙ Ð ÓÔ                 Ö Ó× ×Ù Ý Þ Ò Ð
 ÓÒרÖÙ ØÓÖ ÓÔ Ó Ð ÓÔ Ö ÓÖ × Ò ÓÒº
     Ä ÓÔ Ñ Ô           × ÑÙÝ ÙØ Ð Ô Ö Ð Ö Ð Þ ÓÒ ÑÙ Ó× Ð ÓÖ ØÑÓ׺ ÈÓÖ ÑÔÐÓ¸
Ô Ö Ð ÙÐ Ö Ð ÓÑÔÐ Ñ ÒØÓ ÙÒ Ö Ó¸ ÔÓ ÑÓ׸ Ò ÔÖ Ñ Ö ÐÙ Ö¸ ÓÔ Ö Ð Ö Ó¸
ÐÙ Ó Ò× ÖØ ÑÓ× ×Ó Ö Ð ÓÔ ÐÓ× Ö Ó× Ò × Ö Ó× Ô Ö ÚÓÐÚ ÖÐÓ ÓÑÔÐ Ø Ñ ÒØ ÓÒ ÜÓ
ݸ ¬Ò ÐÑ ÒØ ¸ Ð Ñ Ò ÑÓ× Ð ÓÔ ÕÙ ÐÐÓ× Ö Ó× ÕÙ Ý Ò × Ó Ñ Ô Ó׺
     ÆÓ ØÓ × Ð × Ú × × ÓÒÚ Ò ÒØ Ñ Ô Ö Ð × ÓÔ × Ñ ÒØ ÐÓ× ÓÓ ×º Ä Ò Ö Ð ¹
         Ð ×Ó Ð Ö ÔÖ × ÒØ ØÓ × ØÙ ÓÒ Ò Ð Ù Ð Ð Ö Ó ÓÔ Ö Ý ÓÒØ Ò             ØÓ× Ò
ÐÓ× ÓÓ ×º ר × Ð Ö ÞÓÒ ÔÓÖ Ð Ù Ð Ð Ñ Ô Ó ÒØÖ ÐÓ× ÓÓ × × ÓÔ ÓÒ Ð Ð ÓÔ º
       × ÔÓ× Ð ÓÖÖ Ö ÜÔÐ Ø Ñ ÒØ ÙÒ Ö Ó × Ö¸ Ð Ñ Ò Ö ØÓ Ó× ×Ù× ÒÓ Ó× ´Ý
 Ö Ó×µº È Ö ÐÐÓ × Ù× Ð × Ù ÒØ Ñ ØÓ Ó
   ÙÒ ÓÒ × List Graph<Node, Arc>           +≡
      template <class GT>
  inline void clear_graph(GT & g);
 ר ÔÖ Ñ Ø Ú × ÑÙÝ Ú Ð Ó× Ù Ò Ó × Ù× Ò Ö Ó× Ø ÑÔÓÖ Ð × ÓÖÖ ×ÔÓÒ ÒØ ×          Ð ÙÐÓ×
ÒØ ÖÑ Ó׺
588                                                                  Cap´
                                                                        ıtulo 7. Grafos



7.3.8    Operaciones gen´ricas sobre nodos
                        e
 Ò Ó × ÓÒ × × Ö ÕÙ Ö Ö Ð Þ Ö ÙÒ ÓÔ Ö ÓÒ ×Ô ¬ ×Ó Ö ØÓ Ó× ÐÓ× ÒÓ Ó× ÔÓÖ Ñ¹
ÔÐÓ¸ ÓÐÓ Ö Ð ÙÒ Ú ÐÓÖ Ò Ð             ØÖ ÙØÓº È Ö Ø Ð × ØÓ× × ÔÖÓÚ Ò Ð × × Ù ÒØ ×
ÖÙØ Ò ×¸ Ð × Ù Ð ×¸ ÔÓÖ ×Ù × Ò ÐÐ Þ¸ × ÑÔÐ ÒØ Ò Ö Ø Ñ ÒØ
  ÙÒ ÓÒ × List Graph<Node, Arc>             +≡
      template <class GT, class Operation, class SN = Default_Show_Node<GT> >
  class Operate_On_Nodes
  {
    void operator () (GT & g) const
    {
      for (Node_Iterator<GT, SN> it(g); it.has_current(); it.next())
        Operation () (g, it.get_current_node());
    }
   void operator () (GT & g, void * ptr) const
    {
      for (Node_Iterator<GT, SN> itor(g); itor.has_current(); itor.next())
        Operation () (g, itor.get_current_node(), ptr);
    }
  };
Í× × Node Iterator   º
 ÓÑÓ × Ú ¸ × Ò × Ð × × Ö ÓÖÖ Ò                   ÒÓ Ó Ð Ö Ó g Ø ÔÓ Ò Ö Ó GT Ý ØÙ Ò
Ð ÓÔ Ö ÓÒ Operation () () ×Ó Ö                      ÒÓ Óº Ä × ÙÒ Ú Ö× ÓÒ Ô ÖÑ Ø Ô × Ö
Ô Ö Ñ ØÖÓ× ØÖ Ú × Ð ÔÙÒØ ÖÓ ptrº

7.3.9    Operaciones gen´ricas sobre arcos
                        e
 Ð Ù Ð ÕÙ Ô Ö ÐÓ× ÒÓ Ó׸ × ÔÓ× Ð  ØÙ Ö ÓÔ Ö ÓÒ × Ò Ö × ×Ó Ö ØÓ Ó× ÐÓ× ÒÓ Ó×
  Ð Ö Óº È Ö ÐÐÓ¸ × ÔÖÓÚ ¸ ÔÓÖ ÑÔÐÓ Ð × Ù ÒØ ÓÔ Ö ÓÒ
  ÙÒ ÓÒ × List Graph<Node, Arc>     +≡
      template <class GT, class Operation, class SA = Default_Show_Arc<GT> >
  class Operate_On_Arcs
  {
    void operator () (GT & g) const
    {
      for (Arc_Iterator<GT, SA> it(g); it.has_current(); it.next())
        Operation () (g, it.get_current_arc());
    }
    void operator () (GT & g, typename GT::Node * node) const
    {
      for (Node_Arc_Iterator<GT, SA> it(node); it.has_current(); it.next())
        Operation () (g, it.get_current_arc());
    }
  };
Í× × Arc Iterator        Ò   Node Arc Iterator      º
   Ä × Ñ ÒØ × × Ñ Ð Ö Ð                ÐÓ× ÒÓ Ó× ´Ú Ö Ü º¿º ´Ô Ò   µµº
   Ä × ÙÒ ÓÔ Ö ÓÒ ×ÓÐÓ ×               Ö ÙÒ× Ö      ÐÓ× Ö Ó× Ý ÒØ × ÙÒ ÒÓ Óº
7.3. Un TAD para grafos (List Graph<Node, Arc>)                                     589



7.3.10     Implantaci´n de List Graph<Node, Arc>
                     o
List Graph<Node, Arc> Ñ        Ò       Ó× Ð ×Ø × Ö ÙÐ Ö × Ó Ð Ñ ÒØ ÒÐ Þ × ÙÒ Ð ×Ø
×Ù× ÒÓ Ó× Ý ÓØÖ       ×Ù× Ö Ó׺         Ð ×Ø ×Ó ÙÒ ÓÒØ ÓÖ ×Ù× Ð Ñ ÒØÓ×
 Å Ñ ÖÓ× ÔÖ Ú Ó×         List Graph<Node, Arc>      +≡     ´ ¼µ
  Dlink    node_list;   // lista de nodos
  size_t   num_nodes;   // cantidad de nodos
  Dlink    arc_list;    // lista de arcos
  size_t   num_arcs;    // cantidad de arcos
   num nodes  Ý num arcs ÓÒØ Ð Þ Ò Ð × ÒØ         × ØÓØ Ð × ÒÓ Ó× Ý Ö Ó× Ð Ö Óº
  רÓ× ØÖ ÙØÓ× × ØÙ Ð Þ Ò Ò Ð ÔÖ Ñ Ø Ú × Ò× Ö ÓÒ Ý Ð Ñ Ò ÓÒº
    node list Ý arc list ×ÓÒ Ð ×          Ö ×¸     Ø ÔÓ Dlink¸     Ð × Ð ×Ø ×    ÒÓ¹
  Ó× Ý Ö Ó׸ Ö ×Ô Ø Ú Ñ ÒØ ¸ ÕÙ ÓÒØ Ò Ð Ö Óº Ê ÓÖ ÑÓ× ÕÙ Ð × Ð × ×
Graph Node<Node Type> Ý Graph Arc<Arc Type> Ö Ú Ò            Dlinkº Ä       × Dlink¸
Ô٠׸ ÓÒ ÓÖÑ Ò         Ð × ¸ Ð ÒÐ      Ó Ð Ð Ð ×Ø × node list Ý arc listº
      ÓÑÓ node list Ý arc list ×ÓÒ¸ ÔÓÖ Ö Ú ÓÒ¸             Ø ÔÓ Dlink¸ ÔÐ ÒØ ÑÓ×
Ð × × Ù ÒØ × ÙÒ ÓÒ ×          ÓÒÚ Ö× ÓÒ      Dlink     Graph Node<Node Type> Ý
Graph Arc<Arc Type>
Å Ñ ÖÓ× ÔÖ Ú Ó×      List Graph<Node, Arc>      +≡     ´ ¼µ
  static Node * dlink_to_node(Dlink * p) { return static_cast<Node*>(p); }
  static Arc * dlink_to_arc(Dlink * p) { return static_cast<Arc*>(p); }


7.3.10.1    Acceso a nodos y arcos

 ÓÒ ×Ø × ÓÒÚ Ö× ÓÒ × Ý ÔÓ ÑÓ× Ó ¬ Ö Ð Ð Ñ ÒØ ÐÓ× Ñ ØÓ Ó× × Ó×                        ×Ó
 ÒÓ Ó× Ý Ö Ó×
Å Ñ ÖÓ× ÔÖ Ú Ó× List Graph<Node, Arc>   +≡   ´ ¼µ         ¾
ÁÑÔÐ ÒØ ÓÒ List Graph<Node, Arc>     ≡                  ¼
     template <typename Node, typename Arc>
  Node * List_Graph<Node, Arc>::get_first_node()
  {
    return dlink_to_node(node_list.get_next());
  }
     template <typename Node, typename Arc>
  Arc * List_Graph<Node, Arc>::get_first_arc()
  {
    return dlink_to_arc(arc_list.get_next());
  }
Í× × List Graph ¼ º
     Ì ÒØÓ Ð Ù×ÕÙ       ÒÓ Ó× ÓÑÓ Ð  Ö Ó× Ö ÕÙ Ö Ò Ø Ö Ö ×Ó Ö Ð ÓÖÖ ×ÔÓÒ ÒØ
Ð ×Ø ´node list Ó arc list × ÙÒ × Ð ×Óµº ÈÓÖ × Ö ÞÓÒ¸ ÒÓ× ÓÒÚ Ò ÑÔÐ Ñ ÒØ Ö
  רÓ× Ø Ö ÓÖ ×     ØÓ× ÕÙ Ð × Ù×ÕÙ × × Ö Ð Ò Ñ ÒØ ÐÐÓ׺
Iterador de nodos
   Ä Ð × Node Iterador             ×   ÑÔÐ ÒØ    Ö Ø Ñ ÒØ ÔÓÖ     Ö Ú ÓÒ ÔÙ Ð
Dlink::Iteratorº
590                                                           Cap´
                                                                     ıtulo 7. Grafos



    Iterador de arcos
       Ä Ñ ×Ñ ÓÒ× Ö ÓÒ ÕÙ Ô Ö Ð Ø Ö ÓÖ ×Ó Ö ÐÓ× ÒÓ Ó× ÔÐ              ×Ó Ö Ð Ø Ö ÓÖ
    ×Ó Ö ÐÓ× Ö Ó׸ ÔÙ × ×ØÓ× Ø Ñ Ò × ÙÒ Ñ ÒØ Ò Ò Dlinkº
    B´squeda de nodos
     u
         ÄÓ× Ö ÒØ × ×Ø ÐÓ× Ù×ÕÙ          ÒÓ Ó× Ý Ö Ó× × ÒרÖÙÑ ÒØ Ò ØÖ Ú ×     Ð ÙÒÓ×
        ÐÓ× Ó× Ø Ö ÓÖ × ÔÖ × ÒØ Ó× Ò Ð × × ÓÒ × ÔÖ Ú ×º Ä ÑÔÐ Ñ ÒØ ÓÒ          ÙÒ
    Ð × ÔÖ Ñ Ø Ú × ÐÙ×ØÖ Ð ×ÕÙ Ñ Ò Ö Ð
¼    ÁÑÔÐ ÒØ ÓÒ List Graph<Node, Arc>          +≡                   ¼
          template <typename Node, typename Arc>
          template <class Equal>
      Node * List_Graph<Node, Arc>::search_node(const typename Node::Node_Type & node_info)
      {
        for (Node_Iterator itor(*this); itor.has_current(); itor.next())
          {
            Node * current_node = itor.get_current_node();
            if (Equal() (current_node->get_info(), node_info))
              return current_node;
          }
        return NULL;
      }
    Í× × List Graph ¼ Ò   Node Iterator         º
        Ð Ü Ô ÓÒ Ð ×Ô Ð Þ ÓÒ ÔÓÖ ÓÑ × ÓÒ¸                  ÖÙØ Ò × ÙÒ Ñ ÒØ Ò Ð
    Ø Ö ÓÖ ×Ó Ö ÒÓ Ó× Ð Ö Ó Node Iteratorº
    B´squeda de arcos
     u
       Ä Ù×ÕÙ      ÙÒ Ö Ó ÒØÖÓ Ð Ö Ó × Ö Ñ Ò × ÒØ Ð      ÙÒ ÒÓ Ó Ö ÓÖÖ Ö
    Ñ ÒØ Ð Ø Ö ÓÖ Ö Ó× ×Ø × Ø × Ö Ð Ù×ÕÙ Ó       ÖÐÓ× Ö ÓÖÖ Ó ÒØ Ö Ñ ÒØ ¸
     Ò ÙÝÓ ×Ó Ð Ù×ÕÙ    × ÐÐ º Ä ÑÔÐ Ñ ÒØ ÓÒ × ÓÑÓ × Ù
¼   ÁÑÔÐ ÒØ ÓÒ List Graph<Node, Arc>  +≡              ¼   ½
          template <typename Node, typename Arc>
          template <class Equal>
      Arc * List_Graph<Node, Arc>::search_arc(const typename Arc::Arc_Type & arc_info)
      {
        for (Arc_Iterator it(*this); it.has_current(); it.next())
          {
            Arc * current_arc = it.get_current_arc();
            if (Equal () (current_arc->get_info(), arc_info))
              return current_arc;
          }
        return NULL;
      }
    Í× × Arc Iterator     Ò   List Graph   ¼º
      Å × Ð ÒØ ¸ Ù Ò Ó ¬Ò ÑÓ× Ð Ø Ö ÓÖ Ö Ó× ×Ó Ö ÙÒ ÒÓ Ó¸ ÑÔÐ Ñ ÒØ Ö ÑÓ×
    Ð Ù×ÕÙ    ÙÒ Ö Ó ÕÙ ÓÒ Ø Ó× ÒÓ Ó׺
7.3. Un TAD para grafos (List Graph<Node, Arc>)                               591



    7.3.10.2   Arcos

    ÍÒ Ö Ó ÓÒ Ø Ó× ÒÓ Ó× ÐÐ Ñ Ó× ÓÖ Ò Ý ×Ø ÒÓ¸               Ð Ö Ó×   Ð × Ù ÒØ Ñ Ò Ö
½     ØÖ ÙØÓ× Graph Arc<Arc Type> ¾ +≡                   ´     µ        ¿
      void *      src_node; // nodo origen
      void *      tgt_node; // nodo destino
      רÓ× ØÖ ÙØÓ× ×ÓÒ Ø ÔÓ void* ÔÓÖÕÙ × ÙÒ Graph Arc<Arc Type> ÒÓ × ÔÙ
     ÓÒÓ Ö Ð Ø ÔÓ Ü ØÓ Graph Node<Node Type> ר × ÓÒÓ Ö Ù Ò Ó × Ò×¹
    Ø Ò Ð Ö Óº Ä ÑÔÐ ÒØ ÓÒ Ð           ×Ó ×ØÓ× ØÖ ÙØÓ× × Ö Ð Þ × Ð Ð ×
    List Graph<Node, Arc>    Ð × Ù ÒØ Ñ Ò Ö
½    ÁÑÔÐ ÒØ ÓÒ List Graph<Node, Arc>     +≡             ¼   ½
         template <typename Node, typename Arc>
      Node * List_Graph<Node, Arc>::get_src_node(Arc * arc)
      {
        return static_cast<Node*>(arc->src_node);
      }
         template <typename Node, typename Arc>
      Node * List_Graph<Node, Arc>::get_tgt_node(Arc * arc)
      {
        return static_cast<Node*>(arc->tgt_node);
      }
         template <typename Node, typename Arc>
      bool List_Graph<Node, Arc>::node_belong_to_arc(Arc * arc, Node * node) const
      {
        return node == arc->src_node or node == arc->tgt_node;
      }
    Í× × List Graph ¼ º
       È Ö Ð ÑÔÐ ÒØ ÓÒ get connected node() × Ò ÑÓ× ÙÒ ÖÙØ Ò                  ÓÑÓÒ Ñ ¸
    Ô ÖØ Graph Arc<Arc Type>¸ ÕÙ ÒÓ× × ÖÚ ÒØ ÖÑ Ö
½    Å ØÓ Ó× Graph Arc<Arc Type>  +≡              ´ µ
      void * get_connected_node(void * node)
      {
        return src_node == node ? tgt_node : src_node;
      }
     Ñ ÒØ ÐÐ Ö Ð Þ Ö Ð Ñ ØÓ Ó           List Graph<Node, Arc>
½   ÁÑÔÐ ÒØ ÓÒ List Graph<Node,       Arc>     +≡             ½
         template <typename Node, typename Arc>
      Node * List_Graph<Node, Arc>::get_connected_node(Arc * arc, Node * node)
      {
        return static_cast<Node*>(arc->get_connected_node(node));
      }
    Í× × List Graph ¼ º

    Listas de adyacencia
        Ä ÒÓ ÓÒ ØÖ ÓÒ Ð Ð ×Ø       Ý Ò ×Ù          Ö ÕÙ ÙÒ ÒÓ Ó ÓÒØ Ò       ÙÒ Ð ×Ø
    ÒÓ Ó× Ý ÒØ × ÙÒØÓ ÓÒ ÐÓ× ØÖ ÙØÓ× ×Ó Ó×          Ð Ö Óº Ð ÔÖÓ Ð Ñ         ר Ò ÓÕÙ
     × ÕÙ ¸ Ô Ö ÙÒ Ö Ó ´ÒÓ ÙÒ Ö Óµ   ÑÓ× ÙÔÐ         Ö Ü Ø Ñ ÒØ ÕÙ ÐÐ       Ò ÓÖÑ ÓÒº
      ר Ö ÙÒ Ò       ÖÖ Ð ÔÖÓ Ð Ñ ÕÙ ¸ ÔÓÖ        ÑÔÐÓ¸ × × Ö ÕÙ Ö ÑÓ      ¬ Ö Ð Ö Ó¸
592                                                                                  Cap´
                                                                                            ıtulo 7. Grafos



     ÒØÓÒ ×       ÑÓ× ÒØÖ Ö ÔÓÖ ÐÓ× Ó× ÒÓ Ó× ´ Ð ÓÖ Ò Ý ×Ø ÒÓµ Ý Ö Ð Þ Ö Ó× ÑÓ ¬ ¹
      ÓÒ ×º ÈÓÖ × Ö ÞÓÒ¸ Ô Ö Ú Ö Ð ÔÖÓ Ð Ñ            Ó Ö Ò ÒØ Ö ÓÖ Ý ÔÓÖ ¬ Ò
       ¬Ò ÑÓ× Ð Ø ÔÓ Arc Node¸ ÙÝ ×Ô ¬ ÓÒ × ÓÑÓ × Ù
¾       ¬Ò ÓÒ       Ö Ó¹ÆÓ Ó ¾ ≡
      struct Arc_Node : public Dlink
      {
        void * arc;
        Arc_Node() : arc(NULL) { /* empty */ }
        Arc_Node(void * __arc) : arc(__arc) { /* empty */ }
      };
      ¬Ò ×
      Arc Node¸   Ù×   Ò ÙÒ × ¾ß       Ò        ß º
    Arc NodeÖ Ú Dlink¸ ÔÓÖ ÐÓ ÕÙ ×Ø × Ô ÖØ ÙÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ º Ð
     ÑÔÓ arc× ÙÒ ÔÙÒØ ÖÓ ÙÒ Graph Arc<Arc Type> ´Ó Ñ Ð Ö   Ð ÔÓÖ Ö Ú ÓÒµº
      ר ÑÓ Ó¸ Ð Ð ×Ø    Ý Ò       ÙÒ ÒÓ Ó ×   Ð Ö ÓÑÓ × Ù
¾   Å Ñ ÖÓ× Graph Node<Node Type> ¾ +≡               ´ ½µ
      Dlink arc_list;
     ×ØÓ Ø ÖÑ Ò     ÓÒ ÓÖÑ Ö Ð ×ØÖÙ ØÙÖ  ØÓ×                           ÙÒ ÒÓ Ó Ó Ú ÖØ           Ö Ó¸ Ð Ù Ð
    × Ö ÔÖ × ÒØ Ô ØÓÖ Ñ ÒØ Ð ÑÓ Ó × Ù ÒØ
                                             Dlink arc_list (lista de arcos del nodo)

                                  counter     num_arcs
                                              counter
                          Dlink               control_bits Node_Info
                          Enlace              cookie
                          del nodo en la lista de nodos del grafo



    Å ÒØÖ × ÕÙ Ð ×ØÖÙ ØÙÖ               ÙÒ    Arc Node      ×      ×Ö          Ô ØÓÖ Ñ ÒØ        Ð × Ù ÒØ
    ÓÖÑ
                             Dlink                               Puntero hacia el arco
                             enlace        void*
                             del Arc_Node
                             en la lista arc_list de un nodo




            ר Ñ Ò Ö ¸ × × ÐØ Ö ÙÒ Ö Ó¸ Ð ÑÓ ¬ ÓÒ × Ö Ð Þ ×Ó Ö ÙÒ ×ÓÐ Òר Ò
       Ø ÔÓ Graph Arc<Arc Type> Ý Ð ×Ø Ó Ð Ö Ó × Ñ ÒØ Ò Ó Ö ÒØ Ô Ö ÐÓ× Ó×
    ÒÓ Ó× ÓÒ Ø Ó׺
       Ä Ð ×Ø        Ý Ò        ÙÒ ÒÓ Ó × Ø ÔÓ Dlink¸ Ô ÖÓ ×Ù× ÒÓ Ó× ×ÓÒ Ø ÔÓ
    Arc Nodeº      ÑÓ׸ Ô٠׸ ×ÔÓÒ Ö Ð ÓÒÚ Ö× ÓÒ
¾    Å Ñ ÖÓ× ÔÖ Ú Ó× List Graph<Node, Arc>      +≡    ´ ¼µ          ¿
          static Arc_Node * dlink_to_arc_node(Dlink * p)
      { return static_cast<Arc_Node*>(p); }
    Í× × Arc Node ¾ º
         Ò Ö ×ÙÑ Ò¸ Ñ Ò ÑÓ× ØÖ × Ø ÔÓ×                 Ð ×Ø × Ö ÙÐ Ö × Ó Ð Ñ ÒØ ÒÐ Þ × Ð Ð ×Ø
       ØÓ Ó× ÐÓ× ÒÓ Ó× Ð Ö Ó¸ Ð Ð ×Ø ØÓ                Ó× ÐÓ× Ö Ó× Ð Ö Ó Ý Ð Ð ×Ø ÔÓÖ ÒÓ Ó ×Ù×
     Ö Ó׺ Ì Ð × Ð ×Ø × ×ÓÒ     × Ñ ÒØ                  Ð Ð × Dlinkº ÈÓÖ × Ö ÞÓÒ¸ ÔÐ ÒØ ÑÓ× Ð ×
    × Ù ÒØ × ÙÒ ÓÒ × ÓÒÚ Ö× ÓÒ
        Ë Ø Ò ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ ÙÒ ÔÙÒØ ÖÓ                 ÙÒ Ó ØÓ Node¸ ÔÓ ÑÓ×                    Ö Ð ÔÖ Ñ ÖÓ
       ×Ù× Ö Ó× Ò ×Ù Ð ×Ø Arc Node
       Ì Ò × Ù Ó ÓÒ Ð Ñ Ù                   º Ò ×Ø Ö × ÒÓ× Ö Ö ÑÓ× ÐÓ× ÒÓ Ó×                ÙÒ Ð ×Ø ÒÐ Þ    Ý
    ÒÓ ÐÓ× ÙÒ Ö Óº
7.3. Un TAD para grafos (List Graph<Node, Arc>)                                       593



      Arc_Node * p = dlink_to_arc_node(node->arc_list.get_next());

         Ð ÙÐ       ØÖ Ò× ÓÖÑ Ö×     ÙÒ Ó ØÓ       Ø ÔÓ Arc Ñ         ÒØ
      Arc * arc = static_cast<Arc*>(p->arc);

       ÔÙ × p->arc × Ø ÔÓ void*º È Ö Ò ÙÐÞ Ö ÙÒ ÔÓ Ó ×Ø ÓÒÚ Ö× ÓÒ¸ Ð Ò Ô×ÙÐ ÑÓ×
    Ò Ð × Ù ÒØ ÔÖ Ñ Ø Ú
¿   Å Ñ ÖÓ× ÔÖ Ú Ó× List Graph<Node, Arc>       +≡     ´ ¼µ    ¾    ¿
          static Arc * void_to_arc(Arc_Node * arc_node)
      { return static_cast<Arc*>(arc_node->arc); }
    Í× × Arc Node ¾ º
          ÓÑÔÐ Ø ÑÓ× ÓÖ Ð ÑÓ Ð Þ ÓÒ Ð ×ØÖÙ ØÙÖ                ØÓ× ¬Ò к Ê ÓÖ ÑÓ×
    ÕÙ ÙÒ ÒÓ Ó Ø Ò ÙÒ Ð ×Ø arc list         Ð Ñ ÒØÓ× Ø ÔÓ Arc Node ÒÐ Þ Ó× Ñ ¹
        ÒØ × ÔÙÒØ ÖÓ× Ó Ð × Dlinkº ×Ù Ú Þ¸ ÙÒ Arc Node Ø Ò ÙÒ ÔÙÒØ ÖÓ ÙÒ Ö Ó
    Ø ÔÓ Graph Arc<Arc Type>º ר ÓÒ¬ ÙÖ ÓÒ Ô ÖÑ Ø ÙÒ Ò× Ö ÓÒ O(1) Ð Ú Þ ÕÙ
    ÒÓ × Ö ÙÒ Ð Ö Óº Ë Ò Ñ Ö Ó¸ × Ð × Ó× ×¸ Ð Ð Ñ Ò ÓÒ ÙÒ Ö Ó Ö ÕÙ Ö Ö
    Ö ÓÖÖ Ö Ð Ð ×Ø      Ö Ó× Ð ÒÓ Ó ×Ø ÒÓ Ô Ö Ò ÓÒØÖ Ö ×Ù Arc Node Ý Ð Ñ Ò ÖÐÓº ÈÓÖ
     ר Ö ÞÓÒ¸ ÓÐÓ Ö ÑÓ× Ò Graph Arc<Arc Type> ÙÒ Ó Ð ÔÙÒØ ÖÓ Ð Arc Node¸ ÙÒÓ Ð
       Ð ÒÓ Ó ÓÖ Ò¸ ÓØÖÓ Ð Ð ÒÓ Ó ×Ø ÒÓº Ð Graph Arc<Arc Type> Ø Ò Ö ¸ ÒØÓÒ ×¸ Ð
     ÓÖÑ Ô ØÓÖ × Ù ÒØ
                                                src_arc_node


                                               counter
                             Dlink             control_bits     Arc_Info
                             enlace            cookie
                             en la lista
                             de arcos del        tgt_arc_node
                             grafo


    ÄÓ ÕÙ ÓÒÐÐ Ú Ð × × Ù ÒØ × Ð Ö ÓÒ × Ô Ö ÙÒ Ö Ó
¿     ØÖ ÙØÓ× Graph Arc<Arc Type> ¾ +≡                                 ´   µ    ½
      Arc_Node * src_arc_node; // puntero al Arc_Node del nodo fuente
      Arc_Node * tgt_arc_node; // puntero al Arc_Node del nodo destino
    Í× × Arc Node ¾ º
    Ý ÙÝ ÓÒ¬ ÙÖ ÓÒ ÒÓ× Ô ÖÑ Ø Ö ×ÓÐÚ Ö Ó× ÔÖÓ Ð Ñ ×
       ½º Ð ÑÓÑ ÒØÓ Ð Ñ Ò Ö ÙÒ Ö Ó Ò ÙÒ Ö Ó¸ Ö ÕÙ Ö ÑÓ× Ð Ñ Ò Ö Ð Arc Node Ð ×
          Ð ×Ø × Ð ÒÓ Ó ÓÖ Ò Ý ×Ø ÒÓ Ö ×Ô Ø Ú Ñ ÒØ º ×ØÓ × ÐÓ Ö Ò O(1) Ñ ÒØ Ð
               ×Ó ÐÓ× ÑÔÓ× src arc node Ý tgt arc nodeº
       ¾º Ù Ò Ó × ØÖ Ø ÙÒ Ö Ó¸ Ð ÒÓ Ó ×Ø ÒÓ Ð Ö Ó ÒÓ ÓÒØ Ò ÙÒ Arc Node ÕÙ
            ÔÙÒØ Ð Ö Óº Ð Ñ ×ÑÓ ÑÓ Ó Ð ÑÔÓ tgt arc node × Ñ ÒØ Ò Ò NULLº
        List Digraph<Node, Arc> Ö       ØÓ Ð ÒØ Ö Þ List Graph<Node, Arc> Ý
      × ØÓ ×Ù ÑÔÐ ÒØ ÓÒº Ò Ð ÙÒ × ÓÔ Ö ÓÒ ×¸ Ö ÕÙ Ö Ö ÑÓ× Ø ÖÑ Ò Ö × × ØÖ Ø
    ÙÒ Ö Ó Ó ÙÒ Ö Óº È Ö ÐÐÓ¸ ÙØ Ð Þ Ö ÑÓ× ÙÒ Ò Ö ÐÓ
¿    Å Ñ ÖÓ× ÔÖ Ú Ó× List Graph<Node, Arc>        +≡       ´ ¼µ    ¿
        bool digraph;
         Ð Ú ÐÓÖ   digraph   × true × × ØÖ Ø       ÙÒ     Ö Ó    false     ÐÓ ÓÒØÖ Ö Óº
594                                                                  Cap´
                                                                        ıtulo 7. Grafos



                                   A               B



                                         C


           counter
                 num_arcs=2
                 counter       A
                control_bits
                 cookie                                                         counter
                                                                                control_bits
                                                                                cookie

                                                                                               1



            counter
                  num_arcs=2
                  counter      B
                 control_bits                                                   counter
                  cookie
                                       Arc_Nodes                                control_bits
                                                                                cookie

                                                                                           2



           counter
                 num_arcs=2                                                     counter
                 counter   C                                                    control_bits
                control_bits                                                    cookie
                 cookie
                                                                                           3
                                                                                Arcos
              Nodos




               ÙÖ º½ ÍÒ Ö Ó × ÑÔÐ Ý Ð ×Ø Ó             ×Ù ×ØÖÙ ØÙÖ        ØÓ×

Iterador de arcos sobre un nodo
      ÓÑÓ Ý ×    Ó¸ ÙÒ Ø Ö ÓÖ      Ö Ó× Ô ÖØ Ö ÙÒ ÒÓ Ó × Ö Ð Þ Ô ÖØ Ö
Dlink::Iterator¸ ÔÙ × Arc Node × ÔÓÖ Ö Ú ÓÒ    Ø ÔÓ Dlinkº
    Ô ÖØ      Ù Ö Ö Ð Ö Ó Ý Ð ÒÓ Ó × Ð Ù Ð × Ø Ö ¸ Node Arc Iterator¸
Ñ ÒØ Ò Ð ÙÒ ÓÒ ÕÙ Ø ÖÑ Ò Ù Ð Ö Ó ÑÓ×ØÖ Ö
 Å Ñ ÖÓ× ÔÖ Ú Ó× Ø Ö ÓÖ ÆÓ             ≡                   ´ µ
  Node *          src_node;
    ÈÙ ×ØÓ ÕÙ Node Arc Iterator × ÔÓÖ Ö Ú ÓÒ Ø ÔÓ Dlink::Iterator¸ ר Ø Ò
ØÓ Ó× ÐÓ× Ñ ØÓ Ó× ×Ó Ó× ´next()¸ prev()¸ has current()¸ Ø Ø Ö µº Ð Ñ ØÓ Ó
Dlink::Iterator::get current() ÒÓ ÔÙ    Ù× Ö× Ö Ø Ñ ÒØ ÔÓÖÕÙ ×Ø Ö ØÓÖÒ ÙÒ
Dlink Ý Ò × Ø ÑÓ× ÓÒÓ Ö Ò ÔÖ Ò Ô Ó Ð Arc Nodeº ÈÓÖ Ø ÒØÓ¸ × Ò ÑÓ× ×Ø ÓÒ¹
Ú Ö× ÓÒ
 Å Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ ÆÓ            +≡             ´ µ
  Arc_Node * get_current_arc_node()
  {
    return dlink_to_arc_node(Dlink::Iterator::get_current());
  }
Í× × Arc Node ¾ º

B´squeda de un arco dados dos nodos
 u
    ÓÒ Ð Ø Ö ÓÖ Ö Ó× ×Ó Ö ÙÒ ÒÓ Ó¸ ÔÓ ÑÓ× ÑÔÐ ÒØ Ö ÐÑ ÒØ Ð Ù×ÕÙ
ÙÒ Ö Ó ÕÙ ÓÒ Ø Ó× ÒÓ Ó׺ Ä      × ØÓÑ Ö ÙÒÓ ÐÓ× ÒÓ Ó׸ ÔÖ Ö Ð Ñ ÒØ Ð ÕÙ
7.3. Un TAD para grafos (List Graph<Node, Arc>)                              595



 ÓÒØ Ò Ñ ÒÓ× Ö Ó׸ Ý × ÐÐ Ö ÓÖÖ Ö ×Ù× Ö Ó× ×Ø Ò ÓÒØÖ Ö Ð ÓØÖÓ ÒÓ Ó Ó ×Ø
ÕÙ ÒÓ Ý Ò Ñ × Ö Ó× ÕÙ Ö ÓÖÖ Ö¸ Ò ÙÝÓ ×Ó Ð Ù×ÕÙ     × ÐÐ º
 ÁÑÔÐ ÒØ ÓÒ ÙÒ ÓÒ × List Graph<Node, Arc>     ≡
     template <class GT, class SA>
  typename GT::Arc * search_arc(GT & g, typename GT::Node * src_node,
                                typename GT::Node * tgt_node)
  {
    Node_Arc_Iterator<GT, SA> itor;
    typename GT::Node * searched_node;
    if (g.is_digraph() or src_node->num_arcs < tgt_node->num_arcs) // nodo con menos arcos
      {
        searched_node = tgt_node;
        itor = Node_Arc_Iterator<GT, SA>(src_node);
      }
    else
      {
        searched_node = src_node;
        itor = Node_Arc_Iterator<GT, SA>(tgt_node);
      }
    for (/* nada */; itor.has_current(); itor.next())
      if (itor.get_tgt_node() == searched_node) // ¿conecta a searched_node?
        return itor.get_current_arc();
    return NULL;
  }
Í× × Node Arc Iterator   º

7.3.10.3    Inserci´n de nodos
                   o

 Ð ÔÖ Ñ Ö Ø ÔÓ Ò× Ö ÓÒ ×ÙÑ ÕÙ Ð Ñ ÑÓÖ Ô Ö Ð ÒÓ Ó Ý × Ó Ô ÖØ                  Ý×
ÒרÖÙÑ ÒØ Ð × Ù ÒØ Ñ Ò Ö
ÁÑÔÐ ÒØ ÓÒ List Graph<Node, Arc>   +≡             ½
      template <typename Node, typename Arc>
  Node * List_Graph<Node, Arc>::insert_node(Node * node)
  {
    ++num_nodes;
    node_list.append(node);
    return node;
  }
Í× × List Graph ¼ º
 Ð × ÙÒ Ó Ø ÔÓ ÜØ Ò Ð ØÖ Ó ÒØ Ö ÓÖ Ô Ö Ô ÖØ Ö Ð Ñ ÑÓÖ Ô Ö Ð ÒÓ Ó Ý
ÓÐÓ ÖÐ Ð Ò ÓÖÑ ÓÒ        Ð ÓÖÑ × Ù ÒØ
ÁÑÔÐ ÒØ ÓÒ List Graph<Node, Arc>   +≡
      template <typename Node, typename Arc>
  Node * List_Graph<Node, Arc>::insert_node(const typename Node::Node_Type & node_info)
  {
    return List_Graph<Node, Arc>::insert_node( new Node (node_info) );
  }
Í× × List Graph ¼ º
596                                                          Cap´
                                                                ıtulo 7. Grafos



7.3.10.4   Inserci´n de arcos
                  o

È Ö Ò× ÖØ Ö ÙÒ Ö Ó         Ò ÓÒÓ Ö× ÐÓ× ÒÓ Ó× ÕÙ ×Ø Ö Ð ÓÒ ¸ ÐÓ× Ù Ð ×     Ò
     Ö× Ò× ÖØ Ó ÔÖ Ú Ñ ÒØ Ò Ð Ö Óº Ä Ò× Ö ÓÒ ÙÒ Ö Ó × Ö ×ÙÑ Ò ÐÓ×
× Ù ÒØ × Ô ×Ó×
   ½º Ô ÖØ Ö Ñ ÑÓÖ Ô Ö Ð Ö Ó ´ Ø ÔÓ Arcµ Ý × Ò ÖÐ ×Ù× ØÓ׺
   ¾º Ë Ð Ò× Ö ÓÒ Ó ÙÖÖ Ò ÙÒ Ö Ó ´ÒÓ ÙÒ Ö Óµ¸ ÒØÓÒ × Ô ÖØ Ö Ñ ÑÓÖ Ô Ö
      ÙÒ Ó ØÓ Ø ÔÓ Arc Node ÓÖÖ ×ÔÓÒ ÒØ Ð ÒÓ Ó ×Ø ÒÓ tgt node¸ ÓÐÓ ÖÐÓ
       ÔÙÒØ Ö       Ð Ö Ó Ö Ó Ò ´½µ Ò× ÖØ ÖÐÓ Ò Ð Ð ×Ø   Ý Ò        tgt nodeº
        Ò ×Ø ÔÙÒØÓ      ÑÓ× ×Ø Ö Ô Ò ÒØ × ÕÙ Ð Ö Ó Ò× ÖØ Ö ÒÓ Ö ÔÖ × ÒØ ÙÒ
         ÐÓ Ý × ¸ × ÑÓ Ó¸ ÒÓ ÙÔÐ Ö Ð Arc Nodeº
   ¿º Ô ÖØ Ö Ñ ÑÓÖ Ô Ö ÙÒ Ó ØÓ Ø ÔÓ Arc Node ÓÖÖ ×ÔÓÒ ÒØ Ð ÒÓ Ó ÓÖ Ò
      src node¸ ÓÐÓ ÖÐÓ     ÔÙÒØ Ö      Ð Ö Ó Ö Ó Ò ´½µ Ò× ÖØ ÖÐÓ Ò Ð Ð ×Ø
         Ý Ò        src node

    º ÁÒ× ÖØ Ö Ð Ö Ó Ò Ð Ð ×Ø      Ö Ó× Ð Ö Óº
  Ð Ð ÓÖ ØÑÓ ÒØ Ö ÓÖ × Ó ¬ ÓÑÓ × Ù
 ÁÑÔÐ ÒØ ÓÒ List Graph<Node, Arc>          +≡
    template <typename Node, typename Arc> Arc *
 List_Graph<Node, Arc>::insert_arc(Node * src_node, Node * tgt_node)
 {      // paso (1): apartar memoria para Arc e iniciar
   auto_ptr<Arc> arc ( new Arc ); // apartar memoria para arco
   arc->src_node   = src_node;     // Iniciar sus campos
   arc->tgt_node   = tgt_node;
       // paso (3) (parcial): apartar memoria para Arc_Node de src_node
   auto_ptr<Arc_Node> src_arc_node ( new Arc_Node (arc.get()) );
       // Paso (2): si es grafo ==> apartar memoria para Arc_Node del tgt_node
   if (not digraph) // si es digrafo ==> no hay que insertar en el otro nodo
     {     // inserci´n en nodo destino
                     o
       if (src_node == tgt_node) // verificar si se trata de un ciclo
         arc->tgt_arc_node = src_arc_node.get(); /* este es un ciclo */
       else
         {     // apartar arco nodo para tgt_node
           auto_ptr<Arc_Node> tgt_arc_node ( new Arc_Node (arc.get()) );
               // inserci´n en lista de adyacencia de tgt_node
                         o
           arc->tgt_arc_node = tgt_arc_node.get();
           tgt_node->arc_list.append(tgt_arc_node.get());
           tgt_node->num_arcs++;
           tgt_arc_node.release(); // desbloquear auto-puntero tgt_arc_node
         }
     }
       // paso (3) (resto) inserci´n en lista adyacencia src_node
                                  o
   arc->src_arc_node = src_arc_node.get();
   src_node->arc_list.append(src_arc_node.get());
   src_node->num_arcs++;
   arc_list.append(arc.get()); // paso (4) insertar arco lista de arcos de grafo
   ++num_arcs;
   src_arc_node.release(); // desbloquear tgt_arc_node
7.3. Un TAD para grafos (List Graph<Node, Arc>)                                  597



     return arc.release();       // desbloquear arc
 }
Í× × Arc Node ¾ Ò   List Graph     ¼º
   Ä Ó ¬ ÓÒ × Ð Ö Ñ ÒØ           Ö ÒØ Ð Ð ÓÖ ØÑÓ Ò ×Ø ÐÐ ÒÓ ÔÓÖÕÙ Ò ÐÐ ×
 ÓÒ× Ö Ð ÔÓ× Ð          ÕÙ Ó ÙÖÖ ÙÒ ÐÐ     Ñ ÑÓÖ º È Ö Ñ ÒØ Ò Ö Ð Ó Ó ÐÓ
Ñ × Ô Ö Ó Ð Ð ÓÖ ØÑÓ Ò ×Ø ÐÐ ÒÓ Ù× ÑÓ× ÙØÓ¹ÔÙÒØ ÖÓ×½¼ º ÈÓÖ ×Ó¸ Ð ×ØÖ Ø      ×
 Ô ÖØ Ö ÐÓ× ØÖ × ÐÓÕÙ × Ñ ÑÓÖ ÕÙ Ö ÕÙ Ö ÑÓ× ´ Ð Ð Arc Ý ÐÓ× Ó× Arc Nodeµ ݸ ×
ÒÓ Ó ÙÖÖ Ó Ü Ô ÓÒ¸ ÒØÓÒ × ÔÓ ÑÓ× Ò× ÖØ Ö Ò ØÓ × Ð × Ð ×Ø × × Ò Ö × Ó      ÐÐ º
7.3.10.5   Eliminaci´n de arcos
                    o

Ä Ð Ñ Ò ÓÒ ÙÒ Ö Ó × Ñ × × Ò ÐÐ ÔÓÖÕÙ ÒÓ Ý ÔÙÒØÓ× Ú ÒØÙ Ð × Ü Ô ÓÒ½½ º
  Ð ÔÖÓ Ñ ÒØÓ × Ö ×ÙÑ Ò ÐÓ× × Ù ÒØ × Ô ×Ó×
    ½º Ð Ñ Ò Ö Ð × Ð ×Ø      Ý Ò         Ð ÒÓ Ó ÓÖ Ò Ð Arc Node Ý Ð Ö Ö ×Ù Ñ ÑÓÖ º
        Ð ×Ó ×Ø Arc Node × ÔÓÖ Ð ØÖ ÙØÓ arc->src arc nodeº
    ¾º Ë × ØÖ Ø ÙÒ Ö Ó ´ÒÓ ÙÒ Ö Óµ¸ ÒØÓÒ × Ð Ñ Ò Ö Ð × Ð ×Ø                Ý Ò
         Ð ÒÓ Ó ×Ø ÒÓ Ð Arc Node Ý Ð Ö Ö ×Ù Ñ ÑÓÖ º
        Ð ×Ó ×Ø Arc Node × ÔÓÖ Ð ØÖ ÙØÓ arc->tgt arc nodeº
        Ò ×Ø Ô ×Ó Ý ÕÙ ÔÖ ×Ø Ö Ø Ò ÓÒ ÕÙ Ð Ö Ó × ÙÒ ÐÓ¸ Ò ÙÝÓ ×Ó ÒÓ
         Ý ÕÙ Ò Ð Ñ Ò Ö Ð Ð ×Ø          Ý Ò Ò Ð Ö Ö Ð Ñ ÑÓÖ Ñ × ÓÒ ×
       Ý Ù ÖÓÒ       × Ò Ð Ô ×Ó ÒØ Ö ÓÖº
    ¿º Ò ÐÑ ÒØ ¸ Ð Ñ Ò Ö Ð Ö Ó Ð Ð ×Ø           Ö Ó× Ð Ö Ó Ý Ð Ö Ö ×Ù Ñ ÑÓÖ º
ÄÓ× Ô ×Ó× ÒØ Ö ÓÖ × × Ö ­ Ò Ò Ð × Ù ÒØ Ó Ó
 ÁÑÔÐ ÒØ ÓÒ List Graph<Node, Arc>            +≡
    template <typename Node, typename Arc>
 void List_Graph<Node, Arc>::remove_arc(Arc * arc)
 {      // paso (1): eliminaci´n del Arc_node del nodo origen src_node
                              o
   Node * src_node         = get_src_node(arc);
   Arc_Node * src_arc_node = arc->src_arc_node;
   src_arc_node->del(); // desenlaza src_node de la lista de nodos
   src_node->num_arcs--; // decrementa contador de arcos de src_node
   delete src_arc_node;   // entrega memoria
   if (not digraph)
     {     // eliminaci´n arco en nodo destino
                       o
       Node * tgt_node = get_tgt_node(arc);
       if (src_node != tgt_node) // verificar eliminaci´n de ciclo
                                                       o
         { // paso (2): eliminaci´n del Arc_node del nodo destino tgt_node
                                  o
           Arc_Node * tgt_arc_node = arc->tgt_arc_node;
           tgt_arc_node->del();
           tgt_node->num_arcs--;
  ½¼
     ÍÒ ÙØÓ¹ÔÙÒØ ÖÓ × ÙÒ Ð ×      Ó ØÓ ÔÙÒØ ÓÖ ÕÙ Ñ Ò Ð Ð Ö ÓÒ ÙØÓÑ Ø         Ñ ÑÓÖ
 Ù Ò Ó × ÒÚÓ Ð ×ØÖÙ ØÓÖº        ר ÑÓ Ó¸ × ÓÖÖ Ð Ò ÐÙ× ÓÒ ÙÒ Ñ Ò ÓÖ       Ü Ô ÓÒ × ÕÙ
ÔÖ Ú ÙÒ ÐÐ          Ñ ÑÓÖ Ý ÕÙ Ö ÕÙ Ö Ð ÑÔ Ö ×Ø Ó ÒØ ÖÑ Óº ÄÓ× ÙØÓ¹ÔÙÒØ ÖÓ× × Ð Ö Ò
 Ù Ò Ó×       ÙØ Ð Ñ ØÓ Ó release() Ò ×Ø ×Ó¸ Ð ×ØÖÙ ØÓÖ ÒÓ ØÙ Ö Ð deleteº
  ½½
     Ë ÐÚÓ ÕÙ × ØÖ Ø ÙÒ ÖÖÓÖ Ð Ù×Ù Ö Ó¸ ÔÓÖ ÑÔÐÓ¸ Ð Ñ Ò ÓÒ Ó Ð Ó ÙÒ Ù Ò Ð ÑÔÐ ÒØ ÓÒº
598                                                             Cap´
                                                                   ıtulo 7. Grafos



               delete tgt_arc_node;
           }
       }
          // eliminaci´n de arco del grafo
                      o
      arc->del(); // desenlazar arc de la lista de arcos del grafo
      --num_arcs;
      delete arc;
  }
Í× × Arc Node ¾ Ò     List Graph   ¼º

7.3.10.6    Eliminaci´n de nodos
                     o

Ä Ð Ñ Ò ÓÒ ÙÒ ÒÓ Ó ÔÙ Ô Ö Ö ÓÑÔÐ          ÒØ Ð Ö ÕÙ Ö Ñ ÒØÓ ÕÙ      Ò
 Ð Ñ Ò Ö× ØÓ Ó× ×Ù× Ö Ó× Ò ÒØ × Ý Ý ÒØ ׺ Ô × Ö ØÓ Ó¸ × ÒÓ × ØÖ Ø
ÙÒ Ö Ó¸ Ö ×ÙÐØ × Ò ÐÐ × ÒÓ× × ÑÓ× Ò Ð Ð Ñ Ò ÓÒ Ð Ö Ó ÑÔÐ ÒØ       ÒÐ
×Ù ¹× ÓÒ ÒØ Ö ÓÖ
 ÁÑÔÐ ÒØ ÓÒ List Graph<Node, Arc>   +≡
     template <typename Node, typename Arc>
  void List_Graph<Node, Arc>::remove_node(Node * node)
  {
    if (not digraph)
          // Eliminar arcos adyacentes a node
      while (not node->arc_list.is_empty()) // repita mientras a´n hayan arcos
                                                                u
        {     // obtener el Arc_Node
          Arc_Node * arc_node = dlink_to_arc_node(node->arc_list.get_next());
          Arc * arc = void_to_arc(arc_node); // obtener el arco
          remove_arc(arc); // eliminarlo del grafo
        }
    else
      for (Arc_Iterator it(*this); it.has_current();)
        {
          Arc * arc = it.get_current();
          if (get_src_node(arc) == node or get_tgt_node(arc) == node)
            {
              it.next();
              remove_arc(arc);
            }
          else
            it.next();
        }
        // en este punto el nodo ya no tiene arcos
    node->del(); // desenlazar nodo de lista de nodos del grafo
    --num_nodes;
    delete node;
  }
Í× × Arc Iterator    ¸ Arc Node ¾ ¸ Ò   List Graph   ¼º
Ë × ØÖ Ø     ÙÒ Ö Ó¸ ÒØÓÒ × Ð Ù ×Ø ÓÒ × Ñ ×      Ð Ò ¬ ÒØ ¸ Ô٠׸ ÓÒ Ð
 רÖÙ ØÙÖ     ØÓ× × Ò ¸ ÒÓ ÕÙ ÓØÖ ÐØ ÖÒ Ø Ú ÕÙ Ñ Ö Ö ØÓ Ó× ÐÓ× Ö Ó× Ý Ð Ñ Ò Ö
 ÕÙ ÐÐÓ× ÕÙ ÔÙÒØ Ò nodeº ×ØÓ ÔÙ × Ö ÜØÖ Ñ Ñ ÒØ Ò ¬ ÒØ Ý ×                ר Ö
 ÓÒ× ÒØ      ר Óר Ð ÓÖ       ÐØ Ö Ö Ð ØÓÔÓÐÓ  ÙÒ Ö Óº
7.3. Un TAD para grafos (List Graph<Node, Arc>)                                599



7.3.10.7    Limpieza de grafos

remove node() ÒÓ×         Ð Ñ ÝÓÖ Ô ÖØ Ð ØÖ Ó Ò × Ö Ó Ô Ö Ð ÑÔ Ö ÙÒ Ö Ó ´ÓÔ¹
 Ö ÓÒ clear graph()µ¸     ÔÙ × ×Ø × Ö Ñ Ø Ð Ñ Ò Ö ØÓ Ó× ÐÓ× ÒÓ Ó× Ð Ö Ó
ÁÑÔÐ ÒØ ÓÒ          ÙÒ ÓÒ × List Graph<Node, Arc>    +≡            ¼¼
     template <class GT>
  void clear_graph(GT & g)
  {
    for (Arc_Iterator<GT> it(g); it.has_current(); ) // eliminar arcos
      {
        typename GT::Arc * arc = it.get_current();
        it.next();
        g.remove_arc(arc);
      }
    for (Node_Iterator<GT> it(g); it.has_current(); ) // eliminar nodos
      {
        typename GT::Node * p = it.get_current();
        it.next(); // avanzar antes de borrar por consistencia de iterador
        g.remove_node(p); // eliminarlo del grafo
      }
  }
Í× × Arc Iterator      Ò   Node Iterator     º
ÈÙ ×ØÓ ÕÙ remove arc() Ý remove node() ×ÓÒ Ú ÖØÙ Ð ×¸ ÔÙ      Ö ØÓ ÙÒ       Ò
      Ö Ú ÓÒº ÈÓÖ ×Ó¸ × Ñ × × ÙÖÓ Ð Ñ Ò Ö ÐÓ× Ö Ó× Ý ÐÙ Ó ÐÓ× ÒÓ Ó׸ Ò ÐÙ Ö
 Ð Ñ Ò Ö Ö Ø Ñ ÒØ ÐÓ× ÒÓ Ó× ´ÕÙ ÒØÖ Ò× Ñ ÒØ Ø Ñ Ò Ð Ñ Ò Ò ÐÓ× Ö Ó×µº
7.3.10.8    Mapeo de nodos y arcos

Ê ÓÖ ÑÓ× ÕÙ ×Ø ÔÙÐ ÑÓ× Ð Ñ Ô Ó ÒÓ Ó× Ý Ö Ó× ØÖ Ú × ÐÓ× ÓÓ ×º ÓÒ¹
  ÒØÖ ÑÓ×ÒÓ× Ò map node()¸ Ð Ù Ð Ñ Ô ÐÓ× ÓÓ ×      Ó× ÒÓ Ó× Ý ÔÖ × ÖÚ Ð Óѹ
ÔÓ× ÓÒ Ñ Ô Ó× Ò Ð × ÒØ Ó ÕÙ × ÐÓ× ÓÓ × ×ÓÒ ×Ø ÒØÓ× NULL¸ ÒØÓÒ × Ð
Ñ Ô Ó × ÔÖÓÔ     ÓÑÓ × ÐÓ× ÓÓ × Ù × Ò ÙÒ Ð ×Ø ÒÐ Þ      Ö ÙÐ Öº ÁÒ ÐÑ ÒØ ¸ ×
ÒÓ Ý Ñ Ô Ó¸ ÒØÓÒ × node map(p, q) ÓÒרÖÙÝ Ð × Ù ÒØ ÓÒ¬ ÙÖ ÓÒ ÒÐ ×
                                      p                  q




ÄÙ Ó¸ × Ó ÙÖÖ ÓØÖ ÐÐ Ñ             node map(q,r)¸    ÒØÓÒ × ÐÓ× ÒÐ × Ú Ò Ò Ò
                               p                 q           r




     Ð Ö Ñ ÒØ ¸ ÐÓ× Ñ Ô Ó×  Ò ÓÑÔÓÖØ Ö× ÓÑÓ × ØÖ Ø ×    ÙÒ Ò× Ö ÓÒ Ò ÙÒ
Ð ×Ø Ö ÙÐ Ö¸ × ÑÔÐ Ñ ÒØ ÒÐ Þ ¸ × Ò ÒÓ Ó    Ö º ÄÓ ÕÙ ÒÓ× ÓÒ Ù
 ÁÑÔÐ ÒØ ÓÒ List Graph<Node, Arc>       +≡                 ¼½
     template <typename Node, typename Arc>
  void List_Graph<Node, Arc>::map_nodes(Node * p, Node * q)
  {
    if (NODE_COOKIE(p) == NULL)
600                                                             Cap´
                                                                        ıtulo 7. Grafos



            {
                NODE_COOKIE(p) = q;
                NODE_COOKIE(q) = p;
                return;
             }
           NODE_COOKIE(q) = NODE_COOKIE(p);
           NODE_COOKIE(p) = q;
       }
          template <typename Node, typename Arc>
       void List_Graph<Node, Arc>::map_arcs(Arc * p, Arc * q)
       {
         if (ARC_COOKIE(p) == NULL)
           {
             ARC_COOKIE(p) = q;
             ARC_COOKIE(q) = p;
             return;
           }
         ARC_COOKIE(q) = ARC_COOKIE(p);
         ARC_COOKIE(p) = q;
       }
     Í× × List Graph ¼ º

     7.3.10.9     Copia de grafos

         Ñ Ò Ö Ò Ö Ð¸ Ð ÓÔ ÔÙ × Ô Ö Ö× Ò Ó× × × ´½µ ÓÔ            ÒÓ Ó× Ý ´¾µ ÓÔ
         Ö Ó׺ ÓÔ Ö ÒÓ Ó× × Ö Ð Ø Ú Ñ ÒØ   Ð ÔÓÖ      ÒÓ Ó Ð Ö Ó ÓÖ Ò × Ö ÙÒ
      ÓÔ Ý × Ò× ÖØ Ò Ð Ö Ó ×Ø ÒÓº
         Ä ÓÔ       Ö Ó× × × Ñ Ð Ö ÔÓÖ      Ö Ó Ð Ö Ó ÓÖ Ò × Ö ÙÒ ÓÔ Ý ×
      Ò× ÖØ Ò Ð Ö Ó ×Ø ÒÓº Ê ÓÖ ÑÓ× ÕÙ Ô Ö Ò× ÖØ Ö ÙÒ Ö Ó Ý ÕÙ ×Ô ¬ Ö
     ×Ù× ÒÓ Ó׺ Ù Ò Ó Ò×Ô ÓÒ ÑÓ× ÙÒ Ö Ó Ð Ö Ó ÓÖ Ò¸ ÐÓ× ÒÓ Ó× ÕÙ Ü Ñ Ò ÑÓ×
     Ö ¬ Ö Ò Ð Ö Ó ÓÖ Ò¸ Ô ÖÓ Ð Ö Ó Ò× ÖØ Ö Ò Ð Ö Ó ×Ø ÒÓ Ö ÕÙ Ö ÒÓ Ó× Ö ×Ô ØÓ
      Ð Ö Ó ×Ø ÒÓ Ý ÒÓ Ö ×Ô ØÓ Ð ÓÖ Òº Ë ÒÓ× ÔÖ × ÒØ ÒØÓÒ × Ð × Ù ÒØ ÔÖÓ Ð Ñ
         Ó ÙÒ ÒÓ Ó Ð Ö Ó ÓÖ Ò¸ ÓÑÓ ÓÒÓ Ö ×Ù ÕÙ Ú Ð ÒØ Ò Ð Ö Ó ÓÔ ×Ø ÒÓ
     ÍÒ Ñ Ò Ö          ÖÐÓ × Ö Ñ ÒØ ÙÒ Ñ Ô Ó ÒÓ Ó× ÒØÖ ÐÓ× Ó× Ö Ó× ØÖ Ú ×
        ×Ù× ÓÓ ×¸ Ô ÖÓ Ð × Ñ ÒØ        Ð ÒØ Ö Þ copy graph() ÔÙ ÑÔ Ö ×Ø Ø ÔÓ
        Ñ Ô Ó ´ Ù Ò Ó Ð Ô Ö Ñ ØÖÓ cookie map == falseµº ÈÓÖ × Ö ÞÓÒ¸ Ö Ð Þ Ö ÑÓ× Ð
     Ñ Ô Ó Ñ ÒØ ÙÒ Ø Ð ÒרÖÙÑ ÒØ           ÓÒ ÙÒ Ö ÓÐ ÎÄ
¼¼        Ð Ö ÓÒ Ø Ð Ñ Ô Ó ¼¼ ≡                                 ´ ¼¼ µ
       DynMapAvlTree<typename GT::Node*, typename GT::Node*> mapping_table;
        mapping table      Ñ Ô ÒÓ Ó× Ð Ö Ó ÓÖ Ò       src graph   ÒÓ Ó× Ð Ö Ó ×Ø ÒÓ
     thisº
         Ð Ñ ØÓ Ó        ÓÔ × ×Ô ¬ ÓÑÓ × Ù
¼¼   ÁÑÔÐ ÒØ ÓÒ         ÙÒ ÓÒ × List Graph<Node, Arc>        +≡
          template <class GT>
       void copy_graph(GT & gtgt, GT & gsrc, const bool & cookie_map)
       {
             clear_graph(gtgt); // limpiar this antes de copiar
                    Ð Ö ÓÒ    Ø Ð Ñ Ô Ó ¼¼
                   // Fase (1): recorrer nodos de grafo src_graph e insertar copia en this
7.3. Un TAD para grafos (List Graph<Node, Arc>)                                 601



              for (typename GT::Node_Iterator it(gsrc); it.has_current(); it.next())
                {
                  typename GT::Node * src_node = it.get_current_node();
                  auto_ptr<typename GT::Node> tgt_node(new typename GT::Node(src_node));
                  mapping_table.insert(src_node, tgt_node.get()); // insertar en mapeo
                  typename GT::Node * tgt = tgt_node.release();
                  gtgt.insert_node(tgt); // insertarla en grafo destino
                  if (cookie_map)
                    GT::map_nodes(src_node, tgt);
                }
                  // fase (2): por cada arco de src_graph, crear en this un
                  // arco que conecte a los nodos mapeados de mapping_table
             for (typename GT::Arc_Iterator it(gsrc); it.has_current(); it.next())
                {
                  typename GT::Arc * src_arc = it.get_current_arc();
                      // obtener im´genes de nodos en el grafo destino y crear arco
                                   a
                  typename GT::Node * src_node = mapping_table[gsrc.get_src_node(src_arc)];
                  typename GT::Node * tgt_node = mapping_table[gsrc.get_tgt_node(src_arc)];
                  typename GT::Arc * tgt_arc   = gtgt.insert_arc(src_node, tgt_node);
                  *tgt_arc = *src_arc;
                  if (cookie_map)
                    GT::map_arcs(src_arc, tgt_arc);
                }
       }
     Í× × Arc Iterator     Ò   Node Iterator   º
         Ô ÖØ    ×Ù ÙØ Ð Þ ÓÒ ÔÙ Ð Ò Ð ÓÒØ ÜØÓ ÙÒ ÔÐ                ÓÒ¸   copy graph()   ×
     Ù× Ó ÔÓÖ Ð ÓÒרÖÙ ØÓÖ ÓÔ Ý Ð ÓÔ Ö ÓÖ × Ò ÓÒº
     7.3.10.10    Ordenamiento de arcos

     ÄÓ× Ö Ó× ×Ø Ò ÓÒØ Ò Ó× Ò Ð Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ arc listº È Ö ÓÖ Ò ÖÐÓ׸ ÒÓ×
     Ú Ð Ö ÑÓ× Ð Ñ Ö ×ÓÖØ ÑÔÐ Ñ ÒØ Ó Ò Ü ¿º¾º½º ´Ô Ò ½ µº Ô Ð ÑÓ× Ð Ñ Ö ×ÓÖØ
     ÔÓÖ Ú Ö × Ö ÞÓÒ ×º Ò ÔÖ Ñ Ö ÐÙ Ö¸    Ö Ò ¸ ÔÓÖ Òר Ò ¸ Ð ÕÙ ×ÓÖØ¸ Ð × ÑÔ ÒÓ
     O(n Ð (n)) Ð Ñ Ö ×ÓÖØ ר      Ö ÒØ Þ Ó Ý ÒÓ ×ÙÔ Ø Ó Ð Ô ÖÑÙØ ÓÒº Ò × ÙÒ Ó
     ÐÙ Ö¸ Ð ÓÒ×ÙÑÓ ×Ô Ó Ð Ñ Ö ×ÓÖØ × ÐÓ ×ÙÑÓ O(Ð (n))¸            ÖÒ      Ð O(n)
     ÕÙ × Ð Ô ÓÖ ×Ó ÓÒ×ÙÑÓ Ô Ö Ð ÕÙ ×ÓÖØ ÓÒ Ð ×Ø × ÒÐ Þ ×º
          × Ô٠׸ Ð ÓÖ Ò Ñ ÒØÓ ÐÓ× Ö Ó× × Ö Ñ Ø
¼½    ÁÑÔÐ ÒØ ÓÒ List Graph<Node, Arc>          +≡
          template <typename Node, typename Arc>
          template <class Compare>
       void List_Graph<Node, Arc>::sort_arcs() { mergesort<Cmp_Arc<Compare> >(arc_list); }
     Í× × List Graph ¼ Ò   mergesort   ½   º
         sort arcs() Ö     Ð Ð×       ÓÑÔ Ö ÓÒ Compare ×Ó Ö ÔÙÒØ ÖÓ× Ö Ó× Ø ÔÓ
     Arc ר Ð × ¸ ÕÙ Ð          ÔÖÓÚ Ö Ð Ù×Ù Ö Ó ÒØ Ö × Ó Ò ÓÖ Ò Ö ÐÓ× Ö Ó׸ Ö Ð Þ
     Ð ÓÑÔ Ö ÓÒ bool operator () (Arc *, Arc *)º È ÖÓ Ð Ñ Ö ×ÓÖØ ×Ó Ö Ð ×Ø × Ò¹
     Ð Þ × ÒÚÓ bool operator () (Dlink *, Dlink *) ´Ü ¿º¾º½º ´Ô Ò ½ µµ¸ Ô Ö
      ÓÑÔ Ö Öº      ÑÓ׸ Ô٠׸ × Ö Ö Ð Ð ×      ÓÑÔ Ö ÓÒ Ô Ö mergesort()¸ Ð Ù Ð ×
        ÒÓÑ Ò Cmp Arcº ËÙ ÙÒ ÓÒ × ÓÒÚ ÖØ Ö ÐÓ× ÔÙÒØ ÖÓ× Ø ÔÓ Dlink Arc* ÒÚÓ Ö
     Ð ÓÑÔ Ö ÓÒ Compareº
602                                                                   Cap´
                                                                              ıtulo 7. Grafos



     7.4          TAD camino sobre un grafo (Path<GT>)
     Ä Ù×ÕÙ         Ñ ÒÓ× × ÙÒ Ð × Ø Ú    × Ñ × ÓÑÙÒ × Ò Ð Ñ Ò ÔÙÐ ÓÒ ×Ó Ö
     ÙÒ Ö Óº ÈÓÖ ×ØÓ Ú Ð Ð Ô Ò ÙÒ Ì ÕÙ ÑÓ Ð     Ñ ÒÓ× Ý Ð Ø ×Ù ÓÒרÖÙ ÓÒº
         Ð Ì Path<GT> ÑÓ Ð Þ ÙÒ Ñ ÒÓ ×Ó Ö ÙÒ List Graph<Node, Arc>¸ ×Ù ×ØÖÙ ¹
     ØÙÖ Ò Ö Ð × ¬Ò ÓÑÓ × Ù
¼¾      Ñ ÒÓ Ö Ó ¼¾ ≡                                       ¾¿
             template <class GT>
         class Path
         {
              Ì ÔÓ× Ô Ø ¼¾
              Å Ñ ÖÓ× ÔÖ Ú Ó× Ô Ø ¼¾
              Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾
         };
         ¬Ò ×
         Path¸    Ù× Ò ÙÒ × ¼¿¸ ¼ ¸ ¾¿ß¾ ¸   ¸ ½ ¸ ½ ¸ ¾¾¸ ¾ ¸ ¿ ß ½¸     ¾ ¸   ¿¸ ¼ ¸ ¼ ¸ ¿¿¸
              Ò     ¿º
      Ð Ô Ö Ñ ØÖÓ Ø ÔÓ GT × Ö Ø ÔÓ List Graph<Node, Arc>¸ List Digraph<Node,                     Arc>
     Ó     Ð ÙÒ Ð × × Ò ÒØ º
        Path<GT> Ù Ö Ð Òר Ò       Ð Ö Ó Ò ÙÒ ØÖ ÙØÓ
¼¾   Å Ñ ÖÓ× ÔÖ Ú Ó× Ô Ø ¼¾ ≡                           ´ ¼¾ µ ¼¾
         GT *                   g;
     Ð Ù Ð × ÓÒ×ÙÐØ Ð Ñ ÒØ
¼¾   Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾            ≡                               ´ ¼¾ µ ¼¾
         GT & get_graph() { return *g; }
         Ò Ó × ÓÒ × × Ö ÕÙ Ö ×Ó Ö ÙÒ Ð ÙÐÓ ÙÒ Ñ ÒÓ ÓÒØ Ð Þ Ö ×Ù Óר ¸ ÔÓÖ
      ÑÔÐÓº        ØÓ× ÔÓ× Ð Ø Ö ×Ó Ö Ð ÙÒ Ò ÓÖÑ ÓÒ ÙÒ Ñ ÒÓ¸ Path<GT>
     ÓÒØ Ò ÙÒ ÔÙÒØ ÖÓ ÓÓ
¼¾   Å Ñ ÖÓ× ÔÖ Ú Ó× Ô Ø ¼¾ +≡                  ´ ¼¾ µ ¼¾ ¼¿
         void * cookie;
     Ð Ù Ð × Ò Ð Þ Ó NULL Ò Ø ÑÔÓ                  ÓÒרÖÙ ÓÒ Ý Ó × ÖÚ Ð Ý ÑÓ ¬             Рѹ
       ÒØ Ð × Ù ÒØ Ñ ØÓ Ó
¼¾   Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡                                ´ ¼¾ µ     ¼¾     ¼¾
         void *& get_cookie() { return cookie; }
         Ò Ó × ÓÒ ×¸ × Ò × Ö Ó Ú Ð Ö × ÙÒ Ñ ÒÓ ×Ó Ö ÙÒ Ö Ó Ö ¬ Ö ÙÒ Ö Ó Ô ÖØ ¹
     ÙÐ Öº Ð Ñ ØÓ Ó
¼¾   Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡                      ´ ¼¾ µ ¼¾ ¼¿
         bool inside_graph(GT & gr) const { return g == &gr; }
     Ö ØÓÖÒ true × gr × Ð Ñ ×ÑÓ Ö Ó ÕÙ Ñ Ò Ð Òר Ò      Ó ØÓ Path<GT>º
         Ä Ð × Path<GT> Ð ÐÓ× Ø ÔÓ× ÓÒ ÖÒ ÒØ × ÐÓ× ÒÓ Ó× Ý Ö Ó× Ð Ö Ó                            Ð
     × Ù ÒØ Ñ Ò Ö
¼¾    Ì ÔÓ× Ô Ø ¼¾ ≡                                        ´ ¼¾ µ
           typedef typename GT::Node_Type Node_Type;
           typedef typename GT::Arc_Type Arc_Type;
7.4. TAD camino sobre un grafo (Path<GT>)                                                603



     ÄÓ Ñ ×ÑÓ × ÔÐ Ô Ö ÐÓ× ÔÙÒØ ÖÓ× ÒÓ Ó× Ý Ö Ó× ÓÒ Ð Ü Ô ÓÒ                            ÕÙ ×ØÓ× ×
     Ñ Ò Ò Ñ Ò Ö ÔÖ Ú
¼¿    Å Ñ ÖÓ× ÔÖ Ú Ó× Ô Ø ¼¾ +≡                  ´ ¼¾ µ ¼¾ ¼¿
         typedef typename GT::Node Node;
         typedef typename GT::Arc Arc;
         ÆÙ ×ØÖ Ñ Ò Ö      Ö ÔÖ × ÒØ Ö ÙÒ Ñ ÒÓ × Ñ ÒØ ÐÓ× Ö Ó× ÕÙ ÐÓ Óѹ
     ÔÓÒ Òº ר ÓÖÑ × Ò Ô Ò ÒØ                 Ó× Ò Ö × × Ø Ð × ÓÑÓ ÕÙ × ØÖ Ø ÙÒ
     ÑÙÐØ Ö Ó¸ ÙÒ Ö Ó¸ Ø Ø Ö º ÈÙ ×ØÓ ÕÙ Ò List Graph<Node, Arc> Ý Ò ×Ù
       Ö Ú Ó List Digraph<Node, Arc>¸ ÙÒ Ö Ó ÒÓ ÜÔÖ × Ð Ö ÓÒ¸ × Ò × Ö Ó Ò¹
         Ö Ù Ð × Ð ÒÓ Ó ÓÖ Òº       ר ÑÓ Ó¸ Ð ÓØÖÓ ÒÓ Ó Ð Ö Ó × Ö Ð ×Ù ×ÓÖ Ò Ð
       Ñ ÒÓº
         Ä Ó × ÖÚ ÓÒ ÒØ Ö ÓÖ ×Ù Ö Ð × Ù ÒØ Ö ÔÖ × ÒØ ÓÒ         רÖÙ ØÙÖ   ØÓ×
          ÔÙÒØÓ Ð Ñ ÒÓ
¼¿    Å Ñ ÖÓ× ÔÖ Ú Ó× Ô Ø ¼¾ +≡                        ´ ¼¾ µ ¼¿ ¼¿
       struct Path_Desc
       {
         Node * node; // nodo origen
         Arc * arc; // arco adyacente
         Path_Desc(Node * _node = NULL, Arc * _arc = NULL) : node(_node), arc(_arc) {}
       };
       ¬Ò ×
       Path Desc¸   Ù×   Ò ÙÒ × ¼¿¸ ¼ ¸ Ò       ¼ º
       ר ÑÓ Ó¸ ÙÒ Ñ ÒÓ × Ö ÔÖ × ÒØ ÓÑÓ ÙÒ Ð ×Ø                  Path Desc
¼¿   Å Ñ ÖÓ× ÔÖ Ú Ó× Ô Ø ¼¾ +≡                                           ´ ¼¾ µ    ¼¿
       DynDlist<Path_Desc> list;
     Í× × DynDlist ¿ Ò     Path Desc   ¼¿ º
       Ä ÓÖÑ ØÖ ÓÒ Ð             ½¾           Ð Ö Ö ÙÒ Ñ ÒÓ × ÙÒÓ Ú Ó ÕÙ Ö ¬ Ö          ÙÒ Ø ÖÑ ¹
     Ò Ó Ö Ó
¼¿    Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø             ¼¾ +≡                     ´ ¼¾ µ      ¼¾    ¼¿
       Path(GT & _g, void * __cookie = NULL) : g(&_g), cookie(__cookie) { /* empty */ }
     Í× × Path ¼¾ º
     Ð ÓÒרÖÙ ØÓÖ Ò ÙÒ Ñ ÒÓ Ú Ó ×Ó Ö Ð Ö Ó gº
       Ç × ÓÒ ÐÑ ÒØ ÔÙ Ö ÕÙ Ö Ö× Ð ÓÒרÖÙ ØÓÖ ÔÓÖ ÓÑ × ÓÒ
¼¿   Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡                     ´ ¼¾ µ                   ¼¿    ¼¿
       Path(void * __cookie = NULL) : g(NULL), cookie(__cookie) { /* empty */ }
     Í× × Path ¼¾ º
     Ð Ù Ð ÒÓ Ø Ò Ö Ó ×Ó Óº
        È Ö ÓÑ ÒÞ Ö ÓÔ Ö Ö ×Ó Ö ÙÒ Ñ ÒÓ Ú Ó Ý ÕÙ Ò Ö Ù Ð × ×Ù ÒÓ Ó Ò Ðº
      ×ØÓ × Ö Ð Þ Ñ ÒØ Ð × Ù ÒØ ÔÖ Ñ Ø Ú
¼¿   Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡                  ´ ¼¾ µ ¼¿ ¼
       void init(Node * start_node) { list.append(Path_Desc(start_node)); }
     Í× × Path Desc ¼¿ º
       ½¾
          ÒÖ Ð      Ð ØÖ     ÓÒ ÙÒ ÒÓ ×Ø Òר ØÙ º
604                                                                 Cap´
                                                                           ıtulo 7. Grafos



    ÓÒ start node × ÒÓ Ó Ò Ó Ð Ñ ÒÓº
      Ë ÔÙ        Ö ÐÓ Ñ ×ÑÓ Ò Ø ÑÔÓ ÓÒרÖÙ ÓÒ Ñ ÒØ
¼   Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡                  ´ ¼¾ µ               ¼¿    ¼
      Path(GT & _g, Node * start_node, void * __cookie = NULL)
        : g(&_g), cookie(__cookie) { init(start_node); }
    Í× × Path ¼¾ º
     ÓÒ start node × Ð ÒÓ Ó Ò Ó Ð Ñ ÒÓº
       ÈÙ ×ØÓ ÕÙ × Ô ÖÑ Ø Ð Ö Ö ÙÒ Path<GT> × Ò ×Ô ¬ Ö ×Ù Ö Ó¸     ÑÓ× × Ò Ö
    ÙÒ ×ÕÙ Ñ ÕÙ Ô ÖÑ Ø ×Ô ¬ ÖÐÓ¸ ÐÙ Ó            Ð Ö Ó ÙÒ Path<GT>º È Ö ÐÐÓ¸
    ÔÖÓÚ ÑÓ× Ð × Ù ÒØ ÔÖ Ñ Ø Ú
¼    Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡                      ´ ¼¾ µ ¼  ¼
      void set_graph(GT & __g, Node * start_node = NULL)
      {
        clear_path();
        g = &__g;
        if (start_node == NULL)
          return;
        init(start_node);
      }
        Ä ÐÓÒ ØÙ     ÙÒ Ñ ÒÓ × Ð ÒÙÑ ÖÓ Ö Ó× ÕÙ ÐÓ ÓÑÔÓÒ Òº Ò ÒÙ ×ØÖ ×ØÖÙ ¹
    ØÙÖ      ØÓ׸ ר Ò ÓÖÑ ÓÒ ×Ø       ÔÓÖ Ð ÒÙÑ ÖÓ Ð Ñ ÒØÓ× Ð ØÖ ÙØÓ list
¼    Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡                     ´ ¼¾ µ ¼ ¼
      const size_t & size() const { return list.size(); }
     Ì Ñ Ò × ÔÓ× Ð ÔÖ ÙÒØ Ö × Ð Ñ ÒÓ ×Ø Ó ÒÓ Ú Ó
¼   Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡                 ´ ¼¾ µ                ¼     ¼
      bool is_empty() const { return list.is_empty(); }
      Ä Ð ÑÔ Þ      ÙÒ Ñ ÒÓ ÓÒ× ×Ø Ò ÓÖÖ Ö ØÓ Ó× ×Ù× ÒÓ Ó× Ý Ö Ó׸ÐÓ Ù Ð × Ö Ð Þ
    ÓÒ Ð ÓÔ Ö ÓÒ × Ù ÒØ
¼   Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡                     ´ ¼¾ µ ¼      ¼
      void clear_path()
      {
        while (not list.is_empty())
          list.remove_first();
      }
    Ä Ù Ð Ú Ð Ð ×Ø Path Descº
       × ÔÓ× Ð ÓÒרÖÙ Ö ÙÒ Ñ ÒÓ ÓÔ          ÓØÖÓ Ñ ÒÓ Ó × Ò ÖÐÓ
¼    Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡                             ´ ¼¾ µ   ¼     ¼
      Path(const Path & path) : g(path.g), list(path.list) { /* empty */ }
      Path & operator = (const Path & path)
      {
        clear_path();
        g    = path.g;
        list = path.list;
        return *this;
      }
    Í× × Path ¼¾ º
7.4. TAD camino sobre un grafo (Path<GT>)                                      605



    Ä × Ò ÓÒ Ð ÑÔ      Ð Ñ ÒÓ ×Ø ÒÓ ÒØ × ÓÔ Ö Ð Ñ ÒÓ ÓÖ Ò pathº
       list.get last()->arc   ר Ö¸ siempre¸ Ò NULLº      ר ÑÓ Ó¸ list.get first()->node
     × Ð ÔÖ Ñ Ö ÒÓ Ó Ð Ñ ÒÓ Ñ ÒØÖ × ÕÙ list.get last()->node Ð ÙÐØ ÑÓº Ð Ö Ó¹
    ÖÖ Ó Ð Ñ ÒÓ × ×Ø Ò Ù ÒØÖ ÐÓ× Ö Ó× Ñ ÒØ Ð ÑÔÓ node                   Path Desc
       listº
       ÄÙ Ó Ø Ò Ö ÙÒ Ñ ÒÓ Ò Ó × Ö¸ ÓÒ ×Ù ÔÖ Ñ Ö ÒÓ Ó¸ Ð ÓÒרÖÙ ÓÒ Ð
      Ñ ÒÓ × Ö Ñ Ø Ò ÖÐ ÐÓ× Ö Ó׺ È Ö ÐÐÓ¸ × ×ÔÓÒ Ð × Ù ÒØ ÓÔ Ö ÓÒ
¼    Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡                      ´ ¼¾ µ ¼ ¼
      void append(Arc * arc)
      {
        Path_Desc & last_path_desc = list.get_last(); // ultimo elemento de list
        last_path_desc.arc         = arc;
        list.append(Path_Desc(g->get_connected_node(arc, last_path_desc.node)));
      }
    Í× × Path Desc ¼¿ º
      ÇØÖ ÓÖÑ       Ò Ö ÙÒ ÓÑÔÓÒ ÒØ Ð Ñ ÒÓ × ×Ô ¬ Ö Ð × Ù ÒØ ÒÓ Ó Ò ÐÙ Ö
     Ð Ö Óº È Ö ÐÐÓ¸ × ÔÖÓÚ Ð append() ÔÓÖ ÒÓ Ó
¼   Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡                   ´ ¼¾ µ ¼ ¼
      void append(Node * node)
      {
        if (list.is_empty())
          {
            init(node);
            return;
          }
        Node * last_node = get_last_node();
        Arc * arc        = search_arc(*g, last_node, node);
        append(arc);
      }
    Ä ÖÙØ Ò × Ð          ÔÓÖÕÙ ÔÙ     ÖÖ Ö Ñ Ù         × ×Ó Ö ÑÙÐØ Ö Ó× Ý ÑÙÐØ ¹
     Ö Ó׺
       ÄÓ ÓÑÙÒ Ò Ð ÓÒרÖÙ ÓÒ        Ñ ÒÓ× × ÔÓÖ Ð ÜØÖ ÑÓ ÒÓÑ Ò Ó ÙÐØ ÑÓ ÒÓ Ó º
    Ë Ò Ñ Ö Ó¸ Ó × ÓÒ ÐÑ ÒØ × ÔÓ× Ð ÜØ Ò Ö Ð Ñ ÒÓ ÔÓÖ Ð ÔÖ Ñ Ö ÒÓ Ó × Ö¸
     Ò Ö ÙÒ ÒÙ ÚÓ ÒÓ Ó Ó Ö Ó Ø Ð ÕÙ ×Ø Ú Ò Ð ÔÖ Ñ ÖÓº ×ØÓ × Ö Ð Þ Ñ ÒØ Ð ×
     ÓÒØÖ Ô ÖØ × insert()º
       ÄÓ× ÜØÖ ÑÓ× ÙÒ Ñ ÒÓ × ÓÒ×ÙÐØ Ò Ñ ÒØ Ð × ÔÖ Ñ Ø Ú × × Ù ÒØ ×
¼    Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡                       ´ ¼¾ µ ¼    ¼
      Node * get_first_node() { return list.get_first().node; }
      Node * get_last_node() { return list.get_last().node; }
      Arc * get_first_arc() { return list.get_first().arc; }
      Arc * get_last_arc()
      {
        typename DynDlist<Path_Desc>::Iterator it(list);
        it.reset_last();
        it.prev();
        return it.get_current().arc;
      }
    Í× × DynDlist ¿ Ò     Path Desc   ¼¿ º
606                                                             Cap´
                                                                       ıtulo 7. Grafos



         ר × ÖÙØ Ò ×¸ ÕÙ Þ Ð ÕÙ Ñ Ö ÙÒ ÜÔÐ ÓÒ × get last arc()º Ê ÓÖ ÑÓ×
    ÔÖ Ñ ÖÓ ÕÙ ÙÒ DynDlist<T> ×ÓÐÓ ÔÙ             Ö× ÔÓÖ ×Ù× ÜØÖ ÑÓ׺ Ë × × ÙÒ
     Ð Ñ ÒØÓ Ö ÒØ ¸ ÒØÓÒ × × Ò × Ö Ó Ö ÓÖÖ Ö Ð × Ù Ò              ØÖ Ú × ÙÒ Ø Ö ÓÖº
       ÓÖ      Ò¸ get last arc()    Ö ØÓÖÒ Ö Ð ÙÐØ ÑÓ Ö Ó Ð Ñ ÒÓ¸ Ô ÖÓ ×Ø ÒÓ ×
     Ò Ù ÒØÖ Ò Ð ÙÐØ ÑÓ Path Desc list¸ × ÒÓ Ò Ð Ô ÒÙÐØ ÑÓº À ÐÐ Ð Ö ÞÓÒ ÔÓÖ Ð
     Ù Ð Ð Ø Ö ÓÖ × ÔÓ× ÓÒ Ò Ð ÙÐØ ÑÓ Path Desc Ý ÐÙ Ó Ö ØÖÓ            ÙÒ ÔÓ× ÓÒº
     ר ÓÖÑ ¸ × Ð Ô ÒÙÐØ ÑÓ Path Desc ×              Ð ÙÐØ ÑÓ Ö Óº
        ÅÙ Ó× Ð ÓÖ ØÑÓ׸ ×Ó Ö ØÓ Ó ÐÓ× ÕÙ      ØÙ Ò Ö ØÖÓ ×Ó ´ ØÖ Ò µ¸ ÓÒרÖÙÝ Ò
      Ñ ÒÓ× ÙÝÓ× ÜØÖ ÑÓ× ¬Ò Ð ×      Ò × Ö ÓÖÖ Ó׺ ÈÓÖ ×Ø Ö ÞÓÒ¸ × Ò ×Ô Ò× Ð Ð
    × Ù ÒØ ÔÖ Ñ Ø Ú
¼    Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡                           ´ ¼¾ µ ¼     ¼
     void remove_last_node()
     {
       list.remove_last();
       list.get_last().arc = NULL;
     }
    Ð Ù Ð ÓÖÖ Ð ÙÐØ ÑÓ Ö Ó ´ ÙÒØÓ ÓÒ ×Ù ÒÓ Óµ Ð Ñ ÒÓº
        ÄÙ Ó    ÓÒרÖÙ Ó ÙÒ Ñ ÒÓ¸ ÔÙ Ö ÕÙ Ö Ö× Ö ÓÖÖ ÖÐÓº È Ö ×ØÓ × ÔÖÓÚ ÙÒ
     Ø Ö ÓÖ ÙÒØÓ ÓÒ ÙÒ Ñ Ð        ÙÒ ÓÒ × ÓÔ Ö ÓÒ ×Ó Ö ÐÓ× ÓÑÔÓÒ ÒØ × ÙÒ
       Ñ ÒÓº
¼    Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡                    ´ ¼¾ µ ¼   ¼
     class Iterator : public DynDlist<Path_Desc>::Iterator
     {
        // ...
       Path_Desc & get_curr_path_desc()
       {
         return this->DynDlist<Path_Desc>::Iterator::get_current();
       }
       Node * get_current_node() { return this->get_curr_path_desc().node; }
       Arc * get_current_arc()
       {
         return this->get_curr_path_desc().arc;
       }
       bool has_current_arc() const
       {
         return this->has_current() and not this->is_in_last();
       }
       bool has_current_node() const { return this->has_current(); }
     };
    Í× × DynDlist ¿ Ò   Path Desc   ¼¿ º
¼   Å Ñ ÖÓ× ÔÙ Ð Ó×       Ô Ø ¼¾     +≡                        ´ ¼¾ µ   ¼
     template <class Operation> void operate_on_nodes()
     {
       for (Iterator it(*this); it.has_current(); it.next())
         Operation () (it.get_current_node());
     }
     template <class Operation> void operate_on_arcs()
     {
7.5. Recorridos sobre grafos                                                     607



         for (Iterator it(*this); it.has_current(); it.next())
           Operation () (it.get_current_arc());
     }


    7.5      Recorridos sobre grafos
    Ë Ò ÒØ ¬ Ó Ó× Ô ØÖÓÒ × ÖÕÙ Ø Ô Ó× ÜÔÐÓÖ ÓÒ¸ ÐÐ Ñ Ó× Ù×ÕÙ                 Ò ÔÖÓ¹
     ÙÒ      Ý Ò ÑÔÐ ØÙ ¸ Ö ×Ô Ø Ú Ñ ÒØ º Ä Ñ ÝÓÖ    ÐÓ× Ð ÓÖ ØÑÓ× ×Ó Ö Ö Ó× Ü
    ÙÒ Ù ÓØÖ Ó Ñ × Ñ Ò Ö × ÜÔÐÓÖ ÖÐÓº
        Ä         ÐÓ× Ö ÓÖÖ Ó× × × Ñ Ð Ö ÐÓ× ÐÓ× Ö ÓÐ × ×ØÙ Ó× Ò Ð Ô ØÙÐÓ Ü
     × Ö ÙÒ Ô ØÖÓÒ ÔÖÓ × Ñ ÒØÓ ÔÖ × ÒØ Ò ÑÙ Ó× Ð ÓÖ ØÑÓ׺
        ÄÓ× Ö ÓÖÖ Ó× Ý ÓØÖ × ÔÖ Ñ Ø Ú × × × Ò ÐÐÓ× × ¬Ò Ò Ò Ð Ö ÚÓ tpl graph utils.Hº
    7.5.1    Iteradores filtro
      × ÔÖÓ Ð ÕÙ Ð              Ø Ö ÓÖ × Ò Ù ÒØÖ ÒØÖ ÐÓ× Ñ × ÙØ Ð × Ý Ú Ö× Ø Ð × Ô ØÖÓÒ ×
          × ÒÓ ½ º À ר Ð ÔÖ × ÒØ ¸ Ù ÐÕÙ Ö          ÐÓ× Ø Ö ÓÖ × ÕÙ ÑÓ× ÔÖ × ÒØ Ó
     ÓÑÔÖ Ò Ð ØÓØ Ð           Ð ÓÒ ÙÒØÓ Ð ÕÙ Ö ¬ Ö Òº
         ÈÖÓÒØ Ñ ÒØ ÓÒר Ø Ö ÑÓ× ÕÙ ÑÙ Ó× ÔÖÓ Ð Ñ × ÑÓ Ð Þ Ó× ×Ó Ö Ö Ó× Ö ÕÙ Ö Ò
    ×Ӭר      × ×ØÖÙ ØÙÖ ×       ØÓ׸ × ÓÑÓ Ð ÑÔÐ Ó         ר ÒØÓ× Ð ÓÖ ØÑÓ׺       Ù×
         רӏ ÔÓÖ ÐÓ ÓÑÙÒ¸ × Ò Ö ÒרÖÙÑ ÒØ Ö Ð ÓÖ ØÑÓ× ×Ó Ö Ö Ó× ÒÓ × ÙÒ Ø Ö
    × Ò ÐÐ ¸ Ñ Ü Ñ Ù Ò Ó ÔÖ Ø Ò ÑÓ× Ð Ò Ö Ð             Ý ÒÖ         º Ò Ò ÙÖ ¸ ÐÓ×
      Ö Ó× Ö ÕÙ Ö Ò ×Ø ÒØ ×Ô Ó Ñ ÑÓÖ ¸ ÔÓÖ ÐÓ ÕÙ ×Ù ÓÖÖ ÔÙ × Ö Ö Ø Ó Ò
    ÑÙ × × ØÙ ÓÒ ×º
           Ú × × ÑÔÓÖØ ÒØ ÔÖÓ × Ö Ð ÙÒ × Ð × × ÒÓ Ó Ó Ö Ó ÙÒ Ö Ó Ý × ÖØ ×
    ÓØÖÓ׺ ÍÒ Ñ Ò Ö Ò Ö              ¬ÐØÖ Ö Ð × Ù Ò ÔÖ × ÒØ ÔÓÖ ÙÒ Ø Ö ÓÖ ÓÒ× ×Ø
     Ò Ù× Ö ÙÒ “iterador filtro”¸ Ð Ù Ð Ò ÒØ Ö Þ × ÑÙÝ × Ñ Ð Ö ÙÒ Ø Ö ÓÖ ØÖ ¹
       ÓÒ Ðº È Ö ÙÒ Ø Ö ÓÖ ¬ÐØÖÓ          ×Ô ¬ Ö× Ð ÓÒ ÙÒØÓ ×Ó Ö Ð Ù Ð × Ø Ö ¸ ÙÒ
     Ø Ö ÓÖ ×Ó Ö ÕÙ Ð ÓÒ ÙÒØÓ Ý ÙÒ ÙÒ ÓÒ ÕÙ              × ÙÒ Ð Ñ ÒØÓ ÚÙ ÐØÓ ÔÓÖ Ð Ø ¹
    Ö ÓÖ        Ó ÒÓ × Ö ÑÓ×ØÖ Ó ÔÓÖ Ð Ø Ö ÓÖ ¬ÐØÖÓº ËÙ ×Ô ¬ ÓÒ Ö × Ò Ð Ö ÚÓ
    filter iterator.H¸ Ð Ù Ð ×        ¬Ò ÓÑÓ × Ù
¼    ¬ÐØ Ö Ø Ö ØÓÖºÀ ¼ ≡
         template <class Container, class It, class Show_Item>
     class Filter_Iterator : public It
     {
          Å Ñ ÖÓ× ÔÖ Ú Ó×         Ø Ö ÓÖ ¬ÐØÖÓ ¼
          Å Ñ ÖÓ× ÔÙ Ð Ó×        Ø Ö ÓÖ ¬ÐØÖÓ ¼
     };
      ¬Ò ×
     Filter Iterator¸   Ù×   Ò ÙÒ × ¼ ß½¼º
         Ù Ò Ó × Òר Ò ÙÒ Ø Ö ÓÖ ¬ÐØÖÓ ´Filter Iteratorµ¸ × ×Ô ¬ Ò ØÖ × Ð × ×
    Ô Ö Ñ ØÖ Þ × × ÙÒ ÐÓ Ý Ñ Ò ÓÒ Ó
      ½º Container Ð Ø ÔÓ ÓÒ ÙÒØÓ ×Ó Ö Ð Ù Ð × Ø Ö º
      ¾º It ÙÒ Ø Ö ÓÖ ×Ó Ö Ð ÓÒ ÙÒØÓ Containerº
         ÁÒØ ÖÒ Ñ ÒØ ¸ Ð Ø Ö ÓÖ ¬ÐØÖÓ Òר Ò ÙÒ Ø Ö ÓÖ Ø ÔÓ Container::It ÓÒ Ð
          Ù Ð × Ö ÓÖÖ Ò ÐÓ× Ð Ñ ÒØÓ× Containerº
608                                                          Cap´
                                                                    ıtulo 7. Grafos



      ¿ºShow Item ÙÒ      Ð × ÕÙ Ø ÖÑ Ò × ÙÒ Ð Ñ ÒØÓ Ð ÓÒ ÙÒØÓ              Ó ÒÓ
        × Ö ÑÓ×ØÖ Ó ÔÓÖ Ð Ø Ö ÓÖº ×ØÓ × Ö Ð Þ Ñ ÒØ Ð ÐÐ Ñ ÐÓ                bool
        Show Item::operator()(Container&, Container::Item Type&) Ð Ù Ð        Ö¹
        ØÓÖÒ Ö true × Ð Ð Ñ ÒØÓ    ÑÓ×ØÖ Ö× Ó false ÐÓ ÓÒØÖ Ö Óº
      Ä ÑÔÐ ÒØ ÓÒ × Ö Ð Ø Ú Ñ ÒØ × Ò ÐÐ Ý ×Ø ÙÒ Ñ ÒØ        Ò Ð Ö Ú ÓÒ ÔÙ Ð
     Container::Itº È Ö ÒרÖÙÑ ÒØ Ö Ð ÐÐ Ñ    ÓÒÚ Ò    Show Item()()¸ Ö ÕÙ Ö ÑÓ×
    Ù Ö Ö Ð ÓÒ ÙÒØÓ Ò ÔÙÒØ ÖÓ ÓÑÓ ØÖ ÙØÓ Ð Ð ×
¼   Å Ñ ÖÓ× ÔÖ Ú Ó× Ø Ö ÓÖ ¬ÐØÖÓ ¼ ≡                     ´¼µ ¼
     Container * cont;
          Ñ ×¸ ÑÔÐ Ö ÑÓ× Ó× Ø ÔÓ ÖÙØ Ò ×¸ ÙÒ Ô Ö ÓÐÓ Ö Ð Ø Ö ÓÖ Ò ÙÒÓ ÐÓ×
    ÜØÖ ÑÓ× Ð × Ù Ò Ý ÓØÖ Ô Ö Ú ÒÞ ÖÐÓ ×Ø × Ö Ð Þ Ò Ð × Ù ÒØ Ñ Ò Ö
¼   Å Ñ ÖÓ× ÔÖ Ú Ó× Ø Ö ÓÖ ¬ÐØÖÓ ¼ +≡                 ´¼µ ¼
     void goto_first_valid_item()
     {
       try
         { // colocarse en el primer elemento que acepte Show_Item
           for (It::reset_first(); true; It::next())
             if (not It::has_current() or Show_Item () (*cont, It::get_current()))
               return;
         }
       catch (std::overflow_error) { /* se queda en overflow sin propagar */ }
     }
     void forward()
     {
       It::next();
       try
         {     // avanzar hasta el siguiente item que acepte Show_Item
           for (;true; It::next())
             if (not It::has_current() or Show_Item () (*cont, It::get_current()))
               return;
         }
       catch (std::overflow_error) { /* se queda en overflow sin propagar */ }
     }
    goto first valid item() ÓÐÓ  Ð Ø Ö ÓÖ ¬ÐØÖÓ Ò Ð ÔÖ Ñ Ö Ð  Ñ ÒØÓ Ú Ð Ó ÕÙ Ø Ö¹
    Ñ Ò Show Item()(*cont,It::get current())µº forward() ÐÓ    Ú ÒÞ ×Ø Ð ÔÖ Ñ Ö
    ÔÓ× ÓÒ Ú Ð × ÙÒ Ð Ñ ×ÑÓ Ö Ø Ö Óº Ò Ñ × ÓÔ Ö ÓÒ × Ü ×Ø Ð ÔÓ× Ð                 ÕÙ
    ÒÓ Ý Ñ × Ð Ñ ÒØÓ× ÕÙ ÑÓ×ØÖ Öº Ò ×Ø ×Ó¸ Ð Ø Ö ÓÖ                    Ö× Ò Ð ×Ø Ó
         × ÓÖ std::overflow error × Ò ÔÖÓÔ Ö Ð Ü Ô ÓÒ ´ Ñ ÒÓ× ÕÙ ×            ÙØ ÙÒ
    next() ×Ó Ö ÙÒ Ø Ö ÓÖ × ÓÖ      Ó¸ Ý ×Ø × Ð Ö ÞÓÒ ÔÓÖ Ð Ù Ð Ð ÔÖ Ñ Ö next() ×Ó Ö
    forward() ÒÓ ØÖ Ô Ð Ü Ô ÓÒµº
        À Ý Ó× ÖÙØ Ò × Ò ÐÓ × Ô Ö ÓÐÓ Ö Ð Ø Ö ÓÖ Ò Ð ÙÐØ ÑÓ Ð Ñ ÒØÓ Ý Ú ÒÞ Ö
     ØÖ × goto last valid item() Ý backward()º
        Ä × ÖÙØ Ò ×    ÚÒ     ¬Ò × Ó ÙÐØ Ò Ð ÒÑ × Ö Ñ ÒØÓ            Ð Ñ ÒØÓ× ØÖ Ú ×
       Show Itemº Å     ÒØ ÐР׸ Ð ÒרÖÙÑ ÒØ ÓÒ       × Ö ÐÑ ÒØ ÓÑÔÖ Ò× Ð
¼    Å Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ ¬ÐØÖÓ ¼ ≡                               ´¼µ
     typedef typename It::Item_Type Item_Type;
     Filter_Iterator() : cont(NULL) { /* empty */ }
     Filter_Iterator(Container & cont) : It(cont), cont(&cont)
7.5. Recorridos sobre grafos                                                 609



      {
        goto_first_valid_item();
      }
      Filter_Iterator(const Filter_Iterator & it) : It(it), cont(it.cont) { /* empty */ }
      Filter_Iterator & operator = (const Filter_Iterator & it)
      {
        *((It*) this) = it;
        cont = it.cont;
        return *this;
      }
      void next() { forward(); }
      void prev() { backward(); }
      void reset_first() { goto_first_valid_item(); }
      void reset_last() { goto_last_valid_item(); }
    Í× × Filter Iterator ¼ º
    Å ÒØ ר ÔÖ Ñ Ø Ú × ÙÒ Ø Ö ÓÖ ¬ÐØÖÓ Ó Ö Ð ÐÙ× ÓÒ × Ö ÙÒ Ø Ö ÓÖ ALEPH
    ´Ó Ö Ü Ø Ñ ÒØ ×Ù Ñ ×Ñ ÒØ Ö Þµº
        ÄÓ× Ø Ö ÓÖ × ALEPH Ù ÖÓÒ × Ò Ó× Ô Ò× Ò Ó Ò Ð Ö Ò Ñ ÒØÓ Ý Ð Ð º
      × ÔÖ Ò Ô ÐÑ ÒØ ÔÓÖ × Ö ÞÓÒ ÕÙ ×ØÓ× ÒÓ ÜÔÓÖØ Ò ÙÒ ÒØ Ö Þ Ö Ñ Ò × ÒØ Ð
    Ð     Ð ÓØ stdc++¸ ÔÙ × ×Ø ÙÐØ Ñ ÓÒ×ÙÑ Ø ÑÔÓ× Ò ÓÔ × Ø ÑÔÓÖ Ð ×½¿ º
    7.5.1.1     Iterador filtro de arcos de un nodo

      Ð Ø Ö ÓÖ ¬ÐØÖÓ ÕÙ     ÑÓ×     ¬Ò Ö × ÔÐ Ð ÔÖ Ø Ñ ÒØ Ù ÐÕÙ Ö ÓÒØ Ò ÓÖ
        ALEPH ÐÓ× Ö Ð ÓÒ Ó× ÐÓ× Ö Ó× Ò ÐÙ× Ú º ÓÒ× Ù ÒØ Ñ ÒØ ¸ × ÙÒ Ð × Ö ÙÒ×¹
    Ø Ò × Ð ÓÖ ØÑ ׸ Ð ÙÒ × Ú × Ò × Ø Ö ÑÓ× Ø Ö Ö Ñ Ò Ö ÕÙ ÐÓ× Ð ÓÖ ØÑÓ× ÒÓ
    Ú Ò Ð ÙÒ × Ð × × Ö Ó× ÐÓ× Ù× Ó× Ô Ö Ð ÙÐÓ Ô Ö Ð ×¸ ÔÓÖ ÑÔÐÓº ÈÓÖ ×Ø Ö ÞÓÒ¸
       ¬Ò Ö ÑÓ× ÙÒ Ø Ö ÓÖ ÜØ ÖÒÓ Ð Ð × List Graph<Node, Arc> ÕÙ ÓÔ Ö ×Ó Ö ÐÓ×
     Ö Ó× ÙÒ ÒÓ Óº Ì Ð Ð × × ×Ô ¬         Ð ÑÓ Ó × Ù ÒØ
¼    ÁØ Ö ÓÖ × ¬ÐØÖÓ× List Graph<Node, Arc> ¼ ≡               ½¼
          template <class GT, class Show_Arc = Default_Show_Arc<GT> >
      class Node_Arc_Iterator :
        public Filter_Iterator<typename GT::Node*, typename GT::Node_Arc_Iterator,
                                Show_Arc>
      {
      };
    Í× × Filter Iterator ¼ Ò   Node Arc Iterator    º
    Ë Ò Ó ÖÚ          Filter Iterator ÓÒ Ð Ø Ö ÓÖ    ÒÓ Ó× Ð Ö Ó¸ Ð ÒØ Ö Þ
    Node Arc Iterator ×    ÒØ    List Graph<Node, Arc> Node Arc Iteratorº
       Ä Ð × ÐÓ Ð Node Arc Iterator Ø Ò ÙÒ ×Ô Ð Þ ÓÒ ÔÓÖ ÓÑ × ÓÒ ÕÙ ÒÓ Ö Ð Þ
    Ò Ò ÙÒ ¬ÐØÖ Ó Ý ÕÙ × ÑÔÐ ÒØ Ó ÔÓÖ Ð Ð × Default Show Arcº × Ö¸ × ÒÓ ×
     ×Ô ¬ ÙÒ Ð × ¬ÐØÖÓ Ö Ó׸ ÒØÓÒ × Node Arc Iterator ÑÙ ×ØÖ ØÓ Ó× ÐÓ× Ö Ó׺
        ר        Ø Ö ÓÖ × Ö     ÑÔÐ Ñ ÒØ ÙØ Ð Þ Ó ÔÓÖ ÐÓ× Ð ÓÖ ØÑÓ×
     Ö Ó׺        ËÙ Ú Ö× ÓÒ ÔÓÖ ÓÑ × ÓÒ × Ò × ÑÔ ÒÓ ÕÙ Ú Ð ÒØ Ð Ø Ö ÓÖ
     ½¿
          ÍÒ   ÑÔÐÓ Ø Ô Ó
    for (typename set<T>::iterator = s.begin(); it < s.end(); it++)
610                                                                         Cap´
                                                                                    ıtulo 7. Grafos



     List Graph<Node, Arc> Node Arc Iterator¸
                                           ÔÙ × Ð Ö Ø Ö ÒÐ Ò                            ÐÓ× Ñ ØÓ Ó×
     Ð Ô ÖÑ Ø Ð ÓÑÔ Ð ÓÖ Ö Ð Þ Ö Ö Ø Ñ ÒØ Ð ÐÐ Ñ º
     7.5.1.2      Iterador filtro de arcos

     Ë Ñ Ð Ö Ð Ø Ö ÓÖ ÒØ Ö ÓÖ¸ Ô ÖÓ Ô Ö ØÓ Ó× ÐÓ× Ö Ó×              Ö Ó¸ ¬Ò ÑÓ× ÙÒ Ø Ö ÓÖ ¬ÐØÖÓ
½¼    ÁØ Ö ÓÖ × ¬ÐØÖÓ× List Graph<Node, Arc> ¼ +≡                            ¼     ½¼
             template <class GT, class Show_Arc = Default_Show_Arc<GT> >
         class Arc_Iterator :
           public Filter_Iterator<GT, typename GT::Arc_Iterator, Show_Arc>
         {
         };
     Í× × Arc Iterator       Ò   Filter Iterator   ¼º
         Ð Ù×Ó    ר Ø Ö ÓÖ × Ñ ÒÓ× Ö Ù ÒØ ÕÙ               Node Arc Iteratorº

     7.5.1.3      Iterador filtro de nodos

     ÅÙ Ó Ñ ÒÓ× Ö Ù ÒØ Ù×Ó¸ Ô ÖÓ ÔÐ Ù× Ð ¸ ¬Ò ÑÓ× ÙÒ Ø Ö ÓÖ ¬ÐØÖÓ ×Ó Ö ÐÓ× ÒÓ Ó×
½¼   ÁØ Ö ÓÖ × ¬ÐØÖÓ× List Graph<Node, Arc> ¼ +≡                ½¼
             template <class GT, class Show_Node = Default_Show_Node<GT> >
         class Node_Iterator :
           public Filter_Iterator<GT, typename GT::Node_Iterator, Show_Node>
         {
         };
     Í× × Filter Iterator ¼ Ò      Node Iterator        º

     7.5.2       Recorrido en profundidad
       Ò ÙÒ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ     ¸ Ð Ö Ó × Ú × Ø ØÖ Ø Ò Ó ÓÒ ÓÖÑ Ö Ð Ñ ÒÓ Ñ ×
     Ð Ö Ó ÔÓ× Ð ÒØ × Ö ØÓÖÒ Ö ÙÒ ÒÓ Ó Ý Ú × Ø Óº
          × ÙÒ Ö ÓÖÖ Ó Ò ÓÐ Ö ÙÖ× Ú º Ë dft(p) Ù × Ð ÔÖ Ñ Ø Ú Ö ÓÖÖ Ó ×Ó Ö
      Ð ÒÓ Ó p¸ ÒØÓÒ × Ð Ð ÓÖ ØÑÓ Ò Ö Ð × Ö ÓÑÓ × Ù º
     Algoritmo 7.1 (Recorrido en profundidad desde el nodo p )                     Ð Ð ÓÖ ØÑÓ × Ö ¹
      ÙÖ× ÚÓ ÓÒ ÔÖÓØÓØ ÔÓ dft(p) ÓÒ p × Ð ÒÓ Ó ØÙ Ð Ú × Ø º
        Ë Ù× ÙÒ Ú Ö Ð ÐÓ Ð¸ num nodes¸ ÙÝÓ Ú ÐÓÖ Ò Ð × ÖÓ¸                        Ô Ö ×Ò Ð ÖÐ    Ò¹
     Ø           ÒÓ Ó× Ú × Ø Ó׺
          ½º Ë p ר Ô ÒØ Ó × Ö¸ Ý Ù Ñ Ö Ó ÓÑÓ Ú × Ø Ó¸ =⇒ Ö ØÓÖÒ º
          ¾º È ÒØ Ö pº
          ¿º ÁÒ Ö Ñ ÒØ Ö num nodes Ò ÙÒÓº
           º Ë num nodes == |V| =⇒ ØÓ Ó× ÐÓ× ÒÓ Ó× Ð Ö Ó Ò × Ó Ö ÓÖÖ Ó× Ý Ð Ð ÓÖ ØÑÓ
             Ø ÖÑ Ò º
           º È Ö ØÓ Ó Ö Ó a Ý ÒØ p
              ´ µ Ë q Ð ÒÓ Ó Ò ÒØ × p ØÖ Ú × Ð Ö Ó aº
7.5. Recorridos sobre grafos                                                   611



          ´ µ ÄÐ Ñ Ö    dft(q);

         Ë Ð      Ò ÔÖÓ ÙÒ          ÔÓÖÕÙ ¸ Ó Ð ÒÓ Ó p¸ Ð Ö ÓÖÖ Ó ÒÓ Ö Ú × ÙÒ ÒÙ ÚÓ
      Ö Ó p −→ r ר ÒÓ         Ö Ö ÓÖÖ Ó ÓÑÔÐ Ø Ñ ÒØ Ò ÔÖÓ ÙÒ         Ð ÒÓ Ó q × Ð
      Ö Ó ØÙ Ð p −→ qº
         ÅÙ × Ú × ÙÒ ÔÖÓ Ð Ñ ×Ó Ö Ö Ó× ÓÒ× ×Ø Ò Ù× Ö ÙÒ ÒÓ Ó ÓÒ Ð ÙÒ × Ö ¹
     Ø Ö ×Ø × ÕÙ Ö ÔÖ × ÒØ Ò Ð ×ÓÐÙ ÓÒº ÈÓÖ ×Ø Ö ÞÓÒ¸ ÐÓ× Ö ÓÖÖ Ó× ×Ó Ö Ö Ó× Ø Ñ Ò
     × Ð ÒÓÑ Ò ¸ Ò ×Ø ÒØ Ñ ÒØ ¸ Ù×ÕÙ × º ÑÔÐ Ö ÑÓ× ÓÑÓ × ÒÓÒ ÑÓ¸ ÒØÓÒ ×¸ Ð
      ÜÔÖ × ÓÒ Ù×ÕÙ       Ò ÔÖÓ ÙÒ       Ô Ö Ö Ö Ö Ð Ö ÓÖÖ Ó ÓÑÓÒ ÑÓº
         Î ÑÓ× ÓÖ ÓÑÓ Ó ¬ Ö Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ               º È Ö ÐÐÓ¸ Ü Ñ Ò ÑÓ× Ð
     ÔÖÓØÓØ ÔÓ Ð ÙÒ ÓÒ Ö ÙÖ× Ú ÕÙ ÒÓ× ÑÔÐ ÒØ Ö Ð Ð ÓÖ ØÑÓ º½
½½    Ê ÓÖÖ Ó Ò ÔÖÓ ÙÒ         ½½ ≡                                  ½¾
      template <class GT, class SA> inline static   bool
      __depth_first_traversal(GT &                  g,
                              typename GT::Node *   node,
                              typename GT::Arc *    arc,
                              bool                  (*visit)(GT & g,
                                                             typename GT::Node *,
                                                             typename GT::Arc *),
                             size_t &               count);
       ר × Ð ÖÙØ Ò Ö ÙÖ× Ú ÕÙ ÑÔÐ ÒØ Ð Ð ÓÖ ØÑÓ º½º
           depth first traversal<GT,SA>() ÓÔ Ö ×Ó Ö ÙÒ Ó ØÓ Ö Ú Ó List Graph<Node,        Arc>¸
      Ð Ù Ð ×Ø ÜÔÖ × Ó ÔÓÖ Ð Ô Ö Ñ ØÖÓ Ø ÔÓ GTº Ð Ô Ö Ñ ØÖÓ Ø ÔÓ SA Ö ÔÖ × ÒØ Ð Ö Ø ¹
     ÖÓ ÑÖ           ÐÓ× Ö Ó× ÒØ ÖÒ Ñ ÒØ ¸ depth first traversal() ÙØ Ð Þ ÙÒ Ø Ö ÓÖ
     ¬ÐØÖÓ ×Ó Ö ÐÓ× Ö Ó׺    ר ÑÓ Ó¸ × ÔÙ       ÓÒ¬ ÙÖ Ö Ð Ö ÓÖÖ Ó Ô Ö ÓÒ× Ö Ö Ó ÒÓ
      Ö Ó× Ð Ö Ó × ÙÒ Ð ÙÒ Ö Ø Ö Óº
         ÄÓ× Ô Ö Ñ ØÖÓ× Ð ÙÒ ÓÒ × × Ö Ò ×
        ½º g Ð Ö Ó ×Ó Ö Ð Ù Ð × Ö Ð Þ Ð Ö ÓÖÖ Óº
        ¾º node Ð ÒÓ Ó ÕÙ × ×Ø Ú × Ø Ò Óº
        ¿º arc Ð Ö Ó × Ð Ù Ð × ÐÐ          Ð ÒÓ Ó nodeº
         º (*visit)() ÔÙÒØ ÖÓ Ð ÙÒ ÓÒ Ú × Ø º Ë ×Ø ÔÙÒØ ÖÓ × ×Ø ÒØÓ ÒÙÐÓ¸
            ÒØÓÒ × Ð ÙÒ ÓÒ Ú × Ø × ÒÚÓ Ð ÔÖ Ñ Ö Ú Þ ÕÙ × Ú ÙÒ ÒÓ Óº
           Ä ÙÒ ÓÒ Ú × Ø Ø Ò ÐÓ× × Ù ÒØ × Ô Ö Ñ ØÖÓ×
            ´ µ g Ð Ö Ó ÕÙ × ×Ø Ú × Ø Ò Óº
            ´ µ n ÔÙÒØ ÖÓ Ð ÒÓ Ó Ú × Ø Óº
            ´ µ a ÔÙÒØ ÖÓ Ð Ö Ó ÕÙ ÓÒ Ù Ð ÒÓ Ó Ú × Ø Ó nº
           (*visit)() Ö ØÓÖÒ ÙÒ Ú ÐÓÖ ÐÓ Óº Ë × true ÒØÓÒ × × ×ÙÑ ÕÙ Ð Ù×ÕÙ
           Ø ÖÑ Ò Ó ÐÓ ÓÒØÖ Ö Ó¸ Ð Ù×ÕÙ ÔÖÓ× Ù ×Ø ÕÙ (*visit)() Ö ØÓÖÒ ØÖÙ
           Ó ×Ø ÕÙ × Ý Ò Ú × Ø Ó ØÓ Ó× ÐÓ× Ö Ó× Ý ÒÓ Ó× Ð Ö Ó × ÙÒ ×Ù ÓÒ Ø Ú º
         º node counter Ô Ö Ñ ØÖÓ ÔÓÖ Ö Ö Ò ÕÙ ÓÒØ Ð Þ Ð ÒØ                 ÒÓ Ó× Ú × ¹
           Ø Ó׺
612                                                           Cap´
                                                                      ıtulo 7. Grafos



      depth first traversal() Ö ÓÖÖ Ö    ÙÖ× Ú Ñ ÒØ Ð Ö Ó Ô ÖØ Ö Ð ÒÓ Ó nodeº Ð
     Ú ÐÓÖ  Ö ØÓÖÒÓ (*visit)() Ô ÖÑ Ø      Ø Ò Ö Ð Ù×ÕÙ × ÙÒ Ð ÙÒ Ö Ø Ö Ó ×Ô ¬ Ó
      Ñ      Ó Ò Ð ÙÒ ÓÒº
         Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ       × ÒÚÓ ÔÓÖ ÔÖ Ñ Ö Ú Þ × Ð × Ù ÒØ ÖÙØ Ò              Ù×Ó
     ÔÙ Ð Ó
½¾    Ê ÓÖÖ Ó Ò ÔÖÓ ÙÒ        ½½ +≡                              ½½ ½¾
           template <class GT, class SA> inline
       size_t depth_first_traversal(GT &                g,
                                    typename GT::Node * start_node,
                                    bool (*visit)(GT & g, typename GT::Node *,
                                                  typename GT::Arc *) )
       {
         g.reset_bit_nodes(Depth_First); // reiniciar bit Depth_First de los nodos
         g.reset_bit_arcs(Depth_First); // reiniciar bit Depth_First de los arcos
         size_t counter = 0; // inicialmente no se ha visitado ning´n nodo
                                                                   u
         __depth_first_traversal <GT, SA> (g, start_node, NULL, visit, counter);
         return counter;
       }
     Ð Ù Ð ÜÔÐÓÖ Ò ÔÖÓ ÙÒ          Ð Ö Ó g Ô ÖØ Ö Ð ÒÓ Ó start node Ý Ö ØÓÖÒ Ð ÒØ
        ÒÓ Ó× Ú × Ø Ó׺ Ë × ×Ô ¬ ÙÒ ÙÒ ÓÒ Ú × Ø ¸ ÒØÓÒ × ×Ø × ÒÚÓ                  ÚÞ
     ÕÙ ÙÖ ÒØ Ð ÜÔÐÓÖ ÓÒ × × Ù Ö ÙÒ ÒÓ Óº
         À Ý ÓØÖ Ú Ö× ÓÒ¸ ÕÙ ÒÓ Ö ÕÙ Ö ×Ô ¬ Ö Ð ÒÓ Ó Ò Ó¸ ÕÙ ÖÖ Ò Ð Ú × Ø
     ×Ó Ö ÙÒ ÒÓ Ó Ù ÐÕÙ Ö Ð Ö Ó ´ Ð ÕÙ ÖÖÓ get first node()µº
           ÒØ × ÑÔÐ ÒØ Ö depth first traversal() × ÓÒÚ Ò ÒØ Ö Ð Þ Ö Ð ÙÒ × Ð Ö ¹
     ØÓÖ × ÕÙ ÒÓ× ÝÙ Ö Ò ÓÑÔÖ Ò Ö Ð Ó Ó ×Ø Ý ÓØÖÓ× Ð ÓÖ ØÑÓ× ×Ó Ö Ö Ó׺
          Ò ÔÖ Ñ Ö ÐÙ Ö¸ ÓÖ ÑÓ× Ð Ñ Ò Ö          Ñ Ö Ö ÐÓ× ÒÓ Ó׸ Ð Ù Ð × Ö Ñ ÒØ
     ÙÒ Ø        ÓÒØÖÓÐ Ò ÒÙ ×ØÖÓ ×Ó¸ Ð Ø Depth Firstº Ò × ÙÒ Ó ÐÙ Ö¸          ØÓ×
        Ð Ö Ö Ð Ö ÓÖÖ Ó¸ Ú ÑÓ× Ñ Ö Ö¸ Ø Ñ Ò¸ ÐÓ× Ö Ó× Ú ×ØÓ׺ ×ØÓ ÒÓ× ÓÖÖ ÐÐ Ñ ×
     Ö ÙÖ× Ú × ÕÙ Ú Ò       Ö ×Ó Ö ÒÓ Ó× ÔÖ Ú Ñ ÒØ Ú × Ø Ó× × ÓØÖÓ Ñ ÒÓº À ×
     Ð × Ð Ö ØÓÖ × Ô ÖØ Ò ÒØ ׸ ÔÓ ÑÓ× ÔÖ × ÒØ Ö Ð ÖÙØ Ò Ö ÙÖ× Ú
½¾    Ê ÓÖÖ Ó Ò ÔÖÓ ÙÒ         ½½ +≡                                    ½¾
           template <class GT, class SA> inline static bool
       __depth_first_traversal(GT &                g,
                               typename GT::Node * node,
                               typename GT::Arc * arc,
                               bool                (*visit)(GT & g,
                                                            typename GT::Node *,
                                                            typename GT::Arc *),
                               size_t &            count)
       {
         if (IS_NODE_VISITED(node, Depth_First))
           return false;
         NODE_BITS(node).set_bit(Depth_First, true); // marca nodo visitado
         count++;
             // Aqu´ se visita el nodo mediante la funci´n de visita
                   ı                                     o
             // recorrer arcos de node y visitar recursivamente nodos conectados
         for (Node_Arc_Iterator<GT, SA> it(node); it.has_current(); it.next())
           {
             typename GT::Arc * arc = it.get_current_arc();
7.5. Recorridos sobre grafos                                                       613



         if (IS_ARC_VISITED(arc, Depth_First))
           continue;
         ARC_BITS(arc).set_bit(Depth_First, true); // marca arco actual visitado
         if (__depth_first_traversal<GT, SA>(g, it.get_tgt_node(), arc, visit, count))
           return true; // ya se explor´ cabalmente it.get_tgt_node()
                                       o
        }
      return false; // retorne y siga explorando
  }
Í× × Node Arc Iterator       º
   ÆÓØ × ÕÙ Ð ÓÒ             ÓÒ   Ø Ö ÓÒ Ð for ÓÒ× Ö Ð      Ø Ò ÓÒ × Ý ×     ÒÚר Ó
ØÓ Ó× ÐÓ× ÒÓ Ó׺
                         B              J       H            M

                                                                       L
             A                    D         E        N

                                                                       I
                         C              F       G            K


                                      ÙÖ º½ ÍÒ Ö Ó   ÑÔÐÓ
      Ò ÖØÓ ÑÓ Ó¸ Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ            × Ö Ñ Ò × ÒØ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó ×Ó Ö
ÙÒ Ö Óк           Ó¸ ×Ù ÒØ ÖÔÖ Ø ÓÒ ÓÑÓ Ö ÓÐ × ÑÙÝ ÙØ Ð Ô Ö ×ØÙ Ö Ð × ÒØ Ó
Ð ÜÔÐÓÖ ÓÒº Ä ¬ ÙÖ º½ ÐÙ×ØÖ Ó× ÒØ ÖÔÖ Ø ÓÒ × Ö ÓÖÖ Ó Ô Ö Ð Ö Ó Ð
¬ ÙÖ º½ ÙÒ Ö ÓÖÖ Ó ÕÙ ÓÑ ÒÞ Ò Ð ÒÓ Ó A Ý ÓØÖÓ Ò Nº ÍÒ Ú Þ ×Ø Ð Ó Ð
ÒÓ Ó Ò Ó¸ Ð ÓÖ Ò Ú × Ø Ô Ò                 Ð ØÓÔÓÐÓ        Ð Ö Ó Ý Ð ÓÖ Ò Ò ÕÙ ×
ÔÖ × ÒØ Ò ÐÓ× Ö Ó× Ò Ð × Ð ×Ø ×      Ý Ò             ÒÓ Óº
      Ð ÓÖ ØÑÓ× × Ó× Ò Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ              × Ù× Ò Ù Ò Ó × ×Ø Ñ ÕÙ Ð
ÒÓ Ó ×ÓÐÙ ÓÒ ×Ø Ð ÒÓ Ð Ò Óº ÆÓØ ÑÓ× ÕÙ ÐÓ× Ö ÓÐ × ÔÖÓ ÙÒ                             Ð
¬ ÙÖ º½ ×ÓÒ Ð Ö Ó× Ý Ð Ó× ¸ ÓÒ ÔÓ × Ö Ñ ×º Ð ÔÖ Ñ ÖÓ × ÔÐ ÒÓ ÔÓÖÕÙ Ô ÖØ Ö
   A × ÔÓ× Ð Ú × Ø Ö ÒØ Ö Ñ ÒØ Ð Ö Ó × Ò Ò ×              Ö Ö × Ö ÙÒ ÒÓ Ó Ý Ú × Ø Óº
  Ò Ð × ÙÒ Ó Ö ÓÐ Ú ÑÓ× ÙÒ Ö Ö ×Ó Ð ÒÓ Ó Gº
    Ë Ð Ö Ó × ÓÒ ÜÓ¸ ÒØÓÒ × Ð Ù×ÕÙ            Ò ÔÖÓ ÙÒ       Ö ÕÙ Ö ÐÓ ×ÙÑÓ O(V) +
O(E) = O(Ñ Ü(V, E)) Ô ×Ó× Ô Ö Ò Ð Þ Ö ÐÓ× Ø×         ÐÓ× ÒÓ Ó× Ý Ö Ó׺ ÈÓר Ö ÓÖÑ ÒØ ¸
Ð ÖÙØ Ò ÓÑ ÒÞ Ò Ð ÔÖ Ñ Ö ÒÓ Ó Ð Ö Ó Ý ÐÓ ×ÙÑÓ ÐÐ Ñ Ö ÙÖ× Ú Ñ ÒØ V Ú ×
    depth first traversal()º ÙÖ ÒØ          ÐÐ Ñ Ö ÙÖ× Ú × Ö ÓÖÖ ¸ ÒØ Ö Ñ ÒØ ¸
Ð Ð ×Ø        Ý Ò        Ð ÒÓ Ó Ú × Ø ÐÓ ÕÙ ÑÔÐ ÕÙ ¸ Ò Ð Ô ÓÖ ÐÓ× ×Ó׸ ×
Ú × Ø Ö Ò ØÓ Ó× ÐÓ× Ö Ó׺ ÈÓÖ Ø ÒØÓ¸ Ð Ù×ÕÙ       Ò ÔÖÓ ÙÒ        ÓÒ Ð ×Ø × ÒÐ Þ × ×¸
Ô Ö Ð Ô ÓÖ ×Ó¸ O(V) + O(E)º
      Ð Ô ÓÖ Óר Ò ×Ô Ó Ð ÜÔÐÓÖ ÓÒ Ò ÔÖÓ ÙÒ                  Ó ÙÖÖ × Ð Ö Ó × Ù ÖØ ¹
Ñ ÒØ ÓÒ ÜÓº ÍÒ Ò            ÓÒ ×ØÓ × ÑÙ ×ØÖ Ñ Ö Ò Ó Ð Ö ÓÐ Ö ÓÖ Ò ÔÖÓ ÙÒ¹
           Ð ¬ ÙÖ º½ ¹´ µº Ç × ÖÚ ÑÓ× ÕÙ Ø Ò ÙÒ ×ÓÐ Ö Ñ ÐÓ ÕÙ × ÕÙ Ú Ð ÒØ
ÙÒ Ð ×Ø ÒÐ Þ º Ò ×Ø ×Ó¸ Ð ÔÖÓ ÙÒ               Ö ÙÖ× Ú × ÔÖÓÔÓÖ ÓÒ Ð O(V)º
    Ë Ð Ö Ó ÒÓ × ÓÒ ÜÓ¸ ÒØÓÒ × Ð Ö ÓÖÖ Ó ÙÐÑ Ò × Ò                  Ö Ú × Ø Ó ØÓ Ó× ÐÓ×
ÒÓ Ó× ÕÙ ÐÐÓ× ÕÙ × Ò Ú × Ø Ó× Ô Ò Ö Ò Ð ÒÓ Ó ÔÓÖ Ð Ù Ð × Ò Ð Ù×ÕÙ º
      Ð Ö ÓÖÖ Ó ÕÙ ÑÓ× ÔÖ × ÒØ Ó Ù× ÒÓ Ó׸ ÔÓÖ ×Ó ÔÓ ÑÓ× Ø Ò ÖÐÓ Ù Ò Ó ×
614                                                            Cap´
                                                                      ıtulo 7. Grafos



                  A

                  B

                  J                                     N

                  D                                     E

                  C                                     D

                  F                                     A

                  E                                     B

                  G                                     J

                  H                                     H

                  M                                     M

                  N                                     L

                  L                                     G

                  I                          F                       K

                  K                          C                       I

                 ´µ                                 ´ µ ÁÒ Ó Ò Æ
                 ÁÒ Ó Ò


             ÙÖ º½     Ö ÓÐ ×   Ö   ÓÖ ×   ÔÖÓ ÙÒ        Ð Ö Ó      Ð ¬ ÙÖ º½

      Ò Ú × Ø Ó ØÓ Ó× ÐÓ× ÒÓ Ó׺ Ò Ó × ÓÒ ×¸ Ð Ù×ÕÙ × ÔÐ ÒØ Ò ÙÒ ÓÒ   Ö Ó׸
     Ò ÙÝÓ ×Ó Ð Ö ÓÖÖ Ó Ø Ò × Ö Ñ × ÓרÓ×Ó¸ ÔÙ × Ð Ø Ò ÓÒ         Ö× Ù Ò Ó
    × Ý Ò Ú × Ø Ó ØÓ Ó× ÐÓ Ö Ó׺
    7.5.3   Conectividad entre grafos
    ÍÒ Ð × ÔÐ ÓÒ × Ñ × × ÑÔÐ × Ð Ù×ÕÙ              Ò ÔÖÓ ÙÒ      × Ð ÔÖÙ      ÓÒ ¹
    ØÚ         ÙÒ Ö Óº Ä         × × Ö ÓÖÖ Ö Ð Ö Ó Ý Ú Ö ¬ Ö × Ù ÖÓÒ Ú × Ø Ó× ØÓ Ó×
    ÐÓ× ÒÓ Ó׸ Ò ÙÝÓ ×Ó ÔÓ ÑÓ× ÓÒ ÐÙ Ö ÓÒ ÖØ ØÙ ÕÙ Ð Ö Ó × ÓÒ ÜÓº
        À Ý ÙÒ ÓÒ× Ö ÓÒ           ÓÒ Ð ÕÙ     ÒÙ ×ØÖÓ Ð ÓÖ ØÑÓ Ý ÓÒ× ×Ø Ò Ö Ú × Ö Ð
      ÒØ         Ö Ó׸ Р٠и × × Ñ ÒÓÖ Ð ÒÙÑ ÖÓ ÒÓ Ó× Ñ ÒÓ× ÙÒÓ¸ ÒØÓÒ × ÔÓ ÑÓ×
     ÓÒ ÐÙ Ö ÕÙ Ð Ö Ó × Ò ÓÒ ÜÓ Ý ÓÖÖ ÖÒÓ× Ð Ö ÓÖÖ Óº
        Ä ÖÙØ Ò Ö ×ÙÐØ ÒØ × ÑÔÐ ÒØ ¸ ÒØÓÒ ×¸ Ð × Ù ÒØ Ñ Ò Ö
½    ÈÖÙ        ÓÒ Ø Ú     ½ ≡
          template <class GT, class SA> inline
     bool test_connectivity(GT & g)
     {
       if (g.get_num_arcs() < g.get_num_nodes() - 1)
7.5. Recorridos sobre grafos                                                                 615



           return false;
         return depth_first_traversal <GT, SA> (g, NULL) == g.get_num_nodes();
     }
        test connectivity() Ö ØÓÖÒ true ×                 Ð Ö Ó × ÓÒ ÜÓ¸ false ÐÓ ÓÒØÖ Ö Óº
        Ä ÔÖÙ ×Ó Ö Ð ÒÙÑ ÖÓ Ö Ó× Ú Ð                       ÓÒ Ö × Ð Ô Ò ÔÓÖÕÙ ØÓÑ Ø ÑÔÓ O(1) Ý
    ÔÙ       ÓÖÖ Ö Óר × Ð Ò Ð ×º ÑÔ ÖÓ¸ ר                × ÑÔÐ ÔÖÙ      ÓÒ Ø Ú  ÒÓ × ÓÖÖ Ø
    × ØÖ Ø ÑÓ× ÓÒ ÙÒ ÑÙÐØ Ö Óº
        test connectivity() ÒÓ ÓÔ Ö ×Ó Ö                   Ö Ó׺ ר Ð ×             ÓÒ Ø Ú   × ×ØÙ
     Ò Ü º º½º

    7.5.4   Recorrido en amplitud
      ÓÑÓ ÐÓ ÑÓ× Ò       Ó¸ Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ     ÑÙÐ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó ×Ó Ö ÙÒ
     Ö ÓÐ ØÖ Ø     Ö ÐÓ Ñ × ÔÖÓ ÙÒ Ó Ò Ò Ú Ð ÒØ × Ö Ö × Ö ÔÖÓ × Ö Ö Ó× ÙÒ ÒÓ
    Ö ÓÖÖ Ó׺
        ÇØÖ ÓÖÑ ÔÖÓ × Ö Ð Ö ÓÖÖ Ó ×Ó Ö ÙÒ Ö Ó ÕÙ ÔÖ Ú Ð ÐÓ× ÒÓ Ó× Ñ × Ö ÒÓ×
    ×Ó Ö ÐÓ× Ñ × Ð ÒÓ× Ý ÕÙ ¸ × ÙÒ Ð Ò ÓÐ Ð Ö Ó¸ ÔÙ × Ö Ñ × ÓÒÚ Ò ÒØ ¸ × Ð
    Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ º Ò ×Ø Ð ×           Ù×ÕÙ ÒÓ × ÔÖÓ × ÙÒ ÒÓ Ó ÙÒ Ò Ú Ð i
       ר ÕÙ ÒÓ × Ý Ò ÔÖÓ × Ó ØÓ Ó× ÐÓ× ÒÓ Ó× Ð Ò Ú Ð ÒØ Ö ÓÖ i − 1 × Ö¸ ÙÒ
     ×Ô       Ö ÓÖÖ Ó× ÔÓÖ Ò Ú Ð ×º Ð Ñ Ó Ô Ö Ù Ö Ö ÐÓ× ÒÓ Ó× ÔÓÖ Ò Ú Ð × × Ð Ñ ×ÑÓ
    ÕÙ Ô Ö ÐÓ× Ö ÓÐ × ÙÒ ÓÐ º Ò ÒÙ ×ØÖÓ ×Ó¸ Ù× ÑÓ× ÙÒ ÓÐ ÔÙÒØ ÖÓ× Ö Ó׺
                     A
     B      C            D             F                                        N
     J           H           E         G                    E    H        G     M       L    I   K
            M            N       L         K         D      J    F
                         I                     A     B      C

                ´ µ ÁÒ Ó Ò                                           ´ µ ÁÒ Ó Ò Æ


                 ÙÖ º½               Ö ÓÐ ×    Ö   ÓÖ ×     ÑÔÐ ØÙ      Ð Ö Ó       Ð ¬ ÙÖ º½
        Ä      Ö Ò × Ò Ð ÒØÖ Ð Ù×ÕÙ        Ò ÑÔÐ ØÙ Ý Ð ÔÖÓ ÙÒ       × ÕÙ Ð
     ÑÔÐ ØÙ ÜÔÐÓÖ ÐÓ× Ñ ÒÓ× Ñ × ÓÖØÓ× ÔÖ Ñ ÖÓ¸ Ñ ÒØÖ × ÕÙ Ð ÔÖÓ ÙÒ       Ø Ò
       Ö ÔÓÖ ÐÓ× Ñ × Ð Ö Ó׺ ר      Ó× Ò     Ô Ö Ø Ñ ÒØ ÓÒØÖ ×Ø Ò Ó ÐÓ× Ö ÓÐ ×
       Ö ÓÖÖ Ó׸ ÐÓ× Ù Ð × ×ÓÒ Ñ × ÖÓÒ Ó×Ó× Ô Ö Ð Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ ´Ú Ö ¬ ÙÖ ×
    Ü º½ ´Ô Ò      ½ µ Ý Ü º½ ´Ô Ò ½ µµº
        Ä ÔÖ Ñ Ø Ú ÒÓ × Ö ÙÖ× Ú º Ì Ò Ð Ñ ×Ñ ÒØ Ö Þ Ô Ö Ñ ØÖÓ× ÕÙ ×Ù ÓÒØÖ Ô ÖØ
     Ò ÔÖÓ ÙÒ      Ý × ÒרÖÙÑ ÒØ Ð × Ù ÒØ ÑÓ Ó
½    Ê ÓÖÖ Ó Ò ÑÔÐ ØÙ ½ ≡                                      ¾
          template <class GT, class SA> inline size_t
     breadth_first_traversal(GT &                g,
                             typename GT::Node * start,
                             bool (*visit)(GT &, typename GT::Node *,
                                           typename GT::Arc *) )
     {
616                                                             Cap´
                                                                   ıtulo 7. Grafos



      g.reset_bit_nodes(Breadth_First);
      g.reset_bit_arcs(Breadth_First);
      DynListQueue<typename GT::Arc*> q; // cola de arcos pendientes
          // ingresar a la cola los arcos de nodo start
      for (Node_Arc_Iterator<GT, SA> it(start); it.has_current(); it.next())
        q.put(it.get_current_arc());
      NODE_BITS(start).set_bit(Breadth_First, true); // marcar visitado start
      size_t node_counter = 0; // contador de nodos visitados
          // mientras queden arcos en cola y resten todos por visitar
      while (not q.is_empty() and node_counter < g.get_num_nodes())
        {
          typename GT::Arc * arc = q.get(); // extraiga arco m´s cercano de la cola
                                                              a
          ARC_BITS(arc).set_bit(Breadth_First, true); // marcar arco
          typename GT::Node * src = g.get_src_node(arc);
          typename GT::Node * tgt = g.get_tgt_node(arc);
          if (IS_NODE_VISITED(src, Breadth_First) and IS_NODE_VISITED(tgt, Breadth_First))
            continue;
          typename GT::Node * visit_node = // seleccionar nodo a visitar
            IS_NODE_VISITED(src, Breadth_First) ? tgt : src;
               // Aqu´ se visita el nodo mediante la funci´n de visita
                     ı                                    o
          NODE_BITS(visit_node).set_bit(Breadth_First, true);
          node_counter++;
              // insertar en cola arcos del nodo reci´n visitado
                                                     e
          for (Node_Arc_Iterator<GT, SA> it(visit_node); it.has_current(); it.next())
            {
              typename GT::Arc * curr_arc = it.get_current_arc();
              if (IS_ARC_VISITED(curr_arc, Breadth_First))
                continue;
                  // revise nodos del arcos para ver si han sido visitados
              if (IS_NODE_VISITED(g.get_src_node(curr_arc), Breadth_First) and
                  IS_NODE_VISITED(g.get_tgt_node(curr_arc), Breadth_First))
                continue; // nodos ya visitados ==> no vale la pena meter el arco
              q.put(curr_arc);
            }
        }
      return node_counter;
  }
Í× × DynListQueue ½ ¼   Ò   Node Arc Iterator   º
    Ä Ù×ÕÙ         Ò ÑÔÐ ØÙ Ø Ò       × Ö Ñ × ÓרÓ× Ò Ø ÑÔÓ Ý Ò ×Ô Ó ÕÙ Ð
ÔÖÓ ÙÒ       ¸ ÔÙ × Ð Ò ÓÐ Ñ ÒØÓ Ñ ÒØ Ò Ö Ó× ÕÙ ÒÓ Ò × Ó Ú × Ø Ó× ÐÓ ÕÙ ÒÓ
×Ù       ÓÒ Ð ÑÔ Ð Ñ ÒØÓ Ð Ù×ÕÙ             Ò ÔÖÓ ÙÒ      ÕÙ ÐÑ Ò Ö Ó× Ú × Ø Ó׺
     Ð Ô ÓÖ ×Ó          Ù ÓÒ Ð Ù×ÕÙ Ò ÑÔÐ ØÙ Ó ÙÖÖ Ù Ò Ó × Ò × Ö Ó Ú × Ø Ö
ØÓ Ó× ÐÓ× Ö Ó× ÒØ ×         Ö Ú ×ØÓ ØÓ Ó× ÐÓ× ÒÓ Ó× Ó × ¸ O(E)¸ Ù Ð × Ð Ñ ×ÑÓ Ð
  Ù×ÕÙ      Ò ÔÖÓ ÙÒ      º
    È Ö Ò Ð Þ Ö Ð Óר Ò ×Ô Ó × ÓÒÚ Ò ÒØ Ó × ÖÚ Ö Ð Ò Ñ                       Ò× Ö ÓÒ
Ý Ð Ñ Ò ÓÒ          Ö Ó× Ò Ð ÓÐ º Ù Ò Ó × ×             Ð ÓÐ ÙÒ Ö Ó Ô ÖØ Ò ÒØ Ð
Ò Ú Ð i ´Ö ×Ô ØÓ Ð ÒÓ Ó Ò Óµ¸ Ð ÓÐ ÔÙ             ÓÒØ Ò Ö Ö Ó× Ð Ò Ú Ð i Ý Ð ×ÙÔ Ö ÓÖ
i + 1º Ë ÒØ ÖÔÖ Ø ÑÓ× Ð Ö ÓÖÖ Ó ÓÑÓ Ð Ö ÓÖÖ Ó ÔÓÖ Ò Ú Ð ×          ÙÒ Ö Óи ÒØÓÒ ×
ÔÓ ÑÓ× Ô Ö Ø ÖÒÓ× ÕÙ ÐÓ ×ÙÑÓ × Ø Ò Ö Ò E/2 Ö Ó× Ò Ð ÓÐ ÐÓ ÕÙ ÕÙ Ú Ð
ÙÒ Óר O(E)¸ Ù Ð ÔÙ × Ö ×Ø ÒØ Ñ ÝÓÖ ÕÙ Ð Óר Ò ×Ô Ó O(V) Ð Ö ÓÖÖ Ó
7.5. Recorridos sobre grafos                                                 617



     Ò ÔÖÓ ÙÒ      º
           Ù Ò Ó Ö ÓÖÖ Ö Ò ÔÖÓ ÙÒ      Ó Ò ÑÔÐ ØÙ Ä Ö ×ÔÙ ×Ø Ô Ò              Ú Ö Ó×
       ØÓÖ ×¸ ÐÓ× Ù Ð × Ð ÔÖ Ò Ô Ð × Ð ÔÖ ×ÙÒ ÓÒ        Ö Ò ÕÙ × Ø Ò        Ö      Ð
    ÒÓ Ó ×ÓÐÙ ÓÒ¸ ÓÒ× Ö Ò Ó ÕÙ Ð Ö Ø Ö Ó       Ö Ò Ò Ð ØÓÔÓÐÓ           Ð Ö Ó Ý ×Ù
      Ò× º Ë Ð ÒÓ Ó ×ÓÐÙ ÓÒ × ÔÖ ×ÙÑ Ö ÒÓ¸ ÒØÓÒ × Ð Ö Ø Ö Ó ÑÔÐ ØÙ Ø Ò
       Ò ÓÒØÖ ÖÐÓ Ñ × Ö Ô Ó ÕÙ Ð ÔÖÓ ÙÒ      º
        À Ý ÙÒ Ó × ÖÚ ÓÒ Ø ÖÑ Ò ÒØ Ô Ö Ð Ù×ÕÙ Ò ÑÔÐ ØÙ ÙÒ ÒÓ Ó Ô ÖØ ÙÐ Ö
     ר ÓÒ ÖØ ØÙ Ò Ù ÒØÖ Ð Ñ ÒÓ Ñ × ÓÖØÓ Ò ÒØ                 Ö Ó׺
        ÈÓÖ ÓרÙÑ Ö ¸ ÒÓ Ò Ö Ð ¸ × Ø Ò       Ö Ð Þ Ö ÔÖ Ñ ÖÓ ÙÒ Ù×ÕÙ      Ò ÔÖÓ ÙÒ¹
           Ô Ö Ò ÓÒØÖ Ö ÙÒ ×ÓÐÙ ÓÒ Ó ÙÒ ÔÖÓÜ Ñ ÓÒ Ý¸ ÔÓר Ö ÓÖÑ ÒØ ¸ Ô Ö ¬Ò ÖÐ ¸ ×
    Ö Ð Þ ÙÒ Ò ÑÔÐ ØÙ º
    7.5.5   Prueba de ciclos
    ÈÐ ÒØ ÑÓ× Ð ÔÖÓ Ð Ñ           Ø ÖÑ Ò Ö × Ü ×Ø Ó ÒÓ ÙÒ ÐÓ Ô ÖØ Ö ÙÒ ÒÓ Ó Ô ÖØ ÙÐ Ö
    src nodeº Ò ×Ø       ×Ó¸ ÙÒ Ö Ø Ö Ó Ò ÔÖÓ ÙÒ      Ô Ö ÔÖ Ö Ð Ð ÑÔÐ ØÙ ÔÓÖÕÙ
    ÒÓ ×Ø Ø ÑÔÓ Ò ×Ô Ó Ò ÐÓ× Ö Ó× Ô Ö Ð × ÕÙ ÙÒ ÒÓ ×ÓÒ ÔÖÓ × Ó׺
       ÍÒ Ù×ÕÙ         Ò ÔÖÓ ÙÒ        Ô Ö Ð¸ × Ö¸ ÕÙ ÒÓ Ò × Ö Ñ ÒØ ÔÖ Ø Ò Ú × Ø Ö
    ØÓ Ó× ÐÓ× ÒÓ Ó׸ × ÖÚ Ô Ö Ø Ø Ö × Ü ×Ø ÙÒ ÐÓ Ô ÖØ Ö ÙÒ ÒÓ Óº Ä                  ×
     ÜÔÐÓÖ Ö Ö ÙÖ× Ú Ñ ÒØ ר Ò ÓÒØÖ Ö Ð ÒÓ Ó Ô ÖØ ¸ Ò ÙÝÓ ×Ó Ð ÔÖÙ                  ×
    ÔÓ× Ø Ú ¸ Ó ÙÐÑ Ò Ö Ð Ù×ÕÙ ¸ Ò ÙÝÓ ×Ó × Ò Ø Ú º
       ÆÙ ×ØÖ ÔÖÙ             ÐÓ × ÔÓÝ ×Ó Ö Ð × Ù ÒØ ÖÙØ Ò Ö ÙÖ× Ú
½     Ù×ÕÙ          ÐÓ ½ ≡                                          ½
         template <class GT, class SA> inline static
     bool __test_cycle(GT &                g,
                       typename GT::Node * src_node,
                       typename GT::Node * curr_node);
     test cycle()   × Ù×Ó ÔÖ Ú Ó¸ Ö Ð Þ Ð ÜÔÐÓÖ ÓÒ Ö ÙÖ× Ú Ò ÔÖÓ ÙÒ          ÔÓÖ Ð
    ÒÓ Ó curr node   Ò Ù×ÕÙ       Ð ÒÓ Ó src node Ý Ñ Ò ØÖ × Ô Ö Ñ ØÖÓ×
       ½º g Ð Ö Ó ×Ó Ö Ð Ù Ð × Ö Ð Þ Ð ÔÖÙ º
       ¾º src node Ð ÒÓ Ó Ô Ö Ð Ù Ð × Ú Ö ¬ × Ü ×Ø ÙÒ ÐÓº
       ¿º curr node × Ð ÒÓ Ó Ú × Ø Ð ÐÐ Ñ Ö ÙÖ× Ú º
    Ä ÖÙØ Ò Ö ØÓÖÒ true × × curr node × Ð ÒÞÓ Ð ÒÓ Ó Ò Ð src node Ò ×Ø
      ×Ó¸ Ü ×Ø ÙÒ ÐÓº Ë × Ö ÓÖÖ ÒØ Ö Ý Ö ÙÖ× Ú Ñ ÒØ Ð ÓÑÔÓÒ ÒØ ÓÒ Ø Ó
    curr node¸ ÒØÓÒ × ÔÓ ÑÓ× ÓÒ ÐÙ Ö ÕÙ Ô × Ò Ó ÔÓÖ curr node ÒÓ × ÔÓ× Ð Ð ÒÞ Ö
      src node Ý ÕÙ ÔÓÖ ÐÓ Ø ÒØÓ ÔÓÖ ×Ø Ú ÒÓ Ý       ÐÓº Ò ×Ø ×Ó Ö ØÓÖÒ ÑÓ× falseº
        Ä ÒØ Ö Þ ÔÙ Ð × ÔÐ ÒØ Ý × ÒרÖÙÑ ÒØ Ð × Ù ÒØ ÓÖÑ
½     Ù×ÕÙ         ÐÓ ½ +≡                                      ½   ½
         template <class GT, class SA> inline
     bool test_for_cycle(GT & g, typename GT::Node * src_node)
     {
       g.reset_bit_nodes(Test_Cycle); // reiniciar bit Test_Cycle para los nodos
       g.reset_bit_arcs(Test_Cycle); // reiniciar bit Test_Cycle para los arcos
           // explorar recursivamente a trav´s de los arcos adyacentes a src_node
                                            e
       for (Node_Arc_Iterator<GT, SA> it(src_node); it.has_current(); it.next())
618                                                               Cap´
                                                                         ıtulo 7. Grafos



            {
                typename GT::Arc * arc = it.get_current_arc();
                if (IS_ARC_VISITED(arc, Test_Cycle))
                  continue;
                ARC_BITS(arc).set_bit(Test_Cycle, true); // pintar arco
                if (__test_cycle<GT,SA> (g, src_node, it.get_tgt_node())) // ¿ciclo por arc?
                  return true; // s´ ==> retornar true y detener la exploraci´n
                                   ı                                         o
            }
              // En este punto se han explorado todos los caminos desde src_node
              // sin encontrar de nuevo a src_node ==> no existe ciclo
          return false;
      }
    Í× × Node Arc Iterator     º
          test for cycle()   Ö ØÓÖÒ   true   × Ü ×Ø ÙÒ   ÐÓ ×   src node false     ÐÓ ÓÒ¹
    ØÖ Ö Óº
        ÍÒ ÔÙÒØÓ × Ò Ð Ò ×Ø Ð ÓÖ ØÑÓ × ÕÙ ¸             ÖÒ     ÐÓ ÕÙ ÔÐ ÒØ ÑÓ× Ò Ð ×
    ×Ù ¹× ÓÒ × ÒØ Ö ÓÖ × ÓÒ ÖÒ ÒØ × Ð × Ù×Õ٠׸ ÒÓ              ÑÓ× Ø Ò ÖÒÓ× Ù Ò Ó
      Ý ÑÓ× Ú × Ø Ó ØÓ Ó× ÐÓ× ÒÓ Ó׸ ÔÙ × Ð ÙÒ ÐÓ ÔÙ Ö Ò ÓÒØÖ Ö× ÔÓÖ Ð ÙÒ Ö Ó ÕÙ
    ÒÓ Ý × Ó Ú × Ø Óº ÆÓ Ø Ò ÑÓ× Ò ×Ø ×Ó ÓØÖ ÐØ ÖÒ Ø Ú ÕÙ ÜÔÐÓÖ Ö ØÓ Ó× ÐÓ×
     Ö Ó׸ Ö ÞÓÒ ÔÓÖ Ð Ù Ð Ð Ð ÓÖ ØÑÓ × O(E) Ô Ö Ð Ô ÓÖ ×Ó Ò ÕÙ ÒÓ Ü ×Ø ÐÓº
             Ó ÐÓ ÒØ Ö ÓÖ¸ ר ÑÓ× Ð ×ØÓ× Ô Ö ÑÔÐ ÒØ Ö Ð ÜÔÐÓÖ ÓÒ Ö ÙÖ× Ú
½      Ù×ÕÙ          ÐÓ ½ +≡                                          ½
          template <class GT, class SA> inline static
      bool __test_cycle(GT &                g,
                        typename GT::Node * src_node,
                        typename GT::Node * curr_node)
      {
        if (src_node == curr_node)
          return true; // ciclo detectado!
        if (IS_NODE_VISITED(curr_node, Test_Cycle))
          return false;
        NODE_BITS(curr_node).set_bit(Test_Cycle, true); // marque nodo
            // busque los caminos desde current_node a ver si llega a src_node
        for (Node_Arc_Iterator<GT, SA> it(curr_node); it.has_current(); it.next())
          {
            typename GT::Arc * arc = it.get_current_arc();
            if (IS_ARC_VISITED(arc, Test_Cycle))
              continue;
            ARC_BITS(arc).set_bit(Test_Cycle, true); // marque arco
            if (__test_cycle<GT,SA>(g, src_node, it.get_tgt_node()))
              return true; // ciclo encontrado desde el arco actual
          }
            // En este punto se han explorado todos los caminos desde curr_node
            // sin encontrar src_node ==> no existe ciclo que pase por curr_node
        return false;
      }
    Í× × Node Arc Iterator     º
7.5. Recorridos sobre grafos                                                  619



    7.5.6    Prueba de aciclicidad
    ÍÒ Ö Ó × Ð Ó × ×Ø ÒÓ ÓÒØ Ò ÐÓ׺ ÓÑÓ ÑÙ Ó× Ð ÓÖ ØÑÓ× Ö ÕÙ Ö Ò Ú Ö ¬ Ö
     ר ÓÒ ÓÒ ×Ó Ö Ð ÙÐÓ× Ö Ó× Ô Ö Ð ×¸ × ÑÔÓÖØ ÒØ ÕÙ ×Ø ÔÖÙ × Ö Ð
     ¬ ÒØ Ñ ÒØ º
        ÍÒ Ú Ö ÒØ Ð Ð ÓÖ ØÑÓ ÒØ Ö ÓÖ ÔÖÙ             ÐÓ× ÔÙ ÙØ Ð Þ Ö× Ô Ö Ú Ö ¬ Ö
        Ð       ×Ó Ö ÙÒ Ö Ó Ò ÓÒ ÜÓº ÈÓ ÑÓ× ÒÚÓ Ö test for cycle() Ô Ö
    ÒÓ Ó Ð Ö Ó Ý¸ × ØÓ × Ð × Ù ÓÒ × ÖÖÓ Ò ÓÑÓ Ö ×ÙÐØ Ó Ð×Ó¸ ÒØÓÒ × Ð Ö Ó
     × Ð Óº
          Ð ÔÖ Ò Ô Ó Ð ÔÖÙ            Ð      × ÕÙ × ÙÖ ÒØ Ð ÜÔÐÓÖ ÓÒ Ð Ö Ó¸
    Ô × Ò Ó ÔÓÖ ÙÒ Ö Ó ÒÓ Ú × Ø Ó¸ Ú ÑÓ× ÙÒ ÒÓ Ó Ý Ú × Ø Ó¸ ÒØÓÒ × Ð Ö Ó Ø Ò ÙÒ
       ÐÓ ´ Ð ÕÙ Ô ÖÑ Ø Ö Ö × Ö Ð ÒÓ Ó Ú × Ø Ó ÔÓÖ ÙÒ Ñ ÒÓ Ö ÒØ µº Ò Ú ÖØÙ
     ר Ó × ÖÚ ÓÒ ÔÓ ÑÓ× ÔÐ ÒØ Ö Ð × Ù ÒØ ÖÙØ Ò ¸ ÔÖ Ú ¸ Ö ÙÖ× Ú ¸ ÜÔÐÓÖ ÓÒ
     Ò ÔÖÓ ÙÒ
½    ÈÖÙ            Ð    ½ ≡                                      ¾¼
          template <class GT, class SA> inline static
      bool __is_graph_acyclique(GT & g, typename GT::Node * curr_node)
      {
        if (IS_NODE_VISITED(curr_node, Is_Acyclique))
          return false;
        NODE_BITS(curr_node).set_bit(Is_Acyclique, true); // marcar nodo
        for (Node_Arc_Iterator<GT, SA> i(curr_node); i.has_current(); i.next())
          {
            typename GT::Arc * arc = i.get_current_arc();
            if (IS_ARC_VISITED(arc, Is_Acyclique))
              continue;
            ARC_BITS(arc).set_bit(Is_Acyclique, true);
            if (not __is_graph_acyclique<GT,SA>(g, i.get_tgt_node()))
              return false;
          }
            // todos los arcos recorridos sin encontrar ciclo ==> el grafo es
            // ac´clico pasando por curr_node
                 ı
        return true;
      }
    Í× × Node Arc Iterator   º
         is graph acyclique()   Ö Ð Þ ÙÒ ÔÖÙ          Ð          Ô ÖØ Ö Ð ÒÓ Ó
    curr nodeº Ë Ö ØÓÖÒ true ×    Ý Ð       false  ÐÓ ÓÒØÖ Ö Óº
        Ä Ø Ò ÓÒ × Ö Ð Þ Ù Ò Ó × Ø Ø ÙÒ ÐÓ Ò ×Ø ×Ó is graph acyclique()
    Ö ØÓÖÒ falseº Ð ÕÙ ÒÓ × Ò Ù ÒØÖ ÐÓ ÔÓÖ Ð ÙÒ Ö Ó Ý ÒØ            curr node ÒÓ
     ÑÔÐ ÕÙ ÒÓ Ü ×Ø Ð ÙÒÓ ÔÓÖ ÓØÖÓ ×Ù× Ö Ó׺ ËÓÐÓ Ù Ò Ó × Ý Ò ÜÔÐÓÖ Ó ØÓ¹
      Ó× ÐÓ× Ö Ó× curr node × Ò Ò ÓÒØÖ Ö ÐÓ × ÕÙ ÔÓ ÑÓ× ÓÒ ÐÙ Ö ÕÙ Ô × Ò Ó ÔÓÖ
    curr node Ð Ö Ó ×      Ð Óº
        Ë ÙÒ ×Ù Ö Ó ÙÒ Ö Ó ÓÒ ÜÓ × Ð Ó¸ ÒØÓÒ ×¸ × Ò ÑÔÓÖØ Ö × Ù Ð ÒÓ Ó ×
     Ò ¸ ÙÒ Ù×ÕÙ       Ò ÔÖÓ ÙÒ           Ø Ø Ö ÙÒ ÐÓ ÔÓÖ Ò Ù ÒØÖÓ ÙÒ ÒÓ Ó Ý
    Ñ Ö Óº Ë ×Ó ÒÓ Ó ÙÖÖ ¸ × Ö¸ × ÒÓ ÔÓ ÑÓ× Ö Ö × Ö Ð ÒÓ Ó ÓÖ Ò Ð Ù×ÕÙ ¸
     ÒØÓÒ ×¸ ÓÒ ØÓ     ÖØ ØÙ ¸ Ð ×Ù Ö Ó × Ð Óº Ë ×Ó ×Ù        Ô Ö ØÓ Ó× ÐÓ× ÒÓ Ó×
     ÓÒ ÜÓ׸ ÒØÓÒ × Ð Ö Ó × Ð Óº
        À Ý ÙÒ Ó × ÖÚ ÓÒ ÖÙ Ð Ò Ð ×Ó ÙÒ Ö Ó ÓÒ ÜÓ ´ÒÓ ÙÒ Ö Ó¸ ÑÙÐØ Ö Ó
620                                                           Cap´
                                                                      ıtulo 7. Grafos



     Ó ÑÙÐØ Ö Óµ × Ð ÒØ          Ö Ó× × Ñ ÒÓÖ ÕÙ Ð  ÒÓ Ó׸ ÒØÓÒ × Ð Ö Ó ÒÓ
     ÔÙ    ÓÒØ Ò Ö Ò Ò ÙÒ ÐÓº ר     Ó ÒÓ× ÓØ Ð ÔÖÙ        Ð      O(V)º Ä
     ÔÖÙ ÔÙ Ò Ö× × Ù ÐÕÙ Ö ÒÓ Ó Ý Ð × Ù ÒØ Ú Ö× ÓÒ ÔÙ Ð × Ô Ö Ø Ñ ÒØ
      ÔÐ Ð
¾¼    ÈÖÙ         Ð      ½ +≡                           ½ ¾¼
           template <class GT, class SA> inline
       bool is_graph_acyclique(GT & g, typename GT::Node * start_node)
       {
         if (g.get_num_arcs() >= g.get_num_nodes())
           return false;
         g.reset_bit_arcs(Is_Acyclique);
         g.reset_bit_nodes(Is_Acyclique);
         return __is_graph_acyclique<GT,SA>(g, start_node);
       }
           is graph acyclique()Ö Ð Þ Ð ÜÔÐÓÖ ÓÒ Ö ÙÖ× Ú Ò ÔÖÓ ÙÒ        start node
      × Ð ÒÓ Ó      Ò Ó Ð ÔÖÙ ¸ Ð Ù Ð             Ô ÖØ Ò Ö ÙÒ ÓÑÔÓÒ ÒØ         Ö Ó
      ×Ó×Ô Ó×Ó       Ø Ò Ö ÙÒ ÐÓº Ä ÙØ Ð       Ð ÒØ Ö Þ ÒØ Ö ÓÖ × Ù Ò Ó start node
        Ý × Ó Ò Ó Ò Ð ÙÒ Ð ÙÐÓ Ý × Ö ÕÙ Ö Ú Ö ¬ Ö × Ð          ÓÒ Ù× Ó ÒÓ ÙÒ ÐÓº
       ר ÖÙØ Ò ÙÒ ÓÒ Ô Ö Ù ÐÕÙ Ö Ö Ó ÓÒ ÜÓ ´× Ò ÑÔÓÖØ Ö Ð ÒÓ Ó Ò Óµ Ó Ô Ö
     Ú Ö¬ Ö Ð             × ÙÒ ÒÓ Ó Ô ÖØ ÙÐ Ö start nodeº
          Ë ÒÓ × Ø Ò ÓÒÓ Ñ ÒØÓ Ö          Ð ÓÒ Ø Ú        Ð Ö Ó¸ ÒØÓÒ × × Ò × Ö Ó
      Ò×Ô ÓÒ Ö ÐÓ× Ú ÒØÙ Ð × ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× Ð Ö Ó Ù ×Ø ÓÒ ÕÙ × ÔÙ Ö Ð Þ Ö
        Ð × Ù ÒØ ÑÓ Ó
¾¼    ÈÖÙ          Ð       ½ +≡                                     ¾¼
           template <class GT, class SA> inline
       bool is_graph_acyclique(GT & g)
       {
         if (g.get_num_arcs() >= g.get_num_nodes())
           return false;
         g.reset_bit_arcs(Is_Acyclique);
         g.reset_bit_nodes(Is_Acyclique);
         for (Node_Iterator<GT> it(g); it.has_current(); it.next()) // recorrer nodos
           {
             typename GT::Node * current_node = it.get_current_node();
             if (IS_NODE_VISITED(current_node, Is_Acyclique))
               continue;
             if (not __is_graph_acyclique<GT,SA>(g, current_node))
               return false;
           }
         return true;
       }
     Í× × Node Iterator   º
         ×ÔÙ × Ð ÔÖ Ñ Ö ÐÐ Ñ         is graph acyclique(g, curr node)¸ Ð ÙÒÓ× ÒÓ Ó×
     Ý ÕÙ Ò Ñ Ö Ó× ÓÒ Ð Ú ÐÓÖ Is Acyclique ×Ó Ö ×ØÓ× ÒÓ ×           Ö Ô Ø Ö Ð ÔÖÙ
            Ð     º
         ÈÙ ×ØÓ ÕÙ is graph acyclique() Ø Ø ÐÓ Ú Ö ¬ Ò Ó × ÙÒ ÒÓ Ó × Ó Ó ÒÓ
     Ú × Ø Ó¸ ר ÒÓ ÓÔ Ö Ô Ö Ö Ó׺
         Ë Ø Ò ÑÓ× ÙÒ Ö Ó¸ ÒØÓÒ × ÔÓ ÑÓ× ÐÐ Ñ Ö test for cycle() Ô Ö            ÒÓ Ó
7.5. Recorridos sobre grafos                                                      621



       Ð Ö Óº Ë Ò ÓÒØÖ ÑÓ× ÙÒ ÐÓ ÒÓ× Ø Ò ÑÓ× Ý × ÑÓ× ÕÙ Ð Ö Ó ÒÓ × Ð Óº
     Ë ÔÖÓ ÑÓ× Ô Ö ØÓ Ó× ÐÓ× ÒÓ Ó׸ ÒØÓÒ × ÔÓ ÑÓ× ÓÒ ÐÙ Ö ÕÙ Ð Ö Ó × Ð Óº ר
     Ø Ò       ÖÖ ÙÒ Óר O(V × E)º
         Ò Ü º º ´Ô Ò       µ × ÖÖÓÐÐ Ö ÑÓ× ÙÒ Ø Ò ÕÙ Ø ÖÑ Ò Ð       Ð      Ò
     O(V + E)º

     7.5.7     B´squeda de caminos por profundidad
                u
     Ä Ù×ÕÙ             Ñ ÒÓ× × ÕÙ Þ Ð ÔÖÓ Ð Ñ Ñ × ÓÑÙÒ Ý Ö Ø Ó ÐÓ× Ö Ó׺ À Ý
       Ú Ö× × Ú Ö ÒØ ׸ ÒØÖ Ð Ù Ð × Ø Ò ÑÓ×
        ½º Ü ×Ø Ò        Ó× Ó× ÒÓ Ó׸ Ü ×Ø ÙÒ Ñ ÒÓ ÒØÖ ÐÐÓ×
        ¾º Ø ÖÑ Ò ÓÒ ÙÒ Ñ ÒÓ Ò ÓÒØÖ Ö ÙÒ Ñ ÒÓ ÙÒ ÒÓ Ó ÓÖ Ò                   ÙÒÓ
             ר ÒÓº
        ¿º Ñ ÒÓ Ñ Ò ÑÓ Ø ÖÑ Ò Ö Ð Ñ ÒÓ Ñ ÒÓÖ Óר ÒØÖ Ó× ÒÓ Ó׺
         º Ñ ÒÓ ÙÐ Ö ÒÓ ÙÒ Ñ ÒÓ ÙÐ Ö ÒÓ Ó¸ × ÑÔÐ Ñ ÒØ ¸ ÙÒ ÙÐ Ö ÒÓ ¸ × ÙÒ Ñ ÒÓ
           ÕÙ Ô × ÔÓÖ ØÓ Ó× ÐÓ× Ö Ó× × Ò Ö Ô Ø Ö Ò Ò ÙÒÓ ÐÐÓ׺
             ÕÙ Ø Ò ÑÓ׸ Ø Ñ Ò¸ Ú Ö× ×Ø Ò ÓÒ × Ð Ü ×Ø Ò ¸ Ð Ø ÖÑ Ò ÓÒ ÙÒ
            ÙÐ Ö ÒÓ Ý Ð Ù×ÕÙ        ÙÒÓ Óר Ñ Ò ÑÓº
         º Ñ ÒÓ Ñ ÐØÓÒ ÒÓ ÙÒ Ñ ÒÓ Ñ ÐØÓÒ ÒÓ Ó¸ × ÑÔÐ Ñ ÒØ ¸ ÙÒ Ñ ÐØÓÒ ÒÓ ¸
            × ÙÒ Ñ ÒÓ ÕÙ Ô × ÔÓÖ ØÓ Ó× ÐÓ× ÒÓ Ó× × Ö Ô Ø Ö Ò Ò ÙÒÓ ÐÐÓ׺
          Ò ×Ø ×Ù ¹× ÓÒ ×ÓÐÓ × ÖÖÓÐÐ Ö ÑÓ× ÔÖÙ             Ü ×Ø Ò Ý Ø ÖÑ Ò ÓÒ
       Ñ ÒÓ׺ Ò Ð × ÓÒ Ü º ´Ô Ò ½¼µ ×ØÙ Ö ÑÓ× Ú Ö Ó× Ð ÓÖ ØÑÓ× Ô Ö Ø ÖÑ Ò Ö
      Ð Ñ ÒÓ Óר Ñ Ò ÑÓº
     7.5.7.1    Prueba de existencia

          Ó ÙÒ Ô Ö  ÒÓ Ó× ÓÑÓ Ø ÖÑ Ò Ö × Ü ×Ø ÙÒ Ñ ÒÓ ÒØÖ ÐÐÓ× ÄÐ Ñ ÑÓ×
      test for path() Ð ÖÙØ Ò Ö ÙÖ× Ú ¸ ÕÙ ÜÔÐÓÖ Ò ÔÖÓ ÙÒ  Ð Ö Ó¸ Ò Ù×ÕÙ
       ÙÒ ÒÓ Ó ¬Ò     Ñ ÒÓ end node Ý ÙÝÓ ÔÖÓØÓØ ÔÓ × ÒÙÒ ÓÒØ ÒÙ ÓÒ
¾½   ÈÖÙ        Ñ ÒÓ ¾½ ≡                                    ¾¾
             template <class GT, class SA> inline   static
         bool __test_for_path(GT&                   g,
                              typename GT::Node *   curr_node,   // nodo procedencia
                              typename GT::Node *   end_node);   // arco destino
     g  × Ð Ö Óº curr node × Ð ÒÓ Ó ØÙ Ð ÕÙ × ×Ø Ú × Ø Ò Ó Ý end node × Ð ÒÓ Ó
       ר ÒÓ Ð Ñ ÒÓº Ë × Ò Ù ÒØÖ end node¸ ÒØÓÒ × Ü ×Ø Ð Ñ ÒÓ Ô × Ò Ó ÔÓÖ
     curr node Ý Ð ÖÙØ Ò Ö ØÓÖÒ trueº Ë × ÜÔÐÓÖ Ò ØÓ × Ð × Ú × ÔÓÖ curr node × Ò
      Ò ÓÒØÖ Ö end node¸ ÒØÓÒ × × ÓÒ ÐÙÝ ÕÙ Ô × Ò Ó ÔÓÖ curr node ÒÓ Ü ×Ø Ñ ÒÓ
       end node Ý Ð ÖÙØ Ò Ö ØÓÖÒ falseº
        È Ö ×Ø ÔÖÓ Ð Ñ ¸ Ð ÓÒÓ Ñ ÒØÓ ÕÙ Ø Ò ÑÓ× ×Ó Ö Ð ÓÒ Ø Ú          Ð Ö Ó ÒÓ×
      ÝÙ ÙÒ ÔÓ Óº Ð Ö Ó ÔÙ × Ö Ò ÓÒ ÜÓ Ý ÙÒ × Ü ×Ø Ö Ñ ÒÓ ÒØÖ ÐÓ× ÒÓ Ó×
      ÓÒ× Ö Ó׺ × Ð × Ó× ×¸ Ò ×Ø × ØÙ ÓÒ ÒÓ Ø Ò ÑÓ× Ñ × ÐØ ÖÒ Ø Ú ÕÙ ÜÔÐÓÖ Ö Ð
622                                                            Cap´
                                                                       ıtulo 7. Grafos



     Ö Óº È ÖÓ × Ð Ö Ó × ÓÒ ÜÓ ´Ý ÒÓ × Ö Óµ¸ ÒØÓÒ × ÓÒ ÖØ ØÙ Ü ×Ø ÙÒ Ñ ÒÓ
     ÒØÖ Ù ÐÕÙ Ö ×Ù× ÒÓ Ó× Ý ÒÓ Ö ÕÙ Ö ÑÓ× ÜÔÐÓÖ ÖÐÓº
        Î ÑÓ× ÓÖ ÓÑÓ × ÔÐ Ð ÖÙØ Ò ÒØ Ö ÓÖ Ô Ö Ð ÔÖÙ         Ü ×Ø Ò   Ñ ÒÓ
     ÒØÖ ÙÒ ÒÓ Ó Ò Ð start node Ý ÓØÖÓ ¬Ò Ð end node
¾¾   ÈÖÙ        Ñ ÒÓ ¾½ +≡                              ¾½ ¾¾
           template <class GT, class SA> inline
       bool test_for_path(GT& g, typename GT::Node * start_node,
                          typename GT::Node * end_node)
       {      // si el grafo es conexo ==> existe camino
         if (not g.is_digraph() and g.get_num_arcs() >= g.get_num_nodes())
           return true;
         g.reset_bit_nodes(Test_Path); // reiniciar bit Test_Path para nodos y arcos
         g.reset_bit_arcs(Test_Path);
             // buscar recursivamente caminos por arcos adyacentes a start_node
         for (Node_Arc_Iterator<GT, SA> i(start_node); i.has_current(); i.next())
           {
             typename GT::Arc * arc = i.get_current_arc();
             ARC_BITS(arc).set_bit(Test_Path, true); // marcar arco
             if (__test_for_path<GT, SA>(g, i.get_tgt_node(), end_node))
               return true;
           }
             // todos los arcos de start_node han sido explorados sin encontrar un
             // camino hasta end_node ==> no existe camino
         return false;
       }
     Í× × Node Arc Iterator    º
        test for path() Ö     ØÓÖÒ   true   × Ü ×Ø ÙÒ Ñ ÒÓ ÒØÖ   start node   Ý   end node
     false    ÐÓ ÓÒØÖ Ö Óº
        Ä ÔÖÙ        Ñ ÒÓ Ô Ö Ð × Ö¸ Ø ÖÑ Ò Ö × Ý ÙÒ Ñ ÒÓ × ÙÒ ÒÓ Ó
     ÒØ ÖÑ Ó curr node ר ÙÒÓ ¬Ò Ð end node × ÑÔÐ Ñ ÒØ × ÙÒ Ð Ô ØÖÓÒ Ù×ÕÙ
     Ò ÔÖÓ ÙÒ
¾¾   ÈÖÙ       Ñ ÒÓ ¾½ +≡                                       ¾¾
           template <class GT, class SA> inline static
       bool __test_for_path(GT &                g,
                        typename GT::Node * curr_node, // nodo procedencia
                        typename GT::Node * end_node) // arco destino
       {
         if (curr_node == end_node)
           return true; // se alcanz´ a end_node
                                    o
         if (IS_NODE_VISITED(curr_node, Test_Path)) // ¿Ya se visit´ curr_node?
                                                                    o
           return false; // s´, no explore
                             ı
         NODE_BITS(curr_node).set_bit(Test_Path, true); // pintar curr_node
             // buscar recursivamente a trav´s de arcos de curr_node
                                            e
         for (Node_Arc_Iterator<GT, SA> i(curr_node); i.has_current(); i.next())
           {
             typename GT::Arc * arc = i.get_current_arc();
             if (IS_ARC_VISITED(arc, Test_Path))
               continue;
             ARC_BITS(arc).set_bit(Test_Path, true); // pintar arco
             if (__test_for_path<GT, SA>(g, i.get_tgt_node(), end_node))
7.5. Recorridos sobre grafos                                                   623



                return true;
            }
               // todos los arcos adyacente de curr_node fueron explorados sin
               // encontrar a end_node ==> no existe camino pasando por curr_node
           return false;
       }
     Í× × Node Arc Iterator    º
         Ç × ÖÚ ÑÓ× ÕÙ ¸ Ò ØÖ Ñ ÒØÓ Ð ¬ Ò ¸ ØÖ Ú ×               test for path() ÔÓ ¹
     ÑÓ× Ò ÓÒØÖ Ö ÐÓ× Ó Ð ÞÓ׺
          Ð Ø ÑÔÓ          Ù ÓÒ test for path() ׸ Ò Ð Ô ÓÖ ×Ó¸ ÔÖÓÔÓÖ ÓÒ Ð Ð
       ÒØ         Ö Ó׸ ÔÙ × ×Ø ÒÓ Ø Ö Ö Ñ × E Ú ×º test for path() ׸ ÔÓÖ Ø ÒØÓ¸ O(E)º
          ÓÒ Ð Ö ÔÖ × ÒØ ÓÒ Ñ ØÖ и Ü ×Ø ÙÒ Ñ Ò Ö          Ð ÙÐ Ö Ð × Ö Ð ÓÒ × ÓÒ ¹
     ØÚ       ÒØÖ ØÓ Ó× ÐÓ× ÒÓ Ó× ÙÒ Ö Óº Ì Ð Ö Ð ÓÒ × ÐÐ Ñ Ð Ù×ÙÖ ØÖ Ò× Ø Ú
     Ý × Ð ÙÐ Ñ ÒØ ÙÒ Ð ÓÖ ØÑÓ ÐÐ Ñ Ó                   Ï Ö× ÐÐ ÕÙ × Ö ÔÖ × ÒØ Ó
      Ò Ü º º ´Ô Ò ½µº
     7.5.7.2    B´ squeda de camino entre dos nodos
                 u

      Ò ÓØÖ × Ó × ÓÒ ×¸ ÓÒ ÓÒ ÔÓÖ ×ÙÔÙ ×ØÓ ×Ù Ü ×Ø Ò ¸ ÐÓ ÕÙ × × × Ò ÓÒØÖ Ö
     Ý ÓÒרÖÙ Ö ÙÒ Ñ ÒÓ Ù ÐÕÙ Ö ÒØÖ Ó× ÒÓ Ó׺ È Ö ÐÐÓ¸ × Ò Ö ÑÓ× ÙÒ ÔÖ Ñ Ø Ú ¸
     ÑÙÝ × Ñ Ð Ö Ð     Ð ×Ù ¹× ÓÒ ÒØ Ö ÓÖ¸ ÙÝÓ ¬Ò × Ó Ø Ò Ö ÙÒ Ó ØÓ Ø ÔÓ Path
      ÓÒØ ÒØ ÚÓ ÙÒ Ñ ÒÓ ÒØÖ Ó× ÒÓ Ó× Ý ÓÒ Ð ÒØ Ö Þ × Ù ÒØ
¾¿      Ñ ÒÓ Ö Ó ¼¾ +≡                                      ¼¾ ¾¿
           template <class GT, class SA> inline
       bool find_path_depth_first(GT&                 g,
                                  typename GT::Node * start_node,
                                  typename GT::Node * end_node,
                                  Path<GT> &          path);
     Í× × Path ¼¾ º
     find path depth first() Ò Ù ÒØÖ Ý ÓÒרÖÙÝ ¸ Ñ      ÒØ ÙÒ Ù×ÕÙ Ò ÔÖÓ ÙÒ         ¸
     ÙÒ Ñ ÒÓ ÒØÖ start node Ý end node Ð Ö Ó× gº         Ð Ñ ÒÓ Ö ×ÙÐØ ÒØ × Ù Ö Ò
      Ð Ô Ö Ñ ØÖÓ pathº Ä ÖÙØ Ò Ö ØÓÖÒ true × ¸ Ò      ØÓ¸ × ÐÓ Ö Ò ÓÒØÖ Ö ÙÒ Ñ ÒÓ
     false    ÐÓ ÓÒØÖ Ö Ó¸ Ò ÙÝÓ ×Ó Ð Ú ÐÓÖ path           ÓÒ× Ö Ö× Ò Ø ÖÑ Ò Óº
         Ä ÙÒ ÓÒ ÓÒØ ÑÔÐ ÐÓ× × Ù ÒØ × Ô Ö Ñ ØÖÓ× Ø ÔÓ
        ½º GT Ð Ø ÔÓ Ö Óº
        ¾º SA Ð ¬ÐØÖÓ Ð Ø Ö ÓÖ Ö Ó׺
     ÅÙ Ó× Ð ÓÖ ØÑÓ× Ö ÕÙ Ö Ò Ù× Ö Ñ ÒÓ× ÒØÖ Ô Ö × ÒÓ Ó׺ ÈÓÖ ×Ó¸ ÔÙ × Ö
     ÙØ Ð Ô Ö Ñ ØÖ Þ Ö Ð Ñ ØÓ Ó find path depth first() Ó × ¸ ÕÙ ×Ø × Ô × Ó ÓÑÓ
     Ô Ö Ñ ØÖÓ ÙÒ Ñ ØÓ Óº × Ð Ð Ò Ù C¸ Ð Ñ Ó ØÖ ÓÒ Ð Ô Ö ×ØÓ × ÙÒ ÔÙÒ¹
     Ø ÖÓ ÙÒ ÓÒ¸ Ô ÖÓ Ð ×Ø Ò Ö C++ ÒÓ Ô ÖÑ Ø ÔÙÒØ ÖÓ× ÙÒ ÓÒ × ÔÐ ÒØ ÐР׺ È Ö
      ÓÒØÓÖÒ Ö ×Ø × ØÙ ÓÒ¸ Ý Ð Ú Þ ÖÐ ÙÒ ×Ø ÐÓ Ñ ×             ÐÓ× Ó ØÓ׸ ÜÔÓÖØ Ö ÑÓ×
     find path depth first()      Ó Ð ÒÓÑ Ö ÙÒ Ð ×
¾¿       Ñ ÒÓ Ö Ó ¼¾ +≡                                            ¾¿ ¾
           template <class GT, class SA = Default_Show_Arc<GT> >
       class Find_Path_Depth_First
       {
624                                                           Cap´
                                                                     ıtulo 7. Grafos



        bool operator () (GT &                g,
                          typename GT::Node * start_node,
                          typename GT::Node * end_node,
                          Path<GT> &          path) const
        {
          return find_path_depth_first<GT, SA> (g, start_node, end_node, path);
        }
      };
    Í× × Path ¼¾ º
       find path depth first() × Ð ÒØ Ö Þ ÔÙ Ð ¸ Ð Ù Ð × ÔÓÝ ×Ó Ö Ð ÖÙØ Ò × ¹
     Ù ÒØ ¸ ÕÙ × Ð ÕÙ Ö Ð Þ Ð ÜÔÐÓÖ ÓÒ Ö ÙÖ× Ú Ò ÔÖÓ ÙÒ
¾      Ñ ÒÓ Ö Ó ¼¾ +≡                                     ¾¿ ¾
          template <class GT, class SA> inline
      bool __find_path_depth_first(GT&                 g,
                                   typename GT::Node * curr_node, // nodo actual
                                   typename GT::Arc * curr_arc, // arco procedencia
                                   typename GT::Node * end_node, // nodo destino
                                   Path<GT> &          curr_path) // camino actual
      {
        if (curr_node == end_node) // ¿se alcanz´ nodo final?
                                                o
          {     // s´, terminar a~adir el arco y terminar
                    ı            n
            curr_path.append(curr_arc);
            return true;
          }
        if (IS_NODE_VISITED(curr_node, Find_Path)) // ¿No ha sido visitado?
          return false; // s´ ==> desde el no hay camino
                            ı           ´
        curr_path.append(curr_arc); // a~adir curr_arc al camino
                                        n
        NODE_BITS(curr_node).set_bit(Find_Path, true);
            // buscar recursivamente a trav´s de arcos de curr_node
                                           e
        for (Node_Arc_Iterator<GT, SA> i(curr_node); i.has_current(); i.next())
          {
            typename GT::Arc * next_arc = i.get_current_arc();
            if (IS_ARC_VISITED(next_arc, Find_Path))
              continue;
            ARC_BITS(next_arc).set_bit(Find_Path, true); // marcar arco
            typename GT::Node * next_node = i.get_tgt_node();
                // continuamos exploraci´n en profundidad desde next_node
                                        o
            if (__find_path_depth_first<GT, SA> (g, next_node, next_arc,
                                                 end_node, curr_path))
              return true; // se encontr´ camino, terminar retornando true
                                        o
          }
        curr_path.remove_last_node();
        return false;
      }
    Í× × Node Arc Iterator   Ò   Path   ¼¾ º
      Ä ×ØÖÙ ØÙÖ × Ð Ñ ×Ñ ÕÙ Ð        Ð × Ö ÒØ × ÜÔÐÓÖ ÓÒ × Ò ÔÖÓ ÙÒ     ÕÙ
     ÑÓ× ÔÖ × ÒØ Óº Ä    Ö Ò ×ØÖ Ò ÕÙ ÒØ × Ú × Ø Ö Ö ÙÖ× Ú Ñ ÒØ ÐÓ× Ö Ó×
      curr node¸ ÐÓ Ò ÑÓ× Ð Ñ ÒÓº Ë Ö ÓÖÖ ÑÓ× ØÓ Ó× ÐÓ× Ö Ó×    curr node × Ò
    Ò ÓÒØÖ Ö ÙÒ Ñ ÒÓ      end node¸ ÒØÓÒ × × ÑÓ× curr node Ð Ñ ÒÓº         Ð
    Ò ÓÐ Ö ÙÖ× Ú Ð Ð ÓÖ ØÑÓ¸ path ÙÒ ÓÑÓ Ô Ð º ÈÓÖ Ø ÒØÓ¸ Ð Ñ Ü ÑÓ Ø Ñ ÒÓ
7.5. Recorridos sobre grafos                                                 625



    path ÔÓ Ö Ð ÒÞ Ö O(E)º
         find path depth first() Ö ØÓÖÒ true × ×ÐÓ Ö ÓÒרÖÙ Ö ÙÒ Ñ ÒÓ ¹
       end node ÔÖÓÚ Ò Ò Ó × current nodeº À ÝÓ× Ô Ö Ñ ØÖÓ×     ÓÒ Ð × Ö ×Ô ØÓ
       test for path() Ð Ö Ó ØÙ Ð current arc Ý Ð
                                                Ñ ÒÓ pathº path × ÙÒ Ô Ö Ñ ØÖÓ
       × Ð ÕÙ ÓÒØ Ò Ð Ú ÐÓÖ Ð Ñ ÒÓ Ò ÓÒØÖ Óº current arc × ÙÒ Ö Ó ÙÝÓ ÒÓ Ó
    ÓÖ Ò × current node ÕÙ × Ö ÕÙ Ö ÔÓÖÕÙ Ò Ð Ð × Path × Ò× ÖØ ÔÓÖ Ö Ó× Ý ÒÓ
    ÔÓÖ ÒÓ Ó׺
        ÆÓ× Ö ×Ø ÑÔÐ ÒØ Ö Ð ÔÖ Ñ Ø Ú ÔÙ Ð
¾       Ñ ÒÓ Ö Ó ¼¾ +≡                                         ¾
          template <class GT, class SA> inline
      bool find_path_depth_first(GT &                g,
                                 typename GT::Node * start_node,
                                 typename GT::Node * end_node,
                                 Path<GT> &          path)
      {
        path.clear_path();               // limpiamos path
        path.init(start_node);           // insertamos nodo origen
        g.reset_bit_nodes(Find_Path);
        g.reset_bit_arcs(Find_Path);
        NODE_BITS(start_node).set_bit(Find_Path, true); // marcar start_node visitado
            // explorar recursivamente cada arco de start_node
        for (Node_Arc_Iterator<GT, SA> i(start_node); i.has_current(); i.next())
          {
            typename GT::Arc * arc = i.get_current_arc();
            ARC_BITS(arc).set_bit(Find_Path, true);
            typename GT::Node * next_node = i.get_tgt_node();
            if (IS_NODE_VISITED(next_node, Find_Path))
              continue;
            if (__find_path_depth_first<GT, SA>(g, next_node, arc, end_node, path))
              return true;
          }
        return false;
      }
    Í× × Node Arc Iterator   Ò   Path   ¼¾ º
         Ù Ò Ó × × ÓÒרÖÙ Ö ´Ó Ø ÖÑ Ò Ö Ü ×Ø Ò   µ ÙÒ Ñ ÒÓ Ù ÐÕÙ Ö ÒØÖ Ó×
    ÒÓ Ó׸ × ÔÖ Ö Ð Ú Ð Ö× ¸ Ò ÙÒ ÔÖ Ñ Ö Òר Ò ¸ ÙÒ ÜÔÐÓÖ ÓÒ Ò ÔÖÓ ÙÒ    º
    ÄÙ Ó¸ × × Ö ÕÙ Ö ÙÒÓ Ñ × ÓÖØÓ Ò Ö Ó׸ Ó ÕÙ ÓÒ×ÙÑ Ñ ÒÓ× Ñ ÑÓÖ ¸ ÒØÓÒ ×
    ÔÙ        Ö× ÔÓÖ ÑÔÐ ØÙ º ÇØÖ × ØÙ ÓÒ Ò Ð Ù Ð × ¬Ò Ø Ú Ñ ÒØ ÔÖ Ö Ð Ð
     ÜÔÐÓÖ ÓÒ Ò ÔÖÓ ÙÒ       × Ù Ò Ó × Ù×ÕÙ ÙÒ Ñ ÒÓ ×Ó Ö ÙÒ Ö Ó Ð Ó Ó ÙÒ
     Ö Óк
    7.5.8    B´squeda de caminos por amplitud
              u
     Ð ¬Ò     ר ×Ù ¹× ÓÒ × ÓÒרÖÙ Ö ÙÒ Ñ ÒÓ ÔÓÖ ÑÔÐ ØÙ ÒØÖ Ó× ÒÓ Ó× start
    Ý endº Ð ÓÑ ÒÞ Ö ÔÓÖ start¸ ÜÔÐÓÖ ÑÓ× Ý ÑÔ Ð ÑÓ× ØÓ Ó× ×Ù× Ö Ó× Ò Ù×ÕÙ
       endº Ë ÒÓ ÑÓ× ÐÐ Ó end¸ ÒØÓÒ × ÓÒØ ÒÙ ÑÓ× ÔÓÖ ØÓ Ó× ÐÓ× Ñ ÒÓ×  ÐÓÒ ØÙ
     Ó׺ ר ÔÖÓ ×Ó ÓÒØ ÒÙ ×Ø Ò ÓÒØÖ Ö Ð Ñ ÒÓ Ò Ù ×Ø ÓÒº
        È Ö Ö Ð Þ Ö Ð ×ØÖ Ø   ÒØ Ö ÓÖ¸ Ð ÓÐ      Ù Ö Ö Ñ ÒÓ× Ô Ö Ð × × Ð
    ÒÓ Ó Ò Ó ×Ø Ð Ð ÙÐØ ÑÓ Ò Ú Ð ÕÙ × Ý ÜÔÐÓÖ Ó ÐÓ ÕÙ × ×Ô ¬                 Ð
626                                                                 Cap´
                                                                           ıtulo 7. Grafos



    × Ù ÒØ ÑÓ Ó
¾      Ð Ö ÓÒ ÓÐ                Ñ ÒÓ× ¾       ≡                           ´¾µ
      DynListQueue<Path<GT>*> q; // cola de caminos parciales
    Í× × DynListQueue ½ ¼   Ò   Path   ¼¾ º
    ÆÓØ × ÕÙ × ÙÒ ÓÐ         ÔÙÒØ ÖÓ×   Ñ ÒÓ׸ ÐÓ ÕÙ ÑÔÐ ÕÙ Ð Ñ ÑÓÖ     רÓ×
         Ô ÖØ Ö× Ý¸ ×Ó Ö ØÓ Ó¸ Ù Ò Ó × Ú Ð ÓÐ ¸ Ð Ö Ö× º ÓÑÓ × ØÖ Ø ÔÙÒØ ÖÓ×
    Path* Ð ×ØÖÙ ØÓÖ      Ð ÓÐ ÒÓ Ð Ö Ö Ð Ñ ÑÓÖ Ó ÙÔ ÔÓÖ ÐÓ× Ñ ÒÓ׸ ÐÓ ÕÙ
    Ö ÕÙ Ö Ð × Ù ÒØ        ÓÒ ÜÔÐ Ø Ô Ö Ð Ö Ö Ð ÓÐ
¾    Ú Ö ÓÐ Ý Ð Ö Ö Ñ ÒÓ× ¾ ≡                                 ´¾µ
      while (not q.is_empty())
        delete q.get();
     ר       ÓÒ          Ö× Ð ¬Ò Ð Ð ÔÖÓ Ñ ÒØÓ Ð Ù×ÕÙ ¸ × Ý Ò ÓÒØÖ Ó Ó
    ÒÓ ÙÒ     Ñ ÒÓ¸ Ó × Ó ÙÖÖ ÙÒ Ü Ô ÓÒº
        ÈÖ    Ñ Ò Ö Ð Ñ ÒÓ ØÙ Ð ÜÔÐÓÖ ÓÒ¸ Ñ Ò Ö ÑÓ× Ð × Ù ÒØ Ú Ö Ð
¾       ÐÖ     ÓÒ      Ñ ÒÓ ØÙ Ð ¾ ≡                      ´¾µ
      Path<GT> * path_ptr = NULL;
    Í× × Path ¼¾ º
       Ä Ò× Ö ÓÒ Ò Ð ÓÐ Ö ÕÙ Ö ´½µ Ô ÖØ Ö Ñ ÑÓÖ Ô Ö Ð Ñ ÒÓ Ý ´¾µ Ð ÔÖÓÔ
       ÓÒ Ò× ÖØ Ö Ò Ð ÓÐ º ÈÙ ×ØÓ ÕÙ Ý Ñ Ò Ó Ñ ÑÓÖ Ò Ñ × ÓÔ Ö ÓÒ ×¸
    Ù× Ö ÑÓ× ÙÒ ÖÙØ Ò ÓÒ ÙØÓ¹ÔÙÒØ ÖÓ×
¾    Ê ÓÖÖ Ó Ò ÑÔÐ ØÙ ½ +≡                            ½ ¾
          template <class GT> inline static
      void __insert_in_queue(GT &                       g,
                             DynListQueue<Path<GT> *> & q,
                             typename GT::Node *        node,
                             typename GT::Arc *         arc,
                             Path<GT> *                 path_ptr = NULL)
      {
        auto_ptr<Path<GT> > path_auto;
        if (path_ptr == NULL)
          path_auto = auto_ptr<Path<GT> >(new Path<GT>(g, node)); // camino desde node
        else
          path_auto = auto_ptr<Path<GT> >(new Path<GT>(*path_ptr)); // copia de *path_ptr
        path_auto->append(arc);     // a~adir el nuevo arco
                                        n
        q.put(path_auto.get());     // insertar el nuevo camino en cola
        path_auto.release();
      }
    Í× × DynListQueue ½ ¼   Ò   Path   ¼¾ º
         insert in queue() Ö ÙÒ            ÒÙ ÚÓ Ñ ÒÓ ÓÒ Ð Ö Ó Ò Ó arc Ý ÐÓ Ò ÓÐ Ò Ð
     ÓÐ qº Ä ÖÙØ Ò Ñ Ò ÙÒ Ú Ö                 Ð Path ÐÐ Ñ path auto¸ Р٠и × ÙÒ Ð Ú ÐÓÖ
    path ptr¸ × ÔÖÓ ×     Ó× ÔÓ×           Ð × ÓÖÑ ×
      ½º Ë    path ptr == NULL         ÒØÓÒ × path auto × ÙÒ ÒÙ ÚÓ Ñ ÒÓ ÓÒ ÒÓ Ó          Ò¹
             Ó nodeº
      ¾º Ë   path ptr != NULL          ÒØÓÒ × Ð     Ñ ÒÓ ÓÒØ Ò Ó Ò    *path ptr   ×   ÓÔ
          path autoº
7.5. Recorridos sobre grafos                                                627



    Ò Ù ÐÕÙ Ö ÐÓ× Ó× ×Ó׸ Ð Ö Ó arc × Ð Ò          path auto Ý ×Ø × Ò× ÖØ Ò Ð
    ÓÐ º
         ÓÒ ÐÓ ÒØ Ö ÓÖ¸ ÔÓ ÑÓ× × Ò Ö Ð × Ù ÒØ Ù×ÕÙ        Ñ ÒÓ Ò ÑÔÐ ØÙ
¾   Ê ÓÖÖ Ó Ò ÑÔÐ ØÙ ½ +≡                                  ¾   ¾
         template <class GT, class SA> inline
     bool find_path_breadth_first(GT& g,
                                  typename GT::Node * start,
                                  typename GT::Node * end,
                                  Path<GT> &          path)
     {
       path.clear_path();             // limpiamos cualquier cosa que est´ en path
                                                                         e
       g.reset_bit_nodes(Find_Path);
       g.reset_bit_arcs(Find_Path);
           Ð Ö ÓÒ       ÓÐ    Ñ ÒÓ× ¾
           Ð Ö ÓÒ        Ñ ÒÓ ØÙ Ð ¾
               // insertar los caminos parciales con nodo inicio start
       for (Node_Arc_Iterator<GT, SA> i(start); i.has_current(); i.next())
             __insert_in_queue<GT>(g, q, start, i.get_current_arc());
           NODE_BITS(start).set_bit(Find_Path, true); // m´rquelo visitado
                                                          a
           while (not q.is_empty()) // repetir mientras haya arcos sin visitar
             {
               path_ptr = q.get(); // extraiga camino actual
               typename GT::Arc * arc = path_ptr->get_last_arc();
               ARC_BITS(arc).set_bit(Find_Path, true); // marcar arco
               typename GT::Node * tgt = path_ptr->get_last_node();
               if (IS_NODE_VISITED(tgt, Find_Path)) // ¿visit´ ´ltimo nodo de camino?
                                                             o u
                 {     // s´ ==> el camino no conduce al nodo end ==> borrar camino
                           ı
                   delete path_ptr;
                   continue;
                 }
               if (tgt == end) // ¿se encontr´ un camino?
                                             o
                 {     // s´ ==> path_ptr contiene el camino buscado
                           ı
                   path.swap(*path_ptr); // copiar resultado al par´metro path
                                                                   a
                    Ú    Ö ÓÐ Ý Ð Ö Ö Ñ ÒÓ× ¾
                    return true;
                 }
               NODE_BITS(tgt).set_bit(Find_Path, true); // marcar ultimo nodo camino
                                                                  ´
                   // insertar en cola arcos del nodo reci´n visitado
                                                          e
               for (Node_Arc_Iterator<GT, SA> i(tgt); i.has_current(); i.next())
                 {
                   typename GT::Arc * curr_arc = i.get_current_arc();
                   if (IS_ARC_VISITED(curr_arc, Find_Path)) // ¿se visit´ arco?
                                                                        o
                     continue; // s´ ==> avanzar al siguiente (ya fue visto)
                                   ı
                       // revise nodos del arco para ver si han sido visitados
                   if (IS_NODE_VISITED(g.get_src_node(curr_arc), Find_Path) and
                       IS_NODE_VISITED(g.get_tgt_node(curr_arc), Find_Path))
                     continue; // nodos ya visitados ==> no vale la pena meter arco
                   __insert_in_queue<GT>(g, q, NULL, curr_arc, path_ptr);
                 }
               delete path_ptr; // borrar camino extra´do de la cola
                                                      ı
             } // fin while (not q.is_empty())
628                                                           Cap´
                                                                     ıtulo 7. Grafos



           Ú    Ö ÓÐ Ý Ð Ö Ö Ñ ÒÓ× ¾
          return false;
      }
    Í× × Node Arc Iterator    Ò   Path   ¼¾ º
        Ë       ÔÖ ×Ø Ö ÑÙ    Ø Ò ÓÒ Ð Ö Ö ÐÓ× Ñ ÒÓ× ÕÙ × Ò Ú ×ØÓ× Ý ×        Ó×
       Ò × ÔÓÖÕÙ Ð ÒÓ Ó Ý Ý × Ó Ú × Ø Ó¸ Ó Ò × ÔÓÖÕÙ path ptr Ý Ý × Ó
     ÓÔ Óº
          ÓÑÓ ×         ÔÖ Ö¸ find path breadth first() ÓÒ×ÙÑ ÑÙ Ñ × Ñ ÑÓÖ
    ÕÙ ×Ù ÓÒØÖ Ô ÖØ Ò ÔÖÓ ÙÒ        º Ô ÖØ     ÕÙ Ð ÓÐ Ø Ò       Ö Ö Ñ × ÕÙ ÙÒ
    Ô Ð ¸ Ù Ð × Ð ×Ó Ò Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ        ¸ Ð ÓÐ Ù Ö     Ñ ÒÓ× ÒØ ÖÓ× ×
     Ð ÒÓ Ó Ò Óº
          Ð Ù Ð ÕÙ Ô Ö find path depth first()¸ find path breadth first() Ø Ñ Ò
    ÔÙ ÒÚÓ Ö× Ñ ÒØ ÙÒ Òר Ò ×Ô Ð Ð ×
¾    Ê ÓÖÖ Ó Ò ÑÔÐ ØÙ ½ +≡                                         ¾
          template <class GT, class SA = Default_Show_Arc<GT> >
      class Find_Path_Breadth_First
      {
        bool operator () (GT &                g,
                          typename GT::Node * start,
                          typename GT::Node * end,
                          Path<GT> &          path) const
        {
          return find_path_breadth_first <GT, SA> (g, start, end, path);
        }
      };
    Í× × Path ¼¾ º

    7.5.9      ´
               Arboles abarcadores de profundidad
     Ð Ó ØÓ ר ×Ù ¹× ÓÒ × × ÖÖÓÐÐ Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ ¸ Ô ÖØ Ö ÙÒ ÒÓ Ó Ò Ó¸
     ÜÔÐÓÖ Ò ÔÖÓ ÙÒ        ÙÒ Ö Ó Ý ÓÒרÖÙÝ ÓØÖÓ Ö Ó ÓÖÖ ×ÔÓÒ ÒØ ÙÒ Ö ÓÐ Ö¹
        ÓÖº Ì Ð ÖÙØ Ò Ø Ò Ð × Ù ÒØ ÓÖÑ Ò Ö Ð
¾     Ö ÓÐ × Ö ÓÖ × ¾ ≡                                         ¿¼
          template <class GT, class SA> inline
      bool find_depth_first_spanning_tree(GT &                g,
                                          typename GT::Node * gnode,
                                          GT &                tree)
      {
           ÁÒ Ð Þ Ö ÓÒרÖÙ ÓÒ Ö ÓÐ Ö ÓÖ ¾
           Ê ÓÖÖ Ö Ò ÔÖÓ ÙÒ   ÒÓ Ó× Ý ÒØ ×       ÒÓ    ¾
          return true;
      }
                                     Ñ Ò ØÖ × Ô Ö Ñ ØÖÓ×
          find depth first spanning tree()

      ½º g ÙÒ Ö Ó ÓÒ ÜÓ ×Ó Ö Ð Ù Ð × Ö ÕÙ Ö ÓÒרÖÙ Ö ÙÒ Ö ÓÐ Ö ÓÖº
      ¾º gnode Ð ÒÓ Ó Ò Ð × Ð Ù Ð × × ÓÑ ÒÞ Ö Ð ÓÒרÖÙ ÓÒ Ð Ö ÓÐ                  Ö¹
            ÓÖº
7.5. Recorridos sobre grafos                                                 629



        ¿º tree ÙÒ Ö Ó × Ð      ÓÒ × ÓÐÓ Ö Ð Ö ÓÐ Ö ÓÖ Ö ×ÙÐØ ÒØ º
      Ð Ú ÐÓÖ Ö ØÓÖÒÓ × true × Ü ×Ø ÙÒ Ö ÓÐ Ö ÓÖ false ÐÓ ÓÒØÖ Ö Óº
          Ò Ò ÙÖ ¸ find depth first spanning tree() Ñ Ô ÐÓ× ÒÓ Ó× Ý Ö Ó× ØÖ Ú ×
        ÐÓ× ÓÓ ×º     ר ÑÓ Ó¸ Ð Ù×Ù Ö Ó ÔÙ   ÓÒÓ Ö¸ ÒØÖÓ Ð Ö Ó¸ Ù Ð × ÒÓ Ó× Ó
     Ö Ó× Ô ÖØ Ò Ò Ð Ö ÓÐ Ö ÓÖº
           ÒØ × ÓÑ ÒÞ Ö Ð ÜÔÐÓÖ ÓÒ Ö ÙÖ× Ú g¸ × Ò × Ö Ó Ð ÑÔ Ö ×Ù× Ø× ÓÒØÖÓÐ
    Ý × ÙÖ Ö× ÕÙ tree ר Ú Ó
¾    ÁÒ Ð Þ Ö ÓÒרÖÙ ÓÒ Ö ÓÐ Ö ÓÖ ¾ ≡                         ´¾ µ
      g.reset_nodes();
      g.reset_arcs();
      clear_graph(tree); // asegurar que arbol destino est´ vac´o
                                         ´                e    ı
      NODE_BITS(gnode).set_bit(Spanning_Tree, true); // marcar gnode
      typename GT::Node * tnode = tree.insert_node(gnode->get_info());
      GT::map_nodes(gnode, tnode);
    Í× ÑÓ× Ð Ø Spanning Tree Ô Ö Ô ÒØ Ö ÙÒ ÒÓ Ó Ó Ö Ó ÕÙ Ý × Ó Ú × Ø Óº
        ÓÒ ÐÓ ÒØ Ö ÓÖ Ò Ñ ÒØ ¸ ÔÓ ÑÓ× ÔÐ ÒØ Ö Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ        Ô ÖØ Ö
       gnode
¾   Ê ÓÖÖ Ö Ò ÔÖÓ ÙÒ         ÒÓ Ó× Ý ÒØ ×    ÒÓ    ¾   ≡       ´¾    ¿¼ µ
      for (Node_Arc_Iterator<GT, SA> i(gnode); i.has_current(); i.next())
        {
          typename GT::Arc * arc = i.get_current_arc();
          if (IS_ARC_VISITED(arc, Spanning_Tree))
            continue;
          typename GT::Node * arc_tgt_node = i.get_tgt_node();
          if (IS_NODE_VISITED(arc_tgt_node, Spanning_Tree))
            continue; // nodo destino tambi´n ya ha sido visitado desde otro arco
                                           e
          if (__find_depth_first_spanning_tree<GT,SA>(g, arc_tgt_node, arc, tree, tnode))
            return false; // ya el arbol est´ calculado
                                   ´        a
        }
    Í× × Node Arc Iterator   º
    Ä ×ØÖÙ ØÙÖ × × Ñ Ð Ö Ð        ÓØÖÓ× Ð ÓÖ ØÑÓ× × Ó× Ò Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ    º
    Ä ÖÙØ Ò Ö ÙÖ× Ú × find depth first spanning tree()¸ Ð Ù Ð ÔØ ÐÓ× × Ù ÒØ ×
    Ô Ö Ñ ØÖÓ× Ò Ð ÓÖ Ò ÔÖ × ÒØ Ó
      ½º g Ð Ö Ó Ö ÓÖÖ Öº
      ¾º arc tgt node ÙÒ ÒÓ Ó ÒØÖÓ g ÕÙ ÙÒ ÒÓ × Ó Ú × Ø Ó Ý ÕÙ ÒÓ Ø Ò
           Ñ Ò Ò treeº
      ¿º garc Ð Ö Ó ØÙ Ð              g ÙÝÓ ÒÓ Ó ÓÖ Ò × gnodeº      ÆÓØ ÑÓ× ÕÙ
           Ð Ö Ó ÙÒ ÒÓ Ø Ò Ñ Ò Ò tree ר × Ö Ò× ÖØ Ó Ð ÓÑ ÒÞÓ
            find depth first spanning tree()º

        º gnode ÙÒ ÒÓ Ó g¸ Ý Ú × Ø Ó¸ ÕÙ Ø Ò Ñ Ò Ò treeº
        º tree Ð Ö ÓÐ Ö ÓÖ ÕÙ × ×Ø ÓÒרÖÙÝ Ò Óº
        º tnode Ð Ñ Ò gnode Ò treeº ÆÓØ ÑÓ× ÕÙ Ò ×Ø ×Ó ÙÒ           ÒÓ Ó ×Ø ÒÓº
630                                                          Cap´
                                                                     ıtulo 7. Grafos



        Ä ÖÙØ Ò Ö ÙÖ× Ú Ö ×ÙÐØ ÒØ Ø Ò ¸ ÒØÓÒ ×¸ Ð × Ù ÒØ ÑÔÐ ÒØ ÓÒ
¿¼     Ö ÓÐ × Ö ÓÖ × ¾ +≡                                  ¾   ¿¼
          template <class GT, class SA> inline static
      bool __find_depth_first_spanning_tree(GT &                g,
                                            typename GT::Node * gnode,
                                            typename GT::Arc * garc,
                                            GT &                tree,
                                            typename GT::Node * tnode)
      {
        NODE_BITS(gnode).set_bit(Spanning_Tree, true); // marcar nodo
        ARC_BITS(garc).set_bit(Spanning_Tree, true);   // marcar arco
            // insertar tgt_node en arbol y mapearlo
                                    ´
        typename GT::Node * tree_tgt_node = tree.insert_node(gnode->get_info());
        GT::map_nodes(gnode, tree_tgt_node);
            // insertar arc en arbol y mapearlo
                               ´
        typename GT::Arc * tarc = tree.insert_arc(tnode, tree_tgt_node, garc->get_info());
        GT::map_arcs(garc, tarc);
        tnode = tree_tgt_node; // esto hace que el bloque de recorrido sea el mismo
        if (tree.get_num_nodes() == g.get_num_nodes()) // ¿se ha abarcado el grafo?
          return true; // tree ya contiene el arbol abarcador
                                              ´
           Ê ÓÖÖ Ö Ò ÔÖÓ ÙÒ    ÒÓ Ó× Ý ÒØ ×      ÒÓ    ¾
           return false;
      }
             ר Ð ÓÖ ØÑÓ × ÙÒ Ñ ÒØ Ð ÒØ Ò Ö ×Ù ÓÒ ÓÒ Ô Ö ¸ Ù Ð × Ð ÒÞ
      Ù Ò Ó × Ò Ö Ó ØÓ Ó× ÐÓ× ÒÓ Ó× g × Ö¸ Ù Ò Ó Ð ÒØ                    ÒÓ Ó×
        tree × Ð Ñ ×Ñ ÕÙ Ð      gº Ì Ñ Ò × ÑÔÓÖØ ÒØ ÒÓØ Ö ÕÙ Ð Ú Ø Ö Ð Ò   ÙÖ
        ÙÒ Ö Ó Ó ÒÓ Ó Ý Ú × Ø Ó Ò tree¸ × ÑÔÓ× Ð Ù× Ö ÙÒ ÐÓ Ö ÞÓÒ ÕÙ Ö ÒØ Þ
     ÕÙ tree × ¸ Ò ØÓ¸ ÙÒ Ö Óк

     7.5.10     ´
                Arboles abarcadores de amplitud
      Ò Ð Ñ ×ÑÓ × ÒØ Ó ÕÙ Ô Ö ÙÒ Ö ÓÐ Ö ÓÖ Ò ÔÖÓ ÙÒ     ¸ ÔÓ ÑÓ× ÔÐ ÒØ Ö
     ÙÒ ÖÙØ Ò ÕÙ ÒÓ× ÜØÖ     Ð Ö Ó Ð Ö ÓÐ Ö ÓÖ ÓÖÖ ×ÔÓÒ ÒØ Ð Ö ÓÖÖ Ó Ò
      ÑÔÐ ØÙ × ÙÒ ÒÓ Ó Óº Ì Ð ÖÙØ Ò × Ö Ð Þ Ð × Ù ÒØ Ñ Ò Ö
¿¼     Ö ÓÐ × Ö ÓÖ × ¾ +≡                             ¿¼ ¿¾
          template <class GT, class SA> inline
      void find_breadth_first_spanning_tree(GT &                g,
                                            typename GT::Node * gnode,
                                            GT &                tree)
      {
        g.reset_bit_nodes(Spanning_Tree);
        g.reset_bit_arcs(Spanning_Tree);
        clear_graph(tree); // inicialice arbol e inserte copia mapeada de gnode
                                         ´
        auto_ptr<typename GT::Node> tnode_auto (new typename GT::Node(gnode));
        tree.insert_node(tnode_auto.get());
        GT::map_nodes(gnode, tnode_auto.release());
        DynListQueue<typename GT::Arc*> q; // recorra arcos gnode e ins´rtelos en cola
                                                                       e
        for (Node_Arc_Iterator<GT, SA> i(gnode); i.has_current(); i.next())
          q.put(i.get_current_arc());
        NODE_BITS(gnode).set_bit(Spanning_Tree, true); // marque visitado gnode
7.5. Recorridos sobre grafos                                                   631



      while (not q.is_empty()) // repita mientras queden arcos en la cola
        {
          typename GT::Arc * garc = q.get(); // sacar arco y marcarlo
          ARC_BITS(garc).set_bit(Spanning_Tree, true);
          typename GT::Node * gsrc = g.get_src_node(garc); // nodos de garc
          typename GT::Node * gtgt = g.get_tgt_node(garc);
          if (IS_NODE_VISITED(gsrc, Spanning_Tree) and IS_NODE_VISITED(gtgt, Spanning_Tree))
            continue; // los dos nodos de garc ya fueron visitados
          if (IS_NODE_VISITED(gtgt, Spanning_Tree)) // ¿gtgt visitado?
            Aleph::swap(gsrc, gtgt); // s´, interc´mbielo con gsrc
                                         ı        a
          typename GT::Node * tsrc = // imagen de gsrc en tree
            static_cast<typename GT::Node*>(NODE_COOKIE(gsrc));
          NODE_BITS(gtgt).set_bit(Spanning_Tree, true); // marque gtgt visitado
              // crear copia de gtgt, insertarlo en tree y mapearlo
          auto_ptr<typename GT::Node> ttgt_auto (new typename GT::Node(gtgt));
          tree.insert_node(ttgt_auto.get());
          typename GT::Node * ttgt = ttgt_auto.release();
          GT::map_nodes(gtgt, ttgt);
              // insertar nuevo arco en tree y mapearlo
          typename GT::Arc * tarc = tree.insert_arc(tsrc, ttgt, garc->get_info());
          GT::map_arcs(garc, tarc);
          if (tree.get_num_nodes() == g.get_num_nodes()) // ¿tree abarca a g?
            break;
              // insertar en cola arcos de gtgt
          for (Node_Arc_Iterator<GT, SA> i(gtgt); i.has_current(); i.next())
            {
              typename GT::Arc * current_arc = i.get_current_arc();
              if (IS_ARC_VISITED(current_arc, Spanning_Tree))
                continue;
                  // revise nodos de arcos para ver si han sido visitados
              if (IS_NODE_VISITED(g.get_src_node(current_arc), Spanning_Tree) and
                  IS_NODE_VISITED(g.get_tgt_node(current_arc), Spanning_Tree))
                continue; // nodos ya visitados ==> no vale la pena meter el arco
              q.put(current_arc);
            }
        }
  }
Í× × DynListQueue ½ ¼   Ò   Node Arc Iterator   º
   ÈÙ ×ØÓ ÕÙ     Ð ÓÐ × Ó Ø Ò Ò Ö Ó× ÐÓ× Ù Ð × ÙÒ ×ÓÐÓ ÒÓ Ó ×Ø ÓÒØ Ò Ó Ò
tree ݸ   Ñ ×¸ tree × Ô ÖÑ Ò ÒØ Ñ ÒØ ÓÒ ÜÓ¸ ÒØÓÒ × × ÑÔÓ× Ð ÕÙ Ð Ò ÐÙ× ÓÒ
   ÙÒ ÒÙ ÚÓ Ö Ó Ù× ÙÒ ÐÓº tree ׸ ÔÓÖ Ø ÒØÓ¸ ÙÒ Ö ÓÐ Ö ÓÖº
7.5.11     ´
           Arboles abarcadores en arreglos
ÍÒ Ñ Ò Ö ÑÙÝ × ÑÔÐ       Ö ÔÖ × ÒØ Ö ÙÒ Ö Óи ÕÙ ÒÓ ÜÔÐ ÑÓ× Ò Ð Ô ØÙÐÓ Ü ¸
 ÓÒ× ×Ø Ò Ñ ÒØ Ò Ö ÙÒ ÖÖ ÐÓ Ô Ö ×              ÒÓ Ó Ð Ö Óк     ÒØÖ i Ð
 ÖÖ ÐÓ ÓÒØ Ò Ð Ô Ö Ð ÒÓ Ó ÙÝÓ Ò            Ó ÒÙÑ ÖÓ × iº Ä     × Ô ØÓÖ Þ
Ñ ÒØ ÐÓ× ÑÔÐÓ× Ð ¬ ÙÖ º½ º
   È Ö Ð ×Ó ÙÒ Ö ÓÐ Ö ÓÖ ÙÒ Ö Ó Ý¸ Ò Ò Ö Ð Ô Ö Ö ÓÐ × Ù ÐÕÙ Ö
Ò ÓÐ ¸ Ð Ö ÔÖ × ÒØ ÓÒ Ô ØÓÖ Þ     ×ÙÑ ÕÙ ÐÓ× ÒÓ Ó× ×Ø Ò ÒÙÑ Ö Ó׸ ÐÓ ÕÙ ÒÓ×
632                                                                             Cap´
                                                                                        ıtulo 7. Grafos


                   6


           3           0                                            3


     4         5       2                                  5             6       4


                       1   ¼    ½   ¾    ¿                0     1           2         ¼   ½   ¾   ¿
                                ¾   ¼        ¿   ¿   ¹                                            ¹   ¿   ¿   ¿
                           ´µ                                                       ´ µ

                       ÙÖ º½        Ó×       ÑÔÐÓ×       Ö ÓÐ × Ö ÔÖ × ÒØ Ó× ÓÒ ÖÖ ÐÓ×

     Ö ×ØÖ Ò Ð Ö ÔÖ × ÒØ ÓÒº È Ö Ú Ø Ö ×ØÓ¸ ÑÔÐ ÑÓ× ÙÒ ÖÖ ÐÓ ÔÙÒØ ÖÓ× ÒÓ Ó׸
      Ò Ð Ù Ð Ð ÒØÖ     ÓÒØ ÒØ Ú NULL Ö ÔÖ × ÒØ Ð Ö Þº
           ÓÑÓ Ð Ì List Graph<Node, Arc> Ô ÖÑ Ø Ö ÔÖ × ÒØ Ö ÑÙÐØ Ö Ó׸ Ð Ñ ÖÓ ÖÖ ¹
      ÐÓ Ô Ö × ÒÓ × ×Ù¬ ÒØ Ô Ö ×Ø Ò Ù Ö ÑÙÐØ ¹ Ö Ó׺ ר Ñ Ù            ÔÙ Ö ×Óй
     Ú Ö× Ñ ÒØ ÙÒ ÖÖ ÐÓ         Ö Ó× Ò ÐÙ Ö Ð ÒÓ Ó׺ ÑÔ ÖÓ¸ ×ØÓ × Ú Ð Ó ×ÓÐÓ ×
      Ð Ö ÓÐ Ö ÓÖ Ö ¬ Ö ÙÒ Ö Óº × ÕÙ ¸ Ò Ö × Ð Ò Ö Ð ¸ ÑÔÐ Ö ÑÓ×
      Ó× ÖÖ ÐÓ× ÔÙÒØ ÖÓ׸ ÙÒÓ ÒÓ Ó× Ý ÓØÖÓ Ö Ó׺
         Ë g × ÙÒ Ö Ó Ý Ð ÙÒ Ñ Ò Ö Ø Ò ÑÓ× ÙÒ Ö ÓÐ Ö ÓÖ Ö ÔÖ × ÒØ Ó Ò ÐÓ×
      ÖÖ ÐÓ× ÔÙÒØ ÖÓ× ÒÓ Ó× pred[] Ý Ö Ó× arcs[]¸ Ö ×Ô Ø Ú Ñ ÒØ ¸ ÒØÓÒ × ÔÓ ÑÓ×
     Ó Ø Ò Ö ÙÒ Ö Ó tree ÓÒØ ÒØ ÚÓ Ö ÓÐ Ö ÓÖ Ñ ÒØ Ð × Ù ÒØ ÖÙØ Ò
¿¾      Ö ÓÐ × Ö ÓÖ × ¾ +≡                                        ¿¼
             template <class GT>
         void build_spanning_tree(GT & g, GT & tree,
                                  DynArray<typename GT::Node> * pred,
                                  DynArray<typename GT::Arc> * arcs,
                                  const bool with_map = false)
         {
           tree.clear();
           for (int i = 0; i < g.get_num_nodes(); ++i)
             {
               typename GT::Arc * garc = arcs[i];
               if (garc == NULL)
                 continue;
               typename GT::Node * gsrc = g.get_src_node(garc);
               typename GT::Node * tsrc = NULL;
               if (IS_NODE_VISITED(gsrc, Spanning_Tree))
                 tsrc = static_cast<typename GT::Node*>(NODE_COOKIE(gsrc));
               else
                 {
                   NODE_BITS(gsrc).set_bit(Spanning_Tree, true); // marcar bit
                   tsrc = tree.insert_node(gsrc->get_info());
                 }
               typename GT::Node * gtgt = g.get_tgt_node(garc);
               typename GT::Node * ttgt = NULL;
               if (IS_NODE_VISITED(gtgt, Spanning_Tree))
                 ttgt = static_cast<typename GT::Node*>(NODE_COOKIE(gtgt));
               else
7.5. Recorridos sobre grafos                                                                                                                                                                                                 633



                               {
                                      NODE_BITS(gtgt).set_bit(Spanning_Tree, true); // marcar bit
                                      ttgt = tree.insert_node(gtgt->get_info());
                            }
                          typename GT::Arc * tarc = tree.insert_arc(tsrc, ttgt, garc->get_info());
                          ARC_BITS(garc).set_bit(Min, true);
                          if (with_map)
                            {
                              GT::map_nodes(gsrc, tsrc);
                              GT::map_nodes(gtgt, ttgt);
                              GT::map_arcs(garc, tarc);
                            }
            }
   }
Í× × arcs ¾ ¸ DynArray ¾¸ Ò                                                          pred          ¾ º
 Ð Ô Ö Ñ ØÖÓ with map Ò × Ð Ö ÓÐ Ö ÓÖ               Ó ÒÓ Ñ Ô Ö× ÓÒ Ð Ö Ó gº
     Ô ÖØ Ð ÓÒÓÑ          ×Ô Ó¸ Ö ÔÖ × ÒØ Ö Ö ÓÐ × Ö ÓÖ × Ö Ó× Ñ ÒØ
 ÖÖ ÐÓ× × Ô ÖØ ÙÐ ÖÑ ÒØ ÙØ Ð Ô Ö Ð ÓÖ ØÑÓ×      Ù×ÕÙ           Ñ ÒÓ× Ñ Ò ÑÓ× ×¹
Ô ¬ Ñ ÒØ ÐÓ× Ð ÓÖ ØÑÓ× ÐÓÝ Ý           ÐÐÑ Ò¹ ÓÖ ¸ ÐÓ× Ù Ð × ×ØÙ Ö ÑÓ× Ò Ü º º¾
Ý Ü º º¿¸ Ö ×Ô Ø Ú Ñ ÒØ º

7.5.12                       Conversi´n de un ´rbol abarcador a un Tree Node<T>
                                     o        a
 Ò Ü º ´Ô Ò ¾ ¿µ × ÖÖÓÐÐ ÑÓ× Ð Ì                                                                                                 Tree Node<T>¸                     Ð Ù Ð ÑÓ Ð Þ ÙÒ Ö ÓÐ
m¹Ö Ó Ñ ÒØÖ × ÕÙ Ò Ð ×Ù ¹× ÓÒ × ÔÖ                                                                                                 ÒØ ×                        ÑÓ×      × ÖÖÓÐÐ Ö Ð ÓÖ ØÑÓ×
    Paraguiapos                                                                       Coro
                                                                                                                                                                                                                                                        82       Cumaná
                                               254                                                                                                                                                  310                         10   Pto La Cruz
                                                                                                                                                                                Caracas
            55                                                                                                                                                                                                   Barcelona
                                                                                                                                                                          109
                                                                                                                            252                                                                                                                                  199
   Maracaibo                                                                                                                                                     Maracay
                                                                                                                                                                                          139                             166
                                                                                                                                                                     49
                                                                                                                                                                                                                                                       Maturín
        130                                                                                                                                                    Valencia
                                                                                                                                                     315
                                                 251                                                                                                                                                       435            El Tigre
                                                                                                                                                                                                                                                       171
                                                                                                                                                                   222                          San Juan

    Machiques                                                                                                                     San Felipe                                                                                 130           Pto Ordaz
                                  295                                                                                                                    220      100
                                                     Santa Barbara                                                                                                                                                                   107
                                252                                                          Valera                                      86
                                                                                                            120                                    241                                                           Ciudad Bolivar
San Antonio                                                          59
                 36                                                                                                Carora   102
                                        69                    86                                167                                 Barquisimeto
                                               La Fría                    El Vigía                                                                                                  261
                      San Cristobal                                                                                                                        San Carlos
       48                                                                            79
                                      113                                                                                                  173
                 22                                                                       Mérida
                                                                                                                                                    526
                                        Sacramento       38
    Rubio                                                                                             180              Guanare
                                                                   El Cantón                                      94
                  150                                                                                 Barinas                      547
                                                               200                                                                                             San Fernando
                           Caparo




                                                              ÙÖ º¾¼ ÍÒ Ö Ó Ú Ð                                                          Ù               × Ý ×Ø Ò ×
Ô Ö Ð ÙÐ Ö Ö ÓÐ × Ö ÓÖ × ÓÖÖ ×ÔÓÒ ÒØ ÐÓ× Ö ÓÖÖ Ó× Ò ÔÖÓ ÙÒ            Ý Ñ¹
ÔÐ ØÙ      ÙÒ Ö Óº Ò ×Ø ×Ù ¹× ÓÒ × ÖÖÓÐÐ Ö ÑÓ× ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÒÓ× ÓÒÚ ÖØ
ÙÒ Ö ÓÐ Ö ÓÖ Ø ÔÓ List Graph<Node, Arc> ÙÒ Ö ÓÐ Ø ÔÓ Tree Node<T>º
  Ô ÖØ      ×Ù Ú ÐÓÖ   Ø Ó¸ ר ÖÙØ Ò ÒÓ× Ô ÖÑ Ø Ö Ô Ð Ö Ð Ù Ó ÙØÓÑ Ø Ó
     Ö ÓÐ × m¹Ö Ó× Ý × ×ÕÙ Ñ Ø Þ Ö¸ ÐÓ Ð Ö Ó  ר Ø ÜØÓ¸ Ö ÒØ × Ö ÓÐ × ÕÙ ×
   × Ù Ö Ò Ò ÑÙ Ó× ÐÓ× Ð ÓÖ ØÑÓ× ÕÙ Ü ×Ø Ò ×Ó Ö Ö Ó׺
    ÆÙ רÖÓ Ð ÓÖ ØÑÓ ÓÒÚ Ö× ÓÒ Ö × Ò Ð Ö ÚÓ graph to tree.Hº
634                                                                           Cap´
                                                                                     ıtulo 7. Grafos



                                                             Merida
                                                            El Vigia
                                                            La Fria
                                                           Machiques
                                          Maracaibo                      Sta Barbara
                              Coro                        Paraguaipos
                             Valencia
                        Barquisimeto
               Carora                         Guanare
               Valera                         Barinas
                    Caparo                                       Sn Fernando
                     Rubio                                            Sn Juan
                  Sn Cristobal                                        Caracas
     Sn Antonio                      Smento        Barcelona                       Maracay
                                 El Canton        Pto La Cruz                     Sn Felipe
                                                        Cumana                    Sn Carlos
                                                    Maturin
                                                   Pto Ordaz
                                                   Cd Bolivar
                                                    El Tigre


      ÙÖ º¾½ Ö ÓÐ Ö              ÓÖ Ò ÔÖÓ ÙÒ                 Ð Ö Ó       Ð ¬ ÙÖ    Ü       º¾¼ ´Ô Ò ¿¿µ
    ÓÒ ÒÓ Ó Ò Ó Å Ö
      Ä ÓÒÚ Ö× ÓÒ × ÒÚÓ ØÖ Ú × Ð × Ù ÒØ ÒØ Ö Þ
¿    ÓÒÚ Ö× ÓÒ List Graph<Node, Arc> Tree Node<T> ¿                      ≡             ¿
         template <class GT, typename Key, class Convert> static
     Tree_Node<Key> * graph_to_tree_node(GT & g, typename GT::Node * groot);
    Ä Ù Ð Ö ØÓÖÒ ÙÒ Ö ÓÐ             Ø ÔÓ Tree Node<Key>* ÓÖÖ ×ÔÓÒ ÒØ Ð Ö ÓÐ                      Ö   ÓÖg
     ÓÒ Ö Þ Ò groot½ º
         graph to tree node()Ø Ò ØÖ × Ô Ö Ñ ØÖÓ× Ø ÔÓ
         ½º GT Ð Ø ÔÓ List Graph<Node, Arc>¸ ÕÙ ÓÒØ Ò ÙÒ Ö ÓÐ                              Ö   ÓÖ¸ Ý ÕÙ ×
              × ÓÒÚ ÖØ Ö Tree Node<T>º
         ¾º Key Ä Ð Ú ÕÙ × ÐÑ Ò Ö Ò Ð Tree Node<T>º
         ¿º Convert ÍÒ Ð ×          ØÖ Ò× ÓÖÑ ÓÒ × typename                            GT::Node*
            Tree Node<Key>*º
     ½
      ÄÓ× Ö ÓÐ × Ù Ó× Ò ×Ø Ø ÜØÓ ×ÓÒ ÔÖÓ × Ó× ÓÒ ÙÒ ÖÙØ Ò ÐÐ Ñ generate tree() Ö × ÒØ
    Ò Ð Ö ÚÓ generate tree.H¸ Ð Ù Ð Ò Ö ÙÒ Ö ÓÐ   ÒØÖ    Ð ÔÖÓ Ö Ñ   Ù Ó ntreepicº
7.5. Recorridos sobre grafos                                                   635



          Ò Ð ÓÔ Ö ÓÖ   ()    ר Ð × ×       Ð   Ð ÓÒÚ Ö× ÓÒ     ØÖ Ú ×    Ð × Ù ÒØ
        ÐÐ Ñ
                void operator () (typename GT::Node * groot, Tree_Node<Key>* troot)

             Ú Þ ÕÙ × Ö Ý × Ñ Ô ÙÒ ÒÓ Ó          Ø ÔÓ groot    Ø ÔÓ typename   GT::Node
        *¸ × ÒÚÓ

                Convert () (groot, troot);

         Ä Ù Ð ÜØÖ Ð ÙÒ Ò ÓÖÑ ÓÒ groot¸ Ð ÓÒÚ ÖØ Ð Ø ÔÓ Key Ý × Ò ×Ø
         Ö ×ÙÐØ Ó troot->get key()º
       º SA Ð ¬ÐØÖÓ Ö Ó׺
       graph to tree node() × ÔÓÝ ×Ó Ö Ð × Ù ÒØ ÖÙØ Ò ÔÖ Ú
¿     ÓÒÚ Ö× ÓÒ List Graph<Node, Arc> Tree Node<T> ¿ +≡    ¿ ¿
         template <class GT, typename Key, class Convert> static void
     __graph_to_tree_node(GT & g, typename GT::Node * groot, Tree_Node<Key> * troot);
    Ð Ù Ð× Ò Ö       Ö ÓÖÖ Ö Ö ÙÖ× Ú Ñ ÒØ Ð Ö ÓÐ Ö ÓÖg Ô ÖØ Ö Ð ÒÓ Ó groot
    Ý Ñ ÒØ Ò Ò troot Ð ÕÙ Ú Ð ÒØ Ø ÔÓ Tree Node<Key>º
       Å ÒØ graph to tree node() ÔÓ ÑÓ× ÑÔÐ ÒØ Ö Ð ÖÙØ Ò ÔÖ Ò Ô Ð Ð × ¹
     Ù ÒØ Ñ Ò Ö
¿     ÓÒÚ Ö× ÓÒ List Graph<Node, Arc> Tree Node<T> ¿ +≡   ¿   ¿
         template <class GT, typename Key,
                   class Convert, class SA> inline
     Tree_Node<Key> * graph_to_tree_node(GT & g, typename GT::Node * groot)
     {
       Tree_Node<Key> * troot = new Tree_Node<Key>; // apartar memoria para ra´z
                                                                              ı
       Convert () (groot, troot); //convertir de groot y copiar a troot
       __graph_to_tree_node <GT, Key, Convert, SA> (g, groot, troot);
       return troot;
     }
      graph to tree() Ò Ð Þ Ð Ö Þ Tree Node<Key>º Ð Ö ×ØÓ Ð ØÖ   Ó ÐÓ Ö Ð Þ Ð
    ÜÔÐÓÖ ÓÒ Ö ÙÖ× Ú groot ÑÔÐ ÒØ ÔÓÖ graph to tree()
¿    ÓÒÚ Ö× ÓÒ List Graph<Node, Arc> Tree Node<T> ¿ +≡         ¿
         template <class GT, typename Key, typename Convert, class SA> static
     void __graph_to_tree_node(GT &                g,
                               typename GT::Node * groot,
                               Tree_Node<Key> *    troot)
     {
       typedef typename GT::Node Node;
       typedef typename GT::Arc Arc;
           // recorrer arcos de groot y construir recursivamente
       for (Node_Arc_Iterator<GT, SA> it(groot); it.has_current(); it.next())
         {
           Arc * arc = it.get_current_arc();
           if (IS_ARC_VISITED(arc, Convert_Tree))
             continue;
           ARC_BITS(arc).set_bit(Convert_Tree, true); // marcar visitado arc
636                                                                        Cap´
                                                                                      ıtulo 7. Grafos



                  Node * gtgt = it.get_tgt_node();
                  Tree_Node<Key> * ttgt = new Tree_Node<Key>; // crear nuevo nodo
                  Convert () (gtgt, ttgt); // asignarle la clave
                  troot->insert_rightmost_child(ttgt); // insertarlo como hijo
                  __graph_to_tree_node <GT, Key, Convert, SA> (g, gtgt, ttgt);
              }
          }
        Í× × Node Arc Iterator       º
             × ×Ù¬ ÒØ ÓÒ ×ÓÐÓ Ñ Ö Ö ÐÓ× Ö Ó× ÕÙ Ý × Ò Ú × Ø Ó¸ Ô٠׸ ÓÑÓ g × ÙÒ
         Ö Óи ÒÓ Ý ÔÓ× Ð       Ú × Ø Ö Ð ÒÓ Ó × ÓØÖÓ Ö Óº Ð Ø Ñ Ö × ÒÓ¹
        Ñ Ò Convert Treeº
                                                        Merida
               El Vigia                             Valera                                Barinas
          La Fria Sta Barbara              Carora            Maracaibo         Caparo     Guanare Sn Fernando
    MachiquesSn Cristobal                Barquisimeto   Coro     Paraguaipos   Rubio     Sn Carlos   Sn Juan
        Sn Antonio    Smento         Valencia Sn Felipe                                        Caracas   El Tigre
                     El Canton       Maracay                                                  Barcelona Cd Bolivar
                                                                                             Pto La Cruz Pto Ordaz
                                                                                               Cumana     Maturin



           ÙÖ º¾¾ Ö ÓÐ           Ö       ÓÖ Ò ÑÔÐ ØÙ      Ð Ö Ó      Ð ¬ ÙÖ    Ü   º¾¼ ´Ô Ò ¿¿µ ÓÒ
        ÒÓ Ó Ò Ó Å Ö

        7.5.13     Componentes inconexos de un grafo
            Ó ÙÒ Ö Ó¸ × ×      Ø ÖÑ Ò Ö Ð ÒØ     ×Ù Ö Ó× Ò ÓÒ ÜÓ× ÕÙ ÐÓ ÓÒ ÓÖÑ Òº
          Ø Ð × ØÓ׸ ÓÒ× Ö ÑÓ× Ð × Ù ÒØ ÔÖ Ñ Ø Ú
¿         ÓÑÔÓÒ ÒØ × Ò ÓÒ ÜÓ× ¿ ≡                                 ¿
              template <class GT, class SA> inline
          void inconnected_components(GT & g, DynDlist<GT> & list);
        Í× × DynDlist ¿ Ò    inconnected components     ¿ º
        inconnected components() Ö     ÙÒ Ö Ó g Ý ÙÒ Ð ×Ø Ú listº ÄÙ Ó                          Ð ¹
         Ù ÓÒ Ð ÔÖ Ñ Ø Ú ¸ list ÓÒØ Ò ÐÓ× ×Ù Ö Ó× Ñ Ô Ó× g ÓÖÖ ×ÔÓÒ ÒØ                         × ×Ù×
         ÓÑÔÓÒ ÒØ × Ò ÓÒ ÜÓ׺ Ë g × ÓÒ ÜÓ¸ ÒØÓÒ × list ÓÒØ Ò ÙÒ ×ÓÐÓ Ö Óº
           À Ý Ú Ö × Ñ Ò Ö × ÔÖÓÚ Ö Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ         Ô Ö Ö ×ÓÐÚ Ö ×Ø ÔÖÓ¹
         Ð Ñ ¸ Ð ÙÒ × Ñ × ¬ ÒØ × Ý ÓØÖ × Ñ × × ÑÔÐ × ÑÔÐ ÒØ Öº Ò ØÓ Ó× ÐÓ× ×Ó׸ Ð
               × × Ö ÓÖÖ Ö ÐÓ× ÒÓ Ó× Ð Ö Ó × ÙÒ ÕÙ Ð ÒÓ Ó Ü Ñ Ò Ó × Ý Ú × Ø Ó
        Ó ÒÓº
           ÍÒ Ð ÓÖ ØÑÓ × ÑÔÐ ÓÒ× ×Ø Ò Ö Ð Þ Ö Ó× Ô × ×º Ä ÔÖ Ñ Ö Ö ÓÖÖ ÐÓ× Ö Ó× ÔÓÖ
        ÔÖÓ ÙÒ     Ý Ô ÒØ ÐÓ× ÒÓ Ó× × ÙÒ Ð ÓÒ Ø Ú º Ð ¬Ò Ð ×Ø Ô × ¸ ÐÓ× ÒÓ Ó× Ý
         Ö Ó× ÕÙ Ò Ô ÒØ Ó× × ÙÒ Ð ÓÐÓÖ Ð ÓÑÔÓÒ ÒØ Ò ÓÒ ÜÓ × Ð Ù Ð × Ò Ó ×Ù
7.5. Recorridos sobre grafos                                                       637



    Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ       º ÙÖ ÒØ ר Ô × × Ò× ÖØ Ò ÐÓ× ÒÓ Ó׸ Ñ × ÒÓ ÐÓ× Ö Ó׸ Ò
    ÐÓ× ×Ù Ö Ó× Ö ×ÙÐØ Ó׺
        ÈÓר Ö ÓÖÑ ÒØ ¸ Ò ÙÒ × ÙÒ Ô × ¸ × Ö ÓÖÖ Ò ÐÓ× Ö Ó× Ý ×ØÓ׸ × ÙÒ ×Ù ÓÐÓÖ¸
    × Ò× ÖØ Ò Ò ×Ù ÓÖÖ ×ÔÓÒ ÒØ ×Ù Ö Ó Ö ×ÙÐØ Óº Ä ÔÖ Ñ Ö Ô ×           Ð Ð ÓÖ ØÑÓ
    ØÓÑ O(E)¸ Ñ ÒØÖ × ÕÙ Ð × ÙÒ O(E)º ÈÓÖ Ø ÒØÓ¸ Ð Ð ÓÖ ØÑÓ × O(E)º
        Ë ÔÙ ÐÓ Ö Ö ÙÒ Ð ÓÖ ØÑÓ Ñ × ¬ ÒØ ÕÙ ÓÖÖ Ð × ÙÒ Ô × × × ÓÒרÖÙÝ
      Ö Ø Ñ ÒØ Ð ×Ù Ö Ó ÙÖ ÒØ Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ      ¸ Ò ÐÙ Ö ÔÓר Ö ÖÐÓ Ô Ö
    Ð × ÙÒ Ô × º ר × Ð Ò ÓÕÙ ÕÙ ÑÔÐ Ö ÑÓ׺
          ÓÒ× Ö ÑÓ× Ð ÔÖ Ñ Ø Ú × Ù ÒØ
¿      ÓÑÔÓÒ ÒØ × Ò ÓÒ ÜÓ× ¿ +≡                             ¿ ¿
         template <class GT, class SA> inline
     void build_subgraph(GT &                g,             //   grafo original
                         GT &                sg,            //   componente inconexo
                         typename GT::Node * g_src,         //   nodo actual en g
                         size_t &            node_count);   //   contador de nodos
    build subgraph() Ö     ÓÖÖ Ò ÔÖÓ ÙÒ        Ð Ö Ó g Ý ÓÒרÖÙÝ ÙÒ ÓÑÔÓÒ ÒØ sg × ÙÒ
    Ð ÓÒ Ø Ú           Ð ÒÓ Ó ÕÙ × ×Ø Ú × Ø Ò Óº g src × Ð ÒÓ Ó ØÙ Ð          g ÕÙ ×
     ÒØ ÒØ Ú × Ø Öº node count × ÙÒ ÓÒØ ÓÖ ×Ó Ö Ð ÒÙÑ ÖÓ ÒÓ Ó× Ú × Ø Ó× ÕÙ Ô ÖÑ Ø
        Ø Ø Ö Ù Ò Ó×        Ò×Ô ÓÒ Ó ØÓ Ó Ð Ö Óº
         build subgraph() × ÒÚÓ      Ó ÔÓÖ inconnected components()¸ Ð Ù Ð Ö ÓÖÖ ØÓ Ó×
    ÐÓ× ÒÓ Ó× Ð Ö Ó Ý¸ Ô Ö           ÒÓ Ó curr node ÕÙ ÒÓ Ý × Ó Ú × Ø Ó¸ Ö Ð Þ ÙÒ
    ÐÐ Ñ        build subgraph()¸ Ð Ù Ð ÓÒרÖÙ Ö Ð ÓÑÔÓÒ ÒØ Ò ÓÒ ÜÓ ÓÖÖ ×ÔÓÒ ÒØ
      Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ           × curr nodeº È Ö ÔÓ Ö Ñ Ô Ö ØÓ Ó Ð ÓÑÔÓÒ ÒØ
     Ò ÓÒ ÜÓ¸ Ð Ø Ò ÓÒ          Ö Ð Þ Ö× Ù Ò Ó × Ý Ò Ö ÓÖÖ Ó ØÓ Ó× ÐÓ× Ö Ó׺
            Ó Ð × Ö ÒØ ÔÖ Ñ × ×¸ ÔÓ ÑÓ× ÒÙÒ Ö Ð Ð ÓÖ ØÑÓ ¬Ò Ø ÚÓ
¿       ÓÑÔÓÒ ÒØ × Ò ÓÒ ÜÓ× ¿ +≡                                   ¿   ¿
         template <class GT, class SA> inline
     void inconnected_components(GT & g, DynDlist <GT> & list)
     {
       g.reset_nodes();
       g.reset_arcs();
       size_t count = 0; // contador de nodos visitados
       for (typename GT::Node_Iterator i(g); // recorrer nodos de g
            count < g.get_num_nodes() and i.has_current(); i.next())
         {
           typename GT::Node * curr = i.get_current_node();
           if (IS_NODE_VISITED(curr, Build_Subtree))
             continue;
             // crear subgrafo componente inconexo conectado por curr_node
           list.append(GT()); // crea subgrafo y lo inserta en lista
           GT & subgraph = list.get_last(); // referencia grafo insertado en list
           build_subgraph <GT, SA> (g, subgraph, curr, count); // subgrafo a curr
         }
     }
      ¬Ò ×
      inconnected components¸ Ù× Ò ÙÒ       ¿º
    Í× × DynDlist ¿ Ò Node Iterator     º
             ÓÖ ÔÓ ÑÓ× ÑÔÐ ÒØ Ö build subgraph()¸ Ð Ù Ð × Ö Ñ Ø ÜÔÐÓÖ Ö Ò ÔÖÓ ÙÒ¹
               × ÙÒ ÒÓ Ó g src Ð Ù×ÕÙ         ØÓ Ó× ÐÓ× Ö Ó× Ý ÒÓ Ó× × ÕÙ Ð × ×
638                                                          Cap´
                                                                    ıtulo 7. Grafos



    g srcÝ ÕÙ ÓÒ ÓÖÑ Ö Ò ÙÒ ÓÑÔÓÒ ÒØ ÓÒ ÜÓ Ð Ö Ó
¿     ÓÑÔÓÒ ÒØ × Ò ÓÒ ÜÓ× ¿ +≡                                       ¿
        template <class GT, class SA> inline
      void build_subgraph(GT &                g,      // grafo original
                          GT &                sg,     // subgrafo componente inconexo
                          typename GT::Node * g_src, // nodo actual en g
                          size_t &            node_count)
      {
        if (IS_NODE_VISITED(g_src, Build_Subtree))
          return;
        NODE_BITS(g_src).set_bit(Build_Subtree, true); // marcar g_src visitado
        ++node_count;
        typename GT::Node * sg_src = // imagen de g_src en sg
          static_cast<typename GT::Node *>(NODE_COOKIE(g_src));
        if (sg_src == NULL) // ¿est´ mapeado g_src?
                                   a
          {     // No, cree imagen de g_src en el subgrafo sg y mapee
            sg_src = sg.insert_node(g_src->get_info());
            GT::map_nodes(g_src, sg_src);
          }
        for (Node_Arc_Iterator<GT, SA> i(g_src); // explore desde g_src
             node_count < g.get_num_nodes() and i.has_current(); i.next())
          {
            typename GT::Arc * arc = i.get_current_arc();
            if (IS_ARC_VISITED(arc, Build_Subtree))
              continue; // avance pr´ximo arco
                                    o
            ARC_BITS(arc).set_bit(Build_Subtree, true); // marque arc visitado
            typename GT::Node * g_tgt = i.get_tgt_node(); // nodo destino de arc
            typename GT::Node * sg_tgt = static_cast<typename GT::Node *>(NODE_COOKIE(g_tgt));
            if (sg_tgt == NULL) // ¿est´ mapeado en sg?
                                       a
              {    // no, hay que mapearlo e insertarlo en el subgrafo sg
                sg_tgt = sg.insert_node(g_tgt->get_info());
                GT::map_nodes(g_tgt, sg_tgt);
              }
                // tenemos los nodos en el subgrafo, insertamos arco y lo mapeamos
            typename GT::Arc * sg_arc = sg.insert_arc(sg_src, sg_tgt, arc->get_info());
            GT::map_arcs(arc, sg_arc);
            build_subgraph<GT,SA>(g, sg, g_tgt, node_count); // prosigue recursivamente
          }
      }
    Í× × Node Arc Iterator   º

    7.5.14    Puntos de articulaci´n de un grafo
                                  o
        Ó ÙÒ Ö Ó ÓÒ ÜÓ¸ ÙÒ punto de articulaci´n, o de corte × ÙÒ ÒÓ Ó Ø Ð ÕÙ Ð
                                               o
     Ð Ñ Ò Ö× Ú Ð Ö Ó Ò Ð Ñ ÒÓ× Ó× ×Ù Ö Ó× × ÙÒØÓ׺ Ä ¬ ÙÖ º¾¿ ÑÙ ×ØÖ ÙÒ
       ÑÔÐÓ Ò Ð Ù Ð ×Ù× ÔÙÒØÓ× ÖØ ÙÐ ÓÒ ×Ø Ò Ö × ÐØ Ó׺
        ÄÓ× ×Ù Ö Ó× × ÙÒØÓ× Ö ×ÙÐØ ÒØ × Ð Ð Ñ Ò ÓÒ ÐÓ× ÔÙÒØÓ× ÓÖØ ÙÒ Ö Ó
    × ÒÓÑ Ò Ò ÐÓÕÙ × Ó ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× º
        Ä Ø ÖÑ Ò ÓÒ ÐÓ× ÔÙÒØÓ×           ÖØ ÙÐ ÓÒ × ÙÒ Ñ ÒØ Ð Ô Ö Ð ÔÖÙ
    ÔÐ Ò Ö     Ý Ô Ö Ð ÙÒÓ× Ð ÓÖ ØÑÓ×      Ù Ó Ð Ú Þ ÕÙ ÓÒר ØÙÝ ÓØÖ ÔÐ ÓÒ
7.5. Recorridos sobre grafos                                                    639



               M       K                    B            E                  G


               I       J           A                               F


               L                                                   K        H
                                            D            C


                       ÙÖ º¾¿ ÍÒ Ö Ó Ý ×Ù× ÔÙÒØÓ×                ÖØ ÙÐ ÓÒ

Ñ × Ð Ù×ÕÙ Ò ÔÖÓ ÙÒ          º Ì Ñ Ò¸       ÖØÓ ÑÓ Ó¸ Ö Ú Ð ÐÓ× ÔÙÒØÓ× Ö Ø Ó×
   ÙÒ Ö Óº ÈÓÖ ÑÔÐÓ¸ Ò ÙÒ Ö Ð ØÖ ¸ ÐÓ× ÔÙÒØÓ× ÖØ ÙÐ ÓÒ Ò Ò ÐÓ× ÔÙÒØÓ×
ÕÙ Ð ÐÐ Ö ÔÙ Ò ÓÑÔÖÓÑ Ø Ö Ð Ö ÐÓ Ñ ×ÑÓ ÔÐ          Ð Ñ ÝÓÖ       Ð×× Ö ×
   ØÖ Ò×ÔÓÖØ ¸ Ô ÕÙ Ø × Ö ¸ Ø Ø Ö º
      ÒÐ     Ù ÓÒ ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ø ÖÑ Ò ÐÓ× ÒÓ Ó× ÓÖØ ¸ × Ñ Ò ×Ø Ö Ö ¹
Ø Ö Þ Ö Ð ÙÒ × ×Ù× ÔÖÓÔ    × Ý ×Ù× Ö Ð ÓÒ × ÓÒ ÙÒ Ö ÓÐ Ö ÓÖ ÔÖÓ Ù Ó ÔÓÖ
ÙÒ Ù×ÕÙ        Ò ÔÖÓ ÙÒ  º ÓÑ Ò ÑÓ× ÔÓÖ Ð Ñ × × ÑÔÐ         ØÓ ׸ Ö Ø Ö Þ
ÔÓÖ Ð × Ù ÒØ Ð Ñ º
Lema 7.1 Ë ÙÒ ÒÓ Ó v × ÓÖØ ¸ Ø Ð ÕÙ Ú ÙÒ Ö Ó G Ò Ó× ÓÑÔÓÒ ÒØ × G1 Ý
G2¸ Ö ×Ô Ø Ú
           Ñ ÒØ ¸ ÒØÓÒ ×¸        Ñ ÒÓ × ÙÒ ÒÓ Ó u Ò G1        ÙÒ ÒÓ Ó w Ò
G2      ¸Ò × Ö Ñ ÒØ ¸ ÓÒØ Ò Ö vº
Demostraci´n Ë Ð Ð Ñ ÒÓ Ù ×
          o                       ÖØÓ¸ ÒØÓÒ × × Ö ÓÒØÖ ØÓÖ Ó ÕÙ v Ù × ÙÒ
ÔÙÒØÓ ÓÖØ ¸ ÔÙ × Ü ×Ø Ö ÓØÖÓ Ñ ÒÓ ÒØÖ u Ý w ÕÙ Ò Ö ÓØÖ Ö Ñ            ÓÒ ¹
Ø Ú º Ä × Ù ÒØ ¬ ÙÖ ÒÓ× Ô ØÓÖ Þ ×Ø × ØÙ ÓÒ

                           u                    v                   w
                                                    G2
                                       G1




    Ä ÔÖÓÔ     ÒØ Ö ÓÖ × ÑÔÓÖØ ÒØ Ô Ö Ö Ø Ö Þ Ö ÙÒ Ö Ð ÓÒ ÕÙ Ô Ö ÒØÖ ÙÒ
ÒÓ Ó ÓÖØ Ù Ò Ó ×Ø × Ö Þ ÙÒ Ö ÓÐ Ö ÓÖ ÔÖÓ ÙÒ                 º Ò ×Ø × ÒØ Ó¸
ÔÓ ÑÓ× ÑÓ×ØÖ Ö ÓØÖÓ Ð Ñ ÕÙ ÓÒר ØÙÝ Ð ÔÖ Ñ Ö ÙÒ Ñ ÒØÓ Ô Ö ÙÒ Ð ÓÖ ØÑÓ
  Ð ÙÐÓ ÒÓ Ó× ÓÖØ º
                               B            F                I          J


                   A                   D            H


                               C            G                L          K


                       ÙÖ º¾ ÍÒ Ö Ó ÓÒ ÙÒ ÔÙÒØÓ                  ÖØ ÙÐ ÓÒ
640                                                             Cap´
                                                                   ıtulo 7. Grafos



Lema 7.2 Ë T Ð Ö ÓÐ Ö ÓÖ ÔÖÓ ÙÒ            ÙÒ Ö Ó G =< V, E > Ò Ö Ó
Ô ÖØ Ö ÙÒ ÒÓ Ó vº ÒØÓÒ ×¸ v × ÙÒ ÒÓ Ó ÓÖØ ÙÒ Ö Ó G × Ý ×ÓÐÓ × Ð Ö Þ v
Ø Ò Ñ × ÙÒ Óº
Demostraci´n È Ö
          o         ÑÓ×ØÖ Ö Ð Ò × ¸ ÔÐ ÒØ ÑÓ× Ð Ò Ó Ð Ð Ñ ×ÙÔÓÒ ¹
ÑÓ× ÕÙ v × ÙÒ ÒÓ Ó ÓÖØ ÓÒ ÙÒ ÙÒ Ó Ó w
                                   v


                                  w         G-v
                                                            .
                                                            .




Ë Ð × ØÙ ÓÒ Ù × × ¸ ÒØÓÒ × w × Ö Ö Þ ÙÒ Ö ÓÐ Ö ÓÖ Ò ÔÖÓ ÙÒ       ÕÙ
 Ù Ö ÒØ Ö Ñ ÒØ Ð Ö ×ØÓ ÐÓ ÒÓ Ó× V − {v}¸ ÐÓ ÕÙ ÓÒØÖ Ð ¬ÖÑ ÓÒ ÕÙ v
 × ÙÒ ÒÓ Ó ÓÖØ º ÈÙ ×ØÓ ÕÙ Ð Ò ÓÒ Ð Ð Ñ × ÙÒ ÓÒØÖ       ÓÒ¸ × Ò × Ö Ó
ÕÙ v Ø Ò Ó× Ó Ñ × Ó× Ò Ð Ö ÓÐ Ö ÓÖ
     Ò Ù ÒØÓ Ð ×Ù¬ Ò ¸ ×ÙÔÓÒ ÑÓ× Ó× ÒÓ Ó× u Ý w Ó× v
                                  v

           u                                            w




Æ Ò ÙÒÓ ÐÓ× × Ò ÒØ × u × Ò ×ØÖÓ Ó × Ò ÒØ                     w Ò T Ò ÐÓ Ñ ÒØ ¸
ÐÓ Ñ ×ÑÓ Ó ÙÖÖ Ô Ö wº ÈÙ ×ØÓ ÕÙ T Ù Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ          ¸ ØÓ Ó× ÐÓ× ÒÓ Ó× Ð
×Ù ¹ Ö ÓÐ u ×ÓÒ Ú × Ø Ó× ÒØ × ÕÙ ÐÓ× ÒÓ Ó× Ð ×Ù ¹ Ö ÓÐ wº ×ØÓ Ò ÕÙ Ò Ò ÙÒ
ÒÓ Ó v ר ÓÒ Ø Ó ÙÒ ÒÓ Ó w ÔÓÖ Ð ÙÒ Ö Ó G¸ ÔÓÖÕÙ × ÒÓ Ð Ö ÓÖÖ Ó Ò
ÔÖÓ ÙÒ       ÐÓ× Ù × × Ù ÖØÓº ÄÓ ÕÙ ÑÔÐ ÕÙ                  Ñ ÒÓ ÒØÖ ÙÒ ÒÓ Ó Ð
×Ù ¹ Ö ÓÐ u       ÙÒ ÒÓ Ó Ð ×Ù ¹ Ö ÓÐ w ÓÒØ Ò Ð ÒÓ Ó Ö Þ v¸ Р٠и ÔÓÖ Ð Ð Ñ º½¸
 × ÙÒ ÔÙÒØÓ ÓÖØ
        ר Ð Ñ ¸ ÔÓ ÑÓ× × Ò Ö ÙÒ ÔÖ Ñ Ö Ð ÓÖ ØÑÓ ÓÒ× ×Ø ÒØ Ò Ü Ñ Ò Ö          ÒÓ Ó
v¸ Ð ÙÐ Ö ×Ù Ö ÓÐ      Ö ÓÖ Ò ÔÖÓ ÙÒ         Ô ÖØ Ö v Ý Ú Ö ¬ Ö × v Ø Ò Ñ ×
ÙÒ Ö Ñ º Ä ÓÑÔÐ           × O(V) Ú × ÐÓ ÕÙ ÑÓÖ            Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ        º
ÈÓÖ Ø ÒØÓ¸ Ð Ô ÓÖ × ÑÔ ÒÓ ×Ø Ð ÓÖ ØÑÓ × O(V        2) Ó O(V × E) × ÙÒ Ð     Ò×
   Ð Ö Óº
      Ð Ð ÓÖ ØÑÓ ÒØ Ö ÓÖ ÔÙ Ö Ð Þ Ö× × Ò Ò ×               ÓÒרÖÙ Ö Ð Ö ÓÐ Ö¹
    ÓÖº      ר ÓÒ Ö Ð Þ Ö ÙÒ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ              ØÖ ÓÒ Ð × Ó Ò
  depth first traversal() Ý ÔÖ ×Ø Ö Ø Ò ÓÒ Ð Ð ÞÓ ÜØ ÖÒÓ ÕÙ Ò      Ð ÜÔÐÓÖ ÓÒ
Ô ÖØ Ö ÙÒ ÒÓ Ó vº Ë Ð ÐÐ Ñ        depth first traversal() ×Ó Ö Ð ÔÖ Ñ Ö Ö Ó      v
ÒÓ Ù Ö ØÓ Ó× ÐÓ× ÒÓ Ó׸ ÒØÓÒ × v ÓÑÓ Ö Þ Ð Ö ÓÐ Ö ÓÖ Ò ÔÖÓ ÙÒ                 Ø Ò
Ñ × ÙÒ Ö Ñ Ý ×¸ ÔÓÖ Ø ÒØÓ¸ ÙÒ ÒÓ Ó ÓÖØ º
     ÈÙ Ò Ð ÙÐ Ö× ÐÓ× ÔÙÒØÓ×        ÓÖØ ÓÒ ÙÒ ×ÓÐ ÜÔÐÓÖ ÓÒ Ò ÔÖÓ ÙÒ               Ð
 Ö Ó ÆÓ× ÔÖÓÜ Ñ Ö ÑÓ× Ð Ö ×ÔÙ ×Ø Ñ ÒØ ÓØÖÓ Ð Ñ º
7.5. Recorridos sobre grafos                                                                                                                                                                                                                                                      641



                        ººº
                         ººº
                        ººº
                             ºº
                             ºº
                            ºº    D   ºº
                                      ºº
                                       ºº
                       ºº
                        º
                        º                   ºº
                                            ºº
                                             ºº
                   ºº º
                  ºººº
                  ºº º
              ºº ºº
             ºº ºº
             ºº ºº
                                                  ºº
                                                  ºº
                                                   ºº
          ºº º
         ºº ºº º
         ºº ºº                                          ºº
                                                        ºº
      ºº º
     ºº ºº
      º º                                             ºº
    º ºº
   º º
   º º                            B                    ºº
                                                        º
  º ºº
  º º                       ººº
                           ººº
                           ººº        ºº
                                      ºº
                                       ºº
                                        º                 º
                                                          ºº
 º
  ºº                ººº
                   ººº
                    ºº                      ºº
                                            ºº
                                             ºº
                                                           º
                                                             º
º
º            ººº
              ºº
             ºº                               º              ºº
                                                              º
º º ºº
ººº º ºº
ººº º ºº
                                                   ºº
                                                   ºº
                                                    ºº         ºº
º º  º                                              ºº
                                                     ºº         ºº
 º
ºº
ºº                                                   ºº          º
º
ºº
 º                                                      ºº        º
                                                                  º
                                                                  º
ºº
ºº                                                       ºº
                                                         º
º º
ºº
º ºº
º
º º
º
ºº º º
                                  A                         ºº º
                                                             º º
                                                             º º
                                                               º º
                                                                º º
                                                                                                                                             J   º
                                                                                                                                                 º
                                                                                                                                                  ºº
                                                                                                                                                  º
 º
 ººº ºº                                                         º º                                                                               ºº
                                                                                                                                                   º
                                                                                                                                                   º
 º ºº º
 º º ºº
    º                                                             º º
                                                                  ºº
                                                                  ºº
                                                                                                                                                   º
                                                                                                                                                     º
  º ºº ºº
  º ºº ºº º                                                                                                                                         ººº
  º º ºº º ºº ºº
           ºº º
                                                                   ºº
                                                                    ºº
                                                                    ºº
                                                                                                                                                     ºº
                                                                                                                                                     º
                                                                                                                                                     ºº
   º
   º        º º                                                      º
   º            ººº ºº
                ººº ºº
                 ºº ºº                                               º
                                                                     º                                                                                 ºº
                                                                                                                                                       ºº
     º                 ºº
                      ºººº                                                                                                                             ºº
                                                                                                                                                        ºº
     ºº
      º
        ºº
        ºº
                       ºººº
                       º ºº  ºº
                             ºº
                              º   C                                 ºº
                                                                    º
                                                                    ºº
                                                                   ºº
                                                                   º
                                                                   ºº
                                                                     º                                                                       I     ºº º º
                                                                                                                                                   º ºº
                                                                                                                                                         ºº
                                                                                                                                                         ºº
                                                                                                                                                    º º ºº
           ºº
            ºº
            º                                                     ºº
               ºº
               ºº
                                                                 ºº
                                                                 ºº
                                                                 ºº                                                                                    º º º
                                                                                                                                                        º º ºº
                                                                                                                                                        º º º
                ºº                                                 º                                                                                    º º º
                    ºº
                    ºº                                         º º
                                                               º                                                                                          ºº º
                                                                                                                                                          ºº º
                     ºº                                       º                                                                                           ºº º
                         ºº
                         ºº
                          ºº                                 º º
                                                            º º
                                                            º º                                                                                             ºº º
                                                                                                                                                            ºº º
                                                                                                                                                             º
                                                           º º                                                                                               ºº º
                            º
                                  G   ººº
                                      ººº
                                       ººº
                                            ººº º ººº
                                             ººº º º
                                             ºº       ºº º
                                                          º º
                                                         º º
                                                         º º                                                                         º
                                                                                                                                     º
                                                                                                                                      º      H                ºº º
                                                                                                                                                               º º
                                                                                                                                                               º º
                                                                                                                                                               ºº º
                                                                                                                                                                ºº º
                                                                                                                                                                                                                                                    º
                                                                                                                                                                                                                                                    º
                                                                                                                                                                                                                                                     º      H      º
                                                                                                                                                                                                                                                                   ºº
                                                     º
                                                    ºººº
                                                   ºººº
                                                    ººº                                                                             º
                                                                                                                                    ºº                          ººº º
                                                                                                                                                                ººº
                                                                                                                                                                 ºº                                                                                º
                                                                                                                                                                                                                                                   ºº               º
                                                 ººº ºº                                                                                                                                                                                                                 º
                                                ººº ºº º
                                                 ººº ºº
                                                  ºº                                                                               º
                                                                                                                                   º
                                                                                                                                   º
                                                                                                                                                                 º ºº
                                                                                                                                                                 º ºº
                                                                                                                                                                  º ºº                                                                            º
                                                                                                                                                                                                                                                  º
                                                                                                                                                                                                                                                  º
                                                                                                                                                                                                                                                                        ºº
                                             ºº
                                            ººº
                                                              ºº
                                                               º
                                                               ºº                                                                  º                              º º                                                                                                        º
                                            ººº
                                             ºº
                                             ºº                   ºº                                                                                               º ºº
                                                                                                                                                                   º ºº                                                                                                      º
                                                                                                                                                                                                                                                                             ºº
                                         ºº                         º                                                            º
                                                                                                                                 º                                  º ºº
                                                                                                                                                                    º ºº                                                                        º
                                                                                                                                                                                                                                                º                              º
                                        ºº
                                        ººº
                                         ºº
                                          º                         ºº                                                           º
                                                                                                                                 º                                  º
                                                                                                                                                                     º ºº
                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                º                              ºº
                                  F                                  º
                                                                     º
                                                                     º
                                                                     º                    º
                                                                                                º
                                                                                               ºº
                                                                                              ºº
                                                                                              ºº
                                                                                                    F     ºº
                                                                                                          ºº
                                                                                                           ºº                   º
                                                                                                                                º
                                                                                                                                º
                                                                                                                                                                     º º   º      L                      º
                                                                                                                                                                                                             ºº
                                                                                                                                                                                                               º
                                                                                                                                                                                                              ºº
                                                                                                                                                                                                             ºº
                                                                                                                                                                                                                   F       ºº
                                                                                                                                                                                                                           ºº
                                                                                                                                                                                                                            ºº                 º
                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                                                  º
                                                                                                                                                                                                                                                                                  ºº
                                                                                                                                                                                                                                                                                    ºº
                                                                                                                                                                                                                                                                                                  I   ººº
                                                                                                                                                                                                                                                                                                      ººº
                                                                                                                                                                                                                                                                                                       ººº
                                                                                                                                                                                                                                                                                                            ººº
                                                                                                                                                                                                                                                                                                             ººº
                                                                                                                                                                                                                                                                                                             ºº
                                                                    º                    ºº
                                                                                        ºº
                                                                                        ºº                                     ºº                                     º                                 ºº
                                                                                                                                                                                                       ºº
                                                                                                                                                                                                       ºº                                      º
                                                                                                                                                                                                                                               º                                     º
                                                                ººº
                                                                 º                                              ºº
                                                                                                                ºº
                                                                                                                 ºº            º                                      º
                                                                                                                                                                      ºº                                                       ºº
                                                                                                                                                                                                                               ºº
                                                                                                                                                                                                                                ºº            º
                                                                                                                                                                                                                                              º                                        º
                                                                                                                                                                                                                                                                                       º                         ººº
                                                                                                                                                                                                                                                                                                                  ºº
                                                                                                                                                                                                                                                                                                                   ºº
                                                            ºº
                                                                º                  ºº
                                                                                  ºº
                                                                                  ºº
                                                                                                                               º                                                                 ºº
                                                                                                                                                                                                 ºº
                                                                                                                                                                                                   º
                                                                                                                                                                                                  ºº                                                                                     º
                                                                                                                                                                                                                                                                                         º                            ºº
                                                                                                                                                                                                                                                                                                                       ºº
                                                                                                                                                                                                                                                                                                                       ºº
                                                            ºº
                                                             º                                                      ºº
                                                                                                                     ºº
                                                                                                                     ºº º     º                                         º                                                           ºº
                                                                                                                                                                                                                                    ºº
                                                                                                                                                                                                                                     ºº º    º                                                                            ºº
                                                                                                                                                                                                                                                                                                                          ºº
                                                                                                                                                                                                                                                                                                                           º
                                                       ºº
                                                       ºº
                                                      ºº                         ºº
                                                                                ºº
                                                                                ºº                                           º
                                                                                                                             º
                                                                                                                                                                        ºº
                                                                                                                                                                         º                      ºº
                                                                                                                                                                                               ºº
                                                                                                                                                                                               ºº                                           º                                             ºº
                                                                                                                                                                                                                                                                                          º                                  ºº
                                                 ººº
                                                ººº
                                                ººº                                                                     ºº
                                                                                                                         º                                                                                                              ºº  º                                              º                                  ºº
                                                                            ºº
                                                                            ºº
                                                                             º                                           ºº                                               º
                                                                                                                                                                          ºº                ºº
                                                                                                                                                                                           ºº
                                                                                                                                                                                            º                                           ººº                                                                                     º
                                  H       ººº
                                          ººº
                                         ººº                                                        B                       º
                                                                                                                           ººº                                             º      K      º                         B                       º
                                                                                                                                                                                                                                          ººº
                                                                                                                                                                                                                                                                                             º
                                                                                                                                                                                                                                                                                             º    L                              º
                      ººº
                     ººº
                     ººº                                                ºº
                                                                         º
                                                                         º                   ººº
                                                                                            ººº
                                                                                            ººº         ºº
                                                                                                        ºº
                                                                                                         ºº
                                                                                                          º               ºº º                                              º          ººº                   ººº
                                                                                                                                                                                                            ººº
                                                                                                                                                                                                            ººº        ºº
                                                                                                                                                                                                                       ºº
                                                                                                                                                                                                                        ºº
                                                                                                                                                                                                                         º                ºº º                                              ººº
                                                                                                                                                                                                                                                                                           ººº
                                                                                                                                                                                                                                                                                           ººº
                                                                                                                                                                                                                                                                                                                                 º
                                                                                                                                                                                                                                                                                                                                 º
                 ººº
                 ººº
                  ºº                                                  º
                                                                      ºº
                                                                                  º º ººº
                                                                                       ºº
                                                                                      ºº                      ºº
                                                                                                              ºº
                                                                                                               ºº        º ºº
                                                                                                                         º º
                                                                                                                          º º                                                        º
                                                                                                                                                                                     ºº
                                                                                                                                                                                                 º º ººº
                                                                                                                                                                                                      ºº
                                                                                                                                                                                                      ºº                     ºº
                                                                                                                                                                                                                             ºº
                                                                                                                                                                                                                              ºº         º ºº
                                                                                                                                                                                                                                         º º
                                                                                                                                                                                                                                         º º                                          ººº
                                                                                                                                                                                                                                                                                      ººº
                                                                                                                                                                                                                                                                                       ºº                                      º
                                                                                                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                                                                                                º
             ººº
              ºº
             ºº                                                     º ºº ºº
                                                                    º            ºº
                                                                                ºº                               º
                                                                                                                   ºº º
                                                                                                                    ºº ºº         º
                                                                                                                                  º                                                º ºº ºº
                                                                                                                                                                                   º            ºº
                                                                                                                                                                                               ºº                               º
                                                                                                                                                                                                                                   ºº º
                                                                                                                                                                                                                                   ºº º º        ºº                               ººº
                                                                                                                                                                                                                                                                                   ºº
                                                                                                                                                                                                                                                                                  ºº                                         ºº
                                                                                                                                                                                                                                                                                                                            ºº
                                                                                                                                                                                                                                                                                                                            º
          ºº
         ºº
          º                                                         º ºº    º                                       ºº             º
                                                                                                                                   º                                              º ºº     º                                        ºº            º
                                                                                                                                                                                                                                                  º                       ºº
                                                                                                                                                                                                                                                                         ºº
                                                                                                                                                                                                                                                                          º                                                 º
      ºº
     ºº
      º                                                           º ºº º
                                                                  º º   º                                                           º                                            º ºº º
                                                                                                                                                                                 º º   º                                                            º                 ºº
                                                                                                                                                                                                                                                                     ºº
                                                                                                                                                                                                                                                                      º                                                  ºº
                                                                                                                                                                                                                                                                                                                        ºº
                                                                                                                                                                                                                                                                                                                         º
  ººº
   º                                                              º º
                                                                 ºº                                                    ººº
                                                                                                                       ºº
                                                                                                                       ºººº          º
                                                                                                                                     º                                           º º
                                                                                                                                                                                ºº                                                    ººº
                                                                                                                                                                                                                                       ºº
                                                                                                                                                                                                                                       ºººº         º
                                                                                                                                                                                                                                                    º
                                                                                                                                                                                                                                                    º              ºº
                                                                                                                                                                                                                                                                   º                                                 ºº
                                                                                                                                                                                                                                                                                                                     ºº
                                                                                                                                                                                                                                                                                                                    ºº
 º                                                               ºº
                                                                 ºº                                                   º ºº
                                                                                                                      º º
                                                                                                                      º ºº            º
                                                                                                                                      ºº                                        ºº
                                                                                                                                                                                ºº                                                   º ºº
                                                                                                                                                                                                                                     ºº ºº   º       ºº
                                                                                                                                                                                                                                                      º          ºº
                                                                                                                                                                                                                                                                 º                                             ººº
                                                                                                                                                                                                                                                                                                               ººº
                                                                                                                                                                                                                                                                                                                ºº
º                                                                º                                                                                                              º                                                                               º
º
º
º
ºº
                                  I   ººº
                                      ººº
                                       ººº
                                            ººº
                                             ººº
                                             ºº
                                                                º
                                                                º
                                                                º
                                                                 º
                                                                 º
                                                                 ºº
                                                                 ºº
                                                                                                    A               º
                                                                                                                    º
                                                                                                                     º          º º
                                                                                                                                 º º
                                                                                                                                 º º
                                                                                                                                  º º
                                                                                                                                   º º
                                                                                                                                   º º
                                                                                                                                    º º
                                                                                                                                                                                º
                                                                                                                                                                                º
                                                                                                                                                                                º
                                                                                                                                                                                º
                                                                                                                                                                                º
                                                                                                                                                                                ºº
                                                                                                                                                                                ºº
                                                                                                                                                                                                                   A               ºº
                                                                                                                                                                                                                                    º
                                                                                                                                                                                                                                               º º
                                                                                                                                                                                                                                                º º
                                                                                                                                                                                                                                                º º
                                                                                                                                                                                                                                                 º º
                                                                                                                                                                                                                                                  º º
                                                                                                                                                                                                                                                   º º
                                                                                                                                                                                                                                                   º º
                                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                                 º
                                                                                                                                                                                                                                                                                                  J      ººº
                                                                                                                                                                                                                                                                                                         ººº
                                                                                                                                                                                                                                                                                                          ºº
 ººº                                              ººº
                                                  ºº
                                                   ºº            ººº                                               º
                                                                                                                   º
                                                                                                                   º                º                                           ººº                                               º
                                                                                                                                                                                                                                  º
                                                                                                                                                                                                                                  º                º             ººº
    ºº
    ºº                                                ºº          º ºº
                                                                  º º º                                                              º º
                                                                                                                                      º
                                                                                                                                      ºº                                         º ºº
                                                                                                                                                                                 º º º                                                               º º
                                                                                                                                                                                                                                                     ºº
                                                                                                                                                                                                                                                     ºº             º
                                                                                                                                                                                                                                                                    ººº
       ºº                                              ºº
                                                        ºº                                                        º
       ºº
        º
           ºº
           ºº                                              ºº º ºº º
                                                           ºº º ºº º
                                                            º      º º º                                         º
                                                                                                                 º                     ºº
                                                                                                                                       ºº
                                                                                                                                        º
                                                                                                                                                                                  º ºº
                                                                                                                                                                                  º ºº º
                                                                                                                                                                                  º º º                                         º
                                                                                                                                                                                                                                ºº                    ºº
                                                                                                                                                                                                                                                       º
                                                                                                                                                                                                                                                       º
                                                                                                                                                                                                                                                                       ºº
                                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                                           ºº
                                                                                                                                                                                                                                                                           ºº
            ºº                                                º º
                                                               º º            ºº
                                                                               º º                              º                        º                                         ºº        ºº
                                                                                                                                                                                              º
                                                                                                                                                                                              º                                º                        º                   ºº
              ººº
               ººº
               ºº                                              º º                 ººº
                                                                                   ºº
                                                                                    ºº                          º
                                                                                                                º                       ºº
                                                                                                                                         º
                                                                                                                                         º                                          ºº            ººº
                                                                                                                                                                                                  ººº
                                                                                                                                                                                                   ºº                         ºº                        º
                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                        º                           ººº
                                                                                                                                                                                                                                                                                    ººº
                                                                                                                                                                                                                                                                                     ºº
                    ººº                                         º º
                                                                 º º                    ººº                                             º                                             º                 ººº                                             º                               ººº
                 ººº
                 ººº
                  ºº
                    ººº
                     ººº
                        ººº
                       ººº
                       ººº        L                              º
                                                                  º º
                                                                  º ºº
                                                                  º
                                                                  º
                                                                  º       ºº
                                                                           º
                                                                                         ººº
                                                                                         ººº
                                                                                        º º
                                                                                       ºº
                                                                                      ºº
                                                                                             ººº
                                                                                            ººº
                                                                                             ºº     C         º
                                                                                                              º
                                                                                                              º
                                                                                                                                        º
                                                                                                                                        º
                                                                                                                                       ºº
                                                                                                                                       ºº
                                                                                                                                       ºº
                                                                                                                                         º
                                                                                                                                         º
                                                                                                                                         º
                                                                                                                                                                                      ºº
                                                                                                                                                                                         ºº
                                                                                                                                                                                          º
                                                                                                                                                                                          º
                                                                                                                                                                                                         ººº
                                                                                                                                                                                                         ººº
                                                                                                                                                                                                        º º
                                                                                                                                                                                                       ºº
                                                                                                                                                                                                      ºº
                                                                                                                                                                                                              ºº
                                                                                                                                                                                                            ººº
                                                                                                                                                                                                             ºº    C         º
                                                                                                                                                                                                                             º
                                                                                                                                                                                                                             º
                                                                                                                                                                                                                                                       ºº
                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                       ºº
                                                                                                                                                                                                                                                      ºº
                                                                                                                                                                                                                                                      ºº
                                                                                                                                                                                                                                                                                        ººº
                                                                                                                                                                                                                                                                                         ººº
                                                                                                                                                                                                                                                                                                  K
                                                                º
                                                                º             ºººº ºº
                                                                              ºººº º                        ºº                        º                                                      ºººº ºº
                                                                                                                                                                                             ºººº º                        ºº                        º
            ººº
             ºº
            ºº                                               ººº
                                                              º                ººº                          º                         ºº
                                                                                                                                     ºº
                                                                                                                                     ºº                                                       ºººº                         º                         ºº
                                                                                                                                                                                                                                                     ºº
                                                                                                                                                                                                                                                    ºº
         ºº
        ºº
        ºº                                                   º             ºº ºº
                                                                           ºº ºº
                                                                            º º                            º                        ºº                                                     ºº ºº
                                                                                                                                                                                          ºº ºº
                                                                                                                                                                                           º º                                                     ºº
     ºº
      º                                                  ºº
                                                         ºº
                                                          º           ºººº          º                      º
                                                                                                           º                        ºº
                                                                                                                                   ºº                                                 º
                                                                                                                                                                                      ººº          º                     º
                                                                                                                                                                                                                          º
                                                                                                                                                                                                                          º                        ºº
                                                                                                                                                                                                                                                  ºº
  ººº
   º                                                 ºº
                                                     ºº
                                                    ºº              ºº
                                                                    º                 ºº
                                                                                      ºº
                                                                                       ºº                                         º º
                                                                                                                                 º º                                               º
                                                                                                                                                                                   º
                                                                                                                                                                                     º               ºº
                                                                                                                                                                                                      ºº
                                                                                                                                                                                                      ºº                                         º
                                                                                                                                                                                                                                                º ºº
                                                                                                                                                                                                                                                 º º
ºº
 º                                              ººº
                                               ººº
                                               ººº               ºº
                                                                  º
                                                                   º                      ºº
                                                                                          ºº
                                                                                           ºº
                                                                                                         º
                                                                                                         º
                                                                                                         º                       º º
                                                                                                                                   º                                            ºº
                                                                                                                                                                                 º
                                                                                                                                                                                  º                       ºº
                                                                                                                                                                                                           ºº
                                                                                                                                                                                                           ºº
                                                                                                                                                                                                                        º
                                                                                                                                                                                                                        º
                                                                                                                                                                                                                        º                         º
º
º
º
º
 º
                                  J      ººº
                                         ººº
                                          ºº                    º
                                                                ºº
                                                                 º
                                                                  º
                                                                                             º
                                                                                                    G                         ºº º
                                                                                                                              º º
                                                                                                                            º º
                                                                                                                          ºº º
                                                                                                                           º º
                                                                                                                           º º
                                                                                                                                  º                                             º
                                                                                                                                                                                º
                                                                                                                                                                                º
                                                                                                                                                                                º
                                                                                                                                                                                 º
                                                                                                                                                                                                             º
                                                                                                                                                                                                                   G                         ºº º
                                                                                                                                                                                                                                              º º
                                                                                                                                                                                                                                            º º
                                                                                                                                                                                                                                          ºº º
                                                                                                                                                                                                                                           º º
                                                                                                                                                                                                                                          º º
                                                                                                                                                                                                                                                  º
 º                                                                 º                                                        º                                                     º
  ºº
    ºº
    ºº
                                                                   ºº
                                                                     ºº
                                                                     ºº
                                                                                                                        º º
                                                                                                                        º º
                                                                                                                       º º
                                                                                                                       ºº º
                                                                                                                                                                                  ºººº
                                                                                                                                                                                    ºº                                                 º ºº
                                                                                                                                                                                                                                        º º
                                                                                                                                                                                                                                       º º
                                                                                                                                                                                                                                      ºº º
       ºº
       ºº                                                               ºº
                                                                        ºº                                          º º
                                                                                                                   º º  º                                                              ºº
                                                                                                                                                                                        ºº                                         º º
                                                                                                                                                                                                                                  º º  º
        º
          ºº
          ºº
           ºº
                                                                         º
                                                                             ºº
                                                                             ºº
                                                                              ºº                                  ºº º
                                                                                                                  ºº º
                                                                                                                   º
                                                                                                                                                                                        º
                                                                                                                                                                                            ºº
                                                                                                                                                                                             ºº
                                                                                                                                                                                             ºº                                   ºº º
                                                                                                                                                                                                                                 ºº º
                                                                                                                                                                                                                                  º
                                                                                                                  º                                                                                                              º
              ººº
              ººº
               ºº                                                                 ººº
                                                                                   ººº
                                                                                   ºº                         ºº º
                                                                                                             ºº º
                                                                                                             ºº º                                                                                 ººº
                                                                                                                                                                                                  ººº
                                                                                                                                                                                                   ºº                        ºº º
                                                                                                                                                                                                                            ºº º
                                                                                                                                                                                                                            ºº º
                  ººº                                                                   ººº                 ºº
                                                                                                            ºº
                                                                                                           ºº                                                                                           ººº                ºº
                                                                                                                                                                                                                          ººº
                                                                                                                                                                                                                          ºº
                  ººº
                   ººº
                                  K                                                      ººº
                                                                                         ººº
                                                                                                    D   ººº
                                                                                                         ºº
                                                                                                        ºº
                                                                                                                                                                                                         ººº
                                                                                                                                                                                                         ººº
                                                                                                                                                                                                                   D    ºº
                                                                                                                                                                                                                       ºº
                                                                                                                                                                                                                       ºº




                                  ´µ                                                                               ´ µ ÓÑ ÒÞÓ Ò Â                                                                                                 ´ µ ÓÑ ÒÞÓ Ò À
                                   ÓÑ ÒÞÓ
                                   Ò

                                     ÙÖ º¾        Ö ÓÐ ×                                                            Ö     ÓÖ × Ð Ö Ó Ð ¬ ÙÖ º¾ ÙÒØÓ ÓÒ ÐÓ× Ö Ó× ÒÓ¹
                                     Ö ÓÖ ×º Ì ÒØÓ Ò Ð                                                                ¬ ÙÖ ´ µ ÓÑÓ ´ µ¸ Ò Ò ÙÒ × Ò ÒØ Ð ÒÓ Ó À Ø Ò
                                  ÙÒ Ö Ó ÒÓ¹ Ö ÓÖ ÕÙ                                                                 ÓÒ Ø ÙÒ Ò ×ØÖÓ Àº Ò Ð ¬ ÙÖ ´ µ¸ À × Ö Þ Ý ÓÒØ Ò
                                   Ó× Ö Ñ ×¸ ÐÓ ÕÙ × Ø ×                                                              Ð Ð Ñ º¾º
                                                                                                                           B                                       F                                                   I                                    J


                                                                                                    A                                            D                                               H


                                                                                                                           C                                       G                                                   L                                    K


                                                                                                        ÙÖ º¾ ÍÒ Ö Ó × Ò ÔÙÒØÓ×                                                                                              ÖØ ÙÐ ÓÒ

                                  Lema 7.3    Ë G =< V, E > ÙÒ Ö Óº Ë T =< V, E >, E ⊂ E ÙÒ Ö ÓÐ Ö ÓÖ
                                  ÔÖÓ ÙÒ          Gº Ë E ⊂ E Ð ÓÒ ÙÒØÓ    Ö Ó× ÒÓ¹ Ö ÓÖ × ¸ Ó× ÔÓÖ ÐÓ× Ö Ó×
                                  ÕÙ ×Ø Ò Ò E Ô ÖÓ ÒÓ Ò E º
                                       ÒØÓÒ ×¸ ÙÒ ÒÓ Ó v ∈ G¸ ÕÙ ÒÓ × Ö Þ T ¸ × ÙÒ ÒÓ Ó ÓÖØ × Ý ×ÓÐÓ × v Ø Ò
                                  ÙÒ Ó w Ò T Ø Ð ÕÙ Ò Ò ÙÒ × Ò ÒØ w ר ÓÒ Ø Ó ÙÒ Ò ×ØÖÓ v Ò T
                                  ÔÓÖ ÙÒ Ö Ó ÒÓ¹ Ö ÓÖº
                                       Ò ÓØÖ × Ô Ð Ö ×¸ v × ÙÒ ÒÓ Ó ÓÖØ × ×Ø ÓÒØ Ò ÙÒ ×Ù ¹ Ö ÓÐ ÙÝÓ× Ö Ó× ÒÓ¹
                                     Ö ÓÖ × ÒÓ ÓÒ Ø Ò ÒÓ Ó× Ò ×ØÖÓ× vº ÓÑÓ ÑÔÐÓ׸ ÓÒ× Ö Ð × ¬ ÙÖ × º¾ ¹
                                    Ý º¾ ¹ º Ò Ð ¬ ÙÖ º¾ ¹ Ò Ò ÙÒÓ ÐÓ× Ö Ó× ÒÓ¹ Ö ÓÖ × Ð ×Ù ¹ Ö ÓÐ H ÓÒ
                                  Ö Þ I ÓÒ Ø ÙÒ Ò ×ØÖÓ Hº Ò Ð ¬ ÙÖ º¾ ¹ ¸ Ò Ò ÙÒÓ ÐÓ× ÒÓ Ó× Ð ×Ù ¹ Ö ÓÐ
                                   ÙÝ Ö Þ × F × ÓÒ Ø ÓÒ ÙÒ Ö Ó ÒÓ¹ Ö ÓÖ ÙÒ Ò ×ØÖÓ Hº
642                                                           Cap´
                                                                 ıtulo 7. Grafos



   ÈÓÖ Ð ÓÒØÖ Ö Ó¸ Ò Ð Ñ Ð   ¬ ÙÖ × º¾ Ú ÑÓ× ÕÙ ØÓ Ó ×Ù ¹ Ö ÓÐ ÓÒØ Ò ÙÒ
 Ö Ó ÒÓ¹ Ö ÓÖ ÕÙ ÓÒ Ø ÙÒ Ò ×ØÖÓ Ð Ö Þº
Demostraci´n Ë Ñ Ð Ö Ð Ð Ñ ÒØ Ö ÓÖ¸ Ô Ö ÔÖÓ Ö Ð Ò ×
          o                                              Ò ÑÓ× Ð Ð Ñ
 × Ö ×ÙÔÓÒ ÑÓ× ÕÙ Ü ×Ø ÙÒ ÒÓ Ó ÓÖØ v Ø Ð ÕÙ ÙÒ × Ò ÒØ w Ø Ò ÙÒ Ö Ó Ò
G ÕÙ ÓÒ Ø     ÙÒ Ò ×ØÖÓ u vº Ì Ð × ØÙ ÓÒ ÔÙ Ô ØÓÖ Þ Ö× Ð × Ù ÒØ ÑÓ Ó
                                       u       Ò ×ØÖÓ
                                                    ÖÓ Ò
                         ÆÓ Ó     v
                            ÓÖØ

                                           w       × Ò ÒØ

Ä Ô ØÓÖ Þ ÓÒ Ö Ú Ð Ð ÓÒØÖ           ÓÒº Ò ÔÖ Ñ Ö ÐÙ Ö Ü ×Ø ÙÒ Ñ ÒÓ × u
w Ô × Ò Ó ÔÓÖ v¸ ÔÙ × ×Ø ר        ¬Ò Ó ÔÓÖ Ð Ö ÓÐ Ö ÓÖº Ë Ò Ñ Ö Ó¸ Ø Ñ Ò
 Ü ×Ø Ö ÙÒ Ñ ÒÓ × u              w × Ò Ô × Ö ÔÓÖ vº Ä ÙÒ   ÓÖÑ Ò ÕÙ Ó ÙÖÖ ×ØÓ ×
ÕÙ u Ý v Ô ÖØ Ò Þ Ò Ð Ñ ×ÑÓ ÓÑÔÓÒ ÒØ Ò ÓÒ ÜÓ ÕÙ Ù× Ö Ð ×ÙÔÖ × ÓÒ vº È ÖÓ
 ×ØÓ × ÙÒ ÓÒØÖ        ÓÒ¸ ÔÙ × × Ô ÖØ Ò × Ò Ð Ñ ×ÑÓ ÓÑÔÓÒ ÒØ Ò ÓÒ ÜÓ¸ ÒØÓÒ ×
ÒÓ Ü ×Ø Ö ÙÒ Ñ ÒÓ ÒØÖ u Ý w Ô × Ò Ó ÔÓÖ v
    Ä ×Ù¬ Ò × Ñ × × ÑÔÐ º ËÙÔÓÒ ÑÓ× ÕÙ v Ø Ò ÙÒ Ó w Ø Ð ÕÙ Ò Ò ÙÒ
  × Ò ÒØ w ר ÓÒ Ø Ó ÙÒ Ò ×ØÖÓ v ÔÓÖ ÙÒ Ö Ó G ÕÙ ÒÓ Ô ÖØ Ò Þ
  T º ÒØÓÒ ×¸          Ñ ÒÓ Ò G × w ר Ð ÒÓ Ó Ö Þ T                Ô × Ö ÔÓÖ v¸ ÐÓ
ÕÙ Ò ¸ × ÙÒ Ð Ð Ñ º½¸ ÕÙ v × ÙÒ ÒÓ Ó ÓÖØ
         ר Ð Ñ ÔÓ Ö ÑÓ× × Ò Ö ÙÒ Ð ÓÖ ØÑÓ ÓÒ× ×Ø ÒØ Ò Ð ÙÐ Ö Ð Ö ÓÐ Ö ÓÖ
  × ÙÒ ÒÓ Ó Ù ÐÕÙ Ö º ÈÓÖ            ÒÓ Ó w ÒÓ Ö Þ Ò Ð Ö ÓÐ Ö ÓÖ × ×Ø Ð Ò
 Ó× ÓÒ ÙÒØÓ× A Ý D         Ò ×ØÖÓ× Ý × Ò ÒØ ׸ Ö ×Ô Ø Ú Ñ ÒØ º ÄÙ Ó × ÑÔÐ
 Ð ÓÒÓ Ñ ÒØÓ Ð Ð Ñ Ô Ö Ø ÖÑ Ò Ö × w × Ó ÒÓ               ÓÖØ º ÙÒÕÙ ×Ø Ð ÓÖ ØÑÓ
 × Ö Ð Þ Ð ¸ ר Ö ÕÙ Ö Ñ ÑÓÖ Ô Ö Ð Ö ÓÐ Ö ÓÖ Ý Ð Ø ÖÑ Ò ÓÒ ÐÓ×
 ÓÒ ÙÒØÓ× A Ý D¸ ÐÓ Ù Ð ÒÓ × × ÑÔÐ Ö Ð Þ Öº
       ÓÖØÙÒ Ñ ÒØ ¸ Ó ÙÒÓ ÒÓ Ó v Ý ÙÒÓ ×Ù× Ó× w¸ Ü ×Ø ÙÒ Ñ Ò Ö Ò Ö Ø
      Ø ÖÑ Ò Ö Ù Ð × ÒÓ Ó× Ô ÖØ Ò Ò Ð ÓÒ ÙÒØÓ A ÐÓ× Ò ×ØÖÓ× v Ý Ð ÓÒ ÙÒØÓ D
   ÐÓ× × Ò ÒØ × wº È Ö ÐÐÓ¸ Ö ÕÙ Ö ÑÓ× Ð × Ù ÒØ ¬Ò ÓÒ
Definici´n 7.1 (N´ mero
       o        u         )   Ë ÙÒ Ö Ó ÓÒ ÜÓ G =< V, E > ×Ó Ö Ð Ù Ð ×
Ö Ð Þ ÙÒ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ    º Ë v ∈ V ÙÒ ÒÓ Óº ÒØÓÒ ×¸ (v) × ¬Ò ÓÑÓ Ð
ÓÖ Ò Ð Ú × Ø     ÙÒ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ      Ò Ð Ù Ð (v) = 0º Ò ÓØÖ × Ô Ð Ö ×¸
  (v) ÒÓØ Ð ÓÖ Ò     Ú × Ø Ò ÙÒ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ    º

Corolario 7.1 Ë T ÙÒ Ö ÓÐ Ö ÓÖ ÔÖÓ ÙÒ              ÙÒ Ö Ó G ÙÝÓ× ÒÓ Ó× ×Ø Ò
Ø ÕÙ Ø Ó× × ÙÒ Ð ÓÖ Ò Ú × Ø º ÒØÓÒ ×
  ½º Ä Ö Þ T × ÙÒ ÒÓ Ó       ÓÖØ × Ý ×ÓÐÓ × ×Ø Ø Ò Ñ × ÙÒ Óº ר ×Ó
      ר ÐÙ×ØÖ Ó Ò Ð ¬ ÙÖ º¾ ¹ ÓÒ Ð ÒÓ Ó ÓÖØ Hº
  ¾º ÍÒ ÒÓ Ó v¸ ÒÓ Ö Þ T ¸ ×    ÓÖØ × Ý ×ÓÐÓ × v Ø Ò ÙÒ Ó w Ø Ð ÕÙ Ò Ò ÙÒ
       × Ò ÒØ w ר ÓÒ Ø Ó ÔÓÖ ÙÒ Ö Ó ÒÓ¹ Ö ÓÖ ÙÒ ÒÓ Ó ÙÝÓ ×
     Ñ ÒÓÖ ÕÙ (v)º
7.5. Recorridos sobre grafos                                                                                                                                                                                                                                                               643



                             ºººº
                             ºººº
                            ººº
                                  ºº
                                   º
                                   º   D   ºº
                                           ºº
                                            ºº
                           ºº
                            º
                            º                    ºº
                                                 ºº
                                                  ºº
                     ºººº
                      ºº º
                      ºº º
                 ºº ºº
                ºº ºº
                ºº ºº
                                                       ºº
                                                       ºº
                                                        ºº
            ºº º
            ºº ºº º
           ºº ºº                                             ºº
                                                             ººº
       ºº º
       ºº ºº
        º º                                                ºº
                                                            º
     º º
    º º
    º º                                B                     ºº                                                                                                                                                                                          H
  º ºº
  º ºº                          ººº
                                ººº
                               ººº         ºº
                                           ºº
                                            ºº
                                             º                 ºº
                                                                º
                                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                               º
 º ºº                  ººº
                       ººº
                        ºº                       ºº
                                                 ºº
                                                  ºº
                                                                 º
                                                                  º                                                                                                                                                                               ºº
                                                                                                                                                                                                                                                 ºº
                                                                                                                                                                                                                                                 ºº            ºº
ºº              ººº
                 ºº
                ºº                                 º               º                                                                                                                                                                                            º
º
º º ºº
ººº ºº                                                 ºº
                                                       ºº
                                                        ºº
                                                                   ºº                                                                                                                                                                       ºº
                                                                                                                                                                                                                                           ºº
                                                                                                                                                                                                                                           ºº                   º
                                                                                                                                                                                                                                                                º
ººº º ºº                                                             º
                                                                     ºº                                                                                                                                                                                          º
                                                                                                                                                                                                                                                                 º
                                                                                                                                                                                                                                                                 º
º º
 º
ºº
ºº
       º
       º                                                 ºº
                                                          ºº
                                                          ºº          º
                                                                       º                                                                                                                                                              ºº
                                                                                                                                                                                                                                      ºº
                                                                                                                                                                                                                                       º                         ºº
                                                                                                                                                                                                                                                                  º
ºº
ºº                                                            ºº
                                                              ºº
                                                               º
                                                                       ºº
                                                                        º                                                                                                                                                           ºº
                                                                                                                                                                                                                                     º                            º
                                                                                                                                                                                                                                                                  ºº
ºº
ºº                                                                                                                                                                                                                                 º                               º
                                                                                                                                                                                                                                                                   º
ºº
ºº
º º
º º
º ºº
ºº º
º
ºº º
                                       A                         º º
                                                                  º º
                                                                   º º
                                                                   º º
                                                                     º º
                                                                     º º
                                                                                                                     J   º
                                                                                                                         ºº
                                                                                                                         ºº
                                                                                                                          ºº                                                                                                 ºº
                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                 º                  º
                                                                                                                                                                                                                                                   ºº
                                                                                                                                                                                                                                                  ºº
                                                                                                                                                                                                                                                   ºº
                                                                                                                                                                                                                                                    º
                                                                                                                                                                                                                                                     º   F     º ºº
                                                                                                                                                                                                                                                               º º
                                                                                                                                                                                                                                                               º º
                                                                                                                                                                                                                                                                   º
                                                                                                                                                                                                                                                                   ºº
                                                                                                                                                                                                                                                                     º
ººº ºº                                                               º º                                                  ºº                                                                                                 º                ºº º
                                                                                                                                                                                                                                             ºº º
                                                                                                                                                                                                                                             ºº º
                                                                                                                                                                                                                                                                º ºº
                                                                                                                                                                                                                                                                º ºº º
 º ºº º
 º º ºº
     º                                                                 º º
                                                                        ºº                                                 ººº
                                                                                                                           ºº                                                                                              º
                                                                                                                                                                                                                           º             ºº                      º º
  º ºº ºº
  º ºº ºº º
                                                                        º                                                  º º                                                                                            º             ºº
                                                                                                                                                                                                                                        ºº        º              º
                                                                                                                                                                                                                                                                 º º
  º º ºº º                                                               ºº
                                                                         ºº
                                                                          º
                                                                           º                                                ºº
                                                                                                                            º º                                                                                          º          ºº
                                                                                                                                                                                                                                                  º
                                                                                                                                                                                                                                                  º
                                                                                                                                                                                                                                                  º                    º
    º
    ºº
             ºº ºº
              ºº º
               º º
                   ººº ºº                                                  º
                                                                           º                                                º º                                                                                         º
                                                                                                                                                                                                                        º
                                                                                                                                                                                                                        º           ºº
                                                                                                                                                                                                                                   ºº                             º ºº
                                                                                                                                                                                                                                                                  º ºº
                                                                                                                                                                                                                                                                  º ºº
                   ººº ºº
                    ºº ºº                                                  º                                                      º                                                                                    º                        º                      º
      ºº                    ºº
                          ºººº                                             º                                                 º º
                                                                                                                             º º                                                                                      ºº       ºº
                                                                                                                                                                                                                               ºº
                                                                                                                                                                                                                                º               º
                                                                                                                                                                                                                                                º                  º ºº
       º
       º
          ºº
          ºº
                           ºººº
                            º ºº  ºº
                                  ºº
                                   º   C                                  ºº
                                                                          ºº
                                                                         ºº
                                                                         º
                                                                         ºº
                                                                           º                                         I       º º
                                                                                                                              º º
                                                                                                                          ºº º º
                                                                                                                          ºº º ºº
                                                                                                                                    º
                                                                                                                                                                                                                      º
                                                                                                                                                                                                                     º º
                                                                                                                                                                                                                     º º
                                                                                                                                                                                                                     º º
                                                                                                                                                                                                                          º
                                                                                                                                                                                                                             º
                                                                                                                                                                                                                                          ºººº º
                                                                                                                                                                                                                                           ººº º
                                                                                                                                                                                                                                          ºººº º
                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                  ººº
                                                                                                                                                                                                                                                 ººº
                                                                                                                                                                                                                                                 ºººº    B          º ºº
                                                                                                                                                                                                                                                                    º ºº
                                                                                                                                                                                                                                                                    º ºººº
              ºº
              ºº
               º                                                        ºº
                                                                        ºº                                                ºº º
                                                                                                                           º º
                                                                                                                                                                                                                    º º
                                                                                                                                                                                                                    º º
                                                                                                                                                                                                                    ºº               ºº º º
                                                                                                                                                                                                                                    ºº
                                                                                                                                                                                                                                     º                               º ºº
                                                                                                                                                                                                                                                                      º ºº
                                                                       ºº
                                                                       ºº                                                       º º
                                                                                                                                º      º                                                                               º ºº º
                                                                                                                                                                                                                    º º ºº º                 º º                      º ºº
                                                                                                                                                                                                                                                                      º ºº
                  ºº
                  ºº
                   ºº                                                 ºº                                                    º º º
                                                                                                                            º º ºº                                                                                  ºº ºº º
                                                                                                                                                                                                                    º           º
                                                                                                                                                                                                                                            º º
                                                                                                                                                                                                                                                                      º ºº
                                                                     º º
                                                                    º ºº                                                    º ºº º                                                                                        ºº                º                          º ºº
                       ºº
                        ºº
                        ºº                                          ºº º                                                         º
                                                                                                                                 º º º
                                                                                                                             º º º º                                                                                ºº º
                                                                                                                                                                                                                    º º
                                                                                                                                                                                                                     º
                                                                                                                                                                                                                    ºº                     º º  º                      º ºº
                                                                                                                                                                                                                                                                        º ºº
                                                                 º º
                                                                  º                                                          º º º º                                                                                ºº                     º º                          º ºº
                             ºº
                              ºº
                              ºº                                  º
                                                                 º º                                                         º º
                                                                                                                                  º º º
                                                                                                                                                                                                                    º
                                                                                                                                                                                                                    ºº
                                                                                                                                                                                                                     º                    º º
                                                                                                                                                                                                                                          º                              º ºº
                                º
                                  ºº
                                 ººº
                                 ºº
                                       G   ººº
                                           ººº
                                            ººº
                                                  ººº º ººº
                                                  ººº º º
                                                   ºº
                                                               º º
                                                               º º
                                                              ºº º
                                                                                                           º º
                                                                                                               ºº
                                                                                                               ºº
                                                                                                                 º
                                                                                                                 º
                                                                                                                ºº   F   ºº º º º ºº
                                                                                                                         º º º º
                                                                                                                          º º º
                                                                                                                             ººº º
                                                                                                                                            º
                                                                                                                                          º º
                                                                                                                                           º º
                                                                                                                                                                                                                    º
                                                                                                                                                                                                                    ºº
                                                                                                                                                                                                                    ºº
                                                                                                                                                                                                                    ºº
                                                                                                                                                                                                                    ºº
                                                                                                                                                                                                                    ºº
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                         º º
                                                                                                                                                                                                                                         º º             A               º ºº
                                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                          º ºº
                                                                                                                                                                                                                                                                          º ºº
                                                                                                                                                                                                                                                                             º
                           ºº
                          ºº
                          ºº
                             º                           º ººº
                                                        ºººº
                                                         º º
                                                          º                                              ºº º
                                                                                                         ºº º
                                                                                                        ºº º                  ºº º
                                                                                                                              º º          º º                                                                      ºº
                                                                                                                                                                                                                     ºº
                                                                                                                                                                                                                     º ºº               º ºº
                                                                                                                                                                                                                                        º º º                              º ºº
                                                                                                                                                                                                                                                                           º ºº
                                                                                                                                                                                                                                                                           º ºº
                     ººº                               ºººº ºº                                     ºº
                                                                                                  ºº
                                                                                                                                ºº º
                                                                                                                                 ºº º
                                                                                                                                 ºº          º º
                                                                                                                                             º º
                                                                                                                                              º º                                                                    º ºº
                                                                                                                                                                                                                     º ºº              º º º                                ººº
                    ºº
                     º                               ºººº ºº º
                                                      º º ºº
                                                      ºº                                          ºº          ºº                 ºº
                                                                                                                                  º ºº         º ºº                                                                   º ºººº
                                                                                                                                                                                                                      º º ºº
                                                                                                                                                                                                                       º º º ºº º º
                                                                                                                                                                                                                                       º º                                  º ºº
                 ºº
                ºº                                ºº
                                                       º            ºº
                                                                    ººº                         ºº
                                                                                               ºº
                                                                                                              º
                                                                                                              º                   ºº            º º
                                                                                                                                                º º                                                                                   º º                                   ººº
                                                                                                                                                                                                                                                                             ººº
                ºº                                ººº
                                                 ººº
                                                  ºº
                                                   º                                           ºº                                    º
                                                                                                                                     º
                                                                                                                                     º                                                                                  º º ºº ººº
                                                                                                                                                                                                                        º º ººº ºº      º                                         º
            ºº
                                                   º                    º
                                                                        ºº
                                                                                           ºº                º                     º ºº           º º
                                                                                                                                                  º                                                                      º º
                                                                                                                                                                                                                         º º º ºº       º                                    ºº º
                                                                                                                                                                                                                                                                              ºº º
            ºº
             º                                ºº
                                             ºº
                                             ººº
                                              ºº
                                               º                          ºº              ºº
                                                                                           º                º
                                                                                                            º
                                                                                                            º                      º ºº
                                                                                                                                   º ºº           º º                                                                     º º º º º ººº ºº º                                  ºº º
                                                                                                                                                                                                                                                                                ºº
        ºº
         ºº                            F   ººº
                                           ººº
                                            ººº
                                                  ººº
                                                                           º
                                                                           º
                                                                           º
                                                                           º           ºº
                                                                                        ºº
                                                                                                     ººº º
                                                                                                          º ººº
                                                                                                          ºº
                                                                                                               ºº
                                                                                                               ººº   B              ºº º
                                                                                                                                    ºº º
                                                                                                                                    ºº º   º
                                                                                                                                              º º º
                                                                                                                                                    º º
                                                                                                                                                    º º
                                                                                                                                                    º º
                                                                                                                                                      º º
                                                                                                                                                                                                                           º º
                                                                                                                                                                                                                           º º º
                                                                                                                                                                                                                            º ººº
                                                                                                                                                                                                                             ºº º º
                                                                                                                                                                                                                              º ºº
                                                                                                                                                                                                                              º ºº º
                                                                                                                                                                                                                                              ººº
                                                                                                                                                                                                                                               ºº
                                                                                                                                                                                                                                                    º
                                                                                                                                                                                                                                                    º    C                    ººº
                                                                                                                                                                                                                                                                              ºº º
                                                                                                                                                                                                                                                                               ºº º
     ºº
      º                                           ººº
                                                   ºº
                                                        ººº
                                                         ºº             ºº          ºº
                                                                                     º                 ººº
                                                                                                      ººº º
                                                                                                  º º º º º                          ºº º
                                                                                                                                     ºº               º º  º                                                                     ººº
                                                                                                                                                                                                                                 ºº ººº
                                                                                                                                                                                                                                  ºº º
                                                                                                                                                                                                                                 ºº º            ºº
                                                                                                                                                                                                                                                  º                            ºº º
                                                                                                                                                                                                                                                                               ºº º
                                                                                                                                                                                                                                                                                ºº º
   ºº                                                    ºº
                                                                      ºº
                                                                      ºº          º ºº ºº
                                                                                  º             ºº º º
                                                                                               ºº                                    ººº        º º º
                                                                                                                                                º º º
                                                                                                                                                 º º º                                                                             º ºº
                                                                                                                                                                                                                                                 º
                                                                                                                                                                                                                                                                                ºº º
   º                                                           ºº º º
                                                               ºº º
                                                                ºº                º       ºº
                                                                                           º                  º                                              º                                                                  ºº º º º                                         ºº º
  º                                                               ºº
                                                                  º ºº
                                                                 º ºº           º ºº º
                                                                                º º    º                º º
                                                                                                       º º
                                                                                                                                      ºº
                                                                                                                                      ºº
                                                                                                                                      ºº          º º º
                                                                                                                                                   º º º                                                                       º º ºº ºº º
                                                                                                                                                                                                                               ºº ºººº º                                         ºº º
 º
 º                                                           ºº
                                                            ºº
                                                           ºº                   ººº                                                                º º º                                                                                  ºº º
                                                                                                                                                                                                                                           ºº
                                                                                                                                                                                                                                            º                                    ºº º
                                                                                                                                                                                                                                                                                  ºº
º                                                                      ºº      ºº
                                                                               ºº
                                                                                                      º º
                                                                                                      º º                              ºº
                                                                                                                                       ºº           º º ºº                                                                    ºº
                                                                                                                                                                                                                              ºº
                                                                                                                                                                                                                                           º
                                                                                                                                                                                                                                          ºº ºº
                                                                                                                                                                                                                                           ºº º                                   ºº
º
º                                                     ººº
                                                     ººº
                                                     ººº                ºº
                                                                          º    ºº
                                                                                º                    º º
                                                                                                                                       ºº           º º
                                                                                                                                                     º º       º
                                                                                                                                                               º                                                              ºº        º
                                                                                                                                                                                                                                               ºº
                                                                                                                                                                                                                                               ºº
                                                                                                                                                                                                                                               ººº
                                                                                                                                                                                                                                                ººº                                ºº º
                                                                                                                                                                                                                                                                                   ºº º
                                               ººº                         º   º                                                       ºº                      º
º
º
º
º
º
º                      ººº
                       ººº
                        ºº
                                ººº
                                ººº
                               ººº     H       ººº
                                              ººº
                                                                         º
                                                                           º
                                                                           º
                                                                           º
                                                                           º
                                                                               º
                                                                               º
                                                                               º
                                                                               º
                                                                               º
                                                                               ºº
                                                                                º
                                                                                                     º
                                                                                                    º º
                                                                                                    º º
                                                                                                   º º
                                                                                                   º º  º
                                                                                                                     A                  ºº
                                                                                                                                        º
                                                                                                                                         º
                                                                                                                                          º
                                                                                                                                         ºº
                                                                                                                                         ºº
                                                                                                                                                      º º
                                                                                                                                                      º º
                                                                                                                                                       º
                                                                                                                                                       ºº
                                                                                                                                                        ºº
                                                                                                                                                        ºº
                                                                                                                                                                 º
                                                                                                                                                                 º
                                                                                                                                                                 ºº
                                                                                                                                                                   º
                                                                                                                                                                                                                             º º ºº
                                                                                                                                                                                                                            ºº º
                                                                                                                                                                                                                            ºº º
                                                                                                                                                                                                                             º º
                                                                                                                                                                                                                            º º
                                                                                                                                                                                                                           ºº º
                                                                                                                                                                                                                                                  ººº
                                                                                                                                                                                                                                                    ºº   G                         ºº º
                                                                                                                                                                                                                                                                                    ºº
                                                                                                                                                                                                                                                                                    ºº º
                                                                                                                                                                                                                                                                                    ºº º
                                                                                                                                                                                                                                                                                      º º
                                                                                                                                                                                                                                                                                         º
                                                                         º     ººº                 º º                                                   ºº        º                                                       º
                                                                                                                                                                                                                          ºº º
 º
 º
 º           ºº
                 ºº
                 ºº
                ºº                                                     ºº
                                                                      ºº
                                                                      º         º ºº
                                                                                º º º             º º
                                                                                                  º º
                                                                                                                                         ºº
                                                                                                                                          ºº
                                                                                                                                          ºº             ºº
                                                                                                                                                         ºº         º
                                                                                                                                                                     º                                                          º                                                    ºº º
                                                                                                                                                                                                                                                                                     ºº º
                                                                                                                                                                                                                                                                                     ºº º
  º º ºº
  º ºº º   ºº                                                     ºº
                                                                     º           º ºº             º º                                      ºº             ºº         ºº                                                  ºº º
                                                                                                                                                                                                                         ºº º
   ºº º                                                          ºº
                                                                  º              º ºº
                                                                                 º º º º º  ºº º º
                                                                                             ºº º º
                                                                                                                                           ºº
                                                                                                                                           ºº             º
                                                                                                                                                          ºº          º
                                                                                                                                                                       º                                                 ºº ºº
                                                                                                                                                                                                                         ºº                                                            º
                                                                                                                                                                                                                                                                                      º º
                                                                                                                                                                                                                                                                                      ºº º
   ºº
   ºº                                                        ºº
                                                            ºº
                                                            ºº                     º
                                                                                   º          º                                             ºº
                                                                                                                                            ºº
                                                                                                                                            º
                                                                                                                                                           º
                                                                                                                                                           º
                                                                                                                                                           º           ºº                                               º                                                              ºº º
                                                                                                                                                                                                                                                                                        º
 º º
º ºº                                                 ººº
                                                     ººº
                                                      ºº                           ºº
                                                                                     º          º ººº º
                                                                                                º ºº
                                                                                                   ºº
                                                                                                º ººº ººº                                    ºº
                                                                                                                                             ºº
                                                                                                                                                           º
                                                                                                                                                           º
                                                                                                                                                           º
                                                                                                                                                           º             º
                                                                                                                                                                         ºº                                             ºº
                                                                                                                                                                                                                        º
                                                                                                                                                                                                                       ºº
                                                                                                                                                                                                                       ºº
                                                                                                                                                                                                                       ºº                                                               º º
                                                                                                                                                                                                                                                                                         º
                                                                                                                                                                                                                                                                                        ºº º
                                                                                                                                                                                                                                                                                        ºº º
º º
º
º
º
ºº
       º
          ºº
          ºº
                                       I   ºººº
                                            ººº
                                           ººº
                                               ººº
                                                ºº
                                                º
                                              º º ººº
                                                   ºº
                                                   ºº
                                                                                      ºº
                                                                                       º ºº
                                                                                         ºº º º
                                                                                         ºº º º
                                                                                          º º
                                                                                                  º       ººº
                                                                                                           ºº
                                                                                                                 º
                                                                                                                 º   C                         º
                                                                                                                                              ºº
                                                                                                                                              ºº
                                                                                                                                              ºº
                                                                                                                                               ºº
                                                                                                                                                          º
                                                                                                                                                          º
                                                                                                                                                          º
                                                                                                                                                           º
                                                                                                                                                           º
                                                                                                                                                           º
                                                                                                                                                           º
                                                                                                                                                           º
                                                                                                                                                           º
                                                                                                                                                           º
                                                                                                                                                                           º
                                                                                                                                                                           ºº
                                                                                                                                                                             º
                                                                                                                                                                             º
                                                                                                                                                                                                                D     ºº
                                                                                                                                                                                                                                                                                         ºººº
                                                                                                                                                                                                                                                                                          ººº
                                                                                                                                                                                                                                                                                         ººº
                                                                                                                                                                                                                                                                                     ºº ºº
                                                                                                                                                                                                                                                                                      º
                                                                                                                                                                                                                                                                                      º º
                                                                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                                                                              º   L      ººº
                                                                                                                                                                                                                                                                                                         ººº
                                                                                                                                                                                                                                                                                                          ººº
                                                                                                                                                                                                                                                                                                               ººº
  º
  ºº         ºº
              ºº
               º                                        ººº
                                                         ºº
                                                         ºº                                 ºº º
                                                                                             º
                                                                                             ºº
                                                                                             ºº              ºº
                                                                                                             º                                  ºº ºº    ººº                  º
                                                                                                                                                                               º                                                                                                    ºº
                                                                                                                                                                                                                                                                                    º º                        ººº
                                                                                                                                                                                                                                                                                                                ºº
    ºº
     º
     º            ºº
                  ºº                                           ºº
                                                               ºº
                                                                ºº                         ºº º
                                                                                               ºº
                                                                                               º          º                                     ºº ºº
                                                                                                                                                 º º                           ºº                                                                                             ººº
                                                                                                                                                                                                                                                                               ºº
                                                                                                                                                                                                                                                                                º          º
                                                                                                                                                                                                                                                                                           º
                                                                                                                                                                                                                                                                                           º
                                                                                                                                                                                                                                                                                           º                        ºº
                                                                                                                                                                                                                                                                                                                    ºº
                                                                                                                                                                                                                                                                                                                     ºº
        ºº
        ºº
         º         º                                                                       º º ºº º
                                                                                           ºº ºº º º                                             º ºº
                                                                                                                                                  º                              º                                                                                          º                                           ºº
                                                                                                                                                                                                                                                                                                                         ºº
                                                                                                                                                                                                                                                                                                                         º
             ºº º ºº
             ºº
              ºº        º
                                                                   ºº
                                                                    ºº
                                                                    º                                 ºº
                                                                                                                                                 º ºº
                                                                                                                                                 ºº º                            ºº                                                                                       º
                                                                                                                                                                                                                                                                          ºº
                                                                                                                                                                                                                                                                           º                º
                                                                                                                                                                                                                                                                                            º                               ºº
                                                                                                                                                                                                                                                                                                                            ºº
                                                                                                                                                                                                                                                                                                                             º
                   ººº ºº º
                   ººº º º
                    ºº                                                 ºº
                                                                        ºº                ºº
                                                                                          ºº
                                                                                         ºº
                                                                                                       º
                                                                                                      ºº
                                                                                                      ºº                                           º ºº
                                                                                                                                                   º   º                          ºº
                                                                                                                                                                                   º                                                                                  ºº
                                                                                                                                                                                                                                                                     ºº
                                                                                                                                                                                                                                                                      º                     º
                                                                                                                                                                                                                                                                                            ºº                                 º
                                                                                                                                                                                                                                                                                                                               º
                           ºººº
                          ºººº º
                               º                                          º                         º ººº   ºº
                                                                                                            ºº                                    º ºº
                                                                                                                                                   º
                                                                                                                                                  ººº                               º
                                                                                                                                                                                    º                                                                              º                                                           ºº
                       ººº
                       ººº
                        ºº
                            ºººº º
                                ºº º
                               ºººº    L                                 º
                                                                           º
                                                                           º
                                                                           º
                                                                           º
                                                                           º
                                                                                        ºº
                                                                                        ºº
                                                                                        ºº º
                                                                                       ºº º
                                                                                        º
                                                                                      ºº º º ººº
                                                                                        º º
                                                                                                   º
                                                                                                   º
                                                                                                     ººº
                                                                                                      ºº
                                                                                                              ººº
                                                                                                              ººº
                                                                                                             ººº     G                             ºº º
                                                                                                                                                   ºº º
                                                                                                                                                    º
                                                                                                                                                    º
                                                                                                                                                     º
                                                                                                                                                    ºº
                                                                                                                                                     º
                                                                                                                                                   ººº
                                                                                                                                                   ººº
                                                                                                                                                     º
                                                                                                                                                                                     º
                                                                                                                                                                                     ºº
                                                                                                                                                                                      º
                                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                                               ººº
                                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                                   º                         ºº
                                                                                                                                                                                                                                                                                              º   I                             º
                                                                                                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                                                                                                 º
                                                                                                                                                                                                                                                                                                                                 º
                                                                                                                                                                                                                                                                                                                                 º
                ººº
                 ºº
                ºº                                                     ºº
                                                                         º            ºº ºº
                                                                                      ºº º ººº                                                    ºº
                                                                                                                                                 º ººº                                                                                                        º
                                                                                                                                                                                                                                                                                                                             ºº
                                                                                                                                                                                                                                                                                                                              º
           ºº
           ºº                                                        ººº                    º º                                                  º ºº º
                                                                                                                                                      º
                                                                                                                                                                                        º
                                                                                                                                                                                        º
                                                                                                                                                                                        º                                                                    º
                                                                                                                                                                                                                                                             º                                                            ºº
                                                                                                                                                                                                                                                                                                                              º
       ºº
            º
                                                                  ºº
                                                                 ºº
                                                                  º                 ºº ºº
                                                                                     º ºº
                                                                                    ºº ºº
                                                                                     ºº º
                                                                                    ºº º                                                       ºº º
                                                                                                                                               ºº º
                                                                                                                                                  º º
                                                                                                                                                                                         º
                                                                                                                                                                                         º                                                                   º
                                                                                                                                                                                                                                                             º
                                                                                                                                                                                                                                                             º                                                          ºº
                                                                                                                                                                                                                                                                                                                           º
                                                                                                                                                                                                                                                                                                                           º
     ºº
      º                                                                              º                                                        º        º                                                                                                     º                                                        ºº
                                                                                                                                                                                                                                                                                                                      ºº
  ºº
   º                                                         ºº
                                                            ºº
                                                            ºº                    ºº
                                                                                  ºº                                                         ººº º
                                                                                                                                                       º
                                                                                                                                                       º                                   º
                                                                                                                                                                                           º                                                                 º
                                                                                                                                                                                                                                                             º                                                    ººº
                                                                                                                                                                                                                                                                                                                 ººº
                                                                                                                                                                                                                                                                                                                   º
ºº
 º                                                    ººº
                                                     ººº
                                                     ººº                         ºº º
                                                                                º ºº
                                                                                   º
                                                                                º ºº
                                                                               º ºº
                                                                                                                                            º          º
                                                                                                                                                        º
                                                                                                                                                        º
                                                                                                                                                                                           ºº                                                                 º
                                                                                                                                                                                                                                                              º                                             ººº
                                                                                                                                                                                                                                                                                                            ººº
                                                                                                                                                                                                                                                                                                             ºº
º
º
º
º
 º
                                       J       ººº
                                              ººº
                                               ºº                    D         º
                                                                               ºº
                                                                               ºº
                                                                               º
                                                                               º
                                                                                º
                                                                                                                                       ºº
                                                                                                                                       ºº
                                                                                                                                       ºº
                                                                                                                                          º
                                                                                                                                         ºº
                                                                                                                                         ºº
                                                                                                                                             º           º
                                                                                                                                                         º
                                                                                                                                                         º    L                               º
                                                                                                                                                                                              º
                                                                                                                                                                                              ºº
                                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                                ºº
                                                                                                                                                                                                                                                                 º
                                                                                                                                                                                                                                                                 º
                                                                                                                                                                                                                                                                   ºº
                                                                                                                                                                                                                                                                    ºº
                                                                                                                                                                                                                                                                    º
                                                                                                                                                                                                                                                                                                  J    ººº
                                                                                                                                                                                                                                                                                                      ººº
                                                                                                                                                                                                                                                                                                      ººº
  º
  ºº                                                                             º
                                                                                 ºº                                                  ººº                                                        ºº
    ºº
     º
     º                                                                             ºº
                                                                                   ºº                                               ºº
                                                                                                                                    ºº                                                           º                                                                     ºº
                                                                                                                                                                                                                                                                        ºº
                                                                                                                                                                                                                                                                        ºº
        ºº
        ºº
         º                                                                             ºº
                                                                                       ºº
                                                                                        º                                         ººº
                                                                                                                                    º                                                              º
                                                                                                                                                                                                   º                                                                        ºº
             ºº
             ºº                                                                             ºº
                                                                                            ºº                                   ººº                                                               º                                                                        ºº
                                                                                                                                                                                                                                                                             ºº
              ºº                                                                             ºº                                 ºº
                                                                                                                               ºº
                                                                                                                               ºº                                                                    º
                                                                                                                                                                                                     º                                                                           ººº
                                                                                                                                                                                                                                                                                 ºº
                                                                                                                                                                                                                                                                                  ºº
                   ººº
                   ººº
                    ºº                                                                            ººº
                                                                                                  ººº
                                                                                                   ºº                         º
                                                                                                                              º                                                                       º
                          ººº                                                                            ººº                ºº
                                                                                                                             º                                                                         º                                                                               ººº
                                                                                                                                                                                                                                                                                        ººº
                                                                                                                                                                                                                                                                                        ºº
                           ººº
                            ººº
                                       K                                                                 ººº
                                                                                                          ººº
                                                                                                                     H    ºº
                                                                                                                          ºº                                                                           ºº
                                                                                                                                                                                                        º   K                                                                                     K

                                       ´µ                                                                            ´ µ ÓÑ ÒÞÓ Ò Â                                                                                             ´ µ ÓÑ ÒÞÓ Ò À
                                        ÓÑ ÒÞÓ
                                        Ò

                    ÙÖ º¾      Ö ÓÐ × Ö ÓÖ × Ð Ö Ó Ð ¬ ÙÖ º¾ ÙÒØÓ ÓÒ ÐÓ× Ö Ó× ÒÓ¹
                    Ö ÓÖ ×º ÕÙ ÓÒ¬ÖÑ ÑÓ× ÕÙ ÒÓ Ü ×Ø Ò ÔÙÒØÓ× ÓÖØ ¸ Ô٠׸ Ò ØÓ × Ð × ¬ ÙÖ ×¸
                 Ô Ö ØÓ Ó ÒÓ Ó ÒÓ Ö Þ v¸ × ÑÔÖ Ý ÙÒ Ö Ó ÒÓ¹ Ö ÓÖ ÔÓÖ     Ó ÕÙ ÓÒ Ø ÙÒ
                 ÒÓ Ó Ò ×ØÖÓ vº

                                        ר Ô ÖØ Ð ÓÖÓÐ Ö Ó × ÐÓ Ñ ÒØ ÓÑÔÐ         º Ò × ÒØ × ×¸ Ð ÓÖ ØÑ Ñ ÒØ ¸
                                       Ð ÔÖÙ Ô Ö ÙÒ ÒÓ Ó v ÓÒ× ×Ø Ò ÓÒ× Ö Ö           Ó w v Ý Ñ Ö Ö ØÓ Ó× ×Ù×
                                         × Ò ÒØ ׺ Ë ØÓ Ó× ÐÓ× Ö Ó× ÒÓ Ö ÓÖ × ØÓ Ó× ÐÓ× × Ò ÒØ × w
                                        ÓÒ Ø Ò ÒÓ Ó× ÓÒ Ñ ÒÓÖ ÕÙ (v) ÒØÓÒ × v × ÙÒ ÒÓ Ó ÓÖØ º
                                       È ØÓÖ Ñ ÒØ ¸ Ð ×ÙÒØÓ × ÓÖÖÓ ÓÖ Ò Ð × ¬ ÙÖ × º¾ ¹ Ý º¾ ¹ º Ò º¾ ¹ ¸ Ð
                                       ÒÓ Ó H¸ ÕÙ × ÓÖØ ¸ Ø Ò ÙÒ ×ÓÐ Ö Ñ ÓÒ Ö Þ I Ý × ÓÒר Ø ÕÙ Ò Ò ÙÒÓ
                                          ÐÓ× × Ò ÒØ × u ∈ {L, J, K} I × ÓÒ Ø ÔÓÖ ÙÒ Ö Ó ÒÓ¹ Ö ÓÖ ÓØÖÓ
                                       ÒÓ Ó u ÙÝÓ df(u) > (H) = 6º Ð Ñ ×ÑÓ ÑÓ Ó¸ Ô Ö Ð ¬ ÙÖ º¾ ¹ ¸ ÔÓ ÑÓ×
                                       Ú Ö ÕÙ ¸ Ô Ö Ð Ö Ñ ÙÝ Ö Þ × F¸ ×ÓÐÙØ Ñ ÒØ Ò Ò ÙÒÓ ×Ù× × Ò ÒØ ×
                                       u ∈ {B, A, C, G, D} Ø Ò Ò df(v) > (H) = 2º
                 Demostraci´n
                           o

                             ½º Ò ×Ø ×Ó Ð ÔÖÙ × ×ÔÖ Ò          Ð Ð Ñ º¾
                             ¾º Ë ÙÒ Ð Ð Ñ º¿¸ × v × ÙÒ ÒÓ Ó ÓÖØ ¸ ÒØÓÒ × Ø Ò ÕÙ Ü ×Ø Ö ÙÒ Ó w ÙÝÓ×
                                  × Ò ÒØ × ÒÓ ÓÒ Ø Ò ÙÒ Ò ×ØÖÓ v ØÖ Ú × ÙÒ Ö Ó ÒÓ¹ Ö ÓÖº
                                Ð ¬Ò ÓÒ Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ         ¸ × ×ÔÖ Ò ÕÙ Ô Ö Ù ÐÕÙ Ö Ò ×¹
                                ØÖÓ u v =⇒ (u) < df(v)º ÈÓÖ Ø ÒØÓ¸ ØÓ Ó× ÐÓ× Ö Ó× ÒÓ¹ Ö ÓÖ ×   Ð ÙÒ
644                                                                                                                                                                                              Cap´
                                                                                                                                                                                                                                        ıtulo 7. Grafos



                         ººº
                          ººº
                         ººº
                               D,0,-
                               ºº
                              ºº
                              ºº       ºº
                                       ºº
                                        ºº
                        ºº
                         º
                         º                   ºº
                                             ºº
                                              ºº
                    ºº º
                   ºººº
                   ºº º
               ºº ºº
              ºº ºº
              ºº ºº
                                                   ºº
                                                   ºº
                                                    ºº
          ºº º
          ºº ºº º
         ºº ºº                                           º
                                                         ºº
                                                          º
      ºº ºº
      ºº ºº
       º º                                             º
                                                       º
   ºº º
    º º
   º º
  º ºº
  ºº
 º ºº                ººº
                    ººº
                     ºº
                               B,1,0
                             ººº
                            ººº
                            ººº        ºº
                                       ºº
                                        ºº
                                         º
                                             ºº
                                             ºº
                                                        º
                                                        º
                                                          ºº
                                                           ºº
 º                                            ºº              º
º
º             ººº
               ºº
              ºº                               º              º
                                                              º
º º ºº
ººº º ºº
ººº ºº ºº
                                                   ºº
                                                   ºº
                                                    ºº          º
                                                                º
º ºº  º                                              ºº
                                                     ºº          º
                                                                 º
 º
ºº                                                    ºº          º
º
ºº
 º
 º                                                       ºº       ºº
                                                                   º
ºº
ºº                                                       ºº
                                                          º
ºº
º º
ºº
º º
º º
ºº º º
ºº
                               A,2,0                        ºº º
                                                             º º
                                                             º º
                                                                º º
                                                                º º
                                                                 º º
                                                                                                                                           J,0,-  º
                                                                                                                                                  º
                                                                                                                                                   ºº
                                                                                                                                                   º
                                                                                                                                                   ºº
ººº ºº
 º ºº º                                                          º º                                                                                º
                                                                                                                                                    º
 º º ºº
    º                                                             º º
                                                                  ºº
                                                                   º                                                                                  º
  º ºº ºº
  º ºº ºº º
  º º ºº º                                                          ºº                                                                               ººº
                                                                                                                                                      ºº
   º       ºº ºº
            ºº º
            º º                                                     ºº
                                                                    ºº                                                                                º
                                                                                                                                                      ºº
   ºº
    º            ººº ºº
                 ººº ºº
                  ºº ºº                                              ºº
                                                                      º                                                                                 ºº
                                                                                                                                                        ºº
     º                  ºº
                       ºººº                                           º                                                                                 ºº
                                                                                                                                                         ºº
      º
      ºº
        ºº
         ºº
         º
                        ºººº
                        º ºº
                               C,3,0
                              ºº
                               ºº
                               º
                                                                   ºº
                                                                     ºº
                                                                     º
                                                                    ºº
                                                                    ºº
                                                                   ºº
                                                                      º                                                                    I,1,0    º ºº
                                                                                                                                                    º ºº
                                                                                                                                                         ºº
                                                                                                                                                          ºº
                                                                                                                                                          º
                                                                                                                                                     º º ºº
            ºº
            ºº
             º                                                     ºº                                                                                 º º º
                ºº                                                ºº
                                                                  ºº                                                                                    º º º
                                                                                                                                                         º º º
                ºº
                 ºº                                              ºº º                                                                                    º
                     ºº
                     ºº
                      ºº                                       º
                                                               º
                                                                ºº                                                                                         ºº º
                                                                                                                                                           º º ºº
                                                                                                                                                            º º ºº
                                                                                                                                                              º
                          ºº
                          ºº
                           ºº                                º º
                                                             º º
                                                            º º                                                                                               ºº º
                                                                                                                                                              ºº º
                                                                                                                                                                º
                                                            º                                                                                                  ºº º
                             º
                               G,4,0   ººº
                                       ººº
                                        ººº
                                             ººº º ººº
                                              ººº º º
                                              ºº
                                                          º º
                                                          º º
                                                         º º
                                                       ºº º                                                                               º
                                                                                                                                          º
                                                                                                                                           H,2,0
                                                                                                                                           º                     º º
                                                                                                                                                                 º º
                                                                                                                                                                  º º
                                                                                                                                                                  ºº º
                                                                                                                                                                   ºº º
                                                                                                                                                                                                                                                   º
                                                                                                                                                                                                                                                   º
                                                                                                                                                                                                                                                    H,0,-
                                                                                                                                                                                                                                                    º
                                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                                              ºº
                                                    ºººº
                                                    ºººº
                                                     ººº
                                                     º                                                                                   º
                                                                                                                                         ºº                        ººº º
                                                                                                                                                                   º ºº
                                                                                                                                                                    º                                                                             º
                                                                                                                                                                                                                                                  ºº           º
                                                  ººº ºº                                                                                                                                                                                                           º
                                                 ºººº ºº º
                                                  ººº ºº
                                                   º                                                                                    º
                                                                                                                                        º
                                                                                                                                        º
                                                                                                                                                                    º ºº
                                                                                                                                                                     º ºº
                                                                                                                                                                     º º                                                                         º
                                                                                                                                                                                                                                                 º
                                                                                                                                                                                                                                                 º
                                                                                                                                                                                                                                                                   ºº
                                              ºº
                                             ººº
                                              º                ºº
                                                                º
                                                                ºº                                                                                                    º º                                                                                               º
                                                                                                                                                                                                                                                                        º
                                             ººº
                                              ºº
                                               º                   º
                                                                   ºº                                                                 º
                                                                                                                                                                      º ºº
                                                                                                                                                                      º ºº                                                                                               º
                                          ºº                                                                                          º                                º ºº
                                                                                                                                                                       º ºº                                                                    º
                                                                                                                                                                                                                                               º                           º
                                         ºº
                                         ººº
                                          ºº
                                           º                         ºº                                                               º
                                                                                                                                      º                                º
                                                                                                                                                                        º ºº
                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                               º                           ºº
                               F,5,0                                  º
                                                                      º
                                                                      º
                                                                      º                            º
                                                                                                        F,3,2
                                                                                                         º
                                                                                                        ºº
                                                                                                       ºº
                                                                                                       ºº      ºº
                                                                                                               ºº
                                                                                                                ºº                   º
                                                                                                                                     º
                                                                                                                                     º
                                                                                                                                                                          L,9,0
                                                                                                                                                                        º ºº
                                                                                                                                                                                                            º
                                                                                                                                                                                                                 F,1,0
                                                                                                                                                                                                                ºº
                                                                                                                                                                                                                  º
                                                                                                                                                                                                                 ºº
                                                                                                                                                                                                                ºº      ºº
                                                                                                                                                                                                                        ºº
                                                                                                                                                                                                                         ºº                   º
                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                                                             ºº
                                                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                                                        I,7,0
                                                                                                                                                                                                                                                                                            ººº
                                                                                                                                                                                                                                                                                            ººº
                                                                                                                                                                                                                                                                                             ººº
                                                                                                                                                                                                                                                                                                  ººº
                                                                                                                                                                                                                                                                                                   ººº
                                                                                                                                                                                                                                                                                                   ºº
                                                                   ºº                             ºº
                                                                                                 ºº
                                                                                                 ºº                  ºº              º                               º
                                                                                                                                                                     º
                                                                                                                                                                     º                                     ºº
                                                                                                                                                                                                          ºº
                                                                                                                                                                                                          ºº                  ºº
                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                              º                                  º
                                                                                                                                                                                                                                                                                  º                     ººº
                                                                                                                                                                                                                                                                                                        ºº
                                                                                                                                                                                                                                                                                                         ºº
                                                                ººº
                                                                 ºº                         ºº
                                                                                           ºº
                                                                                                                     ºº
                                                                                                                      ºº            º
                                                                                                                                    º                                º
                                                                                                                                                                                                     ºº
                                                                                                                                                                                                    ºº
                                                                                                                                                                                                                              ºº
                                                                                                                                                                                                                               ºº            º
                                                                                                                                                                                                                                             º                                    ºº                        ºº
                                                                                                                                                                                                                                                                                                             ºº
                                                             ºº
                                                            ºº
                                                             º                             ºº                             ºº
                                                                                                                          ºº       º                                                                ºº                             ºº
                                                                                                                                                                                                                                   ºº       º                                       º
                                                                                                                                                                                                                                                                                    º                        ºº
                                                                                                                                                                                                                                                                                                                ºº
                                                                                                                                                                                                                                                                                                                ºº
                                                        ºº                                ºº
                                                                                         ºº                                ºº º                                        º
                                                                                                                                                                       º                           ºº
                                                                                                                                                                                                  ºº                                ºº º                                                                         º
                                                       ºº
                                                       ºº                                ºº                                   ºº  º
                                                                                                                                  º
                                                                                                                                                                       º
                                                                                                                                                                       º                          ºº                                   ºº  º
                                                                                                                                                                                                                                           º                                      ºº
                                                                                                                                                                                                                                                                                  º                                ºº
                                                                                                                                                                                                                                                                                                                    ºº
                                                  ººº
                                                 ººº
                                                 ººº                                 ºº
                                                                                     ºº
                                                                                      º                                       ºº
                                                                                                                               º                                        ºº                    ºº
                                                                                                                                                                                              ºº
                                                                                                                                                                                               º                                       ººº                                         º
                                                                                                                                                                                                                                                                                                                      º
                               H,6,4       ººº
                                           ººº
                                          ººº                                      º                    B,4,2                    º
                                                                                                                                ººº                                     K,10,0
                                                                                                                                                                         º                  º                    B,2,0                    º
                                                                                                                                                                                                                                         ººº
                                                                                                                                                                                                                                                                                     º
                                                                                                                                                                                                                                                                                     º  L,8,0                         ºº
                      ººº
                     ººº
                     ººº                                                         ººº                   ººº
                                                                                                      ººº
                                                                                                      ººº    ºº
                                                                                                             ºº
                                                                                                              ººº               ººº                                       º               ºº
                                                                                                                                                                                           º                    ººº
                                                                                                                                                                                                               ººº
                                                                                                                                                                                                               ººº    ºº
                                                                                                                                                                                                                      ºº
                                                                                                                                                                                                                       ºº
                                                                                                                                                                                                                        º                ºº º                                       ººº
                                                                                                                                                                                                                                                                                   ººº
                                                                                                                                                                                                                                                                                   ººº
                                                                                                                                                                                                                                                                                                                       º
                                                                                                                                                                                                                                                                                                                       º
                 ººº
                 ººº
                  ºº                                                           º
                                                                               ºº
                                                                                           º º ººº
                                                                                                ºº
                                                                                                ºº                 ºº
                                                                                                                   ºº
                                                                                                                    ºº         º ºº
                                                                                                                               º º
                                                                                                                               º º                                                      º
                                                                                                                                                                                        ºº
                                                                                                                                                                                                    º º ººº
                                                                                                                                                                                                         ºº
                                                                                                                                                                                                         ºº                 ºº
                                                                                                                                                                                                                            ºº
                                                                                                                                                                                                                             ºº         º ºº
                                                                                                                                                                                                                                        º º
                                                                                                                                                                                                                                        º º                                   ººº
                                                                                                                                                                                                                                                                              ººº
                                                                                                                                                                                                                                                                               ºº                                    º
                                                                                                                                                                                                                                                                                                                      º
                                                                                                                                                                                                                                                                                                                      º
             ººº
              ºº
             ºº                                                              º ºº ºº
                                                                             º            ºº
                                                                                         ºº                           º
                                                                                                                         ºº º
                                                                                                                         ºº º º        ºº                                             º ºº ºº
                                                                                                                                                                                      º            ºº
                                                                                                                                                                                                  ºº                           º
                                                                                                                                                                                                                                  ºº º
                                                                                                                                                                                                                                  ºº º º        ºº                        ººº
                                                                                                                                                                                                                                                                           ºº
                                                                                                                                                                                                                                                                          ºº                                      ººº
                                                                                                                                                                                                                                                                                                                   º
          ºº
         ºº
          º                                                                  º ºº    º                                    ºº            º
                                                                                                                                        º                                            º ºº     º                                    ºº            º
                                                                                                                                                                                                                                                 º                   ºº
                                                                                                                                                                                                                                                                    ºº
                                                                                                                                                                                                                                                                     º                                            º
      ºº
     ºº
      º                                                                    º ºº º
                                                                           º º   º                                           ºº           º                                         º ºº º
                                                                                                                                                                                    º º   º                                                        º             ºº
                                                                                                                                                                                                                                                                ºº
                                                                                                                                                                                                                                                                 º                                             ºº
                                                                                                                                                                                                                                                                                                              ºº
                                                                                                                                                                                                                                                                                                               º
   ºº                                                                      º ºº
                                                                          ºº                                                ººº
                                                                                                                             ºººº         º
                                                                                                                                          º
                                                                                                                                          º                                         º º
                                                                                                                                                                                   ºº                                                ººº
                                                                                                                                                                                                                                      ºº
                                                                                                                                                                                                                                      ºººº         º
                                                                                                                                                                                                                                                   º
                                                                                                                                                                                                                                                   º          ºº
                                                                                                                                                                                                                                                              º                                            ºº
                                                                                                                                                                                                                                                                                                           ºº
                                                                                                                                                                                                                                                                                                          ºº
ººº
 º                                                                        ºº
                                                                          ºº
                                                                          ºº                                               º ºº
                                                                                                                           ºº ºº   º       ºº
                                                                                                                                            º                                      ºº
                                                                                                                                                                                   º
                                                                                                                                                                                   ºº                                               º ºº
                                                                                                                                                                                                                                    ºº ºº   º       ºº
                                                                                                                                                                                                                                                     º     ºº
                                                                                                                                                                                                                                                             º                                       ººº
                                                                                                                                                                                                                                                                                                     ººº
                                                                                                                                                                                                                                                                                                      ºº
º
º
º
º
 º
                               I,7,6   ººº
                                       ººº
                                        ººº
                                             ººº
                                              ººº
                                              ºº
                                                                          º
                                                                          º
                                                                          º
                                                                          º
                                                                          º
                                                                          ºº
                                                                          ºº
                                                                                                        A,5,2             º
                                                                                                                          º
                                                                                                                          º
                                                                                                                                     º º
                                                                                                                                      º º
                                                                                                                                      º º
                                                                                                                                       º º
                                                                                                                                        º º
                                                                                                                                         º º
                                                                                                                                                                                   º
                                                                                                                                                                                   º
                                                                                                                                                                                   º
                                                                                                                                                                                   º
                                                                                                                                                                                   º
                                                                                                                                                                                   ºº
                                                                                                                                                                                   ºº
                                                                                                                                                                                                                 A,3,0             º
                                                                                                                                                                                                                                   º
                                                                                                                                                                                                                                   º
                                                                                                                                                                                                                                              º º
                                                                                                                                                                                                                                               º º
                                                                                                                                                                                                                                               º º
                                                                                                                                                                                                                                                º º
                                                                                                                                                                                                                                                 º º
                                                                                                                                                                                                                                                  º º
                                                                                                                                                                                                                                                  º º
                                                                                                                                                                                                                                                           º
                                                                                                                                                                                                                                                           º
                                                                                                                                                                                                                                                           º
                                                                                                                                                                                                                                                           º
                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                                        J,9,7  ººº
                                                                                                                                                                                                                                                                                               ººº
                                                                                                                                                                                                                                                                                                ºº
 ººº                                               ººº
                                                   ºº
                                                    ºº                    ººº                                           º
                                                                                                                        º
                                                                                                                        º                º º                                       ººº                                           º
                                                                                                                                                                                                                                 º
                                                                                                                                                                                                                                 º                º         ººº
   ºº
    º
    º                                                  ºº                  º ºº
                                                                           º º º                                                           º º
                                                                                                                                           ºº
                                                                                                                                           ºº                                       º ºº
                                                                                                                                                                                    º º º                                                           º º
                                                                                                                                                                                                                                                    º
                                                                                                                                                                                                                                                    ºº         ºº
                                                                                                                                                                                                                                                               ºº
       ºº
       ºº                                               ºº
                                                        ºº                  º ºº                                       º                                                             º ºº                                       º                                 ºº
        º
           ºº                                              ºº
                                                           ºº
                                                            º               º ºº º
                                                                            º º º                                     ºº                    ºº
                                                                                                                                             º
                                                                                                                                             º                                       º ºº º
                                                                                                                                                                                     º º º                                     º
                                                                                                                                                                                                                               º                      ºº
                                                                                                                                                                                                                                                     ºº
                                                                                                                                                                                                                                                      º
                                                                                                                                                                                                                                                                  ºº
                                                                                                                                                                                                                                                                   º
                                                                                                                                                                                                                                                                      ºº
           ºº
            ºº                                                ºº             º         ºº
                                                                                        º
                                                                                        º                                                     º                                       º         ºº
                                                                                                                                                                                                 º
                                                                                                                                                                                                 º                                                     º              ºº
                                                                                                                                                                                                                                                                       ºº
              ººº
               ººº
               ºº                                              ºº             º
                                                                              ºº            ººº
                                                                                            ººº
                                                                                             ºº                      º
                                                                                                                     º
                                                                                                                     º                        º
                                                                                                                                              º
                                                                                                                                              º                                        º
                                                                                                                                                                                       º             ººº
                                                                                                                                                                                                     ººº
                                                                                                                                                                                                      ºº                     ºº
                                                                                                                                                                                                                              º                        º
                                                                                                                                                                                                                                                       º
                                                                                                                                                                                                                                                       º                     ººº
                                                                                                                                                                                                                                                                             ººº
                                                                                                                                                                                                                                                                              ºº
                    ººº                                          º
                                                                 º              º                 ººº                                         º                                          º                 ººº                                         º                         ººº
                 ººº
                 ººº
                  ºº
                    ººº
                     ººº
                        ººº
                       ººº
                       ººº     L,8,6                             º
                                                                 º
                                                                 º
                                                                  º
                                                                  º
                                                                                ºº
                                                                                 º
                                                                                   ºº
                                                                                    º
                                                                                    º
                                                                                                   ººº
                                                                                                   ººº
                                                                                                  º º
                                                                                                 ºº
                                                                                                ºº
                                                                                                        C,6,2
                                                                                                        ºº
                                                                                                      ººº
                                                                                                       ºº          º
                                                                                                                   º
                                                                                                                    º                        ºº
                                                                                                                                              º
                                                                                                                                              º
                                                                                                                                              º
                                                                                                                                             ºº
                                                                                                                                            ºº
                                                                                                                                            ºº
                                                                                                                                                                                         ºº
                                                                                                                                                                                            ºº
                                                                                                                                                                                            ºº
                                                                                                                                                                                                            ººº
                                                                                                                                                                                                            ººº
                                                                                                                                                                                                           º º
                                                                                                                                                                                                          ºº
                                                                                                                                                                                                         ºº
                                                                                                                                                                                                                 C,4,0
                                                                                                                                                                                                                 ºº
                                                                                                                                                                                                               ººº
                                                                                                                                                                                                                ºº
                                                                                                                                                                                                                            º
                                                                                                                                                                                                                            º
                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                      ºº
                                                                                                                                                                                                                                                       º
                                                                                                                                                                                                                                                       º
                                                                                                                                                                                                                                                       º
                                                                                                                                                                                                                                                      ºº
                                                                                                                                                                                                                                                     ºº
                                                                                                                                                                                                                                                     ºº
                                                                                                                                                                                                                                                                                 ººº
                                                                                                                                                                                                                                                                                  ººº
                                                                                                                                                                                                                                                                                        K,10,8
                                                                º
                                                                º                      ºººº ºº
                                                                                       ºººº º                     º
                                                                                                                  º                        º                                                    ºººº ºº
                                                                                                                                                                                                ºººº º                    ºº                        º
            ººº
             ºº
            ºº                                                ºº
                                                              º                         ºººº                     º                         º
                                                                                                                                           ºº
                                                                                                                                          ºº                                                     ºººº                     º                         ºº
                                                                                                                                                                                                                                                    ºº
                                                                                                                                                                                                                                                   ºº
         ºº
        ºº
        ºº
                                                             º
                                                             º                      ºº ºº
                                                                                    ºº ºº
                                                                                     º º                        º                         º º                                                ºº ºº
                                                                                                                                                                                             ºº ºº
                                                                                                                                                                                              º º                                                 ºº
      º
      ºº                                                  ºº
                                                         ºº
                                                          º                     º
                                                                                ººº          º                  º
                                                                                                                º
                                                                                                                º
                                                                                                                                         ºº
                                                                                                                                         ºº
                                                                                                                                        ºº                                              ºººº          º                 º
                                                                                                                                                                                                                         º
                                                                                                                                                                                                                         º                        ºº
                                                                                                                                                                                                                                                 ºº
  ººº
   º                                                  ºº
                                                      ºº
                                                     ºº                      ºº
                                                                             º                 ºº
                                                                                                ºº
                                                                                                ºº             º                      º ºº
                                                                                                                                       º
                                                                                                                                       º º                                            º
                                                                                                                                                                                      º
                                                                                                                                                                                        º               ºº
                                                                                                                                                                                                         ºº
                                                                                                                                                                                                         ºº                                     º
                                                                                                                                                                                                                                               º ºº
                                                                                                                                                                                                                                                º º
ºº
 º                                               ººº
                                                ººº
                                                ººº                       ºº
                                                                           º
                                                                            º                       ºº
                                                                                                     ºº
                                                                                                     ºº       º
                                                                                                              º
                                                                                                              º                         º                                          ºº
                                                                                                                                                                                    º
                                                                                                                                                                                     º                       ºº
                                                                                                                                                                                                             ºº
                                                                                                                                                                                                              ºº
                                                                                                                                                                                                                       º
                                                                                                                                                                                                                       º
                                                                                                                                                                                                                       º                         º
º
º
º
º
º
 º
                               J,9,7      ººº
                                          ººº
                                           ºº                             º
                                                                          º
                                                                          º
                                                                          º
                                                                           º
                                                                                                       º
                                                                                                        G,7,2                      ºº º
                                                                                                                                    º º
                                                                                                                                  º º
                                                                                                                                 º º
                                                                                                                                 º º
                                                                                                                                º º
                                                                                                                                ºº º
                                                                                                                                        º                                          º
                                                                                                                                                                                   º
                                                                                                                                                                                   º
                                                                                                                                                                                   º
                                                                                                                                                                                    º
                                                                                                                                                                                                                º
                                                                                                                                                                                                                 G,5,0                      ºº º
                                                                                                                                                                                                                                             º º
                                                                                                                                                                                                                                           º º
                                                                                                                                                                                                                                         ºº º
                                                                                                                                                                                                                                          º º
                                                                                                                                                                                                                                         º º
                                                                                                                                                                                                                                                 º
 ººº                                                                        º
                                                                            ºº                                                º º
                                                                                                                             º º                                                     º
                                                                                                                                                                                     ºº                                                º º
                                                                                                                                                                                                                                      º º º
    ºº
    ºº                                                                        ºº
                                                                              ºº                                             º º
                                                                                                                            ºº º                                                       ºº
                                                                                                                                                                                       ºº                                             º º
                                                                                                                                                                                                                                     ºº º
       ºº
       ºº                                                                        ºº
                                                                                  ºº                                     ºº  º
                                                                                                                             º                                                            ºº
                                                                                                                                                                                          ºº                                      º º º
        º
          ºº
          ºº
                                                                                  º
                                                                                      ºº
                                                                                      ºº                                ºº º
                                                                                                                       ºº º
                                                                                                                                                                                           º
                                                                                                                                                                                               ºº
                                                                                                                                                                                               ºº                                º º
                                                                                                                                                                                                                                 ºº º
                                                                                                                                                                                                                                ºº º
           ºº                                                                          ºº                               º
                                                                                                                        ºº                                                                      ºº                              ºº
              ººº
              ººº
               ºº                                                                           ººº
                                                                                            ººº
                                                                                             ºº                    ºº º
                                                                                                                   ºº º
                                                                                                                  ºº º                                                                               ººº
                                                                                                                                                                                                     ººº
                                                                                                                                                                                                      ºº                    ºº º
                                                                                                                                                                                                                           ºº º
                                                                                                                                                                                                                           ºº º
                  ººº                                                                             ººº             ºº
                                                                                                                ººº
                                                                                                                  º                                                                                        ººº            ºº
                                                                                                                                                                                                                         ººº
                                                                                                                                                                                                                         ºº
                  ººº
                   ººº
                             K,10,8                                                                ººº
                                                                                                   ººº
                                                                                                        D,8,3 ººº
                                                                                                             ºº
                                                                                                             ºº
                                                                                                                                                                                                            ººº
                                                                                                                                                                                                            ººº
                                                                                                                                                                                                                 D,6,1 ºº
                                                                                                                                                                                                                      ºº
                                                                                                                                                                                                                      ºº




                                    ´µ                                                                                  ´ µ ÓÑ ÒÞÓ Ò Â                                                                                           ´ µ ÓÑ ÒÞÓ Ò À
                                     ÓÑ ÒÞÓ
                                    Ò

                                      ÙÖ º¾                                  Ö ÓÐ × Ö                                    ÓÖ × Ð Ö Ó                                            Ð ¬ ÙÖ º¾ ÙÒØÓ ÓÒ ×Ù× ÒÙÑ ÖÓ× ¸ ÐÓÛ
                                    Ý Ö Ó× ÒÓ¹                               Ö ÓÖ ×

                                             × Ò ÒØ ÙÒ Ó w v Ø Ò Ò ÕÙ ÓÒ Ø Ö ÒÓ Ó× ÙÝÓ× × Ò Ñ ÒÓÖ ×
                                          ÕÙ (v)¸ ÔÙ × × ÒÓ Ð Ð Ñ º¿ ÒÓ × Ö      ÖØÓ
                                         Ð ÓÖÓÐ Ö Ó ÒØ Ö ÓÖ ÒÓ× ÔÖÓÔÓÖ ÓÒ ÙÒ Ñ Ò Ö ÓÑÔÙØ ÓÒ ÐÑ ÒØ Ñ × ¬ ÒØ
                                          Ø ÖÑ Ò Ö ÐÓ× ÒÓ Ó×    ÓÖØ     ÙÒ Ö Óº × Ñ ÒØ ¸ ÔÓ Ö ÑÓ× Ð ÙÐ Ö ÙÒ ×ÓÐÓ
                                     Ö ÓÐ Ö ÓÖ Ò ÔÖÓ ÙÒ             ݸ ÔÓÖ     ÒÓ Ó ÔÐ ÑÓ× Ð ÓÒÓ Ñ ÒØÓ Ð ÓÖÓ¹
                                    Ð Ö Ó º½º
                                        È Ö ÓÖÖ ÖÒÓ× Ð ÓÒרÖÙ ÓÒ Ð Ö ÓÐ Ö ÓÖ¸ ÒÙÒ Ö ÑÓ× Ð × Ù ÒØ ÓÒ¹
                                      ÔØÓº
                                    Definici´n 7.2 (N´ mero
                                           o        u         ÐÓÛ) Ë G =< V, E > ÙÒ Ö Ó ÓÒ ÜÓ ×Ó Ö Ð Ù Ð ×
                                    Ö Ð Þ ÙÒ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ       º Ë v ∈ V ÙÒ ÒÓ Óº ÒØÓÒ ×¸ ÐÓÛ(v) × ¬Ò ÓÑÓ
                                     Ð Ñ Ò ÑÓ ÒØÖ (v) Ý ÐÓ× ÒÓ Ó× ÓÒ Ø Ó× v ÔÓÖ Ñ ÒÓ× ÓÒ ÓÖÑ Ó× ÔÓÖ Ö Ó×
                                        Ö ÓÖ × Ý ÒÓ¹ Ö ÓÖ ×º
                                        ÆÓØ × ÕÙ Ò ÙÒ Ö ÓÐ Ö ÓÖ¸ ÐÓ× Ö Ó× Ö ÓÖ × ×ÓÒ Ö Ó׸ Ñ ÒØÖ × ÕÙ
                                    ÐÓ× ÒÓ¹ Ö ÓÖ × ÒÓº
                                           ÑÔÐÓ× × ÑÙ ×ØÖ Ò Ò Ð × ¬ ÙÖ × º¾ Ý º¾ ÔÖ ×Ø × Ø Ò ÓÒ Ú Ö ¬ Ö ÕÙ ÐÓ×
                                    ÒÙÑ ÖÓ× ÐÓÛ         ÒÓ Ó ´ Ü ÔØÓ Ð Ö Þµ¸ × ÓÖÖ ×ÔÓÒ Ò Ð ¬Ò ÓÒº
                                        ÍÒ ÓÖÑ ÐØ ÖÒ Ý¸ ÓÑÔÙØ ÓÒ ÐÑ ÒØ ¸ Ñ × ÓÒÚ Ò ÒØ            ¬Ò Ö ÐÓÛ(v) × ÓÑÓ
7.5. Recorridos sobre grafos                                                                                                                                                                                                                                    645



                     × Ù
                                                                                                ⎧
                                                                                                ⎪df(v)
                                                                                                ⎪
                                                                                                ⎨
                           ÐÓÛ(v) = Ñ Ò ÑÓ ÒØÖ                                                     (x) | x Ù ÐÕÙ                                          Ö ÒÓ Ó ÓÒ Ø Ó v ÔÓÖ Ö Ó ÒÓ¹                                                                      Ö               ÓÖ       ´ º½µ
                                                                                                ⎪
                                                                                                ⎪
                                                                                                ⎩ÐÓÛ(w) | w ÙÒ                                            Ó v
                      ÁÒ ÓÖÑ ÐÑ ÒØ ¸ Ð ÔÖÙ  × ÑÙÝ × Ò ÐÐ × v × ÙÒ Ó Ò Ð Ö ÓÐ Ö ÓÖ¸ Ò¹
                     ØÓÒ × Ð Ø Ö Ö ÔÓ× Ð     ÕÙ     Ü ÐÙ Ý Ð × Ó× ÔÖ Ñ Ö × × ÓÖÖ ×ÔÓÒ Ò ÓÒ Ð
                       ¬Ò ÓÒ º¾º ÐÓ ÓÒØÖ Ö Ó¸ Ò Ø ÖÑ ÒÓ× Ö ÙÖ× ÚÓ× ¸ ÐÓÛ(v) Ñ ÑÓÖ Þ Ð Ñ Ò ÑÓ
                        ØÓ Ó× ×Ù× × Ò ÒØ ׺
                         Ä ÓÖÑ ÐØ ÖÒ ÒÓ× ÙÒ ÓÖÑÙÐ ÓÑÔÐ Ø Ô Ö Ø ÖÑ Ò Ö ÐÓ× ÔÙÒØÓ× ÓÖØ
                     ÙÒ Ö Ó Ò ÙÒ ×ÓÐ ÜÔÐÓÖ ÓÒ¸ × Ò ÙØ Ð Þ Ö ÙÒ Ö ÓÐ Ö ÓÖ ÔÖÓ ÙÒ            ÓÒ Ð¸
                     ÕÙ × Ö ×ÙÑ Ò Ð × Ù ÒØ ÓÖÓÐ Ö Ó
                     Corolario 7.2 Ë T ÙÒ Ö ÓÐ Ö ÓÖ ÔÖÓ ÙÒ           ÙÒ Ö Ó G =< V, E >º Ë v
                     ÙÒ ÒÓ Ó ÕÙ ÒÓ × Ð Ö Þ T º ÒØÓÒ ×¸ v × ÙÒ ÒÓ Ó ÓÖØ × Ý ×ÓÐÓ v Ø Ò ÙÒ Ó w
                     Ø Ð ÕÙ ÐÓÛ(w) ≥ (v)º
                     Demostraci´n Ë
                                 o        ×ÔÖ Ò  Ö Ø Ñ ÒØ Ð × ÙÒ Ó ÔÙÒØÓ Ð ÓÖÓÐ Ö Ó º½º Ë
                     ÐÓÛ(w) ≥ (v) ÒØÓÒ × Ò Ò ÙÒ × Ò ÒØ w × ÓÒ Ø ÙÒ Ò ×ØÖÓ v

                           ººº
                           ººº
                           ººº
                            ºº
                                D,0,-
                                ºº
                                ºº
                               ºº       ºº
                                        ºº
                                         ºº
                                              ºº
                           º                  ºº
                     ººººº
                      ºº º
                      ºº º                     ºº
                 ºº ºº
                ºº ºº
                ºº ºº
                                                    ºº
                                                    ºº
                                                     ºº
           ºº ºº
            ºº ºº
           ºº ºº                                          º
                                                          ºº
                                                           º
       ºº ºº
        º º
       º º                                              º
     º º
    º º
    º º                         B,1,0                   ºº
                                                         ºº                                                                                                                                                                                H,0,-
  º º
  º º                          ººº
                              ººº
                              ººº       ºº
                                        ºº
                                         ºº
                                          º                 º
                                                            ºº
                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                º
  º º                  ºº
                      ººº
                       ºº                     ºº             º                                                                                                                                                                        ºº
                                                                                                                                                                                                                                     ºº
                                                                                                                                                                                                                                     ºº
                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                º
º ºº
º ºº º ººº
 º               ºº
                ºº
                                              ºº
                                               ºº
                                                º              º
                                                               ºº                                                                                                                                                                                º
                                                                                                                                                                                                                                                 º
º º º ºº
º                                                   ºº
                                                    ºº
                                                     ºº         º                                                                                                                                                               ºº
                                                                                                                                                                                                                                ºº
                                                                                                                                                                                                                                 º               º
                                                                                                                                                                                                                                                 º
ºº º ºº    º                                                     ºº                                                                                                                                                                               º
                                                                                                                                                                                                                                                  º
                                                                                                                                                                                                                                                  º
ºº ºº
ººº
 ºº
ºº
                                                      ºº
                                                       ºº
                                                       ºº
                                                                  ºº
                                                                   º                                                                                                                                                       ºº
                                                                                                                                                                                                                          ºº
                                                                                                                                                                                                                          ºº                      º
                                                                                                                                                                                                                                                  º
                                                                                                                                                                                                                                                  º
                                                                                                                                                                                                                                                  º
º
ºº                                                        ºº        º
                                                                    ºº                                                                                                                                                  º
                                                                                                                                                                                                                        ºº                          º
                                                                                                                                                                                                                                                    º
ºº
ºº
 º                                                         ºº
                                                           º                                                                                                                                                           º
                                                                                                                                                                                                                       º                            º
                                                                                                                                                                                                                                                    º
º º
ºº
ºº
º º
º º
ºº º º
 º
                                A,2,0                         º º
                                                              º º
                                                               º º
                                                               º º
                                                                 º º
                                                                  º º
                                                                                                           J,0,-  º
                                                                                                                  ºº
                                                                                                                  ººº
                                                                                                                    º                                                                                            ºº
                                                                                                                                                                                                                   ºº
                                                                                                                                                                                                                    ºº
                                                                                                                                                                                                                                   º º
                                                                                                                                                                                                                                      ººº
                                                                                                                                                                                                                                       ºº
                                                                                                                                                                                                                                       ººº
                                                                                                                                                                                                                                           F,1,0º ºº
                                                                                                                                                                                                                                                º º
                                                                                                                                                                                                                                                º º
                                                                                                                                                                                                                                                    º
                                                                                                                                                                                                                                                 º ºº
                                                                                                                                                                                                                                                     º
ººº ºº
 º ºº º
                                                                  º º                                              ºº                                                                                           ºº               ºº
                                                                                                                                                                                                                                ºº º
                                                                                                                                                                                                                                ºº º             º ºº º
 º º ºº
     º                                                              º º
                                                                    ºº
                                                                    º                                              ºº
                                                                                                                    ºº                                                                                         º
                                                                                                                                                                                                               º            ºº                    º ºº
  º ºº ºº
  º ºº ºº º                                                                                                         ºº                                                                                        º
                                                                                                                                                                                                              º            ºº
                                                                                                                                                                                                                           ºº                     º º
                                                                                                                                                                                                                                                  º
  º º ºº º                                                            ºº
                                                                      ºº
                                                                      º
                                                                        º                                           ºº
                                                                                                                     º º                                                                                     º         ºº
                                                                                                                                                                                                                                      º
                                                                                                                                                                                                                                      º
                                                                                                                                                                                                                                      º            º ºº º
   ºº
             ºº ºº
              ºº º
              º º                                                      º
                                                                       º                                             º º                                                                                    º
                                                                                                                                                                                                            º          ºº
                                                                                                                                                                                                                       ºº                          º º
                                                                                                                                                                                                                                                   º ºº
    ºº             ººº ºº
                   ººº ºº
                    ºº ºº                                              º                                                 º                                                                                                          º                   ºº
      º                    º
                         ººººº                                         º                                              º º
                                                                                                                      º º
                                                                                                                                                                                                          ºº
                                                                                                                                                                                                          º ººº    ºº
                                                                                                                                                                                                                   º                º
                                                                                                                                                                                                                                    º               º ºº
                                                                                                                                                                                                                                                        º
      ººº
         ºº
          ºº
                          ºººº
                           ºººº
                                C,3,0
                                ºº
                                 º
                                 º                                    ºº
                                                                      º
                                                                      ºº
                                                                     ººº
                                                                                                           I,1,0      º º
                                                                                                                      º
                                                                                                                    ººº º
                                                                                                                   ºº º º
                                                                                                                    º       º
                                                                                                                                                                                                         º º
                                                                                                                                                                                                         º º
                                                                                                                                                                                                         º º
                                                                                                                                                                                                        º º                  ººº º
                                                                                                                                                                                                                                    º
                                                                                                                                                                                                                                      ººº
                                                                                                                                                                                                                                  º ººº
                                                                                                                                                                                                                                  ºº º
                                                                                                                                                                                                                              ººº º
                                                                                                                                                                                                                             ºººº º
                                                                                                                                                                                                                                      ºº   B,2,0     º ºº
                                                                                                                                                                                                                                                     º ºº
                                                                                                                                                                                                                                                     º ºººº
              ºº
              ºº
               º
                                                                     º
                                                                     ºº                                            º º ºº
                                                                                                                   º º                                                                                  º º
                                                                                                                                                                                                        º ºº            ºº º º
                                                                                                                                                                                                                                 º                    º ºº
                                                                                                                                                                                                                                                      º ºº
                                                                   ºº                                                   º º    º                                                                                       º
                                                                                                                                                                                                                       ººº
                                                                                                                                                                                                                         º            º                º ºº
                  ºº
                  ºº                                               ºº
                                                                   ºº                                               º ºº º
                                                                                                                    º º ºº                                                                              ººº º ºº
                                                                                                                                                                                                        º
                                                                                                                                                                                                        º º ºº    ºº           º º                     º ºº
                                                                                                                                                                                                                                                       º ºº
                   ºº                                                                                               º ºº º                                                                                                     º º                      º ºº
                       ºº
                       ºº                                        º º
                                                                 º
                                                                º º                                                  º º          º                                                                     ºº ººº
                                                                                                                                                                                                         º º
                                                                                                                                                                                                        ººº                   º
                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                    º                   º ºº
                        ºº
                                                               º º
                                                              º ºº                                                    º º º º
                                                                                                                      º º º º                                                                           ºº
                                                                                                                                                                                                        º                     º º
                                                                                                                                                                                                                              º º                        º ºº
                                                                                                                                                                                                                                                         º ºº
                            ººº
                            ºº
                             ºº                              ºº ºº                                                    º º º º
                                                                                                                         º º º
                                                                                                                                                                                                        º
                                                                                                                                                                                                        º
                                                                                                                                                                                                        ºº                   º º
                                                                                                                                                                                                                             º                            º ºº
                                G,4,0
                               ºº
                               ºº
                                 º
                                ºº      ººº
                                        ººº
                                         ººº
                                               ººº º º ºº
                                                ººº º º
                                                ºº
                                                           º º
                                                          º ºº
                                                            º
                                                                                                       º º
                                                                                                           F,2,0
                                                                                                            º
                                                                                                           ºº
                                                                                                          ºº
                                                                                                          ººº
                                                                                                                  ºº º º
                                                                                                                  º º º
                                                                                                                   º º
                                                                                                                          º º º
                                                                                                                          º º
                                                                                                                           º      º ºº
                                                                                                                                   º º
                                                                                                                                   º º
                                                                                                                                                                                                        ºº
                                                                                                                                                                                                        ºº
                                                                                                                                                                                                        ºº
                                                                                                                                                                                                        ºº
                                                                                                                                                                                                        º
                                                                                                                                                                                                        º
                                                                                                                                                                                                                            º
                                                                                                                                                                                                                             º
                                                                                                                                                                                                                            º º
                                                                                                                                                                                                                            º º
                                                                                                                                                                                                                           º º
                                                                                                                                                                                                                                           A,3,0          º ºº
                                                                                                                                                                                                                                                             ºº
                                                                                                                                                                                                                                                           º ºº
                                                                                                                                                                                                                                                           º ºº
                                                                                                                                                                                                                                                            ººº
                          ºº
                         ºº
                         ºº
                            º                          ºº
                                                      º º
                                                     ºººº
                                                      ººº                                            ºº
                                                                                                    ºº º
                                                                                                    ºº º
                                                                                                                      ºº º
                                                                                                                      ºº º
                                                                                                                       ºº º                                                                             ººº
                                                                                                                                                                                                         º
                                                                                                                                                                                                        ººº
                                                                                                                                                                                                         º ºº
                                                                                                                                                                                                                           º º
                                                                                                                                                                                                                           º º                              ººº
                     ºº                              º ºº                                       ºº
                                                                                                                        ºº
                                                                                                                         ºº          º º
                                                                                                                                     º º
                                                                                                                                      º º                                                                º ºº
                                                                                                                                                                                                            ºº            º º
                                                                                                                                                                                                                          º ºº                               ººº
                                                                                                                                                                                                                                                             ººº
                     ºº
                    ºº                             ººº ºº º
                                                   ººº ºº
                                                    º º ºº                                     ºº
                                                                                               ºº         º
                                                                                                          º               º
                                                                                                                         ºº
                                                                                                                         ºº            º ºº                                                               º ºººº
                                                                                                                                                                                                          º º ºº º º º
                                                                                                                                                                                                          ººº º º º
                                                                                                                                                                                                                          º º                                º ºº
                ºº
                 º
                 º                              ºº º            ºº
                                                                 º
                                                                 º                        ºº
                                                                                           º             º               ºº  º          º º
                                                                                                                                        º º                                                                                                                  ººº
                                                                                                                                                                                                                                                              ºº º
                º                              ºººº
                                               ººº
                                                º
                                                º                   ºº
                                                                    ººº                  ºº                               ººº
                                                                                                                             º
                                                                                                                             º            º º                                                              º ºº º º
                                                                                                                                                                                                            ºº
                                                                                                                                                                                                            º º
                                                                                                                                                                                                                     ºº º º
                                                                                                                                                                                                                     º º                                      º º
            ºº
           ººº                               º
                                           ººº                                          ºº
                                                                                       ºº
                                                                                        º               º
                                                                                                        º                 ººº
                                                                                                                           º ºº           ºº º                                                                         º ºº º
                                                                                                                                                                                                              º º º ººº ººº
                                                                                                                                                                                                                           ºº
                                                                                                                                                                                                                           º
                                                                                                                                                                                                                           º                                  ºº º
                                                                                                                                                                                                                                                               ºº º
                                                                                                                                                                                                                                                               ºº
                                          ººº
                                          ººº                          º
                                                                       º                                º                     º º                                                                                                                                º
        ºº
        º                       F,5,0   ººº
                                        ººº
                                         ººº
                                               ººº
                                                ººº
                                                ºº
                                                                       º
                                                                       º
                                                                       º
                                                                        º
                                                                        º
                                                                                   º
                                                                                    ºº
                                                                                     º
                                                                                                 ºººº º
                                                                                                  ºº º
                                                                                                  ººº º
                                                                                                       º
                                                                                                           B,3,0
                                                                                                          ººº
                                                                                                         ººº
                                                                                                         ºººº               ºº
                                                                                                                              º º
                                                                                                                           ºº º
                                                                                                                            ºº º
                                                                                                                                            º º
                                                                                                                                            º º
                                                                                                                                             º ºº
                                                                                                                                              º º
                                                                                                                                              º º
                                                                                                                                                                                                              º º
                                                                                                                                                                                                               º º ºº
                                                                                                                                                                                                                º ººº
                                                                                                                                                                                                                 º º
                                                                                                                                                                                                                  º ºº
                                                                                                                                                                                                                 º ºº
                                                                                                                                                                                                                  º ººº
                                                                                                                                                                                                                                  ººº
                                                                                                                                                                                                                                   ºº
                                                                                                                                                                                                                                         º
                                                                                                                                                                                                                                         º C,4,0               ºº º
                                                                                                                                                                                                                                                               ºº º
                                                                                                                                                                                                                                                                ºº º
     º
     ºº
                                                     ººº
                                                      ºº
                                                      ºº             ºº
                                                                      º          ºº
                                                                                  º          º º º º
                                                                                             ºº
                                                                                            ºº º º                           ºº º
                                                                                                                             º º ºº º º
                                                                                                                                              º º                                                                    º ºº
                                                                                                                                                                                                                    ºººº
                                                                                                                                                                                                                     ºº º
                                                                                                                                                                                                                     º º             ºº
                                                                                                                                                                                                                                     ºº                         ºº º
                                                                                                                                                                                                                                                                 ºº º
                                                                                                                                                                                                                                                                 ºº º
                                                                                            º                                ºº
   º
   º
   º                                                        ººº ºº
                                                           ºº ººº
                                                            ºº º               º
                                                                               º
                                                                               º ºº    ºº
                                                                                       º
                                                                                           º        º º                       ºº
                                                                                                                                        º º º
                                                                                                                                         º º º        º                                                                º
                                                                                                                                                                                                                      º º
                                                                                                                                                                                                                   º º ºº ºº ºº
                                                                                                                                                                                                                      º ºº º º                                   ºº º
                                                                                                                                                                                                                                                                 º º
                                                              ºº              º ºº                 º º                        ºº          º º º                                                                    º
                                                                                                                                                                                                                   ºº º ºº   º                                    ºº º
 º
 º
 º                                                        º º ºº
                                                          º ºº º
                                                         ºº º º              º ºº
                                                                             ºº ºº                 º º                        ºº º         º º º º
                                                                                                                                             º º ºº                                                                 º         º
                                                                                                                                                                                                                              ººº
                                                                                                                                                                                                                               ºº                                 ºº º
                                                                                                                                                                                                                                                                   ºº
                                                                                                                                                                                                                                                                   ºº
º
º                                                  ººº
                                                  ººº
                                                  ººº
                                                        ºº           ºº
                                                                     º      ºº
                                                                            º
                                                                            ºº
                                                                                                  º
                                                                                                  º º
                                                                                                  º º                          ºº
                                                                                                                               ºº
                                                                                                                               ºº            º º ºº                                                               ºº
                                                                                                                                                                                                                  ºº
                                                                                                                                                                                                                              º
                                                                                                                                                                                                                             ºº ºº
                                                                                                                                                                                                                              ºº º
º
                                             ººº                       º
                                                                       º    ºº
                                                                             º                   º º                                         º          º
                                                                                                                                                        º
                                                                                                                                                                                                                 ºº         º ººº  º
                                                                                                                                                                                                                                   ººº
                                                                                                                                                                                                                                    ººº                             ºº º
                                                                                                                                                                                                                                                                    ºº º
                                                                                                                                                                                                                                                                    ºº º
º
º
º
º
º
º                      ººº
                      ººº
                       ºº
                                H,6,4
                               ººº
                              ººº
                              ººº
                                            ººº
                                            ººº                        º
                                                                       º
                                                                       º
                                                                        º   º
                                                                            º
                                                                            º
                                                                            º
                                                                            º
                                                                            ºº
                                                                                                 º
                                                                                                º º
                                                                                                º º  º     A,4,0                º
                                                                                                                                ºº
                                                                                                                                ºº
                                                                                                                                 ºº
                                                                                                                                 ºº
                                                                                                                                 ºº
                                                                                                                                               º º
                                                                                                                                               º º
                                                                                                                                               ºº
                                                                                                                                                ºº
                                                                                                                                                ºº
                                                                                                                                                º
                                                                                                                                                         º
                                                                                                                                                         ºº
                                                                                                                                                          º
                                                                                                                                                           º
                                                                                                                                                                                                                º º ºº
                                                                                                                                                                                                                ºº º
                                                                                                                                                                                                                ºº º
                                                                                                                                                                                                               ººº
                                                                                                                                                                                                                           º            ºº
                                                                                                                                                                                                                                        ºº G,5,0                      º º
                                                                                                                                                                                                                                                                     ºº
                                                                                                                                                                                                                                                                     ºº º
                                                                                                                                                                                                                                                                     ºº º
                                                                                                                                                                                                                                                                       º
                                                                      º
                                                                      º     ºº                 º º
                                                                                               º º                                               ºº        ºº                                                  ºº º
                                                                                                                                                                                                              ºº ºº
                                                                                                                                                                                                              ºº ºº                                                   ºº º
ºº
 º          ºº
                 ºº
                 ºº
                ºº                                                 ºº
                                                                  ºº
                                                                   º        ººº
                                                                             º ºº
                                                                             º º              º º
                                                                                                                                  ºº
                                                                                                                                  ºº             ºº
                                                                                                                                                  º         º                                                                                                         ºº º
  º º ºº
  º ºº º   ºº                                                   ºº               º
                                                                              º ºº            º ºº
                                                                                              º º                                   º
                                                                                                                                   ºº             ºº         º
                                                                                                                                                             ºº                                              ºº º º
                                                                                                                                                                                                              º º
                                                                                                                                                                                                             º º
                                                                                                                                                                                                                                                                       ºº º
  ºº  º                                                       ºº
                                                              ºº              º ºº
                                                                              º º º º º  ºº º
                                                                                         ºº º º
                                                                                                                                   ººº
                                                                                                                                                  ºº
                                                                                                                                                   º
                                                                                                                                                   º
                                                                                                                                                              º
                                                                                                                                                               º                                             ºº
                                                                                                                                                                                                            º º                                                         º º
                                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                                        ºº º
   º                                                     ºº
                                                         ºº
                                                        ºº                      º         º                                         ºº             º
                                                                                                                                                   º           ºº                                                                                                       ºº º
  ºº
 ºº
   º                                               ººº
                                                  ººº
                                                                                º
                                                                                º             ººº
                                                                                            º ººº
                                                                                                                                    ºº             º
                                                                                                                                                   º                                                       ºº                                                             º º
                                                                                                                                                                                                                                                                         º º
 º º
º º                                          ººº
                                                  ººº                              º
                                                                                               º
                                                                                               º
                                                                                            º ºº ººº                                ºº
                                                                                                                                     ºº
                                                                                                                                                   º
                                                                                                                                                   º
                                                                                                                                                   º             º
                                                                                                                                                                 ºº                                        ºº
                                                                                                                                                                                                           ºº
                                                                                                                                                                                                           ºº                                                             º
                                                                                                                                                                                                                                                                         º º
º º
º ºº
º
º
        º
          ºº
           º
                                I,7,4   ºººº
                                         ººº
                                        ººº
                                              ºº
                                             ºº
                                            º º ººº
                                                ºº
                                                 ºº
                                                                                   º
                                                                                   ºº ºº
                                                                                      º ºº
                                                                                      ºº º º
                                                                                       º
                                                                                              º      ººº
                                                                                                      ººº
                                                                                                           C,5,0
                                                                                                            º
                                                                                                            º
                                                                                                                                       º
                                                                                                                                      ºº
                                                                                                                                      ºº
                                                                                                                                      ºº
                                                                                                                                       ºº         º
                                                                                                                                                   º
                                                                                                                                                   º
                                                                                                                                                   º
                                                                                                                                                   º
                                                                                                                                                   ºº              º
                                                                                                                                                                   ºº
                                                                                                                                                                     º
                                                                                                                                                                                                     D,6,1ºº                                                             º º
                                                                                                                                                                                                                                                                           º º
                                                                                                                                                                                                                                                                           º º
                                                                                                                                                                                                                                                                           º º
                                                                                                                                                                                                                                                                          ºººº
                                                                                                                                                                                                                                                                           ººº
                                                                                                                                                                                                                                                                           ºº
                                                                                                                                                                                                                                                                           º
                                                                                                                                                                                                                                                                              L,7,0   ººº
                                                                                                                                                                                                                                                                                      ººº
                                                                                                                                                                                                                                                                                       ººº
 ºº
  ºº          ºº
              ºº                                     ººº
                                                      ºº
                                                      ºº                                 ººº
                                                                                         ººº
                                                                                          º
                                                                                          º             ºº
                                                                                                         ºº                            º          ºº
                                                                                                                                                  ºº
                                                                                                                                                                     ºº                                                                                              ººº ºº
                                                                                                                                                                                                                                                                      ºº
                                                                                                                                                                                                                                                                     ºº º                   ººº
                                                                                                                                                                                                                                                                                            ººº
                                                                                                                                                                                                                                                                                             ºº
     ºº º º
    ºº
    º             ºº                                       ºº
                                                            ºº
                                                            ºº                             º
                                                                                           ºº
                                                                                        º º ºº ºº
                                                                                                                                        ºº ºº
                                                                                                                                        ºº º
                                                                                                                                          º ºº
                                                                                                                                                                       º
                                                                                                                                                                       º
                                                                                                                                                                       º                                                                                        ºº
                                                                                                                                                                                                                                                                ºº
                                                                                                                                                                                                                                                               ºº
                                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                                                                                 ºº
                                                                                                                                                                                                                                                                                                  ºº
                                                                                                                                                                                                                                                                                                  ºº
        ºº
         º
         º         º
                   º                                                                    º      º º
                                                                                       ºº ºº º º                                         ºº º
                                                                                                                                         º ºº                           º                                                                                   ºº
                                                                                                                                                                                                                                                           ºº
                                                                                                                                                                                                                                                                                                     ºº
                                                                                                                                                                                                                                                                                                      ºº
                                                                                                                                                                                                                                                                                                      º
             ºº º ºº
             ºº
              ºº       º
                                                                ºº
                                                                ºº
                                                                 º                                                                       º        º                      º
                                                                                                                                                                         º                                                                                 ºº                º
                                                                                                                                                                                                                                                                             º                           ºº
                                                                                                                                                                                                                                                                                                         ºº
                                                                                                                                                                                                                                                                                                          º
                   ººººº º
                   ººº º
                    ºº º
                                                                    ºº
                                                                    ººº                ºº
                                                                                      ºº
                                                                                      ºº         ºº
                                                                                                  ºº
                                                                                                  ºº
                                                                                                  ºº                                       º ºº
                                                                                                                                           º ºº
                                                                                                                                           º ºº
                                                                                                                                           º º
                                                                                                                                                                          º
                                                                                                                                                                          ºº                                                                           ºº
                                                                                                                                                                                                                                                      ºº
                                                                                                                                                                                                                                                       º                     º
                                                                                                                                                                                                                                                                             ºº                             ºº
                                                                                                                                                                                                                                                                                                             º
                          ºººº
                         ºººººº                                        º                        º ººº  ºº
                                                                                                        ºº                                 ºº
                                                                                                                                           ºº                               º
                                                                                                                                                                            º                                                                      ºº
                                                                                                                                                                                                                                                    º                                                         º
                       ººº
                        ºº
                       ºº
                           ººº
                             º ºL,8,4
                              ººº
                              ººº
                               ºº
                                                                       º
                                                                       º
                                                                       º
                                                                        º
                                                                                     º
                                                                                       º
                                                                                     ºº ºº
                                                                                     ºº º
                                                                                    ºº º
                                                                                   ºº º º ººº
                                                                                     º
                                                                                               º
                                                                                                  ººº º
                                                                                                           G,6,0
                                                                                                          ººº
                                                                                                         ººº
                                                                                                          ºº
                                                                                                                                           ºº º
                                                                                                                                           ººº
                                                                                                                                             º
                                                                                                                                             º
                                                                                                                                            ººº
                                                                                                                                            º
                                                                                                                                           ºº
                                                                                                                                                                            º
                                                                                                                                                                             ºº
                                                                                                                                                                              º                                                                 ºº
                                                                                                                                                                                                                                                 º
                                                                                                                                                                                                                                                   º
                                                                                                                                                                                                                                                                              I,8,0
                                                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                                                              ºº
                                                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                                                                             º
                                                                                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                                                                                               º
                  º
                  ºº º                                               ºº
                                                                      º            ºº ººº ºº
                                                                                   ºº ºººº                                                ººº
                                                                                                                                             º
                                                                                                                                             ºº
                                                                                                                                              º
                                                                                                                                              º
                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                               º                                                           ººº
                ºº
                ºº                                                ºº
                                                                  ºº
                                                                   º                       ºº                                             º ºº
                                                                                                                                         ººº                                    º
                                                                                                                                                                                º                                                             º                                                           º
           ºº
          ºº
           º                                                   ºº                ºº   ºº
                                                                                   º ººº
                                                                                  ºº ººº                                                      º                                 ºº
                                                                                                                                                                                 º                                                            º
                                                                                                                                                                                                                                              º                                                        ºº
                                                                                                                                                                                                                                                                                                        º
                                                                                                                                                                                                                                                                                                        º
      ºº
     ºº
      º                                                  ºººº
                                                          ºº
                                                               º                  º
                                                                                 ºº
                                                                                 ºººº
                                                                                  º
                                                                                  º                                                   ºº º
                                                                                                                                       ºº º
                                                                                                                                       ºº º
                                                                                                                                                º
                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                              º                                                     ºº
                                                                                                                                                                                                                                                                                                    ºº
                                                                                                                                                                                                                                                                                                   ºº
  ºº
   º                                                    ºº                     º
                                                                               ºº                                                    ºº º       º                                  º
                                                                                                                                                                                   º
                                                                                                                                                                                   º                                                          º
                                                                                                                                                                                                                                              º                                                ººº
                                                                                                                                                                                                                                                                                                ºº
                                                                                                                                                                                                                                                                                               ºº
ºº                                                 ººº
                                                  ººº
                                                   ºº                         ºº
                                                                             ºº º
                                                                             º ºº
                                                                            º ºº
                                                                                                                                    ºº
                                                                                                                                    ºº          º
                                                                                                                                                º                                   º                                                         º
                                                                                                                                                                                                                                               º                                         ººº
                                                                                                                                                                                                                                                                                         ººº
                                                                                                                                                                                                                                                                                          ºº
º
º                               J,9,7        ººº
                                            ººº
                                            ººº                    D,7,2    ºº
                                                                            ºº
                                                                                                                                  ºº
                                                                                                                                  ºº
                                                                                                                                  ºº           L,8,0
                                                                                                                                                 º
                                                                                                                                                 º
                                                                                                                                                 º                                    º
                                                                                                                                                                                      º
                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                 º                            J,9,7 ººº
                                                                                                                                                                                                                                                                                   ººº
                                                                                                                                                                                                                                                                                   ººº
º
º                                                                           º
                                                                            º                                                  ºº
                                                                                                                                º                                                     ºº                                                          º
                                                                                                                                                                                                                                                  º
 ºº                                                                          ºº                                                ºº                                                       º                                                           ºº
                                                                                                                                                                                                                                                     ºº
                                                                                                                                                                                                                                                     º
  ºº
    ºº
    º
                                                                              ºººº
                                                                                º                                           º
                                                                                                                            ºººº
                                                                                                                               º                                                         º
                                                                                                                                                                                         º                                                              ºº
                                                                                                                                                                                                                                                         ºº
                                                                                                                                                                                                                                                         ºº
     ºº                                                                          ºº
        ºº
         º
         º                                                                          ºº
                                                                                     º
                                                                                     º                                    ºº
                                                                                                                         ºº
                                                                                                                         ºº
                                                                                                                                                                                           º
                                                                                                                                                                                           º
                                                                                                                                                                                           º                                                                 ºº
                                                                                                                                                                                                                                                             ºº
                                                                                                                                                                                                                                                              ºº
             ºº
             ºº
              ºº                                                                        ºº
                                                                                         ºº
                                                                                         ºº                              º                                                                   º
                   ººº
                   ººº
                    ºº                                                                        ººº
                                                                                              ººº
                                                                                               ºº                      ºº
                                                                                                                       ºº
                                                                                                                      ºº
                                                                                                                                                                                             º                                                                    ººº
                                                                                                                                                                                                                                                                  ºº
                                                                                                                                                                                                                                                                   ºº
                                                                                                                      º                                                                       ºº
                         ººº                                                                        ººº             ºº
                                                                                                                   ºº
                                                                                                                                                                                                                                                                        ººº
                                                                                                                                                                                                                                                                         ººº
                                                                                                                                                                                                                                                                         ºº
                          ººº
                           ººº
                              K,10,8                                                                 ººº
                                                                                                      ººº
                                                                                                           H,9,1   ºº                                                                         K,10,0
                                                                                                                                                                                               ºº
                                                                                                                                                                                                ºº                                                                         K,10,7

                                     ´µ                                                                         ´ µ ÓÑ ÒÞÓ Ò Â                                                                                      ´ µ ÓÑ ÒÞÓ Ò À
                                      ÓÑ ÒÞÓ
                                      Ò

                       ÙÖ º¾                                        Ö ÓÐ × Ö                                     ÓÖ × Ð Ö Ó                                                   Ð ¬ ÙÖ º¾ ÙÒØÓ ÓÒ ×Ù× ÒÙÑ ÖÓ× ¸ ÐÓÛ
                     Ý Ö Ó× ÒÓ¹                                     Ö ÓÖ ×º
646                                                              Cap´
                                                                    ıtulo 7. Grafos



  ÈÖ        Ö Ñ × ÓÑÔÖ × Ð Ð ÒרÖÙÑ ÒØ ÓÒ Ð Ð ÓÖ ØÑÓ ÕÙ            Ø ÖÑ Ò ÐÓ× ÔÙÒØÓ×
  ÓÖØ ¸ ÔÐ ÒØ ÑÓ× Ð × × Ù ÒØ × ÔÖ Ñ Ø Ú ×
ÈÙÒØÓ× ÓÖØ         ≡
  template <class GT> inline static long & df(typename GT::Node * p)
  template <class GT> inline static long & low(typename GT::Node * p)
   Ä × Ù Ð × Ö ØÓÖÒ Ò ÐÓ× Ú ÐÓÖ ×   (p) Ý ÐÓÛ (p)¸ Ö ×Ô Ø Ú Ñ ÒØ º ÓÑÓ ÔÓ ÑÓ×
 ÔÖ Ö¸ Ð Ú ÐÓÖ Ð ÓÒØ ÓÖ           ÒÓ Ó × Ù× Ô Ö ÐÑ Ò Ö ¸ Ñ ÒØÖ × ÕÙ Ð Ð
ÔÙÒØ ÖÓ ÓÓ Ô Ö ÐÑ Ò Ö ÐÓÛ(p)º רӏ ÔÓÖ ×ÙÔÙ ×ØÓ¸ ÑÔ Ð Ð ÙÐÓ ÐÓ× ÔÙÒØÓ×
    ÓÖØ × ÐÓ× ÓÓ × ÐÓ× ÒÓ Ó× ×Ø Ò × Ò Ó ÙØ Ð Þ Ó׺
     ÒØ × ÓÑ ÒÞ Ö Ð Ð ÙÐÓ¸        Ò Ò Ð Þ Ö× ÐÓ× ÒÓ Ó× Ý Ö Ó× Ð Ö Ó ÐÓ ÕÙ ×
Ö Ð Þ Ð × Ù ÒØ ÓÖÑ
 ÁÒ Ð Þ Ö ÒÓ Ó× Ý Ö Ó×      ≡                                  ´ µ
  Operate_On_Nodes <GT, Init_Low <GT> > () (g);
  g.reset_arcs();
  ÓÒ Ð Ò Ð Þ ÓÒ ÙÒ ÒÓ Ó ×Ø ÒרÖÙÑ ÒØ                ÔÓÖ Ð Ð ×   Init Low¸   ÙÝ ×Ô ¹
¬ ÓÒ × ÓÑÓ × Ù
 ÈÙÒØÓ× ÓÖØ    +≡
      template <class GT>
  struct Init_Low
  {
    void operator () (GT & g, typename GT::Node * node)
    {
      g.reset_counter(node); // inicializa df
      low <GT> (node) = -1; // inicializa low
    }
  };


    Ð × Ù ÒØ Ô ×Ó × ¬Ò Ö Ð ÒØ Ö Þ¸ ÐÐ Ñ        compute cut nodes(g, start, list)¸
ÙÝÓ× Ô Ö Ñ ØÖÓ× ×ÓÒ Ð Ö Ó¸ Ð ÒÓ Ó Ò Ó             Ù×ÕÙ    Ý ÙÒ Ð ×Ø ×Ó Ö Ð Ù Ð ×
ÐÑ Ò Ò ×Ù× ÔÙÒØÓ× ÖØ ÙÐ ÓÒ
ÈÙÒØÓ× ÓÖØ         +≡                                               ¾
      template <class GT, class SA>
  void compute_cut_nodes(GT & g, typename GT::Node * start,
                         DynDlist<typename GT::Node *> & list)
  {
      ÁÒ Ð Þ Ö Ø ÓÒ ÒÓ Ó× ÓÖØ
        ÜÔÐÓÖ Ö Ö ÙÖ× Ú Ñ ÒØ Ð × Ö Ñ × ×Ø ÖØ
      Î Ö ¬ Ö × ×Ø ÖØ × ÙÒ ÒÓ Ó ÓÖØ
  }
Í× × DynDlist ¿ º
    Ä ÖÙØ Ò Ø Ò ØÖ × × × ÙÝ × ÙÒ ÓÒ × ×Ø Ò Ð Ö Ñ ÒØ ÒÙÒ        ׺ Ô ÖØ
Ö Ò Ö ÐÓ× Ö Ó× Ý ÒÓ Ó׸ Ö ÕÙ Ö ÑÓ× Ð ÓÒØ ÓÖ ÐÓ Ð Ú × Ø × ÕÙ Ø ÖÑ Ò Ö Ð
       ÒÓ Ó¸ Ð ÒÓ Ó Ò Ð ÔÓÖ ÓÒ ÓÑ ÒÞ Ö Ù× Ö Ý ÙÒ ÓÒØ ÓÖ ÐÐ Ñ ×
Ð ÜÔÐÓÖ ÓÒ Ö ÙÖ× Ú ¸ Ð Ù Ð × Ö ÑÔÐ ÒØ ÔÓÖ compute cut nodes()
 ÁÒ Ð Þ Ö Ø ÓÒ ÒÓ Ó× ÓÖØ              ≡                    ´ µ
   ÁÒ Ð Þ Ö ÒÓ Ó× Ý Ö Ó×
  long current_df = 0;                          // contador global de visitas
7.5. Recorridos sobre grafos                                                 647



  NODE_BITS(start).set_bit(Depth_First, true); // pintar visitado start
  df <GT> (start) = current_df++;
  int call_counter = 0;                        // contador llamadas recursivas
call counter   Ù ÒØ Ð ÒØ         ÐÐ Ñ × Ö Ð Þ × compute cut node()¸ ÐÓ Ù Ð
ÐÙ Ó Ô ÖÑ Ø Ö Ø ÖÑ Ò Ö × start × Ó ÒÓ ÙÒ ÒÓ Ó ÓÖØ º
   Ä × × Ù ÒØ × Ð ÜÔÐÓÖ ÓÒ Ö ÙÖ× Ú ØÓ Ó× ÐÓ× ÒÓ Ó× ÓÒ Ø Ó× ÔÓÖ start
  ÜÔÐÓÖ Ö Ö ÙÖ× Ú Ñ ÒØ Ð × Ö Ñ × ×Ø ÖØ    ≡             ´   µ
      // Recorra los arcos de start mientras g no haya sido abarcado
  for (Node_Arc_Iterator<GT, SA> i(start);
       i.has_current() and current_df < g.get_num_nodes(); i.next())
  {
    typename GT::Node * tgt = i.get_tgt_node();
    if (IS_NODE_VISITED(tgt, Depth_First))
      continue;
    typename GT::Arc * arc = i.get_current_arc();
    if (IS_ARC_VISITED(arc, Depth_First))
      continue;
    ARC_BITS(arc).set_bit(Depth_First, true);
    __compute_cut_nodes <GT, SA> (g, list, tgt, arc, current_df);
    ++call_counter;
  }
Í× × Node Arc Iterator     º
Ë ÙÒ Ð ÔÖ Ñ Ö ÔÙÒØÓ Ð ÓÖÓÐ Ö Ó º½¸ start × ÙÒ ÒÓ Ó ÓÖØ × Ð Ö ÓÐ Ö ÓÖ
ÔÖÓ ÙÒ        ÓÒ Ö Þ start Ø Ò Ñ × ÙÒ Óº Ò ÐÓ Ø ÖÑ ÒÓ× ×Ø Ð ÓÖ ØÑÓ¸ רÓ
 ר Ø ÖÑ Ò Ó ÔÓÖ Ð ÒØ           Ú × ÕÙ × ÜÔÐÓÖ Ö ÙÖ× Ú Ñ ÒØ ÙÒ ÒÓ Ó ÓÒ Ø Ó
  start      Ó ÓØÖÓ ÑÓ Ó¸ Ð ÒØ         Ú × ÕÙ × ÐÐ Ñ    compute cut nodes()º
Ë × ÐÐ Ñ ÙÒ ×ÓÐ Ú Þ¸ ÒØÓÒ × Ð Ö Ó × ÓÑÔÐ Ø Ñ ÒØ       Ö Ó × Ð ÔÖ Ñ Ö Ö Ó
Ú ×ØÓ × start Ý ÔÓÖ ÐÓ Ø ÒØÓ start ÒÓ ÔÙ × Ö ÙÒ ÒÓ Ó ÓÖØ º ÐÓ ÓÒØÖ Ö Ó¸
× Ò ÑÔÓÖØ Ö Ð Ú ÐÓÖ Ü ØÓ call counter¸ start × ÓÖØ º
    ÄÓ ÒØ Ö ÓÖ × ÜÔÖ × ¸ ÒØÓÒ ×¸ Ð × Ù ÒØ ÑÓ Ó
 Î Ö ¬ Ö × ×Ø ÖØ × ÙÒ ÒÓ Ó ÓÖØ       ≡                     ´   µ
  if (call_counter > 1) // ¿es la ra´z un punto de articulaci´n?
                                    ı                        o
  {
    NODE_BITS(start).set_bit(Cut, true);
    list.append(start);
  }
      Ú Þ ÕÙ × Ø         Ø ÙÒ ÒÓ Ó ÓÖØ ¸ ר × Ñ Ö Ö ÓÒ Ð Ø Cut¸ Р٠и ÐÙ Ó¸
ÒÓ× × ÖÚ Ö Ô Ö Ñ Ö        Ö ÐÓ× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× ×Ó Ó× ÐÓ× ÔÙÒØÓ× ÓÖØ º
   Ä ÒØ Ö Þ Ð            ÜÔÐÓÖ ÓÒ Ö ÙÖ× Ú ¸ compute cut nodes()¸ × ÜÔÖ × Ò Ð × ¹
 Ù ÒØ ÐÓÕÙ
   ¬Ò ÓÒ Ð Ö ÓÖÖ         Ó Ö ÙÖ× ÚÓ Ô Ö ÐÓ× ÔÙÒØÓ×   ÓÖØ   ≡
      template <class GT, class SA> inline static
  void __compute_cut_nodes(GT &                            g,
                           DynDlist<typename GT::Node *> & list,
                           typename GT::Node *             p,
                           typename GT::Arc *              a,
                           long &                          curr_df);
Í× × DynDlist ¿ º
648                                                             Cap´
                                                                   ıtulo 7. Grafos



 ÙÝÓ× Ô Ö Ñ ØÖÓ× × ¬Ò Ò ÓÑÓ × Ù
   ½º g Ð Ö Óº
   ¾º list Ð Ð ×Ø ÒÓ Ó× ÓÖØ º compute cut nodes() Ò            ÔÙÒØÓ ÓÖØ
        Ò ÓÒØÖ Ó ×Ø Ð ×Ø º
   ¿º p Ð ÒÓ Ó ØÙ ÐÑ ÒØ × Ò Ó Ú × Ø Óº
     º a Ð Ö Ó × Ð Ù Ð × Ð ÒÞ pº ר ׸ Ò Ð Ö ÓÐ Ö ÓÖ ÔÖÓ ÙÒ               ¸
        Ð Ö Ó ÕÙ ÓÒ Ø ×Ù ÒÓ Ó Ô Ö º
     º curr df Ð Ú ÐÓÖ ØÙ Ð Ð ÓÒØ ÓÖ Ú × Ø × ÕÙ × Ö × Ò Ó Ð ÒÓ Ó × Ò Ó
       Ú × Ø Ó ÓÑÓ ×Ù Ú ÐÓÖ º
    Ä ÑÔÐ ÒØ ÓÒ         compute cut nodes() Ò Ð Ö ÙÖ× ÓÒ¸ Ð Ð ÙÐÓ ÐÓ× Ú ÐÓ¹
Ö × ÐÓÛ         ÒÓ Ó Ý Ð ×Ø Ò ÓÒ ÕÙ Ð ÒÓ Ó Ú × Ø Ó × Ó ÒÓ ÙÒ Ó ÒØÖÓ Ð
 Ú ÒØÙ Ð Ö ÓÐ Ö ÓÖ ÔÖÓ ÙÒ
 ÁÑÔÐ ÒØ ÓÒ Ð Ö ÓÖÖ Ó Ö ÙÖ× ÚÓ Ô Ö ÐÓ× ÔÙÒØÓ× ÓÖØ      ≡
     template <class GT, class SA> inline static
 void __compute_cut_nodes(GT &                            g,
                          DynDlist<typename GT::Node *> & list,
                          typename GT::Node *             p,
                          typename GT::Arc *              a,
                          long &                          curr_df)

 {
      NODE_BITS(p).set_bit(Depth_First, true); // pinte p como visitado
      low <GT> (p) = df <GT> (p) = curr_df++; // as´gnele df
                                                    ı
          // Recorrer recursivamente arcos de p mientras g no haya sido abarcado
      bool p_is_cut_node = false;
      for (Node_Arc_Iterator <GT, SA> i(p); i.has_current(); i.next())
        {
          typename GT::Arc * arc = i.get_current_arc();
          if (arc == a)
            continue; // a es el padre de arc ==> ignorarlo por definci´n
                                                                        o
          typename GT::Node * tgt = i.get_tgt_node(); // nodo destino de arc
          if (IS_NODE_VISITED(tgt, Depth_First))
            {
              if (not IS_ARC_VISITED(arc, Depth_First)) // ¿es arco no-abarcador?
                if (df <GT> (tgt) < low <GT> (p)) // s´, verificar valor de low
                                                      ı
                  low <GT> (p) = df <GT> (tgt); // actualizar low(p)
              continue;
            }
          if (IS_ARC_VISITED(arc, Depth_First))
            continue;
          ARC_BITS(arc).set_bit(Depth_First, true); // marque arco
          __compute_cut_nodes <GT, SA> (g, list, tgt, arc, curr_df);
          if (low <GT> (tgt) < low <GT> (p)) // verificar hijo de p - low(tgt)
            low <GT> (p) = low <GT> (tgt); // actualizar low(p)
          if (low <GT> (tgt) >= df <GT> (p) and df <GT> (tgt) != 0) // ¿de corte?
            p_is_cut_node = true;
7.5. Recorridos sobre grafos                                                      649



      }
         // p fue explorado recursivamente
     if (p_is_cut_node)
       {
         NODE_BITS(p).set_bit(Cut, true);
         list.append(p);
       }
 }
Í× × DynDlist ¿ Ò   Node Arc Iterator         º
    Ä ÖÙØ Ò ÔÖÓÚ       Ð ÔÖÓÔ Ó Ö ÓÖÖ Ó ×Ó Ö ÐÓ× Ö Ó× Ô Ö Ð ÙÐ Ö ÐÓÛ(p) Ü Ø ¹
Ñ ÒØ × ÙÒ Ð ÓÖÑÙÐ ´ º½µº ÁÒ ÐÑ ÒØ ¸ ÐÓÛ(p) = (p) ÐÙ Ó¸ ÙÖ ÒØ Ð Ò×Ô ÓÒ
   ÐÓ× Ö Ó× p¸ × Ø ÖÑ Ò × × ØÖ Ø Ð Ö Ó Ô Ö ¸ ÙÒ Ö Ó ÒÓ¹ Ö ÓÖ Ó ÙÒ
   Óº       Ñ Ö ×Ó Ö ÙÒ Ö Ó Ó Ó ÙÒÓ ÒÓ¹ Ö ÓÖ Ú Ö ¬ × Ý ÙÒ Ú ÐÓÖ Ñ ÒÓÖ
Ô Ö ÓÐÓ ÖÐ ÐÓÛ(p)º
      × ÑÙÝ ÑÔÓÖØ ÒØ Ö Ð Ö Ð ÓÖÑ Ò ÕÙ Ð Ð ÓÖ ØÑÓ ×Ø Ò Ù Ð × ØÖ × Ð × ×
      Ö Ó׺ ÄÓ× Ö Ó× ÒÓ¹ Ö ÓÖ × ×         ÒØ ¬ Ò ÔÓÖÕÙ ÒÓ ×ÓÒ Ñ Ö Ó× ÓÒ Ð
  Ø Depth Firstº Ð Ö Ó Ô Ö × ×Ø Ò Ù Ñ ÒØ Ð Ô Ö Ñ ØÖÓ aº Ò ÐÑ ÒØ ¸ ÐÓ×
 Ö Ó× Ð Ö ÓÐ Ö ÓÖ × ×ÓÒ Ñ Ö Ó× Ù×ØÓ ÒØ × Ð ÐÐ Ñ Ö ÙÖ× Ú º
                                         19

                                                  18
                                20

                                         16

                                17                15

              9            8             14
                                                       21        28     27

                                                            23               26
      13      10           7             1

                                                       22        24     25
              11          12
                                     2            3

                                         4

                                     5            6


                       ÙÖ º¿¼ ÍÒ Ö Ó ÓÒ Ú Ö Ó× ÔÙÒØÓ×             ÓÖØ
    ÈÙ ×ØÓ ÕÙ Ô Ö Ø ÖÑ Ò Ö × p × ÙÒ ÒÓ Ó ÓÖØ × Ò × Ö Ó Ò×Ô ÓÒ Ö ØÓ Ó×
×Ù× Ö Ó× ´ Ö ÓÖ × Ý ÒÓ¹ Ö ÓÖ ×µ¸ Ð Ø Ò ÓÒ Ð Ö ÓÖÖ Ó          Ö× Ù Ò Ó
× Ý Ò Ñ Ö Ó ØÓ Ó× ÐÓ× Ö Ó× Ý ÒÓ ØÓ Ó× ÐÓ× ÒÓ Ó׺
      ×ÔÙ × ÙÒ ÐÐ Ñ Ö ÙÖ× Ú ¸ × × ÕÙ tgt × ÙÒ Ó pº ÈÓÖ × Ö ÞÓÒ¸ ×
 ÓÑÔ Ö ÐÓÛ(tgt) ≥ (p) Ô Ö Ø Ø Ö × p × ÙÒ ÒÓ Ó ÓÖØ º Ð Ð ÓÖ ØÑÓ ÔÖÓÔ
 Ð Ñ ÒÓÖ Ú ÐÓÖ low × Ð × Ó × ×Ø ×Ù× Ò ×ØÖÓ׸ ÔÙ × Ð       × Ñ ÑÓÖ Þ Ö ×
 Ü ×Ø ÙÒ Ö Ó ÒØÖÓ ÙÒ × Ò Ò ÕÙ ÖÙ Ó ÒÓ            ÙÒ × Ò Ò º
650                                                                                                                                                                                                                                    Cap´
                                                                                                                                                                                                                                          ıtulo 7. Grafos



                                                                                                                                        1,0,-
                                                                                                                                        ºº
                                                                                                                                        ºº    ºº
                                                                                                                                               ºº
                                                                                                                                               ºº
                                                                                                                                                 ºº
                                                                                                                                   ºº
                                                                                                                                   ºº             º
                                                                                                                                                  ºº
                                                                                                                                                       ºº
                                                                                                                                                       ºº
                                                                                                                              ºº
                                                                                                                              ºº
                                                                                                                               º                        º
                                                                                                                                                            ºº
                                                                                                                                                            ºº
                                                                                                                                                             ºº
                                                                                                                         ºº
                                                                                                                         ºº
                                                                                                                    ºº
                                                                                                                    ºº                                            ºº
                                                                                                                                                                  ºº
                                                                                                                                                                   ºº
                                                                                                                                                                    º
                                                                                                                                                                        ºº
                                                                                                                                                                        ººº
                                                                                                               ºº
                                                                                                                º                                                          º
                                                                                                                                                                           ºº
                                                                                                                                                                           ºº
         2,1,0
         º
         ºº                                                        º
                                                                   º
                                                                   º
                                                                     7,6,6            º
                                                                                      ºº
                                                                                                     ºº
                                                                                                     ºº
                                                                                                          ºº
                                                                                                          º                                                 14,13,13
                                                                                                                                                                  º
                                                                                                                                                                  º
                                                                                                                                                                  º
                                                                                                                                                                  º
                                                                                                                                                                             º
                                                                                                                                                                             ººº
                                                                                                                                                                               º º
                                                                                                                                                                                ºº
                                                                                                                                                                                 ºº
                                                                                                                                                                                 º º
                                                                                                                                                                                                                                         21,20,0
                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                            º
                                                                                                                                                                                                                                            º
      ºº                                                          º
                                                                  º                      º
                                                                                         ºº                                                                       º               ºº
                                                                                                                                                                                   ºº                                                      º
      º                                                           º                               º
                                                                                                  ºº                                                              º                   º
                                                                                                                                                                                      º                                                    º
   ºº
    º                                                            º
                                                                 º
                                                                 º
                                                                                            º ºº
                                                                                            ºº
                                                                                             ºº                                                                   º
                                                                                                                                                                  º                º ºº
                                                                                                                                                                                   º ºº º
                                                                                                                                                                                   º ºº
                                                                                                                                                                                                                                           º
                                                                                                                                                                                                                                           º
                                                                                              º                                                                   º                º    ºº
                                                                                                                                                                                         º
                                                                                                                                                                                         º                                                 º
                                                                                                                                                                                                                                           º
  º
  º
  º                                                             º
                                                                º
                                                                º                         ºº
                                                                                          ºº º
                                                                                           º º                                                                    º
                                                                                                                                                                  º
                                                                                                                                                                  º                º
                                                                                                                                                                                   º       ºº
                                                                                                                                                                                           ºº
                                                                                                                                                                                            º                                              º
                                                                                                                                                                  º                º                                                       º
ºº                                                             º
                                                               º
                                                               º                      ºº º
                                                                                       º
                                                                                       º       ºº                                                                                  º
                                                                                                                                                                                              ºº
                                                                                                                                                                                              ºº
                                                                                                                                                                                               ºº                                          º
º                                                             º                    º
                                                                                   ºº           º                                                               º
                                                                                                                                                                º                  º
                                                                                                                                                                                   º              ºº
                                                                                                                                                                                                  ºº
                                                                                                                                                                                                   ºº                                      º
                                                                                                                                                                                                                                           º
                                                                                                                                                                                                                                           º
º
º                                                             º
                                                              º                                 º
                                                                                                º                                                               º
º
º
º
º
         5,2,0º
              ºº
                 º
                                                              º º
                                                              º º
                                                             º º
                                                                     8,7,6   º
                                                                             ºº
                                                                                º
                                                                                ºº              º
                                                                                                º
                                                                                                º
                                                                                                º
                                                                                                                                                            15,14,13
                                                                                                                                                                º
                                                                                                                                                                º
                                                                                                                                                                º
                                                                                                                                                                                   º
                                                                                                                                                                                   º
                                                                                                                                                                                   º
                                                                                                                                                                                                      ºº
                                                                                                                                                                                                      ºº
                                                                                                                                                                                                       ºº
                                                                                                                                                                                                          ºº
                                                                                                                                                                                                          ºº
                                                                                                                                                                                                           ºº
                                                                                                                                                                                                                                         23,21,0
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                                       º
                                                                                                                                                                                                                                                       º
                                                                                                                                                                                                                                                        º
º
º                ºº                                          ºº
                                                             ºº
                                                             ºº            º
                                                                           º
                                                                           º                    º
                                                                                                º                                                               º
                                                                                                                                                                º                   º
                                                                                                                                                                                    º
                                                                                                                                                                                    º                         ºº
                                                                                                                                                                                                              ºº
                                                                                                                                                                                                               ºº                                       º
                                                                                                                                                                                                                                                        º
                                                                                                                                                                º                                                                         º
                                                                                                                                                                                                                                          º
 º
 º
 º
                    º
                    º
                    º                                       ºº
                                                            º
                                                            ºº
                                                             º          ºº
                                                                        ºº                     º
                                                                                               º
                                                                                               º
                                                                                                                                                                º
                                                                                                                                                                º
                                                                                                                                                                º                   º
                                                                                                                                                                                    º                             ºº
                                                                                                                                                                                                                  ºº
                                                                                                                                                                                                                   ºº                     º             º
                                                                                                                                                                                                                                                        º
                                                                     ºº
                                                                     ºº                                                                                        º
                                                                                                                                                               º                    º                                 ºº                  º             º
                                                                                                                                                                                                                                                        º
  ºº
   º                  º
                      º
                      º                                     º
                                                           º º                               ºº                                                                º                    º                                 ºº
                                                                                                                                                                                                                       ºº                 º
                                                                                                                                                                                                                                          º
                                                           º º
                                                           º º                               º                                                                 º                    º
                                                                                                                                                                                    º                                                     º
                                                                                                                                                                                                                                          º             º
                                                                                                                                                                                                                                                        º
    ºº                 º                                   º
                                                          º º                               º                                                                  º
                                                                                                                                                               º                                                          ºº
                                                                                                                                                                                                                          ºº
                                                                                                                                                                                                                           ºº
     º                 ºº                                 º º
                                                          ºººº
                                                           º                               º
                                                                                           º                                                                   º                    º
                                                                                                                                                                                    º                                       º                           º
                                                                                                                                                                                                                                                        º
                                                         ººº                                                                                                   º                    º                                         ºº
                                                                                                                                                                                                                              ºº          º
       º
       ºº               º
                        º                                ººº
                                                         ºº
                                                          º                             ºº                                                                     º
                                                                                                                                                               º                    º                                          ºº
                                                                                                                                                                                                                                º         º
                                                                                                                                                                                                                                          º             º
                                                                                                                                                                                                                                                        º
        º
        º
         4,3,0          º
                        º
                        º
                        º                            º º
                                                     º º
                                                        ººº
                                                       º ºº
                                                         º
                                                      ºº º
                                                                   10,8,6
                                                                   º
                                                                   º
                                                                   º                  ºº
                                                                                      ºº
                                                                                        º
                                                                                                                                                            18,15,13
                                                                                                                                                               º
                                                                                                                                                               º
                                                                                                                                                               º
                                                                                                                                                               º
                                                                                                                                                               º
                                                                                                                                                                                    º
                                                                                                                                                                                    º
                                                                                                                                                                                   ºº
                                                                                                                                                                                   ºº
                                                                                                                                                                                    º
                                                                                                                                                                                   ºº
                                                                                                                                                                                                                               22,22,0 28,23,21
                                                                                                                                                                                                                                  ºº
                                                                                                                                                                                                                                  ºº
                                                                                                                                                                                                                                   º      º
                                                                                                                                                                                                                                          º              º
                                                                                                                                                                                                                                                         º
                                                                                                                                                                                                                                                         º
                                                                                                                                                                                                                                                         º
                                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                                              º
       º                º
                        º                          º
                                                   º     ºº º    ºº                     ºº
                                                                                         º
                                                                                        ºº
                                                                                         º                                                                     º                   ºº
                                                                                                                                                                                   º                                                                     º
                                                                                                                                                                                                                                                         º      º
                                                                                                                                                                                                                                                                ºº
     º                  º                        ºº       º                                                                                                    º                    º
    ºº                 º                         º                                                                                                             º                                                                                         º
                       º
                       º                       ºº
                                               º
                                                          º º
                                                         º º
                                                          º
                                                         ºº º                             ºº
                                                                                          ºº
                                                                                           ºº                                                                  º                   ºº
                                                                                                                                                                                    º                                                                    º
                                                                                                                                                                                                                                                         º        ºº
                                                                                                                                                                                                                                                                   º
  ºº
   º                  º                      ºº
                                             º           ºº º
                                                         ºº    º                            ºº                                                                 º
                                                                                                                                                               º                   º
                                                                                                                                                                                   ººº
                                                                                                                                                                                     º                                                                   º          º
 º
                     º
                     º                     º
                                           º             ºº                                 ºº
                                                                                            ºº                                                                 º
                                                                                                                                                               º                    º
                                                                                                                                                                                    º
                                                                                                                                                                                     º
                                                                                                                                                                                     º
                                                                                                                                                                                                                                                         º
                                                                                                                                                                                                                                                         º           º
                                                                                                                                                                                                                                                                     º
 º                 º                     º
                                         º               º º  º
                                                              º                              ºº                                                                º                     º
                                                                                                                                                                                     º                                                                                º
º                  º
                   º                   ºº
                                       º                 º ºº                                ºº
                                                                                              ºº                                                               º
                                                                                                                                                                                    º
                                                                                                                                                                                    ºº                                                                    º
                                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                                                      º
                                                                                                                                                                                                                                                                      º
º
º               ºº                   ºº
                                     ºº                  ºº º
                                                         ºº º
                                                             º º                              ºº
                                                                                              ºº
                                                                                               ºº
                                                                                                                                                               º
                                                                                                                                                               º                    º
                                                                                                                                                                                    º
                                                                                                                                                                                     º
                                                                                                                                                                                     º                                                                                 º
                                                                                                                                                                                                                                                                       º
º
º
º
º
º
º
         6,4,0  º
                                 º
                                 ºº
                                  ºº                     ºº
                                                         ºº
                                                         º
                                                                     9,9,6                     ºº
                                                                                               º
                                                                                               ºº
                                                                                                º
                                                                                                                                                            19,16,13
                                                                                                                                                              º
                                                                                                                                                               º
                                                                                                                                                               º
                                                                                                                                                               º                    º
                                                                                                                                                                                    º
                                                                                                                                                                                    º
                                                                                                                                                                                    º
                                                                                                                                                                                     º
                                                                                                                                                                                     º
                                                                                                                                                                                     º
                                                                                                                                                                                     º
                                                                                                                                                                                     º
                                                                                                                                                                                                                                                   24,24,21
                                                                                                                                                                                                                                                         º
                                                                                                                                                                                                                                                         º
                                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                                          º
                                                                                                                                                                                                                                                                       º
                                                                                                                                                                                                                                                                       º
                                                                                                                                                                                                                                                                       º
                                                                                                                                                                                                                                                                       º
                                                         ºº
                                                         ºº                                     º
                                                                                                º                                                             º                     º                                                                  º               º
                                                                                                                                                                                                                                                                       º
ºº                            ºº
                              ºº
                               º                         ºº                                     º                                                             º
                                                                                                                                                              º                     º
                                                                                                                                                                                     º
                                                                                                                                                                                     º
                                                                                                                                                                                                                                                      º
                                                                                                                                                                                                                                                      º               º
 º                          º                            º
                                                         ºº                                    º
                                                                                               ºº
                                                                                                º                                                             º                      º
                                                                                                                                                                                     º
                                                                                                                                                                                     º
                                                                                                                                                                                     º                                                              º
                                                                                                                                                                                                                                                    º                 º
                                                                                                                                                                                                                                                                      º
  º
  º                        º
                           º
                           ºº                            ºº                                    ºº                                                             º
                                                                                                                                                              º                      º                                                             º                 º
  º                                                      º                                                                                                    º
   º                    ºº
                         º
                         º                               º
                                                         º                                   ºº
                                                                                              ººº                                                             º
                                                                                                                                                              º
                                                                                                                                                                                     º
                                                                                                                                                                                     º
                                                                                                                                                                                     º                                                            º
                                                                                                                                                                                                                                                  º                 º
                                                                                                                                                                                                                                                                    º
    º
    º                                                    º                                                                                                    º                      º
      º
      º
                     º
                     ºº                                  º
                                                         ºº                                º º
                                                                                            º º
                                                                                           º º                                                                º                      º
                                                                                                                                                                                     º
                                                                                                                                                                                     º                                                          ºº
                                                                                                                                                                                                                                                 º               ºº
                                                                                                                                                                                                                                                                  º
       º           º                                     ºº                                     º                                                             º
                                                                                                                                                              º                                                                                 º
                 ºº                                      ºº                              º º
                                                                                        º º                                                                   º                      º                                                          º              º
                                                                                                                                                                                                                                                               º
         3,5,0
         º
         ºº   ººº                                        ºº
                                                         ºº
                                                         ºº
                                                         ºº
                                                                 13,10,6                º
                                                                                               º
                                                                                               º                                             20,17,13 16,19,13º
                                                                                                                                                              º
                                                                                                                                                              º
                                                                                                                                                              º
                                                                                                                                                              º
                                                                                                                                                                                     º
                                                                                                                                                                                     ºº
                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                º
                                                                                                                                                                                                                                                º º27,25,23
                                                                                                                                                                                                                                                º ºº  ºº
                                                                                                                                                                                                                                                               º
                                                                                                                                                                                                                                                               ºº
                                                         ºº
                                                         ºº
                                                         ºº                                   º
                                                                                              º                                                                                                                                                 º ºº
                                                                                                                                                                                                                                                ºº
                                                                                                                                                                                                                                                ºº
                                                                                                                                                                                                                                                                º
                                                                                                                                                              º
                                                                                                                                                              º                                                                                  º                º
                                                                                                                                                                                                                                                                  º
                                                         ºº
                                                         ºº                                  º                                                                º                                                                                  º                 º
                                                         ºº                                  º
                                                                                             º                                                                º                                                                                 ºº
                                                                                                                                                                                                                                                ºº
                                                                                                                                                                                                                                                º                   º
                                                                                                                                                                                                                                                                    º
                                                          ºº
                                                          ºº                               ºº                                                                 º
                                                                                                                                                              º                                                                                 ºº
                                                                                                                                                                                                                                                ºº                   º
                                                          ºº                               º                                                                  º                                                                                 º  º                  º
                                                          ºº                              º                                                                   º                                                                                  ºº                   º
                                                                                                                                                                                                                                                                      º
                                                          ºº
                                                          ºº                             ºº                                                                   º                                                                                  º º
                                                                                                                                                                                                                                                  º º
                                                                                                                                                                                                                                                  º
                                                                                                                                                              º
                                                                                                                                                              º                                                                                     ººº                º
                                                                                                                                                                                                                                                                       º
                                                           ºº
                                                           ºº                          ºº                                                                     º                                                                                     ººº
                                                                                                                                                                                                                                                     ººº               º
                                                           ºº
                                                            ºº
                                                            ºº
                                                            ºº
                                                                 11,11,6               º
                                                                                                                                             17,18,13                                                                                              25,26,24
                                                                                                                                                                                                                                                         º
                                                                                                                                                                                                                                                         ºº
                                                                                                                                                                                                                                                                       º
                                                                                                                                                                                                                                                                       º
                                                                                                                                                                                                                                                                       º
                                                                                                                                                                                                                                                                       º
                                                                                                                                                                                                                                                                       º
                                                             ºº
                                                             ºº
                                                             ºº                                                                                                                                                                                                        º
                                                              ºº                                                                                                                                                                                                      º
                                                                                                                                                                                                                                                                      º
                                                                                                                                                                                                                                                                      º
                                                              ºº
                                                              ºº
                                                               ºº                                                                                                                                                                                                    º
                                                                                                                                                                                                                                                                     º
                                                                                                                                                                                                                                                                     º
                                                               ºº
                                                               ºº
                                                                                                                                                                                                                                                                   ºº
                                                                ºº
                                                                ºº
                                                                 º
                                                                 º                                                                                                                                                                                                 º
                                                                  º
                                                                  º                                                                                                                                                                                             ºº
                                                                                                                                                                                                                                                                 º
                                                                  º
                                                                  º
                                                                  º
                                                                 12,12,6                                                                                                                                                                           26,27,25   º
                                                                                                                                                                                                                                                              º
                                                                                                                                                                                                                                                              º




    ÙÖ º¿½                              Ö ÓÐ                           Ö               ÓÖ                       ÔÖÓ ÙÒ                                                Ð Ö Ó                             Ð ¬ ÙÖ º¿¼ ÙÒØÓ ÓÒ ×Ù×
Ý ÐÓÛº

7.5.15                Componentes conexos de los puntos de corte
ÍÒ Ú Þ ÕÙ ÑÓ× Ð ÙÐ Ó ÐÓ× ÔÙÒØÓ× ÓÖØ ¸ ÔÙ × Ö × Ð ÓÒÓ Ö Ù Ð × ×ÓÒ
×Ù× “componentes conexos” Ó¸ Ø Ñ Ò¸ “bloques” × Ö¸ ÐÓ× ×Ù Ö Ó× Ö ×ÙÐØ ÒØ ×
   ×ÙÔÖ Ñ Ö ÐÓ× ÔÙÒØÓ× ÓÖØ º
    ÍÒ ÔÖ Ñ Ö Ý ÑÙÝ × ÑÔÐ Ð ÓÖ ØÑÓ Ô Ö Ø ÖÑ Ò Ö ÐÓ× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× ÓÒ× ×Ø
 Ò ØÓÑ Ö ÙÒ ÓÔ Ñ Ô            Ð Ö Ó Ý ×Ó Ö ×Ø Ð Ñ Ò Ö ×Ù× ÒÓ Ó×        ÓÖØ º ÄÓ×
×Ù Ö Ó× Ö ×ÙÐØ ÒØ × ×ÓÒ Ö Ø Ñ ÒØ ÐÓ× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× Ð Ö Óº Ð ÔÖÓ Ð Ñ
    ר Ð ÓÖ ØÑÓ × ÕÙ ÔÙ × Ö ÓרÓ×Ó Ò ×Ô Ó × Ð Ö Ó × ÑÙÝ Ö Ò º
     Ò Ò ÙÖ ¸ ÔÙ × Ö ÒØ Ö × ÒØ ¸ ÒÓ ×ÓÐÓ Ø Ò Ö ÐÓ× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× × ÒÓ Ð Ö ×ØÓ
  Ð Ö Ó ÓÖ Ò Ð ÑÓ Ó Ø Ð ÕÙ ¸ ÔÙ Ö ÑÓ× Ö ÓÒרÖÙ ÖÐÓ Ô ÖØ Ö ×Ù× ÓÑÔÓÒ ÒØ ×
 ÓÒ ÜÓ׸ ÔÙÒØÓ× ÓÖØ Ý Ö Ó× ÕÙ ÓÒØ Ò Ò Ð Ñ ÒÓ× ÙÒ ÔÙÒØÓ ÓÖØ º × ÑÓÑ ÒØÓ
    ÒØÖÓ Ù Ö Ó× ÒÙ Ú × ¬Ò ÓÒ ×º
Definici´n 7.3 (Arco de corte)
       o                       Ë ÙÒ Ö Ó G =< V, E > Ý Ó× ÒÓ Ó×        ÓÖØ u, v
Ø Ð × ÕÙ ×ØÓ× ÓÒ ÓÖÑ Ò ÙÒ Ö Ó a = (u, v) ∈ Eº ÒØÓÒ ×¸ Ð Ö Ó (u, v) × ÒÓÑ Ò Ó
      ÓÖØ º
         Ó ÓØÖÓ ÑÓ Ó¸ ÙÒ Ö Ó ÓÖØ × ÕÙ Ð ÓÒ ÓÖÑ Ó ÔÓÖ Ó× ÒÓ Ó× ÓÖØ º
    È ØÓÖ Ñ ÒØ ¸ ÙÒ Ö Ó ÓÖØ × Ò Ö Ð Þ Ð × Ù ÒØ ÑÓ Ó

                                                                                    G1                                             u                          v                                           G2



ÈÓÖ           ÑÔÐÓ¸ ÐÓ× Ö Ó× (1, 7) Ý (1, 14) Ð Ö Ó                                                                                                                        Ð ¬ ÙÖ º¿¼ ×ÓÒ                                                 ÓÖØ º
Definici´n 7.4 (Arco de cruce)
       o                                                                                                                       Ë ÙÒ Ö Ó G =< V, E > Ý ÙÒ Ö Ó a ∈ E Ø Ð ÕÙ
7.5. Recorridos sobre grafos                                                 651



         ר ÓÑÔÙ ×ØÓ ÔÓÖ ÙÒ ÒÓ Ó ÓÖØ u Ý ÔÓÖ ÙÒ ÒÓ Ó v Ô ÖØ Ò
a = (u, v)                                                            ÒØ     Ð ÙÒ
 ÓÑÔÓÒ ÒØ ÓÒ ÜÓº ÒØÓÒ ×¸ Ð Ö Ó a = (u, v) × ÐÐ Ñ Ó   ÖÙ º
   È ØÓÖ Ñ ÒØ ¸ ÙÒ Ö Ó ÖÙ × Ò Ö Ð Þ Ð × Ù ÒØ ÑÓ Ó
                               u      v     G2



ÈÓÖ ÑÔÐÓ¸ ÐÓ× Ö Ó× (1, 2), (1, 21) Ý (1, 22) Ð Ö Ó Ð ¬ ÙÖ º¿¼ ×ÓÒ¸ ÒØÖ ÓØÖÓ×
Ñ ×¸ ÖÙ º
    Ä ×Ø Ò ÓÒ ×Ø × Ð × × Ö Ó× ÒÓ× × ÖÚ Ö Ô Ö ÒÚ ÖØ Ö Ð ÙÒ Ô ÖØ ÓÒ Ñ ÒØÓ
  Ð Ö Ó × ÙÒ ×Ù× ÒÓ Ó×        ÓÖØ º Ô ÖØ     ÐÓ× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× Ý ÐÓ× ÒÓ Ó×
 ÓÖØ ¸ Ö ÕÙ Ö ÑÓ× ÐÓ× Ö Ó× ÓÖØ Ý ÖÙ Ô Ö ÔÓ Ö Ö ÓÒרÖÙ Ö Ð Ö Ó ÓÖ Ò Ðº
    Ç Ø Ò Ö ÑÓ× ÐÓ× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× Ò Ó× × ×º Ä ÔÖ Ñ Ö × × Ò Ö
 Ô ÒØ Ö ÐÓ× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ׸ ÐÓ× ÒÓ Ó× Ý Ö Ó×       ÓÖØ Ý ÐÓ× Ö Ó×      ÖÙ ÓÒ
    Ö ÒØ × ÓÐÓÖ × ÑÓ Ó Ø Ð ÕÙ Ò Ð × × Ù ÒØ × Ð × ×Ø Ò º È Ö ×Ø ×
 ÑÔÐ Ö ÑÓ× Ð ÖÙØ Ò paint subgraphs()º
           ÙÒ Ð ×Ø        ÒÓ Ó×      ÓÖØ Ð ÙÐ      Ñ ÒØ compute cut nodes()¸
paint subgraphs() Ô ÒØ ÐÓ× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ×        Ð Ö Ó × ÙÒ ÐÓ× ÓÖØ ׺ ר
Ø Ò ¸ Ñ × ÓÑÔÐ ¸ Ô ÖÓ ÓÒ Ñ ÒÓÖ ÓÒ×ÙÑÓ ×Ô Ó¸ ÓÒ× ×Ø Ò Ô ÒØ Ö Ð Ö Ó
  Ô ÖØ Ö ÙÒ ÔÙÒØÓ ÓÖØ Ö Ñ Ò Ó ÐÓ× ÓÐÓÖ × × ÙÒ × Ö Ö × Ð ÔÙÒØÓ Ô Ö¹
Ø Ó × Ð Ò ÓØÖÓ ÔÙÒØÓ ÓÖØ º ×ØÓ ÔÖ ×ÙÑ ÕÙ Ð × Ñ Ö × Ò                 × ´ Ð Ø Cutµ
ÔÓÖ compute cut nodes() ÙÒ × Ù Ò ÔÖ × ÒØ ׺ ÄÐ Ñ Ö ÑÓ× ÒÙ ×ØÖ ÔÖ Ñ Ø Ú ×
paint subgraphs()¸ Ð Ù Ð Ø Ò Ð × Ù ÒØ ÒØ Ö Þ

    template <class GT, class SA>
long paint_subgraphs(GT & g, const DynDlist<typename GT::Node*> & cut_node_list);

   g  × ÙÒ Ö Ó ÓÒ ×Ù× ÒÓ Ó× ÓÖØ Ð ÙÐ Ó× Ý Ù Ö Ó× Ò Ð Ð ×Ø cut node list
Ñ ÒØÖ × ÕÙ cut arc list × ÙÒ Ô Ö Ñ ØÖÓ × Ð ÕÙ Ö ØÓÖÒ ÐÓ× Ö Ó× ÓÖØ Ð
 Ö Óº Ð Ú ÐÓÖ Ö ØÓÖÒÓ × Ð ÒØ               ÓÐÓÖ × Ò ÓÒØÖ      Ó × ¸ Ð ÒØ
 ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× Ó ÐÓÕ٠׺
   paint subgraphs() ×ÙÑ ÕÙ ÔÖ Ú Ñ ÒØ ×               ÙØÓ ×Ó Ö Ð Ö Ó Ð ÖÙØ Ò
compute cut nodes()º
   ÄÙ Ó ÙÒ ÐÐ Ñ           paint subgraphs()¸ Ð Ö Ó g Ú Ò ÓÐÓÖ Ó          Ð ×¹
 Ù ÒØ ÓÖÑ
  ½º ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× ÐÖ ÓÖ ÙÒ ÒÓ Ó               ÓÖØ ×ÓÒ ÓÐÓÖ Ó× ÓÒ ÙÒ ÓÐÓÖ
      ÒØÖ 0 Ý n ÓÒ n × Ð ÒØ             ØÓØ Ð     ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× ÕÙ Ø Ò Ð
      Ö Óº ÈÓÖ ÓÐÓÖ Ó× ¸ Ò× ×Ø ÑÓ׸ ÕÙ Ö ÑÓ× Ö ÕÙ ØÓ Ó× ÐÓ× ÒÓ Ó× Ý Ö Ó×
     Ô ÖØ Ò ÒØ × ÙÒ ÓÐÓÖ i Ø Ò Ò ×Ù Ú ÐÓÖ ÓÒØ ÓÖ Ò iº
  ¾º ÄÓ× ÒÓ Ó× ÓÖØ Ø Ò Ò ÓÐÓÖ 0º
  ¿º ÄÓ× Ö Ó× ÓÖØ Ø Ò Ò ÓÐÓÖ 0 Ý Ð Ø Cut Ò trueº
   º ÄÓ× Ö Ó× ÖÙ ×ÓÒ ÓÐÓÖ Ó× ÓÒ Ð ÓÐÓÖ ×Ô Ð Cross Arcº ÆÓØ ÑÓ× ÕÙ ×Ø
      Ð×      Ö Ó ÒÓ ×¸ Ò    ÓÖØ Ò Ô ÖØ Ò      ÙÒ ÓÑÔÓÒ ÒØ ÓÒ ÜÓº
652                                                                 Cap´
                                                                       ıtulo 7. Grafos



          Ð ÓÐÓÖ         ÙÒ Ö Ó    ÖÙ ×       ¬Ò ÓÑÓ
¾         ÈÙÒØÓ×          ÓÖØ     +≡                                    ¾
            const long Cross_Arc = -1;
            ¬Ò ×
            Cross Arc¸   Ù×   Ò ÙÒ × ¾    Ò   ¿º

 È Ö Ú Ö ¬ Ö × ÙÒ Ö Ó × ÖÙ ¸ ÑÔÐ Ö ÑÓ× Ð ÔÖ Ñ Ø Ú × Ù ÒØ
¾     ÈÙÒØÓ× ÓÖØ       +≡                            ¾                  ¿
                template <class GT> inline static
            bool is_a_cross_arc(typename GT::Arc * a) { return ARC_COUNTER(a) == Cross_Arc; }
          Í× × Cross Arc ¾ º

       Ä × ÙÒ × ÓÒ× ×Ø Ò Ñ Ô Ö Ð Ö Ó ÔÖ Ú Ñ ÒØ Ô ÒØ Ó × ÙÒ Ð ÙÒÓ                   ÐÓ×
    ÓÐÓÖ × ÑÔÐ Ó× Ò Ð ÔÖ Ñ Ö × º È Ö ×Ø × × ÑÔÐ Ò Ó× ÔÖ Ñ Ø Ú ×
      ½º    template <class GT, class SA>
          void map_subgraph(GT & g, GT & sg, const long & color);


          Ë ÙØ Ð Þ Ô Ö Ó Ø Ò Ö ÐÓ× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× Ð Ö Ó × ÙÒ ×Ù× ÔÙÒØÓ×        Ö¹
          Ø ÙÐ ÓÒº
          g × ÙÒ Ö Ó ÓÒ ×Ù× ÒÓ Ó×          ÓÖØ ÔÖ Ú Ñ ÒØ Ð ÙÐ Ó× Ý Ñ Ö Ó Ñ ¹
             ÒØ compute cut nodes()º sg × Ð Ö Ó Ò ÓÒ × × Ó Ø Ò Ö ÙÒ
           ÓÔ Ñ Ô         Ð ÓÑÔÓÒ ÒØ ÓÒ ÜÓ        ÓÐÓÖ color ÔÖ Ú Ñ ÒØ Ô ÒØ Ó Ñ ¹
             ÒØ paint subgraphs()º
          ÆÓØ ÑÓ× ÕÙ      ÑÓ× Ö Ð Þ Ö Ø ÒØ × ÐÐ Ñ × ×Ó Ö ×Ù Ö Ó× sg ר ÒØÓ× ÓÑÓ
           ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× Ø Ò gº Ç × ¸ Ð ÒØ              ÓÐÓÖ ×¸ Ù Ð × Ð Ú ÐÓÖ
          Ö ØÓÖÒÓ paint subgraphs()º
     ¾º               template <class GT, class SA>
          void map_cut_graph(GT &                             g,
                             DynDlist<typename GT::Node*> &   cut_node_list,
                             GT &                             cut_graph,
                             DynDlist<typename GT::Arc*> &    cross_arc_list);


          Ç Ø Ò Ð Ö Ó ÓÖØ × Ö¸ Ð Ö Ó ÓÑÔÙ ×ØÓ ÔÓÖ ØÓ Ó× ÐÓ× ÒÓ Ó× Ý Ö Ó×
              ÓÖØ º
          g × ÙÒ Ö Ó ÓÒ ×Ù× ÒÓ Ó×         ÓÖØ ÔÖ Ú Ñ ÒØ Ð ÙÐ Ó× Ý Ñ Ö Ó Ñ ¹
             ÒØ compute cut nodes()º cut node list × Ð Ð ×Ø ÒÓ Ó× ÓÖØ Ø Ñ Ò
          Ó Ø Ò ÐÙ Ó ÐÐ Ñ Ö compute cut nodes()º cut graph × Ð Ö Ó ÓÒ ×
            × ÙÒ ÓÔ Ñ Ô           Ð Ö Ó ÓÖØ º Ò ÐÑ ÒØ ¸ cross arc list × Ð Ð ×Ø
              Ö Ó× ÖÙ Ò g¸ ÐÓ× Ù Ð × ÒÓ Ô ÖØ Ò Ò Ò ÐÓ× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ׸ Ò Ð
           Ö Ó ÓÖØ º
7.5.15.1       Pintado de componentes conexos

 ÖÓ××Ó ÑÓ Ó¸ Ð Ø Ò     Ô ÒØ Ó ÓÒ× ×Ø Ò Ò Ö ÙÒ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ    ×
ÙÒ ÔÙÒØÓ ÓÖØ ÓÒ ÙÒ ÓÐÓÖ Ò Ð 0º Ù Ò Ó Ð Ö ÓÖÖ Ó Ö ÙÖ× ÚÓ Ð Ò ÙÒ ÒÓ Ó
    ÓÖØ ¸ ÕÙ ÔÙ × Ö Ð Ñ ×ÑÓ Ô ÖØ ¸ ÒØÓÒ × × Ö Ð Þ ÙÒ Ñ Ó ´ Ò Ö Ñ ÒØÓµ
7.5. Recorridos sobre grafos                                                    653



        ÓÐÓÖº ÙÖ ÒØ Ð Ö ÓÖÖ Ó ÙÒ ÓÑÔÓÒ ÒØ ¸ Ø ÒØÓ ÐÓ× ÒÓ Ó× ÓÑÓ ÐÓ× Ö Ó× ×ÓÒ
     ÓÐÓÖ Ó× ÓÒ Ð ÓÐÓÖ ØÙ к ÍÒ Ú Þ ÕÙ ØÓ Ó× ÐÓ× Ö Ó× Ý Ò × Ó Ö ÓÖÖ Ó× × Ò ÖÙÞ Ö
    ÙÒ ÔÙÒØÓ ÓÖØ ¸ ÒØÓÒ × Ð Ö Ó ×Ø Ö ÓÐÓÖ Ó × ÙÒ ÐÓ× ÓÑÔÓÒ ÒØ × ×Ó Ó×
    ×Ù× ÔÙÒØÓ× ÖØ ÙÐ ÓÒº
¿    ÈÙÒØÓ× ÓÖØ       +≡                                    ¾   ¿
          template <class GT, class SA> inline static
      void __paint_subgraph(GT &                g,
                            typename GT::Node * p, // Nodo actual
                            typename GT::Arc * a, // Arco que conduce a p
                            const long &        current_color)
      {
        if (is_a_cut_node <GT> (p))
          return; // p es de corte ==> ign´relo!
                                          o
        paint_arc <GT> (a, current_color);
        if (is_node_painted <GT> (p))
          return;
        paint_node <GT> (p, current_color);
            // recorrer y pintar recursivamente el bloque a trav´s de arcos de p
                                                                e
        for (Node_Arc_Iterator<GT, SA> it(p); it.has_current(); it.next())
          {
            typename GT::Arc * arc = it.get_current_arc();
            if (is_arc_painted <GT> (arc))
              continue;
            __paint_subgraph <GT, SA> (g, it.get_tgt_node(), arc, current_color);
          }
      }
    Í× × Node Arc Iterator   º
      ר Ú Ö× ÓÒ ×ÙÑ ÕÙ p × Ð ÒÞ × ÙÒ ÒÓ Ó Ý Ô ÒØ Ó ÓÒ current colorº Ð
     Ò Ó¸ Ó × ¸ Ð ÔÖ Ñ Ö ÒÓ Ó ÕÙ × ÒØÖ Ô ÒØ Ö Ý ÕÙ ×Ø ÓÒ Ø Ó ÙÒ Ö Ó ÖÙ ¸
    ×      Ô ÒØ Ö Ñ ÒØ Ð × Ù ÒØ Ú Ö× ÓÒ
¿    ÈÙÒØÓ× ÓÖØ         +≡                                ¿  ¿
          template <class GT, class SA> inline static
      void __paint_subgraph(GT & g, typename GT::Node * p, const long & current_color)
      {
        paint_node <GT> (p, current_color);
        for (Node_Arc_Iterator<GT, SA> it(p); it.has_current(); it.next())
          {
            typename GT::Arc * arc = it.get_current_arc();
            if (is_arc_painted <GT> (arc))
              continue;
            __paint_subgraph <GT, SA> (g, it.get_tgt_node(), arc, current_color);
          }
      }
    Í× × Node Arc Iterator   º
        ר Ú Ö× ÓÒ Ò Ð ÓÐÓÖ ÓÒ ÙÒ ÓÑÔÓÒ ÒØ ÓÒ ÜÓ Ð Ù Ð × Ð ÐÐ                  × ÙÒ
    ÒÓ Ó ÓÖØ Ú ×ØÓ ÔÓÖ Ð × Ù ÒØ ÖÙØ Ò
¿    ÈÙÒØÓ× ÓÖØ      +≡                             ¿
        template <class GT, class SA> inline static
      void __paint_from_cut_node(GT & g, typename GT::Node * p, long & current_color)
654                                                             Cap´
                                                                   ıtulo 7. Grafos



  {
          // pintar recursivamente con distintos colores los bloques conectados a p
      for (Node_Arc_Iterator<GT, SA> it(p); it.has_current(); it.next())
        {
          typename GT::Arc * arc = it.get_current_arc();
          typename GT::Node * tgt_node = it.get_tgt_node();
          if (is_a_cut_node <GT> (tgt_node)) // ¿ es un arco de corte?
            {
              ARC_BITS(arc).set_bit(Cut, true); // marque arco como de corte
              continue; // avance a pr´ximo arco
                                      o
            }
          else
            {
              paint_arc <GT> (arc, Cross_Arc); // marque arco como de cruce
              if (is_node_painted <GT> (tgt_node))
                continue;
            }
              // pintar recursivamente con current_color nodo conectado a arc
              // (no es ni de corte ni de cruce)
          __paint_subgraph <GT, SA> (g, tgt_node, current_color);
          current_color++; // cambiar color (siguiente arco pertenece a otro bloque)
        }
  }
Í× × Cross Arc ¾ Ò    Node Arc Iterator   º
       ÓÑÓ × Ú ¸  paint from cut node() ØÓÑ ÙÒ ÒÓ   Ó
                                                    ÓÖØ Ý × Ò Ö              ÒÚÓ Ö
      paint subgraph() ×Ó Ö Ð Ö Ó ØÙ Ð Ó Ô ÒØ ÖÐ Ö Ó ÓÖØ º
    Ò ÐÑ ÒØ ¸ ÒÓ Ö ×Ø ÑÔÐ Ñ ÒØ Ö Ð ÖÙØ Ò ÔÖ Ò Ô Ð
ÈÙÒØÓ× ÓÖØ         +≡                                     ¿
    template <class GT, class SA> inline
  long paint_subgraphs(GT & g, const DynDlist<typename GT::Node*> & cut_node_list)
  {
    g.reset_counter_nodes();
    g.reset_counter_arcs();
    long current_color = 1;
        // Recorrer cada nodo de corte y pintar sus bloques
    for (typename DynDlist<typename GT::Node*>::Iterator i(cut_node_list);
         i.has_current(); i.next())
      __paint_from_cut_node <GT, SA> (g, i.get_current(), current_color);
    return current_color;
  }
Í× × DynDlist ¿ º
        ×ÔÙ ×     Ð ÙÐ Ö ÐÓ× ÔÙÒØÓ× ÓÖØ Ý Ø Ò ÖÐÓ× Ò cut node list¸ Ð Ù×Ù Ö Ó ÒÚÓ
  paint subgraphs() Ô Ö Ô ÒØ Ö ÓÒ ×Ø ÒØÓ× ÓÐÓÖ × ÐÓ× ÐÓÕÙ × Ð Ö Óº            ÐÓÕÙ
ÔÙ       ר Ò Ù Ö× Ñ ÒØ ×Ù ÓÐÓÖº ÄÓ× Ö Ó× ÖÙ × ×Ø Ò Ù Ò ØÖ Ú × Ð ÓÐÓÖ
 ×Ô Ð Cross Arcº ÄÓ× ÒÓ Ó× Ý Ö Ó× ÓÖØ × ×Ø Ò Ù Ò Ñ ÒØ Ð Ø Cutº À ר
 Ð ÔÖ × ÒØ ¸ ÒÓ × Ö Ð Þ Ó ÙÒ ÓÔ            ÓÒ Ð Ð Ö Óº
7.5. Recorridos sobre grafos                                                  655



7.5.15.2    Copia mapeada de componentes conexos

  Ò Ð ÙÒ × Ö ÙÒר Ò ×¸ × ÓÒÚ Ò ÒØ ÓÔ Ö ÐÓ× ×Ø ÒØÓ× ÐÓÕÙ × ÙÒ Ö Óº ÈÓÖ
    ÑÔÐÓ¸ ÐÓ× Ð ÓÖ ØÑÓ×       Ù ÓÓ      Ø ÓÒ ÔÐ Ò Ö       × ÑÔÐ ¬ Ò ×Ù× Ð ÙÐÓ×
ØÖ       Ò Ó ×Ó Ö ÐÓ× ÐÓÕ٠׺ ÈÙ ×ØÓ ÕÙ Ñ ÒÙ Ó × Ò × Ö Ó ÑÓ ¬ Ö ÐÓ× ÐÓÕ٠׸ ×
ÔÖ Ö Ð          ÖÐÓ ×Ó Ö ÓÔ × ÕÙ ×Ó Ö Ð Ö Ó ÓÖ Ò Ðº
      Ð ÔÖÓ ×Ó        ÒØ ¬ ÓÒ¸ ÓÔ Ý Ñ Ô Ó ÙÒ ×Ù Ö Ó¸ Ó ÙÒ ÓÐÓÖ × × ÑÔÐ ÙÒ
Ú Þ ÕÙ × Ø Ò Ò Ô ÒØ Ó× ÐÓ× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× Ù× Ö Ý Ò ÓÒØÖ Ö Ð ÔÖ Ñ Ö ÒÓ Ó
 ÓÒ Ð ÓÐÓÖ ÒØ Ö × Ý¸ Ô ÖØ Ö Ð¸ Ö Ð Þ Ö ÙÒ ÜÔÐÓÖ ÓÒ Ò ÔÖÓ ÙÒ          ÕÙ Ú × Ø ¸
 ÓÔ Ý Ñ Ô ÐÓ× ÒÓ Ó× Ý Ö Ó× ÓÒ Ð Ñ ×ÑÓ ÓÐÓÖº
    ËÓ Ö ÙÒ ÒÓ Ó Ð Ö Ó gsrc¸ ÓÒ Ð ÓÐÓÖ ÒØ Ö × color ¸ Ý ÓÔ Ó Ý Ñ Ô Ó
   ÙÒ ×Ù Ö Ó sg¸ Ð Ö ×ØÓ Ð Ñ Ô Ó × ÓÑÔÐ Ø ¸ Ö ÙÖ× Ú Ñ ÒØ ¸ Ð × Ù ÒØ Ñ Ò Ö
 ÈÙÒØÓ× ÓÖØ            +≡
        template <class GT, class SA> inline static
  void __map_subgraph(GT &                 g,    // grafo con ptos de corte
                       GT &                sg,   // subgrafo donde se copia bloque
                       typename GT::Node * gsrc, // nodo de g ya copiado en sg
                       const long &        color)
  {
    typename GT::Node * tsrc = // imagen de gsrc en sg
      static_cast<typename GT::Node*>(NODE_COOKIE(gsrc));
         // recorrer arcos de gsrc y a~adir a sg aquellos con el color de inter´s
                                      n                                        e
    for (Node_Arc_Iterator <GT, SA> i(gsrc); i.has_current(); i.next())
      {
         typename GT::Arc * garc = i.get_current_arc();
         if (get_color <GT> (garc) != color or IS_ARC_VISITED(garc, Build_Subtree))
           continue; // arco es de otro color o ya est´ visitado
                                                      a
         ARC_BITS(garc).set_bit(Build_Subtree, true); // marque arco
         typename GT::Node * gtgt = i.get_tgt_node(); // nodo destino de garc
         typename GT::Node * ttgt = NULL;          // imagen de gtgt en sg
         if (IS_NODE_VISITED(gtgt, Build_Subtree)) // ¿gtgt ya est´ en sg?
                                                                  a
           ttgt = static_cast<typename GT::Node*>(NODE_COOKIE(gtgt)); // s´ı
         else
           {     // gtgt no est´ en sg ==> copiarlo y mapearlo
                               a
             auto_ptr<typename GT::Node> ttgt_auto(new typename GT::Node(gtgt));
             sg.insert_node(ttgt_auto.get());
             GT::map_nodes(gtgt, ttgt_auto.get());
             NODE_BITS(gtgt).set_bit(Build_Subtree, true); // marque gtgt
             ttgt = ttgt_auto.release();
           }
             // copiar y mapear arco en sg
         typename GT::Arc * tarc = sg.insert_arc(tsrc, ttgt, garc->get_info());
         GT::map_arcs(garc, tarc);
         __map_subgraph<GT, SA> (g, sg, gtgt, color); // recursivamente a gtgt
      }
  }
Í× × Node Arc Iterator   º
    map subgraph() Ñ Ö ÐÓ× ÒÓ Ó× Ý Ö Ó× Ú × Ø Ó× ÓÒ Ð Ø Build Subtree ר
ÑÓ Ó¸ × ×Ø Ò Ù ÕÙ ÙÒ ÒÓ Ó Ó Ö Ó ÓÒ Ð ÓÐÓÖ ÒØ Ö × Ý × Ó Ó ÒÓ Ñ Ô Óº
  Ä ÖÙØ Ò     ÒØ Ö Þ map subgraph() Ù× ×Ó Ö Ð Ö Ó g Ð ÔÖ Ñ Ö ÒÓ Ó ÓÒ ÓÐÓÖ
656                                                           Cap´
                                                                 ıtulo 7. Grafos



 colorÝÑ Ô           Ð ÓÑÔÓÒ ÒØ ÓÒ ÜÓ Ð ×Ù Ö Ó sgº Ë ×Ô ¬       ÓÑÓ × Ù
ÈÙÒØÓ× ÓÖØ            +≡
      template <class GT, class SA>
  void map_subgraph(GT & g, GT & sg, const long & color)
  {
    clear_graph(sg);
    typename GT::Node * first = NULL; // busque primer nodo con el color
    for (typename GT::Node_Iterator it(g); it.has_current(); it.next())
      if (get_color <GT> (it.get_current_node()) == color)
        first = it.get_current_node();
        // cree first, ins´rtelo en sg y map´elo
                          e                 e
    auto_ptr<typename GT::Node> auto_tsrc ( new typename GT::Node(first) );
    sg.insert_node(auto_tsrc.get());
    GT::map_nodes(first, auto_tsrc.release());
    NODE_BITS(first).set_bit(Build_Subtree, true); // m´rquelo visitado
                                                       a
        __map_subgraph <GT, SA> (g, sg, first, color); // mapee first
  }
Í× × Node Iterator    º
    ÆÓ× Ö ×Ø ÔÓÖ ÓÒרÖÙ Ö Ð Ö Ó       ÓÖØ Ý Ù Ö Ö ÐÓ× Ö Ó×   ÖÙ º È Ö ÐÐÓ¸
 ÓÒ ÙÒ Ô × ×Ó Ö Ð Ð ×Ø       ÒÓ Ó× ÓÖØ Ö ÑÓ× Ý Ñ Ô ÑÓ× ×Ù× Ñ Ò × Ò Ð
 Ö Ó ÓÖØ cut graphº ×Ô٠׸ ØÙ ÑÓ× ÙÒ ÖÖ Ó ×Ó Ö ØÓ Ó× ÐÓ× Ö Ó׺ ÄÓ× ÕÙ
 ר Ò Ô ÒØ Ó× ÐÓ× ÒÓÖ ÑÓ׸ ÔÙ × Ô ÖØ Ò Ò ÐÓ× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ׺ ÄÓ× Ö Ó×
 ÓÖØ ÐÓ× ÓÔ ÑÓ× Ò× ÖØ ÑÓ× Ò cut graph Ñ ÒØÖ × ÕÙ ÐÓ× ÖÙ ÐÓ× Ò× ÖØ ÑÓ× Ò
Ð Ð ×Ø cross arc listº ÍÒ Ø ÐÐ × Ò Ð × Ô Ö Ø Ö×       ÕÙ ¸ Ð Ü Ô ÓÒ ÐÓ×
 ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× Ý Ð Ö Ó ÓÖØ ¸ ÐÓ× Ö Ó× ÖÙ ÒÓ ×ÓÒ ÓÔ Ó׺
 ÈÙÒØÓ× ÓÖØ        +≡
      template <class GT, class SA>
  void map_cut_graph(GT & g, DynDlist<typename GT::Node*> & cut_node_list,
                     GT & cut_graph, DynDlist<typename GT::Arc*> & cross_arc_list)
  {
    clear_graph(cut_graph);
        // recorra lista de nodos de corte e ins´rtelos en cut_graph
                                                e
    for (typename DynDlist<typename GT::Node*>::Iterator it(cut_node_list);
         it.has_current(); it.next())
      {
        typename GT::Node * gp = it.get_current();
        auto_ptr<typename GT::Node> tp_auto ( new typename GT::Node(gp) );
        cut_graph.insert_node(tp_auto.get());
        GT::map_nodes(gp, tp_auto.release());
      }
    // recorra arcos de g ==> cut_graph={arcos no corte} cross_arc_list={de cruce}
    for (Arc_Iterator <GT, SA> it(g); it.has_current(); it.next())
      {
        typename GT::Arc * garc = it.get_current_arc();
        if (is_a_cross_arc <GT> (garc))
          {
            cross_arc_list.append(garc);
            continue;
          }
        if (not is_an_cut_arc <GT> (garc))
7.6. Matrices de adyacencia                                                    657



            continue;
          typename GT::Node * src =
            static_cast<typename GT::Node*>(NODE_COOKIE(g.get_src_node(garc)));
          typename GT::Node * tgt =
            static_cast<typename GT::Node*>(NODE_COOKIE(g.get_tgt_node(garc)));
          typename GT::Arc * cut_arc = cut_graph.insert_arc(src, tgt, garc->get_info());
          GT::map_arcs(garc, cut_arc);
      }
  }
Í× × Arc Iterator     Ò   DynDlist   ¿º
      Ð Ö Ó cut graph       × Ò ÓÒ ÜÓ Ý ×Ù× ÓÑÔÓÒ ÒØ × ÔÙ Ò ÐÐ Ö× Ñ ÒØ
build subgraph() ÑÔÐ      ÒØ    Ò ÓÑÔÓÒ ÒØ × Ò ÓÒ ÜÓ× ¿ ´Ü º º½¿ ´Ô Ò ¿ µµ

7.6       Matrices de adyacencia
À ר Ð ÔÖ × ÒØ ¸       ÑÓ× Ö ×Ù ÐØÓ ÙÒ ÒØ         ÑÔÓÖØ ÒØ     ÔÖÓ Ð Ñ × ÓÒ Ð Ø ÔÓ
List Graph<Node, Arc>¸ × Ó Ò Ð ×Ø ×             Ý Ò º
    Ä Ö ÔÖ × ÒØ ÓÒ ÓÒ Ð ×Ø × Ø Ò Ð Ö Ò Ú ÒØ                  Ð Ò Ñ ×ÑÓ ÔÓ ÑÓ×
Ú Ö× Ø ÐÑ ÒØ Ò Ö Ý ×ÙÔÖ Ñ Ö ÒÓ Ó× Ý Ö Ó׺ ÓÒ Ð × Ñ ØÖ ×               Ý Ò ×ØÓ ×
 ÓÒ× Ö Ð Ñ ÒØ Ñ ×           к Ë Ò Ñ Ö Ó¸ Ü ×Ø ÙÒ ÑÔÐ Ó ÓÖÔÙ× Ð Ø ÓÖ           Ö Ó׸
 × ÓÑÓ ÙÒ ÜØ Ò× Ú Ö                  Ö ÙÒר Ò ×       × ÑÔ ÒÓ¸ Ò Ð × Ù Ð × ÔÙ × Ö
ÔÖ Ö Ð Ù× Ö Ð Ñ ØÖ Þ           Ý Ò ÓÑÓ Ö ÔÖ × ÒØ ÓÒ ÙÒ Ö Óº
    ALEPH ÜÔÓÖØ ÐÓ× × Ù ÒØ × Ì           Ú Ò ÙÐ Ó× Ð × Ñ ØÖ ×        Ý Ò
   ½º Map Matrix Graph<GT> ÑÓ Ð Þ ÙÒ Ñ ØÖ Þ              Ý Ò ÑÔÓ             ÙÒ Ö Ó
          Ø ÔÓ GT × Ó ×Ó Ö List Graph<Node, Arc>º ר Ì                ÑÔÐ ÓÑÓ Ó ¹
        ØÓ× Ð × Ð × × Graph Node<Node Type> Ý Graph Arc<Arc Type> ÙØ Ð Þ × Ô Ö
      List Graph<Node, Arc>º
        Ð ×Ó ÙÒ ÒØÖ              Ð Ñ ØÖ Þ Ö ØÓÖÒ ÙÒ Graph Arc<Arc Type> Ý × Ö Ð Þ
       ×Ô ¬ Ò Ó ÐÓ× ÒÓ Ó× Ø ÔÓ Graph Node<Node Type>º ÄÓ× Ú ÐÓÖ × ÔÓ× Ð × ×ÓÒ
      ÙÒ ÔÙÒØ ÖÓ ÙÒ Graph Arc<Arc Type> Ó NULL × ÒÓ Ý Ö Óº
      Map Matrix Graph<GT> ÒÓ ×Ø          ר Ò      Ð ÙÐÓ× × ÑÔÐ Ñ ÒØ ¸ ÓÒר ØÙÝ Ð
      ÔÖ Ñ Ö Ô ×Ó Ô Ö Ó Ø Ò Ö ÙÒ Ñ ØÖ Þ         Ý Ò º
   ¾º Matrix Graph<GT> ÑÓ Ð Þ ÙÒ Ñ ØÖ Þ            Ý Ò        ÙÒ List Graph<Node, Arc>
       ÓÒ ÐÓ× Ø ÔÓ× ×Ó Ó× ÓÑÓ ØÖ ÙØÓ× Ð × Ð × × Graph Node<Node Type> Ý
      Graph Arc<Arc Type>º

   ¿º Ady Mat<GT, Entry> ÑÓ Ð Þ ÙÒ Ñ ØÖ Þ               Ý Ò Ò Ð Ù Ð Ð Ù×Ù Ö Ó
       ×Ô ¬ Ð Ø ÔÓ          ØÓ ÕÙ × × ÓÑÓ ÒØÖ              Ð Ñ ØÖ Þº
    º Bit Mat Graph<GT> Ð Ù Ð ÑÓ Ð Þ ÙÒ Ñ ØÖ Þ              Ý Ò          Ø×º
    Ä × ØÖ × Ð × ÒØ Ö ÓÖ × × ¬Ò Ò Ò Ð Ö ÚÓ tpl matgraph.Hº
658                                                             Cap´
                                                                   ıtulo 7. Grafos



7.6.1    El TAD Map Matrix Graph<GT>
Ð ¬Ò ר Ì      × ×ÔÓÒ Ö          ÙÒ Ö ÔÖ × ÒØ ÓÒ Ñ ØÖ Ð         ÙÒ Ö Ó ×Ô ¬         Ó
ÓÒ Ð Ì List Graph<Node,        Arc>º Ë ×Ô ¬     ÓÑÓ × Ù
Map Matrix Graph<GT>     ≡
       template <class GT, class SA = Default_Show_Arc<GT> >
 class Map_Matrix_Graph
 {
    Ì ÔÓ× ÔÙ Ð Ó× Map Matrix Graph<GT> ´Ò Ú Ö ¬Ò µ
    Å Ñ ÖÓ× ÔÖ Ú Ó× Map Matrix Graph<GT>
    Å Ñ ÖÓ× ÔÙ Ð Ó× Map Matrix Graph<GT>
 };
  ÁÑÔÐ ÒØ ÓÒ Map Matrix Graph<GT>

     Map Matrix Graph<GT> Ñ Ô ÙÒ Ö Ó  Ø ÔÓ List Graph<Node,           Arc>    ÙÒ Ñ ¹
ØÖ Þ      Ý Ò º ÈÓ× Ó× ÓÒרÖÙ ØÓÖ ×
 Å Ñ ÖÓ× ÔÙ Ð Ó× Map Matrix Graph<GT>    ≡          ´ µ
 Map_Matrix_Graph(GT & g);
 Map_Matrix_Graph(Map_Matrix_Graph & mat);
  Ð ÔÖ Ñ Ö ÓÒרÖÙ ØÓÖ ØÓÑ ÙÒ List Graph<Node, Arc> Ø ÔÓ GT Ý ÓÒרÖÙÝ ÙÒ
Ñ ØÖ Þ       Ý Ò Ñ Ô Óº Ð × ÙÒ Ó × Ð ÓÒרÖÙ ØÓÖ ÓÔ º
     ÍÒ Ñ Ó Ò Ð ÒØ             Ö Ó× Ó ÒÓ Ó× Ð List Graph<Node, Arc>no se refleja
 Ò ÙÒ Ñ Ô Ó Map Matrix Graph<GT>º ÆÓ Ó ×Ø ÒØ ¸ ×        ÔÖ ×Ø Ö ×Ô Ð Ù Ó ÓÒ
 Ð Ñ ØÓ Ü ×Ø Ò          Ð List Graph<Node, Arc>¸ Ð Ù Ð          רÖÙ Ö× ×ÔÙ ×
ØÓ Ó Ó ØÓ Map Matrix Graph<GT> ÕÙ Ð ×Ø Ö Ð ÓÒ Óº
       Ð   ×Ó ÙÒ Ð Ñ ÒØÓ Ð Ñ ØÖ Þ × Ö Ð Þ Ñ ÒØ Ð ÓÔ Ö ÓÖ () ´ÒÓ ÓÒ Ð
ÓÔ Ö ÓÖ ØÖ ÓÒ Ð []µº À Ý Ù ØÖÓ ÔÖ × ÒØ ÓÒ ×
    ½º
         Å Ñ ÖÓ× ÔÙ Ð Ó× Map Matrix Graph<GT>       +≡     ´ µ
         inline Node * operator () (const long & i);

       Ê ØÓÖÒ Ð ÔÙÒØ ÓÖ ÙÒ ÒÓ Ó ÓÖÖ ×ÔÓÒ ÒØ            Ð i¹ × Ñ ÒØÖ          Ð Ñ ØÖ Þº
       ÈÓÖ ÑÔÐÓ¸ × Ø Ò ÑÓ× Ð × Ù ÒØ   Ð Ö ÓÒ
        Map_Matrix_Graph<Grafo> m(g);

         ÓÒ g × ÙÒ Ó ØÓ Ø ÔÓ        Grafo   ÖÚ Ó       List Graph<Node, Arc>º       Ò¹
       ØÓÒ ×¸ Ð × Ù ÒØ ÓÔ Ö ÓÒ
        Grafo::Node * p = m(20);

        × Ò Ð ÔÙÒØ ÖÓ ÒÓ Ó p Ð Ú × ÑÓ¹ÔÖ Ñ Ö ÒÓ Ó Ð Ö Óº
  ¾º
        Å Ñ ÖÓ× ÔÙ Ð Ó×     Map Matrix Graph<GT>      +≡    ´   µ
         inline long operator () (Node * node) const;
7.6. Matrices de adyacencia                                                       659



        Ê ØÓÖÒ Ð Ò     Ó ÔÓ× ÓÒ ÒØÖÓ      Ð Ñ ØÖ Þ Ð ÒÓ Ó ÓÒ Ö         ÓÒ nodeº
  ¿º
        Å Ñ ÖÓ× ÔÙ Ð Ó×     Map Matrix Graph<GT>     +≡     ´ µ
         inline Arc * operator () (Node * src_node, Node * tgt_node) const;

        Ê ØÓÖÒ Ð ÔÙÒØ ÓÖ Ö Ó ÒØÖ ÐÓ× ÒÓ Ó× src node Ý tgt nodeº Ë ÒÓ Ü ×Ø Ø Ð
         Ö Ó¸ ÒØÓÒ × × Ö ØÓÖÒ NULLº
    º
        Å Ñ ÖÓ× ÔÙ Ð Ó×     Map Matrix Graph<GT>     +≡     ´ µ             ¼
         inline Arc * operator () (const long & i, const long & j) const;

      Ê ØÓÖÒ Ð ÔÙÒØ ÓÖ Ö Ó ÒØÖ ÐÓ× ÒÓ Ó× ÓÒ Ò × ÒØÖÓ Ð Ñ ØÖ Þ i Ý j¸
      Ö ×Ô Ø Ú Ñ ÒØ º
      ÄÓ× Ò × ÔÙ Ò Ó Ø Ò Ö× ÔÖ Ú Ñ ÒØ Ñ ÒØ Ð ÓÔ Ö ÓÖ (ptr)¸ ÓÒ ptr
       × ÙÒ ÔÙÒØ ÖÓ ÒÓ Óº
    Ä Ö Ø Ö ×Ø Ñ × ÔÖ            ÙÒ Ñ ØÖ Þ      Ý Ò × Ð       ×Ó Ö ØÓ
ÐÓ× ÒÓ Ó× Ý Ö Ó× ÐÓ ÕÙ Ô ÖÑ Ø ÙÒ ÔÖÙ       Ö Ó O(1)º Ò ÒÙ ×ØÖ ÑÔÐ ÒØ ÓÒ
     ÑÓ× × ÙÖ Ö × × ÑÔ ÒÓº × ÔÓÖ ×Ó ÕÙ × Ö ÑÓ× ÒÙ ×ØÖ ÑÔÐ ÒØ ÓÒ Ò Ð
Ø ÔÓ DynArray<T> ÜÔÐ Ó Ü ¾º½º ´Ô Ò ½µº Ò ÔÖ Ñ Ö ÐÙ Ö¸ Ø Ò Ö ÑÓ× ÙÒ ÖÖ ÐÓ
   ÒÓ Ó× ×Ô ¬ Ó Ð × Ù ÒØ Ñ Ò Ö
 Å Ñ ÖÓ× ÔÖ Ú Ó× Map Matrix Graph<GT>    ≡          ´ µ ¼
  DynArray<Node*> nodes;
Í× × DynArray ¾º
      ר ÓÖÑ ¸ ØÓ Ó     ×Ó nodes[i] Ö ØÓÖÒ Ò O(1) Ð ÔÙÒØ ÓÖ ÒÓ Óº ÓÑÓ
Ø Ñ Ò Ù× Ö ÑÓ× ×Ø ר ÐÓ Ò Ð × Ð × × Matrix Graph<GT> Ý Ady Mat<GT, Entry>¸
ÒÓ × ÑÙÝ ÓÒÚ Ò ÒØ Ò Ô×ÙÐ Ö Ð ×Ó Ò ÙÒ ÖÙØ Ò ÔÖ Ú
 ÍØ Ð Ø Ö Ó× Ô Ö Ñ ØÖ ×    Ý Ò         ≡                    ¼
      template <typename GT> inline static
  typename GT::Node * get_node(DynArray<typename GT::Node *> & nodes,
                               const long &                    i)
  {
    return nodes.access(i);
  }
Í× × DynArray ¾º
   nodes × ÙÒ ÖÖ ÐÓ     ÒÓ Ó× i × Ð Ò                  ×Óº ÈÓ ÑÓ׸ Ô٠׸ ÑÔÐ ÒØ Ö
ÒÙ ×ØÖ ÔÖ Ñ Ö Ú Ö× ÓÒ Ð ÓÔ Ö ÓÖ ()
 ÁÑÔÐ ÒØ ÓÒ Map Matrix Graph<GT>    ≡                      ´   µ   ¼
    template <class GT, class SA>
  typename GT::Node * Map_Matrix_Graph<GT, SA>::operator () (const long & i)
  {
    return get_node <GT> (nodes, i);
  }
660                                                                 Cap´
                                                                           ıtulo 7. Grafos



              ØÓ×    Ð ÙÐ Ö ÐÓ Ñ × Ö Ô Ñ ÒØ ÔÓ× Ð Ð Ò ÙÒ ÒÓ Ó Ó ÙÒ ÔÙÒØ ÖÓ¸
    Ð ÖÖ ÐÓ nodes ר Ö ÓÖ Ò Ó ÔÓÖ Ð × Ö ÓÒ × ×Ù× ÔÙÒØ ÖÓ׺     ר ÑÓ Ó¸ Ð
     Ð ÙÐÓ ÙÒ Ò ÔÙ Ö ×ÓÐÚ Ö× Ò Ö Ñ ÒØ Ò O(Ð (n)) Ñ ÒØ Ð Ù×ÕÙ
     ÒÖ
¼   ÍØ Ð Ø Ö Ó× Ô Ö Ñ ØÖ ×        Ý Ò       +≡               ½
          template <typename GT>
      inline static long index_of_node(DynArray<typename GT::Node *> &     nodes,
                                       const long & n, typename GT::Node * p)
      {
        return Aleph::binary_search<typename GT::Node*>(nodes, p, 0, n - 1);
      }
    Í× × binary search ¿¾ Ò   DynArray   ¾º
       nodes × ÙÒ ÖÖ ÐÓ ÓÖ Ò Ó ÔÙÒØ ÖÓ× ÒÓ Ó׸ n × Ð ÒØ                         ÒÓ Ó× Ý p × Ð
    ÔÙÒØ ÓÖ Ù× Öº
      index of node() × Ù×   ÔÓÖ Ð × Ù ÒØ Ú Ö× ÓÒ Ð ÓÔ Ö ÓÖ ()
¼   ÁÑÔÐ ÒØ ÓÒ Map Matrix Graph<GT>      +≡       ´ µ                       ½
          template <class GT, class SA>
      long Map_Matrix_Graph<GT, SA>::operator () (typename GT::Node * node) const
      {
        return index_of_node <GT> (nodes, num_nodes, node);
      }
        ÒØ × ÑÔÐ ÒØ Ö Ð Ö ×ØÓ ÐÓ× Ñ ØÓ Ó× Ð Ð × Map Matrix Graph<GT>¸     ¹
    ÑÓ× ×Ô ¬ Ö Ð Ö ×ØÓ ×Ù× Ñ Ñ ÖÓ× ØÓº Ò ÔÖ Ñ Ö ÐÙ Ö¸ ÔÙ Ö ÕÙ Ö Ö× Ð ÔÖÓÔ Ó
    List Graph<Node, Arc>
¼   Å Ñ ÖÓ× ÔÖ Ú Ó×           Map Matrix Graph<GT>   +≡    ´     µ              ¼
      GT * lgraph;
    Ð ÙÐ × × Ð Ñ                ÒØ
¼   Å Ñ ÖÓ× ÔÙ Ð Ó×     Map Matrix Graph<GT>         +≡    ´     µ              ¼
      GT & get_list_graph() { return *lgraph; }
       Ä ÒØ         ÒÓ Ó× Ð Ö Ó Ó × ¸ Ð Ñ Ò× ÓÒ            Ð Ñ ØÖ Þ¸ Ð ÐÑ Ò Ö ÑÓ× Ò
    ÙÒ Ö Ö Ò
¼    Å Ñ ÖÓ× ÔÖ Ú Ó× Map Matrix Graph<GT>  +≡              ´     µ      ¼       ½
      mutable size_t num_nodes;
    Ð Ù Ð × Ö ÙÒ Ö Ö Ò     Ö Ø Ð List Graph<Node,         Arc>       ÓÒØ Ò Ó Ò lgraphº ר
     ØÖ ÙØÓ × Ó × ÖÚ Ð ØÖ Ú ×
¼    Å Ñ ÖÓ× ÔÙ Ð Ó× Map Matrix Graph<GT>    +≡            ´     µ      ¼       ¾
      const size_t & get_num_nodes() const { return num_nodes; }
        Ä Ñ ØÖ Þ     Ö Ó× Ø Ñ Ò Ð Ö ÔÖ × ÒØ Ö ÑÓ× ÓÒ ÙÒ DynArray<T>     Ñ Ò× ÓÒ
    n×n     ÓÒ n = num nodesº ÆÓ × Ú ×ÐÙÑ Ö ÓØÖ ÐØ ÖÒ Ø Ú ÕÙ ÒÓ Ò ÙÖÖ Ò Ù×ÕÙ
    Ð Ò Ð ÐÓ× Ö Ó× Ò lgraphº
        Ê ÓÖ ÑÓ× ÕÙ Ð ÓÒ×ÙÑÓ Ñ ÑÓÖ            DynArray<T> × ÔÖÓÔÓÖ ÓÒ Ð Ð   ÒØ ¹
             ÒØÖ × ÕÙ × Ý Ò × Ö ØÓº ×ØÓ ÒÓ× ÔÖÓÔÓÖ ÓÒ ÙÒ Ö Ò Ú ÒØ Ò ÓÒÓÑ
         ×Ô Óº À Ö Ò¸ × Ò Ñ Ö Ó¸ Ð ÙÒ × ÒØÖ × ÓÖÖ ×ÔÓÒ ÒØ × NULL ÕÙ × Ò¹
      ÓÒØÖ Ö Ò Ò Ð ÖÖ ÐÓ Ò Ñ Óº ÈÓÖ × Ö ÞÓÒ¸ ÒÓ       ÑÓ× Ð Ö Ö Ö Ø Ñ ÒØ Ð Ó
      ÓÑÓ
     DynArray<Arc*> arcos(n*n);
7.6. Matrices de adyacencia                                                         661



       ÔÙ × Ö ÕÙ × Ö Ö ÜÔÐ Ø Ñ ÒØ ÐÓ× Ö Ó× ÒÓ Ü ×Ø ÒØ × ÓÒ Ð Ú ÐÓÖ NULL¸ ÐÓ
    ÕÙ ÕÙ ÖÖ Ö × Ö Ö Ò Ð × n × n ÒØÖ × Ý Ô Ö Ö Ð Ú ÒØÙ Ð ÓÖÖÓ ×Ô Óº
       È Ö Ô Ð Ö Ð ÔÖÓ Ð Ñ ÒØ Ö ÓÖ¸ Ù× Ö ÑÓ× Ð × Ù ÒØ Ø ÔÓ ÒØ ÖÑ Ó
½    Å Ñ ÖÓ× ÔÖ Ú Ó× Map Matrix Graph<GT>       +≡    ´ µ      ¼ ½
      struct Mat_Entry
      {
        Arc * arc;
        Mat_Entry(Arc * __arc = NULL) : arc(__arc) { /* empty */ }
      };
      × Ô٠׸ Ð × ÒØÖ × ÕÙ ÓÒØ Ò Ò Ñ ÑÓÖ ¸ Ô ÖÓ ÕÙ ÒÓ Ý Ò × Ó × Ö Ø ×¸ ÓÒ¹
    Ø Ò Ö Ò Ð Ú ÐÓÖ NULL ÔÖ Ú Ñ ÒØ × Ò Ó ÔÓÖ Ð ÓÒרÖÙ ØÓÖ ÔÓÖ ÓÑ × ÓÒº Ä Ñ ØÖ Þ
       Ý Ò ×         Ð Ö ¸ ÒØÓÒ ×¸ ÓÑÓ × Ù
½    Å Ñ ÖÓ× ÔÖ Ú Ó× Map Matrix Graph<GT>     +≡          ´ µ       ½
      DynArray<Mat_Entry> mat;
    Í× × DynArray ¾º
       ÈÙ ×ØÓ ÕÙ Ð Ñ ØÖ Þ × ÑÔÐ ÒØ ÓÒ ÙÒ ÖÖ ÐÓ ÙÒ ¹ Ñ Ò× ÓÒ Ð¸ ÔÐ ÒØ ÑÓ× Ð × ¹
    Ù ÒØ ÔÖ Ñ Ø Ú
½   ÍØ Ð Ø Ö Ó× Ô Ö Ñ ØÖ ×   Ý Ò       +≡                 ¼    ½
      inline static long index_array(const long & i, const long & j, const long & n)
        Ä Ù Ð Ö ØÓÖÒ Ð Ò              Ð     ×Ó   (i,j)   ÒØÖÓ   ÙÒ   DynArray<T>   Ù× Ó Ô Ö
     ÑÔÐ ÒØ Ö ÙÒ Ñ ØÖ Þ n*nº
          Ð     ×Ó ÙÒ ÒØÖ             ÙÒ Ñ ØÖ Þ          Ý Ò    × Ö ÐÞ     Ò Ö Ñ ÒØ       Ð
    × Ù ÒØ ÓÖÑ
½    ÍØ Ð Ø Ö Ó× Ô Ö Ñ ØÖ ×           Ý Ò          +≡                        ½
          template <typename Entry>
      inline static Entry * read_matrix(const DynArray<Entry> & mat,
                                        const long & i, const long & j,
                                        const long & n)
      {
        const long index = index_array(i, j, n);
        if (not mat.exist(index))
          return NULL;
        return &const_cast<Entry&>(mat.access(index));
      }
      ¬Ò ×
      read matrix¸   Ù×   Ò ÙÒ   ½º
    Í× × DynArray    ¾º
    Ä ÖÙØ Ò Ð Ð ÒØÖ (i,j) Ò Ð DynArray<T>mat Ø ÔÓ Entry ÕÙ ÑÔÐ ÒØ ÙÒ
    Ñ ØÖ Ü n*nº
         ÓÒ ÐÓ ÒØ Ö ÓÖ ÔÓ ÑÓ× ÑÔÐ ÒØ Ö Ð Ö ×ØÓ ÐÓ× ÓÔ Ö ÓÖ ×     ×Ó
½   ÁÑÔÐ ÒØ ÓÒ Map Matrix Graph<GT>         +≡       ´ µ     ¼ ¾
          template <class GT, class SA>
      typename GT::Arc * Map_Matrix_Graph<GT, SA>::operator () (const long & i,
                                                                const long & j) const
      {
        Mat_Entry * mat_entry = read_matrix<Mat_Entry>(mat, i, j, num_nodes);
        if (mat_entry == NULL)
          return NULL;
662                                                                  Cap´
                                                                                 ıtulo 7. Grafos



                 return mat_entry->arc;
             }
                 template <class GT, class SA>
             typename GT::Arc * Map_Matrix_Graph<GT, SA>::operator () (Node * src_node,
                                                                       Node * tgt_node) const
             {
               Mat_Entry * mat_entry =
                 read_matrix<Mat_Entry>(mat, index_of_node<GT>(nodes, num_nodes, src_node),
                                        index_of_node<GT>(nodes, num_nodes, tgt_node),
                                        num_nodes);
               if (mat_entry == NULL)
                 return NULL;
               return mat_entry->arc;
             }
         Í× × read matrix ½ º
            ÍÒ Ú Þ ¬Ò Ó× ÐÓ× ×Ó׸ ÒÓ× Ö ×Ø ÔÓÖ ¬Ò Ö ÐÓ× ÓÒרÖÙ ØÓÖ × Ý Ð × Ò ÓÒº
         È Ö ÐÐÓ¸ ÒÓ× ÓÒÚ Ò Ð × Ù ÒØ ÖÙØ Ò     ÓÔ
¾         Å Ñ ÖÓ× ÔÙ Ð Ó× Map Matrix Graph<GT>    +≡       ´ µ       ¼
             void copy_list_graph(GT & g);
         Í× × copy list graph ¿ º
         Ð Ù Ð ÓÔ Ö Ó g Ö ÔÖ × ÒØ Ó ÓÒ ÙÒ List Graph<Node, Arc> this¸ Ö ÔÖ × ÒØ Ó
          ÓÒ Map Matrix Graph<GT>º ר ÖÙØ Ò ÒÓ× Ô ÖÑ Ø ÑÙÝ ÓÒ × Ñ ÒØ ÑÔÐ ÒØ Ö ÐÓ×
          ÓÒרÖÙ ØÓÖ × Ý Ð × Ò ÓÒ ÔÓÖ ÑÔÐÓ
¾         ÁÑÔÐ ÒØ ÓÒ Map Matrix Graph<GT>    +≡        ´ µ    ½   ¿
                 template <class GT, class SA>
             Map_Matrix_Graph<GT, SA>::Map_Matrix_Graph(GT & g)
               : lgraph(&g), num_nodes(g.get_num_nodes()) { copy_list_graph(g); }
         Í× × copy list graph ¿ º
             È Ö ÙÐÑ Ò Ö ÓÒ ×Ø Ð × ¸                  ÑÓ× ÒרÖÙÑ ÒØ Ö copy list graph()¸ Ð Ù Ð ×
          Ö Ñ Ø ¸ × Ñ ÒØ ¸ Ó× × ×
            ½º
         ¾       ÓÔ Ö ÒÓ Ó× ¾ ≡                                                 ´ ¿µ
                    int i = 0;
                    for (typename GT::Node_Iterator it(g); it.has_current(); it.next(), ++i)
                      nodes[i] = it.get_current_node();
                    quicksort(nodes); // ordenar nodes de modo que se soporte la b´squeda binaria
                                                                                  u
                  Í× × Node Iterator       Ò   quicksort   ½¿º

    ¾º
         ¾         ÓÔ Ö Ö Ó× ¾         ≡                                        ´ ¿µ
                    for (typename GT::Node_Iterator nit(g); nit.has_current(); nit.next())
                    {
                      Node * src = nit.get_current_node();
                      const long src_idx = index_of_node<GT>(nodes, num_nodes, src);
                          // para cada arco de src escribirlo en la matriz mat
                      for (Node_Arc_Iterator<GT, SA> ait(src); ait.has_current(); ait.next())
                        {
7.6. Matrices de adyacencia                                                        663



                     Arc * arc = ait.get_current_arc();
                     Node * tgt = g.get_connected_node(arc, src);
                     const long tgt_idx = index_of_node<GT>(nodes, num_nodes, tgt);
                     write_matrix<Mat_Entry>(mat, src_idx, tgt_idx, num_nodes, arc);
                 }
             }
         Í× × Node Arc Iterator           Ò   Node Iterator   º

    ÆÓØ ÑÓ× Ð Ù×Ó write matrix()¸ Ð Ù Ð Ò Ö Ñ ÒØ ÒרÖÙÑ ÒØ Ð × Ö ØÙÖ Ò ÙÒ
     ÒØÖ      ÙÒ Ñ ØÖ Þ ÑÔÐ Ñ ÒØ    ÓÒ DynArray<T>º
         ÒØ Ò × Ð × × ×¸ Ð ÓÔ × ×Ø ÒØ × ÑÔÐ
¿   ÁÑÔÐ ÒØ ÓÒ Map Matrix Graph<GT>      +≡          ´ µ     ¾
         template <class GT, class SA>
     void Map_Matrix_Graph<GT, SA>::copy_list_graph(GT & g)
     {      // copiar atributos
       lgraph    = &g;
       num_nodes = g.get_num_nodes();
       nodes.cut(); // limpiar arreglos din´micos de contenidos anteriores
                                           a
       mat.cut();
            ÓÔ Ö ÒÓ Ó× ¾
            ÓÔ Ö Ö Ó× ¾
     }
      ¬Ò ×
     copy list graph¸     Ù×    Ò ÙÒ × ¾ Ò        ¼º

    7.6.2     El TAD Matrix Graph<GT>
     Ð Ì Map Matrix Graph<GT> Ö ÒØ Ñ ÒØ ×ØÙ Ó¸ ×ÓÐÓ × ÖÚ Ô Ö Ó Ø Ò Ö
    ÙÒ Ö ÔÖ × ÒØ ÓÒ Ñ ØÖ Ð Ò ÙÒ ÓÒ Ó ØÓ× Ø ÔÓ Graph Node<Node Type>
    Ý Graph Arc<Arc Type>º ÍÒ ÑÓ ¬ ÓÒ ×Ó Ö ÙÒ ÒØÖ               Ñ ØÖ Ð (i, j)
    Map Matrix Graph<GT> Ö ÙÒ      Ò ÙÒ ÑÓ ¬ ÓÒ Ö Ø ×Ó Ö Ð Ö Ó                Ø ÔÓ
    Graph Arc<Arc Type>º
          Ú × ÐÓ ÕÙ × Ö ÕÙ Ö × ÙÒ Ñ ØÖ Þ ÓÔ       ÙÒ List Graph<Node, Arc> Ó ÙÒ
    Map Matrix Graph<GT> ÕÙ × ÔÙ       ÑÓ ¬ Ö × Ò ÐØ Ö Ö Ð Ö Ó ÓÖ Ò Ð ´ Ò× ×Ø ÑÓ׸
       Ø ÔÓ List Graph<Node, Arc>µº Ð ÔÖÓÔÓ× ØÓ Matrix Graph<GT> ׸ Ô٠׸ Ó Ø Ò Ö
    ÙÒ Ñ ØÖ Þ       Ý Ò ÙÝÓ× ÓÒØ Ò Ó× × Ò ÐÓ× ÓÒØ Ò Ó× ÐÓ× Ö Ó× ÙÒ Ö Ó
    ÓÖ Ò ÐÑ ÒØ Ö ÔÖ × ÒØ Ó ÓÒ List Graph<Node, Arc>º
        Matrix Graph<GT> ×    ¬Ò ÔÓÖ Ð × Ù ÒØ Ð ×
¿   Matrix Graph<GT> ¿ ≡
         template <typename GT, class SA = Default_Show_Arc<GT> >
     class Matrix_Graph
     {
        Å Ñ ÖÓ× ÔÖ Ú Ó× Matrix Graph<GT>
        Å Ñ ÖÓ× ÔÙ Ð Ó× Matrix Graph<GT>
     };
      ¬Ò ×
     Matrix Graph¸   Ù×        Ò ÙÒ   º
664                                                              Cap´
                                                                    ıtulo 7. Grafos



   Ä      Ö Ò ÙÒ Ñ ÒØ Ð ÓÒ Map Matrix Graph<GT> × ÕÙ Matrix Graph<GT> ×
ÙÒ Ñ ØÖ Þ Ò Ô Ò ÒØ Ð List Graph<Node, Arc> ÓÖ Ò Ð¸ ×Ó Ö Ð Ù Ð × ÔÙ Ò
Ö Ð Þ Ö ÑÓ ¬ ÓÒ × Ø ÒØÓ ÐÓ× Ú ÐÓÖ × ÐÓ× ÒÓ Ó× ÓÑÓ ÐÓ× ÐÓ× Ö Ó׺ ÆÓ × ÔÓ× Ð
Ó Ø Ò Ö Ð List Graph<Node, Arc> Ô ÖØ Ö ÙÒ Ó ØÓ Ø ÔÓ Matrix Graph<GT>º
   Matrix Graph<GT>      Ù× Ö× ÔÓÖ ÕÙ ÐÐ × ÔÐ ÓÒ × ÕÙ ×ÓÐÓ × Ò ØÖ      Ö ÓÒ
Ñ ØÖ ×       Ý Ò º
   ÄÓ× ØÖ ÙØÓ× Matrix Graph<GT> ×ÓÒ ÑÙÝ × Ñ Ð Ö × ÐÓ× Map Matrix Graph<GT>
 Å Ñ ÖÓ× ÔÖ Ú Ó× Matrix Graph<GT>        ≡           ´ ¿ µ
    DynArray<Node_Type> nodes;
    DynArray<Arc_Type> arcs;
    mutable size_t      n;
Í× × arcs ¾        Ò   DynArray   ¾º
n   ×Ð   ÒØ       ÒÓ Ó× Ð Ö Ó Ó × ¸ Ð Ñ Ò× ÓÒ Ð Ñ ØÖ Þ Ý Ð ÖÖ ÐÓ ÒÓ Ó׺
     Ð ×Ó ÙÒ ÒØÖ (i) ÙÒ Ó ØÓ Matrix Graph<GT> Ö ØÓÖÒ ÙÒ Ó ØÓ Ø ÔÓ
typename GT::Node Typeº Ò ÐÓ Ñ ÒØ ¸ Ð       ×Ó ÙÒ ÒØÖ (i, j) Ö ØÓÖÒ ÙÒ Ó ØÓ
   Ø ÔÓ typename GT::Arc Typeº
     ÓÒ Ð Ñ ØÖ Þ arcs¸ × ÒÓ× ÔÐ ÒØ ÙÒ Ô ÕÙ ÒÓ Ò ÓÒÚ Ò ÒØ Ô Ö ÓÖÖ Ö Ð ×Ô Ó
Ó ÙÔ Ó ÔÓÖ Ð × ÒØÖ × ÒÙÐ × × Ö¸ ÔÓÖ Ð × ÒØÖ × Ò Ð × Ù Ð × ÒÓ Ý Ò Ö Ó׺
È Ö ÐÐÓ¸ ÒÓ× × ÖÚ Ö ÑÓ× Ð × Ù ÒØ ØÖ ÙØÓ       ÓÒ Ð
 Å Ñ ÖÓ× ÔÖ Ú Ó× Matrix Graph<GT>        +≡        ´ ¿ µ
    mutable Arc_Type Null_Value;
    ¬Ò ×
    Null Value¸   Ù×   Ò ÙÒ ×          ß º
  Ð Ù Ð Ö ÔÖ × ÒØ ÐÓ ÕÙ × ÓÒ× Ö Ð Ù× Ò                Ö Óº ר Ú ÐÓÖ ×Ô      Ð ÔÙ
Ó × ÖÚ Ö× Ñ ÒØ
 Å Ñ ÖÓ× ÔÙ Ð Ó× Matrix Graph<GT>  ≡                        ´ ¿ µ
    const Arc_Type & null_value() const { return Null_Value; }
Í× × Null Value         º
   Ë Ð ×Ó (i, j) ÙÒ Matrix Graph<GT> Ö ØÓÖÒ Null value¸ ÒØÓÒ × ÒÓ Ü ×Ø Ö Ó
ÒØÖ Ð ÒÓ Ó i Ý jº Ì ÒØÓ Ð ÓÒרÖÙ ÓÒ ÓÑÓ Ð × Ò ÓÒ × ÔÓÝ Ò Ò ÙÒ ÖÙØ Ò
ÓÑÙÒ ÐÐ Ñ copy()¸ Ð Ù Ð × ×Ó Ö Ö Ò Ó× Ú Ö× ÓÒ ×
Å Ñ ÖÓ× ÔÖ Ú Ó× Matrix Graph<GT>      +≡            ´ ¿ µ
    void copy(Matrix_Graph & mat)
    {
      n          = mat.n;               // copiar atributos
      Null_Value = mat.Null_value;
      nodes.cut();                      // limpiar memoria de arreglos din´micos
                                                                          a
      arcs.cut();
      arcs.set_default_initial_value(Null_Value);
      for (int i = 0; i < n; ++i) // recorrer mat[i,j] y copiarla a nodes[], arcs[]
        {
          nodes[i] = mat.nodes[i];
          for (int j = 0; j < n; ++j)
            {
              const long mat_index = index_array(i, j, n);
              if (not arcs.exist(mat_index))
                continue;
              arcs.touch(mat_index) = mat.arcs.access(mat_index);
7.6. Matrices de adyacencia                                                                 665



             }
        }
  }
  void copy(GT & g)
  {
    n = g.get_num_nodes();
    DynArray<typename GT::Node *> ptr; // arreglo temporal
    int i = 0;
    for (typename GT::Node_Iterator it(g); it.has_current(); it.next(), ++i)
      ptr[i] = it.get_current_node();
    quicksort(ptr); // ordenar por si se requiere relaci´n con Map_Matrix_Graph
                                                         o
    arcs.set_default_initial_value(Null_Value);
    for (i = 0; i < n; ++i) // coloca contenidos de ptr[] en nodes[]
      {
        typename GT::Node * src = ptr[i];
        nodes[i] = src->get_info();
        for (Node_Arc_Iterator<GT, SA> it(src); it.has_current(); it.next())
          {
            typename GT::Arc * arc = it.get_current_arc();
            typename GT::Node * tgt = it.get_tgt_node();
            const long j = index_of_node<GT>(ptr, n, tgt);
            const long mat_index = index_array(i, j, n);
            arcs[mat_index] = arc->get_info();
          }
      }
  }
Í× × arcs ¾ ¸    DynArray ¾¸ Matrix Graph   ¿ ¸   Node Arc Iterator   ¸ Node Iterator   ¸
  Null Value       ¸ Ò quicksort ½ ¿ º
     ÄÓ× ×Ó× ÐÓ× Ð Ñ ÒØÓ× Ð Ñ ØÖ Þ × Ö Ð Þ Ò Ñ ÒØ Ð ÓÔ Ö ÓÖ () Ñ Ò Ö
× Ñ Ð Ö Ð Ø ÔÓ ×ØÙ Ó Ò Ü º º½ ´Ô Ò       µº Ò Ð       ×Ó ÙÒ ÒØÖ Ñ ØÖ Ð
(i, j) × Ö Ð Þ Ð   ר Ò ÓÒ ÒØÖ ÙÒ Ð ØÙÖ Ý × Ö ØÙÖ º ÁÐÙ×ØÖ ÑÓ× Ð Ñ Ò Ö Ò ÕÙ
× Ñ Ò Ð Ñ ÑÓÖ ÓÒ Ð ÖÖ ÐÓ Ò Ñ Ó Ý ÐÓ× Ú ÐÓÖ × ÒÙÐÓ× Ñ ÒØ Ð × Ù ÒØ
ÓÔ Ö ÓÖ          ×Ó ÙÒ Ñ ØÖ Þ ÓÒר ÒØ
 Å Ñ ÖÓ× ÔÙ Ð Ó× Matrix Graph<GT>      +≡              ´ ¿ µ
  const Arc_Type & operator () (const long & i, const long & j) const
  {
    const long mat_index = index_array(i, j, n);
    if (not arcs.exist(mat_index)) // ¿Existe entrada?
      return Null_Value; // No ==> no hay arco
    return arcs.access(mat_index);
  }
Í× × arcs ¾      Ò   Null Value   º

7.6.3       El TAD Ady Mat<GT, Entry>
  Ò ÑÙ × Ö ÙÒר Ò × × Ö ÕÙ Ö ÙÒ Ñ ØÖ Þ ÓÑÓÑÓÖ ÙÒ             Ý Ò ÕÙ ÓÒ¹
Ø Ò Ú ÐÓÖ × ×Ø ÒØÓ× Ý¸ ÑÙÝ ÔÖÓ Ð Ñ ÒØ ¸ Ø ÔÓ× Ö ÒØ × ÐÓ× Ð Ö Óº ÈÓÖ Ñ¹
ÔÐÓ¸ ÔÙ Ö Ò × Ø Ö× ÙÒ Ñ ØÖ Þ ÓÒØ ÒØ Ú       ÙÖ ÓÒ × ØÖ Ý ØÓ× ÒØÖ Ö Ó׺
    È Ö Ð × ØÙ ÓÒ ÒØ Ö ÓÖ × Ø Ò Ð Ø ÔÓ Ady Mat<GT, Entry>¸ Ð Ù Ð ÑÓ Ð Þ ÙÒ
Ñ ØÖ Þ Ð Ñ ÒØÓ× Ø ÔÓ Entry Type Ý ×Ô ¬          Ð × Ù ÒØ ÓÖÑ
666                                                              Cap´
                                                                    ıtulo 7. Grafos



Ady Mat<GT, Entry>     ≡
     template <class GT, typename __Entry_Type, class SA = Default_Show_Arc<GT> >
 class Ady_Mat
 {
    Å Ñ ÖÓ× ÔÖ Ú Ó× Ady Mat<GT, Entry>
    Å Ñ ÖÓ× ÔÙ Ð Ó× Ady Mat<GT, Entry>
 };
  ÁÑÔÐ ÒØ ÓÒ Ñ ØÓ Ó× Ady Mat<GT, Entry>
  ¬Ò ×
  Ady Mat¸   Ù×   Ò ÙÒ ×        ß      Ò       ¾½ß¾¿º
   Ady Mat<GT, Entry>                      ר Ö ×ØÖ Ø Ñ ÒØ Ð
                                              Ó ÙÒ Ó ØÓ List Graph<Node, Arc>º
  Ð ÔÙÒØÓ × Ò Ð Ò Ð Ð × Ady Mat<GT, Entry> ר     Ó ÔÓÖ Ð   Ó ÕÙ Ð Ù×Ù Ö Ó
ÔÙ          Ö Ð Ø ÔÓ   ØÓ× ÕÙ Ð Ö Ö Ò Ð × ÒØÖ × Ð Ñ ØÖ Þº ÓÒ× Ù ÒØ Ñ ÒØ ¸
Ady Mat<GT, Entry> ÒÓ Ò × Ö Ñ ÒØ Ö ÔÖ × ÒØ ÙÒ Ñ ØÖ Þ       Ý Ò º
     ÄÓ× ØÖ ÙØÓ× Ady Mat<GT, Entry> ×ÓÒ ÑÙÝ × Ñ Ð Ö × ÐÓ× Ð × Ñ ØÖ × ÒØ ¹
Ö ÓÖ ×
 Å Ñ ÖÓ× ÔÖ Ú Ó× Ady Mat<GT, Entry>       ≡               ´ µ
  GT *                          lgraph;
  DynArray<Node*>               nodes;
  DynArray<Entry_Type>          mat;
  mutable size_t                num_nodes;
  mutable Entry_Type            Null_Value;
Í× × DynArray ¾ Ò         Null Value       º
ÄÓ× ×Ó× ÙÒ Ó ØÓ Ady Mat<GT, Entry> ×ÓÒ × Ñ Ð Ö × ÐÓ× Map Matrix Graph<GT>º
ÄÓ× ÒÓ Ó× ÔÙ Ò Ö Ö Ö× ÔÓÖ ÔÙÒØ ÖÓ× ÒÓ Ó× Ò ÙÒ List Graph<Node, Arc> Ó ÔÓÖ
×Ù× Ò × ÒØ ÖÓ× Ö ×Ô ØÓ Ð Ñ ØÖ Þº
     Ð ÓÒ×ÙÑÓ Ñ ÑÓÖ          Ð Ñ ØÖ Þ × ÔÖÓÔÓÖ ÓÒ Ð Ð ÒØ       ÒØÖ × ÕÙ
   Ý Ò × Ó × Ö Ø ×º ÍÒ ÒØÖ (i, j) ÕÙ ÒÓ Ý × Ó × Ö Ø ÔÙ Ö ØÓÖÒ Ö false
 Ù Ò Ó × ÒÚÓÕÙ mat.exist(index)º × ÔÓÖ ×Ø Ñ Ó ÕÙ × Ø Ø × Ð ÒØÖ
 × ÒÙÐ º
     Ð Ö ×ØÓ ÐÓ× ØÖ ÙØÓ× ×ÓÒ Ó × ÖÚ Ð ×
 Å Ñ ÖÓ× ÔÙ Ð Ó× Ady Mat<GT, Entry>        ≡         ´ µ
  GT & get_list_graph() { return *lgraph; }
  const Entry_Type & null_value() const { return Null_Value; }
  const size_t & get_num_nodes() const { return num_nodes; }
Í× × Null Value       º
 Ð Ù×Ó Null Value × Ð Ñ ×ÑÓ ÕÙ Ð Ð Ð × Matrix Graph<GT> ¬Ò Ö Ð ÖÓ
 Ò Ð Ñ ØÖ Þ Ý Ô ÖÑ Ø Ö ÙÒ ÓÖÖÓ ×Ô Ó ÔÓÖ ÐÓ× Ö Ó× Ù× ÒØ ׺
    ÈÙ ×ØÓ ÕÙ Ð Ø ÔÓ        ØÓ ÕÙ ÓÒØ Ò Ð Ñ ØÖ Þ × Ò Ô Ò ÒØ Ð Ó ØÓ
List Graph<Node, Arc>¸ ÒÓ Ý Ò ×         Ó ÙÔ Ö ×Ô Ó ÔÖ ÓÖ Ô Ö Ð ÓÒØ Ò Ó
   Ð Ñ ØÖ Þº ÈÓÖ ×Ó Ø Ò × ÒØ Ó Ð × Ù ÒØ ÓÒרÖÙ ØÓÖ
 Å Ñ ÖÓ× ÔÙ Ð Ó× Ady Mat<GT, Entry>     +≡      ´ µ
  Ady_Mat(GT & g) : lgraph(&g), num_nodes(lgraph->get_num_nodes()) { copy_nodes(g); }
Í× × Ady Mat      º
 Ò ×Ø ×Ó Ð Ñ ØÖ Þ ÒÓ Ó ÙÔ Ñ ÑÓÖ Ò ÐÑ ÒØ ר × Ô ÖØ Ö Ñ          ÕÙ Ð ×
 ÒØÖ × × Ú Ý Ò × Ö Ò Óº Ë Ò Ñ Ö Ó¸ × × ÓÔØ ÔÓÖ ÓÒרÖÙ Ö   ר ÓÖÑ ÙÒ
Ó ØÓ Ady Mat<GT, Entry>¸ ÒØÓÒ × Ð Ù×Ù Ö Ó ¸ Ð Ñ ×ÑÓ¸ Ò Ö Ö×     ×Ö Ö
7.6. Matrices de adyacencia                                                   667



ØÓ × Ð × ÒØÖ × Ð Ñ ØÖ Þ ´ ØÖ Ú × Ð ÓÔ Ö ÓÖ (i, j)µ¸ ÔÙ × Ð Ú ÐÓÖ Null Value
ÒÓ ×      ¬Ò Ó Ó¸ ¬Ò Ö Null Value ÒØ × Ö Ð Þ Ö Ù ÐÕÙ Ö × Ö ØÙÖ º Ð Ì ÒÓ
Ú Ö ¬ ר ÓÖ Òº
    À Ý Ó× Ñ Ò Ö ×     ÓÖÖ Ö Ñ ÑÓÖ ÔÓÖ Ù× Ò       Ö Ó× Ó ÔÓÖÕÙ Ð ÔÐ ÓÒ
Ñ Ò Ð ÙÒ Ð Ñ ÒØÓ ÒÙÐÓ¸ Ð ÔÖ Ñ Ö ÓÒ× ×Ø Ò ¬Ò Ö Null Value Ò Ø ÑÔÓ
 ÓÒרÖÙ ÓÒ Ñ ÒØ
 Å Ñ ÖÓ× ÔÙ Ð Ó× Ady Mat<GT, Entry>    +≡     ´ µ
  Ady_Mat(GT & g, const Entry_Type & null)
    : lgraph(&g), num_nodes(lgraph->get_num_nodes()), Null_Value(null)
  { copy_nodes(*lgraph); }
Í× × Ady Mat      Ò       Null Value   º
 Ò ×Ø ×Ó¸ Entry Type      × Ö Ð Ñ ×ÑÓ Ø ÔÓ ÕÙ GT::Arc Typeº ÍÒ ÖÖÓÖ ÓÑÔ ¹
Ð ÓÒ        Ò Ö Ö× × ÒÓ × × º Ä × ÙÒ Ñ Ò Ö × Ñ ÒØ Ð × Ù ÒØ ÔÖ Ñ Ø Ú
 Å Ñ ÖÓ× ÔÙ Ð Ó× Ady Mat<GT, Entry>      +≡     ´ µ
  void set_null_value(const Entry_Type & null) { Null_Value = null; }
Í× × Null Value       º
      Ð Ø ÔÓ Ady Mat<GT, Entry> ר ר Ò Ó Ô Ö Ù Ö Ö ØÓ×      Ù ÐÕÙ Ö Ø ÔÓ
×Ó Ö ØÓ Ó Ô Ö Ð ÙÐÓ× Ø ÑÔÓÖ Ð × Ö ÕÙ Ö Ó× ÔÓÖ Ð ÓÖ ØÑÓ×    Ö Ó× × Ò Ó×
Ô Ö Ñ ØÖ ×           Ý Ò º ÓÑÓ Ø Ð¸ × ÑÙÝ ÓÑÙÒ Ò Ð Þ Ö Ñ ØÖ × Ø ÔÓ
Ady Mat<GT, Entry>º È Ö ×Ø Ø Ö ¸ × ÔÖÓÚ Ò Ó× Ð × ×    ÒØ Ö ×
   ½º
        Å Ñ ÖÓ× ÔÙ Ð Ó× Ady Mat<GT, Entry>   +≡    ´ µ
        template <class Operation> void operate_all_arcs_list_graph();
      Í× × operate all arcs list graph     º

 ר ÔÖ Ñ Ø Ú      ÙØ Ð ÓÔ Ö ÓÒ Operation() ×Ó Ö        ÒØÖ     Ð Ñ ØÖ Þ ÕÙ
 ÓÒØ Ò ÙÒ Ö Ó Ò List Graph<Node, Arc>º
ÆÓØ ÑÓ× ÕÙ Ð ÓÔ Ö ÓÒ ÒÓ × ÒÚÓ Ô Ö Ö Ó× Ù× ÒØ ׺
 Ð ÓÖÑ ØÓ Ð Ð × Operation() × Operation()(mat, arc, i, j, entry)¸ ÙÝÓ×
Ô Ö Ñ ØÖÓ× × × Ö Ò ×
      ´ µ mat × ÙÒ Ö Ö Ò Ð Ó ØÓ Ady Mat<GT, Entry> ×Ó Ö Ð Ù Ð × ×Ø
          Ö Ð Þ Ò Ó Ð ÓÔ Ö ÓÒº
      ´ µ arc × ÙÒ ÔÙÒØ ÓÖ Ð Ö Ó ÒØÖÓ Ð List Graph<Node, Arc> ×Ó Ó
          Ð Ñ ØÖ Þº
      ´µi × Ð Ò          Ð ÒÓ Ó ÓÖ Ò Ò Ð Ñ ØÖ Þº
      ´µj × Ð Ò          Ð ÒÓ Ó ×Ø ÒÓ Ò Ð Ñ ØÖ Þº
      ´ µ entry × ÙÒ Ö Ö Ò Ð ÓÒØ Ò Ó Ð ÒØÖ (i, j) Ò Ð Ñ ØÖ Þº
 Ú ÒØÙ ÐÑ ÒØ ¸ × × Ö ÕÙ Ö ØÖ Ò×Ñ Ø Ö Ð ÙÒ Ô Ö Ñ ØÖÓ ÓÒ Ð Ð ÓÔ Ö ÓÒ¸ ÒØÓÒ ×
ÔÙ Ù× Ö× Ð × Ù ÒØ Ú Ö× ÓÒ
      Å Ñ ÖÓ× ÔÙ Ð Ó× Ady Mat<GT, Entry>         +≡  ´ µ
        template <class Operation> void operate_all_arcs_list_graph(void * ptr);
      Í× × operate all arcs list graph     º
668                                                            Cap´
                                                                    ıtulo 7. Grafos



  Ä Ù Ð ÒÚÓ Operation()(mat, arc, i, j, entry, ptr)º
    ÓÑÓ ÑÔÐÓ¸ ÓÒ× Ö ÑÓ× Ò Ð Þ Ö ÙÒ Ñ ØÖ Þ ÓÒ ÐÓ× Ú ÐÓÖ ×   ר Ò × Ù Ö Ó×
   Ò       Ö Óº ËÙÔÓÒ Ò Ó ÕÙ Ð ×Ø Ò    ÙÒ Ö Ó × × Ð Ñ ÒØ ÙÒ Ñ ØÓ Ó Ð
   Ö Ó ÐÐ Ñ Ó get distance()¸ Ð Ò Ð Þ ÓÒ ÙÒ Ö Ó Ò Ð Ñ ØÖ Þ ÔÙ ×Ô ¬ Ö×
      ר ÑÓ Ó
        struct Init_Arc
        {
           void operator () (AdyMat<Grafo) & mat, Grafo::Arc * arc, int & i, int & j, Entry & entry)
           {
             entry = arc->get_distance();
           }
        };

        ר ÑÓ Ó¸ ÔÙ Ò Ò         Ö× ØÓ × Ð × ÒØÖ   ×Ñ   ÒØ
          mat.operate_all_arcs_list_graph <Init_Arc> ();

   ÈÙ ×ØÓ ÕÙ ×ÓÐÓ × Ò Ð Þ Ò ÒØÖ × Ô Ö Ö Ó× ÒØÖÓ Ð List Graph<Node,               Arc>
    ×Ó Ó¸ ÕÙ ÐÐ × ÒØÖ × Ò ÓÒ ÒÓ Ý Ö Ó ÓÒØ Ò Ò Ð Ú ÐÓÖ Null Valueº
¾º Ä × ÙÒ ÒØ Ö Þ ×Ø ×         Ò Ò × Ady Mat<GT, Entry>
         Å Ñ ÖÓ× ÔÙ Ð Ó× Ady Mat<GT, Entry> +≡    ´ µ
          template <class Operation> void operate_all_arcs_matrix();
          template <class Operation> void operate_all_arcs_matrix(void * ptr);
        Í× × operate all arcs matrix   º

    Ð ×ÕÙ Ñ × × Ñ Ð Ö Ð ÒØ Ö ÓÖ¸ × ÐÚÓ ÕÙ ¸ Ò ×Ø ×Ó¸ × Ö ÓÖÖ Ò ØÓ × Ð × ÒØÖ × Ý¸
  ÔÓÖ Ø ÒØÓ¸ × Ô ÖØ Ð Ñ ÑÓÖ Ô Ö ØÓ ׺ ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð ÓÒ×ÙÑÓ ×Ô Ó ×
  O(n2)º
    Ð ×ÕÙ Ñ Ô Ö Ñ ØÖÓ× Ð Ð × Operation() × Ð × Ù ÒØ
         ´ µ mat Ö Ö Ò      Ð Ñ ØÖ Þº
         ´ µ src node ÔÙÒØ ÖÓ Ð ÒÓ Ó ÓÖ Ò ÒØÖÓ Ð List Graph<Node, Arc> ×Ó¹
                 Óº
         ´ µ tgt node ÔÙÒØ ÖÓ Ð ÒÓ Ó ×Ø ÒÓ ÒØÖÓ Ð List Graph<Node, Arc> ×Ó¹
                 Óº
         ´µs Ò         Ð ÒÓ Ó ÓÖ Òº
         ´µt Ò         Ð ÒÓ Ó ×Ø ÒÓº
         ´ µ entry Ö Ö Ò        ÒØÖ     ÒØÖÓ Ð Ñ ØÖ Þº
         ´ µ ptr ´ÓÔ ÓÒ Ð × ÙÒ Ð ÒØ Ö Þµ ÔÙÒØ ÖÓ ÓÔ Óº
       Ð Ö¬       Ð ÒØ Ö Þ¸ ÔÓ ÑÓ× ÑÓ×ØÖ Ö Ð ÙÒ × Ð × ÑÔÐ Ñ ÒØ ÓÒ × ÐÓ×
  Ñ ØÓ Ó× ÒØ Ö ÓÖ ×
   ÁÑÔÐ ÒØ ÓÒ Ñ ØÓ Ó× Ady Mat<GT, Entry>           ≡            ´ µ
       template <class GT, typename __Entry_Type, class SA>
       template <class Operation>
   void Ady_Mat<GT, __Entry_Type, SA>::operate_all_arcs_list_graph()
7.6. Matrices de adyacencia                                                       669



  {        // recorrer todos los nodos del grafo
      for (typename GT::Node_Iterator nit(*lgraph); nit.has_current(); nit.next())
        {
          Node * src = nit.get_current_node();
          const long src_idx = index_of_node<List_Graph_Type>(nodes, num_nodes, src);
              // recorrer todos los arcos del nodo origen
          for (Node_Arc_Iterator<GT, SA> at(src); at.has_current(); at.next())
            {
              Arc * arc = at.get_current_arc();
              const long tgt_idx = index_of_node<List_Graph_Type>(nodes, num_nodes,
                                                                  arc->get_tgt_node());
              Entry_Type & entry = mat.touch(index_array(src_idx, tgt_idx, num_nodes));
              Operation () (*this, arc, src_idx, tgt_idx, entry);
            }
        }
  }
      template <class GT, typename __Entry_Type, class SA>
      template <class Operation>
  void Ady_Mat<GT, __Entry_Type, SA>::operate_all_arcs_matrix()
  {
    const long & n = num_nodes;
    for (int s = 0; s < n; ++s)
      {
        Node * src_node = get_node<GT>(nodes, s);
        for (int t = 0; t < n; ++t)
          {
            Node * tgt_node = get_node<GT>(nodes, t);
            Entry_Type & entry = mat.touch(index_array(s, t, num_nodes));
            Operation () (*this, src_node, tgt_node, s, t, entry);
          }
      }
  }
  ¬Ò ×
  operate all arcs list graph¸ Ù×     Ò ÙÒ       º
  operate all arcs matrix¸ Ù×   Ò     ÙÒ ×       Ò   ¾¿ º
Í× × Ady Mat    ¸ Node Arc Iterator       ¸ Ò   Node Iterator     º

7.6.4    El TAD Bit Mat Graph<GT>
Ä ÙÐØ Ñ Ð × Ñ ØÖ Þ × ÒÓÑ Ò Bit Mat Graph<GT> Ý Ö ÔÖ × ÒØ ÙÒ ÑÙÝ × ÑÔÐ
Ñ ØÖ Þ       Ý Ò         Ø×º ÍÒ Ú ÐÓÖ ÙÒÓ Ò ÔÖ × Ò   Ö Ó ÙÒÓ ÒÙÐÓ¸ Ù× Ò¹
   º ÈÓÖ ×ÙÔÙ ×ØÓ¸ Ð Ø ÔÓ Ò Ù ×Ø ÓÒ ×Ø × Ó Ò Ð Ì BitArray × ÖÖÓÐÐ Ó
 Ò Ü ¾º½º¿ ´Ô Ò ¿ µ Ý × ¬Ò Ð × Ù ÒØ Ñ Ò Ö
 Å ØÓ Ó× ÔÖ Ú Ó× Bit Mat Graph<GT>        ≡        ´ µ ¼
  BitArray bit_array;
Í× × BitArray ¿ º
Å ÒØÖ × ÕÙ Ð Bit Mat Graph<GT> × ×Ô ¬ Ñ                         ÒØ Ð × Ù ÒØ Ð ×
Bit Mat Graph<GT>     ≡
     template <class GT, class SA = Default_Show_Arc<GT> >
 class Bit_Mat_Graph
670                                                           Cap´
                                                                     ıtulo 7. Grafos



      {
           Å ØÓ Ó× ÔÖ Ú Ó×        Bit Mat Graph<GT>
           Å ØÓ Ó× ÔÙ Ð Ó×       Bit Mat Graph<GT>      ¼
      };
      ¬Ò ×
      Bit Mat Graph¸   Ù×   Ò ÙÒ × ¼ ¸ ¾¸ Ò        ¿º
       ÍÒ Bit Mat Graph<GT> Ö ÔÖ × ÒØ ÙÒ Ñ ØÖ Þ          Ý Ò ¸ ÙÝÓ× Ø× ×ÓÐÓ
     ÜÔÖ × Ò ÔÖ × Ò Ó Ù× Ò           Ö Ó ÒØÖÓ       ÙÒ Ö Ó Ö ÔÖ × ÒØ Ò Ó ÓÒ ÙÒ
    List Graph<Node, Arc>º Bit Mat Graph<GT> ÒÓ × ÖÚ Ô Ö Ñ Ò Ö ÑÙÐØ Ö Ó× Ó ÑÙй
    Ø Ö Ó׺
       Bit Mat Graph<GT> Ñ ÒØ Ò ÙÒ ÔÙÒØ ÓÖ Ð List Graph<Node, Arc> ×Ó        Ó¸
    ÙÒ ÖÖ ÐÓ Ò Ñ Ó ÒÓ Ó× ÕÙ Ô ÖÑ Ø Ö Ð ÙÐ Ö Ö Ô Ñ ÒØ Ð Ò Ñ ÒØ Ð
     Ù×ÕÙ      Ò Ö Ý Ð ÒØ         ÒÓ Ó×
¼    Å ØÓ Ó× ÔÖ Ú Ó× Bit Mat Graph<GT>    +≡              ´  µ
      GT *                         lgraph;
      DynArray<typename GT::Node*> nodes;
      mutable size_t               n;
    Í× × DynArray ¾º
      À Ý Ú Ö × Ñ Ò Ö × ÓÒרÖÙ Ö ÙÒ Bit Mat Graph<GT>
¼   Å ØÓ Ó× ÔÙ Ð Ó× Bit Mat Graph<GT> ¼ ≡                    ´    µ   ¼
      Bit_Mat_Graph() : lgraph(NULL) { /* empty */ }
      Bit_Mat_Graph(GT & g) : lgraph(&g) { copy_list_graph(g); }
      Bit_Mat_Graph(const Bit_Mat_Graph & bitmat)
        : bit_array(bitmat.bit_array), lgraph(bitmat.lgraph),
          nodes(bitmat.nodes), n(bitmat.n) { /* empty */ }
      Bit_Mat_Graph(const size_t & dim)
        : bit_array(dim*dim), lgraph(NULL), nodes(dim), n(dim) { /* empty */ }
    Í× × Bit Mat Graph       Ò   copy list graph   ¿º
    Ð Ù ÖØÓ ÓÒרÖÙ ØÓÖ ÒÓ Ö ÕÙ Ö ÙÒ List Graph<Node, Arc> ÔÓÖÕÙ ×Ø ר Ò Ó Ô Ö
      Ð Ö Ö Ñ ØÖ ×      Ø× Ù× Ö× Ô Ö Ð ÙÐÓ× Ô Ö Ð ×º רӏ ÔÓÖ ×ÙÔÙ ×ØÓ¸ ÑÔ Ð
       ×Ó ÔÓÖ Ö ÓÒ × ÒÓ Ó× Ò ÙÒ List Graph<Node, Arc>º
        Ú ÒØÙ ÐÑ ÒØ ¸ × ÔÙ      ×Ô ¬ Ö Ð List Graph<Node, Arc> ÔÓÖ × Ô Ö Ó¸ ×
    ÓÑÓ Ø Ñ Ò ÓÒ×ÙÐØ ÖÐÓ
¼   Å ØÓ Ó× ÔÙ Ð Ó× Bit Mat Graph<GT> ¼ +≡           ´  µ    ¼   ¼
      void set_list_graph(GT & g)
      {
        lgraph = &g;
        copy_list_graph(g);
      }
      GT * get_list_graph() { return lgraph; }
      ¬Ò ×
      set list graph¸ Ù×    Ò ÙÒ      ¿ º
    Í× × copy list graph    ¿º

         Ò ÐÑ ÒØ ¸  ÑÓ× ÑÔÐ ÒØ Ö Ð × Ù ØÖÓ ÓÖÑ ×       ×Ó¸ Ó× Ð × Ù Ð × ÔÙ Ò
    ÒרÖÙÑ ÒØ Ö× Ö Ø Ñ ÒØ      ÓÖÑ × Ñ Ð Ö Ð × Ð × × Ñ ØÖ × ÕÙ Ý ÑÓ× ØÖ Ø Ó
¼   Å ØÓ Ó× ÔÙ Ð Ó× Bit Mat Graph<GT> ¼ +≡               ´   µ  ¼
      Node * operator () (const long & i)
7.6. Matrices de adyacencia                                                         671



  {
    return Aleph::get_node<GT>(nodes, i);
  }
  long operator () (Node * node) const
  {
    return index_of_node<GT>(nodes, n, node);
  }
     Ä ÑÔÐ ÒØ ÓÒ Ð         ×Ó ÙÒ ÒØÖ Ñ ØÖ Ð (i, j) × Ñ × ÓÑÔÐ ÕÙ Ð ×
 ÒØ Ö ÓÖ ×¸ ÔÙ × Ð ÓÑÔ Ð ÓÖ Ý Ð Ñ ÝÓÖ   Ö Û Ö ÒÓ Ñ Ò Ò Ø× ÓÑÓ ÙÒ ÙÒ º
  Ð ÓÑÔ Ð ÓÖ Ñ Ò Ô Ð Ö × ÓÑÔÙ ×Ø × ÔÓÖ Ø×º ÆÓ ÔÓ ÑÓ׸ Ô٠׸ ÑÔÐ ÒØ Ö Ð
ÓÔ Ö ÓÖ (i, j) Ô Ö ÕÙ Ö ØÓÖÒ ÙÒ Øº Ì ÑÔÓ Ó ÒÓ× × ÖÚ ÕÙ Ð ÓÔ Ö ÓÖ (i, j) ÒÓ×
Ö ØÓÖÒ ÙÒ Ô Ð Ö Ø ÔÓ int¸ ÔÙ × Ð ×Ó ÔÓ Ö × Ö × Ö ØÙÖ º       ÑÓ׸ ÒØÓÒ ×¸
   ר Ò Ù Ö ÐÓ× ×Ó× × Ö ØÙÖ ÐÓ× Ð ØÙÖ Ý¸ Ô Ö ÐÐÓ¸ Ù× Ö ÑÓ× ÙÒ Ð × Proxy
 Ò Ð Ñ ×ÑÓ ×Ø ÐÓ ÕÙ ÓØÖÓ× Ø ÔÓ× Ý ×ØÙ Ó׺

7.6.5   Algoritmo de Warshall
ÁÐÙ×ØÖ Ö ÑÓ× ÒÙ ×ØÖ ÔÖ Ñ Ö ÙØ Ð Þ ÓÒ ÙÒ Ñ ØÖ Þ     Ý Ò Ô Ö ÑÔÐ ÒØ Ö ÙÒ
  Ð Ö Ð ÓÖ ØÑÓ ÕÙ Ð ÙÐ ØÓ × Ð × Ö Ð ÓÒ × ÓÒ Ø Ú           ÙÒ Ö Ó ØÖ Ú ×
ÐÓ× ×Ø ÒØÓ× Ñ ÒÓ׺ Ð Ð ÓÖ ØÑÓ Ò Ù ×Ø ÓÒ Ø Ò Ñ × × ÒØ Ó ×Ó Ö Ö Ó× Ö Ó× Ý
 × ÓÒÓ Ó ÓÑÓ Ï Ö× ÐÐ ¿ Ò ÓÒÓÖ ×Ù × Ù Ö ÓÖº
              02             04           06          10              13


                             03      07         09             11



              01             05            08         12              14




                                  ÙÖ º¿¾ ÍÒ Ö Ó Ö          Ó
    ÓÑÓ ÒÙÒ ÑÓ× Ð ÔÖ Ò Ô Ó¸ ÙÒ Ö Ó × ÙÒ Ñ Ò Ö                      Ö ÔÖ × ÒØ Ö ÙÒ Ö Ð ÓÒ
Ñ Ø Ñ Ø º Ò ×Ø × ÒØ Ó¸ ÙÒ Ö Ð ÓÒ Ò Ö E ×Ó Ö ÙÒ ÓÒ ÙÒØÓ V ´ÐÓ ÕÙ ÓÒ ÓÖÑ
 Ð Ö Ó < V, E >µ es transitiva × ∀x, y, z ∈ V, (x, y), (y, z) ∈ Eº ÍÒ grafo transitivo ×
ØÓ Ó ÕÙ Ð ÕÙ Ö ÔÖ × ÒØ ÙÒ Ö Ð ÓÒ ØÖ Ò× Ø Ú º
Definici´n 7.5 (Clausura transitiva) Ä Ð Ù×ÙÖ
       o                                       ØÖ Ò× Ø Ú    ÙÒ Ö Ð ÓÒ R × Ð
Ö Ð ÓÒ R∗ ¬Ò ÔÓÖ ØÓ Ó Ô Ö (x, y) ∈ R∗ Ø Ð ÕÙ    Ü ×Ø ÙÒ Ñ ÒÓ ÒØÖ x yº
   Ä Ð Ù×ÙÖ ØÖ Ò× Ø Ú R∗ ÙÒ Ö Ð ÓÒ R × Ð       Ñ Ò Ñ Ö Ð ÓÒ ÕÙ ÓÒØ Ò Rº
   Ë ÙÒ Ö Ð ÓÒ R × Ö ÔÖ × ÒØ Ñ ØÖ ÐÑ ÒØ ¸ ÒØÓÒ ×¸ Ð Ñ ØÖ Þ ÓÖÖ ×ÔÓÒ ÒØ
Ð Ö Ð ÓÒ R∗ Ö ÔÖ × ÒØ ØÓ × Ð × Ö Ð ÓÒ × ÔÓ× Ð × ÓÒ Ø Ú           ÒØÖ    ÔÖ
ÒÓ Ó׺ ÍÒ ÒØÖ R∗ = 0 Ò ÕÙ Ü ×Ø ÙÒ Ñ ÒÓ ÒØÖ ÐÓ× ÒÓ Ó× i Ý jº Ð ÙÐ Ö
                     (i,j)
R∗ ÒÓ× Ô ÖÑ Ø ¸ Ô٠׸ ÑÔÐ Ñ ÒØ Ö ÙÒ ÔÖÙ       Ü ×Ø Ò        Ñ ÒÓ ÒØÖ Ù ÐÕÙ Ö
Ô Ö ÒÓ Ó׺
     Ð Ð ÓÖ ØÑÓ Ï Ö× ÐÐ Ô Ö Ð ÙÐ Ö Ð Ð Ù×ÙÖ ØÖ Ò× Ø Ú × × ÖÚ Ð ÓÒרÖÙ ÓÒ
   Ö Ð ÓÒ × ÒØÖ Ñ ÒÓ× ÐÓÒ ØÙ i + 1º Ä                × ÓÒרÖÙ Ö ÙÒ × Ù Ò
672                                                                                           Cap´
                                                                                                     ıtulo 7. Grafos



    Ö Ð ÓÒ × ÒØ ÖÑ × ´Ó Ö Ó×µ R0, R1, R2, . . . , Rnº Ò           Ø Ö ÓÒ ÕÙ Ð ÙÐ Rk¸
    × Ü Ñ Ò Ò ØÓ Ó× ÐÓ× ØÖ Ó× (vk, vi, vj) ÒÓ Ó× R    k−1º Ë Ð ØÖ Ò× ØÓÖ   vi −→ vj −→
    vk Ü ×Ø Ò R k−1¸ ÒØÓÒ × ×       Ò     Ð Ö Ó vi −→ vk R  k


                                                                                 k         i        j
                       k            i                j
                                                                     =⇒
                                ´ µ Rk−1                                                ´ µ Rk


                                        ÙÖ º¿¿               Ò         ÙÖ            Ö Ó Ò Rk
      ÈÓÖ ×ÙÔÙ ×ØÓ¸ × ÒØÖÓ ÙÒ ØÖ Ó (vk, vi, vj) Ò Rk−1 Ý Ü ×Ø ÙÒ Ö Ó vi −→ vk¸
    ÒØÓÒ × Ð ÒØÖ Rk = 1º Ä ÓÖÑÙÐ Ö ×ÙÐØ ÒØ ׸ ÒØÓÒ ×
                      i,j

                                    Ri = Ri−1 ∨ (Ri−1 ∧ Ri−1)
                                     i,j  i,j     i,k    k,j                                                      ´ º¾µ
     Ð ÔÖÓ ×Ó ×       ÙØ    n   Ú × ×Ø ÐÐ Ö ÐÓ× Ñ ÒÓ×                                    ÐÓÒ ØÙ    nº   ÄÓ ÕÙ ÒÓ× ÖÖÓ
                                                                     n
                                             ∗
                                         R =R =              n
                                                                           Rk−1 × Rk                              ´ º¿µ
                                                                     k=1

    Ä ÓÔ Ö ÓÒ Rk−1 × Rk × Ö Ð Þ × ÙÒ ´ º¾µº
                                ½   ¾    ¿                                            ½¼ ½½ ½¾ ½¿ ½
                        ½       ¼   ¼    ½       ¼       ¼       ¼    ¼     ¼    ¼    ¼ ¼ ¼ ¼ ¼
                        ¾       ¼   ¼    ¼       ½       ¼       ¼    ¼     ¼    ¼    ¼ ¼ ¼ ¼ ¼
                        ¿       ¼   ¼    ¼       ¼       ½       ½    ¼     ¼    ¼    ¼ ¼ ¼ ¼ ¼
                                ½   ¼    ¼       ¼       ¼       ½    ¼     ¼    ¼    ¼ ¼ ¼ ¼ ¼
                                ¼   ¼    ¼       ¼       ¼       ¼    ½     ¼    ¼    ¼ ¼ ¼ ¼ ¼
                                ¼   ¼    ¼       ¼       ¼       ¼    ¼     ¼    ¼    ½ ¼ ¼ ¼ ¼
               R0 =             ¼   ¼    ¼       ½       ¼       ¼    ¼     ½    ½    ¼ ¼ ¼ ¼ ¼
                                ¼   ¼    ¼       ¼       ¼       ¼    ¼     ¼    ¼    ¼ ¼ ½ ¼ ¼
                                ¼   ¼    ¼       ¼       ¼       ¼    ¼     ¼    ¼    ½ ¼ ½ ¼ ¼
                       ½¼       ¼   ¼    ¼       ¼       ¼       ¼    ¼     ¼    ¼    ¼ ¼ ¼ ½ ¼
                       ½½       ¼   ¼    ¼       ¼       ¼       ¼    ¼     ¼    ¼    ¼ ¼ ¼ ½ ¼
                       ½¾       ¼   ¼    ¼       ¼       ¼       ¼    ¼     ¼    ¼    ¼ ½ ¼ ¼ ¼
                       ½¿       ¼   ¼    ¼       ¼       ¼       ¼    ¼     ¼    ¼    ¼ ¼ ¼ ¼ ½
                       ½        ¼   ¼    ¼       ¼       ¼       ¼    ¼     ¼    ¼    ¼ ¼ ½ ¼ ¼

                    ÙÖ º¿ Å ØÖ Þ                         Ý Ò                    Ø× Ð Ö Ó         Ð ¬ ÙÖ º¿¾
          Ð Ð ÙÐÓ   Ð Ð Ù×ÙÖ ØÖ Ò× Ø Ú  ÙÒ Ö Ó Ö ÔÖ × ÒØ Ó Ñ ÒØ ÙÒ Ó ØÓ
    Ø ÔÓ List Graph<Node, Arc> × ÒרÖÙÑ ÒØ Ò Ð Ö ÚÓ Û Ö× ÐкÀ ¾ ×Ô ¬ Ó
       Ð × Ù ÒØ ÓÖÑ
¾    Û Ö× ÐкÀ ¾ ≡
         template <class GT, class SA>
     void warshall_compute_transitive_clausure(GT &                    g,
                                               Bit_Mat_Graph<GT, SA> & mat)
     {
7.6. Matrices de adyacencia                                                                    673



              Ð ÙÐ Ö Ð Ù×ÙÖ ØÖ Ò× Ø Ú         ¿
      }
    Í× × Bit Mat Graph        º
          × ÙÒ List Graph<Node, Arc> ×Ó Ö Ð Ù Ð × × Ð ÙÐ Ö Ð Ð Ù×ÙÖ ØÖ Ò× Ø Ú
          g
    Ñ ÒØÖ × ÕÙ mat × Ð Ö ×ÙÐØ Ó Ð Ð Ù×ÙÖ Ò Ù ×Ø ÓÒ × ÙÒ Ð Ð ÓÖ ØÑÓ Ï Ö× Ðк
              ØÓ×    ÓÖÖÓ ×Ô Ó¸ ÔÓ ÑÓ× × Ò Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ ×ÓÐÓ Ù× Ó× Ñ ØÖ ×
      Ñ Ò Ö Ø Ð ÒÓ Ö ÙÒ Ö Ð ×Ô Ó Ð × n Ñ ØÖ ׺ È Ö ÐÐÓ¸ ÒÓÑ Ò ÑÓ× mat
     ÓÑÓ Ð Ñ ØÖ Þ       Ø× Rk Ò Ð Ø Ö ÓÒ k Ý mat prev ÓÑÓ Rk−1¸ Ð Ù Ð Ý ÕÙ
    Ò ÖR     0

¿      Ð ÙÐ Ö Ð Ù×ÙÖ ØÖ Ò× Ø Ú ¿ ≡                      ´ ¾µ ¿
      Bit_Mat_Graph<GT, SA> mat_prev(g);
    Í× × Bit Mat Graph        º

            ÒØ × Ò Ö Ù ÐÕÙ Ö Ð ÙÐÓ¸                   ÑÓ× × ÙÖ Ö       ÕÙ   mat   ר ×Ó       Ó Ð Ö Óg
¿         Ð ÙÐ Ö Ð Ù×ÙÖ ØÖ Ò× Ø Ú ¿ +≡                                 ´ ¾µ       ¿   ¿
      if (mat.get_list_graph() != &g)
        mat.set_list_graph(g);
    Í× × set list graph ¼ º
          ÆÓ× Ö ×Ø ÑÔÐ ÒØ Ö Ð Ö ×ØÓ Ð Ð ÓÖ ØÑÓ × ÙÒ ´ º¿µ
¿         Ð ÙÐ Ö Ð Ù×ÙÖ ØÖ Ò× Ø Ú ¿ +≡                                        ´ ¾µ        ¿
      const size_t & n = mat.get_num_nodes();
      for (int k = 0; k < n; k++)
        {
          for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
              mat(i, j) = mat_prev(i, j) or (mat_prev(i, k) and mat_prev(k, j));
          mat_prev = mat;
        }

                                  ½   ¾   ¿                           ½¼ ½½ ½¾ ½¿ ½
                          ½       ½   ¼   ½   ½   ½   ½   ½   ½   ½   ½ ½ ½ ½ ½
                          ¾       ½   ¼   ½   ½   ½   ½   ½   ½   ½   ½ ½ ½ ½ ½
                          ¿       ½   ¼   ½   ½   ½   ½   ½   ½   ½   ½ ½ ½ ½ ½
                                  ½   ¼   ½   ½   ½   ½   ½   ½   ½   ½ ½ ½ ½ ½
                                  ½   ¼   ½   ½   ½   ½   ½   ½   ½   ½ ½ ½ ½ ½
                                  ¼   ¼   ¼   ¼   ¼   ¼   ¼   ¼   ¼   ½ ½ ½ ½ ½
                 R∗ =             ½   ¼   ½   ½   ½   ½   ½   ½   ½   ½ ½ ½ ½ ½
                                  ¼   ¼   ¼   ¼   ¼   ¼   ¼   ¼   ¼   ¼ ½ ½ ½ ½
                                  ¼   ¼   ¼   ¼   ¼   ¼   ¼   ¼   ¼   ½ ½ ½ ½ ½
                         ½¼       ¼   ¼   ¼   ¼   ¼   ¼   ¼   ¼   ¼   ¼ ½ ½ ½ ½
                         ½½       ¼   ¼   ¼   ¼   ¼   ¼   ¼   ¼   ¼   ¼ ½ ½ ½ ½
                         ½¾       ¼   ¼   ¼   ¼   ¼   ¼   ¼   ¼   ¼   ¼ ½ ½ ½ ½
                         ½¿       ¼   ¼   ¼   ¼   ¼   ¼   ¼   ¼   ¼   ¼ ½ ½ ½ ½
                         ½        ¼   ¼   ¼   ¼   ¼   ¼   ¼   ¼   ¼   ¼ ½ ½ ½ ½

                  ÙÖ º¿           Ð Ù×ÙÖ ØÖ Ò× Ø Ú        Ð Ö Ó Ð Ð ¬ ÙÖ º¿¾ ´Ô º ½µº
674                                                                    Cap´
                                                                          ıtulo 7. Grafos



7.7     T´picos sobre grafos dirigidos
         o
  Ð Ò Ó          ר Ô ØÙÐÓ ÒØÖÓ Ù ÑÓ× Ð ÒÓ ÓÒ         Ö Ó Ö Ó Ó Ö Óº Ò
Ü º¿º¾ ´Ô Ò        ½µ ÔÖ × ÒØ ÑÓ× Ð Ì ÕÙ ÐÓ Ö ÔÖ × ÒØ ¸ List Digraph<Node, Arc>¸
 ÙÝ ÑÔÐ ÒØ ÓÒ ×¸ ÙÒ Ñ ÒØ ÐÑ ÒØ ¸ ÒØ             Ð List Graph<Node, Arc>¸ ÔÙ ×
 ר ÙÐØ Ñ × ×Ù × ÔÓÖ Ö Ò º
       × ØÓ Ó× ÐÓ× Ð ÓÖ ØÑÓ× ÕÙ ×Ø Ð ÔÖ × ÒØ ÑÓ× × Ò Ó ÓÔ Ö Ò ÓÒ Ö Ó׺
          Ó¸ ÐÓ× Ð ÓÖ ØÑÓ× Ñ ØÖ Р׸ Ò Ð Ó ÙÖÖ Ò Ð Ï Ö× ÐÐ Ô Ö Ð Ð Ù×ÙÖ
ØÖ Ò× Ø Ú ¸ Ý Ð      ÐÓÝ ¹Ï Ö× ÐÐ Ô Ö Ð Ð ÙÐÓ     Ñ ÒÓ× Ñ Ò ÑÓ׸ Ù ÖÓÒ ÓÒ     Ó×
Ô Ö Ö Ó׺ ÐÐÓ× ÓÔ Ö Ò Ô Ö Ø Ñ ÒØ ×Ó Ö Ö Ó× ÔÓÖÕÙ ÙÒ Ö Ó ×¸ Ø Ñ Ò¸ ÙÒ
   Ö Ó½ º
    À ר Ð ÔÖ × ÒØ ¸ ÐÓ× Ö ÓÖÖ Ó× Ý ×Ù× Ð ÓÖ ØÑÓ× Ö Ú Ó× ÒÓ× Ò × ÖÚ Ó ÓÑÓ
 ÒרÖÙÑ ÒØÓ× Ô Ö ÓØÖÓ× Ð ÓÖ ØÑÓ׺ ÈÓÖ ×Ó¸ × Ñ Ò ×Ø Ö Ù ×Ø ÓÒ Ö Ò ÕÙ Ñ Ò
ÐÓ× Ö ÓÖÖ Ó× ×Ó Ö Ö Ó× Ä Ò ÓÐ Ð Ö ÓÖÖ Ó ÓÑÓ ÒרÖÙÑ ÒØÓ Ô Ò                    Ó×
   ØÓÖ × ÙÒ Ñ ÒØ Ð × ´½µ Ð ÓÒ Ø Ú          Ý ´¾µ ×Ù Ö Ø Ö Ð Óº Ê Ú × Ö Ò ÐÓ×
   Ö Ó× Ð ÙÒÓ× ÐÓ× ÔÖÓ Ð Ñ × ÕÙ ÒÓ× ÔÐ ÒØ ÑÓ× ÓÒ ÐÓ× Ö Ó× ÒÓ× Ö Ú Ð Ö ×ØÓ×
   ØÓÖ ×º

7.7.1    Conectividad entre digrafos
 Ò       Ö Ó׸ Ð         ÓÒ Ø Ú      ÔÙ × Ö ÓÒ Ù× º Ó× ÒÓ Ó× ×ÓÒ ÓÒ ÜÓ× Ó ×Ø Ò
     Ö Ø Ñ ÒØ ÓÒ Ø Ó× × ÒØÖ ÐÐÓ× Ü ×Ø ÙÒ Ö Óº Ð Ñ ×ÑÓ ÑÓ Ó¸ ×ÓÒ ÓÒ ÜÓ× Ó
  ר Ò Ò Ö Ø Ñ ÒØ ÓÒ Ø Ó× × ÒØÖ ÐÐÓ× Ü ×Ø ÙÒ Ñ ÒÓ ÕÙ ÐÓ× ÓÒ Ø º Ë Ñ¹
 Ð ÖÑ ÒØ ¸ ÙÒ Ö Ó × ÓÒ ÜÓ × ØÓ Ó× ×Ù× ÒÓ Ó× ×ÓÒ ÓÒ ÜÓ׺ Ò ÙÒ Ö Ó¸ ÑÔ ÖÓ¸
ÕÙ ÙÒ ÒÓ Ó p ר ÓÒ Ø Ó q ÒÓ ÑÔÐ ÕÙ q ר ÓÒ Ø Ó pº ר                        ÓØ Ò
  ÓÒ× Ù Ò × Ò ÐÓ× Ð ÓÖ ØÑÓ׺ Ò Ð Ó ÙÖÖ Ò             ר ×Ù ¹× ÓÒ¸ ÒÓ× Ö Ú Ð ÕÙ Ð
ÖÙØ Ò test connectivity() ×ØÙ          Ò Ü º º¿ ´Ô Ò ½ µ ÒÓ ÒÓ× × ÖÚ Ô Ö Ö Ó׺
      È Ö Ö Ó× Ñ ÒÙ Ó × ÔÖ Ö Ð ÑÔÐ Ö Ð ÒÓ ÓÒ                 Ð ÒÞ Ð        ÒØÖ Ó×
ÒÓ Ó× ÙÒ ÒÓ Ó q × Ð ÒÞ Ð            × ÓØÖÓ p × Ü ×Ø ÙÒ Ñ ÒÓ p −→ qº
       × Ð × Ó× ×¸ ÔÓ ÑÓ× Ö Ð Þ Ö ÙÒ ÔÖÙ         ÓÒ Ø Ú      × Ò ÓÒÓ× Ò Ð Ö ÓÖÖ Ó
  Ò ÔÖÓ ÙÒ       ÕÙ Ú Ö ¬ÕÙ × ×          ÒÓ Ó × ÔÙ Ò Ð ÒÞ Ö ÐÓ× Ö ×Ø ÒØ ׸ Ð Ù Ð
Ý Ù ÔÖ Ú Ñ ÒØ ÒרÖÙÑ ÒØ
    Ð ÓÖ ØÑÓ× Ô Ö Ö Ó× ≡
      template <class GT, class SA>
  bool is_reachable(GT & g, typename GT::Node * src, typename GT::Node * tgt)
  {
    return test_for_path <GT, SA> (g, src, tgt);
  }
 ½
      ÕÙ ÔÙ Ö Ú Ð Ö× ÒÓ× ÙÒ Ò ÓÒ× ×Ø Ò ÜÔÖ × ÔÓÖ Ð              Ó ÕÙ List Digraph<Node, Arc>
  Ö        List Graph<Node, Arc> Ý ÒÓ Ð Ö Ú × ÓÑÓ ÔÙ Ö ×Ù Ö Ö Ð Ð Ò             Ö ÞÓÒ Ñ ÒØÓ ÕÙ
 ר ÑÓ× ØÓÑ Ò Óº Ä ÒÚ Ö× ÓÒ ×         Ð ×ØÖÙ ØÙÖ         ØÓ× Ý Ð Ö ÙØ Ð Þ ÓÒº Ò ÐÓ ÕÙ ÓÒ ÖÒ
  Ð ÑÔÐ ÒØ ÓÒ¸ Ð ÙÒ          ÖÒ     ÒØÖ ÐÓ× Ó× Ø ÔÓ× × Ò Ù ÒØÖ Ò Ð ÑÔÐ ÒØ ÓÒ Ð Ñ ØÓ Ó
insert arc() ´Ü º¿º½¼º ´Ô Ò      µµº Ë Ó × ÖÚ ÑÓ× Ò ×Ø Ñ ØÓ Ó¸ ÔÓ ÑÓ× Ô Ö Ø ÖÒÓ× ÕÙ
ÔÓ Ö ÑÓ× ÑÔÐ ÒØ Ö ÐÓ× Ö Ó× ÓÑÓ ×              ÐÓ× Ö Ó׺ Ä        × ÓÒ Ó     Ó ÕÙ ÐÓ× Ð ÓÖ ØÑÓ×
×Ó Ö Ö Ó× ×ÓÒ Ñ × Ò Ö Ð × ÕÙ ÐÓ×       Ö Ó× Ý¸ ×Ó Ö ØÓ Ó¸ Ñ × × ÑÔР׺ È Ö Ô٠׸ ÓÒ Ñ × × ÒØ Ó
 ÓÑÙÒ ÕÙ ÐÓ× Ö Ó× × Ò × Ó Ø Ú ´Ø Ò Ò ÐÓ× Ñ ×ÑÓ× Ñ ØÓ Ó×µ Ý ×Ù Ø Ú             ÐÓ× Ö Ó× Ý ÒÓ Ð
 ÓÒØÖ Ö Óº
7.7. T´picos sobre grafos dirigidos
      o                                                                       675



    Ä Ñ ×Ñ ÖÙØ Ò ×       Ò Ð Ù×ÕÙ       Ò ÔÖÓ ÙÒ        ÔÙ    Ù× Ö× ¸ × Ò ÔÖÓ Ð Ñ
 Ð ÙÒÓ Ô Ö Ö Ó× Ö ÔÖ × ÒØ Ó× ÓÒ Ð ×Ø ׺
7.7.2    Inversi´n de un digrafo
                o
  Ò Ó × ÓÒ ×¸ ÔÙ × Ö ÙØ Ð Ó Ø Ò Ö Ð Ö Ó ÒÚ Ö×Ó G =< V, E > × Ö¸ ÙÒ Ö Ó
 ÓÒ ÐÓ× Ñ ×ÑÓ× ÒÓ Ó× Ô ÖÓ ×Ù× Ö Ó× ÒÚ ÖØ Ó׺ ×ØÓ × ÐÓ Ö ÑÙÝ ÐÑ ÒØ Ö ÓÖÖ Ò Ó
 Ð Ö Ó Ò× ÖØ Ò Ó Ö Ó× ÒÚ ÖØ Ó Ò Ð Ö Ó ×Ø ÒÓ
   Ð ÓÖ ØÑÓ× Ô Ö Ö Ó× +≡
      template <class GT, class SA>
  void invert_digraph(GT & sg, GT & rg)
  {
        // recorrer todos los arcos del digrafo sg
    for (Arc_Iterator<GT, SA> it(sg); it.has_current(); it.next())
      {
        typename GT::Arc * arc   = it.get_current();
        typename GT::Node * ssrc = sg.get_src_node(arc); // procesar nodo origen
        typename GT::Node * rsrc = NODE_COOKIE(ssrc);
        if (rsrc == NULL) // ¿ya est´ creado ssrc en rg?
                                    a
          {     // no == crearlo, insertarlo y mapearlo
             auto_ptr<typename GT::Node> rsrc_auto(new typename GT::Node(ssrc));
             sg.insert_node(rsrc_auto.get());
             GT::map_nodes(ssrc, rsrc_auto.get());
             rsrc = rsrc_auto.release();
          }
        typename GT::Node * stgt = sg.get_tgt_node(arc); // procesar nodo destino
        typename GT::Node * rtgt = NODE_COOKIE(stgt);
        if (rtgt == NULL) // ¿ya est´ creado ssrc en rg?
                                    a
          {     // no == crearlo, insertarlo y mapearlo
             auto_ptr<typename GT::Node> rtgt_auto(new typename GT::Node(stgt));
             sg.insert_node(rtgt_auto.get());
             GT::map_nodes(stgt, rtgt_auto.get());
             rtgt = rtgt_auto.release();
          }
        rg.insert_arc(rtgt, rsrc, arc->get_info());
      }
  }
Í× × Arc Iterator   º
     invert digraph() × ÙÒ ÖÙØ Ò ÑÙÝ × ÑÔÐ º Ð Ö Ñ ÒØ ¸ ×Ù × ÑÔ ÒÓ × O(E) Ý
Ñ ÒÙ Ó × Ù× ÓÑÓ Ø Ô Ò Ð ÓØÖÓ× Ð ÓÖ ØÑÓ× ÐÓ ÕÙ ÔÓÖ ÐÓ Ò Ö Ð ÐÓ×               Ñ×
Ð ÒØÓ× Ý ÓרÓ×Ó× Ò ×Ô Ó ÚÓÖ ×Ù Ð Ð º ÍÒ ÔÐ ÓÒ × ÓÒÓ Ö Ð Ö Ó
     ÒØÖ      ÙÒ ÒÓ Óº      Ó ÙÒ ÒÓ Ó p¸ sg.get num arcs(p) ÒÓ× ÔÖÓÔÓÖ ÓÒ Ð Ö Ó
    × Ð ¸ Ñ ÒØÖ × ÕÙ rg.get num arcs(p) Ð ÒØÖ º
      Ò ÜÔÖ × ÓÒ × ÓÖÑ Ð ×¸ ×Ù Ð × Ò Ö× Ð Ö Ó ÒØÖ             ÓÑÓ Ò(v) Ý ÓÙØ (v)
 ÓÑÓ Ð × Ð º
      ÒÐ Ö          Ö Ó× ×Ù Ð Ò Ù× Ö× ÐÓ× Ø ÖÑ ÒÓ× Ö Ó       Ý Ò Ô Ö Ö ÖÖ Ð
  Ö Ó × Ð ¸ Ý Ö Ó Ò Ò Ô Ö Ð ÒØÖ º Ò × × ÒØ Ó¸ × ×Ø Ò Ù Ò
  Ó× Ð × × ÒÓ Ó× ×Ô Ð ×º ÙÒÓ Ð Ù Ð ×ÓÐÓ Ð ÐÐ Ù Ò Ö Ó× Ý × Ð Ù Ð ÒÓ
× Ð Ò Ò ÙÒÓ¸ × Ö¸ ÙÒÓ ÙÝÓ Ö Ó               Ý Ò × ÖÓ¸ × Ð Ø Ð           ×ÙÑ ÖÓ º
676                                                          Cap´
                                                                ıtulo 7. Grafos



 Ò Ð × ÒØ Ó × Ñ ØÖ Ñ ÒØ ÒÚ Ö×Ó¸ ÙÒÓ × Ð Ù Ð ×ÓÐÓ × Ð Ò Ö Ó× Ý ÒÓ Ð ÐÐ Ù
Ò Ò ÙÒÓ¸ Ó × ¸ ÙÒÓ ÓÒ Ö Ó Ò Ò       ÖÓ¸ × ÐÐ Ñ Ù ÒØ º
7.7.3      Componentes fuertemente conexos de un digrafo
ÍÒ       × Ñ Ð Ö Ð ÓÒ Ø Ú       Ò Ö Ó× × Ð “conectividad fuerte”º        ÑÓ×
ÕÙ Ó× ÒÓ Ó× u Ý v ר Ò Ù ÖØ Ñ ÒØ ÓÒ Ø Ó× × Ü ×Ø Ò ÐÓ× Ñ ÒÓ× u v Ý v uº
     Ò ÙÒ ÓÒ ×Ù Ð ÒÞ Ð ¸             ÑÓ× ÕÙ ÙÒ Ö Ó × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ
× ØÓ Ó× ×Ù× ÒÓ Ó× ×ÓÒ Ð ÒÞ Ð × ÒØÖ × º           ÓÒØÖ Ö Ñ ÒØ ¸     ÑÓ× ÕÙ ×
     ÐÑ ÒØ ÓÒ ÜÓ × ÒÓ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓº
    ÍÒ Ò        ÓÒ Ð Ù ÖÞ        ÓÒ Ø Ú        ÙÒ Ö Ó ÔÙ       ÓÒÓ Ö× Ñ ÒØ
 Ð Ð ÓÖ ØÑÓ Ï Ö× ÐÐ ´Ü º º ´Ô Ò ½µµº Ë Ð Ö Ó × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ¸ Ò¹
ØÓÒ × ×Ù Ð Ù×ÙÖ ØÖ Ò× Ø Ú ÒÓ ÓÒØ Ò ÖÓ׺ Ò ÓÒØÖ ÑÓ׸ Ô٠׸ Ò ×Ø Ð ÓÖ ØÑÓ ÙÒ
Ø Ò O(V 3) Ô Ö Ú Ö Ù Ö ÔÓÖ Ð ÓÒ Ø Ú         Ù ÖØ ¸ × ÓÑÓ Ø Ñ Ò Ò Ö ×Ó Ö
Ð Ð ÒÞ Ð          ÒØÖ Ù ÐÕÙ Ö Ô Ö ÒÓ Ó׺ ×ÔÓÒ Ò Ó Ð Ð Ù×ÙÖ ØÖ Ò× Ø Ú ¸ Ð
ÔÖÙ        Ð ÒÞ Ð       ØÓÑ ÐÓ ×ÙÑÓ O(Ð V)¸ × × Ö ÕÙ Ö Ò Þ Ö ÐÓ× ÒÓ Ó׺
       A                      E              A                       E


                B        D           D                 B         D          D


      C                       F              C                       F

                    ´µ                                     ´ µ

                ÙÖ º¿ ÍÒ     Ö Ó Ý ×Ù× Ó× ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ×
   È Ö Ö Ó× ÒÓÖÑ × Ý Ò×Ó× Ð Ð ÓÖ ØÑÓ Ï Ö× ÐÐ ÔÙ × Ö Ò ÔÐ Ð Ò ×Ô Ó
 Ò ×ØÓ× ×Ó׸ ÔÓ ÑÓ× ÓÔØ Ö ÙÒ ×ØÖ Ø              ×   Ò Ð ÖÙØ Ò is reachable()
ÒÚÓ ÖÐ Ô Ö        Ô Ö ÒÓ Ó× ÒÓ×       Ð Ñ ×ÑÓ ØÖ Ó Ò O(V 2) × O(V E) = O(V 3E)
Ô ×Ó× Ñ × ÓרÓ×Ó Ò Ø ÑÔÓ¸ Ô ÖÓ Ñ ÒÓ× Ò ×Ô Óº
     Ò ÙÒ ÓÒ       Ð ÓÒ Ø Ú       Ù ÖØ ¸ Ò ÙÒ Ö Ó ÔÙ Ò ÒØ ¬ Ö× ×Ù×
“componentes fuertemente conexos”        ×    Ö¸ ÐÓÕÙ × Ó ×Ù ¹ Ö Ó×     ÐÑ ÒØ
 ÓÒ ÜÓ× ÒØÖ × ¸ Ô ÖÓ Ù ÖØ Ñ ÒØ ÓÒ ÜÓ× Ò ×Ù× ÒÓ Ó× ÒØ ÖÒÓ׺
   À Ý Ú Ö Ó× Ý Ð Ö × Ð ÓÖ ØÑÓ× Ô Ö Ð ÙÐ Ö ÐÓ× ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ׺
7.7.3.1     Algoritmo de Kosaraju

 Ð Ñ × ÒØ ÙÓ Ð ÓÖ ØÑÓ ÓÒÓ Ó Ô Ö Ø ÖÑ Ò Ö ÐÓ× ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ×
   ÙÒ Ö Ó¸ Ý ÔÖÓ Ð Ñ ÒØ Ð Ñ × × ÑÔÐ       ÓÑÔÖ Ò Ö¸ × Ð ÓÒÓ ÓÑÓ Ð
ÃÓ× Ö Ùº
Algoritmo 7.2 (Algoritmo de Kosaraju para los componentes fuertes)
   Ä ÒØÖ     × ÙÒ Ö Ó G =< V, E >º
   Ä × Ð × ÙÒ Ð ×Ø l ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ׺
  ½º      l=∅
7.7. T´picos sobre grafos dirigidos
      o                                                                                            677



  ¾º Ê Ð ÙÒ Ù×ÕÙ             Ò ÔÖÓ ÙÒ     Ò G Ò Ð Ù Ð ÐÓ× ÒÓ Ó× × ÒÙÑ Ö Ò ÔÓÖ ×Ù
     ÓÖ Ò Ø ÖÑ Ò ÓÒº Ë (v) ר ÒÙÑ ÖÓº
        (v) × × Ò Ð ¬Ò Ð             ÐÐ Ñ Ö ÙÖ× Ú depth first traversal(g, v,
     ...)º

  ¿º ÓÒרÖÙÝ Ð Ö Ó ÒÚ ÖØ Ó G =< V, E > Ñ Ô Ó ÓÒ G × Ö¸ ÐÓ× ÑÔÓ×
        (v) Ò G ×ÓÒ ÐÓ× Ñ ×ÑÓ× Ð ÙÐ Ó× Ò Ð Ô ×Ó ¾º

   º Ë SÐ × Ù Ò             ÒÓ Ó× ÓÖ Ò     × Ò ÒØ Ñ ÒØ ÔÓÖ º Ë i = 0º
   º ∀v ∈ S =⇒ ´ÐÓ× ÒÓ Ó× Ô Ö Ò ÓÖ Ò Ó× ÔÓÖ (v)µ
      ´ µ Ë v ÒÓ ×Ø Ñ Ö Ó =⇒
              º Ë T =∅
              º T = { Ö Ó Ð ÒÞ Ð ÔÓÖ Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ           × v}
       Ð ¬Ò Ð       ÐÓ¸ T × ÙÒ ÓÑÔÓÒ ÒØ Ù ÖØ Ñ ÒØ ÓÒ ÜÓ Gº
   º Å ÖÕÙ ØÓ Ó× ÐÓ× ÒÓ Ó× Ý Ö Ó× T º
   º l = l ∪ Tº

                              2                                              11            2            1
      10         11                        1                       10
  A          B                G        F                       A        B                 G         F


                                           3               5                                            3               5
                      E        H       I               J                          E        H        I               J
                          7        6                                                  7        6

  C          D                                 K               C        D                                   K
      9          8                                 4               9        8                                   4

          ´µ Ð       Ö Ó ÐÙ Ó Ð ÔÖ Ñ Ö Ö ÓÖÖ Ó                              ´ µ Ð Ö Ó ÒÚ ÖØ Ó G

   ÙÖ º¿ Ä × Ó× × × Ð Ð ÓÖ ØÑÓ ÃÓ× Ö Ùº ÄÓ× ÒÓ Ó× ×Ø Ò Ø ÕÙ Ø Ó× × ÙÒ
×Ù ÓÖ Ò Ø ÖÑ Ò ÓÒ Ö ÙÖ× Ú Ò ÔÖÓ ÙÒ  º Ë ×ÙÑ ÕÙ Ð ÐÐ Ñ Ò Ð Ó ÙÖÖ
 Ò Ð Ð ÒÓ Ó º
    ÈÓ ÑÓ× ÒØ ¬ Ö ØÖ × × × ÔÖ Ò Ô Ð ×¸ ØÓ × O(E) Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ
ÕÙ ÒÙÑ Ö ÐÓ× ÒÓ Ó× ÔÓÖ ×Ù ÓÖ Ò Ø ÖÑ Ò ÓÒ Ö ÙÖ× Ú ¸ Ð ÓÒרÖÙ ÓÒ G Ý
 Ð Ö ÓÖÖ Ó ¬Ò Ð ÓÖ Ò Ó × Ò ÒØ Ñ ÒØ Ò Ð ÕÙ × × Ù Ö Ò ÐÓ× ÓÑÔÓÒ ÒØ ×
 Ù ÖØ Ñ ÒØ ÓÒ ÜÓ׺       Ó ÙÒ ÐÓÕÙ Ù ÖØ Ñ ÒØ ÓÒ ÜÓ¸ Ð ÒÙÑ Ö ÓÒ ×Ù× ÒÓ Ó×
Ó ÙÖÖ × Ð Ñ × Ö ÒØ Ñ ÒØ ר Ð Ñ × ÒØ Ù Ñ ÒØ Ú × Ø Óº ÈÓÖ ÑÔÐÓ¸ Ò
 Ð ÐÓÕÙ Ñ × Ð Ö              Ð Ö Ó Ð ¬ ÙÖ º¿ ¹ Ú ÑÓ× ÕÙ Ð ÒÓ Ó ´ µ ×
ÙÐØ ÑÓ Ò      Ö× Ú × Ø Ó¸ Ñ ÒØÖ × ÕÙ Ð ´½½µ Ð ÔÖ Ñ ÖÓº × Ð Ö Ó ÒÚ Ö×Ó Ð
¬ ÙÖ º¿ ¹ ÓÒר Ø ÑÓ× ÕÙ ×           ´ µ × Ð ÒÞ Ò ØÓ Ó× ÐÓ× ÒÓ Ó׺ ÆÓ ÑÔÓÖØ ×
 Ù Ð ÒÓ Ó × Ò      Ð Ö ÓÖÖ Ó¸ ÓÑÓ ÐÙ Ó × Ú Ö ÒÚ ÖØ Ó¸ × × ÙÖ Ð Ó ÖØÙÖ Ð
 ÐÓÕÙ ÒØ ÖÓº
    ÆÓØ ÑÓ× ÕÙ ÒÓ × Ò × Ö Ó ÓÖ Ò Ö ÐÓ× ÒÓ Ó× ÔÓÖ ×Ù ÒÙÑ Ö ÓÒ¸ Ò ÙØ Ð Þ Ö ÙÒ Ô
Ô Ö ÓÒÓ Ö Ð Ñ ÝÓÖ ×Ø ÓÒ Ø Ò Ö ÙÒ ÖÖ ÐÓ Ý Ù Ö ÖÐÓ× × ÙÒ Ð Ø ÖÑ Ò ÓÒº
    Ä ÒרÖÙÑ ÒØ ÓÒ Ð Ð ÓÖ ØÑÓ ÃÓ× Ö Ù¸ × ÓÑÓ ×Ù Ú Ö ¬ ÓÒ ÓÖÖ Ø ØÙ ¸
× Ð Ò Ò Ö Óº
678                                                                   Cap´
                                                                         ıtulo 7. Grafos



7.7.3.2      Algoritmo de Tarjan

 Ð Ð ÓÖ ØÑÓ        Ì Ö Ò Ø Ò Ð Ú ÖØÙ       ÒØ ¬ Ö ÐÓ× ÐÓÕÙ × ÙÒ Ö Ó Ò ÙÒ ×ÓÐ
Ô × º ÓÒ×          Ö ÑÓ× Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ      ×Ó Ö ÙÒ Ö Óº Ä ÖÙØ Ò ÕÙ ÙÒ
   ÒØ Ö Þ Ð        Ð ÓÖ ØÑÓ Ý ÕÙ ÒÚÓ Ð Ö ÓÖÖ Ó Ö ÙÖ× ÚÓ Ò × ×
  ÓÑÔÓÒ ÒØ ×      Ù ÖØ Ñ ÒØ ÓÒ ÜÓ×    ≡                         ¿
         template <class GT, class SA> inline
    void strongly_connected_components(GT &                          g,
                                       DynDlist <GT> &               block_list,
                                       DynDlist<typename GT::Arc*> & arc_list)
    {
        ÁÒ   ÐÞ ÖÌ Ö Ò
        for (typename GT::Node_Iterator it(g); curr_df < n; it.next())
          {
            typename GT::Node * v = it.get_current();
            if (not IS_NODE_VISITED(v, Aleph::Depth_First)) // ¿p visitado?
              __scc<GT, SA>(g, block_list, stack, v, curr_df);
          }
          ÓÒרÖÙ Ö Ý Ñ Ô Ö ÐÓ× ÐÓÕÙ × ¾
    }
Í× × DynDlist ¿ Ò     Node Iterator         º
g   × Ð Ö Ó ×Ó Ö Ð Ù Ð × ×       Ð ÙÐ Ö ÐÓ× ÐÓÕ٠׺ block list × ÙÒ Ð ×Ø
    Ö Ó× Ñ Ô Ó× ÓÖÖ ×ÔÓÒ ÒØ ÐÓ× ×Ø ÒØÓ× ÐÓÕÙ × gº Ò ÐÑ ÒØ ¸ ÐÓ× Ö Ó×
g ÕÙ ÖÙÞ Ò ÒØÖ ÐÓ× ÐÓÕÙ × × Ù Ö Ò Ò Ð Ð ×Ø arc listº
     Ä ÖÙØ Ò ÑÔÐ Ð ÙÒ × Ú Ö Ð × ÒØ ÖÒ ×¸ Ð × Ù Ð × ÓÖ × Ñ Ò ×Ø Ö Ð Ö ¬ Ö
Ð × × Ù ÒØ ×
 ÁÒ Ð Þ Ö Ì Ö Ò     ≡                                  ´     ¿µ
    long curr_df   = 0; // contador de visitas
    const long & n = g.get_num_nodes();
curr df  × Ð ÓÒØ ÓÖ         ÒÓ Ó× Ú × Ø Ó׸ Ð Ù Ð ×ÓÐÓ × Ò Ö Ñ ÒØ Ð × Ù Ö Ö ÙÒ ÒÓ Ó
ÒÓ Ú × Ø Óº
    strongly connected components()           ÒÚÓ Ð ÖÙØ Ò scc()¸ Ð Ù Ð × ÙÒ Ö ÓÖÖ Ó
 Ò  ÔÖÓ ÙÒ     Ö ÙÖ× ÚÓº Ð for Ö Ú ×          ÐÓ× ÒÓ Ó׸ ÒÚÓ      scc() Ô Ö   ÒÓ Ó ÒÓ
Úר Ó Ý ×         Ø Ò ÙÒ Ó×            Ò Ú × Ø Ó ØÓ Ó× ÐÓ× ÒÓ Ó׸ ÐÓ Ù Ð × Ø Ø Ù Ò Ó
curr df == nº
     scc() ×  ¬Ò Ð × Ù ÒØ ÑÓ Ó
ÊÙØ Ò × ×Ø Ø × Ì Ö Ò     ≡                                                  ¿
        template <class GT, class SA> inline
    void __scc(GT &                               g,
               DynDlist <GT> &                    list,
               DynListStack<typename GT::Node*> & stack,
               typename GT::Node *                v,
               long &                             df_count)
    {
       ÁÒ Ó Ö ÓÖÖ Ó ×Ó Ö v ½
        Ê ÓÖÖ Ö Ò ÔÖÓ ÙÒ       Ð ÓÑÔÓÒ ÒØ Ù ÖØ Ñ ÒØ ÓÒ ÜÓ         v     ¾
        Î Ö ¬ Ö × (v) = ÐÓÛ(v) Ý Ú ÒØÙ ÐÑ ÒØ × ÑÔ Ð Ö ÐÓÕÙ        ½
    }
Í× × DynDlist ¿ Ò     DynListStack   ½½ º
7.7. T´picos sobre grafos dirigidos
      o                                                                                              679



 ר ÖÙØ Ò Ö ÓÖÖ Ò ÔÖÓ ÙÒ       Ð ÒÓ Ó vº g × Ð Ö Ó ×Ó Ö Ð Ù Ð × Ð ÙÐ Ò ÐÓ×
ÐÓÕ٠׸ list × ÙÒ Ð ×Ø   ÐÓÕ٠׸ stack × ÙÒ Ô Ð   ÒÓ Ó× Ú × Ø Ó× ÙÝÓ × ÒØ Ó
ÜÔÐ Ö ÑÓ× Ñ × Ð ÒØ ¸ v × Ð ÒÓ Ó ØÙ Ð ÕÙ × Ö ÓÖÖ Ò ÔÖÓ ÙÒ         Ý df count
× Ð ÓÒØ ÓÖ Ú × Ø ×º
                      B1                      B2
                                                            B4
               A           B             G          F
                                                             J                  B5

                                   E      H             I            K      M              N
                                        B3
               C           D                                 L                       O


                                  ÙÖ º¿ ÍÒ         Ö Ó ÓÒ ×Ù× ÐÓÕÙ ×
       ÓÒ× Ö ÑÓ× ÙÒ ÒÓ Ó Ù ÐÕÙ Ö vº × × Ò Ð Ô Ö Ð ÒØ Ò Ñ ÒØÓ ÔÖ Ò Ö ÕÙ
ÙÒ ÐÐ Ñ Ö ÙÖ× Ú           scc(v,...) Ö ÒØ Þ   × Ù Ö Ö ÒØ Ö Ñ ÒØ Ð ÐÓÕÙ Ð ÕÙ
Ô ÖØ Ò vº ÌÓÑ ÑÓ× Ð Ö Ó Ð ¬ ÙÖ º¿ Ý ÑÔÐ ¬ÕÙ ÑÓ× Ú Ö × ÐÐ Ñ ×º Ë Ð
ÐÐ Ñ Ó ÙÖÖ ×Ó Ö Ð ÒÓ Ó Å¸ ÒØÓÒ × ×Ø ×ÓÐÓ × × Ù Ö ÙÒ ×ÓÐÓ ÐÓÕÙ ¸ Ð B5º Ë
Ð ÐÐ Ñ Ó ÙÖÖ ×Ó Ö H¸ ÒØÓÒ × × × Ù Ö Ò ÐÓ× ÐÓÕÙ × B3¸ B4 Ý B5º Ë Ð ÐÐ Ñ
Ó ÙÖÖ ×Ó Ö ¸ ÒØÓÒ × × × Ù Ö Ò ØÓ Ó× ÐÓ× ÐÓÕ٠׺ ËÙÖ ¸ Ô٠׸ Ð ÔÖ ÙÒØ Ü ×Ø
  Ð ÙÒ Ñ Ò Ö        Ð Ñ Ø Ö Ð ÐÓÕÙ × Ö¸ Ù Ò Ó Ò×Ô ÓÒ ÑÓ× ÙÒ Ö Ó w → x¸
   ÓÑÓ ÔÓ ÑÓ× × ÖÒ Ö × w Ý x ר Ò Ó ÒÓ Ò Ð Ñ ×ÑÓ ÐÓÕÙ
     Ä ×ÓÐÙ ÓÒ Ù × Ù ÖØ ÔÓÖ Ì Ö Ò ¿ ¸ ¾¼ Ý × × ÖÚ           ÐÓ× ÑÔÓ× Ý ÐÓÛ
  ×ØÙ Ó× Ò Ü º º½ ´Ô Ò ¿ µ¸ ´ º½µ Ô º             Ö     Ð Ð ÙÐÓ ÐÓ× ÔÙÒØÓ×
  ÓÖØ Ó ÖØ ÙÐ ÓÒº
      Ò ÕÙ Ð ÒØÓÒ ×¸ ¬Ò ÑÓ× (v) ÓÑÓ Ð ÓÖ Ò Ò ÕÙ × Ú × Ø Ó Ð ÒÓ Ó v ÔÓÖ ÙÒ
Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ         Ý ÐÓÛ(v) ÓÑÓ Ð Ñ Ò ÑÓ ÒØÖ ØÓ Ó× ÐÓ× ÒÓ Ó× ÓÒ Ø Ó×
   v ÔÓÖ Ñ ÒÓ× ÓÒ ÓÖÑ Ó× ÔÓÖ Ö Ó×     Ö ÓÖ × Ý ÒÓ¹ Ö ÓÖ ×º ÈÙ ×ØÓ ÕÙ × ØÖ Ø
     ÙÒ Ö Ó¸ ÒÓ Ö ÕÙ Ö ÑÓ× Ô Ò× Ö Ò Ö Ó× ÒÓ¹ Ö ÓÖ ×¸ × ÒÓ¸ Ñ × Ò¸ Ò ÒÓ Ó×
  Ð ÒÞ Ð ×º     ר ÑÓ Ó¸ ÐÓÛ(v) ÔÙ     ¬Ò Ö× Ñ × × ÑÔÐ ÓÑÓ
     ÐÓÛ(v) = Ñ Ò ÑÓ              Ð ÓÑÔÓÒ ÒØ Ù ÖØ Ñ ÒØ ÓÒ ÜÓ ÓÒ            × Ò Ù ÒØÖ v               ´ º µ
                     B1                      B2
                11,5 10,5                8,8       9,8      B4
               A          B             G          F
                                                             J 3,1             B5
                                  7,5               2,1              1,1   14,13         15,13
                                   E      H          I               K      M              N
         5,5                            12,12
               C          D 6,5         B3                   L 4,1                  O 13,13


   ÙÖ º¿ ÍÒ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ                        Ð       Ö Ó       Ð ¬ ÙÖ º¿ º                ÒÓ Ó ×Ø
Ø ÕÙ Ø Ó ÓÒ Ð Ô Ö , ÐÓÛº
    ÁÒ Ô Ò ÒØ Ñ ÒØ Ð ÒÓ Ó ÔÓÖ ÓÒ Ò ÑÓ× ÙÒ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ                ¸ Ð
Ú ÐÓÖ ÐÓÛ(v)¸ Ô Ö Ù ÐÕÙ Ö ÒÓ Ó v¸    ÓÖÖ ×ÔÓÒ Ö× ÓÒ Ð Ú ÐÓÖ (v) Ð ÔÖ Ñ Ö ÒÓ Ó
Ú × Ø Ó ÒØÖÓ Ð ÐÓÕÙ º Ê ØÓÑ Ò Ó Ð ÑÔÐÓ Ð ¬ ÙÖ º¿ ¸ ÙÒ Ú ÒØÙ Ð ÓÖ Ò
Ú × Ø ÔÙ       Ü Ñ Ò Ö× Ò Ð ¬ ÙÖ º¿ º Ð ÓÖ Ò ÔÖ Ñ Ö × ÐÐ Ñ × scc(v,...)
680                                                         Cap´
                                                               ıtulo 7. Grafos



Ö Ð Þ Ó ÔÓÖ strongly connected components() × ÑÙ ×ØÖ Ò Ð ¬ ÙÖ º ¼º    Ö ÓÐ
 ÓÖÖ ×ÔÓÒ ÙÒ ÐÐ Ñ         × Ð for strongly connected components() Ñ ÒØÖ ×
ÕÙ       Ö ÓÐ ÑÙ ×ØÖ ÐÓ× ÐÓÕÙ × ÕÙ × × Ù Ö Ò Ò       ÐÐ Ñ      scc()º

           K-(1,1)                 C-(5,5)                O-(13,13)

           I-(2,1)                 D-(6,5)                M-(14,13)

           J-(3,1)                 E-(7,5)                N-(15-13)

           L-(4,1)      G-(8,8)   B-(10,5) H-(12,12)

                        F-(9,8)   A-(11,5)


   ÙÖ º ¼ Ö ÓÐ × Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ        ÔÖ Ð Ö Ó            Ð ¬ ÙÖ º¿ º
ÒÓ Ó ÑÙ ×ØÖ Ð Ø ÕÙ Ø Ð ÒÓ Ó Ý ×Ù× ÒÙÑ ÖÓ× Ý ÐÓÛº
        Ð ¬ ÙÖ º ¼ ÔÓ ÑÓ×          Ö Ð ÙÒ × Ó × ÖÚ ÓÒ × Ò ÔÓ×    × ÖÒ Ö × ÙÒ Ô Ö
   ÒÓ Ó× ×Ø Ò Ó ÒÓ ÒØÖÓ Ð Ñ ×ÑÓ ÐÓÕÙ
   ½º Ë Ð Ö ÓÐ Ø Ò ÙÒ ×ÓÐ Ö Ñ ¸ ÒØÓÒ × ×Ø ÓÒØ Ò ÙÒ ×ÓÐÓ ÐÓÕÙ º ר × Ð
         ×Ó ÐÓ× ÐÓÕÙ × B4 Ý B5º
   ¾º Ë Ð Ö ÓÐ ÓÒØ Ò Ú Ö × Ö Ñ ×¸ ÒØÓÒ × Ý Ø ÒØ × Ö Ñ × ÓÑÓ ÐÓÕ٠׺ ר ×
       Ð ×Ó Ð × ÙÒ Ó Ö Óи ÙÝ Ö Þ × ¸ Ð Ù Ð ÓÒØ Ò ÐÓ× ÐÓÕÙ × B1¸ B2 Ý B3º
        Ò ×Ø ×Ó¸ ÓÑÓ ×Ø Ò Ù ÑÓ× ÙÒ ÐÓÕÙ Ð ÓØÖÓ ÍÒ Ó × ÖÚ ÓÒ Ñ × Ø ÐÐ
      ÒÓ× Ô ÖÑ Ø ÒØ ¬ Ö ÕÙ ÐÓ× ÐÓÕÙ × B2 Ý B3 × Ò Ù ÒØÖ Ò Ò Ö Ñ × × Ð ÒÓ Ó
        º     ÕÙ ÒÓ× Ô Ö Ð ÔÖ ÙÒØ ÓÑÓ ÒØ ¬ ÑÓ× Ð Ò Ó ÙÒ Ö Ñ º Ä
      Ö ×ÔÙ ×Ø ר           ÔÓÖ Ð Ô Ö < (v), ÐÓÛ(v) >º        Ò Ó Ö Ñ ¸ ÕÙ ×
       ÓÖÖ ×ÔÓÒ Ð Ò Ó ÙÒ ÐÓÕÙ ¸ × ÒØ ¬ ÔÓÖ Ð               Ó ÕÙ (v) = ÐÓÛ(v)º
        ×ØÓ × Ò Ô Ò ÒØ Ð ÓÖÑ Ð Ö Ñ º
         Ó ÙÒ ÒÓ Ó v¸ Ð Ú ÐÓÖ (v) × Ð ÙÐ Ð Ñ ÒØ ÙÒ ÓÒØ ÓÖ Ú × Ø ×¸ Ñ ÒØÖ ×
ÕÙ Ð Ú ÐÓÖ ÐÓÛ(v) × Ð ÙÐ Ð ÔÓÖ Ö ØÓÖÒÓ Ö ÙÖ× ÓÒ ´ ØÖ µº ÈÓÖ ÐÓ× ÑÓÑ ÒØÓ׸
 ÓÒ ÓÖÑ ÑÓ×ÒÓ× ÓÒ ×ÙÑ Ö ÕÙ × Ð ÙÐ Ð Ú ÐÓÖ ÐÓÛ(v) Ý ×ØÙ ÑÓ× ÙÒ ÔÖ Ñ Ö Ð Ñ º
Lema 7.4    Ë ÙÒ Ö Ó G =< V, E > Ý T =< V, E > ÙÒ Ö ÓÐ Ö ÓÖ Ò ÔÖÓ ÙÒ
 Ù ÐÕÙ Ö º Ë v ∈ V ÙÒ ÒÓ Ó Ù ÐÕÙ Ö       G Ý Tº Ë   (v) = ÐÓÛ (v)¸ ÒØÓÒ × ∀w ∈
G, T | ÐÓÛ (w) = ÐÓÛ (v) =⇒ w Ô ÖØ Ò Ð Ñ ×ÑÓ ÐÓÕÙ vº
Demostraci´n (Por contradicci´n) ËÙÔÓÒ Ö ÕÙ Ü ×Ø ÙÒ ÒÓ Ó w ÓÒ ÐÓÛ (w) =
              o                   o
ÐÓÛ(v) ÕÙ ÒÓ Ô ÖØ Ò Ð Ñ ×ÑÓ ÐÓÕÙ v ÓÒØÖ           ´ º µ¸ Ð Ù Ð ÒÙÒ      ÐÓÛ(w)
 ÓÑÓ Ð Ñ Ò ÑÓ         Ð ÐÓÕÙ ÓÒ × Ò Ù ÒØÖ w
      ×ÙÑ Ò Ó ÕÙ Ø Ò ÑÓ× ÙÒ Ö Ó ÓÒ ×Ù× Ú ÐÓÖ × Ý ÐÓÛ Ð ÙÐ Ó׸ ÔÓ ÑÓ×
  ר Ò Ù Ö ×Ù× ÐÓÕÙ × Ð × Ù ÒØ ÑÓ Ó
   ½º       ÒÓ Ó v ÓÒ (v) = ÐÓÛ(v) × Ò Ù ÒØÖ Ò ÙÒ ÐÓÕÙ ×Ø ÒØÓº Ü ×Ø Ò Ø ÒØÓ×
        ÐÓÕÙ × ÓÑÓ ÒÓ Ó× ÕÙ × Ø × Ò (v) = ÐÓÛ(v)º
7.7. T´picos sobre grafos dirigidos
          o                                                                                 681



     ¾º ÈÓÖ        ÐÓÕÙ ÒØ ¬ Ó Ñ ÒØ ÙÒ ÒÓ Ó v ÓÒ (v) = ÐÓÛ(v)¸ ÒØ ¬ Ö
         ÕÙ ÐÐÓ× ÒÓ Ó× w ÓÒ ÐÓÛ(w) = ÐÓÛ(v) רÓ× Ô ÖØ Ò Ò Ð Ñ ×ÑÓ ÐÓÕÙ v
      À Ý ÓØÖÓ ÓÒÓ Ñ ÒØÓ¸ × Ò Ð Ô Ö Ð Ð ÓÖ ØÑÓ Ý ×Ù ¬ Ò ¸ ÕÙ × Ö Ø Ö Þ
    Ñ ÒØ Ð ÔÖÓÜ ÑÓ Ð Ñ º
    Lema 7.5     Ë ÙÒ Ö Ó G =< V, E > Ý T =< V, E > ÙÒ Ö ÓÐ Ö ÓÖ Ò ÔÖÓ¹
     ÙÒ         Ù ÐÕÙ Ö º Ë v ∈ V ÙÒ ÒÓ Ó Ù ÐÕÙ Ö             G Ý Tº Ë          (v) = ÐÓÛ (v)¸ Ò¹
    ØÓÒ × Ð ÐÓÕÙ ÕÙ Ð Ñ Ø v ר ÒØ Ö Ý Ü Ø Ñ ÒØ ÓÒØ Ò Ó Ò ÙÒ × Ù Ò
    < (v, (v), ÐÓÛ (v)) , (w, (w), ÐÓÛ (w)) , . . . , (z, (z), ÐÓÛ (v)) > ÕÙ ÓÑ ÒÞ Ò Ð
    ÔÖ Ñ Ö ÒÓ Ó Ú × Ø Ó Ð ÐÓÕÙ Ý ÙÐÑ Ò Ò ÙÒ Ó Ð Ö Óк
    Demostraci´n È Ö
                  o          ÑÓ×ØÖ Ö ÕÙ Ð × Ù Ò ÓÒØ Ò ØÓ Ó× ÐÓ× ÒÓ Ó× Ð ÐÓÕÙ ÐÓ
           ÑÓ× ÔÓÖ ÓÒØÖ    ÓÒº ËÙÔÓÒ ÑÓ× ÕÙ Ü ×Ø Ð × Ù Ò Ô ÖÓ ÕÙ ×Ø ÒÓ ÓÒØ Ò
        ØÓ Ó ÐÓÕÙ º ÈÓÖ Ð ¬Ò ÓÒ ´ º µ Ð × Ù Ò                      ÓÑ ÒÞ Ö ÔÓÖ ÙÒ ÒÓ Ó v Ð
      ÐÓÕÙ ÓÒ Ð Ú ÐÓÖ Ñ × Ó ×Ù ÐÓÕÙ ¸ ÔÙ × × ØÖ Ø Ð ÔÖ Ñ Ö ÒÓ Ó Ú × Ø Ó Ò Ð
      ÐÓÕÙ º ÈÓÖ Ð Ð Ñ º ØÓ Ó ÒÓ Ó w Ð ÐÓÕÙ ÕÙ ÓÒØ Ò v Ø Ò ÐÓÛ(w) = ÐÓÛ(v)º
         ÓÖ Ò¸ ÔÙ ×ØÓ ÕÙ ØÓ Ó ÒÓ Ó w ÙÒ ÐÓÕÙ × Ð ÒÞ Ð × v¸ Ð Ö ÓÖÖ Ó Ò
    ÔÖÓ ÙÒ          × Ù Ö Ö ÙÖ× Ú Ñ ÒØ ØÓ Ó Ð ÐÓÕÙ ¸ ÔÓÖ ÐÓ ÕÙ ØÓ Ó× ×Ù× ÒÓ Ó× ×Ø Ò Ò
    Ð × ÙÒ º
          È Ö ÙÐÑ Ò Ö¸     ÑÓ× ÑÓ×ØÖ Ö ÕÙ × Ð × Ù Ò ÑÔ Þ Ý Ø ÖÑ Ò Ò ÒÓ Ó× ÓÒ
      Ð Ñ ×ÑÓ ÐÓÛ¸ ÒØÓÒ × ×Ø ÒÓ ÓÒØ Ò Ò Ò ÙÒ ÒÓ Ó ÓØÖÓ ÐÓÕÙ º ËÙÔÓÒ ÑÓ× ÕÙ
      Ü ×Ø ÙÒ × Ù Ò (v, (v), ÐÓÛ (v), . . . , (x, (x), ÐÓÛ(x))), . . . , (z, (z), ÐÓÛ(v)) Ó × ¸ Ð
    × Ù Ò Ø Ò Ð Ñ ÒÓ× ÙÒ ÒÓ Ó x ÓÒ ÐÓÛ(x) = ÐÓÛ(v)º ×ØÓ × Ò ¬ Ö ÕÙ × Ú × ØÓ ÙÒ
    ÒÓ Ó ÓØÖÓ ÐÓÕÙ ÓÒ ÐÓÛ(x) Ý ÐÙ Ó × Ö Ö ×Ó Ð ÐÓÕÙ ÓÒ ÐÓÛ(v)¸ ÐÓ ÕÙ ÓÒØÖ
    ÕÙ x ר Ò ÓØÖÓ ÐÓÕÙ ¸ ÔÙ × × Ð ÒÞ Ð × Ð ÐÓÕÙ ÓÒ ÐÓÛ(v)
          Ä × Ù Ò ÕÙ ÓÒ ÓÖÑ Ð ÐÓÕÙ × × Ù Ö Ö ÙÖ× Ú Ñ ÒØ                          ÓÐ × ÙÒ
    ÐÐ Ñ × scc(v,...)→ scc(w...)→ · · · → scc(z,...)º Ð Ñ Ö ÖÐÓ                          ר ÓÖÑ
    Ö Ú Ð Ð ÔÖ Ò Ô Ó × Ò Ð Ð Ð ÓÖ ØÑÓ¸ Ù Ð Ô ÖÑ Ø ÒØ ¬ Ö ÔÐ Ò Ñ ÒØ Ð ÐÓÕÙ
    ÙÒ Ô Ð ÒÓ Ó×             ØÖ Ö ÙÖ× ÚÓº
           Ð ÒØÖ Ö scc(v,...) × ÑÔ Ð v
½    ÁÒ Ó Ö ÓÖÖ Ó ×Ó Ö v ½ ≡                                   ´           ¿ µ ¾
      push_in_stack<GT>(stack, v);
    Ä ÔÐ      × ÒÓÑ Ò stack Ý × ÙÒ Ô Ö Ñ ØÖÓ ÔÓÖ Ö Ö Ò           scc()¸ ÐÓ ÕÙ Ð
     ÐÓ Ð      ØÓ × Ð × ÐÐ Ñ ×º
       ÍÒ     Ú Þ Ö ÓÖÖ Ó× Ò ÔÖÓ ÙÒ       ÐÓ× ÒÓ Ó× Ý ÒØ × v¸ × ÔÖ ÙÒØ ÔÓÖ (v) =
    ÐÓÛ(v)º   Ë × ÖØÓ¸ ÒØÓÒ × Ð Ô Ð ÓÒØ Ò Ð × Ù Ò z, y, . . . , w, v ´ ÒÚ ÖØ µ¸ ÔÓÖ ÐÓ
    ÕÙ ÔÓ       ÑÓ׸ ÓÒ × ÙÖ ¸ × ÑÔ Ð Ö Ð ÐÓÕÙ ×Ø ÕÙ × ÕÙ ÑÓ× v
½    ÎÖ¬      Ö × (v) = ÐÓÛ(v) Ý Ú ÒØÙ ÐÑ ÒØ × ÑÔ Ð Ö ÐÓÕÙ ½ ≡ ´ µ
      if (low <GT> (v) == df <GT> (v)) // ¿primer nodo visitado del bloque?
        {     // s´ ==> saque los nodos del bloque que est´n en pila
                  ı                                       a
          const size_t & block_idx = list.size();
          list.append(GT());
          GT & block = list.get_last();
          while (true)     // sacar el bloque de la pila hasta sacar a v
            {
              typename GT::Node * p = pop_from_stack<GT>(stack);
              typename GT::Node * q = block.insert_node(p->get_info());
682                                                                Cap´
                                                                          ıtulo 7. Grafos



                  GT::map_nodes(p, q);
                  NODE_COUNTER(p) = NODE_COUNTER(q) = block_idx;
                  if (p == v)
                    break;
              }
          }
      Ð Ú ÐÓÖ block idx × Ð ÒÙÑ ÖÓ ÐÓÕÙ º ר Ò Ô ÖÑ Ø ¸ ÐÙ Ó        Ö Ö ÓÖÖ Ó
     ÒØ Ö Ñ ÒØ Ð Ö Ó¸ Ö ÓÒÓ Ö ÐÓ× ×Ø ÒØÓ× ÐÓÕ٠׺
         Ä Ø ÖÑ Ò ÓÒ ÐÓÛ(v) Ø Ñ Ò ×        ÔÓÖ    ØÖ º Ù Ò Ó Ú × Ø ÑÓ× ÙÒ ÒÓ Ó
    v¸ Ð Ú ÐÓÖ     ÐÓÛ(v) × Ò   Ò (v)
¾    ÁÒ Ó Ö ÓÖÖ Ó ×Ó Ö v ½ +≡                       ´    ¿ µ   ½
      NODE_BITS(v).set_bit(Aleph::Depth_First, true);
      df<GT>(v) = low<GT>(v) = df_count++;
    ÄÙ Ó × Ö Ú × Ò ÐÓ× Ö Ó× v Ý × ÒÚÓ Ö ÙÖ× Ú Ñ ÒØ                 scc(w,...) ÔÓÖ    ÒÓ Ó
    w ÕÙ ×    ÓÒ ÜÓ v Ý ÕÙ ÒÓ Ý × Ó Ú × Ø Ó
¾    Ê ÓÖÖ Ö Ò ÔÖÓ ÙÒ      Ð ÓÑÔÓÒ ÒØ Ù ÖØ Ñ ÒØ ÓÒ ÜÓ           v ¾ ≡      ´        ¿ µ
            // recorrer en profundidad todos los nodos conectados a v
          for (Node_Arc_Iterator<GT, SA> it(v); it.has_current(); it.next())
          {
            typename GT::Node * w = it.get_tgt_node();
            if (not IS_NODE_VISITED(w, Aleph::Depth_First))
              {
                __scc <GT, SA> (g, list, stack, w, df_count);
                low <GT> (v) = Aleph::min(low <GT> (v), low <GT> (w));
              }
            else if (is_node_in_stack<GT>(w))
              // si est´ en pila ==> v fue visitado antes que p
                       a
              low <GT> (v) = Aleph::min(low <GT> (v), df <GT> (w));
          }
    Í× × Node Arc Iterator     º
      Ð× ÐÖ       scc(g, list, stack, w, df count)¸ w Ý Ø Ò    Ð ÙÐ Ó ×Ù ÐÓÛ(w)¸ ÔÓÖ ÐÓ
    ÕÙ ×Ø × ÓØ ÓÒ ÐÓÛ(v) Ô Ö Ú Ö ¬ Ö × × Ò Ù ÒØÖ ÙÒ Ú ÐÓÖ Ñ ÒÓÖ ÕÙ Ð ØÙ к
    Ë wÝ          × Ó Ú × Ø Ó × ÓØÖ Ø Ö ÓÒ strongly connected components()¸
     ÒØÓÒ ×        ÑÓ× Ú Ö ¬ Ö ×Ù ÐÓÛ(w) ×ÓÐÓ × w Ô ÖØ Ò Ð ÐÓÕÙ v¸ ÐÓ ÕÙ Ú Ö ¬ ÑÓ×
    ÔÓÖ Ð ÔÖ × Ò        w ÒÐ ÔÐ º
         È Ö ÐÑ Ò Ö ÐÓ× Ú ÐÓÖ × Ý ÐÓÛ ÑÔÐ Ö ÑÓ× Ð ÓÒØ ÓÖ Ý Ð ÓÓ ¸ Ü Ø Ñ ÒØ
        Ð Ñ ×Ñ Ñ Ò Ö ¸ Ý ÓÒ Ð × Ñ ×Ñ × ÖÙØ Ò ×¸ ÕÙ ÑÔÐ ÑÓ× Ò Ü º½ ´Ô Ò           µº
         È Ö ÙÐÑ Ò Ö¸ Ð ÙÐØ Ñ Ô ÖØ Ð Ð ÓÖ ØÑÓ Ì Ö Ò ÓÒ× ×Ø Ò ÓÒרÖÙ Ö ÐÓ× ×Ù ¹
        Ö Ó× Ñ Ô Ó× ÐÓ× ÐÓÕÙ ×
¾      ÓÒרÖÙ Ö Ý Ñ Ô Ö ÐÓ× ÐÓÕÙ × ¾ ≡                              ´ µ
            // recorrer cada uno de los subgrafos parciales y a~adir sus arcos
                                                               n
      for (typename DynDlist<GT>::Iterator i(block_list); i.has_current(); i.next())
        {     // recorrer todos los nodos del bloque
          GT & block = i.get_current();
          for (typename GT::Node_Iterator j(block); j.has_current(); j.next())
            {
              typename GT::Node * gsrc = j.get_current(); // nodo actual del bloque
                  // recorrer los arcos de gsrc
7.7. T´picos sobre grafos dirigidos
          o                                                                           683



                   for (Node_Arc_Iterator<GT, SA> k(gsrc); k.has_current(); k.next())
                     {
                       typename GT::Node * gtgt = k.get_tgt_node();
                       typename GT::Arc * ga    = k.get_current_arc();
                       if (NODE_COUNTER(gsrc) != NODE_COUNTER(gtgt)) // ¿arco inter-bloque?
                         {    // s´ ==> a~´dalo a arc_list
                                  ı      na
                           arc_list.append(ga);
                           continue;
                         }
                           // insertar y mapear el arco en el sub-bloque
                       typename GT::Node * bsrc = (typename GT::Node*) NODE_COOKIE(gsrc);
                       typename GT::Node * btgt = (typename GT::Node*) NODE_COOKIE(gtgt);
                       typename GT::Arc * ba    = block.insert_arc(bsrc, btgt, ga->get_info());
                       GT::map_arcs(ga, ba);
                     }
               }
          }
    Í× × DynDlist ¿ ¸ Node Arc Iterator        ¸ Ò   Node Iterator   º
        strongly connected components() Ö Ð Þ ÙÒ ØÖ    Ó Ð ÓÖ Ó×Ó¸ Ô ÖÓ Ö ÒØ Þ
    Ó Ø Ò Ö ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ× ÓÑÓ ×Ù Ö Ó׺ Ú ×¸ ×ÓÐÓ × ÔÖ Ö Ð
       ÒØ ¬ Ö ÐÓ× ÓÑÔÓÒ ÒØ × × Ò Ò ×      Ñ ÒØ Ò ÖÐÓ× ÓÑÓ Ö Ó׺ Ò × ×Ó¸ ÔÓ ¹
    ÑÓ× ÔÐ ÒØ Ö Ð × Ù ÒØ Ú Ö× ÓÒ
¿     ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ×      +≡
           template <class GT, class SA> inline void
      strongly_connected_components(GT &                                      g,
                                    DynDlist<DynDlist<typename GT::Node*> > & blocks)
      {
          ÁÒ       ÐÞ ÖÌ Ö Ò
          for (typename GT::Node_Iterator it(g); curr_df < n; it.next())
            {
              typename GT::Node * v = it.get_current();
              if (not IS_NODE_VISITED(v, Aleph::Depth_First)) // ¿p visitado?
                __scc<GT, SA>(g, blocks, stack, v, curr_df);
            }
      }
    Í× × DynDlist ¿ Ò      Node Iterator   º
     Ä     Ö Ò ¸ Ö ×Ô ØÓ Ð Ú Ö× ÓÒ ÕÙ ×Ø ÓÖ ÑÓ× × ÖÖÓÐÐ Ó¸ ×ØÖ Ò ÕÙ
     Ò ÐÙ Ö       Ð ÙÐ Ö Ý Ö ØÓÖÒ Ö ÙÒ Ð ×Ø ×Ù Ö Ó׸ ØÖ       ÑÓ× ÓÒ ÙÒ Ð ×Ø Ð ×Ø
    ÒÓ Ó×       Ð ×Ø ÓÒØ Ò ÐÓ× ÒÓ Ó× Ô ÖØ Ò ÒØ × ÙÒ ÓÑÔÓÒ ÒØ º
         ר Ú Ö× ÓÒ ×Ó Ö Ö             strongly connected components() Ø Ñ Ò Ö ÕÙ Ö
    ×Ó Ö Ö Ö scc() Ô Ö ÕÙ Ö              Ð Ð ×Ø Ð ×Ø ×
¿    ÊÙØ Ò × ×Ø Ø × Ì Ö Ò             +≡
          template <class GT, class SA> inline
      void __scc(GT &                                      g,
                 DynDlist<DynDlist<typename GT::Node*> > & list,
                 DynListStack<typename GT::Node*> &        stack,
                 typename GT::Node *                       v,
                 long &                                    df_count)
      {
684                                                              Cap´
                                                                    ıtulo 7. Grafos



      ÁÒ Ó Ö ÓÖÖ Ó ×Ó Ö v ½
      Ê ÓÖÖ Ö Ò ÔÖÓ ÙÒ       Ð ÓÑÔÓÒ ÒØ Ù ÖØ Ñ ÒØ ÓÒ ÜÓ      v     ¾
      Î Ö ¬ Ö × (v) = ÐÓÛ(v) Ý Ú ÒØÙ ÐÑ ÒØ ÐÐ Ò Ö Ð ×Ø
  }
Í× × DynDlist ¿ Ò   DynListStack   ½½ º
Ä ×ØÖÙ ØÙÖ × × Ò ÐÑ ÒØ ÒØ            Ð ÒØ Ö ÓÖÑ ÒØ × ÖÖÓÐÐ        ¸ × ÐÚÓ ÔÓÖ Ð ÙÐØ ÑÓ
 ÐÓÕÙ ¸ Î Ö ¬ Ö × (v) = ÐÓÛ(v) Ý Ú ÒØÙ ÐÑ ÒØ ÐÐ Ò Ö Ð ×Ø           ¸ Ð Ù Ð× × Ö
  Ð × Ù ÒØ ÑÓ Ó
 Î Ö ¬ Ö × (v) = ÐÓÛ(v) Ý Ú ÒØÙ ÐÑ ÒØ ÐÐ Ò Ö Ð ×Ø  ≡              ´ ¿ µ
  if (low <GT> (v) == df <GT> (v)) // ¿primer nodo visitado del bloque?
    {     // s´ ==> saque los nodos del bloque que est´n en pila
              ı                                       a
      list.append(DynDlist<typename GT::Node*>());
      DynDlist<typename GT::Node*> & l = list.get_last();
      while (true)     // sacar el bloque de la pila hasta sacar a v
        {
          typename GT::Node * p = pop_from_stack<GT>(stack);
          l.append(p);
          if (p == v)
            break;
        }
    }
Í× × DynDlist ¿ º
    ÆÓØ ÑÓ× ÕÙ ×Ø Ú Ö× ÓÒ strongly connected components() Ø Ò ×Ø ÒØ × Ò¹
Ø Ó ÔÖ Ø Óº Ò ÔÖ Ñ Ö ÐÙ Ö¸ ÓÑÓ ÒÓ Ö ÕÙ Ö ÓÒרÖÙ Ö ×Ù Ö Ó× Ñ Ô Ó× ÐÓ×
  ÐÓÕ٠׸ × Ñ × ¬ ÒØ Ò Ø ÑÔÓ Ý ×Ô Óº Ò × ÙÒ Ó ÐÙ Ö¸ Ð Ñ ÖÓ    Ó ×ÔÖÖ
ÐÓ× ÒÓ Ó× Ð Ö Ó Ò ÓÒ ÙÒØÓ× × ÙÒ ×Ù Ô ÖØ Ò Ò Ð ÓÑÔÓÒ ÒØ Ù ÖØ Ñ ÒØ ÓÒ ÜÓ
 ÖÖÓ      ר ÒØ Ò ÓÖÑ ÓÒ ×Ó Ö Ð ÓÒ Ø Ú º Ò Ð Ó ÙÖÖ Ò ¸ ØÓ Ó Ð ØÖ Ó ÕÙ
Ý Ö Ð Þ ÑÓ× Ñ Ô Ö ÐÓ× ÐÓÕÙ × Ò ×Ù Ö Ó× ÔÙ         Ö× ÓÒ Ð Ð ×Ø Ð ×Ø ׺ Ð
ÔÙÒØÓ ÕÙ × ÕÙ ÓÒ Ø Ò ×ÓÐÓ Ø Ò Ö ÙÒ ÒÓ Ó Ð ÓÑÔÓÒ ÒØ Ù ÖØ Ñ ÒØ ÓÒ ÜÓ Ý ×
Ø Ò ÔÓ× Ð           ÔÖÓ × ÖÐÓ × Ò Ø Ö ÐÓ× Ñ × ÓÑÔÓÒ ÒØ ׺

7.7.4   Prueba de aciclicidad
  Ò Ü º º ´Ô Ò ½ µ × Ò ÑÓ× Ð ÔÖ Ñ Ø Ú is grapph acyclique()¸ ר Ò          Ú Ö¹
 ¬ Ö ÔÓÖ Ð Ü ×Ø Ò           ÐÓ Ò ÙÒ Ö Óº ÓÑÓ ÕÙ ÐÐ ÖÙØ Ò × × Ò Ð Ô ÒØ Ó
ÐÓ× ÒÓ Ó׸ ÐÐ ÒÓ ÙÒ ÓÒ Ô Ö         Ö Ó׺ Ù Ò Ó × Ò Ù ÒØÖ ÙÒ ÒÓ Ó ÕÙ Ý      × Ó
Ô ÒØ Ó¸ ÒÓ Ý Ñ Ò Ö         × Ö × ÐÓ Ù ÔÓÖ ÙÒ ÐÓ Ó ÔÓÖ ÔÖÓ Ò         × ÙÒ ÒÓ Ó
Ô ÖØ Ò ÒØ ÓØÖÓ ÐÓÕÙ º
    ÇØÖ ÔÖ Ñ Ø Ú ÕÙ × ÖÖÓÐÐ ÑÓ× Ò Ü º º ´Ô Ò ½ µ Ù test cycle()º ÈÓ ÑÓ×
Ú Ö ¬ Ö ÔÓÖ Ð     Ð      ÐÐ Ñ Ò Ó test cycle() ÔÓÖ    ÒÓ Ó Ð Ö Ó ×Ø Ù Ö Ö
ØÓ Ó× ÐÓ× ÒÓ Ó× Ó Ò ÓÒØÖ Ö ÙÒ ÐÓº ר Ò ÓÕÙ ØÓÑ Ö O(V × E)º
     Ð Ð ÓÖ ØÑÓ Ì Ö Ò ÔÙ          ÑÔÐ Ö× Ô Ö Ø ÖÑ Ò Ö ¬ ÒØ Ñ ÒØ × ÙÒ Ö Ó
Ø Ò Ó ÒÓ ÐÓ׺ Ë Ô ÖØ ÑÓ× Ð          Ó ÕÙ ÙÒ ÐÓÕÙ ÓÖÞ Ñ ÒØ            Ø Ò Ö ÐÓ׸
 ÒØÓÒ × Ð      Ù ÓÒ Ð Ð ÓÖ ØÑÓ Ì Ö Ò           Ö Ö Ø Ñ ÒØ      Ö ×ÔÓÒ Ö ÔÓÖ ×Ù
 Ü ×Ø Ò º Ò ÓØÖ × Ô Ð Ö ×¸ × Ð ÒØ            ÐÓÕÙ × ÙÒ Ö Ó × Ñ ÒÓÖ ÕÙ Ð
ÒÓ Ó׸ ÒØÓÒ × Ü ×Ø Ð Ñ ÒÓ× ÙÒ ÐÓ¸ ÔÙ × ÙÒ ÓÑÔÓÒ ÒØ Ù ÖØ Ñ ÒØ ÓÒ ÜÓ ÓÒØ Ò
ÙÒ ÐÓº
7.7. T´picos sobre grafos dirigidos
      o                                                                     685



     Ò Ø ÖÑ ÒÓ× Ð Ð ÓÖ ØÑÓ¸ ×ØÓ ÕÙ Ú Ð       Ø Ø Ö × ÙÒ × Ù Ò   ÔÓÔ× Ò Ð
 ÐÓÕÙ Î Ö ¬ Ö × (v) = ÐÓÛ(v) Ý Ú ÒØÙ ÐÑ ÒØ × ÑÔ Ð Ö ÐÓÕÙ ½ ÓÒØ Ò
Ñ × ÙÒ ÒÓ Óº Ë Ð Ð ÞÓ ÜØÖ Ð Ñ ÒÓ× Ó× ÒÓ Ó׸ ÒØÓÒ × Ø Ò ÑÓ× ÙÒ ÓÑÔÓÒ ÒØ
Ù ÖØ Ñ ÒØ ÓÒ ÜÓ      Ó× Ó Ñ × ÒÓ Ó׸ Р٠и ÔÓÖ ¬Ò ÓÒ¸ ÓÒØ Ò ÙÒ ÐÓº
   Ë ÙÒ Ð × ÓÒ× Ö ÓÒ ×         ׸ Ð ÖÙØ Ò Ö ÙÖ× Ú Ú Ò Ò
  ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ×       +≡                   ¿
      template <class GT, class SA> inline static
  bool __ida(GT &                               g,
             DynListStack<typename GT::Node*> & stack,
             typename GT::Node *                v,
             long &                             df_count)
  {
    push_in_stack <GT> (stack, v);
    NODE_BITS(v).set_bit(Aleph::Depth_First, true);
    df <GT> (v) = low <GT> (v) = df_count++;
        // recorrer en profundidad todos los nodos conectados a v
    for (Node_Arc_Iterator <GT, SA> it(v); it.has_current(); it.next())
      {
        typename GT::Node * w = it.get_tgt_node();
        if (not IS_NODE_VISITED(w, Aleph::Depth_First))
          {
            if (__ida <GT, SA> (g, stack, w, df_count))
              return true;
            low <GT> (v) = Aleph::min(low <GT> (v), low <GT> (w));
          }
        else if (is_node_in_stack <GT> (w))
              // si est´ en pila ==> v fue visitado antes que p
                        a
          low <GT> (v) = Aleph::min(low <GT> (v), df <GT> (w));
      }
    if (low< GT> (v) == df <GT> (v)) // ¿primer nodo visitado del bloque?
      {     // s´ ==> verifique si tiene dos o m´s nodos
                ı                               a
        int i = 0;
        for (; true; ++i) // sacar el bloque de la pila hasta sacar a v
          {
            typename GT::Node * p = pop_from_stack <GT> (stack);
            if (p == v)
              break;
          }
        return i > 1; // si sacamos dos o m´s nodos entonces hay ciclo
                                           a
      }
    return false;
  }
Í× × DynListStack ½½   Ò   Node Arc Iterator      º
     ida() × ÙÒ ÖÙØ Ò ×Ø Ø º Ä                 Ù×Ó ÔÙ Ð Ó ×   ¬Ò ÓÑÓ
  ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ×             +≡
       template <class GT, class SA> inline
  bool is_digraph_acyclique(GT & g)
  {
    long curr_df   = 0; // contador de visitas
    const long & n = g.get_num_nodes();
686                                                             Cap´
                                                                   ıtulo 7. Grafos



      DynListStack<typename GT::Node*> stack; // pila de nodos que define rama
      for (Node_Iterator <GT, SA> it(g); curr_df < n; it.next())
        {
          typename GT::Node * v = it.get_current();
          if (not IS_NODE_VISITED(v, Aleph::Depth_First)) // ¿p visitado?
            if (__ida <GT, SA> (g, stack, v, curr_df)) // visita recursivamente a p
              return true;
        }
      return false;
  }
Í× × DynListStack ½½   Ò   Node Iterator   º
Ä Ù Ð Ø Ò Ð Ñ ×Ñ ×ØÖÙ ØÙÖ ÕÙ strongly connected components()º
     ר Ð ÓÖ ØÑÓ Ø ÖÑ Ò Ð Ü ×Ø Ò      ÐÓ× Ò ÙÒ Ö Ó Ò Ø ÑÔÓ O(V + E) Ý
 ÓÒ ÙÒ Ñ Ü ÑÓ ÓÒ×ÙÑÓ ×Ô Ó O(V)º

7.7.5    C´lculo de ciclos en un digrafo
          a
  Ò Ð Ñ ×ÑÓ Ø Ò Ö Ð Ú Ö ÒØ Ð ×Ù ¹× ÓÒ ÔÖ        ÒØ ¸ ÔÓ ÑÓ× ÑÔÐ Ö Ð Ð Ó¹
Ö ØÑÓ Ì Ö Ò Ô Ö Ð ÙÐ Ö Ø Ú Ý ¬ ÒØ Ñ ÒØ ÙÒ ÐÓ Ò ÙÒ Ö Óº
      Ù Ò Ó × ÑÓ× Ð Ô Ð Ò Ð ÐÓÕÙ Î Ö ¬ Ö × (v) = ÐÓÛ(v) Ý Ú ÒØÙ Ð¹
Ñ ÒØ × ÑÔ Ð Ö ÐÓÕÙ ½ ¸ ÓÒרÖÙ ÑÓ× ÙÒ Ö Ó ÙÜ Ð Ö ÕÙ Ñ Ô Ð ÓÑÔÓ¹
Ò ÒØ ÓÒ ÜÓº ËÓ Ö ×Ø ÓÑÔÓÒ ÒØ ¸ Ù× ÑÓ× ÙÒ ÐÓ Ñ ÒØ ÙÒ Ù×ÕÙ               Ò
ÔÖÓ ÙÒ      º Ò ÐÑ ÒØ ¸ Ñ ÒØ Ð Ñ Ô Ó¸ ÓÒרÖÙ ÑÓ× Ð Ñ ÒÓ ÓÖÖ ×ÔÓÒ ÒØ Ð
   ÐÓ
   ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ× +≡
      template <class GT, class SA> inline static
  bool __cc(GT &                               g,
            DynListStack<typename GT::Node*> & stack,
            typename GT::Node *                v,
            long &                             df_count,
            Path<GT> &                         path)
  {
    push_in_stack <GT> (stack, v);
    NODE_BITS(v).set_bit(Aleph::Depth_First, true);
    df <GT> (v) = low <GT> (v) = df_count++;
        // recorrer en profundidad todos los nodos conectados a v
    for (Node_Arc_Iterator <GT, SA> it(v); it.has_current(); it.next())
      {
        typename GT::Node * w = it.get_tgt_node();
        if (not IS_NODE_VISITED(w, Aleph::Depth_First))
          {
            if (__cc <GT, SA> (g, stack, w, df_count, path))
              return true;
            low <GT> (v) = Aleph::min(low <GT> (v), low <GT> (w));
          }
        else if (is_node_in_stack <GT> (w))
              // si est´ en pila ==> v fue visitado antes que p
                       a
          low <GT> (v) = Aleph::min(low <GT> (v), df <GT> (w));
      }
    if (low <GT> (v) == df <GT> (v)) // ¿primer nodo visitado del bloque?
7.7. T´picos sobre grafos dirigidos
      o                                                                          687



        { // saque nodos que est´n en pila e insertelos en un bloque auxiliar
                                a
          GT block; // grafo auxiliar
          DynMapAvlTree<typename GT::Node*, typename GT::Node*> table;
          while (true) // saca el componente y lo inserta en block
            {
              typename GT::Node * p = pop_from_stack<GT>(stack);
              typename GT::Node * q = block.insert_node(p->get_info());
              table.insert(q, p);
              table.insert(p, q);
              if (p == v)
                break;
            }
          if (block.get_num_nodes() == 1)
            return false; // si block s´lo tiene un nodo no hay ciclo
                                       o
              // terminanos de construir el bloque con los arcos
          for (typename GT::Node_Iterator j(block); j.has_current(); j.next())
            {
              typename GT::Node * bsrc = j.get_current(); // nodo actual del bloque
              typename GT::Node * gsrc = table[bsrc];
                  // recorrer los arcos de gsrc
              for (Node_Arc_Iterator<GT, SA> k(gsrc); k.has_current(); k.next())
                {
                  typename GT::Node * gtgt      = k.get_tgt_node();
                  typename GT::Node ** btgt_ptr = table.test(gtgt);
                  if (btgt_ptr == NULL) // ¿arco del bloque?
                    continue;
                  typename GT::Arc * ga = k.get_current_arc();
                  block.insert_arc(bsrc, *btgt_ptr, ga->get_info());
                }
            }
              // buscar ciclo en block.
          typename GT::Arc * a = block.get_first_arc();
          Path<GT> aux_path(block);
          Find_Path_Depth_First <GT> () (block, block.get_tgt_node(a),
                                         block.get_src_node(a), aux_path);
          path.clear_path();
          for (typename Path<GT>::Iterator it(aux_path); it.has_current();
               it.next())
            path.append(table[it.get_current_node()]);
          path.append(table[block.get_tgt_node(a)]);
          return true;
        }
      return false;
  }
Í× × DynListStack ½½ ¸ Node Arc Iterator   ¸ Node Iterator   ¸ Ò   Path   ¼¾ º
Find Path Depth First <GT> ()ÒÓ ×Ø × Ò Ô Ö Ò ÓÒØÖ Ö ÐÓ׺ ÈÓÖ ÐÐÓ¸ ÐÓ ÕÙ
    ÑÓ× × × Ð ÓÒ Ö ÙÒ Ö Ó Ù ÐÕÙ Ö s −→ t Ý Ò ÓÒØÖ Ö ÙÒ Ñ ÒÓ t sº      ר
ÑÓ Ó¸ Ð ÐÓ ÐÓ ÓÒ ÓÖÑ t s −→ tº
   Ä ÖÙØ Ò ÔÖ Ò Ô Ð × ÒÓÑ Ò compute cycle in digraph()¸ ÙÝ ×ØÖÙ ØÙÖ ¸ ÓÒ
 Ð Ò Ó       ÖÖ Ö Ð ÐÓ¸ × × Ñ Ð Ö strongly connected components()º
688                                                                                Cap´
                                                                                      ıtulo 7. Grafos



7.7.6         Digrafos ac´
                         ıclicos (DAG)
Definici´n 7.6 (Digrafo ac´
       o                 ıclico -DAG-)                     ÍÒ   Ö Ó        Ð ÓÓ        ½   ¸ × ÙÒ        Ö Ó
×Ò    ÐÓ׺
     Ð ÑÔÐ Ó Ñ × ÔÓÔÙÐ Ö ÐÓ× Ö Ó× Ð Ó× × Ô Ö ÑÓ Ð Þ Ö ÔÐ Ò ¬ ÓÒ × Ù
 ÓÖ Ö Ó׺ Ò ×Ø ×Ó¸ ÐÓ× ÒÓ Ó× Ö ÔÖ × ÒØ Ò Ø Ö × Ó Ø Ú     × ÕÙ ÒרÖÙÑ ÒØ Ò
ÙÒ Ó Ö Ý ÐÓ× Ö Ó× Ð × ÔÖ   Ò × ÔÓ× Ð × Ð × Ø Ú       ׺ ÓÒ× Ö ÑÓ׸ Ð Ø Ö
  Ò Ö Ð Ú ×Ø Ö× ¸ Ð Ù Ð ÓÒ× ×Ø Ò ÓÐÓ Ö× Ð × ÔÖ Ò × Ò ÙÒ ÓÖ Ò ×Ô ¬ Ó ÕÙ
ÔÙ Ö Ð ÓÒ Ö× × ÙÒ Ð × Ù ÒØ Ö Ó
                                    Medias    Interiores         Camisa




                                    Zapatos   Pantalon           Corbata




                                               Correa            Chaleco




                                                Paltó




Ì Ò ÑÓ× ÒÙ Ú    ÓÒ ×¸ Ö ×ÙÑ × Ò Ð Ö Ó Ó ÐÓ× ÒÓÑ Ö × Ð × ÔÖ Ò ×¸ ÕÙ ÒÓ
ÔÙ Ò Ö Ð Þ Ö× Ò ÙÒ ÓÖ Ò Ö ØÖ Ö Ó¸ × ÒÓ Ò Ð ÜÔÖ × Ó ÔÓÖ Ð × Ö Ð ÓÒ × Ð Ö Óº
È Ö Ú ×Ø ÖÒÓ×   Ù Ñ ÒØ ÒÓ ÔÓ ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ ÓÐÓ ÖÒÓ× Ð ÓÖÖ ÒØ × ÕÙ Ð
Ô ÒØ ÐÓÒº
     Ò ÙÒ Ö Ó Ð Ó × ÑÔÖ × ×Ø Ò Ù Ò¸ Ù Ò Ó Ñ ÒÓ׸ ÙÒ ÒÓ Ó Ù ÒØ Ý ÙÒÓ
×ÙÑ ÖÓº Ò Ð Ú ×Ø Ö× Ø Ò ÑÓ× ÐÓ× ÒØ Ö ÓÖ ×¸ Ñ × Ý Ñ × ÓÑÓ Ù ÒØ ׸ Ñ ÒØÖ ×
ÕÙ ÐÓ× Þ Ô ØÓ× Ý Ð Ô ÐØÓ ÓÑÓ ×ÙÑ ÖÓ׺

7.7.7         Planificaci´n de tareas
                        o
Ì Ò ÖÖ        Ó ÔÓÖ ÒÙ ×ØÖ ÙÐØÙÖ ÒÓ× ×Ø Ð Ú ×Ø Ö× ¸ ÕÙ ÕÙ Þ ÒÓ ÔÖ ÑÓ× Ò Ð
Ò ×           Ð ÓÖ Ò ÓÖÖ ØÓ¸ Ò Ð ÓÑÔÐ        Ò Ö ÒØ ÕÙ ÔÙ Ø Ò Ö Ð Ò ÓÒØÖ Ö
    Ó ÓÖ Ò   ½ º  ÓÒ ÓÖÑ ÙÑ ÒØ Ð ÒØ            ØÚ     ׸ ÙÑ ÒØ Ð ¬ ÙÐØ º Ò
Ó Ö × Ö Ò ×¸ × Ò × Ö Ó¸ Ò ÑÙ × Ó × ÓÒ × Ö٠и Ò ÓÒØÖ Ö Ð ÓÖ Ò × Ù Ò Ð
 ÓÖÖ ØÓ Ò ÕÙ         Ò ÙØ Ö× ØÓ × Ð × Ø Ö × Ó Ø Ú      ׺ Ì Ð ÓÖ Ò × ÒÓÑ Ò Ó
 ÓÖ Ò Ñ ÒØÓ ØÓÔÓÐÓ Ó º
     Ð Ú ×Ø Ö× ÔÙ ÓÖ Ò Ö× ØÓÔÓÐÓ Ñ ÒØ ¸ × ÒÓ Ó× Ù ÒØ × ×Ø ÒÓ Ó× ×ÙÑ ¹
  ÖÓ׸ Ð × Ù ÒØ Ñ Ò Ö Ô ØÓÖ


 Interiores     Pantalon   Medias   Camisa        Correa        Corbata      Chaleco        Zapatos        Paltó




 ½
     Ð ÒÐ× Ö Ø        Ý Ð ÕÙ Ö Ô º
 ½
    ÓÒ× Ö ÙÒ Ò Ú ÙÓ ÕÙ ÒÓ ÓÒÓÞ Ð ÙÐØÙÖ Ó                        ÒØ Ð Ý × Ð ÔÖÓÔÓÒ      Ú ×Ø Ö× º      ÓÒ× Ö ¸
Ø Ñ Ò¸ Ñ Ò Ö ÔÓÖ Ð × ÐÚ Ñ ÞÓÒ ÓÒ Ú ×Ø Ñ ÒØ × Ó                    ÒØ Р׺
7.7. T´picos sobre grafos dirigidos
      o                                                                      689



  × Ö¸ × Ð × Ø Ú           × Ò Ð × Ó ÔÖ Ñ Ò ×¸ Ô × Ò Ó ÔÓÖ Ð × ÒØ ÖÑ × × ÙÒ
Ð × Ô Ò Ò ×¸ ר Ð × ¬Ò Р׺
      Ò Ð ÒרÖÙÑ ÒØ ÓÒ ÙÒ Ó Ö ¸ Ý × ØÙ ÓÒ × Ò Ð × ÕÙ × ÔÓ× Ð Ö Ð Þ Ö Ø Ú ¹
     × Ò Ô Ö Ð ÐÓ¸ Ú × × ÑÙÐØ Ò Ñ ÒØ º Ò Ð Ó ÙÖÖ Ò ÓÒ Ð Ú ×Ø Ö× ¸ ÔÓ Ö ÑÓ×
ÔÓÒ ÖÒÓ× ÐÓ× ÒØ Ö ÓÖ × Ñ ÒØÖ × ÓØÖ × Ó× Ô Ö×ÓÒ × Ñ × ÒÓ× ÓÐÓ Ò Ð Ñ × Ý Ð ×
Ñ ×º Ë ÓÒ× Ö ÑÓ× ÙÒ ÙÖ ÓÒ ÓÒר ÒØ Ô Ö Ð ÓÐÓ ÓÒ ÙÒ ÔÖ Ò
Ú ×Ø Ö¸ ÒØÓÒ ×¸ Ò ÐÙ Ö ÑÔÐ Ö ÒÙ Ú Ô ×Ó× Ô Ö Ú ×Ø ÖÒÓ× ×ÓÐÓ׸ ÔÓ Ö ÑÓ× ÑÔÐ Ö
  Ò Ó × ÒÓ× ÝÙ Ò Ó× Ô Ö×ÓÒ × Ñ ×º È Ö ÔÖ Ò ÖÐÓ¸ Ú ÑÓ× Ð × Ù ÒØ ¬ ÙÖ
                          Medias          Interiores      Camisa
                                                                    Paso 1


                                          Pantalon        Corbata
                                                                    Paso 2



                         Zapatos           Correa                   Paso 3


                                                          Chaleco   Paso 4


                                            Paltó                   Paso 5



  Ù Ò Ó × Ó Ö Ò Ô Ö Ð ÐÓ¸ Ý ÕÙ × Ò ÖÓÒ Þ Ö ÐÓ× Ó Ö ÒØ × Ô Ö ÕÙ ÒÓ ÑÔÖ Ò Ò
Ø Ö × × Ò ÕÙ ÔÖ Ú Ñ ÒØ × Ý Ò ÙÐÑ Ò Ó Ø Ú           × Ô Ò ÒØ × Ö Ð Þ × ÔÓÖ
ÓØÖÓ× Ó Ö ÒØ ׺ ÈÓÖ ÑÔÐÓ¸ Ð Ø Ö ÕÙ ÓÐÓÕÙ Ð × Ñ ×        ×Ô Ö Ö ÕÙ Ð Ô ÒØ ÐÓÒ
 ר ÔÙ ×ØÓ ÒØ × ÔÓÒ Ö ÐÓ× Þ Ô ØÓ׺
      Ð ÔÖÓ Ð Ñ ÒØ Ö ÓÖ ÔÙ Ó Ø Þ Ö× Ñ Ò Ö Ò Ö Ð ÓÑÓ Ð ÔÐ Ò ¬ ÓÒ n
Ø Ö ×¸ ÙÝ Ô Ò Ò × ×Ø ¬Ò ÔÓÖ ÙÒ Ö Ó Ð Ó¸ Ò m Ó Ö ÒØ ׺
        Ð × Ø Ö × × Ð × ÔÙ    ×Ó Ö ÙÒ ÙÖ ÓÒ Ó Óר º Ò ×Ø ×Ó¸ × ØÖ Ø
 Ò ÓÒØÖ Ö Ð Ñ Ò Ñ ÔÐ Ò ¬ ÓÒ × Ö¸ Ò ÓÒØÖ Ö m > 1 × Ù Ò × Ø Ö ×¸ Ô Ö
   ÖÐ m Ó Ö ÒØ ׸ Ñ Ò Ö Ø Ð ÕÙ Ð ÙÖ ÓÒ Ó Óר ØÓØ Ð × Ñ Ò ÑÓº
    ÄÓ Ö Ó× Ø Ö × ÔÙ Ò × ÑÔÐ ¬ Ö× × ÙÒ Ö ÙÒר Ò × Ð × ØÙ ÓÒ Ö Ð
ÑÓ Ð Þ ¸ Ð Ñ Ó              Ù ÓÒ Ý Ð ¬Ò Ð ÔÐ Ò ¬ ÓÒº ÈÓ ÑÓ׸ ÔÓÖ ÑÔÐÓ¸
 ×ÙÑ Ö ÕÙ ÓÐÓ Ö× Ð Ñ × Ý Ð ÓÖ Ø ×ÓÒ ÙÒ ×ÓÐ Ø Ö ÓÒ ÙÒ ÙÖ ÓÒ Ñ ÝÓÖº
    ר       ÓÒ × Ð ÒÓÑ Ò Ö Ù ÓÒ ÔÓÖÕÙ Ö Ù Ð ÒØ              ÒÓ Ó× Ð Ö Ó¸
× ÑÔÐ ¬ Ð ÓÑÔÖ Ò× ÓÒ Ð ÑÓ ÐÓ Ý ÔÓÖ ÐÓ Ò Ö Ð Ö Ù Ð Ø ÑÔÓ                Ù ÓÒº
      Ò × × Ù Ò Ð ×¸ × Ö¸ Ñ ÒÓ× × ÑÔÐ × ÒÓ Ó× ÓÒ ÙÒ ×ÓÐÓ Ö Ó        ÒØÖ Ý
ÓØÖÓ × Ð ¸ ÔÙ Ò ÓÑÔÖ Ñ Ö× ÙÒ ×ÓÐÓ ÒÓ Ó ÓÒ× ×Ø ÒØ ×Ù ×ÙÑ Ø Ö ×º
    Ä Ö Ù ÓÒ ÒØ Ö ÓÖ ×       ØÙÓ ×Ó Ö ÙÒ   Ò × Ù Ò Ð¸ Ô ÖÓ ÔÙ Ô Ö Ø Ñ ÒØ
Ö Ð Þ Ö× ×Ó Ö ÙÒ ×Ù ¹ Ö Ó ÒØ ÖÓº ÓÑÓ ÑÔÐÓ ÙÐÑ Ò ÒØ ÓÒ× Ö ÑÓ× ×Ø ÒÙ Ú
ÓÖ Ò Þ ÓÒ Ð Ú ×Ø Ö×
                                   Medias, interiores   Camisa
                                   Pantalon, Zapatos




                                       Correa           Corbata
                                                        Chaleco




                                        Paltó
690                                                        Cap´
                                                              ıtulo 7. Grafos



   ÄÓ× Ö Ó× ÔÐ Ò ¬ ÓÒ Ø Ò Ò Ú Ö× × ÔÐ ÓÒ ×¸ ÒØÖ Ð × Ù Ð ×               Ñ Ò¹
 ÓÒ Ö
  ½º ÈÐ Ò ¬ ÓÒ ÒרÖÙ ÓÒ × Ò ÙÞ Ö ÔÓÖ ÙÒÓ Ó Ú Ö Ó× ÔÖÓ × ÓÖ × ÐÓ× Óѹ
     Ô Ð ÓÖ × Ò Ö Ò ÒרÖÙ ÓÒ × Ò Ó Ó Ñ ÕÙ Ò º               ÒרÖÙ ÓÒ Ø Ò ÙÒ
      ÙÖ ÓÒ Ò ÐÓ× Ý ÙÒ ÔÖ         Ò ×Ó Ö ÓØÖ × Ô Ö ÕÙ ÒÓ Ó ÙÖÖ ÖÙÔØÙÖ Ð Ò¹
       ÙÞ Ñ ÒØÓ ´Ô Ô Ð Ò Ò µº Ò ×Ø ×Ó¸ Ð ÓÑÔ Ð ÓÖ ÓÒרÖÙÝ ÙÒ Ö Ó Ð Ó
     × ÙÒ Ð Ò ÓÐ Ð ÔÖÓ × ÓÖ Ý ÓÔØ Ñ Þ Ð × Ù Ò           ÒרÖÙ ÓÒº
  ¾º ÈÐ Ò ¬ ÓÒ Ó Ö × Ó ÔÖÓÝ ØÓ× ÔÓÖ ÑÔÐÓ¸ Ô Ö ÓÒרÖÙ Ö ÙÒ ÓÑÔÐ Ó
        ¬ Ó× × ÔÙ Ö Ð Þ Ö ÙÒ Ö Ó          ØÚ      × Ý¸ Ò ÙÒ ÓÒ ÐÓ× Ó Ö ÒØ ×
     ´ ÓÒרÖÙ ØÓÖ ×¸ Ñ ÕÙ Ò Ö ×¸ ÒØ     Ô Ö×ÓÒ ×µ¸ Ò ÓÒØÖ Ö ÙÒ ÔÐ Ò ¬ ÓÒ
        Ó Óר Ó Ñ Ò Ñ ÙÖ ÓÒº

7.7.8   Ordenamiento topol´gico
                          o
 Ü ×Ø ÙÒ Ð × Ó Ý × ÑÔÐ × ÑÓ Ð ÓÖ ØÑÓ Ô Ö Ò ÓÒØÖ Ö ÙÒ ÓÖ Ò Ñ ÒØÓØÓÔÓÐÓ Ó    ÙÒ
  Ö Ó Ð Ó
Algoritmo 7.3 (Ordenamiento topol´gico) Ä
                                 o            ÒØÖ      Ð Ð ÓÖ ØÑÓ × ÙÒ    Ö Ó
Gº
   Ä × Ð × ÙÒ Ð ×Ø ÒÓ Ó× l¸ Ò ÐÑ ÒØ Ú           ¸ ÓÖÖ ×ÔÓÒ ÒØ Ð ÓÖ Ò Ñ ÒØÓ
ØÓÔÓÐÓ Ó Ð Ö Ó Gº
    Ê Ô Ø Ñ ÒØÖ × G Ø Ò ÒÓ Ó×
   ½º × Ó ÙÒ ÒÓ Ó ×ÙÑ ÖÓ v ´ÙÒÓ ÕÙ ÒÓ Ø Ò Ö Ó× × Ð µº
   ¾º Ð Ñ Ò ÐÓ G ÙÒØÓ ÓÒ ØÓ Ó× ×Ù× Ö Ó× ÒØÖ º
   ¿º ÁÒ× ÖØ v Ð Ð ×Ø lº
  ר Ð ÓÖ ØÑÓ Ò Ù ÒØÖ Ð ÓÖ Ò Ñ ÒØÓ Ñ Ò Ö ÒÚ Ö×           × ÐÓ× ×ÙÑ ÖÓ× ×Ø
ÐÓ× Ù ÒØ ׺        Ø Ö ÓÒ Ð Ñ Ò ÙÒ ×ÙÑ ÖÓ Ð Ö Ó¸ ÐÓ ÕÙ ÓÒ ÖØ ØÙ            ¸ Ð
 Ð Ñ Ò Ö ×Ù× Ö Ó× ÒØÖ ¸ Ð Ñ ÒÓ× ÙÒ ÒÙ ÚÓ ×ÙÑ ÖÓ ÒØÖÓ Ð Ö Óº Ð Ð ÓÖ ØÑÓ
ÔÖÓ Ö × ×Ø ÕÙ ×ÓÐÓ ÕÙ Ò ÙÒÓ Ó Ñ × Ù ÒØ ׺
    ÍÒ Ñ Ò Ö Ö Ø Ý × ÑÔÐ          ÑÔÐ ÒØ Ö Ð Ð ÓÖ ØÑÓ º¿ × Ó Ø Ò Ò Ó Ð Ö Ó
 ÒÚ Ö×Ó Ý ÒØÓÒ × ÙØ Ö Ð Ø Ö ÐÑ ÒØ Ð Ð ÓÖ ØÑÓº Ð ÙÒ Ó Ò ÓÒÚ Ò ÒØ × ÕÙ ×
  ÙÔÐ Ð ×Ô Ó¸ ÐÓ ÕÙ ÔÙ × Ö ÓרÓ×Ó Ô Ö Ö Ó× ÒÓÖÑ ×º
     Ð Ð ÓÖ ØÑÓ º¿ ÔÙ ÔÐ ÒØ Ö× Ô Ö Ø Ñ ÒØ Ò ÙÒ ÓÒ ÐÓ× Ù ÒØ × × Ö¸
× Ð ÓÒ Ö ÒÓ Ó× Ù ÒØ ׸ Ð Ñ Ò ÖÐÓ× ÙÒØÓ ×Ù× Ö Ó× × Ð Ý ÓÒØ ÒÙ Ö ÓÒ ÐÓ× ÒÙ ÚÓ×
 Ù ÒØ ׺ ÙÒ Ò ×Ø ×Ó¸ × Ò × Ö Ó Ö Ð Þ Ö ÙÒ ÓÔ × × × ÓÒ× ÖÚ Ö Ð Ö Ó
ÓÖ Ò Ðº
    Ä ÑÔÐ ÒØ ÓÒ Ð Ð ÓÖ ØÑÓ º¿ × Ò ØÙ Ö ÙÒ ÓÔ Ð Ö Ó × Ñ × ÓÑÔÐ ¸
ÔÙ ×      ÑÓ× ØÖ Ø Ö ÓÒ Ó× ÔÖÓ Ð Ñ × ÕÙ Ð Ì List Digraph<Node, Arc> ÒÓ ÒÓ×
Ö ×Ù ÐÚ Ö Ø Ñ ÒØ ´½µ Ø ÖÑ Ò Ö Ð Ö Ó            ÒØÖ       ÙÒ ÒÓ Ó Ý ´¾µ ÔÖÓ × Ö
Ö Ô Ñ ÒØ ÐÓ× ÒÓ Ó׸ × ÐÓ× ×ÙÑ ÖÓ× ×Ø ÐÓ× Ù ÒØ ׺
7.7. T´picos sobre grafos dirigidos
          o                                                                       691



    Ordenamiento topol´gico por profundidad
                      o
        Ë ÙÒ Ð × ÒØ Ó¸ ÔÓ ÑÓ× ÓÒ× Ö Ö Ó× Ð × ×        Ð ÓÖ ØÑÓ׺ Ë Ú ÑÓ× × ÐÓ×
    ×ÙÑ ÖÓ×        ÐÓ× Ù ÒØ ׸ ÒØÓÒ × ÙÒ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ     ¸ ÕÙ Ú × Ø      ÒÓ Ó
     Ò ×Ù¬ Ó¸ ÓÑ ÒÞ Ö ÔÓÖ Ð ÔÖ Ñ Ö ×ÙÑ ÖÓ ÕÙ × Ò ÓÒØÖ Óº        Ó ÙÒ ÒÓ Ó Ù ÐÕÙ Ö
    curr¸ ר ÔÙ      Ö ÓÖÖ Ö× Ö ÙÖ× Ú Ñ ÒØ ¸ Ò ÔÖÓ ÙÒ     Ý Ò ×Ù¬ Ó¸ Ð × Ù ÒØ
     ÓÖÑ
½    ÇÖ Ò Ñ ÒØÓ ØÓÔÓÐÓ Ó ½ ≡                                       ½
        template <class GT, class SA> static inline
     void __topological_sort(GT & g, typename GT::Node * curr,
                             DynDlist<typename GT::Node*> & list)
     {
       if (IS_NODE_VISITED(curr, Depth_First))
         return;
       NODE_BITS(curr).set_bit(Depth_First, 1); // marcarlo como visitado
           // visitar recursivamente en sufijo los nodos adyacentes a curr
       for (Node_Arc_Iterator<GT, SA> it(curr);
            it.has_current() and list.size() < g.get_num_nodes(); it.next())
         __topological_sort<GT, SA> (g, it.get_tgt_node(), list);
       list.insert(curr); // inserci´n en sufijo de un nodo que devino sumidero
                                    o
     }
    Í× × DynDlist ¿ Ò   Node Arc Iterator   º
    Ë Ò ÑÔÓÖØ Ö Ù Ð × Ð ÔÖ Ñ Ö ÒÓ Ó × Ð Ù Ð × ÒÚÓÕÙ ×Ø ÖÙØ Ò ¸ ר Ú ÒÞ Ö
    Ö ÙÖ× Ú Ñ ÒØ ר Ò ÓÒØÖ Ö ÙÒ ÒÓ Ó Ý Ú × Ø Ó Ó ×Ø ÙÒ ×ÙÑ ÖÓ Ò ×Ø ÙÐØ ÑÓ
       ×Ó¸ ÒÓ × ÒØÖ Ò Ð for Ý Ð ÒÓ Ó × Ò× ÖØ Ò listº ÈÙ ×ØÓ ÕÙ Ò× ÖØ ÑÓ× Ò list Ð
    ÔÖ Ò Ô Ó¸ Ð ÔÖ Ñ Ö ×ÙÑ ÖÓ ÕÙ × Ó × ÖÚ × Ö Ð ÙÐØ ÑÓ ÒÓ Ó Ò Ð Ð ×Ø ¸ Ñ ÒØÖ × ÕÙ
     Ð ÙÐØ ÑÓ Ó × ÖÚ Ó¸ Ó × ¸ ÙÒ Ù ÒØ ¸ × Ö Ð ÔÖ Ñ ÖÓº ÁÒ× ÖØ Ö Ò list ÓÑÓ Ò ÙÒ Ô Ð
    ÒÓ× ÔÖÓÔÓÖ ÓÒ Ð ÓÖ Ò ØÓÔÓÐÓ Óº
        ÍÒ Ú Þ ÕÙ ÒÚÓ Ð ÙÐØ Ñ ÒרÖÙ ÓÒ list.insert(curr)¸ ØÓ Ó× ÐÓ× ÒÓ Ó× Ð ÒÞ ¹
     Ð × × curr Ý Ò × Ó Ò× ÖØ Ó× Ò listº ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð ÓÖ Ò Ò× Ö ÓÒ
     × ÓÖÖ ØÓ¸ ÔÙ × curr Ú ÒØ × Ò ×Ù ÓÖ Ò ØÓÔÓÐÓ Óº
          × ÑÔÓÖØ ÒØ Ó × ÖÚ Ö ÕÙ Ð ÓÒ ÓÒ          Ø Ò ÓÒ Ð for Ò ÐÙÝ Ð       Ó ÕÙ
    Ý ØÓ Ó× ÐÓ× ÒÓ Ó× Ý Ò × Ó Ú × Ø Ó׺ ×ØÓ × Ø Ø Ù Ò Ó Ð ÒØ                ÒÓ Ó×
    Ð Ð ×Ø × Ð Ñ ×Ñ ÕÙ Ð Ö Ò Ð              Ð Ö Óº
          Ò ×Ó ÕÙ topological sort() × Ò                 × ÙÒ ÒÓ Ó ÕÙ ÒÓ × Ù ÒØ ¸
    Ó ÕÙ Ü ×Ø Ò Ú Ö Ó× Ù ÒØ ׸ Ö ×Ø Ö Ò ÒÓ Ó× × Ò Ú × Ø Ö¸ Ö Ó × Ò Ò× ÖØ Ö Ò Ð Ð ×Ø º
      ×ØÓ × Ö ×Ù ÐÚ × ÑÔÐ Ñ ÒØ Ö ÓÖÖ Ò Ó ØÓ Ó× ÐÓ× ÒÓ Ó× Ð Ö Ó ÒÚÓ Ò Ó
     topological sort()
½   ÇÖ Ò Ñ ÒØÓ ØÓÔÓÐÓ Ó ½         +≡                             ½    ¾
         template <class GT, class SA> inline
     void topological_sort(GT & g, DynDlist<typename GT::Node*> & list)
     {
       for (typename GT::Node_Iterator it(g);
            it.has_current() and list.size() < g.get_num_nodes(); it.next())
         {
           typename GT::Node * curr = it.get_current_node();
           if (not IS_NODE_VISITED(curr, Depth_First))
             __topological_sort<GT, SA>(g, curr, list);
         }
692                                                                     Cap´
                                                                               ıtulo 7. Grafos



     }
    Í× × DynDlist ¿ Ò   Node Iterator          º
         topological sort()   ÔÙ      Ø Ö Ö Ø ÒØ × Ú × ÓÑÓ Ö Ó× Ø Ò Ð Ö Ó ×ØÓ
    ÕÙ Ð × ÑÔ ÒÓ Ø Ò              O(E) ÐÓ Ù Ð¸ Ò Ð Ô ÓÖ ÐÓ× ×Ó׸ ÔÙ × Ö O(V 2)º È ÖÓ¸
    ÔÓÖ ÐÓ Ò Ö Ð¸ Ô Ö ÙÒ          Ö Ó Ð Ó¸ E ≈ 2V º
                            A                            I             P

                                           F                   M
                            B                           J              Q

                                           G                    N
                            C                           K              R
                                                                O
                                           H
                              D                          L              S

                →À→Ä→Ã→Ç→Ë→ → → → → →Â→Æ→Ê→Å→É→Á→È
                                         ´ µ topological sort()
                →À→Ä→Ã→Ç→Ë→ → → → → →Â→Æ→Ê→Å→É→Á→È
                                         ´ µ q topological sort()

                        ÙÖ º ½ ÍÒ          Ö Ó Ý ×Ù× ÓÖ Ò Ñ ÒØÓ× ØÓÔÓÐÓ Ó×

    Ordenamiento topol´gico por amplitud
                      o
        ÇØÖÓ Ò ÓÕÙ Ô Ö ÓÖ Ò Ö ØÓÔÓÐÓ                  Ñ ÒØ × ÕÙ Ô Ö ÓÒ ÙÒ Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ
    ÐÓ ÕÙ ÓÒÐÐ Ú Ð Ú ÒØ ÓÒØÖÓÐ Ö Ñ                  ÓÖ Ð ÓÒ×ÙÑÓ ×Ô Ó Ð Ð Ñ Ø ÖÐÓ ÙÒ ÓÐ
    ÒÓ Ó× ¹ ÓÒ Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ                  ¸ Ð Ö ÙÖ× ÓÒ ÔÙ   Ð ÒÞ Ö O(V)¸ ÐÓ ÕÙ ÔÙ Ö ¸
     Ò Ð ÙÒÓ× ×Ó׸ ÖÖ Ö Ô Ð ÖÓ Ô Ö                  Ð Ô Ð Ð × ×Ø Ñ ¹
¾    ÇÖ Ò Ñ ÒØÓ ØÓÔÓÐÓ Ó ½ +≡                                               ½   ¿
        template <class GT, class SA> inline
     void q_topological_sort(GT & g, DynDlist<typename GT::Node*> & list)
     {
           // recorra todos los nodos para contabilizar su grado de entrada
       for (typename GT::Node_Iterator i(g); i.has_current(); i.next())
         for (Node_Arc_Iterator <GT, SA> j(i.get_current_node());
              j.has_current(); j.next()) // incremente grado entrada nodo destino
           NODE_COUNTER(j.get_tgt_node())++;
           // revisar nodos con grado de entrada 0 y meterlos en cola
       DynListQueue<typename GT::Node*> q; // cola de fuentes
       for (typename GT::Node_Iterator it(g); it.has_current(); it.next())
         {
           typename GT::Node * p = it.get_current_node();
           if (NODE_COUNTER(p) == 0) // ¿es un nodo fuente?
             q.put(p); // s´ ==> colocarlo en la cola
                           ı
         }
       while (not q.is_empty())
         {
           typename GT::Node * p = q.get(); // saque ultimo nodo fuente
                                                     ´
           list.append(p); // ins´rtelo en el orden topol´gico
                                 e                       o
7.7. T´picos sobre grafos dirigidos
          o                                                                            693



                  // decrementar grado de entrada de cada nodo adyacente a p
              for (Node_Arc_Iterator<GT, SA> it(p); it.has_current(); it.next())
                {
                  typename GT::Node * tgt = it.get_tgt_node();
                  if (--NODE_COUNTER(tgt) == 0) // ¿tgt deviene nodo fuente?
                    q.put(tgt); // s´ ==> col´quelo en la cola
                                    ı        o
                }
          }
      }
    Í× × DynDlist ¿ ¸ DynListQueue ½ ¼ ¸ Node Arc Iterator   ¸ Ò   Node Iterator   º
         Ð × ÑÔ ÒÓ ×Ø Ð ÓÖ ØÑÓ × 2 × O(V) ÔÓÖ ÐÓ× Ó× ÔÖ Ñ ÖÓ× Ð ÞÓ× Ñ × O(E) ÔÓÖ
     Ð whileº ÄÓ ÕÙ ÒÓ× ÖÖÓ O(E) ÓÑÓ × ÑÔ ÒÓ Ò Ö Ð Ð Ð ÓÖ ØÑÓ¸ ÙÒ Ö Ò Ñ ÒØÓ
    × Ñ Ð Ö Ð Ú Ö× ÓÒ ×     Ò Ð Ù×ÕÙ   Ò ÔÖÓ ÙÒ    º
    Rangos topol´gicos
                o
          Ð Ö Ò Ó ØÓÔÓÐÓ Ó ÙÒ ÒÓ Ó × ×Ù Ò Ú Ð Ò Ð Ö Ó Ö ×Ô ØÓ Ð × Ø Ö × ÕÙ ÐÓ
    ÔÖ       Ò Ý Ð × ÕÙ ÐÓ× ×Ù Òº ÍÒ Ö Ò Ó ØÓÔÓÐÓ Ó × × ¹× Ò ×Ô ¬ Ö ÕÙ × ØÖ Ø
       ÙÒ ÒÓ Ó¹¸ × ÙÒ ÓÒ ÙÒØÓ Ø Ö × ÕÙ ÔÙ Ò Ö Ð Þ Ö× Ò Ô Ò ÒØ Ñ ÒØ ÙÒ Ú Þ
    ÕÙ Ò × Ó ÙÐÑ Ò × Ð × Ø Ú            × Ð Ö Ò Ó ÔÖ  ×ÓÖº ÈÓÖ ÑÔÐÓ¸ ÐÓ× Ö Ò Ó×
    ØÓÔÓÐÓ Ó× Ð Ö Ó Ð ¬ ÙÖ º ½ ×ÓÒ
       ½º R1 = {A, C, D}
       ¾º R2 = {B, G, H}
       ¿º R3 = {F, K, L}
        º R4 = {I, J, O}
        º R5 = {M, N, S}
        º R6 = {P, Q, R}
    ÄÓ ÕÙ × Ò ¬ ÕÙ × Ð × Ø Ö × ØÓÑ × Ò Ð Ñ ×Ñ ÙÖ ÓÒ¸ ÒØÓÒ × ÔÖ Ñ ÖÓ Ö ÕÙ
        ÙØ Ö R1¸ ÐÙ Ó R2 Ý × ×Ù × Ú Ñ ÒØ º
          Ð Ð ÙÐÓ ÐÓ× Ö Ò Ó× ÔÙ Ö Ð Þ Ö× Ñ ÒØ Ù ÐÕÙ Ö           ÐÓ× Ð ÓÖ ØÑÓ×
    ÓÖ Ò Ñ ÒØÓ ØÓÔÓÐÓ Óº À ÕÙ ÙÒ Ú Ö ÒØ Ð × Ó Ò ÑÔÐ ØÙ ÕÙ ÑÔÐ Ó×
     ÓÐ ×
¿    ÇÖ Ò Ñ ÒØÓ ØÓÔÓÐÓ Ó ½ +≡                                      ¾
         template <class GT, class SA> inline
      void q_topological_sort(GT &                                      g,
                              DynDlist<DynDlist<typename GT::Node*>*> & ranks)
      {
            // recorra todos los nodos para contabilizar su grado de entrada
        for (typename GT::Node_Iterator i(g); i.has_current(); i.next())
          for (Node_Arc_Iterator <GT, SA> j(i.get_current_node());
               j.has_current(); j.next()) // incremente grado entrada nodo destino
            NODE_COUNTER(j.get_tgt_node())++;
            // revisar nodos con grado de entrada 0 y meterlos en cola
        DynListQueue<typename GT::Node*> q; // cola de fuentes
        for (typename GT::Node_Iterator it(g); it.has_current(); it.next())
694                                                                   Cap´
                                                                         ıtulo 7. Grafos



       {
           typename GT::Node * p = it.get_current_node();
           if (NODE_COUNTER(p) == 0) // ¿es un nodo fuente?
             q.put(p); // s´ ==> colocarlo en la cola
                           ı
        }
      while (not q.is_empty())
        {
          DynDlist<typename GT::Node*> * rank = new DynDlist<typename GT::Node*>;
          DynListQueue<typename GT::Node*> aq;
          while (not q.is_empty()) // saca todos los nodos del nivel i
            {
              typename GT::Node * p = q.get(); // saque ultimo nodo fuente
                                                        ´
              rank->append(p); // ins´rtelo en el rango topol´gico
                                     e                       o
                  // decrementar grado de entrada de cada nodo adyacente a p
              for (Node_Arc_Iterator<GT, SA> it(p); it.has_current(); it.next())
                {
                  typename GT::Node * tgt = it.get_tgt_node();
                  if (--NODE_COUNTER(tgt) == 0) // ¿tgt deviene nodo fuente?
                    aq.put(tgt); // s´ ==> col´quelo en cola auxiliar
                                     ı         o
                }
            }
          ranks.append(rank);
          q.swap(aq);
        }
  }
Í× × DynDlist ¿ ¸ DynListQueue ½ ¼ ¸ Node Arc Iterator   ¸ Ò   Node Iterator   º
  Ð Ð ÓÖ ØÑÓ × ×ØÖÙ ØÙÖ ÐÑ ÒØ × Ñ Ð Ö q topological sort()º Ð Ô Ö Ñ ØÖÓ ranks ×
ÙÒ Ð ×Ø Ð ×Ø × ÒÓ Ó׺            Ð ×Ø × ÙÒ Ö Ò Ó Ý ÓÒØ Ò ÐÓ× ÒÓ Ó× ÕÙ ÐÓ ÓÒ ÓÖÑ Òº
Ä Ð ×Ø ר ÓÖ Ò ÔÓÖ Ð ÓÖ Ò Ð Ö Ò Ó × Ö¸ Ð ÔÖ Ñ Ö Ð ×Ø ÓÒØ Ò Ð × Ø Ö ×
ÕÙ ×       ÙØ Ò ÔÖ Ñ ÖÓ Ý × ×Ù × Ú Ñ ÒØ º
     Ð Ð ÓÖ ØÑÓ ÑÔÐ ÙÒ ÓÐ ÙÜ Ð Ö aqº Ù Ò Ó ×              Ö Ñ ÒØ Ð Ö Ó Ý × Ø Ö¹
Ñ Ò ÕÙ Ý ÕÙ Ò ÓÐ Ö¸ Ð ÒÓ Ó × Ñ Ø Ò qaº ÍÒ Ú Þ ÕÙ × Ò × Ó ØÓ Ó× ÐÓ×
ÒÓ Ó×      Ö Ó ÖÓ¸ ÐÓ× Ù Ð × ÓÖÖ ×ÔÓÒ Ò ÐÓ× Ð Ö Ò Ó ØÙ и ÐÓ× ÒÓ Ó× qa ×
 ÓÔ Ò ´ Ò O(1) Ñ ÒØ swap()µ             q Ý × Ö Ô Ø Ð ÔÖÓ    Ñ ÒØÓº
     Ò Ó × ÓÒ ×¸ Ð × Ø Ö × ÒÓ Ø Ò Ò Ð Ñ ×Ñ ÙÖ ÓÒ¸ ÐÓ ÕÙ Ò ÖØ ÓÖÑ ÖÓÑÔ ÓÒ
Ð ÔÖ Ð ÓÒº Ò ×Ø × × ØÙ ÓÒ ×¸ Ð × Ø Ö × ÔÙ Ò Ú Ö× Ò ÙÖ ÓÒ × Ø ÖÑ Ò ×
Ý × ÓÒרÖÙ Ö ÙÒ Ö Ó ÕÙ Ú Ð ÒØ ÙÝÓ× ÒÓ Ó× Ö ÔÖ × ÒØ Ò Ð Ñ ×Ñ ÙÖ ÓÒº ËÓ Ö
 ר Ö Ó ÜØ Ò Ó × Ð ÙÐ Ð Ö Ò Óº

7.8        Arboles abarcadores m´
                                ınimos
    Ó ÙÒ Ö Ó ÓÒ ÜÓ G =< V, E > ÓÒ ×Ø Ò × ´Ó Ô ×Ó×µ¸ ÙÒ Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ
 × ÙÒ Ö ÓÐ Ö ÓÖ G Ø Ð ÕÙ Ð ×ÙÑ ØÓØ Ð ×Ù× ×Ø Ò × × Ñ Ò Ñ º
    ÄÓ× Ö ÓÐ × Ö ÓÖ × Ø Ò Ò ÑÙÝ ÙØ Ð × ÔÐ ÓÒ ×º ËÙÔÓÒ ÑÓ׸ ÔÓÖ ÑÔÐÓ¸
Ð ÔÐ Ò ¬ ÓÒ ÙÒ × ×Ø Ñ ÖÖÓÚ Ö Ó Ò ÓÒ Ð¸ Ó ÙÒ Ö            ØÖ Ò×Ñ × ÓÒ Ð ØÖ
Ô Ö Ð Ô ×º Ñ Ó× ÔÖÓÝ ØÓ× ÓÒÐÐ Ú Ò Óר × Ò Ø ÖÑ ÒÓ× ØÖ Ó¸ ÙÖ ÓÒ Ý ¬¹
Ò Ò Ñ ÒØÓº Ò ×Ø × × ØÙ ÓÒ × × ÔÙ ÑÓ Ð Þ Ö ÙÒ Ö Ó ØÓ × Ð × ÐØ ÖÒ Ø Ú ×
      Ø Ð     × ÙÒ ÐÓ× Ø ÖÑ ÒÓ× Ñ Ò ÓÒ Ó׺ Ð Ö Ó Ñ ÒØ Ò Ö Ð × ÔÓ× Ð × Ú × Ò
7.8. Arboles abarcadores m´
                          ınimos                                                         695



                             G                              C         L
                                         H
                   Á




          À            Ã


                              I          F                  B               M



      Ä


                             K           D                            A



  Å       Â                                                           J

              ´µ                                  ´ µ

                       ÙÖ º ¾ ÍÒ Ö Ó Ý ×Ù Ö ÓÐ          Ö       ÓÖ Ñ Ò ÑÓ

 ÙÒ ÓÒ Ð Ó Ö ¸ Ó Ð ÙÖ ÓÒ ÓÒרÖÙ ÓÒ Ó Ð Óר ¬Ò Ò Ñ ÒØÓº Ò
 Ñ × × ØÙ ÓÒ ×¸ ÙÒ Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ ÒÓ× ÔÖÓÔÓÖ ÓÒ Ð Ö Ñ Ò Ñ ¸ × ÙÒ ÐÓ×
Ø ÖÑ ÒÓ× Ð ÑÓ ÐÓ¸ ÕÙ Ö ÒØ Þ ÓÑÔÐ Ø ÓÒ Ø Ú º
      ÓÒ× Ö ÑÓ× ÙÒ Ö Ó G =< V, E > Ý ÙÒ Ö ÓÐ Ö ÓÖ T =< V, E > | E ⊂ Eº
ÈÙÒØÙ Ð ÑÓ× Ð ÙÒ × Ó × ÖÚ ÓÒ × ×Ó Ö Ð Ö Ø Ö Ö ÓÐ Ý Ñ Ò Ñ Ð      T

   ½º Ë G ÓÒØ Ò ÐÓ׸ ÒØÓÒ ×¸ ÓÒ ÖØ ØÙ ¸ |E | < |E|º
   ¾º Ë T × Ñ Ò ÑÓ¸ ÒØÓÒ ×
                                         Ô ×Ó(e) × Ñ Ò Ñ                                ´ºµ
                                  ∀e∈E


     Ë ÒÓ Ü ×Ø Ò Ò ÙÒ Ú ÐÓÖ Ö Ô Ø Ó Ô ×Ó Ò G¸ ÒØÓÒ × ÒÓ Ü ×Ø Ò Ò ÙÒ ÓØÖÓ
       ÓÒ ÙÒØÓ E ÙÝ ×ÙÑ × Ñ ÒÓÖº
         ÐÓ ÓÒØÖ Ö Ó¸ ÔÙ Ò Ü ×Ø Ö ÙÒÓ Ó Ñ × ÓÒ ÙÒØÓ× Ö Ó× E ÙÝ ×ÙÑ × Ù Ð
        Ð E ¸ Ô ÖÓ ×ØÓ× Ø Ñ Ò ×ÓÒ Ñ Ò ÑÓ׺        Ó ÓØÖÓ ÑÓ Ó¸ ÙÒ Ö Ó G ÔÙ
     Ø Ò Ö Ú Ö Ó× Ö ÓÐ × Ö ÓÖ × Ñ Ò ÑÓ׺
   ÍÒ Ð ÓÖ ØÑÓ ÕÙ Ò Ù ÒØÖ ÙÒ Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ              ר Ò Ù Ö ÐÓ× Ö Ó× ÕÙ
Ô ÖØ Ò Ò E ÐÓ× ÕÙ ÒÓ Ô ÖØ Ò Òº Ù Ò Ó ÓÒ× Ö ÑÓ× ÙÒ Ö Ó G¸ ÓÑÓ
× ÑÓ× × ×Ø Ô ÖØ Ò Ó ÒÓ Ð Ö ÓÐ Ö ÓÖ È Ö Ð ÓÖ                          ר Ù ×Ø ÓÒ
Ö ÕÙ Ö Ö ÑÓ× Ð × Ù ÒØ ¬Ò ÓÒ
Definici´n 7.7 (Corte de un grafo) Ë ÙÒ Ö Ó Gº ÍÒ
       o                                                         ÓÖØ ×Ó Ö   G   × ÙÒ Ô ÖØ ÓÒ
  G Ò Ó× ×Ù Ö Ó× × ÙÒØÓ× G1 Ý G2º
   ÄÓ× Ö Ó× Ð Ñ Ò Ó× G¸ × Ö¸ ÕÙ ÐÐÓ× ÕÙ ÓÒ Ø                    Ò ÒÓ Ó×     G1    ÓÒ ÒÓ Ó×
G2¸ ×  ÒÓÑ Ò Ò Ö Ó× ÓÖØ º
   Ä × ØÙ ÓÒ Ò Ù ×Ø ÓÒ × ÔÙ         Ô ØÓÖ Þ Ö ×
696                                                          Cap´
                                                                ıtulo 7. Grafos



                                      G

                                            .
                       G1                   .         G2
                                            .
                                   arcos de corte




Ë Ò ×Ø ¬ ÙÖ Ñ Ò ÑÓ× ÙÒ Ö ÓÐ Ö ÓÖ¸ ÒØÓÒ ×¸ ÒÓ×    × Ö Ó Ú Ó ÕÙ ×ÓÐÓ ÙÒÓ
 ÒØÖ ÐÓ× Ö Ó× ÖÙ Ô ÖØ Ò Ð Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ¸ Ô٠׸ ÐÓ ÓÒØÖ Ö Ó¸ Ö
ÙÒ ÐÓ Ý ÒÓ ÔÓ Ö ÑÓ× Ö ÕÙ × ÙÒ Ö ÓÐ Ö ÓÖº Ù Ð ÒØÖ ØÓ Ó× ÐÓ× Ö Ó×
    ÖÙ Ô ÖØ Ò   Ð Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ Ä Ö ×ÔÙ ×Ø ÒÓ× Ð Ó Ö Ð × Ù ÒØ
ÔÖÓÔÓ× ÓÒº
Proposici´n 7.1 (Propiedad del corte - Sedgewick-2001 [33]) Ë G =< V, E >
         o
ÙÒ Ö Ó Ý T =< V, E > | E ⊂ E¸ ÙÒ Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ Gº Ë < G1, G2 > ÙÒ
 ÓÖØ Ù ÐÕÙ Ö Gº ÒØÓÒ × Ð Ö Ó ÖÙ Ñ Ò ÑÓ ÒØÖ ÐÓ× ÔÓ× Ð × ÖÙ ÒØÖ
G1 Ý G2 Ô ÖØ Ò   Ð Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓº
Demostraci´n (por contradicci´n)
          o                  o   ËÙÔÓÒ ÑÓ× ÙÒ ÓÖØ Ù ÐÕÙ Ö < G1, G2 > Ý Ð
Ü ×Ø Ò     ÙÒ Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ T =< V, E > ÙÝÓ Ö Ó ÖÙ ÒÓ × Ð Ñ Ò ÑÓº
   Ë Ò T1 Ý T2 ÐÓ× ÓÑÔÓÒ ÒØ × T × ÙÒ Ð ÓÖØ º È ØÓÖ ÑÓ× Ð ×ÙÒØÓ ×
                                       T
                                            .
                       T1                   .          T2
                                            .
                                   arcos de corte


Ë     a Ð ÖÓ      ÖÙ ÒØÖ T1 Ý T2¸ Р٠и ÓÑÓ Ý ÐÓ ÑÓ× Ó¸ ÒÓ × Ð Ñ Ò ÑÓ
    ÐÓ×    ÖÙ ÒØÖ G1 Ý G2º ÈÙ ×ØÓ ÕÙ T1 Ý T2 ×ÓÒ Ð Ó׸ ÔÓ ÑÓ× ×ÙÔÖ Ñ Ö Ð
 Ö Ó ÖÙ a Ý ×Ù ×Ø ØÙ ÖÐÓ ÔÓÖ Ð ÖÙ Ñ Ò ÑÓ amin Ý × Ö Ö ÙÒ Ö ÓÐ Ö ÓÖ
T =< V, E >=< V, E − {a} ∪ {aÑ Ò } >º ÈÙ ×ØÓ ÕÙ Ô ×Ó(amin) < Ô ×Ó(a) =⇒
   ∀e∈E Ô ×Ó(e) <    ∀e∈E Ô ×Ó(e)º ÄÓ ÕÙ ÓÒØÖ      Ð ÔÖ Ñ × Ò Ð ÕÙ T × Ð
 Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ Gº Ä ÔÖÓÔÓ× ÓÒ × ÔÙ × ÖØ
    ÄÓ× Ð ÓÖ ØÑÓ× ÕÙ ØÖ Ø Ö ÑÓ× ÓÒרÖÙÝ Ò ÔÖÓ Ö × Ú Ñ ÒØ ÙÒ Ö ÓÐ T ÔÓÖ Ò ÙÖ
ÔÖÓ Ö × Ú      Ö Ó׺       Ú Þ ÕÙ × Ò ÙÒ ÒÙ ÚÓ Ö Ó Ð Ö ÓÐ T × Ú Ö ¬ × ×
  Ù× ÙÒ ÐÓº Ë × ×¸ ÒØÓÒ × Ð Ö Ó Ö Ò Ò Ó × Ð Ñ Ò Ð Ö ÓÐ                         ÐÓ
 ÓÒØÖ Ö Ó¸ ר Ô ÖØ Ò      Ð Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓº Ä         Ö Ò ÒØÖ ÐÓ× Ð ÓÖ ØÑÓ×
 × Ð Ñ Ò Ö Ò ÕÙ × × Ó Ò ÐÓ× Ö Ó× Ð Ö Ó Ô Ö ÖÐÓ× Ò ÓÖÔÓÖ Ò Ó T º               ר
ÑÓ Ó¸ ÔÓ ÑÓ× Ú ×ÐÙÑ Ö Ö Ð × Ù ÒØ Ô ØÖÓÒ Ò Ö Ð ÙÒ Ð ÓÖ ØÑÓ               Ð ÙÐÓ
 Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ
Algoritmo 7.4 (Patr´n general de c´lculo de ´rbol abarcador m´
                   o              a         a                ınimo)
    ÒØÖ    ÙÒ Ö Ó ÓÒ Ô ×Ó× ÓÒ ÜÓ G =< V, E >º
   Ë Ð ÍÒ Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ T =< V, E > Gº
7.8. Arboles abarcadores m´
                          ınimos                                               697



  ½º Ë T =< V , E >=< ∅, ∅ >º
  ¾º Ê Ô Ø Ñ ÒØÖ × T ÒÓ ÖÕÙ        G

        ´µ   (*)Ë Ð ÓÒ ÓÒ Ö Ø Ö Ó ÙÒ Ö Ó e ∈ E Ý Ö Ð E = E − {e} ´ ר × Ð Ô ×Ó
            ÕÙ Ú Ö × ÙÒ Ð Ð ÓÖ ØÑÓµº
        ´ µ E = E ∪ eº
        ´ µ Ë T × Ð Ó =⇒
              º (**) × Ó Ö Ð Ö Ó ÕÙ × Ô ÖØ Ð ÐÓ ÕÙ Ø Ò Ñ ÝÓÖ Ô ×Óº
              º E = E − {e}
 ר רÖÙ ØÙÖ × Ð Ñ ×Ñ Ô Ö ÐÓ× Ó× Ð ÓÖ ØÑÓ× ÕÙ ×ØÙ Ö ÑÓ׸ Ñ ÒØ Ó× ÃÖÙ× Ð
Ý ÈÖ Ñ¸ Ö ×Ô Ø Ú Ñ ÒØ º Ä     Ö Ò ÒØÖ ÐÐÓ× Ö × ÔÖ ÑÓÖ ÐÑ ÒØ Ò Ð Ô ×Ó
¾ × Ö¸ Ò Ð Ñ Ò Ö Ò ÕÙ × × Ó Ò ÐÓ× Ö Ó× Ô Ö Ò× ÖØ ÖÐÓ× Ò T º ÍÒ      ÖÒ
× ÙÒ Ö × ÓÑÓ × Ø Ø × T Ý          Ö Gº
     Ù Ò Ó Ð Ò ÐÙ× ÓÒ ÙÒ ÒÙ ÚÓ Ö Ó Ò Ð Ö ÓÐ T Ù× ÙÒ ÐÓ         Ð Ñ Ò Ö× Ð
 Ö Ó Ô ÖØ Ð ÐÓ ÕÙ Ø Ò Ñ ÝÓÖ Ô ×Óº Ä ÔÖÓÔÓ× ÓÒ × Ù ÒØ ÒÓ× Ú Ò ÕÙ Ð
 Ö ÓÐ Ö ÓÖ Ö ×ÙÐØ ÒØ × Ñ Ò ÑÓº
Proposici´n 7.2 (Propiedad del ciclo - Sedgewick-2001 [33])
         o                                                      Ë G ÙÒ Ö Ó ÓÒ ÜÓ
 Ù ÐÕÙ Ö Ý T ×Ù Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓº Ë G ÙÒ Ö Ó ÓÒרÖÙ              Ó ÔÓÖ Ò ÙÖ
ÙÒ Ö Ó e Gº ÒØÓÒ ×¸ Ò Ö e T Ý Ð Ñ Ò Ö Ð Ö Ó Ñ ÝÓÖ Ô             ×Ó Ò Ð ÐÓ Ö ×ÙÐØ
 Ò ÙÒ Ö ÓÐ Ö ÓÖ T ÕÙ × Ñ Ò ÑÓº
Demostraci´n Ë e × Ð Ö Ó ÓÒ Ñ ÝÓÖ Ô ×Ó Ð
          o                                   ÐÓ¸ ÒØÓÒ × ×Ø ÒÓ ÔÙ × Ö Ô ÖØ
  T ÔÓÖÕÙ × ÒÓ T ÒÓ × Ö Ñ Ò ÑÓ ´ Ü ×Ø Ö ÓØÖÓ Ö Ó Ñ ÒÓÖ Ô ×Óµº
     ÐÓ ÓÒØÖ Ö Ó¸ × emax Ð Ö Ó Ô ÖØ Ð ÐÓ     ÓÒ Ñ ÝÓÖ Ô ×Óº Ð Ñ Ò Ö emax T
ÐÓ ÓÖØ Ò Ó× Ö ÓÐ × × ÙÒØÓ× ÐÓ× Ù Ð ×¸ × ÙÒ Ð ÔÖÓÔÓ× ÓÒ º½ ר Ò ÓÒ Ø Ó× Ò
T ÔÓÖ Ð Ñ Ò ÑÓ Ö Ó  ÖÙ º T ׸ ÔÓÖ Ø ÒØÓ¸ Ñ Ò ÑÓ
7.8.1    Acceso a los pesos del grafo
Ë ÔÖ Ø Ò ÑÓ× Ð ÓÖ Ö Ð ÓÖ ØÑÓ× Ò Ö Ð × Ô Ö Ð ÙÐ Ö Ö ÓÐ × Ö ÓÖ × Ñ Ò ÑÓ׸
 × Ö¸ ÕÙ ÓÔ Ö Ò Ô Ö Ù ÐÕÙ Ö Ð × Ô ×Ó׸ ÒØÓÒ ×               ÑÓ× × Ô Ö Ö Ð Ð ÓÖ ØÑÓ
ØÓ Ó ÐÓ ÕÙ Ø Ò ÐÓ× Ô ×Ó׺ Ò Ø Ð × ÒØ Ó¸ Ù× Ö ÑÓ× Ó× Ð × × ÕÙ × Ö Ò Ô Ö Ñ ØÖÓ×
Ø ÔÓ× ÙÒ Ð ÓÖ ØÑÓ Ô Ö Ð ÙÐ Ö Ð Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ
   ½º Distance<GT> Ð ×          ×Ó Ð Ô ×Ó ÙÒ Ö Ó¸ Ð Ù Ð         ÜÔÓÖØ Ö ÐÓ× × Ù ÒØ ×
       ØÖ ÙØÓ×
       ´ µ Distance<GT>::Distance Type Ð Ø ÔÓ         ØÓ ÕÙ Ö ÔÖ × ÒØ ÙÒ Ô ×Ó Ò ÙÒ
            Ö Óº
       ´ µ typename Distance<GT>::Distance Type operator () (typename GT::Arc *a) Ö ¹
           ØÓÖÒ Ð Ú ÐÓÖ Ô ×Ó ÓÒØ Ò Ó Ò Ð Ö Ó aº
       ´ µ typename Distance<GT>::Max Distance ÓÒר ÒØ ר Ø ÓÖÖ ×ÔÓÒ ÒØ
            Ð Ú ÐÓÖ Ñ Ü ÑÓ    ר Ò ÕÙ ÙÒ Ð ÓÖ ØÑÓ ÓÒ× Ö Ö ÓÑÓ Ú ÐÓÖ Ò¬Ò ØÓº
698                                                              Cap´
                                                                    ıtulo 7. Grafos



         ´µ                                ÓÒר ÒØ ר Ø ÓÖÖ ×ÔÓÒ ÒØ
              typename Distance<GT>::Zero Distance
          Ð Ð Ñ ÒØÓ Ò ÙØÖÓ Ð ×ÙÑ º ÌÖ ÓÒ ÐÑ ÒØ ¸ Ò Ð ÒÑ Ò× Ñ ÝÓÖ
           ×Ó׸ ר × Ö Ð ÖÓº
  ¾º Compare<GT> Ð × ÕÙ Ö Ð Þ Ð ÓÑÔ Ö ÓÒ ÒØÖ Ó× Ô ×Ó× Ý ÕÙ    ÜÔÓÖØ Ö
         bool operator () (const typename Distance<GT>::Distance_Type & op1,
                           const typename Distance<GT>::Distance_Type & op2) const;

     Ô Ö ÑÔÐ ÒØ Ö Ð Ö Ð ÓÒ Ñ ÒÓÖ ÕÙ º
  ¿º Plus Ð × ×ÙÑ ÒØÖ ×Ø Ò × ÑÔÐ ÒØ                   Ñ   ÒØ Ð ÓÔ Ö ÓÖ
          typename Distance<GT>::Distance_Type
      Plus::operator () (const typename Distance<GT>::Distance_Type & op1,
                         const typename Distance<GT>::Distance_Type & op2) const;

   Ä × Ð × × Distance Ý Compare × ÓÒ Ù Ò           Ó ÙÒ Ð × ×Ô    Ð   ÓÑÔ Ö ÓÒ
 Ö Ó× ÙÝ ¬Ò ÓÒ × ÓÑÓ × Ù
  ÓÑÔ Ö ÓÖ      Ö Ó×     ≡
    template <class GT, class Distance, class Compare>
  struct Distance_Compare
  {
    bool operator () (typename GT::Arc * a1, typename GT::Arc * a2) const
    {
      return Compare () ( Distance () (a1) , Distance () (a2) );
    }
  };
  ¬Ò ×
  Distance Compare¸   Ù×   Ò ÙÒ ×   ¸ ¼¿¸ Ò   ¼º
    ÍÒ ÔÖ Ñ Ö ÓÖÑ   ÓÒ Ù Ö ×Ø × Ð × × × ÑÔÐ ÒØ Ò Ó Ð Ð ÙÐÓ Ð Óר ÙÒ
 Ö Ó × Ö¸ Ð ×ÙÑ ÐÓ× Ô ×Ó× ØÓ Ó× ×Ù× Ö Ó׺ È Ö ÐÐÓ¸ Ö ÕÙ Ö ÑÓ× ÙÒ Ù ÖØ
 Ð × ÕÙ ÑÔÐ ÒØ Ð ×ÙÑ Ô ×Ó×
   ÓÑÔ Ö ÓÖ   Ö Ó×  +≡
      template <class GT, class Distance, class Compare, class Plus, class SA>
  typename Distance::Distance_Type total_cost(GT & g)
  {
    typename Distance::Distance_Type sum = Distance::Zero_Distance;
        // recorrer todos los arcos y sumar su peso
    for (Arc_Iterator <GT, SA> it(g); it.has_current(); it.next())
      sum = Plus () (sum, Distance () (it.get_current_arc()));
    return sum;
  }
      template <class GT, class Distance>
  typename Distance::Distance_Type total_cost(GT & g)
  {
    typedef Aleph::less<typename Distance::Distance_Type> Less;
    typedef Aleph::plus<typename Distance::Distance_Type> Plus;
    return total_cost <GT, Distance, Less, Plus, Default_Show_Arc<GT> > (g);
  }
Í× × Arc Iterator      º
7.8. Arboles abarcadores m´
                          ınimos                                                699



7.8.2     Algoritmo de Kruskal
  Ð Ð ÓÖ ØÑÓ ÃÖÙ× Ð × Ð ÓÒ ÐÓ× Ö Ó× Ò× ÖØ Ö Ò T × ÙÒ ×Ù Ô ×Ó¸ ×       Ð Ñ ÒÓÖ
 Ð Ñ ÝÓÖº È Ö ÐÐÓ¸ ÐÓ× Ö Ó× × ÓÖ Ò Ò ÔÖ Ú Ñ ÒØ ¸ Ñ Ò Ö Ø Ð ÕÙ ¸ Ø Ö Ò Ó ×Ó Ö
 ÐÐÓ× ´Ú Ö Ü º¿º½¼º½ ´Ô Ò ¼µµ¸ רÓ× Ô Ö Þ Ò ÓÖ Ò Ñ ÒØ º ר ÓÖ Ò Ñ ÒØÓ
ÔÖ Ú Ó ÐÓ Ö Ð Þ ÑÓ× Ð × Ù ÒØ ÑÓ Ó
 ÓÖ Ò Ö Ö Ó×        ≡                                       ´ ¼½µ
  g.template sort_arcs<Distance_Compare<GT, Distance, Compare> >();
Í× × Distance Compare       º
 ×     Ö¸ × ÒÚÓ Ð Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓ Ö Ó× ÔÐ ÒØ Ó Ò Ü º¿º½¼º½¼ ´Ô Ò ¼½µº
   ÈÖÓ × Ö ÐÓ× Ö Ó× ÓÖ Ò Ñ ÒØ × Ð ×ØÖ Ø       ÕÙ Ò Ð ×Ó Ð Ð ÓÖ ØÑÓ
ÃÖÙ× Ð ÙÑÔÐ Ð ÖÓÐ Ð Ô ×Ó ¾ Ð Ð ÓÖ ØÑÓ Ò Ö Ó º º
    Ð ÔÖÓ ×Ó Ô Ö Ó Ø Ò Ö Ð Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ¸ ÐÙ Ó Ø Ò Ö ÐÓ× Ö Ó× ÓÖ Ò Ó×
× Ð Ò ¸ Ö Ò × Ö × Ó׸ Ð × Ù ÒØ Ñ Ò Ö
  Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ × ÙÒ ÃÖÙ× Ð     ≡              ´ ¼½µ
    // Recorrer arcos ordenados de g hasta que numero de arcos de tree sea
    // igual a numero de nodos de g
  for (Arc_Iterator<GT, SA> arc_itor(g);
       tree.get_num_arcs() < g.get_num_nodes() - 1; arc_itor.next())
    {     // obtenga siguiente menor arco
      typename GT::Arc * arc = arc_itor.get_current_arc();
         Î Ö ¬ Ö × ÒÓ Ó ÓÖ Ò Ü ×Ø Ò ØÖ ¼¼
         Î Ö ¬ Ö × ÒÓ Ó ×Ø ÒÓ Ü ×Ø Ò ØÖ ¼¼
         typename GT::Arc * arc_in_tree =
           tree.insert_arc(tree_src_node, tree_tgt_node, arc->get_info());
         if (Has_Cycle <GT, SA> () (tree)) // verifique si nuevo arco causa un ciclo
           {     // hay ciclo ==> hay que remover el arco
             tree.remove_arc(arc_in_tree); // eliminar arco e ir a procesar
             continue;                     // siguiente arco
           }
         GT::map_arcs(arc, arc_in_tree);
     }
Í× × Arc Iterator       º
  Ð ÐÓ Ñ Ö ÐÓ× Ö Ó× Ð Ö Ó × Ð Ñ ÒÓÖ ×Ø Ð Ñ ÝÓÖº                 Ö Ó ÕÙ × Ñ Ö Ó ×
 Ò× ÖØ Ò tree ݸ × ×Ø ÒÓ Ù× ÙÒ ÐÓ¸ ÒØÓÒ × ×Ø × Ô ÖØ Ð Ö ÓÐ Ö ÓÖº Ð
ÔÖÓ ×Ó ÓÒØ ÒÙ ×Ø ÕÙ Ð ÒØ               Ö Ó× Ð Ö ÓÐ × Ü Ø Ñ ÒØ Ð ÒØ
ÒÓ Ó× Ð Ö Ó Ñ ÒÓ× ÙÒÓ¸ ÐÓ Ù Ð × Ð Ò       ÓÒ ÕÙ Ð Ö ÓÐ Ý         Ö ÓÑÔÐ Ø Ñ ÒØ
   ÐÓ× ÒÓ Ó× Ð Ö Ó × Ò Ô Ö Ö ×Ù ÓÒ ÓÒ        Ö ÓÐ ¹ Ù ÐÕÙ Ö ÓØÖÓ Ö Ó ÕÙ × Ò× ÖØ
 Ò tree Ù× Ö ÙÒ ÐÓ¹º
     ÍÒ Ö Ò ÓÒ         Ð Ð ÓÖ ØÑÓ ÃÖÙ× Ð¸ ÔÖ Ò× Ð Ñ ÒØ Ò×Ô ÓÒ ×Ù×
  ÐÓÕÙ × ÔÖ Ò Ô Ð ×¸ × ÕÙ ÔÙ ÑÓ ¬ Ö× ÓÒ Ö Ð Ø Ú              Ð      Ô Ö ÕÙ ÓÔ Ö
 ÓÒ ÙÖÖ ÒØ Ñ ÒØ º Ò ÔÖ Ñ Ö ÐÙ Ö¸ ÓÑÓ ×Ù ÒØ Ñ ÒØ ÜÔÐ ÑÓ× ÓÒ Ð ÕÙ ×ÓÖØ
 Ò Ü ¿º¾º¾º ´Ô Ò ½ µ¸ ÔÓ ÑÓ× Ð Ö ÖÐÓ ×Ù ×Ø Ò ÐÑ ÒØ × ÐÓ ÑÓ ¬ ÑÓ× Ô Ö
Ù× Ö Ú Ö Ó× ÔÖÓ × ÓÖ × Ñ Ø Ö Ð ×º Å ×    и Ô ÖÓ ÓÑÔÖÓ Ñ ÒØ ÔÓ× Ð ¸ × ÑÓ ¹
¬ Ö Ð ÐÓÕÙ Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ × ÙÒ ÃÖÙ× Ð                     Ô Ö ÕÙ Ñ Ò
ÐÓ× ÐÓÕÙ × ÒØ ÖÒÓ× Î Ö ¬ Ö × ÒÓ Ó ÓÖ Ò Ü ×Ø Ò ØÖ ¼¼ Ý Î Ö ¬ Ö × ÒÓ Ó
    ר ÒÓ Ü ×Ø Ò ØÖ ¼¼ Ò ÔÖÓ × ÓÖ × Ö ÒØ ׺
     ÈÓÖ Ö ÕÙ Ö Ñ ÒØÓ× ÒØ Ö Þ¸ Ô Ö Ò× ÖØ Ö ÙÒ Ö Ó Ò tree × Ò × Ö Ó ÕÙ ×Ù× ÒÓ Ó×
700                                                                                                                                                                                   Cap´
                                                                                                                                                                                              ıtulo 7. Grafos


                  L       4       M            2       N       3       O       6       P                                       L               4               M               2               N               3               O               6               P


              10      12      10           8       3       1       3       1       1       7                               10              12              10              8               3               1               3               1               1       7


         F        5       G           15       H               I               J       4       K               F               5               G                   15          H                               I                               J               4       K
                                                       2               2                                                                                                                       2                               2

              9       4       1            7       3       2       1       2       5       2                               9               4               1               7               3               2               1               2               5       2


                  A       3       B            4       C       3       D       4       E                                       A               3               B               4               C               3               D               4               E


                                                   ´µ                                                                                                                                  ´ µ
                  L       4       M            2       N       3       O       6       P                                       L               4               M               2               N               3               O               6               P


              10      12      10           8       3       1       3       1       1       7                               10              12              10              8               3               1               3               1               1       7


         F        5       G           15       H               I               J       4       K               F               5               G                   15          H                               I                               J               4       K
                                                       2               2                                                                                                                       2                               2

              9       4       1            7       3       2       1       2       5       2                               9               4               1               7               3               2               1               2               5       2


                  A       3       B            4       C       3       D       4       E                                       A               3               B               4               C               3               D               4               E


                                                   ´µ                                                                                                                                  ´ µ
                  L       4       M            2       N       3       O       6       P                   L           4               M               2               N               3               O               6               P


              10      12      10           8       3       1       3       1       1       7           10          12              10              8               3               1               3               1               1               7


         F        5       G           15       H               I               J       4       K   F       5           G                   15          H                               I                               J               4               K
                                                       2               2                                                                                               2                               2

              9       4       1            7       3       2       1       2       5       2           9           4               1               7               3               2               1               2               5               2


                  A       3       B            4       C       3       D       4       E                   A           3               B               4               C               3               D               4               E


                                                   ´µ                                                                                                              ´µ

             ÙÖ º ¿ ÈÖÓ Ö ×Ó Ð Ð ÓÖ ØÑÓ                                                    ÃÖÙ× Ð ´                            ¬ ÙÖ ÓÖÖ ×ÔÓÒ                                                                       ØÖ × Ø Ö ÓÒ ×µ

     Ý    Ý Ò × Ó ÔÖ Ú Ñ ÒØ Ò× ÖØ Ó׺ ר × Ð ÖÓÐ × Ó ÐÓ× ÐÓÕÙ × Î Ö ¬ Ö ×
     ÒÓ Ó ÓÖ Ò Ü ×Ø Ò ØÖ ¼¼ Ý Î Ö ¬ Ö × ÒÓ Ó ×Ø ÒÓ Ü ×Ø Ò ØÖ ¼¼ ¸ Ð
      Ù Ð ÓÑ ÒØ Ö ÑÓ× Ð ÔÖ Ñ ÖÓ
¼¼    Î Ö ¬ Ö × ÒÓ Ó ÓÖ Ò Ü ×Ø Ò ØÖ ¼¼ ≡                  ´   µ
         typename GT::Node * g_src_node = g.get_src_node(arc); // nodo origen en g
         typename GT::Node * tree_src_node; // nodo origen en tree
         if (not IS_NODE_VISITED(g_src_node, Aleph::Kruskal)) // ¿est´ en tree?
                                                                     a
           {     // No, crearlo en tree, atarlo al cookie y marcar como visitado
             NODE_BITS(g_src_node).set_bit(Aleph::Kruskal, true);
             tree_src_node = tree.insert_node(g_src_node->get_info());
             GT::map_nodes(g_src_node, tree_src_node);
           }
          else
            tree_src_node = static_cast<typename GT::Node*>(NODE_COOKIE(g_src_node));
       ÓÑÓ × Ú ¸ Ð ÐÓÕÙ Ø Ò Ó× ­Ù Ó× Ó Ð ÒÓ Ó Ý ×Ø Ò× ÖØ Ó Ý Ñ Ô Ó Ò tree
     ´­Ù Ó Ð elseµ¸ Ó Ý ÕÙ Ö ÖÐÓ¸ Ñ Ö ÖÐÓ Ý Ñ Ô ÖÐÓº Ð ÓØÖÓ ÐÓÕÙ × × Ñ Ð Ö Ô ÖÓ
      ÓÒ Ð ÓØÖÓ ÜØÖ ÑÓ Ð Ö Ó
¼¼    Î Ö ¬ Ö × ÒÓ Ó ×Ø ÒÓ Ü ×Ø Ò ØÖ ¼¼ ≡                     ´  µ
         typename GT::Node * g_tgt_node = g.get_tgt_node(arc);
         typename GT::Node * tree_tgt_node; // Nodo destino en arbol abarcador
                                                               ´
         if (not IS_NODE_VISITED(g_tgt_node, Aleph::Kruskal))
           {     // No, crearlo en tree, atarlo al cookie y marcar como visitado
             NODE_BITS(g_tgt_node).set_bit(Aleph::Kruskal, true);
7.8. Arboles abarcadores m´
                               ınimos                                                701



           tree_tgt_node = tree.insert_node(g_tgt_node->get_info());
           GT::map_nodes(g_tgt_node, tree_tgt_node);
        }
       else
          tree_tgt_node = static_cast<typename GT::Node*>(NODE_COOKIE(g_tgt_node));
          ÓÒ ØÓ × Ð × ×ØÖÙ ØÙÖ × ÒØ Ö ÓÖ ×¸ ÔÓ ÑÓ× ×Ô ¬ Ö Ð ÖÙØ Ò         ÒØ Ö Þ
¼½     Ð ÓÖ ØÑÓ ÃÖÙ× Ð ¼½ ≡
        template <class GT, class Distance, class Compare, class SA> inline
      void kruskal_min_spanning_tree(GT & g, GT & tree)
      {
        g.reset_bit_nodes(Aleph::Kruskal); // limpiar bits de marcado
        clear_graph(tree); // limpia grafo destino
          ÓÖ Ò Ö Ö Ó×
            Ð ÙÐ Ö Ö ÓÐ   Ö ÓÖ Ñ Ò ÑÓ × ÙÒ ÃÖÙ× Ð
      }
          Ð ¬Ò Ð Ð ÐÐ Ñ ¸ tree ÓÒØ Ò ÙÒ Ö ÓÐ Ö ÓÖ ÙÝÓ× cookies¸ Ø ÒØÓ
     ÒÓ Ó× ÓÑÓ    Ö Ó׸ ר Ò Ñ Ô Ó× Ð Ö Ó g Ý Ú Ú Ö× º Ä × ×Ø Ò × ÐÓ× Ö Ó×
     ×ÓÒ Ø ÔÓ Distance::Distance Type Ý       × ÔÓÖ ×Ø Ð × º Ä × ÓÑÔ Ö ÓÒ ×
      ÒØÖ ×Ø Ò Ð × Ö Ð Þ Ð Ð × Compareº
         Ä ÑÔÐ ÒØ ÓÒ ÓÑÔÐ Ø Ö × Ò Ð Ö ÚÓ Kruskal.Hº
     7.8.2.1    An´lisis del algoritmo de Kruskal
                  a

      Ð Ø ÑÔÓ         Ù ÓÒ ×Ø Ö     Ó ÔÓÖ Ð ×ÙÑ       ÐÓ× ÐÓÕÙ × ÓÖ Ò Ö Ö Ó×        Ñ×
         Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ × ÙÒ ÃÖÙ× Ð               º
          Ë ÑÓ׸ ÔÓÖ Ò Ð × × ÔÖ Ú Ó׸ ÕÙ Ð Ñ ÓÖ Ñ Ò Ö ÓÖ Ò Ö ÙÒ Ð ×Ø × O(n Ð (n))¸
     ÔÓÖ ÐÓ ÕÙ Ð ÐÓÕÙ ÓÖ Ò Ö Ö Ó×             Ü O(E Ð E)¸ ×Ô Ö Ó Ó Ø ÖÑ Ò ×Ø × ÙÒ
      Ð Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓº
          È Ö Ð ÐÓÕÙ       Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ × ÙÒ ÃÖÙ× Ð                  ×ÙÑ ÑÓ׸
      ÓÑÓ Ô ÓÖ ×Ó¸ ÕÙ Ð ÓÒ¬ ÙÖ ÓÒ               Ö Ó× × Ø Ð ÕÙ ×ØÓ×      Ò Ö Ú × Ö× Óѹ
     ÔÐ Ø Ñ ÒØ º Ð while Ö ÕÙ Ö Ö ¸ Ô٠׸ O(E) Ø Ö ÓÒ ×º ÒØÖÓ Ð while ×               Ù¹
     Ø Ò ÓÒר ÒØ Ñ ÒØ Ó× ÓÔ Ö ÓÒ × Ð Ò× Ö ÓÒ Ð Ö Ó Ò tree Ý Ð ÔÖÙ                      ¹
      Ð        has cycle()º Ä Ò× Ö ÓÒ       ÙÒ Ö Ó × O(1)¸ Ñ ÒØÖ × ÕÙ Ð ÒÚÓ ÓÒ
     has cycle() ´Ú Ö Ü º º ´Ô Ò ½ µµ × O(V)¸ Ô٠׸ ÔÓÖ ×Ù ÓÒ           ÓÒ     Ö ÓÐ Ó
      Ö Ó¸ Ô Ö ÐÑ ÒØ Ò ÓÒ ÜÓ¸ Ò tree E ≤ V º Ð ÐÓÕÙ               Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ
     Ñ Ò ÑÓ × ÙÒ ÃÖÙ× Ð            ÓÒÐÐ Ú ¸ ÒØÓÒ ×¸ O(E) × O(V) = O(E V) Ò Ð Ô ÓÖ ÐÓ×
        ×Ó׺
           Ð Ð ÓÖ ØÑÓ      ÃÖÙ× Ð ÓÒ×ÙÑ ¸ Ô Ö Ð Ô ÓÖ ×Ó¸ O(E Ð E) + O(E V) =
     O(max(E Ð E, E V)¸ ÐÓ Ù Ð ÐÓ        ØÖ Ø ÚÓ Ô Ö Ö Ó× ×Ô Ö Ó׺
     7.8.2.2    Correctitud del algoritmo de Kruskal

     È Ö Ú Ò Ö Ð ÓÖÖ Ø ØÙ ¸ × Ö¸ × Ð Ð ÓÖ ØÑÓ Ò               ØÓ Ò Ù ÒØÖ ÙÒ Ö ÓÐ       Ö¹
        ÓÖ Ñ Ò ÑÓ¸ ÒÓ× Ú Ð Ö ÑÓ× Ð × Ù ÒØ ÔÖÓÔÓ× ÓÒ
     Proposici´n 7.3
              o     Ë G ÙÒ Ö Ó ÓÒ ÜÓ Ù ÐÕÙ Ö º ÒØÓÒ × Ð Ð ÓÖ ØÑÓ                   ÃÖÙ× Ð
     Ò Ù ÒØÖ ÙÒ Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓº
702                                                           Cap´
                                                                      ıtulo 7. Grafos



     Demostraci´n (por inducci´n sobre V)
               o              o

       ½º   V≤2    Ð ÔÖÙ    × ÒÑ Ø º
       ¾º  V > 2 ×ÙÑ ÑÓ× ÕÙ Ð ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö ØÓ Ó n Ý Ú Ö ¬ Ö ÑÓ× ×Ù Ú Ð Þ
           Ô Ö n + 1º
           ÈÓÖ Ð ÔÓØ × × Ò Ù Ø Ú ¸ Ð Ð ÓÖ ØÑÓ Ñ ÒØ Ò ÙÒ Ö ÓÖ × Ò          Ö ÓÐ × Ö¹
              ÓÖ × Ñ Ò ÑÓ׺ Ù Ò Ó × ØÓÑ ÙÒ Ö Ó a n + 1 ÔÙ Ò Ó ÙÖÖ Ö Ó× × ØÙ ÓÒ ×
            ´ µ ÉÙ × Ö ÙÒ ÐÓ¸ Ò ÙÝÓ ×Ó¸ ÔÙ ×ØÓ ÕÙ ÐÓ× Ö Ó× Ù ÖÓÒ Ú ×ØÓ× ÓÖ Ò ¹
                Ñ ÒØ ¸ a × Ð Ö Ó ÓÒ Ñ ÝÓÖ Ô ×Ó ÒØÖÓ Ð ÐÓ Ù× Óº            ר ÑÓ Ó¸ Ð
                 Ð Ñ Ò ÖÐÓ Ð Ö Óи × ÙÒ Ð ÔÖÓÔ      Ð ÐÓ ´ÔÖÓÔº Ü º¾µ¸ Ð Ö ÓÖ × Ò
                × ÔÖ × ÖÚ Ý ×Ø × Ö ÓÐ × Ö ÓÖ × Ñ Ò ÑÓ׺
            ´ µ ÆÓ × Ö ÙÒ ÐÓ¸ Ò ÙÝÓ ×Ó Ð            ÓÒ a ÙÒ        Ó× ÓÑÔÓÒ ÒØ × Ò¹
                 ÓÒ ÜÓ׺ ÓÖ Ò¸ ÔÙ ×ØÓ ÕÙ a × Ú ×ØÓ ÓÖ Ò Ñ ÒØ ¸ a × Ð Ñ Ò ÑÓ Ö Ó
                    ÖÙ ÒØÖ ×ØÓ× Ó× ÓÑÔÓÒ ÒØ × Ý¸ ÔÓÖ Ð ÔÖÓÔ          ÓÖØ ´ÔÖÓÔº Ü º½µ¸
                 Ð ÓÑÔÓÒ ÒØ Ö ×ÙÐØ ÒØ × ÙÒ Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ
          Ä ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö ØÓ Ó Ö Ó

     7.8.3       Algoritmo de Prim
      Ð × ÙÒ Ó Ð ÓÖ ØÑÓ Ô Ö ÓÒרÖÙ Ö ÙÒ Ö ÓÐ Ö ÓÖ × × Ò ÙÒ ÑÓ ¬ ÓÒ Ð
     Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ Ò Ð Ù Ð¸ Ò ÐÙ Ö ÑÔÐ Ö ÙÒ ÓÐ Á Ǹ × Ù× ÙÒ ÓÐ
     ÔÖ ÓÖ   ÕÙ ÔÓÒ Ö ÐÓ× Ô ×Ó× ÐÓ× Ö Ó׺
     7.8.3.1      Interfaz del algoritmo de Prim

      Ð Ð ÓÖ ØÑÓ ÈÖ Ñ × ÒÚÓ Ñ            ÒØ Ð × × Ù ÒØ ÒØ Ö Þ
¼¾     Ð ÓÖ ØÑÓ ÈÖ Ñ ¼¾ ≡
          template <class GT, class Distance, class Compare, class SA> inline
      void prim_min_spanning_tree(GT & g, GT & tree)
      {
            ÁÒ    ÐÞ   Ö ÈÖ Ñ ¼
                ÐÖ     ÓÒ ÓÐ     ÔÖ ÓÖ    ¼
            ÁÒ Ð Þ     Ö Ô ¼
              Ð ÙÐ Ö    Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ × ÙÒ ÈÖ Ñ ¼
      }
            ÙÒ ÓÒ ÐÑ ÒØ ¸ ר ÒØ Ö Þ × Ü Ø      Ð    Ð Ð ÓÖ ØÑÓ   ÃÖÙ× Ðº
     7.8.3.2      Heap exclusivo de arcos m´
                                           ınimos

       Ð Ð ÓÖ ØÑÓ ÈÖ Ñ × ×ØÖÙ ØÙÖ ÐÑ ÒØ × Ñ Ð Ö Ð Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ º Ä    ÖÒ
      ×ØÖ Ò ÕÙ Ð ÐÙ Ö ÑÔÐ Ö ÙÒ ÓÐ Á Ç × ÑÔÐ ÙÒ ÔÖ ÓÖ ¸ Ð Ù Ð ×Ù
     Ú Þ ×Ù Ý ×Ó Ö ÙÒ Ôº
          Ò Ð Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ ´Ü º º ´Ô Ò ½ µµ¸ Ð Óר Ò ×Ô Ó          Ó Ð ÓÐ
     ÔÙ      Ð ÒÞ Ö O(E)º Ò Ð ÔÖ Ø ¸ ר × Ð Ñ ×ÑÓ ÓÒ×ÙÑÓ ÕÙ       ÖÖ ÙÒ Ôº Ë
      Ð Ö Ó × Ò×Ó¸ Ð Óר Ø Ò O(V 2)º
7.8. Arboles abarcadores m´
                               ınimos                                                     703



          Ü ×Ø ÙÒ Ø Ò ¸ ÔÖ × ÒØ ÔÓÖ Ë Û ¿¿ ¸ ÕÙ Ö Ù ×Ù ×Ø Ò ÐÑ ÒØ Ð
     Ø Ñ ÒÓ Ð Ô ÒÓ Ñ × V ÒØÖ × ÐÓ ÕÙ ÑÔÐ ÕÙ Ð Óר Ò Ø ÑÔÓ × Ö Ù
       O(Ð V) Ý Ð   ×Ô Ó O(V)º Ä     Ò Ö ÒØ ר Ø Ò ×Ù Ý Ò Ð × Ù ÒØ
       ¬Ò ÓÒº
     Definici´n 7.8 (Heap exclusivo de arcos m´
            o                                ınimos)  ÍÒ     Ô Ü ÐÙ× ÚÓ    Ö Ó×
     Ñ Ò ÑÓ× × ÙÒ Ô ÕÙ Ù Ö Ö Ó× ÙÒ Ö Ó ÓÖ Ò Ó× ÔÓÖ ×Ù Ô ×Ó Ñ Ò Ö
     Ø Ð ÕÙ ¸ Ò Ò Ò ÙÒ ÑÓÑ ÒØÓ¸ ÔÙ Ò Ü ×Ø Ö Ó× Ö Ó× ÓÒ Ð Ñ ×ÑÓ ÒÓ Ó ×Ø ÒÓº
         È Ö ÙÒ Ö Ó G =< V, E >¸ × ÑÔÓ× Ð ÕÙ Ð Ô ÓÒØ Ò Ñ × V − 1 Ö Ó׸
     ÔÙ × × ÒÓ Ö Ò Ó× Ö Ó× ÓÒ Ð Ñ ×ÑÓ ÒÓ Ó ×Ø ÒÓº
         ÈÓÖ ×Ù Ö Ø Ö       Ô¸ × Ö ÒØ Þ ÕÙ Ð ÜØÖ ÓÒ ÙÒ Ö Ó × ÓÖÖ ×ÔÓÒ Ö
      ÓÒ Ð Ô ×Ó Ñ Ò ÑÓ ÒØÖ ØÓ Ó× ÐÓ× Ò ÐÙ Ó× Ò Ð ÓÒ ÙÒØÓº
         ÍÒ     Ô Ø Ð ÓÑÓ Ð ÕÙ          ÑÓ×       ¬Ò Ö × ÑÔÐ ÒØ Ð Ñ ÒØ Ð
     Ì      BinHeap<Key> ×ØÙ      Ó Ò Ü º ´Ô Ò ¿¼½µº           ר Ð ×        Ô¸
     ÕÙ ÐÐ Ñ Ö ÑÓ× ArcHeap<GT, Distance, Compare, Access Arc>¸ ×       ¬Ò Ò Ð
      Ö ÚÓ Ö ÔºÀ ¼¿
¼¿     Ö ÔºÀ ¼¿ ≡
             template <class GT, class Distance, class Compare, class Access_Heap_Node>
         struct ArcHeap :
           public BinHeap<typename GT::Arc*, Distance_Compare<GT, Distance, Compare> >
         {
                ØÖ ÙØÓ× ÔÙ Ð Ó×       Ö À Ô ¼¿
         };
         ¬Ò ×
       ArcHeap¸ Ù×   Ò ÙÒ     × ¼ ¸ ¼ ¸ ½¾ ¸ Ò     ½ º
     Í× × Distance Compare      º
       Ð Ö ÚÓ ¬Ò Ð Ð × ArcHeap<GT, Distance, Compare, Access Arc>¸ Р٠Рѹ
     ÔÐ Ñ ÒØ ÙÒ Ô Ü ÐÙ× ÚÓ        Ö Ó× Ñ Ò ÑÓ׸ Ô ÖØ Ò ÒØ × ÙÒ Ö Ó Ø ÔÓ GT¸ ÓÒ
          ×Ó ÐÓ× Ô ×Ó× ÐÓ× Ö Ó× Ñ ÒØ Ð Ð × Distance Ý ÓÑÔ Ö ÓÒ ÒØÖ Ð × ×Ø Ò¹
        × ØÖ Ú × Ð Ð × Compareº Ð × ÒØ Ó Ð Ô Ö Ñ ØÖÓ Ø ÔÓ Access Arc × Ö ÜÔÐ Ó
     ÔÖÓÒØ Ñ ÒØ º
           ÓÑÓ × ÔÙ Ó × ÖÚ Ö         Ð     Ð Ö ÓÒ¸ ר Ö Ð ÑÔÐ Ñ ÒØ ÓÒ
     BinHeap<Key>¸ ÔÙ × Ð ÓÖ Ò    × Ð × ÙÒÓ ÐÓ× Ö ÕÙ Ö Ñ ÒØÓ× ÔÖ Ò Ô Ð × Ù Ò Ó ×
      ÜØÖ      Ð ÙÒ Ö Óº    ר ÑÓ Ó¸ Ð BinHeap<Key> Ñ Ò Ö ÒÓ Ó× Ð × Ù ÒØ Ø ÔÓ
¼¿     ØÖ ÙØÓ× ÔÙ Ð Ó×    Ö À Ô ¼¿ ≡                        ´ ¼¿ µ ¼
             typedef typename
         BinHeap<typename GT::Arc*, Distance_Compare<GT, Distance, Compare> >::Node Node;
     Í× × Distance Compare        º
              Ò ×Ø     Ô Ð ÓÔ Ö ÓÒ       Ò× Ö ÓÒ    ÙÒ Ö Ó × Ö ×ÙÑ        Ó Ð × Ù ÒØ Ð ÓÖ ØÑÓ
     Algoritmo 7.5     ´ÁÒ× Ö ÓÒ Ò Ö Ò ÙÒ Ô Ü ÐÙ× ÚÓµ
          Ä ÒØÖ      × ÙÒ Ö Ó a ÕÙ Ö Ð ÓÒ Ó× ÒÓ Ó× s Ý t¸ ÓÖ Ò Ý ×Ø ÒÓ¸ Ö ×Ô Ø Ú Ñ ÒØ º
     s   × ÙÒ ÒÓ Ó ÕÙ Ý Ô ÖØ Ò        ÙÒ Ö ÓÐ Ö ÓÖ Ý × Ó¸ ÔÓÖ Ø ÒØÓ¸ Ú × Ø Óº t ÒÓ
         × Ó Ú × Ø Ó Ý ÒÓ Ô ÖØ Ò Ð Ö ÓÐ Ö ÓÖº
         ½º Ù×ÕÙ Ò Ð Ô ÙÒ Ö Ó a Ø Ð ÕÙ ×Ù ÒÓ Ó ×Ø ÒÓ ×               tº

         ¾º Ë a × Ó Ò ÓÒØÖ Ó =⇒
704                                                          Cap´
                                                                    ıtulo 7. Grafos



             ´µË   a < a =⇒ ´× ÙÒ ÐÓ ÕÙ ÖÖÓ Ð Ð ×      ר Ò µ
                º ×Û Ô(a, a ) ´ ÒØ Ö Ñ a ÓÒ a µ
          ´ µ ÐÑÒ a Ð Ô
      ¿º ÁÒ× ÖØ a Ò Ð Ô
      × Ò × Ö Ó Ò ÓÒØÖ Ö ÙÒ Ñ Ò Ö Ö Ô        Ö ÙÔ Ö Ö a ÕÙ ÒÓ ÓÑÔÖÓÑ Ø Ð ¹
    × ÑÔ ÒÓ Ð Ôº ÈÓ ÑÓ× Ù× Ö ÙÒ Ø Ð           ÒÓ Ó× ×Ø ÒÓ×  Ö Ó× ÓÒØ Ò Ó× Ò Ð
        Ô¸ Ð Ù Ð ÔÙ Ö ÒרÖÙÑ ÒØ Ö× Ñ ÒØ ÙÒ Ø Ð × Ó ÙÒ Ö ÓÐ Ö ÓÖ¸ Ô ÖÓ
     ×ØÓ ÖÖ Ò ÖØ ÙÑ Ö ¸ × Ù× ÑÓ× ÙÒ Ø Ð × ¸ Ó Óר × O(Ð (n)) × Ù× ÑÓ× Ö ÓÐ ×
      Ò Ö Ó׺
          Ò Ú ÖØÙ ÐÓ ÒØ Ö ÓÖ¸ ÙÒÕÙ Ò ØÖ Ñ ÒØÓ Ð Ð Ö ¸ ÒÓØ Ö ÑÓ× Ò        ÒÓ Ó
       Ð Ö Ó¸ ØÖ Ú × Ð ÓÓ ¸ ÙÒ ÔÙÒØ ÖÓ       Ð ÒÓ Ó Ð Ô ÒØÖÓ Ð ArcHeapº È Ö
            Ö Ð ÓÓ ¸ ÒÓ× Ú Ð ÑÓ× ÙÒ Ð ×           ×Ó¸ ÒÓÑ Ò Access Heap Node¸
     ÙÝÓ ÓÔ Ö ÓÖ ()       ÓÖÖ ×ÔÓÒ Ö× ÓÒ Ð × Ù ÒØ ÔÖÓØÓØ ÔÓ
          template <class GT, class Distance, class Compare> typename
    BinHeap<typename GT::Arc*, Distance_Compare<GT, Distance, Compare> >::Node *&
      Access_Heap_Node::operator () (typename GT::Node * p);


         Ð ÓÔ Ö ÓÖ Ö ØÓÖÒ ÙÒ ÔÙÒØ ÖÓ Ð ÒÓ Ó Ð Ô ÕÙ ÓÒØ Ò ÙÒ Ö Ó Ò ÐÙ¹
      Ó Ò Ð ArcHeap ÙÝÓ ÒÓ Ó ×Ø ÒÓ × p¸ Ó NULL¸ × Ð Ô ÒÓ ÓÒØ Ò Ò Ò ÙÒ
     Ö Ó ÓÒ p ÓÑÓ ÒÓ Ó ×Ø ÒÓº × Ö ×ÔÓÒ× Ð              Ð Ù×Ù Ö Ó ArcHeap Ð ÕÙ
    Access Heap Node::operator () Ö ØÓÖÒ NULL Ð ÔÖ Ñ Ö Ú Þ Ò ÕÙ × Ò× ÖØ ÙÒ Ö Ó
     ÓÒ ÙÒ ÒÓ Ó ×Ø ÒÓº × ÑÙÝ ÑÔÓÖØ ÒØ ÕÙ × Ö ØÓÖÒ ÙÒ Ö Ö Ò       ÙÒ ÔÙÒØ ÖÓ Ý ÒÓ
    ÙÒ ÓÔ        ÑÓ Ó Ø Ð ÕÙ × ÔÙ      Ñ Ö Ð Ú ÐÓÖ Ð ÔÙÒØ ÓÖº
           ÓÖ ÔÓ ÑÓ× ÑÔÐ ÒØ Ö Ð Ò× Ö ÓÒ × ÙÒ Ð Ð ÓÖ ØÑÓ º
¼     ØÖ ÙØÓ× ÔÙ Ð Ó×     Ö À Ô ¼¿ +≡                ´ ¼¿ µ ¼¿ ¼
      void put_arc(typename GT::Arc * arc, typename GT::Node * tgt)
      {
        Node *& heap_node = Access_Heap_Node () (tgt);
        if (heap_node == NULL) // ¿existe arco insertado en el heap?
          {     // No ==> crear nuevo nodo para el heap y asignarle arco
            heap_node = new Node;
            heap_node->get_key() = arc;
            this->insert(heap_node);
            return;
          }
        // dos arcos con mismo nodo destino ==> seleccionar menor y descartar mayor
        typename GT::Arc *& arc_in_heap = heap_node->get_key();
            // ¿arc_in_heap tiene distancia menor que arc?
        if (Distance_Compare <GT, Distance, Compare> () (arc_in_heap, arc))
          return; // S´ ==> el antiguo arco permanece en el heap y nuevo se ignora
                      ı
            // arc_in_heap ser´ el arco reci´n insertado arc
                              a              e
        arc_in_heap = arc; // cambia el arco
        update(heap_node); // actualiza el heap con el nuevo peso de arc
      }
      ¬Ò ×
      put arc¸ Ù×   Ò ÙÒ    × ¼ ¸ ¼¸ ½ ¸ Ò   ½ º
    Í× × Distance Compare     º
7.8. Arboles abarcadores m´
                              ınimos                                                 705



       È Ö ÙÒ Ö Ó G =< V, E >¸ Ð Óר    ÙÒ Ò× Ö ÓÒ      Ö Ó× × O(Ð          V)¸   ÔÙ × Ð
    ×Ù ×Ø ØÙ ÓÒ ÙÒ Ö Ó ÓØ Ð Ô ÙÒ Ñ Ü ÑÓ V − 1 Ð Ñ ÒØÓ׺
       Ä Ð Ñ Ò ÓÒ × Ø Ò ÓÑÔÐ ÓÑÓ Ð Ò× Ö ÓÒ¸ Ô٠׸ Ô ÖØ Ð Ñ Ò Ó                Ñ ÑÓÖ ¸
      Ý ÕÙ × ÙÖ Ö ÕÙ Ð Ö Ó Ð Ñ Ò Ó ÒÓ × Ö Ð ÓÒ ÓÒ ×Ù ÒÓ Ó ×Ø ÒÓ
¼     ØÖ ÙØÓ× ÔÙ Ð Ó× Ö À Ô ¼¿ +≡                      ´ ¼¿ µ ¼
     typename GT::Arc * get_min_arc()
     {
       Node * heap_node = this->getMin();
       typename GT::Arc * arc = heap_node->get_key();
           // seleccionar nodo que retorne la clase de acceso
       typename GT::Node * p = static_cast<typename GT::Node*>(arc->src_node);
       if (Access_Heap_Node () (p) != heap_node)
         p = static_cast<typename GT::Node*>(arc->tgt_node);
       Access_Heap_Node () (p) = NULL;
       delete heap_node;
       return arc;
     }
      ¬Ò ×
     get min arc¸   Ù×    Ò ÙÒ × ¼ Ò    ½ º
    ÈÙ ×ØÓ ÕÙ Ð          Ô Ý ×Ø     ÓØ Ó ÙÒ Ñ Ü ÑÓ   V −1   Ö Ó׸ Ð Ð Ñ Ò ÓÒ × O(Ð   V)º

    7.8.3.3   Inicializaci´n del algoritmo de Prim
                          o

    ÄÓ ÔÖ Ñ ÖÓ ÕÙ    ÑÓ× Ö × ¬Ò Ö Ð ×ØÖÙ ØÙÖ ÕÙ ÓÒØ Ò Ö Ð ÓÓ      ÙÒ ÒÓ Ó¸
       ÑÓ Ó Ø Ð ÕÙ ÔÓ ÑÓ× Ù× Ö Ð Ô Ü ÐÙ× ÚÓ × Ò Ó Ò Ð ×Ù ¹× ÓÒ ÔÖ    ÒØ
¼      ¬Ò ÓÒ × ÈÖ Ñ ¼ ≡                                    ¼
     template <class GT> struct Prim_Info
     {
       typename GT::Node * tree_node; // imagen del nodo en el arbol abarcador
                                                               ´
       void *              heap_node; // puntero dentro del heap exclusivo
     };
      ¬Ò ×
     Prim Info¸   Ù×     Ò ÙÒ ¼ º
      Ð ÑÔÓ tree node Ù Ö Ð Ñ Ò Ð ÒÓ Ó ÒØÖÓ Ð Ö ÓÐ Ö ÓÖ¸ Ñ ÒØÖ × ÕÙ
    heap node Ð     Ö ÓÒ ÒØÖÓ Ð Ô Ü ÐÙ× ÚÓ ÕÙ Ù Ö Ð Ñ Ò ÑÓ Ö Ó Ð ÒÓ Ó Ò
     Ù ×Ø ÓÒ ÓÑÓ ×Ø ÒÓº heap node × Ð Ö ÓÑÓ void*             Ó ÕÙ Ø Ò ÑÓ× Ö ÒØ ×
     ÖÙ × Ø ÔÓ× ÒÚÓÐÙ Ö Ó׺ Ð ÓÒרÖÙ ØÓÖ × ÙÖ ÕÙ ÙØÓÑ Ø Ñ ÒØ ÐÓ× ÑÔÓ× ×
     Ò Ò Ò NULL Ù Ò Ó × Ô ÖØ Ð Ñ ÑÓÖ º
            Ó ÙÒ ÔÙÒØ ÖÓ ÒÓ Ó p¸ Ð ×Ó ×ØÓ× ÑÔÓ× ×            Ð Ø Ñ ÒØ ÐÓ× × Ù ÒØ ×
    Ñ ÖÓ× PRIMINFO()¸ TREENODE() Ý HEAPNODE()º
           ÓÖ ¸ × ÙÒ ÐÓ× Ö ÕÙ Ö Ñ ÒØÓ× Ð Ø ÔÓ ArcHeap<GT, Distance, Compare, Access Arc>¸
         ÑÓ× ×Ô ¬ Ö Ð ×Ó Ð ÑÔÓ heap node
¼      ¬Ò ÓÒ × ÈÖ Ñ ¼ +≡                                         ¼   ¼
           template <class GT, class Distance, class Compare>
     struct Prim_Heap_Info
     {
       typedef typename ArcHeap<GT, Distance, Compare, Prim_Heap_Info>::Node Node;
       Node *& operator () (typename GT::Node * p) { return (Node*&) HEAPNODE(p); }
     };
706                                                             Cap´
                                                                       ıtulo 7. Grafos



        ¬Ò ×
      Prim Heap Info¸ Ù×       Ò ÙÒ ¼ º
    Í× × ArcHeap ¼¿ º
         Ä Ò Ð Þ ÓÒ Ð ÓÓ   Ð ÒÓ Ó × Ö Ð Þ Ñ              ÒØ
¼        ¬Ò ÓÒ × ÈÖ Ñ ¼ +≡                                              ¼
        template <class GT> struct Init_Prim_Info
        {
          void operator () (GT & g, typename GT::Node * p)
          {
            g.reset_bit(p, Aleph::Prim);
            NODE_COOKIE(p) = new Prim_Info<GT>;
          }
        };
        ¬Ò ×
      Init Prim Info¸   Ù×     Ò ÙÒ ¼ º
    Í× × Prim Info ¼     º
¼   ÁÒ         Ð Þ Ö ÈÖ Ñ ¼    ≡                                      ´ ¼¾µ
        Operate_On_Nodes <GT, Init_Prim_Info <GT> > () (g);
    Í× × Init Prim Info ¼ º
          ×ÔÙ × ÕÙ Ð Ð ÓÖ ØÑÓ ÈÖ Ñ Ð ÙÐ Ð Ö ÓÐ Ö ÓÖ¸ × Ð Ö Ð Ñ ÑÓÖ Ó Ù¹
    Ô    ÔÓÖ ÐÓ× ÓÓ ×º È ÖÓ ÒØ × Ñ Ô Ò ÐÓ× ÒÓ Ó× Ñ ÒØ Ð × Ñ Ò × Ò Ð Ö ÓÐ Ö¹
       ÓÖ ÕÙ ×Ø Ò ÓÒØ Ò × Ò Ð ÑÔÓ tree nodeº
       ÄÓ ÕÙ Ö ×Ø Ð Ò Ð Þ ÓÒ Ð Ð ÓÖ ØÑÓ ÈÖ Ñ ÓÒ ÖÒ Ð Ô Ü ÐÙ× ÚÓº Ò
    ÔÖ Ñ Ö ÐÙ Ö ×Ù Ð Ö ÓÒ
¼       Ð Ö ÓÒ ÓÐ        ÔÖ ÓÖ    ¼ ≡                        ´ ¼¾µ
        typedef Prim_Heap_Info<GT, Distance, Compare> Acc_Heap;
        ArcHeap<GT, Distance, Compare, Acc_Heap> heap;
    Í× × ArcHeap ¼¿ Ò         Prim Heap Info   ¼ º
      Ò ØÓ Ó ÑÓÑ ÒØÓ¸ Ð ÓÔ Ö ÓÒ heap.get min arc() ÒÓ× ÖÖÓ Ð Ö Ó ÓÒ Ð Ñ ÒÓÖ
    Ô ×Ó ÒØÖ ØÓ Ó× ÐÓ× Ò ÐÙ Ó× ÒØÖÓ Ð Ôº ר ׸ ר ÐÓ× ÑÓÑ ÒØÓ׸ Ð
    ÙÒ       Ö Ò ÓÒ Ð ÓÐ ØÖ ÓÒ Ð ÑÔÐ           Ò Ð Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ ×ØÙ Ó
     Ò Ü º º½¼ ´Ô Ò ¿¼µº
         Ò × ÙÒ Ó ÐÙ Ö¸ Ð Ò× Ö ÓÒ ÐÓ× Ö Ó× Ý ÒØ × Ð ÒÓ Ó Ò Ó
¼    ÁÒ Ð Þ Ö Ô ¼ ≡                                          ´ ¼¾µ
        typename GT::Node * first = g.get_first_node();
        NODE_BITS(first).set_bit(Aleph::Prim, true); // marcarlo visitado
        TREENODE(first) = tree.insert_node(first->get_info()); // imagen first en tree
            // meter en heap arcos iniciales del primer nodo
        for (Node_Arc_Iterator<GT,SA> it(first); it.has_current(); it.next())
          {
            typename GT::Arc * arc = it.get_current_arc();
            ARC_BITS(arc).set_bit(Aleph::Prim, true);
            heap.put_arc(arc, it.get_tgt_node());
          }
    Í× × Node Arc Iterator          Ò   put arc   ¼º
7.8. Arboles abarcadores m´
                              ınimos                                                707



    7.8.3.4   El algoritmo de Prim

      ÓÖ ×Ø ÑÓ× Ð ×ØÓ× Ô Ö ÓÒרÖÙ Ö Ø Ö Ø Ú Ñ ÒØ Ð Ö ÓÐ           Ö   ÓÖ Ò Ð ÓÖ Ò ×Ø Ð ¹
      Ó ÔÓÖ Ð ÓÐ ¸ ÐÓ Ù Ð × Ö Ð Þ Ð × Ù ÒØ Ñ Ò Ö
¼     Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ × ÙÒ ÈÖ Ñ ¼ ≡                             ´ ¼¾µ
      while (tree.get_num_nodes() < g.get_num_nodes()) // mientras tree no abarque a g
        {     // obtenga siguiente menor arco
          typename GT::Arc * min_arc = heap.get_min_arc();
          typename GT::Node * src    = g.get_src_node(min_arc);
          typename GT::Node * tgt    = g.get_tgt_node(min_arc);
          if (IS_NODE_VISITED(src, Aleph::Prim) and IS_NODE_VISITED(tgt, Aleph::Prim))
            continue; // Este arco cerrar´a un ciclo en el ´rbol
                                         ı                 a
          typename GT::Node * tgt_node = IS_NODE_VISITED(src, Aleph::Prim) ? tgt : src;
              // inserte en arbol, guarde node de arbol y marquelo visitado
                            ´                     ´
          TREENODE(tgt_node) = tree.insert_node(tgt_node->get_info());
          NODE_BITS(tgt_node).set_bit(Aleph::Prim, true);
              // insertar en heap arcos no visitados de tgt_node
          for (Node_Arc_Iterator<GT, SA> it(tgt_node); it.has_current(); it.next())
            {
              typename GT::Arc * arc = it.get_current_arc();
              if (IS_ARC_VISITED(arc, Aleph::Prim))
                continue;
              ARC_BITS(arc).set_bit(Aleph::Prim, true); // marcar arco
              typename GT::Node * tgt = it.get_tgt_node();
              if (IS_NODE_VISITED(tgt, Aleph::Dijkstra))
                continue; // nodo visitado ==> causar´ ciclo ==> no insertar en heap
                                                     a
              heap.put_arc(arc, tgt);
            }
                // insertar nuevo arco en tree y mapearlo
          typename GT::Arc * tree_arc =
            tree.insert_arc(TREENODE(src), TREENODE(tgt), min_arc->get_info());
          GT::map_arcs(min_arc, tree_arc);
        }
    Í× × get min arc ¼ ¸ Node Arc Iterator   ¸ Ò   put arc   ¼º
      ÓÑÓ Ú Ö ÑÓ× ÔÓר Ö ÓÖÑ ÒØ ¸ Ð Ö ÓÐ Ö ÓÖ Ö ×ÙÐØ ÒØ   ר ÔÖÓ ×Ó × Ñ Ò ÑÓº
        À Ý ÙÒ     Ö Ò ÖÙ Ð Ò Ð Ñ Ò Ö Ò ÕÙ Ð Ð ÓÖ ØÑÓ ÈÖ Ñ ØÖ Ø ÓÒ Ð
    ÔÖÓÔ        Ð ÐÓ ´ º¾ Ô º µ Ý ÕÙ ÒÓ× Ô ÖÑ Ø Ú Ö ÙÒ ÔÖÙ             Ð      º
    ÈÙ ×ØÓ ÕÙ Ð Ö ÓÐ Ö ÓÖ tree × ÑÔÖ × ÓÒ ÜÓ¸ ÔÓ ÑÓ׸ ÔÓÖ × ÑÔÐ Ò×Ô ÓÒ
    Ú × Ø ÐÓ× ÒÓ Ó× ÙÒ Ö Ó ÔÖÓ × Ó¸ Ø ÖÑ Ò Ö × Ð Ò ÐÙ× ÓÒ Ð ÒÙ ÚÓ Ö Ó Ò tree
      Ù× Ö ÙÒ ÐÓº Ë Ñ Ó× ÒÓ Ó× Ý Ò × Ó Ú × Ø Ó׸ ÒØÓÒ ×¸ Ð Ò× Ö ÓÒ Ð Ö Ó
      Ù× Ö ÙÒ ÐÓ ÐÓ ÓÒØÖ Ö Ó¸ Ð Ö Ó ÓÖÑ Ô ÖØ Ð Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓº ÓÒ Ð
     Ð ÓÖ ØÑÓ ÃÖÙ× Ð ÒÓ ÔÓ ÑÓ×         Ö ×Ø ÓÒ× Ö ÓÒ ÔÓÖÕÙ tree × Ò ÓÒ ÜÓº
    7.8.3.5   An´lisis del algoritmo de Prim
                a

      Ð Ò Ð × × ÓÑÔÐ ØÓ Ð Ð ÓÖ ØÑÓ ÈÖ Ñ Ö ÕÙ Ö ÓÒØ Ð Þ Ö ×Ù× ÐÓÕÙ × ÔÖ Ò Ô Ð ×
     ÁÒ Ð Þ Ö ÈÖ Ñ ¼ ¸ ÁÒ Ð Þ Ö Ô ¼ ¸ Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ
    × ÙÒ ÈÖ Ñ ¼ Ý × Ò Ð Þ Ö ÈÖ Ñ ´Ò Ú Ö ¬Ò µ º
        Ä Ò Ð Þ ÓÒ Ô Ö Ô ÖØ Ö ÐÓ× ÓÒØ Ò Ó× ÐÓ× ÓÓ × Ý ×Ù Ð Ö ÓÒ Ð ¬Ò Ð
    Ö ÕÙ Ö Ò ÖÖ Ö ØÓ Ó× ÐÓ× ÒÓ Ó× Ð Ö Óº Ñ Ó× ×ÓÒ¸ ÔÓÖ Ø ÒØÓ¸ O(V)º
708                                                                                                                                                                                 Cap´
                                                                                                                                                                                       ıtulo 7. Grafos


          L       4       M            2       N       3       O       6       P                                        L               4               M               2               N               3               O               6               P


      10      12      10           8       3       1       3       1       1       7                                10              12              10              8               3               1               3               1               1       7


 F        5       G           15       H               I               J       4       K                F               5               G                   15          H                               I                               J               4       K
                                               2               2                                                                                                                        2                               2

      9       4       1            7       3       2       1       2       5       2                                9               4               1               7               3               2               1               2               5       2


          A       3       B            4       C       3       D       4       E                                        A               3               B               4               C               3               D               4               E


                                           ´µ                                                                                                                                   ´ µ
          L       4       M            2       N       3       O       6       P                                        L               4               M               2               N               3               O               6               P


      10      12      10           8       3       1       3       1       1       7                                10              12              10              8               3               1               3               1               1       7


 F        5       G           15       H               I               J       4       K                F               5               G                   15          H                               I                               J               4       K
                                               2               2                                                                                                                        2                               2

      9       4       1            7       3       2       1       2       5       2                                9               4               1               7               3               2               1               2               5       2


          A       3       B            4       C       3       D       4       E                                        A               3               B               4               C               3               D               4               E


                                           ´µ                                                                                                                                   ´ µ
          L       4       M            2       N       3       O       6       P                    L           4               M               2               N               3               O               6               P


      10      12      10           8       3       1       3       1       1       7            10          12              10              8               3               1               3               1               1               7


 F        5       G           15       H               I               J       4       K   F        5           G                   15          H                               I                               J               4               K
                                               2               2                                                                                                2                               2

      9       4       1            7       3       2       1       2       5       2            9           4               1               7               3               2               1               2               5               2


          A       3       B            4       C       3       D       4       E                    A           3               B               4               C               3               D               4               E


                                           ´µ                                                                                                               ´µ

     ÙÖ º                 ÈÖÓ Ö ×Ó Ð Ð ÓÖ ØÑÓ                                          ÈÖ Ñ ´                   ¬ ÙÖ ÓÖÖ ×ÔÓÒ                                                                               ØÖ × Ø Ö ÓÒ ×µ

     Ð ÐÓÕÙ ÁÒ Ð Þ Ö Ô ¼ Ö ÓÖÖ ÐÓ× Ö Ó× Ð ÒÓ Ó ÓÖ Òº Ò Ð ÑÙÝ ÜØÖ ÑÓ
Ô ÓÖ ×Ó Ò Ð ÕÙ Ð ÒÓ Ó ×Ø ÓÒ Ø Ó Ð Ö ×ØÓ ÐÓ× ÒÓ Ó׸ ÁÒ Ð Þ Ö Ô ¼
 × O(V)º
    ÄÓ× ØÖ × ÐÓÕÙ × ÒØ Ö ÓÖ × ×ÓÒ¸ Ò ÓÒ ÙÒØÓ¸ O(V)º
     Ò Ù ÒØÓ Ð ÐÓÕÙ Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ × ÙÒ ÈÖ Ñ ¼ ¸ ר × ÙÒ
ÔÓ Ó Ñ × ×ÙØ Ð Ò Ð Þ Ö ÔÓÖÕÙ Ð ÒØ              Ø Ö ÓÒ × Ð while Ô Ò       ÐÓ ÕÙ
×Ù       ÓÒ Ð for ÒØ ÖÒÓ¸ Р٠и ×Ù Ú Þ¸ Ø ÑÔÓ Ó Ø Ò ÙÒ ÒØ           Ö Ô Ø ÓÒ ×
 Ü Ø º Ë Ü Ñ Ò ÑÓ× ÓÒ Ù Ó Ð ÐÓÕÙ ¸ ÒØÓÒ × ÔÓ ÑÓ× Ö Ð Þ Ö ÕÙ               ÑÓ×
 Ò Ö Ó× ÒØ           ×
   ½º Ð ÒÙÑ ÖÓ Ú × ÕÙ ×                 Ð Ô Ü ÐÙ× ÚÓ¸ Ð Ù Ð ÒÓ× ÔÖÓÔÓÖ ÓÒ Ð
       ÓÑÔÐ         Ð while ÓÑ Ò Ó ÓÒ Ð forº
          Ó Ð ×ÙÔÙ ×ØÓ ÕÙ Ð Ö Ó × ÓÒ ÜÓ¸ × Ð ÖÓ ÕÙ ØÓ Ó× ÐÓ× ÒÓ Ó×         Ò×Ö
      Ñ Ö Ó× ÔÓÖ Ð Ð ÓÖ ØÑÓ¸ ÔÙ × ×Ø × Ò          × Ð ÔÖ Ñ Ö Ö Ó Ð ÒÓ Ó ÓÖ Ò Ý
       ÙÐÑ Ò ×Ø ÕÙ ØÓ Ó× ÐÓ× ÒÓ Ó× ×Ø Ò Ö Ó׸ ÐÓ Ù Ð × Ð ÓÒ ÓÒ Ô Ö
        Ð whileº       ÒÙ ÚÓ ÒÓ Ó Ò×Ô ÓÒ Ó ÖÖ ×Ù Ò ÐÙ× ÓÒ Ò Ð Ö ÓÐ Ö ¹
       ÓÖ ½ Ý Ð  ÓÒ× Ù ÒØ Ò× Ö ÓÒ ØÓ Ó× ÐÓ× Ö Ó× ÒÓ Ú × Ø Ó× Ý ÒØ × Ð ÒÓ Ó
      Ö Ò ÔÖÓ × Óº Ù Ò Ó Ó ÙÖÖ Ð Ò× Ö ÓÒ Ð ÙÐØ ÑÓ ÒÓ Ó¸ Ý ØÓ Ó× ÐÓ× Ö Ó× Ð
       Ö Ó Ò × Ó Ú × Ø Ó× Ý¸ ÓÑÓ ×ØÓ× ×ÓÒ Ñ Ö Ó׸ × × Ò Ð Ô ÙÒ ×ÓÐ Ú Þº
 ½
  Ê ÓÖ ÑÓ× ÕÙ Ò ×Ø Ð ÓÖ ØÑÓ Ð Ö ÓÐ Ö ÓÖ × ÑÔÖ × ÓÒ ÜÓ¸ ÐÓ ÕÙ                                                                                                                                                        × ÙÖ ÕÙ ÒÓ ×
Ö Ö ÙÒ ÐÓ Ù Ò Ó × Ò× ÖØ Ò Ð Ö ÓÐ ÙÒ ÒÓ Ó ÒÓ Ú × Ø Óº
7.8. Arboles abarcadores m´
                          ınimos                                                 709



       Î ÑÓ׸ Ô٠׸ ÕÙ × Ö Ð Þ Ò ÐÓ ×ÙÑÓ E Ò× Ö ÓÒ × Ö Ó Ò Ð Ôº Ò Ù ÒØÓ
       Ð ÒØ            ÜØÖ ÓÒ ×¸       ÑÓ× ÒÓØ Ö ÕÙ ¸ ÔÙ ×ØÓ ÕÙ ØÖ Ø ÑÓ× ÓÒ ÙÒ Ô Ü¹
        ÐÙ× ÚÓ¸ ר × Ö Ó× ÙÖ ÒØ Ð Ò× Ö ÓÒ Ò ÙÒ Óר O(1)º Ç ÙÖÖ Ò¸ ÒØÓÒ ×¸ ÐÓ
       ×ÙÑÓ V ÜØÖ ÓÒ × Ö Ó× ÐÓ ÕÙ ÒÓ× ÖÖÓ ÙÒ ÓÑÔÐ                      O(V +E) = O(E)
       Ô Ö Ð ÒØ            Ö Ô Ø ÓÒ × ÕÙ Ö Ð Þ Ò Ð while Ý Ð for ÓÑ Ò Ó׺
       Ë Ò ÐÙ Ö ÙÒ Ô Ü ÐÙ× ÚÓ ØÖ Ø × ÑÓ× ÓÒ ÙÒ Ô ØÖ ÓÒ Ð¸ ÒØÓÒ × Ö Ð ¹
       Þ Ö ÑÓ× E ÜØÖ ÓÒ × Ø Ò Ö ÑÓ× ÙÒ Ð ÓÖ ØÑÓ Ñ × Ð ÒØÓ Ô ÖÓ ÓÒ Ð Ñ ×Ñ
        ÓÑÔÐ         Ø Ö ØÚ º
   ¾º Ð Ø Ñ ÒÓ Ñ Ü ÑÓ Ó ÔÖÓÑ Ó Ð Ô¸ Ð Ù Ð ÒÓ× ÔÖÓÔÓÖ ÓÒ Ð Óר ÓÔ Ö Ö
        ÓÒ Ðº ÈÙ ×ØÓ ÕÙ Ù× ÑÓ× ÙÒ Ô Ü ÐÙ× ÚÓ¸ × × ÙÖÓ¸ ÐÓ ÕÙ ÔÖ Ò ÑÓ×
        Ò Ð ¬Ò ÓÒ º ´Ü º º¿º¾ ´Ô Ò ¼¾µµ¸ ÕÙ ×Ù Ø Ñ ÒÓ ÒÓ Ü                      V−1
        Ð Ñ ÒØÓ׸ ÐÓ ÕÙ ÒÓ× ÖÖÓ ÙÒ Óר ÓÔ Ö ÓÒ O(Ð V) ÔÓÖ                   Ð Ò× Ö ÓÒ
       Ó Ð Ñ Ò ÓÒº
         Ð Óר ÙÒ ÓÔ Ö ÓÒ ×Ó Ö Ð Ô Ü ÐÙ× ÚÓ ×¸ Ô٠׸ O(Ð V)º
    Ð × ÒØ        × Ö ÒØ Ñ ÒØ Ð ÙР׸ ÔÓ ÑÓ× ÓÒ ÐÙ Ö ÕÙ Ð Óר Ð ÐÓÕÙ
   Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ × ÙÒ ÈÖ Ñ ¼ × O(E) × O(Ð V) = O(E Ð V)º
    ÄÓ× Ù ØÖÓ ÐÓÕÙ × ÒÚÓÐÙ Ö Ó× ÓÒØ Ð Þ Ò O(V) + O(E Ð V) = O(E Ð V)¸ ÕÙ ×
 Ð × ÑÔ ÒÓ ¬Ò Ø ÚÓ Ò Ø ÑÔÓ Ð Ð ÓÖ ØÑÓ ÈÖ Ñº
      × ÑÔÓÖØ ÒØ × ÑÓ ×Ø Ö ÕÙ × Ù× × ÑÓ× ÙÒ Ô ØÖ ÓÒ Ð Ô Ö Ù Ö Ö ÐÓ× Ö Ó׸
 ÒØÓÒ × Ð Óר ÙÒ ÓÔ Ö ÓÒ ×Ó Ö Ð Ô ×Ø Ö ÓØ Ó ÔÓÖ O(Ð E)¸ Ð Ù Ð ÓØ Ö
 Ð Ð ÓÖ ØÑÓ ÈÖ Ñ ÙÒ × ÑÔ ÒÓ O(E Ð E)¸ ÙÒ Óר ×Ù ×Ø Ò ÐÑ ÒØ Ñ ÝÓÖ Ð
ÕÙ ÒÓ× ÔÖÓÔÓÖ ÓÒ Ð Ô Ü ÐÙ× ÚÓº Ò ÐÓ Ñ ÒØ ¸ Ø Ò Ö ÑÓ× ÙÒ Óר Ò ×Ô Ó
O(E) Ú Ö×Ù× Ð O(V)º Ð         Ô Ü ÐÙ× ÚÓ¸ ÙÒÕÙ ÓÑÔÐ Ó¸ ÒÓ × ÙÒ ÔÖ Ó¸ ÔÙ × ×Ù Ù×Ó
× Ö ÓÑÔ Ò× ÓÒ Ö ×¸ Ø ÒØÓ Ò Ø ÑÔÓ ÓÑÓ Ò ×Ô Óº
      Ð Ð ÓÖ ØÑÓ ÈÖ Ñ × Ð Ñ ØÓ Ó ÔÖ Ö Ò Ô Ö Ö Ó× Ò×Ó׺
7.8.3.6   Correctitud del algoritmo de Prim

Proposici´n 7.4
         o     Ë G ÙÒ Ö Ó ÓÒ ÜÓ Ù ÐÕÙ Ö º              ÒØÓÒ × Ð Ð ÓÖ ØÑÓ        ÈÖ Ñ
Ò Ù ÒØÖ ÙÒ Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓº
Demostraci´n (por inducci´n sobre el n´ mero de nodos)
          o              o            u

  ½º   V<2    Ò ×Ø ×Ó¸ Ð Ô Ö ØÓÖÒ Ð Ñ ÒÓÖ Ö Ó Ð ÒÓ Ó Ò Ð Ý ÓÒרÖÙÝ ÙÒ
      Ö ÓÐ Ô Ö Ð     Ó× ÒÓ Ó× Ð Ù Ð ×¸ ÓÒ ÖØ ØÙ Ñ Ò ÑÓº
  ¾º V > 2 ÓÖ ×ÙÑ ÑÓ× Ð ÔÖÓÔÓ× ÓÒ ÖØ Ô Ö ÙÒ Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ Ô Ö Ðº
     ÍÒ Ó × ÖÚ ÓÒ ÖÙ Ð Ô Ö ×Ø ÑÓ×ØÖ ÓÒ × ÔÖ Ò Ö ÕÙ Ð Ô × ÑÔÖ
     ÒÓ×     Ð Ñ ÒÓÖ Ö Ó     ÒØÖ ÐÓ× Ö ×Ø ÒØ × ´ÐÓ Ñ ×ÑÓ Ó ÙÖÖ ÓÒ Ð Ð ÓÖ ØÑÓ
     ÃÖÙ× Ðµº Ù Ò Ó × ÜØÖ ÙÒ Ñ ÒÓÖ Ö Ó¸ Ü ×Ø Ò Ó× ÔÓ× Ð           ×
      ´ µ ÉÙ Ð Ö Ó ÓÖÑ ÙÒ ÐÓ¸ Ò ÙÝÓ ×Ó¸ ÔÓÖ Ð ÔÖÓÔ               Ð ÐÓ¸ ר × Ð
          Ñ ÝÓÖ ÒØÖ ØÓ Ó× ÐÓ× Ö Ó× ÕÙ ÓÒ ÓÖÑ Ò Ð ÐÓ Ý¸ ÔÓÖ Ð ÔÓØ × × Ò Ù Ø Ú ¸
           Ð Ö ÓÐ Ö ÓÖ × Ñ Ò ÑÓº
      ´ µ ÉÙ Ð Ö Ó ÒÓ ÓÖÑ ÙÒ ÐÓ¸ Ò ÙÝÓ ×Ó¸ ÔÐ ÒØ Ò Ó ÙÒ ÓÖØ ÒØÖ Ð
           Ö ÓÐ Ö ÓÖ Ô Ö Ð Ý ÙÒ Ö Ó ÙÒ ×ÓÐÓ ÒÓ Ó¸ Ð Ö Ó × Ð Ñ Ò ÑÓ ÒØÖ
710                                                                  Cap´
                                                                        ıtulo 7. Grafos



          ÐÓ× ÔÓ× Ð × ÖÙ ´ Ù ÜØÖ Ó Ð Ôµ ݸ ÓÑÓ ÐÓ ×                    ÑÓ×     Ð ÔÖÓÔ
               ÖÙ ¸ Ð ÒÙ ÚÓ Ö ÓÐ × Ñ Ò ÑÓº
      Ä ÔÖÓÔÓ× ÓÒ × ÔÙ × ÖØ Ô Ö ØÓ Ó× ÐÓ× ÒÓ Ó× Ö Ó

7.9    Caminos m´
                ınimos
  Ò Ö Ó× ÔÓÒ Ö Ó׸ Ð ÔÖÓ Ð Ñ Ð Ñ ÒÓ Ñ Ò ÑÓ ÓÒ× ×Ø Ò Ò ÓÒØÖ Ö ÙÒ Ñ ÒÓ
 ÒØÖ ÙÒ Ô Ö ÒÓ Ó× Ø Ð ÕÙ Ð ×ÙÑ ØÓØ Ð ØÓ Ó× ÐÓ× Ô ×Ó× × Ñ Ò Ñ º ÓÑÓ ÑÔÐÓ×
ÔÓ ÑÓ× ÓÒ× Ö Ö
   ½º       × Ù × Ý ×Ø Ò × ÒØÖ ÖÖ Ø Ö ×¸ Ò ÓÒØÖ Ö Ð Ñ ÒÓ Ñ ÒÓÖ ×Ø Ò
       ÒØÖ ÙÒ Ô Ö       ٠׺
   ¾º       × Ù × Ý ÙÖ ÓÒ × Ò ÓÖ × ÚÙ ÐÓ Ò Ú ÓÒ Ý Ò × Ð ×¸ × ÙÒ Ó ÖØ × Ý
        ×ÔÓÒ Ð       ×      ÖÓÐ Ò ×¸ ÓÒ× Ù Ö Ð Ø Ò Ö Ö Ó ÕÙ ÐÐ Ú ÙÒ Ù           ÓØÖ
       Ò Ð Ñ ÒÓÖ Ø ÑÔÓ ÔÓ× Ð º
      Ë Ñ ÑÓ× ÙÖ ÓÒ × ÔÓÖ Óר × ÓÒÓÑ Ó׸ ÒØÓÒ × ÔÓ ÑÓ× ÔÐ ÒØ Ö Ð Ò¹
       ÓÒØÖ Ö Ð Ø Ò Ö Ö Ó ÓÒÓÑ Ñ ÒØ Ñ × Ö ØÓº
   ¿º        ÙÒ Ö        ÓÑÔÙØ ÓÖ ×¸ × × Ò ÓÒØÖ Ö Ð Ñ ÒÓ Ñ × ÓÖØÓ ÒÓ Ó×
       ÒØ ÖÑ Ó× ÔÓÖ ÓÒ ÔÙ Ò Ö ÙÐ Ö ÐÓ× Ô ÕÙ Ø × Ò Ð Ñ ÒÓÖ Ø ÑÔÓ ÔÓ× Ð º
        Ò ÐÓ Ñ ÒØ ¸ × × ØÖ Ø ÙÒ Ö Ø Ð ÓÒ ¸ ÒØÓÒ ×¸                ØÓ× ÔÖ ×Ø Ö Ù Ò
      × ÖÚ Ó Ý¸ Ð Ú Þ¸           ÓÖÖ Ö Óר ׸ × × Ò ÓÒØÖ Ö Ð Ñ ÒÓ Ñ × ÓÖØÓ Ò¹
      ØÖ ÓÒÑÙØ ÓÖ × ÒØ ÖÑ Ö Ó× Ø Ð Ñ Ò Ö ÕÙ × Ñ ÓÖ Ò Ô Ö Ñ ØÖÓ× ÓÑÓ
      ÐØÒ         ØÖ Ò×Ñ × ÓÒ ´ ÙÒ Ñ ÒØ Ð Ô Ö Ð ÓÒÚ Ö× ÓÒµ Ó ÒØ             ÐÐ Ñ ×
      × ÑÙÐØ Ò × ÕÙ ÔÙ Ò ØÙ Ö× Ò Ð Ö º
    º ÍÒ ÖÓ ÓØ¸ Ò ÙÒ ÓÒ ×Ù× Ñ Ò ×ÑÓ× Ú × ÓÒ¸               ÔÐ Ò ¬ Ö ÙÒ ØÖ Ý ØÓ ×
      ÙÒ ÔÙÒØÓ ÓØÖÓº Ð Ø ÖÖ ÒÓ Ý ×Ù× Ó ×Ø ÙÐÓ× × ÑÓ Ð Þ Ñ ÒØ ÙÒ Ö Óº Ò ×Ø
        ×Ó¸ Ô Ö ÓÖÖ Ö Ø ÑÔÓ Ý Ò Ö ¸ × Ð ÙÐ Ð Ñ ÒÓ Ñ Ò Ñ ×Ø Ò ÒØÖ
      ÐÓ× ÔÙÒØÓ׺
    À Ý ÑÙ × Ñ × × ØÙ ÓÒ × Ò Ð × ÕÙ ÔÙ           Ô Ö Ö ×Ø ÔÖÓ Ð Ñ º È Ö ÕÙ ×Ø
Ø Ò × ÒØ Ó¸ Ð Ö Ó             × Ö ÓÒ ÜÓ Ó ÕÙ Ð Ñ ÒÓ× Ü ×Ø ÙÒ Ñ ÒÓ ÒØÖ ÙÒ Ô Ö
   ÒÓ Ó× Ù ×Ø ÓÒ ÙÐØ Ñ ÕÙ ÔÓ ÑÓ× Ø ÖÑ Ò Ö Ñ ÒØ Ð ÖÙØ Ò test for path()
 ×ØÙ        Ò Ü º º º½ ´Ô Ò ¾½µº
    ÄÓ× ØÖ × Ð ÓÖ ØÑÓ×       Ñ ÒÓ× Ñ Ò ÑÓ× ÕÙ ×ØÙ Ö ÑÓ× Ò ×Ø × ÓÒ ÓÔ Ö Ò Ô Ö
   Ö Ó׺ ËÓÐÓ Ð Ð ÓÖ ØÑÓ            ×ØÖ ÓÔ Ö Ô Ö Ö Ó׺
    ÍÒ Ñ Ò Ö Ò                ÓÖ Ö ×Ø ÔÖÓ Ð Ñ × ÑÓ ¬ Ö ÐÓ× Ð ÓÖ ØÑÓ× Ù×ÕÙ
      Ñ ÒÓ× ÕÙ ÑÓ× ×ØÙ Ó½ Ô Ö ÕÙ ÜÔÐÓÖ Ò ØÓ Ó× ÐÓ Ñ ÒÓ× ÔÓ× Ð × ÒØÖ Ð
Ô Ö ÒÓ Ó׺ Ä            × ÕÙ × ÓÒØ Ð Ò Ý × Ù Ö Ò ØÓ Ó× ÐÓ Ñ ÒÓ× ÔÓ× Ð × ÒØÖ
 Ð Ô Ö Ò Ù ×Ø ÓÒ Ý × × Ó Ð Ñ ÒÓÖ ÒØÖ ÐÐÓ׺ Ð ÔÖÓ Ð Ñ               ר Ò ÓÕÙ × ÕÙ
 ÓÑÔÙØ ÓÒ ÐÑ ÒØ × ÒØÖ Ø Ð ¸ ÔÙ × Ð ÒØ                   Ñ ÒÓ× ÔÓ× Ð × ÒØÖ Ù ÐÕÙ Ö
Ô Ö ÒÓ Ó× × ÓÑ Ò ØÓÖ º
 ½
   ÊÙØ Ò × find path depth first()   Ò   Ü   º º º¾ ´Ô Ò   ¾¿µ Ý   find path breadth first()
Ò Ü º º ´Ô Ò ¾ µº
7.9. Caminos m´
              ınimos                                                          711



    ÆÓÖÑ ÐÑ ÒØ ÔÓÖ Ö ÞÓÒ ×  ×ØÖ ÓÒ¸ × ÔÐ Ù× Ð Ø Ò Ö Ô ×Ó× Ò Ø ÚÓ× Ò ÙÒ Ö Óº
  Ò ×Ø × ÒØ Ó¸ Ò Ð ×ØÙ Ó Ý Ð ÙÐÓ      Ñ ÒÓ× Ñ Ò ÑÓ× Ý ÙÒ ×ÙÖ Ó Ñ Ø Ñ Ø Ó
ݸ ÔÓ× Ð Ñ ÒØ × Ó¸ Ð Ù Ð       ÑÓ× Ø Ò Ö ×Ô Ð Ù Óº Ë ØÖ Ø          ÐÓ× ÐÓ×
Ò Ø ÚÓ׺ ËÓÒ ×ÙÖ Ó× ÔÓÖÕÙ ×Ù Ü ×Ø Ò Ò Ð Ö Ó ÔÐ ÒØ ÙÒ ÐÓ ÕÙ Ò¬Ò Ø Ñ ÒØ
Ö ÓÖÖ Ó × Ö Ñ Ò ÑÓº

7.9.1   Algoritmo de Dijkstra
  Ò ½ ¸ × Ö Ïº ×ØÖ ¸ ÔÓ× Ð Ñ ÒØ ÙÒÓ ÐÓ× ÒØ ¬ Ó× Ð × Ò × ÓÑÔÙØ ¹
   ÓÒ Ð × Ñ × Ö Ò Ó×Ó× ØÓ Ó× ÐÓ× Ø ÑÔÓ׸ ÞÓ ÔÙ Ð Ó ÙÒ Ð ÓÖ ØÑÓ Ô Ö Ò ÓÒØÖ Ö
ØÓ Ó× ÐÓ× Ñ ÒÓ× Ñ × ÓÖØÓ× ÒØÖ ÙÒ ÒÓ Ó Ò Ó Ý Ð Ö ×ØÓ ÐÓ× Ð Ö Óº
       Ð Ð ÓÖ ØÑÓ       ×ØÖ ÔÙ ÑÔÐ Ö× Ô Ö Ö Ó× Ó Ö Ó׺ × ×Ø ÒØ                Ù Ó
Ô Ö Ö Ó× Ù Ð ÒÓ׺
     ÌÓ Ó ÐÓ Ô ÖØ Ò ÒØ Ð Ð ÙÐÓ      Ñ ÒÓ× Ñ Ò ÑÓ× × ÙÒ Ð Ð ÓÖ ØÑÓ         ×ØÖ ×Ù ¹
Ý Ò Ð Ö ÚÓ Dijkstra.Hº
     À Ý ÙÒ Ö Ò Ö Ñ Ò × Ò ÒØÖ Ð Ð ÓÖ ØÑÓ              ×ØÖ Ý Ð ÈÖ Ñ ÜÔÖ × ÔÓÖ
 Ð       Ó ÕÙ Ñ Ó× × × Ò Ò ÙÒ ÜÔÐÓÖ ÓÒ                 Ö Ó × ÙÒ Ð × ÔÖ ÓÖ    ׺ Ä
     Ö Ò × Ò Ð ×Ù Ý Ò ÕÙ Ð Ð ÓÖ ØÑÓ                ×ØÖ Ù× Ú ÐÓÖ × Ô Ö Ð × Ø ÒØÓ Ò
ÐÓ× ÒÓ Ó× ÓÑÓ Ò ÐÓ× Ö Ó׺
          Ó ÙÒ ÒÓ Ó Ò Ð v0¸ Ù Ð Ö ÔÖ × ÒØ Ð ÒÓ Ó ÓÖ Ò ÙÒ Ñ ÒÓ Ñ Ò ÑÓ¸ ÐÓ×
Ú ÐÓÖ × ÐÓ× ÕÙ        Ð ÑÓ× × Ö ¬ Ö Ð Ð ÓÖ ØÑÓ        ×ØÖ × Ð × ¬ Ò Ð × Ù ÒØ
ÑÒÖ
Para los nodos:        Ó ÙÒ ÒÓ Ó Ù ÐÕÙ Ö vu¸ (vi) Ö ÔÖ × ÒØ Ð Ñ Ò Ñ ×Ø Ò
          ÙÑÙÐ      × v0 ר viº
        ÁÒ ÐÑ ÒØ ¸ (v0) = 0º
Para los arcos:       Ó ÙÒ Ö Ó Ù ÐÕÙ Ö e ÒØÖ ÐÓ× Ý ÒØ × ÙÒ ÒÓ Ó vi¸ ÈÓØ(e)
          × Ò Ð ×Ø Ò ÔÓØ Ò Ð ÙÑÙÐ               Ù Ö Ö × Ð ÒÓ Ó v0 ר Ð ÒÓ Ó
          ר ÒÓ eº
        Ë d(e) × Ò Ð ×Ø Ò ´Ó Ô ×Óµ Ð Ö Ó e¸ ÒØÓÒ ×¸ Ó ÙÒ ÒÓ Ó vi
                                ÈÓØ(e) =    (vi) + d(e)                      ´ºµ
        ר ÓÔ Ö ÓÒ × Ö Ð Þ Ô Ö      Ö Ó ÙÒ ÒÓ Ó ØÖ Ò× ØÓ ÙÖ ÒØ Ð          Ù ÓÒ
         Ð Ð ÓÖ ØÑÓº
      ÁÒ ÐÑ ÒØ ¸ Ô Ö Ð ÒÓ Ó Ò Ó v0¸ ∀e Ý ÒØ v0, ÈÓØ(e) = d(e)¸ ÔÙ × Ð
         ר Ò     ÙÑÙÐ    × v0 × ÒÙÐ ´ (v0) = 0µº
        Ð Ð ÓÖ ØÑÓ     ×ØÖ ÙØ Ð Þ ÙÒ Ô Ü ÐÙ× ÚÓ ´Ü º º¿º¾ ´Ô Ò ¼¾µµ × ÙÒ ÐÓ×
      ÔÓØ Ò Ð × Ö Ó׺ ÓÑÓ Ø Ð¸ Ð × ÓÔ Ö ÓÒ × ×Ó Ö Ð Ô ÒÓ Ü Ò O(Ð V)
       Ò Ø ÑÔÓ Ý O(V) Ò ×Ô Óº
       ¬Ò Ó ÙÒ Ô Ü ÐÙ× ÚÓ × ÙÒ ÔÓØ Ò Ð ×       Ö Ó׸ Ð Ð ÓÖ ØÑÓ         ×ØÖ ×
רÖÙ ØÙÖ ÐÑ ÒØ Ù Ð Ð ÈÖ Ñº Ë Ò Ñ Ö Ó¸ Ð Ð ÓÖ ØÑÓ            ×ØÖ Ö ÕÙ Ö ÙÒ ÔÓ Ó
Ñ×         Ù Ó¸ ÔÙ × Ñ Ò Ò ÓÖÑ ÓÒ       ÓÒ Ð Ø ÒØÓ Ô Ö ÐÓ× ÒÓ Ó× ÓÑÓ Ô Ö ÐÓ×
Ö Ó׺
712                                                             Cap´
                                                                        ıtulo 7. Grafos



         Ð ÔÖÓØÓØ ÔÓ ÒÙ ×ØÖ ÑÔÐ Ñ ÒØ ÓÒ Ð Ð ÓÖ ØÑÓ               ×ØÖ ×       ¬Ò   Ð × Ù ÒØ
     ÑÓ Ó
½¾   ÈÖÓØÓØ ÔÓ Ð Ð ÓÖ ØÑÓ      ×ØÖ ½¾ ≡                                  ½
             template <class GT, class Distance, class Compare,
                       class Plus, class SA> inline
         void dijkstra_min_spanning_tree(GT & g, typename GT::Node * start_node, GT & tree)
         {
                Ð ÓÖ ØÑÓ        ×ØÖ ½
         }
     g  × Ð Ö Ó ´Ó Ö Óµ ×Ó Ö Ð Ù Ð × ×            Ð ÙÐ Ö ÙÒ Ö ÓÐ Ö ÓÖ       ר Ò ×
     Ñ Ò Ñ ×º start node × Ð ÒÓ Ó Ò Ð¸ Ð Ù Ð ÔÙ          ÓÒ× Ö Ö× Ö Þ Ð Ö ÓÐ Ö ¹
      ÓÖº Ò ÐÑ ÒØ ¸ tree × Ð Ö ÓÐ Ö ÓÖ              Ñ ÒÓ× Ñ Ò ÑÓ× ÓÒ Ò Ó ´Ó Ö Þµ Ò
     start nodeº ÄÙ Ó     Ð    Ù ÓÒ¸ g Ý tree ר Ò Ñ Ô Ó× Ñ ÒØ ×Ù× ÓÓ ×º
          Ò Ù ÒØÓ ÐÓ× Ø ÔÓ× Ô Ö Ñ ØÖ Þ Ó׸ GT × Ð Ø ÔÓ Ð Ö Ó Ý Ð Ö ÓÐ Ö ÓÖ
          ר Ò × Ñ Ò Ñ ×º Distance × ÙÒ Ð × ÕÙ               Ð ×Ø Ò ÐÑ Ò         Ò
      Ð Ö Ó × ÙÒ Ð Ò ÓÐ ÓÒ ÕÙ × ¬Ò Ð Ô ×Óº Compare × ÙÒ Ð ×              ÓÑÔ Ö ÓÒ
      ÒØÖ Ø ÔÓ× typename Distance::Distance Typeº Plus × ÙÒ Ð × ÕÙ Ö Ð Þ Ð ×ÙÑ
      Ð Ö          ר Ò ×º ÈÓÖ ÙÐØ ÑÓ¸ SA × ÙÒ ¬ÐØÖÓ Ö Ó׺
     7.9.1.1       Distancia acumulada en los nodos

     Ä ×Ø Ò       ÙÑÙÐ ÔÙ       Ù Ö Ö× Ñ ÒØ Ð ÓÓ     Ð ÒÓ Óº    ÑÓ× Ô ÖØ Ö
     ÙÒ ÐÓÕÙ     Ñ ÑÓÖ Ò ÓÒ ÐÑ Ò Ö Ð ÙÑÙÐ Ó (vi)º Ù Ö Ö ÑÓ׸ Ô٠׸
     ÔÓÖ     ÒÓ Ó¸ Ð Ò ÓÖÑ ÓÒ ¬Ò ÔÓÖ Ð × Ù ÒØ Ö ×ØÖÓ
½¾    ÁÒ ÓÖÑ ÓÒ ÔÓÖ ÒÓ Ó Ò   ×ØÖ ½¾ ≡                        ½¾
             template <class GT, class Distance>
         struct Dijkstra_Node_Info
         {
           typename GT::Node * tree_node; // Imagen del nodo en el arbol abarcador
                                                                   ´
           typename Distance::Distance_Type dist; // distancia acumulada
           void *                           heap_node;
           Dijkstra_Node_Info()
           : tree_node(NULL), dist(Distance::Zero_Distance), heap_node(NULL)
           { /* empty */ }
         };
         ¬Ò ×
         Dijkstra Node Info¸   Ù×   Ò ÙÒ   ½¿º
     tree node   ׸ ÓÑÓ ×Ù ÓÑ ÒØ Ö Ó ÐÓ Ò ¸ Ð Ñ Ò Ð ÒÓ Ó Ò Ð Ö ÓÐ Ö ÓÖ
          Ñ ÒÓ× Ñ Ò ÑÓ׺ dist × Ð ÙÑÙÐ Ó (vi) × start nodeº heap node × ÙÒ
     ÔÙÒØ ÖÓ ÙÒ ÒÓ Ó ÒØÖÓ Ð Ô Ü ÐÙ× ÚÓ ÓÖ Ò Ó ÔÓÖ ÔÓØ Ò Ð ×º
         Ò ÓÒ×ÓÒ ÓÒ Ð ÒØ Ö Þ ArcHeap¸        ÑÓ× ×Ô ¬ Ö Ð Ð ×   ×Ó Ð ÑÔÓ
     heap node
½¾   ÁÒ ÓÖÑ ÓÒ ÔÓÖ ÒÓ Ó Ò               ×ØÖ ½¾   +≡                          ½¾
               template <class GT, class Distance, class Compare>
         struct Dijkstra_Heap_Info
         {
           typedef typename ArcHeap<GT, Distance, Compare, Dijkstra_Heap_Info>::Node Node;
           Node *& operator () (typename GT::Node * p) { return (Node*&) HEAPNODE(p); }
7.9. Caminos m´
                   ınimos                                                           713



       };
       ¬Ò ×
       Dijkstra Heap Info¸   Ù×   Ò ÙÒ   ½ º
     Í× × ArcHeap ¼¿ º
        Ä Ñ Ò ÔÙÐ ÓÒ ÐÓ× ÑÔÓ× ÒØ Ö ÓÖ × × Ö Ð Þ ØÖ Ú ×               ÐÓ× × Ù ÒØ × Ñ ÖÓ×
½¿      ¬Ò ÓÒ Ñ ÖÓ× Ô Ö Ð ÓÖ ØÑÓ      ×ØÖ ½¿ ≡
           // conversi´n de cookie a Node_Info
                      o
       # define DNI(p) (static_cast<Dijkstra_Node_Info<GT, Distance>*>(NODE_COOKIE((p))))
           // Acceso al nodo del arbol en el grafo
                                 ´
       # define TREENODE(p) (DNI(p)->tree_node)
       # define ACC(p) (DNI(p)->dist) // Acceso a la distancia acumulada
       # define HEAPNODE(p) (DNI(p)->heap_node)
     Í× × Dijkstra Node Info ½¾ º
          Ð Ø ÔÓ List Graph<Node, Arc> ×ÔÓÒ      ØÓ Ð Ñ ÕÙ Ò Ö Ô Ö Ò Ð Þ Ö Ý
       ×¹ Ò Ð Þ Ö ÐÓ× ÒÓ Ó׺ Ë ÙÒ ÐÐÓ¸ ¬Ò ÑÓ× Ð Ò Ð Þ ÓÒ Ð × Ù ÒØ Ñ Ò Ö
½¿     Ð × Ô ÖØ ÓÖ       Ò ÓÖÑ ÓÒ Ô Ö ÒÓ Ó ½¿ ≡
         template <class GT, class Distance>
       struct Initialize_Dijkstra_Node
       {
         void operator () (GT & g, typename GT::Node * p)
         {
           g.reset_bit(p, Aleph::Dijkstra);
           NODE_COOKIE(p) = new Dijkstra_Node_Info <GT, Distance>;
         }
       };
     Í× × Dijkstra Node Info ½¾ º
          Ò ÐÓ Ñ ÒØ ¸ Ð Ð × Ô Ö ×¹ Ò Ð Þ Ö × ¬Ò ×
½¿     Ð × Ð Ö ÓÖ      Ò ÓÖÑ ÓÒ Ô Ö ÒÓ Ó ½¿ ≡
           template <class GT, class Distance>
       struct Destroy_Dijkstra_Node
       {
         void operator () (GT &, typename GT::Node * p)
         {
           Dijkstra_Node_Info <GT, Distance> * aux = DNI(p); // guardar bloque liberar
           GT::map_nodes (p, TREENODE(p));
           delete aux; // liberar bloque
         }
       };
     Í× × Dijkstra Node Info ½¾ º
         ÈÙ ×ØÓ ÕÙ Ð ÓÓ × ÙØ Ð Þ Ô Ö Ù Ö Ö ×Ø Ó Ø ÑÔÓÖ Ð            Ð ÙÐÓ¸ ר ÕÙ
      ÒÚ Ð Ó¸ ÙÖ ÒØ Ð Ð ÙÐÓ¸ Ô Ö Ù Ö Ö Ð Ñ Ò Ð ÒÓ Ó Ò Ð Ö ÓÐ Ö ÓÖº
     ÈÓÖ × Ö ÞÓÒ¸ Ð Ñ Ô Ó Ð ÒÓ Ó × Ö Ð Þ Ð ¬Ò Ð Ð Ð ÙÐÓ¸ ÙÖ ÒØ Ð Ð Ö ÓÒ Ð
      Ò ÓÖÑ ÓÒ Dijkstra Node Infoº ÄÓ Ñ ×ÑÓ Ó ÙÖÖ Ö ÓÒ ÐÓ× Ö Ó× Ý Ð ÔÓØ Ò Ðº
         Ä Ò Ð Þ ÓÒ Ý ×¹ Ò Ð Þ ÓÒ × Ö Ð Þ Ò¸ ØÖ Ú ×               Ð Ñ ÕÙ Ò Ö
     List Graph<Node, Arc>¸     Ð × Ù ÒØ × ÓÖÑ ×
½¿      Ô ÖØ Ö Ñ ÑÓÖ Ô Ö ÐÓ× ÒÓ Ó× ½¿ ≡                          ´½ µ
       Operate_On_Nodes <GT, Initialize_Dijkstra_Node <GT, Distance> > () (g);
714                                                                         Cap´
                                                                                   ıtulo 7. Grafos



½   Ä Ö Ö Ñ ÑÓÖ Ô Ö ÐÓ× ÒÓ Ó× ½                   ≡                            ´½    ½ µ
      Operate_On_Nodes <GT, Destroy_Dijkstra_Node <GT, Distance> > () (g);

          Ò Ñ Ó× ÐÓÕÙ × g × Ð Ö Ó ×Ó Ö Ð Ù Ð ×                  ×       Ð ÙÐ Ö ÐÓ× Ñ ÒÓ× Ñ × ÓÖØÓ׺
    7.9.1.2   Potencial en los arcos

    Ä Ò ÓÖÑ ÓÒ Ô Ö ÙÒ Ö Ó × Ô Ö                        Ð   Ð ÒÓ Ó Ý ×     ¬Ò        Ñ Ò Ö ×ÑÐ Ö
½    ÁÒ ÓÖÑ ÓÒ ÔÓÖ Ö Ó Ò  ×ØÖ ½                   ≡
        template <class GT, class Distance>
      struct Dijkstra_Arc_Info
      {
        typename GT::Arc *               tree_arc; // imagen en el arbol abarcador
                                                                   ´
        typename Distance::Distance_Type pot;      // potencial del arco
      };
      ¬Ò ×
      Dijkstra Arc Info¸   Ù×     Ò ÙÒ    ½º
         Ð Ñ Ò Ó ×Ø              רÖÙ ØÙÖ Ñ ÒØ Ñ ÖÓ׸ ×Ù Ò Ð Þ ÓÒ Ý Ð Ö ÓÒ × Ö Ð Þ
       Ñ Ò Ö ×ÑÐ Ö              ÓÒ ÐÓ× ÒÓ Ó׺
       Ä ÓÖÑ Ò ÕÙ               × Ô ÖØ Ò Ð Þ Ð ÔÓØ Ò Ð ÙÒ Ö Ó × × Ñ Ð Ö Ð       ÙÒ
    ÒÓ Ó
½     Ð × Ô ÖØ ÓÖ               Ò ÓÖÑ ÓÒ Ô Ö Ö Ó ½         ≡
          template <class GT, typename Distance>
      struct Initialize_Dijkstra_Arc
      {
        void operator () (GT & g, typename GT::Arc * a)
        {
          g.reset_bit(a, Aleph::Dijkstra);
          ARC_COOKIE(a) = new Dijkstra_Arc_Info <GT, Distance>;
          POT(a) = Distance::Zero_Distance;
          TREEARC(a) = NULL;
        }
      };
    Í× × Dijkstra Arc Info ½ ¸ POT¸ Ò       TREEARCº
         Ò ÐÓ Ñ ÒØ ÓÒ Ð Ð Ö ÓÒ Ñ ÑÓÖ
½     Ð × Ð Ö ÓÖ    Ò ÓÖÑ ÓÒ Ô Ö Ö Ó ½                     ≡
          template <class GT, class Distance>
      struct Destroy_Dijkstra_Arc
      {
        void operator () (GT &, typename GT::Arc * ga)
        {
          Dijkstra_Arc_Info<GT, Distance> * aux = DAI(ga);
          typename GT::Arc * ta                 = TREEARC(ga);
          if (ta != NULL) // ¿pertenece este arco al arbol abarcador?
                                                     ´
            GT::map_arcs (ga, ta); // s´ ==> mapearlo
                                       ı
          delete aux;
        }
      };
    Í× × Dijkstra Arc Info ½       Ò   TREEARCº
7.9. Caminos m´
                  ınimos                                                             715



          ÓÖ ¸ ÓÖÑ × Ñ Ð Ö ÓÑÓ                      ÑÓ× ÓÒ ÐÓ× ÒÓ Ó׸ ×Ô ¬ ÑÓ× Ð Ô ÖØ Ó Ý
    Ð Ö ÓÒ Ñ ÑÓÖ
½     Ô ÖØ Ö Ñ ÑÓÖ Ô Ö ÐÓ× Ö Ó× ½               ≡                          ´½ µ
      Operate_On_Arcs <GT, Initialize_Dijkstra_Arc<GT, Distance> > () (g);

½   Ä Ö Ö Ñ ÑÓÖ Ô Ö ÐÓ× Ö Ó× ½              ≡                         ´½    ½ µ
      Operate_On_Arcs <GT, Destroy_Dijkstra_Arc<GT, Distance> > () (g);

        ÒØ ×   ¬Ò Ö Ð Ô      ÑÓ× ×Ô ¬ Ö Ð Ñ Ò Ö Ò ÕÙ × ÓÑÔ Ö Ò ÐÓ× ÔÓØ Ò¹
      Ð×
½     ÓÑÔ Ö ÓÒ ÒØÖ ÔÓØ Ò Ð × ½ ≡
        template <class GT, class Compare, class Distance>
      struct Compare_Arc_Data
      {
        bool operator () (typename GT::Arc * a1, typename GT::Arc * a2) const
        {
          return Compare () (POT(a1), POT(a2));
        }
      };
      ¬Ò ×
      Compare Arc Data¸   Ò Ú Ö Ù× º
    Í× × POTº
      ×ØÓ ÒÓ× Ô ÖÑ Ø   ÐÖÖ Ð Ô
½       Ð Ö ÓÒ       Ô Ò   ×ØÖ ½                ≡                     ´½    ½ µ
      typedef Dijkstra_Heap_Info<GT, Distance, Compare> Acc_Heap;
      ArcHeap<GT, Distance, Compare, Acc_Heap> heap;
    Í× × ArcHeap ¼¿ Ò      Dijkstra Heap Info   ½¾ º

    7.9.1.3   El algoritmo de Dijkstra

      Ð Ð ÓÖ ØÑÓ Ø Ò Ó× × × ÙÒ      Ò Ð Þ ÓÒ ÓØÖ    Ð ÙÐÓº Ä Ò Ð Þ ÓÒ Ô ÖØ
    Ð Ñ ÑÓÖ         ÓÒ Ð Ô Ö Ð ×Ø Ò   ÙÑÙÐ Ý ÐÓ× ÔÓØ Ò Ð ×
½    ÁÒ Ð Þ Ö Ð ÓÖ ØÑÓ        ×ØÖ ½ ≡                      ´½ ½ µ
      clear_graph(tree); // limpiar arbol abarcador destino
                                    ´
        Ô ÖØ Ö Ñ ÑÓÖ Ô Ö ÐÓ× ÒÓ Ó× ½¿
        Ô ÖØ Ö Ñ ÑÓÖ Ô Ö ÐÓ× Ö Ó× ½
      NODE_BITS(start_node).set_bit(Aleph::Dijkstra, true);
      ACC(start_node)                   = Distance::Zero_Distance;
      TREENODE(start_node)              = tree.insert_node(start_node->get_info());
      NODE_COOKIE(TREENODE(start_node)) = start_node;
          ÓÒ Ð Ô Ý Ð Ñ Ò Ó Ð Ñ ÑÓÖ               ÑÓ× × Ö ÑÙÝ Ù Ó×Ó׺ Ð Ô Ù Ö
     Ö Ó׸ ÐÓ× Ù Ð × ×Ù Ú Þ Ñ ÒØ Ò Ò ÐÓ× ÔÓØ Ò Ð × Ô ÖØ Ó× Ò Ô ÖØ Ö Ñ ÑÓÖ Ô Ö
    ÐÓ× Ö Ó× ½ º Ò ×Ø × ÒØ Ó¸ × ÑÙÝ ÑÔÓÖØ ÒØ ÕÙ Ð Ô × ×ØÖÙÝ ÒØ × Ð
    Ð Ö ÓÒ Ñ ÑÓÖ             ÙØ     Ò Ð ÐÓÕÙ Ä Ö Ö Ñ ÑÓÖ Ô Ö ÐÓ× Ö Ó× ½ º
    Ë Ó ÙÖÖ Ð Ö Ú ×¸ ÒØÓÒ × Ð Ô Ö Ö Ò Ö ÓÓ × ÕÙ Ý Ù ÖÓÒ Ð Ö Ó׺ È Ö
     × ÙÖ Ö ×ØÓ¸ Ö Ö ÑÓ× ÙÒ ÐÓÕÙ ÒØ ÖÒÓ ÓÒ ×             Ð Ö Ö Ð Ôº     × ÑÓ Ó¸ Ð
     רÖÙ ØÙÖ Ò Ö Ð Ð Ð ÓÖ ØÑÓ            ×ØÖ ÕÙ    ÓÑÓ × Ù
½     Ð ÓÖ ØÑÓ       ×ØÖ ½ ≡                                     ´ ½¾ µ
       ÁÒ Ð Þ Ö Ð ÓÖ ØÑÓ        ×ØÖ ½
716                                                                    Cap´
                                                                               ıtulo 7. Grafos



       {        // bloque adicional para asegurar que el heap se destruya antes que
                // los bloques almacenados en los cookies
              Ð Ö ÓÒ          Ô Ò       ×ØÖ ½
           Å Ø Ö Ö Ó× Ò      Ð× Ò       Ô ½
             Ð ÙÐ Ö Ö ÓÐ     Ö ÓÖ           ×ØÖ ½
       } // aqu´ se destruye el heap
               ı
       Ä Ö Ö Ñ ÑÓÖ Ô Ö ÐÓ× Ö Ó× ½
       Ä Ö Ö Ñ ÑÓÖ Ô Ö ÐÓ× ÒÓ Ó× ½
          Ð Ù Ð ÕÙ Ð Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ Ý Ð Ð ÓÖ ØÑÓ                 ÈÖ Ñ¸        ÑÓ× Ñ Ø Ö ÐÓ× Ö Ó×
        Ò Ó Ò Ð Ô ÒØ × Ò Ö Ð Ð ÙÐÓ
½     Å Ø Ö Ö Ó× Ò Ð × Ò Ô ½ ≡                                             ´½    ½ µ
       for (Node_Arc_Iterator<GT, SA> it(start_node); it.has_current(); it.next())
         {
           typename GT::Arc * arc = it.get_current_arc();
           POT(arc)               = ARC_DIST(arc);
           ARC_BITS(arc).set_bit(Aleph::Dijkstra, true);
           heap.put_arc(arc, it.get_tgt_node());
         }
     Í× × ARC DIST¸ Node Arc Iterator    ¸ POT¸ Ò   put arc   ¼º
        ÍÒ Ú Þ ÕÙ ÐÓ× ÔÓØ Ò Ð × Ò Ð × ×Ø Ò Ò Ð Ô Ý Ð Ú ÐÓÖ                          ר Ò ÒÙÐ Ò
     start node¸ × Ò   Ð Ø Ö ÓÒ Ô Ö Ð ÙÐ Ö Ð Ö ÓÐ Ö ÓÖ                            ×ØÖ ¸ ÙÝ × Ö Ñ ×
     ×ÓÒ Ñ ÒÓ× Ñ Ò ÑÓ× × Ð Ö Þ start node
½       Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ        ×ØÖ ½ ≡                                         ´½ µ
       while (tree.get_num_nodes() < g.get_num_nodes()) // mientras tree no abarque a g
         {
               Ç Ø Ò Ö Ý ÔÖÓ × Ö ÔÖÓÜ ÑÓ Ö Ó ÓÒ Ñ ÒÓÖ ÔÓØ Ò Ð ½
                 ØÙ Ð Þ Ö ÔÓØ Ò Ð × Ý Ñ Ø ÖÐÓ× Ò Ô ½
           }
        Ð ÐÓÕÙ Ö Ô Ø Ø ÚÓ × Ù Ò Ó tree Ö g¸ ÐÓ Ù Ð × Ø Ø Ù Ò Ó tree Ð ÒÞ
      Ð Ñ ×Ñ ÒØ             ÒÓ Ó׺ Ð Ù Ð ÕÙ Ð Ð ÓÖ ØÑÓ ÈÖ Ñ¸ Ð         ×ØÖ Ñ ÒØ Ò
         tree ÓÒ ÜÓ¸ ÐÓ ÕÙ Ô ÖÑ Ø     Ø Ø Ö ÐÓ× ÔÓÖ × ÑÔÐ Ñ Ö Ó ÐÓ× ÒÓ Ó× Ú × Ø Ó׸
      ×ÒÒ ×            ÙÒ ÔÖÙ           Ð    º ÈÓÖ ÑÓ ÙÐ Ö ¸ × ÑÙÝ ÓÒÚ Ò ÒØ Ú Ö
       Ð Ð ÙÐÓ ÒØ ÖÒÓ Ð Ð ÞÓ Ò Ó× Ô ÖØ × ×ØÖÙ ØÙÖ ÐÑ ÒØ ÒØ × Ð Ð Ö ÓÖÖ Ó Ò
       ÑÔÐ ØÙ Ý Ð Ð ÓÖ ØÑÓ ÈÖ Ñ
          ½º
    ½        Ç Ø Ò Ö Ý ÔÖÓ × Ö ÔÖÓÜ ÑÓ Ö Ó ÓÒ Ñ ÒÓÖ ÔÓØ Ò Ð ½ ≡ ´ ½ ½ µ
               typename GT::Arc * garc = heap.get_min_arc(); // obtener arco menor potencial
               typename GT::Node * gsrc = g.get_src_node(garc);
               typename GT::Node * gtgt = g.get_tgt_node(garc);
                   // ¿Est´n los dos nodos visitados?
                          a
               if (IS_NODE_VISITED(gsrc, Aleph::Dijkstra) and IS_NODE_VISITED(gtgt, Aleph::Dijkstra))
                 continue; // ambos visitados ==> insertar este arco causar´a ciclo
                                                                           ı
               typename GT::Node * new_node = // seleccionar nodo no visitado
                 IS_NODE_VISITED(gsrc, Aleph::Dijkstra) ? gtgt : gsrc;
                   // insertar nuevo nodo en arbol y guardarlo en registro de nodo
                                             ´
               typename GT::Node * ttgt = tree.insert_node(new_node->get_info());
               TREENODE(new_node)       = ttgt;
               NODE_BITS(new_node).set_bit(Aleph::Dijkstra, true);
7.9. Caminos m´
                       ınimos                                                            717



                   typename GT::Arc * tarc = // insertar nuevo arco en tree y guardarlo en registro
                     tree.insert_arc(TREENODE(gsrc), TREENODE(gtgt), garc->get_info());
                   TREEARC(garc)           = tarc;
              Í× × get min arc ¼    Ò   TREEARCº


    ¾º
     ½              ØÙ Ð Þ Ö ÔÓØ Ò Ð × Ý Ñ Ø ÖÐÓ× Ò      Ô ½     ≡           ´½   ½µ
                   ACC(new_node) = POT(garc); // actualizar distancia recorrida desde nodo inicial
                   const typename Distance::Distance_Type & acc = ACC(new_node);
                       // por cada arco calcular potencial e insertarlo en heap
                   for (Node_Arc_Iterator<GT, SA> it(new_node); it.has_current(); it.next())
                     {
                       typename GT::Arc * arc = it.get_current_arc();
                       if (IS_ARC_VISITED(arc, Aleph::Dijkstra))
                         continue;
                       ARC_BITS(arc).set_bit(Aleph::Dijkstra, true);
                       typename GT::Node * tgt = it.get_tgt_node();
                       if (IS_NODE_VISITED(tgt, Aleph::Dijkstra))
                         continue; // nodo visitado ==> causar´ ciclo ==> no se mete en heap
                                                              a
                       POT(arc) = Plus () (acc, ARC_DIST(arc)); // calcula potencial
                       heap.put_arc(arc, tgt);
                     }
              Í× × ARC DIST¸ Node Arc Iterator     ¸ POT¸ Ò   put arc   ¼º
           × ÑÔÓÖØ ÒØ Ö Ñ Ö Ö Ð ÓÒ ÕÙ ÔÓÖØ Ú Ö ¬ Ö × Ð ÒÓ Ó ×Ø ÒÓ Ð Ö Ó Ý
         × Ó Ú × Ø Óº Ò ØÓ¸ ר Ú Ö ¬ ÓÒ ÔÙ          ÓÖÖ ÑÓ× ÙÒ Ò× Ö ÓÒ Ð Ô¸ ÙÝÓ
          Óר × O(Ð V)º Ó ×Ø Ñ ×Ñ Ð Ò        Ó × ÖÚ ÓÒ¸ ÒÓØ ÑÓ× ÕÙ ÔÙ Ó ÙÖÖ Ö ÕÙ Ð
            ר ÒÓ arc Ý Ý × Ó Ú × Ø Ó¸ ÔÙ × Ý ÔÙ      Ü ×Ø Ö ÓØÖ Ú Ò× ÖØ   Ò Ð Ô
         ÕÙ Ð Ò Ð ÒÓ Ó ×Ø ÒÓº ÈÓÖ × Ö ÞÓÒ¸ × Ò × Ö Ó ÕÙ Ò Ð ÐÓÕÙ Ç Ø Ò Ö Ý
         ÔÖÓ × Ö ÔÖÓÜ ÑÓ Ö Ó ÓÒ Ñ ÒÓÖ ÔÓØ Ò Ð ½ × Ú Ö ¬ÕÙ Ú × Ø ÐÓ× Ó× ÒÓ Ó× Ð
          Ö Óº
               Ð Ð ÓÖ ØÑÓ       ×ØÖ ÔÙ ÑÔÐ ÒØ Ö×   ÐÑ ÒØ ÓÒ Ñ ØÖ ×       Ý Ò ºÄ
          רÖÙ ØÙÖ × × Ñ Ð Ö ¸ Ò ÐÙ× Ú ¸ ÔÙ Ù Ö Ö× Ò ÙÒ Ñ ØÖ Þ ÕÙ ÓÒØ Ò ØÓ Ó× ÐÓ×
         ÔÖ×         Ñ ÒÓ× Ñ Ò ÑÓ׺ ר Ø Ò × ×ØÙ Ö Ò Ü º º¾ ´Ô Ò ¾¼µº
         7.9.1.4     C´lculo de un camino m´
                      a                    ınimo

           Ð Ð ÓÖ ØÑÓ ÒØ Ö ÓÖ Ð ÙÐ ÙÒ Ö ÓÐ Ö ÓÖ ÓÒ Ö Þ Ò Ð ÒÓ Ó ÓÖ Òº ËÙ× Ö Ñ ×
         Ö ÔÖ × ÒØ Ò Ñ ÒÓ× Ñ Ò ÑÓ× × Ð ÓÖ Ò Ù ÐÕÙ Ö ÓØÖÓ ÒÓ Óº Ë ÐÓ ÕÙ × ÔÖ Ø Ò ×
          ÓÒÓ Ö ÙÒ Ñ ÒÓ Ñ Ò ÑÓ ÒØÖ Ó× ÒÓ Ó׸ ÒØÓÒ × ÔÓ ÑÓ× ÓÖÖ Ö Ø ÑÔÓ        Ù ÓÒ
         × Ø Ò ÑÓ× Ð Ð ÙÐÓ Ð Ö ÓÐ Ö ÓÖ ÙÒ Ú Þ ÕÙ × Ð Ò Ð ÒÓ Ó ×Ø ÒÓº רÓ
         ÐÓ ÔÓ ÑÓ× ÔÐ ÒØ Ö Ð × Ù ÒØ Ñ Ò Ö
½         ÈÖÓØÓØ ÔÓ Ð Ð ÓÖ ØÑÓ      ×ØÖ ½¾ +≡                        ½¾
               template <class GT, class Distance, class Compare,
                         class Plus, class SA> inline
          void dijkstra_min_path(GT &                g,
                                 typename GT::Node * start_node,
                                 typename GT::Node * end_node,
718                                                                                                                                                                                    Cap´
                                                                                                                                                                                              ıtulo 7. Grafos


              L        4        M            2       N       3        O       6        P                                       L               4               M               2               N               3               O               6               P


          10       12       10           8       3       1        3       1        1       7                               10              12              10              8               3               1               3               1               1       7


     F        5        G            15       H               I                J        4       K               F               5               G                   15          H                               I                               J               4       K
                                                     2                2                                                                                                                        2                               2

          9        4        1            7       3       2        1       2        5       2                               9               4               1               7               3               2               1               2               5       2


              A        3        B            4       C       3        D       4        E                                       A               3               B               4               C               3               D               4               E


                                                 ´µ                                                                                                                                    ´ µ
              L        4        M            2       N       3        O       6        P                                       L               4               M               2               N               3               O               6               P


          10       12       10           8       3       1        3       1        1       7                               10              12              10              8               3               1               3               1               1       7


     F        5        G            15       H               I                J        4       K               F               5               G                   15          H                               I                               J               4       K
                                                     2                2                                                                                                                        2                               2

          9        4        1            7       3       2        1       2        5       2                               9               4               1               7               3               2               1               2               5       2


              A        3        B            4       C       3        D       4        E                                       A               3               B               4               C               3               D               4               E


                                                 ´µ                                                                                                                                    ´ µ
              L        4        M            2       N       3        O       6        P                   L           4               M               2               N               3               O               6               P


          10       12       10           8       3       1        3       1        1       7           10          12              10              8               3               1               3               1               1               7


     F        5        G            15       H               I                J        4       K   F       5           G                   15          H                               I                               J               4               K
                                                     2                2                                                                                                2                               2

          9        4        1            7       3       2        1       2        5       2           9           4               1               7               3               2               1               2               5               2


              A        3        B            4       C       3        D       4        E                   A           3               B               4               C               3               D               4               E


                                                 ´µ                                                                                                                ´µ

       ÙÖ º ÈÖÓ Ö ×Ó Ð Ð ÓÖ ØÑÓ                                                                    ×ØÖ ÓÒ Ö Þ Ò Ð ÒÓ Ó ´                                                                                                       ¬ ÙÖ ÓÖÖ ×¹
    ÔÓÒ ØÖ × Ø Ö ÓÒ ×µ

                                                                  Path<GT> &                                   min_path)
      {
          GT tree; // arbol abarcador temporal
                      ´
          ÁÒ               Ð Þ Ö Ð ÓÖ ØÑÓ                                         ×ØÖ ½
          {
                     Ð Ö ÓÒ                                       Ô Ò              ×ØÖ ½
                  Å Ø Ö Ö Ó× Ò                                   Ð× Ò              Ô ½
                    Ð ÙÐ Ö Ö ÓÐ                                  Ö ÓÖ                  ×ØÖ Ô Ö Ð ½
          }
           Ù× Ö Ò ØÖ Ñ ÒÓ ÒØÖ ×Ø ÖØ ÒÓ Ý Ò ÒÓ                                                                                              ½
          Ä Ö Ö Ñ ÑÓÖ Ô Ö ÐÓ× Ö Ó× ½
          Ä Ö Ö Ñ ÑÓÖ Ô Ö ÐÓ× ÒÓ Ó× ½
      }
    Í× × Path ¼¾ º
        Ä ÔÖ Ñ Ö Ô ÖØ Ð Ð ÓÖ ØÑÓ × ÑÙÝ × Ñ Ð Ö Ð ÐÓÕÙ Ð ÓÖ ØÑÓ        ×ØÖ ½ º
    Ä ÙÒ          Ö Ò ×Ø       ÔÓÖ Ð ÐÓÕÙ       Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ          רÖ
    Ô Ö Ð ½ ÙÝ ×ØÖÙ ØÙÖ × Ô Ö           Ð ÐÓÕÙ        Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ        ¹
      ×ØÖ ½ ¸ × ÐÚÓ ÕÙ ¸ Ô Ö ÓÖÖ Ö Ø ÑÔÓ         Ù ÓÒ¸ Ð Ð ÙÐÓ Ð Ö ÓÐ Ö ÓÖ
    × Ø Ò Ù Ò Ó × Ñ Ö Ð ÒÓ Ó ×Ø ÒÓ end node¸ Ó × ¸ Ù Ò Ó gtgt == end node
½       Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ       ×ØÖ Ô Ö Ð ½ ≡                     ´½ µ
      while (tree.get_num_nodes() < g.get_num_nodes()) // mientras tree no abarque a g
        {
7.9. Caminos m´
                  ınimos                                                                719



            Ç Ø Ò Ö Ý ÔÖÓ × Ö ÔÖÓÜ ÑÓ Ö Ó ÓÒ Ñ ÒÓÖ ÔÓØ Ò Ð ½
            if (gtgt == end_node) // ¿est´ end_node en arbol abarcador?
                                         a             ´
              break; // s´ ==> camino m´nimo ya est´ en arbol abarcador
                         ı             ı           a     ´
               ØÙ Ð Þ Ö ÔÓØ Ò Ð × Ý Ñ Ø ÖÐÓ× Ò       Ô ½
        }
      Ð Ø ÖÑ ÒÓ ×Ø ÐÓÕÙ ¸ tree ÓÒØ Ò ÙÒ Ö ÓÐ Ö ÓÖ¸ ÔÖÓ Ð Ñ ÒØ Ô Ö Ð¸ ÕÙ
     ÓÒØ Ò ÙÒ Ñ ÒÓ Ñ Ò ÑÓ × start node ר end nodeº ÄÓ ÔÖ Ñ ÖÓ ÕÙ   ÑÓ׸
    Ô٠׸ × Ò ÓÒØÖ Ö × Ñ ÒÓ Ñ Ò ÑÓ
½      Ù× Ö Ò ØÖ Ñ ÒÓ ÒØÖ ×Ø ÖØ ÒÓ Ý Ò ÒÓ ½ ≡       ´½ µ ½
      Path<GT> tree_min_path(tree, TREENODE(start_node));
      find_path_depth_first(tree, TREENODE(start_node), TREENODE(end_node), tree_min_path);
    Í× × Path ¼¾ º
    tree min pathÓÒØ Ò Ð Ñ ÒÓ Ñ Ò ÑÓ Ò tree¸ Ô ÖÓ ÐÓ ÕÙ × ÑÓ× × Ð Ñ ÒÓ
    Ñ Ò ÑÓ Ò gº × Ô٠׸ Ð × Ù ÒØ × ÓÒ× ×Ø Ò ÓÔ Ö¸ × Ù Ò Ó Ð Ñ Ô Ó¸ Ð Ñ ÒÓ
    tree min pathÐ Ô Ö Ñ ØÖÓ min path
½     Ù× Ö Ò ØÖ Ñ ÒÓ ÒØÖ ×Ø ÖØ ÒÓ Ý Ò ÒÓ ½ +≡ ´ ½ µ ½
      min_path.clear_path();
      min_path.init(start_node);
      typename Path<GT>::Iterator it(tree_min_path);
      for (it.next(); it.has_current(); it.next())
        min_path.append(GRAPHNODE(it.get_current_node()));
    Í× × Path ¼¾ º

    7.9.1.5    Correctitud del algoritmo de Dijkstra

    ÍÒ ×ÙÒØÓ × Ò Ð ÓÒÓ Ñ ÒØÓ × ÕÙ Ð Ð ÓÖ ØÑÓ                        ×ØÖ ÒÓ ÓÔ Ö ÓÖÖ Ø Ñ ÒØ
    Ô Ö Ö Ó× Ò Ø ÚÓ׺ Ð Ð ÓÖ ØÑÓ ×ÙÑ ÕÙ Ð ×Ø Ò                    ØÓØ Ð × Ð ÒÓ Ó ÓÖ Ò ÒÓ
                                                 2

                                             3        -2

                                         0       2         1


              ÙÖ º       ÑÔÐÓ      Ö Ó Ò Ø ÚÓ ÕÙ               ÐÐ Ö Ð Ð ÓÖ ØÑÓ    רÖ
        Ö ÔÖ Ñ × ÙÒ Ñ ÒØ Ð Ô Ö       Ù Ö Ô ÖØ Ò Ò        ÙÒ Ö Ó Ð Ö ÓÐ Ö ÓÖ
    Ñ Ò ÑÓ ÓÒ Ö Þ Ò Ð ÒÓ Ó ÓÖ Òº ÓÒ× Ö ÑÓ׸ ÔÓÖ ÓÒØÖ ¹ ÑÔÐÓ¸ Ð Ö Ó Ð
    ¬ ÙÖ º Ý ÓÖ Ò Ò Ð ÒÓ Ó 0º Ð Ð ÓÖ ØÑÓ         ×ØÖ × Ð ÓÒ ÓÑÓ Ö ÓÐ Ö ÓÖ
    ÐÓ× Ö Ó× 0 −→ 2 Ý 0 −→ 1¸ ÐÓ ÕÙ ¸ Ð× Ñ ÒØ ¸ Ð Ö Ó 0 −→ 2 ÓÑÓ Ð Ñ ÒÓ Ñ Ò ÑÓ
       × 0 ר 2 ÓÒ Óר 3¸ Ù Ò Ó Ð Ñ Ò ÑÓ × 0 −→ 1 −→ 2 ÓÒ Óר 0º
        Ê Ð Þ Ð Ð Ö ØÓÖ ÒØ Ö ÓÖ¸ ÔÓ ÑÓ× ×Ø Ð Ö Ð ÓÖÖ Ø ØÙ          Ó Ð × Ù ÒØ
    ÔÖÓÔÓ× ÓÒ
    Proposici´n 7.5
             o         Ë G ÙÒ Ö Ó ÓÒ ÜÓ Ù ÐÕÙ Ö º ÒØÓÒ × Ð Ð ÓÖ ØÑÓ    רÖ
    ×Ó Ö ÙÒ ÒÓ Ó      ÓÖ Ò v Ò Ù ÒØÖ ÙÒ Ö ÓÐ Ö ÓÖ ÓÒØ ÒØ ÚÓ ØÓ Ó× ÐÓ× Ñ ÒÓ×
    Ñ Ò ÑÓ× × vº
720                                                         Cap´
                                                               ıtulo 7. Grafos



Demostraci´n (por contradicci´n inductiva sobre la cantidad de nodos V)
            o                  o
ËÙÔÓÒ ÙÒ Ö Ó ÓÒ ÜÓ G =< V, E >¸ ÙÒ ÒÓ Ó v ∈ V Ö Þ ÙÒ Ö ÓÐ Ö ÓÖ
    ×ØÖ Ý ÙÒ Ö ÓÐ Ö ÓÖ T =< V, E >º Ð ÙÒ Ñ ÒØÓ Ð ÑÓ×ØÖ ÓÒ ×ØÖ Ò
×ÙÔÓÒ Ö ÕÙ Ü ×Ø ÙÒ Ö Ó a ∈ E º
                         /

  ½º   V =2  Ò ×Ø ×Ó¸ Ð Ö ÓÐ Ö ÓÖ × Ð ÒÓ Ó ÓÖ Ò Ø Ò ÙÒ ×ÓÐÓ Ö Ó Ð
     Ù Ð × Ð Ñ Ò ÑÓ × ÙÒ Ð Ð ÓÖ ØÑÓº Ò ×Ø ×Ó¸ a ∈ E × ÙÒ ÓÒØÖ
                                                     /                 ÓÒ¸ ÔÙ ×
     Ð Ô Ö ÒØ Þ ÕÙ Ð ÔÖ Ñ Ö Ö Ó ÕÙ × ÔÖÓ × × Ð Ñ Ò ÑÓ Ý ÒØ vº
  ¾º ÓÖ ×ÙÔÓÒ ÑÓ× ÕÙ Ð ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö ØÓ Ó V ≤ n Ý ÓÒר Ø ÑÓ× × ÐÓ
     × Ô Ö V = n + 1º
    Ë v ∈ V Ð ÒÓ Ó ÓÖ Ò Ð Ö ÓÐ Ö ÓÖ Ý w ÙÒ ÒÓ Ó ×Ø ÒÓ ÕÙ Ò Ð Ø Ö ÓÒ
    n ÒÓ × Ò Ù ÒØÖ Ò Ð Ö ÓÐ       Ö ÓÖ T º Ë ×ÙÑ ÑÓ× ÕÙ w × Ð ÙÐØ ÑÓ ÒÓ Ó
     Ò ÐÙ Ö Ò T ¸ ÒØÓÒ ×¸ ÐÙ Ó Ð Ø Ö ÓÒ n + 1¸ ×ÙÑ ÑÓ× ÕÙ ∃a ∈ E | a ×
                                                                   /
    Ñ Ò ÑÓ ÒØÖ v Ý wº
    Ë w × Ð ÙÐØ ÑÓ ÒÓ Ó Ò ÐÙ Ö Ò T ¸ ÒØÓÒ × Ð Ô ÓÒØ Ò Ö Ó× ÕÙ ¸ Ó ÓÒ ÓÖÑ Ò
       ÐÓ× Ó ÓÒ Ø Ò wº ÄÓ× Ö Ó× ÕÙ ÓÒ ÓÖÑ Ò ÐÓ× ÒÓ ×ÓÐÓ ÒÓ Ô ÖØ Ò Ò T ¸
    × ÒÓ ÕÙ ÒÓ ÔÙ Ò × Ö Ñ Ò ÑÓ× ÔÙ × ÙÒ ÐÓ ÙÑ ÒØ Ð Óר º × Ô٠׸ ×ÓÐÓ ÒÓ×
     ÒØ Ö × Ò ÐÓ× Ö Ó× Ò Ð Ô Ð Ø ÔÓ x −→ w ÕÙ ÓÒ Ø Ò ÙÒ ÒÓ Ó x ∈ V ÓÒ wº
    ÈÙ ×ØÓ ÕÙ Ð Ô ×Ø ÓÖ Ò Ó ÔÓÖ ÐÓ× ÔÓØ Ò Ð × × w ר x¸ Ð Ð ÓÖ ØÑÓ
         ×ØÖ × Ö Ð Ö Ó ÓÒ Ñ ÒÓÖ Óר ØÓØ Ð × vº ÓÖ Ò¸ Ð Ü ×Ø Ò               ÙÒ
     Ö Ó Ñ Ò ÑÓ a ∈ E × ÙÒ ÓÒØÖ
                    /                 ÓÒ¸ Ô٠׸ Ð ÙÐØ ÑÓ Ö Ó x −→ w ÓÖÖ ×ÔÓÒ
      ÙÒ Óר ØÓØ Ð Ñ Ò ÑÓ ÒØÖ v Ý w
7.9.1.6    An´lisis del algoritmo de Dijkstra
             a

 Ð Ò Ð × × × ÔÖ Ø Ñ ÒØ × Ñ Ð Ö Ð Ð Ð ÓÖ ØÑÓ ÈÖ Ñ¸ ÔÙ × Ð × ×ØÖÙ ØÙÖ × ­Ù Ó
    Ñ Ó× Ð ÓÖ ØÑÓ× ×ÓÒ Ð × Ñ ×Ñ ×º
   ÄÓ× ÐÓÕÙ × Ò Ð Þ ÓÒ Ô ÖØ Ö Ñ ÑÓÖ Ô Ö ÐÓ× ÒÓ Ó× ½¿ Ý Ô ÖØ Ö
Ñ ÑÓÖ Ô Ö ÐÓ× Ö Ó× ½ ÓÒ×ÙÑ Ò O(V) + O(E)¸ ÐÓ Ù Ð¸ ÔÙ ×ØÓ ÕÙ Ð Ö Ó ×
 ÓÒ ÜÓ¸ ÔÙ      ÓÒ× Ö Ö× O(E)º ÄÓ Ñ ×ÑÓ Ó ÙÖÖ Ô Ö ÐÓ× ÐÓÕÙ × ¬Ò Ð × Ä Ö Ö
Ñ ÑÓÖ Ô Ö ÐÓ× Ö Ó× ½ Ý Ä Ö Ö Ñ ÑÓÖ Ô Ö ÐÓ× ÒÓ Ó× ½ º
     × Ô٠׸ Ð Ò Ð × × × ÒØÖ Ò ÓÒØ Ð Þ Ö Ð × Ø Ö ÓÒ × Ð ÐÓÕÙ           Ð ÙÐ Ö
 Ö ÓÐ Ö ÓÖ              ×ØÖ ½ ¸ ÙÝÓ Ò Ð × × × ÒØ Ó Ð Ð Ð ÓÖ ØÑÓ ÈÖ Ñ¸
ÔÙ × Ð ×ØÖÙ ØÙÖ × Ð Ñ ×Ñ Ý Ð Ð ÓÖ ØÑÓ        ×ØÖ Ø Ñ Ò Ù× Ð Ô Ü ÐÙ× ÚÓº
 Ð ÐÓÕÙ       Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ        ×ØÖ ½ Ø Ò ÙÒ ÓÑÔÐ             Ò Ø ÑÔÓ
   O(E Ð V)¸ Ù Ð × Ð × ÑÔ ÒÓ ¬Ò Ø ÚÓ Ð Ð ÓÖ ØÑÓ         ×ØÖ º
7.9.2     Algoritmo de Floyd-Warshall
  Ð Ð ÓÖ ØÑÓ    ÐÓÝ ¹Ï Ö× ÐÐ Ð ÙÐ ØÓ Ó× ÐÓ× Ñ ÒÓ× Ñ Ò ÑÓ× ÒØÖ Ô Ö × ÒÓ Ó׺
  × ÙÒ Ú Ö ÒØ Ð Ð ÓÖ ØÑÓ Ï Ö× ÐÐ Ô Ö Ð ÙÐ Ö Ð Ð Ù×ÙÖ ØÖ Ò× Ø Ú ×ØÙ Ó
 Ò Ü º º ´Ô Ò ½µº ÓÑÓ Ø Ð¸ ÓÔ Ö ×Ó Ö Ñ ØÖ ×         Ý Ò Ý ÔÓ× Ð Ú ÖØÙ
ÓÔ Ö Ö ÓÒ Ô ×Ó× Ò Ø ÚÓ׺ ÈÙ      ÔØ Ö× Ô Ö Ø Ø Ö Ý Ø ÖÑ Ò Ö ÐÓ× Ò Ø ÚÓ׺
     Ð Ð ÓÖ ØÑÓ Ù ÔÖ Ñ Ö Ñ ÒØ Ö ÔÓÖØ Ó × Ù ÖØÓ ÔÓÖ ÐÓÝ ½½ ¸ Ô ÖÓ¸ ÔÙ ×ØÓ ÕÙ
 רÖÙ ØÙÖ ÐÑ ÒØ × × Ñ Ð Ö Ð Ï Ö× Ðи ×Ù Ð ÐÐ Ñ Ö× Ð     ÐÓÝ ¹Ï Ö× ÐÐ º
    Ä ×Ô ¬ ÓÒ Ð Ð ÓÖ ØÑÓ × Ò Ù ÒØÖ Ò Ð Ö ÚÓ Floyd.Hº
7.9. Caminos m´
               ınimos                                                            721



 7.9.2.1       Interfaces

     Ð Ð ÓÖ ØÑÓ   ÐÓÝ ¹Ï Ö× ÐÐ Ñ Ò Ð × × Ù ÒØ × ÒØ Ö              ×
      ½º
¾½        ÁÒØ Ö × Ð Ð ÓÖ ØÑÓ     ÐÓÝ ¹Ï Ö× ÐÐ ¾½ ≡
               template <class GT, typename Distance, class Compare, class Plus, class SA>
           void floyd_all_shortest_paths
             (GT &                                                g,
              Ady_Mat<GT, typename Distance::Distance_Type, SA> & dist,
              Ady_Mat<GT, long, SA> &                             path);
        Í× × Ady Mat        Ò   floyd all shortest paths   ¾½ º
        Ä ÖÙØ Ò Ö          Ù ØÖÓ Ô Ö Ñ ØÖÓ× Ø ÔÓ
         ´ µ GT Ð Ø ÔÓ Ö Ó ´Ó Ö Óµº
         ´ µ Distance × Ð Ð × ÕÙ Ñ Ò Ð × ×Ø Ò ×º Å Ò Ñ ÐÑ ÒØ ¸ ר
              ÜÔÓÖØ Ö ÐÓ× ØÖ ÙØÓ× × Ù ÒØ × ÜÔÐ Ó× Ò Ü º º½ ´Ô Ò          µ
                º Distance Typeº Ö Ó׺
                º Max Distanceº
                º Zero Distance
               Úº operator () (typename GT::Arc *)º
         ´ µ Compare Ð ×          ÓÑÔ Ö ÓÒ ÒØÖ ×Ø Ò ×º
         ´ µ Plus Ð × ×ÙÑ ÒØÖ ×Ø Ò ×º
         ´ µ SA ¬ÐØÖÓ Ö Ó׺
        ÄÓ× Ô Ö Ñ ØÖÓ× Ð ÖÙØ Ò ×ÓÒ
         ´ µ g Ð Ö Ó Ó Ö Ó Ö ÔÖ × ÒØ Ó Ñ ÒØ ÙÒ Ú Ö ÒØ List Graph<Node, Arc>º
         ´ µ dist Ñ ØÖ Þ         Óר × Ñ Ò ÑÓ× ÒØÖ Ô Ö × ÒÓ Ó׺         ÒØÖ    רi,j
              ÓÒØ Ò Ð Óר Ñ Ò ÑÓ ÒØÖ ÐÓ× ÒÓ Ó× Ò × Ò Ð Ñ ØÖ Þ               Ý Ò
             i Ý j Ö ×Ô Ø Ú Ñ ÒØ º
         ´ µ path Ñ ØÖ Þ Ö ÙÔ Ö ÓÒ              Ñ ÒÓ׺    ÒØÖ Ô Ø i,j ÓÒØ Ò Ð ÒÓ Ó
             k ÕÙ Ô × ÔÓÖ Ð Ñ ÒÓ Ñ Ò ÑÓ ÒØÖ i Ý jº ÁÒ×Ô       ÓÒ × ×Ù × Ú × Ô Ø k,j
                ר ÕÙ Ô Ø k,j = j Ô ÖÑ Ø Ò Ö ÙÔ Ö Ö × Ò Ù×ÕÙ    Ð Ñ ÒÓ Ñ Ò ÑÓ ÒØÖ
              Ð Ô Ö < i, j >º
        Ä ÖÙØ Ò ÒØ Ö ÓÖ × ÑÔÐ ÒØ Ö Ò Ð × Ù ÒØ ÐÓÕÙ
¾½       ÊÙØ Ò × Ð Ð ÓÖ ØÑÓ         ÐÓÝ ¹Ï Ö× ÐÐ ¾½ ≡
               template <class GT, typename Distance, class Compare, class Plus, class SA>
           void floyd_all_shortest_paths
             (GT &                                                g,
              Ady_Mat<GT, typename Distance::Distance_Type, SA> & dist,
              Ady_Mat<GT, long, SA> &                             path)
           {
               ÁÒ Ð Þ Ö Ð ÓÖ ØÑÓ           ÐÓÝ ¹Ï Ö× ÐÐ ¾¿
                 Ð ÓÖ ØÑÓ  ÐÓÝ ¾
           }
           ¬Ò ×
          floyd all shortest paths¸   Ù×   Ò ÙÒ     ¾½ º
        Í× × Ady Mat    º
722                                                             Cap´
                                                                             ıtulo 7. Grafos



     ¾º
      ¾¾        Ê ÙÔ Ö ÓÒ          Ñ ÒÓ× ¾¾      ≡                            ¾¾
                        template <class Mat>
                    void find_min_path(Mat & p,
                                       const long & src_index, const long & tgt_index,
                                       Path<typename Mat::List_Graph_Type> & path);
                Í× × find min path ¾ Ò   Path    ¼¾ º
               ÙÒ Ñ ØÖ Þ    Ñ ÒÓ× Ñ Ò ÑÓ× Ð ÙÐ Ñ ÒØ floyd all shortest paths()¸
          Ð ÖÙØ Ò ÓÒרÖÙÝ ÙÒ Ñ ÒÓ Ñ Ò ÑÓ ÒØÖ ÐÓ× Ô Ö × ÒÓ Ó× ÓÒ Ò × src index Ý
          tgt indexº

     ¿º
      ¾¾        Ê ÙÔ Ö ÓÒ          Ñ ÒÓ× ¾¾      +≡                      ¾¾    ¾
                        template <class Mat>
                    void find_min_path(Mat & p,
                                       typename Mat::Node * src_node, typename Mat::Node * tgt_node,
                                       Path<typename Mat::List_Graph_Type> & path)
                    {
                      find_min_path(p, p(src_node), p(tgt_node, path);
                    }
                Í× × find min path ¾ Ò   Path    ¼¾ º
          Ë Ñ Ð Ö Ð ÒØ Ö ÓÖ¸ × ÐÚÓ ÕÙ ÐÓ× ÒÓ Ó× × ×Ô ¬ Ò Ö Ø Ñ ÒØ Ñ                ÒØ ÔÙÒØ ÖÓ×
           Ò Ð Ö ÔÖ × ÒØ ÓÒ ÓÒ Ð ×Ø × ÒÐ Þ ×º
          7.9.2.2     El algoritmo de Floyd-Warshall

          Ë Ñ Ð Ö Ð Ï Ö× Ðи Ð Ð ÓÖ ØÑÓ    ÐÓÝ ¹Ï Ö× ÐÐ ÑÔÐ ØÖ × Ð ÞÓ× ÕÙ ÜÔÐÓÖ Ò¸
           ÓÑÔ Ö Ò Ý × Ð ÓÒ Ò ÐÓ× Ñ ÒÓ× ÐÓÒ ØÙ 1, 2, . . . V ר Ù Ö Ö Ð ÒÙÑ ÖÓ ÒÓ Ó׺
          Inicializaci´n
                      o
              Ä        × ÓÒ× ×Ø Ò ÓÒ× Ö Ö ÒÓ Ó× ÒØ ÖÑ Ó×         Ñ ÒÓ× Ñ × ÓÖØÓ× Ó
           Ð Ñ ×ÑÓ ÔÖ Ò Ô Ó Ð Ï Ö× Ðк È Ö ÐÐÓ¸ Ð Ð ÓÖ ØÑÓ ÙØ Ð Þ ÙÒ Ñ ØÖ Þ ×Øi,j
            ר Ò × n × n ÙÝÓ× Ú ÐÓÖ × Ò Ð × Ó  Ò ÐÓ × Ù ÒØ
                                         ⎧
                                         ⎪
                                         ⎨ × Ü ×Ø Ö Ó ÒØÖ i Ý j
                                         ⎪Ci,j
                                 רi,j = ⎪∞
                                   0
                                            × ÒÓ Ü ×Ø Ö Ó ÒØÖ i Ý j ;                    ´ºµ
                                         ⎪
                                         ⎩0 × i=j
          Ci,j × Ð Ô ×Ó Ð Ö Ó ÒØÖ Ð ÒÓ Ó i Ý jº
                 Ó ÙÒ Ö Ó¸ ÐÓ× Ú ÐÓÖ × Ò Ð × × ÓÐÓ Ò Ñ ÒØ Ð × Ù ÒØ Ð ×
¾¾        ÁÒ Ð Þ ÓÒ Ñ ØÖ × ¾¾ ≡
               template <class AM, class Distance, class SA>
           struct Initialize_Dist_Floyd
           {
             typedef typename AM::List_Graph_Type::Arc_Type Arc_Type;
             typedef typename AM::List_Graph_Type GT;
             typedef typename GT::Node Node;
             typedef typename GT::Arc Arc;
7.9. Caminos m´
                   ınimos                                                                      723



         typedef typename Distance::Distance_Type Distance_Type;
             // inicializa cada entrada de la matriz
         void operator () (AM & mat,
                           Node * src, Node * tgt,
                           const long & i, const long & j,
                           Distance_Type & entry,
                           void *          p) const
         {
           Ady_Mat <typename AM::List_Graph_Type, long, SA> & path =
             * reinterpret_cast <Ady_Mat <typename AM::List_Graph_Type, long> *> (p);
           if (i == j) // ¿es diagonal de la matriz?
             {    // s´ ==> la distancia es cero
                      ı
               entry = Distance::Zero_Distance;
               path(i, j) = j;
               return;
             }
           GT & g    = mat.get_list_graph();
           Arc * arc = search_arc(g, src, tgt); // arco en representaci´n con listas
                                                                       o
           if (arc == NULL) // ¿existe un arco?
             {    // s´ ==> se coloca coste infinito
                      ı
               entry = Distance::Max_Distance;
               return;
             }
               // existe arco ==> extraiga distancia
           entry      = Distance () (arc); // la coloca en cost(i, j)
           path(i, j) = j;                 // coloca camino directo
         }
       };
       ¬Ò ×
       Initialize Dist Floyd¸   Ù×    Ò ÙÒ   ¾¿ º
     Í× × Ady Mat    º
       ר ÓÔ Ö ÓÖ × ÒÚÓ              Ó Ò Ð × Ð Ò Ð Þ ÓÒ Ð Ð ÓÖ ØÑÓ                   ÐÓÝ ¹Ï Ö× ÐÐ
¾¿   ÁÒ Ð Þ Ö Ð ÓÖ ØÑÓ               ÐÓÝ ¹Ï Ö× ÐÐ ¾¿ ≡       ´ ¾½ µ             ¾¿
       typedef typename Distance::Distance_Type Dist_Type;
       typedef Ady_Mat <GT, Dist_Type> Dist_Mat;
       dist.template operate_all_arcs_matrix
         <Initialize_Dist_Floyd <Dist_Mat, Distance, SA> > (&path);
     Í× × Ady Mat    ¸ Initialize Dist Floyd ¾¾ ¸ Ò   operate all arcs matrix    º
        ÄÓ ÕÙ        Ð × Ñ ØÖ × Ò ÐÓ× ×Ø Ó× Ò Ð × × ÙÒ ´ º µº
         Ð Ö ×ØÓ Ð ×        Ò Ð Þ ÓÒ × ¬ Ö Ð ÙÒ × ÓÒר ÒØ × Ñ Ò Ö                           ÐØ Ö Ð
     ØÖ Ó ÓÔØ Ñ Þ ÓÒ Ð ÓÑÔ Ð ÓÖ
¾¿    ÁÒ Ð Þ Ö Ð ÓÖ ØÑÓ      ÐÓÝ ¹Ï Ö× ÐÐ ¾¿ +≡           ´ ¾½ µ ¾¿
       const Dist_Type & max = Distance::Max_Distance;
       const long & n        = g.get_num_nodes();


     El algoritmo de Floyd-Warshall
          ÓÑÓ Ý ÐÓ × Ò Ð ÑÓ׸ Ð Ð ÓÖ ØÑÓ     ÐÓÝ ¹Ï Ö× ÐÐ ÙØ Ð Þ ØÖ × Ð ÞÓ× Ò Ó× ÕÙ
      ÜÔÐÓÖ Ò Ñ ÒÓ× ÔÓ× Ð × Ý        Ò Ð Ñ Ò ÑÓº Ò ÙÒ Ø Ö ÓÒ k¸            ÒØÖ   רk
                                                                                   i,j
      ÓÒØ Ò Ð Óר Ñ Ò ÑÓ Ô Ö Ö Ð ÒÓ Ó i               Ð ÒÓ Ó j ÓÒ ÙÒ Ö Ó ÐÓÒ ØÙ
724                                                              Cap´
                                                                        ıtulo 7. Grafos



    kº
     È ØÓÖ Ñ ÒØ ¸ Ò Ð k¹ × Ñ Ø Ö ÓÒ¸ Ð Ù ×Ø ÓÒ × ÔÙ               ÔÐ ÒØ Ö     Ð × Ù ÒØ
    ÑÒÖ
                                               k


                                       רk−1
                                         i,k           רk−1
                                                         k,j



                                         i            j
                                           רk−1
                                             i,j

    Ì Ò ÑÓ× ÙÒ Óר רk−1 ÔÖ Ú Ñ ÒØ Ð ÙÐ Ó Ô Ö Ö × Ð ÒÓ Ó i ר Ð jº ÓÖ Ð
                        i,j
     Ù ×Ø ÓÒ ÓÒ× ×Ø Ò Ù× Ö × Ò Ó× Ñ ÒÓ× Ô Ö Ð × ( i, k) Ý ( k, j)¸ ÓÒ ×Ø Ò × Ô Ö Ð ×
      רk−1 Ý ×Øk−1¸ Ö ×Ô Ø Ú Ñ ÒØ ¸ Ý Ú ÐÙ Ö × ×Øk−1 + רk−1 × Ñ ÒÓ× ÓרÓ×Ó ÕÙ
        i,k      k,j                                  i,k     k,j
      רi,j º ÓÖÑ ÐÑ ÒØ ¸ Ð
        k−1
                              × ÓÒ × ÔÐ ÒØ       Ð × Ù ÒØ ÑÓ Ó

                                  רk = Ñ Ò   רk−1
                                                i,j
                                                                                    ´ºµ
                                    i,j
                                              רk−1 + רk−1
                                                i,k     k,j

    Ä Ù Ð × ÑÓ Ð Þ          Ñ Ò Ö × Ñ Ð Ö Ð Ð ÓÖ ØÑÓ Ï Ö× ÐÐ
¾    Ä ÞÓ Ð Ð ÓÖ ØÑÓ        ÐÓÝ ¹Ï Ö× ÐÐ ¾ ≡
         for (int k = 0; k < n; ++k)
           for (int i = 0; i < n; ++i)
             for (int j = 0; j < n; ++j)
               if (dist(i, k) + dist(k, j) < dist(i, j))
                 dist(i, j) = dist(i, k);
    Ä      Ö Ò × Ò Ð ÓÒ Ð Ð ÓÖ ØÑÓ Ï Ö× ÐÐ × ÕÙ Ð if           × Ü ×Ø ÙÒ Ñ ÒÓ
       Ñ ÒÓÖ Óר ÕÙ Ô × ÔÓÖ ÙÒ Ñ ÒÓ ÓÒ ÒÓ Ó ÒØ ÖÑ Ó kº
        À Ý ÙÒ ÓÔØ Ñ ÓÒ Ð Ð ÓÖ ØÑÓ      ÐÓÝ ¹Ï Ö× ÐÐ ÓÒ× ×Ø ÒØ Ò Ó × ÖÚ Ö ÕÙ ¸ ×
    Ð ÒØÖ      רk−1 = ∞¸ ÒØÓÒ ×¸ ÓÒ ÖØ ØÙ ¸ ÒÓ Ö ÙÒ Ñ ÒÓ Ñ × ÓÖØÓ ÕÙ Ô ×
                 i,j
    ÔÓÖ Ð ÒÓ Ó ÒØ ÖÑ Ó kº Ò ÙÒ ÓÒ ×Ø Ó × ÖÚ ÓÒ¸ ÔÓ ÑÓ× ÔÐ ÒØ Ö ÙÒ Ú Ö ÒØ
    ÕÙ ÓÖÖ Ð × Ø Ö ÓÒ × Ð Ð ÞÓ Ñ × ÒØ ÖÒÓ
¾     Ð ÓÖ ØÑÓ     ÐÓÝ ¾ ≡                                    ´ ¾½ µ
         for (int k = 0; k < n; ++k)
           for (int i = 0; i < n; ++i)
             if (dist(i, k) < max) // ¿es posible encontrar una distancia menor?
               for (int j = 0; j < n; ++j)
                 {    // calcule nueva distancia pasando por k
                   Dist_Type new_dist = Plus () (dist(i, k), dist(k, j));
                   if (Compare () (new_dist, dist(i,j))) // ¿d(i,j) < d(i,k) + d(k,j)?
                     {
                       dist(i, j) = new_dist;   // actualice menor distancia
                       path(i, j) = path(i, k); // actualice nodo intermedio
                     }
                 }
    Ê ÓÖ ÑÓ× ÕÙ Plus::operator()() ÑÔÐ Ñ ÒØ Ð ×ÙÑ ¸ Ñ ÒØÖ × ÕÙ Compare::operator()()
    Ð ÓÑÔ Ö ÓÒº
      Ä ØÙ Ð Þ ÓÒ Ð Ñ ØÖ Þ Ô Ø i,j × Ö ÜÔÐ       Ò Ü º º¾º ´Ô Ò ¾ µº
      È Ö Ð Ö Ó Ð ¬ ÙÖ º Ð Ð ÓÖ ØÑÓ Ð ÙÐ Ð × × Ù ÒØ × Ñ ØÖ × ÔÓÖ Ø Ö ÓÒ
7.9. Caminos m´
              ınimos                                                                                                     725


                                                                                           -2
                                     B                3                     D                                    H
                         2               1                -2                           3    4   2
                                 5                                  3        -1                         -1
                 A                                F                                         G                        3
                                                               2                       2            4
                         1                   -1
                                     C                                      E                                    I
                                                      4                                    -4



                         ÙÖ º            ÍÒ Ö Ó ÓÒ ×Ø Ò × Ò Ø Ú ×
                                                                        À         Á                                            À   Á
             0       2   ∞       ∞       ∞        5            ∞        ∞         ∞
             ∞       0   ∞           3   ∞        1            ∞        ∞         ∞
             1       ∞       0   ∞       4        ∞            ∞        ∞         ∞
 D0
             ∞       ∞   ∞           0   ∞        2            ∞        4         ∞        P0
                                                                                                                               À
             ∞       ∞   ∞       ∞       0        ∞            2        ∞         −2                                               Á
             ∞       ∞   −1      −2      2         0           ∞        ∞         ∞
             ∞       ∞   ∞       3       ∞        −1           0        2         ∞                                            À
         À   ∞       ∞   ∞       −2      ∞        ∞            −1       0         ∞                          À                 À
         Á   ∞       ∞   ∞       ∞       ∞        ∞            4        3         0                          Á                 À   Á



                                                                        À         Á                                            À   Á
             0       2   ∞       ∞       ∞        5            ∞        ∞         ∞
             ∞       0   ∞           3   ∞        1            ∞        ∞         ∞
             1       3       0   ∞       4        6            ∞        ∞         ∞
 D1
             ∞       ∞   ∞           0   ∞        2            ∞        4         ∞        P1
                                                                                                                               À
             ∞       ∞   ∞       ∞       0        ∞            2        ∞         −2                                               Á
             ∞       ∞   −1      −2      2         0           ∞        ∞         ∞
             ∞       ∞   ∞       3       ∞        −1           0        2         ∞                                            À
         À   ∞       ∞   ∞       −2      ∞        ∞            −1       0         ∞                          À                 À
         Á   ∞       ∞   ∞       ∞       ∞        ∞            4        3         0                          Á                 À   Á



                                                                        À         Á                                            À   Á
             0       2   ∞           5   ∞        3            ∞        ∞         ∞
             ∞       0   ∞           3   ∞        1            ∞        ∞         ∞
             1       3       0       6   4        4            ∞        ∞         ∞
 D2
             ∞       ∞   ∞           0   ∞        2            ∞        4         ∞        P2
                                                                                                                               À
             ∞       ∞   ∞       ∞       0        ∞            2        ∞         −2                                               Á
             ∞       ∞   −1      −2      2         0           ∞        ∞         ∞
             ∞       ∞   ∞       3       ∞        −1           0        2         ∞                                            À
         À   ∞       ∞   ∞       −2      ∞        ∞            −1       0         ∞                          À                 À
         Á   ∞       ∞   ∞       ∞       ∞        ∞            4        3         0                          Á                 À   Á



                                                                        À         Á                                            À   Á
             0       2   ∞           5   ∞        3            ∞        ∞         ∞
             ∞       0   ∞           3   ∞        1            ∞        ∞         ∞
             1       3       0       6   4        4            ∞        ∞         ∞
 D3
             ∞       ∞   ∞           0   ∞        2            ∞        4         ∞        P3
                                                                                                                               À
             ∞       ∞   ∞       ∞       0        ∞            2        ∞         −2                                               Á
             0       2   −1      −2      2         0           ∞        ∞         ∞
             ∞       ∞   ∞       3       ∞        −1           0        2         ∞                                            À
         À   ∞       ∞   ∞       −2      ∞        ∞            −1       0         ∞                          À                 À
         Á   ∞       ∞   ∞       ∞       ∞        ∞            4        3         0                          Á                 À   Á



                                                                        À         Á                                            À   Á
             0       2   ∞           5   ∞        3            ∞        9         ∞
             ∞       0   ∞           3   ∞        1            ∞        7         ∞
             1       3       0       6   4        4            ∞        10        ∞
 D4
             ∞       ∞   ∞           0   ∞        2            ∞        4         ∞        P4
                                                                                                                               À
             ∞       ∞   ∞       ∞       0        ∞            2        ∞         −2                                               Á
             0       2   −1      −2      2         0           ∞        2         ∞
             ∞       ∞   ∞       3       ∞        −1           0        2         ∞                                            À
         À   ∞       ∞   ∞       −2      ∞         0           −1       0         ∞                          À                 À
         Á   ∞       ∞   ∞       ∞       ∞        ∞            4        3         0                          Á                 À   Á
726                                                                          Cap´
                                                                                ıtulo 7. Grafos


                                                          À       Á                                              À           Á
               0    2   ∞    5    ∞        3    ∞     9           ∞
               ∞    0   ∞    3    ∞        1    ∞     7           ∞
               1    3   0    6    4        4     6    10          2
  D5
               ∞    ∞   ∞    0    ∞        2    ∞     4           ∞     P5
                                                                                                                 À
               ∞    ∞   ∞    ∞    0        ∞    2     ∞           −2                                                         Á
               0    2   −1   −2   2        0     4        2       0
               ∞    ∞   ∞    3    ∞       −1     0        2       ∞                                              À
           À   ∞    ∞   ∞    −2   ∞        0    −1        0       ∞              À                               À
           Á   ∞    ∞   ∞    ∞    ∞        ∞    4         3       0              Á                               À           Á



                                                          À        Á                                                 À       Á
               0    2    2    1       5    3      7       5       3
               1    0    0   −1       3    1      5       3       1
               1    3    0    2       4    4      6       6       2
  D6
               2    4    1    0       4    2      6       4       2
                                                                        P6
                                                                                                                     À
               ∞    ∞   ∞    ∞        0    ∞     2        ∞       −2                                                         Á
               0    2   −1   −2       2    0      4       2       0
               −1   1   −2   −3       1    −1     0       1       −1
           À   0    2   −1   −2       2    0     −1       0       0              À                                   À
           Á   ∞    ∞   ∞    ∞    ∞        ∞     4        3       0              Á                                   À       Á



                                                      À       Á                                                  À       Á
               0    2    2    1   5        3    7     5        3
               1    0    0   −1   3        1    5     3        1
               1    3    0    2   4        4    6     6        2
  D7
               2    4    1    0   4        2    6     4        2
                                                                       P7
                                                                                                                 À
               1    3    0   −1   0        1    2     3       −2                                                         Á
               0    2   −1   −2   2        0    4     2        0
               −1   1   −2   −3   1       −1    0     1       −1
           À   −2   0   −3   −4   0       −2    −1    0       −2             À                                   À
           Á   3    5    2    1   5        3    4     3        0             Á                                   À       Á



                                                      À       Á                                                  À       Á
               0    2    2    1   5        3    4     5        3
               1    0    0   −1   3        1    2     3        1
               1    3    0    2   4        4    5     6        2
  D8
               2    4    1    0   4        2    3     4        2
                                                                       P8
                                                                                                             À   À
               1    3    0   −1   0        1    2     3       −2                                                         Á
               0    2   −1   −2   2        0    1     2        0
               −1   1   −2   −3   1       −1    0     1       −1
           À   −2   0   −3   −4   0       −2    −1    0       −2             À                                   À
           Á   1    3    0   −1   3        1    2     3        0             Á       À   À   À   À   À   À   À   À       Á



                                                      À       Á                                                  À       Á
               0    2    2    1   5        3    4     5        3
               1    0    0   −1   3        1    2     3        1
               1    3    0    1   4        3    4     5        2
  D9
               2    4    1    0   4        2    3     4        2
                                                                       P9
                                                                                                             À   À
               −1   1   −2   −3   0       −1    0     1       −2                     Á   Á   Á   Á       Á   Á   Á       Á
               0    2   −1   −2   2        0    1     2        0
               −1   1   −2   −3   1       −1    0     1       −1
           À   −2   0   −3   −4   0       −2    −1    0       −2             À                                   À
           Á   1    3    0   −1   3        1    2     3        0             Á       À   À   À   À   À   À   À   À       Á



7.9.2.3   An´lisis del algoritmo de Floyd-Warshall
            a

È Ö ×ØÙ Ö      Ð × ÑÔ ÒÓ Ð ÐÓÕÙ ÁÒ Ð Þ Ö Ð ÓÖ ØÑÓ             ÐÓÝ ¹Ï Ö× ÐÐ ¾¿ ¸
    ÑÓ× ÓÒ×     Ö Ö Ð ×ØÖÙ ØÙÖ     Ð ÖÙØ Ò operate all arcs list graph() × Ö Ø
 Ò Ü º º¿ ´Ô    Ò     µ Ý Ú Ö ¬ Ö ÕÙ ×Ø       ÙØ O(V 2) Ø Ö ÓÒ ×¸ ÔÙ × Ò Ö Ð ¹
    × Ö ÓÖÖ    ØÓ Ð Ñ ØÖ Þº ÈÓÖ         Ø Ö ÓÒ¸ × ÒÚÓ Ð ÓÔ Ö ÓÖ () Ð Ð ×
Initialize Dist Floyd¸ Ð Ù Ð        ÙØ ÙÒ Ù×ÕÙ Ð Ò Ð search arc() Ý ÕÙ ×
O(V) ¾¼ º Ä Ò    Ð Þ ÓÒ ÓÒ×ÙÑ ¸ ÒØÓÒ ×¸ O(V 2) × O(E) = O(V 2 E)º
     Ð Ö Ñ ÒØ ¸ Ð ÐÓÕÙ Ð ÓÖ ØÑÓ          ÐÓÝ ¾ × O(V 3)º
     Ð Ð ÓÖ ØÑÓ ÔÖ × ÒØ Ó ×¸ ÒØÓÒ ×¸ O(V 2 E)¸ Ö ×ÙÐØ Ó ÕÙ ¬ Ö Ð ØÖ ÓÒ Ð
O(V 3) ×Ó     Ó Ð Ð ÓÖ ØÑÓ     ÐÓÝ ¹Ï Ö× Ðк Ä Ö ÞÓÒ × × ÑÔÐ ¸ Ð Ò Ð × × ØÖ ÓÒ Ð
 ×ÙÑ ÕÙ Ð Ö Ó Ý ×Ø ÓÐÓ Ó Ò ÙÒ Ñ ØÖ Þ                Ý Ò º
 ¾¼
   Ê ÓÖ ÑÓ× ÕÙ Ð ÑÔÐ ÒØ ÓÒ search arc() ÔÖ × ÒØ     Ò Ü º¿º½¼º¾ ´Ô Ò        µ Ù× ÒØÖ ÐÓ×
Ö Ó× Ð ÒÓ Ó ÙÝÓ Ö Ó × Ñ ÒÓÖ Ý ÒÓ ÒØÖ ØÓ Ó× ÐÓ× Ö Ó× Ð Ö Óº       ÕÙ ¸ Ô٠׸ ÕÙ Ð Ù×ÕÙ
  ÙÒ Ö Ó Ó ×Ù× Ó× ÒÓ Ó× ×Ø ÓØ ¸ Ô Ö Ð Ô ÓÖ ×Ó¸ ÔÓÖ O(V )º
7.9. Caminos m´
                  ınimos                                                                      727



    7.9.2.4    Correctitud del algoritmo de Floyd-Warshall

    Ä ÓÖÖ Ø ØÙ Ð Ð ÓÖ ØÑÓ           ÐÓÝ ¹Ï Ö× ÐÐ      × ÖÒÓ× Ñ Ö Ò × ÑÓ× ÔÖ ¹
       Ò Ó ÕÙ Ð Ð ÓÖ ØÑÓ Ï Ö× ÐÐ ÜÔÐÓÖ ØÓ Ó× ÐÓ× Ñ ÒÓ× ÔÓ× Ð × ÒØÖ Ô Ö ×
        ÒÓ Ó׺ ×ØÓ ÔÙ         ÔØ Ö× ÓÑÓ ÓÖÖ ØÓ × ×ÙÑ ÑÓ× ÕÙ Ð Ð ÓÖ ØÑÓ
    Ï Ö× ÐÐ Ð ÙÐ Ð Ð Ù×ÙÖ ØÖ Ò× Ø Ú            Ð Ö Ð ÓÒ Ò Ö ÓÒ ÓÖÑ            ÔÓÖ Ð
     Ö Ó ´Ú Ö Ü º º ´Ô Ò ½µµ   ¾½ º

          Ð Ð ÓÖ ØÑÓ  ÐÓÝ ¹Ï Ö× ÐÐ Ø Ñ Ò ÜÔÐÓÖ ØÓ Ó× ÐÓ× Ô Ö ×       Ñ ÒÓ׸ ÐÓ Ù Ð ×
     ÓÖÖÓ ÓÖ ÔÖ Ò Ó Ð × Ñ Ð ØÙ ÒØÖ Ð × Ù ÓÒ × ´ º¿µ Ý ´ º µº          Ø Ö ÓÒ ÒØ ÖÒ
       Ð Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ Ü Ñ Ò Ý ÓÑÔ Ö ÙÒ ÒÙ ÚÓ Óר ÒØÖ ÙÒ Ô Ö ÒÓ Ó׺
    ÈÓÖ       Ô Ö ÒÓ Ó׸ Ð Ð ÓÖ ØÑÓ      ÐÓÝ ¹Ï Ö× ÐÐ ÜÔÐÓÖ ØÓ Ó× ÐÓ× Ñ ÒÓ× ÔÓ× Ð ×
    Ý × Ð ÓÒ Ð Ñ ÒÓÖ ÐÐÓ׺ ÈÓÖ Ø ÒØÓ¸ Ð Ð ÓÖ ØÑÓ          ÐÓÝ ¹Ï Ö× ÐÐ × Ù Ö ØÓ Ó×
    ÐÓ× Ñ ÒÓ× Ñ Ò ÑÓ× ÒØÖ Ô Ö × ÒÓ Ó׺
    7.9.2.5    Recuperaci´n de caminos
                         o

    Ä Ñ ØÖ Þ ×Øi,j Ð ÙÐ ÔÓÖ Ð Ð ÓÖ ØÑÓ        ÐÓÝ ¹Ï Ö× ÐÐ ÓÒØ Ò ÐÓ× Óר × Ñ Ò ÑÓ×
     ÒØÖ      Ô Ö ÒÓ Ó× i Ý jº Ð ¬Ò Ð Ñ ØÖ Þ Ô Ø i,j × Ù Ö Ö Ð ÒÓ Ó k ÕÙ Ô ÖÑ Ø
     Ð Ð ÓÖ ØÑÓ     ÐÓÝ ¹Ï Ö× ÐÐ Ò ÓÒØÖ Ö Ð Ñ Ò ÑÓ Ú ÐÓÖ   רi,jº
         Ð ÔÖÓ Ñ ÒØÓ find min path()¸ ÕÙ Ö ÙÔ Ö Ý ÓÐÓ Ò path Ð Ñ ÒÓ Ñ ×
     ÓÖØÓ¸ ÒØÖ ÐÓ× ÒÓ Ó× ÙÝÓ× Ò × ÓÖ Ò Ý ×Ø ÒÓ Ò Ð Ñ ØÖ Þ             Ý Ò p ×ÓÒ
    src index Ý tgt index¸ × ÒרÖÙÑ ÒØ    Ð × Ù ÒØ ÑÓ Ó
¾    Ê ÙÔ Ö ÓÒ        Ñ ÒÓ× ¾¾ +≡                                  ¾¾
          template <class Mat>
      void find_min_path(Mat & p, const long & src_idx, const long & tgt_idx,
                         Path<typename Mat::List_Graph_Type> & path)
      {
        typedef typename Mat::List_Graph_Type GT;
        GT & g                  = p.get_list_graph();
        typename GT::Node * src = p(src_idx);
        path.set_graph(g, src);
        for (int i = src_idx, j; j != tgt_idx; i = j)
          {
            j = p(i, tgt_idx);
            path.append(p(j));
          }
      }
      ¬Ò ×
      find min path¸   Ù×   Ò ÙÒ   ¾¾º
    Í× × Path ¼¾ º
       ÈÙ ×ØÓ ÕÙ ÔÙ        Ö ÓØÖÓ× Ð ÓÖ ØÑÓ× ÕÙ Ñ ÒØ Ò Ò Ñ ØÖ ×                 Ñ ÒÓ× × Ñ Ð Ö ×¸
     ר Ð ÓÖ ØÑÓ ÐÓ Ò ÐÙ ÑÓ× Ò Ð Ö ÚÓ mat path.Hº
     ¾½
          Ò Ð ×Ù ¹×    ÓÒ Ü º º ´Ô Ò     ½µ ÒÓ ×   ÑÓרÖÓ ÕÙ Ð Ð ÓÖ ØÑÓ   Ï Ö× ÐÐ × ÓÖÖ ØÓº
728                                                                Cap´
                                                                          ıtulo 7. Grafos



    7.9.3     Algoritmo de Bellman-Ford
      Ð Ð ÓÖ ØÑÓ         ÐÐÑ Ò¹ ÓÖ ¸ ½ ¸ ÐÐ Ñ Ó × Ò ÓÒÓÖ ×Ù× ÔÖ Ñ ÖÓ×           × Ù Ö ÓÖ ×
     ÓÒÓ Ó×    ¾¾ ¸ Ò Ô Ò      ÒØ × ÒØÖ × ¸ Ò Ù ÒØÖ ØÓ Ó× ÐÓ× Ñ ÒÓ× Ñ Ò ÑÓ×    × ÙÒ ÒÓ Ó
         Óº Ð Ð ÓÖ ØÑÓ ÓÔ Ö ÓÒ ÐÓ× Ò Ø ÚÓ× Ý Ø Ò Ð Ö Ò ÓÒ                       Ô ÖÑ Ø Ö ×Ù
       Ø ÓÒº
          × ×ÑÐ Ö Ð         ×ØÖ Ò Ð × ÒØ Ó ÕÙ ÓÒרÖÙÝ ÙÒ Ö ÓÐ Ö                ÓÖ      ØÓ Ó×
    ÐÓ× Ñ ÒÓ× Ñ Ò ÑÓ× × ÙÒ ÒÓ Ó ÓÖ Ò¸ Ð Ù Ð ÕÙ Ö ÕÙ Ö ×Ó Ö                           ÒÓ Ó Ð
       ר Ò      ÙÑÙÐ         × Ð ÓÖ Òº
          Ð Ð ÓÖ ØÑÓ         ÐÐÑ Ò¹ ÓÖ Ö × Ò Ð Ö ÚÓ Bellman Ford.H¸ Ò          Ð Ù Ð × Ü¹
    ÔÓÖØ Ò Ð × × Ù ÒØ × ÔÖ Ñ Ø Ú ×
¾    ÊÙØ Ò ×       Ð ÓÖ ØÑÓ       ÐÐÑ Ò¹ ÓÖ ¾ ≡                          ¿
         template <class GT, class Distance, class Compare, class Plus, class SA>
     inline bool bellman_ford_min_spanning_tree(GT &                g,
                                                typename GT::Node * start_node,
                                                GT &                tree)
     {
          ÁÒ Ð Þ ÓÒ       Ð ÓÖ ØÑÓ      ÐÐÑ Ò¹ ÓÖ ¾
            Ð ÓÖ ØÑÓ Ò Ö Ó       ÐÐÑ Ò¹ ÓÖ ¿½
              Ø ÓÒ      ÐÓ× Ò Ø ÚÓ× ¿
            ÓÒרÖÙ ÓÒ Ö ÓÐ Ö ÓÖ          Ð ÓÖ ØÑÓ   ÐÐÑ Ò¹ ÓÖ ¿
     }
         template <class GT, class Distance, class Compare, class Plus, class SA>
     inline bool q_bellman_ford_min_spanning_tree(GT &                g,
                                                  typename GT::Node * start_node,
                                                  GT &                tree)
     {
          ÁÒ Ð Þ ÓÒ      Ð ÓÖ ØÑÓ    ÐÐÑ Ò¹ ÓÖ ¾
            Ð ÓÖ ØÑÓ   ÐÐÑ Ò¹ ÓÖ ¿¾
              Ø ÓÒ     ÐÓ× Ò Ø ÚÓ× ¿
            ÓÒרÖÙ ÓÒ Ö ÓÐ Ö ÓÖ       Ð ÓÖ ØÑÓ   ÐÐÑ Ò¹ ÓÖ ¿
     }
        bellman ford min spanning tree() Ð ÙÐ Ð Ö ÓÐ     Ö ÓÖ       Ñ ÒÓ× Ñ Ò ÑÓ×
      × Ð ÒÓ Ó ÓÖ Ò start node × ÙÒ Ð Ð ÓÖ ØÑÓ Ð × Óº Ð Ô Ö Ñ ØÖÓ Ø ÔÓ GT Ö ÔÖ ¹
    × ÒØ Ð Ö Ó¸ Distance Ð Ð × ÜØÖ ØÓÖ ÐÓ× Ô ×Ó× ÓÒØ Ò Ó× Ò ÐÓ× Ö Ó׸ Compare
    Ð ÓÑÔ Ö ÓÒ ÒØÖ Ô ×Ó׸ Plus Ð ×ÙÑ ÒØÖ Ô ×Ó× Ý SA Ð ¬ÐØÖÓ ×Ó Ö ÐÓ× Ö Ó׺ Ë Ü ×Ø
     Ð Ö ÓÐ Ö ÓÖ          Ñ ÒÓ× Ñ Ò ÑÓ¸ ÒØÓÒ × Ð ÖÙØ Ò Ö ØÓÖÒ true ÐÓ ÓÒØÖ Ö Ó¸
     Ü ×Ø ÙÒ ÐÓ Ò Ø ÚÓ Ý × Ö ØÓÖÒ falseº q bellman ford min spanning tree() × ÙÒ
    Ú Ö× ÓÒ Ñ ÓÖ ÕÙ Ù× ÒØ ÖÒ Ñ ÒØ ÙÒ ÓÐ ÒÓ Ó׸ ÐÓ ÕÙ ÓÒÐÐ Ú Ñ ÝÓÖ ÓÒ×ÙÑÓ
        ×Ô Ó Ô ÖÓ Ø Ò ×Ù ×Ø Ò ÐÑ ÒØ   Ð Ö Ö Ð Ð ÓÖ ØÑÓº
    7.9.3.1    Inicializaci´n del algoritmo de Bellman-Ford
                           o

    È Ö Ñ ÒØ Ò Ö Ð Ö ÓÐ Ö ÓÖ¸ Ð Ð ÓÖ ØÑÓ ÙØ Ð Þ Ó× ÖÖ ÐÓ× Ø ÑÔÓÖ Ð ×¸ ÙÒÓ
    ÒÓ Ó× ÔÖ   ×ÓÖ ×¸ Ô ÖØ ÐÓ× Ñ ÒÓ× Ñ Ò ÑÓ× Ý ÓØÖÓ Ö Ó× ØÓ Ó × ÙÒ ÐÓ ØÖ Ø Ó
     Ò Ü º º½½
¾    ÁÒ Ð Þ ÓÒ      Ð ÓÖ ØÑÓ  ÐÐÑ Ò¹ ÓÖ ¾ ≡         ´¾   ¼µ ¾
     ¾¾
         Ò Ö Ð ¸ Ô Ö ÕÙ     Ý ÓØÖÓ× ÙØÓÖ ×º Î Ò× Ð × ÒÓØ ×   Ð Ó Ö ¬ × Ò Ü º½ ´Ô Ò     µÔ Ö
     Ð Ö ØÓÖ × Ð Ö ×Ô ØÓº
7.9. Caminos m´
                  ınimos                                                           729



      DynArray<typename GT::Node*> pred;
      DynArray<typename GT::Arc*> arcs;
      ¬Ò ×
      arcs¸ Ù×   Ò        ÙÒ × ¿¾¸ ¸ ¸ ¾ ¸ ¿¼ ¸ ¿¿ ¸ ¿ ¸ ¿ ¸ ¿ ¸ Ò      ¼º
      pred¸ Ù×   Ò        ÙÒ × ¿¾¸ ¾ ¸ ¿¼ ¸ ¿¿ ¸ ¿ ¸ ¿ ¸ Ò ¼º
    Í× × DynArray    ¾º
       ÈÓÖ   ÒÓ Ó¸ × Ñ ÒØ Ò Ð × Ù ÒØ Ò ÓÖÑ ÓÒ
¾   ÁÒ ÓÖÑ ÓÒ ÔÓÖ ÒÓ Ó Ò ÐÐÑ Ò¹ ÓÖ ¾ ≡
          template <class GT, class Distance>
      struct Bellman_Ford_Node_Info
      {
        int                              idx;
        typename Distance::Distance_Type acum;
      };
      ¬Ò ×
      Bellman Ford Node Info¸    Ù×   Ò ÙÒ   ¾ º
    idx   × ÐÒ       ÒØÖÓ Ð ÖÖ ÐÓ preds¸ ÙØ Ð Þ Ó Ô Ö     Ö Ò O(1) Ð ÒÓ Ó ÔÖ   ×ÓÖ
     Ò Ð Ñ ÒÓ Ñ Ò ÑÓ Ô Ö Ðº acum × Ð ×Ø Ò Ô Ö Ð ÙÑÙÐ              × Ð ÒÓ Ó ÓÖ Ò
    start nodeº
         Ð ×Ó ÐÓ× ÑÔÓ× ×Ø רÖÙ ØÙÖ ×                Ð Ø Ñ ÒØ ÐÓ× Ñ ÖÓ× NI Ô Ö idx
    Ý ACU Ô Ö acum¸ Ö ×Ô Ø Ú Ñ ÒØ º
         Ð Ú ÐÓÖ Ò Ð ACU(start node) × ÖÓ¸ Ñ ÒØÖ × ÕÙ Ð Ð Ö ×ØÓ × Ò¬Ò ØÓº Ò
    Ø ÖÑ ÒÓ×      Ó Ó¸ Ð Ú ÐÓÖ Ò Ð ACU(start node) × Distance::Zero Distance
    Ý Distance::Max Distance Ô Ö Ð Ö ×ØÓº
       ÄÓ× ÒÓ Ó× Ý ÐÓ× ÖÖ ÐÓ× × Ò Ò Ñ ÒØ Ð × Ù ÒØ Ð ÞÓ
¾    ÁÒ Ð Þ ÓÒ        Ð ÓÖ ØÑÓ    ÐÐÑ Ò¹ ÓÖ ¾ +≡ ´ ¾ ¼µ ¾ ¿¼
      {
          typename GT::Node_Iterator it(g);
          for (int i = 0; it.has_current(); ++i, it.next())
            {
              pred[i] = NULL;
              arcs[i] = NULL;
              typename GT::Node * p = it.get_current_node();
              g.reset_bit(p, Aleph::Min); // colocar bit en cero
              Bellman_Ford_Node_Info <GT, Distance> * ptr =
                new Bellman_Ford_Node_Info <GT, Distance>;
              ptr->idx = i;
              ptr->acum = Distance::Max_Distance; // infinito
              NODE_BITS(p).set_bit(Min, false);
              NODE_BITS(p).set_bit(Breadth_First, false);
              NODE_COOKIE(p) = ptr;
          }
      }
    Í× × arcs ¾ ¸ Bellman Ford Node Info ¾ ¸ Node Iterator    ¸ Ò    pred    ¾ º
     Ð Ø Breadth First × ÙØ Ð Þ Ö Ô Ö ×Ø Ò Ù Ö ÒÓ Ó× ÕÙ × Ý Ò Ò× ÖØ Ó Ò ÙÒ
     ÓÐ º Í× ÑÓ× Breadth First ÔÓÖÕÙ Ð Ð ÓÖ ØÑÓ      ÐÐÑ Ò¹ ÓÖ Ö ÓÖÖ Ð Ö Ó Ò
     ÑÔÐ ØÙ ¸ ÐÓ ÕÙ ÑÓ×ØÖ Ö ÑÓ× Ò Ü º º¿º ´Ô Ò ¿½µº Ð Ø Min × Ö ÜÔÐ Ó Ò
    Ü º º¿º º
730                                                          Cap´
                                                                     ıtulo 7. Grafos



        Ð ÙÒ Ó ÒÓ Ó ÓÒ Ú ÐÓÖ ÙÑÙÐ Ó      ר Ò ÓÒÓ Ó Ð ÔÖ Ò Ô Ó × start node
¿¼   ÁÒ Ð Þ ÓÒ      Ð ÓÖ ØÑÓ   ÐÐÑ Ò¹ ÓÖ ¾ +≡     ´¾    ¼µ ¾
      ACU(start_node) = Distance::Zero_Distance;


     7.9.3.2   Manejo del ´rbol abarcador
                          a

          ÖÒ      Ð Ð ÓÖ ØÑÓ     ×ØÖ ¸ Ò Ð     ÐÐÑ Ò¹ ÓÖ Ð × Ö Ñ × Ð Ö ÓÐ Ö ÓÖ
     × ÑÓ ¬ Ò ÙÖ ÒØ Ð Ð ÙÐÓº ÈÓÖ × Ö ÞÓÒ¸ × ÓÒÚ Ò ÒØ Ð Ö ÔÖ × ÒØ ÓÒ Ö ÓÐ
      ÜÔÐ     Ò Ü º º½½º
        ÄÐ Ñ ÑÓ× pred Ð ÖÖ ÐÓ Ô Ö × Ô Ö Ö ÔÖ × ÒØ Ö Ð Ö Óк ËÙÔÓÒ ÑÓ× ÙÒ ÒÓ Ó p
      ÙÝÓ Ò     Ò pred × kº Ä ÒØÖ pred[i] Ò ÕÙ Ð ÒÓ Ó ÓÖÖ ×ÔÓÒ ÒØ Ð Ò
     k Ø Ò Ð Ú ÐÓÖ pred[k] ÓÑÓ ÒÓ Ó ÔÖ     ×ÓÖ Ò Ð Ö ÓÐ Ö ÓÖ         Ñ ÒÓ× Ñ Ò ÑÓ×
       × Ð ÒÓ Ó start nodeº ÈÓÖ ÑÔÐÓ¸ Ð Ö ÓÐ
                                             4

                                     6        3      0

                                     2        7

                                 5       1

     × Ö ÔÖ × ÒØ Ò Ð ÖÖ ÐÓ pred ÓÑÓ
                        ÁÒ    Ò pred ¼ ½ ¾ ¿
                        ÆÓ Ó ÔÙÒØ Ó 4 2 6 4 ¹ 2 4 3
      ר ¬ ÙÖ Ö ÔÖ × ÒØ ÐÓ× Ò × ÐÓ× ÒÓ Ó× Ò pred Ô ÖÓ Ö ÓÖ ÑÓ× ÕÙ Ò ÒÙ ×ØÖ
      ÑÔÐ Ñ ÒØ ÓÒ × Ù Ö Ò ÔÙÒØ ÖÓ× ÒÓ Ó׺
        Ë Ò Ð ØÖ Ò× ÙÖ×Ó Ð Ð ÙÐÓ × ÑÓ ¬ ÙÒ Ö Ñ Ð Ö Óи ÒØÓÒ × ×Ø ÓÒ
     ÑÓ ¬ Ö Ð Ô Ö Ð ÒÓ Ó Ò ÔÖ º
     7.9.3.3   El algoritmo gen´rico Bellman-Ford
                               e

       Ð ÔÖ Ò Ô Ó ÙÒ Ñ ÒØ Ð Ð Ð ÓÖ ØÑÓ       ÐÐÑ Ò¹ ÓÖ Ö × Ò ÐÓ ÕÙ × ÓÒÓ ÓÑÓ
     “relajaci´n de arco”º
              o               ÓÒ× Ö Ò Ó ÕÙ      ÒÓ Ó ÐÑ Ò Ð Ñ Ò Ñ ×Ø Ò          Ù¹
     ÑÙÐ         × ÓÖ Ò¸ Ð Ö Ð ÓÒ ÙÒ Ö Ó s → t ÓÒ× ×Ø Ò Ú Ö ¬ Ö × (s) + w(s →
     t) <      (t)º Ë Ð ÔÖ    Ó × ÖØÓ¸ ÒØÓÒ × × ØÙ Ð Þ     (t) =    (s) + w(s → t)
         ÐÓ ÓÒØÖ Ö Ó (t) Ô ÖÑ Ò ÒÚ Ö Ð º
           Ð ÔÖÓ ×Ó ÒØ Ö ÓÖ × Ó ¬    Ð × Ù ÒØ ÑÓ Ó
¿¼    Ê Ð Ö Ö Ó ¿¼ ≡                                             ´ ¿½µ
      const typename Distance::Distance_Type & acum_src = ACU(src);
      if (acum_src == Distance::Max_Distance)
        continue;
      const typename Distance::Distance_Type & dist = Distance () (arc);
      typename Distance::Distance_Type & acum_tgt   = ACU(tgt);
      const typename Distance::Distance_Type sum    = Plus () (acum_src, dist);
      if (Compare () (sum, acum_tgt)) // ¿sum < acum_tgt?
7.9. Caminos m´
                   ınimos                                                     731



         {
             const int & idx = IDX(tgt);
             pred[idx]       = src;
             arcs[idx]       = arc;
             acum_tgt        = sum;
         }
     Í× × arcs ¾        Ò   pred    ¾ º
      Ò Ø ÖÑ ÒÓ× Ð Ö Ó u→ v¸ ר ÜÔÖ × ÓÒ × ÕÙ Ú Ð ÒØ
                        w
                        −

        ¯ if           (v) >        (u) + w =⇒

                 – pred[v] = u
                 –      (v) =       (u) + w

     Ä Ö Ð ÓÒ ÓÒ× ×Ø Ò ØÖ Ø Ö           ×Ñ ÒÙ Ö Ð ÙÑÙÐ Ó Ð ÒÓ Ó tgt nodeº Ì Ð ×¹
     Ñ ÒÙ ÓÒ ×ÓÐÓ Ó ÙÖÖ × Ð ÔÖ         Ó (v) = (u) + w × ÖØÓ¸ Ò ÙÝÓ ×Ó¸ Ð
      ÖÖ ÐÓ pred × ØÙ Ð Þ Óº
           Ù Ó Ô ÖØ ÙÐ Ö       ÑÓ× ÔÖ ×Ø Ö ÓÒ Ð Ö ÔÖ × ÒØ ÓÒ ∞º Ë × × Ó Ð Ñ ÝÓÖ
     ÒÙÑ ÖÓ Ö ÔÖ × ÒØ Ð ¸ ÒØÓÒ × Ð ÓÔ Ö ÓÒ (u) + w ÔÙ           ÖÖ Ö ÙÒ × ÓÖ º
      ÐÐ ÔÙ × Ð if acum src == Distance::Max Distance) ÕÙ ÒÓ× ×ÙÔ ÖÚ × Ø Ð ÔÓ× Ð º
       ÙÒ × ¸ × ÔÓ× Ð ¸ ÙÒÕÙ ×Ô Ö ÑÓ× ÑÔÖÓ Ð ¸ Ø Ò Ö × ÓÖ × × ÐÓ× Ú ÐÓÖ × Ð ×
       ר Ò × ×ÓÒ ÑÙÝ Ö Ò ×¸ Ö ÒÓ× Ð Ñ Ü ÑÓº
           ÖÓ××Ó ÑÓ Ó¸ Ð Ð ÙÐÓ Ð Ö ÓÐ Ö ÓÖ ÓÒ× ×Ø Ò Ö Ú × Ö ØÓ Ó× ÐÓ× Ö Ó× Ý Ö Ð ¹
       ÖÐÓ׸ ÐÓ ÕÙ × Ö Ð Þ Ð × Ù ÒØ ÑÓ Ó
¿½      Ð ÓÖ ØÑÓ Ò Ö Ó       ÐÐÑ Ò¹ ÓÖ ¿½ ≡                     ´¾    ¼µ
       for (int i = 0, n = g.get_num_nodes() - 1; i < n; ++i)
             // recorrer los arcos para evaluar relajamiento
         for (Arc_Iterator<GT, SA> it(g); it.has_current(); it.next())
           {
             typename GT::Arc * arc = it.get_current_arc();
             typename GT::Node * src = g.get_src_node(arc);
             typename GT::Node * tgt = g.get_tgt_node(arc);
                 Ê Ð Ö Ö Ó ¿¼
             }
     Í× × Arc Iterator          º
         ר Ó Ó ÔÓ ÑÓ× ÒÓØ Ö × Ò ¬ ÙÐØ ÕÙ ×       ÙØ Ò O(V E) Ú ×º
        Ë      ÒÓ Ó ×Ó ×Ù ÔÖÓÔ Ó ÖÖ ÐÓ pred¸ ÒØÓÒ × Ð ×ÙÔ ÖÔÓ× ÓÒ ÐÓ× ÖÖ ÐÓ×
      ÓÒ ÓÖÑ Ð Ñ ØÖ Þ   Ñ ÒÓ× path Ü Ø Ñ ÒØ Ò Ð Ñ ×ÑÓ ×Ø ÐÓ ÕÙ Ò Ð Ð ÓÖ ØÑÓ
         ÐÓÝ ¹Ï Ö× Ðк
     7.9.3.4         Algoritmo mejorado de Bellman-Ford

      Ð ÐÓÕÙ Ð ÓÖ ØÑÓ Ò Ö Ó           ÐÐÑ Ò¹ ÓÖ ¿½ × × ÑÔРݸ Ú Ö ÑÓ× ×Ô٠׸
      ÓÖÖ ØÓ Ý ÐÑ ÒØ       ÔØ Ð Ñ ØÖ ×       Ý Ò º ÈÓ ÑÓ× Ñ ÓÖ ÖÐÓ × Ó × ÖÚ ¹
     ÑÓ× ÕÙ Ù Ò Ó Ò ÙÒ Ø Ö ÓÒ ÒÓ × ÑÓ ¬ÕÙ Ò ÐÓ× ÙÑÙÐ Ó× ÙÒ Ô Ö ÒÓ Ó×
      ÓÒ Ø Ó× ÔÓÖ ÙÒ Ö Ó¸ ÒØÓÒ ×¸ Ò Ð × Ù ÒØ Ø Ö ÓÒ Ð Ö Ó Ø ÑÔÓ Ó × Ö Ð Ö º
     ÌÑ Ò        ÑÓ× ÒÓØ Ö¸ ÓÑÓ Ò ØÓ × ÔÙ Ó × ÖÚ Ö Ò Ð ¬ ÙÖ º ¸ ÕÙ Ò Ð ×
     ÔÖ Ñ Ö × Ø Ö ÓÒ × ÔÙ Ò     Ö ÒÓ Ó× ÙÝÓ× ÙÑÙÐ Ó× Ô ÖÑ Ò Ò ÒÚ Ö ÒØ × Ø Ò¹
       Ò ÕÙ × ÔÓØ Ò        Ñ    ÕÙ Ð Ö Ó × Ñ × Ö Ò Ó Ñ × ×Ô Ö Óº
732                                                                                                                                        Cap´
                                                                                                                                                   ıtulo 7. Grafos


                       3                         2                                 3                         2                                  3                         2
           B                        D                         H        B                        D                         H        B                         D                         H
      ∞                1 ∞                       -2 ∞              2               1 ∞                       -2 ∞              2                1 2                       -2 ∞
                         1                                                           1                                                            1
               2                -1      1        3        2       -1       2                -1      1        3        2       -1       2                 -1      1        3        2       -1
                   2                                                           2                                                           2

                   5                                                           5                                                            5
           A                        F                         G        A                        F                         G        A                         F                         G
                                             1                                                           1                                                            1
      0                    ∞                         ∞             0                   5                         ∞             0                    3                         ∞
                   3                         2                                 3                         2                                 3                          2
               1                1       2                 4       -2       1                1       2                 4       -2       1                 1       2                 4       -2
                           -1                        -1                                -1                        -1                                 -1                        -1
                       4                                                           4                                                            4
                                            -2                                                          -2                                                           -2
           C                        E                         I        C                        E                         I        C                         E                         I
      ∞                1 ∞                           ∞             ∞               1 ∞                           ∞             2                1 5                           ∞
                            ´µ          ¼                                              ´ µ          ½                                                   ´µ       ¾
                       3                         2                                 3                         2                                  3                         2
           B                        D                         H        B                        D                         H        B                         D                         H
      2                1 2                       -2 4              2               1 2                       -2 4              2                1 2                       -2 4
                         1                                                           1                                                            1
               2                -1      1        3        2       -1       2                -1      1        3        2       -1       2                 -1      1        3        2       -1
                   2                                                           2                                                           2

                   5                                                           5                                                            5
           A                        F                         G        A                        F                         G        A                         F                         G
                                             1                                                           1                                                            1
      0                    3                         3             0                   3                         3             0                    3                         3
                   3                         2                                 3                         2                                 3                          2
               1                1       2                 4       -2       1                1       2                 4       -2       1                 1       2                 4       -2
                           -1                        -1                                -1                        -1                                 -1                        -1
                       4                                                           4                                                            4
                                            -2                                                          -2                                                           -2
           C                        E                         I        C                        E                         I        C                         E                         I
      2                1 5                           3             2               1 2                           1             2                1 2                           0
                           ´ µ          ¿                                                  ´µ                                                           ´µ
                       3                         2                                 3                         2                                  3                         2
           B                        D                         H        B                        D                         H        B                         D                         H
      2                1 2                       -2 4              2               1 2                       -2 4              2                1 2                       -2 4
                         1                                                           1                                                            1
               2                -1      1        3        2       -1       2                -1      1        3        2       -1       2                 -1      1        3        2       -1
                   2                                                           2                                                           2

                   5                                                           5                                                           5
           A                        F                         G        A                        F                         G        A                         F                         G
                                            1                                                           1                                                            1
      0                    3                         3             0                   3                         3             0                    3                         3
                   3                        2                                  3                        2                                  3                         2
               1                1       2                 4       -2       1                1       2                 4       -2       1                 1       2                 4       -2
                           -1                        -1                                -1                        -1                                 -1                        -1
                       4                                                           4                                                            4
                                            -2                                                          -2                                                           -2
           C                        E                         I        C                        E                         I        C                         E                         I
      2                1 2                           0             2               1 2                           0             2                1 2                           0
                           ´µ                                                          ´ µ                                                          ´µ

       ÙÖ º ÈÖÓ Ö ×Ó Ð Ð ÓÖ ØÑÓ    ÐÐÑ Ò¹ ÓÖ ÓÒ Ö Þ Ò Ð ÒÓ Ó º Ç × ÖÚ ¹
     ÑÓ× ÕÙ Ð Ö ÓÐ Ö ÓÖ ¬Ò Ø ÚÓ Ô ÖÑ Ò ÒÚ Ö ÒØ Ô ÖØ Ö Ð Ð ÕÙ ÒØ ع
      Ö ÓÒ ´i = 5µº

          ÈÓÖ Ø ÒØÓ¸ ÙÒ Ñ ÓÖ Ð Ð ÓÖ ØÑÓ ÓÒ× ×Ø Ò ÔÖÓ × Ö ×ÓÐÓ ÕÙ ÐÐÓ× Ö Ó× ÙÝÓ×
       ÙÑÙÐ Ó× ×Ù ÒÓ Ó ×Ø ÒÓ Ý Ò × Ó ÑÓ ¬ Ó× Ý¸ Ð Ú Þ¸ × ÙÖ Ö ÕÙ ÒÓ ×
     Ö Ô Ø Ð ÔÖÓ × Ñ ÒØÓ ÙÒ Ö Ó × Ò ÕÙ ÔÖ Ú Ñ ÒØ × Ý Ò ÔÖÓ × Ó Ð Ö ×ØÓ
     ÐÓ× Ö Ó׺ ר ÓÒ Ù Ø        ­Ù Ó ÔÓ ÑÓ× ÑÓ Ð Þ ÖÐ Ñ ÒØ Ð ×ØÖÙ ØÙÖ      ­Ù Ó
        ר Ò Ô Ö ÐÐÓ × Ö¸ ÙÒ ÓÐ ÕÙ ÐÑ Ò ÕÙ ÐÐÓ× ÒÓ Ó× ÙÝÓ ÙÑÙÐ Ó Ý
     × Ó ÑÓ ¬ Óº Ì Ð ÓÐ × Ð Ö ÓÑÓ × Ù
¿¾      Ð ÓÖ ØÑÓ      ÐÐÑ Ò¹ ÓÖ ¿¾ ≡                     ´ ¾ µ ¿¿
          DynListQueue<typename GT::Node*> q;
               ÓÐÓ Ö ÒØ Ò Ð ¿¿
          put_in_queue <GT> (q, start_node);
     Í× × DynListQueue ½ ¼ º
     Ä ÓÐ ÓÒØ Ò Ð ÔÖ Ñ Ö ÒÓ Ó ÙÝÓ ÙÑÙÐ Ó                                                                         × Ó ÑÓ ¬                  Ó Ý × ÓÒÓ Ó Ð ÒÓ Ó
7.9. Caminos m´
                   ınimos                                                         733



     ÓÖ Òº Ê ÓÖ ÑÓ× ÕÙ Ð Ø Breadth First × Ò Ð ÞÓ Ù Ò Ó × Ô ÖØÓ Ð Ñ ÑÓÖ
     Ô Ö Ð ØÖ ÙØÓ Bellman Ford Node Info ´Ü º º¿º½ ´Ô Ò ¾ µµº
        Ä ÖÙØ Ò put in queue() Ò ÓÐ Ð ÒÓ Ó Ý Ð Ñ Ö Ð Ø Breadth First¸ Ð Ù Ð ×
     Ô ÖØ Ð × Ù ÒØ ØÖ Ó ÖÙØ Ò × Ò ØÓÖÒÓ Ð ÓÐ
¿¿    ÊÙØ Ò × ÓÐ Ð Ð ÓÖ ØÑÓ        ÐÐÑ Ò¹ ÓÖ ¿¿ ≡
           template <class GT> inline static
       void put_in_queue(DynListQueue<typename GT::Node*> & q, typename GT::Node * p)
       {
         q.put(p);
         NODE_BITS(p).set_bit(Breadth_First, true);
       }
           template <class GT> inline static
       typename GT::Node * get_from_queue(DynListQueue<typename GT::Node*> & q)
       {
         typename GT::Node * p = q.get();
         NODE_BITS(p).set_bit(Breadth_First, false);
         return p;
       }
           template <class GT> inline static
       bool is_in_queue(typename GT::Node * p)
       {
         return IS_NODE_VISITED(p, Breadth_First);
       }
     Í× × DynListQueue ½ ¼ º
       Ð ÔÖÓÔÓ× ØÓ Ñ Ò Ö Ð ÓÐ ÓÒ ×Ø × ÖÙØ Ò × × × ÙÖ Ö× ÒÓ Ø Ò Ö ÙÔÐ Ó× Ò
     Ð ÓÐ º
            Ð ÒÙÑ ÖÓ ØÓØ Ð      Ö Ô Ø ÓÒ × ÕÙ       ÙØ Ð ÐÓÕÙ   Ð ÓÖ ØÑÓ Ò Ö Ó
         ÐÐÑ Ò¹ ÓÖ ¿½ × Ü Ø Ñ ÒØ V −1×E Ú × ÓÖÖ ×ÔÓÒ ÒØ Ð × V −1 Ö Ð ÓÒ ×
     ×Ó Ö ÐÓ× E Ö Ó׺ ר ÒØ             × ÑÔÓÖØ ÒØ ÔÓÖÕÙ ÒÓ× ÓØ Ð Ñ Ü Ñ ÒØ
     Ú × ÕÙ          Ö     Ø Ö Ö Ð Ú Ö× ÓÒ ÓÒ ÓÐ ¸ × Ò Ô Ö ÙÒ Ö ÔÖ × ÒØ ÓÒ ÓÒ Ð ×Ø ×
             Ý Ò Ø Ð ÓÑÓ List Digraph<Node, Arc>º × ¸         ÑÓ× Ò ÓÒØÖ Ö ÙÒ Ñ Ò Ö
           × ÑÙÐ Ö Ð V − 1 Ø Ö ÓÒ ×º È Ö       ÖÐÓ¸ Ë Û ¿¿ ÔÖÓÔÓÒ Ù× Ö ÙÒ Ú ÐÓÖ Ò¹
     Ø Ò Ð Ò Ð ÓÐ ÕÙ ÒÓ× Ò ÕÙ Ù Ò Ó Ð Ð ÓÖ ØÑÓ Ò Ö Ó                   ÐÐÑ Ò¹ ÓÖ ¿½
          Ö       Ó ÙÒ Ö Ð ÓÒ ØÓ Ó× ÐÓ× Ö Ó×
¿¿      ÓÐÓ Ö ÒØ Ò Ð ¿¿ ≡                                            ´ ¿¾µ
       typename GT::Node __sentinel;
       typename GT::Node * sentinel = &__sentinel;
       put_in_queue <GT> (q, sentinel);
          ר ÑÓ Ó¸        Ú Þ ÕÙ × ÕÙ ÑÓ× Ð ÓÐ sentinel Ø Ò Ö ÑÓ× Ð × ÙÖ
          Ö Ö Ð Þ Ó Ð Ñ ×ÑÓ ØÖ Ó ÕÙ ÙÒ Ø Ö ÓÒ ÜØ ÖÒ Ð Ð ÓÖ ØÑÓ Ò Ö Ó
        ÐÐÑ Ò¹ ÓÖ ¿½ º
           × Ð × Ó× ×¸ Ð Ð ÓÖ ØÑÓ Ñ ÓÖ Ó Ö ×ÙÐØ ÒØ × ÓÒ ÓÖÑ ÓÑÓ × Ù
¿¿     Ð ÓÖ ØÑÓ       ÐÐÑ Ò¹ ÓÖ ¿¾ +≡                       ´ ¾ µ ¿¾
       for (int i = 0, n = g.get_num_nodes() - 1; not q.is_empty(); )
         {
           typename GT::Node * src = get_from_queue <GT> (q);
           if (src == sentinel) // ¿se saca el centinela?
             if (i++ == n)
734                                                               Cap´
                                                                     ıtulo 7. Grafos



              break;
            else
              put_in_queue <GT> (q, sentinel);
              // recorrer y relajar arcos del nodo src
          for (Node_Arc_Iterator<GT, SA> it(src); it.has_current(); it.next())
            {
              typename GT::Arc * arc = it.get_current_arc();
              const typename Distance::Distance_Type & acum_src = ACU(src);
              if (acum_src == Distance::Max_Distance)
                continue;
              typename GT::Node * tgt                        = it.get_tgt_node();
              const typename Distance::Distance_Type & w     = Distance()(arc);
              const typename Distance::Distance_Type sum_src = Plus()(acum_src, w);
              typename Distance::Distance_Type & acum_tgt    = ACU(tgt);
              if (Compare () (sum_src, acum_tgt)) // relajar arco
                {
                  const int & idx = IDX(tgt);
                  pred[idx]       = src;
                  arcs[idx]       = arc;
                  acum_tgt        = sum_src;
                  if (not is_in_queue <GT> (tgt))
                    put_in_queue <GT> (q, tgt);
                }
            }
      }
Í× × arcs ¾ ¸ Node Arc Iterator    ¸ Ò   pred   ¾ º
    ר Ó Ó × Ñ Ò ×Ø Ö ÓÑ ÒØ Ö
  ½º Ð Ø Breadth First¸ Ð Ù Ð × Ó ÙÐØ Ó Ò Ð × ÊÙØ Ò × ÓÐ Ð Ð ÓÖ ØÑÓ
         ÐÐÑ Ò¹ ÓÖ ¿¿ ¸ Ú Ø ÕÙ ÙÒ ÒÓ Ó ×Ø ÒÓ ´tgtµ¸ ÙÝÓ ÙÑÙÐ Ó Ý × Ó
     ÑÓ ¬ Ó Ò Ð Ø Ö ÓÒ ØÙ и × Ó Ð Ñ ÒØ ÒØÖÓ Ù Ó Ò Ð ÓÐ º
     ÈÓÖ Ð Ú      ÙÒ Ö Ó ÕÙ ÙÒ ÒÓ Ý × Ó ÔÖÓ × Ó¸ × ÔÓ× Ð ÑÓ ¬ Ö Ð ÙÑÙ¹
     Ð Ó ÙÒ ÒÓ Ó ÕÙ × Ò Ù ÒØÖ Ò Ð ÓÐ                Ò×      Ð i¹ × Ñ Ø Ö ÓÒ ØÙ Ð
     Ó Ð ÙÒ i − 1¹ × Ñ Ø Ö ÓÒ ÒØ Ö ÓÖº
  ¾º Ð ÓÖ Ò Ð ÓÐ Ö ÒØ Þ ÕÙ ¸ Ð Ñ ÒÓ× Ò Ð ÔÖ Ñ Ö Ø Ö ÓÒ ´i = 0µ¸ Ð Ö ÓÖÖ Ó
      × Ü Ø Ñ ÒØ ÙÒÓ ÑÔÐ ØÙ º ÈÓר Ö ÓÖÑ ÒØ ¸ Ò ÙÒ Ø Ö ÓÒ i¸ Ò ÙÒ ÓÒ
     ÐÓ× ÒÓ Ó× ÕÙ Ý Ò × Ó Ñ Ø Ó× Ò Ð ÓÐ ´×ÓÐÓ ÕÙ ÐÐÓ× ÙÝÓ ÙÑÙÐ Ó Ý × Ó
     ÑÓ ¬ Óµ¸ × ÔÖÓ × Ö Ò Ù Ð Ó Ñ ÒÓ× Ö Ó× ÕÙ Ò Ð Ø Ö ÓÒ 0º                  ÕÙ ×
          Ù ÔÓÖÕÙ ×Ø Ð ÓÖ ØÑÓ Ø Ò           × Ö Ñ × Ö Ô Ó ÕÙ Ð Ð ÓÖ ØÑÓ Ò Ö Ó
            ÐÐÑ Ò¹ ÓÖ ¿½ º
       Ð ÓÖ Ò Ð ÓÐ × ÙÖ ÕÙ × ÔÖÓ × Ò Ö Ó× ÓÒ Ø Ó× ÒÓ Ó× ÙÝÓ× Ù¹
     ÑÙÐ Ó× Ý Ò × Ó ÑÓ ¬ Ó׸ ÐÓ ÕÙ ÔÓ× Ð Ø ÙÒ Ö Ð ÓÒ ÕÙ ×Ñ ÒÙÝ Ð
        ÙÑÙÐ Óº ÈÓÖ Ð ÓÒØÖ Ö Ó¸ ÓÒ Ð Ð ÓÖ ØÑÓ Ò Ö Ó                 ÐÐÑ Ò¹ ÓÖ ¿½
          Ö Ò Ø Ö ÓÒ × ÕÙ ÓÒ ÖÒ Ò Ö Ó× ÙÝÓ× ÙÑÙÐ Ó× ÓÖ Ò Ý ×Ø ÒÓ ×ÓÒ
      Ò¬Ò ØÓ× Ý ÕÙ ¸ ÔÓÖ Ø ÒØÓ¸ ÒÓ × ÑÓ ¬ Ö Ò Ô × Ö ÕÙ Ð Ö Ó × Ö Ú × Óº ÈÓÖ
      ÕÙ Ø Ò ÑÓ× ÓØÖ            Ö    Ð ÔÓÖÕÙ Ð Ð ÓÖ ØÑÓ × Ó Ò Ð ÓÐ Ø Ò × Ö
     Ñ × ¬ ÒØ ÕÙ Ð Ò Ö Óº
7.9. Caminos m´
              ınimos                                                                                                                       735


                          3                          2                                  3                           2

              B                        D                           H        B                        D                            H
          ∞               1
                              ∞                      -2
                                                          ∞             2
                                                                                        1
                                                                                            ∞                       -2
                                                                                                                         ∞
                              1                                                             1
                  2                -1       1        3         2       -1       2                -1        1        3         2       -1
                      2                                                             2

                      5                                                             5
              A                        F                           G        A                        F                            G
                                                 1                                                              1
          0                   ∞                           ∞             0                   ∞                            ∞
                      3                         2                                   3                          2
                  1                1        2                  4       -2       1                1         2                  4       -2
                              -1                          -1                                -1                           -1
                          4                                                             4
                                                -2                                                             -2
              C                        E                           I        C                        E                            I
          ∞                   ∞                           ∞             ∞                   ∞                            ∞
                          1
                                       ´µ                                               1
                                                                                                     ´ µ
                          3                          2                                  3                           2

              B                        D                           H        B                        D                            H
          2                   2                           4            2                    2                            4
                          1                          -2                                 1                           -2
                              1                                                             1
                  2                -1       1        3         2       -1       2                -1        1        3         2       -1
                      2                                                             2

                      5                                                             5
              A                        F                           G        A                        F                            G
                                                1                                                              1
          0                   3                           3            0                    3                            3

                      3                         2                                   3                          2
                  1                1        2                  4       -2       1                1         2                  4       -2
                              -1                          -1                                -1                           -1
                          4                                                             4
                                                -2                                                             -2
              C                        E                           I        C                        E                            I
          2                   2                           1            2                    2                            0
                          1
                                   ´µ                                                   1
                                                                                                 ´ µ

   ÙÖ º ÈÖÓ Ö ×Ó Ð Ð ÓÖ ØÑÓ      ÐÐÑ Ò¹ ÓÖ Ñ ÓÖ Ó ÓÒ Ö Þ Ò Ð ÒÓ Ó º
     ¬ ÙÖ ÓÖÖ ×ÔÓÒ E Ö Ó× Ò×Ô ÓÒ Ó׸ ÐÓ ÕÙ ¸      Ù ÒØ Ð ÒØ
¬ ÙÖ × Ö ×Ô ØÓ Ð ¬ ÙÖ º ¸ Ó Ö ÙÒ        Ð Ð Ö ÓÒ Ð Ð ÓÖ ØÑÓ Ñ ÓÖ Óº

  ¿º ÍÒ Ö Ó a Ö Ð Ó ÙÝÓ ÒÓ Ó ×Ø ÒÓ × Ó Ñ Ø Ó Ò Ð ÓÐ ÒÓ ÚÓÐÚ Ö Ú × Ø Ö×
        ר ÕÙ ØÓ Ó× ÐÓ× Ö Ó× Ý ÒØ × ÐÓ× ÒÓ Ó× ÒØ Ö ÓÖ × Ð ÓÐ Ý Ò × Ó
     Ú × Ø Ó׺ Ä Ø Ö ÓÒ 0 Ú × Ø ¸ ÓÒ ÖØ Þ ¸ ØÓ Ó× ÐÓ× Ö Ó׸ ÔÙ × ÐÓ× ÙÑÙÐ Ó×
         ÐÓ× ÒÓ Ó× Ø Ò Ò Ú ÐÓÖ Ò¬Ò ØÓ¸ ÐÓ ÕÙ × ÙÖ ×Ù Ö Ð ÓÒº ÍÒ Ö Ó a Ö Ð Ó
      Ò Ð Ø Ö ÓÒ i        Ö ×Ô Ö Ö Ð Ø Ö ÓÒ i + 1 Ô Ö Ú ÒØÙ ÐÑ ÒØ ÚÓÐÚ Ö × Ö
     Ö Ð Óº
   º Ë Ð Ö Ó ÒÓ ÓÒØ Ò ÐÓ× Ò Ø ÚÓ׸ ÒØÓÒ × × × ÙÖÓ ÕÙ Ð ÓÐ × Ú Ö ¸ Ô٠׸
      Ù Ò Ó Ð Ð ÓÖ ØÑÓ ×Ø Ð ÐÓ× ÙÑÙÐ Ó× ×Ù× Ú ÐÓÖ × ¬Ò Ø ÚÓ׸ × Ö¸ ×Ù×
      Óר × Ñ Ò ÑÓ׸ ÒÓ Ö Ò Ñ × Ò× Ö ÓÒ × Ò Ð ÓÐ º
   º Ë ¸ ÔÓÖ Ð ÓÒØÖ Ö Ó¸ Ð Ö Ó ÓÒØ Ò Ð ÙÒ ÐÓ Ò Ø ÚÓ¸ ÒØÓÒ × ÐÓ× ÙÑÙÐ Ó×
         ÐÓ× ÒÓ Ó× Ô ÖØ Ð ÐÓ × ÑÔÖ × Ö Ò Ö Ð Ó׸ ÔÓÖ ÐÓ ÕÙ Ð Ð ÓÖ ØÑÓ ÒÓ ×
        Ø Ò Ö ÔÓÖ Ð ÓÐ Ú º Ò ×Ø ×Ó¸ Ð ÓÒØ ÓÖ i Ð ÒÞ Ö Ð Ú ÐÓÖ V − 1¸ ÐÓ
     ÕÙ Ø Ò Ö Ð Ð ÓÖ ØÑÓº
7.9.3.5   Detecci´n de ciclos negativos
                 o

 Ü ×Ø Ò ÔÖÓ Ð Ñ × ×Ó Ö Ö Ó× ÕÙ ÔÐ ÒØ Ò ØÖ Ò× ÓÖÑ Ö Ô ×Ó× Ö Ó× ×Ù ÖØ ÕÙ ×ØÓ×
  Ú Ò Ò Ò Ø ÚÓ× Ó Ð       ÓÒ Ö Ó× ¬ Ø Ó× ÓÒ Ô ×Ó× Ò Ø ÚÓ׺           Ó¸ ×
736                                                          Cap´
                                                                    ıtulo 7. Grafos



    Ð Ô Ö×Ô Ø Ú Ð ÑÓ Ð Þ ÓÒ¸ × ÔÓ× Ð Ñ Ò Ö Ö Ó× Ò Ø ÚÓ× ÓÒ× Ù ÒØ Ñ ÒØ ¸
     Ù Ò Ó Ñ ÒÓ× ÔÓÖ Ø ÓÒ ÖÖÓÖ¸ × ÔÐ Ù× Ð ÑÓ Ð Þ Ö ÙÒ Ö Ó ÕÙ ÓÒØ Ò            ÐÓ×
    Ò Ø ÚÓ׺
           ÓÑÓ × Ö × Ü ×Ø Ó ÒÓ ÙÒ ÐÓ È Ö Ø Ö ×Ø ÔÖ ÙÒØ ¸ × Ñ Ò ×Ø Ö Ø Ò Ö Ò
     Ù ÒØ ÕÙ Ð Ñ Ü Ñ ÐÓÒ ØÙ Ò Ö Ó× ÙÒ Ñ ÒÓ × ÐÓ ×ÙÑÓ V − 1º × ¸ Ð
       Ð for Ò Ð ÓÖ ØÑÓ Ò Ö Ó        ÐÐÑ Ò¹ ÓÖ ¿½ ׸ Ùר Ñ ÒØ ¸ Ö Ð Þ Ö V − 1 × E
    Ö Ð ÓÒ ×¸ Ð × Ù Ð ×¸ Ò ×Ø Ò       ÙÑÙÐ     Ù Ö Ò ÐÓ× Ñ ÒÓ× Ò Ö Ó× Ñ × Ð Ö Ó×
    ÔÓ× Ð ×º ÄÙ Ó Ð V −1¹ × Ñ Ø Ö ÓÒ¸        Ú ÐÓÖ (v) ÓÒØ Ò Ð Ñ Ò Ñ ×Ø Ò
       × Ð ÓÖ Ò¸ ÔÓÖ ÐÓ ÕÙ ÒÓ × ÔÓ× Ð Ö Ð Ö Ñ × Ö Ó׺
         Ä ÓÒ× Ö ÓÒ ÒØ Ö ÓÖ × ÓÖÖ Ø ×ÓÐÓ × ÒÓ Ý ÐÓ× Ò Ø ÚÓ׸ Ô٠׸ × ÐÓ× Ý¸
     ÒØÓÒ × × ÑÔÖ × Ö ÔÓ× Ð Ö Ð Þ Ö Ö Ð ÓÒ ×         ÓÒ Ð ×¸ Ò¬Ò Ø Ñ ÒØ Ñ ÒÙ Ó¸
    ÕÙ ×Ñ ÒÙÝ Ò Ð Ú ÐÓÖ (v)            ÒÓ Ó ÒÚÓÐÙ Ö Ó Ò Ð ÐÓº
          ÓÒ× Ù ÒØ Ñ ÒØ ¸ ÙÒ Ñ Ò Ö Ö Ø         Ø Ø Ö Ð ÙÒ ÐÓ Ò Ø ÚÓ ÓÒ× ×Ø Ò
    Ö Ð Þ Ö ÙÒ ÙÐØ Ñ Ø Ö ÓÒ Ò Ð Ù Ð¸ Ó ÙÖÖ Ö ÙÒ Ö Ð ÓÒ¸ ÑÔÐ Ð ÔÖ × Ò
    ÙÒ ÐÓ Ò Ø ÚÓº
             ר ÑÓ Ó¸ Ô Ö Ø Ø Ö × Ý ÙÒ ÐÓ Ò Ø ÚÓ ×Ø ÓÒ Ú Ö ¬ Ö × × ÔÓ× Ð
    Ö Ð Þ Ö Ð Ñ ÒÓ× ÙÒ Ö Ð ÓÒ Ñ ×
¿        Ø ÓÒ      ÐÓ× Ò Ø ÚÓ× ¿ ≡                            ´¾    ¼µ
      bool negative_cycle = false;
          // recorrer todos los arcos en b´squeda de un ciclo negativo
                                          u
      for (Arc_Iterator<GT, SA> it(g); it.has_current(); it.next())
        {
          typename GT::Arc * arc                            = it.get_current_arc();
          typename GT::Node * src                           = g.get_src_node(arc);
          const typename Distance::Distance_Type & acum_src = ACU(src);
          if (acum_src == Distance::Max_Distance)
            continue;
          typename GT::Node * tgt                       = g.get_tgt_node(arc);
          const typename Distance::Distance_Type & dist = Distance () (arc);
          typename Distance::Distance_Type & acum_tgt   = ACU(tgt);
          const typename Distance::Distance_Type sum    = Plus ()(acum_src, dist);
          if (Compare () (sum, acum_tgt)) // ¿se relaja arco?
            {     // s´ ==> ciclo negativo!
                      ı
              negative_cycle = true;
              const int & idx = IDX(tgt);
              pred[idx]       = src;
              arcs[idx]       = arc;
              acum_tgt        = sum;
            }
        }
    Í× × Arc Iterator   ¸ arcs ¾ ¸ Ò   pred   ¾ º
     Ð ÐÓÕÙ ÓÔ Ö ÓÖÖ Ø Ñ ÒØ Ô Ö ÐÓ× Ó× Ð ÓÖ ØÑÓ׺          ØÓ× ÕÙ ¸ ÓÑÓ Ú Ö ÑÓ×
    ÔÓר Ö ÓÖÑ ÒØ ¸ Ð ÐÓ ÕÙ     Ù Ö Ó Ò ÐÓ× ÖÖ ÐÓ× pred Ý arcs¸ × ÑÔÓÖØ ÒØ ÙÐÑ ¹
    Ò Ö ÒØ Ö Ñ ÒØ Ð forº Ë ×ÓÐÓ × ØÖ Ø × Ö × Ü ×Ø Ó ÒÓ ÙÒ ÐÓ Ò Ø ÚÓ¸ ÒØÓÒ ×
    ÔÓ ÑÓ× Ø Ò ÖÒÓ× Ô Ò × ÐÓ Ø Ø ÑÓ׺
7.9. Caminos m´
                  ınimos                                                         737



    7.9.3.6   Construcci´n del ´rbol abarcador
                        o      a

    Ë ÒÓ Ý ÐÓ× Ò Ø ÚÓ׸ ÒØÓÒ × ÓÒרÖÙ ÑÓ× Ð Ö ÓÐ Ö ÓÖ ÐÓ ÕÙ ÔÙ             Ö×
     Ò ÙÒ ×ÓÐ Ô × Ö ÓÖÖ Ò Ó Ð ÖÖ ÐÓ arcs Ò× ÖØ Ò Ó ÐÓ× ÒÓ Ó× Ý Ö Ó× Ð Ú Þ ÕÙ
    ÐÓ× Ñ Ô ÑÓ׺ ÙÖ ÒØ ר Ô ×         ÔÖÓÚ ÑÓ× Ô Ö Ð Ö Ö Ð Ñ ÑÓÖ Ó ÙÔ ÔÓÖ ÐÓ×
     ÓÓ ×º È Ö Ø ÖÑ Ò Ö × Ð ÓÓ ÐÑ Ò ÙÒ Ñ Ô Ó Ó ÙÒ ÔÙÒØ ÖÓ ÙÒ ×ØÖÙ ØÙÖ
    Bellman Ford Node Info ÒÓ× Ú Ð ÑÓ× Ð Ø Minº Ë ÙÒ ÒÓ Ó ×Ø Ñ Ö Ó ÓÒ Min¸
     ÒØÓÒ × ×Ù ÓÓ Ñ Ô Ð ÒÓ Ó Ð Ö ÓÐ Ö ÓÖ ÐÓ ÓÒØÖ Ö Ó¸ Ð ÒÓ Ó ÒÓ ×Ø Ò
     Ð Ö ÓÐ Ö ÓÖ Ý Ð ÓÓ ÓÒØ Ò ÙÒ ÔÙÒØ ÖÓ ÙÒ Ó ØÓ Bellman Ford Node Info
¿      ÓÒרÖÙ ÓÒ Ö ÓÐ Ö ÓÖ         Ð ÓÖ ØÑÓ  ÐÐÑ Ò¹ ÓÖ ¿ ≡ ´ ¾ µ
      if (negative_cycle) // ¿hay ciclos negativos?
        // liberar memoria de los cookies de los nodos y terminar
      for (int i = 0; i < g.get_num_nodes(); ++i) // Construir arbol abarcador
                                                               ´
        {
          typename GT::Arc * garc = arcs[i];
          if (garc == NULL)
            continue;
          typename GT::Node * gsrc = g.get_src_node(garc);
          typename GT::Node * tsrc = NULL;
          if (IS_NODE_VISITED(gsrc, Min))
            tsrc = static_cast<typename GT::Node*>(NODE_COOKIE(gsrc));
          else
            {
              NODE_BITS(gsrc).set_bit(Min, true); // marcar bit
              delete NI(gsrc);
              tsrc = tree.insert_node(gsrc->get_info());
              GT::map_nodes(gsrc, tsrc);
            }
          typename GT::Node * gtgt = g.get_tgt_node(garc);
          typename GT::Node * ttgt = NULL;
          if (IS_NODE_VISITED(gtgt, Min))
            ttgt = static_cast<typename GT::Node*>(NODE_COOKIE(gtgt));
          else
            {
              NODE_BITS(gtgt).set_bit(Min, true); // marcar bit
              delete NI(gtgt);
              ttgt = tree.insert_node(gtgt->get_info());
              GT::map_nodes(gtgt, ttgt);
            }

          typename GT::Arc * tarc = tree.insert_arc(tsrc, ttgt, garc->get_info());
          GT::map_arcs(garc, tarc);
          ARC_BITS(garc).set_bit(Min, true);
        }
      return false; // no hay ciclos negativos
    Í× × arcs ¾ º
     ÓÒ Ð Ö ÓÐ Ö ÓÖ tree ÔÓ ÑÓ× × ÖÚ ÖÒÓ× Ð ÖÙØ Ò find path depth first()
    ×ØÙ      Ò Ü º º º¾ ´Ô Ò ¾¿µ Ý × Ò ÓÒØÖ Ö ÙÒ Ñ ÒÓ Ñ Ò ÑÓ × start node
         Ù ÐÕÙ Ö ÓØÖÓ ÒÓ Óº
738                                                            Cap´
                                                                  ıtulo 7. Grafos



7.9.3.7   An´lisis del algoritmo de Bellman-Ford
            a

 Ò Ð Þ Ö Ð Ð ÓÖ ØÑÓ          ÐÐÑ Ò¹ ÓÖ Ö ÕÙ Ö Ò Ð Þ Ö ×Ù× Ù ØÖÓ× ÐÓÕÙ ÔÖ Ò Ô Ð ×
 ÁÒ Ð Þ ÓÒ Ð ÓÖ ØÑÓ                  ÐÐÑ Ò¹ ÓÖ ¾ ¸ Ð ÓÖ ØÑÓ Ò Ö Ó             ÐÐÑ Ò¹
  ÓÖ ¿½ ¸ Ø ÓÒ                  ÐÓ× Ò Ø ÚÓ× ¿ Ý ÓÒרÖÙ ÓÒ Ö ÓÐ Ö ÓÖ
  Ð ÓÖ ØÑÓ        ÐÐÑ Ò¹ ÓÖ ¿ º
      ÁÒ Ð Þ ÓÒ Ð ÓÖ ØÑÓ                ÐÐÑ Ò¹ ÓÖ ¾ Ö ÕÙ Ö Ö ÓÖÖ Ö ÐÓ× ÒÓ Ó× Ý
ÐÓ× Ö Ó× ÐÓ ÕÙ ÖÖÓ ÙÒ ÓÑÔÐ                  O(V + E)º
        Ð ÓÖ ØÑÓ Ò Ö Ó               ÐÐÑ Ò¹ ÓÖ ¿½ Ø Ö ¸ Ø Ð ÓÑÓ ÐÓ Ñ Ö ÑÓ×
 Ò Ü º º¿º¿ ´Ô Ò ¿¼µ¸ V × E Ú ×º
          Ø ÓÒ         ÐÓ× Ò Ø ÚÓ× ¿ Ø Ö ÐÓ ×ÙÑÓ O(E)º רӏ ÙÒ Ó Ð ÓÖ ØÑÓ
   ÒÖ Ó         ÐÐÑ Ò¹ ÓÖ ¿½ × ÔÖÓÜ Ñ O(V E)º
       Ò ÐÑ ÒØ ¸ ÓÒרÖÙ ÓÒ Ö ÓÐ Ö ÓÖ                  Ð ÓÖ ØÑÓ       ÐÐÑ Ò¹ ÓÖ ¿
ØÓÑ O(V) Ú ×º
       ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð Ð ÓÖ ØÑÓ ØÓÑ O(V +E)+O(V E)+O(V) = O(V E)º Ä Ú Ö× ÓÒ
    Ð ÓÖ ØÑÓ        ÐÐÑ Ò¹ ÓÖ ¿¾ × Ò Ð ÓÐ Ø Ò Ð Ñ ×Ñ ÓÑÔÐ                   ¸ ÙÒ Ó
   ÙÒ Óר       ÓÒ Ð       ×Ô Ó O(V) Ô ÖÓ Ò Ð ÔÖ Ø ¸ Ð ÓÖ ØÑÓ                 ÐÐÑ Ò¹
  ÓÖ ¿¾ Ø Ò × Ö Ñ × Ú ÐÓÞ ÕÙ Ð ÓÖ ØÑÓ Ò Ö Ó                    ÐÐÑ Ò¹ ÓÖ ¿½ º
7.9.3.8   Correctitud del algoritmo de Bellman-Ford

Proposici´n 7.6
         o          ¾¿

   Ð Ð ÓÖ ØÑÓ    ÐÐÑ Ò¹ ÓÖ          × Ó Ò Ð ÐÓÕÙ     Ð ÓÖ ØÑÓ Ò Ö Ó          ÐÐÑ Ò¹
 ÓÖ ¿½ × ÓÖÖ ØÓº
Demostraci´n (por inducci´n sobre la i-´sima iteraci´n)
          o              o             e            o             Ä ÔÖÓÔÓ× ÓÒ ×
ÓÖÖ Ø × ÒÓ Ü ×Ø Ñ ÒÓ × u          v¸ Ò ÙÝÓ ×Ó Ð Óר               × Ò¬Ò ØÓ Ý ÒÓ Ý
 Ö Ó׺ ÐÓ ÓÒØÖ Ö Ó¸ Ú Ö ¬ ÑÓ× ÔÓÖ Ò Ù ÓÒº
    Ä ÔÓØ × × Ò Ù Ø Ú × ÕÙ ÐÙ Ó Ð i¹ × Ñ Ø Ö ÓÒ Ð Ú ÐÓÖ (v) × Ñ ÒÓÖ Ó
  Ù Ð Ð Ñ ÒÓ Ñ × ÓÖØÓ ÓÑÔÙ ×ØÓ ÔÓÖ i Ó Ñ ÒÓ× Ö Ó׺
    Ë u ∈ V Ð ÒÓ Ó ÓÖ Ò ´start node Ò Ð Ð ÓÖ ØÑÓµ Ý × v ∈ V ÙÒ ÒÓ Ó Ù ÐÕÙ Ö º
 ÒØÓÒ ×
   ½º i = 0 ÄÙ Ó Ð ÔÖ Ñ Ö Ø Ö ÓÒ¸ v ÔÙ           Ò ÐÓ Ö× Ó Ó× ×Ó×
       ´ µ Ë Ü ×Ø ÙÒ Ö Ó u→ v¸ ÒØÓÒ × (v) = w¸ Ð Ù Ð × Ð Ñ Ò ÑÓ Ñ ÒÓ ÔÓ× Ð
                            w
                            −
            ÓÑÔÙ ×ØÓ ÔÓÖ ÙÒ ×ÓÐÓ Ö Óº
       ´ µ Ë ÒÓ Ü ×Ø Ö Ó Ö ØÓ ÒØÖ u Ý v¸ ÒØÓÒ × (v) = ∞ Ý Ð ÒØ
            Ö Ó× ÒÚÓÐÙ Ö     × ÒÙÐ ÐÓ ÕÙ ÒÓ Ú ÓÐ Ð ÔÓØ × × Ò Ù Ø Ú º
   ¾º i > 0 ÓÖ ×ÙÑ ÑÓ× ÕÙ Ð ÔÓØ × × Ò Ù Ø Ú × ÖØ Ô Ö ØÓ Ó i Ý Ú Ö ¬ ÑÓ×
      × ÙÒ ÐÓ × Ô Ö i + 1º ÈÓ ÑÓ× ×Ø Ò Ù Ö Ó× ×Ó× ÒØÖ Ñ ÒÓ× × u               v

       ´ µ Ü ×Ø ÙÒ Ñ ÒÓ Ñ Ò ÑÓ p ÓÑÔÙ ×ØÓ ÔÓÖ i Ó Ñ ÒÓ× Ö Ó× Ò ×Ø ×Ó¸ ÔÙ ×ØÓ
           ÕÙ p × Ñ Ò ÑÓ¸ ØÓ Ö Ð ÓÒ            v ÒÓ   Ø Ö Ð Ú ÐÓÖ (v)º
       ´ µ Ò Ð ×Ó ÓÒØÖ Ö Ó¸ Ü ×Ø ÙÒ Ñ ÒÓ p × u               v¸ ÓÑÔÙ ×ØÓ ÔÓÖ i Ó
           Ñ ÒÓ× Ö Ó׸ ÕÙ × Ð Ñ × ÓÖØÓ ÔÓ× Ð ÒØÖ ØÓ Ó× ÐÓ× Ñ ÒÓ× ÔÓ× Ð × ×
           u      v    ÐÓÒ ØÙ i+1º ר Ñ ÒÓ ÔÙ ×ØÖÙ ØÙÖ Ö× Ð × Ù ÒØ ÑÓ Ó
 ¾¿
      ×   Ò Ð ÔÖÙ        Ë   Û   ¿¿ º
7.9. Caminos m´
                  ınimos                                                             739


                                            ÒÓ Ó×
                                       Ù            Û         Ú

               ×     Ö¸ ÙÒ Ñ ÒÓ i Ó Ñ ÒÓ× Ö Ó× × u            w Ý ÙÒ Ö Ó × w
                    vº ÈÓÖ Ð  ÔÓØ × × Ò Ù Ø Ú ¸ (w) ÓÒØ Ò Ð Óר Ñ Ò ÑÓ ×
              u       w ÔÓ× Ð ÓÒ i Ó Ñ ÒÓ× Ö Ó׺     Ð ÐÓÕÙ Ð ÓÖ ØÑÓ Ò Ö Ó
                 ÐÐÑ Ò¹ ÓÖ ¿½ Ú ÑÓ× ÕÙ Ð Ø Ö ÓÒ i + 1 Ó × ÖÚ Ö ØÓ Ó× ÐÓ× Ö Ó× w
              Ý × Ð ÓÒ Ö Ð Ö Ó ÕÙ Ú          v ØÙ Ð Þ Ò Ó ×Ù  (v)

    7.9.3.9   B´ squeda de ciclos negativos
               u

      Ò Ó × ÓÒ ×¸ ÒÓ ×ÓÐÓ × Ò × Ö Ó × Ö × Ü ×Ø Ó ÒÓ ÙÒ ÐÓ¸ × ÒÓ Ø ÖÑ Ò ÖÐÓ Ü Ø ¹
    Ñ ÒØ ´ÒÓ Ó× Ý Ö Ó×µº ÓÑÓ              ÖÐÓ
          Ù Ò Ó ÙØ ÑÓ× Ð Ð ÓÖ ØÑÓ                ÐÐÑ Ò¹ ÓÖ ×Ó Ö ÙÒ Ö Ó ÓÒ Ð Ñ ÒÓ× ÙÒ ÐÓ
    Ò Ø ÚÓ¸ Ð × Ö Ð ÓÒ × ÐÓ× Ö Ó× ÓÑÔÓÒ ÒØ × Ð ÐÓ × ÑÔÖ ×Ñ ÒÙÝ Ò ÐÓ× Ú ÐÓÖ ×
             ×Ù× ÒÓ Ó׺        Ú Þ ÕÙ × Ö Ð ÙÒ Ö Ó¸ Ð Ô Ö v × ØÙ Ð Þ Ò Ð ÖÖ ÐÓ
    pred[]º ÓÑÓ ×ØÓ ×Ù            Ô Ö ØÓ Ó× ÐÓ× ÒÓ Ó׸ Ò ÐÙ Ó× ÐÓ× Ð ÐÓ¸ Ð ÖÖ ÐÓ pred[]
      ÓÒØ Ò Ð ´Ó ÐÓ×µ ÐÓ´×µ Ò Ù ×Ø ÓÒº
         Ä Ö ­ Ü ÓÒ ÒØ Ö ÓÖ ÒÓ× Ö Ú Ð ÙÒ ÐØ ÖÒ Ø Ú Ô Ö Ø Ø Ö ÙÒ ÐÓ¸ Ð Ù Ð ÓÒ¹
    × ×Ø Ò Ù× Ö Ô Ö Ó Ñ ÒØ Ò Ð ÖÖ ÐÓ pred[] Ð Ü ×Ø Ò                        ÙÒ ÐÓº Ë ÐÓ
      Ò ÓÒØÖ ÑÓ׸ ÒØÓÒ × Ø Ò ÑÓ× Ð Ð ÙÐÓ Ð Ö ÓÐ Ö ÓÖ Ý ÜØÖ ÑÓ× Ð ÐÓ Ð
      ÖÖ ÐÓº
         Ë pred[] ÓÒØ Ò Ð ÐÓ¸ ÒØÓÒ ×¸ ÓÑÓ Ù× ÖÐÓ º ÈÓÖ × ÑÔÐ                    ¸ ×Ùר Ò¹
    Ø       Ò ÔÖ Ú Ó× × ÖÖÓÐÐÓ׸ ÒÓ× Ú Ð Ö ÑÓ× Ð Ð × Compute Cycle In Digraph()
       ×      Ò Ð Ð ÙÐÓ         ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ× × ÙÒ Ð Ð ÓÖ ØÑÓ Ì Ö Ò
      Ò Ü º º ´Ô Ò          µº È ÖÓ ×Ø Ð × Ö ÕÙ Ö ÕÙ Ð Ö Ó ×Ø Ö ÔÖ × ÒØ Ó Ò ÙÒ
       Ö Ú ÓÒ List Digraph<Node, Arc> Ý ÒÓ Ò ÐÓ× ÖÖ ÐÓ× pred[] Ý arcs[]º È Ö
       Ð ÙÐ Ö Ð ÐÓ         ÑÓ׸ Ô٠׸ ÓÒרÖÙ Ö ÙÒ Ó ØÓ Ø ÔÓ List Digraph<Node, Arc>
    Ý ×Ó Ö Ð Ò ÓÒØÖ Ö Ð ÐÓº Ð ÔÖÓ Ñ ÒØÓ ÔÙ Ö ×ÙÑ Ö× ×
        ½º ÓÒרÖÙ Ö ÙÒ Ö Ó ÙÜ Ð Ö Ô ÖØ Ö ÐÓ× ÖÖ ÐÓ× pred[] Ý arcs[]º ÄÐ Ñ ÑÓ× aux
              ר Ö Ó¸ Ð Ù Ð           ר Ö Ñ Ô Ó Ð Ö Ó ÓÒ ÐÓ׺
           aux ÓÒØ Ò ÓÒ ÖØ ØÙ ÙÒ              ÐÓ¸ ÔÙ × ×Ø ÓÒרÖÙ Ó Ô ÖØ Ö ÐÓ× ÖÖ ÐÓ×
           pred[] Ý arcs[] Ö ×ÙÐØ ÒØ ×      Ð Ø ÓÒ ÙÒ ÐÓ ÔÓÖ Ð Ð ÓÖ ØÑÓ            ÐÐÑ Ò¹
            ÓÖ º
        ¾º ÑÔÐ Ö Ð Ð × Compute Cycle In Digraph¸ ×Ó Ö Ð Ö Ó ÙÜ Ð Ö Ô Ö Ù Ö ÙÒÓ
              ×Ù× ÐÓ× ´ÔÙ            Ö Ñ ×µº Ë path Ø Ð ÐÓº
        ¿º Ð ÐÓ ×Ó Ö g × ¬Ò ÔÓÖ Ð Ñ Ô Ó path Ò gº
      ÒØ Ò Ó ×Ø ÔÖÓ Ñ ÒØÓ¸ ÔÐ ÒØ ÑÓ× Ð × Ù ÒØ ÖÙØ Ò
¿    ÊÙØ Ò ×       Ð ÓÖ ØÑÓ       ÐÐÑ Ò¹ ÓÖ ¾ +≡                     ¾    ¼
          template <class GT>
     bool search_cycle(GT &                            g,
                       DynArray<typename GT::Node *> & pred,
                       DynArray<typename GT::Arc *> & arcs,
                       Path<GT> &                      cycle)
     {
740                                                             Cap´
                                                                       ıtulo 7. Grafos



          const size_t & n = pred.size(); // debe ser la cantidad de nodos de g
          DynMapAvlTree<typename GT::Node*, typename GT::Node*> nodes_table;
          GT aux;                                    // construir grafo auxiliar aux
          for (int i = 0; i < n; ++i) // insertar nodos en aux
            {
              typename GT::Node * p = pred.access(i);
              if (p == NULL or NODE_COOKIE(p) != NULL) // ¿nodo ya insertado y mapeado?
                continue; // s´ ==> avance al siguiente
                              ı
              typename GT::Node * q = aux.insert_node(p->get_info());
              GT::map_nodes(p, q);
              nodes_table.insert(q, p);
            }
          for (int i = 0; i < n; ++i) // insertar arcos en aux
            {
              typename GT::Arc *   a   = arcs.access(i);
              if (a == NULL or ARC_COOKIE(a) != NULL)
                continue;
              typename GT::Node * gsrc = g.get_src_node(a);
              typename GT::Node * gtgt = g.get_tgt_node(a);
              if (NODE_COOKIE(gsrc) == NULL or NODE_COOKIE(gtgt) == NULL)
                continue; // Uno de los nodos no est´ en pred ==> no es parte de ciclo
                                                    a
              typename GT::Node * aux_src = (typename GT::Node*) NODE_COOKIE(gsrc);
              typename GT::Node * aux_tgt = (typename GT::Node*) NODE_COOKIE(gtgt);
              aux.insert_arc(aux_src, aux_tgt);
            }
          Path<GT> path; // buscar el ciclo en aux mediante algoritmo de Tarjan
          if (not Compute_Cycle_In_Digraph <GT> () (aux, path))
            return false; // no existe ciclo
          cycle.set_graph(g); // mapear ciclo en aux al camino cyle en g
          for (typename Path<GT>::Iterator it(path); it.has_current(); it.next())
            cycle.append(nodes_table[it.get_current_node()]);
          return true;
      }
    Í× × arcs ¾ ¸ DynArray ¾¸ Path ¼¾ ¸ Ò    pred   ¾ º
    search cycle()      Ù×   Ò Ð ×Ù ¹ Ö Ó g ¬Ò Ó ÔÓÖ ÐÓ× ÖÖ ÐÓ× pred[] Ý arcs[]¸
    Ö ×ÙÐØ ÒØ × Ð         Ù ÓÒ Ð Ð ÓÖ ØÑÓ    ÐÐÑ Ò¹ ÓÖ ¸ Ð ÔÖ × Ò       ÙÒ ÐÓº Ë Ð
       ÐÓ × Ò ÓÒØÖ Ó¸ ÒØÓÒ × Ð ÙÒ ÓÒ Ö ØÓÖÒ true Ý Ù Ö Ò Ð Ñ ÒÓ cycle Ð ÐÓº
        ÐÓ ÓÒØÖ Ö Ó¸ Ö ØÓÖÒ falseº
        Ä × ÒØ Ö × ÕÙ ÑÓ× × ÖÖÓÐÐ Ó Ò ØÓÖÒÓ Ð Ð ÓÖ ØÑÓ           ÐÐÑ Ò¹ ÓÖ Ò Ò ×
     Ü ×Ø Ó ÒÓ ÙÒ ÐÓ Ò Ø ÚÓ¸ Ô ÖÓ ÒÓ ÐÓ Ø ÖÑ Ò Òº ÈÙ ×ØÓ ÕÙ ÒØ ¬ Ö ÐÓ× Ò Ø ÚÓ×
     × ÙÒ Ø Ö ÔÐ Ù× Ð Ô Ö ÓØÖÓ× Ð ÓÖ ØÑÓ׸ Ð Ð ÓÖ ØÑÓ      ÐÐÑ Ò¹ ÓÖ ÔÙ ÑÔÐ Ö×
    Ô Ö Ð ÙÐ ÖÐÓ׺ Ò × × ÒØ Ó¸ × Ò Ö ÑÓ× Ð ÖÙØ Ò × Ù ÒØ
¼    ÊÙØ Ò ×     Ð ÓÖ ØÑÓ      ÐÐÑ Ò¹ ÓÖ ¾ +≡                    ¿   ½
          template <class GT, class Distance, class Compare, class Plus, class SA>
      inline bool bellman_ford_negative_cycle(GT &                g,
                                              typename GT::Node * start_node,
                                              Path<GT> &          cycle)
      {
        GT tree; // arbol sobre el cual opera algoritmo de Bellman-Ford
                    ´
          ÁÒ   Ð Þ ÓÒ        Ð ÓÖ ØÑÓ       ÐÐÑ Ò¹ ÓÖ ¾
7.9. Caminos m´
                  ınimos                                                         741



            Ð ÓÖ ØÑÓ Ò Ö Ó      ÐÐÑ Ò¹ ÓÖ ¿½
              Ø ÓÒ      ÐÓ× Ò Ø ÚÓ× ¿
          if (not negative_cycle)
            return false;
          Search_Cycle <GT> () (g, pred, arcs, cycle);
          return true;
      }
    Í× × arcs ¾ ¸ Path ¼¾ ¸ Ò   pred   ¾ º
      ÓÑÓ ÔÖ ÑÓ׸ Ð ÖÙØ Ò × × Ò ÐÑ ÒØ Ù Ð ÕÙ q bellman ford min spanning tree()º
      Ð Ò Ó × ÕÙ ÒÓ × Ð ÙÐ Ð Ö ÓÐ Ö ÓÖ ×ÓÐÓ × Ø ÖÑ Ò × Ü ×Ø Ò Ó ÒÓ ¹
     ÐÓ×    Ü ×Ø Ö¸ ÒØÓÒ × × Ö ØÓÖÒ ¸ Ò Ð Ô Ö Ñ ØÖÓ cycle¸ Ð ÐÓ ÓÒ × Ø ØÓ Ð
    Ò ØÚ º
    7.9.3.10    C´lculo de ciclos negativos en un digrafo
                 a

    Ä ÖÙØ Ò ÒØ Ö ÓÖ ×ÓÐÓ Ð ÙÐ          ÐÓ× Ò Ð ÓÑÔÓÒ ÒØ Ù ÖØ Ñ ÒØ ÓÒ ÜÓ Ð ÕÙ
    Ô ÖØ Ò Þ start node¸ ÐÓ Ù Ð ÒÓ Ö ×ÔÓÒ        ×ÓÐÙØ Ñ ÒØ × g Ø Ò Ó ÒÓ ÐÓ× Ò ¹
    Ø ÚÓ׺ Ë × ÔÖ Ø Ò      ÒÖÐ       Ý × ÙÖ Ö × Ü ×Ø Ò Ó ÒÓ ÐÓ× Ò Ø ÚÓ× Ò ÙÒ Ö Ó
     Ù ÐÕÙ Ö ¸ ÒØÓÒ ×¸ ÙÒÕÙ Ð Ø Ò × ÙÒ Ñ ÒØ ÐÑ ÒØ Ð Ñ ×Ñ ¸              ÑÓ× Ö Ð Þ Ö
    ÙÒ ÔÓ Ó Ñ × ØÖ Óº
           × Ñ ÒØ ¸ Ð Ø Ò ÕÙ ÑÔÐ Ö ÑÓ× Ô Ö Ù× Ö ÐÓ× Ò Ø ÚÓ× × Ö ×ÙÑ Ò
       ½º Ç Ø Ò C = { ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ×}
       ¾º ∀c ∈ C =⇒
           ´ µ Ë there is is cycle = Bellman Ford Negative Cycle() ÙØ Ó ×Ó Ö c
                Ô ÖØ Ö ÙÒ ÒÓ Ó Ù ÐÕÙ Ö cº
           ´ µ Ë there is cycle =⇒
                 º Å Ô Ð ÐÓ Ó Ø Ò Ó ÔÓÖ Bellman Ford Negative Cycle()         Ð ¹
                    Ö Ó ÓÖ Ò Ð g
                 º Ì ÖÑ Ò Ö ÓÒ Ú ÐÓÖ Ö ØÓÖÒÓ true
       ¿º Ì ÖÑ Ò Ö ÓÒ Ú ÐÓÖ Ö ØÓÖÒÓ false
        È Ö Ð ÔÖ Ñ Ö Ô ×Ó ÔÓ ÑÓ× Ô Ö Ø Ñ ÒØ Ù× Ö Ð ÖÙØ Ò Strongly Connected Components(g,
    list)¸ × ÖÖÓÐÐ       Ò Ü º º¿º¾ ´Ô Ò     µº ÄÓ ÕÙ ÒÓ× Ô ÖÑ Ø ¬Ò Ö
½    ÊÙØ Ò ×     Ð ÓÖ ØÑÓ      ÐÐÑ Ò¹ ÓÖ ¾ +≡                         ¼
          template <class GT, class Distance, class Compare, class Plus, class SA>
      inline bool bellman_ford_negative_cycle(GT & g, Path<GT> & cycle)
      {
        DynDlist<DynDlist<typename GT::Node*> > blocks;
        Strongly_Connected_Components <GT, SA> () (g, blocks);
            // recorrer todos los bloques
        for (typename DynDlist<DynDlist<typename GT::Node*> >::Iterator it(blocks);
             it.has_current(); it.next())
          {
            DynDlist<typename GT::Node*> & block = it.get_current();
            if (block.size() == 1)
              continue;
742                                                                        Cap´
                                                                              ıtulo 7. Grafos



         typename GT::Node * src = block.get_first(); // nodo desde donde iniciar
         if (bellman_ford_negative_cycle <GT, Distance, Compare, Plus, SA>
             (g, src, cycle))
           return true;
        }
      return false;
 }
Í× × DynDlist ¿ Ò     Path   ¼¾ º

7.9.4    Discusi´n sobre los algoritmos de caminos m´
                o                                   ınimos
 Ð ÔÖÓ Ð Ñ     Ñ ÒÓ Ñ Ò ÑÓ × ÙÒÓ ÐÓ× ÔÖÓ Ð Ñ Ö ×ÓÐÙ Ð × Ñ × ÑÔÓÖØ ÒØ × ÐÓ×
 Ö Ó׺ ÒØÖ ÐÓ× Ð ÓÖ ØÑÓ× ×ØÙ Ó׸ Ý ÓØÖÓ× Ü ×Ø ÒØ ׸ Ù Ò Ó Ý ÓÑÓ × Ð ÓÒ Ö
ÙÒÓ º ÁÒ ÑÓ× ÒÙ ×ØÖ × Ù× ÓÒ ÔÖ × ÒØ Ò Ó Ð × Ù ÒØ Ø Ð Ö Ô ØÙÐ Ø Ú Ø ÑÔÓ×
      Ù ÓÒ Ý ×Ô Ó
                   Ð ÓÖ ØÑÓ             Ê ÔÖ × ÒØ ÓÒ         × ÑÔ ÒÓ        ×Ô   Ó
                       ×ØÖ           Ä ×Ø ×     Ý Ò         O(E Ð V)       O(V)
                     ÐÓÝ            Å ØÖ ×       Ý Ò         O(V ) 3
                                                                           O(V 2 )
                  ÐÐÑ Ò¹ ÓÖ          Ä ×Ø ×     Ý Ò          O(V E)        O(V)

    À Ý Ú Ö Ó× Ö Ø Ö Ó× Ô Ö Ø Ö × ÔÖ ÙÒØ º ÍÒÓ ÔÖ Ñ ÖÓ ×Ø Ø ÖÑ Ò Ó ÔÓÖ Ð
     Ó ÕÙ Ð Ö Ó × Ó ÒÓ Ö Óº Ë × ØÖ Ø ÙÒ Ö Ó × Ò Ô ×Ó× Ò Ø ÚÓ׸ ÒØÓÒ ×¸
      Ó ×Ù Ñ ÓÖ Ö Ò Ñ ÒØÓ¸ Ð Ð ÓÖ ØÑÓ            ×ØÖ × Ð × Ó Ò            ØÓº ÄÓ×
 Ö Ó× ÔÓÒ Ö Ó× Ò ØÙÖ Ð × ÒÓ Ø Ò Ò Ô ×Ó× Ò Ø ÚÓ× ÔÓÖ Ò ØÙÖ Ð ÒØ Ò ÑÓ× ÕÙ
 Ð Ö Ó ÑÓ Ð Þ Ö Ø Ñ ÒØ ÙÒ × ØÙ ÓÒ Ð Ú Ö Ð Ý ÒÓ × ÙÒ ÓÒ× Ù Ò
 Ð ÙÒ ØÖ Ò× ÓÖÑ ÓÒ Ñ Ø Ñ Ø º ÈÓÖ ÑÔÐÓ¸ Ò Ù ÐÕÙ Ö Ö Ó Ù Ð ÒÓ¸ × Ö¸
ÙÒÓ ÕÙ Ö ÔÖ × ÒØ ר Ò × Ù Ð Ò ×¸ Ó Ò ÙÒ Ö Ó Ø ÑÔÓÖ Ð¸ Ó × ÙÒÓ ÕÙ ÑÓ Ð
  ÙÖ ÓÒ ×¸ Ð Ð ÓÖ ØÑÓ           ×ØÖ × Ð Ñ ÓÖ ÓÔ ÓÒ Ô Ö Ð ÙÐ Ö Ð Ñ ÒÓ Ñ Ò ÑÓ
 ÒØÖ ÙÒ Ô Ö ÒÓ Ó׺
    Ä Ü ×Ø Ò        Ô ×Ó× Ò Ø ÚÓ× × ÖØ       ÔÐ ÒÓ Ð Ð ÓÖ ØÑÓ        ×ØÖ º Ò ×Ø
× ØÙ ÓÒ¸ Ð Ð ÓÖ ØÑÓ        ÐÐÑ Ò¹ ÓÖ × Ð ÔÖ Ö Ò ¸ ÔÙ × ÒÓ ×ÓÐÓ Ü Ñ ÓÖ Ø ÑÔÓ¸
× ÒÓ ÕÙ Ø Ø ÐÓ× Ò Ø ÚÓ× ÙÒÕÙ ×ØÓ ÙÐØ ÑÓ × Ñ × ÙÒ ÓÒ× Ö ÓÒ Ú Ð ¹
     ÓÒ ÕÙ Ö Ð         Ñ Ø Ñ Ø ¸ ÒÓ × Ô ÙÒ Óר × Ò ¬ Ø ÚÓ ÔÓÖ Ð Ú Ö ¬ ÓÒº
    ÈÐ ÒØ × Ð × Ö ­ Ü ÓÒ × ÒØ Ö ÓÖ ×¸ ÒÓ× Ô Ö ¸ ÒØÓÒ ×¸ Ð × Ù ÒØ ÔÖ ÙÒØ
   Ù Ò Ó Ù× Ö Ð Ð ÓÖ ØÑÓ       ÐÓÝ ¹Ï Ö× ÐÐ ÍÒ ÔÖ Ñ Ö Ö ×ÔÙ ×Ø ÓÒ× ×Ø Ò Ö
 Ù Ò Ó × Ö ÕÙ Ö Ò Ð ÙÐ Ö ØÓ Ó× ÐÓ× Ô Ö ×     Ñ ÒÓ× Ñ Ò ÑÓ׺ Ø Ð × ØÓ׸ ÓÒÚ Ò
 ÓÑÔ Ö Ö ÐÓ× ÓØÖÓ× Ð ÓÖ ØÑÓ× ÔÖ × ÒØ Ó× Ô Ö ØÓ Ó× ÐÓ Ô Ö ×    Ñ ÒÓ× Ñ Ò ÑÓ×
                              Ð ÓÖ ØÑÓ         × ÑÔ ÒÓ        ×Ô       Ó
                                  ×ØÖ        O(V E Ð V)   O(V 2 ) + O(V)
                                ÐÓÝ            O(V 3 )       O(V 2 )
                             ÐÐÑ Ò¹ ÓÖ        O(V 2 E)    O(V 2 ) + O(V)

È Ö Ö Ó× Ò×Ó× Ò ÐÓ× ÕÙ              E ≈ V2  Ð Ð ÓÖ ØÑÓ     ×ØÖ × ÓרÓ×Ó Ý ÒÓ× ÕÙ    Ð
   ÐÐÑ Ò¹ ÓÖ ÓÑÓ Ð ÙÒ Ó             ÓÑÔ Ø Ø ÚÓ Ò Ø ÑÔÓ¸ Ñ × ÒÓ Ò ×Ô Óº × Ð × Ó× ×¸ Ð
 Ð ÓÖ ØÑÓ     ÐÓÝ ¹Ï Ö× ÐÐ          × Ð × Ó Ò Ù Ò Ó Ö ÕÙ Ö ÑÓ× Ð ÙÐ Ö ØÓ Ó× ÐÓ× Ô Ö ×
      Ñ ÒÓ× Ñ Ò ÑÓ× Ý Ð Ö           Ó×     Ò×Ó Ñ ÒØÖ × ÕÙ Ð Ð ÓÖ ØÑÓ       ÐÐÑ Ò¹ ÓÖ ÐÓ
 × Ù Ò Ó Ð Ö Ó × ×Ô Ö               Óº
7.10. Redes de flujo                                                               743



    È ÖÓ Ð ÔÖ ÙÒØ Ý Ö ­ Ü ÓÒ ÔÖ Ú × ÒÓ Ø Ò Ò × ÒØ Ó × Ò Ð ÔÖ ÙÒØ Ö          ÙÒÓ
× Ö ÕÙ Ö Ò Ð ÙÐ Ö ØÓ Ó× ÐÓ× Ô Ö ×        Ñ ÒÓ× Ñ Ò ÑÓ× ÖÓ××Ó ÑÓ Ó¸ Ü ×Ø Ò Ó×
× ØÙ ÓÒ × Ù Ò Ó × Ö ÕÙ Ö ×ÔÓÒ Ö Ð Ñ Ò ÑÓ ÒØÖ Ù ÐÕÙ Ö Ô Ö ÒÓ Ó× Ó Ù Ò Ó
× Ö ÕÙ Ö ÓÒÓ Ö Ð Ñ ØÖÓ ÙÒ Ö º
      Ò Ö Ó׸ Ð Ñ ØÖÓ × ¬Ò ÓÑÓ Ð Ñ ÒÓ × ÑÔÐ Ñ × Ð Ö Óº Ä Ö ×ÔÙ ×Ø
 ר ÒØ ÖÖÓ ÒØ Ð ÔÖÓÔÓÖ ÓÒ Ð Ñ × Ð Ö Ó Ñ ÒÓ ÒØÖ ÙÒ Ô Ö ÒÓ Ó׸ ØÓ ÕÙ
× ÓÖÖ ×ÔÓÒ ÓÒ Ð Ñ Ü ÑÓ Ú ÐÓÖ Ð Ñ ØÖ Þ             Óר × ÖÖÓ     ÔÓÖ Ð Ð ÓÖ ØÑÓ
  ÐÓÝ ¹Ï Ö× ÐÐ Ó ÔÓÖ Ð Ð ÓÖ ØÑÓ      ÐÐÑ Ò¹ ÓÖ Ò ×Ù Ú Ö× ÓÒ Ô Ö ØÓ Ó× ÐÓ× Ñ ÒÓ×
Ñ Ò ÑÓ׺

7.10        Redes de flujo
Ä × Ó× × ÕÙ ÒÓ× ×ÓÒ ÑÙÝ Òר ØÙ × Ú Ò Ò Ô ÖØ         ÒÙ ×ØÖÓ ÓÒ Ó Ý ØÖ × ÓÒ Óº ×
ÕÙ Þ ÔÓÖ ÐÐÓ ÕÙ Ø Ò ÑÓ× ÒÓ ×Ø Ò Ù ÖÐ × Ý¸ ÑÙ Ó Ñ ÒÓ׸ Ö ÓÒÓ Ö Ð ØÖ × Ò Ò
ÕÙ Ð ÙÒ ×         ÐÐ × Ø Ò Ò ×Ó Ö ÒÙ ×ØÖ Ú º ÍÒ    × × Ó× ×¸ Ù Ù ¸ ÙÒ Ñ ÒØ Ð
Ô Ö ÒÙ ×ØÖÓ ÑÓ Ó Ú ¸ × Ð ØÙ Ó Ó ØÙ Ö ÓÒ Ð ­Ù Ó ÕÙ ×Ø ÐÐ Ú Ý Ð Ö
   ØÖ Ò×ÔÓÖØ ¸ ÐÐ Ñ         ØÙ Ö × ÕÙ ×Ø Ø ÒÓÐÓ       ÓÒÐÐ Ú º
         × ÖÒÓ× Ö Ñ Ò × ÒØ ÙÒ Ô Ö Ò ÓÒ ÒØÖ ÙÒ Ö    ØÙ Ö × Ý ÙÒ Ö Ó Ð × ØÙ Ö ×
×ÓÒ Ö Ó× Ý ÐÓ× ÑÔ ÐÑ × ÕÙ ÙÒØ Ò Ó× Ó Ñ × ØÙ Ö × ×ÓÒ ÒÓ Ó׺ ÈÙ ×ØÓ ÕÙ Ð Ö
ØÖ Ò×ÔÓÖØ ÙÒ ­Ù Ó¸ Ø Ñ Ò          ÑÓ×     Ö ÔÖ Ò Ó ÕÙ × ØÖ Ø ÙÒ Ö Ó Ö Ó¸
ÔÙ × Ð ­Ù Ó Ö ÙÐ Ò ÙÒ ×ÓÐ Ö ÓÒº ÙÒ Ö Ó ÕÙ                    Ð ÙÒ ÓÖÑ ÑÓ Ð
ÙÒ Ö       ØÙ Ö × Ý Ð ÙÒ Ð × ­Ù Ó Ö ÙÐ ÒØ × Ð ÒÓÑ Ò Ö º
7.10.1      Definiciones y propiedades fundamentales
Definici´n 7.9 (Red) ÍÒ Ö
        o                          × ÙÒ   Ö Ó G =< V, E > ÓÒ Ø Ó ÓÒ ÓÖÑ Ó ÔÓÖ Ð
ÕÙ ÒØÙÔÐ < V, E, s, t, C > ÓÒ
     ½º   s∈V× Ð ÒÓ Ó Ù ÒØ Ù ÓÖ Ò ´ Ò(s) = 0µº
      t ∈ V × Ð ÒÓ Ó ×ÙÑ ÖÓ Ó Ø ÖÑ Ò Ð ´ ÓÙØ (t) = 0µº
     ¾º
     ¿º
      C : E −→ C × ÙÒ ÙÒ ÓÒ          Ô         ÕÙ Ð × Ò                Ö Ó e ∈ E ÙÒ
        Ô          ­Ù Ó Ô(e) Ö ÙÐ ÒØ ÔÓÖ Ð Ö Ó    ¾ º


    ÈÓÖ ÐÓ Ò Ö Ð¸ C = Z + × Ö¸ Ð × Ô             × ×ÓÒ ÒØ ÖÓ× ÔÓ× Ø ÚÓ׺ Ë Ò Ñ Ö Ó¸
ÔÙ Ò × Ö Ô Ö Ø Ñ ÒØ Ö ÓÒ Ð ×¸ ÖÖ ÓÒ Ð × Ó Ð ÙÒ ÓØÖ Ð ×               Ò ÐÐÓ Ò Ð × ÒØ Ó
 Ð Ö Ó ÕÙ Ö ÔÖ × ÒØ ÙÒ Ñ Ò ØÙ          ­Ù Óº
     Ò Ð ÙÒÓ× ÓÒØ ÜØÓ׸ ר Ð × Ö × Ð ÒÓÑ Ò “red capacitada”º
     Ò Ø ÖÑ ÒÓ× Ñ × Ñ Ð Ö × ÓÒ Ð Ú Ò Ö ÒÙ ×ØÖÓ × ÙÖ×Ó¸ ÙÒ Ö × ÙÒ Ö Ó
 ÓÒ Ô ×Ó× ÓÒ × ×Ô ¬ ÙÒ ÒÓ Ó Ù ÒØ Ý ÙÒÓ ×ÙÑ ÖÓº Ä ¬ ÙÖ º ¼ ÐÙרÖ
ÙÒ ÑÔÐÓ Ò Ð Ù Ð Ð ÒÓ Ó × Ð Ù ÒØ ¸ Á Ð ×ÙÑ ÖÓ Ý ÐÓ× Ô ×Ó× ÐÓ× Ö Ó× Ð ×
  Ô        ×        ØÙ Ö º
     Ò ÙÒ Ö × ÑÔÓÖØ ÒØ ÒÓØ Ö Ó Ø Ú Ñ ÒØ ÐÓ× ÓÒ ÙÒØÓ×                   Ö Ó× × Ð ÒØ × Ý
 ÒØÖ ÒØ × ÙÒ ÒÓ Óº Ò × × ÒØ Ó¸ Ó ÙÒ ÒÓ Ó v ∈ V ¸ ÁÆ(v) × Ð ÓÒ ÙÒØÓ Ö Ó×
 ÒØÖ ÒØ × Ñ ÒØÖ × ÕÙ ÇÍÌ(v) Ð × Ð ÒØ ׺
 ¾
     ÌÙ Ó Ó Ò Ð¸ Ø Ø Ö ¸ × ÙÒ ×   Ð ×Óº
744                                                                                                 Cap´
                                                                                                       ıtulo 7. Grafos



                                   K             6     E         8          L
                             5         4         5               4              9         5

                   A               D             4                  7      H          3         I
                                                       F
                         6                                      7                         6
                                       3                   4

                                   B             1     G             10     J


                                               ÙÖ º ¼ ÍÒ Ö

      Ò × ØÙ ÓÒ × Ð Ú Ö Ð¸ ÔÙ Ò ÔÐ ÒØ Ö× ÑÙÐØ ¹Ö × × Ö¸ ÙÒ ÑÙÐØ                                                    Ö Óº
  ×ØÓ × ÓÖÖ ×ÔÓÒ ÓÒ Ð       Ó Ø Ò Ö Ó× Ó Ñ × ØÙ Ö × ÒØÖ ÙÒ Ô Ö                                                   ÒÓ Ó׺
  ×ØÓ ÔÙ × Ö ÙÒ ÔÓ Ó ÔÖÓ Ð Ñ Ø Ó Ñ Ò Ö¸ ×Ó Ö ØÓ Ó × Ù× ÑÓ× Ñ ØÖ                                                 × Ô ÖÓ
 Ò Ø ÖÑ ÒÓ× ÑÓ Ð Þ ÓÒ¸ Ð Ò ÙÖ           ÙÒ ØÙ Ö Ö ÙÒ ÒØ × ×ØÖ                                                    ÓÒ ÙÒ
 ÙÑ ÒØÓ Ð Ô            Ð Ö Ó ÒØÖ ÐÓ× ÒÓ Ó× ÒÚÓÐÙ Ö Ó× Ñ ÒØÖ × ÕÙ ÙÒ                                             ÓÖØ
ØÙ Ö × Ò ¬ ÙÒ ×Ñ ÒÙ ÓÒº
Definici´n 7.10 (Flujo factible)
       o                                Ë N =< V, E, s, t, C > ÙÒ Ö                                      ­Ù Óº ÍÒ ­Ù Ó
  Ø Ð × ÙÒ ÙÒ ÓÒ f : E −→ C             ÕÙ Ð × Ò ÙÒ Ú ÐÓÖ f(e)                                         Ö Ó¸ ÒÓÑ Ò Ó
 ­Ù Ó Ö ÙÐ ÒØ ÕÙ × Ø ×             Ð × × Ù ÒØ ÓÒ ÓÒ ×
  ½º Condici´n de capacidad:
            o

                                             ∀e ∈ E =⇒ f(e) ≤               Ô(e)                                  ´ºµ
  ¾º   Condici´n de conservaci´n del flujo:
              o               o

                   ∀v ∈ V|v = s ∧ v = t =⇒                                f(e) =                      f(e)       ´ º½¼µ
                                                           ∀e∈ÁÆ(v)                   ∀e∈ÇÍÌ(v)




                                   K             6/2   E         8/5        L
                       5/3             4/1 5/3                 4/1              9/1       5/3

                   A               D          4/1      F        7/1        H          3/3       I
                             6/4       3/3                   7/1
                                                           4/1                      6/1

                                   B          1/1      G             10/1 J


                 ÙÖ º ½ ÍÒ ­Ù Ó Ø Ð ×Ó Ö Ð Ö                                        Ð ¬ ÙÖ º ¼
    Ä ¬ ÙÖ º ½ ÑÙ ×ØÖ ÙÒ ÑÔÐÓ ÙÒ ­Ù Ó Ø                                         Ð ×Ó Ö Ð Ö      Ð ¬ ÙÖ º ¼º
Ä Ô          × × ÓÐÓ Ò Ð ÞÕÙ Ö Ý Ð ­Ù Ó Ö ÙÐ                                    ÒØ Ð Ö º Ë ÙÒ Ð Ò ÓÐ
  Ð ÓÒ ÙÒØÓ ÕÙ Ö ÔÖ × ÒØ ÐÓ× ­Ù Ó׸ ÐÓ× Ú ÐÓÖ × Ò ÐÓ×                            Ö Ó× ÔÙ Ò × Ô Ö Ö× Ñ ÒØ
 ÓÑ ×¸ ÖÖ × Ó × ÑÔÐ Ñ ÒØ ×Ô Ó׺ Ü Ô ÓÒ Ð                                        Ù ÒØ Ý Ð ×ÙÑ ÖÓ ØÓ Ó ÒÓ Ó
× Ø × Ð ÓÒ ÓÒ ÓÒ× ÖÚ ÓÒ ­Ù Óº
7.10. Redes de flujo                                                                              745



Definici´n 7.11 (Valor de flujo)
        o                               Ð Ú ÐÓÖ ­Ù Ó Ò ÙÒ Ö               N =< V, E, s, t, C >    ÓÒ
­Ù Ó f¸ ÒÓØ Ó ÓÑÓ ­Ù Ó(N, f) ×           ¬Ò ÓÑÓ
                      ­Ù Ó(N, f)   =               f(e) =              f(e)                 ´ º½½µ
                                       ∀e∈ÇÍÌ(s)            ∀e∈ÁÆ(t)

  Ò ÓØÖ × Ô Ð Ö ×¸ Ð Ú ÐÓÖ ­Ù Ó × Ð ÒØ                  ­Ù Ó ÕÙ               Ð Ù ÒØ ¸ Ð Ù Ð
× Ö Ð Ñ ×Ñ ÕÙ ÐÐ        Ð ×ÙÑ ÖÓº
     Ò Ð ¬ ÙÖ º ½ Ð Ú ÐÓÖ ­Ù Ó × 7º
7.10.2     El TAD Net Graph<TNode,TArc,T>
Ä × Ö × Ô Ø × ÑÓ Ð Þ Ò × ØÙ ÓÒ × Ö Ð ×            ÐÓ× ÑÙÒ Ó× Ò ØÙÖ Ð Ý Ø ¹
ÒÓÐÓ Óº ÈÙ ×ØÓ ÕÙ ÙÒ Ö         × ÙÒ Ö Ó Ö Ó¸ ÒÓ× Ú Ð Ö ÑÓ× Ð Ì
List Digraph<Node, Arc>º Ð Ì   Ö ×ÙÐØ ÒØ ÐÓ ÒÓÑ Ò ÑÓ× Net Graph<TNode,TArc,T>º
    Ð Ö Ñ ÒØ ¸ Ò ÙÒ Ö          ÑÓ× Ñ Ò Ö Ó× Ú ÐÓÖ × ÒÓÑ Ò Ð × Ð ÖÓ Ó Ð ¹
Ñ ÒØÓ Ò ÙØÖÓ Ð ×ÙÑ Ý Ð Ò¬Ò ØÓ¸ ÐÓ× Ù Ð × ¬Ò ÑÓ× Ð × Ù ÒØ Ñ Ò Ö
 Å Ñ ÖÓ× Net Graph<TNode,TArc,T>       ≡             ´   µ
  mutable Flow_Type Infinity;
     Ð Ò   Ó × Ò Ð Net Graph<TNode,TArc,T> Ö × Ò ÕÙ ÐÓ× Ö Ó× Ñ Ò Ò
Ð          Ô      Ý ­Ù Óº È Ö ÐÐÓ¸ ¬Ò ÑÓ× ÙÒ ÒÙ ÚÓ Ø ÔÓ     Ö Ó¸ Ö Ó
Graph Arc<Arc Type>¸ Ô Ö × Ö Ù× Ó ÓÒ Net Graph<TNode,TArc,T>
  ÖÓ Ö         ≡
      template <typename Arc_Info, typename F_Type = long>
  class Net_Arc : public Graph_Arc<Arc_Info>
  {
    typedef F_Type Flow_Type;
    Flow_Type      cap;
    Flow_Type      flow;
     Å Ñ ÖÓ× Net Arc<Arc Info,F Type> ¼
  };
Í× × Graph Arc   º
    Ä Ð × Net Arc<Arc Info,F Type> ×ÓÐÓ × ×Ø Ò ÑÓ Ð Þ Ö ÒרÖÙÑ ÒØ Ö Ð Ù¹
Ò × Ú Ð ÓÒ × ÒÓ × ×Ø Ò Òר Ò Ö× ÔÓÖ Ð Ù×Ù Ö Ó Ò        Ö× Ñ ÒØ Ð ÙÒÓ
   ×Ù× Ñ ØÓ Ó׺
         ØÓ×    × ÑÔ ÒÓ Ò Ø ÑÔÓ¸ Ò ØÖ Ñ ÒØÓ ÙÒ ÔÓ Ó       ×Ô Ó¸ Ô ÖÓ Ò
 Ð ÒØ Ö × Ð Ú Ð ÓÒ¸ ¬Ò ÑÓ× Ð Ð × Net Node<Node Info,F Type> Ö Ú
Graph Node<Node Type>
 ÆÓ Ó Ö        ≡
      template <typename Node_Info, typename F_Type = long>
  class Net_Node : public Graph_Node<Node_Info>
  {
    typedef F_Type Flow_Type;
    size_t in_degree;
    Flow_Type out_cap;
    Flow_Type in_cap;
    Flow_Type out_flow;
    Flow_Type in_flow;
    Net_Node()
746                                                             Cap´
                                                                   ıtulo 7. Grafos



    : in_degree(0), out_cap(0), in_cap(0), out_flow(0), in_flow(0) { /* empty */ }
  };
in degree ÐÑ Ò Ð     ÒØ        Ö Ó× ÒØÖ ÒØ × ´Ð × Ð ÒØ × Ý × Ò Ù ÒØÖ ×
Graph Node<Node Type>µ  ר × ÒØ     × × ÖÚ Ò Ô Ö Ø ÖÑ Ò Ö Ò O(1) ÒÓ Ó× Ù ÒØ ×
Ý ×ÙÑ ÖÓ׺ out cap × Ð    Ô         × Ð Ó × Ð ×ÙÑ        ØÓ × Ð × Ô         ×
   ÐÓ× Ö Ó× × Ð Ñ ÒØÖ × ÕÙ in cap × Ð ×ÙÑ          Ð×     ÒØÖ º out flow ×
Ð ×ÙÑ ØÓØ Ð ­Ù Ó ÒØÖ ÒØ Ñ ÒØÖ × ÕÙ in flow Ð Ð × Ð ÒØ º ר × Ñ Ò ØÙ ×
Ô ÖÑ Ø Ò Ú Ö ¬ Ö Ð ÓÒ ÓÒ ÓÒ× ÖÚ ÓÒ ­Ù Ó¸ × ÙÒ ´ º½¼µ¸ Ñ ÒØ Ð ÔÖ             Ó
out flow == in flowº ÄÓ× ØÖ ÙØÓ×   ÙÒ ÒÓ Ó Ö ×ÓÒ Ó × ÖÚ Ð × Ñ ÒØ Ð ×
× Ù ÒØ × ÔÖ Ñ Ø Ú ×
 Å Ñ ÖÓ× Net Graph<TNode,TArc,T>       +≡        ´  µ
  const   Flow_Type & get_in_cap(Node * node) const { return node->in_cap; }
  const   Flow_Type & get_out_cap(Node * node) const { return node->out_cap; }
  const   size_t & get_in_degree(Node * node) const { return node->in_degree; }
  const   size_t & get_out_degree(Node * node) const { return get_num_arcs(node); }
  const   Flow_Type & get_out_flow(Node * node) const { return node->out_flow; }
  const   Flow_Type & get_in_flow(Node * node) const { return node->in_flow; }
      Ô ÖØ Ð Ò ÓÖÑ ÓÒ ØÖ ÙØÓ× Node Info Ý Arc Info¸        ÑÓ×   Ö ÒÓØ Ó ÕÙ
Ð × Ð × × Net Arc<Arc Info,F Type> Ý Net Node<Node Info,F Type> Ñ Ò Ò ÓÑÓ
Ô Ö Ñ ØÖÓ ÔÐ ÒØ ÐÐ ÙÒ Ø ÔÓ Ö ØÑ Ø Ó ÐÐ Ñ Ó F Type¸ ÜÔÓÖØ Ó ÔÓÖ Ñ × Ð × × Ó
 Ð × ÒÓÒ ÑÓ Flow Typeº ÈÓÖ ÓÑ × ÓÒ¸ Flow Type × long¸ Ô ÖÓ Ò ÔÙ Ö × Ö float Ó
 Ù ÐÕÙ Ö ÓØÖÓ Ø ÔÓ Ð Ö Óº
    Ä Ö × ¬Ò Ñ ÒØ Ð Ø ÔÓ Net Graph<TNode,TArc,T> ÙÝ ×Ô ¬ ÓÒ ¹
Ò Ö Ð × ÓÑÓ × Ù
Net Graph<TNode,TArc,T>      ≡
     template <class NodeT, class ArcT>
 class Net_Graph : public List_Digraph<NodeT, ArcT>
 {
   typedef List_Digraph<NodeT, ArcT> Digraph;
   typedef ArcT Arc;
   typedef NodeT Node;
   typedef typename Arc::Flow_Type Flow_Type;
   typedef typename Node::Node_Type Node_Type;
   typedef typename Arc::Arc_Type Arc_Type;
  Å Ñ ÖÓ× Net Graph<TNode,TArc,T>
 };
Í× × List Digraph ½ º
   ÄÓ× × ÒÓÒ ÑÓ×        Ø ÔÓ× Ø Ò Ò ÐÓ× Ñ ×ÑÓ× × ÒØ Ó× ÕÙ Ô Ö ÐÓ× Ø ÔÓ×        Ö Ó
List Graph<Node, Arc>      Ý List Digraph<Node, Arc>º
7.10.3     Manejos de varios fuentes o sumideros
 × Ð ÖÓ ÕÙ ÙÖ ÒØ Ð ÓÒרÖÙ ÓÒ             ÙÒ Ö Ü ×Ø Ö Ò Ú Ö Ó× Ù ÒØ × Ý ×ÙÑ ÖÓ׺
Ë Ò Ñ Ö Ó¸ × ÔÐ Ù× Ð ¸ Ø ÒØÓ Ò Ú Ð      Ð ÔÖÓÔ Ó Ì ¸ × ÓÑÓ Ð × Ó¸ Ø Ò Ö ÙÒ Ö
 ÓÒ Ú Ö Ó× Ù ÒØ × Ý ×ÙÑ ÖÓ׺
   È Ö ÓÒÓ Ö Ö Ô Ñ ÒØ ÐÓ× ÒÓ Ó×        Ù ÒØ × Ý ×ÙÑ ÖÓ× × ÙØ Ð Þ Ò × Ò Ó× ÓÒ ÙÒØÓ×
  Ò Ñ Ó× ÙÝ ÑÔÐ ÒØ ÓÒ × × Ò             Ð Ø ÔÓ set<T> Ð    Ð ÓØ      ר Ò Ö C++¸ Ð
7.10. Redes de flujo                                                                  747



Ù Ð Ò ALEPH ר × Ó Ò Ö ÓÐ × Ò Ö Ó×                    Ù×ÕÙ         Ð ØÓÖ Ñ ÒØ ÕÙ Ð Ö Ó×
 Ð Ø ÔÓ ØÖ Ô ×ØÙ Ó Ò Ü º¿ ´Ô Ò  µ
Å Ñ ÖÓ× Net Graph<TNode,TArc,T>  +≡                       ´    µ
 Aleph::set<Node*> src_nodes;
 Aleph::set<Node*> sink_nodes;
   src nodes ÐÑ Ò Ð Ð ×Ø       ÒÓ Ó× Ù ÒØ Ý tgt nodes Ð     ×ÙÑ ÖÓ׺ Ù Ò Ó
× Ö ÙÒ ÒÓ Ó¸ ר × Ò× ÖØ Ò Ñ Ó× Ö ÓР׺ Ù Ò Ó × Ò× ÖØ ÙÒ Ö Ó¸ × Ð Ñ Ò
×Ù ÒÓ Ó ÓÖ Ò sink nodes Ý ×Ù ×Ø ÒÓ src nodesº            ר ÑÓ Ó¸ Ò Ù ÐÕÙ Ö
ÑÓÑ ÒØÓ ÓÒÓ ÑÓ× ÐÓ× Ù ÒØ × Ý ×ÙÑ ÖÓ× Ð Ö º
   È Ö ÓÒÓ Ö ÐÓ× ÒÓ Ó× Ù ÒØ × Ó ÐÓ× ×ÙÑ ÖÓ׸ × ÜÔÓÖØ Ò ÔÖ Ñ Ø Ú × Ö Ö Ò
ÐÓ× ÓÒ ÙÒØÓ×
 Å Ñ ÖÓ× Net Graph<TNode,TArc,T>       +≡       ´    µ
 Aleph::set<Node*> & get_src_nodes() { return src_nodes; }
 Aleph::set<Node*> & get_sink_nodes() { return sink_nodes; }
ÈÓÖ Ö ÞÓÒ × ÔÖ Ø × Ð × Ö Ö Ò × ×ØÓ× ÓÒ ÙÒØÓ× ÒÓ ×ÓÒ ÓÒר ÒØ ׸ Ô ÖÓ ×Ø × ÒÓ
 ר Ò ×Ø Ò × ÑÓ ¬ ÓÒº
    Ä ÙØ Ð Þ ÓÒ ÙÒ ×ÓÐÓ Ù ÒØ Ý ÙÒ ×ÓÐÓ ×ÙÑ ÖÓ Ò ÙÒ Ö × ÔÓÖ × ÑÔÐ
Ñ Ø Ñ Ø Ý Ð ÓÖ ØÑ º Ë Ð Ö ÔÓ× Ñ × ÙÒ Ù ÒØ Ó ×ÙÑ ÖÓ¸ ÒØÓÒ × ×Ø ×
Ö Ù      ÓÐÓ Ö ÙÒ ÒÓ Ó ×ÙÔÖ ¹ Ù ÒØ ÙÒ Ó¸ ÕÙ ÒÓ × Ô ÖØ ÐÓ      Ð Ö ¸ ÓÒ Ø Ó
  ÐÓ× Ù ÒØ × ØÖ Ú ×      Ö Ó× ÓÒ Ô         Ù Ð Ð ×ÙÑ      Ð× Ô       × ÐÓ×
 Ö Ó× × Ð       ØÓ Ó× ÐÓ× Ù ÒØ ׺ Ð Ñ ×ÑÓ ÑÓ Ó¸ ÐÓ× ×ÙÑ ÖÓ× × ÓÒ Ø Ò ÙÒ ×ÓÐÓ
 ×ÙÔÖ ¹×ÙÑ ÖÓ ÓÒ Ö Ó×          Ô       Ù Ð Ð ×ÙÑ ØÓ × Ð × Ô          × ÐÓ×
 Ö Ó× ÒØÖ         ØÓ Ó× ÐÓ× ×ÙÑ ÖÓ׺ Ä ¬ ÙÖ º ¾ ÐÙ×ØÖ ÙÒ ÑÔÐÓº
                                                      A                  F

  A               f1         F                  FA             D                 I
         f2                        f6                                                 FI
                 D                      I   S    FB   B                  G                  T
         f3                       f7
                                                                                      FJ
  B                          G                  FC             E                 J
          f4                       f8
                 E                      J             C                  H
         f5                       f9
  C               f6         H

  ´ µÊ         ÓÒ Ú Ö Ó× Ù ÒØ × Ý ×ÙÑ ÖÓ×       ´ µ Ä Ñ ×Ñ Ö   ÓÒ ÙÒ ×ÙÔÖ Ù ÒØ Ý ×ÙÑ ÖÓ

   ÙÖ º ¾ ÑÔÐÓ Ö Ù ÓÒ ÙÒ Ö ÓÒ Ú Ö Ó× ÒÓ Ó× Ù ÒØ × Ý ×ÙÑ ÖÓ× ÙÒ
 ÓÒ ÙÒ ×ÙÔÖ ¹ Ù ÒØ Ý ÙÒ ×ÙÔÖ ¹×ÙÑ ÖÓº Ä Ô       ÐÓ× ×ÙÔÖ ¹ Ö Ó× ÕÙ Ñ Ò Ò
  × Ð Ù ÒØ × FA = Ô(ÇÍÌ(A)), FB = Ô(ÇÍÌ(B)), FC = Ô(ÇÍÌ(C))¸ Ý Ð ÐÓ×
ÕÙ ÖÖ Ò Ð ×ÙÑ ÖÓ FI = Ô(ÁÆ(J)), FJ = Ô(ÁÆ(J))º
   Ä Ò ÙÖ       ×ÙÔÖ ¹ÒÓ Ó× × Ö Ð Þ              ØÖ Ú ×   Ð × Ù ÒØ      ÑÐ     ÔÖ Ñ Ø Ú ×
ÔÙ Ð ×
 Å Ñ ÖÓ× Net Graph<TNode,TArc,T>                +≡        ´    µ
 void make_super_source()
 {
   DynDlist<Node*> src_list;
   for (typename Aleph::set<Node*>::iterator it = src_nodes.begin();
748                                                          Cap´
                                                                ıtulo 7. Grafos



           it != src_nodes.end(); ++it)
        src_list.append(*it);
      Node * super_source = insert_node();
      while (not src_list.is_empty())
        {
          Node * p = src_list.remove_first();
          insert_arc(super_source, p, get_out_cap(p));
        }
      with_super_source = true;
  }
  void unmake_super_source()
  {
    remove_node(*src_nodes.begin());
    with_super_source = false;
  }
  void make_super_sink()
  {
    DynDlist<Node*> sink_list;
    for (typename Aleph::set<Node*>::iterator it = sink_nodes.begin();
         it != sink_nodes.end(); ++it)
      sink_list.append(*it);
    Node * super_sink = insert_node();
    while (not sink_list.is_empty())
      {
        Node * p = sink_list.remove_first();
        insert_arc(p, super_sink, get_in_cap(p));
      }
    with_super_sink = true;
  }
  void unmake_super_sink()
  {
    remove_node(*sink_nodes.begin());
    with_super_sink = false;
  }
  void make_super_nodes()
  {
    make_super_source();
    make_super_sink();
  }
  void unmake_super_nodes()
  {
    unmake_super_source();
    unmake_super_sink();
  }
Í× × DynDlist ¿ º
 ר × ÔÖ Ñ Ø Ú ×¸ Ò Ô ÖØ ÙÐ Ö Ð × Ó× ÙÐØ Ñ ×¸ × Ö Ò ÒÚÓ × ÔÓÖ ÙÒ Ð ÓÖ ØÑÓ Ð ÙÐÓ
   ­Ù Ó Ñ Ü ÑÓ Ð ÔÖ Ò Ô Ó Ý ¬Ò Ð ×Ù× Ð ÙÐÓ׺
     ÓÑÓ ÔÙ       ÔÖ Ö× ¸ Ð × ÖÙØ Ò × ÑÔÐ Ò Ð × Ò Ö × ÐÓ × with super source
Ý with super sink Ô Ö Ò Ö × Ý Ó ÒÓ ×ÙÔÖ ¹ÒÓ Ó׺ ר × Ò Ö × ×ÓÒ ØÖ ÙØÓ×
Net Graph<TNode,TArc,T>º
7.10. Redes de flujo                                                         749



   ÍÒ Ú Þ ØÖ Ò× ÓÖÑ Ð Ö Ñ ÒØ make super nodes()¸ × Ö ÒØ Þ ÕÙ × Ø Ò
ÙÒ ×ÓÐÓ Ù ÒØ Ý ÙÒ ×ÓÐÓ ×ÙÑ ÖÓº × Ô٠׸ Ú Ð Ð Ô Ò ×ÔÓÒ Ö Ó× Ó × ÖÚ ÓÖ ×
 Å Ñ ÖÓ× Net Graph<TNode,TArc,T>       +≡       ´ µ
 Node * get_source() { return *get_src_nodes().begin(); }
 Node * get_sink() { return *get_sink_nodes().begin(); }


7.10.4   Operaciones topol´gicas sobre una red capacitada
                          o
Net Graph<TNode,TArc,T>Ö ÕÙ Ö ×Ó Ö Ö Ö Ý ÜØ Ò Ö Ð ÙÒ × ÙÒ ÓÒ ×
List Digraph<Node, Arc>¸×Ô ¬ Ñ ÒØ Ð × Ö Ð ÓÒ × ÓÒ Ð Ñ Ò Ó ÒÓ Ó× Ý
Ö Ó׺ ÓÑ Ò ÑÓ× ÔÓÖ Ð Ò× Ö ÓÒ ÙÒ ÒÓ Ó
Å Ñ ÖÓ× Net Graph<TNode,TArc,T>   +≡        ´ µ
 Node * insert_node(const Node_Type & node_info)
 {
   Node * p = Digraph::insert_node(node_info);
   src_nodes.insert(p);
   sink_nodes.insert(p);
   return p;
 }
Ä ÖÙØ Ò Ô Ð    Ð Ñ ÕÙ Ò Ö        List Digraph<Node, Arc>¸   ÙÝÓ × ÒÓÒ ÑÓ ÒØÖÓ
Net Graph<TNode,TArc,T> × Digraphº Ä ×Ó Ö Ö        ÜØ Ò      Ð Ò Ö Ð ÒÙ ÚÓ ÒÓ Ó
  ÐÓ× ÓÒ ÙÒØÓ× src nodes Ý sink nodesº
   ÓÖ Ú ÑÓ× Ð ÜØ Ò× ÓÒ Ô Ö Ð Ò× Ö ÓÒ ÙÒ Ö Ó
Å Ñ ÖÓ× Net Graph<TNode,TArc,T>   +≡     ´             µ        ¼
 virtual Arc * insert_arc(Node * src_node, Node * tgt_node,
                          const typename Arc::Arc_Type & arc_info,
                          const Flow_Type & cap, const Flow_Type & flow)
 {     // inserci´n en la clase base
                 o
   Arc * arc = Digraph::insert_arc(src_node, tgt_node, arc_info);
   src_nodes.erase(tgt_node);    // elimina destino de src_nodes
   sink_nodes.erase(src_node);   // elimina fuente de sink_nodes
   arc->cap = cap;               // ajuste capacidad y flujo de arco
   arc->flow = flow;
   tgt_node->in_degree++;         // actualiza informaci´n de control de nodo
                                                        o
   src_node->out_cap += cap;
   tgt_node->in_cap += cap;
   src_node->out_flow += flow;
   tgt_node->in_flow += flow;
   return arc;
 }
insert arc() ×Ó Ö Ö Ó Ò Ð Þ Ð ×Ø Ó ÐÓ× ­Ù Ó× Ò ÐÓ× ÒÓ Ó× ÓÖ Ò Ý ×¹
Ø ÒÓ × ÓÑÓ Ð Ö Ó          ÒØÖ       Ð ÒÓ Ó ×Ø ÒÓº ÍÒ Ú Þ ÕÙ Ü ×Ø ÙÒ Ö Ó
src node→tgt node¸ src node        ÓÒ ÖØ ØÙ     × Ö ÙÒ ×ÙÑ ÖÓ¸ Ñ ÒØÖ × ÕÙ
tgt node         × Ö Ù ÒØ      ÐÐ Ð × Ð Ñ Ò ÓÒ × ÐÓ× ÓÒ ÙÒØÓ× src nodes Ý
sink nodesº
         ØÓ× Ú Ö× Ø Ð ¸ Net Graph<TNode,TArc,T> ÜÔÓÖØ Ú Ö× ÓÒ × ×Ó Ö Ö ×
   insert arc() ÓÒ ×Ø ÒØ × ÔÖ × ÒØ ÓÒ × Ô Ö Ô Ö Ñ ØÖÓ×    Ô        Ý ­Ù Ó
750                                                          Cap´
                                                                    ıtulo 7. Grafos



    Ð × Ù Ð × ÕÙ Þ Ð Ñ × ÒØ Ö × ÒØ ×
¼    Å Ñ ÖÓ× Net Graph<TNode,TArc,T>        +≡        ´    µ        ¼
     virtual Arc * insert_arc(Node * src_node, Node * tgt_node, const Flow_Type & cap)
     {
       return insert_arc(src_node, tgt_node, Arc_Type(), cap, 0);
     }
        Ä Ð Ñ Ò ÓÒ ÙÒ Ö Ó Ö ÕÙ Ö ØÙ Ð Þ Ö Ð Ö Ó             ÒØÖ     Ð ÒÓ Ó ×Ø ÒÓ
    Ý ÐÓ× ÙÑÙÐ Ó× ­Ù Ó× ÐÓ× ÒÓ Ó׸ × ÓÑÓ Ð Ò ÙÖ Ú ÒØÙ Ð Ò ÐÓ× ÓÒ ÙÒ¹
    ØÓ× src nodes Ý sink nodesº ÈÓÖ ×Ó¸ Ò Net Graph<TNode,TArc,T> Ø Ñ Ò     ÑÓ×
    ×Ó Ö Ö Ö
¼    Å Ñ ÖÓ× Net Graph<TNode,TArc,T>        +≡        ´   µ   ¼   ¼
     virtual void remove_arc(Arc * arc)
     {
       Node * src = get_src_node(arc);
       Node * tgt = get_tgt_node(arc);
       if (--(tgt->in_degree) == 0)
         src_nodes.insert(tgt);
       src->out_cap -= arc->cap;
       src->out_flow -= arc->flow;
       tgt->in_cap   -= arc->cap;
       tgt->in_flow -= arc->flow;
       Digraph::remove_arc(arc);
       if (get_num_arcs(src) == 0)
         sink_nodes.insert(src);
     }
        Ä Ð Ñ Ò ÓÒ ÙÒ ÒÓ Ó Ö ÕÙ Ö Ð Ñ Ò Ö ÐÓ× ÓÒ ÙÒØÓ× src nodes Ý sink nodes
    ´ Ò ×Ó ÕÙ Ð ÒÓ Ó × Ò Ù ÒØÖ Ò Ð ÙÒÓ             ÐÐÓ×µ¸ Ô ÖÓ Ø Ñ Ò Ö ÕÙ Ö ØÙ ¹
    Ð Þ Ö ÐÓ× ×Ø Ó× ÐÓ× ÒÓ Ó× ÓÒ Ø Ó× ÔÓÖ ÐÓ× Ö Ó× Ð ÒÓ Ó Ð Ñ Ò Óº Ò Ð Ð ×
    List Graph<Node, Arc> ×ØÓ × Ö ×Ù ÐÚ ÐÐ Ñ Ò Ó ×Ù × Ú Ñ ÒØ       remove arc()º ÕÙ
       Ý ÕÙ      Ö ÐÓ Ñ ×ÑÓ Ñ × Ð Ð Ñ Ò ÓÒ ÐÓ× ÓÒ ÙÒØÓ× src nodes Ý sink nodesº
    ËÙÖ ÒØÓÒ × Ð ÔÖ ÙÒØ ÔÓ ÑÓ× Ö Ù× Ö List Graph<Node, Arc>::remove node()
    Ä Ö ×ÔÙ ×Ø × ¬ÖÑ Ø Ú ¸ ÔÙ × remove arc() × ÙÒ Ñ ØÓ Ó Ú ÖØÙ Ð × Ð Ð × ×
    List Graph<Node, Arc>º       ר ÑÓ Ó¸ ÒרÖÙÑ ÒØ Ö remove node() × ÑÙÝ × ÑÔÐ
¼    Å Ñ ÖÓ× Net Graph<TNode,TArc,T>        +≡        ´    µ     ¼    ¼
     virtual void remove_node(Node * p)
     {
       Digraph::remove_node(p);
       src_nodes.erase(p);
       sink_nodes.erase(p);
     }
    Ä ÒרÖÙ ÓÒ ¬Ò Ð Digraph::remove node(p) ÒÚÓ Ö Ð Ð Ñ Ò ÓÒ            ÐÓ× Ö Ó×
       ÙÒ ÒÓ Ó ´Ú Ö Ü º¿º½¼º ´Ô Ò         µµº ÈÙ ×ØÓ ÕÙ remove arc() × Ú ÖØÙ Ð¸
    Digraph::remove node(p) ÒÚÓ     Net Graph<TNode,TArc,T>::remove arc()º
       ÅÙ Ó× ÔÖÓ Ð Ñ × Ö Ó× × Ö ×Ù ÐÚ Ò ØÖ Ú × Ö × ­Ù Óº × ÔÙ × ÔÐ Ù× Ð Ý
    ÔÖÓ Ð ÓÒרÖÙ Ö ÙÒ Ö Ô ÖØ Ö ÙÒ Ö Ó Ý Ü ×Ø ÒØ ¸ Ö ×ÓÐÚ Ö ÓÒ ÐÐ Ð ÔÖÓ Ð Ñ
     Ò Ù ×Ø ÓÒ¸ Ý ÐÙ Ó Ö Ö × Ö Ð Ö Ó ÓÖ Ò Ðº ÈÓÖ ×Ø Ö ÞÓÒ¸ × × Ð ×ÔÓÒ Ö ÙÒ
     ÓÒרÖÙ ØÓÖ ÓÔ        Ö Ó ÕÙ ÒÓ× ÓÒרÖÙÝ ÙÒ Ö Ñ Ô
¼    Å Ñ ÖÓ× Net Graph<TNode,TArc,T>        +≡       ´    µ  ¼  ½
7.10. Redes de flujo                                                                   751



     Net_Graph(Digraph & digraph)
     {
       Net_Graph::Net_Graph();     // inicializa atributos
       copy_graph(*this, digraph, true); // copia mapeada
     }
    À Ý ÓØÖÓ ÓÒרÖÙ ØÓÖ Net Graph(Net Graph & net)¸ Ð Ù Ð ÒÓ Ö Ð Þ Ð ÓÔ Ñ Ô º
       È Ö ÕÙ Ð ÓÒרÖÙ ØÓÖ Ô ÖØ Ö ÙÒ Ö Ó Ø Ò × ÒØ Ó¸ × Ö ÕÙ Ö ÔÓ Ö Ò Ö Ó
    ÑÓ ¬ Ö ÐÓ× Ú ÐÓÖ ×       Ô      Ý ­Ù Óº È Ö ÐÐÓ¸ ÜÔÓÖØ ÑÓ× Ð × Ù ÒØ Ô Ö
    ÔÖ Ñ Ø Ú ×
½    Å Ñ ÖÓ× Net Graph<TNode,TArc,T>        +≡        ´   µ    ¼    ½
     void set_cap(Arc * arc, const Flow_Type & cap)
     {
       const Flow_Type old_cap = arc->cap;
       arc->cap = cap;
       Node * src_node = get_src_node(arc);
       src_node->out_cap -= old_cap;
       src_node->out_cap += cap;
       Node * tgt_node = get_tgt_node(arc);
       tgt_node->in_cap -= old_cap;
       tgt_node->in_cap += cap;
     }
     void set_flow(Arc * arc, const Flow_Type & flow)
     {
       const Flow_Type old_flow = arc->flow;
       arc->flow = flow;
       Node * src_node = get_src_node(arc);
       src_node->out_flow -= old_flow;
       src_node->out_flow += flow;
       Node * tgt_node = get_tgt_node(arc);
       tgt_node->in_flow -= old_flow;
       tgt_node->in_flow += flow;
     }
    ÈÓÖ ×ÙÔÙ ×ØÓ¸ Ø Ñ Ò  ÑÓ× ÔÓ Ö ÓÒÓ Ö ÐÓ× ØÖ ÙØÓ×              Ö       ×Ó       Ó× ÙÒ Ö ¸ ÐÓ
    ÕÙ Ö Ð Þ ÑÓ× Ñ ÒØ Ó× Ó × ÖÚ ÓÖ ×
½    Å Ñ ÖÓ× Net Graph<TNode,TArc,T>  +≡        ´            µ       ½        ½
     const Flow_Type & get_flow(Arc * arc) const { return arc->flow; }
     const Flow_Type & get_cap(Arc * arc) const { return arc->cap; }
     ÍÒ ÖÙØ Ò ×Ø ÒØ × Ð ÓÒ× ×Ø Ò Ö ¹ Ò Ö ÙÒ Ö                        ×ØÓ ×¸ ÓÐÓ Ö ×Ù Ú ÐÓÖ
     ­Ù Ó Ò ÖÓ
½   Å Ñ ÖÓ× Net Graph<TNode,TArc,T> +≡    ´   µ                      ½        ¾
     void reset()
     {
       for (Arc_Iterator<Net_Graph> it(*this); it.has_current(); it.next())
         it.get_current()->flow = 0;
       for (Node_Iterator<Net_Graph> it(*this); it.has_current(); it.next())
         {
           Node * p = it.get_current();
           p->in_flow = p->out_flow = 0;
         }
752                                                                                          Cap´
                                                                                                    ıtulo 7. Grafos



      }
    Í× × Arc Iterator            Ò   Node Iterator       º
      ÈÖÓ Ð Ñ ÒØ ÙÒ Ð × ÔÖ Ñ Ø Ú × ÙÒ Ñ ÒØ Ð × × ÓÒÓ Ö Ð Ú ÐÓÖ Ð ­Ù Ó                                            Ð
    Ö
¾    Å Ñ ÖÓ× Net Graph<TNode,TArc,T> +≡        ´  µ   ½    ¼
      const Flow_Type & flow_value() { return get_source()->out_flow; }


    7.10.5    Cortes de red
     Ð ÙÒÓ× ÔÖÓ Ð Ñ ×    Ö Ó× ÔÙ Ò ÔÐ ÒØ Ö× Ò Ø ÖÑ ÒÓ× ÙÒ Ö       ÒÚ Ö× Ñ ÒØ º
    ÍÒ ÔÖ Ñ Ö Ú Ò ÙÐÓ ÒØÖ ×Ø × Ó× Ú × ÓÒ × × ÒÓØ Ö Ò Ð ÔÖÓÜ Ñ ¬Ò ÓÒº
    Definici´n 7.12 (Corte de una red)
           o                                             Ë ÙÒ Ö               N =< V, E, s, t, C >º   Ë Ò
       ½º Vs = {s} ∪ {v ∈ V | v = t}
       ¾º Vt = {t} ∪ {v ∈ V | v = s}
    Ì Ð × ÕÙ Vs ∪ Vt = V ∧ Vs ∩ Vt = ∅ × Ö¸ ÙÒ Ô ÖØ ÓÒ × ÙÒØ V ¸ ÒÓÑ Ò
    Vs¸ ÕÙ ÓÒØ Ò Ð ÒÓ Ó Ù ÒØ Ô ÖÓ ÒÓ Ð ×Ø ÒÓ Ý Vt¸ ÕÙ ÓÒØ Ò Ð ÒÓ Ó ×Ø ÒÓ Ô ÖÓ
    ÒÓ Ð Ù ÒØ º
        ÍÒ ÓÖØ        Ð Ö N¸ ÒÓØ Ó < Vs, Vt >¸ × ¬Ò ÔÓÖ Ð ÓÒ ÙÒØÓ                 Ö Ó× ÕÙ
     ÓÒ Ø Ò ÒÓ Ó× Vs              ÒÓ Ó× Vtº
        ÆÓØ ÑÓ× ÕÙ < Vs, Vt > ÒÓ ÓÒØ Ò ÐÓ× Ö Ó× ÕÙ Ú Ò × Vt               < Vs, Vt >º ר
     ÓÒ ÙÒØÓ × ÒÓØ ÓÑÓ < Vs, Vt >
        Ä ¬ ÙÖ º ¿ ÐÙ×ØÖ ÙÒ ÓÖØ ÓÒ Vs = {A, B, D, F, G, K} Ý Vt = {E, H, I, J, L} ÓÒ
    < Vs, Vt >= {(K → E), (D → E), (F → H), (G → H), (G → J)} Ý < Vs, Vt >= {(L → F)}º

                                                                                        Vt
                        Vs                 K         6       E       8          L
                                      5        4     5               4              9    5

                             A             D         4                   7      H       3    I
                                                             F
                                      6                              7                  6
                                               3                 4

                                           B         1       G           10      J



                                 ÙÖ º ¿ ÍÒ ÓÖØ ×Ó Ö Ð Ö                             Ð ¬ ÙÖ º ¼
          Ñ ÒÙ Ó¸ Ð Ð Ø Ö ØÙÖ  Ö Ó× ÒÓÑ Ò < Vs, Vt > ÓÑÓ ÙÒ ÓÖØ ×¹Ø ¸ ÔÓÖ Ð
        Ó ÕÙ ×ÓÒ ÐÓ× ÒÓ Ó× Ù ÒØ Ý ×ÙÑ ÖÓ ÐÓ× ÕÙ ÓÑ Ò Ò Ð Ô ÖØ ÓÒº
         Ð ×ÙÒØÓ × Ò Ð Ð Ô Ö Ò ÓÒ ÒØÖ Ð Ö Ý Ð Ö Ó × Ð Ö Ø Ö Ò Ñ Ó ÙÒ
    ­Ù Ó Ò Ð ØÙ Ö º Ë ¸ ÔÓÖ ÑÔÐÓ¸ Ö ÑÓ× ÙÒ ÐÐ Ú Ý ÒÓ ×ÙÖØ Ù ¸ ÒØÓÒ × ÒØÙ ÑÓ×
    ÕÙ Ý ÙÒ ÓÖØ Ò Ð ÙÒ Ô ÖØ º Ä Ö Ð ÓÒ ÓÒ Ø Ú            ÙÒ Ö Ó ÔÙ ×ØÙ Ö×
    × ÙÒ ×Ø ÒØÙ ÓÒº Ë Ø Ò ÑÓ× ÙÒ Ö Ó Ý × ÑÓ× Ú Ö Ù Ö ×Ù ÓÒ Ø Ú ¸ ÒØÓÒ ×
    ÔÓ Ö ÑÓ× ÒÝ Ø ÖÐ ÙÒ ­Ù Ó Ð ­Ù Ó Ô ÖÑ Ö ØÓ Ó× ÐÓ× ÒÓ Ó× ÓÒ Ø Ó׺
7.10. Redes de flujo                                                                                      753



Definici´n 7.13 (Valor de flujo de un corte)
       o                                                       Ë ÙÒ Ö N =< V, E, s, t, C             >    ÓÒ
­Ù Ó f Ý ÙÒ ÓÖØ Ù ÐÕÙ Ö < Vs, Vt >º Ð Ú ÐÓÖ                     ­Ù Ó Ð ÓÖØ × ¬Ò ÓÑÓ
                  ­Ù Ó(< Vs, Vt >, f) =                        f(e) −                f(e)            ´ º½¾µ
                                                ∀e∈ÇÍÌ(Vs )             ∀e∈ÁÆ(Vt )

  ÓÒ ÇÍÌ(Vs) ×ÓÒ ÐÓ× Ö Ó× Ð ÓÖØ ÕÙ Ú Ò × Vs                                          Vt    ݸ Ö ÔÖÓ Ñ ÒØ ¸
ÁÆ(Vt) ×ÓÒ ÐÓ× Ö Ó× Ð ÓÖØ ÕÙ Ú Ò × Vt   Vsº

Proposici´n 7.7 (Equivalencia de flujo entre una red y un corte) Ë
          o                                                                                         ÙÒ Ö
N =< V, E, s, t, C > ÓÒ ­Ù Ó f Ý ÙÒ ÓÖØ Ù ÐÕÙ Ö < Vs, Vt >º ÒØÓÒ ×

                            ­Ù Ó(< Vs, Vt >, f)       =   ­Ù Ó(N, f) =⇒                              ´ º½¿µ
                          f(e) −                f(e) =                  f(e) −               f(e)    ´ º½ µ
            ∀e∈ÇÍÌ(Vs )            ∀e∈ÁÆ(Vt )             ∀e∈ÇÍÌ(s)              ∀e∈ÁÆ(s)

                                                      =                 f(e)
                                                          ∀e∈ÇÍÌ(s)
Demostraci´n
          o       Ë       ÑÓ× ÔÓÖ ¬Ò ÓÒ¾ ¸ ÕÙ
                       ­Ù Ó(N, f) =                   f(e) −                  f(e) .
                                       ∀e∈ÇÍÌ(Vs )               ∀e∈ÁÆ(Vt )

 × Ô٠׸ ÔÓ ÑÓ× ÔÐ ÒØ Ö Ð Ú ÐÓÖ                 ­Ù Ó Ð ÓÖØ ÓÑÓ

               ­Ù Ó(N, f)     =                           f(e) −                f(e)
                                   ∀v∈Vs    ∀e∈ÇÍÌ(v)               ∀e∈ÁÆ(v)

                              =                        f(e) −                        f(e)    .       ´ º½ µ
                                   ∀v∈Vs ∀e∈ÇÍÌ(v)                ∀v∈Vs ∀e∈ÁÆ(v)

    Ü Ñ Ò ÑÓ× Ð × Ù ÒØ × ØÙ ÓÒ Ô ØÓÖ                       Ò Ð ÕÙ ×            ÒØ ¬ ÙÒ ÒÓ Ó v ∈ Vs¸ Ð
Ù Ð ÔÙ     Ò Ö Ð Þ Ö× × Ò Ò Ò ÙÒ ÔÖÓ Ð Ñ
                                                 Vt
                  Vs

                                                                                       t
                        s
                                        v


                                                          {e ∈ ÇÍÌ(v) | e ∈< Vs , Vt >}


                   {e ∈ ÇÍÌ(v) | e ∈< Vs , Vt >}
                                   /

     ÕÙ ×    ×ÔÖ Ò ÕÙ ÐÓ× Ö Ó×              ×Ð            v   ÔÙ Ò Ô ÖØ ÓÒ Ö× Ò
       ÇÍÌ(v) = {e ∈ ÇÍÌ(v) | e ∈< Vs, Vt >}
                                /                             ∪ {e ∈ ÇÍÌ(v) | e ∈< Vs, Vt >}
 ¾
      Ò ×Ø ÔÙÒØÓ × × Ò Ð Ö ÓÖ Ö Ó ÒÓØ Ö ÕÙ ÔÙ ×ØÓ ÕÙ Ð Ù ÒØ s ÒÓ Ø Ò Ö Ó×    ÒØÖ ¸ Ð
Ö ×Ø Ò Ó ∀e∈ÁÆ(s) f(e) = 0º ÈÓÖ ÓÒ× Ù ÒØ Ð ­Ù Ó ÙÒ Ö × ∀e∈ÇÍÌ(s) f(e) − ∀e∈ÁÆ(s) f(e) =
   ∀e∈ÇÍÌ(s) f(e) ÐÓ ÕÙ ×  ÓÖÖ ×ÔÓÒ ÓÒ ´ º½½µº
754                                                                                      Cap´
                                                                                            ıtulo 7. Grafos



 × Ö¸ ÐÓ× Ö Ó× ÕÙ ÓÒ Ø Ò ÒÓ Ó× Ô ÖØ Ò ÒØ × Vs Ý ÐÓ× ÕÙ ÓÒ Ø Ò ÒÓ Ó×
Ô ÖØ Ò ÒØ × Vt ¾ º ÜØ Ò Ò Ó ×Ø Ó × ÖÚ ÓÒ Ô Ö ØÓ Ó Ð ÓÒ ÙÒØÓ Vs¸ ÒØÓÒ ×

        ÇÍÌ(v)    =              {e ∈ ÇÍÌ(v) | e ∈< Vs, Vt >} ∪ {e ∈ ÇÍÌ(v) | e ∈< Vs, Vt >}
                                                 /
∀v∈Vs                 ∀v∈Vs
                  = {e ∈ ÇÍÌ(Vs) | e ∈< Vs, Vt >} ∪ < Vs, Vt >
                                     /                                                                    ´ º½ µ
 ר Ö ×ÙÐØ Ó ÒÓ× Ô ÖÑ Ø ÓÖÑÙÐ Ö
                           f(e) =                                f(e)       +                   f(e)     ´ º½ µ
         ∀v∈Vs ∀e∈ÇÍÌ(v)            ∀e∈{e∈ÇÍÌ(v)|e/ s ,Vt >}
                                                  ∈<V                            ∀e∈<Vs ,Vt >


        Ð Ñ ×ÑÓ ÑÓ Ó¸ ÓÒ Ð Ö ×ÙÐØ Ó Ò ÐÓ Ó ´ º½ µ¾
                                f(e) =                              f(e)       +                  f(e)   ´ º¾¼µ
              ∀v∈Vs ∀e∈ÁÆ(v)             ∀e∈{e∈ÁÆ(v)|e/ s ,Vt >}
                                                      ∈<V                          ∀e∈<Vs ,Vt >

ËÙ ×Ø ØÙÝ Ò Ó ´ º½ µ Ý ´ º¾¼µ Ò ´ º½ µ
             ­Ù Ó(N, f)     =                                  f(e)        +                  f(e) −
                                   ∀e∈{e∈ÇÍÌ(v)|e/ s ,Vt >}
                                                 ∈<V                           ∀e∈<Vs ,Vt >

                                                             f(e)     −                   f(e)           ´ º¾½µ
                                   ∀e∈{e∈ÁÆ(v)|e/ s ,Vt >}
                                                ∈<V                        ∀e∈<Vs ,Vt >

Ä ÔÖÙ       Ö ÕÙ Ö ÔÖ Ò Ö ÕÙ
                                               f(e) =                                    f(e) .
                  ∀e∈{e∈ÇÍÌ(v)|e/ s ,Vt >}
                                ∈<V                       ∀e∈{e∈ÁÆ(v)|e/ s ,Vt >}
                                                                       ∈<V

     Ó¸ ÐÓ ÕÙ Ñ ×ÓÒ ÐÓ× ÒÓ Ó׸ Ô ÖÓ ÐÓ× Ö Ó× ×ÓÒ ÐÓ× Ñ ×ÑÓ׸ ÔÙ × ÙÒ Ö Ó ÕÙ ×
  × Ð Ò ÙÒ ÒÓ Ó ÐÓ × ÒØÖ       Ò ×Ù ×Ø ÒÓº ÔÖ Ò Ó ×ØÓ¸ ´ º¾½µ × ÔÐ ÒØ
 ÓÑÓ
              ­Ù Ó(N, f) =         f(e) −              f(e) ,
                                         ∀e∈<Vs ,Vt >             ∀e∈<Vs ,Vt >

ÐÓ Ù Ð¸ ÔÓÖ Ð ÓÒ ÓÒ        ÓÒ× ÖÚ ÓÒ Ð ­Ù Ó¸ × ÓÖÖ ×ÔÓÒ ÓÒ Ð ­Ù Ó Ð ÒÓ Ó
 Ù ÒØ ¸ ÔÙ × Ò Ð Ö ×ØÓ ÐÓ× ÒÓ Ó× ×Ø × ÓÒ× ÖÚ Ý Ð    Ö Ò × ÒÙÐ
     ÓÑÓ ÓÖÓÐ Ö Ó Ð ÔÖÓÔÓ× ÓÒ ÒØ Ö ÓÖ ÔÓ ÑÓ× ×Ø Ð Ö ÕÙ ¸ Ó ÙÒ ÓÖØ
< Vs, Vt >¸ ÒØÓÒ ×

             ­Ù Ó(< Vs, Vt >, f)       =                f(e) =              f(e) =       ­Ù Ó(N, f)      ´ º¾¾µ
                                           ∀e∈ÇÍÌ(s)             ∀e∈ÁÆ(t)

 ¾
      Ò ÐÓ Ñ ÒØ
                  ÁÆ(v) = {e ∈ ÁÆ(v) | e ∈< Vs , Vt >}
                                         /                ∪ {e ∈ ÁÆ(v) | e ∈< Vs , Vt >} .               ´ º½ µ

 ¾
                        [
                                ÁÆ(v) = {e ∈ ÁÆ(Vs ) | e ∈< Vs , Vt >} ∪
                                                         /                     < Vs , Vt >               ´ º½ µ
                       ∀v∈V s
7.10. Redes de flujo                                                                                        755



7.10.6     Flujo m´ximo/corte m´
                  a            ınimo
Ä          Ö Ý ­Ù Ó Ó Ö Ñ ÝÓÖ ÒØ Ö × Ù Ò Ó ÒÓ× ÔÖ ÙÒØ ÑÓ× ÓÑÓ Ò ÓÒØÖ ÑÓ×
ÙÒ ­Ù Ó f Ø Ð Ñ Ò Ö ÕÙ ×Ø × Ñ Ü ÑÓ º Ì Ð ­Ù Ó Ñ Ü ÑÓ × ÒÓØ ÓÑÓ f∗ º
     × Ò ÐÑ ÒØ ¸ ר × Ð ÔÖÓ Ð Ñ ÒרÖÙÑ ÒØÓ       ר × ÓÒ Ý¸ ÐÓ Ð ¬ ÑÓ×
ÒרÖÙÑ ÒØ Ð ÔÓÖÕÙ Ð ÔÖÓ Ð Ñ Ð ­Ù Ó Ñ Ü ÑÓ × Ú ÙÐÓ Ö ×ÓÐÙ ÓÒ ÙÒ ÑÔÐ
  Ñ      ÓØÖÓ× ÔÖÓ Ð Ñ ×º Ò ×Ø × ÒØ Ó¸ ÒÓ× ÓÒÚ Ò ÑÓ×ØÖ Ö Ð Ô Ö Ð Ð ×ÑÓ ÒØÖ ÙÒ
­Ù Ó Ñ Ü ÑÓ Ý ÙÒ ÓÖØ       Ô      Ñ Ò Ñ ÐÓ ÕÙ Ö ÕÙ Ö Ð × Ù ÒØ ¬Ò ÓÒº
Definici´n 7.14 (Capacidad de un corte) Ë
       o                                                  ÙÒ Ö N =< V, E, s, t, C > Ý ÙÒ ÓÖØ
Ù ÐÕÙ Ö < Vs, Vt >º Ä Ô         Ð ÓÖØ ¸                  ÒÓØ   ÓÑÓ Ô(< Vs, Vt >)¸ × ¬Ò
ÓÑÓ Ð ×ÙÑ          Ð× Ô               ×     ÐÓ× Ö Ó× Ô ÖØ Ò ÒØ × Ð ÓÖØ º Ç ×
                                    Ô(< Vs, Vt >) =                       Ô(e)                           ´ º¾¿µ
                                                         ∀e∈<Vs ,Vt >

     Ò ÓÒØÖ Ö Ð ­Ù Ó Ñ Ü ÑÓ ÙÒ Ö ×Ø ×ØÖ Ñ ÒØ Ö Ð ÓÒ Ó ÓÒ Ò ÓÒØÖ Ö ÙÒ
 ÓÖØ      Ô        Ñ Ò Ñ ÔÓÖ Ð × ÑÔÐ Ö ÞÓÒ ÕÙ ÙÒ ­Ù Ó Ñ Ü ÑÓ × Ö Ñ ÒÓÖ
Ó Ù Ð ÕÙ Ð Ñ Ò Ñ Ô            ÔÓ× Ð ÕÙ × Ò Ù ÒØÖ Ò ÙÒ ÓÖØ Ö º Ò ØÓ¸
ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ º × ÑÓ× ÕÙ
 ­Ù Ó(N, f) ≤                   Ô(e) −                   f(e) =         Ô(< Vs, Vt >) −                  f(e),
                ∀e∈<Vs ,Vt >              ∀e∈<Vs ,Vt >                                    ∀e∈<Vs ,Vt >
                                                                                                         ´ º¾ µ
ÔÙ × ∀e ∈ E =⇒ f(e) ≤ Ô(e)º ÈÓÖ Ø ÒØÓ¸                   Ó ÕÙ ÐÓ× ­Ù Ó× ×ÓÒ ÔÓ× Ø ÚÓ×
                                    ­Ù Ó(N, f) ≤ Ô(< Vs, Vt >)               .                           ´ º¾ µ
    ÓÒ× Ù ÒØ Ñ ÒØ ¸ ×          f∗   × ÙÒ ­Ù Ó Ñ Ü ÑÓ¸ ÒØÓÒ ×
                                    ­Ù Ó(N, f∗ ) ≤ Ô(< Vs, Vt >)                                         ´ º¾ µ
    ×ØÓ ÒÓ× ÓÒ Ù         ÙÒ ÑÙÝ ÒØ Ö × ÒØ Ö ×ÙÐØ Óº
Proposici´n 7.8 Ë f ÙÒ ­Ù Ó ×Ó Ö ÙÒ Ö
         o                                                N =< V, E, s, t, C > Ý < Vs, Vt > ÙÒ ÓÖØ
×Ó Ö Ð Nº Ë ­Ù Ó(N, f) = Ô(< Vs, Vt >)                   ÒØÓÒ × f × ÙÒ ­Ù Ó Ñ Ü ÑÓ Ý < Vs, Vt >
× ÙÒ ÓÖØ          Ô
                  ÑÒÑ º
Demostraci´n Ë
          o       ÙÒ ­Ù Ó Ñ Ü ÑÓ ×Ó Ö N Ý × < Vs, Vt >min Ð ÓÖØ Ñ Ò ÑÓ
                         f∗
  Nº È ØÓÖ ÑÓ× Ò Ö Ñ ÒØ Ð ÓÖØ Ñ Ò ÑÓ      Ð × Ù ÒØ Ñ Ò Ö
                                           < Vs , Vt >min                 Vt
                               Vs

                                                                         t
                                s


                                               < Vs , Vt >min


ÈÓÖ ¬Ò ÓÒ¸ × ÑÓ× ÕÙ × s Ô ÖØ ÙÒ ­Ù Ó f∗ ÓÒ Ú ÐÓÖ ­Ù Ó(N, f∗ )º ר Ú ÐÓÖ ×
  Ü Ø Ñ ÒØ Ð Ñ ×ÑÓ ÕÙ ÐÐ      tº Ð Ö Ñ ÒØ ¸ Ô Ö ÕÙ f∗ ÔÙ    Ô × Ö ÔÓÖ < Vs, Vt >¸
×       ÙÑÔÐ Ö ÕÙ ­Ù Ó(N, f∗) ≤  Ô(< Vs, Vt >) ݸ ÔÙ ×ØÓ ÕÙ Ð ÔÖÓÔÓ× ÓÒ ¬ÖÑ
756                                                                Cap´
                                                                      ıtulo 7. Grafos



ÕÙ ­Ù Ó(N, f∗ ) = Ô(< Vs, Vt >)¸ ÒØÓÒ × f∗ × Ð Ñ Ü ÑÓ ÔÓ× Ð ÕÙ ÔÙ Ô × Ö ÔÓÖ
< Vs, Vt > ÐÓ ÕÙ ÓÖÖÓ ÓÖ ´ º¾ µº Ä Ñ Ü Ñ Ð             f∗ ר ÔÙ × ÑÓרÖ
   ËÙÔÓÒ ÑÓ× ÕÙ Ô(< Vs, Vt >) = K = ­Ù Ó(N, f∗ )¸ Ô ÖÓ ÕÙ < Vs, Vt > ÒÓ ×
Ñ Ò ÑÓº Ë × Ù × ¸ ÒØÓÒ × Ü ×Ø Ö ÓØÖÓ ÓÖØ ÓÒ ÙÒ Ô                    K < K¸ Ô ÖÓ ÔÓÖ
 ר Ô          ÒÓ ÔÙ ­Ù Ö f∗ ¸ ÔÙ × ­Ù Ó(N, f∗ ) > K º Ä ÓÒØÖ      ÓÒ ÑÙ ×ØÖ ÔÙ ×
Ð ÑÒÑ Ð           < Vs, Vt >

   Ä ÔÖÓÔÓ× ÓÒ ÒÓ× Ò         ÕÙ × Ð ÙÐ ÑÓ× Ð ­Ù Ó Ñ Ü ÑÓ¸ ÒØÓÒ × Ð ÓÑ Ò ÓÒ
 ÙÝÓ ÓÒ ÙÒØÓ Ö Ó× < Vs, Vt > ÒÓ× ÓÒ Ô                   Ù Ð Ð ­Ù Ó ÓÖÖ ×ÔÓÒ Ð ÓÖØ
Ñ Ò ÑÓº
Corolario 7.3 Ë f∗ ÙÒ     ­Ù Ó Ñ Ü ÑÓ ×Ó Ö ÙÒ Ö         N =< V, E, s, t, C >   ÓÒ ÓÖØ
Ñ Ò ÑÓ < Vs, Vt >º ÒØÓÒ    ×
  ½º
                              ∀e ∈< Vs, Vt >=⇒ f(e) =       Ô(e)                 ´ º¾ µ
  ¾º
                                ∀e ∈< Vs, Vt >=⇒ f(e) = 0                        ´ º¾ µ
Demostraci´n
          o

  ½º ÁÒÑ ØÓ Ð ÔÖÓÔÓ× ÓÒ º
  ¾º ÈÙ ×ØÓ ÕÙ ∀e∈ÇÍÌ(s) f(e) = ∀e∈ÁÆ(t) f(e) = ­Ù Ó(N, f∗ )¸ ÒØÓÒ × ­Ù Ó(< Vs, Vt >, f∗) = 0¸
     ÔÙ × ÐÓ ÓÒØÖ Ö Ó f∗ ÒÓ × Ö Ñ Ü ÑÓ
    Ð ÓÖÓÐ Ö Ó ÒÓ× ¬Ò Ñ × Ð ÓÑÔÙØÓ ÙÒ ÓÖØ Ñ Ò ÑÓ Ô ÖØ Ö Ð ÓÒÓ Ñ ÒØÓ
 Ð ­Ù Ó Ñ Ü ÑÓº ÌÓ Ó Ö Ó ÕÙ Ô ÖØ Ò Þ < Vs, Vt > Ø Ò Ú ÐÓÖ ­Ù Ó Ù Ð ×Ù
 Ô       º Ò ÐÓ Ñ ÒØ ¸ ØÓ Ó Ö Ó ÕÙ Ô ÖØ Ò Þ < Vs, Vt > Ø Ò Ú ÐÓÖ ­Ù Ó ÖÓº
Ë ×Ø Ö Ø Ö Ó Ð ÙÒ ÑÓ× ÓÑÓ ÓÒ ÓÒ ÕÙ Ð ×ÙÑ Ð × Ô                        × ÐÓ× Ö Ó×
  < Vs, Vt > Ø Ò ÕÙ ÓÖÖ ×ÔÓÒ Ö× ÓÒ Ð Ú ÐÓÖ       ­Ù Ó Ñ Ü ÑÓ¸ ÒØÓÒ × Ø Ò ÑÓ× ÙÒ
Ñ ØÓ Ó Ô Ö Ð ÙÐ Ö Ð ÓÖØ Ñ Ò ÑÓ¸ Ó Ð ­Ù Ó Ñ Ü ÑÓº

7.10.7   Caminos de aumento
ÄÓ× Ð ÓÖ ØÑÓ×   Ð ÙÐÓ ­Ù Ó Ñ Ü ÑÓ × × Ò Ò Ò ÓÒØÖ Ö Ñ ÒÓ× ×Ô Ð × ÐÐ Ñ ¹
 Ó× ÙÑ ÒØÓº ÁÒ ÓÖÑ ÐÑ ÒØ ¸ ÙÒ Ñ ÒÓ ÙÑ ÒØÓ × ÙÒ × Ù Ò            Ö Ó× ÒØÖ Ð
 Ù ÒØ Ý Ð ×ÙÑ ÖÓ ÔÓÖ Ð Ù Ð × ÔÙ   ÙÑ ÒØ Ö Ð ­Ù Óº Ë Ò Ñ Ö Ó¸ ÒÓ × ÙÒ Ñ ÒÓ
ØÖ ÓÒ Ð Ý¸ Ô Ö ÔÖ Ò Ö ÐÐÓ¸ Ö ÕÙ Ö ÑÓ× ÙÒ ¬Ò ÓÒ ÒØ ÖÑ º
Definici´n 7.15 (Semi-camino) ÍÒ × Ñ ¹ Ñ ÒÓ Ò ÙÒ
       o                                                     Ö N =< V, E, s, t, C >¸ Ó
Ù × ¹ Ñ ÒÓ¸ × ÙÒ × Ù Ò < s, e1, v1, e2, . . . , ek−1, t >     ÒÓ Ó× Ý Ö Ó× ÒØÖ Ð ÒÓ Ó
 Ù ÒØ Ý Ð ×ÙÑ ÖÓº
   ÆÓØ ÑÓ× ÕÙ ÐÓ× Ö Ó× ÙÒ × Ñ ¹ Ñ ÒÓ ÒÓ Ò × Ö Ñ ÒØ Ú Ò Ö Ó× × Ð
 Ù ÒØ       Ð ×ÙÑ ÖÓ ÔÙ Ò     Ö Ö Ó× × Ð ×Ø ÒÓ           Ð ×ÙÑ ÖÓº
   ÍÒ Ö Ó × Ð Ù ÒØ             Ð ×ÙÑ ÖÓ × ÒÓÑ Ò “arco de adelanto”º
Ë Ñ ØÖ Ñ ÒØ ¸ ÙÒÓ × Ð ×ÙÑ ÖÓ         Ð Ù ÒØ “arco de retroceso”º
   ÈÓÖ ÑÔÐÓ¸ Ò Ð × Ù ÒØ × Ñ ¹ Ñ ÒÓ Ð Ö ÑÓ×ØÖ         Ò Ð ¬ ÙÖ º ¼
7.10. Redes de flujo                                                                                                       757



                                       K                                                 L
                              5                                              4                     5

                     A                 D             4           F                                     I


ÄÓ× Ö Ó× {(A, K), (K, B), (B, F), (L, I)} ×ÓÒ Ð ÒØÓ¸ Ñ ÒØÖ × ÕÙ {(L, F)} ×                                        Ö ØÖÓ ×Óº
    ÓÒ Ð           × Ñ ¹ Ñ ÒÓ¸ ÔÓ ÑÓ× ¬Ò Ö Ð           Ñ ÒÓ ÙÑ ÒØÓº
Definici´n 7.16 (Camino de aumento)
       o                                Ë ÙÒ Ö N =< V, E, s, t, C >º ÍÒ Ñ ÒÓ
   ÙÑ ÒØÓ Ca × ÙÒ × Ñ ¹ Ñ ÒÓ Ò N Ø     Ð ÕÙ Ð ­Ù Ó ×Ù× Ö Ó×         Ð ÒØÓ ÔÙ
 Ò Ö Ñ ÒØ Ö× Ý Ð ×Ù× Ö Ó× Ö ØÖÓ ×Ó Ö Ñ ÒØ Ö× º
    Ë Ca × ÙÒ Ñ ÒÓ         ÙÑ ÒØÓ¸ ÒØÓÒ ×¸ ÔÓÖ ¬Ò ÓÒ¸ Ô Ö Ù ÐÕÙ Ö Ö Ó e
    Ð ÒØÓ f(e) < Ô(e)¸ ÔÙ × × ÒÓ ÒÓ Ö ÓÖÑ        Ò Ö Ñ ÒØ Ö Ð ­Ù Óº Ò Ð Ñ ×ÑÓ
× ÒØ Ó¸ Ô Ö Ù ÐÕÙ Ö Ö Ó e Ö ØÖÓ ×Ó f(e) > 0º
    Ä ÒØ        Ò ÕÙ ÔÙ Ò Ö Ñ ÒØ Ö× Ð ­Ù Ó Ò ÙÒ Ö Ó        Ð ÒØÓ¸ Ó Ö Ñ ÒØ Ö×
 Ò ÙÒÓ Ö ØÖÓ ×Ó × ÒÓÑ Ò ×Ð ÓÒ ´ ×Ð µ¾ ¸ × × Ò Δe Ý × Ø ÖÑ Ò
Ð × Ù ÒØ Ñ Ò Ö

                         Δe =
                                         Ô(e) − f(e) ×                   e       ×            Ð ÒØÓ                  ´ º¾ µ
                                       f(e)          ×                   e       ×        Ö ØÖÓ ×Ó
       Ó ÙÒ Ñ ÒÓ              ÙÑ ÒØÓ Ca¸ Ð Ñ Ü Ñ ÒØ    Ò ÕÙ ÔÙ   ÙÑ ÒØ Ö× Ð
­Ù Ó Ð Ö ÔÓÖ ×               Ñ ÒÓ ×Ø ×ÙÔ Ø      Ð ÓÒ ÓÒ ÓÒ× ÖÚ ÓÒ ­Ù Ó Ý ×
  Ø ÖÑ Ò ÓÑÓ
                                                ΔCa =        ÑÒ
                                                             ∀e∈Ca
                                                                         Δe ;                                        ´ º¿¼µ
×     Ö¸ Ð “m´ınimo eslab´n” Ð Ñ ÒÓ
                         o               ÙÑ ÒØÓº
   Ë Ò ÓÒØÖ ÑÓ× ÙÒ Ñ ÒÓ ÙÑ ÒØÓ Ca ×Ó Ö ÙÒ Ö ¸ ÒØÓÒ × × × ÙÖÓ ÕÙ ×Ó Ö
×Ù× Ö Ó× ÔÓ ÑÓ× ÙÑ ÒØ Ö Ó ×Ñ ÒÙ Ö Ð Ú ÐÓÖ ­Ù Ó Ò Ð Ú ÐÓÖ Ð Ñ Ò ÑÓ ×Ð ÓÒº
 ×ØÓ Ò       Ð Ö Ø Ö Ð ÓÖ ØÑ Ó ÐÓ× Ñ ÒÓ×         ÙÑ ÒØÓ Ò Ð Ø ÖÑ Ò ÓÒ Ð
­Ù Ó Ñ Ü ÑÓº
                                                     4                   3
                                       K             2           E        5              L
                                                                                                   2
                         2                                           3
                                   3           1 2    3                       1 8          1 3
                              3
                                                     3                       6
                    A                  D                         F                       H     3       I
                                                     1                    1                    3
                               4           3                 3           6                   5
                                                                     1               1             5
                         2                                                    9
                                       B                 1       G                       J
                                                                             1

  ÙÖ º Ê Ö × Ù Ð Ð Ö Ó Ð ¬ ÙÖ º ½º ÄÓ× Ö Ó×                                                                ­Ù Ó Ö ×Ø ÒØ ×ÓÒ
ÓÒØ ÒÙÓ׸ Ñ ÒØÖ × ÕÙ ÐÓ× Ö × Ù Ð × ×ÓÒ ÔÙÒØ Ó׺

 ¾
     ר × Ð Ø ÖÑ ÒÓ ×Ø ÐÐ ÒÓ ÕÙ ×Ø ×Ù× Ö ØÓ                                      Ó ÑÔÐ Ö ÔÓÖ Ð Ø ÖÑ ÒÓ Ò Ð × ×Ð       º
758                                                                                                                                   Cap´
                                                                                                                                             ıtulo 7. Grafos



    Definici´n 7.17 (Red residual) Ë ÙÒ Ö N =< V, E, s, t, C > ÓÒ Ú ÐÓÖ
             o                                                                  ­Ù Ó
    ­Ù Ó(N, f)º Ð Ö Ó Ö × Ù Ð N ÒÓØ Ó ÓÑÓ N =< V, E , s, t, C >¸ Ø Ð ÕÙ E Ý C ×
     ÓÒרÖÙÝ Ò Ð × Ù ÒØ ÑÓ Ó
       ½º ∀e = (u, v) ∈ E =⇒
           ´ µ ∃e = (u, v) ∈ E | Ô(e ) = Ô(e) − f(e) ´ Ö Ó ­Ù Ó Ö ×Ø ÒØ µº
           ´ µ ∃e = (v, u) ∈ E | Ô(e) = f(e) ´ Ö Ó Ö × Ù Ðµº
        Ä ¬ ÙÖ º ÐÙ×ØÖ Ð Ö Ö × Ù Ð Ð Ö Ó ÓÒ Ú ÐÓÖ ­Ù Ó ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ
     º ½º
        Ä Ö Ö × Ù Ð ÒÓ× Ô ÖÑ Ø Ò ÓÒØÖ Ö Ñ ÒÓ×              ÙÑ ÒØÓ Ñ ÒØ × Ù×ÕÙ ×
      Ñ ÒÓ׸ × ÔÓÖ ÔÖÓ ÙÒ         Ó ÔÓÖ ÑÔÐ ØÙ ¸ × Ð Ù ÒØ             Ð ×ÙÑ ÖÓ¸ Ò Ð
    Ñ ×ÑÓ × ÒØ Ó ÐÓ× Ð ÓÖ ØÑÓ× ×ØÙ Ó× Ò Ü º º º¾ ´Ô Ò ¾¿µ Ý Ü º º ´Ô Ò ¾ µº
        × Ø ÒÓÖ¸ Ð ¬ ÙÖ º ¹ ÑÙ ×ØÖ ÙÒ Ú ÒØÙ Ð Ñ ÒÓ Ò ÓÒØÖ Ó ÔÓÖ ÙÒ ÔÓØ Ø
     Ù×ÕÙ      Ò ÔÖÓ ÙÒ       Ý Ð ÓÖÖ ×ÔÓÒ ÒØ Ñ ÒÓ ÙÑ ÒØÓ ´ º ¹ µº
                                4                     3                                                                                   4
                  K             2           E          5           L                                                           K                  E             L
                                                                                    2                                                                               2
    2                                            3                                                              2                     2                     8
              3           1 2    3                      1 8             1       3
        3
                                3                      6                                                                                      3         6
A                 D                         F                      H            3       I               A                      D                  F             H       I
                                1                      1                        3
          4           3                 3             6                     5
                                                1              1                    5
    2                                                      9
                  B                 1       G                       J
                                                       1
        ´µ            Ñ ÒÓ Ò ÓÒØÖ Ó ÔÓÖ ÔÖÓ ÙÒ                                                                                ´ µ     Ñ ÒÓ        ÙÑ ÒØÓ Ò Ð Ö

                           ÙÖ º             ÍÒ Ñ ÒÓ                         ÙÑ ÒØÓ Ò Ð Ö Ö × Ù Ð                                      Ð ¬ ÙÖ º º
        ÍÒ Ú Þ ÐÐ Ó ÙÒ Ñ ÒÓ      ÙÑ ÒØÓ¸ ÔÓ ÑÓ× Ò Ö Ñ ÒØ Ö Ð ­Ù Ó Ð Ö Ò
     Ð Ú ÐÓÖ ×Ù Ñ Ò ÑÓ ×Ð ÓÒº È Ö Ð ¬ ÙÖ ÑÔÐÓ º ½ Ý Ð Ñ ÒÓ        ÙÑ ÒØÓ
    ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ º ¹ ÓÒ Ñ Ò ÑÓ ×Ð ÓÒ ΔC = 1¸ ÔÓ ÑÓ× ÑÓ ¬ Ö Ð ­Ù Ó                                       a
    ÐÓ× Ö Ó× Ð Ñ ÒÓ ÙÑ ÒØÓ Ò Ð Ú ÐÓÖ ΔC º ×ØÓ ÒÓ× ÓÒ Ù Ð Ú ÐÓÖ ­Ù Ó                                 a
    Ð ¬ ÙÖ º º
                                                               K                6/3         E       8/5             L
                                                5/4                4/1 5/2                        4/1                   9/0     5/4

                                        A                      D            4/2             F      7/2          H              3/3    I
                                                      6/4                                         7/1                     6/1
                                                                   3/3                          4/1

                                                               B            1/1             G           10/1 J


        ÙÖ º             ÍÒ ­Ù Ó Ø Ð ×Ó Ö Ð Ö   Ð ¬ ÙÖ º ¼ ÐÙ Ó Ò Ö Ñ ÒØ Ö Ð ­Ù Ó Ò
    ΔCa = 2           ÓÖÖ ×ÔÓÒ ÒØ Ð Ñ Ò ÑÓ ×Ð ÓÒ Ð Ñ ÒÓ ÙÑ ÒØÓ ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ
     º ¹º
         Ð ÑÓ ¬ ÓÒ Ö Ð Þ ¸ ÕÙ Ô ÖÓ Ò Ð ¬ ÙÖ º ¸ ÒÓ× ÓÒÚ Ò ×Ø Ð Ö Ð ×
    × Ù ÒØ × Ó × ÖÚ ÓÒ × ÔÓÖ × Ô Ö Ó
7.10. Redes de flujo                                                                 759



  ½º Ð Ú ÐÓÖ Ð ­Ù Ó Ð Ö × Ò Ö Ñ ÒØÓ 7 8º
  ¾º Ä × ÑÓ ¬ ÓÒ × ×Ó Ö Ð ­Ù Ó ×ÓÐÓ ÒÚÓÐÙ Ö Ò Ö Ó× Ð Ñ ÒÓ                   ÙÑ ÒØÓº
  ¿º Ô × Ö Ð × ÑÓ ¬ ÓÒ × Ö Ð Þ ×¸ × Ñ ÒØ Ò Ð ÓÒ ÓÒ                           ÓÒ× ÖÚ ÓÒ
        ­Ù Ó ×Ó Ö ÐÓ× ÒÓ Ó× ÕÙ ÓÒ ÓÖÑ Ò Ð Ñ ÒÓ ÙÑ ÒØÓº
 ר × Ó × ÖÚ ÓÒ × × Ò Ö Ð Þ Ò Ó Ð × Ù ÒØ ÔÖÓÔÓ× ÓÒº
Proposici´n 7.9 (Ford-Fulkerson 1956 [12]) Ë ÙÒ Ö N =< V, E, s, t, C > ÓÒ
         o
Ú ÐÓÖ ­Ù Ó ­Ù Ó(N, f)º Ë Ca ÙÒ Ñ ÒÓ ÙÑ ÒØÓ ×Ó Ö Ð Ö N¸ Ð ÙÐ Ó Ñ ÒØ
ÙÒ Ù×ÕÙ       t Ò Ð Ö Ö × Ù Ð Ô ÖØ Ö      s Ý ÙÝÓ Ñ Ò ÑÓ ×Ð ÓÒ × ΔCa º ÒØÓÒ ×¸
 Ð ­Ù Ó Ð Ö ÔÙ         ÙÑ ÒØ Ö× Ò Ð Ú ÐÓÖ ΔCa Ð × Ù ÒØ ÑÓ Ó
                        ⎧
                        ⎪f(e) + ΔCa × e × ÙÒ Ö Ó
                        ⎪                                 Ð ÒØÓ
                        ⎨
                 f(e) = f(e) − ΔCa × e × ÙÒ Ö Ó
                        ⎪
                                                      Ö ØÖÓ ×Ó           ´ º¿½µ
                        ⎪
                        ⎩f(e)        Ò Ù ÐÕÙ Ö ÓØÖÓ ×Ó
Demostraci´n ÄÓ×
           o          Ö Ó× Ð Ö Ó ÕÙ ×ÓÒ ÑÓ ¬ Ó× ×ÓÒ ÕÙ ÐÐÓ× ÕÙ Ô ÖØ Ò Ò
Caº ÈÙ ×ØÓ ÕÙ ΔCa    × Ð Ú ÐÓÖ Ñ Ò ÑÓ ÒØÖ Ð ÙÒ Ô(e) − f(e) Ý f(e) ´Ú Ö ¬Ò ÓÒ
Ü º½ Ô º       µ¸ Ð Ò Ö Ñ ÒØÓ ×Ó Ö ÙÒ Ö Ó          Ð ÒØÓ e ÒÓ ×Ó Ö Ô ×      Ô(e)º Ð
Ñ ×ÑÓ ÑÓ Ó¸ Ð Ö Ñ ÒØÓ ×Ó Ö ÙÒÓ Ö ØÖÓ ×Ó e ÒÓ × Ñ ÒÓÖ ÕÙ 0º ÈÓÖ Ø ÒØÓ¸ ×
ÔÖ × ÖÚ Ð ÓÒ ÓÒ          Ô       ×Ó Ö ØÓ Ó× ÐÓ× ÒÓ Ó× ÒÚÓÐÙ Ö Ó× Ò Caº
     ÈÓÖ ¬Ò ÓÒ¸ ÐÓ× ÜØÖ ÑÓ× Ca ×ÓÒ s Ý tº ÈÙ ×ØÓ ÕÙ Ca Ù Ð ÙÐ Ó Ô ÖØ Ö
s¸ × × ÙÖÓ ÕÙ Ð ÔÖ Ñ Ö Ö Ó s → v       Ca ×         Ð ÒØÓ ÔÓÖ Ø ÒØÓ¸ Ð ­Ù Ó Ð Ö
× ÙÑ ÒØ Ð Ò Ö Ñ ÒØ Ö Ð ­Ù Ó Ò Ð Ö Ó              Ð ÒØÓ Ò Ð Ú ÐÓÖ ΔC º Ë Ñ Ð ÖÑ ÒØ ¸
                                                                        a
 Ð ÙÐØ ÑÓ Ö Ó Ca¸ ÓÒ ÓÖÑ w → t¸ ÕÙ ÙÐÑ Ò Ò t Ø Ñ Ò ×                       Ð ÒØÓ Ý ×Ù
­Ù Ó × Ò Ö Ñ ÒØ Ò Ð Ñ ×ÑÓ Ú ÐÓÖ ΔC º × Ô٠׸ Ð Ú ÐÓÖ ­Ù Ó Ð Ö ÙÑ ÒØ
                                            a
 Ò ΔC ºa
     È Ö Ð Ö ×ØÓ ÐÓ× ÒÓ Ó× Ca           ÑÓ× Ú Ö ¬ Ö ÕÙ × ÔÖ × ÖÚ Ð ÓÒ ÓÒ
 ÓÒ× ÖÚ ÓÒ Ð ­Ù Óº Ä × ÔÓ× Ð × ÓÑ Ò ÓÒ × ÙÒ ÒÓ Ó Ù ÐÕÙ Ö v ∈ Ca, v =
s, v = t ×ÓÒ

  ½º   +ΔC a    +ΔC
           → v →a     Ò ÙÝÓ ×Ó Ð Ò Ö Ñ ÒØÓ ×Ó Ö Ð ­Ù Ó ÒØÖ ÒØ × Ð Ñ ×ÑÓ ÕÙ Ô Ö
        Ð ­Ù Ó × Ð ÒØ º
  ¾º   −ΔC a
       ←− v ←−a −ΔC
                        × Ñ ØÖ Ó Ð ÒØ Ö ÓÖ¸ Ô ÖÓ ÓÒ    Ö Ñ ÒØÓº
  ¿º   −ΔC a
       ←− v → a
                +ΔC
                   × Ò ÑÔÓÖØ Ö Ù Ð × ×ÓÒ ÐÓ× Ö Ó× Ò ÒØ × Ó Ý ÒØ × v¸ Ò Ù ÒØÓ×
      רÓ× ×ÓÒ¸ Ð ­Ù Ó × ÓÒ× ÖÚ ¸ ÔÙ × Ò ÙÒ Ö Ó × Ð × ÙÑ ÒØ Ò ΔC Ô ÖÓ Ò        a
     ÓØÖÓ ×     Ö Ñ ÒØ Ò Ð Ñ ×Ñ ÒØ º
   º +Δ v −Δ × Ñ ØÖ Ó Ð ×Ó ÒØ Ö ÓÖ Ô ÖÓ Ô Ö Ö Ó× ÒØÖ
      →
           Ca
             ←−
                  Ca




7.10.8      Calculo de la red residual
Ë ÐÓ× Ñ ÒÓ×              ÙÑ ÒØÓ × Ð ÙÐ Ò ÔÓÖ Ò×Ô ÓÒ Ð Ö Ö × Ù Ð¸ ÒØÓÒ × Ö ¹
ÕÙ Ö ÑÓ× Ò ÓÒØÖ        Ö ÙÒ Ñ Ò Ö      Ð ÙÐ ÖÐ º ÍÒ ÔÖ Ñ Ö ÓÒ× ×Ø Ò Ö Ð Þ Ö ÙÒ ÓÔ
Ñ Ô ¸ ÑÓ ¬             ÖÐ ×Ù× Ö Ó× ×Ù× Ô          × Ö ×Ø ÒØ × Ý ÐÙ Ó Ò ÖÐ ÐÓ× Ö Ó× Ö × ¹
٠Р׺ ËÓ Ö Ð Ö          Ö × Ù Ð × ÔÙ     ØÙ Ð Þ Ö Ð ­Ù Ó Ð ×Ð ÓÒ Ñ Ò ÑÓ ÙÒ Ñ ÒÓ
760                                                            Cap´
                                                                      ıtulo 7. Grafos



        ÙÑ ÒØÓ Ý Ö Ô Ø Ö Ð Ù×ÕÙ       Ñ ÒÓ× ÙÑ ÒØÓ Ý ØÙ Ð Þ ÓÒ × ­Ù Ó ×Ø
    Ñ Ü Ñ Þ ÖÐÓº È ÖÓ ×Ø Ò ÓÕÙ ÓÒÐÐ Ú Ð ÔÖÓ Ð Ñ      ÙÔÐ Ö Ð ×Ô Ó Ò ÒÓ Ó× Ý Ð
      ÓÐ      Ö Ó׺ ÈÙ        Ö× Ò Ø ÑÔÓ ÕÙ Ô Ö Ð Ý × Ò Ò ×         ÙÔÐ Ö
       Ä Ö ×ÔÙ ×Ø × ¬ÖÑ Ø Ú × Ö¸ ÔÓ ÑÓ× Ö ÔÖ × ÒØ Ö Ð Ö Ö × Ù Ð ×Ó Ö Ð Ö
    ÓÖ Ò Ðº È Ö ÐÐÓ¸ Ò ÑÓ× ÙÒ ØÖ ÙØÓ Ð Ö Ó ÕÙ Ò ÕÙ × Ð Ö Ó × Ó ÒÓ Ö × Ù Ð
    Ý ÜÔÓÖØ ÑÓ× ÒØ Ö × ÕÙ ÑÙ ×ØÖ Ò ÐÓ× Ô ×Ó× ÙÒ Ö Ó × ÙÒ ´ º¿½µº È Ö × Ö × Ð
     Ö Ó × Ó ÒÓ Ö × Ù Ð¸ Ù Ö Ö ÑÓ× Ð Ñ Ò Ö × Ù Ð Ð Ö Ó Ò ÔÙÒØ ÖÓ Ý ÙÒ Ò    ÓÒ
    ÐÓ
¼    Å Ñ ÖÓ× Net Arc<Arc Info,F Type> ¼ ≡                     ´   µ
     Net_Arc * img_arc;
     bool      is_residual;
     Ë this × ÙÒ Ö Ó Ö × Ù Ð¸ ÒØÓÒ × img arc × ÙÒ ÔÙÒØ ÖÓ Ð Ö Ó Ð Ù Ð this ×
    Ö × Ù Ðº Ò ÐÓ Ñ ÒØ ¸ × this × ÙÒ Ö Ó Ô ÖØ Ð Ö ¸ ÒØÓÒ × img arc × Ð Ö ÓÒ
        ×Ù Ö Ó Ö × Ù Ðº
           Ð ØÖ ÙØÓ is residual Ò × this × Ó ÒÓ Ö × Ù Ðº
         ÄÓ× Ð ÓÖ ØÑÓ×      Ð ÙÐÓ ­Ù Ó Ñ Ü ÑÓ × Ó× Ò Ù×ÕÙ ×                Ñ ÒÓ×     Ù¹
    Ñ ÒØÓ ×Ó Ö Ð Ö Ö × Ù Ð × × Ò Ò Ð “capacidad restante” Ò Ð Ö Ó¸ Ð Ù Ð
       ÒÓÑ Ò Ö ÑÓ× ÓÑÓ Cr(e) = Ô(e) − f(e) Ô Ö ÙÒ Ö Ó ÒÓÖÑ Ðº È Ö ÕÙ Ð ÐÙ× ÓÒ
             Ô      Ö ×Ø ÒØ × Ð Ñ ×Ñ ×Ó Ö ÙÒ Ö Ó Ö × Ù Ð e¸             × Ø × Ö× ÕÙ
      Ô(e) − f(e) = Ô(e) − f(e)º × ¸ ÐÓ× Ú ÐÓÖ × ÙÒ Ö Ó Ö × Ù Ð × ÑÔÖ × ÓÐÓ Ò
     Ò
                                   Ô(e) = Ô(e)                                   ´ º¿¾µ
                                    f(e) =      Ô(e) − f(e)                      ´ º¿¿µ
          ר ÑÓ Ó¸ Ô Ö ÙÒ Ö Ó Ù ÐÕÙ Ö e Ý ×Ù Ö × Ù Ð e¸ Ôr(e) = Ô(e)−f(e) ÔÖÓÔÓÖ ÓÒ
    Ð Ô           Ö ×Ø ÒØ    e Ñ ÒØÖ × ÕÙ     Ôr(e) = Ô(e) − f(e) = f(e) ÔÖÓÔÓÖ ÓÒ Ð
    ­Ù Ó Ö ÙÐ ÒØ ÔÓÖ eº
         ÈÙ ×ØÓ ÕÙ ÙÒ Ö Ó Ö × Ù Ð Ò ÐÑ ÒØ × ÓÖÖ ×ÔÓÒ ÓÒ ÙÒÓ Ö Ð¸ Ò ×Ù Ö ÓÒ
    × ×Ô ¬ Ð Ö Ó Ö Ð
¼    Å Ñ ÖÓ× Net Graph<TNode,TArc,T>           +≡           ´ µ   ¾ ½
     void insert_residual_arc(Arc * arc)
     {
       Arc * residual_arc =
         Digraph::insert_arc(get_tgt_node(arc), get_src_node(arc));
       residual_arc->is_residual = true;
       residual_arc->img_arc     = arc;
       residual_arc->cap         = arc->cap;
       residual_arc->flow        = arc->cap - arc->flow;
       arc->img_arc = residual_arc;
     }
         Ð ¬Ò Ð Ö Ö × Ù Ð × × ÖÚ Ö Ñ Ó Ô Ö Ð ÙÐ Ö Ñ ÒÓ×                 ÙÑ ÒØÓº ÈÓÖ
     ר Ö ÞÓÒ¸ ÒÓ Ú Ð Ð Ô Ò ÔÖ Ó ÙÔ Ö× ÔÓÖ Ð × Ú ÒØÙ Ð × Ò ÓÒ× ×Ø Ò × Ù× × ÔÓÖ Ð
    ÔÖ × Ò      ÐÓ× Ö Ó× Ö × Ù Ð × Ð Ö Ó × Ð          ÙÒ ÒÓ Ó Ó Ð Ö ÓÖÖ Ö ÐÓ× Ö Ó×
    ÙÒ Ö ¸ ÔÓÖ ÑÔÐÓ׺ Ð Ö Ó Ö × Ù Ð × Ö Ô Ö Ð ÙÐ Ö Ð ­Ù Ó Ñ Ü ÑÓ Ý × ×ØÖÙÝ
    ÒÑ Ø Ñ ÒØ ר × Ý Ð ÙÐ Óº
       Ä Ð Ñ Ò ÓÒ ÙÒ Ö Ó Ö × Ù Ð           Ö Ð Þ Ö× Ô ÖØ ÙÐ ÖÑ ÒØ × Ö¸ ÒÓ ÔÓ ¹
    ÑÓ× ÒÚÓ Ö Net Graph<TNode,TArc,T>::remove arc()¸ ÔÙ × ×Ø ÔÖ ×ÙÑ Ö ÕÙ Ð
7.10. Redes de flujo                                                           761



     Ö Ó × Ô ÖØ ÐÓ     Ð Ö ¸ ÐÓ ÕÙ ÒÓ × ×Ô ¬ Ñ ÒØ Ð ×Óº × ¸ ÐÓ           ÑÓ× Ñ     ÒØ
    ÓØÖ ÔÖ Ñ Ø Ú Ô ÖØ ÙÐ Ö
½    Å Ñ ÖÓ× Net Graph<TNode,TArc,T>       +≡     ´  µ   ¼           ½
      void remove_residual_arc(Arc * arc)
      {
        Digraph::remove_arc(arc);
      }
       Ë Ò Ó Ò× ÖØ Ö Ý Ð Ñ Ò Ö Ö Ó× Ö × Ù Ð ×¸ Ð ÓÒרÖÙ ÓÒ Ý ×ØÖÙ ÓÒ             Ð Ö
    Ö × Ù Ð ÒØÖÓ Ð ÔÖÓÔ Ö ×ÓÒ Ö Ø ×
½    Å Ñ ÖÓ× Net Graph<TNode,TArc,T>     +≡             ´   µ   ½
      void make_residual_net()
      {
        size_t n = this->get_num_arcs(); // cantidad de arcos residuales a insertar
        for (Arc_Iterator<Net_Graph> it(*this); it.has_current() and n > 0; it.next())
          {
            Arc * arc = it.get_current_arc();
            if (not arc->is_residual)
              {
                insert_residual_arc(arc);
                --n;
              }
          }
      }
      void unmake_residual_net()
      {
        for (Arc_Iterator<Net_Graph> it(*this); it.has_current(); )
          {
            Arc * arc = it.get_current_arc();
            if (arc->is_residual)
              {
                it.next();
                remove_residual_arc(arc);
              }
            else
              it.next();
          }
      }
    Í× × Arc Iterator   º

    7.10.9    Calculo de caminos de aumento
      ÓÑÓ Ý ÐÓ ÑÓ× Ò         Ó¸ Ð Ù×ÕÙ      ÙÒ Ñ ÒÓ       ÙÑ ÒØÓ ØÖ Ú × Ð Ö
    Ö × Ù Ð × Ö Ñ Ø ÙÒ Ù×ÕÙ              Ñ ÒÓ × Ð Ù ÒØ ר Ð ×ÙÑ ÖÓº Ì Ð
     Ù×ÕÙ ÔÙ Ö Ð Þ Ö× ÔÓÖ ÔÖÓ ÙÒ          Ó ÑÔÐ ØÙ ØÖ Ú × Ð × ÔÖ Ñ Ø Ú ×       Ð ÙÐÓ
         Ñ ÒÓ× ×ØÙ      × Ò Ü º º º¾ ´Ô Ò ¾¿µ Ý Ü º º ´Ô Ò ¾ µ¸ Ö ×Ô Ø Ú Ñ ÒØ º
              ØÓ× ÙØ Ð Þ Ö Ü Ø Ñ ÒØ Ð × Ñ ×Ñ × ÔÖ Ñ Ø Ú ×     ÑÓ×      Ö ÕÙ Ð Ð ×
    Node Arc Iterator Ö Ð     Ð Ù×ÕÙ ×Ó Ö Ð Ö Ö × Ù Ð Ý ÒÓ ×Ó Ö Ð ÓÖ Ò Ðº Ò
    ÓØÖ × Ó × ÓÒ × × Ö Ò × Ö Ó ÕÙ Ð Ø Ö ÓÖ ×ÓÐÓ ÑÙ ×ØÖ Ö Ó× Ö × Ù Ð × Ý Ò ÓØÖ × Ñ ×
    ØÓ Ó× ÐÓ× Ö Ó׺
762                                                                                   Cap´
                                                                                             ıtulo 7. Grafos


             D    4/0     E   8/0     I    4/0     K                  D       4       E       8       I       4       K



           6/0    3/0   4/0   5/0   3/0   4/0    3/0    4/0       6       3       4       5       3       4       3       4



     A      7/0     B   6/0     F   4/0     H     5/0     M   A       7       B       6       F       4       H       5       M



           5/0    5/0   3/0   5/0   7/0   6/0    4/0    6/0       5       5       3       5       7       6       4       6



             C            G           J    5/0     L                  C               G               J       5       L
                  4/0         6/0                                             4               6

                              ´µ                                                          ´ µ

                                    ÙÖ º         ÍÒ Ö         ÑÔÐÓ Ý ×Ù Ö × Ù Ðº

        È Ö ØÖ Ø Ö ÓÒ ×ØÓ ¬Ò ÑÓ× ÙÒ Ð × ¬ÐØÖÓ ÕÙ ¬ÐØÖ Ð Ö Ó × ÙÒ Ð Ú ÐÓÖ Ð ­Ù Ó
    Ö ×Ø ÒØ ¸ × ×Ø Ó ÒÓ Ð Ö Ó Ö × Ù Ð
¾     ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ ≡                   ¾
         template <class N> class Res_F
         {
           bool operator () (typename N::Node *, typename N::Arc * a) const
           {
             return (a->cap - a->flow) != 0;
           }
         };
     ÓÒ ×Ø ¬ÐØÖÓ¸ find path depth first() Ý find path breadth first()¸ ÒÚÓ × ×Ó¹
     Ö Ð Ö Ó ÓÒ Ð Ö Ö × Ù Ð¸ Ò ÓÒØÖ Ö Ò Ö Ø Ý ØÖ ×Ô Ö ÒØ Ñ ÒØ Ñ ÒÓ×           Ù¹
    Ñ ÒØÓ ÒØÖ Ð Ù ÒØ Ý ×ÙÑ ÖÓº

    7.10.10        Incremento del flujo por un camino de aumento
    Ë Ø Ò ÑÓ× ÙÒ Ñ ÒÓ        ÙÑ ÒØÓ Ù Ö Ó Ò ÙÒ Ó ØÓ Ø ÔÓ Path<Net Graph>
    ´× ÙÒ Ü º ´Ô Ò ¼¾µµ¸ ÒØÓÒ ×¸ × ÙÒ ´ º¿½µ¸ ÔÓ ÑÓ× Ò Ö Ñ ÒØ Ö Ð ­Ù Ó Ð
    Ö º È Ö ÐÐÓ¸ ¬Ò ÑÓ× Ð × Ù ÒØ ÔÖÓ Ñ ÒØÓ
¾     ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡           ¾   ¿
             template <class Net>
         typename Net::Flow_Type increase_flow(Net & net, Path<Net> & path)
         {
           typename Net::Flow_Type slack = net.Infinity; // valor del eslab´n m´nimo
                                                                            o  ı
               // calcular el eslab´n m´nimo del camino de aumento
                                   o   ı
           for (typename Path<Net>::Iterator it(path); it.has_current_arc(); it.next())
             {
               typename Net::Arc * arc = it.get_current_arc();
               const typename Net::Flow_Type w = arc->cap - arc->flow;
               if (w < slack)
                 slack = w;
             }
               // aumentar el flujo de la red por el camino de aumento
           for (typename Path<Net>::Iterator it(path); it.has_current_arc(); it.next())
             {
               typename Net::Arc * arc = it.get_current_arc();
7.10. Redes de flujo                                                          763



              typename Net::Arc * img = (typename Net::Arc*) arc->img_arc;
              arc->flow += slack;
              img->flow -= slack;
              if (not arc->is_residual)
                {
                  net.increase_out_flow(net.get_src_node(arc), slack);
                  net.increase_in_flow(net.get_tgt_node(arc), slack);
                }
              else
                {
                  net.decrease_in_flow(net.get_src_node(arc), slack);
                  net.decrease_out_flow(net.get_tgt_node(arc), slack);
                }
            }
          return slack;
      }
    Í× × Path ¼¾ º
     Ù Ò Ó × Ò Ö Ñ ÒØ Ð ­Ù Ó ÙÒ Ö Ó Ö × Ù Ð × ÜÔÖ × ÕÙ Ý ÙÒ ×Ñ ÒÙ ÓÒ Ð
    ­Ù Ó Ð Ö Ó Ö Ð Ò ÐÓ Ñ ÒØ ¸ Ð Ò Ö Ñ ÒØÓ ×Ó Ö ÙÒ Ö Ó ÒÓÖÑ Ð ÑÔÐ ÙÒ ÙÑ ÒØÓ
       Ð Ô       Ö ×Ø ÒØ Ð Ö Ó Ö × Ù Ðº    ÕÙ ÕÙ × Ú Ð Ó ÙÑ ÒØ Ö Ð ­Ù Ó Ò arc
    Ý ×Ñ ÒÙ ÖÐÓ Ò img Ò Ô Ò ÒØ Ñ ÒØ ÕÙ arc × Ó ÒÓ Ö × Ù Ðº
    7.10.11     El algoritmo de Ford-Fulkerson
    À ר Ð ÔÖ × ÒØ ÑÓ× × Ù ÖØÓ ÓÒÓ Ñ ÒØÓ               Ö      ÓÑÓ Ò Ö Ñ ÒØ Ö Ð ­Ù Ó
    ÙÒ Ö º ÓÑÓ Ò ÓÒØÖ Ö Ð ­Ù Ó Ñ Ü ÑÓ ÙÒ              Ñ ÒØ ÐÑ ÒØ ¸ ÔÓ ÑÓ× ÔÐ ÒØ Ö ÙÒ
     Ð ÓÖ ØÑÓ ÕÙ ÔÖÓ Ö × Ú Ñ ÒØ Ù×ÕÙ Ñ ÒÓ×            ÙÑ ÒØÓ Ò Ö Ñ ÒØ Ð ­Ù Ó ×Ø
    ÕÙ ×Ø Ú Ò Ñ Ü ÑÓº Ù Ð × Ö Ð ÓÒ ÓÒ                    ÔÖ
        ÍÒ ÔÖ Ñ Ö Ö ×ÔÙ ×Ø ÒÓ× Ð ÖÖÓ Ð ÓÖÓÐ Ö Ó       º¿ Ô º     Ô ÖÓ ×Ø Ú ÔÙ × Ö
     ÓÑÔÙØ ÓÒ ÐÑ ÒØ ÓרÓ× ¸ ÔÙ × Ö ÕÙ Ö Ñ Ò Ö          ÓÒ ÙÒØÓ× ÓÑ Ò ØÓÖ ÐÑ ÒØ º ÍÒ
    Ú Ñ × ¬ ÒØ Ð ÔÖÓÔÓÖ ÓÒ Ð × Ù ÒØ ÔÖÓÔÓ×            ÓÒº
    Proposici´n 7.10
             o            Ëf ÙÒ ­Ù Ó   ÙÒ Ö Nº ÒØÓÒ × f × Ñ Ü ÑÓ × Ý ×ÓÐÓ × ÒÓ
     Ü ×Ø ÙÒ Ñ ÒÓ        ÙÑ ÒØÓ Ò Nº
    Demostraci´n Ä Ò ×
                 o                × ÑÙ ×ØÖ ÔÓÖ ÓÒØÖ        ÓÒº Ë f × Ñ Ü ÑÓ Ô ÖÓ
     Ü ×Ø ÙÒ Ñ ÒÓ        ÙÑ ÒØÓ¸ ÒØÓÒ ×¸ × ÙÒ ´ º¿½µ¸ × ÔÓ× Ð Ò Ö Ñ ÒØ Ö Ð ­Ù Ó¸ ÐÓ
    ÕÙ ÓÒØÖ         ¬ÖÑ Ö ÕÙ f × Ñ Ü ÑÓ
        È Ö ÑÓ×ØÖ Ö Ð ×Ù¬ Ò ¸ ×ÙÔÓÒ ÑÓ× ÕÙ ÒÓ Ü ×Ø ÙÒ Ñ ÒÓ             ÙÑ ÒØÓº Ä
     Ù× Ò          Ñ ÒÓ×     ÙÑ ÒØÓ Ò      ÕÙ Ð ÒÓ Ó ×ÙÑ ÖÓ × Ò Ð ÒÞ Ð × Ð
     Ù ÒØ ¸ ÔÙ × Ð Ö Ó Ö Ù Ó ×Ø Ö Ò ÓÒ ÜÓ × Ö¸ ØÓ Ó Ñ ÒÓ Ò Ð Ö Ó Ö Ù Ó
    ÕÙ Ô ÖØ × Ð Ù ÒØ × ÓÖØ Ð Ð ÒÞ Ö Ö Ó× ÓÒ ­Ù Ó Ù Ð ×Ù Ô                  º ÆÓ ×
    ÔÓ× Ð ¸ ÔÓÖ Ø ÒØÓ¸ ÙÑ ÒØ Ö Ñ × Ð ­Ù Ó¸ ÐÓ ÕÙ Ò ÕÙ f × Ñ Ü ÑÓ
         ר ÔÖÓÔÓ× ÓÒ ÒÓ× Ó Ö Ð Ö Ø Ö Ó Ô Ö ÕÙ ×Ø ÑÓ× Ù× Ò Ó Ý × Ð ×
      Ð × Ù ÒØ Ð ÓÖ ØÑÓ Ò Ö Ó
¿     ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡                 ¾
          template <class Net, template <class, class> class Find_Path>
      typename Net::Flow_Type aumenting_path_maximum_flow(Net & net,
                                                          const bool & leave_residual = false)
764                                                             Cap´
                                                                   ıtulo 7. Grafos



  {
      net.make_super_nodes();
      net.make_residual_net();
      typename Net::Node * source = net.get_source();
      typename Net::Node * sink   = net.get_sink();
      while (true) // mientras exista un camino de aumento
        {
          Path<Net> path(net);
          if (not Find_Path <Net, Res_F<Net> > () (net, source, sink, path))
            break;
          increase_flow <Net> (net, path);
        }
      const typename Net::Flow_Type ret_val = source->out_flow;
      if (not leave_residual)
        {
          net.unmake_residual_net();
          net.unmake_super_nodes();
        }
      return ret_val;
  }
Í× × Path ¼¾ º
  Ð Ô Ö Ñ ØÖÓ leave residual Ð Ò      Ð Ð ÓÖ ØÑÓ ÕÙ Ð Ö    Ö × Ù Ð ÒÓ      Ð Ö Ö× º
  ×ØÓ ÔÙ × Ö ÙØ Ð         Ô Ö ÓØÖÓ× Ð ÓÖ ØÑÓ× ÒØÖ ÐÐÓ×    Ð Ð ÙÐÓ Ð ÓÖØ Ñ Ò ÑÓº
     È Ö ÕÙ ×Ø Ð ÓÖ ØÑÓ ÓÔ Ö ÓÖÖ Ø Ñ ÒØ ¸ Ð × Ù×ÕÙ         ×      Ñ ÒÓ×      ÙÑ ÒØÓ
×ÓÐÓ      Ò ÓÒ× Ö Ö Ö Ó× ÒÓÖÑ Ð × ÙÝ Ô            Ý ×Ø    Ð ÒÞ ¸ Ó Ö Ó× Ö × Ù Ð ×
ÕÙ ÓÒØ Ò Ò Ð ÙÒ ­Ù Óº È Ö ÐÐÓ¸ Òר Ò ÑÓ× Ð Ù×ÕÙ              ÓÒ Ð ¬ÐØÖÓ Res F<Net>º
     ÍÒ Òר Ò      Ð Ð ÓÖ ØÑÓ Ò Ö Ó ÒØ Ö ÓÖ Ô Ö Ù×ÕÙ       ×      Ñ ÒÓ× Ò ÔÖÓ ÙÒ ¹
      ×Ó Ö Ð Ö Ö × Ù Ð ÒÓ× ÓÒ Ù Ð ÔÖ Ñ Ö Ý Ñ × Ð Ö         Ð ÓÖ ØÑÓ × Ù ÖØÓ Ô Ö
­Ù Ó Ñ Ü ÑÓ Ð Ð ÓÖ ØÑÓ        ÓÖ ¹ ÙÐ Ö×ÓÒ
   ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡                    ¿
        template <class Net> typename Net::Flow_Type
  ford_fulkerson_maximum_flow(Net & net, const bool & leave_residual = false)
  {
    return
      aumenting_path_maximum_flow<Net, Find_Path_Depth_First>(net, leave_residual);
  }
         ØÓ× Ô Ö Ñ ØÖ Þ Ö Ð Ð ÓÖ ØÑÓ ­Ù Ó Ñ Ü ÑÓ¸ Ò ÓØÖ × ÔÐ             ÓÒ × ÕÙ ÐÓ
Ö ÕÙ Ö Ò¸ ÜÔÓÖØ Ö ÑÓ× ×Ø Ð ÓÖ ØÑÓ Ó Ð ÒÓÑ Ö ÙÒ Ð ×
  ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡
  template <class Net> class Ford_Fulkerson_Maximum_Flow
  {
    typename Net::Flow_Type operator () (Net & net,
                                         const bool & leave_residual = false) const
    {
      return ford_fulkerson_maximum_flow(net, leave_residual);
    }
  };
 Ò ÐÓ ÕÙ × Ù ¸ ØÓ Ó× ÐÓ× Ð ÓÖ ØÑÓ×    ­Ù Ó Ñ Ü ÑÓ ÕÙ    × ÖÖÓÐÐ Ö ÑÓ× Ø Ò Ö Ò ×Ù Ð ×
ÒÚÓ ÒØ º
7.10. Redes de flujo                                                                                                                  765




       D   4/0     E   8/0     I   4/0     K                     D           4       E           8           I           4           K



     6/0   3/0   4/0   5/0   3/0   4/0   3/0   4/0           6           3       4           5           3           4           3           4



 A   7/0     B   6/0     F   4/0     H   5/0     M   A           7           B       6           F           4           H           5           M



     5/0   5/0   3/0   5/0   7/0   6/0   4/0   6/0           5           5       3           5           7           6           4           6



       C           G           J   5/0     L                     C                   G                       J           5           L
           4/0         6/0                                                   4                   6

                       ´µ                                                                    ´ µ
                                                                 D           4       E           8           I           4           K
       D   4/0     E   8/0     I   4/0     K

                                                             6           3       4           5           3           4           3           4
     6/0   3/0   4/0   5/0   3/0   4/0   3/0   4/0

                                                     A           7           B       6           F           4           H           5           M
 A   7/0     B   6/0     F   4/0     H   5/0     M
                                                                 2                                           4                           3
                                                                         5       3           5                       6           4
                                                         3                                           3                                           3
     5/3   5/0   3/3   5/0   7/3   6/0   4/0   6/3
                                                                                                                             2
                                                                 C           4       G           6           J                       L
       C           G           J   5/3     L                                                                                 3
           4/0         6/0

                       ´µ                                                                    ´ µ
       D   4/0     E   8/0     I   4/0     K                     D           4       E           8           I           4           K



     6/0   3/0   4/0   5/0   3/0   4/0   3/0   4/0           6           3       4           5           3           4           3           4

                                                                     5                   4
 A   7/2     B   6/2     F   4/0     H   5/0     M   A                       B                   F           4           H           5           M
                                                                     2                   2
                                                                 2                                           2                           1
     5/3   5/0   3/3   5/0   7/5   6/0   4/0   6/5                       5       3           5                       6           4
                                                         3                                           5                                           5


       C           G           J   5/5     L                     C                   G                       J                       L
           4/0         6/0                                                   4                   6                       5

                       ´µ                                                                    ´µ
       D   4/0     E   8/0     I   4/0     K                     D           4       E           8           I           4           K



     6/0   3/0   4/0   5/0   3/0   4/0   3/0   4/0           6           3       4           5           3           4           3           4

                                                                     4                   3
 A   7/3     B   6/3     F   4/0     H   5/0     M   A                       B                   F           4           H           5           M
                                                                     3                   3
                                                                                                                         5
                                                                 2                                           2
     5/3   5/0   3/3   5/0   7/5   6/1   4/0   6/6                       5       3           5                                   4           6
                                                         3                                           5
                                                                                                                 1

       C           G           J   5/5     L                     C                   G                       J                       L
           4/0         6/0                                                   4                   6                       5

                       ´µ                                                                    ´ µ

   ÙÖ º    ÚÓÐÙ ÓÒ Ð Ð ÓÖ ØÑÓ     ÓÖ ¹ ÙÐ Ö×ÓÒ ×Ó Ö Ð Ö        Ð ¬                                                       ÙÖ º º
   ÙÖ × Ð ÞÕÙ Ö ÑÙ ×ØÖ Ò Ð ×Ø Ó ­Ù Ó Ð Ö Ý Ö × ÐØ Ò Ð                                                                    Ñ ÒÓ
 ÙÑ ÒØÓº ÙÖ × Ð Ö ÑÙ ×ØÖ Ò Ð Ö Ö × Ù Ð¸ ÙÒØÓ ÓÒ Ð Ñ ÒÓ                                                                    ÙÑ ÒØÓ
Ø Ð ÓÑÓ × × Ù Ö Ò Ð Ù×ÕÙ      Ö Ó× ÓÒ Ú ÐÓÖ 0 ÒÓ × ÑÙ ×ØÖ Ò Ò Ð Ö                                                        Ö × Ù Ðº
766                                                              Cap´
                                                                    ıtulo 7. Grafos



     Ð Ð ÓÖ ØÑÓ ÓÖ ¹ ÙÐ Ö×ÓÒ × × Ò Ò ÓÒØÖ Ö Ñ ÒÓ× ÙÑ ÒØÓ ÔÓÖ Ù×ÕÙ
 Ò ÔÖÓ ÙÒ      Ý ÔÖÓ Ö × Ú Ñ ÒØ Ò Ö Ñ ÒØ Ö Ð ­Ù Ó Ò Ð ×Ð ÓÒ Ñ Ò ÑÓº ÄÓ× Ñ ÒÓ×
× ÐÓ Ð Þ Ò Ò Ð Ö Ö × Ù Ð ÕÙ × ÓÒרÖÙÝ ÓÑÓ ÜØ Ò× ÓÒ Ð Ö ÓÖ Ò Ð Ý Ð ×
  ØÙ Ð Þ ÓÒ × Ð ­Ù Ó Ø Ñ Ò × Ö Ð Þ Ò ×Ó Ö Ð Ö º
   Ä × ¬ ÙÖ × º Ý º ÐÙ×ØÖ Ò ØÓ × Ð × Ø Ö ÓÒ × Ð Ð ÓÖ ØÑÓ          ÓÖ ¹ ÙÐ Ö×ÓÒ
×Ó Ö Ð Ö ÑÓ×ØÖ        Ò Ð ¬ ÙÖ º º
7.10.11.1   An´lisis del algoritmo de Ford-Fulkerson
              a

ÈÙ ×ØÓ ÕÙ      Ð Ö Ó Ö × Ù Ð × ÓÒרÖÙÝ ×Ó Ö Ð ÔÖÓÔ Ö Ñ ÒØ Ð Ñ ØÓ Ó
make residual net() ´Ü º½¼º½¼ ´Ô Ò           ¾µµ¸ Ð ÓÒ×ÙÑÓ ×Ô Ó × O(E)¸ ÒØ
ÕÙ ×ÓÖ Ð ×Ô Ó ÕÙ ÔÙ Ó ÙÔ Ö Ð Ñ ÒÓ ÙÑ ÒØÓ pathº
      Ð Óר Ò ÙÖ ÓÒ Ð ÓÒרÖÙ ÓÒ Ð Ö Ö × Ù Ð × O(E)¸ ÔÙ × × Ö ÕÙ Ö Ò
Ö Ú × Ö ØÓ Ó× ÐÓ× Ö Ó× Ð Ö º
    Ä ÙÖ ÓÒ Ñ Ü Ñ Ó ÔÖÓÑ                  ÙÒ Ù×ÕÙ            Ñ ÒÓ     ÙÑ ÒØÓ ÔÓÖ ÜÔÐÓ¹
Ö ÓÒ Ò ÔÖÓ ÙÒ            ר ÓØ ÔÓÖ O(E) Ô Ö Ð Ô ÓÖ ×Ó ÐÓ Ù Ð × Ú ÒØ Ô × Ö
    ØÒÖ Ð ÓÐ          Ö Ó׺ Ë N Ù × Ð ÒØ              Ú × ÕÙ Ö Ô Ø Ð while¸ ÒØÓÒ × Ð
  ÙÖ ÓÒ Ð Ð ÓÖ ØÑÓ × O(E) + N × O(E) = N × O(E)º ÈÓÖ Ø ÒØÓ¸ Ð ÙÖ ÓÒ Ô Ò
    ÕÙ Ø Ò Ù ÒÓ × Ð Ñ ÒÓ ÙÑ ÒØÓ Ò ÓÒØÖ Ó ÔÓÖ find path depth first()º
       Ù ÒØÓ Ñ ÝÓÖ × Ð Ñ Ò ÑÓ ×Ð ÓÒ ÙÒ Ñ ÒÓ                   ÙÑ ÒØÓ¸ Ñ × ×    Ö Ö Ð
 Ò Ö Ñ ÒØÓ Ð ­Ù Ó Ð Ú ÐÓÖ Ñ Ü ÑÓº Ä ÓÒ                  ÙÒ Ñ ÒÓ      ÙÑ ÒØÓ ×ØÖ ¸ Ò¹
ØÓÒ ×¸ Ò ÕÙ ×Ù ×Ð ÓÒ Ñ Ò ÑÓ × ÐØÓº Ò ×Ø × ÒØ Ó¸ find path depth first()
ÒÓ ÒÓ× Ó Ö Ò Ò ÙÒ Ö Ø Ö Ó Ð ÖÙØ Ò Ò Ù ÒØÖ Ð Ñ ÒÓ                   ÙÑ ÒØÓ × ÙÒ Ð × Ö¹
 ÙÒר Ò × ØÓÔÓÐÓ ×¸ Ð × Ù Ð ×¸ ÒÙ ×ØÖÓ× ØÓ× ÔÙ Ò ÓÒ× Ö Ö× Ð ØÓÖ ×º ÈÓÖ
Ø ÒØÓ¸ ×ÙÑ Ò Ó Ô              × ÒØ Ö ×¸ ÔÙ Ö Ò Ö ÕÙ Ö Ö× O(f∗ ) Ö Ô Ø ÓÒ × Ô Ö ÐÐ Ö
 Ð Ñ Ü ÑÓ¾ º Ò Ð ÓÑ Ò Ó ÒØ ÖÓ¸ ×ØÓ ×Ù                × find path depth first() × ÑÔÖ
ÒÓ× Ò Ù ÒØÖ Ñ ÒÓ× ÓÒ ×Ð ÓÒ Ñ Ò ÑÓ ÙÒ Ø Ö Óº È Ö ÔÖ Ò Ö Ñ ÓÖ Ð ×ÙÒØÓ¸
 ÓÒ× Ö ÑÓ× Ð Ö             Ð ¬ ÙÖ º ½º Ë Ð ×Ù ÖØ               ÕÙ Ð ÔÖ Ñ Ö Ñ ÒÓ
 ÙÑ ÒØÓ × Ù ÖØÓ ÔÓÖ find path depth first() × s → v → w → t¸ ÒØÓÒ ×¸
ford fulkerson maximum flow() ÔÙ           Ö Ð Þ Ö N Ò Ö Ñ ÒØÓ× ­Ù Ó × ¸ Ô ÖØ Ö Ð
 Ö Ó Ö × Ù Ð Ð ¬ ÙÖ º ½¹ ¸ find path depth first() × ÑÔÖ Ò Ù ÒØÖ ÓÑÓ
   Ñ ÒÓ ÙÑ ÒØÓ s → w → v → t¸ ÙÝÓ ×Ð ÓÒ Ñ Ò ÑÓ × ÑÔÖ × Ö 1º
    ÍÒ Ð × Ö Ø × Ð Ð ÓÖ ØÑÓ ÓÖ ¹ ÙÐ Ö×ÓÒ × ÕÙ ×Ù Ø ÖÑ Ò ÓÒ ÒÓ ×Ø Ö Ò¹
ØÞ × Ð × Ô               × × Ö ÔÖ × ÒØ Ò ÓÒ ÖÖ ÓÒ Ð ×º Ä Ö Ø × Ò ÓÐ Ø ÓÖ ¸
ÔÙ × × ÐÓ× ÖÖ ÓÒ Ð × × Ö ÔÖ × ÒØ Ò Ò ÔÙÒØÓ ­ÓØ ÒØ ¸ ÒØÓÒ × ÐÓ× ×Ù × ÚÓ× ÙÑ ÒØÓ×
    ­Ù Ó Ø ÖÑ Ò Ò Ð ÒÞ Ò Ó Ð Ú ÐÓÖ           Ô           ÙÒ Ö Óº Ë × ÑÔÐ Ò Ö ÓÒ ×
 ÓÑÓ Ô           ׸ ÒØÓÒ × ×Ø × ÔÙ Ò ØÖ Ò× ÓÖÑ Ö× ÒØ ÖÓ× × ÙÒ ×Ù Ñ Ò ÑÓ ÓÑÙÒ
ÑÙÐØ ÔÐÓº
    Ë Ò Ñ Ö Ó¸ ÙÒ × ×ÙÔ Ø ÑÓ× Ð × Ô                  × Ð ÓÑ Ò Ó ÒØ ÖÓ Ý ÙÒ ÜÔÐÓÖ ÓÒ
 Ò ÔÖÓ ÙÒ          Ø ÖÑ Ò ×Ø ¸ Ð Ð ÓÖ ØÑÓ         ÓÖ ¹ ÙÐ Ö×ÓÒ ÔÙ     Ü Ö¸ Ò Ð Ô ÓÖ
   ×Ó¸ ÙÒ ¬ Ò           O(f ∗ × E)¸ ÐÓ ÕÙ ¸ ÓÑÓ ×    ÔÖ     Ò Ð ÑÔÐÓ Ð ¬ ÙÖ º ½¸
ÔÙ Ö × Ö ×Ø ÒØ × Ú ÖÓº
 ¾
     Ê ÓÖ ÑÓ× ÕÙ   f∗   × Ð Ú ÐÓÖ   ­Ù Ó Ñ Ü ÑÓº
7.10. Redes de flujo                                                                                                                                              767




                                                                                                             5                                       1
       D   4/0     E   8/3     I   4/3     K                     D               4           E                           I                                       K
                                                                                                             3                                       3
                                                                                                                                                                                 1
     6/0   3/0   4/0   5/0   3/3   4/0   3/0   4/3           6               3           4           5               3                   4                   3
                                                                                                                                                                         3
                                                                     1
 A   7/6     B   6/6     F   4/0     H   5/0     M   A                           B                       F               4                   H                   5               M
                                                                                             6
                                                                     6
                                                                                                                                             2
                                                                 2                                                       2                                       3
     5/3   5/0   3/3   5/0   7/5   6/4   4/3   6/6                           5           3           5                                                                       6
                                                         3                                                       5                                       1
                                                                                                                                     4

       C           G           J   5/5     L                     C                           G                           J                                       L
           4/0         6/0                                                       4                       6                                   5

                       ´µ                                                                            ´ µ
                                                                                                             5
       D   4/0     E   8/3     I   4/4     K                     D               4           E                           I                                       K
                                                                                                                                             4
                                                                                                             3
                                                                         2
                                                                                                         4                                       1
     6/0   3/1   4/0   5/1   3/3   4/1   3/0   4/4           6                           4                           3                                       3               4
                                                                                                 1                               3
                                                                                 1
                                                                     1
 A   7/6     B   6/6     F   4/0     H   5/0     M   A                           B                       F               4                   H                   5               M
                                                                                             6
                                                                     6
                                                                                                                                             1
                                                                 2                                                       2
     5/3   5/0   3/3   5/0   7/5   6/5   4/4   6/6                           5           3           5                                                       4               6
                                                         3                                                       5
                                                                                                                                     5

       C           G           J   5/5     L                     C                           G                           J                                       L
           4/0         6/0                                                       4                       6                                   5

                       ´µ                                                                            ´ µ
                                                                                                             5
       D   4/0     E   8/3     I   4/4     K                     D               4           E                           I                                       K
                                                                                                                                             4
                                                                                                             3
                                                                                                         2                                       1
     6/0   3/3   4/0   5/3   3/3   4/1   3/0   4/4           6               3           4                           3                                       3               4
                                                                                                 3                               3
                                                                     1                                                       2                                       3
 A   7/6     B   6/6     F   4/2     H   5/2     M   A                           B                       F                                   H                                   M
                                                                                             6
                                                                     6                                                       2                                       2
                                                                                                                                             1
                                                                 2                                                       2
     5/3   5/0   3/3   5/0   7/5   6/5   4/4   6/6                           5           3           5                                                       4               6
                                                         3                                                       5
                                                                                                                                     5

       C           G           J   5/5     L                     C                           G                           J                                       L
           4/0         6/0                                                       4                       6                                   5

                       ´µ                                                                            ´µ
                                                                                     2                       5
       D   4/2     E   8/3     I   4/4     K                     D                           E                           I                                       K
                                                                                                                                             4
                                                                                     2                       3
                                                         4                                                                                       1
     6/2   3/3   4/0   5/5   3/3   4/1   3/0   4/4                           3           4           5               3                                       3               4
                                                                 2                                                               3
                                                                     1                                                                                               1
 A   7/6     B   6/6     F   4/4     H   5/4     M   A                           B                       F                                   H                                   M
                                                                                             6                           4
                                                                     6                                                                                               4
                                                                                                                                             1
                                                                 2                                                       2
     5/3   5/0   3/3   5/0   7/5   6/5   4/4   6/6                           5           3           5                                                       4               6
                                                         3                                                       5
                                                                                                                                     5

       C           G           J   5/5     L                     C                           G                           J                                       L
           4/0         6/0                                                       4                       6                                   5

                       ´µ                                                                            ´ µ

  ÙÖ º      ÓÒØ ÒÙ ÓÒ Ð Ð ÓÖ ØÑÓ  ÓÖ ¹ ÙÐ Ö×ÓÒ ×Ó Ö Ð Ö Ð ¬ ÙÖ º º
ÆÓØ × ÕÙ Ò Ð ÙÐØ Ñ Ö Ö × Ù Ð Ð ×ÙÑ ÖÓ Ú Ò Ò ÓÒ ÜÓ¸ ÐÓ ÕÙ Ø ÖÑ Ò Ð
ÔÖ      Ð Ð ÓÖ ØÑÓº
768                                                                                                                             Cap´
                                                                                                                                   ıtulo 7. Grafos


                                                                                                                1                       4
            D       4/3           E   8/4           I   4/4         K                       D                               E                       I                           K
                                                                                                                                                                    4
                                                                                                                3                       4
                                                                                    3
          6/3       3/3       4/0     5/5         3/3   4/0    3/0      4/4                             3           4           5               3               4           3       4
                                                                                            3
                                                                                                1
 A        7/6         B       6/6         F       4/4     H     5/5       M     A                           B                       F                               H                   M
                                                                                                                            6                       4                           5
                                                                                                6
                                                                                                                                                                    1
                                                                                            2                                                           2
          5/3       5/0       3/3     5/0         7/5   6/5    4/4      6/6                             5           3           5                                           4       6
                                                                                    3                                                       5
                                                                                                                                                            5

            C                     G                 J   5/5         L                       C                               G                       J                           L
                    4/0               6/0                                                                   4                       6                               5

                                      ´µ                                                                                        ´ µ

          ÙÖ º ¼ ר Ó ¬Ò Ð Ð Ð ÓÖ ØÑÓ                                         ÓÖ ¹ ÙÐ Ö×ÓÒ ÓÒ Ð Ö                                                   Ð ¬ ÙÖ º º
                          v                                               v                                                                         v
                                                                                                                        N-1
                N                     N                                                                                                                             N
                                                              N/1                       N
                                                                                                                                    1                                       t
      s                       1               t           s                   1/1                   t                   s                               1/1
                                                                                                                                                                N/1
                N                     N                        N                        N/1                                     N
                          w                                                                                                                     w                       1
                                                                          w

                ´ µ Ö ÓÖ × Ù Ð                          ´ µ ÓÒ Ð Ò Ö Ñ ÒØÓ                  ­Ù Ó                    ´ µ Ö Ó Ö × Ù Ð Ö ×ÙÐØ ÒØ

  ÙÖ º ½     ÑÔÐÓ Ö ÙÝÓ Ô ÓÖ ×Ó ÓÒ ÙÒ Ù×ÕÙ         Ò ÔÖÓ ÙÒ                                                                                                             Ö ÕÙ Ö
O(N) Ò Ö Ñ ÒØÓ×  ­Ù Ó Ô Ö Ð Ð ÓÖ ØÑÓ ÓÖ ¹ ÙÐ Ö×ÓÒº

7.10.12              El algoritmo de Edmonds-Karp
ÍÒ Ö ¬Ò Ñ ÒØÓ Ð Ð ÓÖ ØÑÓ ÒØ Ö ÓÖ ×ØÖ Ò ×Ù ×Ø ØÙ Ö Ð Ù×ÕÙ          Ò ÔÖÓ ÙÒ
   ÙÒ Ñ ÒÓ       ÙÑ ÒØÓ ÔÓÖ ÙÒ Ò ÑÔÐ ØÙ º Ë Ò Ð Ù×ÕÙ         Ò ÑÔÐ ØÙ Ø Ò
  × Ö ÙÒ ÔÓ Ó Ñ × ÓÒ ÖÓ× Ò Ñ ÑÓÖ ÕÙ Ð        ÔÖÓ ÙÒ     ¸    Ó Ð Ò ÓÐ Ñ ÒØÓ
      Ñ ÒÓ× Ô Ö Ð ×¸ ר ×ÙØ Ð Ñ Ó × ÙÖ ÙÒ Ö Ò Ñ ÒØÓ ÓÒ× Ö Ð Ñ ÒØ Ñ ×
 ¬ ÒØ ÕÙ Ð Ð ÓÖ ØÑÓ        ÓÖ ¹ ÙÐ Ö×ÓÒ O(V E2)¸ Ô Ö Ð Ô ÓÖ ×Óº
    À       Ù ÒØ    ØÓ Ð Ñ ÕÙ Ò Ö ×ÔÐ         ¸ Ð Ð ÓÖ ØÑÓ        ÑÓÒ ×¹Ã ÖÔ ×
 רÖÙ ØÙÖ ÐÑ ÒØ ÒØ Ó Ð        ÓÖ ¹ ÙÐ Ö×ÓÒ
  ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡                      ¾
           template <class Net> typename Net::Flow_Type
     edmonds_karp_maximum_flow(Net & net, const bool & leave_residual = false)
     {
       return
         aumenting_path_maximum_flow<Net, Find_Path_Breadth_First>(net, leave_residual);
     }
   Ð ×ÙØ Ð × ÑÓ Ñ Ó ×Ó Ö ÙÒ Ô Ð Ö ¹ ÔØ ÔÓÖ Ö Ø ¹ ׸ ÓÑÓ Ú Ö ÑÓ× ÔÖÓÒØ ¹
Ñ ÒØ ¸ ÙÒ Ñ ÒØ Ð Ô Ö ÓØ Ö Ð × ÑÔ ÒÓ Ð Ð ÓÖ ØÑÓº
    Ä × ¬ ÙÖ × º ¾ Ý º ¿ ÐÙ×ØÖ Ò ØÓ × Ð × Ø Ö ÓÒ × Ð Ð ÓÖ ØÑÓ     ÑÓÒ ×¹Ã ÖÔ
×Ó Ö Ð Ö ÑÓ×ØÖ       Ò Ð ¬ ÙÖ º º Ô × Ö Ð            × Ð Ý Ð Þ Ö¸ Ð Ð ÓÖ ØÑÓ
  Ð ÙÐ Ð ­Ù Ó Ñ Ü ÑÓ Ò ÙÒ Ø Ö ÓÒ Ñ ÒÓ× ÕÙ ÓÒ Ð Ð ÓÖ ØÑÓ          ÓÖ ¹ ÙÐ Ö×ÓÒ
´Ú Ö ¬ ÙÖ × º Ý º ¸ Ô ×º        Ý µº
    È Ö ÒÙ ×ØÖ × Ö ÙÒר Ò ×¸ Ý ÙÒ Ò Ò Ò × ÑÔ ÒÓ ÐÑ ÒØ ÔÖ Ò× Ð º
   Ð ÔÓ×ØÖ ¸ ÓÒ ×Ø Ð ÓÖ ØÑÓ¸ Ð ÖÙØ Ò increase flow() ÓÔ Ö Ñ × Ö Ô Ó ÕÙ ÓÒ Ð
7.10. Redes de flujo                                                                                                                        769


       D   4/0     E   8/0     I   4/0     K                       D               4       E               8       I               4       K



     6/0   3/0   4/0   5/0   3/0   4/0   3/0   4/0             6               3       4               5       3               4       3               4



 A   7/0     B   6/0     F   4/0     H   5/0     M     A           7               B       6               F       4               H       5               M



     5/0   5/0   3/0   5/0   7/0   6/0   4/0   6/0             5               5       3               5       7               6       4               6



       C           G           J   5/0     L                       C                       G                       J               5       L
           4/0         6/0                                                         4                       6

                       ´µ                                                                              ´ µ
       D   4/0     E   8/0     I   4/0     K                       D               4       E               8       I               4       K



     6/0   3/0   4/0   5/0   3/0   4/0   3/0   4/0             6               3       4               5       3               4       3               4



 A   7/0     B   6/0     F   4/0     H   5/0     M     A           7               B       6               F       4               H       5               M

                                                                                                                                   3
                                                                   2                                                                               3
     5/3   5/0   3/3   5/0   7/0   6/3   4/0   6/3                             5       3               5       7                       4
                                                           3                                                                                               3
                                                                                                                           3

       C           G           J   5/0     L                       C                       G                       J               5       L
           4/0         6/0                                                         4                       6

                       ´µ                                                                              ´ µ
       D   4/0     E   8/0     I   4/0     K                       D               4       E               8       I               4       K



     6/0   3/0   4/0   5/0   3/0   4/0   3/0   4/0             6               3       4               5       3               4       3               4

                                                                       4                       3
 A   7/3     B   6/3     F   4/0     H   5/0     M     A                           B                       F       4               H       5               M
                                                                       3                       3
                                                                   2
     5/3   5/0   3/3   5/0   7/0   6/6   4/0   6/6                             5       3               5       7               6       4               6
                                                           3


       C           G           J   5/0     L                       C                       G                       J               5       L
           4/0         6/0                                                         4                       6

                       ´µ                                                                              ´µ
       D   4/0     E   8/0     I   4/0     K                       D               4       E               8       I               4       K



     6/0   3/0   4/0   5/0   3/0   4/0   3/0   4/0             6               3       4               5       3               4       3               4

                                                                       1                                               1                       2
 A   7/6     B   6/6     F   4/3     H   5/3     M     A                           B                       F                       H                       M
                                                                                           6
                                                                       6                                               3                       3
                                                                   2
     5/3   5/0   3/3   5/0   7/0   6/6   4/0   6/6                             5       3               5       7               6       4               6
                                                           3


       C           G           J   5/0     L                       C                       G                       J               5       L
           4/0         6/0                                                         4                       6

                       ´µ                                                                              ´ µ
       D   4/0     E   8/0     I   4/0     K                       D               4       E               8       I               4       K

                                                                           2
                                                                                                           4
     6/0   3/1   4/0   5/1   3/0   4/0   3/0   4/0             6                       4                       3               4       3               4
                                                                                                   1
                                                                                   1
                                                                       1                                                                       1
 A   7/6     B   6/6     F   4/4     H   5/4     M     A                           B                       F                       H                       M
                                                                                           6                       4
                                                                       6                                                                       4
                                                                   2
     5/3   5/0   3/3   5/0   7/0   6/6   4/0   6/6                             5       3               5       7               6       4               6
                                                           3


       C           G           J   5/0     L                       C                       G                       J               5       L
           4/0         6/0                                                         4                       6

                       ´µ                                                                              ´µ

     ÙÖ º ¾ ÚÓÐÙ ÓÒ Ð Ð ÓÖ ØÑÓ                       ÑÓÒ ×¹Ã ÖÔ ×Ó Ö Ð Ö                                           Ð ¬ ÙÖ º º
770                                                                                                          Cap´
                                                                                                                ıtulo 7. Grafos



   ÓÖ ¹ ÙÐ Ö×ÓÒ¸ ÔÙ × Ð Ô ×                     ÔÖ         Ð ÙÐ Ö Ð ×Ð ÓÒ Ñ Ò ÑÓ ×                                               ×Ó Ö Ð Ñ ÒÓ
Ñ × ÓÖØÓº
                                                                                                                     6                         2
        D   4/0       E       8/2     I   4/2         K                      D           4           E                           I                     K
                                                                                                                     2                         2
                                                                                                                 4                                                     2
      6/0   3/3     4/0       5/1   3/0   4/0    3/0       4/2           6           3           4                           3         4           3
                                                                                                         1                                                     2
                                                                                 1                                                                         1
 A    7/6     B     6/6         F   4/4     H        5/4     M   A                       B                       F                         H                           M
                                                                                                     6                           4
                                                                                 6                                                                         4
                                                                             2
      5/3   5/0     3/3       5/0   7/0   6/6    4/0       6/6                       5           3           5               7         6           4               6
                                                                     3


        C             G               J   5/0         L                      C                       G                           J         5           L
            4/0               6/0                                                        4                       6

                              ´µ                                                                             ´ µ
                                                                                             2                       4
        D   4/2       E       8/4     I   4/4         K                      D                       E                           I                     K
                                                                                                                                           4
                                                                                             2                       4
                                                                     4                                           4
      6/2   3/3     4/0       5/1   3/0   4/0    3/0       4/4                       3           4                           3         4           3               4
                                                                             2                           1
                                                                                 1                                                                         1
 A    7/6     B     6/6         F   4/4     H        5/4     M   A                       B                       F                         H                           M
                                                                                                     6                           4
                                                                                 6                                                                         4
                                                                             2
      5/3   5/0     3/3       5/0   7/0   6/6    4/0       6/6                       5           3           5               7         6           4               6
                                                                     3


        C             G               J   5/0         L                      C                       G                           J         5           L
            4/0               6/0                                                        4                       6

                              ´µ                                                                             ´ µ

     ÙÖ º ¿ ÓÒØ ÒÙ ÓÒ Ð Ð ÓÖ ØÑÓ                                 ÑÓÒ ×¹Ã ÖÔ ×Ó Ö Ð Ö                                                 Ð ¬ ÙÖ º º

7.10.12.1         An´lisis del algoritmo de Edmonds-Karp
                    a


   ÍÒ Ù×ÕÙ      Ò ÑÔÐ ØÙ Ö ÕÙ Ö O(E) Ô Ö Ð Ô ÓÖ ×Ó ´Ú Ö Ü º º ´Ô Ò ½ µµº
   ÒÙ ÚÓ¸ Ð × ÑÔ ÒÓ Ð Ð ÓÖ ØÑÓ ×Ø Ö ÓØ Ó ÔÓÖ N × O(E)¸ ÓÒ N × Ö Ð
Ñ Ü Ñ ÒØ          Ø Ö ÓÒ ×¸ Ó Ð Ñ Ü Ñ ÒØ          Ò Ö Ñ ÒØÓ× ­Ù Óº
     ÓÑÓ Ð Ù×ÕÙ     × Ò ÑÔÐ ØÙ ¸ ÐÓ× Ñ ÒÓ× ÙÑ ÒØÓ × × Ù Ö Ò × ÐÓ× Ñ ×
  ÓÖØÓ× ¸ Ò ÒØ        Ö Ó׸ ר ÐÓ× Ñ × Ð Ö Ó׺ ¬Ò ÑÓ× d(u, v) ÓÑÓ Ð ×Ø Ò
 Ò Ö Ó× ÙÒ Ñ ÒÓ ÒØÖ Ó× ÒÓ Ó× u Ý vº
Lema 7.6     Ë Ca ÙÒ Ñ ÒÓ i
                                   ÙÑ ÒØÓ Ð ÙÐ Ó ÔÓÖ find path breadth first()
  ÙÖ ÒØ Ð i¹ × Ñ Ø Ö ÓÒ Ð Ð ÓÖ ØÑÓ            ÑÓÒ ×¹Ã ÖÔº ÒØÓÒ ×¸ ÐÙ Ó Ð i¹ × ÑÓ
 Ò Ö Ñ ÒØÓ Ð ­Ù Ó¸ di+1(s, t) ≥ di(s, t)º
Demostraci´n Ä o       ÑÓ×ØÖ ÓÒ ÕÙ Ú Ð        ÑÓ×ØÖ Ö ÕÙ ¸ ×Ó Ö Ð Ö Ó Ö × Ù Ð¸ ∀v ∈
V − {s, t} Ø Ð ÕÙ Ò Ò ÙÒ Ñ ÒÓ       ÙÑ ÒØÓ ×Ñ ÒÙÝ Ð ×Ø Ò Ò Ö Ó× Ð Ñ ÒÓ
Ñ × ÓÖØÓ ÒØÖ s Ý vº ×ØÓ ÔÙ          ÑÓ×ØÖ Ö× ÔÓÖ ÓÒØÖ       ÓÒº
    ËÙÔÓÒ ÑÓ× Ci = s             v Ð      Ñ ÒÓ Ñ × ÓÖØÓ Ò Ö Ó× × s ר
vº      ÓÖ ×ÙÔÓÒ ÑÓ× Ð Ü ×Ø Ò             ÙÒ Ñ ÒÓ         ÙÑ ÒØÓ Ca ¸ Ð ÙÐ Ó ÔÓÖ                                         i
find path breadth first()¸ ÕÙ ÓÒØ Ò ÙÒ Ñ ÒÓ Ñ × ÓÖØÓ ×             Ö¸ ÕÙ di+1(s, v) <
d(Ci)º        ÑÓ× ÓÒ× Ö Ö Ó× × ØÙ ÓÒ × Ò Ö Ð ×
7.10. Redes de flujo                                                                                                                                           771


                                                                                                 1                        4
            D    4/3        E   8/4        I   4/4     K                         D                          E                             I                   K
                                                                                                                                                      4
                                                                                                 3                        4
                                                                         3
          6/3   3/3     4/0     5/5      3/3   4/0   3/0   4/4                           3             4         5                    3           4       3       4
                                                                                 3
                                                                                     1
 A        7/6     B     6/6          F   4/4     H   5/5     M       A                       B                        F                               H               M
                                                                                                            6                             4                   5
                                                                                     6
                                                                                                                                                      1
                                                                                 2                                                        2
          5/3   5/0     3/3     5/0      7/5   6/5   4/4   6/6                           5             3         5                                        4       6
                                                                         3                                                    5
                                                                                                                                              5

            C               G              J   5/5     L                         C                          G                             J                   L
                 4/0            6/0                                                          4                        6                               5

                                ´µ                                                                                ´ µ

          ÙÖ º          ר Ó ¬Ò Ð Ð Ð ÓÖ ØÑÓ                     ÑÓÒ ×¹Ã ÖÔ ÓÒ Ð Ö                                                        Ð ¬ ÙÖ º º

     ½º    v ∈ Cai =⇒ Ci
             /          × Ù × Ò Ó Ñ Ò ÑÓ Ò Ö Ó׺
     ¾º    ∃w ∈ Ci|w ∈ Ca =⇒ ÔÓ ÑÓ× ÓÒ× Ö Ö Ó× ÔÓ× Ð
                                 i
                                                          ×
            ´ µ Ë Ca = s v w t¸ ÒØÓÒ × Ci × Ù × Ò Ó Ñ Ò ÑÓº È ÖÓ¸
                        i

            ´ µ Ë Ca = s w v × Ö ÙÒ ÓÒØÖ
                        i
                                                 ÓÒ ÓÒ Ð  Ó ÕÙ Ci × Ð Ñ Ò ÑÓ
                  Ñ ÒÓ Ò Ö Ó× × s      vº ר ÙÒ     ÔÓ× Ð   × ÙÒ ÓÒØÖ     ÓÒº
                 Ð Ð Ñ × ÔÙ × ÖØÓ
       o               ıtico de un camino de aumento) Ë Ca = s
Definici´n 7.18 (Arco cr´                                          v1
...u → v    vm     t ÙÒ Ñ ÒÓ       ÙÑ ÒØÓ Ù ÐÕÙ Ö ×Ó Ö ÙÒ Ö Ö × Ù Ðº Ë
    ÕÙ ÙÒ Ö Ó (u, v) ∈ Ca × Ö Ø Ó × ×Ù Ô         Ò Ð Ö ÓÖ× ÙÐ × ÙÐ Ð
Ñ Ò ÑÓ ×Ð ÓÒ Ca Ý (u, v) ∈ E × Ö¸ (u, v) ∈ E º
                                           /

Ä ÔÖÓÔ      ÙÒ Ñ ÒØ Ð ÙÒ Ö Ó Ö Ø Ó × ÕÙ ×Ø × Ð Ñ Ò           Ð Ö Ö× ÙÐ Ð
Ò Ö Ñ ÒØ Ö× Ð ­Ù Ó × × ØÖ Ø ÙÒ Ö Ó          Ð ÒØÓ¸ Ó Ð Ö Ñ ÒØ Ö× 0 × × ÙÒÓ
   Ö ØÖÓ ×Óº Ô ÖØ Ö      ר      Ó¸ ÔÓ ÑÓ× ×Ø Ð Ö ÕÙ × Ð Ñ ÒÓ       ÙÑ ÒØÓ
Ca ÓÒØ Ò ÙÒ Ö Ó Ö Ø Ó (u, v)¸ ÒØÓÒ ×¸ Ô Ö ÙÒ Ø Ö ÓÒ ÙØÙÖ ¸ ÙÒ Ñ ÒÓ
     i
 ÙÑ ÒØÓ Ca ÕÙ ÒÚÓÐÙ Ö ÐÓ× ÒÓ Ó× u Ý v × × ÙÖÓ ÕÙ d(Ca ) ≥ d(Ca ) + 2º È Ö
                  i+k                                                                                           i+k                           i
 ÔÖ Ò Ö ×Ø        Ó¸ Ó × ÖÚ ÑÓ× Ð × Ù ÒØ ¬ ÙÖ
                                                                                                     Ca i
                        s                        u                           v                                                    t
                                                      Arco cr´
                                                             ıtico




                                                            w
                                                                         Ca i+k

Ä Ð Ò ÓÒØ ÒÙ ÐÙ×ØÖ ÙÒ ÔÓØ Ø Ó Ñ ÒÓ           ÙÑ ÒØÓ ÓÒ ÙÒ Ö Ó Ö Ø Ó u, v
Ð i¹ × Ñ Ø Ö ÓÒ Ð Ð ÓÖ ØÑÓ       ÑÓÒ ×¹Ã ÖÔ Ñ ÒØÖ × ÕÙ Ð Ð Ò ÔÙÒØ       ÙÒ
  Ñ ÒÓ ÙÑ ÒØÓ Ò ÙÒ Ø Ö ÓÒ ÙØÙÖ i + kº Ð Ò Ö Ñ ÒØ Ö× Ð ­Ù Ó Ð Ö Ó Ö Ø Ó
  × Ô Ö º ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ù ÐÕÙ Ö Ñ ÒÓ         ÙÑ ÒØÓ ÙØÙÖÓ ÕÙ ÒÚÓÐÙ Ö u
Ý v Ø Ò ÕÙ ÓÒØ Ò Ö¸ Ù Ò Ó Ñ ÒÓ׸ ÙÒ ÒÓ Ó ÒØ ÖÑ Ó w Ý Ó× Ö Ó× Ñ × ×ØÓ
 × × ÙÖÓ ÔÓÖÕÙ ÐÓ× Ñ ÒÓ×    ÙÑ ÒØÓ × Ù× Ò Ò ÑÔÐ ØÙ ¸ ÐÓ ÕÙ ¸ ÓÑÓ Ý ÐÓ
  Ð Ö ÑÓ׸ Ö ØÓÖÒ Ñ ÒÓ× × ÐÓ× Ñ × ÓÖØÓ×       ÐÓ× Ñ × Ð Ö Ó׺
772                                                         Cap´
                                                                   ıtulo 7. Grafos



       Ä Ñ Ü Ñ ÐÓÒ ØÙ ÔÓ× Ð ÙÒ Ñ ÒÓ            ÙÑ ÒØÓ × V ÒÓ Ó׺ ÓÒ× Ù ÒØ ¹
    Ñ ÒØ ¸ ÙÒ Ö Ó ÔÙ × Ö Ö Ø Ó Ò ÐÓ ×ÙÑÓ V/2 Ñ ÒÓ×         ÙÑ ÒØÓº ÈÓÖ Ø ÒØÓ¸ Ð
    Ñ Ü Ñ ÒØ         ÔÓ× Ð       Ñ ÒÓ× ÙÑ ÒØÓ × E × 2 º
                                                    V

          ÐÓ ÒØ Ö ÓÖ ÓÒ ÐÙ ÑÓ× ÕÙ Ð Ð ÓÖ ØÑÓ  ÑÓÒ ×¹Ã ÖÔ × E× V ×O(E) = O(VE2)º
                                                              2
    Ë Ð Ö × ×Ô Ö ¸ ÐÓ ÕÙ ÒÓ × Ò Ö Ù ÒØ ¸ ÒØÓÒ × E ≈ c V Ý Ð Ð ÓÖ ØÑÓ
      ÑÓÒ ×¹Ã ÖÔ × Ö O(V 3)
    7.10.13     Algoritmos de empuje y pre-flujo
    ÍÒ ­Ù Ó × Ò Ñ Ó Ò Ð × ÒØ Ó ÕÙ Ð ­Ù Ó × ÑÔÖ ×Ø ÓÖÖ Ò Ó ÔÓÖ Ð × ØÙ Ö ×
    × ÒÓ¸ ÒØÓÒ × ÒÓ ÔÓ Ö ÑÓ× Ð Ö ­Ù Óº
        ÁÑ Ò ÑÓ× ÙÒ Ö          ØÙ Ö         Ù ¸ ÔÓÖ ÑÔÐÓº ËÙÔÓÒ ÑÓ× ÕÙ × ÑÓ×
    Ñ Ü Ñ Þ Ö Ð ÒØ             Ù ÕÙ ÐÐ     Ð ×ÙÑ ÖÓº
        ÍÒ Ò ÓÕÙ ÕÙ ×Ù Ö Ð ÒØÙ ÓÒ × × ØÙÖ Ö Ð Ñ Ü ÑÓ Ð × ØÙ Ö × Ð ÒÓ Ó Ù ÒØ
       ר ݸ ×Ù × Ú Ñ ÒØ ¸ × ÐÓ× ÒÓ Ó× Ñ × Ý ÒØ × Ð Ù ÒØ ר Ð ×ÙÑ ÖÓ¸ Ö
     ¬Ò Ò Ó Ð × ÐÐ Ú × ­Ù Ó Ð × ØÙ Ö × Ð Ö           Ñ Ò Ö Ø Ð ÕÙ Ð ­Ù Ó Ò Ð ÔÙ
      Ö ÙÐ Ö × Ò ÓÒØ Ò ÓÒº
              × ÖÒÓ× Ð ÖÓ ÕÙ Ð Ñ Ü ÑÓ Ú ÐÓÖ ­Ù Ó Ø Ò ÕÙ × Ö Ñ ÒÓÖ Ó Ù Ð ×Ø ­Ù Ó
     Ò Ð¸ × ÓÑÓ ÕÙ ¸ × ØÓ × Ð × ÐÐ Ú × ×Ø Ò
        ÄÓ× ÒÓ Ó× ×Ø ÒÓ Ð × ØÙ Ö × ÕÙ Ñ Ò Ò Ð ×ÙÑ ÖÓ Ø Ò Ö Ò ÕÙ ×ÔÓÒ Ö
        ÙÒ ×Ô           Ð Ú ÖÓ׸ ÑÓ Ó ÕÙ Ð ­Ù Ó × Ð ÒØ Ð Ù ÒØ ÔÙ Ñ ÒØ Ò Ö×
     ÓÒר ÒØ Ñ ÒØÖ × × Ú Ò Ùר Ò Ó Ð × ÐÐ Ú × Ð Ö ×ØÓ Ð × ØÙ Ö ×º
          ר Ô ØÖÓÒ ÒØÙ Ø ÚÓ × Ð ÙÒ Ñ ÒØÓ ÙÒ × Ö            Ð ÓÖ ØÑÓ× ÒÓÑ Ò Ó×
    “empuje de pre-flujo”¸ Ö ÔÓÖØ Ó× × Ù ÖØÓ× ÔÓÖ ÔÖ Ñ Ö Ú Þ ÔÓÖ ÓÐ        Ö Ý Ì Ö¹
      Ò ½ ¸½ º
    Definici´n 7.19 (Pre-flujo) Ë
           o                       ÙÒ Ö N =< V, E, s, t, C >º ÍÒ “pre-flujo” × ÙÒ
    ÓÒ ÙÒØÓ E ⊂ E Ö Ó× ÓÒ Ú ÐÓÖ      ­Ù Ó ÔÓ× Ø ÚÓ Ø Ð ÕÙ ∀e = (u, v) ∈ E
      ½º   f(e) ≤   Ô(e)¸ Ý
      ¾º   u = s, v = s =⇒  ÇÍÌ(u) ≤ ÁÆ(u), ÇÍÌ(v) ≤ ÁÆ(v)º Ò ÓØÖ × Ô Ð Ö ×¸ Ð ­Ù Ó
          ×Ð           × Ö Ñ ÒÓÖ Ó Ù Ð ÕÙ Ð ÒØÖ º ÁÑÔÓÖØ ÒØ Ó × ÖÚ Ö ÕÙ Ó ×Ø
             ¬Ò ÓÒ ÒÓ × ÙÑÔÐ ¹Ø ÑÔÓÖ ÐÑ ÒØ ¹ Ð ÓÒ ÓÒ           ÓÒ× ÖÚ ÓÒ Ð ­Ù Ó
           ÐÐ ¸ Ô٠׸ Ð Ò ×        ×ØÖ Ø Ý × Ñ ÒØ ÓÒ Ö Ø        ÕÙ       ÒÓ Ó ÔÓ× Ð
           Ð Ú ÖÓº ÈÓÖ Ð Ñ ×Ñ Ö ÞÓÒ × ÕÙ ×Ø Ñ Ð             Ð ÓÖ ØÑÓ× × Ð ÒÓÑ Ò
           ÔÖ ¹­Ù Ó ¸ ÔÙ × ÙÖ ÒØ Ð      Ù ÓÒ Ð ÔÖÓ Ñ ÒØÓ ÒØÙ Ø ÚÓ ÒÓ Ý ­Ù Ó ×Ó Ö
           Ð ÙÒÓ× ÒÓ Ó׸ Ò ÐÙ Ó Ð ×ÙÑ ÖÓº
        ÍÒ ÒÓ Ó ×Ø ÒØÓ Ð Ù ÒØ Ó Ð ×ÙÑ ÖÓ × ÐÐ Ñ Ó ÒØ ÖÒÓ º ÍÒ ÒÓ Ó ÒØ ÖÒÓ ÙÝÓ
    ­Ù Ó ÒØÖ           × Ñ ÝÓÖ ÕÙ Ð × Ð × ÒÓÑ Ò Ó “activo”º
         Ò ÙÒ ÓÒ Ð Ì Net Graph<TNode,TArc,T>¸ Ð Ø ÖÑ Ò ÓÒ ÙÒ ÒÓ Ó Ø ÚÓ
     × × ÑÔÐ
¾     ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡                         ¿
         template <class Net> static
     bool is_node_active(typename Net::Node * p)
     {
       return p->in_flow > p->out_flow;
     }
7.10. Redes de flujo                                                               773



        È Ö ÙÒ ÒÓ Ó Ø ÚÓ u¸ Ð Ú ÐÓÖ ÁÆ(u) − ÇÍÌ(u) × ÒÓÑ Ò Ó Ü ×Ó Ý ÒÓØ Ó
     ÓÑÓ Ü ××(u)º
        Ë Ù Ò Ó ÓÒ Ð ÔÖÓ Ñ ÒØÓ ÒØÙ Ø ÚÓ Ð           ÙÒ Ñ ÒØ Ð ÙÒ Ð ÓÖ ØÑÓ ÔÖ ¹
    ­Ù Ó × ÓÑ ÒÞ Ö ÑÔÙ Ö × Ð Ù ÒØ Ð Ñ ÝÓÖ ÒØ                ÔÓ× Ð ­Ù Ó ×Ø ÕÙ
    ÒÓ × ÔÙ     ÑÔÙ Ö Ñ × ×Ó Ö Ð ×ÙÑ ÖÓº Ò ×Ø ÑÓÑ ÒØÓ Ð ­Ù Ó            × Ö Ñ Ü ÑÓ¸
    Ô ÖÓ ÑÙÝ ÔÖÓ Ð Ñ ÒØ      Ö Ò ÒÓ Ó× Ø ÚÓ× ÙÝÓ ÕÙ Ð Ö Ó Ý ÕÙ Ö ×Ø ÙÖ Öº
          ÓÑÓ Ð Ö ÒÓ Ó× Ý Ö Ó× ÔÓÖ ÓÒ ÑÔÙ Ö ÔÖ ¹­Ù Ó Ð Ò Ó Ð Ð ÓÖ ØÑÓ Ð
    Ö ×ÔÙ ×Ø × Ö Ø Ð Ù ÒØ Ý ØÓ Ó× ×Ù× Ö Ó׺ ÄÙ Ó¸ ÐÓ× ÒÓ Ó× Ø ÚÓ× ×ÓÒ Ð Ð ×
    Ô ÖÓ¸ ÔÓÖ Ù Ð × ÒØÖ ×Ù× Ö Ó× ÑÔÙ Ö Ð ÔÖ ¹­Ù Ó ×Ø ÔÖ ÙÒØ Ú ÞÓÖ Ð ×ÙÒØÓ
    Ñ × ÓÑÔÐ Ó ×Ø Ð ×          Ð ÓÖ ØÑÓ¸ ÔÙ × Ð Ð ÙÐÓ Ð ­Ù Ó Ñ Ü ÑÓ Ý Ð Ø ÖÑ Ò ÓÒ
      ÔÒ       ÙÒ × Ó Ò         Ù       Ð ÔÖÓÜ ÑÓ ÒÓ Ó ÔÖÓ × Ö Ý ÔÓÖ Ù Ð × ÒØÖ ×Ù×
     Ö Ó× × Ð ÑÔÙ Ö ÔÖ ¹­Ù Óº
    7.10.13.1   Altura de un nodo

    Ä ÑÐ          Ð ÓÖ ØÑÓ× ÕÙ ÔÖÓÒØ Ñ ÒØ      ¬Ò Ö ÑÓ׸ ×Ù Ý    Ð ×Ó Ò         Ð ÔÖÓÜ ÑÓ
    ÒÓ Ó Ò Ð            ÐØÙÖ º
    Definici´n 7.20 (Funci´n de altura de un nodo)
           o             o                               Ë ÙÒ Ö N =< V, E, s, t, C >
    ÓÒ Ö Ö × Ù Ð N =< V, E , s, t, C >º ÍÒ ÙÒ ÓÒ         ÐØÙÖ Ah : V −→ N × ÙÒ ÙÒ ÓÒ
     ÒØÖ ÐÓ× ÒÓ Ó× Ð Ö Ø Ð ÕÙ
       ½º h(t) = 0º
       ¾º ∀e = (u, v) ∈ E =⇒ h(u) ≤ h(v) + 1º
        Ê ÓÖ ÑÓ× ÕÙ ÙÒ ÙÒ ÓÒ × ÙÒ ÓÒ ÙÒØÓ Ô Ö × ÓÖ Ò Ó׺ Ò ÒÙ ×ØÖÓ ×Ó
    Ô ÖØ ÙÐ Ö Ð Ø ÔÓ Ah = {(u1, h(u1)), (u2, h(u2)), . . . (un, h(un))}º
        ÍÒ Ö Ó e = (u, v) × Ð ¬       “elegible” × h(u) = h(v) + 1º

        È Ö Ñ ÒØ Ò Ö Ð Ú ÐÓÖ Ð ÙÒ ÓÒ              ÐØÙÖ         ÙÒ ÒÓ Ó¸ Ù× Ö ÑÓ× ×Ù ÓÒØ ÓÖ
    ´Ú × Ü º¿º º¾ ´Ô Ò ¿µµ
¿     ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡                           ¾
          template <class Net> static
      long & node_height(typename Net::Node * p) { return NODE_COUNTER(p); }
    Ä Ô ÖØ Ò Ò Ó ÒÓ ÙÒ ÒÓ Ó Ð ÓÒ ÙÒØÓ Ah Ø ÖÑ Ò Ð ÙÒ ÓÒº
       Ä          Ð ÙÒ ÓÒ      ÐØÙÖ × Ñ ÒØ Ò Ö ÙÒ Ö Ð ÓÒ ÔÖÓÜ Ñ       ÒØÖ Ð ÔÖ ¹
    ­Ù Ó Ý ÐÓ× ÒÓ Ó× Ù ÒØ Ý ×ÙÑ ÖÓº Ù Ò Ó Ð ÐØÙÖ ÙÒ ÒÓ Ó Ø ÚÓ × Ñ ÒÓÖ ÕÙ Ð
      Ð Ù ÒØ ¸ ÒØÓÒ × × ÔÖÓ Ð ÑÔÙ Ö ÔÖ ¹­Ù Ó          Ð ×ÙÑ ÖÓº Ë Ñ ØÖ Ñ ÒØ ¸ ×
    Ð ÐØÙÖ × Ñ ÝÓÖ¸ ÒØÓÒ × ÔÖÓ Ð Ñ ÒØ Ý ÕÙ ÚÓÐÚ Ö ÔÖ ¹­Ù Ó             Ð Ù ÒØ º
    7.10.13.2   Algoritmo gen´rico de pre-flujo
                             e

     Ò Ú ÖØÙ     ×Ù Ö Ø Ö ÒØÙ Ø ÚÓ¸ ÐÓ× Ð ÓÖ ØÑÓ× × Ó× Ò ÑÔÙ      ÔÖ ¹­Ù Ó ×ÓÒ
    Ñ × × ÑÔÐ × ÕÙ ÐÓ× × Ó× Ò Ù×ÕÙ ×              Ñ ÒÓ×   ÙÑ ÒØÓº Ò Ò ÙÖ ¸
    ÔÖ Ø Ñ ÒØ × ØÓ Ó Ð ÓÖ ØÑÓ           ÔÖ ¹­Ù Ó ×Ù Ý ×Ó Ö Ð × Ù ÒØ Ð ÓÖ ØÑÓ
      Ò Ö Óº
774                                                            Cap´
                                                                  ıtulo 7. Grafos



Algoritmo 7.6 (Algoritmo gen´rico de empuje de pre-flujo)
                              e                                 Ä    ÒØÖ    × ÙÒ
Ö N =< V, E, s, t, C >º Ä × Ð    × Ð Ñ ×Ñ Ö ÓÒ Ú ÐÓÖ ×              ­Ù Ó Ùר Ó Ð
Ñ Ü ÑÓ Ú ÐÓÖ ­Ù Óº
      Ñ × Ð Ö Ö × Ù Ð N =< V, E , s, t, C >¸ Ð Ð ÓÖ ØÑÓ Ù× ÙÒ ×ØÖÙ ¹
ØÙÖ      ØÓ× ÒØ ÖÒ ¸ ÒÓÑ Ò Ah¸ ÙÝÓ ¬Ò × ÑÔÐ ÒØ Ö Ð ÙÒ ÓÒ      ÐØÙÖ º
ÒÓ Ó u ×Ó ×Ù Ú ÐÓÖ h(u) Ø Ð ÓÑÓ × ÜÔÐ Ó Ò Ð ×Ù ¹× ÓÒ ÒØ Ö ÓÖº
  ½º Ð ÙÐ Ö Ð Ö Ö × Ù Ð N
  ¾º × Ò Ö           ÒÓ Ó u ×Ù Ú ÐÓÖ h(u) × ÙÒ ¬Ò ÓÒ º¾¼
  ¿º Ah = ∅ ´ Ð ÓÒ ÙÒØÓ ÒÓ Ó× Ø ÚÓ×µ
   º ∀e = (s, u) ∈ s ÈÖ ¹­Ù Ó Ò Ð          Ö Ó× Ð ÒÓ Ó Ù ÒØ ½
      ´ µ f(e) = Ô(e) [Saturaci´n]o
      ´ µ Ë u = t =⇒ Ah = Ah ∪ {u} [a˜adir u al conjunto de nodos activos]
                                        n

   º Å ÒØÖ × Ah = ∅ [Equilibrar nodos activos]
      ´ µ Ë Ð ÓÒ ÙÒ ÒÓ Ó Ø ÚÓ u ∈ Ah, Ah = Ah − {u}
      ´ µ ∀e ∈ u, e ∈ E [Empuje de pre-flujo de u]
             º Ë e = (u, v) × ÙÒ “arco elegible” × Ö¸ × h(u) = h(v) + 1 =⇒
                ÑÔÙ Ö ÔÖ ¹­Ù Ó ÔÓÖ Ö Ó ØÙ Ð       ½
                º fp = Ñ Ò( Ü ××(u), Ô(e) − f(e)) [Flujo a empujar sobre el arco]
                º f(e) = fp
                º Ü ××(u) = Ü ××(u) − fp
                º Ë u = s Ý u = t =⇒ Ah = Ah ∪ {v}
      ´ µ Ë Ü ××(u) > 0 =⇒ h(u) = h(u) + 1, Ah = Ah ∪ {u} ´u × ÙÒ ÙÒ ÒÓ Ó Ø ÚÓ
           ÓÒ ÙÒ Ò Ö Ñ ÒØÓ Ò Ð ÙÒ ÓÒ ÐØÙÖ µ
      Ð Ð ÓÖ ØÑÓ ÑÔÙ ØÓ Ó Ð ÔÓ× Ð ÔÖ ¹­Ù Ó ÔÓÖ ÐÓ× Ö Ó× Ð Ù ÒØ º È ÙÐ Ø Ò Ñ ÒØ ¸
× ÙÒ Ð ÓÖ Ò Ò ÕÙ × ÔÖ × ÒØ Ò ÐÓ× ÒÓ Ó× Ø ÚÓ׸ Ð Ü ×Ó × Ú ÔÖÓÔ Ò Ó ×Ø
 Ð ÒÞ Ö Ð ×ÙÑ ÖÓº Ù Ò Ó ×Ø Ú Ò × ØÙÖ Ó¸ Ð Ü ×Ó Ö ØÓÖÒ                      Ð Ù ÒØ
  Ö Ò Ò Ó× ¸ × × ÔÓ× Ð ¸ Ò ÕÙ ÐÐÓ× ÒÓ Ó× ÕÙ Ø Ò Ò Ô          º Ò ÐÑ ÒØ ¸ Ù Ò Ó Ð
 Ü ×Ó Ð ÒÞ Ð Ù ÒØ ¸ ר × Ð Ö ×Ø ×Ù× Ö Ó× ×Ø ÕÙ Ð ­Ù Ó Ú Ò ×Ø Ð º Ò
 ר ר Ó¸ Ð ­Ù Ó × Ñ Ü ÑÓ Ý Ý ÒÓ Ü ×Ø Ò ÒÓ Ó× Ø ÚÓ׺
      Ò Ð ÒרÖÙ ÓÒ ´ µ × Ø ÖÑ Ò × × ÑÔÙ Ó ÒÓ ÔÖ ¹­Ù Ó ÔÓÖ              Ö Ó × Ð ÒØ
   Ð ÒÓ Ó ØÙ ÐÑ ÒØ × Ð ÓÒ Óº Ë ÒÓ × ÐÓ Ö ÑÔÙ Ö ØÓ Ó Ð Ü ×Ó¸ ÒØÓÒ × Ð ÒÓ Ó
 × ÓÐÓ Ó ÒÙ ÚÓ Ò Ah¸ Ô ÖÓ ÓÒ ÙÒ Ú ÐÓÖ h(u) Ò Ö Ñ ÒØ Ó Ò ÙÒ ÙÒ                ×ØÓ ×
ÐÓ ÕÙ Ô ÖÑ Ø ÕÙ Ú ÒØÙ ÐÑ ÒØ ÓØÖ Ø Ö ÓÒ ×Ó Ö Ð Ñ ×ÑÓ ÒÓ Ó Ú ÓÑÓ Ð Ð
ÙÒ Ö Ó ÕÙ Ò ÙÒ Ø Ö ÓÒ Ô × ÒÓ ÐÓ Ù Ý¸ Ò ÐÙ Ö Ú ÒÞ Ö Ð ÔÖ ¹­Ù Ó                     Ð
×ÙÑ ÖÓ¸ × Ö ØÖÓ             Ð Ù ÒØ ¸ ÔÙ Ò Ó Ó ÙÖÖ Ö¸ Ò ÐÙ× Ú ¸ ÕÙ × ×Ñ ÒÙÝ Ò ÐÓ×
­Ù Ó× Ñ Ò ÒØ × Ð Ù ÒØ º
     ÍÒ Ñ Ò Ö       ÔÖÓÜ Ñ Ö× Ð ÓÒ            Ð Ð ÓÖ ØÑÓ ÓÒ× ×Ø Ò Ü Ñ Ò Ö ÐÓ ÕÙ
 × ÙÒ Ñ Ð ×Ó Ô Ö ÙÒ Ð ÓÖ ØÑÓ Ù ÐÕÙ Ö × Ó Ò Ð Ù×ÕÙ                   ÙÒ Ñ ÒÓ
 ÙÑ ÒØÓº È Ö ÐÐÓ¸ ÓÒ× Ö ÑÓ× ÙÒ Ö          Ò Ö Ð ÓÒ Ð × Ù ÒØ ÓÖÑ
7.10. Redes de flujo                                                                        775




                                          x                y




 Ò ×Ø Ð ×       Ö Ð ÒÓ Ó x Ø Ò × Ø ÙÖ ÓÒ × ÕÙ Ö ×ÙÐØ Ò ÓÒ ×Ø ÒÓ yº Ò
ר ×Ó¸ × Ö ÕÙ Ö Ò ÓÒØÖ Ö × Ø Ñ ÒÓ×       ÙÑ ÒØÓ¸ Ô Ö ÔÓ Ö ÐÐ Ò Ö ÐÓ× ÒÓ Ó× x
 y Ñ ÒØÖ × ÕÙ ÙÒ Ð ÓÖ ØÑÓ × Ó Ò ÑÔÙ         ÔÖ ¹­Ù Ó ÔÖÓ Ð Ñ ÒØ ÐÓ× ÐÐ Ò Ö
Ô Ò × × ÑÔÙ Ð Ü ×Ó xº
    ÒØ × ÒרÖÙÑ ÒØ Ö Ð Ð ÓÖ ØÑÓ Ò Ö Ó Ý Ð ÙÒÓ× Ô ÖØ ÙÐ Ö ×¸   ÑÓ× ÔÖÓ Ö ×Ù
ÓÖÖ Ø ØÙ × Ö¸ ÕÙ Ð ÙÐ Ð ­Ù Ó Ñ Ü ÑÓº Ò ÐÓ ÕÙ × Ù ¸ ÔÐ ÒØ Ö ÑÓ× ÙÒ × Ö
  ÔÖÓÔÓ× ÓÒ × ×Ø Ò × ÔÖÓ Ö Ð ÔÖÓÔÓ× ÓÒ          ÓÖÖ Ø ØÙ º × Ö ÑÓ× ÒÙ ×ØÖÓ
 × ÙÖ×Ó Ò Ð ÔÐ ÒØ Ñ ÒØÓ Ë Û ¿¿ ¸ Ð Ù Ð ÓÒ× Ö ÑÓ× × Ð Ñ × ÐÑ ÒØ
ÔÖÓÔ Ð º
    Ð ÔÖ Ñ Ö Ô ×Ó    Ð ÔÖÙ      ÓÖÖ Ø ØÙ × ÑÓ×ØÖ Ö ÕÙ Ð ÙÒ ÓÒ ÐØÙÖ ×
ÚÐ º
Proposici´n 7.11 (Sedgewick 2002 [33]) Ë ÙÒ Ö
         o                                                     N =< V, E, s, t, C >  ÓÒ Ö
Ö × Ù Ð N =< V, E , s, t, C >º Ë h : V −→ N ÙÒ                        ÙÒ ÓÒÐØÙÖ º ÒØÓÒ × Ð
 Ð ÓÖ ØÑÓ Ò Ö Ó ÑÔÙ                     ÔÖ ¹­Ù Ó º ÓÒ× ÖÚ Ð Ú Ð Þ         Ð ÙÒ ÓÒ      ÐØÙÖ
× ÙÒ Ð ¬Ò ÓÒ º¾¼º
Demostraci´n È Ö ¬ÖÑ Ö ÕÙ h × Ú Ð ¸ Ý ÕÙ
               o                                                        ÑÓ×ØÖ Ö ÕÙ ÐÓ Ð Ö Ó Ð
     Ù ÓÒ Ð Ð ÓÖ ØÑÓ h(u) ≤ h(v) + 1 Ô Ö ØÓ Ó Ö Ó Ð Ö Ö × Ù Ðº
      Ð Ô ×Ó ¾ × Ò Ú ÐÓÖ × ÓÖÖ ØÓ× × ÙÒ Ð ¬Ò ÓÒº                             Ñ ×¸ Ah × Ò ÐÑ ÒØ
Ú Óº ÈÓÖ ÐÓ ÕÙ Ð ÑÓ×ØÖ ÓÒ × Ö Ñ Ø ÓÑÔÖÓ Ö ÕÙ ÐÓ× ÒÓ Ó× ÕÙ × ÒØÖÓ ÙÞ Ò
  Ah × Ø ×      Ò Ð ¬Ò ÓÒº
     ÁÑ Ò ÑÓ× ÙÒ ÒÓ Ó Ø ÚÓ uº Ë ÒÓ Ü ×Ø Ò Ò ÙÒ Ö Ó Ð Ð ¸ ÒØÓÒ × h(u) =
h(u) + 1 Ý u Ö Ö × Ð ÓÒ ÙÒØÓ                     ÐÓ× ÒÓ Ó× Ø ÚÓ× ÓÒ h(u) Ò Ö Ñ ÒØ Ó Ò ÙÒÓ
ÔÓÖ Ð ÒרÖÙ ÓÒ º ÒØ ×                         ר ÒרÖÙ ÓÒ¸               ÙÒ ÓÒ ÙÒØÓ Ú Ð Ó Ah =
{(v1, h(v1)), (v2, h(v2)), . . . (u, h(u)), . . . , (vn, h(vn))} ÐÙ Ó¸ Ð ÓÒ ÙÒØÓ Ø Ò ÓÖÑ Ah =
{(v1, h(v1)), (v2, h(v2)), . . . (u, h(u) + 1), . . . , (vn, h(vn))}¸ Ð Ù Ð × Ù × Ò Ó Ú Ð Ó × ÙÒ
Ð ¬Ò ÓÒº
     Ë u Ø Ò ÙÒÓ Ó Ñ × Ö Ó× Ð Ð ×¸ ÒØÓÒ × Ð ÙÒÓ× × × ØÙÖ Ö Ò ÔÐ Ò Ô                            ¸
   × Ô Ö Ö Ò Ð Ö Ö × Ù Ð Ý Ô Ö Ö Ò ÓØÖÓ× ÒÚ Ö×Ó׺ ÓÒ× Ö ÑÓ× Ð ÙÐØ ÑÓ
ÐÓ× Ö Ó× Ð Ð × u → v¸ Ð Ù Ð Ø ÖÑ Ò Ö ÕÙ u Ô ÖÑ Ò Þ Ó ÒÓ ÒØÖÓ Ð ÓÒ ÙÒØÓ
    ÒÓ Ó× Ø ÚÓ׺           ÑÓ× ÓÒØ ÑÔÐ Ö Ó× ÔÓ× Ð                   ×
    ½º ÉÙ u → v × × ØÙÖ ÔÐ Ò Ô                             Ò ×Ø ×Ó¸ u → v Ø Ñ Ò × Ô Ö
776                                                                 Cap´
                                                                       ıtulo 7. Grafos



     Ð Ö Ö × Ù Ð¸ × Ö ÙÒ Ö Ó ÒÚ Ö×Ó v → u Ý u      × Ö ÙÒ ÒÓ Ó Ø ÚÓº ÈÓÖ ÐÓ
     ÕÙ Ð ÙÒ ÓÒ h × ÓÖÖ Ø º
  ¾º ÉÙ u → v ÒÓ × × ØÙÖ ÔÐ Ò Ô           Ò ×Ø ×Ó¸ u → v × Ñ ÒØ Ò Ò Ð
     Ö Ö × Ù Ð¸ Ô Ö ÙÒ ÒÙ ÚÓ Ö Ó v → u¸ Ô ÖÓ h(u) × Ò Ö Ñ ÒØ º Ä × ØÙ ÓÒ
     ¬Ò Ð × ÔÙ Ñ Ò Ö ×

                                                     .
                                                     .    Nuevos nodos
                                                     .    a Ah
                                         u



                                                     v


           Ö Ó w → u × Ø × h(w) ≤ h(u) + 1¸ ÔÙ × u Ù Ò Ö Ñ ÒØ Óº
     È Ö ÐÓ× Ö Ó× u → v Ý v → u Ø Ò ÑÓ× ÕÙ h(u) = h(v)¸ ÐÓ ÕÙ × Ø × Ð Ú Ð Þ
        Ð ÙÒ ÓÒ ÐØÙÖ
   Ä ÓØ ÓÒ Ð Ú ÐÓÖ h(u) ÒÓ× ÓØ Ð ÒØ                  Ö Ó× ÕÙ ÓÒØ Ò Ð Ñ ÒÓ
Ñ Ò ÑÓ u t¸ Ø Ð ÓÑÓ ÐÓ ×Ø Ð Ð ÔÖÓÔÓ× ÓÒ × Ù ÒØ º
Proposici´n 7.12 (Sedgewick 2002 [33]) Ë ÙÒ Ö
         o                                                  N =< V, E, s, t, C > ÓÒ Ö
Ö × Ù Ð N =< V, E , s, t, C >º Ë Ah : V −→ N ÙÒ ÙÒ         ÓÒ ÐØÙÖ º ÒØÓÒ ×¸ ∀v ∈ V
h(v) × Ñ ÒÓÖ Ó Ù Ð ÕÙ Ð Ð ÐÓÒ ØÙ         Ð Ñ ÒÓ Ñ ×       ÓÖØÓ Ò Ö Ó× × v          t Ò
Ð Ö Ö × Ù Ðº
Demostraci´n Ë d Ð ÐÓÒ ØÙ
           o                          Ð       Ñ ÒÓ Ñ × ÓÖØÓ Ò Ö Ó× × ÙÒ ÒÓ Ó v
tº Ë Cv,t = v = v1 → v2 · · · → vd = t       Ð Ñ ÒÓ Ñ × ÓÖØÓ Ò Ð Ö Ö × Ù Ðº ÒØÓÒ ×
                    h(v) = h(v1) ≤ h(v2) + 1
                                   ≤ h(v3) + 1
                                   ººº
                                   ≤ h(vd) + d = h(t) + d = d

      Ð Ð ÓÖ ØÑÓ × ÑÔÖ Ñ ÒØ Ò ÓÒ Ø Ó Ð Ü ×Ó × Ö¸ ÒÓ Ý ÒÓ Ó× Ø ÚÓ× ÕÙ
 ר Ò Ò ÓÒ ÜÓ× Ò Ð Ö Ö × Ù Ðº ÁÒ ÐÑ ÒØ Ð Ü ×Ó ­Ù Ó¸ Ñ Ò Ð Ù ÒØ Ý ×
  Ö           Ð ×ÙÑ ÖÓ¸ Ð Ù Ð Ø Ò h(t) = 0 Ý ÒÙÒ × Ò        Ahº ÄÓ× Ü ×Ó× ×ÓÒ
ÔÖÓÔ Ó×            Ð ×ÙÑ ÖÓ Ò Ð ÒרÖÙ ÓÒ ´ µ º Ë ÒÓ × Ð ÒÞ Ð ×ÙÑ ÖÓ¸ Ó
 ÙÒ Ö ×Ø Ò ÒÓ Ó× Ø ÚÓ׸ ÒØÓÒ × Ð Ü ×Ó × ÑÔÙ Ó            Ð Ù ÒØ Ô Ö   Ö Ñ Ò¹
Ø ÖÐÓº ר        Ó¸ ר Ð ÔÖ × ÒØ ÒØÙ Ø ÚÓ¸ ÔÙ   ÓÒ¬ÖÑ Ö× Ó Ø Ú Ñ ÒØ Ñ ÒØ
Ð × Ù ÒØ ÔÖÓÔÓ× ÓÒº
Proposici´n 7.13 (Sedgewick 2002 [33]) Ë ÙÒ
         o                                  Ö N =< V, E, s, t, C > ÓÒ Ö
Ö × Ù Ð N =< V, E , s, t, C >º Ë Ah : V −→ N
                                           ÙÒ ÙÒ ÓÒ      ÐØÙÖ º ÒØÓÒ ×¸
 ÙÖ ÒØ Ð    Ù ÓÒ Ð Ð ÞÓ Ð Ð ÓÖ ØÑÓ º ¸ Ô Ö     ÒÓ Ó Ø ÚÓ
  ½º Ü ×Ø ÙÒ Ñ ÒÓ Ò Ð Ö Ö × Ù Ð × Ð ÒÓ Ó Ø ÚÓ ×Ø Ð Ù ÒØ º
  ¾º ÆÓ Ü ×Ø Ñ ÒÓ × Ð Ù ÒØ           Ð ×ÙÑ ÖÓº
7.10. Redes de flujo                                                                            777



Demostraci´n ´ÔÓÖ Ò Ù
          o                       ÓÒ ×Ó Ö ÐÓ× ÒÓ Ó× Ø ÚÓ×µ ÒØ × ÒØÖ Ö Ð Ð ÞÓ¸ Ð Ô ×Ó
ÒØÖÓ Ù Ò Ah ØÓ Ó× ÐÓ× ÒÓ          Ó× {u1, u2, . . . , un} Ý ÒØ × sº רÓ× Ö Ó× ×ÓÒ × ØÙÖ Ó×
  ×Ù ÔÐ Ò Ô              ¸ ÐÓ ÕÙ ÑÔÐ Ð Ô Ö ÓÒ               Ö Ó× (u1, s), (u2, s), . . . (un, s) Ò Ð
Ö Ö × Ù Ð Ý Ð × Ô Ö ÓÒ ÐÓ× ÒÚ Ö×Ó× (s, u1), (s, u2), . . . (s, un)º ÄÓ× ÒÓ Ó× Ø ÚÓ×
u1, u2, . . . , un Ø Ò Ò Ñ ÒÓ× ×Ø Ð ×ÙÑ ÖÓ Ý Ð Ù ÒØ ݸ ÔÓÖ Ð                     × Ô Ö ÓÒ ÐÓ×
 ÒÚ Ö×Ó׸ s ÕÙ          × ÓÒ Ø Óº ÈÓÖ Ø ÒØÓ¸ Ð ÒØÖ Ö Ð Ð ÞÓ Ð ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö
ÐÓ× ÒÓ Ó× Ø ÚÓ× Ò Ð × Ý ÒØ × Ð Ù ÒØ º
       ÓÖ ×ÙÑ ÑÓ× ÕÙ Ð ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö ØÓ Ó ÒÓ Ó ÒØÖÓ Ð ÓÒ ÙÒØÓ Ah
   ÒÓ Ó× Ø ÚÓ׺
    Ä ÙÒ Ñ Ò Ö                ÕÙ × Ò ÙÒ ÒÙ ÚÓ ÒÓ Ó v Ah¸ × Ö¸ ÕÙ Ô Ö Þ
ÙÒ ÒÙ ÚÓ ÒÓ Ó Ø ÚÓ¸ × ÕÙ × ÙÒ ØÙ Ð Ø ÚÓ u Ü ×Ø ÙÒ Ö Ó Ð Ð u → v
´ ÒרÖÙ ÓÒ ´ µ µº À Ý Ó× ×Ó× ÓÒ× Ö Ö
   ½º v ÒÙÒ          × Ó Ø ÚÓ Ò ×Ø ×Ó h(u) = h(v) + 1º ÒØ × ÑÔÙ Ö ÔÓÖ u → v¸
      ÒÓ Ý Ñ ÒÓ v s¸ ÔÙ × ÐÓ× Ö Ó× × Ð ÒØ × v ÒÓ ×ÓÒ Ö × Ù Ð ×º
         Ù Ò Ó × ÑÔÙ Ü ×Ó ÔÓÖ Ð Ö Ó u → v¸ Ô Ö ÙÒ Ö Ó Ö × Ù Ð × Ð ÒØ v → uº
      ÈÓÖ Ð ÔÓØ × × Ò Ù Ø Ú ¸ Ü ×Ø ÙÒ Ñ ÒÓ u s ÔÓÖ Ø ÒØÓ¸ Ð Ö Ó Ö × Ù Ð v → u
          Ö ÒØ Þ ÕÙ Ø Ñ Ò Ü ×Ø ÙÒ Ñ ÒÓ × v sº
           Ð Ñ ×ÑÓ ÑÓ Ó¸ ÔÓÖ Ð ÔÓØ × × Ò Ù Ø Ú ÒÓ Ý Ñ ÒÓ s t Ý Ð Ò ÙÖ Ð
        Ö Ó v → u ÒÓ ÐØ Ö ×Ø ¬ÖÑ ÓÒº
   ¾º v Ý Ù Ø ÚÓ Ò ÙÒ ÐÓ ÒØ Ö ÓÖ ×Ø ×Ó Ó ÙÖÖ Ù Ò Ó v × ×                                     Ah Ý ÒÓ
          Ý Ò Ò ÙÒ Ö Ó Ð Ð º Ë Ò Ö Ñ ÒØ Ð Ú ÐÓÖ h(v) Ý v Ö Ö × Ah × Ò ÐØ Ö Ö
      Ð ØÓÔÓÐÓ            Ð Ö Ö× ÙÐ
    Ä ÔÖÓÔÓ× ÓÒ × ÓØ Ð Ô Ö Ó× ×Ó× Ô ÖØ ÙÐ Ö ×                             Ù ÓÒ ÑÓ×ØÖ Ó× Ò Ð
  ÑÐ           ¬ ÙÖ × º ´Ô º µ¸ º ´Ô º µ Ý º ¼ ´Ô º ¿µº
       ÓÖ Ø Ò ÑÓ× ØÓ × Ð × ÖÖ Ñ ÒØ × Ò × Ö × Ô Ö Ú Ö ¬ Ö Ð ÓÖÖ Ø ØÙ Ð Ð Ó¹
Ö ØÑÓ º º
Proposici´n 7.14 (Sedgewick 2002 [33])
         o                                           Ð Ð ÓÖ ØÑÓ º       Ð ÙÐ Ð ­Ù Ó Ñ Ü ÑÓ
ÙÒ Ö º
Demostraci´n
          o      Ð ÔÖ Ñ Ö ×ÙÒØÓ ÓÑÔÖÓ Ö × ÕÙ Ð Ð ÓÖ ØÑÓ ÙÐÑ Ò Ó × ¸ Ú Ö ¹
¬ Ö ÕÙ ÙÒ Ú Þ ÕÙ × ÒØÖ Ð Ð ÞÓ ´ ÒרÖÙ ÓÒ µ ר Ø ÖÑ Ò º Ä Ø ÖÑ Ò ÓÒ Ó ÙÖÖ
 Ù Ò Ó Ah Ú Ò Ú Óº Æ × Ø ÑÓ׸ ÒØÓÒ ×¸ Ñ Ö Ö Ð Ñ Ò Ö Ò ÕÙ Ah Ö Ý
    Ö Ý × ÙÖ ÖÒÓ× ÕÙ Ð Ð ÞÓ ÔÖÓ Ö × × Ö¸ ÕÙ ÒÓ              Ò ÙÒ ÐÓ Ò¬Ò ØÓº
    Ah Ö    ÔÓÖ Ó× Ö ÞÓÒ ×º Ä ÔÖ Ñ Ö × ÔÓÖ ÑÔÙ    ÔÖ ¹­Ù Ó ÔÓÖ ÙÒ Ö Ó u → v
´ ÒרÖÙ ÓÒ ´ µ µ¸ Ò ÙÝÓ ×Ó v Ú Ò Ø ÚÓº Ä × ÙÒ × ÔÓÖÕÙ ÒÓ × ÔÙ
 ÑÔÙ Ö ØÓ Ó Ð ­Ù Ó ÙÒ ÒÓ Ó Ø ÚÓ ´ ÒרÖÙ ÓÒ µ Ò ×Ø ×Ó¸ u Ö Ö × Ah ÓÒ
ÙÒ Ú ÐÓÖ h(u) Ò Ö Ñ ÒØ Óº
    Ah ×ÓÐÓ   Ö Ò Ð ÒרÖÙ ÓÒ º ÈÓÖ Ø ÒØÓ¸ Ð Ø ÖÑ Ò ÓÒ Ð Ð ÓÖ ØÑÓ Ô Ò
   ÕÙ Ð ÒØ           Ò ÙÖ × Ah ר ÓØ º Ò ×Ø × ÒØ Ó¸ ÒÓ× × Ö ÑÙÝ ÙØ Ð Ð
× Ù ÒØ Ð Ñ º
Lema 7.7      ÙÖ ÒØ Ð        Ù ÓÒ Ð Ð ÓÖ ØÑÓ Ò Ö Ó º ¸ ∀u ∈ V =⇒ h(u) < 2V º
778                                                                    Cap´
                                                                          ıtulo 7. Grafos



Demostraci´n
          o      Ë ÑÓ׸ × ÙÒ Ð ÔÖÓÔÓ× ÓÒ º½¾¸ ÕÙ h(u) × Ñ ÒÓÖ Ó Ù Ð ÕÙ Ð
ÐÓÒ ØÙ Ð Ñ ÒÓ Ñ × ÓÖØÓ × u                tº ÓÑÓ ØÖ Ø ÑÓ× ÓÒ ÙÒ Ö Ö × Ù Ð¸
ÔÓ ÑÓ× Ø Ò Ö ×Ø Ð Ó Ð           Ö Ó× Ý ÔÙ     Ö Ñ ÒÓ× ÕÙ Ô × Ò ÔÓÖ Ð Ù ÒØ º
ÈÓÖ Ø ÒØÓ¸ Ð Ñ ÒÓ Ñ × Ð Ö Ó × ÙÒ ÒÓ Ó u         t ÒÓ ÔÙ    Ü Ö 2V Ö Ó׸
ÔÙ × × ÒÓ ÓÒØÖ Ö Ð ÔÖÓÔÓ× ÓÒ º½¾
     ÓÒ Ð ÓÒÓ Ñ ÒØÓ        ר Ð Ñ ¸ ÔÓ ÑÓ× ¬ÖÑ Ö ÕÙ Ð ÒØ        Ú × ÕÙ Ð
 ÒרÖÙ ÓÒ Ò ÒÓ Ó× Ah ר ÓØ º Ð Ñ ×ÑÓ ÑÓ Ó¸ Ô Ö ÕÙ Ð ÒרÖÙ ÓÒ
 ´µ Ò        Ð ÒÓ Ó Ø ÚÓ v¸ Ð Ö Ó u v Ø Ò ÕÙ × Ö Ð Ð × Ö¸ h(u) = h(v)+1º
ÁÒ Ô Ò ÒØ Ñ ÒØ       Ð × ÓÑ Ò ÓÒ × ÕÙ × ×Ù Ò¸ Ð Ú ÐÓÖ h(u) ר ÓØ Ó¸
ÔÓÖ ÐÓ ÕÙ Ð Ñ Ü Ñ ÒØ             Ú × ÕÙ × Ò ÙÒ ÒÓ Ó Ø ÚÓ v ÔÓÖ Ý Ò
  × ÙÒ ÒÓ Ó u Ø Ñ Ò ÐÓ ×Ø º
    ÈÙ ×ØÓ ÕÙ Ð Ð ÞÓ ÜØÖ ÒÓ Ó× Ø ÚÓ× Ah Ý Ð ÒØ            Ò ÙÖ × Ah ר
  ÓØ ¸ ÓÒ ÐÙ ÑÓ× ÕÙ Ah Ú Ò Ú Ó¸ ÔÓÖ ÐÓ ÕÙ Ð Ð ÞÓ Ø ÖÑ Ò Ý ÓÒ Ð Ð Ð ÓÖ ØÑÓ
   ÍÒ Ú Þ ÕÙ Ah Ú Ò Ú Ó Ð Ö ÓÒØ Ò ÙÒ ­Ù Ó Ø Ð º Ò ×Ø ר                         Ó × ÑÓ׸
ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ º½¿¸ ÕÙ ÒÓ Ü ×Ø Ò Ò ÙÒ Ñ ÒÓ × Ð Ù ÒØ                           Ð ×ÙÑ ÖÓ¸
ÔÓÖ ÐÓ ÕÙ ÒÓ Ü ×Ø Ò Ò ÙÒ Ñ ÒÓ ÙÑ ÒØÓº ÓÒ× Ù ÒØ Ñ ÒØ ¸ × ÙÒ Ð                   ÔÖÓÔÓ× ÓÒ
Ü º½¼ ´Ô Ò     ¿µ¸ Ð ­Ù Ó × Ñ Ü ÑÓ
     Ð Ò Ð××       × ÑÔ ÒÓ Ð Ð ÓÖ ØÑÓ Ô Ò       Ð Ñ Ò Ö Ò ÕÙ                  ÑÔÐ ÒØ Ð
 ÓÒ ÙÒØÓ ÒÓ Ó× Ø ÚÓ× Ahº È ÖÓ ÒØ ×      ÓÖ Ö ×Ø ÑÔÐ ÒØ ÓÒ¸                    ÑÓ× × Ó Ö
ÙÒ ÓÖÑ       × Ò Ö ÐÓ× Ú ÐÓÖ × Ò Ð ×  ÐØÙÖ       ÒÓ Óº
7.10.13.3        Valores iniciales de la funci´n de altura
                                              o

ÀÝÚÖ ×ÑÒÖ×         × Ò Ö Ú ÐÓÖ × Ò Ð × h(u) ÕÙ × Ø × Ò Ð ¬Ò ÓÒ Ý ¹
Ù ÓÒ Ð Ð ÓÖ ØÑÓ º º È ÖÓ Ð Ò Ð Þ ÓÒ ÔÙ × Ö × Ò Ð Ô Ö Ð × ÑÔ ÒÓº È Ö
Ò Ö ×ØÓ¸ ÓÒ× Ö ÑÓ× Ð × Ù ÒØ Ò Ð Þ ÓÒ
                                               V   u=s
                                      h(u) =
                                               0   u=s

  ÙÒÕÙ ×Ø ÓÒ¬ ÙÖ ÓÒ × Ú Ð ¸ ר Ø Ò              Ù× Ö ÜØÖ ÓÒ × Ú Ò × × Ö Ü¹
ØÖ ÓÒ × ÒÓ Ó× × Ò Ö Ó× Ð Ð ×º ÄÙ Ó V Ø Ö ÓÒ ×¸ ÙÒÓ ÐÓ× ÒÓ Ó× Ý ÒØ ×
 Ð Ù ÒØ Ð ÒÞ Ð Ú ÐÓÖ V + 1 Ý Ú Ò Ð Ð º
      Ù Ð × Ð Ñ ÓÖ ÓÒ¬ ÙÖ ÓÒ × ÙÒ ÔÖ ÙÒØ ÕÙ Ô              Ú Ö× × ÒÚ ×Ø ÓÒ ×
ÕÙ ÓÒ× Ö Ò¸ ÒØÖ ÓØÖ × Ó× ×¸ Ð ØÓÔÓÐÓ        Ð Ö Ó¸ Ð Ø ÔÓ Ö ÕÙ ÑÓ Ð Þ ¸ ×Ù×
ÔÙÒØÓ× ÓÖØ ¸ Ø Ø Ö ¸ ÕÙ ÒÓ ÓÖ Ö ÑÓ× Ò ×Ø Ø ÜØÓº ÓÖ Ò¸ Ð Ð ÓÖ ØÑÓ
    ÑÓÒ ×¹Ã ÖÔ ÒÓ× ÔÖÓÔÓÖ ÓÒÓ Ð Ñ Ò Ö Ò Ö Ñ × ÓÖØ         Ö × Ð Ù ÒØ
 Ð ×ÙÑ ÖÓ Ð Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ º
     Ò ÐÓ ÕÙ × Ù ¸ ÓÒ× Ö ÑÓ× ÓÑÓ Ú ÐÓÖ Ò Ð h(u) Ð ÐÓÒ ØÙ Ñ × ÓÖØ
   × u ר Ð ×ÙÑ ÖÓ¸ Ð Ù Ð ÔÙ                 Ð ÙÐ Ö× Ò O(E) Ñ ÒØ ÙÒ Ö Ó¹
ÖÖ Ó Ò ÑÔÐ ØÙ Ò Ó × Ð ×ÙÑ ÖÓ Ý Ö Ø Ñ ÒØ Ö Ð Þ Ð ÔÓÖ Ð ÖÙØ Ò
breadth first traversal() ×ØÙ        Ò Ü º º ´Ô Ò ½ µº
          ØÓ× Ð × ÑÔÐ        Ý Ð ¬ Ò ¸ breadth first traversal() ×ÓÐÓ
 ÓÒ× Ö Ö Ö Ó× Ö × Ù Ð ×º È Ö ÐÐÓ¸ ¬Ò ÑÓ× Ð × Ù ÒØ Ö Ø Ö Ó Ñ Ö           Ö Ó¿¼
 ¿¼
      Î ×   Ü   º º½º½ ´Ô Ò ¼ µ Ý Ü º º ´Ô Ò ½ µ Ô Ö Ö Ö × Ö Ñ ÑÓÖ º
7.10. Redes de flujo                                                          779



 ÙÒ ÓÒ × Ô Ö  Net Graph<TNode,TArc,T> ¾ +≡                   ¿
 template <class N> class Res_Arc
 {
   bool operator () (typename N::Node *, typename N::Arc * a) const
   {
     return a->is_residual;
   }
 };
  ÓÒ ×Ø × ÑÔÐ ¬ÐØÖÓ¸ Ð ÒÚÓ ÓÒ breadth first traversal() ×Ó Ö Ð Ö Ó Ö × Ù Ð
   Ò         × Ð ×ÙÑ ÖÓ ÓÔ Ö ÓÑÓ × × ØÖ Ø × Ð Ö ÒÚ Ö× ´× Ò Ò ×
 ÓÒרÖÙ ÖÐ µº Ë × Ò ÑÓ× h(t) = 0¸ ÒØÓÒ × Ð × Ù ÒØ ÙÒ ÓÒ Ú × Ø ×Ó Ö
ÒÓ Ó × Ò Ð ÐÓÒ ØÙ Ð Ñ ÒÓ Ñ × ÓÖØÓ            Ð ×ÙÑ ÖÓ
  ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡
     template <class Net> static
 bool initial_height(Net & net, typename Net::Node * p, typename Net::Arc * a)
 {
   node_height<Net>(p) = node_height<Net>(net.get_src_node(a)) + 1;
   return false;
 }
Ë Ú × Ø ÑÓ× Ò ÑÔÐ ØÙ        Ð ÒÓ Ó  p ÔÖÓÚ Ò    ÒÓ ×      Ð Ö Ó a¸ ÒØÓÒ ×
node height<Net>(net.get src node(a)) + 1 ´ÕÙ   × ÓÖÖ ×ÔÓÒ ÓÒ h(p) + 1µ Ò
ÕÙ   Ý ÙÒ Ö Ó Ñ × × Ð ×ÙÑ ÖÓº
   Ð Ô ×Ó ¾ Ð Ð ÓÖ ØÑÓ Ò Ö Ó º × ÑÔÐ ÒØ           Ð × Ù ÒØ ÑÓ Ó
 ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡
 template <class Net> static void init_height_in_nodes(Net & net)
 {
   breadth_first_traversal <Net, Res_Arc<Net> >
     (net, net.get_sink(), &initial_height);
 }
    ר ÑÓ Ó¸ Ð ÐÐ Ñ      init height in nodes()    × ÒÖ           ÒÓ Ó ×Ù ×Ø Ò
  ר Ð ×ÙÑ ÖÓº
7.10.13.4   Manejo del conjunto Ah

  Ð Ñ Ò Ó Ð ÓÒ ÙÒØÓ Ah Ò Ô Ö Ø Ñ ÒØ ÓÒ ÐÓ× Ö Ø Ö Ó× Ð ÔÖÓ Ð Ñ ÙÒ Ñ Ò¹
Ø Ðº × ÕÙ Ò ÔÖ Ñ Ö Òר Ò ÔÙ Ö ÑÓ× ÑÔÐ Ö Ù ÐÕÙ Ö ×ØÖÙ ØÙÖ             ØÓ× ÒØÖ
Ð × Ú Ö× × ×ØÙ      ׺ Ë Ò Ñ Ö Ó¸ Ð ÓÒÓ Ñ ÒØÓ ×Ó Ö Ð Ö Ø Ö Ó Ð Ð
 Ö Ó ÒÓ× Ó Ö Ñ Ò Ö × ÑÔÐ Ö ÙÒ ×ØÖÙ ØÙÖ         ØÓ× ÕÙ ¸ Ù Ò Ó ÜØÖ ÙÒ ÒÓ Ó
    Ah ÒÓ× Ó Ö Þ ÙÒ Ö Ò ÔÖÓ      Ð      ÕÙ ×Ø ÓÒØ Ò Ö Ó× Ð Ð ×º Ò ×Ø
× ÒØ Ó¸ Ð × ÑÔÐ ÒØ ÓÒ × ÔÖ Ö × ×ÓÒ Ð × ÓÖ ÒØ ×        Ð ­Ù Ó Ò Ô ÖØ ÙÐ Ö¸ ÓÐ ×
  Á Ç Ý ÔÖ ÓÖ º
          ØÓ× Ó Ø Ò Ö ÙÒ ÑÔÐ ÒØ ÓÒ Ò Ö ¸ ÑÔÐ ÑÓ× Ð × × Ù ÒØ × ÖÙØ Ò × Ô Ö
 Ò× ÖØ Ö Ý Ð Ñ Ò Ö Ð ÓÒ ÙÒØÓ Ah
   ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡                   ¼
     template <class Q_Type> static
 void put_in_active_queue(Q_Type & q, typename Q_Type::Item_Type & p)
 {
   if (p->control_bits.get_bit(Aleph::Maximum_Flow))
780                                                                Cap´
                                                                          ıtulo 7. Grafos



            return;
          p->control_bits.set_bit(Aleph::Maximum_Flow, true);
          q.put(p);
     }
         template <class Q_Type> static
     typename Q_Type::Item_Type get_from_active_queue(Q_Type & q)
     {
       typename Q_Type::Item_Type p = q.get();
       p->control_bits.set_bit(Aleph::Maximum_Flow, false);
       return p;
     }
    put in active queue() Ò× ÖØ Ð Ð Ñ ÒØÓ p Ò ÙÒ            ÓÐ q Ø ÔÓ Ò Ö Ó Q Type¸
    Ñ ÒØÖ × ÕÙ get from active queue ÜØÖ ÙÒ Ð Ñ           ÒØÓ× Ð ÓÐ qº È Ö Ø Ø Ö
     ¬ ÒØ Ñ ÒØ Ý Ú Ø Ö Ò× Ö ÓÒ × ÙÔÐ              ׸ Ñ Ö ÑÓ× Ð Ø ÓÒØÖÓÐ Maximum Flow
     Ù Ò Ó ÙÒ ÒÓ Ó ×Ø ÒØÖÓ Q Typeº
         Ù Ò Ó ÐÙ Ó     ÑÔÙ Ö Ð ÔÖ ¹­Ù Ó ÙÒ ÒÓ Ó u ר ÙÒ Ô ÖÑ Ò    Ø ÚÓ¸ Ð
    Ö Ö × Ah ÓÒ ÙÒ Ú ÐÓÖ Ò Ö Ñ ÒØ Ó h(u)º ÍÒ Ù ×Ø ÓÒ ÒØ Ö × × Ù Ò ÔÖÓ Ð
     × ÕÙ ÓÒ Ð Ú ÐÓÖ Ò Ö Ñ ÒØ Ó h(u) u ÓÒØ Ò Ö Ó× Ð Ð ×
    7.10.13.5         Implantaci´n del algoritmo gen´rico
                                o                   e

     Ð Ù Ð ÕÙ ÓÒ ÐÓ× Ð ÓÖ ØÑÓ× × Ó× Ò Ù×ÕÙ                     Ñ ÒÓ×    ÙÑ ÒØÓ¸ ÐÓ×   ÔÖ ¹
    ­Ù Ó Ø Ñ Ò Ò ÐÓ Ö× Ò ÙÒÓ Ò Ö Ó¿½
¼     ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡
         template <class Net, class Q_Type> typename Net::Flow_Type
     generic_preflow_vertex_push_maximum_flow(Net & net,
                                              const bool & leave_residual = false)
     {
       net.make_residual_net();
       net.reset_counter_nodes();
       init_height_in_nodes(net);
       typename Net::Node * source = net.get_source();
       typename Net::Node * sink   = net.get_sink();
       Q_Type q; // instancia el conjunto de nodos activos
          ÈÖ ¹­Ù Ó Ò       Ð   Ö Ó× Ð ÒÓ Ó Ù ÒØ    ½
          while (not q.is_empty()) // mientras haya nodos activos
            {
              typename Net::Node * src = get_from_active_queue(q);
              typename Net::Flow_Type excess = src->in_flow - src->out_flow;
              for (Node_Arc_Iterator<Net, Res_F<Net> > it(src);
                   it.has_current() and excess > 0; it.next())
                {
                  typename Net::Arc * arc = it.get_current_arc();
                  typename Net::Node * tgt = net.get_tgt_node(arc);
                  if (node_height<Net>(src) != node_height<Net>(tgt) + 1) // ¿elegible?
                    continue; // no ==> avance al siguiente arco
                        ÑÔÙ Ö ÔÖ ¹­Ù Ó ÔÓÖ Ö Ó ØÙ Ð ½
                  }
     ¿½
          Ë ÓÑ Ø ¸ ÔÓÖ × ÑÔÐ    ¸Ð Ö   ÓÒ   ÐÓ× ×ÙÔÖ Ù ÒØ Ý ×ÙÑ ÖÓº
7.10. Redes de flujo                                                          781



              if (excess > 0) // ¿src a´n sigue activo?
                                       u
                { // s´ ==> incremente h(src) y re-inserte en q
                      ı
                  node_height<Net>(src)++;
                  put_in_active_queue(q, src);
                }
          }
        const typename Net::Flow_Type ret_val = source->out_flow;
        if (not leave_residual)
          net.unmake_residual_net();
       return ret_val;
      }
    Í× × Node Arc Iterator      º
    Ä ×ØÖÙ ØÙÖ       × × ÒØ ¹Ý × Ð ÙÒ × Ô Ö×Ô Ø Ú × Ñ × ÓÑÔÖ Ò× Ð ¹ Ð ÜÔÖ ¹
    ×     Ò Ö       Ñ Ø Ñ Ø Ò Ü º ´Ô Ò          µº
       Ä ÒרÖÙ       ÓÒ ½ × ÓÖÖ ×ÔÓÒ ÓÒ Ð ÒÚÓ ÓÒ Ð Ñ ØÓ Ó net.make residual net()¸
    Ñ ÒØÖ × ÕÙ     Ð ¾ × ÓÖÖ ×ÔÓÒ ÓÒ Ð ÐÐ Ñ        Ð ÖÙØ Ò init height in nodes(net)º
         Ð ÑÔÙ          ÔÖ ¹­Ù Ó Ò Ð ÔÓÖ ÐÓ× Ö Ó× Ñ Ò ÒØ × Ð Ù ÒØ ´ ÒרÖÙ ÓÒ µ ×
    Ö ÐÞ ×
½    ÈÖ ¹­Ù Ó Ò      Ð       Ö Ó× Ð ÒÓ Ó Ù ÒØ   ½ ≡                  ´ ¼µ
      for (Node_Arc_Iterator<Net, Res_F<Net> > it(source); it.has_current(); it.next())
        {
          typename Net::Arc * arc = it.get_current_arc();
          typename Net::Node * tgt = net.get_tgt_node(arc);
          arc->flow = tgt->in_flow = arc->cap - arc->flow; // inunde arco actual
          arc->img_arc->flow = 0;
          if (tgt != sink)
            put_in_active_queue(q, tgt);                    // tgt deviene activo
        }
      source->out_flow = source->out_cap;
    Í× × Node Arc Iterator      º
    Ç × ÖÚ Ò Ó Ð ÓÒ ÓÒ         ÓÒ× ÖÚ ÓÒ Ð ­Ù Ó¸ × Ø ÒØ ÓÖ Ô Ö ÐÓ× ÔÖÓ Ö Ñ ÓÖ ×
    ÒÓÚ Ð × ÑÔÙ Ö Ð Ô           Ñ Ò Ñ ÒØÖ Ð ØÓØ Ð × Ð       Ð Ù ÒØ Ý Ð ØÓØ Ð
     ÒØÖ     Ð ×ÙÑ ÖÓº        × ÑÓ Ó ÔÓ Ö Ò ×Ñ ÒÙ Ö× Ð × Ø Ö ÓÒ ×º È ÖÓ ×ØÓ ÒÓ
    Ò × Ö Ñ ÒØ ÙÒ ÓÒ ÔÓÖÕÙ ÔÓ Ö Ó ÙÖÖ Ö ÕÙ Ð ÙÒÓ× ÐÓ× ÒÓ Ó× Ý ÒØ × Ð
     Ù ÒØ ÒÓ Ú Ò × Ø ÚÓ ÐÓ ÕÙ ÔÓ× Ð Ø Ö ÕÙ Ð Ð ÓÖ ØÑÓ Ñ × ÐÓ Ú × º Ð ÔÖ Ñ Ö
     ÑÔÙ        × Ö ×Ù Ñ Ü Ñ Ô         º
         Ð ÑÔÙ     ÔÖ ¹­Ù Ó ÔÓÖ Ð Ö Ó × ÐÑ ÒØ ÓÑÔÖ Ò× Ð × × ÒØ Ò Ð Ñ Ò Ó
       Ð Ö Ö × Ù Ð¿¾
½     ÑÔÙ Ö ÔÖ ¹­Ù Ó ÔÓÖ Ö Ó ØÙ Ð ½ ≡                          ´ ¼µ
      const typename Net::Flow_Type flow_avail_in_arc = arc->cap - arc->flow;
      typename Net::Flow_Type flow_to_push = Aleph::min(flow_avail_in_arc, excess);
      arc->flow          += flow_to_push;
      arc->img_arc->flow -= flow_to_push;
      if (arc->is_residual)
        {
          net.decrease_out_flow(tgt, flow_to_push);
          net.decrease_in_flow(src, flow_to_push);
     ¿¾
          Î × Ø Ñ Ò Ð Ñ ØÓ Ó increase flow() Ò Ü º½¼º½¼ ´Ô Ò   ¾µº
782                                                          Cap´
                                                                ıtulo 7. Grafos



   }
  else
    {
      net.increase_out_flow(src, flow_to_push);
      net.increase_in_flow(tgt, flow_to_push);
    }
 excess -= flow_to_push;
 if (is_node_active<Net>(tgt) and tgt != sink and tgt != source)
   put_in_active_queue(q, tgt);


7.10.13.6    An´lisis del algoritmo de pre-flujo
               a

 Ð Ò Ð×× ×      ÒØÖ Ò Ð × ¬ Ö Ý ÓØ ÒØ          ÓÔ Ö ÓÒ × ÕÙ Ó ÙÖÖ Ò ÒØÖÓ Ð
while (not q.is empty()) ¹ ÒרÖÙ   ÓÒ Ò Ð ÓÖ ØÑÓ Ò Ö Ó¹º Ð Ö ×Ô ØÓ¸ Ð × ¬ÕÙ ¹
ÑÓ× Ð × ÓÔ Ö ÓÒ × Ò
  ½º ÑÔÙ × ØÙÖ ÒØ Ð          Ù ÓÒ Ð ÐÓÕÙ ÑÔÙ Ö ÔÖ ¹­Ù Ó ÔÓÖ Ö Ó ØÙ Ð ½
     ¹ ÒרÖÙ ÓÒ ´ µ Ò Ð Ð ÓÖ ØÑÓ Ò Ö Ó¹ ÕÙ ÐÓ Ö ÐÐ Ò Ö Ð Ö Ó ×Ù ÔÐ Ò ¹
     Ô        º
     ÍÒ ÑÔÙ × ØÙÖ ÒØ ÑÔÐ Ð Ò ÙÖ                ÙÒ ÒÓ Ó Ð ÓÒ ÙÒØÓ Ah Ý Ð ¹
     × Ô Ö ÓÒ Ð Ö Ó Ò Ð Ö Ö × Ù Ðº
  ¾º ÑÔÙ ÒÓ × ØÙÖ ÒØ ÙÒ           Ù ÓÒ Ð ÐÓÕÙ ÑÔÙ Ö ÔÖ ¹­Ù Ó ÔÓÖ Ö Ó ¹
     ØÙ Ð ½ ÕÙ ÒÓ ÐÓ Ö ÐÐ Ò Ö Ð Ö Ó ×Ù ÔÐ Ò Ô           º
  ¿º ÁÒ Ö Ñ ÒØÓ Ó Ö ¹ Ø ÕÙ Ø Ó      Ù ÓÒ Ð if (excess > 0) ¹ ÒרÖÙ ÓÒ     Ò Ð
       Ð ÓÖ ØÑÓ Ò Ö Ó¹º
   Ä ÒØ            Ò Ö Ñ ÒØÓ× × ÐÓ Ñ × Ð     ÓÒØ Ð Þ Ö¸ × ÙÒ ÐÓ ÑÙ ×ØÖ Ð Ð Ñ
× Ù ÒØ º
Lema 7.8 (Cantidad de incrementos)       Ë ÙÒ Ö N =< V, E, s, t, C > ÓÒ Ö Ö × ¹
Ù Ð N =< V, E , s, t, C >º ÒØÓÒ × Ð ÒØ        Ò Ö Ñ ÒØÓ× ÕÙ Ó ÙÖÖ Ò Ð Ð ÓÖ ØÑÓ
 º × ÐÓ ×ÙÑÓ 2V 2º
Demostraci´n ÄÓ× Ò Ö Ñ ÒØÓ× Ó ÙÖÖ Ò ×Ó Ö V − 2 ÒÓ Ó×
          o                                            Ð Ö ¸ ÔÙ × Ð Ù ÒØ Ý Ð
×ÙÑ ÖÓ ÒÙÒ ×ÓÒ Ø ÚÓ׺       ÒÓ Ó × Ò Ö Ñ ÒØ Ò ÙÒÓ ×Ø ÙÒ Ñ Ü ÑÓ 2V − 1¸
× ÙÒ Ð Ð Ñ º º ÈÓÖ Ø ÒØÓ¸ Ð ÒØ        Ò Ö Ñ ÒØÓ× × (V − 1) × (2V − 1) < 2V 2
     ÓÖ ÓÒØ Ð Þ ÑÓ× Ð ÒØ          ÑÔÙ × × ØÙÖ ÒØ ׺
Lema 7.9 (Cantidad de empujes saturantes) Ë        ÙÒ Ö N =< V, E, s, t, C > ÓÒ
Ö Ö × Ù Ð N =< V, E , s, t, C >º ÒØÓÒ × Ð ÒØ           ÑÔÙ × × ØÙÖ ÒØ × × Ñ ÒÓÖ
ÕÙ 2VEº
Demostraci´n
          o      ËÙÔÓÒ ÑÓ× Ó× ÒÓ Ó× Ù Ð ×ÕÙ Ö u Ý v ÐÓ× Ù Ð × × ÑÓ× ÓÒ¹
Ø Ð Þ Ö Ð ÒØ          ÑÔÙ × × ØÙÖ ÒØ ׺ È Ö ÕÙ Ó ÙÖÖ Ø Ò ÑÔÙ ¸  Ü ×Ø Ö Ò
Ð Ö Ö × Ù Ð Ó ÙÒ Ö Ó u → v Ó ÙÒÓ v → uº
   ËÙÔÓÒ ÑÓ× ÕÙ Ó ÙÖÖ ÙÒ ÑÔÙ × ØÙÖ ÒØ Ò Ð Ö Ó u → vº ×ØÓ ÑÔÐ ÕÙ
h(u) = h(v) + 1º × Ò Ð ÒÓØ Ö ÕÙ Ô Ö ÕÙ Ó ÙÖÖ ÓØÖÓ ÑÔÙ × ØÙÖ ÒØ Ò u → v
7.10. Redes de flujo                                                                     783



ÔÖ Ñ ÖÓ      Ó ÙÖÖ Ö ÙÒ ÑÔÙ Ò v → u¸ ÔÙ × Ô Ö ÕÙ u → v Ú Ò Ð Ð
 ÙÑÔÐ Ö× ÒÙ ÚÓ ÕÙ h(u) = h(v) + 1º h(v)      Ò Ö Ñ ÒØ Ö× Ò Ð Ñ ÒÓ× 2 ÙÒ        ׺
    Ë ÑÓ׸ ÔÓÖ Ð Ð Ñ º ¸ ÕÙ ∀x ∈ V =⇒ h(x) < 2V º ÈÓÖ Ø ÒØÓ¸ Ð ÒØ            Ú ×
ÕÙ ÙÒ ÒÓ Ó ÔÙ Ò Ö Ñ ÒØ Ö× × Ñ ÒÓÖ ÕÙ 2V º À ݸ Ô٠׸ ÐÓ ×ÙÑÓ 2V ÑÔÙ ×
× ØÙÖ ÒØ × Ò u → vº ÅÙÐØ ÔÐ Ò Ó ÔÓÖ Ð ÒØ          Ö Ó× Ø Ò ÑÓ× ÙÒ ØÓØ Ð Ñ Ü ÑÓ
2VE ÑÔÙ × × ØÙÖ ÒØ ׺

    ÆÓ× Ö ×Ø ÓÒØ Ð Þ Ö Ð ÒØ          ÑÔÙ × ÒÓ¹× ØÙÖ ÒØ ׸ Ð Ù Ð × ×Ø Ð ÔÓÖ Ð
× Ù ÒØ Ð Ñ º
Lema 7.10 Ë ÙÒ Ö N =< V, E, s, t, C > ÓÒ Ö Ö × Ù Ð N =< V, E , s, t, C                   >º
 ÒØÓÒ × Ð   ÒØ    ÑÔÙ × × ØÙÖ ÒØ × × Ñ ÒÓÖ ÕÙ 4V 2(V + E)º
Demostraci´n
          o    ¬Ò ÑÓ× Ð × Ù ÒØ ÙÒ ÓÒ ÔÓØ Ò Ð ×Ó Ö Ð ÓÒ ÙÒØÓ Ah
                                   Φ(Ah) =            h(u)                            ´ º¿ µ
                                               u∈Ah

    À Ý Ó× Ñ Ò Ö × Ò ÕÙ ÔÙ Ò Ö Ñ ÒØ Ö× Ð Ú ÐÓÖ Φ(Ah)
   ½º ÍÒ ÑÔÙ × ØÙÖ ÒØ Ò ×Ø ÓÔ Ö ÓÒ × Ò ÙÒ ÒÙ ÚÓ ÒÓ Ó Ah¸ Ô ÖÓ ÒÓ ×
       ÙÑ ÒØ Ò Ò ÙÒ Ú ÐÓÖ h(u) Ô Ö Ù ÐÕÙ Ö ÒÓ Ó uº ÈÓÖ Ð Ð Ñ º × ÑÓ× ÕÙ
      h(u) < 2V Ô Ö Ù ÐÕÙ Ö uº ÍÒ ÑÔÙ × ØÙÖ ÒØ ÙÑ ÒØ Φ(Ah) Ò ÐÓ ×ÙÑÓ 2V º
      ÈÙ ×ØÓ ÕÙ Ð ÒØ           ÑÔÙ × × ØÙÖ ÒØ × ×Ø ÓØ ÔÓÖ 2VE ´Ð Ñ º µ¸ Ð
       Ò Ö Ñ ÒØÓ ÐÓ× ÑÔÙ × × ØÙÖ ÒØ × ×Ó Ö Φ(Ah) ר ÓØ Ó ÔÓÖ 2V × 2VE =
      4V 2Eº

   ¾º ÍÒ Ò Ö Ñ ÒØÓ       Ò Ö Ñ ÒØÓ ÙÒ ÒÓ Ó u ÙÑ ÒØ Φ(Ah) Ò ÙÒÓº Ä Ò Ò
         ÙÒ ÒÓ Ó Ù ÐÕÙ Ö u ×Ó Ö Φ(Ah) ׸ ÔÓÖ Ð Ð Ñ º ¸ Ñ ÒÓÖ ÕÙ 2V º
      ÈÓÖ Ð Ð Ñ º × ÑÓ× ÕÙ Ð ÒØ           Ñ ÜÑ       Ò Ö Ñ ÒØÓ× × Ñ ÒÓÖ ÕÙ 2V 2º
      ÈÓÖ Ø ÒØÓ¸ Ð Ò Ò        ÐÓ× Ò Ö Ñ ÒØÓ× ×Ó Ö Φ(Ah) × Ñ ÒÓÖ ÕÙ 2V 2 × 2V =
      4V 2V º


     ÉÙ       Ö    ÐÓ× ÑÔÙ × ÒÓ¹× ØÙÖ ÒØ × ËÙÔÓÒ ÑÓ× ÕÙ Ó ÙÖÖ ÙÒ ÑÔÙ ÒÓ¹
× ØÙÖ ÒØ ×Ó Ö ÙÒ Ö Ó u → vº Ò ×Ø ÑÓÑ ÒØÓ u Ú Ò Ò Ø ÚÓ Ý v ÔÖÓ Ð Ñ ÒØ
  Ø ÚÓº × Ô٠׸ Φ(Ah) = Φ(Ah) − h(u) + h(v)¸ Ô ÖÓ¸ ÔÙ ×ØÓ ÕÙ h(u) = h(v) + 1¸
 ÒØÓÒ × Φ(Ah) = Φ(Ah) − h(v) − 1 + h(v) = Φ(Ah) − 1º Ç × ¸ Φ(Ah) Ö Ð Ñ ÒÓ×
 Ò ÙÒ ÙÒ º
    À Ò Ó ÓÒ ÐÙ Ó ÕÙ ÐÓ× ÑÔÙ × ÒÓ¹× ØÙÖ ÒØ × ÒÓ Ò Ö Ñ ÒØ Ò Ð Ú ÐÓÖ Φ(Ah)¸
  ÓØ Ö Ð ÙÒ ÓÒ ÔÓØ Ò × ×Ø Ö        Ó ÔÓÖ
               Φ(Ah) <     4V 2E       +       4V 2V          = 4V 2(V + E)
                         ÁÒ Ö Ñ ÒØÓ×       ÑÔÙ × × ØÙÖ ÒØ ×

      ÓÖ Ø Ò ÑÓ× ØÓ × Ð × ÖÖ Ñ ÒØ × Ò × Ö × Ô Ö ÓÒ ÐÙ Ö                       Ö   Ð × ÑÔ ÒÓ
   Ð ÓÖ ØÑÓ Ò Ö Óº
Proposici´n 7.15 Ë ÙÒ Ö N =< V, E, s, t, C > ÓÒ Ö Ö × Ù Ð N =< V, E , s, t, C >º
          o
Ë Ah : V −→ N ÙÒ ÙÒ ÓÒ ÐØÙÖ º ÒØÓÒ × Ð ÒØ              ÓÔ Ö ÓÒ × ÕÙ          ÙØ
 Ð Ð ÓÖ ØÑÓ Ò Ö Ó º × O(V 2E)º
784                                                                                                                                Cap´
                                                                                                                                      ıtulo 7. Grafos



Demostraci´n
          o         ÁÒÑ                Ø           ÐÓ× Ð Ñ × º ¸ º Ý º½¼
7.10.13.7    Empuje de pre-flujo FIFO

  Ð ÓÖ Ò Ò ÕÙ × ÑÔÙ Ð ÔÖ ¹­Ù Ó ØÖ Ú × ÐÓ× ÒÓ Ó× ÔÙ Ò Ö ÒÓØ Ð Ñ ÒØ Ò
 Ð Ö Ò Ñ ÒØÓ ÙÒ Ð ÓÖ ØÑÓ ÔÖ ¹­Ù Óº Ë ØÖ Ø ÑÓ× ÕÙ Ð ÔÖ ¹­Ù Ó Ð Ò ÐÓ Ñ ×
Ö Ô Ñ ÒØ ÔÓ× Ð Ð ×ÙÑ ÖÓ¸ ÒØÓÒ × ÙÒ Ò ÓÕÙ ÕÙ ÜØÖ              Ð ÓÐ ÐÓ× ÒÓ Ó× Ò
ÔÖÓ ÙÒ      ÔÖÓ Ð Ñ ÒØ Ø Ò ¸ ÙÖ ×Ø Ñ ÒØ        Ð Ò Ó¸ Ñ × ÔÓ× Ð    × ÖÖ Ö
Ñ × Ö Ô Ó Ð ×ÙÑ ÖÓº Ò ×Ø × ÒØ Ó¸ ÙÒ Ñ Ò Ö             ÑÙÐ Ö Ð ÔÖÓ × Ñ ÒØÓ Ò
ÔÖÓ ÙÒ        ÓÒ× ×Ø Ò Ò ÓÐ Ö Á Ç ÐÓ× ÒÓ Ó× Ø ÚÓ׺ ר Ò ÓÕÙ × Ö Ø Ñ ÒØ
 ÒרÖÙÑ ÒØ Ð Ô ÖØ Ö Ð Ð ÓÖ ØÑÓ Ò Ö Ó
   ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡                ¼
      template <class Net> typename Net::Flow_Type
  fifo_preflow_maximum_flow(Net & net, const bool & leave_residual = false)
  {
    return generic_preflow_vertex_push_maximum_flow
      <Net,DynListQueue<typename Net::Node*> >(net, leave_residual);
  }
Í× × DynListQueue ½ ¼ º
Ë ØÖ Ø   Ð Ð ÓÖ ØÑÓ Ò Ö Ó ÓÒ Ô Ö Ñ ØÖÓ Ø ÔÓ Q Type Òר Ò                                                                            Ó ÙÒ ÓÐ      Ø ÔÓ
DynListQueue<T> ×ØÙ    Ó Ò Ü ¾º º ´Ô Ò ½ ¼µº
                                           6   4/0                 3   8/0                 0   4/0                 0
                                       D                       E                       I                       K
                                   4       0               3       0               2       0               1       0


                                   6/6         3/3         4/0         5/0         3/0         4/0         3/0         4/0


                              0    7/7                 7   6/0                 0   4/0                 0   5/0                 0
                          A                        B                       F                       H                       M
                      4       21               3       0               2       0               1       0               0       0


                                   5/5         5/0         3/0         5/0         7/0         6/0         4/0         6/0


                                           5                       0                       0   5/0                 0
                                       C       4/0             G       6/0             J                       L
                                   3       0               4       0               2       0               1       0



   ÙÖ º        × Ò Ð ÙÒ Ð ÓÖ ØÑÓ ÔÖ ¹­Ù Ó ×Ó Ö Ð Ö             Ð ¬ ÙÖ º º Ò ×Ø
  ×Ó ØÓ Ó× ÐÓ× Ö Ó× × Ð ÒØ × Ð Ù ÒØ ×ÓÒ ÒÙÒ Ó× ´Ý ר Ò Ö × ÐØ Ó×µº Ä × ÐØÙÖ ×
        ÒÓ Ó ×Ø Ò Ù        × Ð ×ÙÖÓ ×Ø º
    ÍÒ      Ù ÓÒ ÓÑÔÐ Ø        ר Ð ÓÖ ØÑÓ ×Ó Ö Ð Ö Ó Ð ¬ ÙÖ º × ÑÙ ×ØÖ Ò
Ð ¬ ÙÖ º ´Ô ׺ ¹ µ¿¿ º ÆÓØ × ÕÙ Ð ×ÙÑ ÖÓ × Ð ÒÞ Ó Ò Ð Ó Ø Ú ¬ ÙÖ
 ÓÒ ÙÒ Ú ÐÓÖ ­Ù Ó 6º
    Ä ÙÖ ×Ø ÒØ ÒØ Ö ÓÖÖ Ö Ò ÔÖÓ ÙÒ                ØÖ Ú ×   Ö Ó× Ð Ð ×¸ Ô ÖÓ ÒÓ ×
ØÖ Ø ÙÒ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ             ØÖ ÓÒ Ðº       ר Ö× Ð × ÒØ Ó ÙÖ ×Ø Ó¸ ÔÙ ×
 ÒÐ Ð Ð             ÐÓ× Ö Ó× Ò Ò ÐÓ× Ú ÐÓÖ ×       Ô     × Ý Ð ÓÖ Ò Ò ÕÙ ×ØÓ× ×
ÔÖ × ÒØ Ò ÙÖ ÒØ Ð × Ø Ö ÓÒ ×º
     ר Ð ÓÖ ØÑÓ × O(V 3)º ÍÒ Ú            ÑÓ×ØÖ ÓÒ ÓÒ× ×Ø Ò ¬Ò Ö ÓÑÓ ÙÒ ÓÒ
                                         , Ah = ∅
ÔÓØ Ò Ð Φ(Ah) = 0                                 Ý Ü Ñ Ò Ö Ð Ú ÐÓÖ Φ(Ah) × ÙÒ
                     Ñ Ü{h(u) | u ∈ Ah} , Ah = ∅
 ¿¿
    ÙÒÕÙ × ÑÙ ×ØÖ Ò Ñ × ¬ ÙÖ ×¸ ÒÓ Ý Ñ × Ø Ö ÓÒ × ÕÙ ÓØÖÓ× Ò ÓÕÙ × × Ó× Ò Ñ ÒÓ×
 ÙÑ ÒØÓ¸ ÔÙ × Ð × ¬ ÙÖ × Ô Ö ÐÓ× Ð ÓÖ ØÑÓ× ÓÖ ¹ ÙÐ Ö×ÓÒ Ý ÑÓÒ ×¹Ã ÖÔ ÓÒØ Ò Ò ÐÓ× Ñ ÒÓ×
   ÙÑ ÒØÓ¸ ÔÓÖ ÐÓ× Ù Ð × Ý ÕÙ Ø Ö Öº
7.10. Redes de flujo                                                                                                                                                                                 785



    ××  Ñ Ø × Ò Ð ÓÐ º Ä ÔÖ Ñ Ö × Ð Ð Ñ Ø Ð ÓÒ ÙÒØÓ ÒÓ Ó× Ø ÚÓ×
              Ù×ØÓ ×ÔÙ ×
[u1, u2, . . . um]             ÙØ Ö ÈÖ ¹­Ù Ó Ò Ð Ö Ó× Ð ÒÓ Ó Ù ÒØ ½ º
ÄÙ Ó¸ Ð × × × × Ù ÒØ × ×Ø Ò Ð Ñ Ø × ÔÓÖ Ð ÓÒ ÙÒØÓ ÒÓ Ó× Ø ÚÓ× ÐÙ Ó ÕÙ
um × Ð    Ð ÓÐ º Ð Ò Ð × × × Ö Ð Þ ×Ù × Ú Ñ ÒØ º
                     6   4/0                 3   8/0                   0   4/0                 0                              6   4/0                 3   8/0                   0   4/0                 0
                 D                       E                         I                       K                              D                       E                         I                       K
             4       0               3       0                 2       0               1       0                      4       0               3       0                 2       0               1       0


             6           3           4/0         5/0           3/0         4/0         3/0         4/0               6            3           4/0         5/0           3/0         4/0         3/0         4/0


        0                        7   6/0                 0     4/0                 0   5/0                 0    0                         7   6/0                 3     4/0                 0   5/0                 0
    A            7           B                       F                         H                       M      A           7           B                       F                         H                       M
4       21               3       0               2       0                 1       0               0       04   21                3       0               2       0                 1       0               0       0


             5           5/0         3/0         5/0           7/0         6/0         4/0         6/0               5            5/0         3           5/0           7/0         6/0         4/0         6/0


                     5                       0                         0   5/0                 0                              5                       0                         0   5/0                 0
                 C       4/0             G       6/0               J                       L                              C       4/0             G       6/0               J                       L
             3       0               4       0                 2       0               1       0                      4       3               4       0                 2       0               1       0

                     6   4/0                 3   8/0                   0   4/0                 0                              6   4/0                 3   8/0                   0   4/0                 0
                 D                       E                         I                       K                              D                       E                         I                       K
             4       0               3       0                 2       0               1       0                      4       0               3       3                 2       0               1       0

                                                                                                                                                              5/3
             6           3           4/0         5/0           3/0         4/0         3/0         4/0               6            3           4/0                       3/0         4/0         3/0         4/0
                                                                                                                                                      3

        0                        7                       9     4/0                 0   5/0                 0    0                         7                       12    4/0                 0   5/0                 0
    A            7           B           6           F                         H                       M      A           7           B           6           F                         H                       M
4       21               4       6               2       0                 1       0               0       04   21                4       6               2       0                 1       0               0       0


             5           5/0         3           5/0           7/0         6/0         4/0         6/0               5            5/0         3           5/0           7/0         6/0         4/0         6/0


                     5                       0                         0   5/0                 0                              5                       0                         0   5/0                 0
                 C       4/0             G       6/0               J                       L                              C       4/0             G       6/0               J                       L
             4       3               4       0                 2       0               1       0                      4       3               4       0                 2       0               1       0
                     6                       7   8/0                   0   4/0                 0                              6                       7   8/0                   0   4/0                 0
                 D           4           E                         I                       K                              D           4           E                         I                       K
             5       4               3       3                 2       0               1       0                      5       4               3       3                 2       0               1       0

                                                     5/3                                                                                                      5/3
             6           3           4/0                       3/0         4/0         3/0         4/0               6            3           4/0                       3/0         4/0         3/0         4/0
                                             3                                                                                                        3

        0                        7                       12    4/0                 0   5/0                 0    0                         7                       12                        4   5/0                 0
    A            7           B           6           F                         H                       M      A           7           B           6           F             4           H                       M
4       21               4       6               2       0                 1       0               0       04   21                5       6               3       10                1       0               0       0


             5           5/0         3           5/0           7/0         6/0         4/0         6/0               5            5/0         3           5/0           7/0         6           4/0         6/0


                     5                       0                         0   5/0                 0                              5                       0                         0   5/0                 6
                 C       4/0             G       6/0               J                       L                              C       4/0             G       6/0               J                       L
             4       3               4       0                 2       0               1       0                      5       3               4       0                 2       0               1       0

                                                         8/4                                                                                                      8/4
                     6                       7                         4   4/0                 0                              4                       7                         4   4/0                 0
                 D           4           E                         I                       K                              D           4           E                         I                       K
             5       4               3       7                 2       0               1       0                      5       4               3       7                 2       0               1       0
                                                         4                                                                                                        4
                                                     5/3                                                        6/4                                           5/3
             6           3           4/0                       3/0         4/0         3/0         4/0                            3           4/0                       3/0         4/0         3/0         4/0
                                             3                                                                            4                           3

        0                        7                       12                        4   5/0                 0    0                         7                       12                        4   5/0                 0
    A            7           B           6           F             4           H                       M      A           7           B           6           F             4           H                       M
4       21               5       6               3       10                1       0               0       04   19                5       6               3       10                1       0               0       0


             5           5/0         3           5/0           7/0         6           4/0         6/0               5            5/0         3           5/0           7/0         6           4/0         6/0


                     5                       0                         0   5/0                 6                              5                       0                         0   5/0                 6
                 C       4/0             G       6/0               J                       L                              C       4/0             G       6/0               J                       L
             5       3               4       0                 2       0               1       0                      5       3               4       0                 2       0               1       0



       ÙÖ º      Ð ÓÖ ØÑÓ ÔÖ ¹­Ù Ó ÓÒ ÓÐ ×Ó Ö Ö      Ð ¬ ÙÖ º º Ð ÒÓ Ó ÜØÖ Ó
    ÙÒØÓ ÓÒ ×Ù× Ö Ó× Ð Ð × ×ÓÒ Ö × ÐØ Ó׺ Ð ­Ù Ó ÒØÖ ÒØ × ÓÐÓ Ð ÒÓÖ ×Ø Ð ÒÓ Ó¸
    Ð × Ð ÒØ Ð ×ÙÖ ×Ø Ý Ð Ú ÐÓÖ Ð ÐØÙÖ ×ÙÖÓ ×Ø º
786                                                                                                                                                                      Cap´
                                                                                                                                                                            ıtulo 7. Grafos


                                                            8/4                                                                                                                  8/4
                      4                         7                           4   4/0                       0                                4                         7                           4   4/0                       0
                  D             4           E                           I                             K                                D             4           E                           I                             K
              5       4                 3       7                   2       0                     1       0                        5       4                 3       7                   2       0                     1       0
                                                            4                                                                                                                    4
        6/4                                             5/3                                                                  6/4                                             5/3
                            3           4/0                         3/0         4/0           3/0               4/0                              3           4/0                         3/0         4/0           3/0               4/0
                  4                             3                                                                                      4                             3
                                                                                                                                                                                                                               5/4
        0                           7                       12                          4         5/0                   6    0                           7                       12                          4                               10
    A             7             B           6           F               4           H                               M      A           7             B           6           F               4           H                               M
4       19                  5       6               3       10                  1       0                       0       04   19                  5       6               3       10                  1       4                       0       0
                                                                                                                                                                                                                               4

             5              5/0         3           5/0             7/0         6             4/0               6                 5              5/0         3           5/0             7/0         6             4/0               6


                      5                         0                           0   5/0                       6                                5                         0                           0   5/0                       6
                  C         4/0             G       6/0                 J                             L                                C         4/0             G       6/0                 J                             L
              5       3                 4       0                   2       0                     1       6                        5       3                 4       0                   2       0                     1       6

                                                            8/4                                                                                                                  8/4
                      4                         7                           4   4/0                       0                                4                         7                           4   4/0                       0
                  D             4           E                           I                             K                                D             4           E                           I                             K
              5       4                 3       7                   2       0                     1       0                        5       4                 3       7                   2       0                     1       0
                                                            4                                                                                                                    4
        6/4                                             5/3                                                                  6/4                                             5/3
                            3           4/0                         3/0         4/0           3/0               4/0                              3           4/0                         3/0         4/0           3/0               4/0
                  4                             3                                                                                      4                             3
                                                                                                          5/4                                                                                                                  5/4
        0                           7                       12                          4                               10   0                           7                       12                          4                               10
    A             7             B           6           F               4           H                               M      A           7             B           6           F               4           H                               M
4       19                  5       6               3       12                  1       4                       0       04   17                  5       6               3       12                  1       4                       0       0
                                                                                                          4                                                                                                                    4
                                                                        7/2                                                            5/3                                                   7/2
             5              5/0         3           5/0                         6             4/0               6                                5/0         3           5/0                         6             4/0               6
                                                                2                                                            3                                                       2

                      5                         0                           2   5/0                       6                                3                         0                           2   5/0                       6
                  C         4/0             G       6/0                 J                             L                                C         4/0             G       6/0                 J                             L
              5       3                 4       0                   2       0                     1       6                        5       3                 4       0                   2       0                     1       6

                                                            8/4                                                                                                                  8/4
                      4                         7                           4   4/0                       0                                4                         7                           4                             4
                  D             4           E                           I                             K                                D             4           E                           I           4                 K
              5       4                 3       7                   2       0                     1       0                        5       4                 3       7                   2       4                     1       0
                                                            4                                                                                                                    4
        6/4                                             5/3                                                                  6/4                                             5/3
                            3           4/0                         3/0         4/0           3/0               4/0                              3           4/0                         3/0         4/0           3/0               4/0
                  4                             3                                                                                      4                             3
                      7/6                                                                                 5/4                              7/6                                                                                 5/4
        0                           6                       12                          4                               10   0                           6                       12                          4                               10
    A                           B           6           F               4           H                               M      A                         B           6           F               4           H                               M
4       16                  5       6               3       12                  1       4                       0       04   16                  5       6               3       12                  1       4                       0       0
                      6                                                                                   4                                6                                                                                   4
                  5/3                                                   7/2                                                            5/3                                                   7/2
                            5/0         3           5/0                         6             4/0               6                                5/0         3           5/0                         6             4/0               6
        3                                                       2                                                            3                                                       2

                      3                         0                           2   5/0                       6                                3                         0                           2   5/0                       6
                  C         4/0             G       6/0                 J                             L                                C         4/0             G       6/0                 J                             L
              5       3                 4       0                   2       0                     1       6                        5       3                 4       0                   2       0                     1       6

                                                            8/4                                                                                                                  8/4
                      4                         7                           4                             4                                4                         7                           4                             4
                  D             4           E                           I           4                 K                                D             4           E                           I           4                 K
              5       4                 3       7                   2       4                     1       0                        5       4                 3       7                   2       4                     1       4
                                                            4                                                                                                                    4
        6/4                                             5/3                                                                  6/4                                             5/3
                            3           4/0                         3/0         4/0           3/0               4/0                              3           4/0                         3/0         4/0           3/0               4
                  4                             3                                                                                      4                             3
                      7/6                                                                                 5/4                              7/6                                                                                 5/4
        0                           6                       12                          4                               10   0                           6                       12                          4                               14
    A                           B           6           F               4           H                               M      A                         B           6           F               4           H                               M
4       16                  5       6               3       12                  1       4                       0       04   16                  5       6               3       12                  1       4                       0       0
                      6                                                                                   4                                6                                                                                   4
                  5/3                                                   7/2                                                            5/3                                                   7/2
                            5/0         3           5/0                         6             4/0               6                                5/0         3           5/0                         6             4/0               6
        3                                                       2                                                            3                                                       2
                                                                                        5/2                                                                                                                  5/2
                      3                         0                           2                             8                                3                         0                           2                             8
                  C         4/0             G       6/0                 J                             L                                C         4/0             G       6/0                 J                             L
              5       3                 4       0                   2       2                     1       6                        5       3                 4       0                   2       2                     2       6
                                                                                        2                                                                                                                    2


                                                            8/4                                                                                                                  8/4
                      4                         7                           4                             4                                4                         7                           4                             4
                  D             4           E                           I           4                 K                                D             4           E                           I           4                 K
              5       4                 3       7                   2       4                     1       4                        5       4                 3       7                   2       4                     1       4
                                                            4                                                                                                                    4
        6/4                                             5/3                                                                  6/4                                             5/3
                            3           4/0                         3/0         4/0           3/0               4                                3           4/0                         3/0         4/0           3/0               4
                  4                             3                                                                                      4                             3
                      7/6                                                                                 5/4                              7/6
        0                           6                       12                          6                               14   0                           6                       12                          6                               15
    A                           B           6           F               4           H                               M      A                         B           6           F               4           H                 5             M
4       16                  5       6               3       12                  1       4                       0       04   16                  5       6               3       12                  3       5                       0       0
                      6                                                                                   4                                6
                  5/3                                                   7/2                           2                                5/3                                                   7/2                           2
                            5/0         3           5/0                         6                               6                                5/0         3           5/0                         6                               6
        3                                                       2                           4/2                              3                                                       2                           4/2
                                                                                        5/2                                                                                                                  5/2
                      3                         0                           2                             8                                3                         0                           2                             8
                  C         4/0             G       6/0                 J                             L                                C         4/0             G       6/0                 J                             L
              5       3                 4       0                   2       2                     2       8                        5       3                 4       0                   2       2                     2       8
                                                                                        2                                                                                                                    2
7.10. Redes de flujo                                                                                                                                                                                                                    787


                                                            8/4                                                                                                                        8/3
                      4                         7                           5                                   4                              4                           7                           4                                   4
                  D             4           E                           I                 4                 K                              D             4             E                           I                 4                 K
              5       4                 3       7                   4       4                           1       4                      5       4                   4       6                   4       4                           1       4
                                                            4                                                                                                                          3
        6/4                                             5/3                               1                                      6/4                                               5/3                               1
                            3           4/0                         3/0                             3/0             4                                3             4/0                         3/0                             3/0             4
                  4                             3                               4/1                                                        4                               3                               4/1
                      7/6                                                                                                                      7/6
        0                           6                       12                                6                             15   0                           6                         12                                6                             15
    A                           B           6           F               4                 H                 5           M      A                         B             6           F               4                 H                 5           M
4       16                  5       6               3       12                        3       6                     0       04   16                  5       6                 3       12                        3       6                     0       0
                      6                                                                                                                        6
                  5/3                                                   7/2                                 2                              5/3                                                     7/2                                 2
                            5/0         3           5/0                           6                                 6                                5/0           3           5/0                           6                                 6
        3                                                       2                                 4/2                            3                                                         2                                 4/2
                                                                                              5/2                                                                                                                        5/2
                      3                         0                           2                                   8                              3                           0                           2                                   8
                  C         4/0             G       6/0                 J                                   L                              C         4/0               G       6/0                 J                                   L
              5       3                 4       0                   2       2                           2       8                      5       3                   4       0                   2       2                           2       8
                                                                                              2                                                                                                                          2


                                                            8/3                                                                                                                        8/3
                      4                         7                           4                                   4                              4                           7                           4                                   4
                  D             4           E                           I                 4                 K                              D             4             E                           I                 4                 K
              5       4                 4       7                   4       4                           1       4                      5       4                   4       7                   4       4                           1       4
                                                            3                                                                                                                          3
        6/4                                             5/4                               1                                      6/4                                               5/4                               1
                            3           4/0                         3/0                             3/0             4                                3             4/0                         3/0                             3/0             4
                  4                             4                               4/1                                                        4                               4                               4/1
                      7/6                                                                                                                      7/6
        0                           6                       13                                6                             15   0                           6                         13                                6                             15
    A                           B           6           F               4                 H                 5           M      A                         B             6           F               4                 H                 5           M
4       16                  5       6               3       12                        3       6                     0       04   16                  5       6                 3       13                        3       6                     0       0
                      6                                                                                                                        6
                  5/3                                                   7/2                                 2                              5/3                                                     7/3                                 2
                            5/0         3           5/0                           6                                 6                                5/0           3           5/0                           6                                 6
        3                                                       2                                 4/2                            3                                                         3                                 4/2
                                                                                              5/2                                                                                                                        5/2
                      3                         0                           2                                   8                              3                           0                           3                                   8
                  C         4/0             G       6/0                 J                                   L                              C         4/0               G       6/0                 J                                   L
              5       3                 4       0                   2       2                           2       8                      5       3                   4       0                   3       2                           2       8
                                                                                              2                                                                                                                          2


                                                            8/3                                                                                                                        8/3
                      4                         7                           4                                   4                              4                           7                           4                                   4
                  D             4           E                           I                 4                 K                              D             4             E                           I                 4                 K
              5       4                 4       7                   4       4                           1       4                      5       4                   4       7                   4       4                           1       4
                                                            3                                                                                                                          3
        6/4                                             5/4                               1                                      6/4                                               5/4                               1
                            3           4/0                         3/0                             3/0             4                                3             4/0                         3/0                             3/0             4
                  4                             4                               4/1                                                        4                               4                               4/1
                      7/6                                                                                                                      7/6
        0                           6                       13                                6                             15   0                           6                         13                                7                             15
    A                           B           6           F               4                 H                 5           M      A                         B             6           F               4                 H                 5           M
4       16                  5       6               3       13                        3       6                     0       04   16                  5       6                 3       13                        4       6                     0       0
                      6                                                                                                                        6
                  5/3                                                   7/3                                 2                              5/3                                                     7/3                                 3
                            5/0         3           5/0                           6                                 6                                5/0           3           5/0                           6                                 6
        3                                                       3                                 4/2                            3                                                         3                                 4/3
                                                                                              5/3                                                                                                                        5/3
                      3                         0                           3                                   9                              3                           0                           3                                   9
                  C         4/0             G       6/0                 J                                   L                              C         4/0               G       6/0                 J                                   L
              5       3                 4       0                   3       3                           4       8                      5       3                   4       0                   3       3                           4       9
                                                                                              3                                                                                                                          3

                                                            8/3                                                                                                                        8/3
                      4                         7                           4                                   4                              4                           7                           4                                   4
                  D             4           E                           I                 4                 K                              D             4             E                           I                 4                 K
              5       4                 4       7                   4       4                           1       4                      5       4                   4       7                   4       4                           1       4
                                                            3                                                                                                                          3
        6/4                                             5/4                               1                                      6/4                                               5/4                               1
                            3           4/0                         3/0                             3/0             4                                3             4/0                         3/0                             3/0             4
                  4                             4                               4/1                                                        4                               4                               4/1
                      7/6                                                   4/3                                                                7/6                                                     4/3
        0                           6                       13                                6                             15   0                           6                         13                                6                             15
    A                           B           6           F                                 H                 5           M      A                         B             6           F                                 H                 5           M
4       16                  5       6               4       12                        4       6                     0       04   16                  5       6                 4       13                        4       6                     0       0
                      6                                                     3                                                                  6                                                       3
                  5/3                                                   7/3                                 3                              5/3                                                     7/4                                 3
                            5/0         3           5/0                           6                                 6                                5/0           3           5/0                           6                                 6
        3                                                       3                                 4/3                            3                                                         4                                 4/3
                                                                                              5/3                                                                                                                        5/3
                      3                         0                           3                                   9                              3                           0                           4                                   9
                  C         4/0             G       6/0                 J                                   L                              C         4/0               G       6/0                 J                                   L
              5       3                 4       0                   3       3                           4       9                      5       3                   4       0                   5       3                           4       9
                                                                                              3                                                                                                                          3


                                                            8/3                                                                                                                        8/3
                      4                         7                           4                                   4                              4                           7                           4                                   4
                  D             4           E                           I                 4                 K                              D             4             E                           I                 4                 K
              5       4                 4       7                   4       4                           1       4                      5       4                   4       7                   4       4                           1       4
                                                            3                                                                                                                          3
        6/4                                             5/4                               1                                      6/4                                               5/4                               1
                            3           4/0                         3/0                             3/0             4                                3             4/0                         3/0                             3/0             4
                  4                             4                               4/1                                                        4                               4                               4/1
                      7/6                                                   4/3                                                                7/6                                                     4/3
        0                           6                       13                                6                             15   0                           6                         13                                6                             15
    A                           B           6           F                                 H                 5           M      A                         B             6           F                                 H                 5           M
4       16                  5       6               4       13                        4       6                     0       04   16                  5       6                 4       13                        4       6                     0       0
                      6                                                     3                                                                  6                                                       3
                  5/3                                                   7/4                                 3                              5/3                                                     7/4                                 3
                            5/0         3           5/0                           6                                 6                                5/0           3           5/0                           6                                 6
        3                                                       4                                 4/3                            3                                                         4                                 4/3
                                                            1                                 5/3                                                            1                         1                                 5/3
                      3                         1                           4                                   9                              4                           1                           4                                   9
                  C         4/0             G                           J                                   L                              C                           G                           J                                   L
              5       3                 6       0                   5       4                           4       9                      5       3                   6       1                   5       4                           4       9
                                                            6/1                               3                                                              4/1                       6/1                               3
788                                                                                                                           Cap´
                                                                                                                                 ıtulo 7. Grafos


                                       4   4/4                 7   8/3                  4    4/4                 4
                                   D                       E                        I                        K
                               5       4               4       7                4       4                1       4


                               6/4         3/3         4/0         5/4          3/0          4/1         3/0         4/4


                          0    7/6                 6   6/6                 13   4/3                  6   5/5                 15
                      A                        B                       F                         H                       M
                  4       15               5       6               4       13                4       6               0       0


                               5/2         5/0         3/3         5/0          7/4          6/6         4/3         6/6


                                       3                       1                        4    5/3                 9
                                   C       4/1             G       6/1              J                        L
                               5       3               6       1                5       4                4       9



   ÙÖ º      ר Ó ¬Ò Ð                      Ù ÓÒ Ð ÓÖ ØÑÓ                                   ÔÖ ¹­Ù Ó ×Ó Ö Ð ¬ ÙÖ º Ô Ö ÓÐ
 Á Ǻ
7.10.13.8   Empuje de pre-flujo con mayor distancia

Ä × ÙÒ          ÙÖ ×Ø Ñ × ÔÓÔÙÐ Ö¸ Ð Ù Ð ÑÔ Ö Ñ ÒØ Ö ×ÙÐØ Ñ ÓÖ ÕÙ Ð ÓÐ Á Ǹ
 ÓÒ× ×Ø Ò Ñ Ö Ö ÐÓ× ÒÓ Ó× Ø ÚÓ× Ò ÑÔÐ ØÙ º Ä           ÒØÙ Ø Ú × ÑÔÙ Ö ØÓ Ó Ð
ÔÖ ¹­Ù Ó ÔÓ× Ð ÒØ ×          Ú ÒÞ Ö ÙÒ Ò Ú Ð × Ö × ÐÓ× ÒÓ Ó× Ñ × ×Ø ÒØ × Ð
×ÙÑ ÖÓ ×Ø ÐÓ× Ñ × Ö ÒÓ׺ Ä ×ØÖÙ ØÙÖ               ØÓ× ÕÙ ÒÓ× Ó Ö ×Ø × ÔÐ Ò
 × ÙÒ ÓÐ         ÔÖ ÓÖ      ÙÝ ÜØÖ ÓÒ Ö ØÓÖÒ Ð ÒÓ Ó Ø ÚÓ ÓÒ Ñ ÝÓÖ ÐØÙÖ Ó × ¸
× Ð      ÔÖ ÓÖ        Ð ÒÓ Ó Ø ÚÓ Ñ × Ö ÒÓ Ù ÒØ ¹Ó Ñ × Ð ÒÓ Ð ×ÙÑ ÖÓ × ÙÒ
 ÓÒÚ Ò Ú Ö¹º
    Ä ÓÐ         ÔÖ ÓÖ      ר Ò ×ÔÓÒ Ð × Ó Ù ÐÕÙ Ö       ÐÓ× Ø ÔÓ× ×Ó Ó× ÐÓ×
    Ô׺ Ò ÒÙ ×ØÖÓ ×Ó¸ ÑÔÐ Ö ÑÓ× Ð Ø ÔÓ DynBinHeap<Key>¸ Ð Ù Ð × Ð Ú Ö× ÓÒ
  ÒÑ         Ð Ø ÔÓ BinHeap<Key> ×ØÙ Ó Ò Ü º º ´Ô Ò ¿½¾µº
     Ð Ö Ø Ö Ó ÓÑÔ Ö ÓÒ ÒØÖ ÐÓ× Ð Ñ ÒØÓ× Ð Ô × ¬Ò Ð × Ù ÒØ Ñ Ò Ö
  ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡
 template <class Net> struct Compare_Height
 {
   bool operator () (typename Net::Node * n1, typename Net::Node * n2) const
   {
     return node_height<Net>(n1) > node_height<Net>(n2);
   }
 };
Ä ÓÑÔ Ö ÓÒ ×Ø ÒÚ ÖØ             ØÓ×   Ö ÒØ Þ Ö ÕÙ × ÑÔÖ × ÜØÖ                                                                          Ð ÒÓ Ó ÓÒ
Ñ ÝÓÖ ÔÖ ÓÖ º
    ר Ð Ó Ð Ö Ø Ö Ó ÓÑÔ Ö ÓÒ¸ Ð Ö Ð Þ ÓÒ Ð ÑÔÙ ÓÒ Ð                                                                                  ÙÖ ×Ø   ÔÓÖ
 ÑÔÐ ØÙ × Ö Ø
  ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡                  ¾
     template <class Net> typename Net::Flow_Type
 heap_preflow_maximum_flow(Net & net, const bool & leave_residual = false)
 {
   return generic_preflow_vertex_push_maximum_flow
     <Net, DynBinHeap<typename Net::Node*, Compare_Height<Net> > >
     (net, leave_residual);
 }
    Ä   Ù ÓÒ ÓÑÔÐ Ø   ר Ð ÓÖ ØÑÓ ×Ó Ö Ð Ö Ó Ð ¬ ÙÖ º × ÑÓ×ØÖ       Ò
Ð ¬ ÙÖ º ´Ô ׺ ¹ ¾µº Ð ÒÓ Ó ×ÙÑ ÖÓ × Ð ÒÞ Ò Ð ÓÒ Ú Ø Ö ÓÒ¸ ÓÒ ÙÒ
Ú ÐÓÖ ­Ù Ó 4 ØÖ × Ø Ö ÓÒ × Ñ ÒÓ× ÕÙ ÓÒ Ð ÓÐ Á Ç Ý ÙÒ Ú ÐÓÖ ­Ù Ó Ñ ÒÓ׺
7.10. Redes de flujo                                                                                                                                                                                    789



 Ò Ø ÖÑ ÒÓ× Ð ÙÖ ×Ø ÔÓ ÑÓ× Ö ÕÙ ÔÙ ×ØÓ ÕÙ × ØÖ Ø            Ö Ò ÑÔÐ ØÙ ¸
× ÑÓÖ Ñ × Ò Ð ÒÞ Ö Ð ×ÙÑ ÖÓº Ä Ñ ×Ñ Ó × ÖÚ ÓÒ ÔÐ Ô Ö Ð Ú ÐÓÖ
­Ù Ó Ò Ö ÓÖ Ð ­Ù Ó ×Ø ÓÒ ÒØÖ Ó     Ð Ù ÒØ ¸ Ñ ÒØÖ × ÕÙ ÓÒ Ð ÓÐ Á Ç ×Ø
  ×Ô Ö× Ó ØÖ Ú × ÐÓ× Ñ ÒÓ× ÕÙ Ð ×Ù ÖØ Ò ÔÖÓ ÙÒ         Ý Ø ÖÑ Ò Óº
     × ÑÓ×ØÖ Ð ÕÙ ×Ø Ð ÓÖ ØÑÓ ×     ÙØ Ò O(V 3) Ô ×Ó׺ È Ö ÐÐÓ¸ × ¬Ò Ð
Ñ ×Ñ ÙÒ ÓÒ ÔÓØ Ò Ð ÕÙ Ô Ö Ð ÓÐ Á Ǹ Ô ÖÓ × Ñ Ö Ð × Ù Ò ÓÒ ÕÙ ÐÓ×
ÒÓ Ó× Ø ÚÓ× ×ÓÒ Ü Ñ Ò Ó׺
                      6     4/0                 3   8/0                 0   4/0                 0                              6                         7   8/0                   0   4/0                 0
                  D                         E                       I                       K                              D             4           E                         I                       K
              4       0                 3       0               2       0               1       0                      5       4                 3       0                 2       0               1       0


             6              3           4/0         5/0         3/0         4/0         3/0         4/0               6              3           4/0         5/0           3/0         4/0         3/0         4/0


        0                           7   6/0                 0   4/0                 0   5/0                 0    0                           7   6/0                 0     4/0                 0   5/0                 0
    A             7             B                       F                       H                       M      A           7             B                       F                         H                       M
4       21                  3       0               2       0               1       0               0       04   21                  3       0               2       0                 1       0               0       0


             5              5/0         3/0         5/0         7/0         6/0         4/0         6/0               5              5/0         3/0         5/0           7/0         6/0         4/0         6/0


                      5                         0                       0   5/0                 0                              5                         0                         0   5/0                 0
                  C         4/0             G       6/0             J                       L                              C         4/0             G       6/0               J                       L
              3       0                 4       0               2       0               1       0                      3       0                 4       0                 2       0               1       0

                      4                         7   8/0                 0   4/0                 0                              4                         7   8/0                   0   4/0                 0
                  D             4           E                       I                       K                              D             4           E                         I                       K
              5       4                 3       0               2       0               1       0                      5       4                 3       0                 2       0               1       0

        6/4                                                                                                      6/4
                            3           4/0         5/0         3/0         4/0         3/0         4/0                              3           4/0         5/0           3/0         4/0         3/0         4/0
                  4                                                                                                        4

        0                           7   6/0                 0   4/0                 0   5/0                 0    0                           7   6/0                 3     4/0                 0   5/0                 0
    A             7             B                       F                       H                       M      A           7             B                       F                         H                       M
4       19                  3       0               2       0               1       0               0       04   19                  3       0               2       0                 1       0               0       0


             5              5/0         3/0         5/0         7/0         6/0         4/0         6/0               5              5/0         3           5/0           7/0         6/0         4/0         6/0


                      5                         0                       0   5/0                 0                              5                         0                         0   5/0                 0
                  C         4/0             G       6/0             J                       L                              C         4/0             G       6/0               J                       L
              3       0                 4       0               2       0               1       0                      5       3                 4       0                 2       0               1       0
                      4                         7   8/0                 0   4/0                 0                              4                         7   8/0                   0   4/0                 0
                  D             4           E                       I                       K                              D             4           E                         I                       K
              5       4                 3       0               2       0               1       0                      5       4                 3       0                 2       0               1       0

        6/4                                                                                                      6/4
                            3           4/0         5/0         3/0         4/0         3/0         4/0                              3           4/0         5/0           3/0         4/0         3/0         4/0
                  4                                                                                                        4

        0                           7   6/0                 3   4/0                 0   5/0                 0    0                           7                       9     4/0                 0   5/0                 0
    A             7             B                       F                       H                       M      A           7             B           6           F                         H                       M
4       17                  3       0               2       0               1       0               0       04   17                  5       6               2       0                 1       0               0       0

                  5/3                                                                                                      5/3
                            5/0         3           5/0         7/0         6/0         4/0         6/0                              5/0         3           5/0           7/0         6/0         4/0         6/0
        3                                                                                                        3

                      3                         0                       0   5/0                 0                              3                         0                         0   5/0                 0
                  C         4/0             G       6/0             J                       L                              C         4/0             G       6/0               J                       L
              5       3                 4       0               2       0               1       0                      5       3                 4       0                 2       0               1       0
                                                                                                                                                                     8/2
                      4                         7   8/0                 0   4/0                 0                              4                         7                         2   4/0                 0
                  D             4           E                       I                       K                              D             4           E                         I                       K
              5       4                 3       0               2       0               1       0                      5       4                 3       7                 2       0               1       0
                                                                                                                                                                     2
        6/4                                                                                                      6/4
                            3           4/0         5/0         3/0         4/0         3/0         4/0                              3           4/0         5             3/0         4/0         3/0         4/0
                  4                                                                                                        4
                      7/6                                                                                                      7/6
        0                           6                       9   4/0                 0   5/0                 0    0                           6                       14    4/0                 0   5/0                 0
    A                           B           6           F                       H                       M      A                         B           6           F                         H                       M
4       16                  5       6               2       0               1       0               0       04   16                  5       6               2       0                 1       0               0       0
                      6                                                                                                        6
                  5/3                                                                                                      5/3
                            5/0         3           5/0         7/0         6/0         4/0         6/0                              5/0         3           5/0           7/0         6/0         4/0         6/0
        3                                                                                                        3

                      3                         0                       0   5/0                 0                              3                         0                         0   5/0                 0
                  C         4/0             G       6/0             J                       L                              C         4/0             G       6/0               J                       L
              5       3                 4       0               2       0               1       0                      5       3                 4       0                 2       0               1       0



                            ÙÖ º                        Ð ÓÖ ØÑÓ                  ÔÖ ¹­Ù Ó ÓÒ                         Ô ×Ó Ö Ð Ö                                 Ð ¬ ÙÖ º º
790                                                                                                                                                                     Cap´
                                                                                                                                                                           ıtulo 7. Grafos


                                                            8/2                                                                                                                 8/2
                      4                         7                           2     4/0                   0                                 4                         7                           2     4/0                   0
                  D             4           E                           I                           K                                 D             4           E                           I                           K
              5       4                 3       7                   2       0                   1       0                         5       4                 3       7                   2       0                   1       0
                                                            2                                                                                                                   2
        6/4                                                                                                                 6/4
                            3           4/0         5               3/0         4/0             3/0          4/0                                3           4/0         5               3/0         4/0             3/0          4/0
                  4                                                                                                                   4
                      7/6                                                                                                                 7/6
        0                           6                       14                            4     5/0                  0    0                             6                       14                            4     5/0                  0
    A                           B           6           F               4             H                          M      A                           B           6           F               4             H                          M
4       16                  5       6               3       10                    1       0                  0       04   16                    5       6               3       14                    1       0                  0       0
                      6                                                                                                                   6
                  5/3                                                                                                                 5/3                                                   7/4
                            5/0         3           5/0             7/0         6               4/0          6/0                                5/0         3           5/0                         6               4/0          6/0
        3                                                                                                                   3                                                       4

                      3                         0                           0     5/0                   6                                 3                         0                           4     5/0                   6
                  C         4/0             G       6/0                 J                           L                                 C         4/0             G       6/0                 J                           L
              5       3                 4       0                   2       0                   1       0                         5       3                 4       0                   2       0                   1       0
                                                                                                                                                                                8/2                           4/2
                                                                                                                                          4                         7                           2                           2
                                                            8/2                           4/2                                         D             4           E                           I                           K
                                                                                                                                  5       4                 3       7                   2       2                   1       0
                      4                         7                           2                           2                                                                       2                             2
                  D             4           E                           I                           K
              5       4                 3       7                   2       2                   1       0
                                                            2                             2                                 6/4
                                                                                                                                                3           4/0         5               3/0         4/0             3/0          4/0
        6/4                                                                                                                           4
                            3           4/0         5               3/0         4/0             3/0          4/0
                  4                                                                                                                       7/6
                                                                                                                            0                           6                       14                            4     5/0                  0
                      7/6                                                                                               A                           B           6           F               4             H                          M
                                                                                                                  4         16                  5       6               3       14                    1       0                  0       0
    0                           6                       14                            4         5/0              0                        6
  A                           B             6         F                 4           H                          M
4   16                      5   6                   3   14                        1   0                      0   0
                      6                                                                                                               5/3                                                   7/4
                                                                                                                                                5/0         3           5/0                         6               4/0          6/0
                  5/3                                                   7/4                                                 3                                                       4
                            5/0         3           5/0                         6               4/0          6/0
        3                                                       4                                                                                                                                             5/4
                                                                                                                                          3                         0                           4                           10
                                                                                                                                      C         4/0             G       6/0                 J                           L
                                                                                                                                  5       3                 4       0                   2       4                   1       0
                  3                         0                           4         5/0               6                                                                                                         4
                C           4/0           G         6/0               J                           L
              5   3                     4   0                       2   0                       1   0

                                                            8/2                           4/2                                                                                   8/2                           4/2
                      4                         7                           2                           2                                 4                         7                           2                           2
                  D             4           E                           I                           K                                 D             4           E                           I                           K
              5       4                 3       7                   2       2                   1       0                         5       4                 3       7                   2       2                   1       0
                                                            2                             2                                                                                     2                             2
        6/4                                                                                                                 6/4
                            3           4/0         5               3/0         4/0             3/0          4/0                                3           4/0         5               3/0         4/0             3/0          4/0
                  4                                                                                                                   4
                      7/6                                                                                                                 7/6
        0                           6                       14                            4     5/0                  6    0                             6                       14                            8     5/0                  6
    A                           B           6           F               4             H                          M      A                           B           6           F               4             H                          M
4       16                  5       6               3       14                    1       0                  0       04   16                    5       6               3       14                    1       0                  0       0
                      6                                                                                                                   6
                  5/3                                                   7/4                                                           5/3                                                   7/4
                            5/0         3           5/0                         6               4/0          6                                  5/0         3           5/0                         6               4            6
        3                                                       4                                                           3                                                       4
                                                                                          5/4                                                                                                                 5/4
                      3                         0                           4                           10                                3                         0                           4                           10
                  C         4/0             G       6/0                 J                           L                                 C         4/0             G       6/0                 J                           L
              5       3                 4       0                   2       4                   2       6                         5       3                 4       0                   2       4                   2       10
                                                                                          4                                                                                                                   4


                                                            8/2                           4/2                                                                                   8/2                           4/2
                      4                         7                           2                           2                                 4                         7                           5                           2
                  D             4           E                           I                           K                                 D             4           E                           I                           K
              5       4                 3       7                   2       2                   1       0                         5       4                 3       7                   2       2                   1       0
                                                            2                             2                                                                                     2                             2
        6/4                                                                                                                 6/4                                                                           3
                            3           4/0         5               3/0         4/0             3/0          4/0                                3           4/0         5               3/0                         3/0          4/0
                  4                                                                                                                   4                                                         4/3
                      7/6                                                                                                                 7/6
        0                           6                       14                            8                          11   0                             6                       14                            8                          11
    A                           B           6           F               4             H             5            M      A                           B           6           F               4             H             5            M
4       16                  5       6               3       14                    3       5                  0       04   16                    5       6               3       14                    3       8                  0       0
                      6                                                                                                                   6
                  5/3                                                   7/4                                                           5/3                                                   7/4
                            5/0         3           5/0                         6               4            6                                  5/0         3           5/0                         6               4            6
        3                                                       4                                                           3                                                       4
                                                                                          5/4                                                                                                                 5/4
                      3                         0                           4                           10                                3                         0                           4                           10
                  C         4/0             G       6/0                 J                           L                                 C         4/0             G       6/0                 J                           L
              5       3                 4       0                   2       4                   2       10                        5       3                 4       0                   2       4                   2       10
                                                                                          4                                                                                                                   4


                                                            8/2                                                                                                                 8/1
                      4                         7                           5                           4                                 4                         7                           4                           4
                  D             4           E                           I             4             K                                 D             4           E                           I             4             K
              5       4                 3       7                   4       4                   1       0                         5       4                 5       6                   4       4                   1       0
                                                            2                                                                                                                   1
        6/4                                                                           3                                     6/4                                                                           3
                            3           4/0         5               3/0                         3/0          4/0                                3           4/0         5               3/0                         3/0          4/0
                  4                                                         4/3                                                       4                                                         4/3
                      7/6                                                                                                                 7/6
        0                           6                       14                            8                          11   0                             6                       14                            8                          11
    A                           B           6           F               4             H             5            M      A                           B           6           F               4             H             5            M
4       16                  5       6               3       14                    3       8                  0       04   16                    5       6               3       14                    3       8                  0       0
                      6                                                                                                                   6
                  5/3                                                   7/4                                                           5/3                                                   7/4
                            5/0         3           5/0                         6               4            6                                  5/0         3           5/0                         6               4            6
        3                                                       4                                                           3                                                       4
                                                                                          5/4                                                                                                                 5/4
                      3                         0                           4                           10                                3                         0                           4                           10
                  C         4/0             G       6/0                 J                           L                                 C         4/0             G       6/0                 J                           L
              5       3                 4       0                   2       4                   2       10                        5       3                 4       0                   2       4                   2       10
                                                                                          4                                                                                                                   4
7.10. Redes de flujo                                                                                                                                                                                                                       791


                                                              8/2                                                                                                                         8/2
                      4                           7                           5                                   4                               4                           7                           4                                   4
                  D             4             E                           I                 4                 K                               D             4             E                           I                 4                 K
              5       4                   5       7                   4       4                           1       0                       5       4                   5       7                   4       4                           1       0
                                                              2                                                                                                                           2
        6/4                                                                                 3                                       6/4                                                                                 2
                            3             4/0         5               3/0                             3/0              4/0                              3             4/0         5               3/0                             3/0              4/0
                  4                                                               4/3                                                         4                                                               4/2
                      7/6                                                                                                                         7/6
        0                           6                         14                                8                              11   0                           6                         14                                8                              11
    A                           B             6           F               4                 H                 5            M      A                         B             6           F               4                 H                 5            M
4       16                  5       6                 3       14                        3       8                      0       04   16                  5       6                 3       14                        3       7                      0       0
                      6                                                                                                                           6
                  5/3                                                     7/4                                                                 5/3                                                     7/4
                            5/0           3           5/0                           6                 4                6                                5/0           3           5/0                           6                 4                6
        3                                                         4                                                                 3                                                         4
                                                                                                5/4                                                                                                                         5/4
                      3                           0                           4                                   10                              3                           0                           4                                   10
                  C         4/0               G       6/0                 J                                   L                               C         4/0               G       6/0                 J                                   L
              5       3                   4       0                   2       4                           2       10                      5       3                   4       0                   2       4                           2       10
                                                                                                4                                                                                                                           4


                                                              8/2                                                                                                                         8/2
                      4                           7                           4                                   4                               4                           7                           4                                   4
                  D             4             E                           I                 4                 K                               D             4             E                           I                 4                 K
              5       4                   5       7                   4       4                           1       0                       5       4                   5       7                   4       4                           1       0
                                                              2                                                                                                                           2
        6/4                                                                                 2                                       6/4                                                                                 2
                            3             4/0         5               3/0                             3/0              4/0                              3             4/0         5               3/0                             3/0              4/0
                  4                                                               4/2                                                         4                                                               4/2
                      7/6                                                                                                                         7/6
        0                           6                         14                                7                              11   0                           6                         14                                7                              11
    A                           B             6           F               4                 H                 5            M      A                         B             6           F               4                 H                 5            M
4       16                  5       6                 3       14                        3       7                      0       04   16                  5       6                 3       14                        3       7                      0       0
                      6                                                                                                                           6
                  5/3                                                     7/4                                 3                               5/3                                                     7/4                                 3
                            5/0           3           5/0                           6                                  6                                5/0           3           5/0                           6                                  6
        3                                                         4                                 4/3                             3                                                         4                                 4/3
                                                                                                5/4                                                                                                                         5/3
                      3                           0                           4                                   10                              3                           0                           4                                   9
                  C         4/0               G       6/0                 J                                   L                               C         4/0               G       6/0                 J                                   L
              5       3                   4       0                   2       4                           3       9                       5       3                   4       0                   4       3                           3       9
                                                                                                4                                                                                                                           3


                                                              8/2                                                                                                                         8/2
                      4                           7                           4                                   4                               4                           7                           4                                   4
                  D             4             E                           I                 4                 K                               D             4             E                           I                 4                 K
              5       4                   5       7                   4       4                           1       0                       5       4                   5       7                   4       4                           1       0
                                                              2                                                                                                                           2
        6/4                                                                                 2                                       6/4                                                                                 2
                            3             4/0         5               3/0                             3/0              4/0                              3             4/0         5               3/0                             3/0              4/0
                  4                                                               4/2                                                         4                                                               4/2
                      7/6                                                                                                                         7/6
        0                           6                         14                                7                              11   0                           6                         14                                8                              11
    A                           B             6           F               4                 H                 5            M      A                         B             6           F               4                 H                 5            M
4       16                  5       6                 3       14                        3       7                      0       04   16                  5       6                 3       14                        4       7                      0       0
                      6                                                                                                                           6
                  5/3                                                     7/4                                 3                               5/3                                                     7/4
                            5/0           3           5/0                           6                                  6                                5/0           3           5/0                           6                 4                6
        3                                                         4                                 4/3                             3                                                         4
                                                                                                5/4                                                                                                                         5/4
                      3                           0                           4                                   10                              3                           0                           4                                   10
                  C         4/0               G       6/0                 J                                   L                               C         4/0               G       6/0                 J                                   L
              5       3                   4       0                   4       4                           4       9                       5       3                   4       0                   4       4                           4       10
                                                                                                4                                                                                                                           4


                                                              8/2                                                                                                                         8/2
                      4                           7                           4                                   4                               4                           7                           4                                   4
                  D             4             E                           I                 4                 K                               D             4             E                           I                 4                 K
              5       4                   5       7                   4       4                           1       0                       5       4                   5       7                   4       4                           1       0
                                                              2                                                                                                                           2
        6/4                                                                                 2                                       6/4                                                                                 2
                            3             4/0         5               3/0                             3/0              4/0                              3             4/0         5               3/0                             3/0              4/0
                  4                                                               4/2                                                         4                                                               4/2
                      7/6                                                     4/3                                                                 7/6                                                     4/3
        0                           6                         14                                7                              11   0                           6                         14                                7                              11
    A                           B             6           F                                 H                 5            M      A                         B             6           F                                 H                 5            M
4       16                  5       6                 5       13                        4       7                      0       04   16                  5       6                 5       14                        4       7                      0       0
                      6                                                       3                                                                   6                                                       3
                  5/3                                                     7/4                                                                 5/3                             1                       7/4
                            5/0           3           5/0                           6                 4                6                                5/0           3                                         6                 4                6
        3                                                         4                                                                 3                                                 5/1
                                                                                                                                                                                        4
                                                                                                5/4                                                                                                                         5/4
                      3                           0                           4                                   10                              3                           1                           4                                   10
                  C         4/0               G       6/0                 J                                   L                               C         4/0               G       6/0                 J                                   L
              5       3                   4       0                   4       4                           4       10                      5       3                   6       0                   4       4                           4       10
                                                                                                4                                                                                                                           4


                                                              8/2                                                                                                                         8/2
                      4                           7                           4                                   4                               4                           7                           4                                   4
                  D             4             E                           I                 4                 K                               D             4             E                           I                 4                 K
              5       4                   5       7                   4       4                           1       0                       5       4                   5       7                   4       4                           1       0
                                                              2                                                                                                                           2
        6/4                                                                                 2                                       6/4                                                                                 2
                            3             4/0         5               3/0                             3/0              4/0                              3             4/0         5               3/0                             3/0              4/0
                  4                                                               4/2                                                         4                                                               4/2
                      7/6                                                     4/3                                                                 7/6                                                     4/3
        0                           6                         14                                7                              11   0                           6                         14                                7                              11
    A                           B             6           F                                 H                 5            M      A                         B             6           F                                 H                 5            M
4       16                  5       6                 5       14                        4       7                      0       04   15                  5       6                 5       14                        4       7                      0       0
                      6                                                       3                                                                   6                                                       3
                  5/3                             1                       7/4                                                                 5/2                             1                       7/4
                            5/0           3                                         6                 4                6                                5/0           3                                         6                 4                6
        3                                                 5/1
                                                            4                                                                       2                                                 5/1
                                                                                                                                                                                        4
                                    1                                                           5/4                                                             1                                                           5/4
                      4                           1                           4                                   10                              3                           1                           4                                   10
                  C                           G       6/0                 J                                   L                               C                           G       6/0                 J                                   L
              5       3                   6       1                   4       4                           4       10                      5       3                   6       1                   4       4                           4       10
                                    4/1                                                         4                                                               4/1                                                         4
792                                                                                                                              Cap´
                                                                                                                                        ıtulo 7. Grafos


                                              4   4/4                 7   8/2                  4    4/4                4
                                          D                       E                        I                       K
                                      5       4               5       7                4       4               1       4


                                      6/4         3/3         4/0         5/5          3/0         4/2         3/0          4/4


                                 0    7/6                 6   6/6                 14   4/3                 7   5/5                  15
                             A                        B                       F                        H                        M
                         4       15               5       6               5       14               4       7                0       0


                                      5/2         5/0         3/3         5/1          7/4         6/6         4/4          6/6


                                              3                       1                        4    5/4                10
                                          C       4/1             G       6/0              J                       L
                                      5       3               6       1                4       4               4       10



        ÙÖ º    ר Ó ¬Ò Ð                             Ù ÓÒ Ð ÓÖ ØÑÓ                                ÔÖ ¹­Ù Ó ×Ó Ö Ð ¬ ÙÖ º                        ÓÒ ÓÐ
        ÔÖ ÓÖ º

    7.10.13.9    Empuje de pre-flujo con cola aleatoria

      × ÑÙÝ ÔÖÓ Ð ÜØÖ Ö ÒÓ Ó× Ø ÚÓ× × Ò Ö Ó× Ð Ð ×º ÈÓÖ ×Ó¸ × × Ð Ñ Ò Ñ Þ Ö
    Ð     ÒØ          ר Ð ×        ÜØÖ ÓÒ × Ú Ò ×¸ ÐÓ Ù Ð Ô Ò      Ð ×Ù ÖØ ØÓÔÓÐÓ
       Ð Ö Ó¸ Ð ×Ù ÖØ ÓÒ ÕÙ × Ñ Ö Ò ÐÓ× Ö Ó× Ý Ð ×Ù ÖØ ÓÒ ÕÙ × ÔÖ × ÒØ Ò ÐÓ×
    Ú ÐÓÖ × Ð × Ô            ׺
          × ¸ Ø ÒØÓ Ô Ö Ò Ð ×Ù ÖØ ÕÙ × Ø ÒØ ÓÖ ÒØÖÓ Ù ÖÐ Ò Ð Ð ÓÖ ØÑÓº ×
    Ø ÒÓÖ¸ ÙÒ ×ØÖÙ ØÙÖ          ØÓ× Ô Ö Ö ÔÖ × ÒØ Ö Ah × ÒÓÑ Ò “cola aleatoria”¸ Ð Ù Ð
    ÔÙ ÑÔÐ ÒØ Ö× ÑÙÝ ÐÑ ÒØ
¾    ØÔÐ Ö Ò ÓÑ ÕÙ Ù ºÀ ¾ ≡
        template <class T> class Random_Set
        {
          DynArray<T> array;
          gsl_rng * r;
          void put(const T & item) { array[array.size()] = item; }
          T get()
          {
            const size_t pos = gsl_rng_uniform_int(r, array.size()); // ındice al azar
                                                                        ´
            T ret_val = array.access(pos);
            array.access(pos) = array.access(array.size() - 1);
            array.cut(array.size() - 1);
            return ret_val;
          }
        };
    Í× × DynArray ¾º
    Ç × ¸ ÙÒ ÓÐ ÙÝ ÓÔ Ö ÓÒ get() × Ð ÓÒ Ð Þ Ö Ð Ð Ñ ÒØÓ                                                                                  Ð Ñ Ò Öº ÓÒ ×Ø
     רÖÙ ØÙÖ ¸ ÔÓ ÑÓ× ÑÔÐ ÒØ Ö Ð × Ù ÒØ ×Ô Ð Þ ÓÒ
¾     ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡
            template <class Net> typename Net::Flow_Type
        random_preflow_maximum_flow(Net & net, const bool & leave_residual = false)
        {
          return generic_preflow_vertex_push_maximum_flow
            <Net, Random_Set<typename Net::Node*> > (net, leave_residual);
        }
         ÍÒ      Ù ÓÒ ÓÑÔÐ Ø ¸ Ù Ò ¸ ÓÒ ×Ø ÓÐ ¸ × ÑÙ ×ØÖ Ò Ð ¬ ÙÖ º ¼ ´Ô ׺
        ¿¹ µº
7.10. Redes de flujo                                                                                                                                                                                793


                      6   4/0                 3   8/0                 0   4/0                 0                              6                       7   8/0                 0     4/0                 0
                  D                       E                       I                       K                              D           4           E                       I                         K
              4       0               3       0               2       0               1       0                      5       4               3       0               2       0                 1       0


             6            3           4/0         5/0         3/0         4/0         3/0         4/0               6            3           4/0         5/0         3/0           4/0         3/0         4/0


        0                         7   6/0                 0   4/0                 0   5/0                 0    0                         7   6/0                 0   4/0                   0   5/0                 0
    A             7           B                       F                       H                       M      A           7           B                       F                         H                       M
4       21                3       0               2       0               1       0               0       04   21                3       0               2       0                 1       0               0       0


             5            5/0         3/0         5/0         7/0         6/0         4/0         6/0               5            5/0         3/0         5/0         7/0           6/0         4/0         6/0


                      5                       0                       0   5/0                 0                              5                       0                       0     5/0                 0
                  C       4/0             G       6/0             J                       L                              C       4/0             G       6/0             J                         L
              3       0               4       0               2       0               1       0                      3       0               4       0               2       0                 1       0

                      6                       7   8/0                 0   4/0                 0                              6                       7   8/0                 0     4/0                 0
                  D           4           E                       I                       K                              D           4           E                       I                         K
              5       4               3       0               2       0               1       0                      5       4               3       0               2       0                 1       0


             6            3           4/0         5/0         3/0         4/0         3/0         4/0               6            3           4/0         5/0         3/0           4/0         3/0         4/0


        0                         7                       6   4/0                 0   5/0                 0    0                         7                       6   4/0                   0   5/0                 0
    A             7           B           6           F                       H                       M      A           7           B           6           F                         H                       M
4       21                4       6               2       0               1       0               0       04   21                4       7               2       0                 1       0               0       0

                                                                                                                             1
             5            5/0         3/0         5/0         7/0         6/0         4/0         6/0               5                        3/0         5/0         7/0           6/0         4/0         6/0
                                                                                                                                     5/1

                      5                       0                       0   5/0                 0                              6                       0                       0     5/0                 0
                  C       4/0             G       6/0             J                       L                              C       4/0             G       6/0             J                         L
              3       0               4       0               2       0               1       0                      3       0               4       0               2       0                 1       0

                      6                       7   8/0                 0   4/0                 0                              6                       7   8/0                 0     4/0                 0
                  D           4           E                       I                       K                              D           4           E                       I                         K
              5       4               3       0               2       0               1       0                      5       4               3       0               2       0                 1       0


             6            3           4/0         5/0         3/0         4/0         3/0         4/0               6            3           4/0         5/0         3/0           4/0         3/0         4/0


        0                         7                       6   4/0                 0   5/0                 0    0                         7                       6   4/0                   0   5/0                 6
    A             7           B           6           F                       H                       M      A           7           B           6           F                         H                       M
4       21                4       7               2       6               1       0               0       04   21                4       7               2       6                 1       0               0       0

                      1                                                                                                      1
             5                        3/0         5/0         7/0         6           4/0         6/0               5                        3/0         5/0         7/0           6           4/0         6
                              5/1                                                                                                    5/1

                      6                       0                       0   5/0                 6                              6                       0                       0     5/0                 6
                  C       4/0             G       6/0             J                       L                              C       4/0             G       6/0             J                         L
              3       0               4       0               2       0               1       0                      3       0               4       0               2       0                 1       6

                      4                       7   8/0                 0   4/0                 0                              4                       7   8/0                 0     4/0                 0
                  D           4           E                       I                       K                              D           4           E                       I                         K
              5       4               3       0               2       0               1       0                      5       4               3       0               2       0                 1       0

        6/4                                                                                                    6/4
                          3           4/0         5/0         3/0         4/0         3/0         4/0                            3           4/0         5/0         3/0           4/0         3/0         4/0
                  4                                                                                                      4

        0                         7                       6   4/0                 0   5/0                 6    0                         7                       9   4/0                   0   5/0                 6
    A             7           B           6           F                       H                       M      A           7           B           6           F                         H                       M
4       19                4       7               2       6               1       0               0       04   19                4       7               2       6                 1       0               0       0

                      1                                                                                                      1
             5                        3/0         5/0         7/0         6           4/0         6                 5                        3           5/0         7/0           6           4/0         6
                              5/1                                                                                                    5/1

                      6                       0                       0   5/0                 6                              6                       0                       0     5/0                 6
                  C       4/0             G       6/0             J                       L                              C       4/0             G       6/0             J                         L
              3       0               4       0               2       0               1       6                      5       3               4       0               2       0                 1       6

                      4                       7   8/0                 0   4/0                 0                              4                       7   8/0                 0     4/0                 0
                  D           4           E                       I                       K                              D           4           E                       I                         K
              5       4               3       0               2       0               1       0                      5       4               3       0               2       0                 1       0

        6/4                                                                                                    6/4
                          3           4/0         5/0         3/0         4/0         3/0         4/0                            3           4/0         5/0         3/0           4/0         3/0         4/0
                  4                                                                                                      4
                                                                                                                                                                             4/3
        0                         7                       9   4/0                 0   5/0                 6    0                         7                       9                         3   5/0                 6
    A             7           B           6           F                       H                       M      A           7           B           6           F                         H                       M
4       16                4       7               2       6               1       0               0       04   16                4       7               2       9                 1       0               0       0
                                                                                                                                                                             3
                    1
                  5/2                                                                                                      1
                                                                                                                         5/2
                                      3           5/0         7/0         6           4/0         6                                          3           5/0         7/0           6           4/0         6
        2                     5/1                                                                              2                     5/1

                      3                       0                       0   5/0                 6                              3                       0                       0     5/0                 6
                  C       4/0             G       6/0             J                       L                              C       4/0             G       6/0             J                         L
              5       3               4       0               2       0               1       6                      5       3               4       0               2       0                 1       6




      ÙÖ º ¼ ÍÒ    Ù ÓÒ ÓÑÔÐ Ø ÚÓÖ Ð ´¿¾ Ø Ö ÓÒ ×µ Ð Ð ÓÖ ØÑÓ                                                                                                                              ÔÖ ¹­Ù Ó
    ÓÒ ÓÐ Ð ØÓÖ ×Ó Ö Ð Ö    Ð ¬ ÙÖ º º
794                                                                                                                                                                    Cap´
                                                                                                                                                                          ıtulo 7. Grafos


                                                          8/2                                                                                                                  8/2
                      4                       7                           2     4/0                   0                                    4                       7                           2     4/0                   0
                  D           4           E                           I                           K                                    D           4           E                           I                           K
              5       4               3       7                   2       0                   1       0                            5       4               3       7                   2       0                   1       0
                                                          2                                                                                                                    2
        6/4                                                                                                                  6/4
                          3           4/0         5               3/0           4/0           3/0             4/0                              3           4/0         5               3/0         4/0             3/0             4/0
                  4                                                                                                                    4
                                                                          4/3
        0                         7                       14                            3     5/0                     6    0                           7                       14                            4     5/0                     6
    A             7           B           6           F                             H                             M      A             7           B           6           F               4             H                             M
4       16                4       7               2       9                     1       0                     0       04   16                  4       7               3       10                    1       0                     0       0
                                                                          3
                    1
                  5/2                                                                                                                    1
                                                                                                                                       5/2
                                      3           5/0             7/0           6             4/0             6                                            3           5/0             7/0         6               4/0             6
        2                     5/1                                                                                            2                     5/1

                      3                       0                           0     5/0                   6                                    3                       0                           0     5/0                   6
                  C       4/0             G       6/0                 J                           L                                    C       4/0             G       6/0                 J                           L
              5       3               4       0                   2       0                   1       6                            5       3               4       0                   2       0                   1       6

                                                          8/2                           4/2                                                                                    8/2                           4/2
                      4                       7                           2                           2                                    4                       7                           2                           2
                  D           4           E                           I                           K                                    D           4           E                           I                           K
              5       4               3       7                   2       2                   1       0                            5       4               3       7                   2       2                   1       0
                                                          2                             2                                                                                      2                             2
        6/4                                                                                                                  6/4
                          3           4/0         5               3/0           4/0           3/0             4/0                              3           4/0         5               3/0         4/0             3/0             4/0
                  4                                                                                                                    4
                                                                                                                                                                                                                           5/4
        0                         7                       14                            4     5/0                     6    0                           7                       14                            4                             10
    A             7           B           6           F               4             H                             M      A             7           B           6           F               4             H                             M
4       16                4       7               3       10                    1       0                     0       04   16                  4       7               3       10                    1       4                     0       0
                                                                                                                                                                                                                           4
                    1
                  5/2                                                                                                                    1
                                                                                                                                       5/2
                                      3           5/0             7/0           6             4/0             6                                            3           5/0             7/0         6               4/0             6
        2                     5/1                                                                                            2                     5/1

                      3                       0                           0     5/0                   6                                    3                       0                           0     5/0                   6
                  C       4/0             G       6/0                 J                           L                                    C       4/0             G       6/0                 J                           L
              5       3               4       0                   2       0                   1       6                            5       3               4       0                   2       0                   1       6
                                                                                                                                                                               8/2                           4/2
                                                                                                                                           4                       7                           2                           2
                                                          8/2                           4/2                                            D           4           E                           I                           K
                                                                                                                                   5       4               3       7                   2       2                   1       0
                  4                       7                           2                           2                                                                            2                             2
                D             4         E                           I                           K
              5   4                   3   7                       2   2                       1   0
                                                          2                             2                                    6/4
                                                                                                                                               3           4/0         5               3/0         4/0             3/0             4/0
        6/4                                                                                                                            4
                          3           4/0         5               3/0           4/0           3/0             4/0
                  4                                                                                                                                                                                                        5/4
                                                                                                                             0                         7                       14                            4                             10
                                                                                                      5/4                A             7           B           6           F               4             H                             M
                                                                                                                   4         16                4       7               3       14                    1       4                     0       0
    0                         7                       14                            4                             10                                                                                                       4
  A               7         B             6         F                 4           H                             M
4   16                    4   7                   3   14                        1   4                         0   0
                                                                                                      4                                  1
                                                                                                                                       5/2                                                 7/4
                                                                                                                                                           3           5/0                         6               4/0             6
                    1
                  5/2                                                 7/4                                                    2                     5/1                             4
                                      3           5/0                           6             4/0             6
        2                     5/1                             4                                                                                                                                              5/4
                                                                                                                                           3                       0                           4                           10
                                                                                                                                       C       4/0             G       6/0                 J                           L
                                                                                                                                   5       3               4       0                   2       4                   1       6
                  3                       0                           4         5/0               6                                                                                                          4
                C         4/0           G         6/0               J                           L
              5   3                   4   0                       2   0                       1   6

                                                          8/2                           4/2                                                                                    8/2                           4/2
                      4                       7                           2                           2                                    4                       7                           2                           2
                  D           4           E                           I                           K                                    D           4           E                           I                           K
              5       4               3       7                   2       2                   1       2                            5       4               3       7                   2       2                   1       2
                                                          2                             2                                                                                      2                             2
        6/4                                                                                                       4/2        6/4                                                                                                       4/2
                          3           4/0         5               3/0           4/0           3/0                                              3           4/0         5               3/0         4/0             3/0
                  4                                                                                       2                            4                                                                                       2
                                                                                                      5/4                                                                                                                  5/4
        0                         7                       14                            4                             12   0                           7                       14                            8                             12
    A             7           B           6           F               4             H                             M      A             7           B           6           F               4             H                             M
4       16                4       7               3       14                    1       4                     0       04   16                  4       7               3       14                    1       4                     0       0
                                                                                                      4                                                                                                                    4
                    1
                  5/2                                                 7/4                                                                1
                                                                                                                                       5/2                                                 7/4
                                      3           5/0                           6             4/0             6                                            3           5/0                         6               4               6
        2                     5/1                             4                                                              2                     5/1                             4
                                                                                        5/4                                                                                                                  5/4
                      3                       0                           4                           10                                   3                       0                           4                           10
                  C       4/0             G       6/0                 J                           L                                    C       4/0             G       6/0                 J                           L
              5       3               4       0                   2       4                   2       6                            5       3               4       0                   2       4                   2       10
                                                                                        4                                                                                                                    4


                                                          8/2                           4/2                                                                                    8/2                           4/2
                      4                       7                           2                           2                                    4                       7                           5                           2
                  D           4           E                           I                           K                                    D           4           E                           I                           K
              5       4               3       7                   2       2                   1       2                            5       4               3       7                   2       2                   1       2
                                                          2                             2                                                                                      2                             2
        6/4                                                                                                       4/2        6/4                                                                         3                             4/2
                          3           4/0         5               3/0           4/0           3/0                                              3           4/0         5               3/0                         3/0
                  4                                                                                       2                            4                                                       4/3                             2

        0                         7                       14                            8                             13   0                           7                       14                            8                             13
    A             7           B           6           F               4             H             5               M      A             7           B           6           F               4             H             5               M
4       16                4       7               3       14                    3       5                     0       04   16                  4       7               3       14                    3       8                     0       0

                    1
                  5/2                                                 7/4                                                                1
                                                                                                                                       5/2                                                 7/4
                                      3           5/0                           6             4               6                                            3           5/0                         6               4               6
        2                     5/1                             4                                                              2                     5/1                             4
                                                                                        5/4                                                                                                                  5/4
                      3                       0                           4                           10                                   3                       0                           4                           10
                  C       4/0             G       6/0                 J                           L                                    C       4/0             G       6/0                 J                           L
              5       3               4       0                   2       4                   2       10                           5       3               4       0                   2       4                   2       10
                                                                                        4                                                                                                                    4
7.10. Redes de flujo                                                                                                                                                                                                                795


                                                           8/2                                                                                                                             8/2
                      4                        7                           5                           4                                      4                               7                            5                           4
                  D           4            E                           I             4             K                                      D               4               E                            I             4             K
              5       4                3       7                   4       4                   1       2                              5       4                       3       7                    4       4                   1       4
                                                           2                                                                                                                               2
        6/4                                                                          3                            4/2         6/4                                                                                    3
                          3            4/0         5               3/0                         3/0                                                    3               4/0          5               3/0                         3/0          4
                  4                                                        4/3                         2                                  4                                                                4/3

        0                         7                        14                            8                           13   0                                   7                            14                            8                          15
    A             7           B            6           F               4             H             5             M      A                 7               B               6            F               4             H             5            M
4       16                4       7                3       14                    3       8                   0       04   16                          4       7                    3       14                    3       8                  0       0

                    1
                  5/2                                                    7/4                                                                1
                                                                                                                                          5/2                                                          7/4
                                       3           5/0                         6               4            6                                                         3            5/0                         6               4            6
        2                     5/1                              4                                                              2                           5/1                                  4
                                                                                         5/4                                                                                                                             5/4
                      3                        0                           4                           10                                     3                               0                            4                           10
                  C       4/0              G       6/0                 J                           L                                      C           4/0                 G        6/0                 J                           L
              5       3                4       0                   2       4                   2       10                             5       3                       4       0                    2       4                   2       10
                                                                                         4                                                                                                                               4


                                                           8/1                                                                                                                             8/1
                      4                        7                           4                           4                                      4                               7                            4                           4
                  D           4            E                           I             4             K                                      D               4               E                            I             4             K
              5       4                5       6                   4       4                   1       4                              5       4                       5       7                    4       4                   1       4
                                                           1                                                                                                                               1
        6/4                                                                          3                                        6/4                             1                                                      3
                          3            4/0         5               3/0                         3/0          4                                         3                            5               3/0                         3/0          4
                  4                                                        4/3                                                            4                               4/1                              4/3

        0                         7                        14                            8                           15   0                                   8                            14                            8                          15
    A             7           B            6           F               4             H             5             M      A                 7               B               6            F               4             H             5            M
4       16                4       7                3       14                    3       8                   0       04   16                          5       7                    3       14                    3       8                  0       0

                  5/2
                    1                                                    7/4                                                              5/2
                                                                                                                                            1                                                          7/4
                                       3           5/0                         6               4            6                                                         3            5/0                         6               4            6
        2                     5/1                              4                                                              2                           5/1                                  4
                                                                                         5/4                                                                                                                             5/4
                      3                        0                           4                           10                                     3                               0                            4                           10
                  C       4/0              G       6/0                 J                           L                                      C           4/0                 G        6/0                 J                           L
              5       3                4       0                   2       4                   2       10                             5       3                       4       0                    2       4                   2       10
                                                                                         4                                                                                                                               4


                                                                           4     4/4                   7     8/1                  4        4/4                    4
                                                                       D                           E                          I                               K
                                                                   5       4                   5       7                  4       4                       1       4


                                                                   6/4         3/3             4/1          5/5           3/0             4/3             3/0             4/4


                                                           0       7/6                   7     6/6                   14   4/4                     8       5/5                     15
                                                       A                             B                           F                            H                               M
                                                   4       15                  5         7                  3        14                   3       8                       0       0


                                                                   5/2         5/1             3/3          5/0           7/4             6/6             4/4             6/6


                                                                           3                           0                          4        5/4                    10
                                                                       C         4/0               G         6/0              J                               L
                                                                   5       3                   4       0                  2       4                       2       10



   ÙÖ º ½ ÍÐØ Ñ × Ø Ö ÓÒ × Ý ×Ø Ó ¬Ò Ð                                                                                                        Ù ÓÒ Ð ÓÖ ØÑÓ                                            ÔÖ ¹­Ù Ó ×Ó Ö
Ð ¬ ÙÖ º ÓÒ ÓÐ Ð ØÓÖ º
  Ä Ø Ð × Ù ÒØ Ö ×ÙÑ Ð                                                               ÒØ                    ØÓØ Ð              Ø Ö ÓÒ × ÕÙ ØÓÑ Ò Ð × ØÖ × ÙÖ ×Ø ×
ÔÖ Ð Ö    ÑÔÐÓ
                                               À ÙÖ ×Ø                                                      ÆÙÑ ÖÓ                         ØÖ             ÓÒ ×
                                                 ÓÐ Á Ç
                                               ÓÐ ÔÖ ÓÖ                                                                                ¿
                                               ÓÐ Ð ØÓÖ                              ÑÒ                ¾ ¹ ÔÖÓÑ                       Ó           ¼¸¿ ¹ Ñ Ü                                ¼
 Ð ÔÖÓÑ Ó × Ð ÙÐÓ Ô Ö 100 Ù ÓÒ ×º È Ö Ð ÑÔÐÓ¸ Ð ÓÐ Ð ØÓÖ Ó Ö ÙÒ
    Ù ÓÒ ÔÖÓÑ Ó Ñ ÓÖ Ð × ÓØÖ × Ó× ÙÖ ×Ø ׺ Ò Ð ÑÔÐÓ ÑÓ×ØÖ Ó × ØÙÚÓ Ð
×Ù ÖØ     Ð ÒÞ Ö Ð ×ÙÑ ÖÓ Ò Ò Ó Ø Ö ÓÒ × ÓÒ Ð Ñ ×ÑÓ Ú ÐÓÖ ­Ù Ó ÕÙ ÓÒ Ð
 ÓÐ Á Ç ´6µº
7.10.13.10                            Algoritmo gen´rico de empuje de pre-flujo por arcos
                                                   e

ÍÒ ÐØ ÖÒ Ø Ú Ð Ð ÓÖ ØÑÓ Ò Ö Ó ÓÒ× ×Ø Ò Ñ Ò Ö ÙÒ ×ØÖÙ ØÙÖ    ØÓ× ÓÖ Ò¹
Ø   Ð ÓÒ ÙÒØÓ    Ö Ó× Ð Ð × Ò ÐÙ Ö Ð ÐÓ× ÒÓ Ó× Ø ÚÓ׺ Ä ÜØÖ ÓÒ Ð
796                                                            Cap´
                                                                  ıtulo 7. Grafos



 ÓÐ × Ö Ð       ÙÒ Ö Ó Ð Ð × ÙÒ Ð ÙÒ Ö Ø Ö Ó ÓÑ Ò Ó ÓÒ Ð ÐØÙÖ Ð ÒÓ Óº
      ÑÓ× Ø Ò Ö ×Ô Ð Ù Ó ÓÒ Ð Ö ¹ Ø ÕÙ Ø Ó¸ ÔÙ × Ù Ò Ó Ó ÙÖÖ ÙÒ Ò Ö Ñ ÒØÓ
     ÐØÙÖ     ÙÒ ÒÓ Ó¸ Ö Ó× Ú Ò Ò Ð Ð ×¸ Ô ÖÓ ÓØÖÓ× ÕÙ Ö Ò Ð Ð × Ú Ò Ò
 Ò Ð Ð ×º Ä ×ØÖÙ ØÙÖ         ØÓ×     Ñ Ò Ö Ø ÒØÓ ÐÓ× ÒÓ Ó× Ø ÚÓ× ÓÑÓ ÐÓ× Ö Ó×
 РР׺
    À Ý Ú Ö × Ñ Ò Ö × Ñ ÒØ Ò Ö Ð ÓÒ ÙÒØÓ Ö Ó× Ð Ð ×º ÇÔØ Ö ÑÓ× ÔÓÖ ÑÔÐ Ö
  Ó× ÓÒ ÙÒØÓ× Ð ÐÓ× Ö Ó× Ð Ð × Ý Ð ÐÓ× ÒÓ Ó× Ø ÚÓ× Ý ÒÓ ÒÓ× ÔÖ Ó ÙÔ Ö ÑÓ׸
   Ò Ð Ò ¸ ÔÓÖ × Ö Ö Ó× ÕÙ       Ò × Ö Ð Ð × Ù Ò Ó Ó ÙÖÖ ÙÒ Ò Ö Ñ ÒØÓº      Ó
ÐÓ ÒØ Ö ÓÖ¸ ÓÒ× Ö ÑÓ× Ð × Ù ÒØ Ð ÓÖ ØÑÓ Ò Ö Ó
   ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡               ¾
     template <class Net, class QN_Type, class QA_Type> typename Net::Flow_Type
 generic_preflow_edge_maximum_flow(Net & net,
                                   const bool & leave_residual = false)
 {
   net.make_residual_net();
   net.reset_counter_nodes();
   init_height_in_nodes(net);
   typename Net::Node * source = net.get_source();
   typename Net::Node * sink   = net.get_sink();
   QA_Type q; // conjunto de arcos elegibles
   QN_Type p; // conjunto de nodos activos
      ÁÒÙÒ Ö Ö Ó× Ð Ù ÒØ
  process_active_arcs:
   while (not q.is_empty()) // mientras haya arcos elegibles
     {
       typename Net::Arc * arc = get_from_active_queue(q);
       typename Net::Node * src = net.get_src_node(arc);
       typename Net::Node * tgt = net.get_tgt_node(arc);
       if (node_height<Net>(src) != node_height<Net>(tgt) + 1) // ¿a´n elegible?
                                                                    u
         continue; // No ==> ignore arco
       typename Net::Flow_Type excess = src->in_flow - src->out_flow;
       if (excess == 0) // ¿fuente fue descargado en una iteraci´n anterior?
                                                                o
         {     // s´ ==> ignore arco
                   ı
           remove_from_active_queue(p, src);
           continue; // avance al siguiente arco elegible
         }
           ÑÔÙ Ö ÔÖ ¹­Ù Ó ÔÓÖ Ö
         if (is_node_active<Net>(tgt) and tgt != source and tgt != sink)
            Å Ø Ö Ò Õ Ö Ó× Ð      Ð×   ØØ
         if (excess == 0) // ¿se descarg´ el fuente?
                                        o
           {     // s´ ==> fuente deviene inactivo
                     ı
             remove_from_active_queue(p, src);
             continue;
           }
         if (src != source and src != sink and      // ¿empuje no-saturante?
             not has_arcs_in_active_queue<Net>(src))
           { // s´ ==> incremente h(active) y re-inserte arc en q
                 ı
             remove_from_active_queue(p, src);
             node_height<Net>(src)++;
             put_in_active_queue(p, src);
7.10. Redes de flujo                                                              797



                  Å Ø Ö Ò Õ Ö Ó× Ð    Ð×    ×Ö
              }
        }
      while (not p.is_empty()) // mientras haya nodos activos
        {
          typename Net::Node * src = get_from_active_queue(p);
          node_height<Net>(src)++;
          put_in_active_queue(p, src);
          Å Ø Ö Ò Õ Ö Ó× Ð       Ð×    ×Ö
         goto process_active_arcs; // volver a procesar nuevos arcos elegibles
        }
      if (not leave_residual)
      net.unmake_residual_net();
      return source->out_flow;
  }
  Ð Ð ÓÖ ØÑÓ Ñ Ò Ó× Ð ÞÓ× ÓÒØ ÒÙÓ× ´whileµ¸      ÙÒÓ ×Ó Ó ÜØÖ Ö Ý ÔÖÓ ¹
× Ö ÙÒ Ð Ñ ÒØÓ ÙÒ ÓÒ ÙÒØÓº Ð ÔÖ Ñ Ö ÓÒ ÙÒØÓ q¸ Ø ÔÓ QN Type¸ Ö ÔÖ × ÒØ
 Ð ÒÓ Ó× Ø ÚÓ׸ Ñ ÒØÖ × ÕÙ Ð × ÙÒ Ó p¸ Ø ÔÓ QA Type¸ Ð          Ö Ó× Ð Ð ×º
  Ñ Ó× Ð ÞÓ× ×ÓÒ Ô ÖØ    ÙÒ ×ÙÔÖ ¹Ð ÞÓ ÑÔÐ ØÓ ÓÒ ÓÖÑ Ó ÔÓÖ Ð ÒרÖÙ ÓÒ goto
process active arcs¸ ÕÙ ÖÓÑÔ Ù Ò Ó Ý ÒÓ Ý Ñ × ÒÓ Ó× Ø ÚÓ׺
    ÄÓ× ÓÒ ÙÒØÓ× q Ý p ×ÓÒ Ò Ð Þ Ó× ÔÓÖ Ð ÐÓÕÙ Ò Ð ÁÒÙÒ Ö Ö Ó× Ð
 Ù ÒØ        ¸ ÙÝÓ ¬Ò Ð ÓÖ ØÑ Ó × Ð Ñ ×ÑÓ ÕÙ Ð ÈÖ ¹­Ù Ó Ò Ð          Ö Ó× Ð
ÒÓ Ó Ù ÒØ ½ Ö Ö Ð Ñ Ü ÑÓ ÔÖ ¹­Ù Ó Ò Ð
 ÁÒÙÒ Ö Ö Ó× Ð Ù ÒØ        ≡                                ´ µ
  for (Node_Arc_Iterator<Net, Res_F<Net> > it(source); it.has_current(); it.next())
    {
      typename Net::Arc * arc = it.get_current_arc();
      typename Net::Node * tgt = net.get_tgt_node(arc);
      arc->flow = tgt->in_flow = arc->cap - arc->flow; // inunde arco actual
      arc->img_arc->flow       = 0;         // arco residual sin capacidad
          // meter arcos elegibles de tgt
      for (Node_Arc_Iterator<Net, Res_F<Net> > it(tgt); it.has_current(); it.next())
        {
          typename Net::Arc * a = it.get_current_arc();
          if (node_height<Net>(tgt) == node_height<Net>(net.get_tgt_node(a)) + 1)
            put_in_active_queue(q, a); // mete en cola de arcos elegibles
        }
      put_in_active_queue(p, tgt); // mete en cola de nodos activos
    }
  source->out_flow = source->out_cap;
Í× × Node Arc Iterator     º
      Ð ÐÓÕÙ       ÑÔÙ Ö ÔÖ ¹­Ù Ó ÔÓÖ Ö          ¸ ××ÑÐ Ö   ÑÔÙ Ö ÔÖ ¹­Ù Ó ÔÓÖ Ö Ó
  ØÙ Ð    ½
  ÑÔÙ Ö ÔÖ ¹­Ù Ó ÔÓÖ Ö           ≡                                ´   µ
  const typename Net::Flow_Type push = Aleph::min(excess, arc->cap - arc->flow);
  arc->flow          += push;
  arc->img_arc->flow -= push;
  if (arc->is_residual)
    {
798                                                             Cap´
                                                                   ıtulo 7. Grafos



       net.decrease_out_flow(net.get_tgt_node(arc), push);
       net.decrease_in_flow(net.get_src_node(arc), push);
    }
  else
    {
      net.increase_in_flow(net.get_tgt_node(arc), push);
      net.increase_out_flow(net.get_src_node(arc), push);
    }
  excess -= push;
     Ù Ò Ó × ÑÔÙ Ð ÔÖ ¹­Ù Ó ÔÓÖ arc¸ Ð ÒÓ Ó ×Ø ÒÓ tgt ÔÖÓ Ð Ñ ÒØ Ú Ò
  Ø ÚÓº Ò × ×Ó¸ Ý ÕÙ Ñ Ø Ö Ò Ð ÓÐ q ÐÓ× Ö Ó× × Ð ÒØ × tgt ÕÙ × Ò Ð Ð ×
Ý tgt Ò p
 Å Ø Ö Ò Õ Ö Ó× Ð Ð × Ø Ø ≡                              ´ µ
  {
      for (Node_Arc_Iterator<Net, Res_F<Net> > it(tgt); it.has_current(); it.next())
        {
          typename Net::Arc * a = it.get_current_arc();
          if (node_height<Net>(tgt) == node_height<Net>(net.get_tgt_node(a)) + 1)
            put_in_active_queue(q, a);
        }
      put_in_active_queue(p, tgt);
  }
Í× × Node Arc Iterator   º
       ×ÔÙ × Å Ø Ö Ò Õ Ö Ó× Ð Ð × Ø Ø ¸ ÔÙ ×Ù Ö ÕÙ src × Ý
  × Ö Ó ÓÑÔÐ Ø Ñ ÒØ º Ò × ×Ó¸ src Ú Ò Ò Ø ÚÓ Ý Ý ÕÙ Ð Ñ Ò ÖÐÓ Ð
 ÓÒ ÙÒØÓ ÒÓ Ó× Ø ÚÓ׺ × × Ð ÙÒ ÓÒ Ð if (excess == 0)º
     Ð ÐÓÕÙ ÒØÖÓ Ð if (src != source and ...) × ÕÙ Þ Ð Ô ÖØ Ñ ×                Ð
 ÓÑÔÖ Ò Öº ÕÙ Ý ÕÙ Ú Ö ¬ Ö × Ð ÒÓ Ó src Ú ÒÓ Ò Ø ÚÓ¸ ÐÓ Ù Ð × ÓÒÓ
Ñ ÒØ Ð ÔÖ              Ó excess > 0º Ë × Ð×Ó¸ ÒØÓÒ × ÓÒ × ÙÖ          Ý × Ò Ø ÚÓ¸
ÔÙ × Ð Ü ×Ó Ù Ö Ò Ó Ò Ð Ö Óº               ÐÓ ÓÒØÖ Ö Ó¸     ÑÓ× Ú Ö ¬ Ö × ÑÔÙ Ö
ÔÖ ¹­Ù Ó ÔÓÖ Ö              Ù Ó ÒÓ × ØÙÖ ÒØ ¸ Ù ×Ø ÓÒ ÕÙ Ð Ø ÖÑ Ò Ð Ü ×Ø Ò
    Ö Ó× × Ð              src ÕÙ ×Ø Ò    ÒØÖÓ Ð ÓÐ ×Ø × Ð ¬Ò Ð ÖÙØ Ò
has arcs in active queue<Net,Q Type>(q, src)¸ ÙÝ ÑÔÐ ÒØ ÓÒ ×ÓÐÓ × Ö Ñ Ø
 Ò×Ô ÓÒ Ö Ð Ø Maximum Flow Ò ÐÓ× Ö Ó× × Ð ÒØ srcº
     Ò Ð Ò Ö Ñ ÒØÓ ÐØÙÖ ÙÒ ÒÓ Ó Ý ÕÙ × ÙÖ Ö× Ó × ÖÚ Ö Ú Ö Ó× ×ÙÒØÓ×
   ¯ ÈÙ ×ØÓ ÕÙ src ר        Ø ÚÓ¸ ר × Ò Ù ÒØÖ ÒØÖÓ Ð ÓÒ ÙÒØÓ pº Ë ÙÒ Ð ×ØÖÙ ¹
      ØÙÖ        ØÓ× ÒØ Ö Þ QN Type¸ ÒÓ × ÔÙ Ö Ð Þ Ö Ö Ø Ñ ÒØ Ð Ò Ö Ñ ÒØÓ
      node height<Net>(src)++ × src ר ÓÒØ Ò Ó ÒØÖÓ Ð ÓÒ ÙÒØÓ¸ ÔÙ × ×            Ø
      Ð × ÔÐ Ò ÓÖ Ò Ð ×ØÖÙ ØÙÖ                 ØÓ׺ × ÔÓÖ × Ö ÞÓÒ ÕÙ Ð Ò Ö Ñ ÒØÓ
      × src p¸ Ò Ö Ñ ÒØ Ð ÐØÙÖ Ý Ñ Ø ÒÙ ÚÓ Ò pº
   ¯ Ð Ò Ö Ñ ÒØÓ node height<Net>(src)++; ÔÙ             ÔÖÓÚÓ Ö Ð Ô Ö ÓÒ Ý ¹
      × Ô Ö ÓÒ        Ö Ó× Ð Ð ×¸ Ø ÒØÓ × Ð ÒØ × × ÓÑÓ ÒØÖ ÒØ × srcº ÈÓÖ ÐÓ×
        Ö Ó× × Ð ÒØ × ÒÓ Ý ÔÖÓ Ð Ñ Ò Ö Ú × ÖÐÓ׸ ÐÐÓ× ×ÓÒ Ö Ø Ñ ÒØ       × Ð × Ô ÖÓ
      ÐÓ× ÒØÖ ÒØ × ÒÓ ÐÓ ×ÓÒº Ò ×Ø ×Ó¸ Ð       Ö × Ó Ó ÕÙ Ð Ö Ö × Ù Ð ×Ø ÒØÖÓ
          Ð ÔÖÓÔ Ö Ù ÙÒ Ô Ô Ð × Ò Ð¸ ÔÙ × ÔÓÖ                Ö Ó ÒØÖ ÒØ src Ü ×Ø
7.10. Redes de flujo                                                            799



     ÙÒ Ö Ó Ö × Ù Ð ÕÙ ÒÓ× Ô ÖÑ Ø ÓÒÓ Ö Ò O(1) Ð Ö Ó ÒØÖ ÒØ         srcº
      Å Ø Ö Ò Õ Ö Ó× Ð Ð × ×Ö        ≡                     ´        µ
        for (Node_Arc_Iterator<Net> it(src); it.has_current(); it.next())
          {
            typename Net::Arc * a = it.get_current_arc(); // arco saliente desde src
            if (node_height<Net>(src) == node_height<Net>(net.get_tgt_node(a)) + 1
                and a->cap - a->flow > 0)
              put_in_active_queue(q, a);
            typename Net::Arc * i = a->img_arc; // arco entrante a src
            if (i->cap - i->flow > 0 and // ¿i es elegible?
                node_height<Net>(net.get_src_node(i)) == node_height<Net>(src) + 1)
              put_in_active_queue(q, i);
          }
     Í× × Node Arc Iterator   º
        Ð Ø Ö ÓÖ ÒÓ ÙØ Ð Þ Ð ¬ÐØÖÓ Res F ¬Ò Ó Ò Ü º½¼º ´Ô Ò ¾µ¸ ÔÙ × ×Ø
       Ùר Ñ ÒØ ÒÓ× ¬ÐØÖ Ö Ö Ó× × ØÙÖ Ó× Ý ÒÓ× ÑÔ Ö Ú Ö Ð ÒÓ Ó ÓÖ Ò ÙÒ
       Ö Ó ÒØÖ ÒØ srcº
      ÄÓ× Ö Ó× ÓÒØ Ò Ó× Ò q ÕÙ        Ò × Ö Ð Ð × × ÑÔÐ Ñ ÒØ × ÒÓÖ Òº
    ÈÙ Ö ÑÓ× × Ò Ö ÙÒ ×ØÖÙ ØÙÖ          ØÓ× ÕÙ Ô ÖÑ Ø Ð Ò Ö Ñ ÒØÓ Ö ØÓ Ý Ð Ñ¹
 Ò ÐÓ× Ö Ó× ÒÓ Ð Ð × Ò O(1)º
     È Ö ÕÙ ×Ø Ò ÓÕÙ × ÙÒ ÐÓ× Ö Ó× Ð Ð × Ò ÕÙ ¬ Ö Ð Ð ÓÖ ØÑÓ Ò Ö Ó
× ÙÒ ÒÓ Ó× Ø ÚÓ× Ê ×ÙÐØ ÕÙ ÓÒ ×Ø Ð ÓÖ ØÑÓ × ÒØÙ Ø Ú Ñ ÒØ Ñ × × Ò ÐÐÓ Ô Ò× Ö
 Ð ÓÖ Ò ØÖ Ø Ñ ÒØÓ ÐÓ× ÒÓ Ó× Ø ÚÓ׺ ÓÒ× Ö ÑÓ× Ð ÙÒ × ×Ô Ð Þ ÓÒ ×
   ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡
      template <class Net> typename Net::Flow_Type
  depth_first_preflow_edge_maximum_flow(Net & net,
                                             const bool & leave_residual = false)
  {
    typedef DynSetTreap<typename Net::Node*> Active;
    typedef DynListStack<typename Net::Arc*> Stack;
    return generic_preflow_edge_maximum_flow<Net,Active,Stack>(net, leave_residual);
  }
Í× × DynListStack ½½ º
ÄÓ× ÒÓ Ó× Ø ÚÓ× × Ù Ö Ò Ò ÙÒ ØÖ Ô ´Ü º¿ ´Ô Ò           µµ ÙÝ ÓÔ Ö ÓÒ get()
Ö ØÓÖÒ Ð Ñ ÝÓÖ Ú ÐÓÖ Ó × Ð ÒÓ Ó Ñ ÝÓÖ ÐØÙÖ º
    ÍÒ Ò Ö Ñ ÒØÓ Ù ×Ø O(Ð V)¸ Óר ÕÙ ÔÙ ÐÐ Ú Ö× O(1) × × Ð ÓÖ ÓÒ Ù Ó
ÙÒ Ø Ð × ¸ ÙÝ ÙÒ ÓÒ × Ò ÐÙÝ Ð ÐØÙÖ Ý Ð Ö ÓÒ Ð ÒÓ Óº ÈÓ Ö × Ö¸
ÔÓÖ ÑÔÐÓ¸ Ð Ø ÔÓ ODhashTable<Key, Record> ¬Ò Ó Ò Ü º½º º ´Ô Ò ¾ µ ÓÒ
ÙÒ Ø Ñ ÒÓ Ùר Ó ÙÒ ¾¼± Ñ × Ö ×Ô ØÓ V º
    ÄÓ× Ö Ó× Ð Ð × × Ò Ù ÒØÖ Ò Ò ÙÒ Ô Ð ¸ ÔÓÖ ÐÓ ÕÙ ×Ù ÔÖÓ × Ñ ÒØÓ Ó      Ð
 ÖÕÙ Ø ÔÓ Ò ÔÖÓ ÙÒ     º
    ÇØÖ Ú Ö× ÓÒ¸ רÖÙ ØÙÖ ÐÑ ÒØ ÑÙÝ × Ñ Ð Ö Ô ÖÓ ÔÖÓ × Ñ ÒØÓ ÑÙÝ ×Ø ÒØÓ ×
  ¬Ò ÓÑÓ
  ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡                   ¼¼
      template <class Net> typename Net::Flow_Type
  breadth_first_preflow_edge_maximum_flow(Net & net,
                                          const bool leave_residual = false)
800                                                                 Cap´
                                                                            ıtulo 7. Grafos



       {
           typedef DynSetTreap<typename Net::Node*> Active;
           typedef DynListQueue<typename Net::Arc*> Queue;
           return generic_preflow_edge_maximum_flow<Net, Active, Queue>(net, leave_residual);
       }
     Í× × DynListQueue ½ ¼ º
     Ä Ù Ð Ö ÓÖÖ ÐÓ× Ö Ó× Ð Ð × Ò ÔÖÓ ÙÒ     º
         Ò ÐÑ ÒØ ¸ ÔÙ Ö ÑÓ× ×Ô ¬ Ö ÙÒ ÔÖ ÓÖ                Ð    Ð         ÒØÖ Ó× Ö Ó×
¼¼    ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡                             ¼¼
       template <class Net> struct Compare_Arc
       {
         bool operator () (typename Net::Arc * a1, typename Net::Arc * a2) const
         {
           typename Net::Node * src1 = (typename Net::Node *) a1->src_node;
           typename Net::Node * src2 = (typename Net::Node *) a2->src_node;
           if (src1->counter == src2->counter)
             return a1->cap - a1->flow > a2->cap - a2->flow;
           return src1->counter > src2->counter;
         }
       };
       Ð Ö Ø Ö Ó Ñ Ö Ð × ÐØÙÖ × ÐÓ× ÒÓ Ó× ÓÖ Ò             Ö Óº Ë ×Ø × ×ÓÒ Ù Ð ×¸ ÒØÓÒ ×
     × Ð Ð Ö Ó ÕÙ Ø Ò Ñ ÝÓÖ Ô                  ×ÔÓÒ Ð ¸ Ó Ð ÜÔ Ø Ø Ú ÕÙ × ÑÔÙ
     Ð Ñ ÝÓÖ ÒØ            ­Ù Óº Ë ¸ ÔÓÖ Ð ÓÒØÖ Ö Ó¸ Ð × ÐØÙÖ × ¬ Ö Ò¸ ÒØÓÒ × × × Ù Ð
      Ö Ø Ö Ó ÔÖ ÓÖ       Ý × × Ð ÓÒ Ð Ö Ó ÓÒ Ñ ÝÓÖ ÐØÙÖ º
           ÓÒ Ð ÔÖ ÓÖ       ¬Ò ¸ ÔÓ ÑÓ× ¬Ò Ö ÓØÖ Ð ×             Ð ÓÖ ØÑÓ
¼¼      ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡                      ¼¼ ¼¼
           template <class Net> typename Net::Flow_Type
       priority_first_preflow_edge_maximum_flow(Net & net,
                                                const bool & leave_residual = false)
       {
         typedef DynSetTreap<typename Net::Node*> Active;
         typedef DynBinHeap<typename Net::Arc*, Compare_Arc<Net> > Prio_Queue;
         return generic_preflow_edge_maximum_flow <Net, Active, Prio_Queue>
           (net, leave_residual);
       }
          Ò ÐÑ ÒØ ¸ Ø Ñ Ò ÔÓ ÑÓ× Ð Ö Ð Þ Ö
¼¼     ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡                     ¼¼     ¼¾
           template <class Net> typename Net::Flow_Type
       random_first_preflow_edge_maximum_flow(Net & net,
                                              const bool & leave_residual = false)
       {
         typedef DynSetTreap<typename Net::Node*> Active;
         typedef Random_Set <typename Net::Arc*> Random_Queue;
         return generic_preflow_edge_maximum_flow <Net, Active, Random_Queue>
           (net, leave_residual);
       }
7.10. Redes de flujo                                                                   801



7.10.13.11    Conclusi´n sobre algoritmos de pre-flujo
                      o

  Ð × Ù Ö Ñ ÒØÓ Ý ×ØÙ Ó                 ÙÖ ×Ø × ÓÖ Ò ÔÖÓ × Ñ ÒØÓ ÒÓ Ó× Ø ÚÓ×
 × Ò ÐÓ× Ø ÑÔÓ× ØÙ Ð × ÙÒ ÑÔÓ ÒÚ ×Ø ÓÒ ÖØ к                          × Ø ÒÓÖ × ÑÔÓÖØ ÒØ
   ר Ö Ð ÙÒ × Ú ×            ÜÔÐÓÖ ÓÒ Ô Ö Ð × Ù Ö Ñ ÒØÓ Ñ ÓÖ × Ð ÓÖ ØÑÓ× Ó ×Ù
    ÔØ ÓÒ Ð × × ÔÖÓ Ð Ñ × Ô ÖØ ÙÐ Ö ×º
    Ä ÔÖ Ñ Ö Ú × Ð × Ò ÓÒ Ò Ð Ð ÙÒ ÓÒ ÐØÙÖ º Ò ÒÙ ×ØÖÓ ×ØÙ Ó ×ÓÐÓ
   ÑÓ× ÓÒ× Ö Ó Ð ×Ø Ò                  ר Ð ×ÙÑ ÖÓ¸ Ô ÖÓ ÔÙ Ö ÑÓ× Ô Ò× Ö Ò ÓØÖÓ׺ ÈÓÖ
   ÑÔÐÓ¸ ÔÓ Ö ÑÓ× ÔÖ ÓÖ Þ Ö ÕÙ × Ð Ò Ò ÔÖ Ñ ÖÓ ÕÙ ÐÐÓ× ÒÓ Ó× ÙÝÓ× Ö Ó×
× Ð × Ò ×Ø ÒØ × Ö Ò ×¸ ÑÓ Ó ÕÙ ×ØÓ× Ø Ò Ò Ð Ñ ÝÓÖ ÔÓ× Ð                                Ú ÒÖ
 Ò Ø ÚÓ× Ò ×Ù ÔÖ Ñ Ö Ó × ÖÚ ÓÒ Ø Ñ Ò ÔÓ Ö Ò ÓÒ× Ö Ö× Ð Ô                            ØÓØ Ð
 ÒØÖ       × Ö¸ ÖÐ ÔÖ ÓÖ                 ÕÙ ÐÐÓ× ÒÓ Ó× ÕÙ Ò ÓÒ ÙÒØÓ ÔÙ Ò ÒÚ Ö Ý Ö Ö
Ñ ÝÓÖ × ­Ù Ó׺
    ÇØÖÓ Ñ ÒÓ            ÜÔÐÓÖ ÓÒ ÐÓ ÓÒ ÓÖÑ Ð × ÒÓ             רÖÙ ØÙÖ        ØÓ× ÐØ Ñ ÒØ
 ¬ ÒØ × Ô Ö Ñ Ò Ö ÐÓ× ÓÒ ÙÒØÓ×                  Ö Ó× Ð Ð × Ý ÒÓ Ó× Ø ÚÓ׺ ÓÑÓ Ú ÑÓ׸ Ð
 Ð ÓÖ ØÑÓ Ò Ö Ó ÓÖ ÒØ Ó                  Ö Ó× ´Ü º½¼º½¿º½¼ ´Ô Ò      µµ × Ñ × Ñ Ð Ð Ò
 Ù ÒØÓ Ð ÓÖ Ò ÜÔÐÓÖ ÓÒ Ð Ö ¸ Ô ÖÓ Ð Ð ÓÖ ØÑÓ ×Ô Ö                         ÙÒÓ× Ù ÒØÓ× ÐÓ×
      Ó ÜØÖ ÓÒ × Ö Ó× ÕÙ ÒÓ ×ÓÒ Ð Ð ×º ÍÒ ×ØÖÙ ØÙÖ                           ØÓ× ÕÙ     Ñ×
     Ò× ÖØ Ö Ò O(1) Ø Ñ Ò Ô ÖÑ Ø Ð Ñ Ò Ö Ö Ó× ÒÓ Ð Ð × ÐÙ Ó ÙÒ Ò Ö Ñ ÒØÓ
 ÙÑ ÒØ Ö Ð ¬ Ò º
    Ä Ø Ö Ö Ú ¸ ÔÓÖ ×ÙÔÙ ×ØÓ¸ ÓÒ× ×Ø Ò Ò ÓÒØÖ Ö Ñ ÓÖ × Ð ÓÖ ØÑÓ׺ × Ø ÒÓÖ¸
ÙÒ Ú Ö ÒØ            ÑÔÙ        ÔÖ ¹­Ù Ó × ÒÓÑ Ò ÔÓÖ ÐÓÕÙ × º Ä                   ÓÒ× ×Ø Ò
× Ô Ö Ö Ð Ö Ò ÐÓÕÙ × ´×Ù Ö Ó×µ ÔÓÖ ÓÒ × ÐÐ Ú Ð ÔÖ ¹­Ù Óº ÈÓÖ ÑÔÐÓ¸ Ð
 Ö Ó ÑÔÐ Ö Ð ¬ ÙÖ º ÔÓ Ö ÑÓ× × ÓÑÔÓÒ ÖÐÓ Ò ÐÓ× ÐÓÕÙ × ÓÒ ÓÖÑ Ó×
ÔÓÖ {D, E, I, K}, {B, F, H} Ý {C, G, J, L}º ר       ¸ Ô ÖØ     ÕÙ ÔÙ           ÖÑ×ÖÔ Ó
 Ð Ð ÙÐÓ¸ × Ò ØÙÖ ÐÑ ÒØ Ô Ö Ð Ð Þ Ð × Ö¸ ÐÓ× ÐÓÕÙ × ÔÙ Ò ÔÖÓ × Ö× Ò
Ô Ö Ð ÐÓ ÔÓÖ Ú Ö Ó× ÔÖÓ × ÓÖ × × ÙÒ Ð Ö Û Ö º
7.10.14      C´lculo del corte m´
              a                 ınimo
Ì Ð Ú Þ × ÑÓÑ ÒØÓ ÓÒÚ Ö× Ö ×Ó Ö ÔÐ ÓÒ × ÓÒ Ö Ø × ÕÙ ÒÓ×           Ò Ñ × ÔÖ Ò× ¹
  Ð × ÐÓ× ÓÒÓ Ñ ÒØÓ׺ ÓÒ× Ö ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ Ð ­Ù Ó ÙØÓÑÓØÓÖ ÙÒ Ù º ×
     Ò ÔÓ× Ð Ó Ø Ò Ö ÙÒ ÑÓ ÐÓ ÙÝÓ ¬Ò × Ñ Ü Ñ Þ Ö Ð ­Ù Ó ÙØÓÑÓÚ Ð × ÙÖ ÒØ Ó¹
Ö × Ö Ø × ÒØÖ ÙÒ ÜØÖ ÑÓ Ù ÒØ Ý ÓØÖÓ ×ÙÑ ÖÓº Ò × × ÒØ Ó¸ Ð ­Ù Ó Ñ Ü ÑÓ × Ö
ÑÙÝ ÙØ Ð Ô Ö × Ò Ö ÙÒ ÔÓÐ Ø          Ö ÓÒ ØÖ Ò× ØÓ ÔÖÓ Ö Ñ ÓÒ ÐÓ× × Ñ ÓÖÓ׸
       ×Ú Ó׸ Ú Ð Ò         Ú × Ö Ø ×¸ Ø Ø Ö ¸ Ø Ò ÒØ     × ÓÒ ×Ø ÓÒ Ö Ð ØÖ ¬ Óº
   ÓÒ ÑÙ Ó Ñ Ö Ó¸ Ò ×Ø Ú ÔÓר¹ÑÓ ÖÒ × Ò Ù ÒØÖ Ò ÒÙÑ ÖÓ× × ÑÓ× ÑÔÐÓ×
  Ò ÕÙ ¸ Ô × Ö ÓÒÓ Ö Ð ­Ù Ó Ñ Ü ÑÓ Ý ÑÔÖ Ò Ö ÓÖÖ Ø Ñ ÒØ ÔÓÐ Ø × Ô Ö
ÔÖ × ÖÚ ÖÐÓ¸ Ð ­Ù Ó ÙØÓÑÓØÖ Þ × Ð Ò ÒØ Ô Ö Ð Ù Ò º Ò ×ØÓ× ×Ó× ÔÙ Ö
ÔÐ ÒØ Ö× ÙÑ ÒØ Ö Ð Ô            Ú Ðº Ù Ð × ×ÓÒ ÐÓ× ÐÙ Ö ×    Ù     Ò ÓÒ
  ÙÑ ÒØ Ö× Ð Ô            Ä Ö ×ÔÙ ×Ø ÓÑ ÒÞ ÔÓÖ Ð ÓÖØ Ñ Ò ÑÓº Ò ØÓ¸ Ð ÓÖØ
Ñ Ò ÑÓ Ö ÔÖ × ÒØ ÙÒ ÓÒ ÙÒØÓ        Ö Ó× ÕÙ × × Ö Ù × Ò Ñ ÒÓ× Ö Ð ­Ù Ó Ð
Ö º Ë ØÖ Ø Ú × Ö Ø ×¸ ÐÓ ÕÙ Ñ ÒÙ Ó × Ð Ø Ð                Ù ÐÐÓ    ÓØ ÐÐ º
      À Ý ÑÙ × Ñ × Ö ÙÒר Ò × Ð ÔÓר¹ÑÓ ÖÒ Ú Ö Ð Ò Ð × Ù Ð × Ð ÔÖÓ Ð Ñ
    Ð ­Ù Ó Ñ Ü ÑÓ Ý ×Ù Ù Ð ÓÖØ Ñ Ò ÑÓ ÔÙ Ò × Ö Ö Ø ÙØ Ð ¸ × ÙÒ Ö
    Ù Ø Ò ¸ ÙÒ Ö ÖÖÓÚ Ö Ó ØÖ Ò×ÔÓÖØ Ò Ô Ö Ó Ó× Ù ÖØ Ñ Ò Ó ÙÒ
Ö        ØÖ Ò×Ñ × ÓÒ Ð ØÖ º
802                                                              Cap´
                                                                         ıtulo 7. Grafos



          Ê Ö × ÑÓ× Ð ×ÙÒØÓ ÓÖÑ Ð Ð ÓÖØ Ñ Ò ÑÓ ØÖ Ø Ó Ò Ü º½¼º ´Ô Ò                   µº Ò
      ÕÙ Ð ÒØÓÒ × × Ù Ö ÑÓ× ÓÒÓ Ñ ÒØÓ¸ Ô ÖØ ÙÐ ÖÑ ÒØ Ð ×Ø Ð Ó ÔÓÖ Ð ÓÖÓÐ Ö Ó
      º¿ ´Ô º µ¸ ÕÙ ÒÓ× Ô ÖÑ Ø ¬Ò Ö ÙÒ Ð ÓÖ ØÑÓ                Ð ÙÐÓ     ÓÖØ Ñ Ò ÑÓº Ò Ð
     Ñ ×ÑÓ × ÒØ Ó¸ Ð ÔÖÓÔÓ× ÓÒ º ´Ô º µ¸ ÒÓ× Ó Ö             ÖØ ØÙ ÕÙ ÔÓÖ Ð Ú Ð ­Ù Ó
     Ñ Ü ÑÓ ÔÓ ÑÓ× Ò ÓÒØÖ Ö Ð ÓÖØ Ñ Ò ÑÓº
                 ØÓ×   ÔÖ Ò Ö Ð ÑÔÓÖØ Ò Ð ÓÖ ØÑ                   ÕÙ ÐÐÓ× ÓÒÓ Ñ ÒØÓ׸ Ô Ö¹
     Ñ Ø ÑÓ×ÒÓ× Ñ Ö Ö ÙÒ ÔÓ Ó Ð ÓÑÔÐ                Ò ÓÒØÖ Ö Ù ÖÞ ÖÙØ Ð ÓÖØ Ñ Ò ÑÓº
         × Ñ ÒØ ¸ Ø Ò Ö ÑÓ× ÕÙ Ø ÖÑ Ò Ö Ð × ÓÑ Ò ÓÒ × ÔÓ× Ð × ÐÓ× ÓÒ ÙÒØÓ× Vs
     Ý Vt ÙÒØÓ ÓÒ ×Ù× Ö Ó× ÖÙ º ÍÒ Ð ÓÖ ØÑÓ × Ó Ò ×Ø ÔÖ Ò Ô Ó Ö ÕÙ Ö Ö ¸ ÔÖÓ¹
     Ü Ñ Ñ ÒØ ¸ Ü Ñ Ò Ö V−2 V−2 ÓÑ Ò ÓÒ × Vs Ý Vt ÔÓ× Ð ×º ÈÓÖ
                               i=0   i                                               ÙÒÓ
      ÐÐÓ׸ Ö ÕÙ Ö ÓÖÖ Ö ÐÓ× E Ö Ó× Ô Ö Ø ÖÑ Ò Ö Ð ÓÖØ º Ë Ö ÕÙ Ö Ö Ò¸ ÒØÓÒ ×¸
                i ×E Ø Ö  ÓÒ × ÒØ         ÓÑ Ò ØÓÖ ÐÑ ÒØ ÜÔÐÓ× Ú ÒØÖ Ø Ð Ô ÖØ Ö
        V−2 V−2
        i=0
      × Ð × Ñ Ò ×º ÔÖ Ò ÑÓ׸ Ô٠׸ ÕÙ Ð ×Ø Ñ Ó ×Ó Ö ÐÓ× Ö Ó× ÖÙ ÕÙ ÒÓ×
     ÔÖÓÔÓÖ ÓÒ Ð ÓÖÓÐ Ö Ó º¿ ´Ô º µ ÒÓ× Ö Ù ÑÙÝ × Ò ¬ Ø Ú Ñ ÒØ Ð ¬ ÙÐØ                    Ð
     ÔÖÓ Ð Ñ ×Ø ÓÒ ÓÒרÖÙ Ö Ð ÓÒ ÙÒØÓ              Ö Ó× × ØÙÖ Ó× Ó ÔÐ ÒÓ׸ × Ö¸ ÕÙ ÐÐÓ×
      ÙÝÓ ­Ù Ó × Ù Ð ×Ù Ô              ¸ Ý Ù ÐÕÙ Ö ÓÑ Ò ÓÒ ÒØÖ ×ØÓ× Ö Ó× ÙÝ ×ÙÑ
     × Ù Ð Ð Ñ Ü ÑÓ Ú ÐÓÖ ­Ù Ó ÓÒ Ö Ó× Ö ØÖÓ ×Ó ÓÒ ­Ù Ó ÖÓ × ÙÒ ÓÖØ Ñ Ò ÑÓº
       ÑÔ ÖÓ¸ ÙÒ ÓÒ ×Ø ÓÒÓ Ñ ÒØÓ Ð ÔÖÓ Ð Ñ × Ù × Ò Ó Ð Ó ÓÑÔÐ Óº
           ÈÙ × ÑÔÐ ¬ Ö× Ð Ð ÙÐÓ Ð ÓÖØ Ä Ö ×ÔÙ ×Ø × ¬ÖÑ Ø Ú × Ö ÓÖ ÑÓ×
     Ð ÔÖÓÔÓ× ÓÒ º½¼ ´Ô º ¿µ Ù Ð ÒÓ× × ÙÖ ÕÙ × ÒÓ Ü ×Ø ÙÒ Ñ ÒÓ                      ÙÑ ÒØÓ¸
      ÒØÓÒ × Ð ­Ù Ó × Ñ Ü ÑÓº È ÖÓ¸ ÕÙ ×Ù Ý ØÖ × ×Ø ÓÒÓ Ñ ÒØÓ ÕÙ ÒÓ× Ô ÖÑ Ø
        Ð ÙÐ Ö Ö Ô Ý ÖØ Ö Ñ ÒØ Ð ÓÖØ Ñ Ò ÑÓ Ä Ö ×ÔÙ ×Ø ÔÙ ÔÐ ÒØ Ö× ÓÑÓ
      ÓÖÓÐ Ö Ó Ð ÔÖÓÔÓ× ÓÒ º½¼ ´Ô º ¿µ ÔÙ ×ØÓ ÕÙ ÒÓ Ü ×Ø Ñ ÒÓ                       ÙÑ ÒØÓ¸
      ÒØÓÒ × × ÑÔÓ× Ð ÐÐ Ö Ð ×ÙÑ ÖÓº ÈÓÖ Ø ÒØÓ¸ Vs × Ð ÓÒ ÙÒØÓ ÒÓ Ó× Ð ÒÞ Ð ×
        × s Ý Vt × V − Vsº ÍÒ × ÑÔÐ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ           ×Ó Ö Ð Ö Ö × Ù Ð Ö ×ÙÐØ ÒØ
     ÐÙ Ó Ñ Ü Ñ Þ Ö Ð ­Ù Ó ÒÓ× ÔÙ           × Ù Ö Ö Ð ÓÒ ÙÒØÓ Vsº
             Ô ÖØ Ö Ð    Ó ÒØ Ö ÓÖ¸ ÔÓ ÑÓ× Ò ÙÒ ÔÖ Ñ Ö Òר Ò               × Ò Ö ÙÒ ÙÒ ÓÒ
          Ú × Ø Ô Ö Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ            Ð Ö Ö × Ù Ð ÕÙ ÒÓ× Ò            Ð ÓÒ ÙÒØÓ
     vs ptr ÐÓ× ÒÓ Ó× Ô ÖØ Ò    ÒØ × Vs
¼¾      ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡                      ¼¼ ¼¿
           template <class Net> static bool
       add_vertex_to_vs(Net &, typename Net::Node * node, typename Net::Arc*)
       {
         ((Aleph::set<typename Net::Node*>*)vs_ptr)->insert(node);
         return false; // indica que debe seguir explorando
       }
     vs ptr   × ÙÒ ÔÙÒØ ÖÓ ÐÓ Ð Ð ÓÒ ÙÒØÓ Vsº
             ר ÑÓ Ó¸ ÔÓ ÑÓ× ÔÐ ÒØ Ö Ð Ð ÙÐÓ         Vs   ×
¼¾      Ð ÙÐ Ö Vs ¼¾ ≡                                                  ´ ¼¿ µ
       vs_ptr = &vs;
       depth_first_traversal <Net, Res_F<Net> > (net, source, &add_vertex_to_vs);
     ÄÙ Ó Ð Ö ÓÖÖ Ó¸ vs ÓÒØ Ò ØÓ Ó Ð ÓÒ ÙÒØÓ Vsº Ð ÓÒ ÙÒØÓ Vt ÔÓ Ö Ð ÙÐ Ö×
     ÔÓÖ Ò×Ô ÓÒ Ò Vs¸ Ô ÖÓ ÙÒ Ú Ñ × ÜÔ Ø ÓÒ× ×Ø Ð Ñ Ö Ö Ð Ø Depth First ÕÙ
     Ñ Ö Ó Ð ÐÐ Ñ      depth first traversal() × ÒÓ Ó ÒÓ ×Ø Ñ Ö Ó¸ ÒØÓÒ × ×Ø
     Ô ÖØ Ò      Vtº Ð Ð ÙÐÓ   Vt × ÔÐ ÒØ    Ð × Ù ÒØ ÑÓ Ó
¼¾      Ð ÙÐ Ö Vt ¼¾ ≡                                         ´ ¼¿ µ
7.10. Redes de flujo                                                          803



       const size_t size_vt = net.get_num_nodes() - vs.size();
       for (Node_Iterator<Net> it(net); it.has_current() and vt.size() < size_vt; it.next())
         {
           typename Net::Node * p = it.get_current();
           if (not IS_NODE_VISITED(p, Aleph::Depth_First))
             vt.insert(p);
         }
     Í× × Node Iterator       º
        ÄÙ Ó      ÓÒÓ Ó× vs Ý vt ÐÓ ÕÙ Ö ×Ø × ÓÒÓ Ö ÐÓ× Ö ×Ô Ø ÚÓ× Ö Ó×   ÖÙ º
     È Ö ÐÐÓ¸ Ö ÓÖÖ ÑÓ× ØÓ Ó× ÐÓ× Ö Ó× ÕÙ ÒÓ × Ò Ö × Ù Ð × Ý × Ð ÓÒ ÑÓ× ÕÙ ÐÐÓ×
     ÕÙ × Ø × Ò Ð × ÓÒ ÓÒ × Ð ÓÖÓÐ Ö Ó º¿ ´Ô º µº ×ØÓ Ö ÕÙ Ö ¬ÐØÖ Ö ÐÓ× Ö Ó×
     Ö× ÙÐ×
¼¿     ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡              ¼¾ ¼¿
       template <class N> class No_Res_Arc
       {
         bool operator () (N&, typename N::Arc * a) const
         {
           return not a->is_residual;
         }
       };
       ÓÒ ×Ø ¬ÐØÖÓ¸ Ò×Ô ÓÒ ÑÓ× ÐÓ× Ö Ó×        Ð Ö Ö × Ù Ð Ý ÔÖÓ × ÑÓ× ÕÙ ÐÐÓ× ÓÒ
     f(e) = 0 Ý f(e) = Ô(e)
¼¿       Ð ÙÐ Ö Ö Ó× ÖÙ     Ð ÓÖØ Ñ Ò ÑÓ    ¼¿ ≡                    ´ ¼¿ µ
       for (Arc_Iterator<Net, No_Res_Arc<Net> > it(net); it.has_current(); it.next())
         {
           typename Net::Arc * arc = it.get_current();
           if (arc->flow == 0) // ¿candidato a arco de retroceso?
             if (vt.count(net.get_src_node(arc)) > 0 and // ¿arc desde vt hacia vs?
                 vs.count(net.get_tgt_node(arc)) > 0)
               {
                 cutt.insert(arc);
                 continue;
               }
           if (arc->flow == arc->cap) // ¿candidato a arco de cruce?
             if (vs.count(net.get_src_node(arc)) > 0 and // ¿arc desde vs hacia vt?
                 vt.count(net.get_tgt_node(arc)) > 0)
               cuts.insert(arc);
         }
     Í× × Arc Iterator    º
        ÄÓ× ÐÓÕÙ × × ÖÖÓÐÐ Ó× × ÙÒØ Ò × Ù Ò ÐÑ ÒØ Ô Ö Ö Ð Þ Ö Ð Ð ÙÐÓ Ð ÓÖØ
     Ñ Ò ÑÓ
¼¿    ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡           ¼¿ ¼
         template <class Net, template <class> class Maxflow>
       typename Net::Flow_Type min_cut(Net &                             net,
                                       Aleph::set<typename Net::Node*> & vs,
                                       Aleph::set<typename Net::Node*> & vt,
                                       DynDlist<typename Net::Arc *> &   cuts,
                                       DynDlist<typename Net::Arc *> &   cutt,
                                       const bool                        leave_residual = false)
804                                                                                      Cap´
                                                                                            ıtulo 7. Grafos


                                    D   4/1     E         1/1     I    4/1     K



                                  6/1   3/3   4/0         3/3   3/0    4/0   3/0   4/1

                                                    3/3
                         A        7/3     B                 F    4/4     H   5/4     M
                                                    1/0

                                  5/3   5/0   3/3         5/0   7/2    3/3   4/0   6/5



                                    C           G                 J    5/2     L
                                        4/0               6/0



      ÙÖ º ¾ ÍÒ ÓÖØ Ñ Ò ÑÓ ×Ó Ö ÙÒ Ö         Ô Ø º ÄÓ× Ö Ó× Ô ÖØ Ò ÒØ                                    <
Vs, Vt > ×ÓÒ Ö × ÐØ Ó׸ Ñ ÒØÖ × ÕÙ ÐÓ× Ô ÖØ Ò ÒØ × < Vs, Vt > Ò Ð Ò ÓÖØ º

  {
      Maxflow <Net> () (net, true); // calcula flujo m´ximo y deja red residual
                                                      a
      typename Net::Node * source = net.get_source();
         Ð ÙÐ Ö Vs ¼¾
         Ð ÙÐ Ö Vt ¼¾
          Ð ÙÐ Ö Ö Ó×        ÖÙ         Ð ÓÖØ Ñ Ò ÑÓ ¼¿
      if (not leave_residual)
        {
          net.unmake_residual_net();
          net.unmake_super_nodes();
        }
      return source->out_flow;
  }
Í× × DynDlist ¿ º
min cut() Ô  Ö Ñ ØÖ Þ Ð Ø ÔÓ Ö Ð Ù Ð × Ð × Ð ÙÐ Ö Ð ­Ù Ó Ñ Ü ÑÓ Ý Ð ÓÖØ
Ñ Ò ÑÓ Ý Ð Ð ÓÖ ØÑÓ        Ð ÙÐÓ ­Ù Ó Ñ Ü ÑÓ ÕÙ × × ÑÔÐ Öº ÄÓ× Ô Ö Ñ ØÖÓ×
   Ð ÙÒ ÓÒ ×ÓÒ Ð Ö net¸ Ð ÓÒ ÙÒØÓ Vs vs¸ Ð ÓÒ ÙÒØÓ Vt vt¸ Ð ÓÒ ÙÒØÓ  Ö Ó×
< Vs, Vt > cuts Ý Ð ÓÒ ÙÒØÓ     Ö Ó× < Vs, Vt > cuttº
7.10.15      Aumento o disminuci´n de flujo de una red
                                o
  Ò Ð × Ö × Ö Ð × ÒÓ × ÑÔÖ × Ö ÕÙ Ö Ñ Ü Ñ Þ Ö Ð ­Ù Óº ÒØÖÓ Ð × Ö ÙÒר Ò ×
 × ÔÓ× Ð ¸ ÓÑÓ Ö ÕÙ Ö Ñ ÒØÓ¸ ÙÒ Ùר Ð ­Ù Ó ÙÒ Ú ÐÓÖ Óº
      ÓÒ× Ö ÑÓ× ÙÒ ­Ù Ó Ô ØÖÓÐ Ó ÔÓÖ ÙÒ Ö        ÓÐ Ó Ù ØÓ× ÕÙ ÓÑÔÖ Ò      ×
ÐÓ× ÔÓÞÓ× ×Ø ÐÓ× Ø ÒÕÙ × ÐÐ Ò ÖÓ׺ ÆÓ× ÒØ Ö × ×Ø Ð × ­Ù Ó ÔÓÖÕÙ ÒÓ ×
   Ø Ò Ö¿ º Ò ×Ø ×Ó¸ × ÙÒ Ð Ñ Ò Ò ÐÓ× ÐÐ Ò ÖÓ׸ ÔÙ × Ö Ò × Ö Ó Ñ ÒØ Ò Ö
 Ð ­Ù Ó ÙÒ Ú ÐÓÖ ×Ô ¬ Óº ÓÑÓ Ò Ö Ñ ÒØ Ö Ó Ö Ñ ÒØ Ö Ð ­Ù Ó Ò ÙÒ Ú ÐÓÖ Ó
      Ò ×Ø × ØÙ ÓÒ Ó Ö ÑÙ Ó × ÒØ Ó Ð            Ñ ÒÓ ÙÑ ÒØÓ¸ ÔÙ × ×Ù ×Ð ÓÒ
Ñ Ò ÑÓ Ø ÖÑ Ò ÙÒ ÓØ           Ò Ö Ñ ÒØÓ ´Ó Ö Ñ ÒØÓµ Ð ­Ù Ó ÔÓÖ Ð Ñ ÒÓ Ò
 Ù ×Ø ÓÒº Ë ÑÓ׸ ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ º ¸ ÕÙ × Ø Ò ÑÓ× ÙÒ Ñ ÒÓ ÙÑ ÒØÓ Ca ÓÒ
Ñ Ò ÑÓ ×Ð ÓÒ × ΔC ¸ ÒØÓÒ × Ð ­Ù Ó ÔÙ
                         a                   ÙÑ ÒØ Ö× Ò ÙÒ Ú ÐÓÖ x ≤ ΔC º È Ö                       a
 Ò Ö Ñ ÒØ Ö Ó Ö Ñ ÒØ Ö Ð ­Ù Ó Ò ÙÒ Ú ÐÓÖ x    ÑÓ× Ò ÓÒØÖ Ö ÙÒ Ñ ÒÓ ÓÒ ×Ð ÓÒ
Ñ Ò ÑÓ ΔC ≥ xº
             a

 ¿
       Ð Ô ØÖÓÐ Ó¸ Ù Ò Ó × Ò Ù ÒØÖ ÒÑÓÚ Ð¸ Ø Ò                  ×ÓÐ ¬ Ö× º
7.10. Redes de flujo                                                             805



         Ò ÓÒØÖ Ö ÙÒ Ñ ÒÓ ÙÑ ÒØÓ ÓÒ ÓÒ Ó ÕÙ ×Ù ×Ð ÓÒ Ñ Ò ÑÓ × Ñ ÝÓÖ Ó
      Ù Ð ÙÒ x × × Ò ÐÐÓ × ÑÔÐ ÑÓ× ÙÒ ¬ÐØÖÓ Ô Ö Ð Ø Ö ÓÖ ×Ó Ö ÐÓ× Ö Ó× ÕÙ ÒÓÖ
    ÐÓ× Ö Ó× ÙÝÓ ­Ù Ó Ö ×Ø ÒØ × Ñ ÒÓÖ ÕÙ xº
       È Ö ÐÐÓ¸ ¬Ò ÑÓ× Ð × Ù ÒØ Ð × ¬ÐØÖÓ Ð Ø Ö ÓÖ Ö Ó×
¼     ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡             ¼¿ ¼
      template <class N> class Flow_Filter
      {
        static typename N::Flow_Type min;
        typename N::Arc * operator () (typename N::Node *, typename N::Arc * arc)
        {
          return arc->cap - arc->flow >= min ? arc : NULL;
        }
      };
    Ä Ð × Flow Filter<N> ¬ÐØÖ Ö Ó× ÙÝÓ ­Ù Ó Ö ×Ø ÒØ × Ñ ÒÓÖ ÕÙ Ð Ú ÐÓÖ min¿ º
         ר ÑÓ Ó¸ ÔÓ ÑÓ× ÔÖÓ Ö Ñ Ö Ð Ù×ÕÙ       ÙÒ Ñ ÒÓ      ÙÑ ÒØÓ¸ ÓÒ ÙÑ Ö Ð
    min¸    Ð × Ù ÒØ Ñ Ò Ö
¼     ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡            ¼    ¼
          template <class Net, template <class, class> class Find_Path>
      bool find_aumenting_path(Net & net, Path<Net> & path,
                               const typename Net::Flow_Type & min_slack)
      {
        Flow_Filter<Net>::min = min_slack;
        typename Net::Node * src = net.get_source();
        typename Net::Node * sink = net.get_sink();
        if (not net.residual_net)
          net.make_residual_net();
        return Find_Path<Net, Flow_Filter<Net> > () (net, src, sink, path);
      }
    Í× × Path ¼¾ º
    find aumenting path()  Ù× ÙÒ Ñ ÒÓ ÙÑ ÒØÓ ÓÒ ×Ð ÓÒ Ñ Ò ÑÓ ×Ù¬ ÒØ Ô Ö
     ÙÑ ÒØ Ö Ð ­Ù Ó Ò Ð Ú ÐÓÖ min slackº Ð Ø ÔÓ      Ù×ÕÙ ´ Ò ÔÖÓ ÙÒ      Ó Ò
     ÑÔÐ ØÙ µ × ÙÒ Ô Ö Ñ ØÖÓ Ø ÔÓ Ð ÖÙØ Ò º Ë Ð Ñ ÒÓ Ü ×Ø ¸ ÒØÓÒ × Ð ÖÙØ Ò
    Ö ØÓÖÒ true ÐÓ ÓÒØÖ Ö Ó¸ Ö ØÓÖÒ falseº
         ÉÙ ×Ù × × × Ò ÓÒØÖ Ö ÙÒ Ñ ÒÓ             ×¹ ÙÑ ÒØÓ Ó × ÙÒÓ ÔÓÖ Ð Ù Ð¸
     Ò ÐÙ Ö     ÙÑ ÒØ Ö Ð ­Ù Ó Ò ÙÒ Ú ÐÓÖ Ó¸ × ×Ñ ÒÙÝ º Ä Ø Ò × × Ñ Ð Ö¸ ÓÒ
    Ð ×ÙØ Ð Ö Ò        ÕÙ Ð Ù×ÕÙ         Ö Ð Þ Ö× × Ð ×ÙÑ ÖÓ         Ð Ù ÒØ
¼     ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡              ¼  ¼
          template <class Net, template <class, class> class Find_Path>
      bool find_decrementing_path(Net & net, Path<Net> & path,
                                  const typename Net::Flow_Type & min_slack)
      {
        Flow_Filter<Net>::min = min_slack;
        typename Net::Node * src = net.get_source();
        typename Net::Node * sink = net.get_sink();
        if (not net.residual_net)
     ¿
        ÍÒ ÔÖÓ Ð Ñ Ð × ÒÓ      ר Ð × × ÕÙ ÒÓ × Ö ÒØÖ ÒØ º ÙÖ ÒØ Ð Ø ÑÔÓ Ò ÕÙ ÙÒ Ð Ó¹
    Ö ØÑÓ ×Ø ÑÔÐ Ò Ó Flow Filter Ð Ú Ö Ð min ÒÓ ÔÙ × Ö ÙØ Ð Þ º ÙØÙÖ × Ú Ö× ÓÒ × ALE PH
    Ñ Ò Ö Ò ×Ø Ô Ö Ñ ØÖÓ ÓÖÑ Ö ÒØÖ ÒØ º
806                                                                                         Cap´
                                                                                                   ıtulo 7. Grafos


               D    4/0     E     8/0        I    4/0         K               D   4/0      E    8/0        I    4/0         K



             6/0    3/0   4/0     5/0      3/0    4/0       3/0   4/0       6/0   3/0   4/0     5/0      3/0    4/0       3/0   4/0



     A        7/0     B   6/0       F      4/0      H       5/0     M   A   7/3     B   6/3       F      4/0      H       5/0     M



             5/1    5/0   3/1     5/0      7/1    6/0       4/0   6/1       5/1   5/0   3/1     5/0      7/4    6/0       4/0   6/4



               C            G                J    5/1         L               C            G               J    5/4         L
                    4/0           6/0                                             4/0           6/0

                    ´ µ slack   = 1     ´ÔÖÓ ÙÒ         µ                         ´ µ slack    = 3    ´ÔÖÓ ÙÒ         µ
               D    4/0     E     8/0        I    4/0         K               D   4/4      E    8/0        I    4/0         K



             6/0    3/0   4/0     5/0      3/0    4/0       3/0   4/0       6/4   3/0   4/0     5/4      3/0    4/0       3/0   4/0



     A        7/3     B   6/3       F      4/0      H       5/0     M   A   7/3     B   6/3       F      4/4      H       5/4     M



             5/3    5/0   3/3     5/0      7/4    6/2       4/0   6/6       5/3   5/0   3/3     5/0      7/4    6/2       4/0   6/6



               C            G                J    5/4         L               C            G               J    5/4         L
                    4/0           6/0                                             4/0           6/0

                      ´ µ slack   = 2    ´ ÑÔÐ ØÙ µ                                 ´ µ slack   = 4    ´ ÑÔÐ ØÙ µ

       ÙÖ º ¿ ÁÒ Ö Ñ ÒØÓ× ×Ù × ÚÓ× Ð ­Ù Ó Ñ                                 ÒØ     Ñ ÒÓ×         ÙÑ ÒØÓ Ò ÓÒØÖ Ó×
    ÔÓÖ find aumenting path()

               net.make_residual_net();
             return Find_Path<Net, Flow_Filter<Net> > () (net, sink, src, path);
         }
    Í× × Path ¼¾ º
        È Ö Ò Ö Ñ ÒØ Ö Ð ­Ù Ó¸ × ÑÔÐ ÙÒ Ú Ö ÒØ          Ð ÖÙØ Ò increase flow()¸ ¹
    × ÖÖÓÐÐ    Ò Ü º½¼º½¼ ´Ô Ò ¾µ¸ ÓÒ ÙÒ Ô Ö Ñ ØÖÓ           ÓÒ Ð valº Ë × × ¸ ÔÓÖ
        ÑÔÐÓ¸ ÙÑ ÒØ Ö Ð ­Ù Ó Ò ÙÒ Ú ÐÓÖ val ØÖ Ú × ÙÒ Ñ ÒÓ            ÙÑ ÒØÓ¸ ÒØÓÒ ×
    × ÒÚÓ increase flow(net, path, val)¸ Ð Ù Ð Ò Ö Ñ ÒØ Ð ­Ù Ó Ò val Ý ÒÓ Ò
     Ð ×Ð ÓÒ Ñ Ò ÑÓ pathº Ò ÐÓ Ñ ÒØ ¸ ÓØÖ ÖÙØ Ò ¸ ÐÐ Ñ decrease flow()
     Ð ØÖ Ó ÒÚ Ö×Ó Ó ×       Ö Ñ ÒØ Ö Ð ­Ù Ó Ò ÙÒ Ú ÐÓÖ valº
¼      ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡                        ¼
             template <class Net>
         void increase_flow(Net & net, Path<Net> & path,
                            const typename Net::Flow_Type & val)
         {
               // aumentar el flujo de la red por el camino de aumento
           for (typename Path<Net>::Iterator it(path); it.has_current_arc(); it.next())
             {
               typename Net::Arc * arc = it.get_current_arc();
               typename Net::Arc * img = (typename Net::Arc *) arc->img_arc;
               if (arc->cap - arc->flow < val)
                 throw std::domain_error("minimum slack of aumenting path es smaller "
                                         "than val");
               arc->flow += val;
               img->flow -= val;
7.10. Redes de flujo                                                          807



          if (not arc->is_residual)
            {
              net.increase_out_flow(net.get_src_node(arc), val);
              net.increase_in_flow(net.get_tgt_node(arc), val);
            }
          else
            {
              net.decrease_in_flow(net.get_src_node(arc), val);
              net.decrease_out_flow(net.get_tgt_node(arc), val);
            }
      }
  }
      template <class Net>
  void decrease_flow(Net & net, Path<Net> & path,
                     const typename Net::Flow_Type & val)
  {
    if (not net.residual_net)
      throw std::domain_error("Residual net is not created");
        // decrementar el flujo de la red por el camino de decremento
    for (typename Path<Net>::Iterator it(path); it.has_current_arc(); it.next())
      {
        typename Net::Arc * arc = it.get_current_arc();
        typename Net::Arc * img = (typename Net::Arc *) arc->img_arc;
        if (arc->cap - arc->flow < val)
          throw std::domain_error("minimum slack of decrementing path es smaller "
                                  "than val");
        arc->flow -= val;
        img->flow += val;
        if (not arc->is_residual)
          {
            net.decrease_out_flow(get_src_node(arc), val);
            net.decrease_in_flow(net.get_tgt_node(arc), val);
          }
        else
          {
            net.increase_out_flow(get_tgt_node(arc), val);
            net.increase_in_flow(net.get_src_node(arc), val);
          }
      }
  }
Í× × Path ¼¾ º
  × ÑÔÓÖØ ÒØ Ñ Ò ÓÒ Ö ÕÙ Ð ÖÙØ Ò ÒÓ Ú Ö ¬ ÕÙ × ØÖ Ø ×ØÖ Ø Ñ ÒØ ÙÒ Ñ ÒÓ
    ÙÑ ÒØÓº ×ØÓ Ó Ö Ð ÔÓ× Ð             Ò Ö Ñ ÒØ Ö Ð ­Ù Ó ÔÓÖ ÙÒ Ñ ÒÓ ÕÙ ÒÓ
Ò × Ö Ñ ÒØ Ô ÖØ × Ð Ù ÒØ Ý ÐÐ Ù Ð ×ÙÑ ÖÓº Ð Ñ ×ÑÓ ÑÓ Ó¸ Ð Ñ ÒÓ
ÔÙ × Ö ÙÒ ÐÓ¸ ÐÓ ÕÙ Ó Ö Ö ÒØ Ö × Ñ × Ð ÒØ Ù Ò Ó ×ØÙ ÑÓ× Ö ÙÐ ÓÒ ×
´Ü º½½º ´Ô Ò ½ µµ Ý ­Ù Ó× Ñ Ü ÑÓ× Óר Ñ Ò ÑÓ ´Ü º½¾ ´Ô Ò ¾ µµº
808                                                                   Cap´
                                                                         ıtulo 7. Grafos



7.11     Reducciones al problema del flujo m´ximo
                                           a
  Ò Ð × ÓÒ Ô ×         ×ØÙ ÑÓ× ÙÒ × Ö      Ð ÓÖ ØÑÓ× Ý ×ØÖÙ ØÙÖ      ØÓ× Ø Ò ÒØ ×
  Ö ×ÓÐÚ Ö Ð ÔÖÓ Ð Ñ Ð ­Ù Ó Ñ Ü ÑÓº Ê ×ÙÐØ ÕÙ ×Ø ÔÖÓ Ð Ñ ¸ ÕÙ Ö ÑÓ× ÒÓ ÒÓ×
 Ù ÑÙÝ × ÑÔÐ Ö ×ÓÐÚ Ö¸ × ÙÒ Ñ ÒØÓ ÑÓ Ð Þ ÓÒ ÒרÖÙÑ ÒØÓ ×ÓÐÙ ÓÒ
ÙÒ Ú ×Ø ÒØ             ÔÖÓ Ð Ñ × Ñ ×º Ò ×Ø × ÓÒ Ñ Ò ÓÒ Ö ÑÓ× Ð ÙÒ × × ØÙ ÓÒ ×
   Ð ÑÙÒ Ó Ø ÒÓÐÓ Ó Ò ÕÙ Ð ­Ù Ó Ñ Ü ÑÓ × ÔÐ Ð ¸ ÒÙÒ Ö ÑÓ× Ú Ö ÒØ ×
ÔÖÓ Ð Ñ × Ö Ù Ð × Ð ­Ù Ó Ñ Ü ÑÓ Ý ×ØÙ Ö ÑÓ× ÓÒ Ð ÙÒ Ö Ó               Ø ÐÐ Ð ÙÒÓ×
     ÐÐÓ׺
     Ä Ð Ø Ö ØÙÖ Ñ Ò ÓÒ ÓÑÓ ÔÖ Ñ Ö Ú Ö ÒØ Ð Ñ Ò Ó Ú Ö Ó× Ù ÒØ × Ý ×ÙÑ ¹
   ÖÓ׺ ר ÔÖÓ Ð Ñ Ù ×ØÙ Ó Ý Ö ×Ù ÐØÓ Ò Ü º½¼º¿ ´Ô Ò                µº Ò Ù Ð ×
 ÓÒØ ÜØÓ× ÔÙ      Ô Ö Ö Ò ÐÓ× ÓÒØ ÜØÓ× ÙÐØÙÖ Ð ×¸ ÔÓÖ ÖÐÓ        Ð ÙÒ Ñ Ò Ö ¸ ×
ÑÙÝ ÔÖÓ Ð ÕÙ Ð Ö Ø Ò Ú Ö Ó× Ù ÒØ × Ý ×ÙÑ ÖÓ× × ÕÙ ÔÓÖ ×Ø Ú ÒÓ× Ö ×Ùй
Ø Ò ÔÖ Ø × Ð × ÔÖ Ñ Ø Ú × make super nodes() Ý unmake super nodes() ÔÖ × ÒØ × Ò
Ü º½¼º¿ ´Ô Ò        µº

7.11.1   Flujo m´ximo en redes no-dirigidas
                a
Ä           ÙÒ Ð ÕÙ Ó ÕÙ ­ÙÝ ÔÓÖ ÙÒ Ö          ØÙ Ö × ÒÓ ×ÙÑ Ð × ÒØ Óº           Ó¸
ÔÓÖ ÙÒ ØÙ Ó ÔÙ        Ö ÙÐ Ö ­Ù Ó Ò Ù ÐÕÙ Ö × ÒØ Óº × Ô٠׸ ר ÒØÖÓ Ð ×
 ÜÔ Ø Ø Ú × Ð ÑÙÒ Ó Ø ÒÓÐÓ Ó Ò ÓÒØÖ Ö × ØÙ ÓÒ × Ò Ð × Ù Ð × × × Ñ Ü Ñ Þ Ö
 Ð ­Ù Ó Ý ÓÒÓ Ö ×Ù× ØÙ Ö × Ö Ø × Ó × ¸ Ð ÓÖØ Ñ Ò ÑÓº Ò × ØÙ ÓÒ × ×Ø Ø ÔÓ¸
Ø Ò Ö ÑÓ× Ö Ó× ÔÓÖ ÐÓ× Ù Ð × × Ô ÖÑ × Ð Ð ­Ù Ó Ò Ñ Ó× × ÒØ Ó׺
    ÍÒ Ö ÒÓ¹ Ö         G =< V, E, C >¸ ÓÒ Ô ×Ó× ÒØ ÖÔÖ Ø Ð × ÓÑÓ Ô         ׸ Ø Ò
ÙÒ ÕÙ Ú Ð ÒØ Ö Ó Ö ØÓ < V, E , C > ÔÓÖ                  Ö Ó (u, v) = e ∈ E Ô
   Ô(e) Ü ×Ø Ò Ó× Ö Ó× eu = (u, v) ∈ E Ý ev = (v, u) ∈ E Ñ Ó× ÓÒ Ô         Ô(eu) =
   Ô(ev) = Ô(e)º

           B           D                                  B           D


   A                           F      s        A                               F       t


           C           E                                  C            E

         ´ µ Ê ÒÓ¹ Ö                      ´ µ ÕÙ Ú Ð ÒØ       Ö   Ó ÓÒ Ù ÒØ Ý ×ÙÑ ÖÓ

               ÙÖ º        ÕÙ Ú Ð Ò   ÒØÖ ÙÒ Ö ÒÓ¹ Ö                Ý ÙÒ Ö º

    ÍÒ ØÓ Ô Ö ÒØ        Ð ØÖ Ò× ÓÖÑ ÓÒ ÒØ Ö ÓÖ × ÕÙ Ð Ö ÒÓ Ø Ò Ò Ù ÒØ
Ò ×ÙÑ ÖÓº Ò ÙÒ Ö        ØÙ Ö × ×Ø ÔÓ Ö Ô Ö Ö × Ö Ð ×Óº ÈÓÖ ÑÔÐÓ¸ ÓÒ× ¹
  Ö ÑÓ× ÙÒ × ×Ø Ñ   Ö Ö Ö ÓÒ Ò Ð Ù Ð × Ñ Ò ×Ø Ö Ñ Ü Ñ Þ Ö Ð ­Ù Ó Ð ÕÙ Ó
Ö Ö Ö ÒØ ÙÒ × ×Ø Ñ      Ö ÓÒ ÓÒ Ó Ó         Ð    ÓÒ ÔÓÖ Ø Ö Ó ÙÖÖ Ò × Ô Ö¹
Ø ÙÐ Ö ×º Ò ØÓ Ð × × ×Ø Ñ × ­Ù Ó × Ö ÕÙ Ö ÓÑ Ö Ð ­Ù Ó × Ð Ñ ÒÓ×
ÙÒ ØÙ Ó Ò Ð Ô Ö ÕÙ Ð ­Ù Ó × ÓÒØ ÒÙÓ¸ × Ö ÕÙ Ö ÖÖ Ö Ð Ð ÞÓ           ÓÑ Óº
  Ô Ö Ò Ô٠׸ Ð Ù ÒØ Ý Ð ×ÙÑ ÖÓº Ä ¬ ÙÖ º ÐÙ×ØÖ ÙÒ Ö ÒÓ¹ Ö            Ý ×Ù
 ÕÙ Ú Ð ÒØ Ò Ö    Ô Ø     ÓÒ ÙÒ Ù ÒØ s × ÓÒ × ÒÚ Ö ÙÒ ­Ù Ó Ò Ð¸ Ý
7.11. Reducciones al problema del flujo m´ximo
                                        a                                                                                  809



ÙÒ ×ÙÑ ÖÓ ÔÓÖ ÓÒ × Ö Ó Ö Ð ­Ù Ó Ô Ö ÓÑ ÖÐÓ ÒÙ ÚÓº Ð ÐÓ× Ú ÐÓÖ ×
  Ô       × ÐÓ× Ö Ó× × Ð Ù ÒØ Ý              Ð ×ÙÑ ÖÓ        Ò ÓÖÖ ×ÔÓÒ Ö× ÓÒ Ð
  Ô           ­Ù Ó ×ÔÓÒ Ð Ð Ù Ð ÔÙ × Ö Ñ ÝÓÖ ÕÙ Ð Ú ÐÓÖ ­Ù Ó Ñ Ü ÑÓ ÕÙ
ÔÙ      Ö ÙÐ Ö ÔÓÖ Ð Ö º
    Ä Ú Ð ÞÑ Ø Ñ Ø         Ð ÕÙ Ú Ð ÒØ × Ð        ÑÓ×ØÖ Öº Ù ÐÕÙ Ö ­Ù Ó Ö ÙÐ ÒØ
ÔÓÖ Ð Ö ÒÓ¹ Ö         ÔÙ Ô Ö Ø Ñ ÒØ Ö ÙÐ Ö ÔÓÖ Ð Ö ÕÙ Ú Ð ÒØ Ò × ×Ó
ÙÒÓ ÐÓ× Ó× Ö Ó× Ò Ð Ö           Ö     Ø Ò Ú ÐÓÖ ­Ù Ó ÖÓº ÚÓÐÚ Ö×            Ð Ö
 Ð Ö Ó ÒÓ × ÔÖÓ Ð Ñ Ø Óº ËÙÔÓÒ ÑÓ× Ù ÐÕÙ Ö Ô Ö            Ö Ó× u → v Ý v → u ÓÒ
Ú ÐÓÖ × ­Ù Ó f(u → v) Ý f(v → u)¸ Ö ×Ô Ø Ú Ñ ÒØ º Ë f(u → v) > f(v → u) ÒØÓÒ ×
f(u ↔ v) = f(u → v) − f(v → u) Ý Ð ­Ù Ó Ú Ò Ð × ÒØ Ó u → v             ÐÓ ÓÒØÖ Ö Ó¸
f(u ↔ v) = f(v → u) − f(u → v) Ý Ð ­Ù Ó Ú Ò Ð × ÒØ Ó v → uº
    ÈÙ ×ØÓ ÕÙ ×Ø × Ö Ù ÓÒ × ×ÓÒ Ö Ð Þ Ð × Ñ ÒØ Ð × ÒØ Ö × ÐÓ× Ì
List Graph<Node, Arc> Ý Net Graph<TNode,TArc,T>¸ ר × ×ÓÒ Ð             × Ò Ö ¹
  Ó׺
7.11.2           Capacidades en nodos
ÍÒ × ØÙ ÓÒ Ø ÒÓÐÓ Ñ ÒØ ×Ô Ö Ð ¸ Ô ÖÓ Ø Ñ Ò¸ ÙØ Ð Ô Ö Ð ÙÒ × × ØÙ ÓÒ ×
   ÑÓ Ð Þ ÓÒ¸ × Ð ÓÒ× Ö Ö Ô       × Ò ÐÓ× ÒÓ Ó׺ Ò ×Ø ×Ó¸ ÙÒ Ú ÐÓÖ
  Ô       ÒÓ Ó Ò ÙÒ ­Ù Ó Ñ Ü ÑÓ ÕÙ ×Ø ÔÙ Ö Öº Ä ¬ ÙÖ º ¹ ÑÙ ×ØÖ
ÙÒ ÑÔÐÓº
                                                                          B‘       4 B“       3         E‘   4 E“

                                                                     3                  4                              5
                              3                                                                     2
                 B,4                    E,4
                                              5             A‘     8 A“        3     D‘      3 D“                   G‘     6 G“
             3          4                                                                                     4
                                    2
     A,8           3          D,3         4        G,6                                              1
                                                                                    2
                        2           1                                5                                                 2
            5                                  2
                 C,3          4         F,5                               C‘       3 C“       4         F‘   5    F“

      ´ µÊ        ÓÒ Ô              × Ò ÐÓ× ÒÓ Ó×                          ´ µÊ             Ô Ø         ÕÙ Ú Ð ÒØ

     ÙÖ º                   ÑÔÐÓ        ÙÒ Ö        ÓÒ Ô             Ò ÐÓ× ÒÓ Ó× Ý ×Ù ÕÙ Ú Ð ÒØ                        ÙÒ Ö
ØÖ     ÓÒ Ðº
    ÍÒ Ö ÓÒ Ô                           × Ò ÐÓ× ÒÓ Ó× ÔÙ          ØÖ Ò× ÓÖÑ × ÙÒ Ö ØÖ                        ÓÒ Ð Ñ        ÒØ
 Ð Ñ ØÓ Ó × Ù ÒØ
Algoritmo 7.7 Conversi´n de una red con capacidades en los nodos a una red
                      o
tradicional
   Ä ÒØÖ     × ÙÒ Ö → =< V, E, → s, t > ÓÒ Ô
                     −
                     G         C,
                               −
                                                        × Ò ÐÓ× ÒÓ Ó׺
   Ä × Ð × ÙÒ Ö ØÖ ÓÒ Ð N      G =< V , E , C , s, t >º


     ½º    ∀u ∈ V      Ô ÖØ ÓÒ Ò Ó× ÒÓ Ó× u Ý u | u , u ∈ V º
           ÈÓÖ          Ô ÖØ ÓÒ¸ Ò    E ÙÒ Ö Ó u → u ∈ E ÓÒ Ô                                                Ô(u    →u )=
             Ô(u)º
     ¾º    ∀e = (u → v) ∈ E         × ÓÖÖ ×ÔÓÒ           ÓÒ e    = (u → v ) ∈ E º
810                                                                         Cap´
                                                                               ıtulo 7. Grafos



   Ä ¬ ÙÖ º ¹ ÑÙ ×ØÖ Ð ÕÙ Ú Ð ÒØ × ÙÒ Ð Ñ ØÓ Ó Ð Ö      Ð ¬ ÙÖ º ¹ º
   Ä       Ð ÓØ    ÓÒØ Ò ÙÒ ÑÔÐ Ñ ÒØ ÓÒ          ר ×ÕÙ Ñ ÐÐ Ñ ¸
Net Cap Graph<TNode,TArc,T>¸ ÓÒØ Ò Ò Ð Ö ÚÓ tpl netcapgrah.Hº
7.11.3    Flujo realizable
  Ò Ð ÙÒ × Ö ÙÒר Ò × × Ö ÕÙ Ö Ò ÔÖÓÚ × ÓÒ × ­Ù Ó × Ö¸ Ð ÙÒÓ× ÒÓ Ó× Ð
Ö Ö ÕÙ Ö Ò Ö Ö ÙÒ ÒØ              ×Ô ¬        ­Ù Óº × ÔÓ× Ð ¸ Ø Ñ Ò¸ ÕÙ ÓØÖÓ× ÒÓ Ó×
ÔÖÓÚ Ò ­Ù Óº ËÙÔÓÒ ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ ÙÒ Ö ØÖ Ò×ÔÓÖØ Ý Ð Ö Ð Þ ÓÒ                   Ú ÒØÓ
 Ü Ô ÓÒ Ð¸ Ø Ð ÓÑÓ ÙÒÓ× Ù Ó× ÔÓÖØ ÚÓ׸ ÕÙ Ñ Ð × Ñ Ò ×º ÓÑÓ Ð Ö Ú Ð
× Ù × Ò Ó Ð Ñ ×Ñ ¸ Ð ØÓÔÓÐÓ           Ð Ö ÒÓ Ñ ¸ Ô ÖÓ Ð ÒØ Ö ×            × ×Ø Ò Ý
  ×Ô Ö× ÓÒ Ó Ö ¬         ÐÓ× ÐÙ Ö × Ð × ÓÑÔ Ø ÓÒ × ØÖ Ò× ÓÖÑ Ð × Ñ Ò ×º Ò
× ØÙ ÓÒ ×        ר Ø ÔÓ¸ ×Ù Ð ÙÑ ÒØ Ö× Ð Ô                ØÖ Ò×ÔÓÖØ ØÖ Ý Ò Ó Ù× ×
     ÓÒ Ð ×¸ Ô Ö ÒÙ ×ØÖ × ØÙ ÓÒ ÑÔÐÓº
    Ë ØÙ ÓÒ × ÓÑÓ Ð ÕÙ            ÑÓ×       × Ö Ö ÔÙ Ò ÑÓ Ð Þ Ö× ÓÐÓ Ò Ó ×Ó Ö
ÐÓ× ÒÓ Ó× Ú ÐÓÖ ×      Ñ Ò Ý ÔÖÓÚ × ÓÒº ÍÒ Ú ÐÓÖ ÔÓ× Ø ÚÓ Ò ÕÙ Ð ÒÓ Ó ÔÙ
×ÙÔÐ Ö Ò ­Ù Ó Ð Ú ÐÓÖ Ò Ù ×Ø ÓÒ ÙÒ Ú ÐÓÖ Ò Ø ÚÓ × Ò ¬ ÙÒ Ñ Ò                    ­Ù Ó
 × Ö¸ Ò Ð ÒÓ Ó Ò Ù ×Ø ÓÒ × Ö ÕÙ Ö Ö Ö Ð ­Ù Ó Ñ Ò Óº ר Ð × Ö
× Ð ÒÓÑ Ò Ö            Ô Ø      ÓÒ ÔÖÓÚ × ÓÒ ­Ù Ó º

                                                                                             4   5
                                                                                 8
                                                                    8           10
           B,-8    F,8     K,8                              B               F            K
                                                    20
  A,20     C,-6   E,10     L,4      P,-19       A           C               E            L           P

                                                                                                         19
           D,-4    G,-8    M,5                              D               G            M
                                               8                        6            8
                                                                4



         ´ µÊ      Ñ Ò »ÔÖÓÚ × ÓÒ                    ´ µÊ           Ô Ø         ÕÙ Ú Ð ÒØ

    ÙÖ º     ÑÔÐÓ ÕÙ Ú Ð Ò ÒØÖ Ö            Ñ Ò »ÔÖÓÚ × ÓÒ Ý ÙÒ Ö Ô ¹
Ø º Ë ÓÑ Ø Ò Ð × Ô     × ÐÓ× Ö Ó× Ò Ð Ö ÓÖ Ò Ð Ý Ò Ð ÕÙ Ú Ð ÒØ ר
ÙÐØ Ñ ÑÙ ×ØÖ Ô     × ÕÙ Ú Ð ÒØ × ÔÖÓÚ × ÓÒ ×º
    ÅÓ ÐÓ×       ר Ð × ÒÓ ×ÓÒ Ô Ö Ò      Ü Ô ÓÒ Ð ×º Ò ×Ø × Ö ÙÒר Ò × Ð
ÔÖ ÙÒØ       ÒØ Ö × × Ú Ö Ù Ö × × ÔÙ Ó ÒÓ × Ø × Ö Ð × Ñ Ò × Ò ÙÒ ÓÒ
Ð × ÔÓ× Ð      × ÔÖÓÚ × ÓÒº ÍÒ Ö ×ÔÙ ×Ø Ò Ø Ú ¸ ÑÓ×ØÖ Ø Ú ¸ Ò Ö ÕÙ Ý ÕÙ
 Ò ÓÒØÖ Ö Ñ × ÔÖÓÚ × ÓÒ¸ Ñ ÒØÖ × ÕÙ ÙÒ ¬ÖÑ Ø Ú ÕÙ ÓÒ Ð ÔÖÓÚ × ÓÒ Ò Ö ×ØÖÙ ØÙÖ
     × × ÔÙ Ò × Ø × Ö Ð × Ñ Ò ×º Ë Ð Ö ×ÔÙ ×Ø × ¬ÖÑ Ø Ú ¸ ÒØÓÒ × ÑÓ×
ÕÙ Ü ×Ø ÙÒ ­Ù Ó Ö Ð Þ Ð ¸ ÔÙ × ØÓ Ó× ÐÓ× ÒÓ Ó×    Ñ Ò ÔÙ Ò Ó Ø Ò Ö ×Ù ­Ù Ó
Ö ÕÙ Ö Ó ÐÓ ÓÒØÖ Ö Ó¸ ÑÓ× ÕÙ Ð ­Ù Ó × ÖÖ Ð Þ Ð Ó ÕÙ ÒÓ Ü ×Ø Ð Ö Ð Þ Ð º
       ÓÑÓ × Ö × Ü ×Ø ÙÒ ­Ù Ó Ö Ð Þ Ð Ë Ò ×ÓÖÔÖ × ¸ Ð Ö ×ÔÙ ×Ø ÒÓ× Ð          Ð
7.11. Reducciones al problema del flujo m´ximo
                                        a                                     811



   Ð ÙÐÓ Ð ­Ù Ó Ñ Ü ÑÓ ×Ó Ö ÙÒ Ö ÕÙ Ú Ð ÒØ º Ò ÔÖ Ò Ô Ó¸ ÔÓ ÑÓ× Ð ÙÐ Ö Ð
­Ù Ó Ñ Ü ÑÓ Ý ÐÙ Ó Ú Ö ¬ Ö × ×Ø × Ø × Ð × ÔÖÓÚ × ÓÒ ×           ׺ Ë Ò Ñ Ö Ó¸ ×
 Ò ÓÒØÖ ÑÓ× ÒÓ Ó× ÓÒ ÐÐ × ÔÖÓÚ × ÓÒ ×¸ Ô ÖØ ÙÐ ÖÑ ÒØ Ò Ñ Ò ×¸ ÒÓ ÔÓ ÑÓ×
 ÓÒ ÐÙ Ö ÕÙ ÒÓ Ü ×Ø ÓØÖÓ ­Ù Ó Ñ ÒÓÖ ÕÙ × Ö Ð Þ Ð º Ä ×ÓÐÙ ÓÒ × ØÖ Ò× ÓÖÑ Ö Ð
Ö ÙÒ ÕÙ Ú Ð ÒØ Ý ×Ó Ö ÐÐ Ð ÙÐ Ö Ð ­Ù Ó Ñ Ü ÑÓº
     ÍÒ Ö      Ô Ø      ÓÒ ÔÖÓÚ × ÓÒ ­Ù Ó Ø Ò ÙÒ ÕÙ Ú Ð ÒØ Ò ÙÒ Ö        Ô Ø º
Ä ÕÙ Ú Ð Ò ÓÒ× ×Ø Ò Ò Ö ÙÒ ×ÙÔÖ ¹ Ù ÒØ Ý ÙÒ ×ÙÔÖ ¹×ÙÑ ÖÓº × Ð ×ÙÔÖ ¹
 Ù ÒØ Ñ Ò Ò Ö Ó×          ÐÓ× ÒÓ Ó× ÔÖÓÚ ÓÖ × ÓÒ Ô          Ù Ð Ð Ú ÐÓÖ ÔÖÓÚ × ÓÒº
À       Ð ×ÙÔÖ ¹×ÙÑ ÖÓ Ò Ò Ö Ó× × ÐÓ× ÒÓ Ó× Ñ Ò ÒØ × ÓÒ Ô                      ÙÐ
 Ð ­Ù Ó Ñ Ò Óº Ò Ð Ö ÕÙ Ú Ð ÒØ ÒÓ × Ò × Ö Ó ÓÐÓ Ö Ú ÐÓÖ × ÔÖÓÚ × ÓÒ¸
ÔÙ × ×ØÓ× ×Ø Ò ÜÔÖ × Ó× Ò Ð × Ô              × ÐÓ× Ö Ó× ÒØÖ ×ÙÔÖ ¹ Ù ÒØ Ý Ð ×ÙÔÖ ¹
×ÙÑ ÖÓ¸ Ö ×Ô Ø Ú Ñ ÒØ º
     ÍÒ Ö ÓÒ ÔÖÓÚ × ÓÒ ­Ù Ó × Ö Ð Þ Ð × Ð ­Ù Ó Ñ Ü ÑÓ Ð Ö ÕÙ Ú Ð ÒØ
ÐÓ Ö ÐÐ Ò Ö ØÓ Ó× ÐÓ× Ö Ó× Ò Ó× × Ö¸ ÐÓ× ÕÙ Ñ Ò Ò × Ð ×ÙÔÖ ¹ Ù ÒØ Ý ÐÓ
ÕÙ ÐÐ Ò Ð ×ÙÔÖ ¹×ÙÑ ÖÓº Ò Ð ÙÒÓ× ×Ó׸ × ÔÓ× Ð × Ö ÕÙ Ð ­Ù Ó × ÖÖ Ð Þ Ð
× Ð Ô            × Ð ÒØ Ð ×ÙÔÖ ¹ Ù ÒØ × ×Ø ÒØ Ð ÒØÖ ÒØ ÔÓÖ Ð ×ÙÔÖ ¹×ÙÑ ÖÓº
  ×ØÓ ×       Ó Ð ÓÒ ÓÒ            ÓÒ× ÖÚ ÓÒ Ð ­Ù Ó Ý × Ð ×Ó Ô Ö Ð Ö         ÑÔÐÓ
    Ð ¬ ÙÖ º ¹ ¸ Р٠и Ô Ö Ð Ö ÕÙ Ú Ð ÒØ Ð ¬ ÙÖ º ¹ Ø Ò ÙÒ Ô
× Ð ÒØ Ð ×ÙÔÖ ¹ Ù ÒØ 55 Ñ ÒØÖ × ÕÙ Ð ÒØÖ ÒØ Ð ×ÙÔÖ ¹×ÙÑ ÖÓ × 45º ר
 ÓÒÓ Ñ ÒØÓ × Ú × Ð × Ð Ö ÓÖ Ò Ð¸ Ò Ð × ÒØ Ó ÕÙ Ô Ö ÕÙ Ð ­Ù Ó ×
Ö Ð Þ Ð ¸ Ð ØÓØ Ð ÔÖÓÚ × ÓÒ Ø Ò ÕÙ × Ö Ñ ÝÓÖ Ó Ù Ð Ð Ñ Ò ¸ Ô ÖÓ ÐÓ ÓÒØÖ Ö Ó
ÒÓ Ò × Ö Ñ ÒØ × ÖØÓ ÔÓÖ ×Ó¸ × Ð ÔÖÓÚ × ÓÒ × Ñ ÝÓÖ Ó Ù Ð Ð Ñ Ò ×
Ò × Ö Ó Ð ÙÐ Ö Ð ­Ù Ó Ñ Ü ÑÓ ×Ó Ö Ð Ö ÕÙ Ú Ð ÒØ Ô Ö Ö ×ÔÓÒ Ö × Ð ­Ù Ó × Ó
ÒÓ Ö Ð Þ Ð º
      Ò ÙÒ × ØÙ ÓÒ ­Ù Ó ÖÖ Ð Þ Ð ¸ Ð ÓÖØ Ñ Ò ÑÓ ÒÓ× ÒØ ¬ ÓØÖÓ× ÔÙÒØÓ× ÔÓÖ
  ÓÒ ÔÙ        ÙÑ ÒØ Ö× Ð ÔÖÓÚ × ÓÒ Ó¸ Ò ×Ù ÑÔÓ× Ð ¸ Ö Ù Ö× Ó Ö Ö ÓÒ Ö×
Ð ÑÒ º
       Ø ÒÓÖ Ð ­Ù Ó Ö Ð Þ Ð ¸ Ò Ð        Ð ÓØ × ÒרÖÙÑ ÒØ Ð Net Sup Dem Node¸ ×¹
Ô ¬ Ó Ò Ð Ö ÚÓ tpl net sup dem.Hº Ë Ò Ñ Ö Ó¸ ÑÙ × Ú × × ÔÖ Ö Ð
 ÔÐ Ö Ð Ø Ò Ò Ð ÓÒØ ÜØÓ Ð ÔÖÓ Ð Ñ ¸ Ò ÐÙ Ö ÑÔÐ Ö ×Ø Ì º
7.11.4   M´ximo emparejamiento bipartido
          a
  ÓÒ× Ö ÑÓ× n Ô Ö×ÓÒ × Ý n Ø ÔÓ× ØÖ Ó׺ È Ö            Ô Ö×ÓÒ ¸ × Ø Ò ÙÒ Ð ×Ø
   ÔÓ× Ð × ØÖ Ó× Ó¸ Ò ÐÓ Ñ ÒØ ¸ ÔÓÖ        ØÖ Ó × Ø Ò ÙÒ Ð ×Ø Ô Ö×ÓÒ × ÕÙ
ÔÙ Ò        ÖÐÓº Ü ×Ø ÙÒ × Ò ÓÒ Ô Ö×ÓÒ × ØÖ Ó× ÕÙ Ù Ö ØÓ Ó× ÐÓ×
ØÖ Ó× Ý Ô Ö×ÓÒ × Ë Ü ×Ø ¸ Ù Ð × × ÒÓ Ü ×Ø ¸ Ù Ð × Ð × Ò ÓÒ ÕÙ Ù Ö Ð
Ñ ÝÓÖ ÒØ          Ô Ö×ÓÒ × Ó ØÖ Ó×
     ר ÔÖÓ Ð Ñ ¸ ØÖ ÓÒ ÐÑ ÒØ ÓÒÓ Ó ÓÑÓ Ð             × Ò ÓÒ ¸ ÓÒר ØÙÝ Ð Ú ¹
Ö ÒØ Ñ × × ÑÔÐ ÙÒ Ñ Ð            ÔÖÓ Ð Ñ × Ñ × Ò Ö Ð ÕÙ ØÖ Ø Ö ÑÓ× Ñ × Ð ÒØ º
ÈÓÖ ÐÓ× ÑÓÑ ÒØÓ׸ × Ñ Ò ×Ø Ö ÒØÖÓ Ù Ö Ð ÙÒ × ¬Ò ÓÒ × ÓÖÑ Ð ×º
Definici´n 7.21 (Emparejamiento)
       o                               Ó ÙÒ Ö Ó G =< V, E >¸ ÙÒ ÑÔ Ö Ñ ÒØÓ
× ÙÒ ×Ù ÓÒ ÙÒØÓ   Ö Ó× M ⊂ E Ø Ð    ÕÙ ÒÓ Ü ×Ø Ò Ó× Ö Ó× Ò M ÕÙ Ò Ò ×Ó Ö
ÙÒ ÒÓ Ó ÓÑÙÒº
   ÍÒ emparejamiento    es de cardinalidad m´xima
                                            a         ×   |M|   × Ñ Ü ÑÓ ×    Ö¸ ×
Ò ÐÙÝ Ð Ñ ÝÓÖ ÒØ            Ö Ó׺
812                                                                               Cap´
                                                                                     ıtulo 7. Grafos


       -6              0           -4            0              -6           0           -4           0
        D      6/0     E    8/0     I   4/0      K               D   6/6     E    8/4     I   4/4     K



      6/6      3/3   4/0    5/3   3/0   4/0    3/0   4/0       6/6   3/3   4/0    5/5   3/0   4/0   3/0   4/4

 0               0           -5           0          -15   0           0           -5           0         -15
 A    7/1        B   1/1      F   1/0     H    5/0     M   A   7/1     B   1/1      F   1/1     H   5/3     M



      5/3      5/0   3/3    5/2   7/0   6/0    4/0   6/0       5/3   5/0   3/3    5/0   7/2   6/6   4/2   6/6

        0             -4            0           -3               0          -4            0          -3
        C              G            J   5/0      L               C           G            J   5/2     L
               4/0          6/0                                      4/0          6/0

            ´ µ ÐÙ Ó Ñ Ü ÑÓ ×Ó Ö Ö      ÜØ Ò                               ´ µ ÐÙ Ó Ñ Ü ÑÓ
       -6              0           -4            0              -6           0           -4           0
        D      6/3     E    8/7     I   4/3      K               D   6/6     E    8/4     I   4/4     K



      9/9      9/9   4/0    5/5   3/0   4/0    3/0   4/3       9/6   9/5   4/2    5/5   3/0   4/0   3/0   4/4

 0               0           -5           0          -15   0           0           -5           0         -15
 A    7/7        B   8/7      F   1/0     H    5/0     M   A   7/3     B   8/4      F   1/1     H   5/5     M



      5/3      5/0   11/5   5/5   7/1   6/6    4/0   6/3       5/1   5/1   11/6   5/4   7/5   6/5   4/4   6/6

        0             -4            0           -3               0          -4            0          -3
        C              G            J   5/0      L               C           G            J   5/5     L
               4/2          6/1                                      4/4          6/0

            ´ µ ÐÙ Ó Ñ Ü ÑÓ ×Ó Ö Ö      ÜØ Ò                               ´ µ ÐÙ Ó Ñ Ü ÑÓ

    ÙÖ º      Ó× ÑÔÐÓ× ­Ù Ó Ö Ð Þ Ð ×Ó Ö Ñ Ò ×º Ä ¬ ÙÖ ´ µ ÑÙ ×ØÖ ÙÒ
­Ù Ó Ñ Ü ÑÓ ÓÒ ÓÖØ Ñ Ò ÑÓ ×Ó Ö Ð Ö ÜØ Ò        ÕÙ ÒÓ × Ø × Ð × ÔÖÓÚ × ÓÒ ×
ÐÙ Ó Ò Ð ¬ ÙÖ ´ µ¸ Ð ­Ù Ó Ñ Ü ÑÓ Ð Ö ÕÙ ÑÙ ×ØÖ ÙÒ ­Ù Ó Ñ Ü ÑÓ Ò× Ø × ØÓÖ Óº
   Ð Ò Ð × × Ð ÓÖØ Ñ Ò ÑÓ¸ × Ò Ö Ñ ÒØ Ò Ô       × Ò ÐÓ× Ö Ó× Ð ÓÖØ ¸ ÐÓ ÕÙ
 ÓÒ Ù ÙÒ ­Ù Ó Ö Ð Þ Ð ¸ Ø ÒØÓ Ò Ð Ö ÜØ Ò       ÑÓ×ØÖ     Ò Ð ¬ ÙÖ ´ µ¸ ÓÑÓ
 Ò Ð Ö × ÑÔÐ ÑÓ×ØÖ      Ò Ð ¬ ÙÖ ´ µº

    ÍÒ emparejamiento es bipartido × Ð Ö Ó × Ô ÖØ Óº
    ÍÒ emparejamiento es perfecto × × Ò ÐÙÝ ØÓ Ó× ÐÓ× ÒÓ Ó× Ð Ö Óº
      Ù Ò Ó Ø Ò ÑÓ× ÙÒ Ö Ó ÓÒ Ô ×Ó׸ ÙÒ emparejamiento es m´ximo × Ð ×ÙÑ
                                                           a
ÐÓ× Ô ×Ó× ÐÓ× Ö Ó× M × Ñ Ü Ñ º Ë Ñ ØÖ Ñ ÒØ ¸ es m´   ınimo × Ð ×ÙÑ × Ñ Ò Ñ º


      × Ò Ö n Ô Ö×ÓÒ × n ØÖ Ó× ÔÙ Ö ×ÓÐÚ Ö× Ñ ÒØ ÙÒ Ö Ó Ô ÖØ Ó ÕÙ
ÑÓ Ð Ð × Ö Ð ÓÒ × ÒØÖ Ð × Ô Ö×ÓÒ × Ý ÐÓ× ÔÓ× Ð × ØÖ Ó× Ø Ð ÓÑÓ Ð ÑÓ×ØÖ Ó Ò
Ð ¬ ÙÖ º ¹ º Ð ÑÔ Ö Ñ ÒØÓ        Ö Ò Ð Ñ Ü Ñ ÒÓ× ÔÖÓÔÓÖ ÓÒ Ð × Ò ÓÒ
ÕÙ Ñ × Ù Ö Ô Ö×ÓÒ × Ý ØÖ Ó׺
    ÈÙ ×ØÓ ÕÙ Ø Ö Ò Ñ ÒØ Ð ÔÖÓ Ð Ñ Ð × Ò ÓÒ¸ Ó × ¸ ÜÔÐÓÖ Ö ØÓ ×
Ð × ÓÑ Ò ÓÒ × ÔÓ× Ð × ÑÔ Ö Ñ ÒØÓ¸ Ú Ò ÒØÖ Ø Ð ¸ ÕÙ Þ ×Ø × Ð ÔÖ Ñ Ö
× ØÙ ÓÒ Ò Ð ÕÙ ÔÓ ÑÓ× ÔÖ Ö Ð ÔÓØ Ò Ð Ð Ø ÓÖ                Ö × ­Ù Ó Ò Ð
Ö ×ÓÐÙ ÓÒ ÔÖÓ Ð Ñ × ×Ó Ö Ö Ó׺
    ÍÒ Ö Ó Ô ÖØ Ó ×Ó Ö Ð Ù Ð × ÑÓ× Ò ÓÒØÖ Ö ÙÒ ÑÔ Ö Ñ ÒØÓ         Ö ÒÐ
Ñ Ü Ñ ÔÙ ÑÓ Ð Þ Ö× Ñ ÒØ ÙÒ Ö              ­Ù Óº ÖÓ××Ó ÑÓ Ó¸ Ð ÔÖÓ Ñ ÒØÓ ×
 Ð × Ù ÒØ
Algoritmo 7.8 (Transformaci´n de un grafo bipartido a una red de flujo)
                           o
7.11. Reducciones al problema del flujo m´ximo
                                        a                                813



                                                       L         R




                     ´ µ ÍÒ ÑÔ Ö Ñ ÒØÓ ÒÓ      ¹ ´ µ ÍÒ ÑÔ Ö Ñ ÒØÓ
                     Ô ÖØ Ó                        Ô ÖØ Ó

   ÙÖ º           ÑÔÐÓ×     ÑÔ Ö Ñ ÒØÓº ÄÓ× Ö Ó× Ð ÑÔ Ö Ñ ÒØÓ ×ÓÒ Ö × ÐØ Ó׺

    ÒØÖ    ÙÒ Ö Ó Ô ÖØ Ó G =< V, E > | V = L ∩ R ´L Ý R ×ÓÒ ÐÓ× ÓÒ ÙÒØÓ× Ð
 Ô ÖØ ÓÒµº
   ËÐ     ÙÒ Ö    Ô Ø → =< V , E , C, s, t > ÕÙ Ú Ð ÒØ ×Ó Ö Ð Ù Ð ÔÙ
                         −
                         G
 Ð ÙÐ Ö× ÙÒ ÑÔ Ö Ñ ÒØÓ     Ö ÒÐ       Ñ ÜÑ º
  ½º   V = V ∪ {s} ∪ {t}º

  ¾º   ∀e = (u, v) ∈ E =⇒ E = E ∪ {(u, v)} |    Ô(e) = 1º
  ¿º   ∀u ∈ L =⇒ E = E ∪ {(s, u)} |    Ô((s, u)) = 1º
   º   ∀u ∈ R =⇒ E = E ∪ {(u, t)} |    Ô((u, t)) = 1º




                   ÙÖ º      Ö Ó Ö      Ó ÕÙ Ú Ð ÒØ Ð       Ð ¬ ÙÖ º ¹

7.11.4.1    Flujo m´ximo y emparejamiento bipartido
                   a

Ä ØÖ Ò× ÓÖÑ ÓÒ ÒØ Ö ÓÖ ÒÓ× Ó Ö ÙÒ Ö     Ô Ø ¸ ÙÝÓ ­Ù Ó Ñ Ü ÑÓ ÒÓ× ÖÖÓ        ¸
 Ùר Ñ ÒØ ¸ ÙÒ Ö Ò Ð Ù Ð ×Ù× Ö Ó× × ØÙÖ Ó× ÓÒ ÓÖÑ Ò ÙÒ ÑÔ Ö Ñ ÒØÓ
  Ö ÒÐ       Ñ ÜÑ º
    ÌÓ Ó× ÐÓ× Ö Ó× Ð ØÖ Ò× ÓÖÑ ÓÒ Ø Ò Ò Ô        1º ÌÓ Ó ÒÓ Ó Ò L Ø Ò      ¹
Ô            ÒØÖ 1 Ý Ô            ×Ð   Ù Ð Ð ÒÙÑ ÖÓ     Ö Ó× ÕÙ × ÓÒ Ø     Ò
 ÓÒ Rº Ë Ñ ØÖ Ñ ÒØ ¸ ØÓ Ó ÒÓ Ó Ò R Ø Ò Ô            ÒØÖ     Ù Ð Ð ÒÙÑ ÖÓ
 Ö Ó×     ÒØÖ Ý Ô             × Ð 1º Ð Ö Ñ ÒØ ¸ Ð Ñ Ü ÑÓ ­Ù Ó      ר Ö      ×
814                                                             Cap´
                                                                   ıtulo 7. Grafos



  Ù Ð |L| = |R| Ó × ¸ Ð ÒÙÑ ÖÓ      Ö Ó× × Ð       Ð Ù ÒØ Ó Ð       ÒØÖ      Ð ×ÙÑ ¹
  ÖÓº ÍÒ Ñ ÒÓ           ÙÑ ÒØÓ Ù ÐÕÙ Ö ¸ ÙÝÓ ×Ð ÓÒ Ñ Ò ÑÓ × ÑÔÖ × 1¸ × Ù Ö
ÙÒ × Ò ÓÒ (u, v) | u ∈ L, v ∈ Rº Ù Ò Ó Ð Ñ ÒÓ             ÙÑ ÒØÓ × Ò Ö Ñ ÒØ ¸ ÐÓ×
ÒÓ Ó× u Ý v ÕÙ Ò Ò ÓÒ ÜÓ× Ò Ð Ö Ö × Ù Ðº Ð ÒÓ Ó u × Ò × Ð × Ð Ù ÒØ
s Ý t × Ò       × Ð × vº ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ù ÐÕÙ Ö ÔÖÓÜ ÑÓ Ñ ÒÓ                ÙÑ ÒØÓ
ÒÓ ÓÒØ Ò Ö Ò u Ò vº ÍÒ Ú Þ ÕÙ ÒÓ Ü ×Ø Ò Ñ × Ñ ÒÓ×                    ÙÑ ÒØÓ¸ Ð ­Ù Ó
 × Ñ Ü ÑÓ ´ÔÖÓÔÓ× ÓÒ Ü º½¼ ´Ô Ò ¿µµº ÈÙ ×ØÓ ÕÙ Ð ­Ù Ó × Ñ Ü ÑÓ Ý ÐÓ× Ö Ó×
Ø ÒÒ Ô            × ÙÒ Ø Ö ×¸ Ð ÒØ        Ö Ó× ÓÒ ­Ù Ó ÙÒ Ø Ö Ó ÕÙ Ú Ò × L
R × Ñ Ü Ñ º Ð ÑÔ Ö Ñ ÒØÓ               Ö ÒÐ     Ñ Ü Ñ ×Ø         Ó ÔÓÖ ÕÙ ÐÐÓ× Ö Ó×
 ÒØÖ L Ý R ÙÝÓ ­Ù Ó × ÙÒ Ø Ö Óº
7.11.4.2   An´lisis del emparejamiento bipartido por flujo m´ximo
             a                                             a

Ä ÙÖ ÓÒ Ð Ð ÙÐÓ Ð ÑÔ Ö Ñ ÒØÓ Ô ÖØ Ó × Ð ×ÙÑ                         ÙÖ ÓÒ × Ð Ð Ó¹
Ö ØÑÓ º ¸ ÐÙ Ó Ð Ñ Ü Ñ Þ ÓÒ Ð ­Ù Ó Ý¸ ¬Ò ÐÑ ÒØ ¸ Ð Ö ÓÒÓ Ñ ÒØÓ ÐÓ× Ö Ó× ÕÙ
Ô ÖØ Ò Ò Ð ÑÔ Ö Ñ ÒØÓº
      ÔÐ Ö Ð Ð ÓÖ ØÑÓ º ×Ó Ö ÙÒ Ö Ó Ô ÖØ Ó Ô Ö Ó Ø Ò Ö Ð Ö ÕÙ Ú Ð ÒØ ×Ó Ö Ð
 Ù Ð Ñ Ü Ñ Þ Ö Ð ­Ù Ó ØÓÑ O(E) Ô ×Ó× Ð Ñ ×Ñ ÓÑÔÐ             × Ö ÕÙ Ö Ô Ö Ö ÓÒÓ Ö
ÐÓ× Ö Ó× Ð ÑÔ Ö Ñ ÒØÓ ÐÙ Ó Ñ Ü Ñ Þ Ó Ð ­Ù Óº
      Ò Ù ÒØÓ Ð ÙÖ ÓÒ Ð Ñ Ü Ñ Þ ÓÒ ­Ù Ó¸                   ÑÓ× Ó × ÖÚ Ö ÕÙ Ð × ÙÖ ¹
  ÓÒ × ÐÓ× Ð ÓÖ ØÑÓ× ×ØÙ Ó× Ù ÖÓÒ Ù × Ô Ö ÐÓ× Ô ÓÖ × ×Ó׸ ÓÒ× Ö Ò Ó
ØÓÔÓÐÓ × Ö ØÖ Ö ×¸ ÐÓ Ù Ð ÒÓ × Ð × ØÙ ÓÒ ÙÒ Ö Ó Ô ÖØ Ó¸ Ò Ñ ÒÓ× ÙÒ Ð
Ð Ö ÕÙ Ú Ð ÒØ º
      ÓÒ× Ö ÑÓ× Ð Ð ÓÖ ØÑÓ         ÓÖ ¹ ÙÐ Ö×ÓÒ Ó      ÑÓÒ ×¹Ã ÖÔ ÙØ Ó ×Ó Ö Ð
Ö ÕÙ Ú Ð ÒØ ÙÒ Ö Ó Ô ÖØ Óº Ò Ò Ö Ð¸ Ð ÙÖ ÓÒ ×Ø                      ÔÓÖ NO(E)¸ ÓÒ
N ÓÒר ØÙÝ Ð       ÒØ           Ñ ÒÓ×      ÙÑ ÒØÓ Ð Ö Ö Ù º Ð Ö Ñ ÒØ ¸ Ò Ð
   ×Ó Ð Ö ØÖ Ò× ÓÖÑ ×Ó Ö Ð Ö Ó Ô ÖØ Ó¸ V Ö Ó× × ×ØÖ ÙÝ Ò ÒØÖ ÐÓ× Ö Ó×
    ×Ð       Ð Ù ÒØ Ý ÐÓ× ÒØÖ          Ð ×ÙÑ ÖÓº
     ÈÙ ×ØÓ ÕÙ Ð Ö ØÖ Ò× ÓÖÑ ×ÓÐÓ Ø Ò Ô               × ÙÒ Ø Ö ×¸ Ù ÐÕÙ Ö Ñ ÒÓ
 ÙÑ ÒØÓ Ý ×Ù Ò Ö Ñ ÒØÓ ÓÖØ ÙÒ Ö Ó × Ð             Ð Ù ÒØ Ý ÙÒÓ Ð ×ÙÑ ÖÓ ÕÙ Ð
 Ð ÓÖ ØÑÓ ÓÖ ¹ ÙÐ Ö×ÓÒ ÒÓ Ø Ò Ð ÔÖÓ Ð Ñ Ð ÒØ Ö                    Ð× Ô        ׺ ÈÓÖ
Ø ÒØÓ¸ Ð Ñ Ü Ñ ÒØ               Ñ ÒÓ× ÙÑ ÒØÓ × ÔÖ × ÒØ Ù Ò Ó Ð ÒØ                Ö Ó×
   × Ð Ù ÒØ Ý            Ð ×ÙÑ ÖÓ × Ñ Ü Ñ º Ì Ð ÒØ           × V/2º Å Ü Ñ Þ Ö Ð ­Ù Ó
    Ð Ö ØÖ Ò× ÓÖÑ ØÓÑ V O(E) = O(VE) Ô ×Ó×
                              2                         Ù ÓÒº
7.11.4.3   C´lculo de la bi-partici´n
            a                      o

Ë Ø Ò ÑÓ× ÙÒ Ö Ó G Ô ÖØ Ó¸ ÙÒ Ô ×Ó × Ò Ð Ô Ö Ð ÒרÖÙÑ ÒØ ÓÒ ÒÙ ×¹
ØÖÓ Ð ÓÖ ØÑÓ × Ð ÙÐ Ö Ð ¹Ô ÖØ ÓÒº ÓÑÓ ×Ø ÔÖÓ Ð Ñ ÔÙ Ú Ö× ÔÓÖ × Ô ¹
Ö Ó¸ ר Ñ Ö ÙÒ ØÖ Ø Ñ ÒØÓ Ò Ö Ð ÕÙ ÐÓ × ÖÖÓÐÐ Ö ÑÓ× Ò Ð Ö ÚÓ Ð
   Ð ÓØ tpl bipartite.H¸ Ð Ù Ð ÓÒØ Ò ÖÙØ Ò × ÙØ Ð Ø Ö × ÓÒ ÖÒ ÒØ × Ö Ó×
  Ô ÖØ Ó× ×Ô ¬ Ñ ÒØ Ð ÔÖÙ            ¹Ô ÖØ ÓÒ test bipartite() Ý ×Ù Ð ÙÐÓ
compute bipartite()º
    À Ý Ú Ö × Ñ Ò Ö × Ú Ö ¬ Ö Ð Ö Ø Ö Ô ÖØ Ó ÙÒ Ö Óº Ë ÙÒ Ö Ó × Ô Ö¹
Ø Ó¸ ÒØÓÒ × ×Ø ÒÓ Ø Ò Ò Ò ÙÒ ÐÓ ÐÓÒ ØÙ ÑÔ Öº È Ö ÑÓ×ØÖ ÖÐÓ ÓÒ× Ö ÑÓ×
ÙÒ ÐÓ ÐÓÒ ØÙ ÑÔ Öº Ð Ó × ÓÑÓ u1 → u2 → u3 → u4 → u5 → u1º Ë × Ù ÑÓ×
 Ð ÐÓ Ý ÐØ ÖÒ Ø Ú Ñ ÒØ × Ò ÑÓ× Ð × Ô ÖØ ÓÒ × ÔÓ ÑÓ×      Ö L = {u1, u3, u5}
7.11. Reducciones al problema del flujo m´ximo
                                            a                                    815



    R = {u2, u4}¸Ô ÖÓ Ð Ö Ó u5 → u1 ÖÓÑÔ Ð Ô ÖØ ÓÒº Á Ù Ð Ó ÙÖÖ × ÓÑ ÒÞ ÑÓ×
      × Ù ÐÕÙ Ö ÓØÖÓ ÒÓ Ó Ð ÐÓº Ë Ò Ö Ð Þ ÑÓ× ×Ø ÓÒØÖ ÑÔÐÓ Ô Ö Ù ÐÕÙ Ö
    ÐÓÒ ØÙ ÑÔ Ö ÒÓ× Ò ÓÒØÖ ÑÓ× ÓÒ Ð Ñ ×Ñ ÓÒØÖ        ÓÒº
        ÇØÖ ÓÖÑ ¸ Ñ ÒÓ× Ð Ö ¸ Ô ÖÓ ÓÑÔÙØ ÓÒ ÐÑ ÒØ Ñ × ¬ ÒØ ¸ × Ú Ö ¬ Ö × Ð
     Ö Ó × ¹ ÓÐÓÖ Ð × Ö¸ × ÔÙ Ô ÒØ Ö× ÓÒ ×ÓÐÓ Ó× ÓÐÓÖ × × Ò ÕÙ Ð Ñ ×ÑÓ
     ÓÐÓÖ ÓÐ Ò º ר Ñ Ò Ö Ú Ö ÒÓ× ÓÖÖ × Ò Ö ÙÒ Ð ÓÖ ØÑÓ × Ó Ò ÐÓ׸ Ð
    Ú Þ ÕÙ ÒÓ× ÝÙ      Ö Ø Ñ ÒØ ÓÒרÖÙ Ö ÐÓ× ÓÒ ÙÒØÓ× L Ý Rº Ð × Ù ÒØ Ð ÓÖ ØÑÓ
    ÙØ Ð Þ Ð ÓÐÓÖ Ó Ô Ö ÓÒרÖÙ Ö Ð Ô ÖØ ÓÒ
½    ÊÙØ Ò × Ô Ö Ö Ó× Ô ÖØ Ó× ½ ≡                               ½
      template <class GT> void compute_bipartite(GT &                            g,
                                                 DynDlist<typename GT::Node *> & l,
                                                 DynDlist<typename GT::Node *> & r)
      {
        DynDlist<typename GT::Node *> red, blue;
        typename GT::Node * p = g.get_first_node();
        color<GT>(p) = Bp_Red;
        red.put(p); l.put(p);
        while (true)
          if (not red.is_empty()) // ¿Hay rojo cuyos arcos no hayan sido mirados?
            {
              typename GT::Node * p = red.get();
              for (Node_Arc_Iterator<GT> it(p); it.has_current(); it.next())
                {
                  typename GT::Arc * a = it.get_current();
                  if (color<GT>(a) == Bp_Red)
                    throw std::domain_error("Graph is not bipartite");
                  else if (color<GT>(a) == Bp_Blue)
                    continue;
                  color<GT>(a) = Bp_Red;
                  typename GT::Node * q = it.get_tgt_node();
                  if (color<GT>(q) == Bp_Red)
                    throw std::domain_error("Graph is not bipartite");
                  else if (color<GT>(q) == Bp_Blue)
                    continue;
                  color<GT>(q) = Bp_Blue;
                  blue.put(q); r.put(q);
                }
            }
          else if (not blue.is_empty()) // ¿Hay azul cuyos arcos no hayan sido mirados?
            {
              typename GT::Node * p = blue.get();
              for (Node_Arc_Iterator<GT> it(p); it.has_current(); it.next())
                {
                  typename GT::Arc * a = it.get_current();
                  if (color<GT>(a) == Bp_Blue)
                    throw std::domain_error("Graph is not bipartite");
                  else if (color<GT>(a) == Bp_Red)
                    continue;
                  color<GT>(a) = Bp_Blue;
                  typename GT::Node * q = it.get_tgt_node();
816                                                             Cap´
                                                                       ıtulo 7. Grafos



                    if (color<GT>(q) == Bp_Blue)
                      throw std::domain_error("Graph is not bipartite");
                    else if (color<GT>(q) == Bp_Red)
                      continue;
                    color<GT>(q) = Bp_Red;
                    red.put(q); l.put(q);
                }
            }
          else
            break;
     }
    Í× × DynDlist ¿ Ò   Node Arc Iterator   º
    Ä ÖÙØ Ò ×Ô Ö Ð Ü Ô ÓÒ std::domain error × Ð Ö Ó ÒÓ × Ô ÖØ Óº Ë ÐÓ ×¸
     ÒØÓÒ × × Ö ØÓÖÒ Ò Ò Ð × Ð ×Ø × l Ý r ÐÓ× ÒÓ Ó× ÕÙ ÓÒ ÓÖÑ Ò Ð Ô ÖØ ÓÒº
    7.11.4.4   Construcci´n de la red bipartita
                         o

      ÓÒ ÐÓ× ÓÒ ÙÒØÓ× Ð Ô ÖØ ÓÒ¸ Ý Ø Ò ÑÓ× Ð Ô          Ô Ö Ð ÙÐ Ö ÙÒ Ö ÕÙ Ú ¹
    Ð ÒØ Ñ Ô        Ð Ö Óº ÄÐ Ñ ÑÓ× g Ð Ö Ó Ô ÖØ Ó Ý net Ð Ö ÙÜ Ð Ö ÕÙ × ÑÓ×
    ØÖ Ò× ÓÖÑ Ö¸ Ð Ù Ð × ×Ô ¬        Ð × Ù ÒØ Ñ Ò Ö
½      ÓÒרÖÙ Ö Ö ÕÙ Ú Ð ÒØ ½ ≡                            ´½ µ ½
     typedef Net_Graph<Net_Node<Empty_Class>, Net_Arc<Empty_Class> > Aux_Net;
     Aux_Net net;
        Ð Ð ÙÐÓ net × Ö Ð Þ ¸ ÒØÓÒ ×¸ Ð × Ù ÒØ ÑÓ Ó
½     ÓÒרÖÙ Ö Ö ÕÙ Ú Ð ÒØ ½ +≡                                ´½ µ    ½
         // recorrer nodos de g e insertar imagen en net
     for (Node_Iterator<GT> it(g); it.has_current(); it.next())
       {
         typename GT::Node * p = it.get_current();
         NODE_COOKIE(p) = net.insert_node();
         NODE_COOKIE((typename GT::Node *)NODE_COOKIE(p)) = p;
       }
     typename Aux_Net::Node * source = net.insert_node();
         // recorrer nodos de l, atarlos al fuente e insertar sus arcos dirigidos
     for (typename DynDlist<typename GT::Node*>::Iterator i(l); i.has_current(); i.next())
       {
         typename GT::Node * p = i.get_current();
         typename Aux_Net::Node * src = (typename Aux_Net::Node *) NODE_COOKIE(p);
         net.insert_arc(source, src, 1);
         for (Node_Arc_Iterator<GT> j(p); j.has_current(); j.next())
           {
             typename GT::Arc * arc = j.get_current_arc();
             typename Aux_Net::Node * tgt =
               (typename Aux_Net::Node *) NODE_COOKIE(g.get_tgt_node(arc));
             typename Aux_Net::Arc * a = net.insert_arc(src, tgt, 1);
             ARC_COOKIE(arc) = a;
             ARC_COOKIE(a) = arc;
           }
       }
     typename Aux_Net::Node * sink = net.insert_node();
7.11. Reducciones al problema del flujo m´ximo
                                            a                                    817



          // recorrer nodos de r y atarlos al sumidero
      for (typename DynDlist<typename GT::Node*>::Iterator it(r); it.has_current();
           it.next())
        {
          typename GT::Node * p = it.get_current();
          net.insert_arc((typename Aux_Net::Node*)NODE_COOKIE(p), sink, 1);
        }
    Í× × DynDlist ¿ ¸ Node Arc Iterator    ¸ Ò    Node Iterator   º

    7.11.4.5    Extracci´n del emparejamiento de la red maximizada
                        o

    Ë matching × Ð Ð ×Ø      Ö Ó× ÕÙ ÓÒ ÓÖÑ Ò Ð ÑÔ Ö Ñ ÒØÓ¸ ×Ù Ø ÖÑ Ò ÓÒ ×
    Ö Ð Þ Ñ ÒØ Ò×Ô ÓÒ Ð Ö ÙÜ Ð Ö net Ò Ù×ÕÙ              ÐÓ× Ö Ó× × ØÙÖ Ó× ×Ù
     Ñ Ò Ò Ð Ö Ó g Ô ÖØ Ò Ð ÑÔ Ö Ñ ÒØÓº
½     ÜØÖ Ö Ò Ø ÐÓ× Ö Ó× × ØÙÖ Ó× ½ ≡                        ´½ µ
      for (Arc_Iterator<Aux_Net> it(net); it.has_current(); it.next())
        {
          typename Aux_Net::Arc * a = it.get_current();
          if (a->flow == 0)
            continue;
          typename GT::Arc * arc = (typename GT::Arc *) ARC_COOKIE(a);
          if (arc == NULL)
            continue;
          matching.append(arc);
        }
    Í× × Arc Iterator      º

    7.11.4.6    Implantaci´n final del emparejamiento de cardinalidad m´xima
                          o                                           a

     ÓÒ ÐÓ× ÐÓÕÙ × ÒØ Ö ÓÖ × × ÓÒ ÓÖÑ Ð Ð ÓÖ ØÑÓ ¬Ò Ð
½   ÊÙØ Ò × Ô Ö Ö Ó× Ô ÖØ Ó× ½ +≡                                        ½
           template <class GT, template <class> class Max_Flow>
      void compute_maximum_cardinality_bipartite_matching
        (GT & g, DynDlist<typename GT::Arc *> & matching)
      {
        DynDlist<typename GT::Node *> l, r;
        compute_bipartite(g, l, r);
            ÓÒרÖÙ Ö Ö     ÕÙ Ú Ð ÒØ ½
          Max_Flow <Aux_Net> () (net);
            ÜØÖ Ö       Ò Ø ÐÓ× Ö Ó× × ØÙÖ Ó× ½
      }
    Í× × DynDlist ¿ º

    7.11.5     Circulaciones
     ÈÙ        ÓÒ  Ö× ÙÒ Ö × Ò Ù ÒØ × Ò ×ÙÑ ÖÓ× ÓÒ× Ö ÑÓ× ÙÒ Ö ØÖ ÓÒ Ð
    N =< V, E, C, s, t > Ý ÙÒ Ð Ö ÑÓ ¬    ÓÒ ×Ó Ö ÐÐ ÓÒ× ×Ø ÒØ Ò Ò Ö ÙÒ Ö Ó
     ÓÒ Ô            Ù Ð Ñ Ü( Ô(ÇÍÌ(s)), Ô(ÁÆ(t)))º Ä      Ò Ö Ð × Ô ØÓÖ Þ Ò
818                                                                                   Cap´
                                                                                         ıtulo 7. Grafos




                                                                                 t
                     s                      Nodos internos



                                                                           Arco que hace el ciclo



                     ÙÖ º ¼                 ÖÑ            ÒÖÐ         ÙÒ    Ö ÙÐ ÓÒ

Ð ¬ ÙÖ º ¼ Ý Ú Ò ÕÙ ¸ Ð Ñ ÒÓ× Ò Ð ×Ó Ò Ö Ó ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ ¸ ×
 ÓÒ      Ð ÙÒ Ö × Ò Ù ÒØ × Ò ×ÙÑ ÖÓ× Ö Ù Ð ÙÒ ÓÒ ÙÒ Ù ÒØ Ý ÙÒ ×ÙÑ ÖÓº
       ÙÒ ­Ù Ó ÔÓÖ ÙÒ Ö × Ò Ù ÒØ × Ò ×ÙÑ ÖÓ× × Ð ÒÓÑ Ò “circulaci´n”¸ ÔÙ ×
                                                                   o
 Ð ÓÖ Þ ÙÒ × ØÙ ÓÒ Ò Ð Ù Ð Ò ÒØÖ Ò × Ð ­Ù Ó Ð Ö × ÑÔÐ Ñ ÒØ ¸ ÔÓ× Ð Ø Ó
ÔÓÖ Ð ÙÒ ÜØÖ Ò Ò Ö ¿ ¸ Ó          ØÓ× Ð ÑÓ ÐÓ¸ Ð ­Ù Ó Ö ÙÐ ×Ø Ð Ñ ÒØ ÔÓÖ Ð
Ö ×ÒÒ ×              ×Ô ¬ Ö ÙÒ ÒØÖ Ý × Ð         ­Ù Óº
    ÆÓØ ÑÓ× ÕÙ ÙÒ Ö ÙÐ ÓÒ ÖÖ Ð Ñ ÒÓ× ÙÒ ÐÓ Ò ÙÒ Ö Ó Ö Ó × ØÙ ÓÒ
ÕÙ ÜÔÐ Ø Ñ ÒØ ÒÓ ÑÓ× ×ØÙ Ó ×Ø Ð ÔÖ × ÒØ º ÄÓ× Ð ÓÖ ØÑÓ× Ñ Ü Ñ Þ ÓÒ
    ­Ù Ó ÔÖ × ÒØ Ó× ÓÔ Ö Ò ×Ó Ö Ö × ÕÙ ÔÙ Ò ÓÒØ Ò Ö ÐÓ× ÒØ ÖÒÓ׸ Ô ÖÓ ÓÒ ÙÒ
×ÓÐÓ Ù ÒØ Ý ÙÒ ×ÙÑ ÖÓº ׸ Ò Ò Ö Ð¸ ÙÒ Ö × Ò Ù ÒØ × Ò ×ÙÑ ÖÓ× Ö Ù Ð
   ÙÒ Ö ØÖ ÓÒ Ð Ä Ö ×ÔÙ ×Ø × ¬ÖÑ Ø Ú Ù ÐÕÙ Ö Ö              Ô Ø Ú Ð ¸ ×Ò
 Ù ÒØ Ò ×ÙÑ ÖÓ¸ ÔÙ Ö Ù Ö× ÙÒ Ö ÓÒ ÙÒ Ù ÒØ Ý ÙÒ ×ÙÑ ÖÓ Ý ×Ó Ö ×Ø
ÙÐØ Ñ ÔÐ Ö ÐÓ× Ð ÓÖ ØÑÓ× ×ØÙ Ó׺
    ÍÒ ÐÓ ÔÙ Ö Ù Ö× ÙÒ ×Ù ¹Ö ÓÒ ÙÒ Ù ÒØ Ý ÙÒ ×ÙÑ ÖÓ × ÑÔÐ Ñ ÒØ ÓÒ
 ÓÖØ Ö Ð ÐÓ Ý ×ÙÑ Ö ×Ù× ÜØÖ ÑÓ× ÓÑÓ Ù ÒØ × Ý ×ÙÑ ÖÓ׺ Ä Ö × × ÓÑÔÓÒ
   × ÐÓ× ÐÓ× Ñ × × ÑÔР׸ ÕÙ ÒÓ Ø Ò Ò ÒÓ Ó× ÓÑÙÒ ×¸    ÐÓ× Ñ × ÓÑÔÐ Ó׸ ÕÙ
Ø Ò Ò ÒÓ Ó× ÓÑÙÒ × ÓÒ ÓØÖÓ× ÐÓ׺ Ð Ö Ó × Ð              ÒÓ Ó ÖÖÓ ÙÒ ÔÖ Ñ Ö
 ÔÖÓÜ Ñ ÓÒ¸ Ô ÖÓ Ý ÓØÖ Ñ ØÖ ¸ ÕÙ ÔÖ × ÒØ Ö ÑÓ× ÔÖÓÒØ Ñ ÒØ ÕÙ Ó Ö Ñ ÓÖ
 Ò ÓÖÑ ÓÒ Ö          Ð ÓÒ Ø Ú       Ð Ö Ó Ý ÕÙ × ÒÓÑ Ò ÓÒ Ø Ú       Ò Ö Ó× º
  Ð Ð ÓÖ ØÑÓ ÓÒÚ Ö× ÓÒ Ò Ö Ð × Ð Ó Ò Ö Óº
                                            4/4       E         3/3   F
                                      B

                              4/4                                          5/4
                                          2/1
                                                          3/2    2/1         H
                          A                     5/2
                                                                   2/1
                                                                           3/3
                                5/3
                                      C               D               G
                                                6/5             3/3

                                      ÙÖ º ½ ÍÒ                  Ö ÙÐ ÓÒ
   ÍÒ ×Ô ØÓ ÒØ Ö × ÒØ ÙÒ Ö ÙÐ ÓÒ × ÕÙ ×Ù Ú ÐÓÖ ­Ù Ó ÔÙ Ö ÔÖ × ÒØ Ö×
 ÓÑÓ ÙÒ ÓÒ ÙÒØÓ ­Ù Ó× Ö ÙÐ ÒØ × ÔÓÖ ×Ù× ÐÓ׺ ÈÓÖ ÑÔÐÓ¸ Ð Ö ÙÐ ÓÒ Ð
¬ ÙÖ º ½ ÔÙ    ÜÔÖ × Ö× Ñ ÒØ ÐÓ× × Ù ÒØ × ÐÓ×
 ¿
       × Ñ ÒØ × ÓÒ       Ð Ñ ÒØ Ò Ö ÙÒ           Ö ÙÐ ÓÒ ÔÓÖ Ð Ñ Ö Ò Ö ¸ Ô ÖÓ Ò Ð ÑÙÒ Ó Ö Ð ×
ÑÔÖÓ     к
7.11. Reducciones al problema del flujo m´ximo
                                        a                                                                                      819



                                                   ÐÓ                                Î ÐÓÖ         ­Ù Ó
                              A→B→E→A                                                          ½
                         A→B→E→F→H→G→D→C→A                                                     ½
                          A→B→E→F→H→D→C→A                                                      ½
                            A→B→E→D→C→A                                                        ½
                              C→E→D→C                                                          ¾
                              D→F→H→D                                                          ½
                             D→F→H→G→D                                                         ½
    Ä ÒØ ÖÔÖ Ø ÓÒ ÒØ Ö ÓÖ ÙÒ ­Ù Ó Ú Ò ÕÙ ¸ Ô Ö ÙÒ Ö × Ò Ù ÒØ × Ò ×Ù¹
Ñ ÖÓ׸ Ð ­Ù Ó Ñ Ü ÑÓ × Ö Ù         Ò ÓÒØÖ Ö ÙÒ Ö ÙÐ ÓÒ ÕÙ Ñ Ü Ñ Ð ­Ù Ó Ò
       Ö Óº ÈÓ ÑÓ׸ × Ò ÔÖÓ Ð Ñ ¸ ÙÑ ÒØ Ö Ð ­Ù Ó Ð Ö    × Ù Ö Ò ÓÐ ÐÓ׸ й
 ÙÐ Ò ÓÐ × ×Ù Ô        Ñ Ò Ñ Ý ÙÑ ÒØ Ò Ó Ð ­Ù Ó Ò ×Ø Ú ÐÓÖ ÐÓ Ð Ö Ó ØÓ Ó Ð
   ÐÓº
              B     4/3       E         3/3   F                                B         4/3       E         3/3   F

      4/3                                         5/4                4/3                                                     5/4
                  2/0                                                                2/0
                                  3/2    2/1        H                                                  3/0    2/1              H
  A                     5/2                                     A                           5/0
                                           2/1                                                                  2/1
                                                  3/3                                                                        3/3
        5/3                                                            5/3
              C               D               G                                 C                  D               G
                        6/5             3/3                                                6/3               3/3
                  ´ µA→B→E→A                                                       ´ µ C→E→D→C
                    4/3       E         3/3   F                                    4/0       E         3/0     F
              B                                                        B

      4/3                                         5/3          4/0                                                     5/0
                  2/0                                                          2/0
                                  3/0    2/0        H                                            3/0     2/0             H
  A                     5/0                                A                          5/0
                                           2/0                                                             2/0
                                                  3/3                                                                  3/0
        5/3                                                      5/0
              C               D               G                            C                 D                 G
                        6/3             3/3                                          6/0               3/0
                  ´ µ D→F→H→D                             ´ µ A→B→E→F→H→G→D→C→A

   ÙÖ º ¾               ÑÔÐÓ Ð Ø ÓÖ Ñ                   × ÓÑÔÓ× ÓÒ                 ­Ù Ó ×Ó Ö Ð                Ö ÙÐ ÓÒ              Ð
¬ ÙÖ º ½
    Ä Ø Ð          ÐÓ× ÒØ Ö ÓÖ ÒÓ× Ú Ò Ð × ÒØ Ó       Ö ÙÐ ÓÒ º Ò ØÓ¸
   ÐÓ × ÙÒ Ö ÙÐ ÓÒº Ò Ð ×Ó Ð Ø Ð ¸ Ò ÓÒØÖ ÑÓ× 7 Ö ÙÐ ÓÒ ×º ÆÓØ ÑÓ× ÕÙ
× ØÙÚ × ÑÓ× ÙÒ Ö ÓÒ ÙÒ Ù ÒØ Ý ÙÒ ×ÙÑ ÖÓ¸ Ø Ö ÙÒ Ö Ó × Ð ×ÙÑ ÖÓ
 Ð Ù ÒØ ÒÓ× Ø ÒØ × Ö ÙÐ ÓÒ × ÓÑÓ Ñ ÒÓ× ×Ø ÒØÓ× Ü ×Ø Ò × Ð Ù ÒØ
 Ð ×ÙÑ ÖÓº
      Ð Ú ÐÓÖ ­Ù Ó Ð Ö ÔÙ           ÜÔÖ × Ö× ÓÑÓ ÙÒ ×ÙÑ       ÐÓ× Ý ­Ù Ó׺ È ÖÓ
Ð Ñ ×Ñ Ö Ý ×Ù Ú ÐÓÖ ­Ù Ó Ø Ñ Ò ÔÙ Ö ÔÖ × ÒØ Ö× ÓÑÓ ÙÒ ÓÑÔÓ× ÓÒ
   ÐÓ× Ý ­Ù Ó¸ Ø Ð ÓÑÓ ÐÓ Ú Ò Ð ÔÖÓÔÓ× ÓÒ × Ù ÒØ º
Proposici´n 7.16 (Descomposici´n de flujo)
         o                    o             Ù ÐÕÙ Ö Ö ÙÐ ÓÒ ÔÙ                                                         Ö ÔÖ × Ò¹
Ø Ö× ÓÑÓ ÙÒ ­Ù Ó ÒØÖ ÙÒ ÓÒ ÙÒØÓ    ÐÓ Ñ × |E| ÐÓ× ×Ø ÒØÓ׺
Demostraci´n
          o      ÓÒ× Ö ÑÓ× Ð × Ù ÒØ Ð ÓÖ ØÑÓ       × ÓÑÔÓ× ÓÒ
820                                                          Cap´
                                                                ıtulo 7. Grafos



Algoritmo 7.9 (Descomposici´n de una circulaci´n en ciclos)
                           o                  o             ½º Ë         E   = ∅
     Ð ÓÒ ÙÒØÓ     ÐÓ× ÕÙ × ÓÑÔÓÒ Ò Ð Ö ÙÐ ÓÒº E ÓÒØ Ò Ò Ð Ñ            ÒØÓ× Ð
     ÓÖÑ (e , Δ)¸ ÓÒ e × ÙÒ ÐÓ Ý Δ Ð Ú ÐÓÖ ­Ù Ó ÕÙ Ö ÙÐ ÔÓÖ             Ð ÐÓº
  ¾º   while Ü ×Ø Ò Ö Ó× ×Ó Ö N
      ´ µ Ò Ù ÒØÖ ÙÒ ÐÓ e º
      ´ µ Ø ÖÑ Ò Ð ×Ð ÓÒ Ñ Ò ÑÓ Ð ÐÓ Δº
      ´ µ E = E ∪ {(e , Δ)}
      ´ µ ∀e ∈ e =⇒ f(e) = f(e) − Δº
      ´ µ Ð Ñ Ò N ´Ó Ð ÐÓµ ØÓ Ó× ÐÓ× Ö Ó× ÓÒ ­Ù Ó ÖÓº
ÍÒ ÑÔÐÓ            Ù ÓÒ ×Ø Ð ÓÖ ØÑÓ × Ú Ò Ó Ò Ð ¬ ÙÖ º ¾º
   À Ý ØÖ × Ó × ÖÚ ÓÒ × ÖÙ Ð ×         ר Ð ÓÖ ØÑÓ ÕÙ ÒÓ× ÝÙ Ò Ö Ð Þ Ö Ð ¹
ÑÓ×ØÖ ÓÒ
  ½º Ð ÓÒ ÙÒØÓ Ö ×ÙÐØ ÒØ E Ô ÖÑ Ø Ö ÓÒרÖÙ Ö ÒØ Ö Ñ ÒØ Ð Ö º
  ¾º ÈÙ ×ØÓ ÕÙ         Ø Ö ÓÒ Ð Ñ Ò ÙÒ ÐÓ¸ ÐÓ× ÐÓ× ÓÒØ Ò Ó× Ò E ×ÓÒ ×Ø ÒØÓ׺
  ¿º Ð Ð ÓÖ ØÑÓ Ø ÖÑ Ò Ò ÐÓ ×ÙÑÓ |E| Ø Ö ÓÒ ×¸ ÕÙ × Ð Ñ Ü Ñ ÒØ ÔÓ× Ð
           ÐÓ׺
 Ù ÒØ              ר × Ó × ÖÚ ÓÒ × Ð ÔÖÓÔÓ× ÓÒ × ÖØ

7.11.6    Conectividad de grafos
Ê Ö × ÑÓ× Ð                 ÓÒ Ø Ú         ÙÒ Ö Óº Ò × × ÒØ Ó¸ Ù Ò ÓÒ ÜÓ
ÔÙ      ÓÒ× Ö Ö× ÙÒ Ö Ó Ó× Ñ ØÖ × Ò Ù ÒØ                Ð ÔÖ ÙÒØ Ý × ÒÓÑ Ò Ò
“conectividad en arcos” Ý “conectividad en nodos”¸ Ö ×Ô Ø Ú Ñ ÒØ º Ä ÓÒ ¹
ØÚ        Ò Ö Ó× × Ð Ñ Ò Ñ ÒØ              Ö Ó× ÕÙ     Ò Ð Ñ Ò Ö×     ÙÒ Ö Ó Ô Ö
ÕÙ ×Ø ÕÙ         Ú Ó Ò Ó× ÓÑÔÓÒ ÒØ × Ò ÓÒ ÜÓ׺ Ë Ñ Ð ÖÑ ÒØ ¸ Ð ÓÒ Ø Ú           Ò
ÒÓ Ó× × Ð Ñ Ò Ñ ÒØ             ÒÓ Ó× Ö ÑÓÚ Ö Ô Ö ÕÙ Ð Ö Ó Ú Ò           × ÓÒ Ø Óº
    ÆÓ×ÓØÖÓ× Ý      ÑÓ× ×ØÙ Ó × ¬Ò × Ð ÓÒ Ø Ú º Ò Ü º º½ ´Ô Ò ¿ µ
 ×ØÙ ÑÓ× ÐÓ× ÔÙÒØÓ×        ÖØ ÙÐ ÓÒ Ó ÓÖØ ¸ ÐÓ× Ù Ð ×       Ð ÙÒ × Ñ Ò Ö ÜÔÖ × Ò
 ÓÒ Ø Ú       × Ò ÒÓ Ó× ÙÒ Ø Ö × Ý Ñ ×¸ ÔÓÖÕÙ ÕÙ × ÖÖÓÐÐ ÑÓ× ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ò
O(E) ÒÓ× Ð ÙÐ ØÓ Ó× ÐÓ× ÒÓ Ó×       ÓÖØ º Ñ ×¸ Ô Ö ÑÙ × × ØÙ ÓÒ × × ×Ù¬ ÒØ
  Ð ÙÐ Ö ÐÓ× ÒÓ Ó× ÓÖØ ¸ ÕÙ × Ö ØÓ Ò Ø ÑÔÓ Ý ×Ô Ó ´O(E) Ý O(1)¸ Ö ×Ô Ø Ú ¹
Ñ ÒØ µ¸ Ò ÐÙ Ö        Ð ÙÐ Ö ÓÒ Ø Ú      × ÕÙ ¸ ÓÑÓ Ú Ö ÑÓ× Ò ×Ø ×Ù ¹× ÓÒ¸ ×ÓÒ
Ñ × ÓרÓ× ×º
    ÈÓÖ ÓØÖ Ô ÖØ ¸ ÙÖ ÒØ ÒÙ ×ØÖÓ ×ØÙ Ó Ö ÓÐ × Ö ÓÖ × Ñ Ò ÑÓ× ÔÖ × ÒØ ÑÓ×
Ð ¬Ò ÓÒ ÓÖØ ´ º Ô º µº Ä ÓÒ Ø Ú                    Ò Ö Ó× ÒÓ × ÓØÖ Ó× ÕÙ Ð ÙÐ Ö
ÙÒ ÓÖØ         Ô      Ñ Ò Ñ ¸ Ð Ü Ô ÓÒ ÕÙ              ÑÓ×     ÖÐÓ Ò Ø ÖÑ ÒÓ ÙÒ
 Ö Ó Ý ÒÓ ÙÒ Ö Óº À Ö ÐØ ¸ Ô٠׸ ÙÒ Ô Ö Ð ÐÓ ÒØÖ Ð × Ö × ­Ù Ó× Ý ÐÓ×
 Ö Ó׸ Ð Ù Ð Ù ÑÓ×ØÖ Ó Ò Ü º½½º½ ´Ô Ò ¼ µº
7.11. Reducciones al problema del flujo m´ximo
                                        a                                          821



7.11.6.1    El teorema de Menger

   Ñ ÒÙ Ó¸ ÙÒ Ú ÐÓÖ ÓÒ Ø Ú         Ò Ö Ó× k × Ð ÒÓÑ Ò k¹ ÓÒ Ü ÓÒ Ý × ÒÓØ
 ÓÖÑ ÐÑ ÒØ ÓÑÓ Ke(G)º
        ÑÓ× ÕÙ ÙÒ Ö Ó × k¹ ÓÒ Ø Ó × s            t × ¸ Ô Ö ØÓ Ó ÓÒ ÙÒØÓ C
k − 1 ÒÓ Ó׸ Ü ÔØÙ Ò Ó s Ý t¸ Ü ×Ø ÙÒ Ñ ÒÓ × s           tº   Ó ÓØÖÓ ÑÓ Ó¸
ÒÓ × ÔÓ× Ð × ÓÒ Ø Ö s t × Ò Ð Ñ Ò Ö k ÒÓ Ó׺
     Ó× Ñ ÒÓ× ÒØÖ s Ý t × ÒÓÑ Ò Ò Ò Ô Ò ÒØ × × ×ØÓ× ÒÓ Ø Ò Ò ÒÓ Ó× Ò
 ÓÑÙÒ ´ Ð Ü Ô ÓÒ s Ý tµº
     ר ÑÓ× Ð ×ØÓ× Ô Ö ÒÙÒ Ö ÙÒÓ ÐÓ× Ø ÓÖ Ñ × Ñ × ÒØ Ö × ÒØ × Ð Ø ÓÖ
 Ö Ó׸ × Ù ÖØÓ ÒØ × Ð ÓÑÔÙØ ÓÒ ÑÓ ÖÒ ¸ Ð Ø ÓÖ Ñ Å Ò Öº
Proposici´n 7.17 (Karl Menger 1928 [29])
         o                                   Ë ÙÒ Ö Ó × k¹ ÓÒ Ø Ó × ÙÒ
ÒÓ Ó s     ÓØÖÓ t¸ ÒØÓÒ × Ü ×Ø Ò k Ñ ÒÓ×     Ò Ô Ò ÒØ × × s           tº
Demostraci´n o        Ó ÙÒ Ö Ó Ù ÐÕÙ Ö ¸ ÓÒ× Ö ÑÓ× ÙÒ Ö           Ô Ø      ÓÒ ÐÓ×
Ñ ×ÑÓ ÒÓ Ó× Ý Ö Ó× ÔÙ ×ØÓ×       Ô      ÙÒ Ø Ö º ÄÙ Ó Ð Ñ Ò ÑÓ× ØÓ Ó× ÐÓ× Ö Ó×
 ÒØÖ ÒØ × s Ý ØÓ Ó× ÐÓ× × Ð ÒØ × tº
       ÓÖ Ñ Ü Ñ ÑÓ× Ð Ö º ÈÓÖ Ð ÔÖÓÔÓ× ÓÒ º × ÑÓ× ÕÙ Ð Ö Ò Ð                    Ð
 ÓÖØ Ñ Ò ÑÓ × k¸ ÔÙ × ØÓ × Ð × Ô         × ×ÓÒ ÙÒ Ø Ö × Ý Ð Ö Ó × k ÓÒ Ø Óº
    Ë ÑÓ׸ ÔÓÖ Ð Ø ÓÖ Ñ º½          × ÓÑÔÓ× ÓÒ ­Ù Ó¸ ÕÙ ÔÓ ÑÓ× Ö ÔÖ × ÒØ Ö Ð
­Ù Ó × s           t ÓÑÓ ÙÒ ÓÒ ÙÒØÓ       Ñ ÒÓ× × ÙÒØÓ׿ ÙÝ ×ÙÑ        ­Ù Ó× ´ÔÓÖ
        Ñ ÒÓµ × Ð Ú ÐÓÖ ­Ù Ó Ð Ö º ÈÙ ×ØÓ ÕÙ Ð Ö Ò Ð             Ð ÓÖØ Ñ Ò ÑÓ ×
k¸ Ü ×Ø Ò k Ñ ÒÓ× ×Ø ÒØÓ× × s           t¸ ÙÒÓ ÔÓÖ       Ö Ó Ð ÓÖØ Ñ Ò ÑÓ
     Ð Ø ÓÖ Ñ     Å Ò Ö Ù Ò ÐÑ ÒØ ÓÖÑÙÐ Ó Ô Ö Ö Ó׺ ËÙ ÒÙÒ Ó Ý ¹
ÑÓ×ØÖ ÓÒ ×ÓÒ Ð Ó× ÓÑÓ Ö Óº Ò ×Ø Ñ ØÓ¸ ÒÓ× ÔÓÖØ Ö Ø Ñ ÒØ Ð
 ÓÒÓ Ñ ÒØÓ Ô Ö × Ò Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ð ÙÐ Ke(G) ݸ Ñ × ÙÒ¸ Ô Ö Ð ÙÐ Ö Ð
 ÓÖØ Ö Ø Ó Ó Ñ Ò ÑÓ × Ö¸ Ð ÓÒ ÙÒØÓ ×Ô ¬ Ó Ö Ó× ÕÙ Ý ÕÙ ×ÙÔÖ Ñ Ö Ô Ö
ÕÙ Ð Ö Ó Ú Ò Ô ÖØ Ó Ò Ó× Ó Ñ × ×Ù ¹ Ö Ó׺
7.11.6.2    C´lculo de Ke(G)
              a
            →
            −
ÄÐ Ñ ÑÓ×    G Ð Ö ØÖ Ò× ÓÖÑ  ÕÙ Ú Ð ÒØ ÙÒ Ö ÒÓ¹ Ö                        º È Ö Ò ÓÒØÖ Ö
Ke(G) ÔÓ ÑÓ× ÔÐ Ö Ð × Ù ÒØ × ÑÔÐ × ÑÓ Ð ÓÖ ØÑÓº

Algoritmo 7.10 (C´lculo de Ke(G))
                 a
    ÒØÖ    ÍÒ Ö Ó G =< V, E >º
   Ë Ð Ke(G)º
     ½º Ð ÙÐ →º −
                 G

     ¾º Ë s Ð ÒÓ Ó Ò → ÓÖÖ ×ÔÓÒ ÒØ Ð ÒÓ Ó
                       −
                       G                               Ñ ÒÓÖ Ö Ó Ò Gº
     ¿º Ke(G) = ∞
      º ∀v ∈ V | v = s
         ´ µ t=v
 ¿
      Ø × ÙÒ Ð ÞÓ t → s ÕÙ ÓÒ ÓÖÑ Ð   ÐÓ s   t→s   Ý× Ø Ò Ð   Ö ÙÐ ÓÒº
822                                                           Cap´
                                                                      ıtulo 7. Grafos



           ´ µ Ë Ð Ö N =< V, E , C, s, t > Ø Ð ÕÙ C = {1 | e ∈ E ∪ Ô(e) = 1}
           ´ µ Å Ü Ñ Þ Ö N Ý Ð ÙÐ Ö Ð ÓÖØ         Ô      Ñ Ò Ñ < Vs, Vt >º
           ´ µ if ­Ù Ó N < Ke(G) =⇒
                 º Ke(G) = | < Vs, Vt > |
                 º ÕÙ Ú ÒØÙ ÐÑ ÒØ × ÔÙ          Ù Ö Ö < Vs, Vt >º
     7.11.6.3    Implantaci´n del algoritmo de c´lculo de Ke(G)
                           o                    a

     Ä ÑÔÐ ÒØ ÓÒ Ð Ð ÙÐÓ Ð ÓÒ Ø Ú           × Ö Ð Ø Ú Ñ ÒØ × ÑÔÐ ¸     Ù ÒØ
     ÕÙ Ý ×ÔÓÒ ÑÓ× ØÓ Ð Ñ ÕÙ Ò Ö Ò × Ö Ô Ö ÒרÖÙÑ ÒØ Ö Ð × ÒרÖÙ ÓÒ ×
       Ð Ð ÓÖ ØÑÓ º½¼º ÓÑ Ò ÑÓ׸ ÒØÓÒ ×¸ ÓÒ Ð Ð ÙÐÓ →    −
                                                         G
               →
               −
¾¾      Ð ÙÐ Ö G ¾¾ ≡                                           ´ ¾¿ µ
       typedef Net_Graph<Net_Node<Empty_Class>, Net_Arc<Empty_Class> > Net;
       Net net;
       typename Net::Node * source = NULL; // fuente ser´ el de menor grado de salida
                                                        a
       long min_degree = numeric_limits<long>::max(); // menor grado de salida
       for (Node_Iterator<GT> it(g); it.has_current(); it.next())
         {
           typename GT::Node * p = it.get_current();
           NODE_COOKIE(p) = net.insert_node();
           if (g.get_num_arcs(p) < min_degree)
             {
               source = (typename Net::Node *) NODE_COOKIE(p);
               min_degree = g.get_num_arcs(p);
             }
         }
       if (min_degree <= 1)
         return min_degree; // No vale la pena el c´lculo porque este es el resultado
                                                   a
       for (Arc_Iterator<GT> it(g); it.has_current(); it.next())
         {
           typename GT::Arc * a     = it.get_current();
           typename Net::Node * src = (typename Net::Node*) NODE_COOKIE(g.get_src_node(a));
           typename Net::Node * tgt = (typename Net::Node*) NODE_COOKIE(g.get_tgt_node(a));
           if (src != source)
             net.insert_arc(tgt, src, 1);
           if (tgt != source)
             net.insert_arc(src, tgt, 1);
         }
     Í× × Arc Iterator    Ò   Node Iterator   º
           ØÓ×     ÓÖÖ Ö ×Ô Ó Ý ÒÓ Ø Ò Ö ÕÙ ÑÔÐ Ö ÙÒ Ø Ð ¸        ÒÓ Ó → × Ù Ö
                                                                          −
                                                                          G
      Ò Ð ÓÓ      Ð ÒÓ Ó Ò Gº
          ÙÖ ÒØ Ð Ô × ×Ó Ö ÐÓ× ÒÓ Ó× G ÔÖÓÚ ÑÓ× Ô→Ö Ø ÖÑ Ò Ö Ð ÒÓ Ó
     Ñ ÒÓÖ Ö Óº Ð ¬Ò Ð Ð ÔÖ Ñ Ö for¸ source × Ð Ñ Ò Ò − Ð ÒÓ Ó Ñ ÒÓÖ Ö Ó
                                                           G
      Ò Gº Ë Ð Ö Ó × Ò Ö ÓÖ Ó Ù Ð Ð ÙÒ ¸ ÒØÓÒ × ÒÓ Ú Ð Ð Ô Ò ÔÖÓ× Ù Ö¸ ÔÙ ×
     Ð ÓÒ Ø Ú       ÒÓ ÔÙ → Ö Ñ ÝÓÖº
                             −
                              ×
          Ð ÐÓÕÙ      Ð ÙÐ Ö G ¾¾ ÒÓ× Ù Ö ÐÓ× Ô ×Ó× ½ Ý ¾ Ð Ð ÓÖ ØÑÓ º½¼º
          Ð Ô ×Ó × ÒרÖÙÑ ÒØ ÓÒ ÙÒ for ÕÙ Ö ÓÖÖ ØÓ Ó× ÐÓ× ÒÓ Ó× → ´net Ò Ð
                                                                       −
                                                                        G
      ÑÔÐ ÒØ ÓÒµ Ý Ú Ö ¬ÕÙ ÒÓ ÔÖÓ × Ö Ð Ù ÒØ º Ë sink Ð ÒÓ Ó ØÙ Ð ×Ó Ö Ð Ù Ð
     × Ò Ù ÒØÖ Ð for Ñ Ò ÓÒ Óº
7.11. Reducciones al problema del flujo m´ximo
                                             a                                    823



           Ð Ô ×Ó     ÓÒ× ×Ø Ò ×ÙÔÖ Ñ Ö ÐÓ× Ö Ó× ÕÙ × Ð Ò sink ´ ר ÑÓ Ó Ú Ò
     ×ÙÑ ÖÓµ¸ Ô ÖÓ         ÑÓ× Ù Ö Ö ×ØÓ× Ö Ó× ×ÙÔÖ Ñ Ó× Ô Ö Ö ×Ø ÙÖ ÖÐÓ× Ò Ð × Ù ÒØ
      Ø Ö ÓÒº ×ØÓ × ÑÔÐ ÒØ Ð × Ù ÒØ ÓÖÑ
¾¿      Ð Ñ Ò Ö Ö Ó× × Ð ÒØ × × Ò ¾¿ ≡                               ´ ¾¿µ
       DynDlist<typename Net::Arc*> from_sink_arcs;
       for (Node_Arc_Iterator<Net> it(sink); it.has_current(); it.next())
         from_sink_arcs.append(it.get_current());
       for (typename DynDlist<typename Net::Arc*>::Iterator it(from_sink_arcs);
            it.has_current(); it.next())
         net.desconnect_arc(it.get_current());
     Í× × DynDlist ¿ Ò    Node Arc Iterator      º
      ÑÔÐ ÑÓ× ÙÒ Ð ×Ø        Ö Ó× Ð Ñ Ò Ö from sink arcsº Ê Ð Þ ÑÓ× Ó× Ô × ×¸ Ð
     ÔÖ Ñ Ö Ô Ö Ù Ö Ö ÐÓ× Ö Ó׸ Ð × ÙÒ Ô Ö Ð Ñ Ò ÖÐÓ׺ ÄÓ       ÑÓ× ×Ø Ñ Ò Ö
     ÔÓÖÕÙ × Ð Ó Ð Ñ Ò Ö ÙÒ Ö Ó ÒØÖÓ ÙÒ Ø Ö ÓÖ Ö Ó׺
        ÄÓ× Ö Ó× × Ð ÒØ × sink¸ Ù Ö Ó× Ò from sink arcs¸          Ò × Ö Ö ×Ø ÙÖ Ó×
     Ñ ÒØ
¾¿    Ê ×Ø ÙÖ Ö Ö Ó× × Ð ÒØ × × Ò ¾¿ ≡                           ´ ¾¿µ
       while (not from_sink_arcs.is_empty())
         net.connect_arc(from_sink_arcs.get());
         ÓÒ ØÓ Ó× ÐÓ× ÐÓÕÙ × × ÖÖÓÐÐ Ó׸ Ð Ð ÓÖ ØÑÓ º½¼ × ÑÔÐ ÒØ ×
¾¿     ÓÒ Ø Ú      Ò Ö Ó× ¾¿ ≡                                   ¾¿
         template <class GT, template <class> class Max_Flow>
       long edge_connectivity(GT & g)
       {
             Ð ÙÐ Ö → ¾¾
                    −
                    G
         long min_k = min_degree;
         for (Node_Iterator<Net> it(net); it.has_current(); it.next())
           {
              typename Net::Node * sink = it.get_current();
              if (sink == source)
                continue;
                 Ð Ñ Ò Ö Ö Ó× × Ð ÒØ ×        × Ò ¾¿
              const typename Net::Flow_Type flow = Max_Flow <Net> () (net);
              if (flow < min_k)
                min_k = flow;
               Ê ×Ø ÙÖ Ö Ö Ó× × Ð ÒØ ×        × Ò ¾¿
               net.reset(); // colocar flujo en cero
             }
           return min_k;
       }
     Í× × Node Iterator    º
         Ä ÓÒ Ø Ú        Ò Ö Ó× × ÙÒ Ñ       ÑÙÝ ÑÔÓÖØ ÒØ     Ò×     Ð Ö Óº
       Ò ÑÙ Ó× ÓÒØ ÜØÓ׸ Ke(G) ÜÔÖ × Ð ÖÓ Ùר Þ Ð Ö Ó Ò × ÒØ Ó ×Ù ÓÒ Ø Ú º
       Ò Ð ÙÒ × × ØÙ ÓÒ × ÔÙ × Ö ÑÔÓÖØ ÒØ Ð ÙÐ Ö Ð ÓÖØ Ñ Ò ÑÓ Gº È Ö ÐÐÓ¸
     Ð     Ð ÓØ ÔÖÓÚ Ð ÖÙØ Ò compute min cut()¸ ÙÝ ×ØÖÙ ØÙÖ × Ð Ñ ×Ñ ÕÙ Ð
         edge connectivity()¸ ÓÒ Ð Ò    Ó ÕÙ ×Ø Ð ÙÐ Ð ÓÖØ Ñ Ò ÑÓ → ݸ  −
                                                                        G
     Ñ ÒØ Ñ Ô Ó G¸ Ó Ø Ò Ð Ú ÐÓÖ Ð ÓÖØ
¾¿      ÓÒ Ø Ú     Ò Ö Ó× ¾¿ +≡                                ¾¿
824                                                                                               Cap´
                                                                                                     ıtulo 7. Grafos


       22               23          24         25          26               22        23          24         25        26




16               17            18        19         20            21   16        17          18        19         20        21




       11               12          13         14          15               11        12          13         14        15




5                6             7         8          9             10   5         6           7         8          9         10




        0               1           2          3           4                0         1            2         3         4

                              ´ µ Ke (G) = 4                                                ´ µ Ke (G) = 3

                             ÙÖ º ¿      Ó× Ö Ó×                ר ÒØ × ÓÒ Ø Ú             × ÓÒ ×Ù× ÓÖØ ×

       template <class GT, template <class> class Max_Flow>
     long compute_min_cut(GT &                              g,
                           Aleph::set<typename GT::Node*> & l,
                           Aleph::set<typename GT::Node*> & r,
                           DynDlist<typename GT::Arc *> &   cut)
     {
           Ð ÙÐ Ö Ý Ñ Ô Ö → ¾
                          −
                          G
       Aleph::set<typename Net::Node*> tmp_vs, tmp_vt;
       DynDlist<typename Net::Arc*>     tmp_cuts, tmp_cutt;
       long min_k = numeric_limits<long>::max();
       for (Node_Iterator<Net> it(net); it.has_current(); it.next())
         {
            typename Net::Node * sink = it.get_current();
            if (sink == source)
              continue;
                      Ð Ñ Ò Ö Ö Ó× × Ð ÒØ ×              × Ò ¾¿
                Aleph::set<typename Net::Node*> vs, vt;
                DynDlist<typename Net::Arc *> cuts, cutt;
                const typename Net::Flow_Type flow =
                  Min_Cut <Net, Max_Flow> () (net, vs, vt, cuts, cutt);
                if (flow < min_k)
                  {
                    min_k = flow;
                    tmp_vs.swap(vs);
                    tmp_vt.swap(vt);
                    tmp_cuts.swap(cuts);
                    tmp_cutt.swap(cutt);
                  }
                net.reset(); // colocar flujo en cero
                 Ê ×Ø ÙÖ Ö Ö Ó× × Ð ÒØ ×                 × Ò ¾¿
            }
                Ø ÖÑ Ò Ö Ð ÓÖØ ´Ð¸ Ö Ý ÙØµ Ô ÖØ Ö                      ØÑÔ Ú׸ ØÑÔ ÚØ Ý ØÑÔ ÙØ× ¾
      return min_k;
7.11. Reducciones al problema del flujo m´ximo
                                            a                                       825



      }
    Í× × DynDlist ¿ Ò   Node Iterator    º
      ÓÒר Ø ÑÓ× ÕÙ Ð ×ØÖÙ ØÙÖ × ÒØ            edge connectivity()º À Ý ÙÒ ×ÙØ Ð       ¹
    Ö Ò ÒÓ ÑÓ×ØÖ          Ò Ð ÐÓÕÙ × Ð ÓÒ Ø Ú           × Ñ ÒÓÖ Ó Ù Ð ÕÙ Ð ÙÒ ¸ ÒÓ
    × Ð ÙÐ Ð ÓÖØ ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð ÒÚÓ ÒØ                 ÓÒ×ÙÐØ Ö Ð Ú ÐÓÖ Ö ØÓÖÒÓ Ô Ö
     Ò Ö × ×Ø × Ð ÙÐÓ Ó ÒÓº Ä Ö ÞÓÒ ×Ø                × ÓÒ × Ó Ð º Ò ÔÖ Ñ Ö ÐÙ Ö¸ × Ð
     ÓÒ Ø Ú        × ÙÒÓ¸ ÒØÓÒ × × ×Ø ÒØ ÔÖÓ Ð ÕÙ Ð Ö Ó × ×Ô Ö Ó¸ ÓÒ Ñ ×
    ÙÒ ÒÓ Ó Ö Ó ÙÒ Ø Ö Óº Ò ×Ø ×Ó¸ Ð Ð ÓÖ ØÑÓ Ð ÙÐ Ö ­Ù Ó× Ú ÒÓ× Ý               Ö
     ÓÒ× Ö Ö Ò Ð × Ø Ö ÓÒ × Ð × ÓÒ Ü ÓÒ Ð Ú ÐÓÖ ØÙ Ð sinkº Ò × ÙÒ Ó ÐÙ Ö¸
     Ò Ü º º½ ´Ô Ò ¿ µ ÓÒ× Ö ÑÓ× ÙÒ ÑÔÐ ×Ù ¹× ÓÒ Ô Ö ØÖ Ø Ö ÓÒ ÐÓ× ÔÙÒØÓ×
     ÓÖØ ¸ ÕÙ × Ð ×Ó Ô ÖØ ÙÐ Ö Ô Ö Ke(G) = 1º
          Ú ÒØÙ ÐÑ ÒØ ¸ ÓÒ ÐÓ× Ú ÐÓÖ × l¸ r Ý cut¸ ÔÓ ÑÓ× ÑÔÐ Ö Ø Ò × × Ñ Ð Ö × Ð ×
       × ÖÖÓÐÐ × Ò Ü º º½ ´Ô Ò ¼µ Ô Ö Ð ÙÐ Ö ÐÓ× ÐÓÕ٠׺
¾       Ð ÙÐ Ö Ý Ñ Ô Ö → ¾ ≡
                        −
                        G                                             ´ ¾¿ µ
      typedef Net_Graph<Net_Node<Empty_Class>, Net_Arc<Empty_Class> > Net;
      Net net;
      typename Net::Node * source = NULL; // fuente ser´ el de menor grado de salida
                                                       a
      long min_degree = numeric_limits<long>::max(); // menor grado de salida
      for (Node_Iterator<GT> it(g); it.has_current(); it.next())
        {
          typename GT::Node * p = it.get_current();
          typename Net::Node * q = net.insert_node();
          NODE_COOKIE(p) = q;
          NODE_COOKIE(q) = p;
          if (g.get_num_arcs(p) < min_degree)
            {
              source = (typename Net::Node *) NODE_COOKIE(p);
              min_degree = g.get_num_arcs(p);
            }
        }
      if (min_degree <= 1)
        return min_degree; // No vale la pena el c´lculo porque este es el resultado
                                                  a
      for (Arc_Iterator<GT> it(g); it.has_current(); it.next())
        {
          typename GT::Arc * a     = it.get_current();
          typename Net::Node * src = (typename Net::Node*) NODE_COOKIE(g.get_src_node(a));
          typename Net::Node * tgt = (typename Net::Node*) NODE_COOKIE(g.get_tgt_node(a));
          if (src != source)
            {
              typename Net::Arc * arc = net.insert_arc(tgt, src, 1);
              ARC_COOKIE(arc) = a;
            }
          if (tgt != source)
            {
              typename Net::Arc * arc = net.insert_arc(src, tgt, 1);
              ARC_COOKIE(arc) = a;
            }
        }
    Í× × Arc Iterator    Ò   Node Iterator   º
826                                                             Cap´
                                                                       ıtulo 7. Grafos



¾      Ø ÖÑ Ò Ö Ð ÓÖØ ´Ð¸ Ö Ý ÙØµ Ô ÖØ Ö      ØÑÔ Ú׸ ØÑÔ ÚØ Ý ØÑÔ ÙØ× ¾   ≡   ´ ¾¿ µ
      for (typename Aleph::set<typename Net::Node*>::iterator it = tmp_vs.begin();
           it != tmp_vs.end(); it++)
        l.insert((typename GT::Node*) NODE_COOKIE(*it));
      for (typename Aleph::set<typename Net::Node*>::iterator it = tmp_vt.begin();
           it != tmp_vt.end(); it++)
        r.insert((typename GT::Node*) NODE_COOKIE(*it));
      for (typename DynDlist<typename Net::Arc*>::Iterator it(tmp_cuts);
           it.has_current(); it.next())
        {
          typename Net::Arc* arc = it.get_current();
          cut.append((typename GT::Arc*) ARC_COOKIE(arc));
        }
    Í× × DynDlist ¿ º

    7.11.6.4    An´lisis del algoritmo 7.10
                  a

      Ò ÐÓ× Ø ÖÑ ÒÓ× Ò ÕÙ ÐÓ ÑÓ× ÔÐ ÒØ Ó¸ Ð Ö Ò Ñ ÒØÓ Ð Ð ÓÖ ØÑÓ º½¼ ×
     ÓÖÖ ×ÔÓÒ ÓÒ Ð Ð ÖÙØ Ò edge connectivity()º  →
                                                 −
                                                            ÐÐ Ð Ö Ñ ÒØ × ÒÓØ
    ÕÙ ×        ÙØ Ò |V| − 1 Ñ Ü Ñ Þ ÓÒ × ×Ó Ö G º ÈÓÖ Ø ÒØÓ¸ Ð × ÑÔ ÒÓ × Ö
    V − 1× ´ × ÑÔ ÒÓ      Max Flow <Net> () (net)µº Ë ÑÔÐ ÑÓ× ÙÒ Ð ÓÖ ØÑÓ     ѹ
    ÔÙ ÔÓÖ ÔÖ ¹­Ù Ó¸ ÕÙ × Ð Ð ÓÖ ØÑÓ ÔÓÖ ÓÑ × ÓÒ¸ ÒØÓÒ × ÔÓ ÑÓ× Ò ÓÒØÖ Ö Ke(G) Ò
    (V − 1) × O(V 2E) = O(V 3E) Ô ×Ó׺
           Ð ÙÐ Ö → ¾¾ ØÓÑ O(E) Ô ×Ó׸ ÐÓ× Ù Ð × ×ÓÒ × ÒØÓØ Ñ ÒØ ×ÓÖ Ó× ÔÓÖ
                  −
                   G
     Ð forº Ð Ñ ×ÑÓ ÑÓ Ó¸ Ð Ñ Ò Ö Ö Ó× × Ð ÒØ × × Ò ¾¿ Ý Ê ×Ø ÙÖ Ö Ö Ó×
    × Ð ÒØ × × Ò ¾¿ ØÓÑ Ò Ð Ö Ó × Ð sink¸ Ð Ù Ð ÐÓ ×ÓÖ × ÒØÓØ Ñ ÒØ
    Max Flow <Net> () (net)º

    7.11.7     C´lculo de Kv(e)
                a
    Ç Ú Ñ ÒØ Ð ÓÒ Ø Ú           Ò ÒÓ Ó× ×Ø ×ØÖ Ñ ÒØ Ö Ð ÓÒ         ÓÒ ×Ù ÕÙ Ú Ð ÒØ
     Ò Ö Ó׺ × Ö Ø Ñ ÒØ          Ù Ð ÕÙ Kv(G) ≤ Ke(G)¸ ÔÙ × ÐÓ× Ö Ó× ÕÙ Ø ÖÑ Ò Ò
    Ke(G) ÒÓ ×ÓÐÓ      Ò Ö Ð ÓÒ Ö ÐÓ× ÒÓ Ó× ÕÙ × ÓÒ Ø Ò G¸ × ÒÓ ÕÙ × ÔÓ× Ð
    ÕÙ ÙÒÓ Ó Ñ × Ö Ó× ÐÓ× ÒÚÓÐÙ Ö Ó× Ò Ð ÓÖØ ÕÙ ÖÖÓ Ke(G) ÓÑÔ ÖØ ÒÓ Ó×
     ÒÚÓÐÙ Ö Ó× Ò Kv(G)º ÈÓ ÑÓ× Ð ÙÐ Ö¸ Ô٠׸ Kv(G) Ô ÖØ Ö Ð ÓÖØ Ñ Ò ÑÓº È Ö
     ÐÐÓ¸ Ñ ÒØ compute min cut()¸ Ð ÙÐ ÑÓ× Ð ÓÖØ Ñ Ò ÑÓ Ð Ö Ó Ý ÐÙ Ó Ñ Ö ÑÓ×
    ÐÓ× ÒÓ Ó× ÕÙ ÓÒØ Ò Ð ÓÖØ         ר ÓÒ ÙÒØÓ Ò Ö Ð ÓÒ ÐÓ× Ö Ó× Ð ÓÖØ Ð ÙÐ ÑÓ×
    Kv(G)º
        ÇØÖ ÐØ ÖÒ Ø Ú ÓÒ× ×Ø Ò × ÖÖÓÐÐ Ö ÙÒ Ð ÓÖ ØÑÓ × Ñ Ð Ö Ð º½¼º È ÖÓ Ô Ö
     ×ØÓ      ÑÓ× ÒØ ÖÔÖ Ø Ö ´Ó ÔÐ ÒØ Öµ Ð Ø ÓÖ Ñ     Å Ò Ö ´ º½ µ Ò ÙÒ ÓÒ ÒÓ¹
      Ó× Ý ÒÓ     Ö Ó׺ Ò ×Ø × ÒØ Ó¸ ÙÒ ÔÖ Ñ Ø Ú         Ð ÙÐÓ Kv(G)¸ ÒÓÑ Ò
    vertex connectivity()¸ Ð Ñ ×ÑÓ ×Ø ÐÓ ÕÙ edge connectivity Ô ÖÓ Ô Ö ÐÓ× ÒÓ Ó׸
     × ÜÔÓÖØ      Ò ALEPHº

    7.12       Flujos de coste m´
                                ınimo
     Ò Ó × ÓÒ ×¸ Ñ ÒØ Ò Ö ÙÒ ­Ù Ó ÔÓÖ ÙÒ Ö        ÖÖ   Óר ׺ ÓÒ× Ö ÑÓ× Ð ÙÒ × × ØÙ ¹
     ÓÒ ×
7.12. Flujos de coste m´
                       ınimo                                                     827



    ½º Ò ÙÒ Ö ÕÙ ÑÓ Ð Ð ÙÒ ­Ù Ó¸ Ñ ÒØ Ò Ö ÙÒ Ú ÐÓÖ ­Ù Ó ÓÒÐÐ Ú ÙÒ Óר
        Ò Ö Ø Ó Ó ÓÒÓÑ Ó¸ Ú × ÔÖÓÔÓÖ ÓÒ Ð Ð ÐÓÒ ØÙ                Ð ØÙ Ö º
    ¾º Ò ÙÒ Ö        ØÖ ¬ Ó Ö Ó Ñ ÒØ Ò Ö ÙÒ ­Ù Ó Ó ÔÓÖ Ð ÙÒ ÖÙØ Ø Ñ Ò ÒÚÓÐÙ Ö
        Óר × ÓÑ Ùר Ð ¸ ÒØ                 Ú ÓÒ ×¸ Ø º
    ¿º ÍÒ Ö Ð ØÖ Ö ÕÙ Ö Óר × Ñ ÒØ Ò Ñ ÒØÓ × ÙÒ Ð Ù                    ÓÒ Ó Ö ¬ º
  רÓ× ÑÔÐÓ× ÒÓ× Ô ÖÑ Ø Ò Ú ×ÐÙÑ Ö Ö ÕÙ Ý × ØÙ ÓÒ × Ò Ð × Ù Ð × ÒÓ ×ÓÐÓ Ù ÒØ
Ñ Ü Ñ Þ Ö Ð ÒØ             ­Ù Ó¸ × ÒÓ × Ø × Ö Ð ÙÒ Ö Ø Ö Ó ×Ùר ÒØ Ð          × ÙÒ ×
Ð Ò ÓÐ ÐÓ× Óר ׺
     ÄÓ× Óר × ÒÓ Ò × Ö Ñ ÒØ ×ÓÒ Ò ÓÐ ÓÒÓÑ Ý ÐÓ× ­Ù Ó× ÒÓ Ò × Ö Ñ ÒØ
Ö ÔÖ × ÒØ Ò Ð ÕÙ Ó׺ Ø ÒÓÖ           ÑÔÐÓ¸ ÙÒ ÔÐ ÓÒ Ð × × Ö Ð ÓÒ ÓÒ Ð ØÖ Ò×¹
ÔÓÖØ        Ò×ÙÑÓ× Ó Ñ Ö Ò ×º Ò ×Ø ×Ó Ð ÑÓ× ÙÒ Ö                        ØÖ Ò×ÔÓÖØ º Ä
   Ô           ­Ù Ó Ö ÔÖ × ÒØ Ð ØÖ Ò×ÔÓÖØ ×Ó               ÙÒ ÙÖ ÓÒº Ô Ö ¸ Ô٠׸
 Ð ÔÖÓ Ð Ñ Ñ Ü Ñ Þ Ö Ð ÒØ                  Ò×ÙÑÓ× ØÖ Ò×ÔÓÖØ Ö Ò Ð Ñ ÒÓÖ Ø ÑÔÓ ÔÓ× Ð º
     È Ö ØÖ Ø Ö ÔÖÓ Ð Ñ × ÕÙ Ò Ò Ò Ð Ñ Ü Ñ Þ ÓÒ ­Ù Ó Ð Ñ Ò ÑÓ Óר ¸
ÔÐ ÒØ Ö ÑÓ× Ð × Ù ÒØ ÑÓ ÐÓº
Definici´n 7.22 (Modelo de red capacitada con costes) ÍÒ Ö
       o                                                       Ô Ø
­Ù Ó ÓÒ Óר × × ÙÒ Ö     Ô Ø N =< V, E, s, t, C, C >º C : E −→ C¸             Ð ÙÐ
Ð ×Ó          Ö Ó ÙÒ ØÖ ÙØÓ    ÓÒ Ð¸ ÒÓÑ Ò Ó “coste”¸ ÕÙ Ö ÔÖ × ÒØ             Ð Óר
ÔÓÖ ÙÒ      ­Ù Óº
     Ð Óר ×Ó Ó ÙÒ Ö Ó × ÒÓØ ÓÑÓ c(a) Ý Ö ÔÖ × ÒØ ÐÓ ÕÙ Ù ×Ø ­Ù Ö ÙÒ
ÙÒ º
     Ð Óר ÙÒ ­Ù Ó ÔÓÖ ÙÒ Ö Ó a × ¬Ò ÓÑÓ
                                     (a) = f(a) c(a)                           ´ º¿ µ
    Ð Ó×ØÓ    ÙÒ ­Ù Ó    ÙÒ Ö ×        ¬Ò ÓÑÓ
                            (N) =          (e) =          f(e) c(e)            ´ º¿ µ
                                    ∀e∈E           ∀e∈E

      ÓÒ ×Ø ¬Ò ÓÒ¸ Ý ×Ø ÑÓ× ÔÖ Ô Ö Ó× Ô Ö ÒÙÒ Ö ÙÒ ÔÖÓ Ð Ñ Ò Ö Ð ÕÙ ÒÓ×
× ÖÚ Ö     ÙÒ Ñ ÒØÓ ×ÓÐÙ ÓÒ ÙÒ Ù Ò Ú Ö         ÓØÖÓ× ÔÖÓ Ð Ñ ×º
Definici´n 7.23 (Flujo m´ximo de coste m´
       o                a               ınimo) Ë N =< V, E, s, t, C, C > ÙÒ
Ö   Ô Ø      ÓÒ Óר ׺ ÍÒ ­Ù Ó Ñ Ü ÑÓ ×              ınimo” × ÒÓ Ü ×Ø ÓØÖÓ
                                             “coste m´
­Ù Ó Ñ Ü ÑÓ ÓÒ Óר Ñ ÒÓÖº
     Ò ÙÒ Ö    Ô Ø ÔÙ           Ö Ú Ö × ÓÒ¬ ÙÖ ÓÒ × ­Ù Ó× ÕÙ ÓÒÐÐ Ú Ò ÙÒ
­Ù Ó Ñ Ü ÑÓº ÈÓÖ ÑÔÐÓ¸ Ô Ö Ð Ö ÐÙ×ØÖ        Ò Ð ¬ ÙÖ º Ø Ò ÑÓ× Ó× ´Ó Ñ ×µ
 ÓÒ¬ ÙÖ ÓÒ × ÕÙ Ñ Ü Ñ Þ Ò Ð ­Ù Ó Ý ÕÙ ×ÓÒ ÑÓ×ØÖ × Ò Ð × ¬ ÙÖ × º ¹ Ý º ¹ ¸
Ö ×Ô Ø Ú Ñ ÒØ º Ñ Ó× ­Ù Ó× ×ÓÒ Ñ Ü ÑÓ׸ Ô ÖÓ Ð ÔÖ Ñ ÖÓ Ø Ò ÙÒ Óר     14860
Ñ ÒØÖ × ÕÙ Ð × ÙÒ Ó 16400º
    Ë ÑÓ× ÕÙ ÙÒ Ö       Ô Ø ÔÙ Ø Ò Ö Ú Ö × ÓÒ¬ ÙÖ ÓÒ × ÕÙ Ñ Ü Ñ Ò
 Ð ­Ù Óº × Ð × Ó× ×¸ ÔÙ   Ô Ö Ö× ÓÑÓ Ò ÓÕÙ ×ÓÐÙ ÓÒ Ð Ò ÓÒØÖ Ö ØÓ × Ð ×
 ÓÒ¬ ÙÖ ÓÒ × Ñ Ü Ñ × Ý ÒØÓÒ × × Ð ÓÒ Ö Ð      Ñ ÒÓÖ Óר ¸ Ô ÖÓ ÒØÓÒ × ÑÓ×
828                                                                              Cap´
                                                                                    ıtulo 7. Grafos



                                                    Ë


                                                  ¼» ¼    ¼»¾¼




                                                   ¿¼»     ¿¼»¾¼


                                 ¼» ¼


                                        ¿¼»½¼       ½¼»½


                                                           ¼»¾¼


                                 ¼»¿¼                                     ¼»½¼


                             ¿¼»½


                           ¼»¿            ¾¼»¿¼


                                 ¼»¿¼     Á


                                    ¼»¾¼               ¿¼» ¾¼»


                             À                ¼» ¼


                                    ½ »


                                  ¼»¾


                                              ¼»¿¼                 ¼» ¼


                                              Ã


                                                        ¿¼»¾


                                                  ¼»½          Â


                                                           ¼»¾¼


                                                   Ì




   ÙÖ º   ÑÔÐÓ ÙÒ Ö       Ô Ø    ÓÒ Óר ׺ ÈÖ Ñ Ö Ú ÐÓÖ                                   Ö Ó ÓÖÖ ×¹
ÔÓÒ Ð × Ô     ׸ Ñ ÒØÖ × ÕÙ Ð × ÙÒ Ó Ð Óר ÐÐ Ú Ö ÙÒ ÙÒ                                       ­Ù Óº
Ò Ð Ø ÖÖ ÒÓ ÐÓ ÒØÖ Ø Ð      Ñ × ÕÙ ×Ø Ö Ø Ö ÒØÖ Ø                                 Ð Ù Ùר Ñ ÒØ ÐÓ
Ò Ö ÒØ Ó ÓÖ Ò ÐÑ ÒØ ÔÓÖ ÐÓ× ×ØÙ Ó×Ó× Ð ­Ù Ó Ñ Ü ÑÓ Ý ÕÙ                           Ô ÖÓ Ò Ð × ×
 Ñ ÒÓ× ÙÑ ÒØÓ Ý ÑÔÙ          ÔÖ ¹­Ù Óº ÈÙ ×ØÓ ÕÙ Ñ × Ø Ò                           × Ñ Ü Ñ Þ ÓÒ
  ­Ù Ó × × ÖÚ Ò Ð Ö Ö × Ù Ð¸ × ÒØ Ö × ¬Ò Ö ÙÒ Ö Ö ×                               Ù Ð Ò Ð Ñ ØÓ
Óר º
Definici´n 7.24 (Red residual en una red capacitada con costes)
       o
  Ë N =< V, E, s, t, C, C > ÙÒ Ö    Ô Ø     ÓÒ Óר ׺ Ê ×Ô ØÓ    Ð ­Ù Ó¸ ×Ù Ö
Ö × Ù Ð × ÒØ         Ð Ð ¬Ò ÓÒ º½ ÓÒ Ð ÕÙ Ý ÑÓ× ØÖ            Ó¸ Ô ÖÓ¸ Ö ×Ô ØÓ
 Ð Óר ¸ ÐÓ× Ö Ó× Ö × Ù Ð × Ø Ò Ò Óר Ò Ø ÚÓ׺
   Ê ÓÖ ÑÓ× ÕÙ ÙÒ Ö Ó Ö × Ù Ð × ÙÒ Ö Ó Ö ØÖÓ ×Ó × Ö¸ ÔÓÖ ÓÒ × ÔÙ
   Ö Ñ ÒØ Ö ­Ù Óº × Ô٠׸ Ð ÕÙ ÙÒ Ö Ó Ö × Ù Ð Ø Ò Óר Ò Ø ÚÓ Ö ÔÖ × ÒØ Ð
    Ó ÕÙ Ð ×Ñ ÒÙ Ö Ð ­Ù Ó Ö ÙÐ ÒØ ÔÓÖ ×Ù Ö Ó Ö Ð ×Ñ ÒÙÝ Ð Óר º
   Ä ¬ ÙÖ × º ¹ Ý º ¹ ÑÙ ×ØÖ Ò Ð × Ö × Ö × Ù Ð × ÐÓ× ­Ù Ó× Ñ Ü ÑÓ× ÑÓ×ØÖ Ó×
 Ò Ð × ¬ ÙÖ × º ¹ Ý º ¹ ¸ Ö ×Ô Ø Ú Ñ ÒØ º Ò Ñ × ¬ ÙÖ × × ÔÙ Ò ÒÓØ Ö Ð
ÔÖ × Ò          ÐÓ× Ò Ø ÚÓ× × ÙÒ Ð Óר Ð ­Ù Óº Î ÑÓ׸ Ô٠׸ ÕÙ ÒØÖ ×Ø ÒØÓ×
­Ù Ó× ÔÓ× Ð ×¸ Ñ Ü ÑÓ× Ò ÐÙ× Ú ¸ × ÔÙ Ò Ø Ò Ö ÐÓ× Óר Ò Ø ÚÓ ÐÓ ÕÙ ×Ù Ö ¸
 Ù Ò Ó Ñ ÒÓ× ÔÓÖ ×ÙÖ Ó¸ ÕÙ Ð ­Ù Ó Ò Ù ×Ø ÓÒ ÒÓ ÔÙ × Ö Ñ Ò ÑÓ Óר º            ¸
 ÒØÓÒ ×¸ Ö ÔÐ ÒØ Ö Ð          ­Ù Ó Ø Ð º
Definici´n 7.25 (Flujo factible sobre una red capacitada con costes)
       o                                                                                 Ë   N =<
7.12. Flujos de coste m´
                       ınimo                                                                                                              829



                                  Ë                                                                    Ë


                          ¼» ¼» ¼         ¼» ¼»¾¼                                                ¼» ¼» ¼       ¼» ¼»¾¼




                                  ¿¼»¼» ¿¼»½¼»¾¼                                                      ¿¼»¿¼» ¿¼»½¼»¾¼


           ¼» ¼» ¼                                                                  ¼»¾¼» ¼


                       ¿¼»½¼»½¼       ½¼»¼»½                                                 ¿¼»¼»½¼       ½¼»¼»½


                                             ¼»½¼»¾¼                                                            ¼» ¼»¾¼


              ¼»¼»¿¼                                             ¼» ¼»½¼            ¼»¼»¿¼                                      ¼» ¼»½¼


          ¿¼»¼»½                                                                ¿¼»¾¼»½


      ¼» ¼»¿             ¾¼»¼»¿¼                                            ¼»¼»¿               ¾¼»¼»¿¼


               ¼»¼»¿¼     Á                                                          ¼»¾ »¿¼     Á


                  ¼»¼»¾¼              ¿¼»¼» ¾¼»¾¼»                                      ¼»¼»¾¼             ¿¼»¼» ¾¼»½ »


          À                   ¼»¼» ¼                                            À                    ¼»¾¼» ¼


                  ½ »¼»                                                                ½ »½ »


               ¼» ¼»¾                                                                ¼»½¼»¾


                              ¼»¾¼»¿¼                  ¼» ¼» ¼                                       ¼» ¼»¿¼              ¼» ¼» ¼


                              Ã                                                                  Ã


                                          ¿¼»¼»¾                                                             ¿¼»½¼»¾


                                  ¼» ¼»½       Â                                                      ¼» ¼»½        Â


                                             ¼» ¼»¾¼                                                            ¼» ¼»¾¼


                                      Ì                                                                 Ì




                       ´µ          ÑÓÒ ×¹Ã ÖÔ                                             ´ µ ÓÖ ¹ ÙÐ Ö×ÓÒ

          ÙÖ º                     Ó× ÓÒ¬ ÙÖ ÓÒ ×                          ­Ù Ó Ñ Ü ÑÓ Ô Ö Ð Ö                              Ð ¬ ÙÖ º

             ÙÒ Ö
V, E, s, t, C, C >   Ô Ø       ÓÒ Óר ׺ ÍÒ ­Ù Ó Ñ Ü ÑÓ × Ø Ð × Ý ×ÓÐÓ ×
 ר ÒÓ ÓÒØ Ò ÐÓ× Óר Ò Ø ÚÓº
    Ä Ø Ð      ×ØÖ Ò ÕÙ × ×ÙÖ Ó Ø Ò Ö ÐÓ× Ò Ø ÚÓ׺ È ÖÓ ×Ø Ö Ø Ö
   ×ÙÖ Ó Ø Ò Ô     Ö Ú Ð ÓÖ ¸ Ø Ð ÓÑÓ Ú Ö ÑÓ× Ò Ð × Ù ÒØ ÔÖÓÔÓ× ÓÒ ÙÒ ¹
Ñ ÒØ к
Proposici´n 7.18
         o          ÍÒ ­Ù Ó Ñ Ü ÑÓ ×      Óר Ñ Ò ÑÓ × Ý ×ÓÐÓ × ×Ù Ö Ö × Ù Ð ÒÓ
 ÓÒØ Ò ÐÓ× Ò Ø ÚÓ׺
Demostraci´no      È Ö Ð ÔÖ Ò× ÓÒ¸ × Ñ Ò ×Ø Ö Ö ÓÖ Ö Ð              Ö ÙÐ ÓÒ Ý Ð
Ø ÓÖ Ñ º½         × ÓÑÔÓ× ÓÒ ­Ù Ó Ò ÐÓ× Ó Ö ÙÐ ÓÒ ×º Ò ×Ø × ÒØ Ó¸ ÓÒ× ¹
  Ö ÑÓ× ÙÒ ÐÓ ´Ò Ø ÚÓ Ó ÒÓµ ÓÑÓ ÙÒ Ö ÙÐ ÓÒ Ò Ð Ö º ÓÖ ÔÐ ÒØ ÑÓ× ÐÓ×
 Ó× Ñ ÒÓ× ÑÓ×ØÖ Ø ÚÓ×
   ¯ =⇒ ´ÔÓÖ ÓÒØÖ        ÓÒµ ×ÙÔÓÒ ÑÓ× ÕÙ Ø Ò ÑÓ× ÙÒ ­Ù Ó Ñ Ü ÑÓ Óר Ñ Ò ÑÓ
      ÙÝ Ö Ö × Ù Ð ÓÒØ Ò ÙÒ ÐÓ             Óר Ò Ø ÚÓº Ë u Ð Ö Ó Ð ÐÓ ÓÒ
     Ñ ÒÓÖ Ô           Ö ×Ø ÒØ ÓÒ Ú ÐÓÖ cmº ÓÖ ÙÑ ÒØ ÑÓ× Ð ­Ù Ó Ð Ö
     ØÖ Ú × Ð ÐÓ Ò cm ×ÙÑ Ò Ó× ÐÓ ØÓ Ó× ÐÓ× Ö Ó× Óר ÔÓ× Ø ÚÓ ´           Ð ÒØÓµ
     Ý Ö ×Ø Ò Ó× ÐÓ ØÓ Ó× ÐÓ× Ö Ó× Óר Ò Ø ÚÓ ´ Ö ØÖÓ ×Óµº ÈÙ ×ØÓ ÕÙ ×ØÓ×
       Ñ Ó× ÒÓ Ø Ò Ð ÔÖÓÔ               ÓÒ× ÖÚ ÓÒ Ð ­Ù Ó¸ Ð ­Ù Ó Ö ÙÐ ÒØ × Ð
     Ñ ×ÑÓ Ý¸ ÔÓÖ Ø ÒØÓ¸ ÙÒ Ñ Ü ÑÓ¸ Ô ÖÓ ×Ù Óר ×Ñ ÒÙÝ Ò cm¸ ÐÓ ÕÙ ÓÒØÖ
830                                                                                                                        Cap´
                                                                                                                              ıtulo 7. Grafos




                                                                                                                                                                   ¼»¹ ¼


                                                                         Ì                                                                                         Â


                                                  ¼»¹ ¼      ½¼»¾¼      ¼»¹¾¼                                                                                      ¼»¹¾¼


                                          À                        Â             ¼»¹½                                                                 ½¼»¹¾        Ì       ¾¼»¾


                                                     ¼»¹¾        ½¼»¾   ¿¼»¾            ¿¼»                                                 ¼»¹¿¼          ¼»¹½    ½¼»½


                 ¿¼»                              ½ »             Ã                                                                  ½ »¹             Ã


                                 ¼»¾¼                   ¾¼»¹¿¼ ¿¼»¿¼                          ¾¼» ¼       ¾¼»¹ ¼                             ¼»¾     ½¼»¹¾


                                          ¼»¿¼                                                                         »   ½ »¹             À


                                              ¼» ¼                                                                          ¼»¾¼


          ¼»¹¿               Á                       ¾¼»¹                                             Á                              ¾ »¿¼ ¾ »¹¿¼                                      ¼»¹½¼


 ¼»¹½¼                              ¾¼»¿¼                                                                     ¾¼»¿¼


                 Ë                                                                                                                                         ¼»¿             Ë


                     ¼»¹ ¼   ¿¼»½       ½¼»¹½¼   ¾¼»½¼                                                    ¾¼»¹½    ½¼»½             ¿¼»½¼                     ¼»¹ ¼


                                                          ¼»¿¼                                                               ¼»¿¼


                                   ½¼» ¼ ¼»¹ ¼               ½¼»¹¾¼             ¿¼»¾¼                                      ¾¼»¹ ¼   ¿¼» ¼                  ¼»¹¾¼


           ¼»¹¾¼                                   ¿¼»                                                                                              ¿¼»¹                       ¼»¹¾¼


                                              ½¼»½                                                                                     ½¼»½




                             ¾¼»¾¼       ½¼»¹¾¼                                                                                                        ½¼»¹¾¼      ¾¼»¾¼




                                    ´µ º ¹                                                                                        ´ µ º ¹

   ÙÖ º Ê × Ö × Ù Ð × Ô Ö ÐÓ× ­Ù Ó× Ñ Ü ÑÓ× Ð × ¬ ÙÖ × º ¹ Ý º ¹
ºÈÖ    ¬ ÙÖ × Ö × ÐØ ÐÓ× Ò Ø ÚÓ× × ÙÒ Ð Óר º
         Ð ×ÙÔÓ× ÓÒ ÕÙ Ð Óר × Ñ Ò ÑÓº ÈÓÖ Ø ÒØÓ¸ × ÙÒ ­Ù Ó Ñ Ü ÑÓ × Ñ Ò ÑÓ
          Óר ¸ ÒØÓÒ × ×Ø ÒÓ ÔÙ Ø Ò Ö ÐÓ× Ò Ø ÚÓ×
  ¯      ⇐= ´ÔÓÖ ÓÒØÖ       ÓÒµ ÓÖ ×ÙÔÓÒ ÑÓ× ÕÙ Ø Ò ÑÓ× ÙÒ ­Ù Ó Ñ Ü ÑÓ f¸ × Ò
            ÐÓ× Ò Ø ÚÓ׸ ÙÝÓ Óר ÒÓ × Ñ Ò ÑÓº ÓÖ ×ÙÔÓÒ ÑÓ× ÙÒ ­Ù Ó Ñ Ü ÑÓ
          Ù ÐÕÙ Ö f ¸ × Ò ÐÓ× Ò Ø ÚÓ׸ ÙÝÓ Óר ÒÓ × Ñ Ò ÑÓº
         Ë ÙÒ Ð Ø ÓÖ Ñ º½           × ÓÑÔÓ× ÓÒ ­Ù Ó¸ ÔÓÖ Ð Ú      ÔÐ ÓÒ Ð Ð¹
          ÓÖ ØÑÓ º ¸ ÔÓ ÑÓ× Ò ÓÒØÖ Ö ÐÓ Ñ × E ÐÓ× Ð ­Ù Ó f Ø Ð ÕÙ Ð ×ÙÑ ÖÐÓ×
         Ó Ø Ò ÑÓ× Ð ­Ù Ó f º Ë Ò Ñ Ö Ó¸ ÔÙ ×ØÓ ÕÙ f ÒÓ Ø Ò ÐÓ× Ò Ø ÚÓ׸ ר ÓÔ¹
          Ö ÓÒ ÒÓ ÔÓ Ö        Ö Ð Óר ØÓØ Ð¸ ÐÓ ÕÙ × ÙÒ ÓÒØÖ ÓÒº ÈÓÖ ÓÒ× Ù ÒØ ¸
         × ÙÒ ­Ù Ó ÒÓ Ø Ò ÐÓ× Ò Ø ÚÓ׸ ÒØÓÒ × ×Ø × Ñ Ü ÑÓ Ý          Óר Ñ Ò ÑÓ

     Ð ÓÒÓ Ñ ÒØÓ ÕÙ ÒÓ× ÖÖÓ ×Ø Ø ÓÖ Ñ × Ð ×    ÙÒ Ñ         Ð ÓÖ ØÑÓ×
ÕÙ Ð ÙÐ Ò Ð ­Ù Ó Ñ Ü ÑÓ ÙÝÓ Óר × Ñ Ò ÑÓº ÙÒ Ñ ÒØ ÐÑ ÒØ ¸ ר Ð ×
 Ð ÓÖ ØÑÓ× × ×ØÖÙ ØÙÖ Ò ×
Algoritmo 7.11 (Algoritmo gen´rico de eliminaci´n de ciclos negativos)
                             e                  o                                                                                                          Ä Ò¹
ØÖ     Ð Ð ÓÖ ØÑÓ × ÙÒ Ö   Ô Ø         Óר × Nº
   Ä × Ð × Ð Ñ ×Ñ Ö ÓÒ Ð ­Ù Ó Ñ Ü ÑÓ ÙÝÓ Óר × Ñ Ò ÑÓº
  ½º Ð ÙÐ ÙÒ ­Ù Ó Ò Ð ×Ó Ö N ´ÔÙ × Ö ÙÒ ­Ù Ó Ñ Ü ÑÓµ
7.12. Flujos de coste m´
                            ınimo                                                      831



       ¾º   while N     ÓÒØ Ò      ÐÓ× Óר Ò Ø ÚÓ
            ´   µ Ë C ÙÒ ÐÓ Óר Ò Ø ÚÓ ×Ó Ö Nº Ë cm Ð Ñ Ò Ñ Ô                    Ö ×Ø ÒØ
                     Ð ÐÓº
           ´    µ ÙÑ ÒØ Ð ­Ù Ó N Ò Ð Ú ÐÓÖ cmº
        ÈÖ         × ÖÖÓÐÐ Ö ×Ø Ý ÓØÖÓ× Ð ÓÖ ØÑÓ׸ × Ò × Ö Ó ÒרÖÙÑ ÒØ Ö ÙÒ Ñ ÕÙ Ò Ö
       ׸Р      Ù Ð ÔÖ × ÒØ Ö ÑÓ× Ò Ð ÔÖÓÜ Ñ ×Ù ¹× ÓÒº

     7.12.1      El TAD Net Max Flow Min Cost<TNode,TArc,T>
      Ð Ì Net Max Flow Min Cost<TNode,TArc,T> ÒרÖÙÑ ÒØ Ð Ñ ÕÙ Ò Ö Ò × Ö
     Ô Ö ÓÔ Ö Ö Ö × ­Ù Ó ÓÒ Óר × ×Ó Ó׺ ËÙ ×Ô ¬ ÓÒ Ö × Ò Ð Ö ÚÓ
     tpl maxflow mincost.Hº
        Net Max Flow Min Cost<TNode,TArc,T>    ×        ÙÒ Ñ ÒØ      ×Ó Ö
     Net Graph<TNode,TArc,T> ÓÒ Ð Ò        Ó ÕÙ ×Ù× Ö Ó× Ð Ö Ò Ò ÓÖÑ ÓÒ
     Ô Ö Ð Óר
¿½     Ö Ó ÓÒ Óר ¿½ ≡
          template <typename Arc_Info, typename F_Type = long>
      class Net_Cost_Arc : public Net_Arc<Arc_Info, F_Type>
      {
        typedef F_Type Flow_Type;
        Flow_Type cost;
        Flow_Type flow_cost() const { return this->flow*cost; }
      };

      ÓÑÓ Ú ÑÓ׸ ×ÓÐÓ × Ò        Ð Óר ÔÓÖ ÙÒ          ­Ù Óº ÄÓ× ÒÓ Ó× ×ÓÒ ÐÓ× Ñ ×ÑÓ× ÕÙ
     Ô Ö Net Graph<TNode,TArc,T>º
          ÓÒ ÐÓ ÒØ Ö ÓÖ¸ Ý ÔÓ ÑÓ× ¬Ò Ö Ð Ì        Net Max Flow Min Cost<TNode,TArc,T>
¿½     Ð × Net Max Flow Min Cost<TNode,TArc,T>    ¿½ ≡
          template <class NodeT, class ArcT>
      class Net_Max_Flow_Min_Cost : public Net_Graph<NodeT, ArcT>
      {
       Å ØÓ Ó× ÔÙ Ð Ó× Net Max Flow Min Cost<TNode,TArc,T> ¿½
      };
      Ð Ù×Ó × × Ñ Ð Ö Ð         ÐÓ× Ö Ó× Ý Ö × × ×Ô ¬ Ò ÐÓ× ÒÓ Ó× ØÖ Ú ×
       Ð Ø ÔÓ Net Node<Node Info,F Type>¸ ÐÓ× Ö Ó× ÓÒ Net Cost Arc Ý Ð Ö ÓÒ
     Net Max Flow Min Cost<TNode,TArc,T>º
         ÍÒ ÔÖ Ñ Ö Ñ ØÓ Ó Net Max Flow Min Cost<TNode,TArc,T> ÓÒ× ×Ø Ò Ó Ö Ö Ð
       Ô           ÓÒ×ÙÐØ Ö Ó ÑÓ ¬ Ö Ð Óר ×Ó Ó ÙÒ Ö Ó
¿½    Å ØÓ Ó× ÔÙ Ð Ó× Net Max Flow Min Cost<TNode,TArc,T> ¿½ ≡ ´ ¿½ µ ¿½
      Flow_Type & get_cost(Arc * a) { return a->cost; }
     × ÓÑÓ ÓÒ×ÙÐØ Ö Ð Óר Ð ­Ù Ó
¿½   Å ØÓ Ó× ÔÙ Ð Ó× Net Max Flow Min Cost<TNode,TArc,T>       ¿½ +≡     ´ ¿½ µ   ¿½   ¿¾
      const Flow_Type & flow_cost(Arc * a) const { return a->flow_cost(); }
832                                                           Cap´
                                                                      ıtulo 7. Grafos



        ÈÙ ×ØÓ ÕÙ Ò ×Ø ÑÓ ÐÓ × Ö ÕÙ Ö Ð Óר ¸ Ø Ò ÑÓ× Ð Ò ×                    ×Ó Ö Ö Ö
     Ð Ò× Ö ÓÒ Ö Ó
¿¾    Å ØÓ Ó× ÔÙ Ð Ó× Net Max Flow Min Cost<TNode,TArc,T> ¿½ +≡        ´ ¿½ µ    ¿½      ¿¾
       virtual Arc * insert_arc(Node * src_node, Node * tgt_node,
                                const Flow_Type & cap, const Flow_Type & cost)
       {
         Arc * a = Net::insert_arc(src_node, tgt_node, Arc_Type(), cap, 0);
         a->cost = cost;
         return a;
       }
     ÇØÖ ÐØ ÖÒ Ø Ú × ÑÔÐ Ö Ù ÐÕÙ Ö ÔÖ Ñ Ø Ú Ò× Ö ÓÒ Net Graph<TNode,TArc,T>
     Ý ÐÙ Ó ×Ô ¬ Ö Ð Óר ¸ Р٠и × ÙÒ Ð ÓÒרÖÙ ØÓÖ Net Cost Arc¸ Ø Ñ Ò ØÓÑ
     Ú ÐÓÖ ÓÑ × ÓÒ ÖÓº
          Ð Óר Ð ­Ù Ó Ö ÙÐ ÒØ ÔÓÖ Ð Ö × Ð ÙÐ × ÙÒ ´ º¿ µ Ý × ÒרÖÙÑ ÒØ ×
¿¾    Å ØÓ Ó× ÔÙ Ð Ó× Net Max Flow Min Cost<TNode,TArc,T> ¿½ +≡ ´ ¿½ µ ¿¾
       Flow_Type compute_flow_cost()
       {
         Flow_Type total = 0;
         for (Arc_Iterator<Net_MFMC> it(*this); it.has_current(); it.next())
           {
             Arc * a = it.get_current();
             if (not a->is_residual)
               total += a->flow_cost();
           }
         return total;
       }
     Í× × Arc Iterator   º
            ¬Ò Ó Ð Ì Net Max Flow Min Cost<TNode,TArc,T>¸ ÒÓ× Ó Ö ÑÓ×                 × ÖÖÓ¹
     ÐÐ Ö ÓØÖ × Ô Þ × ÕÙ Ö ÕÙ Ö ÑÓ× Ô Ö ÒרÖÙÑ ÒØ Ö Ð Ð ÓÖ ØÑÓ º½½º
     7.12.1.1    Acceso al coste de un arco

     ÇØÖÓ Ö ÕÙ Ö Ñ ÒØÓ Ð Ð ÓÖ ØÑÓ º½½ × Ð ÔÓ Ö Ø Ø Ö ÐÓ× Ò Ø ÚÓ׺ È Ö ÐÐÓ¸ ÒÓ×
     × ÖÚ ÑÓ× Ð Ð ÓÖ ØÑÓ       ÐÐÑ Ò¹ ÓÖ ÔÖ × ÒØ Ó Ò Ü º º¿ ´Ô Ò ¾ µº Ð Ð ÓÖ ØÑÓ
           ÐÐÑ Ò¹ ÓÖ ¸ × ÓÑÓ ÐÓ× Ñ × Ð ÓÖ ØÑÓ×        Ð ÙÐÓ     Ñ ÒÓ× Ñ Ò ÑÓ׸ Ö ÕÙ Ö
     ÙÒ Ð ×           ×Ó Ð ×Ø Ò ´Ú × Ü º º½ ´Ô Ò            µµº Ò ÒÙ ×ØÖÓ ×Ó¸      ÑÓ×
     ÑÓ Ð Þ Ö Ð Óר Ò ÙÒ ÓÒ Ð Ú ÐÓÖ ­Ù Ó Ö ÙÐ ÒØ ÔÓÖ Ð Ö Ó Ý ÓÒ× Ö Ö × ×Ø
      × Ó ÒÓ Ö × Ù Ðº ×ØÓ ÐÓ     ÑÓ× × Ù Ò Ó Ð × Ö Ð ×       ¬Ò ÓÒ        ×Ó Ô ×Ó×
     ÐÓ× Ö Ó×
¿¾     ÙÒ ÓÒ × Ô Ö Net Max Flow Min Cost<TNode,TArc,T> ¿¾ ≡            ¿¿
           template <class Net>
       class Access_Cost
       {
         typename Net::Flow_Type operator () (typename Net::Arc * a) const
         {
           return a->is_residual ? -((typename Net::Arc *) a->img_arc)->cost : a->cost;
         }
       };
7.12. Flujos de coste m´
                            ınimo                                                 833



      ÓÒ ×Ø Ð × ¸ ÒרÖÙ ÑÓ× Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ Ô Ö ÕÙ Ö Ð             ×Ù× Ð ÙÐÓ× Ò
     ÙÒ ÓÒ Ð Óר Ð ­Ù Ó Ö ÙÐ ÒØ ×Ó Ö ÙÒ Ö Ö × Ù Ðº
     7.12.2     Algoritmos de m´ximo flujo con coste m´
                                 a                   ınimo mediante elimi-
                naci´n de ciclos
                    o
        ÓÖ ×ÔÓÒ ÑÓ× ØÓ Ó ÐÓ Ò × Ö Ó Ô Ö ÒרÖÙÑ ÒØ Ö Ú Ö ÒØ × Ð Ð ÓÖ ØÑÓ º½½º
      ÙÒ Ñ ÒØ ÐÑ ÒØ ¸ ÔÖ × ÒØ Ö ÑÓ× Ó× Ð ÓÖ ØÑÓ׸ ÙÝ Ö Ò ×ØÖ Ò Ð Ñ Ò Ö
      Ò ÕÙ × Ð ÙÐ ÙÒ Ú ÐÓÖ ­Ù Ó Ò Ðº
     7.12.2.1    Eliminaci´n de ciclos con flujo m´ximo inicial
                          o                      a

     ÆÙ ×ØÖ ÔÖ Ñ Ö Ú Ö ÒØ ÑÔÐ ÙÒ ­Ù Ó Ñ Ü ÑÓ Ò Ðº ÈÙ ×ØÓ ÕÙ ×ÔÓÒ ÑÓ× ÙÒ
      ÓÑÔÐ Ø Ñ Ð        Ð ÓÖ ØÑÓ× Ô Ö Ñ Ü Ñ Þ Ö ­Ù Ó¸ Ð Ö Ø Ö Ó Ñ Ü Ñ Þ ÓÒ × Ö ÙÒ
     Ô Ö Ñ ØÖÓ Ð ÔÖ Ñ Ø Ú
¿¿     ÙÒ ÓÒ × Ô Ö Net Max Flow Min Cost<TNode,TArc,T> ¿¾ +≡      ¿¾ ¿
           template <class Net, template <class> class Max_Flow_Algo>
       void max_flow_min_cost_by_cycle_canceling(Net & net, bool leave_residual = false)
       {
         typedef Aleph::less<typename Access_Cost<Net>::Distance_Type> Cmp_Dist;
         typedef Aleph::plus<typename Access_Cost<Net>::Distance_Type> Plus_Dist;
         typedef Res_F<Net> Res_Filter;
         Max_Flow_Algo <Net> () (net, true); // obtiene un flujo m´ximo inicial
                                                                  a
         Path<Net> cycle(net); // aqu´ se guardan ciclos negativos
                                     ı
             // eliminar ciclos negativos mientras estos existan
                                                   ´
         while (Bellman_Ford_Negative_Cycle
                <Net, Access_Cost<Net>, Cmp_Dist, Plus_Dist, Res_Filter>()(net, cycle))
           if (increase_flow <Net> (net, cycle) == 0)
               break;
         if (not leave_residual)
           net.unmake_residual_net();
       }
     Í× × Path ¼¾ º
      Ä Ö Ñ ÜÑÞ            Óר Ñ Ò ÑÓ Ð ÙÐ ÔÓÖ ×Ø ÔÖÓ Ö Ñ ÓÒ Ð Ð ÓÖ ØÑÓ
      ÓÖ ¹ ÙÐ Ö×ÓÒ × ÑÓ×ØÖ     Ò Ð ¬ ÙÖ º º Ð Óר Ñ Ò ÑÓ Ð ­Ù Ó Ñ Ü ÑÓ × 13620º
           Ò ×Ø ÑÓÑ ÒØÓ ÔÙ        Ö× ÕÙ ÒÓ× Ò ÓÒØÖ ÑÓ× Ò ÙÒ ÔÙÒØÓ ÙÐÑ Ò ÒØ     ר
     Ø ÜØÓº ÓÑÓ Ú ÑÓ׸ Ð ÖÙØ Ò max flow min cost by cycle canceling() ÒרÖÙÑ ÒØ
      Ð Ð ÓÖ ØÑÓ º½½ ÙÒ Ñ Ò Ö ÔÖ Ø Ñ ÒØ            ÒØ      × ÑÔÐ     ÔÓ× Ð Ö ×
        ÕÙ ÒÓ× ÔÓÝ ÑÓ× ×Ó Ö ØÓ ÙÒ Ñ ÕÙ Ò Ö            רÖÙ ØÙÖ    ØÓ× Ý Ð ÓÖ ØÑÓ׺
       Ò ×Ø ×Ó¸ ÔÓ ÑÓ× Ñ Ò ÓÒ Ö Ð Ì List Graph<Node, Arc> × ÓÑÓ ×Ù× Ð × ×
        Ö Ú ×º Ð Ñ ×ÑÓ ÑÓ Ó¸ ר Ð ÓÖ ØÑÓ ×Ù Ý ×Ó Ö ÓØÖÓ× Ð ÓÖ ØÑÓ׸ ÐÓ× Ù Ð ×
           Ñ Ò ÓÒ Ö Ð Ù×ÕÙ          Ñ ÒÓ× ÙÑ ÒØÓ¸ Ñ Ü Ñ Þ ÓÒ ­Ù Ó¸ Ñ ÒÓ× Ñ ×
      ÓÖØÓ× Ý ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ׸ ÒØÖ ÓØÖÓ׸ ÐÓ× Ù Ð × ×Ù Ú Þ ×Ù Ý Ò Ò
     Ñ × ×ØÖÙ ØÙÖ ×     ØÓ× Ý Ð ÓÖ ØÑÓ׺
     7.12.2.2    Eliminaci´n de ciclos mediante supra-arco negativo
                          o

     ÇØÖÓ Ð ÓÖ ØÑÓ × Ó Ð Ñ Ò ÓÒ           ÐÓ× Ò Ø ÚÓ× Ô ÖØ × ÙÒ Ú ÐÓÖ ­Ù Ó ÒÙÐÓº
     ÄÙ Ó × ÙÑ ÒØ Ð ­Ù Ó Ò ÙÒ Ú ÐÓÖ        Ó¸ × Ð Ñ Ò Ò ÐÓ× Ò Ø ÚÓ× Ý × ÚÙ ÐÚ Ù¹
834                                                                                          Cap´
                                                                                                ıtulo 7. Grafos



                                                   Ë


                                           ¼» ¼» ¼ ¼» ¼»¾¼




                                               ¿¼»¾¼» ¿¼»½¼»¾¼


                             ¼»¼» ¼


                                      ¿¼»¿¼»½¼         ½¼»½¼»½


                                                              ¼»¾¼»¾¼


                             ¼»¼»¿¼                                            ¼» ¼»½¼


                         ¿¼»½¼»½


                     ¼»¼»¿                ¾¼»¼»¿¼


                             ¼»¿¼»¿¼       Á


                                   ¼»½¼»¾¼             ¿¼»¼»¾¼»¾¼»


                             À                 ¼»¼» ¼


                                   ½ »¼»


                                 ¼» ¼»¾


                                               ¼»¾¼»¿¼               ¼» ¼» ¼


                                               Ã


                                                           ¿¼»¼»¾


                                                   ¼» ¼»½        Â


                                                             ¼» ¼»¾¼


                                                       Ì




   ÙÖ º     ÐÙ Ó Ñ Ü ÑÓ Óר Ñ Ò ÑÓ Ð Ö                                          Ð ¬ ÙÖ º ÔÖÓ Ù Ó ÔÓÖ Ð
Ð Ñ Ò ÓÒ       ÐÓ× ÓÒ ­Ù Ó Ñ Ü ÑÓ Ò Ð

Ñ ÒØ Ö Ð ­Ù Óº Ð ÔÖÓ Ñ ÒØÓ × ÔÐ ×Ù × Ú Ñ ÒØ ר ÕÙ Ý ÒÓ Ý Ò ÐÓ× Ò ¹
 Ø ÚÓ× ÑÓÑ ÒØÓ Ò Ð Ù Ð¸ ÔÓÖ Ð ÓÒÓ Ñ ÒØÓ ÕÙ ÒÓ× ÔÓÖØÓ Ð ÔÖÓÔÓ× ÓÒ º½ ´⇐=µ¸
× ÑÓ× ÕÙ Ð ­Ù Ó × Ñ Ü ÑÓº
       ÓÖ     Ò¸ ÔÓÖ Ù Ð Ú ÐÓÖ ­Ù Ó ÓÑ ÒÞ Ö Ë Ò Ü ×Ø Ò Ú Ö × Ý ÒØ Ù ×
Ø Ò × ½ ¸ ¿½¸ ¾ ¸ ÙÒ ÕÙ × Ö Ø Ö Þ ÔÓÖ ×Ù × ÑÔÐ         Ý Ú ÐÓ    ¹Ö Ð Ø Ú
Ð Ð×        Ð ÓÖ ØÑÓ¹¸ ÓÒ× ×Ø Ò Ò Ö ÙÒ Ð ÞÓ ÒØÖ Ð Ù ÒØ Ý Ð ×ÙÑ ÖÓ ÓÒ ­Ù Ó
Ñ ÝÓÖ Ð Ñ Ü ÑÓ Ý Óר Ò Ø ÚÓ ÙÝÓ Ú ÐÓÖ ×ÓÐÙØÓ × Ñ ÝÓÖ Ð Óר ØÓØ Ð Ù ÐÕÙ Ö
  Ñ ÒÓ ÒØÖ Ð Ù ÒØ Ý Ð ×ÙÑ ÖÓº ר Ð ÞÓ ÐÓ ÐÐ Ñ ÑÓ× ×ÙÔÖ ¹ Ö Ó º ר ØÖÙ Ó
ÒÓ× Ô ÖÑ Ø Ö Ú Ö Ð Ð ÙÐÓ Ò Ð Ð ­Ù Ó Ñ Ü ÑÓ Ö Ø Ö Ø Ú Ñ ÒØ Ð ÙÐ Ò Ó Ð
Ñ Ò ÑÓ Óר Ð Ú Þ ÕÙ Ñ Ü Ñ Þ ÑÓ× Ð Ö º Ä         × Ö Ö ÙÒ ÐÓ Ò Ø ÚÓ Ò Ð¸
 Ù Ð ÔÙ Ô ØÓÖ Þ Ö× Ð × Ù ÒØ ÑÓ Ó


                 s                                          Red                          t




                                                           f > max/ − VC − 1

ÄÓ× ÐÓ× ÕÙ ÓÒØ Ò Ò Ð ×ÙÔÖ ¹ Ö Ó ÙÒ Ò    Ñ ÒÓ×    ÙÑ ÒØÓ¸ ÔÙ × Ò ÐÙÝ Ò ÙÒ
  Ñ ÒÓ ÒØÖ Ð Ù ÒØ Ý Ð ×ÙÑ ÖÓº ÍÒ ÒØ ÒØÓ    Ð Ñ Ò ÓÒ     ר ÐÓ ÑÙ Ú Ð
7.12. Flujos de coste m´
                           ınimo                                                     835



    Ñ ÝÓÖ ÒØ         ÔÓ× Ð ­Ù Ó Ð ×ÙÔÖ ¹ Ö Ó            Ð Ñ ÒÓ ÙÑ ÒØÓ ÒØÖ Ð Ù ÒØ
    Ý Ð ×ÙÑ ÖÓº Ë ÙÒ × Ð Ú ÐÓÖ Ð ×Ð ÓÒ Ñ Ò ÑÓ Ð ÐÓ ÔÙ Ó ÒÓ Ð Ñ Ò Ö× º × ¸
     ר Ð ×          ÐÓ× ÙÑ ÒØ Ð ­Ù Óº
        ÄÓ× ÐÓ× ÕÙ ÒÓ ÓÒØ Ò Ò Ð ×ÙÔÖ ¹ Ö Ó ×Ø Ò ÓÑ Ò Ó׸ Ò Ð × ÒØ Ó × Ö Ò Ø ÚÓ×
    ÔÓÖ Ö Ó× Ö ØÖÓ ×Ó ´Ó Ö × Ù Ð ×µº ËÙ Ð Ñ Ò ÓÒ Ö Ù Ð Óר ØÓØ Ð Ð ­Ù Óº
          Ð Ò ÓÕÙ ÒØ Ö ÓÖ Ø Ò Ð Ö Ò Ú ÒØ           × Ö Ö Ð Ø Ú Ñ ÒØ × Ò ÐÐÓ ÑÔÐ Ñ Ò¹
    Ø Ö¸ ÔÙ × ÒÓ Ö ÕÙ Ö ÜÔÐ Ø Ñ ÒØ Ô Ò× Ö Ò Ð ÓÖ ØÑ               ­Ù Ó Ñ Ü ÑÓ¸ Ñ ÒÓ×
     ÙÑ ÒØÓ Ý ÓØÖ × Ó× ×º ËÓÐÓ Ö ÕÙ Ö ÑÓ× Ð × ×ØÖÙ ØÙÖ ×       ØÓ׸ Ð Ð ÓÖ ØÑÓ   ÐÐÑ Ò¹
     ÓÖ Ý Ð Ð ÓÖ ØÑÓ Ì Ö Ò¸ Ù Ð × ×ÓÒ Ö Ð Ø Ú Ñ ÒØ × Ò ÐÐÓ× ÑÔÐ Ñ ÒØ Öº רÓ
     Ó Ö Ö ÑÔÓÖØ Ò ¸ ×Ó Ö ØÓ Ó¸ × ÒÓ ×ÔÙ× Ö ÑÓ× ÙÒ ÓÖÔÙ× Ð ÓØ Ö Ó × Ñ Ð Ö
     Ð ×Ø Ø ÜØÓº
          Ð ÔÖ Ñ Ö Ô ×Ó      Ð × ÒÓ ×Ø Ð ÓÖ ØÑÓ × ÔÐ ÒØ Ö Ð Ò× Ö ÓÒ Ð ×ÙÔÖ ¹ Ö Ó
¿     ÙÒ ÓÒ × Ô Ö Net Max Flow Min Cost<TNode,TArc,T> ¿¾ +≡             ¿¿ ¿
         template <class Net, template <class> class Cost> static
     typename Net::Arc * create_dummy_arc(Net & net)
     {
       const typename Net::Flow_Type max_cost =
         net.get_num_nodes() * search_max_arc_cost <Net, Cost> (net);
       net.make_residual_net();
       typename Net::Node * src = net.get_source();
       typename Net::Node * tgt = net.get_sink();
       const typename Net::Flow_Type max_flow =
         Aleph::min(net.get_out_cap(src), net.get_in_cap(tgt));
       typename Net::Net::Digraph * digraph = &net;
       typename Net::Arc * a =
         digraph->insert_arc(src, tgt, typename Net::Arc_Type());
       net.get_cookie() = a;
       typename Net::Arc * img =
             digraph->insert_arc(tgt, src, typename Net::Arc_Type());
       digraph->desconnect_arc(a); // no es supra-arco, pero se deja por coste
       a->is_residual = false;
       a->img_arc     = img;
       a->cap         = max_flow;
       a->cost        = max_cost;
       a->flow        = 0;
       img->is_residual = true;
       img->img_arc     = a;
       img->cap         = max_flow;
       img->cost        = max_cost;
       img->flow        = 0;
       return img;
     }
    È Ö ÕÙ Ð Ð × Ó × ÖÚ ÓÒ               ר Ò Access Cost ÓÒ× Ö Ð ×ÙÔÖ ¹ Ö Ó Ò Ø ÚÓ¸
     ר       × Ö Ö × Ù Ðº      ÐÐ ÕÙ Ö ÑÓ× Ó× Ö Ó׸ ÙÒÓ Ö × Ù Ð¸ ÕÙ × Ð ×ÙÔÖ Ö Ó¸
    Ý ÓØÖÓ ÒÓÖÑ Ð¸ ÕÙ × ×Ð Ó Ð Ö Ñ ÒØ desconnect arc()                        ר ÑÓ Ó¸ Ð
     Ö Ó Ô Ö Ð ÐÓ Ð ×ÙÔÖ ¹ Ö Ó ÒÓ × Ú ×ØÓ ÔÓÖ Ò Ò ÙÒ Ø Ö ÓÖ Ö Ó׺
        create dummy arc() Ô Ð        Ó× ÖÙØ Ò ×º Ä ÔÖ Ñ Ö ¸ compute max possible flow()¸
    Ö ØÓÖÒ Ð Ñ Ü ÑÓ Ú ÐÓÖ ­Ù Ó ÕÙ ÔÙ Ð ÒÞ Ö Ð Ö Ò ÙÒ ÓÒ Ð × Ô                        ×
    ×Ð      Ð Ù ÒØ Ý ÒØÖ            Ð ×ÙÑ ÖÓº Ä × ÙÒ ÖÙØ Ò ¸ search max arc cost()¸
836                                                           Cap´
                                                                     ıtulo 7. Grafos



    Ö ØÓÖÒ Ð Ñ ÝÓÖ Ú ÐÓÖ Ð Óר C ÒØÖ ØÓ Ó× ÐÓ× Ö Ó× Ð Ö º Ð Óר Ñ Ü ÑÓ
     Ð ÙÒ ­Ù Ó Ö ×Ø ÓØ Ó ÔÓÖ V C¸ Ù Ð × Ñ ÝÓÖ ÕÙ Ð Ñ Ü Ñ ÐÓÒ ØÙ Ò Ö Ó×
       ÙÒ ÐÓ ´ Ö ÙÐ ÓÒµº
        Ë Ñ ØÖ Ó create dummy arc()¸ Ý ÓØÖ ÔÖ Ñ Ø Ú ÐÐ Ñ destroy dummy arc()¸
    Ð Ù Ð Ð Ñ Ò Ð ×ÙÔÖ ¹ Ö Ó Ý Ð Ö Ö × Ù Ðº
           ÓÖ Ý ×Ø ÑÓ× Ð ×ØÓ× Ô Ö × ÖÖÓÐÐ Ö Ð Ð ÓÖ ØÑÓ
¿     ÙÒ ÓÒ × Ô Ö Net Max Flow Min Cost<TNode,TArc,T> ¿¾ +≡    ¿
          template <class Net>
      void max_flow_min_cost_by_cycle_canceling(Net & net)
      {
        typedef Aleph::less<typename Access_Cost<Net>::Distance_Type> CmpD;
        typedef Aleph::plus<typename Access_Cost<Net>::Distance_Type> PlusD;
        typedef Res_F<Net> Res_Filter;
        create_dummy_arc <Net, Access_Cost> (net);
        Path<Net> cycle(net); // aqu´ se guardan ciclos negativos
                                    ı
        while (Bellman_Ford_Negative_Cycle
               <Net, Access_Cost<Net>, CmpD, PlusD, Res_Filter> () (net, cycle))
          if (increase_flow <Net> (net, cycle) == 0)
            ((typename Net::Arc *) net.get_cookie())->cost = 0;
        destroy_dummy_arc(net);
      }
    Í× × Path ¼¾ º
          Ð ­Ù Ó Ý Óר Ð ×ÙÔÖ ¹ Ö Ó ×Ø Ò Ð ÙÐ Ó× × Ö ÙÒ ÔÓ Ó Ñ × ÐØÓ× ÕÙ Ð ­Ù Ó
    Ñ Ü ÑÓ Ý Ð Óר Ñ Ü ÑÓ ÔÓ× Ð º Ë Ò Ñ Ö Ó¸ ÒÓ ÓÒÓ ÑÓ× ÔÖ ÓÖ ×ØÓ× Ú ÐÓÖ ×º
      Ò ÐÓ ÕÙ ÓÒ ÖÒ Ð Ú ÐÓÖ ­Ù Ó¸ ר ÔÓ Ö × Ö Ñ ÒÓÖ ´Ý ÕÙ Þ ÔÓÖ ÑÙ Óµ ÕÙ Ð
       Ô          ×Ð       Ð Ù ÒØ Ó Ð   ÒØÖ       Ð ×ÙÑ ÖÓº × ÔÓ× Ð ¸ Ô٠׸ Ö Ò ÙÒ
    × ØÙ ÓÒ Ò Ð Ù Ð × ÑÔÖ Ò ÓÒØÖ ÑÓ× ÙÒ ÐÓ Ò Ø ÚÓ ÓÒ Ð ×ÙÔÖ ¹ Ö Ó Ð Ù Ð ÒÓ ×
    ÔÓ× Ð Ö Ù ÖÐ Ð Óר ´ÔÓÖÕÙ Ð ­Ù Ó Ý ×Ø Ñ Ü Ñ Þ Óµº ÈÓÖ Ø ÒØÓ¸           ÑÓ× Ù× Ö
       ÐÓ× Ò Ø ÚÓ× ÕÙ ÒÓ Ò ÐÙÝ Ò Ð ×ÙÔÖ ¹ Ö Óº ÍÒ Ø ÒØ ÓÒ Ô Ö           ÖÐÓ × ÑÔÐ Ö
    ÙÒ Ø Ö ÓÖ        Ö Ó× ÕÙ ¬ÐØÖ Ð ×ÙÔÖ ¹ Ö Ó¸ Ô ÖÓ¸ Ô ÖØ   ÕÙ ÒÓ × Ö ØÓ Ö ÓÒÓ Ö
     Ð ×ÙÔÖ ¹ Ö Ó¸ × ÒÒ × Ö Óº Ë ÒÓ × ÔÙ         ÙÑ ÒØ Ö Ð ­Ù Ó ØÖ Ú × ÙÒ ÐÓ ÕÙ
     Ò ÐÙÝ Ð ×ÙÔÖ ¹ Ö Ó¸ ÒØÓÒ ×¸ × ÙÒ Ð ÔÖÓÔÓ× ÓÒ º½¼ ´Ô º ¿µ¸ Ð ­Ù Ó × Ñ Ü ÑÓº
      Ò ×Ø ÑÓÑ ÒØÓ × ÐØ Ö Ð Óר Ð ×ÙÔÖ ¹ Ö Ó Ð Ú ÐÓÖ ÒÙÐÓ ÐÓ ÕÙ            ÕÙ Ð Ö ×ØÓ
        Ð × Ø Ö ÓÒ × Ù×ÕÙ Ò ÐÓ× × Ò Ð ×ÙÔÖ ¹ Ö Ó Ý × ÓÒ× Ö Ò Ö Ù Ö Ð Óר ØÓØ Ðº
    7.12.3    An´lisis de los algoritmos basados en eliminaci´n de ciclos nega-
                 a                                           o
              tivos
    È Ö Ò ÐÞ ÖÐ Ð ×      Ð ÓÖ ØÑÓ× ÕÙ        ÑÓ× ×ØÙ Ö         ÑÓ× Ô Ð Ö ÐÓ× Ò Ð × ×
    ÔÖ Ú Ó× ­Ù Ó× Ñ Ü ÑÓ× Ý Ð Ð ÓÖ ØÑÓ       ÐÐÑ Ò¹ ÓÖ º Ä × Ù ÒØ ÔÖÓÔÓ× ÓÒ ÐÙ
     Ð Ö ×Ô ØÓº
    Proposici´n 7.19
             o      Ë N =< V, E, s, t, C, C > ÙÒ Ö     Ô Ø     ÓÒ Óר ׺ Ë F Ð
    Ú ÐÓÖ ­Ù Ó Ñ Ü ÑÓº Ë C Ð Ñ Ü ÑÓ Óר ÙÒ ­Ù Ó Ñ Ü ÑÓº ÒØÓÒ ×¸ × Ð Ö Ó
     × ×Ô Ö Ó¸ Ð ÙÖ ÓÒ       Ù ÓÒ Ð Ð ÓÖ ØÑÓ º½½ ר ÓØ ÔÓÖ O(V 3 C F)º
    Demostraci´n
               o    Ð Ô ÓÖ × Ò Ö Ó ÕÙ ÔÓ ÑÓ× Ò ÓÒØÖ Ö × ÕÙ          ÖÓØÒ     ¹
    Ô      F Ý Óר C º Ò ×Ø × ØÙ ÓÒ¸ ÔÙ         Ð ÒÞ Ö× ÙÒ Óר Ñ Ü ÑÓ Ö
    O(E C M)º
7.12. Flujos de coste m´
                       ınimo                                                                              837



                                                       Ë


                                               ¼» ¼» ¼         ¼» ¼»¾¼




                                                       ¿¼»¾¼» ¿¼»½¼»¾¼


                                 ¼»¼» ¼


                                          ¿¼»¿¼»½¼         ½¼»½¼»½


                                                                  ¼»¾¼»¾¼


                                 ¼»¼»¿¼                                               ¼» ¼»½¼


                             ¿¼»½¼»½


                         ¼»¼»¿                ¾¼»¼»¿¼


                                 ¼»¿¼»¿¼       Á


                                       ¼»½¼»¾¼             ¿¼»¼» ¾¼»¾¼»


                                 À                 ¼»¼» ¼


                                       ½ »¼»


                                     ¼» ¼»¾


                                                   ¼»¾¼»¿¼                  ¼» ¼» ¼


                                                   Ã


                                                               ¿¼»¼»¾


                                                       ¼» ¼»½        Â


                                                                  ¼» ¼»¾¼


                                                           Ì




   ÙÖ º       ÐÙ Ó Ñ Ü ÑÓ Óר Ñ Ò ÑÓ Ð Ö                                               Ð ¬ ÙÖ º ÔÖÓ Ù Ó ÔÓÖ Ð
Ð Ñ Ò ÓÒ         ÐÓ× × Ò ­Ù Ó Ò Ð Ý ×ÙÔÖ ¹ Ö Ó

       Ð ÑÓÑ ÒØÓ Ö         ÓÒ ×Ø ÑÓ×ØÖ ÓÒ¸ ÐÓ× Ñ ÓÖ × Ð ÓÖ ØÑÓ× ÓÒÓ Ó× Ô Ö
  Ù×ÕÙ          ÐÓ× Ò Ö Ó× × × Ò Ò ÙÒ Ù×ÕÙ Ò ÔÖÓ ÙÒ                  ÐÓ Ù Ð × ÒÙ ×ØÖÓ
   ×Ó¸ ÔÙ × ÑÔÐ ÑÓ× Ð Ð ÓÖ ØÑÓ Ì Ö Ò ´Ü º º¿º¾ ´Ô Ò             µµ¸ Ð Ù Ð × O(E)º
         × Ð Ò Ð × × Ð Ð ÓÖ ØÑÓ       ÓÖ ¹ ÙÐ Ö×ÓÒ ´Ü º½¼º½½º½ ´Ô Ò       µµ¸ × ÑÓ×
ÕÙ ÔÙ Ò Ö ÕÙ Ö Ö× O(F) Ö Ô Ø ÓÒ × Ô Ö Ñ Ü Ñ Þ Ö Ð ­Ù Ó¸ ×Ó ÜØÖ ÑÓ Ù Ò Ó
× ÙÑ ÒØ Ò Ö ÙÐ ÓÒ × Ò ÙÒ ÙÒ º ÈÓÖ Ø ÒØÓ¸ Ñ Ü Ñ Þ Ö Ð ­Ù Ó ÔÙ Ö ÕÙ Ö Ö
O(EF)º
    È ÖÓ ÙÒ Ò Ð × × Ò ÐÓ Ó Ð Ð Ô ÖÖ Ó ÒØ Ö ÓÖ¸ ÒÓ× ÖÖÓ Ð ÔÓ× Ð             ÕÙ ÔÙ Ò
Ö ÕÙ Ö Ö× O(E C F) ×Ñ ÒÙ ÓÒ × Óר Ô Ö ×Ñ ÒÙ Ö Ð Óר Ð Ñ Ò ÑÓº
           ÙÒ      ר × ×Ñ ÒÙ ÓÒ × Ö ÕÙ Ö ÒÚÓ Ö Ð Ð ÓÖ ØÑÓ             ÐÐÑ Ò¹ ÓÖ ¸ Ð
 ٠Р׸ × ÙÒ ÐÓ Ò Ð Þ Ó Ò Ü º º¿º ´Ô Ò ¿ µ¸ O(V E)º
       ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð Ð ÓÖ ØÑÓ ÔÙ ØÓÑ Ö O(E C F) × O(V E) = O(V E2 C F)º
    Ë Ð Ö Ó × ×Ô Ö Ó¸ ÒØÓÒ × E ≈ cV ¸ ÓÒ c × ÓÒר ÒØ º ×ØÓ ÒÓ× ÖÖÓ ÙÒ
 ÓÑÔÐ            O(V 3 C F)

      Ò Ö ÓÖ Ð ÔÖ Ø ¸ ר Ò Ð × × × ÑÙÝ Ô × Ñ ×Ø º Ò Ð ÔÖÓÑ Ó¸ Ð ÙÖ ÓÒ
 × ÑÙ Ó Ñ ÓÖº Ë Ò Ñ Ö Ó¸ ÔÓÖ              Ù×ÕÙ          ÐÓ¸ ר Ð ×        Ð ÓÖ ØÑÓ ÒÓ
 ÔÖÓÚ        Ð Ð ÙÐÓ Ö Ð Þ Ó Ý ÓÒÓ Ñ ÒØÓ Ó Ø Ò Ó ÔÓÖ Ù×ÕÙ × ÒØ Ö ÓÖ ×               ¹
ÐÓ׺ Ò Ò ÙÖ ¸ Ð Ð ÓÖ ØÑÓ            ÐÐÑ Ò¹ ÓÖ Ö ØÓÖÒ ÐÓ× Ò Ø ÚÓ× Ò ÖÙØÓ ÒÓ
Ò × Ö Ñ ÒØ ÕÙ ÐÐÓ× ÕÙ ÔÙ Ò Ð Ö Ö Ð ÙÑ ÒØÓ Ð ­Ù Ó Ó Ð Ö Ù ÓÒ Ð Óר º
838                                                                                              Cap´
                                                                                                    ıtulo 7. Grafos



7.12.4    Problemas que se reducen a enunciados de flujo m´ximo a coste
                                                         a
          m´
           ınimo
     ØÓ× Ñ ÓÖ Ö ÒÙ ×ØÖ ÓÑÔÖ × ÓÒ¸ ÓÒ× Ö ÑÓ× ÙÒ ÔÓØ Ø × ØÙ ÓÒ Ñ ÖÓ¹
  ÓÒÓÑ ÕÙ Ú Ò ÙÐ ÔÖÓ Ù ØÓ× ÖÓÔ Ù Ö Ó׸ Ö ÓÒ × Ó Ô × × ÔÖÓ Ù ØÓÖ × Ý Ù ×
ÕÙ Ñ Ò Ò ÐÓ× ÔÖÓ Ù ØÓ׿ º
                                                                                 ¼

                                                                                 ¼

                                                                                ½¾¼
                                                                                        ÖÕÙ × Ñ ØÓ

                                                                                ¿½¼


                                                                                ¾ ¼


                                                              È ×      Ó



                                                                                  ¼
                        Ð ÓÒ                                                                 Ö   ×
                                   ¿¼¼
                                                                                 ¼¼
                                            È ×      Ó
                                    ¼¼
                    ËÙ Ö                                                         ¼¼


                                                                                ½ ¼
                    Ö       ÒØ Ò
                                                               ÈÓÐÐÓ
                                   ¿ ¼                                           ¼

                                                                                        Å Ö
                                    ¼¼                                          ¾¼¼
                        ÙÐ                                         ÖÖÓÞ
                                    ¼¼      ÖÒ          Ö ×                      ¼

                                                                                 ¼
                                     ¼                        ÖÒ          Ö ×


                                     ¼
                                             ÈÓÐÐÓ
                                                                                ¾¼¼
                                    ¼¼
                        Ö × Ð
                                                                                       Å Ö           Ó
                                                                                ½ ¼
                                   ¾ ¼

                    ÓÐÓÑ                                                          ¼
                                   ¾ ¼
                                                                                 ¼
                                                 ÖÖÓÞ
                                    ¼¼
                  ÈÓÖØÙ Ù ×
                                   ¿¿¼                                                ÈÙ ÖØÓ ÇÖ          Þ



                        Ù     ÓÖ                                                ¿¼¼




                             ´ µ ÈÖÓÚ    ÓÖ ×                        ´ µ        Ñ Ò ÒØ ×


                 ÙÖ º                Ö Ó×           ÔÖÓÚ ÓÖ × Ý Ñ Ò ×                        Ð Ñ ÒØÓ×
     Ò Ð × ÒØ Ó Ý ÜÔÐ Ó¸ ×ÙÔÓÒ ÑÓ× ÓÑÓ ÔÖÓ Ù ØÓ× Ð ÖÒ ¸ ÔÓÐÐÓ¸ Ô × Ó Ý
 ÖÖÓÞ Ý ÓÑÓ ÔÖÓ Ù ØÓÖ × Ð ÓÒ¸ ËÙ Ö ¸ ÈÓÖØÙ Ù × ¸ ÙÐ ¸ Ö ÒØ Ò ¸ Ù ÓÖ¸ ÓÐÓѹ
    Ý Ö × Ðº Ä × Ô        × ÔÖÓ Ù ÓÒ              ÞÓÒ × Ô ØÓÖ Þ Ò Ò Ð Ö Ó Ð
¬ ÙÖ º ¹ º¸ Ð Ù Ð ÔÙ ÒØ ÖÔÖ Ø Ö× ÓÑÓ ÙÒ ×ÕÙ Ñ ÔÖÓÚ × ÓÒº
      Ð Ñ ×ÑÓ ÑÓ Ó¸ Ð × Ö ÓÒ × Ö Ò ÙÒ Ñ Ò                ÐÓ× ÔÖÓ Ù ØÓ׺ Ò ÒÙ ×ØÖÓ
  ÔÓØ Ø Ó ÑÔÐÓ¸ Ð Ö Ó Ð ¬ ÙÖ º ¹ ÐÙ×ØÖ Ð × Ò ×                × ÐÓ× ÔÖÓ Ù ØÓ× ÔÓÖ
     Ö ÓÒº
    È Ö ×ØÙ Ö Ð Ø Ð             × Ø × ÓÒ Ò ×           × × ÙÒ Ð × Ô         × ÔÙ
Ù× Ö× ÙÒ Ú Ö ÒØ Ð Ø Ò ÜÔÐ              Ò Ü º½½º¾ ´Ô Ò ¼ µ¸ Ð Ù Ð × Ô ØÓÖ Þ Ò Ð
¬ ÙÖ º ¼º Ä        ÓÒ× ×Ø Ò Ù× ÓÒ Ö ÐÓ× ÒÓ Ó× ÔÖÓ Ù ØÓ× Ý × ÓÒ Ø Ö ÔÖÓ Ù ØÓÖ ×
 ÓÒ Ñ Ò ÒØ ׺ Ò ×Ø ×Ó¸ Ð Ô                 ÙÒ Ö Ó ÒØÖ ÔÖÓ Ù ØÓ Ý Ù Ö ÔÖ × ÒØ
Ð Ñ Ò ¹× Ò Ò ×            Ô ÖØ Ö Ð ÒÓ Ó Ù      ÓÑÓ × ÜÔÐ Ò Ü º½½º¾ ´Ô Ò ¼ µ¹
º ÄÙ Ó × ÒÐ Þ Ò ÐÓ× ÔÖÓ Ù ØÓÖ × ÓÒ ÙÒ ×ÙÔÖ ¹ Ù ÒØ Ñ ÒØ Ö Ó×                Ô
 Ò¬Ò Ø Ý ÐÓ× Ñ Ò ÒØ × ÓÒ ÙÒ ×ÙÔÖ ¹×ÙÑ ÖÓ ÓÒ Ö Ó×            Ô        Ò¬Ò Ø ´ Ò ×Ó
   ÕÙ × × Ú Ð Ö Ð Ø Ð µº ÄÙ Ó Ñ Ü Ñ Þ Ö Ð ­Ù Ó¸ ×                         ÖÓ ×
 ¿
     Ä × ØÙ ÓÒ × ÓÑÔÐ Ø Ñ ÒØ             ÔÓØ Ø º
7.12. Flujos de coste m´
                       ınimo                                                                                                   839


                                                                            ½ ¼


                                                                             ¼




                                          ¿¼¼                                ¼
                          Ð ÓÒ                       È ×      Ó
                                           ¼¼
           ∞                                                                 ¼
                      ËÙ Ö


           ∞                                                                ½ ¼

                    ÈÓÖØÙ Ù ×
                                           ¼¼                               ¿½¼
           ∞                                                                            Å Ö             Ó
                                          ¿¿¼             ÖÖÓÞ              ¾¼¼                                       ∞
           ∞              Ù     ÓÖ
                                          ¾ ¼
   Ë
           ∞                                                                 ¼¼
                                                                                         ÖÕÙ × Ñ ØÓ
                                                                                                                      ∞
                      ÓÐÓÑ                                                                                            ∞
           ∞                               ¼
                                                                                                                           Ì
           ∞                              ¾ ¼                                 ¼
                                                                                         Å Ö                          ∞
                          Ö × Ð
                                                                                                                      ∞
           ∞                               ¼                                ¾ ¼            Ö        ×                 ∞
                                           ¼¼                                ¼
                                                     ÖÒ          Ö ×
                      Ö       ÒØ Ò                                                     ÈÙ ÖØÓ ÇÖ            Þ
                                          ¿ ¼                                ¼¼
                                           ¼¼
                                                                            ¿¼¼
                          ÙÐ
                                                                            ¾¼¼
                                           ¼¼


                                                                            ½¾¼
                                                      ÈÓÐÐÓ

                                                                             ¼


                                                                              ¼


                                                                             ¼




           ÙÖ º ¼ Ê                  ÕÙ Ú Ð ÒØ Ô Ö          Ð ÙÐ Ö           Ø Ð           ÔÖÓÚ × ÓÒ» Ñ Ò

ÔÖÓ Ù ØÓ         Ñ Ò ÒØ Ø Ò ­Ù Ó Ù Ð ×Ù Ô       ¸ ÒØÓÒ × Ð ­Ù Ó × Ø Ð
 × Ö¸ Ð Ñ Ò ÔÙ × Ö × Ø × º
      ÓÒÓ Ö × Ð ­Ù Ó × Ø Ð Ó ÒÓ × × Ò Ð ÒØ × Ô Ò× Ö Ò Óר × ØÖ Ò×ÔÓÖØ
Ó Óר × Ð ÔÖÓ Ù ØÓ¸ ÔÙ × Ð ÔÐ ÒØ Ñ ÒØÓ Ö      Ñ      Ò ÙÒ ÓÒ Ð Ø Ð ¹
    º ÆÓØ ÑÓ× ÕÙ Ð ×ÙÑ     Ñ Ò × Ú Ö×Ù× Ð ×ÙÑ ÔÖÓÚ × ÓÒ × ÒÓ Ò × Ö Ñ ÒØ
 ÖÖÓ Ð Ø Ð ¸ ÔÙ × ×Ø Ô Ò             Ð ÔÓ× Ð       ÐÐ Ú Ö Ð ÔÖÓ Ù ØÓ    Ð
  Ñ Ò ÒØ º Ò Ø ÖÑ ÒÓ× ÙÒ Ö ¸ Ð Ü ×Ø Ò             Ö Ó× ÒØÖ Ð ÔÖÓ Ù ØÓ Ý Ð
  Ñ Ò ÒØ º
7.12.4.1   Transporte

  Ò Ø ÖÑ ÒÓ ÓÖÑ Ð × Ý Ò Ö Ð ×¸              Ò Ð ÔÖÓ Ð Ñ Ð ØÖ Ò×ÔÓÖØ × Ø Ò Ò m ÔÖÓÚ ÓÖ × Ý n
   Ñ Ò ÒØ ׺        ÔÖÓÚ ÓÖ Ø               Ò ÙÒ ÖØ Ô              ÔÖÓÚ × ÓÒ Ý    Ñ Ò ÒØ
Ø Ò ÙÒ Ò × Ó Ñ Ò                             ÔÖÓÚ × ÓÒº ÈÓÖ   ×Ó ÓÒ ÒØÖ ÙÒ ÔÖÓÚ ÓÖ i Ý ÙÒ
   Ñ Ò ÒØ j Ü ×Ø ÙÒ Óר                     ØÖ ×ÔÓÖØ ci,jº ÓÑÓ ÑÔÐÓ¸ ÓÒ× Ö ÑÓ× Ð × Ù ÒØ
 Òר Ò
                                      Ñ Ò ÒØ ×        D1               D2   D3     D4      D5               D6
                                        Ñ Ò           ¿¼                ¼   ½¼     ¾          ½                 ¾¼   ½ ¼
            ÈÖÓÚ    ÓÖ ×              ÈÖÓÚ × ÓÒ
               P1                        ¿¼               ¿¼                  ¼    ½          ½                 ¾¼
               P2                          ¼         ½    ¾¼                       ½¼         ¾¼                ¾¼
               P3                        ¾           ½¼¼ ½¾¼                                    ¼                ¼
               P4                          ¼         ¾      ¼               ¿¼                ¾¼                ¿¼
               P5                          ¼              ¿                  ¼                  ¼               ½
                                        ¾ ¼
840                                                          Cap´
                                                                ıtulo 7. Grafos



      Ð ÔÖÓ Ð Ñ Ð ØÖ Ò×ÔÓÖØ ÔÙ ÑÓ Ð Þ Ö× Ý Ö ×ÓÐÚ Ö× Ñ ÒØ ÙÒ Ö           Ô ¹
Ø    º Ð ÒÓ Ó Ù ÒØ ÓÒ Ø ÐÓ× ÔÖÓÚ ÓÖ × ÓÒ Ô           × Ù Ð × Ð × ÔÖÓÚ × ÓÒ × Ý
   Óר × ÒÙÐÓ׺ ÄÓ× ÒÓ Ó× Ñ Ò ÒØ × × ÓÒ Ø Ò Ð ×ÙÑ ÖÓ ÓÒ Ô           × ÙÐ×
×Ù× Ñ Ò × Ý Óר × ÒÙÐÓ׺ Ò ÐÑ ÒØ ¸        Óר ØÖ Ò×ÔÓÖØ × Ö ÔÖ × ÒØ ÔÓÖ ÙÒ
 Ö Ó × Ð ÔÖÓÚ ÓÖ            Ð Ñ Ò ÒØ ÓÒ Ô           Ò¬Ò Ø ¹Ó ÙÒ Ú ÐÓÖ ×ÙÔ Ö ÓÖ
Ó Ù Ð ÕÙ Ð ÔÖÓÚ × ÓÒ¹ Ý ÓÒ Óר Ù Ð Ð ØÖ Ò×ÔÓÖØ × Ð ÔÖÓÚ ÓÖ                   Ð
  Ñ Ò ÒØ º
    Ä ¬ ÙÖ º ½ ÐÙ×ØÖ Ð ÑÓ ÐÓ Ò Ö      Ô Ø       ÒÙ ×ØÖ Òר Ò      ÑÔÐÓº
                                   ∞ »¿
                                   ∞»     ¼



                                   ∞ »½¾¼
                                   ∞»     ¼
                                                  D7
                                   ∞ »¿¼
                                   ∞ »¾¼

                                   ∞»     ¼


                                   ∞»     ¼


                                   ∞ »¾¼
                                                  D10
                                   ∞ »½
                                                              ¼»¼
                                   ∞ »¾¼
                         P5
                                   ∞»
                ¼»¼                                          ½ »¼
                         P3
               ¾ »¼
                                   ∞»     ¼


       Ë
                ¼»¼
                         P4
                                   ∞ »¿¼          D11
               ¿¼»¼                ∞ »¾¼
                                                             ¾¼»¼
                ¼»¼
                         P1        ∞ »¾¼
                                                                      Ì
                                   ∞»     ¼
                                                             ¾ »¼
                         P2
                                   ∞»
                                                  D9
                                   ∞»
                                                             ½¼»¼

                                   ∞ »½

                                   ∞ »½¼                     ¿¼»¼

                                   ∞»

                                   ∞»
                                                  D8
                                   ∞ »¿¼

                                   ∞»     ¼


                                   ∞»
                                   ∞ »½¼¼
                                                  D6
                                   ∞ »¾

                                   ∞»

                                   ∞ »½




      ÙÖ º ½ Ê ÕÙ ÑÓ Ð Þ Ð ÔÖÓ Ð Ñ            Ð ØÖ Ò×ÔÓÖØ × ÙÒ Ð Ø Ð ÒØ Ö ÓÖ
    Ë ÙÒ Ð × Ö Ð ÓÒ × ÔÖÓÚ × ÓÒ Ý Ñ Ò ÜÔÖ × × Ò Ð ¬ ÙÖ º ¼¸ Ý Ú Ö ×
Ñ Ò Ö × ÔÐ ÒØ Ö Ð ØÖ Ò×ÔÓÖØ º ÈÓÖ ÑÔÐÓ¸ ÔÙ Ö ÑÓ× Ñ Ö Ö ÐÓ× ÔÖÓÚ ÓÖ × Ý
Ó Ø Ò Ö¸ Ô Ö Ð ×Ó ÙÐ Ý Ö × Ð¸ Ð × Ö Ð ÓÒ × Óר ØÖ Ò×ÔÓÖØ ÕÙ × ÑÙ ×ØÖ Ò
 Ò Ð ¬ ÙÖ º ¾º × ÑÔÓÖØ ÒØ ר Ö ÕÙ ×ØÓ× Ö Ó× ×Ø Ò ÓÖ ÒØ Ó×         ÐÐ Ó
  Ð ÔÖÓ Ù ØÓÖº Ò ÓØÖ × Ô Ð Ö ×¸ ÐÓ× Ò ¬ Ó× Ñ Ü Ñ Þ Ö ×ØÖ Ù ÓÒ ÔÖÓ Ù ØÓ×
7.12. Flujos de coste m´
                       ınimo                                                                                                                                      841


                                                                                                               ¼»½¿¼

                                                                                                               ¼»¾½¼

                                                                                                              ¼¼»½½¼           Å Ö


                                                                                                              ¼¼» ¼



                                                                                                               ¼» ¼

                                                                                                              ¼¼»½            Å Ö             Ó
                                                                                                  ÖÒ
                            ¼¼»¾¼
                                                                                          ¼                   ¼¼»½¼¼
                                                 Å Ö
                            ¼¼»½¼
                                                                                                               ¼» ¼
                            ¼¼»½¾
                                                                                      ¼¼
                                                                          Ö × Ð               ÈÓÐÐÓ           ¼¼» ¼
                                                                                    ¾ ¼                                             Ö     ×
                            ¼¼»½¼¼           Å Ö              Ó                                               ¼¼»¿¼
                     ÖÒ
                             ¼¼»                                                                  ÖÖÓÞ         ¼»½¼¼
              ¼¼


         ÙÐ                 ¼¼»¿¼
              ¼¼
                                         ÈÙ ÖØÓ ÇÖ                Þ
                                                                                                              ¼¼»¿¼
                   ÈÓÐÐÓ    ¼¼» ¼                                                                                         ÈÙ ÖØÓ ÇÖ               Þ
                            ¼¼»½
                                                                                                              ¼¼»½¼
                                                     Ö    ×
                                                                                                              ¼¼»
                            ¼¼»¾                                                                                              ÖÕÙ × Ñ ØÓ
                                                 ÖÕÙ × Ñ ØÓ
                             ¼¼»                                                                              ¼¼»




                      ´ µ ÙÐ                                                                      ´ µ Ö ×Ð


   ÙÖ º ¾ Ê Ð ÓÒ ×                 Óר                   ØÖ Ò×ÔÓÖØ Ô Ö Ð ÙÒÓ× ÔÖÓÚ ÓÖ × Ý Ñ Ò ÒØ ×

Ð Ñ Ò ÑÓ Óר Ø Ò Ò Ð ÔÖÓ Ù ØÓÖ Ý ÒÓ ÐÓ× Ñ Ò ÒØ ׺
   È Ö ÕÙ ÙÒ ÑÓ ÐÓ Ð Ø ÔÓ ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ º ¾ Ð ÙÐ Ð ×ØÖ Ù ÓÒ Ò
Ù ×Ø ÓÒ¸ × ÓÒÚ Ò ÒØ Ð ÙÐ Ö       ÖÙ ÖÓ ÔÓÖ × Ô Ö Ó Ý ÓØ Ö Ð Ñ Ò
 Ù º Ä ÖÒ ¸ Ò ÒÙ ×ØÖÓ× ÑÔÐÓ׸ ÖÖÓ Ö Ö Ó× ÓÑÓ ÐÓ× Ð ¬ ÙÖ º ¿º
                               Å Ö                                                                                                       Å Ö
                   ¼¼»¾¼                                 ¾¼¼»¼                                                        ¼»½¿¼                                       ¾¼¼»¼

                            ÈÙ ÖØÓ ÇÖ            Þ                                                                              ÈÙ ÖØÓ ÇÖ                     Þ
                   ¼¼»½¼¼                                 ¼¼»¼                                                         ¼» ¼                                        ¼¼»¼

        ¼¼         ¼¼»½¼                                  ¼¼»¼                                ¼                       ¼»¾½¼                                        ¼¼»¼
   ÙÐ         ÖÒ              Å Ö            Ó                        Ì           Ö × Ð                  ÖÒ                             Å Ö               Ó               Ì
                   ¼¼»½                                    ¼»¼                                                        ¼»½¼¼                                        ¼»¼

                   ¼¼»¿¼                                  ¼¼»¼                                                         ¼» ¼                                        ¼¼»¼
                               ÖÕÙ × Ñ ØÓ                                                                                               ÖÕÙ × Ñ ØÓ



                                    Ö    ×                                                                                                    Ö       ×




                       ´µ                                                                                               ´ µ

  ÙÖ º ¿ Ö Ó× ÔÖÓÚ × ÓÒ        ÖÒ Ô Ö ÙÐ Ý Ö × Ðº                                                         Ô                   × × Ð Ù
     Ð ×ÙÑ ÖÓ Ö ÔÖ × ÒØ Ò Ð × Ñ Ò × Ð Ù
   Ë Ñ Ö ÑÓ× Ð Ö Ó Ñ × × Ò ÐÐÓ¸ Ð      ÙÐ ¸ ÒÓ× Ô Ö Ø ÑÓ× ÕÙ ×Ø ÔÖÓ Ù ØÓÖ¸ ÔÓÖ
× ×ÓÐÓ¸ ÒÓ ×Ø Ô Ö Ù Ö Ö Ð Ñ Ò º Ò Ð Ú Ö Ð¸ × Ô Ð ×ÓÐ Ø ÖÐ Ð ÔÖÓÚ ÓÖ
ÙÒ ÙÑ ÒØÓ ÔÖÓ Ù ÓÒ¸ Ù× Ö ÓØÖÓ× ÔÖÓ Ù ØÓÖ × Ó Ñ Ó× ×ÕÙ Ñ ×º Ò Ø ÖÑ ÒÓ×
   ÙÒ Ö      ØÖ Ò×ÔÓÖØ ¸ ×ØÓ ÕÙ Ú Ð Ò Ö ØÓ Ó× ÐÓ× ÔÖÓ Ù ØÓÖ × ÔÓ× Ð × Ý Ó Ø Ò Ö
 Ö Ó× ÓÑÓ ÐÓ× Ð ¬ ÙÖ º º
   Ë ×Ø Ð Ó× ØÓ Ó× ÐÓ× ÔÖÓÚ ÓÖ × ÔÓ× Ð × ÒÓ Ø Ò ÑÓ× Ø Ð            × Ö¸ ÕÙ
Ð ÒØ       ÔÖÓÚ ×Ø ÔÓÖ ÐÓ× ÔÖÓÚ ÓÖ × ÒÓ × Ø × Ð Ñ Ò ¸ Ù Ð × Ð ×Ó Ð
  ÖÒ ¸ ÒØÓÒ × ÔÓ ÑÓ× ÓÒ× Ö Ö ÔÖ ÓÖ Þ Ö ×ÙÑ ÖÓ× Ó × Ù ×º È Ö ÐÐÓ ÔÓ ¹
ÑÓ× ¬Ò Ö¸ ÔÓÖ ÑÔÐÓ¸ ÙÒ Ö Ó ÔÖ ÓÖ             × ÒØÖ Ð × Ù × Ø Ð ÓÑÓ Ð Ð
¬ ÙÖ º ÔÓÖ × ÑÔÐ         ¸Ð× ÑÒ ×              Ù ×ÓÒ ÒÓØ × Ò Ð ÒÓ Óº
     Ò ×Ø ×Ó¸ Ð ÙÐ ÑÓ× Ð Ñ Ò ØÓØ Ð¸ Ù Ð × Ð ×ÙÑ           ÑÒ ×            Ù º
842                                                                                                               Cap´
                                                                                                                     ıtulo 7. Grafos


                                  ¼»                                                                                       ¿ ¼» ¼


                                  ¼»½¿¼                                                                                    ¾ ¼»¾¼


                                 ¼¼»¾¼      Å Ö                                                                              ¼¼»         Å Ö


                                ¿ ¼»½ ¼                                                                                    ¾ ¼» ¼



                                ¿ ¼»¾¼¼                                                                                    ¾ ¼»½¼


                                  ¼»½ ¼                                                                                    ¿ ¼»½¾¼
                                                                    ¾¼¼»¼                                                                                    ¼»¼

                                  ¼» ¼    ÈÙ ÖØÓ ÇÖ            Þ                                                           ¾ ¼»½¼¼   ÈÙ ÖØÓ ÇÖ          Þ


                                 ¼¼»½¼¼                                                                                     ¼¼»½
      Ö    ÒØ Ò                                                                              Ö × Ð
                                                                       ¼¼»¼                                                                                 ¾¼¼»¼
                  ¿ ¼             ¼» ¼                                                                      ¾ ¼            ¿ ¼»¿¼
      ÓÐÓÑ                                                                                   Ù     ÓÖ
                    ¼                                                                                       ¿ ¼
                                  ¼»¾½¼                                ¼¼»¼                                                ¾ ¼»½¼                           ¾¼¼»¼
                    ¼      ÖÒ              Å Ö             Ó                  Ì                             ¾ ¼    ÖÖÓÞ               Å Ö           Ó               Ì
                                 ¼¼»½¼                                                                                       ¼¼»
          Ö × Ð    ¼¼                                                   ¼»¼                 ÓÐÓÑ             ¼¼                                             ½ ¼»¼
                                ¿ ¼»½¾                                                                                     ¾ ¼»½¼¼

          ÙÐ                      ¼»                                   ¼¼»¼               ÈÓÖØÙ Ù ×                        ¿ ¼»¿                            ¼¼»¼



                                  ¼»½¼¼                                                                                    ¾ ¼»½
                                            ÖÕÙ × Ñ ØÓ                                                                                 ÖÕÙ × Ñ ØÓ

                                 ¼¼»½                                                                                        ¼¼»¿


                                ¿ ¼»½¿                                                                                     ¾ ¼»

                                  ¼» ¼                                                                                     ¿ ¼» ¼


                                  ¼» ¼                                                                                     ¾ ¼»¿¼
                                                 Ö     ×                                                                                    Ö   ×

                                 ¼¼»¿¼                                                                                       ¼¼»


                                ¿ ¼»½¾¼                                                                                    ¾ ¼»¿¼




                           ´µ     ÖÒ      Ö×                                                                              ´ µ ÖÖÓÞ

     ÙÖ º               Óר ×     ØÖ Ò×ÔÓÖØ Ô Ö Ð ÙÒÓ× ÔÖÓ Ù ØÓ× × ÙÒ Ð × Ö Ð ÓÒ ×                                                     Ð Ö
 º
                                                     Å Ö           Ó
                                                           ¼¼
                                 Å Ö
                                  ¾¼¼
                                                     ÖÕÙ × Ñ ØÓ                   Ö   ×      ÈÙ ÖØÓ ÇÖ      Þ
                                                         ¼                         ¼¼              ¼¼




      ÙÖ º              Ö Ó      ÔÖ ÓÖ           ×                 ×ØÖ Ù ÓÒ ÒØÖ Ð                       Ù         ×ÔÖ Ð             ÑÒ
     ÖÒ
  Ò ÐÓ Ñ ÒØ ¸      ÑÓ× Ð ÙÐ Ö Ð ÔÖÓÚ × ÓÒ ØÓØ Ð¸ Ù Ð × Ð ×ÙÑ ÔÖÓÚ × ÓÒ ×º Ò Ð
   ÑÔÐÓ¸ Ø Ò ÑÓ× ÓÑÓ Ñ Ò ØÓØ Ð 2900 Ý ÔÖÓÚ × ÓÒ ØÓØ Ð 1950º ÓÖ ÓÑ ÒÞ ÑÓ×
×ÙÔÖ Ñ Ö ÐÓ× ÒÓ Ó× Ù × Ý Ö ×Ø Ö Ð Ñ Ò ØÓØ Ð × Ð ÙÐØ ÑÓ Ö Ò Ó ØÓÔÓÐÓ Ó
   ר Ð ÔÖ Ñ ÖÓ ×Ø ÕÙ Ù×ØÓ Ð Ñ Ò × Ñ ÒÓÖ ÕÙ Ð ÔÖÓÚ × ÓÒº Ò Ð ×Ó
Ð ÖÒ ´¬ ÙÖ º µ¸ ÓÑ ÒÞ ÑÓ× ÔÓÖ ÈÙ ÖØÓ ÇÖ Þ ¹ÙÐØ ÑÓ Ö Ò Ó ØÓÔÓÐÓ Ó¹¸ ÐÓ ÕÙ
ÒÓ×       ÙÒ Ñ Ò       2300º ÄÙ Ó Ö ×Ø ÑÓ×       Ö × ¹Ô ÒÙÐØ ÑÓ Ö Ò Ó ØÓÔÓÐÓ Ó¹¸
ÐÓ ÕÙ ÒÓ×       ÙÒ Ñ Ò        1400¸ Ð Ù Ð × Ñ ÒÓÖ ÕÙ Ð ÔÖÓÚ × ÓÒ     1950º Ë ÙÒ
 רӏ ÒÓ× ÕÙ Ð ×Ù ¹Ö       Ð ¬ ÙÖ º ¹ ¸ Ð Ù Ð ÒÓ× Ô ÖÑ Ø Ð ÙÐ Ö Ð × Ò ÓÒ
    Óר Ñ Ò ÑÓº Ò ×Ø ×Ù ¹Ö × × Ò Ð Ö ×ØÖ Ò Ö Ð Ô                 ÙÒ Ù
 Ð ×ÙÑ ÖÓ Ð Ú ÐÓÖ Ð Ñ Ò ¸ Ô٠׸ ÐÓ ÓÒØÖ Ö Ó¸ Ð Ð ÓÖ ØÑÓ ÔÙ ÐÐ Ú Ö Ñ ×
­Ù Ó Ð Ñ Ò Óº
     Ë Ù Ñ ÒØ ¸ Ø Ò ÑÓ× Ó× ÐØ ÖÒ Ø Ú × Ò Ö Ð × Ô Ö ×ØÖ Ù Ö Ð ÔÖÓÚ × ÓÒ Ö ×Ø ÒØ º
Ä ÔÖ Ñ Ö × ÓÒרÖÙ Ö ÙÒ ×Ù ¹Ö ÓÒ ÐÓ× ÒÓ Ó× Ð ÔÖ Ñ Ö Ö Ò Ó ØÓÔÓÐÓ Ó × ÙÒ
Ð ÔÖ ÓÖ       Ð × ÙÒ × ÓÐÓ Ö ØÓ Ó× ÐÓ× ÒÓ Ó× Ö ×Ø ÒØ ׸ Ñ Ò Ö              ÖÑ×
7.12. Flujos de coste m´
                       ınimo                                                                                                             843



Ñ Ò Ñ Ð º ר ÙÐØ ÑÓ Ö Ø Ö Ó ÒÓ× ÖÖÓ ÙÒ ×Ù ¹Ö רÖÙ ØÙÖ ÐÑ ÒØ × Ñ Ð Ö Ð
Ð ¬ ÙÖ º ¹ º Ò Ù Ð ×ÕÙ Ö       Ð × Ó× ÐØ ÖÒ Ø Ú × × ×ØÖ ÙÝ ØÓ Ð ÔÖÓÚ × ÓÒ
Ö ×Ø ÒØ Ð Ñ Ò ÑÓ Óר º
                                        ¼»


                                        ¼»½¿¼


                                       ¼¼»¾¼         Å Ö


                                      ¿ ¼»½ ¼
    Ö    ÒØ Ò                                                       200/0
                      ¿ ¼               ¼»¾½¼
    ÓÐÓÑ                ¼
                                       ¼¼»½¼                        600/0
                        ¼    ÖÒ                     Å Ö      Ó                   Ì
                                      ¿ ¼»½¾
        Ö × Ð          ¼¼                                           500/0
                                        ¼» ¼                                                 Ö    ÒØ Ò

                                        ¼»½¼¼
        ÙÐ
                                                                                             ÓÐÓÑ                           ÈÙ ÖØÓ ÇÖ    Þ
                                       ¼¼»½
                                                                                                                ÖÒ
                                                    ÖÕÙ × Ñ ØÓ
                                                                                                 Ö × Ð                          Ö    ×
                                      ¿ ¼»½¿

                                        ¼»                                                       ÙÐ




                     ´ µ ËÙ ¹Ö        ÓÒ       ÑÒ          × ÙÖ                           ´ µ ËÙ ¹Ö           ÓÒ Ñ Ò         Ò×Ù¬ ÒØ


                                   ÙÖ º             ËÙ ¹Ö ×                  Ð ÙÐÓ × ÙÒ ÔÖ ÓÖ                   ×

7.12.4.2             Trasbordo

  Ò Ð ÔÖÓ Ð Ñ Ð ØÖ × ÓÖ Ó × Ø Ò Ò m ÔÖÓÚ ÓÖ ×¸ n Ñ Ò ÒØ × Ý k ÔÓ× ØÓ× Ó
ÔÙÒØÓ× ØÖ × ÓÖ Óº Ë Ñ Ð Ö Ð ÔÖÓ Ð Ñ Ð ØÖ Ò×ÔÓÖØ ¸      ÔÖÓÚ ÓÖ Ø Ò ÙÒ ¹
Ô          ÔÖÓÚ × ÓÒ × ÓÑÓ         Ñ Ò ÒØ ÙÒ      ÑÒ º Ä        Ö Ò ÓÒ Ð
ÔÖÓ Ð Ñ ØÖ Ò×ÔÓÖØ Ö × Ò ÕÙ ÔÙ Ò           Ö ÒÓ Ó× ÔÓ× ØÓ× ÒØÖ ÐÓ× ÔÖÓÚ ÓÖ ×
Ý Ñ Ò ÒØ × ÕÙ Ö ÔÖ × ÒØ Ò ÔÙÒØÓ× ØÖ × ÓÖ Ó º Ô ÖØ ÐÓ× Óר × ÒÚ Ó ×
ÐÓ× ÔÖÓÚ ÓÖ ×        ÐÓ× ÔÓ× ØÓ× Ý × ÐÓ× ÔÓ× ØÓ×     ÐÓ× Ñ Ò ÒØ ¸ Ø Ñ Ò
× Ó Ö ÔÓÖ ÐÑ Ò Ñ ÒØÓº ÜØ Ò Ò Ó Ð ÑÔÐÓ Ð ×Ù ¹× ÓÒ ÔÖ                  ÒØ ¸ ÓÒ¹
× Ö ÑÓ× Ð × Ù ÒØ Ø Ð
                                                     Ñ Ò ÒØ ×               D1       D2    D3            D4         ÌÓØ Ð
                                                      Ñ Ò                    ¼        ¼      ¼                       ¾ ¼
    ÈÖÓÚ             ÓÖ ×   ÈÖÓÚ × ÓÒ                                                                                               W1       W2
                P1              ¼                                            ¿¼              ¼            ß       Óר ×             ¿¼       ½
                P2              ¼                                         ½  ¾¼                          ½¼    ÒÚ Ó ×                        ß
                P3                                                       ½¼¼ ½¾¼                          ß    ÔÖÓÚ ÓÖ              ß        ¾¼
             ÌÓØ Ð                ½

                                  ÔÓ× ØÓ×       Óר             ÔÓ× ØÓ                                         Óר × ÒÚ Ó
                                  W1                       ¿¼               ¿               ß            ¿            Ð
                                  W2                        ¼               ß         ¼     ¾¼           ½¼     Ñ Ò ÒØ
     Ð ÔÖÓ Ð Ñ × ÙÒ ÜØ Ò× ÓÒ Ð ØÖ Ò×ÔÓÖØ ¸ ÓÒ ÐÓ× ÔÓ× ØÓ× ÓÑÓ ÒÓ Ó× ÒØ Ö¹
Ñ Ó׺ ÆÓØ ÑÓ× ÕÙ Ð ÙÒ × ÒØÖ × Ò Ð Ø Ð ÒÓ Ø Ò Ò Ú ÐÓÖ × ÐÓ ÕÙ × Ò ¬ ÕÙ
ÒÓ Ü ×Ø ÓÒ Ü ÓÒ Ö Ø ÒØÖ Ð ÔÖÓÚ ÓÖ Ó ÔÓ× ØÓ Ý Ð Ñ Ò ÒØ º ×ØÓ ÔÙ
Ö ÔÖ × ÒØ Ö Ú Ö× × × ØÙ ÓÒ ×¸ × ÑÔÓ× Ð     × Ó Ö ¬ × ×Ø Ñ Ö Ó׺
   Ä ×ÓÐÙ ÓÒ ÓÒ× ×Ø Ò × ÑÔÐ Ñ ÒØ Ú Ö ÐÓ× ÒÓ Ó× ÔÓ× ØÓ× Ò Ó׺ ÍÒ ÔÓ× ØÓ
w ×     Ú Ò Ó× ÒÓ Ó× w → w º À w Ò Ò Ö Ó× × ÐÓ× ÔÖÓÚ ÓÖ × ÕÙ
844                                                                                                                Cap´
                                                                                                                      ıtulo 7. Grafos



ÑÓ Ð Þ Ò Ð × Ô         × ÒÚ Ó Ý ×Ù× Óר ׺ × w Ñ Ò ÙÒ ×ÓÐÓ Ö Ó ÓÖÖ ×ÔÓÒ¹
   ÒØ Ð Óר       ÔÓ× ØÓ ÔÓÖ ÙÒ º × w Ñ Ò Ò Ö Ó× ÐÓ× Ñ Ò ÒØ × × ÙÒ
Ð Ô           ØÖ ×ÔÓÖØ Ý Óר    ÒÚ Óº Ä ¬ ÙÖ º ÐÙ×ØÖ Ð Ö ÔÖ × ÒØ ÓÒ Ò Ö
  Ô Ø      ÓÒ Óר × Ð Ø Ð ÒØ Ö ÓÖº
     Ð Óר ÔÓÖ ÔÓ× ØÓ ÔÙ ÓÑ Ø Ö× × ÒÓ ÔÐ ¸ Ò ÙÝÓ ×Ó ÒÓ × Ò × Ö Ó Ú Ö
 Ò Ó× ÐÓ× ÒÓ Ó× ÔÓ× ØÓ׺
                                                            ∞ »½¼

                                                            ∞ »½
                                                                                                  ¼»¿
                                                                                                               D4
                                                                                                  ¼»¿
                                                              ¼»¿¼
                                        ¼»     W1                              W1
                        P2                                                                       ¿ »½¼
                                                            ∞ »¾¼
                                                                                                                                 »¼
                                                                                                  ¼»
                                       ¼»¿¼                 ∞»
             ¼»¼

                                                            ∞»                                                 D1               ¼»¼

                                                          ∞ »½¼¼                                                                ¼»¼
                                                                                                                                      Ì

                                                                                                               D2
         Ë
             ¼»¼
                        P1
                                                            ∞ »¿¼                                                               ¼»¼
                                                                                                 ¿ » ¼
              »¼                       ¿ »½
                                                             ¿ » ¼
                                               W2                              W
                                       ¿ »¾¼
                                                                                2
                                                                                                 ¿ »¾¼
                                                            ∞»      ¼                                          D3
                        P3

                                                          ∞ »½¾¼
                                                          ∞»




             ÙÖ º                 Ê ÕÙ ÑÓ Ð Þ Ð ØÖ × ÓÖ Ó × ÙÒ Ð Ø Ð ÒØ Ö ÓÖ
     ÓÑÓ × Ú ¸ Ð ÔÖÓ Ð Ñ    ØÖ × ÓÖ Ó × ÙÒ ÔÖÓ Ð Ñ     ØÖ Ò×ÔÓÖØ ¸ ÓÒ Ð Ò Ó
   ÕÙ Ü ×Ø Ò ÒÓ Ó× ÒØ ÖÑ Ó× ´ÐÓ× ØÖ × ÓÖ Ó×µº Ò × ×Ù Ú ÐÓÖ ×      ×ØÖ ÓÒ¸ Ò Ð
× ÒØ Ó ÕÙ ÔÙ × ÖÒÓ× Ñ × Ð ÒØ ÖÔÖ Ø Ö ÙÒ × ØÙ ÓÒ Ò Ø ÖÑ ÒÓ× Ð ØÖ × ÓÖ Ó
ÕÙ Ò Ð Ð ØÖ Ò×ÔÓÖØ Ó Ö × Ô Ø ×º
   ÅÙ × × ØÙ ÓÒ × ÑÙÒ Ò × ×ÓÒ ÑÓ Ð Þ Ð × Ò Ø ÖÑ ÒÓ× ØÖ × ÓÖ Óº Ä × ÖÙØ ×
  Ö ×¸ Ñ Ö Ø Ñ ×¸ ÑÔÓÖØ ÓÒ ×¸ ÓÑ Ö Ó׸ Ø º¸ ÓÒר ØÙÝ Ò ÑÔÐÓ× Ô Ö Ñ Ø Ó׺
                                                                         ÈÙÒØÓ            Ó

                        ÓÐÓÑ

                                                                         Ë Ò     ÒØÓÒ Ó                  Å Ö            Ó




                                                                        ÈÙ ÖØÓ             ÐÐÓ            Å Ö
                            Ù     ÓÖ                È Ò Ñ


                                                                                                          ÖÕÙ × Ñ ØÓ
                        Ö       ÒØ Ò
                                                                          Ä      Ù    Ö


                                                 Å    ÕÙ Ø                                                     Ö    ×
                   ר       Ó× ÍÒ      Ó×




                                                                         Ë ÒØ        Ð Ò                ÈÙ ÖØÓ ÇÖ           Þ


                            Ö × Ð              ÈÙ ÖØÓ Ä       ÖÙÞ




  ÙÖ º ÍÒ Ö             ÔÓØ Ø      ÔÖÓÚ ÓÖ ×¸ ÔÙÒØÓ× ØÖ × ÓÖ Ó Ý Ù × ¹
Ñ Ò ÒØ ׺ ÄÓ× ØÖ × ÓÖ Ó× Ø ÖÖ ×ØÖ × ×ÓÒ Ö ÓÒÓ Ó× ÓÒ ÙÒ ÖÓÑ Ó¸ ÐÓ× Ö Ó× ÓÒ ÙÒ
Ö Ø Ò ÙÐÓ Ý ÐÓ× Ñ Ö Ø ÑÓ× ÓÒ ÙÒ Ü ÓÒÓº
7.12. Flujos de coste m´
                       ınimo                                                           845



      ÓÑÓ ÙÐØ ÑÓ ÑÔÐÓ¸ ÓÒ× Ö ÑÓ× ÙÒ ÓÒ ÙÒØÓ Ô × × ÜÔÓÖØ ÓÖ × Ð ¸ ÙÒ
 ÓÒ ÙÒØÓ ÔÙ ÖØÓ× Ó ÔÙÒØÓ× ØÖ × ÓÖ Ó Ý ÙÒ ÓÒ ÙÒØÓ       Ù × Ö ÔØÓÖ ×º Ë ÙÒ
 Ð Ñ Ó ØÖ Ò×ÔÓÖØ ¸ ÐÓ× ÔÙ ÖØÓ× ÔÙ Ò Ð × ¬ Ö× Ò Ø ÖÖ ×ØÖ ×¸ Ñ Ö Ø ÑÓ× Ý Ö Ó×
× Ò¸ Ô ÖØ ÐÓ× Óר ׸ ×ØÓ ÒÓ        ÓÒØ Ö Ö Ò Ó× Ò Ð ÑÓ ÐÓ¸ ÔÙ × Ö ÙØ Ð ×Ù
  ר Ò ÓÒ ÔÓÖ ÑÔÐÓ¸ ÔÙ Ö ÑÓ× Ö ÕÙ Ö Ö ÐÓ× Ð ÙÐÓ× ×ÓÐÓ Ô Ö ÖÙØ × Ø ÖÖ ×ØÖ ×º Ä
7.12.4.3   Asignaci´n de trabajos
                   o
    ÑÒÖ ÒÖ ¸           Ò Ð ÔÖÓ Ð Ñ        × Ò ÓÒ × Ø Ò Ò n ØÖ Ó× Ó ÔÖÓÝ ØÓ× Ý
m  ØÖ     ÓÖ ×º         ØÖ       ÓÖ ÔÙ Ö Ð Þ Ö Ð ÙÒÓ× ´Ó ØÓ Ó×µ ØÖ Ó× ÙÒ Óר
¬ Ó ÔÓÖ Ðº Ä Ñ Ø        ׸ Ô٠׸ Ñ Ü Ñ Þ Ö Ð ÒØ      ØÖ Ó× Ð Ñ Ò ÑÓ Óר º ÍÒ
Ö ÔÖ × ÒØ ÓÒ Ð ×      ÔÙ      ×ÕÙ Ñ Ø Þ Ö× ×
                                    ÌÖ      Ó t1      t2   t3   t4   t5      t6
                     ÌÖ        ÓÖ
                          T1                   ¾¼        ¿¼ ½¼     ¾¼
                          T2                          ½¼ ¾ ¾       ½
                          T3                   ½      ½ ¿¼       ¼
                          T4                          ¿¼ ½¼ ¾¼ ¿
    Ð ÔÖÓ Ð Ñ × ÑÓ Ð Þ Ý Ö ×Ù ÐÚ Ñ ÒØ ÙÒ Ö            Ô Ø      ÓÒ Óר × Ò Ð Ù Ð
Ð× Ô         × ÒØÖ ÐÓ× ØÖ      ÓÖ × Ý ØÖ Ó× ×ÓÒ ÙÒ Ø Ö × Ý ÐÓ× Óר × ÐÓ× ÓÖÖ ×ÔÓÒ¹
  ÒØ × Ð Ö Ó׺ Ð ÒÓ Ó Ù ÒØ × ÓÒ Ø ÓÒ ÐÓ× ØÖ             ÓÖ × Ô           × Ñ ÝÓÖ ×
Ó Ù Ð × ÕÙ Ð ÒØ           ØÖ Ó× Ý Óר × ÒÙÐÓ׺ ÄÓ× ØÖ Ó× × ÓÒ Ø Ò ÙÒ ×Ù¹
Ñ ÖÓ ÓÒ Ô           × Ñ ÝÓÖ × Ó Ù Ð × ÕÙ Ð ÒØ          ØÖ      ÓÖ × Ý Óר × ÒÙÐÓ׺
ÍÒ ÑÔÐÓ Ô Ö Ð Ø Ð ÒØ Ö ÓÖ × ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ º º
                                               ½»¾¼

                                               ½»¾¼

                                                           t6
                                               ½»½

                                    t1         ½»½¼
                                                                      ∞ »¼
                                               ½»½         t1


                      ∞ »¼                     ½»¿¼
                                                                      ∞ »¼

                                               ½»¾         t4
                                                                      ∞ »¼
                                               ½»¾¼
                                                                      ∞ »¼        Ì
                                               ½»¾
                                    t2                     t3
                      ∞ »¼                                            ∞ »¼
             Ë        ∞ »¼                     ½»½¼

                      ∞ »¼                     ½»¿¼
                                                                      ∞ »¼
                                    t3
                                               ½»½¼        t2
                                    t4
                                               ½»½

                                               ½» ¼

                                                           t5

                                               ½»¿¼

                                               ½»¿




       ÙÖ º      Ê        Ô Ø            Ð ÔÖÓ Ð Ñ         × Ò ÓÒ × ÙÒ Ð Ø Ð ÒØ Ö ÓÖ
   Ä Ñ Ü Ñ Þ ÓÒ Ð ­Ù Ó ÖÖÓ Ð × Ò ÓÒ ÕÙ Ù Ö Ñ × ØÖ Ó׺ ÓÒ× Ù ÒØ ¹
Ñ ÒØ ¸ Ð Ñ Ò Ñ Þ ÓÒ Ð Óר ÔÖÓÔÓÖ ÓÒ Ð Ñ Ü Ñ × Ò ÓÒ Ñ Ò ÑÓ Óר º
846                                                             Cap´
                                                                   ıtulo 7. Grafos



7.12.4.4   Camino m´
                   ınimo

È Ö Ð ÙÐ Ö Ð Ñ ÒÓ Ñ Ò ÑÓ ÒØÖ ÙÒ Ô Ö ÒÓ Ó× u Ý v ÙÒ Ö Ó¸ Ð ÓÒ Ø ÑÓ×
u ÙÒ Ù ÒØ s ÓÒ Ô          Ñ ÝÓÖ Ó Ù Ð Ð Ñ Ü ÑÓ Óר ÒØÖ ÙÒ Ñ ÒÓ Ù ÐÕÙ Ö Ò
 Ð Ö Óº Ò ÐÓ Ñ ÒØ ¸ ÓÒ Ø ÑÓ× v ÙÒ ×ÙÑ ÖÓ tº Ð Ö ×ØÓ Ð Ö Ð ÓÒ ÓÖÑ Ò
ÐÓ× Ö Ó× Ð Ö Ó ÓÒ Ô              ÙÒ Ø Ö Ý Óר Ù Ð Ð Ô ×Ó Ð Ö Óº
    ÄÙ Ó¸ Ð Ñ Ü Ñ Þ Ö Ð ­Ù Ó Ð Ö ÒØ Ö ÓÖ Óר Ñ Ò ÑÓ¸ ÐÓ× Ö Ó× ÓÒ ­Ù Ó Ù Ð
  ×Ù Ô       ¸ ÕÙ ×ÓÒ ÙÒ Ø Ö Ó׸ ÓÒ ÓÖÑ Ò Ð Ñ ÒÓ Ñ Ò ÑÓ ÒØÖ u Ý vº
     Ò Ð ×Ó ÙÒ Ö Ó G Ð Ð ÓÖ ØÑÓ × × Ñ Ð Ö¸ Ô ÖÓ ÔÖ Ú Ñ ÒØ Ð ÙÐ ÑÓ× Ð
 ÕÙ Ú Ð ÒØ Ö Ó →º −
                  G

7.12.4.5   Planificaci´n
                     o

Ä ÔÐ Ò ¬ ÓÒ × ÙÒÓ ÐÓ× ÔÖÓ Ð Ñ × Ñ × ×Ó Ó× ÐÓ× Ö Ó׺ À Ý ÑÙ × Ð × ×
Ý Ú Ö×Ó× ÑÓ ÐÓ× Ý ×ÓÐÙ ÓÒ ×¸ Ý Ò Ó × ÓÑÔÐ               × Ð Ò Ð × ×Ø ÒØÖ Ø Ð × Ð
ÓÖ Ò Ñ ÒØÓ ØÓÔÓÐÓ Ó ×ØÙ Ó Ò Ü º º ´Ô Ò ¼µ × ÙÒ ÑÔÐÓº
      Ò ×Ø ×Ù ¹× ÓÒ ÔÐ ÒØ Ö ÑÓ× ÙÒ Ú Ö ÒØ ÔÐ Ò ¬ ÓÒ ÙÒ ÓÒ ÙÒØÓ                      ¹
  ÓÒ × Ö ÕÙ Ö × Ô Ö Ð Ö Ð Þ ÓÒ          ÖØ Ó Ö º Ä Ó Ö Ö ÕÙ Ö × Ø × Ö m Ò × ¹
     × ÕÙ Ñ Ò Ò Ð ÑÔÐ Ó n Ô                  ×     ÖØ ×        ÓÒ × Ý Óר ׺
     Ð ÔÖÓ Ð Ñ ÔÙ ÑÓ Ð Þ Ö× Ñ ÒØ ÙÒ Ö Ó Ô ÖØ ØÓ ´Ó ÙÒ Ñ ØÖ Þµ ÕÙ ÜÔÖ ×
Ð × Ö Ð ÓÒ × ÒØÖ Ô            ×ÝÒ ×        ׸ ÓÒ ×Ù× ÔÓÖ ÒØ × Ó ÙÔ ÓÒ Ý ×Ù×
 Óר × ÔÓÖ ÙÒ Ð Ô×Ó ¬ Ó Ø ÑÔÓ Ý Ð Ù Ð ÙÒ ÑÔÐÓ × ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ º½¼¼¹ º
    È Ö ÕÙ Ð ÑÓ ÐÓ Ý ×Ù ×ÓÐÙ ÓÒ Ø Ò Ò × ÒØ Ó¸        Ö Ð ÓÒ      Ô         Ò ×
      Ö ÔÖ × ÒØ Ö ÙÒ ÙÖ ÓÒ Ù Ðº Ë Ð × Ö Ð ÓÒ × ÜÔÖ × × Ò Ð ¬ ÙÖ º½¼¼¹
Ö ÔÖ × ÒØ Ò ÙÒ Ñ ×       ÑÔÐ Ó¸ ÒØÓÒ ×¸ × Ù Ò Ó Ð ÑÔÐÓ¸ ÔÓ ÑÓ×               Ö ÕÙ Ð
Ö Ð ÓÒ C1 −→ N1 Ö ÔÖ × ÒØ Ð Ù×Ó Ð ½¼¼± Ð Ô                      C1 ÙÒ Óר         ¿
  ÙÖ ÒØ ÙÒ Ñ ×º       ר ÑÓ Ó¸ ØÓ × Ð × Ö Ð ÓÒ × Ö ÔÖ × ÒØ Ò ÙÒ Ñ × ÔÐ ÓÒ
Ð Ô          º
    Ä Ñ Ø ×¸ ÒØÓÒ ×¸ Ò ÓÒØÖ Ö¸ ÔÓÖ             Ô      ¸ ÓÑÓ ×Ø        ÔÐ Ò ¬ Ö×
Ñ Ò Ö Ø Ð ÕÙ × Ù Ö Ò ØÓ × Ð × Ò ×           × Ð Ñ ÒÓÖ Óר ÔÓ× Ð º
   C1     Ä Ô×Ó ¼   Ä Ô×Ó ½           Óר        C1     Ä Ô×Ó ¼  Ä Ô×Ó ½        Óר
         N1 ¾¼± ¿  N1 ¼± ¿                             N1 ¾¼± ¿ N1 ¼± ¿
         N2 ¼± ¾¾                  ¾¾                  N2 ¼± ¾¾                 ¾¾
 ÌÓØ Ð ±     ½¼¼        ¼           ¼          ÌÓØ Ð ±    ½¼¼       ¼            ¼
   C10    Ä Ô×Ó ¼  Ä Ô×Ó ½       Óר
         N1 ¿¼± ¾ N6 ¾¼±
         N2 ¾¼± ¾                 ¾
         N3 ¿¼±
         N6 ¾¼±
 ÌÓØ Ð ±    ½¼¼      ¾¼           ¼
                          Ì Ð º½        Ð ÙÒ × ÔÐ Ò ¬   ÓÒ ×
    Ð ÔÖÓ Ð Ñ × ÑÓ Ð Þ ÓÑÓ Ò Ð ¬ ÙÖ º½¼¼¹ º È Ö ÕÙ Ð ­Ù Ó    Ô
Ò ×      × ÒÓ Ü     Ð ½¼¼±¸ Ð Ù ÒØ × ÓÒ Ø        Ô     ÓÒ ÙÒ Ô
 Ò ­Ù Ó Ð ½¼¼±º Ò ÐÓ Ñ ÒØ ¸       Ò ×     × ÓÒ Ø Ð ×ÙÑ ÖÓ ÓÒ Ô
7.12. Flujos de coste m´
                       ınimo                                                                        847


                       ½¼¼» ¾º¼                                  ½¼¼» ¾º¼
                 C5
                         »½¾º¼                             C5      »½¾º¼


                       ½¼¼»¿ º¼                                  ½¼¼»¿ º¼
                 C1
                        ¼»¾¾º¼                                    ¼»¾¼º¼

                                                           C1     ¼»¾¾º¼
                        ¼»¾¼º¼
                                   N1           ½¼¼»¼º¼
                        ¼»¿¼º¼                                    ¼»¿¼º¼
                 C2
                       ½ »½¼º¼                                    ¼»½ º¼    N1

                        ¼»   º¼                                   ¿¼»¾º¼

                        ¼»½ º¼                                     »½¾º¼
                                   N2
                                                ½¼¼»¼º¼
                        ¼» ¾º¼                             C2
                                                                 ½ »½¼º¼         ½½¼¼»¼º¼
                 C0
                         ¼» º¼                                              N2
                                                                  ¼» ¾º¼

                        ¼»½¾º¼                                    ¾¼»¾º¼

                                                ½¼¼»¼º¼
                        ¿¼»¾º¼                                    ¼»   º¼

                        ¾¼»¾º¼                             C0
                                                                   ¼» º¼         ½½¼¼»¼º¼
                 C10
                         ¼» º¼     N6           ½¼¼»¼º¼
                                                           C10     ¼» º¼
                        ¿¼» º¼
                                                                 ¿¼»½ º¼    N6
                                                ½¼¼»¼º¼
                         »½¾º¼                                    ¼»¿¼º¼
                                                                                 ½½¼¼»¼º¼
                       ¿¼»½ º¼              Ë   ½¼¼»¼º¼    C9      ¼» º¼
                                                ½¼¼»¼º¼
                 C9      ¼» º¼                                    ¿¼» º¼
                                                                            N0   ½½¼¼»¼º¼   Ì
                                                ½¼¼»¼º¼
                         ¼»¿º¼                             C4    ½¼»¿¼º¼
                                                                                 ½½¼¼»¼º¼
                                                                  ¼»½¾º¼
                        ¿¼» º¼
                                   N0           ½¼¼»¼º¼
                        ¼»¿¼º¼                                     ¼»¿º¼    N3   ½½¼¼»¼º¼


                       ½¼»¿¼º¼                                    ¼» ¼º¼
                 C4                N3                             ¼» ¼º¼
                        ¼» ¼º¼                             C3
                                                ½¼¼»¼º¼
                                                                                 ½½¼¼»¼º¼
                       ¿¼» ¼º¼
                                                                  ¼»½ º¼
                                                                  ¿¼» º¼
                        ¼» ¼º¼
                 C3
                        ¼»½ º¼                  ½¼¼»¼º¼           ¼»¾¼º¼    N4
                                                           C8
                                   N4                             ¼»¾ º¼
                       ½¼¼» ¼º¼
                 C7                                              ½¼¼» ¼º¼
                       ½¼¼» ¼º¼                            C7    ¿¼» ¼º¼

                        ¿¼» º¼
                                   N5
                 C6
                        ¾¼» º¼                                    ¼»½¾º¼
                                                                            N5
                        ¼»¾¼º¼
                                                                 ½¼¼» ¼º¼
                                                                  ¿¼» º¼
                 C8     ¼»¾ º¼                             C6

                        ¼»½¾º¼                                    ¾¼» º¼



            ´µ   Ö Ó               Ô ÖØ ØÓ ´ µ Ê          Ô Ø       ÓÒ Óר × ÕÙ Ú Ð ÒØ
                  Ô               × Ö¹
            ÕÙ Ö × Ô Ö            Ö ×ÓÐÚ Ö
            Ò ×     ×

       ÙÖ º½¼¼ ÈÐ ÒØ Ñ ÒØÓ                 Ö Ô Ö ÔÐ Ò ¬ Ö Ô                           × Ò ×     ×

×Ù¬ ÒØ Ô Ö ×ÓÔÓÖØ Ö ØÓ × Ð × Ô       × Ð Ñ Ü ÑÓ ÕÙ ÐÐ Ù Ò Ð Ò ×          Ò Ð
  ×Ó Ð ÑÔÐÓ × ×ÙÑ 100nº
    Ä Ñ Ü Ñ Þ ÓÒ Ð ­Ù Ó ÖÖÓ Ð ×ÕÙ Ñ ÕÙ Ñ × Ô                 × ÔÖÓÚ     Ò Ð
 ÒØ ÖÚ ÐÓ Ø ÑÔÓ Óº Ä Ñ Ò Ñ Þ ÓÒ Ð Óר ¸ Ð Ö             ÔÖ Ñ ÖÓ Ð × Ô      ×
ÕÙ Ø Ò Ò Ñ ÒÓ× Óר ׸ ÑÓ Ó ÕÙ ×Ø × ÕÙ Ò ×ÔÓÒ Ð × Ô Ö Ò ×            × ÓØÖ ×
Ó Ö ×º
    Ë Ð Ó Ö ÓÑÓ Ø Ð Ö ÕÙ Ö ØÓ × Ð × Ô      ׸ ÒØÓÒ × ÒÓ × Ò × Ö Ó Ð ÙÐ Ö Ð
 Óר Ñ Ò ÑÓ¸ ÔÙ × ØÓ Ó× ÑÓ Ó× Ð ÑÔÐ Ó       Ô       ××ÖÒÔ         ׺ ÐÓ ÓÒ¹
ØÖ Ö Ó¸ × Ð Ö Ó ÑÓ Ð Þ ÙÒ ÓÒ ÙÒØÓ    Ô       × ÔÓ× Ð ×¸ ÒØÓÒ × Ð Ñ Ò Ñ Þ ÓÒ
   Ð Óר ÖÖÓ Ð × Ò ÓÒ Ñ ÒÓ× ÓרÓ× º
848                                                                                                         Cap´
                                                                                                                   ıtulo 7. Grafos


                           ½¼¼»    º¼¼» ¾º¼

                     C5       »    º¼¼»½¾º¼


                           ½¼¼»¾¼º¼¼»¿ º¼

  ½¼¼»½¼¼º¼¼»¼º¼
                             ¼»¿¼º¼¼»¾¼º¼

                     C1      ¼» ¼º¼¼»¾¾º¼


                             ¼» ¼º¼¼»¿¼º¼

                             ¼» ¼º¼¼»½ º¼     N1
  ½¼¼»½¼¼º¼¼»¼º¼
                            ¿¼»¿¼º¼¼»¾º¼                                                                C5         »   º¼¼» ¾º¼
                                                   ½½¼¼»¾½ º¼¼»¼º¼
                              »¼º¼¼»½¾º¼                                       ½¼¼»   º¼¼»¼º¼
                                                                                                                  ¼» ¼º¼¼»¿ º¼
                     C2     ½ »¼º¼¼»½¼º¼
                                                                                                                 ½¼»½¼º¼¼»¾¼º¼        N1
                             ¼»¼º¼¼» ¾º¼      N2                                                        C1
  ½¼¼»½¼¼º¼¼»¼º¼
                            ¾¼»¾¼º¼¼»¾º¼                                       ½¼¼» ¼º¼¼»¼º¼
                                                                                                                  ¼» ¼º¼¼»   º¼

                             ¼»½¼º¼¼»    º¼        ½½¼¼»¾¾ º¼¼»¼º¼                                                                         ½½¼¼»½ ¼º¼¼»¼º¼
                                                                                                                   »   º¼¼»½¾º¼
                     C0      ¼»¾¼º¼¼» º¼
  ½¼¼»½¼¼º¼¼»¼º¼
                                                                                                        C2
                                                                               ½¼¼»   º¼¼»¼º¼                    ½ »½ º¼¼»½¼º¼
                    C10      ¼»¾¼º¼¼» º¼

  ½¼¼»½¼¼º¼¼»¼º¼            ¿¼»¼º¼¼»½ º¼      N6
                                                                                                        C3        ¼» ¼º¼¼» ¼º¼
                             ¼»¾¼º¼¼»¿¼º¼          ½½¼¼» ¼º¼¼»¼º¼                                                                     N0
                                                                               ½¼¼» ¼º¼¼»¼º¼                     ½¼»½¼º¼¼» º¼
Ë ½¼¼»½¼¼º¼¼»¼º¼     C9      ¼»¿¼º¼¼» º¼
  ½¼¼»½¼¼º¼¼»¼º¼                                                                                                                           ½½¼¼»½½¼º¼¼»¼º¼

                            ¿¼»¿¼º¼¼» º¼                                                                C9
                                                                               ½¼¼»   º¼¼»¼º¼
  ½¼¼»½¼¼º¼¼»¼º¼                              N0 ½½¼¼»½ ¼º¼¼»¼º¼ Ì                                               ¿¼»¿¼º¼¼»½ º¼
                     C4     ½¼»¼º¼¼»¿¼º¼
                                                   ½½¼¼»½ ¼º¼¼»¼º¼
                                                                          Ë
                                                                               ½¼¼»½¼¼º¼¼»¼º¼
                             ¼»¼º¼¼»½¾º¼                                                                          ¼»¼º¼¼» ¾º¼         N2       ½½¼¼»   º¼¼»¼º¼
                                                   ½½¼¼»½ ¼º¼¼»¼º¼                                      C0
                             ¼» ¼º¼¼»¿º¼      N3                               ½¼¼»¾¼º¼¼»¼º¼                     ¿¼»¿¼º¼¼» º¼                                    Ì
  ½¼¼»½¼¼º¼¼»¼º¼                                                                                                                               ½½¼¼» ¼º¼¼»¼º¼
                             ¼» ¼º¼¼» ¼º¼
                                                                                                                  ¼» ¼º¼¼»¿¼º¼        N6
                                                                                                                                           ½½¼¼»½ ¼º¼¼»¼º¼
                             ¼» ¼º¼¼» ¼º¼                                      ½¼¼» ¼º¼¼»¼º¼
                     C3                                                                                 C10
                             ¼» ¼º¼¼»½ º¼
                                                                                                                  ¼» ¼º¼¼»½¾º¼
                            ¿¼»¿¼º¼¼» º¼
                                                   ½½¼¼» ¼º¼¼»¼º¼                                                                     N4   ½½¼¼»½ ¼º¼¼»¼º¼
  ½¼¼»½¼¼º¼¼»¼º¼

                                                                               ½¼¼»½¼¼º¼¼»¼º¼                    ¾¼»¾¼º¼¼» º¼
                             ¼» ¼º¼¼»¾¼º¼     N4                                                        C4
                     C8
                             ¼»¼º¼¼»¾ º¼                                                                         ½¼»½¼º¼¼»¿¼º¼
  ½¼¼» ¼º¼¼»¼º¼
                           ½¼¼»½¼¼º¼¼» ¼º¼
                     C7                                                                                          ¿¼»¿¼º¼¼» ¼º¼
                            ¿¼»¼º¼¼» ¼º¼
                                                                               ½¼¼»½¼¼º¼¼»¼º¼

                             ¼» ¼º¼¼»½¾º¼
                                              N5                                                                  ¼» ¼º¼¼»¾ º¼
                                                                                                        C8                            N5
                            ½¼¼»¼º¼¼» ¼º¼
                                                                                                                 ¾¼»¾¼º¼¼»½¾º¼
                            ¿¼»¿¼º¼¼» º¼
                     C6
                                                                                                        C7      ½¼¼»½¼¼º¼¼» ¼º¼
                            ¾¼»¾¼º¼¼» º¼



                               ´µ                                                                                  ´ µ
                                                    ¼» ¼º¼¼» ¾º¼     N2       ½½¼¼» ¼º¼¼»¼º¼

                                                                                                    Ì
                   ½¼¼» ¼º¼¼»¼º¼        C0                                    ½½¼¼»¾¼º¼¼»¼º¼
                                                   ½¼»½¼º¼¼»½¾º¼
         Ë                                                           N4
                   ½¼¼»½¼º¼¼»¼º¼                   ½¼»½¼º¼¼»¾ º¼
                                        C8



                                                       ´µ
                   ½¼¼» ¼º¼¼»¼º¼                    ¼» ¼º¼¼» ¾º¼              ½½¼¼» ¼º¼¼»¼º¼
         Ë                              C0                           N2                             Ì




                                                       ´ µ

       ÙÖ º½¼½ ËÙ × Ú × Ø Ö ÓÒ ×                                     × Ò ÓÒ                     Ô             × Ò ×               × × ÙÒ Ð ×
    Ö Ð ÓÒ × Ð ¬ ÙÖ º½¼¼
7.12. Flujos de coste m´
                       ınimo                                                                849


                                           ½¼¼» ¾º¼

                                     C5    ½¼¼» º


                                           ½¼¼»¿ º¼

                                           ½¼¼» º¼

                                     C1    ½¼¼»½ º


                                           ½¼¼»½ º¼
                           ½¼¼»¼º¼                     N1
                                           ½¼¼»½¾º

                                           ½¼¼»¼º

                                           ½¼¼» º


                                     C2
                           ½¼¼»¼º¼         ½¼¼»½º

                                           ½¼¼»¾½º¼    N2   ½½¼¼»¼º¼

                                           ½¼¼»¼º


                                           ½¼¼»¿¿º
                           ½¼¼»¼º¼

                                     C0
                                           ½¼¼» º¼          ½½¼¼»¼º¼
                           ½¼¼»¼º¼   C10   ½¼¼»¾º¼
                                           ½¼¼» º      N6
                           ½¼¼»¼º¼
                                           ½¼¼»¾½º¼
                                                            ½½¼¼»¼º¼
                       Ë   ½¼¼»¼º¼   C9    ½¼¼»¾º¼
                           ½¼¼»¼º¼
                                           ½¼¼»½º¾
                                                       N0   ½½¼¼»¼º¼   Ì
                           ½¼¼»¼º¼         ½¼¼»¿º¼
                                     C4
                                                            ½½¼¼»¼º¼
                                           ½¼¼» º

                           ½¼¼»¼º¼
                                           ½¼¼»½º¾     N3   ½½¼¼»¼º¼

                                           ½¼¼»   º¼

                                           ½¼¼»   º¼
                           ½¼¼»¼º¼   C3
                                                            ½½¼¼»¼º¼
                                           ½¼¼» º¼
                                           ½¼¼»½º


                           ½¼¼»¼º¼
                                           ½¼¼»½¼º¼    N4
                                     C8
                                           ½¼¼»¾½º
                                           ½¼¼» ¼º¼
                                     C7    ½¼¼»½ º¼



                                           ½¼¼» º      N5

                                           ½¼¼» ¼º¼
                                           ½¼¼»¾º½
                                     C6

                                           ½¼¼»½º¾




          ÙÖ º½¼¾ Ê           Ð ¬ ÙÖ º½¼¼¹ ÓÒ ×Ù× Ô                        × ÒÓÖÑ Ð Þ   ×
     ÓÑÓ ÐÓ ÑÓ׸ Ð ×ÓÐÙ ÓÒ Ñ Ü Ñ Þ Ð ­Ù Ó Ô Ö Ó Ø Ò Ö ÙÒ × Ò ÓÒ ÔÖ Ú
 Ô          × Ò Ð ×Ó ÑÔÐÓ¸ ÙÒ × Ò ÓÒ Ò Ð × ÑÓ×ØÖ                 Ò Ð ¬ ÙÖ º½¼½¹ º
        Ö Ó ÐÐ ÒÓ Ò      × Ò ÓÒ ÓÑÔÐ Ø        Ô        Ò ×         Ñ ÒØÖ × ÕÙ ÙÒÓ
 ÓÒ ­Ù Ó¸ Ô ÖÓ ÒÓ ÐÐ ÒÓ¸ × Ò ¬ × Ò ÓÒ Ô Ö Ðº Ò ×Ø ÙÐØ ÑÓ ×Ó¸ Ó × Ð Ó Ö
Ö ÕÙ Ö ØÓ × Ð × Ô            ׸ × ÓÒרÖÙÝ ÙÒ ÒÙ Ú Ö Ò Ð Ù Ð ÐÓ× Ö Ó× ÐÐ ÒÓ× ×ÓÒ
 Ð Ñ Ò Ó× Ý ÐÓ× Ô Ö Ð × ØÙ Ð Þ Ó× ÓÒ Ð Ú ÐÓÖ      Ô       ×Ù×ØÖ       Ð Ú ÐÓÖ Ð ­Ù Ó
   Ð Ø Ö ÓÒ ÔÖ         ÒØ º
    Ä ×Ö         ¬ ÙÖ × º½¼½ ÑÙ ×ØÖ Ð × Ø Ö ÓÒ × ×ÙÑ Ò Ó ­Ù Ó Ñ Ü ÑÓ ÓÒ Óר
Ñ Ò ÑÓ Ò          Ø Ö ÓÒº Ð ÙÒ × ÔÐ Ò ¬ ÓÒ ×      Ô        × Ö ×ÙÐØ ÒØ × × ÑÙ ×ØÖ Ò
 Ò Ð × Ø Ð × º½º
     Ò Ð ÙÒ × × ØÙ ÓÒ × Ð × Ô           × ÔÙ Ò ÒÓÖÑ Ð Þ Ö× Ý ÐÐ Ú Ö× Ð ½¼¼±º ר
ÔÙ Ö × Ö Ð ×Ó¸ ÔÓÖ ÑÔÐÓ¸ Ò Ð ÙÒ × × ØÙ ÓÒ ×                  Ò Ö ÓÒ Ó ØÖ Ò×Ñ × ÓÒ
 Ð ØÖ º ÈÓÖ ÑÔÐÓ¸ Ð Ö Ð ÓÒ C5 −→ N1 ÔÙ ÒÓÖÑ Ð Þ Ö× 45×12 Ý × ×Ù × ¹100
Ú Ñ ÒØ ÓÒ Ð Ö ×ØÓ Ð × Ö Ð ÓÒ × ×Ø Ó Ø Ò Ö Ð Ö ÒÓÖÑ Ð Þ                Ð ¬ ÙÖ º½¼¾º
850                                                                 Cap´
                                                                       ıtulo 7. Grafos



     Ò ×Ø Ð × × ØÙ ÓÒ¸ Ð Óר ÔÙ Ö ÔÖ × ÒØ Ö ÙÒ ÙÖ ÓÒ ÔÐ ÓÒ Ð
  Ô      º ÈÓÖ ÑÔÐÓ¸ × Ð × Ô       × Ð Ø Ö ÐÑ ÒØ ÙÒ Ò ÓÑÓ ­Ù Ó× Ý Ð × Ò × ¹
    × ÔÙ Ò ×Ô Ö Ö Ø ÑÔÓ× Ö ØÖ Ö Ó׸ ÒØÓÒ × Ð Ø Ò       Ø Ö ÓÒ × ×Ù × Ú × ÕÙ
Ý ÑÓ× ÔÐ ÒØ Ó ÔÖÓÔÓÖ ÓÒ      Ø Ú Ñ ÒØ Ð × Ò ÓÒ          Ô     × ÕÙ ÓÒ×ÙÑ
Ñ ÒÓÖ ÙÖ ÓÒº ÍÒ ÑÔÐÓ ÔÓ Ö × Ö Ð ×ØÖ Ù ÓÒ Ð ÙÒ Ò×ÙÑÓ Ò ×Ó ÓÒØ Ò¹
  Ò Ú ÙÒ × Ò ×Ó ÙÒ Ô Ò Ñ Ó Ð Ñ ÒØÓ× Ò ×Ó Ð ÙÒ ×Ø Ó Ü Ô ÓÒ
´ Ù ÖÖ Ó × ×ØÖ Ò ØÙÖ Ðµº

7.13     Programaci´n lineal
                   o
  × Ñ ÒØ ¸ ÙÒ ÔÖÓ Ð Ñ        ÓÔØ Ñ Þ ÓÒ Ô Ö ÔÖÓ Ö Ñ ÓÒ Ð Ò Ð × ÓÑÔÓÒ               ÐÓ×
× Ù ÒØ × Ð Ñ ÒØÓ× ×Ø Ò Ö
  ½º Î Ö Ð ×         × ÓÒ ´Ó × ÑÔÐ Ñ ÒØ Ú Ö Ð ×µ x1, x2, . . . , xn Ö ÔÖ × ÒØ Ò ÔÙÒØÓ×
       Ùר Р׸ ÙÝÓ× Ú ÐÓÖ × ×ÓÒ × ÓÒÓ Ó× Ð Ò Ó Ð ÔÖÓ Ð Ñ ¸ Ý × Ð Ù Ð ×
      ÓÒØÖÓÐ Ð × ØÙ ÓÒ ÒØ Ö ×º
     Ä Ñ Ø ÙÒ ÔÖÓ Ð Ñ ÓÔØ Ñ Þ ÓÒ × Ò ÓÒØÖ Ö ÐÓ× Ú ÐÓÖ × Ð Ú Ö Ð ÕÙ
     Ñ Ü Ñ Þ Ò Ó Ñ Ò Ñ Þ Ò ÙÒ ÙÒ ÓÒ Ó Ø ÚÓ º
  ¾º ÙÒ ÓÒ Ó Ø ÚÓ × ÙÒ ÜÔÖ × ÓÒ Ñ Ø Ñ Ø ÕÙ ÒÚÓÐÙ Ö Ð × Ú Ö Ð ×
         × ÓÒ Ô Ö ÜÔÖ × Ö ÙÒ ¬Ò Ó Ñ Ø º Ä ÓÖÑ Ò Ö Ð × Ñ Ü Ñ Þ Ö Ó Ñ Ò Ñ Þ Ö Ð
     ÙÒ ÓÒ
                               Z = c1x1 + c2x2 + · · · + cnxn

  ¿º Ê ×ØÖ ÓÒ × ×ÓÒ ÜÔÖ × ÓÒ × Ñ Ø Ñ Ø × ÕÙ ÒÚÓÐÙ Ö Ò Ð × Ú Ö Ð ×                 × ÓÒ
     Ý ÕÙ ÜÔÖ × Ò Ð Ñ Ø × Ð × ×ÓÐÙ ÓÒ × ÔÓ× Ð × Ý ÜÔÖ × × Ò ÓÖÑ
                            a1,1x1 + a1,2x2 + · · · + a1,nxn ≤ b1
                            a2,1x1 + a2,2x2 + · · · + a2,nxn ≤ b2
                                                            ººº
                          am,1x1 + am,2x2 + · · · + am,nxn ≤ bm


                                 x1 ≥ 0, x2 ≥ 0, . . . xn ≥ 0

   ר ÓÖÑ Ò Ö Ð ÜÔÖ × Ö ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð × Ð × ¬              “forma est´ndar”º
                                                                         a
       Ô Ð ÑÓ× ÙÒ ÑÔÐÓ Ð × Óº ËÙÔÓÒ ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ ÙÒ ÑÔÖ × ÔÖÓ Ù ØÓÖ
          Ð Ø × ÓÒ ØÖ × ÔÐ ÒØ × Ý Ó× Ø ÔÓ×        ÐØ     ÑÓÒØ Ò Ý ÖÙØ ¸ ÔÖ Ó×
     Ú ÒØ      2000 Ý 1400¸ Ö ×Ô Ø Ú Ñ ÒØ º ÄÓ× Ñ Ö Ó×     Ð×    ÐØ××      Ö Ò Ò
Ð ÔÐ ÒØ ½¸ ÐÓ× ÓÑÔÓÒ ÒØ × Ò Ð ÔÐ ÒØ ¾ Ý Ð Ò× Ñ Ð × Ö Ð Þ Ò Ð ÔÐ ÒØ ¿º
Ä ÔÐ ÒØ ÕÙ          Ö ÐÓ× Ù ÖÓ× ÔÙ ÔÖÓ Ù Ö Ð Ñ × 70 Ù ÖÓ× ÑÓÒØ Ò Ý 30
     ÖÙØ ¸ Ô ÖÓ ÔÓÖ Ö ×ØÖ ÓÒ × ×Ù Ð Ò           ×ÓÐ ÙÖ ÔÙ         Ö Ö ÐÓ ×ÙÑÓ 80
 Ù ÖÓ× Ð Ñ ×º Ò ÐÓ Ñ ÒØ ¸ Ð ÔÐ ÒØ ¾ ÔÙ ÔÖÓ Ù Ö Ð Ñ × 40 ÓÑÔÓÒ ÒØ × Ô Ö
      Ð Ø ÑÓÒØ Ò Ý 90 Ô Ö ÖÙØ ¸ Ô ÖÓ ÔÓÖ Ö ×ØÖ ÓÒ × ×Ù ÔÖÓ ×Ó ÖÓÑ Ó¸
 Ð Ñ Ü ÑÓ ÓÑÔÓÒ ÒØ × ÕÙ ÔÙ                 Ö Ö Ð Ñ × × 100º Ò ÐÑ ÒØ ¸ Ð ÔÐ ÒØ ¿
´Ð         Ò× Ñ Ð µ¸ ÔÙ        Ò× Ñ Ð Ö ÔÓÖ Ñ × 50    Ð Ø × ÑÓÒØ Ò Ö × Ý 60 ÖÙØ
7.13. Programaci´n lineal
                o                                                         851



            ÈÐ ÒØ                   ÑÓÒØ Ò        ÊÙØ        Ô
            ½ ´Ñ Ö Ó×µ                ¼          ¿¼             ¼
            ¾ ´ ÓÑÔÓÒ ÒØ ×            ¼           ¼            ½¼¼
            ¿ ´ Ò× Ñ Ð µ              ¼           ¼             ¼
            ÈÖ Ó ÔÓÖ       ÐØ       ¾¼¼¼        ½ ¼¼

Ì Ð º¾ Ì Ð Ö ×ÙÑ Ò           Óר × Ý Ö ×ØÖ ÓÒ × Ô Ö Ð       ÑÔÐÓ     Ö   ÓÒ
   ÐØ×
× Ò Ñ Ö Ó¸ Ø Ñ Ò ÔÓÖ Ö ×ØÖ ÓÒ × Ñ ÒÓ Ó Ö ¸ Ð ÔÐ ÒØ ÒÓ ÔÙ             Ò× Ñ Ð Ö
Ñ × 80        Ð Ø × Ð Ñ ×º
    È Ö ÑÔ Ö ÕÙ Ð Ò ÐÙ Ö Ø ÚÓ ÓÒÐÐ Ú Ð ÑÔÖ ×             ÓÑ Ø Ö Ò Ùר ׸ Ð
 Ó ÖÒÓ Ð ÑÔÓÒ Ð ÑÔÖ × Ð ÓÒ ÓÒ ÕÙ ÔÓÖ                       ÐØ      ÖÙØ ÕÙ ×
Ú Ò ¸ Ð ÑÔÖ × Ø Ò ÕÙ Ú Ò Ö Ð Ñ ÒÓ× 0, 8 ÑÓÒØ Ò º
     × Ð × Ó× ×¸ × × ÓÒÓ Ö Ð × ÒØ     ×        ÐØ×           Ø ÔÓ ÕÙ ×      Ò
   Ö Ö Ð Ñ × Ô Ö Ñ Ü Ñ Þ Ö Ð Ò Ò º Ë x1 Ö ÔÖ × ÒØ Ð ÒØ                 ÐØ×
ÑÓÒØ Ò Ý x2 Ð × ÖÙØ ¸ ÒØÓÒ ×¸ ×ÙÑ Ò Ó ÕÙ Ð ×       Ð Ø × × Ö Ò Ú Ò × Ò ×Ù
ØÓØ Ð ¸ × ÔÐ ÒØ Ð × Ù ÒØ ÙÒ ÓÒ Ó Ø ÚÓ
                  Ñ Ü Ñ Þ Ö Z = 2000x1 + 1400x2 = 10x1 + 7x2             ´ º¿ µ
 ÓÒ   ÓÒ Ó Ð × × Ù ÒØ × Ö ×ØÖ ÓÒ ×
                      70x1 + 30x2 ≤ 80 ⇒ 7x1 + 3x2 ≤ 8
                     40x1 + 90x2 ≤ 100 ⇒ 4x1 + 9x2 ≤ 10
                      50x1 + 60x2 ≤ 80 ⇒ 5x1 + 6x2 ≤ 8
                            0, 8x1 > x2 ⇒ 0, 8x1 − x2 ≥ 0

    Ë Ð       ÔÖÓ Ö Ñ Ð Ò Ð ÔÓÖÕÙ ØÓ × Ð × × Ù Ð × Ý Ù ÓÒ × ÒÚÓÐÙ Ö ×
×ÓÒ Ð Ò Ð ×º Ò ØÓ¸ Ø Ð ÓÑÓ × ÐÙ×ØÖ Ò Ð ¬ ÙÖ º½¼¿¸ Ð × Ö Ø × ÓÖÖ ×ÔÓÒ ÒØ ×
  Ð × Ö ×ØÖ ÓÒ × Ð Ò Ò ÙÒ ×Ô Ó ´×ÓÑ Ö Ó Ò Ð ¬ ÙÖ µ Ò ÓÒ × × Ø × Ò Ð ×
Ö ×ØÖ ÓÒ ×º × ¸ Ú ÑÓ× ÕÙ Ð Ñ Ü ÑÓ Ð ÙÒ ÓÒ Ó Ø ÚÓ × ÙÑÔÐ Ò Ð ÔÙÒØÓ
 ÒØ Ö× ÓÒ ÕÙ Ô × ÔÓÖ Ð ÙÒ ÓÒ Ó Ø ÚÓ
    ÈÖÓ Ö Ñ × Ð Ò Ð ×     ר Ø ÔÓ ÔÙ Ò Ö ×ÓÐÚ Ö× Ñ ÒØ ÙÒ Ð Ö Ð ÓÖ ØÑÓ ÐÐ ¹
Ñ Ó × ÑÔÐ Ü ¸ × Ù ÖØÓ ÔÓÖ Ú Þ ÔÖ Ñ Ö ÔÓÖ ÓÖ        ÒØÞ Ò ½ ¸ ÙÒ Ñ ÒØÓ
Ð ÒÚ ×Ø ÓÒ ÓÔ Ö ÓÒ × Ý ÕÙ Ö Ú × Ö ÑÓ× Ò Ü º½¿º ´Ô Ò          µº Ò ÓÑ ØÖ ¸
ÙÒ × ÑÔÐ Ü × ÙÒ ÔÓÐ ÓÒÓ Ó ÔÓÐ ØÓÔÓ n¹ Ñ Ò× ÓÒ Ð n + 1 Ú ÖØ ׺ × ¸ Ð Ñ ØÓ Ó
       ÐÙ× ÓÒ ÕÙ Ð ×ÓÐÙ ÓÒ ×Ø Ð Ñ Ø ÔÓÖ Ð ÔÓÐ ØÓÔÓ ÙÝÓ× Ú ÖØ × ÓÖÖ ×ÔÓÒ Ò
 ÓÒ Ð × ÒØ Ö× ÓÒ × ÒØÖ Ð × Ö Ø × Ð × × Ù Ð × ÓÖÖ ×ÔÓÒ ÒØ × Ð × Ö ×ØÖ ¹
  ÓÒ ×º Ä Ø Ð            ×ÓÐÙ ÓÒ Ô Ò       ÕÙ Ð ÙÒ ÓÒ Ó Ø ÚÓ Ô × Ó ÒÓ ÔÓÖ Ð
ÔÓÐ ØÓÔÓº Ò Ð ÑÔÐÓ Ð ¬ ÙÖ º½¼¿¸ Ü ×Ø Ò Ó× Ö ×ØÖ ÓÒ ×¸ Ö Ó Ó× Ö Ø ×¸ ÙÝ ×
 ÒØ Ö× ÓÒ × ¬Ò Ò ÙÒ ØÖ Ò ÙÐÓ         Ø Ð º Ä ×ÓÐÙ ÓÒ¸ Ô٠׸ × Ð Ñ Ü ÑÓ ÕÙ
Ð ÙÒ ÓÒ Ó Ø ÚÓ ÔÙ        Ð ÒÞ Ö ÓÒ ÓÒ Ó ÕÙ × Ö ÙÒ× Ö         ÒØÖÓ Ð Ö     Ð
ØÖ Ò ÙÐÓº
852                                                                                 Cap´
                                                                                       ıtulo 7. Grafos


            ¿
                    7x1 + 3x2 ≤ 8
          ¾º

            ¾
                                                  10x1 + 7x2      ´ ÙÒ ÓÒ Ó       Ø ÚÓµ
          ½º                                      ËÓÐÙ ÓÒ ÓÔØ Ñ

            ½                                   0, 8x1 − x2 ≥ 0


          ¼º
                                                                   4x1 + 9x2 9 ≤ 10
                                                          5x1 + 6x2 ≤ 8
            ¼
                ¼           ¼º             ½         ½º                ¾           ¾º       ¿


        ÙÖ º½¼¿ ÁÒØ ÖÔÖ Ø ÓÒ ÓÑ ØÖ                        Ð ÔÖÓ Ö Ñ Ð Ò Ð Ý ×Ù ×ÓÐÙ ÓÒ ÓÔØ Ñ

7.13.1    Forma est´ndar de un programa lineal
                   a
À Ý Ú Ö× × Ñ Ò Ö × ÜÔÖ × Ö ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð¸ Ð × Ù Ð × Ú Ö Ò × ÙÒ Ð Ö ÙÒ×¹
ØÒ º                ØÓ× ÙÒ ÓÑÓ Ò                 Ò × Ö Ô Ö ÙÒ ×ÓÐÙ ÓÒ ÓÑÔÙØ ÓÒ Ð¸ ×
 ÓÒÚ Ò ÒØ ÕÙ ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð × ÜÔÖ × Ò Ø ÖÑ ÒÓ× ×Ù ÓÖÑ ×Ø Ò Öº
        Ò Ö Ñ ÒØ ¸ Ò Ð ÓÖÑ ×Ø Ò Ö × Ø Ò Ò n Ú Ö Ð ×                    × ÓÒ x1, x2, . . . , , xn¸
n ÒÙÑ ÖÓ× Ö Ð × c1, c2, . . . , cn ÓÖÖ ×ÔÓÒ ÒØ × ÐÓ× Ó ¬ ÒØ × Ò Ð ÙÒ ÓÒ Ó Ø ÚÓ¸
m Ö Ð × b1, b2, . . . , bm ×Ó           Ó× Ð × ÓØ × Ð × Ö ×ØÖ ÓÒ × Ý n × m Ö Ð × ai,j Ô Ö
i = 1, 2, . . . , m Ý j = 1, 2, . . . , n ÓÖÖ ×ÔÓÒ ÒØ × ÐÓ× Ó ¬ ÒØ ×      Ð × Ö ×ØÖ ÓÒ ×º
  × ¸ Ò Ö Ý ÓÑÔÙØ ÓÒ ÐÑ ÒØ ¸ Ð ¬Ò ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð × Ò ÓÒØÖ Ö n Ö Ð ×
x1, x2, . . . , xn Ø Ð ÕÙ
                                                       n
                                          Å Ü Ñ Þ Ö Z = cjxj                             ´ º¿ µ
                                                            j=1

ËÙ ØÓ
                                 n
                                       ai,jxj ≤ bi   ÔÖ     i = 1, 2, . . . , m                  ´ º¿ µ
                                 j=1
                                         xj ≥ 0   ÔÖ       j = 1, 2, . . . , n                   ´ º ¼µ
   À Ý Ú Ö × Ñ Ò Ö × Ò ÕÙ ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð ÔÙ                              ÓÒØÖ Ú Ò Ö Ð ÓÖÑ ×Ø Ò Ö
    ÙÒ ÓÒ ÙÒ ØÖ Ò× ÓÖÑ ÓÒ ÕÙ Ð ×Ø Ò Ö Þ º

7.13.2    Minimizaci´n, no maximizaci´n, de la funci´n objetivo
                    o                o              o
 Ò ×Ø ×Ó¸ Ð ÙÒ ÓÒ Ó Ø ÚÓ × ØÖ Ò× ÓÖÑ Ð Ñ Ü Ñ Þ ÓÒ Ð Ò ÓÒº ×                                          Ö¸
× Ð ÙÒ ÓÒ Ó Ø ÚÓ × Ñ Ò Ñ Þ Ö Z¸ ÒØÓÒ × Ñ Ü Ñ Þ Ö Z = −Z × ÕÙ Ú Ð ÒØ º
7.13. Programaci´n lineal
                o                                                         853



7.13.3     Variables con restricciones negativas
  ר × Ð ×Ó Ù Ò Ó × Ò Ù ÒØÖ ÙÒ Ó ¬ ÒØ Ò Ø ÚÓ ÔÓÖ ÑÔÐÓ x1 − 2x2 ≤ 4º
    Ë ÙÒ Ú Ö Ð xi Ø Ò ÙÒ Ó ¬ ÒØ Ò Ø ÚÓ¸ ÒØÓÒ ×                  Ó ÙÖÖ Ò   xi ×
×Ùר ØÙÝ ÔÓÖ xi − xi ÓÒ Ö ×ØÖ ÓÒ × xi ≥ 0 Ý xi ≥ 0º Ë Ð ÙÒ ÓÒ Ó Ø ÚÓ ÓÒØ Ò ÙÒ
Ø ÖÑ ÒÓ cixi¸ ÒØÓÒ × ×Ø × ×Ùר ØÙÝ ÔÓÖ ci(xi − xi º Ð Ñ ×ÑÓ ÑÓ Ó¸ ØÓ Ó Ø ÖÑ ÒÓ
aj,ixi ÕÙ Ô Ö Þ     Ò ÙÒ Ö ×ØÖ ÓÒ i × Ö ÑÔÐ Þ ÔÓÖ aj,ixi − aj,ixi º
7.13.3.1    Restricciones de igualdad

  ר × Ð ×Ó Ù Ò Ó Ð Ö ×ØÖ ÓÒ × Ü Ø Ñ ÒØ ÙÒ Ù Ð ÔÓÖ ÑÔÐÓ¸ x1 +x2 = 5º
    ÍÒ Ö ×ØÖ ÓÒ       Ù Ð f(x1, x2, . . . , xn) = b × ÔÐ ÒØ Ò ÓÖÑ ×Ø Ò Ö Ñ Ò¹
Ø × Ð × Ó× Ö ØÖ ÓÒ × f(x1, x2, . . . , xn) ≤ b Ý f(x1, x2, . . . , xn) ≥ bº
7.13.4     Restricciones mayor o igual
 ר × Ð ×Ó Ù Ò Ó ÙÒ Ó Ñ × Ö ×ØÖ ÓÒ ×¸ Ò ÐÙ Ö ÔÖ × ÒØ Ö× ÓÑÓ ÙÒ × Ù Ð¹
    Ñ ÒÓÖ Ó Ù Ð¸ × ÔÖ × ÒØ Ò ÓÑÓ Ñ ÝÓÖ Ó Ù Ð ÔÓÖ ÑÔÐÓ 2x1 + x2 ≥ 2º
   ÍÒ Ö ×ØÖ ÓÒ Ð Ø ÔÓ n ai,jxj ≥ bi × ÕÙ Ú Ð ÒØ
                           j=1                     j=1 −ai,jxj ≤ −biº
                                                   n



7.13.5     Un ejemplo
ËÙÔÓÒ ÑÓ× Ð × Ù ÒØ ÔÖÓ Ö Ñ Ð Ò Ð
                                Å Ò Ñ Þ Ö 2x1 − x3
ËÙ ØÓ
                              2x1 + x2 − 3x3 ≤ 3
                                   2x2 + x3 = 4
                               x1 + x2 − 2x3 ≥ −2                       ´ º ½µ
                                   x1, x2, x3 ≥ 0

Ä Ù Ð × ÕÙ Ú Ð ÒØ
                            Å ÜÑÞ Ö     − 2x1 + (x3 + x3)
ËÙ ØÓ
                            2x1 + x2 + 3x3 − 3x3 ≤ 3
                                   2x2 + x3 − x3 ≤ 4
                                   2x2 + x3 − x3 ≥ 4
                            −x1 − x2 + 2x3 − 2x3 ≤ 2                    ´ º ¾µ
                                    x1, x2, x3, x3 ≥ 0

Ä ÒÚ Ö× ÓÒ Ð Ö ×ØÖ ÓÒ ´ º ½µ Ô Ö Ò Ð Ö ×ØÖ ÓÒ ´ º ¾µ¸ Ð Ù Ð ÔÐ ÒØ Ó×
ÒÙ Ú × Ö ×ØÖ ÓÒ × Ò Ø Ú ×º Ê Ð Þ Ò Ó Ð ØÖ Ò× ÓÖÑ ÓÒ ÓÖÖ ×ÔÓÒ ÒØ ¸ Ô Ö ÑÓ×
 Ò
                       Å Ü Ñ Þ Ö − 2(x1 + x1) + (x3 + x3)
854                                                                       Cap´
                                                                             ıtulo 7. Grafos



ËÙ ØÓ
                     2x1 − 2x1 + x2 − x2 + 3x3 − 3x3 ≤ 3
                                2x2 − 2x2 + x3 − x3 ≤ 4
                                2x2 − 2x2 + x3 − x3 ≥ 4
                      −x1 + x1 − x2 + x2 + 2x3 − 2x3 ≤ 2
                                 x1, x1, x2, x2, x3, x3 ≥ 0

   ÈÓÖ × ÑÔÐ    ¸ Ò ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð Ò ×Ù ÓÖÑ ×Ø Ò Ö ×ÓÐÓ × ×Ô ¬ Ð
 ÙÒ ÓÒ Ó Ø ÚÓ Ý ×Ù× Ö ×ØÖ ÓÒ × Ñ ÒÓÖ Ó Ù Ð Ð × Ö ×ØÖ ÓÒ × ÒÓ Ò Ø Ú ÒÓ
× ×Ô ¬ Òº

7.13.6   Forma “holgada” de un programa lineal
Ä ÓÖÑ ×Ø Ò Ö ÔÙ         Ö Ú Ö× ÓÑÓ Ð ÙÒ ÓÒ Ó Ø ÚÓ Z Ý × Ù Ð                         Ñ ØÖ Ð
 ×
                                      Ax ≤ b                         ´ º ¿µ
  ÓÒ A × Ð Ñ ØÖ Þ Ó ¬ ÒØ × Ð × Ö ×ØÖ ÓÒ ×¸ x Ð Ú ØÓÖ Ú Ö Ð ×           × ÓÒ
Ý b Ð Ú ØÓÖ ÓØ × Ð × Ö ×ØÖ ÓÒ ×º Ä × Ö ×ØÖ ÓÒ × ÒÓ Ò Ø Ú         × ×ÙÑ Ò
ÔÖ        Ð Ñ ÒØÓ xi Ý ÒÓ × ÓÐÓ Ò ÔÓÖ ÓÑ × ÓÒº
      ÓÖ Ò¸ Ð Ñ ÝÓÖ         ÐÓ× Ñ ØÓ Ó× ×ÓÐÙ ÓÒ ÔÖÓ Ö Ñ × Ð Ò Ð × Ö ÕÙ Ö Ò
 ÓÑÓ ÒØÖ ÙÒ × ×Ø Ñ Ð Ò Ð ÓÖÑ
                                      Ax = b                                           ´º µ
 × Ö¸ Ð Ü Ô ÓÒ Ð ÒÓ Ò Ø Ú                     ÔÖ             xi¸   ØÓ × Ð × Ö ×ØÖ ÓÒ × ×ÓÒ
 ÙÐ º
  ËÙÔÓÒ ÑÓ× ÙÒ Ö ×ØÖ ÓÒ n
                                      ai,jxj ≤ bi                                      ´º µ
                                j=1

  ÓÖ ÒØÖÓ ÙÞ ÑÓ× ÙÒ ÒÙ Ú Ú Ö Ð        s   Ý ÔÐ ÒØ ÑÓ× Ð              × ÙÐ        Ó Ó× Ö ×ØÖ ¹
 ÓÒ ×
                                                n
                             s = bi −               ai,jxj                             ´º µ
                                              j=1
                             s ≥ 0                                                     ´º µ
Ä ÚÖ      Ð s × ÒÓÑ Ò ÓÐ            ´ ×Ð µ¸ ÔÓÖÕÙ ÜÔÖ × Ð Ö Ò ÒØÖ ÐÓ× Ó×
Ð Ó×     Ð × Ù Ð ´ º µº
  ÈÖ       ÓÒÚ ÖØ Ö ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð Ò ÓÖÑ ×Ø Ò Ö ÙÒÓ Ò ÓÖÑ ÓÐ    × Ù× Ò
mÚ Ö     Ð×       ÓÒ Ð ×     ÓÐ ÙÖ Ð Ø ÔÓ
                                          n
                        xj+k = bj −             ai,jxj                                 ´º µ
                                          j=1
                        xj+k ≥ 0      ÔÖ      k = 1, 2, . . . , m                      ´º µ
7.13. Programaci´n lineal
                o                                                         855



   ÈÓÖ     ÑÔÐÓ¸ Ô Ö Ð ÔÖÓ Ö Ñ Ò ÓÖÑ ×Ø Ò Ö
                                       Z = x1 − 2x2 + x3
                            x1 + 2x2 − x3 ≤ 4
                        2x1 − 3x2 − 2x3 ≤ 3
                            x1 + x2 + 2x3 ≤ 2

Ë ØÖ Ò× ÓÖÑ Ò ×Ù ÓÖÑ ÓÐ            Ò
                              Z = x1 − 2x2 + x3
                              x4 = 4 − x1 − 2x2 + x3
                              x5 = 3 − 2x1 + 3x2 + 2x3
                              x6 = 2 − x1 − x2 − 2x3

7.13.7     El m´todo simplex
               e
7.13.7.1    Esquema general

ÍÒ Ù Ò Ñ Ò Ö        ÒØ Ò Ö Ð ÔÖ Ò Ô Ó Ð × ÑÔÐ Ü ÓÒ× ×Ø Ò ÔÐ ÒØ ÖÐÓ ÓÑÓ Ð
Ö ×ÓÐÙ ÓÒ ÙÒ × ×Ø Ñ      Ù ÓÒ ×º ÓÒ× Ö ÑÓ׸ Ô٠׸ Ð × Ù ÒØ ÔÖÓ Ð Ñ
                         Å Ü Ñ Þ Ö Z = 25 x3 + 40 x2 + 30 x1
               ËÙ ØÓ 2 x3 + 4x2 + 3 x1 ≤ 500
                         5 x3 + 2 x2 + 5x1 ≤ 650
                            2 x3 + 6 x2 + x1 ≤ 820

 Ð Ù Ð Ð ÐÐ Ú ÖÐÓ ×Ù ÓÖÑ ÓÐ     ÒÓ× ÕÙ
                    Å Ü Ñ Þ Ö z = 25 x3 + 40 x2 + 30 x1                 ´ º ¼µ
                     ËÙ ØÓ x4 = −2 x3 − 4 x2 − 3 x1 + 500               ´ º ½µ
                            x5 = −5 x3 − 2 x2 − 5 x1 + 650              ´ º ¾µ
                            x6 = −2 x3 − 6 x2 − x1 + 820                ´ º ¿µ
   ÙÒ × ×Ø Ñ     Ù ÓÒ ×    ר Ø ÔÓ ×Ù Ð ÐÐ Ñ Ö× Ð       ÓÒ Ö Ó º Ò ×Ø ר Ó¸
 Ð Ú ÐÓÖ Ð ÙÒ ÓÒ Ó Ø ÚÓ × 0 ÓÖÖ ×ÔÓÒ ÒØ Ð Ú ÖØ (0, 0, 0)¸ Ð Ù Ð × ÙÒ
×ÓÐÙ ÓÒ Ú Ð Ö ×Ô ØÓ Ð ÓÒ ÙÒØÓ Ö ×ØÖ ÓÒ ×¸ Ô ÖÓ ÒÓ Ñ Ü Ñ º ÓÑ Ò ÑÓ× ÔÓÖ
 ÙÑ ÒØ Ö Ð Ú ÐÓÖ Z ×Ô Ò Ó x2 Ð ÙÒ × Ð × Ö ×ØÖ ÓÒ ×º È Ö ÙÑ ÒØ Ö Ð ×
ÔÓ× Ð       ×   Ö ÙÒ× Ö Ö× Ð × Ö ×ØÖ ÓÒ ×¸       ÑÓ× × Ó Ö Ð Ñ × × Ú Ö º È Ö
 ÐÐÓ¸ Ú ÐÙ ÑÓ× Ð ÑÔ ØÓ ÕÙ Ø Ò Ö Ð ÙÑ ÒØÓ Ú ÐÓÖ x2 Ò                ÙÒ      Ð×
Ö ×ØÖ ÓÒ ×
                      x4 ≥ 0 ⇒ −4 x2 + 500 ≥ 0 ⇒ x2 < 125
                       x5 ≥ 0 ⇒ −2 x2 + 650 ≥ 0 ⇒ x2 < 325
                                                 410
                    x6 ≥ 0 ⇒ −6 x2 + 820 ⇒ x2 <      ≈ 136.67
                                                  3
 × ¸ ×Ô ÑÓ× x2 ´ º ½µ¸ ÔÙ × × ÔÓÖ ÓÒ Ñ × ÔÓ ÑÓ× ÙÑ ÒØ Ö Z¸            Ó ÕÙ ×
Ð Ñ × ÐØÓ Ó ¬ ÒØ ¸ × Ò Ú ÓÐ Ö Ò Ò ÙÒ Ö ×ØÖ ÓÒ
                            x2 = −
                                     x4 x3 3 x1
                                     4
                                       −
                                         2
                                           −
                                             4
                                                + 125                   ´º µ
856                                                                   Cap´
                                                                         ıtulo 7. Grafos



     ÓÖ Ö ÑÔÐ Þ ÑÓ× ×Ø Ù ÓÒ Ò Ð              ÓÒ Ö Ó ÔÖ      ÒØ Ô Ö Ó Ø Ò Ö Ð × Ù ÒØ
                     Å ÜÑÞ Ö Z =           −10 x4 + 5 x3 + 5000                 ´º µ
                      ËÙ ØÓ x2 =            x4 x3 3 x1
                                           − −
                                             4    2
                                                     −
                                                         4
                                                            + 125               ´º µ
                                    x5 =
                                           x4
                                           2
                                              − 4 x3 −
                                                         7 x1
                                                          2
                                                              + 400                ´º µ
                                    x6 =
                                           3 x4
                                            2
                                                + x3 +
                                                         7 x1
                                                          2
                                                              + 70                 ´º µ
  ÕÙ Ð × ×Ø Ñ × Ò Ù ÒØÖ Ò Ð ÔÙÒØÓ (0, 125, 0)¸ Ð Ù Ð ÙÒ Ò Ò Ò Z 5000º
  Ü Ñ Ò Ò Ó Z Ò ×Ø ÒÙ ÚÓ      ÓÒ Ö Ó¸ Ú ÑÓ× ÕÙ Ð ÙÒ ÔÓ× Ð       ÙÑ ÒØ ÖÐ
 × ÔÓÖ Ð Ú Ö Ð x3¸ ÔÙ × Ð ÓØÖ Ö ×Ø ÒØ × Ò Ø Ú º × ¸ × Ð ÓÒ ÑÓ× x3 ÓÑÓ Ð
Ú Ö Ð ÙÑ ÒØ Ö Ý Ð ×Ô ÑÓ× Ð Ö ×ØÖ ÓÒ Ñ × × Ú Ö ¸ Ð Ù Ð × ´ º µº רÓ
ÒÓ× Ð × Ù ÒØ        ÓÒ Ö Ó
                     Å ÜÑÞ Ö   Z = −
                                        5 x5 75 x4 35 x1
                                         4
                                            −
                                                 8
                                                    −
                                                        8
                                                           + 5500                  ´º µ
                      ËÙ ØÓ    x2   =
                                      x5 5 x4 5 x1
                                      8
                                         −
                                            16
                                                −
                                                   16
                                                      + 75                         ´ º ¼µ
                               x3
                                        x5 x4 7 x1
                                    = − +
                                        4    8
                                                −
                                                    8
                                                      + 100                        ´ º ½µ
                               x6
                                        x5 13 x4 21 x1
                                    = − +
                                        4      8
                                                   +
                                                      8
                                                          + 170      ´ º ¾µ
  Ð × Ö ØÓ Ó× ÐÓ× Ó ¬ ÒØ   Z Ò Ø ÚÓ׸ ÔÓ ÑÓ× ÓÒ ÐÙ Ö ÕÙ ÒÓ × ÔÓ× Ð ÙÑ Ò¹
Ø ÖÐ Ñ ×º ÓÒ× Ù ÒØ Ñ ÒØ ¸ Z × Ñ Ü Ñ ¸ ÓÒ Ú ÐÓÖ 5500¸ ÓÖÖ ×ÔÓÒ ÒØ Ð Ú ÖØ
(0, 75, 100)º
      Ð ÔÖÓ ×Ó ÕÙ     ÑÓ×    ÑÔÐ ¬ Ö ÔÙ      Ò Ö Ð Þ Ö× ÙÒ ÒØ     ÒÖ
Ú Ö Ð × Ý ÙØÓÑ Ø Þ Ö× º È Ö ÐÐÓ¸ Ò ÔÖ Ñ Ö Òר Ò ¸ ¬Ò ÑÓ× Ð Ð × Simplex<T>¸
Ð Ù Ð Ö × Ò Ð Ö ÚÓ Ë ÑÔРܺÀ           ¸ Ý ÕÙ Ö Ò × Ö × Ó× × ¬Ò ÓÑÓ × Ù
 Ë ÑÔРܺÀ       ≡
    template <typename T> class Simplex
    {
    public:
      enum State { Not_Solved, Solving, Unbounded, Solved, Unfeasible };
         Å Ñ ÖÓ× ÔÖ Ú Ó× Ë ÑÔÐ Ü
         Å Ñ ÖÓ× ÔÙ Ð Ó× Ë ÑÔÐ Ü
    };
Ä Ð × Simplex × ÙÒ ×ÓÐÙ ÓÒ ÓÖ  ÔÖÓ Ö Ñ × Ð Ò Ð × ×Ô ¬ Ó× Ò ÓÖÑ
 ר Ò Ö¸ ÙÝ ÒØ       ÚÖ Ð×    Ò Ö× Ò Ø ÑÔÓ ÓÒרÖÙ ÓÒ
 Å Ñ ÖÓ× ÔÙ Ð Ó× Ë ÑÔÐ Ü  ≡                    ´ µ
    Simplex(int n)
n ׸ Ô٠׸ Ð ÒØ     Ú Ö Ð × Ö ×ØÖ ÓÒ Ð × ×Ø Ñ º Ä Ú Ö Ð × × ÒÙÑ Ö Ò
 × Ð 0 ר n − 1º Ð Ú ÐÓÖ n¸ ÒØ ÖÒ Ñ ÒØ ÒÓÑ Ö Ó ÓÑÓ num var¸ × Ó Ø Ò
Ñ ÒØ Ð ÔÖ Ñ Ø Ú get num vars()º
7.13.7.2     Definici´n de la funci´n objetivo
                    o             o

    Ù Ò Ó × Òר Ò ÙÒ × ×Ø Ñ ¸ ÐÓ× Ó ¬ ÒØ × Ð ÙÒ ÓÒ Ó Ø ÚÓ ×ÓÒ ÒÙÐÓ× Ý ÒÓ
     Ý Ö ×ØÖ ÓÒ ×º × ¸ ×Ù ×Ô ¬ ÓÒ × Ö Ñ Ø × ÑÔÐ Ñ ÒØ Ò Ö ×Ù× Ó ¬ ÒØ ×
7.13. Programaci´n lineal
                o                                                   857



Ñ ÒØ
Å Ñ ÖÓ× ÔÙ Ð Ó×      Ë ÑÔÐ Ü       +≡                 ´     µ
  void put_objetive_function_coef(int i, const T & coef)
 ÓÒ i × Ð ÒÙÑ ÖÓ Ð Ú Ö Ð Ý coef ×Ù Ó ¬ ÒØ Ò Ð ÙÒ ÓÒ Ó Ø ÚÓº
   ÍÒ ÐØ ÖÒ Ø Ú Ô Ö Ò Ö Ð ÙÒ ÓÒ Ó Ø ÚÓ ÓÒ× ×Ø Ò ÓÐÓ Ö ×Ù× Ó ¬ ÒØ × Ò
ÙÒ ÖÖ ÐÓº È Ö ÐÐÓ¸ × ÔÙ  ÑÔÐ Ö Ð ÙÒ Ð × × Ù ÒØ × ÔÖ Ñ Ø Ú ×
 Å Ñ ÖÓ× ÔÙ Ð Ó× Ë ÑÔÐ Ü   +≡              ´ µ
  void put_objetive_function(DynArray<T> & coefs)
  void put_objetive_function(T coefs[])
Í× × DynArray ¾º

7.13.7.3   Definici´n de las restricciones
                  o

È Ö Ó Ð ÙÒ ÓÒ Ó Ø ÚÓ¸ Ý Ú Ö Ó× ×ÕÙ Ñ × Ô Ö ¬Ò Ö Ð × Ö ×ØÖ ÓÒ ×º Ð
ÔÖ Ñ ÖÓ¸ Ù Ð Ô Ö × Ö Ð Ñ × Ù×٠и ÓÒ× ×Ø Ò Ò ÖÐ Ð × ×Ø Ñ Ð Ü ×Ø Ò ÙÒ
Ö ×ØÖ ÓÒ
 Å Ñ ÖÓ× ÔÙ Ð Ó× Ë ÑÔÐ Ü       +≡             ´ µ
  T * put_restriction(T * coefs = NULL)
ÍÒ ÐÐ Ñ       put restriction() Ö     Ò Ð × ×Ø Ñ ÙÒ ÒÙ Ú Ö ×ØÖ ÓÒ Ò ÓÖÑ
 ר Ò Ö ÓÒ Ó ¬ ÒØ × ÒÙÐÓ׺ Ä ÖÙØ Ò Ö ØÓÖÒ ÙÒ ÔÙÒØ ÖÓ ÙÒ ÖÖ ÐÓ Ó ¬ ÒØ ×
   Ð Ö ×ØÖ ÓÒ ÒÙÑ Ö Ó× ÒØÖ 0..num varº Ä Ó Ø Ò ÓÒ       ר ÔÙÒØ ÖÓ    ×Ó
  Ö ØÓ       ÙÒÓ ÐÓ× Ó ¬ ÒØ ׺
     × ÔÓ× Ð Ó Ø Ò Ö Ð Ñ ×ÑÓ ÔÙÒØ ÖÓ Ñ ÒØ
Å Ñ ÖÓ× ÔÙ Ð Ó× Ë ÑÔÐ Ü         +≡               ´ µ         ½
  T * get_restriction(int rest_num)
                Ö ØÓÖÒ ÙÒ ÔÙÒØ ÖÓ Ð i¹ × ÑÓ ÖÖ ÐÓ Ö ×ØÖ ÓÒº
get restriction(i)
   Ì Ñ Ò × ÔÓ× Ð Ô × Ö Ö Ø Ñ ÒØ ÐÓ× Ú ÐÓÖ × ÐÓ× Ó ¬ ÒØ × Ò ÙÒ ÖÖ ÐÓ
Ñ ÒØ ÙÒ ÐÐ Ñ        put restriction(ptr)¸ ÓÒ ptr × Ð ÔÙÒØ ÖÓ Ð ÖÖ ÐÓ
 Ó ¬ ÒØ ׺
7.13.7.4   La estructura de datos

ÍÒ Ð Ú ÖÙ Ð Ò Ð ÙØÓÑ Ø Þ ÓÒ Ð × ÑÔÐ Ü Ö × Ò Ð ÑÔÐ Ó ÙÒ              Ù
 רÖÙ ØÙÖ        ØÓ׺ ÆÓ × Ð Ô Ö Ø Ö× ÕÙ Ð Ñ ØÓ Ó × ×Ø ÒØ Ö Ñ Ò × ÒØ
Ö ×ÓÐÚ Ö ÙÒ × ×Ø Ñ Ð Ò Ð   Ù ÓÒ ×º Ò × × ÒØ Ó¸ ×Ù× Ñ ØÓ Ó× Ö ×ÓÐÙ ÓÒ ×ÓÒ
 ÔÐ Ð × Ô Ö Ð × ÑÔРܺ
      ÓÒ× Ö ÑÓ× ÓÑÓ ÑÔÐÓ Ð × Ù ÒØ × ×Ø Ñ Ò ÓÖÑ ×Ø Ò Ö
                           Z = 40x0 + 50x1 + 60x2 + 30x3

ËÙ ØÓ
                               2x0 + x1 + 2x2 + 2x3 ≤ 205
                                x0 + x1 + 3x2 + x3 ≤ 205
                                    x0 + 3x1 + 4x2 ≤ 255
                           3x0 + 2x1 + 2x2 + 2x3 ≤ 250
858                                                                                Cap´
                                                                                      ıtulo 7. Grafos



     Ð ÔÖÓ Ö Ñ Ð Ò Ð × Ö ÔÖ × ÒØ Ò Ñ ÒØ ÙÒ Ñ ØÖ Þ m (n + m + 1) × (m + 1)¸ ÓÒ
n ´num varµ  × Ð ÒØ         ÚÖ Ð×            × ÓÒ Ý m ´num restµ Ð Ö ×ØÖ ÓÒ ×º Ä
ÔÖ Ñ Ö ¬Ð ÓÒØ Ò Z − f(x0, x1, . . . , xn−1) Ý Ð Ö ×ØÓ Ð × Ö ×ØÖ ÓÒ × Ò ÓÖÑ ÓÐ º
 × ¸ Ô Ö ÑÙ ×ØÖÓ ÑÔÐÓ¸ Ð Ñ ØÖ Þ Ö ×ÙÐØ ÒØ × ¬Ò ÓÑÓ
           ⎛                                                                                    ⎞
               −40.00   −50.00   −60.00   −30.00   0.00   0.00   0.00       0.00        0.00
           ⎜    2.00     1.00     2.00     2.00    1.00   0.00   0.00       0.00       205.00   ⎟
           ⎜                                                                                    ⎟
           ⎜    1.00     1.00     3.00     1.00    0.00   1.00   0.00       0.00       205.00   ⎟
           ⎜                                                                                    ⎟
           ⎝    1.00     3.00     4.00     0.00    0.00   0.00   1.00       0.00       255.00   ⎠
                3.00     2.00     2.00     2.00    0.00   0.00   0.00       1.00       250.00

   Ë ÙÒ Ð ÒØ         Ú Ö Ð × ÕÙ Ø Ò Ð × ×Ø Ñ ¸ × ÑÙÝ ÑÔÓÖØ ÒØ ¸    ØÓ×
  ÓÒÓÑ    Ñ ÑÓÖ ¸ ÕÙ Ð Ñ ØÖ Þ × ×Ô Ö º Ò × × ÒØ Ó¸ Ð Ð × Simplex<T>
 ÑÔÐ ÙÒ Ð × ÐÐ Ñ DynMatrix<T>¸ Ð Ù Ð ×Ø ÙÒ Ñ ÒØ            Ò DynArray<T>º
 ÓÒ× Ù ÒØ Ñ ÒØ ¸ DynMatrix<T> ÓÖÖ Ð × Ñ ÑÓÖ Ô Ö Ð Ñ ÒØÓ× ÒÙÐÓ× Ð
Ñ ØÖ Þº
7.13.7.5   Selecci´n del pivote
                  o

ÍÒ Ú Þ ÓÒרÖÙ ×Ø Ñ ØÖ Þ            Ò Ð¸ × ÔÖÓ     Ø Ö Ø Ú Ñ ÒØ × Ð ÓÒ Ö Ð Ð Ñ ÒØÓ
Ô ÚÓØ Ý Ô ÚÓØ Ö ×Ø ÕÙ ØÓ           Ó× ÐÓ× Ó ¬ ÒØ × Ð ÙÒ ÓÒ Ó Ø ÚÓ¸ ÐÓ× Ð ÔÖ Ñ Ö
¬Ð ¸ Ú Ò Ò ÔÓ× Ø ÚÓ׺
     Ð ÔÖ Ñ Ö Ô ×Ó ÓÒ× ×Ø Ò          Ø ÖÑ Ò Ö Ð ÓÐÙÑÒ ¸ Ù Ð × Ð Ð Ñ ÒÓÖ Ó ¬ ÒØ
Ò Ø ÚÓ Ð ÙÒ ÓÒ Ó Ø ÚÓ              Ó × ¸ Ð Ó ¬ ÒØ ÔÓÖ Ð Ù Ð Ý Ñ ÝÓÖ ÔÓ× Ð
 ÙÑ ÒØ Ö Z
 Å Ñ ÖÓ× ÔÖ Ú Ó× Ë ÑÔÐ Ü              ≡                                 ´          µ
 int compute_pivot_col() const
 {
   T minimum = numeric_limits<T>::max();
   int p = -1;
   for (int i = 0, M = num_var + num_rest; i < M; i++)
     {
       const T & c = m->read(0, i);
       if (c < minimum)
         {
           p = i;
           minimum = c;
         }
     }
   return minimum >= 0 ? -1 : p;
 }
Ë ÒÓ Ý Ó ¬ ÒØ × Ò Ø ÚÓ׸ ÒØÓÒ × Ð × ×Ø Ñ Ý × Ò Ù ÒØÖ Ò ÙÒ ×ÓÐÙ ÓÒ
ÓÔØ Ñ Ý × Ö ØÓÖÒ -1º ÐÓ ÓÒØÖ Ö Ó¸ × Ö ØÓÖÒ Ð Ò        Ð ÓÐÙÑÒ Ð Ô ÚÓØ ¸ Ð
 Ù Ð ÒÓÑ Ò ÑÓ× pº
   ÈÖ           Ø ÖÑ Ò Ö Ð ¬Ð     Ð Ô ÚÓØ ¸ Ð ÙÐ ÑÓ× Ð Ñ ÒÓÖ Ö Ó ÔÓ× Ø ÚÓ
m(i,p)/m(i,n+m) ÐÓ ÕÙ ÒÓ× ÔÖÓÔÓÖ ÓÒ Ð Ö ×ØÖ ÓÒ Ñ × × Ú Ö
 Å Ñ ÖÓ× ÔÖ Ú Ó× Ë ÑÔÐ Ü       +≡                ´ µ
 int compute_pivot_row(int p) const
 {
   int q = -1;
7.13. Programaci´n lineal
                o                                                                           859



     T min_ratio = numeric_limits<T>::max();
     for (int i = q + 1, M = num_var + num_rest; i <= num_rest; i++)
       {
         const T val = m->read(i, M);
         if (val < 0)
           continue;
         const T den = m->read(i, p);
         if (den <= 0)
           continue;
         const T ratio = val / den;
         if (ratio < min_ratio)
           {
             q = i;
             min_ratio = ratio;
           }
       }
     return q;
 }
Ë ÒÓ × Ò Ù ÒØÖ Ò Ò ÙÒ Ö Ó ÔÓ× Ø ÚÓ¸ ÒØÓÒ × × ØÖ Ø      ÙÒ × ×Ø Ñ Ð Ñ Ø Ó
 × Ö ÕÙ ÒÓ Ø Ò ÙÒ ÔÓÐ ØÓÔÓ ¬Ò Ó ´ÐÓ ÕÙ × Ö ÙÒ ÖÖÓÖ ÑÓ Ð Þ Óµ Ý ×
Ö ØÓÖÒ -1º ÐÓ ÓÒØÖ Ö Ó¸ × Ö ØÓÖÒ Ð Ò      Ð ¬Ð Ð Ô ÚÓØ ¸ Ð Ù Ð ÒÓÑ Ò Ö ÑÓ×
qº
    È Ö Ô Ö Ð × Ó× ÖÙØ Ò × ÒØ Ö ÓÖ ×¸ ÑÔÐ ÑÓ× ÙÒ Ñ ØÓ Ó ÜÔÐ ØÓ ÕÙ Ø ÖÑ Ò
 Ð Ð Ñ ÒØÓ Ô ÚÓØ
 Å Ñ ÖÓ× ÔÖ Ú Ó× Ë ÑÔÐ Ü        +≡               ´ µ           ¼
 State select_pivot(int & p, int & q)
 {
   const int col = compute_pivot_col();
   if (col == -1)
     return state = Solved;
   const int row = compute_pivot_row(col);
   if (row == -1)
     return state = Unbounded;
   p = row;
   q = col;
   return state = Solving;
 }
  ÓÑÓ ÔÙ Ò Ö Ö×       Ð Ò×Ô ÓÒ¸ Ð ÖÙØ Ò Ô Ð Ð × Ó× Ö ÒØ × Ý Ö ØÓÖÒ ÙÒ
 ר Ó ×ÓÐÙ ÓÒº ÇÖ Ò ÐÑ ÒØ ¸ ÒØ × Ð ÔÖ Ñ Ö ÐÐ Ñ         select pivot(p, q)¸
 Ð × ×Ø Ñ × Ò Ù ÒØÖ Ò Ð ×Ø Ó Not Solvedº
      × Ô Ö Ð ÔÖÓ Ö Ñ Ý Ð Ñ ØÖ Þ ÑÔÐÓ׸ Ð ÖÙØ Ò ÒØ Ö ÓÖ ÒØ ¬ Ð × Ù ÒØ
Ô ÚÓØ ´ Ò ÖÖ Ó Ò Ö ÙÐÓµ
          ⎛                                                                             ⎞
              −40.00   −50.00   −60.00   −30.00   0.00   0.00   0.00   0.00     0.00
          ⎜                                                                           ⎟
          ⎜    2.00     1.00     2.00     2.00    1.00   0.00   0.00   0.00    205.00 ⎟
          ⎜                                                                           ⎟
          ⎜    1.00     1.00     3.00     1.00    0.00   1.00   0.00   0.00    205.00 ⎟
          ⎜                                                                           ⎟
          ⎜                       º¼¼                                          255.00 ⎟
          ⎝    1.00     3.00              0.00    0.00   0.00   1.00   0.00           ⎠
               3.00     2.00     2.00     2.00    0.00   0.00   0.00   1.00    250.00

 Ð Ù Ð × ÓÖÖ ×ÔÓÒ        ÓÒ Ð ÓÐÙÑÒ ¾ ÙÝÓ Ñ Ò ÑÓ Ó ¬ ÒØ                       Ð ÙÒ ÓÒ Ó Ø ÚÓ ×
860                                                                        Cap´
                                                                                  ıtulo 7. Grafos



    −60 Ý   Ð ¬Ð ¿ ÓÖÖ ×ÔÓÒ ÒØ Ð Ñ Ò ÑÓ Ö Ó Ñ Ò(205/2, 205/3, 255/4, 250/2) = 255/4º
    7.13.7.6   Pivoteo

    Ð Ô ÚÓØ Ó ÓÒ× ×Ø Ò Ð ÙÐ Ö ÐÓ× ÒÙ ÚÓ× Ó ¬ ÒØ × Ð Ñ ØÖ Þ ÓÒ Ð × Ù ÒØ Ö Ø Ö Ó
      ½º È Ö Ð ¬Ð Ð Ô ÚÓØ p            Ð Ñ ÒØÓ ×Ø ¬Ð × Ú ÒØÖ m(p, q)º
          ר Ô ×Ó × ÕÙ Ú Ð ÒØ        ×Ô Ö Ð Ú Ö Ð xq Ð Ö ×ØÖ ÓÒ pº
      ¾º È Ö Ð Ö ×ØÓ Ð × ¬Ð × × m (p) Ð ¬Ð Ð Ô ÚÓØ ØÖ Ò× ÓÖÑ × ÙÒ Ð Ô ×Ó
          ÒØ Ö ÓÖº      ¬Ð m(i) × Ð ÙÐ ÓÑÓ m(i) = m(i) − m(i, p) × m (p)º
         Î ×ØÓ× ÔÓÖ ¬Ð ׸ רÓ× Ô ×Ó× ÕÙ Ú Ð Ò Ú ÐÙ Ö Z Ý Ð × Ö ×ØÖ ÓÒ × ÓÒ Ð ÓÒ
            Ð Ú Ö Ð xqº
    Ð ÔÖÓ ×Ó ÒØ Ö ÓÖ × ÔÙ        Ó ¬ Ö ÓÑÓ × Ù
¼   Å Ñ ÖÓ× ÔÖ Ú Ó× Ë ÑÔÐ Ü           +≡                ´ µ          ½
     void to_pivot(size_t p, size_t q)
     {
       const int M = num_var + num_rest; // cantidad de columnas
       const T pivot = m->read(p, q);
       for (int j = 0; j <= M; j++) // fila del pivote
         if (j != q)
           m->write(p, j, m->read(p, j) / pivot);
       m->write(p, q, 1);
       for (int i = 0; i <= num_rest; i++) // resto de las filas
         for (int j = 0; j <= M; j++)
           if (i != p and j != q)
             m->write(i, j, m->read(i,j) - m->read(i,q)*m->read(p,j));
       for (int i = 0; i <= num_rest; i++) // columna del pivote en 0 salvo q
         if (i != p)
           m->write(i, q, 0);
     }
      Ð Ô ÚÓØ Ó × Ð Ñ ×Ñ ÓÔ Ö ÓÒ ×Ó Ö Ð Ù Ð × ÙÒ Ñ ÒØ ÙÒ Ñ ØÓ Ó ÑÙÝ ÔÓÔÙÐ Ö
    Ö ×ÓÐÙ ÓÒ × ×Ø Ñ × Ð Ò Ð ×      Ù ÓÒ × ÐÐ Ñ Ó            Ù××¹ÂÓÖ Òº
         È Ö ÒÙ ×ØÖ Ñ ØÖ Þ ÑÔÐÓ¸ Ð Ú ÐÓÖ Ò Ð Ð ÙÒ ÓÒ Ó Ø ÚÓ × 0¸ Ð Ù Ð ×
     ÓÖÖ ×ÔÓÒ ÓÒ Ð Ú ÖØ       Ð × ÑÔÐ Ü (0, 0, 0, 0)º Ð Ö Ð Þ Ö Ð ÔÖ Ñ Ö Ô ÚÓØ Ó¸ × Ò Ö ¹
    Ñ ÒØ Ð Ú ÐÓÖ Ð ÙÒ ÓÒ Ó Ø ÚÓ Ý               ¸ Ð Ü Ô ÓÒ Ð ¬Ð Ô ÚÓØ ¸ ØÓ Ó× ÐÓ×
     Ð Ñ ÒØÓ× ×Ù ÓÐÙÑÒ ÖÓº × ¸ Ô Ö p = 2 Ý q = 3¸ Ð Ô ÚÓØ Ó ÔÖÓ Ù
               ⎛                                                                       ⎞
                 −25.00   −5.00   0.00   −30.00   0.00   0.00 15.00     0.00   3825.00
               ⎜ 1.50     −0.50                          0.00 −0.50              77.50 ⎟
               ⎜                  0.00    2.00    1.00                  0.00           ⎟
               ⎜                                                                       ⎟
               ⎜ 0.25     −1.25   0.00    ½º¼¼    0.00   1.00   −0.75   0.00     13.75 ⎟
               ⎜                                                                       ⎟
               ⎜                                                                       ⎟
               ⎝ 0.25     0.75    1.00    0.00    0.00   0.00 0.25      0.00     63.75 ⎠
                  2.50    0.50    0.00    2.00    0.00   0.00 −0.50     1.00    122.50

    Ä ÓÔ Ö ÓÒ Ð Ñ Ò Ð ÓÐÙÑÒ ¾ Ý ÐÐ Ú Ð Ú ÐÓÖ Ð ÙÒ ÓÒ Ó Ø ÚÓ 3825¸ ÓÖÖ ×¹
    ÔÓÒ ÒØ Ð Ú ÖØ       Ð × ÑÔÐ Ü (0, 0, 63.75, 0)º ÓÒØ ÒÙ Ò Ó ÓÒ Ð Ð ÙÐÓ¸ Ô Ö ÓÑÓ
    ÒÙ ÚÓ Ô ÚÓØ p = 3 ´ Ð −30µ Ý q = 2 ´ Ñ Ò(77.5/2, 13.75, 122.5/2)µ¸ ÐÓ ÕÙ ÒÓ× ÖÖÓ
7.13. Programaci´n lineal
                    o                                                                                     861


             ⎛                                                                                     ⎞
                  −17.50   −42.50      0.00   0.00   0.00    30.00   −7.50     0.00    4237.50
             ⎜                                                                                     ⎟
             ⎜     1.00      ¾º¼¼      0.00   0.00   1.00    −2.00    1.00     0.00        50.00   ⎟
             ⎜                                                                                     ⎟
             ⎜                                                                                     ⎟
             ⎜     0.25     −1.25      0.00   1.00   0.00 1.00       −0.75     0.00        13.75   ⎟
             ⎜                                                                                     ⎟
             ⎝     0.25     0.75       1.00   0.00   0.00 0.00        0.25     0.00        63.75   ⎠
                   2.00     3.00       0.00   0.00   0.00 −2.00      1.00      1.00        95.00

    ÆÓ× Ò ÓÒØÖ ÑÓ× Ò Ð Ú ÖØ (0, 0, 63.75, 13, 75) ÓÒ Ú ÐÓÖ                           ÙÒ ÓÒ Ó Ø ÚÓ      4237.5º
    È ÚÓØ ÑÓ× ÓÒ m(1, 1) ÐÓ ÕÙ ÒÓ× ÔÖÓ Ù
             ⎛                                                                                     ⎞
                  3.75     0.00     0.00   0.00   21.25     −12.50   13.75    0.00     5300.00
             ⎜                                              −1.00                                  ⎟
             ⎜    0.50     1.00     0.00   0.00    0.50               0.50    0.00      25.00      ⎟
             ⎜                                              −0.25    −0.12                         ⎟
             ⎜    0.88     0.00     0.00   1.00    0.62                       0.00      45.00      ⎟
             ⎜                                                                                     ⎟
             ⎜    −0.12    0.00     1.00   0.00   −0.38      0.75    −0.12    0.00      45.00      ⎟
             ⎝                                                                                     ⎠
                   0.50    0.00     0.00   0.00   −1.50      ½º¼¼    −0.50    1.00         20.00

     × Ö¸ Ð ÔÙÒØÓ (0, 25, 45, 45) ÓÒ Ú ÐÓÖ ÙÒ ÓÒ Ó Ø ÚÓ                            5300º    ÆÓ× Ö ×Ø ÙÒ ÙÐØ ÑÓ
    Ô ÚÓØ Ó m(4, 4)¸ ÙÝÓ Ö ×ÙÐØ Ó ¬Ò Ð ×
              ⎛                                                                                    ⎞
                   10.00   0.00     0.00   0.00 2.50        0.00 7.50        12.50    5550.00
              ⎜     1.00   1.00     0.00   0.00 −1.00       0.00 0.00        1.00      45.00       ⎟
              ⎜                                                                                    ⎟
              ⎜     1.00   0.00     0.00   1.00 0.25        0.00 −0.25       0.25      50.00       ⎟
              ⎜                                                                                    ⎟
              ⎝    −0.50   0.00     1.00   0.00 0.75        0.00 0.25        −0.75     30.00       ⎠
                    0.50   0.00     0.00   0.00 −1.50       1.00 −0.50       1.00      20.00

    × ¸ Ð Ú ÖØ (0, 45, 30, 50) Ô Ö ÙÒ Ú ÐÓÖ Ñ Ü ÑÓ 5550º
        Ð ÔÖÓ ×Ó ÒØ Ö ÓÖ × ÙØÓÑ Ø Þ ÑÙÝ × Ò ÐÐ Ñ ÒØ Ñ                           ÒØ Ð × Ù ÒØ Ñ ØÓ Ó
½    Å Ñ ÖÓ× ÔÙ Ð Ó× Ë ÑÔÐ Ü         +≡               ´                        µ               ¾
     State solve()
     {
       for (int i, j; true;)
         {
           const Simplex<T>::State state = select_pivot(i, j);
           if (state == Simplex<T>::Unbounded or state == Simplex<T>::Solved)
             return state;
           to_pivot(i, j);
         }
     }
         ÓÑÓ ÔÓ ÑÓ× ÒÓØ Ö Ð Ð ÓÖ ØÑÓ¸ Ð Ú ÐÓÖ ¬Ò Ð ÙÒ Ú Ö Ð i × Ø ÖÑ Ò
    Ñ Ö Ò Ó ×Ù ÓÐÙÑÒ ¸ Ð Ù Ð      ÓÒØ Ò Ö ÖÓ× Ý ÙÒ ÙÒÓ¸ Ý Ü Ñ Ò Ò Ó Ð Ú ÐÓÖ
    m(i, num rest)¸ ÓÒ j × Ð Ò      Ð Ú ÐÓÖ ÙÒÓ Ò Ð ÓÐÙÑÒ º ×ØÓ × ÔÙ Ö Ð Þ Ö
     ÓÒ Ð × Ù ÒØ ÖÙØ Ò
½   Å Ñ ÖÓ× ÔÖ Ú Ó× Ë ÑÔÐ Ü     +≡                       ´ µ     ¼
     T find_value(const size_t j) const
     {
       T ret_val = 0.0;
       for (int i = 1, count = 0; i < num_rest; i++)
         {
           const T & value = m->read(i, j);
           if (value == 0.0)
             continue;
           if (value == 1.0)
862                                                             Cap´
                                                                       ıtulo 7. Grafos



                if (count++ == 0)
                  ret_val = m->read(i, num_var + num_rest);
                else
                  return 0.0;
              else
                return ret_val;
            }
          return ret_val;
     }
    × ¸ ÙÒ Ú Þ Ö ×Ù ÐØÓ Ð × ×Ø Ñ ¸ ÔÓ ÑÓ× Ö Ö Ð ×ÓÐÙ ÓÒ Ñ ÒØ
¾   Å Ñ ÖÓ× ÔÙ Ð Ó× Ë ÑÔÐ Ü          +≡                  ´ µ            ½
     void load_solution()
     {
       for (int j = 0; j < num_var; j++)
         solution[j] = find_value(j);
     }


    7.13.8     Conclusi´n sobre la programaci´n lineal
                       o                     o
      Ò ×Ø × ÓÒ ÑÓ× ÔÖ × ÒØ Ó ÙÒ Ô ÒÓÖ Ñ ÑÙÝ Ò Ö Ð Ý ×ÙÔ Ö¬ Ð ×Ó Ö Ð ÔÖÓ Ö ¹
    Ñ ÓÒ Ð Ò Ð Ý ÙÒÓ ×Ù× Ñ ØÓ Ó× Ö ×ÓÐÙ ÓÒ Ñ × ÔÓÔÙÐ Ö × Ð × ÑÔРܺ
         Ð Ð ÓÖ ØÑÓ × ÑÔÐ Ü × ÜØÖ Ñ Ñ ÒØ          Ð    Ò Ð Þ Öº Å Ø Ñ Ø Ñ ÒØ × ÙÒ
     Ð ÓÖ ØÑÓ ÜÔÓÒ Ò Ð Ý × Ò Ò ÓÒØÖ Ó ×Ó× ÕÙ              ÒÖÒÐ       Ù ÓÒ ×Ø Ø ÔÓ
       Ö Ò Ñ ÒØÓº Ë Ò Ñ Ö Ó¸ Ò Ð ÔÖ Ø ¸ Ð ÔÖÓÑ Ó                  Ù ÓÒ Ð × ÑÔÐ Ü ×
     ×Ô Ø ÙÐ Ö¸ ÙÒÕÙ ÙÒ ÒÓ × ÓÑÔÖ Ò           Ò Ð Ö ÞÓÒº
          Ô × Ö Ð Ô Ö ÓÒ ÒÙ ÚÓ× Ñ ØÓ Ó× ÓÔØ Ñ Þ ÓÒ ´Ú × × ÓÒ Ö Ö Ò ×
    Ü º½ ´Ô Ò       ½µµ¸ ÔÓÖ ×Ù × ÑÔÐ        ÑÔÐ Ñ ÒØ ÓÒ Ý ×Ù Ö Ò Ñ ÒØÓ¸ Ð × ÑÔÐ Ü
    × Ù × Ò Ó ÙÒ Ð × × Ó Ò × ÔÖ Ò Ô Ð × ÓÑÓ ×ÓÐÙ ÓÒ ÓÖ ÔÖÓ Ö Ñ × Ð Ò Ð ×º
         Ò Ð ÓÒØ ÜØÓ      ר Ø ÜØÓ¸ Ð ÑÔÓÖØ Ò       Ð ÔÖÓ Ö Ñ ÓÒ Ð Ò Ð ×Ù Ý ×Ó Ö
     Ð     Ó ÕÙ Ü ×Ø ÙÒ ÒØ Ñ ÓÒ Ü ÓÒ ÒØÖ Ð × ÑÔРܸ × ÓÑÓ ÓØÖÓ× Ñ ØÓ Ó×
       ÓÔØ Ñ Þ ÓÒ¸ Ý Ð × Ö × ­Ù Óº ÓÒ× Ù ÒØ Ñ ÒØ ¸ ר ÓÒ Ü ÓÒ × ÜØ Ò× Ú
    ÐÓ× Ö Ó× Ò Ò Ö Ðº ÐÓ× ×Ô ØÓ×           ר Ú Ò ÙÐÓ ÒÓ× Ó Ö ÑÓ× Ö Ú Ñ ÒØ Ò Ð
    × Ù ÒØ × ÓÒº

    7.14      Redes de flujo y programaci´n lineal
                                        o
    ÍÒ Ö          ­Ù Ó ÔÙ    ÜÔÖ × Ö× ÓÑÓ ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð¸ Ö ×ÓÐÙ Ð Ñ        ÒØ Ù ¹
    Ð ×ÕÙ Ö      ÐÓ× Ñ ØÓ Ó× Ð ÔÖÓ Ö Ñ ÓÒ Ð Ò Ðº
    7.14.1     Conversi´n de una red capacitada de costes a un programa lineal
                       o
     ÓÒ× Ö ÑÓ× ÙÒ Ö ÔÖ × ÒØ ÓÒ Ñ ØÖ Ð Ô Ö ÙÒ Ö Ô Ø        ÓÒ Óר × n ÒÓ Ó׺
          ÒÓ Ó × × Ò Ð ÔÓÖ ÙÒ Ò Ñ ØÖ Ð Ý Ð Ö Ó ÔÓÖ ×Ù ÒØÖ   Ò Ð Ñ ØÖ Þº × ¸ Ð
    ÔÖÓ Ð Ñ ­Ù Ó Ñ Ü ÑÓ Óר Ñ Ò ÑÓ ÔÙ ÔÐ ÒØ Ö× ¸ Ò Ö Ñ ÒØ ¸ ÓÑÓ ÙÒÓ
    ÓÔØ Ñ Þ ÓÒ¸ Ð × Ù ÒØ ÑÓ Ó
                                                n   n
                                 ÅÒÑÞ Ö Z=               ci,jxi,j                ´ º ¿µ
                                               i=1 j=1
7.14. Redes de flujo y programaci´n lineal
                                o                                                              863



ËÙ ØÓ ÐÓ× ÓÒ ÙÒØÓ×         Ö ×ØÖ ÓÒ ×
                     n              n
                           xi,j −         xk,i = bi,         i = 1, 2, . . . , n              ´º µ
                     j=1            k=1
                                          xi,j ≥ 0,                          ´º µ
                                                            i, j = 1, 2, . . . , n

ÈÓÖ        Ö Ó i −→ j¸ ×Ù Ú ÐÓÖ ­Ù Ó Ö ÔÖ × ÒØ ÙÒ Ú Ö Ð         × ÓÒ xi,jº Ä ×ÙÑ
Z¸ ÓÖÖ ×ÔÓÒ ÒØ Ð Ú ÐÓÖ          ­Ù Ó Ð Ö ¸ Ö ÔÖ × ÒØ Ð ÙÒ ÓÒ Ó Ø ÚÓº ÈÓÖ
ÒÓ Ó i¸ Ð Ú ÐÓÖ bi¸ ÓÖÖ ×ÔÓÒ ÒØ Ð        Ö Ò ÒØÖ Ð ­Ù Ó ÒØÖ Ý Ð × Ð ¸
Ö ÔÖ × ÒØ ÙÒ Ö ×ØÖ ÓÒº Ð Ü Ô ÓÒ Ð Ù ÒØ Ý Ð ×ÙÑ ÖÓ¿ ¸ bi = 0¸ Ñ ÒØÖ ×
ÕÙ Ô Ö Ð Ù ÒØ Ý ×ÙÑ ÖÓ bs = btº Ò ÐÑ ÒØ ¸ ÔÙ ×ØÓ ÕÙ Ð ­Ù Ó ÒÓ ÔÙ × Ö
Ò Ø ÚÓ¸         Ú Ö Ð xi,j ≥ 0º
    Î ÑÓ׸ ÒØÓÒ ×¸ ÙÒ Ñ Ô Ó Ö ØÓ × ÙÒ Ö              Óר × ÙÒ ÔÖÓ Ö Ñ Ð Ò Ðº Ì Ð
Ñ Ô Ó × ÒÓÖÑ ÑÔÓÖØ Ò ÔÓÖ Ó× Ö ÞÓÒ × Ú Ò ÙÐ × ÒØÖ ×
   ½º Ù ÐÕÙ Ö ÔÖÓ Ð Ñ ­Ù Ó Ñ Ü ÑÓ¸ ÓÒ Ó × Ò Óר Ñ Ò ÑÓ¸ ÔÙ Ö ×ÓÐÚ Ö× Ñ ¹
         ÒØ Ð Ñ ØÓ Ó × ÑÔРܺ
   ¾º Ð ÙÒÓ× ÔÖÓ Ð Ñ × ÔÖÓ Ö Ñ ÓÒ Ð Ò Ð ÔÙ Ò Ö ×ÓÐÚ Ö× Ñ ÒØ ÙÒ Ö                 ¹
      Ô Ø º
     Ò Ð ÔÖ Ø ¸ ר × Ö ÞÓÒ × ÔÐ ÒØ Ò ÙÒ ÓÑÔÖÓÑ ×Ó Ð Ð ÓÖ ØÑ Ô Ö Ö ×ÓÐÚ Ö
ÔÖÓ Ð Ñ × ÓÒ Ö × Ô Ø × × ÓÒ Ö × Ñ × ¬ ÒØ ÕÙ Ð                     Ð ÔÖÓ Ö Ñ ÓÒ
Ð Ò Ð¸ Ô ÖÓ ÒÓ ØÓ Ó ÔÖÓ Ö Ñ Ð Ò Ð ÔÙ      ÜÔÖ × Ö× ÓÑÓ ÙÒ Ö     Ô Ø º
7.14.2   Redes generalizadas
À ר Ð ÔÖ × ÒØ ¸ Ô Ö ØÓ Ó× ÐÓ× ÑÓ ÐÓ× Ö × Ô Ø ×¸ ÑÓ× ×ÙÑ Ó Ð ÓÒ ÓÒ
    ÓÒ× ÖÚ ÓÒ ­Ù Ó ¬Ò            Ò º½¼¹ Ô º º Ê × ÕÙ ÒÓ × Ø × Ò ÕÙ ÐÐ
 ÓÒ ÓÒ ×ÓÒ ÐÐ Ñ ×¸ Ó ÖØ × Ö ×ØÖ ÓÒ ×¸ Ö × Ò Ö Ð Þ × º
     Ò Ð × Ö × Ò Ö Ð Þ × ×ÓÒ ÐÓ× Ö Ó× ÔÓ× Ò ÙÒ ØÓÖ    Ò Ò ÓÔ Ö     ­Ù Óº
 Ò Ð ÑÓ ÐÓ Ô ØÓÖ Ó¸ ÙÒ ØÓÖ           Ò Ò ´Ó Ô Ö µ a ÒØÖ ÙÒ Ö Ó u −→ v ×
 ÜÔÖ × Ñ ÒØ ×Ù Ú ÐÓÖ ÑÙÐØ ÔÐ Ò Ó Ð Ô              Ð ÖÓc
                                                ac
                                            u           v




    Ë a = 1¸ ÒØÓÒ × × ØÖ Ø            ÙÒ ÒÓ Ó ÒÓÖÑ Ðº
    Ë 0 < a < 1¸ ÒØÓÒ × ×            ØÖ Ø     ÙÒ ØÓÖ Ô Ö                        ÔÓÖ ÑÔÐÓ׸ ÙÒ ­Ù Ó
     ÓÖÖ ÒØ Ð ØÖ ÕÙ Ô ×             ÔÓÖ ÙÒ Ö × ×Ø Ò Ó ÙÒ ­Ù Ó                     Ù ÕÙ ×Ù Ö Ð ÙÒ
ÔÖ       ÔÓÖ Ú ÔÓÖ ÓÒ ¼ º
    Ë c > 1¸ ÒØÓÒ ×¸ × ØÖ Ø            ÙÒ Ò Ò        ­Ù Ó¸ ÐÓ ÕÙ Ò ÙÒ ÔÖ Ñ Ö Ñ Ö
ÔÖ       × Ñ ÒØ ÑÔÖÓ Ð º              Ü ×Ø Ò¸ ÑÔ ÖÓ¸ ×Ó× ÒÓ Ø Ò Ü Ô ÓÒ Ð ×º ÈÓÖ Ñ¹
ÔÐÓ׸ Ö × ÔÓÖ ÓÒ Ö ÙÐ Ò               Ô Ø Ð × ÓÒÓÑ Ó× ¸ Ö ×        ÒØ × ÓÐÓ Ó× ´ º º
   Ø Ö ×µ¸ Ù × Ð ÒØ ÑÔ Ö             ´ÕÙ ÙÑ ÒØ Ò ÔÓÖ ÐÐÙÚ ×µ¸ Ø º
 ¿
   Ê Ù Ö × ÕÙ Ð Ö ÔÙ Ö Ù Ö× ÙÒ ×ÓÐÓ Ù ÒØ Ý ÙÒ ×ÓÐÓ ×ÙÑ ÖÓº
    Ò Ð ÙÒÓ× ×Ó× ÒÓ × ØÖ Ø Ò ×
     ¼
                                ÙÒ ØÓÖ Ô Ö ¸ × ÒÓ ÙÒ Ö Ù ÓÒ Ð                             Ô     ¸Ð
Ù Ð ÑÓ Ð Þ Ö× Ñ ÒØ ÙÒ ÒÓ Ó ÒØ ÖÑ Ó w
                                            a          ac
                                     u          w             v
864                                                                            Cap´
                                                                                  ıtulo 7. Grafos



   ÍÒ ØÓÖ ÖÓ ÒÓ Ø Ò × ÒØ Ó¸ ÔÙ × ÕÙ Ú Ð Ð Ù× Ò        Ö Óº
     ÙÒÕÙ Ñ Ø Ñ Ø Ñ ÒØ ÔÓ× Ð ¸ ÙÒ ØÓÖ Ò Ø ÚÓ Ø ÑÔÓ Ó Ø Ò ÑÙ Ó × ÒØ Ó
 × Ó¸ ÔÙ × ÑÓ Ð Þ ÙÒ ×Ô      Ö ØÖÓ ×Ó ­Ù Ó¸ Ð Ù Ð ÔÖÓ Ð Ñ ÒØ × ÑÓ Ð Þ¹
  Ð × Ð Ô Ö×Ô Ø Ú ØÓÔÓÐÓ         Ð Ö º
     Ò Ø ÖÑ ÒÓ ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð¸Ô Ö ÙÒ ÒÓ Ó Ù ÐÕÙ Ö v¸ Ð ÓÒ× ÖÚ ÓÒ Ð
­Ù Ó ÔÙ     ÜÔÖ × Ö× ÓÑÓ
                                    f(e) −                  ae f(e) = be                    ´º µ
                         ∀e∈ÁÆ(v)             ∀e∈ÇÍÌ(v)

ÆÓØ ÑÓ× ÕÙ Ð           ÖÒ        ´ º µ ÓÒ Ð ÓÒ× ÖÚ ÓÒ Ð ­Ù Ó ÜÔÖ ×      Ò
´ º½¼µ ´ º º½¼¹ Ô     º µ × ÙÒ ØÓÖ ÑÙÐØ ÔÐ Ø ÚÓ ae Ò        Ö Ó eº
    Ê × Ò Ö ÐÞ        × × Ö ×Ù ÐÚ Ò ØÖ Ú × ÙÒ Ð ÓÖ ØÑÓ ÐÐ Ñ Ó × ÑÔÐ Ü Ö ¸
 Ð Ù Ð × Ö ÔÖ × ÒØ   Ó Ò Ü º½ ´Ô Ò        µº

7.14.3   Capacidades acotadas
 Ò ×Ø Ø ÔÓ Ö Ð ­Ù Ó ÐÓ× Ö Ó× ×Ø                       ÓØ Ó ×Ø ÓØ Ó ÔÓÖ ÐÓ× ÜØÖ ÑÓ× ÙÒÓ
Ñ Ò ÑÓ Ý ÙÒÓ Ñ Ü ÑÓ ×Ø ÙÐØ ÑÓ ÓÖÖ ×ÔÓÒ                 ÒØ Ð Ô            º
    Ò Ð ÑÓ ÐÓ Ô ØÓÖ Ó¸          Ö Ó ÓÒØ Ò              Ó× Ú ÐÓÖ × Ð ­Ù Ó Ñ Ò ÑÓ Ö ÕÙ Ö Ó Ý Ð
Ñ Ü ÑÓ Ô ÖÑ Ø Ó¸ ÐÓ× Ù Ð × ×Ù Ð Ò ÓÐÓ Ö×             ÒØÖ ÓÖ Ø × Ø Ð ÓÑÓ Ò Ð ¬ ÙÖ º½¼ ¹ º
                         [min, max]                       min       max
                     u                v          s              u          v



                 ´ µ Ö Ó ÓÒ ÓØ        ­Ù Ó ´ µ ÌÖ Ò× ÓÖÑ ÓÒ ÕÙ Ú Ð ÒØ

                 ÙÖ º½¼         Ö Ó ÓÒ ÓØ ×           ­Ù Ó Ý ×Ù ØÖ Ò× ÓÖÑ ÓÒ
   Ä ÓØ Ò Ö ÓÖ ÔÙ ÒØ ÖÔÖ Ø Ö× ÓÑÓ ÙÒ Ñ Ò           ­Ù Ó Ò Ð ÒÓ Ó u¸ Ñ ÒØÖ ×
ÕÙ Ð ×ÙÔ Ö ÓÖ × Ð Ô       Ð Ö Óº × ¸ × ÙÒ ÐÓ Ú ×ØÓ Ò Ü º½½º¿ ´Ô Ò ½¼µ¸ ÙÒ
 Ö Ó ×Ø Ø ÔÓ × ÕÙ Ú Ð ÒØ Ð Ð ¬ ÙÖ º½¼ ¹ º

7.14.4   Redes con restricciones laterales
 Ò Ð ÙÒ × Ó × ÓÒ × × Ø Ò Ò Ö ×ØÖ ÓÒ ×                     ÓÒ Ð × ÕÙ ÒÚÓÐÙ Ö Ò Ú Ö Ó× ­Ù Ó׺ ËÙ¹
ÔÓÒ ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ ØÖ × Ö Ó× a¸ b¸ c
                                          a
                                                      c
                                          b




Ý ÓÑÓ Ö ×ØÖ ÓÒ ×Ó Ö Ð ­Ù Ó            ÐÐÓ× 2f(a) − f(b) + 3f(c) ≤ 12º ÍÒ Ö ×ØÖ ÓÒ
     ר Ø ÔÓ × ÒÓÑ Ò Ö ×ØÖ ÓÒ Ð Ø Ö Ð º ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ö × ÓÒ ×Ø Ð ×
Ö ×ØÖ ÓÒ × × Ø Ð Ò         ÓÒ Ö ×ØÖ ÓÒ × Ð Ø Ö Ð × º
    Ä × Ö ×ØÖ ÓÒ × Ð Ø Ö Ð × ÒÓ Ò × Ö Ñ ÒØ Ø Ò Ò ÕÙ ×Ø Ö Ö Ð ÓÒ × ÐÓ× Ö Ó×
   ÙÒ ÒÓ Óº ÈÙ Ö ØÖ Ø Ö×          ÙÒ Ö ×ØÖ ÓÒ ÒØÖ Ö Ó× ÕÙ ÒÓ ×Ø Ò Ö Ø Ñ ÒØ
Ö Ð ÓÒ Ó× ÔÓÖ ÑÔÐÓ¸ × Ô Ö Ó× ÔÓÖ Ð Ñ ÒÓ× m Ö Ó×               ר Ò º
      Ð Ö Ñ ÒØ ¸ Ð × Ö ×ØÖ ÓÒ × Ð Ø Ö Ð × ÒÓ Ò Ò Ò Ð ÑÓ ÐÓ Ö           Ô Ø ¸ Ô ÖÓ
× Ò Ò ÓÑÓ ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð¸ ÐÓ ÕÙ ÔÙ Ö ×Ù Ö Ö ÕÙ Ð Ö × Ö ×Ù ÐÚ ÓÒ
ÙÒ Ñ ØÓ Ó Ð ÔÖÓ Ö Ñ ÓÒ Ð Ò Ðº Ð ÔÖÓ Ð Ñ ÓÒ ×Ø Ò ÓÕÙ × ÕÙ × Ô Ö Ð
7.14. Redes de flujo y programaci´n lineal
                                o                                                        865



  Ò Ò Ò × ÑÔ ÒÓ¸ Ù Ð × ×Ø ÒØ Ñ ÓÖ ÕÙ Ð Ù ÐÕÙ Ö ÐÓ× Ñ ØÓ Ó× Ð
ÔÖÓ Ö Ñ ÓÒ Ð Ò Ð¸ ÕÙ × Ø Ò ÓÒ ÙÒ Ð ÓÖ ØÑÓ Ö º
    È Ö ØÖ Ø Ö ÓÒ Ö ×ØÖ ÓÒ × Ð Ø Ö Ð ×¸ Ð Ö × Ô ÖØ ÓÒ Ò ÐÓÕÙ × ´×Ù ¹
 Ö Ó×µ × Ô Ö Ó× ÔÓÖ Ð × Ò ÓÐ × ×Ù× Ö ×ØÖ ÓÒ ×¸ Ñ ÒØ ÙÒ Ñ ØÓ Ó ÐÐ Ñ Ó
 Ö Ð ÓÒ Ð Ö Ò Ò ½ ¸ Ð Ù Ð ÒÓ × Ö ØÖ Ø Ó Ò ×Ø Ø ÜØÓº Ò ×Ø ×Ó × ÓÒ× ¹
 Ö Ò Ó× Ø ÔÓ× ÐÓÕÙ × ÐÓ× ÕÙ ÓÒØ Ò Ò Ö ×ØÖ ÓÒ × Ý ÐÓ× ÕÙ ×ÓÒ Ö × Ô Ø ×º
     ר ÑÓ Ó¸ ÐÓ× ÐÓÕÙ × ÓÒ Ö ×ØÖ ÓÒ × Ð Ø Ö Ð × × Ö ×Ù ÐÚ Ò ÓÒ Ñ ØÓ Ó× ÔÖÓ¹
 Ö Ñ ÓÒ Ð Ò Ð¸ Ñ ÒØÖ × ÕÙ ÐÓ× Ö ÓÒ Ö × ­Ù Óº Ä × ×ÓÐÙ ÓÒ × Ô Ö Ð × ×
 ÓÒ Ø Ò Ò Ø Ö Ø Ú Ñ ÒØ ר ÕÙ ÓÒÚ Ö Òº
7.14.5    Redes multi-flujo
À ר Ð ÔÖ × ÒØ ¸ ØÓ Ó× ÐÓ× ÑÓ ÐÓ× Ö        Ô Ø     ×ÙÑ Ò ÕÙ Ð × ÙÒ     × ­Ù Ó¸
Ó × ¸ Ð ­Ù Ó¸ ×ÓÒ Ð × Ñ ×Ñ × ÒØ Ò × ¸ ÔÓÖ ÐÓ× Ö Ó× ´ØÙ Ö ×µ Ö ÙÐ ÙÒ ×ÓÐÓ Ø ÔÓ
­Ù Ó ¾ º
    À Ý × ØÙ ÓÒ × Ò Ð × ÕÙ ÔÓÖ ÐÓ× Ñ ×ÑÓ× Ö Ó× ÔÙ Ò Ö ÙÐ Ö ×Ø ÒØ × Ð × ×
­Ù Ó¸ Ñ Ò Ó× × Ú Ö Ó× Ù ÒØ × Ò Ô Ò ÒØ ׸ Ð Ñ ÒÓ× Ø ÒØÓ× ÓÑÓ ×Ø ÒØÓ×
Ø ÔÓ× ­Ù Ó × Ø Ò Òº ÆÓ Ý Ö ×ØÖ ÓÒ ×Ó Ö Ð ÒØ                 ×ÙÑ ÖÓ׸ Ý Ù ÐÕÙ Ö
     רÓ× ÔÙ Ö Ö Ù Ð ×ÕÙ Ö ÐÓ× ×Ø ÒØÓ× Ø ÔÓ× ­Ù Óº
    ÍÒ × ØÙ ÓÒ ØÖ ÓÒ Ð           ר Ð ×    Ö × ÔÖ × ÒØ ÓÒ Ð ÑÓ Ð Ó ØÖ ¬ Ó
 ÙØÓÑÓØÓÖ Ó Ô ØÓÒ Ðº Ë ÔÙ Ò ÓÒ× Ö Ö¸ ÔÓÖ ÑÔÐÓ¸ Ú Ö × ÞÓÒ × Ó Ö ¬ ×
z1, z2, . . . , zn ÓÑÓ ÔÖÓÚ ÓÖ ×   ­Ù Ó ÙØÓÑÓØÓÖº ÙÒ ÖØ ÓÖ Ô Ó ¹Ð × ½¾ÔѸ
ÔÓÖ ÑÔÐÓ¹¸ ÐÓ× ÙØÓÑÓÚ Ð × × ×ÔÐ Þ Ò × Ý            Ð × ÞÓÒ × Ò Ù ×Ø ÓÒ ØÖ Ú ×
Ú × ÓÑÔ ÖØ ׺ ÓÑÓ ÔÙ Ò Ö Ö× ¸ Ò ×Ø × ØÙ ÓÒ¸ ÐÓ× ­Ù Ó× Ò Ð ÙÒ ÑÓÑ ÒØÓ
× Ò Ù ÒØÖ Òº
    ÇØÖÓ ÑÔÐÓ× ÐÓ× ÓÒר ØÙÝ Ò ÐÓ× ÔÖÓ Ð Ñ × Ð ØÖ Ò×ÔÓÖØ ´Ü º½¾º º½ ´Ô Ò ¿ µµ
Ý Ð ØÖ × ÓÖ Ó ´Ü º½¾º º¾ ´Ô Ò ¿µµ Ò ÐÓ× Ù Ð × × ÔÓ× Ò Ð × Ñ ×Ñ × Ð Ò × Ý
 ÐÑ Ò ×¸ Ô ÖÓ ×ØÓ× × ÑÔÐ Ò Ô Ö ØÖ Ò×ÔÓÖØ Ö Ý ÐÑ Ò Ö Ú Ö×Ó× Ø ÔÓ×            Ò ×º
    À ר Ð ÔÖ × ÒØ ×ÓÐÓ × ÓÒÓ ÙÒ Ñ Ò Ö ÔÓÐ ÒÓÑ Ð Ö ×ÓÐÚ Ö ×Ø ÔÖÓ Ð Ñ
ØÖ Ò× ÓÖÑ ÖÐÓ ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð Ý × ÐÐ ×ÓÐÙ ÓÒ ÖÐÓº
      Ò Ó × ÓÒ × ÙÒ Ö ÑÙÐØ ¹­Ù Ó ÔÙ Ò Ò ÓÒØÖ Ö× Ð Ô ÞÓ× ´ ÐÓÕÙ ×µ ÙÒ ×ÓÐÓ
­Ù Óº × ¸ Ð Ñ ×Ñ Ñ Ò Ö ÕÙ Ô Ö Ð × Ö × Ò Ö Ð Þ ×¸ Ð Ö ÔÙ                   Ú Ö×
 Ò ÐÓÕÙ × × ÙÒ ÐÓ× ×Ø ÒØÓ× Ø ÔÓ× ­Ù Ó¸ Ö ×ÓÐÚ Ö× Ý ÐÙ Ó Ô Ö× ×Ø Ò ÓÒØÖ Ö Ð
×ÓÐÙ ÓÒ ¿ º
7.14.6    Redes de procesamiento
ÍÒ Ö        ÔÖÓ × Ñ ÒØÓ × ÙÒ Ö  Ô Ø    ×Ô Ð ÕÙ × ÖÚ Ô Ö ÑÓ Ð Þ Ö Ý
 ×ØÙ Ö × ×Ø Ñ × ÔÖÓ Ù ÓÒº Ì Ð Ö ÓÒØ Ò Ó× Ð × × ÒÓ Ó׺ ÄÓ× ÒÓÖÑ Ð ×¸
 Ò ÐÓ× Ù Ð × × × Ø × Ð ÓÒ× ÖÚ ÓÒ ­Ù Ó Ó ×ÓÒ Ù ÒØ × Ó ×ÙÑ ÖÓ׸ Ý ÐÓ×
  ½
     È Ö Ø ÐÐ × ×Ó Ö ×Ø Ñ ØÓ Ó ÔÙ      Ò ÓÒ×ÙÐØ Ö× ¿¸ ¸ ½ º
  ¾
     Ë Ý ×Ø ÒØÓ× ØÙ Ó× Ô Ö        Ð   ×    ­Ù Ó¸ ÒØÓÒ × × ÔÙ × Ô Ö Ö Ð ÔÖÓ Ð Ñ Ò Ø ÒØ ×
Ö × ÓÑÓ Ø ÔÓ× ­Ù Ó× × Ø Ò Òº            ר Ù Ð ×Ó Ô Ö Ð ÑÔÐÓ Ð ØÖ Ò×ÔÓÖØ ÔÖ × ÒØ Ó Ò
Ü º½¾º º½ ´Ô Ò ¿ µº
   ¿
     Á Ù Ð ÕÙ Ô Ö Ð × Ö × Ò Ö Ð Þ     ׸ Ø Ò × Ô Ö Ö ×ÓÐÚ Ö Ö   × ÑÙÐØ ¹­Ù Ó ÔÙ   Ò ÓÒ×ÙÐØ Ö×
 ¿¸ ¸ ½¸ ¾ º
866                                                                                        Cap´
                                                                                              ıtulo 7. Grafos



 ÔÖÓ × Ñ ÒØÓ ¸ Ò Ð × ÒØ Ó ÕÙ ÑÓ Ð Þ Ò ÙÒ ÔÖÓ × Ñ ÒØÓ ÕÙ ÒÓ × Ø × Ð
 ÓÒ× ÖÚ ÓÒ Ð ­Ù Óº
   ÈÓÖ ÐÓ Ò Ö Ð¸ ÐÓ× ÒÓ Ó× ÒÓÖÑ Ð × ×Ù Ð Ò ÒÓØ Ö× Ñ ÒØ Ð Ô× × Ý ÐÓ× ÔÖÓ ¹
× Ñ ÒØÓ Ñ ÒØ Ö Ø Ò ÙÐÓ׺ Ä ¬ ÙÖ º½¼ ÑÔÐ ¬ ÙÒ ÔÓØ Ø Ö                ÔÖÓ ¹
× Ñ ÒØÓ Ô Ö     Ö Ö ÓØ ÐÐ × Ú Ö Ó Ò Ð Ù Ð × ÑÙ ×ØÖ Ò Ó× ÒÓ Ó× ÔÖÓ ¹
× Ñ ÒØÓº
                        Ë Ð     Ó ½¾¼¼


                       ÇÜ       ÒÓ ¾ ¼
                                                                              ÓØ ÐÐ × ½¼
                                                     Ù ÖÞÓ ½¾     ËÓÔÐ   Ó
                              ÐÓÖ ½¾¼¼
                                          ÀÓÖÒÓ
                        Å Ø ÒÓ ¾¼                  C O2 ¿ ¼

                          Ö ÓÒÓ ½¼¼




                   ÙÖ º½¼ ÍÒ                      ÑÔÐÓ           Ö           ÔÖÓ × Ñ ÒØÓ
    Ð ÒÓ Ó ÀÓÖÒÓ Ö ÔÖ × ÒØ ÙÒ Ú ÒØÙ Ð ÔÖÓ ×Ó Ò Ð Ù Ð × Ñ Þ Ð × Ð Ó ÓÒ ÓÜ ÒÓ
Ô Ö Ó Ø Ò Ö Ù ÖÞÓº ר ÔÖÓ ×Ó¸ ÔÓÖ ×     ÖÐÓ¸   × Ø × Ö ÙÒ ÓÒ ×       ÙÒ Ó ¸
ÕÙ ÑÓ Ð Ò ÐÓ× ÔÖÓ Ù ØÓ× Ö ×ÙÐØ ÒØ × ÈÓÖ ÑÔÐÓ׸ Ð ÓÖÒÓ ÔÓ Ö ÑÓ Ð Þ Ö× ×
                                         C O2 = 3 O2 + 2 C
                                         Si O2 = 5 Si + 3 O2

Å ÒØÖ × ÕÙ Ð ×ÓÔÐ Ó ×
                      12 C = 10              ÓØ ÐÐ × =⇒ ÓØ ÐÐ × = 6 C
                                                                  5
  ÍÒ Ö        ÔÖÓ × Ñ ÒØÓ × ÙÒ Ö ÓÒ Ö ×ØÖ ÓÒ × Ð Ø Ö Ð ×¸ Ö ×ÓÐÙ Ð ÓÑÓ Ý
 ÑÓ× ÜÔÐ     Óº
   Ð ÔÓ Ö     ÙÒ Ö    ÔÖÓ × Ñ ÒØÓ × ×Ù Ú Ö× Ø Ð  Ô Ö Ð ÑÓ Ð Þ ÓÒ ÙÒ
ÑÙÝ ÑÔÐ      Ñ × ×Ø Ñ × Ò Ò Ö Ð ×¸ Ò Ô ÖØ ÙÐ Ö ÑÙ Ó× ÔÖÓ ×Ó× ÓÒ ÖÒ ÒØ ×
Ð Ö ÓÒ           Ò ×º
7.14.6.1   Cadenas de producci´n
                              o


    ËÙÔÓÒ ÑÓ× Ð ÔÖÓ Ù ÓÒ ÙÒ                       ÖØÓÒ Ó Ð Ö Ð Þ ÓÒ ÔÐ Ò ÙÒ ÖØÓ × ÖÚ Óº
È Ö Ð ÓÖ Ö ÙÒ ÖØ ÒØ                          Ð   Ò¸ × Ö ÕÙ Ö Ò ÓØÖÓ× Ò × Ý × ÖÚ Ó× ÐÓ×
 ٠Р׸ ×Ù Ú Þ¸ Ø Ñ Ò Ö ÕÙ Ö Ò               ÓØÖÓ× Ò × Ý × ÖÚ Ó׺ ÄÓ× Ò × Ý × ÖÚ Ó× ×ÓÒ
 Ð ÓÖ Ó× ÔÓÖ ÒØ × ÐÐ Ñ Ó× ÔÖÓ               Ù ØÓÖ ×º ÍÒ ÔÖÓ Ù ØÓÖ × ÒÓ Ó ÔÖÓ × Ñ ÒØÓ Ð
Ø ÔÓ
                                  B0        ½ ¼»¾¼
                                                                ½ ¼»¿¼
                                           ½ ¼»¾ ¼
                                                        P                    B2
                                  B1




   ר ×Ù ¹ Ö Ó ÐÓ ÐÐ Ñ ÑÓ× Ö Ó ÔÖÓ Ù ØÓÖ º Ò ×Ø ×Ó¸ Ò ÙÒ Ð Ô×Ó Ø ÑÔÓ ¬ Ó
Ô Ö ØÓ Ó× ÐÓ× ÔÖÓ Ù ØÓÖ ×¸ Ð ÔÖÓ Ù ØÓÖ P Ð ÓÖ ½ ¼ ÙÒ      × Ð Ò B2 ÕÙ × Ú Ò
  ÙÒ ÔÖ Ó ¿¼ ÔÓÖ ÙÒ º È Ö             Ö Ö B2¸ Ð ÔÖÓ Ù ØÓÖ P Ö ÕÙ Ö ÐÓ× Ò × B0 Ý
B1 Ð × ÒØ        × Ý Óר × × Ò Ð Ó× Ò Ð Ö Óº
7.14. Redes de flujo y programaci´n lineal
                                o                                                              867



     × ÔÓ× Ð Ø Ò Ö Ú Ö Ó× ÔÖÓ Ù ØÓÖ × Ð Ñ ×ÑÓ Ò Ò ÐÙ× Ú ¸ ÔÙ Ö Ò          Ö ÔÖÓ Ù ¹
ØÓÖ × ÕÙ ¸ ÒØ Ð Ñ ×ÑÓ Ò × Ð ¸ ¬ Ö Ò ÓØÖÓ× ÔÖÓ Ù ØÓÖ × Ò Ð ÙÒÓ× Ò ×
    ÒØÖ ¸ ÐÓ Ù Ð ÔÙ Ö          Ö× ¸ ÒØÖ ÓØÖ × Ó× ×¸ ÔÖÓ ×Ó× ×Ø ÒØÓ×         Ö ÓÒ
Ù ÓÖ Ò Þ ÓÒº
    Ë ×ØÙ ÑÓ× ÐÓ× Ò ×           ÒØÖ ¸ ÒØÓÒ × ÔÓ ÑÓ× ÒØ ¬ Ö ×Ù× ÔÖÓ Ù ØÓÖ × Ý
 Ð ÓÖ Ö ÙÒ Ö Ó ÔÖÓ Ù ØÓÖ Ô Ö           ÙÒÓ     ÐÐÓ׺ ÈÓ ÑÓ× ÓÒØ ÒÙ Ö ×Ø ÔÖÓ ×Ó
Ô Ö ÐÓ× ÒÙ ÚÓ× Ò × ÕÙ Ô Ö Þ Ò ×Ø ÕÙ ¬Ò ÐÑ ÒØ ÒÓ× Ò ÓÒØÖ ÑÓ× ÓÒ Ò ×
ÔÖ Ñ Ö Ó× × Ö¸ ÕÙ ÐÐÓ× ÐÓ× Ù Ð × ÒÓ × Ð × ÔÙ           ÒØ ¬ Ö ÙÒ ÔÖÓ Ù ØÓÖ Ò ×
ÔÓÖÕÙ ×ÓÒ Ñ Ø Ö ÔÖ Ñ ¸ Ò × ÑÔÓÖØ Ó× Ù ÓØÖ × ØÙ ÓÒº
    ÄÓ× ÔÖÓ Ù ØÓÖ × Ò ØÓÖÒÓ ÙÒÓ Ó Ñ × Ò × ¬Ò Р׸ × Ý ×Ø ÙÒ Ò Ú Ð ÔÓ× Ð
Ý × Ó¸ × ÙÒ × Ð ÒØ Ö ×¸ Ð ÒÓÑ Ò ÑÓ×                 Ò ÔÖÓ Ù Ø Ú º Ò ×Ø Ö Ó¸ ÕÙ
Ö Ð ÓÒ ÔÖÓ Ù ØÓÖ ×¸ ÐÓ× Ö Ó× Ö ÔÖ × ÒØ Ò Ò × Ý ÐÓ× Ô ×Ó× ×Ù× ÒØ       × Ý Óר ׺ Ä
¬ ÙÖ º½¼ ÑÙ ×ØÖ ÙÒ ÑÔÐÓ ÔÓØ Ø Ó¸ ÙÝÓ ÜØÖ ÑÓ× ÞÕÙ Ö Ó× Ö ÔÖ × ÒØ Ò ÐÓ× ¹
                                        Py   B4 200/450
                                                          P7   B6 95/650
                         B2 450/20           B5 100/450

                         B2 300/90      P4                     B6 300/250         B7 1200/90
                                             B5 400/250   Px                P10
       B0 750/30    P2                                         B6 800/550
                         B2 150/20

       B0 1000/30                            B4 400/200   P6
                    P0   B2 180/125
                         B3 150/20      P5   B5 95/250

                                                                                  B7 400/150
       B1 400/40         B3 100/95           B4 200/350        B6 600/350
                    P1                                    P8                P9    B7 200/300
                         B2 550/75
                                        P3   B4 200/350

                         B3 300/80




                                      ÙÖ º½¼ ÍÒ           Ò ÔÖÓ Ù Ø Ú
 Ò × ÔÖ Ñ Ö Ó× Ý Ö Ó× ÐÓ× Ò × ¬Ò Р׺ Ë ÙÒ Ð Ò ÓÐ Ð × ×Ø Ñ ÔÖÓ Ù Ø ÚÓ¸ ÔÙ Ò
Ö ÔÖ × ÒØ Ö Ñ Ø Ö ÔÖ Ñ ´Ñ Ò Ö Ð × × Ó׸ Ù ¸ Ø ºµº Ò ÒÙ ×ØÖÓ Ò Ö Ó ÑÔÐÓ¸
ÐÓ× Ò × ÔÖ Ñ Ö Ó× ×ÓÒ B0 Ý B1¸ Ö ×Ô Ø Ú Ñ ÒØ º ÄÓ× ÜØÖ ÑÓ× ¬Ò Ð × Ö ÔÖ × ÒØ Ò Ð
   Ò ¬Ò Ð Ó ØÓ ×ØÙ Ó¸ Ð Ù Ð ÒÓÑ Ö ÑÓ× B7º ÄÓ× ÒÓ Ó× Ð Ö Ó Ö ÔÖ × ÒØ Ò ÔÖÓ¹
  Ù ØÓÖ × ÔÖÓ Ù ØÓ× ÒØ ÖÑ Ó× ÕÙ ÒØÖ ÐÓ× Ò × ÔÖ Ñ Ö Ó× B0 Ý B1 Ý Ð Ò ¬Ò Ð
B7 º
    È Ö ÔÖ Ò Ö Ð ÑÔÓÖØ Ò            ר ÑÔÐÓ Ý¸ ÓÒ Ð¸ Ð       Ð × Ö × ÔÖÓ ¹
× Ñ ÒØÓ¸ ÔÐ ÒØ ÑÓ× Ð ÙÒÓ× × Ò Ö Ó× Ò ÐÓ× Ù Ð × Ð ×     Ò × ÔÖÓ Ù Ø Ú × ÝÙ Ò
Ú ×ÐÙÑ Ö Ö Ö ×ÔÙ ×Ø ×
    ¯ ÁÑÔ ØÓ ÕÙ Ø Ò Ö ×Ó Ö Ð ÔÖÓ Ù ÓÒ ÙÒ × ÕÙ      × ×ÙÑ ÑÓ׸ ÔÓÖ × ÑÔÐ       ¸
      ÕÙ Ð × ÕÙ       Ø ÔÖÓÔÓÖ ÓÒ ÐÑ ÒØ ØÓ Ó Ð Ø ÖÖ ØÓÖ Ó¸ ÒØÓÒ ×¸ Ü Ñ Ò Ò Ó
           ÙÒÓ ÐÓ× Ö Ó× ÔÖÓ Ù ØÓÖ × ÓÒ Ö Ó× ÒØÖ          Ù ÖÓ׸ ÔÓ ÑÓ× Ö ×Ø Ö
      Ð ×Ñ ÒÙ ÓÒº ÄÙ Ó Ð ÙÐ ÑÓ× Ð ÑÔ ØÓ ÕÙ ×Ó Ö ÐÓ× Ò × × Ð Ø Ò
       Ò Ð ÙÒÓ× ÑÙÒ Ó× Ú Ò ÙÐ Ó× Ð ÓÒÓÑ ¸ ÐÓ× ×Ð ÓÒ × Ð ×            Ò × ÔÖÓ Ù Ø Ú × × Ð × ¬ Ò Ò
   Ù × ÐØ ׸ Ñ × Ý         ׸ Ò Ô Ö Ö × × ÙÒ Ö Ó ÓÒ ÙÒ × ÖÖ ÖÓ Ý Ð      Ò ÔÖÓ Ù Ø Ú      Ð Ñ Öº
ÐÓ× Ó×ÕÙ × Ñ Ö ÖÓ× × Ò Ù ÒØÖ Ò Ò Ð × Ù × ÐØ × Ð Ö Óº ÄÓ× Ö ÓÐ × × ÓÖØ Ò Ý ÐÓ× ØÖÓÒ Ó× ×          Ò
 Ð Ö Ó ÙÝ ÓÖÖ ÒØ ÐÓ× ÖÖ ×ØÖ ×Ø Ð × ÖÖ ÖÓ ÕÙ × Ò Ù ÒØÖ Ò Ð × Ù × Ñ                  ´Ó ÒØ ÖÑ ×µº
  Ð × ÖÖ ÖÓ Ö        ÐÓ× ØÖÓÒ Ó× Ý ÐÓ× ØÖ Ò× ÓÖÑ Ò ÔÖÓ Ù ØÓ× ÒØ ÖÑ Ó× ´Ø Р׸ ÐÓÕ٠׸ Ø ºµ ÕÙ ×
   ×ØÖ ÙÝ Ò     Ú Ö× × Ò Ù×ØÖ × Ø Ð × ÓÑÓ ÐÓ× ×Ø ÐÐ ÖÓ׸ ÑÙ Ð Ö ×¸ ÓÒרÖÙ ØÓÖ ×      × ×¸ Ø ºº ר
Ñ Ø ÓÖ ¸ ÙÒ Ò Ù×Ó¸ ÐÙ×ØÖ Ð ÑÔÓÖØ Ò ÕÙ Ø Ò Ù Ó Ð Ó×ÕÙ Ô Ö ×Ùר ÒØ Ð                        Ð     Ò
ÔÖÓ Ù Ø Ú º
868                                                                    Cap´
                                                                          ıtulo 7. Grafos



      Ð    ×Ñ ÒÙ ÓÒ           Ð × ÕÙ º ÔÐ Ò Ó Ð Ö Ø Ö Ó Ý ÔÖÓÔ Ò ÓÐÓ ØÖ Ú ×
          Ð×     Ò × ÔÓ ÑÓ× Ü Ñ Ò Ö Ð × ÓÒ× Ù Ò × ÕÙ ÙÒ × ÕÙ Ø Ò ×Ó Ö Ð
      ÔÖÓ Ù ÓÒ              Ò º
   ¯       Ó ÙÒ Ò ×Ô ¬ Ó¸ Ø ÖÑ Ò Ö Ù Ð × Ð Ò ÒØ ÖÑ Ó Ö Ø Ó Ô Ö ×Ø
      ÔÖÓ Ð Ñ × ÓÒרÖÙÝ ØÓ Ð          Ò ÔÖÓ Ù Ø Ú ØÖ × Ð Ò ÒØ Ö ×º ÄÙ Ó
      × Ð ÙÐ Ð ÓÖØ Ñ Ò ÑÓ¸ Ð Ù Ð ÖÖÓ ÐÓ× Ö Ó× ÙÝ Ô              Ð Ñ Ø Ð ÔÖÓ Ù ÓÒ
         Ð Ò ÒØ Ö ×º ÄÓ× ÔÖÓ Ù ØÓÖ × Ú Ò ÙÐ Ó× ×ØÓ× Ö Ó× ×ÓÒ ÕÙ ÐÐÓ× ÕÙ Ý
      ÕÙ Ö ÒØ Þ Ö Ð ÙÑ ÒØÓ Ô Ö ÕÙ ¸ Ò ÙÐØ Ñ Òר Ò ¸ × ÔÙ                ÙÑ ÒØ Ö Ð
      ÔÖÓ Ù ÓÒº
   ¯ Ë      × ÓÒÓ Ö Ù Ð × ÖÙ ÖÓ× Ý ÔÖÓ Ù ØÓÖ × Ý ÕÙ ÔÓÝ Ö Ó ÔÖÓØ Ö Ô Ö ÙÑ Ò¹
      Ø Ö Ð ÔÖÓ Ù ÓÒ Ð ÙÒ Ò ×Ô ¬ Ó ÕÙ ¸ Ô ÖØ                 Ø ÖÑ Ò Ö ÐÓ× ×Ð ÓÒ ×
       Ö Ø Ó׸ ÔÓ ÑÓ× ÔÐ ÒØ Ö ÒÙ ÚÓ× Ñ Ô × ÔÖÓ Ù Ø ÚÓ׺ ÈÓÖ ÑÔÐÓ¸ ÔÓ Ö ÑÓ× × Ñ¹
      ÙÐ Ö Ð ÓÒרÖÙ ÓÒ          Ö × ÒÙ Ú ×     Ò × Ö Ø Ó× Ý Ú ÐÙ Ö ×Ù ØÓ Ò Ð
      ÔÖÓ Ù ÓÒº Ð Ñ ×ÑÓ ÑÓ Ó¸ ÔÓ Ö ÑÓ× ÓÐÓ Ö Ö × Ð Ò ÒØ Ö × Ý Ó × Ö¹
      Ú Ö¸ × ÙÒ Ö Ø Ö Ó× ×ØÓ ×Ø Ó× Ó Ø ÖÑ Ò ×Ø × ´ Ð Ð ÓÖ ØÑÓ ­Ù Ó¸ ÔÓÖ ÑÔÐÓµ
      ÕÙ ×Ù       ÓÒ Ð ×Ø Ó Ð ÔÖÓ Ù ÓÒº
     רÓ× × Ò Ö Ó׸ ÒØÖ ÑÙ Ó× ÓØÖÓ׸ Ö ­ Ò Ð ÑÔÓÖØ Ò             Ð × Ö × ÔÖÓ ¹
× Ñ ÒØÓ ÓÑÓ ÓÒ×ÓÐ ÓÒ Ð Ö × ­Ù Ó¸ × ÓÑÓ ×Ù Ú Ö× Ø Ð                         Ò Ö ÔÖ ¹
× ÒØ ÓÒ Ý ÑÓ Ð Þ Óº

7.15      El simplex para redes de flujo
7.15.1    Conclusi´n sobre el problema del flujo m´ximo a coste m´
                  o                              a              ınimo
  Ð ÔÖÓ Ð Ñ Ô Ö Ñ          ר × ÓÒ Ø Ò Ó× Ù ÒØ × ×ØÙ Óº Ä ÔÖ Ñ Ö × Ð
ÒÚ ×Ø ÓÒ ÓÔ Ö ÓÒ ×¸ Ð × ÙÒ Ð Ð Ð ÓÖ ØÑ º
        Ð ÒÚ ×Ø ÓÒ ÓÔ Ö ÓÒ × Ø Ò ÑÓ× Ð ÔÖÓ Ð Ñ Ò Ö Ó              ÓÔØ Ñ Þ ÓÒ
 ÓÖÑÙÐ Ó Ò Ü º½¿ ´Ô Ò ¼µ Ý ×Ù× Ñ ØÓ Ó× Ö ×ÓÐÙ ÓÒ ÒØÖ ÐÐÓ× Ð × Ñ¹
ÔÐ Ü ´Ü º½¿º ´Ô Ò         µµº ר Ú ÖØ ÒØ       Ò Ó Ð Ô Ò× Ñ ÒØÓ Ñ ØÖ Ð Ý
   ÓÑ ØÖ Óº
      ÙÖ ÒØ ÐÓ× ÒÓ× ¼ Ý ¼ Ð × ÐÓ ¸ Ð ÒÚ ×Ø ÓÒ ÓÔ Ö ÓÒ × ØÓÑÓ Ð Ø ÓÖ
     Ö Ó× ÓÑÓ ÙÒ Ú ÙÐÓ ÑÓ Ð Þ ÓÒº Ô ÖØ Ö            ÒØÓÒ ×¸ × Ò × Ù ÖØÓ
 ÓÒ Ü ÓÒ × ÒØ Ñ × ÒØÖ Ñ Ó× ÑÙÒ Ó׺
    Ä Ö Ò Ú ÒØ       Ð ÒÚ ×Ø ÓÒ ÓÔ Ö ÓÒ × × ×Ù ÒÓÖÑ ÜÔ Ö Ò Ò ÑÓ ÐÓ×
   Ò Ö Ó× ÔÖÓ Ð Ñ × Ý ×Ù Ñ Ô Ó × ØÙ ÓÒ × Ð Ú Ö Ð ÐÓ× ÔÖÓ Ð Ñ × ØÖ Ò×¹
ÔÓÖØ ´Ü º½¾º º½ ´Ô Ò ¿ µµ¸ ØÖ × ÓÖ Ó ´Ü º½¾º º¾ ´Ô Ò ¿µµ Ý           × Ò ÓÒ
    ØÖ Ó× ´Ü º½¾º º¿ ´Ô Ò       µµ¸ ÓÖÑÙÐ Ó× × Ð ÒÚ ×Ø ÓÒ ÓÔ Ö ÓÒ ×¸
   ר ÒØ Ö Ð ×Ø × Ò Ð ÑÙÒ Ó ÔÖÓ Ù Ø ÚÓ¸ ×ÓÒ ÔÐ Ð × ÑÙ × ÓØÖ × × ØÙ ÓÒ ×º ѹ
  Ó× ÔÖÓ Ð Ñ × Ù ÖÓÒ ÔÐ ÒØ Ó× Ò Ø ÖÑ ÒÓ× Ñ ØÖ × Ý Ö Ó׺ Å × Ò Ö Ð ÓÑÓ
      Ð ÑÓÑ ÒØÓ Ö        ÓÒ Ð × ÔÖ × ÒØ × Ð Ò ×¸ Î Ò ÞÙ   Ð × Ò Ù ÒØÖ Ò ÙÒ × Ú Ö × ÕÙ ÕÙ
        Ø Ó ÒÓØ Ð Ñ ÒØ Ð ×ÙÑ Ò ×ØÖÓ Ð ØÖ Ó¸ Ð Ù Ð ×        Ò Ö Ó ÔÓÖ Ù ÒØ × ÖÓ Ð ØÖ × Ò ÙÒ
 ¿±º ÓÒ× Ù ÒØ Ñ ÒØ ¸ ÔÖ Ø Ñ ÒØ ØÓ Ð ÔÖÓ Ù ÓÒ              × Ó Ø º Ò ×Ø × ÒØ Ó¸ ÔÓ Ö ÑÓ×
Ú ×ÐÙÑ Ö Ö × Ò Ö Ó× ÙØÙÖÓ× × ÕÙ ¸ Ó ÑÔ ØÓ× Ù× Ö ÓØÖ       × Ù ÒØ × ÐØ ÖÒ Ø Ú × Ò Ö ¸ ØÓÑ Ò Ó
  Ð Ð ØÖ        ÓÑÓ ÙÒ Ò     ÒØÖ       ÐÓ× ÔÖÓ Ù ØÓÖ ×º
7.16. Notas bibliogr´ficas
                    a                                                          869



ÔÖÓ Ð Ñ × Ð ÔÖÓ Ö Ñ ÓÒ Ð Ò Ð ´Ü º½¿ ´Ô Ò ¼µµ¸ Ô ÖÓ ×Ø ×ÓÐÓ ÙÒ ÓÒ ÙÒØÓ ×
Ö ÔÖ × ÒØ Ð ¹Ý Ö ×ÓÐÙ Ð ¹ ÓÒ Ö Ó׺
     ÈÓÖ ×Ù ÑÔÐ ÜÔ Ö Ò ¸ ÙÒ ÙØ ÒØ Ó ÒÚ ×Ø ÓÖ ÓÔ Ö ÓÒ × × ÙÒ ×Ù ØÓ
  ÓÒ×ÙÐØ Ö Ù Ò Ó × ×Ø ÑÓ Ð Þ Ò Ó ÙÒ ÔÖÓ Ð Ñ º È ÖÓ Ð ÓÑÔÙØ ר Ø Ñ Ò × ÓØÖÓ
×Ù ØÓ Ð ÕÙ Ð ÒÚ ×Ø ÓÖ ÓÔ Ö ÓÒ ×                ÓÒ×ÙÐØ Ö Ð ÓÖ        Ö Ð Þ ÓÒ Ð
ÑÓ ÐÓº ÆÓ × ÓÑÙÒ Ò ÓÒØÖ Ö ÙÒ Ô Ö×ÓÒ ÕÙ ÓÒÓÞ Ý ÓÑÔÖ Ò                     ÐÑ ÒØ ÐÓ×
  Ó× ÑÙÒ Ó׺
     È ÖÓ Ð ÑÓ ÐÓ ÓÖ ÒØ Ó Ö Ó׸ ØÖ Ú × Ð Ö                   Ô Ø ¸ Ø Ò ×Ó Ö ×
Ú ÒØ × ×Ó Ö Ð ÔÖÓ Ö Ñ ÓÒ Ð Ò Ðº Ä ÔÖ Ñ Ö         ÐÐ × × Ð Ö Ô Þ Ð ÓÖ ØÑ ¸ Ð Ù Ð
   Ô Ö Ò Ð Ó Ø Ò ÓÒ Ñ × Ð Ö Ö ×ÙÐØ Ó× Ö ×Ô ØÓ ÐÓ× Ò ÓÕÙ × Ð ÔÖÓ Ö Ñ ÓÒ
Ð Ò Ðº Ä ×Ù ¹× ÓÒ Ü º½ º½ ´Ô Ò ¾µ ÑÙ ×ØÖ Ð Ñ Ò Ö Ò Ö Ð                   ÒØ ÖÔÖ Ø Ö
ÙÒ Ö        Ô Ø       ÓÑÓ ÙÒ ÔÖÓ Ö Ñ Ð Ò Ðº        Ú Þ ÕÙ × ÔÙ         ÒØ ¬ Ö ×Ø
  ÓÖÖ ×ÔÓÒ Ò × ÔÖ Ö Ð Ð ÑÓ ÐÓ Ö Ð ÔÖÓ Ö Ñ Ð Ò Ð ÔÓÖ Ð × Ò ÐÐ Ö ÞÓÒ
ÕÙ ÐÓ× ÓÖ Ò ×          Ù ÓÒ Ð × Ö × ­Ù Ó ×Ø Ò ÐÖ ÓÖ ÙÒ ÓÖ Ò Ñ Ò ØÙ
×ÙÔ Ö ÓÖ ÐÓ× Ð ÔÖÓ Ö Ñ ÓÒ Ð Ò Ðº Ä × ÙÒ Ú ÒØ × ÕÙ Ð Ö Ø Ö Ö ¬ Ó
Ð×Ö × Ô Ø ×                Ñ × Ð Ý ÔÖ Ò× Ð ¸ Ô Ö Ð Ñ ÝÓÖ          Ð × Ô Ö×ÓÒ × ÕÙ
ÒÓ Ø Ò Ò Ù ÖØ ÓÖÑ ÓÒ Ñ Ø Ñ Ø Ý ×ØÖ Ø ¸ Ð ÑÓ Ð Þ ÓÒ ÒØ ÖÔÖ Ø ÓÒ
× ØÙ ÓÒ × Ð ÑÙÒ Ó Ö Ðº ×ÔÙ × ØÓ Ó¸ Ò ÕÙ Ò ×Ø ÑÙÒ Ó ÔÓ×ÑÓ ÖÒÓ ×Ø
  ÓÑ Ò Ó ÔÓÖ ÐÓ Ú ×٠к Ò ÐÑ ÒØ ¸ Ò Ð × Ö × Ô Ø × Ý ÙÒ Ñ Ñ × ÑÔÐ
     ÓÑ Ò ÓÒ × Ð ÓÖ ØÑÓ׸ ÐÓ ÕÙ ÒÓ× ÔÖÓÔÓÖ ÓÒ ÙÒ ÓÐ ÙÖ ÑÔÓÖØ ÒØ ¸ Ð ÓÖ
    Ñ ÓÖ Ö ÐÓ× Ø ÑÔÓ×        Ù ÓÒº
     ÈÓÖ ÓØÖ Ô ÖØ ¸ Ø Ñ Ò ÑÓ× Ú ×ØÓ Ð ÔÐ Ð               Ð × Ö × Ô Ø × ÓØÖÓ×
ÔÖÓ Ð Ñ × Ñ × Ô ÖØ Ò ÒØ × Ð ÑÙÒ Ó ÐÓ× Ö Ó׺ Ð ÔÖÓ Ð Ñ Ð Ñ ÒÓ Ñ Ò ÑÓ ÒØÖ
ÙÒ Ô Ö ÒÓ Ó׸ Ø Ú Ñ ÒØ ØÖ Ø Ó Ò Ü º ´Ô Ò ½¼µ¸ Ø Ñ Ò ÔÙ Ö ×ÓÐÚ Ö×
Ñ ÒØ Ö × Ô Ø × ´Ü º½¾º º ´Ô Ò                 µµº È Ö Ó Ó ÙÖÖ ÓÒ ÐÓ× ÔÙÒØÓ×
  ÓÖØ ×ØÙ Ó× Ò Ü º º½ ´Ô Ò ¿ µ Ý Ð ÓÖØ Ñ Ò ÑÓ Ñ Ò ÑÓ Óר ¸ ÒÓ ×ØÙ Ó
  ÜÔÐ Ø Ñ ÒØ ¸ Ô ÖÓ Ù Ð Ô ÖØ Ö Ü º½½º º¿ ´Ô Ò ¾¿µº
      Ò ÖØ ÓÖÑ ¸ Ð ÑÓ ÐÓ Ö            Ô Ø    × ÐÓ× Ö Ó׸ Ý ÕÙ Þ Ð ÔÖÓ Ö Ñ ÓÒ
Ð Ò Ð¸ ÐÓ ÕÙ Ð ØÖ Ò× ÓÖÑ         Ä ÔÐ     × Ð Ð ÙÐÓ Ö Ò Ð ÓØÖ Ô Ö×Ô Ø Ú
 ÒØ ÖÔÖ Ø Ö ÙÒ ÔÖÓ Ð Ñ ¸ Ô Ö Ð Ù Ð¸ Ò ÖØ × × ØÙ ÓÒ ×¸ × Ñ × × ÑÔÐ Ò ÓÒØÖ Ö
×ÓÐÙ ÓÒ ×º

7.16    Notas bibliogr´ficas
                      a
ÍÒ Ö Ó¸ ÓÑÓ ÐÓ× ×ØÙ ÑÓ× Ò ×Ø Ø ÜØÓ¸ ÓÒ ÓÖÑ ÙÒ Ö ÔÖ × ÒØ ÓÒ¸ Ö ¬ Ñ ÒØ
ÓÖ ÒØ ¸ ÙÒ Ö Ð             ÓÒ Ö Ø ¸ Ó × ¸     Ð Ó ÔÖ × ÒØ ¸ Ð Ú Ö Ð¸ Ø Ð ÓÑÓ ÙÒ
Ñ Ô ¸ Ó ÙÒ Ö ÔÖ × ÒØ ÓÒ ÙÒ ×ØÖ ÓÒ¸ Ø Ð ÓÑÓ ÙÒ Ö Ð ÓÒ Ñ Ø Ñ Ø º × ¸
ÐÓ× Ö Ó× ×ÓÒ Ò Ö ÒØ × Ð ÓÒÓ Ñ ÒØÓ ÙÑ ÒÓº             Ð ÙÒ ÓÖÑ Ù ÓØÖ ×Ø Ò ÔÖ × ÒØ ×
    × Ø ÑÔÓ× ÒÑ ÑÓÖ Ð × ÔÖ Ø Ñ ÒØ × ÐÓ× Ð ÓÖ × Ð × Ö ÙÑ ÒÓº ÈÙ ×ØÓ ÕÙ
Ð            Ö Ó × Ô ÖØ Ð ÖÚÓ ÙÑ ÒÓ × Ø ÑÔÓ× Ñ Ð Ò Ö Ó׸ ÒÓ Ô Ö ÙרÓ
  ØÖ Ù ÖÐ Ð ÙÒ ÙØÓÖ Ô ÖØ ÙÐ Ö Ó Ò Ú Ù Ðº
     Ë Ò × Ù ÖØÓ Ñ Ô ×           ÐÓÒ Ó× ÕÙ × Ö ÑÓÒØ Ò Ð ¾¿¼¼ º º × ÕÙ ÔÖÓ Ð ¹
Ñ ÒØ ÔÖÓ Ð Ñ × ÓÑÓ Ð Ð ÖÙØ Ñ × ÓÖØ ÒØÖ Ó× × Ø Ó× Ò × Ó ÔÐ ÒØ Ó× Ò
   ר ÒØÓ× Ø ÑÔÓ׸ Ò ÐÙ Ö × Ö ÒØ ׸ ÔÓÖ Ú Ö× × ÙÐØÙÖ ×º
        ÓÖ Ò¸ × Ò ÔÖ Ø Ò× ÓÒ        Ñ Ö ØÓ¸ Ð ×ØÓÖ Ó¬ Ð        ÐÓ× Ö Ó× × Ö ÑÓÒØ
  Ð ÔÖ Ñ Ö Ý Ð Ö ÖØ ÙÐÓ ÒØ ¬ Ó × Ö ØÓ ÔÓÖ Ð Ñ Ø Ñ Ø Ó ×Ù ÞÓ Ä ÓÒ Ö ÙÐ Ö Ý
870                                                              Cap´
                                                                    ıtulo 7. Grafos



×Ù ×ØÙ Ó ×Ó Ö ÙÒ ÔÖÓ Ð Ñ Ø ÒÓ ÓÒÓ Ó ÓÑÓ ÐÓ× ÈÙ ÒØ × ÃÓÒ × Ö º ÈÓÖ
 ר Ù Ô × Ð Ö Ó ÈÖ Ð¸ Ð Ù Ð Ü ×Ø Ò Ó× ×Ð × ÒÑ Ö × Ò Ð Ô Ö Ñ ØÖÓ Ð
  Ù º × Ð ×Ö Ö ×         Ð × ×Ð × Ý ÒØÖ ÐÐ × × Ù ÒØ Ò × Ø ÔÙ ÒØ × ×ØÖ Ù Ó×
   Ð × Ù ÒØ Ñ Ò Ö




ÄÓ× Ø ÒÓ× × ÔÖ ÙÒØ Ò ×        Ð ÙÒ Ñ Ò Ö Ö ÓÖÖ Ö ØÓ Ó× ÐÓ× ÔÙ ÒØ × Ü ¹
Ø Ñ ÒØ ÙÒ Ú Þ × Ö¸ × Ò Ô × Ö Ó× Ú × ÔÓÖ Ð Ñ ×ÑÓ ÔÙ ÒØ º ÙÐ Ö ÑÓ Ð ÞÓ Ð
 ×ÙÒØÓ Ñ ÒØ Ð × Ù ÒØ Ö Ó




¸ Ý × Ö Ó Ð Ñ Ò Ö Ò Ö Ð Ö ×ÓÐÚ Ö Ð ÔÖÓ Ð Ñ ¸ Ù Ð × ÓÝ ÓÒÓ                   Ó Ð ÖÓØÙÐÓ
        ÐÓ ÙÐ Ö ÒÓ º × ÒØÓÒ ×¸ ÙÐ Ö ÐÓ ÓÒ× Ö Ò ÓÑÓ Ð ÔÖ ÙÖ×ÓÖ Ð Ø ÓÖ
     Ö Ó× Ó¸ Ñ × Ùר Ñ ÒØ ¸ Ð ØÓÔÓÐÓ º
     Æ Ø ÚÓ ÃÓÒ × Ö Ù Ùר Ú ÊÓ ÖØ Ã Ö Ó« ÕÙ Ò¸ Ø ÒÓÖ Ð × ÓÖÖ ÒØ × Ý
ÚÓÐØ × Ò Ö × Ð ØÖ ׸ ÔÐ ÒØ Ó ÕÙ
    ½º Ä ×ÙÑ Ð × ÓÖÖ ÒØ × ×Ó         × ÐÓ× Ö Ó× Ò ÒØ × ÙÒ ÒÓ Ó × ÖÓ¸ Ý
    ¾º Ä ×ÙÑ ÐÓ× ÚÓÐØ × ×Ó Ó× Ù ÐÕÙ Ö ÐÓ × ÖÓº
À ÕÙ ÙÒ Ö Ñ Ò × Ò ÓÒ Ð ÓÒ ÓÒ ÓÒ× ÖÚ ÓÒ ­Ù Ó ´ º½¼µ ´Ô º µ Ý Ð
Ø ÓÖ Ñ º½ ´Ô º ½ µ Ð × ÓÑÔÓ× ÓÒ ­Ù Ó ÔÖ × ÒØ Ó Ò Ü º½½º º
     ÄÓ× Ö ÓÖÖ Ó× ÖÕÙ Ø Ô Ó× ×Ó Ö Ö Ó׸ ÔÖÓ ÙÒ           Ý ÑÔÐ ØÙ ¸ Ù ÖÓÒ Ö ÔÓÖ¹
Ø Ó× ÔÓÖ ÔÖ Ñ Ö Ú Þ ÔÓÖ ÊÓ ÖØº º Ì Ö Ò ¿ º
      Ð ÔÖÓ Ð Ñ Ð Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ × ÓÒÓ                × ÐÓ× ÒÓ× ¾¼ Ð × ÐÓ º
   ÓÖÙÚ Ö ÔÓÖØÓ ÙÒ ÔÖ Ñ Ö ×ÓÐÙ ÓÒ Ò ½ ¾        ݸ ÔÖ Ø Ñ ÒØ ¸ Ð ÓÝ ÓÒÓ Ó Ð Ó¹
Ö ØÑÓ ÈÖ Ñ Ù × Ù ÖØÓ Ø Ñ Ò¸ Ý Ú Ö ×                  × ÒØ ׸ ÔÓÖ Â ÖÒ ¾½ º
       ÓÑÓ Ý ÐÓ ÑÓ× Ò        Ó¸ Ð × Ö × ­Ù Ó Ù ÖÓÒ ÔÖ           × ÔÓÖ ÐÓ× ØÖ Ó×
Ã Ö Ó«º Ò ×Ø Ø Ñ Ö ×ÙÐØ ÒØ Ö × ÒØ ÓÒ× Ö Ö Ð ÔÖ ×Ñ ÙÐØÙÖ Ðº Ò ÓÒØÖ Ö
   Ñ ÒÓ× ÙÑ ÒØÓ ÒÓ ×ÓÐÓ × Ò × Ö Ó Ô Ö Ñ Ü Ñ Þ Ö ­Ù Ó¸ × ÒÓ¸ Ø Ñ Ò¸ Ô Ö ×ÙÔÐ Ö
ÙÒ Ñ Ò           ­Ù Ó Ô ØÖÓÐ Ó Ò ÙÒ ÒØÖ Ò          Ö      ÓÐ Ó Ù ØÓ׺ Ð Ø ÓÖ Ñ Ð
  ÓÖØ Ñ Ò ÑÓ ×ØÙ Ó Ò Ü º½¼º ´Ô Ò             µ¸ Ù Ð Ó Ô ÐÓ× ×Ù × ÚÓ× Ð ÓÖ ØÑÓ×
     Ñ Ü Ñ Þ ÓÒ × Ó× Ò Ñ ÒÓ             ÙÑ ÒØÓ¸ Ù ÔÖ × ÒØ Ó Ò Ô Ò ÒØ Ñ ÒØ ¸
  Ò Ð Ñ ×ÑÓ ÒÓ¸ ÔÓÖ ÓÖ Ý ÙÐ Ö×ÓÒ ½¿ Ý ÔÓÖ Ð ×¸ Òר Ò Ý Ë ÒÒÓÒ º ÈÓ×¹
Ø Ö ÓÖÑ ÒØ ¸ ÑÓÒ × Ý Ã ÖÔ          ÑÓ×ØÖ ÖÓÒ ÙÒ Ñ ÓÖ ×Ù ×Ø Ò Ð ÐÓ× Ð ÓÖ ØÑÓ×
ÔÖ Ñ Ò Ó Ð Ù×ÕÙ         Ò ÑÔÐ ØÙ Ô Ö Ò ÓÒØÖ Ö Ñ ÒÓ× ÙÑ ÒØÓº ÈÓÖ ÓØÖÓ Ð Ó¸
ÐÓ× Ð ÓÖ ØÑÓ× ÔÖ ¹­Ù Ó Ù ÖÓÒ ÔÖ        Ó× ÔÓÖ Ð ØÖ Ó Ã ÖÞ ÒÓÚ ¾ º Ð ÔÖ ¹­Ù Ó
7.17. Ejercicios                                                               871



Ø Ò Ñ × × ÒØ Ó Ô Ö Ñ Ü Ñ Þ Ö ÙÒ ­Ù Ó Ò ÙÒ Ö ÓÒ Ð Ú × Ó×                   Ð ­Ù Ó ×
ÑÙÝ         ÐÓ Ù Ð × Ð ×Ó Ð Ù Ý ÐÓ× × ×Ø Ñ × Ö Óº
    ËÓ Ö Ð × Ö × ­Ù Ó Ý Ð ÖÓ× ÑÔÓÖØ ÒØ ׸ Ý Ò Ó × Ð × Ó× ÓÔØ Ñ Þ ÓÒ
 ÓÑ Ò ØÓÖ ÓÑÓ Ð Ä ÛÐ Ö ¾ Ó Ð È Ô Ñ ØÖ ÓÙ Ý ËØ Ð ØÞ ¿½ ר ÓØÖÓ× Ñ × Ö ¹
   ÒØ × ÓÑÓ Ð ÃÓÖØ Ý ÎÝ Ò ¾ ¸ Ð Ê Ó ¿¾ Ý Ð ÆÓ Ð ÏÖ Ø ¿¼ º Ì Ñ Ò Ý Ø Ü¹
ØÓ× ×Ô Ð Þ Ó× Ò Ð × Ö × ­Ù Ó ÐÓ Ñ × ÒÓØ Ð ×ÓÒ Ð Ù ¸ Å Ò ÒØ Ý ÇÖÐ Ò ½
Ý Ð Þ Ö ¸ Â ÖÚ × Ý Ë Ö Ð ¿ º
    ÈÙ          Ö× ÕÙ Ð ÔÖÓ Ö Ñ ÓÒ Ð Ò Ð¸ Ý ×Ù Ð Ö Ñ ØÓ Ó × ÑÔРܸ ¬ ÙÖ Ò ÒØÖ
ÐÓ× × Ù Ö Ñ ÒØÓ× Ñ × ÑÔÓÖØ ÒØ × Ð × ÐÓ º ØÙ ÐÑ ÒØ ¸ ÒÓ Ü ×Ø ÓÖ Ò Þ ÓÒ
× Ö ÕÙ ÒÓ Ö Ø ×Ù× Óר × ÔÖÓ Ù ÓÒ¸ ר ÓÒ¸ × ÖÚ Ó¸ Ø º¸ Ñ ÒØ Ð ÑÔÐ Ó
Ý Ö ×ÓÐÙ ÓÒ ÑÓ ÐÓ× ÔÖÓ Ö Ñ ÓÒ Ð Ò Ðº Ò × × ÒØ Ó¸ Ð Ð ÓÖ ØÑÓ × ÑÔРܸ
Ú ×ÐÙÑ Ö Ó ¬Ò Ð × ÐÓ× ÒÓ× ¿¼ Ð × ÐÓ ¸ ¬Ò Ð Ý ÓÖÑ ÐÑ ÒØ ÔÙ Ð Ó Ò ½                 ¸
ÒÓ ×ÓÐÓ ÙÒ × ÙÒÓ ÐÓ× ÔÖ Ò Ô Ð × Ð ÓÖ ØÑÓ× Ð ÔÖÓ Ö Ñ ÓÒ Ð Ò Ð¸ × ÒÓ ÕÙ ×
 Ò Ù ÒØÖ ÒØÖ ÐÓ× Þ Ð ÓÖ ØÑÓ× Ñ × ÑÔÓÖØ ÒØ × Ð × ÐÓ             ¿ º
      Ð ½ ¸ Ð Ñ Ø Ñ Ø Ó ÖÙ×Ó Ä ÓÒ Ã           Ý Ò ÔÙ Ð Ó ÙÒ ÒÙ ÚÓ Ñ ØÓ Ó ×ÓÐÙ ÓÒ
 ÙÝÓ Ø ÑÔÓ × ÔÓÐ ÒÓÑ Ð ¾ º ËÙ ØÖ Ó × ÙÒ ØÓ Ñ Ø Ñ Ø Ó ÕÙ Ó Ò Ó ÙÒ Ñ
    Ð ÓÖ ØÑÓ× ÒÓÑ Ò Ó×            ÔÙÒØÓ× ÒØ ÖÒÓ× × Ù ÖØÓ× ÔÓÖ Æ Ö Ò Ö Ã ÖÑ Ö Ö
 Ò ½ ¾¿ º
      Ò ÔÖÓ Ö Ñ ÓÒ Ð Ò Ð × Ò Ù ÒØÖ Ò ÑÙÝ Ù ÒÓ× Ý ÑÓ ÖÒÓ× Ø ÜØÓ׸ Ð ÙÒÓ× ÐÐÓ×
ÔÖ Ú Ñ ÒØ Ø Ó× ¿¼¸ ¾ ¸ ¿¾¸ ¿ Ý ÓØÖÓ× Ñ × ×Ô Ð Þ Ó× ÒØÖ ÐÓ× Ù Ð ×              ÒÓØ Ö
 Ð ÄÙ Ò Ö Ö Ý ¾ º
    ËÓ Ö Ö Ó× Ò Ò Ö Ð¸ Ñ Ò ×Ø Ö Ñ Ò ÓÒ Ö Ð Ð × Ó Ø ÓÖ Ó¸ ÙÒÕÙ Ý ÓÐ ÒØ
     ÐØ        × Ù Ö Ñ ÒØÓ× ÑÔÓÖØ ÒØ ׸ À Ö ÖÝ ½ º Ð                 ר ÔÙ Ð ÓÒ¸
 Ò Ð ÖØ ÖÓ         ר ×Ù× Ö ØÓ¸ Ð Ñ ÓÖ Ø ÜØÓ Ø ÓÖ Ó ×Ó Ö Ö Ó× × Ð Ø ÜØÓ ÂÙÒ ¹
Ò Ð ¾¾ º ÍÒ Ü Ð ÒØ Ø ÜØÓ¸ ÒØÖ ÐÓ Ø ÓÖ Ó Ý ÐÓ ÒרÖÙÑ ÒØ Ð ÐÓ ÓÒר ØÙÝ Ð Ð ÖÓ
  ÖÓ×× Ý ÐÐ Ò ¿ º È Ö Ø ÜØÓ× ÒרÖÙÑ ÒØ Ð × ´ Ð ÓÖ ØÑ Ó×µ ÙÒ Ü Ð ÒØ Ð ÖÓ × Ð
  ÐÒ        ÓÒ× ½ ݸ Ñ × Ö ÒØ Ñ ÒØ ¸ Ð Ë Û ¿¿ º
      Ð ÙÒÓ× ÐÓ× Ö Ó× ÑÓ×ØÖ Ó× Ò ×Ø Ø ÜØÓ Ù ÖÓÒ Ù Ó× Ñ ÒØ Ð ÑÙÝ Ù Ò
     Ù ÓÖ Graphviz ½¼ ÔÓÖ ÑÔÐÓ׸ ÐÓ× Ð × ¬ ÙÖ × º ¸ º ¸ º ¸ º ¸ º ¸ º ¸
 º ¼¸ º ½¸ º ¾¸ º ¿¸ º ¸ º ¸ º ¸ º Ý º ¸ ÒØÖ ÓØÖ × Ñ ×º Ë Ò Ñ Ö Ó¸ Ô Ö ÓØÖÓ×
 Ö Ó× × ÑÔÐ Ó ÙÒ ÔÖÓ Ö Ñ            Ù Ó × ÖÖÓÐÐ Ó ÔÓÖ ×Ø Ö ØÓÖ Ý ÒÓÑ Ò Ó
 ÒÐ       Ð ÓØ graphpic Ñ ÒØ Ð ×             Ù ÖÓÒ ¬ ÙÖ × ÓÑÓ º ¸ º ¸ º ¸ º ¸
 º ¸ º ¸ º ½¸ º ¾¸ º ¿¸ º ¸ º ¸ º ¸ º ¼ º ¸ º½¼º½¿º ¸ º½¼º½¿º ¸ º½¼º½¿º ¸
 º ¼¸ º½¼º½¿º Ý º ½¸ Ø Ñ Ò ÒØÖ ÓØÖ × Ñ × Ù × Ñ ÒØ ר ÔÖÓ Ö Ñ º Ò
 Ð × ÖÖÓÐÐÓ graphpic¸ Ð Ð ÖÓ ÃÓÞÓ ËÙ Ý Ñ ¿ Ù ÑÙÝ ÙØ к ÇØÖÓ Ø ÜØÓ Ð
Ö ×Ô ØÓ × Ð ØØ ר ¸         ׸ Ì Ñ ×× Ý ÌÓÐÐ × ¾ º

7.17    Ejercicios
  ½º Ù ÒØ × Ð ÒØ      Ñ ÜÑ             Ö Ó× ÕÙ ÔÙ    Ø Ò Ö ÙÒ Ö Ó
  ¾º Ù ÒØ × Ð ÒØ      Ñ ÜÑ             Ö Ó× ÕÙ ÔÙ    Ø Ò Ö ÙÒ Ö Ó
  ¿º È Ö Ð × Ù ÒØ Ö Ó
872                                                            Cap´
                                                                  ıtulo 7. Grafos



                    J               B             E                G



                          A                               F




                    I               D             C                H




      ´ µ Ø ÖÑ Ò    Ý Ù ÙÒ Ö ÓÐ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ         Ô ÖØ Ö Ð ÒÓ Ó Aº
      ´ µ Ø ÖÑ Ò    Ý Ù ÙÒ Ö ÓÐ Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ Ô ÖØ Ö Ð ÒÓ Ó Aº
      ´ µ Ø ÖÑ Ò    Ý Ù ÙÒ Ö ÓÐ Ö ÓÖ Ô ÖØ Ö Ð ÒÓ Ó Fº
      ´ µ Ò Ù ÒØÖ    Ð ´Ó ÐÓ× µ Ñ ÒÓ´×µ Ñ × Ð Ö Ó´×µº
      ´ µ Ò Ù ÒØÖ    Ð Ö Ó ÓÑÔÐ Ñ ÒØÓº
      ´ µ Ò Ù ÒØÖ   ØÓ Ó× ÐÓ× Ð ÕÙ × Ó ×Ù Ö Ó× ÓÑÔÐ ØÓ׺
   º ÈÐ ÒØ     ×Ú ÒØ × ÐÓ× Ö Ñ × × Ø Ð × Ô Ö ÜÔÖ × Ö Ö Ð ÓÒ × Ò Ö ×º
     ÈÖ         ÔÐ ÒØ Ñ ÒØÓ¸ ר Ð Þ Ð        Ö Ò ÓÒ ÙÒ Ö Óº
   º × Ò ÙÒ ÖÙØ Ò ÕÙ Ö Ð Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ                 × Ò ÙØ Ð Þ Ö Ö ÙÖ× ÓÒº
   º × Ò Ð ÔÖ Ñ Ø Ú test for cycle()¸ ÔÖ × ÒØ          Ò Ü º º ´Ô Ò ½ µ¸ ×
      Ò ÙÒ ÜÔÐÓÖ ÓÒ Ò ÑÔÐ ØÙ º
   º × Ò Ð ÔÖ Ñ Ø Ú test for cycle(g, node, len) Ð Ù Ð Ö ØÓÖÒ true × Ü ×Ø
     ÙÒ ÐÓ Ò Ð ÒÓ Ó node ÙÝ ÐÓÒ ØÙ × Ü Ø Ñ ÒØ len Ö Ó׺
   º ÓÑÓ ÔÙ          ×Ô ¬ Ö× ÙÒ Ñ ÒÓ Ò ÙÒ Ö Ó Ó Ö Ó ØÖ Ú × ×Ù× Ö Ó×
      Ù Ò Ó ×ØÓ× ÒÓ ×Ø Ò Ø ÕÙ Ø Ó×
   º ÈÐ ÒØ ÙÒ Ð ÓÖ ØÑÓ Ù ÖÞ ÖÙØ ÕÙ Ú Ö ¬ÕÙ × Ó× Ö Ó× ×ÓÒ Ó ÒÓ ×ÓÑÓÖ Ó׺
 ½¼º ÈÐ ÒØ ×ÕÙ Ñ × Ô Ö Ö ÔÖ × ÒØ Ö ÙÒ Ñ ØÖ Þ            Ý Ò ÓÖÖ ×ÔÓÒ ÒØ ÙÒ
     ÑÙÐØ Ö Óº
 ½½º × Ö Ð Ð ÓÖ ØÑÓ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ                × Ò Ö ÙÖ× ÓÒº
 ½¾º ÅÓ ¬ÕÙ Ð ÐÓÕÙ Ò Ð Þ Ö ÖÖ ÐÓ                 ÖÖ ÐÓ×      Ô Ö ÕÙ ×ÓÐÓ Ô ÖØ ÐÓ×
      Ð Ñ ÒØÓ× ÔÓÖ ÖÖ       Ð     ÓÒ Ðº
 ½¿º ÅÓ ¬ÕÙ Ð ÐÓÕÙ Ò Ð Þ Ö ÖÖ ÐÓ               ÖÖ ÐÓ× Ô Ö Ù× Ö Ð Ø ÔÓ BitArrayº
 ½ º × Ò ÙÒ Ì Ady Bit ÕÙ Ö ÔÖ × ÒØ ÙÒ Ñ ØÖ Þ                Ý Ò            Ø×º Í× ÙÒ
      ÖÖ ÐÓ Ò Ñ Ó DynArray<T> ÖÖ ÐÓ×               Ø× BitArrayº Å Ò Ñ Ð ÓÒ×ÙÑÓ
         Ñ ÑÓÖ º
 ½º       Ó ÙÒ Ö Ó < V, A > Ý × Ò sv Ý sa ÐÓ× Ø Ñ ÒÓ× ÐÓ× Ø ÔÓ× ÐÑ Ò Ó× Ò
     ÐÓ× ÒÓ Ó× Ý Ö Ó׸ Ö ×Ô Ø Ú Ñ ÒØ º Ë sp Ð Ø Ñ ÒÓ ÙÒ ÔÙÒØ ÓÖº Ù Ð × Ð
     Ö Ð ÓÒ ÒØÖ Ð ÒØ             Ö Ó× Ö ×Ô ØÓ Ð ÒÓ Ó× ÑÓ Ó Ø Ð ÕÙ × Ñ ÒÓ×
     Ó Ñ × ÓרÓ×Ó Ò ×Ô Ó Ð Ö ÔÖ × ÒØ ÓÒ ÓÒ Ð ×Ø ×             Ý Ò ÕÙ ÓÒ Ð
     Ñ ØÖ ×
7.17. Ejercicios                                                               873



 ½º     Ò Ù Ð × ×Ó× Ð Ú Ö ¬    ÓÒ       Ü ×Ø Ò       Ö Ó ÓÒ Ñ ØÖ ×       Ý Ò     ×
      O(Ð (n))

 ½º     Ø ÖÑ Ò ÐÓ× ÔÙÒØÓ×     ÖØ ÙÐ ÓÒ Ô Ö Ð × Ù ÒØ Ö Ó
                   J                B            E                   G



                        A                                 F




                   I                D            C        K          H




 ½ º Ò ÙÒ ÓÒ Ð Ì List Graph<Node, Arc>¸ ÓÒרÖÙÝ ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ð ÙÐ
      Ð ÓÑÔÐ Ñ ÒØÓ ÙÒ Ö Óº
 ½ º ÓÒרÖÙÝ ÙÒ Ú Ö× ÓÒ Ð Ñ ØÓ Ó sort arcs() ÕÙ ÒÓ Ù× ÙÒ ÖÖ ÐÓ Ò Ñ Ó
     Ø ÑÔÓÖ Ð¸ × ÒÓ ÕÙ ÓÖ Ò Ö Ø Ñ ÒØ Ð Ð ×Ø           Ö Ó׺
 ¾¼º Ò Ð ÖÙØ Ò copy graph() ´Ü º¿º½¼º ´Ô Ò ¼¼µµ¸ Ù Ð × ×ÓÒ ÐÓ× Ò ÓÒÚ Ò ÒØ ×
          ÑÔÐ ÒØ Ö Ð Ñ Ô Ó ÓÒ ÙÒ Ø Ð ×
 ¾½º ÁÑÔÐ ÒØ Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ          Ô Ö ÕÙ ÜÔÐÓÖ ØÓ Ó× ÐÓ× Ö Ó׺
 ¾¾º ÁÑÔÐ ÒØ Ð Ù×ÕÙ         Ò ÔÖÓ ÙÒ      Ô Ö Ð Ö ÔÖ × ÒØ ÓÒ ÓÒ Ñ ØÖ ×      ݹ
        Ò º
 ¾¿º ÁÑÔÐ ÒØ Ð Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ Ô Ö ÕÙ ÜÔÐÓÖ ØÓ Ó× ÐÓ× Ö Ó׺
 ¾ º ÁÑÔÐ ÒØ Ð Ù×ÕÙ Ò ÑÔÐ ØÙ Ô Ö Ð Ö ÔÖ × ÒØ ÓÒ ÓÒ Ñ ØÖ ×              Ý Ò º
 ¾ º ÜÔÐ ÕÙ ÓÑÓ × ÑÓ Ð Þ ÙÒ Ð Ö ÒØÓ Ñ ÒØ ÙÒ Ö Óº × Ö ÙÒ Ð ÓÖ ØÑÓ
     Ô Ö Ò ÓÒØÖ Ö Ð × Ð         Ó ÙÒ ÔÙÒØÓ ÒØÖÓ Ð Ð Ö ÒØÓº
 ¾ º × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ø ÖÑ Ò Ð Ö Ó ÙÒ Ö Óº
 ¾ º ÁÑÔÐ ÒØ ÙÒ Ð ÙÐÓ         Ö ÓÐ Ö ÓÖ × Ó Ò ÙÒ Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ º ܹ
     ÔÐ ÕÙ Ð × Ö Ò × Ð Ö ÓÐ Ö ×ÙÐØ ÒØ Ö ×Ô ØÓ Ð Ð ÓÖ ØÑÓ × Ó Ò Ù×ÕÙ
      Ò ÔÖÓ ÙÒ         × ÖÖÓÐÐ Ó Ò Ü º º ´Ô Ò ¾ µº
 ¾ º ÁÑÔÐ ÒØ ÙÒ ÖÙØ Ò ÕÙ ÓÒÚ ÖØ ÙÒ Ö ÓÐ Ö ÓÖ ÐÑ Ò Ó Ò ÙÒ Ó ØÓ
     Ø ÔÓ List Graph<Node, Arc> ÙÒ Ö ÓÐ          Ð × Tree Node<T>º ×ØÙ Ñ ÒÙ¹
        Ó× Ñ ÒØ ÓÑÓ Ö Ð Þ Ö Ð ÓÒÚ Ö× ÓÒ ÐÓ× Ø ÔÓ× ×Ó Ó× ÐÓ× ÒÓ Ó× Ý Ö Ó׺
 ¾ º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ð ÙÐ ÐÓ× ÔÙÒØÓ×            ÓÖØ Ý ÙÖ ÒØ Ð Ñ ×ÑÓ Ö ÓÖÖ Ó
      ÓÐÓÖ ÐÓ× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× ×Ó Ó× ÐÓ× ÔÙÒØÓ× ÓÖØ º ´·µ
 ¿¼º ËÙÔÓÒ ÕÙ ÔÓ× Ð Ö Ó ÓÖØ ´Ó Ø Ò Ó ØÖ Ú × map cut graph()µ Ý ÐÓ×
       ÐÓÕÙ × ´Ó Ø Ò Ó× ÓÒ ÐÐ Ñ × map subgraph() ÓÒ ÐÓ× Ö ÒØ × ÓÐÓÖ × Ó×
     ÔÓÖ compute cut nodes()µº × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ð ÙÐ Ð Ö Ó ÓÖ Ò Ð × Ò
      Ô Ð Ö ÐÓ× ÓÓ ×º
874                                                            Cap´
                                                                  ıtulo 7. Grafos



 ¿½º    × ÖÖÓÐÐ ÙÒ Ú Ö× ÓÒ Ð Ì Bit Mat Graph<GT> ÕÙ Ñ Ò ×ØÖ Ø Ñ ÒØ Ø×
     Ý ÕÙ × ÙÒ Ñ ÒØ Ò Ð Ø ÔÓ DynArray<T>¸ Ñ Ò Ö Ø Ð ÕÙ ÑÙ × ÒØÖ ×
        Ú ÐÓÖ ÖÓ ÒÓ Ó ÙÔ Ò Ñ ÑÓÖ º
 ¿¾º     Ó ÙÒ Ö Ó G Ý ÙÒ Ð ×Ø l ÒÓ Ó׸ × Ò ÙÒ Ð ÓÖ ØÑÓ ÓÒ ÔÖÓØÓØ ÔÓ
           template <class GT>
       void cut(GT & g, const DynDlist<typename GT:Node*> & l, GT & g1, GT & g2);

        Ð Ù Ð Ö ØÓÖÒ ÙÒ ÓÖØ Ð Ö Ó Ø Ð ÕÙ g1 ÓÒØ Ò ÐÓ× ÒÓ Ó× Ð Ð ×Ø l Ý g2 ÐÓ×
       Ö ×Ø ÒØ ׺
 ¿¿º     ×Ö       Ð Ð ÓÖ ØÑÓ     ×ØÖ Ô Ö Ñ ØÖ ×           Ý Ò º × ÙÖ ×         ÕÙ ¸
        ÓÑÓ Ò Ð Ð ÓÖ ØÑÓ      ÐÓÝ ¸ × Ð ÙÐ Ò ØÓ Ó× ÐÓ× Ô Ö ×      Ñ ÒÓ× Ñ × ÓÖØÓ׺
 ¿º      × Ö Ð Ð ÓÖ ØÑÓ       ÐÐÑ Ò¹ ÓÖ Ô Ö Ñ ØÖ ×           Ý Ò º
 ¿º    ÅÓ ¬ÕÙ Ð Ð ÓÖ ØÑÓ        ÐÓÝ ¹Ï Ö× ÐÐ Ô Ö Ø Ø Ö ÐÓ× Ò Ø ÚÓ׺ ´·µ
 ¿º    ËÙÔÓÒ ÙÒ Ö Ó ÓÒ ÐÓ× Ò Ø ÚÓ׸ × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÒØ ¬ÕÙ ÐÓ× ÐÓ×
       Ý ÓÒרÖÙÝ ÙÒ Ð ×Ø Ñ ÒÓ× ÓÖÖ ×ÔÓÒ ÒØ ÐÓ× ÐÓ× Ò Ù ×Ø ÓÒº ´·µ
         ÝÙ Ú Ü º º¿º ´Ô Ò ¿ µº
 ¿º      ÓÑÓ × Ò × Ó¸ Ð Ð ÓÖ ØÑÓ              ×ØÖ ÒÓ ÓÔ Ö Ô Ö Ö Ó× ÓÒ ×Ø Ò ×
       Ò Ø Ú ×º ÍÒ Ø Ò Ô Ö ÔÐ Ö Ð Ð ÓÖ ØÑÓ                ×ØÖ ÙÒ Ö Ó ÓÒ ×Ø Ò ×
       Ò Ø Ú × ÓÒ× ×Ø Ö Ò Ù× Ö Ð Ñ Ò Ñ ×Ø Ò              Ð Ö Ó Ý¸ ÒØÓÒ × ×ÙÑ ÖÐ Ð
       Ò Ó ØÓ Ó× ÐÓ× Ö Ó× Ð Ö Óº          ר ÑÓ Ó¸ Ð Ö Ó ×ÓÐÓ ÓÒØ Ò Ö ×Ø Ò ×
       ÔÓ× Ø Ú ×º
          ÑÙ ×ØÖ ÕÙ ×Ø Ø Ò ÒÓ × Ú Ð Ý ÕÙ ÐÓ× Ñ ÒÓ× Ñ Ò ÑÓ× ×Ó Ö Ð Ö Ó
       ØÖ Ò× ÓÖÑ Ó ÔÙ Ò × Ö ×Ø ÒØÓ× ÐÓ× Ð Ö Ó ÓÖ Ò Ðº ´·µ
 ¿º    Ë ÙÒ ÐÓ ×ØÙ Ó ×Ó Ö Ð Ô Ü ÐÙ× ÚÓ Ò Ü º º¿º¾ ´Ô Ò ¼¾µ¸ × Ò ÙÒ
        ×ØÖ Ø        Ò Ö Ð Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ ÙÝÓ ÓÒ×ÙÑÓ Ò ×Ô Ó ÒÓ Ü
           O(V)º ´·µ

 ¿º      × Ö Ð ÓÖ Ò Ñ ÒØÓ ØÓÔÓÐÓ Ó × Ó Ò Ð Ö Ó ÒÚ Ö×Óº
  ¼º      × ÖÖÓÐÐ ÙÒ Ð ÓÖ ØÑÓ     Ð ÙÐÓ   ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ× × Ó Ò
        Ð Ð ÓÖ ØÑÓ Ï Ö× Ðк
  ½º      ÑÙ ×ØÖ ÕÙ Ð Ð ÓÖ ØÑÓ ÃÓ× Ö Ù Ó×ÕÙ Ó Ò Ü º º¿º½ × ÓÖÖ ØÓº
  ¾º   ÁÑÔÐ ÒØ Ð Ð ÓÖ ØÑÓ ÃÓ× Ö Ù Ó×ÕÙ Ó Ò Ü º º¿º½º
  ¿º   ÅÓ ¬ÕÙ ÐÓ× Ð ÓÖ ØÑÓ×         Ð ÙÐÓ Ð ­Ù Ó Ñ Ü ÑÓ Ö Ô Ö ÕÙ Ð ÙÐ Ò Ð
        ×Ð ÓÒ Ñ Ò ÑÓ Ò Ð Ñ ×Ñ Ô × ÕÙ Ð Ð ÙÐÓ Ð Ñ ÒÓ ÙÑ ÒØÓº
   º   Ê Ð Ð Ò Ð × × Ð Ð ÓÖ ØÑÓ ÑÔÙ               ÔÖ ¹­Ù Ó ÓÒ ÓÐ Á Ç ×ØÙ Ó Ò
        º½¼º½¿º º
   º   Ê Ð Ð Ò Ð × × Ð Ð ÓÖ ØÑÓ ÑÔÙ             ÔÖ ¹­Ù Ó ÓÒ Ñ ÝÓÖ ×Ø Ò ×ØÙ Ó
        Ò º½¼º½¿º º
7.17. Ejercicios                                                                        875



   º ÅÓ ¬ÕÙ ØÓ × Ð × ÙÒ ÓÒ × × Ò × Ô Ö Ð ÙÐ Ö Ð ­Ù Ó Ñ Ü ÑÓ × ÙÒ ÑÔÙ
         ÔÖ ¹­Ù Ó Ô Ö ÕÙ Ø Ò Ò ÓÑÓ Ô Ö Ñ ØÖÓ Ð ÓÔ Ö ÓÒ Ò Ð Þ ÓÒ Ð
      ÐØÙÖ ÐÓ× ÒÓ Ó× ´Ú × Ü º½¼º½¿º½¼ ´Ô Ò                    µµº
   º × Ò ÙÒ ÖÙØ Ò                  ÓÒÚ Ö× ÓÒ ÙÒ Ö Ó ÓÒ Ô                      × ÙÒ Ö         Ð Ø ÔÓ
     Net Graph<TNode,TArc,T>º

   º × Ò ÙÒ ÖÙØ Ò                ÓÒÚ Ö× ÓÒ ÙÒ Ö          Ð Ø ÔÓ Net Graph<TNode,TArc,T>
     ÙÒ Ö Ó List Graph<Node, Arc>º
   º × Ò ÒרÖÙÑ ÒØ ÙÒ Ð ÓÖ ØÑÓ Ò Ö Ð ÕÙ ÓÒÚ ÖØ ÙÒ Ö ÙÐ ÓÒ ÓÒ ÙÒ
       ÒØ           Ö ØÖ Ö           ÐÓ× ÙÒ Ö ÓÒ ÙÒ Ù ÒØ Ý ÙÒ ×ÙÑ ÖÓº
  ¼º × Ò ÙÒ Ð ÓÖ ØÑÓ Ò Ö Ó ÕÙ ÓÒÚ ÖØ ÙÒ Ö                            Ö ÙÐ ÓÒ ÙÒ Ö ÓÒ ÙÒ
     ×ÓÐÓ Ù ÒØ Ý ÙÒ ×ÙÑ ÖÓº
  ½º Ò ÙÒ ÓÒ Ð ÓÒÓ Ñ ÒØÓ ÕÙ ÔÓÖØ Ð Ø ÓÖ Ñ                            × ÓÑÔÓ× ÓÒ ­Ù Ó º½ ¸
      ÒרÖÙÑ ÒØ Ð Ð ÓÖ ØÑÓ º ÑÔÐ Ó Ô Ö Ð ÑÓ×ØÖ ÓÒº
  ¾º ÒÙÒ Ý ÑÙ ×ØÖ Ð Ø ÓÖ Ñ Å Ò Ö Ô Ö Ö Ó× ÒÓ Ö Ó׺
  ¿º Ò ÙÒ ÓÖ Ò Þ ÓÒ × Ø Ò Ò n ØÖ                         ÓÖ × {t1, t2, . . . , tn} Ý m ÔÖÓÝ ØÓ×
     {p1, p2, . . . , pm}º        ØÖ       ÓÖ ×Ø ÒØ Ö × Ó Ò Ô ÖØ Ô Ö Ò Ð ÙÒÓ× ÔÖÓÝ ØÓ×
     {px, py, . . . }º        ÔÖÓÝ ØÓ Ø Ò ÙÒ ÓØ Ô ÖØ Ô ÒØ × N(pi) × Ö¸ Ò Ð
     ÔÖÓÝ ØÓ pi ÐÓ ×ÙÑÓ ÔÙ Ò Ô ÖØ Ô Ö N(pi) ØÖ                      ÓÖ ×º
      ´ µ ÅÓ Ð Ð ÔÖÓ Ð Ñ Ô Ö Ñ Ü Ñ Þ Ö Ð ÒØ                            ØÖ          ÓÖ × ÕÙ Ô ÖØ ¹
           Ô Ö Ò Ò ÐÓ× ÔÖÓÝ ØÓ׺
      ´ µ ËÙÔÓÒ ÕÙ ÙÒ ØÖ                  ÓÖ ti Ó Ö ÙÒ ÒØ          S(ti, pj) ÔÓÖ Ô ÖØ Ô Ö Ò Ð
           ÔÖÓÝ ØÓ pjº ÓÑÓ × Ò Ù ÒØÖ Ð Ô ÖØ Ô ÓÒ ØÖ                                 ÓÖ × Ñ Ü Ñ Ð
           Ñ Ò ÑÓ Óר
      ´ µ ËÙÔÓÒ ÕÙ ÙÒ ØÖ                  ÓÖ ti Ø Ò ÙÒ ¬ Ò E(ti, pj) Ò Ð ÔÖÓÝ ØÓ pjº
              ÓÑÓ × Ò Ù ÒØÖ Ð Ô ÖØ Ô ÓÒ ØÖ                        ÓÖ × Ò Ð Ñ ÝÓÖ ÒØ
           ÔÖÓÝ ØÓ× ÓÒ Ð Ñ Ü Ñ ¬ Ò
   º      Ó ÙÒ ÓÖØ ÙÒ Ö Ó Ð ÙÐ Ó Ñ ÒØ compute min cut() ´Ü º½½º º¿ ´Ô Ò ¾¿µµ¸
       Ð ÙÐ ÐÓ× ÐÓÕÙ × ÕÙ × ÓÒ Ø Ö Ð ×ÙÔÖ × ÓÒ Ð ÓÖØ Ñ Ò ÑÓº
   º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ð ÙÐ Kv(G) ÓÒÓ Ó Ð ÓÖØ Ñ Ò ÑÓ Gº
   º ÅÓ ¬ÕÙ Ð Ì Net Graph<TNode,TArc,T> Ô Ö ÕÙ Ò ÐÙÝ ØÓÖ ×                                     Ò Ò¹
           Ò ÐÓ× Ö Ó× Ð Ñ Ò Ö ÜÔÐ                   Ò Ü º½ º¾ ´Ô Ò ¿µº Ê Ú × ØÓ × Ð
     ÖÙØ Ò × Ð             Ð ÓØ Ö Ð ÓÒ × ÓÒ Ö × ­Ù Ó¸ ÒØ ¬ÕÙ Ð × ÕÙ Ñ Ò Ò
      Ò Ö Ñ ÒØÓ× Ó Ö Ñ ÒØÓ× ­Ù Ó Ý ÑÓ ÕÙ Ð × Ô Ö ÕÙ ÓÒ× Ö Ò ×Ø ØÓÖº
   º ÜÔÖ × ÙÒ Ö               Ò Ö ÑÙÐØ ¹­Ù Ó Ò Ø ÖÑ ÒÓ× ÙÒ ÔÖÓ Ö Ñ Ð Ò Ðº
   º ×ØÙ Ñ ÒÙ Ó× Ñ ÒØ Ð Ø ÓÒ                          ÐÓ× Ð Ð ÓÖ ØÑÓ                ÐÐÑ Ò¹ ÓÖ ¸ Ò
     Ô ÖØ ÙÐ Ö bellman ford negative cycle()¸ ÔÖ × ÒØ Ü º º¿º½¼ ´Ô Ò ½µ Ý
      ÜÔÐ ÕÙ ÓÑÓ ÔÓ Ö ×Ø Ð ÓÖ ØÑÓ Ò ÓÒØÖ Ö Ú Ö Ó× ÐÓ× Ò Ø ÚÓ׺ ´··µ
876                                                            Cap´
                                                                  ıtulo 7. Grafos



Bibliograf´
          ıa
    ½ ʺ ú    Ù ¸ ̺ ĺ Å Ò ÒØ ¸ Ò Âº º ÇÖÐ Òº Æ ØÛÓÖ ÐÓÛ× Ì ÓÖݸ Ð ÓÖ Ø Ñ׸
        Ò ÔÔÐ Ø ÓÒ׺ ÈÖ ÒØ À Ðи ½ ¿º
 ¾       º     ØØ ר ¸ Ⱥ    ׸ ʺ Ì Ñ ×× ¸ Ò Áº º ÌÓÐР׺ Ö Ô Ö Û Ò Ð ÓÖ Ø Ñ×
       ÓÖ Ø Î ×Ù Ð Þ Ø ÓÒ Ó Ö Ô ×º ÈÖ ÒØ À Ðи ½ º
 ¿    ÅÓ Ø Ö Ëº Þ Ö ¸ ÂÓ Ò Âº  ÖÚ ×¸ Ò À Ò º Ë Ö Ð º Ä Ò Ö ÈÖÓ Ö ÑÑ Ò Ò
      Æ ØÛÓÖ ÐÓÛ׺ Ï Ð Ý¸ ÓÙÖØ Ø ÓÒ¸ ¾¼¼ º
      Ê Ö         ÐÐÑ Òº ÇÒ ÖÓÙØ Ò ÔÖÓ Ð Ñº ÉÙ ÖØ ÖÐÝ Ó ÔÔÐ Å Ø Ñ Ø ×¸
      ½ ´½µ ß ¼¸ ½ º
          Ñ ØÖ Ⱥ ÖØ× ×º Æ ØÛÓÖ ÇÔØ Ñ Þ Ø ÓÒ ÓÒØ ÒÙÓÙ× Ò × Ö Ø ÅÓ Ð׺
        Ø Ò Ë ÒØ ¬ ¸ ÐÑÓÒØ¸ Å ×× Ù× ØØ×¸ ½ º
      Ǻ ÓÖÙÚ º Ç ×Ø Ñ ÔÖÓ Ð ÑÙ Ñ Ò Ñ ÐÒ Ñº ÈÖ ÅÓÖ Ú× ÈÖ ÖÓ ÓÚ
      ËÔÓÐ ÒÓר ¸ ¿ ¿ ß ¸ ½ ¾ º ÁÒ Þ º
         º º ÆÌ Á º ÈÖÓ Ö ÑÑ Ò Ò Ð Ò Ö ×ØÖÙ ØÙÖ º ÓÒÓÑ ØÖ ¸ ½ ¸ ½ º
           ÑÓÒ × Ò Ã ÖÔº Ì ÓÖ Ø Ð ÑÔÖÓÚ Ñ ÒØ× Ò Ð ÓÖ Ø Ñ Æ Ò Ý ÓÖ Ò ØÛÓÖ
      ­ÓÛ ÔÖÓ Ð Ñ׺  ŠÂÓÙÖÒ Ð Ó Ø            Ÿ ½ ¸ ½ ¾º
      Ⱥ Р׸ º Òר Ò¸ Ò º º Ë ÒÒÓÒº ÆÓØ ÓÒ ­ÓÛ Ø ÖÓÙ                Ò ØÛÓÖ º ÁÊ
      ÌÖ Ò׺ ÓÒ ÁÒ ÓÖÑ Ø ÓÒ Ì ÓÖݸ Ô × ½½ ß½½ ¸ ½ º
½¼      ÐÐ×ÓÒ¸ Ò×Ò Ö¸ ÃÓÙØ×Ó¬Ó׸ ÆÓÖØ ¸ Ò ÏÓÓ ÙÐк Ö Ô Ú Þ ß ÓÔ Ò ×ÓÙÖ Ö Ô
        Ö Û Ò ØÓÓÐ׺ ÁÒ Ê ÏÁÆ            ÓÒ Ö Ò ÓÒ Ö Ô Ö Û Ò ´ µ¸ ¾¼¼½º
½½    ʺ ÐÓÝ º Ð ÓÖ Ø Ñ Ë ÓÖØ ר Ô Ø º ÓÑÑÙÒº Ÿ ´ µ ¿ ¸ ½ ¾º
½¾    ĺ ʺ ÓÖ Ò º ʺ ÙÐ Ö×ÓÒº Å Ü Ñ Ð ­ÓÛ Ø ÖÓÙ Ò ØÛÓÖ º Ò Ò ÂÓÙÖÒ Ð
      Ó Å Ø Ñ Ø ×¸ ¿ ß ¼ ¸ ½ º
½¿    ĺ ʺ ÓÖ Ò º ʺ ÙÐ Ö×ÓÒº Å Ü Ñ Ð ­ÓÛ Ø ÖÓÙ            Ò ØÛÓÖ º Ò Ò Âº Ó
      Å Ø Ñ Ø ×¸ ¿ ß ¼ ¸ ½ º
½     Ä ×ØÓÖ Êº ÓÖ ¸ ÂÖº Ò º ʺ ÙÐ Ö×ÓÒº ÐÓÛ× Ò Æ ØÛÓÖ ×º ÈÖ Ò ØÓÒ ÍÒ Ú Ö× ØÝ
      ÈÖ ×׸ ½ ¾º
½       º ÑÑ ¸ ʺ À ÐѸ ʺ ÂÓ Ò×ÓÒ¸ Ò Âº ÎÐ ×× ×º × Ò È ØØ ÖÒ׺         ×ÓÒ¹Ï ×Рݸ
      ½ º
½       ÐÒ       ÓÒ׺ Ð ÓÖ Ø Ñ Ö Ô Ì ÓÖݺ Ñ Ö ÍÒ Ú Ö× ØÝ ÈÖ ×׸ Ñ Ö ¸
      ½ º
½        ÓÐ Ö Ò Ì Ö Òº Ò Û ÔÔÖÓ ØÓ Ø Ñ Ü ÑÙѹ­ÓÛ ÔÖÓ Ð Ñº  Å
      ÂÓÙÖÒ Ð Ó Ø         Ÿ ¿ ¸ ½ º
½        ÓÐ Ö Ò Ì Ö Òº Ò Ò Ñ Ò ÑÙѹ Óר Ö ÙÐ Ø ÓÒ× Ý ×Ù ×× Ú ÔÔÖÓÜ Ñ ¹
      Ø ÓÒº ÅÇÊ Å Ø Ñ Ø × Ó ÇÔ Ö Ø ÓÒ× Ê × Ö ¸ ½ ¸ ½ ¼º
7.17. Bibliograf´
                ıa                                                       877



½ Ö Ò À Ö Öݺ Ö Ô Ì ÓÖݺ            ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ½ º
¾¼ º º ÀÓÔ ÖÓ Ø Ò Êº º Ì Ö Òº Æ ÒØ Ð ÓÖ Ø Ñ× ÓÖ Ö Ô Ñ Ò ÔÙÐ Ø ÓÒº Óѹ
   ÑÙÒº Ÿ ½´ µ ¿ ¾ß¿ ¸ ÂÙÒ ½ ¿º
¾½ κ  ÖÒ º Ç ×Ø Ñ ÔÖÓ Ð ÑÙ Ñ Ò Ñ ÐÒ Ñº ÈÖ             ÅÓÖ Ú× ÈÖ ÖÓ ÓÚ
   ËÔÓÐ ÒÓר ¸ ß ¿¸ ½ ¿¼º Ò Þ º
¾¾     Ø Ö ÂÙÒ Ò Ðº Ö Ô ×¸ Æ ØÛÓÖ × Ò Ð ÓÖ Ø Ñ׺ ËÔÖ Ò Ö¸ ¾¼¼ º
¾¿ ƺ à ÖÑ Ö Öº Ò Û ÔÓÐÝÒÓÑ Ðߨ Ñ Ð ÓÖ Ø Ñ ÓÖ Ð Ò Ö ÔÖÓ Ö ÑÑ Ò º ÓÑ ¹
   Ò ØÓÖ ¸ ¿ ¿ß¿ ¸ ½ º
¾ º κ à ÖÞ ÒÓÚº Ø ÖÑ Ò Ò Ø Ñ Ü Ñ Ð ­ÓÛ Ò Ò ØÛÓÖ Ý Ø Ñ Ø Ó Ó
   ÔÖ ­ÓÛ׺ ËÓÚ Ø Å Ø º Ó Ðº¸ ½ ¿ ß ¿ ¸ ½ º
¾ ĺ º à         Ý Òº ÔÓÐÝÒÓÑ Ð Ð ÓÖ Ø Ñ Ò Ð Ò Ö ÔÖÓ Ö ÑÑ Ò º ËÓÚ Ø Å Ø ¹
   Ñ Ø × Ó Ð Ý¸ ¾¼ ½ ½ß½ ¸ ½ º
¾     ÖÒ Ö ÃÓÖØ Ò Â Ò× ÎÝ Òº ÓÑ Ò ØÓÖ Ð ÇÔØ Ñ Þ Ø ÓÒ Ì ÓÖÝ Ò Ð Ó¹
   Ö Ø Ñ׺ ÔÖ Ò Ö¹Î ÖÐ ¸ ÓÙÖØ Ø ÓÒ¸ ¾¼¼ º
¾ º ĺ Ä ÛÐ Öº ÓÑ Ò ØÓÖ Ð ÇÔØ Ñ Þ Ø ÓÒ Æ ØÛÓÖ × Ò Å ØÖÓ ×º ÀÓÐØ¹
   Ê Ò ÖØ¹Ï ÒרÓÒ¸ Æ Û ÓÖ ¸ ½ º
¾     Ú º ÄÙ Ò Ö Ö Ò ÒÝÙ º Ä Ò Ö Ò ÆÓÒÐ Ò Ö ÈÖÓ Ö ÑÑ Ò º ËÔÖ Ò ¹
    ֹΠÖÐ ¸ Ø Ö Ø ÓÒ¸ ¾¼¼ º
¾ ú Å Ò Öº ÍÒØ Ö×Ù ÙÒ Ò Ù Ö ÐÐ Ñ Ò Å ØÖ º Å Ø º ÒÒº¸ ½¼¼ ß½ ¿¸ ½ ¾ º
¿¼ ÂÓÖ ÆÓ Ð Ò ËØ Ô Ò Âº ÏÖ Øº ÆÙÑ Ö Ð ÓÔØ Ñ Þ Ø ÓÒº ËÔÖ Ò Ö × Ö × Ò
   ÓÔ Ö Ø ÓÒ× Ö × Ö º ËÔÖ Ò Ö¹Î ÖÐ ¸ ÔÙ ¹ËÎ Ö¸ × ÓÒ Ø ÓÒ¸ ¾¼¼ º
¿½ º Àº È Ô Ñ ØÖ ÓÙ Ò Ãº ËØ Ð ØÞº ÓÑ Ò ØÓÖ Ð ÇÔØ Ñ Þ Ø ÓÒº ÈÖ ÒØ ¹À Ðи
   ½ ¾º
¿¾ Ë Ò Ö ×٠˺ Ê Óº Ò Ò Ö Ò ÇÔØ Ñ Þ Ø ÓÒº ÂÇÀÆ ÏÁÄ ² ËÇÆË¸ ÁÆ º¸ ÓÙÖØ
      Ø ÓÒ¸ ¾¼¼ º
¿¿ ÊÓ ÖØ Ë Û º Ð ÓÖ Ø Ñ× Ò È ÖØ                  Ö Ô Ð ÓÖ Ø Ñ׺   ×ÓÒ¹Ï ×Рݸ
   ÔÙ ¹ Ï Ö¸ ¾¼¼¾º
¿ ÃÓÞÓ ËÙ Ý Ñ º Ö Ô Ö Û Ò Ò ÔÔÐ Ø ÓÒ× ÓÖ ËÓ ØÛ Ö Ò Ò Ö Ò Ò
   ÃÒÓÛÐ          Ò Ò Ö׸ ÚÓÐÙÑ ½½ Ó ËÓ ØÛ Ö Ò Ò Ö Ò Ò ÃÒÓÛÐ             Ò ¹
   Ò Ö Ò º ÏÓÖÐ Ë ÒØ ¬ ¸ ¾¼¼¾º
¿ ʺ º Ì Ö Òº ÔØ ¬Öר × Ö Ò Ð Ò Ö Ö Ô Ð ÓÖ Ø Ñ׺ ËÁ Šº ÓÑÔÙØº¸
   ½´¾µ ½ ß½ ¼¸ ÂÙÒ ½ ¾º
¿ Î Ö Ó׺ Ù ×Ø ØÓÖ³× ÒØÖÓ Ù Ø ÓÒ Ì ØÓÔ ½¼ Ð ÓÖ Ø Ñ׺ ÓÑÔÙØ Ò Ò Ë Ò
    Ò Ò Ò Ö Ò ´ Ë µ¸ ¾´½µ ¾¾ß¾¿¸  ÒÙ ÖÝ ¾¼¼¼º
¿ ËØ Ô Ò Ï Ö× Ðк Ø ÓÖ Ñ ÓÒ ÓÓÐ Ò Ñ ØÖ ׺ ÂÓÙÖÒ Ð Ó Ø           Ÿ ´½µ ½½ß½¾¸
    ÒÙ ÖÝ ½ ¾º
878                                              Cap´
                                                    ıtulo 7. Grafos



¿ Â Ý ÐÐ Ò Ò ÂÓÒ Ø Ò Äº ÖÓ×׺ Ö Ô Ì ÓÖÝ ² ÁØ× ÔÔÐ Ø ÓÒ׺ Ê ÈÖ ×׸
  ½ º ÁË Æ ¼ß ß¿¿ ¾ß¼º
´
Indice

Ö ÓÐ                                           Ñ Ü ÑÓ¸ ¿¿¿
      ÐØÙÖ ÙÒ¸ ¾                               Ñ Ò ÑÓ¸ ¿¿¿
      ÓÑÔÐ ØÓ                                  ×ÙÔÖ × ÓÒ¸ ´¿ ¾¸ ¿ ¿
        Ö ÔÖ × ÒØ ÓÒ ÓÒ ÖÖ ÐÓ × Ù Ò Ð¸         Ò Ö ÓÒ ÙÒ ÒÓ Ó¸ ¾
           ¿¼¼                               Ö Ó ÙÒ ÒÓ Ó¸ ¾
        ¬Ò ÓÒ¸ ¾                            Ö ÔÖ × ÒØ ÓÒ Ò Ñ ÑÓÖ ¸ ¾ ¼
Ö   ÓÐ Ö ÓÖ ÙÒ Ö Ó¸                    Ö   ÓÐ × Ò Ö Ó×
Ö   ÓÐ Ö ÓÖ ÑÔÐ ØÙ ¸ ¿¼                        Ð ÙÐÓ Ð ÐØÙÖ ¸ ¾
Ö   ÓÐ Ò Ö Ó                                   Ð ÙÐÓ Ð Ö Ò Ð ¸ ¾
        ¬Ò ÓÒ¸ ¾ ¾                           ÓÑÔ Ö ÓÒ¸ ¾
     ÒÓ Ó ÓÑÔÐ ØÓ¸ ¾                           רÖÙ ÓÒ¸ ¾
     ÒÓ Ó Ò ÓÑÔÐ ØÓ¸ ¾                       ÕÙ Ú Ð Ò ¸ ¾
     ÒÓ Ó ÐÐ ÒÓ¸ ¾                           ÜØ Ò× ÓÒ ×
     Ö ÓÖÖ Ó Ò¬ Ó¸ ¾                             Ð ÙÐÓ Ð ÔÓ× ÓÒ Ò¬ ¸ ¿
     Ö ÓÖÖ Ó ÔÓÖ Ò Ú Ð ×¸ ¾                     Ò× Ö ÓÒ ÔÓÖ Ð Ú ¸ ¿
     Ö ÓÖÖ Ó ÔÖ ¬ Ó¸ ¾                         × Ð ÓÒ¸ ¿
     Ö ÓÖÖ Ó ×Ù¬ Ó¸ ¾                         Ð Ó׸ ´¾ ¸ ¾
Ö   ÓÐ Ò Ö Ó         Ù×ÕÙ                    Ó Ò¸ ¿
       Ù×ÕÙ ¸ ¿¿¾                            Ó Ò Ü ÐÙ× ÚÓ¸ ¿ ½
        ¬Ò ÓÒ¸ ¿¿¼                          Ô ÖØ ÓÒ¸ ¿¿
      Ð Ñ Ò ÓÒ¸ ¿ ¾                            ÔÓÖ ÔÓ× ÓÒ¸ ¿
      Ò× Ö ÓÒ¸ ¿¿                           Ô ÖØ ÓÒ ÔÓÖ Ð Ú ¸ ¿
      Ò× Ö ÓÒ Ò Ö Þ¸ ¿ ¿                    Ö ÓÖÖ Ó× ÒÓ Ö ÙÖ× ÚÓ׸ ¾
     ×ÙÔÖ × ÓÒ¸ ´¿ ¾¸ ¿ ¿                   ÖÓØ ÓÒ¸ ¿ ½
Ö   ÓÐ Ò Ö Ó         Ù×ÕÙ      ÜØ Ò Ó       ×ÔРظ ¿¿
      Ò× Ö ÓÒ Ò Ö Þ¸ ¿                      ÙÒ ÓÒ¸ ¿
Ö   ÓÐ ×                                    ÙÒ ÓÒ Ü ÐÙ× Ú ¸ ¿ ½
      Ò ×ØÖÓ× ÙÒ ÒÓ Ó¸ ¾               Ö   ÓÐ × Ò Ö Ó× ÓÒ Ö Ò Ó׸ ¿ ¿
       Ò Ö Ó×       Ù×ÕÙ ¸ ´¿¿¼¸ ¿     Ö   ÓÐ × Ò Ö Ó×       Ù×ÕÙ ¸ ´¿¿¼
         Ò Ð × ×¸ ´¿ ¸ ¿                     Ò Ð × ×¸ ´¿ ¸ ¿
          Ù×ÕÙ ¸ ´¿¿¾¸ ¿¿                    Ö Ø ¸ ´¿ ¸ ¿
          Ù×ÕÙ         Ô Ö ¸ ¿¿              ÜØ Ò Ó׸ ¿ ¿
          Ù×ÕÙ         Ö Ò Ó¸ ¿¿       Ö   ÓÐ × Ò Ö Ó× ÜØ Ò Ó׸ ´¿ ¿¸ µ¿ ½
          Ù×ÕÙ        Ð ÔÖ     ×ÓÖ¸ ¿¿       Ð Ñ Ò ÓÒ ÔÓÖ Ð Ú ¸ ¿ ¼
          Ù×ÕÙ        Ð ×Ù ×ÓÖ¸ ¿¿           Ð Ñ Ò ÓÒ ÔÓÖ ÔÓ× ÓÒ¸ ¿ ¼
         Ö Ø ¸ ´¿ ¸ ¿                        Ò× Ö ÓÒ
           ¬Ò ÓÒ¸ ¿¿¼                          ÔÓÖ ÔÓ× ÓÒ¸ ¿
         Ò× Ö ÓÒ¸ ´¿¿ ¸ ¿¿                  ÖÓØ ÓÒ¸ ¿ ¿
880                                                                  ´
                                                                     INDICE



    ÙÒ ÓÒ Ü ÐÙ× Ú ¸ ¿               Ð ØÓÖ Þ ÓÒ¸ ½ ¾
 Ö ÓÐ × ×Ø Ø Ó× ÓÔØ ÑÓ׸ ´¿ ¸ ¿ ¾   Ð Ö O¸ ½ ¾
Ö ÑÓÚ ÐÐ Ò Ð Ø ´µ¸                  Ð ÓÖ ØÑÓ
 רÖÙ ØÙÖ      ØÓ×                           Ð ÙÐÓ Ke(G)¸ ¾½
    ÓÖ ÒØ           Ð ÓÒ ÔØÓ¸ ¾¾            ÓÑÔ Ö ÓÒ Ö ÓÐ Ò Ö Ó¸ ¾
    ÓÖ ÒØ           Ð ­Ù Ó¸ ¾¾                × ÓÑÔÓ× ÓÒ ­Ù Ó¸ ½
    ÓÖ ÒØ ×         ÐÓ× ØÓ׸ ¾½               רÖÙ ÓÒ Ö ÓÐ Ò Ö Ó¸ ¾
 ØÖ ÙØÓ׸ ¼                                ÃÖÙ× Ð¸ ß ¼¾
 Ù Ø ×¸ ¼                                  ÈÖ Ñ¸ ¼¾ß ½¼
 Ò× Ö ÓÒ¸ ¼                             Ö ÙÖ× ÚÓ ÐØÙÖ ÙÒ Ö ÓÐ Ò Ö Ó¸
 ¼¹¾¼ Ö Ð ¸ ¾¾                              ¾
                                        Ö ÙÖ× ÚÓ        Ö ÒÐ         ÙÒ Ö ÓÐ ¹
                                            Ò Ö Ó¸ ¾
        Ù×ÕÙ ¸ ¿¿¾                  Ð ÓÖ ØÑÓ        ÓÖ ¹ ÙÐ Ö×ÓÒ¸ ¿
        Ù×ÕÙ × ×Ô Ð ×¸ ¿¿                Ò Ð × ×¸
       ÓÒ Ø Ò ÓÒ¸ ¿                 Ð ÓÖ ØÑÓ          ÑÓÒ ×¹Ã ÖÔ¸
       ÓÒ Ø Ò ÓÒ Ü ÐÙ× Ú ¸ ¿ ½           Ò Ð × ×¸ ¼
       Ð Ñ Ò ÓÒ¸ ¿ ¾                Ð ÓÖ ØÑÓ         Ð ÙÐÓ Ke(G))¸ ¾½
       Ò× Ö ÓÒ¸ ¿¿                  Ð ÓÖ ØÑÓ         Ð ÙÐÓ    ÓÒ Ø Ú         Ö¹
       Ò× Ö ÓÒ Ò Ö Þ¸ ¿ ¿                     Ó׸ ¾½
       Ó Ò¸ ¿                       Ð ÓÖ ØÑÓ        ÓÒÚ Ö× ÓÒ Ö ÓÒ Ô ¹
       Ó Ò Ü ÐÙ× ÚÓ¸ ¿ ½                          × Ò ÒÓ Ó× ÙÒ Ö ØÖ ¹
      Ô ÖØ ÓÒ¸ ¿¿                              ÓÒ Ð¸ ¼
      ÔÖ       ×ÓÖ¸ ¿¿               Ð ÓÖ ØÑÓ Ê Ò¹Ã ÖÔ¸ ¿
      ×ÔРظ ¿¿                      Ð ÓÖ ØÑÓ        Ï Ö× ÐÐ Ô Ö Ð Ð Ù×ÙÖ
      ×Ù ×ÓÖ¸ ¿¿                            ØÖ Ò× Ø Ú ¸ ½
      ÙÒ ÓÒ¸ ¿                      Ð ÓÖ ØÑÓ × ÑÔРܸ ß ¾
      ÙÒ ÓÒ Ü ÐÙ× ÚÓ¸ ¿ ½           Ð ÓÖ ØÑÓ× Ð ØÓÖ Ó׸ ½ ¾
                                    ÐØÙÖ
      ÙÒ ÓÒ Ü ÐÙ× Ú ¸ ¼                    ÒÓ Ó Ò Ö         ­Ù Ó¸ ¿
                                           ÙÒ Ö Óи ¾
        Ð ÙÐÓ Ð ÔÓ× ÓÒ Ò¬ ¸ ¿              ÙÒ ÒÓ Ó¸ ¾
        × ÑÔ ÒÓ¸ ¿ ½                ÐØÙÖ ÙÒ Ö Óи ¾
      Ð Ñ Ò ÓÒ ÔÓÖ Ð Ú ¸ ¿ ¼        ÐØÙÖ ÙÒ Ö ÓÐ Ò Ö Ó¸ ¾
      Ð Ñ Ò ÓÒ ÔÓÖ ÔÓ× ÓÒ¸ ¿ ¼      ÐØÙÖ Ò Ö Ò ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ¸ ½
      Ò× Ö ÓÒ Ò Ö Þ¸ ¿              Ò Ð × × ÑÓÖØ Þ Ó¸ ¾¼¼
      Ò× Ö ÓÒ ÔÓÖ Ð Ú ¸ ¿           Ò Ð × × ÓÒØ Ð ¸ ¾¼ ß¾¼
      Ò× Ö ÓÒ ÔÓÖ ÔÓ× ÓÒ¸ ¿         Ò Ð × × Ð ÓÖ ØÑÓ׸ ½
     Ô ÖØ ÓÒ¸ ¿                     Ò Ð × × ÐÓ× Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ ¸
     Ô ÖØ ÓÒ ÔÓÖ ÔÓ× ÓÒ¸ ¿                  ´¿ ¸ ¿
     × Ð ÓÒ¸ ¿                      Ò Ð × × Ð Ð ÓÖ ØÑÓ            ÓÖ ¹ ÙÐ Ö×ÓÒ¸
     ×ÔРظ ¿
     ÙÒ ÓÒ Ü ÐÙ× Ú ¸ ¿              Ò Ð××    Ð Ð ÓÖ ØÑÓ     ÑÓÒ ×¹Ã ÖÔ¸
     ×Ó Ù Ö       ÐÓÕÙ ¸ ¾¾½                ¼
    Ð       ¸ ½                     Ò Ð × × Ð Ð ÓÖ ØÑÓ Ò Ö Ó ÔÖ ¹­Ù Ó¸
  ØÙ ÓÖ¸                                    ¾
 Ð ÒÞ Ð ¸
´
INDICE                                                                      881



Ò Ð×× Ð Ñ Ò Ó           ÓÐ × ÓÒ × ÔÓÖ Ö ¹       Ò× Ö ÓÒ¸ ´ ¸ ¼½
           ÓÒ Ñ ÒØÓ ÖØÓ Ý ×ÓÒ Ó Ð Ò Ð¸      Ö ÓÐ × Ð ØÓÖ Þ Ó׸ ß
           ¾¼                                   Ò Ð × ×¸ ¾ß
Ò Ð × × Ð Ñ Ò Ó ÓÐ × ÓÒ × ÔÓÖ Ò ¹               ÓÒ Ø Ò ÓÒ¸ ¼
          Ò Ñ ÒØÓ ÖÖ Ó¸ ½¾                      Ð Ñ Ò ÓÒ¸ ¼
Ò Ð × × Ð Ñ Ò Ó ÓÐ × ÓÒ × ÔÓÖ Ò ¹               Ò× Ö ÓÒ¸
          Ò Ñ ÒØÓ × Ô Ö Ó¸ ¼                   ×ÙÔÖ × ÓÒ¸ ¼
Ò Ð × × Ð Ñ Ö ×ÓÖØ¸ ½                          ØÖ Ô¸ ¼
Ò Ð × × Ð ×ÓÒ Ó Ð¸ ½                        Ö ÓÐ × Ò Ö Ó×
Ò Ð × × ÔÓØ Ò Ð¸ ¾¼½ß¾¼                        ×ÑÐ Ö ¸ ¾
Ò Ð × × ÑÓÖØ Þ Ó                            Ö ÓÐ × Ò Ö Ó× Ð ØÓÖ Þ Ó×
     Ò Ð × × ÓÒØ Ð ¸ ¾¼ ß¾¼                    ÙÒ ÓÒ Ü ÐÙ× Ú ¸ ¼
     Ò Ð × × ÔÓØ Ò Ð¸ ¾¼½ß¾¼                Ö ÓÐ × Ò Ö Ó× ÜØ Ò Ó
   × Ð ÓÒ Ö ØÓ׸ ¾¼ ß¾¼                        ×ÔРظ ¿
   × Ð ÓÒ ÙÒ ÓÒ ÔÓØ Ò Ð¸ ¾¼ ß¾¼             Ö ÓÐ ×         ÓÒ ¸ ¼ ß ½½
Ò Ð × × ÐÓ× Ö ÓÐ × Ð ØÓÖ Þ Ó׸ ¾ß               ÐØÙÖ ¸ ¼
Ò Ð × × ÐÓ× Ö ÓÐ × ×ÔРݸ ¿ ß ¾                   Ö ÒÐ ¸ ¼
Ò Ð × × ÐÓ× ØÖ Ô׸ ¾ß ¿                     Ö ÓÐ × ÕÙ Ð Ö Ó׸ ß
Ò Ð × × Ð ÕÙ ×ÓÖØ¸ ½                        Ö ÓÐ × ×ÔРݸ ¿¼ß ¾
Ò ×ØÖÓ× ÙÒ ÒÓ Ó¸ ¾                              Ò Ð × ×¸ ¿ ß ¾
ÔÐ ÓÒ × Ð × ÓР׸ ½¿¾                       Ö ÓÐ × ØÖ Ô×
ÔÙÒØ ÓÖ × Ý ÖÖ ÐÓ¸ ¿½                           Ò Ð × ×¸ ¾ß ¿
Ö ÓÐ                                        Ö ÓÐ × Ò Ö Ó×        Ù×ÕÙ ¸ ¿
   ÖÓ Ó¹Ò ÖÓ¸ ½¿                            Ö ÓÐ × ÓÑÔÐ ØÓ×
            ÓÒ ¸ ¼                             Ö ÔÖ × ÒØ ÓÒ Ò Ñ ÑÓÖ ¸ ¾
Ö ÓÐ ÎÄ Ö Ø Ó¸ ½¼                           Ö ÓÖ × Ò ¸ ¾
Ö ÓÐ Ö ÓÖ ÔÖÓ ÙÒ                ¸ ¾            Ö ÓÖÖ Ó׸ ¾ ¼¸ ¾
Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ¸ ß ½¼                         Ì Tree Node<T>¸ ¾
Ö ÓÐ Ò Ö Ó         Ù×ÕÙ     Ð ØÓÖ Ó¸        ÖÓ
Ö ÓÐ ×                                         Ö Ð ÓÒ¸ ¿¼
      ÎÄ                                    Ö Ó Ò ÒØ ¸ ¾
        Ò Ð × ×¸ ¼ ß ½¿                     Ö Ó Ô Ö Ð ÐÓ¸
        Ð Ñ Ò ÓÒ¸ ´ ¼½¸ ¼                   Ö Ó× ÙÒ Ö Ó
       Ò× Ö ÓÒ¸ ´ ¸ ¼½                          ÑÔÐ ÒØ ÓÒ¸ ½
     ÕÙ Ð Ö Ó Ô Ö ØÓ¸                       Ö ØÑ Ø        ÔÓÐ ÒÓÑ Ó×
   ÒÓ Ó Ò Ö Ó                                  Ù×Ó Ð ×Ø × ÒÐ Þ ×¸ ½¼¼
       Ì BinNode<Key>¸ ¾                    Ö ØÑ Ø        ÔÙÒØ ÖÓ׸ ¿½
   ÖÓ Ó¹Ò ÖÓ¸ ½¿ß ¾                         ÖÖ ÐÓ
        Ò Ð × ×¸ ¾ ß ¾                          Ò Ñ ÑÓÖ Ò Ñ ¸ ¿
        Ð Ñ Ò ÓÒ¸ ´ ¾¼¸ ¾                        Ù×ÕÙ        Ò Ö ¸ ¿¾
       Ò× Ö ÓÒ¸ ´ ½ ¸ ¾¼                         Ù×ÕÙ ÔÓÖ Ð Ú ¸ ¿¾
   ×ÔРݸ ¿¼ß ¾                                   Ð ÙÐÓ      Ö ÓÒ¸ ¿½
Ö ÓÐ × Îĸ ß ½¿                                 ÓÒ ÔØÓ× Ò Ö Ð ×¸ ¿¼
     Ò Ð × ×¸ ¼ ß ½¿                                 Ø×¸ ¿ ß ½
       ¬Ò ÓÒ¸                                    Ò Ñ Ó¸ ½ß ½
     Ð Ñ Ò ÓÒ¸ ´ ¼½¸ ¼                          Ð Ñ Ò ÓÒ ÔÓÖ Ð Ú ¸ ¿¿
882                                                                     ´
                                                                        INDICE



      Ò Ñ ÑÓÖ ×Ø Ø ¸ ¿                 Ù×ÕÙ        Ð ØÓÖ
      ÒÔÐ ¸ ¿                               Ò ÖÖ ÐÓ¸ ½
      Ò× Ö ÓÒ ÔÓÖ Ð Ú ¸ ¿¿                  Ò Ð ×Ø ׸ ½
     ÑÙÐØ Ñ Ò× ÓÒ Ð¸ ½                 Ù×ÕÙ         Ò Ö ¸ ¿¾¸ ½ ß½
     Ô Ö Ö ÔÖ × ÒØ Ö Ö ÓР׸ ¾ ½       Ù×ÕÙ             Ñ ÒÓ× ÔÓÖ ÑÔÐ ØÙ ¸ ¾
 × ÖØÓ׸ ¾½                            Ù×ÕÙ             Ñ ÒÓ× ÔÓÖ ÔÖÓ ÙÒ    ¸ ¾½
 × Ò ÓÒ¸ ½½                            Ù×ÕÙ             ÐÓ× Ò ÙÒ Ö Ó¸ ½
     ­Ù Ó Ñ Ü ÑÓ Óר Ñ Ò ÑÓ¸ ¸
LhashTable<Key>¸ ¼
                                        Ð ÙÐÓ ÒÓ Ó× Ô ÖØ Ò ÒØ × ÙÒ Ò Ú Ð¸
 ØÖ ÙØÓ× ÓÒØÖÓÐ ÒÓ Ó× Ý Ö Ó×        ÙÒ          ¾¿
          Ö Ó¸ ¼                        Ð ÙÐÓ Ð ÒÙÑ ÖÓ           Û Ý¸ ¾ ¼
 ÙØÓÑ Ø ¸ ¾½                           Ó Ó× ÀÙ«Ñ Ò¸ ¿ ¿ß¿
 ÎÄ                                         Ó ¬ ÓÒ Ø ÜØÓ¸ ¿ ½
      Ö ÓР׸ ß ½¿                             Ó ¬ ÓÒ¸ ¿
                                           Ò Ö ×Ó Ö Ù Ò ×¸ ¿ ¼
 Ù×ÕÙ                                     ÓÔØ Ñ ÓÒ¸ ¿ ¿
         Ö Ó× Ò Ö Ó¸                        ¸ ¾¿¼
           ÐÓ× Ò Ø ÚÓ׸ ¿                  Ò × ÔÖÓ Ù ÓÒ
        ÒÓ Ó× Ò Ö Ó¸ ¿                    ­Ù Ó Ñ Ü ÑÓ Óר Ñ Ò ÑÓ¸
     × Ù Ò Ð¸ ½                         Ð ÙÐÓ Ö Ö × Ù Ð Ò ÙÒ Ö              ­Ù Ó¸
 Ù×ÕÙ         Ò Ö ¸ ¿¾
 Ù×ÕÙ           Ö Ó× Ò ÙÒ Ö Ó             Ñ ÒÓ
      ÑÔÐ Ñ ÒØ ÓÒ¸ ¼                          Ù×ÕÙ        Ò ÔÖÓ ÙÒ      ¸ ¾¿
 Ù×ÕÙ           ÜØÖ ÑÓ׸ ½                    ÒØÖ ÒÓ Ó× ÙÒ Ö Óи ¾
 Ù×ÕÙ          Ñ Ü ÑÓ¸ ½                    ÐÓÒ ØÙ Ò ÙÒ Ö Óи ¾
 Ù×ÕÙ          Ñ Ò ÑÓ¸ ½                    ÔÖÙ           Ü ×Ø Ò ¸ ¾½¸ ½
 Ù×ÕÙ          ÒÓ Ó× Ò ÙÒ Ö Ó               × ÑÔÐ ¸ ¾
      ÑÔÐ Ñ ÒØ ÓÒ¸ ¼                      Ñ ÒÓ Ñ × ÓÖØÓ¸ ¾¾¿
 Ù×ÕÙ        Ò Ø Ð × Ð Ò Ð¸ ¿             Ñ ÒÓ          Ø Ð Ò¸ ¿¾
 Ù×ÕÙ × Ù Ò ¸ ½ ß½                        Ñ ÒÓ ÙÒ Ö Ó¸ ¾
   ÐÐÑ Ò¹ ÓÖ                               Ñ ÒÓ Ñ × ÓÖØÓ¸ ¾¾
       Ñ ÒÓ× Ñ Ò ÑÓ׸ ¾ ß ¾               Ñ ÒÓ× ÙÑ ÒØÓ¸
BinHeap<Key>                                   Ð ÙÐÓ ¸ ½
         ØÙ Ð Þ ÓÒ ÙÒ Ð Ñ ÒØÓ¸ ¿½         Ñ ÒÓ× Ñ Ò ÑÓ׸ ½¼ß ¿
       Ð Ñ Ò ÓÒ¸ ¿½                           Ð ÓÖ ØÑÓ         ÐÐÑ Ò¹ ÓÖ ¸ ¾ ß ¾
       Ð Ñ Ò ÓÒ Ù ÐÕÙ Ö Ð Ñ ÒØÓ¸ ¿½           Ð ÓÖ ØÑÓ           ×ØÖ ¸ ½½ß ¾¼
       Ð Ñ Ò ÓÒ ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ׸ ¿½        Ð ÓÖ ØÑÓ       ÐÓÝ ¹Ï Ö× Ðи ¾¼ß ¾
      ÁÒ× Ö ÓÒ¸ ¿½                             × Ù× ÓÒ¸ ¾
       ÒØ Ö Ñ Ó ÒØÖ ÒÓ Ó׸ ¿½             Ô        ¸ ¿
BinNode<Key>                              Ô             ÙÒ ÓÖØ ¸
    ÓÒÚ Ö× ÓÒ Tree Node<T>¸   ¾¾          Ö ÒÐ
BinTree<Key>¸ ¿¿                                ÙÒ Ö Óи ¾
BitArray¸ ¿ ß ½                                   ÒØ ¸ ¾
 Ø× ÓÒØÖÓи ¼                                  Ð Ò Ú Ð¸ ¾
 Ùи ¾                                    Ö ÒÐ             ÙÒ Ö ÓÐ Ò Ö Ó¸ ¾
 Ù×ÕÙ                                     ר Ò
    ×Ó Ö ÖÖ ÐÓ׸ ½                          Dlink       רÖÙ ØÙÖ ÓÒØ Ò ¸
´
INDICE                                                                             883



    Slink     רÖÙ ØÙÖ ÓÒØ Ò ¸ ¼            ÓÒ Ø Ú              Ö Ó×
  ØÐÒ                                            Ð ÓÖ ØÑÓ¸ ¾½
    ÒÙÑ ÖÓ ¸ ¿¾ ß¿¿¼                              Ð ÙÐÓ¸ ¾½
  ÐÓ×                                            ÑÔÐ ÒØ ÓÒ Ð Ð ÓÖ ØÑÓ             Ð ÙÐÓ¸
      Ù×ÕÙ        Ò Ø ÚÓ׸ ¿                          ¾¾
       Ø ÓÒ¸ ½                              ÓÒ Ø Ú          ÒØÖ Ö Ó׸ ½
    ÔÖÙ            Ð      ¸ ½               ÓÒ ÙÒØÓ¸ ¾½
    Ù×Ó Ð ÓÖ ØÑÓ            ÐÐÑ Ò¹ ÓÖ Ô Ö   ÓÒ ÙÒØÓ ÔÖ ¬ Ó¸ ¿¾¾
         ×Ù Ø ÓÒ¸ ¿                         ÓÒ ÙÒØÓ×
  ÐÓ× Ò Ø ÚÓ×                                   Ö ÔÖ × ÒØ ÓÒ Ö ÓР׸ ¾
     Ð ÓÖ ØÑÓ        ÐÐÑ Ò¹ ÓÖ ¸ ¿          ÓÒØÖ ÓÒ Ø Ð × Ð Ò Ð¸ ¿
      Ù×ÕÙ ¸ ¿                              ÓÒÚ Ö× ÓÒ
 Ö ÙÐ ÓÒ ×¸ ½                                   Dlink      רÖÙ ØÙÖ ÓÒØ Ò ¸
Ð×                                              Slink      רÖÙ ØÙÖ ÓÒØ Ò ¸ ¼
       רÓÖ ¸                               ÓÒÚ Ö× ÓÒ        ÙÒ Ö ÓÐ         Ö ÓÖ ÙÒ
     ÒØ ÖÑ Ö ¸                                      Tree Node<T>¸ ¿¿
    ÔÖÓÜݸ                                  ÓÖÖ Ø ØÙ
Ð Ù×ÙÖ ØÖ Ò× Ø Ú ¸ ¾¿¸ ½                         Ù×ÕÙ ¸ ¾¼
Ð ÕÙ ÙÒ Ö Ó¸                                      Ø ÓÒ¸ ¾¼
Ó Ó                                             ÔÐ ÒØ Ñ ÒØÓ Ð ÔÖÓ Ð Ñ ¸ ¾¼
        ÄÙ × Û Þ¸ ¿¾½¸ ¿¾                   ÓÖÖ ×ÔÓÒ Ò ÒØÖ Ö ÓÐ × Ò Ö Ó× Ý m¹
Ó Ó ÙÒ Ö ÓÐ Ò Ö Ó¸ ¿¾½                              Ö Ó׸ ¾
ÓÐ ×                                        ÓÖÖ ×ÔÓÒ Ò            ÒØÖ BinNode<Key> Ý
     ÔÐ ÓÒ ×¸ ½¿¾                                   Tree Node<T>¸ ¾ ¾
    Ñ ÒØ ÖÖ ÐÓ׸ ½¿                         ÓÖÖ ×ÔÓÒ Ò            ÒØÖ Tree Node<T> Ý
    Ñ ÒØ Ð ×Ø × ÒÐ Þ ×¸ ½¿                          BinNode<Key>¸ ¾ ¾
    Ñ ÒØ Ð ×Ø × ÒÐ Þ × Ò Ñ ×¸               ÓÖØ
         ½¼                                       Ô            ¸
    Ö ÔÖ × ÒØ ÓÒ × Ò Ñ ÑÓÖ ¸ ½¿¿                Ú ÐÓÖ ­Ù Ó¸ ¿
ÓÐ × ÔÖ ÓÖ ¸ ¿¼                             ÓÖØ ÙÒ Ö ¸ ¾
       ØÙ Ð Þ ÓÒ ÙÒ Ð Ñ ÒØÓ¸ ¿¼             ÓÖØ Ñ Ò ÑÓ¸
ÓÑÔ Ö ÓÒ Ö ÓÐ × Ò Ö Ó׸ ¾                         Ð ÙÐÓ ¸ ¼½
 ÓÑÔ Ö Ý Dlink¸ ½                           ÓÖØ × Ö ¸ ¾
ÓÑÔÐ Ñ ÒØÓ ÙÒ Ö Ó¸ ¿                        Óר Ò ×Ô Ó              Ð ÓÖ ØÑÓ× Ú Ö Óѹ
ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× ÐÓ× ÔÙÒØÓ× ÓÖØ ¸                     Ò Ö¸ ½
            ¼                               Óר Ñ Ò ÑÓ
ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ× ÙÒ ¹                  Ð ­Ù Ó Ñ Ü ÑÓ¸ ¾
          Ö Ó¸ ß                            ÓרÙÑ Ö × ÓÖÖ Ø ØÙ
 ÓÑÔÓÒ ÒØ × Ò ÓÒ ÜÓ× ÙÒ Ö Ó¸ ¿                       ÐÓ Ó ÀÓÐØÞÑ ÒÒ¸ ¾¼
ÓÑÔÖ Ò× ÓÒ         ØÓ׸ ¿ ¿ß¿                   ÈÖ ÙÒØ × Ø ØÙ Ò Ö × Î Ò Ð ¸
ÓÒ Ø Ò ÓÒ Ö ÓÐ × Ð ØÓÖ Þ Ó׸ ¼                      ¾½¿
ÓÒ ÓÒ ÖÓ ¸ ½¿                               ÖØ          Ð ÓÖ ØÑÓ׸ ½
ÓÒ ÓÒ Ò Ö ¸ ½¿                              ÖØ         ÐÓ× Ö ÓÐ × Ò Ö Ó×       Ù×ÕÙ ¸
ÓÒ Ø Ú ¸ ¾¼                                         ´¿ ¸ ¿
     ÒØÖ Ö Ó׸                              ÖØ        Ð Ñ Ö ×ÓÖØ¸ ½
     ÒØÖ Ö Ó׸ ½                            ÖØ        Ð ÕÙ ×ÓÖØ¸ ½
884                                                                ´
                                                                   INDICE



LhashTable<Key>¸      ¼                     Óר Ò ×Ô Ó¸ ½
ÙÑÔÐ ÒÓ׸ ¼½                           Ñ ÐÐÓ ¸ ¾¾¾
     ¸
                                      DynArray<T>
                                            Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ и ½
   ¸ ¾¾¿                                ÝÒË ØÌÖ ¸ ¿ ¼
    ÐÓ ¸ ¾½
     Í ¸ ¾½                                     ÙÒ ÒÓ Ó¸ ¾
    ÐÓ Ó ÀÓÐØÞÑ ÒÒ¸ ¾¼                 Ð ÔÖÓ Ð Ñ Ð ×Ø ÓÒ Ñ ÒØÓ¸ ¼¼
   Ù ÓÒ¸ ¾¿                            Ð Ñ Ò ÓÒ
 ÐØ¸¿                                       Ò       ¸¿ ¾
 ÔÙÖ ÓÖ ×¸ ¾¾¿                              Ö ÓÐ Ò Ö Ó        Ù×ÕÙ ¸ ¿ ¾
 × ÓÑÔÓ× ÓÒ ­Ù Ó¸ ½                    Ð Ñ Ò ÓÒ          ÐÓ× Ò Ø ÚÓ׸ ¿¿
 × ÑÔ ÒÓ ÐÓ× Ö ÓÐ × Ò Ö Ó× ÜØ Ò ¹ Ð Ñ Ò ÓÒ Ð Ö ÙÖ× ÓÒ¸ ½¾
          Ó׸ ¿ ½                      Ð Ñ Ò ÓÒ Ð Ö ÙÖ× ÓÒ ÓÐ ¸ ½¾
 רÖÓÝÊ ¸ ¾                            Ð Ñ Ò ÓÒ Ð Ö ÙÖ× ÓÒ ÔÓÖ ÑÙÐ ÓÒ
 רÖÙ ÓÒ                                       ÐÓ× Ö ×ØÖÓ×        Ø Ú ÓÒ¸ ½¾
        Tree Node<T>¸ ¾                Ð Ñ Ò ÓÒ Ò Ø Ð × Ð Ò Ð¸ ¼
 רÖÙ ÓÒ ÙÒ Ö ÓÐ Ò Ö Ó¸ ¾              Ð Ñ Ò ÓÒ ÔÓÖ Ð Ú Ò Ö ÓÐ × Ò Ö Ó× Ü¹
 רÖÙ ØÓÖ × Ú ÖØÙ Ð ×                          Ø Ò Ó׸ ¿ ¼
    ÔÖÓ Ð Ñ ¸                          Ð Ñ Ò ÓÒ ÔÓÖ ÔÓ× ÓÒ Ò Ö ÓÐ × Ò Ö Ó×
 Ø ÓÒ           ÐÓ× Ò Ø ÚÓ׸ ¿                   ÜØ Ò Ó׸ ¿ ¼
  ÛÝ                                   Ð Ñ Ò ÓÒ ØÓØ Ð Ð Ö ÙÖ× ÓÒ¸ ½¿¼
      Ù×ÕÙ      Ò Tree Node<T>¸ ¾ ¼    Ð Ñ Ò ÓÒ Ò Ö ÓÐ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ¸ ´ ¾¼¸
    ÒÓØ ÓÒ Ô Ö Ö ÓР׸ ¾                         ¾
 ¸ ¾                                   Ð Ñ Ò ÓÒ Ò Ö ÓÐ Ð ØÓÖ Þ Ó¸ ¼
  Ñ ØÖÓ ÙÒ Ö Ó¸ ¿                      Ð Ñ Ò ÓÒ Ò ØÖ Ô¸ ¼
    Ö Ñ ÍÅÄ                            ÑÔ Ö Ñ ÒØÓ¸ ½½
    Ä ×Ø × Ó Ð Ñ ÒØ ÒÐ Þ ×¸                  Ô ÖØ Ó¸ ½¾
  ÓР׸ ½¿¾                                      Ö ÒÐ       Ñ Ü Ñ ¸ ½½
  Ö Ó¸ ¾                                  Ñ Ü ÑÓ¸ ½¾
     ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ׸ ß       Ô Ö ØÓ¸ ½¾
                                        Ò Ð Ö¸ ¾½
  Ö Ó׸ ß                              ÒÐ      Óи
     ÓÒ Ø Ú ¸                          ÒÐ × ÑÔÐ ¸
     ÒÚ Ö× ÓÒ¸                         Ò× Ò ÒÞ
    ÓÖ Ò Ñ ÒØÓ ØÓÔÓÐÓ Ó¸ ¼ß                 Ø ÑÓÐÓ ¸
    ÔÐ Ò ¬ ÓÒ¸                         ÒÙÑ Ö ÓÒ Ö ÓР׸ ¿¾¼
  Ö Ó× Ð Ó׸                           ÕÙ Ð Ö Ó Ô Ö ØÓ Ï ÖØ ¸
    ×ØÖ                                ÕÙ Ú Ð Ò
       Ñ ÒÓ× Ñ Ò ÑÓ׸ ½½ß ¾¼                   Ö ÓÐ × Ò Ö Ó׸ ¾
    ÌÖ ÔÐ Ô ÖØ ÓÒ Ð ÕÙ ×ÓÖØ¸ ½         ÕÙ Ú Ð Ò ÒØÖ Ö Ý ÓÖØ ¸ ¿
 ÔÓÐÓ׸ ½¿¾                            ÖÖÓÖ × Ñ ÑÓÖ
 ×Ô Ö× ÓÒ          Ò×      Ö Ø Ö ×¸ ½          ×Ó Ù Ö        ÐÓÕÙ ¸ ¾¾½
 ×Ô Ö× ÓÒ ÔÓÖ Ú × ÓÒ¸                      Ù ¸ ¾¾½
 ×Ô Ö× ÓÒ ÔÓÖ ÑÙÐØ ÔÐ ÓÒ¸              ר Ð
 ×Ô Ö× ÓÒ ÙÒ Ú Ö× Ð¸ ½                      Ò ÓÖ Ò Ñ ÒØÓ¸ ½
 Ú Ö ÓÑ Ò Ö¸ ½ ¼                          Ñ Ö ×ÓÖØ¸ ½
´
INDICE                                                                            885



 ר ÓÒ Ñ ÒØÓ¸ ¼¼                             Ð ÓÖ ØÑÓ Ò Ö Ó            ÑÔÙ       ÔÖ ¹
  רÖÙ ØÙÖ        ØÓ×                            ­Ù Ó¸
     ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ и ½ ß¾½                Ð ÓÖ ØÑÓ Ò Ö Ó ÔÖ ¹­Ù Ó¸ ¿
 Ø ÑÓÐÓ                                        Ú ÐÓÖ × Ò Ð × ÐØÙÖ ¸
      ÑÓÖØ Þ Ö¸ ¾¼                           Ð ÓÖ ØÑÓ ÔÓÖ ÑÔÙ                ÔÖ ¹­Ù Ó
      Ò Ð × ×¸ ½                                    Ò Ö Ó ÔÓÖ Ö Ó׸
        Ð ÒÞ ¸ ¿                             Ð ÓÖ ØÑÓ× ÑÔÙ Ý ÔÖ ¹­Ù Ó¸ ¾
      Ö ØÓ¸ ¾¼                               Ð ÓÖ ØÑÓ× ÔÖ ¹­Ù Ó
      ÖØ ¸ ½                                    ÐØÙÖ ÒÓ Ó¸ ¿
      Ò Ö ¸ ¾¼¾                              ÐØÙÖ ÒÓ Ó¸ ¿
      ÕÙ Ð Ö Ó¸ ¿                            Ò Ð × × Ð Ð ÓÖ ØÑÓ Ò Ö Ó ÔÖ ¹
        Ò Ö Ó¸ ½                                 ­Ù Ó¸ ¾
        Ò ÐÓ ¸ ¾ ½                             Ð ÙÐÓ Ð ÓÖØ Ñ Ò ÑÓ¸ ¼½
        Ò Ö Ð¸ ½                             ÓÒ Ô             × Ò ÐÓ× ÒÓ Ó׸ ¼
      Ö Ó¸                                       Óר Ñ Ò ÑÓ¸ ¾
     Ñ ØÓ Ó¸                                 ÑÔÙ          ÔÖ ¹­Ù Ó ÓÒ ÓÐ Ð ØÓÖ ¸
     Ó ØÓ¸                                           ¾
     ÔÓÐ ÑÓÖ Ó¸ ½¿                           ÑÔÙ          ÔÖ ¹­Ù Ó ÓÒ ÓÐ       ÔÖ ÓÖ ¹
     ÔÓØ Ò ¸ ¾¼¾                                       ¸
     Ö ÙÖÖ Ò ¸ ¾                             ÑÔÙ          ÔÖ ¹­Ù Ó ÓÒ ÓÐ Á Ǹ
     Ö ÙÖ× ÓÒ¸ ¾                             ÑÔÙ          ÔÖ ¹­Ù Ó ÓÒ Ñ ÝÓÖ ×Ø Ò¹
     × ÒØ × ×¸ ½                                     ¸
     ×Ù ØÓ¸                                  ÑÔÐ ÒØ ÓÒ Ð Ð ÓÖ ØÑÓ Ò Ö Ó
 Ú ÐÙ ÓÒ ÜÔÖ × ÓÒ × Ò¬ ׸ ½½                     ÔÖ ¹­Ù Ó¸ ¼
 Ú ÐÙ ÓÒ ÜÔÖ × ÓÒ ×Ù¬ ¸ ½½                  ÒÓ Ó Ø ÚÓ¸ ¾
 Ü ×Ó ­Ù Ó¸ ¿                               ÔÖÓÚ × ÓÒ ­Ù Ó¸ ½¼
 ÜÔ Ò× ÓÒ Ø Ð × Ð Ò Ð¸ ¿                    Ö Ù ÓÒ × ÙÒ Ö ÒÓ¹ Ö ¸
 ÜØ Ò× ÓÒ × ÐÓ× Ö ÓÐ × Ò Ö Ó׸ ¿ ¿                 ¼
       Ð ÙÐÓ Ð ÔÓ× ÓÒ Ò¬ ¸ ¿           ­Ù Ó Ñ Ü ÑÓ Óר Ñ Ò ÑÓ
 ÜØ Ò× ÓÒ × ÐÓ× Ö ÓÐ × Ò Ö Ó× × Ñ ÓÐÓ×       × Ò ÓÒ¸ ¸
        × ÑÔ ÒÓ¸ ¿ ½                              Ò × ÔÖÓ Ù ÓÒ¸
 ÜØ Ò× ÓÒ × ÐÓ× Ö ÓÐ Ò Ö Ó × Ñ ÓÐÓ×          Ð ÔÖÓ Ð Ñ         × Ò ÓÒ¸ ¸
      Ò× Ö ÓÒ ÔÓÖ Ð Ú ¸ ¿                   ÔÖÓ Ð Ñ Ð ØÖ Ò×ÔÓÖØ ¸ ¿
 ÜØ Ò× ÓÒ × ÐÓ×                             ÔÖÓ Ð Ñ Ð ØÖ × ÓÖ Ó¸ ¿
     × Ð ÓÒ¸ ¿                         ­Ù Ó Ñ Ü ÑÓ» ÓÖØ Ñ Ò ÑÓ¸ ¸ ¼½
                                       ­Ù Ó Ö Ð Þ Ð ¸ ½¼
    ÓÒ ¸ ½¾                            ­Ù Ó× Óר Ñ Ò ÑÓ¸ ¾ ß
¬Ò¸ ¾¾                                       ÓÒÚ Ö× ÓÒ ÔÖÓ Ö Ñ Ð Ò Ð¸ ¾
­ Û¬Ò Ö¸ ¾½                             ÓÖÑ ×Ø Ò Ö ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð¸ ¾
  ÐÓÝ ¹Ï Ö× ÐÐ                          ÓÖÑ ÓÐ               ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð¸
       Ñ ÒÓ× Ñ Ò ÑÓ׸ ¾¼ß ¾              ÓÖØÖ Ò¸ ½
­Ù Ó                                    Ù ÒØ ¸ ¸ ¿
     Ø ÓÖ Ñ        × ÓÑÔÓ× ÓÒ¸ ½        Ù × Ñ ÑÓÖ ¸ ¾¾½
     Ú ÐÓÖ ¸                            ÙÒ ÓÒ            ÓÒ ¸ ½¾
­Ù Ó Ø Ð ¸                              ÙÒ ÓÒ ×
­Ù Ó Ñ Ü ÑÓ                                  ÓÐ ÙÖ          ×Ô Ö× ÓÒ¸
886                                                              ´
                                                                 INDICE



   Ñ ØÓ Ó   Ú × ÓÒ¸                  Ô Ü ÐÙ× ÚÓ¸ ¼¾
   Ñ ØÓ Ó ÑÙÐØ ÔÐ ÓÒ¸                Ô׸ ¿¼½
ÙÒ ÓÒ × × ¸                            ÓÒ ÖÖ ÐÓ׸ ¿¼¾
                                     Ô×ÓÖØ¸ ¿¼
   ¸ ¾¾¿                            Ö Ò ¸ ½½
  Ò Ö Ó¸ ½                            Ø ÔÓ׸ ½¾
  Ò Ö ÓÒ ÙÒ ÒÓ Ó¸ ¾                 Ö Ò ÑÙÐØ ÔÐ ¸ ½¿
  Ò Ö Ð¸ ½                          ÙÖ ×Ø
 Ö Ó                                    Ñ ÒÓ Ñ × ÓÖØÓ¸ ¾¾
        ÙÒ Ö Ó¸ ¾                  Ð Ó Ö ÓÐ × Ò Ö Ó׸ ´¾ ¸ ¾
 Ö Ó                              ÓÐ ÙÖ         ×Ô Ö× ÓÒ ÙÒ ÙÒ ÓÒ × ¸
     Ö ÓÐ Ö ÓÖ¸
      Ô ÖØ Ó¸                    ÀÓÐØÞÑ ÒÒ¸ ¾¼
       Ñ ÒÓ¸ ¾                   ÀÙ«Ñ Ò
       ÐÓ¸ ¾                           Ó Ó׸ ¿ ¿ß¿
     Ð ÕÙ ¸                            Ó ¬ ÓÒ Ø ÜØÓ¸ ¿ ½
     ÓÑÔÐ Ñ ÒØÓ ¸ ¿                      Ó ¬ ÓÒ¸ ¿
     ÓÑÔÐ Ø Ñ ÒØ ÓÒ ÜÓ¸ ¾             Ò Ö ×Ó Ö Ù Ò ×¸ ¿ ¼
     ÓÑÔÐ ØÓ¸ ¾                      ÓÔØ Ñ ÓÒ¸ ¿ ¿
     ÓÒ Ô ×Ó׸ ½
     ÓÒ ÜÓ¸ ¾                     Ò ÒØ ÓÒ
      Ö Ó¸ ¾                         Ö ÔÖ × ÒØ ÓÒ Ö ÓР׸ ¾
     Ò ÓÒ ÜÓ¸                     Ò Ù ÓÒ¸ ¾¿
    ÒÓ Ó×                        LhashTable<Key>¸ ¼
       Ø Ö ÓÖ Ö Ó׸               Ò× Ö ÓÒ Ò Ö ÓÐ Ò Ö Ó          Ù×ÕÙ ¸ ¿¿
       Ø Ö ÓÖ ÒÓ Ó׸              Ò× Ö ÓÒ Ò Ö Þ
    ×Ù Ö Ó¸                            Ò Ö ÓÐ Ò Ö Ó        Ù×ÕÙ ¸ ¿ ¿
    ØÓØ ÐÑ ÒØ ÓÒ ÜÓ¸ ¾                 Ò       ¸¿ ¿
 Ö Ó×                                  Ò Ò ÖÓ         Ù×ÕÙ     ÜØ Ò Ó¸ ¿
     ÓÐÓÖ ÓÒ¸                     Ò× Ö ÓÒ Ò Ø Ð × ÓÒ Ö ×ÓÐÙ ÓÒ
     ÓÒ Ø Ú ¸ ½                            ÓÐ × ÓÒ × ÔÓÖ Ò Ò Ñ ÒØÓ × Ô¹
     ÓÖØ ¸ ¾                               Ö Ó¸ ¼
       ¬Ò ÓÒ ÓÖÑ Ð¸ ½             Ò× Ö ÓÒ Ò Ø Ð × Ð Ò Ð¸ ¼
        Ñ ØÖÓ¸ ¿                  Ò× Ö ÓÒ ÔÓÖ Ð Ú Ò Ö ÓÐ Ò Ö Ó ÜØ Ò¹
     ÑÔ Ö Ñ ÒØÓ¸ ½½                           Ó¸ ¿
Graph Node<Node Type>¸ ½          Ò× Ö ÓÒ ÔÓÖ ÔÓ× ÓÒ          Ö ÓÐ × Ò Ö Ó×
                                           ÜØ Ò Ó׸ ¿
  Ô                               Ò× Ö ÓÒ Ò Ö Þ
      BinHeap<Key>¸
                  ¿½¾                  Ò        ¸¿
   ÔÐ ÓÒ ×¸ ¿½¼                   Ò× Ö ÓÒ
   ÓÐ × ÔÖ ÓÖ ¸ ¿¼                    Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓ¸ ½ ¸ ½
      ØÙ Ð Þ ÓÒ ÙÒ Ð Ñ ÒØÓ¸ ¿¼    Ò× Ö ÓÒ Ò Ö ÓÐ Ð ØÓÖ Þ Ó¸
   ÓÒ Ö ÓР׸ ¿½¾                 Ò× Ö ÓÒ Ò Ö ÓÐ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ¸ ´ ½ ¸
   ÓÒ Ð ×Ø × ÒÐ Þ ×¸ ¿½¾                   ¾¼
   Ð Ñ Ò ÓÒ¸ ¿¼                   Ò× Ö ÓÒ Ò ØÖ Ô¸
   Ò× Ö ÓÒ¸ ¿¼¿                   ÒØ Ö ÓÖ ¬ÐØÖÓ
  Ô Ö Ó× Ñ Ò ÑÓ׸ ¼¾                      Ö Ó× ÒÓ Ó¸ ¼
´
INDICE                                                                      887



          Ö Ó× ÙÒ Ö Ó¸ ½¼                     Ó Ð Ñ ÒØ ÒÐ Þ × Ò Ñ ×¸ ¿
 ÒØ Ö Þ Ð ÙÒ ÓÒ × ¸                         × ÑÔÐ Ñ ÒØ ÒÐ Þ ×
 ÒÚ Ö ÒØ ׸ ¾½                                 DynSlist<T>¸
ÁØ Ö ÓÖ                                         ÒÐ × ÑÔÐ ¸
          Ö Ó× ÙÒ Ö Ó                           Ø Ö ÓÖ¸ ¿
         ÑÔÐ ÒØ ÓÒ¸ ¼                          ÒÓ Ó × ÑÔÐ ¸ ½
          Ö Ó× ÙÒ ÒÓ Ó Ö Ó¸                    Slink¸ ¸ ½
         ÒÓ Ó× ÙÒ Ö Ó                          Slist<T>¸ ¾
         ÑÔÐ ÒØ ÓÒ¸                    Ð ×Ø ×       Ý Ò ¸
     Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ ¸ ¾                   Ò List Graph<Node, Arc>¸ ½
     ×Ó Ö Dlink¸                       Ð ×Ø × ÒÐ Þ ×¸
     ×Ó Ö Dnode<T>¸                         Ô Ö Ö ÔÖ × ÒØ Ö Ö ÓР׸ ¾ ¼
 Ø Ö ÓÖ                                List Graph<Node, Arc>¸
          Ö Ó× ÙÒ ÒÓ Ó Ö Ó¸                   × Ò ÓÒ¸
         ÒÓ Ó× ×Ó Ö ÙÒ Ö Ó¸                   ÓÒרÖÙ ÓÒ¸
     Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ ¸ ¿                  רÖÙ ÓÒ¸
ÁØ Ö ÓÖ Ö Ó× ×Ó Ö ÙÒ ÒÓ Ó                    ÑÔÐ ÒØ ÓÒ Ð ÓÔ             Ö Ó׸ ¼¼
      ÑÔÐ ÒØ ÓÒ¸                             ÑÔÐ ÒØ ÓÒ Ð Ð Ñ Ò ÓÒ Ö Ó׸
 Ø Ö ÓÖ ×¸ ¾ß
 Ø Ö ÓÖ × ¬ÐØÖÓ׸ ¼ ß ½¼                    ÑÔÐ ÒØ ÓÒ      Ð Ð Ñ Ò ÓÒ        ÒÓ¹
 Ø× ¸ ¾½                                        Ó׸
                                            ÑÔÐ ÒØ ÓÒ      Ð Ò× Ö ÓÒ       Ö Ó׸
Ke(G)
       Ð ÓÖ ØÑÓ¸ ¾½                               ÑÔÐ ÒØ ÓÒ Ð Ò× Ö ÓÒ ÒÓ Ó׸
        Ð ÙÐÓ¸ ¾½
      ÑÔÐ ÒØ ÓÒ Ð Ð ÓÖ ØÑÓ            Ð ÙÐÓ       ÑÔÐ ÒØ ÓÒ Ð Ð ÑÔ Þ ÙÒ Ö Ó¸
              Ke(G)¸ ¾¾
ÃÓÖ ×Ù                                            ÑÔÐ ÒØ ÓÒ Ð Ñ Ô Ó ÒÓ Ó× Ý Ö¹
       Ð ÓÖ ØÑÓ       Ð ÙÐÓ      ÓÑÔÓÒ ÒØ ×             Ó× ÙÒ Ö Ó¸
           Ù ÖØ Ñ ÒØ ÓÒ ÜÓ׸                Ð Ú ÐÓ ¸ ¾½
ÃÖÙ× Ð¸                                     ÐÓ Ð          Ö Ö Ò ¸ ¾¾ ¸ ¾¿¼
       Ò Ð × ×¸ ¼½                                ×Ô Ð¸ ¾¾ ¸ ¾¿¼
       ÓÖÖ Ø ØÙ ¸ ¼½                             Ø ÑÔÓÖ Ð¸ ¾¾ ¸ ¾¿¼
Ð ÞÓ¸ ¾                                     ÐÓÒ ØÙ
ÐÑ                                                  Ð Ñ ÒÓ Ò Ö ÓР׸ ¾
         Ð ÙÒ           ÙÒ ØÖ Ô¸            ÐÓÒ ØÙ Ð Ñ ÒÓ
Ð ÒØ¸ ¾½                                            ¬Ò ÓÒ¸ ¾
Ð ×Ø ×                                            ÜØ ÖÒÓ
       Ó Ð Ñ ÒØ ÒÐ Þ ×                               ÓÖÑÙÐ Ò ÙÒ ÓÒ Ð Ñ ÒÓ Ò¹
        Dlink¸                                        Ø ÖÒÓ¸ ¾
        Dlist<T>¸
                                                     ÒØ     ׸ ¾
        Dnode<T>¸
                                                  ÒØ ÖÒÓ
        DynDlist<T>¸ ¿
                                                   Ð Ñ Ø ×¸ ¾
         ÒÐ      Óи                        ÐÓÒ ØÙ Ð Ñ ÒÓ ÒØ ÖÒ ÔÓÒ Ö ¸ ¿
         Ø Ö ÓÖ¸ ¾                          ÄÙ × Û Þ¸ ¿¾½
        ÒÓ Ó Ó Ð ¸                          Ñ Ü ÑÓ ÑÔ Ö Ñ ÒØÓ Ô ÖØ Ó¸ ½½ß ½
888                                                            ´
                                                               INDICE



Ñ ØÓ Ó         Ú × ÓÒ ÓÑÓ ÙÒ ÓÒ × ¸             ¸¾
Ñ ØÓ Ó         ÑÙÐØ ÔÐ ÓÒ ÓÑÓ ÙÒ ÓÒ        Ò Ö ÓÒ ¸ ¾
            ׸                           Ö Ó ÙÒ ÒÓ Ó Ò Ö Óи ¾
Ñ ØÓ Ó× Ú ÖØÙ Ð¸ ½¿                 ÒÓ Ó Ò ÒØ ¸ ¾
Ñ Ò ÑÓ Óר ­Ù Ó Ñ Ü ÑÓ¸ ¾           ÒÓ Ó Ø ÚÓ¸ ¾
Ñ ÖÓ× Ô Ö Ö Ó׸                     ÒÓ Ó Ý ÒØ ¸ ¾
Ñ Ô¸ ¾½                             ÆÓ Ó ÙÒ Ö Ó¸ ½
Ñ Ô Ó¸ ¾½                           ÒÓ Ó ÜØ ÖÒÓ
     Ö Ó׸                                 ÒØ      Ò ÙÒ Ö Óи ¾
    ÒÓ Ó׸                                 ¬Ò ÓÒ¸ ¾
Ñ Ô Ó ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ׸            ÒÓ Ó × ÑÔÐ ¸ ½
Ñ ÔÔ Ò ¸ ¾½                         ÒÓØ ÓÒ
Ñ Ø Ò ¸ ½½                                     Û Ý¸ ¾
Ñ Ø Ñ Ø × ×Ó Ö Ö ÓР׸ ´¾ ¸ ¿¿¼     ÒÓØ ÓÒ O¸ ½ ß½ ¼
Ñ ØÖ ׸ ½                           O
Ñ ØÖ Þ                                     ¬Ò ÓÒ¸ ½
       Ð ÙÐÓ       Ö ÓÒ¸ ½          o¸ ½ ¼
     Ò ÓÖØÖ Ò¸ ½                    Ω¸ ½ ¼
Å ØÖ Þ        Ý Ò ¸                 ω¸ ½ ½
Ñ ØÖ Þ        Ý Ò ¸                 Θ¸ ½ ½
Ñ ÑÓÖÝ Ð ×¸ ¾¾½                     ÒÓØ ÓÒ Ò¬ ¸ ½½
Ñ Ö ×ÓÖØ                            ÒÓØ ÓÒ ÔÖ ¬ ¸ ½½
     Ò Ð × ×¸ ½                     ÒÓØ ÓÒ ×Ù¬ ¸ ½½
     ÖØ ¸ ½                         ÒÙÑ ÖÓ ¸ ¾
Ñ Ø ¹ ÓÑÔ Ð ÓÒ¸ ¾½
                                    O¸ ½ ß½ ¼
ÑÞÐ
    Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓ¸ ½ ¾ß½              Ð Ö O¸ ½ ¾
ÑÞÐ          ÖÖ ÐÓ׸ ½ ¾                 Ò Ð × × Ð ÓÖ ØÑÓ× Ñ ÒØ O¸ ½ ¾ß
ÑÓ ¬ ÓÖ¸                                     ½
ÑÙÐØ ÓÒ ÙÒØÓ¸ ¾½                         ÖÖÓÖ ×¸ ½
                                    o¸ ½ ¼
ÑÙÐØ Ö Ó¸
ÑÙÐØ Ö Ò ¸ ½¿                       Ó × ÖÚ ÓÖ¸
ÑÙÐØ Ð ×Ø ׸ ½ ½                    Ó ÙÐØ Ñ ÒØÓ Ò ÓÖÑ ÓÒ¸ ¾
                                    Ω¸ ½ ¼
ÑÙÐØ Ñ Ô¸ ¾½
                                    ω¸ ½ ½
ÑÙÐØ ÔÓÔ¸ ½½½
ÑÙÐØ × Ø¸ ¾½                        ÓÔ Ö ÓÖ
                                           ÐØ¸¿
ÒÙÑ ÖÓ          Ø Ð Ò¸ ¿¾ ß¿¿¼          Ò Û¸ ¿½¸ ¿
ÆÙÑ ÖÓ          ÛÝ                  ÓÖ Ò
       Ð ÙÐÓ¸ ¾ ¼                           ÙÒ Ö Óи ¾
ÒÙÑ ÖÓ×           ÓÒ ¸ ½¾           ÓÖ Ò Ñ ÒØÓ
Ò Ò ¸ ¾½ ß¾¾¼                            ר Ð ¸ ½
Net Graph<TNode,TArc,T>¸                 Ò× Ö ÓÒ¸ ½ ¸ ½
Ò Û¸ ¿½¸ ¿                              Ñ Þ Ð ¸ ½ ¾ß½
Ò Ú Ð ÙÒ ÒÓ Ó Ò ÙÒ Ö Óи ¾              × Ð ÓÒ¸ ½ ¾ß½
Node Arc Iterator¸                  ÓÖ Ò Ñ ÒØÓ Ö Ó× ×Ó Ö ÙÒ Ö Ó¸ ¼½
ÒÓ Ó                                ÇÖ Ò Ñ ÒØÓ Ð ×Ø × ÒÐ Þ ×¸ ½
´
INDICE                                                                               889



ÓÖ Ò Ñ ÒØÓ ØÓÔÓÐÓ Ó¸ ¼ß                      ÔÖÓ ÐÑ           רÖÙ ØÓÖ × Ú ÖØÙ Ð ×¸
ÓÖ ÒØ ÓÒ                                     ÔÖÓ Ð Ñ Ð ØÖ Ò×ÔÓÖØ ¸ ¿
             Ð ÓÒ ÔØÓ¸ ¾¾                    ÔÖÓ Ð Ñ Ð ØÖ × ÓÖ Ó¸ ¿
             Ð ­Ù Ó¸ ¾¾                      ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð               רÖÙ ØÙÖ ×
            ÐÓ× ØÓ׸ ¾½                                 ØÓ׸ ½
                                             ÔÖÓ¬Ð Ò ¸ ¾¾
ÔÖ Ó                                         ÔÖÓ Ö Ñ ÓÒ Ð Ò Ð¸ ¼ß ¾
      ÙÑÔÐ ÒÓ׸ ¼½                                ÓÒÚ Ö× ÓÒ × ÙÒ Ö                Ô Ø ¸
È Ö ØÓ Î Ð Ö Ó¸ ¾¾                                      ¾
Ô ÖØ ÓÒ Ö ÓÐ × Ò Ö Ó׸ ¿¿                         ÓÖÑ ×Ø Ò Ö¸ ¾
Ô ÖØ ÓÒ             ¸ ¿¿                          ÓÖÑ ÓÐ ¸
Ô ÖØ ÓÒ               ¸¿                          ÓÖÑ ×Ð ¸
Ô ÖØ ÓÒ Ð ÕÙ ×ÓÖØ¸ ½                             × ÑÔРܸ
Ô ÖØ ÓÒ ÔÓÖ Ð Ú          Ö ÓÐ × Ò Ö Ó× Ü¹    ÔÖÓÔ       × ÑØÑØ ×               ÐÓ× Ö ÓР׸
         Ø Ò Ó׸ ¿                                   ´¾ ¸ ¿¿¼
Ô ÖØ ÓÒ ÔÓÖ ÔÓ× ÓÒ          Ö ÓÐ × Ò Ö Ó׸   ÔÖÓÜݸ
         ¿                                   ÔÖÙ            Ð       ¸ ½
Ô ×Ó          Ù ÓÒ¸ ½ ½                      ÔÖÙ         ÓÒ Ø Ú ¸ ½ ¸
Ô Ö¬Ð ¸ ¾¾                                   ÔÖÙ         Ü ×Ø Ò          Ñ ÒÓ¸ ¾½¸ ½
ÔÐ                                           ÔÙÒØ ÖÓ× Ý ÖÖ ÐÓ¸ ¿½
    Ö ÔÖ × ÒØ ÓÒ × Ò Ñ ÑÓÖ ¸ ½¼              ÔÙÒØÓ ÖØ ÙÐ ÓÒ¸ ¿
ÔÐ ×                                         ÔÙÒØÓ ÓÖØ ¸ ¿
      ÓÒ ÖÖ ÐÓ׸ ½¼                              Ô ÒØ Ó ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ׸ ¾
      ÓÒ Ð ×Ø × ÒÐ Þ ×¸ ½½¾                  ÔÙÒØÓ× ÓÖØ
      ÓÒ Ð ×Ø × ÒÐ Þ × Ò Ñ ×¸ ½½                  ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ׸ ¼
    ÐÐ Ñ × ÔÖÓ Ñ ÒØÓ׸ ½¾¾                       Ñ Ô Ó ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ׸
    Ö ÙÖ× ÓÒ¸ ½¾¾
Ô ÒØ Ó ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ׸ ¾                  ÕÙ ×ÓÖØ¸ ½ ß¾¼¼
Ô ÚÓØ                                            Ò Ð × ×¸ ½
    × Ð ÓÒ Ò Ð ÕÙ ×ÓÖØ¸ ½ ¾                      Ð Ú × Ö Ô Ø ×¸ ½
ÔÐ ÒØ ÐР׸ ½                                    ÓÒ Ð ×Ø × ÒÐ Þ ×¸ ½
ÔÐ Ó Ð Ú Ò ÙÒ ÓÒ × ¸                             ÖØ ¸ ½
ÔÓÐ ÑÓÖ¬×ÑÓ¸ ½¿                                 × Ð ÓÒ Ð Ô ÚÓØ ¸ ½ ¾
           ÖÒ ¸½                                × Ò Ö ÙÖ× ÓÒ¸ ½ ¿
        ×Ó Ö Ö ¸ ½                              ØÖ ÔÐ Ô ÖØ ÓÒ        ×ØÖ ¸ ½
ÔÓÐ ÒÓÑ Ó×                                   ÕÙ ×ÓÖØ ÓÒ ÙÖÖ ÒØ ¸ ½
     ÑÔÐ ÒØ ÓÒ ÓÒ Ð ×Ø × ÒÐ Þ ×¸ ½¼¼         ÕÙ ×ÓÖØ Ô Ö Ð ÐÓ¸ ½
    ×ÙÑ ¸ ½¼¿
ÈÖ ÙÒØ × Î Ò Ð ¸ ¾½¿                         Ê Ò¹Ã ÖÔ
ÈÖ Ñ¸ ¼¾                                          Ù×ÕÙ      ×Ù ¹ Ò ×¸ ¿
      Ò Ð × ×¸ ¼                             ÖÔ Ó
      ÓÖÖ Ø ØÙ ¸ ¼                              Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓ¸ ¾¼¼
ÔÖ Ò Ô Ó                                     realloc¸ ½
        È Ö ØÓ¸ ¾¾                           Ö ÓÖÖ Ó
       Ð ¼¹¾¼¸ ¾¾                                Ò¬ Ó
ÔÖ Ò Ô Ó ¬Ò¹ ¹¬Ò¸ ¾¾                               ×Ó Ö Ö ÓÐ Ò Ö Ó¸ ¾
ÔÖ ÓÖ       × ÑÔÐ Ø × Ò ØÖ Ô׸                  ÔÓÖ Ò Ú Ð ×
890                                                                    ´
                                                                       INDICE



         ×Ó Ö Ö ÓÐ Ò Ö Ó¸ ¾ ¸ ¾ ¼               Ð ÓÖ ØÑÓ      ÓÖ ¹ ÙÐ Ö×ÓÒ¸ ¿
     ÔÖ ¬ Ó                                     Ð ÓÖ ØÑÓ       ÑÓÒ ×¹Ã ÖÔ¸
         ×Ó Ö Ö ÓÖ × Ò ¸ ¾ ¼                      Ñ ÒÓ× ÙÑ ÒØÓ¸
         ×Ó Ö Ö ÓÐ Ò Ö Ó¸ ¾                     ÓÒ Ô          × Ò ÐÓ× ÒÓ Ó׸ ¼
     ×Ù¬ Ó                                      ÓÒ Ö Ó× ÒÓ¹ Ö Ó׸ ¼
         ×Ó Ö Ö ÓÐ Ò Ö Ó¸ ¾                     ÓÖØ Ñ Ò ÑÓ¸
         ×Ó Ö Ö ÓÖ × Ò ¸ ¾ ¼                    ÓÖØ ׸ ¾
Ö   ÓÖÖ Ó Ò ÑÔÐ ØÙ ¸ ½                            ¬Ò ÓÒ ×¸ ¿
Ö   ÓÖÖ Ó Ò ÔÖÓ ÙÒ           ¸ ½¼              ­Ù Ó Ñ Ü ÑÓ¸
Ö   ÓÖÖ Ó ÒÓÖ Ò¸ × Ö ÓÖÖ Ó Ò¬ Ó                 Ò Ö Ñ ÒØÓ ­Ù Ó ÔÓÖ Ñ ÒÓ          Ù¹
Ö   ÓÖÖ Ó ÔÓרÓÖ Ò¸ × Ö ÓÖÖ Ó ×Ù¬ Ó                 Ñ ÒØÓ¸ ¾
Ö   ÓÖÖ Ó ÔÖ ÓÖ Ò¸ × Ö ÓÖÖ Ó ÔÖ ¬ Ó            Ñ Ò Ó Ú Ö Ó× Ù ÒØ × Ó ×ÙÑ ÖÓ׸
Ö   ÓÖÖ Ó×
     ×Ó Ö Ö ÓÖ × Ò ×¸ ¾ ¼¸ ¾                   ÓÔ Ö ÓÒ × ØÓÔÓÐÓ ×¸
Ö   ÓÖÖ Ó× Ô× Ù Ó¹ Ð Ó× ×Ó Ö Ö ÓÐ × ¹          Ö Ö × Ù Ð¸
           Ò Ö Ó׸ ¾                       Ö × Ô Ø × ÓÒ ÔÖÓÚ × ÓÒ ­Ù Ó¸ ½¼
Ö   ÓÖÖ Ó× ×Ó Ö Ö ÓÐ × Ò Ö Ó׸ ¾ ¿         Ö × Ô Ø × Ò Ö Ð Þ ×¸ ¿
Ö   ÓÖÖ Ó× ×Ó Ö Ö Ó׸ ¼ ß                  Ê × ÓÒ Ö ×ØÖ ÓÒ × Ð Ø Ö Ð ×¸
Ö   ÙÖ× ÓÒ                                 Ö × ­Ù Ó¸ ¿ß ¼
       ÓÒ× Ó׸ ½¾                                Ö ÙÐ ÓÒ ×¸ ½
       Ð Ñ Ò ÓÒ¸ ½¾                        Ö × ÔÖÓ × Ñ ÒØÓ¸
          ÑÙÐ ÓÒ         ÐÓ× Ö ×ØÖÓ×   Ø ¹ Ê × ÑÙÐØ ¹­Ù Ó¸
           Ú ÓÒ¸ ½¾                        Ö Ù ÓÒ × Ð ­Ù Ó Ñ Ò ÑÓ¸ ¼ ß ¾
       Ð Ñ Ò ÓÒ ØÓØ Ð¸ ½¿¼                 Ö ×ØÖÓ        Ø Ú ÓÒ¸ ½¾
     Ô Ð ×¸ ½¾¾                            Ö Ð
Ö   ÙÖ× ÓÒ ÓÐ                                      È Ö ØÓ¸ ¾¾
       Ð Ñ Ò ÓÒ¸ ½¾                               Ð ¼¹¾¼¸ ¾¾
Ö   ¸ ¿                                    Ö Ð ÓÒ
       ÓÖØ ¸ ¾                                 × Ñ ØÖ ¸ ½
     Ö × Ù Ð¸                              Ö Ð ÓÒ Ö Ó¸ ¿¼
Ö    Ö× ÙÐ                                 Ö ÑÓÚ ÐÐ Ò Ð Ø ´µ¸
       ÒÖ       Ô Ø        ÓÒ Óר ׸ ¾     Ö ÔÖ × ÒØ ÓÒ Ö ÓÐ ×
Ö       Ô Ø                                     ÓÒ ÙÒØÓ× Ò Ó׸ ¾
         Ð ÙÐÓ       Ñ ÒÓ ÙÑ ÒØÓ¸ ½             Ò ÒØ ÓÒ¸ ¾
Ö       Ô Ø         ÓÒ Óר ׸ ¾                × Ù Ò Ô Ö ÒØ Þ ¸ ¾
Ö     ÓÒ Ô            × Ò ÐÓ× ÒÓ Ó׸ ¼     Ö ÔÖ × ÒØ ÓÒ Ö ÓÐ × ÓÒ ÖÖ ÐÓ׸ ¾ ½
Ö    Ö × Ù Ð¸                              Ö ÔÖ × ÒØ ÓÒ         Ö ÓÐ × ÓÒ Ð ×Ø × Ò¹
Ö    ×                                              Ð Þ ×¸ ¾ ¼
         Ñ ÒÓ ÙÑ ÒØÓ                       Ê ÔÖ × ÒØ ÓÒ ÙÒ Ö ÓÐ Ö ÓÖ Ò ÙÒ
          Ò Ö Ñ ÒØÓ ­Ù Ó¸ ¾                          ÖÖ ÐÓ¸ ¿½
         Ô       ¸ ¿                       Ö ÔÖ × ÒØ ÓÒ × Ò Ñ ÑÓÖ           ÙÒ ÓÐ ¸
      Ù ÒØ ¸ ¿                                      ½¿¿
     ÔÖ ¹­Ù Ó¸ ¾                           ÖÓØ ÓÒ Ò Ö ÓÐ Ò Ö Ó׸ ¿ ½
     ×ÙÑ ÖÓ¸ ¿                             ÖÓØ ÓÒ Ò Ö ÓÐ × Ò Ö Ó× ÜØ Ò Ó׸ ¿ ¿
     Ú ÐÓÖ ­Ù Ó¸ ¿
Ö    × Ô Ø ×                               × Ù Ò Ô Ö ÒØ Þ Ô Ö Ö ÔÖ × ÒØ Ö Ö ÓР׸
                                                    ¾
´
INDICE                                                                     891



Ë Û ¸ ¼¿                                           Ò Ð × ×¸ ¾¼
× Ð ÓÒ                                         Ö ¹ Ñ Ò× ÓÒ Ñ ÒØÓ¸ ¿¼
     Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓ¸ ½ ¾ß½                  Ö Ùר          Ñ Ò× ÓÒ¸ ¿¼
     ÔÓÖ ÔÓ× ÓÒ Ò Ö ÓÐ Ò Ö Ó¸ ¿                ×ÙÔ ÖØÖ Þ ¸
× Ð ÓÒ                                      Ø Ð × × Ð Ò Ð ×¸ ¿¿ß
     ÔÓÖ ÔÓ× ÓÒ Ò ÖÖ ÐÓ¸ ½                       Ù×ÕÙ ¸ ¿
     ×Ó Ö ÖÖ ÐÓ׸ ½                             Ð Ñ Ò ÓÒ¸ ¼
× Ø¸ ¾½                                         ÜÔ Ò× ÓÒ¸ ¿ ¸ ¿
× Ø ÓÛÒ¸ ¿¼                                     Ò× Ö ÓÒ¸ ¼
× Ø ÙÔ¸ ¿¼¿                                 Ø Ð × × Ô Ö Ø ×¸ ¾
×ÑÐ Ö              Ö ÓÐ × Ò Ö Ó׸ ¾         Ì
× ÑÔРܸ ß ¾                                   Ady Mat<GT, Entry>¸        ß
× ÑÔÐ Ü Ö × ­Ù Ó´¸                             Bit Mat Graph<GT>¸       ß ½
× ÑÔÐ Ü Ö × ­Ù Óµ¸                             DynMapTree<Tree, Key, Range, Compare>¸
Ë Ò ¸ ËØ Ú Ò¸ ¾¾¿                                   ¿ ß¿ ¿
×Ð                                             List Graph<Node, Arc>¸
       Ò Ñ ÒÓ ÙÑ ÒØÓ¸                          Map Matrix Graph<GT>¸
     ÔÖÓ Ö Ñ Ð Ò Ð¸                            Matrix Graph<GT>¸ ¿ß
Slink¸                                         ArrayStack<T>¸ ½¼ ß½½¾
×ÓÒ Ó                                          ArrayQueue<T>¸ ½¿ ß½¿
     Ð Ò Ð¸ ½                                  Avl Tree<Key>¸       ß¼
×ÓÒ Ó Ð                                        BinNode<Key>¸ ´¾ ¸ ¾ ¾
       Ò Ð × ×¸ ½                              BinNodeXt<Key>¸ ´¿ ¿¸ ¿ ¿
×Ù Ö Ó ÙÒ Ö Ó¸                                 BinTree<Key>¸ ´¿¿ ¸ ¿
×ÙÑ ÔÓÐ ÒÓÑ Ó׸ ½¼¿                            Dlink¸ ß
×ÙÑ ÖÓ¸ ¸ ¿                                    Dlist<T>¸ ß ¿
×ÙÔ ÖØÖ Þ ¸ ¾½ ¸                               Dnode<T>¸ ß
×ÙÔÖ × ÓÒ Ò Ö ÓÐ Ò Ö Ó              Ù×ÕÙ ¸     DynArray<T>¸ ½ß ½
          ´¿ ¾¸ ¿ ¿                            DynDlist<T>¸ ¿ß
×ÙÔÖ × ÓÒ Ò Ö ÓÐ Ð ØÓÖ Þ Ó¸ ¼                  DynListQueue<T>¸ ½ ¼ß½ ½
×ÙÔÖ × ÓÒ Ò ØÖ Ô¸ ¼                            DynListStack<T>¸ ½½ ß½½
                                               DynSlist<T>¸ ß
Ø Ð ×                                          ListQueue<T>¸ ½¿ ß½ ¼
       ÓÐ ÙÖ        ×Ô Ö× ÓÒ¸                  ListStack<T>¸ ½½¾ß½½
      ÒØ Ö Þ Ð ÙÒ ÓÒ × ¸                       Rand Tree<Key>¸        ß ¾
     ÔÐ Ó Ð Ú Ò ÙÒ ÓÒ × ¸                      Rb Tree<Key>¸ ½ ß ¾
Ø Ð× ×                                         Slink¸ ß ½
        ×Ô Ö× ÓÒ         Ò×      Ö Ø Ö ×¸ ½    Slist<T>¸ ¾ß
        ×Ô Ö× ÓÒ ÙÒ Ú Ö× Ð¸ ½                  Snode<T>¸ ½ß ¾
      ÙÒ ÓÒ ×¸                                 Splay Tree<Key>¸ ¿¾ß ¿
      ÙÒ ÓÒ × × ¸                              Treap<Key>¸       ß ¾
     Ñ Ò Ó ÓÐ × ÓÒ ×¸ ¼½                       Tree Node<T>¸ ´¾ ¿¸ ¾
          Ö ÓÒ Ñ ÒØÓ ÖØÓ¸ ½                 ÌÖ Ò
         Ò Ò Ñ ÒØÓ¸ ¼¿                          Ð ÓÖ ØÑÓ Ô Ö Ð ÙÐÓ        ÓÑÔÓÒ ÒØ ×
         Ò Ò Ñ ÒØÓ × Ô Ö Ó¸ ¼¿                       Ù ÖØ Ñ ÒØ ÓÒ ÜÓ׸
     Ñ Ò Ó ÓÐ × ÓÒ × ÔÓÖ Ö ÓÒ Ñ ÒØÓ Ø ÑÔÐ Ø ×¸ ½
               ÖØÓ Ý ×ÓÒ Ó Ð Ò Ð
892                                       ´
                                          INDICE



Ø ÓÖ Ñ
       × ÓÑÔÓ× ÓÒ ­Ù Ó¸ ½
Ø ÓÖ Ñ Ð ­Ù Ó Ñ Ü ÑÓ» ÓÖØ Ñ Ò ÑÓ¸
Ø ×Ø         Ð    ¸ ½
Θ¸ ½ ½
ØÖ× Ò¸
Ø ÔÓ× ×ØÖÙ ØÙÖ         ØÓ׸ ¾½
Ø ÔÓ× ÖÖÓÖ ×¸ ¾¼
ÌÓÑ Î Ò Ð ¸ ¾½¿
ÌÖ Ô
        ¬Ò ÓÒ¸
ØÖ Ô׸ ß
      Ò Ð × ×¸ ¾ß ¿
      Ð Ñ Ò ÓÒ¸ ¼
     Ò× Ö ÓÒ¸
     ÔÖ ÓÖ     × ÑÔÐ Ø ×¸
Tree Node<T>
       Ù×ÕÙ ÔÓÖ ÒÙÑ ÖÓ       Û Ý¸ ¾ ¼
       ÓÒÚ Ö× ÓÒ BinNode<Key>¸ ¾ ¾
        רÖÙ ÓÒ¸ ¾
      ÑÓ ¬ ÓÖ ×¸ ¾
      Ó × ÖÚ ÓÖ ×¸ ¾
      Ó × ÖÚ ÓÖ × Ö ÓÖ × Ò ×¸ ¾
      Ö ÓÖÖ Ó׸ ¾
ÍÅĸ ½¼
ÙÒ ÓÒ Ö ÓÐ × Ò Ö Ó׸ ¿
ÙÒ ÓÒ         ¸¿
ÙÒ ÓÒ Ü ÐÙ× Ú      Ö ÓÐ × Ò Ö Ó׸ ¿ ½
ÙÒ ÓÒ Ü ÐÙ× Ú      Ö ÓÐ × Ò Ö Ó× ÜØ Ò ¹
        Ó׸ ¿
ÙÒ ÓÒ Ü ÐÙ× Ú          ¸¿ ½
ÙÒ            Ù ÓÒ¸ ½ ½
ÙÒ ÓÒ Ü ÐÙ× Ú     Ö ÓÐ × Ò Ö Ó× Ð ØÓÖ ¹
       Þ Ó׸ ¼
Ú ÐÓÖ  ­Ù Ó¸     ¸ ¿
virtual¸ ½¿

Ï Ö× Ðи ¾¿
     Ð ÓÖ ØÑÓ Ô Ö Ð Ð Ù×ÙÖ ØÖ Ò× Ø Ú ¸
           ½
Ï ÖØ
     ÕÙ Ð Ö Ó Ô Ö ØÓ¸
´
Indice de identificadores

Activation Record ½¾ ¸ ½¾
Ady Mat      ¸    ¸     ¸  ¸ ¾½      ¸ ¾½ ¸ ¾¾ ¸ ¾¿
allocate block      ¸ ¸ ¸
allocate bucket   ¾ ¸ ¾
allocate dir     ¸ ¸ ¾¸ ¾
allocate segment     ¸ ¾¸ ¸          ¸
apply ½½ ¸ ½¾½ ¸ ½¾½ ¸ ½¾½
ARC DIST ½ ¸ ½
ArcHeap   ¼¿ ¸ ¼ ¸ ¼ ¸ ½¾ ¸ ½
Arc Iterator      ¸ ¾¸ ¿¸              ¸     ¸ ¼¸ ¸           ¸ ¼¼ ¸ ½¼ ¸       ¸   ¸
      ¸     ¸ ¿½¸ ¿ ¸ ½ ¸ ½ ¸ ¼¿ ¸ ½ ¸ ¾¾¸ ¾ ¸ ¿¾
Arc Node      ¾¸ ¾¸ ¿¸ ¿¸                ¸ ¸ ¸
arcs    ¿¾¸      ¸       ¸ ¸ ¾ ¸ ¾ ¸ ¿¼ ¸ ¿¿ ¸ ¿ ¸ ¿ ¸ ¿ ¸ ¼
ArrayQueue ½¿ ¸ ½¿ ¸ ¾ ¼
ArrayStack ½¼ ¸ ½½¼ ¸ ½½ ¸ ½½ ¸ ½¾ ¸ ¾ ¸ ¾            ¸ ¾ ¸ ¾ ¸ ¿¾
AvlNode        ¸
avl stack          ¸      ¸ ¸ ¼¼ ¸ ¼½ ¸ ¼¾¸ ¼¿¸ ¼
avl stack empty            ¸ ¼¼ ¸ ¼½
Bellman Ford Node Info         ¾ ¸ ¾
binary search ¿¾¸ ¿¿¸ ¿ ¸ ¼
BinNode ¾ ¼ ¸ ¿¿ ¸ ¿ ¸ ¿          ¸ ¿ ¸ ¿ ¸ ¿ ¸ ¿ ¸ ¿ ¸ ¿ ½ ¸ ¿¾
BinNodeVtl ¾ ¼ ¸ ¿¿ ¸ ¿¾
BitArray ¿ ¸ ¿ ¸ ¿ ¸ ¿ ¸ ¿ ¸ ¿            ¸ ¿ ¸ ¿ ¼ ¸ ¿ ½ ¸ ¿ ¾¸
Bit Fields       ¼¸ ¾ ¸ ¾ ¸ ¾ ¸ ¾
Bit Mat Graph           ¸ ¼ ¸ ¾¸ ¿
BitProxy ¿ ¸ ¿ ¸ ¿ ¸ ¼
Cache Entry           ¸      ¸ ¾¸ ¾¸ ¾¸ ¿¸ ¿¸ ¿¸                  ¸    ¸    ¸       ¸
      ¸     ¸
cache size       ¼¸ ¾¸
call hash fct        ¿ ¸ ¿ ¸ ¼
chunk list       ¾¸ ¾¸
clean avl stack            ¸    ¸ ¼¼ ¸ ¼½ ¸ ¼½ ¸ ¼¾¸ ¼
Compare Arc Data        ½
Compare Dnode ½          ¸½ ¸½
Complejo
computeHeightRec ¾       ¸¿ ¼
compute optimal costs     ¿ ¸¿ ¼

                                           ¿
894                                                 ıtulo . ´
                                                 Cap´       Indice de identificadores



compute tree ¿ ¸ ¿ ½
contract    ¿ ¸ ¼
copy list graph    ¾¸ ¾¸ ¿¸ ¼¸               ¼
copyRec ¾     ¸¿ ½
COST ¿ ¸ ¿ ¼ ¸ ¿ ¼ ¸ ¿ ¼ ¸ ¿ ½
Cross Arc     ¾¸ ¾¸ ¿
deallocate bucket    ¾ ¸ ¾
DECLARE BINNODE ¾ ¸ ¾ ¼ ¸ ¿½ ¸
DECLARE BINNODE SENTINEL ¾ ¸ ¿ ¿¸        ¸        ¸ ½
decrease probe counter     ¾ ¸ ¾
destroyRec ¾ ¸ ¿ ½ ¸ ¿ ¾
Dijkstra Arc Info    ½ ¸ ½ ¸ ½
Dijkstra Heap Info     ½¾ ¸ ½
Dijkstra Node Info     ½¾ ¸ ½¿ ¸ ½¿ ¸ ½¿
Distance Compare        ¸     ¸ ¼¿ ¸ ¼¿ ¸    ¼
DLBucket    ¿¾ ¸ ¿¿ ¸ ¿¿ ¸ ¿¿ ¸ ¿¿
dlink lru       ¸    ¸
DLINK TO TYPE ¿
Dnode      ¸ ¸ ¸ ¼¸ ¾¸ ¿¸ ¿¸ ¸               ¸ ¸ ¸ ¸ ¸                ¸     ¸   ¸   ¸
      ¸  ¸½ ¸½ ¸½ ¸½ ¸½ ¸½ ¸ ¼ ¸ ¼ ¸ ¾
do mru     ¿¸ ¿¸
doubleRotateLeft         ¼¼
doubleRotateRight         ¼¼
DynArray      ¾¸ ¸ ½ ¸ ½ ¸ ¾ ¸ ¸ ¸ ¸ ½ ¸ ¾ ¾¸ ¿¿¾ ¸ ¿                ¸¿    ¼ ¸¿½¸
  ¿ ½ ¸ ¿¾¸       ¸      ¸ ¼¸ ½¸ ½¸        ¸   ¸   ¸ ¼¸ ¾           ¸ ¿    ¸ ¾¸
DynDlist      ¿¸ ¿¸ ¸ ¸ ¸ ¸ ¸ ¸ ¸ ¸ ¸ ¸                                ¸      ¸ ½¼¾ ¸
  ½¼ ¸ ½¼ ¸ ½¼ ¸ ½ ¸ ¾¾¼¸ ¾ ¿ ¸ ¾ ¸ ¼¿ ¸ ¼ ¸ ¼ ¸ ¿ ¸ ¿ ¸             ¸       ¸ ¸ ¸
      ¸     ¸       ¸ ¾ ¸ ¿ ¸ ¿ ¸ ¸ ½ ¸ ½ ¸ ¾¸ ¿¸ ½¸                   ¸    ¼¿ ¸ ½ ¸
   ½ ¸ ½ ¸ ¾¿ ¸ ¾¿ ¸ ¾
DynListQueue ½ ¼ ¸ ½ ¸ ¾ ¸ ¾ ¸ ¿¼ ¸ ¾¸ ¿¸ ¿¾¸ ¿¿ ¸        ¸
DynListStack ½½ ¸ ½½ ¸ ¾¼½¸           ¸ ¿¸   ¸   ¸ ¸
DynSlist        ¸
expand    ¿ ¸ ¼¸
Figure     ¸ ¸ ¸ ½¾¸ ½
fill dir to null          ¸
fill seg to null          ¸
Filter Iterator       ¼ ¸ ¼ ¸ ¼ ¸ ½¼ ¸ ½¼
find min path       ¾¾ ¸ ¾¾ ¸ ¾
find succ and swap        ¾¼
fix black condition         ¾¼¸ ¾¾
FixedStack ½¼ ¸ ½ ¿ ¸          ¸ ½
fix red condition        ½ ¸ ½
floyd all shortest paths         ¾½ ¸ ¾½
GenDlist     ½¸ ½¸ ¾
GenLhashTable        ¼ ¸ ¼
Gen Rand Tree          ¸
895



Gen Treap        ¸
get lru entry       ¿¸
get min arc    ¼ ¸ ¼¸ ½
Graph Arc        ¸
Hash Cache         ¸ ¾¸
inconnected components        ¿¸ ¿
index in block        ¸ ¿¸ ¿¸ ¸
index in dir        ¸ ¿¸ ¿¸ ¿¸ ¸         ¸      ¸
index in seg        ¸ ¿¸ ¿¸ ¿¸ ¸         ¸      ¸
Initialize Dist Floyd        ¾¾ ¸ ¾¿
Init Prim Info      ¼ ¸ ¼
insert entry to lru list         ¾¸ ¾¸      ¸
insert in binary search tree ¿¿ ¸ ¿¿      ¸¿
insert root ¿ ¸ ¿
insert root xt ¿ ¸
insert sorted ½ ¸ ½
inside list      ¼¸      ¸
join exclusive ¿ ½ ¸ ¿ ¿ ¸ ¿
join exclusive xt ¿        ¸¿ ¼ ¸¿ ¼
LhashBucket     ¼ ¸ ¼ ¸ ¿
LhashTable    ¼ ¸ ¿¾ ¸ ¿¾ ¸ ¿¿ ¸ ¿¿      ¸ ¿¿ ¸     ¸
LhashTableVtl       ¼
LINKNAME TO TYPE ¿¸ ¾ ¸
List Digraph       ½¸      ¸
List Graph     ¼¸ ¼¸ ½¸              ¸    ¸         ¸      ¸    ¸    ¸    ¸    ¸ ¼¸
    ¼¸ ½¸ ½¸           ¸   ¸ ¸ ¸ ¸                     ¸ ¼½
ListQueue ½¿ ¸ ½¿ ¸ ½¿ ¸ ½ ¼
ListStack ½½¾ ¸ ½½¿ ¸ ½½ ¸ ½½ ¸ ½½ ¸ ½½
lru list       ¸ ¾¸ ¿¸ ¿¸ ¿¸
Matrix Graph     ¿¸
merge ½ ¾¸ ½ ¿
mergesort ½ ¾¸ ½     ¸ ¼½
min index ¿ ¼ ¸ ¿ ½
Node Arc Iterator        ¸   ¸     ¸          ¸       ¸ ¼ ¸ ½¾ ¸ ½ ¸ ½ ¸ ½ ¸ ½ ¸ ¾¾ ¸
   ¾¾ ¸ ¾ ¸ ¾ ¸ ¾ ¸ ¾ ¸ ¿¼ ¸ ¿ ¸ ¿ ¸                  ¸ ¸ ¿¸ ¿¸ ¿¸ ¸ ¾¸
      ¸      ¸ ¾¸ ¾¸        ¸ ¸ ½ ¸ ¾¸ ¿¸ ¼ ¸ ¼ ¸ ½ ¸ ½ ¸ ¿¿ ¸ ¼¸
    ½¸      ¸ ¸      ¸ ½ ¸ ½ ¸ ¾¿
Node Iterator       ¸ ¾¸ ¿¸           ¸         ¸ ¼¸         ¸ ¼¼ ¸ ½¼ ¸ ¾¼ ¸ ¿ ¸   ¸
    ¾¸ ¾¸        ¸     ¸   ¸ ¾¸ ¿¸                 ¸ ¸ ½ ¸ ¾¸ ¿¸ ¾ ¸ ½ ¸ ¼¾ ¸
   ½ ¸ ¾¾¸ ¾¿ ¸ ¾¿ ¸ ¾
Null Value       ¸     ¸   ¸ ¸          ¸        ¸       ¸
ODhashTable     ¾¸ ¾
operate all arcs list graph      ¸          ¸
operate all arcs matrix        ¸     ¸ ¾¿
partition ½ ¸ ½ ¸ ½ ¼¸ ½ ¿ ¸ ½ ¸ ½ ¸ ½
Path    ¼¾ ¸ ¼¿ ¸ ¼¿ ¸ ¼ ¸ ¼ ¸ ¾¿ ¸ ¾¿ ¸ ¾ ¸ ¾ ¸ ¾ ¸ ¾ ¸ ¾ ¸ ¾ ¸ ¾ ¸
896                                              ıtulo . ´
                                              Cap´       Indice de identificadores



      ¸ ½ ¸ ½ ¸ ½ ¸ ¾¾ ¸ ¾¾ ¸ ¾ ¸ ¿ ¸ ¼¸ ½¸ ¾ ¸ ¿¸ ¼ ¸ ¼ ¸ ¼ ¸ ¿¿¸
  ¿
Path Desc    ¼¿ ¸ ¼¿ ¸ ¼¿ ¸ ¼ ¸ ¼ ¸ ¼
POT ½ ¸ ½ ¸ ½ ¸ ½
precedence ½½ ¸ ½¾½
pred    ¿¾¸ ¾ ¸ ¾ ¸ ¿¼ ¸ ¿¿ ¸ ¿ ¸ ¿ ¸        ¼
Prim Heap Info    ¼ ¸ ¼
Prim Info    ¼ ¸ ¼
push in splay stack     ¿¿ ¸ ¿¿ ¸ ¿ ¸ ¿
put arc    ¼¸ ¼ ¸ ¼¸ ½ ¸ ½
quicksort ½ ¿ ¸ ½ ¸ ¾ ¸
RandNode       ¸
RandNodeVtl        ¸
random insert         ¸ ¼
random join exclusive        ¼¸ ½
random remove     ½¸ ½
RbNode    ½¸ ½
read matrix      ½¸ ½
release all segments and blocks        ¸
release block        ¸ ¸
release blocks and segment
release segment        ¸ ¸
remove entry from hash table       ¿¸
remove entry from lru list       ¾¸
remove from search binary tree ¿ ¿ ¸ ¿ ¿     ¸¿
restore avl    ¼¼ ¸ ¼½ ¸ ¼
restore avl after deletion      ¼½ ¸ ¼
restore avl after insertion         ¸ ¼¼
rotateLeft    ¼¼
rotateRight    ¼¼
rotation type         ¸ ¼¼
search and push in splay stack      ¿¿ ¸ ¿   ¸ ¿ ¸ ¿
search and stack avl         ¸ ¸ ¼½
search and stack rb     ½ ¸ ½ ¸ ¾¼
searchInBinTree ¿¿¾ ¸ ¿¿
search min ½ ¿ ¸ ½ ¸ ½
select gotoup root         ¸
sequential search ½ ¸ ¿ ¸ ½ ¸ ½        ¸½    ¸½
set list graph      ¼¸ ¿
Slink     ¸ ¸ ¸ ¸ ¸ ½¸ ½¸ ¾¸                 ¾¸
SLINK TO TYPE ½
Slist    ¾¸ ¿ ¸ ¿¸ ¸ ¸
Snode    ½ ¸ ¾ ¸ ¾ ¸ ¾ ¸ ¾ ¸ ¾ ¸ ¸ ½½¾ ¸     ½½¿ ¸ ½¾ ¸ ½¾ ¸ ½¿
splay    ¿ ¸ ¿ ¸ ¿ ¸ ¿
split key rec ¿¿ ¸ ¿ ½ ¸ ¿
split key rec xt ¿ ¸ ¿
897



split pos rec ¿    ¸¿
str to token ½½ ¸ ½¾¼
sum p ¿ ¼ ¸ ¿ ¼
Termino ½¼¾ ¸ ½¼¾ ¸ ½¼¾ ¸ ½¼¾ ¸   ½¼¾ ¸ ½¼¿ ¸ ½¼¿ ¸ ½¼ ¸ ½¼ ¸ ½¼ ¸ ½¼ ¸ ½¼ ¸ ½¼
Token Type ½½ ¸ ½½ ¸ ½¾¼
TreapNode       ¸
TREE ¿ ¸ ¿ ¼ ¸ ¿ ¼ ¸ ¿ ¼ ¸ ¿ ½
TREEARC ½ ¸ ½ ¸ ½
zig type   ¿ ¸ ¿

Tejiendo Algoritmos - Leandro Rabindranath León

  • 1.
    Tejiendo algoritmos Ä Ò ÖÓ Ê Ò Ö Ò Ø Ä ÓÒ lrleon@ula.ve ÒØÖÓ ×ØÙ Ó× Ò Å ÖÓ Ð ØÖÓÒ Ý Ë ×Ø Ñ × ×ØÖ Ù Ó× ÍÒ Ú Ö× ÄÓ× Ò × ½ × ÔØ Ñ Ö ¾¼¼
  • 2.
    ÄÓ× Ø Ó× Ð ÔÓÖØ ×ÓÒ Ó× Ù Ó× Ø Ó× ÖØ ¬ Р׸ Ö Ð Þ Ó× ÔÓÖ ÖÑ Ò Ø Ùר Ñ ÒØ Ý ÙÒ Ö Ø Ð Æ ÛØÓÒ ÓÖ Ò Ø Ó ÔÓÖ Ð ÔÖÓ Ö Ñ xfractintº
  • 3.
    Ð ×ØÙ ÒØÖ Ø ÖÒÓ¸ Ø Ò Þ ÒØ Ð ÒØ ¸ Ô ÖÓ ÔÓÖ ×Ó Ö ØÓ Ó¸ ÓÒ ×ØÓº
  • 5.
    Prefacio ÉÙ × ÖÕÙ ×Ø Ø ÜØÓ × ÓÒ× Ö × ÓÑÓ ÙÒ Ú Ñ ÙÑ Ò Ð × ÒÓ Ø ÚÓ Ý Ò Ð ÔÖÓ Ö Ñ ÓÒ Ð ÓÖ ØÑÓ× Ý ×ØÖÙ ØÙÖ × ØÓ× ÕÙ ×ÓÔÓÖØ Ò ÔÖÓ Ö Ñ × ÓÑÔÙØ ¹ ÓÒ Ð ×º Î Ñ ÙÑ × ÙÒ Ô Ð Ö Ð Ø Ò ÓÒרÖÙ Ñ ÒØ Ð ÑÔ Ö Ø ÚÓ Ð Ø Ò Ú ÕÙ ÓÒÒÓØ Ú Ò ¸ Ò Ó Ñ Ò Ý Ñ ÙÑ ÕÙ × Ò ¬ ÓÒÑ Ó º ÔÖ Ò Ö × Ô Ö Ó ØÖ Ò× Ø Ö ÙÒ Ñ ÒÓ Ò× Ò Ö × Ô Ö Ó ÑÓ×ØÖ Ö× ÐÓ ÙÒ Ô Ö Ö ÒÓº Ò× Ò Ö ÔÖÓÚ Ò Ð Ð Ø Ò Ò× Ò Ö ¸ Ú Ö Ó ÓÑÔÙ ×ØÓ Ò ´ Òµ Ý × Ò Ö ´× Ò Ð Öµ Ð ÜÔÖ × ÓÒ ÙÒ × ÑÔÐ Ù Ò Ó × × Ò Ð ÓÒ Ð Ó ÙÒ × Ò × Ù Öº × ¸ ÙÒ Ú ¹ Ñ ÙÑ ÔÖ Ø Ò × Ö ÙÒ Ù ØÖ Ò× ØÓ ÔÓÖ ÙÒ × Ò ÔÖ Ò Þ Ò ×Ø ×Ó¸ Ð ÔÖÓ Ö Ñ ÓÒ ÓÑÔÙØ ÓÖ ×º Modo y medios È ÖÑ Ø × Ñ ÒØÖÓ Ù Ö Ð ÑÓ Ó Ò× Ò ÒÞ ×Ø Ø ÜØÓ¸ ÜÔÖ × Ó ÔÓÖ ×Ø ÒØ ÕÙ × ÑÓ ÔÖÓÚ Ö Ó ÓÖ ÒØ Ð Ù Ò Ó × Ù Ó¸ ÓÐÚ Ó¸ Ù Ò Ó Ú Ó¸ Ö Ù Ö Ó¸ Ù Ò Ó Ó¸ ÒØ Ò Óº Ä ÔÖÓÔ ÓÒ Ø Ú ÙÒ ÓÒÓ Ñ ÒØÓ Ó ÙÖÖ Ù Ò Ó ×Ø × ÒØ Ò º Ð Ò¹ Ø Ò Ñ ÒØÓ × ØÓÖÒ Ö Ð Ù Ò Ó ÙÒ ÔÖ Ò Þ ÓÒ×ÙÑ Ð ÙÖ Ó× × Ö ¹ Ø Ö ×Ø × ×Ù ÔÖ Ø Ò ÓÐ × Ð Ñ ×ÑÓº Ó ÓØÖ Ñ Ò Ö ¸ Ð ÑÓ Ó Ò× Ò ÒÞ × ÑÓ×ØÖ Ö ÒØ Ö Ñ ÒØ ÓÑÓ × Ö Ð Þ ÙÒ ×ØÖÙ ØÙÖ ØÓ× Ý ÙÒ Ð ÓÖ ØÑÓº Ó ×Ø ÑÓ Ó¸ ÒØ ÒØ Ö Ù Ö ÙÒ ÔÓØ Ò Ð ÔÖ Ò Þ ÔÓÖ Ð Ñ ÒÓ Ð ÔÖ Ø Ð ÔÖÓ Ö ¹ Ñ ÓÒ Ú ÒÞ º È Ö ÐÐÓ ÑÔÐ Ó Ð ÙÒÓ× Ñ Ó׺ C++ È Ö Ö ÔÖ × ÒØ Ö ÐÓ× Ð ÓÖ ØÑÓ× Ý Ð × ×Ô ¬ ÓÒ × ×ØÖÙ ØÙÖ × ØÓ× ÑÔÐ Ó Ð ÐÒÙ ÔÖÓ Ö Ñ ÓÒ C ++º ר × ÓÒ ÒÓ × ØÓÑÓ × Ò Ò × Ó ÓÒ ×¸ Ð × Ù Ð ×¸ Ö ×ÙÑ Ñ ÒØ ¸ × ÔÙ Ò Ð × ¬ Ö Ò Ó× ÖÙÔÓ׺ Ð ÔÖ Ñ ÖÓ Ù ×Ø ÓÒ Ð Ú ÒØÙ Ð × ÓÒÓ Ñ ÒØÓ Ð Ð ØÓÖ ×Ó Ö Ð Ð Ò Ù C++º ×ØÓ Ó Ö ÔÐ Ö ÕÙ ¸ ÒÓ ×ÓÐÓ C++ × ÙÒÓ ÐÓ× Ð Ò Ù × Ñ × ÔÓÔÙÐ Ö × ÑÔÓÖØ ÒØ × Ð ÔÖÓ Ö Ñ ÓÒ × ×Ø Ñ ×¸ × ÒÓ ÕÙ ×Ù × ÒØ Ü × Ý × Ñ ÒØ ×ÓÒ Ö Ñ Ò × ÒØ × Ð Ñ ÝÓÖ ÐÓ× ÓØÖÓ× Ð Ò Ù × ÔÖÓ ÙÖ Ð × Ý Ó ØÓ׺ Ó¸ Ò Ð ÕÙÓÖÙÑ ØÙ Ð ÐÓ× Ð Ò Ù × ÔÖÓ Ö Ñ ÓÒ ÔÖÓ ÙÖ Ð × ÒÓ ×ÓÐÓ ÓÑ Ò C++¸ × ÒÓ ÕÙ Ð Ö ×ØÓ ÐÓ× Ð Ò Ù × × Ò×Ô Ö Ò Ò Ð Ó Ò ×Ù ÔÖ ÙÖ×ÓÖ¸ Ð Ð Ò Ù C ÔÓÖ Òר Ò ×¸ java¸ python¸ perl¸ C# Ý Dº
  • 6.
    iv Ð × ÙÒ Ó Ø ÔÓ Ó ÓÒ ÒÙÒ ÕÙ Ð ÓÑÔÖ Ò× ÓÒ × ØÓÖÒ Ñ × ¬ ÙÐØÓ× ¸ Ð Ù Ð Ö ÔÐ Ó ÓÒ Ó× Ö ÙÑ ÒØÓ׺ Ð ÔÖ Ñ ÖÓ × ÕÙ ÐÓ× Ð Ò Ù × ÔÖÓ Ö Ñ ÓÒ × Ô Ò× ÖÓÒ¸ Ø Ñ Ò¸ Ò ÙÒ ×Ø ÐÓ ÓÐÓÕÙ Ð ½ Ö ×Ô ØÓ Ð ÔÖÓ Ö Ñ ÓÒº ÓÒ× Ö ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ Ð × Ù ÒØ × Ù Ó ÔÖÓ Ö Ñ Ò ÙÒ × Ù Ó Ð Ò Ù ×Ø ÐÐ ÒÓ Repita mientras m > 0 y m < n si a[m] < a[x] entonces m = m/2; de lo contrario m = 2*m fin si Fin repita mientras Ð Ù Ð × ÕÙ Ú Ð ÒØ Ð ØÖ Ù ÓÒ Ð Ø Ö Ð¸ ÓÐÓÕÙ Ð ¸ Ð × Ù ÒØ ÐÓÕÙ Ò C++ while (m > 0 and m < n) { if (a[m] < a[x]) m = m/2; else m = 2*m; } ÙÒÕÙ ÙÒ ÑÔÐÓ ÒÓ ×Ø Ô Ö Ò Ö Ð Þ Ö Ñ Ò× ×Ó Ö Ð Ù×Ó Ð Ð Ò Ù C++¸ Ð Ó × ÕÙ Ù ÐÕÙ Ö ÕÙ ÓÒ× Ö × Ö Ñ ÒØ Ð ÔÖÓ Ö Ñ ÓÒ Ø Ò Ö ÕÙ ÔÖÓ Ö ¹ Ñ Ö Ý ×ØÓ Ö ÖÐÓ Ò ÙÒ Ð Ò Ù ÔÖÓ Ö Ñ ÓÒ Ð Ù Ð¸ Ô Ö Ò Ó Ñ Ð¸ Ù Ô Ò× Ó Ò Ð Ò Ù Ò Ð × º ÈÓÖ Ø ÒØÓ¸ Ò Ú Ø Ð Ñ ÒØ ¸ ÙÒ ÔÖ Ò Þ ×Ô ÒÓ Ô ÖÐ ÒØ ¹ Ö ÔÖÓ Ö Ñ Ö Ò ÙÒ Ð Ò Ù ÔÖÓ Ö Ñ ÓÒ Ò Ð Þ Ó º À Ð ÓØ ÓÒ ÒØ Ö ÓÖ¸ Ø Ñ Ò ÔÓ ÑÓ× Ö ÕÙ Ð ÔÖÓ Ö Ñ Ò ×Ø ÐÐ ÒÓ Ý ×Ù ÕÙ Ú Ð ÒØ Ò C++ Ø Ò Ò Ð Ñ ×ÑÓ × Ò ¬ Óº × Ô٠׸ × Ù Ó×Ó¸ Ù Ò Ó Ñ ÒÓ׸ ¬ÖÑ Ö ÕÙ Ð ÓÑÔÖ Ò× ÓÒ × ØÓÖÒ Ñ × ¬ ÙÐØÓ× º ÍÒ ÓÒ ÕÙ × ØÖ ÙÝ Ð Ù×Ó ÙÒ × Ù Ó Ð Ò Ù × ÕÙ ×Ø × Ò Ô Ò ÒØ Ð ÑÔÐ Ñ ÒØ ÓÒº Ò Ñ Ö Ø Ö Ó¸ ×ØÓ × Ô Ö ÐÑ ÒØ ÓÖÖ ØÓº ÈÓÖ ÑÔÐÓ¸ Ð × ÔÐ ÒØ ÐÐ × Ò C++ ÔÐ ÒØ Ò ÙÒ ÔÖÓ Ð Ñ ÔÓÖØ Ø Ð Ò ÓØÖÓ× Ð Ò Ù × ÕÙ ÒÓ Ð × Ø Ò Òº Ð Ù Ò ÔÙ Ö Ù Ö ÕÙ Ð Ù×Ó ÔÐ ÒØ ÐÐ × ×ÓÒ Ö ÔØ × Ô Ö Ð ÔÖ Ò Þº È ÖÓ ×Ø Ó ÓÒ ×ÓÐÓ Ø Ò × ÒØ Ó × ÒÓ × ÓÑÔÖ Ò Ð ÓÒ ÔØÓ Ý ¬Ò ÙÒ ÔÐ ÒØ ÐÐ ¸ Ù Ð ÒÓ × ÓØÖÓ ÕÙ Ð Ò Ö º ÒØ Ò Ó ×ØÓ¸ ÙÒ ÔÖÓ Ö Ñ ÓÒ ÔÐ ÒØ ÐÐ × × Ø Ò Ó Ñ × Ò Ö Ó ÕÙ ÙÒÓ Ö Ð Þ Ó Ò ÙÒ × Ù Ó Ð Ò Ù Ý Ö ×ÙÐØ ÕÙ ×Ø × Ð ÔÖ Ò Ô Ð Ö ÙÑ ÒØÓ ÕÙ Ò × ¬ Ò Ò Ð Ò× Ò ÒÞ ÔÖÓ Ö Ñ ÓÒ Ò ÙÒ × Ù Ó Ð Ò Ù º ØÓ Ó× ÑÓ Ó׸ × × Ù× × ÙÒ × Ù Ó Ð Ò Ù ¸ ÒØÓÒ × Ø Ñ Ò Ö ÕÙ ÔÐ ÒØ Ö× Ð ÔÖÓ Ð Ñ ØÖ Ù Ö ÙÒ Ð Ò Ù ÔÖÓ Ö Ñ ÓÒ Ö Ð¾ º Å × ÙÒ Ó Ö ÙÑ ÒØÓ ×ØÖ Ò ÕÙ ¸ Ù ÒØ Ð ÔÓÔÙÐ Ö Ý ØÖ Ò× Ò Ò Ð C++¸ Ö Ó ÕÙ × Ñ × Ð ØÖ Ù Ö ÙÒ ÔÖÓ Ö Ñ Ò ×ØÖÙ ØÙÖ Ó Ò C++ ÓØÖÓ Ð Ò Ù ¸ ÔÓÖ ÑÔÐÓ¸ java¸ ÕÙ ÙÒÓ Ö Ð Þ Ó Ò ÙÒ × Ù Ó Ð Ò Ù ¿ º × ÑÔÓ× Ð × Ö ÓÑÔÐ Ø Ñ ÒØ ÓÐÓÕÙ Ð Ò ÙÒ Ð Ò Ù ½ ÔÖÓ Ö Ñ ÓÒº ÍÒ ØÖ Ù ÓÒ ÓÒ Ñ × × Ù ÖÞÓ × × ØÖ Ø ¾ ÙÒ × Ù Ó Ð Ò Ù Ò ×Ø ÐÐ ÒÓº ¿ Ó¸ ÑÙ Ó× Ø ÜØÓ× ÔÖÓ Ö Ñ ÓÒ Ô Ö Ò Ò Ö ÒØ × ÓÒ × Ô Ö ×Ø ÒØÓ× Ð Ò Ù ×º Ò ÑÙ Ó× ×ØÓ× ×Ó׸ Ð ÙØÓÖ × Ö ÐÓ× ÔÖÓ Ö Ñ × Ò ÙÒ ×ÓÐÓ Ð Ò Ù Ý ÐÙ Ó ÑÔÐ ØÖ Ù ØÓÖ × Ð ÓØÖÓ Ð Ò Ù º Ì Ð × ×ÓÒ ÐÓ× ×Ó× Ë Û Ó Ï ×× Ý ×Ù× × Ö × Ò C¸ C++ Ý java
  • 7.
    v Biblioteca ALEPH ר Ø ÜØÓ ÓÒØ Ò ¸ Ò × Ñ ×ÑÓ¸ ÙÒ ÑÔÐ Ñ ÒØ ÓÒ ÓÒ Ö Ø ÙÒ Ð ÓØ ¸ Ð Ö ¸ ÐÐ Ñ ALEPH¸ ÓÒØ ÒØ Ú ØÓ × Ð × ×ØÖÙ ØÙÖ × ØÓ× Ý Ð ÓÖ ØÑÓ× ØÖ Ø Ó× Ò ×Ø Ø ÜØÓº Ä Ð ØÙÖ ÔÓ× Ð Ø Ð Ð Ù ÒØ Ð Ð ÓØ Ý Ö Ú Ð ×Ô ØÓ× ×Ù ÒרÖÙ¹ Ñ ÒØ ÓÒº Ë ÐÚÓ ÖÖÓÖ × ÙÒ ÒÓ × Ù ÖØÓ× Ó Ñ ÓÖ × ÕÙ Ù ÐÕÙ Ö × ÔÖÓÔÓÒ Ö¸ Ð Ð ØÓÖ Ø Ò Ð ÔÓ× Ð ÔÓÝ Ö× Ò ÙÒ ÑÔÐ ÒØ ÓÒ ÓÒ Ö Ø ÕÙ Ð ÐØ Ð ÔÖÓÔ ÓÒ ×Ù× ÓÒÓ Ñ ÒØÓ׺ ÄÓ× Ó Ó× Ù ÒØ × ALEPH ר Ò ×ÔÓÒ Ð × Ò ftp:://ftp.ula.ve/lrleon/ aleph Ù ÖÓÒ ÙØÓÑ Ø Ñ ÒØ Ò ÒØ Ó× ÓÒ bcpp ¿ º ÐÓ Ð Ö Ó Ñ ÜÔ Ö Ò ÓÑÓ Ò× Ò ÒØ ¸ ÒØ ÒØ Ó Ö ÓÑÔ Ò× Ö ÐÓ× × Ù Ö ¹ ÓÖ × ÖÖÓÖ × Ý ÔÖÓÔÓÒ ÒØ × Ñ ÓÖ × ÓÒ ÙÒ ÔÓÒ Ö ÓÒ Ò ×Ù Ð ¬ ÓÒº ÆÓ Ú Ó Ò Ò ÙÒ ÑÔ Ñ ÒØÓ ÕÙ ÙÒ Ø Ö ÖÓ ÔÐ ÕÙ ÐÓ Ñ ×ÑÓ × ×Ø Ø ÜØÓ × Ù× ÓÑÓ Ñ Ø Ö Ð ÒרÖÙ ÓÒ Ðº Ë Ð ÙÒ Ð ØÓÖ Ù Ö Ñ Ö ÙÐÓ Ò× Ò ÒÞ × Ö ÔÓÖØ Ö Ð ÙÒ ÖÖÓÖ Ó Ö Ð Þ Ö Ð ÙÒ Ñ ÓÖ ¸ ÒØÓÒ × Ð Ö Þ Ó ÐÓ Ö ÔÓÖØ Ð Ñ Ð lrleon@ula.veº Ä Ó ÙÑ ÒØ ÓÒ Ð Ð ÓØ ר ×ÔÓÒ Ð Ò Ð ÒÐ http://www.ing.ula. ve/alephº ר Ù × Ö Ø Ô Ö ÔÖÓ × Ö× ÓÒ Ð Ü Ð ÒØ ÔÖÓ Ö Ñ doxygen º Programaci´n literaria o Ò Ð Ð ÓÖ ÓÒ ×Ø Ø ÜØÓ × ÙØ Ð ÞÓ ÙÒ × ×Ø Ñ ÐÐ Ñ Ó noweb ½ ¸ ½ ¸ Ð Ù Ð × ÙÒ × ×Ø Ñ ÔÖÓ Ö Ñ Ó ÕÙ Ò Ö ×Ø Ø ÜØÓ Ý ÐÓ× Ù ÒØ × Ò C++ Ô ÖØ Ö ÙÒ ×ÓÐÓ Ö ÚÓ Ù ÒØ º Ð Ù ÒØ ÒØÖ Ð Þ ÔÖÓ× ÜÔÐ Ø Ú ÓÒ ÐÓÕÙ × Ó Ó Ð ÑÔÐ ÒØ ÓÒ Ð Ð ÓØ º ר ר ÐÓ × Ö ØÙÖ ÔÖÓ Ö Ñ × × ÒÓÑ Ò ÔÖÓ Ö Ñ ÓÒ Ð Ø Ö Ö Ý Ù ÔÖÓ¹ ÔÙ ×ØÓ ÔÓÖ ÃÒÙØ ½ º Ä × ÔÖ × ÒØ Ö ÙÒ ×Ø ÐÓ Ñ × ÓÐÓÕÙ Ð Ô Ö × Ö Ö ÔÖÓ Ö Ñ × ÕÙ Ð Ñ ÖÓ ×Ø ÐÓ ÓÖÑ Ó ÙÒ Ð Ò Ù ÔÖÓ Ö Ñ ÓÒ¸ ÙÒØÓ ÓÒ Ð Ò Ò ÕÙ Ð Ó ÙÑ ÒØ ÓÒ Ý Ð ÙÐØ Ñ Ú Ö× ÓÒ Ð ÔÖÓ Ö Ñ ´ÔÖ ×ÙÑ Ð Ñ ÒØ ÓÖÖ Ø µ Ö × Ò Ò ÙÒ ×ÓÐÓ Ù ÒØ º Ô ÖØ Ó Ó Ò C++¸ ÐÓ× ÐÓÕÙ × ÔÙ Ò ÓÒØ Ò Ö Ö Ö Ò × ÓØÖÓ× ÐÓÕ٠׺ ÍÒ ¬Ò ÓÒ ÐÓÕÙ ÓÑ ÒÞ ÔÓÖ ×Ù ÒÓÑ Ö ÒØÖ Ô Ö ÒØ × × Ò ÙÐ Ö ×º ÈÓÖ ÑÔÐÓ¸ ÓÒ× Ö ÑÓ× Ø ÖÑ Ò Ö × ÙÒ ÒÙÑ ÖÓ n × Ó ÒÓ ÔÖ ÑÓº È Ö ÐÐÓ¸ ÔÓ ÑÓ× ¬Ò Ö Ð × Ù ÒØ ÐÓÕÙ Ú Ð ÙÐ Ö × Ò × ÔÖ ÑÓ Ú ≡ if (n <= 2) // n es un n´mero primo u const int ra´z_de_n = static_cast<int>(ceil(sqrt(n))); ı for (int i = 3; i < ra´z_de_n; i += 2) ı if (n % i == 0) // n no es primo // n es un n´mero primo u ÄÓ× ÐÓÕÙ × × ÒÙÑ Ö Ò × ÙÒ Ð ÒÙÑ ÖÓ Ð Ô Ò ÓÒ × ¬Ò Ò ÔÓÖ ÔÖ Ñ Ö Ú Þº Ë Ý Ñ × ÙÒ ÐÓÕÙ Ò ÙÒ Ô Ò ¸ ÒØÓÒ × ×Ø × Ð Ò ÙÒ Ð ØÖ ÕÙ ¸ Ò Ð ÓÖ Ò Ð Ø Ó¸ × ÓÖÖ ×ÔÓÒ ÓÒ ×Ù ÓÖ Ò Ô Ö ÓÒº Ð ÙÒÓ× ÐÓÕÙ × Ö Ö Ò Ò ÓØÖÓ× ÐÓÕÙ × Ó Ú Ö Ð ×º
  • 8.
    vi ÄÓ× ÐÓÕÙ × ×Ø Ò × Ö ØÓ× Ò ÙÒ ÓÖ Ò ÕÙ × Ö × ÔÖ Ö Ð Ô Ö Ð ÓÑÔÖ Ò× ÓÒ ÕÙ Ð Ñ ÖÓ Ð ×Ø Ó Ó Óº × ¸ Ö Ö ØÓ Ö Ø ÕÙ × Ñ ÔÙ Ö ×Ó Ö Ð ×Ø ÐÓ Ý ÓÖ Ò ÔÖ × ÒØ ÓÒ ÙÒ ×ØÖÙ ØÙÖ ØÓ Ó Ð ÓÖ ØÑÓ Ò ÔÖÓ Ö Ñ ÓÒ Ð Ø¹ Ö Ö ¸ Ô ÖÓ Ð ×ÓÐ ØÓ Ð Ö Ø Ó ÙÒ × Ù ÖÞÓ ÔÖ Ñ Ò Ó ÔÓÖ ÓÑÔ Ö Ö Ð ×Ø ÐÓ noweb ÓÒ Ð Ð ×Ø Ó ÔÐ ÒÓ Ó Ó Ý¸ ÒØÓÒ ×¸ Ó × ÓÒ× Ö ÓÒ¸ Ö Ö ×Ù Ö Ø º ÈÙ Ö× ÕÙ ×Ø Ø ÜØÓ ÓÒØ Ò Ð ÑÔÐ ÒØ ÓÒ Ù ÒØ רÖÙ ØÙÖ ØÓ× Ó Ð ÓÖ ØÑÓ × ×ØÙ º ÑÔ ÖÓ¸ ØÓÑ Ö× ×ØÓ Ð Ô Ð Ð ØÖ ÖÖ Ö ×Ø ÒØ Ô Ô Ð Ñ × ÕÙ Ö ×Ø Ø ÜØÓ Ñ × ÚÓÐÙÑ ÒÓ×Ó Ý Ö Ô Ø Ø ÚÓº Ò × × ÒØ Ó¸ Ò Ö × Ð ×Ô Ó¸ × Ò Ö Ð Þ Ó ÓÖØ × Ó× Ø ÔÓ× ½º Å Ò Ó Ü Ô ÓÒ × ÙÒÕÙ ×Ø ×Ô ØÓ ÓÒר ØÙÝ ÙÒ Ð × ÓÒ × Ñ × Ð ÒØ × C++¸ ר Ø ÜØÓ × ÒÓ ÐÓ× ÔÖ × ÒØ º ¾º Å ØÓ Ó× Ð × × Ö Ô Ø Ø ÚÓ× Ó ÑÙÝ × ÑÔР׺ Ò Ñ Ó× ×Ó׸ Ð Ó Ó Ð Ð ÓØ ¸ Ö Ø Ñ ÒØ Ò Ö Ó Ô ÖØ Ö Ð Ù ÒØ noweb ר Ø ÜØÓ¸ ר ÓÑÔÐ ØÓ × Ö¸ Ð Ð ÓØ ÓÒØ Ò ÐÓ× Ñ Ò ÓÖ × Ü Ô ÓÒ × Ý Ñ ØÓ Ó× ÓÑ Ø Ó× Ò ×Ø Ø ÜØÓº Ejercicios Ù ÐÕÙ Ö × Ð ÔÖ Ø ¸ ÒÓ Ý ÓØÖ Ñ Ò Ö ÕÙ ÙÒ ÔÖ Ø ÒØ ÓÒ×ÙÑ ×Ù× ÓÒÓ Ñ ÒØÓ× ÕÙ ÒÓ × Ò Ó ÔÖ Ø º ÈÓÖ Ñ × × Ù ÖÞÓ ÕÙ × Ö Ð ÔÓÖ ÓÖ ÒØ Ö Ý Ò× Ò Ö¸ Ð ÔÖ Ò Þ ¸ ÔÖ Ö Ð Ñ ÒØ Ù Ó ÔÓÖ ÙÒ Ñ ×ØÖÓ¸ Ö Ø Ö ÔÓÖ × ×ÓÐÓ ÐÓ ÔÖ Ò Óº À Ý ØÖ × Ñ Ò Ö ×¸ ÕÙ ÒÓ Ò × Ö Ü ÐÙÝ ÒØ ׸ Ö Ð Þ Ö ÐÓ ÒØ Ö ÓÖ ½º Ê ×ÓÐÙ ÓÒ Ö Ó× ÔÖÓÔÙ ×ØÓ× Ò ×Ø × ÒØ Ó¸ Ð ¬Ò Ð Ô ØÙÐÓ × ÔÖ × ÒØ ÙÒ ÓÒ ÙÒØÓ Ö Ó× ×Ø Ò Ó׸ ÔÖ ÑÓÖ ÐÑ ÒØ ¸ Ð Ö ×ÓÐÙ ÓÒ Ò ×ÓÐ Ø Ö Ó ÔÓÖ Ô ÖØ Ð ÔÖ Ò Þº Ð ÙÒÓ× Ö Ó× ×ÓÒ Ø ÓÖ Ó× Ò Ð × ÒØ Ó ÕÙ ÒÓ Ò × Ö Ñ ÒØ Ö ÕÙ Ö Ò × Ö Ö ÙÒ ÔÖÓ Ö Ñ ÓÑÔ Ð Ð º ÈÓÖ ×ÙÔÙ ×ØÓ¸ ÒÓ ×Ø ÔÖÓ Ó × ÒØ Ö× Ö ÒØ Ð ÓÑÔÙØ ÓÖ ÒØ ÒØ Ö ÓÒ Ö Ø Ö Ð Ö Ó Ñ ÒØ ÙÒ ÔÖÓ Ö Ñ º ÇØÖÓ× Ö Ó× ×ÓÒ ÔÖ Ø Ó× Ý ÓÒ× ×Ø Ò Ò ÜØ Ò× ÓÒ × Ð Ð ÓØ º רÓ× Ö Ó× ×ÓÒ ×Ø Ò¹ Ù Ð × ÐÓ× Ø ÓÖ Ó× ÔÓÖÕÙ ÒÙÒ Ò ×Ù Ö ×ÙÐØ Ó Ò Ø ÖÑ ÒÓ× ÙÒ Ó ØÓ Ð Ð ÓØ º ÄÓ× Ö Ó× ×Ø Ò Ð × ¬ Ó× × ÙÒ ÙÒ ¬ ÙÐØ ×Ù Ø Ú ÙÞ ÔÓÖ Ñ º ÆÓ × Ð ÔÓÒ Ö Ö Ð Ø ÑÔÓ Ö ×ÓÐÙ ÓÒ ÙÒ Ö Ó¸ ÔÙ × ×Ø Ô Ò Ð ×ØÙ ÒØ ¸ Ô ÖÓ ÕÙ Ñ Ð × ¬ ÓÒ ´ µ Æ Ò ÙÒ ÖÙÞ ÒÓØ ÙÒ Ö Ó ÓÒ× Ö Ó × Ò ÐÐÓº ÄÓ× Ø ÓÖ Ó× Ö Ò Ö ×ÓÐÚ Ö× Ò Ð ÓÖ Ò Ò Ó Ñ ÒÙØÓ׸ Ñ ÒØÖ × ÕÙ ÐÓ× ÔÖ Ø Ó× Ò Ð ÙÒ º ´ µ ÍÒ ÖÙÞ ´·µ ÜÔÖ × ÙÒ Ø ÑÔÓ ×Ø Ñ Ó ÙÒ Ó× ÓÖ × Ò Ð ×Ó ÙÒ Ö Ó Ø ÓÖ Ó Ý Ó× × Ò Ð ÔÖ Ø Óº ´ µ Ó× ÖÙ × ´··µ ÜÔÖ × Ò Ý ÙÒ ¬ ÙÐØ ÑÙ Ó Ñ ÝÓÖº ÈÓÖ ÐÓ Ò Ö Ð¸ ר Ð × Ö Ó× ÔÐ ÒØ Ò Ð ÔÖ Ò Þ ÙÒ × Ù Ö Ñ ÒØÓ Ó Ö Ú Ð ÓÒ
  • 9.
    vii ÙÒ ØÖÙ Ó Ó Ø Ò ÕÙ ¸ ÙÒ Ú Þ Ö Ú Ð ¸ Ö Ù Ö Ð ÓÑÔÐ Ð Ö Ó Ò Ò ÙÒ ÖÙÞº Ð Ø ÑÔÓ ÙÒ Ö Ó Ø ÓÖ Ó × Ö Ð Ñ ÒÓ× ÙÒ ¸ Ñ ÒØÖ × ÕÙ Ð ÙÒÓ ÔÖ Ø Ó ØÖ × ´¿µ ׺ ´ µ ÌÖ × ÖÙ × ´···µ Ö ÔÖ × ÒØ Ò ÙÒ Ö Ó Ð Ø ¸ и ÙÒ¸ Ô Ö ÙÒ Ñ ×¹ ØÖÓ Ý ×Ù Ø ÑÔÓ Ö ×ÓÐÙ ÓÒ ÒÓ ×Ø Ð Ñ Ø Óº ¾º Ê Ð Þ ÓÒ Ö Ó× Ù Ó× Ò Ð ÓÖ ØÓÖ Ó ÙÒÓ ÐÓ× Ö Ò × Ó ×Ø ÙÐÓ× ÕÙ ÐÓ ×ØÖ ØÓ ÔÐ ÒØ Ð ÔÖ Ò Þ ¹Ý ÙÒÓ Ö ÕÙ ÐÐÓ Ó ÙÖÖ Ò Ù ÐÕÙ Ö ÔÖ Ø ¹ × ÕÙ ×Ù ÓÒ ÓÒ ÒÓÚ Ð ¬ ÙÐØ ÔØ Ö ÕÙ ÐÓ ÕÙ Ô Ö Ð ÔÙ × Ö Ò ÔÖ Ò Ô Ó ×ØÖ ØÓ Ú Ò Ö ¸ ØÖ Ú × Ð Ö Ó¸ ÓÒ Ö ØÓº Ó ÐÓ ÒØ Ö ÓÖ¸ ÔÙ Ö× ÕÙ Ð × ÒØ Ó ÙÒ Ö Ó Ò Ð ÓÖ ØÓÖ Ó × Ô ÖÑ Ø ÖÐ Ð ×ØÙ ÒØ Ò Ö Ð ÓÒ Ö ÓÒ ×Ù× ÓÒÓ Ñ ÒØÓ׺ È Ö ÐÐÓ¸ Ò Ð ÓÖ ØÓÖ Ó¸ ÔÙ Ò Ö Ð Þ Ö× ØÖ × Ø Ú × ´ µ ÓÒØ ÑÔÐ ÓÒ ÙÒ ÔÖÓ Ð Ñ ÓÑÔÙØ ÓÒ Ð¸ ÙÒØÓ ÓÒ ×Ù ×ÓÐÙ ÓÒ¸ Ò Ð Ù Ð × Ù×Ó Ð ÙÒ ×ØÖÙ ØÙÖ ØÓ× Ó Ð ÓÖ ØÑÓ ×ØÙ Óº Ð Ù Ð ÓÖ ØÓÖ Ó ÔÙ ÒÙÒ Ö Ð ÔÖÓ Ð Ñ Ý ÔÖ × ÒØ Ö Ð ÒרÖÙ¹ Ñ ÒØ ÓÒ ×Ù ×ÓÐÙ ÓÒº ÄÙ Ó¸ ÒÚ Ø Ö Ð ×ØÙ ÒØ Ö Ú × Ö ÐÓ× Ù ÒØ × Ò Ö Ö¸ ÒØ × ×Ù Ù ÓÒ¸ Ð × Ø Ò × Ý ×Ø ÐÓ× ÙØ Ð Þ Ó× Ò Ð ÒרÖÙ¹ Ñ ÒØ ÓÒº ´ µ ÓÒØ ÑÔÐ ÓÒ Ð Ù ÓÒ Ð ÔÖÓ Ö Ñ Ô Ö Ú Ö× × ÓÑ Ò ÓÒ × ÒØÖ º ר × Ð × Ò Ð Ù Ð Ð ÔÖ Ò Þ ÓÑ ÒÞ × ÒØ Ö ÓÒ Ö ÓÒ × Ö¸ ÕÙ ÐÓ× ÓÒ ÔØÓ× ×ØÖ ØÓ× Ô Ö Ò Ò ×ÓÐÙ ÓÒ × ÓÒ Ö Ø ×º ÙÖ ÒØ ר Ø Ú ÔÙ × Ö Ö ÓÑ Ò Ð Ð ÙØ Ð Þ ÓÒ ÙÒ ÔÙ¹ Ö ÓÖ º ´ µ Ò ÐÑ ÒØ ¸ Ö ×ÓÐÙ ÓÒ ÙÒ Ú Ö ÒØ Ð ÔÖÓ Ð Ñ Ô ÖØ Ö Ð ×ÓÐÙ ÓÒ ÔÖ Ñ Ò º Ò ×Ø ÔÙÒØÓ¸ × ÑÙÝ ÑÔÓÖØ ÒØ ÕÙ × ØÖ ×Ó Ö Ð Ñ ×ÑÓ ÔÖÓ Ð Ñ Ý Ù ÒØ ׸ Ô ÖÓ ÓÒ Ð ÙÒ Ú Ö ÒØ ÙÒ ÑÔÐ ÓÒ Ô Ö Ö ×ÓÐÚ Ö ÓØÖ × Ð × × ÒØÖ ×¸ ÔÓÖ ÑÔÐÓº ¿º Ê Ð Þ ÓÒ ØÖ Ó× ÔÖ Ø Ó× Ò Ù Ð Ñ ÒØ ¸ Ò Ð ×Ô Ö ØÙ Ð ÔÖÓÚ Ö Ó Ø Ó¸ ר × Ð × ÕÙ × Ò Ð Ö Ô Ö ÒØ Ò Ö º ÓÑÓ × Ö Ð ÔÖÓÝ ØÓ ÓÖÖ ×ÔÓÒ Ö× ÓÒ ÙÒ ÔÖÓ Ð Ñ ÓÖ Ò Ð Ô Ö Ý ÓÒ × ÒØ Ó Ð ÓÒØ ÜØÓ Ò ÓÒ × Ò× Ò × Ö¸ ÓÖÑÙÐ Ó ÔÓÖ Ý Ô Ö Ù× Ö× Ò Ð ÓÑÙÒ Ò ÓÒ × Ö Ð Ð Ò× Ò ÒÞ ×Ø ÙÖ×Óº ÈÓÖ ÑÔÐÓ¸ × Ð ÒÓ Ð ÐÙ Ö Ò× Ò ÒÞ × Ô Ò ÔÖÓ Ð Ñ × ØÖ ¬ Ó¸ ÒØÓÒ × ÔÙ ÔÐ ÒØ Ö× ÙÒ ÓÒ ÙÒØÓ ÑÔÐ × ÑÓ ÔÖÓÝ ØÓ× Ò ØÓÖÒÓ Ð × ÑÙÐ ÓÒ Ð ØÖ ¬ Ó Ý Ð ×ØÙ Ó Ú Ö× × Ø Ò × Ô Ö Ú Ø Ö Ð ÓÒ ×Ø ÓÒº ÍÒ ÔÖÓÝ ØÓ ר Ø ÔÓ Ö ÕÙ Ö Ö ¸ ÔÓÖ ÑÔÐÓ¸ Ð ÑÓ Ð Þ ÓÒ ÓÒ Ö Ó× Ð × Ú × Ö ÙÐ ÓÒ¸ Ñ Ò ×ÑÓ× ÓÒØÖÓÐ ÓÑÓ ÐÓ× × Ñ ÓÖÓ× Ý ÒØ × Ö ÙÐ ÒØ × ÓÑÓ ÐÓ× ÙØÓÑÓÚ Ð ×º ËÓ Ö × Ó × Ö Ü × Ú Ñ ÒØ Ö Ô Ø Ø ÚÓ¸ Ó Ò× ×Ø Ö Ò Ð ÑÔÓÖØ Ò ÐÓ× Ö Ó׺ ×ØÓ Ý × Ö Ó Ú Ó × Ð Ô Ö×Ô Ø Ú Ð ×ØÙ ÒØ ¸ ÔÙ × × Ð ÙÒ Ó Ñ Ó Ö Ø Ö× º Ð ÒרÖÙ ØÓÖ¸ ÔÓÖ ÓØÖ Ô ÖØ ¸ Ð Ô ÖÑ Ø ÒÖ ÕÙ Ö Ð Ò× Ò ÒÞ Ù Ò Ó × ÔÐ ÒØ Ò Ö Ó× ÕÙ ÓÑÔÐ Ø Ò Ó ÓÑÔÐ Ñ ÒØ Ò Ð ÓÒÓ Ñ ÒØÓ ÑÔ ÖØ Ó × ÓÑÓ¸ Ñ ÒØ Ð ÓÖÖ ÓÒ¸ ×ÙÔ ÖÚ × Ö Ð Ò Ú Ð ×Ù× ×ØÙ ÒØ ׺
  • 10.
    viii Historia ÓÑÒ Ð Ð ÓÖ ÓÒ Ð Ð ÓØ ALEPH Ò Ñ ÝÓ ½ º Ò ÕÙ Ð ÒØÓÒ × Ñ ÓÒ× Ö × Ö Ö Ð × × Ó ØÓ× Ô Ö Ö ÔÖ × ÒØ Ö Ð ×Ø × ´Ð × Ö ÖÕÙ × Slink Ý Dlinkµ¸ Ö ÓÐ × Ò Ö Ó× ´Ð × Ö ÖÕÙ × BinNode<Key> Ý Avl Tree<Key>µ Ý Ø Ð × × ´Ð Ð × LhashTable<Key>µº È ÖØ × ×Ø Ø ÜØÓ ÓÑ ÒÞ ÖÓÒ Ô Ö Ö Ñ Ó× ½ ¸ ÐÙ Ó ÕÙ Ð ÙÒÓ× ×ØÙ ÒØ × Ñ Ó × ÖÚ × Ò ÕÙ Ð × × Ö ÙØ Ð Ð Ö Ð ÓÖ ØÑÓ× Ò Ó Ó Ý ÕÙ ×ØÓ× Ù × Ò Ò ÓÑ ÒØ Ó׺ Ù ÒØÓÒ × Ù Ò Ó Ô Ð noweb¸ ÙÝ Ñ ×ØÖ Ð Ø Ú Ý ÓÒÓ Ó Ù Ò Ó¸ ×ØÙ Ò Ó Ò Ö ÓÒ Ò Ñ Ó Ó¸ Ñ Ù ÓÔÓÖØÙÒ × ÑÓ Ð Ö Ð Ð ÖÓ ÓÑÔ Ð ÓÖ × À Ò×ÓÒ Ý Ö × Ö ½¾ º Ò × Ø ÑÔÓ × Ö Ô ÖØ ÐÓ ÕÙ ÓÝ × Ð Ô ØÙÐÓ ¾¸ ÓÒ ÖÒ ÒØ × Ù Ò ×º Ñ Ó× Ð ¾¼¼¼ ÓÑ Ò Ð Ô ØÙÐÓ ×Ó Ö Ö ÓÐ × Ý Ô ÖØ Ð ¸ Ö Ö ÒØ Ð × Ø Ð × × º Ð Ô ØÙÐÓ Ø Ò Ó ×Ø ÒØ × ÑÓ ¬ ÓÒ × ×Ù ÓÒØ Ò Ó ÓÖ Ò Ð Ý Ò ÙÖ ×¸ Ó ÙÖÖ ×¸ Ò ×Ù Ñ ÝÓÖ Ô ÖØ ¸ Ò Ð Ð Ö Ó Ô Ö Ó Ó ÓÑÔÖ Ò Ó ÒØÖ ¾¼¼½ Ý ¾¼¼ º Ò ÒÓÚ Ñ Ö Ð ¾¼¼½ Ö Ø ¸ × ÒØ Ö Ñ ÒØ ¸ ÐÓ ÕÙ ØÙ ÐÑ ÒØ × Ð Ô ØÙÐÓ ×Ó Ö ÕÙ Ð Ö Ó Ö ÓР׺ Ñ Ó× Ð ¾¼¼ Ò Ð ÜØ Ò× ÓÒ Ð Ð ÓØ Ö Ó× Ø Ñ ÔÖ × ÒØ Ó Ò Ð Ô ØÙÐÓ º Ä × ×ØÖÙ ØÙÖ × Ý Ð ÓÖ ØÑÓ× Ò ØÓÖÒÓ ×Ø ÓÑ Ò Ó Ò Ú Ö Ó ×Ø ÒØ Ò ÓÖÑ Ý ÒÓ × Ó¸ ר Ó×ØÓ Ð ¾¼¼ ¸ Ò ÕÙ Ò ØÓÑ Ó ÙÒ Ú Ö× ÓÒ ×Ø Ð º Ö Ó ÕÙ Ò ×Ø ÓÑ Ò Ó × ÓÒ ×Ø Ø ÜØÓ Ö Ð Þ ×Ù× ÔÖ Ò Ô Ð × ÔÓÖØ ׺ × Ö ÖÓ ¾¼¼ Ñ ÔÐ ÒØ Ð × Ù ÖÞÓ Ö Ú × Ö Ý ÙÒ ¬ Ö ÐÓ× Ô ØÙÐÓ× Ó ÐÓ ÕÙ ÓÝ ÓÒ ÓÖÑ ×Ø Ø ÜØÓº × Ö ÒØ Ö Ñ ÒØ ÐÓ× Ô ØÙÐÓ× ½¸ ×Ó Ö ×ØÖ ÓÒ ØÓ׸ Ý Ð ¿¸ ÓÒ ÖÒ ÒØ Ð Ö Ø Ð ÓÖ ØÑÓ× Ý ×ØÖÙ ØÙÖ × ØÓ׺ Ð × ÔØ Ñ Ö ¾¼¼ ÙÐÑ Ò Ð Ô ØÙÐÓ Ö Ö ÒØ Ð × Ø Ð × × º Ä Ñ ÝÓÖ Ð × ¬ ÙÖ × ×Ø Ð ÖÓ Ù ÖÓÒ Ò Ö × ÙØÓÑ Ø Ñ ÒØ Ñ ÒØ ÔÖÓ Ö Ñ × Ð ÓÖ Ó× ÓÒ Ð ÔÖÓÔ Ð ÓØ ALEPHº Ò × × ÒØ Ó¸ Ý ØÖ × ÔÖÓ Ö ¹ Ñ× ½º btreepic Ô Ö Ù Ö Ö ÓÐ × Ò Ö Ó׺ ¾º ntreepic Ô Ö Ù Ö Ö ÓÖ × Ò × Ý Ö ÓÐ × Ò Ò Ö Ðº ¿º graphpic Ô Ö Ù Ö Ö Ó׺ Ð ÔÖ Ñ Ö ÔÖÓ Ö Ñ ¸ btreepic¸ Ù ÑÓØ Ú Ó Ñ Ò× Ø × ÓÒ ÓÒ ÐÓ× Ù Ó× Ö ÓÐ × Ò Ö Ó× Ö Ð Þ Ó× ÓÒ ÔÖÓ Ö Ñ × ×Ô Ð × Ø Ð × ÓÑÓ Xfig Ý diaº ×ØÓ × ÙÒÓ Ð ÑÔÓ× Ð Ñ Ø Ö Ð Ù Ö Ö ÓÐ × ÒÓÖÑ × ¹ ÒØÓ× Ó Ñ Ð × ÒÓ Ó×¹º Ò Ú ÖØÙ ×ØÓ¸ ×ÓÐ Ø ÙÒ ØÖ Ó × ÓÐ Ö Ð Ö ×Ô ØÓ ÙÝÓ× Ö ×ÙÐØ Ó׸ Ô × Ö × Ø × ÖÑ × ÓÐ ÖÑ ÒØ ¸ ר ÖÓÒ ÑÙ Ó × ÖÑ ×Ù¬ ÒØ ׺ Ö Þ × ÜÔ Ö Ò ¸ ÔÓÖ Ñ ÔÖÓÔ Ù ÒØ Ö Ð Þ Ö btreepicº Ù Ò Ó ØÙÚ ÕÙ Ù Ö Ö ÓÐ × Ò Ö Ð ×¸ ×ÓÐ Ø Ð Ñ ×ÑÓ Ø ÔÓ ÔÖÓ Ö Ñ ÕÙ Ô Ö Ó ÙÒ ×ØÙ ÒØ Ü Ð×Ó¸ ÐÐ Ñ Ó ÂÓ× Ö ØÓ¸ ÕÙ Ò ÓÖ Ó ÙÒ ÔÖ Ñ Ö Ú Ö× ÓÒ ÐÐ Ñ xtreepic Ý ÕÙ ×Ø ×ØÖ Ù Ò ALEPHº Ä Ñ ÒØ Ð Ñ ÒØ ¸ ר Ú Ö× ÓÒ ÓÔ Ö ×Ó Ö ÙÒ Ú Ö× ÓÒ Ö ÓÐ × ÕÙ Ð ÔÓ Ñ Ò × Ý Ö Ú × ÓÒ Ý Ö Ù ¸ ÔÓÖ ÐÓ ÕÙ ÔÖ Ö Ö Ö ÒØ Ö Ñ ÒØ Ð ÔÖÓ Ö Ñ Ó Ð ÒÓÑ Ö ntreepicº È Ö Ð Ð ÓÖ ÓÒ Ð ÔÖÓ Ö Ñ Ñ Ù ÑÙÝ ÙØ Ð Ð ÖÑÓ×Ó Ø ÜØÓ ×Ó Ö Ù Ó Ö Ó× ÃÓÞÓ ËÙ Ý Ñ ¾¼ º Ò ÐÑ ÒØ ¸ Ù Ò Ó Ñ Ò ÓÒØÖ Ò Ð Ñ ×Ñ Ò × Ö ×Ô ØÓ ÐÓ× Ö Ó׸ ÔÖÓÚ Ð Ó × ÓÒ Ô Ö × ÖÖÓÐÐ Ö ×
  • 11.
    ix ÒØ ÖÑ ÒØ Ð ÓÖÔÙ× Ð ÓÖ ØÑ Ó Ò ÓÑ ØÖ ÓÑÔÙØ ÓÒ Ðº Ð ÔÖÓ Ö Ñ Ö ×ÙÐØ ÒØ ¸ graphpic × ÙÒ ÑÙÝ × ÑÔÐ Ý Ú ØÓ Ð Ð ÓÖ ØÑ Ú Ò ÙÐ Ð Ù Ó ÙØÓÑ Ø Ó Ö Ó× Ó¸ Ð × × ÓÒ × ×Ó Ö Ù Ó ×ÓÒ ØÓÑ × ÔÓÖ Ð Ù×Ù Ö Ó Ô ÖÓ ÔÙ Ö Ö ÕÙ graphpic Ø Ò Ð Ú ÖØÙ ÓÔ Ö Ö ÒØ Ö Ñ ÒØ ×Ó Ö ÓÑ ØÖ ÓÑÔÙØ ÓÒ Ð Ý ÕÙ ÐÐÓ¸ ÒÓ ×ÓÐÓ Ú Ð ×Ø ÑÔÓ¸ × ÒÓ ÕÙ Ö ÙØÙÖÓ× × ÖÖÓÐÐÓ׺ Ò Å ÖÞÓ ¾¼¼ Ò Ð × Ö ØÙÖ Ð Ó ÙÑ ÒØ ÓÒ Ð Ð ÓØ º Å Ò Ö ÒØ ÙÒ ÔÖÓ Ð Ñ ÓÑÓ ÒØ Ö Ö Ð Ó ÙÑ ÒØ ÓÒ Ò Ð Ù ÒØ ר Ø ÜØÓ × Ò ÕÙ ÐÐ Ô Ö Þ Ò Ð Ø ÜØÓ º Ê ÕÙ Ö × Ö ÖÐ Ò Ð Ñ ×ÑÓ × Ø Ó ÓÒ × Ö ×Ø Ð ÖÓ ÔÓÖÕÙ × ÑÓ Ó¸ Ó Ð Ñ ×Ñ Ó ØÖ Ò noweb¸ ÙÒ ÑÓ ¬ ÓÒ Ð Ð ÓØ × ÔÓ Ö ØÙ Ð Þ Ö Ö Ô Ñ ÒØ Ò Ð Ó ÙÑ ÒØ ÓÒº ÒØÓÒ × × Ò Ö ÙÒ ¬ÐØÖÓ Ø ÜØÓ ÕÙ Ö ÓÒÓ × ÐÓ× ÐÓÕÙ × Ó ÙÑ ÒØ ÓÒ ÒØÖÓ Ð Ù ÒØ noweb Ý ÐÓ× Ð Ñ Ò × Ñ Ò Ö ÕÙ ÒÓ Ô Ö × Ò Ò Ð × Ð Ä Ì º Ì Ð ¬ÐØÖÓ × ÒÓÑ Ò deldoxygen Ý Ù × Ö ØÓ ÓÒ Ð Ò Ö ÓÖ Ò Ð Þ ÓÖ × Ð Ü Ó Ö ¬ Ó× flex Ý C++º Ð Ù Ò Ö ÕÙ ÔÙ ÖÐÓ Ó Ò ØÖ ÒØ Ñ ÒÙØÓ× ÓÒ ÙÒÓ ÐÓ× Ð Ò Ù × × Ö ÔØ Ò ÑÓ ÖÒÓ× ´perl¸ python¸ Ø ºµº ÈÖÓ Ð Ñ ÒØ × ÖØÓ × ÝÓ Ù × Ñ ×ØÖÓ Ò Ð ÙÒÓ ÕÙ ÐÐÓ× Ð Ò Ù ×¸ Ô ÖÓ¸ Ò Ò ÙÖ × Ñ Ö ÔÐ Ö ÓÒ ØÖ × Ó׺ ÈÖ Ñ ÖÓ¸ ÑÓÖ ÙÒ Ô Ö ÓÖ × Ò × Ö Ö deldoxygen ÔÓÖÕÙ Ø Ò ÕÙ Ò ÒÓ× × Ò Ù× Ö flex Ý ÒÓ Ö ÓÖ Ò Ð Ð Ò Ù ÒÓ × ÔÙ × ÑÙ Ð Ö Ò º Ë ÙÒ Ó¸ Ñ ¬ÐØÖÓ Ø Ò ÑÙ × Ñ × ÔÓ× Ð × × Ö ÓÖÖ ØÓ¸ ÔÙ × Ù ×Ô ¬ Ó ¹ÒÓ ÔÖÓ Ö Ñ Ó¹ Ó Ð ÓÖÑ Ð ×ÑÓ Ð × ÜÔÖ × ÓÒ × Ö ÙÐ Ö × Ý ÐÓ× ÙØÓÑ Ø × Ò ÙÒ Ð Ò Ù × Ö ÔØ Ò ¸ ר ÓÖÖ Ø ØÙ Ø Ò ÕÙ ÔÖÓ Ö Ñ Ö× Ý ÒÓ ×Ô ¬ Ö× ÓÑÓ Ù Ð ×Óº Ò ÐÑ ÒØ ¸ Ð ¬ÐØÖÓ ×Ö ÓÒ× Ö Ð Ñ ÒØ Ñ × Ú ÐÓÞ ÕÙ ÙÒ ÓÒØÖ Ô ÖØ × Ö ÔØ Ò ÝÓ Ö ¸ Ù Ò Ó Ñ ÒÓ׸ Ó× ÓÖ Ò × Ñ Ò ØÙ º Ù Ò Ó Ñ Ò ÓÒØÖ ÒÐ ÓÒ ¬Ò Ð ×Ø Ú Ö× ÓÒ ´Å ÖÞÓ ¾¼¼ µ¸ Ù Ö Ð Þ Ö ÕÙ Ð Ø ÜØÓ ÓÒØ Ò ´Ý ÙÒ ÓÒØ Ò µ ÐÓÕÙ × noweb ÓÒ Ô ÞÓ× Ó Ó × Ò ÑÙ Ó Ú ÐÓÖ Ø Ó ÔÓÖ ÑÔÐÓ¸ Ö Ô Ø Ö ÙÒ ÓÒ × ÙÝÓ × ÒØ Ó Ý Ù ÜÔÐ Ó Ò ÓØÖÓ ÐÙ Ö Ô Ö ÓØÖ Ð × Ó ØÓº ÒØÓÒ × × Ò Ö ÓØÖÓ ¬ÐØÖÓ Ø ÜØÓ ÕÙ Ö ÓÒÓÞ Ð Ñ Ø ÓÖ × ÒØÖÓ Ð Ù ÒØ noweb Ý ÕÙ × ÒÚÓ × ÒØ × nowebº Ð ¬ÐØÖÓ × ÒÓÑ Ò nobook¸ Ù × Ö ØÓ Ø Ñ Ò Ò flex Ý Ð Ñ Ò ¸ Ô Ö Ð × Ð Ä Ì ¸ ÐÓ× ÐÓÕÙ × Ð Ñ Ø Ó׺ Cosas que faltan y sobran × ÑÙ × Ô Ö×Ô Ø Ú ×¸ × ÑÔÖ ÙÒ Ø ÜØÓ ÓÐ ÐØ Ð Óº ÕÙ × Ó Ö Ö Ö ÐÓ ÕÙ ¸ Ö Ó ¸ Ù Ö Ó Ô Ö Ø Ñ ÒØ Ö Ð Þ Ö Ý ÐÓ ÕÙ ¸ ÓÒ ÖØ ØÙ ¸ ÒÓ Öº Ö Ó × Ò Ö Ñ ÒØ ÕÙ Ð × ×ØÖÙ ØÙÖ × ØÓ× Ý Ð ÓÖ ØÑÓ× ÙÒ Ñ ÒØ Ð × ×Ø Ò ÔÖ ¹ × ÒØ × Ò ×Ø Ø ÜØÓ ÙÒÕÙ × ÙÖÓ Ð ÙÒ Ô Ö × Ö Ô Ö º ÈÓÖ ÓØÖ Ô ÖØ ¸ Ñ Ø Ö Ð ÕÙ Ñ Ù Ó × ÐØÓ ÒØ Ö ×¸ ÕÙ ×Ø ÔÖ × ÒØ Ò Ð Ð ÓØ ALEPH¸ ÒÓ ×Ø ÔÖ × ÒØ Ò ×Ø Ø ÜØÓº ÄÓ× ÑÔÐÓ× Ñ × ÒÓØ Ð × ÐÐÓ ×ÓÒ Ð × Ð ×Ø × × Ô¸ ÓÐÓÖ Ó× Ö Ó׸ Ñ ÒÓ× ÙÐ Ö ÒÓ× Ý Ñ ÐØÓÒ ÒÓ׸ רÖÙ ØÙÖ × Ö Ó× ÓÒ ÙÖÖ ÒØ ׸ ÒØ × Ý × ÑÙÐ ÓÒ¸ רÖÙ ØÙÖ × Ö Ó× Ý ×Ù× Ð ÓÖ ØÑÓ× × Ó× Ò ÓÐÓÒ × ÓÖÑ × Ý ¹ ÓÑ ØÖ ÓÑÔÙØ ÓÒ Ðº Å Ù × Ùר Ó Ò ÐÙ ÖÐ × Ò ×Ø Ð ÖÓ¸ Ô ÖÓ Ý Ñ ×Ó Ö Ô ×Ó Ð ÑÓÑ ÒØÓ Ý ÓØ Ð Ð Ñ Ø ×Ô Óº ×Ô ØÓ× ÕÙ ÒÓ ×Ø Ò × ÖÖÓÐÐ Ó× Ò ALEPH Ý ÕÙ × Ö Ò ÒÓ× Ò ÐÙ Ö× ×ÓÒ ÐÓ× Ô× ÓÒ ¸ Ð × Ñ Ð × Ö ÓÐ × Ó× × ×Ø Ñ × Ö ÚÓ Ý Ù×ÕÙ
  • 12.
    x Ò ÑÑÓÖ × ÙÒ Ö ´ + Ý Ö Ú Ó×µ Ý ÐÓ× Ö ÓÐ × ÕÙ ØÖ ׺ Ò ×Ø Ø ÜØÓ × Ô Ð Ð Ð Ò Ù ÑÓ Ð Ó ÍÅÄ Ô Ö Ð Ø Ö Ð ÓÑÔÖ × ÓÒ Ö Ð ÓÒ × ÒØÖ Ó ØÓ× º Ö Ó × Ò Ö Ñ ÒØ ÕÙ ÍÅÄ Ø Ò ÑÙ Ó Ú ÐÓÖ Ô Ö ÓÑÔÖ Ò Ö × ×Ø Ñ × ÓÑÔÐ Ó׸ Ý × ÖÖÓÐÐ Ó׸ Ý ÙÒ ÔÓ Ó Ñ ÒÓ× Ú ÐÓÖ¸ ÙÒÕÙ ÔÖ Ð ¸ Ô Ö × Ò ÖÐÓ׺ È ÖÓ Ò ÐÓ ÕÙ Ø Ò ×Ø Ø ÜØÓ Ý ×Ù× ÙÖ×Ó× Ö Ú Ó׸ ÒÓ × ØÖ × Ò ÒØ ÙØ Ð º Deudas ËÙ Ý ÒØ Ð ÙØÓÖ × × ÓÒ ÙÒ Ð × Ñ × Ö Ò × Ð × Ý ØÖ ÑÔ × ×Ø Ø ÑÔÓ Ð Ö Ó ÙØÓÖ Ý¸ Ñ × ÐÐ Ý ÖÖ ÒØ ÙÒ¸ Ð ÔÖÓÔ Ò Ù×ØÖ Ð º ÈÓÖ Ñ × Ö Ø Ö ÔÖ Ñ Ò ÕÙ ÔÙ Ø Ò Ö Ù ÐÕÙ Ö Ó Ö ¸ ר × Ö ÙÒ× Ö Ö × ¸ Ý Ô Ö ¸ ÙÒ ÙÐØÙÖ º Ä ÔÖ Ñ Ö Ù ¸ Ô٠׸ ÕÙ Ù ÐÕÙ Ö Ò Ú ÙÓ ÕÙ Ö ÓÒ ÙÒ ÓÖ × ×Ù ÙÐØÙÖ ¸ Ð Ù Ð Ð ÒØÖ Ð ØÖ × ÓÒ Ó Ö ÙÒר Ò Ð¸ Ò ÓÒÓ Ñ ÒØÓ× Ý × ÒØ Ñ ÒØÓ× Ý ÕÙ ÔÓ× Ð Ø Ò Ò×Ô Ö Ò Ð Ó Ö Ò Ù ×Ø ÓÒº Ò ×Ø Ñ ×ÑÓ ×Ô Ö ØÙ¸ ÙÒ Ú Þ ÒØÖ Ð Ó Ö ¸ Ð × ÙÒ Ù ÕÙ Ö × Ð ÙÐØÙÖ ÕÙ Ö Ý Ö ÓÒÓ Ð Ó Ö º È Ö Ö × Ò Ó ÇÖØ Ý ×× Ø¸ ÙÒÓ × ÙÒÓ Ý ×Ù Ö ÙÒר Ò ¸ Ô ÖÓ¸ Ù ÐÕÙ Ö × ¸ Ò ×Ø × ÑÔÖ × Ò Ù ÒØÖ Ð Ò­Ù Ò ÖÙÑ ÓÖ Ð ÓØÖÓº Å × ÒØÓ¸ Ô٠׸ Ò Ö Ò Ù ÕÙ Ò × × ÒØÓ Ð × Ó ÐÓ ÕÙ ×ÓÝ Ý¸ Ò ÐÓ Ô ÖØ ÙÐ Ö ×Ø Ø ÜØÓ¸ ÕÙ ÐÐÓ× ÕÙ Ò ÖÓÒ ÑÙÝ Ö Ø Ñ ÒØ Ò ×Ù Ð ÓÖ ÓÒº Î ØÓÖ Ö ÚÓ¸ ÖÐÓ× Æ Ú ¸ ÂÙ Ò ÄÙ × Ú × Ý ÂÙ Ò ÖÐÓ× Î Ö × Ù ÖÓÒ Ñ × ÔÖ Ñ ÖÓ× × ÔÙÐÓ× Ò ×Ø Ý Ð Ö × ×Ø Ñ × ×ØÖ Ù Ó׺ Î ØÓÖ ÒרÖÙÑ ÒØÓ Ð ÔÖ Ñ Ö Ú Ö× ÓÒ Ð Ð × LinearHashTable<Key> ÔÖ × ÒØ Ò Ü º½º ´Ô Ò ¿¿µº ÖÐÓ× ÒרÖÙ¹ Ñ ÒØÓ Ð ÔÖ Ñ Ö Ú Ö× ÓÒ ÙÒ × ×Ø Ñ ÓÑÙÒ ÓÒ Ð ÒÚ Ö ÙÖ ×Ùר ÒØ Ó Ò Ð Ù×Ó ALEPH Ð × ×Ø Ñ ÙÒ × ÓÔ Ö Ø ÚÓ ÓÝ Ò º ÂÙ Ò ÖÐÓ× ÒרÖÙÑ ÒØÓ ÐÓ× Ö ÓÐ × ÎÄ Ð Ó× Ý ÓÒ Ö Ò Ó׸ ÐÓ× Ù Ð ×¸ × Ò ÒÓ ×Ø Ò ÔÖ × ÒØ × Ò ×Ø Ø ÜØÓ¸ ×Ù ÒרÖÙÑ ÒØ ÓÒ ÝÙ Ó Ñ ÓÖ Ö Ý ÔÙÖ Ö Ð Ð × Avl Tree<Key>º Ò Ö × Ö Ù ÙÒ Ù×Ù Ö Ó ÒØ Ò× ÚÓ ALEPH ÙÖ ÒØ Ð Ö Ð Þ ÓÒ ×Ù Ø × × Ñ ×ØÖ ¸ ÐÓ ÕÙ Ñ Ô ÖÑ Ø Ó Ú Ö ×Ô ØÓ× ÕÙ ÐÙ Ó Ò ÖÓÒ Ò ÜØ Ò× ÓÒ × Ý Ñ ÓÖ × Ð Ð ÓØ º Ä ÓÒ Ö Ó ÙÒ ¸ Ð Ñ Ö ÓÒØÖ Ö × Ý ÖÐÓ× Óר Ö Ð Þ ÖÓÒ treepic¸ ÔÖ ÙÖ×ÓÖ btreepic ÙÒ ÔÖÓ Ö Ñ Ô Ö Ù Ö ÐÓ× Ö ÓÐ × Ò Ö Ó× ×Ø Ð ÖÓº ÂÓ× Ö ØÓ × Ö Ó xtreepic¸ ÔÖ ÙÖ×ÓÖ ntreepic¸ Ù× Ó Ô Ö Ù Ö Ö ÓÐ × Ý Ö ÓÖ × Ò × Ò Ö Ð ×º ÂÓÖ Ê ÓÒ Ó Ý ÌÓÑ × ÄÓÔ Þ Ö Ð Þ ÖÓÒ Ð × ÔÖ Ñ Ö × ÔÖÙ × × ÑÔ ÒÓ ×Ó Ö ÐÓ× Ú Ö×Ó× Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ º  ×Ù× Ë Ò Þ Ö Ð ÞÓ Ô ÖØ Ð ÑÔÐ ÒØ ÓÒ Ô Ö Ð Ð Ð ÓØ ר Ò Ö C++ Ó ALEPHº Ò ÔÖÙ × × ÑÔ ÒÓ ØÖ ÓÒ Ð ×¸ Ð Ð ÓØ ר Ò Ö Ó ALEPH × Ñ ÓÖ × ÑÔ ÒÓ ÕÙ Ð ÆÍº ÂÙ Ò Ù ÒØ × ÒרÖÙÑ ÒØÓ Ô ÖØ Ý ÔÙÖÓ Ð Ð × Ò Ö Ö ÓÐ Tree Node<T>º ÇÖÐ Ò Ó Î ÙÒ Ò ÓÒØÖÓ ÖÖÓÖ × ÑÔÓÖØ ÒØ × Ò ÐÓ× Ö ÓÐ × Ý ÔÐ ÒØ Ó Ð ÙÒ × ×Ù Ö Ò × ÑÙÝ ÔÖ Ð × ×Ó Ö Ð ×Ø ÐÓ ÑÔÐ ÒØ ÓÒº Ò Ð ÓÒ ÓÒ ×Ø Ø ÜØÓ × Ò ÑÔÐ Ó ÒØ Ö Ñ ÒØ ÔÖÓ Ö Ñ × Ð Ö × Ä Ì ½ ¸ Ì ¾½ ¸ noweb¸ Á Ì ¸ gnu make ¸ imake ½¿ ¸ gnuplot ½½ ¸ R ½ ¸ Maxima ½ ¸ Xfig ¾¿ ¸ dia ¸ Umbrello ¾¾ ¸ doxygen ¸ bcpp ¿ ¸ graphviz ½¼¸ ¸ ¸
  • 13.
    0.0. Bibliograf´ ıa xi ÒØÖ ÓØÖÓ׺ ר Ø ÜØÓ Ý ÐÓ× ÔÖÓ Ö Ñ × Ù ÖÓÒ Ø Ó× ÓÒ gnu Emacs ¾ º ÄÓ× ÔÖÓ Ö Ñ × Ù ÖÓÒ Ñ Ò Ó× ÓÒ ØÓ Ó× ÐÓ× ÙØ Ð Ø Ö Ó× GNU ½ º ÂÙ Ò Ú Ó¸ ÈÖÓ ×ÓÖ Ð ÙÐØ ÀÙÑ Ò × Ð ÍÒ Ú Ö× ÄÓ× Ò ×¸ Ñ ×ÙÔ ÖÚ ×Ó ÐÓ× ÓÑ ÒØ Ö Ó× Ø ÑÓÐÓ Ó× Ò Ð Ø Ò Ý Ö Óº Ð ÙÒ × Ú ×¸ Ð Ó × ÖÚ Ö Ð ÙÒÓ× ×ØÓ× Ý Ø ØÙ × Ò × ÔÙÐÓ׸ Ñ Ô Ö ÒÓØ ÖÐ × Ð ÙÒ × Ñ × Ò× Ò ÒÞ × ÐÓ ÕÙ ÚÓ Ð Ð Ò ÔÓ× Ð Ñ ÑÔÖÓÒØ º È ÖÓ × Ø ÒÓÖ Ó Ð Ö Ö ÕÙ ×ÓÝ ÝÓ¸ Ñ × Ò¸ ÕÙ Ò ÔÓÖØ ×Ù× Ð ÓÒ × Ý¸ ÔÓÖ Ø ÒØÓ¸ ÕÙ Ò Ð × ÜÔÖ × Ö Ø ØÙ º Å × Ñ × ÑÓ× Ô Ö ×¸ Æ ÐÐÝ Ý Ð ×¸ Ò ÓÒØÖ Ù Ó ÐÓ ÕÙ Ñ ØÖ Ù Ö ÓÑÓ ÙÒ × Ò× Ð Ô ÖØ ÙÐ Ö Ð Ø ÒÓÐÓ º Å Ñ Ö Ð ÝÓ Ý ÓÖÖ Ó ÒØ Ö Ñ ÒØ ר ØÖ × Ö ØÓ × ÓÑÓ ÐÐÓ׸ ÓØÖÓÖ Ñ ÓÐ × Ò ¸ Ñ Ò× Ò ÖÓÒ × Ö Ö ÙÒ ÔÓ Óº À Ó × ÖÚ Ó ÕÙ × ØÓ Ó ÙØÓÖ Ð ÖÓ Ø ÜØÓ Ø Ò Ó ÜÔÖ × Ö Ñ ÒØÓ× ×Ù Ñ Ð ´ ×ÔÓ×Ó´ µ Ó´ µ´×µµº Ò Ð ØÖ Ò× ÙÖ×Ó ×Ø ÓÒ Ñ Ô Ö Ø ÕÙ ÐÐÓ ÔÖÓ Ð Ñ ÒØ Ó Þ ÕÙ ÐÐÓ׸ Ò Ñ ×Ó ÓÒ × Ö ÖÖ ×ÔÓÒ× Ð Ò Ð Ò ¸ ÙÒÓ Ð × ÓÐÚ º ÈÓÖ Ö ÞÓÒ × ÑÙÝ ÒØ Ñ ×¸ Ô Ö Ò Ø Ò ×¸ ÒÓ ÔÙ Ó Ñ Ö Ò ÜÔÖ × Ö ÓÑÓ Ý Ù ÒØÓ ×ÓÝ Ö × Ñ ×ÔÓ× ¸ Šи Ô ÖÓ × ÔÙ Ó Ð Ñ Ö ÕÙ ÒÓ × Ö Ò × Ò ÐÐ º Ë ÔÙ × ÓÒ Ý ÐÐ ¸ ÔÓÖ ×Ù ÑÓÖ Ý ×Ù Ô Ö ÓÒ¸ Ñ Ñ ÝÓÖ Ý ÔÖ Ò Ô Ð Ù ººº Ý Ö Ø ØÙ º Bibliograf´ ıa ½ ØØÔ »»ÛÛÛº ÒÙºÓÖ º ¾ ØØÔ »»ÛÛÛº ÒÙºÓÖ »×Ó ØÛ Ö » Ñ ×»º ¿ ØØÔ »» ÒÚ × Ð ¹ ×Ð Ò ºÒ Ø» ÔÔº ØØÔ »»ÛÛÛº Ø ÒºÓÖ º ØØÔ »»ÛÛÛº Ñ ºÓÖ º ØØÔ »»ÛÛÛº ÒÓÑ ºÓÖ »ÔÖÓ Ø×» º ØØÔ »»ÛÛÛº ÓÜÝ ÒºÓÖ º ÐÐ×ÓÒ¸ Ò×Ò Ö¸ ÃÓÙØ×Ó¬Ó׸ ÆÓÖØ ¸ Ò ÏÓÓ ÙÐк Ö Ô Ú Þ ß ÓÔ Ò ×ÓÙÖ Ö Ô Ö Û Ò ØÓÓÐ׺ ÁÒ Ê ÏÁÆ ÓÒ Ö Ò ÓÒ Ö Ô Ö Û Ò ´ µ¸ ¾¼¼½º ÂÓ Ò ÐÐ×ÓÒ¸ Ñ Ò Êº Ò×Ò Ö¸ Ð Ø Ö Ó× ÃÓÙØ×Ó¬Ó׸ ËØ Ô Ò º ÆÓÖØ ¸ Ò ÓÖ¹ ÓÒ ÏÓÓ ÙÐк Ö Ô Ú Þ Ò ÝÒ Ö Ô ß ×Ø Ø Ò ÝÒ Ñ Ö Ô Ö Û Ò ØÓÓÐ׸ ¾¼¼¿º ½¼ Ñ Ò Ò×Ò Ö¸ Ð Ø Ö Ó× ÃÓÙØ×Ó¬Ó׸ Ò ËØ Ô Ò ÆÓÖØ º Ö Û Ò Ö Ô × Û Ø dotº Ì Ò Ð Ö ÔÓÖØ¸ Ì²Ì ÐÐ Ä ÓÖ ØÓÖ ×¸ ÅÙÖÖ Ý À Ðи ÆÂ¸ ÍË ¸ ÖÙ ÖÝ ¾¼¼¾º ½½ ØØÔ »»ÛÛÛº ÒÙÔÐÓØº Ò Óº ½¾ Ú Êº À Ò×ÓÒ Ò Ö ×ØÓÔ Ö Ïº Ö × Öº Ê Ø Ö Ø Ð ÓÑÔ Ð Ö × Ò Ò ÁÑÔÐ Ñ ÒØ Ø ÓÒº ×ÓÒ Ï ×Рݸ ½ º
  • 14.
    xii ½¿ ØØÔ »»ÜÓÖº Ö × ØÓÔºÓÖ º ½ Ò Ö Û Äº ÂÓ Ò×ÓÒ Ò Ö º ÂÓ Ò×ÓÒº Ä Ø Ö Ø ÔÖÓ Ö ÑÑ Ò Ù× Ò ÒÓÛ º Ä ÒÙÜ ÂÓÙÖÒ Ð¸ Ô × ß ¸ Ó ØÓ Ö ½ º ½ ÓÒ Ð º ÃÒÙØ º Ä Ø Ö Ø ÔÖÓ Ö ÑÑ Ò º Ì ÓÑÔÙØ Ö ÂÓÙÖÒ Ð¸ ¾ ´¾µ ß½½½¸ ½ º ½ ØØÔ »»ÛÛÛº Ø ÒºÓÖ º ½ ØØÔ »»Ñ Ü Ñ º×ÓÙÖ ÓÖ ºÒ غ ½ ÛÛÛº ØØÔ »»Ö¹ÔÖÓ ØºÓÖ º ½ ÆÓÖÑ Ò Ê Ñ× Ýº Ä Ø Ö Ø ÔÖÓ Ö ÑÑ Ò × ÑÔÐ ¬ º Á ËÓ ØÛ Ö ¸ ½½´ µ ß½¼ ¸ Ë ÔØ Ñ Ö ½ º ¾¼ ÃÓÞÓ ËÙ Ý Ñ º Ö Ô Ö Û Ò Ò ÔÔÐ Ø ÓÒ× ÓÖ ËÓ ØÛ Ö Ò Ò Ö Ò Ò ÃÒÓÛÐ Ò Ò Ö׸ ÚÓÐÙÑ ½½ Ó ËÓ ØÛ Ö Ò Ò Ö Ò Ò ÃÒÓÛÐ Ò ¹ Ò Ö Ò º ÏÓÖÐ Ë ÒØ ¬ ¸ ¾¼¼¾º ¾½ ØØÔ »»ØÙ ºÓÖ »Ø Ø Ü»º ¾¾ ØØÔ »»ÛÛÛº ºÓÖ º ¾¿ ØØÔ »»ÛÛۺܬ ºÓÖ º
  • 15.
    Contenido ÐÓ Ö ººººººººººººººººººººººººººººººººººººººº Ü 1 Abstracci´n de datos o 1 ½º½ ×Ô ¬ ÓÒ × ØÓ× º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º ¿ ½º½º½ Ì ÔÓ ×ØÖ ØÓ ØÓ º º º º º º º º º º º º º º º º º º ºº º º º º º º ½º½º¾ ÆÓ ÓÒ Ð × Ó ØÓ º º º º º º º º º º º º º º º º ºº º º º º º º ½º½º¿ ÄÓ ×Ù Ø ÚÓ ÙÒ Ó ØÓ º º º º º º º º º º º º º º º º ºº º º º º º º ½º½º ÍÒ ÑÔÐÓ Ì º º º º º º º º º º º º º º º º º º º ºº º º º º º º ½º½º Ð Ð Ò Ù ÍÅÄ º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º ½¼ ½º¾ À Ö Ò º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º ½½ ½º¾º½ Ì ÔÓ× ÖÒ ººººººººººººººººººº º ºº º º º º º º ½¾ ½º¾º¾ ÅÙÐØ Ö Ò º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º ½¿ ½º¾º¿ ÈÓÐ ÑÓÖ¬×ÑÓ º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º ½¿ ½º¾º¿º½ ÈÓÐ ÑÓÖ¬×ÑÓ ×Ó Ö Ö º º º º º º º º º º ºº º º º º º º ½ ½º¾º¿º¾ ÈÓÐ ÑÓÖ¬×ÑÓ ÖÒ ºººººººººº º ºº º º º º º º ½ ½º¾º¿º¿ ÈÓÐ ÑÓÖ¬×ÑÓ ÔÐ ÒØ ÐÐ ´Ø ÔÓ× Ô Ö Ñ ØÖ Þ Ó×µ º º º º º º ½ ½º¾º¿º ÄÓ Ò Ö Ð Ý ÐÓ Ò Ö Ó º º º º º º º º º º º ººº º º º º º º ½ ½º¿ Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð ×ØÖÙ ØÙÖ × ØÓ× º º º º º º ººº º º º º º º ½ ½º¿º½ ÓÑÔ Ö ÓÒ Ò Ö Ð ÒØÖ Ð Ú × º º º º º º º º º º º ººº º º º º º º ½ ½º¿º¾ ÇÔ Ö ÓÒ × Ô Ö ÓÒ ÙÒØÓ× ÓÖ Ò Ð × º º º º º º º º ººº º º º º º º ¾¼ ½º¿º¿ Ö ÙÒר Ò × Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð º º º º º º ººº º º º º º º ¾¼ ½º¿º ÈÖ × ÒØ ÓÒ × Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð º º º º º º ººº º º º º º º ¾½ ½º × ÒÓ ØÓ× Ý ×ØÖ ÓÒ × º º º º º º º º º º º º º º º º ººº º º º º º º ¾½ ½º º½ Ì ÔÓ× ×ØÖ ÓÒ º º º º º º º º º º º º º º º º º º ººº º º º º º º ¾½ ½º º¾ Ð ÔÖ Ò Ô Ó ¬Ò¹ ¹¬Ò º º º º º º º º º º º º º º º º º º ººº º º º º º º ¾¾ ½º º¿ ÁÒ Ù ÓÒ Ý Ù ÓÒ º º º º º º º º º º º º º º º º º ººº º º º º º º ¾¿ ½º º Ç ÙÐØ Ñ ÒØÓ Ò ÓÖÑ ÓÒ º º º º º º º º º º º º º ººº º º º º º º ¾ ½º ÆÓØ × Ý Ö ÓÑ Ò ÓÒ × Ð Ó Ö ¬ × º º º º º º º º º º º º ººº º º º º º º ¾ ½º Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º º º º º ººº º º º º º º ¾ ÐÓ Ö ºººººººººººººººººººººººººººººº ººº º º º º º º ¾ 2 Secuencias 29 ¾º½ ÖÖ ÐÓ× º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¿¼ ¾º½º½ ÇÔ Ö ÓÒ × × × ÓÒ ÖÖ ÐÓ× º º º º º º º º º º º º º º º º º º º º ¿½ ¾º½º½º½ Ö ØÑ Ø ÔÙÒØ ÖÓ× º º º º º º º º º º º º º º º º º º º º ¿½ ¾º½º½º¾ Ù×ÕÙ ÔÓÖ Ð Ú º º º º º º º º º º º º º º º º º º º º º º ¿¾ ¾º½º½º¿ ÁÒ× Ö ÓÒ ÔÓÖ Ð Ú º º º º º º º º º º º º º º º º º º º º º º º ¿¿ Ü
  • 16.
    xiv CONTENIDO ¾º½º½º Ð Ñ Ò ÓÒ ÔÓÖ Ð Ú º º º º º º º º º º º º º º ºº º º º º º ¿¿ ¾º½º¾ Å Ò Ó Ñ ÑÓÖ Ô Ö ÖÖ ÐÓ× º º º º º º º º º º º º º ºº º º º º º ¿ ¾º½º¾º½ ÖÖ ÐÓ× Ò Ñ ÑÓÖ ×Ø Ø º º º º º º º º º º ºº º º º º º ¿ ¾º½º¾º¾ ÖÖ ÐÓ× Ò Ô Ð º º º º º º º º º º º º º º º º º ºº º º º º º ¿ ¾º½º¾º¿ ÖÖ ÐÓ× Ò Ñ ÑÓÖ Ò Ñ º º º º º º º º º ºº º º º º º ¿ ¾º½º¿ ÖÖ ÐÓ× Ø× º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º ¿ ¾º½º ÖÖ ÐÓ× Ò Ñ Ó× º º º º º º º º º º º º º º º º º º º º º ºº º º º º º ½ ¾º½º Ð Ì DynArray<T> º º º º º º º º º º º º º º º º º º º ºº º º º º º ½ ¾º½º º½ רÖÙ ØÙÖ ØÓ× DynArray<T> º º º º º ºº º º º º º ¾ ¾º½º º¾ Å Ò Ó Ñ ÑÓÖ º º º º º º º º º º º º º º º ºº º º º º º ¾º½º º¿ ×Ô ¬ ÓÒ ÑÔÐ ÒØ ÓÒ Ñ ØÓ Ó× ÔÙ Ð Ó× º º º º º ¾º½º º ×Ó Ñ ÒØ ÓÔ Ö ÓÖ [] º º º º º º º º º º ºº º º º º º ¾º½º º Í×Ó Ð Ú ÐÓÖ ÔÓÖ ÓÑ × ÓÒ º º º º º º º º º º º º ºº º º º º º ¾º¾ ÖÖ ÐÓ× ÑÙÐØ Ñ Ò× ÓÒ Ð × º º º º º º º º º º º º º º º º º º º º ºº º º º º º ½ ¾º¿ ÁØ Ö ÓÖ × º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º ¾ ¾º Ä ×Ø × ÒÐ Þ × º º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º ¾º º½ Ä ×Ø × ÒÐ Þ × Ý Ð ÔÖ Ò Ô Ó ¬Ò ¬Ò º º º º º º º º º º ºº º º º º º ¾º º¾ Ð Ì Slink ´ ÒÐ × ÑÔÐ µ º º º º º º º º º º º º º º ºº º º º º º ¾º º¿ Ð Ì Snode<T> ´ÒÓ Ó × ÑÔÐ µ º º º º º º º º º º º º ºº º º º º º ½ ¾º º Ð Ì Slist<T> ´Ð ר × ÑÔÐ Ñ ÒØ ÒÐ Þ µ º º º º ºº º º º º º ¾ ¾º º ÁØ Ö ÓÖ Slist<T> º º º º º º º º º º º º º º º º º º º ºº º º º º º ¿ ¾º º Ð Ì DynSlist<T> º º º º º º º º º º º º º º º º º º º ºº º º º º º ¾º º Ð Ì Dlink ´ ÒÐ Óе ººººººººººººººº ºº º º º º º ¾º º Ð Ì Dnode<T> ´ÒÓ Ó Ó Ð µ º º º º º º º º º º º º º ºº º º º º º ¾º º Ð Ì Dlist<T> ´Ð ר Ö ÙÐ Ö Ó Ð Ñ ÒØ ÒÐ Þ µ ºº º º º º º ¾º º º½ Ð ÔÖÓ Ð Ñ ÐÓ× ×ØÖÙ ØÓÖ × Ú ÖØÙ Ð × º º º ºº º º º º º ¾º º º¾ ÁØ Ö ÓÖ Dlist<T> º º º º º º º º º º º º º º ºº º º º º º ¾ ¾º º½¼ Ð Ì DynDlist<T> º º º º º º º º º º º º º º º º º º º ºº º º º º º ¿ ¾º º½¼º½ ÁØ Ö ÓÖ DynDlist<T> º º º º º º º º º º º º ºº º º º º º ¾º º½½ ÔÐ ÓÒ Ö ØÑ Ø ÔÓÐ ÒÓÑ Ó× º º º º º º º º º º º ºº º º º º º ½¼¼ ¾º º½½º½ ÁÑÔÐ Ñ ÒØ ÓÒ ÔÓÐ ÒÓÑ Ó× º º º º º º º º º ºº º º º º º ½¼½ ¾º È Ð × º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º ½¼ ¾º º½ Ê ÔÖ × ÒØ ÓÒ × ÙÒ Ô Ð Ò Ñ ÑÓÖ º º º º º º º º ºº º º º º º ½¼ ¾º º¾ Ð Ì ArrayStack<T> ´Ô Ð Ú ØÓÖ Þ µ º º º º º º º ºº º º º º º ½¼ ¾º º¿ Ð Ì ListStack<T> ´Ô Ð ÓÒ Ð ×Ø × ÒÐ Þ ×µ º º º ºº º º º º º ½½¾ ¾º º Ð Ì DynListStack<T> º º º º º º º º º º º º º º º º ºº º º º º º ½½ ¾º º ÔÐ ÓÒ ÙÒ Ú ÐÙ ÓÖ ÜÔÖ × ÓÒ × Ö ØÑ Ø × Ò¬ × º º º º º ½½ ¾º º È Ð ×¸ ÐÐ Ñ × ÔÖÓ Ñ ÒØÓ× Ý Ö ÙÖ× ÓÒ º º º º º º ºº º º º º º ½¾¾ ¾º º º½ ÓÒ× Ó× Ô Ö Ð Ö ÙÖ× ÓÒ º º º º º º º º º º º ºº º º º º º ½¾ ¾º º º¾ Ð Ñ Ò ÓÒ Ð Ö ÙÖ× ÓÒ º º º º º º º º º º º ºº º º º º º ½¾ ¾º ÓÐ × º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º ½¿½ ¾º º½ Î Ö ÒØ × Ð × ÓÐ × º º º º º º º º º º º º º º º º º º º ºº º º º º º ½¿¾ ¾º º¾ ÔÐ ÓÒ × Ð × ÓÐ × º º º º º º º º º º º º º º º º º º ºº º º º º º ½¿¾ ¾º º¿ Ê ÔÖ × ÒØ ÓÒ × Ò Ñ ÑÓÖ Ð × ÓÐ × º º º º º º º º ºº º º º º º ½¿¿ ¾º º Ð Ì ArrayQueue<T> ´ ÓÐ Ú ØÓÖ Þ µ º º º º º º º ºº º º º º º ½¿ ¾º º Ð Ì ListQueue<T> ´ ÓÐ ÓÒ Ð ×Ø × ÒÐ Þ ×µ º º º ºº º º º º º ½¿
  • 17.
    CONTENIDO xv ¾º º Ð Ì DynListQueue<T> ´ ÓÐ Ò Ñ ÓÒ Ð ×Ø × ÒÐ Þ ×µ º º ½¼ ¾º רÖÙ ØÙÖ × ØÓ× ÓÑ Ò × ¹ ÅÙÐØ Ð ×Ø × º º º ºººº ººººº º ºº º º ½½ ¾º ÆÓØ × Ð Ó Ö ¬ × º º º º º º º º º º º º º º º º º º ºººº ººººº º ºº º º ½¿ ¾º Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º ºººº ººººº º ºº º º ½ ÐÓ Ö ººººººººººººººººººººººº º º ºººº ººººº º ºº º º ½ 3 Cr´ ıtica de algoritmos 157 ¿º½ Ò Ð × × Ð ÓÖ ØÑÓ× º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ½ ¿º½º½ ÍÒ Ó Ô ×Ó Ù ÓÒ º º º º º º º º º º º º º º º º º º º º º º º ½½ ¿º½º¾ Ð Ö ØÓÖ ×Ó Ö ÐÓ× Ñ ØÓ Ó× ÓÖ Ò Ñ ÒØÓ º º º º º º º º º º º º ½¾ ¿º½º¿ ÇÖ Ò Ñ ÒØÓ ÔÓÖ × Ð ÓÒ º º º º º º º º º º º º º º º º º º º º º º º ½¾ ¿º½º Ù×ÕÙ × Ù Ò Ð º º º º º º º º º º º º º º º º º º º º º º º º º º º ½ ¿º½º ÁÑÔÐ ÒØ ÓÒ Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð Ñ ÒØ DynArray<T> º º ½ ¿º½º Ù×ÕÙ ÜØÖ ÑÓ× º º º º º º º º º º º º º º º º º º º º º º º º º º ½ ¿º½º ÆÓØ ÓÒ O º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ½ ¿º½º º½ Ð Ö O º º º º º º º º º º º º º º º º º º º º º º º º º º ½¾ ¿º½º º¾ Ò Ð × × Ð ÓÖ ØÑÓ× Ñ ÒØ O º º º º º º º º º º º º º º ½¾ ¿º½º ÇÖ Ò Ñ ÒØÓ ÔÓÖ Ò× Ö ÓÒ º º º º º º º º º º º º º º º º º º º º º º º ½ ¿º½º Ù×ÕÙ ÒÖ ººººººººººººººººººººººººººº º º ½ ¿º½º½¼ ÖÖÓÖ × Ð ÒÓØ ÓÒ O º º º º º º º º º º º º º º º º º º º º º º º º º ½ ¿º½º½½ Ì ÔÓ× Ò Ð × × º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ½¼ ¿º¾ Ð ÓÖ ØÑÓ× Ú Ö» ÓÑ Ò Ö º º º º º º º º º º º º º º º º º º º º º º º º º º ½¼ ¿º¾º½ ÇÖ Ò Ñ ÒØÓ ÔÓÖ Ñ Þ Ð º º º º º º º º º º º º º º º º º º º º º º º º ½¾ ¿º¾º½º½ Å Þ Ð ´Ñ Ö µ º º º º º º º º º º º º º º º º º º º º º º º º º ½¾ ¿º¾º½º¾ Ò Ð × × Ð Ñ Ö ×ÓÖØ º º º º º º º º º º º º º º º º º º º º º ½ ¿º¾º½º¿ ר Ð Ð Ñ Ö ×ÓÖØ º º º º º º º º º º º º º º º º º º º ½ ¿º¾º½º Óר Ò ×Ô Ó º º º º º º º º º º º º º º º º º º º º º º º º ½ ¿º¾º½º ÇÖ Ò Ñ ÒØÓ ÔÓÖ Ñ Þ Ð Ð ×Ø × ÒÐ Þ × º º º º º º º º ½ ¿º¾º¾ ÇÖ Ò Ñ ÒØÓ Ö Ô Ó ´ÉÙ ×ÓÖØµ º º º º º º º º º º º º º º º º º º º º ½ ¿º¾º¾º½ È ÖØ ÓÒ º º º º º º º º º º º º º º º º º º º º º º º º º º º º ½ ¿º¾º¾º¾ Ò Ð × × Ð ÕÙ ×ÓÖØ º º º º º º º º º º º º º º º º º º º º º ½ ¿º¾º¾º¿ Ò Ð × × ÓÒ×ÙÑÓ ×Ô Ó Ð ÕÙ ×ÓÖØ º º º º º º º º ½ ¿º¾º¾º Ë Ð ÓÒ Ð Ô ÚÓØ º º º º º º º º º º º º º º º º º º º º º º ½¾ ¿º¾º¾º ÉÙ ×ÓÖØ × Ò Ö ÙÖ× ÓÒ º º º º º º º º º º º º º º º º º º º º ½¿ ¿º¾º¾º ÉÙ ×ÓÖØ ×Ó Ö Ð ×Ø × ÒÐ Þ × º º º º º º º º º º º º º º º ½ ¿º¾º¾º Å ÓÖ × Ð ÕÙ ×ÓÖØ º º º º º º º º º º º º º º º º º º º º º º ½ ¿º¾º¾º ÐÚ×ÖÔ Ø × º º º º º º º º º º º º º º º º º º º º º º º º ½ ¿º¾º¾º ÉÙ ×ÓÖØ ÓÒ ÙÖÖ ÒØ Ó Ô Ö Ð ÐÓ º º º º º º º º º º º º º º º ½ ¿º¾º¾º½¼ Ù×ÕÙ Ð ØÓÖ ÐÚ ºººººººººººººººº º º ½ ¿º¾º¾º½½ Ë Ð ÓÒ Ð ØÓÖ ×Ó Ö × Ù Ò ×ÓÖ Ò × º º º º º º ½ ¿º¿ Ò Ð × × ÑÓÖØ Þ Ó º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¾¼¼ ¿º¿º½ Ò Ð × × ÔÓØ Ò Ð º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¾¼½ ¿º¿º¾ Ò Ð × × ÓÒØ Ð º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¾¼ ¿º¿º¿ Ë Ð ÓÒ Ð ÔÓØ Ò Ð Ó Ö ØÓ× º º º º º º º º º º º º º º º º º º º º ¾¼ ¿º ÓÖÖ Ø ØÙ Ð ÓÖ ØÑÓ× º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¾¼ ¿º º½ ÈÐ ÒØ Ñ ÒØÓ ÙÒ ÑÓ×ØÖ ÓÒ ÓÖÖ Ø ØÙ º º º º º º º º º º ¾¼
  • 18.
    xvi CONTENIDO ¿º º¾ Ì ÔÓ× ÖÖÓÖ × º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¾¼ ¿º º¿ ÈÖ Ú Ò ÓÒ Ý Ø ÓÒ ÖÖÓÖ × º º º º º º º º º º º º º º º º º º º º ¾¼ ¿º º¿º½ × ÔÐ Ò ÔÖÓ Ö Ñ ÓÒ º º º º º º º º º º º º º º º º º º ¾¼ ¿º º¿º¾ Ò Ð × × ×Ø Ø Ó º º º º º º º º º º º º º º º º º º º º º º º º ¾½¿ ¿º º¿º¿ Ò Ð × × Ò Ñ Ó º º º º º º º º º º º º º º º º º º º º º º º ¾½ ¿º ¬ Ý ¬ Ò ºººººººººººººº º º º º º º º º º º º º º º º º º º ¾¾¿ ¿º º½ Ä Ö Ð Ð ¼¹¾¼ º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¾¾ ¿º º¾ Ù Ò Ó Ø ÖÐ ¬ Ò ºººº º º º º º º º º º º º º º º º º º º ¾¾ ¿º º¿ Å Ò Ö × Ñ ÓÖ Ö Ð ¬ Ò º º º º º º º º º º º º º º º º º º º º ¾¾ ¿º º È Ö¬Ð ´ÔÖÓ¬Ð Ò µ º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¾¾ ¿º º ÄÓ Ð Ö ÖÒ ººººººº º º º º º º º º º º º º º º º º º º ¾¿¼ ¿º º Ì ÑÔÓ × ÖÖÓÐÐÓ º º º º º º º º º º º º º º º º º º º º º º º º º º º ¾¿¼ ¿º ÆÓØ × Ð Ó Ö ¬ × º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¾¿½ ¿º Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¾¿¾ ÐÓ Ö ººººººººººººººººººººº º º º º º º º º º º º º º º º º º º ¾¿ ´ 4 Arboles 241 º½ ÓÒ ÔØÓ× × Ó× º º º º º º º º º º º º º º º º º º º º º º ººº º º º º º º º ¾ º¾ Ê ÔÖ × ÒØ ÓÒ × ÙÒ Ö ÓÐ º º º º º º º º º º º º º º º º ººº º º º º º º º ¾ º¾º½ ÓÒ ÙÒØÓ× Ò Ó× º º º º º º º º º º º º º º º º º ººº º º º º º º º ¾ º¾º¾ Ë Ù Ò × Ô Ö ÒØ Þ × º º º º º º º º º º º º º º º ººº º º º º º º º ¾ º¾º¿ ÁÒ ÒØ ÓÒ º º º º º º º º º º º º º º º º º º º º º º ººº º º º º º º º ¾ º¾º ÆÓØ ÓÒ Ûݺ º º º º º º º º º º º º º º º º º ººº º º º º º º º ¾ º¿ Ê ÔÖ × ÒØ ÓÒ × Ö ÓÐ × Ò Ñ ÑÓÖ º º º º º º º º º º ººº º º º º º º º ¾ ¼ º¿º½ Ä ×Ø × ÒÐ Þ × º º º º º º º º º º º º º º º º º º º ººº º º º º º º º ¾ ¼ º¿º¾ ÖÖ ÐÓ× º º º º º º º º º º º º º º º º º º º º º º º º ººº º º º º º º º ¾ ½ º Ö ÓÐ × Ò Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º ººº º º º º º º º ¾ ¾ º º½ Ê ÔÖ × ÒØ ÓÒ Ò Ñ ÑÓÖ ÙÒ Ö ÓÐ Ò Ö Ó º º ººº º º º º º º º ¾ ¿ º º¾ Ê ÓÖÖ Ó× ×Ó Ö Ö ÓÐ × Ò Ö Ó× º º º º º º º º º º ººº º º º º º º º ¾ ¿ º º¿ ÍÒ Ì Ò Ö Ó Ô Ö Ö ÓÐ × Ò Ö Ó× º º º º º º ººº º º º º º º º ¾ ºº ÓÒØ Ò ÓÖ ÙÒ ÓÒ × ×Ó Ö Ö ÓÐ × Ò Ö Ó× º º ººº º º º º º º º ¾ ¾ º º Ê ÓÖÖ Ó× Ö ÙÖ× ÚÓ× º º º º º º º º º º º º º º º º º ººº º º º º º º º ¾ ¿ º º Ê ÓÖÖ Ó× ÒÓ Ö ÙÖ× ÚÓ× º º º º º º º º º º º º º º º ººº º º º º º º º ¾ ºº Ð ÙÐÓ Ð Ö Ò Ð ºººººººººººººº ººº º º º º º º º ¾ ºº Ð ÙÐÓ Ð ÐØÙÖ º º º º º º º º º º º º º º º º º ººº º º º º º º º ¾ ºº ÓÔ Ö ÓÐ × Ò Ö Ó× º º º º º º º º º º º º º º ººº º º º º º º º ¾ º º½¼ רÖÙ ÓÒ Ö ÓÐ × Ò Ö Ó× º º º º º º º º º º º ººº º º º º º º º ¾ º º½½ ÓÑÔ Ö ÓÒ Ö ÓÐ × Ò Ö Ó× º º º º º º º º º º ººº º º º º º º º ¾ º º½½º½ Ë Ñ Ð Ö ººººººººººººººººº ººº º º º º º º º ¾ º º½½º¾ ÕÙ Ú Ð Ò º º º º º º º º º º º º º º º º ººº º º º º º º º ¾ º º½¾ Ê ÓÖÖ Ó ÔÓÖ Ò Ú Ð × º º º º º º º º º º º º º º º º º ººº º º º º º º º ¾ ¼ º º½¿ ÓÒרÖÙ ÓÒ Ö ÓÐ × Ò Ö Ó× Ô ÖØ Ö Ö ÓÖÖ Ó× º º º º º º º º ¾ ½ º º½ ÓÒ ÙÒØÓ ÒÓ Ó× Ò ÙÒ Ò Ú Ð º º º º º º º º º º º ººº º º º º º º º ¾ ¿ º º½ À Ð Ó Ö ÓÐ × Ò Ö Ó× º º º º º º º º º º º º º º ººº º º º º º º º ¾ º º½ Ê ÓÖÖ Ó× Ô× Ù Ó¹ Ð Ó× º º º º º º º º º º º º º º ººº º º º º º º º ¾ º º½ ÓÖÖ ×ÔÓÒ Ò ÒØÖ Ö ÓÐ × Ò Ö Ó× Ý m¹Ö Ó× º ººº º º º º º º º ¾
  • 19.
    CONTENIDO xvii º ÍÒ Ì Ò Ö Ó Ô Ö Ö ÓÐ × º º º º º º º º º º º º º º º º º º º º º º º º º ¾¿ º º½ Ç × ÖÚ ÓÖ × Tree Node<T> º º º º º º º º º º º º º º º º º º º º ¾ º º¾ ÅÓ ¬ ÓÖ × Tree Node<T> º º º º º º º º º º º º º º º º º º º º ¾ º º¿ Ç × ÖÚ ÓÖ × Ö ÓÐ × º º º º º º º º º º º º º º º º º º º º º º º º º ¾ º º Ê ÓÖÖ Ó× ×Ó Ö Tree Node<T> º º º º º º º º º º º º º º º º º º º º ¾ ºº רÖÙ ÓÒ Tree Node<T> º º º º º º º º º º º º º º º º º º º º º ¾ ºº Ù×ÕÙ ÔÓÖ ÒÙÑ ÖÓ ÛÝ ººººººººººººººººººº º ¾¼ ºº Ð ÙÐÓ Ð ÒÙÑ ÖÓ Ûݺºººººººººººººººººººº º ¾¼ ºº ÓÖÖ ×ÔÓÒ Ò ÒØÖ Tree Node<T> Ý Ö ÓÐ × Ò Ö Ó× º º º º º º º ¾¾ º Ð ÙÒÓ× ÓÒ ÔØÓ× Ñ Ø Ñ Ø Ó× ÐÓ× Ö ÓÐ × º º º º º º º º º º º º º º º º º ¾ º º½ ÐØÙÖ ÙÒ Ö ÓÐ º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¾ º º¾ ÄÓÒ ØÙ Ð Ñ ÒÓ ÒØ ÖÒÓ» ÜØ ÖÒÓ º º º º º º º º º º º º º º º º º º ¾ º º¿ Ö ÓÐ × ÓÑÔÐ ØÓ× º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¾ º À Ô× º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¿¼½ º º½ ÁÒ× Ö ÓÒ Ò ÙÒ Ô º º º º º º º º º º º º º º º º º º º º º º º º º º º ¿¼¿ º º¾ Ð Ñ Ò ÓÒ Ò ÙÒ Ô º º º º º º º º º º º º º º º º º º º º º º º º º ¿¼ º º¿ ÓÐ × ÔÖ ÓÖ ººººººººººººººººººººººººººº º ¿¼ º º¿º½ ÅÓ ¬ ÓÒ ÔÖ ÓÖ ºººººººººººººººººº º ¿¼ º º À Ô×ÓÖØ º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¿¼ ºº ÔÐ ÓÒ × ÐÓ× Ô× º º º º º º º º º º º º º º º º º º º º º º º º ¿½¼ ºº Ð Ì BinHeap<Key> º º º º º º º º º º º º º º º º º º º º º º º º º ¿½¾ º º º½ ÁÒØ Ö Ñ Ó ÒØÖ ÒÓ Ó× º º º º º º º º º º º º º º º º º º º º ¿½ º º º¾ ÁÒ× Ö ÓÒ Ò BinHeap<Key> º º º º º º º º º º º º º º º º º ¿½ º º º¿ Ð Ñ Ò ÓÒ Ð Ñ Ò ÑÓ Ð Ñ ÒØÓ ÙÒ BinHeap<Key> º º ¿½ ººº ØÙ Ð Þ ÓÒ Ò ÙÒ Ô º º º º º º º º º º º º º º º º º º º ¿½ ººº Ð Ñ Ò ÓÒ Ù ÐÕÙ Ö Ð Ñ ÒØÓ Ò ÙÒ BinHeap<Key> º ¿½ ººº רÖÙ ÓÒ BinHeap<Key> º º º º º º º º º º º º º º º º ¿½ º ÒÙÑ Ö ÓÒ Ý Ó Ó× Ö ÓÐ × º º º º º º º º º º º º º º º º º º º º º º º ¿¾¼ º º¼º Ó Ó× ÙÒ Ö ÓÐ Ò Ö Ó º º º º º º º º º º º º º º º º º ¿¾½ º º¼º Ó Ó× ººººººººººººººººººººººº º ¿¾ º º½ ÆÙÑ ÖÓ× ØÐÒ ºººººººººººººººººººººººººº º ¿¾ º Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ º º º º º º º º º º º º º º º º º º º º º º º º º º ¿¿¼ º º½ Ù×ÕÙ Ò ÙÒ ººººººººººººººººººººººººº º ¿¿¾ º º½º½ Ù×ÕÙ Ð Ñ ÒÓÖ Ý Ð Ñ ÝÓÖ Ð Ñ ÒØÓ ÙÒ º º ¿¿¿ º º½º¾ Ù×ÕÙ Ð ÔÖ ×ÓÖ Ý ×Ù ×ÓÖ º º º º º º º º º º º º º º ¿¿ º º½º¿ Ù×ÕÙ × ×Ô Ð × ×Ó Ö ÙÒ ºººººººººººº º ¿¿ º º¾ Ð Ì BinTree<Key> º º º º º º º º º º º º º º º º º º º º º º º º º ¿¿ º º¿ ÁÒ× Ö ÓÒ Ò ÙÒ ºººººººººººººººººººººººººº º ¿¿ º º È ÖØ ÓÒ ÙÒ ÔÓÖ Ð Ú ´×ÔРص º º º º º º º º º º º º º º º º º ¿¿ º º ÍÒ ÓÒ Ü ÐÙ× Ú ´ Ó Ò Ü ÐÙ× ÚÓµ º º º º º º º º º º º º º º º º ¿½ ºº Ð Ñ Ò ÓÒ Ò ÙÒ ºººººººººººººººººººººººº º ¿¾ º º ÁÒ× Ö ÓÒ Ò Ö Þ ÙÒ ººººººººººººººººººººº º ¿¿ º º ÍÒ ÓÒ ´ Ó Òµ º º º º º º º º º º º º º º º º º º º º º º º º º º º ¿ ºº Ò Ð × × ÐÓ× Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ º º º º º º º º º º º º º º ¿ º½¼ Ð Ì DynMapTree<Tree, Key, Range, Compare> º º º º º º º º º º º º ¿ º½½ ÜØ Ò× ÓÒ × ÐÓ× Ö ÓÐ × Ò Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º ¿¿
  • 20.
    xviii CONTENIDO º½½º½ Ë Ð ÓÒ ÔÓÖ ÔÓ× ÓÒ º º º º º º º º º º º º º º º º º º º º º º º º º º ¿ º½½º¾ Ð ÙÐÓ Ð ÔÓ× ÓÒ Ò¬ º º º º º º º º º º º º º º º º º º º º º º º ¿ º½½º¿ ÁÒ× Ö ÓÒ ÔÓÖ Ð Ú Ò Ö ÓÐ Ò Ö Ó ÜØ Ò Ó º º º º º º º º º º º º º ¿ º½½º È ÖØ ÓÒ ÔÓÖ Ð Ú º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¿ º½½º ÁÒ× Ö ÓÒ Ò Ö Þ º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¿ º½½º È ÖØ ÓÒ ÔÓÖ ÔÓ× ÓÒ º º º º º º º º º º º º º º º º º º º º º º º º º º ¿ º½½º ÁÒ× Ö ÓÒ ÔÓÖ ÔÓ× ÓÒ º º º º º º º º º º º º º º º º º º º º º º º º º º ¿ º½½º ÍÒ ÓÒ Ü ÐÙ× Ú Ö ÓÐ × ÜØ Ò Ó× º º º º º º º º º º º º º º º º º ¿ º½½º Ð Ñ Ò ÓÒ ÔÓÖ Ð Ú Ò Ö ÓÐ × ÜØ Ò Ó× º º º º º º º º º º º º º º ¿ ¼ º½½º½¼ Ð Ñ Ò ÓÒ ÔÓÖ ÔÓ× ÓÒ Ò Ö ÓÐ × ÜØ Ò Ó× º º º º º º º º º º º º ¿ ¼ º½½º½½ × ÑÔ ÒÓ Ð × ÜØ Ò× ÓÒ × º º º º º º º º º º º º º º º º º º º º º º ¿ ½ º½¾ ÊÓØ ÓÒ Ö ÓÐ × Ò Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º º º º ¿ ½ º½¾º½ ÊÓØ ÓÒ × Ò Ö ÓÐ × Ò Ö Ó× ÜØ Ò Ó× º º º º º º º º º º º º º º º ¿ ¿ º½¿ Ó Ó× ÀÙ«Ñ Ò º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¿ ¿ º½¿º½ ÍÒ Ì Ô Ö Ö ÓÐ × Ó Ó º º º º º º º º º º º º º º º º º º º º º ¿ º½¿º¾ Ó ¬ ÓÒ º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¿ º½¿º¿ Ð ÓÖ ØÑÓ ÀÙ«Ñ Ò º º º º º º º º º º º º º º º º º º º º º º º º º º ¿ º½¿º ¬Ò ÓÒ × Ñ ÓÐÓ× Ý Ö Ù Ò × º º º º º º º º º º º º º º º º º º ¿ ¼ º½¿º Ó ¬ ÓÒ Ø ÜØÓ º º º º º º º º º º º º º º º º º º º º º º º º º º º ¿ ½ º½¿º ÇÔØ Ñ ÓÒ ÀÙ«Ñ Ò º º º º º º º º º º º º º º º º º º º º º º º º º ¿ ¿ º½¿º º½ ÓÒ ÐÙ× ÓÒ º º º º º º º º º º º º º º º º º º º º º º º º º º º ¿ º½ Ö ÓÐ × ×Ø Ø Ó× ÓÔØ ÑÓ× º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¿ º½ º½ Ç Ø ÚÓ Ð ÔÖÓ Ð Ñ º º º º º º º º º º º º º º º º º º º º º º º º º º ¿ º½ º¾ ÁÑÔÐ ÒØ ÓÒ Ð ÔÖÓ Ð Ñ º º º º º º º º º º º º º º º º º º º º º º º ¿ º½ ÆÓØ × Ð Ó Ö ¬ × º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¿ ¾ º½ Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¿ ÐÓ Ö ººººººººººººººººººººººººººº º º º º º º º º º º º º ¿ 5 Tablas hash 399 º½ Å Ò Ó ÓÐ × ÓÒ × º º º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º ¼½ º½º½ Ä Ô Ö Ó Ð ÙÑÔÐ ÒÓ× º º º º º º º º º º º º º º º º º º º ºº º º ¼½ º½º¾ ×ØÖ Ø × Ñ Ò Ó ÓÐ × ÓÒ × º º º º º º º º º º º º º º º ºº º º ¼¿ º½º¿ Ò Ò Ñ ÒØÓ º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º ¼¿ º½º¿º½ Ò Ò Ñ ÒØÓ × Ô Ö Ó º º º º º º º º º º º º º º º ºº º º ¼¿ º½º¿º¾ Ò Ð × × Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó º º º º º º º º ºº º º ¼ º½º¿º¿ Ò Ò Ñ ÒØÓ ÖÖ Ó º º º º º º º º º º º º º º º ºº º º ½½ º½º¿º Ò Ð × × Ò ÓÖÑ Ð Ð Ò Ò Ñ ÒØÓ ÖÖ Ó º º º º ºº º º ½¾ º½º Ö ÓÒ Ñ ÒØÓ ÖØÓ º º º º º º º º º º º º º º º º º º º º ºº º º ½ º½º º½ ËÓÒ Ó Ð ´×ÓÒ Ó ÙÒ ÓÖÑ µ º º º º º º º º º º º ºº º º ½ º½º º¾ ËÓÒ Ó Ð Ò Ð º º º º º º º º º º º º º º º º º º º º º º ºº º º ½ º½º º¿ Ò Ð × × Ò ÓÖÑ Ð Ð ×ÓÒ Ó Ð Ò Ð º º º º º º º º º º ºº º º ¾¼ º½º º ËÓÒ Ó Ù Ö Ø Ó º º º º º º º º º º º º º º º º º º º ºº º º ¾¿ º½º º ÓÐ × ººººººººººººººººººººº º º ºº º º ¾ º½º º Ò Ð × × Ò ÓÖÑ Ð Ð Ó Ð × º º º º º º º º º º º ºº º º ¾ º½º Ê Ùר Ñ Ò× ÓÒ Ò ÙÒ Ø Ð × º º º º º º º º º º º ºº º º ¿¼ º½º Å Ò Ó Ò Ñ Ó Ù Ø × ´Ì DynLhashTable<Key, Record>µ ¿¾
  • 21.
    CONTENIDO xix º½º Ì Ð × × ÐÒ Ð × º º º º º º º º º º º º º º º º º º º ºº º º º º º º ¿¿ º½º º½ ÜÔ Ò× ÓÒ» ÓÒØÖ ÓÒ ÙÒ Ø Ð × Ð Ò Ð º º º º º º ¿ º½º º¾ Ù×ÕÙ Ò LinearHashTable<Key> º º º ºº º º º º º º ¿ º½º º¿ ÁÒ× Ö ÓÒ Ò LinearHashTable<Key> º º º º ºº º º º º º º ¼ º½º º Ð Ñ Ò ÓÒ Ò LinearHashTable<Key> º º ºº º º º º º º ¼ º½º º Ò Ð × × Ð ×Ô Ö× ÓÒ Ð Ò Ð º º º º º º º º ºº º º º º º º ¼ º¾ ÙÒ ÓÒ × × º º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º º¾º½ ÁÒØ Ö Þ Ð ÙÒ ÓÒ × º º º º º º º º º º º º º º º º ºº º º º º º º º¾º¾ ÀÓÐ ÙÖ ×Ô Ö× ÓÒ º º º º º º º º º º º º º º º º º º ºº º º º º º º º¾º¿ ÈÐ Ó Ó Ó Ð Ó Ð Ú º º º º º º º º º º º º º º º ºº º º º º º º º¾º À ÙÖ ×Ø × ×Ô Ö× ÓÒ º º º º º º º º º º º º º º º º ºº º º º º º º º¾º º½ ×Ô Ö× ÓÒ ÔÓÖ Ú × ÓÒ º º º º º º º º º º º º ºº º º º º º º º¾º º¾ ×Ô Ö× ÓÒ ÔÓÖ ÑÙÐØ ÔÐ ÓÒ º º º º º º º º º ºº º º º º º º º¾º ×Ô Ö× ÓÒ Ò× Ö ØÖ× ºººººººººº ºº º º º º º º ½ º¾º ×Ô Ö× ÓÒ ÙÒ Ú Ö× Ð º º º º º º º º º º º º º º º º º º º ºº º º º º º º ½ º¾º ×Ô Ö× ÓÒ Ô Ö Ø º º º º º º º º º º º º º º º º º º º º ºº º º º º º º ¾ º¿ ÇØÖÓ× Ù×Ó× Ð × Ø Ð × × Ý Ð ×Ô Ö× ÓÒ º º º º º º º º ºº º º º º º º ¿ º¿º½ Á ÒØ ¬ ÓÒ Ò× ºººººººººººººººº ºº º º º º º º ¿ º¿º¾ ËÙÔ ÖØÖ Þ º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º º¿º¿ ´ Ð Ì Hash Cache<Key,Data> µ º º º º º º º ºº º º º º º º º ÆÓØ × Ð Ó Ö ¬ × º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º º Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º ÐÓ Ö ººººººººººººººººººººººººººººººº ºº º º º º º º ¼ ´ 6 Arboles de b´squeda equilibrados u 473 º½ ÕÙ Ð Ö Ó Ö ÓÐ × º º º º º º º º º º º º º º º º º ºº º º º º º º º º º º º º º¾ Ö ÓÐ × Ð ØÓÖ Þ Ó× º º º º º º º º º º º º º º º º º ºº º º º º º º º º º º º º º¾º½ Ð Ì Rand Tree<Key> º º º º º º º º º º ºº º º º º º º º º º º º º º¾º½º½ ÁÒ× Ö ÓÒ Ò ÙÒ ºººººº ºº º º º º º º º º º º º º º¾º½º¾ Ð Ñ Ò ÓÒ Ò ÙÒ ººººº ºº º º º º º º º º º º º º ¼ º¾º¾ Ò Ð × × ÐÓ× Ö ÓÐ × Ð ØÓÖ Þ Ó× º º º º ºº º º º º º º º º º º º º ¾ º¿ ÌÖ Ô× º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º º º º º º º º¿º½ Ð Ì Treap<Key> º º º º º º º º º º º º ºº º º º º º º º º º º º º º¿º¾ ÁÒ× Ö ÓÒ Ò ÙÒ ØÖ Ô º º º º º º º º º º º º ºº º º º º º º º º º º º º º¿º¿ Ð Ñ Ò ÓÒ Ò ØÖ Ô º º º º º º º º º º º º º ºº º º º º º º º º º º º º ¼ º¿º Ò Ð × × ÐÓ× ØÖ Ô× º º º º º º º º º º º º º ºº º º º º º º º º º º º º ¾ º¿º ÈÖ ÓÖ × ÑÔÐ Ø × º º º º º º º º º º º º ºº º º º º º º º º º º º º º Ö ÓÐ × ÎÄ º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º º º º º º º º º½ Ð Ì Avl Tree<Key> º º º º º º º º º º ºº º º º º º º º º º º º º º º½º½ ÁÒ× Ö ÓÒ Ò ÙÒ Ö ÓÐ ÎÄ º º º º ºº º º º º º º º º º º º º º º½º¾ Ð Ñ Ò ÓÒ Ò ÙÒ Ö ÓÐ ÎÄ º º º ºº º º º º º º º º º º º º ¼½ º º¾ Ò Ð × × ÐÓ× Ö ÓÐ × ÎÄ º º º º º º º º º ºº º º º º º º º º º º º º ¼ º º¾º½ Ö ÓÐ × ÓÒ ººººººº ºº º º º º º º º º º º º º ¼ º º¾º¾ ÑÓ×ØÖ ÓÒ Ð ÔÖÓÔÓ× ÓÒ º º º º º º º º º º º º º º ½½ º Ö ÓÐ × ÖÓ Ó¹Ò ÖÓ º º º º º º º º º º º º º º º º º º ºº º º º º º º º º º º º º ½¿ º º½ Ð Ì Rb Tree<Key> º º º º º º º º º º º ºº º º º º º º º º º º º º ½
  • 22.
    xx CONTENIDO º º½º½ ÁÒ× Ö ÓÒ Ò ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ º º º º º º º º º º º º º º º ½ º º½º¾ Ð Ñ Ò ÓÒ Ò ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ º º º º º º º º º º º º º ¾¼ º º¾ Ò Ð × × ÐÓ× Ö ÓÐ × ÖÓ Ó¹Ò ÖÓ º º º º º º º º º º º º º º º º º º º º ¾ º Ö ÓÐ × ×ÔÐ Ý º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¿¼ º º½ Ð Ì Splay Tree<Key> º º º º º º º º º º º º º º º º º º º º º º º ¿¾ º º¾ Ò Ð × × ÐÓ× Ö ÓÐ × ×ÔÐ Ý º º º º º º º º º º º º º º º º º º º º º º º ¿ º ÓÒ ÐÙ× ÓÒ º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¾ º ÆÓØ × Ð Ó Ö ¬ × º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ÐÓ Ö ºººººººººººººººººººººººººº º º º º º º º º º º º º º 7 Grafos 559 º½ ÙÒ Ñ ÒØÓ× º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ½ º¾ רÖÙ ØÙÖ × ØÓ× Ô Ö Ö ÔÖ × ÒØ Ö Ö Ó× º º º º º º º º º º º º º º º º º º º¾º½ Å ØÖ × Ý Ò ººººººººººººººººººº º º º º º º º¾º¾ Ä ×Ø × Ý Ò ººººººººººººººººººººº º º º º º º º¿ ÍÒ Ì Ô Ö Ö Ó× ´List Graph<Node, Arc>µ º º º º º º º º º º º º º º º º¿º½ Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¼ º¿º¾ Ö Ó× ´List Digraph<Node, Arc>µ º º º º º º º º º º º º º º º º ½ º¿º¿ ÆÓ Ó× º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ½ º¿º¿º½ ÁÒ× Ö ÓÒ ÒÓ Ó× º º º º º º º º º º º º º º º º º º º º º º º ¾ º¿º¿º¾ Ð Ñ Ò ÓÒ ÒÓ Ó× º º º º º º º º º º º º º º º º º º º º º ¾ º¿º¿º¿ ×Ó ÐÓ× ÒÓ Ó× ÙÒ Ö Ó º º º º º º º º º º º º º º º º ¿ º¿º Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º¿º º½ ÁÒ× Ö ÓÒ Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º¿º º¾ Ð Ñ Ò ÓÒ Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º¿º º¿ ×Ó ÐÓ× Ö Ó× ÙÒ Ö Ó º º º º º º º º º º º º º º º º º¿º ØÖ ÙØÓ× ÓÒØÖÓÐ ÒÓ Ó× Ý Ö Ó× º º º º º º º º º º º º º º º º º ¼ º¿º º½ Ø× ÓÒØÖÓÐ º º º º º º º º º º º º º º º º º º º º º º º º º ¼ º¿º º¾ ÓÒØ ÓÖ × º º º º º º º º º º º º º º º º º º º º º º º º º º º ¿ º¿º º¿ ÓÓ × º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¿ º¿º º Ê Ò Ó ÒÓ Ó× Ý Ö Ó× º º º º º º º º º º º º º º º º º º º º¿º Å ÖÓ× ×Ó ÒÓ Ó× Ý Ö Ó× º º º º º º º º º º º º º º º º º º º º º¿º ÓÒרÖÙ ÓÒ Ý ×ØÖÙ ÓÒ List Graph<Node, Arc> º º º º º º º¿º ÇÔ Ö ÓÒ × Ò Ö × ×Ó Ö ÒÓ Ó× º º º º º º º º º º º º º º º º º º º º¿º ÇÔ Ö ÓÒ × Ò Ö × ×Ó Ö Ö Ó× º º º º º º º º º º º º º º º º º º º º¿º½¼ ÁÑÔÐ ÒØ ÓÒ List Graph<Node, Arc> º º º º º º º º º º º º º º º¿º½¼º½ ×Ó ÒÓ Ó× Ý Ö Ó× º º º º º º º º º º º º º º º º º º º º º¿º½¼º¾ Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ½ º¿º½¼º¿ ÁÒ× Ö ÓÒ ÒÓ Ó× º º º º º º º º º º º º º º º º º º º º º º º º¿º½¼º ÁÒ× Ö ÓÒ Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º¿º½¼º Ð Ñ Ò ÓÒ Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º¿º½¼º Ð Ñ Ò ÓÒ ÒÓ Ó× º º º º º º º º º º º º º º º º º º º º º º¿º½¼º Ä ÑÔ Þ Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º¿º½¼º Å Ô Ó ÒÓ Ó× Ý Ö Ó× º º º º º º º º º º º º º º º º º º º º º¿º½¼º ÓÔ Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º ¼¼
  • 23.
    CONTENIDO xxi º¿º½¼º½¼ ÇÖ Ò Ñ ÒØÓ Ö Ó× º º º º º º º º º º º º º º º º º º º º ¼½ º Ì Ñ ÒÓ ×Ó Ö ÙÒ Ö Ó ´Path<GT>µ º º º º º º º º º º º º º º º º º º º º ¼¾ º Ê ÓÖÖ Ó× ×Ó Ö Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¼ º º½ ÁØ Ö ÓÖ × ¬ÐØÖÓ º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¼ º º½º½ ÁØ Ö ÓÖ ¬ÐØÖÓ Ö Ó× ÙÒ ÒÓ Ó º º º º º º º º º º º º º º ¼ º º½º¾ ÁØ Ö ÓÖ ¬ÐØÖÓ Ö Ó× º º º º º º º º º º º º º º º º º º º º º ½¼ º º½º¿ ÁØ Ö ÓÖ ¬ÐØÖÓ ÒÓ Ó× º º º º º º º º º º º º º º º º º º º º ½¼ º º¾ Ê ÓÖÖ Ó Ò ÔÖÓ ÙÒ ººººººººººººººººº º º º º º º º ½¼ º º¿ ÓÒ Ø Ú ÒØÖ Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º ½ º º Ê ÓÖÖ Ó Ò ÑÔÐ ØÙ º º º º º º º º º º º º º º º º º º º º º º º º º º ½ º º ÈÖÙ ÐÓ× º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ½ º º ÈÖÙ Ð ººººººººººººººººººº º º º º º º º ½ ºº Ù×ÕÙ Ñ ÒÓ× ÔÓÖ ÔÖÓ ÙÒ ºººººººººº º º º º º º º ¾½ º º º½ ÈÖÙ Ü ×Ø Ò º º º º º º º º º º º º º º º º º º º º º º ¾½ º º º¾ Ù×ÕÙ Ñ ÒÓ ÒØÖ Ó× ÒÓ Ó× º º º º º º º º º º º º ¾¿ ºº Ù×ÕÙ Ñ ÒÓ× ÔÓÖ ÑÔÐ ØÙ º º º º º º º º º º º º º º º º º º º ¾ ºº Ö ÓÐ × Ö ÓÖ × ÔÖÓ ÙÒ ººººººººººº º º º º º º º ¾ º º½¼ Ö ÓÐ × Ö ÓÖ × ÑÔÐ ØÙ º º º º º º º º º º º º º º º º º º º º ¿¼ º º½½ Ö ÓÐ × Ö ÓÖ × Ò ÖÖ ÐÓ× º º º º º º º º º º º º º º º º º º º º º ¿½ º º½¾ ÓÒÚ Ö× ÓÒ ÙÒ Ö ÓÐ Ö ÓÖ ÙÒ Tree Node<T> º º º º º º º º ¿¿ º º½¿ ÓÑÔÓÒ ÒØ × Ò ÓÒ ÜÓ× ÙÒ Ö Ó º º º º º º º º º º º º º º º º º º ¿ º º½ ÈÙÒØÓ× ÖØ ÙÐ ÓÒ ÙÒ Ö Ó º º º º º º º º º º º º º º º º º º º ¿ º º½ ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× ÐÓ× ÔÙÒØÓ× ÓÖØ º º º º º º º º º º º º º ¼ º º½ º½ È ÒØ Ó ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× º º º º º º º º º º º º º º º ¾ º º½ º¾ ÓÔ Ñ Ô ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× º º º º º º º º º º º Å ØÖ × Ý Ò ººººººººººººººººººººººº º º º º º º º º º½ Ð Ì Map Matrix Graph<GT> º º º º º º º º º º º º º º º º º º º º º º¾ Ð Ì Matrix Graph<GT> º º º º º º º º º º º º º º º º º º º º º º ¿ º º¿ Ð Ì Ady Mat<GT, Entry> º º º º º º º º º º º º º º º º º º º º º ºº Ð Ì Bit Mat Graph<GT> º º º º º º º º º º º º º º º º º º º º º º ºº Ð ÓÖ ØÑÓ Ï Ö× ÐÐ º º º º º º º º º º º º º º º º º º º º º º º º º º ½ º ÌÓÔ Ó× ×Ó Ö Ö Ó× Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º º º º º½ ÓÒ Ø Ú ÒØÖ Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º º¾ ÁÒÚ Ö× ÓÒ ÙÒ Ö Ó º º º º º º º º º º º º º º º º º º º º º º º º º º º¿ ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ× ÙÒ Ö Ó º º º º º º º º º º º º º¿º½ Ð ÓÖ ØÑÓ ÃÓ× Ö Ù º º º º º º º º º º º º º º º º º º º º º º¿º¾ Ð ÓÖ ØÑÓ Ì Ö Ò º º º º º º º º º º º º º º º º º º º º º º º º ÈÖÙ Ð ººººººººººººººººººº º º º º º º º ºº Ð ÙÐÓ ÐÓ× Ò ÙÒ Ö Ó º º º º º º º º º º º º º º º º º º º º º ºº Ö Ó× Ð Ó× ´ µº º º º º º º º º º º º º º º º º º º º º º º º º º º ÈÐ Ò ¬ ÓÒ Ø Ö × º º º º º º º º º º º º º º º º º º º º º º º º º º º º ÇÖ Ò Ñ ÒØÓ ØÓÔÓÐÓ Ó º º º º º º º º º º º º º º º º º º º º º º º º ¼ º Ö ÓÐ × Ö ÓÖ × Ñ Ò ÑÓ× º º º º º º º º º º º º º º º º º º º º º º º º º º º º½ ×Ó ÐÓ× Ô ×Ó× Ð Ö Ó º º º º º º º º º º º º º º º º º º º º º º º º º¾ Ð ÓÖ ØÑÓ ÃÖÙ× Ð º º º º º º º º º º º º º º º º º º º º º º º º º º º º¾º½ Ò Ð × × Ð Ð ÓÖ ØÑÓ ÃÖÙ× Ð º º º º º º º º º º º º º º ¼½
  • 24.
    xxii CONTENIDO º º¾º¾ ÓÖÖ Ø ØÙ Ð Ð ÓÖ ØÑÓ ÃÖÙ× Ð º º º º º º º º º º º º ¼½ º º¿ Ð ÓÖ ØÑÓ ÈÖ Ñ º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¼¾ º º¿º½ ÁÒØ Ö Þ Ð Ð ÓÖ ØÑÓ ÈÖ Ñ º º º º º º º º º º º º º º º º ¼¾ º º¿º¾ À Ô Ü ÐÙ× ÚÓ Ö Ó× Ñ Ò ÑÓ× º º º º º º º º º º º º º º º ¼¾ º º¿º¿ ÁÒ Ð Þ ÓÒ Ð Ð ÓÖ ØÑÓ ÈÖ Ñ º º º º º º º º º º º º º ¼ º º¿º Ð Ð ÓÖ ØÑÓ ÈÖ Ñ º º º º º º º º º º º º º º º º º º º º º ¼ º º¿º Ò Ð × × Ð Ð ÓÖ ØÑÓ ÈÖ Ñ º º º º º º º º º º º º º º º º ¼ º º¿º ÓÖÖ Ø ØÙ Ð Ð ÓÖ ØÑÓ ÈÖ Ñ º º º º º º º º º º º º º º ¼ º Ñ ÒÓ× Ñ Ò ÑÓ× º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ½¼ º º½ Ð ÓÖ ØÑÓ ×ØÖ º º º º º º º º º º º º º º º º º º º º º º º º º º ½½ º º½º½ ר Ò ÙÑÙÐ Ò ÐÓ× ÒÓ Ó× º º º º º º º º º º º º º º ½¾ º º½º¾ ÈÓØ Ò Ð Ò ÐÓ× Ö Ó× º º º º º º º º º º º º º º º º º º º º º ½ º º½º¿ Ð Ð ÓÖ ØÑÓ ×ØÖ º º º º º º º º º º º º º º º º º º º ½ º º½º Ð ÙÐÓ ÙÒ Ñ ÒÓ Ñ Ò ÑÓ º º º º º º º º º º º º º º º º ½ º º½º ÓÖÖ Ø ØÙ Ð Ð ÓÖ ØÑÓ ×ØÖ º º º º º º º º º º º º ½ º º½º Ò Ð × × Ð Ð ÓÖ ØÑÓ ×ØÖ º º º º º º º º º º º º º º ¾¼ º º¾ Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ º º º º º º º º º º º º º º º º º º º º º º ¾¼ º º¾º½ ÁÒØ Ö × º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¾½ º º¾º¾ Ð Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ º º º º º º º º º º º º º º º ¾¾ º º¾º¿ Ò Ð × × Ð Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ º º º º º º º º º º ¾ º º¾º ÓÖÖ Ø ØÙ Ð Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ º º º º º º º º ¾ º º¾º Ê ÙÔ Ö ÓÒ Ñ ÒÓ× º º º º º º º º º º º º º º º º º º º ¾ º º¿ Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ º º º º º º º º º º º º º º º º º º º º º º º ¾ º º¿º½ ÁÒ Ð Þ ÓÒ Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ º º º º º º º º ¾ º º¿º¾ Å Ò Ó Ð Ö ÓÐ Ö ÓÖ º º º º º º º º º º º º º º º º º º ¿¼ º º¿º¿ Ð Ð ÓÖ ØÑÓ Ò Ö Ó ÐÐÑ Ò¹ ÓÖ º º º º º º º º º º º º º ¿¼ º º¿º Ð ÓÖ ØÑÓ Ñ ÓÖ Ó ÐÐÑ Ò¹ ÓÖ º º º º º º º º º º º º ¿½ º º¿º Ø ÓÒ ÐÓ× Ò Ø ÚÓ× º º º º º º º º º º º º º º º º º ¿ º º¿º ÓÒרÖÙ ÓÒ Ð Ö ÓÐ Ö ÓÖ º º º º º º º º º º º º º º ¿ º º¿º Ò Ð × × Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ º º º º º º º º º º º ¿ º º¿º ÓÖÖ Ø ØÙ Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ º º º º º º º º º ¿ º º¿º Ù×ÕÙ ÐÓ× Ò Ø ÚÓ× º º º º º º º º º º º º º º º º º ¿ º º¿º½¼ Ð ÙÐÓ ÐÓ× Ò Ø ÚÓ× Ò ÙÒ Ö Ó º º º º º º º º º º ½ ºº × Ù× ÓÒ ×Ó Ö ÐÓ× Ð ÓÖ ØÑÓ× Ñ ÒÓ× Ñ Ò ÑÓ× º º º º º º º º º º ¾ º½¼ Ê × ­Ù Ó º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¿ º½¼º½ ¬Ò ÓÒ × Ý ÔÖÓÔ × ÙÒ Ñ ÒØ Ð × º º º º º º º º º º º º º º º ¿ º½¼º¾ Ð Ì Net Graph<TNode,TArc,T> º º º º º º º º º º º º º º º º º º º½¼º¿ Å Ò Ó× Ú Ö Ó× Ù ÒØ × Ó ×ÙÑ ÖÓ× º º º º º º º º º º º º º º º º º º½¼º ÇÔ Ö ÓÒ × ØÓÔÓÐÓ × ×Ó Ö ÙÒ Ö Ô Ø ºº º º º º º º º º º½¼º ÓÖØ × Ö º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¾ º½¼º ÐÙ Ó Ñ Ü ÑÓ» ÓÖØ Ñ Ò ÑÓ º º º º º º º º º º º º º º º º º º º º º º º º½¼º Ñ ÒÓ× ÙÑ ÒØÓ º º º º º º º º º º º º º º º º º º º º º º º º º º º º½¼º Ð ÙÐÓ Ð Ö Ö × Ù Ð º º º º º º º º º º º º º º º º º º º º º º º º º½¼º Ð ÙÐÓ Ñ ÒÓ× ÙÑ ÒØÓ º º º º º º º º º º º º º º º º º º º º º ½ º½¼º½¼ ÁÒ Ö Ñ ÒØÓ Ð ­Ù Ó ÔÓÖ ÙÒ Ñ ÒÓ ÙÑ ÒØÓ º º º º º º º º º º º º ¾ º½¼º½½ Ð Ð ÓÖ ØÑÓ ÓÖ ¹ ÙÐ Ö×ÓÒ º º º º º º º º º º º º º º º º º º º º º ¿
  • 25.
    CONTENIDO xxiii º½¼º½½º½ Ò Ð × × Ð Ð ÓÖ ØÑÓ ÓÖ ¹ ÙÐ Ö×ÓÒ º º º º º º º º º º º½¼º½¾ Ð Ð ÓÖ ØÑÓ ÑÓÒ ×¹Ã ÖÔ º º º º º º º º º º º º º º º º º º º º º º½¼º½¾º½ Ò Ð × × Ð Ð ÓÖ ØÑÓ ÑÓÒ ×¹Ã ÖÔ º º º º º º º º º º ¼ º½¼º½¿ Ð ÓÖ ØÑÓ× ÑÔÙ Ý ÔÖ ¹­Ù Ó º º º º º º º º º º º º º º º º º º º º ¾ º½¼º½¿º½ ÐØÙÖ ÙÒ ÒÓ Ó º º º º º º º º º º º º º º º º º º º º º º º ¿ º½¼º½¿º¾ Ð ÓÖ ØÑÓ Ò Ö Ó ÔÖ ¹­Ù Ó º º º º º º º º º º º º º º º º ¿ º½¼º½¿º¿ Î ÐÓÖ × Ò Ð × Ð ÙÒ ÓÒ ÐØÙÖ º º º º º º º º º º º º½¼º½¿º Å Ò Ó Ð ÓÒ ÙÒØÓ Ah º º º º º º º º º º º º º º º º º º º º º½¼º½¿º ÁÑÔÐ ÒØ ÓÒ Ð Ð ÓÖ ØÑÓ Ò Ö Ó º º º º º º º º º º º º º ¼ º½¼º½¿º Ò Ð × × Ð Ð ÓÖ ØÑÓ ÔÖ ¹­Ù Ó º º º º º º º º º º º º º º ¾ º½¼º½¿º ÑÔÙ ÔÖ ¹­Ù Ó Á Ç º º º º º º º º º º º º º º º º º º º º½¼º½¿º ÑÔÙ ÔÖ ¹­Ù Ó ÓÒ Ñ ÝÓÖ ×Ø Ò º º º º º º º º º º º½¼º½¿º ÑÔÙ ÔÖ ¹­Ù Ó ÓÒ ÓÐ Ð ØÓÖ º º º º º º º º º º º º ¾ º½¼º½¿º½¼ Ð ÓÖ ØÑÓ Ò Ö Ó ÑÔÙ ÔÖ ¹­Ù Ó ÔÓÖ Ö Ó× º º º º º½¼º½¿º½½ ÓÒ ÐÙ× ÓÒ ×Ó Ö Ð ÓÖ ØÑÓ× ÔÖ ¹­Ù Ó º º º º º º º º º º º ¼½ º½¼º½ Ð ÙÐÓ Ð ÓÖØ Ñ Ò ÑÓ º º º º º º º º º º º º º º º º º º º º º º º º ¼½ º½¼º½ ÙÑ ÒØÓ Ó ×Ñ ÒÙ ÓÒ ­Ù Ó ÙÒ Ö º º º º º º º º º º º º º º ¼ º½½ Ê Ù ÓÒ × Ð ÔÖÓ Ð Ñ Ð ­Ù Ó Ñ Ü ÑÓ º º º º º º º º º º º º º º º º º º º ¼ º½½º½ ÐÙ Ó Ñ Ü ÑÓ Ò Ö × ÒÓ¹ Ö × º º º º º º º º º º º º º º º º º º º ¼ º½½º¾ Ô × Ò ÒÓ Ó× º º º º º º º º º º º º º º º º º º º º º º º º º º ¼ º½½º¿ ÐÙ Ó Ö Ð Þ Ð º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ½¼ º½½º Å Ü ÑÓ ÑÔ Ö Ñ ÒØÓ Ô ÖØ Ó º º º º º º º º º º º º º º º º º º º ½½ º½½º º½ ÐÙ Ó Ñ Ü ÑÓ Ý ÑÔ Ö Ñ ÒØÓ Ô ÖØ Ó º º º º º º º º º ½¿ º½½º º¾ Ò Ð × × Ð ÑÔ Ö Ñ ÒØÓ Ô ÖØ Ó ÔÓÖ ­Ù Ó Ñ Ü ÑÓ º º ½ º½½º º¿ Ð ÙÐÓ Ð ¹Ô ÖØ ÓÒ º º º º º º º º º º º º º º º º º º º ½ º½½º º ÓÒרÖÙ ÓÒ Ð Ö Ô ÖØ Ø º º º º º º º º º º º º º º º ½ º½½º º ÜØÖ ÓÒ Ð ÑÔ Ö Ñ ÒØÓ Ð Ö Ñ Ü Ñ Þ ººº ½ º½½º º ÁÑÔÐ ÒØ ÓÒ ¬Ò Ð Ð ÑÔ Ö Ñ ÒØÓ Ö ÒÐ Ñ ÜÑ º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ½ º½½º Ö ÙÐ ÓÒ × º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ½ º½½º ÓÒ Ø Ú Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º º º ¾¼ º½½º º½ Ð Ø ÓÖ Ñ Å Ò Ö º º º º º º º º º º º º º º º º º º º º º ¾½ º½½º º¾ Ð ÙÐÓ Ke(G) º º º º º º º º º º º º º º º º º º º º º º º ¾½ º½½º º¿ ÁÑÔÐ ÒØ ÓÒ Ð Ð ÓÖ ØÑÓ Ð ÙÐÓ Ke(G) º º º º º º ¾¾ º½½º º Ò Ð × × Ð Ð ÓÖ ØÑÓ º½¼ º º º º º º º º º º º º º º º º º º ¾ º½½º Ð ÙÐÓ Kv(e) º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¾ º½¾ ÐÙ Ó× Óר Ñ Ò ÑÓ º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¾ º½¾º½ Ð Ì Net Max Flow Min Cost<TNode,TArc,T> º º º º º º º º º º ¿½ º½¾º½º½ ×Ó Ð Óר ÙÒ Ö Ó º º º º º º º º º º º º º º º º º º ¿¾ º½¾º¾ Ð ÓÖ ØÑÓ× Ñ Ü ÑÓ ­Ù Ó ÓÒ Óר Ñ Ò ÑÓ Ñ ÒØ Ð Ñ Ò ÓÒ ÐÓ× º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¿¿ º½¾º¾º½ Ð Ñ Ò ÓÒ ÐÓ× ÓÒ ­Ù Ó Ñ Ü ÑÓ Ò Ð º º º º º º º ¿¿ º½¾º¾º¾ Ð Ñ Ò ÓÒ ÐÓ× Ñ ÒØ ×ÙÔÖ ¹ Ö Ó Ò Ø ÚÓ º º º º ¿¿ º½¾º¿ Ò Ð × × ÐÓ× Ð ÓÖ ØÑÓ× × Ó× Ò Ð Ñ Ò ÓÒ ÐÓ× Ò Ø ÚÓ× ¿ º½¾º ÈÖÓ Ð Ñ × ÕÙ × Ö Ù Ò ÒÙÒ Ó× ­Ù Ó Ñ Ü ÑÓ Óר Ñ Ò ÑÓ º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¿
  • 26.
    xxiv CONTENIDO º½¾º º½ ÌÖ Ò×ÔÓÖØ º º º º º º º º º º º º º º º º º º º º º º º º º º º ¿ º½¾º º¾ ÌÖ × ÓÖ Ó º º º º º º º º º º º º º º º º º º º º º º º º º º º ¿ º½¾º º¿ × Ò ÓÒ ØÖ Ó× º º º º º º º º º º º º º º º º º º º º º½¾º º Ñ ÒÓ Ñ Ò ÑÓ º º º º º º º º º º º º º º º º º º º º º º º º º½¾º º ÈÐ Ò ¬ ÓÒ º º º º º º º º º º º º º º º º º º º º º º º º º º º½¿ ÈÖÓ Ö Ñ ÓÒ Ð Ò Ð º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¼ º½¿º½ ÓÖÑ ×Ø Ò Ö ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð º º º º º º º º º º º º º º º º º ¾ º½¿º¾ Å Ò Ñ Þ ÓÒ¸ ÒÓ Ñ Ü Ñ Þ ÓÒ¸ Ð ÙÒ ÓÒ Ó Ø ÚÓ º º º º º º º º ¾ º½¿º¿ Î Ö Ð × ÓÒ Ö ×ØÖ ÓÒ × Ò Ø Ú × º º º º º º º º º º º º º º º º º º ¿ º½¿º¿º½ Ê ×ØÖ ÓÒ × ÙÐ ºººººººººººººººº º º º ¿ º½¿º Ê ×ØÖ ÓÒ × Ñ ÝÓÖ Ó Ù Ð º º º º º º º º º º º º º º º º º º º º º º º ¿ º½¿º ÍÒ ÑÔÐÓ º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¿ º½¿º ÓÖÑ ÓÐ ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð º º º º º º º º º º º º º º º º º½¿º Ð Ñ ØÓ Ó × ÑÔÐ Ü º º º º º º º º º º º º º º º º º º º º º º º º º º º º º½¿º º½ ×ÕÙ Ñ Ò Ö Ð º º º º º º º º º º º º º º º º º º º º º º º º º½¿º º¾ ¬Ò ÓÒ Ð ÙÒ ÓÒ Ó Ø ÚÓ º º º º º º º º º º º º º º º º½¿º º¿ ¬Ò ÓÒ Ð × Ö ×ØÖ ÓÒ × º º º º º º º º º º º º º º º º º º½¿º º Ä ×ØÖÙ ØÙÖ ØÓ× º º º º º º º º º º º º º º º º º º º º º½¿º º Ë Ð ÓÒ Ð Ô ÚÓØ º º º º º º º º º º º º º º º º º º º º º º º½¿º º È ÚÓØ Ó º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ¼ º½¿º ÓÒ ÐÙ× ÓÒ ×Ó Ö Ð ÔÖÓ Ö Ñ ÓÒ Ð Ò Ð º º º º º º º º º º º º º º º º ¾ º½ Ê × ­Ù Ó Ý ÔÖÓ Ö Ñ ÓÒ Ð Ò Ð º º º º º º º º º º º º º º º º º º º º º º ¾ º½ º½ ÓÒÚ Ö× ÓÒ ÙÒ Ö Ô Ø Óר × ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð º º ¾ º½ º¾ Ê × Ò Ö Ð Þ × º º º º º º º º º º º º º º º º º º º º º º º º º º º ¿ º½ º¿ Ô × ÓØ × º º º º º º º º º º º º º º º º º º º º º º º º º º º½ º Ê × ÓÒ Ö ×ØÖ ÓÒ × Ð Ø Ö Ð × º º º º º º º º º º º º º º º º º º º º º½ º Ê × ÑÙÐØ ¹­Ù Ó º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º½ º Ê × ÔÖÓ × Ñ ÒØÓ º º º º º º º º º º º º º º º º º º º º º º º º º º½ º º½ Ò × ÔÖÓ Ù ÓÒ º º º º º º º º º º º º º º º º º º º º º½ Ð × ÑÔÐ Ü Ô Ö Ö × ­Ù Ó º º º º º º º º º º º º º º º º º º º º º º º º º º º½ º½ ÓÒ ÐÙ× ÓÒ ×Ó Ö Ð ÔÖÓ Ð Ñ Ð ­Ù Ó Ñ Ü ÑÓ Óר Ñ Ò ÑÓ º º º º½ ÆÓØ × Ð Ó Ö ¬ × º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º½ Ö Ó× º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ½ ÐÓ Ö ºººººººººººººººººººººººººººººººººººº º º º ´ Indice de identificadores 893
  • 27.
    Cap´ ıtulo 1 Abstracci´n de datos o ר Ø ÜØÓ ÓÒ ÖÒ Ð × ÒÓ ÑÔÐ ÒØ ÓÒ ×ØÖÙ ØÙÖ × ØÓ× Ý Ð ÓÖ ØÑÓ× ÕÙ ÒרÖÙÑ ÒØ Ò ×ÓÐÙ ÓÒ × ÔÖÓ Ð Ñ × Ñ ÒØ ÔÖÓ Ö Ñ × ÓÑÔÙØ ÓÖº ÍÒ Ð ÓÖ ØÑÓ × ÙÒ × Ù Ò ¬Ò Ø ÒרÖÙ ÓÒ × ÕÙ ÓÑ Ø Ð ÓÒ× Ù ÓÒ ÙÒ ¬Òº Í× ÑÓ× Ð ÓÖ ØÑÓ× Ò Ú Ö×Ó× ÓÒØ ÜØÓ× Ð Ú ÔÓÖ ÑÔÐÓ¸ Ù Ò Ó ÔÖ Ô Ö ÑÓ× ÙÒ ÔÐ ØÓ ÓÑ × ÙÒ Ð ÙÒ Ö Ø º Ä ÙÐØÙÖ ÒÓ× Ò ÙÐ Ó Ð ÙÒÓ× Ð ÓÖ ØÑÓ× ¸ ÙÐØÙÖ Ð ×¸ ÒÓ Ò ØÙÖ Ð ×½ ¸ Ô Ö × ÒÚÓÐÚ ÖÒÓ× ×Ó ÐÑ ÒØ ÔÓÖ ÑÔÐÓ׸ Ð Ð ÓÖ ØÑÓ ÓÒ Ù Ö ÙÒ ÙØÓÑÓÚ Ð Ó Ð Ð ÓÖ ØÑÓ Ô Ö ÖÙÞ Ö ÙÒ ÐÐ º Ò Ñ Ó× ÑÔÐÓ׸ Ð ¬Ò ÕÙ × ÔÐ ÒØ × ÖÖ Ö ÙÒ × Ø Óº Ë ÙÒ ÃÒÙØ ¸ Ð Ø ÖÑ ÒÓ Ð ÓÖ ØÑÓ ÔÖÓÚ Ò Ð ÒÓÑ Ö Ð Ò ×ØÖ Ð Ñ Ø Ñ Ø Ó Ð¹Ã Û Ö ÞÑ ¸ Ð È Ö× ¸ Ô ÖØ Ð ØÙ Ð ÁÖ Ò¸ Ö ÓÒ Ð ÔÐ Ò Ø ÑÙÝ ÑÒÞ × Ö ÓÖÖ ÐÑÔº Ð¹Ã Û Ö ÞÑ Ø Ñ Ò ÔÖÓÚ Ò Ð Ô Ð Ö Ð Ö ¸ ÓÑ Ò Ó × Ù ÖØÓ ÔÓÖ Ú Þ ÔÖ Ñ Ö Ò Ð ØÙ Ð ÒÚ Ó Ý × ×Ø Ó ÁÖ Õº È Ö Ð ÓÒ× Ù ÓÒ ÙÒ ¬Ò × ÑÔÐ Ò Ñ Ó× º Ò Ð ×Ó ÙÒ ÔÐ ØÓ¸ ÐÓ× Ñ Ó× ÕÙ × ÙØ Ð Þ Ò ×ÓÒ ÐÓ× ÒרÖÙÑ ÒØÓ× Ó Ò Ò Ö ÒØ × Ð Ó Ò ÖÓ¸ ÕÙ Ò ÔÙ ÒØ ÖÔÖ Ø Ö× Ø Ñ Ò ÓÑÓ ÙÒ Ñ Ó¸ ÓÒ Ù ¸ Ò ÙÒ ÓÖ Ò ×Ô ¬ Ó¸ ÐÓ× Ò Ö ÒØ × mediante ÐÓ× ÒרÖÙÑ ÒØÓ׺ Ä × Ù Ò Ù ÓÒ¸ Ó × ¸ Ð Ð ÓÖ ØÑÓ¸ × ÙÒ Ñ ÒØ Ð Ô Ö ÓÒ× Ù Ö Ð ÔÐ ØÓ Ò Ù ×Ø ÓÒº ÍÒ ÐØ Ö ÓÒ Ð ÓÖ Ò ÔÓ× Ð Ñ ÒØ ÖÖ Ö ÙÒ ÐØ Ö ÓÒ ×Ó Ö Ð × ÓÖ Ð ÔÐ ØÓº ÙÖ ÒØ Ð ÔÖ Ô Ö ÓÒ ÙÒ ÔÐ ØÓ¸ Ð Ó Ò ÖÓ Ö ÕÙ Ö Ô Ö Ö Ý Ö ÓÖ Ö Ð × Ù Ò Ù ÓÒº Ð Ö ÕÙ Ö ¸ ÔÓÖ ÑÔÐÓ¸ ×Ó Ö Ö Ð ÙÒÓ× Ð ÒÓ× ÒØ × Ñ Þ Ð ÖÐÓ× ÓÒ Ð ÖÒ º Ë ÙÒ Ð ÜÔ Ö Ò Ý Ð ÓÑÔÐ ¸ × ÔÓ× Ð ÕÙ Ð Ó Ò ÖÓ ÐÐ Ú ÒÓØ × ÕÙ Ñ ÑÓÖ Ò Ð ×Ø Ó ÔÖ Ô Ö ÓÒ ÔÓÖ ÑÔÐÓ¸ ÒÓØ Ö Ð ÓÖ Ò ÕÙ ÓÑ ÒÞÓ ÓÖÒ Öº Ò ØÓ Ó ÑÓÑ ÒØÓ¸ ÓÒ ÒÓØ × Ó × Ò ÐР׸ Ð Ó Ò ÖÓ Ö ÕÙ Ö Ø Ò Ö ÓÒ× Ò Ð ×Ø Ó Ò Ð Ù Ð × Ù Ð ÔÖ Ô Ö ÓÒ Ö ×Ô ØÓ ×Ù Ö Ø º È Ö ÐÐÓ¸ Ð × × ÖÚ ×Ù Ñ ÑÓÖ º Ò Ð ×Ó ÙÒ ÔÖÓ Ö Ñ ¸ Ð ÓÑÔÙØ ÓÖ ÙÒ Ó Ò ÖÓ¸ Ð Ù Ð ÙØ ¬ ÐÑ ÒØ Ð × Ö Ø × ÕÙ × Ð ÔÖÓÔÓÖ ÓÒ Òº Ð ÓÑÔÙØ ÓÖ ×¸ ÒØÓÒ ×¸ ÙÒ ÙØÓÖ ÕÙ ÓÖ Ò Þ Ý Ù× Ð ÙÒÓ× Ñ Ó× Ô Ö Ð ÒÞ Ö Ð ×ÓÐÙ ÓÒ Ð ÙÒ ÔÖÓ Ð Ñ ¸ × ÙÒ Ð ÙÒ Ö Ø ÐÐ Ñ ÔÖÓ Ö Ñ Ý ÕÙ Ö Ù Ö ×Ø Ó× Ð ÙÐÓ× Ñ ÒØ ÙÒ Ñ ÑÓÖ º Ô ÖØ Ð È͸ ÕÙ Ò ÙÒ Ó Ò ÖÓ¸ Ð ÓÑÔÙØ ÓÖ × Ú Ð ÙÒ Ñ Ó ÙÒ ¹ Ñ ÒØ Ð Ð Ñ ÑÓÖ º ÔÓÖ × ¸ Ð Ñ ÑÓÖ Ò ÖÙØÓ × ÙÒ × Ù Ò ÖÓ× Ý ÙÒÓ× ÙÝÓ × ÒØ Ó ÐÓ ÑÔ ÖØ Ð ÔÖÓ Ö Ñ ÓÖ Ò ÓÖÑ ØÓ× º ½ Ò ×ØÓ× Ø ÑÔÓ× ×ØÓ ÒÓ × Ø Ò Ó Ú Óº ÁÒ Ö Ð Ñ ÒØ ¸ Ö Ò Ô ÖØ Ð ÙÐØÙÖ × ÓÒ ÙÒ ÓÒ Ð Ò ØÙÖ º ½
  • 28.
    2 Cap´ ıtulo 1. Abstracci´n de datos o Ù ÐÕÙ Ö ÔÖÓ Ö Ñ ÕÙ ÓÔ Ö Ò ÙÒ ÓÑÔÙØ ÓÖ ÔÙ Ú Ö× Ò Ó× Ô ÖØ × Ð × ÙÒ ÒרÖÙ ÓÒ × Ù ÓÒ Ý ÐÓ× ØÓ׺ Ä × ÒרÖÙ ÓÒ × ×ÓÒ Ö ×ÙÐØ Ó ÕÙ ÐÐÓ ÕÙ × Ö ÑÓ× ÓÑÓ Ó Ó Ù ÒØ º Ò Ó × ÓÒ ×¸ Ð × ÒרÖÙ ÓÒ × ÔÙ Ò Ò Ö¹ Ö× ÙÖ ÒØ Ð Ù ÓÒ Ð ÔÖÓ Ö Ñ º ÄÓ× ØÓ× Ö ÔÖ × ÒØ Ò Ð ×Ø Ó Ð ÙÐÓ Ò Ð ÙÒ ÑÓÑ ÒØÓ Ð Ø ÑÔÓ Ù ÓÒº Ä ÔÐ Ö ØÓ ÔÖÓÚ Ò Ð Ð Ø Ò “datum”¸ ÕÙ × Ð Ô ÖØ Ô Ó Ô × Ó Ó ´ Öµº ØÓ ÓÒÒÓØ ¸ Ô٠׸ Ð Ó ÕÙ Ù Ó Ò Ð Ô × Ó Ý ÕÙ ÒÓ× ÒØ Ö × Ö ÓÖ Ö × × Ð × ÒØ Ó ÕÙ × Ñ ÑÓÖ Þ Óº Ò Ð ×Ó Ð ÔÖÓ Ö Ñ ÓÒ¸ ÙÒ ØÓ Ö Ù Ö ÙÒ Ô ÖØ Ð ×Ø Ó Ù ÓÒ Ð ÔÖÓ Ö Ñ º Ð Ñ Ò ÑÓ Ò Ú Ð ÓÖ Ò Þ ÓÒ ÙÒ ØÓ × ×Ù “tipo”º ÍÒ Ø ÔÓ ØÓ ¬Ò ÙÒ ÓÒ ÙÒØÓ ÓÑÔÙ ×ØÓ ÔÓÖ ØÓ Ó× ÐÓ× Ú ÐÓÖ × ÕÙ ÔÙ ÕÙ Ö Ö ÙÒ Òר Ò Ð ØÓº ÍÒ Ø ÔÓ ØÓ ÔÙ ÓÒ ÓÖÑ Ö× ÔÓÖ Ú Ö Ó× Ø ÔÓ× ØÓ׺ Ò ×Ø ×Ó¸ ÐÓ Ð × ¬¹ ÑÓ× Ò ØÓ רÖÙ ØÙÖ Ó Ó ×ØÖÙ ØÙÖ ØÓ× º Ò Ð ÙÒÓ× ×Ó׸ ÐÓ× ØÓ× ÔÙ Ò × Ö Ö ÙÖ× ÚÓ× ´Ö ÙÖÖ ÒØ ×¾ µ × Ö¸ × ÙÒ Ð Ø ÔÓ ØÓ¸ × Ö ÙÖÖ Ò × Ñ ×ÑÓ× Ó ÒØÖ ÐÐÓ׺ Ð ÙÒÓ× ÑÔÐÓ× Ò C++ ÔÓ Ö Ò Ö ÐÙÞ ×Ø ×ÙÒØÓº È Ö Ö ÔÖ × ÒØ Ö ÒÙÑ ÖÓ× ÒØ ÖÓ׸ × ÙØ Ð Þ Ð Ø ÔÓ ØÓ int¸ Ð Ù Ð Ò ÕÙ ×Ù Ú ÐÓÖ Ô ÖØ Ò Ð ÓÒ ÙÒØÓ Zº Ò ×Ø ×Ó ÒÓ × Ò Ö ÓÑÓ × Ö ÔÖ × ÒØ Ð Ø ÔÓ int Ò Ð Ñ ÑÓÖ ÙÒ ÓÑÔÙØ ÓÖ Ò ÔÙ Ö ØÖ Ø Ö× 19¸ 937 Ó 2535301200456458802993406410049¸ ÒØÖ Ò¬Ò ØÓ× Ú ÐÓÖ × ÔÓ× Ð ×º È Ö Ö ÔÖ × ÒØ Ö ÒÙÑ ÖÓ× Ö Ð ×¸ ÕÙ Ô ÖØ Ò Ò R¸ Ù× ÑÓ× Ð Ø ÔÓ floatº Ì ÔÓ Ñ × ÒØ Ö × ÒØ ÕÙ Ð ÒØ Ö ÓÖ ÔÓÖÕÙ ØÖ ×ÐÙ Ô ÖØ ×Ù ÑÔÐ ÒØ ÓÒ Ò Ð Ñ ÑÓÖ ÙÒ ÓÑÔÙØ ÓÖ Ù Ò Ó ÜÔÖ × ¸ Ñ ÒØ Ð ÒÓÑ Ö float¸ ÕÙ Ð Ö ÔÖ × ÒØ ÓÒ Ð ÒÙÑ ÖÓ × Ò ÔÙÒØÓ ­ÓØ ÒØ × Ö¸ ר רÖÙ ØÙÖ Ò ØÖ × ÑÔÓ× ÓÖÑ × Ñ Ð Ö Ð × Ù ÒØ 0 00001000 001011110010110001001010 Ë ÒÓ ÜÔÓÒ ÒØ È ÖØ Ö ÓÒ Ð Ð × ÒØ Ó ×Ø רÖÙ ØÙÖ × ØÙ Ö Ö Ô Ñ ÒØ ×ÙÑ × Ñ ÒØ Ùר Ð ÜÔÓÒ ÒØ Ý Ð Ô ÖØ Ö ÓÒ Ðº ÙÒÕÙ ÒÓ ÓÒÓ ÑÓ× Ð Ø Ñ ÒÓ ÐÓ× ÑÔÓ× ÒØ Ö ÓÖ ×¸ Ð ÓÒÓ Ñ ÒØÓ Ð ×ØÖÙ ØÙÖ Ý Ð Ñ Ò Ö Ñ Ò ÔÙÐ ÖÐ ÒÓ× Ð ÖØ ×Ó Ö Ð Ð Ö Ò Ú Ø Ð ÖÖÓÖ Ö ÓÒ Ó ÕÙ Ó ÙÖÖ Ù Ò Ó ØÖ ÑÓ× ÓÒ Ö ØÑ Ø ­ÓØ ÒØ º È Ö ÐÙ×ØÖ Ö ÙÒ ØÓ Ö ÙÖÖ ÒØ ÒÓ× Ú Ð Ö ÑÓ× Ð Ø ÔÓ Ð Ñ ÒØÓ × Ù Ò ¾ ¸ ÙÝ ×Ô ¬ ÓÒ Ò C++ ÔÙ ÔÐ ÒØ Ö× ÓÑÓ × Ù ¾ Ð Ñ ÒØÓ × Ù Ò ¾ ≡ struct Elemento { int dato; Elemento * siguiente_elemento; }; Ð Ñ ÒØÓ × Ù Ò ¾ ÑÓ Ð Þ ÙÒ Ð Ñ ÒØÓ ÒØ ÖÓ Ô ÖØ Ò ÒØ ÙÒ × Ù Ò º ÆÓØ ÑÓ× ÕÙ Ð ØÖ ÙØÓ siguiente elemento × Ö ¬ Ö ÙÒ struct Elemento Ò Ð Ö ÓÒ Ò Ñ ÑÓÖ Ð × Ù ÒØ Ð Ñ ÒØÓ Ò Ð × Ù Ò º Ò ×Ô ÒÓи × ÓÑÓ Ò Ð Ñ ÝÓÖ ¾ Ð × Ð Ò Ù × ÖÓÑ Ò ×¸ Ü ×Ø Ð Ø ÖÑ ÒÓ Ö ÙÖÖ Ö ¸ Р٠и × ÙÒ ×Ù Ö Þ Ð Ø Ò Ö ÙÖÖÓ¸ ÓÒÒÓØ ¸ ÚÓÐÚ Ö ¸ Ö Ö × Ö º Ò Ò Ð × Ð Ö Þ × Ð Ñ ×Ñ ¸ Ô ÖÓ × Ò Ö ÙÖ×Ù׸ ÕÙ × Ò ¬ ÚÙ ÐØ ¸ Ö ØÓÖÒÓ º Ò ×Ø Ø ÜØÓ × ÔÖ Ö Ò Ö ÙÖ× ÓÒ Ò ÐÙ Ö Ö ÙÖÖ Ò º
  • 29.
    1.1. Especificaciones dedatos 3 Ú Ö×Ó× ÒØ Ö × × Ò Ò Ò Ð × ÒÓ ÙÒ ×ØÖÙ ØÙÖ ØÓ׺ ÒØÖ ÐÓ× Ñ × Ø Ô Ó× ÔÓ ÑÓ× ×Ø Ö Ð ÓÑÔÖ Ò× ÓÒ Ý Ñ Ò ÔÙÐ ÓÒ Ð ÔÖÓ Ö Ñ ÔÓÖ Ô ÖØ Ð ÔÖÓ Ö Ñ ÓÖ¸ Ð × ÑÔ ÒÓ Ý Ð ÔØ ÓÒ ÙÒ Ð ÓÖ ØÑÓ Ó ÓÒ ÔØÓ Ô ÖØ ÙÐ Öº Ò Ð ÑÔÐÓ Ð Ø ÔÓ float¸ Ý Ó× Ö Ø Ö ×Ø × × Ú ×º Ä ÔÖ Ñ Ö × ÕÙ Ð × ÓÔ Ö ÓÒ × Ö ØÑ Ø × ×ÓÒ ÑÙÝ Ö Ô ×º Ó¸ × ÑÔÖ ØÓÑ Ò Ø ÑÔÓ ÓÒר ÒØ Ò Ô Ò ÒØ Ð Ú ÐÓÖ Ô ÖØ ÙÐ Ö Ð ØÓº Ä × ÙÒ Ö Ø Ö ×Ø ÓÒ ÖÒ Ð ×Ô Ó × Ö¸ ØÓ Ò ÔÙÒØÓ ­ÓØ ÒØ × ÑÔÖ Ó ÙÔ Ð Ñ ×Ñ ÒØ ×Ô Ó¸ Ù ×Ø ÓÒ ÕÙ ÒÓ ×Ù Ö × Ù× Ö ÑÓ× Ö ØÑ Ø Ö ØÖ Ö º È Ö ÐÓ× Ø ÔÓ× ØÓ× ÕÙ ÑÓ× ÑÔÐ ¬ Ö ´int Ý floatµ¸ ×ÔÓÒ ÑÓ× ÙÒ ÓÒ Ó ÙÐØÙÖ Ð¸ Ñ Ø Ñ Ø Ó Ý ÔÖÓ Ö Ñ ÓÒ¸ ÕÙ ÒÓ× Ô ÖÑ Ø × Ò Ð ÖÐÓ× Ý ÓÑÔÖ Ò¹ ÖÐÓ× × Ò Ò × Ø ÐÐ Ö Ñ ÒÙ Ó× Ñ ÒØ Ò ÕÙ ÓÒ× ×Ø Òº Ë ÑÓ׸ × Ò Ø Ò Ö ÕÙ Ò ÖÐÓ ÜÔÐ Ø Ñ ÒØ ¸ ÕÙ Ü ×Ø Ò Ð × ÓÔ Ö ÓÒ × Ö ØÑ Ø × ØÖ ÓÒ Ð × ×ÙÑ ¸ Ö ×Ø ¸ ÔÖÓ Ù ØÓ Ý Ú × ÓÒ¸ × ÓÑÓ ÕÙ Ò Ý Ù Ð × ×ÓÒ ×Ù× Ö ×ÙÐØ Ó׺ 1.1 Especificaciones de datos ËÙÔÓÒ ÑÓ× ÕÙ ÙÒ Ó Ò ÖÓ ÓÒ×ÙÑ Ó × × Ö Ö ÙÒ ×Ù× Ö Ø × Ô Ö ÚÙй ÖÐ ÓØÖÓ× Ó Ò ÖÓ׺ Ò ×Ø × ØÙ ÓÒ¸ × ÙÒ Ð ÓÖÔÙ× Ó Ò Ø ÚÓ ×Ù ÜÔ Ö Ò ¸ Ð Ó Ò ÖÓ ×ÙÑ ÕÙ ×Ù× Ð ØÓÖ × ÔÓ× Ò ÙÒ Ð Ò Ù ÓÑÙÒ ÕÙ Ð × Ð Ø Ö ÒØ Ò Ö Ð × ÒרÖÙ ÓÒ × ×Ù Ö Ø º ÈÓÖ ÑÔÐÓ¸ × Ö ÕÙ Ö ÕÙ Ð Ó Ò ÖÓ Ý ×Ù× Ð ØÓÖ × Ø Ò Ò Ð Ñ ×ÑÓ ÓÒ ÔØÓ ÐÓ ÕÙ × ÙÒ ÓÐÐ º Ò ÐÑÖÓ × ÐÒÙ ÓÑÙÒ¸ Ð Ö Ø × Ö ÔÖ × ÒÓ ÓÒØ Ò Ö Ñ Ù × ÕÙ ÐÓÕÙ Ò Ð ÙØ ÒØ º Ñ ×¸ × Ö ÓÑÔÐ Ø Ò Ð × ÒØ Ó ÕÙ Ð ÙØ ÒØ ÔÖ Ô Ö ÔÐ Ò Ñ ÒØ Ð ÔÐ ØÓ Ò Ù ×Ø ÓÒº Ò Ð Ô Ö Ô ÓÒ Ð ÔÖ Ò Þ ÔÖÓ Ö Ñ ÓÒ Ü ×Ø ÙÒ Ö Ò × Ò Ð ÒØÖ Ð ¹ ÓÖ Ö ÙÒ ÔÐ ØÓ Ó Ò Ý ÙØ Ö ÙÒ ÔÖÓ Ö Ñ º Ò Ó Ò × ÓÔ Ö ×Ó Ö Ó× × ÓÒ Ö Ø × Ô Ö Ð Ô Ö Ô ÓÒ ÙÑ Ò º Ò ÔÖÓ Ö Ñ ÓÒ Ð ÓÑÔÙØ ÓÖ ÓÔ Ö ×Ó Ö ØÓ× ÓÒ Ö ¹ ØÓ× Ò ×Ù Ñ ÑÓÖ ¸ Ô ÖÓ ×ØÖ ØÓ× Ô Ö ÒÙ ×ØÖ Ô Ö Ô ÓÒº ÈÖ ÙÒØ ÑÓ×ÒÓ׸ Ü ×Ø ÙÒ ÒÙÑ ÖÓ Ü ×Ø ÙÒ ÖÖ ÐÓ º Ò ÒÙ ×ØÖ Ñ ÒØ ¸ ÙÒ ÖÖ ÐÓ ÓÒר ØÙÝ ÙÒ ×ØÖ ÓÒ ÕÙ ÒÓ × ÔØ ÓÒ ÒÙ ×ØÖ Ô Ö Ô ÓÒ × Ò×ÓÖ Ðº Ò Ð ÓÑÔÙØ ÓÖ ÒÓ Ø Ò × ÒØ Ó Ð ×ØÖ ÓÒ ÖÖ ÐÓ¸ ÔÙ × ×Ø ÒÓ ÒØ Ò ÐÓ ÕÙ × ÙÒ ÒÙÑ ÖÓ Ó ÖÖ ÐÓº Ò Ð ×Ó Ð ÔÖÓ Ö Ñ ÓÒ¸ × ÓÑÓ Ò ÓØÖÓ× ÓÑ Ò Ó× Ö Ú Ó× Ð Ñ Ø Ñ Ø ¸ ÙÒ ÒÙÑ ÖÓ Ó ÙÒ ÖÖ ÐÓ ×ÓÒ ÓÒ ÔØÓ× ×ØÖ ØÓ× ÕÙ ÓÒ ÓÖÑ Ò ÙÒ Ð Ò Ù ÓÑÙÒ Ô Ö ÓÑÙÒ ÖÐÓ× Ý Ô ÖÑ Ø Ö Ð ÓÒרÖÙ ÓÒ Ñ × ÓÒ ÔØÓ׺ ÒØÖ ÔÖÓ Ö Ñ ÓÖ ×¸ × ÓÑÓ Ò Ð Ö ×ØÓ Ð × ÔÖ Ø ×¸ × ÑÙÝ ÑÔÓÖØ ÒØ ×ÔÓÒ Ö ÙÒ ÓÖÔÙ× ÓÑÙÒ¸ ×Ó Ö Ð Ñ Ò Ö ×ØÖ Ö¸ ÕÙ Ô ÖÑ Ø Ð ÓÑÙÒ ÓÒ Ñ Ò Ö ÓÑÓ Ò º ÓÒ× Ö ÑÓ× ÙÒ × ØÙ ÓÒ Ò Ð ÕÙ × ÑÓ× ×ÔÓÒ Ö ÙÒ ÒÙ ÚÓ Ø ÔÓ ØÓº ÈÐ ÒØ ÑÓ×ÒÓ× Ó× Ð × × ÔÖ ÙÒØ × Ò Ð × Ù ÒØ ÓÖ Ò ½º Ƚ Ù Ð × ×Ù ¬Ò Ó¸ Ó ÓØÖ Ñ Ò Ö ¸ Ô Ö ÕÙ ÔÙ × ÖÚ Ö ¾º Ⱦ ÓÑÓ × ÔÙ ¬Ò Ö ÕÙ Ö ÔÖ × ÒØ Ð ØÓ Ä ÔÖ Ñ Ö ÔÖ ÙÒØ ÒÓ× Ò Ð Ð× ÔÖÓ Ð Ñ Ô Ö Ð Ù Ð Ð Ø ÔÓ ØÓ × Ö ÙÒ× Ö ÓÑÓ Ô ÖØ Ð ×ÓÐÙ ÓÒº Ë ×ØÓ ÒÓ ×Ø ¬Ò Ó¸ ÒØÓÒ × ÒÓ Ø Ò Ò Ò ÙÒ × ÒØ Ó ÓÒ× Ö Ö Ð Ø ÔÓ ØÓº Ä × ÙÒ ÔÖ ÙÒØ ÒÓ× ÜÔÖ × ÕÙ × Ð Ø ÔÓ
  • 30.
    4 Cap´ ıtulo 1. Abstracci´n de datos o ØÓ¸ Ô ÖÓ × qu´-es Ô Ò e Ð Ô Ö ÕÙ ×Ø × Ù× º Ë Ø Ò ÑÓ× Ð ÖÓ Ð ¬Ò¸ ÒØÓÒ × ÙÒ ØÓ × ¬Ò × ÙÒ Ð × ÓÔ Ö ÓÒ × Ô ÖÑ × Ð × Ý ×Ù× Ö ×ÙÐØ Ó׺ ÈÓÖ ÑÔÐÓ¸ × ÒÓ× Ò ÓÒØÖ ÑÓ× Ò ÙÒ × ØÙ ÓÒ Ò Ð Ù Ð Ö ÕÙ Ö ÑÓ× Ð ÙÐÓ Ú Ö Ð ÓÑÔÐ ¸ ÒØÓÒ × × × Ò Ð Ø Ò Ö ÙÒ Ø ÔÓ ØÓ ÒÙÑ ÖÓ ÓÑÔÐ Ó º ÄÄ Ñ × ÓÑÔÐ Ó ×Ø Ø ÔÓ Ý ¬Ò ÑÓ×ÐÓ ÓÑÓ ÙÒ ×ÙÑ cr + ci i | cr, ci ∈ R¸ ÓÒ Ð Ó ¬ ÒØ cr × ÐÐ Ñ Ó Ô ÖØ Ö Ð √ ci Ô ÖØ Ñ Ò Ö Ý¸ ר ÙÐØ ÑÓ Ö ÔÖ × ÒØ ÙÒ Ö ÓÒ Ð ÒÙÑ ÖÓ Ñ Ò Ó −1 ¿º Ð Ù Ð ÕÙ ÓÒ ÐÓ× Ø ÔÓ× ÒØ Ö ÓÖ ×¸ ר ¬Ò ÓÒ ×ÙÑ ÕÙ Ð Ð ØÓÖ Ù ÒØ ÓÒ ÙÒ ÙÐØÙÖ Ñ Ø Ñ Ø Ò Ð Ù Ð Ø Ò Ò × ÒØ Ó ÐÓ× ÒÙÑ ÖÓ× ÓÑÔÐ Ó׺ ÓÑÓ ÓÔ Ö ÓÒ × ×Ø Ð ÑÓ× Ð ÓÒ×ÙÐØ Ð Ô ÖØ Ö Ð Ñ Ò Ö ¸ Ö ×Ô Ø Ú ¹ Ñ ÒØ º 1.1.1 Tipo abstracto de dato À ÑÓ× Ó ÕÙ ÙÒ Ø ÔÓ ØÓ Ö ÔÖ × ÒØ ÙÒ ÓÒ ÙÒØÓº Ó Ð ÔÖ ×ÙÒ ÓÒ ÙÒ × ÙÐØÙÖ Ð Ñ Ø Ñ Ø ¸ Ð Ù Ð ÓÑÔÖ Ò Ð ÓÒ ÔØÓ ÓÒ ÙÒØÓ¸ Ð Ø ÔÓ ÓÑÔÐ Ó × ¬Ò Ò ØÓÖÒÓ Ð ÒÓ ÓÒ Ñ Ø Ñ Ø ÒÙÑ ÖÓ ÓÑÔÐ Ó ÕÙ Ð Ö Ò ×Ù ÓÑÔÖ Ò× ÓÒº Ó × Ð Ò Ù ¸ Ð ÑÔÐÓ ÒØ Ö ÓÖ × Ø × Ð × ÔÖ ÙÒØ × È½ Ý È¾¸ Ö ×Ô Ø Ú Ñ ÒØ º Ë ÒÓ ×ÔÙ× Ö ÑÓ× Ð ÓÖÔÙ× Ñ Ø Ñ Ø Ó ÒÙÑ ÖÓ ÓÑÔÐ Ó¸ ÒØÓÒ × ÒÓ× × Ö ÑÙÝ Ð ÒØ ÖÔÖ Ø Ö Ð × ÒØ Ó Ð Ø ÔÓ ÓÑÔÐ Ó º Ä Ñ Ø Ñ Ø ¸ × ÑÔÖ Ý Ù Ò Ó × Ý Ô × Ó ÔÓÖ ×Ù ÒØÖ Ò Ñ ÒØÓ¸ ¬Ò ÙÒ ÓÖ¹ ÔÙ× Ó Ò Ø ÚÓ¸ ר ÒØ ×ØÖ ØÓ ÔÓÖ ÖØÓ¸ ÕÙ ÒÓ× Ô ÖÑ Ø ¬Ò Ö Ð ÒÙ ÚÓ Ø ÔÓ ØÓº Ë ÒÓ× Ö Ñ Ø ÑÓ× Ð ¬Ò ÓÒ Ø ÔÓ ØÓ¸ ÒØÓÒ ×¸ × ÙÒ Ð Ñ Ø Ñ Ø ¸ ¬Ò Ö ÙÒ Ø ÔÓ ØÓ ×ØÖ Ò ¬Ò Ö ÙÒ ÓÒ ÙÒØÓ Ð × Ó× Ñ Ò Ö × ÕÙ Ø Ò Ð Ñ Ø Ñ Ø ÔÓÖ ÜØ Ò× ÓÒ Ó ÔÓÖ ÓÑÔÖ Ò× ÓÒº ¬Ò Ö ÙÒ ÓÒ ÙÒØÓ ÔÓÖ ÜØ Ò× ÓÒ × ÑÙÝ Ó Ø ÚÓ¸ Ô ÖÓ¸ Ø Ñ Ò¸ ÑÙÝ Ö ÙÓ Ý¸ Ò ÑÙ Ó× ×Ó׸ ÑÔÓ× Ð Ù Ò Ó Ð ÓÒ ÙÒØÓ × Ò¬Ò ØÓ¸ ÔÓÖ ÑÔÐÓº Ò Ð ×Ó Ð ÔÖÓ Ö Ñ ÓÒ¸ ÙÒ Ø ÔÓ ØÓ × ¬Ò ¸ Ô Ö Ó Ñ ÒØ ¸ ÔÓÖ ÓÑÔÖ Ò× ÓÒ Ñ ÒØ ÙÒ ÓÖÑ Ñ ØÓ ÓÐÓ ÒÓÑ Ò Ø ÔÓ ×ØÖ ØÓ ØÓ Ó Ì ¸ Р٠и Ò Ð Ú Ö× ÓÒ ×Ø Ø ÜØÓ¸ ÓÒר Ð × × Ù ÒØ × Ô ÖØ × ½º ÍÒ × Ö Ô ÓÒ Ð ¬Ò Ô Ö Ð Ù Ð × ×Ø Ò Ð Ø ÔÓ ØÓº ¾º ÍÒ ÓÒ ÙÒØÓ Ü ÓÑ × Ý ÔÖ ÓÒ ÓÒ × ÕÙ ¬Ò Ò Ð ÓÑ Ò Ó Ð Ø ÔÓ º ¿º ÍÒ ÒØ Ö Þ ¬Ò ÔÓÖ ØÓ × Ð × ÓÔ Ö ÓÒ × ÔÓ× Ð × ×Ó Ö Ð Ì Ò Ð Ù Ð¸ ÔÓÖ ÓÔ Ö ÓÒ¸ × ×Ø Ð Þ Ò Ó× Ø ÔÓ× ×Ô ¬ ÓÒ × Especificaci´n sint´ctica: ÒÓÑ Ö o a Ð ÓÔ Ö ÓÒ¸ Ø ÔÓ Ö ×ÙÐØ Ó Ý ÒÓÑ Ö × Ý Ø ÔÓ× ÐÓ× Ô Ö Ñ ØÖÓ׺ Especificaci´n sem´ntica: o a × Ö Ô ÓÒ ÐÓ ÕÙ Ð ÓÔ Ö ÓÒ ×Ó Ö Ð ×Ø Ó ÐÌ º Ò ×Ø Ô ÖØ ÔÙ × Ö ÙØ Ð Ò Ö Ü ÓÑ ×¸ ÔÖ ÓÒ ÓÒ × Ý ÔÓר ÓÒ ÓÒ ×º × Ò Ð ×Ø Ö ÕÙ ¸ ÓÒÓ Ó¸ ÒØ Ò Ó Ý ÔØ Ó Ð ¬Ò¸ ÕÙ Ö Ò ÓÑÔÐ ØÓ × Ò¹ Ø Ó Ð × ×Ô ¬ ÓÒ × × ÒØ Ø Ý × Ñ ÒØ ÙÒ Ì º Ò ×Ø Ø ÜØÓ¸ ÒÓ× Ú Ð Ö ÑÓ× Ð ÓÒ ÔØÓ Ð × Ó ØÓ Ô Ö Ö Ð Þ Ö Ô ÖØ Ð ×Ô ¬ ÓÒº √ ¿ Ó Ð Ô Ö×Ô Ø Ú Ñ Ø Ñ Ø ¸ ÒÓ Ü ×Ø ÒØ ÖÔÖ Ø ÓÒ × Ð ÒÙÑ ÖÓ −1º ÓÑ Ò Ó Ò Ð × ÒØ Ó ÙÒ ÙÒ ÓÒ Ñ Ø Ñ Ø º
  • 31.
    1.1. Especificaciones dedatos 5 1.1.2 Noci´n de clase de objeto o Ä Ô Ð Ö Ó ØÓ ÔÖÓÚ Ò Ð Ð Ø Ò Ó ØÙÑ ´Ó ¹ ØÙÑ Ù Ó ¹ ØÙѵ¸ ÓÑÔÓ× ÓÒ Ó ¸ ÕÙ × Ò ¬ ×Ó Ö Ð ´Ð µ¸ Ö ÒØ ¸ Ý ØÙѸ ÕÙ × Ð Ô ÖØ Ô Ó Ô × Ó Ö¸ Ø ÑÓ Ö ØÓ Ý Ö Ý ÕÙ × Ò ¬ Ø Ò Ö¸ Öº × Ô٠׸ Ó ØÙÑ ´Ó ØÙѵ × ÐÓ ÕÙ Ý Ð Ö ÒØ ¸ ÐÓ ÕÙ × Ú × Ð ÙÒ Ó× ¸ ×Ù Ö ÜØ ÖÒ º Ò × Ñ Ð Ö ÓÒØÖ ×Ø ¸ Ð Ô Ð Ö ×Ù ØÓ ¸ Ø Ñ Ò ÔÖÓÚ Ò ÒØ Ð Ð Ø Ò ×Ù ØÙѸ ÙÝÓ ÔÖ ¬ Ó Ð Ø ÒÓ ×Ù × Ò Ð Ó¸ × Ò ¬ ÐÓ ÕÙ ×Ø Ó Ð Ó× ¸ Ó ÙÐØÓ¸ ÕÙ Ð × ÒØ ÖÒÓ Ó ÓØÖÓ ÑÓ Ó¸ ÒÚ × Ð Ò Ô Ö Ò º Ò ÔÖÓ Ö Ñ ÓÒ¸ × ÓÑÓ Ò ÓØÖ × Ò Ò Ö ×¸ ÐÓ Ó Ø ÚÓ¸ Ó × ¸ Ð Ö Ú × Ð ¸ × ÒÓÑ Ò ÒØ Ö Þ ÒØ Ö¹ Þ × Ö¸ ÐÓ ÕÙ ×Ø ÒØÖ Ð Ö ÐÓ ÕÙ × Ó Ö Ð ÜØ Ö ÓÖº Ò Ð ÓÒØ ÜØÓ Ð ÔÖÓ Ö Ñ ÓÒ¸ ÙÒ Ð × Ó ØÓ ¸ Ó × ÑÔÐ Ñ ÒØ Ð × ¸ × ÙÒ Ö ÔÖ × ÒØ ÓÒ Ó Ø Ú ÙÒ Ø ÔÓ ×ØÖ ØÓ ØÓ ÕÙ ¬Ò ×Ù ×Ô ¬ ÓÒ × ÒØ Ø º ÈÓÖ Ó Ø Ú ÔÖ Ø Ò ÑÓ× Ö ÕÙ ×ÓÐÓ ÒÓ× Ö Ö ÑÓ× Ð × Ô ÖØ × ÜØ ÖÒ ×¸ Ú × Ð ×¸ ÕÙ Ø Ò Ö ÙÒ Ó ØÓ Ô ÖØ Ò ÒØ ÙÒ Ð × º Ò Ð ×Ó ÙÒ Ø ÔÓ ØÓ¸ Ð × Ô ÖØ × Ú × Ð × Ð × ÓÒ ÓÖÑ Ò Ð ÒÓÑ Ö Ð Ø ÔÓ¸ ÐÓ× ÒÓÑ Ö × Ð × ÓÔ Ö ÓÒ ×¸ ÐÓ× ÒÓÑ Ö × ÐÓ× Ô Ö Ñ ØÖÓ׸ ÐÓ× Ø ÔÓ× ØÓ ÐÓ× Ô Ö Ñ ØÖÓ× Ý ÐÓ× Ö ×ÙÐØ Ó× Ð × ÓÔ Ö ÓÒ × × Ö¸ ×Ù ×Ô ¬ ÓÒ × ÒØ Ø º È Ö × Ø× Ö Ð Ó ØÚ Ð ×Ô ¬ ÓÒ × ÒØ Ø ¸ × Ò × Ö Ó ÓÖ Ö ÙÒ Ð Ò Ù ÓÑÙÒ ÒØÖ ÐÓ× ÔÖÓ Ö Ñ ÓÖ ×¸ Ô٠׸ ÐÓ ÓÒØÖ Ö Ó¸ × Ö ÑÙÝ Ð ÒØ ÖÔÖ Ø Ö Ð ÒØ Ö Þº ÍÒ ÙØÓÑÓÚ Ð¸ ÔÓÖ ÑÔÐÓ¸ Ø Ò ÙÒ ÒØ Ö Þ Ù×Ó ÓÒ× ×Ø ÒØ ¸ ÒØÖ ÓØÖ × Ó× ×¸ ÐÓ× Ô Ð ×¸ Ð ÚÓÐ ÒØ Ý Ð Ø Ð ÖÓº È Ö ÔÓ Ö ÓÒ Ù ÖÐÓ¸ × Ö ÕÙ Ö ÕÙ Ð ÓÒ Ù ØÓÖ ×Ø ÒØÖ Ò Ó Ò Ð ÙØ Ð Þ ÓÒ × ÒØ Ö Þº Ð Ñ ×ÑÓ ÑÓ Ó¸ Ô Ö ÕÙ ÙÒ ÔÖÓ Ö Ñ ÓÖ ÓÑÔÖ Ò ÙÒ ×Ô ¬ ÓÒ × ÒØ Ø ¸ ר ÒØ Ò Ö Ð Ð Ò Ù Ò ÕÙ × ×Ô ¬ Ð Ð × Ó Ì º Ò Ð ×Ó ×Ø Ø ÜØÓ¸ Ö Ð Þ Ö ÑÓ× ×Ô ¬ ÓÒ × × ÒØ Ø × Ì Ò Ð Ð Ò Ù C++ Ó Ò Ö Ñ × Ð × × ÍÅĺ Ò C++¸ Ð ÑÔÐÓ Ð Ì ÓÑÔÐ Ó ÔÓ Ö ÑÓ Ð Þ Ö× Ð × Ù ÒØ ÑÓ Ó ÓÑÔÐ Ó ≡ struct Complejo { Complejo(float r, float i); Complejo(const Complejo & c); float & obtenga_parte_real(); float & obtenga_parte_imag(); }; ¬Ò × Complejo¸ Ò Ú Ö Ù× º ר ¬Ò ÓÒ ×Ø Ð Ó Ø Ú Ñ ÒØ Ð ×Ô ¬ ÓÒ × ÒØ Ø ÐÌ ÓÑÔÐ Ó ¸ Р٠и ÙÒ Ð Ð Ò Ù Ý Ð ÓÖÔÙ× Ñ Ø Ñ Ø Ó ÙÐØÙÖ Ð Ð ÒÓ ÓÒ ÒÙÑ ÖÓ Óѹ ÔÐ Ó¸ ÓÑÔÐ Ø Ð ×Ô ¬ ÓÒ × ÒØ Ø ÐÌ º ÉÙ ×Ù Ó ÓÒ Ð ×Ô ¬ ÓÒ × Ñ ÒØ ר ÓÑÔÐ Ø Ð ×Ô ¬ ÓÒ Ë ×ÙÑ ÑÓ× ÕÙ Ð Ð ØÓÖ Ð ×Ô ¬ ÓÒ Ð Ì ÓÑÔÐ Ó ÓÒÓ ×Ù Ñ Ø Ñ Ø Ò Ö ÒØ ¸ ÒØÓÒ × ÐÓ× ÒÓÑ Ö × Ð × ÓÔ Ö ÓÒ × Ô ÖÑ Ø Ò ÓÑÔÖ Ò Ö Ö Ø Ñ ÒØ ÕÙ ÓÔ Ö ÓÒ × Ò Ò × ÜÔÐ Ø ÖÐÓº Ü ×Ø Ð ÙÒ Ù ×Ó Ö ÐÓ ÕÙ Ð ÓÔ Ö ÓÒ obtenga parte real()) Ä Ö ×ÔÙ ×Ø Ô Ò ¸ ÒØÖ ÓØÖÓ× ØÓÖ ×¸ Ð Ö Ó ×Ø × Ð Ö ØÓÖ × Ø ÑÓÐÓ × Ù ÖÓÒ × Ù ÖØ × Ò ¿ º
  • 32.
    6 Cap´ ıtulo 1. Abstracci´n de datos o ÒØ Ò Ñ ÒØÓ Ñ Ø Ñ Ø Ó ÕÙ Ø Ò Ð Ù ×Ø ÓÒ ÒØ º Ë Ð Ð ØÓÖ ÒÓ ÓÒÓ Ð ÒÓ ÓÒ ÒÙÑ ÖÓ ÓÑÔÐ Ó¸ ÒØÓÒ × × Ö ÕÙ Ö Ö ÙÒ ×Ô ¬ ÓÒ × Ñ ÒØ ÕÙ Ð ÑÔ ÖØ ÐÓ ÕÙ × ÙÒ ÓÑÔÐ Óº ÄÓ Ó Ø ÚÓ ÔÓ× Ð Ø ÙÒ Ù Ö Ó ÓÑÙÒ ÒØÖ Ö ÒØ × Ô Ö×ÓÒ × Ö Ð ÒØ Ö¹ ÔÖ Ø ÓÒ ÙÒ Ø ÔÓ ØÓº È Ö ÕÙ ×Ø Ù Ö Ó Ó ÙÖÖ ¸ × Ò × Ö Ó ÕÙ Ð × Ô Ö×ÓÒ × Ò Ù ×Ø ÓÒ Ú Ò Ó ÒØ ÖÔÖ Ø Ò ÓÑÓ Ò Ñ ÒØ Ð Ó ØÓº ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð ÒØ Ö¹ ÔÖ Ø ÓÒ ÙÒ Ì ÔÒ Ð Ö Ó Ò ÕÙ ×Ù× ÒØ Ö × Ó× ÓÑÔ ÖØ Ò Ð Ð Ò Ù ÓÒ ÕÙ × Ö Ð ×Ù ×Ô ¬ ÓÒº 1.1.3 Lo subjetivo de un objeto Ë ØÖ Ø ÑÓ× ÙÒ ØÓ Ò Ø ÖÑ ÒÓ× Ó Ø ÚÓ׸ ÒØÓÒ ×¸ Ò ÕÙ ÓÒ× ×Ø ØÖ Ø ÖÐÓ Ò Ø ÖÑ ÒÓ× ×Ù Ø ÚÓ× ÖÓ××Ó ÑÓ Ó¸ Ð Ö ×ÔÙ ×Ø × ÕÙ Ð ×Ù Ø Ú ÙÒ Ì × ØÖ Ø ÙÖ ÒØ ×Ù ×Ô ¬ ÓÒ × Ñ ÒØ º Ü ×Ø Ò¸ × Ñ ÒØ ¸ ØÖ × Ù ÒØ × ×Ù Ø Ú º Ä Ú × ÓÒ¸ ÒØ ÖÔÖ Ø ÓÒ Ý¸ Ò ÓÒ× Ù Ò ¸ Ð × ÒØ Ó ÙÒ Ì ¸ Ô Ò Ð ÜÔ ¹ Ö Ò Ý ÓÒÓ Ñ ÒØÓ ÕÙ Ø Ò Ð Ô Ö×ÓÒ ÕÙ ÙØ Ð Ð Ì º È ÖÓ ×ØÓ × ÑÙÝ ×Ù Ø ÚÓ¸ ÔÙ × ÕÙ Ò Ø Ò ×Ù ÔÖÓÔ ÜÔ Ö Ò ¸ Ð Ù Ð ÒÓ ØÖ Ø Ö× Ó Ø Ú Ñ ÒØ º Ä ÔÖ Ñ Ö Ù ÒØ ×Ù Ø Ú ×¸ ÒØÓÒ ×¸ Ð ÒØ ÖÔÖ Ø ÓÒ Ð Ù×Ù Ö Ó Ð Ì Ö ×Ù × ÒØ Óº ÉÙ Ò × Ý Ò ×ØÙ Ó ÐÑ ÒØ ÐÓ× ÒÙÑ ÖÓ× ÓÑÔÐ Ó× Ø Ò Ö Ò ÙÒ ÓÑÔÖ × ÓÒ Ð Ì ÓÑÔÐ Ó Ñ × ÓÑÓ Ò ÕÙ ÕÙ Ò × ÒÓ ÐÓ Ý Ò ×ØÙ Óº È Ö ×ØÓ× ÙÐØ ÑÓ× ÔÙ × Ö Ò × Ö Ó ÓÑÔÐ Ñ ÒØ Ö Ð ×Ô ¬ ÓÒº Ò Ð ×Ó Ð Ì ÓÑÔÐ Ó × ÑÙÝ ÓÒÚ Ò ÒØ Ø Ò Ö ÙÒ ØÖ Ý ØÓÖ ×ØÙ Ó× Ñ Ø Ñ Ø Ó׺ ÈÙ ÙÒ ÔÖÓ Ö Ñ ÓÖ × Ò ×Ø ØÖ Ý ØÓÖ Ñ Ò Ö Ð Ì ÓÑÔÐ Ó Ò Ö ÒØ Ö ×Ø ÔÖ ÙÒØ Ö Ú Ð Ô Ö×Ô Ø Ú × ÓÒØÖ ØÓÖ ×º Ò ÔÖ Ñ Ö ÐÙ Ö¸ × Ð Ù×Ù Ö Ó Ð Ì ÓÑÔÐ Ó ÔØ Ð ÒØ Ö Þ¸ ÒØÓÒ ×¸ Ð × ÖÖÓÐÐÓ ÔÖÓ Ö Ñ × ÕÙ Ù× Ò ÒÙÑ ÖÓ× ÓÑÔÐ Ó× Ô ÖÑ Ø Ò Ö ÓÑÔÖ Ò× ÓÒ Ö Ð Ñ Ø Ñ Ø ÓÑÔÐ º ÑÔ ÖÓ¸ ר Ù×Ù Ö Ó¸ Ð ÒÓ ×ÔÓÒ Ö Ð ÓÖÔÙ× Ñ Ø Ñ Ø Ó Ö ÕÙ Ö Ó¸ × Ñ × ÔÖÓÔ Ò×Ó ÙØ Ð Þ Ö Ð ÒØ Ö Þ Ô Ö ÙÒ ¬Ò Ö ÒØ Ð ÕÙ Ù ÓÒ Ó ÐÌ ÓÑÔÐ Ó ÔÓÖ ÑÔÐÓ¸ Ô Ö Ö ÔÖ × ÒØ Ö ÔÙÒØÓ× Ò Ð ÔÐ ÒÓ ÖØ × ÒÓº Ë Ò ×ØÓ ÔÙ Ö ÔÖ × ÒØ Ö ÙÒ ÓÖÖÓ Ó Ó¸ Ø Ñ Ò ÔÙ ÖÖ Ö Ö Ò × ÓÒ Ù× ÓÒ × ÒØÖ ÐÓ× ÔÖÓ Ö Ñ ÓÖ × Ý Ñ ÒØ Ò ÓÖ ×º Ä × ÙÒ Ù ÒØ ×Ù Ø Ú ÔÖÓÚ Ò Ð Ñ ×ÑÓ × Ò ÓÖ Ð Ì º Ð Ó ØÓ Ö ×ÙÐØ ÒØ Ô Ò Ø Ñ Ò Ð ÜÔ Ö Ò Ð × Ò ÓÖº È Ö×ÓÒ × Ö ÒØ × Ø Ò Ò ÔÖÓÔÓÒ Ö ÒØ Ö × Ö ÒØ ׺ Ä ÙÐØ Ñ Ù ÒØ ×Ù Ø Ú × Ö ¬ Ö Ð ÑÔÐ ÒØ ÓÒ Ð Ì º ר ÒØÓ× ÔÖÓ¹ Ö Ñ ÓÖ × Ö Ð Þ Ö Ò ÑÔÐ ÒØ ÓÒ × Ö ÒØ ׺ Ë Ò ×Ø × ÔÖ Ñ Ö Ñ ÒØ Ð ×Ù ¹ ØÚ ÕÙ ÔÖ Ø Ò × ÓÒ Ö ÙÒ Ì ¸ ÔÙ × Ö × Ò Ð ÓÒ× Ö ÖÐ ÔÓÖ Ó× Ö ÞÓÒ × Ð Ø ÑÔÓ ÑÔÐ ÒØ ÓÒ Ý Ð Ø ÑÔÓ Ù ÓÒº Ð Ø ÑÔÓ × ÖÖÓÐÐÓ ÙÒ Ì ÔÙ × Ö Ø Ò ÜØ Ò×Ó ÕÙ ÓÑÔÖÓÑ Ø ÙÒ ÔÖÓÝ ØÓº Ò ÐÓ Ñ ÒØ ¸ Ð Ø ÑÔÓ Ù ÓÒ Ð ÔÖÓ Ö Ñ Ö ×ÙÐØ ÒØ ÔÙ × Ö Ø Ò Ð ÒØÓ ÕÙ Ò × Ö Ó Ö Ô Ø Ö Ð ÑÔÐ ÒØ ÓÒ Ð Ì º Ò Ù Ð ×ÕÙ Ö ×Ø × × ØÙ ÓÒ × ÔÙ × Ö ÓÒÚ Ò ÒØ Ò Ö ÐÓ× ×Ô ØÓ× Ò Ö Ð × Ð ÑÔÐ ÒØ ÓÒº Ò Ö ×ÙÑ Ò¸ Ð × Ù ÒØ × ×Ù Ø Ú × Ø Ô ¬ Ò ÓÑÓ × Ù ½º ËÙ Ø Ú ÒØ ÖÔÖ Ø ÓÒ Ð Ù×Ù Ö Óº ¾º ËÙ Ø Ú ÒØ ÖÔÖ Ø ÓÒ Ð × Ò ÓÖº
  • 33.
    1.1. Especificaciones dedatos 7 ¿º ËÙ Ø Ú ÑÔÐ ÒØ ÓÒº ÈÓÖ Ñ × Ò × × ÕÙ × Ð Ð ÓÖ ÒØ ÓÒ Ó ØÓ׸ ÐÓ× ÔÖÓ Ö Ñ ÓÖ × ÕÙ × Ö ÙÒ× Ö Ò Ò × ÖÖÓÐÐÓ× ÓÓÔ Ö Ø ÚÓ× Ò ×Ø Ö ÓÒ× ÒØ × ×Ø × ×Ù Ø Ú ¹ × Ð ÑÓÑ ÒØÓ Ö Ð Þ Ö Ð ×Ô ¬ ÓÒ × Ñ ÒØ ÙÒ Ì º Ä Ò Ð ×¹ Ô ¬ ÓÒ × Ñ ÒØ ׸ ÒØÓÒ ×¸ Ù Ö× Ð ÜÔ Ø Ø Ú Ó Ò Ø Ú Ð ÖÙÔÓ Ô Ö×ÓÒ × ÒÚÓÐÙ Ö × Ò Ð × ÖÖÓÐÐÓ Ý Ù×Ó ÙÒ Ì º Ë ÕÙ Ð ÖÙÔÓ¸ ÔÓÖ Òר Ò ¸ ÓÑÔÖ Ò Ð Ñ Ø Ñ Ø ÓÑÔÐ ¸ ÒØÓÒ × ÒÓ ×ÓÐÓ × ÒÒ × Ö Ó ÓÒ Ö Ò ÙÒ ×Ô ¹ ¬ ÓÒ × Ñ ÒØ ÕÙ ÜÔÐ ÕÙ Ð ÒÓ ÓÒ ÒÙÑ ÖÓ ÓÑÔÐ Ó¸ × ÒÓ ÕÙ ¸ Ø Ñ Ò¸ ÔÙ ØÓÖÒ Ö× ÑÙÝ Ø Ó×Óº Ò ×Ø ×Ó¸ Ð Ù ÒØ ×Ù Ø Ú ×ÓÐÓ × ÑÔÐ ÒØ ÓÒ¸ Р٠Р׸ ÔÖ × Ñ ÒØ ¸ Ð ×Ù Ø Ú ÕÙ ÔÖ Ø Ò Ó ÙÐØ Ö ÙÒ Ì º ÈÓÖ Ð Ö ÞÓÒ ÒØ Ö ÓÖ¸ Ð ×Ô ¬ ÓÒ × Ñ ÒØ ÒÓ × Ó Ø Ú º ÓÖ Ò¸ ÓÑÓ Ö Ð Þ Ö ÙÒ ×Ô ¬ ÓÒ × Ñ ÒØ Ø Ú × Ö¸ ÕÙ ÐÓ Ö Ð ØÓ ÔØ Ö× ÒØ Ò ÔÓÖ ÙÒ ÖÙÔÓ ÔÖÓ Ö Ñ ÓÖ ×º Ê ×ÔÙ ×Ø Ö ×ÙÑ Ñ ÒØ ÙÒ Ð Ò Ù Ù Óº È Ö × ÖØ Ö Ò ØÓÖÒÓ ×Ø Ù ×Ø ÓÒ¸ × ÔÖÓÔ Ó Ñ Ò Ö ÓÑÓ Ó× ÒØ Ö¹ ÐÓ ÙØÓÖ × ØÖ Ø Ò Ð ÒÓ ÓÒ ÐÓ Ó Ø ÚÓ Ý ×Ù Ø ÚÓ Ö ÙÒ Ó× ÔÖÓ Ö Ñ ÓÒ Ý ÙÒ Ì º Ò Ð × ÒØ Ó Ò ÕÙ ÐÓ ÑÓ× ØÖ Ø Ó¸ ÐÓ Ó Ø ÚÓ Ð Ó× ÔÖÓ Ö Ñ × Ô Ö Ô¹ Ø Ð Ð Ú × ÓÒ ÓÑÙÒ ÐÓ× ÒØ ÖÐÓ ÙØÓÖ ×¸ Ñ ÒØÖ × ÕÙ ÐÓ ×Ù Ø ÚÓ Ð × ×Ø Ó ÙÐØÓ Ð Ñ ÒÓ× Ð Ñ Ö ÙÒÓ ÐÐÓ× Ó Ñ Ó׺ ÈÓÖ Ú × ÓÒ ¸ Ð Ð ØÓÖ ÒÓ ×ÙÑ Ö Ð Ñ ÖÓ × ÒØ Ó × Ò×ÓÖ Ð¸ × ÒÓ Ð Ô Ô Ö Ö ÙÒ Ó× Ó ÒÓÑ ÒÓ Ñ ÒØ Ð × ×ØÖ ÓÒ × Ý ÓÒרÖÙ ÓÒ × ÒØ Ð ØÙ Ð × ÕÙ Ð ÜÔ Ö Ò ÐÓ× ÒØ ÖÐÓ ÙØÓÖ × Ð × Ô ÖÑ Ø º ÓÑÓ Ô ÖØ Ð ÜÔ Ö Ò ¸ × Ö Ø Ó ÕÙ ÐÓ× ÒØ ÖÐÓ ÙØÓÖ × Ø Ò Ò ×ØÖ Þ × ÔÖÓ Ö Ñ ÓÒ ÕÙ Ô Ö Ð ×º ËÙÔÓÒ ÑÓ× ÕÙ ÙÒ ÒØ ÖÐÓ ÙØÓÖ Ð ÔÖ × ÒØ ÙÒ Ì ÓØÖÓ º Ó× × ØÙ ÓÒ × Ò Ð × ×ÓÒ ÔÓ× Ð × ´½µ Ú ÒØ ÖÔÖ Ø Ð Ì Ð Ñ ×Ñ Ñ Ò Ö ÕÙ Ý ´¾µ ÒÓ ÐÓ ÒØ ÖÔÖ Ø Ù Ðº Ò Ù ÐÕÙ Ö ÐÓ× Ó× ×Ó׸ × × Ò Ð ÕÙ ÓÒÓÞ Ð ÓÔ Ò ÓÒ Ô Ö ÔÓ Ö Ø ÖÑ Ò Ö× Ù Ð Ð × Ó× × ØÙ ÓÒ × Ó ÙÖÖ º Ù Ò Ó Ó ÙÖÖ Ð ÔÖ Ñ Ö × ØÙ ÓÒ¸ ÒØÓÒ × ÐÓ× ÒØ ÖÐÓ ÙØÓÖ × Ø Ò Ò ÙÒ Ñ Ö ÓÑÓ Ò Ð Ì Ý Ð ×Ù Ø Ú ÕÙ Ö ×Ø × ÑÔÐ ÒØ ÓÒ¸ Р٠и Ò Ð ×Ø Ó × ÒÓ¸ × × ÑÔÖ × Ù ÒÓ Ó ÙÐØ ÖÐ º Ë Ó ÙÖÖ Ð × ÙÒ × ØÙ ÓÒ¸ ÒØÓÒ × Ý Ò ÓÑÓ Ò Þ Ö Ð Ú × ÓÒ ÒØ Ö¹ ÔÖ Ø ÓÒ Ð Ì ÓÖÑ ÕÙ ×Ù× ×Ù Ø Ú × ÒØ ÖÔÖ Ø ÓÒ Ú Ò Ò Ó Ø Ú ×º Ä ÙÒ Ñ Ò Ö ×Ø ÓÖ ÓÒÓ Ö ×ØÓ × ØÖ Ú × Ð ÐÓ Óº × ÔÓÖ ×ØÓ ÕÙ Ð Ð Ò Ù × ÙÒ Ñ ÒØ Ð Ò Ð ×Ô ¬ ÓÒ ÙÒ Ì º È ÖÓ Ð Ð Ò Ù ÒÓ × Ñ Ö¹ Ñ ÒØ ÙÒ Ö ÓÒ Ðº ÒÓ Ø Ò Ò Ò ÙÒ ÓÖÑ ÓÖÖÓ ÓÖ Ö × ÓÑÔ ÖØ ×Ù Ñ Ö × ÒÓ × Ù Ð ÒØ ÖÔÖ Ø ÓÒ ÕÙ Ø Ò Ö Ð Ì º ÈÓÖ Ø ÒØÓ¸ Ù Ò Ó × × Ò ÙÒ ÒÙ ÚÓ Ì ¸ × × Ò Ð ÕÙ Ð × Ò ÓÖ ÐÓ ÜÔÓÒ ÒØ ÐÓ× ÒØ Ö × Ó× Ò ÙÒ ÔÖÓ ×Ó ÐÓ Ó ÕÙ ÙÖ ×Ø ÕÙ ÒÓ Ý Ò ×Ù Ø Ú × ÒØ ÖÔÖ Ø ÓÒ Ý ×ÓÐÓ Ö ×Ø Ò Ð × ÑÔÐ ÒØ ÓÒº 1.1.4 Un ejemplo de TAD ÜÔ Ö Ò × ÕÙ Ö × Ò Ð × ÖÖÓÐÐÓ ÔÖÓ Ö Ñ × Ù Ó Ô ÖÑ Ø Ò ÑÓ Ð Þ Ö ÙÒ Ì ¸ ÐÐ Ñ Ó ÙÖ ¸ ÙÝÓ ¬Ò × Ò Ö Ð Þ Ö ÓÔ Ö ÓÒ × Ò Ö ÒØ × Ð Ù Ó ÙÒ ¬ ÙÖ ×Ó Ö Ð ÙÒ ÓÒ Ó ÓÒØÖ ×Ø º Ì Ð Ì × ÙØ Ð Ô Ö Ö Ð Þ Ö ÔÖÓ Ö Ñ × ÕÙ
  • 34.
    8 Cap´ ıtulo 1. Abstracci´n de datos o Ò Ù Ó× Ý ÙÒ ÔÖÓÔÙ ×Ø ¬Ò ÓÒ × ÓÑÓ × Ù ÙÖ ≡ struct Figure { ÓÒרÖÙ ØÓÖ × ÙÖ Ç × ÖÚ ÓÖ × ÙÖ ÅÓ ¬ ÓÖ × ÙÖ }; ÙÖ × ÓÒ Ö Ø × ½¾ ¬Ò × Figure¸ Ù× Ò ÙÒ × ¸ ¸ ½¾¸ Ò ½ º ÐÌ ÙÖ ÑÓ Ð Þ ÙÒ ¬ ÙÖ Ò Ö Ð ÕÙ × Ù Ö Ò Ð ÙÒ Ñ Ó ÓÒØÖ ×Ø º × Ò Ö Ð Ò Ð × ÒØ Ó ÕÙ ×ÓÐÓ ×ØÖ ÑÓ× ÓÔ Ö ÓÒ × Ò Ö Ð × ×Ó Ö ÙÒ ¬ ÙÖ ÓÑ ØÖ Ù ÐÕÙ Ö × Ö¸ Ð × ÓÔ Ö ÓÒ × ×ÓÒ Ò Ö Ð × ÔÓÖÕÙ ÓÔ Ö Ò ×Ó Ö Ù ÐÕÙ Ö ¬ ÙÖ Ò Ô Ò ÒØ Ñ ÒØ ×Ù Ô ÖØ ÙÐ Ö º ÈÓÖ Ù ÐÕÙ Ö ¬ ÙÖ ÔÖ Ø Ò ÑÓ× ÜÔÖ × Ö ÕÙ ×Ù ÓÖÑ ¸ Ù Ö Ø ¸ ØÖ Ò ÙÐ Ö¸ Ø Ø Ö ¸ ÒÓ ÒÓ× ÑÔÓÖØ ×ÓÐÓ ÒÓ× ÒØ Ö × ÙÒ ¬ ÙÖ ÓÑÓ ×ØÖ ÓÒ Ò Ö Ð Ô Ö Ù ÖÝÐ ÑÒÖ ÒÖÐ ÓÔ Ö Ö ×Ó Ö ÐÐ ØÖ Ú × ÓÔ Ö ÓÒ × Ò Ö Ð × ÓÑÙÒ × ØÓ × Ð × ¬ ÙÖ × Ü ×Ø ÒØ ׺ ÆÓ × ¸ ݸ × ÔÖ Ö Ð ×ÙÑ Ö ÕÙ ÒÓ × ÔÙ ¸ ¬Ò Ö ÙÒ ×ØÖ ÓÒ × Ò ÓÒÓ Ö Ð Ô Ö ÕÙ Ø Ð ¬Ò ÓÒº ÈÓÖ × Ö ÞÓÒ¸ Ù Ò Ó × Ò ÑÓ× ÙÒ Ì ¸ ÑÓ× × ¹ ÙÖ ÖÒÓ× Ø Ò Ö Ð ÖÓ Ð ¬Ò ÕÙ Ô Ö× Ù ÑÓ׺ Ò ×Ø × ÒØ Ó¸ Ò ÐÓ ÕÙ ÓÒ ÖÒ Ð Ì ÙÖ ¸ Ð ¬Ò × Ù Ö ¬ ÙÖ × Ò Ð ÙÒ Ñ Ó ÓÒØÖ ×Ø º Ë ×Ø ¬Ò ÒÓ ×Ø Ð ÖÓ¸ ÒÓ Ø Ò × ÒØ Ó Ð Ö ¬ ÙÖ × Ý ×Ù× ÓÔ Ö ÓÒ ×º Ä ×Ô ¬ ÓÒ × ÒØ Ø ÐÌ ÙÖ ×Ø ÔÓÖ ×Ù ¬Ò ÓÒ Ò C++º ÍÒ ÓÔ Ö ÓÒ ×Ó Ö ÙÒ Ð × × ÒÓÑ Ò Ñ ØÓ Ó ¸ Ø ÖÑ ÒÓ ÔÖÓÚ Ò ÒØ Ð Ð Ø Ò Ñ Ø Ó Ù׸ Ð Ù Ð ÔÖÓÚ Ò Ð Ö Ó μ θοδος ´Ñ Ø ¹ Ó Ó×µº Ò ×Ø ×Ó Ñ Ø ÓÒÒÓØ Ù Ö ¸ Ñ × ÐÐ Ý Ó Ó× × Ò ¬ Ñ ÒÓº Å ØÓ Ó ÕÙ Ö Ö¸ Ô٠׸ ÙÒ Ñ ÒÓ Ð ¬Ò ÕÙ ×Ø Ù Ö × Ö¸ ÙÒ Ñ ÒÓ ÓÒ ×Ø ÒÓ¸ ÓÒ × ÒØ Óº È Ö ¬Ò Ö Ð × Ñ ÒØ ÓÔ Ö ÓÒ¸ ÑÓ× ÒÓØ Ö Ð Ì Point¸ ÔÙ × ÐÓ Ö Ö Ò Ò Ð ÙÒ × ÓÔ Ö ÓÒ × Ð Ì ÙÖ º ËÙÔ Ø Ó Ð ¬Ò Ð Ì ÙÖ ¸ ÙÒ ÔÙÒØÓ ×Ø Ò Ð Ù ÓÒ Ð ¬ ÙÖ Ð ÑÓÑ ÒØÓ ×Ù Ù¹ Ó Ý ÒÓ ÒÓ× ÓÒÚ Ò ¸ ÔÓÖ ÓÖ ¸ ¬Ò ÖÐ Ñ ×¸ ÔÙ × ÒÓ Ø Ò ÑÓ× ¹Ý × ÔÓÖ ÓÖ Ø Ñ Ò ÔÖ Ö Ð ÒÓ Ø Ò ÖÐ ¹ Ð Ñ Ó Ò Ð Ù Ð × Ù Ö Ò Ð × ¬ ÙÖ × ÔÓÖ ÑÔÐÓ׸ ÙÒ Ñ Ó ÔÐ Ò Ö Ô Ô Ð Ó Ô ÒØ ÐÐ Ó ÙÒ Ñ Ó ØÖ Ñ Ò× ÓÒ Ð ÔÖÓÝ ØÓÖ ØÖ Ñ Ò× ÓÒ Ð Ù ÓÐÓ Ö º È Ö Ð ÔÖ Ñ Ö Ø ÔÓ Ñ Ó Ð ÔÙÒØÓ Ö ÕÙ Ö Ó× ÓÓÖ Ò ×¸ Ñ ÒØÖ × ÕÙ Ô Ö Ð × ÙÒ Ó ØÖ ׺ À Ý Ó× ÓÖÑ × ÓÒרÖÙ Ö ÙÒ ¬ ÙÖ ×ØÖ Ø ÜÔÖ × × ÔÓÖ ÐÓ× × Ù ÒØ × ÓÒ×¹ ØÖÙ ØÓÖ × ÓÒרÖÙ ØÓÖ × ÙÖ ≡ ´ µ Figure(const Point & point); Figure(const Figure & figure); Í× × Figure º Ð ÔÖ Ñ Ö ÓÒרÖÙ ØÓÖ Ö ÕÙ Ö ÙÒ ÔÙÒØÓ Ð × ÙÒ Ó ÓÔ Ð ¬ ÙÖ Ô ÖØ Ö Ð ÔÙÒØÓ ÓÒ × Ò Ù ÒØÖ ÓØÖ ¬ ÙÖ º Ä Ö ÙÒ Ò × Ö º
  • 35.
    1.1. Especificaciones dedatos 9 Ð ×ØÖÙ ØÓÖ Ð Ì ÙÖ × Ö Ú ÖØÙ Ð ÓÒרÖÙ ØÓÖ × ÙÖ +≡ ´ µ virtual ~Figure(); Í× × Figure º Ô٠׸ × Ñ Ò Ö ¸ × Ö ÒØ Þ Ð ÒÚÓ ÓÒ Ù ÐÕÙ Ö ×ØÖÙ ØÓÖ ×Ó Ó ÙÒ ¬ ÙÖ Ô ÖØ ÙÐ Öº ÙÒ Ñ ØÓ Ó ÕÙ ÒÓ ÐØ Ö Ó ÑÓ ¬ÕÙ Ð ×Ø Ó Ð Ó ØÓ ×Ù Ð ÐÐ Ñ Ö× Ð Ó × Ö¹ Ú ÓÖ º Ò ×Ø × ÒØ Ó¸ ÙÒ ¬ ÙÖ Ø Ò ÙÒ ×ÓÐÓ Ó × ÖÚ ÓÖ Ç × ÖÚ ÓÖ × ÙÖ ≡ ´ µ ½ const Point & get_point() const; Ð Ù Ð Ó × ÖÚ ×Ù ÔÙÒØÓ Ö Ö Ò Ò Ð ÔÐ ÒÓº Ò C++¸ Ð Ð ¬ ÓÖ const ×Ó Ö ÙÒ Ñ ØÓ Ó Ð Ò Ð ÓÑÔ Ð ÓÖ ÕÙ Ð Ñ ØÓ Ó ÒÓ ÐØ Ö Ð ×Ø Ó Ð Ó ØÓº ÙÒ Ñ ØÓ Ó ÕÙ ÐØ Ö Ó ÑÓ ¬ Ð ×Ø Ó ÙÒ Ó ØÓ × Ð Ð × ¬ ÑÓ ¬ ÓÖ Ó¸ Ú ×¸ ØÙ ÓÖ º ÄÓ× ØÙ ÓÖ × ÙÒ ¬ ÙÖ ×ÓÒ ÐÓ× × Ù ÒØ × ÅÓ ¬ ÓÖ × ÙÖ ≡ ´ µ virtual void draw() = 0; virtual void move(const Point & point) = 0; virtual void erase() = 0; virtual void scale(const Ratio & ratio) = 0; virtual void rotate(const Angle &angle) = 0; ÄÓ× ÒÓÑ Ö × Ñ ØÓ Ó× draw(), move() Ý erase() Ò Ò Ð Ö Ñ ÒØ ÕÙ × ÐÓ ÕÙ Ö Ð Þ Ò º Ð Ñ ØÓ Ó scale() Ùר Ð Ø Ñ ÒÓ ´ × Ð µ ÙÒ ¬ ÙÖ × ÙÒ ÙÒ Ö Ó Óº Ð Ø ÔÓ Ratio ×Ô ¬ ÙÒ Ñ Ò ØÙ × Ð ÕÙ × Ò ¬ Ð ÔÖÓÔÓÖ ÓÒ Ò ÕÙ Ð × Ð × ÑÓ ¬ × ×Ø × Ñ ÒÓÖ ÕÙ ÙÒÓ¸ ÒØÓÒ × Ð ¬ ÙÖ × ¸ ÐÓ ÓÒØÖ Ö Ó × Ö Ò º Ò ÐÑ ÒØ ¸ Ð Ñ ØÓ Ó rotate() Ö Ó ÖÓØ Ð ¬ ÙÖ Ò Ð Ñ Ó × ÙÒ ÙÒ Ò ÙÐÓ Ø ÔÓ Angleº ÄÓ× ÅÓ ¬ ÓÖ × ÙÖ Ö ÔÖ × ÒØ Ò ÓÔ Ö ÓÒ × Ò Ö Ð × ×Ó Ö ÙÒ ¬ ÙÖ º ÈÓ ÑÓ× Ù ÖÐ ¸ ÑÓÚ ÖÐ ÓØÖÓ ÔÙÒØÓ¸ ÓÖÖ ÖÐ ¸ × Ð ÖÐ × ÙÒ Ð ÙÒ Ñ Ò ØÙ ¸ Ó ÖÓØ ÖÐ × ÙÒ Ð ÙÒ Ò ÙÐÓ Ò Ö Ò × ÙÝÓ × ÒÓ Ò Ð × ÒØ Ó ÖÓØ ÓÒº Ò ØÓ Ó× ÐÓ× ×Ó׸ ØÖ Ø ÑÓ× ÓÒ ¬ ÙÖ × ×ØÖ Ø ×¸ ÒÓ ÓÒ Ö Ø ×º Ð Ù Ð ÕÙ ÓÒ Ð Ø ÔÓ Point¸ Ò ×Ø ר Ó ÒÓ × ÓÒÚ Ò ÒØ Ô Ò× Ö Ò Ð × Ñ¹ ÔÐ ÒØ ÓÒ × ÐÓ× Ø ÔÓ× Ratio Ý Angleº ËÓÐÓ ×Ø ÓÒ ÓÒÓ Ö ×Ù ÙØ Ð Þ ÓÒ ÓÒ Ó ØÓ× Ø ÔÓ Figure Ö ÙÒ× Ö Ø Ð ¬Ò Ù ÖР׺ Å Ò ÓÒ Ô ÖØ ÙÐ Ö Ñ Ö Ò Ó× Ð ¬ ÓÖ × × ÒØ Ø Ó× Ð C++º Ð ÔÖ Ñ ÖÓ ÐÓ ÓÒ¹ ÓÖÑ Ð ÔÖ ¬ Ó Ö × ÖÚ Ó virtual ¸ Ð Ù Ð Ò ÕÙ Ð ÓÔ Ö ÓÒ ÔÙ ÑÔÐ ÒØ Ö× × ÙÒ Ð Ô ÖØ ÙÐ Ö Ð ¬ ÙÖ ÔÓÖ ÑÔÐÓ¸ ÙÒ Ù Ö Ó × Ù Ö ÒØ ÕÙ ÙÒ Ö ÙÐÓº Ð × ÙÒ Ó ×Ø Ó ÔÓÖ Ð Ó Ò Ð Þ Ö Ð ÓÔ Ö ÓÒ ÓÒ Ð Ú ÐÓÖ ÖÓº ר × Ð × ÒØ Ü × C++ Ô Ö ¬Ò Ö ÙÒ Ñ ØÓ Ó Ú ÖØÙ Ð ÔÙÖÓ ¸ Р٠и ×Ù Ú Þ¸ ¬Ò ÙÒ Ð × ×ØÖ Ø Ó × ¸ ×ØÖ ÓÒ ÔÙÖ ¸ × Ò Ò Ò ÙÒ Ö Ø Ö ÓÒ Ö ØÓ¸ ÔÙ × × ÒÓ Ð Ð × ÒÓ × Ö ×ØÖ Ø º È Ö ÔÖ Ò Ö ×Ø Ó × ÖÚ ÓÒ¸ ÓÑ Ò ÑÓ× ÔÓÖ ÔÖ ÙÒØ ÖÒÓ× Ù Ð ¬ ÙÖ × Ö ¬ Ö Ð Ì ÙÖ º Ä Ö ×ÔÙ ×Ø ÓÖÖ Ø × ÕÙ ÒÓ ÐÓ × ÑÓ׸ ÔÙ × × ØÖ Ø ÙÒ Ð × ×ØÖ Ø ¸ ÒÓ ÙÒ ÓÒ Ö Ø º ÄÓ× Ñ ØÓ Ó× Ú ÖØÙ Ð × ÔÙÖÓ× Ø Ò Ò ÕÙ ÑÔÐ ÒØ Ö× Ò Ð × × Ö Ú × Ð Ð × Figure ÕÙ ÓÒ Ö Ø Ò ÑÔÐ ÒØ ÓÒ × Ô ÖØ ÙÐ Ö × ÙÒ ¬ ÙÖ ×ØÖ Ø º ÈÓÖ Ñ¹ ÓÒ ÓÒ ÕÙ × ÓÒÓÞ Ò ÐÓ× Ø ÖÑ ÒÓ× Ò Ð × ×º
  • 36.
    10 Cap´ ıtulo 1. Abstracci´n de datos o ÔÐÓ¸ Ð Ñ ØÓ Ó scale() ÙÒ ØÖ Ò ÙÐÓ × ÑÔÐ ÒØ Ò ÙÒ Ð × Triangle ÖÚ Figureº Ð ÓÒ ÔØÓ Ö Ú ÓÒ × Ö ×ØÙ Ó ÓÒ Ñ × Ø ÐÐ Ò Ð × ÓÒ Ü ½º¾ ´Ô Ò ½½µº 1.1.5 El lenguaje UML À ר ÓÖ ÒÓ× ÑÓ× × ÖÚ Ó Ð Ð Ò Ù C++ Ô Ö Ö ×ÓÐÚ Ö Ð ×Ô ¬ ÓÒ × ÒØ Ø º Ò ØÓ¸ Ò ×Ø Ð Ò Ù ¸ Ý Ò ÓØÖÓ× ÓÖ ÒØ Ó× Ó ØÓ׸ Ð × ÒØ Ü × Ð ÔÖÓÔ Ó Ð Ò Ù Ò ØÓ Ó× ÐÓ× ×Ô ØÓ× × ÒØ Ø Ó× ÒØ Ö × Ý¸ × × × Ó Ò ÒÓÑ Ö × Ù Ó׸ ÙÒ¹ Ñ ÒØ ÐÓ× × Ñ ÒØ Ó׺ ÀÓÝ Ò Ü ×Ø Ò ÑÙ Ó× Ð Ò Ù × ÓÖ ÒØ Ó× Ó ØÓ׸ ÙÝ ÔÖ × Ò ÒÓ× ¬¹ ÙÐØ ÙÒ ¬ Ö Ñ Ö × Ò ×Ô ¬ ÓÒ × Ý × ÒÓ׺ È Ö Ô Ð Ö ×Ø ÔÖÓ Ð Ñ ¸ × Ñ × ÙÒ ¸ ÙÒ ÓÒ×ÓÖ Ó ÐÐ Ñ Ó ÇÅ ´Ç Ø Å Ò Ñ ÒØ ÖÓÙÔµ Ò¹ Ø ÒØ ÓÑÓ Ò Þ Ö Ð Ñ Ò Ö ×Ô ¬ Ö Ì º Ó Ð Ò Ù × ÒÓÑ Ò ÖÓÒ Ñ Ñ ÒØ ÍÅÄ ÍÒ ¬ ÅÓ Ð Ò Ä Ò Ù Ý × × ÖÚ ÙÒ Ñ Ó ÕÙ ÒÓ Ø Ò Ò ØÓ Ó× ÐÓ× Ð Ò Ù × Ý ÕÙ × ÓÒ×ÓÒ ÓÒ Ð ÐÓ Ó Ø ÚÓ Ð Ö ¬ Óº ÍÒ Ö¬Ó Ñ × ÕÙ Ñ Ð Ô Ð Ö × Ö Þ ÙÒ ÒØ ÙÓ ÔÖÓÚ Ö Ó¸ Ý ÍÅÄ ÐÓ ÓÒÖ Ù Ò Ó × Ö ÕÙ Ö Ó × ÖÚ Ö Ö ÒØ × Ì Ý ×Ù× Ö Ð ÓÒ ×º ÐÌ ÙÖ ÔÙ ÑÓ Ð Þ Ö× Ô ØÓÖ Ñ ÒØ Ò ÍÅÄ ÓÑÓ Ò Ð ¬ ÙÖ ½º½º ÍÒ Ö Ø Ò ÙÐÓ Ö ÔÖ × ÒØ ÙÒ Ð × ÓÒ ØÖ × × ÓÒ ×º Ð ÒÓÑ Ö Ð Ð × × Ò Ù ÒØÖ Ò Ð × ÓÒ ×ÙÔ Ö ÓÖº Ð Ø ØÙÐÓ Ò Ð ØÖ ÙÖ× Ú Ò ÕÙ Ð Ð × × ×ØÖ Ø º Figure -point: Point +Figure(in point:Point) +Figure(in figure:Figure) +~Figure() +get_point(): Point +draw(): void +move(in p:Point): void +erase(): void +scale(in ratio:Ratio): void +rotate(in angle:Angle): void ÙÖ ½º½ Ö Ñ ÍÅÄ Ð Ð× Figure Ä × ÙÒ × ÓÒ Ò ÐÓ× ØÖ ÙØÓ× Ý Ð Ø Ö Ö ÐÓ× Ñ ØÓ Ó× Ù ÓÔ Ö ÓÒ ×º Ð ÔÖ ¬ Ó ¹ Ò ÒÓÑ Ö ØÖ ÙØÓ Ù ÓÔ Ö ÓÒ Ò ÕÙ Ð Ñ Ñ ÖÓ × Ò × Ð Ñ ÒØÖ × ÕÙ Ð × Ñ ÓÐÓ · Ò ÕÙ × ÓÑÔÐ Ø Ñ ÒØ × Ðº ÍÒ ÒÓÑ Ö ÓÔ Ö ÓÒ Ò Ð ØÖ ÙÖ× Ú Ò ÕÙ Ð ÓÔ Ö ÓÒ × Ú ÖØÙ Ð Ó ÔÓÐ ÑÓÖ ÓÒ ÔØÓ ÕÙ ×ØÙ Ö ÑÓ× ÔÖÓÒØ Ñ ÒØ º ÄÓ× ÒÓÑ Ö × Ø ÔÓ× Ö ØÓÖÒÓ Ý Ô Ö Ñ ØÖÓ× × × Ô Ö Ò ÐÓ× ÒÓÑ Ö × ÙÒ ÓÒ Ý Ô Ö Ñ ØÖÓ× ÓÒ Ó× ÔÙÒØÓ× ´ Ð ÒØ Ù ¸ Ô ÖÓ Ð ÒØ ¸ Ù× ÒÞ Ð È × Ð Ý Ð Óеº ÄÓ× Ô Ö Ñ ØÖÓ× Ø Ò Ò ÙÒ ÔÖ ¬ Ó Ð ¬ ÓÖ ÕÙ ÔÙ Ò Ø Ò Ö Ú ÐÓÖ × in¸ out Ó inout Ô Ö ×Ô ¬ Ö Ô Ö Ñ ØÖÓ× ÒØÖ ¸ × Ð Ó ÒØÖ »× Ð Ö ×Ô Ø Ú Ñ ÒØ º ÍÒ ÔÖÓ Ö Ñ ÓÑÔÐ Ó ÓÒØ Ò ÑÙ Ó× Ø ÔÓ× ×ØÖ ØÓ׺ Ù Ò Ó ×Ø ÒØ × Ö Ò ¸ Ù ÐÕÙ Ö Ð Ò Ù Ú Ò ÓÑÔÐ Ó Ô Ö Ñ Ö Ö Ò ÙÒ Ð × ×Ø Ñ Ý ÒØÖÓ
  • 37.
    1.2. Herencia 11 Ð Ó × ÖÚ Ö ×Ù× Ø ÔÓ× ØÓ× ÒØ ÖÖ Ð ÓÒ ×º Ä Ö Ò Ú ÒØ ÍÅÄ × ×Ù Ö Ø Ö Ö ¬ Ó¸ Ð Ù Ð Ð Ø Ó × ÖÚ Ö¸ ×ÓÐÓ Ú ×Ù Ð Ý Ó Ø Ú Ñ ÒØ ¸ ÐÓ× Ø ÔÓ× ×ØÖ ØÓ× Ò ÙÒ ×ÓÐ Ñ Ö º Ò ×Ø Ø ÜØÓ Ù× Ö ÑÓ× ÍÅÄ ×ÓÐÓ Ô Ö ×Ô ¬ Ö Ö Ñ × Ð × × ÒØ ÖÖ Ð ÓÒ × ÒØÖ ÐР׺ ÍÅÄ × ÙÒ Ð Ò Ù ÑÓ Ð Ó ÑÙ Ó Ñ × Ö Ó Ý Ð ÜÔ Ö Ò ¹ ÑÓ×ØÖ Ó ÕÙ ¸ Ô Ö Ò Ö ÓÑÓ Ò ÒØ ÖÔÖ Ø ÓÒ Ò ÙÒ ÔÖÓÝ ØÓ¸ ר × Ñ × × ÑÔÐ ÕÙ ÙÒ Ð Ò Ù ÔÖÓ Ö Ñ ÓÒº 1.2 Herencia ÐÌ ÙÖ ÑÓ Ð Þ ÙÒ ¬ ÙÖ Ò Ö Ð ÕÙ ÒÓ Ò Ò Ö ×Ù ÓÖÑ ÓÒ Ö Ø º Ë Ò Ñ Ö Ó¸ Ð ÑÓÑ ÒØÓ Ù Ö ÙÒ ¬ ÙÖ ¸ × Ø Ò ÕÙ ÓÒ Ö Ø Ö Ý ÓÒÓ Ö Ù Ð ¬ ÙÖ × ØÖ Ø º Ò Ð Ö Ó ØÓ׸ ÓÒ Ö Ø Ö × Ð ×Ô Ð Þ Ö Ý × Ö ÔÖ × ÒØ Ñ ÒØ ÙÒ Ö Ð ÓÒ ÐÐ Ñ ÖÒ Ð × º Ò ÍÅĸ ÓÒ Ö Ø Ö Ð ÙÒ × ¬ ÙÖ × Ó ÙÒ Ö Ñ ÍÅĸ Ö ×ÙÑ Ó¸ ÑÔÐ Ö Þ Ð ÓÒ ÔØÓ ÙÒ ÓÖÑ ÕÙ ÒÓ× Ô ÖÑ Ø Ú ×Ù Ð Þ Ö Ð × Ð × × Ý ×Ù× Ö Ð ÓÒ × Ò ÙÒ ×Ô Ò ÐÓ Ó Ø ÜÓÒÓÑ ¸ Ø Ð ÓÑÓ × ÐÙ×ØÖ Ò Ð ¬ ÙÖ ½º¾º Figure -point: Point +Figure(in point:Point) +Figure(in figure:Figure) +~Figure() +get_point(): Point +draw(): void +move(in p:Point): void +erase(): void +scale(in ratio:Ratio): void +rotate(in angle:Angle): void Triangle Square Circle -hypotenuse: float -side_size: float -ratio: float -angle_hypotenuse: float +get_side_size(): float +get_ratio(): float +get_hypotenuse(): float +...() +...() +get_angle_hypotenuse(): float +...() ÙÖ ½º¾ Â Ö ÖÕÙ Ð × × ×Ô ÐÞ × Ð Ð× Figure Ä Ö Ð ÓÒ Ö Ò × ÜÔÖ × Ò ÍÅÄ Ñ ÒØ ÙÒ ­ ÓÒØ Ù ÕÙ Ô ÖØ × Ð Ð × ×Ô Ð Þ Ð Ð × Ò Ö Ðº Ò Ð ×Ó ÑÔÐÓ¸ Ð Ð × Ò Ö Ð Ð ÓÒ ÓÖÑ Ð Ì ÙÖ ¸ Ñ ÒØÖ × ÕÙ Ð × Ð × × ×Ô Ð Þ × ÓÒ Ö Ø Ò Ð × ¬ ÙÖ × ×Ô ¬ × Triangle¸ Square Ý Circle¸ ×Ô Ð Þ ÓÒ × ØÖ Ò ÙÐÓ¸ Ù Ö Ó Ý Ö ÙÐÓ¸ Ö ×Ô Ø Ú Ñ ÒØ º
  • 38.
    12 Cap´ ıtulo 1. Abstracci´n de datos o Ä Ö Ò × ¬Ò ¸ ÒØÓÒ ×¸ ÓÑÓ Ð ÔÖÓÔ ÕÙ Ø Ò ÙÒ Ð × Ö Ö Ð×Ö ÓØÖ Ð × º Ð Ð × Ò Ö Ð × Ð ÐÐ Ñ Ð × × Ó ÙÒ Ñ ÒØ Ð ¸ Ñ ÒØÖ × ÕÙ Ð ×Ô Ð¹ Þ × Ð ÒÓÑ Ò Ð × Ö Ú º Ò Ð ÑÔÐÓ Ð × ¬ ÙÖ ×¸ Ð Ì ÙÖ × Ð × × Ð × Ð × × Ö Ú × Triangle¸ Square Ý Circleº ÑÓ׸ Ø Ñ Ò¸ ÕÙ Ð Ð × Ö Ú Ö Ð Ð × × Ò Ð × ÒØ Ó ÕÙ Ö ØÓ ×Ù ÒØ Ö Þ ÔÙ Ð º ÍÒ ØÖ Ò ÙÐÓ¸ ÔÓÖ Òר Ò ¸ Ö Ð ÔÙÒØÓ Ö Ö Ò ØÖ Ù Ð ØÓ × Ð × ¬ ÙÖ × Ò Ö Ð × × Ö¸ ÙÒ Ó ØÓ Ø ÔÓ Triangle ÔÙ ÒÚÓ Ö Ð Ñ ØÓ Ó get point()¸ ÔÙ × ×Ø Ù Ö Ó Ð Ì ÙÖ º Ò Ð Ö Ñ ÍÅÄ Ð ¬ ÙÖ ½º¾ × ÔÖ ÕÙ Ð × Ð × × Ö Ú × ÔÓ× Ò ØÖ ÙØÓ× Ý Ñ ØÓ Ó× ÕÙ ÒÓ × Ò Ù ÒØÖ Ò Ò Ð Ð × × º ÈÓÖ ÑÔÐÓ¸ Ð Ð × Circle ÔÓ× ÙÒ Ñ ØÓ Ó ÐÐ Ñ Ó get ratio() ÙÝ ÙÒ ÓÒ × Ó × ÖÚ Ö Ð Ö Ó Ð Ö ÙÒ Ö Ò ÕÙ Ö ÔÖ × ÒØ ÙÒ Òר Ò Ó ØÓ Ø ÔÓ Circleº Ð ØÖ ÙØÓ ratio Ø Ò × ÒØ Ó¸ × ÙÒ Ð ÓÑ ØÖ ¸ Ô Ö Ð Ð × Circle¸ Ô ÖÓ ÒÓ ÐÓ Ø Ò Ô Ö Ð × Ð × × Triangle Ý Squareº ÓÖ Ò¸ Ð × ØÖ × Ð × × Ö Ú × ÙÖ ÓÑÔ ÖØ Ò Ð ÔÙÒØÓ Ö Ö Ò ¸ ÔÙ × ÐÐ × ×ÓÒ¸ ÔÓÖ Ö Ú ÓÒ¸ Ø ÔÓ ÙÖ º ÄÓ ÒØ Ö ÓÖ ×Ù Ö ÙÒ ÒØ ÖÔÖ Ø ÓÒ Ð Ö Ò ÕÙ Þ Ñ × Ö Ð Ö Ð ÓÒ × Ö × Ö¸ Ð Ð × Ö Ú es¸ Ø Ñ Ò¸ Ð× ×º ר ÑÓ Ó¸ Ó ØÓ× Ø ÔÓ Triangle¸ Square Ý Circle son¸ Ø Ñ Ò¸ Ø ÔÓ Figureº Ä Ð Ö ÓÒ Ò C++ Ð Ö Ð ÓÒ Ö Ò ÒØ Ö ÓÖ × Ð × Ù ÒØ ½¾ ÙÖ × ÓÒ Ö Ø × ½¾ ≡ ´ µ struct Triangle : virtual public Figure { ... }; struct Square : public Figure { ... }; struct Circle : public Figure { ... }; Í× × Figure º Ä × Ù Ó ×Ô ¬ ÓÒ Ð Ð × Triangle Ò ÕÙ × ÙÒ Ð × ×ØÖ Ø º Ò ØÓ¸ ÒÓØ ÑÓ× ÕÙ ¸ Ò Ð ×Ó ÙÒ ØÖ Ò ÙÐÓ¸ × ÙÒ ÒÙ ×ØÖ ÙÐØÙÖ Ñ Ø Ñ Ø ¸ ÔÓ ¹ ÑÓ× ×Ô Ð Þ ÖÐÓ ÙÒ Ñ × × ÙÒ Ð × ÐÓÒ ØÙ × ×Ù× Ð Ó׺ ÄÓ Ö Ò Ó×Ó Ð Ö Ò × Ð ÔÓ× Ð ÜÔÖ × Ö ÓÒ ÔØÓ× Ý ×ØÖ ÓÒ × Ò Ö Ð × ØÖ Ú × Ð × × × × Ô Ö ÐÙ Ó Ô ÖØ ÙÐ Ö Þ ÖÐ × Ñ ÒØ Ö Ú ÓÒ ×º ×ØÓ Ó Ö Ð ÔÓ× Ð × Ò Ö Ò Ù Ø Ú Ñ ÒØ ¸ Ý Ò Ó × ÐÓ Ô ÖØ ÙÐ Ö ÐÓ Ò ¹ Ö Ð Ó¸ Ù Ø Ú Ñ ÒØ ¸ Ý Ò Ó × ÐÓ Ò Ö Ð ÐÓ Ô ÖØ ÙÐ Öº Ó ÓØÖÓ ÑÓ Ó¸ Ý Ò Ó × ÐÓ ÓÒ Ö ØÓ ÐÓ ×ØÖ ØÓ Ó¸ Ô Ö Ó Ñ ÒØ ¸ × ÐÓ ×ØÖ ØÓ ÐÓ ÓÒ Ö ØÓº 1.2.1 Tipos de herencia Ä ÖÒ Ð ÑÔÐÓ ÒØ Ö ÓÖ × ÒÓÑ Ò Ö Ò ÔÙ Ð ¸ ÔÙ × ÐÓ ÕÙ × ÔÙ Ð Ó Ð Ð × × Ø Ñ Ò Ú Ò ÔÙ Ð Ó Ò Ð Ð × Ö Ú º À Ý ÓØÖÓ ÑÓ Ó ÖÒ ÒÓÑ Ò Ó ÑÔÐ ÒØ ÓÒ Ó Ö Ò ÔÖ Ú º ר ÑÓ Ó ÜÔÖ × Ð Ó ÕÙ Ð Ð × × × Ù× Ô Ö ÑÔÐ ÒØ Ö Ð ¸ Ó Ô ÖØ и Ð × Ö Ú º Ò ÍÅÄ Ð Ö Ò ÔÖ Ú × Ö ÔÖ × ÒØ Ñ ÒØ ÙÒ ­ ÔÙÒ¹ Ø ¸ Ñ ÒØÖ × ÕÙ Ò C ++ Ñ ÒØ Ð Ð ¬ ÓÖ private ÓÑÓ ÔÖ ¬ Ó Ð ÒÓÑ Ö Ð Ð× ×º
  • 39.
    1.2. Herencia 13 1.2.2 Multiherencia Ò Ó × ÓÒ ×¸ ÙÒ Ð × Ó ØÓ es¸ Ð Ú Þ¸ Ó× Ó Ñ × Ð × ×º Ò Ð ÑÙÒ Ó Ó ØÓ׸ ×ØÓ ÔÙ ÜÔÖ × Ö× Ñ ÒØ ÙÒ Ö Ð ÓÒ Ö Ò ÑÙÐØ ÔÐ º × Ö¸ ÙÒ Ó ØÓ ÔÙ Ö Ö Ó× Ó Ñ × Ð × × × º Ä ¬ ÙÖ ½º¿ ÑÙ ×ØÖ ÙÒ Ö Ð ÓÒ Ð × × ÕÙ ÑÓ Ð Þ ÐÓ× ØÓÖ × ÙÒ ÍÒ Ú Ö× º Ø Ò ÓÒ ×Ô Ð Ñ Ö Ð Ð × Preparadorº Ò Ð Ú Ö Ð¸ ÙÒ ÔÖ Ô Ö ÓÖ × ÙÒ ×ØÙ ÒØ Ü Ð×Ó¸ ÙÝ Ü Ð Ò ÔÖ Ð ÍÒ ¹ Ú Ö× Ô Ö Ð × ×Ø Ò Ý Ñ ÓÖ ×Ù× ÙÖ×Ó׺ ÓÑÓ Ö ØÖ Ù ÓÒ¸ Ð ÍÒ Ú Ö× Ð ÓØÓÖ Ð ×ØÙ ÒØ ÙÒ ×Ø Ô Ò Óº Ò ÐÓ× Ø ÖÑ ÒÓ× Ð Ö Ñ ÍÅĸ Preparador Ö Ð × Ð × × Estudiante Ý Trabajador Universitario¸ Ö ×Ô Ø Ú Ñ ÒØ º ר ÑÓ Ó ¬Ò ÑÓ× ÕÙ ÙÒ ÔÖ Ô Ö ÓÖ es¸ Ð Ú Þ¸ ×ØÙ ÒØ Ý ØÖ ÓÖ ÙÒ Ú Ö× Ø Ö Óº Persona +nombres(): Nombres +cédula(): Cédula +edad(): int Trabajador Universitario Estudiante +salario(): Salario +antiguedad(): int +expediente(): Expediente_Estudiante +...() +...() Profesor Obrero Empleado Preparador ÙÖ ½º¿ Ê Ð ÓÒ × Ð×× Ô Ö×ÓÒ × Ò ÙÒ ÍÒ Ú Ö× × ÔÓ× Ð Ø Ò Ö Ö Ð ÓÒ × ÑÙÐØ Ö Ò ÒØ Ö Þ ÔÓÖ ÙÒ Ô ÖØ ¸ Ý Ñ¹ ÔÐ ÒØ ÓÒ ÔÓÖ Ð ÙÒ ÓØÖ º 1.2.3 Polimorfismo Ä Ô Ð Ö “polimorfo” ÔÖÓÚ Ò Ð Ö Ó π λυ ´ ÔÓÐÝ µ¸ ÕÙ × Ò ¬ ÑÙ Ó Ñ Ò¹ ØÖ × ÕÙ ÑÓÖ Ó ÔÖÓÚ Ò μορφ ´ ÑÓÖ µ¸ ÕÙ × Ò ¬ ¬ ÙÖ ¸ ÓÖÑ º ÈÓÐ ÑÓÖ Ó ÓÒÒÓØ ¸ Ô٠׸ ÑÙ × ¬ ÙÖ × ¸ ÑÙ × ÓÖÑ × º Ò Ð Ö Ó ØÓ׸ polimorfismo es la propiedad de expresar varias funciones o procedimientos diferentes o similares bajo el mismo nombreº À Ý ØÖ × Ð × × ÔÓÐ ÑÓÖ¬×ÑÓ ×Ó Ö Ö ¸ ÖÒ Ý ÔÐ ÒØ ÐÐ º
  • 40.
    14 Cap´ ıtulo 1. Abstracci´n de datos o 1.2.3.1 Polimorfismo de sobrecarga ËÓ Ö Ö × Ð Ô ÙÒ Ð Ò Ù Ó ØÓ× Ô Ö ¬Ò Ö ÒÓÑ Ö × Ù Ð × ÙÒ¹ ÓÒ ×¸ ÔÖÓ Ñ ÒØÓ× Ý Ñ ØÓ Ó׺ ÓÒ× Ö ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ Ð ÙÒ ÓÒ × Ù ÒØ const int sumar(const int & x, const int & y); ÙÝÓ ¬Ò × ×ÙÑ Ö Ó× ÒØ ÖÓ׺ sumar() ÔÙ ×Ó Ö Ö Ö× Ô Ö ÕÙ ×ÙÑ Ñ × ÒØ ÖÓ× const int sumar(const int & x, const int & y, const int & z); const int sumar(const int & w, const int & x, const int & y, const int & z); Ð ÓÑÔ Ð ÓÖ¸ ØÖ Ú × Ð ÒØ Ô Ö Ñ ØÖÓ׸ Ö Ð Þ Ð ×Ø Ò ÓÒ Ý ÙÐ Ð × ØÖ × ÙÒ ÓÒ × × Ð ÕÙ × ÒÚÓ Öº ÈÓÖ ÑÔÐÓ¸ × Ð ÓÑÔ Ð ÓÖ Ò Ù ÒØÖ sumar(1, 2, 3); ÒØÓÒ × ×Ø Ò Ö Ö Ð ÐÐ Ñ sumar() ÓÒ ØÖ × Ô Ö Ñ ØÖÓ׺ × ÔÓ× Ð ¸ Ø Ñ Ò¸ ¬Ò Ö sumar() Ô Ö ÕÙ ×ÙÑ ÓØÖ Ð × Ó ØÓ׺ ÈÓÖ ÑÔÐÓ const string sumar(const string & x, const string & y); Ä ×ÙÑ Ò × ÔÙ ÒØ ÖÔÖ Ø Ö× ÓÑÓ Ð ÓÒ Ø Ò ÓÒº Ð ÓÑÔ Ð ÓÖ Ö Ð Þ Ð ×Ø Ò ÓÒ Ö ×Ô ØÓ Ð × Ú Ö× ÓÒ × Ö ØÑ Ø × Ñ ÒØ ÐÓ× Ø ÔÓ× ÐÓ× Ô Ö Ñ ØÖÓ׺ Ò C++ × ÔÙ Ò ×Ó Ö Ö Ö ÐÓ× ÓÔ Ö ÓÖ ×º ÈÓÖ ÑÔÐÓ¸ ÔÓ Ö ÑÓ× ×Ô ¬ Ö Ð ÓÒ Ø Ò ÓÒ Ò × Ð × Ù ÒØ ÑÓ Ó const string operator + (const string & x, const string & y); Ò ×Ø ×Ó¸ ÔÙ × Ö Ö× Ð Ó × ÓÑÓ string s1, s2; ... string s3 = s1 + s2; Ä ×Ó Ö Ö ÓÔ Ö ÓÖ × ¸ Ò ÐÙ× Ú ¸ Ð ÙÒ ÓÒ ×¸ × ÙÒ ×ÙÒØÓ ÔÓÐ Ñ Ó ÔÓÖÕÙ Ó ÙÐØ ÓÔ Ö ÓÒ × Ý ÔÙ ÓÒØÖ Ú Ò Ö Ð × ÒØ Ó ÙÐØÙÖ Ð Ð ÓÔ Ö ÓÖº ÈÓÖ ÑÔÐÓ¸ Ð Ó Ó ÒØ Ö ÓÖ Ø Ò Ô Ö ØÓ × ÒØ Ó ÙÐØÙÖ Ð Ô Ö Ð Ö ØÑ Ø ¸ Ô ÖÓ ÕÙ Þ ÒÓ Ô Ö Ð ÓÒ Ø Ò ÓÒº Ù Ò Ó Ò ÙÒ ÔÖ Ñ Ö Ò×Ô ÓÒ ÙÒ Ð ØÓÖ Ð Ð ×ÙÑ Ò ×¸ ÔÓ× Ð Ñ ÒØ Ð Ô Ò× Ö ÕÙ ÐÓ× ÓÔ Ö Ò Ó× ×ÓÒ ÒÙÑ Ö Ó׸ ÐÓ Ù Ð Ò Ð ÙÐØ ÑÓ ÑÔÐÓ ÒÓ × Ð ×Óº ÈÓÖ × Ö ÞÓÒ¸ × ÔÓÖ ÐÓ Ò Ö Ð Ö ÓÑ Ò Ð Ú Ø Ö Ð ×Ó Ö Ö º 1.2.3.2 Polimorfismo de herencia ÙÒ Ö Ð ÓÒ ÖÒ ÒØÖ ØÖ × Ð × × X¸ Y Ý Z¸ ÜÔÖ × Ö ¬ Ñ ÒØ Ð × Ù ÒØ Ñ Ò Ö X +método(...): T Y Z +método(...): T +método(...): T
  • 41.
    1.2. Herencia 15 Ð ÔÓÐ ÑÓÖ¬×ÑÓ Ö Ò × ¬Ò ÓÑÓ Ð ÔÓ× Ð ¬Ò Ö ´ÒÓ ×Ó Ö Ö Öµ Ñ ØÓ Ó× Ú ÖØÙ Ð × Ð Ñ ×ÑÓ ÒÓÑ Ö Ò Ð × ØÖ × Ð × ×¸ ÒÚÓ Ö Ð Ñ ØÓ Ó × Ð Ð × X Ý Ø ÖÑ Ò Ö¸ Ò Ø ÑÔÓ Ù ÓÒ¸ Ù Ð × Ð Ñ ØÓ Ó ÓÒ Ö ØÓ × ÙÒ × Ð ÑÔÐ ÒØ ÓÒ Ö Ð Ð Ð × Xº ÐÓ× Ñ ØÓ Ó× Y::m´todo() Ý Z::m´todo() × Ð × ÓÒÒÓØ ÓÑÓ ×Ô Ð Þ ÓÒ × e e Ð Ñ ØÓ Ó Ò Ð Ð × × X::m´todo()º e ÈÓ Ö Ö× ÕÙ Ð ÔÓÐ ÑÓÖ¬×ÑÓ Ö Ò × Ð ×Ó Ö Ö Ñ ØÓ Ó× Ú ÖØÙ Ð × ÒØÖ Ð × Ð × ×º × ÑÔÓÖØ ÒØ Ö × ÐØ Ö ÕÙ ¸ Ò ×Ø ×Ó¸ ÐÓ× ÔÖÓØÓØ ÔÓ× ÐÓ× Ñ ØÓ Ó× Ú ÖØÙ Ð × Ø Ò Ò ÕÙ × Ö ÒØ Ó׺ Ê ÓÖ ÑÓ× ÕÙ Ð Ì ÙÖ ÓÒØ Ò Ñ ØÓ Ó× Ú ÖØÙ Ð ×¸ ÔÙÖÓ׸ ÕÙ ÒÓ × ÔÙ Ò ÑÔÐ ÒØ Öº Ë ÔÖ Ø Ò × ÑÓ× Ù Ö ÙÒ Ó ØÓ Ø ÔÓ ÙÖ ¸ × ÒÓ× Ô Ö ¹ Ö Ð ÔÖ ÙÒØ Ù Ð ¬ ÙÖ ¸ ÔÙ × Ð Ì ÙÖ × ÙÒ ¬ ÙÖ ×ØÖ Ø ¸ ÒÓ ÓÒ Ö Ø º × Ù Ò Ó ÓÒÓ ÑÓ× Ù Ð × Ð ¬ ÙÖ ÕÙ Ø Ò × ÒØ Ó Ò Ö ÓÑÓ Ù ÖÐ º Ä ÑÔÐ ÒØ ÓÒ ÙÒ Ñ ØÓ Ó Ú ÖØÙ Ð ÔÙÖÓ × Ð Ð ÙÒ Ð × Ö Ú º È Ö Ð ×Ó Ð Ì ÙÖ ¸ ×Ù× ÙÖ × ÓÒ Ö Ø × ½¾ Ò ÑÔÐ ÒØ Ö ×Ù× Ñ ØÓ Ó× Ú ÖØÙ Ð × ÔÙÖÓ׺ ÈÓÖ ÑÔÐÓ¸ ÐÓ× Ñ ØÓ Ó× Square::draw() Ý Circle::draw() ÑÔÐ ÒØ Ò ÑÒÖ Ö ÒØ Ð Ù Ó ×Ù ÓÖÖ ×ÔÓÒ ÒØ ¬ ÙÖ º ר ÑÓ Ó¸ Ù Ò Ó × ÓÔ Ö ×Ó Ö ÙÒ Ó ØÓ Ò Ö Ð Ø ÔÓ ÙÖ Ý × ÒÚÓ ÙÒ Ñ ØÓ Ó Ú ÖØÙ Ð¸ × × Ð ÓÒ ¸ Ò Ø ÑÔÓ Ù ÓÒ¸ Ð Ñ ØÓ Ó ×Ô Ð Þ ÓÒ × ÙÒ Ð ¬ ÙÖ ÓÒ Ö Ø ×Ó Ö Ð Ù Ð × ×Ø ÓÔ Ö Ò Óº Ä Ú ÖØÙ Ð ÔÓÐ ÑÓÖ¬×ÑÓ Ö Ò × ÕÙ Ô ÖÑ Ø × Ö Ö ÔÖÓ Ö Ñ × Ò Ö Ð × ÕÙ Ñ Ò ÔÙÐ Ò ¬ ÙÖ × Ò Ö Ð × º רÓ× ÔÖÓ Ö Ñ × ÒÓ Ö ÕÙ Ö Ò ÓÒÓ Ö Ð × ¬ ÙÖ × ÓÒ Ö Ø ×¸ ÔÙ × ÓÔ Ö Ò Ò ÙÒ ÓÒ Ñ ØÓ Ó× Ú ÖØÙ Ð × Ò Ö Ð × ÔÙÖÓ׺ ÈÓÖ ÑÔÐÓ¸ Ô ÖØ × ÔÖÓ Ö Ñ × Ô Ö Ù Ö ¬ ÙÖ × Ñ Ò ÔÙÐ Ò ¬ ÙÖ × Ò ×ØÖ ØÓ¸ Ð × Ù Ò¸ Ð × ÑÙ Ú Ò¸ Ð × ÖÓØ Ò¸ Ø Ø Ö º ØÓ× ÓÒÓÑ Þ Ö Ó Ó¸ Ö ×ÙÐØ ÙØ Ð Ð ÔÓ× Ð × Ö Ö ÔÖÓ Ö Ñ × Ò Ö Ð × ÓÑÓ Ð Ð ÑÔÐÓ × Ù ÒØ ½ ÅÒ Ó ÒÖÐ ÙÖ ½ ≡ void release_left_button(const Action_Mode mode, Figure & fig) { switch (mode) { case Draw: case Move: fig.draw(); break; case Delete: fig.erase(); break; case Scale: fig.scale(dif_mag_with_previous_click()); break; case Rotate: fig.rotate(dif_angle_with_previous_click()); break; ... } } Í× × Figure º Ð Ù Ð × Ö ÒÚÓ Ò ×Ó ÕÙ × Ø Ø ÕÙ × ×Ù ÐØ Ð ÓØÓÒ ÞÕÙ Ö Ó Ð Ö ØÓÒ ÒØÖÓ ÙÒ Ð ÒÞÓ ×ØÖ ØÓ Ù Óº release left button() ÒÓ Ö ÕÙ Ö ÓÒÓ Ö Ð ¬ ÙÖ ÓÒ Ö Ø º ËÙ Ó Ó × ¹ Ò Ö Ð Ý ÒÓ × Ø ÔÓÖ Ð × ÑÓ ¬ ÓÒ × Ó Ò ÙÖ × Ð × ¬ ÙÖ ×º ÈÓÖ ÑÔÐÓ¸ × release left button() ÓÔ Ö ×Ó Ö ÙÒ Ù Ö Ó¸ ÒØÓÒ × × ÒÚÓ Ö Ò ÐÓ× Ñ ØÓ Ó× ÒÙ ÚÓ¸ Ð Ö ÙÒ Ò × Ö º
  • 42.
    16 Cap´ ıtulo 1. Abstracci´n de datos o Ú ÖØÙ Ð × ÓÒ Ö ØÓ× Ð Ð× Square Ò ÐÓ Ñ ÒØ ¸ Ó ÙÖÖ ÓÒ ÙÒ Ö ÙÐÓ¸ ×Ó Ò Ð Ù Ð × ÒÚÓ Ö Ò ÐÓ× Ñ ØÓ Ó× Circleº 1.2.3.3 Polimorfismo de plantilla (tipos parametrizados) À Ý × ØÙ ÓÒ × Ò Ð × Ù Ð × ÙÒ ÔÖÓ Ð Ñ Ý ×Ù ×ÓÐÙ ÓÒ ÔÙ Ò ×Ô ¬ Ö× ÓÖÑ Ò¹ Ô Ò ÒØ Ð ´Ó ÐÓ×µ Ø ÔÓ´×µ ØÓ´×µº ÈÓÖ ÑÔÐÓ¸ Ð ÔÖÓ Ð Ñ Ù× Ö ÙÒ Ð Ñ ÒØÓ Ò ÙÒ ÓÒ ÙÒØÓ¸ Ý ×Ù ×ÓÐÙ ÓÒ¸ ×ÓÒ Ò Ô Ò ÒØ × Ð Ø ÔÓ Ð Ñ ÒØÓ׺ Ë ×ÙÔÓÒ ÑÓ× ÕÙ Ð ÓÒ ÙÒØÓ × Ö ÔÖ × ÒØ Ñ ÒØ ÙÒ ÖÖ ÐÓ¸ ÒØÓÒ ×¸ ÙÒ ÔÓ× Ð Ñ Ò Ö ¸ Ò Ö ¸ Ù× Ö ÙÒ Ð Ñ ÒØÓ × ÓÑÓ × Ù ½ Ù×ÕÙ ÒØÖÓ ÙÒ ÖÖ ÐÓ ½ ≡ template <typename T, class Compare> int sequential_search(T * a, const T& x, int l, int r) { for (int i = l; i <= r; i++) if (are_equals<T, Compare> () (a[i], x)) return i; return No_Index; } Í× × sequential search ½ º ר ÖÙØ Ò Ù× Ð Ð Ñ ÒØÓ x ÒØÖÓ Ð Ö Ò Ó ÓÑÔÖ Ò Ó ÒØÖ l Ý r Ð ÖÖ ÐÓ aº Ë Ö ØÓÖÒ ÙÒ Ò ÒØÖÓ Ð ÖÖ ÐÓ ÓÖÖ ×ÔÓÒ ÒØ ÙÒ ÒØÖ ÕÙ ÓÒØ Ò ÙÒ Ð Ñ ÒØÓ Ù Ð x¸ Ó Ð Ú ÐÓÖ No Index ´ÔÓÖ ÐÓ Ò Ö Ð −1µ¸ × Ð ÖÖ ÐÓ ÒÓ ÓÒØ Ò xº Ô ÖØ ÐÓ× Ô Ö Ñ ØÖÓ× Ô ÖØ Ò ÒØ × Ð ÓÒ ÙÒØÓ¸ Ð Ð ÓÖ ØÑÓ Ò Ö Ó sequential search<T, Compare>() Ö ÕÙ Ö Ó× Ø ÔÓ× Ô Ö Ñ ØÖ Þ Ó× Ð Ø ÔÓ ØÓ Ð ÓÒ ÙÒØÓ¸ ÒÓÑ Ò Ó Ò Ö Ñ ÒØ T¸ Ý ÙÒ Ø ÔÓ ÓÑÔ Ö ÓÖ Ù Ð¹ ÐÐ Ñ Ó are equals<T, Compare>() ÙÝÓ Ù×Ó × Ö ÓÖ Ó Ò Ü ½º¿º½ ´Ô Ò ½ µº ÙÒ ÓÒ × Ó Ñ ØÓ Ó× ÓÑÓ sequential search<T, Compare>() × ÒÓÑ Ò Ò ÔÐ Ò¹ Ø ÐÐ × º ÑÓ× ÕÙ sequential search<T, Compare>() × Ò Ö ÔÓÖÕÙ genera ÙÒ Ñ Ð ÙÒ ÓÒ × Ô Ö Ø ÔÓ Ü ×Ø ÒØ Ò Ð Ù Ð Ü ×Ø ÙÒ Ð × are equals()º Ò ÓØÖ × Ô Ð Ö ×¸ ÙÒ ÔÐ ÒØ ÐÐ ÙØÓÑ Ø Þ Ð ×Ó Ö Ö Ð ÙÒ ÓÒ Ó Ð × Ô Ö ÐÓ× Ø ÔÓ× ÒÚÓÐÙ Ö Ó× Ò Ð ÔÐ ÒØ ÐÐ º Ç × ÖÚ ÑÓ× ÕÙ ÙÒÕÙ Ð ÔÐ ÒØ ÐÐ × Ð Ñ ×Ñ ¸ Ó × ¸ × Ò Ö ¸ Ð Ó Ó Ò Ö Ó sequential search<int, are equals<int> >(...) × Ö ÒØ Ð Ð ÓÖ ØÑÓ sequential search<string, are equals<string> >(...)º Ð ÓÑÔ Ð ÓÖ Ò¹ Ö Ö Ó× Ó Ó× ×Ø ÒØÓ× ÙÒÓ Ô Ö ÖÖ ÐÓ× ÒØ ÖÓ× ´intµ Ý Ð ÓØÖÓ Ô Ö ÖÖ ÐÓ× Ò × ´stringµº Ù Ò Ó × ÑÔÐ ¬ Ó Ð Ð × ÙÖ ¸ × Ò Ó ÕÙ ×Ù ¬Ò × Ù ÖÐ Ò ÙÒ Ñ Ó ÓÒØÖ ×Ø º Ù ÐÑ Ó× Ð Ô Ô Ð¸ Ô ÒØ ÐÐ Ú Ó¸ Ø Ð Ú ×ÓÖ¸ ÓÐÓ Ö ¸ ººº Ð Ð ØÓÖ Ù Ó×Ó Ö× Ô Ö Ø Ó ÕÙ Ð × ÑÔÐ ÒØ ÓÒ × Ð Ð × ÙÖ ´Square¸ Triangle Ý Circleµ¸ Ø Ò Ò ÕÙ ×ÙÑ Ö ÙÒ Ñ Ó Ò ÓÒ Ö Ð Þ Ö Ð × ÓÔ Ö Ó¹ Ò ×º ÍÒ Ñ Ò Ö Ò Ô Ò Þ Ö× Ð Ñ Ó ÓÒØÖ ×Ø × Ö Ð Ð× ÙÖ ÙÒ ÔÐ ÒØ ÐÐ ÙÝÓ Ô Ö Ñ ØÖÓ × ¸ Ùר Ñ ÒØ ¸ Ð Ñ Ó ÓÒØÖ ×Ø º Ä × ÐÙ×ØÖ Ò Ð Ö Ñ ÍÅÄ Ð ¬ ÙÖ ½º º Ò Ò Ð ×¸ Ø ÑÔÐ Ø º
  • 43.
    1.2. Herencia 17 Medium_Type:Medium Figure -point: Point +medium: Medium_Type +Figure(in point:Point) +Figure(in figure:Figure) +~Figure() +get_point(): Point +draw(): void +move(in p:Point): void +erase(): void +scale(in ratio:Ratio): void +rotate(in angle:Angle): void ÙÖ ½º Ö Ñ ÍÅÄ Ð Ð× ÙÖ ÓÒ Ð Ñ Ó ÓÒØÖ ×Ø ÓÑÓ Ô Ö Ñ ØÖÓ Ò ÍÅĸ ÐÓ× Ô Ö Ñ ØÖÓ× ÔÐ ÒØ ÐÐ Ð Ð × × ×Ô ¬ Ò Ò ÙÒ Ö Ø Ò ÙÐÓ ÔÙÒØ Ó × ØÙ Ó Ò Ð ×ÕÙ Ò ×ÙÔ Ö ÓÖ Ö º ÍÒ Ó ØÓ Ø ÔÓ ÙÖ ÔÓ× ÓÑÓ Ø ÔÓ Ô Ö Ñ ØÖ Þ Ó Ð Ñ Ó Ò ÓÒ × Ñ Ò ÔÙÐ Ò Ð × ¬ ÙÖ ×º ÈÙ × Ö Ò × Ö Ó ÕÙ Ð × ×Ô Ð Þ ÓÒ × ÙÖ ÓÒÓÞ Ò Ð Ø ÔÓ ÓÒ Ö ØÓ Ð Ñ Ó ÓÒØÖ ×Ø º ÈÓÖ ×Ø Ö ÞÓÒ¸ Ð Ú Ö× ÓÒ ÔÐ ÒØ ÐÐ ÙÖ ÜÔÓÖØ Ð Ø ÔÓ Ô Ö Ñ ØÖ Þ Ó Ó Ð ÒÓÑ Ö Medium Typeº Ò C++ ר ÓÒ × ÐÐ Ú Ó Ñ ÒØ Ð × Ù ÒØ Ð Ö ÓÒ ½ Ç × ÖÚ ÓÖ × ÙÖ +≡ ´ µ typedef Medium Medium_Type; ר Ñ Ò Ö ¸ ÙÒ ×Ô Ð Þ ÓÒ ÔÙ Òר Ò Ö ÙÒ Ó ØÓ Ø ÔÓ Medium Type ÓÑÓ × ÐÙ×ØÖ Ò Ð × Ù ÒØ ÑÔÐÓ void Square::draw() { /* .... */ Medium_Type m; // Instancia un objeto "medio de contraste" /* .... */ medium.put_line(...); } Ð ØÖ ÙØÓ Ø ÔÓ medium Ð Ð × Figure<Medium> Ð Ô ÖÑ Ø ×Ó Ð Ñ ×ÑÓº Ä ×Ô Ð Þ ÓÒ Square::draw() Ù Ö Ð Ò × Ò Ð Ñ Ó ÓÒØÖ ×Ø ÓÖÖ ×ÔÓÒ ÒØ × Ð Ö ×Ô Ø ÚÓ Ù Ö Óº Ä ÑÔÐ ÒØ ÓÒ Square::draw() Ú Ò Ò Ö Ö ×Ô ØÓ Ð Ñ Óº
  • 44.
    18 Cap´ ıtulo 1. Abstracci´n de datos o 1.2.3.4 Lo general y lo gen´rico e ÄÓ× Ø ÖÑ ÒÓ× Ò Ö Ð Ý Ò Ö Ó ÒÓ ×ÓÐÓ × Ô Ö Ò ÑÙ Ó Ð Ü Ñ ÒØ ¸ × ÒÓ ÕÙ ¸ Ò ØÓ¸ Ø Ñ Ò ×ÓÒ ÑÙÝ × Ñ Ð Ö × × Ñ ÒØ Ý Ø ÑÓÐÓ Ñ ÒØ º Ä Ö Þ Ñ Ó× Ø ÖÑ ÒÓ× × Ð Ú Ö Ó Ð Ø ÒÓ Ò ÖÓ¸ ÕÙ × Ò ¬ Ò Ò Ö Ö¸ Ö Öº Ò ×Ø ÔÓ ¸ Ø ÒØÓ Ò Ö Ð ÓÑÓ Ò Ö Ó ÓÒÒÓØ Ò ÐÓ ÕÙ × ÓÑÙÒ ÙÒ ×Ô º Ò ÖÓ ÔÖÓÚ Ò Ð Ú Þ Ð Ö Ó γ νος ´ ÒÙ×µ ÕÙ Ò Ð Ð Ò Ù ÑÓ ÖÒÓ ÓÒÒÓØ Ö Þ Ý ÕÙ Ò Ö Ó × Ö Ö ÐÓ ÓÑÙÒº ÒÙ× ÔÖÓÚ Ò ÙÒ ÑÙÝ ÑÔÐ Ú Ö Ø ÖÑ ÒÓ× Ò ÖÓ¸ Ò¸ Ò Ø ¸ ÒØ Ð Ó¸ Ò ÖÓ×Ó¸ ÒØ ¸ Ò ÐÓ ¸ Ò Ó¸ Ò Ð¸ Ò Ò Ó¸ Ò Ò Ö ¸ Ø Ø Ö º Ò ×Ù Ð Ö × Ñ Ý ØÖ × Ò ÒØ Ð Å Ø × ¸ Ö ×ØÓØ Ð × ×Ø Ò Ù Ð Ò ÖÓ ÓÑÓ ÐÓ ÕÙ Ð × × Ò ÐÑ ÒØ ÓÑÙÒ ÙÒ ×Ô º ÈÓ ÑÓ× Ö¸ Ô٠׸ ÕÙ Ð Ö Ó ØÓ× ×Ø ¸ × Ñ × ¾ ¼¼ ÒÓ׸ ÑÔÖ Ò ÔÓÖ ×Ø º Ò Ð ×Ó Ð ÔÖÓ Ö Ñ ÓÒ Ó ØÓ׸ Ò Ö Ð ÒØ ¬ Ð × × Ó ØÓ× Ò Ö Ð × × Ö¸ × × ÓØÖ × Ð × × Ñ × Ô ÖØ ÙÐ Ö ×¸ Ò Ú Ù Ð ×¸ Ó Ð × × ÕÙ ÓÔ Ö Ò ×Ó Ö Ð Ò Ö Ð º ÈÓÖ ÑÔÐÓ׸ Ð Ð × ÙÖ × Ò Ö Ð ØÓ × Ð × ¬ ÙÖ ×¸ Ñ ÒØÖ × ÕÙ Ð Ð × are equals() Ö ÔÖ × ÒØ Ð ÓÑÔ Ö ÓÒ Ò Ö Ð Ý Ò Ö ÒØÖ Ó ØÓ׺ Ò Ö Ó ÓÒÒÓØ ÐÓ ÕÙ Ò Ö Ó × ¸ Ò Ð ÓÖ ÒØ ÓÒ Ó ØÓ׸ Ð × ÔÐ ÒØ ÐР׸ ÓÒ ÔØÓ ÕÙ Ö Ò ÑÓ× ÔÖ × ÒØ Ö Ý ÑÔÐ ¬ Öº 1.3 El problema fundamental de estructuras de datos Ü ×Ø ÙÒ Ð × ÔÖÓ Ð Ñ ÙÝ Ó ÙÖÖ Ò × Ø Ò Ù Ù Ò ÔÖ Ø Ñ ÒØ ØÓ Ó× ÐÓ× Ñ ØÓ× Ð ÔÖÓ Ö Ñ ÓÒ ÕÙ Ý × ÔÓ× Ð Ò Ö Þ ÖÐ Ò ÙÒ ×ÓÐ Ð × º Ë ØÖ Ø Ð ÓÒ ÙÒØÓº ÈÙ ×ØÓ ÕÙ Ò Ð Ñ ÝÓÖ ÐÓ× ×Ó× ÐÓ× Ð Ñ ÒØÓ× ×ÓÒ Ð Ñ ×ÑÓ Ø ÔÓ¸ × ÔÓ× ¹ Ð Ó Ø Þ ÖÐÓ Ò ÙÒ Ì Ò Ö Ó Ø Ð ÓÑÓ ÐÓ ÐÙ×ØÖ Ð Ö Ñ ÍÅÄ Ð ¬ ÙÖ ½º º Ð Ö Ñ Ò Ù ×Ø ÓÒ ÑÓ Ð Þ ÐÓ ÕÙ × ÓÒÓ ÓÑÓ Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð ×¹ ØÖÙ ØÙÖ × ØÓ× º Ä × Ö ÒØ × Ñ Ò Ö × ÑÔÐ ÒØ ÖÐÓ Ý ×Ù× Ú Ö× × Ö ÙÒר Ò × ÔÐ ÓÒ Ö Ò × ØÓ Ó Ð ÓÖÔÙ× ×Ø Ø ÜØÓº Key_Type:T Compare_Type:Compare Set +insert(in key:T): void +search(in key:T): T * +remove(in key:T): void +size(): size_t +swap(inout set:Set<T, Compare>): void +join(in set:Set<T, Compare>): Set<T> +split(in key:T,out l:Set<T, Compare>,out r:Set<T, Compare>): void +position(in key:T): int +select(in pos:int): T* +split_pos(in pos:int,out l:Set<T, Compare>, out r:Set<T, Compare>): void ÙÖ ½º Ö Ñ ÍÅÄ ÙÒ Ð × ÒÖ ÓÒ ÙÒØÓ ´Ë ص
  • 45.
    1.3. El problemafundamental de estructuras de datos 19 Ä Ð × Set<T, Compare> ÑÓ Ð Þ ÙÒ ÓÒ ÙÒØÓ Ò Ö Ó ØÓ× Ø ÔÓ T¸ ÓÒ Ö Ø Ö Ó ÓÑÔ Ö ÓÒ Compare¸ ÙÝÓ ¬Ò × Ò Ö Ð Þ Ö ÓÔ Ö ÓÒ × ×Ó Ö ÓÒ ÙÒØÓ× × Ò ÕÙ ÒÓ× ÒØ Ö × ÓÑÓ ×ØÓ× × ÑÔÐ ÒØ Òº À Ý ÑÙ × ÓÖÑ × ÑÔÐ ÒØ Ö Ð Ø ÔÓ Set<T, Compare>º Ä × ÓÒ Ô Ò ×Ù× Ö ÙÒר Ò × Ù×Óº ÓÒ ÙÒØÓ× ØÓ× ÕÙ × ÓÖÖ ×ÔÓÒ Ò ÓÒ Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð × ÒÓÑ Ò Ò ÓÒØ Ò ÓÖ × º ÍÒ ÓÒØ Ò ÓÖ ×¸ Ô٠׸ ÙÒ ÓÒ ÙÒØÓ Ð Ñ ÒØÓ× Ð Ñ ×ÑÓ Ø ÔÓº Set<T, Compare> ÔÙ ÑÓ Ð Þ Ö× Ò C++ ÓÑÓ × Ù ½ ÓÒ ÙÒØÓ ÙÒ Ñ ÒØ Ð ½ ≡ template <typename T, class Compare> struct Set { void insert(const T & key); T * search(const T & key); void remove(const T & key); const size_t size() const; void swap(Set<T, Compare> & set); void join(Set<T, Compare> * set); void split(const T& key, Set<T, Compare> *& l, Set<T> *& r); const int position(const T& key) const; T * select(const int pos); void split_pos(const int & pos, Set<T, Compare> *& l, Set<T, Compare> *& r); }; Ò Ð Ò × Ò Ö Ð ×¸ Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð × ¬Ò ÓÑÓ Ð Ñ ÒØ Ò Ñ ÒØÓ ÙÒ ÓÒ ÙÒØÓ Set<T, Compare> Ð Ñ ÒØÓ× Ø ÔÓ T ÓÒ Ð × ÓÔ Ö ÓÒ × × × Ò× Ö ÓÒ¸ Ù×ÕÙ ¸ ×ÙÔÖ × ÓÒ Ý Ö Ò Ð Ý ÙÝ × ÒØ Ö × ÙÒ Ñ ÒØ Ð × ×ÓÒ insert()¸ search()¸ remove() Ý size()¸ Ö ×Ô Ø Ú Ñ ÒØ º Ö Ù ÒØ Ñ ÒØ ¸ ÐÓ× Ð Ñ ÒØÓ× Ð ÓÒ ÙÒØÓ × ÒÓÑ Ò Ò Ð Ú × º ÐÐ Ð ÒÓÑ Ö Ô Ö Ñ ØÖÓ key Ò ÑÙ × Ð × ÒØ Ö × Set<T, Compare>º swap(set) ÒØ Ö Ñ ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ× set ÓÒ ÐÓ× thisº Ë ÙÒ Ð ×ØÖÙ ¹ ØÙÖ ØÓ× ÓÒ ÕÙ × ÑÔÐ ÒØ Set<T, Compare>¸ Ð ÙÒ × Ú × ×Ø ÓÔ Ö ÓÒ × Ö ÑÙÝ Ö Ô º Ð Ñ ØÓ Ó join(set) ÙÒ this ÓÒ Ð ÓÒ ÙÒØÓ Ö Ö Ò Ó ÔÓÖ Ð Ô Ö Ñ ØÖÓ setº ×ÔÙ × Ð ÓÔ Ö ÓÒ¸ set Ú Ò Ú Óº join() ÔÙ Ø Ò Ö Ú Ö ÓÒ × × ÙÒ Ð Ø ÔÓ ÓÒ ÙÒØÓ Ý Ð ×ØÖÙ ØÙÖ ØÓ׺ Ä × Ñ × ÓÑÙÒ × ×ÓÒ Ð ÓÒ Ø Ò ÓÒ Ý Ð ÒØ Ö Ô ÓÒº 1.3.1 Comparaci´n general entre claves o ÅÙ × Ú × Ð Ø ÔÓ Ò Ö Ó T × ÓÖ Ò Ð × Ö¸ Ð × Ð Ú × ÔÙ Ò ×ÔÓÒ Ö× Ò ÙÒ × Ù Ò ÓÖ Ò × Ð Ñ ÒÓÖ ×Ø Ð Ñ ÝÓÖ Ó Ú Ú Ö× º Ò ×Ó× ×Ó׸ Ô Ö Ò Ð Ö ×ØÓ Ð × ÓÔ Ö ÓÒ × Ý Ð Ð × ÓÑÔ Ö ÓÒ Compareº Compare × ÙÒ Ð × ÕÙ ÑÔÐ ÒØ Ð ÓÑÔ Ö ÓÒ ÒØÖ Ó× Ð Ñ ÒØÓ× Ø ÔÓ Tº ÈÓÖ ÐÓ Ò Ö Ð¸ Compare ÑÔÐ ÒØ Ð ÓÔ Ö ÓÖ Ö Ð ÓÒ Ð <º ÓÒ ÙÒ Ð × ×Ø Ø ÔÓ¸ × ÔÓ× Ð Ö Ð Þ Ö Ð Ö ×ØÓ ÐÓ× ÓÔ Ö ÓÖ × Ö Ð ÓÒ Ð ×º ÈÓÖ ÑÔÐÓ¸ × Ø Ò ÑÓ× Ó× Ð Ú × k1 Ý k2 Ý ÙÒ Ð × Compare<T> ÙÝÓ ÓÔ Ö ÓÖ () ÑÔÐ ÒØ k1 < k2¸ ÒØÓÒ × Ð × Ù ÒØ × Ù Ó Ó Ó ÑÔÐ ¬ ØÓ × Ð × ÓÑÔ Ö ÓÒ × ÔÓ× Ð ×
  • 46.
    20 Cap´ ıtulo 1. Abstracci´n de datos o if (Compare() (k1, k2)) // ¿k1 < k2? // acci´n a ejecutar si k1 < k2 o else if (Compare() (k2, k1)) // ¿k2 < k1? // acci´n a ejecutar si k2 < k1 o else // Tienen que ser iguales // acci´n a ejecutar si k1 == k2 o 1.3.2 Operaciones para conjuntos ordenables Ë Ð ÓÒ ÙÒØÓ × ÓÖ Ò Ð ¸ ÒØÓÒ × ×Ø ÔÙ ÒØ ÖÔÖ Ø Ö× ÓÑÓ ÙÒ × Ù Ò ÓÖ Ò S =< k0, k2, . . . , kn−1 >¸ ÓÒ n × Ð Ö ÒÐ Ð ÓÒ ÙÒØÓº Ò × ×Ó¸ ÔÙ Ò Ö Ð Þ Ö× Ú Ö × ÓÔ Ö ÓÒ × ×Ó Ö Ð × Ù Ò Sº Ð Ñ ØÓ Ó split(key, l, r) Ô ÖØ ÓÒ Ð ÓÒ ÙÒØÓ Ò Ó× ×Ù ÓÒ ÙÒØÓ× l =< k0, k1, . . . , ki > Ý r =< ki+1, ki+2, . . . , kn−1 > × ÙÒ Ð Ð Ú key Ø Ð ÕÙ l < Ý < rº × Ö¸ l ÓÒØ Ò Ð × Ð Ú × Ñ ÒÓÖ × ÕÙ key Ý r Ð × Ñ ÝÓÖ ×º ×ÔÙ × Ð ÓÔ Ö ÓÒ this Ú Ò Ú Óº Ð Ñ ØÓ Ó position(key) Ö ØÓÖÒ Ð ÔÓ× ÓÒ Ð Ð Ú ÒØÖÓ ÐÓ ÕÙ × Ö Ð × Ù Ò ÓÖ Ò º Ë key ÒÓ × Ò Ù ÒØÖ Ò Ð ÓÒ ÙÒØÓ¸ ÒØÓÒ × × Ö ØÓÖÒ ÙÒ Ú ÐÓÖ ÒÚ Ð Óº Ð Ñ ØÓ Ó select(pos) Ö ØÓÖÒ Ð Ð Ñ ÒØÓ × ØÙ Ó Ò Ð ÔÓ× ÓÒ pos × ÙÒ Ð ÓÖ Òº Ë pos × Ñ ÝÓÖ Ó Ù Ð Ð Ö Ò Ð ¸ ÒØÓÒ × × Ò Ö ÙÒ Ü Ô ÓÒº Ò ÐÑ ÒØ ¸ Ð Ñ ØÓ Ó split pos(pos, l, r) Ô ÖØ ÓÒ Ð ÓÒ ÙÒØÓ Ò l =< k0, k1, . . . , kpos−1 > Ý r =< kpos, . . . , kn−1 >º ÍÒ Ü Ô ÓÒ Ó ÙÖÖ Ö × pos ר Ù Ö Ð Ö Ò Óº 1.3.3 Circunstancias del problema fundamental Ù Ð ×ÕÙ Ö Ò × Ò Ð × × ØÙ ÓÒ × ÙØ Ð Þ ÓÒ¸ ÐÓ× Ð Ñ ÒØÓ× ÙÒ ÓÒ ÙÒØÓ Ø Ò Ò ÕÙ Ù Ö Ö× Ò Ð ÙÒ Ð × Ñ ÑÓÖ º Ä Ñ Ò Ö Ö ÔÖ × ÒØ Ö Ò Ñ ÑÓÖ Ø Ð ÓÒ ÙÒØÓ Ö ÕÙ Ö ÙÒ ×ØÖÙ ØÙÖ ØÓ× ÙÝ ÓÖÑ Ô Ò ×Ù× Ö ÙÒר Ò × Ù×Óº À Ý Ú Ö Ó× ØÓÖ × ÕÙ Ò Ò Ò Ð × ÒÓ Ó × Ó Ò Ð ×ØÖÙ ØÙÖ ØÓ׸ ÒØÖ ÐÓ× ÕÙ ×Ø Ö ÐÓ× ÓÒÓ Ñ ÒØÓ× ÕÙ × Ø Ò Ò ×Ó Ö Ð Ö Ò Ð ¸ Ð ×ØÖ Ù ÓÒ Ö ÖÒ ÐÓ× Ð Ñ ÒØÓ׸ Ð × ÓÔ Ö ÓÒ × ÕÙ × Ù× Ö Ò Ý Ð Ö Ù Ò ÓÒ ÕÙ ×Ø × × ÒÚÓ Ö Òº Ä Ö ÒÐ ÒØÖ Ð Ø ÔÓ Ñ ÑÓÖ º ÍÒ Ö Ò Ð ÑÙÝ Ö Ò Ö ÕÙ Ö Ö Ñ ÑÓÖ × ÙÒ Ö ´ × Óµ Ó Ø Ö Ö ´ÓØÖÓ× Ñ Ó× Ñ × Ð ÒØÓ×µ Ý ×Ø × ÓÒ Ø Ö ÐÑ ÒØ Ð Ø ÔÓ ×ØÖÙ ØÙÖ ØÓ׺ À Ý Ó × ÓÒ × Ò ÕÙ Ð ÙÒ × Ð Ú × ×ÓÒ Ñ × ÔÖÓÔ Ò× × ÖØ × ÓÔ Ö ÓÒ × ÕÙ ÓØÖ ×º ÈÓÖ ÑÔÐÓ¸ × Ð × Ð Ú × Ù × Ò Ô ÐÐ Ó׸ ÒØÓÒ × Ð × Ö ÕÙ Ð × Ð ØÖ × Ü Ó Ý ×ÓÒ ÔÓ Ó Ö Ù ÒØ ׸ Ý ÕÙ Ð × ÚÓ Ð × ×ÓÒ Ñ × Ö Ù ÒØ ׸ ÔÙ Ò Ö Ò ÙÒ ×ØÖÙ ØÙÖ ØÓ× ÕÙ Ø Ò Ö ÙÔ Ö Ö Ö Ô Ñ ÒØ Ð Ú × ÕÙ Ø Ò Ò¸ ÔÓÖ ÑÔÐÓ¸ ÓÑÓ × ÙÒ Ð ØÖ º Ë ÙÒ Ð ÔÖÓ Ð Ñ ¸ Ð ÙÒ × ÓÔ Ö ÓÒ × ×ÓÒ Ñ × ÔÖÓ Ð × ÕÙ ÓØÖ × Ò ÐÙ× Ú ¸ Ò ÑÙ Ó× ×Ó׸ ÒÓ × ÙØ Ð Þ Ò ØÓ × Ð × ÓÔ Ö ÓÒ × Ó Ð Ñ ÝÓÖ Ð × ØÚ × ×Ó Ö Ð ÓÒ ÙÒØÓ × ÓÒ ÒØÖ Ò Ò ÙÒ Ó ÔÓ × ÓÔ Ö ÓÒ ×º Ò ×ØÓ× ×Ó׸ Ð ×ØÖÙ ØÙÖ ØÓ× ÔÙ × Ò Ö× Ô Ö ÓÔØ Ñ Þ Ö Ð ÓÔ Ö ÓÒ Ñ × Ö Ù ÒØ º
  • 47.
    1.4. Dise˜ ode datos y abstracciones n 21 1.3.4 Presentaciones del problema fundamental Ò Ú Ð ÙÒ ÓÒ Ð Ü ×Ø Ò Ú Ö × ÒØ ÖÔÖ Ø ÓÒ × Ð Ø ÔÓ Ò Ö Ó ÓÒ ÙÒØÓ ÙÒ Ñ Ò¹ Ø Ð ½ º À ݸ Ò × Ò ¸ Ó× ÓÒ× Ö ÓÒ × Ò × Ö × ÐØ Ö× º Ä ÔÖ Ñ Ö ÓÒ× Ö ÓÒ ÓÒ ÖÒ Ð Ö Ô Ø Ò Ó ÒÓ ÐÓ× Ð Ñ ÒØÓ׺ Ù Ò Ó × Ô ÖÑ Ø Ö Ô Ø Ö ÐÓ× Ð Ñ ÒØÓ× ÙÒ ÓÒ ÙÒØÓ¸ ÒØÓÒ × ×Ø × Ð ÒÓÑ Ò ÑÙÐØ ¹ ÓÒ ÙÒØÓ º ÒÐ Ð ÓØ ר Ò Ö C++¸ Ò Ð ÒØ ÐÐ Ñ stdc++¸ Ð ÓÒ ÙÒØÓ × Ð ÓÒÓ ÓÑÓ set<T, compare> Ñ ÒØÖ × ÕÙ Ð ÑÙÐØ ÓÒ ÙÒØÓ ÓÑÓ multiset<T, compare>º Ä × ÙÒ ÓÒ× Ö ÓÒ × Ð ÐÑ Ò Ñ ÒØÓ Ô Ö × ÓÖ Ò Ó× Ø ÔÓ (à Ý, Ð Ñ)º Ä × ÙÒ Ø Ð ×Ó Ø Ú ÕÙ Ö ÙÔ Ö ÙÒ Òר Ò ÐÑ ∈ ÐÑ ÙÒ Ð Ú Ý ∈ à ݺ ר Ð × ÓÒ ÙÒØÓ × Ð ÓÒÓ ÓÑÓ Ñ Ô Ó ½¼ º ÙÒ ÓÐ× Ð Ú × ÔÙ Ò Ö Ô Ø Ö× ¸ ÒØÓÒ × Ð Ñ Ô Ó × Ð ÑÙÐØ Ñ Ô Ó º Ò Ð Ð ÓØ ר Ò Ö C++ Ð Ñ Ô Ó × Ð ÓÒÓ ÓÑÓ map<Key, Elem, compare> Ñ ÒØÖ × ÕÙ Ð ÑÙÐØ Ñ Ô Ó ÓÑÓ multimap<Key, Elem, Compare>º Ò ÐÓ× Ñ Ô Ó× ×Ù Ð ÑÔÐ ÒØ Ö× Ð ÓÔ Ö ÓÖ [] × ÙÒ Ð Ð Ú º 1.4 Dise˜o de datos y abstracciones n Ð × ÒÓ ×ØÖ ÓÒ × Ý ×Ù× ÓÒ× Ù ÒØ × Ì × ÙÒ ÖØ ÕÙ × ÔÖ Ò ÓÒ Ð ÜÔ ¹ Ö Ò º ÕÙ Ö ÖÐ ÒÓ Ø Ò ÓØÖ ÐØ ÖÒ Ø Ú ÕÙ Ò Ö ÒØ Ö× Ö ×ÔÓÒ× Ð Ñ ÒØ ÔÖÓ Ð Ñ × Ö Ð × ÔÖÓ Ö Ñ ÓÒº ÈÓÖ Ö ×ÔÓÒ× Ð × ÒØ Ò Ð Ø ØÙ ÓÒÓÖ Ð Ö ×ÔÓÒ Ö ÔÓÖ ÐÓ× ÕÙ ÚÓ Ó׸ ÐÓ Ù Ð ÒÓ ×ÓÐÓ ×Ø ÓÒ ÓÒ Ó Ð ÓÒ× Ò ÕÙ Ð ÔÖ Ø ÒØ ØÒ Ö ×Ù ÓÒÓ Ñ ÒØÓ¸ × ÒÓ ×Ù ÓÒ ×Ø Ý Ù ÖÞ Ö Ø Öº Ò ÐÓ ÕÙ × Ù ×Ø × ÓÒ¸ × ÔÐ ÒØ Ò Ð ÙÒ × Ö ­ Ü ÓÒ × ÕÙ ÓÒ× Ö Ö Ð ÔÖ Ò Þ Ô Ö Ò Ö ÒØ Ö Ñ ÓÖ Ð ÔÖ Ò Þ Ð × ÒÓ ØÓ× Ý ÔÖÓ Ö Ñ ÓÒº 1.4.1 Tipos de abstracci´n o Ë ÙÒ Ð ÒØ Ö × ÕÙ × Ø Ò Ð ÑÓÑ ÒØÓ × Ò Ö ÙÒ ×ØÖ ÓÒ Ó ×ØÖÙ ØÙÖ ØÓ׸ ר ÔÙ Ð × ¬ Ö× Ò ÓÖ ÒØ ÐÓ× ØÓ× ¸ ÓÖ ÒØ Ð ­Ù Ó Ù ÓÖ Ò¹ Ø Ð ÓÒ ÔØÓ Ó ×ØÖ ÓÒ º ÍÒ ×ØÖ ÓÒ ÓÖ ÒØ ÐÓ× ØÓ× × ÕÙ ÐÐ ÙÝÓ ¬Ò ר Ò ÙÞ Ó ÔÓÖ Ð ÓÖ Ò Þ ÓÒ ÐÓ× ØÓ× Ò Ð ÓÑÔÙØ ÓÖº Ð Ú Þ¸ Ø Ð ÓÖ Ò Þ ÓÒ Ó Ö¹ ÕÙ Ö Ñ ÒØÓ× × ÑÔ ÒÓ¸ ÓÖÖÓ ×Ô Ó Ó Ð ÙÒ ÓØÖÓ ÕÙ Ø Ò Ð ÓÑÔÙØ ÓÖ¸ × ×Ø Ñ ÓÔ Ö Ø ÚÓ Ù ÓØÖÓ× ÔÖÓ Ö Ñ × × ×Ø Ñ º ר × Ð ×Ó ÑÙ × Ð × ×ØÖÙ ¹ ØÙÖ × ØÓ× ÕÙ ×ØÙ Ö ÑÓ× Ò ×Ø Ø ÜØÓº ÑÔÐÓ× ×Ø × Ð × × ÓÖ ÒØ ÓÒ ÐÓ× ÓÒר ØÙÝ Ò ÐÓ× ÖÖ ÐÓ׸ Ð × Ð ×Ø × ÒÐ Þ × Ý Ð × Ú Ö× × ×ØÖÙ ØÙÖ × Ö ÓÐ ÕÙ × Ö Ò ×ØÙ × Ò ×Ø Ø ÜØÓº ÅÙ Ó× ÔÖÓ Ð Ñ × ÓÑÔÙØ ÓÒ Ð × Ü Ò ÙÒ Ô ØÖÓÒ ÔÖÓ × Ñ ÒØÓ ×Ø ÒØ ÚÓ Ý ÙÒ ÓÖÑ º Ò Ø Ð × × ØÙ ÓÒ ×¸ ÔÙ × Ö ÑÙÝ ÓÒÚ Ò ÒØ ×ÔÓÒ Ö ÙÒ ×ØÖÙ ¹ ØÙÖ ØÓ× ÕÙ Ö ÔÖ × ÒØ Ð ÓÖ Ò Ó ×ÕÙ Ñ ÔÖÓ × Ñ ÒØÓ ÐÓ× ØÓ׺ Ò ×Ø ×Ó ÑÓ× ÕÙ Ð ×ØÖÙ ØÙÖ ×Ø ÓÖ ÒØ Ð ­Ù Ó Ó Ð Ô ØÖÓÒº ÈÓÖ ÑÔÐÓ¸ × ÐÓ× ØÓ× Ò ÔÖÓ × Ö× × ÙÒ Ð ÓÖ Ò Ô Ö ÓÒ Ò Ð × ×Ø Ñ ¸ ÒØÓÒ × ÙÒ ×ÔÓ× ÓÒ ½¼ Ð Ò Ð × Ñ ÔÔ Ò ¸ ÙÝ ÓÒÒÓØ ÓÒ Ñ Ø Ñ Ø × Ò ¬ ÙÒ ÓÒ Ò Ð × ÒØ Ó Ð Ø ÓÖ ÓÒ ÙÒØÓ׺ ÈÓÖ ÓØÖ Ô ÖØ ¸ × ÑÔÓÖØ ÒØ ר Ö ÕÙ Ð Ø ÖÑ ÒÓ Ù Ö ÒØ Ñ ÒØ ÔØ Ó ÔÓÖ Ð Ê º
  • 48.
    22 Cap´ ıtulo 1. Abstracci´n de datos o ÐÓ× ØÓ× Ò ÙÒ × Ù Ò ÔÙ Ö ÔÖ × ÒØ Ö Ð ÓÖ Ò ÐÐ º Ì Ð ×ØÖÙ ØÙÖ × ¹ ÒÓÑ Ò ÓÐ Ý × Ö ×ØÙ Ò Ü ¾º ´Ô Ò ½¿½µº ÆÓØ ÑÓ× ÕÙ Ò ×Ø ×Ó ÒÓ × Ô Ò× Ò Ð ÓÖ Ò Þ ÓÒ ÕÙ ÐÓ× ØÓ× Ø Ò Ò Ò Ñ ÑÓÖ ¸ × ÒÓ Ò Ð ÓÖ Ò Ó Ô ØÖÓÒ Ò ÕÙ ×ØÓ× × ÔÖÓ × Òº Ò ÐÑ ÒØ ¸ Ð × ÒÓ ÙÒ ×ØÖÙ ØÙÖ ØÓ× ÔÙ Ð Ø Ö Ð Ö ÔÖ × ÒØ ÓÒ ÙÒ ÓÒ ÔØÓ Ó ×ØÖ ÓÒ ÓÒÓ ÓÒ Ñ Ö × ÓÑÔÖ Ò Ö Ð ÔÖÓ Ð Ñ Ý¸ ÓÒ× Ù ÒØ ¹ Ñ ÒØ ¸ × ÒÚÓÐÚ Ö× ÓÑÓ Ñ ÒØ Ò ×Ù ×ÓÐÙ ÓÒº Ò ×Ø ×Ó¸ ÑÓ× ÕÙ Ð ×ØÖÙ ¹ ØÙÖ ØÓ× ×Ø ÓÖ ÒØ Ð ÓÒ ÔØÓº Ä × × ÑÔÐ ¬ Ö Ð ÔÖÓ Ö Ñ ÓÖ Ó ÐÓ× Ù×Ù Ö Ó× Ð ÒØ Ò Ñ ÒØÓ Ð ÔÖÓ Ð Ñ Ý ×Ù ×ÓÐÙ ÓÒº À Ý ÑÙ Ó× Ñ ÒÓ× Ô Ö Ö ×ÓÐÚ Ö ÔÖÓ Ð Ñ ×º Ù ÒØ Ò ÕÙ Å Ð Ö Ý¸ ÔÖ ÙÖ×ÓÖ Ð Ø ÓÖ Ð ØÖÓÑ Ò Ø ¸ ÒÓ Ø Ò ×Ù¬ ÒØ ÓÖÑ ÓÒ Ñ Ø Ñ Ø Ô Ö ÜÔÐ Ö ÐÓ× ÒÓÑ ÒÓ× Ð ØÖÓÑ Ò Ø Ó× ×Ù× ÜÔ Ö Ñ ÒØÓ׺ Ä Ò Ð Ö Ý ÐÓ ÓÒ Ù Ó Ö Ö ×Ù× ÔÖÓÔ × ×ØÖ ÓÒ × Ö ¬ ׸ ÔÖÓÚ Ò ÒØ × ×Ù× Ó × ÖÚ ÓÒ × ÜÔ Ö Ñ ÒØ Р׸ Ô ÖØ Ö Ð × Ù Ð × ÙÒ Ó Ý ÜÔÐ Ó Ð Ð ØÖÓÑ Ò Ø ×ÑÓº Ð Ù Ð ÕÙ Ö Ý¸ ÑÙ × Ú × Ö ÑÓ× ×ØÖ ÓÒ × ÕÙ ÒÓ× Ô ÖÑ Ø Ò ÓÑÔÖ Ò Ö Ñ ÓÖ ÙÒ Ð ÓÖ ØÑÓº ר × ×ØÖ ÓÒ × ÓÒ ÓÖÑ Ò ×ØÖÙ ØÙÖ × ØÓ׺ ÍÒ ÑÔÐÓ ÑÙÝ ÒÓØ Ð × Ð ÓÒ ÔØÓ Ö Óº Ø ÑÓÐÓ Ñ ÒØ ¸ Ð Ø ÖÑ ÒÓ Ö Ó ÔÖÓÚ Ò Ö ¬ Ó ¸ ÔÙ × ÐÓ× Ö Ó× ×ÓÒ ÜÔÖ × Ó× Ò Ø ÖÑ ÒÓ× Ö ¬ Ó׺ Ë Ò Ñ Ö Ó¸ Ò Ö Ð ¸ ÙÒ Ö Ó ÑÓ Ð Þ Ð ÓÒ ÔØÓ Ö Ð ÓÒ ×Ó Ö Ð Ù Ð Ü ×Ø ØÓ Ó ÙÒ ÓÖÔÙ× Ñ Ø Ñ Ø Óº Ô × Ö Ð ÓÖÔÙ× Ý¸ ÕÙ Þ ÔÓÖÕÙ ×Ø × Ò ÓÑÔÐ ØÓ¸ ÐÓ× Ö Ó× Ó Ö Ò ÙÒ Ú × ÓÒ Ö ¬ Ð Ö Ð ÓÒ Ñ Ø Ñ Ø ÓÒ Ð ÕÙ × Ñ × ÓÑÓ ØÖ Öº ר × ÓØÖ Ö ÞÓÒ ÕÙ Ùר ¬ Ð × ÒÓ ÙÒ ×ØÖÙ ØÙÖ ØÓ ÙÒ Ñ Ò Ö Ö ÔÖ × ÒØ Ö Ð ÔÖÓ Ð Ñ Ò Ø ÖÑ ÒÓ× Ñ × × Ò ÐÐÓ׺ רÓ× ØÖ × Ø ÔÓ× ÓÖ ÒØ ÓÒ Ð ÙÒ ÓÖÑ Ò Ð × ¬ Ò Ð ¬Ò Ó Ð Ô Ö ÕÙ × × Ò Ó × × Ð ÓÒ ÙÒ ×ØÖÙ ØÙÖ ØÓ׺ Ä Ð × ¬ ÓÒ ÒÓ × Ü Ø Ò Ü ÐÙÝ ÒØ º ÍÒ ×ØÖÙ ØÙÖ ØÓ× ÔÙ Ò Ö Ð Ú Þ¸ Ó Ò Ö ÒØ × ÑÓÑ ÒØÓ׸ Ó ØÓ Ó× Ó Ù ÐÕÙ Ö ÐÓ× Ø ÔÓ× ÓÖ ÒØ ÓÒº È ÖÓ Ø ÖÑ Ò Ö Ò ÙÒ ÓÒ Ð × Ö ÙÒר Ò × Ù Ð × Ð ÓÖ ÒØ ÓÒ ÙÒ ×ØÖÙ ØÙÖ ØÓ׸ ÔÙ Ù Ö Ð ÔÖÓ Ö Ñ ÓÖ Ò ×Ù × ÒÓ Ó × Ð ÓÒº 1.4.2 El principio fin-a-fin ÓÒ× Ö ÑÓ× Ð Ì ÙÖ Ý Ö Ô Ø ÑÓ× Ð ÔÖ ÙÒØ ÙÒ Ñ ÒØ Ð Ô Ö ÕÙ × ÖÚ Ù Ð × ×Ù ¬Ò Ð Ò Ð × ÓÒ Ü ½º½º ´Ô Ò µ × ÔÖ Ø Ò Ó Ò Ö Ð Þ Ö ÓÔ Ö ¹ ÓÒ × Ò Ö ÒØ × Ð Ù Ó ÙÒ ¬ ÙÖ ×Ó Ö Ð ÙÒ ÓÒ Ó ÓÒØÖ ×Ø º ÓÒ ×Ø ¬Ò ¬Ò Ó¸ Ð × ÓÔ Ö ÓÒ × Ð Ì ÙÖ ¸ Ù Ö¸ ÑÓÚ Ö¸ Ø Ø Ö ¸ Ø Ò Ò × Ò¹ Ø Ó×ÒÒ × ÓÒÓ Ö Ù Ð × Ð ¬ ÙÖ Ò Ù ×Ø ÓÒº È Ò× ÑÓ׸ ÕÙ ×Ù Ö × ÒÓ ØÙÚ × ÑÓ× Ð ÖÓ Ô Ö ÕÙ × Ù× Ö Ð Ì ÙÖ Ä Ö ×ÔÙ ×Ø ¸ ÒÓ Ø Ò Ó Ú Ò ×ØÓ× Ø ÑÔÓ׸ × ÕÙ ÒÓ× × Ö ÑÙÝ Ð ÓÑÔÖ Ò ÖÐÓº Ë ÒÙ ×ØÖÓ ÒØ Ò Ñ ÒØÓ ÒÓ ×ØÙÚ × Ð ÖÓ¸ ÒØÓÒ ×¸ ÕÙ Þ ¸ ÓÑ Ø Ö ÑÓ× Ð ÖÖÓÖ ÒØ ÒØ Ö ÑÔÐ ÒØ Ö Ð Ì ÙÖ ¸ Р٠и ÓÑÓ Ý × Ñ Ò ÓÒÓ¸ × ×ØÖ ØÓº ÓÖ Ô Ò× ÑÓ× Ò Ù Ð × Ö Ð ÓÖÑ ÙÒ Ì Figure × ×Ø רÙÚ × ×Ø Ò Ó Ð ÙÐÓ× ÓÑ ØÖ Ó× Ò ÐÓ× Ù Ð ×¸ Ò ÐÙ Ö Ù Ö¸ × Ð ÙÐ × Ò Ö × ÒØ Ö× ÓÒ × ÒØÖ ¬ ÙÖ ×º È Ö ×Ø ¬Ò¸ Ð × ÓÔ Ö ÓÒ × Ð Ì ÙÖ ÒÓ Ø Ò Ö Ò ÑÙ Ó × ÒØ Óº ÍÒ ÔÖ Ò Ô Ó × ÒÓ × ×Ø Ñ × × ÓÒÓ ÓÑÓ Ð ÔÖ Ò Ô Ó ¬Ò¹ ¹¬Ò º ר ÓÒ× ×Ø Ò ÒÓ ×Ô ¬ Ö¸ Ñ ÒÓ× × Ò Ö¸ ÑÙ Ó Ñ ÒÓ× ÑÔÐ ÒØ Ö¸ Ñ × ÐÐ Ð ¬Ò ÕÙ × ÓÒÓÞ
  • 49.
    1.4. Dise˜ ode datos y abstracciones n 23 Ý × Ù Ö Ô Ö Ð ÔÖÓ Ö Ñ º Î ÓÐ Ö ×Ø ÔÖ Ò Ô Ó ÔÙ Óר Ö × Ù ÖÞÓ Ú ÒÓ¸ ÔÙ × ×ÓÐÓ × Ò ÐÓ× ÔÙÒØÓ× ¬Ò Ð × Ð ÔÖÓ Ö Ñ ¸ Ó Ò ×Ù× Ù×Ù Ö Ó× ¬Ò Р׸ Ò ÕÙ × Ø Ò ØÓ Ó Ð ÓÒÓ Ñ ÒØÓ Ò × Ö Ó Ô Ö × Ò Ö ÙÒ ÔÖÓ Ö Ñ ÓÒ × ÒØ Ó ½ º Ò Ð ÑÔÐÓ Ð Ì ÓÑÔÐ Ó ¸ Ø Ð ÓÑÓ ÐÓ ÑÓ× ØÖ Ø Ó¸ ÕÙ ÓÒÓ ÑÓ× Ö ×Ù ¬Ò ÄÓ× ÒÙÑ ÖÓ× ÓÑÔÐ Ó× Ø Ò Ò ÑÔÐ ÔÐ ÓÒ Ò Ò × Ý Ò Ò ¹ Ò Ö Ö ÞÓÒ ÔÓÖ Ð Ù Ð ÙÒ ÔÖÓ Ö Ñ ÓÖ ÔÙ Ö Ú Ö× Ø ÒØ Ó ÒÖ ÕÙ Ö Ð Ì ÓÒ Ñ ØÓ Ó× Ó Ð × × Ö Ú × ÕÙ Ð Ø Ò ×Ù ÙØÙÖ Ñ Ò ÔÙÐ ÓÒº Ë ÔÙ Ö ¸ ÔÓÖ ÑÔÐÓ¸ Ñ Ò Ö ÓÓÖ Ò × ÔÓÐ Ö ×º Ë Ò Ñ Ö Ó¸ ÑÔÐ Ö Ð Ì ÓÑÔÐ Ó ÒÓ Ø Ò × Ò¹ Ø Ó × ÒÓ × Ø Ò Ð ÖØ ØÙ ÕÙ Ð × ÓÓÖ Ò × ÔÓÐ Ö × × Ö Ò Ù× × ÔÓÖ ÐÓ× Ù×Ù Ö Ó× Ú ÒØÙ Ð × Ð Ì ÓÑÔÐ Ó º Ä Ó × ÖÚ ÓÒ ÒØ Ö ÓÖ ÒÓ × Ö Ð Þ Ô Ö ÓÒÓÑ Þ Ö ØÖ Ó ¹ÙÒ Ò Ò ÓÒ×ÙÒÓ ÓÒ Ð ÔÖ Ò Ô Ó ¬Ò¹ ¹¬Ò¹¸ × ÒÓ ÔÓÖÕÙ Ð ÒØ Ö × Ó Ò ÙÒ Ì ÓÑÔÐ Ó ÜØ Ò Ó ÓÒ ÓÓÖ Ò × ÔÓÐ Ö × ÔÙ Ö Ñ Ò Ö ÓØÖ ÒØ ÖÔÖ Ø ÓÒ¸ Ò ÙÝÓ ×Ó¸ Ð ÜØ Ò× ÓÒ ÔÙ Ö × Ö ÙÒ ×ØÓÖ Óº ÍÒ Ì × Ö Ñ Ò ÑÓ Ý ×Ù¬ ÒØ º ÈÓÖ Ñ Ò ÑÓ ÔÖ Ø Ò ÑÓ× Ò Ö ÕÙ ÒÓ Ø Ò Ñ × ÐÓ Ò × Ö Óº ÈÓÖ ×Ù¬ ÒØ ÕÙ Ö ÑÓ× Ö ÕÙ ÓÒØ Ò Ö ØÓ Ó ÐÓ Ò × Ö Ó Ô Ö ×Ø Ò ÖÐÓ Ð ¬Ò Ô Ö Ð Ù Ð Ù ¬Ò Óº ר Ð Ö ×Ø × ÖÖ Ö × × Ö Ð Ø ÚÓ¸ ÔÙ × ÔÒ Ð ¬Ò Ý ×Ù ÒØ ÖÔÖ Ø ÓÒº ÐÐ ¸ ÒØÓÒ ×¸ Ð Ö Ø Ö × Ò Ð ÕÙ Ø Ò ¸ Ô Ö Ð Ü ØÓ ÙÒ ÔÖÓÝ ØÓ¸ Ð ÕÙ Ð ¬Ò ר Ð Ö Ñ ÒØ ¬Ò Ó Ý ÕÙ ÐÓ× Ô ÖØ Ô ÒØ × ÒÓ ×ÓÐÓ ÐÓ Ø Ò Ò Ð ÖÓ¸ × ÒÓ ÕÙ ×Ø Ò ÓÑÔÖÓÑ Ø Ó× ÓÒ Ðº ÉÙ Þ ÙÒ ÓÖ ×ÑÓ Ë ÒØ¹ ÜÙÔ ÖÝ ÜÔÖ × Ñ ÓÖ Ð × ÒØ Ó Ñ Ò Ñ Ð Ý ×Ù¬¹ Ò Ð ÔÖ Ò Ô Ó ¬Ò¹ ¹¬Ò È Ö ÕÙ Ð Ô Ö ÓÒ × Ð ÒÞ ÒÓ Ù Ò Ó ÒÓ Ý Ñ × Ò ÕÙ Ò Ö¸ × ÒÓ Ù Ò Ó ÒÓ Ý Ñ × Ò ÕÙ ×ÙÔÖ Ñ Ö ½½º 1.4.3 Inducci´n y deducci´n o o ÁÒ Ù ÓÒ × Ò ¬ Ö × ÐÓ Ô ÖØ ÙÐ Ö ÐÓ Ò Ö Ð Ñ ÒØÖ × ÕÙ Ù ÓÒ × Ò Ð Ö × ÐÓ Ò Ö Ð ÐÓ Ô ÖØ ÙÐ Öº Ù Ò Ó × × Ò Ò ×ØÖ ÓÒ ×¸ ÔÓÖ ÓÒ ÓÑ ÒÞ Ö º × ÙÒ ÔÖ Ò Ô Ó ÓÒÓ Ó Ò Ù ÓÒ Ý × ÒÓ Ö × ÐÓ ÓÒ Ö ØÓ ÐÓ ×ØÖ ØÓº Ò ÓØÖ × Ô Ð Ö ×¸ ÓÖ Ö ×ØÖ ÓÒ × Ô ÖØ Ö Ð ÜÔ Ö Ò ÓÒ Ö Ø Ö Ðº Ò × × ÒØ Ó¸ Ù Ò Ó ÒÓ × Ø Ò ÓÒÓ Ñ ÒØÓ Ò Ð Ö ÙÒ ÔÖÓ Ð Ñ Ó¸ Ð ÔÖÓ ×Ó Ò ÓÒ ÓÑ ÒÞ Ö Ô ÖØ Ö ÒÓÑ ÒÓ× ÓÒ Ö ØÓ× Ð ÔÖÓ Ð Ñ Ý¸ ÐÙ Ó¸ Ô ÖØ Ö × × Ô ÖØ ÙÐ Ö ×¸ ÒØ ÒØ Ö ¬Ò Ö ×ØÖ ÓÒ ×º Ò Ð ÔÖÓ Ö Ñ ÓÒ Ó ØÓ׸ Ü ×Ø Ò Ó× Ñ Ò ×ÑÓ× Ò Ö Ð Þ ÓÒ Ð Ö Ò Ð × × Ý Ð × ÔÐ ÒØ ÐР׺ Ä Ö Ò ÓÒ ÖÒ ÐÓ× ØÓ׸ Ñ ÒØÖ × ÕÙ Ð × ÔÐ ÒØ ÐÐ × Ð Ó Óº Ä Ö Ò × ÔÐ Ô Ö Ð Ò Ö Ò Ö Ð × Ý ÓÑÔÓÖØ Ñ ÒØÓ× ÓÑÙÒ × ÙÒ ÖØ Ð × Ó ØÓº Ä × Ð × × Ö Ú × Ð × ¬ Ò Ý ÔÓÖØ Ò Ô ÖØ ÙÐ Ö × Óѹ ÔÓÖØ Ñ ÒØÓ Ò Ö Ð Ý Ò Ú Ð × ×ØÖ ÓÒº Ù Ò Ó × ÒØ ¬ÕÙ Ò Ð × × Ó Ì ¸ Ù×ÕÙ ÕÙ × ÐÓ ÓÑÙÒ Ý ×Ó ÐÐ Ú ÐÓ ÐÓ Ò Ö Ð ØÖ Ú × Ð × × × × Ó ×ØÖ Ø ×º À Ý Ó× ×Ô ØÓ× Ò Ö Ð Þ Ö Ñ ÒØ Ð Ö Ò Ð × ×º Ð ÔÖ Ñ ÖÓ ÐÓ ÓÑÔÓÒ Ò ÐÓ× ØÖ ÙØÓ× Ó × Ð × Ö Ø Ö ×Ø × ÙÒ Ó ØÓ Óº Ò Ð ×Ó Ð Ì ÙÖ ¸ ÙÒ ØÖ ÙØÓ Ò Ö Ð ÐÓ ÓÒ ÓÖÑ Ð ÔÙÒØÓ Ö Ö Ò ÓÑÙÒ ØÓ × Ð × ¬ ÙÖ × Ô ÖØ ¹ ½½ ÌÖ Ù ÓÒ Ð ÙØÓÖ ÁÐ × Ñ Ð ÕÙ Ð Ô Ö Ø ÓÒ ×Ó Ø ØØ ÒØ ÒÓÒ ÕÙ Ò Ð Ò³Ý ÔÐÙ× Ö Ò ÓÙØ Ö¸ Ñ × ÕÙ Ò Ð Ò³Ý ÔÐÙ× Ö Ò Ö ØÖ Ò Ö º Ë ÒØ¹ ÜÙÔ Öݺ Ì ÖÖ × ÓÑÑ × º
  • 50.
    24 Cap´ ıtulo 1. Abstracci´n de datos o ÙÐ Ö ×º Ð × ÙÒ Ó ×Ô ØÓ ÒÖÐ × ÙÒ ÓÒ Ð Ý Ø Ò Ð × ÓÔ Ö ÓÒ ×º Ò Ð ×Ó Ð Ì ÙÖ ¸ ÐÓ× Ñ ØÓ Ó× Ú ÖØÙ Ð × draw()¸ move()¸ Ø Ø Ö ¸ Ò Ö Ð Þ Ò ÓÔ Ö ÓÒ × ÓÑÙÒ × ØÓ × Ð × ¬ ÙÖ ×º ÓÑÓ Ý ÐÓ Ò ÑÓ׸ Ð ÙÒÓ× Ð ÓÖ ØÑÓ× ×ÓÒ ×Ù× ÔØ Ð × × Ö Ò Ö Ó× Ó Ð ÓÖÑ ÔÐ ÒØ ÐÐ º ÓÒ× Ö ÑÓ× Ð ÔÖÓ Ð Ñ ÓÖ Ò Ö ÙÒ × Ù Ò Ð Ñ ÒØÓ× ÕÙ × Ö ØÖ Ø Ó Ò Ð Ô ØÙÐÓ Ü ¿º ÆÓØ ÑÓ× ÕÙ Ð ÒÙÒ Ó ÒÓ Ñ Ò ÓÒ Ð Ø ÔÓ Ð Ñ ÒØÓ× ÓÖ Ò Ö ×ÓÐÓ ×Ô ¬ ÕÙ × ØÖ Ø ÙÒ × Ù Ò º ÈÓ ÑÓ× ÓÖ Ò Ö Ô ÐÐ Ó׸ ÒØ ÖÓ× Ó Ð Ñ ÒØÓ× Ù ÐÕÙ Ö ÓØÖÓ Ø ÔÓ Ó Ð Ñ ×ÑÓ ×ÕÙ Ñ º ÇÖ Ò Ö × Ò Ô Ò ÒØ Ð ØÓº Ò ×Ø Ð × ÔÖÓ Ð Ñ × × ÔÙ Ò × Ò Ö ÙÒ ÓÖ Ò Ñ ÒØÓ Ò Ö Ó ÙÝÓ Ô Ö Ñ ØÖÓ × Ö Ð Ø ÔÓ Ð Ñ ÒØÓ׺ × ÑÔÓÖØ ÒØ ר Ö ÕÙ ÙÒ ÓÑÔÓÖØ Ñ ÒØÓ Ò Ö Ó Ô Ö ×ÔÙ × ÓÒÓ Ö ÓÑÔÓÖØ Ñ ÒØÓ× ÓÒ Ö ØÓ× Ý ÒÓ Ð ÓÒØÖ Ö Óº Æ × ÕÙ Ö Ù Ò Ó × ÔÓ× ÙÒ ÑÔÐ ÜÔ Ö Ò ¸ ÒÓ × ÔÖÓ Ö Ñ Ö Ó Ó Ò Ö Ó × Ò ÒØ × ÖÐÓ Ú Ö ¬ Ó Ü Ùר ¹ Ú Ñ ÒØ ÓÒ Ð Ñ ÒÓ× ÙÒ Ø ÔÓ ØÓ ÓÒÓ Ó Ý ÓÒ Ö ØÓº È Ö Ð × Ó× Ø Ò × Ò Ö Ð Þ ÓÒ¸ Ö Ò Ý Ø ÔÓ× Ô Ö Ñ ØÖ Þ Ó׸ Ð Ñ ÒÓ ÓÑ ÒÞ Ò ÐÓ ÓÒ Ö ØÓ Ý × Ö ÐÓ ×ØÖ ØÓ¸ ÒÓ Ð Ö Ú ×º ÈÓ ÑÓ× Ö ÕÙ ×Ø × Ð ×Ø ÐÓ Ù Ò Ó × × Ò Ý ÔÖÓ Ö Ñ ÓÒ × ÒØ Óº ÓÒ ÓÖÑ × Ò ÜÔ Ö Ò ÓÒ Ö Ø ¸ ÙÒ × Ò ÓÖ ÔÙ ÓÒ× Ö Ö Ð ÙÒ × Ò¹ Ö Ð Þ ÓÒ × ÔÖ ÓÖ ´ÒÓ ØÓ ×µ × Ò ÙÒ Ú Ö Ð × Ô ÖØ ÙÐ Ö ×º ×ØÓ × Ù ÓÒ Ý × ÔÓ× Ð ×ÔÙ × ÔÖ Ò Ö Ó × Ò Ö Ô ÖØ × ÓÒ Ö Ø × Ð ×ÓÐÙ ÓÒº Ä Ò Ð ¸ Ù Ò Ó Ó ÙÖÖ ¸ × Ñ Ö Ö Ò ÐÓ ×ØÖ ØÓ ÐÓ ÕÙ ÔÙ Ú Ò Ö ÓÒ Ö ØÓº ÁÒ Ò Ó × Ò ¬ Ø Ò Ö Ò Ó × ÒØÖÓ ´ Òµº Ò Ó ÕÙ Ò Ö ×¸ Ù Ò ×¸ ÔÓÖ ×ÙÔÙ ×ØÓº × ×Ø Ô Ö×Ô Ø Ú ¸ Ò Ò Ö ×¸ ÒØÓÒ ×¸ Ð ÔÖ Ø Ð Ò¹ Ò Ó Ô ÖÓ¸ ÒÓ × ÔÓ Ö Ø Ò Ö Ò Ò Ó × × ÑÔÖ × Ü × Ô ÖÑ Ò Ö Ò ÐÓ ÓÒ Ö ØÓ Ý × ×ÙÔ Ø × Ø Ò × Ý Ñ ØÓ Ó× ¬ Ó׺ ר × Ð Ö ÞÓÒ ÔÓÖ Ð Ù Ð Ð ÒØÙ ÓÒ ÒÙÒ × Ö × ÖØ º 1.4.4 Ocultamiento de informaci´n o ÍÒ Ì ×ÓÐÓ ×Ô ¬ Ð ¬Ò ÙÒ ØÓ Ý ×Ù ÒØ Ö Þº Ù Ò Ó × Ù Ö ÙÒ × ÒÓ Ò ØÓÖÒÓ ÙÒ Ì ¸ × Ù Ö ÙÒ ×Ô ¬ ÓÒ Ó Ø Ú ÕÙ ÒÓ Ò Ö ×Ù ÑÔÐ ÒØ ÓÒº ×ØÓ × ÓÒÓ Ó ÓÑÓ Ð ÔÖ Ò Ô Ó Ó ÙÐØ Ñ ÒØÓ Ò ÓÖÑ ÓÒ¸ Ð Ù Ð ÓÒ× ×Ø Ò Ó ÙÐØ Ö Ð Ö Ñ ÒØ Ð ÑÔÐ ÒØ ÓÒ ÙÒ Ì ¸ Ô٠׸ ÓÑÓ Ý ÐÓ ÑÓ׸ ר ÓÒ ÓÖÑ ÐÓ ×Ù Ø ÚÓ¸ ÕÙ ¸ ÒÓ ×ÓÐÓ × ÑÙ Ó Ñ × ÓÑÔÐ Ó¸ × ÒÓ ÕÙ ¬ ÙÐØ Ð ÓÑÙÒ ÓÒº Ú × × Ù ÒÓ Ð Ö Ð ÑÔÐ ÒØ ÓÒ Ò Ú Ð ÒØ Ö Þº ÈÓÖ ÑÔÐÓ¸ Ö ÕÙ ÓÒ ÙÒØÓ ÙÒ Ñ ÒØ Ð ½ ר ÑÔÐ ÒØ Ó ÓÒ ÖÖ ÐÓ× ÓÖ Ò Ó× ÔÖÓÔÓÖ ÓÒ ÙÒ Ö Ð × ÑÔ ÒÓ × × Ö ¸ ÔÓÖ ÑÔÐÓ¸ ÕÙ Ð Ù×ÕÙ × Ö Ô ¸ Ô ÖÓ ÕÙ Ð Ò× Ö ÓÒ Ý ×ÙÔÖ × ÓÒ ×ÓÒ Ð ÒØ ׺ ÆÓØ ÑÓ× ÕÙ Ò ×Ø ×Ó ÒÓ × ¬Ò Ü Ø Ñ ÒØ ÓÑÓ × ÑÔÐ ÒØ Ð Ì ¸ × ÒÓ × Ò ¸ ÓÑÓ Ô ÖØ Ð ×Ô ¬ ÓÒ¸ ÙÒ ×Ô ØÓ Ò Ö Ð Ð ÑÔÐ ÒØ ÓÒº ÈÓÖ Ø ÒØÓ¸ Ð Ö ÓÑ Ò ÓÒ Ò Ö Ð × ÒÓ × ÕÙ × Ó ÙÐØ ÐÓ Ñ × ÕÙ × ÔÙ Ð ÑÔÐ ÒØ ÓÒº È ÖÓ¸ × ÔÓÖ Ö ÞÓÒ × × ÑÔ ÒÓ Ó Ö ÕÙ Ö Ñ ÒØÓ× Ö ×ÙÐØ ÓÒÚ Ò ÒØ ר Ð Ö ÙÒ Ø ÔÓ ÑÔÐ ÒØ ÓÒ¸ ÒØÓÒ × ØÖ Ø × ×Ø Ò ÐÓ× Ø ÖÑ ÒÓ× Ñ × Ò Ö Ó× ÔÓ× Ð ×º
  • 51.
    1.5. Notas yrecomendaciones bibliogr´ficas a 25 1.5 Notas y recomendaciones bibliogr´ficas a Ä ÔÖÓ Ö Ñ ÓÒ ÓÖ ÒØ Ó ØÓ× × Ö ÑÓÒØ ¬Ò Ð × Ð ½ ¼ Ò ÕÙ Ô Ö Ó Ð Ð Ò Ù Simula ¾ ¸ ÓÒ ÐÓ× ÓÒ ÔØÓ× Ð × ¸ Ö Ò Ý ÔÓÐ ÑÓÖ¬×ÑÓº À Ý Ó× Ó × ÖÚ ÓÒ × ×ØÓÖ × ÑÙÝ ÑÔÓÖØ ÒØ ׺ Ä ÔÖ Ñ Ö × ÕÙ Simula × Ö ÙÒ× Ö Ó Ò Ð ÓÑ Ò Ó Ð × ÑÙÐ ÓÒ Ý ÒÓ Ð ÔÖÓ Ö Ñ ÓÒ ØÖ ÓÒ Ðº Ä × ÙÒ × ÕÙ ØÓ Ó× ÐÓ× ÓÒ ÔØÓ× ÑÓ ÖÒÓ× Ð ÓÖ ÒØ ÓÒ Ó ØÓ× Ô Ö ÖÓÒ ÔÖ Ñ ÖÓ ÕÙ Ð ÒÓ ÓÒ ÑØÑØ Ø ÔÓ ØÓ ×ØÖ ØÓº Simula ÒÓ Ö× Ø Ò Ó ÑÙÝ Ò Ù ÒØ Ò ×Ù ÔÓ ÔÓÖÕÙ ØÖ Ò× ÙÖÖ ÖÓÒ Ð ÙÒ × × ÒØ × ÕÙ × Ð × ÑÔÓÐÚ × Ý ÓÒ× Ö × Ò Ð Ô Ö Ñ ØÙ Ð ÐÓ× Ó ØÓ׺ ÈÓÖ Ð ÓÒØÖ Ö Ó¸ ÐÓ× ÓÑÔÙØ ר ׸ ÕÙ × Ö Ò ÑÙÝ Ð Ø × Ó׸ ÓÒÓ Ò ÐÓ× Ø ÔÓ× ×ØÖ ØÓ× ØÓ× × ÐÓ× ØÖ Ó× Ä × ÓÚ Ý ÐÐ × ½¼ Ý Ð Ó ÙÐØ Ñ ÒØÓ Ò ÓÖÑ ÓÒ × ÐÓ× ØÖ Ó× È ÖÒ × ½¿ º Ð Ð Ò Ù C++¸ Ú ÙÐÓ Ò× Ò ÒÞ Ð ÔÖ × ÒØ Ø ÜØÓ¸ Ò×Ô Ö Ó Ò ÐÓ× Ð Ò Ù ¹ × C Ý Smalltalk ¸ ½¸ ½ ¸ Ù Ö Ó ÔÓÖ ÖÒ ËØÖÓÙרÖÙÔº Ä Ñ ÓÖ Ö Ö Ò Ô Ö ×Ù ÔÖ Ò Þ × ×Ù ÔÖÓÔ Ó Ø ÜØÓ Ì C++ ÈÖÓ Ö ÑÑ Ò Ä Ò Ù ½ ¸ Р٠и Ô ÖØ ÕÙ × ÔÓ× Ð Ñ ÒØ Ð Ñ ÓÖ Ô Ö ÓÑÔÖ Ò Ö Ð Ð Ò Ù ¸ × ÙÒ Ü Ð ÒØ ØÖ Ø Ó Ò Ò Ö ÔÖÓ Ö Ñ ÓÒ¸ ÕÙ ÒÓ Ø Ò Ò ÕÙ Ú Ö ÓÒ Ð Ö Ò ÔÖÓÝ ØÓ× ×Ó ØÛ Ö ¸ Ø Ú ÓÖ Ò Ùר Ý ÚÙÐ ÖÑ ÒØ ÓÒÓ Ó Ð ÖÓØÙÐÓ Ò Ò Ö Ð ×Ó ØÛ Ö º ר Ø ÜØÓ ÒÓ Ú Ö× ×Ó Ö Ð ÒØ Ö Þ Ð Ð ÓØ ר Ò Ö C++¸ × ÒÓ¸ Ñ × Ò¸ Ö ×Ù ÑÔÐ ÒØ ÓÒº × ÙØ и × Ò Ñ Ö Ó¸ ×ØÙ Ö Ð ÒØ Ö Þ ØÓ× ÒÓ Ö Ô Ø Ö ØÖ Ó Ý ÓÑÓ Ò Þ Ö Ö Ø Ö Ó׺ ÍÒ Ü Ð ÒØ Ö Ö Ò ×Ó Ö Ð Ð Ó¹ Ø ×Ø Ò Ö C++ Ð ÓÒר ØÙÝ Ð Ø ÜØÓ ÂÓ×ÙØØ × º ÍÒ Ö Ù ÒØÓ ×ØÓÖ Ó Ö Ð C++ Ý Ð ÔÖÓ Ö Ñ ÓÒ Ó ØÓ× ÔÙ Ò ÓÒØÖ Ö× Ò ½ º Ä Ð ØÙÖ × ÑÙÝ ÒØ Ö × ÒØ ÔÓÖÕÙ Ö Ú Ð ÕÙ Ð × ×ØÖ ÓÒ × Ý ÓÒ ÔØÓ× ×Ó × ÐÓ× Ó ØÓ× ×ÓÒ Ö ×ÙÐØ Ó Ð Ö ¬Ò Ñ ÒØÓ ØÖ Ú × ÖÖÓÖ × Ý Ö ×Ó׺ Ð ÔÖ Ò Ô Ó ¬Ò¹ ¹¬Ò × Ó Ó × ÖÚ Ó × ÔÓ × Ö ÑÓØ ׸ Ô ÖÓ Ù Ù ÐÐ ÖÑÓ Ç ¹ Ѹ Ù Ò Ó ÒÙÒ Ó ×Ù Ð Ö Ò Ú ¸ Ð Ù Ð Ö Þ ÒÓ ÑÙÐØ ÔÐ ÕÙ ÐÓ× ÒØ × × Ò Ò × ¸ ÕÙ Ò ÔÖ Ñ ÖÓ × ÓÒÓ ×Ù ÑÔÓÖØ Ò Ô ×Ø ÑÓÐÓ º Ò Ð ÔÖÓ Ö ¹ Ñ ÓÒ¸ Ð ÔÖ Ò Ô Ó × Ó Ó × ÖÚ Ó Ò Ö Ò × × ×Ø Ñ ×¸ × Ò Ó Ð Ö ×Ô ØÓ Ñ Ð Ñ Ø Ó Ð ÖØ ÙÐÓ Ë ÐØÞ Ö Ø Ð ½ º ËÓ Ö ×Ø ÖØ ÙÐÓ × Ñ Ò ×Ø Ö ÓÑ ÒØ Ö ÕÙ Ë ÐØÞ Ö Ø Ð ÓÖ ÒØ Ò ×Ù ÖØ ÙÐÓ × ×Ø Ñ × ×ØÖ Ù Ó× Ý ÒÓ Ö Ø Ñ ÒØ Ð × ÒÓ ØÓ׺ ÈÓÖ ÓØÖ Ô ÖØ ¸ Ð Ø ÖÑ ÒÓ ¬Ò Ñ ÒÙ Ó × ÒØ ÖÔÖ Ø ÓÑÓ ÜØÖ ÑÓ Ý ÒÓ ÓÑÓ ÙÒ ÔÖÓÔÓ× ØÓº ØÖ Ú × Ð ÜÔ Ö Ò × × Ù Ö Ò ØÓ× Ò Ö Ð × Ý Ò ÖÓ× Ó Óº ÙÒ Ø ÓÖ ÓÒ×ÓÐ Ð × Ó Ó Ó ×Ù Ð ÒÓÑ Ò Ö× Ð ÓÑÔÓÒ ÒØ Ó Ô ØÖÓÒ º ÍÒ Ö Ô ÖØÓÖ Ó ×Ø ÒØ Ö Ó Ô ØÖÓÒ × Ò Ö Ó× × Ó× ÔÙ Ò ÓÒØÖ Ö× Ò º Ë Ò Ô Ö ÓÑ Ò Ö Ð ÔÖÓ Ö Ñ ÓÒ × Ö ÕÙ Ö Ò Ð ÙÒÓ× ÒÓ× ÜÔ Ö Ò ÓÑÓ ÙØÓÖ ÔÖÓ Ö Ñ ×¸ ÐÓ× Ø ÜØÓ× Ë ÓØØ Å Ý Ö× ½½¸ ½¾ ÓÒר ØÙÝ Ò Ð Ñ ÓÖ Ö Ö Ò Ô Ö ÓÑÔÖ Ò Ö¸ ÓÑ Ò Ö Ý × Ö Ù× Ö ÑÙ × Ð × Ó× Ò Ö × × Ð C++º Ä ×ØÓÖ ÍÅÄ × Ö ÑÓÒØ ÇÅÌ ½ ¸ ÙÒ Ð Ò Ù Ö ¬ Ó¸ ÔÖ ÙÖ×ÓÖ Ð ØÙ Ð ÍÅĸ ÔÖÓÔÙ ×ØÓ ÔÓÖ Â Ñ × ÊÙÑ Ù ¸ ÙÒ ÒØ ¬ Ó Ð Ö Ð ÔÖÓ Ö Ñ ÓÒ Ó ØÓ׺ Ð ÓÒ×ÓÖ Ó ÇÅ ´Ç Ø Å Ò Ñ ÒØ ÖÓÙÔµ¸ Ò Ð Ñ ØÓ ÐÓ× × ×Ø Ñ × ×ØÖ Ù Ó× Ó ØÓ׸ ØÓÑÓ ÇÅÌ ÓÑÓ × Ô Ö × ÖÖÓÐÐ Ö Ð ØÙ Ð ÍÅĺ
  • 52.
    26 Cap´ ıtulo 1. Abstracci´n de datos o 1.6 Ejercicios ½º × Ò ÑÔÐ ÒØ ÙÒ Ì ÕÙ Ö ÔÖ × ÒØ ÒÙÑ ÖÓ× Ò ÔÙÒØÓ ­ÓØ ÒØ Ý Ò Ð Ù Ð × ×Ô ¬ÕÙ Ð ÔÖ × ÓÒ × Ö¸ Ð Ø Ñ ÒÓ Ð Ñ ÒØ × Ý Ð ÜÔÓÒ ÒØ º ¾º Ö Ø ÕÙ Ð Ì ÓÑÔÐ Ó º ÉÙ Ø Ò ÓÑÔÐ ØÓ × × ÓÖÖ Ø ×Ù ×Ô ¬ ÓÒ × Ñ ÒØ ÉÙ ÔÖÓ Ð Ñ × ÓÑ Ò Ó Ý Ö ×ÙÐØ Ó× ÔÙ Ò Ó ÙÖÖ Ö ¿º ÑÔÐ Ð Ì ÓÑÔÐ Ó Ô Ö Ñ Ò Ö ÓÓÖ Ò × ÔÓÐ Ö ×º × ÙØ ÓÒ ÓÐÓ Ö Ð ÑÔÐ ÓÒ ´ Ò ÒÙ ÚÓ× Ñ ØÓ Ó׸ Ò ÙÒ Ð × Ö Ú ¸ Ø Ø Ö µ º × Ò ÑÔÐ ÒØ ÙÒ Ì ÕÙ Ö ÔÖ × ÒØ ÒÙÑ ÖÓ× ÔÖ × ÓÒ Ö ØÖ Ö º º Ê Ú × Ù ÒØ × ÔÖÓ Ö Ñ × Ð Ö × Ô Ö Ù Ö ÓÑÓ Xfig Ý DIA Ò Ù Ð Ö¹ ÖÕÙ Ð × × ÓÒ ÕÙ ÐÐÓ× ÑÓ Ð Þ Ò Ð × ¬ ÙÖ ×º º Á ÒØ ¬ÕÙ ÐÓ× Ó ØÓ× ÙÒ Ñ ÒØ Ð × Ô Ö Ð ÓÒ Ù ÓÒ ÙÒ ÙØÓÑÓÚ Ð ÕÙ × Ò Ù ÒØÖ Ò Ò Ð Òº ÈÖ ÙÒÓ¸ ר Ð Þ ×Ù ¬Ò Ý Ð × ÓÔ Ö ÓÒ × ÙÒØÓ ÓÒ ×Ù× ×Ô ¬ ÓÒ × × ÒØ Ø Ý × Ñ ÒØ º º × Ò Ò Ù Ø Ú Ñ ÒØ ÙÒ Ö ÖÕÙ Ð × × ÕÙ Ö ÔÖ × ÒØ Ú ÙÐÓ× ÙØÓÑÓØÓÖ ×º Ù ÐÓ× Ö Ñ × ÍÅĺ º ×Ò Ù Ø Ú Ñ ÒØ ÙÒ Ö ÖÕÙ Ð × × ÕÙ Ö ÔÖ × ÒØ Ú Ú Ò × º Ù ÐÓ× Ö Ñ × ÍÅĺ º ÓÒ× Ö Ð × × Ù ÒØ × Ð × × Ó ØÓ ÙÝÓ× ÒÓÑ Ö × ×Ù Ö Ò ÐÓ ÕÙ Ö ÔÖ × ÒØ Ò Medio locomoción Medio aéreo Medio terrestre Medio marítimo Helicoptero Energía Avión Barco Globo Dirigible Monopatín Submarino Cohete Patineta Patines Carreta Bus Tren Moto Bicicleta Con Motor Sin Motor × Ò ÙÒ ×ÕÙ Ñ Ù Ø ÚÓ ÕÙ Ö Ð ÓÒ ×Ø × Ð × ×º ½¼º Å Ò ÓÒ ØÖ × Ó Ñ × ÔÐ ÓÒ × Ò ÓÒ Ô Ö Þ Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð Ð × ×ØÖÙ ØÙÖ × ØÓ׺ È Ö ÔÐ ÓÒ¸ ÜÔÐ ÕÙ Ð ÓÖÑ Ò ÕÙ Ô Ö Ý × ÖØ Ö Ú Ñ ÒØ Ö ÓÑÓ × ÑÔÐ ÒØ Ö º ½½º Å Ò ÓÒ ØÖ × Ó Ñ × ÔÐ ÓÒ × Ò ÓÒ ÒÓ Ô Ö Þ Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð Ð × ×ØÖÙ ØÙÖ × ØÓ׺ ½¾º Å Ò ÓÒ Ð ÙÒ × ×ØÖÙ ØÙÖ × ØÓ× ÓÒÓ × Ý × ÙØ ×Ù Ð × ¬ ÓÒ × ÙÒ ÐÓ× Ð Ò Ñ ÒØÓ× ÜÔÐ Ó× Ò Ð × ÓÒ Ü ½º º½ ´Ô Ò ¾½µº
  • 53.
    1.6. Bibliograf´ ıa 27 ½¿º Ó ÙÒ ÓÒ ÙÒØÓ S ¬Ò Ó ÔÓÖ Ð Ø ÔÓ Set<T, Compare>¸ ÜÔÐ ÕÙ ÓÑÓ ÓÒÓ Ö Ð Ð Ñ ÒØÓ ÓÖÖ ×ÔÓÒ ÒØ Ð Ñ Ò Ò Ð × ÒØ Ó ×Ø ר Óº ½º Ó ÙÒ ÓÒ ÙÒØÓ S ¬Ò Ó ÔÓÖ Ð Ø ÔÓ Set<T, Compare>¸ ÜÔÐ ÕÙ ÓÑÓ × ÔÖÓ¹ Ö Ñ Ö ¸ Ò ÙÒ ÓÒ Ð × ÔÖ Ñ Ø Ú × ÓÒ ÙÒØÓ ÙÒ Ñ ÒØ Ð ½ ¸ Ð ÖÙØ Ò template <class __Set> __Set extraer(__Set & set, int i, int j); Ð Ù Ð ÜØÖ S¸ Ý Ö ØÓÖÒ Ò ÙÒ ÒÙ ÚÓ ÓÒ ÙÒØÓ¸ ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ× ÕÙ ×Ø Ò ÒØÖ Ð × ÔÓ× ÓÒ × i Ý j¸ Ö ×Ô Ø Ú Ñ ÒØ º ×ÔÙ × Ð ÓÔ Ö ÓÒ¸ S ÓÒØ Ò ÐÓ× Ð Ñ ÒØÓ× ÒØÖ ÐÓ× Ö Ò Ó× [0..i − 1] Ý [j + 1..n − 1]¸ ÓÒ n = |S|º ½ º ×ÙÑ ÕÙ Ð ¬Ò ÙÒ × ×Ø Ñ × Ð Ñ Ò ×ØÖ ÓÒ Ð × ÓÐ Ö ÙÒ ÖÖ Ö ÙÒ Ú Ö× Ø Ö º Ó ×Ø ¬Ò¸ × × ×ÔÓÒ Ö ×× ØÓ× ×ØÙ ÒØ ׸ ÔÖÓ ×ÓÖ ×¸ ÖÖ Ö ×¸ ÙÖ×Ó׸ × ÓÒ ×¸ × ÐÓÒ ×¸ ÓÖ Ö Ó× Ý Ñ × ×Ô ØÓ× ÔÖÓÔ Ó× Ð Ñ Ò ×ØÖ ÓÒ × ÓÐ Ö ÙÒ ÍÒ Ú Ö× º ÈÐ ÒØ Ì Ò Ö Ð ×¸ Ô ÖØ ÙÐ Ö ×¸ Ô Ö Ñ ØÖ Þ Ó׸ ÕÙ ÑÓ Ð Ò Ð × Ú Ö× × ×ØÖ ÓÒ × ÕÙ Ñ Ò Ö Ð × ×Ø Ñ º Ù ÐÓ× Ö Ñ × ÍÅÄ Ô Ö ØÓ × Ð × Ð × × × Ò ×º ½ º Ê ÓÒ× Ö Ð Ö Ó ÒØ Ö ÓÖ Ô Ö ÐÓ× × ÓÐ Ö × × ÙÒ Ö Ý ÔÖ Ñ Ö º Bibliograf´ ıa ½ ÝØ ¸ ØÓÖº ËÔ Ð ××Ù ÓÒ ËÑ ÐÐØ Ð ¸ ÚÓÐÙÑ ¸ Ù Ùר ½ ½º ¾ Ǻ º Ð Ò Ãº ÆÝ Ö º ËÁÅÍÄ ß Ò Ä ÇĹ × × ÑÙÐ Ø ÓÒ Ð Ò Ù º Óѹ ÑÙÒ Ø ÓÒ× Ó Ø Å¸ ´ µ ½ß ¾¸ Ë ÔØ Ñ Ö ½ º ¿ Ê Ñ× × Ù ÒÑ ÝÓÖº ÁÒØ ÖÔÖ Ø Ò Ó ÇÖ Ò Þ ÓÒ ×ººº ÍÒ Ì ÓÖ Ë ×Ø Ñ Ó¹ ÁÒØ ÖÔ ÖØ Ø Ú ÇÖ Ò Þ ÓÒ ×º ÍÒ Ú Ö× ÄÓ× Ò × ¹ ÓÒ× Ó ÔÙ ¹ Ð ÓÒ × ¹ ÓÒ× Ó ×ØÙ Ó× ÈÓר Ö Ó¸ ¾¼¼½º º ÑÑ ¸ ʺ À ÐѸ ʺ ÂÓ Ò×ÓÒ¸ Ò Âº ÎÐ ×× ×º × Ò È ØØ ÖÒ׺ ×ÓÒ¹Ï ×Рݸ ½ º Ç Ø Å Ò Ñ ÒØ ÖÓÙÔº ÇÅ ÍÒ ¬ ÅÓ Ð Ò Ä Ò Ù ¾º¼ ÈÖÓÔÓ× Ð¸ Ê ¹ Ú × ×Ù Ñ ×× ÓÒ ØÓ ÇÅ Ê È× »¼¼¹¼ ¹¼½ Ò »¼¼¹¼ ¹¼¾¸ Î Ö× ÓÒ ¼º ½º ÇÅ ¸ ØØÔ »»ÛÛÛºÓÑ º ÓÑ»ÙÑл¸ ¾¼¼¾º º Àº Àº ÁÒ ÐÐ׺ × Ò ÔÖ Ò ÔÐ × Ò ×Ñ ÐÐØ Ð º Ì ¸ ´ µ ¾ ß¾ ¸ Ù Ùר ½ ½º Æ ÓРź ÂÓ×ÙØØ ×º Ì ·· ËØ Ò Ö Ä Ö ÖÝ ØÙØÓÖ Ð Ò Ö Ö Ò º ÔÙ ¹ ϸ ÔÙ ¹ Ï Ö¸ ½ º Ö Ò Ïº à ÖÒ Ò Ò ÒÒ × Ê Ø º Ì ÈÖÓ Ö ÑÑ Ò Ä Ò Ù ¸ Ë ÓÒ Ø ÓÒº ÈÖ ÒØ ¹À Ðи ½ º
  • 54.
    28 Cap´ ıtulo 1. Abstracci´n de datos o ÓÒ Ð º ÃÒÙØ º ÙÒ Ñ ÒØ Ð Ð ÓÖ Ø Ñ׸ ÚÓÐÙÑ ½ Ó Ì ÖØ Ó ÓÑÔÙØ Ö ÈÖÓ Ö ÑÑ Ò º ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ÍË ¸ Ø Ö Ø ÓÒ¸ ½ º ½¼ Ä × ÓÚ Ò ÐР׺ ÈÖÓ Ö ÑÑ Ò Û Ø ×ØÖ Ø Ø ØÝÔ ×º Ë ÔÐ Ò ÆÓØ ×¸ ¸ ½ º ½½ Ë ÓØØ Å Ý Ö׺ « Ø Ú ··º ×ÓÒ Ï ×Рݸ ½ ¾º ½¾ Ë ÓØØ Å Ý Ö׺ ÅÓÖ « Ø Ú ··º ×ÓÒ Ï ×Рݸ ½ º ½¿ º ĺ È ÖÒ ×º Ø Ò ÕÙ ÓÖ ×Ó ØÛ Ö ÑÓ ÙÐ ×Ô ¬ Ø ÓÒ Û Ø Ü ÑÔР׺ ÓÑÑÙ¹ Ò Ø ÓÒ× Ó Ø ××Ó Ø ÓÒ Ó ÓÑÔÙØ Ò Å Ò Öݸ ½ ´ µ ¿¿¼ß¿¿ ¸ Å Ý ½ ¾º ½ Â Ñ × º ÊÙÑ Ù º ÇÅÌ Ì Ó Ø ÑÓ Ðº ÂÇÇȸ ´ µ ¾½ß¾ ¸ ½ º ½ º Ë ÐØÞ Ö¸ º Ê ¸ Ò º Ð Ö º Ò ¹ØÓ¹ Ò Ö ÙÑ ÒØ× Ò ×Ýר Ñ × Òº Å ÌÖ Ò× Ø ÓÒ× ÓÒ ÓÑÔÙØ Ö ËÝר Ñ׸ ¾´ µ¸ ½ º ½ ÖÒ ËØÖÓÙרÖÙÔº Ì × Ò Ò ÚÓÐÙØ ÓÒ Ó ··º ×ÓÒ Ï ×Рݸ Ê Ò Å ×׺¸ ½ º ½ ÖÒ ËØÖÓÙרÖÙÔº Ì ·· ÈÖÓ Ö ÑÑ Ò Ä Ò Ù º ×ÓÒ¹Ï ×Рݸ ¿Ö Ø ÓÒ¸ ¾¼¼¼º ½ Ä ÖÖÝ Ì ×Ð Öº Ì ËÑ ÐÐØ Ð ÒÚ ÖÓÒÑ ÒØº ÝØ ¸ ´ µ ¼ß½ ¸ Ù Ùר ½ ½º
  • 55.
    Cap´ ıtulo 2 Secuencias ר Ô ØÙÐÓ Ú Ö× ×Ó Ö × Ù Ò ×º Ò ÔÖÓ Ö Ñ ÓÒ¸ × ÓÑÓ Ò ÓØÖÓ× Ñ ØÓ× ÒÙ ×ØÖ ÙÐØÙÖ ¸ ÙÒ × Ù Ò × ¬Ò ÓÑÓ ÙÒ ×Ù × ÓÒ Ð Ñ ÒØÓ× Ð ÙÒ Ø ÔÓº ÈÓÖ ×Ù × ÓÒ ÒØ Ò ÑÓ× ÕÙ ÐÓ× Ð Ñ ÒØÓ× Ð × Ù Ò ÔÙ Ò Ñ Ö Ö× × ÙÒ ÖØÓ ÓÖ Ò Ô Ö ÓÒ Ó ÔÖÓ × Ñ ÒØÓ ÙÒÓ ØÖ × ÓØÖÓ¸ ÞÕÙ Ö Ö ¸ ÖÖ Ó Ý ÓØÖ × ÓÑ Ò ÓÒ × ÕÙ Ñ ÒØ Ò Ò Ð Ö Ø Ö ×Ù × ÚÓ ×Ù Ý ÒØ Ð × ÙÒ º ÒÐ Ú ÓØ Ò Ð ÑÓ× ÓÒ × Ù Ò × × Ò ÕÙ × ÒÙÒ ÒÓ× Ñ Ö Ú ÐÐ ÑÓ× ×Ù× ÓÒ× Ù Ò ×¸ Ð × Ù Ð × × ÒÓ× × Ô Ö Ò Ò Ð ÙÒ Ð Ú º Ò ×Ø й Ð ÒÓ¸ Ý Ò ÓØÖ × Ð Ò Ù ×¸ Ð ÑÓ× Ý × Ö ÑÓ× ÞÕÙ Ö Ö Ý × ÖÖ Ó Ó × ¸ × Ù Ò ÐÑ ÒØ º Ä Ñ ÝÓÖ Ð × Ú × Ð Ð ØÙÖ Ó ÙÖÖ × Ò ÕÙ ÒÙ ×ØÖÓ Ô Ò× Ñ ÒØÓ ÒØ ÖÚ Ò Ý Ö Ñ ÒØ Ð × ÒØ Ó ÐÓ ÕÙ Ð ÑÓ׺ ÑÓ× ÒØÓÒ × ÕÙ Ð ÑÓ× ­Ù Ñ ÒØ º Ë Ù Ò Ð × ØÙ ÓÒ Ú × ×Ù Ò Ñ Ø Ñ Ø ¸ ÓÑ Ò Ó ÓÒ ×ÓÐ ÑÓ× ÓÔ Ö Ö Ð Ñ ÒÓ× ×Ó Ø Ú Ñ ÒØ ¸ ÞÕÙ Ö Ö Ý Ð ÙÒÓ× ÓØÖÓ× ÑÓ Ó× Ñ × Ö × ÖÚ Ó× Ô Ö ÐÓ× Ñ Ø Ñ Ø Ó× Ü Ð×Ó׺ ÆÓ ×ÓÐÓ Ð × × Ù Ò × ÒÓ× ×ÓÒ Ù Ù ×¸ × ÒÓ ÕÙ ÑÙ × Ú × ×Ø × Ø Ò Ò Ö Ò¹ Ø × Ô Ö×Ô Ø Ú × Ñ Ö Ó ×Ø ÒØÓ× ÑÓ Ó× Ý Ø ÑÔÓ× Ô Ö ÔÖ × ÒØ Ö× ÒØ ÖÔÖ Ø Ö× º ÓÒ× Ö ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ Ð ×Ó ÙÒ Ô Ð ÙÐ Ú ×Ø ÓÑÓ ÙÒ × Ù Ò × ¹ Ò × ÐÚ Ò × ÙÒ Ð × ÒØ Ó ÕÙ Ð Ö ØÓÖ ÒÓ× ÔÖ Ø Ò ØÖ Ò×Ñ Ø Ö Ð ×ØÓÖ º È Ö ÔÖÓÜ Ñ ÖÒÓ× ÐÓ ÕÙ ÓÑÓ Ô Ð ÙÐ × ÕÙ Ö ÔÖ × ÒØ Ö¸ ÑÓ× Ñ Ö Ö Ð Ô Ð ÙÐ × Ù Ò¹ ÐÑ ÒØ º ÍÒ ÓÖØ Ò Ð × Ù Ò ¸ Ó ÙÒ Ô ÖÑÙØ ÓÒ ÒØÖ ×Ù× × Ò × ÔÙ ÚÓÐÚ Ö Ð Ô Ð ÙÐ Ò ÒØ Ð Ð Ó¸ ÕÙ Þ Ò Ð Ñ ÓÖ ÐÓ× ×Ó× ¸ Ó Ö Ö ÙÒ ÒØ ÖÔÖ Ø ÓÒ ×¹ Ø ÒØ º ÈÓÖ ×ÙÔÙ ×ØÓ¸ ÐÓ ÒØ Ö ÓÖ ÒÓ ÒÓ× ÑÔ ¸ Ò Ö ØÖÓ×Ô Ø Ú ¸ ÐÙ Ó Ö ÔÖ × Ò Ó ÒØ Ö Ñ ÒØ Ð Ô Ð ÙÐ ¸ Ñ Ö Ö Ð ÙÒ × ×Ù× Ô ÖØ × Ô Ö Ñ ÓÖ Ö ÒÙ ×ØÖ ÓÑÔÖ Ò× ÓÒº Î ×ØÓ ÓØÖÓ ÑÓ Ó¸ ÙÒ Ô Ð ÙÐ ÓÒ× ×Ø Ò ÙÒ × Ù Ò ÓØÓ Ö × ÙÝ ×Ù × ÓÒ Ö ÓÒרÖÙÝ Ð × × Ò × ÓÒ ÑÔÖ × ÓÒ Ö Ð º Ð ÓÑÔÙØ ÓÖ ÒÓ × Ô Ð Ù Ù Ð × × Ù Ò ×º ÆÓ ÑÙÝ ÓØÖÓÖ ¸ Ù Ð × ¬¹ Ó Ñ ÕÙ Ò × Ù Ò Ð ¸ ÔÙ × × Ö Ñ Ø Ð Ö Ý ÙØ Ö ÔÖÓ Ö Ñ ×¸ ÐÓ× Ù Ð × ÒÓ ×ÓÒ Ñ × ÕÙ × Ù Ò × ÒרÖÙ ÓÒ × × Ö Ø × Ò ÙÒ Ñ ÑÓÖ º À ÕÙ ¸ Ô٠׸ ÙÒ Ò Ó × Ö Ó ÕÙ Ù ÐÕÙ Ö ×ØÖ ÓÒ × Ù Ò × ÑÔÐ Ñ ÒØ Ù× Ò Ð ÓÑÔÙØ ÓÒº Ò ×Ø Ô ØÙÐÓ ×ØÙ Ö ÑÓ× Ð × × Ù ÒØ × ×ØÖÙ ØÙÖ × ØÓ× Ö Ø Ö Þ × ÓÑÓ × ÙÒ × ¯ ÖÖ ÐÓ׺ ¯ Ä ×Ø × ÒÐ Þ ×º ¾
  • 56.
    30 Cap´ ıtulo 2. Secuencias È Ð ×º ¯ ¯ ÓР׺ Ù ÐÕÙ Ö ×Ø × ×ØÖÙ ØÙÖ × × Ù Ù ÔÓÖ ØÓ × Ð × Ò × ÓÑÔÙØ ÓÒ Ð × Ý × ÑÙÝ ÔÖÓ Ð ÕÙ × Ò Ô ÖØ Ð Ñ ÒÓ Ö Ø Ó Ù ÓÒº ÈÓÖ ×Ø Ö ÞÓÒ¸ × × Ð ÓÒÓ Ö Ð × ÑÔÐ ÒØ ÓÒ × Ñ × ¬ ÒØ × ÔÓ× Ð ×º ÄÓ× ÖÖ ÐÓ× Ý Ð ×Ø × ÒÐ Þ × ÓÒ ÓÖÑ Ò ×ØÖ ÓÒ × ØÓ׸ Ñ ÒØÖ × ÕÙ Ð × Ô Ð × Ý ÓÐ × ×ÓÒ ×ØÖ ÓÒ × ­Ù Óº ÍÒ × Ù Ò Ð Ñ ÒØÓ× Ð Ñ ×ÑÓ Ø ÔÓ ÓÒ ÓÖÑ ÙÒ ÓÒ ÙÒØÓ ÐÓ ÕÙ ×Ù Ö ÒØÖ ÕÙ ÙÒ × Ù Ò ¸ Ú ×Ø ÓÑÓ ×ØÖ ÓÒ ØÓ¸ ÔÙ ÑÔÐ ÒØ Ö Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð ×ØÖÙ ØÙÖ ØÓ× ×ØÙ Ó Ò Ð Ô ØÙÐÓ ½º ר × Ö Ð Ò × × ÕÙ Ð ÑÔ ÖØ Ö ÑÓ× ÐÓ× ÖÖ ÐÓ× Ý Ð × Ð ×Ø × ÒÐ Þ ×º ÇØÖ × × ØÙ ÓÒ × ÓÑÔÙØ ÓÒ Ð × Ö ÕÙ Ö Ò ÙÒ Ô ØÖÓÒ ÔÖÓ × Ñ ÒØÓ Ô ÖØ ÙÐ Öº ר × Ð × ÒØ Ó Ð × Ô Ð × Ý Ð × ÓР׸ ÙÝÓ× ÒÓÑ Ö × Ò ÖØ ÓÖÑ ×ØÖ Ò Ð ÓÖ Ò ÔÖÓ × Ñ ÒØÓº 2.1 Arreglos ÍÒ ÖÖ ÐÓ Ñ Ò× ÓÒ Ñ × ÙÒ × Ù Ò n ≤ Ñ Ð Ñ ÒØÓ× Ð Ñ ×ÑÓ Ø ÔÓ Ò Ð Ù Ð Ð ×Ó Ð Ñ ÒØÓ × Ö ØÓ Ý ÓÒ×ÙÑ ÙÒ Ø ÑÔÓ ÓÒר ÒØ Ò Ô Ò ÒØ ×Ù ÔÓ× ÓÒ ÒØÖÓ Ð × Ù Ò º ÈÓÖ ÐÓ Ò Ö Ð¸ ÐÓ× Ð Ñ ÒØÓ× ÙÒ ÖÖ ÐÓ × ÓÖ Ò Þ Ò ÓÖÑ Ö Ø Ñ ÒØ ÓÒØ Ù Ò Ð Ñ ÑÓÖ Ð ÓÑÔÙØ ÓÖ¸ ÐÓ ÕÙ ÔÖÓÔÓÖ ÓÒ Ó× ÓÒ × ÕÙ Ò Ð ÖÖ ÐÓ ÑÙÝ ÒØ Ö × ÒØ Ô Ö Ð ÔÖÓ Ö Ñ ÓÒ × ×Ø Ñ × ½º Ë ÔÙ Ö Ö Ø Ñ ÒØ Ù ÐÕÙ Ö Ð Ñ ÒØÓ × ÙÒ ×Ù ÔÓ× ÓÒ ÒØÖÓ Ð × Ù Ò º ÈÓÖ ÐÓ Ò Ö Ð¸ ×ØÓ × ÑÔÐ ÒØ Ò Ú Ð ÓÑÔ Ð ÓÒ Ý × ×Ô ¬ ÒÚ Ð Ð Ð Ò Ù ÔÖÓ Ö Ñ ÓÒ Ñ ÒØ Ð ÓÔ Ö ÓÖ []º ÈÓÖ ÑÔÐÓ¸ Ð ÜÔÖ × ÓÒ Ò C++ a[15] = 9¸ × Ò Ð ÒØ ÖÓ 9 Ð ÑÓ × ÜØÓ Ð Ñ ÒØÓ Ð ÖÖ ÐÓº ¾º Ð Ó×ØÓ Ò ×Ô Ó × Ñ Ò ÑÓ × × ÑÔÖ ¸ Ð ÒØ Ð Ñ ÒØÓ׺ Æ Ò ÙÒ ×ØÖÙ ØÙÖ ØÓ Ó Ö Ñ ÓÖ Ö Ò Ñ ÒØÓ Ò Ð ×Ó ÔÓÖ ÔÓ× ÓÒº Ð Ó ÕÙ ÐÓ× Ð Ñ ÒØÓ× ×Ø Ò ÓÒØ ÙÓ× ÚÓÖ ÜØÖ ÓÖ Ò Ö Ñ ÒØ Ð × ÔÐ ÓÒ × ÕÙ Ü Ò ÐÓ Ð Ö Ö Ò ¸ ÔÙ × × ÑÙÝ ÔÖÓ Ð ÕÙ ÐÓ× Ð Ñ ÒØÓ× Ö ÒÓ× Ò ×Ô Ó Ý Ø ÑÔÓ × Ò Ù ÒØÖ Ò Ò Ð ½º Ä Ñ ÝÓÖ ÐÓ× Ð Ò Ù × ÔÖÓ Ö Ñ ÓÒ ÑÓ ÖÒÓ× Ó Ö Ò ×ÓÔÓÖØ Ô Ö Ð Ñ Ò Ó ÖÖ ÐÓ׺ ÓÒ× Ö ÑÓ× ÙÒ ÖÖ ÐÓ A[11] Ð Ñ ÒØÓ× Ø ÔÓ T ÙÝÓ Ø Ñ ÒÓ Ò ÝØ × × sizeof(T) Ý ÕÙ × Ô ØÓÖ Þ Ð × Ù ÒØ ÑÓ Ó 0 1 2 3 4 5 6 7 8 9 10 Base T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 Ð ÓÑÔ Ð ÓÖ ×Ó Ð ÖÖ ÐÓ Ð Ö ÓÒ Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ ÐÐ Ñ × Ð ÖÖ ÐÓ ¸ ÙÝÓ Ú ÐÓÖ × Ø ÖÑ Ò × ÙÒ Ð ÐÙ Ö ÓÒ Ó ÙÖÖ Ð Ð Ö ÓÒ Ó Òר Ò ÓÒ Ý Ð ½ Ò ×Ø ÓÒØ ÜØÓ ÙÒ × ÙÒ ×ØÖÙ ØÙÖ ×Ô Ð ØÓ¸ ×ÓÔÓÖØ ÔÓÖ Ð Ö Û Ö ¸ Р٠и × × Ù× ÓÖÖ Ø Ñ ÒØ ¸ Ð Ö ÓÒ× Ö Ð Ñ ÒØ Ð Ú ÐÓ ×Ó Ð Ñ ÑÓÖ º
  • 57.
    2.1. Arreglos 31 ÑÓ Ó Ð Ö ÓÒº Ù Ò Ó Ð ÓÑÔ Ð ÓÖ Ò Ù ÒØÖ ÙÒ ×Ó Ð i¹ × Ñ ÔÓ× ÓÒ¸ ר Ò Ö Ð × Ù ÒØ Ð ÙÐÓ ×Ó Ð Ñ ÑÓÖ Ö ÓÒ Ð Ð Ñ ÒØÓ = base + i × sizeof(T) ´¾º½µ Ä ÓÔ Ö ÓÒ ×ÙÑ ÕÙ Ð ÔÖ Ñ Ö Ò Ð ÖÖ ÐÓ × ÖÓ¸ ÕÙ × Ð ×Ó Ò ÐÓ× Ð Ò Ù × C Ý C++º Ë Ð Ð Ò Ù Ô ÖÑ Ø ÕÙ ÐÓ× Ò × ÓÑ Ò Ò Ò Ú ÐÓÖ × Ö ØÖ Ö Ó׸ ÒØÓÒ × Ð ÓÑÔ Ð ÓÖ Ò Ö Ö ÙÒ ÓÔ Ö ÓÒ ÓÒ Ð ÒØ × ÔÓ Ö Ö Ð Þ Ö Ð Ð ÙÐÓ ÒØ Ö ÓÖ¸ ÐÓ ÕÙ ÙÒ ÔÓ Ó Ñ × Ð ÒØÓ Ð ×Óº Ò Ò Ö Ð¸ ÐÓ× ÓÑÔ Ð ÓÖ × ÒÓ ØÙ Ò Ú Ö ¬ ÓÒ Ö Ò Óº × Ö¸ ÒÓ × × ÙÖ Ò ÕÙ Ð Ò Ö Ö Ò Ð ÖÖ ÐÓ ×Ø ÒØÖÓ ÐÓ× Ö Ò Ó× ÓÖÖ ØÓ׺ Ä Ö ÞÓÒ × ÕÙ ×Ø Ú Ö ¬ ÓÒ Ð Ò ÙÒ Ó×ØÓ ÓÒר ÒØ ×Ó ÕÙ ÔÙ × Ö ÑÔÓÖØ ÒØ º ÓÒ× Ù ÒØ Ñ ÒØ ¸ ÙÒ ×Ó Ù Ö Ö Ò Ó × ÙÒ Ö Ú ÖÖÓÖ ÔÖÓ Ö Ñ ÓÒ ÙÝÓ× × ÒØÓÑ × ÔÙ Ò Ô × Ö × Ô Ö Ó× ÙÖ ÒØ Ð ÙÒ Ø ÑÔÓº ר Ø ÔÓ ÖÖÓÖ × ÑÙÝ Ð Ø Ø Ö Ö ÞÓÒ ÔÓÖ Ð Ù Ð × Ù Ò ÙØ Ð Þ Ö × ÖØÓ× Ú Ö ¬ ÓÒ Ö Ò Ó× ¾ ÒØ × Ö Ö Ò Ö ÙÒ ÖÖ ÐÓº 2.1.1 Operaciones b´sicas con Arreglos a À Ý Ú Ö Ó× ×Ô ØÓ× ÓÒ× Ö Ö Ð ÓÖ ÓÔ Ö Ö ×Ó Ö ÖÖ ÐÓ× ¯ Ë ÐÓ× Ð Ñ ÒØÓ× ×Ø Ò Ó ÒÓ ÓÖ Ò Ó׺ ¯ Ë × ÓÒÓ Ð ÓÖ Ò Ò× Ö ÓÒ»×ÙÔÖ × ÓÒ ÐÓ× Ð Ñ ÒØÓ׺ ¯ Ë × ÓÒÓ ÓÒ ÒØ Ð ÓÒ Ð ÒÙÑ ÖÓ Ð Ñ ÒØÓ׺ ¯ ÉÙ Ø Ò Ø Ö Ø Ú × × Ö Ò Ð × ÓÔ Ö ÓÒ × ÍÒ ÐØ ÒØ Ö Ø Ú × Ò ¬ ÕÙ Ð × Ò× Ö ÓÒ ×¸ Ù×ÕÙ × Ý Ð Ñ Ò ÓÒ × ÔÙ Ò ×Ù Ö Ö Ù ÒØ Ñ ÒØ Ý ÓÒ Ð Ñ ×Ñ ÔÖÓ Ð º ¯ Ð Ø Ñ ÒÓ Ý Ô ØÖÓÒ ×Ó ÐÓ× Ð Ñ ÒØÓ× ÕÙ Ð Ö Ð ÖÖ ÐÓº Å ÒØÖ × Ñ × Ö Ò × Ð Ð Ñ ÒØÓ¸ Ñ ÒÓ× Ò ¬ Ó× × Ó Ø Ò Ö Ò ÔÓÖ Ð º 2.1.1.1 Aritm´tica de punteros e ÍÒ Ð × Ö Ò × Ú ÖØÙ × Ð Ð Ò Ù C¸ ØÖ × Ò Ð C++¸ × ÐÓ ÕÙ × ÓÒÓ ÓÑÓ Ö ØÑ Ø ÔÙÒØ ÖÓ× º Ì Ð ÓÒ ÔØÓ ÓÒ× ×Ø Ò Ò ÓÖÔÓÖ Ö Ð Ð Ò Ù ÓÔ Ö ÓÒ × ×Ó Ö ÔÙÒØ ÖÓ× ÙÝÓ× Ö ×ÙÐØ Ó× ÓÒ× Ö Ò Ð Ø ÔÓ ØÓ Ð Ù Ð × ÔÙÒØ º È Ö Ð Ö ¬ Ö ×Ø ÓÒ ÔØÓ¸ × ÖÖÓÐÐ ÑÓ× ÙÒ ÑÔÐÓº Ä ÒרÖÙ ÓÒ T * arreglo ptr = new T[n Ð Ö ÙÒ ÔÙÒØ ÖÓ ÙÒ Ð Ñ ÑÓÖ Ø ÔÓ Ò Ö Ó Tº Ð Ú Þ¸ × Ô ÖØ Ñ ÑÓÖ Ô Ö Ð Ö Ö n Ð × ÓÒ¹ Ø Ù × Ø ÔÓ T Ó × ¸ ÙÒ ÖÖ ÐÓ Ñ Ò× ÓÒ nº ÆÓÖÑ ÐÑ ÒØ ¸ × arreglo ptr × Ð × ÙÒ ÖÖ ÐÓ¸ ÒØÓÒ ×¸ Ô Ö Ö Ð i¹ × ÑÓ Ð Ñ ÒØÓ Ø Ò Ö ÑÓ× ÕÙ ØÙ Ö ÙÒ Ð ÙÐÓ × Ñ Ð Ö ´¾º½µº ÓÖ Ò¸ Ð Ð ÙÐÓ Ñ¹ ÔÐ Ó Ò ´¾º½µ ÐÓ Ò Ö ÙØÓÑ Ø Ñ ÒØ Ð ÓÑÔ Ð ÓÖ Ù Ò Ó¸ ÔÓÖ ÑÔÐÓ¸ × Ö ¹ ÑÓ× *(arreglo ptr + i) = 5;º Ð ÓÔ Ö Ò Ó ÞÕÙ Ö Ó Ð × Ò ÓÒ × ÒØ ÖÔÖ Ø ¾ Ð ºÊº º º ÜÔÖ × Ô Ö × ÖØÓ ¬ÖÑ ÓÒ Ð ÖØ Þ Ð Ó º ÙÒ × ÖØÓ × Ð ÓÒÓ Ñ × ÓÑÓ ÔÖ ÓÒ ÓÒ Ó ÒÚ Ö ÒØ º Ò ×Ø Ø ÜØÓ × ÙØ Ð Þ Ò ÒÚÓ ÓÒ × Ð ÔÖ Ñ Ø Ú I(predicado) Ð Ð ÓØ nana ½ º
  • 58.
    32 Cap´ ıtulo 2. Secuencias ÓÑÓ Ð ÓÒØ Ò Ó Ð Ö ÓÒ Ñ ÑÓÖ arreglo ptr Ñ × i ÒØ ÖÓ׺ Ð ÓÑÔ Ð ÓÖ × ÕÙ × ØÖ Ø Ð Ø ÔÓ int Ý ÒÓ ÓØÖÓ ÔÓÖÕÙ Ð ÔÙÒØ ÖÓ Ù ÐÖ Ó ÓÑÓ ÙÒ ÔÙÒØ ÖÓ ÒØ ÖÓº ÓÒ ×Ø ÓÒÓ Ñ ÒØÓ¸ Ð ÓÑÔ Ð ÓÖ ÑÔÐ Ø Ý ØÖ Ò×Ô Ö Ò¹ Ø Ñ ÒØ Ò ÓÖÔÓÖ Ð Ø Ñ ÒÓ ÙÒ ÒØ ÖÓ ´sizeof(int)µ Ò Ð Ð ÙÐÓ Ð ×Óº Ä ÜÔÖ × ÓÒ *(arreglo ptr + i) × Ü Ø Ñ ÒØ ÕÙ Ú Ð ÒØ arreglo ptr[i]¸ Ð Ù Ð × ØÖ Ù Ð i¹ × ÑÓ ÒØ ÖÓ Ð × ÙÒ ÙÝ Ö ÓÒ × × arreglo ptrº ÉÙ Þ ÙÒ ÔÖÓ Ð Ñ ×Ø Ò ÓÕÙ × ÕÙ × Ñ × Ð ×Ø Ò Ù Ö Ð ×Ó ÙÒ ÖÖ ÐÓ ÜÔÐ Ø Ñ ÒØ Ð Ö Ó ÙÒ ×Ó Ñ ÒØ ÙÒ ÔÙÒØ ÖÓº ÈÓÖ ×Ø Ö ÞÓÒ¸ × ÓÒÚ Ò ÒØ ÕÙ Ð ÒÓÑ Ö Ð ÔÙÒØ ÖÓ Ö ­ ×Ù ÓÒ ÓÒº Ò Ð ×Ó ÑÔÐÓ¸ Ð ×Ù¬ Ó ptr¿ ÒÓØ ÕÙ × ØÖ Ø ÙÒ ÔÙÒØ ÓÖº 2.1.1.2 B´ squeda por clave u Ë ÐÓ× Ð Ñ ÒØÓ× ×Ø Ò ÓÖ Ò Ó׸ ÒØÓÒ × ÔÓ ÑÓ× Ù× Ö ÙÒ ÙÐÓ×Ó Ð ÓÖ ØÑÓ¸ ÐÐ Ñ Ó Ù×ÕÙ Ò Ö ¸ ÙÝ ×Ô ¬ ÓÒ Ò Ö × ÓÑÓ × Ù ¿¾ Ù×ÕÙ Ò Ö ¿¾ ≡ template <typename T, class Compare> int binary_search(T a[], const T & x, int l, int r) { int m; // ´ndice del medio ı while (l <= r) // mientras los ındices no se crucen ´ { m = (l + r)/2; if (Compare() (x, a[m])) // ¿es x < a[m]? r = m - 1; else if (Compare() (a[m]), x) // ¿es x > a[m]? l = m + 1; else return m; // ==> a[m] == x ==> encontrado! } return m; } ¬Ò × binary search¸ Ù× Ò ÙÒ × ¿¿¸ ¿ ¸ Ò ¼º binary search<T, Compare>() Ù× ÙÒ Ó ÙÖÖ Ò Ð Ð Ñ ÒØÓ x¸ Ø ÔÓ Ò Ö Ó Ì¸ ÒØÖÓ Ð Ö Ò Ó ÓÑÔÖ Ò Ó ÒØÖ l Ý r Ð ÖÖ ÐÓ ÓÖ Ò Ó aº Ð ÔÖ Ò Ô Ó Ð Ù×ÕÙ Ò Ö × Ú Ö Ð ÖÖ ÐÓ Ò Ó× Ô ÖØ × Ù Ð × Ø Ñ ÒÓ m = (l + r)/2 ݸ Ò ×Ó ÕÙ a[m] ÒÓ ÓÒØ Ò x¸ Ù× Ö Ò Ð ÙÒ Ð× Ñ Ø × × ÙÒ Ð ÓÖ Ò x Ö ×Ô ØÓ a[m]º ÆÓØ × ÕÙ binary search<T, Compare>() Ö ØÓÖÒ ÙÒ ÔÓ× ÓÒ Ú Ð ÙÒ × x ÒÓ × Ò Ù ÒØÖ Ò Ð ÖÖ ÐÓº ×ØÓ Ö ÕÙ Ö ÕÙ Ð Ð ÒØ ¸ ÐÙ Ó Ð Ù×ÕÙ ¸ ÓÑÔ Ö ÒÙ ÚÓ x ÓÒ Ð Ú ÐÓÖ Ö ØÓÖÒÓ Ô Ö Ú Ö ¬ Ö × x Ù ÐÐ Ó Ó ÒÓº ÙÒÕÙ ×ØÓ ÓÒÐÐ Ú ÙÒ Ð ÖÓ Óר ¸ Ô ÖÑ Ø ÓÒÓ Ö Ð ÔÓ× ÓÒ Ò ÓÒ × Ò× ÖØ Ö x Ò Ð ÖÖ ÐÓ Ñ Ò Ö ÕÙ ×Ø × ÓÖ Ò Óº ÓÑÓ ×ØÙ Ö ÑÓ× Ò Ð ×Ù ¹× ÓÒ Ü ¿º½º ¸ Ð Ö Ò Ñ ÒØÓ ×Ø Ð ÓÖ ØÑÓ × ÔÖÓ¹ ÔÓÖ ÓÒ Ð Ð nº Ë Ò ×Ø Óר × Ñ ÝÓÖ ÕÙ Ð ÓÒר ÒØ Ð ×Ó ÔÓÖ ÔÓ× ÓÒ¸ Ò Ð ÔÖ Ø × ×Ø ÒØ Ù ÒÓº ¿ ÖÚ ÓÒ Ò Ò Ð × ÔÓ ÒØ Ö º
  • 59.
    2.1. Arreglos 33 Ë ÐÓ× Ð Ñ ÒØÓ× ÒÓ ×Ø Ò ÓÖ Ò Ó׸ ÒØÓÒ × ÔÙ ØÙ Ö× ¸ Óר Ð ¹ × ÑÔ ÒÓ¸ Ð Ù×ÕÙ × Ù Ò Ð × Ö Ø Ò Ü ½º¾º¿º¿ Ó Ð ÒÓÑ Ö ÙÒ ÓÒ sequential search<T, Compare>()º Ë Ò Ð Ø Ö ÓÒ Ö ÕÙ Ö ÔÓÖ ×Ø Ð × Ù×ÕÙ ÔÙ Ö ÕÙ Ö Ö Ò×Ô ÓÒ Ö ØÓ × Ð × Ð × Ð ÖÖ ÐÓ¸ × ÔØ Ð ÓÑÓ ×ÓÐÙ ÓÒ Ô Ö × Ð × Ñ Ò ×º 2.1.1.3 Inserci´n por clave o Ë Ð ÖÖ ÐÓ × Ñ ÒØ Ò ×ÓÖ Ò Ó¸ ÒØÓÒ × Ð Ò× Ö ÓÒ × Ö Ô × Ñ Ñ ÒØ Ò ÙÖ Ð ¬Ò Ð Ð × Ù Ò º ÐÓ ÓÒØÖ Ö Ó¸ Ð Ò× Ö ÓÒ Ú Ò Ñ × ÓרÓ× ¸ ÔÙ × × Ö ÕÙ Ö Ù× Ö Ò Ð ÖÖ ÐÓ Ð ÔÓ× ÓÒ Ò× Ö ÓÒ¸ ÐÙ Ó ×ÔÐ Þ Ö ÐÓ× Ð Ñ Ò¹ ØÓ× Ð × Ù Ò Ò ÙÒ ÔÓ× ÓÒ Ð Ö Ý¸ ¬Ò ÐÑ ÒØ ¸ ÓÔ Ö Ð Ð Ñ ÒØÓº Ì Ð Ð ÓÖ ØÑÓ × ÒÓÑ Ò Ò× Ö ÓÒ ÔÓÖ Ô ÖØÙÖ Ö Ý × ÒרÖÙÑ ÒØ ÓÑÓ × Ù ¿¿ ÁÒ× Ö ÓÒ ÔÓÖ Ö ¿¿ ≡ template <typename T, class Compare> void insert_by_gap(T a[], const T & x, int & n) { int pos_gap = binary_search<T, Compare>(T, x, 0, n - 1); for (int i = n; i > pos_gap; --i) a[i] = a[i - 1]; a[pos_gap] = x; ++n; } Í× × binary search ¿¾º ר Ð ÓÖ ØÑÓ × Ô ØÓÖ Þ Ð × Ù ÒØ ÑÓ Ó ººº ÓÖ Ò ººº ººº ÓÖ Ò ººº pos gap --i n Ä ÖÙØ Ò ×ÙÑ ÕÙ × Ð ÒØ n Ð Ñ ÒØÓ× ÕÙ Ø Ò Ð × Ù Ò Ý ÕÙ ×Ø Ú ÐÓÖ ÒÓ Ù Ð Ó Ü Ð Ñ Ò× ÓÒ Ð ÖÖ ÐÓº insert by gap<T, Compare>() ØÓÑ Ð Ø ÑÔÓ Ù×ÕÙ ¸ ÕÙ × Ö Ô × ÑÓ¸ Ñ × Ð Ø ÑÔÓ ÖÖÐ Ö ÕÙ Ö ÕÙ Ö Ð Ø Ö ÓÒ Ý Ð ÓÔ º 2.1.1.4 Eliminaci´n por clave o ÓÒ ÖÖ ÐÓ׸ Ð Ð Ñ Ò ÓÒ ÔÖ Ñ ÖÓ Ö ÕÙ Ö ÓÒÓ Ö Ð ÔÓ× ÓÒ ÒØÖÓ Ð ÖÖ ÐÓ Ð Ð Ñ ÒØÓ Ð Ñ Ò Öº ×ØÓ ÔÙ Ö Ð Þ Ö× Ñ ÒØ Ð ÖÙØ Ò × sequential search<T, Compare>() Ó binary search<T, Compare>()¸ × ÙÒ ÕÙ Ð ÖÖ ÐÓ ×Ø Ó ÒÓ ÓÖ Ò Óº Ò Ñ × × ØÙ ÓÒ ×¸ Ð Ð Ñ ÒØÓ Ð Ñ Ò Ó ÙÒ Ù Ó Ó Ö ÕÙ Ø Ô Ö× º
  • 60.
    34 Cap´ ıtulo 2. Secuencias Ë Ð ÖÖ ÐÓ ×Ø ×ÓÖ Ò Ó¸ ÒØÓÒ × Ð Ð Ñ Ò ÓÒ ÔÙ ÐÐ Ú Ö× Ó ÓÑÓ × Ù ¿ Ð Ñ Ò ÓÒ Ò ÖÖ ÐÓ ×ÓÖ Ò Ó ¿ ≡ template <typename T, class Equal> void remove_in_unsorted_array(T a[], const T & x, int & n) { int pos_gap = sequential_search<T, Equal>(T, x, 0, n - 1); if (a[pos_gap] != x) // excepci´n: x no se encuentra en a[] o a[pos_gap] = a[n - 1]; --n; } Í× × sequential search ½ º remove in unsorted array<T, Equal>() Ø Ô Ð Ö ÓÒ Ð ÙÐØ ÑÓ Ð Ñ ÒØÓ Ð × ÙÒ º Ë Ð ÖÖ ÐÓ ×Ø ÓÖ Ò Ó¸ ÒØÓÒ × × Ö ÕÙ Ö Ø Ô Ö Ð Ö Ñ ÒØ ×ÔÐ Þ ¹ Ñ ÒØÓ Ð ÞÕÙ Ö ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ× ÕÙ ×Ø Ò Ð Ö Ð Ö Ð × Ù ÒØ ÓÖÑ ¿ ÐÑÒ ÓÒ Ò ÖÖ ÐÓ ÓÖ Ò Ó ¿ ≡ template <typename T, class Equal> void remove_in_sorted_array(T a[], const T & x, int & n) { int pos_gap = binary_search<T, Equal>(T, x, 0, n - 1); if (a[pos_gap] != x) // excepci´n: x no se encuentra en a[] ; o for (int i = pos_gap; i < n; ++i) a[i] = a[i + 1]; --n; } Í× × binary search ¿¾º Ä Ø Ò Ò Ù ×Ø ÓÒ × Ô ØÓÖ Þ Ð × Ù ÒØ ÓÖÑ ººº ÓÖ Ò ººº ººº ÓÖ Ò ººº pos gap ++i n 2.1.2 Manejo de memoria para arreglos Ë ÙÒ Ð ×ÕÙ Ñ Ò ÕÙ × Ô ÖØ Ð Ñ ÑÓÖ Ô Ö ÙÒ ÖÖ ÐÓ¸ ר × Ð × ¬ Ò ×Ø Ø Ó Ý Ò Ñ Óº
  • 61.
    2.1. Arreglos 35 2.1.2.1 Arreglos en memoria est´tica a ר Ø ÔÓ ÖÖ ÐÓ × Ð Ö ÐÓ Ð Ó ×Ø Ø Ñ ÒØ ÒØÖÓ ÙÒ ÙÒ ÓÒ º ר ÖÖ ÐÓ Ü ÕÙ × ÓÒÓÞ Ð Ñ Ò× ÓÒ Ò Ø ÑÔÓ ÓÑÔ Ð ÓÒº Ð ÖÖ ÐÓ Ó ÙÔ ØÓ Ó ×Ù ×Ô Ó ÙÖ ÒØ ØÓ Ð Ú Ð ÔÖÓ Ö Ñ Ý ×Ù Ñ Ò× ÓÒ ÒÓ ÔÙ Ñ Ö× º Ò Ò Ö Ð¸ ר Ø ÔÓ ÖÖ ÐÓ Ù× Ö× Ô Ö Ù Ö Ö ÓÒר ÒØ × ÕÙ × Ö Ò ÙØ ¹ Ð Þ × ÐÓ Ð Ö Ó ØÓ ´Ó Ð Ñ ÝÓÖ Ô ÖØ µ Ð Ú Ð ÔÖÓ Ö Ñ º Ì Ñ Ò ÔÙ ÙØ Ð Þ Ö× ÓÑÓ ÔÓ× ØÓ Ú ÐÓÖ × Ø Ö Ø ÚÓ× ÔÓÖ ÑÔÐÓ¸ ÙÒ ÔÐ ÓÒ ÒÙÑ Ö ÕÙ × ÑÔÖ Ö Ð ÓÔ Ö ÓÒ × ÓÒ Ñ ØÖ × Ñ Ò× ÓÒ ¬ Ý ÙÝÓ Ú ÐÓÖ × Ñ Ò Ò ÙÒ ÓÒ Ð ÒØÖ Ð ÔÖÓ Ð Ñ º 2.1.2.2 Arreglos en pila ר Ø ÔÓ ÖÖ ÐÓ × Ð ÕÙ × Ð Ö ÒØÖÓ ÙÒ ÙÒ ÓÒ º Ð ×Ô Ó Ñ ÑÓÖ × Ô ÖØ Ó Ð Ô Ð Ù ÓÒ Ð ÔÖÓ Ö Ñ º ÈÙ ×ØÓ ÕÙ Ð Ô Ð Ù ÓÒ × Ú Ø Ð Ô Ö Ð ÔÖÓ Ö Ñ ¸ × Ø Ò Ö Ù Ó ÓÒ ÙÒ × ÓÖ Ô Ð Ù× Ó ÔÓÖ ÙÒ Ü × Ú ÐÓÒ ØÙ Ð ÖÖ ÐÓº ×ØÓ ÔÙ × Ö Ö Ø Ó Ò ÔÖÓ Ö Ñ × ÓÒ ÙÖÖ ÒØ × ÑÙÐØ ¹Ø Ö Ó Ò Ñ ÒØ × ÕÙ ×ÓÔÓÖØ Ò ÓÖÖÙØ Ò ×º Ä Ú ÒØ ר Ø ÔÓ ÖÖ ÐÓ × Ó Ð º ÈÖ Ñ ÖÓ Ð ÓÑÔ Ð ÓÖ ÒÓ Ö ÕÙ Ö ÓÒÓ Ö ×Ù Ñ Ò× ÓÒ Ô Ö Ò Ö Ö Ù ÐÕÙ Ö Ó Ó Ö × ÖÚ ÓÒ Ñ ÑÓÖ Ó Ö Ö Ò Ð ÖÖ ÐÓº Ò ÓÒ× Ù Ò ¸ × ÔÓ× Ð ×Ô Ö Ö ×Ø Ð Ù ÓÒ Ð Ð Ö ÓÒ Ô Ö ÓÒÓ Ö ×Ù Ñ Ò× ÓÒº Ä × Ù ÒØ × ÓÒ Ó Ó × Ø Ð Ò ÓÑÔ Ð ÓÖ × GNU void foo(size_t n) { int array[n]; ... } Ä × ÙÒ Ú ÒØ × ÕÙ Ð ×Ô Ó Ó ÙÔ Ó ÔÓÖ Ð ÖÖ ÐÓ × Ô ÖØ ÙØÓÑ Ø Ñ ÒØ Ò Ð ÑÓÑ ÒØÓ Ù ÓÒ Ð Ð Ö ÓÒ Ý × Ð Ö Ð × Ð Ð Ñ ØÓ Ð Ð Ö ÓÒº Ò Ð ÑÔÐÓ ÒØ Ö ÓÖ¸ Ð ÖÖ ÐÓ × Ð Ö Ð × Ð Ð ÙÒ ÓÒ foo()º Ù× Ð Ö × Ó × ÓÖ Ô Ð ¸ Ð Ù×Ó ×Ø Ø ÔÓ ÖÖ ÐÓ Ö ×ØÖ Ò Ö× Ñ Ò× ÓÒ × Ô ÕÙ Ò ×º ÔÖ ×Ø Ö× Ø Ò ÓÒ ×Ñ Ö Ð Ò Ú Ð Ð × ÐÐ Ñ × Ð × ÙÒ ÓÒ ×¸ Ô٠׸ Ñ ÕÙ × Ò Ò Ð × ÐÐ Ñ ×¸ × ÓÒ×ÙÑ Ñ × Ô Ð º ÆÓ Ù× ÖÖ ÐÓ× Ò Ô Ð ÒØÖÓ ÙÒ ÓÒ × Ö ÙÖ× Ú × Ó ÒØÖÓ ÙÒ ÓÒ × ÕÙ × Ö Ò ÐÐ Ñ × Ö ÙÖ× Ú Ñ ÒØ º 2.1.2.3 Arreglos en memoria din´mica a ÍÒ ÖÖ ÐÓ Ò Ñ ÑÓÖ Ò Ñ × ÕÙ Ð Ô ÖØ Ó ØÖ Ú × Ð Ñ Ò ÓÖ Ñ ÑÓÖ º Ò C++¸ ÔÓÖ ÑÔÐÓ¸ Ð × Ù ÒØ ÒרÖÙ ÓÒ Ö × ÖÚ ÙÒ ÖÖ ÐÓ 1000 ÒØ ÖÓ× int * array = new int [1000]; Ð Ø Ñ ÒÓ Ð ÖÖ ÐÓ ×ÓÐÓ ×Ø Ð Ñ Ø Ó ÔÓÖ Ð ÒØ Ñ ÑÓÖ ×ÔÓÒ Ð º Ä Ñ Ò× ÓÒ ÔÙ ×Ô ¬ Ö× ÓÑÓ ÙÒ Ú Ö Ð º ר Ø ÔÓ ÖÖ ÐÓ Ü ÕÙ Ð Ñ ÑÓÖ × Ð Ö Ù Ò Ó Ð ÖÖ ÐÓ Ý ÒÓ × Ö ÕÙ Ö º Ò Ð ÑÔÐÓ ÒØ Ö ÓÖ ×ØÓ × Ö Ð Þ Ñ ÒØ Ò Ý Ò C++ ¸ ÙÒ ÖÖ ÐÓ ×Ø Ø Ó× Ð Ö ÒØÖÓ ÙÒ ÙÒ ÓÒ Ó ÙÒ ÑÓ ÙÐÓ ÔÖ Ó Ð Ô Ð Ö Ö × ÖÚ staticº Ò Ð ×Ó ÙÒ ÑÓ ÙÐÓ¸ Ð ÖÖ ÐÓ ×ÓÐÓ × Ú × Ð ÒØÖÓ Ð ÑÓ ÙÐÓ Ý Ô ÖØ Ö Ð ÔÙÒØÓ Ð Ö ÓÒº Ò Ð ×Ó ÙÒ ÙÒ ÓÒ¸ Ð ÖÖ ÐÓ ×ÓÐÓ × Ú × Ð ÒØÖÓ Ð ÙÒ ÓÒº Ø Ò ÓÒ ×ØÓ ÒÓ Ò × Ö Ñ ÒØ × ÖØÓ Ò ÓØÖÓ× Ð Ò Ù ×º Ò ÇÊÌÊ Æ¸ ÔÓÖ ÑÔÐÓ¸ Ð Ñ ÝÓÖ ÐÓ× ÖÖ ÐÓ× ×ÓÒ ×Ø Ø Ó׺
  • 62.
    36 Cap´ ıtulo 2. Secuencias delete [] array; × ÑÔÓÖØ ÒØ Ö × ÐØ Ö ÕÙ Ð ÓÔ Ö ÓÖ delete [] ÑÔ Ö Ø Ú Ñ ÒØ Ù× Ö ÐÓ× ÓÖ Ø ×¸ ÔÙ × ×Ø × Ð Ñ Ò Ö Ò ÖÐ Ð ÓÑÔ Ð ÓÖ ÕÙ × Ð Ö ÙÒ ÖÖ ÐÓ Ý ÒÓ ÙÒ ÐÓÕÙ Ñ ÑÓÖ º Ë Ö ÕÙ Ö ×Ø × ÒØ Ü × ÔÓÖÕÙ × Ò × Ö Ó ÐÐ Ñ Ö ØÓ Ó× ÐÓ× ×ØÖÙ ØÓÖ × ÙÒÓ ÔÓÖ ÒØÖ Ð ÖÖ ÐÓº Ä Ñ ÑÓÖ Ð ÖÖ ÐÓ Ð Ö Ö× Ô Ò × × × ÙÖÓ ÕÙ ×Ø ÒÓ × Ö Ö ÕÙ Ö Óº Ð ÖÖ ÐÓ Ò Ñ ÑÓÖ Ò Ñ × Ð ÓÔ ÓÒ ØÓ Ô Ö Ð Ñ ÝÓÖ Ð × ÔÐ ÓÒ × ÕÙ Ù× Ò ÖÖ ÐÓ× Ñ Ò× ÓÒ Ñ Ò Ó Ö Ò º Ð Ù Ð Ú Ö ¬ ÓÒ Ö Ò Ó× ÙØ Ð Ø Ö Ó× ÔÙÖ ÓÒ ×Ô Ð Þ Ó× Ø Ð × ÓÑÓ dmalloc ¾¼ Ó valgrind ½½ º 2.1.3 Arreglos de bits Ê ÓÖ ÑÓ× ÕÙ ÙÒ ØÓ Ø ÔÓ ÐÓ Ó¸ bool Ò C++¸ ×ÓÐÓ ÔÙ ØÓÑ Ö Ó× Ú ÐÓÖ × true Ó falseº È Ö Ö ÔÖ × ÒØ Ö ÙÒ bool ×ÓÐÓ × Ö ÕÙ Ö ÙÒ Ø¸ Ô ÖÓ¸ ÔÓÖ Ö ÞÓÒ × Ð Ò ÓÒ Ñ ÑÓÖ ¸ Ò C++ ÙÒ bool × ØÖ Ù Ó ÙÒ ÝØ ÙÝÓ Ú ÐÓÖ ÔÙ × Ö ÖÓ ´0µ Ó ÙÒÓ ´1µº ר ×Ô Ö Ó × Ø ´7µ Ø× × ×ÔÖ Ð Ò Ð ÒÑ Ò× Ñ ÝÓÖ Ð × ÔÐ ÓÒ ×¸ ÔÙ × Ð ÒØ ØÓ× ÐÓ Ó× × Ô ÕÙ Ò º ÓÖ Ò¸ ÕÙ ×Ù × Ø Ò ÑÓ× ÙÒ ÖÖ ÐÓ ØÓ× ÐÓ Ó× Ë Ð Ñ Ò× ÓÒ Ð ÖÖ ÐÓ × ÓÒ× Ö Ð ¸ ÒØÓÒ × ÔÓ ÑÓ× Ò ÙÖÖ Ö Ò ÙÒ ×Ô Ö Ó Ñ ÑÓÖ Ñ¹ ÔÓÖØ ÒØ º È ÖÓ¸ Ü ×Ø Ò ÔÐ ÓÒ × ÕÙ Ö ÕÙ Ö Ò ÖÖ ÐÓ× ÐÓ Ó× Ä Ö ×ÔÙ ×Ø × ¬ÖÑ Ø Ú Ý Ö ÕÙ × ÔÖ × ÒØ Ò ÓÒ ÖØ Ö Ù Ò º ÍÒ ÑÔÐÓ × Ð Ñ Ò Ó Ô Ò × Ñ ÑÓÖ Ú ÖØÙ Ð ØÙ Ó ÔÓÖ ÙÒ × ×Ø Ñ ÓÔ Ö Ø ÚÓº ÓÒ× Ö ÑÓ× ÙÒ Ñ ÑÓÖ ÔÖ Ò Ô Ð 512 Å Ý Ô Ò × 4 à ÙÒ × ×Ø Ñ ÓÔ Ö Ø ÚÓ Ñ ÒØ Ò Ö Ð ×Ø Ó 512×1024à = 131072 Ô Ò ×º Ë 4Ã ×Ø Ó × Ö ÔÖ × ÒØ ÓÒ ÙÒ ÝØ ¸ ÒØÓÒ × × Ö ÕÙ Ö Ò 128 Ã Ñ ÑÓÖ Ô Ö ÐÑ Ò Ö Ð ×Ø Ó Ð × 131072 Ô Ò ×º ÈÓÖ Ô Ò ¸ Ð × ×Ø Ñ ÓÔ Ö Ø ÚÓ Ñ Ò Ó× Ø×º Ð ÔÖ Ñ ÖÓ Ò × Ð Ô Ò × Ò Ù ÒØÖ Ó ÒÓ Ò Ñ ÑÓÖ ÔÖ Ò Ô Ðº Ð × ÙÒ Ó Ò × ÙÒ Ô Ò × Ó Ó ÒÓ ÑÓ ¬ º Ë × ÙØ Ð Þ Ò Ó× Ø× ÔÓÖ Ô Ò ¸ × Ö ÕÙ Ö Ò 2 × 131072 = 32768 = 32à ; 8 ÕÙ ¸ ÓÑÓ × Ú ¸ Ö ÔÖ × ÒØ ÙÒ ÓÖÖÓ Ñ ÑÓÖ × Ò ¬ Ø ÚÓº È Ö Ñ Ò Ö ÖÖ ÐÓ× Ø×¸ ÒØÖÓ Ù Ö ÑÓ× Ð Ì BitArray¸ Ð Ù Ð ÑÓ Ð Þ Ú ØÓÖ × Ø×º ר Ì ×Ø ×Ô ¬ Ó ÑÔÐ ÒØ Ó Ò Ð Ö ÚÓ Ø ÖÖ ÝºÀ ¿ ¿ Ø ÖÖ ÝºÀ ¿ ≡ class BitArray { Å Ñ ÖÓ× ÔÖ Ú Ó× BitArray ¿ Å Ñ ÖÓ× ÔÙ Ð Ó× BitArray ¿ }; ¬Ò × BitArray¸ Ù× Ò ÙÒ × ¿ ¸ ¿ ¸ ¿ ¸ ¿ ß ¾¸ Ò º ÄÓ× ØÖ ÙØÓ× × Ó× BitArray ÓÒ ÖÒ Ò ×Ù Ñ Ò× ÓÒ ¿ Å Ñ ÖÓ× ÔÖ Ú Ó× BitArray ¿ ≡ ´¿ µ ¿ Ð × ÝØ ¿ mutable size_t num_bits; mutable size_t num_bytes;
  • 63.
    2.1. Arreglos 37 num bits ÐÑ Ò Ð Ñ Ò× ÓÒ Ò Ø× Ñ ÒØÖ × ÕÙ num bytes ÐÑ Ò Ð Ñ Ò× ÓÒ Ð ÖÖ ÐÓ ÝØ × array of bytesº Ð Ú ÐÓÖ num bytes × Ñ Ò ÑÓ Ý ×Ù¬ ÒØ Ô Ö ÐÑ Ò Ö ÐÓ× Ø× Ö ÕÙ Ö Ó׺ Ä × Ð ÖÖ ÐÓ ÝØ × × Ö ÐÑ Ò Ò ¿ Å Ñ ÖÓ× ÔÖ Ú Ó× BitArray ¿ +≡ ´¿ µ ¿ ¿ Byte * array_of_bytes; Ð ØÖÙ Ó Ô Ö Ö Ð Þ Ö ÙÒ ÑÔÐ ÒØ ÓÒ × Ò ÐÐ × ×ÔÓÒ Ö ÙÒ ×ÓÔÓÖØ ÕÙ Ñ Ò Ô¹ ÙÐ ÐÓ× Ø× ÒØÖÓ ÙÒ ÝØ º Ó ×ÓÔÓÖØ ר Ó ÔÓÖ Ð ×Ù Ð × BitArray::Byte¸ Ð Ù Ð × ¬Ò × ¿ Ð × ÝØ ¿ ≡ ´¿ µ struct Byte { unsigned int b0 : 1; unsigned int b1 : 1; unsigned int b2 : 1; unsigned int b3 : 1; unsigned int b4 : 1; unsigned int b5 : 1; unsigned int b6 : 1; unsigned int b7 : 1; Ä ØÙÖ Ø¿ × Ö ØÙÖ Ø¿ ÓÒרÖÙ ØÓÖ ÝØ ¿ }; × Ñ ÒØ ¸ Ð ×Ù ¹ Ð × BitArray::Byte ¬Ò ÙÒ Ñ × Ö 8 Ø× Ñ ÒØ ÑÔÓ× Ø× º ר Ñ × Ö Ô ÖÑ Ø ÙÒ ×Ó × Ò ÐÐÓ Ó ÙÒ Ò Øº Ä Ð ØÙÖ ×¸ ÒØÓÒ ×¸ ÑÔÐ ÒØ ÓÑÓ × Ù ¿ Ä ØÙÖ Ø¿ ≡ ´¿ µ unsigned int read_bit(const unsigned int & i) const { switch (i) { case 0 : return b0; case 1 : return b1; // ... case 7 : return b7; } } ÓÒ i × Ð Ò Ð Ø ÕÙ × × Ð Öº Ä × Ö ØÙÖ × ÑÔÐ ÒØ ÓÑÓ × Ù ¿ × Ö ØÙÖ Ø¿ ≡ ´¿ µ void write_bit(const unsigned int & i, const unsigned int & value) { switch (i) { case 0 : b0 = value; break; case 1 : b1 = value; break; ÄÓ× ÑÔÓ× Ø× Ù ÖÓÒ ÓÖ Ò ÐÑ ÒØ ¬Ò Ó× Ô Ö Ð Ð Ò Ù Ý ×ÓÒ Ô ÖØ Ð C++
  • 64.
    38 Cap´ ıtulo 2. Secuencias // ... case 7 : b7 = value; break; } } ÓÒ i × Ð Ò Ð Ø ÕÙ × × Ö Ý value × Ð Ø ÕÙ × × × Ö Öº × ÑÙÝ ÙØ и ÜÔ Ò× × ÙÒ ÔÓ Ó Ø ÑÔÓ¸ ÕÙ Ù Ò Ó × Ô ÖØ Ð Ñ ÑÓÖ Ô Ö ÙÒ Ó ØÓ Ø ÔÓ Byte ØÓ Ó× ×Ù× Ø× ר Ò Ò Ó× Ò ÖÓº ÁÑÔÐ ÒØ Ö ÑÓ× ×Ø × Ñ ÒØ Ò Ð ÓÒרÖÙ ØÓÖ ÔÓÖ ÓÑ × ÓÒ ¿ ÓÒרÖÙ ØÓÖ ÝØ ¿ ≡ ´¿ µ Byte() : b0(0), b1(0), b2(0), b3(0), b4(0), b5(0), b6(0), b7(0) { /* empty */ } ר ÓÒרÖÙ ØÓÖ Ö ÒØ Þ ÕÙ ØÓ Ó ÖÖ ÐÓ Ø ÔÓ Byte Ø Ò ØÓ Ó× ×Ù× Ø× Ò ÖÓº È Ö Ð Ö Ö ÙÒ Ó ØÓ Ø ÔÓ BitArray ר ÓÒ ×Ô ¬ Ö Ð Ñ Ò× ÓÒ Ð ÖÖ ÐÓº Ð ÓÒרÖÙ ØÓÖ Ý Ð ×ØÖÙ ØÓÖ Ø Ò Ò¸ Ô٠׸ Ð × Ù ÒØ ÓÖÑ ¿ Å Ñ ÖÓ× ÔÙ Ð Ó× BitArray ¿ ≡ ´¿ µ ¿ BitArray(const size_t & dim = 256) : num_bits(dim), num_bytes(num_bits/8 + (((num_bits % 8) != 0) ? 1 : 0)), array_of_bytes (new Byte [num_bytes]) { /* empty */ } ~BitArray() { delete [] array_of_bytes; } Í× × BitArray ¿ º È Ö ÓÒÓ Ö Ð Ñ Ò× ÓÒ Ð ÖÖ ÐÓ¸ × ÔÙ ÑÔÐ Ö Ð Ñ ØÓ Ó ¿ Å Ñ ÖÓ× ÔÙ Ð Ó× BitArray ¿ +≡ ´¿ µ ¿ ¿ const size_t & size() const { return get_len(); } Ð ×Ó ÐÓ× Ð Ñ ÒØÓ× Ð ÖÖ ÐÓ × Ö Ð Þ Ñ ÒØ Ð ÓÔ Ö ÓÖ []¸ Ð Ù Ð × ÓÑÔÐ Ó ×Ô ¬ Ö Ý ÑÔÐ ÒØ Ö ÔÓÖÕÙ ×Ø ר Ò Ù Ö ÐÓ× ×Ó× Ð ØÙÖ ÐÓ× × Ö ØÙÖ º Ó Ð Ò i ÙÒ Ø¸ Ð ÔÓ× ÓÒ byte index ÒØÖÓ array of bytes × Ð ÙÐ ÓÑÓ × Ù i byte index = . 8 ËÙ ÔÓ× ÓÒ bit index ÒØÖÓ Ð ÝØ ר Ö ÔÓÖ bit index = i ÑÓ 8 . ÓÒ× Ö ÑÓ× Ð ÒרÖÙ ÓÒ i = array[40]; ÕÙ Ð Ö Ð Ú ÐÓÖ Ð Ø ÓÖÖ ×ÔÓÒ ÒØ Ð ÒØÖ 40º Ò ×Ø ×Ó¸ Ð ÑÔÐ ÒØ ÓÒ Ð ÓÔ Ö ÓÖ [] Ù× Ö Ð Ø 40 Ý ÒØÓÒ × Ö ØÓÖÒ Ö ÙÒ Ö ÔÖ × ÒØ ÓÒ ÒØ Ö ¹ Ø ÔÓ int¹ Ð Ø Óº Ò ×Ø ×Ó¸ Ð ÓÔ Ö ÓÖ [] ÒÚÓ Ö read bit()º ÓÖ ÓÒ× Ö ÑÓ× Ð ÒרÖÙ ÓÒ array[40] = i; ÕÙ × Ö Ö Ò Ð ÒØÖ 40 Ð ÖÖ ÐÓ Ð Ú ÐÓÖ ÓÒØ Ò Ó Ò Ð Ú Ö Ð iº Ò ×Ø ×Ó¸ Ð ×Ó ÐÓ Ð Þ Ö Ð Ø 40 Ò Ð ÖÖ ÐÓ Ý × Ö Ö¸ ÒÓ Ð Ö¸ Ð Ú ÐÓÖ iº Ò ×Ø ×Ó¸ Ð ÓÔ Ö ÓÖ [] ÒÚÓ Ö write bit()º Ä ÑÔÐ ÒØ ÓÒ Ð ÓÔ Ö ÓÖ [] Ö ÕÙ Ö ¸ ÒØÓÒ ×¸ Ö Ð Þ Ö ÓÔ Ö ÓÒ × Ö ÒØ × × ÙÒ Ð Ø ÔÓ ×Ó Ð ØÙÖ Ó × Ö ØÙÖ º ×ØÓ ÒÓ × ÔÙ Ö Ð Þ Ö Ò Ð ÑÔÐ ÒØ ÓÒ Ð ÙÒ Ð × Ð Ö ÓÒ × ØÖ ÓÒ Ð × Ð ÓÔ Ö ÓÖ []¸ Ô ÖÓ × × ÔÙ ÔÓר Ö Ö Ð ×Ø Ò ÓÒ ×Ø Ð ÙÒ ÑÓÑ ÒØÓ Ò ÕÙ × ÔÓ× Ð ÓÒÓ Ö × Ð ×Ó × Ð ØÙÖ Ó
  • 65.
    2.1. Arreglos 39 × Ö ØÙÖ º Ì Ð ×Ø Ò ÓÒ × Ö Ð Þ Ñ ÒØ ÙÒ ÓÑ Ò ÓÒ Ð ÓÔ Ö ÓÖ [] Ý ÙÒ Ð × ×Ô Ð ÒÓÑ Ò ÔÖÓÜÝ ¸ Ð Ù Ð × ¬Ò ÓÑÓ × Ù ¿ Å Ñ ÖÓ× ÔÖ Ú Ó× BitArray ¿ +≡ ´¿ µ ¿ class BitProxy { Ñ Ñ ÖÓ× ÔÖ Ú Ó× ØÈÖÓÜÝ ¿ Ñ Ñ ÖÓ× ÔÙ Ð Ó× ØÈÖÓÜÝ ¿ }; ¬Ò × BitProxy¸ Ù× Ò ÙÒ × ¿ Ò ¼ º Ð ÓÔ Ö ÓÖ [] BitArray Ö ØÓÖÒ ÙÒ BitProxy¸ Ñ Ò Ö Ø Ð ÓÑÓ × Ù ¿ Å Ñ ÖÓ× ÔÙ Ð Ó× BitArray ¿ +≡ ´¿ µ ¿ ¼ BitProxy operator [] (const size_t & i) const { return BitProxy(const_cast<BitArray&>(*this), i); } BitProxy operator [] (const size_t & i) { return BitProxy(*this, i); } Í× × BitArray ¿ Ò BitProxy ¿ º Ð ÔÖ Ñ Ö ÓÔ Ö ÓÖ × ÒÚÓ Ô Ö ÙÒ BitArray ÓÒר ÒØ ´ Ð Ö Ó constµ¸ Ñ ÒØÖ × ÕÙ Ð × ÙÒ Ó Ô Ö ÙÒ BitArray ÕÙ ÒÓ × ÓÒר ÒØ º Ð ÓÔ Ö ÓÖ × Ò ÓÒ Ý Ð ÓÒרÖÙ ØÓÖ ÓÔ BitProxy ÑÔÐ ÒØ Ò Ð × Ö ØÙÖ ¸ Ñ ÒØÖ × ÕÙ Ð ÓÔ Ö ÓÖ ÓÒÚ Ö× ÓÒ Ø ÔÓ ÑÔÐ ÒØ Ð Ð ØÙÖ º Ù ÐÕÙ Ö × Ð Ø ÔÓ ×Ó¸ ÔÖ Ú Ñ ÒØ × Ò × Ö Ó Ð ÙÐ Ö Ð Ò Ð ÝØ ÒØÖÓ array of bytes Ý Ð Ò Ð Ø ÒØÖÓ Ð ÝØ º ר Ò ÓÖÑ ÓÒ Ð Ù Ö ÑÓ× Ò ÐÓ× × Ù ÒØ × ØÖ ÙØÓ× ¿ Ñ Ñ ÖÓ× ÔÖ Ú Ó× ØÈÖÓÜÝ ¿ ≡ ´¿ µ const size_t bit_index; Byte * byte_ptr; Ì Ð × ØÖ ÙØÓ× × Ò Ò Ò Ð ÓÒרÖÙ ØÓÖ BitProxy ¿ Ñ Ñ ÖÓ× ÔÙ Ð Ó× ØÈÖÓÜÝ ¿ ≡ ´¿ µ ¼ BitProxy(BitArray & array, const size_t & i) : bit_index(i % 8) { const size_t byte_index = i/8; byte_ptr = &array.array_of_bytes[byte_index]; } Í× × BitArray ¿ Ò BitProxy ¿ º Ù Ò Ó × Òר Ò ÙÒ Ð × BitProxy¸ × Ö¸ Ù Ò Ó × ÒÚÓ Ð ÓÔ Ö ÓÖ [] BitArray¸ Ð ÑÔÓ byte ptr ÔÙÒØ Ð ÝØ ÒØÖÓ array of bytes ÕÙ ÓÒ¹ Ø Ò Ð Ø ÕÙ × × Öº bit index ÓÒØ Ò Ð Ò Ð Ø ÒØÖÓ Ð ÝØ *byte ptrº Ë Ð Ò i ר Ù Ö Ö Ò Ó¸ ÒØÓÒ × Ð ÓÒרÖÙ ØÓÖ ×Ô Ö Ð Ü Ô ÓÒ std::out of range()º ÆÓØ × ÕÙ Ð ÑÓÑ ÒØÓ ÓÒרÖÙ ÓÒ ÙÒ BitProxy ÙÒ ÒÓ × Ö ÐÞ Ó Ð ×Ó¸ Ô ÖÓ × × Ð ÙÐ Ó Ð Ö ÓÒ Ð ÝØ ÓÒ × Ò Ù ÒØÖ Ð Ø ´byte ptrµ Ý× Ø ÖÑ Ò Ó Ù Ð × Ð Ø ÒØÖÓ × ÝØ ´bit indexµº Ë ÙÒ Ð ÓÒØ ÜØÓ Ð ÜÔÖ × ÓÒ ÕÙ ÒÚÓÕÙ Ð ÓÔ Ö ÓÖ [] Ð ÓÑÔ Ð ÓÖ ×Ø Ò Ù × Ð ×Ó × Ð ØÙÖ Ó × Ö ØÙÖ º Ë × Ð ØÙÖ ¸ ÒØÓÒ × Ð ÓÑÔ Ð ÓÖ ØÖ Ø Ö
  • 66.
    40 Cap´ ıtulo 2. Secuencias ÓÒÚ ÖØ Ö Ð BitProxy ÙÒ ÒØ ÖÓ Ö ×ÙÐØ ÒØ Ð Ð ØÙÖ ¼ Ñ Ñ ÖÓ× ÔÙ Ð Ó× ØÈÖÓÜÝ ¿ +≡ ´¿ µ ¿ ¼ operator int () const { return byte_ptr->read_bit(bit_index); } Ù Ò Ó Ð ÓÑÔ Ð ÓÖ Ò Ù ÒØÖ ÙÒ ÜÔÖ × ÓÒ ÓÑÓ i = array[40]¸ × Ù× ÙÒ ÓÒ×¹ ØÖÙ ØÓÖ int ÓÒ Ô Ö Ñ ØÖÓ BitProxyº Ë ÒÓ¸ Ð ÓÑÔ Ð ÓÖ Ù× ÙÒ × Ò ÓÒ BitProxy intº ÓÑÓ ÒÓ Ü ×Ø Ò Ò ÙÒÓ ×ØÓ× ÓÔ Ö ÓÖ ×¸ Ð ÓÑÔ Ð ÓÖ ÓÒ¹ Ú ÖØ Ð ÔÖÓÜÝ ÙÒ intº Ò Ð ÜÔÖ × ÓÒ array[40] = i¸ ר ÓÒ ¬Ò Ö ÙÒ ÓÔ Ö ÓÖ × Ò ÓÒ ÔÖÓÜÝ Ô ÖØ Ö ÙÒ ÒØ ÖÓ Ø Ð ÓÑÓ × Ù ¼ Ñ Ñ ÖÓ× ÔÙ Ð Ó× ØÈÖÓÜÝ ¿ +≡ ´¿ µ ¼ BitProxy& operator = (const size_t & value) { byte_ptr->write_bit(bit_index, value); return *this; } Í× × BitProxy ¿ º Ä Ð × BitProxy Ô ÖÑ Ø Ñ Ò Ö ÙÒ ÖÖ ÐÓ Ø× × Ü Ø Ñ ÒØ Ð Ñ ×Ñ Ñ Ò Ö ÕÙ × Ù× Ò ÐÓ× ÖÖ ÐÓ׺ Ë Ò Ñ Ö Ó¸ ר Ø Ò Ò Ö ÒØ Þ ÕÙ × ÑÔÖ × ÔÓ× Ð Ù× Ö Ð ÓÔ Ö ÓÖ []¸ Ò × Ð Ñ × ÐØÓ × ÑÔ ÒÓº ÈÓÖ × Ö ÞÓÒ ÜÔÓÖØ ÑÓ× Ó× ÓÔ Ö ÓÒ × ÜÔÐ Ø × Ð ØÙÖ Ý × Ö ØÙÖ ¼ Å Ñ ÖÓ× ÔÙ Ð Ó× BitArray ¿ +≡ ´¿ µ ¿ ¼ int read_bit(const size_t & i) const { const int bit_index = i % 8; return array_of_bytes[i/8].read_bit(bit_index); } void write_bit(const size_t & i, const unsigned int & value) const { array_of_bytes[i/8].write_bit(i, value); } ØÓ× Ñ ÓÖ × ÑÔ ÒÓ¸ ר × ÓÔ Ö ÓÒ × ÒÓ Ö Ð Þ Ò Ú Ö ¬ ÓÒ × ÓÖÖ Ø ØÙ º ÓÑÓ ÖÖ ÐÓ¸ ÙÒ BitArray ר ×Ù ØÓ Ð × Ñ ×Ñ × Ö ×ØÖ ÓÒ × ×Ó ×¸ × Ò Ó Ð ÔÖ Ò Ô Ð Ó ×Ø ÙÐÓ Ð ÔÓ× Ð ÕÙ Ð Ñ Ò× ÓÒ ÒÓ × ×Ù¬ ÒØ Ô Ö Ù Ö Ö ÐÓ× Ø× Ö ÕÙ Ö Ó׺ ÈÓÖ × Ö ÞÓÒ¸ ÔÐ ÒØ Ö ÑÓ× ÙÒ ÓÔ Ö ÓÒ Ö Ùר ¸ ÓÒ× ×Ø ÒØ Ò Ð Ö ¹ ¬Ò ÓÒ Ð Ñ Ò× ÓÒ ¼ Å Ñ ÖÓ× ÔÙ Ð Ó× BitArray ¿ +≡ ´¿ µ ¼ void resize(const size_t & new_dim) { const size_t new_num_bytes = new_dim/8 + (((new_dim % 8) != 0) ? 1 : 0); Byte * new_array_of_bytes = new Byte [new_num_bytes]; for (int i = 0, n = Aleph::min(num_bytes, new_num_bytes); i < n; ++i) new_array_of_bytes[i] = array_of_bytes[i]; num_bits = new_dim; num_bytes = new_num_bytes; delete [] array_of_bytes; array_of_bytes = new_array_of_bytes;
  • 67.
    2.1. Arreglos 41 } ÆÓØ ÑÓ× ÕÙ Ñ ÒØ resize() ÒÓ ×ÓÐÓ ÔÙ Ñ Ö× Ð Ñ Ò× ÓÒ Ô Ö Ö Ð ÖÖ ÐÓ Ñ × Ö Ò ¸ × ÒÓ¸ Ø Ñ Ò¸ Ô Ö ÖÐÓ Ñ × Ô ÕÙ ÒÓº Ò ×Ø ÙÐØ ÑÓ ×Ó × Ô Ö Ò ÐÓ× Ø× Ü ÒØ ׺ 2.1.4 Arreglos Din´micos a ÍÒ ÖÖ ÐÓ Ò Ñ Ó × ÕÙ Ð Ò Ð Ù Ð ×Ù Ñ Ò× ÓÒ ÔÙ ÑÓ ¬ Ö× Ò Ñ Ñ ÒØ º ×ØÓ × ÑÙÝ ÙØ Ð Ô Ö ÔÐ ÓÒ × ÕÙ × Ò Ò ¬ Ö Ð Ö Ô Ó ×Ó ÔÓÖ ÔÓ× ÓÒ¸ Ô ÖÓ ÕÙ ÒÓ ÓÒÓ Ò Ð ÒÙÑ ÖÓ Ð Ñ ÒØÓ× ÕÙ × ÔÙ Ò Ñ Ò Öº ÈÓÖ ÑÔÐÓ¸ ÙÒ Ø ÔÓ ×Ô Ð Ö ÙÔ Ö ÓÒ Ð Ú ¹ Ö ÓÒ¸ ÐÐ Ñ Ó × Ò Ò Ñ Ó¸ ÙÑ ÒØ Ý ÓÒØÖ ÔÖÓ Ö × Ú Ñ ÒØ Ð Ñ Ò× ÓÒ ÙÒ ÖÖ ÐÓº ר רÖÙ ØÙÖ × ÜÔÐ Ò Ð × ÓÒ Ü º½º º C Ý C++ ÒÓ ×ÓÔÓÖØ Ò ÖÖ ÐÓ× Ò Ñ Ó׺ ×ØÓ ÑÔÐ ÕÙ ÐÓ× ÖÖ ÐÓ× Ò Ñ Ó× Ò ×ÙÖØ Ö× ÔÓÖ ÙÒ Ì Ò Ð ÓØ º ÓÖ Ò¸ ÓÑÓ ÑÔÐ Ñ ÒØ Ö ÙÒ ÖÖ ÐÓ Ò Ñ Ó Ä Ò Þ ×Ù Ö ÕÙ × Ö ÐÓ Ð Ð ÖÖ ÐÓº ÁÒ ÐÑ ÒØ ¸ × ¬ ÙÒ Ñ Ò× ÓÒ Ý × Ô ÖØ Ñ ÑÓÖ Ô Ö Ð ÖÖ ÐÓº Ë Ð Ñ Ò× ÓÒ × Ð ÒÞ ¸ ÒØÓÒ × × Ø ÖÑ Ò ÙÒ ÒÙ Ú Ñ Ò× ÓÒ Ñ ÝÓÖ Ý × Ô ÖØ ÙÒ ÒÙ ÚÓ ÐÓÕÙ Ñ ÑÓÖ º ×Ô٠׸ ÐÓ× Ð Ñ ÒØÓ× × ÓÔ Ò Ð ÒÙ ÚÓ ÐÓÕ٠ݸ ¬Ò ÐÑ ÒØ ¸ × Ð Ö Ð ÒØ ÙÓ ÐÓÕÙ º ר Ò ÓÕÙ × Ó ÙØ Ð Þ Ó ÓÒ Ü ØÓ Ò Ð ÙÒÓ× × ×Ø Ñ × ÑÔÓÖØ ÒØ ׺ Ä Ð ÓØ ר Ò Ö C Ó Ö ÙÒ ÔÖ Ñ Ø Ú ¸ realloc()¸ ÙÝ × ÒØ Ü × × Ð × Ù ÒØ void *realloc(void *ptr, size_t size); Ä ÖÙØ Ò Ñ Ð Ø Ñ ÒÓ Ð ÐÓÕÙ Ñ ÑÓÖ ÔÙÒØ Ó ÔÓÖ ptr¸ Ð Ù Ð Ö × Ó Ó Ø Ò Ó ÐÐ Ñ × ÔÖ Ú × malloc()¸ calloc() Ó realloc()º Ð ÓÒ¹ Ø Ò Ó ptr Ô ÖÑ Ò Ö ÒÑÓ ¬ Ó Ð Ñ Ò ÑÓ ÔÓ× Ð ÒØÖ Ð ÒØ ÙÓ Ý Ð ÒÙ ÚÓ Ø Ñ ÒÓ sizeº Ì ÓÖ Ñ ÒØ ¸ realloc() × ÒØ Ð ÒØ Ý Ô Þ Ô ÖØ Ö ÙÒ ÐÓÕÙ Ñ × Ö Ò × Ò Ñ Ö Ð Ö ÓÒ Ñ ÑÓÖ º ×ØÓ × ÒØ Ö × ÒØ ÔÓÖÕÙ × Ú Ø Ð ÓÔ ÐÓ× Ð Ñ ÒØÓ× Ð ÒØ ÙÓ ÐÓÕÙ Ð ÒÙ ÚÓ ÐÓÕÙ º ÑÔ ÖÓ¸ Ò Ð ÔÖ Ø ×ØÓ ÒÓ × ×Ù¹ ¬ ÒØ ÔÓÖÕÙ ÒÓ × ÙÒ Ö ÒØ º Ó¸ ÑÙÝ ÔÓ × ÑÔÐ Ñ ÒØ ÓÒ × realloc() Ò ÙÒ × Ù ÖÞÓ ÔÓÖ Ú Ö ¬ Ö × Ý Ñ ÑÓÖ ÓÒØ Ù ×ÔÓÒ Ð ptrº 2.1.5 El TAD DynArray<T> Ò ×Ø × ÓÒ ÑÓ×ØÖ Ö ÑÓ× ØÓ Ð ÒØ Ö Þ ÑÔÐ Ñ ÒØ ÓÒ ÙÒ Ì ¸ ÐÐ Ñ Ó DynArray<T>¸ Ð Ù Ð ÑÓ Ð Þ ÙÒ ÖÖ ÐÓ Ò Ñ Ó Ð Ñ ÒØÓ× Ø ÔÓ Tº DynArray<T> ×ØÖ ÙÒ Ñ Ò× ÓÒ ØÙ Ð ÓÒ ÙÒ Ú ÐÓÖ Ò Ð ×Ô ¬ Ó Ò Ø ÑÔÓ ÓÒרÖÙ ÓÒº Ì Ð Ñ Ò× ÓÒ ØÙ Ð × ÓÒÓ Ñ ÒØ Ð Ñ ØÓ Ó size()º DynArray<T> Ö ÒØ Þ ÙÒ ÓÒ×ÙÑÓ Ñ ÑÓÖ ÔÖÓÔÓÖ ÓÒ Ð Ð ÒØ Ò¹ ØÖ × × Ö Ø × Ð ÖÖ ÐÓ × Ö¸ Ð × ÒØÖ × ÕÙ ÒÓ Ò × Ó × Ö Ø × ÒÓ Ò × Ö ¹ Ñ ÒØ ÓÒ×ÙÑ Ò Ñ ÑÓÖ º Ä Ñ ÑÓÖ × Ö × ÖÚ ×ÓÐÓ Ù Ò Ó × × Ö Ò Ð × ÒØÖ × ÔÓÖ ÔÖ Ñ Ö Ú Þº Ä Ñ Ò× ÓÒ ØÙ Ð × ÜÔ Ò Ô Ö ÞÓ× Ý ÙØÓÑ Ø Ñ ÒØ Ù Ò Ó × × Ö ×Ó Ö ÙÒ Ò ÕÙ ×Ø Ù Ö Ð Ñ Ò× ÓÒ ØÙ к Ë × Ö Ö Ò ÙÒ Ò ÓÑÓ Ð ØÙÖ Ñ ÝÓÖ Ó Ù Ð Ð Ñ Ò× ÓÒ ØÙ и ÒØÓÒ × × Ò Ö Ð Ü Ô ÓÒ Ù Ö Ö Ò Óº
  • 68.
    42 Cap´ ıtulo 2. Secuencias Ä Ñ Ò× ÓÒ ØÙ Ð ÔÙ ÓÒØÖ Ö× ÜÔÐ Ø Ñ ÒØ Ñ ÒØ ÙÒ ÓÔ Ö ÓÒ ÐÐ Ñ cut()º Ä ÙÒ ÓÒ Ð Ö ÒØÓÒ × ØÓ Ð Ñ ÑÓÖ Ó ÙÔ ÒØÖ Ð ÒÙ Ú Ý ÒØ Ö ÓÖ Ñ Ò× ÓÒ ØÙ к DynArray<T> × ×Ô ¬ Ò Ð Ö ÚÓ ØÔÐ ÝÒ ÖÖ ÝºÀ ¾ ¸ Ð Ù Ð ÜÔÓÖØ Ð Ð × Ô Ö Ñ ØÖ Þ DynArray<T> ¾ ØÔÐ ÝÒ ÖÖ ÝºÀ ¾ ≡ template <typename T> class DynArray { Ñ Ñ ÖÓ× ÓÒר ÒØ × DynArray<T> Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> Ñ Ñ ÖÓ× ÔÙ Ð Ó× DynArray<T> }; ÁÒ ÓÒ ÓÒר ÒØ × DynArray<T> ½ ¬Ò × DynArray¸ Ù× Ò ÙÒ × ¸ ½¸ ¾ ¸ ¸ ¸½ ¸ ¾ ¾¸ ¿¿¾ ¸ ¿ ß ½¸ ¿¾¸ ß ½¸ ¸ ¸ ¼¸ ¾ ¸ ¿¸ ¾¸ Ò º × Ò ×Ô Ò× Ð ÕÙ Ü ×Ø Ð ÓÒרÖÙ ØÓÖ ÔÓÖ ÓÑ × ÓÒ T::T()¸ × ÓÑÓ Ð ×ØÖÙ ¹ ØÓÖ T::~T()º Ä Ù× Ò Ù ÐÕÙ Ö ÐÐÓ× × Ö ÔÓÖØ ÓÑÓ ÖÖÓÖ Ò Ø ÑÔÓ ÓÑÔ Ð ÓÒº ÍÒ DynArray<T> ×Ó ÙÒ Ñ Ò× ÓÒ Ñ Ü Ñ º ÍÒ ÖÖ ÐÓ ÒÓ ÔÙ ÜÔ Ò Ö× Ñ × ÐÐ ÕÙ ÐÐ Ñ Ò× ÓÒº ÈÓÖ ÓÑ × ÓÒ¸ Ð Ñ Ò× ÓÒ Ñ Ü Ñ × 2 ÒØÖ × ´2 × 1024 × 1024 × 1024µ º 2.1.5.1 Estructura de datos de DynArray<T> Ä ¬ ÙÖ ¾º½ ´Ô Ò ¿µ ×ÕÙ Ñ Ø Þ Ð Ö ÔÖ × ÒØ ÓÒ Ò Ñ ÑÓÖ ÙÒ DynArray<T>¸ Ð Ù Ð ÐÙ×ØÖ ØÖ × Ð × × ÓÑÔÓÒ ÒØ × Directorio: ÖÖ ÐÓ ÔÙÒØ ÓÖ × × Ñ ÒØÓ× ÙÝ Ñ Ò× ÓÒ × dir sizeº Segmento: ÖÖ ÐÓ ÔÙÒØ ÓÖ × ÐÓÕÙ × ÙÝ Ñ Ò× ÓÒ × seg sizeº ÈÙ Ò Ü ×Ø Ö ×Ø dir size × Ñ ÒØÓ׺ Bloque: ÖÖ ÐÓ Ð Ñ ÒØÓ× Ø ÔÓ T ÙÝ Ñ Ò× ÓÒ × block sizeº Ò ØÓØ Ð¸ ÔÙ Ò Ü ×Ø Ö ×Ø dir size × seg size ÐÓÕ٠׺ ÄÓ× ÐÓÕÙ × ÐÑ Ò Ò ÐÓ× Ð Ñ ÒØÓ× Ð ÖÖ ÐÓº Ä Ñ Ò× ÓÒ Ñ Ü Ñ Ð ÖÖ ÐÓ × dir size × seg size × block size Ð Ñ ÒØÓ׺ ËÓ Ö ÙÒ Ñ ÕÙ Ò 32 Ø×¸ Pentium III¸ ÔÓÖ ÑÔÐÓ¸ ÙÒ ÔÖÓ ×Ó ×ÔÓÒ ÙÒ ×Ô Ó Ö ¹ ÓÒ Ñ ÒØÓ 232 º ÓÑÓ Ð ×Ô Ó Ö ÓÒ Ñ ÒØÓ ÓÒØ Ò Ö Ð Ó Ó Ð ÔÖÓ Ö Ñ ¸ ×Ù× ØÓ× ×Ø Ø Ó× Ý ×Ù× ØÓ× Ò Ñ Ó׸ Ð ÒØ ×Ô Ó ×ÔÓÒ Ð × Ñ ÒÓÖ ÕÙ 232 º Ñ ×¸ Ð × ×Ø Ñ ÓÔ Ö Ø ÚÓ Ö × ÖÚ ÙÒ Ô ÖØ Ð ×Ô Ó Ö ÓÒ Ñ ÒØÓ Ô Ö × Ñ ×ÑÓº ÍÒ ÖÖ ÐÓ ¾ ÒØ ÖÓ× ÓÖØÓ× ´shortµ ÒÓ Ö Ò ÙÒ ÔÖÓ ×Óº ÈÓÖ ÓØÖ Ô ÖØ ¸ × Ö ÕÙ Ö Ö Ð Ñ ÒÓ× ÙÒ Ñ ÑÓÖ Ú ÖØÙ Ð 4 ÝØ × Ô Ö Ð Ö Ö ×Ø ÖÖ ÐÓº ÈÓÖ ×Ø × Ö ÞÓÒ ×¸ Ö ÑÓ× ÕÙ 2 ÒØÖ × × ×Ù¬ ÒØ Ô Ö Ð Ñ ÝÓÖ Ð × × ØÙ ÓÒ ×º ÄÓ ÒØ Ö ÓÖ × Ö Ú Ð Ó Ò × ×Ø Ñ × Ô Ö× ×Ø ÒØ × ÓÒ Ö Ò × ÖÖ ÐÓ× ×ÓÒ Ñ Ô Ó× Ò × Ó Ý Ò Ñ ÑÓÖ Ý Ò Ñ Ñ ÒØ Ö Ó× Ð Ñ Ò º Ä × ÖÕÙ Ø ØÙÖ × Ø× Ó Ñ × Ò ÔÓ× Ð ×Ô Ó× Ö ÓÒ Ñ ÒØÓ Ô Ö× ×Ø ÒØ × ÒÚ Ö ÙÖ ÑÙÝ Ö Ò º ÑÔ ÖÓ¸ Ð ÓÒ× Ù ÓÒ ÙÒ × ×Ø Ñ ÓÔ Ö Ø ÚÓ¸ Ô Ö Ñ Ð Ô Ö× ×Ø Ò ¸ × ÙÒ ÙÒ Ø Ñ ÑÙÝ ÒÑ ÙÖÓ ÒÚ ×Ø ÓÒº
  • 69.
    2.1. Arreglos 43 º º º º º º º º º º º º º º º º º º º º º Bloques dir size º º º block size º º º Segmento º º º seg size º º º º º Directorio º º º º º º º º º º ÙÖ ¾º½ רÖÙ ØÙÖ ØÓ× DynArray<T> Ð Ö Ø Ö Ò Ñ Ó Ð ÖÖ ÐÓ Ö × Ò Ð Ó ÕÙ ×ÓÐÓ × ÙØ Ð Þ Ò ÐÓ× ÐÓÕÙ × Ý × Ñ ÒØÓ× ÕÙ ÓÖÖ ×ÔÓÒ Ò Ð Ñ ÒØÓ× Ð ÖÖ ÐÓ ÕÙ Ý Ò × Ó × Ö ØÓ× Ó Ñ ÒØ ÙÒ Ñ ØÓ Ó ×Ô Ð ÐÐ Ñ Ó touch()º Ó ÙÒ Ò i¸ Ð ×Ó ÑÔÐ Ð ÙÐ Ö Ð ÒØÖ Ò Ð Ö ØÓÖ Ó¸ ÐÙ Ó Ð ÒØÖ Ò Ð × Ñ ÒØÓ Ý¸ ¬Ò ÐÑ ÒØ ¸ Ð ÒØÖ Ò Ð ÐÓÕÙ º רÓ× Ð ÙÐÓ× ÔÙ Ò Ö Ð Þ Ö× ÓÑÓ × Ù ´ Indice del segmento en el directorio: × Ñ ÒØÓ Ö ÔÖ × ÒØ seg size×block size Ð Ñ ÒØÓ× Ð ÖÖ ÐÓº Ð Ò Ò Ð Ö ØÓÖ Ó ×Ø Ó ÔÓÖ Ð ÜÔÖ × ÓÒ × Ù ÒØ pos in dir = i seg size × block size ´¾º¾µ ÍØ Ð Þ Ö ÑÓ× Ð ÒÓÑ Ö Ú Ö Ð pos in dir Ú Þ ÕÙ Ö ÕÙ Ö ÑÓ× ÐÑ Ò Ö ÙÒ Ò Ò Ð Ö ØÓÖ Óº ´ Indice del bloque en el segmento: Ð Ö ×ØÓ Ð Ú × ÓÒ ´¾º¾µ¸ ÒÓØ Ó Ö ×ØÓ¸ ܹ ÔÖ × Ð ÒÙÑ ÖÓ ÐÓÕÙ × ÕÙ ÐØ Ò Ô Ö ÐÐ Ö Ð Ò iº ÈÙ ×ØÓ ÕÙ ÐÓÕÙ ÔÓ× block size Ð Ñ ÒØÓ׸ Ð ÔÓ× ÓÒ ÒØÖÓ Ð × Ñ ÒØÓ ×Ø ÔÓÖ pos in seg = Ö ×ØÓ ´¾º¿µ block size ÓÒ Ö ×ØÓ × ¬Ò ÓÑÓ Ö ×ØÓ = i ÑÓ (seg size × block size) ´¾º µ
  • 70.
    44 Cap´ ıtulo 2. Secuencias Ð ÒÓÑ Ö Ú Ö Ð pos in seg × Ö ÙØ Ð Þ Ó Ú Þ ÕÙ × × Ñ ÑÓÖ Þ Ö ÙÒ Ò × Ñ ÒØÓº Indice del elemento en el bloque: Ð Ò ´ Ð Ð Ñ ÒØÓ ÒØÖÓ Ð ÐÓÕÙ × Ó Ø Ò ØÖ Ú × Ð Ö ×ØÓ Ð Ú × ÓÒ ´¾º¿µº × Ô٠׸ Ð Ö ×ØÓ ×Ø Ú × ÓÒ × Ð ÒÙÑ ÖÓ Ð Ñ ÒØÓ× ÕÙ ÐØ Ò Ô Ö ÐÐ Ö Ð i¹ × ÑÓ Ð Ñ ÒØÓ ÒØÖÓ Ð ÐÓÕÙ pos in block = Ö ×ØÓ ÑÓ block size ´¾º µ ËÙר ØÙÝ Ò Ó ´¾º µ Ò ´¾º µ pos in block = (i ÑÓ (seg size × block size)) ÑÓ block size ´¾º µ ר × ÓÔ Ö ÓÒ × Ò ØÙ Ö× × ÑÔÖ ÕÙ × × Ö Ð Þ Ö ÙÒ ×Óº ÈÙ ×ØÓ ÕÙ ÓÔ Ö ÓÒ ØÓÑ ÙÒ Ñ Ü ÑÓ Ø ÑÔÓ ÓÒר ÒØ ¸ × Ö ÒØ Þ ÕÙ Ð ×Ó ÙÒ ÖÖ ÐÓ Ò Ñ Ó ØÓÑ ÙÒ Ñ Ü ÑÓ Ø ÑÔÓ ÕÙ Ø Ñ Ò × ÓÒר ÒØ º È Ö Ñ ÓÖ Ö Ð Ø ÑÔÓ Ð ÙÐÓ ´¾º¾µ¸ ´¾º¿µ Ý ´¾º µ ÐÓ× Ø Ñ ÒÓ× Ö ØÓÖ Ó¸ × Ñ ÒØÓ Ý ÐÓÕÙ ×ÓÒ ÔÓØ Ò × Ü Ø × Ó׺ ר ÓÖÑ ¸ Ð ÑÙÐØ ÔÐ ÓÒ Ý Ð Ú × ÓÒ ÔÙ Ò Ö Ð Þ Ö× ÓÒ × ÑÔÐ × ×ÔÐ Þ Ñ ÒØÓ׺ ØÓ× Ò Ö Ø ÑÔÓ Ù ÓÒ¸ Ð ÙÒÓ× Ð ÙÐÓ× × Ö Ð Þ Ò Ò Ø ÑÔÓ ÓÒרÖÙ ÓÒ Ý Ñ × ÚÙ ÐÚ Ò ÑÓ ¬ Ö× ÙÖ ÒØ Ð Ø ÑÔÓ Ú ÙÒ Òר Ò DynArray<T>º Ñ Ñ ÖÓ× ÓÒר ÒØ × DynArray<T> ≡ ´ ¾µ mutable size_t pow_dir; mutable size_t pow_seg; mutable size_t pow_block; ר × ÓÒר ÒØ × ÐÑ Ò Ò Ð × ÔÓØ Ò × 2 Ð × ÐÓÒ ØÙ × Ð Ö ØÓÖ Ó¸ × Ñ ÒØÓ Ý ÐÓÕÙ ¸ Ð Ù Ð × ×ÓÒ 2pow dir ¸ 2pow seg Ý 2pow block ¸ Ö ×Ô Ø Ú Ñ ÒØ º Ä Ñ Ò× ÓÒ Ñ Ü Ñ Ö ×ÙÐØ ÒØ × 2pow dir ×2pow seg ×2pow block º Ë ×Ø Ð ÙÐÓ Ö ×ÙÐØ Ñ ÝÓÖ ÕÙ Ð Ñ Ü Ñ Ñ Ò× ÓÒ Ô ÖÑ Ø Max Dim Allowed¸ ÒØÓÒ × × Ò Ö Ð Ü¹ Ô ÓÒ std::length errorº Ë ÒÓ Ý Ô ÒÙÑ Ö Ô Ö ØÙ Ö Ð × ÓÔ Ö ÓÒ × Ñ ÒØ ×ÔÐ Þ Ñ ÒØÓ׸ ÒØÓÒ × × Ò Ö Ð Ü Ô ÓÒ std::overflow errorº ÒØ × ÓÒØ ÒÙ Ö¸ Ø Ò Ò× Ò Ù ÒØ Ð × × Ù ÒØ × Ù Ð × seg size = 2pow seg ´¾º µ block size = 2 pow block ´¾º µ ËÙר ØÙÝ Ò Ó ´¾º µ Ý ´¾º µ Ò ´¾º¾µ Ø Ò ÑÓ× pos in dir = 2pow seg i ×2 pow block i = (pow seg+pow block) 2 ´¾º µ Ñ Ñ ÖÓ× ÓÒר ÒØ × DynArray<T> +≡ ´ ¾µ mutable size_t seg_plus_block_pow;
  • 71.
    2.1. Arreglos 45 Ð Ú ÐÓÖ 2(pow seg+pow block) × Ù Ö ÔÖ Ú Ñ ÒØ Ò seg plus block pow Ô Ö ÙØÙÖÓ× Ð ÙÐÓ׺ ËÙר ØÙÝ Ò Ó ´¾º µ Ý ´¾º µ Ò ´¾º µ¸ Ø Ò ÑÓ× Ö ×ØÓ = i ÑÓ (2pow seg × 2pow block ) = i ÑÓ 2(pow seg+pow block) ´¾º½¼µ ÓÖ ÑÓ× Ò ÓÒØÖ Ö ÙÒ Ñ Ò Ö Ð ÙÐ Ö Ö Ô Ñ ÒØ Ð Ó ÒØ Ý Ð Ö ×ØÓ ÙÒ Ú × ÓÒ ÒØÖ ÙÒ ÔÓØ Ò Ü Ø 2º È Ö Ð ×Ó Ð Ð ÙÐÓ Ð Ü¹ ÔÖ × ÓÒ ´¾º µ¸ Ý × ÑÓ× ÕÙ Ð Ó ÒØ × Ð Ö ×ÙÐØ Ó ×ÔÐ Þ Ö i Ð Ö seg plus block pow Ú ×º ר Ñ Ò Ö ¸ Ð ÜÔÖ × ÓÒ ´¾º µ Ö ×ÙÐØ ¸ Ñ ÒØ ×ÔÐ Þ ¹ Ñ ÒØÓ׸ Ò pos in dir = i seg plus block pow ´¾º½½µ Ð Ö ×ØÓ ×Ø Ó ÔÓÖ ÐÓ× seg plus block pow Ø× Ñ ÒÓ× × Ò ¬ Ø ÚÓ× iº È Ö ÓÒÓ Ö ÐÓ× seg plus block pow Ø× Ñ ÒÓ× × Ò ¬ Ø ÚÓ× ÓÒרÖÙ ÑÓ× ÙÒ ÒÙÑ ÖÓ ÓÒ ÐÓ× seg plus block pow Ø× Ñ ÒÓ× × Ò ¬ Ø ÚÓ× Ò ÙÒÓ Ý ÐÓ× Ö ×Ø ÒØ × Ò ÖÓº Ñ Ñ ÖÓ× ÓÒר ÒØ × DynArray<T> +≡ ´ ¾µ mutable size_t mask_seg_plus_block; mask seg plus block × Ð ÙÐ Ð × Ù ÒØ ÑÓ Ó mask seg plus block = 2seg plus block pow − 1 ´¾º½¾µ Ò × Ò Ö ¸ 2seg plus block pow ÓÒØ Ò ÔÙÖÓ× ÖÓ× Ü ÔØÓ ÙÒ ÙÒÓ Ò Ð ÔÓ× ÓÒ seg plus block powº ÓÑÓ Ý seg plus block pow ÖÓ× ÒØ × ÐÐ Ö Ð ÙÒ Ó ÙÒÓ¸ Ø ÔÖÓÚÓ ÙÒ ÔÖ ×ØÓ ÕÙ × ÔÓÖ ¬Ò Ô Ó Ù Ò Ó × ÐÐ Ð Ø Ò seg plus block powº × Ô٠׸ ר ÒÙÑ ÖÓ Ø Ò ÐÓ× ÔÖ Ñ ÖÓ× seg plus block pow Ò ÙÒÓ Ý ÐÓ× Ö ×Ø ÒØ × Ò ÖÓº Ð Ö ×ØÓ Ò Ð ÜÔÖ × ÓÒ ´¾º½¼µ ÔÙ Ð ÙÐ Ö× ÓÒ ÙÒ AND ÐÓ Ó ÙÝÓ ÓÔ Ö ÓÖ Ò C++ × & Ö ×ØÓ = i AND mask seg plus block = i & mask seg plus block ´¾º½¿µ × ÓÑÙÒ ÒÓØ Ö Ð Ú Ö Ð mask seg plus block ÓÑÓ ÙÒ Ñ × Ö ÔÓÖÕÙ ÒÑ × Ö ÐÓ× Ø× Ð ÞÕÙ Ö seg plus block powº Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> ≡ ´ ¾µ size_t mask_seg; size_t mask_block; mask seg × ÒÓØ ÔÓÖ Ð × Ù ÒØ ÜÔÖ × ÓÒ mask seg = 2pow seg − 1 = seg size − 1 ; ´¾º½ µ ÄÓ ÕÙ Ô ÖÑ Ø ÙÒ Ð ÙÐÓ Ô Ö Ð ÔÓ× ÓÒ Ò Ð ÐÓÕÙ pos in seg = Ö ×ØÓ >> pow block ´¾º½ µ ÓÒ Ö ×ØÓ × ´¾º½¿µº mask block × ÒÓØ ÔÓÖ mask block = 2pow block − 1 = block size − 1 ´¾º½ µ
  • 72.
    46 Cap´ ıtulo 2. Secuencias È Ö Ð ÙÐ Ö Ð Ò ÒØÖÓ ÙÒ ÐÓÕÙ ´¾º µ¸ Ý ÕÙ Ð ÙÐ Ö Ð Ö ×ØÓ Ú Ö ÒØÖ block sizeº È Ö ÐÐÓ¸ ÙØ Ð Þ ÑÓ× Ð Ñ × Ö mask blockº ר ÓÖÑ ¸ ´¾º µ × ÔÐ ÒØ ÓÑÓ × Ù pos in block = (i & mask seg plus block) & mask block ´¾º½ µ ÓÖ ÔÓ ÑÓ× ÑÔÐ ÒØ Ö ¬ ÒØ Ñ ÒØ ÐÓ× ×Ó× Ð Ö ØÓÖ Ó¸ × Ñ ÒØÓ Ý ÐÓÕÙ ÜÔÖ × Ó׺ È Ö ÐÐÓ¸ ×Ð Ö ÑÓ× ÐÓ× Ð ÙÐÓ× Ò ÙÒ ÓÒ × × Ô Ö × ÓÒ ÒÓÑ Ö × ÕÙ Ò ÕÙ Ò Ð Ö Ñ ÒØ ÐÓ× Ð ÙÐÓ× Ò Ù ×Ø ÓÒ Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> +≡ ´ ¾µ size_t index_in_dir(const size_t & i) const { return i >> seg_plus_block_pow; } size_t modulus_from_index_in_dir(const size_t & i) const { return (i & mask_seg_plus_block); } size_t index_in_seg(const size_t & i) const { return modulus_from_index_in_dir(i) >> pow_block; } size_t index_in_block(const size_t & i) const { return modulus_from_index_in_dir(i) & mask_block; } ¬Ò × index in block¸ Ù× Ò ÙÒ × ¿¸ ¸ Ò º index in dir¸ Ù× Ò ÙÒ × ¿ß Ò º index in seg¸ Ù× Ò ÙÒ × ¿ß Ò º index in dir() Ð ÙÐ Ð Ò ÒØÖÓ Ð Ö ØÓÖ Ó Ó Ð Ò Ð ÖÖ ÐÓ i Ñ ÒØ Ð ÜÔÖ × ÓÒ ´¾º½½µº index in seg() Ð ÙÐ Ð Ò ÒØÖÓ Ð × Ñ ÒØÓ Ó Ð Ò Ð ÖÖ ¹ ÐÓ i × ÙÒ Ð ´¾º½ µº ר ÙÒ ÓÒ Ö ÕÙ Ö Ð Ú ÐÓÖ Ö ×ØÓ ÕÙ ÓÖÖ ×ÔÓÒ modulus from index in dir()) × ÙÒ ´¾º½¿µº index in block() Ð ÙÐ Ð Ò ÒØÖÓ Ð ÐÓÕÙ Ó Ð Ò i Ð ÖÖ ÐÓ × ÙÒ ´¾º½ µº ÓÑÓ Ð × ÙÒ ÓÒ × ×ÓÒ inline¸ Ð × Ù Ò ÒØ ÖÒ ÓÔ Ö ÓÒ × × ÜÔÓÒ ÓÑÔÐ ¹ Ø Ñ ÒØ Ð ÓÔØ Ñ Þ ÓÖ Ð ÓÑÔ Ð ÓÖ¸ Ð Ù Ð × Ô Þ ØÙ Ö ÑÙ × ÓÔØ Ñ Þ ÓÒ ×¸ ÔÓÖ ÑÔÐÓ¸ Ð Ñ ÑÓÖ Þ Ö Ð Ö ×ØÓ Ð Ú × ÓÒ ØÙ Ò Ð Ð ÙÐÓ Ð Ò Ð Ö ØÓÖ Óº Ñ Ñ ÖÓ× ÓÒר ÒØ × DynArray<T> +≡ ´ ¾µ mutable size_t max_dim; // 2^(pow_dir + pow_seg + pow_block) - 1 max dim ÐÑ Ò Ð Ñ Ü Ñ Ñ Ò× ÓÒ ÕÙ ÔÙ Ð ÒÞ Ö Ð ÖÖ ÐÓ × ÙÒ Ð × ÐÓÒ ¹ ØÙ × Ð Ö ØÓÖ Ó¸ × Ñ ÒØÓ Ý ÐÓÕÙ º Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> +≡ ´ ¾µ size_t current_dim; size_t num_segs; size_t num_blocks;
  • 73.
    2.1. Arreglos 47 current dim ÐÑ Ò Ð Ñ Ò× ÓÒ ØÙ к num segs Ý num blocks ÓÒØ Ð Þ Ò Ð ØÓØ Ð × Ñ ÒØÓ× Ý ÐÓÕÙ × ÕÙ Ò × Ó Ö × ÖÚ Ó׺ 2.1.5.2 Manejo de memoria Ò Ð Ñ Ò Ó Ñ ÑÓÖ × Ò ÓÒ× Ö Ö ÐÓ× × Ù ÒØ × ×Ô ØÓ× ¯ Ð Ú ÐÓÖ NULL Ò ÕÙ ÙÒ ÒØÖ Ö ØÓÖ Ó Ó × Ñ ÒØÓ ÒÓ Ø Ò Ñ ÑÓÖ Ô ÖØ º ×ØÓ ÑÔÐ ÕÙ Ù Ò Ó ÙÒ ÐÓÕÙ × Ð Ö Ó¸ Ð ÒØÖ Ò Ð Ö ØÓÖ Ó × Ö Ö ×Ø ÙÖ Ð Ú ÐÓÖ NULLº ¯ ÄÓ× × Ñ ÒØÓ× Ý ÐÓÕÙ × Ö × ÖÚ Ó× Ó Ð Ö Ó× Ò ÓÒØ Ð Þ Ö× º Ä ÒØÖ Ð Ö ØÓÖ Ó׸ × Ñ ÒØÓ Ý ÐÓÕÙ ÓÑ ÒÞ Ô ÖØ Ö Ð Ö ØÓÖ Ó¸ Ð Ù Ð × Ð Ö ÓÑÓ × Ù Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> +≡ ´ ¾µ T *** dir; dir Ö ÔÖ × ÒØ Ð ÔÙÒØ ÓÖ Ð Ö ØÓÖ Óº Ð Ñ Ò Ó Ñ ÑÓÖ × Ö Ð Þ Ñ ÒØ Ñ ØÓ Ó× ÔÖ Ú Ó× ×Ô Ð Þ Ó× ÕÙ × Ô Ö Ò ÐÓ× Ø ÐÐ × Ò ÔÙÒØÓ× ÙÒ Ó׸ × Ò ÐÐÓ× ÔÙÖ Ö Ý Ñ ÒØ Ò Ö Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> +≡ ´ ¾µ void fill_dir_to_null() { for (size_t i = 0; i < dir_size; ++i) dir[i] = NULL; } void fill_seg_to_null(T ** seg) { for (size_t i = 0; i < seg_size; ++i) seg[i] = NULL; } ¬Ò × fill dir to null¸ Ù× Ò ÙÒ º fill seg to null¸ Ù× Ò ÙÒ º fill dir to null() × ÙÖ ÕÙ ØÓ × Ð × ÒØÖ × Ð Ö ØÓÖ Ó × Ò ÒÙР׺ Ð Ú ÐÓÖ NULL Ò ÕÙ Ð ÒØÖ Ð Ö ØÓÖ Ó ÒÓ ÔÓ× ÙÒ × Ñ ÒØÓ Ö × ÖÚ Óº Ò ÐÓ Ñ ÒØ ¸ ÙÒ NULL Ò ÙÒ ÒØÖ ÙÒ × Ñ ÒØÓ Ò Ö ÕÙ Ð ÒØÖ ÒÓ ÔÓ× ÙÒ ÐÓÕÙ Ö × ÖÚ Óº fill seg to null() Ò Ð Þ ØÓ × Ð ÒØÖ × Ð × Ñ ÒØÓ ÔÙÒØ Ó ÔÓÖ seg Ð Ú ÐÓÖ NULLº fill dir to null() × ÐÐ Ñ Ù Ò Ó × Ö Ð Ö ØÓÖ Ó Ý fill seg to null() Ù Ò Ó × Ö ÙÒ ÒÙ ÚÓ × Ñ ÒØÓº Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> +≡ ´ ¾µ void allocate_dir() { dir = new T ** [dir_size]; fill_dir_to_null(); } void allocate_segment(T **& seg) ÐÚÖ Ó Ò Ð Þ Ö Ý × Ô ÖØ Ö Ð Ð Ð Ò Ù ×Ô ÒÓÐ º
  • 74.
    48 Cap´ ıtulo 2. Secuencias { seg = new T* [seg_size]; fill_seg_to_null(seg); ++num_segs; } ¬Ò × allocate dir¸ Ù× Ò ÙÒ × Ò ¾º allocate segment¸ Ù× Ò ÙÒ × ¾ ¸ ¸ Ò º Í× × fill dir to null Ò fill seg to null º allocate dir() Ö × ÖÚ Ñ ÑÓÖ Ô Ö Ð Ö ØÓÖ Ó Ý ¬ ØÓ × ×Ù× ÒØÖ × Ò NULLº allocate segment() × Ò Ð ÔÙÒØ ÖÓ seg Ð Ö ÓÒ Ñ ÑÓÖ ÙÒ ÒÙ ÚÓ × ¹ Ñ ÒØÓ ÙÝ × ÒØÖ × ×Ø Ò Ò Ð Þ × Ò NULLº Ä × ÒØÖ × Ð Ö ØÓÖ Ó Ý ÐÓ× × Ñ ÒØÓ× × ÑÔÖ Ò Ò Ð Þ Ö× Ò NULLº dir[i] == NULL Ò ÕÙ ÒÓ × Ô ÖØ Ó ÙÒ × Ñ ÒØÓ Ñ ÒØÖ × ÕÙ dir[i][j] == NULL Ò ÕÙ ÒÓ × Ô ÖØ Ó Ð ÐÓÕÙ º Ò Ð ×Ó Ò Ð Þ Ö ÙÒ ÐÓÕÙ ¸ ÑÓ× ÓÒ× Ö Ö Ð ÔÓ× Ð ÕÙ Ð Ù×Ù Ö Ó DynArray<T> ×Ô ¬ÕÙ ÙÒ Ú ÐÓÖ Ò Ðº È Ö ÐÐÓ¸ Ù Ö Ö ÑÓ× Ò ÐÓ× × Ù ÒØ × ÑÔÓ× ÙÒ Ú ÐÓÖ Ò Ð T ØÓ × Ð × ÒØÖ × ÙÒ ÐÓÕÙ Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> +≡ ´ ¾µ T default_initial_value; T * default_initial_value_ptr; default initial valueÐÑ Ò Ð Ú ÐÓÖ Ò Ð¸ Ñ ÒØÖ × ÕÙ default initial value ptr ÙÒ ÔÙÒØ ÖÓ Ð Ð ÒØ Ö ÓÖº ÈÓÖ ÓÑ × ÓÒ¸ ר ÔÙÒØ ÖÓ × NULL¸ ÑÓ Ó Ø Ð ÕÙ ¸ Ø Ñ Ò ÔÓÖ ÓÑ × ÓÒ¸ ÒÓ × Ö Ð ÙÒ Ò Ð Þ ÓÒ ÜÔÐ Ø ¸ × ÒÓ Ð ÑÔÐ Ø ×Ù Ý ÒØ Ð ÓÒ×¹ ØÖÙ ØÓÖ ÔÓÖ ÓÑ × ÓÒ T::T()º ÈÓÖ ×Ø Ö ÞÓÒ¸ ØÓ Ó× ÐÓ× ÓÒרÖÙ ØÓÖ × DynArray<T> Ò Ð Þ Ò default initial value ptr Ò NULL Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> +≡ ´ ¾µ void allocate_block(T *& block) { block = new T [block_size]; ++num_blocks; if (default_initial_value_ptr == NULL) return; for (size_t i = 0; i < block_size; ++i) block[i] = default_initial_value; } ¬Ò × allocate block¸ Ù× Ò ÙÒ × Ò º allocate block() × Ò Ð ÔÙÒØ ÖÓ block Ð Ö ÓÒ Ñ ÑÓÖ ÙÒ ÒÙ ÚÓ ÐÓÕÙ º Ë ÙÒ ÕÙ × Ý Ó ÒÓ ×Ô ¬ Ó ÙÒ Ú ÐÓÖ ÔÓÖ ÓÑ × ÓÒ¸ × Ö ÓÖÖ Ö block Ý × Ð × Ò Ö Ð Ú ÐÓÖ default initial value ÐÓ ÕÙ Ü Ð Ü ×Ø Ò Ð ÓÔ Ö ÓÖ × Ò ÓÒ T& operator = (const T&)º Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> +≡ ´ ¾µ void release_segment(T **& seg) { delete [] seg; seg = NULL;
  • 75.
    2.1. Arreglos 49 --num_segs; } void release_block(T *& block) { delete [] block; block = NULL; --num_blocks; } ¬Ò × release block¸ Ù× Ò ÙÒ × Ò º release segment¸ Ù× Ò ÙÒ × Ò º רÓ× Ñ ØÓ Ó× × Ò Ö Ò Ð Ö Ö ÓÒ× ×Ø ÒØ Ñ ÒØ ÙÒ × Ñ ÒØÓ Ó ÙÒ ÐÓÕÙ º ÇØÖ Ñ Ò Ö Ð Ö Ö ÒÚÓÐÙ Ö ÙÒ × Ñ ÒØÓ ÓÒ ØÓ Ó× ×Ù× ÐÓÕ٠׸ Ó ØÓ Ó× ÐÓ× × Ñ ÒØÓ× Ý ÐÓÕÙ × Ð ÖÖ ÐÓ Ó Ð Ö ØÓÖ Ó Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> +≡ ´ ¾µ ½ void release_blocks_and_segment(T ** & seg) { for(size_t i = 0; i < seg_size ; ++i) if (seg[i] != NULL) release_block(seg[i]); release_segment(seg); } void release_all_segments_and_blocks() { for(size_t i = 0; i < dir_size ; ++i) if (dir[i] != NULL) release_blocks_and_segment(dir[i]); current_dim = 0; } void release_dir() { release_all_segments_and_blocks(); delete [] dir; dir = NULL; current_dim = 0; } ¬Ò × release all segments and blocks¸ Ù× Ò ÙÒ º release blocks and segment¸ Ò Ú Ö Ù× º Í× × release block Ò release segment º 2.1.5.3 Especificaci´n e implantaci´n de m´todos p´ blicos o o e u Ð ÓÒרÖÙ ØÓÖ ÔÓÖ ÓÑ × ÓÒ ÔÐ ÒØ ÙÒ ×ÙØ Ð Þ Ö Ð ×Ð ÓÒ Ð Ø Ñ ÒÓ Ð ÐÓÕÙ Ñ Ñ ÖÓ× ÔÙ Ð Ó× DynArray<T> ≡ ´ ¾µ ½ DynArray(const size_t & dim = 10000) : pow_dir ( Default_Pow_Dir ), pow_seg ( Default_Pow_Seg ), Ø ÖÑ Ò ÓÒ Ð ÔÓØ Ò ¾ Ð ÐÓÕÙ ¼
  • 76.
    50 Cap´ ıtulo 2. Secuencias seg_plus_block_pow ( pow_seg + pow_block ), mask_seg_plus_block ( two_raised(seg_plus_block_pow) - 1 ), dir_size ( two_raised(pow_dir) ), seg_size ( two_raised(pow_seg) ), block_size ( two_raised(pow_block) ), max_dim ( two_raised(seg_plus_block_pow + pow_dir) ), mask_seg ( seg_size - 1 ), mask_block ( block_size - 1 ), current_dim ( 0 ), num_segs ( 0 ), num_blocks ( 0 ), default_initial_value_ptr (NULL) { allocate_dir(); } Í× × allocate dir Ò DynArray ¾º ÓÑÓ × Ú ¸ Ð ÓÒרÖÙ ØÓÖ × Ð ÓÒ ÙÒ ÐÓÒ ØÙ ÐÓÕÙ º Å ÒØÖ × Ñ × Ö Ò × ×Ø ÐÓÒ ØÙ ¸ Ñ ÒÓÖ × Ö Ð ÒØ Ö × ÖÚ ÓÒ × Ñ ÑÓÖ Ù× × ÔÓÖ Ð ÜÔ Ò× ÓÒ Ð ÖÖ ÐÓº ÍÒ Ø Ñ ÒÓ ÐÓÕÙ ÑÙÝ Ô ÕÙ ÒÓ ÑÔÐ Ö ÕÙ ÒÙ ÚÓ× ÐÓÕÙ × Ø Ò Ö Ò ÕÙ Ô ÖØ Ö× ÑÙÝ Ñ ÒÙ Óº Ò Ò ÙÖ ¸ Ð Ñ Ü Ñ Ñ Ò× ÓÒ Ð ÖÖ ÐÓ × Ö ÑÙÝ ÐÑØ º ÑÓ× ÔÖ Ú Ð Ö ÙÒ ÐÓÒ ØÙ ÐÓÕÙ Ñ × Ó Ñ ÒÓ× Ö Ò º Ò ÔÖ Ò Ô Ó¸ × × Ð ÓÒ ÙÒ Ó Ø Ú Ô ÖØ Ð Ñ Ò× ÓÒ Ò Ð ×Ô ¬ Ò Ð ÓÒרÖÙ ØÓÖº Ð ÙÒ Ó ÔÖÓ Ð Ñ Ó ÙÖÖ Ù Ò Ó Ð Ù×Ù Ö Ó ×Ù Ö ÙÒ Ñ Ò× ÓÒ Ò Ð ÑÙÝ Ô ÕÙ Ò ¸ ÐÓ ÕÙ ÖÖ Ö ÙÒ Ø Ñ ÒÓ ÐÓÕÙ ÑÙÝ Ô ÕÙ ÒÓº È Ö Ú Ø Ö ×ØÓ¸ × Ð ÓÒ ÑÓ× ÙÒ ÔÓØ Ò 2 × ÓÑÓ ÐÓÒ ØÙ Ñ Ò Ñ Ð ÐÓÕÙ º ÓÑÓ × ×Ô ¬ Ó Ò Ñ Ñ ÖÓ× ÓÒר ÒØ × DynArray<T> ¸ Ø Ð ÔÓØ Ò × Ö Ð Ú ÐÓÖ 12¸ ÕÙ Ú Ð ÒØ 4096 ÒØÖ ×¸ ÐÓ ÕÙ ÖÖÓ ÙÒ Ñ Ò× ÓÒ Ñ Ü Ñ ÔÓÖ ÓÑ × ÓÒ 24+26+212 = 222 = 4194304º Ò ÙÒ Ñ ÕÙ Ò ¿¾ Ø×¸ Max Bits Allowed = 32º ÒØÓÒ ×¸ Ö ×Ø Ö Ò 32 − 22 − 1 ÔÓØ Ò × Ó× Ñ × Ô Ö ÙÒ ÐÓÕÙ ÒØ × ÐÐ Ö Max Bits Allowedº Ä Ñ Ü Ñ ÔÓØ Ò Ó× Ð Ø Ñ ÒÓ ÙÒ ÐÓÕÙ × Ö Max Pow Block = 32 − Default Pow Dir − Default Pow Seg − 1 = 21 ´¾º½ µ ÄÓ ÕÙ ÙÒ Ñ Ü Ñ Ñ Ò× ÓÒ Ö ÓÒ Ð ÓÒ Ð ÓÒרÖÙ ØÓÖ ÔÓÖ ÓÑ × ÓÒ 2Default Pow Dir × 2Default Pow Seg × 221 = 24 × 26 × 221 = 536870912 , Ñ Ò× ÓÒ Ñ × ÕÙ ×Ù¬ ÒØ Ô Ö Ð Ñ ÝÓÖ ÐÓ× ÖÖ ÐÓ× ÕÙ ÕÙ Ô Ò Ò Ñ ÑÓÖ º Ä Ñ Ü Ñ ÔÓØ Ò Ó× Ð ÐÓÕÙ × ÐÑ Ò Ò ÙÒ ÓÒר ÒØ Ð ÙÐ × ÙÒ ´¾º½ µº × Ô٠׸ × Ö ÒØ Þ Ö ÕÙ Default Pow Block ≤ pow block ≤ Max Pow Blockº ר ÜÔÖ × ÓÒ × ØÖ Ù Ð × Ù ÒØ ÑÓ Ó ¼ Ø ÖÑ Ò ÓÒ Ð ÔÓØ Ò ¾ Ð ÐÓÕÙ ¼ ≡ ´ µ pow_block (std::min(std::max(next2Pow(dim/8), Default_Pow_Block), Max_Pow_Block) ), ר Ð ÙÐÓ ÔÖ Ñ ÖÓ Ú Ð Ñ Ò× ÓÒ ÔÖÓÔÙ ×Ø ÒØÖ Ó Ó Ý ÐÙ Ó ÐÐ Ú ×Ø Ö ×ÙÐØ Ó Ð ÔÖÓÜ Ñ ÔÓØ Ò Ó׺ ר × Ö Ð ÔÓØ Ò Ó× Ð ÐÓÕÙ Ñ ÒÓ× ÕÙ ×
  • 77.
    2.1. Arreglos 51 Ñ × Ô ÕÙ Ò ÕÙ Default Pow Block Ó Ñ × Ö Ò ÕÙ Max Pow Blockº ½ ÁÒ ÓÒ ÓÒר ÒØ × DynArray<T> ½ ≡ ´ ¾µ template <typename T> const size_t DynArray<T>::Default_Pow_Dir = 4; /* 16 */ template <typename T> const size_t DynArray<T>::Default_Pow_Seg = 6; /* 64 */ template <typename T> const size_t DynArray<T>::Default_Pow_Block = 12; /* 4096 */ template <typename T> const size_t DynArray<T>::Max_Bits_Allowed = 8 * sizeof(size_t); template <typename T> const size_t DynArray<T>::Max_Dim_Allowed = 2*1024*1024*1024ul; template <typename T> const size_t DynArray<T>::Max_Pow_Block = (Max_Bits_Allowed - Default_Pow_Dir - Default_Pow_Seg - 1); Í× × DynArray ¾º Ð Ð ÙÐÓ Ð ÔÖÓÜ Ñ ÔÓØ Ò Ó× ÙÒ ÒÙÑ ÖÓ × Ö Ð Þ Ó ÔÓÖ Ð ÙÒ ÓÒ ×Ø Ø next2Pow ½ Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> +≡ ´ ¾µ ½ static size_t next2Pow(const size_t & number) { return static_cast<size_t>(ceil(log(static_cast<float>(number))/log(2.0))); } Ð ÓÒרÖÙ ØÓÖ ÓÔ Ý Ð ÓÔ Ö ÓÖ × Ò ÓÒ Ö Ð Þ Ò ÙÒ ÓÔ Ö ÓÒ ÓÑÙÒ Ð × Ö × ÖÚ ÓÒ × Ñ ÑÓÖ Ý ÓÔ × Ð Ö ØÓÖ Ó¸ × Ñ ÒØÓ× Ý ÐÓÕÙ × Ð ÖÖ ÐÓ ×Ø ÒÓ¸ × ÔÓÖ Ð ÓÒרÖÙ ØÓÖ Ó ÔÓÖ Ð × Ò ÓÒº ÈÓÖ ÐÐÓ¸ Ò Ô×ÙÐ ÑÓ× ×Ø ÓÔ Ö ÓÒ Ò ÙÒ Ñ ØÓ Ó ÔÖ Ú Ó ÓÑÙÒ ÐÐ Ñ Ó copy array() ½ Ñ Ñ ÖÓ× ÔÙ Ð Ó× DynArray<T> +≡ ´ ¾µ ¾ void copy_array(const DynArray<T> & src_array) { for (int i = 0; i < src_array.current_dim; ++i) if (src_array.exist(i)) (*this)[i] = src_array.access(i); } Í× × DynArray ¾º copy array() Ù×Ó Ó× Ñ ØÓ Ó× ÔÙ Ð Ó× ÕÙ ÑÔÐ ÒØ Ö ÑÓ× Ñ × Ð ÒØ º src array.exist(i) Ö ØÓÖÒ true × Ð i¹ × Ñ ÒØÖ Ü ×Ø Ò src array Ð× ¸ ÐÓ ÓÒØÖ Ö Óº src array.access(i) Ö ØÓÖÒ Ð i¹ × Ñ ÒØÖ src array × Ò Ú Ö¹ ¬ Ö ÕÙ ÒØÖ Ü ×Ø × Ö¸ ÕÙ Ø Ò ÙÒ × Ñ ÒØÓ Ý ÙÒ ÐÓÕÙ Ô ÖØ ¹ Ó׺ ÆÓ Ý Ò × Ú Ö ¬ Ö ÕÙ Ý Ñ ÑÓÖ ÔÓÖÕÙ ×ØÓ Ù Ú Ö ¬ Ó ÓÒ src array.exist(i)º Ð ÓÔ Ö Ò Ó ÞÕÙ Ö Ó Ð × Ò ÓÒ¸ (*this)[i] = ... Ô ÖØ Ð × Ñ ÒØÓ Ó Ð ÐÓÕÙ × × Ö ÕÙ Ö º ÆÓØ ÑÓ× ÕÙ copy array() Ö ÓÖÖ ÔÓ× ÓÒ ÐÓ× ÖÖ ÐÓ׺ À Ý ÙÒ Ñ Ò Ö ÑÙ Ó Ñ × ¬ ÒØ ¸ Ô ÖÓ Ñ × Ð ÑÔÐ ÒØ Ö ÕÙ × Ú Ð Ð ÓÔ Ö Ø ÐÓÕ٠׺ Ä ¬ ÙÐØ ×ØÖ Ù Ò Ó ÐÓ× ÖÖ ÐÓ× Ø Ò Ò Ø Ñ ÒÓ× × Ñ ÒØÓ× Ý ÐÓ¹ ÕÙ × Ö ÒØ ׺ Ì Ð ÑÔÐ ÒØ ÓÒ × Ð Ö Óº ÓÑÓ ÝÙ ¸ × ÔÖÓÚ Ð Ñ ØÓ Ó advance block index()¸ Р٠и Ó× ÐÓ× Ò × Ð × Ñ ÒØÓ Ý Ð ÐÓÕÙ ¸ Ð ÙÐ ÐÓ× Ò × ÓÖÖ ×ÔÓÒ ÒØ × len ÐÓÕÙ × ½ Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> +≡ ´ ¾µ ½ ¾ size_t divide_by_block_size(const size_t & number) const { return number >> pow_block; }
  • 78.
    52 Cap´ ıtulo 2. Secuencias size_t modulus_by_block_size(const size_t & number) const { return number & mask_block; } void advance_block_index(size_t & block_index, size_t & seg_index, const size_t & len) const { if (block_index + len < block_size) { block_index += len; return; } seg_index += divide_by_block_size(len); block_index = modulus_by_block_size(len); } ÇØÖ ÓÖÑ ÓÔ Ö Ö Ô Ñ ÒØ Ö ÕÙ Ö × ÙÖ Ö ÕÙ Ð ÖÖ ÐÓ ×Ø ÒÓ Ø Ò Ü ¹ Ø Ñ ÒØ Ð Ñ ×Ñ ×ØÖÙ ØÙÖ ÕÙ Ð Ð Ù ÒØ × Ö¸ ÐÓ× Ø Ñ ÒÓ× Ö ØÓÖ Ó¸ × Ñ ÒØÓ Ý ÐÓÕÙ Ò × Ö ÒØ Ó׺ Ó × ÔÖ Ñ × ¸ ÔÓ ÑÓ× ÓÔ Ö ×ÓÐÓ ÕÙ ÐÐ × ÒØÖ × ÕÙ ÓÒØ Ò Ò Ñ ÑÓÖ Ð × Ù ÒØ Ñ Ò Ö ¾ Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> +≡ ´ ¾µ ½ void allocate_dir(T *** src_dir) { allocate_dir(); for (int i = 0; i < dir_size; i++) if (src_dir[i] != NULL) allocate_segment(dir[i], src_dir[i]); } Í× × allocate dir Ò allocate segment º Ð Ñ ØÓ Ó Ù×Ó Ð ÔÖ Ñ Ø Ú allocate seg() Ò ×Ù Ú Ö× ÓÒ ÓÔ ¸ Ð Ù Ð ×Ù ÚÞ Ù×Ó allocate block(seg[i], src seg[i])º ר × ÔÖ Ñ Ø Ú × ÒÓ ×Ø Ò ÑÓ×ØÖ × Ò ×Ø Ø ÜØÓ¸ Ô ÖÓ ×ÓÒ ÐÑ ÒØ ٠Р׺ Å ÒØ allocate dir() Ò ×Ù Ú Ö× ÓÒ ÓÔ ÔÓ ÑÓ× Ó Ö Ö ÙÒ ÑÓ ÐÓ ÓÔ Ñ × ¬ ÒØ º ר ÓÖÑ ÓÔ Ð ÐÐ Ñ Ö ÑÓ× copy array exactly() Ý Ð ¬Ò ÑÓ× Ó Ð × Ù ÒØ ÑÓ Ó ¾ Ñ Ñ ÖÓ× ÔÙ Ð Ó× DynArray<T> +≡ ´ ¾µ ½ ¿ void copy_array_exactly(const DynArray<T> & array) { release_dir(); // liberar toda la memoria de this pow_dir = array.pow_dir; pow_seg = array.fpow_seg; pow_block = array.pow_block; seg_plus_block_pow = array.seg_plus_block_pow; mask_seg_plus_block = array.mask_seg_plus_block; dir_size = array.dir_size; seg_size = array.seg_size; block_size = array.block_size; max_dim = array.max_dim;
  • 79.
    2.1. Arreglos 53 mask_seg = array.mask_seg; mask_block = array.mask_block; current_dim = array.current_dim; num_segs = array.num_segs; num_blocks = array.num_blocks; default_initial_value_ptr = array.default_initial_value_ptr; allocate_dir(array.dir); } Í× × allocate dir Ò DynArray ¾º Å ÒØ allocate dir() × ÔÙ ÑÔÐ ÒØ Ö ¬ ÒØ Ñ ÒØ Ð ÓÒרÖÙ ØÓÖ ÓÔ º Ä × Ò ÓÒ¸ ÔÓÖ Ð ÓÒØÖ Ö Ó¸ Ö Ð Þ Ð ÓÔ Ð Ñ ÒØÓ ÔÓÖ Ð Ñ ÒØÓ¸ ÐÓ ÕÙ ÒÓ × ÐÓ Ñ × ¬ ÒØ º Ð ×Ó ÙÒ Ð Ñ ÒØÓ ÙÒ DynArray<T> ÔÙ Ö Ð Þ Ö× Ö Ø Ñ ÒØ Ñ ÒØ ¿ Ñ Ñ ÖÓ× ÔÙ Ð Ó× DynArray<T> +≡ ´ ¾µ ¾ ¿ T & access(const size_t & i) { return dir[index_in_dir(i)][index_in_seg(i)][index_in_block(i)]; } Í× × index in block ¸ index in dir ¸ Ò index in seg º access() ÒÓ Ú Ö ¬ ÕÙ Ð Ñ ÑÓÖ Ð ÐÓÕÙ Ý ×Ù × Ñ ÒØÓ Ý × Ó Ô ÖØ º ר Ñ ØÓ Ó Ù× Ö× ×ÓÐÓ Ù Ò Ó × ×Ø ×ÓÐÙØ Ñ ÒØ × ÙÖÓ ÕÙ × × Ö ØÓ Ò Ð ÔÓ× ÓÒ ×Ó iº È Ö Ò Ö × ÙÒ ÒØÖ ÔÙ Ö× × Ò ÖÖÓÖ × Ö¸ ÕÙ ×Ø Ø Ò ×Ù ÐÓÕÙ Ý ×Ù × Ñ ÒØÓ¸ × ÔÖÓÚ ¿ Ñ Ñ ÖÓ× ÔÙ Ð Ó× DynArray<T> +≡ ´ ¾µ ¿ ¿ bool exist(const size_t & i) const { const size_t pos_in_dir = index_in_dir(i); if (dir[pos_in_dir] == NULL) return false; const size_t pos_in_seg = index_in_seg(i); if (dir[pos_in_dir][pos_in_seg] == NULL) return false; return true; } Í× × index in dir Ò index in seg º exist() Ö ØÓÖÒ true × Ð ÔÓ× ÓÒ i Ø Ò ×Ù ÐÓÕÙ Ý × Ñ ÒØÓ false¸ ÐÓ ÓÒ¹ ØÖ Ö Óº Ò ÑÙ × Ó × ÓÒ ×¸ × Ö ÕÙ Ö Ú Ö ¬ Ö Ü ×Ø Ò ÙÒ ÒØÖ Ý¸ × ×Ø Ü ×Ø ¸ ÒØÓÒ × Ö Ð Þ Ö Ð ×Óº È Ö Ú Ø Ö ÓÖÖ Ö Ð Ó Ð Ð ÙÐÓ Ò × Ò Ö ØÓÖ Ó¸ × Ñ ÒØÓ Ý ÐÓÕÙ ¸ ÔÓ ÑÓ× ÜÔÓÖØ Ö Ð ÔÖ Ñ Ø Ú × Ù ÒØ ¿ Ñ Ñ ÖÓ× ÔÙ Ð Ó× DynArray<T> +≡ ´ ¾µ ¿ T * test(const size_t & i) const { const size_t pos_in_dir = index_in_dir(i); if (dir[pos_in_dir] == NULL) return NULL;
  • 80.
    54 Cap´ ıtulo 2. Secuencias const size_t pos_in_seg = index_in_seg(i); if (dir[pos_in_dir][pos_in_seg] == NULL) return NULL; return &dir[index_in_dir(i)][index_in_seg(i)][index_in_block(i)]; } Í× × index in block ¸ index in dir ¸ Ò index in seg º ר × Ð Ñ Ò Ö Ñ × Ö Ô ÔÓ× Ð Ö ÙÒ ÒØÖ Ð ÖÖ ÐÓ Ò Ñ Óº ÆÓØ ÑÓ׸ × Ò Ñ Ö Ó¸ ÕÙ ÒÓ × Ö Ð Þ Ò Ò ÙÒ Ú Ö ¬ ÓÒº Ë Ð ÒØÖ Ü ×Ø ¸ ÒØÓÒ × test() Ö ØÓÖÒ ÙÒ ÔÙÒØ ÖÓ Ð ÒØÖ NULL ÐÓ ÓÒØÖ Ö Óº È Ö Ô ÖØ Ö ÜÔÐ Ø Ñ ÒØ Ð ÐÓÕÙ Ý × Ñ ÒØÓ ÙÒ ÔÓ× ÓÒ ÒØÖÓ Ð ÖÖ ÐÓ¸ × ÔÖÓÚ Ñ Ñ ÖÓ× ÔÙ Ð Ó× DynArray<T> +≡ ´ ¾µ ¿ T & touch(const size_t & i) { const size_t pos_in_dir = index_in_dir(i); if (dir[pos_in_dir] == NULL) allocate_segment(dir[pos_in_dir]); const size_t pos_in_seg = index_in_seg(i); if (dir[pos_in_dir][pos_in_seg] == NULL) allocate_block(dir[pos_in_dir][pos_in_seg]); if (i >= current_dim) current_dim = i + 1; return dir[pos_in_dir][pos_in_seg][index_in_block(i)]; } Í× × allocate block ¸ allocate segment ¸ index in block ¸ index in dir ¸ Ò index in seg º Ì Ñ Ò ÔÙ Ô ÖØ Ö× ØÓ Ð Ñ ÑÓÖ Ö ÕÙ Ö Ô Ö Ö ÒØ Þ Ö Ð ×Ó Ö ØÓ ÙÒ Ö Ò Ó ÔÓ× ÓÒ ×º ×ØÓ × Ö Ð Þ Ñ ÒØ Ð × Ù ÒØ Ñ ØÓ Ó Ñ Ñ ÖÓ× ÔÙ Ð Ó× DynArray<T> +≡ ´ ¾µ void reserve(const size_t & l, const size_t & r) { const size_t first_seg = index_in_dir(l); const size_t last_seg = index_in_dir(r); const size_t first_block = index_in_seg(l); const size_t last_block = index_in_seg(r); for (size_t seg_idx = first_seg; seg_idx <= last_seg; ++seg_idx) { if (dir[seg_idx] == NULL) allocate_segment(dir[seg_idx]); size_t block_idx = (seg_idx == first_seg) ? first_block : 0; const size_t final_block = (seg_idx == last_seg) ? last_block : seg_size - 1; while (block_idx <= final_block) { if (dir[seg_idx][block_idx] == NULL) allocate_block(dir[seg_idx][block_idx]); ++block_idx; } } // end for (...)
  • 81.
    2.1. Arreglos 55 if (r + 1 > current_dim) current_dim = r + 1; } Í× × allocate block ¸ allocate segment ¸ index in dir ¸ Ò index in seg º reserve() Ô ÖØ ÐÓ× ÐÓÕÙ × Ý × Ñ ÒØÓ× ÕÙ Ö Ò ÐÖ Ò Ó ÔÓ× ÓÒ × ÒØÖ l Ý rº Ð Ñ ×Ñ Ñ Ò Ö Ò ÕÙ × ÔÙ Ô ÖØ Ö Ñ ÑÓÖ Ô Ö × ÙÖ Ö ×Ó Ø Ö¹ Ñ Ò × ÔÓ× ÓÒ ×¸ Ø Ñ Ò × ÔÐ Ù× Ð Ò Ö ÕÙ × Ð Ö Ð Ñ ÑÓÖ ÙÒ Ö Ò Ó ÔÓ× ÓÒ × ÕÙ Ð Ù×Ù Ö Ó Ø ÖÑ Ò ÕÙ ÒÓ Ù× Ö Ñ ×º Ð Ñ ØÓ Ó cut() Ùר Ð Ñ Ò× ÓÒ Ð ÖÖ ÐÓ ÙÒ Ñ Ò× ÓÒ Ò Ö ÓÖ ÐÐ Ñ new dim Ý Ð Ö ØÓ Ð Ñ ÑÓÖ ÒØÖ new dim Ý Ð ÒØ Ù Ñ Ò× ÓÒ Ñ Ñ ÖÓ× ÔÙ Ð Ó× DynArray<T> +≡ ´ ¾µ void cut(const size_t & new_dim = 0) { if (new_dim == 0) { release_all_segments_and_blocks(); current_dim = 0; return; } const size_t old_dim = current_dim; // guarda antigua dimensi´n o const int idx_first_seg = index_in_dir(old_dim - 1); // ındices cotas bloques ´ const int idx_first_block = index_in_seg(old_dim - 1); const int idx_last_seg = index_in_dir(new_dim - 1); // ındices cotas segmentos ´ const int idx_last_block = index_in_seg(new_dim - 1); for (int idx_seg = index_in_dir(old_dim - 1); idx_seg >= idx_last_seg; --idx_seg) // recorre descendentemente los segmentos { if (dir[idx_seg] == NULL) // ¿hay un segmento? continue; // no ==> avance al siguiente Ä Ö Ö × Ò ÒØ Ñ ÒØ ÐÓ× ÐÓÕÙ × Ð × Ñ ÒØÓ Ä Ö Ö Ð × Ñ ÒØÓ } current_dim = new_dim; // actualiza nueva dimensi´n o } Í× × index in dir ¸ index in seg ¸ Ò release all segments and blocks º Ä Ð Ö ÓÒ ÐÓÕÙ × × Ð Ó Ð ÔÓÖÕÙ Ý ÕÙ Ñ Ò Ö ×Ó× Ô ÖØ ÙÐ Ö × Ô Ö Ð ÙÐØ ÑÓ Ý ÔÖ Ñ Ö ÐÓÕÙ º idx block ÐÐ Ú Ð Ò Ð ÐÓÕÙ Ò Ð × Ñ ÒØÓ ØÙ Ð idx segº È Ö Ð Ú ÐÓÖ Ò Ð ÒØÖÓ Ð × Ñ ÒØÓ¸ Ý Ó× ×Ó× ÔÓ× Ð × ½º Ë × ØÖ Ø Ð ÔÖ Ñ Ö × Ñ ÒØÓ¸ ÒØÓÒ × idx block ÓÑ ÒÞ Ò idx first blockº ר ×Ó Ó ÙÖÖ ÙÒ ×ÓÐ Ú Þ Ù Ò Ó idx seg == idx first segº ¾º idx block ÓÑ ÒÞ Ò block size − 1º ר × Ð ×Ó ÓÑÙÒ Ý × Ú Ö ¬ Ù Ò Ó idx seg != idx first segº Ð Ú ÐÓÖ Ò Ð × ¬Ò ¸ ÒØÓÒ ×¸ Ð × Ù ÒØ ÑÓ Ó Ä Ö Ö × Ò ÒØ Ñ ÒØ ÐÓ× ÐÓÕÙ × Ð × Ñ ÒØÓ ≡ ´ µ Ä ÒÚ Ö× ÓÒ × Ö ÔÓÖÕÙ Ð Ð Ö ÓÒ ÐÓÕÙ × × ØÙ × Ò ÒØ Ñ ÒØ º
  • 82.
    56 Cap´ ıtulo 2. Secuencias // primer bloque a liberar int idx_block = idx_seg == idx_first_seg ? idx_first_block : seg_size - 1; Ì Ñ Ò Ý Ó× ×Ó× ÔÓ× Ð × Ô Ö Ð Ú ÐÓÖ ¬Ò Ð idx block ½º Ë ÒÓ ÒÓ× Ò ÓÒØÖ ÑÓ× Ò Ð ÙÐØ ÑÓ × Ñ ÒØÓ ´idx last segµ¸ ÒØÓÒ × Ð ÙÐØ ÑÓ ÐÓÕÙ × Ö Ð Ò 0º Ä ÓÒ ÓÒ Ô Ö × Ö ¸ ÒØÓÒ ×¸ Ð × Ù ÒØ Ë ×Ø Ò ÐÓÕÙ ÙÒ × Ñ ÒØÓ Ò Ö Ð ≡ ´ µ (idx_seg > idx_last_seg and idx_block >= 0) ¾º Ë ÒÓ× Ò ÓÒØÖ ÑÓ× Ò Ð ÙÐØ ÑÓ × Ñ ÒØÓ¸ ÒØÓÒ × Ð ÙÐØ ÑÓ ÐÓÕÙ × Ö idx last blockº ר ÓÒ ÓÒ Ð Ø Ø ÑÓ× Ñ ÒØ Ð ÔÖ Ó Ë ×Ø Ò ÐÓÕÙ Ð ÙÐØ ÑÓ × Ñ ÒØÓ ≡ ´ µ (idx_seg == idx_last_seg and idx_block > idx_last_block) Ð Ù Ð ÕÙ Ð Ö × Ò ÒØ Ñ ÒØ Ð ÐÓÕÙ Ð × Ñ ÒØÓ ØÙ Ð × ¬Ò ¸ ÒØÓÒ ×¸ ÓÑÓ × Ù Ä Ö Ö × Ò ÒØ Ñ ÒØ ÐÓ× ÐÓÕÙ × Ð × Ñ ÒØÓ +≡ ´ µ // Libera descendentemente los bloques reservados del segmento while ( Ë ×Ø Ò ÐÓÕÙ ÙÒ × Ñ ÒØÓ Ò Ö Ð or Ë ×Ø Ò ÐÓÕÙ Ð ÙÐØ ÑÓ × Ñ ÒØÓ ) { if (dir[idx_seg][idx_block] != NULL) // ¿Hay un bloque aqu´? ı release_block(dir[idx_seg][idx_block]); --idx_block; } Í× × release block º Ð × Ñ ÒØÓ ×ÓÐÓ Ð Ö Ö× × ØÓ Ó× ×Ù× ÐÓÕÙ × ÐÓ Ò × Óº ×ØÓ × Ú Ö ¬ × Ö ÓÖÖ Ó ÓÑÔÐ Ø Ñ ÒØ Ð × Ñ ÒØÓ ØÙ Ð Ä Ö Ö Ð × Ñ ÒØÓ ≡ ´ µ if (idx_block < 0) release_segment(dir[idx_seg]); Í× × release segment º 2.1.5.4 Acceso mediante operador [] À ר Ð ÔÖ × ÒØ ¸ Ð × ÒØ Ö × ×Ó ÐÓ× Ð Ñ ÒØÓ× ÙÒ ÖÖ ÐÓ Ò Ñ Ó ×Ø Ò ×Ò ×ÔÖ ØÙ Ö Ð ×Ó Ò Ø ÑÔÓ ÓÒר ÒØ Ð Ñ Ò Ö Ñ × Ö Ô ÔÓ× Ð º access() ÒÓ Ú Ö ¬ × Ð Ñ ÑÓÖ × Ó Ô ÖØ ¸ Ö ÞÓÒ ÔÓÖ Ð Ù Ð Ð Ù×Ù Ö Ó ÜÔÐ Ø Ñ ÒØ Ú Ö ¬ ÖÐ ØÖ Ú × exist() Ó Ô ÖØ ÖÐ Ñ ÒØ touch() Ó reserve()º ÍÒ ÓÖÑ Ñ × × ÑÔÐ Ý ØÖ Ò×Ô Ö ÒØ Ñ Ò ÔÙÐ Ö ÙÒ ÖÖ ÐÓ Ò Ñ Ó¸ Ò ØÖ Ñ ÒØÓ ÙÒ ÔÓ Ó Ø ÑÔÓ¸ × ØÖ Ú × Ð ÓÔ Ö ÓÖ []º ÁÒ ÐÑ ÒØ ¸ Ð ÖÖ ÐÓ × ÓÒרÖÙÝ ÓÒ Ø Ò ×ÓÐÓ Ð Ö ØÓÖ Ó Ô ÖØ Óº È ÙÐ Ø Ò Ñ ÒØ ¸ Ñ ÕÙ × × Ö Ò ØÓ× Ò Ð × ÔÓ× ÓÒ ×¸ × Ô ÖØ Ò¸ Ô Ö ÞÓ× Ñ ÒØ ¸ ÐÓ× × Ñ ÒØÓ× Ý ÐÓÕÙ × ÓÖÖ ×ÔÓÒ ÒØ × Ð × ÒØÖ × ÕÙ Ò × Ó × Ö Ø ×º ר Ñ Ò Ö ¸ Ð Ñ ÑÓÖ Ó ÙÔ ÔÓÖ Ð DynArray<T> × ÔÖÓÔÓÖ ÓÒ Ð Ð × ÒØÖ × × Ö Ø × Ý ÒÓ ×Ù Ñ Ò× ÓÒº
  • 83.
    2.1. Arreglos 57 È Ö ÑÔÐ ÒØ Ö ×Ø ÙÒ ÓÒ Ð ¸ Ö ÕÙ Ö ÑÓ× ×Ø Ò Ù Ö ÐÓ× ×Ó× Ð ØÙÖ ÐÓ× × Ö ØÙÖ º È Ö ÐÐÓ¸ Ù× Ö ÑÓ× ÙÒ Ð × Ñ ÓÖ Proxy¸ Ø Ð ÓÑÓ × ÜÔÐ Ó Ò Ü ¾º½º¿ ´Ô Ò ¿ µ Ñ Ñ ÖÓ× ÔÖ Ú Ó× DynArray<T> +≡ ´ ¾µ ¾ class Proxy { Å Ñ ÖÓ× ØÓ Ð ÔÖÓÜÝ Å ØÓ Ó× Ð ÔÖÓÜÝ }; ר Ð × × Ð Ú ÐÓÖ Ö ØÓÖÒÓ Ð ÓÔ Ö ÓÖ [] Ò Ð Ð × DynArray<T> Ñ Ñ ÖÓ× ÔÙ Ð Ó× DynArray<T> +≡ ´ ¾µ Proxy operator [] (const size_t & i) { return Proxy (const_cast<DynArray<T>&>(*this), i); } Í× × DynArray ¾º Ë × ØÙ ÙÒ ×Ó Ð ØÙÖ Ù Ö Ð Ñ Ò× ÓÒ ØÙ и ÒØÓÒ × × ¹ Ò Ö std::length errorº Ë × Ö Ð Þ ÙÒ ×Ó × Ö ØÙÖ ¸ ÙÒ Ù Ö Ð Ñ Ò× ÓÒ ØÙ и ÒØÓÒ ×¸ × Ú Ö ¬ × Ü ×Ø Ò Ð ÐÓÕÙ Ý Ð × Ñ ÒØÓ × ÒÓ × Ð ×Ó¸ ÒØÓÒ × ×ØÓ× × Ô ÖØ Òº ÈÙ Ò Ö Ö× std::bad alloc × ÒÓ Ý Ñ ÑÓÖ ¸ Ó std::length error × Ð Ò i × Ñ ÝÓÖ Ó Ù Ð ÕÙ Ð Ñ Ü Ñ Ñ Ò× ÓÒº Ä Ñ Ò× ÓÒ × Ùר ÙØÓÑ Ø Ñ ÒØ × ÙÒ Ð Ñ ÝÓÖ ÔÓ× ÓÒ × Ö Ø º Ë ÙÒ ×Ó Ð ØÙÖ Ð i¹ × Ñ ÒØÖ Ø Ø ÕÙ Ð ÐÓÕÙ ÒÓ × Ó Ô ÖØ Ó¸ ÒØÓÒ × × Ò Ö Ð Ü Ô ÓÒ std::invalid argumentº Ð ×Ó Ð ØÙÖ ÙÒ ÒØÖ ÕÙ ÒÓ × Ó × Ö Ø ÒÓ × ÑÔÖ Ù× ÙÒ Ü¹ Ô ÓÒ¸ ÔÙ × Ð ÒØÖ Ý ÔÙ Ø Ò Ö ×Ù ÐÓÕÙ Ô ÖØ Ó ÑÔ ÖÓ¸ Ò ×Ø ×Ó Ð Ú ÐÓÖ Ð Ð ØÙÖ × Ò Ø ÖÑ Ò Óº Ä Ð ÓÔ Ö ÓÖ [] × Ö ØÓÖÒ Ö ÙÒ Ð × ÈÖÓÜÝ Ò ×Ô Ö ÓÒÓ Ö × Ð ×Ó × Ð ØÙÖ Ó × Ö ØÙÖ º ÄÓ× Ñ Ñ ÖÓ× ØÓ× Proxy Ñ ÒØ Ò Ò Ð Ò ÓÖÑ ÓÒ ×Ù¬ ÒØ Ô Ö Ú Ð Ö Ý ¹ ØÙ Ö Ð ×Ó Å Ñ ÖÓ× ØÓ Ð ÔÖÓÜÝ ≡ ´ µ size_t index; size_t pos_in_dir; size_t pos_in_seg; size_t pos_in_block; T **& ref_seg; T * block; DynArray & array; Í× × DynArray ¾º index × Ð Ò Ð Ð Ñ ÒØÓ ÕÙ Ð ÔÖÓÜÝ º pos in dir¸ pos in seg Ý pos in block ×ÓÒ ÐÓ× Ò × Ò Ð Ö ØÓÖ Ó¸ × Ñ ÒØÓ Ý ÐÓÕÙ ÓÖÖ ×ÔÓÒ ÒØ × indexº רÓ× Ú ÐÓÖ × × Ð ÙÐ Ò ÙÖ ÒØ Ð ÓÒרÖÙ ÓÒ Ð ÔÖÓÜݺ ref seg × ÙÒ Ö ÖÒ Ð ÒØÖ pos in dir Ð Ö ØÓÖ Óº × Ö ÙÒ Ö Ö Ò¹ ÔÓÖÕÙ ×Ø × ×Ù× ÔØ Ð ÑÓ ¬ Ö× º ר Ö Ö Ò ¸ ref seg[pos in seg] ÒÓØ Ð ÔÙÒØ ÓÖ Ð ÐÓÕÙ Ý ref seg[pos in seg][pos in block] ÒÓØ Ð Ð ¹ Ñ ÒØÓ Ð ÖÖ ÐÓ ÓÖÖ ×ÔÓÒ ÒØ Ð Ò indexº block × ÙÒ ÔÙÒØ ÓÖ Ù Ð Ó
  • 84.
    58 Cap´ ıtulo 2. Secuencias ref seg[pos in seg][pos in block]º array × ÙÒ Ö Ö Ò Ð DynArray<T> ÙØ ¹ ÐÞ Ô Ö Ó × ÖÚ Ö Ý ÑÓ ¬ Ö ×Ù ×Ø Óº Å Ñ ÖÓ× ØÓ Ð ÔÖÓÜÝ × Ò Ò Ò Ð ÓÒרÖÙ ØÓÖ Ð ÔÖÓÜÝ ÓÑÓ × Ù Å ØÓ Ó× Ð ÔÖÓÜÝ ≡ ´ µ Proxy(DynArray<T>& _array, const size_t & i) : index(i), pos_in_dir(_array.index_in_dir(index)), pos_in_seg(_array.index_in_seg(index)), pos_in_block(_array.index_in_block(index)), ref_seg(_array.dir[pos_in_dir]), block (NULL), array(_array) { if (ref_seg != NULL) block = ref_seg[pos_in_seg]; // ya existe un bloque para la entrada i } Í× × DynArray ¾¸ index in block ¸ index in dir ¸ Ò index in seg º i × Ð Ò Ð DynArray<T>array Ð Ù Ð Ð ÔÖÓÜÝ Ö Ö Ò º Ä × ÔÓ× ÓÒ × × Ð ÙÐ Ò × ÙÒ Ð × ÙÒ ÓÒ × ÙÜ Ð Ö × DynArray<T>º Ë Ð Ö Ö Ò ref seg ÓÒØ Ò ÙÒ ÔÙÒØ ÓÖ Ú Ð Ó¸ ÒØÓÒ × block × Ò Ð Þ Ô Ö ÔÙÒØ Ö Ð ÐÓÕÙ º ÆÓ × ØÙ Ò Ò ÙÒ ÓÒ Ù Ò Ó × ×ØÖÙÝ ÙÒ ÔÖÓÜݺ ÍÒ Proxy ÓÒרÖÙ Ó ×Ø Ð ×ØÓ Ô Ö Ö ÙÒ ÔÓ× ÓÒ º Ë ÙÒ Ð ÓÒØ ÜØÓ ÒÚÓ ÓÒ Ð ÓÔ Ö ÓÖ []¸ Ð ÓÑÔ Ð ÓÖ Ø ÖÑ Ò Ö × Ð ×Ó × Ð ØÙÖ Ó × Ö ØÙÖ º Ù Ò Ó Ó ÙÖÖ ÙÒ Ð ØÙÖ ¸ Ð ÓÑÔ Ð ÓÖ ÒØ ÒØ Ö ÓÒÚ ÖØ Ö Ð Proxy Ð Ø ÔÓ Ò Ö Ó Tº Ì Ð ÓÒÚ Ö× ÓÒ × ¬Ò Ð × Ù ÒØ ÑÓ Ó Å ØÓ Ó× Ð ÔÖÓÜÝ +≡ ´ µ operator T & () { return block[pos_in_block]; } block == NULL Ò ÕÙ ÒÓ Ü ×Ø ÙÒ ÐÓÕÙ Ô Ö Ð Ò indexº Ë ÒÓ Ý ÐÓÕÙ ¸ ÒØÓÒ × Ð Ð ØÙÖ × ÒÚ Ð Ý × Ò Ö Ð Ü Ô ÓÒ std::invalid argumentº ÐÓ ÓÒØÖ Ö Ó¸ × Ö ØÓÖÒ Ð Ð Ñ ÒØÓ Ö Ö Óº Ä × Ö ØÙÖ ÔÙ Ó ÙÖÖ Ö Ù Ò Ó × ØÙ ÙÒ × Ò ÓÒ¸ Ð Ù Ð × ¬Ò Ô Ö ÙÒ Proxy Ð × Ó× × Ù ÒØ × ÓÖÑ × Å ØÓ Ó× Ð ÔÖÓÜÝ +≡ ´ µ Proxy & operator = (const T & data) { Ç Ø Ò Ö Ó Ô ÖØ Ö Ð × Ñ ÒØÓ Ý Ð ÐÓÕÙ Î Ö ¬ Ö Ý ØÙ Ð Þ Ö Ð Ñ Ò× ÓÒ block[pos_in_block] = data; return *this; } Proxy & operator = (const Proxy & proxy) { if (proxy.block == NULL) // ¿operando derecho puede leer? throw std::invalid_argument("right entry has not been still written"); Ç Ø Ò Ö Ó Ô ÖØ Ö Ð × Ñ ÒØÓ Ý Ð ÐÓÕÙ Î Ö ¬ Ö Ý ØÙ Ð Þ Ö Ð Ñ Ò× ÓÒ block[pos_in_block] = proxy.block[proxy.pos_in_block]; return *this; }
  • 85.
    2.1. Arreglos 59 × Ö¸ × Ò ÓÒ Ð Ø ÔÓ Ò Ö Ó T ÙÒ ÔÖÓÜݸ ÔÓÖ ÑÔÐÓ array[i] = variable Ó × Ò ÓÒ ÔÖÓÜÝ ÔÖÓÜݸ ÔÓÖ ÑÔÐÓ array[i] = array[j]º Ò Ð ÙÐØ ÑÓ ×Ó × Ú Ö ¬ Ö ÕÙ Ð Ð ØÙÖ Ð ÓÔ Ö Ò Ó Ö Ó × Ú Ð ¸ Ù Ð × Ð × ÒØ Ó Ð ÔÖ Ñ Ö ifº Ö ×ØÓ¸ Ð × Ó× × Ò ÓÒ × ×ÓÒ ÑÙÝ × Ñ Ð Ö × Ý × Ö Ñ Ø Ò Ç Ø Ò Ö Ó Ô ÖØ Ö Ð × Ñ ÒØÓ Ý Ð ÐÓÕÙ Ò ÓÒ × × Ö Ö Ý ÐÙ Ó Î Ö ¬ Ö Ý ØÙ Ð Þ Ö Ð Ñ Ò× ÓÒ º Ä Ñ Ò× ÓÒ ØÙ Ð ×ÓÐÓ × ØÙ Ð Þ × × × Ö Ò ÙÒ ÔÓ× ÓÒ Ñ ÝÓÖ ÕÙ Ð ¹ Ñ Ò× ÓÒ ØÙ Ð Î Ö ¬ Ö Ý ØÙ Ð Þ Ö Ð Ñ Ò× ÓÒ ≡ ´ µ if (index >= array.current_dim) array.current_dim = index + 1; Ç Ø Ò Ö Ó Ô ÖØ Ö Ð × Ñ ÒØÓ Ý Ð ÐÓÕÙ Ö Ð Þ Ó× Ô ×Ó× ½º Ç Ø Ò Ö Ð × Ñ ÒØÓ Ç Ø Ò Ö Ó Ô ÖØ Ö Ð × Ñ ÒØÓ Ý Ð ÐÓÕÙ ≡ ´ µ bool seg_was_allocated_in_current_call = false; if (ref_seg == NULL) // hay segmento? { // No ==> apartarlo! array.allocate_segment(ref_seg); seg_was_allocated_in_current_call = true; } Í× × allocate segment º seg was allocated in current call Ñ ÑÓÖ Þ × × Ô ÖØ Ñ ÑÓÖ Ô Ö Ð × ¹ Ñ ÒØÓº ×ØÓ Ô ÖÑ Ø Ø ÖÑ Ò Ö × Ý ÕÙ Ð Ö Ö Ó ÒÓ Ð × Ñ ÒØÓ Ò ×Ó ÕÙ Ó ÙÖÖ ÙÒ Ü Ô ÓÒ × × Ô ÖØ Ð ÐÓÕÙ º ¾º Ç Ø Ò Ö ÐÓÕÙ Ç Ø Ò Ö Ó Ô ÖØ Ö Ð × Ñ ÒØÓ Ý Ð ÐÓÕÙ +≡ ´ µ if (block == NULL) // test if block is allocated { array.allocate_block(block); ref_seg[pos_in_seg] = block; } Í× × allocate block º Ë Ó ÙÖÖ ÙÒ ÐÐ Ñ ÑÓÖ ÙÖ ÒØ Ð Ö × ÖÚ ÓÒ Ð × Ñ ÒØÓ¸ Рܹ Ô ÓÒ std::bad alloc¸ Ò Ö ÔÓÖ new Ý Ö Ò Ö ÔÓÖ allocate segment() Ó allocate block()¸ ÔÙ Ö× × Ò ÔØÙÖ Öº Ë Ð ÐÐ Ñ ÑÓÖ Ó ÙÖÖ ÙÖ ÒØ Ð Ö × ÖÚ ÓÒ Ð ÐÓÕÙ ¸ ÒØÓÒ × Ð Ü Ô ÓÒ std::bad alloc¸ Ò Ö ÔÓÖ new¸ ÔØÙÖ Ö× Ô Ö Ú ÒØÙ ÐÑ ÒØ ÔÓ Ö Ð Ö Ö Ð Ñ ÑÓÖ Ð × Ñ ÒØÓ ÕÙ Ù Ô ÖØ ÔÓÖ Ð ÐÐ Ñ ØÙ к ר × Ð Ö ÞÓÒ ÔÓÖ Ð Ù Ð Ý ÙÒ Ñ Ò ÓÖ Ü Ô ÓÒ Ô Ö Ð Ö × ÖÚ ÓÒ Ð ÐÓÕÙ º 2.1.5.5 Uso del valor por omisi´n o À ÑÓ× Ö Ð Ó Ð Ó ÕÙ Ð Ñ ÑÓÖ ÙÒ DynArray<T> × Ô ÖØ Ô Ö ÞÓ× Ñ ÒØ Ò Ø ÑÔÓ × Ö ØÙÖ º Ì Ñ Ò ÑÓ× ×Ø Ó ÕÙ ×Ø Ö Ø Ö ×Ø Ô ÖÑ Ø ÓÖÖ Ö Ñ ÑÓÖ Ò ÔÐ ÓÒ × ÕÙ Ù× Ò ÖÖ ÐÓ× ×Ô Ö Ó׺
  • 86.
    60 Cap´ ıtulo 2. Secuencias ÉÙ ×Ù ÙÒ Ó× ÙÒ ÒØÖ ÕÙ ÒÓ × Ó × Ö Ø º È Ö ×ØÙ Ö ×Ø Ù ×Ø ÓÒ¸ ×ÙÔÓÒ ÑÓ× ÙÒ ×Ó Ð ØÙÖ ÙÒ i¹ × Ñ ÒØÖ ÒØ ר Ú ÒØÓ¸ ÔÓ ÑÓ× ÔÐ ÒØ Ö ÐÓ× × Ù ÒØ × × Ò Ö Ó× ½º Ä i¹ × Ñ ÒØÖ × Ó ÔÖ Ú Ý ÜÔÐ Ø Ñ ÒØ × Ö Ø ¸ Ò ÙÝÓ ×Ó × Ö ØÓÖÒ Ö Ð ÙÐØ ÑÓ Ú ÐÓÖ × Ö ØÓº ¾º Ä ÒØÖ ÒÓ × Ó ÔÖ Ú Ñ ÒØ × Ö Ø º Ò ×Ø × ØÙ ÓÒ ÔÙ Ò Ó ÙÖÖ Ö Ó× Ó× × ´ µ ÉÙ ÒÓ × Ý Ô ÖØ Ó ÙÒ ÐÓÕÙ Ô Ö Ð i¹ × Ñ ÒØÖ ¸ Ò ÙÝÓ ×Ó × ØÖ Ø ÙÒ ÖÖÓÖ ÔÖÓ Ö Ñ ÓÒ ´Ð ØÙÖ ÙÒ Ú ÐÓÖ ÕÙ ÒÓ × Ó × Ö ØÓµ Р٠и Ò Ð Ñ ÓÖ ÐÓ× × Ò Ö Ó׸ Ò Ö Ö ÙÒ Ü Ô ÓÒº ר × Ö Ð × ØÙ ÓÒ × Ð ×Ó × Ö Ð Þ Ñ ÒØ Ð ÓÔ Ö ÓÖ []º Ë Ð ×Ó × Ö Ð Þ Ñ ÒØ access()¸ ÒØÓÒ ×¸ ÓÒ ×Ù ÖØ ¸ Ó ÙÖÖ Ö Ð Ü Ô ÓÒ × ×Ø Ñ segmentation faultº ÈÓÖ Ð ÓÒØÖ Ö Ó¸ ÓÒ Ñ Ð ×Ù ÖØ ¸ ÒÓ Ó ÙÖÖ Ö Ò Ò ÙÒ Ü Ô ÓÒ¸ ÐÓ ÕÙ Ø Ò Ö Ó ÙÐØ Ö Ð ÖÖÓÖº ´ µ ÉÙ × × × Ý Ô ÖØ Ó Ð ÐÓÕÙ ÙÖ ÒØ Ð × Ö ØÙÖ Ð ÙÒ ÒØÖ Ò Ð Ñ ×ÑÓ ÐÓÕÙ Ð i¹ × Ñ ÒØÖ º Ò ×Ø ×Ó¸ × Ö ØÓÖÒ Ö Ð Ú ÐÓÖ ÕÙ Ý × Ö ØÓ Ð ÓÒרÖÙ ØÓÖ ÔÓÖ ÓÑ × ÓÒ T::T()º ÆÓØ ÑÓ× Ð ÔÓ× Ð ¸ ÒÓ Ø Ò Ü Ô ÓÒ Ð¸ ÕÙ ×Ø ÓÒרÖÙ ØÓÖ ÔÓÖ ÓÑ × ÓÒ ÒÓ Ö Ð Ò Ò ÙÒ × Ö ØÙÖ ¸ Ò ÙÝÓ ×Ó Ð Ú ÐÓÖ Ö ØÓÖÒÓ ÔÙ × Ö Ù ÐÕÙ Ö ¸ × ÙÒ Ð ×Ø Ó Ð ÐÓÕÙ º Ð Ì DynArray<T> ÔÙ × Ö ÙØ Ð Ô Ö ÑÓ Ð Þ Ö ÖÖ ÐÓ× ×Ô Ö Ó× ÔÓÖ Ñ¹ ÔÐÓ¸ ÙÒ Ñ ØÖ Þ ×Ô Ö ÕÙ ÓÒØ Ò ÑÙ Ó× ÖÓ׺ Ò ×Ø ×Ó ÔÓ ÑÓ× Ù× Ö ÙÒ DynArray<T> mat[n*n]º Ð ×Ó ÙÒ ÒØÖ Ð Ñ ØÖ Þ ÔÙ Ö Ð Þ Ö× Ñ ÒØ Ð ÓÔ Ö ÓÖ (i,j) Ó Ñ ÒØ Ð Ù×Ó ÙÒ Ð × ÔÖÓÜݺ ÍÒ × Ù Ó¹ ÑÔÐ ÒØ ÓÒ ×Ù Ö Ð ×Ó Ð ØÙÖ ÙÒ Ì Matriz<T> × ÓÑÓ × Ù ¼ ×Ó Ñ ØÖ Þ ¼ ≡ template <typename T> const T & Matriz<T>::operator () (const long & i, const long & j) const { const int & n = mat.size(); const long index_dynarray = i + j*n; // posici´n dentro de mat o if (not mat.exist(index)) return Zero_Value; return mat.access(index); } ÄÓ Ù Ö Ó Ò Ð ÓÒר ÒØ index dynarray × ÓÖÖ ×ÔÓÒ ÓÒ ÓÒ× Ö Ö ÙÒ Ñ ØÖ Þ ÓÑÓ ÙÒ ÖÖ ÐÓ ÖÖ ÐÓ× ½¼ º Ë Ð ÔÖ Ó not mat.exist(index) × ÖØÓ¸ ÒØÓÒ × ÒÓ Ý Ñ ÑÓÖ Ô ÖØ Ô Ö Ð ÐÓÕÙ ÕÙ ÓÒØ Ò Ö Ð ÒØÖ (i,j)¸ Ö ÞÓÒ ÔÓÖ Ð Ù Ð × Ö ØÓÖÒ ÙÒ Ú ÐÓÖ ÔÓÖ ÓÑ × ÓÒ ÒÓÑ Ò Ó Ò ×Ø ×Ó Zero Value ÐÓ ÓÒØÖ Ö Ó¸ Ö ØÓÖÒ ÑÓ× mat.access(index) ÔÙ × Ð ×Ó ×Ø Ö ÒØ Þ Ó × Ð ­Ù Ó ÐÐ × ÐÒ º ÈÙ ÔÖ × ÒØ Ö× Ð × ØÙ ÓÒ × Ö Ø Ò ¾ ¸ × Ö¸ mat.access(index) ÒÓ × Ó ÔÖ Ú Ñ ÒØ × Ö ØÓ¸ Ô ÖÓ not mat.exist(index) == trueº Ò Ú ÐÓÖ Ö ¹ ØÓÖÒÓ × Ö ¸ ÒØÓÒ ×¸ Ð ×Ô ¬ Ó ÔÓÖ T::T() Ó Ð × Ò Ó Ò ÙÒ ÐÐ Ñ set default initial value()º ½¼ Î × Ü ¾º¾ ´Ô Ò ½µº
  • 87.
    2.2. Arreglos multidimensionales 61 set default initial value() Ô ÖÑ Ø ×Ô ¬ Ö Ú Ö×Ó× Ú ÐÓÖ × Ò Ð × Ô Ö Ð Ñ ×ÑÓ Ø ÔÓ¸ ÐÓ ÕÙ × Ö ÑÙÝ ÙØ Ð Ô Ö ÑÔÓ× Ð Ö Ó× Ö ÒØ × ÕÙ Ñ Ò ÔÙÐ Ò Ð Ñ ×ÑÓ Ø ÔÓ ÓÔ Ö Ò Ó Ð × Ñ ØÖ × Ý Ò Ò ÐÓ× Ö Ó׸ ÔÓÖ ÑÔÐÓº 2.2 Arreglos multidimensionales Ò ÙÒ ÑÙÝ ÖØ Ñ ¸ ÐÓ× ÖÖ ÐÓ× ×ÓÒ Ö Ñ Ò × ÒØ × ÐÓ× Ú ØÓÖ × Ð Ñ Ø Ñ Ø º Ò ×Ø × ÒØ Ó¸ × ÔÓ× Ð Ö ÔÖ × ÒØ Ö ÙÒ Ñ ØÖ Þ n× m Ñ ÒØ ÙÒ ÖÖ ÐÓ n ÖÖ ¹ ÐÓ× Ñ Ò× ÓÒ m × Ö¸ ÙÒ × Ù Ò × Ù Ò ×º Ò C++ ÙÒ Ñ ØÖ Þ ×Ø Ø ÔÓ × Ð Ö Ð × Ù ÒØ ÑÓ Ó T matriz[n][m]; Ð Ð Ò Ù ÑÔÐ ÒØ Ð ×Ó ÙÒ ÒØÖ Ð Ñ ØÖ Þ Ñ ÒØ ÓÑ Ò ÓÒ × Ð ÓÔ Ö ÓÖ []º ÈÓÖ ÑÔÐÓ¸ Ð ÜÔÖ × ÓÒ matriz[i][j] = dato; × Ò dato Ð j¹ × ÑÓ Ð Ñ ÒØÓ Ð i¹ × Ñ ¬Ð º Ð ÓÑÔ Ð ÓÖ Ò Ö ÙØÓÑ Ø Ñ ÒØ Ð Ð ÙÐÓ Ð Ö ÓÒ ×Ó¸ Ð Ù Ð × ÔÙ ÒÙÒ Ö Ð × Ù ÒØ ÓÖÑ Ö ÓÒ Ð Ð Ñ ÒØÓ = base + i × m × sizeof(T) + j × sizeof(T) ´¾º½ µ ÒÐ Ð Ö ÓÒ ÒØ Ö ÓÖ¸ Ð ÓÑÔ Ð ÓÖ Ù× Ö ÙÒ ×Ô Ó ÓÒØ ÙÓ ÐÓ ×Ù¬ ÒØ ¹ Ñ ÒØ Ö Ò Ô Ö Ð Ö Ö ÐÓ× n × m Ð Ñ ÒØÓ× Ð Ñ ØÖ Þº ÓÒ ÓÖÑ ÙÑ ÒØ Ò n Ý m¸ ×Ñ ÒÙÝ Ð ÔÓ× Ð Ò ÓÒØÖ Ö Ø Ð ×Ô Óº ÈÓÖ ÓØÖ Ô ÖØ ¸ Ò C++ Ð Ñ ØÖ Þ ÒØ Ö ÓÖ × ×Ø Ø Ò Ð × ÒØ Ó ÕÙ ÒÓ × ÔÓ× Ð Ñ Ö ×Ù Ñ Ò× ÓÒº Ð Ð ÙÐÓ ´¾º½ µ Ò Ö Ó ÔÓÖ Ð ÓÑÔ Ð ÓÖ ×ÙÑ ÕÙ n Ý m Ô ÖÑ Ò Ò ÓÒר ÒØ × ÙÖ ÒØ Ð Ú Ð Ñ ØÖ Þº Ë Ò ×ØÓ ÒÓ × Ø Ò ÔÖÓ Ð Ñ Ø Ó¸ ÔÙ × × ÔÓ Ö Ò Ö Ö Ó Ó Ô Ö n Ý m Ú Ö Ð ×¸ ÙÒ Ñ Ó Ò Ð ÙÒ Ð × Ñ Ò× ÓÒ × ÓÐ ×ÔÐ Þ Ö Ð Ñ ÝÓÖ ÐÓ× Ð Ñ ÒØÓ׺ ÈÓÖ Ð × Ö ÞÓÒ × ÒØ Ö ÓÖ ×¸ × ÔÖ Ö Ð ØÖ Ø Ö ÜÔÐ Ø Ñ ÒØ ÙÒ ÖÖ ÐÓ ÑÙÐØ Ñ Ò¹ × ÓÒ Ð ÓÑÓ ÐÓ ÕÙ × ÙÒ × Ù Ò × Ù Ò ×º Ó ×Ø Ô Ö×Ô Ø Ú ¸ ÙÒ Ñ ØÖ Þ n × m ÔÙ Ð Ö Ö× ÓÑÓ × Ù T ** matriz = new T * [n]; // Aparta un arreglo de punteros a filas for (int i = 0; i < n; ++i) matriz[i] = new T [m]; // aparta la fila matriz[i] ר ×ÕÙ Ñ × ÒØÖ Ñ × Ò Ñ Ó ÕÙ Ð ÒØ Ö ÓÖº Ë × Ñ Ð ÒÙÑ ÖÓ ¬Ð × n¸ ÒØÓÒ × ×ÓÐÓ × Ò × Ö Ó Ö ÐÓ Ð Þ Ö Ð ÖÖ ÐÓ matrizº Ë ¸ ÔÓÖ Ð ÓÒØÖ Ö Ó¸ × ÑÓ ¬ Ð ÒÙÑ ÖÓ ÓÐÙÑÒ ×¸ ÒØÓÒ × Ý ÕÙ Ö ÐÓ Ð Þ Ö ¬Ð matriz[i]º ÒC ++¸ × ÓÑÓ Ò Ð Ñ ÝÓÖ ÐÓ× Ð Ò Ù ×¸ ÙÒ Ñ ØÖ Þ × ÓÒ× Ö ÓÑÓ ÙÒ ÖÖ ÐÓ n ¬Ð × Ø Ñ ÒÓ mº Ë Ò Ñ Ö Ó¸ Ø Ñ Ò ÔÙ ÒØ ÖÔÖ Ø Ö× Ð Ö Ú × × Ö¸ ÓÑÓ ÙÒ ÖÖ ÐÓ m ÓÐÙÑÒ × Ø Ñ ÒÓ nº ר × Ð ×Ó Ð Ð Ò Ù ÔÖÓ Ö Ñ ÓÒ ÓÖØÖ Ò¸ ÒØ Ò× Ú Ñ ÒØ Ù× Ó Ô Ö Ð ÙÐÓ× ÒÙÑ Ö Ó׺ ÙÒÕÙ × ÙØ Ð ¸ Ð ×ÔÓ× ÓÒ ×Ô Ð Ð × Ñ ØÖ × Ò ÓÖØÖ Ò ÒÓ × ÙÒ ÔÖ Óº ËÙ ÕÙ ÑÙ × ÓÔ Ö ÓÒ × Ñ Ø Ñ Ø × ×Ó Ö Ñ ØÖ × Ü Ò ÙÒ Ô ØÖÓÒ ×Ó ÕÙ ÚÓÖ Ð × Ù Ò Ð Þ ÓÒ ÔÓÖ ÓÐÙÑÒ × Ò ÐÙ Ö ÔÓÖ ¬Ð ׺
  • 88.
    62 Cap´ ıtulo 2. Secuencias Ù ÒØ Ð ÔÓÔÙÐ Ö Ð ÓÖØÖ Ò¸ ÐÓ× ÔÖÓ Ö Ñ ÓÖ × C Ý C++ Ò ÓÒ¹ × Ö Ö Ú Ö ÒØ × Ô Ö ÐÓ× ÖÖ ÐÓ× Ù × Ð ÓÖØÖ Ò¸ ÔÙ × × ×Ø ÒØ Ø Ð ÙØ Ð Þ Ö Ð ÓØ × × Ö Ø × Ò ÓÖØÖ Ò Ý Ú Ú Ö× º 2.3 Iteradores Ò ÔÖÓ Ö Ñ ÓÒ¸ Ò ÕÙ Ð ¬Ò Ù ÒØ × ÒÓ ÕÙ Ò × ÒÓ × Ù Ò ×º Ù ÐÕÙ Ö × Ð ×ØÖÙ ØÙÖ ØÓ׸ Ð ÕÙ ÔÖÓ × Ñ ÒØÓ × ÑÔÖ × Ö Ñ Ø × Ù Ò ×º Ð Ô ØÖÓÒ × Ø Ò Ö Ù ÒØ ÕÙ Ñ Ö ÙÒ Ô ØÖÓÒ Ò Ö Ó ÒÓÑ Ò Ó Iterator<Set, T> Ý ×Ô ¬ Ó Ò Ð Ö Ñ ÍÅÄ Ð ¬ ÙÖ ¾º¾º Set<Type>:template T:class Iterator +Set_Type +Item_Type +Iterator(in ct:Set<T>) +Iterator(in it:Iterator) +Iterator() +operator =(in ct:Set<T>) +operator =(in it:Iterator) +next(): void +prev(): void +has_current(): bool +is_in_first(): bool +is_in_last(): bool +current(): T +reset_first(): void +reset_last(): void +del(): void +insert(in item:T): void +append(in item:T): void +set(in item:T): void +position(): int ÙÖ ¾º¾ Ö Ñ ÍÅÄ Ð Ð× ÒÖ Iterator<Set, T> Ä Ð × Iterator<Set, T> Ö Ó× Ø ÔÓ× Ô Ö Ñ ØÖ Þ Ó× Set<T> Ð Ø ÔÓ ÜÔÐ Ó Ò Ü ½º¿ ´Ô Ò ½ µ Ý Tº ËÙ ¬Ò × Ð Ø Ö Ð ÔÖÓ × Ñ ÒØÓ × Ù Ò Ð Ð Ñ ÒØÓ× Ò ÙÒ ÓÒ ÙÒØÓ Set<T>º È Ö Ù× Ö ÙÒ Ø Ö ÓÖ × Ö ÕÙ Ö ÙÒ ÓÒ ÙÒØÓ Ó ÓÒØ Ò ÓÖ Set<T>º À Ý Ó× ÓÖÑ × Òר Ò ÖÐÓ Ñ ÒØ Ð ÓÒרÖÙ ØÓÖ ÕÙ Ö Ð ÓÒ ÙÒØÓ Ó Ñ ÒØ Ð ÓÒרÖÙ ØÓÖ ÓÔ º Ò Ð ÔÖ Ñ ÖÓ¸ Ð Ø Ö ÓÖ × ÔÓ× ÓÒ Ò Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ Ð × Ù Ò ¸ Ñ ÒØÖ × ÕÙ Ò Ð × ÙÒ Ó Ò Ð Ð Ñ ÒØÓ ØÙ Ð Ð Ø Ö ÓÖ Ù ÒØ Ð ÓÔ º È ØÓÖ Ñ ÒØ ¸ ÙÒ ÓÒ ÙÒØÓ ÔÙ ÒØ ÖÔÖ Ø Ö× ÓÑÓ Ð × Ù ÒØ × Ù Ò ÒÖ n Ð Ñ ÒØÓ× Ð ÙÒ Ø ÔÓ Ò Ö Ó T
  • 89.
    2.3. Iteradores 63 e0 e1 e2 ... ei ei+1 ... en−2 en−1 en ÙÖ ¾º¿ Ê ÔÖ × ÒØ ÓÒ Ô ØÓÖ ÙÒ ÒØ Ö ÓÖ ×Ó Ö ÙÒ × Ù Ò Ù Ò Ó × Òר Ò ÙÒ Ø Ö ÓÖ ÓÒ ÙÒ ÓÒØ Ò ÓÖ Set<T>¸ ר ÕÙ ÔÓ× ÓÒ Ó Ò Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ Ð × Ù Ò × Ò Ó Ò Ð Ù Ó ÓÑÓ e0º Ð Ð Ñ ÒØÓ × Ò Ó ÓÑÓ en ÒÓ Ü ×Ø Ò Ð × Ù Ò ¸ Ô ÖÓ ×Ø ÐÓ Ñ ÒØ ¹ ÒÓØ ÕÙ Ð Ø Ö ÓÖ ×Ø × ÓÖ Ó Ó Ù Ö Ö Ò Ó º Ä ÔÖ Ñ Ø Ú has current() Ö ØÓÖÒ false × Ð Ø Ö ÓÖ × Ò Ù ÒØÖ ÔÓ× ÓÒ Ó Ò Ð Ð Ñ ÒØÓ ¬ Ø Ó en true ÐÓ ÓÒØÖ Ö Óº Ò Ð ÙÒ × × ØÙ ÓÒ × ÔÙ ÓÒÚ Ò Ö × Ö × Ð Ø Ö ÓÖ ×Ø ÔÓ× ÓÒ Ó Ò Ð ÔÖ Ñ Ö Ó ÙÐØ ÑÓ Ð Ñ ÒØÓº Ë Ð Ø Ö ÓÖ × Ò ÓÒØÖ × Ò Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ¸ ÒØÓÒ × is in first() Ö ØÓÖÒ Ö true Ð Ñ ×Ñ × Ñ ÒØ × ÔÐ Ö ÓÒ is in last() × Ð Ø Ö ÓÖ × Ò ÓÒØÖ × Ò Ð ÙÐØ ÑÓ Ð Ñ ÒØÓº Ð Ð Ñ ÒØÓ ØÙ Ð Ð Ø Ö ÓÖ × ÓÒ×ÙÐØ Ñ ÒØ Ð Ñ ØÓ Ó get current()º Ò Ð ×Ó Ò Ö Ð¸ × ÙÒ Ð ÑÔÐ ÒØ ÓÒ Set<T>¸ Ð Ø Ö ÓÖ Ò Ö Ð Ü¹ Ô ÓÒ std::overflow error × × ÒØ ÒØ Ö ÙÒ Ø Ö ÓÖ × ÓÖ Óº È Ö × ÐÚ Ù Ö Ö Ð ×Ø Ó ÙÒ Ø Ö ÓÖ ÔÙ Ò ÓÒרÖÙ Ö× Ø Ö ÓÖ × × Ò ÕÙ × ÔÖÓÔÓÖ ÓÒ Ð ÓÒ ÙÒØÓº Ç Ú Ñ ÒØ ¸ ÙÒ Ø Ö ÓÖ × Ò ÓÒ ÙÒØÓ ÒÓ × Ú Ð Ó ×Ø ÕÙ ×Ø ÒÓ × ¬Ò Ñ ÒØ Ð ÙÒ Ð × Ó× Ú Ö× ÓÒ × Ð ÓÔ Ö ÓÖ × Ò ÓÒº È Ö Ú ÒÞ Ö Ð Ø Ö ÓÖ Ð Ö Ó Ð ÒØ × ÙØ Ð Ñ ØÓ Ó next()º Ò ÐÓ Ñ ÒØ ¸ Ô Ö Ö ØÖÓ ÖÐÓ Ð ÞÕÙ Ö Ó ¹ ØÖ × × ÙØ prev()º Ù ÐÕÙ Ö ×ØÓ× Ñ ØÓ Ó× ÔÙ Ò Ö Ö Ð × Ü Ô¹ ÓÒ × std::overflow error Ó std::underflow error × Ð Ø Ö ÓÖ ×Ø × ÓÖ Óº Ò ALEPH¸ × ÓÑÓ Ò ÓØÖÓ× Ñ ØÓ׸ ÙÒ ÓÒ ÙÒØÓ ÓÒØ Ò ×Ù Ð × Iteratorº × Ö¸ Iterator × ÙÒ ×Ù Ð × Ð ×Ô Ð Þ ÓÒ Set<T, Compare>º Ð × Ù ÒØ Ó Ó ÐÙ×ØÖ ÙÒ Ù×ÕÙ Ò Ö Ò ÙÒ ÓÒ ÙÒØÓ Ñ ÒØ ÙÒ Ø Ö ÓÖ template <template <class> class Set, typename T, class Compare> T * search(Set<T> & set, const T & item) { for (typename Set<T>::Iterator it(set); it.has_current(); it.next()) if (are_equals<T, Compare>() (it.get_current(), item)) return &it.get_current(); return NULL; } Ú × ÙÒ Ø Ö ÓÖ ÔÙ Ö Ù× Ö× º È Ö ÐÐÓ¸ × ÔÓ× Ð Ö Ò ÖÐÓ Ô Ö ÕÙ ×Ø ÔÙÒØ Ð ÔÖ Ñ Ö Ó ÙÐØ ÑÓ Ð Ñ ÒØÓ Ð ÓÒ ÙÒØÓº reset first() Ö Ò Ð Ø Ö ÓÖ Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ¸ Ñ ÒØÖ × ÕÙ reset last() ÐÓ Ö Ò Ð ÙÐØ ÑÓ ´ Ò Ó ÓÒ en−1 Ò Ð ¬ ÙÖ Ü ¾º¿µº Ä × ÓÔ Ö ÓÒ × ÕÙ × Ù Ò ×ÓÒ Ô Ò ÒØ × Ð ×ØÖÙ ØÙÖ ØÓ× ÓÒ ÕÙ × ÑÔÐ ÒØ Ð ÓÒ ÙÒØÓº Ð Ñ ØÓ Ó del() Ð Ñ Ò Ð ÓÒ ÙÒØÓ Ð Ð Ñ ÒØÓ ØÙ Ð Ý Ú ÒÞ Ð Ø Ö ÓÖ ÙÒ ÔÓ× ÓÒ Ð ÒØ º Ø Ò Ö× ×Ô Ð Ù Ó Ù Ò Ó × ÒØ Ö Ð Ò next() Ý del() Ò ÙÒ Ñ ×Ñ Ø Ö ÓÒº
  • 90.
    64 Cap´ ıtulo 2. Secuencias Ð Ñ ØÓ Ó insert() Ò× ÖØ ÙÒ ÒÙ ÚÓ Ð Ñ ÒØÓ Ò Ð × Ù Ò Ð Ö Ð Ð Ñ ÒØÓ ØÙ Ð Ð Ø Ö ÓÖ × Ò Ú ÒÞ Öº Ò ÐÓ Ñ ÒØ ¸ Ð Ñ ØÓ Ó append() Ò× ÖØ Ð ÞÕÙ Ö º Ä ÔÖ Ñ Ø Ú set() ÔÓ× ÓÒ ÙÒ Ø Ö ÓÖ Ò Ð Ð Ñ ÒØÓ item Ô ÖØ Ò ÒØ Ð ÓÒ ÙÒØÓº ÈÓÖ ÐÓ Ò Ö Ð¸ ÒÓ × Ú Ð × item Ò ØÓ × Ô ÖØ Ð ÓÒ ÙÒØÓº position() Ö ØÓÖÒ Ð ÔÓ× ÓÒ Ð Ð Ñ ÒØÓ ØÙ Ð ÒØÖÓ Ð × ÙÒ º Ë ÙÒ Ð ÑÔÐ ÒØ ÓÒ Set<T> Ð Ø Ö ÓÖ ÔÙ ÒÖ ÕÙ Ö× ÓÒ ÓØÖ × ÔÖ Ñ Ø Ú ×º ÈÓ× Ð Ñ ÒØ Ð Ñ × ÑÔÓÖØ ÒØ ÐÐ × × Ð ÓÔ Ö ÓÖ ×Ó []¸ Ð Ù Ð Ö ØÓÖÒ ÙÒ Ð Ñ ÒØÓ Ð ÓÒ ÙÒØÓ × ÙÒ ×Ù ÔÓ× ÓÒ ÒØÖÓ Ð × Ù Ò º ÄÓ× Ø Ö ÓÖ × ÔÙ Ò Ù× Ö× Ò Ö Ñ ÒØ × Ö¸ ÔÙ Ò Ö ÔÖÓ Ö Ñ × ÕÙ Ö Ò Ø Ö ÓÖ × × Ò Ø Ò Ö ÓÒÓ Ñ ÒØÓ Ð Ø ÔÓ ÓÒ ÙÒØÓ ×Ó Ö Ð Ù Ð Ø Ö Òº È Ö ×Ø × × ØÙ ÓÒ ×¸ ÔÙ × Ö × Ð Ø Ò Ö Ð Ø ÔÓ Ð ÓÒ ÙÒØÓ Ý Ð ×Ù× Ð Ñ ÒØÓ׺ È Ö ÐÐÓ¸ × ÜÔÓÖØ Ò ÐÓ× × ÒÓÒ ÑÓ× Ø ÔÓ Set Type Ý Item Type¸ Ö ×Ô Ø Ú Ñ ÒØ º Set Type ÔÖÓÔÓÖ ÓÒ Ð Ø ÔÓ ÓÒ ÙÒØÓ ÓÒ ÕÙ ÒÓÖÑ ÐÑ ÒØ × ÓÒרÖÙÝ Ð Ø Ö ÓÖ¸ Ñ ÒØÖ × ÕÙ Item Type Ð Ø ÔÓ ÕÙ Ö ØÓÖÒ get current())º 2.4 Listas Enlazadas ÍÒ Ð ×Ø × ÙÒ × Ù Ò ÐÓÒ ØÙ Ú Ö Ð < t1, t2, t3, . . . , tn > n Ð Ñ ÒØÓ× Ð ÙÒ Ø ÔÓ T ÓÒ Ð × × Ù ÒØ × ÔÖÓÔ × Restricci´n de acceso: o ½º Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ¸ t1¸ × Ö Ø Ñ ÒØ Ò Ø ÑÔÓ ÓÒר ÒØ º ¾º È Ö Ö Ð Ð Ñ ÒØÓ Ti¸ × Ò × Ö Ó Ö × Ù Ò ÐÑ ÒØ ÐÓ× i − 1 ÔÖ Ú Ó× Ð Ñ ÒØÓ× < t1, t2, t3, . . . , ti−1 >º ר Ö ×ØÖ ÓÒ × ÑÔÓÒ ×Ó Ö ØÓ × Ð × ÓÔ Ö ÓÒ × ÕÙ Ö ÕÙ Ö Ò Ö Ù ÐÕÙ Ö ÔÓ× ÓÒ Ð × Ù Ò º Ò ÓÒ× Ù Ò ¸ Ð Ø ÑÔÓ Ù ÓÒ Ò Ð ×Ó¸ Ò× Ö ÓÒ Ý Ð Ñ Ò ÓÒ × Ô Ò ÒØ Ð ÔÓ× ÓÒ ÒØÖÓ Ð Ð ×Ø º Flexibilidad: Ë × ÓÒÓ Ð Ö ÓÒ ÙÒ Ð Ñ ÒØÓ ti ÒØÖÓ Ð × ÙÒ < t1, t2, . . . , ti, ti+1, . . . , tn >¸ ÒØÓÒ × ½º ÔÙ ti+1 Ð Ñ Ò Ö× Ò Ø ÑÔÓ ÓÒר ÒØ º Ð ×Ø Ó ×ÔÙ × ×Ø Ð Ñ ¹ Ò ÓÒ × < t1, t2, . . . , ti, . . . , tn >º ¾º ÍÒ Ð Ñ ÒØÓ Ù ÐÕÙ Ö tj ÔÙ Ò× ÖØ Ö× ×ÔÙ × ti Ò Ø ÑÔÓ ÓÒר ÒØ º Ð ×Ø Ó ¬Ò Ð ×ÔÙ × Ð Ò× Ö ÓÒ × < t1, t2, . . . , ti−1, ti, tj, ti+1, . . . , tn > Espacio proporcional al tama˜o: n Ð ×Ô Ó Ó ÙÔ Ó ÔÓÖ ÐÓ× Ð Ñ ÒØÓ× Ð Ð ×Ø × ÑÔÖ × ÔÖÓÔÓÖ ÓÒ Ð Ð ÒÙÑ ÖÓ Ð Ñ ÒØÓ× × Ö¸ ÔÙ ÜÔÖ × Ö× ÓÑÓ ÙÒ ÙÒ ÓÒ f(n) = k × nº Ä × Ð ×Ø × ×ÓÒ ÓÒ × Ô Ö ÔÐ ÓÒ × ÓÒ¸ Ó Ð ÙÒ × ¸ Ð × × Ù ÒØ × Ö Ø Ö ×Ø × ¯ Ë Ö ÕÙ Ö Ò Ú Ö Ó× ÓÒ ÙÒØÓ× ´ÕÙ Þ ÑÙ Ó×µ Ý ×Ù ÒØ × Ú Ö Ð ÐÓ Ð Ö Ó Ð ÔÐ ÓÒº
  • 91.
    2.4. Listas Enlazadas 65 ¯ Ä× Ö ÒÐ × ÐÓ× ÓÒ ÙÒØÓ× ×ÓÒ × ÓÒÓ × Ý ÑÙÝ Ú Ö Ð × Ò Ð Ø ÑÔÓ Ú Ð ÔÐ ÓÒº ¯ Ð ÔÖÓ × Ñ ÒØÓ × × Ù Ò Ð × Ö¸ Ð ÔÖÓ × Ñ ÒØÓ Ð i¹ × ÑÓ Ð Ñ ÒØÓ × Ö Ð Þ ×ÔÙ × ÔÖÓ × Ö ÐÓ× (i − 1) Ð Ñ ÒØÓ× ÔÖ Ú Ó׺ Ä ×Ø × ÓÒ Ð × Ö Ø Ö ×Ø × × Ò Ð × ÓÖÑ Ò Ô ÖØ ÐÓ× Ð Ò Ù × ÔÖÓ Ö Ñ ÓÒ ÙÒ ÓÒ Ð ×¸ LISP¸ ML¸ CAML¸ ÔÓÖ ÑÔÐÓ× Ý ÐÓ× ÑÓ ÖÒÓ× Ý ÔÓØ ÒØ × Ð Ò Ù × × Ö ÔØ Ò Ò Ð × Ó ÙÖÖ Ò × Ñ × ÔÓÔÙÐ Ö ×¸ perl Ý pythonº Ä Ò Ù × Ñ ÒÓ Ò Ú Ð¸ Ø Ð × ÓÑÓ Pascal¸ C Ó C++¸ ÒÓ ÔÓ× Ò Ð ×Ø × ÓÑÓ Ô ÖØ Ð Ð Ò Ù ¸ Ö ÞÓÒ ÔÓÖ Ð Ù Ð × ÓÒÚ Ò ÒØ ÑÔÐ ÒØ ÖÐ × Ò Ö Ð Ý Ò Ö Ñ ÒØ Ò Ð ÓØ º Ð × Ð ×Ø × × Ð × Ø Ð ÒÐ Þ × ÔÓÖÕÙ ¸ ÖÒ Ð ÖÖ ÐÓ¸ Ð Ñ ÒØÓ Ð × Ù Ò Ö × Ò ÙÒ Ö ÓÒ Ñ ÑÓÖ ÕÙ ÒÓ × ÓÒØ Ù º È Ö ÓÒÓ Ö Ù Ð × Ð × Ù ÒØ Ð Ñ ÒØÓ Ð × Ù Ò ¸ × Ò × Ö Ó ÙÒ ÒÐ Ð ÐÓÕÙ Ñ ÑÓÖ ÕÙ ÐÓ Ð Ö º Ä ¬ ÙÖ ¾º ÑÙ ×ØÖ Ð Ð × Ö ÔÖ × ÒØ ÓÒ Ô ØÓÖ ÙÒ Ð ×Ø × Ñ¹ ÔÐ Ñ ÒØ ÒÐ Þ ÙÝÓ× Ð Ñ ÒØÓ× ×ÓÒ Ð × Ð ØÖ × × Ð ×Ø Ð º head A B C D E ÙÖ ¾º ÍÒ Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ Ð Ñ ÒØÓ Ð × Ù Ò × Ö ÔÖ × ÒØ Ñ ÒØ ÙÒ Ú Ò Ó× ÑÔÓ× Ð Ð Ñ ÒØÓ Ð × Ù Ò Ý Ð ÔÙÒØ ÓÖ Ð ÔÖÓÜ Ñ º ÍÒ × ÒÓÑ Ò ÒÓ Ó º Ð ÔÙÒØÓ ÒØÖ ÙÒ Ð ×Ø × Ð Ö ÓÒ Ð ÔÖ Ñ Ö ÒÓ Ó¸ ÒÓÑ Ò Ó head Ò Ð ¬ ÙÖ ¾º º Ò C Ó C++¸ ÙÒ ÒÓ Ó ÔÙ ×Ô ¬ Ö× ÓÑÓ × Ù ¬Ò ÓÒ ÒÓ Ó × ÑÔÐ ≡ struct Node { char data; Node * next; }; ר × Ð Ø Ô Ð Ö ÓÒ ÙÒ ÒÓ Ó Ô ÖØ Ò ÒØ ÙÒ Ð ×Ø ÒÐ Þ º data ÐÑ Ò Ð Ð ØÖ Ý next × Ð ÔÙÒØ ÖÓ Ð ÔÖÓÜ ÑÓ Ð Ñ ÒØÓº ÈÙ ×ØÓ ÕÙ ÙÒ Node × Ö ¬ Ö × Ñ ×ÑÓ ØÖ Ú × next¸ Ð × Ð ×Ø × ÒÐ Þ × Ò × Ó Ð × ¬ × ×ØÖÙ ØÙÖ × Ö ÙÖÖ ÒØ × º Ä Ð ×Ø Ð ¬ ÙÖ ¾º × Ø ÓÖ Þ ÓÑÓ × ÑÔÐ Ñ ÒØ ÒÐ Þ ÔÓÖÕÙ ×Ù× ÒÓ Ó× ÔÓ× Ò ÙÒ ×ÓÐÓ ÒÐ Ð × Ù ÒØ ÒÓ Ó Ò Ð × Ù Ò º Ò ØÖ Ñ ÒØÓ ÙÒ ÔÓÕÙ ØÓ Ñ × Ñ ÑÓÖ ¸ × ÔÓ× Ð ÙØ Ð Þ Ö ÙÒ ÒÐ ÓÒ Ð Ð Ð Ñ ÒØÓ ÔÖ ×ÓÖº Ò ×Ø ×Ó Ð Ð ×Ø × Ø ÓÖ Þ ÓÑÓ Ó Ð Ñ ÒØ ÒÐ Þ Ý × Ö ÔÖ × ÒØ Ô ØÓÖ Ñ ÒØ ÓÑÓ Ò Ð ¬ ÙÖ ¾º º ØÓ× Ñ Ò Ö Ð ÓØÖÓ ÜØÖ ÑÓ¸ × Ö ÕÙ Ö ÙÒ ÔÙÒØ ÖÓ ÓÒ Ð Ð ÙÐØ ÑÓ Ð Ñ ÒØÓ Ð Ð ×Ø º Ð Ó×ØÓ Ò ×Ô Ó ÙÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ × Ö ÓÑÔ Ò× ÓÒ Ö × ÓÒ ×Ù Ú Ö× Ø Ð º Ó ÙÒ Ð Ñ ÒØÓ Ô ÖØ Ò ÒØ Ð Ð ×Ø ¸ Ð × ÓÔ Ö ÓÒ × ÔÙ Ò Ö Ö Ö Ð
  • 92.
    66 Cap´ ıtulo 2. Secuencias first last A B C D E ÙÖ ¾º ÍÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ Ð Ñ ÒØÓ ÔÖ ×ÓÖ Ó Ð ×Ù ×ÓÖº ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð Ð ×Ø ÔÙ Ö ÓÖÖ Ö× Ò ÐÓ× Ó× × ÒØ Ó׸ ÞÕÙ Ö Ö Ó Ú Ú Ö× º ÉÙ Þ Ð Ö Ò Ú ÖØÙ ÙÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ ×Ð Ô ÙØÓ¹ Ð Ñ Ò ÓÒ º Ù ÐÕÙ Ö ÒÓ Ó ÔÓ× ØÓ Ó Ð ÓÒØ ÜØÓ Ò × Ö Ó ´ÔÖ ×ÓÖ Ý ×Ù ×ÓÖµ Ô Ö Ð Ñ ×ÑÓ Ð Ñ Ò Ö× Ð Ð ×Ø º Ò Ð ¬ ÙÖ ¾º × Ù× Ò Ó× ÔÙÒØÓ× ÒØÖ ÙÒÓ ÔÓÖ ÜØÖ ÑÓº × ÔÓ× Ð Ý Ñ × Ú Ö× Ø Ð × × ÖÖ Ò ÐÓ× ÒÐ × Ý × Ð Ð ×Ø Ö ÙÐ Ö Ø Ð ÓÑÓ ÐÓ ÐÙ×ØÖ Ð ¬ ÙÖ ¾º º Ò ×Ø ×Ó¸ ר ÓÒ Ñ ÒØ Ò Ö ÙÒ ÔÙÒØ ÖÓ Ð ÔÖ Ñ Ö ÒÓ Ó Ð Ð ×Ø Ô Ö Ø Ò Ö ×Ó ×Ù ÓØÖÓ ÜØÖ ÑÓº first A B C D E ÙÖ ¾º ÍÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ Ö ÙÐ Ö Ò Ò ÙÖ ¸ Ø Ð ÓÑÓ ÐÓ ×ØÙ Ö ÑÓ× ÔÓר Ö ÓÖÑ ÒØ ¸ × × ÓÐÓ ÓÑÓ Ö ÙÒ ÒÓ Ó ÓÒ Ð¸ Ð Ù Ð ÒÓ ÓÖÑ Ô ÖØ ÐÓ Ð × Ù Ò ¸ ÒØÓÒ × × Ò Ò Ð Ò Ð ­Ù Ó¸ ÔÙ × ÒÓ Ý ÕÙ ÓÒ× Ö Ö ÐÓ× ×Ó× Ô ÖØ ÙÐ Ö × Ù Ò Ó Ð Ð ×Ø ר Ó Ú Ò Ú º Ä ×Ø Ò × Ö ÙÐ Ö Ý ÒÓ Ó Ö Ø Ñ Ò ÔÙ Ò ÔÐ Ö× Ð ×Ø × × Ñ¹ ÔÐ Ñ ÒØ ÒÐ Þ × ÙÒÕÙ Ð Ò Ò Ò Ú Ö× Ø Ð ÒÓ × Ø Ò ÒÓØ Ð ÓÑÓ ÓÒ Ð × Ó Ð Ñ ÒØ ÒÐ Þ ×º 2.4.1 Listas enlazadas y el principio fin a fin Ä × ÓÔ Ö ÓÒ × ×Ó Ö Ð ×Ø × ÒÐ Þ × ÔÙ Ò × Ô Ö Ö× Ò ÐÓ× Ò Ú Ð × Ö ÖÕÙ Ó׸ × ÙÒ Ð Ø ÔÓ ÓÔ Ö ÓÒ ×¸ ÐÙ×ØÖ Ó× Ò Ð Ö Ñ ÍÅÄ Ð × Ð × × ÕÙ Ñ Ò ÔÙÐ Ò Ð ×Ø × Ò ALEPHº Ò Ð ÔÖ Ñ Ö Ò Ú Ð Ð ¬Ò × Ð Ñ Ò Ó ÔÙÒØ ÓÖ ×º ËÓÐÓ ÒÓ× ÓÒ ÖÒ Ò Ð × ÓÔ Ö ¹ ÓÒ × ÒÐ ÙÒ ÒÓ Ó ÓÒ ÓØÖÓ × Ò ÓÒ× Ö Ö¸ Ò Ð Ö ×ØÓ ÐÓ× ÒÓ Ó׸ Ò Ð Ø ÔÓ ØÓ ÕÙ ×ØÓ× ÓÒØ Ò Òº Ò ×Ø Ò Ú Ð × Ò Ù ÒØÖ Ò Ð × Ð × × Slink Ý Dlink¸ Ð Ù Ð × ÑÓ Ð Þ Ò ÒÐ × ÒÓ Ó× Ð ×Ø × × ÑÔÐ Ý Ó Ð Ñ ÒØ ÒÐ Þ ×¸ Ö ×Ô Ø Ú ¹ Ñ ÒØ º Ä × ÓÔ Ö ÓÒ × Ò ×Ø Ò Ú Ð ×ÓÒ ÓÑÔÐ Ø Ñ ÒØ Ò Ô Ò ÒØ × Ð Ø ÔÓ ØÓ ÕÙ Ð Ö Ù Ò ÐÓ× ÒÓ Ó× ÐÓ ÕÙ Ð × Ò Ö Ð × Ô Ö ØÓ × Ð × Ð × × Ð ×Ø ׺
  • 93.
    2.4. Listas Enlazadas 67 Slink Dlink 1: Manejo de enlaces :T :T Snode Dnode 2: Manejo de tipo +get_data(): T +get_data(): T :T :T Slist Dlist 3: Manejo de nodos :T :T 4: Manejo de memoria DynSlist DynDlist ÙÖ ¾º ÖÑ Ò Ö Ð ÍÅÄ Ð × Ð × × Ô Ö Ð ×Ø × ÒÐ Þ × Ò Ð × ÙÒ Ó Ò Ú Ð Ð ¬Ò × Ð Ö Ö ÙÒ ØÓ Ò Ö Ó Ò Ð ÒÓ Ó ÕÙ ÐÙ Ó Ö ×ÙÐØ Ò Ð Ø ÔÓ Ð Ñ ÒØÓ Ð × Ù Ò º Ò ×Ø Ò Ú Ð Ò ÓÒØÖ ÑÓ× Ð × Ð × × Snode<T> Ý Dnode<T>¸ Ö ×Ô Ø Ú Ñ ÒØ º Ð ¬Ò ר × Ð × × × Ñ Ò Ö ÙÒ ØÓ Ò Ö Ó T × ¹ ÕÙ Ð Ñ ÒØ Ð ÓÔ Ö ÓÒ get data()º ÆÓØ × ÕÙ ÔÓÖ Ö Ò ÔÙ Ð ÙÒ Snode<T> × ÙÒ Slink Ý ÙÒ Dnode<T> × ÙÒ Dlinkº Ò Ð Ø Ö Ö Ò Ú Ð Ð ¬Ò × Ñ Ò ÔÙÐ Ö Ð ×Ø × ÒÓ Ó׸ × Ò × ÑÔÐ × Ø ÔÓ Slist<T>¸ Ó × Ò Ó Ð × Ø ÔÓ Dlist<T>º ÆÓØ × ÕÙ Ò ×Ø Ò Ú Ð × Ð Ð ×Ø × ÒÓ Ó× Ý ÒÓ Ð ×Ø × Ð Ñ ÒØÓ׺ ÒÓ Ó ÙÒ Ð ×Ø Ö ÕÙ Ö Ô ÖØ Ö ÙÒ ×Ô Ó Ñ ÑÓÖ º Ò Ð Ò Ù × ÓÑÓ C++ Ð Ñ Ò Ó Ñ ÑÓÖ × Ð Ó ÔÓÖÕÙ Ý ÕÙ × ÙÖ Ö× Ð ÖÖ ÐÓÕÙ ¸ Ò ÒÙ ×ØÖÓ ×Ó¸ ÒÓ Ó¸ ÕÙ Ý × Ó Ô ÖØ Ó ÙÒ Ú Þ ÕÙ × Ø ÖÑ Ò ÕÙ ×Ø Ý ÒÓ × Ù× Ö Ñ ×º Ò Ò ÙÖ ¸ Ý × ØÙ ÓÒ × Ò Ð × Ù Ð × ÒÓ × Ò × Ö Ó Ô ÖØ Ö Ó Ð Ö Ö Ñ ÑÓÖ º ÇØÖ Ú ÒØ ר Ò ÓÕÙ × ÕÙ ÔÓ ÑÓ× Ð Ñ Ò Ö ÙÒ ÒÓ Ó ÙÒ ÓÒ ÙÒØÓ Ò× ÖØ ÖÐÓ Ò ÓØÖÓ × Ò Ò × Ð Ö Ö Ý ÐÙ Ó Ô ÖØ Ö Ñ ÑÓÖ º Ò Ú ÖØÙ ×Ø × Ö ÞÓÒ ×¸ Ð Ñ Ò Ó ÔÓÖ ÒÓ Ó× Ô ÖÑ Ø ×Ô ¬ Ö ÓÔ Ö ÓÒ × ×Ó Ö Ð ×Ø × × Ò ÓÒ× Ö Ö Ð Ñ Ò Ó Ð Ñ ÑÓÖ º Ò ÐÑ ÒØ ¸ Ð ÙÐØ ÑÓ Ò Ú Ð ÓÖÖ ×ÔÓÒ Ð ÓÒ ÔØÓ ØÖ ÓÒ Ð Ð ×Ø Ò Ð Ù Ð ØÓ Ó ×Ø Ö ×Ù ÐØÓ Ò ÐÙ Ó Ð Ñ Ò Ó Ñ ÑÓÖ º Ò ×Ø × ÒØ Ó¸ × ÜÔÓÖØ Ò Ð × Ð × × DynSlist<T> Ý DynDlist<T>¸ Ð Ù Ð × ÑÓ Ð Þ Ò Ð ×Ø × ÑÔÐ ÒØ × Ñ ÒØ ÒÐ × × ÑÔÐ × Ý Ó Ð ×¸ Ö ×Ô Ø Ú Ñ ÒØ 2.4.2 El TAD Slink (enlace simple) Ð Ì Slink¸ ¬Ò Ó Ò Ð Ö ÚÓ ×Ð Ò ºÀ ¸ Ö ÔÖ × ÒØ ÙÒ ÒÐ × ÑÔÐ ÙÒ Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ Ö ÙÐ Ö ÓÒ ÒÓ Ó Öº ×Ð Ò ºÀ ÜÔÓÖØ Ð Ð × Slink ×Ð Ò ºÀ ≡ class Slink
  • 94.
    68 Cap´ ıtulo 2. Secuencias { Ñ Ñ ÖÓ× ÔÖÓØ Ó× Slink Ñ Ñ ÖÓ× ÔÙ Ð Ó× Slink }; ÙÒ ÓÒ ÓÒÚ Ö× ÓÒ Slink Ð× ½ ¬Ò × Slink¸ Ù× Ò ÙÒ × ¸ ¸ ½¸ ¾¸ Ò º Ç ØÓ× ÕÙ Ò ÒÐ Þ Ö× Ò ÙÒ Ð ×Ø × ÑÔÐ Ò Ø Ò Ö ÙÒ Slink ÓÑÓ ØÖ ÙØÓ Ó × Ö Slink ÔÓÖ Ö Ò ÔÙ Ð º Ä ¬ ÙÖ ¾º ÑÙ ×ØÖ ÙÒ Ð ×Ø Ù ØÖÓ Ð Ñ ÒØÓ× ÑÔÐ ÒØ Ñ ÒØ Slinkº ÙÖ ¾º Ä ×Ø ÒÐ Þ × ÑÔÐ ÓÒ Slink À Ý ÙÒ Ö Ò ÒÑ Ø Ñ ÒØ ÔÖ Ð ÓÒ Ð ¬ ÙÖ ¾º Ð ÞÓ ÔÙÒØ Ð Ð ÞÓ Ð × Ù ÒØ ÒÓ Ó Ý ÒÓ Ð ÒÓ Óº ×ØÓ ÔÐ ÒØ ÙÒ Ö Ò ×Ù ×Ø Ò Ð ÓÒ Ð × Ð ×Ø × ÒÐ Þ × ØÖ ÓÒ Ð × ÓÒ Ð ÔÙÒØ ÓÖ Ö ÓÒ Ð Ö ×ØÖÓ ÓÑÔÐ ØÓº Slink Ø Ò ÙÒ ×ÓÐÓ Ñ Ñ ÖÓ ØÓ Ý ÔÖÓØ Ó Ñ Ñ ÖÓ× ÔÖÓØ Ó× Slink ≡ ´ µ protected: Slink* next; Í× × Slink º Ä ÔÖÓØ ÓÒ Ô ÖÑ Ø ÕÙ ÙÒ Ð × Ö Ú Slink ÙØ Ð Ö Ø Ñ ÒØ Ð Ñ Ñ¹ ÖÓ ØÓ nextº Ð Ì Slink × Ø Ò × ÑÔÐ ¸ ÕÙ ÑÙ Ó× ×Ù× Ñ ØÓ Ó× ÓÒÐÐ Ú Ò ÙÒ ×ÓÐ Ð Ò Ñ Ñ ÖÓ× ÔÙ Ð Ó× Slink ≡ ´ µ Slink() : next(this) { /* Empty */ } Slink(const Slink &) { next = this; } Slink & operator = (const Slink & link) { next = this; } void reset() { next = this; } bool is_empty() const { return next == this;
  • 95.
    2.4. Listas Enlazadas 69 } Í× × Slink º Ð ÓÒרÖÙ ØÓÖ Slink() Ö ÙÒ Ð ÞÓ × ÑÔÐ ÔÙÒØ Ò Ó × Ñ ×ÑÓº Ä ÓÔ ÙÒ Slink ×ÓÐÓ × Ô ÖÑ Ø × Ð Ð ÞÓ ÒÓ ×Ø Ò ÐÙ Ó ÒØÖÓ Ð ÙÒ Ð ×Ø ÙÒ Slink ×ÓÐÓ ÔÙ ÓÔ Ö× × ×Ø ר Ú Óº is empty() Ö ØÓÖÒ Ú Ö ÖÓ × Ð next ÔÙÒØ × Ñ ×ÑÓº Ä ×Ø Ñ ØÓ Ó × ÒÚÓ ÖÐÓ × ÙÒ ÒÓ Ó Öº get next() Ö ØÓÖÒ Ð × Ù ÒØ Ð ÞÓ Ø Ó thisº Ä Ò× Ö ÓÒ × Ö ×Ô ØÓ Ð ×Ù ×ÓÖ Ý × ÓÑÓ × Ù Ñ Ñ ÖÓ× ÔÙ Ð Ó× Slink +≡ ´ µ void insert_next(Slink * p) { p->next = next; next = p; } Í× × Slink º insert next()Ò× ÖØ Ð Ð ÞÓ p ×ÔÙ × thisº Ð Ñ ×ÑÓ ÑÓ Ó¸ Ð Ð Ñ Ò ÓÒ Ø Ò Ð × Ù ÒØ Ð Ñ ÒØÓ Ý Ø Ñ Ò × ÑÙÝ × Ò ÐÐ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Slink +≡ ´ µ Slink * remove_next() { Slink * ret_val = next; next = ret_val->next; ret_val->reset(); return ret_val; } Í× × Slink º remove next() ×ÙÔÖ Ñ Ð × Ù ÒØ Ð Ñ ÒØÓ Ö ×Ô ØÓ this Ý Ö ØÓÖÒ Ð Ð ÞÓ Ð Ñ Ò Óº ËÙÔÓÒ ÑÓ× ÕÙ × ÑÓ× ÒÐ Þ Ö Ó ØÓ× Ø ÔÓ Window Ò ÙÒ Ð ×Ø × ÑÔÐ Ñ ÒØ Ò¹ Ð Þ º À Ý Ó× ÓÖÑ × ÖÐÓº Ä ÔÖ Ñ Ö × ÔÓÖ Ö Ú ÓÒ class Window : public slink { ... }; Ò ×Ø ×Ó ÔÓ ÑÓ× Ò× ÖØ Ö Ö Ø Ñ ÒØ Òר Ò × Window ×ÔÙ × ÙÒ ÒÓ Ó Ô ÖØ ÙÐ Ö first Window * window_ptr = new Window (...); ... first->insert_next(window_ptr); ×ØÓ × ÔÓ× Ð ÔÓÖÕÙ Window ׸ ÔÓÖ Ö Ú ÓÒ¸ Ø ÔÓ Slinkº ÈÙ ×ØÓ ÕÙ Ð × ÓÔ Ö ÓÒ × Ð Ð × Slink ×ÓÒ Ò ÙÒ ÓÒ Slink½½ ¸ ÔÙ × Ö Ò × Ö Ó ØÙ Ö ÙÒ ÓÒÚ Ö× ÓÒº ÈÓÖ ÑÔÐÓ window_ptr = static_cast<Window*>(first->remove_next()); ½½ Ê ÙÒ Ò Ö º
  • 96.
    70 Cap´ ıtulo 2. Secuencias ÓÑÓ first->remove next() Ö ØÓÖÒ ÙÒ Slink¸ Ð ÓÒÚ Ö× ÓÒ ÐÓ ÑÓ ¬ Ô Ö ÕÙ × ØÖ Ø ÓÑÓ Ø ÔÓ Window¸ Ð Ù Ð × Ð ×Ó ÔÓÖ Ö Ú ÓÒº Ä × ÙÒ ÓÖÑ Ô Ö ÒÐ Þ Ö Ð × × × ÔÓÖ ÓÐÓ ÓÒ ÙÒ Slink ÓÑÓ ØÖ ÙØÓ Window class Window { ... Slink link; }; Ë first ÔÙÒØ Ð ÔÖ Ñ Ö ÒÓ Ó ÙÒ Ð ×Ø ¸ ÒØÓÒ × ÙÒ Òר Ò window ptr Ø ÔÓ Window ÔÙ Ò× ÖØ Ö× ×ÔÙ × first Ð × Ù ÒØ ÑÓ Ó first->insert_next(&window_ptr->link); Ð Ò ÓÕÙ ÒØ Ö ÓÖ Ø Ò Ð Ú ÒØ ÕÙ ÔÓ× Ð ÒÐ Þ Ö Ó ØÓ× Ú Ö × Ð ×Ø × Ó × ¸ ÙÒ Ó ØÓ ÔÙ × Ö Ô ÖØ Ú Ö × Ð ×Ø ׺ È Ö ÐÐÓ¸ × ÑÔÐ Ñ ÒØ ÑÓ× Ð Ö Ö ÓÑÓ ØÖ ÙØÓ× Ø ÒØÓ× Slink ÓÑÓ Ð ÒØ Ð ×Ø × Ð × Ù Ð × Ô ÖØ Ò Ö Ð Ó ØÓº Ð ÑÔÐÓ ÒØ Ö ÓÖ¸ ÔÙ ÑÙÐØ ÔÐ Ö× Ð × Ù ÒØ ÓÖÑ class Window { ... Slink link_1; Slink link_2; ... Slink link_n; }; ... first->insert_next(&window_ptr->link_1); first->insert_next(&window_ptr->link_2); ... first->insert_next(&window_ptr->link_n); ÓÒ ×Ø Ø Ò ÒÓ × ÔÓ× Ð Ö Ð Þ Ö ÙÒ ÓÒÚ Ö× ÓÒ ÔÓÖ ÓÑÔ Ð ÓÖ¸ ÔÙ × Ù ÐÕÙ Ö ØÖ ÙØÓ Ø ÔÓ Slink ÒÓ × Ð ÔÖÓÔ Ð × Window¸ × ÒÓ Ô ÖØ ÐÐ º È Ö Ó Ø Ò Ö Ð Ö ÓÒ ÓÖÖ Ø Ô ÖØ Ö ÙÒ Slink ×ÓÒ Ò × Ö Ó× Ð ÙÒÓ× Ð ÙÐÓ× Ò Ö ØÑ Ø ÔÙÒØ ÓÖ ×º ÈÙ ×ØÓ ÕÙ Ø Ð × Ð ÙÐÓ× ×ÓÒ ÑÙÝ ×Ù× ÔØ Ð × ÖÖÓÖ¸ × ×Ø ÒØ × Ð Ò Ô×ÙÐ ÖÐÓ× Ò ÙÒ ÔÖ Ñ Ø Ú Ð × Ù ÒØ ÓÖÑ static Window * link_to_window(Slink *& link) { Window * ptr_zero = 0; size_t offset_link = reinterpret_cast<char*>(&(ptr_zero->link)); char * address_result = reinterpret_cast<char*>(link) - offset_link; return static_cast<Window *>(address_result); } ÆÓ Ø Ò ÑÓ× ÓÖÑ ÓÒÓ Ö ÐÓ× ÒÓÑ Ö × ÐÓ× ØÖ ÙØÓ× Slink Ò ×Ù ÒØ º ÆÓ ÔÓ ÑÓ׸ Ô٠׸ Ó Ö Ö ÙÒ ÖÙØ Ò Ò Ö ÕÙ ÒÓ× ÓÒÚ ÖØ ÙÒ Slink Ð Ð × ÕÙ
  • 97.
    2.4. Listas Enlazadas 71 ÓÒØ Ò Ð Slink¸ Ô ÖÓ × ÔÓ ÑÓ× Ó Ö Ö ÙÒ Ñ ÖÓ ÕÙ ÔÖ Ô Ö Ð Ø ÖÖ ÒÓ ½ ÙÒ ÓÒ ÓÒÚ Ö× ÓÒ Slink Ð × ½ ≡ ´ µ # define SLINK_TO_TYPE(type_name, link_name) static type_name * slink_to_type(Slink * link) { type_name * ptr_zero = 0; size_t offset_link = reinterpret_cast<size_t>(&(ptr_zero->link_name)); char * address_type = reinterpret_cast<char*>(link) - offset_link; return reinterpret_cast<type_name *>(address_type); } ¬Ò × SLINK TO TYPE¸ Ò Ú Ö Ù× º Í× × Slink º Ð Ñ ÖÓ Ø Ò Ó× Ô Ö Ñ ØÖÓ׺ type name × Ð ÒÓÑ Ö Ð Ð × ÕÙ Ð Ö ÙÒ Slinkº link name × Ð ÒÓÑ Ö ÙÒ ØÖ ÙØÓ Ø ÔÓ Slink ÓÒØ Ò Ó ÒØÖÓ Ð Ð × type nameº Å ÒØ Ð Ñ ÖÓ SLINK TO TYPE¸ Ð Ù×Ù Ö Ó ×ÔÓÒ ÙÒ ÑÔÐ ÒØ ÓÒ ÓÒ¹ Ú Ö× ÓÒ Slink ×Ù Ð × º Ð Ñ ÖÓ × Ò ÐÙ Ö ÒØÖÓ Ð Ð × ÕÙ ÙØ Ð Ð Slinkº ÈÓÖ ÑÔÐÓ¸ Ô Ö Ð Ð × Window class Window { /* ... */ SLINK_TO_TYPE(Window, link); }; Ë Ò Ö ÙÒ Ñ Ñ ÖÓ ×Ø Ø Ó ÕÙ ØÙ Ð Ñ ×ÑÓ ØÖ Ó ÕÙ ÙÒ ÓÒ ÓÒ¹ Ú Ö× ÓÒ Slink Ð× ½ º Ë Ò Ð Ñ ÖÓ × Ð Ó ÓÑÔÐ Ó¸ ר × Ò Ô Ò ÒØ Ð ÔÓ× ÓÒ Slink Ò Windowº Ä ×ØÖÙ ØÙÖ Ð Ñ Ñ ÖÓ ×Ø Ø Ó × Ð Ñ ×Ñ Ô Ö ØÓ Ð × ÕÙ Ù× ÙÒ Slink ×ÓÐÓ Ý ÕÙ Ñ Ö Window Ý link ÔÓÖ ÐÓ× ÒÓÑ Ö × ÕÙ Ð Ð ÒØ × Ó º 2.4.3 El TAD Snode<T> (nodo simple) Snode<T> × ÙÒ Ð × Ô Ö Ñ ØÖ Þ ÕÙ ×ØÖ ÙÒ ÒÓ Ó Ô ÖØ Ò ÒØ ÙÒ Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ Ö ÙÐ Ö¸ ÓÒ ÒÓ Ó Ö ¸ ÙÝÓ× ØÓ× ×ÓÒ Ø ÔÓ Tº Snode<T> × ¬Ò ÑÔÐ ÒØ Ò Ð Ö ÚÓ ØÔÐ ×ÒÓ ºÀ ½ ¸ Ð Ù Ð ÔÓ× Ð × Ù ÒØ רÖÙ ØÙÖ ½ ØÔÐ ×ÒÓ ºÀ ½ ≡ template <typename T> class Snode : public Slink { Ñ Ñ ÖÓ× ÔÖ Ú Ó× Snode<T> ¾ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Snode<T> ¾ }; ¬Ò × Snode¸ Ù× Ò ÙÒ × ¾¸ ¸ ½½¾ ¸ ½½¿ ¸ ½¾ ¸ Ò ½¿ º Í× × Slink º ÈÙ ×ØÓ ÕÙ Snode<T> Ö Ú Slink¸ ר × Ø Ñ Ò ÙÒ Slink Ý Ö ¸ Ü Ô ÓÒ Ð ÙÒÓ× Ñ ØÓ Ó× ÕÙ Ò ×Ó Ö Ö Ö× ¸ Ð Ñ ÝÓÖ Ô ÖØ ÐÓ× Ñ ØÓ Ó× Slinkº
  • 98.
    72 Cap´ ıtulo 2. Secuencias ÍÒ Snode<T> Ø Ò ÙÒ ÙÒ Ó ØÖ ÙØÓ ¾ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Snode<T> ¾ ≡ ´½ µ T data; data ÓÒØ Ò Ð ØÓ ÐÑ Ò Ó Ò Ð ÒÓ Óº ר ØÓ ÔÙ ÓÒ×ÙÐØ Ö× Ñ ÒØ Ð Ó × ÖÚ ÓÖ ¾ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Snode<T> ¾ ≡ ´½ µ ¾ T& get_data() { return data; } À Ý Ó× Ñ Ò Ö × ÓÒרÖÙ Ö ÙÒ Snode<T> ¾ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Snode<T> ¾ +≡ ´ ½ µ ¾ ¾ Snode() { /* empty*/ } Snode(const T & _data) : data(_data) { /* empty */ } Í× × Snode ½ º Ð ÓÒרÖÙ ØÓÖ Ú Ó Ö ÙÒ ÒÓ Ó ÓÒ Ú ÐÓÖ ØÓ Ò Ø ÖÑ Ò Óº Ð × ÙÒ Ó ÓÒ×¹ ØÖÙ ØÓÖ Ö ÙÒ ÒÓ Ó ÓÒ Ð Ú ÐÓÖ ØÓ dataº Ð Ñ ØÓ Ó insert next() × Ö Ö Ø Ñ ÒØ Slink ÐÓ ÕÙ × Ô ÖÑ × Ð ÔÓÖÕÙ ÙÒ Snode<T> × Ø Ñ Ò ÙÒ Slinkº ÈÓÖ Ð ÓÒØÖ Ö Ó¸ ÑÓ× ×Ó Ö Ö Ö remove next()¸ ÔÙ × ×Ø Ö ØÓÖÒ ÙÒ Slink Ý Ö ÕÙ Ö ÑÓ× ÕÙ × Ö ØÓÖÒ ÙÒ Snode<T> ¾ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Snode<T> ¾ +≡ ´½ µ ¾ ¾ Snode * remove_next() { return static_cast<Snode*>(Slink::remove_next()); } Í× × Slink Ò Snode ½ º Ä Ñ ×Ñ ×Ó Ö Ö Ö Ð Þ Ö× Ô Ö get next() ¾ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Snode<T> ¾ +≡ ´½ µ ¾ Snode * get_next() const { return static_cast<Snode*>(Slink::get_next()); } Í× × Slink Ò Snode ½ º 2.4.4 El TAD Slist<T> (lista simplemente enlazada) Ð Ì Slist<T> ×ØÖ ÙÒ Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ Ö ÙÐ Ö ÒÓ Ó× × ÑÔР׸ Ð Ù Ð × ¬Ò Ò Ð Ö ÚÓ ØÔÐ ×Ð ×ØºÀ ¾ ¸ Ò Ð Ù Ð × ¬Ò Ð Ð × Ò Ù ×Ø ÓÒ ¾ ØÔÐ ×Ð ×ØºÀ ¾ ≡ template <typename T> class Slist : public Snode<T> { ¬Ò ÓÒ × Slist<T> ¾ Ñ ØÓ Ó× ÔÙ Ð Ó× Slist<T> ¿ Ø Ö ÓÖ Slist<T> ¿ }; ¬Ò × Slist¸ Ù× Ò ÙÒ × ¿ß º Í× × Snode ½ º Ä Ð × Slist<T> ÑÓ Ð Þ ÙÒ Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ ÒÓ Ó× × ÑÔÐ × ÕÙ ÐÑ Ò Ò ØÓ× Ø ÔÓ T ¾ ¬Ò ÓÒ × Slist<T> ¾ ≡ ´ ¾µ typedef Snode<T> Node; Í× × Snode ½ º
  • 99.
    2.4. Listas Enlazadas 73 ר Ð Ö ÓÒ ÜÔÓÖØ Ð Ø ÔÓ Slist<T>::Node × ÒÓÒ ÑÓ Snode<T>º Ä ÙÒ Ò× Ö ÓÒ ÔÓ× Ð × Ð ÔÖ Ò Ô Ó Ð Ð ×Ø Ø Ð ÓÑÓ × Ù ¿ Ñ ØÓ Ó× ÔÙ Ð Ó× Slist<T> ¿ ≡ ´ ¾µ ¿ void insert_first(Node * node) { this->insert_next(node); } insert first() Ò× ÖØ Ð ÒÓ Ó Ð ÔÖ Ò Ô Ó Ð Ð ×Ø × Ö¸ node Ú Ò Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ Ð Ð ×Ø º Ð Ñ ×ÑÓ ÑÓ Ó¸ Ð ÙÒ ÓÖÑ ×ÙÔÖ Ñ Ö × ÔÓÖ Ð ÔÖ Ò Ô Ó Ð Ð ×Ø ¿ Ñ ØÓ Ó× ÔÙ Ð Ó× Slist<T> ¿ +≡ ´ ¾µ ¿ ¿ Node * remove_first() throw(std::exception, std::underflow_error) { return this->remove_next(); } remove first() Ð Ñ Ò Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ Ð Ð ×Ø Ý Ö ØÓÖÒ ×Ù Ö ÓÒº Ð Ù×Ù Ö Ó Slist<T> ÔÙ ÓÒÓ Ö Ð Ö ÓÒ Ð ÔÖ Ñ Ö ÒÓ Ó Ñ ÒØ ¿ Ñ ØÓ Ó× ÔÙ Ð Ó× Slist<T> ¿ +≡ ´ ¾µ ¿ Node * get_first() const Exception_Prototypes(std::underflow_error) { return this->get_next(); } Ð Ö ×ØÓ ÐÓ× Ð Ñ ÒØÓ× ÔÙ Ò Ö× ØÖ Ú × Ð ÒØ Ö Þ Slist<T>::Node¸ Ð Ù Ð × Ð Ñ ×Ñ Snode<T>º Ð Ù×Ù Ö Ó ÔÙ ØÙ Ö Ò× Ö ÓÒ × Ý ×ÙÔÖ × ÓÒ × Ð Ð ×Ø ØÖ Ú × ×Ø Ú º 2.4.5 Iterador de Slist<T> Slist<T> ÜÔÓÖØ ÙÒ Ø Ö ÓÖ Ó Ð ×Ù ¹ Ð × ¿ Ø Ö ÓÖ Slist<T> ¿ ≡ ´ ¾µ class Iterator { Ñ Ñ ÖÓ× ÔÖ Ú Ó× Ø Ö ÓÖ Slist<T> ¿ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ Slist<T> ¿ }; Ð ÙÒ Ñ Ò Ö ¸ Ð Ø Ö ÓÖ ÔÓ× Ö Ð Ò ÓÖÑ ÓÒ ×Ù¬ ÒØ Ô Ö ÔÓ Ö Ö ÓÖÖ Ö Ð Ð ×Ø º Ì Ð Ò ÓÖÑ ÓÒ ×Ø ÓÒר ØÙ ÔÓÖ ¿ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Ø Ö ÓÖ Slist<T> ¿ ≡ ´¿ µ Slist * list; Node * current; Í× × Slist ¾ º list × ÙÒ ÔÙÒØ ÓÖ Ð Ð ×Ø ÒÐ Þ ×Ó Ö Ð Ù Ð × Ø Ö Ý current × Ð Ð Ñ ÒØÓ ØÙ Ð Ð Ø Ö ÓÖº Ö ×ØÓ¸ Ð Ø Ö ÓÖ × ¬Ò × ÑÔÐ Ñ ÒØ ÓÑÓ × Ù ¿ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ Slist<T> ¿ ≡ ´¿ µ Iterator(Slist & _list) : list(&_list), current(list->get_first()) { /* Empty */ } bool has_current() const { return current != list; }
  • 100.
    74 Cap´ ıtulo 2. Secuencias Node * get_current() { return current; } void next() { current = current->get_next(); } void reset_first() { current = list->get_next(); } Í× × Slist ¾ º Ð × Ù ÒØ ÑÔÐÓ Ú × Ø ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ× ÙÒ Ð ×Ø for (typename Slist<int>::Iterator itor(list); itor.has_current(); itor.next()) // procesar itor.get_current()->get_data(); 2.4.6 El TAD DynSlist<T> Ð Ì DynSlist<T> ÑÓ Ð Þ ÙÒ Ð ×Ø Ð Ñ ÒØÓ× Ø ÔÓ T ÙÝÓ Ñ Ò Ó Ñ ÑÓÖ ÐÓ Ö Ð Þ ÒØ ÖÒ Ñ ÒØ Ð ÔÖÓÔ Ó Ì º ÓÑÓ Ø Ð¸ ר Ì × Ö Ñ × Ð ÓÒ ÔØÓ Ð Ð ×Ø ÒÙÒ Ó Ð ÔÖ Ò Ô Ó Ð Ô ØÙÐÓº ËÙ ¬Ò ÓÒ ÑÔÐ ÒØ ÓÒ × Ò Ù ÒØÖ Ò Ò Ð Ö ÚÓ ØÔÐ ÝÒËÐ ×ØºÀ ¸ ÙÝ ×ØÖÙ ØÙÖ × Ð × Ù ÒØ ØÔÐ ÝÒËÐ ×ØºÀ ≡ template <typename T> class DynSlist : public Slist<T> { Å Ñ ÖÓ× ÔÖ Ú Ó× DynSlist<T> Å Ñ ÖÓ× ÔÙ Ð Ó× DynSlist<T> }; ¬Ò × DynSlist¸ Ù× Ò ÙÒ º Í× × Slist ¾ º DynSlist<T> Ö Ô ÖØ Ð ÒØ Ö Þ ÑÔÐ ÒØ ÓÒ Slist<T>º this ׸ Ò¹ ØÓÒ ×¸ Ð ÒÓ Ó Ö Ð Ð ×Ø º ÓÒ ÐÑ ÒØ ¸ DynSlist<T> ÓÒØ Ð Þ Ð ÒØ Ð Ñ ÒØÓ× Ð Ð ×Ø Å Ñ ÖÓ× ÔÖ Ú Ó× DynSlist<T> ≡ ´ µ size_t num_items; ÒØ × Ð Ô Ö ÓÒ Ð Ô ØÖÓÒ Ø Ö ÓÖ ÔÖ × ÒØ Ó Ò Ü ¾º¿¸ Ð × ÒØ Ö × Ð × Ð ×Ø × ÒÐ Þ × Ñ Ò Ò Ð ÓÒ ÔØÓ ÙÖ×ÓÖ º ÍÒ ÙÖ×ÓÖ ×ØÖ ÙÒ ÔÓ× ÓÒ Ð Ð ×Ø ÒØÖÓ Ð × Ù Ò Ö ×Ô ØÓ Ð Ù Ð × Ö Ð Þ Ò ×Ù× ÓÔ Ö ÓÒ × ÔÖ Ò Ô Ð ×º ÙÒ ÙÖ×ÓÖ × Ð ÐÐ Ñ Ø Ñ Ò ÔÓ× ÓÒ ØÙ Ð º È Ö ÐÐ Ú Ö Ð ×Ø Ó Ð ÙÖ×ÓÖ × ÙØ Ð Þ Ò ÐÓ× × Ù ÒØ × ØÖ ÙØÓ× Å Ñ ÖÓ× ÔÖ Ú Ó× DynSlist<T> +≡ ´ µ int current_pos; Snode<T> * current_node; Í× × Snode ½ º
  • 101.
    2.4. Listas Enlazadas 75 current pos × Ð ÓÖ Ò Ð Ð Ð Ñ ÒØÓ ØÙ Ð ÒØÖÓ Ð × Ù Ò º current node × Ð ÒÓ Ó ÔÖ ×ÓÖ Ð Ð Ñ ÒØÓ ØÙ к ÒØ × ÑÔÐ ÒØ Ö Ð × ÔÖ Ñ Ø Ú × ÔÖ Ò Ô Ð × DynSlist<T>¸ Ö ÕÙ Ö ÑÓ× ÙÒ ÖÙØ Ò ×Ó ÔÓÖ ÔÓ× ÓÒ Å Ñ ÖÓ× ÔÖ Ú Ó× DynSlist<T> +≡ ´ µ typename Slist<T>::Node * get_previous_to_pos(const int & pos) { if (pos < current_pos) // hay que retroceder? { // Si, reinicie posici´n actual o current_pos = 0; current_node = this; } while (current_pos < pos) // avanzar hasta nodo predecesor a pos { current_node = current_node->get_next(); ++current_pos; } return current_node; } Í× × Slist ¾ º get previous to pos() Ö ØÓÖÒ Ð ÒÓ Ó ÔÖ ×ÓÖ Ð ÔÓ× ÓÒ pos Ý current node ÔÓ× ÓÒ Ó Ò Ó ÔÖ ×ÓÖº Ä Ñ ÑÓÖ Þ ÓÒ Ð ÔÖ ×ÓÖ × Ò ×Ô Ò× Ð Ô Ö ÐÓ× Ð ÓÖ ØÑÓ× Ò× Ö ÓÒ Ý Ð Ñ Ò ÓÒº ÄÓ× Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ö ×Ø ÒØ × × ×Ô ¬ Ò ÓÑÓ × Ù Å Ñ ÖÓ× ÔÙ Ð Ó× DynSlist<T> ≡ ´ µ T & operator [] (const size_t & i) { return get_previous_to_pos(i)->get_next()->get_data(); } void insert(const int & pos, const T & data) { // apartar nodo para nuevo elemento typename Slist<T>::Node * node = new typename Slist<T>::Node (data); typename Slist<T>::Node * prev = get_previous_to_pos(pos); // predecesor prev->insert_next(node); ++num_items; } void remove(const int & pos) { // obtener nodo predecesor al nuevo elemento typename Slist<T>::Node * prev = get_previous_to_pos(pos); typename Slist<T>::Node * node_to_delete = prev->remove_next(); delete node_to_delete; --num_items; } ~DynSlist() { // eliminar nodo por nodo hasta que la lista devenga vac´a ı while (not this->is_empty()) delete this->remove_first(); // remove_first de la clase base Slink } Í× × DynSlist ¸ Slink ¸ Ò Slist ¾º
  • 102.
    76 Cap´ ıtulo 2. Secuencias DynSlist<T> ÜÔÓÖØ ÙÒ Ø Ö ÓÖ ÙÝ ×Ô ¬ ÓÒ × ÑÙÝ × ÑÔÐ Ð ÖÐ ÖÚ Slist<T>::Iteratorº 2.4.7 El TAD Dlink (enlace doble) Ò Ð Ñ ×ÑÓ ×Ô Ö ØÙ × ÒÓ ÕÙ Ð Ì Slink¸ Ð Ì Dlink ¬Ò ÙÒ Ó Ð ÒÐ ÓÒØ Ò Ó Ò ÙÒ ÒÓ Ó Ô ÖØ Ò ÒØ ÙÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ Ö ÙÐ Ö ÓÒ ÒÓ Ó Öº Dlink × ×Ô ¬ ÑÔÐ ÒØ Ò Ð Ö ÚÓ Ð Ò ºÀ ÕÙ × ×ØÖÙ ØÙÖ Ð × Ù ÒØ ÑÓ Ó Ð Ò ºÀ ≡ class Dlink { Ñ Ñ ÖÓ× ÔÖÓØ Ó× Dlink Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink }; Ñ ÖÓ× ÓÒÚ Ö× ÓÒ Dlink Ð × ¿ Ô ÖØ Ö ×Ø ÑÓÑ ÒØÓ × ÑÙÝ ÑÔÓÖØ ÒØ ÔÙÒØÙ Ð Þ Ö Ý ×Ø Ò Ù Ö ÐÓ× × Ù ÒØ × ¬Ò × ½º Ð ¬Ò ÙÒ Dlink × ÙÒ Ö ÒÓ Ó Ö ÙÒ Ð ×Ø Ö ÙÐ Ö Ó Ð Ñ ÒØ Ò¹ Ð Þ º Ò ×Ø × ÒØ Ó¸ Ð × ÓÔ Ö ÓÒ × Ð Ð × Dlink Ö ¬ Ö Ò Ð ×Ø × Ó Ð ¹ Ñ ÒØ ÒÐ Þ ×¸ Ö ÙÐ Ö ×¸ ÙÝÓ ÒÓ Ó Ö × thisº ¾º Ð ¬Ò ÙÒ Dlink* × ÙÒ Ö ÔÙÒØ ÓÖ ÙÒ ÒÓ Ó Ô ÖØ Ò ÒØ ÙÒ Ð ×Ø Ö¹ ÙÐ Ö Ó Ð Ñ ÒØ ÒÐ Þ º Dlink ÔÓ× Ó× ØÖ ÙØÓ× ÔÖÓØ Ó× Ñ Ñ ÖÓ× ÔÖÓØ Ó× Dlink ≡ ´ µ mutable Dlink * prev; mutable Dlink * next; next Ý prev ×ÓÒ ÔÙÒØ ÓÖ × Ð ×Ù ×ÓÖ Ý ÔÖ ×ÓÖ thisº ÍÒ ÒÙ ÚÓ Dlink × ÑÔÖ × Ö ÓÒ ×Ù× Ð ÞÓ× ÔÙÒØ Ò Ó × Ñ ×ÑÓ × Ö¸ ÓÑÓ ÙÒ ÒÓ Ó Ö ÙÝ Ð ×Ø ר Ú Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink ≡ ´ µ Dlink() : prev(this), next(this) { /* empty */ } Ú ÒØÙ ÐÑ ÒØ ¸ ÙÒÕÙ Ð Ó¸ × ÓÒÚ Ò ÒØ ÜÔÓÖØ Ö ÒØ Ö × Ô Ö ÓÔ × Ý × ¹ Ò ÓÒ × Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink +≡ ´ µ Dlink(const Dlink &) { reset(); } Dlink & operator = (const Dlink & l) { reset(); return *this; }
  • 103.
    2.4. Listas Enlazadas 77 ÒÖ Ð Ð × Ó× ÓÔ Ö ÓÒ × ÒÓ ØÙ Ò ÓÔ × ÜÔÓÖØ Ò Ô Ö × Ø × Ö ÓÔ Ö ÓÒ × ÓÒ Ú Ö Ð × Ø ÑÔÓÖ Ð × Ù× × ÔÓÖ Ð ÓÑÔ Ð ÓÖº ÆÓ × ÔÓ× Ð Ö Ð Þ Ö ÓÔ ×Ø Ò Ú Ð¸ ÔÓÖÕÙ ÒÓ × Ñ Ò Ò Ò ÙÒ Ñ Ò ×ÑÓ × Ò ÓÒ Ñ ÑÓÖ Ò × ÓÒÓ Ð Ø ÔÓ ØÓ ÕÙ Ð Ö Ò ÐÓ× ÒÓ Ó׺ ÍÒ Ó Ð ÒÐ ÔÙ Ö Ò Ö× Ñ ÒØ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink +≡ ´ µ void reset() { next = prev = this; } reset() Ö Ò ÙÒ Ð ×Ø ÕÙ ÔÙÒØ × Ñ ×ÑÓº ×ØÓ no es equivalente a eliminar los nodos atados a thisº ÙÒÕÙ ÒÓ × ÔÓ× Ð × Ò Ö ×Ó Ö ÙÒ Ð ×Ø ÕÙ ÓÒØ Ò Ð Ñ ÒØÓ׸ × × ÔÓ× Ð ÒØ Ö Ñ Ö ÐÓ× ÓÒØ Ò Ó× Ó× Ð ×Ø × Ó Ð Ñ ÒØ ÒÐ Þ × Ò Ø ÑÔÓ ÓÒר ÒØ º ÈÓÖ ×Ø Ö ÞÓÒ¸ × Ó Ö Ð ÔÖ Ñ Ø Ú swap() ÙÝ ÑÔÐ ÒØ ÓÒ × ÓÑÓ × Ù Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink +≡ ´ µ void swap(Dlink * link) { if (is_empty() and link->is_empty()) return; if (is_empty()) { link->next->prev = this; link->prev->next = this; next = link->next; prev = link->prev; link->reset(); return; } if (link->is_empty()) { next->prev = link; prev->next = link; link->next = next; link->prev = prev; reset(); return; } Aleph::swap(prev->next, link->prev->next); Aleph::swap(next->prev, link->next->prev); Aleph::swap(prev, link->prev); Aleph::swap(next, link->next); } swap() × ÙÒ Ö Ò ÓÔ Ö ÓÒ¸ Ô٠׸ Ô ÖØ ÕÙ ×Ù Ø ÑÔÓ Ù ÓÒ × ×¹ Ô Ø ÙÐ Ö¸ ÔÙ × × ÓÒר ÒØ ¸ × Ò Ö Ð Ô Ö ØÓ × Ð × Ð ×Ø × Ó Ð Ñ ÒØ ÒÐ Þ × ÓÒ ÒÓ Ó Ö ¸ × Ò ÑÔÓÖØ Ö Ò Ð Ø ÔÓ ØÓ ÕÙ × Ñ Ò ¸ Ò ÓÑÓ × Ö × ÖÚ Ð Ñ ÑÓ¹ Ö º Ä ¬ ÙÖ ¾º ÐÙ×ØÖ ÐÓ× ÒÓ Ó× Ð × Ð ×Ø × Ò ÐÓ× Ù Ð × × Ö Ð Þ Ò ÐÓ× ÒØ Ö Ñ Ó׺ ×ÙÑ Ò Ó ÕÙ this × Ð ÒÓ Ó Ö ÙÒ Ð ×Ø ¸ ÔÓ ÑÓ× × Ö × Ð Ð ×Ø ר Ú Ó ÒÓ¸ × ÓÒØ Ò ÙÒ ×ÓÐÓ Ð Ñ ÒØÓ Ó × ×Ù Ö Ò Ð × Ñ ÒÓÖ Ó Ù Ð ÙÒÓ
  • 104.
    78 Cap´ ıtulo 2. Secuencias this swap swap swap swap link ÙÖ ¾º ÇÔ Ö ÓÒ swap(link) Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink +≡ ´ µ bool is_empty() const { return this == next and this == prev; } bool is_unitarian() const { return this != next and next == prev; } bool is_unitarian_or_empty() const { return next == prev; } ÍÒ ÔÙÒØÓ ×Ø Ö ×Ø × ÓÔ Ö ÓÒ × × ÕÙ ÒÓ Ö ÕÙ Ö Ò ÓÒØ Ð Þ Ö Ð ÒØ ÒÓ Ó× Ð Ð ×Ø º Ä ¬ ÙÖ ¾º½¼ ÒÙÑ Ö ÐÓ× Ö ÒØ × Ô ×Ó× ÒÚÓÐÙ Ö Ó× Ò Ð Ò× Ö ÓÒ¸ ÐÓ× Ù Ð × × Ö Ð Þ Ò Ò Ð ÖÙØ Ò insert()¸ Ð Ù Ð Ò× ÖØ node ÓÑÓ Ð ×Ù ×ÓÖ this Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink +≡ ´ µ void insert(Dlink * node) { node->prev = this; node->next = next; next->prev = node; next = node; } Ä Ò× Ö ÓÒ ÓÑÓ ÔÖ ×ÓÖ × ÒÓÑ Ò append() Ý× ¬Ò ÓÑÓ × Ù Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink +≡ ´ µ void append(Dlink * node) { node->next = this; node->prev = prev; prev->next = node; prev = node; } ÈÙ ×ØÓ ÕÙ Ð Ð ×Ø × Ö ÙÐ Ö¸ insert() × Ð ÒÓ Ó Ö Ò× ÖØ ÙÒ ÒÓ Ó Ð ÔÖ Ò Ô Ó Ð Ð ×Ø º Ò ÐÓ Ñ ÒØ ¸ append() ÐÓ× Ò× ÖØ Ð ¬Ò к Ð Ö ÓÒ ÙÒ ÒÓ Ó¸ ÔÓ ÑÓ× Ö ×Ù ×Ù ×ÓÖ Ý ÔÖ ×ÓÖ Ñ ÒØ ÐÓ× × Ù ÒØ × Ñ ØÓ Ó× Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink +≡ ´ µ ¼
  • 105.
    2.4. Listas Enlazadas 79 1:node->prev = this; node 2:node->next = next; X 4: next = node; 3:next->prev = node; A B C D this ÙÖ ¾º½¼ ÁÒ× Ö ÓÒ Ò ÙÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ ÑÔÐ ÒØ ÓÒ Dlink Dlink *& get_next() { return next; } Dlink *& get_prev() { return prev; } this head ´ µ ÒØ × ÙØ Ö insert list(head) this head ´ µ ×ÔÙ × ÙØ Ö insert list(head) ÙÖ ¾º½½ ÁÒ× Ö ÓÒ Ð ×Ø ÒØÖÓ ÙÒ Ð ×Ø Ü ×Ø Ò Ö ÙÒר Ò × Ò Ð × Ù Ð × × Ö ÕÙ Ö Ò× ÖØ Ö ÙÒ Ð ×Ø ÓÑÔÐ Ø ÒØÖÓ ÓØÖ Ô ÖØ Ö ÙÒÓ ×Ù× ÒÓ Ó׺ È Ö ÐÐÓ¸ ÙØ Ð Þ ÑÓ× Ð × ÔÖ Ñ Ø Ú × insert list()
  • 106.
    80 Cap´ ıtulo 2. Secuencias Ý append list()º Ä ¬ ÙÖ ¾º½½ ÑÙ ×ØÖ Ð ÔÖÓ ×Ó Ù ÓÒ insert list(head)º ×ÔÙ × ×Ù Ù ÓÒ¸ Ð Ð ×Ø ÙÝÓ ÒÓ Ó Ö ×Ø ÔÙÒØ Ó ÔÓÖ head Ú Ò Ú ¸ ÔÙ × ×Ù× ÒÓ Ó× Ù ÖÓÒ Ò ÐÙ Ó× Ò thisº × ÑÙÝ ÑÔÓÖØ ÒØ ÒÓØ Ö ÕÙ Ò ×Ø ×Ó this ÒÓ Ò × Ö Ñ ÒØ × ÙÒ ÒÓ Ó Ö ¸ × ÒÓ ÕÙ ÔÙ × Ö Ù ÐÕÙ Ö ÓØÖÓ ÒÓ Óº Ä × ÑÔÐ Ñ ÒØ ÓÒ × ×ÓÒ ÓÑÓ × Ù ¼ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink +≡ ´ µ ¼ void insert_list(Dlink * head) { if (head->is_empty()) return; head->prev->next = next; head->next->prev = this; next->prev = head->prev; next = head->next; head->reset(); } void append_list(Dlink * head) { if (head->is_empty()) return; head->next->prev = prev; head->prev->next = this; prev->next = head->next; prev = head->prev; head->reset(); } Ò Ð ÙÒÓ× ÓÒØ ÜØÓ׸ Ð × ÓÔ Ö ÓÒ × insert list() Ý append list() × ÓÒÓ Ò ÓÑÓ ×ÔÐ ½¾ º ÍÒ ×Ó Ô ÖØ ÙÐ Ö¸ ÕÙ Þ ÑÙ Ó Ñ × ÓÑÙÒ ÕÙ Ð ×ÔÐ ¸ × Ð ÓÔ Ö ÓÒ ÓÒ Ø Ò Ö Ð ×Ø × concat list(head)¸ Ð Ù Ð ÓÒ Ø Ò Ð Ð ×Ø ÙÝÓ ÒÓ Ó Ö × head ÓÒ thisº head Ú Ò Ú ×ÔÙ × Ð ÓÔ Ö ÓÒº Ò ×Ø ×Ó¸ × × ×ÙÑ ÕÙ this × ÒÓ Ó Ö º Ð Ö ×Ô ØÓ¸ × ÔÐ ÒØ Ð × Ù ÒØ ÑÔÐ Ñ ÒØ ÓÒ ¼ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink +≡ ´ µ ¼ ½ void concat_list(Dlink * head) { if (head->is_empty()) return; if (this->is_empty()) { swap(head); return; } prev->next = head->next; head->next->prev = prev; prev = head->prev; ½¾ Ò Ò Ð ×¸ ר Ø ÖÑ ÒÓ × ÙØ Ð Þ Ù Ò Ó × × ÜÔÖ × Ö ÕÙ Ó× Ó× × × Ô Ò¸ × ÙÒØ Ò¸ ÔÓÖ ×Ù× ÜØÖ ÑÓ× ¹ÙÒ ÔÙÒØ ÓÒ Ð ÓØÖ ¹º Ò Ð ÓÔ Ò ÓÒ ×Ø Ö ØÓÖ¸ Ð ÕÙ Ú Ð ÒØ ר ÐÐ ÒÓ Ñ × ÔÖÓÜ ÑÓ × ÒÐ Þ Ö ¸ ÙÝÓ Ù×Ó ÔÐ ÒØ ÙÒ Ñ Ù ÒÐ Ö Ð ×Ø × ÒÐ Þ ×º ÈÓÖ × Ö ÞÓÒ¸ ÓÒØ ÒÙ Ö ÑÓ× ÙØ Ð Þ Ò Ó Ð Ø ÖÑ ÒÓ Ò Ò Ð ×º
  • 107.
    2.4. Listas Enlazadas 81 head->prev->next = this; head->reset(); } Ð Ö ÓÒ ÙÒ ÒÓ Ó¸ Ý Ú Ö × Ñ Ò Ö × ÒÚÓ Ö ÙÒ Ð Ñ Ò ÓÒº Ä Ñ × ÙØ Ð ØÓ × × Ð ÒÓÑ Ò ÙØÓ¹ Ð Ñ Ò ÓÒ ¸ Ð ØÙ Ñ ÒØ del()º Ä ÖÙØ Ò × ÑÙÝ ÙØ Ð ÔÓÖÕÙ Ô ÖÑ Ø ÕÙ ÓØÖ × ×ØÖÙ ØÙÖ × ØÓ× ÐÑ Ò Ò Ö Ö Ò × Ð Ñ Ò Ð × Ð Ñ ÒØÓ× ÙÒ Ð ×Ø ÒÐ Þ º Ò ÓØÖ × Ô Ð Ö ×¸ ÙÒ ÒÓ Ó Ù ÐÕÙ Ö ÔÙ ×ÙÔÖ Ñ Ö× × Ñ ×ÑÓ Ð Ð ×Ø º ËÙ ÑÔÐ Ñ ÒØ ÓÒ × ÓÑÓ × Ù ½ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink +≡ ´ µ ¼ ½ void del() { prev->next = next; next->prev = prev; reset(); } ÄÓ× Ô ×Ó× del() × ÑÙ ×ØÖ Ò Ò Ð ¬ ÙÖ ¾º½¾º 1: prev->next = next; 3: reset(); A B C D 2: next->prev = prev; this ÙÖ ¾º½¾ ÙØÓ¹ Ð Ñ Ò ÓÒ Ò ÙÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ ÑÔÐ ÒØ ÓÒ Dlink Ó ÙÒ ÒÓ ¸ Ý ÓØÖ × Ó× Ñ Ò Ö × Ð Ñ Ò Ö ×Ù ÔÖ ×ÓÖ Ó ×Ù ×Ù ×ÓÖ¸ Ð × Ù Ð × × ÑÔÐ ÒØ Ò Ñ ÒØ ÐÓ× × Ù ÒØ × Ñ ØÓ Ó× ½ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink +≡ ´ µ ½ ¾ Dlink * remove_prev() { Dlink* retValue = prev; retValue->del(); return retValue; } Dlink * remove_next() { Dlink* retValue = next; retValue->del(); return retValue; } remove prev() ×ÙÔÖ Ñ Ð ÔÖ ×ÓÖ Ö ×Ô ØÓ this remove next() ×ÙÔÖ Ñ Ð ×Ù ¹ ×ÓÖº ר × ÔÖ Ñ Ø Ú × ×ÓÒ Ô ÖØ ÙÐ ÖÑ ÒØ ÙØ Ð × Ô Ö Ð ÒÓ Ó Ö Ð Ð ×Ø º ÈÙ ×ØÓ ÕÙ Ð Ð ×Ø × Ö ÙÐ Ö¸ remove prev()¸ ÒÚÓ × Ð ÒÓ Ó Ö ¸ ×ÙÔÖ Ñ Ð ÙÐØ ÑÓ ÒÓ Ó Ð Ð ×Ø × Ñ Ð ÖÑ ÒØ ¸ remove next() ×ÙÔÖ Ñ Ð ÔÖ Ñ ÖÓº ÍÒ ÔÐ ÓÒ Ö Ø Ð ÙÒÓ× ÐÓ× Ñ ØÓ Ó× ÜÔÐ Ó× × ÑÔÐ ¬ Ñ ÒØ ÙÒ ÖÙØ Ò ÒÚ Ö× ÓÒ ÒÓ Ó× Ð Ð ×Ø
  • 108.
    82 Cap´ ıtulo 2. Secuencias ¾ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink +≡ ´ µ ½ ¾ size_t reverse_list() { if (is_empty()) return 0; Dlink tmp_head; // cabecera temporal donde se guarda lista invertida // recorrer toda la lista this, eliminar primero e insertar en tmp_head size_t counter = 0; for (/* nada */; not is_empty(); counter++) tmp_head.insert(remove_next()); // eliminar e insertar en tmp_head swap(&tmp_head); // tmp_head == lista invertida; this vac´a ==> swap ı return counter; } Ô ÖØ ÒÚ ÖØ Ö Ð Ð ×Ø ¸ reverse list() ÔÖÓÚ Ð Ö ÓÖÖ Ó Ô Ö ÓÒØ Ö Ð Ò¹ Ø ÒÓ Ó× ÒØ ÕÙ Ö ØÓÖÒ Ð ÙÒ ÓÒº ÙÒ Ð ×Ø ¸ ÓÑÓ Ô ÖØ ÖÐ ÔÓÖ Ð ÒØÖÓ Ò Ó× Ð ×Ø × Ð Ñ ×ÑÓ Ø Ñ ÒÓ ÍÒ ØÖÙ Ó ÓÒ× ×Ø Ò Ú ÒÞ Ö Ó× ÔÙÒØ ÓÖ ×º ÈÓÖ Ø Ö ÓÒ¸ ÙÒ ÔÙÒØ ÖÓ Ú ÒÞ ÙÒ Ô ×Ó¸ Ñ ÒØÖ × ÕÙ Ð ÓØÖÓ Ú ÒÞ Ó× ½¿ º Ù Ò Ó Ð × ÙÒ Ó ÔÙÒØ ÖÓ × Ò Ù ÒØÖ Ð ¬Ò Ð Ð Ð ×Ø ¸ Ð ÔÖ Ñ ÖÓ × Ò ÓÒØÖ Ö Ò Ð ÒØÖÓ ×Ø × Ð ÔÙÒØÓ Ô ÖØ ÓÒº ר Ò ÓÕÙ ¸ × Ð Ñ × Ù Ó Ô Ö Ô ÖØ ÓÒ Ö ÙÒ Ð ×Ø × ÑÔÐ ¸ Ô ÖÓ ÔÖÓ Ö Ñ Ö× Ù Ó× Ñ ÒØ ÐÓ× ×Ó× ÜØÖ ÑÓ× ÖÓ¸ ÙÒÓ Ó Ó× Ð Ñ ÒØÓ׺ È Ö Ð ×Ø × Ó Ð Ñ ÒØ ÒÐ Þ ×¸ Ü ×Ø ÙÒ Ò ÓÕÙ ÑÙ Ó Ñ × × ÑÔРݸ ÓÑÓ ØÓ Ó ÐÓ × ÑÔÐ ¸ Ñ × ÓÒ¬ Ð Ö ÓÖÖ Ö Ð Ð ×Ø ÔÓÖ ÜØÖ ÑÓº ÈÓÖ Ð Ð Ó ÞÕÙ Ö Ó × Ö ÓÖÖ Ð Ö ÔÓÖ Ð Ö Ó Ð ÞÕÙ Ö º Ò Ø Ö ÓÒ¸ × Ð Ñ Ò ÜØÖ ÑÓ Ý × Ò× ÖØ Ò ÙÒ Ð × Ð ×Ø × Ö ×ÙÐØ Óº È Ö ÐÐÓ¸ × Ò ÑÓ× Ð Ñ ØÓ Ó split list(l, r)¸ Ð Ù Ð Ö Ó× Ö × Ð ×Ø × Ú × l Ý r¸ Ý Ô ÖØ ÓÒ this ÔÓÖ Ð ÒØÖÓ Ò Ó× Ô ÖØ ׸ Ð ÞÕÙ Ö ÒlÝÐ Ö Òr ¾ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink +≡ ´ µ ¾ ¾ size_t split_list(Dlink & l, Dlink & r) { size_t count = 0; while (not is_empty()) { l.append(remove_next()); ++count; if (is_empty()) break; r.insert(remove_prev()); ++count; } return count; } ÙÒ Ð ×Ø Ý ÙÒÓ ×Ù× ÒÓ Ó׸ ÔÙ × Ö ÓÒÚ Ò ÒØ Ô ÖØ ÓÒ ÖÐ Ò ÙÒ ÒÓ Ó Óº È Ö ÐÐÓ¸ × ÔÖÓÚ Ð ÙÒ ÓÒ cut list() ÙÝ ÑÔÐ ÒØ ÓÒ × Ð × Ù ÒØ ¾ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink +≡ ´ µ ¾ void cut_list(Dlink * link, Dlink * list) { list->prev = prev; // enlazar list a link (punto de corte) list->next = link; ½¿ Ë ÔÙ Ö ÕÙ Ð × ÙÒ Ó ÙÔÐ Ò Ú ÐÓ Ð ÔÖ Ñ ÖÓº
  • 109.
    2.4. Listas Enlazadas 83 prev = link->prev; // quitar de this todo lo que est´ a partir de link a link->prev->next = this; link->prev = list; // colocar el corte en list list->prev->next = list; } link this A B C D E list ÙÖ ¾º½¿ ÓÖØ ÙÒ Ð ×Ø Ò ÙÒ ÒÓ Ó Ó Ð ×ÕÙ Ñ ×Ø Ð ÓÖ ØÑÓ × ÐÙ×ØÖ Ò Ð ¬ ÙÖ ¾º½¿º cut list() Ô ÖØ ÓÒ this Ò Ð ÒÓ Ó ÙÝ Ö ÓÒ × link¸ Ð Ù Ð Ô ÖØ Ò Ö Ð Ð ×Ø thisº ÄÓ× ÒÓ Ó× Ð ÞÕÙ Ö link × ÔÖ × ÖÚ Ò Ò this¸ Ñ ÒØÖ × ÕÙ ÐÓ× Ö ×Ø ÒØ ׸ Ò ÐÙ Ó link¸ × ÓÔ Ò listº ÄÓ× Ù×Ó× Dlink ×ÓÒ × ÐÓ× Ñ ×ÑÓ× ÕÙ Ð Slink × ÖÖÓÐÐ Ó Ò Ð ×Ù ¹ × ÓÒ Ü ¾º º¾ ´Ô Ò µº ÈÓ ÑÓ× Ö ÙÒ Ð × ser ÙÒ Dlink ÔÓÖ Ö Ú ÓÒ ÔÙ Ð ¸ Ó ÖÐ Ô ÖØ ÙÒ ÒÓ Ó Ó Ð ÔÓÖ Ð Ö ÓÒ ÙÒ Dlink ÓÑÓ ØÖ ÙØÓ Ð Ð×ºÄ Ö Ò × Ò Ð Ö ×Ô ØÓ Slink × ×Ù Ú Ö× Ø Ð ¸ ÜÔÖ × ÔÓÖ Ð Ö ÕÙ Þ Ð × ÓÔ Ö ÓÒ × ÕÙ ÑÓ× ×ØÙ Ó¸ Ð × Ù Ð × × Ö Ò Ñ × Ð× × ÖÖÓÐÐ Ö ÕÙ Ð × ÓÔ Ö ÓÒ × Slinkº Ð Ù Ð ÕÙ ÓÒ Slink¸ Ô Ö × ØÙ ÓÒ × Ò ÕÙ × Ù× Ò Ö ×ØÖÓ× ÕÙ ÓÒØ Ò Ò Dlink¸ × Ö ÕÙ Ö Ò Ñ ÖÓ× ÕÙ Ò Ö Ò ÙÒ ÓÒ × ÓÒÚ Ö× ÓÒ ÙÒ Dlink ÙÒ Ð × ÕÙ ÓÒØ Ò ÙÒ ØÖ ÙØÓ Dlinkº Ò ×Ø × ÒØ Ó¸ Ý Ó× ÔÓ× Ð × ÔÖÓ Ð ×¸ ÙÒÕÙ ÒÓ Ò Ö Ð × ÓÒÚ Ö× ÓÒ ÙÒ Ð × × ÑÔÐ Ó ÓÒÚ Ö× ÓÒ ÙÒ Ð × Ô Ö Ñ ØÖ Þ º ר × ÔÓ× Ð × × Ò ÐÓ Ò Ò ÐÓ× × Ù ÒØ × Ñ ÖÓ× ¿ Ñ ÖÓ× ÓÒÚ Ö× ÓÒ Dlink Ð × ¿ ≡ ´ µ # define DLINK_TO_TYPE(type_name, link_name) inline static type_name * dlink_to_##type_name(Dlink * link) { type_name * ptr_zero = 0; size_t offset_link = reinterpret_cast<size_t>(&(ptr_zero->link_name)); char * address_type = reinterpret_cast<char*>(link) - offset_link; return reinterpret_cast<type_name *>(address_type); } # define LINKNAME_TO_TYPE(type_name, link_name) inline static type_name * link_name##_to_##type_name(Dlink * link) {
  • 110.
    84 Cap´ ıtulo 2. Secuencias type_name * ptr_zero = 0; size_t offset_link = reinterpret_cast<size_t>(&(ptr_zero->link_name)); char * address_type = reinterpret_cast<char*>(link) - offset_link; return reinterpret_cast<type_name *>(address_type); } ¬Ò × DLINK TO TYPE¸ Ò Ú Ö Ù× º LINKNAME TO TYPE¸ Ù× Ò ÙÒ × ¾ Ò º ÌÓ Ó× ÐÓ× Ñ ÖÓ× Ò Ö Ò ÙÒ ÙÒ ÓÒ ÓÒÚ Ö× ÓÒ ÕÙ ÓÒÚ ÖØ ÙÒ ÔÙÒØ ÖÓ link Ø ÔÓ Dlink Ò ÙÒ ÔÙÒØ ÖÓ ÙÒ Ð × ÕÙ ÓÒØ Ò Ð Dlinkº Ð Ñ ÖÓ DLINK TO TYPE Ò Ö ÙÒ ÙÒ ÓÒ Ò Ö Ð ÓÒ ÒÓÑ Ö dlink to type()º Ð Ñ ÖÓ LINKNAME TO TYPE Ö ÙÒ Ô Ö Ñ ØÖÓ ÐÐ Ñ Ó link name¸ Ð Ù Ð Ö ÓÖÖ ×¹ ÔÓÒ Ö Ü Ø Ñ ÒØ ÓÒ Ð ÒÓÑ Ö Ð ÑÔÓ ÒØÖÓ Ð Ð × º Ä Ö ÞÓÒ × Ö ×Ø ÙÒ ÓÒ × ÕÙ Ð Ô ÖÑ Ø Ð Ù×Ù Ö Ó ×Ø ÒØÓ× ÒÓÑ Ö × ÙÒ ÓÒ × Ô Ö ×Ø ÒØÓ× ÒÓÑ Ö × ÑÔÓ× ×ØÓ × Ò ×Ô Ò× Ð Ò ÐÓ× ×Ó× Ò ÕÙ Ð Ð × ÓÒØ Ò Ó× Ó Ñ × ÒÐ × Ó Ð ×º ÄÓ× Ñ ÖÓ× DLINK TO TYPE Ý LINKNAME TO TYPE Ò ÙØ Ð Þ Ö× ÒØÖÓ Ð Ð × ÕÙ Ù× Ð Ø ÔÓ Dlinkº Iterador de Dlink Dlink ÜÔÓÖØ ÙÒ Ø Ö ÓÖ ´Ú Ö Ü ¾º¿ ´Ô Ò ¾µµ ÙÝÓ ×ÕÙ Ñ × ÔÖ × ÒØ ÓÑÓ × Ù Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink +≡ ´ µ ¾ class Iterator { ØÖ ÙØÓ× Dlink::Iterator Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ Dlink::Iterator }; È Ö Ñ ÒØ Ò Ö Ð ×Ø Ó Ð Ø Ö ÓÖ Ö ÕÙ Ö ÑÓ× Ó× Ñ Ñ ÖÓ× ØÖ ÙØÓ× Dlink::Iterator ≡ ´ µ Dlink * head; Dlink * curr; × Ð ÒÓ Ó head Ö Ð Ð ×Ø º curr × Ð ÒÓ Ó ØÙ Ð Ð Ø Ö ÓÖº À Ý Ú Ö × Ñ Ò Ö × ÓÒרÖÙ Ö ÙÒ Ø Ö ÓÖ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ Dlink::Iterator ≡ ´ µ Iterator(Dlink * head_ptr) : head(head_ptr), curr(head->get_next()) { // Empty } Iterator(const Iterator & itor) : head(itor.head), curr(itor.curr) { // Empty } ÍÒ Ø Ö ÓÖ ÔÙ × Ò Ö× Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ Dlink::Iterator +≡ ´ µ Iterator & operator = (const Iterator & itor) { head = itor.head; curr = itor.curr; return *this;
  • 111.
    2.4. Listas Enlazadas 85 } ÍÒ Ø Ö ÓÖ ÔÙ Ö ÙØ Ð Þ Ö× ¸ ÐÓ ÕÙ Ö ÕÙ Ö ÙÒ ÓÒ × Ö Ò ÓÒ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ Dlink::Iterator +≡ ´ µ void reset_first() { curr = head->get_next(); } void reset_last() { curr = head->get_prev(); } reset first() ÔÓ× ÓÒ Ð Ø Ö ÓÖ ×Ó Ö Ð ÔÖ Ñ Ö Ð Ñ ÒØÓº reset last() ÔÓ× ÓÒ Ð Ø Ö ÓÖ ×Ó Ö Ð ÙÐØ ÑÓ Ð Ñ ÒØÓº Ü ×Ø Ò × ØÙ ÓÒ × ×Ô Ð × Ò Ð × Ù Ð × × × Ò Ð Þ Ö ÙÒ Ø Ö ÓÖ Ô ÖØ Ö ÙÒ Ð Ñ ÒØÓ ØÙ Ð Ý ÓÒÓ Ó Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ Dlink::Iterator +≡ ´ µ void set(Dlink * new_curr) { curr = new_curr; } void reset(Dlink * new_head) { head = new_head; curr = head->get_next();; } set() ÓÐÓ Ð Ø Ö ÓÖ ÙÒ ÒÙ ÚÓ ÒÓ Ó ØÙ и Ñ ÒØÖ × reset() ÓÐÓ Ò Ð Ø Ö ÓÖ ÙÒ ÒÙ Ú Ð ×Ø º Ð Ð Ñ ÒØÓ ØÙ Ð Ð Ø Ö ÓÖ × Ý × Ú Ö ¬ Ñ ÒØ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ Dlink::Iterator +≡ ´ µ bool has_current() const { return curr != head; } Dlink * get_current() { return curr; } bool is_in_first() const { return curr == head->next; } bool is_in_last() const { return curr == head->prev; } È Ö Ú ÒÞ Ö Ð Ø Ö ÓÖ ÙØ Ð Þ ÑÓ× Ð × × Ù ÒØ × ÔÖ Ñ Ø Ú × Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ Dlink::Iterator +≡ ´ µ void prev() { curr = curr->get_prev(); } void next() { curr = curr->get_next(); }
  • 112.
    86 Cap´ ıtulo 2. Secuencias Ñ ÒÙ Ó ÔÙ Ò ÓÑ Ò Ö× Ø Ö ÓÖ × Ò ÙÒ for ÕÙ × Ñ Ò Ð Ø Ö ÓÒ ×Ó Ö ÙÒ ÖÖ ÐÓº ÓÑÓ ÙÒ Ð ×Ø ÒÓ Ø Ò ×Ó Ö ØÓ¸ Ð ÓÒ ÓÒ Ø Ö ÓÒ ÒÓ ×Ö ÙÒ ÓÑÔ Ö ÓÒ ÔÓÖ ÔÓ× ÓÒ Ð Ø ÔÓ i < nº Ò ÙÒ Ð ×Ø ݸ Ò Ò Ö Ð¸ Ô Ö × Ù Ò × ÕÙ × Ñ Ò ÔÙÐ Ò ÓÒ Ø Ö ÓÖ ×¸ Ð ÓÑÔ Ö ÓÒ × Ö ÒØÖ Ø Ö ÓÖ ×º ÈÙ ×ØÓ ÕÙ ÒÓ × ÔÙ ÓÒÓ Ö Ð ÔÓ× ÓÒ ÒØÖÓ Ð × Ù Ò Ô Ö ØÓ × Ð × × ØÙ ÓÒ ×¸ ÒÓ × ÔÓ× Ð ÑÔÐ Ö ÐÓ× ÓÑÔ Ö ÓÖ × Ö Ð ÓÒ Ð × <, <=, >, >=¸ Ô ÖÓ × × ÔÙ ÓÑÔ Ö Ö ×Ù Ù Ð Ó Ö Ò Ø Ð ÓÑÓ × Ù Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ Dlink::Iterator +≡ ´ µ bool operator == (const Iterator & it) const { return curr == it.curr; } bool operator != (const Iterator & it) const { return curr != it.curr; } ÍÒ ×Ø ÐÓ ØÖ ÓÒ Ð Ù×Ó Ð ÓÑÔ Ö ÓÒ ÒØÖ Ø Ö ÓÖ × × ÐÙ×ØÖ Ò ×Ø ѹ ÔÐÓ for (Dlink::Iterator curr(list); curr != end; curr.next()) ÓÒ end × ÙÒ Ø Ö ÓÖ ×Ó Ö Ð Ð ×Ø list ÔÙÒØ Ò Ó Ð ¬Ò к ר × Ð ×Ø ÐÓ Ð Ð ÓØ ר Ò Ö stdc++º end × ÕÙ Ú Ð ÒØ Dlink::Iterator end(list); list.reset_last(); list.next(); × ÔÓ× Ð Ò× ÖØ Ö Ö ×Ô ØÓ Ð Ð Ñ ÒØÓ ØÙ Ð Ð Ø Ö ÓÖº È Ö ÐÐÓ¸ ר ÓÒ ÒÚÓ Ö ×Ó Ö Ð Ð Ñ ÒØÓ ØÙ Ð Ù ÐÕÙ Ö Ð × ÔÖ Ñ Ø Ú × Ò× Ö ÓÒ insert() Ó append()º Ü ×Ø Ò × ØÙ ÓÒ × Ò Ð × ÕÙ × Ö ÕÙ Ö Ð Ñ Ò Ö Ð Ð Ñ ÒØÓ ØÙ Ð Ð Ø Ö ÓÖº Ò ×Ø ×Ó¸ ÒÓ × ÔÓ× Ð ØÙ Ö del() ×Ó Ö Ð ÒÓ Ó ØÙ и ÔÙ × ÔÓ Ö Ô Ö Ö× Ð ×Ø Ó Ð Ø Ö ÓÖº È Ö ×ÓÐÚ ÒØ Ö ×Ø × ØÙ ÓÒ¸ Ð Ð × Dlink::Iterator ÜÔÓÖØ ÙÒ ÙÒ ÓÒ Ð Ñ Ò ÓÒ ×Ó Ö Ð ÒÓ Ó ØÙ Ð ÕÙ Ð Ø Ö ÓÖ Ò Ð ÒÓ Ó ×Ù ×ÓÖ Ð Ð Ñ Ò Ó Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ Dlink::Iterator +≡ ´ µ Dlink * del() { Dlink * current = get_current(); // obtener nodo actual next(); // avanzar al siguiente nodo current->del(); // eliminar de la lista antiguo nodo actual return current; } Ö ØÓÖÒ Ð ÒÐ Ð Ñ Ò Ó Ñ Ò Ö Ø Ð ÕÙ Ð Ð ÒØ ÔÙ del() ×ÔÓÒ Ö Ð Ò Ð ÓÖÑ ÕÙ ÔÖ ¬ Ö º ÓÑÓ ÑÔÐÓ Ù×Ó Dlink::Iterator ÓÒ× Ö ÑÓ× Ð × Ù ÒØ Ñ ØÓ Ó Ñ Ñ ÖÓ× ÔÙ Ð Ó× Dlink +≡ ´ µ void remove_all_and_delete() { for (Iterator itor(this); itor.has_current(); delete itor.del()) ; } ר Ñ ØÓ Ó Ð Ñ Ò ØÓ Ó× ÐÓ× ÒÓ Ó× Ý ×ÙÑ ÕÙ Ð Ñ ÑÓÖ ÒÓ Ó Ù × Ò Ñ ÒØ newº
  • 113.
    2.4. Listas Enlazadas 87 2.4.8 El TAD Dnode<T> (nodo doble) Ò ÙÒ Ò Ú Ð ×ÙÔ Ö ÓÖ Ö ×Ô ØÓ Dlink¸ Ð Ì Dnode<T> ÑÓ Ð Þ ÙÒ ÒÓ ÓÔ ÖØ Ò ÒØ ÙÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ Ö ÙÐ Öº Dnode<T> × ¬Ò ÑÔÐ ÒØ Ò Ð Ö ÚÓ ØÔÐ ÒÓ ºÀ ÙÝ ×ØÖÙ ØÙÖ × Ð × Ù ÒØ ØÔÐ ÒÓ ºÀ ≡ template <typename T> class Dnode : public Dlink { Ñ ØÓ Ó× ÔÖ Ú Ó× Dnode<T> Ñ ØÓ Ó× ÔÙ Ð Ó× Dnode<T> }; ¬Ò × Dnode¸ Ù× Ò ÙÒ × ¸ ¼ ¸ ¾ß ¸ ½ ß ¸ ½ ¸½ ¸ ¼ ¸ ¼ ¸ Ò ¾º Dnode<T> × ÙÒ Dlink ÔÙ Ð Ó ÔÓÖ Ö Ú ÓÒº Ä ÙÒ ÖÒ Ö× Ò ÕÙ Dnode<T> ÐÑ Ò ÙÒ Ð Ñ ÒØÓ Ø ÔÓ T Ñ ØÓ Ó× ÔÖ Ú Ó× Dnode<T> ≡ ´ µ mutable T data; ÄÓ× Ñ ØÓ Ó× Dlink ÕÙ Ö ØÓÖÒ Ò ÔÙÒØ ÖÓ× Dlink* Ò ×Ó Ö Ö Ö× Ô Ö ÕÙ Ö ØÓÖÒ Ò ÔÙÒØ ÖÓ× Ø Ô Ó× Dnode<T>* Ñ ØÓ Ó× ÔÙ Ð Ó× Dnode<T> ≡ ´ µ Dnode<T> *& get_next() { return reinterpret_cast<Dnode<T>*&>(next); } Dnode<T> *& get_prev() { return reinterpret_cast<Dnode<T>*&> (prev); } Dnode<T>* remove_prev() { return static_cast<Dnode<T>*>(Dlink::remove_prev()); } Dnode<T>* remove_next() { return static_cast<Dnode<T>*>(Dlink::remove_next()); } Í× × Dnode º Ä ÙÒ ÙÒ ÓÒ ×ØÓ× Ñ ØÓ Ó× × ØÙ Ö Ð ÓÒÚ Ö× ÓÒ Dnode<T>º ÐÑ Ò Ó ÐÓ× ÒÐ × × ÑÔÐ ÒØ ÔÓÖ Ð Ñ ØÓ Ó Ð Ð × × Dlinkº Ð ×Ó Ð ØÓ × Ö Ð Þ ÔÓÖ Ñ ØÓ Ó× ÔÙ Ð Ó× Dnode<T> +≡ ´ µ T & get_data() { return data; } ÍÒ ÔÙÒØÓ ×ÙÑ Ñ ÒØ ÑÔÓÖØ ÒØ × Ð Ø ÔÓ ØÓ Dnode<T> ר × ÜÔÓÖØ Ñ ÒØ Ð × Ù ÒØ Ð Ö ÓÒ Ñ ØÓ Ó× ÔÙ Ð Ó× Dnode<T> +≡ ´ µ typedef T dnode_type; ר Ð Ö ÓÒ Ô ÖÑ Ø ÕÙ ÔÖÓ Ö Ñ × Ò Ö Ó× ÓÒÓÞ Ò Ð Ø ÔÓ ØÓ Dnode<T>º ÈÓÖ ÑÔÐÓ¸ × × Ø Ò ÙÒ Dnode<T> Ó Ð Ø ÔÓ Ò Ö Ó Node¸ ÒØÓÒ × ÙÒ Ö Ñ ÒØÓ ÔÖÓ Ö Ñ ÔÓ Ö × Ö typename Node::dnode_type data; Ð Ù Ð Ð Ö ÙÒ Ú Ö Ð ÒÓÑ Ö data Ð Ø ÔÓ ÒÚÓÐÙ Ö Ó Ò Node¸ Ð Ù Ð × Ð Ñ ×ÑÓ Ø ÔÓ Ò Ö Ó Tº À Ý ÙÒ Ñ ØÓ Ó ÙÝÓ Ù×Ó × Ü Ô ÓÒ Ð¸ Ô ÖÓ ÕÙ ÔÙ × Ö ÜØÖ ÓÖ Ò Ö Ñ ÒØ ÙØ Ð Ò ÖØ × Ö ÙÒר Ò × Ñ ØÓ Ó× ÔÙ Ð Ó× Dnode<T> +≡ ´ µ static Dnode * data_to_node(T & data) {
  • 114.
    88 Cap´ ıtulo 2. Secuencias Dnode * zero = 0; long offset = (long) &(zero->data); char * addr = (char*) (&data); return (Dnode*) (addr - offset); } Í× × Dnode º Iterador de Dnode<T> Dnode<T> ÜÔÓÖØ ÙÒ Ø Ö ÓÖ ÙÝ × Ñ ÒØ × ÒØ Ð Dlink::Iterator º ÈÙ ×ØÓ ÕÙ Ð ×Ø Ó Ý ÓÒØÖÓÐ Ð Ø Ö ÓÖ Ý ×Ø ÑÔÐ ÒØ Ó ÔÓÖ Dlink::Iterator ¸ Ð ×Ô ¬ ÓÒ Dnode<T> ÁØ Ö ØÓÖ ×ÓÐÓ × Ö Ñ Ø Ð ×Ó Ö Ö ÐÓ× ÓÒרÖÙ ØÓÖ × Ý Ð Ó Ø Ò ÓÒ Ð Ð Ñ ÒØÓ ØÙ к 2.4.9 El TAD Dlist<T> (lista circular doblemente enlazada) Ò Ð × Ù ÒØ Ò Ú Ð Ñ Ò Ó Ð ×Ø × Ó Ð Ñ ÒØ ÒÐ Þ ×¸ Ò ÓÒØÖ ÑÓ× Ð Ø ÔÓ Dlist<T>¸ Ð Ù Ð Ñ Ò ÙÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ ¸ Ö ÙÐ Ö¸ ÓÒ ÒÓ Ó Ö¸ ÒÓ Ó× Ø ÔÓ Dnode<T>º Dlist<T> × ¬Ò ÑÔÐ ÒØ Ò Ð Ö ÚÓ ØÔÐ Ð ×ØºÀ ¸ ÙÝ ×ØÖÙ ØÙÖ × Ð × Ù ÒØ ØÔÐ Ð ×ØºÀ ≡ ¬Ò ÓÒ ÒÓ Ó× Ó Ð × ¼ ÒÚÓÐØÓÖ Ó ÒÓ Ó× Ó Ð × ¼ Ä ×Ø Ó Ð Ò Ö ½ Ä ×Ø × Ó Ð × ÜØÖ ÑÓ× ½ 2.4.9.1 El problema de los destructores virtuales Ò Ð Ñ ×ÑÓ ×Ø ÐÓ ÕÙ Slist<T>¸ Ð Ð × Dlist<T> ÜÔÓÖØ Ö ÙÒ ×Ù Ð × Dlist<T>::Node ÕÙ ¬Ò ÐÓ× ÒÓ Ó× Dlist<T>º × Ñ ×ÑÓ¸ ÙÒ Ù×Ù Ö Ó Dlist<T> ÔÙ Ñ Ò Ö ÒÓ Ó× ÓÑÔÐ Ó× Ñ ÒØ Ö Ú ÓÒ Dlist<T>::Node ÔÓÖ ÑÔÐÓ¸ ÔÓ Ö ÜÔÖ × Ö ÐÓ × Ù ÒØ class Window : public Dlist<int>::Node { /* ... */ }; Ð Ñ ×ÑÓ ÑÓ Ó ÕÙ Slist<T>¸ Ð Ð ÒØ ÔÙ ÙØ Ð Þ Ö Òר Ò × Window Ò ØÓ × Ð × ÔÖ Ñ Ø Ú × Dlist<T>º Window ÔÙ × Ö ÙÒ Ø ÔÓ ÓÑÔÐ Ó ÕÙ Ö Ö Ò ÓØÖ × ×ØÖÙ ØÙÖ × ØÓ× Ý ÕÙ Ñ Ò Ñ ÑÓÖ º Ñ ÑÓÖ × Ö Ð Ö ÔÓÖ Ð ×ØÖÙ ØÓÖ Windowº È Ö ÕÙ Ö Ú ÓÒ × Dlist<T>::Node ÔÙ Ò ÒÚÓ Ö Ð ×ØÖÙ ØÓÖ Window¸ × Ò ×Ô Ò× Ð ÕÙ Dlist<T>::∼Node × Ð Ö Ó Ú ÖØÙ Ðº Ë Dlist<T>::∼Node Ù × Ú ÖØÙ Ð¸ ÒØÓÒ × ÐÓ× ×ØÖÙ ØÓÖ × Òר Ò × Ö Ú × Dlist<T>::Node × Ö Ò ÒÚÓ Ó× Ý Ð × × Ñ ÒØ × ÐÓ× ×ØÖÙ ØÓÖ × Ò Ð × Ð × × Ö Ú × × Ö Ò Ö ×Ô Ø ×º ÈÓÖ ÓØÖ Ô ÖØ ¸ Ô Ö ÕÙ Dlist<T>::∼Node × Ú ÖØÙ Ð × Ö ÕÙ Ö ÙÒ ÔÙÒØ ÖÓ Ð ×ØÖÙ ØÓÖ Ð Ð × Ö Ú ¸ ÐÓ ÕÙ ÑÔÐ ÙÒ ×Ô Ö Ó Ò ×Ô Ó × ÒÓ × Ò × Ö Ó ÒÚÓ Ö Ð ×ØÖÙ ØÓÖ Ð Ð × Ö Ú º ÓÑÓ Ð × Ð ×Ø × ÒÐ Þ × ÔÙ Ò × Ö Ö ØÖ Ö Ñ ÒØ Ö Ò ×¸ ÙÒ ×ØÖÙ ØÓÖ Ú ÖØÙ Ð ÒÒ × Ö Ó ÔÙ ÖÖ Ö ÙÒ Óר Ò ×Ô Ó ÓÒ× Ö Ð º ÑÓ׸ Ô٠׸ Ò ÓÒØÖ Ö ÙÒ ×ÓÐÙ ÓÒ ÕÙ
  • 115.
    2.4. Listas Enlazadas 89 Dlink Dlink::Iterator #prev: Dlink * +Iterator() #next: Dlink * +Iterator(in head_ptr:Dlink*) +Dlink() +Iterator(in head_ptr:Dlink*,in curr_ptr:Dlink*) +Dlink(link:const Dlink&) +Iterator(in Iterator:itor) +reset(): void +operator =(in itor:Iterator): Iterator& +isEmpty(): bool +exporta +operator =(in itor:Iterator): Iterator +insert(node:Dlink*) +reset_first(): void +append(node:Dlink*) +reset_last(): void +get_next(): Dlink* +get_current(): Dlink* +del(): void +has_current(): bool +remove_prev(): Dlink* +prev(): void +remove_next(): Dlink* +next(): void T:class Dnode Node:<template <class> class T:class +get_next(): Dnode<T>*& +get_prev(): Dnode<T>*& +exporta MetaDlistNode +remove_prev(): Dnode<T>*& T:class +remove_next(): Dnode<T>*& Dnode::Iterator +Dnode() +get_current(): Dnode<T>* T:class +Dnode(_data:const T&) +del(): Dnode<T> Node_Type:template <class> class +operator =(_data:const T&): Dnode& GenDlist +get_data(): T& +exporta +get_first(): Node* +get_last(): Node* +remove_first(): Node* +remove_last(): Node* T:class GenDlist<T>::Iterator +get_current(): Dnode<T>* +con T:class GenDlist<Dlist_Node, T> +del(): Dnode<T> Dlist_Node Especialización GenDlist<Dlist_Node_Vtl, T> Especialización +con T:class Dlist_Node_Vtl class T: T:class DynDlist T:class DlistVtl +DynDlist() +exporta Dlist Con nodos virtuales +insert(_data:const T&): void T:class +append(_data:const T&): void DynDlist<T>::Iterator +get_first(): T& +get_last(): T& +get_current(): T +remove_first(): T +del() +remove_last(): T +insert(in item:T) +~DynDlist() +append(in item:T) ÙÖ ¾º½ ÖÑ Ò Ö Ð ÍÅÄ Ð × Ð × × ALEPH Ô Ö Ð ×Ø × ÒÐ Þ × ÓÐ×
  • 116.
    90 Cap´ ıtulo 2. Secuencias Ð Ô ÖÑ Ø Ð Ù×Ù Ö Ó ÙØ Ð Þ Ö Ñ × ÐØ ÖÒ Ø Ú × × ÙÒ ×Ù ÓÒÚ Ò Ò º × Ö¸ ÕÙ Ð × Ù× Ð ×Ø × ÒÓ Ó× ÓÒ ×ØÖÙ ØÓÖ × Ú ÖØÙ Ð × Ó ÒÓº ÍÒ ×ÓÐÙ ÓÒ ×Ø ÔÖÓ Ð Ñ ÓÒ× ×Ø Ò ÔÖÓÚ Ö Ó× Ð × × Ö ÒØ × ÒÓ Ó× ¼ ¬Ò ÓÒ ÒÓ Ó× Ó Ð × ¼ ≡ ´ µ template <typename T> class Dlist_Node : public Dnode<T> { Dlist_Node() : Dnode<T>() { /* Empty */ } Dlist_Node(const T & _data) : Dnode<T>(_data) { /* Empty */ } }; template <typename T> class Dlist_Node_Vtl : public Dlist_Node<T> { Dlist_Node_Vtl() : Dlist_Node<T>() { /* Empty */ } virtual ~Dlist_Node_Vtl() { /* Empty */ } Dlist_Node_Vtl(const T & _data) : Dlist_Node<T>(_data) { /* Empty */ } }; Í× × Dnode º Ë × Ö ÕÙ Ö ÙÒ Ð ×Ø ÙÝÓ× ÒÓ Ó× ÒÚÓÕÙ Ò ÐÓ× ×ØÖÙ ØÓÖ × Ð × Ð × × Ö Ú ×¸ ÒØÓÒ × Ð Ð ÒØ ÙØ Ð Þ ÒÓ Ó× Ø ÔÓ Dlist Node Vtlº Ð Ñ ×ÑÓ ÑÓ Ó¸ × Ð Ð ÒØ ÒÓ Ö ÕÙ Ö ÒÚÓ Ö ÐÓ× ×ØÖÙ ØÓÖ ×¸ ÒØÓÒ × ×Ø ÙØ Ð Þ ÒÓ Ó× Ø ÔÓ Dlist Node ÓÒ Ð ÓÒ× Ù ÒØ ÓÖÖÓ Ò ×Ô Óº ÓÒ× Ö ÑÓ× ÙÒ ÔÖ Ñ Ø Ú ÓÖ Ò Ñ ÒØÓ Ò Ö ×Ó Ö Ð ×Ø × ÒÐ Þ × template <class Node, typename Key> void ordenar(Node * head_list) { /* ... */ Node * node = head_list->get_next(); /* ... */ } ÍÒ Ð ÓÖ ØÑÓ ÓÖ Ò Ñ ÒØÓ Ö ÕÙ Ö Ö ÓÖÖ Ö ÒÓ Ó× Ð Ð ×Ø º ×ØÓ × ØÖ Ú × get next() Ý get prev()ºÙ ÐÕÙ Ö Ø ÔÓ Ð × Ö Ú Dlist Node ÔÙ Ò ÙØ ¹ Ð Þ Ö× ÓÑÓ ÒÓ Óº Ë Ò Ñ Ö Ó¸ ÔÙ ×ØÓ ÕÙ get next() Ö ØÓÖÒ ÙÒ ÔÙÒØ ÖÓ Dlist Node¸ Ð ÓÑÔ Ð ÓÖ Ö Þ Ö ØÓ × Ð × Ð Ò × ÓÒ × × Ò Ð Ö ×ÙÐØ Ó get next() ÙÒ ÔÙÒ¹ Ø ÖÓ ÙÒ Ð × Ö Ú Dlist Nodeº È Ö Ú Ø Ö Ð ÔÖÓ Ð Ñ ÒØ Ö ÓÖ¸ Ö ÕÙ Ö ÑÓ× ÕÙ get next() Ý get prev() Ö ØÓÖÒ Ò ÔÙÒØ ÖÓ× Ð Ð × Ö Ú Ý ÒÓ Ð Ð × Dlist Nodeº ÍÒ ×ÓÐÙ ÓÒ × ÙØ Ð Þ Ö ÙÒ Ð × ÒÚÓÐØÓÖ Ð Ð × ÒÓ Ó ÙØ Ð Þ ÕÙ ØÙ Ð × ÓÒÚ Ö× ÓÒ × Ý Ö ØÓÖÒ ÔÙÒØ ÖÓ× Ð Ø ÔÓ ÓÖÖ ØÓº Ì Ð Ð × Ø Ò Ð × Ù ÒØ ×Ô ¬ ÓÒ ¼ ÒÚÓÐØÓÖ Ó ÒÓ Ó× Ó Ð × ¼ ≡ ´ µ template <template <class> class Node, typename T> class MetaDlistNode : public Node<T> { MetaDlistNode() { /* Empty */ } MetaDlistNode(const T& _data) : Node<T>(_data) { /* Empty */ } MetaDlistNode(const MetaDlistNode<Node, T> & node) : Node<T>(node) { /* Empty */ }
  • 117.
    2.4. Listas Enlazadas 91 MetaDlistNode<Node, T> *& get_next() { return reinterpret_cast<MetaDlistNode<Node, T> *&>(Node<T>::get_next()); } MetaDlistNode<Node, T> *& get_prev() { return reinterpret_cast<MetaDlistNode<Node, T> *&>(Node<T>::get_prev()); } }; MetaDlistNode ÒÓ Ø Ò Ñ Ñ ÖÓ× ØÓ Ò ÙÒ ÓÒ × Ú ÖØÙ Ð ×º Ä Ð × × Ö Ú ÔÙ Ð Ñ ÒØ ÙÒ Ð × Ô Ö Ñ ØÖÓ Node<T> ÕÙ × Ö × Ò ÒØ Dlist Nodeº Ò ×Ò ¸ Ð ÖÓÐ MetaDlistNode × Ö ÒØ Þ Ö ÕÙ Ð × ÙÒ ÓÒ × get next() Ý get prev() × ÑÔÖ Ö ØÓÖÒ Ò ÔÙÒØ ÖÓ× Ð Ñ ×ÑÓ Ø ÔÓº ÐÑ Ò Ó Ð ×Ø × × Ö Ð Þ ¸ ÒØÓÒ ×¸ Ò ÙÒ ÓÒ ÒÓ Ó× Ø ÔÓ MetaDlistNode ½ Ä ×Ø Ó Ð Ò Ö ½ ≡ ´ µ template <template <class> class Node_Type, typename T> class GenDlist : public MetaDlistNode<Node_Type, T> { Å Ñ ÖÓ× ÔÙ Ð Ó× Ò Ð ×Ø ½ }; ¬Ò × GenDlist¸ Ù× Ò ÙÒ × ½ Ò ¾º GenDlist<T> Ö Ô ÖØ ÒØ Ö Þ ÑÔÐ ÒØ ÓÒ Dnode<T>º Ò Ò ÙÖ ¸ Ð ÖÒ ÕÙ this × Ð ÒÓ Ó Ö Ð Ð ×Ø º ÓÖ ÓÒ Ö Ø ÑÓ× Ó× ×Ô Ð¹ Þ ÓÒ × GenDlist<T> ½ Ä ×Ø × Ó Ð × ÜØÖ ÑÓ× ½ ≡ ´ µ template <typename T> class Dlist : public GenDlist<Dlist_Node, T> { typedef typename GenDlist<Dlist_Node, T>::Node Node; typedef typename GenDlist<Dlist_Node, T>::Iterator Iterator; }; template <typename T> class DlistVtl : public GenDlist<Dlist_Node_Vtl, T> { typedef typename GenDlist<Dlist_Node_Vtl, T>::Node Node; typedef typename GenDlist<Dlist_Node_Vtl, T>::Iterator Iterator; }; Í× × GenDlist ½ º Ë Ð Ù×Ù Ö Ó Ö ÕÙ Ö Ñ Ò Ö ÒÓ Ó× ÓÒ ÒÚÓ ÓÒ ×ØÖÙ ØÓÖ × Ð × × Ö Ú × ÐÓ× ÒÓ Ó׸ ÒØÓÒ × ×Ø ÙØ Ð Þ Ð Ð × DlistVtl<T> ÐÓ ÓÒØÖ Ö Ó ÙØ Ð Þ Dlist<T>º Dlist<T> Ý DlistVtl<T> ×ÓÒ Ñ Ö × ×Ô Ð Þ ÓÒ × GenDlist<T>º ÈÙ ×ØÓ ÕÙ Ý Ö Ú ÓÒ ÔÙ Ð ¸ ÐÓ× Ñ ØÓ Ó× ×Ø Ò ÓÒØ Ò Ó× Ò GenDlist<T>º GenDlist<T> ÙØ Ð Þ ÒÓ Ó× Ø ÔÓ Node Type<T>º ×ØÓ × Ñ Ò Ö × ÑÔÐ Ñ ÒØ ½ Å Ñ ÖÓ× ÔÙ Ð Ó× Ò Ð ×Ø ½ ≡ ´½µ ¾ typedef MetaDlistNode<Node_Type,T> Node;
  • 118.
    92 Cap´ ıtulo 2. Secuencias Ä × ÙÒ ÓÒ × GenDlist<T> × Ñ Ò Ò¸ ÒØÓÒ ×¸ Ò ÙÒ ÓÒ GenDlist<T>::Nodeº ÈÙ ×ØÓ ÕÙ GenDlist<T> Ö Ú ÔÙ Ð Ñ ÒØ Node Type<T>¸ GenDlist<T> ÔÓ× ØÖ Ú × this ÙÒ ÒÓ Ó Öº À Ý Ó× Ñ Ò Ö × Ò× ÖØ Ö Ò GenDlist<T> ÔÓÖ Ð Ö ÒØ Ó ÔÓÖ Ð ¬Ò к ÄÓ× Ñ ØÓ Ó× ×Ø Ò ÑÔÐ ÒØ Ó× ÔÓÖ ÐÓ× Ñ Ñ ÖÓ× insert() Ý append() Ô ÖØ Ò ÒØ × Dnode<T>º È Ö Ð ÓÒ×ÙÐØ ¸ ÑÓ× ÒרÖÙÑ ÒØ Ö ÙÒ Ô ÖØ Ò GenDlist<T> ÕÙ Ö Ð Ð ÓÒÚ Ö× ÓÒ GenDlist::Nodeº ÓÒ×ÙÐØ ר ÔÓÖ Ð × × Ù ÒØ × ÙÒ ÓÒ × ¾ Å Ñ ÖÓ× ÔÙ Ð Ó× Ò Ð ×Ø ½ +≡ ´½µ ½ ¾ Node * get_first() { return this->get_next(); } Node * get_last() { return this->get_prev(); } ÈÙ ×ØÓ ÕÙ Ð Ð Ñ Ò ÓÒ Ö ØÓÖÒ Ð ÒÓ Ó Ð Ñ Ò Ó¸ ר Ø Ñ Ò Ö ÕÙ Ö ÓÒÚ Ö× ÓÒ GenDlist::Node ¾ Å Ñ ÖÓ× ÔÙ Ð Ó× Ò Ð ×Ø ½ +≡ ´½µ ¾ ¾ Node * remove_first() { Node* retValue = this->get_next(); retValue->del(); return retValue; } Node * remove_last() { Node* retValue = this->get_prev(); retValue->del(); return retValue; } 2.4.9.2 Iterador de Dlist<T> Ð Ù Ð ÕÙ Dlink Ý Dnode<T>¸ GenDlist<T> ÜÔÓÖØ ÙÒ ×Ù Ð × ØÖ¹ ÓÖ GenDlist<T>::Iterator ÙÝ ÑÔÐ ÒØ ÓÒ × ×Ô ¬ ÓÑÓ × Ù ¾ Å Ñ ÖÓ× ÔÙ Ð Ó× Ò Ð ×Ø ½ +≡ ´½µ ¾ class Iterator : public Node::Iterator { Iterator(GenDlist<Node_Type, T> & list) : Dnode<T>::Iterator(&list) { } Iterator() : Dnode<T>::Iterator() { /* empty */ } Iterator(const Iterator & it) : Dnode<T>::Iterator(it) { /* Empty */ } Iterator & operator = (const Iterator & it) { Dnode<T>::Iterator::operator = (it); return *this; } Node * get_current() {
  • 119.
    2.4. Listas Enlazadas 93 return reinterpret_cast<Node*>(Dnode<T>::Iterator::get_current()); } Node * del() { return static_cast<Node*>(Dnode<T>::Iterator::del()); } }; Í× × Dnode Ò GenDlist ½º 2.4.10 El TAD DynDlist<T> Ä × Ð × × Dnode<T> Ý Dlist<T> ×ÓÒ ×Ù¬ ÒØ Ñ ÒØ Ú Ö× Ø Ð × ÓÑÓ Ô Ö Ö Ð Þ Ö ÔÐ ¹ ÓÒ × ÓÑÔÐ × ÕÙ Ö ÕÙ Ö Ò Ð ×Ø × Ó Ð Ñ ÒØ ÒÐ Þ ×º Ë Ò Ñ Ö Ó¸ ר × Ð × × ÙÒ Ö ÕÙ Ö Ò ÕÙ Ð ÔÖÓ Ö Ñ ÓÖ ÓÑÔÖ Ò ÐÑ ÒØ ×Ù× ×ÙØ Ð Þ × Ù×Ó Ò Ô ÖØ ÙÐ Ö¸ Ð Ñ Ò Ó Ñ ÑÓÖ º Ò ÙÒ ÙÐØ ÑÓ Ò Ú Ð¸ × Ò ÑÓ× Ð Ð × DynDlist<T>¸ Ð Ù Ð ÑÓ Ð Þ ÙÒ Ð ×Ø Ó Ð ¹ Ñ ÒØ ÒÐ Þ Ö ÙÐ Ö ÓÒ Ñ Ò Ó ÒØ ÖÒÓ Ñ ÑÓÖ º DynDlist<T> × ×Ô ¬ ÑÔÐ ÒØ Ò Ð Ö ÚÓ ØÔÐ ÝÒ Ð ×ØºÀ ¿ ¿ ØÔÐ ÝÒ Ð ×ØºÀ ¿ ≡ template <typename T> class DynDlist : public Dnode<T> { Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ }; ¬Ò × DynDlist¸ Ù× Ò ÙÒ × ¿ß ¸ ¸ ½¼¾ ¸ ½¼ ¸ ½¼ ¸ ½¼ ¸ ½ ¸ ¾¾¼¸ ¾ ¿ ¸ ¾ ¸ ¼¿ ¸ ¼ ¸ ¼ ¸ ¿ ¸ ¿ ¸ ß ¸ ¸ ¸ ¸ ¾ß ¸ ½ß ¿¸ ½¸ ¸ ¼¿ ¸ ½ ß½ ¸ ¾¿¸ Ò ¾ º Í× × Dnode º Ä DynDlist<T>× ÕÙ ×ÓÔÓÖØ ØÓ Ð ÙÒ ÓÒ Ð ÕÙ ÖÖ ×ØÖ ÑÓ× × Dlink × Ò Ò × Ô Ò× Ö Ò Ð Ñ Ò Ó ÔÙÒØ ÓÖ ×¸ ÒÓ Ó× Ý Ñ ÑÓÖ º DynDlist<T> Ö ÔÙ Ð Ñ ÒØ ×Ù ÑÔÐ ÒØ ÓÒ Ð Ð × Dlist<T> Ý ÙÒ Ù Ò Ô ÖØ ×Ù ÒØ Ö Þº Ä Ö ×ÔÓÒ× Ð × Ò Ð DynDlist<T> × Ð Ñ Ò Ó Ñ ÑÓ¹ Ö º Ð ÙÒ Ó ØÖ ÙØÓ DynDlist<T> × num elem¸ Ð Ù Ð ÓÒØ Ð Þ Ð ÒØ Ð Ñ ÒØÓ× ÕÙ ÔÓ× Ð Ð ×Ø Ý ÔÙ Ó × ÖÚ Ö× Ñ ÒØ ¿ Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ ≡ ´¿µ ¿ const size_t & size() const { return num_elem; } Ä ÓÒרÖÙ ÓÒ × ÑÙÝ × ÑÔÐ ¸ Ô٠׸ Ð Ü Ô ÓÒ Ð Ñ Ò Ó Ñ ÑÓÖ Ý Ð ÓÒØ Ð Þ ÓÒ Ð ÒÙÑ ÖÓ Ð Ñ ÒØÓ׸ ØÓ Ó ×Ø ÑÔÐ ÒØ Ó × Ð Ð × Dlist<T> ¿ Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡ ´¿µ ¿ ¿ DynDlist() : num_elem(0) { /* Empty */ } Í× × DynDlist ¿ º Ð Ù Ð ÕÙ Ò Dlist<T>¸ ÔÓ ÑÓ× Ò× ÖØ Ö Ð Ñ ÒØÓ× ÔÓÖ Ð ÔÖ Ò Ô Ó Ó ¬Ò Ð Ð Ð ×Ø ¿ Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡ ´¿µ ¿ T & insert(const T & _data) { Dnode<T> * p = new Dnode<T> (_data); Dnode<T>::insert(p);
  • 120.
    94 Cap´ ıtulo 2. Secuencias ++num_elem; return p->get_data(); } T & append(const T & _data) { Dnode<T> * p = new Dnode<T> (_data); Dnode<T>::append(p); ++num_elem; return p->get_data(); } Í× × Dnode º Ä × Ñ ×Ñ × ÓÔ Ö ÓÒ × × ¬Ò Ô Ö Ð ×Ø × × Ö¸ × ÔÙ ÓÒ Ø Ò Ö ÙÒ Ð ×Ø ÒØ Ö Ø ÒØÓ ÔÓÖ Ð ÔÖ Ò Ô Ó ÓÑÓ ÔÓÖ Ð ¬Ò Ð Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡ ´¿µ ¿ size_t insert_list(DynDlist & list) { Dlink::insert_list(&list); num_elem += list.num_elem; list.num_elem = 0; return num_elem; } size_t append_list(DynDlist & list) { Dlink::append_list(&list); num_elem += list.num_elem; list.num_elem = 0; return num_elem; } Í× × DynDlist ¿ º Ð ×Ó ÙÒ × Ù Ò DynDlist<T> × Ö Ð Þ ÔÓÖ ÙÒÓ ×Ù× ÜØÖ ÑÓ× Ð ÔÖ Ñ Ö Ó Ð ÙÐØ ÑÓ Ð Ñ ÒØÓ Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡ ´¿µ T & get_first() { return this->get_next()->get_data(); } T & get_last() { return this->get_prev()->get_data(); } Ñ Ó× Ñ ØÓ Ó× Ö ØÓÖÒ Ò Ö Ö Ò × Ð ØÓ Ò ÐÙ Ó ÒØÖÓ Ð Ð ×Ø º ×ØÓ × Ò ¬ ÕÙ Ð Ù×Ù Ö Ó ÔÙ ÑÓ ¬ ÖÐÓ× Ö Ø Ñ ÒØ º ÌÖ ÓÒ ÐÑ ÒØ ¸ Ð Ð Ñ Ò ÓÒ × Ö Ð Þ ÔÓÖ Ð ÙÒÓ ÐÓ× ÜØÖ ÑÓ× Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡ ´¿µ T remove_first() { Dnode<T> * ptr = this->remove_next(); Ó Ø Ò Ö ØÓ Ý Ð Ö Ö ÔØÖ }
  • 121.
    2.4. Listas Enlazadas 95 T remove_last() { Dnode<T> * ptr = this->remove_prev(); Ó Ø Ò Ö ØÓ Ý Ð Ö Ö ÔØÖ } Í× × Dnode º Ó Ø Ò Ö ØÓ Ý Ð Ö Ö ÔØÖ ≡ ´ µ T retVal = ptr->get_data(); delete ptr; --num_elem; return retVal; ×ÙÔÖ Ñ Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ¸ remove last() Ð ÙÐØ ÑÓº remove first() ÖÒ Ð ÓÒ×ÙÐØ ¸ Ð Ð Ñ Ò ÓÒ Ö ØÓÖÒ ÓÔ × ÐÓ× Ú ÐÓÖ ×¸ ÒÓ Ö Ö Ò ×¸ ÔÙ × Ð ÒÓ Ó × Ü ×Ø Ö ×ÔÙ × Ð Ö Ö Ð Ñ ÑÓÖ Ó ÙÔ ÔÓÖ Ð ÒÓ Óº × ÔÓ× Ð Ú Ö ÙÒ Ð ×Ø ×ØÓ × Ð Ñ Ò Ö ØÓ Ó× ×Ù× Ð Ñ ÒØÓ× Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡ ´¿µ void empty() { while (not this->is_empty()) delete this->remove_next(); num_elem = 0; } ר ÔÖ Ñ Ø Ú × Ö ÒÚÓ ÔÓÖ Ð ×ØÖÙ ØÓÖ Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡ ´¿µ ~DynDlist() { empty(); } Í× × DynDlist ¿ º Ò Ð ÙÒ × Ö ÙÒר Ò × × ÑÙÝ ÙØ Ð ÔÓ Ö Ð Ñ Ò Ö ÙÒ Ð Ñ ÒØÓ ÕÙ × ÑÓ× Ô ÖØ Ò Ð × ÙÒ Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡ ´¿µ void remove(T & data) { Dnode<T> * p = data_to_node(data); p->del(); delete p; --num_elem; } Í× × Dnode º ÍÒ ÔÖ Ñ Ø Ú × Ò Ð Ô Ö Ð × ÑÔ ÒÓ Ý Ð Ò Ð ÙÒÓ× Ð ÓÖ ØÑÓ× × swap()º ÓÑÓ ØÓ Ó Ð ØÖ Ó Ý Ù ÑÔÐ ÒØ Ó × Ð Ð × Dlink¸ÒÙ ×ØÖ ÔÖ Ñ Ø Ú ×ÓÐÓ × Ö Ñ Ø Ø Ô Ö ÒÚÓ Ö Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡ ´¿µ void swap(DynDlist & l) { Aleph::swap(num_elem, l.num_elem);
  • 122.
    96 Cap´ ıtulo 2. Secuencias this->Dlink::swap(&l); } Í× × DynDlist ¿ º ÇØÖ ÓÖÑ ÑÓ ¬ ÓÒ ÙÒ Ð ×Ø Ò Ñ × Ð Ô ÖØ ÓÒ ÕÙ Ø Ø Ú º ×ØÓ ÔÙ Ö Ð Þ Ö× × Ð Ñ ØÓ Ó Dlink::split list() Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡ ´¿µ void split_list(DynDlist & l, DynDlist & r) { Dlink::split_list(l, r); l.num_elem = r.num_elem = num_elem/2; if (num_elem % 2 == 1) // ¿es num_elem impar? l.num_elem++; num_elem = 0; } Í× × DynDlist ¿ º 2.4.10.1 Iterador de DynDlist<T> À ר Ð ÔÖ × ÒØ ¸ Ð Ò× Ö ÓÒ¸ Ð Ñ Ò ÓÒ Ý ÓØÖ × ÓÔ Ö ÓÒ × ÑÓ ¬ ÓÒ ×Ø Ò Ö ×ØÖ Ò × ÐÓ× ÜØÖ ÑÓ× Ð Ð ×Ø º Ë ÙÒ ÔÐ ÓÒ Ö ÕÙ Ö ÑÓ ¬ ÓÒ Ò ÔÓ× ÓÒ × Ö ÒØ ׸ ÒØÓÒ × ×Ø ÔÙ × ÖÚ Ö× ÙÒ Ø Ö ÓÖ ÙÒ Ó ÓÔ Ö ÓÒ × ×Ô Ð × ×Ó Ö Ð Ð Ñ ÒØÓ ØÙ Ð Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡ ´¿µ class Iterator : public Dnode<T>::Iterator { DynDlist * list_ptr; // puntero a la lista int pos; // posici´n del elemento actual en la secuencia o Ñ ØÓ Ó× Ø Ö ÓÖ DynDlist<T> }; Í× × Dnode Ò DynDlist ¿º Ä Ð × Ù Ö ÙÒ ÔÙÒØ ÓÖ Ð Ð ×Ø ÓÒ Ð ÔÖÓÔÓ× ØÓ Ñ ÒØ Ò Ö Ð ÓÒØ ÓÖ Ð Ñ ÒØÓ× ×Ø Ñ Ò Ö × ÔÙ ØÙ Ð Þ Ö Ð ÓÒØ ÓÖ Ù Ò Ó × ÙØ Ò ÓÔ Ö ÓÒ × ×Ó Ö Ð Ø Ö ÓÖ ÕÙ ÑÓ ¬ÕÙ Ò Ð ÒØ Ð Ñ ÒØÓ׺ Ð ØÖ ÙØÓ pos Ö ­ Ð ÔÓ× ÓÒ ÓÖ Ò Ð ÒØÖÓ Ð × Ù Ò Ð Ð Ñ ÒØÓ ØÙ Ð Ý ÔÙ Ó × ÖÚ Ö× Ñ ÒØ Ñ ØÓ Ó× Ø Ö ÓÖ DynDlist<T> ≡ ´ µ const int & get_pos() const { return pos; } È Ö Ñ ÒØ Ò Ö ÓÖÖ Ø Ñ ÒØ Ð ×Ø Ó ×Ø Ú ÐÓÖ¸ ÑÓ× ×Ó Ö Ö Ö Ð × ÙÒ ÓÒ × ÚÒ Ð Ø Ö ÓÖ¸ Ñ Ò Ö Ø Ð ÕÙ ØÙ Ð Ò ×Ù Ú ÐÓÖ Ñ ØÓ Ó× Ø Ö ÓÖ DynDlist<T> +≡ ´ µ const int & next() { Dnode<T>::Iterator::next(); pos++; return pos; } Í× × Dnode º
  • 123.
    2.4. Listas Enlazadas 97 Ð Ñ Ò Ó Ð ÔÓ× ÓÒ Ð Ð Ñ ÒØÓ ØÙ Ð Ð Ø Ö ÓÖ Ø Ñ Ò Ö ÕÙ Ö ×Ó Ö Ö Ö ÐÓ× Ñ ØÓ Ó× reset first() Ý reset last()º È Ö Ö Ö ÙÒ Ø Ö ÓÖ¸ ×ÓÐÓ × Ö ÕÙ Ö ÙÒ Ð ×Ø Ó ÔÓÖ ÓÔ ÓØÖÓ Ø Ö ÓÖ Ñ ØÓ Ó× Ø Ö ÓÖ DynDlist<T> +≡ ´ µ Iterator(DynDlist<T> & _list) : Dnode<T>::Iterator(_list), list_ptr(&_list), pos(0) { /* Empty */ } Iterator(const Iterator & it) : Dnode<T>::Iterator(it), list_ptr(it.list_ptr), pos(it.pos) { /* Empty */ } Iterator() : list_ptr(NULL){ /* empty */ } Iterator & operator = (const Iterator & it) { Dnode<T>::Iterator::operator = (it); list_ptr = it.list_ptr; pos = it.pos; return *this; } Í× × Dnode Ò DynDlist ¿º has current() × Ö Ð Ð × × Dlinkº Dlist<T> ØÖ Ò ÙÒ ÓÒ ÒÓ Ó× Ý ÒÙ ×ØÖÓ Ø Ö ÓÖ ØÖ Ö Ò ÙÒ ÓÒ Ð Ñ ÒØÓ× Ø ÔÓ Tº ÈÓÖ × Ö ÞÓÒ ÑÓ× ×Ó Ö Ö Ö get current() Ñ ØÓ Ó× Ø Ö ÓÖ DynDlist<T> +≡ ´ µ T & get_current() { return Dnode<T>::Iterator::get_current()->get_data(); } Í× × Dnode º Ä Ò× Ö ÓÒ Ý ×ÙÔÖ × ÓÒ Ñ ÒØ Ð Ø Ö ÓÖ Dlist<T> × Ö Ø ÔÓÖÕÙ Dlist<T> Ñ Ò Ð Ñ ÒØÓ× Ø ÔÓ Dnode<T> ÕÙ ÔÓ× Ò ×Ù× ÔÖÓÔ × ÔÖ Ñ Ø Ú × Ò× Ö ÓÒ Ý ×ÙÔÖ × ÓÒº Ò ÒÙ ×ØÖÓ ×Ó¸ ÒÓ × ÔÓ× Ð Ö Ð Þ Ö ×ØÓ ÔÓÖÕÙ Ñ Ò ÑÓ× Ð ¹ Ñ ÒØÓ× Ò Ö Ó× Ø ÔÓ Tº × Ô٠׸ Ö ÕÙ Ö ÑÓ× ÕÙ Ð Ø Ö ÓÖ ÜÔÓÖØ ÙÒ ÓÒ × ÕÙ Ô ÖÑ Ø Ò Ò× ÖØ Ö Ý Ð Ñ Ò Öº Ä Ò× Ö ÓÒ Ð ÔÖ × ÒØ ÑÓ× Ó Ð × Ñ ×Ñ × ÓÖÑ × ÕÙ DynDlist<T> Ñ ØÓ Ó× Ø Ö ÓÖ DynDlist<T> +≡ ´ µ void insert(const T & _data) { Dnode<T>::Iterator::get_current()->insert(new Dnode<T>(_data)); ++list_ptr->num_elem; } void append(const T & _data) { Dnode<T>::Iterator::get_current()->append(new Dnode<T>(_data)); ++list_ptr->num_elem; } Í× × Dnode º Ä × ÓØÖ × Ñ Ò Ö × Ò× ÖØ Ö ×ÓÒ Ð ×Ø × ÒØ Ö × Ô ÖØ Ö Ð Ð Ñ ÒØÓ ØÙ Ð Ñ ØÓ Ó× Ø Ö ÓÖ DynDlist<T> +≡ ´ µ void insert_list(const DynDlist & list) { Dnode<T>::Iterator::get_current()->insert_list(&list);
  • 124.
    98 Cap´ ıtulo 2. Secuencias list_ptr->num_elem += list.num_elem; list.num_elem = 0; } void append_list(const DynDlist & list) { Dnode<T>::Iterator::get_current()->append_list(&list); list_ptr->num_elem += list.num_elem; list.num_elem = 0; } Í× × Dnode Ò DynDlist ¿º Ä ×ÙÔÖ × ÓÒ Ð Ú ÑÓ× ÓÑÓ Ð ×ÙÔÖ × ÓÒ Ð Ð Ñ ÒØÓ ØÙ Ð Ñ ØÓ Ó× Ø Ö ÓÖ DynDlist<T> +≡ ´ µ T del() { Dnode<T> * ptr = Dnode<T>::Iterator::get_current(); T ret_val = ptr->get_data(); Dnode<T>::Iterator::next(); ptr->del(); delete ptr; --list_ptr->num_elem; return ret_val; } Í× × Dnode º Ä ÓÔ Ö ÓÒ del() ÔÙ × Ö ÑÙÝ Ö ×ØÖ Ø Ú Ò Ð × ÒØ Ó ÕÙ Ú ÒÞ Ð Ø Ö ÓÖ Ñ ×¸ ÐÓ Ò ÙÒ ×ÓÐÓ × ÒØ Óº ÆÓ× ÓÒÚ Ò ¸ Ô٠׸ Ó Ö Ö Ð ÔÖ Ñ Ø Ú × Ð Ñ Ò ÓÒ ÓÒØ ÜØÙ Ð × × Ö¸ Ð ÔÖ ×ÓÖ Ó ×Ù ×ÓÖ Ð Ð Ñ ÒØÓ ØÙ Ð Ñ ØÓ Ó× Ø Ö ÓÖ DynDlist<T> +≡ ´ µ T remove_prev() { Dnode<T> * curr_ptr = Dnode<T>::Iterator::get_current(); Dnode<T> * ptr = curr_ptr->remove_prev(); T ret_val = ptr->get_data(); delete ptr; --list_ptr->num_elem; return ret_val; } T remove_next() { Dnode<T> * curr_ptr = Dnode<T>::Iterator::get_current(); Dnode<T> * ptr = curr_ptr->remove_next(); T ret_val = ptr->get_data(); delete ptr; --list_ptr->num_elem; return ret_val; } Í× × Dnode º Ä ÙÐØ Ñ ÓÔ Ö ÓÒ ÑÓ ¬ ÓÒ ÙÒ Ð ×Ø Ò Ñ Ñ ÒØ ÙÒ Ø Ö ÓÖ ÔÙ × Ö ÑÙÝ ÙØ Ð Ò Ð ÙÒÓ× ×Ó× × ØÖ Ø Ð ÓÖØ ÙÒ Ð ×Ø Ô ÖØ Ö Ð ÔÓ× ÓÒ ØÙ Ð Ð Ø Ö ÓÖ
  • 125.
    2.4. Listas Enlazadas 99 Ñ ØÓ Ó× Ø Ö ÓÖ DynDlist<T> +≡ ´ µ size_t cut_list(DynDlist & list) { list_ptr->Dnode<T>::cut_list(Dnode<T>::Iterator::get_current(), &list); list.num_elem = list_ptr->num_elem - pos; // actualizar cardinalidad de list list_ptr->num_elem -= pos; // actualizar cardinalidad de ptr_list. return list.num_elem; } Í× × Dnode Ò DynDlist ¿º Ð Ø Ö ÓÖ Ô ÖÑ Ø ÙÒ Ñ Ò Ö ÓÒ × Ý ÜÔÖ × Ú ÓÔ Ö Ð ×Ø × ÓÔ Ö Ð ×Ø ≡ ´ µ for (typename DynDlist<T>::Iterator itor(const_cast<DynDlist&>(list)); itor.has_current();itor.next()) this->append(itor.get_current()); Í× × DynDlist ¿ º ÄÓ ÕÙ Ô ÖÑ Ø ÑÔÐ ÒØ Ö Ð × Ò ÓÒ Ý Ð ÓÒרÖÙ ØÓÖ ÓÔ Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡ ´¿µ DynDlist<T> & operator = (const DynDlist & list) { while (not this->is_empty()) // vaciar this this->remove_first(); ÓÔ Ö Ð ×Ø return *this; } Í× × DynDlist ¿ º Ð Ñ ×ÑÓ ÑÓ Ó¸ Ð ÓÒרÖÙ ØÓÖ ÓÔ Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡ ´¿µ DynDlist(const DynDlist & list) : Dnode<T>(list) { this->reset(); num_elem = 0; ÓÔ Ö Ð ×Ø } Í× × Dnode Ò DynDlist ¿º Ä ÐÐ Ñ this->reset() × Ò ×Ô Ò× Ð Ô Ö × ÙÖ Ö ÕÙ Ð Ð ×Ø ר ÐÓ Ñ ÒØ Ú º Ë ÒÓ × Ö Ð Þ × × ¸ ÒØÓÒ × Ð Ú ÐÓÖ this¸ ÕÙ ÙÒ ÒÓ Ó Ö¸ ÓÖÖ ×ÔÓÒ Ö Ð ÓÔ listº Ë Ð ÓÒ ÓÒ Ð ×Ø ÑÔÓ× Ð Ø Ð ×Ó Ö ØÓ ×Ù× Ð Ñ ÒØÓ׸ ØÓ× ÒØ Ö Þ ÔÙ × Ö ÐØ Ñ ÒØ × Ð ×ÔÓÒ Ö Ð ÓÔ Ö ÓÖ ×Ó ÔÓÖ ÔÓ× ÓÒ Ñ ØÓ Ó× ÔÙ Ð Ó× DynDlist<T> ¿ +≡ ´¿µ T & operator [] (const size_t & n) { DynDlist<T>::Iterator it(*this); for (int i = 0; i < n and it.has_current(); i++, it.next()) ; return it.get_current(); } Í× × DynDlist ¿ º
  • 126.
    100 Cap´ ıtulo 2. Secuencias 2.4.11 Aplicaci´n: aritm´tica de polinomios o e ÓÒ× Ö ÑÓ× ÙÒ Ì ÕÙ ÑÓ Ð ÔÓÐ ÒÓÑ Ó× Ý ×Ù× ÓÔ Ö ÓÒ × × ×º Ì Ð Ì ×Ø Ö Ð Þ Ó Ò Ð Ö ÚÓ ÔÓÐ ÒÓѺ ½¼¼ ¸ Ð Ù Ð × ¬Ò ÓÒØ ÒÙ ÓÒ ½¼¼ ÔÓÐ ÒÓѺ ½¼¼ ≡ class Polinomio { Å Ñ ÖÓ× ÔÖ Ú Ó× ÈÓÐ ÒÓÑ Ó ½¼¾ ÒØ Ö Þ ÈÓÐ ÒÓÑ Ó ½¼¼ }; ÁÑÔÐ Ñ ÒØ ÓÒ Ñ ØÓ Ó× ÈÓÐ ÒÓÑ Ó ½¼¿ À Ý Ú Ö × Ñ Ò Ö × Ö Ö ÙÒ ÔÓÐ ÒÓÑ Ó¸ Ð ÔÖ Ñ Ö × ÔÓÖ ÓÑ × ÓÒ ½¼¼ ÒØ Ö Þ ÈÓÐ ÒÓÑ Ó ½¼¼ ≡ ´½¼¼ µ ½¼¼ Polinomio(); ר ÓÒרÖÙ ØÓÖ Ö Ð ÔÓÐ ÒÓÑ Ó 0x0º È Ö ÓÒרÖÙ Ö ÙÒ ÔÓÐ ÒÓÑ Ó Ù ÐÕÙ Ö ¸ Ð ÔÙÒØÓ Ô ÖØ × Ö ÙÒ ÔÓÐ ÒÓÑ Ó ÙÒ ×ÓÐÓ Ø ÖÑ ÒÓ ½¼¼ ÒØ Ö Þ ÈÓÐ ÒÓÑ Ó ½¼¼ +≡ ´½¼¼ µ ½¼¼ ½¼¼ Polinomio(const int& coef, const size_t & pot); ר ÓÒרÖÙ ØÓÖ Òר Ò Ð ÔÓÐ ÒÓÑ Ó coef xpot ÔÓÖ ÑÔÐÓ Polinomio p(20, 7); ÁÒר Ò ÙÒ ÔÓÐ ÒÓÑ Ó ÓÒ Ú ÐÓÖ 20x7º Ë ÕÙ Ö ÑÓ× ÓÒרÖÙ Ö ÙÒ ÔÓÐ ÒÓÑ Ó Ñ × ÓÑÔÐ Ó¸ ÒØÓÒ × ÔÓ ÑÓ× ×ÙÑ Ö Ú Ö Ó× Ø ÖÑ ÒÓ× Ñ ÒØ Ð ÓÔ Ö ÓÖ ×ÙÑ ½¼¼ ÒØ Ö Þ ÈÓÐ ÒÓÑ Ó ½¼¼ +≡ ´½¼¼ µ ½¼¼ ½¼¼ Polinomio operator + (const Polinomio&) const; ÈÓÖ ÑÔÐÓ¸ Ô Ö ÓÒרÖÙ Ö Ð ÔÓÐ ÒÓÑ Ó 20x7 + 3x3 + x2 + 20¸ ÔÓ ÑÓ× ØÙ Ö Polinomio p(Polinomio(20, 7) + Polinomio(3, 3) + Polinomio(1, 2) + Polinomio(20, 0)); ÈÓÖ Ö ÞÓÒ × ¬ Ò ÕÙ × ÙØ Ö ÑÓ× ÔÓר Ö ÓÖÑ ÒØ ¸ × ÓÒÚ Ò ÒØ Ó Ö Ö Ð × Ù ÒØ Ú Ö× ÓÒ Ð ×ÙÑ ½¼¼ ÒØ Ö Þ ÈÓÐ ÒÓÑ Ó ½¼¼ +≡ ´½¼¼ µ ½¼¼ ½¼¼ Polinomio& operator += (const Polinomio&); Å ÒØ ר ÓÔ Ö ÓÖ¸ Ð ÔÓÐ ÒÓÑ Ó ÒØ Ö ÓÖ ÔÙ ÓÒרÖÙ Ö× ÓÑÓ × Ù Polinomio p(20, 7); p += Polinomio(3, 3) + Polinomio(1, 2) + Polinomio(20, 0); Ð ÔÖÓ Ù ØÓ Ó× ÔÓÐ ÒÓÑ Ó× × ×Ô ¬ Ñ ÒØ Ð ÓÔ Ö ÓÖ * ½¼¼ ÒØ Ö Þ ÈÓÐ ÒÓÑ Ó ½¼¼ +≡ ´½¼¼ µ ½¼¼ ½¼½ Polinomio operator * (const Polinomio&) const;
  • 127.
    2.4. Listas Enlazadas 101 ÇØÖ × ÓÔ Ö ÓÒ ×¸ ÕÙ × Ð Ò Ö Ó׸ ×ÓÒ ½¼½ ÒØ Ö Þ ÈÓÐ ÒÓÑ Ó ½¼¼ +≡ ´½¼¼ µ ½¼¼ ½¼½ Polinomio operator - (const Polinomio&) const; Polinomio operator / (const Polinomio&) const; Polinomio operator % (const Polinomio&) const; ר × ÓÔ Ö ÓÒ × ÓÖÖ ×ÔÓÒ Ò Ð ×Ù ×ØÖ ÓÒ¸ Ú × ÓÒ Ý Ö × ÙÓº Ä × ÔÐ ÓÒ × ÕÙ ÙØ Ð Ò ÔÓÐ ÒÓÑ Ó× Ö ÕÙ Ö Ö Ò ÙÒ ÓÖÑ Ö ×Ù× Ø ÖÑ ÒÓ׺ È Ö ÐÐÓ¸ ÑÓ× ÔÖÓÚ Ö ÙÒ ÓÒ ÙÒØÓ Ñ Ò ÑÓ ÔÖ Ñ Ø Ú ×º ÍÒ ØÖ ÙØÓ × Ò Ð ÙÒ ÔÓÐ ÒÓÑ Ó × ÓÒÓ Ö Ð ÒØ Ø ÖÑ ÒÓ× ½¼½ ÒØ Ö Þ ÈÓÐ ÒÓÑ Ó ½¼¼ +≡ ´½¼¼ µ ½¼½ ½¼½ const size_t & size() const; Ê ÕÙ Ö ÑÓ× ÓÒÓ Ö ÙÒÓ ÐÓ× Ø ÖÑ ÒÓ׸ ×ØÓ ÐÓ ÔÓ ÑÓ× ÖÑ ÒØ ½¼½ ÒØ Ö Þ ÈÓÐ ÒÓÑ Ó ½¼¼ +≡ ´½¼¼ µ ½¼½ ½¼½ size_t get_power(const size_t & i) const; get power()Ö ØÓÖÒ Ð ÔÓØ Ò ÓÖÖ ×ÔÓÒ ÒØ Ð i¹ × ÑÓ Ø ÖÑ ÒÓ Ö ÒØ ÖÓ ×ÙÑ Ò Ó ÕÙ ÐÓ× Ø ÖÑ ÒÓ× Ð ÔÓÐ ÒÓÑ Ó ×Ø Ò ÓÖ Ò Ó× × Ð Ñ ÝÓÖ ×Ø Ð Ñ ÒÓÖ ÔÓØ Ò º Ð Ñ ×ÑÓ ÑÓ Ó¸ Ð ÓÔ Ö ÓÒ ½¼½ ÒØ Ö Þ ÈÓÐ ÒÓÑ Ó ½¼¼ +≡ ´½¼¼ µ ½¼½ ½¼½ const int & get_coef(const size_t & i) const; Ö ØÓÖÒ Ð Ó ¬ ÒØ ÓÖÖ ×ÔÓÒ ÒØ Ð i¹ × ÑÓ Ø ÖÑ ÒÓº Ð Ö Ó Ð ÔÓÐ ÒÓÑ Ó ÔÙ ÓÒ×ÙÐØ Ö× Ñ ÒØ ½¼½ ÒØ Ö Þ ÈÓÐ ÒÓÑ Ó ½¼¼ +≡ ´½¼¼ µ ½¼½ const size_t & get_degree() const; 2.4.11.1 Implementaci´n de polinomios o ÍÒ ÔÖ Ñ Ö Ø ÒØ ÓÒ ÓÑÓ ×ØÖÙ ØÙÖ ØÓ Ô Ö Ö ÔÖ × ÒØ Ö ÙÒ ÔÓÐ ÒÓÑ Ó × ÙÒ ÖÖ ÐÓº È Ö ÙÒ ÔÓÐ ÒÓÑ Ó Ö Ó n¸ × Ö × ÖÚ ÙÒ ÖÖ ÐÓ Ñ Ò× ÓÒ n + 1¸ Ð Ù Ð ÓÒØ Ò ÐÓ× Ó ¬ ÒØ ׺ ÆÓ × Ò × Ö Ó ÐÑ Ò Ö Ð ÔÓØ Ò ¸ ÔÙ × ×Ø × Ö ÔÖ × ÒØ Ñ ÒØ Ð ÔÖÓÔ Ó Ò Ð ÖÖ ÐÓº Ò Ô Ö Ò ¸ Ð ÖÖ ÐÓ Ó Ö Ú ÒØ × ÒÓÑ Ò Ð × ÔÓÖ ÑÔÐÓ¸ Ð ×ÙÑ × Ö Ø ¹ Ñ ÒØ Ð ×ÙÑ Ú ØÓÖ ×º Ä Ñ ÒØ Ð Ñ ÒØ ¸ Ð ÖÖ ÐÓ ÔÙ ×Ô Ö Ö ÙÒ ÒØ ×Ô Ó ÑÔÖ × ÓÒ ÒØ ÔÓÖ ÑÔÐÓ¸ Ð ÔÓÐ ÒÓÑ Ó 20x100 Ö ÕÙ Ö ÙÒ ÖÖ ÐÓ 101 Ð Ñ ÒØÓ× Ô Ö ÐÑ Ò Ö ÙÒ ×ÓÐÓ Ó ¬ ÒØ ÙÒ ×Ô Ö Ó Ð 99±º ÄÓ× ÔÓÐ ÒÓÑ Ó× ×ÓÒ ÑÙÝ Ú Ö×Ó׺ Ä ÑÙÐØ ÔÐ ÓÒ Ý Ú × ÓÒ ÖÖÓ Ò ÔÓÐ ÒÓÑ Ó× Ö Ó× Ö ÒØ × ×Ù× ÓÔ Ö Ò Ó׺ Ò ÙÒ Ñ ÒØ ÓÒ × ØÙ Ò ÑÙ × ÓÔ Ö ÓÒ ×¸ × ×Ô Ö Ö ÕÙ Ó× ÔÓÐ ÒÓÑ Ó× Ø Ò Ò ×Ù× Ö Ó× Ö ÒØ ׺ Ò Ò ÙÖ ¸ ÑÙ × Ú × ÙÒ ÔÓÐ ÒÓÑ Ó × ×Ô Ö Ó × Ö¸ Ú Ö Ó× ×Ù× Ó ¬ ÒØ × ×ÓÒ ÒÙÐÓ׺ ÈÓÖ ×Ø × Ö ÞÓÒ ×¸ ÙÒ Ð ×Ø ÒÐ Þ ÕÙ ×ÓÐÓ ÐÑ Ò Ø ÖÑ ÒÓ× Ö ÒØ × ÖÓ × Ð ×ØÖÙ ØÙÖ ÓÒ Ô Ö Ö ÔÖ × ÒØ Ö ÙÒ ÔÓÐ ÒÓÑ Óº Ä ¬ ÙÖ ¾º½ ÐÙ×ØÖ Ð Ö ÔÖ × ÒØ ÓÒ ÓÒ Ð ×Ø × Ó Ð Ñ ÒØ ÒÐ Þ × Ð ÔÓÐ ÒÓÑ Ó 4x 6 + 2x3 − 1x2 + x + 7º Ä Ð ×Ø ר ÓÖ Ò × Ð Ñ ÝÓÖ ×Ø Ð Ñ ÒÓÖ ÔÓØ Ò º Ð ÓÖ Ò × × Ò Ð Ô Ö ÐØ Ö Ð ¬ Ò ÐÓ× Ð ÓÖ ØÑÓ׺
  • 128.
    102 Cap´ ıtulo 2. Secuencias 4 6 2 3 -1 2 1 1 7 0 H ÙÖ ¾º½ Ê ÔÖ × ÒØ ÓÒ 4x6 + 2x3 − x2 + x + 7 ÓÒ Ð ×Ø × ÒÐ Þ × È Ö Ö ÔÖ × ÒØ Ö ÙÒ ÔÓÐ ÒÓÑ Ó ÔÓ ÑÓ× ÙØ Ð Þ Ö Ð Ì DynDlist<T>¸ Ð Ù Ð Ö ÓÑÓ Ô Ö Ñ ØÖÓ ÙÒ Ø ÔÓ ÕÙ Ð Ö ÐÓ× Ð Ñ ÒØÓ× Ù Ö Ö Ò Ð Ð ×Ø × Ö¸ ÐÓ× Ô Ö × Ó ¬ ÒØ ¹ÔÓØ Ò ½¼¾ Å Ñ ÖÓ× ÔÖ Ú Ó× ÈÓÐ ÒÓÑ Ó ½¼¾ ≡ ´½¼¼ µ ½¼¾ struct Termino { int coef; size_t pot; Å Ñ ÖÓ× Ì ÖÑ ÒÓ ½¼¾ }; ¬Ò × Termino¸ Ù× Ò ÙÒ × ½¼¾ß½¼ º Ä Ð ×Ø ÒÐ Þ ÓÒØ Ò ¸ ÒØÓÒ ×¸ Ø ÖÑ ÒÓ× ½¼¾ Å Ñ ÖÓ× ÔÖ Ú Ó× ÈÓÐ ÒÓÑ Ó ½¼¾ +≡ ´½¼¼ µ ½¼¾ ½¼¾ DynDlist<Termino> terminos; Í× × DynDlist ¿ Ò Termino ½¼¾ º À Ý Ó× ÓÖÑ × ÓÒרÖÙ Ö ÙÒ Ø ÖÑ ÒÓ ½¼¾ Å Ñ ÖÓ× Ì ÖÑ ÒÓ ½¼¾ ≡ ´½¼¾ µ ½¼¾ Termino() : coef(0), pot(0) { /* empty */ } Termino(const int & c, const size_t & p) : coef(c), pot(p) { /* empty */ } Í× × Termino ½¼¾ º Ò Ú Ð ÔÖ Ú Ó × ÑÔÓÖØ ÒØ ÓÒרÖÙ Ö ÙÒ Polinomio Ô ÖØ Ö ÙÒ Ø ÖÑ ÒÓ ½¼¾ Å Ñ ÖÓ× ÔÖ Ú Ó× ÈÓÐ ÒÓÑ Ó ½¼¾ +≡ ´½¼¼ µ ½¼¾ ½¼ Polinomio(const Polinomio::Termino & termino) { terminos.append(termino); } Í× × Termino ½¼¾ º Ä ×ÙÑ Ø ÖÑ ÒÓ× × ¬Ò ÓÑÓ × Ù ½¼¾ Å Ñ ÖÓ× Ì ÖÑ ÒÓ ½¼¾ +≡ ´½¼¾ µ ½¼¾ ½¼¿ Termino& operator += (const Termino & der) { coef += der.coef; return *this; } Í× × Termino ½¼¾ º
  • 129.
    2.4. Listas Enlazadas 103 Ä ÑÙÐØ ÔÐ ÓÒ ÓÖÞÓ× Ñ ÒØ ÔÖÓ Ù Ö ÙÒ ÒÙ ÚÓ Ø ÖÑ ÒÓ¸ ÔÓÖ × Ö ÞÓÒ ¹ ÑÓ× ÑÔÐ ÒØ Ö ×ØÖ Ø Ñ ÒØ Ð ÓÔ Ö ÓÖ * ½¼¿ Å Ñ ÖÓ× Ì ÖÑ ÒÓ ½¼¾ +≡ ´½¼¾ µ ½¼¾ Termino operator * (const Termino & der) const { return Termino(coef*der.coef, pot + der.pot); } Í× × Termino ½¼¾ º ¬Ò Ð ÓÒרÖÙ ÓÒ ÙÒ Ø ÖÑ ÒÓ¸ ÔÓ ÑÓ× ¬Ò Ö Ð ÓÒרÖÙ ÓÒ ÔÓÐ ÒÓÑ Ó× ½¼¿ ÁÑÔÐ Ñ ÒØ ÓÒ Ñ ØÓ Ó× ÈÓÐ ÒÓÑ Ó ½¼¿ ≡ ´½¼¼ µ ½¼¿ Polinomio::Polinomio(const int & coef, const size_t & pot) { terminos.append(Termino(coef, pot)); } Polinomio::Polinomio() { /* empty */ } Í× × Termino ½¼¾ º Suma de polinomios Ä ×ÙÑ Ó× ÔÓÐ ÒÓÑ Ó× P1 = n i=0 cix i Ý P2 = m j=0 djx j × ¬Ò ÓÑÓ Ñ Ü(n,m) P1 + P2 = (ck + dk)xk . k=0 × Ð Ó Ø Ò Ö ÙÒ Ð ÓÖ ØÑÓ ¬ ÒØ ¸ ÔÙ × Ð × Ð ×Ø × ×Ø Ò ÓÖ Ò × ÔÓÖ ÔÓØ Ò º Ò ×Ø × ÒØ Ó¸ × ÔÖ Ö Ð ÑÔÐ Ñ ÒØ Ö Ð ÓÔ Ö ÓÖ +=¸ ÔÙ × × ÒÓ× ÓÖÖ ÑÓ× Ð Ö Ö ÒÙ ÚÓ× Ø ÖÑ ÒÓ× Ô Ö Ð ÔÓÐ ÒÓÑ Ó Ö ×ÙÐØ Óº ר ÑÓ Ó¸ Ð ÓÔ Ö ÓÖ + ÔÓ ÑÓ× × Ö ÖÐÓ Ò ÙÒ ÓÒ += ÓÑÓ × Ù ½¼¿ ÁÑÔÐ Ñ ÒØ ÓÒ Ñ ØÓ Ó× ÈÓÐ ÒÓÑ Ó ½¼¿ +≡ ´½¼¼ µ ½¼¿ ½¼¿ Polinomio Polinomio::operator + (const Polinomio & der) const { Polinomio ret_val(*this); // inicie valor de retorno en operando derecho ret_val += der; // s´mele operando derecho u return ret_val; } Ä ×ÙÑ × ÜØÖ Ñ Ñ ÒØ × ÑÔÐ ÔÓÖÕÙ ×Ù Ý Ò Ð ÐÐ Ñ Ð ÓÔ Ö ÓÖ +=¸ Ð Ù Ð ÔÓ× Ð × Ù ÒØ רÖÙ ØÙÖ ½¼¿ ÁÑÔÐ Ñ ÒØ ÓÒ Ñ ØÓ Ó× ÈÓÐ ÒÓÑ Ó ½¼¿ +≡ ´½¼¼ µ ½¼¿ ½¼ Polinomio & Polinomio::operator += (const Polinomio& der) { ÁÑÔÐ ÒØ ÓÒ ÈÓÐ ÒÓÑ Ó ÓÔ Ö ØÓÖ · ½¼¿ return *this; } ÒØ × ØÙ Ö Ð ×ÙÑ ÓÑÓ Ø Ð¸ ÑÓ× Ú Ö ¬ Ö ÕÙ Ò Ò ÙÒÓ ÐÓ× Ó× ÔÓÐ ¹ ÒÓÑ Ó× ÓÖÖ ×ÔÓÒ Ð Ð Ñ ÒØÓ Ò ÙØÖÓ ½¼¿ ÁÑÔÐ ÒØ ÓÒ ÈÓÐ ÒÓÑ Ó ÓÔ Ö ØÓÖ · ½¼¿ ≡ ´½¼¿ µ ½¼ if (der.terminos.is_empty())
  • 130.
    104 Cap´ ıtulo 2. Secuencias return *this; if (terminos.is_empty()) { *this = der; return *this; } Ë Ñ Ó× ÔÓÐ ÒÓÑ Ó× ÒÓ ×ÓÒ ÒÙÐÓ׸ ÒØÓÒ × ÑÓ× Ö ÓÖÖ ÖÐÓ׺ È Ö ÐÐÓ Ù× ÑÓ× ÙÒ Ø Ö ÓÖ ÔÓÖ ÔÓÐ ÒÓÑ Ó ÓÔ Ö Ò Ó ½¼ ÁÑÔÐ ÒØ ÓÒ ÈÓÐ ÒÓÑ Ó ÓÔ Ö ØÓÖ · ½¼¿ +≡ ´½¼¿ µ ½¼¿ ½¼ DynDlist<Termino>::Iterator it_izq(terminos); DynDlist<Termino>::Iterator it_der(const_cast<DynDlist<Termino>&>(der.terminos)); Í× × DynDlist ¿ Ò Termino ½¼¾ º Ä ¬ ÙÖ ¾º½ ÑÔÐ ¬ Ð ÔÓÐ ÒÓÑ Ó 6x6+7x5−x4+3x2+4x ÓÑÓ ÓÔ Ö Ò Ó ÞÕÙ Ö Ó¸ Ý 8x8 + x6 − 2x2 + 2 ÓÑÓ ÓÔ Ö Ò Ó Ö Óº ØÓÖ ÞÕ 6x6 7x5 −x4 3x2 4x 8x8 x6 −2x2 2 itor der ÙÖ ¾º½ ËÙÑ ÔÓÐ ÒÓÑ Ó× ÓÖ Ö ÓÖÖ Ö ÑÓ× Ð × Ð ×Ø × Ø ÖÑ ÒÓ× ×Ø ÕÙ ÙÒÓ ÐÓ× Ø Ö ÓÖ × Ð Ò ×Ù ¬Ò Ð ×Ø ½¼ ÁÑÔÐ ÒØ ÓÒ ÈÓÐ ÒÓÑ Ó ÓÔ Ö ØÓÖ · ½¼¿ +≡ ´½¼¿ µ ½¼ ½¼ while (it_izq.has_current() and it_der.has_current()) { ÈÖÓ × Ö Ø ÖÑ ÒÓ× ØÙ Ð × ½¼ } Ë Ò izq Ý der Ð × ÔÓØ Ò × ÐÓ× Ø ÖÑ ÒÓ× ØÙ Ð × ÐÓ× Ø Ö ÓÖ × ÞÕÙ Ö Ó Ý Ö Ó Ö ×Ô Ø Ú Ñ ÒØ ½¼ ÈÖÓ × Ö Ø ÖÑ ÒÓ× ØÙ Ð × ½¼ ≡ ´½¼ µ ½¼ const size_t & izq = it_izq.get_current().pot; const size_t & der = it_der.get_current().pot; izq Ý der Ò ÔÖÓ × Ö× × ÙÒ ÐÓ× × Ù ÒØ × ×Ó× ½º Ë Ð ÔÓØ Ò Ð izq × Ñ ÒÓÖ ÕÙ der¸ ÒØÓÒ × der ר Ö ÔÖ × ÒØ Ò Ð Ö ×ÙÐØ Óº ÓÑÓ Ð Ð ×Ø ר ÓÖ Ò ¸ × × ÙÖÓ ÕÙ this ÒÓ ÓÒØ Ò ÙÒ Ø ÖÑ ÒÓ ÓÒ Ð Ñ ×Ñ ÔÓØ Ò derº ר × Ð × ØÙ ÓÒ ÓÒ ÐÓ× Ø ÖÑ ÒÓ× 6x6 Ý 8x8 ÐÓ× ÔÓÐ ÒÓÑ Ó× ÞÕÙ Ö Ó Ý Ö Ó¸ Ö ×Ô Ø Ú Ñ ÒØ º
  • 131.
    2.4. Listas Enlazadas 105 ÑÓ× Ö Ö ÙÒ ÒÙ ÚÓ Ø ÖÑ ÒÓ ÓÔ der Ò× ÖØ ÖÐÓ Ò this ´ Ð ÔÓÐ ÒÓÑ Ó ÞÕÙ Ö Óµº Ä ÓÔ der ÔÖ Ö izq Ò this¸ ÔÙ × Ð Ö ×ÙÐØ Ó ×Ø Ö ÓÖ Ò Óº Ä × ÓÒ × ÒØ Ö ÓÖ × × ØÖ Ù Ò Ð × Ù ÒØ Ó Ó ½¼ ÈÖÓ × Ö Ø ÖÑ ÒÓ× ØÙ Ð × ½¼ +≡ ´½¼ µ ½¼ ½¼ if (izq < der) { // insertar a la izquierda del actual de it_izq it_izq.append(Termino(it_der.get_current().coef, der)); it_der.next(); // mirar el pr´ximo t´rmino de polinomio derecho o e continue; } Í× × Termino ½¼¾ º append() ×Ó Ö it izq Ö ÒØ Þ ÕÙ Ð ÒÙ ÚÓ Ø ÖÑ ÒÓ × ÔÖ ×ÓÖ Ð ØÙ Ð ÞÕÙ Ö Óº ÄÙ Ó Ú ÒÞ ÑÓ× Ð Ø Ö ÓÖ Ö Ó¸ ÔÙ × Ð Ø ÖÑ ÒÓ ÔÓØ Ò der Ý × Ó ÔÖÓ × Óº Ò ÐÑ ÒØ ¸ Ö Ô Ø ÑÓ× Ð ÔÖÓ Ñ ÒØÓº ¾º Ë Ð × ÔÓØ Ò × ×ÓÒ Ù Ð ×¸ ÒØÓÒ × ÑÓ× ×ÙÑ Ö ÐÓ× Ó ¬ ÒØ ׸ Ú ÒÞ Ö Ñ Ó× Ø Ö ÓÖ × Ý Ö Ô Ø Ö Ð ÔÖÓ Ñ ÒØÓº ר × Ð × ØÙ ÓÒ ÓÒ ÐÓ× Ø ÖÑ ÒÓ× 6x6 Ý x6 ÐÓ× ÔÓÐ ÒÓÑ Ó× ÞÕÙ Ö Ó Ý Ö Ó Ö ×Ô Ø Ú Ñ ÒØ º ½¼ ÈÖÓ × Ö Ø ÖÑ ÒÓ× ØÙ Ð × ½¼ +≡ ´½¼ µ ½¼ ½¼ if (izq == der) { // calcular coeficiente resultado it_izq.get_current() += it_der.get_current(); // llama a += de Termino it_der.next(); // avanzar al pr´ximo t´rmino del polinomio derecho o e if (it_izq.get_current().coef == 0) // verificar si suma anula el t´rmino e { // s´, borrarlo del polinomio izquierdo (coeficiente cero) ı it_izq.del(); continue; } } Í× × Termino ½¼¾ º ¿º Ò Ð ÙÐØ ÑÓ ×Ó ´ ÞÕ > Öµ¸ izq × Ö Ô ÖØ Ð Ö ×ÙÐØ Óº ÈÙ ×ØÓ ÕÙ izq Ý Ô ÖØ Ò this¸ × ÑÔÐ Ñ ÒØ Ú ÒÞ ÑÓ× Ð Ø Ö ÓÖ ÞÕÙ Ö Ó Ý Ö Ô Ø ÑÓ× Ð ÔÖÓ Ñ ÒØÓº ר × Ð × ØÙ ÓÒ ÓÒ ÐÓ× Ø ÖÑ ÒÓ× 7x5 Ý −2x2 ÐÓ× ÔÓÐ ÒÓÑ Ó× ÞÕÙ Ö Ó Ý Ö Ó Ö ×Ô ¹ Ø Ú Ñ ÒØ º ½¼ ÈÖÓ × Ö Ø ÖÑ ÒÓ× ØÙ Ð × ½¼ +≡ ´½¼ µ ½¼ it_izq.next(); Ð ÔÖÓ ×Ó Ø Ö Ø ÚÓ ÒØ Ö ÓÖ ÙÐÑ Ò Ù Ò Ó Ð ÙÒÓ ÐÓ× Ø Ö ÓÖ × Ð ÒÞ Ð ¬Ò Ð ÙÒ Ð × Ð ×Ø ׺ Ò ×Ø ×Ó ÕÙ ÔÓÖ Ö ÓÖÖ Ö ÙÒ Ð ×Ø º Ë Ð Ð ×Ø ÔÓÖ Ö ÓÖÖ Ö × Ð ÞÕÙ Ö ¸ ÒÓ ÑÓ× Ö Ò ¸ ÔÙ × ×Ù× Ð Ñ ÒØÓ׸ ÕÙ ×ÓÒ Ô ÖØ Ð Ö ×ÙÐØ Ó¸ Ý ×Ø Ò Ò ÐÙ Ó× Ò thisº Ë ¸ ÔÓÖ Ð ÓÒØÖ Ö Ó¸ Ð Ð ×Ø ÕÙ Ö ×Ø ÔÓÖ Ö ÓÖÖ Ö × Ð Ö ¸ ÒØÓÒ × ÑÓ× ÓÔ Ö ØÓ Ó× ×Ù× Ø ÖÑ ÒÓ× Ö ×Ø ÒØ × Ò× ÖØ ÖÐÓ× × Ù Ò ÐÑ ÒØ Ò Ð Ð ×Ø ÞÕÙ Ö ½¼ ÁÑÔÐ ÒØ ÓÒ ÈÓÐ ÒÓÑ Ó ÓÔ Ö ØÓÖ · ½¼¿ +≡ ´½¼¿ µ ½¼ while (it_der.has_current()) // copia t´rminos restantes de derecho al izquierdo e {
  • 132.
    106 Cap´ ıtulo 2. Secuencias terminos.append(Termino(it_der.get_current().coef, it_der.get_current().pot)); it_der.next(); } Í× × Termino ½¼¾ º Multiplicaci´n de polinomios o Ä ÑÙÐØ ÔÐ ÓÒ Ó× ÔÓÐ ÒÓÑ Ó× P1 = n i=0 cix i Ý P2 = m j=0 djx j × ¬Ò ÓÑÓ n m P1P2 = cix i kjxj . i=0 j=0 ר ÜÔÖ × ÓÒ ×Ù Ö ÙÒ Ð ÓÖ ØÑÓ × Ó Ò ×ÙÑ ÔÖÓ Ù ØÓ× Ô Ö Ð ×¸ Ð Ù Ð ÔÙ Ö ×ÙÑ Ö× ÓÑÓ × Ù Algoritmo 2.1 (Multiplicaci´n de dos polinomios) o Ä ÒØÖ ×ÓÒ Ó× ÔÓÐ ÒÓÑ Ó× P1 = n cixj Ý P2 = i=0 m j=0 djx j Ö Ó× n Ý m Ö ×Ô Ø Ú Ñ ÒØ º Ä × Ð × ÙÒ ÔÓÐ ÒÓÑ Ó R ÓÖÖ ×ÔÓÒ ÒØ Ð ÔÖÓ Ù ØÓ P1P2º ½º ÁÒר Ò ÙÒ ÔÓÐ ÒÓÑ Ó ÒÙÐÓ Rº ¾º Ê Ô Ø Ô Ö i = 0 ר n ´ µ Ë R = cixi × P2 ´ µ R=R+R ÓÖ ÔÓ ÑÓ× Ó ¬ Ö Ð ÓÔ Ö ÓÖ * ÓÑÔÐ Ø Ñ ÒØ Ö Ñ Ò × ÒØ Ð Ð ÓÖ ØÑÓ ¾º½ ½¼ ÁÑÔÐ Ñ ÒØ ÓÒ Ñ ØÓ Ó× ÈÓÐ ÒÓÑ Ó ½¼¿ +≡ ´½¼¼ µ ½¼¿ Polinomio Polinomio::operator * (const Polinomio & der) const { Polinomio result; if (terminos.is_empty() or der.terminos.is_empty()) return result; for (DynDlist<Termino>::Iterator it_izq(const_cast<DynDlist<Termino>&>(terminos)); it_izq.has_current(); it_izq.next()) result += der.multiplicado_por(it_izq.get_current()); return result; } Í× × DynDlist ¿ Ò Termino ½¼¾ º Ð if Ú Ö ¬ ÕÙ × Ð ÙÒÓ ÐÓ× ÔÓÐ ÒÓÑ Ó× × ÒÙÐÓ¸ ÒØÓÒ × Ð ÔÖÓ Ù ØÓ × ÒÙÐÓº Ð for × Ü Ø Ñ ÒØ Ð Ú Ö× ÓÒ Ó ¬ Ð Ð ÓÖ ØÑÓ ¾º½ Ø ÖÑ ÒÓ Ð ÔÓÐ ÒÓÑ Ó ÞÕÙ Ö Ó × ÑÙÐØ ÔÐ ÒØ Ö Ñ ÒØ ÔÓÖ Ð ÔÓÐ ÒÓÑ Ó Ö Ó Ý Ð Ö ×ÙÐØ Ó × ÙÑÙÐ Ó
  • 133.
    2.5. Pilas 107 Ò Ð ÔÓÐ ÒÓÑ Ó resultº Ð Ö Ñ ÒØÓ der.por termino(it izq.get current() ÓÖÖ ×¹ ÔÓÒ Ð ÑÙÐØ ÔÐ ÓÒ ÙÒ ÔÓÐ ÒÓÑ Ó ÔÓÖ ÙÒ Ø ÖÑ ÒÓ ÓÔ Ö ÓÒ ÕÙ ¬Ò ÑÓ× ÓÒØ ÒÙ ÓÒ ½¼ Å Ñ ÖÓ× ÔÖ Ú Ó× ÈÓÐ ÒÓÑ Ó ½¼¾ +≡ ´½¼¼ µ ½¼¾ Polinomio multiplicado_por(const Termino & term) const { Polinomio result; if (terminos.is_empty() or term.coef == 0) return result; for (DynDlist<Termino>::Iterator it(const_cast<DynDlist<Termino>&>(terminos)); it.has_current(); it.next()) result.terminos.append(Termino(it.get_current().coef * term.coef, it.get_current().pot + term.pot) ); return result; } Í× × DynDlist ¿ Ò Termino ½¼¾ º Ð Ð ÓÖ ØÑÓ × × Ò ÐÐÓº Ë Òר Ò ÙÒ ÔÓÐ ÒÓÑ Ó result ÓÒ Ú ÐÓÖ Ò Ð Ù Ð Ð ÔÓÐ ÒÓÑ Ó ÒÙÐÓº ÄÙ Ó¸ ÔÓÖ Ø ÖÑ ÒÓ Ð ÔÓÐ ÒÓÑ Ó¸ × ÑÙÐØ ÔÐ ÔÓÖ Ð Ø ÖÑ ÒÓ ÓÔ Ö Ò Ó Ý Ð Ö ×ÙÐØ Ó × Ò× ÖØ ÓÖ Ò Ñ ÒØ Ò resultº 2.5 Pilas ÍÒ Ô Ð × ÙÒ ×ØÖ ÓÒ ­Ù Ó ÓÒ× ×Ø ÒØ ÙÒ × Ù Ò Ð Ñ ÒØÓ× Ò Ð Ù Ð Ð × ÓÔ Ö ÓÒ × Ò× Ö ÓÒ¸ ÓÒ×ÙÐØ Ý Ð Ñ Ò ÓÒ × ÙØ Ò ÔÓÖ ÙÒ ×ÓÐÓ ÜØÖ ÑÓº Ä ÔÖÓÔ × Ò Ð × ÕÙ Ð ÙÐØ ÑÓ Ð Ñ ÒØÓ Ò Ò× ÖØ Ö× × ÑÔÖ × Ö Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ Ò ÐÑÒ Ö× º Ì Ð ÔÖÓÔ × ÓÒÓ ÓÑÓ Í ÈË ´ÍÐØ ÑÓ Ò ÒØÖ Ö¸ ÈÖ Ñ ÖÓ Ò Ë Ð Öµ½ º push pop ØÓÔ 8 7 6 4 3 2 1 ÙÖ ¾º½ ×ØÖ ÓÒ ÙÒ Ô Ð Ö ¬ Ñ ÒØ ¸ ÔÓ ÑÓ× Ú Ö ÙÒ Ô Ð ÓÑÓ ÙÒ Ö Ô ÒØ ÓÒ ÙÒ ×ÓÐ ÒØÖ Ø Ð ÓÑÓ Ò Ð ¬ ÙÖ ¾º½ º Ù Ò Ó × Ò× ÖØ ÙÒ Ð Ñ ÒØÓ¸ ÐÓ× Ð Ñ ÒØÓ× ÔÖ Ú Ñ ÒØ Ò× ÖØ ¹ Ó× × ÑÔÙ Ò Óº ÈÓÖ × Ö ÞÓÒ¸ Ð ÓÔ Ö ÓÒ Ò× Ö ÓÒ × ÒÓÑ Ò ÓÑÙÒÑ ÒØ ÔÙ× º Ð ÜØÖ ÑÓ Ð Ö Ô ÒØ ¸ ÔÓÖ ÓÒ ÒØÖ Ò Ý × Ð Ò ÐÓ× Ð Ñ ÒØÓ׸ × ÒÓÑ Ò ØÓÔ ¸ Ð Ù Ð × Ð ÙÒ Ó ÔÙÒØÓ Ñ Ò ÔÙÐ ÓÒ Ð Ô Ð º ½ Ò Ò Ð × ÄÁ Ç ´Ð ר Ò¸ ¬Öר ÓÙØµº
  • 134.
    108 Cap´ ıtulo 2. Secuencias Ð ÓÖ Ñ ÒØ Ð Ò Ó¸ Ù Ò Ó × Ø Ú ÙÒ ×ÙÔÖ × ÓÒ¸ Ð Ö ×ÓÖØ ÑÔÙ ÐÓ× Ð ¹ Ñ ÒØÓ× ÖÖ Ý Ð Ð Ñ ÒØÓ × ØÙ Ó Ò Ð ØÓÔ × ÐØ Ù Ö º ÈÓÖ × Ö ÞÓÒ¸ Ð ×ÙÔÖ × ÓÒ ÙÒ Ô Ð × Ð ÒÓÑ Ò ÓÑÙÒÑ ÒØ ÔÓÔ º ÍÒ Ô Ð × ÙØ Ð Þ Ù Ò Ó × Ö ÕÙ Ö ÙÒ ­Ù Ó ÔÖÓ × Ñ ÒØÓ Ð Ñ ÒØÓ× ÒÚ Ö×Ó Ð × ÙÒ Ó × ÖÚ ÓÒ Ó ÒØÖ × Ö¸ × Ð Ñ × Ö ÒØ Ñ ÒØ Ó × Ö¹ Ú Ó ×Ø Ð Ñ × ÒØ Ù Ñ ÒØ Ó × ÖÚ Óº Ù ÐÕÙ Ö Ô ØÖÓÒ ÔÖÓ × Ñ ÒØÓ ÕÙ Ú × Ø Ð Ñ ÒØÓ× ÙÒ ÓÒ ÙÒØÓ Ò ×Ø ÓÖ Ò × ×Ù× ÔØ Ð ÑÔÐ ÒØ Ö× ÓÒ ÙÒ Ô Ð º Ä Ú Ö Ð Ó Ö Ð ÙÒÓ× ÑÔÐÓ× Ð × ÔÐ Ò Ô Ð º Ù ÐÕÙ Ö ÒÓ×ÓØÖÓ× Ö ÜÔ Ö Ò Ó Ð Ö Ö Ò ÔÓÔÙÐ Ö ÕÙ Ö Þ ÐÓ× ÙÐØ ÑÓ× × Ö Ò ÐÓ× ÔÖ Ñ ÖÓ× º Ð Ð Ú Ó Ñ ÒÙ Ð ÔÐ ØÓ× Ò ÙÒ Ö ÖÓ ÓÑ ×Ø Ó × Ù Ð × ÔÐ Ò Ô Ð º ÈÖÓ ¹ Ð Ñ ÒØ ¸ ÐÓ× ÔÐ ØÓ× × Ô Ð Ò × ÙÒ Ð ÓÖ Ò ÙÐÑ Ò ÓÒ Ð ÓÑ × Ö¸ Ð ØÓÔ Ð Ô Ð ÓÒØ Ò Ð ÔÐ ØÓ Ð ÙÐØ Ñ Ô Ö×ÓÒ Ò ÙÐÑ Ò Ö ×Ù ÓÑ º Ù Ò Ó Ð Ú ÑÓ× ÐÓ× ÔÐ ØÓ׸ ÐÓ× Ò ÓÒ ÑÓ× Ý ÐÓ× Ô Ð ÑÓ× Ò Ð × ÙÒ Ó Ö Ô ÒØ Ð Ö ÖÓº ÈÓר Ö ÓÖÑ ÒØ ¸ Ò Ù ÑÓ× ÐÓ× ÔÐ ØÓ× Ý ÐÓ× Ô Ð ÑÓ× Ò Ð × ÙÖÖ ÖÓº ר ÑÔÐÓ ÙØ ¹ Ð Þ ØÖ × Ô Ð × Ý Ö ­ ÙÒ Ø ÔÓ ÔÖÓ × Ñ ÒØÓ Ò Ð Ù Ð ÐÓ ÑÔÓÖØ ÒØ × ÙÐÑ Ò Ö ¬ ÞÑ ÒØ Ð ØÖ Ó Ý ÒÓ Ð ÓÖ Ò Ò ÕÙ ÐÓ× ÔÐ ØÓ× ×ÓÒ ÔÖÓ × Ó׺ 2.5.1 Representaciones de una pila en memoria À Ý Ó× Ñ ØÓ Ó× Ô Ö Ö ÔÖ × ÒØ Ö ÙÒ Ô Ð ÖÖ ÐÓ× Ý Ð ×Ø × ÒÐ Þ ×º Ò Ñ × Ö ¹ ÔÖ × ÒØ ÓÒ ×¸ ÐÓ× Ð Ñ ÒØÓ× × ×ÔÓÒ Ò × Ù Ò ÐÑ ÒØ × ÙÒ Ð Ñ ×ÑÓ ÓÖ Ò Ð ÔÐ º Ò ÙÒ ÖÖ ÐÓ × Ö ÕÙ Ö Ñ ÒØ Ò Ö Ð Ò Ð ÙÐØ ÑÓ Ð Ñ ÒØÓº Ä ÔÖ Ñ Ö ÒØÖ ÐÑ Ò Ð Ð Ñ ÒØÓ Ñ × ÒØ ÙÓ¸ Ñ ÒØÖ × ÕÙ Ð Ò Ö Ö Ò Ð ØÓÔ Ñ × ÙÒÓº Ä ¬ ÙÖ ¾º½ ÐÙ×ØÖ ÙÒ Ô Ð 5 Ð Ñ ÒØÓ× ÓÒØ Ò Ò ÙÒ ÖÖ ÐÓ 11 Ð Ñ ÒØÓ׺ ¼ ½ ¾ ¿ ½¼ T0 T1 T2 T3 T4 Ð Ñ ÒØÓ Ñ × ÒØ ÙÓ ØÓÔ ÙÖ ¾º½ Ê ÔÖ × ÒØ ÓÒ ÙÒ Ô Ð Ñ ÒØ ÙÒ ÖÖ ÐÓ Ò ÙÒ Ð ×Ø ÒÐ Þ Ö ÕÙ Ö ÑÓ× Ñ ÒØ Ò Ö ÙÒ ÔÙÒØ ÓÖ Ð ÔÖ Ñ Ö ÒÓ Óº ÈÙ ×ØÓ ÕÙ ×ÓÐÓ ÒÓ× ÒØ Ö × Ð ØÓÔ ¸ Ð × Ù Ò Ð Ð ×Ø ר ÒÚ ÖØ × Ö¸ Ð ÔÖ Ñ Ö ÒÓ Ó Ð Ð ×Ø ÐÑ Ò Ð ØÓÔ Ý Ð ÙÐØ ÑÓ ÐÑ Ò Ð Ñ × ÒØ ÙÓº Ä ¬ ÙÖ ¾º½ ÐÙ×ØÖ Ð Ö ÔÖ × ÒØ ÓÒº Ä × Ð ÓÒ Ö ÔÖ × ÒØ ÓÒ Ô Ò Ö Ð × Ö ÙÒר Ò ×º Ò ÐÓ ÕÙ Ø Ò Ð ×¹ Ô Ó¸ ÕÙ Þ ÙÒ ØÓÖ ÓÒ× Ö Ð × Ð Ñ Ü Ñ ÒØ Ð Ñ ÒØÓ× ÕÙ ÔÙ ÓÒØ Ò Ö Ð ÔÐ ¸ Ð Ù Ð Ô Ò Ð ÔÐ ÓÒº Ä × Ð ×Ø × ÖÖ Ò ÙÒ ×Ó Ö Óר ÔÓÖ Ð Ñ ÒØÓ Ó Ð ÔÙÒØ ÓÖ ÓÒ Ðº Ë × ÓÒÓ Ð Ñ Ü Ñ ÒØ Ð Ñ ÒØÓ× Ý Ð ÔÐ ÓÒ Ð ÔÖÓÚ ¸ ÒØÓÒ × ×Ø Ð ÖÓ ÕÙ Ð ÖÖ ÐÓ × Ñ × ÓÑÔ ØÓ ÕÙ Ð Ð ×Ø º ÇØÖÓ ØÓÖ Ú ÐÙ Ö × Ð Ú Ö ÓÒ Ñ Ü Ñ Ð Ø Ñ ÒÓ Ð Ô Ð º ÈÓ ÑÓ× ÓÒÓ Ö Ð Ñ Ü ÑÓ¸ Ô ÖÓ × ×Ø × ÑÙÝ ÔÓ Ó ÔÖÓ Ð ¸ ÒØÓÒ ×¸ Ò ÔÖÓÑ Ó¸ ÔÙ × Ö Ñ × Ö ØÓ Ò ×Ô Ó ÙÒ Ö ÔÖ × ÒØ ÓÒ ÓÒ Ð ×Ø × ÕÙ Ò ÓÕÙ Ð Ø Ñ ÒÓ ÔÖÓÑ Óº Ä × Ð ÓÒ
  • 135.
    2.5. Pilas 109 tope Ð Ñ ÒØÓ Ñ × ÒØ ÙÓ ÙÖ ¾º½ Ê ÔÖ × ÒØ ÓÒ ÙÒ Ô Ð ÓÒ Ð ×Ø × ÒÐ Þ × × ØÙ Ö ÓÒ× Ö Ò Ó Ð ×Ú ÓÒ Ø Ô Ð Ø Ñ ÒÓ Ð Ô Ð º Ë l Ð Ø Ñ ÒÓ ÔÖÓÑ Ó Ð Ô Ð ¸ σl Ð ×Ú ÓÒ Ø Ô ¸ lmax Ð Ø Ñ ÒÓ Ñ Ü ÑÓ ÕÙ ÔÙ Ð ÒÞ Ö Ð Ô Ð ¸ Ts Ð ×Ô Ó Ó ÙÔ Ó ÔÓÖ ÙÒ Ð Ñ ÒØÓ Ð Ô Ð Ý ps Ð ×Ô Ó Ó ÙÔ Ó ÔÓÖ ÙÒ ÔÙÒØ ÓÖ¸ ÒØÓÒ ×¸ × (l + σl)(Ts + ps) ≤ lmaxTs , ´¾º¾¼µ ÒØÓÒ ×¸ Ò ÔÖÓÑ Ó¸ Ð Ð ×Ø Ó ÙÔ Ö Ñ ÒÓ× ×Ô Ó ÕÙ Ð ÖÖ ÐÓº Ò ÐÓ ÕÙ ÓÒ ÖÒ Ð Ø ÑÔÓ Ù ÓÒ¸ Ð ÖÖ ÐÓ × Ð Ö ÔÖ × ÒØ ÓÒ Ñ × Ö Ô º ÈÙ ×ØÓ ÕÙ ÐÓ× Ð Ñ ÒØÓ× Ð ÖÖ ÐÓ ×ÓÒ × Ù Ò Ð × Ò Ñ ÑÓÖ ¸ Ð ÐÓ Ð ×Ô Ð Ý Ø ÑÔÓÖ Ð × ÔÖÓÚ Ý Ð Ð ÓÑÔÙØ ÓÖ ÐÓ Ö ×Ù ÓÑ Ø Óº ר ÒÓ × Ð ×Ó ÓÒ Ð × Ð ×Ø × ÓÒ ÐÓ× ÒÓ Ó× ×Ø Ö Ò Ò Ö ÓÒ × Ñ ÑÓÖ Ö ÒØ ׺ ÈÓÖ ÓØÖ Ô ÖØ ¸ Ù Ò Ó × Ò× ÖØ Ó × ×ÙÔÖ Ñ ÙÒ Ð Ñ ÒØÓ Ò ÙÒ Ð ×Ø ÒÐ Þ ¸ ÔÙ ÒÚÓ Ö× Ð Ñ Ò ÓÖ Ñ ÑÓÖ º Ð Ñ Ò Ó Ñ ÑÓÖ ÑÔÓÒ ÙÒ ×Ó Ö Óר ÓÒ Ð Ò ÙÒ Ð ×Ø Ö ×Ô ØÓ Ð ÖÖ ÐÓº Ä ¬ Ò Ð Ñ Ò ÓÖ Ñ ÑÓÖ Ô Ö Ô ÖØ Ö ÙÒ ÐÓÕÙ × ÑÙÝ Ú Ö Ð Ý ÔÙ × Ö ÔÖÓÔÓÖ ÓÒ Ð Ð ÒØ ÐÓÕÙ × Ô ÖØ º Ä Ñ ×Ñ ÓÒ× Ö ÓÒ × Ú Ð Ù Ò Ó × Ð Ö ÙÒ ÐÓÕÙ º ÍÒ Ô Ð ÔÙ ÒרÖÙÑ ÒØ Ö× Ö Ø Ñ ÒØ Ñ ÒØ Ð Ø ÔÓ DynDlist<T> ¬Ò Ó Ò Ü ¾º º½¼ ´Ô Ò ¿µº Ë Ñ Ö ÑÓ× Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ Ð Ð ×Ø ÓÑÓ Ð ØÓÔ ¸ ÒØÓÒ × push(item) ÕÙ Ú Ð insert(item)¸ pop() remove first() Ý top() get first()º 2.5.2 El TAD ArrayStack<T> (pila vectorizada) Ð × ÑÔ ÒÓ ÙÒ Ô Ð ÑÔÐ ÒØ Ñ ÒØ ÙÒ ÖÖ ÐÓ × Ø Ò Ü Ð ÒØ ÕÙ Ú Ð Ð ÔÒ Ö ÜÔÐ ØÓ Ð Ñ Ò ×ÑÓ ÑÔÐ ÒØ ÓÒº ArrayStack<T> ×Ô Ö Ü Ô ÓÒ × Ù Ò Ó × Ü Ð Ô Ð ÖÖ ÐÓ Ó Ù Ò Ó × ÒØ ÒØ Ö Ð ØÓÔ ÙÒ Ô Ð Ú º ×Ô Ö Ö ×Ø × Ü Ô ÓÒ × Ø Ò ÙÒ Ð ÖÓ Óר Ò × ÑÔ ÒÓ ÕÙ ÔÙ × Ö ÑÔÓÖØ ÒØ × Ð Ô Ð × ÙØ Ð Þ ÑÙÝ Ñ ÒÙ Óº Ü ×Ø Ò ÑÙ × ÔÐ ÓÒ × Ò Ð × Ù Ð × × ÔÙ ÓÒÓ Ö Ð Ø Ñ ÒÓ Ñ Ü ÑÓ Ð Ô Ð Ý Ò Ð × ÕÙ × ÒÒ × Ö Ó ÓÒ× Ö Ö Ð × ÓÖ º ÈÓÖ ÓØÖ Ô ÖØ ¸ ÙÒ × ÓÖ Ò Ø ÚÓ × ÙÒ ÖÖÓÖ ÔÖÓ Ö Ñ ÓÒ Ú Ö ¬ Ö Ò Ð × ÔÖ Ñ Ö × Ø Ô × ÙÒ ÔÖÓÝ ØÓº ÈÓÖ × Ö ÞÓÒ¸ Ð Ì FixedStack<T> ÑÓ Ð Þ Ð × Ñ ×Ñ × ÔÖ Ñ Ø Ú × ÕÙ ArrayStack<T> ÓÒ Ð ÖÒ ÕÙ ÒÓ × ØÙ Ò Ú Ö ¬ ÓÒ × Ý ÒÓ × ×Ô Ö Ò Ü Ô ÓÒ ×º ר Ñ Ò Ö ¸ ÔÐ ÓÒ × ÕÙ ÓÒÓÞ Ò Ð Ñ Ü ÑÓ Ø Ñ ÒÓ Ô Ð × Ò ¬ Ò Ð Ò Ò Ò Ú ÐÓ ÔÓÖ Ð Ù× Ò Ú Ö ¬ ÓÒ ×º È Ð × ÑÔÐ ÒØ × ÓÒ ÖÖ ÐÓ× × ¬Ò Ò Ò Ð Ö ÚÓ ØÔÐ ÖÖ ÝËØ ºÀ ½¼ ¸ Ð Ù Ð ÜÔÓÖØ Ó× Ø ÔÓ× ÔÖ Ò Ô Ð × ArrayStack<T> Ý FixedStack<T> ½¼ ØÔÐ ÖÖ ÝËØ ºÀ ½¼ ≡ template <typename T, const size_t dim = 100> class ArrayStack
  • 136.
    110 Cap´ ıtulo 2. Secuencias { Ñ Ñ ÖÓ× ÔÖ Ú Ó× Ô Ð Ú ØÓÖ Þ ½½¼ Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayStack<T> ½½¼ }; template <typename T, const size_t dim = 100> class FixedStack { }; ¬Ò × ArrayStack¸ Ù× Ò ÙÒ × ½½¼ ¸ ½½ ¸ ½¾ ¸ ¾ ß ¸ Ò ¿¾ º FixedStack¸ Ù× Ò ÙÒ × ½ ¿ ¸ ¸ Ò ½ º ÄÓ× Ó× Ø ÔÓ× ØÓ× ÔÓ× Ò ÐÓ× Ñ ×ÑÓ× ØÖ ÙØÓ× ×ØÓ× ×ÓÒ ½½¼ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Ô Ð Ú ØÓÖ Þ ½½¼ ≡ ´½¼ µ T array[dim]; size_t head; array × ÙÒ ÖÖ ÐÓ ×Ø Ø Ó Ð Ñ ÒØÓ× Ø ÔÓ T ÓÒ Ñ Ò× ÓÒ dimº dim × ÙÒ Ô Ö Ñ ØÖÓ Ð ÔÐ ÒØ ÐÐ ÕÙ Ö ÔÖ × ÒØ Ð Ñ Ò× ÓÒ Ð ÖÖ ÐÓ Ý ÓÒ ÙÒ Ú ÐÓÖ ÔÓÖ ÓÑ × ÓÒ 100º head × Ð Ò Ð ÔÖÓÜ Ñ ÒØÖ ×ÔÓÒ Ð º Ì Ñ Ò Ò Ð ÒØ Ð Ñ ÒØÓ× Ð Ô Ð º head - 1 × Ð Ò Ð Ð Ñ ÒØÓ ØÓÔ º Ä ÓÒרÖÙ ÓÒ ÙÒ Ô Ð ×ÓÐÓ Ö ÕÙ Ö Ò Ð Þ Ö head ½½¼ Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayStack<T> ½½¼ ≡ ´½¼ µ ½½¼ ArrayStack() : head(0) { /* empty */ } Í× × ArrayStack ½¼ º È Ö Ò× ÖØ Ö ÙÒ Ð Ñ ÒØÓ × Ù× Ð Ñ ØÓ Ó push() ½½¼ Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayStack<T> ½½¼ +≡ ´½¼ µ ½½¼ ½½¼ T & push(const T & data) throw(std::exception, std::overflow_error) { if (head >= dim) throw std::overflow_error ("array stack overflow"); ÔÙ× Ø ½½¼ } ½½¼ ÔÙ× Ø ½½¼ ≡ ´½½¼ µ array[head++] = data; return array[head - 1]; Ò Ð ÙÒ × ÔÐ ÓÒ ×¸ × Ö ÕÙ Ö Ô ÖØ Ö ×Ô Ó Ò Ð Ô Ð × Ò ÕÙ ÙÒ × ÓÒÓÞ Ò ÐÓ× Ú ÐÓÖ × Ò× Ö ÓÒº Ë Ò ×ØÓ ÔÙ ÐÓ Ö Ö× Ñ ÒØ ÙÒ × Ö ÓÒ× ÙØ Ú pushes ØÓ× Ú Ó× ¸ × Ñ × ¬ ÒØ Ó Ö Ö ÙÒ ×ÓÐ ÓÔ Ö ÓÒº Ì Ð ÓÔ Ö ÓÒ × ÒÓÑ Ò pushn() Ý × ÑÔÐ ÒØ ÓÑÓ × Ù ½½¼ Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayStack<T> ½½¼ +≡ ´½¼ µ ½½¼ ½½½ T & pushn(const size_t & n = 1) throw(std::exception, std::overflow_error) { if (head + n > dim) throw std::overflow_error ("array stack overflow"); Ô ÖØ Ö Ò Ð Ñ ÒØÓ× ½½½ }
  • 137.
    2.5. Pilas 111 Ô ÖØ Ö Ð ØÓÔ ¸ Ð Ù×Ù Ö Ó ArrayStack<T> ÔÙ Ö Ö Ò Ö ÐÓ× n Ð Ñ ÒØÓ× Ò× ÖØ Ó× ÕÙ ÒÓ Ò × Ó Ò Ð Þ Ó× Ý × × Ò ÖÐ × ×Ù Ú ÐÓÖ Ù Ò Ó × Ò × Ö Óº Ô ÖØ Ö Ò Ð Ñ ÒØÓ× ½½½ × ÑÙÝ × ÑÔÐ ÓÒ ÙÒ ÖÖ ÐÓ ×Ø ÓÒ Ò Ö Ñ ÒØ Ö head ½½½ Ô ÖØ Ö Ò Ð Ñ ÒØÓ× ½½½ ≡ ´½½¼ µ head += n; return array[head - 1]; È Ö × Ö ÙÒ Ð Ñ ÒØÓ Ð Ô Ð ¸ ÙØ Ð Þ ÑÓ× pop() ½½½ Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayStack<T> ½½¼ +≡ ´½¼ µ ½½¼ ½½½ T pop() { ÔÓÔ Ø ½½½ } ½½½ ÔÓÔ Ø ½½½ ≡ ´½½½ µ return array[--head]; ÈÓÖ Ö ÞÓÒ × ¬ Ò ¸ Ø Ñ Ò × × Ð Ó Ö Ö ÙÒ ÔÖ Ñ Ø Ú ÕÙ Ð Ö Ú Ö Ó× Ð Ñ ÒØÓ× Ò ÙÒ ×ÓÐ ÓÔ Ö ÓÒ ½½½ Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayStack<T> ½½¼ +≡ ´½¼ µ ½½½ ½½½ T popn(const int & n) { Ð Ö Ö Ò Ð Ñ ÒØÓ× ½½½ } Ò Ð ÙÒÓ× ÓÒØ ÜØÓ׸ ר ÓÔ Ö ÓÒ × Ð ÐÐ Ñ ÑÙÐØ ÔÓÔ º ½½½ Ð Ö Ö Ò Ð Ñ ÒØÓ× ½½½ ≡ ´½½½ µ head -= n; return array[head]; À Ý Ú Ö × ÓÖÑ × ÓÒ×ÙÐØ Ö Ð Ô Ð ØÓ × × Ö Ð Þ Ò Ö ×Ô ØÓ Ð ØÓÔ Ý Ö ØÓÖÒ Ò ÙÒ Ö Ö Ò ÙÒ Ð Ñ ÒØÓ ÒØÖÓ Ð Ô Ð º Ä ÔÖ Ñ Ö ÓÖÑ × Ð Ð Ð Ñ ÒØÓ Ò Ð ØÓÔ ½½½ Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayStack<T> ½½¼ +≡ ´½¼ µ ½½½ ½½½ T & top() { Ö ØÓÖÒ Ö Ö Ö Ò Ð ØÓÔ ½½½ } ½½½ Ö ØÓÖÒ Ö Ö Ö Ò Ð ØÓÔ ½½½ ≡ ´½½½ µ return array[head - 1]; ÇØÖÓ Ø ÔÓ ÓÒ×ÙÐØ ¸ Ñ ÒÓ× Ö Ù ÒØ Ô ÖÓ ÔÓ× Ð Ò Ð ÙÒ × ÔÐ ÓÒ ×¸ × ÓÒÓ Ö Ð i¹ × ÑÓ Ð Ñ ÒØÓ Ö ×Ô ØÓ Ð ØÓÔ ½½½ Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayStack<T> ½½¼ +≡ ´½¼ µ ½½½ ½½¾ T & top(const int & i) { Ö ÖÒ Ð i¹ × ÑÓ Ö ×Ô ØÓ ØÓÔ ½½½ } ÍÒ Ú Þ Ú Ð Ó Ð Ö Ò Ó ×Ó¸ Ð Ð Ñ ÒØÓ × ÓÑ ÒØ ½½½ Ö ÖÒ Ð i¹ × ÑÓ Ö ×Ô ØÓ ØÓÔ ½½½ ≡ ´½½½ µ return array[head - i - 1];
  • 138.
    112 Cap´ ıtulo 2. Secuencias Ò Ð ÙÒ × Ó × ÓÒ × ÙÒ Ô Ð × Ö ÙØ Ð Þ Ð ÓÒ ÓÒ ÕÙ ×Ø × ÔÖ Ú Ñ ÒØ Ú º Î Ö Ð Ô Ð ÑÔÐ ÒØ ÓÒ ÙÒ ÖÖ ÐÓ × ÙÒ ÓÔ Ö ÓÒ ÜØÖ Ñ Ñ ÒØ Ö Ô ½½¾ Ú Ö Ô Ð ½½¾ ≡ ´½½¾ µ head = 0; ר Ð ÑÖ Ó Ö Ö× Ò ÙÒ ÔÖ Ñ Ø Ú ½½¾ Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayStack<T> ½½¼ +≡ ´½¼ µ ½½½ ½½¾ void empty() { Ú Ö Ô Ð ½½¾ } ÈÓ ÑÓ× ÓÒ×ÙÐØ Ö ÙÒ ÔÖ Ó ÕÙ ÒÓ× × Ð Ô Ð ×Ø Ó ÒÓ Ú ½½¾ Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayStack<T> ½½¼ +≡ ´½¼ µ ½½¾ ½½¾ bool is_empty() const { Ô Ð Ú ½½¾ } ½½¾ ÔÐ Ú ½½¾ ≡ ´½½¾ µ return head == 0; Ä ÒØ Ð Ñ ÒØÓ× Ð Ô Ð × Ö Ø Ñ ÒØ Ð Ú ÐÓÖ head ½½¾ Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayStack<T> ½½¼ +≡ ´½¼ µ ½½¾ const size_t & size() const { return head; } Ò Ú Ð ÒØ Ö Þ¸ FixedStack<T> × ÒØ ArrayStack<T>º ÈÓÖ Ö ÞÓÒ × ÓÑÔ Ø Ð ¸ × ÔÖ Ö Ð ¬Ò Ö Ð × Ñ ×Ñ × Ü Ô ÓÒ × ArrayStack<T> Ò Ð × ÔÖ Ñ Ø Ú × FixedStack<T>º ר ÑÓ Ó¸ FixedStack<T> × ÔÐ Ð Ò ×ØÓ ÓÒ × ÙØ Ð ArrayStack<T>º Ò Ú Ð ÑÔÐ ÒØ ÓÒ¸ FixedStack<T> × ÑÙÝ × Ñ Ð Ö ArrayStack<T>º Ä ¹ Ö Ò ÔÖ Ò Ô Ð Ö × Ò ÕÙ FixedStack<T> ÒÓ ØÙ Ú Ö ¬ ÓÒ × ÓÖ Ò ×Ô Ö Ü Ô ÓÒ ×º Ö ×ØÓ¸ ÔÖ Ñ Ø Ú FixedStack<T> × ÒØ ×Ù Ô Ö Ò ArrayStack<T>º 2.5.3 El TAD ListStack<T> (pila con listas enlazadas) Ð Ì ListStack<T> ÑÓ Ð Þ ÙÒ Ô Ð ÑÔÐ ÒØ Ñ ÒØ Ð ×Ø × ÒÐ Þ ×º Ð ÓÒÓ¹ Ö Ð Ø ÔÓ ÑÔÐ ÒØ ÓÒ¸ Ð Ù×Ù Ö Ó ÓÒÓ ÐÓ× Óר × Ò ×Ô Ó Ý Ø ÑÔÓ¸ × ÓÑÓ Ð × Ò Ò × Ò Ú Ö× Ø Ð ÑÔ ÖØ × ÔÓÖ Ð Ò ØÙÖ Ð Þ Ò Ñ Ð × Ð ×Ø × ÒÐ Þ ×º ListStack<T> × × Ò Ð Ì Snode<T>¸ Р٠и Ò × Ò ¸ ÓÒØ Ò ØÓ Ó ÐÓ Ò ¹ × Ö Ó Ô Ö Ñ Ò Ö Ð × Ð ×Ø ׺ ListStack<T> × ¬Ò Ò Ð Ö ÚÓ ØÔÐ Ð ×ØËØ ºÀ ½½¾ ½½¾ ØÔÐ Ð ×ØËØ ºÀ ½½¾ ≡ template <typename T> class ListStack : private Snode<T> { ØÖ ÙØÓ× ListStack<T> ½½¾ Ñ ØÓ Ó× ÔÙ Ð Ó× ListStack<T> ½½¿ }; ¬Ò × ListStack¸ Ù× Ò ÙÒ × ½½¿ß½ º Í× × Snode ½ º Å ÒØ Ö Ú ÓÒ Snode<T>¸ this ÙÒ ÒÓ Ó Ö Ð Ð ×Ø ÙÝÓ ÔÖ Ñ Ö Ð Ñ ÒØÓ × ÑÔÖ × Ö Ð ÒÓ Ó ØÓÔ Ð Ô Ð º ListStack<T> ÔÓ× ÙÒ ØÖ ÙØÓ ÙÒ Ó ½½¾ ØÖ ÙØÓ× ListStack<T> ½½¾ ≡ ´½½¾ µ size_t num_nodes;
  • 139.
    2.5. Pilas 113 T:class Snode T:class ListStack -num_nodes: size_t +ListStack() +push(node:Node*): void +pop(): Node* +top(): Node* +is_empty(): bool +size(): size_t T:class DynListStack +top(): T& +push(_data:const T&): T& +pop(): T +~DynListStack(): virtual ÙÖ ¾º¾¼ Ö Ñ ÍÅÄ Ð × Ð × × Ú Ò ÙÐ × ListStack<T> Ð Ù Ð ÓÒØ Ð Þ Ð ÒØ ÒÓ Ó× ÕÙ ÔÓ× Ð Ô Ð º ListStack<T> ÜÔÓÖØ Ó× × ÒÓÒ ÑÓ× ÒÓ Ó ½½¿ Ñ ØÓ Ó× ÔÙ Ð Ó× ListStack<T> ½½¿ ≡ ´½½¾ µ ½½¿ typedef Snode<T> Node; Í× × Snode ½ º Ò Ú Ð ÒØ Ö Þ¸ Ð × ÓÔ Ö ÓÒ × ListStack<T> Ñ Ò Ò ÒÓ Ó× Ð ÔÐ º Item × ÙÒ × ÒÓÒ ÑÓ Ó Ö Ó ÔÓÖ ÓÑÔ Ø Ð ÓÒ Ú Ö× ÓÒ × ÒØ Ö ÓÖ ×º Ð ÓÒרÖÙ ØÓÖ ListStack<T> ×ÓÐÓ × Ö Ñ Ø Ò Ö Ð ÓÒØ ÓÖ ÒÓ Ó× ½½¿ Ñ ØÓ Ó× ÔÙ Ð Ó× ListStack<T> ½½¿ +≡ ´½½¾ µ ½½¿ ½½¿ ListStack() : num_nodes(0) { /* Empty */ } Í× × ListStack ½½¾ º Ä ÓÔ Ö ÓÒ push() × ¬Ò Ò ÙÒ ÓÒ ÙÒ ListStack<T>::Node ½½¿ Ñ ØÓ Ó× ÔÙ Ð Ó× ListStack<T> ½½¿ +≡ ´½½¾ µ ½½¿ ½½ void push(Node * node) { ++num_nodes; this->insert_next(node); } push() ÒÓ Ò Ö Ò Ò ÙÒ Ü Ô ÓÒ¸ ÔÙ × ×Ù ÙÒ Ö ×ÔÓÒ× Ð × ÒÐ Þ Ö Ð ÒÓ Ó Ð Ð ×Ø º ÈÙ ×ØÓ ÕÙ this × Ð Ö ¸ insert next() × ÑÔÖ Ò× ÖØ Ö node Ð Ö ÒØ Ð Ð ×Ø ¸ Ð Ù Ð × ÑÔÖ × ÓÖÖ ×ÔÓÒ ÓÒ Ð ØÓÔ º
  • 140.
    114 Cap´ ıtulo 2. Secuencias ËÙÔÖ Ñ Ö Ð ØÓÔ ÕÙ Ú Ð ×ÙÔÖ Ñ Ö Ð ÒÓ Ó Ð Ö ÒØ Ð Ð ×Ø º ×ØÓ × Ö ØÓ × ÙÒ Ð ÒØ Ö Þ Snode<T> ½½ Ñ ØÓ Ó× ÔÙ Ð Ó× ListStack<T> ½½¿ +≡ ´½½¾ µ ½½¿ ½½ Node * pop() { --num_nodes; return this->remove_next(); } Ð ØÓÔ ÔÙ ÓÒ×ÙÐØ Ö× Ñ ÒØ ½½ Ñ ØÓ Ó× ÔÙ Ð Ó× ListStack<T> ½½¿ +≡ ´½½¾ µ ½½ Node * top() const { return static_cast<Node*>(this->get_next()); } 2.5.4 El TAD DynListStack<T> Ð Ì ListStack<T> Ñ Ò Ô Ð × Ò ÙÒ ÓÒ ÒÓ Ó× ÙÒ Ð ×Ø ÒÐ Þ º ×ØÓ Ó Ð Ð Ù×Ù Ö Ó ÓÒØÖÓÐ Ö Ý Ú Ö ¬ Ö Ø ÐÐ × Ð Ñ Ò Ó Ñ ÑÓÖ º Ä Ö ×ÔÓÒ× Ð ListStack<T> × Ð Ñ Ò Ó ÐÓ× ÒÓ Ó× Ð Ö ×ÔÓÒ× Ð Ð Ð ÒØ × Ô ÖØ Ö Ý Ð Ö Ö ÐÓ× ÒÓ Ó׺ ÓÑÓ ÑÓ× ÔÖ Ò Ó Ò Ó × ÓÒ × ÒØ Ö ÓÖ ×¸ Ñ Ò Ö ÐÓ× ÒР׸ Ø ÔÓ× Ý Ñ ÑÓÖ ÔÙ Ö Ð Þ Ö× Ó ÙÒ ×ÓÐÓ Ì ¸ Ö Ú Ó Ì Ñ × × Ò ÐÐÓ׺ Ð Ì DynListStack<T> ÙÑÔÐ Ð ÓÑ Ø Ó Ñ Ò ÓÒ Ó Ò Ð Ô ÖÖ Ó ÒØ ¹ Ö ÓÖº DynListStack<T> ¬Ò ÙÒ Ô Ð ÑÔÐ ÒØ ÓÒ Ð ×Ø × ÒÐ Þ × × ÑÔÐ × Ý ÓÒ Ñ Ò Ó Ñ ÑÓÖ Ò ÐÙ Óº DynListStack<T> ר ¬Ò Ó Ò Ð Ö ÚÓ ØÔÐ ÝÒÄ ×ØËØ ºÀ ½½ ½½ ØÔÐ ÝÒÄ ×ØËØ ºÀ ½½ ≡ template <typename T> class DynListStack : public ListStack<T> { Ñ ØÓ Ó× DynSlist<T> ½½ }; ¬Ò × DynListStack¸ Ù× Ò ÙÒ × ½½ ¸ ¾¼½¸ ¸ ¿ ¸ ¸ ¸ Ò º Í× × ListStack ½½¾ º DynListStack<T> ÐÑ Ò ØÓ× Ð Ø ÔÓ Ò Ö Ó Tº Ð Ö Ú Ö ÔÙ Ð Ñ ÒØ ListStack<T>¸ DynListStack<T> Ö Ö Ò Ô ÖØ ×Ù ÑÔÐ ÒØ ÓÒ Ý ×Ù ÒØ Ö Þº Ð Ñ Ò Ó Ð ×Ø × ÐÓ ÔÓÖØ ¸ ÒØÓÒ ×¸ ListStack<T>º Ä × ÔÖ Ñ Ø Ú × ÕÙ ÒÓ Ô Ò Ò Ð Ø ÔÓ T¸ is empty() Ý size()¸ × Ö Ò Ö Ø Ñ ÒØ º Ä × ÓØÖ × ÔÖ Ñ Ø Ú ×¸ ÕÙ × Ô Ò Ò ListStack<T>¸ Ò ×Ó Ö Ö Ö× Ô Ö ÕÙ Ñ Ò ÔÙÐ Ò ØÓ× Ø ÔÓ Tº ÓÑ ÒÞ ÑÓ× ÔÓÖ Ð × ÔÖ Ñ Ø Ú × Ñ × × Ò ÐÐ × ½½ Ñ ØÓ Ó× DynSlist<T> ½½ ≡ ´½½ µ ½½ T & top() const { return ListStack<T>::top()->get_data(); } Í× × ListStack ½½¾ º
  • 141.
    2.5. Pilas 115 top() ÓÒ×ÙÐØ Ð ÒÓ Ó ØÓÔ Ð Ð × × Ý Ö ØÓÖÒ ÙÒ Ö Ö Ò Ð ØÓº push() Ò× ÖØ Ö ÙÒ ØÓ Ø ÔÓ Tº ×ØÓ Ö ÕÙ Ö ¸ Ô ÖØ Ö Ð ÒÓ Ó¸ ÓÔ ÖÐ Ð ØÓ ÒÚÓ Ö Ð push() ListStack<T> ½½ Ñ ØÓ Ó× DynSlist<T> ½½ +≡ ´½½ µ ½½ ½½ T & push(const T & item) { typename ListStack<T>::Node *ptr = new typename ListStack<T>::Node (item); ListStack<T>::push(ptr); return ptr->get_data(); } Í× × ListStack ½½¾ º push() Ö ØÓÖÒ ÙÒ Ö Ö Ò Ð ØÓ ÓÒØ Ò Ó Ò Ð ØÓÔ º Ä Ð ÓÖ pop() × ÜØÖ Ö Ð ÒÓ Ó ListStack<T>¸ ÓÔ Ö Ð ØÓ Ö ØÓÖÒ Ö Ý Ð Ö Ö Ð Ñ ÑÓÖ º ר ÓÒ Ù Ø × ×Ô ¬ ÓÑÓ × Ù ½½ Ñ ØÓ Ó× DynSlist<T> ½½ +≡ ´½½ µ ½½ ½½ T pop() { typename ListStack<T>::Node* ptr = ListStack<T>::pop(); T retVal = ptr->get_data(); delete ptr; return retVal; } Í× × ListStack ½½¾ º ÈÙ ×ØÓ ÕÙDynListStack<T> × Ö ×ÔÓÒ× Ð Ð ÑÒ Ó Ñ ÑÓÖ ¸ DynListStack<T>::∼DynListStack Ð Ö Ö ØÓ Ð Ñ ÑÓÖ º × Ô٠׸ ÒÓ× × ÙÖ ÑÓ× Ú Ö ØÓ Ð Ô Ð Ò Ø ÑÔÓ ×ØÖÙ ÓÒ ½½ Ñ ØÓ Ó× DynSlist<T> ½½ +≡ ´½½ µ ½½ virtual ~DynListStack() { while (not this->is_empty()) pop(); } Í× × DynListStack ½½ º ÆÓØ ÑÓ× ÕÙ is empty() Ô ÖØ Ò ListStack<T> Ñ ÒØÖ × ÕÙ pop() DynListStack<T>º 2.5.5 Aplicaci´n: un evaluador de expresiones aritm´ticas infijas o e Ò Ð ÓÑ Ò Ó Ð Ñ Ø Ñ Ø ¸ Ý Ú Ö × Ñ Ò Ö × Ö ÔÖ × ÒØ Ö ÙÒ ÓÔ Ö ÓÒ Ò Ö º ÙÒ ×ÙÑ ÙÒ ÓÒÚ Ò ÓÒ Ö Ð ÔÓ× ÓÒ Ð ÓÔ Ö ÓÖ Ý ÐÓ× ÓÔ Ö Ò Ó׺ Ò ÒÓØ ÓÒ prefija¸ Ð ÓÔ Ö ÓÖ ÔÖ ÐÓ× ÓÔ Ö Ò Ó׺ Ò ÒÓØ ÓÒ sufija½ ¸ Ð ÓÔ Ö ÓÖ ×Ù ÐÓ× ÓÔ Ö Ò Ó׺ Ò ÒÓØ ÓÒ infija¸ Ð ÓÔ Ö ÓÖ × ÓÐÓ ÒØÖ ÐÓ× Ó× ÓÔ Ö Ò Ó׺ ÈÓÖ ÑÔÐÓ¸ ÔÓ ÑÓ× Ö ÔÖ × ÒØ Ö Ð ×ÙÑ Ó× ÓÔ Ö Ò Ó× x y ÓÑÓ × Ù ¯ ÈÖ ¬ +xy ¯ ËÙ¬ xy+ ½ Ò Ò Ð × × ØÖ Ù Ó ÓÑÓ ÔÓר¬Üº ÐÐ ÕÙ Ð ÙÒÓ× Ø ÜØÓ× Ð ÒÓÑ Ò Ò ÔÓר¬ º
  • 142.
    116 Cap´ ıtulo 2. Secuencias ¯ ÁÒ¬ x + y Ä ÒÓØ ÓÒ ÔÖ ¬ × ÔÖÓÜ Ñ Ð × Ñ Ø Ñ Ø × ØÖ ÓÒ Ð ×º Ð Ö ×ÙÐØ Ó Ú ÐÙ Ö ÙÒ ÙÒ ÓÒ f ÓÒ Ó× ÓÔ Ö Ò Ó× x y × ÒÓØ ÓÑÙÒÑ ÒØ ÓÑÓ f(x, y)º Ð Ñ ×ÑÓ ÑÓ Ó¸ Ð ÓÑÔÓ× ÓÒ ÙÒ ÓÒ Ð × ÒÓØ ÓÑÓ h(f(x, y)º Ä × ÒÓØ ÓÒ × ÔÖ ¬ Ý ×Ù¬ Ô ÖÑ Ø Ò ÙÒ ÒØ Ö ØÖ Ö ÓÔ Ö Ò Ó׺ ר × ÙÒ Ö Ò Ú ÒØ Ô Ö ÒÓØ Ö ÙÒ ÓÒ × ÑÙÐØ Ú Ö Ð × Ò ÓÐ Ù ÐÕÙ Ö º Ñ ×¸ Ù Ò Ó Ý Ú Ö × ÓÔ Ö ÓÒ ×¸ Ð × ÒÓØ ÓÒ × ÔÖ ¬ Ý ×Ù¬ Ô ÖÑ Ø Ò ÜÔÖ × Ö ØÓ × Ð × ÓÔ Ö ÓÒ × × Ò Ò × Ô Ö ÒØ × ×º ÈÓÖ ÑÔÐÓ¸ Ð ÓÖÑ ×Ù¬ x ∗ (y + z) × yz + x∗º È Ö Ú ÐÙ Ö ÙÒ ÜÔÖ × ÓÒ ÔÖ ¬ Ó ×Ù¬ × ÙØ Ð Þ ÙÒ Ô Ð º Ð Ð ÓÖ ØÑÓ Ô Ö Ú ÐÙ Ö ÜÔÖ × ÓÒ × ×Ù¬ × × × Ö ÓÑÓ × Ù Algoritmo 2.2 (Evaluaci´n de expresi´n sufija) o o Ä ÒØÖ Ð Ð ÓÖ ØÑÓ × ÙÒ × ÙÒ ÓÒØ Ò Ò Ó ÙÒ ÜÔÖ × ÓÒ ×Ù¬ ÓÑÔÙ ×Ø ÔÓÖ ÓÔ Ö ÓÖ × Ý ÓÔ Ö Ò Ó× ÒÙÑ Ö Ó׺ Ä × Ð × Ð Ú ÐÓÖ ÓÖÖ ×ÔÓÒ ÒØ Ð Ö ×ÙÐØ Ó ¬Ò к Ð Ð ÓÖ ØÑÓ ÙØ Ð Þ ÙÒ Ô Ð Ô Ö Ù Ö Ö Ö ×ÙÐØ Ó× Ô Ö Ð × Ý ÙÒ Ú Ö Ð ÐÐ Ñ ¬ ØÙ Ð Ó × ÑÔÐ Ñ ÒØ Ð ¬ º Ä ¬ ÓÒØ Ò Ð × Ñ ÓÐÓ¸ ÓÔ Ö Ò Ó Ù ÓÔ Ö ÓÖ¸ ÕÙ × ×Ø ÔÖÓ × Ò Óº Algoritmo ½º Ê Ô Ø Ñ ÒØÖ × Ð ¬ ÒÓ ×Ø Ð ¬Ò Ð Ð × ÙÒ º ´µË Ð ¬ × ÙÒ ÓÔ Ö ÓÖ =⇒ × ÕÙ Ó× Ú ÐÓÖ × Ð Ô Ð ¸ ØÙ Ð ÓÔ Ö ÓÒ ÔÓÖ Ð ÓÔ Ö ÓÖ Ð Ó¸ Ý ÐÑ Ò Ð Ö ×ÙÐØ Ó Ò Ð Ô Ð º ´ µ ÐÓ ÓÒØÖ Ö Ó¸ × Ð ¬ × ÓÔ Ö Ò Ó =⇒ Ñ Ø ÐÓ Ò Ð Ô Ð º ¾º Ù Ò Ó × Ð Ò Ð ¬Ò Ð Ð × Ù Ò ¸ Ð Ö ×ÙÐØ Ó ÐÑ Ò Ó Ò Ð Ô Ð × Ð Ö ×ÙÐØ Ó Ð ÜÔÖ × ÓÒº Ë Ð Ô Ð ×Ø Ú Ó ×Ø ÓÒØ Ò Ñ × Ó× Ú ÐÓÖ ×¸ ÒØÓÒ × Ð ÜÔÖ × ÓÒ ×Ù¬ ÓÒØ Ò Ð ÙÒ ÖÖÓÖº ÍÒ Ð ÓÖ ØÑÓ × Ñ Ð Ö ÔÙ Ù Ö× Ô Ö Ú ÐÙ Ö ÜÔÖ × ÓÒ × ÔÖ ¬ ׺ Ä ÒÓØ ÓÒ ×Ù¬ ÙÒØÓ ÓÒ Ð Ð ÓÖ ØÑÓ ¾º¾ × ÓÑÙÒ Ò Ð ÙÒ × Ð ÙÐ ÓÖ × ÓÐ× ÐÐÓ¸ ÒØ ÙÓ× ÔÖÓ × ÓÖ × Ý Ò Ð ÙÒÓ× Ð Ò Ù × ÔÖÓ Ö Ñ ÓÒº ÈÓÖ ×ÙÔÙ ×ØÓ¸ Ð ÒÓØ ÓÒ Ò¬ × Ð Ñ × Ñ Ð Ö¸ Ô ÖÓ ×Ø ×ÓÐÓ Ô ÖÑ Ø ÐÓ ×ÙÑÓ Ó× ÓÔ Ö Ò Ó׺ Ò Ò ÙÖ ¸ Ð ÔÖ Ò Ð × ÓÔ Ö ÓÒ × ÔÙ Ö ÕÙ Ö Ö Ð Ù×Ó Ô Ö ÒØ × ×º Ù× ×ØÓ¸ ÜÔÖ × ÓÒ × ÓÑÔÐ × ×ÓÒ ÒÓÖÑ ÐÑ ÒØ Ñ × Ð Ö × Ò ÓÖÑ Ò¬ ÕÙ ×Ù× ÕÙ Ú Ð ÒØ × ÔÖ ¬ Ó Ó ×Ù¬ Óº ר Ó ×Ù Ö ÕÙ Ñ Ò ÔÙÐ Ö Ý Ú ÐÙ Ö ÜÔÖ × ÓÒ × Ò¬ × × Ñ × ÓרÓ×Ó Ò ×Ô Ó Ý Ò Ø ÑÔÓ ÕÙ Ò Ð × ÓØÖ × Ó× ÒÓØ ÓÒ ×º ÈÓ× Ð Ñ ÒØ ÔÓÖ ×Ø Ö ÞÓÒ¸ Ð ÙÒÓ× Ö ÒØ × Ð ÙÐ ÓÖ × Ñ ÒÓ ÔÖ ¬ Ö Ò Ð ÒÓØ ÓÒ ×Ù¬ º Ü ×Ø ÙÒ Ð ÓÖ ØÑÓ ÑÙÝ ¬ ÒØ Ô Ö Ú ÐÙ Ö ÙÒ ÜÔÖ × ÓÒ Ò¬ ¸ Ð Ù Ð Ö ÕÙ Ö Ó× Ô Ð ×º ÍÒ Ô Ð ÐÑ Ò ÓÔ Ö Ò Ó× Ý Ö ×ÙÐØ Ó× Ô Ö Ð × Ð ÓØÖ ÐÑ Ò ÓÔ Ö ÓÖ × Ý Ô Ö ÒØ × × ÕÙ Ö ÔÖ × ÒØ Ò Ð ÔÖ Ò º ÒØ × ÜÔÐ Ö Ð Ð ÓÖ ØÑÓ¸ Ö ÕÙ Ö ÑÓ× Ð ÙÒ Ñ ÕÙ Ò Ö × ÕÙ ØÙ Ð ÔÖÓ × Ñ ÒØÓ Ð Ò Ö Ø Ö × Ý ÕÙ ÒÓ× Ò ÕÙ × ×Ø ÑÓ× Ò ÔÖ × Ò
  • 143.
    2.5. Pilas 117 ÙÒ ÓÔ Ö Ò Ó Ù ÓÔ Ö ÓÖº È Ö ÐÐÓ¸ ¬Ò ÑÓ× ÐÓ× ÔÓ× Ð × Ú ÐÓÖ × ¬ × ÕÙ ÔÙ Ò Ò ÓÒØÖ Ö× Ò ÙÒ Ò ½½ Ø ÔÓ ¬ ½½ ≡ enum Token_Type { Value, Operator, Lpar, Rpar, End, Error }; ¬Ò × Token Type¸ Ù× Ò ÙÒ × ½½ Ò ½¾¼ º Value Ö ÔÖ × ÒØÙÒ ÓÔ Ö Ò Ó¸ Operator Ö ÔÖ × ÒØ ÙÒÓ ÐÓ× ÓÔ Ö ÓÖ × +, −, ∗, Ó /¸ Lpar Ý Rpar Ö ÔÖ × ÒØ Ò ÐÓ× Ô Ö ÒØ × × ÞÕÙ Ö Ó Ý Ö Ó Ö ×Ô Ø Ú Ñ ÒØ ¸ End Ö ÔÖ × ÒØ Ð ¬Ò Ð Ò Ý¸ ¬Ò ÐÑ ÒØ ¸ Error Ò ÕÙ × Ò ÓÒØÖÓ ÙÒ × Ñ ÓÐÓ ÕÙ ÒÓ ÔÙ × Ö ÓÒ× Ö Ó Ò ÓÔ Ö Ò Ó Ò ÓÔ Ö ÓÖº ÓÖ ÔÓ ÑÓ× ¬Ò Ö ÙÒ ÖÙØ Ò ÕÙ Ð Ð Ò Ý ÒÓ× Ò ÕÙ ÕÙ Ø ÔÓ ¬ × ×Ø Ð Ý Ò Ó ½½ ÖÙØ Ò Ð ØÓÖ ¬ × ½½ ≡ Token_Type lexer(char *& str, size_t & len) { Ù ÖÔÓ Ð Ü Ö ½½ } Í× × Token Type ½½ º lexer() Ò×Ô ÓÒ × Ù Ò ÐÑ ÒØ Ð Ò Ö Ø Ö × ÓÒØ Ò Ò str Ô ÖØ Ö Ð × Ñ ÓÐÓ str + lenº Ð ¬Ò Ð Ð ÐÐ Ñ ¸ str ÔÙÒØ Ð ÔÖ Ñ Ö × Ñ ÓÐÓ Ð ¬ º Ð Ú ÐÓÖ str ÔÙ ÑÓ ¬ Ö× ¸ ÔÙ × ÔÙ Ò Ö ×Ô Ó× Ò Ð Ò Ó ÕÙ ÒÓ Ò ÔÖÓ × Ö× º lexer() Ö ØÓÖÒ Ð Ø ÔÓ ¬ ÕÙ × Ø Ø Óº Ð Ô Ö Ñ ØÖÓ len × ÑÓ ¬ Ô Ö Ò Ö Ð ÐÓÒ ØÙ Ò Ö Ø Ö × Ð ¬ ØÙ Ð Ò ÓÒØÖ º ÄÓ× Ú ÐÓÖ × ÐÓ× Ô Ö Ñ ØÖÓ× × Ò Ò Ð × Ù ÒØ ÑÓ Ó ½½ Ù ÖÔÓ Ð Ü Ö ½½ ≡ ´½½ µ ½½ str += len; len = 1; ÒÓÖ Ö ×Ô Ó× Ò Ð Ò Ó ½½ ÈÓÖ ¬Ò ÓÒ¸ Ð Ò×Ô ÓÒ ÓÑ ÒÞ Ò str + lenº Ð Ò Ó¸ Ð ÐÓÒ ØÙ Ð ¬ ÕÙ × Ò Ù ÒØÖ × Ö Ð Ñ ÒÓ× ÙÒ ÙÒ º ÁÒ Ð Ò×Ô ÓÒ¸ Ð ÖÙØ Ò ÒÓÖ Ö ÐÓ× ×Ô Ó× Ò Ð Ò Ó׺ ×ØÓ × ¬Ò ÐÑ ÒØ ÓÑÓ ½½ ÒÓÖ Ö ×Ô Ó× Ò Ð Ò Ó ½½ ≡ ´½½ µ while (isblank(*str)) str++; isblank() × ÙÒ ÜØ Ò× ÓÒ ÆÍ Ð Ð ÓØ ר Ò Ö Ð Ð Ò Ù Ý Ö ØÓÖÒ ÙÒ Ú ÐÓÖ Ö ÒØ ÖÓ × Ð × Ñ ÓÐÓ Ô Ö Ñ ØÖÓ ÓÖÖ ×ÔÓÒ ÙÒ Ð Ò Ó Ó Ø ÙÐ ÓÖº ÈÓÖ × ÑÔÐ ¸ ÒÙ ×ØÖÓ Ú ÐÙ ÓÖ ×ÓÐÓ ÔØ ÐÓ× ÓÔ Ö ÓÖ × +¸ −¸ ∗ Ý /¸ ÐÓ× Ù Ð × Ö ÔÖ × ÒØ Ò Ð × ÓÔ Ö ÓÒ × Ö ØÑ Ø × Ð × ×º Ð Ñ ×Ñ Ñ Ò Ö ¸ ÐÓ× ÓÔ Ö Ò Ó× ×ÓÐÓ ×ÓÒ ÒÙÑ ÖÓ× ÒØ ÖÓ׺ Ë ÐÚÓ ÙÒ ÓÔ Ö Ò Ó¸ Ð ÐÓÒ ØÙ ÙÒ ¬ × ÙÒÓº Î Ö ¬ ÑÓ׸ Ô٠׸ × Ð × Ñ ÓÐÓ Ò ÓÒØÖ Ó ÓÖÖ ×ÔÓÒ ÙÒ ÓÔ Ö ÓÖ ½½ Ù ÖÔÓ Ð Ü Ö ½½ +≡ ´½½ µ ½½ ½½ switch (*str) { case ’(’: return Lpar; case ’)’: return Rpar;
  • 144.
    118 Cap´ ıtulo 2. Secuencias case ’+’: case ’-’: case ’*’: case ’/’: return Operator; case ’0’: return End; } Ë Ð ­Ù Ó × Ð Ð switch¸ ÒØÓÒ × Ð ÙÒ ÔÓ× Ð ÓÖÖ Ø × Ò ÓÒØÖ Ö ÙÒ ÓÔ Ö Ò Óº ÆÓ× Ö ÓÖ ÑÓ׸ ÒØÓÒ ×¸ ÕÙ Ð Ò ÓÖÖ ×ÔÓÒ ÙÒ ÓÔ Ö Ò Ó ½½ Ù ÖÔÓ Ð Ü Ö ½½ +≡ ´½½ µ ½½ ½½ if (not isdigit(*str)) return Error; isdigit() × ÙÒ ÙÒ ÓÒ Ð Ð ÓØ ר Ò Ö Ð Ð Ò Ù Ý Ö ØÓÖÒ ÙÒ Ú ÐÓÖ Ö ÒØ ÖÓ × Ð × Ñ ÓÐÓ Ô Ö Ñ ØÖÓ ÓÖÖ ×ÔÓÒ ÙÒ ØÓº Ë Ð ­Ù Ó ÒÓ Ö ØÓÖÒ ÖÖÓÖ¸ ÒØÓÒ × ÓÒØ Ð Þ ÑÓ× Ð ÒØ ØÓ× ÔÓÖ Ð Ö Ý Ö ØÓÖÒ ÑÓ× Ð Ó Ó ¬ Value ½½ Ù ÖÔÓ Ð Ü Ö ½½ +≡ ´½½ µ ½½ char* base = str + 1; while (isdigit(*base++)) len++; return Value; Ù Ò Ó lexer() Ö ØÓÖÒ ÙÒ ÓÔ Ö ÓÖ¸ ÑÓ× ØÓÑ Ö ÓÒ × × ÙÒ Ð ÔÖ Ò Ð ÓÔ Ö ÓÖº È Ö ÐÐÓ¸ Ð ÓÖ ÑÓ× ÙÒ ÙÒ ÓÒ ÕÙ ¸ Ó ÙÒ ÓÔ Ö ÓÖ¸ Ø ÖÑ Ò ×Ù ÔÖ ¹ Ò ½½ ÙÒ ÓÒ ÔÖ Ò ½½ ≡ unsigned precedence(const char & op) // $ < ( < +- < */ { switch (op) { case ’$’: return 0; case ’(’: return 1; case ’+’: case ’-’: return 2; case ’/’: case ’*’: return 3; } } ¬Ò × precedence¸ Ù× Ò ÙÒ ½¾½ º precedence() Ø Ò ÓÑÓ Ô Ö Ñ ØÖÓ ÙÒ × Ñ ÓÐÓº ÈÙ ×ØÓ ÕÙ ÐÓ× ÓÔ Ö ÓÖ × ×ÓÒ ÙÒ ×ÓÐÓ × Ñ ÓÐÓ¸ ÔÓ ÑÓ× ÒØ ¬ Ö Ð Ó ÙÖÖ Ò Ð ÓÔ Ö ÓÖ Ñ ÒØ Ò×Ô ÓÒ Ö Ø Ð Òº À Ý ÙÒ ÓÔ Ö ÓÖ ¬ Ø Ó¸ °¸ ÓÒ Ð Ñ ÒÓÖ ÔÖ Ò ¸ ÙÝÓ ÖÓÐ × ÜÔÐ Ö Ñ × ¹ Ð ÒØ º Ð Ô Ö ÒØ × × ÞÕÙ Ö Ó × ÓÒ× Ö ÙÒ ÓÔ Ö ÓÖ Ò Ð × Ù ÒØ Ò Ú Ð ÔÖ Ò º Ä ×ÙÑ Ý Ö ×Ø Ó ÙÔ Ò Ð ÔÖÓÜ ÑÓ Ò Ú Ð ÔÖ Ò º Ò ÐÑ ÒØ ¸ ÐÓ× ÓÔ Ö ÓÖ × ÓÒ Ñ × ÔÖ Ò ×ÓÒ Ð ÔÖÓ Ù ØÓ Ý Ð Ú × ÓÒº Ë lexer() Ö ØÓÖÒ Value¸ ÒØÓÒ × Ò × Ø ÑÓ× Ó Ø Ò Ö ÙÒ Ò Ö Ø Ö × ÕÙ ÓÒØ Ò Ð ÒÙÑ ÖÓº Ì Ð ÙÒ ÓÒ Ð Ö Ð Þ ÑÓ× Ð × Ù ÒØ ÑÓ Ó ½½ ÙÒ ÓÒ ÓÒÚ ÖØ Ö ¬ Ò ½½ ≡
  • 145.
    2.5. Pilas 119 char * str_to_token(char * token_str, const size_t & len) { static char buffer[256]; strncpy(buffer, token_str, len); buffer[len] = ’0’; return buffer; } ¬Ò × str to token¸ Ù× Ò ÙÒ ½¾¼ º str to token() ÜØÖ ÙÒ ÓÔ Ð ÒÙÑ ÖÓ ÓÒØ Ò Ó Ò token strº Ð Ð ÓÖ ØÑÓ Ú ÐÙ ÓÒ Ù× Ö Ó× Ô Ð × ÓÑÓ × Ù ½½ Ô Ð × Ú ÐÙ ÓÒ ½½ ≡ ´½¾¼ µ ArrayStack<int> val_stack; ArrayStack<char> op_stack; Í× × ArrayStack ½¼ º Ð Ð ÓÖ ØÑÓ Ö Ð Þ ÓÔ Ö ÓÒ × Ò Ð Ò ÓÒ ÓÖÑ Ò Ð Þ Ð Ò ÒØÖ º Ä ÓÔ Ö ÓÒ ÙÒ Ñ ÒØ Ð × × Ö Ó× ÓÔ Ö Ò Ó× Ð Ô Ð val stack Ý ÙÒ ÓÔ Ö ÓÖ Ð Ô Ð op stack¸ ÐÙ Ó ØÙ Ö Ð ÓÔ Ö ÓÒ Ý¸ ¬Ò ÐÑ ÒØ ¸ ÐÑ Ò Ö Ð Ö ×ÙÐØ Ó ÒÙ ÚÓ Ò Ð Ô Ð val stackº ר Ô ØÖÓÒ × ÑÓ ÙÐ Ö Þ Ò Ð × Ù ÒØ ÖÙØ Ò ½½ ÙÒ ÓÒ Ù ÓÒ ÓÔ Ö ÓÒ Ò Ô Ð × ½½ ≡ void apply(ArrayStack<int>& val_stack, ArrayStack<char>& op_stack) { const char the_operator = op_stack.pop(); const int right_operand = val_stack.pop(); const int left_operand = val_stack.pop(); int result; switch (the_operator) { case ’+’: result = left_operand + right_operand; break; case ’-’: result = left_operand - right_operand; break; case ’*’: result = left_operand * right_operand; break; case ’/’: result = left_operand / right_operand; break; } val_stack.push(result); } ¬Ò × apply¸ Ù× Ò ÙÒ ½¾½º Í× × ArrayStack ½¼ º apply() ×ÙÑ ÕÙ Ð ÓÔ Ö Ò Ó Ö Ó Ù Ò× ÖØ Ó Ò Ð Ô Ð ×ÔÙ × Ð ÞÕÙ Ö Óº ×ØÓ × ÐÓ ÒÓÖÑ Ð × Ð Ò ÒØÖ × Ò Ð Þ ÞÕÙ Ö Ö º ÓÖ ×ÔÓÒ ÑÓ× Ð × ÖÖ Ñ ÒØ × Ò × Ö × Ô Ö × ÖÖÓÐÐ Ö ÙÒ ÖÙØ Ò ÕÙ Ú ÐÙ ÙÒ ÜÔÖ × ÓÒ Ò¬ º ÆÙ ×ØÖ ÖÙØ Ò × ÐÐ Ñ Ö eval() Ý Ø Ò Ö Ð × Ù ÒØ רÖÙ ØÙÖ ½½ ÙÒ ÓÒ Ú ÐÙ ÓÒ ÜÔÖ × ÓÒ Ò¬ ½½ ≡ int eval(char* input) { Ú Ö Ð × Ú Ð ½¾¼ Ò Ð Þ ÓÒ Ú Ð ½¾¼ while (true) {
  • 146.
    120 Cap´ ıtulo 2. Secuencias Ð Ö ÔÖÓÜ Ñ ¬ ½¾¼ switch (current_token) { case Value: ÔÖÓ × Ö ÓÔ Ö Ò Ó ½¾¼ case Lpar: ÔÖÓ × Ö Ô Ö ÒØ × × ÞÕÙ Ö Ó ½¾½ case Operator: ÔÖÓ × Ö ÓÔ Ö ÓÖ ½¾½ case Rpar: ÔÖÓ × Ö Ô Ö ÒØ × × Ö Ó ½¾½ case End: ÔÖÓ × Ö ¬Ò ÒØÖ ½¾½ } } } input × Ð Ò Ö Ø Ö × ÕÙ ÓÒØ Ò Ð ÜÔÖ × ÓÒ Ò¬ º eval() Ö ÕÙ Ö × Ù ÒØ × Ú Ö Ð × ½¾¼ Ú Ö Ð × Ú Ð ½¾¼ ≡ ´½½ µ Ô Ð × Ú ÐÙ ÓÒ ½½ Token_Type current_token; unsigned token_len = 0; Í× × Token Type ½½ º current token ×Ð ¬ ØÙ Ð Ó × ÖÚ ÒÐ Ò ÒØÖ Ý token len × Ð ÐÓÒ ØÙ Ð ¬ Ò Ö Ø Ö ×º ÁÒ ÐÑ ÒØ ÒÓ Ý Ò Ò ÙÒ ¬ ¸ ÔÓÖ ÐÓ ÕÙ token len × Ö ÖÓº Ä ÔÐ ÓÔ Ö ÓÖ × Ö ÕÙ Ö ÙÒ ÒØ Ò Ð ×Ô Ð ÕÙ × Ð Ñ ÒÓÖ ÔÖ Ò ÔÓ× Ð º Ì Ð ÒØ Ò Ð × Ð Ú ÐÓÖ ° ÕÙ × Ò× ÖØ Ò ÐÑ ÒØ Ò op stack ½¾¼ Ò Ð Þ ÓÒ Ú Ð ½¾¼ ≡ ´½½ µ op_stack.push(’$’); ×ÔÙ × Ð Ò Ð Þ ÓÒ¸ Ð ÖÙØ Ò ÓÑ ÒÞ Ø Ö Öº Ð Ù ÖÔÓ Ø Ö Ø ÚÓ Ð Ð × ¬ × ÔÖ × ÒØ × Ò Ð ÒØÖ Ý ÐÙ Ó ÔÖÓ × Ð ¬ × ÙÒ ×Ù Ø ÔÓº Ä Ö Ð ¬ ÓÒ× ×Ø × ÑÔÐ Ñ ÒØ Ò ÙÒ ÒÚÓ ÓÒ lexer() ½¾¼ Ð Ö ÔÖÓÜ Ñ ¬ ½¾¼ ≡ ´½½ µ current_token = lexer(input, token_len); Ù Ò ÓÐ ¬ × ÙÒ ÓÔ Ö Ò Ó¸ ÐÓ ÒØÖÓ Ù ÑÓ× Ò Ð Ô Ð ÓÔ Ö Ò Ó× ½¾¼ ÔÖÓ × Ö ÓÔ Ö Ò Ó ½¾¼ ≡ ´½½ µ { const int operand = atoi(str_to_token(input, token_len)); val_stack.push(operand); break; } Í× × str to token ½½ º ÈÖ Ú Ñ ÒØ Ý ÕÙ ØÙ Ö Ð ÓÒÚ Ö× ÓÒ Ð Ò Ö Ø Ö × ×Ù Ö ÔÖ × ÒØ ÓÒ ÒÙÑ Ö º ÈÓ ÑÓ× ÒØÖÓ Ù Ö Ð ÓÔ Ö ÓÖ Ò Ð Ô Ð ¸ Ô ÖÓ ÒØ × ÔÓ ÑÓ× ÙØ Ö ØÓ × Ð × ÓÔ Ö ÓÒ × ÕÙ ×Ø Ò Ò Ð Ô Ð ÓÔ Ö ÓÖ × ÓÒ Ñ ÝÓÖ Ó Ù Ð ÔÖ Ò ÕÙ Ð
  • 147.
    2.5. Pilas 121 ÓÔ Ö ÓÖ ØÙ к ר ÐØ ÖÒ Ø Ú × ÔÖ Ö Ð ÔÓÖÕÙ ×Ñ ÒÙÝ Ð ÓÒ×ÙÑÓ Ò ×Ô Ó Ð × Ô Ð ×º È Ö ÑÔÐ ¬ Ö¸ ÓÒ× Ö ÑÓ× Ð ÜÔÖ × ÓÒ 100 − 20 ∗ 5 + 7 Ý ×ÙÔÓÒ ÑÓ× ÕÙ Ð ¬ ØÙ Ð × Ð ÓÔ Ö ÓÖ Ö ×Ø º Ò ×Ø ÑÓÑ ÒØÓ¸ val stack ÓÒØ Ò < 100 > Ý op stack < ° > Ý ÒÓ ÔÓ ÑÓ× ØÙ Ö Ò Ò ÙÒ ÓÔ Ö ÓÒ ÔÓÖÕÙ Ð ÓÔ Ö ÓÖ ¬ Ø Ó ° Ø Ò Ñ ÒÓÖ ÔÖ Ò ÕÙ Ð ÓÔ Ö ÓÖ −º Ù Ò Ó Ò ÓÒØÖ ÑÓ× Ð ÓÔ Ö ÓÖ ∗¸ Ø ÑÔÓ Ó ÔÓ ÑÓ× ØÙ Ö Ò Ò ÙÒ ÓÔ Ö ÓÒ ÔÓÖÕÙ Ð ÔÖÓ Ù ØÓ Ø Ò Ñ ÝÓÖ ÔÖ Ò ÕÙ Ð Ö ×Ø º ¹ Ò ÐÑ ÒØ ¸ Ù Ò Ó ÒÓ× Ò ÓÒØÖ ÑÓ× Ð ÓÔ Ö ÓÖ +¸ val stack ÓÒØ Ò < 100, 20, 5 > Ý op stack < °, −, ∗ >º ÕÙ ØÙ ÑÓ× Ð ÔÖÓ Ù ØÓ¸ ÔÙ × ×Ø Ø Ò Ñ ÝÓÖ ÔÖ Ò ÕÙ Ð ×ÙÑ ¸ ÐÓ ÕÙ ÒÓ× Ð × Ô Ð × Ò ÐÓ× ×Ø Ó× < 100, 100 > Ý < °, − >¸ Ö ×Ô Ø Ú Ñ ÒØ º ÈÓר Ö ÓÖÑ ÒØ ¸ ØÙ ÑÓ× Ð Ö ×Ø ¸ ÔÙ × ×Ø Ø Ò Ð Ñ ×Ñ ÔÖ Ò ÕÙ Ð ×ÙÑ º Ð Ø ÖÑ ÒÓ ×Ø ÓÔ Ö ÓÒ ÒØÖÓ Ù ÑÓ× Ð ÓÔ Ö ÓÖ + Ò Ð Ô Ð ÐÓ ÕÙ ÒÓ× Ð ×Ø Ó Ð × Ô Ð × Ò < 0 > Ý < °, + >º Ä ÓÒ Ù Ø ÒØ Ö ÓÖ × ÑÓ Ð Þ ¸ ÒØÓÒ ×¸ Ó Ð × Ù ÒØ ÓÖÑ ½¾½ ÔÖÓ × Ö ÓÔ Ö ÓÖ ½¾½ ≡ ´½½ µ { while (precedence(op_stack.top()) >= precedence(*input)) apply(val_stack, op_stack); op_stack.push(*input); // introducir operador en op_stack break; } Í× × apply ½½ Ò precedence ½½ º ÄÓ× Ô Ö ÒØ × × Ò Ð ÜÔÖ × ÓÒ × Ò¬ × ×ÓÒ ÙØ Ð Þ Ó× Ô Ö ÑÓ ¬ Ö Ð ÔÖ Ò ÔÓÖ ÓÑ × ÓÒ ÐÓ× ÓÔ Ö ÓÖ ×º Ù Ò Ó Ð ¬ × ÙÒ Ô Ö ÒØ × × ÞÕÙ Ö Ó¸ ÐÓ ÒØÖÓ Ù ÑÓ× Ò Ð Ô Ð ÓÔ Ö ÓÖ × ½¾½ ÔÖÓ × Ö Ô Ö ÒØ × × ÞÕÙ Ö Ó ½¾½ ≡ ´½½ µ { op_stack.push(*input); // introducir parentesis en op_stack break; } Ð Ô Ö ÒØ × × Ö Ó Ò Ö Ð ¬Ò Ð ÙÒ ÜÔÖ × ÓÒ ÕÙ × Ö Ú ÐÙ º Ù Ò Ó Ò ÓÒØÖ ÑÓ× Ð Ô Ö ÒØ × × Ö Ó¸ ÙØ Ö ÑÓ× ØÓ × Ð × ÓÔ Ö ÓÒ × ÒØÖ ÐÓ× Ô Ö ÒØ × ×º È Ö ÐÐÓ¸ ÐÐ Ñ ÑÓ× ×Ù × Ú Ñ ÒØ apply() ר ÕÙ Ð Ô Ö ÒØ × × ÞÕÙ Ö Ó × Ò ÓÒ¹ ØÖ Ó Ò Ð ØÓÔ Ð Ô Ð ½¾½ ÔÖÓ × Ö Ô Ö ÒØ × × Ö Ó ½¾½ ≡ ´½½ µ { while (op_stack.top() != ’(’) apply(val_stack, op_stack); op_stack.pop(); /* saca el parentesis izquierdo */ break; } Í× × apply ½½ º Ð ¬Ò Ð ÒØÖ ÐÓ Ò lexer() Ù Ò Ó Ö ØÓÖÒ Ð Ú ÐÓÖ Endº Ò ×Ø ÑÓÑ ÒØÓ¸ × Ð ÜÔÖ × ÓÒ Ù ÓÖÖ Ø ¸ ÒÓ× Ö ×Ø Ú ÐÙ Ö Ð × ÓÔ Ö ÓÒ × ÕÙ × Ò Ù ÒØÖ Ò Ò Ð Ô Ð ÓÔ Ö Ò Ó׸ ÐÓ Ù Ð × ¬Ò Ð × Ù ÒØ Ñ Ò Ö ½¾½ ÔÖÓ × Ö ¬Ò ÒØÖ ½¾½ ≡ ´½½ µ {
  • 148.
    122 Cap´ ıtulo 2. Secuencias while (op_stack.top() != ’$’) apply(val_stack, op_stack); op_stack.pop(); // debe ser ’$’ const int ret_val = val_stack.pop(); return ret_val; } Í× × apply ½½ º 2.5.6 Pilas, llamadas a procedimientos y recursi´n o ÍÒÓ ÐÓ× Ù×Ó× Ñ × ØÖ × Ò ÒØ Ð × Ð Ô Ð × Ð ×Ø ÓÒ ÐÐ Ñ × ÔÖÓ Ñ ÒØÓ× ÙÒ ÔÖÓ Ö Ñ º ÓÒ× Ö ÑÓ× Ð × Ù ÒØ Ö Ñ ÒØÓ Ó Ó int fct_1(int i) { /* ... */ } int fct_2(int i) { int x; x = fct_1(i); ... } int fct_3(int j) { int x; x = fct_2(j); ... } void main() { int y; y = fct_3(3); ... } ÓÖ Ü Ñ Ò ÑÓ× ÐÓ× Ú ÒØÓ× ÒÚÓÐÙ Ö Ó× Ð ÐÐ Ñ fct 3() × main()º Ù Ò Ó × Ð ÒÞ Ð ÐÐ Ñ fct 3()¸ Ð ­Ù Ó ÓÒØÖÓÐ × ÐØ Ð Ö ÓÒ Ñ ÑÓÖ fct 3() Ý ÓÑ ÒÞ ÙØ ÖÐ º ÈÓר Ö ÓÖÑ ÒØ ¸ Ù Ò Ó × Ð ÒÞ Ð ÐÐ Ñ fct 2()¸ Ý Ð ­Ù Ó ÓÒØÖÓÐ × ÐØ ÒÙ ÚÓ Ð Ö ÓÒ fct 2()º Ò ÐÑ ÒØ ¸ × Ð ÒÞ Ð ÙÒ ÓÒ fct 1() Ý Ð ­Ù Ó × ÐØ ÒÙ ÚÓ Ð Ö ÓÒ fct 1()º Ù Ò Ó fct 1() ¬Ò Ð Þ ¸ Ð ­Ù Ó ÔÖÓ Ö Ñ Ö ÓÖÖ Ð Ñ ÒÓ ÒÚ Ö×Ó ×Ø main()º ÈÐ ÒØ ÑÓ׸ ÒØÓÒ ×¸ Ð × × Ù ÒØ × ÔÖ ÙÒØ × ¯ Ä × ÙÒ ÓÒ × fct 2() Ý fct 3() Ø Ò Ò Ô Ö Ñ ØÖÓ× ÒÓÑ Ö i Ý Ú Ö Ð × ÐÓ Ð × ÒÓÑ Ö xº ÓÑÓ × Ö Ò Ò ÒØÖ × ÐÓ× Ô Ö Ñ ØÖÓ× Ý Ú Ö Ð × ¯ ÓÑÓ × ×Ø ÓÒ Ð Ñ ÑÓÖ Ô Ö ÐÓ× Ô Ö Ñ ØÖÓ× Ý Ú Ö Ð × ÐÓ Ð × ÙÒ ÔÖÓ ¹ Ñ ÒØÓ
  • 149.
    2.5. Pilas 123 ¯ ÓÑÓ Ð ­Ù Ó ÓÒØÖÓÐ Ô Ö × ÐØ Ö ÙÒ ÙÒ ÓÒ Ý Ö Ö × Ö Ù Ò Ó ÙÐÑ Ò Ð ÐÐ Ñ Ð ÙÒ ÓÒ ×ØÓ× ÔÖÓ Ð Ñ × ×ÓÒ Ö ×Ù ÐØÓ× ÔÓÖ Ð ÓÑÔ Ð ÓÖ¸ Ð × ×Ø Ñ ÓÔ Ö Ø ÚÓ Ý Ð Ö Û Ö ØÖ Ú × ÙÒ Ô Ð º Ä Ñ ÝÓÖ ÐÓ× ÔÖÓ × ÓÖ × Ñ Ò Ò Ó× Ö ×ØÖÓ× ×Ô Ð × ÓÑÙÒÑ ÒØ ÒÓÑ Ò Ó× SB Ý SPº רÓ× Ö ×ØÖÓ× Ñ Ò Ò Ð ÒÓÑ Ò Ô Ð Ð × ×Ø Ñ º SB × Ð Ö ÓÒ × ÙÒ Ô Ð Ý SP × Ð Ö ÓÒ ØÙ Ð Ð ØÓÔ Ð Ô Ð º Ù Ò Ó × ÙÒ ÔÙ× ×Ó Ö Ð Ô Ð Ð × ×Ø Ñ ¸ SP × Ö Ñ ÒØ Óº Ð Ñ ×ÑÓ ÑÓ Ó¸ Ù Ò Ó × ÙÒ pop()¸ SP × Ò Ö Ñ ÒØ Óº Ù Ò Ó Ð ÓÑÔ Ð ÓÖ ÔÖÓ × ÙÒ ÐÐ Ñ ÙÒ ÙÒ ÓÒ¸ ÔÓÖ ÑÔÐÓ¸ fct 1() × main()¸ × Ò Ö ¸ ÒØ × ÐÐ Ñ Ö Ð ÙÒ ÓÒ¸ Ð × Ù ÒØ × Ù Ò Ô× Ù Ó Ó Ó ×Ó Ö Ð Ô Ð × ×Ø Ñ ½º ÍÒ push() Ô Ö Ð ×Ô Ó Ð Ö ×ÙÐØ Ó ÕÙ Ö ØÓÖÒ fct 1()º ¾º Î Ö Ó× pushes Ô Ö ÐÓ× Ô Ö Ñ ØÖÓ× fct 1()º ¿º ÍÒ push() Ô Ö Ð Ö ÓÒ ØÙ Ð Ð ­Ù Ó Ð ÔÖÓ Ö Ñ º º ÍÒ ÒרÖÙ ÓÒ × ÐØÓ Ð Ö ÓÒ Ð ÙÒ ÓÒ fct 1()¸ Ð Ù Ð ÐÐ Ú Ð ­Ù Ó ÓÒØÖÓÐ Ð Ò Ó Ð ÙÒ ÓÒ fct 1()º º ÍÒ Ú Þ ÕÙ fct 1() Ý × Ó ÙØ ¸ Ð ­Ù Ó ÔÖÓ Ö Ñ Ö Ö × Ö Ð ÔÙÒØÓ ÔÓר Ö ÓÖ ÓÒ × ØÙÓ Ð × ÐØÓº È Ö ÐÐÓ¸ Ð ÓÑÔ Ð ÓÖ Ò Ö ÙÒ pop() ÕÙ Ö ÙÔ Ö Ð Ö ÓÒ Ö ØÓÖÒÓ Ð Ô Ð º Ð Ö Ö × Ö main()¸ × ØÙ Ò Ú Ö Ó× pops ÓÖÖ ×ÔÓÒ ÒØ × Ð ÒØ pushes ÕÙ × ÞÓ Ô Ö Ô × Ö ÐÓ× Ô Ö Ñ ØÖÓ׺ º Ò ÐÑ ÒØ ¸ × ÙÒ ÙÐØ ÑÓ pop() ÕÙ Ö ÙÔ Ö Ð Ö ×ÙÐØ Ó fct 1()º º Pseudo c´digo 2.5.1: o רÖÙ ØÙÖ Ó Ó ÒÖ Ô Ö Ð ÐÐ Ñ funcion 1() Ð ÓÑÔ Ð ÓÖ Ø Ñ Ò Ò Ö Ó Ó ÓÒ Ð Ð ÔÖ Ò Ô Ó Ý Ð ¬Ò Ð Ð ÙÒ ÓÒ fct 1() Ó Ð × Ù ÒØ ×ÕÙ Ñ ½º Ð Ò Ó Ð ÙÒ ÓÒ × ØÙ Ò Ú Ö Ó× pushes ÔÖÓÔÓÖ ÓÒ Ð × Ð ÒÙÑ ÖÓ ÚÖ Ð × ÐÓ Ð × fct 1()º ¾º Ð Ó Ó Ð ÙÒ ÓÒ × Ò Ö ÓÒ Ö Ö Ò × Ð × Ú Ö Ð × ÐÓ Ð × Ô ÖØ × Ò Ð ÔÙÒØÓ ÒØ Ö ÓÖ Ý ÐÓ× Ô Ö Ñ ØÖÓ× Ô ÖØ Ó× Ý ÓÔ Ó× Ò ¾º º½º ¿º Ð Ö ×ÙÐØ Ó Ð ÙÒ ÓÒ Ø Ñ Ò× Ù Ö Ò Ð ×Ô Ó Ô ÖØ Ó Ò Ð ÔÙÒØÓ ½ ¾º º½º º Ð ¬Ò Ð Ð ÙÒ ÓÒ¸ Ð ÓÑÔ Ð ÓÖ Ò ÙÒ ÒØ pops Ù Ð Ð ÒØ pushes Ù× Ô Ö Ð × Ú Ö Ð × ÐÓ Ð ×º רÓ× pops Ð Ö Ò Ð Ñ ÑÓÖ Ù× ÔÓÖ Ð × Ú Ö Ð × ÐÓ Ð ×º º Ë ÙÒ pop() ÕÙ Ö ÙÔ Ö Ð Ö ÓÒ Ö ØÓÖÒÓ Ð ÒÚÓ ÒØ fct 1() Ý × × ÐØ Ð ÔÙÒØÓ ¾º º½º Pseudo c´digo 2.5.2: o רÖÙ ØÙÖ Ó Ó ÒÖ Ô Ö Ð ÐÐ Ñ Ð funcion 1() Ò Ö ÐÑ ÒØ ¸ ÙÒ push() ÕÙ Ú Ð Ö ×Ø Ö Ð Ö ×ØÖÓ SP Ð Ø Ñ ÒÓ ÐÓ ÕÙ × Ð Ò× ÖØ º Ë Ñ ØÖ Ñ ÒØ ¸ ÙÒ pop() ÕÙ Ú Ð ÙÒ ×ÙÑ º È Ö Ð × ÙÒ ÓÒ × fct 2() Ý fct 3()¸ Ð ÓÑÔ Ð ÓÖ Ò Ö Ó Ó× × Ñ Ð Ö × ¾º º½ Ý ¾º º¾º Ä Ò ÓÖÑ ÓÒ Ô ÖØ Ò ÒØ ÙÒ ÐÐ Ñ ÔÖÓ Ñ ÒØÓ ÕÙ × Ù Ö Ò Ð Ô Ð
  • 150.
    124 Cap´ ıtulo 2. Secuencias × ×Ø Ñ × ÓÒØ Ù º Ð ÐÓÕÙ ÓÑÔÙ ×ØÓ ÔÓÖ Ð Ú ÐÓÖ Ö ØÓÖÒÓ¸ Ô Ö Ñ ØÖÓ׸ Ö ÓÒ Ö ØÓÖÒÓ Ý Ú Ö Ð × ÐÓ Ð × × ÒÓÑ Ò Ö ×ØÖÓ Ø Ú ÓÒ º Ð ×ÓÔÓÖØ ÙØ ÚÓ Ô Ö Ð × ÐÐ Ñ × ÔÖÓ Ñ ÒØÓ× × ÑÔÐ ÒØ ÓÒ ÙÒ Ô Ð ÔÓÖÕÙ Ð ÔÖÓ Ö Ñ ­ÙÝ ØÖ Ú × Ð × ÙÒ ÓÒ × Ó ÙÒ × ÔÐ Ò Í È˺ ÍÒ Ú Þ ÕÙ × Ð ÒÞ fct 3()¸ Ð ÔÖÓ Ö Ñ Ö Ö × Ö ÔÓÖ Ð Ñ ÒÓ ÒÚ Ö×Ó main() Ô × Ò Ó ÔÓÖ fct 2() Ý fct 1()º ÙÒÕÙ Ð Ö ÙÖ× ÓÒ × ÙÒ Ø Ò ÔÖÓ Ö Ñ ÓÒ ×Ø ÒØ ÔÓ ÖÓ× ¸ × ÑÔÓÖ¹ Ø ÒØ ÔÖ Ò Ö ÕÙ ÓÒÐÐ Ú Óר × ÑÔÓÖØ ÒØ × Ò ×Ô Ó Ý Ø ÑÔÓº ÓÑÓ ÑÔÐÓ¸ ÓÒ× Ö ÑÓ× Ð ÙÒ ÓÒ ØÓÖ Ð ÑÔÐ ÒØ Ö ÙÖ× Ú Ñ ÒØ ½¾ ØÓÖ Ð Ö ÙÖ× ÚÓ ½¾ ≡ int fact(const int & n) { if (n <= 1) return 1; return n*fact(n-1); } Ä Ú Ö× ÓÒ Ö ÙÖÖ ÒØ Ð ØÓÖ Ð × ÙÒ Ñ Ð ÑÔÐÓ Ð Ù×Ó Ò ¬ ÒØ Ð Ö ÙÖ× ÓÒ¸ Ô٠׸ Ô ÖØ × Ö ÜØÖ Ñ Ñ ÒØ Ò ¬ ÒØ ¸ Ð ÓÒØÖ Ô ÖØ Ø Ö Ø Ú × ÑÙÝ ¬ ÒØ Ý Ñ × Ð ÑÔÐ ÒØ Öº Ë Ò Ñ Ö Ó¸ ØÓ× Ø Ó׸ ×Ù Ó ¬ ÓÒ Ö ÙÖÖ ÒØ × ÑÙÝ Ð ÓÑÔÖ Ò Ö ÔÓÖÕÙ Ö ­ ÒØ Ñ ÒØ Ð ¬Ò ÓÒ Ñ Ø Ñ Ø º SB Ê ×ÙÐØ Ó fact(4) Ö ÓÒ Ö ØÓÖÒÓ Ê ×ÙÐØ Ó ¿ fact(3) Ö ÓÒ Ö ØÓÖÒÓ Ê ×ÙÐØ Ó ¾ fact(2) Ö ÓÒ Ö ØÓÖÒÓ Ê ×ÙÐØ Ó ½ fact(1) Ö ÓÒ Ö ØÓÖÒÓ SP ÙÖ ¾º¾½ Ô Ð Ô Ð × ×Ø Ñ ÓÒ Ð ÐÐ Ñ fact(1) Ä ¬ ÙÖ ¾º¾½ ÐÙ×ØÖ Ð ×Ø Ó Ð Ô Ð × ×Ø Ñ Ù Ò Ó × Ð ÒÞ Ð ÐÐ Ñ fact(1)º Ú Þ ÕÙ × ØÙ ÙÒ ÐÐ Ñ Ö ÙÖ× Ú ¸ × ×Ø Ò ×Ô Ó Ô Ð Ð Ö ×ÙÐØ Ó Ð ÐÐ Ñ Ö ÙÖ× Ú ¸ Ð Ô Ö Ñ ØÖÓ Ý Ð Ö ÓÒ Ö ØÓÖÒÓº Ð Ñ ×ÑÓ ÑÓ Ó¸ ÔÓÖ ÐÐ Ñ ¸ × ×Ø Ò Ø ÑÔÓ ÐÓ× ØÖ × pushes Ý ÐÓ× ØÖ × popsº 2.5.6.1 Consejos para la recursi´n o Ë ×Ø ÑÓ× × Ò Ò Ó ÙÒ Ð ÓÖ ØÑÓ Ý ÒÓ× × Ñ × Ð ØÖ Ö ÓÒ Ð Ö ÙÖ× ÓÒ¸ ÒØÓÒ ×¸ Ò Ø Ò Ö× Ò Ù ÒØ Ð × × Ù ÒØ × ÓÒ× Ö ÓÒ × ½º ÌÓ Ó Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓ Ø Ò Ö ÙÒ ×Ó × ÓÒ ÒÓ Ó ÙÖÖ Ò Ò ÙÒ ÐÐ Ñ Ö ÙÖ× Ú º ¾º Ð Ð ÓÖ ØÑÓ ÔÖÓ Ö × Ö Ý ÓÒÚ Ö Ö Ò Ø ÑÔÓ ¬Ò ØÓ Ò ÓÒØÖ Ö Ð ×ÓÐÙ ÓÒº ÈÓÖ ÐÐ Ñ Ö ÙÖ× Ú ¸ Ð ÒØÖ ×Ñ ÒÙ Öº Ë ×Ø ÒÓ × Ð ×Ó¸ Ý ×Ø ÒØ × ÔÖÓ Ð × ÕÙ Ð Ö ÞÓÒ Ñ ÒØÓ ×Ù Ý ÒØ Ð Ð ÓÖ ØÑÓ ×Ø ÖÖ Óº
  • 151.
    2.5. Pilas 125 ¿º Ú Ø Ð ÙÐÓ× Ö Ô Ø Ó׺ ר × Ð ÔÖ Ò Ô Ð Ô Ð ÖÓ Ð Ö ÙÖ× ÓÒº ÍÒ ÑÔÐÓ ÒÓØ Ð ×ÓÒ ÐÓ× ÒÙÑ ÖÓ× ÓÒ ÙÝ ¬Ò ÓÒ Ñ Ø Ñ Ø × Ð × Ù ÒØ (n) = 1 × n≤1 (n − 1) + (n − 2) × n>1 Ä Ó ¬ ÓÒ Ö ÙÖ× Ú ÕÙ Ð ÙÐ Ð i¹ × ÑÓ ÒÙÑ ÖÓ ÓÒ × ×ÔÖ Ò ×Ù ¬Ò ÓÒ Ñ Ø Ñ Ø ½¾ ÙÒ ÓÒ ÓÒ ½¾ ≡ int fib(const int & n) { if (n <= 1) return 1; return fib(n - 1) + fib(n - 2); } ÆÓØ ÑÓ× ÕÙ (n − 2) × Ð ÙÐ 2 Ú ×º Ä ÔÖ Ñ Ö Ù Ò Ó × ÐÐ Ñ ÜÔÐ Ø Ñ ÒØ (n − 2) Ð × ÙÒ ÒØÖÓ Ð ÐÐ Ñ (n − 1)º ר ÙÔÐ ÐÐ Ñ × × ÜÔ Ò ÜÔÓÒ Ò ÐÑ ÒØ Ñ ÕÙ ÙÑ ÒØ nº Ä ¬ ÙÖ ¾º¾¾ ÐÙ×ØÖ Ð ÒØ ÐÐ Ñ × fib() Ô Ö Ð Ô ÕÙ Ò × Ð n = 5º fib(5) fib(4) fib(3) fib(3) fib(2) fib(2) fib(1) fib(2) fib(1) fib(1) fib(0) fib(1) fib(0) fib(1) fib(0) ÙÖ ¾º¾¾ ÄÐ Ñ × fib() ÔÖ n=5 Ù Ò Ó × × Ò ÙÒ Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓ¸ ÑÓ× Ö ÓÖ ÖÒÓ× ÕÙ ÒÓ Ý Ò Ð ÙÐÓ× Ö ÙÒ ÒØ ׺ ÈÓÖ ÐÓ Ò Ö Ð¸ Ð Ö ÙÒ Ò Ö ÕÙ Ö ÒÓØ Ö ÐÓ× Ð ÙÐÓ× Ö Ð Þ Ó× Ò Ð ÙÒ ×ØÖÙ ØÙÖ ØÓ× ×Ô Ðº 2.5.6.2 Eliminaci´n de la recursi´n o o À Ý ØÖ × Ñ Ò Ö × ÓÒÓ × Ô Ö Ð Ñ Ò Ö Ð Ö ÙÖ× ÓÒ¸ Ð Ù Ð × Ñ Ò ÓÒ Ö ÑÓ× Ò ÐÓ× ×Ù ¹Ô ÖÖ Ó× ×Ù × Ù ÒØ ׺ Eliminaci´n de la recursi´n cola o o Ë ÙÒ ÔÖÓ Ñ ÒØÓ P(x) Ø Ò ÓÑÓ ÙÐØ Ñ ÒרÖÙ ÓÒ ÙÒ ÐÐ Ñ P(y)¸ ÒØÓÒ × × ÔÓ× Ð Ö ÑÔÐ Þ Ö P(y) ÔÓÖ ÙÒ × Ò ÓÒ x = y Ý ÙÒ × ÐØÓ Ð Ò Ó Ð ÔÖÓ Ñ ÒØÓº
  • 152.
    126 Cap´ ıtulo 2. Secuencias ÈÓÖ ÑÔÐÓ¸ Ð Ö ÓÖÖ Ó Ò¬Ò ØÓ ÐÓ× ÒÓ Ó× ÙÒ Ð ×Ø ÒÐ Þ ÔÓ Ö ¬Ò Ö× ¸ Ö ÙÖ× Ú Ý ÖÖÓÒ Ñ ÒØ ¸ Ð × Ù ÒØ ÑÓ Ó ½¾ Ê ÓÖÖ Ó Ö ÙÖ× ÚÓ Ð ×Ø ÒÐ Þ ½¾ ≡ template <typename T> void recorrer(Snode<T> * head, void (*visitar)(Snode<T>*)) { if (head->is_empty()) return; (*visitar)(head->get_next()); recorrer(head->get_next()); } Í× × Snode ½ º ר ÔÖÓ Ñ ÒØÓ ÔÙ ØÖ Ò× ÓÖÑ Ö× Ñ ÒØ Ð Ñ Ò ÓÒ Ð Ö ÙÖ× ÓÒ ÓÐ Ò ½¾ Ê ÓÖÖ Ó ÒÓ¹Ö ÙÖ× ÚÓ Ð ×Ø ÒÐ Þ ½¾ ≡ template <typename T> void recorrer(Snode<T> * head, void (*visitar)(Snode<T>*)) { start: if (head->is_empty()) return; (*visitar)(head->get_next()); head = head->get_next(); goto start; } Í× × Snode ½ º ÅÙ × Ú × × ÔÓ× Ð Ð Ñ Ò Ö Ð Ö ÙÖ× ÓÒ ÓÐ ÙÒ × Ð ÙÐØ Ñ ÒרÖÙ ÓÒ ÒÓ × ÙÒ ÐÐ Ñ Ö ÙÖ× Ú º ÈÓÖ ÑÔÐÓ¸ Ð ÙÐØ Ñ ÒרÖÙ ÓÒ Ð Ú Ö× ÓÒ Ö ÙÖ× Ú Ð ØÓÖ Ð ØÓÖ Ð Ö ÙÖ× ÚÓ ½¾ ÒÓ × Ð ÐÐ Ñ fact(n - 1)¸ × ÒÓ Ð ÐÐ Ñ returnº Ò ×Ø ×Ó ÔÓ ÑÓ× Ð Ñ Ò Ö Ð Ö ÙÖ× ÓÒ ÓÐ Ý Ó Ø Ò Ö Ð × Ù ÒØ Ú Ö× ÓÒ ½¾ ØÓÖ Ð ÒÓ Ö ÙÖ× ÚÓ ½¾ ≡ int fact(const int & n) { int result = 1; start: if (n <= 1) return result; result *= n; n--; goto start; } Emulaci´n de los registros de activaci´n o o ÈÓ ÑÓ× ×ÙÔÖ Ñ Ö Ð Ö ÙÖ× ÓÒ × ÑÙÐ ÑÓ× Ð × ÐÐ Ñ × Ö ÙÖ× Ú × Ý ÐÓ× Ö ×ØÖÓ× Ø Ú ÓÒº È Ö ÐÐÓ ÑÓ× ¬Ò Ö ÙÒ Ô Ð ÓÒ ÐÓ× × Ù ÒØ × ØÖ ÙØÓ× ½º ÄÓ× Ú ÐÓÖ × ÐÓ× Ô Ö Ñ ØÖÓ׺ Ò ×Ó ÕÙ × ØÖ Ø ÙÒ ÙÒ ÓÒ¸ × Ò ÐÙÝ Ð Ú ÐÓÖ Ö ØÓÖÒÓº ¾º ÄÓ× Ú ÐÓÖ × Ð × Ú Ö Ð × ÐÓ Ð ×º
  • 153.
    2.5. Pilas 127 ¿º ÍÒ Ò ÓÒ ÕÙ × Ò Ð Ð Ö ÓÒ Ö ØÓÖÒÓº Ú ÐÓÖ Ò ÓÒ ÓÖÖ ×ÔÓÒ Ö ÙÒ ÔÙÒØÓ Ö ØÓÖÒÓ Ò Ð ÔÖÓ Ñ ÒØÓ Ö ÙÖ× ÚÓº ÍÒ Ú Þ ¬Ò Ð Ô Ð ¸ × ÑÓ ¬ Ð ÔÖÓ Ñ ÒØÓ Ö ÙÖ× ÚÓ ÓÑÓ × Ù ½º Ë Ò Ð × Ò ÓÐ Ð Ö ÓÒ Ò Ð Þ ÓÒ Ð Ô Ð º ¾º Ë ÓÐÓ Ò Ø ÕÙ Ø × × ÐØÓ Ò ÐÓ× ÔÙÒØÓ× × Ð Ð × ÐÐ Ñ × Ö ÙÖ× Ú ×º ¿º Ð Ü Ô ÓÒ Ð × Ò Ð Þ ÓÒ¸ Ð Ù ÖÔÓ Ð ÙÒ ÓÒ × ÒÚÙ ÐÚ ÓÒ ÙÒ Ð ÞÓ Ö Ô Ø Ø ÚÓ ÙÝ ÓÒ ÓÒ Ô Ö × ÕÙ Ð Ô Ð ×Ø Ú º º ÄÓ× ÔÙÒØÓ× ÓÒ Ý ÐÐ Ñ × Ö ÙÖ× Ú × × ×Ùר ØÙÝ Ò ÔÓÖ ÙÒ push() ÐÓ ÕÙ × Ö Ð Ö ×ØÖÓ Ø Ú ÓÒ Ý ÙÒ × ÐØÓ Ð Ò Ó Ð Ð ÞÓº º ÄÓ× ÔÙÒØÓ× ÓÒ Ð ÔÖÓ Ñ ÒØÓ Ö ÙÖ× ÚÓ Ö ØÓÖÒ × ×Ùר ØÙÝ Ò ÔÓÖ ÙÒ pop() × Ù Ó ÙÒ switch ÕÙ Ø ÖÑ Ò ¸ × ÙÒ Ð Ò ÓÒ × ÐØÓ Ð Ö ×ØÖÓ Ø Ú ÓÒ¸ Ð Ö ÓÒ × ÐØÓº ÈÓÖ ÑÔÐÓ¸ Ô Ö Ð Ð ÙÐÓ Ð i¹ × ÑÓ ÒÙÑ ÖÓ ÓÒ ¸ ÑÓ ¬ ÑÓ× Ð ÙÒ ÓÒ ÓÒ ½¾ Ð × Ù ÒØ ÑÓ Ó ½¾ Î Ö× ÓÒ Ö ÙÖ× Ú Ñ ÓÖ ÓÒ ½¾ ≡ int fib(const int & n) { if (n <= 1) return 1; const int f1 = fib(n - 1); const int f2 = fib(n - 2); return f1 + f2; } ר ÓÖÑ Ð Ø Ð Ð Ñ Ò ÓÒ Ð Ö ÙÖ× ÓÒº ¬Ò ÑÓ× Ð × Ù ÒØ רÖÙ ØÙÖ Ô Ö Ð Ö ×ØÖÓ Ø Ú ÓÒ ½¾ Ê ×ØÖÓ Ø Ú ÓÒ ½¾ ≡ ´½¾ µ # define P1 1 # define P2 2 struct Activation_Record { int n; int f1; int result; char return_point; }; ¬Ò × Activation Record¸ Ù× Ò ÙÒ ½¾ º ÓÒ Ñ Ö × Ð Ð Ö ¸ Ð ×Ó Ù ÐÕÙ Ö ÐÓ× ÑÔÓ× × ØÙ ØÖ Ú × Ð ÙÒÓ ÐÓ× × Ù ÒØ × Ñ ÖÓ× ½¾ ×Ó Ö ×ØÖÓ Ø Ú ÓÒ ½¾ ≡ ´½¾ µ # define NUM(p) ((p)->n) # define F1(p) ((p)->f1) # define RESULT(p) ((p)->result) # define RETURN_POINT(p) ((p)->return_point)
  • 154.
    128 Cap´ ıtulo 2. Secuencias Ä Ú Ö× ÓÒ ÒÓ Ö ÙÖ× Ú ¸ ÓÒ Ô Ð ¸ ÕÙ Ð ÙÐ Ð i¹ × ÑÓ ÒÙÑ ÖÓ ÓÒ ¸Ð ¬¹ Ò ÑÓ× Ò Ð Ö ÚÓ ¬ ר º ½¾ ÙÝ ¬Ò ÓÒ × Ð × Ù ÒØ ½¾ ¬ ר º ½¾ ≡ Ê ×ØÖÓ Ø Ú ÓÒ ½¾ ×Ó Ö ×ØÖÓ Ø Ú ÓÒ ½¾ int fib_st(const int & n) { Ù ÖÔÓ ¬ ר ½¾ } Ò Ò ÓÒÓ× Ð Ñ ØÓ Ó¸ ÐÓ ÔÖ Ñ ÖÓ × ¬Ò Ö Ð ÔÖ Ñ ÙÐÓ Ð ÖÙØ Ò ½¾ Ù ÖÔÓ ¬ ר ½¾ ≡ ´½¾ µ ArrayStack<Activation_Record> stack; Activation_Record * caller_ar = &stack.pushn(); Activation_Record * current_ar = &stack.pushn(); NUM(current_ar) = n; ÑÙÐ ÓÒ Ö ÙÖ× ÓÒ ½¾ Í× × Activation Record ½¾ Ò ArrayStack ½¼ º ÐÓ Ð Ö Ó Ð ÖÙØ Ò ¸ Ñ Ò Ö ÑÓ× Ó× ÔÙÒØ ÓÖ ×º caller ar Ö ÔÖ × ÒØ Ð Ö ×¹ ØÖÓ Ø Ú ÓÒ Ð ÒÚÓ ÒØ º Ê ÕÙ Ö ÑÓ× ×Ø Ö ×ØÖÓ Ø Ú ÓÒ ÔÓÖÕÙ ÑÓ× Ù Ö Ö Ð Ö ×ÙÐØ Ó Ð ÐÐ Ñ ØÙ Ð ÕÙ ÑÙÐ ÑÓ׸ Ð Ù Ð × Ù Ö Ò Ð Ö ×ØÖÓ Ø Ú ÓÒ Ð ÒÚÓ ÒØ Ý ÒÓ Ð ÒÚÓ Óº current ar × Ð Ö ×ØÖÓ Ø Ú ÓÒ Ð ÐÐ Ñ ØÙ к ÓÖ ÑÙÐ ÑÓ× Ð Ù ÖÔÓ Ð ÔÖÓ Ñ ÒØÓ Ö ÙÖ× ÚÓº È Ö ÐÐÓ¸ ÓÑ ÒÞ ÑÓ× ÔÓÖ ÓÐÓ Ö Ð Ó Ó ÑÓ×ØÖ Ó Ò Î Ö× ÓÒ Ö ÙÖ× Ú Ñ ÓÖ ÓÒ ½¾ Ý ÐÙ Ó ×Ùר ØÙ ÑÓ× ÔÓÖ × Ñ ÒØÓ× Ó Ó ÕÙ ÑÙÐ Ò Ð Ö ÙÖ× ÓÒ ½¾ ÑÙÐ ÓÒ Ö ÙÖ× ÓÒ ½¾ ≡ ´½¾ µ start: ×Ó × Ö ÙÖ× ÓÒ ½¾ ÐÐ Ñ ¬ ´Ò ¹ ½µ ½¾ p1: /* punto de retorno de fib(n - 1) */ Ö ØÓÖÒÓ × ¬ ´Ò ¹ ½µ ½¾ ÐÐ Ñ ¬ ´Ò ¹ ¾µ ½¾ p2: /* punto de retorno de fib(n - 2) */ Ö ØÓÖÒÓ × ¬ ´Ò ¹ ¾µ ½¾ return_from_fib: Ö ØÓÖÒ Ö × ¬ ½¾ ר Ò Ù ÑÓ× Ù ØÖÓ Ø ÕÙ Ø × × ÐØÓ Ð ­Ù Ó Ù ÓÒ ¯ start × Ð ÔÙÒØÓ ÓÒ × Ò Ð Ñ ØÓ Ó Ö ÙÖ× ÚÓº Ú Þ ÕÙ × ÑÙÐ ÙÒ ÐÐ Ñ Ö ÙÖ× Ú ¸ × ØÙ Ð Þ Ò ÐÓ× ÔÙÒØ ÖÓ× ÐÓ× Ö ×ØÖÓ× Ø Ú ÓÒ Ý × × ÐØ ר ÔÙÒØÓº ½¾ ÐÐ Ñ Ö ÙÖ× Ú ¬ ½¾ ≡ ´½¾ µ caller_ar = &stack.top(1); current_ar = &stack.top(); goto start; ר × Ñ ÒØÓ Ó Ó ×ÙÑ ÕÙ ÙÒ ÒÙ ÚÓ Ö ×ØÖÓ Ø Ú ÓÒ × Ó ÔÖ ¹ Ú Ñ ÒØ Ò× ÖØ Ó Ò Ð Ô Ð º ÈÓÖ × Ö ÞÓÒ¸ ØÙ Ð Þ ÑÓ× ÐÓ× ÔÙÒØ ÓÖ × ÐÓ× Ö ×ØÖÓ× Ø Ú ÓÒ ÒØ × × ÐØ Ö Ð Ò Ó Ð ÔÖÓ Ö Ñ º
  • 155.
    2.5. Pilas 129 Ä ÔÖ Ñ Ö Ð Ò Ð ÔÖÓ Ö Ñ Ö ÙÖ× ÚÓ ÔÖÓ × Ð ×Ó × ¸ Ð Ù Ð × ÑÙÝ × Ñ Ð Ö Ò Ð Ú Ö× ÓÒ ÒÓ Ö ÙÖ× Ú ½¾ ×Ó × Ö ÙÖ× ÓÒ ½¾ ≡ ´½¾ µ if (NUM(current_ar) <= 1) { RESULT(caller_ar) = 1; goto return_from_fib; } Ð Ù Ð ÕÙ Ò Ð Ú Ö× ÓÒ Ö ÙÖ× Ú ¸ Ð ÓÒ ÓÒ × Ú ÐÙ ×Ó Ö Ð Ô Ö Ñ ØÖÓ n Ð Ö ×ØÖÓ ØÙ к Ë ÑÓ× Ð ×Ó × ¸ ÒØÓÒ × ÓÐÓ ÑÓ× Ð Ö ×ÙÐØ Ó Ò Ð Ö ×ØÖÓ Ø Ú ÓÒ Ð ÒÚÓ ÒØ Ý ÒÚ ÑÓ× Ð ­Ù Ó ÔÖÓ Ö Ñ Ð Ô ÖØ ÕÙ ÑÙÐ Ð Ö ØÓÖÒ Ö × Ð ÙÒ ÓÒ Ö ÙÖ× Ú º Ë ÒÓ × Ò Ð ÔÖÓ ×Ó × ¸ ÒØÓÒ × Ý ÕÙ ÑÙÐ Ö Ð ÐÐ Ñ fib(n - 1)¸ Ð Ù Ð × Ö Ð Þ ÓÑÓ × Ù ½¾ ÐÐ Ñ ¬ ´Ò ¹ ½µ ½¾ ≡ ´½¾ µ RETURN_POINT(current_ar) = P1; NUM(&stack.pushn()) = NUM(current_ar) - 1; /* crea un registro de activaci´n */ o ÐÐ Ñ Ö ÙÖ× Ú ¬ ½¾ Ä ÔÖ Ñ Ö Ð Ò Ñ Ö Ð Ö ÓÒ Ö ØÓÖÒÓº Ä × ÙÒ Ô ÖØ Ð Ö ×ØÖÓ Ø Ú ÓÒ Ð ÒÙ Ú ÐÐ Ñ Ò ×Ù Ô Ö Ñ ØÖÓ n × ÙÒ Ð ÐÐ Ñ fib(n - 1)º ¯ Ù Ò Ó × Ý Ð ÙÐ Ó fib(n - 1)¸ Ö ØÓÖÒ Ö × ¬ ½¾ Ò×Ô ÓÒ Ö Ð Ú ÐÓÖ RETURN VALUE Ð Ö ×ØÖÓ ØÙ Ð Ø Ú ÓÒ Ý × Ô Ö Ø Ö ÕÙ Ý ÕÙ × ÐØ Ö Ð ­Ù Ó Ð Ø ÕÙ Ø p1º Ò ×Ø ÑÓÑ ÒØÓ ÑÓ× ÑÙÐ Ö Ð × Ò ÓÒ int f1 = fib(n - 1) ½¾ Ö ØÓÖÒÓ × ¬ ´Ò ¹ ½µ ½¾ ≡ ´½¾ µ F1(current_ar) = RESULT(current_ar); ÄÙ Ó ÑÙÐ ÑÓ× Ð ÐÐ Ñ fib(n - 2) ½¾ ÐÐ Ñ ¬ ´Ò ¹ ¾µ ½¾ ≡ ´½¾ µ NUM(&stack.pushn()) = NUM(current_ar) - 2; /* crea un registro de activaci´n */ o RETURN_POINT(current_ar) = P2; ÐÐ Ñ Ö ÙÖ× Ú ¬ ½¾ ÐÐ Ñ ¬ ´Ò ¹ ¾µ ½¾ × × ÒØ ÐÐ Ñ ¬ ´Ò ¹ ½µ ½¾ º ÄÓ ÙÒ Ó ÕÙ Ñ × ÕÙ Ð Ú ÐÓÖ Ð Ô Ö Ñ ØÖÓ n ÓÖÖ ×ÔÓÒ n − 2º ¯ ÍÒ Ú Þ Ð ÙÐ Ó fib(n - 2)¸ Ö ØÓÖÒ Ö × ¬ ½¾ × ÐØ Ö Ð ­Ù Ó p2º Ò ×Ø ÑÓÑ ÒØÓ¸ ÑÙÐ ÑÓ× Ð × Ò ÓÒ int result = f1 + f2 ½¾ Ö ØÓÖÒÓ × ¬ ´Ò ¹ ¾µ ½¾ ≡ ´½¾ µ RESULT(caller_ar) = F1(current_ar) + RESULT(current_ar); ¯ Ò ÐÑ ÒØ ¸ return from fib × Ð ÔÙÒØÓ ÓÒ × ÑÙÐ Ð ÒרÖÙ ÓÒ return Ð ÔÖÓ¹ Ñ ÒØÓ Ö ÙÖ× ÚÓº Ì Ð ÑÙÐ ÓÒ ÓÒ× ×Ø Ò ½¾ Ö ØÓÖÒ Ö × ¬ ½¾ ≡ ´½¾ µ stack.pop(); /* cae en el registro del invocante */ if (stack.size() == 1)
  • 156.
    130 Cap´ ıtulo 2. Secuencias return RESULT(caller_ar); caller_ar = &stack.top(1); current_ar = &stack.top(); switch (RETURN_POINT(current_ar)) { case P1: goto p1; case P2: goto p2; } Ú Þ ÕÙ × Ö ØÓÖÒ ÙÒ ÙÒ ÓÒ × Ð Ñ Ò ÙÒ Ö ×ØÖÓ Ø Ú ÓÒ × × Ð ÓÑ Ø Ó Ð pop()º Ë Ð Ô Ð ÓÒØ Ò ÙÒ Ö ×ØÖÓ¸ ÒØÓÒ × Ð ­Ù Ó ×Ø Ø ÖÑ Ò Ò Ó Ð ÐÐ Ñ Ò Ð Ý Ð Ö ×ÙÐØ Ó ¬Ò Ø ÚÓ × Ò Ù ÒØÖ Ò RESULT(caller ar)º ÐÓ ÓÒØÖ Ö Ó¸ × ØÙ Ð Þ Ò ÐÓ× ÔÙÒØ ÓÖ × ÐÓ× Ö ×ØÖÓ× Ø Ú ÓÒ Ý × Ø ÖÑ Ò ÓÒ × Ö ØÓÖÒ Öº Ä ÖÙØ Ò ÒØ Ö ÓÖ Ü ÙÒ × ÑÔ ÒÓ Ò Ö ÓÖ ×Ù Ú Ö× ÓÒ Ö ÙÖ× Ú º ÒØÖ ¸ Ð Ì ArrayStack<T> Ò ÙÒ ×Ó Ö Óר Ú Ð ÓÒ × ÓÖ ÕÙ ÒÓ Ø Ò Ð Ú Ö× ÓÒ Ö ÙÖ× Ú º À Ý ÓØÖ × Ù ÒØ × ×Ó Ö Óר ¸ Ð Ò ÓÒ × ÐØÓ × ÙÒ ÕÙ ÒÓ Ø Ò Ð Ú Ö× ÓÒ Ö ÙÖ× Ú º ÈÓ ÑÓ× ØÙ Ö Ñ ÓÖ × ×Ó Ö Ð Ú Ö× ÓÒ ÒÓ Ö ÙÖ× Ú º Ò ÔÖ Ñ Ö ÐÙ Ö¸ ÔÓ ÑÓ× Ð Ñ Ò Ö Ð ÑÔÓ f1 Ð Ö ×ØÖÓ Ø Ú ÓÒ Ý ÙØ Ð Þ Ö resultº ר ÑÓ Ó ×¹ Ñ ÒÙ ÑÓ× Ð ÒØ pushesº ÇØÖ Ñ ÓÖ × ×Ñ ÒÙ Ö Ð ÒØ Ó × ÖÚ ÓÒ × Ð Ô Ð ¹ ÒרÖÙ ÓÒ top()¹º Ä Ô ÖØ ÐÐ Ñ Ö ÙÖ× Ú ¬ ½¾ ÔÓ Ö ¬Ò Ö× ÓÑÓ caller_ar = current_ar; ++current_ar; goto start; ÈÙ ×ØÓ ÕÙ Ð Ö ×ØÖÓ Ð ÒÚÓ ÒØ Ô × Ö × Ö Ð ØÙ и ÒÓ Ý Ò × Ó × ÖÚ Ö Ð Ô Ð º ÈÙ ×ØÓ ÕÙ Ð Ô Ð ×Ø ÑÔÐ ÒØ ÓÒ ÙÒ ÖÖ ÐÓ¸ Ð × Ù ÒØ Ö ×ØÖÓ Ø Ú ÓÒ × Ö Ð Ú ÒÓ current ar ÔÓÖ ×Ó ÐÓ Ò Ö Ñ ÒØ ÑÓ׺ ÍÒ ÓÔØ Ñ Þ ÓÒ ¬Ò Ð ÓÒ× ×Ø Ò ÓÐÓ Ö Ö ÓÒ × Ö Ð × × ÐØÓ Ò ÐÙ Ö Ø ¹ ÕÙ Ø ×º ר Ñ ØÓ Ó Ð Ñ Ò Ö Ð switch Ý Ð if Ö ØÓÖÒ Ö × ¬ ½¾ ¸ ÔÙ × Ð ­Ù Ó × ÐØ Ö Ö Ø Ñ ÒØ Ð Ö ÓÒ º × ÓÖØÙÒ Ñ ÒØ ¸ Ò Ð Ð Ò Ù C Ò ÐC ++ ÔÓ× Ò Ñ Ò ×ÑÓ× ÕÙ Ô ÖÑ Ø Ò ÐÑ Ò Ö Ö ÓÒ × × ÐØÓ½ º Ì Ò Ö ÑÓ׸ ÒØÓÒ ×¸ ÕÙ ÔÖÓ Ö Ñ Ö Ð ÙÒ × Ô ÖØ × Ð ÖÙØ Ò Ò Ò× Ñ Ð ÓÖº Eliminaci´n total de la recursi´n o o ÓÑÓ Ý ÐÓ ÑÓ× Ú ×ØÓ¸ Ð Ñ Ò Ö Ð Ö ÙÖ× ÓÒ ÒÓ × ØÖ Ú Ðº Ä ÜÔ Ö Ò Ò ÕÙ × ÑÙÝ Ð Ó Ø Ò Ö ÙÒ Ú Ö× ÓÒ ÒÓ Ö ÙÖ× Ú ÕÙ × Ñ × ¬ ÒØ ÕÙ ×Ù ÕÙ Ú Ð ÒØ Ö ÙÖ× ÚÓº ÈÓÖ × Ö ÞÓÒ¸ Ð Ð Ñ Ò ÓÒ Ð Ö ÙÖ× ÓÒ ÙÒ Ð ÓÖ ØÑÓ Ò ØÙÖ ÐÑ ÒØ Ö ÙÖ× ÚÓ ×ÓÐÓ Ö× × Ð Ô ÖØ Ö ÙÖ× Ú ×Ø ÒØÖÓ Ð Ñ ÒÓ Ö Ø Ó Ù ÓÒ Ý × Ú Ø Ð ÙÑ ÒØ Ö Ð × ÑÔ ÒÓº Ò Ð Ñ ÝÓÖ Ð × Ó × ÓÒ ×¸ × ÔÖ Ö Ð ØÖ Ö ÓÒ Ð Ú Ö× ÓÒ Ö ÙÖ× Ú º ½ Ð Ü Ô ÓÒ Ð Ò× Ñ Ð ÓÖ¸ Ð ÙØÓÖ ÒÓ ÓÒÓ Ò Ò ÙÒ Ð Ò Ù ÕÙ ÔÓ× ×Ø Ñ Ò ×ÑÓº Ä × ÔÖ Ñ Ø Ú × longjmp() Ý setjmp() Ð Ð ÓØ ר Ò Ö Ð Ð Ò Ù Ô ÖÑ Ø Ò Ù Ö Ö Ö ÓÒ × ­Ù Ó Ý × ÐØ Ö ÐР׺ Ä Ñ ÒØ Ð Ñ ÒØ ¸ ÒÙ ×ØÖÓ× ØÓ׸ ×Ù× Óר × Ò Ø ÑÔÓ Ý Ò ×Ô Ó ×ÓÒ ×ÙÔ Ö ÓÖ × ÕÙ Ð Ù Ö Ö Ò ÓÒ ×º
  • 157.
    2.6. Colas 131 Ü ×Ø Ò × ØÙ ÓÒ × Ò Ð × ÕÙ Ð Ø Ñ ÒÓ Ð Ô Ð Ð × ×Ø Ñ × Ô ÕÙ ÒÓº Ò ×ØÓ× ×Ó׸ Ð Ö ÙÖ× ÓÒ × Ô Ð ÖÓ× ¸ ÔÙ × ÙÑ ÒØ Ð × ÔÓ× Ð × × ÓÖ Ô Ð º Ë ØÙ ¹ ÓÒ × ×Ø Ø ÔÓ ×ÓÒ ÔÖÓ Ö Ñ × ÑÔÓØÖ Ó׸ Ø ÑÔÓ Ö Ð Ó ÔÐ ÓÒ × Ô Ö Ð Ð × ÓÒ Ú Ö Ó× ­Ù Ó× ´Ø Ö ×µ Ù ÓÒº Ò ×Ø ×Ó¸ ¬Ò ÔÖÓØ Ö Ð Ô Ð Ð × ×Ø Ñ ¸ × Ùר ¬ Ð ¹ Ð ÙÒ × Ú × × Ò Ð¹ ×ÔÓÒ Ö ÙÒ Ú Ö× ÓÒ ÒÓ Ö ÙÖ× Ú ÕÙ Ñ Ò ×Ù ÔÖÓÔ Ô Ð º Ò Ð ÔÖ Ø ¸ Ð Ù×Ó Ð Ö ÙÖ× ÓÒ × ÙÒ Ù ×Ø ÓÒ ÓÑÓ º Ë ÐÓ× ÓÒ ÔØÓ× Ò Ö ÒØ × Ð Ð ÓÖ ØÑÓ ×ÓÒ Ö ÙÖ× ÚÓ׸ ÒØÓÒ × × ÔÖ Ö Ð ØÖ Ö Ò Ø ÖÑ ÒÓ× Ö ÙÖ¹ × ÚÓ׸ ÔÙ × Ý Ñ × × ÙÖ ÒØ Ò Ñ ÒØÓº Ë ÔÓÖ Ö ÞÓÒ × × ÑÔ ÒÓ Ó ×Ô Ó × Ò × Ö Ó Ð Ñ Ò Ö Ð Ö ÙÖ× ÓÒ¸ ÒØÓÒ × × ÔÖ Ö Ð ÓÖÑÙÐ Ö ÓÒ ÔØÓ× Ø Ö Ø ÚÓ׸ Ò ÐÙ Ö Ð Ñ Ò Ö Ð Ö ÙÖ× ÓÒ ÙÒ Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓº ÍÒ ÑÔÐÓ ÒÓØ Ð × Ð Ñ ×Ñ ÙÒ ÓÒ ØÓÖ Ð ÙÝ ¬Ò ÓÒ Ø Ö Ø Ú × n n! = i . i=1 ר ¬Ò ÓÒ ÒÓ× ÓÒ Ù ÙÒ Ú Ö× ÓÒ Ø Ö Ø Ú × Ò Ò Ò ÙÒ Ö ÞÓÒ Ñ ÒØÓ Ö ÙÖ× ÚÓº Ð ÙÒ × Ú × × ÔÙ Ò ÓÒØÖ Ö ÙÒ ×ÓÐÙ ÓÒ Ò Ð Ø º ÈÓÖ ÑÔÐÓ¸ ÓÑÓ ¹ ÑÓ×ØÖ Ö ÑÓ× Ò Ü º º¾¸ Ð i¹ × ÑÓ ÒÙÑ ÖÓ ÓÒ ÔÙ ¬Ò Ö× ÓÑÓ √ n √ n 1 1+ 5 1− 5 (n) = √ − . 5 2 2 ÍÒ Ð ÓÖ ØÑÓ × Ó Ò ×Ø ÜÔÖ × ÓÒ ÒÓ Ö ÕÙ Ö Ò Ò ÙÒ Ø Ö ÓÒ Ò Ö ÙÖ× ÓÒº Ò ¬Ò Ø Ú ¸ ÐÓ Ñ × × ÑÔÐ × Ñ ÒÙ Ó ÐÓ ÓÒ Óº Ë Ô Ò× Ö Ö ÙÖ× Ú Ñ ÒØ × Ñ × × ÑÔÐ ¸ ÒØÓÒ × ØÖ Ò× ÔÓÖ Ð ÓÖ ØÑÓ× Ö ÙÖ× ÚÓ׺ Ë Ð Ú Ö× ÓÒ Ö ÙÖ× Ú × ÑÙÝ Ò ¬ ÒØ ¸ Ð ØÓÖ Ð Ó ÐÓ× ÒÙÑ ÖÓ× ÓÒ ¸ ÔÓÖ ÑÔÐÓ׸ ÒØÓÒ × Ù×ÕÙ ×ÓÐÙ ÓÒ × ÕÙ ×Ñ ÒÙÝ Ò ÐÓ× Ð ÙÐÓ× Ö Ô Ø Ó× Ó ÙØ Ð ÓÒ ÔØÓ× Ø Ö Ø ÚÓ× ÕÙ Ð ÓÒ ÙÞ Ò Ð ÓÖ ØÑÓ× Ø Ö Ø ÚÓ׺ 2.6 Colas ÍÒ ÓÐ × ÙÒ × Ù Ò ÓÒ Ó× ÜØÖ ÑÓ× ×Óº Ä Ò× Ö ÓÒ × ØÙ ÔÓÖ ÙÒ ÜØÖ ÑÓ¸ Ð ×ÙÔÖ × ÓÒ ÔÓÖ Ð ÓØÖÓº Ð ÜØÖ ÑÓ Ò× Ö ÓÒ × ÒÓÑ Ò ÓÑÙÒÑ ÒØ ÓÐ Ó ØÖ × ÖÓ Ó¸ Ò ×Ù× ÓÖÑ ×¸ × ÓÒ × Ö Ö Ó Ø Ð º Ð ÜØÖ ÑÓ ×ÙÔÖ × ÓÒ × ÐÐ Ñ Þ ¸ Ö ÒØ Ó¸ Ò ×Ù× ÓÖÑ × × ÓÒ ×¸ ÖÓÒØ Ó º ÓÐ Þ ØÖ × ÖÓ Ö ÒØ Ö Ö ÖÓÒØ ÔÙØ Ø Tn Tn−1 Tn−2 T2 T1 ÙÖ ¾º¾¿ Î × ÓÒ ×ØÖ Ø ÙÒ ÓÐ Ä ¬ ÙÖ ¾º¾¿ ÐÙ×ØÖ ÙÒ Ú × ÓÒ ×ØÖ Ø ÙÒ ÓÐ º ÄÓ× Ð Ñ ÒØÓ× ÒØÖ Ò ÔÓÖ Ð ÜØÖ ÑÓ ÞÕÙ Ö Ó Ñ ÒØ Ð ÓÔ Ö ÓÒ put()º Ð Ñ ×ÑÓ ÑÓ Ó¸ ÐÓ× Ð Ñ ÒØÓ× × Ð Ò ÔÓÖ Ð ÜØÖ ÑÓ Ö Ó Ñ ÒØ Ð ÓÔ Ö ÓÒ get()º Ñ Ó× ÜØÖ ÑÓ× ×ÓÒ Ó × ÖÚ Ð ×º
  • 158.
    132 Cap´ ıtulo 2. Secuencias Ð ØÖ × ÖÓ ÙÒ ÓÐ ÒÓØ Ð Ð Ñ ÒØÓ Ñ × Ö ÒØ Ñ ÒØ Ò× ÖØ Ó Ý Ð Ö ÒØ Ð Ñ ÒÓ× Ö ÒØ Ñ ÒØ Ò× ÖØ Óº ר ÒÓ ÓÒ Ö ÒØ × ÙÒ Ñ ÒØ Ð Ò Ð ÙÒÓ× Ð ÓÖ ØÑÓ× Ý × ÒÓÑ Ò È ÈË ´ÈÖ Ñ ÖÓ Ò ÒØÖ Ö¸ ÈÖ Ñ ÖÓ Ò Ë Ð Öµ Ó¸ Ò Ò Ð ×¸ Á Ç ´ Öר ÁÒ¸ Öר ÇÙØµº ÈÓ ÑÓ× Ö ÕÙ ÐÓ× Ð Ñ ÒØÓ× Ð ÓÐ ×Ø Ò ÓÖ Ò Ó× × Ð Ñ × ÓÚ Ò ×Ø Ð Ñ × ÒØ ÙÓº ר Ô ØÖÓÒ Ö Ø Ö Þ ÐÓ× ÓÒØ ÜØÓ× Ð ÓÖ ØÑ Ó× Ò ÐÓ× Ù Ð × ÙÒ ÓÐ ÔÙ Ù× Ö× º Ð Ù Ð ÕÙ ÓÒ Ð × Ô Ð ×¸ Ð × ÓÐ × ×ÓÒ ÑÙÝ ÓÑÙÒ × Ò Ð Ú Ö Ðº Ò ÓÒØÖ ÑÓ× ÑÔÐÓ× Ø Ô Ó× Ò Ð × ÓÐ × ×Ô Ö ÑÙ Ó× × ÖÚ Ó× ÒÙ ×ØÖ ×Ó º ÙÒÓ Ú ÑÓ× Ð Ò ÑÓ× Ö ÙÒ ÓÐ Ô Ö ÓÑÔÖ Ö Ð ÒØÖ Ù ÐÑ ÒØ ¸ ÑÓ× Ö ÓØÖ ÓÐ Ô Ö Ò Ö × Ö Ð × Ð º Ù Ò Ó Ú ÑÓ× Ð Ò Ó ÑÓ× Ö ÓÐ º Ù Ò Ó ÓÒ Ù ÑÓ× ÙÒ ÖÖÓ Ý ÖÖ ÑÓ× ÙÒ × Ñ ÓÖÓ × ÓÖÑ ÙÒ ÓÐ º 2.6.1 Variantes de las colas ÍÒ Ú Ö ÒØ Ñ × Ò Ö Ð Ð ÓÖ Ò Á Ç ÓÒ× ×Ø Ò Ú Ö Ð ÓÖ Ò × Ð Ñ × Ö ÒØ ¹ Ñ ÒØ Ó ×Ø Ð Ñ ÒÓ× Ö ÒØ Ñ ÒØ Óº Ð ÓÖ Ò Ò× Ö ÓÒ Ý ÜØÖ ÓÒ × Ð Ñ ×ÑÓ¸ Ô ÖÓ Ý ÙÒ ÓÔ Ö ÓÒ ÓÒ Ð ×Ó Ó ÓÒ×ÙÐØ º Ù ÐÕÙ Ö Ð Ñ ÒØÓ Ð ÓÐ ÔÙ × Ö Ó¸ Ô ÖÓ ×Ø ×Ó Ù× ÕÙ Ð Ð Ñ ÒØÓ × ×ÔÐ Ð ØÖ × ÖÓº ר ÑÓ Ó¸ Ð Ö ÒØ × Ð Ð Ñ ÒØÓ ÕÙ Ø Ò Ñ × Ø ÑÔÓ × Ò Ö Ö Ò Ö× ¸ Ñ ÒØÖ × ÕÙ Ð ØÖ × ÖÓ × Ð ÕÙ Ø Ò Ñ ÒÓ× Ø ÑÔÓº ר ÔÓÐ Ø Ó Ö ÑÔÓÖØ Ò Ò ÔÖÓ Ð Ñ × ÕÙ Ñ Ò ÔÙÐ Ò ÓÒ ÙÒØÓ× ØÓ× Ö ÒÐ ¬Ò Ø º Ù Ò Ó × Ò Ö × ÙÒ ÒÙ ÚÓ Ð Ñ ÒØÓ Ò ÙÒ ÓÒ ÙÒØÓ ÐÐ ÒÓ¸ Ý ÕÙ × Ð ÓÒ Ö ÙÒ Ð Ñ ÒØÓ ×ÙÔÖ Ñ Öº Ë Ð ×Ó Ð ÓÒ ÙÒØÓ Ü ÐÓ Ð Ø ÑÔÓÖ Ð¸ ÐÓ Ù Ð ×Ù Ò ÑÙ Ó× ÓÒØ ÜØÓ× ÔÐ ¹ Ø ÚÓ׸ ÒØÓÒ × Ð Ñ ÓÖ Ð Ñ ÒØÓ ×ÙÔÖ Ñ Ö × Ð Ñ ÒÓ× Ö ÒØ Ñ ÒØ ÙØ Ð Þ Óº Ò ÙÒ ÓÐ ÕÙ Ñ Ò Ð ÓÖ Ò ×Ó¸ ר Ð Ñ ÒØÓ × Ò Ù ÒØÖ Ò Ð Ö ÒØ º ÇØÖ Ú Ö ÒØ ÑÔÓÖØ ÒØ × Ô ÖÑ Ø Ö Ð Ò× Ö ÓÒ Ý ×ÙÔÖ × ÓÒ ÔÓÖ ÐÓ× Ó× ÜØÖ ÑÓ׺ ר Ú Ö ÒØ × ÒÓÑ Ò ÓÐ Ó ÔÓÐÓ ½ º Ò ÖØ Ñ ¸ ÙÒ ÓÐ × ÙÒ ÓÖÑ Ò Ö Ð Ô Ð Ý ÓÐ º Ù ÐÕÙ Ö Ð × Ó× ×ØÖÙ ØÙÖ × ÔÙ ÑÓ Ð Þ Ö× Ñ ÒØ ÙÒ ÓÐ º Ä Ñ Ð Ò ØÓÖÒÓ Ð Ì Dlink ´Ü ¾º º µ × ÙÒ ÔÓÐÓº 2.6.2 Aplicaciones de las colas Ò Ò Ö Ð¸ ÐÓ× × ×Ø Ñ × ÔÖÓ Ö Ñ Ó× ÙØ Ð Þ Ò ÓÐ × Ô Ö Ø Ò Ö ×ÓÐ ØÙ × Ó Ð Ùר × ÔÐ Ò Á Ǻ ÈÓÖ ÑÔÐÓ¸ ÙÒ × ÖÚ ÓÖ Ï ÔÙ Ò ÓÐ Ö ×ÓÐ ØÙ × Ù×ÕÙ Ô Ò × ÙÒ Ð ÓÖ Ò ÐÐ º ÅÙ Ó× × ×Ø Ñ × ÓÒØÖÓÐ ØÖ Ò× ÓÒ × Ò ÓÐ Ò Ð × ×ÓÐ ØÙ × × ÖÚ Ó× ÔÓÖ ÑÔÐÓ¸ ØÖ Ò× ÓÒ × ¬Ò Ò Ö ×º Ð ÖÓÐ ÙÒ Ñ ÒØ Ð Ð ×Ó ØÛ Ö Ö × ØÖ Ò×Ñ Ø Ö Ô ÕÙ Ø × Ò ÓÖÑ ÓÒ ÒØÖ ÐÓ× Ú Ö×Ó× ÒÓ Ó× ÙÒ Ö º Ð ÔÖÓ Ö Ñ Ò Ö Ó ×Ø ØÖ Ò×Ñ × ÓÒ × ÒÓÑ Ò ÒÖÙØ ÓÖ Ó Ò Ñ Ò ÓÖ º Ò Ö ÐÑ ÒØ ¸ ÙÒ ÒÖÙØ ÓÖ ÔÖÓ × ×Ù× Ô ÕÙ Ø × × ÙÒ ÙÒ × ÔÐ Ò Á Ǻ ÄÓ× × ×Ø Ñ × ÓÔ Ö Ø ÚÓ× Ø Ñ Ò ÙØ Ð Þ Ò ÓÐ × Ô Ö ÓÑÔ ÖØ Ö Ö ÙÖ×Ó× ÒØÖ Ú Ö×Ó× Ù×Ù Ö Ó׺ ÌÖ ÓÒ ÐÑ ÒØ ¸ ÔÖÓ ×Ó× ÕÙ ÖÖ Ò ÙÒ × ×Ø Ñ × Ò× ÖØ Ò Ò ÙÒ ÓÐ º Ð ÔÖÓ ×Ó Ò Ð Ö ÒØ × ÜØÖ Ý × ÙØ ÙÖ ÒØ ÙÒ Ø ÑÔÓ ÐÐ Ñ Ó Ù ÒØÙѺ Ù Ò Ó Ð Ù ÒØÙÑ ÜÔ Ö ¸ Ð ÔÖÓ ×Ó × Ò× ÖØ ÒÙ ÚÓ Ò Ð ÓÐ Ý Ð × ×Ø Ñ ÓÔ Ö Ø ÚÓ ÜØÖ Ð × Ù ÒØ ÔÖÓ ×Ó Ð ÓÐ º ½ Ò Ò Ð ×¸ ÕÙ º
  • 159.
    2.6. Colas 133 Ü ×Ø ØÓ ÙÒ Ö Ñ Ð Ñ Ø Ñ Ø ¸ ÓÒÓ ÓÑÓ Ø ÓÖ ÓР׸ Ð Ù Ð ÑÓ Ð Þ ÒØ × ×ØÖ Ø × ÕÙ × Ò ÓÐ Ò Ô Ö ×ÓÐ Ø Ö Ð ÙÒ × ÖÚ Óº ÙÒÕÙ Ð Ñ Ø Ñ Ø ÖÖÓ Ö ×ÙÐØ Ó× Ò Ð Ø Ó× ÑÙÝ ÙØ Р׸ Ð ÙÒÓ× ÑÓ ÐÓ× ×ÓÒ Ø Ò ÓÑÔÐ Ó× ÕÙ × Ò × Ö Ó × ÑÙÐ ÖÐÓ× º Ì Ð × × ×Ø Ñ × × ÑÙÐ ÓÒ Ù× Ò ÒØ Ò× Ú Ñ ÒØ ÓР׺ 2.6.3 Representaciones en memoria de las colas Ð Ù Ð ÕÙ Ð Ô Ð ¸ ÙÒ ÓÐ × ÙÒ × Ù Ò Ð Ñ ÒØÓ× Ð ÙÒ Ø ÔÓº ÓÑÓ Ø Ð¸ Ý Ó× ÓÖÑ × × × Ö ÔÖ × ÒØ Ö ÙÒ ÓÐ ÓÒ ÙÒ ÖÖ ÐÓ Ó ÓÒ ÙÒ Ð ×Ø º Ä ÑÔÐ ÒØ ÓÒ Ð ÓÐ ÓÒ ÙÒ ÖÖ ÐÓ × × Ñ Ð Ö Ð Ô Ð º Ä Ö Ò ×ØÖ Ò ÕÙ ÑÓ× Ñ Ò Ö ÐÓ× Ó× ÜØÖ ÑÓ× Ö Ó¸ ÑÓ× Ñ ÒØ Ò Ö Ó× ÓÒØ ÓÖ × ÙÒÓ Ô Ö Ð ÓÐ ¸ ÓØÖÓ Ô Ö Ð Þ º Ä ¬ ÙÖ ¾º¾ ÐÙ×ØÖ ÙÒ ÓÐ ÑÔÐ ÒØ Ñ ÒØ ÙÒ ÖÖ ÐÓº ¼ ½ ¾ ¿ ½¼ T0 T1 T2 T3 T4 Þ ÓÐ ÙÖ ¾º¾ ÓÐ ÑÔÐ ÒØ Ñ ÒØ ÙÒ ÖÖ ÐÓ È Ö Ò× ÖØ Ö¸ ÓÔ ÑÓ× Ð Ð Ñ ÒØÓ Ò Ö Ñ ÒØ ÑÓ× Ð ÓÐ º È Ö Ð Ñ Ò Ö¸ ÓÔ ÑÓ× Ð Ú ÐÓÖ Ö ØÓÖÒÓ Ò Ö Ñ ÒØ ÑÓ× Ð Þ º Ä ÓÐ ×Ø ÐÐ Ò Ù Ò Ó Ð ÒØ Ð Ñ ÒØÓ× × Ù Ð Ð Ñ Ò× ÓÒ Ð Ú ØÓÖº ÆÓØ ÑÓ× ÕÙ Ð Ð Ñ Ò ÓÒ Ð Ñ ÒØÓ× ÔÙ Ö ×Ô Ó× ×ÔÓÒ Ð × Ð ÞÕÙ Ö Ð Ò Þ º × Ô٠׸ Ð Ò× Ö ÓÒ Ý ×ÙÔÖ × ÓÒ Ò ÓÒ× Ö Ö ×Ø Ö ÙÐ Ö º ×ØÓ ÔÙ Ñ Ò Ö× Ñ ÒØ ÙÒ if ÕÙ Ú Ö ¬ÕÙ × Ð Ò ÒÓ × Ò Ù ÒØÖ Ò Ð ÓÖ Ð ÖÖ ÐÓ¸ Ó Ñ ÒØ Ð ÙÒ ÓÒ ÑÓ ÙÐÓº È Ö Ð × ÓÐ × × ÔÖ Ö Ð ÕÙ Ð Ð ×Ø × Ö ÙÐ Ö¸ ÔÙ × ÔÓ ÑÓ× Ö Ð Ö ÒØ Ý Ð ØÖ × ÖÓ Ñ ÒØ ÙÒ ×ÓÐÓ ÔÙÒØ ÓÖº Ë × ØÖ Ø ÙÒ Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ ¸ ÓÖ Ò ÑÓ× ÐÓ× Ð Ñ ÒØÓ× × Ð Ö ÒØ ר Ð ØÖ × ÖÓ Ý Ñ ÒØ Ò ÑÓ× ÙÒ ÔÙÒØ ÓÖ Ð ÙÐØ ÑÓ Ð Ñ ÒØÓ ´¬ ÙÖ ¾º¾ µº ר ÑÓ Ó¸ ÔÓ ÑÓ× Ò× ÖØ Ö Ý Ð Ñ Ò Ö × Ð ÔÙÒØ ÖÓ Ð ÓÐ º rear 1 2 3 4 5 ÙÖ ¾º¾ ÓÐ ÑÔÐ ÒØ Ñ ÒØ ÙÒ Ð ×Ø × ÑÔÐ Ä × Ð ×Ø × Ó Ð Ñ ÒØ ÒÐ Þ × ÔÙ Ò × Ö ÙÒ Ù Ò × Ó Ò Ô Ö Ð × ÓÐ × ÓÖ ¹ Ò × × ÙÒ Ð Ø ÑÔÓ ×Ó Ý Ô Ö Ð × ÓÐ × ´Ü ¾º º½µº Ä Ú ÒØ × ÕÙ Ð ×ÙÔÖ × ÓÒ ÙÒ Ð Ñ ÒØÓ × Ö Ø ÓÒ ÙÒ ÒÓ Ó Ó Ð ¸ Ñ ÒØÖ × ÕÙ Ò ÙÒ Ð ×Ø × ÑÔÐ Ö ÕÙ Ñ ÒØ Ò Ö Ð ÔÙÒØ ÖÓ Ð ÔÖ ×ÓÖº
  • 160.
    134 Cap´ ıtulo 2. Secuencias Ð Ø ÔÓ DynDlist<T> ×ØÙ Ó Ò Ü ¾º º½¼ ´Ô Ò ¿µ ÒÓ× ÔÖÓÔÓÖ ÓÒ ÙÒ Ñ Ò Ö Ö Ø ÑÔÐ Ñ ÒØ Ö ÙÒ ÓÐ º Ë Ú ÑÓ× Ð ÙÐØ ÑÓ Ð Ñ ÒØÓ ÓÑÓ Ð ØÖ × ÖÓ¸ ÒØÓÒ × Ð ÓÔ Ö ÓÒ get() × ÑÔÐ ÒØ Ñ ÒØ return remove first() Ý put(item) Ñ ÒØ append(item)º Ð ØÖ × ÖÓ Ý Ð Ö ÒØ × Ó × ÖÚ Ò ØÖ Ú × get last() Ý get first()¸ Ö ×Ô Ø Ú Ñ ÒØ º 2.6.4 El TAD ArrayQueue<T> (cola vectorizada) Ò ×Ø × ÓÒ × ÖÖÓÐÐ Ö ÑÓ× ÙÒ ÑÔÐ ÒØ ÓÒ ÓÐ × Ñ ÒØ ÖÖ ÐÓ× ×Ø Ø Ó׺ ÁÑÔÐ ÒØ Ö ÑÓ× Ó× Ì ÑÙÝ × Ñ Ð Ö × ArrayQueue<T> Ý FixedQueue<T>º Ñ Ó× Ø ÔÓ× ×ÓÒ × ÒØ Ó× × ÐÚÓ ÕÙ FixedQueue<T> ÒÓ ØÙ Ú Ö ¬ ÓÒ × × ÓÖ º ÄÓ× Ø ÔÓ× × ¬Ò Ò Ò Ð Ö ÚÓ ØÔÐ ÖÖ ÝÉÙ Ù ºÀ ½¿ Ð × Ù ÒØ Ñ Ò Ö ½¿ ØÔÐ ÖÖ ÝÉÙ Ù ºÀ ½¿ ≡ template <typename T> class ArrayQueue { ØÖ ÙØÓ× ÓÐ Ú ØÓÖ Þ ½¿ Ñ ØÓ Ó× ÔÖ Ú Ó× ÓÐ Ú ØÓÖ Þ ½¿ Ñ ØÓ Ó× ÔÙ Ð Ó× ArrayQueue<T> ½¿ Ó × ÖÚ ÓÖ × ÓÐ Ú ØÓÖ Þ ½¿ }; template <typename T> class FixedQueue { }; ¬Ò × ArrayQueue¸ Ù× Ò ÙÒ × ½¿ Ò ¾¼ º Ñ × Ð × × ÑÓ Ð Þ Ò ÓÐ × Ð Ñ ÒØÓ× Ò Ö Ó× Ø ÔÓ T ÑÔÐ ÒØ × Ñ ÒØ ÙÒ ÖÖ ÐÓ ×Ø Ø Óº ArrayQueue<T> Ú Ö ¬ × ÓÖ × Ù Ò Ó Ð ÖÖ ÐÓ ×Ø Ú Ó Ó ÐÐ ÒÓº ÍÒ × ÓÖ ÔÖÓÚÓ ÙÒ Ü Ô ÓÒº FixedQueue<T> ÒÓ ØÙ Ò Ò ÙÒ Ú Ö ¬ ÓÒ Ò Ò Ö Ò Ò ÙÒ Ü Ô ÓÒº Ä Ù× Ò ×Ø × Ú Ö ¬ ÓÒ × ÓÒÐÐ Ú ÙÒ Ð Ö Ò Ò Ò × ÑÔ ÒÓº Ä Ñ Ò× ÓÒ Ð ÖÖ ÐÓ ÒØ ÖÒÓ ×Ø Ö ×ØÖ Ò ÙÒ ÔÓØ Ò Ü Ø 2º ½¿ ØÖ ÙØÓ× ÓÐ Ú ØÓÖ Þ ½¿ ≡ ´½¿ µ ½¿ const size_t two_pow; const size_t dim; T * array; Ð ÔÙÒØ ÖÓ array ÓÒØ Ò ÐÓ× Ð Ñ ÒØÓ× Ð ÓÐ º dim Ö ÔÖ × ÒØ Ð Ñ Ò× ÓÒ Ð ÖÖ ÐÓ ÒØ ÖÒÓ¸ Ð Ù Ð × ÙÒ ÔÓØ Ò Ü Ø 2 Ø Ð ÕÙ dim == 2two pow º Ð Ö ÒØ Ð ÓÐ ×Ø Ó ÔÓÖ ½¿ ØÖ ÙØÓ× ÓÐ Ú ØÓÖ Þ ½¿ +≡ ´½¿ µ ½¿ ½¿ size_t front_index; /* index of oldest inserted item */ × ÐÒ front index Ð Ð Ñ ÒØÓ Ñ × ÒØ ÙÓ Ò Ð ÓÐ × Ö¸ array[front index] ÓÒØ Ò Ð Ö ÒØ Ð ÓÐ ½¿ Ö ÒØ Ð ÓÐ ½¿ ≡ ´½¿ µ array[front_index]
  • 161.
    2.6. Colas 135 Ð ØÖ × ÖÓ Ð ÓÐ ×Ø Ò Ó ÔÓÖ ½¿ ØÖ ÙØÓ× ÓÐ Ú ØÓÖ Þ ½¿ +≡ ´½¿ µ ½¿ ½¿ size_t rear_index; rear index Ò Ð ÔÓ× ÓÒ Ð ÔÖ Ñ Ö Ð ×ÔÓÒ Ð Ô Ö Ò× ÖØ Ö × Ö¸ array[rear index - 1] ÓÒØ Ò Ð Ð Ñ ÒØÓ Ñ × Ö ÒØ Ò Ð ÓÐ º ¼ ½ ¾ ¿ T0 T1 T2 T3 T4 front index rear index ÙÖ ¾º¾ ÇÖ Ò Þ ÓÒ Ð ÖÖ ÐÓ Ò ArrayQueue<T> ÄÓ× Ú ÐÓÖ × front index Ý rear index × Ò Ò Ò ÖÓº Ä ¬ ÙÖ ¾º¾ ÐÙ×ØÖ Ð ×Ø Ó Ð ÖÖ ÐÓ Ý ÐÓ× Ò × ×ÔÙ × Ò× ÖØ Ö ÐÓ× ÔÖ Ñ ÖÓ× Ò Ó Ð Ñ ÒØÓ× Ò ÙÒ ÖÖ ÐÓ 8 Ð Ñ ÒØÓ׺ Ì ÒØÓ Ô Ö Ò× ÖØ Ö¸ ÓÑÓ Ô Ö Ð Ñ Ò Ö¸ ר ÓÒ Ò Ö Ñ ÒØ Ö Ð Ò ÓÖÖ ×ÔÓÒ¹ ÒØ º Ë ÕÙ Ö ÑÓ× Ò× ÖØ Ö¸ Ò Ö Ñ ÒØ ÑÓ× rear index × ÕÙ Ö ÑÓ× Ð Ñ Ò Ö¸ Ò Ö Ñ Ò¹ Ø ÑÓ× front indexº Ù Ò Ó Ð ÙÒÓ ÐÓ× Ò × Ð ÒÞ Ð Ñ Ò× ÓÒ Ð ÖÖ ÐÓ¸ ÐÓ Ò ÑÓ× ÒÙ ÚÓ Ò ÖÓ ×ØÓ × ÑÙÐ Ð Ö ÙÐ Ö º È Ö ×ØÓ¸ ר ÓÐÓ Ö ÙÒ if ×ÔÙ × Ð Ò Ö Ñ ÒØÓ ÕÙ Ú Ö ¬ÕÙ × × Ð ÒÞ Ð Ñ Ò× ÓÒ × Ø Ð × Ð ×Ó¸ ÒØÓÒ × Ö Ò ÑÓ× Ð Ò Ò ÖÓº ÈÓ ÑÓ× Ú Ø Ö Ð if × Ú Þ ÕÙ Ò Ö Ñ ÒØ ÑÓ× ÙÒ Ò Ð ÙÐ ÑÓ× Ð ÑÓ ÙÐÓ Ð Ñ Ò× ÓÒ Ð ÖÖ ÐÓº ר ÑÓ Ó¸ Ð Ú ÐÓÖ Ð Ò × ÑÔÖ ×Ø Ö ÓÑÔÖ Ò Ó ÒØÖ 0 Ý dim − 1º ר Ñ ØÓ Ó Ð Ò Ð Þ Ð Ó Ó¸ Ô ÖÓ × Ñ × Ð ÒØÓ ÕÙ ÓÒ Ð ifº × Ô Ö ×ÓÐÚ ÒØ Ö ×Ø ÔÖÓ Ð Ñ ¸ ÕÙ ÓÖÞ ÑÓ× Ð Ñ Ò× ÓÒ ÕÙ × ÔÓØ Ò Ü Ø 2¸ Ô٠׸ Ò ×Ø ×Ó¸ Ð ÑÓ ÙÐÓ ÔÙ Ð ÙÐ Ö× ÑÙÝ Ö Ô Ñ ÒØ ØÖ Ú × ÙÒ and ÐÓ Óº ÈÓÖ Ø ÒØÓ¸ ÙÒÓ ÐÓ× ØÖ ÙØÓ× × Ö ÙÒ Ñ × Ö Ø× Ô Ö Ð ÙÐ Ö Ð ÑÓ ÙÐÓ ½¿ ØÖ ÙØÓ× ÓÐ Ú ØÓÖ Þ ½¿ +≡ ´½¿ µ ½¿ ½¿ const size_t mask; × Ø ÒØ ÓÖ Ð ÙÐ Ö Ð ÒÙÑ ÖÓ Ð Ñ ÒØÓ× Ñ ÒØ Ð Ú ÐÓÖ ×ÓÐÙØÓ rear index − front indexº Ä Ñ ÒØ Ð Ñ ÒØ ¸ Ø Ò ÑÓ× ÙÒ Ñ Ù ¸ ÔÙ × Ð Ö ×Ø × ÖÓ Ù Ò Ó Ð ÓÐ ×Ø ÐÐ Ò º ÆÓ Ý ÓØÖ ÐØ ÖÒ Ø Ú ¸ ÒØÓÒ ×¸ ÕÙ ÓÒØ Ð Þ Ö Ö Ø Ñ ÒØ Ð ÒØ Ð Ñ ÒØÓ× Ò ÙÒ ØÖ ÙØÓ ½¿ ØÖ ÙØÓ× ÓÐ Ú ØÓÖ Þ ½¿ +≡ ´½¿ µ ½¿ size_t num_items; ÄÓ× ØÖ ÙØÓ× Ð ÓÐ × Ò Ò ÓÑÓ × Ù ½¿ Ñ ØÓ Ó× ÔÙ Ð Ó× ArrayQueue<T> ½¿ ≡ ´½¿ µ ½¿ ArrayQueue(const size_t & tp = 8) : two_pow(tp), dim(1<<two_pow), array(NULL), front_index(0), rear_index(0), mask(dim - 1), num_items(0) { array = new T [dim]; } Í× × ArrayQueue ½¿ º
  • 162.
    136 Cap´ ıtulo 2. Secuencias Ä ÓÔ Ö ÓÒ Ò Ö Ñ ÒØ Ö ÙÒ Ò Ý ÐÙ Ó Ð ÙÐ Ö Ð ÑÓ ÙÐÓ × Ö ØÙ ÔÓÖ ÐÓ× ÑÓ ¬ ÓÖ × Ð ÓÐ º × ÑÙÝ ÑÔÓÖØ ÒØ ¸ Ô٠׸ × ÙÖ ÖÒÓ× ÖÐ ÓÖÖ Ø Ñ ÒØ º È Ö ÐÐÓ¸ Ð ÑÓ ÙÐ Ö Þ ÑÓ× Ý Ð ×Ð ÑÓ× Ò ÙÒ ×ÓÐ ÓÔ Ö ÓÒ ½¿ Ñ ØÓ Ó× ÔÖ Ú Ó× ÓÐ Ú ØÓÖ Þ ½¿ ≡ ´½¿ µ ½¿ void increase_index(size_t & i, const size_t & inc = 1) const { i += inc; i &= mask; } increase index() Ò Ö Ñ ÒØ i Ò inc ÙÒ × Ý Ð ÙÐ Ð ÑÓ ÙÐÓ Ñ ÒØ Ð Ñ × Ö º Ð Ñ ØÓ Ó Ð ÑÓ ÙÐÓ ÔÙ ÔÐ Ö× Ø Ñ Ò ÓÒ Ö ×Ø × Ò ÐÙ Ö ×ÙÑ ×º Ù Ò Ó × Ö Ñ ÒØ ÙÒ ÒØ ÖÓ × Ò × ÒÓ ÓÒ Ú ÐÓÖ ÖÓ¸ Ð × ÓÖ Ò Ø ÚÓ Ù× ÕÙ Ð ÒØ ÖÓ ÕÙ Ö Ð Ñ ÝÓÖ Ú ÐÓÖº ÈÙ ×ØÓ ÕÙ Ð Ñ Ò× ÓÒ × ÔÓØ Ò Ó׸ Ð ÑÓ ÙÐÓ Ö ÓÑÓ Ö ×ÙÐØ Ó Ð Ñ Ò× ÓÒ Ñ ÒÓ× ÙÒÓº ÑÓ× × ÙÖ ÖÒÓ׸ ÑÔ ÖÓ¸ ÕÙ Ð × Ö ×Ø × × ÔÐ ÕÙ Ò ×Ó Ö ÒØ ÖÓ× × Ò × ÒÓ Ý¸ ÔÓÖ ×ÙÔÙ ×ØÓ¸ ÕÙ Ð Ö ØÑ Ø × Ò Ö º Ë × × ÓÒ×ÙÐØ Ö Ð ØÖ × ÖÓ¸ × Ò × Ö Ó Ö array[rear index - 1]º ÈÙ ×ØÓ ÕÙ ×Ø ÓÔ Ö ÓÒ ÔÙ ÖÖÓ Ö ÙÒ × ÓÖ Ò Ø ÚÓ¸ Ð ×Ð ÑÓ× Ò ÙÒ ×ÓÐ ÙÒ ÓÒ ÕÙ ÒÓ× Ö ÒØ ÙÒ ÓÔ Ö ÓÒ ÓÖÖ Ø ½¿ Ñ ØÓ Ó× ÔÖ Ú Ó× ÓÐ Ú ØÓÖ Þ ½¿ +≡ ´½¿ µ ½¿ T & rear_item(const size_t & i = 0) { return array[static_cast<size_t> ((rear_index - i - 1) & mask)]; } ½¿ Ñ ØÓ Ó× ÔÙ Ð Ó× ArrayQueue<T> ½¿ +≡ ´½¿ µ ½¿ ½¿ T & put(const T & item) throw(std::exception,std::overflow_error) { if (num_items >= dim) throw std::overflow_error ("Array queue is full"); ÔÙØ Ò ÓÐ Ú ØÓÖ Þ ½¿ } put() Ò Ö Ð Ü Ô ÓÒ std::overflow error × × ÒØ ÒØ Ò× ÖØ Ö Ò ÙÒ ÓÐ ÐÐ Ò º Ä Ò× Ö ÓÒ ÓÑÓ Ø Ð × ÓÑÓ × Ù ½¿ ÔÙØ Ò ÓÐ Ú ØÓÖ Þ ½¿ ≡ ´½¿ µ array[rear_index] = item; T & ret_val = array[rear_index]; increase_index(rear_index); num_items++; return ret_val; Ò ÐÙ Ö Ò× ÖØ Ö ÙÒ Ð Ñ ÒØÓ¸ × ÔÓ× Ð Ô ÖØ Ö ×Ô Ó¸ Ó × ÔÐ Ò Á Ǹ Ô Ö n Ð Ñ ÒØÓ׺ ×ØÓ × Ø Ò Ö Ô Ó ØÖ Ú × ÙÒ ÖÖ ÐÓ ÕÙ Ú Ð Ð Ô Ò ÜÔÓÖØ Ö Ð ÙÒ ÓÒ Ð Ò Ð × Ù ÒØ Ñ ØÓ Ó ½¿ Ñ ØÓ Ó× ÔÙ Ð Ó× ArrayQueue<T> ½¿ +≡ ´½¿ µ ½¿ ½¿ T & putn(const size_t & n) throw(std::exception, std::overflow_error) { if (num_items + n >= dim) throw std::overflow_error ("Array queue is full"); ÔÙØÒ Ò ÓÐ Ú ØÓÖ Þ ½¿ }
  • 163.
    2.6. Colas 137 Ä ÔÖ Ñ Ö Ô ÖØ Ú Ö ¬ Ð × ÓÖ ¸ Ð × ÙÒ × Ö Ñ Ø Ò Ö Ñ ÒØ Ö rear index ½¿ ÔÙØÒ Ò ÓÐ Ú ØÓÖ Þ ½¿ ≡ ´½¿ µ increase_index(rear_index, n); num_items += n; return rear_item(); Ä ×ÙÔÖ × ÓÒ × × × Ñ ØÖ put() ½¿ Ñ ØÓ Ó× ÔÙ Ð Ó× ArrayQueue<T> ½¿ +≡ ´½¿ µ ½¿ ½¿ T get() { Ø Ò ÓÐ Ú ØÓÖ Þ ½¿ } ÓÒ Ð ×ÙÔÖ × ÓÒ ÓÒ× ×Ø Ò ½¿ Ø Ò ÓÐ Ú ØÓÖ Þ ½¿ ≡ ´½¿ µ num_items--; T ret_val = Ö ÒØ Ð ÓÐ ½¿ ; increase_index(front_index); return ret_val; Ä ÓÒØÖ Ô ÖØ putn() × getn() × Ö¸ Ð Ö Ö n Ð Ñ ÒØÓ× ÔÓÖ Ð Ö ÒØ Ð ÓÐ ½¿ Ñ ØÓ Ó× ÔÙ Ð Ó× ArrayQueue<T> ½¿ +≡ ´½¿ µ ½¿ ½¿ T & getn(const size_t & n) throw(std::exception, std::underflow_error) { ØÒ Ò ÓÐ Ú ØÓÖ Þ ½¿ } ½¿ ØÒ Ò ÓÐ Ú ØÓÖ Þ ½¿ ≡ ´½¿ µ num_items -= n; increase_index(front_index, n); return array[front_index]; Ä ÓÒ×ÙÐØ ÔÓÖ Ð Ö ÒØ × Ö Ð Þ Ñ ÒØ ½¿ Ñ ØÓ Ó× ÔÙ Ð Ó× ArrayQueue<T> ½¿ +≡ ´½¿ µ ½¿ ½¿ T & front(const size_t & i = 0) { Ö ØÓÖÒ Ö i¹ × ÑÓ Ð Ñ ÒØÓ Ð Ö ÒØ ½¿ } ½¿ Ö ØÓÖÒ Ö i¹ × ÑÓ Ð Ñ ÒØÓ Ð Ö ÒØ ½¿ ≡ ´½¿ µ return array[front_index + i]; Ä ÓÒ×ÙÐØ ÔÓÖ Ð ØÖ × ÖÓ Ø Ñ Ò × × Ñ ØÖ ½¿ Ñ ØÓ Ó× ÔÙ Ð Ó× ArrayQueue<T> ½¿ +≡ ´½¿ µ ½¿ T & rear(const size_t & i = 0) throw(std::exception, std::underflow_error) { Ö ØÓÖÒ Ö i¹ × ÑÓ Ð Ñ ÒØÓ Ð ØÖ × ÖÓ ½¿ } ½¿ Ö ØÓÖÒ Ö i¹ × ÑÓ Ð Ñ ÒØÓ Ð ØÖ × ÖÓ ½¿ ≡ ´½¿ µ return rear_item(i);
  • 164.
    138 Cap´ ıtulo 2. Secuencias Ò ÐÑ ÒØ ¸ Ø Ò ÑÓ× ÐÓ× Ð × Ó× Ó × ÖÚ ÓÖ × ½¿ Ó × ÖÚ ÓÖ × ÓÐ Ú ØÓÖ Þ ½¿ ≡ ´½¿ µ const size_t & size() const { return num_items; } bool is_empty() const { return num_items == 0; } const size_t & capacity() const { return dim; } Ä ÑÔÐ ÒØ ÓÒ FixedQueue<T> × ÑÙÝ × Ñ Ð Ö ArrayQueue<T>º Ä ÙÒ Ö Ò × Ö ÕÙ FixedQueue<T> ÒÓ Ú Ö ¬ × ÓÖ ×º 2.6.5 El TAD ListQueue<T> (cola con listas enlazadas) Ð Ì ListQueue<T> ÑÓ Ð Þ ÙÒ ÓÐ ÑÔÐ ÒØ Ñ ÒØ ÙÒ Ð ×Ø × ÑÔÐ ¹ Ñ ÒØ ÒÐ Þ Ö ÙÐ Öº ListQueue<T> ר ×Ô ¬ Ó ÑÔÐ ÒØ Ó Ò Ð Ö ÚÓ ØÔÐ Ð ×ØÉÙ Ù ºÀ ½¿ ½¿ ØÔÐ Ð ×ØÉÙ Ù ºÀ ½¿ ≡ template <typename T> class ListQueue { ÆÓ ListQueue<T> ½¿ ØÖ ÙØÓ× ListQueue<T> ½¿ Å ØÓ Ó× ÔÙ Ð Ó× ListQueue<T> ½¿ }; ¬Ò × ListQueue¸ Ù× Ò ÙÒ × ½¿ Ò ½ ¼ º Ä × ÓÔ Ö ÓÒ × ListQueue<T> × ×Ô ¬ Ò Ò ÙÒ ÓÒ ÒÓ Ó× × ÑÔÐ × Ø ÔÓ ListQueue<T>::Node ½¿ ÆÓ ListQueue<T> ½¿ ≡ ´½¿ µ typedef Snode<T> Node; typedef ListQueue Set_Type; typedef Node * Item_Type; Í× × ListQueue ½¿ Ò Snode ½ º Ä Ð ×Ø ר ÓÖ Ò Ó× × Ð Þ ×Ø Ð ÓÐ º ר ÑÓ Ó¸¸ Ñ ÒØ Ò Ò Ó ÙÒ ÔÙÒØ ÖÓ Ô Ö Ð ÓÐ ¸ ÔÓ ÑÓ× Ð Ñ Ò Ö Ò Ø ÑÔÓ ÓÒר ÒØ º Ä ¬ ÙÖ ¾º¾ ÑÙ ×ØÖ ÙÒ ×ÔÓ× ÓÒ ÓÐ ÑÔÐ ÒØ Ñ ÒØ Ð ÞÓ× × ÑÔÐ × Ø ÔÓ Snode<T>º Ä ÓÒ¬ ÙÖ ÓÒ Ð ¬ ÙÖ ¾º¾ × Ò Ö Ð ×ÓÐÓ Ù Ò Ó Ð Ð ×Ø ÒÓ ×Ø Ú º × Ò Ú Ø Ð ¸ Ô٠׸ Ø Ò Ö ÕÙ Ñ Ò Ö Ó× ×Ó× ÙÒÓ Ò Ö Ð Ý ÙÒÓ Ù Ò Ó Ð ÓÐ ×Ø Ú º ÓÖ ÔÓ ÑÓ× ÓÑ ÒÞ Ö ÒØÖÓ Ù Ö ÐÓ× ØÖ ÙØÓ× ListQueue<T> ½¿ ØÖ ÙØÓ× ListQueue<T> ½¿ ≡ ´½¿ µ ½¿ Node * rear_ptr; rear ptr × Ö Ð ÔÙÒØ ÖÓ Ð ÓÐ Ö ÙÐ Ö Ð Ñ ÒØÓ× Ø ÔÓ Snode<T>º Ð ÓØÖÓ ØÖ ÙØÓ × Ð ÒÙÑ ÖÓ Ð Ñ ÒØÓ× ÕÙ ÔÓ× Ð ÓÐ ½¿ ØÖ ÙØÓ× ListQueue<T> ½¿ +≡ ´½¿ µ ½¿ size_t num_nodes; ÄÓ× Ú ÐÓÖ × ÒØ Ö ÓÖ × Ö ÕÙ Ö Ò × Ö Ò Ó× ÔÓÖ Ð ÓÒרÖÙ ØÓÖ ½¿ Å ØÓ Ó× ÔÙ Ð Ó× ListQueue<T> ½¿ ≡ ´½¿ µ ½¿ ListQueue() : rear_ptr(NULL), num_nodes(0) { /* empty */ } Í× × ListQueue ½¿ º
  • 165.
    2.6. Colas 139 T:class ListQueue -rear_ptr: Node * -num_nodes: size_t +ListQueue() +put(node:Node *): void +get(): Node* +front(): Node* +rear(): Node* +size(): size_t +is_empty(): bool T:class DynListQueue -Node: ListQueue<T>::Node +put(data:const T&): T& +get(): T +front(): T& +rear(): T& +~DynListQueue(): virtual ÙÖ ¾º¾ Ö Ñ ÍÅÄ Ð × Ð × × Ú Ò ÙÐ × ListQueue<T> rear ptr ½ ¾ ¿ ÙÖ ¾º¾ ÓÐ ÑÔÐ ÒØ Ñ ÒØ Snode<T> Ì Ò ÑÓ× Ó× ÑÓ Ó× × Ö × ÙÒ ÓÐ ×Ø Ú × rear ptr == NULL Ó× num nodes == 0º Ä Ò× Ö ÓÒ ÔÓ× Ð × Ù ÒØ רÖÙ ØÙÖ ½¿ Å ØÓ Ó× ÔÙ Ð Ó× ListQueue<T> ½¿ +≡ ´½¿ µ ½¿ ½¿ void put(Node * node) { if (num_nodes > 0) rear_ptr->insert_next(node); num_nodes++; rear_ptr = node; } put() ÒÓ ×Ô Ö Ò Ò ÙÒ Ü Ô ÓÒ ÔÓÖÕÙ ÒÓ Ý Ñ Ò Ó Ñ ÑÓÖ º × ÑÔÓ× Ð ÕÙ put() Ö × × Ð ÒÓ Ó Ù ÓÖÖ Ø Ñ ÒØ Ô ÖØ Óº Ä Ð Ñ Ò ÓÒ × ÙÒ ÔÓ Ó Ñ × ÓÑÔÐ ÔÓÖÕÙ Ú Ö ¬ Ö × ÓÖ Ò Ø ÚÓ Ý ÕÙ Ð ÓÐ Ú Ò Ú ½¿ Å ØÓ Ó× ÔÙ Ð Ó× ListQueue<T> ½¿ +≡ ´½¿ µ ½¿ ½ ¼
  • 166.
    140 Cap´ ıtulo 2. Secuencias Node * get() Node * ret_val = rear_ptr->remove_next(); num_nodes--; if (num_nodes == 0) rear_ptr = NULL; return ret_val; } Ä ÓÒ×ÙÐØ × ¬Ò Ó× ÓÖÑ × ½¼ Å ØÓ Ó× ÔÙ Ð Ó× ListQueue<T> ½¿ +≡ ´½¿ µ ½¿ Node * front() const { return rear_ptr->get_next(); } Node * rear() const { return rear_ptr; } front() Ö ØÓÖÒ Ð ÒÓ Ó ÔÓÖ Ð Ö ÒØ Ý rear() Ð ÒÓ Ó ÔÓÖ Ð ÓÐ º 2.6.6 El TAD DynListQueue<T> (cola din´mica con listas enlazadas) a Ð Ì DynListQueue<T> ÑÓ Ð Þ ÙÒ ÓÐ ÑÔÐ ÒØ ØÖ Ú × ÙÒ Ð ×Ø × ÑÔÐ ¹ Ñ ÒØ ÒÐ Þ Ö ÙÐ Öº DynListQueue<T> ר ×Ô ¬ Ó ÑÔÐ ÒØ Ó Ò Ð Ö ÚÓ ØÔÐ ÝÒÄ ×ØÉÙ Ù ºÀ ½ ¼ º DynListQueue<T> Ö Ô ÖØ Ð ÒØ Ö Þ ÑÔÐ ÒØ ÓÒ ListQueue<T>º Ð ÙÒ Ó ÖÓÐ DynListQueue<T> × Ñ Ò Ö Ð Ñ ÑÓÖ Ý Ñ Ò ÔÙÐ Ö ØÓ× ÙÒ Ø ÔÓ Ò Ö Ó T Ò ÐÙ Ö ÒÓ Ó× ÙÒ Ð ×Ø ÒÐ Þ º ÈÙ ×ØÓ ÕÙ ×Ø ÔÖÓ ×Ó Ý ÐÓ ÑÓ× Ö Ð Þ Ó Ô Ö Ð × Ð ×Ø × Ý Ð × Ô Ð ×¸ ÓÐÓ Ö ÑÓ× Ò ×Ø × ÓÒ ØÓ Ð ÑÔÐ ÒØ ÓÒ Ö Ø DynListQueue<T> ½¼ ØÔÐ ÝÒÄ ×ØÉÙ Ù ºÀ ½ ¼ ≡ template <typename T> class DynListQueue : public ListQueue<T> { typedef typename ListQueue<T>::Node Node; T & put(const T & data) throw(std::exception, std::bad_alloc) { Node * ptr = new Node (data); ListQueue<T>::put(ptr); return ptr->get_data(); } T get() throw(std::exception, std::underflow_error) { Node * ptr = ListQueue<T>::get(); T ret_val = ptr->get_data(); delete ptr; return ret_val; } T & front() const throw(std::exception, std::underflow_error) {
  • 167.
    2.7. Estructuras dedatos combinadas - Multilistas 141 return ListQueue<T>::front()->get_data(); } T & rear() const throw(std::exception, std::underflow_error) { return ListQueue<T>::rear()->get_data(); } virtual ~DynListQueue() { while (not this->is_empty()) get(); } }; ¬Ò × DynListQueue¸ Ù× Ò ÙÒ × ½ ¸ ¾ ¸ ¿¼ ¸ ¾¸ ¿¸ ¿¾¸ ¿¿ ¸ ¸ Ò º Í× × ListQueue ½¿ º 2.7 Estructuras de datos combinadas - Multilistas ÓÒ× Ö ÑÓ× ÙÒ Ð ×Ø ×ØÙ ÒØ × ÙÒ ÙÖ×Ó ×ØÖÙ ØÙÖ ØÓ׺ ÄÓ× ÒÓÑ Ö ×¸ Ô ÐÐ Ó× Ý ÙÐ ÒØ ÔÙ Ò Ö ÔÖ × ÒØ Ö× Ñ ÒØ Ò× Ö Ø Ö ×º Ä × ÒÓØ × ÔÙ Ò Ö ÔÖ × ÒØ Ö× Ñ ÒØ ÒØ ÖÓ׺ ÌÓ ×Ø Ò ÓÖÑ ÓÒ Ð ×ØÖÙ ØÙÖ ÑÓ× Ò ÙÒ Ö ×ØÖÓ Ý Ù× ÑÓ× ÙÒ ÖÖ ÐÓ Ö ×ØÖÓ× Ô Ö Ö ÔÖ × ÒØ Ö Ð Ð ×Ø º ר Ñ Ò Ö ÓÖ Ò Þ Ö ÐÓ× ØÓ׸ ÕÙ ÔÓ× Ð Ñ ÒØ Ý ÒÓ× × Ò ØÙÖ Ð ¸ × ÙÒ ÑÔÐÓ ÓÑ Ò ÓÒ × ÒØÖ Ú Ö× × ×ØÖÙ ØÙÖ × ØÓ׺ Ë ÙÒ ÐÓ× Ö ÕÙ Ö Ñ ÒØÓ× Ð ÔÖÓ Ð Ñ ¸ ÙÒ × Ù Ò Ð Ñ ÒØÓ× ÔÙ Ö ÔÖ × ÒØ Ö× ÓÑÓ ÙÒ ÖÖ ÐÓ Ó ÓÑÓ ÙÒ Ð ×Ø º ÓÑÙÒÑ ÒØ ¸ ÙÒ Ñ ØÖ Þ × Ö ÔÖ × ÒØ ÓÑÓ ÙÒ ÖÖ ÐÓ ÖÖ ÐÓ׺ ÈÓ ÑÓ× Ö ÐÓ Ñ ×ÑÓ ÓÒ Ð ×Ø × × Ö¸ ÔÓ ÑÓ× Ø Ò Ö ÙÒ Ð ×Ø Ð ×Ø × Ó ÖÖ ÐÓ Ð ×Ø × Ó ÙÒ Ð ×Ø ÖÖ ÐÓ× Ä × Ö ×ÔÙ ×Ø × ×ÓÒ ¬ÖÑ Ø Ú ×º ÒÐÒ Ù ¸ ÙÒ Ñ ØÖ Þ × Ö ÔÖ × ÒØ Ñ ÒØ ÙÒ ÖÖ ÐÓ ¬Ð ׸ ÓÒ ¬Ð ׸ Ø Ñ Ò¸ ÙÒ ÖÖ ÐÓº × Ô٠׸ ÔÓ Ö ÑÓ× Ð Ö Ö ÐÓ × Ù ÒØ DynSlist<int> mat[5]; ÕÙ Ø Ò ÑÓ× ÙÒ ÖÖ ÐÓ Ð ×Ø × ÓÒ mat[i] Ö¬Ö ÙÒ Ð ×Ø ÒÐ Þ º Ì Ñ Ò ÔÓ Ö ÑÓ× Ð Ö Ö typedef int Arreglo[5]; DynSlist<Arreglo> mat; ÄÓ ÕÙ ÒÓ× ¬Ò ÙÒ Ð ×Ø ÒÐ Þ ÖÖ ÐÓ× Ñ Ò× ÓÒ 5º Á Ù ÐÑ ÒØ ¸ ÔÓ ÑÓ× Ð Ö Ö DynSlist< DynSlist<int> > mat; Ô Ö ¬Ò Ö ÙÒ Ð ×Ø Ð ×Ø ׺ ÄÓ× ÑÔÐÓ× ÒØ Ö ÓÖ × ÔÙ Ò ÑÓ Ð Þ Ö× Ô ÖØ Ö Ì ÓÒÓ Ó׺ × ÔÓ× Ð ÕÙ Ø Ò ÑÓ× ÕÙ Ö Ò Ú Ð Ý Ñ Ò Ö Ö Ø Ñ ÒØ Ð × Ð ×Ø ׺ ÓÑÓ ÑÔÐÓ¸ ÓÒ× Ö ÙÒ ÔÐ ÓÒ ÕÙ Ñ Ò ÔÙÐ Ñ ØÖ × ÑÙÝ ÐØ × Ð ¸ Ð ÓÖ Ò Ñ ÐÐÓÒ × ¬Ð × Ý
  • 168.
    142 Cap´ ıtulo 2. Secuencias ÓÐÙÑÒ ×º Ì Ð × ÔÐ ÓÒ × ×ÓÒ ÓÑÙÒ × Ò ÔÖÓ Ð Ñ × ÔÖÓ Ö Ñ ÓÒ Ð Ò Ð Ý ÒØ Ö Ð Ú Ö Ðº Ä × Ð ×Ø × Ñ ØÖ × ÓØ Ð Ñ ÑÓÖ Ù ÐÕÙ Ö ÓÑÔÙØ ÓÖº ר Ð ÖÓ ÕÙ ÒÓ Ø Ò ÑÓ× ×Ô Ó Ô Ö ÐÑ Ò Ö ÙÒ Ñ ØÖ Þ ÐÐÓÒ × Ð Ñ ÒØÓ× Ó Ð Ö ÔÖ × ÒØ ÓÒ Ð × º ÑÔ ÖÓ¸ ÙÒÕÙ Ð × Ñ ØÖ × ×ÓÒ ÒÓÖÑ ×¸ Ð Ñ ÝÓÖ Ð × Ú × ×Ø × ÔÓ× Ò ÑÙ × ÑÓ× Ð Ñ ÒØÓ× ÒÙÐÓ׺ ÈÓ ÑÓ׸ Ô٠׸ ÔÐ Ö Ð Ñ ×ÑÓ ÔÖ Ò Ô Ó ÕÙ Ò ÐÓ× ÔÓÐ ÒÓÑ Ó× ×ÓÐÓ Ù Ö ÑÓ× ÐÓ× Ð Ñ ÒØÓ× Ö ÒØ × ÖÓº Ó ×Ø Ð Ò Ñ ÒØÓ¸ Ñ Ò ÑÓ× Ð × Ù ÒØ Ø ÔÓ ×Ô Ð ÒÓ Ó i j ØÓ ÈÙÒØ ÖÓ Ð ÔÖÓÜ Ñ ÓÐÙÑÒ ÈÙÒØ ÖÓ Ð ÔÖÓÜ Ñ ¬Ð ÕÙ ÒÓ× Ö ÔÖ × ÒØ ÙÒ ÒØÖ ÙÒ Ñ ØÖ Þ mat[i, j] ÓÒ ÐÓ× × Ù ÒØ × ØÖ ÙØÓ× ¯ ÁÒ ¬Ð × Ö Ð Ú ÐÓÖ iº ¯ ÁÒ ÓÐÙÑÒ × Ö Ð Ú ÐÓÖ jºº ¯ Î ÐÓÖ Ð ØÓ Ö ÒØ ÖÓ ÓÒØ Ò Ó Ò mat[i, j]º ¯ ÈÙÒØ ÖÓ Ð × Ù ÒØ mat[i + x, j] ÓÒ Ú ÐÓÖ Ö ÒØ ÖÓº ¯ ÈÙÒØ ÖÓ Ð × Ù ÒØ mat[i, j + y] ÓÒ Ú ÐÓÖ Ö ÒØ ÖÓº ר Ñ Ò Ö ¸ Ð Ñ ØÖ Þ ⎛ ⎞ 1 −5 0 0 10 ⎜0 0 1 −2 0 ⎟ ⎜ ⎟ ⎜ ⎟ ⎜0 0 0 1 0⎟ , ⎜ ⎟ ⎝0 0 0 0 0⎠ 0 0 0 1 0 ÔÙ Ö ÔÖ × ÒØ Ö× ÓÑÓ Ò Ð ¬ ÙÖ ¾º¾ º ÓÑÓ Ú ÑÓ× Ò Ð ¬ ÙÖ ¾º¾ ¸ Ø Ò ÑÓ× 5 Ð ×Ø × ¬Ð × Ý 5 Ð ×Ø × ÓÐÙÑÒ ×º Ð ×Ø ÔÓ× ÙÒ ÒÓ Ó Ö ¸ Р٠и Ô Ö Ñ ÓÖ Ö Ð Ö Ô Þ ×Ó¸ ÓÒÚ Ò ÓÐÓ Ö Ò ÙÒ ÖÖ ÐÓº × Ô٠׸ Ø Ò Ö ÑÓ× ÙÒ ÖÖ ÐÓ 5 Ö × Ô Ö Ð × ¬Ð × Ý ÓØÖÓ 5 Ö × Ô Ö Ð × ÓÐÙÑÒ ×º Ó ÙÒ ÒÓ Ó Ù ÐÕÙ Ö ¸ Ð Ð Ñ ÒØÓ Ð Ö Ò Ð ÔÖÓÜ Ñ ÒØÖ ÒÐ Ñ ×Ñ ¬Ð ÓÒ ÙÒ Ú ÐÓÖ Ö ÒØ 0 Ð ÓÐÙÑÒ × Ú Ö Ù ÔÓÖ Ð Ò Ð ÓÐÙÑÒ º Ð Ñ ×ÑÓ ÑÓ Ó¸ Ð Ð Ñ ÒØÓ Ó Ò Ð ÔÖÓÜ Ñ ÒØÖ Ò Ð Ñ ×Ñ ÓÐÙÑÒ ÓÒ ÙÒ Ú ÐÓÖ Ö ÒØ ÖÓ Ð ¬Ð × Ú Ö Ù ÔÓÖ Ð Ò Ð ¬Ð º Ä Ö ÔÖ × ÒØ ÓÒ Ð ¬ ÙÖ ¾º¾ Ö ÓÑÔ Ò× ÓÒ Ö × × Ð ÒÙÑ ÖÓ ÒØÖ × ÒÙÐ × × ÑÙÝ Ö Ò º ÈÓÖ ÑÔÐÓ¸ ÙÒ Ñ ØÖ Þ 104x104 Ó ÙÔ Ö 400 × 106 ÝØ × Ò ÙÒ ÖÕÙ Ø ØÙÖ 32 Ø×º Ë ÙÒ 4± ÐÓ× Ð Ñ ÒØÓ× ×ÓÒ Ö ÒØ × ÖÓ¸ ÕÙ Ö ÔÖ × ÒØ Ò 4 Ñ ÐÐÓÒ × Ð Ñ ÒØÓ׸ Ð Ö ÔÖ × ÒØ ÓÒ ÓÒ ÑÙÐØ Ð ×Ø × Ó ÙÔ Ö (4 + 4 + 4 + 4 + 4) × 0, 04 × 100×6 = 80 × 106 ÝØ ׺ Ä ×ÙÑ ¸ Ö ×Ø Ý Ú × ÓÒ Ñ ØÖ × ×ÓÒ Ð × ÔÖÓ Ö Ñ Ö ÓÒ Ñ ØÖ × × × Ò Ð ×ØÖÙ ØÙÖ Ð ¬ ÙÖ ¾º¾ º È Ö ÓØÖ × ÓÔ Ö ÓÒ × ÔÙ × Ö Ñ × ÓÒÚ Ò ÒØ Ø Ò Ö Ð ÞÓ× Ð ¬Ð Ý Ð ÓÐÙÑÒ ÔÖ ×ÓÖ ×º Ð Ð ÓÖ ØÑÓ Ò Ó Ô Ö ÑÙÐØ ÔÐ Ö Ñ ØÖ × n × n × Ù Óº ×ØÓ × Ò ¬ ÕÙ ×Ù Ø ÑÔÓ Ù ÓÒ × ÔÖÓÔÓÖ ÓÒ Ð n3º ÓÒ Ñ ÐÐÓÒ × ÓÐÙÑÒ × Ý ¬Ð ׸ ÒÓ Ý ÑÙ ×
  • 169.
    2.8. Notas bibliogr´ficas a 143 0 1 2 3 4 0 0 0 1 0 1 −5 0 4 10 1 1 2 1 1 3 −2 2 2 3 1 3 4 4 3 1 ÙÖ ¾º¾ ÍÒ Ñ ØÖ Þ ×Ô Ö Ö ÔÖ × ÒØ Ñ ÒØ ÑÙÐØ Ð ×Ø × ×Ô Ö ÒÞ × Ó Ø Ò Ö ÙÒ Ù Ò × ÑÔ ÒÓ × × Ó ÑÓ× Ð Ö ÔÖ × ÒØ ÓÒ × Ù Ò Ðº ËÓ Ö Ñ ØÖ × ×Ô Ö × Ö ÔÖ × ÒØ × ÓÒ ÑÙÐØ Ð ×Ø × Ð Ø ÑÔÓ × ÑÙ Ó Ñ ÒÓÖ¸ ÔÙ × Ð × ÒØÖ × Ð × Ñ ØÖ × ×ÓÒ Ú × Ø × Ò Ð Ñ ×ÑÓ ÓÖ Ò Ð × Ð ×Ø × Ý ÒÓ Ý Ò × Ò× ÖØ Ö ÖÓ× Ò Ð Ñ ØÖ Þ Ö ×ÙÐØ Óº Ò ¬Ò Ø Ú ¸ Ð ÙÖ ÓÒ Ô Ò Ð ÒØ Ð Ñ ÒØÓ× Ö ÒØ × ÖÓº 2.8 Notas bibliogr´ficas a ÄÓ× ÓÖ Ò × Ð × ×ØÖÙ ØÙÖ × × × × Ö ÑÓÒØ Ò Ñ Ó× ÐÓ× ÒÓ× ¿¼ Ð × ÐÓ ÙÖ ÒØ ÐÓ× × ÖÖÓÐÐÓ× ÔÖÓ Ö Ñ × Ô Ö ÐÓ× ÔÖ Ñ ÖÓ× ÓÑÔÙØ ÓÖ ×º ר ÔÓ × ØÒ Ö Ò ×Ø Ö ØÓÖ¸ ÕÙ ×Ø ÒÓ × × ÒØ ÙØÓÖ Þ Ó Ô Ö Ó Ö Ö ÙÒ × ÙÖ×Ó ×ØÓÖ Ó ×Ó Ö Ð ÓÖ Ò Ð × ×ØÖÙ ØÙÖ × ØÓ× ÕÙ Ö ÔÖ × ÒØ Ò × Ù Ò × Ò Ð ÙÒ × Ð ×Ø Ò × Ù×ÕÙ ØÖ Ø × Ò ×Ø Ô ØÙÐÓº È Ö ÙÒ ÖÑÓ×Ó Ô ÒÓÖ Ñ ×Ø Ô × ÓÒ ÒØ רÓÖ ¸ × Ö ØÓ ÔÓÖ ÙÒÓ ×Ù× ÔÖÓØ ÓÒ ×Ø ׸ Ö Ø Ö ÑÓ× Ö ÓÑ Ò Ö Ð × ÓÒ ×ØÓÖ ÓÒØ Ò Ò Ð ÔÖ Ñ Ö ÚÓÐÙÑ Ò ÃÒÙØ ´Ô Ò × ¹ µº ÈÓÖ ×Ù Ö Ø Ö × Ù Ò Ð ÒÒ ØÓ ¸ Ð ÒÓ ÓÒ ÖÖ ÐÓ Ù Ñ Ò × ÐÓ× ÔÖ Ñ ÖÓ× ÔÖÓ Ö Ñ × ÓÑÔÙØ ÓÖº Ò Ò ÙÖ ¸ Ð ÖÖ ÐÓ Ø Ò ×Ù ÕÙ Ú Ð ÒØ Ú ¹ ØÓÖ Ò Ñ Ø Ñ Ø º ÈÓÖ ÐÓ ÒØ Ö ÓÖ¸ × Ö ÑÙÝ Ú ÒØÙÖ Ó Ù Ö Ð ÙÒ ÙØÓÖ Ü ÐÙ¹ × Ú º ÑÔ ÖÓ¸ × Ò Ð Ö Ð ÓÖØÖ Ò ¾ ÓÑÓ Ð ÔÖ Ñ Ö Ð Ò Ù ÔÖÓ Ö Ñ ÓÒ Ý Ð ÔÖ Ñ ÖÓ Ò ×ÓÔÓÖØ Ö ÖÖ ÐÓ× ØÖ Ú × Ð ÔÖÓÔ Ó Ð Ò Ù º Ð Ò ÓÕÙ × ÒÓ Ð Ö ÖÕÙ Ð × × Dlink ר ÔÖ Ñ Ò Ñ ÒØ Ò×Ô Ö Ó Ò ÙØ Ð Ø Ö Ó× × Ò Ó× Ô Ö Ð Ñ ÖÓ¹ÒÙ Ð Ó Chorus ½ ¸ × ×Ø Ñ ×Ó Ö Ð Ù Ð ×Ø Ö ¹ ØÓÖ Ö Ð ÞÓ ×Ù× ×ØÙ Ó× Ó ØÓÖ Ð ×º Ð ÙÒ × Ð ÓØ × ÔÖÓ Ö Ñ ÓÒ Ù× Ò Ò ÓÕÙ ×
  • 170.
    144 Cap´ ıtulo 2. Secuencias × Ñ Ð Ö ×¸ ÒØÖ Ð × Ù Ð × ×Ø Ö net.datastructures Ö ÔÓÖØ Ò º Ò Ð Ñ ×ÑÓ × ÒØ Ó ÐÓ ÖÖ ÐÓ׸ Ð × Ð ×Ø × ÒÐ Þ × Ù ÖÓÒ × Ù ÖØ × Ò ¹ Ô Ò ÒØ Ý × Ô Ö Ñ ÒØ Ò ÐÓ× ÔÖ Ñ Ò Ó× Ý Ý Ö ÒÓ× ÓÒØ ÜØÓ× ÓÑÔÙØ ÓÒ Ð ×º Ë Ò Ñ Ö Ó¸ × Ò Ð Ö Ð ÁÈÄ ´ÁÒ ÓÖÑ Ø ÓÒ ÈÖÓ ×× Ò Ä Ò Ù µ ½¿ ¸ ÓÑÓ Ð ÔÖ Ñ Ö Ð Ò Ù ÕÙ Ò ÓÖÔÓÖÓ Ð × Ð ×Ø × ÙÒ Ð Ò Ù ÔÖÓ Ö Ñ ÓÒº Ä Ð × Ô ØÓÖ Þ ÓÒ ÓÒ× ×Ø ÒØ Ö Ø Ò ÙÐÓ× Ô Ö Ö ÔÖ × ÒØ Ö ÐÓÕÙ × Ñ ÑÓÖ Ý ­ × Ô Ö ÐÓ× ÔÙÒ¹ Ø ÖÓ× Ô Ö Ò ÙÒ ÖØ ÙÐÓ Æ Û ÐÐ Ý Ë Û ×Ó Ö ÔÖÓ Ö Ñ ÓÒ ÓÒ ÁÈÄ ½¾ º ÄÓ× ÖÖ ÐÓ׸ Ð ×Ø ׸ Ô Ð × Ý ÓÐ × Ý ×ÓÒ Ô ÖØ ÐÓ× Ð Ò Ù × ÑÙÝ ÐØÓ Ò Ú Ð ÑÓ ¹ ÖÒÓ× ÒØÖ ÐÓ× ÕÙ × Ò Ð Ö Perl ½ Ý Python ½ º רÓ× Ð Ò Ù × × Ö ÙÒ× Ö Ò Ò ÐÓ× Ð Ò Ù × ÐÐ Ñ Ó× × Ö ÔØ Ò ¸ Ø ÖÑ ÒÓ Ñ ÙÖ Ó ÔÓÖ ÂÓ Ò Ãº ÇÙר Ö ÓÙØ ½ Ò ÙÒ Ð Ö Ý Ú × ÓÒ Ö Ó ÖØ ÙÐÓ Ñ Ò ÓÒ Ó Ò Ð × ÓÒ Ð Ó Ö ¬ ר Ô ØÙÐÓº Ä Ù×ÕÙ Ò Ö × ÙÒ ÔÖ Ò Ô Ó Ù×ÕÙ Ñ Ð Ò Ö Ó¸ Р٠и × ÙÒ ÃÒÙØ ¸ × Ö ÑÓÒØ ר Ð Ñ ×Ñ Å ×ÓÔÓØ Ñ ¸ ÔÖ ÙÖ×ÓÖ Ð Ú Ð Þ ÓÒ Ý ÓÝ Ò Ñ × Ö¹ Ð Ñ ÒØ Ò ÕÙ Ð Ò ÒÓÑ Ö Ð ÔÖÓÔ Ú Ð Þ ÓÒº ÓÒ×ÙÐØ × Ð ØÖ Ó ×ØÓÖ Ó Ó Ö Å ÒÒ Ò Ê Ö Ï Ð Ò Ö ×Ó Ö ÐÓ× ÓÖ Ò × Ð Ù×ÕÙ ÒÖ º Ô ÖØ ×Ù× Ò ÓØ × ×ØÓÖ × × ÙÒ Ð × Ñ × ×ÓÐ × Ö Ö Ò × ÓÖÑ Ð × Ò Ð ÑÔÓ Ð ÓÖ ØÑÓ× Ý ×ØÖÙ ØÙÖ × ØÓ׺ Ä × ×ØÖÙ ØÙÖ × Ð Ò Ð × ×ÓÒ ØÖ Ø × Ñ Ò Ö ÑÙÝ ÓÖÑ Ð Ý ÓÒ ÔÐ ÓÒ × Ö Ð ×º Ä ÔÖ Ñ Ö ÓÒ Ù Ö Ø Ò ÙÒ ÔÓ Ò ÕÙ Ð ÔÓ Ö ÓÑÔÙØ ÓÒ Ð ÙÒ Ñ ÕÙ Ò ÙÒ Ö ÑÙÝ Ó Ý Ð Ð Ò Ù Ò× Ñ Ð ÓÖ Ö Ð ÙÒ ÐØ ÖÒ Ø Ú × Ö Ô Ö ÔÖÓ Ö Ñ Ö ÔÐ ÓÒ × ÐØÓ × ÑÔ ÒÓº ÈÓÖ ×Ø Ö ÞÓÒ¸ Ð Ø ÜØÓ ÃÒÙØ ÓÒØ Ò ÙÒ ÑÔÐ Ñ ØÖÙ Ó× ÙØ Ð Þ Ö ÓÒ ×ØÖÙ ØÙÖ × Ð Ò Ð ×º Ð Ð × Ó Ý ÒØ ÙÓ Ø ÜØÓ Ï ÖØ ¾½ ¸ Ù × Ö ØÓ ÙÖ ÒØ ÐÓ× ÒÓ× ¼ Ð × ÐÓ º Ô × Ö ×Ù ¸ ÓÝ Ò ×Ø Ø ÜØÓ ÓÒØ ÒÙ ×Ø ÒØ Ú ÒØ Ý ÔÖ × ÒØ ÙÒ ÜÔÓ× ÓÒ Ð × ×ØÖÙ ØÙÖ × Ð Ò Ð × ×ÙÔ Ö ÓÖ Ð ÒÓÖÑ º Ñ ×¸ Ï ÖØ ÓÒ× Ö ÙÒ Ü Ð ÒØ Ý ÓÑÔÐ ØÓ Ô ØÙÐÓ Ð Ö ÙÖ× ÓÒº Ð Ð ÖÓ Ë Û ½ ¸ ר Ö ÔÐ ØÓ Ð ÓÖ ØÑÓ× ÓÒ ×ØÖÙ ØÙÖ × Ð Ò Ð × ÔÓÖ ÑÔÐÓ¸ Ð ÓÖ ØÑÓ× ÓÖ Ò Ñ ÒØÓ Ð ×Ø ׺ Ò Ú Ð ÔÖ Ø Ó¸ ר ׸ Ò ÒÙ ×ØÖ ÓÔ Ò ÓÒ¸ Ð Ñ ÓÖ Ö Ö Ò º Ñ Ò ÓÒ Ö¸ ÑÔ ÖÓ¸ ÕÙ ÐÓ× Ð ÓÖ ØÑÓ× ÕÙ Ù× Ò ×ØÖÙ ØÙÖ × Ð Ò Ð × ×Ø Ò ×ØÖ Ù Ó× ÐÓ Ð Ö Ó Ð Ø ÜØÓ Ò Ô ØÙÐÓ× ÕÙ ÒÓ Ò × Ö Ñ ÒØ ØÖ Ø Ò ×ØÖÙ ØÙÖ × Ð Ò Ð ×º Ä Û×Ý Ò Ò Ö ÔÖ × ÒØ Ò Ð ÙÒÓ× ØÖÙ Ó× ÒØ Ö × ÒØ × ÓÒ Ð ×Ø × ÒÐ Þ ×º Ä Ø Ò Ð × ÒØ ÖÑ Ö ¸ ÙØ Ð Þ ÔÓÖ BitArray Ý DynArray<T> Ô Ö ×Ø Ò¹ Ù Ö ÐÓ× ×Ó× Ð ØÙÖ ÐÓ× × Ö ØÙÖ Ð Ò Ð Þ ÒØ Ò× Ú Ñ ÒØ Ë ÓØØ Å Ý Ö ½¼ º Ð ÔÖÓ Ð Ñ ÂÓ× × Ò Ð Ø Ñ ÒØ ØÖ Ø Ó ÔÓÖ Ö Ñ¸ ÃÒÙØ Ý È Ø × Ò º Ä Ö ØÑ Ø ÔÓÐ ÒÓÑ Ó× ÜÔÐ Ò Ü ¾º º½½ × ÑÔÐ Ñ ÒØ × ÖÖÓÐÐ ÔÓÖ Ó¸ ÀÓÔ ÖÓ Ø Ý ÍÐÐÑ Ò ½ º ÍÒ ÐØ ÖÒ Ø Ú ÔÙ Ò ÓÒØÖ Ö× Ò Ð Ø ÜØÓ Ò ÐÓÔ Ó ÓÖÑ Ò¸ Ä × Ö×ÓÒ Ý Ê Ú ×Ø º Ð Ð ÓÖ ØÑÓ Ú ÐÙ ÓÒ ÜÔÖ × ÓÒ × Ò¬ × × ÖÖÓÐÐ Ó Ò Ü ¾º º Ù ØÓÑ Ó ÙÒ Ø ÜØÓ ×Ó Ö ÔÖÓ Ö Ñ ÓÒ × ×Ø Ñ × È Ø Ö Ð Ò ÖØ ¿ º ר Ð ÖÓ ×Ø Ø Ò Ñ ×ØÖ Ð Ý ÓÒ × Ñ ÒØ × Ö ØÓ ÕÙ ÐÓ Ö ÓÑ Ò ÑÓ× ÓÒ Ö × Ô Ö ÙÒ ÒØÖÓ Ù ÓÒ Ð ÑÔÓ Ð ÔÖÓ Ö Ñ ÓÒ × ×Ø Ñ ×¸ ÓÑÔ Ð ÓÖ ×¸ Ò× Ñ Ð ÓÖ × Ý Ö ÓÖ ×º
  • 171.
    2.9. Ejercicios 145 2.9 Ejercicios ½º ÈÓÖ ÕÙ Ð Ù×ÕÙ Ò Ö ÒÓ ÙØ Ð Þ Ö× Ô Ö Ð Ñ ÒØÓ× ÓÖ Ò Ó× Ò ÙÒ Ö ÚÓ ÐÑ Ò Ó Ò Ñ ÑÓÖ × ÙÒ Ö ¾º ÁÑÔÐ ÒØ ÒØ Ö Ñ ÒØ Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð ×ØÖÙ ØÙÖ ØÓ× ×ØÙ Ó Ò Ü ½º¿ Ñ ÒØ ÖÖ ÐÓ× ×ÓÖ Ò Ó׺ ¿º ÁÑÔÐ ÒØ ÒØ Ö Ñ ÒØ Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð ×ØÖÙ ØÙÖ ØÓ× ×ØÙ Ó Ò Ü ½º¿ Ñ ÒØ ÖÖ ÐÓ× ÓÖ Ò Ó׺ º ÜÔÐ ÕÙ ÓÑÓ × Ð Ñ Ò ×ÑÓ ×Ó Ö ØÓ ÐÓ× Ð Ñ ÒØÓ× ÙÒ Ñ ØÖ Þº º Ò Ò Ö Ð¸ ÜÔÐ ÕÙ ÓÑÓ × Ð Ñ Ò ×ÑÓ ×Ó Ö ØÓ ÐÓ× Ð Ñ ÒØÓ× ÙÒ ÖÖ ÐÓ n¹ Ñ Ò× ÓÒ Ðº º × Ò ÑÔÐ ÒØ ÙÒ Ì ÕÙ ÑÓ Ð ÖÖ ÐÓ× n Ñ Ò× ÓÒ Ð ×º º × Ö ÙÒ ÑÔÐ ÒØ ÓÒ ÐÓ Ñ × ¬ ÒØ ÔÓ× Ð Ð ÖÙØ Ò DynArray<T>copy() × ÙÒ Ð × Ò ÓÒ × × Ò Ü ¾º½º º¿ ´Ô Ò ¾µº º × Ö ÙÒ Ð ÓÖ ØÑÓ ¬ ÒØ ÕÙ ØÙ Ð Ò× Ö ÓÒ ÓÖ Ò Ò ÙÒ DynArray<T>º º × Ö ÙÒ Ð ÓÖ ØÑÓ ¬ ÒØ ÕÙ ØÙ Ð Ð Ñ Ò ÓÒ ÓÖ Ò Ò ÙÒ DynArray<T>º ½¼º ËÙÔÓÒ ÙÒ ÔÖÓ ×Ó ÓÒ ÙÒ Ñ ÑÓÖ ØÓØ Ð ×ÔÓÒ Ð M ÝØ × Ý ÙÒ Ñ Ü ÑÓ Ô ÖÑ Ø Ó ÔÓÖ ÙÒ ÐÐ Ñ new S ÝØ ׺ ÓÒ× Ö ÙÒ ÖÖ ÐÓ Ò Ñ Ó Ð Ñ ÒØÓ× Ø Ñ ÒÓ T º Ë Ð ÓÒ ÐÓ× Ø Ñ ÒÓ× Ö ØÓÖ Ó¸ × Ñ ÒØÓ Ý ÐÓÕÙ ÕÙ Ñ Ü Ñ Ò Ð Ñ Ò× ÓÒ ÙÒ DynArray<T>º ½½º × Ö Ð ×Ó Ö Ö Ð Ñ ØÓ Ó DynArray<T>::cut(l, r)¸ Ð Ù Ð Ð Ö ØÓ Ð Ñ ÑÓÖ ÒØÖ [0..l - 1] Ý r+1..dim ´dimµ × Ð Ñ Ò× ÓÒ ØÙ Ð Ð ÖÖ ÐÓº ½¾º Ä Ð ÓØ ALEPH ÑÔÐ ÒØ ÙÒ ÔÖÓØÓØ ÔÓ Ð Ì Ð Ð ÓØ stdc++ ÐÐ ¹ Ñ Ó vector<T>¸ Ð Ù Ð ÜÔÓÖØ ÙÒ ÖÖ ÐÓ Ò Ñ Óº Ð Ø ÔÓ Ò Ù ×Ø ÓÒ × Ò¹ Ù ÒØÖ Ò Ð Ö ÚÓ Vector.Hº ´ µ Ê Ú × Ñ ÒÙ Ó× Ñ ÒØ Ð ÑÔÐ ÒØ ÓÒ Ò Vector.Hº ÈÖÙ Ð ¸ Ù×ÕÙ ÖÖÓÖ ×¸ Ú ÒØÙ ÐÑ ÒØ ÔÙÖ Ð Ý Ú ÒØÙ ÐÑ ÒØ Ñ ÓÖ ×Ù ¬ Ò º ´ µ ÓÑÔ Ö Ö Ø Ñ ÒØ Vector.H ÓÒ ÓØÖ × ÑÔÐ ÒØ ÓÒ × stdc++º ½¿º × Ö ÙÒ Ð ÓÖ ØÑÓ ¬ ÒØ ÕÙ ÒÚ ÖØ ÙÒ ÖÖ ÐÓº ÈÓÖ ÑÔÐÓ¸ Ð ÒÚ ÖØ Ö ABCDEFG × ÖÖÓ Ö GFEDCBAº ½ º × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ð Ñ Ò ÐÓ× Ð Ñ ÒØÓ× ÙÔÐ Ó× ÙÒ ÖÖ ÐÓ ÓÖ Ò Óº ½ º × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ð Ñ Ò ÐÓ× Ð Ñ ÒØÓ× ÙÔÐ Ó× ÙÒ ÖÖ ÐÓ ×ÓÖ ¹ Ò Óº ½º Ó ÙÒ ÖÖ ÐÓ ×ÓÖ Ò Ó n − 1 Ð Ñ ÒØÓ× ÒØ ÖÓ× ÓÑÔÖ Ò Ó× ÒØÖ 1 Ý n¸ × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÒÓ ÓÒØ Ò ÐÓ× Ò Ó׸ Ó × ÙÒ ×ÓÐ Ô × ¸ ÕÙ Ø ÖÑ Ò Ð Ð Ñ ÒØÓ ÐØ ÒØ º ´·µ
  • 172.
    146 Cap´ ıtulo 2. Secuencias ½ º ÓÒ× Ö Ð ÓÔ Ö ÓÒ ÖÓØ ÓÒ ÙÒ ÖÖ ÐÓº ÈÓÖ ÑÔÐÓ¸ ÖÓØ Ö 3 Ú × Ð ÞÕÙ Ö Ð ÖÖ ÐÓ ABCDEFGHI ÖÖÓ ÓÑÓ Ö ×ÙÐØ Ó DEFGHIABCº × Ò ÙÒ Ð ÓÖ ØÑÓ Ò Ö Ð¸ ÕÙ ÒÓ ÓÒØ Ò ÐÓ× Ò Ó× ´×ÓÐÓ ÐÓ× ÙÒ ×ÓÐ Ô × µ¸ ÕÙ ÖÓØ m Ú × ÙÒ ÖÖ ÐÓ Ñ Ò× ÓÒ nº ´··µ ½ º ËÙÔÓÒ ÙÒ × Ù Ò S =< s1, s2, . . . sn >º Ä ÓÔ Ö ÓÒ void rotar derecha(S, n) ÖÓØ S n ÔÓ× ÓÒ × Ð Ö º ÈÓÖ ÑÔÐÓ¸ rotar derecha(< 1, 2, 3, 4, 5, 6, 7 >, 3) =< 5, 6, 7, 1, 2, 3, 4 > ×ÙÑ Ò Ó × Ù Ò × ÑÔÐ ÒØ × ÓÒ Ð ×Ø × Ö ÙÐ Ö × Ó Ð Ñ ÒØ ÒÐ Þ × ÕÙ ÙØ Ð Þ Ò ÒÓ Ó Ö ¸ × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÑÔÐ ÒØ rotar derecha(S, n) Ò Ø ÑÔÓ ÔÖÓÔÓÖ ÓÒ Ð Ð Ø Ñ ÒÓ Ð ÖÖ ÐÓ Ý × Ò Ù× Ö ×Ô Ó ÕÙ Ö Þ Ò ÙÒ ÓÒ Ð ÖÖ ÐÓº Ò ÓØÖ × Ô Ð Ö ×¸ ÒÓ Ù× Ö Ð ×Ø × Ó ÖÖ ÐÓ׺ ½º ÙÒ Ò Ö Ø Ö × ÕÙ ÓÒØ Ò Ô Ð Ö ×¸ ×ÙÔÓÒ ÙÒ ÓÔ Ö ÓÒ Ùר ¬ ÓÒ Ð Ò Ö Ø Ö × ÙÒ Ñ Ü ÑÓ nº ÈÓÖ Ùר ¬ Ö¸ × ÒØ Ò ÕÙ × ÓÐÓÕÙ Ò ØÓ × Ð × Ô Ð Ö × ÔÓ× Ð × Ò Ü Ø Ñ ÒØ n Ö Ø Ö × ÒØ Ö Ð Ò Ó ÔÖÓÔÓÖ ÓÒ ÐÑ ÒØ Ð Ò Ó׺ ÈÓÖ ÑÔÐÓ¸ Ð Ò Esta es una prueba de justificaci´n o Ø Ò ÙÒ ÐÓÒ ØÙ ¿¾ Ö Ø Ö ×º Ë Ùר ¬ ¿¼ Ö Ø Ö ×¸ ÒØÓÒ × Ð Ö ×ÙÐØ Ó × Esta es una prueba de × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ùר ¬ÕÙ ÙÒ Ò Ö Ø Ö × ÙÒ Ñ Ü ÑÓ n Ñ ÒÓÖ ÕÙ Ð ÐÓÒ ØÙ Ð Ò º Ð Ð ÓÖ ØÑÓ Ø Ò Ö Ó× × Ð × Ð Ò Ùר ¬¹ ÝÐ Ò ÜØÖ ÔÓÖ Ð Ö º ¾¼º ÓÒ× Ö n Ð Ñ ÒØÓ× ÒØ ÖÓ׸ ÐÑ Ò Ó× Ò ÙÒ ÖÖ ÐÓ¸ ÓÑÔÖ Ò Ó× ÒØÖ 0 Ý m, m nº ´ µ Í× Ð Ø ÔÓ BitArray Ô Ö × Ò Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ø ÖÑ Ò Ð ÙÒ Ð Ñ ÒØÓ ÐØ ÒØ º ´ µ ËÙÔÓÒ ÕÙ m × ×Ù¬ ÒØ Ñ ÒØ Ô ÕÙ ÒÓ Ô Ö ÕÙ ØÓ Ó× ÐÓ× ÒÙÑ ÖÓ× ÕÙ Ô Ò Ò Ñ ÑÓÖ º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÓÒרÖÙÝ ÙÒ ÖÖ ÐÓ ÕÙ ÓÒØ Ò ÐÓ× Ð Ñ ÒØÓ× ÐØ ÒØ ׺ ´ µ ËÙÔÓÒ ÕÙ n × ÑÙÝ Ö Ò ¸ Ô ÖÓ ÕÙ Ð ÖÖ ÐÓ ÙÒ Ò Ñ ÑÓÖ º ËÙÔÓÒ ÓÒ ÓÒ × ÑÙÝ Ö ×ØÖ Ø Ú × Ñ ÑÓÖ ÒÓ × ÔÓ× Ð Ù× Ö ÙÒ ÖÖ ÐÓ Ø×¸ Ò Ò Ò Ö Ð Ù ÐÕÙ Ö ÓØÖ ×ØÖÙ ØÙÖ ØÓº ÑÔ ÖÓ¸ × × ÔÓ× Ð ÙØ Ð Þ Ö Ö ÚÓ× Ò ÑÓ Ó ÔÔ Ò × Ö¸ ×ÓÐÓ × ÔÙ Ò× ÖØ Ö Ð ¬Ò Ð Ð Ö ÚÓº º Í× Ð ÔÖ Ò Ô Ó Ù×ÕÙ Ò Ö Ô Ö × Ò Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ø Ö¹ Ñ Ò Ð ÙÒ Ð Ñ ÒØÓ ÐØ ÒØ º ´···µ º Í× Ð ÔÖ Ò Ô Ó Ù×ÕÙ Ò Ö Ô Ö × Ò Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÓÒ×¹ ØÖÙÝ ÙÒ Ö ÚÓ ÓÒ ÐÓ× ÒÙÑ ÖÓ× ÐØ ÒØ ׺ ´· ¹ÐÙ Ó Ö ×ÓÐÚ Ö ÒØ Ö ÓÖ¹µ
  • 173.
    2.9. Ejercicios 147 ¾½º ÓÒ× Ö Ð × Ð ÓÒ Ð ØÓÖ ÙÒ Ð Ñ ÒØÓ ÓÒØ Ò Ó Ò ÙÒ ÖÖ ÐÓ n й Ñ ÒØÓ× ÒØ ÖÓ׺ ´ µ × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ × Ó Ð ØÓÖ Ñ ÒØ ÙÒ Ð Ñ ÒØÓ Ð ÖÖ ÐÓº ´ µ ËÙÔÓÒ ÓÖ ÕÙ ÒÓ × ÓÒÓ n Ý ÕÙ Ð ¬Ò Ð Ð ÖÖ ÐÓ ÓÖÖ ×ÔÓÒ ÙÒ Ð Ñ ÒØÓ ÒØ Ò Ð ÓÒ Ú ÐÓÖ Ò Ö Ó FINº × Ò ÙÒ Ð ÓÖ ØÑÓ ¬ ÒØ ÕÙ × Ð ÓÒ Ð ØÓÖ Ñ ÒØ ÙÒ Ð Ñ ÒØÓ Ð ÖÖ ÐÓº ´ µ ÓÖ ×ÙÑ ÕÙ ÐÓ× ÒØ ÖÓ× ×Ø Ò ÐÑ Ò Ó× Ò ÙÒ Ð ×Ø × ÑÔÐ Ñ ÒØ Ò¹ Ð Þ º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ØÙ ÙÒ ×ÓÐ Ô × Ý × Ð ÓÒ Ð ØÓÖ ¹ Ñ ÒØ ÙÒ Ð Ñ ÒØÓ Ð Ð ×Ø º ´··µ ¾¾º ÓÒ× Ö Ð × Ù ÒØ ÔÖÓØÓØ ÔÓ ÙÒ ÓÒ template <typename T> int select(T a[], const size_t & n, const int & i); Ð Ù Ð Ö ØÓÖÒ Ð Ò ¹ × ÑÓ Ñ ÒÓÖ Ð Ñ ÒØÓ Ò Ð ÖÖ ÐÓ ×ÓÖ Ò Ó a[] ÕÙ ÓÒØ Ò n Ð Ñ ÒØÓ׺ × Ö ÙÒ ÑÔÐ ÒØ ÓÒ ÕÙ ÒÓ ÑÓ ¬ÕÙ Ð Ô ÖÑÙØ ÓÒ Ð ÖÖ ÐÓ Ò ÙØ Ð ÖÖ ÐÓ× ÙÜ Ð Ö ×º ´·µ ¾¿º ÜØ Ò Ð Ì DynArray<T> Ô Ö Ñ Ò Ö Ñ ØÖ ׺ ËÙÔÓÒ Ò Ó ÕÙ Ð Ì × ÐÐ Ñ Ó DynMatrix<T> ´ µ ÈÙ ÑÔÐ ÒØ Ö× ×Ø Ì Ô ÖØ Ö Ð Ì DynArray<T> ´ µ ÈÙ Ö Ð Þ Ö× ÙÒ ÑÔÐ ÒØ ÓÒ Ò Ô Ò ÒØ Ñ × ¬ ÒØ ´ µ ÓÑÓ × Ö Ð ÓÖÑ Ý Ù Ð × Ð × ÙÒ ÓÒ × Ð Ð × ÔÖÓÜÝ ×Ó Ö Ð Ì DynMatrix<T> ¾ º ÜØ Ò Ð Ì DynArray<T> Ô Ö Ñ Ò Ö ÖÖ ÐÓ× ÑÙÐØ Ñ Ò× ÓÒ Ð ×º ¾ º Ä Ñ ÝÓÖ ÐÓ× Ì ÕÙ Ñ Ò Ò Ð ×Ø × ÒÓ ÙØ Ð Þ Ò Ñ ÑÓÖ º Æ Ò ÙÒÓ ×ØÓ× Ì Ú Ö ¬ × Ð Ö ÓÒ ÙÒ Ó ØÓ ÕÙ Ò× ÖØ Ó Ð Ñ Ò × Ú Ð º × Ò ÙÒ Ñ ØÓ Ó ÕÙ Ú Ö ¬ÕÙ × ÙÒ Ö ÓÒ Ó ØÓ × Ú Ð º ´·µ ¾ º Ò Ð Ñ ×ÑÓ ×Ô Ö ØÙ Ð ÔÖ ÙÒØ ÒØ Ö ÓÖ¸ × Ò ÙÒ Ñ ØÓ Ó ÕÙ ¸ Ñ × Ú Ö ¬ Ö × Ð ÔÙÒØ ÖÓ × Ú Ð Ó¸ Ú Ö ¬ÕÙ ÕÙ Ð Ö ÓÒ ÓÖÖ ×ÔÓÒ ÙÒ Ó ØÓ Ð Ø ÔÓ ×Ô Ö Ó ÔÓÖ Ð ÙÒ ÓÒº ´··µ ¾ º ×Ô ¬ÕÙ Ù Ð × ÝÙ × ÔÓ Ö Ó Ö Ö ÙÒ ÓÑÔ Ð ÓÖ Ô Ö Ð Ø Ö Ð ÑÔÐ ÒØ ÓÒ Ò Ö Ñ ÒØ Ð ÓÒÚ Ö× ÓÒ ÙÒ Slink Ð Ö ×ØÖÓ ÕÙ ÐÓ Ò ÐÙÝ º ´···µ ¾ º ×Ô ¬ÕÙ Ù Ð × ÝÙ × ÔÓ Ö Ó Ö Ö Ð Ð Ò Ù ÔÖÓ Ö Ñ ÓÒ Ô Ö ÑÔÐ ÒØ Ö Ò Ö Ñ ÒØ Ð ÓÒÚ Ö× ÓÒ ÙÒ Slink Ð Ö ×ØÖÓ ÕÙ ÐÓ Ò ÐÙÝ º ´···µ ¾ º × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ù ÒØ Ð ÒÙÑ ÖÓ ÒÓ Ó× Ò ÙÒ Ð ×Ø × ÑÔÐ Ñ ÒØ Ò¹ ÐÞ º ¿¼º ×ØÙ Ý × ÙØ Ð × ÒÓ ÐÓ× Ì Slist<T> Ý DynSlist<T>º ÕÙ ÓÖÑ × ÔÙ Ò ÜØ Ò Ö× Ó Ñ ÓÖ Ö× Ù Ð × ×ÓÒ ×Ù× ÔÖÓ Ð Ñ × ×Ø Ò ÓÑÔÐ ØÓ×
  • 174.
    148 Cap´ ıtulo 2. Secuencias ¿½º ÁÑÔÐ ÒØ ¸ Ò ØÖ Ñ ÒØÓ Ð Ø ÑÔÓ Ù ÓÒ¸ ÙÒ Ì ÐÐ Ñ Ó Single Link ÕÙ Ø Ò Ü Ø Ñ ÒØ ÐÓ× Ñ ×ÑÓ× Ñ ØÓ Ó× ÕÙ Ð Ð × Dlinkº ¿¾º × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ù ÒØ Ð ÒÙÑ ÖÓ Ó ÙÖÖ Ò × ÙÒ Ð Ñ ÒØÓ x Ò ÙÒ Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ º ¿¿º Ó ÙÒ ÔÙÒØ ÓÖ ptr ÙÒ ÒÓ Ó ÙÒ Ð ×Ø ÒÐ Þ ¸ × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ø ÖÑ Ò Ð ÔÓ× ÓÒ ÓÖ Ò Ð ptr ÒØÖÓ Ð Ð ×Ø º × Ò ×Ù Ð ÓÖ ØÑÓ Ô Ö ÕÙ ÙÒ ÓÒ ÓÒ Ð ×Ø × × ÑÔÐ × Ý Ó Ð ×º ¿ º × ÙØ Ö Ú Ñ ÒØ ÐØ ÖÒ Ø Ú × Ô Ö ÑÔÐ ÒØ Ö Ð ×Ù ×ØÖ ÓÒ ÔÓÐ ÒÓÑ Ó׺ ¿ º × ÙØ Ö Ú Ñ ÒØ ÓÑÓ ÑÔÐ ÒØ Ö ÐÓ× Ð ÓÖ ØÑÓ× Ú × ÓÒ Ý Ö × ÙÓ ÔÓÐ ¹ ÒÓÑ Ó׺ Ö Ú ÜÔÖ × ÓÒ × Ð Ø ÑÔÓ Ù ÓÒº ¿ º ÁÑÔÐ ÒØ Ð Ì ÈÓÐ ÒÓÑ Ó¸ ÜÔÐ Ó Ð Ü ¾º º½½ ´Ô Ò ½¼¼µ¸ Ñ ÒØ Ð ×Ø × × Ñ¹ ÔÐ Ñ ÒØ ÒÐ Þ ×º Í× Ð Ì Snode<T> Ó Slinkº ¿ º ÓÒ× Ö Ó× Ð ×Ø × ÒØ ÖÓ× Ó Ð Ñ ÒØ ÒÐ Þ ×¸ Ö ÙÐ Ö ×¸ ÓÒ ÒÓ Ó Ö¸ ÒÓÑ Ò × l1 Ý l2¸ Ö ×Ô Ø Ú Ñ ÒØ º ÓÒ× Ö Ð ÓÔ Ö ÓÒ const bool similar(Dnode<int> & l1, Dnode<int> & l2) Ä Ù Ð Ö ØÓÖÒ true × Ð × Ð ×Ø × ÓÒØ Ò Ò Ü Ø Ñ ÒØ ÐÓ× Ñ ×ÑÓ× ÒØ ÖÓ× Ð× ¸ Ò ×Ó ÓÒØÖ Ö Óº × Ö Ð ÓÖ ØÑÓ× ÕÙ ÑÔÐ ÒØ Ò Ð ÓÔ Ö ÓÒ Ô Ö Ð × × Ù ÒØ × × ØÙ ÓÒ × ´ µ Ä × Ó× Ð ×Ø × ×Ø Ò ÓÖ Ò × Ð Ñ ÒÓÖ Ð Ñ ÝÓÖ ÒØ ÖÓº ´ µ Ä × Ð ×Ø × ÒÓ ×Ø Ò ÓÖ Ò ×º ¿ º × Ò ¸ ÒרÖÙÑ ÒØ Ò ÓÖÔÓÖ Ð Ì Slink Ð × ÓÔ Ö ÓÒ × Ð Ì Dlink insert list()¸ append list() Ý concat listº ´·µ ¿ º ÓÒ× Ö Ð × Ù ÒØ ÔÖÓØÓØ ÔÓ ÙÒ ÓÒ void permutar_pares(Dlink * lista); Ä ÙÒ ÓÒ ØÓÑ Ô Ö ÒØÖÓ Ð × Ù Ò ÐÓ× ÒØ Ö Ñ º ÈÓÖ Ñ¹ ÔÐÓ¸ × l =< 1, 2, 3, 4, 5, 6, 7, 8, 9 >¸ ÒØÓÒ ×¸ ÐÙ Ó permutar pares(l)¸ l =< 2, 1, 4, 3, 6, 5, 8, 7, 9 >º × Ö Ð ÙÒ ÓÒ Ò Ù ×Ø ÓÒº ¼º ÓÒ× Ö Ð × Ù ÒØ ÔÖÓØÓØ ÔÓ ÙÒ ÓÒ void conmuta_pares(Dlink * l1, Dlink * l2); Ä ÙÒ ÓÒ ÒØ Ö Ñ ÐÓ× Ð Ñ ÒØÓ× ÔÓ× ÓÒ Ô Ö l1 ÓÒ ÐÓ× ÔÓ× ÓÒ Ô Ö l2º ÈÓÖ ÑÔÐÓ¸ × l1 =< 1, 2, 3, 4, 5, 6, 7 > Ý l2 =< a, b, c, d, e >¸ ÒØÓÒ ×¸ ÐÙ Ó conmuta pares(l1, l2) Ð × Ð ×Ø × Ú Ò Ò Ò l1 =< a, 2, c, 4, e, 7 > Ý l2 =< 1, b, 3, d, 5 >º × Ö Ð ÙÒ ÓÒ Ò Ù ×Ø ÓÒº
  • 175.
    2.9. Ejercicios 149 ½º × Ö ÙÒ Ð ÓÖ ØÑÓ Ø Ö Ø ÚÓ ÕÙ Ð ÙÐ Ð i¹ × ÑÓ ÒÙÑ ÖÓ ÓÒ º ¾º × Ö ÙÒ Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓ ÕÙ ÓÑÔÙØ Ð i¹ × ÑÓ ÒÙÑ ÖÓ ÓÒ Ý ÕÙ ÒÓ Ö ÙÒ Ð ÙÐÓ׺ ´·µ ¿º × Ö ÙÒ Ú Ö× ÓÒ Ð Ð ÓÖ ØÑÓ ÓÒ Ô Ð × ÖÖÓÐÐ Ó Ò ¾º º º¾ Ô Ö Ð ÙÐ Ö Ð i¹ × ÑÓ ÒÙÑ ÖÓ ÓÒ ÕÙ ÒÓ Ö ÙÒ Ò Ð ÙÐÓ׺ ´·µ º × Ö ÙÒ Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓ ÕÙ ÓÒÚ ÖØ ÙÒ Ò Ö Ø Ö × ÕÙ ÓÒØ Ò ÙÒ ÒØ ÖÓ ×Ù Ö ÔÖ × ÒØ ÓÒ ÒØ Ö º Ò ÓØÖ × Ô Ð Ö ×¸ × Ö ÙÒ ÖÙØ Ò ÕÙ ÓÒÚ ÖØ ÙÒ ÒØ ÖÓ ÐÑ Ò Ó Ò ÙÒ char* ÙÒ ÒØ ÖÓ Ø ÔÓ intº º Ò ÙÒ Ø Ð ÖÓ Ö Þ n × n × ÕÙ ×½ ¸ × × ØÙ ÙÒ ÐÐÓ Ò Ð × ÓÓÖ Ò × x0, y0º × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ò Ù ÒØÖ ¸ × Ü ×Ø ¸ ÙÒ Ö Ù Ö Ñ ÒØÓ ÓÑÔÐ ØÓ Ð Ø Ð ÖÓ n2 − 1 ÑÓÚ Ñ ÒØÓ× Ø Ð ÕÙ × ÕÙ × Ú × Ø Ó Ü Ø Ñ ÒØ ÙÒ Ú Þº ´··µ º Ó ÙÒ Ø Ð ÖÓ Ö Þ 8 × 8 × Õ٠׸ × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÓÐÓÕÙ Ó Ó Ö Ò × Ò Ð Ø Ð ÖÓ Ñ Ò Ö Ø Ð ÕÙ Ò Ò ÙÒ Ö Ò ÔÙ Ñ Ò Þ Ö Ù ÐÕÙ Ö Ð × ÓØÖ ×º ´··µ º Ê ×Ù ÐÚ Ð ÔÖÓ Ð Ñ ÒØ Ö ÓÖ Ð × Ó Ó Ö Ò × Ô Ö Ò ÓÒØÖ Ö ØÓ × Ð × ×ÓÐÙ ÓÒ × Ö ÒØ ׺ ´·µ º El problema del morral Ó ÙÒ Ó Ø ÚÓ O Ý ÙÒ ÓÐ ÓÒ Ô ×Ó× P = {p1, p2, . . . , pn, pi} ∈ N ¸ × Ô Ø ÖÑ Ò Ö × Ü ×Ø ÙÒ × Ð ÓÒ Ô ×Ó× P ⊂ P Ø Ð ÕÙ ∀p ∈P =)º i ר ÔÖÓ Ð Ñ × ÓÒÓ Ó ÓÑÓ Ð ÔÖÓ Ð Ñ Ð ÑÓÖÖ Ð ÔÓÖÕÙ Ð ÓÖ Þ Ð × ¹ Ð ÓÒ Ö Ù Ð × Ö × ÐÐ Ú Ö Ò ÙÒ ÑÓÖÖ Ð Ñ Ò Ö Ø Ð ÕÙ ÒÓ × ÔÓÖØ Ñ × O ÐÓ Ö ÑÓ׺ È Ö Ð ÔÖÓ Ð Ñ Ð ÑÓÖÖ Ð ´ µ × Ö ÙÒ Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓº ´ µ Ð Ñ Ò Ð Ö ÙÖ× ÓÒ Ð Ð ÓÖ ØÑÓ ÒØ Ö ÓÖº ´ µ × Ö ÙÒ Ð ÓÖ ØÑÓ Ø Ö Ø ÚÓ ÕÙ ÒÓ ÙØ Ð Ô Ð º ´··µ º ÙÒ ÓÐ ÓÒ Ó ØÓ× S = {s1, s2, . . . , sn, si} ÓÒ Ô ×Ó× P = {p1, p2, . . . , pn, pi} ∈ R Ý Ú ÐÓÖ × V = {v1, v2, . . . , vn, vi} ∈ R¸ × Ô Ò ÓÒØÖ Ö ÙÒ ×Ù ÓÒ ÙÒØÓ S ⊂ S¸ ÕÙ Ñ Ü Ñ Ð Ú ÐÓÖ ØÓØ Ð ∀s∈S vi Ö ×ØÖ Ò Ó ÙÒ ¹ Ô Ô ×Ó× ∀s∈S pi ≤ C × Ö¸ ÕÙ ØÓ Ó× ÐÓ× Ó ØÓ× ÕÙ Ô Ò Ò ÙÒ ÑÓÖÖ Ð Ô Cº × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ö ×Ù ÐÚ ×Ø Ú Ö ÒØ Ð ÔÖÓ Ð Ñ Ð ÑÓÖÖ Ðº ´··µ ¼º × Ö ÙÒ Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓ ÕÙ Ò Ö Ð × n! Ô ÖÑÙØ ÓÒ × n Ð Ñ ÒØÓ× x1, x2, . . . , xn ÓÒ ÙÒ ÓÒ×ÙÑÓ ×Ô Ó ÓÒר ÒØ ¸ ÕÙ ÒÓ Ö Þ × ÙÒ nº ´··µ ½ ÒÐ Ö Ö ×Ø ¸ ÙÒ × ÕÙ × ÙÒÓ ÐÓ× Ù ÖÓ× Ð Ø Ð ÖÓº
  • 176.
    150 Cap´ ıtulo 2. Secuencias ½º Ä ÙÒ ÓÒ ÖÑ Ò A(m, n) ר ¬Ò Ð ÓÖÑ × Ù ÒØ ⎧ ⎪n + 1 ⎪ m=0 ⎨ A(m, n) = A(m − 1, 1) m > 0, n = 0 ⎪ ⎪ ⎩A(m − 1, A(m, n − 1)) m, n > 0 ´ µ × Ö ÙÒ ÖÙØ Ò Ö ÙÖ× Ú ÕÙ Ð ÙÐ Ð ÙÒ ÓÒ ÖÑ Òº ÙÐ ×Ð ÓÑÔÐ Ø ÑÔÓ Ð ÙÒ ÓÒ ´·µ ´ µ × Ö ÙÒ ÙÒ ÓÒ Ø Ö Ø Ú ÕÙ Ð ÙÐ Ð ÙÒ ÓÒ ÖÑ Òº Ù Ð ×Ð ÓÑÔÐ Ø ÑÔÓ Ð ÙÒ ÓÒ ´·µ ¾º Ë Ò A Ý B Ó× Ð ×Ø × ÒÐ Þ × ÓÖ Ò ×º ÓÒ× Ö Ð Ñ Þ Ð ÓÖ Ò AÝ B¸ ÙÝÓ Ö ×ÙÐØ Ó × ÙÒ Ð ×Ø Ù× ÓÒ Ý ÓÖ Ò ÐÓ× ÒÓ Ó× A Ý Bº × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ñ Þ Ð Ó× Ð ×Ø × ´ µ Ë ÑÔÐ Ñ ÒØ ÒÐ Þ ×º ´ µ Ó Ð Ñ ÒØ ÒÐ Þ ×º ¿º ÁÑÔÐ Ñ ÒØ ÙÒ Ð ÓØ ÕÙ ØÙ ØÓ × Ð × Ú Ö ¬ ÓÒ × Ø ÔÓ Ò Ø ÑÔÓ Ù ÓÒ Ø Ð ÓÑÓ Ù ÔÐ ÒØ Ó Ò Ö Ó ¾ º ´··µ º ÁÑÔÐ ÒØ Ð ÓÒרÖÙ ØÓÖ ÓÔ Ý Ð ÓÔ Ö ÓÖ × Ò ÓÒ Ô Ö Ð Ð × DynArray<T> ¬Ò Ò Ü ¾º½º º ´·µ º ×Ô ¬ÕÙ ¸ × Ò ÑÔÐ ÒØ ØÓØ ÐÑ ÒØ Ð Ì DynMatrix<T> Ñ Ò ÓÒ Ó Ò Ð ÔÖÓ Ð Ñ ¾¿º º ×Ò ÑÔÐ ÒØ ÙÒ Ì ÕÙ Ñ Ò ÖÖ ÐÓ× Ø× Ý ÕÙ ÙØ Ð Ð Ì DynArray<T>º º × Ò ÑÔÐ ÒØ ÙÒ Ì ÕÙ Ñ Ò Ñ ØÖ × Ø×º º ÁÑÔÐ ÒØ ÙÒ Ì ÐÐ Ñ Ó DynArrayStack<T>¸ Ð Ù Ð Ñ Ò Ô Ð × ÑÔÐ ÒØ × ÓÒ ÖÖ ÐÓ× Ò Ñ Ó׺ Ð ÖÖ ÐÓ × Ö ÓÒØÖ Ó Ò Ñ Ñ ÒØ º º ÁÑÔÐ ÒØ ÙÒ Ì ÐÐ Ñ Ó DynArrayQueue<T>¸ Ð Ù Ð Ñ Ò ÓÐ × ÑÔÐ ÒØ × ÓÒ ÖÖ ÐÓ× Ò Ñ Ó׺ Ð ÖÖ ÐÓ × Ö ÓÒØÖ Ó Ò Ñ Ñ ÒØ º ¼º ÁÑÔÐ ÒØ Ð ×Ù ×ØÖ ÓÒ ÔÓÐ ÒÓÑ Ó׺ ½º ÁÑÔÐ ÒØ Ð Ú × ÓÒ ÔÓÐ ÒÓÑ Ó׺ ´··µ ¾º ÁÑÔÐ ÒØ Ð ÓÔ Ö ÓÒ Ö × ÙÓ ÔÖÓ Ù ØÓ Ð Ú × ÓÒ Ó× ÔÓÐ ÒÓÑ Ó׺ ´··µ ¿º ÅÓ ¬ÕÙ Ð Ì Polinomio Ô Ö ÕÙ ÐÓ× Ø ÖÑ ÒÓ× Ú × Ð × Ð Ù×Ù Ö Ó Ý Ô ÖÑ Ø ÖÐÓ× ¬ ÞÑ ÒØ Ñ ÒØ ÙÒ Ø Ö ÓÖº º ÁÑÔÐ ÒØ ÙÒ ÙÒ ÓÒ ÕÙ Ð ÙÐ Ð Ö Ú ÙÒ ÔÓÐ ÒÓÑ Óº º ÁÑÔÐ ÒØ ÙÒ ÙÒ ÓÒ ÕÙ Ð ÙÐ Ð ÒØ Ö Ð ÙÒ ÔÓÐ ÒÓÑ Óº º ÅÓ ¬ÕÙ Ð Ì ÔÓÐ ÒÓÑ Ó Ô Ö ÕÙ ÙØ Ð Ó ¬ ÒØ × Ò ÔÙÒØÓ ­ÓØ ÒØ º
  • 177.
    2.9. Ejercicios 151 º ÁÑÔÐ ÒØ ÙÒ ÙÒ ÓÒ ÕÙ Ú ÐÙ ÙÒ ÔÓÐ ÒÓÑ Óº º × Ö ÙÒ Ð ÓÖ ØÑÓ ÙÒ ×ÓÐ Ô × ÕÙ Ò Ù ÒØÖ Ð Ñ ÒÓÖ Ð Ñ ÒØÓ ÙÒ Ð ×Ø ÒÐ Þ º º ÙÒ Ð ×Ø Ö ÙÐ Ö Ó Ð Ñ ÒØ ÒÐ Þ ¸ × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÓÐÓÕÙ ÐÓ× ÒÓ Ó× ÕÙ ×Ø Ò Ò ÔÓ× ÓÒ × ÑÔ Ö × ×ÔÙ × ÐÓ× ÕÙ ×Ø Ò Ò ÔÓ× ÓÒ × Ô Ö ×º Ë ÔÖ × ÖÚ Ö Ð ÓÖ Ò Ö Ð Ø ÚÓ ÒØÖ ÐÓ× ÒÓ Ó׺ ¼º ÓÒ× Ö Ð Ð Ñ Ò ÓÒ ÐÓ× Ð Ñ ÒØÓ× Ö Ô Ø Ó× ÙÒ Ð ×Ø º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ¬ÐØÖ ÐÓ× Ð Ñ ÒØÓ× Ö Ô Ø Ó× ÙÒ Ð ×Ø º Ê Ð Ô Ö ÐÓ× × Ù ÒØ × ×Ó× ´ µ Ä Ð ×Ø × × ÑÔÐ Ñ ÒØ ÒÐ Þ º ´ µ Ä Ð ×Ø × Ó Ð Ñ ÒØ ÒÐ Þ º Ò Ñ Ó× ×Ó׸ Ð Ö ×ÙÐØ Ó ÓÑÔÓÒ Ö× Ó× Ð ×Ø ׺ ÍÒ ÓÖÖ ×ÔÓÒ ÒØ Ð ¬ÐØÖ Ó Ð ÓØÖ ÓÖÖ ×ÔÓÒ ÒØ ÐÓ× Ð Ñ ÒØÓ× ×ÙÔÖ Ñ Ó׺ ½º ËÙÔÓÒ Ó× Ð ×Ø × × ÑÔÐ Ñ ÒØ ÒÐ Þ × A Ý B Ý Ð × ÓÔ Ö ÓÒ × ÙÒ ÓÒ ÒØ Ö¹ × ÓÒº × Ö Ð ÓÖ ØÑÓ× ÕÙ Ð ÙÐ Ò Ð ÙÒ ÓÒ ÒØ Ö× ÓÒ × ´ µ Ä × Ð ×Ø × ×Ø Ò ÓÖ Ò ×º ´ µ Ä × Ð ×Ø × ÒÓ ×Ø Ò ÓÖ Ò ×º Ò Ð Ð × ÑÔ ÒÓ ÙÒÓ ÐÓ× Ð ÓÖ ØÑÓ׺ ¾º ËÙÔÓÒ Ó× Ð ×Ø × ÒÐ Þ × A Ý Bº ÓÒ× Ö Ð ÓÔ Ö ÓÒ Ù× ÓÒ ÙÝÓ Ö ×ÙÐØ Ó × Ö ÙÒ ×ÓÐ Ð ×Ø ÙÝÓ× ÔÖ Ñ ÖÓ× Ð Ñ ÒØÓ× ÓÖÖ ×ÔÓÒ Ò Ð Ð ×Ø A × Ù ÔÓÖ ÐÓ× Ð Ñ ÒØÓ× Ð Ð ×Ø Bº × Ö ÙÒ Ð ÓÖ ØÑÓ Ù× ÓÒ Ô Ö ÙÒÓ ÐÓ× × Ù ÒØ × ×Ó× ´µ Ä ×Ø × × ÑÔÐ × ÒÓ Ö ÙÐ Ö ×º ´µ Ä ×Ø × × ÑÔÐ × Ö ÙÐ Ö ×º ´µ Ä ×Ø × Ó Ð × ÒÓ Ö ÙÐ Ö ×º ´µ Ä ×Ø × Ó Ð × Ö ÙÐ Ö ×º ¿º ÓÒ× Ö Ð ÔÖÓ Ð Ñ ÒÚ ÖØ Ö ÐÓ× Ð Ñ ÒØÓ× ÙÒ Ð ×Ø Ò ÙÒ ×ÓÐ Ô × ¸ × Ò Ù× Ö ÙÒ ×ØÖÙ ØÙÖ ØÓ ÓÒ Ð Ý × Ò ÓÔ Ö ÐÓ× ÓÒØ Ò Ó× ÐÓ× ÒÓ Ó׺ × Ö Ð ÓÖ ØÑÓ× Ô Ö ´µ ÍÒ Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ º ´µ ÍÒ Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ Ö ÙÐ Öº ´µ ÍÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ º ÈÖÓÔÓÒ Ð Ñ ÒÓ× Ó× Ð ÓÖ ØÑÓ׺ ´µ ÍÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ Ö ÙÐ Öº ÈÖÓÔÓÒ Ð Ñ ÒÓ× Ó× Ð ÓÖ ØÑÓ׺ º ËÙÔÓÒ Ð × ØÙ ÓÒ × Ù ÒØ
  • 178.
    152 Cap´ ıtulo 2. Secuencias 0 1 2 3 4 5 6 7 8 9 ´ µ ÜÔÐ ÕÙ ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ø ÖÑ Ò × Ð Ð ×Ø Ò Ù ×Ø ÓÒ Ø Ò Ó ÒÓ ÙÒ ÐÓ Ý¸ × Ü ×Ø ÙÒ ÐÓ¸ Ù Ð × Ð ÒÓ Ó ÓÑ ÒÞÓ Ý Ù Ð × ×Ù ÐÓÒ ØÙ º × ÙØ Ð × ÑÔ ÒÓ ×Ù Ñ ØÓ Óº ´ µ ×ÙÑ ÕÙ × ÑÔÓ× Ð Ñ ÒØ Ò Ö Ð ÙÒ ×ØÖÙ ØÙÖ ØÓ Ó × Ö Ö ×Ó Ö ÐÓ× ÒÓ Ó׺ ËÓÐÓ × ÔÓ× Ð Ð ÙÒ × Ð × Ñ ÑÓÖ º º Å Ò ÓÒ Ð ÙÒ × Ò Ö Ó Ö Ð ÓÒ ×Ø × Ö ×ØÖ ÓÒ × × ÔÐ Ö Òº º ÓÒ Ð × Ö ×ØÖ ÓÒ × ×¸ ÜÔÐ ÕÙ ÙÒ Ñ ØÓ Ó ÕÙ Ó ÙÔ ×Ô Ó ÓÒ×¹ Ø ÒØ Ý ÕÙ Ø ÖÑ Ò × Ü ×Ø ÙÒ ÐÓ¸ Ò Ù Ð ÒÓ Ó Ý Ù ÒØ ÐÓÒ ØÙ º º Ù Ð × Ð × ÑÔ ÒÓ Ð Ñ ØÓ Ó ÒØ Ö ÓÖ º ÁÑ Ò Ð × Ù ÒØ × ØÙ ÓÒ x Ð ÔÖÓ Ð Ñ ÓÒ× ×Ø Ò Ø ÖÑ Ò Ö Ù Ð × Ð ÒÓ Ó ÒØ Ö× ÓÒ¸ Ù ÒØÓ× ÒÓ Ó× ÔÖ Ò x Ò Ð ×Ø ¸ Ý Ù ÒØÓ× ÒÓ Ó× ×Ù Ò xº ´ µ ËÙÔÓÒ Ò Ó ÕÙ × ÔÙ Ñ Ö Ö Ù ÐÕÙ Ö ÒÓ Ó¸ × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÒÓ ÓÒØ Ò ÐÓ× Ò Ó׺ ´ µ Ô ÖØ Ö ÓÖ ×ÙÑ ÕÙ ÒÓ × ÔÙ Ñ Ö Ö Ð ÙÒ ÒÓ Óº × Ò ÙÒ Ð¹ ÓÖ ØÑÓ Ò Ó × Ó Ò Ó× ÐÓ× Ò Ó׺ Ð Ð ÓÖ ØÑÓ ÔÙ Ó ÙÔ Ö ×Ô Ó ÔÖÓÔÓÖ ÓÒ Ð Ð ÒÙÑ ÖÓ ÒÓ Ó׺ ´ µ × Ò ÙÒ Ð ÓÖ ØÑÓ × Ó Ò Ó× ÐÓ× Ò Ó× ÕÙ Ó ÙÔ ×Ô Ó ÓÒר ÒØ º ´ µ × Ò ÙÒ Ð ÓÖ ØÑÓ × Ó Ò ÐÓ× × ÑÔР׸ ÒÓ Ò Ó׸ ÕÙ Ó ÙÔ ×Ô Ó ÓÒר ÒØ º º ÓÒ× Ö Ð ÓÔ Ö ÓÒ Ô ÖØ ÓÒ ÙÒ Ð ×Ø Ò Ó× Ð ×Ø × Ù Ð Ø Ñ ÒÓº Ä ÔÖ Ñ Ö Ð ×Ø ÓÖÖ ×ÔÓÒ ÐÓ× n/2 ÔÖ Ñ ÖÓ× Ð Ñ ÒØÓ× Ð × ÙÒ ÐÓ× n/2 Ð ¹ Ñ ÒØÓ× Ö ×Ø ÒØ ׺ × Ö Ð ÓÖ ØÑÓ× × Ó× Ò ÐÓ× × ÑÔÐ × Ô Ö Ô ÖØ ÓÒ Ö ´ µ ÍÒ Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ º ´ µ ÍÒ Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ Ö ÙÐ Öº ´ µ ÍÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ º ´ µ ÍÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ Ö ÙÐ Öº
  • 179.
    2.9. Ejercicios 153 º × Ö ÙÒ ÔÖÓ Ñ ÒØÓ Ò Ö Ð¸ × Ó Ò ÐÓ× × ÑÔР׸ ÕÙ ØÙ ÙÒ m¹ Ô ÖØ ÓÒº × Ö¸ ×ÔÙ × Ð ÓÔ Ö ÓÒ¸ Ð Ð ×Ø × Ô ÖØ Ò m Ð ×Ø × Ø Ñ ÒÓ n/mº º × Ö ÙÒ ÔÖÓ Ö Ñ ÕÙ ÑÙ Ú Ð Ñ ÒÓÖ Ð Ñ ÒØÓ ÙÒ Ð ×Ø Ð ÔÖ Ñ Ö ÔÓ× ÓÒº º × Ö ÙÒ ÔÖÓ Ö Ñ ÕÙ ÑÙ Ú Ð Ñ ÝÓÖ Ð Ñ ÒØÓ ÙÒ Ð ×Ø Ð ÙÐØ Ñ ÔÓ× ÓÒº ¼º Ò × ÐÓ× Ó× Ö Ó× ÔÖ Ú Ó׸ × Ö ÙÒ ÔÖÓ Ö Ñ ÕÙ ÓÖ Ò ÙÒ Ð ×Ø Ó Ð ¹ Ñ ÒØ ÒÐ Þ º ½º × Ò ÑÔÐ ÒØ ÙÒ Ì ÕÙ ÑÓ Ð ÙÒ Ô Ð ÑÔÐ ÒØ ÓÒ ÖÖ ÐÓ× Ò Ñ Ó׺ × ÙØ ØÓ × Ð × ÓÔ ÓÒ ×¸ Ú ÒØ × Ý ×Ú ÒØ × ×Ù × ÒÓº ¾º × Ò ÑÔÐ ÒØ ÙÒ Ì ÕÙ ÑÓ Ð ÙÒ ÓÐ ÑÔÐ ÒØ ÓÒ ÖÖ ÐÓ× Ò Ñ Ó׺ × ÙØ ØÓ × Ð × ÓÔ ÓÒ ×¸ Ú ÒØ × Ý ×Ú ÒØ × ×Ù × ÒÓº ¿º ÓÒ× Ö ÙÒ Ð ×Ø Ö ÙÐ Ö ÓÖÑ Ø Ð ÕÙ Ð Ð ×Ø ÔÙ Ö ÓÖÖ Ö× ¬ ÞÑ ÒØ Ò Ñ × Ö ÓÒ ×º ´ µ ÓÒ× Ö ÙÒ ÙÒ ÓÒ f(p1, p2) = p3 Ø Ð ÕÙ f(p1, p3) = p2, f(p2, p3) = p1, ∀pi, pj, pk ∈ N , pi = pj = pkº Ó ÙÒ ÒÓ Ó ÓÒ ÙÒ ×ÓÐÓ ÑÔÓ Ô Ö ÙÒ Ö ÓÒ Ñ ÑÓÖ ¸ ÜÔÐ ÕÙ ÙÒ Ñ ØÓ Ó ÕÙ ÙØ Ð ÙÒ ÙÒ ÓÒ ÓÑÓ Ð ÒØ Ö ÓÖ Ô Ö Ö ÓÖÖ Ö Ð Ð ×Ø Ò ÐÓ× Ó× × ÒØ Ó× ÙÒ Ù Ò Ó ÙÒ ÒÓ Ó ÓÒØ Ò ÙÒ ×ÓÐÓ ÔÙÒØ ÓÖº ´··µ ´ µ Ò Ù ÒØÖ ÓÔ Ö ÓÒ × ÕÙ ÔÙ Ò Ù× Ö× Ô Ö ÑÔÐ ÒØ Ö Ð ÙÒ ÓÒ f Ð ÔÖ ÙÒØ ÒØ Ö ÓÖº ´·µ ´ µ Ò × Ð × Ö ×ÔÙ ×Ø × ÒØ Ö ÓÖ ×¸ × Ò ÑÔÐ ÒØ ÙÒ Ì ÕÙ ÑÓ Ð ÙÒ Ð ×Ø Ö ÙÐ Ö Ö ÓÖÖ Ð Ò Ñ Ó× × ÒØ Ó× Ý ÕÙ Ù× ÙÒ ×ÓÐÓ ÔÙÒØ ÓÖ ÔÓÖ ÒÓ Óº ´··µ º ÁÑÔÐ ÒØ ÐÓ× Ñ ØÓ Ó× pushn()¸ popn() Ý empty() ¬Ò Ó× Ò ArrayStack<T>¸ Ô Ö Ð Ð × ListStack<T>º ÈÓÖ ÕÙ ÒÓ Ò × Ó ÑÔÐ ÒØ Ó× Ö Ø Ñ ÒØ ÒØÖÓ Ð Ð× º ÜÔÐ ÕÙ ÓÑÓ ÑÔÐ ÒØ Ö ÙÒ Ô Ð Ñ ÒØ Ó× ÓР׺ º ÜÔÐ ÕÙ ÓÑÓ ÑÔÐ ÒØ Ö ÙÒ ÓÐ Ñ ÒØ Ó× Ô Ð ×º º È Ö ÓÒÚ ÖØ Ö ÙÒ ÒÙÑ ÖÓ Ò × ½¼ × Ú ×Ù × Ú Ñ ÒØ ÒØÖ Ó× ×Ø ÕÙ Ð Ó ÒØ Ú Ò Ò ÖÓ Ý Ò Ú × ÓÒ × ÐÑ Ò Ð Ö ×ØÓ¸ Ð Ù Ð × ÙÒ ØÓ Ð ÕÙ Ú Ð ÒØ Ò × Ò Ö º ÈÓÖ ÑÔÐÓ¸ 3710 ÔÙ Ð ÙÐ Ö× Ò Ò Ö Ó ÓÑÓ 37 ÑÓ 2 = 1 18 ÑÓ 2 = 0 9 ÑÓ 2 = 1 4 ÑÓ 2 = 0 2 ÑÓ 2 = 0 1 ÑÓ 2 = 1
  • 180.
    154 Cap´ ıtulo 2. Secuencias ר ÑÓ Ó¸ 3710 = 1001012º ÁÑÔÐ ÒØ ¸ usando una pila¸ Ð ÖÙØ Ò void imprime2(const int & n); Ä Ù Ð ÑÔÖ Ñ Ð ÕÙ Ú Ð ÒØ Ò Ö Ó Ð Ô Ö Ñ ØÖÓ nº º Ê Ð ÙÒ ÔÖÓ Ö Ñ ÕÙ Ú ÐÙ ÙÒ ÜÔÖ × ÓÒ ÔÖ ¬ º º Ê Ð ÙÒ ÔÖÓ Ö Ñ ÕÙ Ú ÐÙ ÙÒ ÜÔÖ × ÓÒ ×Ù¬ º ¼º ÜÔ Ò Ð Ú ÐÙ ÓÖ ÜÔÖ × ÓÒ × Ò¬ × Ô Ö ÕÙ ØÙ ÓÔ Ö ÓÒ × ÜÔÓ¹ Ò Ò ÓÒ¸ ØÖ ÓÒÓÑ ØÖ Ý ÐÓ Ö ØÑÓ׺ ½º ÅÓ ¬ÕÙ Ð Ú ÐÙ ÓÖ ÜÔÖ × ÓÒ × Ò¬ × Ô Ö ÕÙ ¸ Ò ÐÙ Ö Ú ÐÙ Ö Ð Ü¹ ÔÖ × ÓÒ¸ Ò Ö Ð ÜÔÖ × ÓÒ ×Ù¬ º ÁÒ ÐÙÝ Ð × ÓÔ Ö ÓÒ × ÜÔÓÒ Ò ÓÒ¸ ØÖ ÓÒÓÑ ØÖ Ý ÐÓ Ö ØÑÓ׺ ¾º ÅÓ ¬ÕÙ Ð Ú ÐÙ ÓÖ ÜÔÖ × ÓÒ × Ò¬ × Ô Ö ÕÙ ¸ Ò ÐÙ Ö Ú ÐÙ Ö Ð Ü¹ ÔÖ × ÓÒ¸ Ò Ö Ð ÜÔÖ × ÓÒ ÔÖ ¬ º ÁÒ ÐÙÝ Ð × ÓÔ Ö ÓÒ × ÜÔÓÒ Ò ÓÒ¸ ØÖ ÓÒÓÑ ØÖ Ý ÐÓ Ö ØÑÓ׺ ¿º × Ò ÑÔÐ ÒØ ÙÒ Ì ÕÙ ÑÓ Ð ÓÐ × ÑÔÐ ÒØ × ÓÒ ÖÖ ÐÓ׺ º × Ò ÑÔÐ ÒØ ÙÒ Ì ÕÙ ÑÓ Ð ÓÐ × ÑÔÐ ÒØ × ÓÒ Ð ×Ø ׺ º × ÙØ Ð × ÐØ ÖÒ Ø Ú × × ÒÓ ÙÒ Ì ÕÙ ÑÓ Ð Ñ ØÖ × ×Ô Ö × Ö ÔÖ × ÒØ × ÓÒ ÑÙÐØ Ð ×Ø ׺ ÜÔÐ ÕÙ ÓÑÓ × Ö Ð Þ Ö Ò Ð × ÓÔ Ö ÓÒ × ×ÙÑ ¸ Ö ×Ø ¸ ÑÙÐØ ÔÐ ÓÒ ÒÚ Ö× ÓÒº º Ð ÙÐ ÐÓ× Óר × Ò ×Ô Ó ÙÒ Ñ ØÖ Þ Ö ÔÖ × ÒØ Ñ ÒØ ÑÙÐØ Ð ×Ø ׺ ÈÖÓ¹ ÔÓÖ ÓÒ ÙÒ ÜÔÖ × ÓÒ Ò Ð Ø Ò ÙÒ ÓÒ Ð Ñ Ò× ÓÒ Ð Ñ ØÖ Þ Ý Ð ÔÓÖ¹ ÒØ Ð Ñ ÒØÓ× ÒÙÐÓ׺ º × Ò ÑÔÐ ÒØ ÙÒ Ì ÕÙ ÑÓ Ð Ñ ØÖ × ×Ô Ö × Ö ÔÖ × ÒØ × ÓÒ ÑÙй Ø Ð ×Ø ׺ ÁÑÔÐ ÒØ Ð × ÓÔ Ö ÓÒ × ×ÙÑ ¸ Ö ×Ø ¸ ÑÙÐØ ÔÐ ÓÒ ÒÚ Ö× ÓÒº ´··µ Bibliograf´ ıa ½ Ó¸ ÂÓ Ò º ÀÓÔ ÖÓ Ø¸ Ò Â «Ö Ý º ÍÐÐÑ Òº Ì Ð Ö Îº × Ò Ò Ò ÐÝ× × Ó ÓÑÔÙØ Ö Ð ÓÖ Ø Ñ׺ ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ÍË ¸ ½ º ¾ º Ϻ Ù× Ò Ïº Ⱥ À × Ò º ÇÊÌÊ Æº Á ÌÖ Ò× Ø ÓÒ× ÓÒ Ð ØÖÓÒ ÓÑÔÙØ Ö׸ ¹½¿´ µ ¿ ¾ß¿ ¸ ½ º ¿ È Ø Ö Ð Ò ÖØº ×× Ñ Ð Ö׸ ÓÑÔ Ð Ö׸ Ò ÔÖÓ Ö Ñ ØÖ Ò×Ð Ø ÓÒº ÓÑÔÙØ Ö Ë Ò ÈÖ ×׸ ½ º ̺ Àº ÓÖÑ Ò¸ º º Ä × Ö×ÓÒ¸ Ò Êº ĺ Ê Ú ×Øº ÁÒØÖÓ Ù Ø ÓÒ ØÓ Ð ÓÖ Ø Ñ׺ ÅÁÌ ÈÖ ×׸ Ñ Ö ¸ Å ¸ ÍË ¸ ½ º
  • 181.
    2.9. Bibliograf´ ıa 155 ź ̺ ÓÓ Ö Ò Êº Ì Ñ ×× º Ø ËØÖÙ ØÙÖ × Ò Ð ÓÖ Ø Ñ× Ò Â Ú º ÂÓ Ò Ï Ð Ý ² ËÓÒ׸ ½ º ʺ ĺ Ö Ñ¸ º º ÃÒÙØ ¸ Ò Çº È Ø × Ò º ÓÒ Ö Ø Å Ø Ñ Ø × ÓÙÒ¹ Ø ÓÒ ÓÖ ÓÑÔÙØ Ö Ë Ò º ×ÓÒ¹Ï ×Ð Ý ÈÙ º¸ ½ º ÓÒ Ð º ÃÒÙØ º ÙÒ Ñ ÒØ Ð Ð ÓÖ Ø Ñ׸ ÚÓÐÙÑ ½ Ó Ì ÖØ Ó ÓÑÔÙØ Ö ÈÖÓ Ö ÑÑ Ò º ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ÍË ¸ Ø Ö Ø ÓÒ¸ ½ º À ÖÖÝ Êº Ä Û × Ò Ä ÖÖÝ Ò Ò Ö º Ø ËØÖÙ ØÙÖ × Ò Ì Ö Ð ÓÖ Ø Ñ׺ À ÖÔ Ö ÓÐÐ Ò× ÈÙ Ð × Ö׸ Æ Û ÓÖ ¸ ½ ½º Ó Ö Å ÒÒ Ò Ê Ö Ï Ð Ò Öº Ì ÓÖ Ò Ó Ø Ò ÖÝ¹× Ö Ô Ö Ñº Ì Ò Ð Ê ÔÓÖØ Ê ÔÓÖØ¸ ËØ Ò ÓÖ ÍÒ Ú Ö× ØÝ¸ ËØ Ò ÓÖ ¸ ¸ ½ º ½¼ Ë ÓØØ Ñ Ý Öº ÅÓÖ « Ø Ú C++ ¿ Ò Û Û Ý× ØÓ ÑÔÖÓÚ ÝÓÙÖ ÔÖÓ Ö Ñ× Ò × Ò׺ ×ÓÒ¹Ï ×Рݸ ½ º ÁË Æ ¼¹¾¼½¹ ¿¿ ½¹ º ½½ Æ ÓÐ × Æ Ø Ö ÓØ Ò ÂÙÐ Ò Ë Û Ö º Î Ð Ö Ò ÔÖÓ Ö Ñ ×ÙÔ ÖÚ × ÓÒ Ö Ñ ÛÓÖ º Ð ØÖº ÆÓØ × Ì ÓÖº ÓÑÔÙØº Ë ¸ ´¾µ¸ ¾¼¼¿º ½¾ ÐÐ Ò Æ Û ÐÐ Ò Âº º Ë Ûº ÈÖÓ Ö ÑÑ Ò Ø ÐÓ Ø ÓÖÝ Ñ Ò º ÁÒ ÈÖÓ Ò × Ó Ø ½ Ï ×Ø ÖÒ ÂÓ ÒØ ÓÑÔÙØ Ö ÓÒ Ö Ò ¸ Ô × ¾¿¼ß¾ ¼º ÁÊ ¸ ½ º ½¿ ÐÐ Ò Æ Û Ðи º º Ë Û¸ Ò Àº º Ë ÑÓÒº ÑÔ Ö Ð ÜÔÐÓÖ Ø ÓÒ× Û Ø Ø ÐÓ Ø ÓÖÝ Ñ Ò º ÁÒ Ï ×Ø ÖÒ ÂÓ ÒØ ÓÑÔÙØ Ö ÓÒ Ö Ò ¸ ÚÓÐÙÑ ½ ¸ Ô × ¾½ ß ¾¿ ¸ ½ º ½ ÂÓ Ò Ãº ÇÙר Ö ÓÙØº Ë Ö ÔØ Ò À Ö¹Ð Ú Ð ÔÖÓ Ö ÑÑ Ò ÓÖ Ø ¾½×Ø ÒØÙÖݺ Á ÓÑÔÙØ Ö¸ ¿½´¿µ ¾¿ß¿¼¸ ½ º ½ ÈºÂºÅ Ö Ò Ì Ö ËÓ ØÛ Ö ÓÙÒ Ø ÓÒº Ì ÆÍ Æ Æ ÓÑ Ô º ½ ź ÊÓÞ Ö¸ κ ÖÓ×× ÑÓÚ¸ º ÖÑ Ò ¸ Áº ÓÙÐ ¸ ź Ò¸ ź Ù ÐÐ ÑÓÒØ¸ º À Ö¹ ÖÑ ÒÒ¸ º Ã × Ö¸ ˺ Ä Ò ÐÓ ×¸ Ⱥ Ä ÓÒ Ö ¸ Ò Ïº Æ Ù Ù× Öº ÀÇÊÍË ×ØÖ ÙØ ÓÔ Ö Ø Ò ×Ýר Ñ׺ ÍË ÆÁ ÓÑÔÙØ Ò ËÝר Ñ׸ ½´ µ ¿¼ ß¿ ¼¸ ½ º ½ ÊÓ ÖØ Ë Û º Ð ÓÖ Ø Ñ× Ò È ÖØ× ½ß ÙÒ Ñ ÒØ Ð׸ Ø ×ØÖÙ ØÙÖ ×¸ ×ÓÖØ Ò ¸ × Ö Ò º ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ÍË ¸ ½ º ½ º Ú Ò ÊÓ××ÙÑ Ò º ĺ Ö ¸ ÂÖº¸ ØÓÖ׺ Ò ÁÒØÖÓ Ù Ø ÓÒ ØÓ ÈÝØ ÓÒº Æ ØÛÓÖ Ì ÓÖÝ ÄØ ¸ Ë ÔØ Ñ Ö ¾¼¼¿º ½ Ä ÖÖÝ Ï ÐÐ Ò Ê Ò Ð Äº Ë Û ÖØÞº ÈÖÓ Ö ÑÑ Ò È Öк Ç³Ê ÐÐÝ ² ××Ó Ø ×¸ ÁÒ º¸ ½ ¼º ¾¼ Ö Ý Ï Ø×ÓÒº Ñ ÐÐÓ ¹ Ù Ñ ÐÐÓ Ð Ö Öݺ Ú Ð Ð ÓÒ http://dmalloc.com/º ¾½ Æ Ð Ù× Ï ÖØ º Ð ÓÖ Ø Ñ× + Ø ËØÖÙ ØÙÖ × = ÈÖÓ Ö Ñ׺ ÈÖ ÒØ ¹À ÐÐ Ë Ö × Ò ÙØÓÑ Ø ÓÑÔÙØ Ø ÓÒº ÈÖ ÒØ ¹À Ðи ÍÔÔ Ö Ë Ð Ê Ú Ö¸ ÆÂ ¼ ¸ ÍË ¸ ½ º
  • 183.
    Cap´ ıtulo 3 Cr´ ıtica de algoritmos Ò ×Ø Ô ØÙÐÓ ×ØÙ Ö ÑÓ× Ð ÙÒ × Ø Ò × Ò Ð × × Ý Ú Ö ¬ ÓÒ ÓÖÖ Ø ØÙ ÙÝÓ ¬Ò × Ö Ø Ö Ð ÓÖ ØÑÓ׺ Ö Ø Ö ÔÖÓÚ Ò Ð Ö Ó κριτικ ς ´ Ö Ø Ó×µ¸ ÕÙ × ¹ Ò¬ Ð ÕÙ Ö Ø ¸ Р٠и ×Ù Ú Þ¸ Ö Ú Ð Ú Ö Ó Ö Ó κρ νω ´ Ö ÒÓµ Ý ÓÒÒÓØ × Ô Ö Ö¸ × ÖÒ Ö¸ ר Ò Ù Ö¸ Ö Ö½ º Ö Ø Ö ÓÒ× ×Ø ¸ Ô٠׸ Ò × Ô Ö Ö ¸ × Ð ÓÒ Ö Ð Ó× ÒØ Ö × ØÓ× ×ØÙ ÖÐ º È ÖÓ¸ Ô Ö ÕÙ Ð ×ØÙ ÑÓ× Ì ÒØÓ × Ð × Ô Ö×Ô Ø Ú × Ð Ó Ö ÒØ ¸ ÓÑÓ × Ð × ÐÓ× Ò ¬ Ö Ó× Ð Ó Ö ¸ Ð Ö Ø × ÓÒ ÔÖ Ø Ò× ÓÒ Ñ ÓÖ Ö Ð Òº À Ý Ó× Ñ Ò Ö × Ú Ö ÙÒ Ö Ø º ÍÒ × ÓÒ ÒØÖ Ò ÐÓ ÒØ ÖÒÓ ¾ Ý Ø Ò Ð ÔÖÓ ×Ó ÙÖ Ð Ó Ö º ר Ø ÔÓ Ö Ø × Ñ × ÔÖÓÔ Ó ÒØÖ ÐÓ× Ó Ö ÒØ × ´ÔÖ ¹ Ø ÒØ ×µ ÕÙ ÒØÖ ÐÓ× Ò ¬ Ö Ó× ÕÙ Ö Ò ´Ù× Òµ Ð Ó Ö º Ð ÓØÖ Ø Ð Ö Ø × Ð ÒÓÑ Ò ÜØ ÖÒ Ý Ø Ò Ð ÔÖ ÓÒ ×Ó Ð Ð Ó Ö × Ö¸ ÓÑÓ Ð ÒØÓÖÒÓ Ó ×Ó ÔÖ Ó ×ÔÖ Ð Ò Ð ÓÖºÄ Ö Ø ÜØ ÖÒ × ÙÒ Ñ ÒØ Ð Ý ÔÖ Ñ Ö Ö ×Ô ØÓ Ð ÒØ ÖÒ ¸ ÔÙ × ×Ø Ø Ò Ð ×Ø ÒÓ Ð ÓÖº Ä Ö Ø ÜØ ÖÒ × ÓÒ ÒØÖ Ò Ð ÕÙ × Ð Ó Ö ¸ ÐÓ ÕÙ ×Ø Ö ÔÖ × ÒØ ×Ó ÐÑ ÒØ ÓÑÓ Ò Ñ ÒØÖ × ÕÙ Ð Ö Ø ÒØ ÖÒ × ÓÒ ÒØÖ Ò Ð ÓÑÓ × Ö Ð Þ Ð Ó Ö º Ä Ò ÑÓ ÖÒ ×Ù Ð Ù× Ö Ð Ø ÖÑ ÒÓ Ò Ð × × Ô Ö Ö Ö Ö ÙÒ ×Ø ÐÓ Ø Ò Ó ×ØÙ Ó ÒØ ÖÒÓ Ò Ð Ù Ð Ð Ó× ×ØÙ Ó × Ú Ò Ô ÖØ × Ô Ö ×ØÙ ÖÐ × ÔÓÖ × Ô Ö Óº Ò Ð × × ÔÖÓÚ Ò Ð Ö Ó ν λυσις ´ Ò Ð × ×µ Ý Ò ÙÐØ Ñ Òר Ò Ð Ú Ö Ó ναλ ω¸ Ð Ù Ð Ø Ñ Ò × Ò ¬ ×ÓÐØ Ö ´ ν µ¸ ר ÒØ Ú Ñ ÒØ ¸ ÔÓÖ Ô ÖØ ׸ Ý × Ô Ö Ö ´λ ωµ ÐÓ ÕÙ ÓÖÖ ×ÔÓÒ ÓÒ ×Ù ÔÖ Ñ Ö Ô ÓÒ Ò Ð ºÊº º º ר Ò Ù Ö Ý × Ô Ö Ö Ð × Ô ÖØ × ÙÒ ØÓ Ó º ÑÓ× Ð Ö Ö Ú Ñ ÒØ Ñ ÒØ ÕÙ Ö Ø Ö × ÑÙ Ó Ñ × ÕÙ Ò Ð Þ Ö Ý¸ Ô Ö ÔÖ Ò Ö ÐÐÓ¸ ÕÙ Þ ÐÓ Ñ ÓÖ × Ñ Ö Ö Ð ÒØÓÒ ÑÓ Ò Ð × ×¸ Ù Ð × × ÒØ × × ¸ ÔÖÓÚ Ò ÒØ Ð Ö Ó σ νθεσις ´× ÒØ × ×µ ÕÙ ¸ ºÊº º º Ü Ø¸ × Ò ¬ ÓÑÔÓ× ÓÒ ÙÒ ØÓ Ó ÔÓÖ Ð Ö ÙÒ ÓÒ ×Ù× Ô ÖØ × º ÓÑÓ ÑÓ× ÔÖ ÖÐÓ¸ Ò ×Ø ÓÒØ ÜØÓ ÓÑÔÓÒ Ö ÔÖÓ Ö Ñ ×¸ Ó × ¸ × ÒØ Ø Þ ÖÐÓ׸ Ø Ò Ñ × × ÒØ Ó Ô Ö ÒÓ×ÓØÖÓ× ÕÙ × ÓÑÔÓÒ ÖÐÓ׸ × Ö¸ ÕÙ Ò Ð Þ ÖÐÓ׺ ËÙÖ ¸ ÒØÓÒ ×¸ Ð × Ù ÒØ ÔÖ ÙÒØ ¸ ÕÙ Ö ÑÓ× ÖØ Ù Ò Ó ÔÖÓ Ö Ñ ÑÓ׸ Ò Ð Þ ÑÓ× Ó × ÒØ Ø Þ ÑÓ× Ó Ñ Ó× ÈÐ ÒØ Ó ÓØÖÓ ÑÓ Ó Ö ÑÓ× ÔÖÓ Ö Ñ × Ô ÖØ Ö ÙÒ ØÓ Ó ÕÙ ÐÙ Ó × ÓÑÔÓÒ ÑÓ× Ó Ô ÖØ Ö Ô ÖØ × ÕÙ ×ÔÙ × ÓÑÔÓÒ ÑÓ׸ Ñ × Ó× × Ó Ò Ò ÙÒ ÙÒ Ö Ø ×Ù Ð Ð ¬ Ö× Ð ÓÒרÖÙ Ø Ú Ó ×ØÖÙ Ø Ú º ÀÓÝ × Ó ÔÓÖ ÕÙ ½ ÍÒ Ö × ÙÒ ×Ô ÓÐ ÓÖ ÓÒ ÕÙ ÒØ Ù Ñ ÒØ × Ð ÑÔ Ð ØÖ Ó Ð ÔÓÐÚÓ Ý ÓØÖ × ÑÔÙÖ Þ ×º ÉÙ Þ ÔÓÖ ×Ø Ô ÓÒ × Ñ × ÔØ Ð Ö ÕÙ Ö Ø Ö ÒÓ × Ò ¬ Ú Öº ¾ Ë ÙÒ ¾¼ º ½
  • 184.
    158 Cap´ ıtulo 3. Cr´ ıtica de algoritmos Ð Ö Ø × ÓÒרÖÙ Ø Ú Ý ÒÓ ×ØÖÙ Ø Ú º ÈÓÖ ÕÙ ×ØÓ× Ø ÚÓ× ÉÙ × ÓÒרÖÙÝ Ó ×ØÖÙÝ Å × Ò Ô ÖØ ÙÐ Ö¸ ÔÓÖ ÕÙ ÙÒ Ö Ø ÔÓ Ö × Ö ×ØÖÙ Ø Ú × ÓÖÖ ØÓ Ö ÕÙ ÙÒ Ó Ö × ÓÒרÖÙÝ ¸ × ÒØ Ó ÔÓÖ Ð Ù Ð ÙÒ Ö Ø ¸ ×Ó Ö ØÓ Ó¸ Ù Ò Ó ×Ø Ö Ú Ð ÖÖÓÖ ×¸ ÙÝ × ×ÙÒ ÓÒ × Ý ÒÑ Ò × Ñ ÓÖ Ò Ð Ó Ö ¸ ÔÙ ÓÒ× Ö Ö× ÓÒרÖÙ Ø Ú º ÙÒÕÙ ÑÓ× Ó ÕÙ Ø ÑÓÐÓ Ñ ÒØ Ð Ö Ø Ö ÓÒÐÐ Ú ÖÓÑÔ Ö ¸ ÒÓ ÑÓ× ÔØ Ö ÕÙ ÙÒ Ö Ø ×ØÖÙÝ Ð Ø Ö ÐÑ ÒØ ÙÒ Ó Ö ØÓ Ó ÐÓ ÓÒØÖ Ö Ó¸ Ñ ÒØÖ × Ñ × Ù Ý ÔÖ × × ÙÒ Ö Ø ¸ Ñ × ÓÒרÖÙ Ø Ú ×¸ ÔÙ × ×Ø Ô ÖÑ Ø Ñ ÓÖ Ö Ð Ó Ö º ÄÓ ÒØ Ö ÓÖ × ÓÖÖ ØÓ ÙÒ¸ Ò ÐÙ× Ú ¸ × ÙÒ Ö Ø Ö Ú Ð ÕÙ ÒÓ Ø Ò × ÒØ Ó ÓÒרÖÙ Ö Ð Ó Ö Ô٠׸ Ð ¬Ò Ý Ð Ó¸ ר × ÙÒ ÓÒÓ Ñ ÒØÓ ÔÖ Ø Óº ÓÑÓ ×¸ ÒØÓÒ ×¸ ÕÙ ÙÒ Ö Ø ÔÙ Ð ¬ Ö× ×ØÖÙ Ø Ú Ç ÙÖÖ ÕÙ Ð Ö ÞÓÒ Ð Ö Ø ×Ø ÔÓ × ÒØÖ Ò Ð Ò Ú ÙÓ¸ Ó × Ò Ð Ô Ö×ÓÒ Ð Ð Ó Ö ÒØ ¸ ÕÙ Ò × Ð Ö Ø Ó¸ Ý Ð Ö Ø ÒØ ¸ Ò ÐÙ Ö ÓÒ ÒØÖ Ö× ×Ó Ö Ð Ó Ö ÓÑÓ ÙÒ ØÓ Óº Ò ×Ø Ñ Ö Ó¸ Ù Ò Ó Ð Ó Ö ÒØ ר ÔÓ × Ù ÙÒ Ö Ø ¸ × ÑÙÝ ÔÓ× Ð ÕÙ ¸ Ò ÐÙ Ö ÓÒ× Ö ÖÐ Ð × ÒØ Ó Ð Ó Ö ¸ ÕÙ × ÐÐ Ý ÓÑÓ ×Ø × Ö Ð Þ ¸ × ÓÒ ÙÒ ÓÒ ÕÙ Ò × Ð Ó Ö ÒØ Ý ÓÑÓ × Ð ÓÑÓ ÙØÓÖº ÈÓÖ Ð Ñ ×Ñ × Ö ÞÓÒ ×¸ Ñ ÒÙ Ó¸ Ð Ö Ø ÒØ Ò ÙÖÖ Ò Ð Ñ ×ÑÓ Ý ÖÖÓ ÓÒ ÒØÖ ×Ù Ö Ø ´× ×Ó ÓÖ × Ð ÔÙ Ø Ð Ö × µ Ò Ð Ô Ö×ÓÒ Ð Ð Ó Ö ÒØ ¸ × Ö¸ Ò Ð ÙØÓÖ¸ Ò ØÖ Ñ ÒØÓ Ð × ÒØ Ó Ð Ó Ö Ý ×Ù ÒרÖÙÑ ÒØ ÓÒº Ò Ð Ñ Ö Ó ÓÒ ×Ø ¸ Ð Ö Ø × ÓÒרÖÙ Ø Ú × × ÐÓ Ö ÒØ ÖÔÖ Ø Ö ÓÑÓ ÐÓ Ó¸ Ñ ÒØÖ × ÕÙ × ×ØÖÙ Ø Ú Ù Ò Ó × ÒØ Ò ÓÑÓ Ö ÔÖÓ º Ð ÔÖÓ Ð Ñ × ÕÙ Ð ÓÒ ÙÒ Ö Ð ÕÙ × ÓÒ Ð ÕÙ Ò ¸ Ó¸ Ð ÓÑÓ × ÓÒ Ð ÓÑÓ × ÕÙ Ò ÐÓ ¸ × Ô Ö Ð Ú ÐÓÖ × Ò Ð Ð Ö Ø ¸ Ù Ð ÒÓ × ÓØÖÓ ÕÙ Ñ ÓÖ Ö¸ Ô Ö× Ù Ö Ð Ü Ð Ò Ý¸ Ò ÙÐØ Ñ ÓÒ× Ù Ò ¸ Ð Ò Ò Ð Ù Ð ØÖ × Ò Ð Ó Ö º Ó Ö ÑÓ× Ð Ó ØÓ ×ØÙ Ó ×Ø Ô ØÙÐÓ × Ó× Ô Ö×Ô Ø Ú × Ð ¬ Ý Ð ¬ Ò º Ä ¬ ÓÒ ÖÒ ÕÙ × ÐÓ Ö Ð ØÓ × Ö¸ ÕÙ Ð Ð ÓÖ ØÑÓ Ð Ò Ð ¬Ò Ö ×ÓÐÚ Ö Ð ÔÖÓ Ð Ñ Ô Ö Ð Ù Ð Ù ×Ø Ò Óº ×ØÓ × Ð ÓÖÖ Ø ØÙ º Ä ¬ Ò Ø Ò ÕÙ Ø Ò Ò ÙÒ Ð ÓÖ ØÑÓ Ó ÔÖÓ Ö Ñ Ö Ð Þ ×Ù ×ÓÐÙ ÓÒ ÐÓ ÕÙ ÑÔÐ Ö ÕÙ ¸ Ô Ö ÔÓ Ö Ð Ö ¬ Ò ¸ ÔÖ Ú Ñ ÒØ Ö× × Ó ¬ Þº ÈÓ ÑÓ× Ö¸ ÒØÓÒ ×¸ ÕÙ Ð ¬ Ò Ø Ò ÓÑÓ × ÔÙ × Ö Ñ ÓÖ ¬ Þº Ë ÙÒ ÔÖÓ Ö Ñ ÒÓ × ÓÖÖ ØÓ¸ ÒØÓÒ × ÔÓ× Ð Ñ ÒØ ÒÓ Ø Ò × ÒØ Ó Ð Ö ¬ Ò º ÈÓÖ ×Ó¸ Ð ÓÖÖ Ø ØÙ ÔÖ Ñ Ð ¬ Ò ¸ ÔÙ × Ò Ú Ð Ð ÙÐØ Ñ × ÒÓ × Ð ÒÞ Ð ØÓ × Ö¸ × ÒÓ × Ö ×Ù ÐÚ Ð ÔÖÓ Ð Ñ º È Ö ×ØÙ Ö Ð ¬ Ò × Ö Ð Þ Ò Ò Ð × ×º Ò ×Ø × ÒØ Ó Ò ÔÖ ÙÒØ × ÓÑÓ Ù ÒØÓ ÙÖ Ð ÔÖÓ Ö Ñ Ù ÒØÓ× Ö ÙÖ×Ó× ÓÑÔÙØ ÓÒ Ð × ÓÒ×ÙÑ Ð × ÒØ Ó Ö Ø Ó ×Ó Ö ×Ø Ð × ÔÖ ÙÒØ × Ø ÖÑ Ò Ö Ð Ø Ð ÙÒ ÔÖÓ Ö Ñ Ý Ð × Ö ÙÒר Ò¹ × Ò ÕÙ ×Ø ÔÙ Ó Ù× Ö× º ÙÖ ÒØ ÙÒ Ò Ð × ×¸ × ÑÙÝ ÔÓ× Ð ÕÙ × Ö Ú Ð Ò ÓØÖ × ÓÖÑ × Ó Ú Ö ÒØ × Ô Ö Ö Ð ¹ Þ Ö Ð Ð ÓÖ ØÑÓ Ó ÔÖÓ Ö Ñ Ð ÙÒ × ÐÐ × ÐÓ Ñ ÓÖ Ö Ò¸ ÓØÖ × ÐÓ ÑÔ ÓÖ Ö Ò Ý ÓØÖ × Ú Ð Ö Ò Ð ÓÖ ØÑÓ× ÑÙÝ ×Ø ÒØÓ׺ Ò Ò ÙÖ ¸ Ð ÒØÖ Ò Ñ ÒØÓ Ò Ð Ò Ð × × Ð¹ ÓÖ ØÑÓ× Ö ÕÙ Ö ×Ù ÓÑÔÖ × ÓÒ Ðº ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ò Ð Þ Ö Ð ÓÖ ØÑÓ× × ÙÒ Ð × Ñ ÓÖ × Ñ Ò Ö × Ò Ö ÓÒÓ Ñ ÒØÓ ×Ó Ö ×Ù × ÒÓº Ù Ò Ó × Ø Ò Ð ÖÓ Ð ÔÖÓ Ð Ñ ¸ ÙÒ Ò Ð × × ÔÙ Ò Ö ×Ô ØÓ× ÓÖÖ Ø ØÙ º ÈÓÖ ÑÔÐÓ ÜØÖ ÑÓ¸ ÙÒ ÙÖ ÓÒ ÒÙÐ ¸ ÕÙ ÒÓ Ø Ò × ÒØ Ó ÓÒ Ö ØÓ¸ ÔÙ Ö Ò Ö¸ ÒÓ ×ÓÐÓ ÙÒ ÖÖÓÖ Ò Ð Ò Ð × ×¸ × ÒÓ Ò Ð Ð ÓÖ ØÑÓ Ñ ×ÑÓº Ò ÐÓ ÕÙ × Ù ¸ ÒØÓÒ ×¸ ÓÖ Ö ÑÓ× Ó× Ø Ñ × ÔÖ Ò Ô Ð × Ð Ò Ð × × Ð ÓÖ ØÑÓ×
  • 185.
    3.1. An´lisis dealgoritmos a 159 Ý ×Ù ÓÖÖ Ø ØÙ º Ñ Ó× Ø Ò Ò Ð Ö Ø ÒØ ÖÒ ¸ Р٠и ÒÓ ÑÓ× ÓÐÚ Ö¸ ÒÓ Ø Ò × ÒØ Ó × Ò ÙÒ Ô Ö×Ô Ø Ú Ö Ø ÜØ ÖÒ º 3.1 An´lisis de algoritmos a ÁÒØÙ Ø Ú Ñ ÒØ ¸ Ý Ó× Ñ ØÖ × ÙÒ Ñ ÒØ Ð × Ý Ð Ñ ÒØ Р׸ Ð × Ù Ð ×¸ Ò Ø ÓÖ ¸ Ô ÖÑ Ø Ò Ù ÒØ ¬ Ö Ð Ð ÙÒ Ð ÓÖ ØÑÓ ½º Ä ÙÖ ÓÒ Ð Ù ÓÒ¸ ÓÑÙÒÑ ÒØ ÐÐ Ñ Ø ÑÔÓ Ù ÓÒ ¸ Ð Ù Ð ÓÒ× ×Ø Ò Ñ Ö Ð Ø ÑÔÓ × ÕÙ × Ò Ð ÔÖÓ Ö Ñ ×Ø ÕÙ × ÙÐÑ Ò º Ò ×Ø × ÒØ Ó¸ Ñ ÒØÖ × ÙÒ ÔÖÓ Ö Ñ Ñ ÒÓ× ÙÖ ¸ Ñ ÓÖ ×Ø ׺ ¾º Ä ÒØ ÓÒ×ÙÑÓ ÓØÖÓ× Ö ÙÖ×Ó׿ Ò Ô ÖØ ÙÐ Ö¸ Ð Ñ ÑÓÖ º Å ÑÓ× ÐÓ× ÝØ × Ñ ÑÓÖ Ý ÓØÖÓ× Ö ÙÖ×Ó× ÕÙ Ó ÙÔ ÙÒ ÔÖÓ Ö Ñ ÙÖ ÒØ ×Ù Ù ÓÒº ÒØÖ Ó× ÔÖÓ Ö Ñ × ÓÑÔ Ö Ö¸ Ð ÕÙ ÓÒ×ÙÑ Ñ ÒÓ× Ö ÙÖ×Ó× × Ð Ñ ÓÖº Ì ÒØÓ Ð ÙÖ ÓÒ¸ ÓÑÓ Ð ÓÒ×ÙÑÓ Ö ÙÖ×Ó׸ Ô Ò Ò Ð ÓÒ¬ ÙÖ ÓÒ Ð ÒØÖ º ÍÒÓ ÐÓ× ØÓÖ × Ñ × ÑÔÓÖØ ÒØ × ×Ø ÓÒ¬ ÙÖ ÓÒ¸ Ô ÖÓ ÒÓ Ð ÙÒ Ó¸ × Ð Ø Ñ ÒÓ Ð ÒØÖ ¸ Ô٠׸ Ñ ÒØÖ × Ñ ÝÓÖ × ×Ø ¸ ÔÓ× Ð Ñ ÒØ Ñ ÝÓÖ × Ð ÒØ ØÓ× ÔÖÓ × Ö Ý Ñ ÝÓÖ × ÙÖ ÓÒ × Ý ÒØ × Ö ÙÖ×Ó× Ý ÕÙ ×Ø Öº Ò ×Ø ÓÖ Ò ×¸ Ò ÐÓ ÕÙ × Ù ¸ ÒÓ× Ö Ö Ö ÑÓ× T (n) ÓÑÓ ÙÒ ÙÒ ÓÒ ÕÙ × Ö Ð ÓÑÔÓÖØ Ñ ÒØÓ ÙÒ Ð ÓÖ ØÑÓ¸ × ÙÒ ×Ù ÙÖ ÓÒ Ó ×Ù ÓÒ×ÙÑÓ Ö ÙÖ×Ó׸ Ð Ø Ñ ÒÓ Ð ÒØÖ nº Td1 (n) Td2 (n) ¼ n1 n2 n ÙÖ ¿º½ ÍÒ ÑÔÐÓ Td Ð Ø Ñ ÒÓ n × ÙÒ Ô ÖØ Ð ÓÒ¬ ÙÖ ÓÒ¸ Р٠и Ò × ¸ ÓÒ× ×Ø Ò Ð ÓÖ Ò Ó Ô ÖÑÙØ ÓÒ Ò ÕÙ Ð Ô Ö Ð ÒØÖ Ð ÔÖÓ Ö Ñ º ÈÙ ×ØÓ ÕÙ ÓÒÓ Ö ØÓ × Ð × Ô ÖÑÙØ ÓÒ × ÔÓ× Ð × ÙÒ ÒØÖ × ÑÙÝ Ð ÓÖ Ó×Ó ´Ý ×Ù Ø ÚÓµ¸ Ò Ð Ò Ð × × ÙÒ Ð ÓÖ ØÑÓ × ×Ù Ð Ò ÑÔÐ Ö Ð ÙÒÓ× ×Ø ר Ó׸ ÐÓ× Ù Ð × ÐÓ× ÔÖ Ò Ô Ð × ×ÓÒ Ð ÔÖÓÑ Ó Ó ×Ô Ö ÒÞ Ý Ð Ñ Ü ÑÓº ¿ “otros” ÔÓÖÕÙ Ð Ø ÑÔÓ Ù ÓÒ ÔÙ Ø Ñ Ò ÓÒ× Ö Ö× ÓÑÓ ÙÒ Ö ÙÖ×Óº
  • 186.
    160 Cap´ ıtulo 3. Cr´ ıtica de algoritmos Ä × Ó × ÖÚ ÓÒ × ÒØ Ö ÓÖ × ×ÙÔÓÒ Ò ÕÙ Ð Ø Ñ ÒÓ Ð ÒØÖ ÔÙ ÜÔÖ × Ö× Ò ÙÒ ÓÒ ÙÒ ×ÓÐ Ú Ö Ð ¸ ÐÓ Ù Ð ÒÓ × ÑÔÖ × Ð ×Óº Ò Ð ÙÒ × Ö ÙÒר Ò ×¸ Ð Ø Ñ ÒÓ¸ Ù ÓØÖ Ù ÒØ ¬ ÓÒ Ö Ð ÒØÖ ¸ × ¬Ò Ò Ñ ÒØ ÙÒ ÙÒ ÓÒ ÑÙÐØ Ú Ö Ð º רÓ× ×Ó× ×ÓÒ¸ ÔÓÖ ×ÙÔÙ ×ØÓ¸ Ñ × ÓÑÔÐ Ó× ÕÙ Ð ÙÒ Ú Ö Ð º Ó× Ó× Ð ÓÖ ØÑÓ× A1 Ý A2¸ ÕÙ Ö ×Ù ÐÚ Ò Ð Ñ ×ÑÓ ÔÖÓ Ð Ñ ¸ Ù Ð ÐÓ× Ó× × Ñ ÓÖ Ç Ø Ú ÓÒ Ñ ÒØ Ð Ò Ó¸ ÔÓ ÑÓ× Ð ÙÐ Ö ÔÖ ÓÖ ¸ Ó × ¸ × Ò ÙØ Ö ÐÓ× Ð ÓÖ ØÑÓ׸ Ð × ÙÒ ÓÒ × ÙÖ ÓÒ Td (n) Ý Td (n) Ý Ð × ÙÒ ÓÒ × 1 2 ÓÒ×ÙÑÓ ×Ô Ó Te (n) Ý Te (n)º Ë ØÙÚ × ÑÓ× ×Ø × ÙÒ ÓÒ ×¸ ÒØÓÒ × Ø Ò Ö ÑÓ× Ö Ø Ö Ó× 1 2 ר ÒØ Ó Ø ÚÓ× Ý ÔÖ ×Ó× Ô Ö Öº ÈÓÖ ÑÔÐÓ¸ × Td Ü × Ð × ÓÖÑ × Ñ Ü Ñ × Ð ¬ ÙÖ ¿º½¸ ÒØÓÒ × × Ö ÑÓ× ÕÙ ¸ Ô Ö ÒØÖ × Ñ ÝÓÖ × n2 Td (n) × Ñ ÓÖ 2 ÕÙ Td (n)¸ ÔÙ × ×Ø ÙÐØ Ñ × Ð ÕÙ Ø Ò Ñ ÝÓÖ ÙÖ ÓÒº 1 Ð Ò Ð × × ÒØ Ö ÓÖ ×ÓÐÓ × ÔÓ× Ð × × ÔÙ Ò ÓÒÓ Ö ÔÖ ÓÖ Ð × ÓÖÑ × Td (n) 1 Ý Td (n)º Ä Ñ ÒØ Ð Ñ ÒØ ¸ ×ÙÑ Ö Ø Ð ÔÓ× Ð 2 ÒÓ × Ô Ö Ò Ö Ð ×Ø ¸ Ô٠׸ Ô Ö Ð ×Ó Ò Ö Ð¸ × ÜØÖ Ñ Ñ ÒØ Ð Ð ÙÐ Ö ÔÖ ÓÖ Td(n)º È Ö ÔÖ Ò Ö Ð ÔÓÖÕÙ ×Ø ¬ ÙÐØ × Ò × Ö Ó ÓÑÔÖ Ò Ö ÕÙ Ð ÙÐ Ö Td(n) Ö ÕÙ Ö ÓÒØ Ö Ð ÒØ ÒרÖÙ ÓÒ × ÕÙ ÙØ Ö Ð × Ù Ò ¬Ò Ø ÒÓÑ Ò Ð ÓÖ ØÑÓº ÓÖØÙÒ Ñ ÒØ ¸ ÒÓ × ÓÒÚ Ò ÒØ ÓÒÓ Ö ÓÒ ÔÖ × ÓÒ Td(n)¸ Ô٠׸ Ð ÔÓ×ØÖ ¸ Ð ÙÖ ÓÒ Ö Ð Ô Ò Ö ØÓÖ × ×Ù Ø ÚÓ× ÕÙ ÑÓ ¬ Ö Ò Ð ÓÖÑ Ü Ø Td(n)º Ò ØÓ¸ Td(n) Ø Ò Ö ÓÖÑ × Ö ÒØ × × ÙÒ Ð × Ö ÙÒר Ò × Ù ÓÒ Ð Ð Ó¹ Ö ØÑÓº ÒØÖ Ø Ð × Ö ÙÒר Ò × ×Ø Ö Ð × × Ù ÒØ × Ö Ø Ö ×Ø × ¯ Caracter´ ısticas materiales del computador Ü ×Ø Ò ÑÙ × ÖÕÙ Ø ØÙÖ × ¹ Ö ÒØ × ÓÑÔÙØ ÓÖ ×º Ð ÙÒ × ÖÕÙ Ø ØÙÖ × × ÔÖ ×Ø Ò Ñ ÓÖ Ô Ö ÙÒ Ð × ÔÖÓ Ð Ñ × ÕÙ ÓØÖ ×º ÈÓ× Ð Ñ ÒØ ¸ ÙÒ Ð ÓÖ ØÑÓ Ø Ò Ö ÙÖ ÓÒ × ×Ø ÒØ × Ò ÖÕÙ Ø ØÙÖ × ×Ø ÒØ ׺ ÙÒ ÒØÖ ÖÕÙ Ø ØÙÖ × ÓÑÓ Ò ×¸ Ü ×Ø Ò Ö Ò × × ÔÓÖ Ð Ú ÐÓ Ð Ö ÐÓ ¸ ÒØ Ñ ÑÓÖ ¸ × ×Ø Ñ ÓÔ Ö Ø ÚÓ¸ ÒÙÑ ÖÓ ÔÖÓ ×Ó× ÕÙ ØÙ ÐÑ ÒØ Ð Ö Ù Ð ÓÑÔÙØ ÓÖ¸ ÒØÖ ÓØÖÓ× ØÓÖ × ÕÙ Ò Ò Ò Ð ÙÖ ÓÒ ÙÒ ÔÖÓ¹ ÖѺ ¯ Caracter´ ısticas de la codificaci´n ÙÒ Ð ÓÖ ØÑÓ × ÒרÖÙÑ ÒØ o Ò Ð ÙÒ ÐÒÙ ÔÖÓ Ö Ñ ÓÒº Ä Ò Ù × Ö ÒØ × ÕÙ Ó ¬ÕÙ Ò Ð Ñ ×ÑÓ Ð ÓÖ ØÑÓ ÔÖÓ Ù Ö Ò ÔÖÓ Ö Ñ × ÓÒ ÙÖ ÓÒ × Ö ÒØ ׺ Ò Ò ÙÖ ¸ ÐÓ× ÔÖÓ Ö Ñ ÓÖ × Ø Ñ Ò ¬ Ö Ò Ò ×Ù× ×Ø ÐÓ× Ó ¬ ÓÒº ÍÒ Ð ÓÖ ØÑÓ ÑÔÐ ÒØ Ó ÔÓÖ Ó× ÔÖÓ Ö Ñ ÓÖ × Ò ÙÒ Ñ ×ÑÓ Ð Ò Ù Ý ÙØ Ó Ò ÙÒ ×ÓÐÓ ÓÑÔÙØ ÓÖ ÔÖÓ Ð Ñ ÒØ Ü Ö Ö Ò × Ò Ð Ø ÑÔÓ Ù ÓÒº ¯ Caracter´ ısticas del c´digo generado por el compilador ÐÓ× ÓÑÔ Ð ÓÖ × o ¬ Ö Ò Ò Ð ØÖ Ù ÓÒ Ð Ó Ó Ù ÒØ Ð Ó ØÓº × ×Ø ÒØ ÔÖÓ Ð ÕÙ Ó× ÓÑÔ Ð ÓÖ × Ö ÒØ × Ò Ö Ò ØÖ Ù ÓÒ × Ö ÒØ × ÙÒ Ñ ×ÑÓ ÔÖÓ Ö Ñ Ý¸ ÔÓÖ Ø ÒØÓ¸ Ó× ÔÖÓ Ö Ñ × Ü Ö Ò Ø ÑÔÓ× Ù ÓÒ Ö ÒØ ׺ רÓ× ØÓÖ ×¸ ÒØÖ ÓØÖÓ× Ñ ×¸ Ø ÖÓ Ò Ó× ÒØÖ × ¸ Ò Ñ × Ö ÙÓ¸ ݸ Ñ ×¸ ÑÔÖ Ø Ó¸ ÒÓ ×ÓÐÓ ÓÒÓ Ö Ð ÓÖÑ Ü Ø T (n)¸ × ÒÓ ÜÔÖ × Ö Ð Ø ÑÔÓ Ù ÓÒ ÙÒ ÔÖÓ Ö Ñ Ò Ð ÙÒ ÙÒ ×Ô ¬ Ý ÔÖ × º ÑÓ׸ Ô٠׸ Ò Ö ÙÒ Ö Ø Ö Ó Ò Ð × × ÕÙ ÐÙ ÐÓ× ØÓÖ × Ñ Ò ÓÒ Ó׺
  • 187.
    3.1. An´lisis dealgoritmos a 161 3.1.1 Unidad o paso de ejecuci´n o ÓÑÓ Ý ÐÓ × Ò Ð ÑÓ׸ Ò Ð Þ Ö ÙÒ Ð ÓÖ ØÑÓ ÓÒ× ×Ø Ò ÓÒØ Ö Ð ÒØ ÒרÖÙ ÓÒ × Ó Ô ×Ó× Ù ÓÒ ÕÙ ×Ø ÙØ º ÉÙ × ÙÒ Ô ×Ó Ù ÓÒ Ò ÔÖ Ò Ô Ó¸ ÔÓ ÑÓ× Ö ÕÙ × Ð Ñ Ò Ñ ÒרÖÙ ÓÒ ÕÙ × ÔÙ ÙØ Öº ר ÒÓ ÓÒ ×Ø Ð ÙÒ Ö ÒÓ Ñ Ò ÑÓ ÕÙ ÒÓ× Ô ÖÑ Ø Ù ÒØ ¬ Ö Ð ÙÖ ÓÒ ÙÒ Ð ÓÖ ØÑÓ × Ò ÓÒ× Ö Ö Ð Ø ÑÔÓ ×ÓÐÙØÓ Ù ÓÒº ÉÙ × ÓÒ× Ö ÓÑÓ ÙÒ Ñ Ò Ñ ÒרÖÙ ÓÒ Ä × ÓÒ× Ö ÓÒ × ÒØ Ö ÓÖ × Ö ­ Ò ÐÓ Ð ÕÙ × × ÒØ Ö ×Ø ÙÑ Ö Ðº ÈÓÖ Ø Ð Ö ÞÓÒ¸ ÓÒ× Ö Ö ÑÓ× ÙÒ Ô ×Ó Ù ÓÒ ÓÑÓ Ù ÐÕÙ Ö × Ù Ò Ù ÓÒ ÙÝ ÙÖ ÓÒ × ÓÒר ÒØ º ÌÖ Ò× ÑÓ× ÔÓÖ ÐÓ ÓÒר ÒØ × Ò × Ö Ù Ð × Ð ÙÖ ÓÒ Ö Ðº ÈÖÓÔ ÑÓ× Ð ÒØ Ò Ñ ÒØÓ Ñ ÒØ Ð ÙÒÓ× ÑÔÐÓ׺ Ä × Ù ÒØ ÒרÖÙ ÓÒ ½½ ÑÔÐÓ ½ Ô ×Ó Ù ÓÒ ½ ½ ≡ ´½ ½ µ x = y; × ÓÒ× Ö ÙÒ Ô ×Ó Ù ÓÒº Ú Þ ÕÙ Ð ­Ù Ó Ô × ÔÓÖ ×Ø ÒרÖÙ ÓÒ¸ ×Ù Ù ÓÒ Ø Ò Ö ÙÒ ÙÖ ÓÒ Ñ Ü Ñ ÓÒר ÒØ Ñ ÒØ ÓØ º Ò Ð Ñ ×ÑÓ × ÒØ Ó ½½ ÑÔÐÓ ¾ Ô ×Ó Ù ÓÒ ½ ½ ≡ ´½ ½ µ x = y + z; ÙÝ ÙÖ ÓÒ × Ñ ÝÓÖ ÕÙ Ð ÑÔÐÓ ½ Ô ×Ó Ù ÓÒ ½ ½ ¸ Ø Ñ Ò ×Ø ÓÒר Ò¹ Ø Ñ ÒØ ÓØ ÔÓÖ Ø ÒØÓ¸ Ð ÑÔÐÓ ¾ Ô ×Ó Ù ÓÒ ½ ½ Ø Ñ Ò × ÓÒ× Ö ÙÒ Ô ×Ó Ù ÓÒº ÍÒ × Ù Ò ÒרÖÙ ÓÒ × Ø Ð ÓÑÓ Ð × Ù ÒØ ½½ ÑÔÐÓ ¿ Ô ×Ó Ù ÓÒ ½ ½ ≡ ´½ ½ µ x = h; if (x < y) { x = y + z; a = b*c; } else { x = p + q + r; a = b + c; } ÔÙ ÓÒ× Ö Ö× Ñ × ÓרÓ× ÕÙ ÑÔÐÓ ¾ Ô ×Ó Ù ÓÒ ½ ½ ¸ × Ò Ñ Ö Ó¸ Ò Ô Ò ÒØ Ñ ÒØ Ð Ú ÐÓÖ Ð ÔÖ Ó Ý ÐÓ Ð Ö ÕÙ ÔÙ × Ö Ð Ù ÓÒ Ù ÐÕÙ Ö ÐÓ× ÐÓÕ٠׸ ÑÔÐÓ ¿ Ô ×Ó Ù ÓÒ ½ ½ × ÙÒ Ô ×Ó Ù ÓÒ¸ ÔÙ × ×Ø Ø Ò ÙÒ ÙÖ ÓÒ ÕÙ ÔÙ ÓØ Ö× ÔÓÖ ÙÒ ÓÒר ÒØ º Ð ÐÓÕÙ Ö Ô Ø Ø ÚÓ ½½ ÑÔÐÓ Ô ×Ó Ù ÓÒ ½ ½ ≡ ´½ ½ µ for (i = 0; i < 100000; i++) a[i] = b[i] + c[i]; Ø Ñ Ò Ø Ò ÙÒ ÙÖ ÓÒ ÓÒר ÒØ Ý × ÓÒ× Ö ¸ ÓÒ× Ù ÒØ Ñ ÒØ ¸ ÙÒ Ô ×Ó ¹ Ù ÓÒº Ò ÐÑ ÒØ ¸ Ð Ù ÓÒ × Ù Ò Ð ØÓ Ó× ÐÓ× ÐÓÕÙ × ÒØ Ö ÓÖ × ½½ ÍÐØ ÑÓ ÑÔÐÓ Ô ×Ó Ù ÓÒ ½ ½ ≡ ÑÔÐÓ ½ Ô ×Ó Ù ÓÒ ½ ½ ÑÔÐÓ ¾ Ô ×Ó Ù ÓÒ ½ ½
  • 188.
    162 Cap´ ıtulo 3. Cr´ ıtica de algoritmos ÑÔÐÓ ¿ Ô ×Ó Ù ÓÒ ½ ½ ÑÔÐÓ Ô ×Ó Ù ÓÒ ½ ½ Ø Ñ Ò × ÙÒ Ô ×Ó Ù ÓÒ¸ ÔÙ × ×Ù ÙÖ ÓÒ¸ Ô × Ö ÕÙ ÓÑÔÖ Ò Ð ØÓ Ó× ÐÓ× ÐÓÕÙ × ÒØ Ö ÓÖ ×¸ Ø Ñ Ò × ÓÒר ÒØ º Ô ÖØ Ö ×Ø ÑÓÑ ÒØÓ¸ ÙÒ unidad de ejecuci´n se define como una secuencia o de instrucciones cuya duraci´n es constanteº ×ØÓ ÓÒÐÐ Ú ÖÖÓÖ ×¸ Ô ÖÓ Ö ÓÖ ÑÓ× o ÕÙ Ð Ø ÑÔÓ Ù ÓÒ Ú Ö × ÙÒ Ö ÙÒר Ò × Ò × Ð Ð ÓÖ ØÑÓº Ù ÐÕÙ Ö × Ð Ø Ñ ÒÓ Ý ×ÔÓ× ÓÒ Ð ÒØÖ ¸ ÙÒ ­Ù Ó Ù ÓÒ × ÑÔÖ Ø Ò Ö ÙÖ ÓÒ ÓÒר ÒØ Ú Þ ÕÙ Ô × ÔÓÖ Ð ÙÒ ÒרÖÙ ÓÒ × Ù Ò Ðº Ò Ð Ñ ×ÑÓ ×Ô Ö ØÙ Ö ÞÓÒ Ñ ÒØÓ¸ Ù ÐÕÙ Ö × Ù Ò ÒרÖÙ ÓÒ × ÓÒ ÙÖ ÓÒ ÓÒר ÒØ Ø Ñ Ò × ÓÒ× Ö ÙÒ ÙÒ Ù ÓÒº × ÑÔÓÖØ ÒØ ר Ö Ð × Ö ¬ Ó ÕÙ ÑÔÓÒ ÒÙ ×ØÖÓ ÓÒ ÔØÓ ÙÒ ¹ Ù ÓÒ Ð ÓÒ× Ö Ö ÓÑÓ ÓÒר ÒØ ¸ ÐÓ ÕÙ Ó ×¸ Ò Ð Ñ ÝÓÖ ÐÓ× ×Ó׸ Ú Ö ¹ Ð º Ð ÓÒ ÔØÓ ÕÙ Ô Ö ¸ ÔÓÖ ÑÔÐÓ¸ ÙÒ × Ù Ò Þ ÒרÖÙ ÓÒ × ÓÒ ÙÒ ÙÒ Ñ ÐÐÓÒ¸ ÔÙ × Ò Ñ Ó× ×Ó× × ÓÒÓ Ò Ð × ÓÒר ÒØ × Þ Ý ÙÒ Ñ ÐÐÓÒ¸ Ö ×Ô Ø Ú Ñ ÒØ º Ë Ò Ñ Ö Ó¸ ר Ð ÖÓ ÕÙ ÑÙÝ ÔÖÓ Ð Ñ ÒØ Ð Ù ÓÒ Ð ÔÖ Ñ Ö × Ù Ò ÙÖ 10 5 Ú × Ñ ÒÓ× ÕÙ Ð × ÙÒ º Ó Ð ÓÒ Ò Ð × Ö ¬ Ó ÒØ Ö ÓÖ¸ Ð Ú ÒØ Ð ÓÒ ÔØÓ × ÕÙ Ð Ö Ø Ö ÓÒר ÒØ ÒÓ × Ô Ö ÓÒ ÐÓ Ú Ö Ð Ð ÒØÖ º Ò Ô Ð ¹ Ö × Ñ × × ÑÔР׸ × Ù Ò × Ù ÓÒ ÙÝ × ÐÓÒ ØÙ × × Ò ×Ø ÒØ × Ô ÖÓ ÓÒר ÒØ ׸ × ÑÔÖ Ø Ò Ö Ò ÙÖ ÓÒ × ÓÒר ÒØ × ÕÙ ÒÓ ×ÓÒ Ø × ÔÓÖ Ð Ø Ñ ÒÓ Ð ÒØÖ º ×ØÓ ÙÐØ ÑÓ × ÐÓ ÔÖ Ð Ð ÓÒ ÔØÓº 3.1.2 Aclaratoria sobre los m´todos de ordenamiento e Ò ×Ø Ô ØÙÐÓ ÒÓ× × ÖÚ Ö ÑÓ× Ð ÙÒÓ× Ñ ØÓ Ó× ÓÖ Ò Ñ ÒØÓ Ô Ö ÐÙ×ØÖ Ö Ð Ò Ð×× Ð ÓÖ ØÑÓ׸ ÔÙ × ×ØÓ× ÔÐ ÒØ Ò Ò ØÙÖ ÐÑ ÒØ Ð Ø Ñ ÒÓ Ð ÒØÖ Ò × Ð ÒØ Ð Ñ ÒØÓ× ÓÖ Ò Öº Ò Ò ÙÖ ¸ Ð Ô ÖÑÙØ ÓÒ Ð × Ù Ò ÒØÖ Ò Ò Ð × ÑÔ ÒÓ Ð Ñ ÝÓÖ ÐÓ× Ñ ØÓ Ó× ÓÖ Ò Ñ ÒØÓº ÈÓÖ ×Ø Ö ÞÓÒ¸ Ù Ò Ó × Ò Ð Þ ÙÒ Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓ¸ Ý ÕÙ ÓÒ× Ö Ö¸ ÔÓÖ ÐÓ Ò Ö Ð ÓÒ Ö Ø Ö Ó× ×Ø ר Ó׸ Ð ÓÖÑ Ð Ô ÖÑÙØ ÓÒº Ô ÖØ ÙÒ Ö ÓÑÓ ÙÒ Ù Ò Ú ÙÐÓ Ò× Ò ÒÞ Ô Ö Ð Ò Ð × × Ý × ÒÓ Ð ÓÖ ØÑÓ׸ ÐÓ× Ñ ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ×ÓÒ Ô ÖØ ÐÓ× ÓÒÓ Ñ ÒØÓ× × Ò Ð × ØÓ Ó Ù Ò ÔÖÓ Ö Ñ ÓÖº Ò ØÓ¸ Ð ÓÖ Ò Ñ ÒØÓ × Ù× Ò ÙÒ ÑÔÐ Ñ ÔÖÓ Ð Ñ × Ñ × ÓÑÔÐ Ó׺ ÈÓÖ ÑÔÐÓ¸ Ò Ö Ó׸ Ñ ØÓ ÕÙ ×ØÙ Ö ÑÓ× Ò Ð Ô ØÙÐÓ Ü ¸ Ú × × Ö ÕÙ Ö Ò ÓÖ Ò Ö Ö Ð ÓÒ × ÓÑÓ ÔÖ ÔÖÓ × Ñ ÒØÓ Ð ÙÒÓ× Ð ÓÖ ØÑÓ׺ ÇØÖÓ ÑÔÐÓ ÒÓØ Ð × Ò Ù ÒØÖ Ò Ð × ÖÓÒ ÓÒÚ ÜÓ ¸ ÔÖÓ Ð Ñ Ð ÓÑ ØÖ ÓÑÔÙØ ÓÒ Ð ÕÙ ÓÒ× ×Ø Ò Ò ÓÒØÖ Ö ÙÒ ÔÓÐ ÓÒÓ ÕÙ ÒÚÙ ÐÚ ÙÒ ÓÒ ÙÒØÓ ÔÙÒØÓ׺ ÍÒ Ð ÓÖ ØÑÓ × ÑÔÐ Ý ¬ ÒØ Ô Ö ×Ø ÔÖÓ Ð Ñ Ö ÕÙ Ö ÓÖ Ò Ö ÐÓ× ÔÙÒØÓ× × ÙÒ ×Ù× ÓÓÖ Ò ×º ÄÓ× Ñ ØÓ Ó× ÓÖ Ò Ñ ÒØÓ¸ × ÓÑÓ ÓØÖÓ× ÙØ Ð Ø Ö Ó× Ö Ð ÓÒ Ó׸ Ö × Ò Ò Ð Ö ÚÓ tpl sort utils.Hº 3.1.3 Ordenamiento por selecci´n o Ê Ð ÑÓ× ÒÙ ×ØÖÓ ÔÖ Ñ Ö Ò Ð × × ØÖ Ú × Ð ÒÓ ÓÒ Ô ×Ó Ù ÓÒº È Ö ÐÐÓ ÓÒ¹ × Ö ÑÓ× Ð Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓ × Ð ÓÒ¸ Ð Ù Ð ÔÙ ÔÐ ×Ñ Ö× Ô ØÓÖ Ñ ÒØ ÓÑÓ × Ù
  • 189.
    3.1. An´lisis dealgoritmos a 163 swap[a[i], a[j]) ×ÓÖ Ò ÇÖ Ò ×ÓÐÙØÓ j × i ר n − 1 Ô Ö Ò ÓÒØÖ Ö Ð Ñ ÒÓÖ Ð Ñ ÒØÓ i j Ò ×Ø Ð × Ö Ñ ¸ Ð Ö Ø Ò ÙÐÓ ÔÖ Ò Ô Ð Ö ÔÖ × ÒØ Ð ÖÖ ÐÓº ÄÓ× ×Ù ¹ Ö Ø Ò ÙÐÓ× ÒØ ÖÒÓ× Ö ÔÖ × ÒØ Ò Ô ÞÓ× Ð ÖÖ ÐÓ ÕÙ ÓÒ ÖÒ Ò ×Ù ×Ø Ó ÓÖ ¹ Ò Ñ ÒØÓº Ä × ­ ׸ ÙÒØÓ ÓÒ Ð ÙÒ ÒÓÑ Ö Ú Ö Ð ¸ Ò ÙÒ ÓÒØ ÓÖ Ó Ø Ö ÓÖ ÙÒØÓ ÓÒ ×Ù × ÒØ Ó Ø Ö ÓÒº ÆÙ ×ØÖ ÑÔÐ ÒØ ÓÒ Ð ÓÖ Ò Ñ ÒØÓ ÔÓÖ × Ð ÓÒ × ×ØÖÙ ØÙÖ Ð × Ù ÒØ ÑÓ Ó ÙÝ ÑÔÐ ÒØ ÓÒ × ½¿ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ ≡ ½¿ template <typename T, class Compare> void selection_sort(T * a, const size_t & n) { for (int i = 0, min, j; i < n - 1; ++i) { Ë ÑÒ Ð Ò Ñ ÒÓÖ ÒØÖ · ½ Ý Ò ¹ ½ ½ ¿ if (Compare () (a[min], a[i])) Aleph::swap(a[min], a[i]); } } Ä Ù×ÕÙ Ð Ñ ÒÓÖ Ð Ñ ÒØÓ × Ö Ð Þ × Ù Ò ÐÑ ÒØ Ð × Ù ÒØ Ñ Ò Ö ½¿ Ë ÑÒ Ð Ò Ñ ÒÓÖ ÒØÖ · ½ Ý Ò ¹ ½ ½ ¿ ≡ ´½ ¿ µ for (min = i, j = i + 1; j < n; ++j) if (Compare () (a[j], a[min])) min = j; Ð Ñ ÝÓÖ Óר Ð if Ò ÐÙ Ó Ò Ð ÐÓÕÙ Ë Ñ Ò Ð Ò Ñ ÒÓÖ ÒØÖ ·½Ý Ò ¹ ½ ½ ¿ × ÕÙ Ð ÔÖ Ó× ÖØÓº Ë ×Ø Ù × Ð ×Ó¸ Ð ÙÖ ÓÒ Ð if ÙÒ Ô ÖÑ Ò ÓÒר ÒØ Ñ ÒØ ÓØ º ÓÒ ÐÙ ÑÓ׸ Ô٠׸ ÕÙ Ð ÐÓÕÙ ÒØÖÓ Ð for ØÓÑ ÙÒ ÙÒ Ù ÓÒº ÈÓÖ ÐÓ Ø ÒØÓ¸ Ð ÐÓÕÙ Ë Ñ Ò Ð Ò Ñ ÒÓÖ ÒØÖ · ½ÝÒ¹½½¿ ÙØ n − i − 1 Ô ×Ó× Ù ÓÒ¸ Ð Ù Ð ÔÙ ÔÖÓÜ Ñ Ö× ¸ ÓÒ ÙÒ Ð ÖÓ ÖÖÓÖ¸ n − iº ר ÑÓ Ó¸ Ð Ñ ØÓ Ó ØÓÑ n−2 n−1 n−1 n(n − 1) n(n − 1) T (n) = n−i= n− i = (n − 1)n − 2 = Ù ÓÒ 2 È ×Ó× i=0 i=1 i=1 ´¿º½µ ×ØÓ ÒÓ× Ö Ú Ð ÕÙ ¸ Ò Ô Ò ÒØ Ñ ÒØ ÕÙ Ø Ò ÑÓ× ÙÒ ÓÑÔÙØ ÓÖ ÑÙÝ Ö Ô Ó Ó ÑÙÝ Ð ÒØÓ¸ Ý Ñ × Ó× Ò Ö × × ÔÖ × ÒØ × Ò ¿º½º½¸ Ð Ø ÑÔÓ Ù ÓÒ Ö Ù Ö Ø Ñ ÒØ × ÙÒ Ð ÒÙÑ ÖÓ Ð Ñ ÒØÓ× ÕÙ ×Ø ÑÓ× ÓÖ Ò Ò Óº ÈÙ Ò ÓÒ¹ ØÖ Ö× Ð ÙÒ Ñ ØÓ Ó¸ Ó Ø ÚÓ¸ ÕÙ Ö Ø Ö Ð Ø ÑÔÓ Ù ÓÒ¸ × Ò ÓÒ× Ö Ö ÐÓ× ×Ô ØÓ× Ö Ð Ø ÚÓ× Ä Ö ×ÔÙ ×Ø × ¬ÖÑ Ø Ú Ý Ð ÓÖ Ö ÑÓ× Ò Ð × Ù ÒØ ×Ù ¹× ÓÒº Ü Ø Ñ ÒØ Ð Ñ ×ÑÓ Ð ÓÖ ØÑÓ ÔÙ ÒרÖÙÑ ÒØ Ö× Ô Ö ÓÖ Ò Ö Ð ×Ø × Ó Ð Ñ ÒØ ÒÐ Þ × ÙÝÓ ÒÓ Ó Ö × Ø ÔÓ Dlinkº È ÖÓ Ô Ö ÐÐÓ¸ × ÓÒÚ Ò ÒØ ÒרÖÙ¹ Ñ ÒØ Ö ÙÒ ÖÙØ Ò ÕÙ Ù×ÕÙ Ð Ñ ÒÓÖ Ð Ñ ÒØÓ ÙÒ Ð ×Ø ÒÐ Þ ½¿ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½¿ ½
  • 190.
    164 Cap´ ıtulo 3. Cr´ ıtica de algoritmos template <class Compare> Dlink * search_min(Dlink & list) { typename Dlink::Iterator it(list); Dlink * min = it.get_current(); for (it.next(); it.has_current(); it.next()) { Dlink * curr = it.get_current(); if (Compare () (curr, min)) min = curr; } return min; } ¬Ò × search min¸ Ù× Ò ÙÒ × ½ Ò ½ º × ÜØÖ Ñ Ñ ÒØ ÑÔÓÖØ ÒØ ÒÓØ Ö ÕÙ Ð Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓ Ö Ð Ø ÔÓ Dlink¸ × Ð Ù Ð ÒÓ × ÔÙ ÓÒÓ Ö Ò Ö Ñ ÒØ Ð Ø ÔÓ ØÓ ÕÙ Ô ÖÑ Ø Ö Ð Þ Ö Ð × ÓÑÔ Ö ÓÒ × ÕÙ ÓÒ Ù Ö Ò Ð ÓÖ Ò Ñ ÒØÓº ÂÙר Ñ ÒØ ¸ ר × Ð ¬Ò Ð Ð × Compare¸ Ð Ù Ð ÑÔÐ ÒØ Ö Ð ÓÔ Ö ÓÖ bool Compare::operator () (Dlink *, Dlink *) Ý ÕÙ × Ò Ö ÓÑÔ Ö Ö Ó× ÒÓ Ó× ÔÙÒØ Ó× ÔÓÖ Ú Ö Ð × Dlink*º ÈÓ Ö ÑÓ× ÑÔÐ ÒØ Ö Ð ÓÖ Ò Ñ ÒØÓ Ð ×Ø × Ô ÖØ Ö Ð Ø ÔÓ Dnode<T>¸ × Ù Ð Ý ÓÒÓ Ö ÑÓ× ÙÒ Ø ÔÓ × º È ÖÓ ×Ø × ÓÒ Ü ÐÙ Ö Ð ÓÖ Ò Ñ ÒØÓ Ð ×Ø × × × Ò ÓØÖÓ× Ù×Ó× Dlink ÔÓÖ ÑÔÐÓ¸ ×ÙÔÓÒ ÑÓ× Ð × Ù ÒØ רÖÙ ØÙÖ ÒÓ Ó struct Nodo { Dlink enlace_lista_1; Dlink enlace_lista_2; Dlink enlace_lista_3; D1 d1; D2 d2; D3 d3; }; ר Ð × ÒÓ Ó ÒÓ ÔÓ Ö ÓÖ Ò Ö× ÔÓÖ ÙÒ ÖÙØ Ò Ò Ö ÓÖ Ò Ñ ÒØÓ × Ò ÙÒ Dnode<T>¸ ÔÙ × Ð Ø ÔÓ ÑÔÐÓ Nodo ÒÓ × ÙÒ Dnode<T>º Ò Ò ÙÖ ¸ Nodo Ø Ò ØÖ × ÒÐ × ÕÙ × Ò Ò Ò Ð ×Ø × Ö ÒØ ׺ ÓÑÓ ÓÖ Ò ÑÓ× Ò Ö Ñ ÒØ × ÙÒ Ù ÐÕÙ Ö Ð × ØÖ × Ð ×Ø × Ä Ö ×ÔÙ ×Ø ÓÒ× ×Ø Ò Ð Ö Ð ÓÑÔ Ö ÓÒ bool Compare::operator () (Dlink *, Dlink *)º ÈÓÖ ÑÔÐÓ¸ × × ÑÓ× ÓÖ Ò Ö Ð Ð ×Ø 1 × ÙÒ Ð ØÖ ÙØÓ d1¸ ÔÓ ÑÓ× ÖÐÓ ÓÑÓ × Ù struct Comparar_D1 { bool operator () (Dlink * l1, Dlink* l2) { Nodo * n1 = Dlink::dlink_to_Node(l1); Nodo * n2 = Dlink::dlink_to_Node(l2); return n1->d1 < n2->d1; } } Ò ÐÓ Ñ ÒØ ¸ ÔÓ ÑÓ× Ö Ð Þ Ö ÓÑÔ Ö ÓÒ × Ô Ö ÐÓ× Ø ÔÓ× D2 Ý D3 Ý × ÓÖ Ò Ö ÔÓÖ ÐÓ× ÒÐ × enlace lista 2 Ý enlace lista 3º
  • 191.
    3.1. An´lisis dealgoritmos a 165 ÓÒ ÐÓ ÒØ Ö ÓÖ Ò Ñ ÒØ ¸ Ð ÓÖ Ò Ñ ÒØÓ ÔÓÖ × Ð ÓÒ × ÜÔÐ ÔÓÖ × Ñ ×ÑÓ ½ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½¿ ½ template <class Compare> void selection_sort(Dlink & list) { Dlink aux; while (not list.is_empty()) { Dlink * min = search_min <Compare> (list); // menor de list min->del(); // saque menor de list aux.append(min); // ins´rtelo ordenado en aux; e } list.swap(&aux); } Í× × search min ½ ¿ º ר Ú Ö× ÓÒ ÜÔÖ × Ñ ÓÖ Ð ÔÖ Ò Ô Ó Ð Ñ ØÓ Ó Ù× Ö Ð Ñ ÒÓÖ Ð Ñ ÒØÓ Ò× ÖØ ÖÐÓ Ò ÙÒ Ð ×Ø º Ä Ð ×Ø Ö ×ÙÐØ ÒØ ר Ö ÓÖ Ò º Ð Ñ ØÓ Ó × Ð Ñ ×ÑÓ ÕÙ ÔÐ ÑÓ× Ù Ò Ó ÓÖ Ò ÑÓ× Ö ×º Ð Ù× Ö bool Compare::operator () (Dlink *, Dlink *) ÓÑÓ Ö Ø Ö Ó Ò Ö Ð ÓÑÔ Ö ÓÒ ÔÖ Ø Ò × ÖÚ Ö Ô Ö ØÓ × Ð × Ö ÙÒר Ò × ÓÖ Ò Ñ ÒØÓ Ð ×Ø × ÒÐ Þ ×º Ë Ò Ñ Ö Ó¸ Ò Ð Ñ ÝÓÖ Ð × Ö ÙÒר Ò ×¸ × ØÖ Ø Ö ÓÖ Ò Ö ÙÒ Ð ×Ø Dnode<T>¸ Ò Ð Ù Ð × × ÓÒÓ Ð Ø ÔÓº È Ö Ò ÙÐÞ Ö Ð ×ÙÒØÓ¸ × Ò Ö ÑÓ× Ð Ú Ö× ÓÒ Ò Ö bool Compare::operator () (Dnode<T> *, Dnode<T> *) Ð Ù Ð × Ö Ð Ö Ø Ö Ó ÓÑÔ Ö ÓÒ ÔÓÖ ÓÑ × ÓÒ ½ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½ ½ template <typename T, class Compare> class Compare_Dnode { bool operator () (Dlink * l1, Dlink * l2) const { Dnode<T> * n1 = static_cast<Dnode<T>*>(l1); Dnode<T> * n2 = static_cast<Dnode<T>*>(l2); return Compare () (n1->get_data(), n2->get_data()); } }; ¬Ò × Compare Dnode¸ Ù× Ò ÙÒ × ½ Ò ½ º Í× × Dnode º ר ÑÓ Ó¸ ÔÓ ÑÓ× ÜÔÓÖØ Ö ÙÒ ×Ô Ð Þ ÓÒ selection sort() ÕÙ ÓÒ× Ö ÙÒ Ö Ø Ö Ó ÓÑÔ Ö ÓÒ ÐÓ× ÓÒØ Ò Ó× ÐÓ× ÒÓ Ó× ½ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½ ½ template <typename T, class Compare> void selection_sort(Dnode<T> & list) {
  • 192.
    166 Cap´ ıtulo 3. Cr´ ıtica de algoritmos selection_sort < Compare_Dnode<T, Compare> > (list); } Í× × Compare Dnode ½ Ò Dnode º 3.1.4 B´squeda secuencial u ÒØ × Ô × Ö ×ØÙ Ö ÙÒ ÓÖÔÙ× Ó Ø ÚÓ Ô Ö Ò Ð Þ Ö Ð ÓÖ ØÑÓ׸ ÔÖ × ÒØ ÑÓ× ÙÒÓ ÐÓ× ×Ô ØÓ× ÕÙ Ñ ÒÙ Ó ÓÑÔÐ Ò Ð Ò Ð × × Ó × Ð ÓÒ ÙÒ Ð ÓÖ ØÑÓ× Ð Þ Öº È Ö ÐÐÓ¸ ÒÓ× Ú Ð Ö ÑÓ× ÙÒÓ ÐÓ× Ð ÓÖ ØÑÓ× Ñ × × ÑÔР׸ ÔÓÔÙÐ Ö × Ý ÙØ Ð × Ð Ù×ÕÙ × Ù Ò Ðº ÓÑ Ò ÑÓ× ÔÓÖ ÙÒ ÖÖ ÐÓ¸ ÙÝ Ù×ÕÙ ÔÙ ÔÐ ×Ñ Ö× ¸ × Ò Ò × ÜÔÐ ÓÒ ÔÖ Ú ¸ Ð × Ù ÒØ Ñ Ò Ö ½ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½ ½ template <typename T, class Equal> inline int sequential_search(T * a, const T & x, const int & l, const int & r) { for (int i = l; i <= r; i++) if (Equal () (a[i], x)) return i; return Not_Found; } ¬Ò × sequential search¸ Ù× Ò ÙÒ × ½ ¸ ¿ ¸ ½ ¸ Ò ½ º sequential search() Ù× × Ù Ò ÐÑ ÒØ Ò Ð ÖÖ ÐÓ a¸ ÒØÖ ÐÓ× Ò × l Ý r¸ Ð Ð Ñ ÒØÓ xº Ë Ð Ù×ÕÙ × Ü ØÓ× ¸ ÒØÓÒ × × Ö ØÓÖÒ Ð Ò ÓÒØ ÒØ ÚÓ Ð Ð Ñ ÒØÓ ÐÓ ÓÒØÖ Ö Ó¸ × Ö ØÓÖÒ Not Foundº sequential search() ÑÔÐ ÓÑÓ Ö Ø Ö Ó ÙÐ Ð ÓÔ Ö ÓÖ () Ð Ð × Ô Ö Ñ ØÖ Þ Equalº Ù ÒØÓ× Ô ×Ó× Ù ÓÒ ÓÒ×ÙÑ ×Ø Ð ÓÖ ØÑÓ Ä ×ÙØ Ð Þ ×Ù Ò Ð × × × ÕÙ Ð ÙÖ ÓÒ Ù ÓÒ Ô Ò Ó× ØÓÖ × ´½µ Ð Ô ÖÑÙØ ÓÒ Ð ÖÖ ÐÓ a Ý ´¾µ Ð Ú ÐÓÖ Ù×ÕÙ xº Î ÑÓ×ÐÓ × Ð Ô Ö×Ô Ø Ú Ð Ú ÐÓÖ xº Ë x ÒÓ ×Ø ÓÒØ Ò Ó Ò Ð ÖÖ ÐÓ¸ ÒØÓÒ ×¸ Ò Ô Ò ÒØ Ñ ÒØ Ð Ô ÖÑÙØ ÓÒ¸ Ð for × ÙØ Ö ÓÑÔÐ Ø Ñ ÒØ ¸ Ö ÞÓÒ ÔÓÖ Ð Ù Ð Ð Ð ÓÖ ØÑÓ ÓÒ×ÙÑ r − l = n Ô ×Ó× Ù ÓÒº ÐÓ ÓÒØÖ Ö Ó¸ ÒØÓÒ ×¸ Ð ÙÖ ÓÒ Ô Ò Ö Ð Ô ÖÑÙØ ÓÒ ×Ô ¬ Ñ ÒØ ¸ Ð ÔÓ× ÓÒ Ò ÓÒ × Ò Ù ÒØÖ x ÒØÖÓ Ð ÖÖ ÐÓº Ë × Ò Ù ÒØÖ Ò Ð ÔÖ Ñ Ö ÔÓ× ÓÒ¸ ÒØÓÒ × Ð ÙÖ ÓÒ × ÙÒ Ô ×Ó Ù ÓÒº Ë × × Ò Ù ÒØÖ Ò Ð ÙÐØ Ñ ÒØÓÒ × ×ÓÒ n − 1º Ù Ð × Ó Ö ÆÓ ÐÓ × ÑÓ׸ Ô ÖÓ × ÔÓ ÑÓ× Ø Ò Ö ÙÒ ÜÔ Ø Ø Ú ÐÓ ÕÙ Ú ×Ù Ö Ý ×Ø Ð ÜÔÖ × Ð ÓÒ ÔØÓ ×Ô Ö ÒÞ ×Ø ר º Ë Ð Ô ÖÑÙØ ÓÒ × Ð ØÓÖ ¸ ÒØÓÒ × Ð ×Ô Ö ÒÞ × Ö ÔÓÖ Ð ÒØÖÓº Ä ÙÖ ÓÒ ×Ô Ö × Ö l+r º 2 ÙÐÑ Ò ÑÓ× ×Ø × ÓÒ ÓÒ Ð × Ú Ö× ÓÒ × Ò Ö × Ð Ù×ÕÙ ×Ó Ö Ð ×Ø × ½ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½ ½ template <typename T, class Equal> inline Dnode<T> * sequential_search(Dnode<T> & list, const T & x) { for (typename Dnode<T>::Iterator it(list); it.has_current(); it.next()) { Dnode<T> * curr = it.get_current(); if (Equal () (curr->get_data(), x))
  • 193.
    3.1. An´lisis dealgoritmos a 167 return curr; } return NULL; } Í× × Dnode Ò sequential search ½ º × Ð ÔØ Ö ×Ø × Ù×ÕÙ × Ð Ì Dlist<T>º Ì Ñ Ò ÔÙ Ò Ù× Ö× Ô Ö Ð Ø ÔÓ DynDlist<T>¸ Ô ÖÓ Ö ÕÙ ÒØ ÖÚ Ò Ö ÒØ ÖÒ Ñ ÒØ º ÈÓÖ ÐÐÓ¸ Ú Ð Ð Ô Ò Ó Ö Ö ÙÒ ÒØ Ö Þ Ù×ÕÙ ×Ó Ö DynDlist<T> ½ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½ ½ template <typename T, class Equal> inline T * sequential_search(DynDlist<T> & list, const T & x) { Dnode<T> * ret = sequential_search<T, Equal >(static_cast<Dnode<T>&>(list), x); return ret != NULL ? &ret->get_data() : NULL; } Í× × Dnode ¸ DynDlist ¿ ¸ Ò sequential search ½ º 3.1.5 Implantaci´n del problema fundamental mediante DynArray<T> o ÉÙ Þ Ð Ñ Ò Ö Ñ × × ÑÔÐ Ý Ú Ö× Ø Ð ÒרÖÙÑ ÒØ Ö Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð ¬Ò Ó Ò Ü ½º¿ ´Ô Ò ½ µ × Ñ ÒØ Ð Ø ÔÓ DynArray<T>º Ò ×Ø ×Ó¸ ØÖ Ò× ÑÓ× ÔÓÖ ÙÒ ÖÖ ÐÓ ×ÓÖ Ò Ó ÕÙ ÔÙ Ö Ö Ý Ö Ö Ò Ñ Ñ ÒØ º Ä Ú ÒØ Ð ×ÓÖ Ò × ÕÙ ÒÓ Ö ÕÙ Ö ÑÓ× Ö Ö Ý ÖÖ Ö Ö × ÒØ Ò× Ö ÓÒ × Ý Ð Ñ Ò ÓÒ ×º Ä ×Ú ÒØ × ÕÙ Ð Ù×ÕÙ × Ö× Ù Ò Ð ½ ØÔÐ ÝÒ ÖÖ Ý × ØºÀ ½ ≡ template <typename T, class Equal = Aleph::equal_to<T> > class DynArray_Set : public DynArray<T> { public: T & insert(const T & item) { (*this)[this->size()] = item; return this->access(this->size() - 1); } T * search(const T & item) { int i = Aleph::sequential_search<T, Equal>(*this, item, 0, this->size() - 1); return (i >= 0 and i < this->size()) ? &this->access(i) : NULL; } void remove(T & item) { item = access(this->size() - 1); this->cut(this->size() - 1); } }; Í× × DynArray ¾ Ò sequential search ½ º Ä ÖÙØ Ò sequential search() Ö Ð Þ ¸ ÓÑÓ ÓÑÓÒ Ñ Ñ ÒØ × Ò¬ Ö ¸ ÙÒ Ù×ÕÙ × Ù Ò Ð ×Ó Ö Ð ÖÖ ÐÓ Ò Ñ Ó º Î × Ü ¿º½º ´Ô Ò ½ µ Ô Ö Ñ × Ø ÐÐ ×
  • 194.
    168 Cap´ ıtulo 3. Cr´ ıtica de algoritmos 3.1.6 B´squeda de extremos u ÍÒ ×Ó ×Ô Ð Ð Ù×ÕÙ × Ð Ø ÖÑ Ò ÓÒ ÙÒ Ú ÐÓÖ ÜØÖ ÑÓ ÙÒ × Ù Ò × Ö¸ Ð Ú ÐÓÖ Ñ Ò ÑÓ Ó Ñ Ü ÑÓº ØÖ Ú × Ð Ð × ÓÑÔ Ö ÓÒ Ò Ö ¸ ×ØÓ ÔÙ Ö ×ÓÐÚ Ö× ¸ Ô Ö ÖÖ ÐÓ׸ Ð × Ù ÒØ ÑÓ Ó ½ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½ ½ template <typename T, class Compare> inline int search_extreme(T * a, const int & l, const int & r) { T extreme_index = l; for (int i = l + 1; i <= r; i++) if (Compare () (a[i], a[extreme_index])) // ¿se ve un nuevo menor? extreme_index = i; // s´ ı return extreme_index; } search extreme() Ù× Ð Ð Ñ ÒØÓ ÜØÖ ÑÓ × ÙÒ Ð Ö Ø Ö Ó ÓÑÔ Ö ÓÒ Compareº Ë Ò Ñ Ö Ó¸ ÓÒ ×Ø × ÒØ Ü × ÒÓ ÕÙ × Ñ ÒØ Ñ ÒØ Ð ÖÓ ÕÙ × ØÖ Ø Ù× Ö Ð Ñ Ò ÑÓ Ó Ð Ñ Ü ÑÓº È Ö Ð Ö ¬ Ö Ð ×ÙÒØÓ¸ Ù× Ö ÑÓ× Ó× ×Ø ÒØ × ÙÒ ÓÒ × ½ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½ ½ template <typename T> inline int search_min(T * a, const int & l, const int & r) { return search_extreme<T, Aleph::less<T> > (a, l, r); } template <typename T> inline int search_max(T * a, const int & l, const int & r) { return search_extreme<T, Aleph::greater<T> > (a, l, r); } Í× × search min ½ ¿ º ÙÐ ×Ð Ö Ò ÓÒ Ð Ù×ÕÙ Ô ÖØ ÙÐ Ö ÕÙ ×ØÙ ÑÓ× Ò Ð ×Ù ¹× ÓÒ ÔÖ ÒØ Ä ×ØÖÙ ØÙÖ × ÔÖ Ø Ñ ÒØ Ð Ñ ×Ñ ÙÒ Ð ÞÓ r − l = n Ô ×Ó× Ð ¹ ÖÒ Ö Ò Ð Ø Ò ÓÒº È Ö ÙÒ Ô ÖÑÙØ ÓÒ Ð ØÓÖ ¸ Ð Ù×ÕÙ Ü ØÓ× × ÔÖÓ¹ ÔÓÖ ÓÒ Ð n Ò ÔÖÓÑ Ó¸ Ñ ÒØÖ × ÕÙ Ð Ù×ÕÙ ÙÒ ÜØÖ ÑÓ Ö ÕÙ Ö ¸ × ÑÔÖ ¸ ܹ Ñ Ò Ö Ð ØÓØ Ð Ð × Ù Ò º ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð ÙÖ ÓÒ search extreme() × ÔÖÓÔÓÖ ÓÒ Ð n Ô Ö ØÓ Ó× ÐÓ× ×Ó׺ È Ö ÓÑÔÐ Ø Ö ×Ø ×Ù ¹× ÓÒ¸ ÑÓ× ÔÖÓ Ö Ñ Ö search extreme() Ô Ö Ð × Ð ×Ø × × × Ò Dlink¸ ÐÓ ÕÙ ÔÐ ÒØ Ð × Ù ÒØ ÑÓ Ó ½ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½ ½ template <class Compare> inline Dlink * search_extreme(Dlink * list) { typename Dlink::Iterator it(*list); Dlink * curr_min = it.get_current(); for (it.next(); it.has_current(); it.next()) { Dlink * curr = it.get_current(); if (Compare () (curr, curr_min)) curr_min = curr;
  • 195.
    3.1. An´lisis dealgoritmos a 169 } return curr_min; } ר ÙÒ ÓÒ × ×Ô Ð Þ Ô Ö Ð Ö ×ØÓ Ð× Ð×× Ð Ö ÖÕÙ ÖÚ × Dlinkº 3.1.7 Notaci´n O o Ä ÒÓ ÓÒ Ô ×Ó Ù ÓÒ ÒÓ× Ô ÖÑ Ø Ó Ò ÓÒØÖ Ö ÙÒ ÔÖÓÜ Ñ ÓÒ Td(n) Ô Ö Ð ÓÖ Ò Ñ ÒØÓ ÔÓÖ × Ð ÓÒº ÙÐÐ ¸ Ò Ð ÓÕÙ Ð × ÒÑ Ò× × Td(n)¸ ÔÓ ÑÓ× Ò ÓÒØÖ Ö ÙÒ Ô ØÖÓÒ ÓÒר Ò Ö ÐÓ ÕÙ ¸ ÒÐ Ù ÓÒ ÓÒ Ö Ø ÙÒ Ð ÓÖ ØÑÓ¸ × Ñ ÓÑÓ Ú Ö Ð º Ò Ð ÓÖ ÞÓÒØ ÕÙ ÐÐ Ð Ò ¸ Ø Ò × ÒØ ÓÐ × Ù ÒØ ¬Ò ÓÒ Definici´n 3.1 (Notaci´n O) Ë Ò Ó× ÙÒ ÓÒ o o × T (n) Ý F(n)º ÒØÓÒ ×¸ × ÕÙ T (n) × O(f(n))¸ ÒÓØ Ó ÓÑÓ T (n) = O(f(n))¸ ×Ý ×ÓÐÓ × ∃ c, n1 | T (n) ≤ cn2 , n ≥ n1º Ù Ò Ó ÑÓ× ÕÙ T (n) = O(f(n)) ר ÑÓ× ÔÖÓÜ Ñ Ò Ó Ð ÓÑÔÓÖØ Ñ ÒØÓ T (n) ÙÒ ÙÒ ÓÒ Ö ÒØ ݸ Ô Ö ÕÙ Ø Ò × ÒØ Ó ÔÖ Ø Ó¸ Ñ × × Ò ÐÐ º ¬ÖÑ ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ ÕÙ T (n) = n2 +n+1 = O(n2)º Ë ×ØÓ × ÓÖÖ ØÓ¸ ÒØÓÒ × ∃ c, n1 | T (n) ≤ cn2º Ë Ð ÓÒ ÑÓ× c = 1 ÒØ ÒØ ÑÓ× ÑÓ×ØÖ Ö Ð ¬ÖÑ ÓÒº È Ö ÔÖÓ Ö ÕÙ n2 + n + 1 = O(n2) ÔÐ ÒØ ÑÓ× Ð Ò Ù ÓÒ n2 + n + 1 ≤ cn2, n ≥ n1 =⇒ (1 − c)n2 + n + 1 ≤ 0º ÄÓ ÕÙ ÖÖÓ ÓÑÓ Ö × −1 ± 1 − 4(1 − c) n= . 2(1 − c) Ë ×Ð ÓÒ ÑÓ× c = 7/4 Ø Ò ÑÓ× ÓÑÓ Ö × n0 = −2/3, n1 = 2º × Ô٠׸ c = 7/4, n1 = 2 ÓÒ¬ÖÑ Ò ÕÙ n2 + n + 1 = O(n2)º ÑÓ×ØÖ Ö ÕÙ T (n) = O(f(n)) Ô Ö Ð ÙÒ ÙÒ ÓÒ f(n) ÒÓ ÑÔÐ ÕÙ ÒÓ Ü ×Ø Ò ÓØÖ × ÙÒ ÓÒ × ÕÙ × Ø × Ò Ð ¬Ò ÓÒº Ó¸ × ÔÓ× Ð Ö ÕÙ Ý Ñ ÓÖ × ÙÒ ÓÒ × ÕÙ ÓØÖ ×º ÈÓÖ ÑÔÐÓ¸ ×ÓÒ ÑÓ×ØÖ Ð × Ð × × Ù ÒØ × ¬ÖÑ ÓÒ × n i2 = O(n4) ´¿º¾µ i=1 n i2 = O(n3) ´¿º¿µ i=1 n i2 = O(n2) ´¿º µ i=1 Ô ÖÓ Ð ÙÐØ Ñ ¬ÖÑ ÓÒ × Ð Ñ × ÔÖ × Ð × ØÖ ׺ ÈÙ ×ØÓ ÕÙ Ý Ó× Ò Ó Ò Ø × ´c, n1µ Ý ÙÒ ×ÓÐ × Ù Ð ¸ ÑÓ×ØÖ Ö T (n) = O(f(n)) ÔÙ ×Ö Ð Ò Ð ÙÒÓ× ×Ó× Ñ Ø Ñ Ø Ó׸ Ô ÖÓ¸ ÔÓÖ ÐÓ Ò Ö Ð Ò Ð Ò Ð × × Ð ÓÖ ØÑÓ׸ Ð ÑÓ×ØÖ ÓÒ × × Ò ÐÐ º Ò Ð ÙÒÓ× ×Ó׸ ÔÙ × Ö ÙØ Ð ÔÖ ¬ Ö ÙÒ Ú ÐÓÖ Ð ÓÒר ÒØ c Ý Ö ×ÓÐÚ Ö Ð →∞ T (n) − c f(n) ≤ 0 n− Ñ ´¿º µ Ä ¬ÖÑ ÓÒ T (n) = O(f(n)) ×ÓÐÓ Ø Ò ÙÒ Ö ÓÒ Ö ×Ô ØÓ Ð Ù Ð º No es correcto decir O(f(n)) = T (n)¸ ÔÙ × ÒÓ Ö ­ Ð × ÙÐ Ð ¬Ò ÓÒº
  • 196.
    170 Cap´ ıtulo 3. Cr´ ıtica de algoritmos ÄÓ ÓÒ Ó Ù Ò Ó × ¬ÖÑ ÕÙ T (n) = O(f(n)) × ÕÙ f(n) ÓØ × ÒØÓØ Ñ ÒØ Ð ÙÒ ÓÒ T (n)º Ò Ú Ð × ÒØÓØ Ó¸ Ð Ñ ÓÖ ÔÖÓÜ Ñ ÓÒ × ÕÙ Ð × ÒØÓØ f(n) × Ô Ö Ð Ð Ð T (n)º À Ý ×Ó× Ò ÕÙ × ÔÙ ÑÓ×ØÖ Ö ÕÙ f(n) ÒÓ × × ÒØÓØ Ñ ÒØ Ô Ö Ð Ð T (n) Ý ×ØÓ × ÜÔÖ × Ñ ÒØ Ð × Ù ÒØ ¬Ò ÓÒ Definici´n 3.2 (Notaci´n o) Ë Ò Ó× ÙÒ ÓÒ × T (n) Ý F(n)º ÒØÓÒ ×¸ × o o ÕÙ T (n) × o(f(n))¸ ÒÓØ Ó ÓÑÓ T (n) = o(f(n))¸ × Ý ×ÓÐÓ × ∃c, n1 | T (n) < cf(n) , n ≥ n1º cT (n) g(n) f(n) T (n) n1 n2 n × ÒØÓØ × ÙÖ ¿º¾ ÑÔÐÓ Ò Ö Ð ÙÒ ÓÒ × ÕÙ × ÓØ Ò × ÒØÓØ Ñ ÒØ Ä ×ØÙ Ö ÙÒ Ð ÓÖ ØÑÓ Ñ ÒØ ÓÔ Ö ÓÒ × O × Ó Ø Ò Ö Ð ÔÖÓÜ Ñ ÓÒ × ÒØÓØ Ñ × Ö Ò Ð Ø ÑÔÓ Ù ÓÒº ÈÓ ÑÓ× ØÖ Ö ÓÒ ÙÒ ÔÖÓÜ Ñ ÓÒ Ý ÒÓ ÓÒ ÙÒ Ö ×ÙÐØ Ó Ü ØÓ ÔÓÖÕÙ ÐÓ ÕÙ ÒÓ× ÓÒ ÖÒ × Ð Ø Ò Ò T (n) Ò Ð Ð ÓÖ ØÑÓ Ò × ¸ × Ò ÓÒ× Ö Ö ÐÓ× Ø ÐÐ × ×Ù Ø ÚÓ× Ö ÙÒר Ò Ð × Ô ÖØ Ò ÒØ × Ð Ø ÔÓ Ö Û Ö ¸ ÓÑÔ Ð ÓÖ¸ Ý ÓØÖÓ× ØÓÖ × ÔÖ Ú Ñ ÒØ Ñ Ò ÓÒ Ó׺ ÈÓ ÑÓ׸ Ô٠׸ ×ÙÑ Ö ÕÙ Ð ÓÒר ÒØ c ×ØÖ Ð × Ö Ò × Ö ÙÒר Ò Ð × Ù ÓÒº Ä × Ö Ò × × ÑÔ ÒÓ × ÔÓÖ ÓØÖÓ× ØÓÖ × Ö ÔÖ × ÒØ Ò Ö ÒØ × ÓÒר ÒØ × ÙÝÓ Ú ÐÓÖ ÒÓ ÒÓ× ÓÒ ÖÒ º Ò Ð Ñ ×ÑÓ × ÒØ Ó¸ Ð ÓÖÑ Ü Ø T (n) ÒÓ × Ö Ð Ú ÒØ ¸ × ÒÓ Ð Ø Ò Ò × ÒØÓØ Ô ÖØ Ö Ð ÓÒר ÒØ n1º Ò Ð ÙÒÓ× ×Ó׸ ÔÙ Ò ÓÒÚ Ò ÖÒÓ× Ð × ¬Ò ÓÒ × Ô Ö ÐÓ× ÕÙ Ú Ð ÒØ × Ò Ö ÓÖ × O(f(n)) Ý o(f(n)) × Ö¸ × ÒØÓØ × ÕÙ ×Ø Ò ÔÓÖ Ó T (n)º Definici´n 3.3 (Notaci´n Ω) Ë Ò Ó× ÙÒ ÓÒ × T (n) Ý F(n)º ÒØÓÒ ×¸ × o o ÕÙ T (n) × Ω(f(n))¸ ÒÓØ Ó ÓÑÓ T (n) = Ω(f(n))¸ × Ý ×ÓÐÓ × ∃c, n1 | T (n) ≥ cf(n) , n ≥ n1º
  • 197.
    3.1. An´lisis dealgoritmos a 171 Definici´n 3.4 (Notaci´n ω) Ë Ò Ó× ÙÒ ÓÒ × T (n) Ý F(n)º ÒØÓÒ ×¸ × o o ÕÙ T (n) × ω(f(n))¸ ÒÓØ Ó ÓÑÓ T (n) = ω(f(n)) × Ý ×ÓÐÓ × ∃c, n1 | T (n) > cf(n) , n > n1º ÈÖ Ò Ö ÕÙ Ð ÔÖÓÜ Ñ ÓÒ × ÒØÓØ O(f(n)) × ÔÖÐÐ T (n) ÒÙÒ ÑÓ× Ð × Ù ÒØ ¬Ò ÓÒ Definici´n 3.5 (Notaci´n Θ) Ë Ò Ó× ÙÒ ÓÒ × T (n) Ý F(n)º ÒØÓÒ ×¸ × o o ÕÙ T (n) × Θ(f(n))¸ ÒÓØ Ó ÓÑÓ T (n) = Θ(f(n))¸ × Ý ×ÓÐÓ × T (n) = O(f(n)) Ý T (n) = Ω(f(n))º ÈÓ ÑÓ× Ö¸ Ø Ñ Ò¸ T (n) = Θ(f(n)) ⇐⇒ T (n) = O(f(n)) Ý f(n) = O(T (n))º Ä ¬ ÙÖ ¿º¾ Ô ØÓÖ Þ T (n) Ý Ð ÙÒ × ÙÒ ÓÒ × ÕÙ Ð ÓØ Ò × ÒØÓØ Ñ ÒØ ¸ ÔÓÖ Ó Ý ÔÓÖ ÖÖ º Á ÒØ ¬ÕÙ ÑÓ׸ Ò ÔÖ Ñ Ö ÐÙ Ö¸ Ð ÙÒ ÓÒ T (n)¸ Ð Ù Ð × Ö ÔÓØ Ø Ñ ÒØ Ð Ø ÑÔÓ Ù ÓÒ ÙÒ Ð ÓÖ ØÑÓº Ò Ð ¬ ÙÖ ¸ Ð ÙÒ ÓÒ g(n) ר ÔÓÖ Ò Ñ T (n) Ô Ö ØÓ Ó n ≥ n1 × Ö¸ T (n) = o(g(n))º Ä ¬Ò ÓÒ o ¿º¾ ÒÓ× Ô ÖÑ Ø ÑÙÐØ ÔÐ Ö T (n) ÔÓÖ Ð ÙÒ ÓÒר ÒØ c ÑÓ Ó ÕÙ T (n) × Ñ ÝÓÖ ÕÙ g(n)º È ÖÓ ×ØÓ × ÖÖ Ð Ú ÒØ Ò Ð ÓÕÙ ÐÓ Ò¬Ò ØÓ¸ ÔÙ × Ð Ô Ò ÒØ g(n) ´Ú Ò× ×Ù× ÔÙÒØÓ× ÓÖØ µ × Ñ ÝÓÖ ÕÙ Ð T (n)º ÓÒ× Ù ÒØ Ñ ÒØ ¸ ÒÓ ÑÔÓÖØ Ù ÒØ × Ð ÒÓÖÑ Ð ÓÒר ÒØ ¸ Ò Ð ÙÒ Ð Ò ¸ g(n) × ÑÔÖ ×Ó Ö Ô × Ö T (n)º Ð Ñ ×ÑÓ ×Ø ÐÓ Ö ÞÓÒ Ñ ÒØÓ ÔÙ Ù× Ö× Ô Ö ÓÒר Ø Ö T (n) = ω(f(n))º Ò Ð ÓÖ ÞÓÒØ ÐÓ× Ö Ò × ÒÙÑ ÖÓ׸ T (n) ×Ó Ö Ô × Ö f(n)º ÓÖ ×Ø ÑÓ× ÔÖ Ô Ö Ó× Ô Ö ÓÑÔÖ Ò Ö Ð × ÒØ Ó Ð ÓÒ ÔØÓ Θ¸ Ð Ù Ð ÔÙ ÔÖ Ö× Ò Ð ¬ ÙÖ ¿º¿º c 1 f(n) T (n) c 2 f(n) × ÒØÓØ × n1 ÙÖ ¿º¿ ÑÔÐÓ Ò Ö Ð ÙÖÚ × ÒØÓØ Ñ ÒØ Ô Ö Ð Ð Ç × ÖÚ ÑÓ× ÔÖ Ñ ÖÓ Ð ÙÖÚ c2f(n)¸ ÙÝ × ÒØÓØ × Ô Ö Ð Ð Ð T (n)º ÍÒ ÖØÓ Ú ÐÓÖ ÓÒר ÒØ c2 ÕÙ T (n) = Ω(f(n))º ÓÖ Ò¸ ר Ö ÓÒ ÑÙÐØ ÔÐ Ö f(n) ÔÓÖ ÙÒ ÓÒר ÒØ c1 > c2 Ô Ö ÕÙ T (n) = O(f(n))º ÈÓÖ Ø ÒØÓ¸ T (n) = Θ(f(n))
  • 198.
    172 Cap´ ıtulo 3. Cr´ ıtica de algoritmos 3.1.7.1 Algebra de O ´ Ò Ð ÑÙÒ Ó ÐÓ Ò¬Ò ØÓ¸ ÐÓ ÕÙ Ð Ö Ò × Ð Ø Ò Ò ÕÙ ÐÐ Ú Ð ÙÖÚ º ËÙÑ × Ý ÔÖÓ Ù ØÓ× ÓÒר ÒØ × ×ÓÒ × ÖØ Ð × Ò Ð ÓÑ Ò Ó Ð ÒÓØ ÓÒ Oº ×ØÓ ÔÓ× Ð Ø ÙÒ Ð Ö ×Ó Ö Ð ÒÓØ ÓÒ O ÕÙ × ÑÔÐ ¬ ÓÒ× Ö Ð Ñ ÒØ Ð Ò Ð × × ÙÒ Ð ÓÖ ØÑÓº È Ö ÐÐÓ¸ Ô ÖÑ Ø × ÒÓ× ÒÙÒ Ö Ð × × Ù ÒØ × Ö Ð × × ×¸ ÙÝ × ÑÓ×ØÖ ÓÒ × × Ð Ò Ö Ó× O(f(n)) + O(g(n)) = O(Ñ Ü(f(n), g(n))) ´¿º µ c O(f(n)) = O(f(n)) ´¿º µ O(O(f(n))) = O(f(n)) ´¿º µ O(f(n)) O(g(n)) = O(f(n) g(n)) ´¿º µ O(f(n) g(n)) = f(n) O(g(n)) ´¿º½¼µ T (n) = n + n k k−1 + · · · + n + c = O(nk) ´¿º½½µ ÐÓ k n = O(n) ´¿º½¾µ Ò Ó × ÓÒ × Ø Ò ÑÓ× ÕÙ ÓÑÔ Ö Ö ÙÒ ÓÒ × ÓÒ Ð Ó ØÓ Ø ÖÑ Ò Ö Ù Ð × Ð Ñ ÝÓÖº ØÓ× Ð Ö ÓÖ¸ Ó × Ð ÓÑÔ Ö ÓÒ × Ð ×Ø Ð Ö¸ ÔÐ ÒØ ÑÓ× Ð Ö Ó Ó Ö ÞÓÒ ÒØÖ Ð × ÙÒ ÓÒ × ÓÑÓ Ö Ø Ö Ó ÓÑÔ Ö ÓÒ Ý ÓÒ× Ù ÒØ × ÓÒº ר ÑÓ Ó ⎧ ⎪0 =⇒ ⎪ f(n) = o(g(n)) ⎨ ÐÑ f(n) = ∞ =⇒ g(n) ⎪ g(n) = o(f(n)) ´¿º½¿µ n→∞ ⎪ ⎩c =⇒ f(n) = Θ(g(n)) 3.1.7.2 An´lisis de algoritmos mediante O a ÓÑÓ Ý ÖØÓ ÐÓ ÑÓ× Ö Ð Ó¸ Ò ÔÖÓ Ö Ñ ÓÒ Ð ¬Ò Ù ÒØ × ØÓ Ó × × Ù Ò º Ò Ð Þ Ö ÙÒ Ð ÓÖ ØÑÓ Ö ÕÙ Ö ¸ ÒØÓÒ ×¸ Ó × ÒÖÓÐÐ Ö Ð Ñ Ü Ñ × Ù Ò Ù ÓÒ ÔÓ× Ð ¸ Ó × ÒÖÓÐÐ Ö Ð × Ù Ò Ù ÓÒ ÔÖÓ Ð º È Ö ÒØ Ò Ö Ð × ÒØ Ó × ÒÖÓÐÐ Ö ¸ ÓÒ× Ö ÑÓ× Ð × Ù ÒØ Ù Ð for (int i = 0; i < 3; ++i) printf("Prueba %dn", i); × ÒÖÓÐÐ Ö ×Ø Ù Ð ÕÙ Ú Ð ×Ö ÖÐ Ù ÓÒ ÓÑÓ ÙÒ × Ù Ò int i = 0; if (i < 3) printf("Prueba %dn", i); ++i; if (i < 3) printf("Prueba %dn", i); ++i; if (i < 3) printf("Prueba %dn", i); ++i; if (i < 3) ;
  • 199.
    3.1. An´lisis dealgoritmos a 173 ÆÓØ ÑÓ× ÕÙ ×ÓÐÓ Ò Ð ÙÐØ ÑÓ if Ð ÔÖ Ó i < 3 × Ð×Ó¸ ÔÓÖ ÐÓ ÕÙ Ð ÑÔÖ × ÓÒ × ÑÔÖ × ÙØ ݸ Ò ×Ø ×Ó Ô ÖØ ÙÐ Ö¸ Ð if ÓÑÔÐ ØÓ × ÓÒ× Ö ÙÒ Ô ×Ó Ù ÓÒ º ÈÙ ×ØÓ ÕÙ Ù ÔÓ× Ð × ÒÖÓÐÐ Ö Ð Ù Ð Ò 11 ÒרÖÙ ÓÒ × ÙÖ ÓÒ ÓÒר ÒØ ¸ Ð Ù Ð Ò × × ÙÖ ÓÒ ÓÒר ÒØ º ÈÓÖ ÐÓ Ø ÒØÓ¸ Ð Ù Ð ÓÒ ÓÖÑ ÙÒ Ô ×Ó Ù ÓÒ Ý ×Ù Ø ÑÔÓ ÙÖ ÓÒ × O(1)º Ò Ð ÓÑ Ò Ó O¸ Ð ÖØ Ò Ð Þ Ö ÙÒ Ð ÓÖ ØÑÓ ÓÒ× ×Ø Ò ÒØ ¬ Ö × Ù Ò × Ù ÓÒ ÕÙ ÓÑÔÓÖØ Ò ÙÒ ÓÒ × ÙÖ ÓÒ Ö ÒØ × Ý ÔÐ Ö Ö Ð × ÓÒØ Ó ×Ó Ö ØÓ Ó¸ Ð × Ð ×ÙÑ Ý Ð ÔÖÓ Ù ØÓº Ò Ð × ÒØ Ó ÐÓ Ö Ò ÜÔÐ Ó¸ ×ÓÒ ÔÐ Ð × Ð × × Ù ÒØ × Ö Ð × Ô Ö ÐÓ× Ð × Ó× ÐÓÕÙ × ÔÖÓ Ö Ñ ÓÒ ÔÖÓ ÙÖ Ð ½º Instrucciones secuenciales: Ð Ù ÓÒ Ó× ÒרÖÙ ÓÒ × × Ù Ò Ð × ÓÒ Ø ÑÔÓ T1(n) = O(f1(n)), T2(n) = O(f2(n)) ØÓÑ Ò Ð ×ÙÑ T1(n) + T2(n)¸ Р٠и ÔÓÖ Ð Ö Ð ´¿º µ ´ Ð ×ÙÑ µ¸ ØÓÑ O(Ñ Ü(f1(n), f2(n)))º ¾º Instrucciones de decisi´n: ×ÙÑ ÑÓ׸ ÓÑÓ ×Ó Ò Ö Ð¸ Ð × Ù ÒØ רÖÙ ØÙÖ o if ´ O(f1(n)) µ O(f2(n)) else O(f3(n)) Ò ×Ø ×Ó¸ Ð Ø ÑÔÓ Ù ÓÒ ×Ø Ö Ó ÔÓÖ O(f1(n))+Ñ Ü(O(f2(n)), O(f3(n)))º ÕÙ ×Ø ÑÓ× ÓÒ× Ö Ò Ó ÐÓ Ô ÓÖ × Ö¸ Ð Ù ÓÒ Ð ÐÓÕÙ Ñ × ÓרÓ×Óº Ú ÒØÙ ÐÑ ÒØ ¸ × ÙÒ Ð ×ØÖ Ù ÓÒ ÖØ ØÙ Ð ÔÖ Ó Ð if¸ ÔÙ ÓÒ¹ × Ö Ö× Ð ×Ô Ö ÒÞ º ¿º Instrucciones de repetici´n: Ð o Ù ÓÒ ÙÒ Ö Ô Ø ÓÒ ÓÒ Ð × Ù ÒØ ×¹ ØÖÙ ØÙÖ for ´ O(f1(n)) µ O(f2(n)) × Ö ÔÓÖ Ð Ö Ð Ð ÔÖÓ Ù ØÓº Ð Ø ÑÔÓ Ù ÓÒ ×Ø ¸ Ô٠׸ Ø ÖÑ Ò Ó ÔÓÖ O(f1(n)) Ú × Ð Ù ÓÒ Ð ÐÓÕÙ ÒØ ÖÒÓ Óר O(f2(n)) × Ö¸ O(f1(n)) × O(f2(n)) = O(f1(n) × f2(n))º È Ö Ò Ð Þ Ö ÙÒ Ö Ô Ø ÓÒ Ò Ò ×ØÙ Ö× ×Ù× Ô Ò Ò × ÓÒ ÐÓ× ÐÓ× ÜØ ÖÒÓ׺ Ü ×Ø Ò Ú Ö× × ÓÖÑ ×¸ Ð × Ù Ð × ÒÓ Ò × Ö Ñ ÒØ ÓÖÖ ×ÔÓÒ Ò ÓÒ Ð ×ØÖÙ ØÙÖ ÒØ Ö ÓÖº Ò Ð Ò × Ò Ö Ð ×¸ Ð ØÖÙ Ó Ô Ö Ò Ð Þ Ö ÙÒ Ö Ô Ø ÓÒ ÓÒ× ×Ø Ò Ú Ö Ù Ö Ð ÒØ Ú × ÕÙ ×Ø × ØÙ º ÈÓÖ ÐÓ Ò Ö Ð¸ Ð Ò Ð × × ÙÒ Ö Ô Ø ÓÒ × Ö Ð Þ × Ð Ù Ð Ñ × ÒØ ÖÒÓ ×Ø Ð Ñ × ÜØ ÖÒÓº × × Ð Ö ÞÓÒ ÔÓÖ Ð Ù Ð Ð ÒרÖÙ ÓÒ ÒØÖÓ Ð if ÒÓ × ÓÐÓ Ò ÒØ º
  • 200.
    174 Cap´ ıtulo 3. Cr´ ıtica de algoritmos ½ ·¼ ½ ·¼ ½¼¼¼¼ ½¼¼ ½ ½ ½¼ ½¼¼ ½¼¼¼ ½¼¼¼¼ ½¼¼¼¼¼½ ·¼ ½ ·¼ ½ ·¼ ½ ·¼ n √ O(n) O(2n) O( n) O(n2) O(Ð (n)) O(1) O(n3) O(n Ð (n)) √ ÙÖ ¿º ÙÖÚ × Ð (n), n, n, n Ð (n), n2, n3, 2n × Ð × ÐÓ Ö ØÑ × Ä ÙÖ ÓÒ ÙÒ Ð ÓÖ ØÑÓ × Ö Ñ Ø ÒØ ¬ Ö ×Ù× × Ù Ò × Ù ÓÒ Ý ¹ × ÒÖÓÐÐ ÖÐ × Ò ÙÒ ×ÓÐ º Ë Ù Ò × ÐÓÒ ØÙ ¬ × Ö¸ Ô ×Ó× Ù ÓÒ¸ ×ÓÒ O(1)º Ë Ù Ò × ÐÓÒ ØÙ ÔÖÓÔÓÖ ÓÒ ÐÑ ÒØ Ú Ö Ð ×ÓÒ O(n)º Ë Ù Ò × × Ù Ò × ÐÓÒ ØÙ ÔÖÓÔÓÖ ÓÒ ÐÑ ÒØ Ú Ö Ð ×ÓÒ O(n2)º Ë Ù Ò × ÐÓÒ ØÙ Ù Ö Ø Ñ ÒØ Ú Ö Ð ×ÓÒ O(n3)º Ë Ù Ò Ó ×Ø × Ù Ò Ö ÞÓÒ Ñ ÒØÓ¸ ÒÓ × Ð ÒØÙ Ö ÕÙ Ð ÓÒ ÙÒØÓ ÔÓ× Ð × ÙÒ ÓÒ × × Ö ÔØÓÖ × Ð Ø ÑÔÓ Ù ÓÒ ÙÒ Ð ÓÖ ØÑÓ ×Ø Ö ÙÒ× Ö ØÓ ÙÒ Ô ÕÙ Ò Ñ Ð ¸ ÙÝ × ÙÖÚ × × ÐÙ×ØÖ Ò Ò Ð ¬ ÙÖ ¿º º Ò Ð × ×Ù ¹× ÓÒ × ×Ù × Ù ÒØ × ×ØÙ Ö ÑÓ× ÙÒ Ð × Ð ÓÖ ØÑÓ ÒÓÑ Ò Ú Ö» ÓÑ Ò Ö ¸ Ð Ù Ð Ú Ð ÒØÖ Ò Ó× Ô ÖØ × ÔÖÓÜ Ñ Ñ ÒØ ٠Р׺ ÒØÖÓ ×Ø Ð × Ð ÓÖ ØÑÓ¸ ÕÙ ÐÐÓ× ÕÙ ØÖ Ò ×Ó Ö ×ÓÐÓ ÙÒ Ð × Ô ÖØ × Ú × Ò Ó Ð ÓØÖ × Ò ÔÖÓ × Ö ×ÓÒ O(Ð (n)) Ñ ÒØÖ × ÕÙ ÕÙ ÐÐÓ× ÕÙ Ö ÕÙ Ö Ò ÔÖÓ × Ö Ð Ò Ð Ý ÒØ Ö Ñ ÒØ Ð × Ó× Ô ÖØ × ×ÓÒ O(n Ð (n))º Ü ×Ø ÓØÖ Ð × ÔÖÓ Ð Ñ ÙÝ ×ÓÐÙ ÓÒ¸ ÔÓÖ ÐÓ Ò Ö Ð ÑÙÝ × ÑÔÐ ¸ ÓÒ× ×Ø Ò Ð ÙÐ Ö Ý Ò Ð Þ Ö ØÓ × Ð × Ô ÖÑÙØ ÓÒ × × Ù Ò × ×ÓÐÙ ÓÒ ÔÓ× Ð ×º Ù Ò Ó ÐÓ× Ð Ñ ÒØÓ× ÒÓ ×Ø Ò Ö Ô Ø Ó׸ Ð ÒÙÑ ÖÓ Ô ÖÑÙØ ÓÒ × ÙÒ × Ù Ò × n!º Ù Ò Ó¸ ÔÓÖ Ð ÓÒØÖ Ö Ó¸ × ×Ø Ò Ö Ô Ø Ó׸ × mn ÓÒ m × Ð ÒØ Ð Ñ ÒØÓ× Ý n Ð ÐÓÒ ØÙ Ð × Ù Ò º Ñ × × ØÙ ÓÒ × ×Ø Ò ÓØ × × ÒØÓØ Ñ ÒØ ÔÓÖ Ð ÙÒ ÓÒ f(n) = 2n¸ Ð Ù Ð ÒÓ × ÔÓÐ ÒÓÑ º ÈÓÖ × Ö ÞÓÒ¸ Ð ÓÖ ØÑÓ× ÙÝÓ Ø ÑÔÓ Ù ÓÒ × O(2n) ×ÓÒ ÒÓÑ Ò Ó× ÒÓ¹ÔÓÐ ÒÓÑ Ð × Ó¸ ÖÓÒ Ñ Ñ ÒØ ¸ ÆÈº ÆÓ × × × Ô Ö ÐÓ× ÔÖÓ Ð Ñ × ÆÈ Ü ×Ø Ò Ð ÓÖ ØÑÓ× ÓÖÖ ØÓ× ÓÒ ×ÓÐÙ ÓÒ × ÔÓÐ ÒÓÑ ×º Ò ØÓ Ó ×Ó¸ ר ÕÙ ÒÓ × ÑÙ ×ØÖ ÐÓ ÓÒØÖ Ö Ó¸ ÐÓ× ÔÖÓ Ð Ñ × ÆÈ ×ÓÒ ÒØÖ Ø Ð × Ò Ð × ÒØ Ó ÕÙ ¸ ÙÒ Ô Ö ÙÒ Ô ÕÙ Ò × Ð ¸ ÒÓ Ü ×Ø Ò Ö ÙÖ×Ó× ÓÑÔÙØ ÓÒ Ð × ÕÙ Ô ÖÑ Ø Ò ÙØ Ö Ð Ð ÓÖ ØÑÓº ÈÓÖ × Ö ÞÓÒ¸ ÐÓ× ÔÖÓ Ð Ñ × ÆÈ ×ÓÒ Ø Ð Ó× ÒØÖ Ø Ð × Ó Ö ÙÐ Ó× º À Ö ÙР׸ Ð ÖÓ Ñ ØÓÐÓ Ó Ö Ó
  • 201.
    3.1. An´lisis dealgoritmos a 175 3.1.8 Ordenamiento por inserci´n o ÈÓÒ ÑÓ× Ò ÔÖ Ø Ð Ø ÓÖ Ð ÒÓØ ÓÒ O Ñ ÒØ Ð × ÒÓ Ý Ò Ð × × × ÑÔ ÒÓ ÓØÖÓ Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓ¸ ÒÓÑ Ò Ó Ò× Ö ÓÒ ¸ ÙÝÓ ×ÕÙ Ñ ÒÖÐ× Ó×ÕÙ Ð × Ù ÒØ ÑÓ Ó a[j] = tmp tmp = a[i] j ×ÓÖ Ò A[j] >= A[i] j ÇÖ Ò Ö Ð Ø ÚÓ i ÈÖ Ñ ÖÓ¸ Ð Ð Ñ ÒØÓ Ò Ð ÒØÖ a[i] × Ù Ö Ò tmpº À Ð ÞÕÙ Ö Ð Ò i¸ Ø Ò ÑÓ× ÓÖ Ò Ö Ð Ø ÚÓ × Ö¸ ÐÓ× Ð Ñ ÒØÓ× ×Ø Ò ÓÖ Ò Ó× Ñ × ÒÓ Ò × Ö Ñ ÒØ Ò ×Ù ÔÓ× ÓÒ ¬Ò Ø Ú º ÄÙ Ó¸ Ð Ò j Ö ØÖÓ Ô ÖØ Ö i - 1 ר Ò ÓÒØÖ Ö ÙÒ Ð Ñ ÒØÓ Ñ ÒÓÖ Ó Ù Ð ÕÙ tmp Ò Ð ÒØ Ö Ò Ð Ø Ö ÓÒ¸ Ð Ñ ÒØÓ × Ú ÓÔ Ò Ó Ð Ö Ñ Ò Ö Ø Ð Ö Ò Ó ÙÒ Ö º Ù Ò Ó j × Ø Ö Ö¸ a[j] Ø Ò ÙÒ Ö ÓÒ ÓÐÓ ÑÓ× Ð Ú ÐÓÖ a[i] Ñ ÑÓÖ Þ Ó Ò tmpº ÍÒ ÑÔÐ ÒØ ÓÒ × ÓÑÓ × Ù ½ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½ ½ template <typename T, class Compare> void insertion_sort(T * a, const size_t & l, const size_t & r) { for (int i = l, j; i <= r; ++i) { T tmp = a[i]; // memorice a[i], pues ser´ sobre escrito a Ö ÙÒ Ö ÓÒ Ò× ÖØ Ö ØÑÔ ½ a[j] = tmp; // inserte tmp en la brecha } } ÖÒ Ð Ñ ØÓ Ó ÒØ Ö ÓÖ¸ Ð ÒØ Ö Þ insertion sort() ØÓÑ ÐÓ× Ò × ÞÕÙ Ö Ó Ý Ö Ó ÒØÖ ÐÓ× Ù Ð × × × ÓÖ Ò Ö Ð ÖÖ ÐÓº ר ÒØ Ö Þ × Ö ÙØ Ð Ô Ö ÓÑ Ò Ö ×Ø Ñ ØÓ Ó ÓÒ ÓØÖÓ× Ñ × ×Ӭר Ó׺ Ò ÐÓ ÕÙ × Ù ¸ ×ÙÑ Ö ÑÓ× l = 0 Ý r = n - 1 ½ Ö ÙÒ Ö ÓÒ Ò× ÖØ Ö ØÑÔ ½ ≡ ´½ µ for (j = i; j > l and Compare() (tmp, a[j - 1]); --j) a[j] = a[j - 1]; // desplazar hacia la derecha Ð ÐÓ ÜØ ÖÒÓ ØÙ r − l + 1 = n Ø Ö ÓÒ ×º ÈÓÖ ÐÓ Ø ÒØÓ¸ ר × O(n)º È Ö ×ØÙ Ö Ð ÐÓ ÒØ ÖÒÓ Ö ÙÒ Ö ÓÒ Ò× ÖØ Ö ØÑÔ ½ Ö ÕÙ Ö ÑÓ× ÓÒÓ Ö Ð ÒÙÑ ÖÓ Ú × ÕÙ ×Ø Ø Ö º ר ÒØ ÔÒ Ð Ú ÐÓÖ Ð ÔÖ Ó j > l and Compare() (tmp, a[j - 1])¸ ÙÝÓ Ö ×ÙÐØ Ó Ô Ò Ð Ô ÖÑÙØ ÓÒ ÐÓ× Ð Ñ ÒØÓ× Ò Ð ÒØ ÖÚ ÐÓ [l, i − 1]º Ò ×Ø × ÒØ Ó ÑÓ× ÓÒ× Ö Ö Ú Ö × ÔÓ× Ð × ½º Ë Ð ÒØ ÖÚ ÐÓ [l, i − 1] ר ÓÖ Ò Ó¸ ÒØÓÒ × ÒÓ × ØÙ Ò Ò ÙÒ Ö Ô Ø ÓÒ Ý Ð ÐÓ × O(1)º Ò ×Ø ×Ó¸ Ð Ñ ØÓ Ó × O(n) × O(1) = O(n)º
  • 202.
    176 Cap´ ıtulo 3. Cr´ ıtica de algoritmos ¾º Ë Ð ÒØ ÖÚ ÐÓ [l, i − 1] ר ÓÖ Ò Ñ ÒØ ÒÚ ÖØ Ó × Ö¸ ×Ù× Ð Ñ ÒØÓ× ×Ø Ò ÓÖ Ò Ó× × Ð Ñ ÝÓÖ ×Ø Ð Ñ ÒÓÖ¸ ÒØÓÒ × Ð ÐÓ Ø Ö i − l = i Ú ×¸ ÐÓ ÕÙ ÒÓ× O(i)º ÈÙ ×ØÓ ÕÙ i Ô Ò n¸ ÔÓ ÑÓ× Ö Ö Ø Ñ ÒØ ÕÙ Ð ÐÓ × O(n)º ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð Ñ ØÓ Ó × O(n) × O(n) = O(n2)º Ä × × ØÙ ÓÒ × ÔÐ ÒØ × ÓÒ× Ö Ò Ó× × Ò Ö Ó× Ù ÓÒ Ð Ñ ÓÖ ×Ó¸ Ù Ò Ó Ð ÖÖ ÐÓ ×Ø ÓÖ Ò Ó¸ Ý Ð Ô ÓÖ¸ Ù Ò Ó Ð ÖÖ ÐÓ ×Ø ÓÑÔÐ Ø Ñ ÒØ ÒÚ ÖØ Óº Ë Ð ×ÔÓ× ÓÒ Ð ÖÖ ÐÓ × Ð ØÓÖ ¸ ÒØÓÒ ×¸ ÙÒÓ ÐÓ× × Ò Ö Ó× Ø Ò ÙÒ ÔÖÓ Ð Ó ÙÖÖ Ò 1 n! ÙÒ ÑÙÝ ÔÖÓ Ð ÙÒ Ón × ÖÒ º × Ô٠׸ Ò ÙÒ ×Ó Ó Ò Ð ÓØÖÓ¸ Ð Ò Ð × × Ô Ü Ö Ñ ÒØ ÓÔØ Ñ ×Ø Ó Ô × Ñ ×Ø ¸ ÓÒ Ð ÓÒ× Ù ÒØ Ô Ð ÖÓ × Ö ÖÖ Ð ×Ø Ð ÑÓÑ ÒØÓ ÜÔÖ × Ö Ð × ÑÔ ÒÓ Ð Ñ ØÓ Óº È Ö ÔÖ Ö ÐÓ ÕÙ ×Ù Ö ÑÓ× ÓÒ× Ö Ö Ð ×Ó ×Ô Ö Óº Ë ÓÒ× Ö ÑÓ× Ð × Ù Ò ÓÑÓ ÙÒ Ô ÖÑÙØ ÓÒ Ð ØÓÖ ¸ ÒØÓÒ × Ð Ú ÐÓÖ Ð Ò Ö j Ø Ò ÙÒ ÔÖÓ Ð ÙÒ ÓÖÑ ÒØÖ l i − 1º Ð ÒÙÑ ÖÓ ×Ô Ö Ó Ø Ö ÓÒ × Ð ÐÓ Ö ÙÒ Ö ÓÒ Ò× ÖØ Ö ØÑÔ ½ × Ö Ð ×Ô Ö ÒÞ ÙÒ ×ØÖ Ù ÓÒ ÙÒ ÓÖÑ × Ö Ø ÒØÖ l i − 1 Ý Ð ÐÓ Ö Ô Ø Ö r−l+1 Ú ×º ×ØÓ 2 × O(n)¸ ÐÓ ÕÙ ÒÓ× ÓÑÓ ÓÒ ÐÙ× ÓÒ × ÑÔ ÒÓ Ð Ñ ØÓ Ó O(n) × O(n) = O(n2) Ð Ñ ×ÑÓ Ö ×ÙÐØ Ó Ð Ô ÓÖ ×Óº ÓÑÔ Ö ÑÓ× Ð Ñ ØÓ Ó Ò× Ö ÓÒ ÓÒ Ð × Ð ÓÒº Ù Ð × Ð Ñ ÓÖ Ë Ü¹ Ñ Ò ÑÓ× Ð Ö Ñ ÒØ Ð Ö ×ÙÐØ Ó¸ ÒØÓÒ × ÔÓ ÑÓ× ÓÒ ÐÙ Ö¸ ÖÖÓÒ Ñ ÒØ ¸ ÕÙ ×ÓÒ ÕÙ Ú Ð ÒØ × ¹ÕÙ ÐÓ ×ÓÒ¸ × ÒØÓØ Ñ ÒØ ¹º ÑÔ ÖÓ¸ Ð Ð ÞÓ ÒØ ÖÒÓ Ð Ñ ØÓ Ó × ¹ Ð ÓÒ ´ Ë Ñ Ò Ð Ò Ñ ÒÓÖ ÒØÖ · ½ Ý Ò ¹ ½ ½ ¿ µ × ÑÔÖ Ø Ö n − i + 1 Ú ×¸ Ò Ô Ò ÒØ Ñ ÒØ Ð Ô ÖÑÙØ ÓÒ a[i+1 .. n -1] Ñ ÒØÖ × ÕÙ Ð ÒØ Ø Ö ÓÒ × Ð Ð ÞÓ ÒØ ÖÒÓ Ð Ò× Ö ÓÒ ´ Ö ÙÒ Ö ÓÒ Ò× ÖØ Ö ØÑÔ ½ µ Ô Ò Ð Ô ÖÑÙØ ÓÒ a[l .. i - 1] º È Ö ÔÖ Ò Ö ×Ø Ó¸ × ÓÒÚ Ò ÒØ ÔÖÓ ÙÒ Þ Ö Ð Ò Ð × × Ð Ñ ØÓ Ó Ò× Ö ÓÒ Ô Ö Ð ×Ó ÔÖÓÑ Óº Ë ÔÖÓÜ Ñ ÑÓ× Ð ÒÙÑ ÖÓ Ö Ô Ø ÓÒ × Ð Ð ÞÓ ÒØ ÖÒÓ 2 ¸ ÒØÓÒ × Ø Ò ÑÓ× ÓÑÓ ¹ i × ÑÔ ÒÓ n−1 i n(n − 1) = ; 2 4 i=1 ÕÙ × ÕÙ Ú Ð ÒØ Ð Ñ Ø Ø ÑÔÓ Ð Ñ ØÓ Ó × Ð ÓÒº Ë Ò Ð × ÙÖÚ × Ñ Ó× Ñ ØÓ Ó× ×ÓÒ Ù Ö Ø ×¸ Ð Ð Ò× Ö ÓÒ × Ò Ö ÓÖ Ð Ð × Ð ÓÒº ÈÓÖ ×Ù × ÑÔÐ ÑÔÐ ÒØ ÓÒ¸ ×Ù Ó Óר ÓÒר ÒØ Ý ×Ù Ù Ò × ÑÔ ÒÓ Ô Ö Ô ÖÑÙØ ÓÒ × Ù × ¹ÓÖ Ò × ´O(n)µ¸ Ð Ñ ØÓ Ó Ò× Ö ÓÒ × ÙÒ Ü Ð ÒØ ÐØ ÖÒ Ø Ú Ô Ö ÓÖ Ò Ö × Ù Ò × Ô ÕÙ Ò ×º Ä Ú Ö× ÓÒ Ô Ö Ð ×Ø × × Ñ × × Ò ÐÐ ¸ ÔÙ × ÒÓ × Ö ÕÙ Ö Ò Ñ Ò Ö Ò × Ø Ò ×ÓÐÓ Ö ÓÖÖ Ö Ð Ð ×Ø Ö Ò× ÖØ Ò Ó ÓÖ Ò Ñ ÒØ Ò ÓØÖ Ð ×Ø ÒÓ Ó Ó × ÖÚ Óº ר ØÚ Ùר ¬ Ð ÔÖ × Ò Ð ÔÖ Ñ Ø Ú × Ù ÒØ ½ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½ ½ template <class Compare> void insert_sorted(Dlink & list, Dlink * p) { typename Dlink::Iterator it(list); ÆÓØ ÕÙ Ø Ò × ÒØ Ó ÓÑÔ Ö Ö a[i+1 .. r] ÓÒ a[l .. i - 1] Ò ÙÒÓ ÐÓ× Ñ ØÓ Ó׺ Ò ØÓ¸ ÔÓÖ Ô ÖÑÙØ ÓÒ a[i+1 .. r]¸ Ü ×Ø ÓØÖ ÓÑÔÐ Ñ ÒØ Ö a[l .. i - 1] ÕÙ Ø Ò Ð Ñ ×Ñ ÔÖÓ Ð º
  • 203.
    3.1. An´lisis dealgoritmos a 177 while (it.has_current() and Compare () (it.get_current(), p)) it.next(); if (it.has_current()) it.get_current()->append(p); // insertar a la derecha de current else list.append(p); } ¬Ò × insert sorted¸ Ù× Ò ÙÒ ½ º insert sorted() Ò× ÖØ Ð ÒÓ Ó p Ò Ð Ð ×Ø ÓÖ Ò list × ÙÒ Ð Ö Ø Ö Ó Óѹ Ô Ö ÓÒ Compareº ÓÒ ×Ø ÔÖ Ñ Ø Ú ¸ Ð ÓÖ Ò Ñ ÒØÓ ÔÓÖ Ò× Ö ÓÒ ÕÙ ÓÒ × Ñ ÒØ ¬Ò Ó ½ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½ ½ template <class Compare> void insertion_sort(Dlink & list) { Dlink aux; while (not list.is_empty()) insert_sorted<Compare>(aux, list.remove_next()); list.swap(&aux); } Í× × insert sorted ½ º insert sorted() ÙØ ÙÒ ×ÓÐ Ø Ö ÓÒ × Ù Ò × ÓÒר ÒØ ׺ Ä ÙÖ ÓÒ Ð Ø Ö ÓÒ Ô Ò Ö Ð Ô ÖÑÙØ ÓÒ Ð × Ù Ò list Ý Ð Ú ÐÓÖ ÐÑ Ò Ó Ò Ð ÒÓ Ó pº ר × Ð Ñ ×Ñ × ØÙ ÓÒ ÕÙ ÓÒ Ð Ú Ö× ÓÒ Ô Ö ÖÖ ÐÓ׺ Ð Ø ÑÔÓ insert sorted() ׸ ÒØÓÒ ×¸ O(n) Ô Ö Ð Ô ÓÖ ×Ó Ý Ô Ö Ð ×Ô Ö Óº Ä Ò× Ö ÓÒ × ÐÐ Ñ × ÓØÖÓ ÐÓÕÙ Ø Ö Ø ÚÓ ÙÝÓ Ø ÑÔÓ ×¸ ÓÒ ÖØ ØÙ ¸ O(n)¸ ÔÙ × Ý ÕÙ Ö ÓÖÖ Ö ØÓ Ð Ð ×Ø º × Ô٠׸ ÓÑÓ × ×Ô Ö Ö× ¸ Ð Ñ ØÓ Ó × O(n2)º ÆÓ× Ö ×Ø ÜÔÓÖØ Ö ×Ô Ð Þ ÓÒ × ÔÓÖ ÓÑ × ÓÒ Ô Ö Ð Ø ÔÓ Dnode<T> ½ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½ ½¾ template <typename T, class Compare> void insertion_sort(Dnode<T> & list) { insertion_sort < Compare_Dnode<T, Compare> > (list); } Í× × Compare Dnode ½ Ò Dnode º 3.1.9 B´squeda binaria u Ð Ò Ð × × Ð Ñ ØÓ Ó Ò× Ö ÓÒ Ó × Ð ÓÒ ØÖ Ú × ÓÔ Ö ÓÒ × O × × ÑÔÐ Ý Ö ØÓº Ò ÑÙ × Ó × ÓÒ ×¸ ×Ó Ö ØÓ Ó Ò Ð ÓÖ ØÑÓ× Ö ÙÖ× ÚÓ׸ × ÔÐ ÒØ Ö ÙÒ Ù ÓÒ Ö ÙÖÖ Ò º ÁÐÙ×ØÖ ÑÓ× ×Ø Ñ ÒØ Ð Ú Ö× ÓÒ Ö ÙÖ× Ú Ð Ù×ÕÙ Ò Ö ×Ó Ö ÙÒ ÖÖ ÐÓ ÓÖ Ò Ó ½ Å ØÓ Ó× Ù×ÕÙ ½ ≡ template <typename T, class Compare> int binary_search_rec(T * a, const T & x, const int & l, const int & r) { const int m = (l + r) / 2;
  • 204.
    178 Cap´ ıtulo 3. Cr´ ıtica de algoritmos if (l > r) return m; if (Compare() (x, a[m])) return binary_search_rec<T, Compare>(a, l, m - 1); else if (Compare() (a[m], x)) return binary_search_rec<T, Compare>(a, m + 1, r); return m; // encontrado } Ð Ð ÓÖ ØÑÓ Ù× Ö ÙÖ× Ú Ñ ÒØ ÙÒ Ó ÙÖÖ Ò Ð Ð Ñ ÒØÓ x Ò ÙÒ ÖÖ ÐÓ ÕÙ ×Ø ÓÖ Ò Ó ÒØÖ l Ý rº Ë l > r¸ ÒØÓÒ × Ð Ö Ò Ó Ù×ÕÙ ×Ø Ú Ó Ý Ø Ò ÑÓ× Ð ÖØ ØÙ ÕÙ Ð Ð Ñ ÒØÓ x ÒÓ × Ò Ù ÒØÖ ÒØÖÓ Ð Ö Ò Óº ÐÓ ÓÒØÖ Ö Ó¸ Ò×Ô ÓÒ ÑÓ× Ð Ð Ñ ÒØÓ × ØÙ Ó Ò Ð ÒØÖÓ × ×Ø ÓÒØ Ò Ð Ú ÐÓÖ x¸ ÒØÓÒ × m × Ð Ö ×ÙÐØ Óº Ë ÒÓ¸ ÑÓ׸ × ÙÒ Ð ÓÖ Ò x¸ Ò Ù Ð ÐÓ× Ó× ×Ù Ö Ò Ó× ÑÓ× Ù× Ö Ð ÞÕÙ Ö Ó Ó Ð Ö Óº ×ÙÑ ÑÓ× ÕÙ Ð Ö Ò Ó [l, r] × Ö ÒÐ nº Ù Ò Ó n ≤ 0 Ð Ð ÓÖ ØÑÓ Ø ÖÑ Ò Ò Ø ÑÔÓ ÓÒר ÒØ O(1)º Ë ¸ ÔÓÖ Ð ÓÒØÖ Ö Ó¸ Ü ×Ø Ò Ð Ñ ÒØÓ× ÒØÖÓ Ð Ö Ò Ó¸ ÒØÓÒ × ÔÙ Ò Ó ÙÖÖ Ö Ó× Ó× × Ó Ð Ð Ñ ÒØÓ × Ò Ù ÒØÖ Ò Ð ÒØÖÓ¸ Ó Ý ÕÙ Ù× Ö Ö ÙÖ× Ú Ñ ÒØ Ò Ð ÙÒ Ð × Ô ÖØ ÓÒ ×º ÈÙ ×ØÓ ÕÙ Ð Ô ÖØ ÓÒ Ó ÙÖÖ Ü Ø Ñ ÒØ ÔÓÖ Ð ÒØÖÓ¸ Ð Ö ×ØÓ Ð Ø ÑÔÓ × ÓÒ×ÙÑ ×Ó Ö ÔÖÓÜ Ñ Ñ ÒØ Ð Ñ Ø Ð ÒØÖ º ÈÐ ÒØ ÑÓ׸ Ô٠׸ Ð × Ù ÒØ Ù ÓÒ Ö ÙÖÖ ÒØ T (n) = O(1) × n≤0 . ´¿º½ µ T (n/2) + O(1) × n ≥ 1 ÆÓØ ÑÓ× ÕÙ Ü ×Ø ÙÒ Ð ÖÓ ÖÖÓÖ Ò Ð Ö ÙÖÖ Ò Ð ÐÐ Ñ Ö ÙÖ× Ú Ó ÙÖÖ ×Ó¹ Ö T ((n − 1)/2) Ý ÒÓ ×Ó Ö T (n/2) ÓÑÓ × ÜÔÖ × Ò ´¿º½ µº ר ÖÖÓÖ¸ ÕÙ ÐØ Ñ Ò ÔÙÐ Ö T (n)¸ × ×ÔÖ Ð ¸ ÔÙ × ÙÒ Ô ×Ó Ù ÓÒ Ñ ÒÓ× ÒÓ ÐØ Ö Ö Ð Óѹ ÔÓÖØ Ñ ÒØÓ × ÒØÓØ Ó T (n)º ØÙ ÑÓ× Ð ØÖ Ò× ÓÖÑ ÓÒ n = 2k =⇒ k = Ð (n) ×ØÓ ×ÙÑ ÕÙ n × ÙÒ ÔÓØ Ò Ü Ø 2¸ ÐÓ Ù Ð × ÑÙ × Ú × ÒÓ × Ö Ð ×Ó¸ × × Ú Ð Ó Ò Ð ÓÑ Ò Ó Ð ÒÓØ ÓÒ Oº Ä Ö ÙÖÖ Ò ´¿º½ µ × ÜÔÖ × ¸ ÒØÓÒ × T (2k) = × k=0 . O(1) ´¿º½ µ T (2k−1) + 1 × k > 0 ÄÓ ÒØ Ö × ÒØ Ð ØÖ Ò× ÓÖÑ ÓÒ × ÕÙ ÜÔÖ × Ö Ø Ñ ÒØ Ð Ö ÙÖÖ Ò ÓÑÓ ÙÒ ×ÙÑ ØÓÖ º Ò ØÓ¸ ÜÔ Ò Ò ÓÐ Ø Ò ÑÓ× T (2k) = T (2k−1) + 1 = T (2k−2) + 1 + 1 = T (200) + 1 + · · · + 1 + 1 = k + 1 ´¿º½ µ ÓÖ Ö Ð Þ ÑÓ× Ð ØÖ Ò× ÓÖÑ ÓÒ ÒÚ Ö× T (n) = Ð (n) + 1 , ´¿º½ µ Ð Ù Ð Ð Ö Ñ ÒØ × O(Ð (n)) ÙÒ ¬ Ò ×Ô Ø ÙÐ Öº Ä Ù×ÕÙ Ò Ö ×¸ Ò Ð Ô ÓÖ ×Ó¸ O(Ð (n))º Ë Ö ÕÙ Ö ÙÔÐ Ö Ð ÒØÖ Ô Ö ÕÙ Ð Ð ÓÖ ØÑÓ ÑÓÖ ÙÒ ÙÒ Ø ÑÔÓ Ñ ×º
  • 205.
    3.1. An´lisis dealgoritmos a 179 3.1.10 Errores de la notaci´n O o À Ý Ó× ÓÒ × ×Ø ÒØ ÒÓØ Ð × Ð ÒÓØ ÓÒ Oº Ò ÔÖ Ñ Ö ÐÙ Ö¸ ÐÐ Ó Ø Þ Ð ÑÔÖ × ÓÒº ÈÓ ÑÓ× ÒØ ÖÔÖ Ø Ö ÕÙ Ð × ÓÒר ÒØ × Ð ¬Ò ÓÒ c Ý n1 ×ÓÖ Ò Ð × Ó× Ò Ö × × ×Ù Ø Ú × ÕÙ Ý ÑÓ× × Ò Ð Ó ´Ø ÔÓ ÓÑÔÙØ ÓÖ¸ ºººµº Ò × ÙÒ Òר Ò ¸ Ð ÒÓØ ÓÒ Ô ÖÑ Ø ×ØÙ Ö ÙÒ ÓÒ × T (n) Ð Ø ÑÔÓ ÙÒ Ð ÓÖ ØÑÓ Ó ÙÒ Ñ ØÓ Ó ÓÒ× Ö Ð Ñ ÒØ Ñ × × Ò ÐÐÓ ÕÙ Ð ÓÒØ Ó Ý Ð Ö ØÖ ÓÒ Ðº È ÖÓ ØÓ Ó Ø Þ ÓÒ ÖÖ ÙÒ ÔÖ Ó¸ ÔÓÖ ÖØÓ ×Ø ÒØ Ó Ø ÚÓ Ý Ò Ö Ð ØÓ Ó Ø Þ ÓÒ¸ Ù Ð × Ð Ó ÙÐØ Ñ ÒØÓ ÕÙ ÐÐÓ ×Ù Ø ÚÓ ÕÙ ¸ ÒÓ ×ÓÐÓ Ò ÑÙ Ó× ×Ó× ÔÙ × Ö ÑÔÓÖØ ÒØ × ÑÓ¸ × ÒÓ × ÖÐ × Ò Ð × ÑÓ¸ ÔÙ × × ÖÖ × × Ò ×ÙÔÖ ÑÓ ÐÐ Ñ Ó Ú Ö º ×ÔÙ × Ò Ð Þ Ö Ð Ñ ØÓ Ó Ò× Ö ÓÒ Ý ÓÑÔ Ö ÖÐÓ ÓÒ Ð × Ð ÓÒ¸ ÔÓ ÑÓ× Ö × ÐØ Ö ÕÙ Ð ÒÓØ ÓÒ O ×ÓÐÓ ÖÖÓ Ð ÓÖÑ T (n) Ô Ö ÒØÖ × ÑÙÝ Ö Ò ×º Ó¸ Ð ÑÔÖ × ÓÒ Ð ÒÓØ ÓÒ O × ¸ ÒØÖ ÓØÖÓ× ×Ô ØÓ׸ ÐÓ× ÕÙ × Ö ×ÙÑ Ò Ò Ð × × Ù ÒØ × Ó × ÖÚ ÓÒ × ½º ÆÓ × ÓÒ× Ö Ò ÐÓ× Óר × ÓÒר ÒØ × Ð Ð ÓÖ ØÑÓ Ð ÔÖÓÔ ¬Ò ÓÒ O × ÖØ Ð × ÓÔ Ö ÓÒ × ÕÙ ØÓÑ Ò Ø ÑÔÓ ÓÒר ÒØ Ò O(1)º ¾º ÄÓ× Óר × Ú Ö Ð ×¸ Ô ÖÓ Ò Ö ÓÖ × Ð ÙÖÚ ÓÑ Ò ÒØ ¸ Ø ÑÔÓ Ó × ÓÒ× Ö Òº ÈÓÖ ÑÔÐÓ¸ ×ÙÔÓÒ ÑÓ× ÙÒ Ð ÓÖ ØÑÓ Ù Ö Ø Ó ÓÒ ÙÒ × Ò Ð ÔÖ ÔÖÓ ¹ × Ñ ÒØÓ O(n)¸ ÐÙ Ó ÙÒ × O(n2) ÓÒ × ÙØ Ð Ð ÓÖ ØÑÓ Ò × Ý¸ ¬Ò ÐÑ ÒØ ¸ ÙÒ × ¬Ò Ð ÔÓרÔÖÓ × Ñ ÒØÓ O(n)º Ò ×Ø ×Ó¸ Ð Ø ÑÔÓ Ù ÓÒ ×¹ ØÖ Ó ÔÓÖ O(n) + O(n2) + O(n) = O(n2)º ÓÖ Ò¸ Ð Ö ×ÙÐØ Ó ¬Ò Ð O(n2) Ó ÙÐØ ÓÑÔÐ Ø Ñ ÒØ Ó× Óר × ÓÒ× Ö Ð × ×Ó Ó× Ð Ð ÓÖ ØÑÓ Ð ÔÖ Ý Ð ÔÓרÔÖÓ × Ñ ÒØÓ¸ ÐÓ× Ù Ð ×¸ ÙÒ Ù Ò Ó ×ÓÒ Ð Ò Ð ×¸ ÔÙ Ò × Ö ÓרÓ× × ÑÓ× × ÓÒÐÐ Ú Ò ÙÒ ÓÒר ÒØ ÑÙÝ ÐØ º ¿º Ð Ö Ø Ö Ö Ð T (n) × × ÓÒ ØÓØ ÐÑ ÒØ ÔÓÖ Ð ÓØ ÓÒ O(f(n)) Ô٠׸ Ò Ð Ñ ÝÓÖ Ð × Ú ×¸ T (n) = f(n) Ò ×Ø × ÒØ Ó¸ × Ò Ð Ö ÕÙ O(f(n)) ×ÓÐÓ Ø Ò × ÒØ Ó Ô Ö ÒØÖ × Ñ ÝÓÖ × ÕÙ Ð ÓÒר ÒØ n1 ÔÐ ÒØ ÒÐ ¬Ò ÓÒ ¿º½º Ò ÓØÖ × Ô Ð Ö ×¸ ¬ÖÑ Ö ÕÙ T (n) = O(f(n)) × ÓÒÓ Ð Óѹ ÔÓÖØ Ñ ÒØÓ T (n) ÒØ × n1º Ä Ö ¬ ¿º × Ò Ð ¸ ÖØ × Ò Ñ ÒØ Ð Ò Ó¸ Ð ÓÑ Ò Ó ÓÒ Ð ÒÓØ ÓÒ O × ÓÒ¸ ÖØ ØÙ ¸ Ú Ö Ä ÒÓØ ÓÒ O × ÖØ Ö Ñ ÒØ ÔÖ × Ò Ð ÓÑ Ò Ó ÐÓ Ò¬Ò ØÓ ´Ó Ð Ø ÖÒ µ¸ Ô ÖÓ ×Ø ÓÑ Ò Ó ÔÙ × Ö ÑÙÝ ×ØÖ ØÓ Ý Ð ÒÓ Ð ÙÒ Ö Ð ÓÒ Ö Ø º ÈÓÖ ×Ó¸ ÓÑÓ Ò ØÓ Ó ÐÓ Ó Ø ÚÓ¸ Ý ÕÙ Ò Ö ÓÒ ×ÙÑÓ Ù Óº Óר × ÑÙÝ Ö Ò ×¸ Ò ÓÖ Ð ×¸ Ô ÖÓ ÓÒר ÒØ ׸ ÔÙ Ò ÕÙ Ö ÓÑÔÐ Ø Ñ ÒØ Ó ÙÐØÓ× ÔÓÖ ÙÒ Ò Ð × × Oº ÄÓ Ñ ×ÑÓ ÔÙ ×Ù Ö ÓÒ ÓØÖÓ× Óר × × ÒØÓØ Ñ ÒØ Ò Ö ÓÖ × Ô ÖÓ ÓÒר ÒØ Ñ ÒØ ×ÙÔ Ö ÓÖ ×º Ò Ò ÙÖ ¸ Ð Ó ÙÐØ Ñ ÒØÓ ØÓØ Ð Ð ÓÖÑ T (n)¸ ÔÙ ÖÖ Ö ×ÓÖÔÖ × × × Ð Ù ÓÒ ×ÓÐÓ Ø Ò × ÒØ Ó Ô Ö × Ð × Ò Ö ÓÖ × Ð ÓØ × ÒØÓØ n1 Ð ¬Ò ÓÒ ¿º½º ÉÙ Þ ÐÓ Ô ÓÖ¸ ÔÓÐ Ø Ñ ÒØ Ð Ò Ó¸ × ÕÙ ÙÒ Ú Þ ÔÙ Ð Ó ÙÒ Ò Ð × × O¸ Ð ÓÒÓ Ñ ÒØÓ ÕÙ ÐÐÓ× Óר × Ý × Ò Ð Ó× Ø Ò Ò × ÔÙÐØ Ö× Ô Ö × ÑÔÖ º
  • 206.
    180 Cap´ ıtulo 3. Cr´ ıtica de algoritmos ∞ ∞ ÓÑ Ò Ó Ü ØÓ Ð ÒÓØ ÓÒ O Ê Ð n1 ∞ ÙÖ ¿º ÁÐÙ×ØÖ ÓÒ Ö ¬ Ð ÓÑ Ò Ó Ð ÒÓØ ÓÒ O 3.1.11 Tipos de an´lisis a ÓÑÓ Ý Ö Ø Ö Ø Ú Ñ ÒØ ÐÓ ÑÓ× Ó¸ Ý Ð ÓÖ ØÑÓ× ÕÙ ÒÓ ×ÓÐÓ Ô Ò Ò Ð Ø Ñ ÒÓ Ð ÒØÖ ¸ × ÒÓ¸ Ø Ñ Ò¸ Ð ÓÖÑ Ò ÕÙ × ÔÖ × ÒØ Ð ÒØÖ º Ð Ñ ØÓ Ó Ò× Ö ÓÒ Ó Ö ÙÒ Ù Ò ÑÔÐÓº ÈÓÖ ÐÓ Ò Ö Ð¸ Ù Ò Ó × Ò Ð Þ ÙÒ Ð ÓÖ ØÑÓ × ÓÒ× Ö Ò Ó× Ô Ö×Ô Ø Ú ×º Ä ÔÖ Ñ Ö ÓÒ× ×Ø Ò Ò Ð Þ ÖÐÓ Ô Ö Ð ÒØÖ ÕÙ Ù× Ð Ô ÓÖ Ù ÓÒ Ð × ÙÒ Ô Ö Ð ÒØÖ ×Ô Ö º × × ÑÔÖ × Ö ÕÙ Ö Ð Ò Ð × × Ô Ö Ð Ô ÓÖ ÒØÖ ¸ ÔÙ × ×Ø ÔÐ ÒØ ÙÒ ÓØ Ù ÓÒº Ð Ô ÓÖ ×Ó ÒÓ× Ó Ö ÙÒ ×Ô Ö ÒØ Ö Ð Ø ÑÔÓ Ù ÓÒ¸ ÔÙ × Ù ÐÕÙ Ö ÓØÖ ÒØÖ Ö ÒØ Ð Ô ÓÖ × Ö Ñ ÓÖº ר Ö ÒØ × ÔÖ Ð Ù Ò Ó × Ö ÕÙ Ö Ò Ð ÓÖ ØÑÓ× ÓÒ Ö ÕÙ Ö Ñ ÒØÓ× Ù ÓÒ ÙÖÓ׸ ÕÙ ÒÓ × ÔÙ Ò ­ Ü Ð Þ Ö Ý Ò ÐÓ× Ù Ð × ÒÓ × ÔÙ Ø Ò Ö Ð ÐÙ Ó Ø Ò Ö ÙÒ Ñ Ð Ù ÓÒº Ð Ò Ð × × Ô Ö Ð ÒØÖ ×Ô Ö ÔÐ ÒØ ÙÒ ÔÖ ÓÒ¸ ÙÒ ÜÔ Ø Ø Ú Ö Ð Ø ÑÔÓ Ù ÓÒ Ñ × ÔÖÓ Ð º Ë ØÖ Ø ÙÒ ×Ô Ö ÒÞ × Ö¸ ÐÓ ÕÙ × ×Ô Ö ÕÙ ×Ù ÑÙ × Ú ×¸ Ô ÖÓ ÒÓ × ÑÔÖ º Ä ÔÖÓÔÓÖ ÓÒ Ú × ÕÙ Ð Ð ÓÖ ØÑÓ × ÓÑÔÓÖØ Ö ÓÑÓ ÐÓ ×Ô Ö Ó Ô Ò Ö Ð Ú Ö ÒÞ Ð ÒØÖ º × Ñ ÒØ ¸ ר Ø ÔÓ Ò Ð × × × ÔÙ ÔÐ ÒØ Ö Ò Ó× × ØÙ ÓÒ ×º Ä ÔÖ Ñ Ö Ù Ò Ó Ð ÒØÖ ×Ô Ö × ×Ø ÒØ ÔÖÓ Ð × Ö¸ Ù Ò Ó Ð Ú Ö ÒÞ Ð ÒØÖ × Ô ÕÙ Ò º Ä × ÙÒ × ØÙ ÓÒ Ù Ò Ó × ÔÐ ÒØ ÓÑÓ Ö ÕÙ Ö Ñ ÒØÓ × Ø × Ö Ð ÔÖÓÑ Ó ×Ó× × Ò ÑÔÓÖØ Ö Ð ÙÒ × Ñ Ð × Ù ÓÒ × Ù× × ÔÓÖ ÙÒ Ñ Ð ÒØÖ º Ò Ñ × × ØÙ ÓÒ × × ÑÔÓÖØ ÒØ ÓÒÓ Ö Ð Ú Ö ÒÞ º 3.2 Algoritmos dividir/combinar ÍÒ Ø Ò Ð ÒØ Ô Ö Ö ×ÓÐÚ Ö ÙÒ ÔÖÓ Ð Ñ ÓÒ× ×Ø Ò Ú ÖÐÓ Ò Ó× ÔÖÓ Ð Ñ × Õ¹ Ù Ø Ø ÚÓ׸ ÙÝ × ÓÑÔР׸ Ñ ÒÙ Ó ÜÔÖ × × Ò ÙÒ ÓÒ Ð × Ð ¸ ×ÓÒ Ñ ÒÓÖ × ÕÙ Ð × Ð ÔÖÓ Ð Ñ Ò Ðº Ð ÔÖÓ ×Ó Ú × ÓÒ × Ö Ô Ø Ö ÙÖÖ ÒØ Ñ ÒØ ÓÒ ÙÒ Ð × Ô ÖØ × ×Ø Ð ÒÞ Ö ÓÑÔÐ × Ô ÖØ ÙÐ Ö × ÙÝ ×ÓÐÙ ÓÒ × ÓÒÓ º Ô ÖØ Ö ×Ø ÑÓÑ ÒØÓ¸ × ÓÑ Ò ÙÒ Ô Ö ×ÓÐÙ ÓÒ × Ô Ö Ò ÓÒØÖ Ö Ð ×ÓÐÙ ÓÒ
  • 207.
    3.2. Algoritmos dividir/combinar 181 Ð ÔÖÓ Ð Ñ Ò Ö Ð ÔÖ Ñ Ò Ñ ÒØ Ú Óº Ð ÓÑ Ò ÓÒ Ó× ×ÓÐÙ ÓÒ × Ô Ö Ó Ø Ò Ö Ð ×ÓÐÙ ÓÒ ÓÑÔÐ Ø × Ð ÒÓÑ Ò ÓÑ Ò ÓÒ Ó ÓÒÕÙ ×Ø º È Ö ÔÐ Ö ×Ø Ø Ò × Ö ÕÙ Ö ´½µ × Ö Ú Ö Ð ÔÖÓ Ð Ñ Ý ´¾µ × Ö ÓÑ Ò Öº ר × Ð Ô ÖØ ×Ù Ø Ú × Ñ Ò Ð × ÒÓ ÙÒ Ð ÓÖ ØÑÓ Ú Ö» ÓÑ Ò Öº ÈÓÖ ÓÒØÖ ×Ø ¸ Ð ×ØÖÙ ØÙÖ Ý Ò Ð × × ×Ø Ð × Ð ÓÖ ØÑÓ× Ø Ò ÙÒ ×ÕÙ Ñ ÑÙÝ Ó Ø ÚÓº Ó ÙÒ ÔÖÓ Ð Ñ P ÓÒ ÒØÖ Ø Ñ ÒÓ n¸ ÙÒ Ð ÓÖ ØÑÓ Ú Ö» ÓÑ Ò Ö¸ ÙÝ ÙÖ ÓÒ × × Ö ÔÓÖ Ð ÙÒ ÓÒ T (n) Ý ÕÙ Ö ×Ù ÐÚ P × ×ØÖÙ ØÙÖ ¸ Ñ Ò Ö Ò Ö Ð Ý Ó Ø Ú ¸ Ò Ð × Ô ÖØ × × Ù ÒØ × ½º Identificaci´n de un problema particular y su soluci´n o o ר Ô ÖØ ÒØ ¬ ÙÒ ×ÓÐÙ ÓÒ Ô ÖØ ÙÐ Ö Ð ÔÖÓ Ð Ñ Ô Ö ÙÒ Ø Ñ ÒÓ Ô ÖØ ÙÐ Ö ÒØÖ n < nbº Ò ×Ø × ¸ × Ö ÕÙ Ö ÓÒÓ Ö ÓÑÓ Ö ×ÓÐÚ Ö Ð ÔÖÓ Ð Ñ Ô Ö Ð Ó ÙÖÖ Ò ÒØÖ Ô ÖØ ÙÐ Öº ר Ô ÖØ × Ð ÐÐ Ñ × º ×ÙÑ ÑÓ× ÕÙ Ð ×ÓÐÙ ÓÒ × Ù ×Ø T (nb)º ÈÙ ×ØÓ ÕÙ nb × ÓÒר ÒØ ¸ ÐÓ Ñ × ÔÖÓ Ð × ÕÙ T (nb) × ÓÒר ÒØ ¸ ÔÓÖ ÐÓ ÕÙ ¸ Ð Ñ ÝÓÖ Ð × Ú ×¸ Ð Óר T (nb) = O(1), n ≤ nbº ¾º Divisi´no Ò ×Ø Ô ÖØ × Ú Ð ÔÖÓ Ð Ñ Ò Ó× Ô ÖØ ÓÒ × ÕÙ Ø Ø Ú × Ø Ñ ÒÓ× n1 ≈ n2 ≈ n º 2 ×ÙÑ ÑÓ× ÕÙ Ð Ú × ÓÒ Ù ×Ø O(fd(n))º ¿º Recursi´n o ר Ô ÖØ ÓÒ× ×Ø Ò Ö ×ÓÐÚ Ö Ö ÙÖ× Ú Ñ ÒØ Ô ÖØ ÓÒ Ý Ó Ø Ò Ö ×ÓÐÙ¹ ÓÒ × s1(n1) Ý s2(n2)º ÈÙ ×ØÓ ÕÙ Ó ÙÖÖ Ò ÐÐ Ñ × Ö ÙÖ× Ú ×¸ Ð Óר × × ÓÒÓ Ó ×Ø Ø ÒØÓ ÒÓ × ÓÒÓÞ Ð Óר Ð ×Ó × Ý Ð ÓÑ Ò ÓÒº ÑÔ ÖÓ¸ Ñ ÒÙ Ó Ð Óר ÔÙ ÜÔÖ × Ö× Ö ÙÖ× Ú Ñ ÒØ ÓÑÓ T (n1) + T (n2)¸ ÔÙ × Ð × ÐÐ Ñ × Ö ÙÖ× Ú × × ÓÖÖ ×ÔÓÒ Ò ÓÒ Ð Ñ ×Ñ ÙÒ ÓÒ ÙÖ ÓÒ¸ Ô ÖÓ Ô Ö ÒØÖ × Ñ ÒÓÖ ×º º Combinaci´n o Ò ×Ø × × ÓÑ Ò Ò Ð × ×ÓÐÙ ÓÒ × s1(n1) Ý s2(n2) Ö ×ÙÐØ ÒØ × Ð × ÐÐ Ñ × Ö ÙÖ× Ú × Ò ÙÒ ×ÓÐÙ ÓÒ ¬Ò Ø Ú Ð ÔÖÓ Ð Ñ º ×ÙÑ ÑÓ× ÕÙ Ð ÓÑ Ò ÓÒ Ù ×Ø O(fc(n))º ÐÓ ÕÙ Ò ×Ø ÓÒØ ÜØÓ ÐÐ Ñ ÑÓ× ÓÑ Ò Ö ¸ Ò Ò Ð ×¸ ØÖ ÓÒ ÐÑ ÒØ ¸ × Ð ÒÓÑ Ò ÓÒÕÙ ×¹ Ø Ö º ÓÖ Ò¸ Ô Ö ÒÓ×ÓØÖÓ׸ Ñ Ö ÒÓ׸ ÕÙ Ò × Ù ÑÓ× ÓÒÕÙ ×Ø Ó× Ý Ú × ÐÐ Ó׸ Ð Ø ÖÑ ÒÓ ÔÙ × Ö Ð Ó¸ ÔÙ × Ú × Ð Ð Ò Ù Ð ÙÒ ÓÖÑ Ò Ù ØÖ ÑÔ ×º Ä ÜÔÖ × ÓÒ Ú Ö Ý ÓÒÕÙ ×Ø Ö ÔÖÓÚ Ò Ð Ö ÓØ ÔÓÐ Ø Ó¹Ñ Ð Ø Ö Ý ÒÓ Ø Ò Ò ÕÙ Ú Ö ÓÒ ÐÓ× Ð ÓÖ ØÑÓ× Ý ÓÒ Ð ×ÓÐÙ ÓÒ ÔÖÓ ¹ Ð Ñ × ÙÑ ÒÓ× ØÓ Ó ÐÓ ÓÒØÖ Ö Ó ÓÖ Ò Ó ÙÒ Ú ×Ø ÒØ Ö Ú × ÑÓ× ÔÖÓ Ð Ñ ×º Ú Ö ÙÒ ÔÖÓ Ð Ñ Ò Ó× Ñ × Ô ÕÙ ÒÓ× Ø Ò ÑÙ Ó × ÒØ Ó Ô ÖÓ ×Ó Ö Ö ×ÓÐÚ Ö ÓÒ ÓÒÕÙ ×Ø Ö ØÖ Ú × ×Ù× ×ÓÐÙ ÓÒ × ÔÙ Ö Ò Ù Ö Ô Ò× Ö ÕÙ Ú Ò Ó × ÓÒÕÙ ×Ø Ó¸ Ô ÓÖ¸ ÕÙ Ô Ö Ö ×ÓÐÚ Ö ÔÖÓ Ð Ñ × Ý ÕÙ ÓÒÕÙ ×Ø Öº
  • 208.
    182 Cap´ ıtulo 3. Cr´ ıtica de algoritmos Ë ÙÒ ÐÓ ÜÔÖ × Ó¸ Ð ÙÖ ÓÒ ÙÒ Ð ÓÖ ØÑÓ Ú Ö» ÓÑ Ò Ö × ÓÖÑÙÐ Ñ ÒØ Ð × Ù ÒØ Ö ÙÖÖ Ò ⎧ ⎪O(fb(n)) ⎨ , n ≤ nb T (n) = O(fd(n)) + ⎪ T (n1) + T (n2) + O(fc(n)) , n > nb ´¿º½ µ ⎩ Ú × ÓÒ ÔÖ Ñ Ö Ô ÖØ ÓÒ × ÙÒ Ô ÖØ ÓÒ ÓÑ Ò ÓÒ ÅÙÝ Ñ ÒÙ Ó¸ Ð ×ØÖÙ ØÙÖ ÙÒ Ð ÓÖ ØÑÓ Ú Ö» ÓÑ Ò Ö × ÔÖ ×Ø ÐÑ ÒØ ×Ù Ñ Ò Ó ÓÒ ÙÖÖ ÒØ × Ö¸ Ð × Ô ÖØ ÓÒ × ÔÙ Ò ØÖ Ø Ö× ÔÓÖ ÐÓ× Ó ÔÖÓ ×Ó× Ù ÓÒ ×Ø ÒØÓ׺ Ë ×ØÓ× ÐÓ× ×ÓÒ ÙØ Ó× ÔÓÖ ÔÖÓ × ÓÖ × Ñ Ø Ö Ð × ×Ø Ò¹ ØÓ׸ ÒØÓÒ × ÐÓ× ×Ù ¹ÔÖÓ Ð Ñ × ÔÙ Ò Ö ×ÓÐÚ Ö× × ÑÙÐØ Ò Ñ ÒØ ݸ ר ÑÓ Ó¸ Ñ × Ö Ô Ñ ÒØ ÕÙ ÙÒ ×ÓÐÓ ÔÖÓ × ÓÖº Ä Ú ÐÓ ¸ ÔÓÖ ×ÙÔÙ ×ØÓ¸ Ô Ò Ð ÒØ ÔÖÓ × ÓÖ × ÕÙ × ×ÔÓÒ ¸ Ð Ò ÓÐ Ð Ð ÓÖ ØÑÓ Ô Ö Ð Ð Þ Ö Ý Ð × Ú ÖØÙ × Ð × Ò ÓÖ Ó ÔÖÓ Ö Ñ ÓÖ ÕÙ Ö Ð Ð Ô Ö Ð Ð Þ ÓÒº 3.2.1 Ordenamiento por mezcla ÑÔÐ ¬ÕÙ ÑÓ× Ð × ÒÓ Ý Ò Ð × × ÙÒ Ð ÓÖ ØÑÓ Ú Ö» ÓÑ Ò Ö Ñ ÒØ ÙÒ Ð Ó¹ Ö ØÑÓ ÓÖ Ò Ñ ÒØÓ ÒÓÑ Ò Ó ÑÞÐ ¸ Ð Ù Ð× ×Ö ÓÒØ ÒÙ ÓÒ ½¾ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½ ½ ÑÞÐ ÖÖ ÐÓ× ½ ¿ template <typename T, class Compare> void mergesort(T * a, const int & l, const int & r) { if (l >= r) return; const int m = (l + r)/2; mergesort<T, Compare>(a, l, m); mergesort<T, Compare>(a, m + 1, r); merge<T, Compare>(a, l, m, r); } Í× × merge ½ ¿ Ò mergesort ½ º Ð Ð ÓÖ ØÑÓ × ÓÖÖ ×ÔÓÒ Ü Ø Ñ ÒØ ÓÒ Ð Ô ØÖÓÒ Ú Ö» ÓÑ Ò Öº Ä × ÓÑ Ò ÓÒ Ð Ö Ð Þ Ð ÔÖÓ Ñ ÒØÓ merge()¸ Ð Ù Ð × Ò Ö Ñ Þ Ð Ö Ó× Ô ÖØ ÓÒ × ÓÖ Ò ×º ÒØ × Ò Ö Ð Ø ÑÔÓ Ù ÓÒ¸ Ö ÕÙ Ö ÑÓ× ÓÒÓ Ö ÓÑÓ × ØÙ Ð Ñ Þ Ð Ý Ò Ð Þ Ö ×Ù × ÑÔ ÒÓº 3.2.1.1 Mezcla (merge) Ä Ñ Þ Ð ×ÙÑ Ó× × Ù Ò × ÓÖ Ò ×¸ Ò ÐÓ× ÒØ ÖÚ ÐÓ× [l, m] Ý [m + 1, r]º Ë ØÙÚ × ÑÓ× Ó× ÖÖ ÐÓ× ÓÖ Ò Ó׸ ÒØÓÒ × ÔÓ Ö ÑÓ× Ñ Þ Ð ÖÐÓ× Ò ÙÒ Ø Ö ÖÓ ÔÓÖ ¹ ÖÖ Óº Ø Ö ÓÒ¸ ÓÑÔ Ö ÑÓ× Ð Ð Ñ ÒØÓ ØÙ Ð ÖÖ ÐÓ¸ ÓÔ ÑÓ× Ð Ñ ÒÓÖ ÐÓ× Ó× Ð ÖÖ ÐÓ Ö ×ÙÐØ Ó Ý Ú ÒÞ ÑÓ× Ð Ð Ñ ÒØÓ ØÙ Ð Ò Ð ÖÖ ÐÓ ÕÙ ÓÒØ Ò Ð Ñ ÒÓÖ Ð Ñ ÒØÓº Ò ÒÙ ×ØÖ × ØÙ ÓÒ¸ Ø Ò ÑÓ× ÙÒ ÖÖ ÐÓ Ô ÖØ ÓÒ Ó Ò Ó× Ô ÖØ × ÕÙ Ø Ø Ú × ÕÙ Ý ×Ø Ò ÓÖ Ò ×º Ð ÔÖÓ ×Ó Ñ Þ Ð ÓÔ Ö Ð ÖÖ ÐÓ a[] ÙÒÓ ÙÜ Ð Ö ÕÙ ÐÐ Ñ Ö ÑÓ× b[]º ÆÓ × ÔÓ× Ð Ú Ö Ð Ù×Ó ÙÒ ÖÖ ÐÓ ÓÒ Ðº
  • 209.
    3.2. Algoritmos dividir/combinar 183 ÓÒ Ñ Ö × × ÑÔÐ ¬ Ö Ð Ñ Þ Ð ¸ Ö Ð Þ Ö ÑÓ× Ð ÓÔ Ð ÖÖ ÐÓ a Ð × ÙÒ Ó ÖÖ ÐÓ b × ÙÒ Ð × Ù ÒØ ×ÕÙ Ñ l m r a a[l..m] a[m + 1..r] ÓÔ ÔÖ Ñ Ö Ñ Ø ÖÖ ÐÓ ½ ¿ ÓÔ ÒÚ ÖØ × ÙÒ Ñ Ø ÖÖ ÐÓ ½ ¿ l m r b a[l..m] a[m + 1..r] × Ö¸ ÒØÖ 0 Ý m ÓÔ ÑÓ× Ð ÖÖ ÐÓ ÒÓÖÑ ÐÑ ÒØ ¸ Ñ ÒØÖ × ÕÙ ÒØÖ m + 1 Ý r ÐÓ ÒÚ ÖØ ÑÓ׺ ר ÓÖÑ ¸ Ù Ò Ó × ØÙ Ð Ñ Þ Ð ¸ ÐÓ× Ñ ÝÓÖ × Ð Ñ ÒØÓ× ÙÒ Ö Ò ÒØ Ò Ð × Ò ØÙÖ Ð × ÕÙ ÒÓ× ÓÖÖ Ö Ò ÙÒ × ÙÒ Ö Ô Ø ÓÒ ÙÒØÓ ÓÒ ÙÒ if ÕÙ ×Ó Ö Ù Ð Ð × Ó× Ñ Ø × Ý ÕÙ Ö Ð Þ Ö Ð Ö ×ØÓ Ð ÓÔ º ½¿ ÓÔ ÔÖ Ñ Ö Ñ Ø ÖÖ ÐÓ ½ ¿ ≡ ´½ ¿ µ for (i = l; i <= m; i++) b[i] = a[i]; ½¿ ÓÔ ÒÚ ÖØ × ÙÒ Ñ Ø ÖÖ ÐÓ ½ ¿ ≡ ´½ ¿ µ for (j = r, i = m + 1; i <= r; i++, j--) b[i] = a[j]; ÍÒ Ú Þ ÓÔ × Ð × Ô ÖØ ÓÒ × Ò Ð ÖÖ ÐÓ b¸ ÔÖÓ ÑÓ× Ñ Þ Ð ÖÐ × Ò Ð ÖÖ ÐÓ a ÓÑÓ × Ù l m r b a[l..m] a[m + 1..r] i j l min(b[i], b[j]) r a k ÄÓ Ù Ð × ÑÔÐ ÒØ Ð × Ù ÒØ ÑÓ Ó ½¿ Ñ Þ Ð ÖÑØ ×½ ¿ ≡ ´½ ¿ µ for (k = l, i = l, j = r; k <= r; k++) if (Compare() (b[i] < b[j])) a[k] = b[i++]; else a[k] = b[j--]; Ý ÕÙ ÓÑÔÐ Ø ØÓ Ó ÐÓ Ò × Ö Ó Ô Ö ÔÖÓ Ö Ñ Ö Ð ÖÙØ Ò merge() ½¿ ÑÞÐ ÖÖ ÐÓ× ½ ¿ ≡ ´½ ¾µ template <typename T, class Compare> void merge(T * a, const int & l, const int & m, const int & r) { int i, j, k; T b[r - l + 1];
  • 210.
    184 Cap´ ıtulo 3. Cr´ ıtica de algoritmos ÓÔ ÔÖ Ñ Ö Ñ Ø ÖÖ ÐÓ ½ ¿ ÓÔ ÒÚ ÖØ × ÙÒ Ñ Ø ÖÖ ÐÓ ½ ¿ Ñ Þ Ð ÖÑØ ×½ ¿ } ¬Ò × merge¸ Ù× Ò ÙÒ ½ ¾º Ð Ô Ö Ñ ØÖÓ m × Ð ÒØÖÓ Ð Ô ÖØ ÓÒº 3.2.1.2 An´lisis del mergesort a È Ö Ò Ð Þ Ö Ð mergesort() Ù× ÑÓ× Ð Ù ÓÒ ´¿º½ µ Ý ÔÐ ÒØ ÑÓ× O(1) ,n ≤ 1 T (n) = . ´¿º½ µ 2T (n/2) + O(fc(n)) ,n > 1 ÓÒ O(fc(n)) × Ð ÓÑÔÐ Ø ÑÔÓ Ð × ÓÑ Ò ÓÒ¸ Ó × Ð ÙÒ ÓÒ merge()º Ð Ö Ñ ÒØ ¸ ÐÓ× ÐÓÕÙ × ÓÔ ÔÖ Ñ Ö Ñ Ø ÖÖ ÐÓ ½ ¿ Ý ÓÔ ÒÚ Ö¹ Ø × ÙÒ Ñ Ø ÖÖ ÐÓ ½ ¿ ÓÒ×ÙÑ Ò n/2 Ô ×Ó× Ù ÓÒ¸ ÐÓ ÕÙ ÐÓ× O(n)º Ð ÐÓÕÙ Ñ Þ Ð Ö Ñ Ø × ½ ¿ ÓÒ×ÙÑ Ü Ø Ñ ÒØ n ÙÒ × Ù ÓÒ ÐÓ ÕÙ ÐÓ Ø Ñ Ò O(n)º ÈÓÖ Ø ÒØÓ¸ merge() ÓÒ×ÙÑ O(n) + O(n) + O(n) = O(n)º ר ÑÓ Ó¸ ´¿º½ µ × ÔÐ ÒØ ÓÑÓ O(1) ,n ≤ 1 T (n) = . ´¿º¾¼µ 2T (n/2) + O(n) ,n > 1 ר Ö ÙÖÖ Ò Ø Ñ Ò ÔÙ Ö ×ÓÐÚ Ö× ×ÙÑ Ò Ó n = 2k =⇒ k = Ð (n) Ó × ¸ ×ÙÑ ÑÓ× ÕÙ n × ÙÒ ÔÓØ Ò Ü Ø 2º È Ö n > 1¸ ´¿º¾¼µ × ÔÐ ÒØ ÓÑÓ T (2k) = 2T (2k−1) + O(2k) =⇒ ´ Ú ÑÓ× ØÓ Ð Ù ÓÒ ÒØÖ 2kµ T (2k) T (2k−1) = + O(1) 2k 2k−1 T (2k−2) = + O(1) + O(1) = O(1) + · · · + O(1) +O(1) 2k−2 kÚ × = O(k) + 1 ´¿º¾½µ Ð Ö Ö × Ö Ð ÔÐ ÒÓ n Ø Ò ÑÓ× ÕÙ ´¿º¾½µ × ÔÐ ÒØ ÓÑÓ T (n) = O(Ð (n)) + O(1) =⇒ n T (n) = O(n Ð (n)) + O(n) = O(n Ð (n)) ; ´¿º¾¾µ Ô Ö n = 2kº Ð Ù Ð ×Ø × ÒØÓØ Ñ ÒØ ÓØ Ó ÔÓÖ O(n Ð (n))º Ò Ð Ò¬Ò ØÓ Ð ÑÙй Ø ÔÐ n ÒÓ Ø Ð ÓÑÔÓÖØ Ñ ÒØÓ × ÒØÓØ Ó¸ ÔÙ × ×Ø ÒÓ Ø Ð Ö ÙÖÖ Ò º Ò ÓØÖÓ× Ø ÖÑ ÒÓ׸ Ð ÕÙ n × Ó ÒÓ ÔÓØ Ò Ü Ø Ó× ÒÓ Ñ Ö Ð Ó ÕÙ T (n) × O(n Ð (n))º Ð Ñ ØÓ Ó ÔÓÖ Ñ Þ Ð × O(n Ð (n)) Ô Ö ØÓ Ó× ÐÓ× ×Ó× Ñ ÓÖ¸ Ô ÓÖ Ý ÔÖÓÑ Óº ÆÓØ ÑÓ× ÕÙ Ð Ð ÓÖ ØÑÓ Ò × ÒÓ ×Ø Ò Ù Ð ÓÖÑ Ð ÒØÖ × ÑÔÖ Ù ×Ø O(n Ð (n)) Ò Ô Ò ÒØ Ñ ÒØ Ð ×ÔÓ× ÓÒ ÐÓ× Ð Ñ ÒØÓ× Ò Ð ÖÖ ÐÓº
  • 211.
    3.2. Algoritmos dividir/combinar 185 3.2.1.3 Estabilidad del mergesort ÙÒ Ø Ð Ö ×ØÖÓ׸ × Ö¸ ÙÒ ÖÖ ÐÓ ÓÒ ÓÐÙÑÒ × Ø ÔÓ× Ù Ð × Ó Ö ÒØ ׸ ÙÒ Ð Ú ÔÖ Ñ Ö × ÙÒ ÕÙ ÒÓ × Ö Ô Ø Ò ÙÒ ¬Ð º ÈÓÖ ÑÔÐÓ¸ Ð ÒÙÑ ÖÓ ÙÒ Ó ÒØ Ò ÓÒ Ð ÒÓ ×Ø × Ò Ó Ô Ö Ö Ô Ø Ö× º ÍÒ Ð Ú × ÙÒ Ö × ÙÒ ÕÙ ÔÙ Ö Ô Ø Ö× Ò Ó× Ó Ñ × ¬Ð × ÔÓÖ ÑÔÐÓ׸ ÐÓ× ÒÓÑ Ö × Ý Ô ÐÐ Ó׺ Ó Ð ¬Ò ÓÒ ÒØ Ö ÓÖ¸ ÙÒ Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓ × Ð ¬ ר Ð × ¸ Ð ÓÖ Ò Ö ÔÓÖ Ð Ú × ÙÒ Ö ÙÒ × Ù Ò Ö ×ØÖÓ× ÔÖ Ú Ñ ÒØ ÓÖ Ò ÔÓÖ Ð Ú ÔÖ Ñ Ö ¸ ÒØÓÒ × Ð × Ð Ú × × ÙÒ Ö × Ö Ô Ø × × ÓÒ× ÖÚ Ò ÓÖ Ò × × ÙÒ Ð Ð Ú ÔÖ Ñ Ö º Ò Ð × ÒØ Ó ÐÓ ÒØ Ö ÓÖ¸ Ð Ñ ØÓ Ó Ñ Ö ×ÓÖØ × ×Ø Ð º 3.2.1.4 Coste en espacio Ð ÓÒ×ÙÑÓ Ñ ÑÓÖ × ÓØÖÓ Óר ÕÙ × ÑÔÖ ÓÒ× Ö Ö× Ð ÑÓÑ ÒØÓ Ò Ð Þ Ö ÙÒ Ð ÓÖ ØÑÓº Ò ×Ø × ÒØ Ó¸ Ð ÓÖ Ò Ñ ÒØÓ ÖÖ ÐÓ× ÔÓÖ Ñ Þ Ð × ÙÒ Ù Ò ÑÔÐÓ¸ ÔÙ × Ð ÖÙØ Ò merge() Ö ÕÙ Ö ÙÒ ÖÖ ÐÓ ÔÖÓÔÓÖ ÓÒ Ð n ÐÓ ÕÙ ÑÔÐ ÕÙ Ð Ñ ØÓ Ó Ò Ù ×Ø ÓÒ Ö ÕÙ Ö ×Ô Ó ÔÖÓÔÓÖ ÓÒ Ð O(n)º × Ô٠׸ × × × ÙØ Ð Þ Ö ×Ø Ñ ØÓ Ó¸ ÒØÓÒ × × ÙÖ Ö× Ð ×ÔÓÒ Ö Ð ×Ô Ó ÓÒ Ð Ö ÕÙ Ö Ó Ô Ö ×Ù Ù ÓÒº 3.2.1.5 Ordenamiento por mezcla de listas enlazadas Ð ÓÖ Ò Ñ ÒØÓ ÔÓÖ Ñ Þ Ð Ù ÓÒ Ó ÑÙÝ ÓØÖÓÖ ¸ Ù Ò Ó ÑÙÝ ÔÓ Ñ ÑÓÖ Ý ÐÓ× Ñ Ó× ÐÑ Ò Ñ ÒØÓ × ÙÒ Ö Ó Ö Ò ÒØ × Ñ Ò Ø × Ð ÒØ × Ñ ×º Ò ÕÙ ÐÐÓ× Ø ÑÔÓ׸ ÓÖ Ò Ö Ö ÕÙ Ö Ð Ñ Þ Ð Ú Ö × ÒØ ׺ ÙÒÕÙ ÓÝ Ò ×ÔÓÒ ÑÓ× ÑÙÝ ÜØ Ò× × Ñ ÑÓÖ × Ý Ñ Ó× ÐÑ ¹ Ò Ñ ÒØÓ Ñ × ÚÓ ÒÓ × Ù Ò Ð ×¸ Ð ÓÖ Ò Ñ ÒØÓ ÔÓÖ Ñ Þ Ð ÒÓ × Ô Ö Ò Ó ×ÓÐ ØÓº ÌÓ Ó ÐÓ ÓÒØÖ Ö Ó¸ × ÙÒ Ñ ØÓ Ó ÓÒ Ö ÒØ O(n Ð (n)) ÕÙ Ô ÖÑ Ø ÓÖ Ò Ö Ø Ú ¹ Ñ ÒØ Ð ×Ø × ÒÐ Þ × Ý ÕÙ ¸ Ò Ò ÙÖ ¸ ÒÓ Ö ÕÙ Ö ×Ô Ó ÓÒ Ðº Ì Ð Ñ Þ Ð × ×Ô ¬ ÓÑÓ × Ù ½ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½¾ ½ template <class Compare> void merge_lists(Dlink & l1, Dlink & l2, Dlink & result) { while (not l1.is_empty() and not l2.is_empty()) if (Compare () (l1.get_next(), l2.get_next())) result.append(l1.remove_next()); else result.append(l2.remove_next()); if (l1.is_empty()) result.concat_list(&l2); else result.concat_list(&l1); } Ò ÓÒ×ÓÒ Ò ÓÒ ×Ù Ö Ø Ö × Ù Ò ¸ Ð ÓÖ Ò Ñ ÒØÓ ÔÓÖ Ñ Þ Ð ÙÒ Ð ×Ø ÒÐ Þ Ø Ò Ü Ø Ñ ÒØ Ð Ñ ×Ñ ×ØÖÙ ØÙÖ ÕÙ ×Ù Ú Ö× ÓÒ Ô Ö ÖÖ ÐÓ׺ ½ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½ ½ template <class Compare>
  • 212.
    186 Cap´ ıtulo 3. Cr´ ıtica de algoritmos void mergesort(Dlink & list) { if (list.is_unitarian_or_empty()) return; Dlink l, r; list.split_list(l, r); // dividir en dos listas mergesort <Compare> (l); // ordenar la primera mergesort <Compare> (r); // ordenar la segunda merge_lists <Compare> (l, r, list); // mezclarlas } ¬Ò × mergesort¸ Ù× Ò ÙÒ × ½ ¾ Ò ¼½º Ä Ð ÓØ ¬Ò ×Ô Ð Þ ÓÒ × Ô Ö Ð × ÓØÖ × Ð × × Ð ×Ø × Ñ ÒØ Ð ÙØ ¹ Ð Þ ÓÒ Ð Ð × Compare Dnodeº 3.2.2 Ordenamiento r´pido (Quicksort) a ÓÒ× Ö ÑÓ× ÙÒ ÖÖ ÐÓ ×ÓÖ Ò Ó a[] Ý Ð ÒÚÓ ÓÒ pivot = partition(a, l, r)¸ Ð Ù Ð Ô ÖØ ÓÒ Ð ÖÖ ÐÓ Ò Ó× Ô ÖØ × Ò Ö Ð × ÓÑÓ × Ô ØÓÖ Þ Ò Ð × Ù ÒØ ¬ ÙÖ l r ÌÓ Ó Ñ ÒÓÖ Ó Ù Ð ÕÙ a[pivot] pivote ÌÓ Ó Ñ ÝÓÖ Ó Ù Ð ÕÙ a[pivot] pivot Ä Ù ÓÒ pivot = partition(a, l, r) ØÙ Ð ÙÒ × ÓÔ Ö ÓÒ × ×Ó Ö Ð ÖÖ ¹ ÐÓ Ý Ö ØÓÖÒ ÙÒ Ò pivot Ø Ð ÕÙ Ð ÖÖ ÐÓ × Ø × Ð Ô ÖØ ÓÒ × ÙÒ Ð ×ÕÙ Ñ Ô ØÓÖ Þ Óº × Ö¸ ×ÔÙ × ÒÚÓ Ö partition()¸ Ð Ð Ñ ÒØÓ a[pivot] × Ò Ù Ò¹ ØÖ Ò ×Ù ÔÓ× ÓÒ ¬Ò Ø Ú ÒØÖÓ ÐÓ ÕÙ × Ö Ð × Ù Ò ÓÖ Ò Ó × ¸ Ð ÒØÖ a[pivot] ÓÖÖ ×ÔÓÒ Ð Ô ÚÓØ¹ × ÑÓ Ñ ÒÓÖ Ð Ñ ÒØÓ Ð ÖÖ ÐÓº Ð ÖÖ ÐÓ × Ó ¹ Ú Ó¸ × ÙÒ a[pivot]¸ Ò Ó× Ô ÖØ × ×ÓÖ Ò ×¸ ÕÙ ÔÙ Ò ÓÖ Ò Ö× Ö ÙÖ× Ú Ò Ô Ò ÒØ Ñ ÒØ ÓÑÓ × Ù ½ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½ ½¼ template <typename T, class Compare> void quicksort_rec(T * a, const int & l, const int & r) { if (l >= r) return; const int pivot = partition <T, Compare> (a, l, r); quicksort_rec <T, Compare> (a, l, pivot - 1); quicksort_rec <T, Compare> (a, pivot + 1, r); } Í× × partition ½ º ר ÔÖÓ Ñ ÒØÓ × Ð Ñ ÓÖ Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓ ×Ø ÓÝ ÓÒÓ Óº ËÙ Ö Ò Ñ ÒØÓ × Ø Ò ×Ô Ø ÙÐ Ö ÕÙ ×Ù × Ù Ö ÓÖ ¸ º ºÊº ÀÓ Ö ¸ ÐÓ Ù¹ Ø ÞÓ ÕÙ ×ÓÖØ ¾ Ó × ¸ ÓÖ Ò Ñ ÒØÓ Ö Ô Ó¸ Ó¸ Ö Ú Ñ ÒØ ¸ Ò ×Ø ÐÐ ÒÓ¸ ÒÐ Ø ÓÖ Ò Ð Ï ÖØ ÑÔÐ Ð Ø ÖÑ ÒÓ ÒÚ ÒØÓÖ º
  • 213.
    3.2. Algoritmos dividir/combinar 187 ÐÖÔ Óº Ä ×Ò Ð Ñ ØÓ Ó ×Ù Ý Ò Ð Ñ Ò Ö ØÙ Ö Ð Ô ÖØ ÓÒ Ô ÖÓ ÒØ × ×ØÙ ÖÐ ¸ × ÒØ Ö × ÒØ ÙÒ Ñ ÒØ Ö Ð Ò Ð × × Ð Ð ÓÖ ØÑÓº ÓÒÚ Ò ÒÓØ Ö ÕÙ Ð ×ØÖÙ ØÙÖ Ú Ö» ÓÑ Ò Ö Ð ÕÙ ×ÓÖØ ¬ Ö Ð Ö Ñ ÒØ ×Ù ØÖ ÓÒ Ð ÓÖ Ò Ó Ø ÚÓº Ä × ÐÐ Ñ × Ö ÙÖ× Ú × Ó ÙÖÖ Ò Ð ¬Ò Ð Ð ÖÙØ Ò × Ò ÕÙ × ÒÓØ ÜÔÐ Ø Ñ ÒØ ÙÒ × ÓÑ Ò ÓÒº Ó¸ × Ò Ð ÔÖÓÔ Ô ÖØ ÓÒ Ð ÖÖ ÐÓ Ù Ò Ó Ó ÙÖÖ Ð ÓÑ Ò ÓÒ¸ Ô٠׸ ÙÒ Ú Þ Ö Ð Þ Ð Ô ÖØ ÓÒ¸ Ô ÖØ ÔÙ ÓÖ Ò Ö× ¸ Ò Ô Ò ÒØ Ñ ÒØ ¸ ÔÓÖ × Ô Ö Óº Ð Ø ÑÔÓ Ù ÓÒ × Ö Ø Ö Þ ÔÓÖ Ð × Ù ÒØ Ù ÓÒ Ö ÙÖÖ ÒØ O(1) ,n ≤ 1 T (n) = ; ´¿º¾¿µ O(fp(n)) + T (Ô ÚÓØ −l) + T (r − Ô ÚÓØ ) , n > 1 ÓÒ O(fp(n)) Ö Ø Ö Þ Ð ÙÖ ÓÒ partition()º Ô ÚÓØ × Ð Ò Ð Ð Ñ ÒØÓ Ò ØÓÖÒÓ Ð Ù Ð × Ö Ð Þ Ð Ô ÖØ ÓÒº 3.2.2.1 Partici´n o Ä Ô ÖØ ÓÒ × Ð Ô ÖØ Ñ × Ð Ý ÓÑÔÐ Ð ÕÙ ×ÓÖØº ×ÙÑ ÑÓ× ÙÒ Ð Ñ ÒØÓ Ô ÚÓØ ÕÙ Ö ÔÖ × ÒØ Ö Ð Ð Ñ ÒØÓ Ô ÖØ ÓÒ Ý ÕÙ Ð ÙÒ ÓÖÑ ¸ ÕÙ ÜÔÐ Ö ÑÓ× Ñ × Ð ÒØ ¸ × ÓÐÓ Ò a[r]º ÁÒ ÑÓ× ÒÙ ×ØÖÓ ×ØÙ Ó Ñ ÒØ Ó × ÖÚ ÓÒ Ð × Ù ÒØ ¬ ÙÖ swap(a[i], a[j]) r l ++i i j −−j pivot while a[i] < pivot while a[j] > pivot ÚÒ ×Ø ÔÖ Ñ Ö Ð Ñ ÒØÓ Ñ ÝÓÖ ÕÙ Ô ÚÓØ ½ ÚÒ ×Ø ÔÖ Ñ Ö Ð Ñ ÒØÓ Ñ ÒÓÖ ÕÙ Ô ÚÓØ ½ Ä ¬ ÙÖ Ö ÔÖ × ÒØ Ð ÖÖ ÐÓ ÒØÖ l Ý rº i × ÙÒ Ò ÔÓÖ Ð Ð Ó ÞÕÙ Ö Ó Ð ÖÖ ÐÓ Ý j × ÔÓÖ Ð Ð Ó Ö Óº i × ÑÙ Ú Ð Ö ¸ ÐÓ ÕÙ ÑÔÐ ÕÙ Ò Ö Ñ ÒØ Ö× Ñ ÒØÖ × ÕÙ j × ÑÙ Ú Ð ÞÕÙ Ö ¸ ÔÓÖ ÐÓ ÕÙ × Ö Ñ ÒØ Öº ÄÓ× Ú ÐÓÖ × Ò Ð × ×ØÓ× Ò × × ÓÐÓ Ò Ò ÙÒ ÔÓ× ÓÒ ÔÖ Ú ×Ù ÔÖ Ñ Ö ×Ó × Ö¸ i Ò l - 1 Ý j Ò rº ÄÙ Ó Ò Ó× ÐÓ× Ò ×¸ Ð ÖÙØ Ò ÒØÖ Ò ÙÒ Ð ÞÓ ÙÝÓ Ù ÖÔÓ ÓÒ× ×Ø Ò Ù× Ö ÙÒ ÒÚ Ö× ÓÒ Ö Ð Ø Ú Ð Ô ÚÓØ × Ö¸ ÙÒ Ô Ö Ð Ñ ÒØÓ× ÕÙ ×Ø Ò ÒÚ ÖØ Ó× Ò ÓÖ Ò Ö ×Ô ØÓ Ð Ô ÚÓØ º Ð ÔÖ Ñ ÖÓ ×ØÓ× Ð Ñ ÒØÓ× × Ù× ÔÓÖ Ð ÞÕÙ Ö ½ ÚÒ ×Ø ÔÖ Ñ Ö Ð Ñ ÒØÓ Ñ ÝÓÖ ÕÙ Ô ÚÓØ ½ ≡ ´½ µ // avance mientras a[i] < a[pivot] while (Compare() (a[++i], pivot)) { /* no hay cuerpo */ } Ò Ð ÒרÖÙ ÓÒ a[++i]¸ Ð Ö a[i] × Ö Ð Þ ×ÔÙ × Ð Ò Ö Ñ ÒØÓº ÈÓÖ Ø ÒØÓ¸ Ð ÔÖ Ñ Ö ×Ó Ó ÙÖÖ ×Ó Ö a[l]º Ð ×ÔÐ Þ Ñ ÒØÓ i Ñ × ×Ó Ö Ô × Ö r¸ ÔÙ × Ð Ô ÚÓØ ÙÒ ÒØ Ò Ð Ý Ð ÓÑÔ Ö ÓÒ × ÔÓÖ × Ù Ð ×ØÖ Ø º ÈÓÖ Ø ÒØÓ¸ i ÒÙÒ Ö ÙÒ Ò Ù Ö Ð Ö Ò Ó [l, r]º Ä Ù×ÕÙ Ð Ð Ñ ÒØÓ ÒÚ Ö× ÓÒ Ð Ð Ó Ö Ó × × Ñ Ð Ö¸ Ô ÖÓ ÕÙ ÒÓ Ø Ò ÑÓ× ÙÒ ÒØ Ò Ð ÔÓÖ ÐÓ ÕÙ ÑÓ× Ú Ö ¬ Ö ÕÙ j ÒÓ ×Ó Ö Ô × l ½ ÚÒ ×Ø ÔÖ Ñ Ö Ð Ñ ÒØÓ Ñ ÒÓÖ ÕÙ Ô ÚÓØ ½ ≡ ´½ µ while (Compare() (pivot, a[--j])) // avance mientras a[pivot]< a[j] if (j == l) // ¿se alcanz´ el borde izquierdo? o break; // s´ ==> hay que terminar la iteraci´n ı o
  • 214.
    188 Cap´ ıtulo 3. Cr´ ıtica de algoritmos Ë i Ý j ÒÓ × ÖÙÞ Ò ´i < jµ¸ ÒØÓÒ × Ü ×Ø ÙÒ ÒÚ Ö× ÓÒ ÕÙ × ÓÖÖ ÒØ Ö Ñ¹ Ò Ó a[i] ÓÒ a[j]º Ë ¸ ÔÓÖ Ð ÓÒØÖ Ö Ó¸ ÐÓ× Ò × i Ý j × ÖÙÞ Ò ´i >= jµ¸ Ð ÔÖÓ ×Ó Ô ÖØ ÓÒ ÙÐÑ Ò Ý Ð Ò i ÓÒר ØÙÝ Ð ÔÙÒØÓ Ô ÖØ ÓÒº Ò ×Ø ÑÓÑ ÒØÓ¸ × ÒØ Ö Ñ ÓÒ Ð Ô ÚÓØ i Ú Ð ÖÖ ÐÓ Ò Ó× Ô ÖØ × Ð ÞÕÙ Ö ÓÒØ Ò Ð Ú × Ñ ÒÓÖ × Ó Ù Ð × Ð Ô ÚÓØ ¸ Ñ ÒØÖ × ÕÙ Ð Ö ÓÒØ Ò Ð Ú × Ñ ÝÓÖ × Ó Ù Ð ×º × ÔÓ× Ð ÕÙ Ð Ö Ò Ó [l, i] ÓÒØ Ò Ð Ú × Ù Ð × Ð Ô ÚÓØ ×ØÓ ×Ù × j ÖÙÞ i × Ö¸ × ÒÓ × Ò Ù ÒØÖ ÙÒ Ð Ú Ð Ð Ó Ö Ó ÕÙ × Ñ ÒÓÖ ÕÙ Ð Ô ÚÓØ i ÕÙ ÔÓ× ÓÒ Ó Ò ÙÒ Ð Ú Ù Ð Ð Ô ÚÓØ º ÓÒ Ð × ÜÔÐ ÓÒ × ÒØ Ö ÓÖ × ÔÖÓÔ ×¸ ר ÑÓ× Ð ×ØÓ× Ô Ö ÑÓ×ØÖ Ö Ð Ô ÖØ ÓÒ ½ ¬Ò ÓÒ Ô ÖØ ÓÒ ÖÖ ÐÓ ½ ≡ template <typename T, class Compare> int partition(T * a, const int & l, const int & r) { ËÐ ÓÒ Ö Ô ÚÓØ ½ ¿ T pivot = a[r]; // elemento pivot int i = l - 1, // ındice del primer elemento a la izquierda mayor que pivot ´ j = r; // ´ndice del primer elemento a la derecha mayor que pivot ı while (true) { ÚÒ ×Ø ÔÖ Ñ Ö Ð Ñ ÒØÓ Ñ ÝÓÖ ÕÙ Ô ÚÓØ ½ ÚÒ ×Ø ÔÖ Ñ Ö Ð Ñ ÒØÓ Ñ ÒÓÖ ÕÙ Ô ÚÓØ ½ if (i >= j) break; // En este punto hay una inversi´n a[i] > a[pivot] > a[j] o Aleph::swap(a[i], a[j]); // Eliminar la inversi´n o } Aleph::swap(a[i], a[r]); return i; } ¬Ò × partition¸ Ù× Ò ÙÒ × ½ ¸ ½ ¼¸ ½ ¿ ¸ ½ ¸ ½ ¸ Ò ½ º Ä ÖÙØ Ò ØÓÑ ÓÑÓ Ô Ö Ñ ØÖÓ× Ð ÖÖ ÐÓ Ý ÐÓ× Ð Ñ Ø × ÞÕÙ Ö Ó Ý Ö Ó¸ ÒÓÑ Ò ¹ Ó× l Ý r¸ Ö ×Ô Ø Ú Ñ ÒØ º Ä ÔÖ Ñ Ö Ð Ò Ð Ñ ØÓ Ó × ÙÒ Ô ×Ó ÙÒ Ñ ÒØ Ð Ò Ð × ÑÔ ÒÓ Ð ÕÙ ×ÓÖØ Ý ÓÒ× ×Ø Ò × Ð ÓÒ Ö ÙÒ Ð Ñ ÒØÓ ÕÙ ÙÒ Ô ÖØ ÓÒ ÓÖ Ð ÖÖ ÐÓº Ì Ð Ð Ñ ÒØÓ × ÒÓÑ Ò Ô ÚÓØ º ÈÓÖ ÓÖ ¸ ×ÙÑ ÑÓ× ÕÙ × Ð ÓÒ ÑÓ× Ð ÙÐØ ÑÓ Ð Ñ ÒØÓ × Ö a[r]º Ü ×Ø Ò ÓØÖ × ÓÖÑ × × Ó Ö Ð Ð Ñ ÒØÓ Ô ÚÓØ ÕÙ ×ÓÒ Ñ × ÓרÓ× × Ò Ø ÑÔÓ ÓÒר ÒØ ¸ Ô ÖÓ ÕÙ Ñ ÓÖ Ò Ð ×Ô Ö ÒÞ ÙÖ ÓÒ Ð ÓÖ Ò Ñ ÒØÓº Ù ÐÕÙ Ö × Ð Ñ ØÓ Ó¸ ÒÓ× Ö Ñ Ø Ö ÑÓ× ÓÐÓ Ö Ð Ô ÚÓØ Ò Ð ÜØÖ ÑÓ Ö Óº ר ÑÓ Ó¸ ÙÒ ÑÓ ¬ ÓÒ Ð Ò ÓÕÙ × Ð ÓÒ Ô ÚÓØ ÒÓ Ø Ð Ö ×ØÓ Ð Ð ÓÖ ØÑÓ Ô ÖØ ÓÒº 3.2.2.2 An´lisis del quicksort a Ð Ò Ð × × Ð ÕÙ ×ÓÖØ Ö ÕÙ Ö Ö ×ÓÐÚ Ö Ð Ù ÓÒ ´¿º¾¿µ¸ Р٠и ×Ù Ú Þ¸ Ö ÕÙ Ö Ð Ò Ð × × Ð Ô ÖØ ÓÒº
  • 215.
    3.2. Algoritmos dividir/combinar 189 Ù ÐÕÙ Ö × Ð ×ÔÓ× ÓÒ Ð ÖÖ ÐÓ¸ Ð while Ñ × ÜØ ÖÒÓ ÖÓÑÔ Ù Ò Ó × ÖÙ Ò ÐÓ× Ò × i Ý jº È Ö ÕÙ ×ØÓ ×Ù Ø Ò Ò ÕÙ Ó ÙÖÖ Ö Ü Ø Ñ ÒØ r−l+1 Ò Ö Ñ ÒØÓ× Ý Ö Ñ ÒØÓ׺ ÈÓÖ Ø ÒØÓ¸ × n = r − l + 1¸ ÒØÓÒ × Ð Ø ÑÔÓ Ù ÓÒ × O(n)º ËÙר ØÙÝ Ò Ó ×Ø Ø ÑÔÓ Ò Ð Ù ÓÒ ´¿º¾¿µ ÔÙ ÔÖÓÜ Ñ Ö× O(1) ,n ≤ 1 T (n) = . ´¿º¾ µ O(n) + T (Ô ÚÓØ −l) + T (r − Ô ÚÓØ) , n > 1 Ë ×ÙÔÓÒ ÑÓ× ÙÒ Ô ÖÑÙØ ÓÒ Ð ØÓÖ ¸ ÒØÓÒ × Ð ×Ô Ö ÒÞ ×Ó Ö Ð ÔÙÒØÓ Ô ÖØ ÓÒ × × ØÙ Ò l+r ¸ Ó × ¸ Ò Ð ÒØÖÓ Ð ÖÖ ÐÓ¸ ÔÓÖ ÐÓ ÕÙ Ð Ù ÓÒ ´¿º¾ µ 2 ÔÙ ÔÖÓÜ Ñ Ö× ÓÑÓ O(1) ,n ≤ 1 T (n) = ; ´¿º¾ µ O(n) + 2T (n/2) ,n > 1 Ð Ù Ð × O(n Ð (n))º Ð × ÑÔ ÒÓ Ð ÕÙ ×ÓÖØ × O(n Ð (n)) Ô Ö Ð ×Ó ×Ô Ö Ó Ý Ô Ö Ð Ñ ÓÖ ×Óº Ð Ô ÓÖ ×Ó ÔÙ Ó ÙÖÖ Ö Ù Ò Ó Ð Ô ÚÓØ × Ùר Ñ ÒØ Ð Ñ ÝÓÖ ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ× ÒØÖ i Ý jº Ò ×Ø × ÓÖØÙÒ × ØÙ ÓÒ¸ Ð Ô ÖØ ÓÒ ÞÕÙ Ö × ÐÓÒ ¹ ØÙ r − l − 1¸ Ñ ÒØÖ × ÕÙ Ð Ð Ö × 0º Ò ÓØÖ × Ô Ð Ö ×¸ ÒÓ × ÐÓ Ö Ú Ö Ø Ú Ñ ÒØ º Ä Ù ÓÒ ´¿º¾ µ × ÜÔÖ × ÓÑÓ O(1) ,n ≤ 1 T (n) = ; ´¿º¾ µ O(n) + T (n − 1) ,n > 1 Ð Ù Ð × O(n2)º Ð ÕÙ ×ÓÖØ Ú Ò ¸ Ò Ð Ô ÓÖ ×Ó¸ Ð Ð ÒØÓ ¾ º Ù Ò ÔÖÓ Ð × ÕÙ Þ ÐÓ Ô ÓÖ Ð Ù Ð ÕÙ Ò Ð Ú ¸ ÑÙÝ ÔÓ Óº È Ö ÒØÙ Ö ×Ø Ó¸ ÔÐ ÒØ ÑÓ× Ð ÙÒÓ× ÑÙÝ Ñ ÐÓ× ×Ó× º ÍÒ ÑÙÝ Ñ Ð ×Ó ×Ø Ó¸ Ô Ö Ó Ñ ÒØ ¸ Ù Ò Ó Ð ÖÖ ÐÓ ×Ø ÓÖ Ò Óº Ò ×Ø × ØÙ ÓÒ¸ Ð Ô ÚÓØ × ÑÔÖ × Ð Ñ ÝÓÖ Ð Ñ ÒØÓ¸ Ð Ù Ð Ý × Ò Ù ÒØÖ Ò ×Ù ÔÓ× ÓÒ ¬Ò Ø Ú Ð Ô ÖØ ÓÒ ÞÕÙ Ö × ÐÓÒ ØÙ n − 1 Ñ ÒØÖ × ÕÙ Ð Ö × ÒÙÐ º Ä ÔÖÓ Ð ×Ø Ò ÓÖØÙÒ Ó × n! ¸ ÔÙ × ×ÓÐÓ Ü ×Ø ÙÒ ÔÓ× Ð 1 ÒØÖ Ð × n! ÔÓ× Ð ×º ÍÒ ×Ó Ð Ö Ñ ÒØ Ô ÓÖ ÕÙ Ð ÒØ Ö ÓÖ × Ù Ò Ó Ð ÖÖ ÐÓ ×Ø ÓÖ Ò Ñ ÒØ ÒÚ ÖØ Óº ר ×ÔÓ× ÓÒ Ù× ÙÒ Ô ÖØ ÓÒ ÞÕÙ Ö ÒÙÐ Ý ÙÒ Ö ÐÓÒ ¹ ØÙ n − 1º Ä ÔÖÓ Ð × ÒØ Ð ×Ó ÒØ Ö ÓÖ n! º 1 ÉÙ Ø Ò ÔÖÓ Ð × Ø Ò Ö ÙÒ Ñ Ð ×Ó Ò ×Ø ר ¸ ר Ö ×ÔÙ ×Ø Ð Ð Ú¹ Ö ÒÞ º Ë Ð Ô ÖÑÙØ ÓÒ × Ð ØÓÖ ¸ ÒØÓÒ × Ð Ô ÖØ ÓÒ Ú Ö Ö × ÙÒ ÙÒ ×ØÖ Ù ÓÒ ÙÒ ÓÖÑ × Ö (r−l+1) −1 ÔÓÖ ÐÓ ÕÙ Ð ÔÙÒØÓ Ô ÖØ ÓÒ × ×Ú Ö ÒØÖÓ Ð Ö Ò Ó 2 2 ¬Ò Ó ÔÓÖ 12 ¸ ÐÓ ÕÙ (n) −1 2 ÖÖÓ ÙÒ ÖÖÓÖ ×Ô Ö Ó 29± ÔÖÓÜ Ñ Ñ ÒØ º Ò ÓØÖÓ× Ø ÖÑ ÒÓ׸ ÙÒ ×Ô Ñ Ð ×Ó ×Ô Ö Ó Ô ÖØ ÓÒ × ÕÙ ×Ø × ÔÖÓÔÓÖ ÓÒ 1/3 ÔÖÓÔÓÖ ÓÒ ÕÙ ÙÒ Ú Ð ÖÖ ÐÓ Ñ Ò Ö ØÚ º Ñ ×¸ ר ×Ú ÒØÙÖ Ø Ò Ö ÕÙ Ó ÙÖÖ Ö ÓÒ Ð Ñ ÝÓÖ Ð × Ô ÖØ ÓÒ × Ù ×Ø ÓÒ ÐØ Ñ ÒØ ÑÔÖÓ Ð × Ð × Ô ÖÑÙØ ÓÒ × × ×ØÖ ÙÝ Ò × ÙÒ ÙÒ Ò× ÙÒ ÓÖÑ º 3.2.2.3 An´lisis de consumo de espacio del quicksort a ÄÓ× Ð ÓÖ ØÑÓ× Ö ÙÖ× ÚÓ× ÓÒÐÐ Ú Ò ÙÒ Óר Ò ×Ô Ó Ó Ð Ô Ð º Ò ×Ø × ÒØ Ó¸ ÙÒ Ð ÓÖ ØÑÓ Ú Ö» ÓÑ Ò Ö ÓÒ×ÙÑ ×Ô Ó Ô Ð Ù Ò Ó Ñ ÑÓÖ Þ ÙÒ Ð×
  • 216.
    190 Cap´ ıtulo 3. Cr´ ıtica de algoritmos Ú × ÓÒ × ØÓ× ÔÖÓ × Ö Ö ÙÖ× Ú Ñ ÒØ Ð ÓØÖ º ר ÑÓ Ó¸ ÓÒ ÓÖÑ ÙÑ ÒØ Ò Ð × Ú × ÓÒ ×¸ Ñ ÝÓÖ Ñ ÑÓÖ × Ö ÕÙ Ö º Ð ÕÙ ×ÓÖØ ÔÙ × Ö ÑÙÝ ÓרÓ×Ó Ò ×Ô Ó × Ó ÙÖÖ Ò Ñ Ð × Ô ÖØ ÓÒ × ×Ù × Ú ×º ÔÖ Ò ÑÓ× ×ØÓ Ñ Ö Ò Ó Ð Ô ÓÖ ØÓ Ó× ÐÓ× Ñ ÐÓ× ×Ó׸ Ð Ù Ð Ó ÙÖÖ Ù Ò Ó Ð ÖÖ ÐÓ ×Ø ÒÚ Ö× Ñ ÒØ ÓÖ Ò Óº Ò ×Ø × ØÙ ÓÒ¸ × ÙÒ ¬Ò ÓÒ Ô ÖØ ÓÒ ÖÖ ÐÓ ½ ¸ Ð ÖÖ ÐÓ × ÑÔÖ × Ô ÖØ ÓÒ Ò pivotquick sort rec<T, Compare>(a, l+1, r-1) quick sort rec<T, Compare>(a, r+1, r) ÇÖ Ò ÒÚ ÖØ Ó ∅ l r ÐÓ ÕÙ ¸ × ÙÒ Ð ÑÔÐ ÒØ ÓÒ quicksort rec()¸ Ù× Ð × ÐÐ Ñ × Ö ÙÖ× Ú × ´ ÓÐÓ¹ × ÓÒ Ô Ö Ñ ØÖÓ× Ö Ð ×µ quicksort rec(a, l, r-1) Ý quicksort rec(a, r+1, r)¸ Ù×ØÓ Ò × ÓÖ Ò Ö ×Ô Ø ÚÓº ÆÓØ ÑÓ× ÕÙ ×Ø ÓÖ Ò ÐÐ Ñ × ÑÔ Ð Ð Ô ÖØ ÓÒ Ñ × Ô ÕÙ Ò Ñ ÒØÖ × × ØÙ Ð ÐÐ Ñ Ö ÙÖ× Ú ×Ó Ö Ð Ô ÖØ ÓÒ Ñ × Ö Ò ÙÝÓ Ø Ñ ÒÓ × r − l − 1º ×Ù Ú Þ¸ ÔÙ ×ØÓ ÕÙ Ð Ö ×ØÓ Ð ÖÖ ÐÓ ×Ø ÒÚ Ö× Ñ ÒØ ÓÖ Ò Ó¸ Ð × Ù ÒØ ÒÚÓ ÓÒ quicksort rec(a, l, r - 1) Ù× ÒÙ ÚÓ Ð Ô ÓÖ Ô ÖØ ÓÒ¸ ÔÓÖ ÐÓ ÕÙ × ÚÙ ÐÚ ÑÔ Ð Ö Ð Ô ÖØ ÓÒ Ú Ñ ÒØÖ × × ÐÐ Ñ Ö ÙÖ× Ú Ñ ÒØ Ð Ô ÖØ ÓÒ Ø Ñ ÒÓ r−l− 2º ר ÔÖÓ ×Ó Ñ Ð × Ô ÖØ ÓÒ × ÓÒØ ÒÙ ×Ø ÕÙ × ÓÖ Ò ÒØ Ö Ñ ÒØ Ð ÖÖ ÐÓº Ð Ô ÓÖ ×Ó Ð ÕÙ ×ÓÖØ ×ÓÐÓ ÑÔ Ð Ô ÖØ ÓÒ × Ú ×º È Ö ÔÖ × Ö Ð Óר Ò ×Ô Ó ×Ø × ÐÐ Ñ × Ú Ò × Ý ÕÙ ÓÒØ Ö Ð ÒØ Ú × ÕÙ × ÐÐ Ñ Ö ÙÖ× ¹ Ú Ñ ÒØ Ð ÕÙ ×ÓÖØ¸ Р٠Р׸ Ü Ø Ñ ÒØ ¸ Ð ÒÙÑ ÖÓ Ð Ñ ÒØÓ× n Ó × ¸ O(n)º ÍÒ ÑÙÝ Ñ Ð ×Ó Ð ÕÙ ×ÓÖØ ÔÙ ¸ ÐÑ ÒØ ¸ Ù× Ö ÙÒ × ÓÖ ÔÐ º È Ö Ú Ø Ö ×ØÓ¸ ÑÓ× × ÙÖ ÖÒÓ× ÕÙ Ð ÔÖ Ñ Ö ÐÐ Ñ Ö ÙÖ× Ú × ØÙ ×Ó Ö Ð Ô ÖØ ÓÒ Ñ × Ô ÕÙ Ò ¸ ÑÓ Ó Ø Ð ÕÙ × ÑÔ Ð Ñ ÒÓ׸ Ô٠׸ Ñ ÒÓÖ Ø Ñ ÒÓ Ô ÖØ ÓÒ¸ Ó ÙÖÖ Ö ÙÒ Ñ ÒÓÖ ÒØ ÐÐ Ñ × Ö ÙÖ× Ú ×º ר Ñ Ò Ö ¸ ÙÒ ÑÙÝ Ð Ö Ú Ö ÓÒ quicksort rec()¸ ÕÙ Ñ Ò Ñ Þ Ð ÓÒ×ÙÑÓ Ô Ð ¸ × ÒÙÒ ÓÑÓ × Ù ½¼ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½ ½¿ template <typename T, class Compare> void quicksort_rec_min(T * a, const int & l, const int & r) { if (r <= l) return; const int pivot = partition<T, Compare>(a, l, r); if (pivot - l < r - pivot) // ¿cual es la partici´n m´s peque~a? o a n { // partici´n izquierda m´s peque~a o a n quicksort_rec_min<T, Compare>(a, l, pivot - 1); quicksort_rec_min<T, Compare>(a, pivot + 1, r); } else { // partici´n derecha m´s peque~a o a n quicksort_rec_min<T, Compare>(a, pivot + 1, r); quicksort_rec_min<T, Compare>(a, l, pivot - 1); } } Í× × partition ½ º
  • 217.
    3.2. Algoritmos dividir/combinar 191 ר Ú Ö× ÓÒ ÒÚÓ Ð Ö ÙÖ× ÓÒ × Ð Ñ ÒÓÖ ×Ø Ð Ñ ÝÓÖ Ô ÖØ ÓÒ¸ ÐÓ Ù Ð Ö ÒØ Þ ÙÒ ÓÒ×ÙÑÓ Ô Ð Ñ Ò ÑÓº Ù ÒØÓ × ØÖ Ø ×Ø ÓÒ×ÙÑÓ È Ö Ö ×ÔÓÒ Ö Ð Ù ×Ø ÓÒ¸ ÑÓ× ÔÖ Ñ ÖÓ ÒØ ¬ Ö Ù Ð × Ð Ñ Ü ÑÓ Ø Ñ ÒÓ ÕÙ ÔÙ ØÓÑ Ö ÙÒ Ñ ÒÓÖ Ô ÖØ ÓÒ Ý ×ÙÑ Ö ÕÙ ÐÐÓ Ó ÙÖÖ Ö ÙÖ× Ú Ñ ÒØ Ò ÐÐ Ñ Ö ÙÖ× Ú º Ð Ñ Ü ÑÓ ÕÙ Ð ÑÓ× × ÔÖ × ÒØ Ù Ò Ó Ð Ô ÖØ ÓÒ Ó ÙÖÖ Ü Ø Ñ ÒØ ÔÓÖ Ð ÒØÖÓ¸ Р٠и ÒÓ ×ÓÖÔÖ Ò ÒØ Ñ ÒØ ¸ × Ð Ñ ÓÖ ×Ó Ô ÖØ ÓÒ Ò Ú ÐÓ ÓÖ Ò Ñ ÒØÓ Ý Ó ÙÖÖ ¸ ÐÓ ×ÙÑÓ¸ O(Ð (n)) Ú ×¸ ÕÙ × Ð Ñ ÝÓÖ ÔÖÓÔÓÖ ÓÒ Ú × ÕÙ ÔÓ ÑÓ× Ú Ö Ð ÖÖ ÐÓº ÈÓÖ Ø ÒØÓ¸ quicksort rec min() Ø Ò ÙÒ ÓÒ×ÙÑÓ ×Ô Ó O(Ð (n)) Ò Ð Ô ÓÖ ×Ó¸ Óר Ô Ö Ø Ñ ÒØ Ñ Ò Ð ÙÒ Ô Ö Ô Ð × Ô ÕÙ Ò ×º Ð Ò Ð × × ÔÖ ÒØ Ø Ñ Ò ÒÓ× Ù ÒØ Ö Ð ÒÙÑ ÖÓ ÒÚÓ ÓÒ × Ö ÙÖ¹ × Ú × ÕÙ Ó ÙÖÖ Ö Ò Ò Ð Ñ ÓÖ ×Ó Ð ÕÙ ×ÓÖØ × Ö¸ Ù Ò Ó ØÓ × Ð × Ô ÖØ ÓÒ × Ó ÙÖÖ Ò ÔÓÖ Ð ÒØÖÓº Ò ×Ø ×Ó¸ ÐÐ Ñ Ð ÕÙ ×ÓÖØ Ó × ÓÒ Ó× ÐÐ Ñ × Ö ÙÖ× Ú × ×Ó Ö Ô ÖØ ÓÒ × Ð Ñ ×ÑÓ Ø Ñ ÒÓº ÈÓÖ Ø ÒØÓ¸ Ð ØÓØ Ð ÐÐ Ñ × Ö ÙÖ× Ú × ÕÙ ØÓÑ Ö Ð Ñ ÓÖ ×Ó Ð ÕÙ ×ÓÖØ ר Ö Ó ÔÓÖ Ð (n) 2i ≤ 2Ð (n)+1 −1 ; ´¿º¾ µ i ÓÒ n × Ð ÒØ Ð Ñ ÒØÓ׺ Ä ×ÙÑ ØÓÖ Ü Ø Ó ÙÖÖ Ö × n = 2k − 1 Ó × ¸ × n+1 × ÙÒ ÔÓØ Ò Ü Ø 2º Ò ×Ø ×Ó¸ ØÓ × Ð × Ô ÖØ ÓÒ × Ó × ÓÒ × × ÑÔÖ ×ÓÒ Ü Ø Ñ ÒØ Ð Ñ ×ÑÓ Ø Ñ ÒÓº Ä ¬ ÙÖ ¿º Ô ØÓÖ Þ ØÓ × Ð × ÐÐ Ñ × Ö ÙÖ× Ú × ÕÙ Ó ÙÖÖ Ò Ô Ö n = 15 Ò ÙÒ ×ØÖÙ ØÙÖ ÒÓÑ Ò Ö ÓÐ ¸ Ð Ù Ð × Ö ×ØÙ Ò Ð Ô ØÙÐÓ º qs(0, 14) qs(0, 6) qs(8, 14) qs(0, 2) qs(4, 6) qs(8, 10) qs(12, 14) qs(0, 0) qs(2, 2) qs(4, 4) qs(6, 6) qs(8, 8) qs(10, 10) qs(12, 12) qs(14, 14) ÙÖ ¿º רÖÙ ØÙÖ Ð × Ô ÖØ ÓÒ × Ý ÐÐ Ñ × Ö ÙÖ× Ú × Ô Ö Ð Ñ ÓÖ ×Ó Ð ÕÙ ×ÓÖØ Ý ½ Ð Ñ ÒØÓ׺ ÈÖ ×Ø ÑÓ× Ø Ò ÓÒ ×Ô Ð Ð Ö Ñ ¿º ÒØ ¬ÕÙ ÑÓ× Ð ÔÖ Ñ Ö ÐÐ Ñ qs(0, 14) ½¼ º ר ÐÐ Ñ Ò Ö Ð × ÐÐ Ñ × qs(0, 6) Ý qs(8, 14)º Ð Ð ÓÖ ØÑÓ × Ð ¹ ÓÒ qs(0, 6) Ô Ö ÓÒØ ÒÙ Ö Ð Ö ÙÖ× ÓÒ Ý ÑÔ Ð qs(7, 14)º ×Ù Ú Þ¸ qs(0, 6) ÑÔ Ð qs[4, 6] Ý ÔÖÓ× Ù Ö ÙÖ× Ú Ñ ÒØ ×Ó Ö qs(0, 2)º Ù Ò Ó × ÐÐ ÔÓÖ ÔÖ Ñ Ö Ú Þ Ð ×Ó × ¸ Ð Ô Ð ÓÒØ Ò Ð × ÐÐ Ñ × qs(0, 14)¸ qs(7, 14)¸ qs(4, 6)¸ qs(2, 2) Ô Ò ÒØ × ÔÓÖ Ö Ð Þ Öº ½¼ Ð ÒÓÑ Ö Ð Ñ ØÓ Ó × Ó Ö Ú Ó ÔÓÖ ÓÒÓÑ ×Ô Óº
  • 218.
    192 Cap´ ıtulo 3. Cr´ ıtica de algoritmos Ä Ñ Ü Ñ ÒØ ÐÐ Ñ × ÑÔ Ð Ö ×Ø ÔÓÖ Ð Ñ Ü Ñ ÔÖÓ ÙÒ Ð Ö ÓÐ × qs(0, 14) ר Ù ÐÕÙ Ö ×Ó × qs(i, i)º Ù ÐÕÙ Ö × Ð Ú ÐÓÖ Ý Ø Ñ ÒÓ Ð ÒØÖ ¸ × × ÔÖÓ × ÔÖ Ñ ÖÓ Ð Ô ÖØ ÓÒ Ñ × Ô ÕÙ Ò ¸ ÒØÓÒ × Ð ÓÒ×ÙÑÓ Ò Ô Ð ÒÓ ×Ó Ö Ô × O(Ð (n))º 3.2.2.4 Selecci´n del pivote o Ë Ð Ô ÖÑÙØ ÓÒ Ð ÖÖ ÐÓ × Ð ØÓÖ ¸ ÒØÓÒ ×¸ Ð × Ð ÓÒ Ð Ô ÚÓØ ÔÓÖ Ð Ö Ð ÖÖ ÐÓ¸ Ø Ð ÓÑÓ ×Ø Ð ÔÖ × ÒØ Ð ÑÓ× ØÖ Ø Ó¸ Ø Ñ Ò × Ð ØÓÖ º ÈÓÖ Ø ÒØÓ¸ Ô Ö Ô ÖÑÙØ ÓÒ × Ð ØÓÖ ×¸ ÒÙ ×ØÖ Ú Ö× ÓÒ Ð ÕÙ ×ÓÖØ ÓÑÔÓÖØ Ö× O(n Ð (n))¸ Ò Ð ×Ó ×Ô Ö Óº Ò Ò ÙÖ ¸ Ð Ú Ö ÒÞ ´29±µ Ò ÕÙ ¸ Ò ×Ó Ñ Ð ×Ù ÖØ ¸ Ð ÕÙ ×ÓÖØ ÙÒ × Ö Ô Óº Ð Ö ÞÓÒ Ñ ÒØÓ ÒØ Ö ÓÖ ÔÖ ×ÙÑ ÕÙ Ð Ô ÖÑÙØ ÓÒ × ×ØÖ ÙÝ ÙÒ ÓÖÑ Ñ ÒØ Ù ×Ø ÓÒ ÔÐ Ù× Ð ÓÒ Ò Ð ÑÙÒ Ó Ó Ø ÚÓ Ð ×Ø ר ¸ Ô ÖÓ ÕÙ ÔÙ Ô Ö Ò Ò Ð ÑÙÒ Ó Ö Ðº ÌÓ Ó Ô Ò ÕÙ × ÐÓ ÕÙ × ÓÖ Ò Ý × ÓÒ ÔÖÓÚ Ò Ð × Ù Ò º Ò Ð Ú Ó ÙÖÖ ÕÙ ÐÓ× ÕÙ Ý ÐÓ× × × × ÑÔÖ ×ÓÒ × × Ó׺ ÈÓÖ ÓØÖ Ô ÖØ ¸ Ð Ô ÓÖ ×Ó Ð ÕÙ ×ÓÖØ × Ø Ò × Ú Ö Ñ ÒØ Ð Ñ ØÓ×Ó ÕÙ Ò Ò ÙÒ ÔÐ ÓÒ × Ö ÔÙ ×Ù Ý Ö ×Ó Ö Ð × Ð × ÑÔ ÒÓ × ÐÓ Ö Ø Óº ÄÓ ÒØ Ö ÓÖ Ùר ¬ ÓÒ×ÙÑ Ö ÙÒ ÔÓ Ó Ø ÑÔÓ ÓÒר ÒØ Ô Ö ÓÖÞ Ö¸ Ò Ð Ñ ÔÓ× Ð ¸ ÕÙ Ó ÙÖÖ Ò Ù Ò × Ô ÖØ ÓÒ ×º Ä Ñ ÓÖ Ñ Ò Ö Ð Ñ Ò Ö ÙÒ × × Ó × Ð ØÓÖ¹ Þ Ö ÜÔÐ Ø Ñ ÒØ º Ä × ÓÖÞ Ö ÕÙ Ù ÐÕÙ Ö × Ð Ô ÖÑÙØ ÓÒ¸ Ð × Ð ÓÒ Ð Ô ÚÓØ Ó Þ ÙÒ Ö Ø Ö Ó Ð ØÓÖ Ó¸ Р٠и Ø Ð ÓÑÓ ÐÓ Ö Ù ÑÓ׸ ÔÖÓ Ð ×Ø Ñ ÒØ Ù× Ù ÒÓ× ×Ó׺ Ò ×Ø ÓÖ Ò ×¸ ÙÒ ÔÖ Ñ Ö ×ØÖ Ø ÓÒ× ×Ø Ö Ò Ð ØÓÖ Þ Ö Ð Ô ÖØ ÓÒ × Ö¸ Ò ×ÓÖØ Ö Ð ØÓÖ Ñ ÒØ Ð × Ð ÓÒ Ð Ò Ð Ô ÚÓØ º Ð Ò Ô ÚÓØ × Ö ¸ ÒØÓÒ ×¸ ÙÒ ÒÙÑ ÖÓ Ð ØÓÖ Ó ÒØÖ l Ý rº ר ÑÓ Ó¸ Ð Ð ØÓÖ Ý ÒÓ Ô Ò ÑÓ Ó Ð ÙÒÓ Ð Ú ÐÓÖ Ð Ô ÖÑÙØ ÓÒº Ä Ø Ò ÒØ Ö ÓÖ × Ù Ò ¸ Ô ÖÓ ÒÓ Ú Ø Ð ÔÓ× Ð ÕÙ Ð Ô ÚÓØ Ð ØÓÖ Ó Ù× ÙÒ Ñ Ð Ô ÖØ ÓÒº ÍÒ Ø Ò Ô Ö ×Ñ ÒÙ Ö ×Ø ÔÓ× Ð × ×ÓÖØ Ö Ú Ö Ó× Ò × Ý × Ð ÓÒ Ö ÓÑÓ Ô ÚÓØ Ð Ú ÐÓÖ Ð Ñ Ò º ×ØÓ ÓÒÐÐ Ú Ð ¬ ÙÐØ ÕÙ Ý ÕÙ Ú Ö ¬ Ö ÕÙ ÐÓ× ×ÓÖØ Ó× ÒÓ × Ö Ô Ø Ò¸ ÐÓ ÕÙ × Ð ÓÖ ØÑ Ñ ÒØ Ò ÓÖÖÓ×Ó Ý¸ Ò ÙÖ ÓÒ ÓÒר ÒØ ¸ ÓרÓ×Óº ÈÓÖ × Ö ÞÓÒ¸ × ÔÖ Ö Ð ÒÓ Ú Ö ¬ Ö Ö Ô Ø Ò Ý × ÑÔÐ Ñ ÒØ × Ð ÓÒ Ö Ð Ñ Ò ¸ × Ó ÙÖÖ Ò Ö Ô Ø Ò ×º Ê ×Ø ÔÓÖ Ö Ù ÒØÓ× ×ÓÖØ Ó× × Ò Ö Ð Þ Öº Å ÒØÖ × Ñ ÝÓÖ × ×Ø ÒØ ¸ Ñ ÝÓÖ ÔÓ× Ð × ØÒÖ Ó Ø Ò Ö ÙÒ Ù Ò Ô ÚÓØ ¸ Ô ÖÓ¸ Ø Ñ Ò¸ × Ø Ò Ö Ñ ÝÓÖ ÓÒ×ÙÑÓ Ø ÑÔÓ ÓÒר ÒØ Ý Ñ ÝÓÖ ÑÔ ØÓ Ò Ð × ÑÔ ÒÓº Ä Ð ØÓÖ Þ ÓÒ × ÙÒ ÔÖ Ò Ô Ó Ð ÓÖ ØÑ Ó Ø Ò ÒØ ×Ñ ÒÙ Ö Ð Ñ Ð ×Ù ÖØ Ó ÚÓÖ Ö Ð Ù Ò º Ð ÔÖ Ò Ô Ó ÓÖ × ÓÒÓ Ó Ó Ð ÖÓØÙÐÓ Ð ÓÖ ØÑÓ× Ð ØÓÖ ¹ Þ Ó× Ý ÓÒר ØÙÝ ØÓ ÙÒ Ö Ñ Ð Ð ÓÖ ØÑ º Ò ×Ø Ø ÜØÓ × ×ØÙ Ö Ò Ú Ö× × Ð × × Ð ØÓÖ Þ ÓÒº ÍÒ ×ÕÙ Ñ ÕÙ ÒÓ Ö ÕÙ Ö Ò Ö Ö Ò × Ð ØÓÖ Ó× × ØÓÑ Ö ÐÓ× Ò × ÜØÖ ÑÓ× l¸ r Ñ× ÐÒ Ð ÒØÖÓ Ý × Ó Ö Ð × Ñ Ò Ð × ØÖ × ÒØÖ ×º Ë Ò¸ ÓÑÓ × ÑÔÖ ¸ Ð Ð ØÓÖ ÔÒ Ð Ô ÖÑÙØ ÓÒ¸ Ø Ò Ö ÕÙ Ö Ô ÖÑÙØ ÓÒ × × × × ÔÓÖ ÐÓ× ØÖ × Ð Ó× Ô Ö ÕÙ Ó ÙÖÖ ÙÒ ÑÙÝ Ñ Ð ×Ó Ð Ó ÔÓ Ó ÔÖÓ Ð ÓÒ Ö Ô ÖÓ
  • 219.
    3.2. Algoritmos dividir/combinar 193 ×Ù× ÔØ Ð Ó ÙÖÖ Ö Ó × Ö Ö Ñ ÒØ ÔÖÓÚÓ Ó½½ º Ò ×Ø × ÒØ Ó¸ Ð × Ù ÒØ ÖÙØ Ò × Ð ÓÒ Ð Ô ÚÓØ × ÙÒ ÐÓ Ö Ò ÜÔÐ Ó ½¿ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½¼ ½¿ template <typename T, class Compare> int select_pivot(T * a, const int & l, const int & r) { if (l - r <= 2) return r; const int m = (r + l) / 2; // ındice del centro ´ const int p = Compare () (a[l], a[m]) ? m : l; // p = max(a[l], a[m]) return Compare () (a[r], a[m]) ? r : p; // retornar min(a[r], a[m]) } Ä ÖÙØ Ò ÒØ Ö ÓÖ Ô ÖÑ Ø ÓÑÔÐ Ø Ö Ð Ñ ØÓ Ó ¬Ò Ø ÚÓ Ô ÖØ ÓÒ Ð × Ù ÒØ ÑÒÖ ½¿ Ë Ð ÓÒ Ö Ô ÚÓØ ½ ¿ ≡ ´½ µ const int p = select_pivot <T, Compare> (a, l, r); Aleph::swap(a[p], a[r]); 3.2.2.5 Quicksort sin recursi´n o ÓÒÓ Ó Ð Ô ØÖÓÒ ÑÒ ×Ô Ó Ð ÕÙ ×ÓÖØ¸ Ö ×ÙÐØ ØÖ Ø ÚÓ¸ ØÓ× Ð ¹ Ö Ö Ð Ö ÔÓÖ Ð ÙÐÓ ÓÒר ÒØ ¸ ÒØ ÒØ Ö Ó Ø Ò Ö ÙÒ Ú Ö× ÓÒ ÒÓ Ö ÙÖ× Ú Ð Ñ ØÓ Óº × Ñ ×ÑÓ¸ Ð Ô ØÖÓÒ Ð Ð ÓÖ ØÑÓ Ø Ö Ø ÚÓ Ý × ÓÒÓ × Ð × ÒÓ Ð Ú Ö× ÓÒ Ø Ö Ø Ú Ð Ù×ÕÙ Ò Ö ´Ü ¾º½º½º¾ ´Ô Ò ¿¾µµº Ð ÕÙ ×ÓÖØ Ù× Ö ÙÒ Ô Ð Ô Ö Ö ÓÖ Ö ÙÒ Ô ÖØ ÓÒ Ñ ÒØÖ × ÓÖ Ò Ð ÓØÖ º ר × Ð Ö Ò ÓÒ Ð Ù×ÕÙ Ò Ö Ø Ö Ø Ú ¸ Ð Ù Ð ÒÓ Ö ÕÙ Ö ÙÒ Ô Ð ÔÓÖÕÙ ÒÓ × Ö ÕÙ Ö Ö ÓÖ Ö Ð Ô ÖØ ÓÒ ÕÙ × × ÖØ ×ÔÙ × Ð Ú × ÓÒº × Ô٠׸ Ù× Ö ÑÓ× ÙÒ Ô Ð Ô Ö × ÕÙ ÓÒØ Ò Ò ÐÓ× Ò × ÞÕÙ Ö Ó Ý Ö Ó Ð Ô ÖØ ÓÒº Ö ×ØÓ¸ ÓÒ ÓÒ Ð ×Ø Ó ÙÒ ÔÖÓÔ Ö ÓÒ Ý ÙÒ Ö ×ÔÓÒ× Ð ×ØÙ Ó¸ Ð × Ù ÒØ ÖÙØ Ò ÒÓ ÔÐ ÒØ Ö ÔÖÓ Ð Ñ × ÓÑÔÖ Ò× ÓÒ ½¿ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½¿ ½ template <typename T, class Compare> void quicksort(T * a, const int & l, const int & r) { typedef typename Aleph::pair<int, int> Partition; FixedStack<Partition, 32> stack; stack.push(Partition(l, r)); // empile todo el arreglo como partici´n inicial o while (stack.size() > 0) { const Partition p = stack.pop(); const int pivot = partition <T, Compare> (a, p.first, p.second); if (pivot - p.first < p.second - pivot) // ¿cu´l partici´n m´s peque~a? a o a n { // partici´n izquierda m´s peque~a o a n stack.push(Partition(pivot + 1, p.second)); stack.push(Partition(p.first, pivot - 1)); } ½½ Ò × ÙÖ × ×Ø Ñ ×¸ ÙÒ Ø Ò Ò ÓÒ × ÖÚ Ó¸ ÐÐ Ñ Ø ÕÙ ÔÓÖ ÓÑÔÐ Ð ÓÖ ØÑ ¸ ÓÒ× ×Ø Ò ÜÔÐÓØ Ö Ñ ÐÓ× ×Ó× Ð Ð ÓÖ ØÑÓº Ò ×Ø × ÒØ Ó¸ ÔÙ Ö Ó ÙÖÖ Ö ÙÒ × ØÙ ÓÒ Ò Ð Ù Ð Ð Ö Ñ ÒØ × Ð ÙÒ × ×Ø Ñ Ñ Ð × Ô ÖØ ÓÒ × ØÓ× Ù× Ö ×Ù ÓÐ Ô×Óº
  • 220.
    194 Cap´ ıtulo 3. Cr´ ıtica de algoritmos else { // partici´n derecha m´s peque~a o a n stack.push(Partition(p.first, pivot - 1)); stack.push(Partition(pivot + 1, p.second)); } } } ¬Ò × quicksort¸ Ù× Ò ÙÒ × ½ ¸ ¾ ¸ Ò º Í× × FixedStack ½¼ Ò partition ½ º 3.2.2.6 Quicksort sobre listas enlazadas ØÓ Ó× ÐÓ× Ð ÓÖ ØÑÓ× ÓÖ Ò Ñ ÒØÓ¸ ÕÙ Þ Ð Ñ × × ÑÔÐ ÜÔÖ × Ö× × Ð ÕÙ ×ÓÖØ ×Ó Ö Ð ×Ø × ÒÐ Þ ×º Ä × Ù ÒØ ÖÙØ Ò ÐÓ Ò ½ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½¿ ½ template <class Compare> void quicksort(Dlink & list) { if (list.is_unitarian_or_empty()) return; Dlink * pivot = list.remove_next(); Dlink smaller, bigger; // listas de menores y mayores que pivot Ô ÖØ ÓÒ Ö Ð ×Ø ½ quicksort <Compare> (bigger); quicksort <Compare> (smaller); list.concat_list(&smaller); // restaurar las listas ordenadas en list list.append(pivot); list.concat_list(&bigger); } Í× × quicksort ½ ¿ º Ä ×ØÖÙ ØÙÖ Ð Ð ÓÖ ØÑÓ ÒÓ × Ò Ñ ×Ø Ö Ó× ¸ ÔÙ × × ÓÖÖ ×ÔÓÒ ÓÒ Ð ×ÕÙ Ñ Ð Ð ÓÖ ØÑÓ Ô ÖØ ÓÒ Ö Ð × Ù Ò Ò Ð Ô ØÖÓÒ smaller−→pivot−→biggerº Ä Ð ×Ø smaller ×ÓÐÓ ÓÒØ Ò ÐÓ× Ð Ñ ÒØÓ× Ñ ÒÓÖ × ÕÙ pivot¸ Ñ ÒØÖ × ÕÙ Ð Ð ×Ø bigger ÐÓ× Ñ ÝÓÖ ×º ÓÖ ÒÓ× Ö ×Ø ×Ô ¬ Ö Ð Ô ÖØ ÓÒ¸ Ð Ù Ð × ÓÒ× Ö Ð Ñ ÒØ Ñ × × Ò ÐÐ ÕÙ ÓÒ ÐÓ× ÖÖ ÐÓ× ½ Ô ÖØ ÓÒ Ö Ð ×Ø ½ ≡ ´½ ½ µ while (not list.is_empty()) { Dlink * p = list.remove_next(); if (Compare () (p, pivot)) smaller.append(p); else bigger.append(p); }
  • 221.
    3.2. Algoritmos dividir/combinar 195 3.2.2.7 Mejoras al quicksort Ê Ú × ÑÓ× Ð ÔÖÓ Ñ ÒØÓ Ô ÖØ ÓÒ ¬Ò ÓÒ Ô ÖØ ÓÒ ÖÖ ÐÓ ½ Ý ÐÓ× ÓÖ Ò Ñ ÒØÓ× × Ð ÓÒ Ò× Ö ÓÒ ÔÖ × ÒØ Ó× Ò Ü ¿º½º¿ ´Ô Ò ½ ¾µ Ý Ü ¿º½º ´Ô Ò ½ µ¸ Ö ×Ô Ø Ú Ñ ÒØ º ÍÒ ÔÖ Ñ Ö Ñ Ö Ò ÕÙ ×ØÓ× Ñ ØÓ Ó× ÓÖ Ò Ñ ÒØÓ Ø Ò Ò Ñ ÒÓ× ÒרÖÙ ÓÒ × ÕÙ Ð ÔÖÓ Ñ ÒØÓ Ô ÖØ ÓÒ Ð ÕÙ ¹ ×ÓÖØº ÍÒ Ö Ú × ÓÒ Ñ × Ù Ó× Ö Ú Ð ÕÙ ÐÓ× Ñ ØÓ Ó× ÓÖ Ò Ñ ÒØÓ¸ ÕÙ ×ÓÒ O(n2)¸ ÓÒØ Ò Ò Ñ ÒÓ× if¸ Ñ ÒÓ× ÐÐ Ñ × Compare() Ý Ñ ÒÓ× ÓÑÔ Ö ÓÒ × Ò × ÕÙ Ð ÔÖÓ Ñ ÒØÓ Ô ÖØ ÓÒº ÄÓ× ÓÑ ÒØ Ö Ó× ÒØ Ö ÓÖ × Ùר ¬ Ò Ð Ó × ÖÚ ÓÒ ÑÔ Ö ÕÙ ÐÓ× Ñ ØÓ Ó× × Ð ÓÒ Ò× Ö ÓÒ ×ÓÒ Ñ × Ö Ô Ó× ÕÙ Ð ÕÙ ×ÓÖØ Ô Ö ÖÖ ÐÓ× Ô ÕÙ ÒÓ׺ ÓÑÓ × ÔÓ× Ð ×ØÓ Ê ÓÖ ÑÓ× ÕÙ Ð ÒÓØ ÓÒ O Ó ÙÐØ ÐÓ× Óר × ÓÒר ÒØ × Ý ÕÙ ×Ø ×ÓÐÓ Ö ×ÔÙ × ÙÒ Ú ÐÓÖ ÒØÖ ×Ô ¬ Óº À ÕÙ ¸ Ò Ð ÕÙ ×ÓÖØ¸ ÙÒ Ù Ò ×Ó ÕÙ ÐÐÓ× Óר × ÕÙ Ó ÙÐØ Ð ÒÓØ ÓÒ Oº ÍÒ Ñ ÓÖ ×Ù ×Ø Ò Ð Ð ÕÙ ×ÓÖØ ÓÒ× ×Ø Ò ÓÒÑÙØ Ö ÓØÖÓ Ñ ØÓ Ó ÓÖ ¹ Ò Ñ ÒØÓ Ô Ö Ø Ñ ÒÓ× Ô ÖØ ÓÒ Ô ÕÙ ÒÓ׺ Ù ÒØÓ × ÐÓ Ñ × Ö Ò ÕÙ ÔÙ × Ö ÐÓ Ô ÕÙ ÒÓ Ô Ò ¸ × Ñ ÒØ ¸ Ð Ö Û Ö Ý Ð ÓÑÔ Ð ÓÖº ÈÙ ×ØÓ ÕÙ Ð Ñ ØÓ Ó Ò× Ö ÓÒ Ü Ñ ÓÖ × Ø ÑÔÓ× ÓÒר ÒØ × ÕÙ Ð × Ð ÓÒ¸ ÐÓ ÒØ Ö Ö ÑÓ× Ð × Ù ÒØ Ú Ö× ÓÒ Ñ ÓÖ Ð ÕÙ ×ÓÖØ ½ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½ ½ template <typename T, class Compare> void quicksort_insertion(T * a, const int & l, const int & r) { if (r <= l) return; const int pivot = partition<T, Compare>(a, l, r); const int l_size = pivot - l; // tama~o partici´n izquierda n o const int r_size = r - pivot; // tama~o partici´n derecha n o bool left_done = false; // true si partici´n izquierda est´ ordenada o a bool right_done = false; // true si partici´n derecha est´ ordenada o a if (l_size <= Aleph::Insertion_Threshold) // ¿partici´n izquierda peque~a? o n { // s´ ==> ord´nela por inserci´n ı e o insertion_sort<T, Compare>(a, l, pivot - 1); left_done = true; } if (r_size <= Aleph::Insertion_Threshold) // ¿partici´n derecha peque~a? o n { // s´ ==> ord´nela por inserci´n ı e o insertion_sort<T, Compare>(a, pivot + 1, r); right_done = true; } if (left_done and right_done) return; // ambas particiones ordenadas por inserci´n o if (left_done) // ¿partici´n izquierda ordenada por inserci´n? o o { // s´; s´lo resta ordenar recursivamente la partici´n derecha ı o o quicksort_insertion<T, Compare>(a, pivot + 1, r); return; } if (right_done) // ¿partici´n derecha ordenada por inserci´n? o o { // s´; s´lo resta ordenar recursivamente la partici´n izquierda ı o o quicksort_insertion<T, Compare>(a, l, pivot - 1);
  • 222.
    196 Cap´ ıtulo 3. Cr´ ıtica de algoritmos return; } // En este punto, ambas particiones no fueron ordenadas por inserci´n o if (l_size < r_size) // ordenar de primero la partici´n m´s peque~a o a n { // partici´n izquierda m´s peque~a o a n quicksort_insertion <T, Compare> (a, l, pivot - 1); quicksort_insertion <T, Compare> (a, pivot + 1, r); } else { // partici´n derecha m´s peque~a o a n quicksort_insertion <T, Compare> (a, pivot + 1, r); quicksort_insertion <T, Compare> (a, l, pivot - 1); } } Í× × partition ½ º Ð Ú ÐÓÖ Ü ØÓ Insertion Threshold × Ö Ð Ø ÚÓ Ý Ô Ò Ð × ÓÒ ÓÒ × Ñ Ø Ö Ð × Ý ÓÔ Ö Ø Ú ×º ÍÒ Ú ÐÓÖ ÒØÖ 20 Ý 30 × ×Ù¬ ÒØ Ò Ð ÑÓÑ ÒØÓ Ö ÓÒ ×Ø Ø ÜØÓ½¾ º 3.2.2.8 Claves repetidas ÙÒÕÙ Ð Ð ÓÖ ØÑÓ Ô ÖØ ÓÒ ¬Ò ÓÒ Ô ÖØ ÓÒ ÖÖ ÐÓ ½ ÙÒ ÓÒ ¹ Ù Ñ ÒØ Ô Ö Ð Ú × Ö Ô Ø ×¸ ÔÓ Ö ÔÖÓÚ Ö× Ð ÔÖÓ ×Ó Ô ÖØ ÓÒ Ô Ö ÓÒ¹ × Ö Ö Ö Ô Ø Ò Ý Ö Ð Þ Ö ÙÒ Ô ÖØ ÓÒ ÓÒ Ð ÓÖÑ × Ù ÒØ l r Ð Ñ ÒØÓ× Ñ ÒÓÖ × ÕÙ Ô ÚÓØ Ð Ñ ÒØÓ× Ù Ð × Ô ÚÓØ Ð Ñ ÒØÓ× Ñ ÝÓÖ × ÕÙ Ô ÚÓØ ר Ø ÔÓ Ô ÖØ ÓÒ × Ð ÒÓÑ Ò Ð ØÖ ÔÐ ÓÖÑ Ó Ò Ö ÓÐ Ò × ¸ Ò ÓÒÓÖ Ð Ò ÓÒ Ð × Ö Ïº ×ØÖ ¸ Ð ÔÖ Ñ Ö ÓÑ Ö ÕÙ × ÓÒÓ Ö Ö ÔÓÖØ Ó Ð × Ù Ö Ñ ÒØÓ Ð Ñ ØÓ Óº Ä Ú ÒØ ר ×ÕÙ Ñ × ÕÙ ØÓ × Ð × Ð Ú × Ö Ô Ø × ÕÙ Ò Ð ÒØÖÓ Ý Ð × ÒÚÓ ÓÒ × Ö ÙÖ× Ú × × ØÙ Ò ×Ó Ö ÓÒ ÙÒØÓ× Ñ × Ô ÕÙ ÒÓ× ÕÙ ÒÓ ÓÒØ Ò Ò Ö Ô Ø Ò ×¸ ÐÓ ÕÙ Ð Ö Ð ÓÖ Ò Ñ ÒØÓº Ä Ô ÖØ ÓÒ ÑÓ ¬ Ö× Ñ Ò Ö Ø Ð ÕÙ Ð × Ö Ô Ø Ò × × Ú Ý Ò ÓÐÓ Ò Ó ÔÓÖ ÐÓ× ÜØÖ ÑÓ× Ò ÙÒ ×ÕÙ Ñ × Ñ Ð Ö Ð × Ù ÒØ l r ÙÐ Ñ ÒÓÖ ×ÓÖ Ò Ñ ÝÓÖ ÙÐ p i j q ÄÙ Ó¸ Ù Ò Ó ÐÓ× Ò × × ÖÙ Ò¸ × Ö Ð Þ Ò ÐÓ× ÒØ Ö Ñ Ó× Ò × Ö Ó× Ô Ö Ö Ð ÖÖ ÐÓ ØÖ ÔÐ Ñ ÒØ Ô ÖØ ÓÒ Óº ÄÓ× Ø ÐÐ × Ð Ð ÓÖ ØÑÓ × Ò ÓÑÓ Ö Óº ½¾ Ò Ò ÖÓ ¾¼¼ ¸ ÔÖÓ × ÓÖ × ¿ Þ¸ ÓÒ ¾Å ľº
  • 223.
    3.2. Algoritmos dividir/combinar 197 3.2.2.9 Quicksort concurrente o paralelo Ò Ð ÕÙ ×ÓÖØ ÓÒ Ð ×Ø × ÒÐ Þ × × ÑÙÝ ÐÑ ÒØ ÔÖ Ò× Ð ×Ù Ð Ô Ö¹ Ð Ð Þ ÓÒº Ò ØÓ¸ ÓÑÓ ÐÙ Ó Ð Ô ÖØ ÓÒ Ð Ô ÚÓØ Ý × Ò Ù ÒØÖ Ò ×Ù ÔÓ× ÓÒ ¬Ò Ø Ú ÒØÖÓ Ð ÓÖ Ò ×ÓÐÙØÓ¸ Ð × Ô ÖØ ÓÒ × ÔÙ Ò ÓÖ Ò Ö× Ò Ô Ò ÒØ Ñ ÒØ ¸ ÔÓÖ × Ô Ö Ó¸ ÔÓÖ ×Ø ÒØÓ× Ð ÓÖ ØÑÓ׸ Ú Ö ÒØ × Ý¸ Ò ÐÓ ÕÙ ÓÒ ÖÒ Ð ÔÖÓÔÓ× ØÓ ר Ó × ÖÚ ÓÒ¸ ÔÓÖ ÔÖÓ × ÓÖ × Ö ÒØ ׺ ÓÑÓ Ñ Ò Ö Ñ × Ñ Ð Ö ÔÖ Ò Ö Ð ×ÙÒØÓ¸ ÓÒ× Ö ÑÓ× ÙÒ Ñ ÞÓ Ö × ÓÖ Ò Ö Ý ØÖ × Ô Ö×ÓÒ ×¸ ÙÒ Ô Ö Ô ÖØ ÓÒ Ö Ý Ð × Ó× Ö ×Ø ÒØ × Ô Ö ÓÖ Ò Öº Å ÒØÖ × Ð ÔÖ Ñ Ö Ö Ð Þ Ð Ô ÖØ ÓÒ¸ Ð × Ó× Ö ×Ø ÒØ × Ò ×Ô Ö Ö Ô ÖÓ ÙÒ Ú Þ ÕÙ Ð Ô ÖØ ÓÒ ×Ø ÙÐÑ Ò ¸ ÒØÓÒ × Ð × Ô Ö×ÓÒ × Ò Ö¹ × ÓÖ Ò Ö ÔÙ Ò Ö Ð Þ Ö Ð ÓÖ Ò Ñ ÒØÓ × Ò ÕÙ ÒØ Ö¬ Ö Ò ÒØÖ ÐÐ × Ý ÓÒ Ð ÓÖ Ò ¬Ò Ð Ð Ñ ÞÓº Ù Ò Ó Ð × Ô ÖØ ÓÒ × ×Ø Ò ÓÖ Ò ×¸ Ð Ô ÖØ ÓÒ ÓÖ ÙÒØ ÐÓ× Ñ ÞÓ׸ ÓÒ ÐÓ ÕÙ Ø Ò ÙÒ Ñ ÞÓ ÓÑÔÐ Ø Ñ ÒØ ÓÖ Ò Óº Ä Ó × ÖÚ ÓÒ × ÒØ Ô Ö Ð ÓÖ Ò Ñ ÒØÓ ÓÒ ÖÖ ÐÓ׸ ÙÒÕÙ ÙÒ ÔÓ Ó Ñ × Ð ÒØ Ò Ö¸ Ó Ð Ö Ø Ö ÓÔ ÕÙ × Ö ÕÙ Ö º 3.2.2.10 B´ squeda aleatoria de clave u Ù Ò Ó ÒØ ÒØ ÑÓ× Ö Ð Þ Ö Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð Ñ ÒØ ÖÖ ÐÓ׸ ÒÓ× Ò ÓÒØÖ ÑÓ× ÓÒ ÙÒ ×ÝÙÒØ Ú º Ë ÓÖ Ò ÑÓ׸ ÒØÓÒ × ÔÓ ÑÓ× ÑÔÐ Ö Ð ¬ ÒØ Ù×ÕÙ ¹ Ò Ö ¸ Ô ÖÓ Ø Ò ÑÓ× ÙÒ Ò× Ö ÓÒ Ý ×ÙÔÖ × ÓÒ O(n)º ÈÓÖ Ð ÓÒØÖ Ö Ó¸ × Ñ ÒØ Ò ÑÓ× Ð × ÙÒ ×ÓÖ Ò ¸ ÒØÓÒ × Ø Ò ÑÓ× ÙÒ Ò× Ö ÓÒ ÑÙÝ Ö Ô O(1)¸ Ô ÖÓ ÙÒ Ù×ÕÙ Ý ×ÙÔÖ × ÓÒ Ð ÒØ × O(n)º Ò Ð Ñ ÝÓÖ Ð × Ó × ÓÒ ×¸ Ð Ö ÞÓÒ × Ö Ö ×ÓÐÚ Ö Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð × Ð Ù×ÕÙ ¸ Ö ÞÓÒ ÔÓÖ Ð Ù Ð ÔÙ Ö ÑÓ× ÓÖ Ò Ö Ú Þ Ò Ù Ò Ó Ó Ù Ò Ó ×Ø ÑÓ× × ÙÖÓ× ÕÙ ÒÓ Ö Ò Ñ × Ò× Ö ÓÒ ×º È ÖÓ ÐÐÓ ÙÒ × ÓרÓ×Ó Ý Ð Ñ Ø Ð ×ÓÐÙ ÓÒ ÙÒ ×Ô ØÖÓ Ô ÕÙ ÒÓ × ØÙ ÓÒ ×º ÍÒ ÐØ ÖÒ Ø Ú Ù×ÕÙ ¸ Ö ÒØÖ Ð ÓÖ Ò Ý Ð ×ÓÖ Ò¸ ÕÙ Ô ÖÑ Ø Ñ¹ ÔÐ ÒØ Ö Ð ÓÒ ÙÒØÓ ÙÒ Ñ ÒØ Ð Ñ ÒØ × Ù Ò ×¸ × × ÖÚ Ð Ô ÖØ ÓÒ Ð ÕÙ ×ÓÖØ ÜÔÐ Ò Ü ¿º¾º¾º½ ´Ô Ò ½ µº Ò ØÓ¸ ÔÓ ÑÓ× × ÖÚ ÖÒÓ× Ð Ñ ØÓ Ó × ÖÖÓÐÐ Ó Ò ¬Ò ÓÒ Ô ÖØ ÓÒ ÖÖ ÐÓ ½ ´Ü ¿º¾º¾º½ ´Ô Ò ½ µµ Ô Ö ÑÔÐ ÒØ Ö Ð Ù×ÕÙ ×Ó Ö ÙÒ ÖÖ ÐÓ ×ÓÖ Ò Ó ½ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½ ½ template <typename T, class Compare> int random_search(T * a, const T & x, const int & l, const int & r) { if (l > r) return Not_Found; const int pivot = partition<T, Compare>(a, l, r); if (Compare() (x, a[pivot])) return random_search<T, Compare>(a, x, l, pivot - 1); else if (Compare() (a[pivot], x)) return random_search<T, Compare>(a, x, pivot + 1, r); return pivot; // elemento encontrado en el ındice x ´ } Í× × partition ½ º Ä Ð Ð ÓÖ ØÑÓ × Ô ÖØ ÓÒ Ö Ð ØÓÖ Ñ ÒØ Ð ÖÖ ÐÓ Ý Ó Ø Ò Ö Ð ÔÙÒØÓ Ô ÖØ ÓÒ pivotº Ê ÓÖ ÑÓ× ÕÙ Ð Ô ÚÓØ × ÑÔÖ × Ò Ù ÒØÖ Ò ×Ù ÔÓ× ÓÒ ÓÖ¹ Ò ¬Ò Ø Ú º ÈÓÖ Ø ÒØÓ¸ Ð ÓÖ Ò x Ö ×Ô ØÓ pivot Ø ÖÑ Ò Ò Ù Ð Ð × Ó×
  • 224.
    198 Cap´ ıtulo 3. Cr´ ıtica de algoritmos Ô ÖØ ÓÒ × × ÓÒØ ÒÙ Ö ÙÖ× Ú Ñ ÒØ Ð Ù×ÕÙ º ÈÓÖ ×ÙÔÙ ×ØÓ¸ × ÙÒ Ð Ò Ð × × Ü ¿º¾º¾º½ ´Ô Ò ½ µ¸ Ð Ð ÓÖ ØÑÓ Ö ÓÖÖ ÒØ Ö ¹ Ñ ÒØ Ð ÖÖ ÐÓº Ê ÞÓÒ ÔÓÖ Ð Ù Ð × Ð Ú Ö ÕÙ Ð Ù×ÕÙ Ò Ö Ð ÒÓ ÔÓ Ö ÔÓÝ Ö× ÒØ Ö Ñ ÒØ Ò random search()º È ÖÓ × ÔÓ Ö ¸ ÑÔ ÖÓ¸ Ñ ÒØ Ò Ö ÙÒ Ð ×Ø ÓÖ Ò Ô ÚÓØ × Ô ÖØ Ö Ð Ù Ð Ö Ð Þ Ö Ù×ÕÙ × × Ù Ò Ð × ÕÙ × Ö Ò ÓÒ× Ö Ð Ñ ÒØ Ñ × ÓÖØ × ÕÙ Ö ÓÖÖ Ö ÒØ Ö Ñ ÒØ Ð ÖÖ ÐÓº Ð Ò Ð × × ÓÖÑ Ð ×Ø Ð ÓÖ ØÑÓ × Ð ÓÑÓ Ö Óº Ä Ù×ÕÙ Ð ØÓÖ Þ × Ô Ö Ø Ñ ÒØ ÔÐ Ù× Ð ÓÒ Ð ×Ø × ÒÐ Þ ×º Ð ÔÖ Ò Ô Ó ´Ý Ð Ð ÓÖ ØÑÓ Ö ×ÙÐØ ÒØ µ × Ð Ñ ×ÑÓ Ô ÖØ ÓÒ Ö Ð Ð ×Ø × ÙÒ Ð Ô ÚÓØ Ý ÐÙ Ó Ö Ò Ù Ð Ð × Ó× Ô ÖØ ÓÒ × ÓÒØ ÒÙ Ö Ð Ù×ÕÙ ½ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½ ½ template <typename T, class Compare> Dnode<T> * dlink_random_search(Dlink & list, const T & x) { if (list.is_empty()) return NULL; Dnode<T> * pivot = static_cast<Dnode<T>*>(list.remove_next()); Dnode<T> item(x); Dnode<T> * item_ptr = &item; // puntero a una celda que contiene a x Dlink smaller; // lista de los menores que pivot Dlink bigger; // lista de los mayores que pivot Ô ÖØ ÓÒ Ö Ð ×Ø ½ Dnode<T> * ret_val = NULL; if (Compare () (item_ptr, pivot)) ret_val = dlink_random_search <T, Compare> (smaller, x); else if (Compare () (pivot, item_ptr)) ret_val = dlink_random_search <T, Compare> (bigger, x); else ret_val = pivot; list.swap(&smaller); list.append(pivot); list.concat_list(&bigger); return ret_val; } Í× × Dnode º ÈÓÖ ÓÒÓÑ Ó Ó¸ dlink random search() ×ÙÑ ÕÙ × Ù× ×Ó Ö ÙÒ Ð ×Ø Dlinkº ×ØÓ Ö ÕÙ Ö ÕÙ Ð Ù×Ù Ö Ó ×ÙÖØ ÙÒ Ð × ÓÑÔ Ö ÓÒ ÕÙ ÓÒ× Ö Ó ØÓ× Ø ÔÓ Dlink Ý ÒÓ Dnode<T> ÐÓ ÕÙ Ð ×ÙÒØÓ Ð Ó Ò ÓÖÖÓ×Ó¸ ÔÙ × Ð Ù×Ù Ö Ó ÓÒÚ ÖØ Ö ÐÓ× ÔÙÒØ ÖÓ× Ð Ø ÔÓ Dlink Dnode<T>º ÓÑÓ Ý ÐÓ ÜÔÐ ÑÓ× Ò Ü ¿º½º¿ ´Ô Ò ½ µ¸ Ð Ð × Ò Ö Compare Dnode ÒÓ× ÔÓ× Ð Ø Ð ÑÔÐ ÒØ ÓÒ random search() Ô Ö Ó ØÓ× Ø ÔÓ Dnode<T> Ý Ö Ú Ó׺ 3.2.2.11 Selecci´n aleatoria sobre secuencia desordenadas o Ó Ð Ñ ×ÑÓ ÙÒ Ñ ÒØÓ Ð Ð ÓÖ ØÑÓ ÒØ Ö ÓÖ¸ × ÔÓ× Ð ÑÔÐ ÒØ Ö Ð × Ð ÓÒ Ð ØÓ¹ Ö × Ö¸ Ù× Ö Ð i¹ × ÑÓ Ñ ÒÓÖ Ð Ñ ÒØÓ ÒØÖÓ Ð × Ù Ò º ×ØÓ × ÐÐ Ú Ó Ð × Ù ÒØ Ñ Ò Ö ½ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½ ½ template <typename T, class Compare> static inline
  • 225.
    3.2. Algoritmos dividir/combinar 199 const T & __random_select(T * a, const int & i, const int & l, const int & r) { const int pivot = partition<T, Compare>(a, l, r); if (i == pivot) return a[i]; if (i < pivot) // ¿est´ en partici´n izquierda? a o return __random_select<T, Compare>(a, i, l, pivot - 1); else return __random_select<T, Compare>(a, i - (pivot - l + 1), pivot + 1, r); } Í× × partition ½ º ÁÑÔÓÖØ ÒØ × Ò Ð Ö ÕÙ ÕÙ Ð ÔÖÓ Ð Ñ × × Ö ×Ù ÐÚ Ñ × Ö Ô Ó ÓÒ random select() ÕÙ Ñ ÒØ Ð Ñ Ö Ù×ÕÙ × Ù Ò Ðº Ò ØÓ¸ Ò ÙÐØ ÑÓ ×Ó Ð × Ð ÓÒ × Ö O(n2)½¿ º × ÓÒÚ Ò ÒØ Ú Ö ¬ Ö ÕÙ Ð Ú ÐÓÖ i × Ö ÙÒ× Ö Ð Ö Ò Ó [l, r]º ØÓ× ÓÖÖ Ö ÙÖ ÓÒ Ð ÙÐÓ¸ ÓÐÓ ÑÓ× Ð Ú Ö ¬ ÓÒ ÙÒ ×ÓÐ Ú Þ¸ ÒØÖÓ Ð ÒØ Ö Þ ÔÙ Ð ¸ Ò ÐÙ Ö ÖÐÓ ÐÐ Ñ Ö ÙÖ× Ú º ר ÑÓ Ó¸ Ð ÖÙØ Ò ÔÙ Ð × ¬Ò × ½ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½ ½ template <typename T, class Compare> const T & random_select(T * a, const int & i, const int & n) { if (i >= n) throw std::out_of_range("index out of range"); return __random_select(a, i, 0, n - 1); } È Ö Ð × Ð ÓÒ Ð ØÓÖ ÓÒ Ð ×Ø × ÒÐ Þ × ÑÓ× Ò Ö Ð ÔÖÓ ×Ó Ô ÖØ ÓÒ Ö Ð ×Ø ½ Ð ÓÒØ Ð Þ ÓÒ Ð × Ö Ò Ð × Ð × Ó× Ô ÖØ ÓÒ × Ö ×ÙÐØ ÒØ ׺ ×ØÓ × ÔÙ Ö Ð Þ Ö Ð × Ù ÒØ Ñ Ò Ö ½ Ô ÖØ ÓÒ Ö Ð ×Ø Ý ÓÒØ Ö ½ ≡ ´½ µ while (not list.is_empty()) { Dlink * p = list.remove_next(); if (Compare () (p, pivot)) // ¿p < pivot? { smaller.append(p); ++smaller_count; } else { bigger.append(p); ++bigger_count; } } ½ Å ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ½ ¿ +≡ ½ template <class Compare> Dlink * dlink_random_select(Dlink & list, const size_t & i) { if (list.is_empty()) ½¿ Î × Ö Ó ¾¾ Ô ØÙÐÓ ¾º
  • 226.
    200 Cap´ ıtulo 3. Cr´ ıtica de algoritmos return NULL; Dlink * pivot = list.remove_next(); Dlink smaller; // lista de los menores que pivot Dlink bigger; // lista de los mayores que pivot size_t smaller_count = 0, // cantidad de elementos de smaller bigger_count = 0; // cantidad de elementos de bigger Ô ÖØ ÓÒ Ö Ð ×Ø Ý ÓÒØ Ö ½ Dlink * ret_val = NULL; if (i == smaller_count) ret_val = pivot; else if (i < smaller_count) ret_val = dlink_random_select <Compare> (smaller, i); else ret_val = dlink_random_select <Compare> (bigger, i - (smaller_count + 1)); list.concat_list(&smaller); list.append(pivot); list.concat_list(&bigger); return ret_val; } 3.3 An´lisis amortizado a ÓÒ× Ö ÑÓ× ÙÒ × ØÙ ÓÒ Ò Ð Ù Ð ÕÙ Ö ÑÓ× ×ØÙ Ö Ð × ÑÔ ÒÓ ÙÒ Ì Ó ÙÒ ×ØÖÙ ØÙÖ ØÓ׺ Ä ÒÓØ ÓÒ O ÒÓ× ÔÖÓÔÓÖ ÓÒ ÙÒ Ñ Ò ×ÑÓ × Ò ÐÐÓ Ý Ó Ø ÚÓ Ô Ö Ò ÐÞ ÖÐ Ø Ò Ò Ð ÙÖÚ ÙÖ ÓÒ ÙÒ Ð ÓÖ ØÑÓº Ë Ò Ñ Ö Ó¸ Ù Ò Ó Ò Ð Þ ÑÓ× Ð × ÑÔ ÒÓ ÙÒ Ì ÑÓ× ÓÒ× Ö Ö ÓØÖÓ× ×Ô ØÓ× ÓÒ Ð × ¯ ÍÒ Ì Ø Ò Ú Ö × ÓÔ Ö ÓÒ × ÙÝÓ× × ÑÔ ÒÓ× ÔÙ Ò × Ö Ö ÒØ × Ý ÕÙ ÔÙ Ò × Ö× Ò Ð ÓÖ ØÑÓ× ×Ø ÒØÓ׺ ÈÓÖ Ø ÒØÓ¸ Ò Ð Þ Ö ÙÒ Ì ÔÙ Ö ÕÙ Ö Ö Ò Ð Þ Ö ×Ø ÒØÓ× Ð ÓÖ ØÑÓ׺ ¯ ÈÓÖ ÐÓ Ò Ö Ð¸ ÙÒ Ì ×Ù Ý Ò ÙÒ ×ØÖÙ ØÙÖ ØÓ׺ Ò ×Ø × ÒØ Ó¸ ×Ù Ò Ð × × Ö ÕÙ Ö ÓÒ× Ö Ö Ð ×Ø Ó ØÙ Ð Ð ×ØÖÙ ØÙÖ ØÓ׸ ÔÙ × ×Ø ÑÙÝ ÔÖÓ Ð Ñ ÒØ Ø Ò Ö Ð ÓÒ Ö Ø ÓÒ Ð × ÑÔ ÒÓ Ð ÓÔ Ö ÓÒº ¯ Ð ×Ø Ó Ð ×ØÖÙ ØÙÖ ØÓ× Ô Ò Ð Ô ÖÑÙØ ÓÒ ÓÔ Ö ÓÒ × ÕÙ × ×Ù ×Ó Ö Ð Ì º Ë Ù Ò × ÓÔ Ö ÓÒ ×Ø ÒØ × ÔÖÓ Ù Ö Ò Ø ÑÔÓ× ×Ø ÒØÓ׺ Ð Ö ×Ô ØÓ¸ Ù ÒØÓ ÑÓÖ Ö ØÙ Ö n ÓÔ Ö ÓÒ × ×Ó Ö ÙÒ Ì ÔÓ ÑÓ× ×Ø Ð Ö ÙÒ ÓØ Ò Ô Ò ÒØ Ð Ú ÐÓÖ Ð Ô ÖÑÙØ ÓÒ × Ð × Ó× ×¸ Ú ÑÓ× ÐÓ× ÔÖÓ Ð Ñ × Ð Ñ ÖÓ Ù×Ó Ð ÒÓØ ÓÒ O Ð Ò Ð Þ Ö ÙÒ Ì º È Ö ÐÐÓ¸ Ü Ñ Ò ÑÓ× Ð Ì DynListStack<T> ´Ü ¾º º ´Ô Ò ½½ µµ Ý ÙÒ × ÙÒ Ù ÐÕÙ Ö ÓÔ Ö ÓÒ × ×Ó Ö ×Ø Ì Ò Ô ÖØ ÙÐ Ö¸ ÓÒ× Ö ÑÓ× Ð × × Ù Ò × ÔÓ× Ð × ÕÙ ÓÑÔÓÖØ Ò pushes Ý popsº Ë Ö Ñ ÑÓÖ ÑÓ× Ð ÑÔÐ ÒØ ÓÒ DynListStack<T>¸ ÒØÓÒ × ÔÓ ÑÓ× ÔÖ Ò Ö ÕÙ Ø ÒØÓ push() ÓÑÓ pop() ØÓÑ Ò O(1)º ÈÓÖ Ø ÒØÓ¸ Ù ÐÕÙ Ö × Ù Ò n ÓÔ Ö ÓÒ × ×Ó Ö DynListStack<T> ØÓÑ nO(1) = O(n)º ÑÓ× Ö Ð Þ Ö ÒÙ ×ØÖÓ ÔÖ Ñ Ö Ò Ð × × ×Ó Ö Ð ÓÑÔÓÖ¹ Ø Ñ ÒØÓ ÙÒ Ì ÓÑÓ ÙÒ ØÓ Óº
  • 227.
    3.3. An´lisis amortizado a 201 ÓÖ Ò ÑÓ× Ð Ì DynListStack<T> Ð ÓÔ Ö ÓÒ popn(n)¸ Ð Ù Ð ÜØÖ n Ð Ñ ÒØÓ× Ð Ô Ð ½ º Ì Ð ÓÔ Ö ÓÒ ÔÙ Ö Ð Þ Ö× Ð × Ù ÒØ ÑÓ Ó ¾¼½ ÔÙ× Ò Ô Ö DynListStack<T> ¾¼½ ≡ template <typename T> void popn(DynListStack<T> & stack, const size_t & n) { if (n > stack.size()) throw std::overflow_error("Stack overflow"); for (int i = 0; i < n and stack.size() > 0; ++i) stack.pop(); } Í× × DynListStack ½½ º Ë Ð Ô Ð ÓÒØ Ò n Ð Ñ ÒØÓ׸ ÒØÓÒ × Ð Óר popn() × O(n) Ô Ö Ð Ô ÓÖ ×Óº ËÙÔÓÒ ÑÓ× ÕÙ Ö ÑÓ× Ð Ú Ö× ÓÒ ÜØ Ò Ð Ì DynListStack<T> ÓÒ Ð × × ¹ Ù ÒØ × ×Ô ¬ ÓÒ × Ö Ò Ñ ÒØÓ × × Ò Ð Ò Ð × × ØÖ ÓÒ Ð½ ÆÓÑ Ö ÓÔ Ö ÓÒ ¬ Ò Ô ÓÖ ×Ó push(item) O(1) pop() O(1) popn(n) O(n) Ù ÒØÓ Ù ×Ø ÙÒ × Ù Ò n ÓÔ Ö ÓÒ × ÓÒ× ÙØ Ú × ×Ó Ö ÙÒ Ó ØÓ DynListStack<T> È Ö Ö ×ÔÓÒ Ö ÔÓÖ Ð Ô ÓÖ ×Ó¸ ØÓÑ ÑÓ× Ð ÓÔ Ö ÓÒ popn()¸ ÕÙ × Ð Ñ × ÓרÓ× ¸ Ý Ð ÙÐ ÑÓ× Ð Óר ÙØ ÖÐ n Ú × ÓÒ× ÙØ Ú ×º ØÖ Ú × ×Ø Ö ÞÓÒ Ñ ÒØÓ¸ ÐÐ ÑÓ× Ð ÓÒ ÐÙ× ÓÒ ÕÙ Ð Óר ØÓØ Ð × n × O(n) = O(n2)º È ÖÓ ×Ø Ö ÞÓÒ Ñ ÒØÓ ÒÓ × Ùרӏ ÔÙ × Ð × ÑÔ ÒÓ popn() Ô Ò Ð ÒØ ¹ Ð Ñ ÒØÓ× Ò Ð Ô Ð º ÍÒ ÐÐ Ñ popn(n) ØÓÑ O(n)¸ Ô ÖÓ¸ Ð × × Ù ÒØ × ØÓÑ Ö Ò O(1)¸ ÔÙ × × ÙØ Ò ×Ó Ö ÙÒ Ô Ð Ú º Ð Ò Ð × × ÒØ Ö ÓÖ¸ Ñ × ×Ù Ø ÚÓ¸ ÕÙ ÓÒ× Ö Ð × Ö ÙÒר Ò × ÒÚÓ ÓÒ popn()¸ ÒÓ× Ö Ú Ð ÕÙ Ù ÐÕÙ Ö × Ù Ò n ÓÔ Ö ÓÒ × ×¸ Ò ÔÖÓÑ Ó¸ O(n)º ÍÒ Ø Ò Ú Ò Ù Ö ÕÙ ÒØ ÒØ ÓÒ ÖØÓ Ü ØÓ Ó Ø Þ Ö Ð Ò Ð × × Ø ÔÓ× ×ØÖ ØÓ× ØÓ× × ÒÓÑ Ò Ò Ð × × ÑÓÖØ Þ Ó º Ä × ÔÓÒ Ö Ö ÐÓ× Óר × ÓÔ Ö ÓÒ × ÙÒ Ì ØÖ Ú × ÙÒ ÔÓØ Ò Ð ×ØÖ ØÓ Ó Ö ØÓ׺ 3.3.1 An´lisis potencial a Ò ×Ø Ð × Ò Ð×× ÑÓ× Ò ÓÒØÖ Ö ÙÒ ÙÒ ÓÒ ÔÓØ Ò Ð Φ : D −→ R ÓÒ D Ö ÔÖ × ÒØ Ð ×ØÖÙ ØÙÖ ØÓ× ×Ù Ý ÒØ Ð Ì Ý R × Ð ÓÒ ÙÒØÓ ÐÓ× ÒÙÑ ÖÓ× Ö Ð ×º D × ¬Ò ÓÑÓ D = {D0} ∪ {D1, D2, . . . , Dn}¸ ÓÒ D0 × Ð ×Ø Ó Ò Ð Ð ×ØÖÙ ØÙÖ ØÓ× Ý {D1, D2, . . . , Dn} ×ÓÒ ÐÓ× ×Ø Ó× ×Ù × Ù ÒØ × Ö ×ÙÐØ ÒØ × ÙÒ × ÙÒ ÓÔ Ö ÓÒ × ×Ó Ö Ð Ì º ÕÙ Ñ Ò Ö ÔÙ Ù× Ö× Ð ÙÒ ÓÒ ÔÓØ Ò Ð Ô Ö Ò Ð Þ Ö ÙÒ Ì È Ö ÓÖ Ö Ð ÔÖ ÙÒØ ¸ ÔÐ ÒØ ÑÓ× Ð × Ù ÒØ Óר ÑÓÖØ Þ Ó Ô Ö Ð i¹ × Ñ ÓÔ Ö ÓÒ ½ ÇÔ Ö ÓÒ ÕÙ Ù ¬Ò Ô Ö Ð Ì ArrayStack<T> × ÖÖÓÐÐ Ó Ò Ü ¾º º¾ ´Ô Ò ½¼ µ Ý ÕÙ ØÓÑ O(1)º ½ Ð Ö ×ØÓ Ð × ÓÔ Ö ÓÒ × size()¸ is empty() Ý top() × ÓÑ Ø Ò ÔÓÖÕÙ Ø Ò Ò Ø ÑÔÓ ÓÒר ÒØ Ý ÒÓ Ö Ð Þ Ò ÑÓ ¬ ÓÒ × ×Ó Ö Ð ×ØÖÙ ØÙÖ ØÓ׺
  • 228.
    202 Cap´ ıtulo 3. Cr´ ıtica de algoritmos ×Ó Ö ÙÒ Ì i = Øi + Φ(Di) − Φ(Di−1) ´¿º¾ µ Ö Ò ÔÓØ Ò Ð ΔΦ i Øi × Ð ÙÖ ÓÒ Ù ÓÒ Ð i¹ × Ñ ÓÔ Ö ÓÒ¸ Ñ ÒØÖ × ÕÙ ΔΦ × Ð Ö Ò¹ i ÔÓØ Ò Ð ÒØÖ Ð ÓÔ Ö ÓÒ ØÙ Ð Ý Ð ÒØ Ö ÓÖ¸ Ð Ù Ð Ö ÔÖ × ÒØ Ð ÓÒ×ÙÑÓ Ó Ð ÓÑÔ Ò× ÓÒ Ò Ö × ÙÒ ÕÙ Ð Ö Ò Ð × ÔÓ× Ø ÚÓ Ó Ò Ø ÚÓº Ò ×Ø ×Ó¸ Ð ÔÓØ Ò Ð ÒÓØ ÙÒ ×Ô Ò Ö ÕÙ × ×Ø Ó × Ò ÒØÖ ÙÒ ÓÔ Ö ÓÒ Ý ÓØÖ ½ º Ð Óר ÑÓÖØ Þ Ó ÑÓ Ð Þ Ð Ó ÕÙ Ð ÙÒ × ÓÔ Ö ÓÒ × Ù ×Ø Ò Ñ × ÕÙ ÓØÖ ×¸ Ô ÖÓ¸ Ø Ñ Ò¸ Ð ÕÙ ÓØÖ × ÓÔ Ö ÓÒ × ÙÑ ÒØ Ò Ð ÔÓØ Ò Ð Ð ×ØÖÙ ¹ ØÙÖ ØÓ× Ñ Ò Ö Ø Ð ÕÙ ×ÔÓÒ Ò Ò Ö Ù Ò Ó ØÙ Òº Ä Ù ÓÒ ´¿º¾ µ ÒÓ× ÓÒ Ù ¬Ò Ö Ð Óר ØÓØ Ð n ÓÔ Ö ÓÒ × Ð × Ù ÒØ ÓÖÑ n n Ì(n) = Øi = i − (Φ(Di ) − Φ(Di−1 )) i=1 i=1 ΔΦi n n n = i − Φ(Di ) + Φ(Di−1 ) =⇒ ´¿º¾ µ i=1 i=1 i=1 n n n n = i = Øi + Φ(Di ) − Φ(Di−1 ) i=1 i=1 i=1 i=1 n = Øi + Φ(D1 ) + Φ(D2 ) + · · · + Φ(Dn ) − Φ(D0 ) + Φ(D1 ) + · · · + Φ(Dn−1 ) i=1 n = Øi + Φ(Dn ) − Φ(D0 ) ´¿º¿¼µ i=1 È Ö ÕÙ Ð ÔÓØ Ò Ð Ø Ò × ÒØ Ó¸ × Ñ Ò ×Ø Ö ¬Ò Ö Φ Ñ Ò Ö Ø Ð ÕÙ ¸ Ô Ö ØÓ Ô ÖÑÙØ ÓÒ ÔÓ× Ð ÓÔ Ö ÓÒ ×¸ Φ(Dn) ≥ Φ(D0) × Ö¸ ÕÙ Ð Ö Ò ÔÓØ Ò Ð ØÓØ Ð ÒØÖ Ð ×Ø Ó Ò Ð Ð ×ØÖÙ ØÙÖ ØÓ× Ý Ð ÙÐØ Ñ ÓÔ Ö ÓÒ × ÑÔÖ × ÔÓ× Ø ÚÓ¸ ÔÙ × × ÒÓ¸ Ò Ð ÙÒ ÑÓÑ ÒØÓ Ð ×ØÖÙ ØÙÖ ØÓ× Ö Ö ÔÓØ Ò Ð¸ ÐÓ Ù Ð Ô Ö ÒÓ Ø Ò Ö × ÒØ Ó Ò ÒÙ ×ØÖÓ ÓÒØ ÜØÓ Ø ÖÖ Ò Ð ½ º ÈÓ ÑÓ× ×ÙÑ Ö ÕÙ Φ(D ) ≥ 0¸ 0 ÔÙ × Ð ÙÒ ×ØÖÙ ØÙÖ ØÓ× × ÓØÓÖ Ö ÔÓØ Ò Ð × ÙØÙÖ × ÓÔ Ö ÓÒ ×º Ó ×Ø ×ÙÒ ÓÒ¸ Φ(Dn) − Φ(D0) ≥ 0¸ ÐÓ ÕÙ ¸ Ò ÙÒ ÓÒ ´¿º¿¼µ¸ ÒÓ× ÓÒ Ù ¬ÖÑ Ö ½ Ð ÙÒ Ú Ñ Ò Ö ¸ Ð Ð Ò Ù ÒØ ¬ ר ÑÓ ÖÒÓ ÙÒ ÒÓ ÐÓ Ö Ó ÑÔÓ Ö Ö ÓÑÔÐ Ø Ñ ÒØ Ð × ÒØ Ó Ò ×ØÖ Ð Ð Ô Ð Ö ÔÓØ Ò ¸ Ö Þ ÔÓØ Ò Ð ¸ Ù Ð × ÙÒ ÒÓ ÓÒ Ñ Ò Ò ×Ø × ÓÒº Ù Ò Ó ÑÓ× ÕÙ ÙÒ ×ØÙ ÒØ Ø Ò Ð ÔÓØ Ò Ð × Ö Ö ÐÐ ÒØ ¸ ÒÓ ÒÓ× ×Ø ÑÓ× Ö ¬Ö Ò Ó Ð ÒÓ ÓÒ × Ò Ö ÒÓ ×Ø ÑÓ× Ò Ó Ð Ó × ÓÑÓ Ð Ø Ò ×Ù¬ ÒØ × ÐÓÖ ×º Ò ×Ø ×Ó¸ Ö ÕÙ Ø Ò ÔÓØ Ò Ð ÜÔÖ × ÕÙ Ð ÔÓ× Ø Ð ÒØÓ× ÕÙ Ð Ô ÖÑ Ø Ö Ò Ú Ò Ö Ü Ð ÒØ ¸ Ô ÖÓ ÒÓ ÑÓ× ÕÙ ÐÓ ×º Ò ÒÙ ×ØÖÓ ÑÔÐÓ Ð ÔÓØ Ò Ð × ÙÒ ÓÒ ÓÒ Ò ×Ô Ò× Ð Ô Ö Ð Ö ÐÐ ÒØ Þ¸ Ô ÖÓ ÒÓ ÙÒ Ö ÒØ º Ð Ô Ò× Ñ ÒØÓ Ö Ó ÒØ ÙÓ ×Ø Ò Ù ÐÓ× Ø ÖÑ ÒÓ× ν ργειεα ´ Ò Ö µ ÕÙ ÓÖÖ ×ÔÓÒ Ð ÐÓ ÕÙ ÓÝ ÓÒÒÓØ ÑÓ× ÓÑÓ Ò Ö Ý δψ ναμις ´ ÝÒ Ñ ×µ¸ ÕÙ ÓÖÖ ×ÔÓÒ ÐÓ ÔÓØ Ò Ð¸ Ý ÙÝ ØÖ Ù ÓÒ Ð Ø Ò × ÔÓØ ÒØ º Ä Ô Ð Ö εργον ´ Ö ÓÒµ × Ò Ð Ù ÖÞ Ô Ö Ó Ö Ö Ó ÐÓ ÕÙ ÓÝ ÓÒÒÓØ ÑÓ× ÓÑÓ ØÙ Ö¸ ÓÒ Ö ÑÔÐ Ó Ð ØÓº Ò Ö ÔÖÓÚ Ò Ð ÓÑÔÓ× ÓÒ Ð ÔÖ ¬ Ó εν ´ Òµ ÕÙ × Ò ¬ ÒØÖÓ ¸ ÓÒ ργεια ´ Ö µ¸ ÓÖÑ Ö Ø Ñ ÒØ Ö Ð ÓÒ ÓÒ ργον ´ Ö ÓÒµº È Ö ÐÓ× Ö Ó× Ò Ö ÓÒר ØÙ Ð ØÓ Ð ÔÖ × Ò ¸ Ñ ÒØÖ × ÕÙ Ð ÔÓØ Ò Ö ÐÓ ÕÙ ÔÓ× Ð Ø Ð ØÓº ½ Å × ÒÓ¸ ÕÙ Þ ¸ Ò ÐÓ Ú ÒÓº
  • 229.
    3.3. An´lisis amortizado a 203 Ð × ÙÐ × Ù ÒØ n n Ì(n) = Øi ≤ i ´¿º¿½µ i=1 i=1 Ó Ð × ÔÖ Ñ × × ÔÐ ÒØ ׸ Ð × Ù Ð ´¿º¿½µ ÒÓ× ÑÙ ×ØÖ ÕÙ (n) ÓØ ×Ù¹ Ô Ö ÓÖÑ ÒØ Ì(n)¸ Ö ÞÓÒ ÔÓÖ Ð Ù Ð ÔÓ ÑÓ× ØÖ Ö ÓÒ × ÙÖ Ñ ÒØ (n) Ý ÐÓ× Ô ÓÖ × ×Ó× Øi × ÙÒ ÙÒ Ð × ÓÔ Ö ÓÒ × Ð Ì Ý Ð × ÔÓ× Ð × Ô ÖÑÙØ ÓÒ × × Ù Ò × ÓÔ Ö ÓÒº ÓÒ× Ö ÑÓ× Ð Ú Ö× ÓÒ ÜØ Ò Ð Ì DynListStack<T> Ý ¬Ò ÑÓ× Φ : D −→ R ÓÑÓ Ð ÒØ Ð Ñ ÒØÓ× ÕÙ Ø Ò Ð Ô Ð Ð Ø ÖÑ ÒÓ ÙÒ ÓÔ Ö ÓÒ¸ ÔÓÖ ÐÓ ÕÙ Φ(D0) = 0º ×ØÙ ÑÓ× ÐÓ ÕÙ Ó ÙÖÖ ÓÒ ÐÓ× ÔÓØ Ò Ð × Ñ Ö Ò Ó Ð ÙÒ × Ù Ò ÓÔ Ö ÓÒ Ô ÖØ ÙÐ Ö ÔÓÖ ÑÔÐÓ¸ Ð ÑÓ×ØÖ ÔÓÖ Ð Ø Ð × Ù ÒØ i ÇÔ Ö ÓÒ Øi Φ(Di ) ΔΦi = Φ(Di ) − Φ(Di−1 ) i = Øi +ΔΦi ¼ ¹ ¹ 0 ¹ ¹ ½ push() 1 1 1 2 ¾ push() 1 2 1 2 ¿ push() 1 3 1 2 pop() 1 2 −1 0 push() 1 3 1 2 popn(3) 3 0 −3 0 Ð ¬Ò Ð ÙÒ push()¸ Ð Ø Ñ ÒÓ Ð Ô Ð × Ò Ö Ñ ÒØ Ò ÙÒÓ¸ ÔÓÖ ÐÓ ÕÙ × ÑÔÖ × ÙÑÔÐ i = 1 + 1 ; ti ΔΦ i × Ð i¹ × Ñ ÓÔ Ö ÓÒ × push()º Ð ¬Ò Ð ÙÒ popn(k)¸ Φ(Di) = Ni−1−k ÓÒ Ni−1 × Ð ÒØ Ð Ñ ÒØÓ× ÒØ × ØÙ Ö popn()º ר ÑÓ Ó¸ ÐÙ Ó ÙØ Ó ÙÒ popn(k)¸ Ð Óר ÑÓÖØ Þ Ó ×Ö i = k + Ni−1 − k − Ni = 0 ; k ΔΦ i Ú Þ ÕÙ Ð i¹ × Ñ ÓÔ Ö ÓÒ × popn(k)º ÆÓØ ÑÓ× ÕÙ Ð Óר pop() × ÕÙ Ú ¹ Ð ÒØ popn(1)º Ò × ÒØ × ×¸ Ò Ô Ò ÒØ Ñ ÒØ Ð Ô ÖÑÙØ ÓÒ Ð × Ù Ò ÓÔ Ö ÓÒ¸ ÐÓ× Óר × ÑÓÖØ Þ Ó× Ð Ì DynListStack<T> ×ÓÒ ÐÓ× × Ù ÒØ × ÆÓÑ Ö ÓÔ Ö ÓÒ push(item) 2 pop() 0 popn(n) 0 ÓÖ ×ØÙ ÑÓ× Ð Óר ØÓØ Ð n ÓÔ Ö ÓÒ × ÓÒ× ÙØ Ú × ×Ó Ö Ð Ì DynListStack<T>º ÈÓ ÑÓ× Ú Ö Ð × ÓÔ Ö ÓÒ × Ò n1 push() Ý n2 popn() ´Ö ÓÖ ÑÓ× ÕÙ pop() ⇐⇒ popn(1)µº ÈÓÖ Ø ÒØÓ Ì(n) ≤ (n) = O(n1) × 2 + O(n2) × 0 = O(n1) = O(n)
  • 230.
    204 Cap´ ıtulo 3. Cr´ ıtica de algoritmos × Ô٠׸ Ð Óר ÔÖÓÑ Ó ÔÓÖ ÓÔ Ö ÓÒ¸ ÒØÖ Ù ÐÕÙ Ö Ô ÖÑÙØ ÓÒ n ÓÔ Ö ÓÒ × ×Ø Ó ÔÓÖ Øi ≤ (n) = O(n) = O(1) n n 3.3.2 An´lisis contable a Ò ÙÒ Ò Ð × × ÑÓÖØ Þ Ó ÓÒØ и ÓÔ Ö ÓÒ × Ð × Ò ÙÒ ÒØ ÓÒר ÒØ ÐÐ Ñ Ö ØÓ¸ × Ó Ù Ó× Ñ ÒØ × ÙÒ Ð Ò ØÙÖ Ð Þ Ð ÓÔ Ö ÓÒ¸ Ð Ù Ð ÒÓ Ò × Ö Ñ ÒØ × ÓÖÖ ×ÔÓÒ ÓÒ Ð Óר Ö Ð Ò ÙÖ ÓÒº Ë Ð Óר Ò ÙÖ ÓÒ Ð i¹ × Ñ ÓÔ Ö ÓÒ × Øi¸ Ý i ×Ù Óר Ö ØÓ¸ ÒØÓÒ × Ö ÕÙ Ö ÑÓ× × Ø × Ö n n = i ≥ Ì(n) = Øi ´¿º¿¾µ i=1 i=1 Ô Ö Ù ÐÕÙ Ö × Ù Ò ÔÓ× Ð n ÓÔ Ö ÓÒ × ×Ó Ö Ð Ì Ó ×ØÖÙ ØÙÖ ØÓ׺ Ð Óר ÑÓÖØ Þ Ó Ð Ì Ó ×ØÖÙ ØÙÖ ØÓ× Ô Ö ÙÒ × Ù Ò n ÓÔ Ö ÓÒ × × n = i=1 i n ´¿º¿¿µ Ä × ÙÐ × Ð Ñ ×Ñ ÕÙ Ð ÜÔÖ × Ò ´¿º¿½µ¸ Ô ÖÓ ×ÙÑ Ò Ó ÕÙ Ð Óר ÑÓÖØ Þ Ó i × ÓÒר ÒØ Ô Ö ÓÔ Ö ÓÒ ´ÐÓ Ù Ð Ö ×ÙÐØÓ Ð ×Ó Ô Ö Ð Ì DynListStack<T>µº Ë Ò Ñ Ö Ó¸ Ð Ö ÞÓÒ Ñ ÒØÓ Ô Ö Ð × Ð ÓÒ Ð Ö ØÓ ÓÔ Ö ÓÒ¸ ÙÒÕÙ Ò×Ô Ö Ó Ò Ð ÔÓØ Ò Ð¸ ר ÔÖ ×Ø Ó Ð Ö ÓØ Ñ Ö¹ ÒØ к Ä × ÕÙ × ÑÔÖ Ö Ö ØÓ Ô Ö Óר Ö Ù ÐÕÙ Ö × Ù Ò ÓÔ Ö ÓÒº Ò ×Ø × ÒØ Ó¸ ÐÓ× Ö ØÓ× ÓÔ Ö ÓÒ Ò × Ð ÓÒ Ö× ÑÓ Ó Ø Ð ÕÙ ¬Ò Ò Ò ÓÒ Ö ØÓ× ÓØÖ ×º ÖØ Ñ Ò Ö ¸ Ð × Ò ÓÒ Ö ØÓ× ÔÙ ÒØ ÖÔÖ Ø Ö× ÓÑÓ ÙÒ ÙÒ ÓÒ ÔÓ¹ Ø Ò Ð × Ö Ø Ý ÔÓÖ Ô ÖØ × × ÙÒ Ð ÓÔ Ö ÓÒº ÈÓÖ ÑÔÐÓ¸ × Ò ÑÓ× Ð Ì ÜØ Ò Ó DynListStack<T> ÐÓ× × Ù ÒØ × Ö ØÓ× ÑÓÖØ Þ Ó× ÆÓÑ Ö ÓÔ Ö ÓÒ Ö ØÓ× push(item) 2 pop() 0 popn(n) 0 È Ö Ö Ò ÖÐ × ÒØ Ó Ð Ö ÞÓÒ Ñ ÒØÓ ÕÙ ÒÓ× ÓÒ Ù ×Ø × Ð ÓÒ Ö ØÓ׸ ¹ ÑÓ× Ó × ÖÚ Ö ÕÙ ÒÓ ÔÙ Ö ÙÒ pop() × ÒØ × ÒÓ Ù Ó ÙÒ push()º ר ÑÓ Ó¸ ÔÓ ÑÓ× Ö ÕÙ Ù Ò Ó × ØÙ ÙÒ push() × Ò Ó× ´2µ Ö ØÓ׸ ÙÒÓ ÓÖÖ ×ÔÓÒ¹ ÒØ Ð Óר Ò ÙÖ ÓÒ Ý ÓØÖÓ Ó Ò ÔÖ ×Ø ÑÓ Ó Ö ÒØ Ô Ö Óר Ö Ð ÙÖ ÓÒ ÜØÖ ÓÒ Ð Ð Ñ ÒØÓ Ù Ò Ó × ØÙ ×Ù pop()º ÈÙ ×ØÓ ÕÙ Ð × ÓÔ Ö ÓÒ × Ò × Ó Óר × ÔÓÖ Ð ÒØ Ó ÔÓÖ Ð push()¸ pop() Ý popn() ÒÓ Ø Ò Ò Ö ØÓ׸ ÔÙ × ×Ù× Óר × Ò × Ó ÑÓÖØ Þ Ó× ÔÓÖ Ð push()º ÓÒ ÐÓ× Óר × ÑÓÖØ Þ Ó× ÒØ Ö ÓÖ ×¸ ÔÓ ÑÓ× Ð ÙÐ Ö ÙÒ ÓØ Ô Ö Ð Óר ÑÓÖ¹ Ø Þ Ó Ð Ì DynListStack<T>¸ Ð Ù Ð ÒÓ Ü Ö 2n ≤ = 2 = O(1) n
  • 231.
    3.3. An´lisis amortizado a 205 Ð Ø ÖÑ ÒÓ Ö ØÓ ¸ ÔÖÓÚ Ò ÒØ Ð Ú Ö Ó Ð Ø ÒÓ Ö Ö ¸ × Ò ¬ Ö Ö¸ ÓÒ¬ Ö¸ Ö Ò ÙÒ Ô Ö×ÓÒ º ÌÖ ×Ø Ñ ÒØ ¸ ÓÝ Ò Ð ÑÙÒ Ó ÓÒÓÑ Ó ÑÔÐ Ð Ø ÖÑ ÒÓ Ö ØÓ Ô Ö Ö Ö Ö ÙÒ ÒØ Ò ÖÓ ÕÙ × ÓØÓÖ Ò ÔÖ ×Ø ÑÓ¸ ÓÑÓ × Ð ÔÖ ¹ ×ÙÒ ÓÒ ÙÒ Ù × Ù ÒØ ¬ Ð Ó¸ Ò Ò ÙÖ ¸ רÙÚ × Ú Ò ÙÐ Ð ÔÓ Ö ÓÒÓÑ Ó½ º Ð Ø ÖÑ ÒÓ ÑÓÖØ Þ Ö × Ù× Ò Ð ÑÙÒ Ó Ò Ö Ó Ý × × ÐÐ ÕÙ ÔÖÓÚ Ò Ð Ñ Ø ÓÖ ÓÒ ×Ø Ø ÔÓ Ò Ð × ×º ÙÖ Ó× Ñ ÒØ ¸ ÑÓÖØ Þ Ö ÔÖÓÚ Ò Ð Ö Ò ×¸ Р٠и ×Ù Ú Þ¸ ÔÖÓÚ Ò Ð Ð Ø Ò Ñ Ú Ð ÑÓÖØ Þ Ö º Ð ÔÖ ¬ Ó Ò ÔÖÓÜ Ñ ¸ Ñ ÒØÖ × ÕÙ ÑÓÖØ × × Ò ¬ ÑÙ ÖØ º ÑÓÖØ Þ Ö × Ò ¬ Ö ¸ ÒØÓÒ ×¸ Ð ÔÖÓÜ Ñ Ð ÑÙ ÖØ ¸ Ô ÖÓ Ð Ø ÖÑ ÒÓ × Ù× × Ð Å Ô Ö ÓÒÒÓØ Ö Ð ÔÖÓÜ Ñ Ð ÑÙ ÖØ ÙÒ Ù º 3.3.3 Selecci´n del potencial o cr´ditos o e È Ö ÕÙ ÙÒ Ò Ð × × ÑÓÖØ Þ Ó Ø Ò × ÒØ Ó¸ × × Ò Ð Ò ÓÒØÖ Ö ÙÒ Ù Ò ÙÒ ÓÒ ÔÓØ Ò Ð Ó ÐÓ Ö Ö ÒØ ÖÔÖ Ø Ö Ð × ÓÔ Ö ÓÒ × Ò ÙÒ ÓÒ ×Ù ØÖ Ó Ý Ð Ñ Ò Ö Ò ÕÙ ÐÐ × ÑÓÖØ Þ Ò Ó ÓÒ×ÙÑ Ò Ö ØÓ× ÒØÖ × º ÙÒ ÖØ ÓÖÑ ¸ Ð Ò Ð × × ÑÓÖØ Þ Ó × ×Ù Ø ÚÓ Ò Ð × ÒØ Ó ÕÙ Ð Ò Ð ÙÒ ÓÒ ÔÓØ Ò Ð Ð ×Ù Ø Ú × Ð Ì Ý ×Ù ×ØÖÙ ØÙÖ ØÓ׺ ׸ ÒØÓÒ ×¸ ÙÖ ÒØ Ð ×ØÙ Ó Ý × Ð ÓÒ Ð ÙÒ ÓÒ ÔÓØ Ò Ð ´Ó ÐÓ× Ö ØÓ× ÔÓÖ ÓÔ Ö ÓÒµ¸ Ù Ò Ó × ØÖ Ø Ò Ø Ð × ×Ù Ø Ú ×º ÈÓÖ ÐÓ Ò Ö Ð¸ Ð ÙÒ ÓÒ ÔÓØ Ò Ð ÔÓÒ Ö Ö Ð ×Ø Ó Ð ×ØÖÙ ØÙÖ ØÓ׺ Ò Ð ×Ó ÙÒ × Ù Ò ¸ Ð Ø Ñ ÒÓ ×¸ Ñ ÒÙ Ó¸ ÙÒ Ù Ò × Ó Ò º ÍÒ Ñ Ò Ö Ð Ø Ö Ð Ò Ð × × ÑÓÖØ Þ Ó ÙÒ ÓÔ Ö ÓÒ ÓÒ× ×Ø Ò Ú ÖÐ Ò Ø Ô × × Ù Ò Ð ×¸ Ò Ð Þ Ö ÙÒ ÔÓÖ × Ô Ö Ó Ý ÐÙ Ó ×ÙÑ ÖР׺ ËÙÔÓÒ ÑÓ× ÕÙ ÙÒ × Ù Ò ÓÔ Ö ÓÒ × Ý ÙÒ ÓÔ Ö ÓÒ ØÙ Ò Ð i¹ × Ñ Ú Þ ÓÒ Óר ÑÓÖ¹ Ø Þ Ó i ÒØÖ Ð ×Ø Ó Di−1 Ý Diº ÓÖ ×ÙÔÓÒ ÑÓ× ÕÙ Ð × Di−1 −→ Di ÔÙ Ú Ö× Ò Ð × × × D1, D2, . . . Dk¸ Ñ Ò Ö Ø Ð ÕÙ Di−1 = D0 Ý Di = Dkº Ë Øj Ð Óר Ô × Ö Ð ×Ø Ó Dj−1 Dj¸ ÒØÓÒ × k Øi = Øj ´¿º¿ µ j=1 Ë ÙÒ ´¿º¾ µ¸ Ð Óר ÑÓÖØ Þ Ó Øi ÔÙ ¬Ò Ö× ÓÑÓ k k j = (Øj +Φ(Dj) − Φ(Dj−1)) j=1 j=1 k = Øj + Φ(Dk) − Φ(D0) j=1 = Øi +Φ(Di) − Φ(Di−1) = i ´¿º¿ µ ½ Ð Ð ÙÐØ Ñ Ö Ú × ÓÒ ×Ø × Ö ØÓ¸ Ð ÔÖ Ñ Ó ÆÓ Ð Ð È Þ ¾¼¼ × Ó ÓÒ¹ Ö Ó Ð ÈÖÓ ×ÓÖ Ò Ð ÅÙ ÑÑ ÙÒÙ׸ ÙÒ ÓÖ Ð Ò Ó Ö Ñ Ò ´ Ò Ó ÖÙÖ Ðµº Ð ÒÓ Ò Ù ×Ø ÓÒ ÓÒ Ñ ÖÓ¹ Ö ØÓ× ÔÖ ×Ø Ø Ö Ó× ÑÙÝ ÔÓ Ö × Ñ Ø Ö ÐÑ ÒØ ¸ × Ò Ò Ò ÙÒ Ö ÒØ Ó Ö ØÓ ÓÒÓÑ ¸ Ô ÖÑ Ø Ò ÓÐ × ÓÒ ÖÓÒØ Ö ×Ù ÔÓ Ö Þ Ñ Ø Ö Ðº ÆÓ ×ÓÖÔÖ Ò ÒØ Ñ ÒØ ¸ Ð ¼± ÐÓ× ÔÖ ×Ø Ø Ö Ó× Ö ÒØ Ö Ò ÓÑÔÐ Ø Ñ ÒØ Ð ÔÖ ×Ø ÑÓ¸ ÙÒÕÙ ¸ Ø Ñ Ò¸ Ð ± ÐÓ× ÔÖ ×Ø Ø Ö Ó× ×ÓÒ ÑÙ Ö ×º
  • 232.
    206 Cap´ ıtulo 3. Cr´ ıtica de algoritmos ÈÓÖ Ø ÒØÓ¸ Ð Óר ÑÓÖØ Þ Ó Ð ÓÔ Ö ÓÒ × Ð ×ÙÑ ÐÓ× Óר × ÑÓÖØ Þ Ó× ×Ù× Ø Ô ×º Ñ × ÐÓ× ÓÒÓ Ñ ÒØÓ× ×Ó Ö Ð ×ØÖÙ ØÙÖ ØÓ× Ý Ð Ø Ò Ò Ð × ×¸ Ò Ð Ù×ÕÙ Ý × Ð ÓÒ ÙÒ ÙÒ ÓÒ ÔÓØ Ò Ð ÒØ ÖÚ Ò Ò Ð ÜÔ Ö Ò ¸ Ð ÖØ Ý Ð ×Ù ÖØ º 3.4 Correctitud de algoritmos Ù Ò Ó Ð ÑÓ× Ö Ð ÓÖÖ Ø ØÙ ÙÒ Ð ÓÖ ØÑÓ Ó ÔÖÓ Ö Ñ ¸ ÒÓ× Ö Ö ÑÓ× ÕÙ ×Ø ÐÓ Ö Ð ¬Ò Ô Ö Ð Ù Ð Ù ×Ø Ò Óº ÈÙ ×ØÓ ÓØÖÓ ÑÓ Ó¸ Ð ÓÖÖ Ø ØÙ ÓÒ ÖÒ ÐÓ ÕÙ Ð ÔÖ Ò Ô Ó ×Ø Ô ØÙÐÓ ÒÓÑ Ò ÑÓ× ¬ ¸ ÐÓ Ù Ð¸ Ò Ð ×Ó ÙÒ ÔÖÓ Ö Ñ ¸ ÕÙ Ú Ð Ö ÕÙ ×Ø ÒÓ ÖÖÓ Ñ Ð × Ö ×ÔÙ ×Ø ׺ Ñ ÒÙ Ó ×ØÓ ÒÓ × × Ò ÐÐÓ Ø ÖÑ Ò Ö ÔÓÖÕÙ ÒÓ × ×Ø ÕÙ Ð ÔÖÓ Ö Ñ ×Ø ÓÔ Ö Ø ÚÓ ÕÙ × ÔÙ Ú Ö ¬ Ö × × Ó ÒÓ ÓÖÖ ØÓº Ä ¬ ÕÙ ¸ Ö ÓÖ ÑÓ׸ ÒÓ × ÐÓ Ñ ×ÑÓ ÕÙ Ð ¬ Ò ¸ × ÙÞ ÔÓÖ ÓÑÔÐ Ø ØÙ Ý Ñ Ò Ñ Ð º ÈÓÖ ÓÑÔÐ Ø ØÙ ÑÓ× ÕÙ Ð ØÓ¸ Ó × Ð ¬Ò¸ × Ð Ò Ð¹ Ñ ÒØ º ÈÓÖ Ñ Ò Ñ Ð ÑÓ× ÕÙ ÒÓ × ØÙ Ð Ó ÓÒ Ð Ð ¬Ò ÐÓ ÕÙ Ò Ð Ð Ò Ù Ø ÒÓ Ö Ø Ó × ÒÓÑ Ò ØÓ ÓÐ Ø Ö Ð ÜÔÖ × ÓÒ ÕÙ ÓÑÙÒÑ ÒØ Ò ÕÙ Ð ÓÒ× Ù ÓÒ Ð ¬Ò ÖÖ ØÓ× ÓÒ Ð × ÕÙ Ö Ù ÒØ Ñ ÒØ ×ÓÒ Ò × Ð ×º Ð ÂÙÐ Ó ½ × Ð ÒÞÓ ÔÓÖ Ú Þ ÔÖ Ñ Ö Ð Ó Ø ÙÖÓÔ Ó Ö Ò º ÁÒÑ ØÓ Ð Ð ÒÞ Ñ ÒØÓ¸ Ð Ó Ø ÑÔ ÞÓ ×Ú Ö× ×Ù ØÖ Ý ØÓÖ Ú ÖØ Ð Ý Ó ×ØÖÙ Ö× ¼ × ÙÒ Ó× ×Ô٠׺ Ä × ÒÚ ×Ø ÓÒ × ÙÐØ Ö ÓÖ × Ö Ú Ð ÖÓÒ ÕÙ ÙÒ ÖÙØ Ò ØÖ Ø ÒÙÑ ÖÓ× Ò ÔÙÒØÓ ­ÓØ ÒØ ÓÑÓ × ÐÐÓ× ×ØÙÚ × Ò Ö ÔÖ × ÒØ Ó× Ò Ö ØÑ Ø ÒØ Ö º Ä Ú Ö× ÓÒ ÒØ Ö ÓÖ Ð Ó Ø ¸ Ö Ò ÑÒ ÒØ ÖÓ× Ý Ð ÖÙØ Ò Ò Ù ×Ø ÓÒ ÒÓ × Ú Ö ¬ Ó Ü Ùר Ú Ñ ÒØ Ô Ö Ð ÒÙ Ú Ú Ö× ÓÒ Ð Ó Ø º Ä ÖÙØ Ò Ö Ò ÓÖÖ Ø ½ ¸ ½¼ º 3.4.1 Planteamiento de una demostraci´n de correctitud o ÍÒ ÒØ ÖÔÖ Ø ÓÒ ÓÖÖ Ø ØÙ ×ØÖ Ò Ø ÖÑ Ò Ö × Ð ÔÖÓ Ö Ñ ÖÖÓ Ö ×ÔÙ ×Ø × ÓÖÖ Ø × Ô Ö ØÓ × Ð × ÒØÖ × ÔÓ× Ð ×º Ò ÙÒ ÓÒ ×ØÓ¸ ÔÙ ×ØÓ ÕÙ Ò Ð Ñ ÝÓÖ Ð × Ó × ÓÒ × ÐÓ× Ú ÐÓÖ × ÔÓ× Ð × ÒØÖ ×ÓÒ Ó ÑÙÝ Ö Ò × Ó Ò¬Ò ØÓ׸ ÙÒ ÔÖÙ ÓÖÖ Ø ØÙ Ö ÕÙ Ö Ð × ¬ Ö Ð ÒØÖ Ò ØÓ Ó× ÐÓ× ×Ù ÓÒ ÙÒØÓ× ÔÓ× Ð × ÕÙ ÓÒ ÓÖÑ Ò Ð ÒØÖ º ÄÓ ÒØ Ö ÓÖ ÔÙ ÔÐ ÒØ Ö× ÓÖÑ ÐÑ ÒØ ÓÑÓ × Ù º Ë I Ð ÓÒ ÙÒØÓ ÓÑ Ò Ó ÒØÖ ÙÒ ÔÖÓ Ö Ñ Ý R Ð ÓÒ ÙÒØÓ Ö ×ÙÐØ Óº ÒØÓÒ ×¸ ÙÒ ÔÖÙ ÓÖÖ Ø ¹ ØÙ Ü Ñ Ò Ö Ð Ð ÓÖ ØÑÓ Ý Ø ÖÑ Ò Ö Ò ÙÒ ÓÒ Ð Ñ ×ÑÓ ´ ÙÖ ÓÒ ×¸ Ð ÞÓ׸ Ø Ø Ö µ¸ ÐÓ× ×Ù ÓÒ ÙÒØÓ× ÒØÖ I = I1 ∪ I2 ∪ · · · ∪ In¸ ÙÒØÓ ÓÒ ×Ù× ×Ù ÓÒ ÙÒØÓ× × Ð R = R1, R2, . . . , Rnº ÆÓØ ÑÓ× ÕÙ ÐÓ× ×Ù ÓÒ ÙÒØÓ× Ö ×ÙÐØ Ó ÔÙ Ò ×ÓÐ Ô Ö× ÒØÖ × Ó × ÕÙ ÐÓ× Ö ×ÙÐØ Ó× ÒÓ Ø Ò Ò ÔÓÖ ÕÙ × Ö Ü ÐÙÝ ÒØ ׺ Ä ÔÖÙ ÓÖÖ Ø ØÙ ÓÒ× ×Ø ¸ ÒØÓÒ ×¸ Ò Ú Ö ¬ Ö × Ô Ö ×Ù ÓÒ ÙÒØÓ Ii Ð Ð ÓÖ ØÑÓ Ó ÔÖÓ Ö Ñ ÖÖÓ Ð × Ð Riº ÈÙ ×ØÓ ÕÙ Ñ ÒÙ Ó Ii Ý Ri ×ÓÒ ÑÙÝ Ö Ò × Ó Ò¬Ò ØÓ׸ Ð ÔÖÙ × Ö Ð Þ ÓÒ ÐÓ× Ú ÐÓÖ × ÖÓÒØ Ö ÐÓ× ×Ù ÓÒ ÙÒØÓ׺ ÈÓÖ ÑÔÐÓ¸ ÙÒ Ò×Ô ÓÒ Ñ × ÔÖÓ ÙÒ Ð ÓÖ Ò Ñ ÒØÓ ÔÓÖ × Ð ÓÒ ×ØÙ Ó Ò Ü ¿º½º¿ ´Ô Ò ½ ¾µ Ö Ú Ð ÕÙ Ð ÐÓÕÙ Ë Ñ Ò Ð Ò Ñ ÒÓÖ ÒØÖ · ½ Ý Ò ¹ ½ ½ ¿ × ÑÔÖ Ò Ù ÒØÖ Ð Ñ Ò ÑÓ ÒØÖ i+1 Ý n-1¸ ÔÙ × ØÓ Ó Ð Ö Ò Ó (i..n) × Ò×Ô ÓÒ Óº ÈÓÖ Ø ÒØÓ¸ Ë Ñ Ò Ð Ò Ñ ÒÓÖ ÒØÖ · ½ Ý Ò ¹ ½ ½ ¿ × ÓÖÖ ØÓº
  • 233.
    3.4. Correctitud dealgoritmos 207 ÈÓÖ ÓØÖ Ô ÖØ ¸ Ð for Ñ × ÜØ ÖÒÓ Ö ÓÖÖ ØÓ Ó Ð ÖÖ ÐÓ ÒØÖ [0..n − 1) ×ÓÐÓ ÐØ Ð ÙÐØ ÑÓ Ð Ñ ÒØÓ Ð ÖÖ ÐÓ Ð Ù Ð × Ö Ò×Ô ÓÒ Ó ÔÓÖ Ë Ñ Ò Ð Ò Ñ ÒÓÖ ÒØÖ · ½ Ý Ò ¹ ½ ½ ¿ º ÈÓÖ Ø ÒØÓ¸ ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ× Ð ÖÖ ÐÓ ×ÓÒ Ò×Ô ÓÒ Ó× Ô Ö Ø Ö¹ Ñ Ò Ö Ð Ñ Ò ÑÓº Ð Ð ÓÖ ØÑÓ Ô Ö × Ö¸ Ô٠׸ ÓÖÖ ØÓº Ð ÓÒ ÙÒØÓ ÒØÖ Ù I = {ÌÓ × Ð × Ô ÖÑÙØ ÓÒ × ÔÓ× Ð ×} Ý Ð ×Ð R = {ÌÓ × Ð × Ô ÖÑÙØ ÓÒ × ÓÖ Ò ×}º 3.4.2 Tipos de errores ÍÒ ÖÖÓÖ Ò ÙÒ ÔÖÓ Ö Ñ ÔÙ ÓÑ Ø Ö× ÙÖ ÒØ Ð × × Ù ÒØ × × × Dise˜o: ÔÖ Ñ × × Ò ÓÖÖ Ø ×¸ ×ÙÑ × ÙÖ ÒØ Ð × ÒÓ n ÙÒ Ð ÓÖ ØÑÓ¸ ÑÙÝ ÔÓ× Ð ¹ Ñ ÒØ ÓÒ ÙÞ Ò Ö ×ÙÐØ Ó× Ò ÓÖÖ ØÓ׺ Prueba de correctitud del algoritmo: Ú × Ð ÓÖÖ Ø ØÙ ÙÒ Ð ÓÖ ØÑÓ ÒÓ × × Ò ÐÐ ÑÓ×ØÖ Öº Ò ×Ø × ÒØ Ó Ý Ó× Ð × × Ò Ö Ð × ÖÖÓÖ × Ò Ð ÔÖÙ ½º ÉÙ Ð × Òר Ò × ÔÓ× Ð × ÒØÖ ÒÓ ×Ø Ò ÓÑÔÐ Ø Ñ ÒØ Ù ÖØ ׸ ×Ó Ò Ð Ù Ð ÒÓ × × Ö × Ð Ð ÓÖ ØÑÓ × ÓÖÖ ØÓ Ó ÒÓ Ô Ö Ð Ð × ÒØÖ Ù× ÒØ º ¾º ÉÙ Ð ÙÒ Ó Ñ × Ð × ÔÖÙ × ×Ø ÖÖ º ÈÓ× Ð Ñ ÒØ ¸ ÐÓ× ÖÖÓÖ × Ò Ð ÔÖÙ ÓÖÖ Ø ØÙ ×ÓÒ ÐÓ× Ñ × × Ö Ó׸ ÔÙ × Ò Ù Ò ÐÓ ÕÙ × ÒÓÑ Ò ÓÑÓ Ð× Ô Ö Ô ÓÒ Ð Ð ÓÖ ØÑÓ ÔÓ Ö Ó ÒÓ ×Ø Ö ÓÖÖ ØÓ¸ Ô ÖÓ ¬ÖÑ ÑÓ׸ × Ò ÖØ ØÙ ¸ ÕÙ ÐÓ ×º Codificaci´n: ÐÓ× Ð ÓÖ ØÑÓ× o Ò ØÖ Ù Ö× ÙÒ Ð Ò Ù ÔÖÓ Ö Ñ ÓÒº ר × × ÐÐ Ñ Ó ¬ ÓÒ Ý ÙÖ ÒØ ÐÐ × × Ó Ò Ð × Ö ÔÖ × ÒØ ÓÒ × ÐÓ× ØÓ× Ó Ð ÓÖÑ ×ØÖÙ ØÙÖ ØÓ׸ × ÓÑÓ Ð × Ö ÔÖ × ÒØ ÓÒ × Ð × × Ù Ò × Ù ÓÒ Ð Ð ÓÖ ØÑÓ × ÙÒ ÐÓ× ÑÓ ÐÓ× Ð Ð Ò Ù ´Û Ð ¸ ÓÖ¸ ¸ Ø Ø Ö µº Ejecuci´n y falla de programas de verificaci´n: ÓÑÓ Ñ Ò ÓÒ Ö ÑÓ× ÔÓר Ö ÓÖ¹ o o Ñ ÒØ ¸ Ô Ö Ú ÐÙ Ö ÓÖÖ Ø ØÙ × ÑÔÐ Ò Ú Ö×Ó× Ø ÔÓ× ÔÖÓ Ö Ñ ×º Ò ×Ø × ÒØ Ó¸ ÙÒ Ù ÖØ Ð × ÖÖÓÖ ÔÙ Ò Ù Ö× ÔÓÖ Ð Ó ÕÙ ÙÒÓ ÐÓ× ÔÖÓ Ö Ñ × Ù× Ó× Ô Ö Ú Ö ¬ Ö ÓÖÖ Ø ØÙ × Ò ÓÖÖ ØÓº ÒØ ר × Ô Ö×Ô Ø Ú × Ð ÓÖÖ Ø ØÙ ¸ ÙÒ Ó Ð Ó ÕÙ ×Ø Ò × × ÔÖ Ò ÙÒ Ó× ÙØ Ð ÔÖÓ Ö Ñ Ý × Ö ×Ù ÐÚ Ð ÔÖÓ Ð Ñ ¸ ÙÒ ÔÖÓ Ö Ñ ÓÖ ¸ Ô ÖÑ ¹ Ò ÒØ Ñ ÒØ ¸ ×ÙÑ Ö ÙÒ Ø ØÙ Ù Ö ×Ô ØÓ Ð ÓÖÖ Ø ØÙ º 3.4.3 Prevenci´n y detecci´n de errores o o À Ý Ó× Ò ÓÕÙ × ÓÑÔÐ Ñ ÒØ Ö Ó× ÒØÖ × Ô Ö Ð Ö ÓÒ Ð ÓÖÖ Ø ØÙ ÙÒ ÔÖÓ Ö Ñ ½º ÈÖ Ú Ò ÓÒ ÓÑÓ Ú Ø Ö ÓÑ Ø Ö ÙÒ ÖÖÓÖ ¾º Ø ÓÒ ÓÑÓ Ø Ø ÖÐÓ ÐÓ Ñ × ÔÖÓÒØÓ ÔÓ× Ð
  • 234.
    208 Cap´ ıtulo 3. Cr´ ıtica de algoritmos Ä ÔÖ Ú Ò ÓÒ Ö ÕÙ Ö ÙÒ Ø ØÙ Ö Ø ÔÓÖ Ô ÖØ Ð ÔÖÓ Ö Ñ ÓÖ Ò Ð × ÒØ Ó ÕÙ ÔÖ Ò ×Ù× ÖÖÓÖ × Ý Ù×ÕÙ Ñ Ò Ö × ÒÓ ÚÓÐÚ Ö ÓÑ Ø ÖÐÓ׺ Ä Ò ÓÖÖ Ø ØÙ × ÑÔÖ × ÓרÓ× Ò Ð × ÒØ Ó ÕÙ Ð ÙÒ Ñ Ò Ö ÖÖ Ô Ö × Ô ÖÓ Ý × ØÙ ÓÒ × Ò Ð × Ù Ð × × Ñ × Ó ÓרÓ× º ÈÓÖ ÑÔÐÓ¸ ÙÒ ÐÐ Ò ÙÒ ÔÖÓ Ö Ñ ÓÒØÖÓÐ ÓÖ ÙØ Ò Ó× Ò ÙÒ ÓÑÔÙØ ÓÖ Ò Ù×ØÖ Ð ÔÙ Ù× Ö ÙÒ ÔÖ ÔÐ ÒØ ÕÙ Ø Ò Ð Ò ÔÖÓ Ù Ø Ú Ñ × ÓרÓ×Ó × ÙÒ ÐÐ Ò ÙÒ ÔÖÓ Ö Ñ Ñ × ÓÒ Ö Ø ÙÒ × Ø Ð Ø ¸ ÔÓÖ ÑÔÐÓº Ä Ø ÓÒ ÓÖÞÓ× Ñ ÒØ Ö ÕÙ Ö ÙÒ Ò Ð × × Ò×Ô Ø ÚÓ Ð Ð ÓÖ ØÑÓ Ó ÔÖÓ¹ Ö Ñ º Ù Ò Ó Ð Ò Ð × × × Ö Ð Þ × Ò ÙØ Ö Ð ÔÖÓ Ö Ñ Ò Ù ×Ø ÓÒ¸ × Ð ÒÓ¹ Ñ Ò ×Ø Ø Ó º Ò ÐÓ Ñ ÒØ ¸ Ù Ò Ó Ð Ò Ð × × × Ú Ð Ð Ù ÓÒ Ð ÔÖÓ Ö Ñ × Ð ÐÐ Ñ Ò Ñ Ó º Ð ÔÖ ÙÒØ Ù Ð × Ñ ÓÖ Ä Ö ×ÔÙ ×Ø × ÕÙ Ù ÒØÓ ÒØ × × Ø Ø ÙÒ ÖÖÓÖ Ñ ÒÓ× ÓרÓ×Ó ×Ø ׺ ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ô Ö Ó Ð ØÓÖ Ó ØÙ Ö Ò Ð × × ×Ø Ø Ó ÒØ × ÒרÖÙÑ ÒØ Ö ÙÒ ÔÖÓ Ö Ñ º È Ö ÔÖÓÜ Ñ Ö Ð ÒØ Ò Ñ ÒØÓ ×Ø ×ÙÒØÓ¸ ÓÒ× Ö ÑÓ× Ð × Ù ÒØ Ö ¬ Costo de corrección de un error Producción Pruebas Codificación Diseño estructura Tiempo de desarrollo de un sistema de código Diseño arquitectural Requerimientos Ä Ö ¬ Ô ØÓÖ Þ Ð × Ö ÒØ × Ø Ô × Ð ÐÐ Ñ Ó ÐÓ × ÖÖÓÐÐÓ ×Ó ØÛ Ö º ÙÖ ÒØ Ð × ØÖ × ÔÖ Ñ Ö × × × × Ù Ò Ó × ØÓÑ Ò × ÓÒ × × ÒÓ Ð ÓÖ ØÑÓ× Ý Ñ Ò ×ÑÓ× × ×Ø Ñ ¸ Ñ ÒØÖ × ÕÙ ÙÖ ÒØ Ð × ØÖ × Ö ×Ø ÒØ × × Ù Ò Ó Ø Ô Ñ ÒØ × Ø Ø Ò ÐÓ× ÖÖÓÖ ×¸ × Ò Ó ÐÓ× × ÒÓ ÐÓ× Ñ × ÓרÓ×Ó׺ ÈÓ ÑÓ× Ö ÕÙ Ð Óר ÙÒ ÖÖÓÖ Ý ×Ù ÓÖÖ ÓÒ × Ö Ø Ñ ÒØ ÔÖÓÔÓÖ ÓÒ Ð Ð ÑÓÑ ÒØÓ Ò ÕÙ × Ø Ø º ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ñ ÒØÖ × Ñ × Ø Ö × Ø Ø ÙÒ ÖÖÓÖ¸ Ñ × ÑÔ ØÓ Ò Óר × ×Ø Ø Òº Ð Ö ­ Ü ÓÒ ÒØ Ö ÓÖ × ×ÔÖ Ò Ö ÙÒ Ù ÖØ × ÒØ Ó ÔÖ Ù ÓÒ ÕÙ × ×ÙÑ Ö ÙÖ ÒØ Ð × ØÖ × ÔÖ Ñ Ö × Ø Ô × Ð ÐÓ × ÖÖÓÐÐÓº Ð ÔÖÓ Ð Ñ × Ó¸ Ý ×Ø × Ð ØÖ ÑÔ Ð ÕÙ ×Ù ÙÑ Ò ÑÙ Ó× Ò Ò ÖÓ× Ý ÔÖÓ Ö Ñ ÓÖ ×¸ × ÕÙ ¸ Ù Ò Ó × Ö Ð Þ ÙÒ ÒÙ ÚÓ × ×Ø Ñ Ý × ØÓÑ Ò × ÓÒ × × ÒÓ¸ ÒÓ × ÓÒÓ Ò Ù Ð × × Ö Ò ×Ù× ÓÒ × Ò ¬ Ý ¬ Ò º ÓÖ Ò¸ ÑÙ × Ú × × Ò Ð ØÖ ÑÔ ØÓÑ Ö × ÓÒ × × ÒÓ × Ò ÓÒÓ Ö ÔÖ ÓÖ ×Ù× ÓÒ ×º ÓÒ× Ù ÒØ Ñ ÒØ ¸ ÑÙ × Ú × × Ò Ù ÒØÖ Ò ÖÖÓÖ × × ÒÓ¸ ÕÙ ×ÓÒ ÐÓ× Ñ × ÓרÓ×Ó׸ ÙÖ ÒØ Ð × ÒרÖÙÑ ÒØ ÓÒº ÓÑÓ × ÔÙ ×Ñ ÒÙ Ö ×Ø Ö × Ó Ä Ö ×ÔÙ ×Ø × Ö Ð Þ Ò Ó
  • 235.
    3.4. Correctitud dealgoritmos 209 ÑÓ ÐÓ× × ÒÓ Ý Ú Ö ¬ Ò ÓÐÓ× ÒØ × ×Ù ÑÔÐ Ñ ÒØ ÓÒ ÓÑÓ × ÓרÙÑ Ö Ö Ò ÓØÖ × Ö Ñ × Ð Ò Ò Ö º 3.4.3.1 Disciplina de programaci´n o Ù Ò × ×ÓÒ Ð × ÓרÙÑ Ö ×¸ Ù Ò × Ò × Ö Ð × Ó Ö ×º ÍÒ ÓרÙÑ Ö × ÙÒ ØÓ ÕÙ Ö Ó ÓÒÓ Ñ ÒØÓ× ÔÖ Ø Ó׸ ÓÑÔÖÓ Ó׸ × Ù ÖØÓ× ÙÖ ÒØ ÙÖ × Ù Ò × Ó Ö ×º Ò ÔÖÓ Ö Ñ ÓÒ¸ ÓÑÓ Ò Ù ÐÕÙ Ö ÓØÖ ÔÖ Ø ¸ ÐÓ× ÔÖ Ø ÒØ × ÓÖ Ò ÓרÙÑ Ö ×¸ Ù Ò × ÓרÙÑ Ö ×¸ ÔÓÖÕÙ × ÒÓ × Ð × ÑÓÖ Ö Ð ÔÖ Ø º Ù Ò Ó ÙÒ Ó×¹ ØÙÑ Ö Ú Ò ÓÑÙÒ ÒØÖ ØÓ Ó× ´Ó Ð Ñ ÝÓÖ Ô ÖØ µ ÐÓ× ÔÖ Ø ÒØ ׸ ÒØÓÒ × ×Ø Ú Ò Ò ÒÓÖÑ º Ä Ó × ÖÚ Ò ÙÒ ÓרÙÑ Ö ¸ Ñ × ÙÒ ÙÒ ÒÓÖÑ ¸ Ö ÕÙ Ö ¸ × ÙÒ × × ÔÖ Ò Þ Ó Ñ ×ØÖÓ¸ ÙÒ × Ù ÖÞÓ ÓÒ× ÒØ ÚÓÐÙÒØ ÔÓÖ Ö ÓÖ Ö ÔÐ Ö Ð ÒÓÖÑ Ý ÙÒ Ù ÖÞ Ö Ø Ö ÔÓÖ ÒÓ ØÖ Ò× Ö ÖÐ º ר × Ù ÖÞÓ Ý Ù ÖÞ × Ð ÒÓÑ Ò × ÔÐ Ò º ÀÓÝ Ò Ð × Ù Ò × ÓרÙÑ Ö × × Ð × ÐÐ Ñ Ù Ò × ÔÖ Ø × Ô ÖÓ Ð Ö ¹ ÙÒ Ò ×Ø Ð ¬ Ø ÚÓ ÔÐ ÒØ ÙÒ Ñ Ù ÓÒ Ð ÒÓ ÓÒ ÔÖ Ø ¸ Ö ÞÓÒ ÔÓÖ Ð Ù Ð × Ù Ö ÑÓ× Ù× Ò Ó ÓרÙÑ Ö Ó¸ Ù Ò Ó ×Ø × Ó Ø Ú ÒØÖ ÐÓ× ÔÖ Ø ¹ ÒØ ׸ ÒÓÖÑ º Ù Ð × ×ÓÒ Ð × ÓרÙÑ Ö × ÔÖÓ Ö Ñ ÓÒ ÕÙ ×Ù Ý Ò ØÖ × ÔÖÓ Ö Ñ × ÓÖ¹ Ö ØÓ× ÆÙÑ ÖÓ×Ó׸ ÚÓÐÙÑ ÒÓ×Ó× ÒØ Ö × ÒØ × Ø ÜØÓ× Ò × Ó × Ö ØÓ× ×Ó Ö ×Ø ×ÙÒØÓº ÆÓ ݸ Ô٠׸ ×Ô Ó Ò ×Ø ×Ù ¹× ÓÒ Ô Ö ÔÖ × ÒØ Ö Ý × ÙØ Ö ØÓ Ó ÐÓ Ò Ö ÒØ Ð × ÔÐ Ò ÔÖÓ Ö Ñ ÓÒº È ÖÓ × ÔÓ ÑÓ׸ Ö Ñ Ø ÖÒÓ× Ð × Ù ÒØ ÐÓ Ó Ö¹ Ö ÀÓÐØÞÑ ÒÒ ½½ Ô Ö Ð × Ö ØÙÖ ÔÖÓ Ö Ñ × ÓÖÖ ØÓ× Ö Ø Ó׺ Dec´logo de Holtzmann a ½º ÆÓ Ù× Ö goto¸ longjmp Ó Ö ÙÖ× ÓÒ Ö Ø Ó Ò Ö Ø º Ë ÐÚÓ Ð ÙÒ × Ü Ô ÓÒ × Ô ÖØ ÙÐ Ö ×¸ Ð ÒרÖÙ ÓÒ goto × Ó ÓÐ × ÙÒ × Ù ÒØ × × ÔÓÖÕÙ Ú ÓÒØÖ Ð Ð Ð Ó Óº Ò Ò ÙÖ ¸ ÐÓ× Ò Ð Þ ÓÖ × ×Ø Ø Ó× Ø Ò Ò × Ö × ¬ ÙÐØ × Ô Ö ÒØ ÖÔÖ Ø Ö ÕÙ ×Ù ÓÒ ÙÒ gotoº ÄÓ Ñ ×ÑÓ Ó ÙÖÖ ÓÒ Ð ÓÒ ÙÒØÓ ÒרÖÙ ÓÒ × longjmp Ð Ð ÓØ ר Ò Ö Cº ÊÙØ Ò × Ö ÙÖ× Ú ×¸ Ö Ø Ó Ò Ö Ø Ñ ÒØ ¸ ×ÓÒ Ø Ñ Ò ÑÙÝ Ð× Ò ÐÞ Ö ÔÓÖ Ò Ð Þ ÓÖ × ×Ø Ø Ó׺ Ò Ò ÙÖ ¸ Ð Ö ÙÖ× ÓÒ Ù× ÑÔÐ Ø Ñ ÒØ Ð Ô Ð Ð × ×Ø Ñ ¸ ÙÝ ×Ø ÓÒ × Ð ÓØ Öº À ݸ ÔÓÖ ×ÙÔÙ ×ØÓ¸ Ü Ô ÓÒ ×º ÅÙÝ Ò Ô ÖØ ÙÐ Ö¸ Ò ×Ø Ø ÜØÓ¸ ÓÒ Ð Ö ÙÖ× ÓÒ Ö Ø º Ò × × ÒØ Ó¸ ÔÓ ÑÓ× Ö ÕÙ ×ÓÐÓ ÙØ Ð Þ Ö Ö ÙÖ× ÓÒ Ô Ö ÙÒ ÓÒ × ÙÝ ÓÖÖ Ø ØÙ Ý × Ó ÑÓ×ØÖ Ý ÙÝÓ ÓÒ×ÙÑÓ Ô Ð × Ö ÒØ ר Ö ÓØ Óº Ò ×Ó× ×Ó׸ Ð ÙÒ ÓÒ Ö ÙÖ× Ú ÔÙ ×Ù ×Ø ØÙ Ö× ÔÓÖ ÙÒ ØÖÓÒ Ó Ó Ò Ö× ÙÒ Ò Ð Þ ÓÖ ÕÙ Ð ÙÒ ÓÒ Ò Ù ×Ø ÓÒ × ÓÖÖ Ø º ¾º Ë ÑÔÖ × ÙÖ Ö ÕÙ ØÓ Ó Ð ÞÓ Ø ÖÑ Ò º Ù ÒØ × Ú × ÒÓ ÑÓ× ÙØ Ó ÙÒ ÔÖÓ Ö Ñ ÕÙ ÒÓ Ø ÖÑ Ò Ò Ð ×Ó Ò Ö Ð¸ ÐÓ× ÔÖÓ Ö Ñ × ÒÓ Ø ÖÑ Ò Ò ¹ Ù Ò Ó ×Ø Ò × Ò Ó× Ô Ö Ø ÖÑ Ò Ö¹ ÔÓÖÕÙ Ò Ò
  • 236.
    210 Cap´ ıtulo 3. Cr´ ıtica de algoritmos Ð ÞÓ× Ø ÖÒÓ×½ º Ä Ö Ð ÓÒ× ×Ø ¸ ÒØÓÒ ×¸ Ò Ú Ò Ö Ö ÒØ ÕÙ Ð ÞÓ Ð ÔÖÓ¹ Ö Ñ ´while¸ do-while¸ Ó forµ Ø ÖÑ Ò º Ú Þ ÕÙ × ÔÖÓ Ö Ñ ÙÒ Ð ÞÓ ÔÖ ÙÒØ × Ý Ö ×ÔÓÒ × ÓÑÓ × × ÙÖ ÕÙ ×Ø × ÑÔÖ Ø ÖÑ Ò º Ä ÙÒ Ü Ô ÓÒ ×Ø Ö Ð × Ù Ò Ó × × Ö ÙÒ Ð ÞÓ ÕÙ Ñ × Ø ÖÑ Ò Öº ÆÓÖÑ ÐÑ ÒØ ×ØÓ Ó ÙÖÖ Ò ÔÖÓ Ö Ñ × Ø Ö Ø ÚÓ× ÔÓÖ ÑÔÐÓ¸ ÙÒ × ÖÚ ÓÖº Ò ×Ø ×Ó¸ Ð Ö Ð × × ÙÖ Ö ÕÙ ¸ Ò ØÓ¸ Ð Ð ÞÓ ÒÙÒ Ø ÖÑ Ò º ¿º ÆÓ ÙØ Ð Þ Ö Ñ ÑÓÖ Ò Ñ ×ÔÙ × Ö Ò Ð Þ Ó Ð ÔÖÓ Ö Ñ º Ò Ð ×Ô Ö ØÙ ר Ø ÜØÓ¸ Ð Ö Ð × independizar toda abstracci´n delo uso de memoria din´micaº a Ò ÓØÖ × Ô Ð Ö ×¸ Ù ÐÕÙ Ö Ð ÓÖ ØÑÓ Ó ×ØÖÙ ¹ ØÙÖ ØÓ× ÓÒ Ö× × Ò Ô Ò Ò Ò Ñ ÑÓÖ Ò Ñ º ÈÓÖ Ñ ÑÓÖ Ò Ñ ÒØ Ò ÑÓ× ÐÐ Ñ × malloc()/free()¸ new/delete¸ sbrk()¸ alloca() ݸ Ò Ò Ö Ð¸ Ù ÐÕÙ Ö ÓØÖ ÔÖ Ñ Ø Ú Ñ Ò Ó Ñ ÑÓ¹ Ö º ÈÓÖ Ò Ð Þ ÓÒ ÒØ Ò ÑÓ× Ð ÔÖ Ñ Ö × ÙÒ ÔÖÓ Ö Ñ Ò Ð Ù Ð × Ð Ö Ò Ð × ×ØÖÙ ØÙÖ × ØÓ× Ý Ñ × Ð × × Ú Ö Ð × Ý × Ð × × Ò Ò ×Ù× Ú ÐÓÖ × ÔÖ Ñ Ò Ó׺ Ä Ö ÞÓÒ × Ö ×Ø Ö Ð × Ó Ð º Ò ÔÖ Ñ Ö ÐÙ Ö¸ Ð ÒÑ Ò× Ñ ÝÓÖ Ñ Ò¹ ×ÑÓ× Ñ Ò ×ØÖ ÓÒ Ñ ÑÓÖ ÒÓ Ó Ö Ò ÓØ × ÓÒר ÒØ × ×Ó Ö Ð Ø ÑÔÓ Ù ÓÒº Ñ ÕÙ × ×Ø ÓÒ Ñ × Ñ ÑÓÖ ¸ Ñ × Ö Ñ ÒØ ÓÒ Ó ÙÖÖ Ò Ð ×Ô Ó Ö ÓÒ Ñ ÒØÓ¸ ÐÓ ÕÙ Ö Ð × ÑÔ ÒÓ Ý Ð ÔÖÓ Ð Ü ØÓ Ö × ÖÚ ÓÒº ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ñ ÒØÖ × Ñ × ÙÖ ÙÒ ÔÖÓ Ö Ñ ¸ Ñ × ÔÖÓ Ð × ÕÙ Ð Ö × ÖÚ ÓÒ ÙÒ ÐÓÕÙ Ñ ÑÓÖ ÐÐ º ר Ù ÒØ ÔÓØ Ò Ð ÐÐ ÑÔÓ× Ð Ó Ö Ö ÙÒ Ö ÒØ ÓÖÖ Ø ØÙ ´ × Ð Ô Ö×Ô Ø Ú Ñ Ò Ó Ñ ÑÓÖ µº Ò × ÙÒ Ó ÐÙ Ö¸ Ð Ñ Ò Ó Ñ ÑÓÖ × ÓÖ Ò ÙÒ Ö Ò ÔÖÓÔÓÖ ÓÒ ÖÖÓÖ ×¸ Ö ÞÓÒ ÔÓÖ Ð Ù Ð ÙÒ ÓÖÑ Ú Ö ×Ø ÔÓØ Ò Ð ÖÖÓÖ ÓÒ× ×Ø ¸ × ÑÔÐ Ñ ÒØ ¸ Ò ÒÓ Ù× Ö Ñ ÑÓÖ Ò Ñ º Ç × ÖÚ ÑÓ× ÕÙ Ð Ù×Ó ÙÒ Ö ÓÐ ØÓÖ ×ÙÖ ´ Ö ÓÐÐ ØÓÖµ ÒÓ Ú ×Ø ÔÖ Ò Ô Ó¸ × ÒÓ ÕÙ Ñ × ÐÓ Ò Ùר ¬ ¸ ÔÙ × Ð ×Ø ÓÒ Ñ ÑÓÖ × ×Ó Ö ÙÒ Ö ÓÐ ØÓÖ Ü ÑÙ Ñ × Ò ÖØ ÙÑ Ö Ý Ø Ò Ñ ÒÓ× × ÑÔ ÒÓ ÕÙ ÙÒ Ñ Ò ÓÖ ØÖ ÓÒ Ðº ÄÓ× ÖÖÓÖ × Ñ Ò Ó Ñ ÑÓÖ × Ö Ò Ö Ú Ñ ÒØ ØÖ Ø Ó× Ò Ü ¿º º¿º¿ ´Ô Ò ¾¾½µº ÈÖÓ Ö Ñ × × Ò Ó× Ô Ö Ô ÖØ Ö ×Ù× Ö ÙÖ×Ó× ÓÑÔÙØ ÓÒ Ð × ÙÖ ÒØ ×Ù Ò Ð¹ Þ ÓÒ ÒÓ ×ÓÐÓ ×ÓÒ Ñ × Ð × × ÙÖ Ö ÓÖÖ Ø ØÙ ¸ × ÒÓ ÕÙ Ø Ò Ò Ü Ö Ñ × × ÑÔ ÒÓº Ò ÙÒ ÓÒ ×Ø Ö Ð ¸ ÒÓ× ×Ø Ú Ó Ð Ù×Ó Ñ ÑÓÖ Ò Ñ Ä Ö ×¹ ÔÙ ×Ø × Ö Ð Ø Ú º ÆÓØ ÑÓ׸ Ò ÔÖ Ñ Ö ÐÙ Ö¸ ÕÙ ÐÓ× × ÒÓ× Ð ÓÖ ØÑÓ× Ý ×¹ ØÖÙ ØÙÖ × ØÓ× ÕÙ ØÖ Ø ÑÓ× Ò ×Ø Ø ÜØÓ × Ó Ò¸ Ò ×Ù Ñ ÝÓÖ ¸ ר Ö Ð º Ó¸ ר Ð ÔÖ × ÒØ ÑÓ× ÔÐ Ó Ð ÔÖ Ò Ô Ó ¬Ò¹ ¹¬Ò ÔÖ × ÒØ Ó Ò ½º º¾¸ ÙÝ Ó × ÖÚ Ò ÓÒ Ù ÔÖ Ñ ÖÓ ×ØÖ Ö × Ò ÓÒ× Ö Ö Ð Ñ Ò Ó Ñ ÑÓÖ ½ Ñ ÒÙ Ó¸ Ð ÜÔÖ × ÓÒ × Ð ÞÓ Ò¬Ò ØÓ º Ë Ò Ñ Ö Ó¸ Ò Ñ Ø Ñ Ø ¸ × ÓÑÓ Ò ÓØÖÓ× ÓÑ Ò Ó׸ Ð Ø ÚÓ Ò¬Ò ØÓ × Ù× Ò Ð × ÒØ Ó ÔÖÓÔÓÖ ÓÒ × ÒØ Ó Ô Ö Ð Ù Ð¸ Ò Ð ÓÔ Ò ÓÒ ×Ø ×Ù × Ö ÔØÓÖ¸ ÒÓ Ò Ð Ø ÑÔÓº È Ö Ð Ø ÑÔÓ Ò × Ü ×Ø Ð Ø ÚÓ Ø ÖÒÓ º
  • 237.
    3.4. Correctitud dealgoritmos 211 ÓÑÓ Ò ØÓ ÐÓ ÑÓ× Ó Ý Ö ÑÓ× ØÖ Ú × ×Ø Ø ÜØÓº ÄÓ× Ì Ô Ò¹ ÒØ × Ñ ÑÓÖ ´ ÓÒ ÔÖ ¬ Ó Ò ÒÓÑ Ö Ð × ÝÒ µ¸ Ö Ú Ò ÙÒ Ú Ö× ÓÒ Ò Ô Ò ÒØ Ð Ñ Ò Ó Ñ ÑÓÖ º Ü ×Ø Ò ÔÖÓ Ð Ñ × ÙÝ × ×ÓÐÙ ÓÒ × ×ÓÒ Ð Ö × Ò ÙÖ ÓÒ Ý Ô Ö ÐÓ× Ù Ð × × Ò ÐÙ Ð Ð Ñ Ò Ó Ñ ÑÓÖ º Ò ×Ø Ð × ÔÖÓ Ð Ñ × Ò Ò ÐÓ× Ö Ó× Ý ÓØÖ × Ð × × ÔÐ ÓÒ ×º º Å Ü ÑÓ ¼ Ð Ò × ÔÓÖ ÖÙØ Ò º Ä Ú × ÓÒ Ý ÓÑÔÖ Ò× ÓÒ ÙÑ Ò ÙÒ ÖÙØ Ò ÓÑÓ ÙÒ ÙÒ ÔÖÓ Ö Ñ × Ö Ñ Ø ÐÓ Ú × Ð Ò ÙÒ Ó Ô Ô Ð Ó × ¸ ÔÖÓÜ Ñ Ñ ÒØ ¼ Ð Ò ×º ÊÙØ Ò × ÕÙ Ü Ò ×Ø ÐÓÒ ØÙ × Ö Ñ ÒØ Ò Ò Ú Ö × Ó × ´Ó Ô ÒØ ÐÐ ×µ ݸ ÔÓÖ ×ÙÔÙ ×ØÓ¸ Ø Ò Ò Ñ × ÔÖÓ Ð Ö Ñ ÒØ Ö Ð ÓÑÔÖ Ò× ÓÒº º Å Ò ÑÓ Ó× ÒÚ Ö ÒØ × ´Ó × ÖØÓ×µ ÔÓÖ ÙÒ ÓÒº ÍÒ ÒÚ Ö ÒØ × ÙÒ ÓÒ ÓÒ ÕÙ × ÑÔÖ Ö ÙÑÔÐ Ö× º ËÙ Ò ÙÑÔРѹ ÒØÓ ÒÓØ Ö ¸ ÒØÓÒ ×¸ ÙÒ ÖÖÓÖº Ä × ×Ø ר × Ò Ù×ØÖ Ð × ÔÖÙ ÔÖÓ Ö Ñ × Ò Ò Ó ÙÖÖ Ò ÖÖÓÖ ÒØÖ ½¼ Ý ½¼¼ Ð Ò × Ó Óº ÈÓÖ Ø ÒØÓ¸ Ð Ù×Ó ÒÚ Ö ÒØ × ÓÑÓ ÔÖ ÓÒ ÓÒ ×¸ ÔÓר ÓÒ ÓÒ × ÒÚ Ö ÒØ × ÕÙ × Ò Ñ ÒØ Ò Ö Ò Ð ÞÓ׸ ÙÒ Ó Ð Ö Ð ÒÑ Ø Ñ ÒØ ÒØ Ö ÓÖ¸ ÚÓÖ Ö Ð Ð Ð Ó Ó ÔÓÖ ×Ñ ÒÙ ÓÒ Ð × ÔÖÓ Ð × Ó ÙÖÖ Ò ÖÖÓÖ Ý ÙÑ ÒØÓ ×Ù Ø ÓÒº Ä × ÒÚ Ö ÒØ × ÒÓ Ø Ò Ð ØÓ ÙÒ ÖÙØ Ò ¸ ÙÒÕÙ × ×Ù × ÑÔ ÒÓº ÈÓÖ ×Ø Ö ÞÓÒ¸ Ñ Ò ×ÑÓ× ÒÚ Ö ÒØ × ÔÙ Ò × Ð Ø Ö× Ó Ö× ÐØÓ Ö Ò Ñ ÒØÓº Å × Ð ÒØ ¸ Ò Ü ¿º º¿º¿ ´Ô Ò ¾½ µ¸ Ð Ö ÑÓ× ×Ó Ö Ð Ù×Ó ÒÚ Ö ÒØ ׺ º Ð Ö Ò Ð Ó ØÓ× ÐÓ Ñ × Ö ÔÓ× Ð ×Ù ÔÖ Ñ Ö Ù×Óº Ä ÓÖÖÙÔ ÓÒ ØÓ× × ÓØÖ Ð × Ó ÙÖÖ Ò × ÔÖ Ò Ô Ð × ÖÖÓÖº Ù ÒØ × Ú × ÒÓ ÒÓ× ÑÓ× Ò ÓÒØÖ Ó Ò Ð × ØÙ ÓÒ Ñ ×Ø Ö Ó× Ò Ð ÕÙ ÙÒ Ú Ö Ð ÒÓ Ø Ò Ð Ú ÐÓÖ ×Ô Ö Ó ÍÒ Ð × Ú ÖØÙ × Ð Ó ÙÐØ Ñ ÒØÓ Ò ÓÖÑ ÓÒ × ÕÙ Ð Ñ Ø Ð ÓÖÖÙÔ ÓÒ Ð Ñ ØÓ Ù×Ó Ð ØÓº Ë × ØÖ Ø ÙÒ Ì ¸ Ò Ö Ð Þ Ó¸ ÔÓÖ ×ÙÔÙ ×ØÓ¸ Ð ÓÖÖÙÔ ÓÒ ÙÒÓ ×Ù× ØÖ ÙØÓ× ×ÓÐÓ ÔÙ Ö× ÙÒÓ ×Ù× Ñ ØÓ Ó׺ È Ö Ó Ó ÙÖÖ Ò Ú Ð ÐÓ× Ó ØÓ× Ù×Ó ÒØ ÖÒÓ ÙÒ ÖÙØ Ò º ÈÓÖ Ø ÒØÓ¸ Ð Ö Ö ÙÒ Ó ØÓ ÐÓ Ñ × Ö ÔÓ× Ð ×Ù ÔÖ Ñ Ö Ù×Ó ÚÓÖ ÕÙ Ð Ó ØÓ ×ÓÐÓ Ü ×Ø Ò ×Ù Ñ ØÓ Ù×Óº Ò Ò ÙÖ ¸ Ò Ð Þ ÓÒ ÒÑ Ø Ð Ð Ö ÓÒ Ð Ñ Ò Ð ÔÓ× Ð ÓÖÖÙÔ ÓÒ ÒØÖ Ð Ð Ö ÓÒ Ý ×Ù ÔÖ Ñ Ö ÙØ Ð Þ ÓÒº º Ë ÑÔÖ Ú Ö ¬ Ö Ú ÐÓÖ Ö ØÓÖÒÓ ÙÒ ÙÒ ÓÒ × ÓÑÓ ×Ù× Ô Ö Ñ ØÖÓ× ÒØÖ Ý× Ð º Ò Ô Ð Ö × Ñ × ÔÖ × ×¸ ÔÙÒØÓ ÒÚÓ ÒØ ÙÒ ÙÒ ÓÒ Ú Ö ¬ Ö Ô ÖØ ¹ Ò Ò Ð ÓÑ Ò Ó Ð Ú ÐÓÖ Ö ØÓÖÒÓ × ÓÑÓ ×Ù× Ô Ö Ñ ØÖÓ× × Ð º Ð Ñ ×ÑÓ ÑÓ Ó¸ ÙÒ ÓÒ Ú Ö ¬ Ö ÕÙ ÐÓ× Ô Ö Ñ ØÖÓ× Ö Ó× Ø Ñ Ò ×Ø Ò ÒØÖÓ ×Ù ÓÑ Ò Óº
  • 238.
    212 Cap´ ıtulo 3. Cr´ ıtica de algoritmos º Å Ò Ñ Ð Ù×Ó Ð ÔÖ ÔÖÓ × ÓÖ Ò ÐÙ× ÓÒ Ö ÚÓ× Ý ×Ô ¬ ÓÒ Ñ ÖÓ× × ÑÔР׺ ÙÒÕÙ ÐÓ× ÔÖ ÔÖÓ × ÓÖ × ×ÓÒ ÑÙÝ ÔÓ ÖÓ×Ó× ÓÑÓ Ñ Ó× ¹ Ó Ô Ö ÜØ Ò Ö Ð Ð Ò Ù ¸ ÐÐÓ× ÒÓ ×ÓÒ ÓÑÔ Ð ÓÖ ×º ÍÒ ÔÖ ÔÖÓ × ÓÖ ÒÓ Ú Ö ¬ Ð × ×Ø Ñ Ø ÔÓ× Ý¸ Ò Ò ÙÖ ¸ ÔÙ Ò Ö Ö ÒרÖÙ ÓÒ × ÕÙ ÓÑÔ Ð Ò¸ ÕÙ ÓÖÖ ÒØ Ñ ÒØ ÙÒ ÓÒ Ò¸ Ô ÖÓ ÕÙ ×Ø Ò ØÓØ ÐÑ ÒØ Ó ÙÐØ × Ð Ñ Ö Ð ÔÖÓ Ö Ñ ÓÖº ÓÒ× Ù ÒØ Ñ ÒØ ¸ × Ú Ø Ö Ð ÓÒ Ø Ò ÓÒ ÒÓÑ Ö ×¸ ÐÓ× Ô Ö Ñ ØÖÓ× Ú ¹ Ö Ð × Ý ÐÓ× Ñ ÖÓ× Ö ÙÖ× ÚÓ׺ Ä Ü Ô ÓÒ Ð Ö Ð × Ô Ö ×Ô ØÓ× ÕÙ ÒÓ ÔÙ ÑÔÐ ÒØ Ö Ð Ð Ò Ù ¸ Ò ÙÝÓ ×Ó × Ù× Ö Ô Ö ÒØ × × ÔÓÖ ÙÒ ÜÔ Ò× ÓÒ Ð Ñ ÖÓº Ê ÓÖ ÑÓ× ÕÙ C Ý C++ Ø Ò Ò ÙÒ ÓÒ × ÒÐ Ò ÕÙ ×ÓÒ ÕÙ Ú Ð ÒØ × Ò ÙÒ ÓÒ ¹ Ð Ý × ÑÔ ÒÓ Ð Ñ ÝÓÖ ÐÓ× Ñ ÖÓ׸ ÓÒ Ð Ú ÐÓÖ Ò Ó ÕÙ Ù× Ò Ð × ×Ø Ñ Ø ÔÓ× Ð ÓÑÔ Ð ÓÖº º Ê ×ØÖ Ò Ð Ù×Ó ÔÙÒØ ÓÖ × ÒÓ Ñ × ÙÒ Ò Ú Ð Ö ÖÒ º ÍÒ Ö Ö Ò × ÙÒ ×Ó ÐÓ ÕÙ ÓÒØ Ò Ð ÔÙÒØ ÖÓº Ò ×Ø × ÒØ Ó¸ Ð Ö Ð ×Ø Ð ÕÙ ÒÓ × ÔÙ Ò Ù× Ö Ó× Ó Ñ × Ö Ö Ò × ÔÓÖ ÑÔÐÓ¸ Ð Ó ÓÑÓ **ptr = ...º È Ö ÓÑ ÒÞ Ö¸ Ñ × ÙÒ Ò Ú Ð × ÓÑÔÐ Ó ÓÑÔÖ Ò Ö ÙÒ Ô Ö ÐÓ× Ñ × Ú ÖØÙÓ×Ó× ÔÖÓ Ö Ñ ÓÖ ×º Ò × ÙÒ Ó ÐÙ Ö¸ Ø Ñ Ò × Ð ×ØÙ Ö ÔÓÖ ÐÓ× Ò Ð Þ ÓÖ × ×Ø Ø Ó׺ ÈÓÖ ×ÙÔÙ ×ØÓ¸ Ý ×Ó× Ò ÕÙ Ð Ð Ö ÓÒ ÔÙÒØ ÖÓ× ÔÙÒØ ÖÓ× × Ò ¹ × Ö ¸ Ô ÖÓ ×ØÓ ÒÓ Ò × Ö Ñ ÒØ ÖÖ Ú ÓÐ ÓÒ Ð Ö Ð º È Ö ÙÒ ÑÔÐÓ × Ù Ñ ÒØÓ ×Ø Ö Ð ¸ Ú × Ð ÑÔÐ ÒØ ÓÒ DynArray<T> ÔÖ × ÒØ Ò Ü ¾º½º ´Ô Ò ½µº ½¼º Ë ÑÔÖ ÓÑÔ Ð ÓÒ ØÓ Ó× ÐÓ× Ð ÖØ × Ð ÓÑÔ Ð ÓÖ Ð Ø Ó× Ý Ù× Ò Ð Þ ÓÖ × Ó Óº Ä Ñ ÝÓÖ Ô ÖØ ÐÓ× ÓÑÔ Ð ÓÖ × ÑÓ ÖÒÓ× ØÙ Ò Ú Ö ¬ ÓÒ × ÖÖÓÖ × Ø Ô Ó׺ ÈÓÖ ÕÙ Ö ÞÓÒ Ö Ò × ÖØ Ö× × × Ú Ö ¬ ÓÒ × Ä ÖÙ Ö ×¹ ÔÙ ×Ø × ÕÙ ÑÙ Ó× ÔÖÓ Ö Ñ ÓÖ × ×ÓÒ Ñ Ð Ö Ó× Ý ÔÖ ¬ Ö Ò × ÐØ Ö ÙÒ ÖÖÓÖ Ó Ð ÖØ Ð ÓÑÔ Ð ÓÖ ÓÒ Ø Ð ÔÖÓ× Ù Ö¸ ÓÒ Ñ × ÔÖÓ Ð ÖÖÓÖ Ò Ð Ù¹ ØÙÖÓ¸ ×Ù ÔÖÓÝ ØÓº Ð Ñ ×ÑÓ Ö ÞÓÒ Ñ ÒØÓ ÔÐ Ô Ö ÐÓ× Ò Ð Þ ÓÖ × ×Ø Ø Ó× Ó Ò Ñ Ó׺ Ú × Ó ÙÖÖ ÐÓ ÕÙ × ÒÓÑ Ò Ð×Ó ÔÓ× Ø ÚÓ × Ö¸ ÙÒ Ö ÔÓÖØ Ó Ð ÖØ ÙÒ ÖÖÓÖ ÕÙ ÒÓ Ü ×Ø º ÈÓÖ ÐÓ Ò Ö Ð¸ רÓ× Ö ÔÓÖØ × Ó ÙÖÖ Ò Ò ÓÑ Ò ÓÒ × Ó Ó ÒØÖ Ò × Ð × Ù Ð ×¸ ØÓ× Ð Ð Ö ¸ × ÔÖ Ö Ð ÑÓ ¬ ÖÐ × Ô Ö ÕÙ Ð ÓÑÔ Ð ÓÖ ÒÓ ÖÖÓ Ñ Ò× × Ð ÖØ Ó ÖÖÓÖº ØÖ Ú × Ð Ú Ò Ö Ð ÔÖÓ Ö Ñ ÓÒ¸ × Ó × ÖÚ Ó ÕÙ ØÖ × Ð ÓÖÖ ÓÒ ÙÒ ÖÖÓÖ × Ø Ò Ò ÓÒØÖ Ö ÓØÖÓ Ö Ð ÓÒ Ó Ó ÙÒÓ ÒÙ ÚÓ ÒØÖÓ Ù Ó ÔÓÖ Ð Ñ ×Ñ ÓÖÖ ÓÒº Ì Ñ Ò × ÒÓØ Ó ÙÒ Ö × ×Ø Ò Ò ØÙÖ Ð ¸ Ú Ó× ¸ ÔÓÖ Ô ÖØ Ð ÔÖÓ¹ Ö Ñ ÓÖ ÔÖÓÑ Ó¸ Ò Ñ Ö Ö Ñ ÒÙ Ó× Ñ ÒØ Ð ÓÖ Ò Ð ÖÖÓÖº Ì Ð Ø ØÙ × Ú Ó× ÔÓÖÕÙ ÒÓ ×Ø ÓÒ ÓÖÖ Ö Ð ÖÖÓÖ¸ × ÒÓ¸ Ò ×Ó ÕÙ ØÖ × Ð Ñ ×ÑÓ ×Ù Ý Þ ÙÒ
  • 239.
    3.4. Correctitud dealgoritmos 213 Ñ Ð Ø ØÙ ¸ Ò ÓÒØÖ Ö Ò ÕÙ ÓÒ× ×Ø Ø Ð Ø ØÙ ÑÓ Ó ÕÙ ×Ø ÔÙ ÒÑ Ò Ö× Ý¸ ÓÒ× Ù ÒØ Ñ ÒØ ¸ ÒÓ Ö Ô Ø Ö Ð Ñ ×Ñ Ð × ÖÖÓÖº ÌÓÑ Î Ò Ð ¸ ÙÒÓ ÐÓ× ÔÖ Ò Ô Ð × × ÖÖÓÐÐ ÓÖ × Multics ¸ ¾ ¸ ÕÙ Þ Ð ØÓ Ñ × ÑÔÓÖØ ÒØ Ò × ×Ø Ñ × ÓÔ Ö Ø ÚÓ׸ × ÔÐ ÒØ ØÖ × ÔÖ ÙÒØ × ¿ ÕÙ ÙÒ × ÖÖÓÐÐ ÓÖ × ÑÔÖ Ö× Ú Þ ÕÙ Ø Ø ÙÒ ÖÖÓÖ Ý ÕÙ ÐÓ Ò Ñ Ò Ò × Ù ÖÖ Ð Ø ØÙ ÓÖ Ò Ö ÐÓ× ÖÖÓÖ ×º Las preguntas actitudinarias de Van Cleck ½º Ë Ò ÓÒØÖ Ö Ð ÖÖÓÖ Ó Ð Ñ ×Ñ Ð × ÖÖÓÖ Ò ÓØÖ Ô ÖØ Ð ÔÖÓ Ö Ñ ÈÐ ÒØ Ö× ×Ø ÔÖ ÙÒØ ÓÒÐÐ Ú ×Ø Ð Ö ÙÒ Ô ØÖÓÒ Ô Ö Ð ÖÖÓÖ Ý Ò ÙÒ ÓÒ Ð Ñ ×ÑÓ Ù× Ö Ò Ð Ö ×ØÓ Ð ÔÖÓ Ö Ñ ÓØÖ × Ô Ö ÓÒ × Ð Ô ØÖÓÒº ÄÓ× ÐÐ Þ Ó× Ð Ô ØÖÓÒ ×ÓÒ ÐÙ Ö × ÔÖÓ Ð × Ö Ô Ø Ò Ð ÖÖÓÖº ¾º Ù Ð × ÓØÖÓ× ÖÖÓÖ × ×Ø Ö Ò Ö Ð ÓÒ Ó× ÓÒ Ð Ò ÓÒØÖ Ó Ó ÓÒ ×Ù ÓÖÖ ÓÒ È ÖØ Ò Ó Ð ÔÓ× Ð ÕÙ Ð ÓÖÖ ÓÒ ÒØÖÓ ÙÞ ÙÒ ÒÙ ÚÓ ÖÖÓÖ¸ ÓÖ Ö ×Ø ÔÖ ÙÒØ ÓÒ ÖÓÒØ ÔÐ ÒØ Ö ÙÒ ÓÖÖ ÓÒ ÒØ ÖÖÓ Ö ÕÙ ×Ù Ö ÙÒ Ú Þ ÕÙ ×Ø × Ö Ð º ×Ù Ú Þ¸ ×ØÓ Ô × ÔÓÖ ÑÓ×ØÖ Ö Ö ÙÖÓ× Ñ ÒØ ÕÙ Ð ÓÖÖ ÓÒ × ÓÖÖ Ø Ó × ¸ ÕÙ ÒÓ ÓÒØ Ò Ð ÙÒ ÖÖÓÖº ¿º ÉÙ × Ö Ö Ô Ö ÔÖ Ú Ò Ö ÓÑ Ø Ö ÒÙ ÚÓ Ð ÖÖÓÖ ÍÒ Ú Þ Ö ×ÔÓÒ × Ð × Ó× ÔÖ ÙÒØ × ÒØ Ö ÓÖ ×¸ × ×Ø Ð Ö¸ Ò ÙÒ ÓÒ Ð Ô ØÖÓÒ Ò ÓÒØÖ Ó¸ ÙÒ ÔÖÓØÓ ÓÐÓ ÕÙ Ú Ø Ö Ô Ø Ö Ð ÓÑ Ø Ñ ÒØÓ Ð ÖÖÓÖº ÉÙ Þ ×Ø × Ð ÔÖ ÙÒØ Ñ × ÒÖ ÕÙ ÓÖ Ô Ö Ð ÔÖÓ Ö Ñ ÓÖ¸ ÔÙ × ×Ù ÓÖ ÔÐ ÒØ ÙÒ Ò× Ò ÒÞ º 3.4.3.2 An´lisis est´tico a a Compilador y sistema de tipos Ð × ×Ø Ñ Ø ÔÓ× Ð Ð Ò Ù ÔÖÓ Ö Ñ ÓÒ¸ Ò ÓÒ ÙÒ ÓÒ ÓÒ Ð ÓÑÔ Ð ÓÖ¸ Ö Ð Þ Ò ÙÒ ÒÓÖÑ ØÖ Ó Ú Ö ¬ ÓÒ ÓÖÖ Ø ØÙ Ð Ú Ð Ö Ð ÓÖÖ ×ÔÓÒ Ò × Ð ÔÖÓ Ö Ñ Ö ×Ô ØÓ Ð × ×Ø Ñ Ø ÔÓ Ð Ð Ò Ù º ÓÑÓ ÑÔÐÓ ØÖ Ú Ð¸ Ô ÖÓ ÒÓØ Ð ¸ ÓÒ× Ö ÑÓ× int x; string s; s = x; // Violaci´n de tipo. ERROR DE COMPILACI´N o O ÄÓ× ÖÖÓÖ × ÓÑÔ Ð ÓÒ Ò × Ó Ù× Ó Ù× ÓÒ Ý Ñ Ð ÓÒ ÒØÖ ÐÓ× ÔÖÓ¹ Ö Ñ ÓÖ × ÒÓÚ Ð × Ý Ð ÙÒÓ× Ú ÒÞ Ó׺ Ù ÒØÓ× ÒÓ×ÓØÖÓ× Ð ÙÒ Ú Þ ÑÓ× Ô Ö¹ Ñ Ò Ó ÐÓÕÙ Ó× ÔÓÖÕÙ ÙÒ ÔÖÓ Ö Ñ ÒÓ ÒÓ× ÓÑÔ Ð ÍÒ Ñ Ö Ñ × Ö Ø Ð ÔÖÓ Ð Ñ ÒØ Ö ÓÖ ÒÓ× Ô ÖÑ Ø ÔÖ Ò Ö ÕÙ ¸ × ÐÚÓ ÙÒ ÖÖÓÖ Ð ÓÑÔ Ð ÓÖ Ó Ð Ð Ò Ù ÔÖÓ Ö Ñ ÓÒ¸ Ù ×Ø ÓÒ ÑÔÖÓ Ð Ô ÖÓ Ø Ð ¸ ÙÒ ÖÖÓÖ ÓÑÔ Ð ÓÒ Ø Ò Ð Ö Ò ÓÒ ÕÙ ÒÓ× Ù ÖÞ Ò Ö ÒØ Ö Ð ÓÑ Ø Ñ ÒØÓ ÙÒ ÖÖÓÖ ÓÑÓ ÔÖÓ Ö Ñ ÓÖ ×º Ò Ð ÑÔÐÓ ÒØ Ö ÓÖ¸ ÒÓ Ø Ò × ÒØ Ó × Ò Ö ÙÒ ÒØ ÖÓ ÙÒ Ò Ö Ø Ö ×º
  • 240.
    214 Cap´ ıtulo 3. Cr´ ıtica de algoritmos ÈÓÖ ÐÓ Ò Ö Ð ÐÓ× ÓÑÔ Ð ÓÖ × Ô Ö Ñ ØÖ Þ Ò ×Ù× ÑÓ Ó× Ø ÓÒ Ý ØÖ Ø Ñ ÒØÓ ÖÖÓÖ ×º ÓÒ×ÙÐØ × Ð Ñ ÒÙ Ð Ð ÓÑÔ Ð ÓÖ GNU gcc Ô Ö Ñ × Ø ÐР׺ Ò ØÓ Ó ×Ó¸ ÓÑÓ Ý ÐÓ Ø Ð Ñ Ö Ð ÀÓÐØÞÑ ÒÒ¸ ÓÑÔ Ð × ÓÒ ØÓ Ð Ø ÓÒ ÖÖÓÖ × Ý Ð ÖØ × Ð Ø Ó׺ ÆÓ × ÔÖÓ× ×Ø ÕÙ Ð ÓÑÔ Ð ÓÖ ÖÖÓ Ö Ð ÖØ × Ý ÖÖÓÖ ×º Analizadores externos Ê ×ÙÐØ ÕÙ Ð Ù×ÕÙ ÖÖÓÖ × Ò Ð Ó Ó Ù ÒØ ÙÒ ÔÖÓ Ö Ñ × ÔÙ ÙØÓÑ Ø Þ Ö Ô Ö Ú Ð Ö ÕÙ ×Ø × ÐÓ× ×Ø Ò Ö × Ó ¬ ÓÒ Ð Ð Ò Ù Ù ÓØÖÓ× ×Ø Ð Ó× ÔÓÖ Ð ÖÙÔÓ ØÖ Óº ÉÙ Þ Ð ÑÔÐÓ Ñ × Ö ÔÙØ Ó ×ØÓ × lint ½ ¸ ÙÒ Ò Ð Þ ÓÖ ×Ø Ø Ó Ù ÒØ × Ô Ö Ð Ð Ò Ù C ÕÙ Ú Ò Ó × Ò Ð Ô Ö Ð × ÖÖÓÐÐÓ ÔÖÓ Ö Ñ × Ò C¸ Ù ÒØ Ð Ð Ð × ×Ø Ñ Ø ÔÓ× ×Ø Ð Ò Ù º lint ÙÒ × ÑÔÐ Ñ ÒØ Ù× Óº À Ý ÙÒ × Ù ÒØ × ÖÖ Ñ ÒØ ׸ Ò ×Ù × ÓÖØÙÒ Ñ ÝÓÖ Ù×Ó ÓÑ Ö Ð¸ ÕÙ Ö Ð Þ Ò Ò Ð × × ×Ø Ø Ó ÓÖÖ Ø ØÙ ÙÒ ÔÖÓ Ö Ñ º Ä Ñ ÒØ Ð Ñ ÒØ ¸ ÙÒ Ü ×¹ Ø Ò ÔÓ × ÖÖ Ñ ÒØ × Ð Ö × ÕÙ Ö Ð Ò ÙÒ Ò Ð × × ×Ø Ø Ó Ð Ñ ×ÑÓ Ò Ú Ð ÕÙ ÓØÖ × ÓÑ Ö Ð ×º ÈÓ ÑÓ× Ø Ö¸ ÑÔ ÖÓ¸ LC-LINT¸ ÓÑÔÐ Ñ ÒØ Ö Ó Ð Ð Ö lint ½ ¸ Ý Flawfinder ¾ Ý its4 ¼ ÓÖ ÒØ Ó× Ð Ù×ÕÙ ÖÖÓÖ × × ÙÖ º Meta-compilaci´n o Å Ø ¹ ÓÑÔ Ð ÓÒ ÓÒ× ×Ø Ò Ó Ö Ö ÙÒ ÓÑÔ Ð ÓÖ ÜØ Ò× Ð Ò Ð × ÒØ Ó ÕÙ Ð Ù×Ù Ö Ó ÔÙ Ò Ö ÒÙ Ú × Ö Ð × ÓÑÔ Ð ÓÒ × ÙÒ Ð ÓÒÓ Ñ ÒØÓ ÔÐ Ø ÚÓ Ð Ù×Ù Ö Óº ר Ø Ò ÑÙ Ó × ÒØ Ó ÔÓÖÕÙ Ð ÓÑÔ Ð ÓÖ ÔÓ× Ð Ñ ÕÙ Ò Ö Ò × Ö Ô Ö Ð Ú Ö ¬ ÓÒ ÙØÓÑ Ø ¸ Ô ÖÓ ÒÓ ÔÓ× Ð ÓÒÓ Ñ ÒØÓ ×Ó Ö Ð Ø ÔÓ ÔÐ ÓÒº ÈÓÖ Ð ÓÒØÖ Ö Ó¸ Ð Ó ¬ ÓÖ × ÔÓ× ÕÙ Ð ÓÒÓ Ñ ÒØÓ¸ Ô ÖÓ ÓÐ Ð ÐØ ÕÙ ÐÐ Ñ ÕÙ Ò Ö º Ä × × ¸ ÔÓÖ Ø ÒØÓ¸ Ò Ð ÔÖ Ò Ô Ó ¬Ò¹ ¹¬Òº ÈÓÖ ÑÔÐÓ¸ ÙÒ Ù×Ù Ö Ó ÔÓ Ö ×Ô ¬ Ö ÕÙ Ð × Ò ÓÒ ÒØÖ ÔÙÒØ ÖÓ× ×Ø ÔÖÓ¹ Ý ÕÙ Ô Ö ØÓ ÐÐ Ñ Ð ÓÔ Ö ÓÖ new ×Ó Ö ÙÒ ÔÙÒØ ÖÓ Ò ÓÒØÖ Ö× ÔÓÖ Ð ÙÒ Ô ÖØ ÓØÖ ÐÐ Ñ Ð ÓÔ Ö ÓÖ deleteº Ð Ñ ×ÑÓ ÑÓ Ó¸ Ø Ð ÜØ Ò× ÓÒ Ð ÓÑÔ ¹ Ð ÓÖ ÔÓ Ö Ô ÖÑ Ø Ö Ú Ö ¬ Ö ×Ø Ø Ñ ÒØ ÕÙ ÕÙ Ð new Ó ÙÖÖ ÒØ × ÕÙ Ð deleteº Ë ÔÙ Ò ÔÖÓÚ Ö¸ Ø Ñ Ò¸ Ð × ÔÖÓÔ × ØÖ Ò× ÓÖÑ ÓÒ Ð × Ð ÓÑÔ Ð ÓÖ Ô Ö Ö Ð Þ Ö ÓÒ × × Ñ ÒØ ׺ ÈÓÖ ÑÔÐÓ¸ ÕÙ Ð ÓÑÔ Ð ÓÖ ÑÔÐ ÒØ Ð ÔÖ Ñ Ö Ö Ð ÀÓÐØÞÑ ÒÒ Ý ×ÔÐ Ð ×Ø ÓÒ Ñ ÑÓÖ Ð × Ò Ð Þ ÓÒº Ê ÔÓÖØ × Ò Ð Ö Ø Ð ¸ Ò Ò ÕÙ Ð Ñ Ø ¹ ÓÑÔ Ð ÓÒ × Ö ÙÒ ÐÓ× ÔÖ Ò¹ Ô Ð × Ñ Ó× Ú Ö ¬ ÓÒ ÓÖÖ Ø ØÙ Ò ÐÓ× ÒÓ× Ú Ò ÖÓ׺ Å ÒØ ר Ø Ò ¸ Ò Ð Ö Ø Ð ¸ Ý Ò Ò ÓÒØÖ Ó Ñ Ð × ÖÖÓÖ × Ò Ä ÒÙܸ ÇÔ Ò Ë Ý ÑÙ Ó× Ý ÓÑÔÐ Ó× × ×Ø Ñ × ÓÑ Ö Ð ×º Ä Ñ ÒØ Ð Ñ ÒØ ¸ ÐÓ× ÔÖÓ Ö Ñ × Ö ×ÙÐØ ÒØ × Ð × ÒÚ ×Ø ÓÒ × ÒÐÖ Ø Ø ¸ ÒÓ ×ÓÒ Ð Ö ×Óº Exploraci´n del espacio global de estado o ÍÒ Ø Ò Ö Ò Ó× Ú Ö ¬ ÓÒ ÓÖÖ Ø ØÙ Ö ÕÙ Ö ØÖ Ù Ö Ð ÔÖÓ Ö Ñ ÙÒ Ñ ÕÙ Ò ×Ø Ó ¬Ò ØÓ ÕÙ Ö ÔÖ × ÒØ ÐÓ× Ö ÒØ × ×Ø Ó× ÐÓ× ÔÖÓ Ö Ñ ×º ÈÙ ×ØÓ ÕÙ ÒÓ ×ÔÓÒ ÑÓ× ×Ô Ó Ô Ö ÜÔÐ Ö ÓÖÑ ÐÑ ÒØ ÕÙ × ÙÒ ÙØÓÑ Ø ¸
  • 241.
    3.4. Correctitud dealgoritmos 215 ÐÓ ÒØÙ Ö ÑÓ× Ô ØÓÖ Ñ ÒØ Ñ ÒØ Ð × Ù ÒØ Ý × ÑÔÐ × ÑÓ ÙØÓÑ Ø ¸ Ö ×ÙÐØ ÒØ Ð ÔÖÓ Ö Ñ ÕÙ Ð ÙÐ Ð Ñ ÒÓÖ ÒØÖ Ó× ÒÙÑ ÖÓ× x, y 0 x<y not x<y 1 2 min=y min=y 3 ret=min 4 Ö ÙÐÓ ÓÖÖ ×ÔÓÒ ÙÒ ×Ø Ó ¸ Ñ ÒØÖ × ÕÙ ­ × ÙÒ ØÖ Ò× ÓÒ ÒØÖ Ó× ×Ø Ó׺ Ð Ñ Ó ×Ø Ó Ó ÙÖÖ Ù Ò Ó × ÙØ Ð ÒרÖÙ ÓÒ ×Ó Ð ØÖ Ò× ÓÒº Ð ×Ø Ó Ò Ð × ÒÓØ ÓÒ ÙÒ ­ ×Ð ÕÙ Ð ÐÐ ¸ Ñ ÒØÖ × ÕÙ ÙÒÓ ¬Ò Ð ÓÒ ÓØÖ ­ ÕÙ Ð × Ð º ÍÒ Ú Þ Ó Ø Ò Ó Ð ´Ó ÐÓ×µ ÙØÓÑ Ø ×¸ ÙÒ × ÑÙÐ ÓÖ × Ò Ö ÜÔÐÓÖ Ö ØÓ × Ð × ÓÑ Ò ÓÒ × ×Ø Ó× ÔÓ× Ð × Ò Ð Ù×ÕÙ ÖÖÓÖ × × ÒØ Ø Ó× Ý × Ñ ÒØ Ó׺ ÍÒ ÖÖÓÖ × ÒØ Ø Ó × Ø ÐÓ ÓÑÓ ÙÒ ÖÖÓÖ Ò Ö Ð Ù ÐÕÙ Ö Ð × ÔÖÓ Ö Ñ ÔÓÖ Ñ¹ ÔÐÓ׸ ÕÙ ÙÒ ÔÖÓ Ö Ñ Ñ × ÙØ Ð ÙÒ ÔÓÖ ÓÒ ×Ù Ó Ó¸ Ó ÕÙ Ð ÔÖÓ Ö Ñ ÒØÖ Ò ÙÒ ×Ø Ó ÐÓÕÙ Ó Ø ÖÒÓ Ò Ð Ù Ð × ×Ô Ö ÔÓÖ ÙÒ Ú ÒØÓ ÕÙ Ñ × Ó ÙÖÖ Ö ´ ¹ ÐÓ µ¸ Ó ÕÙ × ÒØÖ Ò Ð Ù ÓÒ ÙÒ Ð ÞÓ Ò¬Ò ØÓº ÍÒ ÖÖÓÖ × Ñ ÒØ Ó Ø Ò Ð ¬Ò Ð ÔÖÓ Ö Ñ Ý Ô Ö ×Ô ¬ ÖÐÓ × ÙØ Ð Þ ¸ ÔÓÖ ÐÓ Ò Ö Ð¸ ÐÓ Ø ÑÔÓÖ Ð¾¼ Ó ÙØÓÑ Ø × ÔÖ Ó× ´Ó Ù µ¾½ º Ð ÔÖÓ ×Ó Ú Ö ¬ ÓÒ × Ñ ÒØ Ñ ÒØ ÐÓ Ø ÑÔÓ¹ Ö Ð ´Ó ÙØÓÑ Ø × Ù µ × Ð ÒÓÑ Ò “Verificaci´n de modelo” ´ ÅÓ Ð o ¹ Ò µº × Ð × Ó× ×¸ Ð Ú Ö ¬ ÓÒ ÔÓÖ ×Ø Ñ ØÓ Ó Ô Ö ×Ø ÒØ × ÑÔÐ º È ÖÓ¸ Ò Ð Ö Ð ¸ ÐÓ× ÙØÓÑ Ø × Ö ×ÙÐØ ÒØ × ÙÒ ÔÖÓ Ö Ñ Ö Ð ×ÓÒ ÜØÖ Ñ Ñ ÒØ Ö Ò × Ý ÒÓ × ÑÔÖ Ü ×Ø ÙÒ Ñ ØÓ Ó Ø ÖÑ Ò ×Ø Ô Ö ØÖ Ù Ö ÔÖÓ Ö Ñ × ÙØÓÑ Ø ×º ר Ñ ØÓ Ó Ú Ö ¬ ÓÒ × ÑÙ Ó Ñ × ÒØ Ö × ÒØ Ù Ò Ó × Ú Ö ¬ Ò ÔÖÓ Ö Ñ × ÓÒ ÙÖÖ ÒØ × × Ö¸ ÔÖÓ Ö Ñ × ÓÑÔÙ ×ØÓ× ÔÓÖ Ú Ö Ó× ÔÖÓ Ö Ñ × ÕÙ × ÙØ Ò × ¹ ÑÙÐØ Ò Ñ ÒØ º È ÖÓ ÕÙ × Ö ÕÙ Ö ÓÒרÖÙ Ö ÙÒ ÙØÓÑ Ø ÐÓ Ð ÓÑÔÙ ×ØÓ ÔÓÖ Ð ÓÑ Ò ÓÒ ÐÓ× ×Ø Ó× ØÓ Ó× ÐÓ× ÙØÓÑ Ø ×º Ì ÓÖ Ñ ÒØ ¸ Ð ÜÔÐÓÖ ÓÒ ÐÓ Ð Ð ×Ô Ó ×Ø Ó × Ô Þ Ø Ø Ö Ù ÐÕÙ Ö ÖÖÓÖ × ÒØ Ø Ó Ý ØÓ Ó× ÐÓ× × Ñ ÒØ Ó× Ò ÙÒ ÓÒ Ð ¬Ò ¬Ò Óº Ò Ð ÔÖ Ø ¸ ÑÔ ÖÓ¸ × Ø Ò Ð ÔÖÓ Ð Ñ ÕÙ Ð ×Ô Ó ×Ø Ó Ð ÙØÓÑ Ø ÐÓ Ð × ÜÔÐÓ× ÚÓ O(2n)º Ü ×Ø Ò Ø Ò ×¸ × × Ò × ÖÖÓÐÐÓ× Ø ÓÖ Ó׸ ÕÙ Ô ÖÑ Ø Ò Ð Ö ÓÒ ×Ø ÔÖÓ Ð Ñ ¸ × Ò Ó Ð × Ñ × ÑÔÓÖØ ÒØ × Ð × × Ù ÒØ × ½º Ð ÓÖ ØÑÓ× × Ñ ÓÐ Ó× Ð ÓÒ× ×Ø Ò ×Ù ×Ø ØÙ Ö Ð ÙØÓÑ Ø ¸ Ó Ô ÖØ и ÔÓÖ ÙÒ ÓÖÑÙÐ ÐÓ º ÈÓÖ ÑÔÐÓ¸ Ô Ö Ð ÙØÓÑ Ø ÒØ Ö ÓÖ¸ × Ö ÔÓ× Ð ×Ù ×Ø ØÙ Ö Ð × ØÖ Ò× ÓÒ × × Ð ×Ø Ó ½ Ð ÔÓÖ ÙÒ ØÖ Ò× ÓÒ ÙÝÓ ÔÖ Ó×Ö x < y ÓÖ ÒÓØ x < y, Ö Ø Ñ Ò ÔÙ × Ð ­Ù Ó Ù ÓÒ ÒÙÒ × Ø Ò Ö Ù× Ð × ØÖ Ò× ÓÒ × ×ÙÔÖ Ñ ×º ¾¼ Ä ÐÓ Ø ÑÔÓÖ Ð × ÙÒ ÐÓ ÔÖ Ó× ÙÝÓ× Ù ÒØ ¬ ÓÖ × ÓÒ× Ö Ò Ð Ø ÑÔÓ ¿½ º ¾½ ÍÒ ÙØÓÑ Ø ÔÖ Ó× × ÙÒÓ ÙÝ × ØÖ Ò× ÓÒ × ×ÓÐÓ ÓÒØ Ò Ò ÔÖ Ó× ÐÓ Ó× Ö Ð ÓÒ Ó× ÓÒ ÙÒ ÙØÓÑ Ø Ö ×ÙÐØ ÒØ Ð ÑÓ ÐÓ ¸ ¾¾ º
  • 242.
    216 Cap´ ıtulo 3. Cr´ ıtica de algoritmos ¾º Ê Ù ÓÒ ÔÓÖ ÓÖ Ò Ô Ö Ð ×Ø Ø Ò ¸ ÕÙ × Ö Ú Ð ÙÒÓ× Ö ×ÙÐØ Ó× Ñ Ø Ñ Ø Ó׸ ÓÒ× ×Ø ¸ ÑÙÝ ÖÓ××Ó ÑÓ Ó¸ Ò ×Ùר ØÙ Ö Ð Ö × Ò × ØÖ Ò× ¹ ÓÒ × × Ù Ò Ð ×¸ ÕÙ ÒÓ Ø Ò Ò ÙÖ ÓÒ ×¸ ÔÓÖ ÙÒ ×ÓÐ ØÖ Ò× ÓÒº Ð ÓÖ Ò Ô Ö Ð × ÔÐ Ò Ñ Ý Ö ÙÖ× Ú Ñ ÒØ Ù Ò Ó × ØÖ Ø Ð ÙØÓÑ Ø ÐÓ Ðº ÈÓÖ ÑÔÐÓ¸ Ð ÙØÓÑ Ø 0 tmp=x 1 x=y 2 y=tmp 3 ÔÙ ×Ù ×Ø ØÙ Ö× ÔÓÖ Ð × Ù ÒØ ÓÒØ ÒØ ÚÓ Ó× ×Ø Ó× Ý ÙÒ ØÖ Ò× ÓÒ Óѹ ÔÙ ×Ø ÔÓÖ Ð × ØÖ × ÒרÖÙ ÓÒ × 0 tmp=x x=y y=tmp 1 ÍÒ × ÑÙÐ ÓÖ ÔÙ Ò Ñ Ñ ÒØ Ø Ø Ö Ý ØÙ Ö ×Ø Ð × Ö Ù ÓÒº ¿º ×ØÖ ÓÒ Ò × ÑÔÐ ¸ ר Ø Ò × × Ò Ó × ÖÚ Ö ÓÒ ÙÒØÓ× ×Ø Ó× Ý ×ØÖ Ö ×Ù ÒØ Ö Þ Ñ Ò Ö Ò Ö Ðº Ð ÓÒ ÙÒØÓ ÓÒ× Ö Ó × ×Ù ×Ø ØÙÝ ÔÓÖ ÙÒ ÙØÓÑ Ø Ö Ù Ó ÙÝÓ ÖÓÐ × × ÑÙÐ Ö Ð Ö ×ÙÐØ Ó Ò Ö Ðº Ä × Ø Ò × ÒØ Ö ÓÖ × Ô ÖÑ Ø Ò Ö Ù Ö¸ ÑÙÝ ÓÒ× Ö Ð Ñ ÒØ ¸ Ð ×Ô Ó ×Ø Óº Ò Ò ÙÖ ¸ ÓØÖ Ø Ò ¸ ÐÐ Ñ ×ÙÔ ÖØÖ Þ ½ ¸ ÕÙ Ü Ñ Ò Ö ÑÓ× Ò Ü º¿º¾ ´Ô Ò µ¸ × Ò Ð Ù×Ó Ø Ð × × × Ò Ø ÓÒ ÓÐ × ÓÒ¸ Ô ÖÑ Ø Ö Ù Ö ØÓ Ú Ñ × Ð ×Ô Ó ÐÓ Ð ×Ø Óº ÄÓ ÒØ Ö ÓÖ¸ ÙÒ Ó Ð ÓÒÓ Ñ ÒØÓ Ð × Ò × ×Ø ר ׸ Ò ÕÙ × ÔÓ× Ð ÜÔÐÓÖ Ö × ØÓ Ó Ó¸ ØÓ Ó ¿ ¸ Ð ×Ô Ó ×Ø Ó × × Ö Ð Þ Ò ×Ù¬ ÒØ × × ÑÙÐ ÓÒ × Ð ØÓÖ ×º ÉÙ Þ Ð ÜÔÓÒ ÒØ Ñ × ÔÓÔÙÐ Ö ×Ø Ð × Ú Ö ¬ ÓÒ × spin/promela ½¿¸ ½ ¸ ½¾¸ ¿ º promela × ÙÒ Ð Ò Ù ×Ô ¬ ÓÒ ÔÖÓ Ö Ñ × ´ÒÓ ÙÒ Ð Ò Ù ÔÖÓ Ö Ñ ÓÒµ Ý spin × ×Ù × ÑÙÐ ÓÖº Ð Ò ÓÕÙ Ö ÕÙ Ö ÕÙ Ð ÔÖÓ Ö Ñ × ×Ô ¬ÕÙ Ò promela¸ ÐÓ ÕÙ Ò ÙÒ Ô ×Ó ÓÒ Ð Ý ÙÒ Ù ÒØ ÔÓØ Ò Ð ÖÖÓÖ Ð ØÖ ×Ð Ö Ð ×Ô ¬ ÓÒ Ò promela Ð ÐÒÙ ÔÖÓ Ö Ñ ÓÒº Ä Ò × ×Ø Ò ÓÕÙ × ÕÙ ÙÒ ÒÓ × ÓÒÓ Ò Ö ÐÑ ÒØ ÓÑÓ × ØÖ Ù ÙÒ ÔÖÓ Ö Ñ Ò ÙÒ Ð Ò Ù ÔÖÓ Ö Ñ ÓÒ ÙÒ ÙØÓÑ Ø ×Ø Ó ¬Ò ØÓº spin × Ð Ö × ½ ½º
  • 243.
    3.4. Correctitud dealgoritmos 217 Ê ÒØ Ñ ÒØ × Ò × Ù ÖØÓ Ø Ò × Ø Ú × Ô Ö ØÖ Ù Ö ÙÒ ÔÖÓ Ö Ñ Ö Ð ¹ Þ Ó Ò ÙÒ Ð Ò Ù ÔÖÓ Ö Ñ ÓÒ ÙÒ ÙØÓÑ Ø × ÙÒ Ð Ò ØÙÖ Ð Þ Ð ÔÐ ÓÒº ×ØÓ Ô ÖÑ Ø ÙØÓÑ Ø Þ Ö Ð ÔÖÓ ×Ó Ú Ö ¬ ÓÒ × Ò Ò × Ô × Ö ÔÓÖ Ð × ÑÓ Ð Þ ÓÒ Ò ÓØÖÓ Ð Ò Ù º 3.4.3.3 An´lisis din´mico a a Sistema operativo Ð Ö Û Ö Ý Ð ÔÖÓÔ Ó × ×Ø Ñ ÓÔ Ö Ø ÚÓ Ø Ò Ò Ñ Ó× Ô Ö Ø Ø Ö ÖÖÓÖ × ÙÖ ÒØ Ð Ù ÓÒ ÔÖÓ Ö Ñ ×º Ò Ð ×Ó Ð Ö Û Ö ¸ ÔÓÖ ÑÔÐÓ¸ ÔÙ Ø Ø Ö× ÙÒ Ú × ÓÒ ÔÓÖ ÖÓº Ò Ð ×Ó ÓÑ Ò Ó Ö Û Ö Ý × ×Ø Ñ ÓÔ Ö Ø ÚÓ¸ ÔÙ Ø Ø Ö× ÙÒ Ú ÓÐ ÓÒ Ñ ÑÓÖ ´× Ñ ÒØ Ø ÓÒ ÙÐØµ¸ ÖÖÓÖ Ø Ñ Ò Ù× ÒØ × ×Ô Ö ÓÒ × Ý Ñ Ð ÓÒ × Ò ÐÓ× ÔÖÓ Ö Ñ ÓÖ × ÒÓÚ Ð ×¸ Ô ÖÓ Ò Ö Ð ÑÙÝ ÓÖØÙÒ Ó¸ ÔÙ × Ò Ð ÓÑ Ø Ñ ÒØÓ ÙÒ ÖÖÓÖ Ý Ð ×ÙÒ ÓÒ ×Ù ÓÒ ÓÖÖ Ø Ú º Invariantes ÍÒ ÒÚ Ö ÒØ Ó × ÖØÓ × ÙÒ ÔÖ Ó ÐÓ Ó ÕÙ × ÓÐÓ Ò Ð ÙÒ ÔÙÒØÓ ÙÒ ÔÖÓ Ö Ñ Ý ÙÝ ÖØ ØÙ Ú Ö ¬ × × ÙÑÔÐ Ò Ð × ÔÖ Ñ × × Ù ÓÒ ×ÙÔÙ ×Ø × ÔÓÖ Ð × Ò ÓÖ Ð Ð ÓÖ ØÑÓ Ó Ð ÔÖÓ Ö Ñ ÓÖº Ä × ×Ø ÒØ × ÑÔÐ Ð ÔÖ Ó × Ú ÐÙ ×ÓÐÓ Ù Ò Ó Ð ­Ù Ó Ù ÓÒ Ô × ÔÓÖ Ð ÒÚ Ö ÒØ º Ò × ÑÓÑ ÒØÓ¸ × Ú ÐÙ Ð ÔÖ Ó Ý¸ × ×Ø × Ð×Ó¸ ÒØÓÒ × × Ð ÒÓØ ¬ Ð ÔÖÓ Ö Ñ ÓÖ Ñ ÒØ Ð ÙÒ Ú ÒØÓ ÔÓÖ ÐÓ Ò Ö Ð¸ Ð ÓÖØÓ Ð ÔÖÓ Ö Ñ º Ð Ú ÒØÓ Ð Ô ÖÑ Ø ÔÖ Ò Ö ÕÙ ¸ ´½µ Ó Ð × ÓÒ ÓÒ × Ö ÕÙ Ö × Ô Ö ÙØ Ö Ð ­Ù Ó Ò ÖØÓ ÔÙÒØÓ ÒÓ × ×Ø Ò ÙÑÔÐ Ò Ó¸ Ó ´¾µ Ð ÓÑ Ø Ó ÙÒ ÖÖÓÖ Ö ÞÓÒ Ñ ÒØÓº Ð Ù ÐÕÙ Ö ÐÓ× Ó× ×Ó׸ × ×Ø Ò ÔÖ × Ò ÙÒ ÖÖÓÖº Ä Ñ Ò Ö Ñ × × ÑÔÐ ÒØ ÖÔÖ Ø Ö ÙÒ ÒÚ Ö ÒØ × Ò ÓÖÑ ÔÖ ÓÒ ÓÒ Ó ÔÓר ÓÒ ÓÒ ÙÒ ÖÙØ Ò º ÆÓØ ÑÓ× ÕÙ ×Ø ÔÙ ÔÐ Ö× Ù ÐÕÙ Ö ­Ù Ó Ù ÓÒ × Ö¸ Ð ÔÖ Ò Ô Ó ÙÒ ­Ù Ó¸ ר Ð ÑÓ× ÔÖ ÓÒ ÓÒ × ÕÙ Ò ÙÑÔÐ Ö× Ô Ö ÕÙ × ÙØ Ó ÓÖÖ Ø Ñ ÒØ º Ð Ñ ×ÑÓ ÑÓ Ó¸ ÐÙ Ó Ð Ù ÓÒ Ð ­Ù Ó¸ Ð ×Ø Ó Ö Ñ Ó Ø Ð ÓÖÑ ÕÙ Ò ÙÑÔÐ Ö× Ð ÙÒ × ÔÓר ÓÒ ¹ ÓÒ ×º ÔÖ ÓÒ ÓÒ Ó ÔÓר ÓÒ ÓÒ ÒÓ × ÓØÖ Ó× ÕÙ ÙÒ ÒÚ Ö ÒØ º Ð ÙÒÓ× ÑÔÐÓ× ÔÙ Ò Ð Ö ¬ Ö Ð º Ë × Ò Ö ÑÓ× ÙÒ ÔÖ Ñ Ø Ú Ô Ö Ð ÙÐ Ö Ð Ö Þ Ù Ö √x ÙÒ ÒÙÑ ÖÓ Ö Ð¸ ÒØÓÒ × × × Ð ÓÐÓ Ö ÓÑÓ ÔÖ ÓÒ ÓÒ Ð ÔÖ Ó x ≥√ º Ä Ú ÓÐ ÓÒ 0 ר ÔÖ ÓÒ ÓÒ Ú Ò Ö ÕÙ Ò Ð ÙÒ Ô ÖØ ¸ ÒØ × ÒÚÓ √Ö x¸ × ÓÑ Ø Ó ÙÒ ÖÖÓÖº Ð Ñ ×ÑÓ ÑÓ Ó¸ ÔÓ Ö ÑÓ× ÓÐÓ Ö ÓÑÓ ÔÓר ÓÒ ÓÒ x2 = x¸ ÙÝ Ú ÓÐ ÓÒ¸ ÓÒ ÓÒ ÕÙ Ð ÔÖ ÓÒ ÓÒ ÒÓ Ý × Ó Ú ÓÐ ¸ ÔÖÓ Ð Ñ ÒØ Ò Ö ÙÒ ÖÖÓÖ Ò Ð ÒרÖÙÑ ÒØ ÓÒ √xº ÍÒ Ú ÒØÙ Ð Ù ×Ø ÓÒ Ñ ÒØÓ Ð × ÒÚ Ö ÒØ × × ÕÙ ×Ø × ÓÒ×ÙÑ Ò Ø ÑÔÓ ¹ Ù ÓÒº ÓÒ× Ù ÒØ Ñ ÒØ ¸ ×Ù Ù×Ó Ü × ÚÓ ÔÙ ÑÔ Ø Ö Ð Ø ÑÔÓ Ù ÓÒº ÆÓØ ¹ ÑÓ× ÕÙ ×Ø Óר ¸ ÙÒÕÙ ÓÒר ÒØ ¸ ÐÑ ÒØ ÔÙ ØÓÖÒ Ö× ÓÒ ÖÓ×Ó × ¸ ÔÓÖ ÑÔÐÓ¸ ר ÓÒØ Ò Ó ÒØÖÓ ÙÒ Ð ÞÓº ÈÓÖ × Ö ÞÓÒ¸ ÑÙ Ó× ÔÖÓ Ö Ñ ÓÖ × ×ÙÔ Ø Ò Ð Ù×Ó ÒÚ Ö ÒØ × Ð Ó Ó × ÖÖÓÐÐÓ Ý ÒÓ Ð Ó Ó ÔÖÓ Ù ÓÒº ÈÓÖ ÐÓ Ò Ö Ð¸ Ò C Ý Ð C++¸ ×ØÓ × ÙØÓÑ Ø Þ Ñ ÒØ Ñ ÖÓ× ÓÒ ÓÒ Ð ×º Ä Ñ Ò Ö Ø Ô × ÓÑÔ Ð Ö ÒÚ Ö ÒØ × × Ð Ñ ÖÓ DEBUG ר ¬Ò Óº
  • 244.
    218 Cap´ ıtulo 3. Cr´ ıtica de algoritmos Ò ÑÙ × Ó × ÓÒ × × ÑÔÓÖØ ÒØ Ö Ð × ÒÚ Ö ÒØ × Ò Ó Ó ÔÖÓ Ù ÓÒ¸ ÔÙ × ÖÖÓ Ò Ò Ó× Ó ÙÖÖ Ò ÖÖÓÖº Ò ×Ø × Ó × ÓÒ ×¸ ÒÓ × ÓÖØ Ö Ð ÔÖÓ Ö Ñ º Ä Ð ÓØ ר Ò Ö C ÓÒØ Ò ÙÒ ÙÒ ÓÒ ÐÐ Ñ assert(predicado)¸ ÙÝ ÙÒ ÓÒ × Ú Ö ¬ Ö ÙÒ ÒÚ Ö ÒØ º ÆÓ Ó ×Ø ÒØ ¸ ר ÔÖ Ñ Ø Ú × ÓרÓ× Ò Ø ÑÔÓ Ù ÓÒ¸ Ö ÞÓÒ ÔÓÖ Ð Ù Ð ×Ù Ù×Ó × Ù ×Ø ÓÒ Ð Ô Ö Ó Ó ÔÖÓ Ù Ø ÚÓº Ü ×Ø Ò Ð ÓØ × ×Ô Ð Þ × Ò Ð Ù×Ó ÒÚ Ö ÒØ ׺ ÉÙ Þ ÙÒ Ð×Ñ× ÔÓÔÙÐ Ö × × GNU nana ¿¼ ¸ ÙÝ × ÓÒ ×¸ Ö ×Ô ØÓ Ð assert() ØÖ ÓÒ Ð¸ ÔÙ Ò Ö ×ÙÑ Ö× Ò ½º × Ò Ô Ö Ð ¬ Ò Ò ÙÖ ÓÒ Ý ×Ô Óº Ó¸ Ð Ú Ö ¬ ÓÒ × Ø Ò ¬ ÒØ ÕÙ ÑÙ × Ú × ÒÓ Ú Ð Ð Ô Ò Ð Ñ Ò Ö ÒÚ Ö ÒØ × Ò Ð Ó Ó ÔÖÓ¹ Ù ÓÒº ¾º Ä ÓÒ ØÓÑ Ö ÒØ ÙÒ Ú ÓÐ ÓÒ ÒÚ Ö ÒØ × ÓÒ¬ ÙÖ Ð º Ë ÔÙ ¸ ÒØÖ ÓØÖ × Ó× × ´ µ ÅÓ ¬ Ö Ð ÓÒ ØÓÑ Ö ÒØ ÙÒ Ú ÓÐ ÓÒ ÒÚ Ö ÒØ ÔÓÖ ÑÔÐÓ׸ ÓÖØ Ö× ¸ Ö Ò Ö¸ ÒÚ Ö ÙÒ ÔÙÖ ÓÖ Ó¸ × ÑÔÐ Ñ ÒØ ¸ Ö ÔÓÖØ Ö Ý ÓÒØ ÒÙ Öº ´ µ À Ð Ø Ö Ó × Ð Ø Ö × Ð Ø Ú Ñ ÒØ Ð Ú ÐÙ ÓÒ ÒÚ Ö ÒØ ׸ Ø ÒØÓ Ù¹ Ö ÒØ Ð ÓÑÔ Ð ÓÒ ÓÑÓ ÙÖ ÒØ Ð Ù ÓÒº ¿º ÒÖ ÕÙ ÓÒ ÓØÖ × Ð × × ÓÖÑ Ð × ÔÖ Ñ Ø Ú × ÕÙ Ô ÖÑ Ø Ò Ú Ö ¬ ÓÒ × Ò¹ Ú Ö ÒØ × Ñ × ÓÑÔР׺ º Å ÓÒ ÔÖ × Ý ÔÓÖØ Ø Ð Ð Ø ÑÔÓ Ù ÓÒº Î ÑÓ× Ð ÙÒ × Ð × ÔÖ Ñ Ø Ú × GNU nana Ñ × ÑÔÓÖØ ÒØ × Ô Ö Ñ Ò Ö ÒÚ Ö ¹ ÒØ × Invariantes basadas en asertos ר Ð × ÒÚ Ö ÒØ ׸ Ð ÔÖ Ò Ô Ð × void I(pred) Ä Ù Ð Ú Ö ¬ ÕÙ pred × ÖØÓ¸ Ò ÙÝÓ ×Ó Ò Ø ÚÓ ÑÔÖ Ñ ÙÒ Ñ Ò× ÖÖÓÖ Ý ÓÖØ º ÍÒ ÓÖÑ ÓÒ ÓÒ Ð Ú ÐÙ Ö ÙÒ ÒÚ Ö ÒØ × Ñ ÒØ void IG (bool pred, bool cond) Ä Ù Ð Ú ÐÙ Ð ÔÖ Ó pred ÓÑÓ ÒÚ Ö ÒØ ×ÓÐÓ × Ð ÔÖ Ó cond × ÖØÓº ר ÓÖÑ Ô ÖÑ Ø ¬Ò Ö ×Ó× ×Ô Ð ×º Ú × × Ò × Ö Ó Ñ ÒØ Ò Ö ×Ø Ó ÔÖ Ú Ó¸ ÔÓÖ ÐÓ Ò Ö Ð ×ØÓ Ó ÙÖÖ ÓÒ Ð × ÔÓר ÓÒ ÓÒ ×º Ò ×Ø ×Ó¸ ×ÓÒ ÒØ Ö × Ð × × Ù ÒØ × ÔÖ Ñ Ø Ú × ¯ void ID (instrucci´n) Ô ÖÑ Ø o ÙØ Ö ÙÒ ÒרÖÙ ÓÒ¸ ÒÓÖÑ ÐÑ ÒØ ¸ ÙÒ Ð Ö ÓÒ Ú Ö Ð º ¯ void IS (Asignaci´n) o Ô ÖÑ Ø Ö Ð Þ Ö ÙÒ × Ò ÓÒ ÙÒ Ú Ö Ð ÐÖ Ó ID()º ÙÒÕÙ ID() IS() ×ÓÒ × ÒØ Ø Ñ ÒØ × Ñ Ð Ö ×¸ Ð ÔÖ Ñ ÖÓ Ù× Ö× Ô Ö Ð Ö Ö Ý Ð × ÙÒ Ó Ô Ö × Ò Ö¸ ÔÙ × Ð Ó Ó Ò Ö ÓÒ ÒØ ¬ ÓÒ ×ÙÑ ×Ø ÙÒ ÓÒ Ð º
  • 245.
    3.4. Correctitud dealgoritmos 219 ØÙ ÙÒ × Ò ÓÒ ÓÒ ÓÒ Ð ¯ void ISG (instrucci´n, bool pred) o ÕÙ Ð ÔÖ Ó pred × ÖØÓº ÈÓÖ ÑÔÐÓ¸ ÙÒ Ó Ó ÕÙ Ð ÙÐ Ð Ö Þ Ù Ö ÙÒ ÒÙÑ ÖÓ Ö Ð ÔÓ Ö ÔÐ ÒØ Ö× Ð × Ù ÒØ ÑÓ Ó ¾½ Ö Þ Ù Ö ¾½ ≡ float ra´z_cuadrada(const float & x) ı { I(x >= 0); // precondici´n exigiendo que x sea positivo o // c´lculo de la ra´z de x, el cual se guarda en ret_val a ı I(ret_val*ret_val == x); // Resultado debe ser igual a x ID(float ret_plus = ret_val + 1); // Declara variable adicional I(x < ret_plus*ret_plus); // y menor que el producto (ret_val+1)^2 } × Ð Ð Ò Ù C × ÔÓ× Ð ÓÐÓ Ö ÙÒ × Ù Ò ÒרÖÙ ÓÒ × ÓÑÓ ÙÒ ×ÓÐ × Ô Ö × ÔÓÖ Ð ÓÔ Ö ÓÖ ÓÑ º ×ØÓ × ÑÔÓÖØ ÒØ Ö × ÐØ Ö Ò ×Ø ÓÒØ ÜØÓ¸ ÔÓÖÕÙ × ÐÓ ÕÙ Ô ÖÑ Ø Ò ÐÓ Ö ÙÒ × Ù Ò ÓÑÔÐ Ø ÒרÖÙ ÓÒ × Ò Ð ÙÒ ÔÖ Ñ Ø Ú ÒÚ Ö ÒØ × ÔÓÖ ÑÔÐÓ ID(int i = 0, j = x + y); Verificaci´n por cuantificadores de l´gica de predicados o o ÖÚ Ó Ð Ð Ö ÔÖÓ Ö Ñ ÓÒ ÔÓÖ ÓÒØÖ ØÓ× ¾ ¸ GNU nana Ó Ö Ú Ö ¬ ÓÒ × Ñ × Ö ¬Ò × Ó Ð ÓÖÑ Ù ÒØ ¬ ÓÖ × ÐÓ Ó׺ ÒØÖ ÐÓ× Ñ × ÑÔÓÖØ ÒØ × ÔÓ ÑÓ× Ò Ö ¯ bool A(inicio,condici´n,iteraci´n,pred) o o ÓÖÖ ×ÔÓÒ ÒØ Ð Ù ÒØ ¬¹ ÓÖ Ô Ö ØÓ Ó ´∀µ¸ Ð Ù Ð × ÓÖÖ ×ÔÓÒ ÓÒ for (inicio; condici´n; iteraci´n) o o if (condici´n) return false; o return true; ¯ bool E (inicio,condici´n,next,pred) o ÓÖÖ ×ÔÓÒ ÒØ Ð Ù ÒØ ¬ ÓÖ Ü ×Ø Ò Ý ÕÙ × ¬Ò × for (inicio; condici´n; iteraci´n) o o if (pred) return true; return false; × Ö¸ × ÖØÓ × Ð Ñ ÒÓ× Ò ÙÒ Ð × Ø Ö ÓÒ × × ÙÑÔÐ Ð ÔÖ Óº ¯ long C (inicio,condici´n,next,pred) ÓÒØ ÓÖ o Ó ÙÖÖ Ò × ÙÒ ÔÖ ¹ Ó ÓÒ× ×Ø ÒØ Ò int count = 0; for (inicio; condici´n; iteraci´n) o o if (pred) ++count;
  • 246.
    220 Cap´ ıtulo 3. Cr´ ıtica de algoritmos return count; ¯ bool E1 (inicio,condici´n,next,pred) o Ú Ö ¬ ÕÙ Ð ÔÖ Ó × ÙÑÔÐ Ü Ø Ñ ÒØ ÙÒ Ú Þº Ë ÔÙ ÒØ ÖÔÖ Ø Ö Ð × Ù ÒØ Ñ Ò Ö bool seen = false; for (inicio; condici´n; iteraci´n) o o if (pred) if (seen) return false; else seen = true; return seen; ÓÑÓ ÑÔÐÓ¸ ÓÒ× Ö ÑÓ× Ú Ö ¬ Ö Ð Ô ÖØ Ò Ò Ü ÐÙ× Ú ÙÒ Ð Ñ ÒØÓ ×¹ Ô ¬ Ó ÙÒ Ð ×Ø ÒÐ Þ ¾¾¼ Ô ÖØ Ò Ò Ð ×Ø ÒÐ Þ ¾¾¼ ≡ E1(typename DynDlist::iterator<int> it(l), it.has_current(), it.next(), it.get_current() == x); Í× × DynDlist ¿ º Ò ×Ø ÔÙÒØÓ × Ñ Ò ×Ø Ö × Ò Ð Ö ÕÙ GNU nana ÔÓ× ÐÓ× Ñ ×ÑÓ× Ø ÔÓ× Ù ÒØ ¬ ÓÖ × × Ò Ð Ó× Ô Ö ÓÒØ Ò ÓÖ × Ð Ð ÓØ ר Ò Ö C++º GNU nana × ÙÒ Ð ÓØ ÑÙ Ó Ñ × Ö ¸ Ø ÒØÓ Ò ×Ô ¬ ÓÒ ÒÚ Ö ÒØ ׸ ÓÑÓ Ò ÓØÖ × ÙÒ ÓÒ Ð ×º Ä × Ø Ò Ñ ÒØ Ð Ñ ÒÙ Ð ¿¼ Ô Ö Ñ × Ò ÓÖÑ ÓÒº Pruebas ÍÒ ÔÖÙ × ÙÒ ÜÔ Ö Ñ ÒØÓ ÓÒ× ×Ø ÒØ Ò ÙØ Ö Ð ÔÖÓ Ö Ñ Ô Ö Ú Ö ¬ Ö × ÙÒ ÓÒ ÓÖÖ Ø Ñ ÒØ º ÖÓ××Ó ÑÓ Ó¸ Ü ×Ø Ò Ó× Ø ÔÓ× ÔÖÙ ´½µ Ò Ö¸ Ò Ð Ù Ð × ×Ø Ð Ò ÒØÖ × Ý × Ð × ÓÖÖ Ø × Ú Ö ¬ Ö× ÙÖ ÒØ Ð ÜÔ Ö Ñ ÒØÓ Ý ´¾µ Ð Ò ¸ Ò Ð Ù Ð × Ø ÖÑ Ò Ò ÒØÖ × ÕÙ Ú Ö ¬ÕÙ Ò ÕÙ Ð ­Ù Ó Ô × ÔÓÖ ØÓ × Ð × Ô ÖØ × Ð ÔÖÓ Ö Ñ º ÈÓÖ ØÖ ÓÒ¸ Ð × ÔÖ٠׸ Ò Ô ÖØ ÙÐ Ö Ð × ¹Ò Ö ¸ Ð × Ö Ð Þ Ò Ô Ö×ÓÒ × ×Ø ÒØ × Ð Ó ¬ ÓÖ ÐÐ Ñ × ÔÖÓ ÓÖ × ´Ø ר Ö×µº Ä × ÔÐ Ò ÑÔ ÖØ ÔÓÖ Å Ù Ö ¾½ ´Ú Ö Ü ¿º º¿º½ ´Ô Ò ¾¼ µµ ÓרÙÑ Ö ÕÙ ÙÒ ÔÖÓ Ö Ñ ÓÖ × ÑÔÖ Ö Ð ÔÖÙ × Ð Ò Ô Ö ØÓ Ó ×Ù Ó Óº Ü ×Ø ØÓ ÙÒ Ò Ô Ö ÔÖÓ Ö ÔÖÓ Ö Ñ × ÙÝÓ Ñ ØÓ Ý ÜØ Ò× ÓÒ ×Ø Ò Ù Ö Ð Ò Ò ×Ø Ø ÜØÓº Ñ × ÐÓ× Ó× ÙØÓÖ × ÒØ Ö ÓÖ ×¸ Ð Ñ ÓÖ Ö Ö Ò ÕÙ × ×Ø Ö ØÓÖ ÓÒÓ Ô Ö Ð ÖØ Ð × ÔÖÙ × × Ø ØÙÐ Ì ÖØ Ó ËÓ ØÛ Ö Ì ×Ø Ò ÔÓÖ º º ÅÝ Ö× ¾ º Generaci´n autom´tica de prueba o a Ò Ð Ö Ø Ð Ò × ÖÖÓÐÐ Ó ÙÒ Ø Ò ¸ ÔÖ Ñ Ò Ñ ÒØ × Ò Ò Ð × × ×Ø Ø Ó Ð Ó Ó Ù ÒØ ¸ ÓÒ× ×Ø ÒØ Ò Ò Ö Ö ÒØÖ × Ð ÔÖÓ Ö Ñ ÕÙ ÙØ Ò ØÓ Ó ÐÓ× Ñ ÒÓ× Ù ÓÒ ÔÓ× Ð × Ð ÔÖÓ Ö Ñ º Ô ÖØ Ò ÓÒØÖ Ö Ð × ÒØÖ × ÕÙ Ù Ö Ò ØÓ Ó× ÐÓ ×Ó× ÔÓ× Ð ×¸ × Ò Ö Ò ÒØÖ × ÕÙ ×ÓÑ Ø Ò Ð ÔÖÓ Ö Ñ Ñ Ü ÑÓ× × Ù ÖÞÓ× × ÙÒ × ÑÔ ÒÓ¸ ÓÒ ÓÒ × Ö Ø × ÓÒ ÙÖÖ Ò ¸ × ÙÖ ¸ Ø Ø Ö ¸ ÕÙ
  • 247.
    3.4. Correctitud dealgoritmos 221 Ò Ô ÖÑ Ø Ó Ò ÓÒØÖ Ö ÖÖÓÖ × Ò Ñ Ò ÓÖ × × ×Ø Ñ Ö ÚÓ Ò ÔÖÓ Ù ÓÒ × ÒÓ׺ Manejo de memoria Ð Ñ Ò Ó Ñ ÑÓÖ Ò Ñ × ÙÒ Ù ÒØ ÖÖÓÖ Ø Ò ÓÑÙÒ ÕÙ Ñ Ö ÓÒ× Ö Ö ×Ø ×Ù ¹× ÓÒ Ð × ¬ Ö Ý × Ö Ö Ð × Ð × × ÖÖÓÖº Fugas de memoria (memory leaks) ÍÒ Ù Ñ ÑÓÖ Ó¸ Ò Ò Ð ×¸ ÙÒ Ñ ÑÓÖÝ Ð × ÙÒ ÐÓÕÙ ÕÙ × Ö × ÖÚ Ý ÕÙ Ñ × Ò Ð Ú Ð ÔÖÓ Ö Ñ × Ð Ö º ÈÓÖ ÑÔÐÓ¸ × Ø Ò ÑÓ× Ð × Ù ÒØ Ò ¬ ÒØ ¸ Ò Ð ÒØ Ò ÓÖÖ Ø Ú Ö× ÓÒ Ð swap() ÒØÖ ÖÖ ÐÓ× void array_swap(int * a, int * b, const size_t n) { int * tmp = new int [n]; for (int i = 0; i < n; ++i) tmp[i] = a[i]; for (int i = 0; i < n; ++i) a[i] = b[i]; for (int i = 0; i < n; ++i) b[i] = tmp[i]; } ÒØÓÒ ×¸ Ú Þ ÕÙ × ÒÚÓÕÙ array swap() × Ö Ô ÖØ Ó¸ Ô Ö × ÑÔÖ ¸ ÙÒ ÖÖ ÐÓ tmp n Ð Ñ ÒØÓ׺ Ë array swap() × ÒÚÓ Ñ ÒÙ Ó¸ ÒØÓÒ × Ð ÔÖÓ Ö Ñ ÓÐ Ô× Ö Ò ÔÓ Ó Ø ÑÔÓ ÔÓÖ ÐØ Ñ ÑÓÖ º Ä Ö Ð Ô Ö Ú Ø Ö ×Ø ÖÖÓÖ × ÕÙ ØÓ Ó ÐÓÕÙ Ñ ÑÓÖ Ð Ö Ö× ÒÑ ¹ Ø Ñ ÒØ ×ÔÙ × ÕÙ ×Ø Ý ÒÓ × Ö ÕÙ Ö º Acceso fuera de bloque Å ÒÓ× Ö Ù ÒØ ÕÙ ÙÒ Ù Ñ ÑÓÖ ¸ Ø Ñ Ò ÓÑÙÒ Ý¸ Ñ ÒÙ Ó¸ Ñ × Ö Ú ¸ ÙÒ ×Ó Ù Ö ÐÓÕÙ ÓÒ× ×Ø Ò Ð Ð ØÙÖ Ó × Ö ØÙÖ ÙÒ ÞÓÒ Ñ ÑÓÖ ÕÙ ÒÓ × Ô ÖØ Óº Ð ×Ó Ñ × Ø Ô Ó × × Ö Ö Ù×ØÓ ×ÔÙ × Ð ¬Ò ÙÒ ÐÓÕÙ Ñ ÑÓÖ Ö × ÖÚ Ó ÓÒ malloc() Ó newº ÈÓÖ ÑÔÐÓ int * tmp = new int [n]; for (int i = 0; i <= n; ++i) tmp[i] = a[i]; ר Ó Ó ÓÒ ÖØ ØÙ × Ö Ö ÙÒ ÒØ ÖÓ Ñ × Ò Ð ÖÖ ÐÓ tmpº Ò Ð Ñ ÓÖ ÐÓ× ×Ó׸ Ó ÙÖÖ Ö ÙÒ × Ñ ÒØ Ø ÓÒ ÙÐØ Ò Ð Ô ÓÖ¸ Ð ÖÖÓÖ Ô × Ö Ø ÑÔÓÖ ÐÑ ÒØ × Ô Ö Ó ×Ø ÕÙ Ø ÑÔÓ ×ÔÙ × ´ÕÙ Þ ÑÙ Ó ×ÔÙ ×µ ÔÖ × ÒØ × ÒØÓÑ × Ø Ñ Ò ÖÖ Ø Ó× Ò Ð × ÒØ Ó ÕÙ ×ÓÒ Ú Ö Ð ×¸ ÔÙ Ò Ó × Ö¸ Ò ÐÙ× Ú ¸ Ò ÓÐ × Ò Ö¹ ÒÓ ´ × Ò Ù µ ¾¾ º ¾¾ ÈÓÖ Ð Ð Ö × Ó Ð Ñ Ò Ï ÖÒ Ö À × Ò Ö ÕÙ Ò × Ù Ö Ó Ð ÔÖ Ò Ô Ó ÓÑÓÒ ÑÓ Ö Ð ÑÔÓ× Ð Ó × ÖÚ Ö Ð ×Ø Ó Ö Ð ÙÒ Ô ÖØ ÙÐ ØÓÑ ¸ ÔÙ × Ð Ñ ×Ñ Ó × ÖÚ ÓÒ Ñ Ð ×Ø Óº
  • 248.
    222 Cap´ ıtulo 3. Cr´ ıtica de algoritmos Ä Ö Ð Ô Ö Ú Ø Ö ×Ø ÖÖÓÖ × Ð Ó Ú × ÑÔÖ Ö Ú × Ö ÙÖÓ× Ñ ÒØ Ð ×Ó Ñ ÒØ ÙÒ ÔÙÒØ ÓÖº ÈÓÖ × Ö ÞÓÒ¸ ×ÓÒ Ù Ò × ÓרÙÑ Ö × ½º Í× Ö ÒÓÑ Ö × ÔÙÒØ ÖÓ× ÕÙ Ò ÕÙ Ò Ð Ö Ñ ÒØ ÕÙ × ØÖ Ø ÙÒ ÔÙÒØ ÖÓº Ð Ñ Ò ×ÑÓ ÒÓÑ Ö Ñ ÒØÓ ÚÓÖ ØÓ × ×Ù¬ Ö Ð ÒÓÑ Ö ÓÒ ptr ר ÑÓ Ó¸ ÙÒ ÖÖ Ñ ÒØ ר ÐÓ grep ÔÙ Ò ÓÒØÖ Ö Ð × Ó ÙÖÖ Ò × Ù×Ó ÙÒ ÔÙÒ¹ Ø ÓÖ Ý Ô ÖÑ Ø Ö Ð ÔÖÓ Ö Ñ ÓÖ¸ Ó ÙÒ ÖÖ Ñ ÒØ ÙØÓÑ Ø Þ ¸ Ò Ð Þ Ö Ð ÓÖÖ Ø ØÙ º ¾º ×Ð Ð Ù×Ó ÔÙÒØ ÖÓ× ÓÑÓ ÖÖ ÐÓ× Ò ÓÔ Ö ÓÒ × Ò Ö ×¸ Ö Ó Ö Ù× Ð ×¸ ÕÙ ÓÒ ÒØÖ Ò Ð Ú Ö ¬ ÓÒ ÓÖÖ Ø ØÙ Ò ÙÒ ×ÓÐ ÔÓÖ ÓÒ Ó Óº ÍÒ ÑÔÐÓ Ö ÔÖ × ÒØ Ø ÚÓ ÐÓ ÓÒר ØÙÝ Ò Ð × ÙÒ ÓÒ × fill dir to null()¸ release segment()¸ ÒØÖ ÓØÖ × ×Ô ¬ × Ò Ü ¾º½º º¾ ´Ô Ò µº ¿º Ú Ø Ö Ð Ù×Ó Ñ × ÙÒ Ò Ö ÓÒ Ñ ÒØÓ ÔÓÖ ÔÙÒØ ÖÓº ÈÓÖ ÑÔÐÓ **int_ptr = 5; ÒÓ ×Ø Ö Ô ÖÑ Ø Óº Ä Ü Ô ÓÒ ×Ø Ö Ð × Ù Ò Ó × ØÖ Ø Ò ÖÖ ÐÓ× ÓÑÓ ÔÙÒØ ÖÓ× Ý Ø Ò ÑÓ× ÖÖ ÐÓ× ÖÖ ÐÓ׸ Ø Ð × ÓÑÓ ÐÓ ÑÓ׸ ÔÓÖ ÑÔÐÓ× Ô Ö Ð Ñ ØÓ Ó access() DynArray<T> ´Ü ¾º½º º¿ ´Ô Ò ¿µµ Ó ÓÒ ÐÓ× ÖÖ ÐÓ× ÑÙÐØ ¹ Ñ Ò× ÓÒ Ð × ´Ü ¾º¾ ´Ô Ò ½µµº Direcci´n de devoluci´n inv´lida o o a ÍÒ ÒÚÓ ÓÒ Ü ØÓ× malloc() Ó new Ö ØÓÖÒ ÙÒ ÔÙÒØ ÖÓ Ð ÐÓÕÙ Ö × ÖÚ Óº Ð Ñ Ò ×ÑÓ ÚÓÐÙ ÓÒ¸ Ñ ÒØ free() Ó delete¸ Ö Ö Ü Ø Ñ ÒØ Ð Ñ ×ÑÓ Ú ÐÓÖ ÔÙÒØ ÖÓ ÕÙ ÒØÖ Ó malloc() Ó deleteº Ä Ö Ö ÙÒ Ö ÓÒ Ñ ÑÓÖ ÕÙ ÒÓ Ý × Ó Ö ØÓÖÒ ÔÓÖ Ð Ñ Ò ÓÖ Ñ ÑÓÖ ×¸ Ô٠׸ ÙÒ × Ö Ó ÖÖÓÖ ÔÖÓ Ö Ñ ÓÒ ÕÙ ÓÑÔÖÓÑ Ø Ð ×Ø Ó Ð ÔÐ ÓÒ Ý ÙÝ × ÓÒ× Ù Ò × ×ÓÒ Ò ÖØ × Ý¸ ÔÓÖ ÐÓ Ò Ö Ð¸ Ô ÖÑ Ò Ò Ò Ø Ø Ð × ÙÖ ÒØ Ð ÙÒ Ø ÑÔÓº ÒØÖ Ö ÙÒ Ö ÓÒ ÒÚ Ð Ð Ñ Ò ÓÖ Ñ ÑÓÖ × ÙÒ ÖÖÓÖ Ñ × ÓÑÙÒ ÐÓ ÕÙ ÔÙ Ö Ô Ò× Ö× º ÉÙ Þ Ð ×Ó Ñ × Ö Ù ÒØ Ó ÙÖÖ ÓÒ ÔÙÒØ ÖÓ× ×Ó Ö Ð × × Ö Ú × Ý Ð ÙÒ × ØÖ Ò× ÓÖÑ ÓÒ × Ö ×ÙÐØ ÒØ × Ð ×Ø Ò º ÇØÖ ÔÓ× Ð ×Ù Ù Ò Ó × Ñ Ò Ò ÑÙÐØ ¹ רÖÙ ØÙÖ × ÔÓÖ ÑÔÐÓ¸ ÙÒ ÑÙÐØ ¹Ð ר º Verificadores din´micos de memoria a ÄÓ× ÖÖÓÖ × Ñ ÑÓÖ Ù ÖÓÒ ÙÒ Ô Ö ÒÒ ÓÐÓÖ Þ Ò Ð Ô × Ó ×Ø ÕÙ Ô Ö ÖÓÒ ÔÖÓ Ö Ñ ×¸ Ò ×Ù Ñ ÝÓÖ Ò ÓÖÑ Ð ÓØ ׸ Ô Ö Ø Ø ÖÐÓ× × Ò Ó ÐÓ× Ñ × ÔÓÔÙÐ Ö × ÒØÖ ÐÐÓ× electric fence ½ Ý dmalloc ½ º ÓÒ ×Ø ×ÕÙ Ñ × Ö ÕÙ Ö ÝÙ Ð ÔÖ ÔÖÓ × ÓÖ¸ Ð Ù Ð ÒÓ ×Ø ÓÑÔÐ Ø Ñ ÒØ ×ÔÓÒ Ð Ò C++ Ý Ð Ò Ò Ñ ÒØÓ ÙÒ Ð ÓØ ¸ Ð Ù Ð ÒØ Ö ÔØ Ð × ÐÐ Ñ × malloc() Ý free()º ÍÒ ÒÙ ÚÓ Ý Ú Ö× Ø Ð ÔÖÓ Ö Ñ Ú Ö ¬ ÓÒ Ô Ö Ó Ö ÒØ Ñ ÒØ valgrind ¾ ¸ ¾ ¸ Ð Ù Ð ÒÓ Ö ÕÙ Ö Ð ÓØ × ÒÓ ÕÙ ÒØ Ö ØÙ ×Ó Ö Ð ÙØ Ð Ö ×ÙÐØ ÒØ º ÄÓ× Ñ Ò ×ÑÓ× Ø ÓÒ ×ÓÒ ÐÓ× Ñ ×ÑÓ׺ Ò ÔÖ Ñ Ö ÐÙ Ö¸ Ö ÓÒ ÐÓÕÙ Ñ ÑÓÖ ¸ ÙÒØÓ ÓÒ ×Ù ÔÓ× ÓÒ Ü Ø Ö × ÖÚ ÓÒ¸ Ð Ò Ý ÒÓÑ Ö Ð Ö ÚÓ¸ × ÒÓØ Ò ÙÒ Ø Ð Ñ Ò Ö Ø Ð ÕÙ Ð ¬Ò Ð Ð ÔÖÓ Ö Ñ Ð × ÒØÖ × Ò Ð Ø Ð
  • 249.
    3.5. Eficacia yeficiencia 223 ÓÖÖ ×ÔÓÒ Ò Ù × Ñ ÑÓÖ º Ð Ñ ×ÑÓ ÑÓ Ó¸ ÙÒ ÒØÖ Ö ÓÒ ÒÚ Ð ÔÙ Ø Ø Ö× ÔÓÖÕÙ Ð Ö ÓÒ ÒÓ × Ò Ù ÒØÖ Ò Ð Ø Ðº Ù Ò Ó × ×ÓÐ Ø ÙÒ ÐÓÕÙ ¸ × Ô ÖØ ÙÒ ÔÓ Ó Ñ × Ñ Ò Ö Ø Ð ÓÐÓ Ö Ö × ¸ Ð × Ù Ð × ×ÓÒ ÞÓÒ × ÓÒ Ú ÐÓÖ × ×Ô Ð ×¸ Ð Ó Ð ÐÓÕÙ ¸ ÔÓ ÔÓ× Ð × Ö ØÙÖ ¸ Ý ÙÝ Ô ØÓÖ Þ ÓÒ × ÓÑÓ × Ù ptr Ð Ð Ö Ö ÙÒ ÐÓÕÙ Ñ ÑÓÖ × Ö Ú × Ð Ú ÐÓÖ Ð Ö ¸ × ×Ø × Ö ÒØ Ð Ò Ó¸ ÒØÓÒ × ÔÙ × Ö × ÒØÓÑ ÕÙ × × Ö ØÓ ÔÓÖ Ù Ö ÙÒ ÐÓÕÙ º Ä × Ú Ö ¬ ÓÒ × ÒØ Ö ÓÖ ×¸ Ò Ô ÖØ ÙÐ Ö¸ Ð × Ö ×¸ ÒÓ Ö ÒØ Þ Ò Ø ÓÒ Ô Ö ØÓ Ó× ÐÓ× ×Ó׺ Ð Ò ÓÕÙ valgrind × Ð Ó × Ñ Ð Ö ÐÓ× ×Ó× ÒØ Ö ÓÖ × Ô ÖÓ ÒÓ ÒØ Ö ÔØ Ð Ð ÓØ Ò × º Ò ×Ù ÐÙ Ö¸ valgrind ÒØ Ö ÔØ ¸ ×Ó Ö Ð ÙØ Ð ¸ Ð × ÐÐ Ñ × Ö Ø × Ö × ÖÚ ÓÒ Ñ ÑÓÖ ´malloc()¸ free()¸ sbrk()¸ new¸ delete¸ ºººµ ݸ Ò Ò ÙÖ ¸ ÒØ Ö ÔØ ÐÓ× ×Ó× Ñ ÑÓÖ Ý ÓØÖ × ÓÔ Ö ÓÒ × Ð ×º ÄÙ Ó ÙØ Ð ÔÖÓ Ö Ñ Ý¸ ÙÖ ÒØ Ð Ù ÓÒ Ú Ú Ö ¬ Ò Ó Ý Ö ÔÓÖØ Ò Ó ÐÓ× Ú ÒØÙ Ð × ÖÖÓÖ ×º valgrind ×Ñ ÒÙ Ó Ö Ò Ó× Ñ ÒØ Ð Ø ÑÔÓ Ú Ö ¬ ÓÒ Ò ÐÓ ÕÙ ÓÒ ÖÒ Ð Ñ Ò Ó Ñ ÑÓÖ Ý ÓØÖ × Ð × × ÖÖÓÖ ×º Ó ÐÓ× Ó× Ò ÓÕÙ ÔÖ × ÒØ Ó׸ Ð ÔÖÓ Ö Ñ × ÙØ ÓÒ× Ö Ð Ñ ÒØ Ñ × Ð ÒØÓ¸ ÐÓ ÕÙ Ò Ö ÙÒר Ò × ×Ô Ð × ÔÙ Ö ×Ù Ù×Ó ÓÑÔÐ Óº Depuradores Ú ×¸ ÙÒ ÖÖÓÖ ÒÓ × Ø Ø ÔÓÖ ÐÓ× Ò Ð Þ ÓÖ × ×Ø Ø Ó× Ó Ò Ñ Ó× × ÒÓ ÕÙ × ÓÒÓ ×Ù ÔÖ × Ò ÔÓÖÕÙ Ð ÔÖÓ Ö Ñ ÖÖÓ Ö ×ÙÐØ Ó× Ò ÓÖÖ ØÓ׺ ËÙ Ù×ÕÙ × ÙÒ ÖØ ÕÙ Ô Ò Ð ÜÔ Ö Ò ¸ Òר ÒØÓ ÒØÙ ÓÒ Ð ÔÖÓ Ö Ñ ÓÖ Ô Ö Ò ÓÒØÖ Ö Ô ÖØ × ÕÙ Ó Ö Þ Ò Ô ×Ø × Ö Ð ÖÖÓÖº Ò ×Ø ÓÖ Ò ×¸ ÙÒ Ð× Ð×× ÔÖÓ Ö Ñ × Ñ × ÙØ Ð × ÕÙ Ü ×Ø Ò ×ÓÒ ÐÓ× ÔÙÖ ÓÖ ×¸ ÔÖÓ Ö Ñ × ×Ô Ð Þ Ó× Ò Ó × ÖÚ Ö Ð Ù ÓÒ Ð ÔÖÓ Ö Ñ Ý Ö Ð ÓÒ ÖÐ Ð Ó Ó Ù ÒØ º ÍÒÓ ÐÓ× ÔÙÖ ÓÖ × Ñ × Ð Ö × × Ð GNU gdb ¿ ¸ ÙÒØÓ ÓÒ Ð ÙÒÓ× ×Ù× ÖÓÒØ Ð × ´ ÖÓÒØ¹ Ò × µ¸ Ø Ð × ÓÑÓ Ð ddd º 3.5 Eficacia y eficiencia ר × ÐØÙÖ × Ð × ÙÖ×Ó¸ ÒÓ× × Ö Ð ÖÓ ÕÙ Ð ¬ ÔÖ Ñ Ð ¬ Ò º Ð ¬Ò Ð Ù ÒØ ׸ ÕÙ Ú Ð Ð Ó ÑÙÝ ¬ ÒØ × ÒÓ × ÓÖÖ ØÓ º ÈÙ × Ò¸ Ò Ð ÙÒÓ× ÔÖÓ Ð Ñ × Ð ¬ ÔÙ ÓÑÔÖÓÑ Ø Ö Ð ¬ Ò Ý Ú Ú Ö× × ÓÖÖ Ø ¹ Ñ ÒØ ¸ ÒØÓÒ × ÔÙ × Ö ÑÙÝ Ò ¬ ÒØ ݸ ÔÓ× Ð Ñ ÒØ ¸ Ò ÔÐ Ð º È Ö ÔÖ Ò Ö Ð Ù ×Ø ÓÒ¸ Ñ Ö ÑÓ× ÙÒ ÑÔÐÓ Ñ ×ØÖ Ð ÑÓ×ØÖ Ø ÚÓ Ð × Ú × ØÙ × ÒÚÓÐÙ Ö × Ò Ð Ö ×ÓÐÙ ÓÒ ÙÒ ÔÖÓ Ð Ñ Ý ÐÓ× ÓÑÔÖÓÑ ×Ó× ÕÙ Ñ ÒÙ Ó × ÔÖ × ÒØ Ò ÒØÖ ÓÖÖ ¹ Ø ØÙ ´ ¬ µ Ý ¬ Ò º Ð × ÙÖ×Ó ×Ø Ò×Ô Ö Ó Ò ËØ Ú Ò Ë Ò ×Ù Ü Ð ÒØ Ð ÖÓ Ì Ð ÓÖ Ø Ñ × Ò Å ÒÙ Ð ¿ º ÓÒ× Ö ÑÓ× ÙÒ ÓÒ ÙÒØÓ P = {p1, p2, p3, . . . , pn} n ÔÙÒØÓ× Ò Ð ÔÐ ÒÓº ÔÙÒØÓ × ¬Ò ÔÓÖ ×Ù× ÓÓÖ Ò × ÖØ × Ò × (x, y)º Ð ÔÖÓ Ð Ñ ÓÒ× ×Ø ¸ ÒØÓÒ ×¸ Ò Ò ÓÒØÖ Ö ÙÒ ÓÖ Ò Ú × Ø ÒØÖ ØÓ Ó× ÐÓ× ÔÙÒØÓ× Ñ Ò Ö Ø Ð ÕÙ Ð ÐÓÒ ØÙ Ð Ö ÓÖÖ Ó × Ñ Ò Ñ º
  • 250.
    224 Cap´ ıtulo 3. Cr´ ıtica de algoritmos ר ÔÖÓ Ð Ñ × ÑÙÝ ÓÑÙÒ Ò ÑÙ Ó× ÓÒØ ÜØÓ׺ ÀÝÚÖ ×ÑÒÖ× ÓÖ Ö Ð ×ÓÐÙ ÓÒ ×Ø ÔÖÓ Ð Ñ º ÉÙ Þ Ð Ñ × Ò × Ñ ÒØ Ð ÙÖ ×Ø Ð Ú ÒÓ Ñ × Ö ÒÓ Ó ÙÒ ÔÙÒØÓ pi¸ Ð ÔÖÓÜ ÑÓ ÔÙÒØÓ ÓÒ Ø Ö × Ð Ñ × Ö ÒÓ piº Ì Ð ÙÖ ×Ø ÓÒÐÐ Ú Ð Ð ÓÖ ØÑÓ ¿º½º 0 0 ÙÖ ¿º ÍÒ ×ÓÐÙ ÓÒ ÓÒ Ð ÙÖ ×Ø Ð Ú ÒÓ Ñ × Ö ÒÓ Algoritmo 3.1 (Camino m´s corto seg´n la heur´ a u ıstica del vecino m´s cercano) a Ä ÒØÖ Ð Ð ÓÖ ØÑÓ × Ð ÓÒ ÙÒØÓ P = {p1, p2, p3, . . . , pn}º Ä × Ð × ÙÒ × Ù Ò¹ S =< p1, p2, . . . , pn >º ½º Ë S =< ∅ > Ð × Ù Ò ÒÙÐ ¾º Ë Ð ÓÒ ÙÒ ÔÙÒØÓ p ∈ P Ý Ò ÐÓ S ¿º P − {p} º Ê Ô Ø Ñ ÒØÖ × P = ∅ ´ µ Ë Ð ÓÒ q ∈ P | q × Ð ÔÙÒØÓ Ñ × Ö ÒÓ p ´ µ ÓÒ Ø Ò q Sº ´ µ P = P − {q} ´ µ p=q º Ä × Ù Ò S × Ð ×ÓÐÙ ÓÒ ×Ø Ð ÓÖ ØÑÓ × ×Ø ÒØ × ÑÔÐ ¸ Ö ÞÓÒ ÔÓÖ Ð Ù Ð × ÑÙÝ Ð ÓÑÔÖ Ò Ö Ý Ö Ð Þ Öº ÈÓ ÑÓ× Ð Ñ Ö¸ Ø Ñ Ò¸ ÕÙ Ð Ð ÓÖ ØÑÓ × ÑÙÝ ¬ ÒØ ÙÒ Ú Þ ÕÙ × ÓÒ Ø Ò ÙÒ ÔÙÒØÓ Ð × Ù Ò S¸ Ð ÔÙÒØÓ ÒÙÒ Ñ × ÚÙ ÐÚ ÓÒ× Ö Ö× º × Ô٠׸ Ð Ø ÑÔÓ Ù ÓÒ × O(n)º Ä Ñ ÒØ Ð Ñ ÒØ ¸ Ð Ð ÓÖ ØÑÓ ÒÓ × ÓÖÖ ØÓ¸ Ý Ô Ö Ô Ö Ø ÖÒÓ× ÐÐÓ¸ ÓÒ× Ö ÑÓ× Ð × Ù ÒØ ÓÒØÖ ÑÔÐÓ¸ ÓÑ ÒÞ Ò Ó × Ð ÔÙÒØÓ 0 ½ ¾ ¿ ¹¾¿ ¹ ¹½ ¼ ½ ¿ ½¿ ÓÒ ×Ø ×ÔÓ× ÓÒ ÔÙÒØÓ׸ Ð Ð ÓÖ ØÑÓ ¿º½¸ Ô Ö Ó Ñ ÒØ ¸ Ù× Ð × × Ù Ò × Ñ × Ð Ö × Ý ÒÓ Ð × Ñ × ÓÖØ ׸ Ð × Ù Ð × ×ÓÒ Ð × Ù ÒØ ÑÓ Ó
  • 251.
    3.5. Eficacia yeficiencia 225 ¹¾¿ ¹ ¹½ ¼ ½ ¿ ½¿ ÓÒ× Ö ÑÓ× ÓØÖ ÙÖ ×Ø Ñ × ÓÑÔÐ ÐÔ Ö ÔÙÒØÓ× Ñ × Ö ÒÓ ¸ Ð Ù Ð ØÖ ÓÒ ÐÓ× ÔÙÒØÓ× ÜØÖ ÑÓ× Ñ ÒÓ× Ô Ö Ð ×º ÙÖ ÒØ Ð Ù ÓÒ Ð Ð ÓÖ ØÑÓ¸ × Ø Ò Ö ÙÒ ÓÒ ÙÒØÓ Ñ ÒÓ× Ô Ö Ð ×º Ð ÔÖÓ Ö ×Ó Ð Ð ÓÖ ØÑÓ ÓÒ× ×Ø Ò Ø Ö¹ Ñ Ò Ö Ý ÓÒ Ø Ö Ð Ô Ö ÔÙÒØÓ× ÜØÖ ÑÓ× Ñ × Ö ÒÓ× ÑÓ Ó Ø Ð ÕÙ Ð ÓÒ Ü ÓÒ × ÙÒ Ñ ÒÓ Ý ÒÓ × ÓÖÑ ÙÒ ÐÓº ר ÙÖ ×Ø ÓÒ Ù Ð Ð ÓÖ ØÑÓ ¿º¾º Algoritmo 3.2 (Camino m´s corto seg´n la heur´ a u ıstica del par de puntos m´s cercano) a Ä ÒØÖ Ð Ð ÓÖ ØÑÓ × Ð ÓÒ ÙÒØÓ P = {p1, p2, p3, . . . , pn}º Ä × Ð × ÙÒ × Ù Ò¹ S =< p1, p2, . . . , pn >º Ð Ð ÓÖ ØÑÓ ÙØ Ð Þ ÙÒ ÓÒ ÙÒØÓ S = {S1, S2, . . . , Sm} Ñ ÒÓ× Ô Ö Ð ×º Ó ÙÒ Ô Ö Ñ ÒÓ× Ô Ö Ð × p1 = (r, s), p2 = (t, v) Ð ÙÒ ÓÒ ×Ø(p1, p20 Ð ÙÐ Ð ×Ø Ò Ñ Ò Ñ ÒØÖ Ð Ô Ö ÔÙÒØÓ× ÜØÖ ÑÓ× ÐÓ× Ñ ÒÓ× p1 Ý p2º Ð Ñ ×ÑÓ ÑÓ Ó¸ Ð ÙÒ ÓÒ ÓÒ Ø Ö(p1, p2) ÓÒרÖÙÝ ÙÒ Ñ ÒÓ Ô Ö Ð¸ ÔÖÓ Ù ØÓ ÓÒ Ø Ö p1 Ý p2¸ Ø Ð ÕÙ Ð ×Ø Ò ÓÒ Ü ÓÒ ÒØÖ p1 Ý p2 × Ñ Ò Ñ º ½º ר Ò = ∞ ¾º S = P × Ö¸ Ò ÐÑ ÒØ ¸ ÐÓ× Ñ ÒÓ× Ô Ö Ð × ×Ø Ò ÓÒ ÓÖÑ Ó× ÔÓÖ ×ÓÐÓ ÔÙÒØÓ× ¿º Ê Ô Ø Ñ ÒØÖ × |S| > 1 ´ µ ∀(r, s), (t, v) ∈ S º Ë ×Ø((r, s), (t, v)) < ר Ò =⇒ º ר Ò = ר((r, s), (t, v)) º p1 = (r, s) º p2 = (t, v) Ð ÙÐÑ Ò Ö ×Ø × ÓÒ¸ p1 Ý p2 ×ÓÒ ÐÓ× Ñ ÒÓ× Ô Ö Ð × Ñ × ÔÖÓÜ ÑÓ׺ ´ µ S = S − p1 − p2 ´ µ p = ÓÒ Ø Ö(p1, p2) ´ µ S = S ∪ {p} º ÓÒ Ø ÐÓ× ÔÙÒØÓ× ÜØÖ ÑÓ× Ð × Ù Ò Ö ×ÙÐØ ÒØ Ò S º ×ØÓ ÓÒ ÓÖÑ Ð ÐÓ ¬Ò к Ð Ð ÓÖ ØÑÓ ¿º¾ ØÖ ÓÖÖ Ø Ñ ÒØ Ô Ö ØÓ × ×ÔÓ× ÓÒ × ÔÙÒØÓ× ÕÙ ÑÓ× ÔÖ × ÒØ Óº È Ö Ð ÑÔÐÓ ÒØ Ö ÓÖ¸ Ð Ð ÓÖ ØÑÓ ÓÑ ÒÞ Ö ÓÒרÖÙÝ Ò Ó ÐÓ× Ñ ÒÓ× Ô Ö Ð × (3, 4)¸ (3, 4, 5)¸ (3, 4, 5, 6)¸ (2, 3, 4, 5, 6)¸ (2, 3, 4, 5, 6, 7) Ý (1, 2, 3, 4, 5, 6, 7)º Ð Ð ÓÖ ØÑÓ ¿º¾ × Ñ × ÓÑÔÐ Ó Ý Ñ ÒÓ× ¬ ÒØ ÕÙ Ð ¿º½¸ Ô ÖÓ ÙÒ ÔÓ ÑÓ× Ö ÕÙ ÙÒ × ¬ ÒØ ¸ ÔÙ × ×ÓÐÓ × ÓÒ× Ö Ò ÐÓ× ÔÙÒØÓ× ÜØÖ ÑÓ× Ñ ÒÓ× Ô Ö Ð × ÐÓ× ÔÙÒØÓ× Ò ÐÙ Ó× Ò Ð Ñ Ó Ñ ÒÓ× Ô Ö Ð × Ñ × ÚÙ ÐÚ Ò ÓÒ× Ö Ö× º ÑÔ ÖÓ¸ Ð ÙÖ ×Ø Ð Ô Ö ÔÙÒØÓ× Ñ × Ö ÒÓ Ø ÑÔÓ Ó × ÓÖÖ Ø º ÓÒ× Ö ¹ ÑÓ× Ð × Ù ÒØ ×ÔÓ× ÓÒ ÔÙÒØÓ×
  • 252.
    226 Cap´ ıtulo 3. Cr´ ıtica de algoritmos 1+d 1 3 5 1−d 2 4 6 1+d ר ×ÔÓ× ÓÒ ×ÓÐÓ Ø Ò Ó× Ø ÔÓ× ×Ø Ò × 1 − d Ý 1 + dº ÍÒ ÔÓ× Ð ÚÓÐÙ ÓÒ Ð ÓÒ ÙÒØÓ S × ÙÒ Ð Ð ÓÖ ØÑÓ ¿º¾ × Ö Ñ × Ó Ñ ÒÓ× Ð × Ù ÒØ S = {(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)} → {(1, 2), (3, 3), (4, 4), (5, 5), (6, 6)} → {(1, 2), (3, 4), (5, 5), (6, 6)} → {(1, 2), (3, 4), (5, 6)} → {(1, 2, 4, 3), (5, 6)} → {(1, 2, 4, 3, 5, 6) ;} ÙÝ ×Ø Ò ØÓØ Ð × 3(1 − d) + 2(1 + d) + (2(1 + d))2 + (1 − d)2º ר ר Ò × Ñ ÝÓÖ ÕÙ Ð Ñ Ò Ñ 4(1 + d) + 2(1 − d)¸ Ù Ð × Ð Ô Ö Ñ ØÖÓ Ð Ö Ø Ò ÙÐÓ ÓÒ ÓÖÑ Ó ÔÓÖ ÐÓ× ÔÙÒØÓ׺ Ð Ð ÓÖ ØÑÓ ¿º¾ ÒÓ ×¸ Ô٠׸ ÓÖÖ ØÓº Ä ÙÒ ×ÓÐÙ ÓÒ ÓÖÖ Ø ÓÒÓ ×Ø ÔÓÖ Ð × Ù ÒØ Ð ÓÖ ØÑÓ Algoritmo 3.3 (Camino m´s corto entre un conjunto de puntos) Ä ÒØÖ a Ð Ð ÓÖ ØÑÓ × Ð ÓÒ ÙÒØÓ P = {p1, p2, p3, . . . , pn}º Ä × Ð × ÙÒ × Ù Ò S =< p1, p2, . . . , pn >º Ð Ð ÓÖ ØÑÓ Ö ÕÙ Ö ÓÒרÖÙ Ö ÙÒ ÓÒ ÙÒØÓ Ω = {ω1, ω2, . . . , ωm} ÓÒ ÓÖÑ Ó ÔÓÖ ØÓ × Ð × Ô ÖÑÙØ ÓÒ × ÔÓ× Ð × ÐÓ× ÔÙÒØÓ× P º ½º ר Ò = ∞ ¾º Ö ×ÙÐØ Ó = ∅ ¿º Ë Ω Ð ÓÒ ÙÒØÓ ØÓ × Ð × Ô ÖÑÙØ ÓÒ × (P) º ∀ω∈Ω ´ µ Ë c Ð ×Ø Ò ØÓØ Ð Ó Ø Ò Ö ÓÖÖ Ö ÐÓ× ÔÙÒØÓ× Ò Ð ÓÖ Ò Ð Ô Ö¹ ÑÙØ ÓÒ ω ´ µ Ë c < ר Ò =⇒ º ר Ò = c º Ö ×ÙÐØ Ó = ω ÌÓ × ÐÓ× ÔÓ× Ð × Ñ ÒÓ× × ÓÒ× Ö Ò Ý ×ÓÐÓ × × Ó Ð Ñ ÒÓÖ Óר º Ð Ð Ó¹ Ö ØÑÓ Ò × × × ÑÔÐ ¸ ÙÒÕÙ ÒÓ ÓÒ× Ö ÓÑÓ ÓÒרÖÙ Ö Ð ÓÒ ÙÒØÓ Ô ÖÑÙØ ÓÒ ×¸ ÐÓ Ù Ð ÒÓ × ÙÒ Ø Ö ÑÙÝ × ÑÔÐ º Ð Ð ÓÖ ØÑÓ ×¸ Ô٠׸ ÓÖÖ ØÓº ÁÒ Ð ÞÑ ÒØ ¸ Ø Ð ÓÑÓ × ÔÐ ÒØ ¸ × Ø Ò Ò ¬ ÒØ ÕÙ ×ÓÐÓ ÔÓ Ö ÙØ Ö× Ò ÓÑÔÙØ ÓÖ × Ú ÒÓ׺ È Ö ÔÖ Ò Ö ×ØÓ Ò Ð ÑÓ× Ð ¬ Ò º
  • 253.
    3.5. Eficacia yeficiencia 227 Ð ÒÙÑ ÖÓ ÜÔÐÓÖ ÓÒ × ÕÙ Ö Ð Þ Ð Ð ÓÖ ØÑÓ ¿º¿ × Ù Ð Ð ÒØ Ô ÖÑÙØ ÓÒ × ÕÙ Ü ×Ø Ò ÒØÖ ÐÓ× n ÔÙÒØÓ× Ó × ¸ O(2n)¸ ÙÒ ¬ Ò ÒØÖ Ø Ð ÙÒ Ô Ö ÔÓ Ó× ÔÙÒØÓ׺ Ú ×¸ Ð ÓÖÖ Ø ØÙ Ý Ð ¬ Ò Ö ÔÖ × ÒØ Ò ÓÒØÖ ÓÒ × Ò× ÐÚ Ð ×º ÙÒÕÙ Ë Ò ÔÖ × ÒØ ר ÔÖÓ Ð Ñ ÓÑÓ ÙÒ ÓÑÔÖÓÑ ×Ó ÒØÖ ÓÖÖ Ø ØÙ ¸ ¬ Ò¹ Ý Ð ÔÖÓ Ö Ñ ÓÒ ¿ ¸ ÐÓ Ù Ð Ò ÖØ Ñ × ÓÖÖ ØÓ¸ × Ö Ô Ö ÑÓ× ÙÒ ÔÓ Ó Ý ÔÐ ÒØ Ö ÑÓ× ÒÙ ×ØÖÓ× Ö ÙÑ ÒØÓ× Ó Ð × × Ù ÒØ × Ó × ÖÚ ÓÒ × ½º Ä Òר Ò Ð ÔÖÓ Ð Ñ Ð Ú Ò ÓÖ Ú ÖÓ ÕÙ ×Ø ÑÓ× ØÖ Ø Ò Ó × Ò Ö Ð Ò Ð × ÒØ Ó ÕÙ × ØÖ Ø Ö ×ÓÐÚ ÖÐÓ Ô Ö ØÓ Ó× ÐÓ ×Ó× ÔÓ× Ð ×º Ë Ò Ñ Ö Ó¸ Ò Ð Ú Ö Ð¸ × × ÑÔÖ × ×ÔÓÒ Ñ × Ò ÓÖÑ ÓÒ Ö Ð × Ð × × ÒØÖ º ÈÓÖ ÑÔÐÓ¸ × × Ö ÕÙ Ö × Ö ×ÓÐÚ Ö Ð ÔÖÓ Ð Ñ Ô Ö ÔÐ Ò ¬ Ö ×ÓÐ ÙÖ × ×Ó Ö ÙÒ Ó Ð Ð ØÖÓÒ ¸ ÒØÓÒ × × × ÕÙ Ð × ÓÒ¬ ÙÖ ÓÒ × ÔÙÒØÓ× ÓÒ ÓÖÑ Ò ÔÓÐ ÓÒÓ× ÑÓÒÓØÓÒÓ× Ý ÕÙ Ô Ö ×ØÓ× Ð ÙÖ ×Ø Ð Ú ÒÓ Ñ × Ö ÒÓ ÖÖÓ ×ÓÐÙ ÓÒ × ÓÖÖ Ø ×º ¾º Ò ÓØÖ × Ó × ÓÒ ×¸ Ð Ö Ò ÒØÖ Ð ×ÓÐÙ ÓÒ ÓÔØ Ñ Ý ÙÒ Ù Ò Ò ÓÒØÖ ÙÖ ×Ø Ñ ÒØ ÒÓ × ÑÙÝ ÒÓØ Ð º Ò ×ØÓ× ×Ó׸ Ð Ø ÑÔÓ × ÖÖÓÐÐÓ Ý ¹ Ù ÓÒ ÙÒ Ð ÓÖ ØÑÓ Ù ÒÓ ÔÙ × Ö Ñ ÒÓÖ ÕÙ Ð ÙÒÓ ÓÔØ ÑÓº Ò Ð ÓÖ ØÑÓ× Ý × ×Ø Ñ ×¸ × ÓÑÓ Ò ÓØÖÓ× ÓÑ Ò Ó× Ð Ò Ò Ö ¸ × ÔÖÓÒÙÒ ÙÒ ÔÖÓÚ Ö Ó ÕÙ Ö Þ ÕÙ ÐÓ Ñ ÓÖ × Ò Ñ Ó ÐÓ Ù ÒÓ º ÐÓ ÒØ Ö ÓÖ × ×ÔÖ Ò ÕÙ Ð Ð ÓÒ × Ù × Ò Ó ÕÙ Ð ¬ ÔÖ Ñ Ð ¬ Ò º 3.5.1 La regla del 80-20 Ò ½ ¼ Ð Ò Ò ÖÓ Ö Ò Ó¹ Ø Ð ÒÓ Î Ð Ö Ó È Ö ØÓ × Ò ÐÓ ÕÙ Ò ÁØ Ð Ð ¼± Ð Ö ÕÙ Þ × ×ØÖ Ù ÑÙÝ Ò Ùר Ñ ÒØ ÒØÖ Ð ¾¼± Ð ÔÓ Ð ÓÒº ËÙ Ó × ÖÚ ÓÒ Ù ÓÖÖÓ ÓÖ Ò Ð ÙÒ × ÓØÖ × Ð Ø ØÙ × Ý ÓÒØ ÜØÓ× Ó Ð ÔÖ Ò Ô Ó È Ö ØÓ ¾¿ º Ò Ð ÙÒÓ× ÓÒØ ÜØÓ× Ò ÐÓ× Ù Ð × × Ð ¬ Ò ¸ Ð ÔÖ Ò Ô Ó È Ö ØÓ × Ó ÔÐ Ó Ô Ö Ö Ø Ö Þ Ö ÙÒ Ö Ð ÓÒ ÒØÖ Ö ÙÖ×Ó× ÓÒ×ÙÑÓ Ó ÔÖÓ Ù ÓÒ Ý ÐÓ× ÒØ × ÓÒ×ÙÑ ÓÖ × Ó ÔÖÓ Ù ØÓÖ ×º À Ý Ò ÓÒ × ÑÔ Ö × ÕÙ Ð ÔÖ Ò Ô Ó ÔÐ ÐÓ× × ×Ø Ñ × ÓÑÔÙØ ÓÒ Ð ×º Ò ØÓ¸ × Ó × ÖÚ Ó¸ ÒØÖ ÓØÖ × Ó× ×¸ ÕÙ ½º Ð ¼± Ð Ñ ÑÓÖ ÓÒ×ÙÑ ÔÓÖ ÙÒ ÔÖÓ Ö Ñ × Ù× ÔÓÖ Ð ¾¼± Ð ÔÖÓ Ö Ñ º ¾º Ð ¼± Ð Ø ÑÔÓ Ù ÓÒ × ÓÒ×ÙÑ Ó ÔÓÖ Ð ¾¼± Ð ÔÖÓ Ö Ñ º ¿º Ð ¼± ÐÓ× ×Ó× × Ó × Ö Ð Þ Ó ÔÓÖ Ð ¾¼± Ð ÔÖÓ Ö Ñ º º Ð ¼± Ð × Ù ÖÞÓ × ÖÖÓÐÐÓ ÙÒ × ×Ø Ñ × Ö Ð Þ Ó ×Ó Ö Ð ¾¼± Ð Ñ ×ÑÓº ¾¿ ×Ö Ñ ÒØ Ô Ö Ð ÙÒÓ× ÔÙ ÐÓ׸ Ð ÔÖ Ò Ô Ó È Ö ØÓ Ø Ò Ó ÙÒ ÔÐ ÓÒ ÓÒÓÑ ¸ Ó¸ Ñ ÓÖ Ó¸ ÓÒÓÑ ×Ø ¸ ÕÙ Ô ÖÑ Ø Ó ×Ù Ö ÖÐÓ Ñ × ÓÑÓ ÙÒ ÔÖ Ò Ô Ó Ò ØÙÖ Ð ØÓ ÓÒÓÑ ¸ ÕÙ ÓÑÓ ÙÒ Ú Ò Ò ¬ Ò Ó Ò Ùר ×Ó Ðº ÆÓØ × ¸ × Ò Ñ Ö Ó¸ ÕÙ Ò ÐÓ ÕÙ Ø Ò Ð × Ö × Ö ÙÑ ÒÓ¸ Ð × Ö Ð × ÓÒÓÑ × ×ÓÒ ÙÐØÙÖ Ð ×¸ ÒÓ Ò ØÙÖ Ð ×º Ë Ø Ò Ù Ð Ö ×Ô ØÓ¸ ÔÖ ÙÒØ × ¸ ÔÓÖ ÑÔÐÓ¸ × Ð Ò ÖÓ Ò ØÙÖ Ð × Ð ÒÓ ÓÒ Ó Ò ÖÓ ÙÒ ÓÒÓ Ñ ÒØÓ ÒÒ ØÓ¸ Ñ Ó Ò ÒÙ ×ØÖÓ× Ò ×¸ × ÒØ × ÒÙ ×ØÖÓ Ò Ñ ÒØÓ
  • 254.
    228 Cap´ ıtulo 3. Cr´ ıtica de algoritmos Ò ÔÖÓ Ö Ñ ÓÒ¸ ר Ô ØÖÓÒ × Ð ÒÓÑ Ò Ð Ö Ð Ð ¼¹¾¼ º Ä Ö Ð × Ó ×ÓÐ Ñ ÒØ ÓÑÔÖÓ ÐÓ Ð Ö Ó Ð ×ØÓÖ Ð ÔÖÓ Ö Ñ ÓÒ Ý ØÖ Ú × Ú Ö×Ó× × ×Ø Ñ × ÓÔ Ö Ø ÚÓ׸ ×× ØÓ׸ Ý Ú Ö × ÔÐ ÓÒ ×º Ä Ö Ð ¼¹¾¼ ÒÓ × ÙÒ × ÑÔÐ Ö ÞÓÒ ÒÙÑ Ö Ó ÔÖÓÔÓÖ ÓÒº Ë ØÖ Ø Ð Ú Ð Ó× × ÑÓ ÓÒÓ Ñ ÒØÓ ÕÙ Ö ÔÖ × ÒØ Ð × Ö ÕÙ Ð ¬ Ò ÙÒ ÔÖÓ Ö Ñ ×Ø Ø ÖÑ Ò ÔÓÖ ÙÒ Ô ÖØ ÓÖÖ ×ÔÓÒ ÒØ Ð ¾¼±º ÈÓÖ Ø ÒØÓ¸ Ù Ò Ó × × Ñ ÓÖ Ö ÙÒ ÔÖÓ Ö Ñ Ó× ¸ ÖÐÓ Ñ × ¬ ÒØ ¸ ÑÓ× ÖÐÓ ×Ó Ö ÕÙ Ð ¾¼± Ý ÒÓ Ô Ö ÖÒÓ× Ò Ñ ÓÖ Ö¸ ÙØ ÐÑ ÒØ ¸ Ð Ö ×Ø ÒØ ¼±º 3.5.2 ¿Cu´ndo atacar la eficiencia? a ÄÓ ÒØ Ö ÓÖ Ö Ù ÖÞ Ð ¬ÖÑ ÓÒ ÕÙ Ð ¬ ÔÖ Ñ Ð ¬ Ò ¸ ÔÙ × ×Ø ÕÙ ÒÓ ÐÓ Ö ÑÓ× Ð ØÓ¸ ÒÓ ÔÓ ÑÓ× ÒØ ¬ Ö × ¾¼± Ð ÔÖÓ Ö Ñ ×Ó Ö Ð Ù Ð Ö ÑÓ× ÓÒ ÒØÖ ÖÒÓ× × × × ÑÓ× Ñ ÓÖ Ö Ð ¬ Ò º Å × ÙÒ¸ × Ð ÓÖ ÑÓ× ÔÖÓ Ö Ñ × ¬ × ÕÙ × Ø × Ò Ð × ÜÔ Ø Ø Ú ×¸ Ú Ð Ð Ô Ò Ñ ÓÖ Ö ×Ù ¬ Ò È Ö Ö ×ÔÓÒ Ö ×ØÓ ÑÓ× Ñ ÓÖ ÔÖ ÙÒØ ÖÒÓ× × Ø Ò ÑÓ× ÙÒ ÔÖÓ Ö Ñ ¬ Þ ´ ÓÖÖ ØÓµ¸ Ù Ò Ó × ÕÙ Ý ÕÙ Ø Ö Ð ¬ Ò À Ý Ú Ö × ÓÒ ÓÒ ×¸ × Ò Ó Ð × Ñ × ÓÑÙÒ × Ð × × Ù ÒØ × ¯ Ð ÔÖÓ Ö Ñ Ö ×ÙÐØ ÒØ ÒÓ ÓÑ Ø Ð ×ÓÐÙ ÓÒ Ò ÙÒ ÙÖ ÓÒ ÔØ Ð Ô Ö ×Ù ÔÐ ÓÒ × Ò ÑÓ× ÙÒ ÔÖÓ Ö Ñ ¸ ÐÓ Ó ¬ ÑÓ׸ ÓÑÔÖÓ ÑÓ× ÕÙ × ÓÖÖ ØÓ¸ Ô ÖÓ Ù Ò Ó ÐÓ ÙØ ÑÓ× ÒÓ× Ô Ö Ø ÑÓ× ÕÙ ×Ù ÙÖ ÓÒ Ù ÓÒ ÒÓ ÙÑÔÐ Ð × ÜÔ Ø Ø Ú ×º ¯ Ñ Ó Ò Ð × ÓÒ ÓÒ × Ñ ÒØ Ð × Ù×Ó Ð ÔÖÓ Ö Ñ Ø Ò ÑÓ× ÙÒ ÔÖÓ Ö Ñ ÓÖÖ ØÓ ÕÙ ÙÑÔÐ Ð × ÜÔ Ø Ø Ú ×º ÍÒ ÓÒØ ÙÒ Ñ Ó¸ ÔÓÖ ÑÔÐÓ¸ × ÙÑ ÒØ Ð × Ð ÒØÖ Ý Ð ÔÖÓ Ö Ñ × Ö ¬ ÒØ º ¯ Í×Ó Ð ÔÖÓ Ö Ñ ÓÑÓ ÙÒ ÓÑÔÓÒ ÒØ ÓØÖÓ ÔÖÓ Ö Ñ Ó × ×Ø Ñ Ø Ò ÑÓ× ÙÒ ÔÖÓ Ö Ñ ÓÖÖ ØÓ Ý ¬ ÒØ Ý × ÒÓ× ÔÐ ÒØ Ö Ù× ÖÐÓ ÓÑÓ Ô ÖØ ÓØÖÓ ÔÖÓ Ö Ñ º Ë Ò Ñ Ö Ó¸ Ð ÓÑÔÓÒ ÒØ Ò Ù ×Ø ÓÒ ÒÓ Ø Ò Ð ×Ù¬ ÒØ ¬ Ò Ô Ö × ÙÖ Ö Ð ¬ Ò ÐÓ Ð Ð ÔÖÓ Ö Ñ º Ë ÙÒ ÔÖÓ Ö Ñ Ó Ò Ò Ð ÙÒ ×Ø × ÓÒ ÓÒ ×¸ ÒØÓÒ × ÔÙ Ú Ö Ö× Ð Ò × ÖÐÓ Ñ × ¬ ÒØ º Ë ¸ Ð ÓÒØÖ Ö Ó¸ Ð ÔÖÓ Ö Ñ × Ø × ØÓ × Ð × ÜÔ Ø Ø Ú ×¸ ÒØÓÒ × × ÔÖ Ö Ð Ú Ø Ö Ð ØÓ Ð × ÙÒ Ó × ×Ø Ñ ¸ Р٠и Ô Ö Ö × Ò Ó ÖÓÓ × ººº × Ø ÑÓר Ò ÖÓÙ× ×Ýר Ñ Ñ Ò Ú Ö × Ò× ¾ º 3.5.3 Maneras de mejorar la eficiencia ÍÒ Ú Þ Ú Ö Ó ÕÙ Ö ÕÙ Ö ÑÓ× Ö Ñ × ¬ ÒØ ÙÒ ÔÖÓ Ö Ñ ¸ Ø Ò ÑÓ× Ú Ö × ÐØ Ö¹ Ò Ø Ú ×¸ ÓÑ Ò Ð × ÒØÖ × ¸ Ô Ö Ñ ÓÖ Ö Ð ¬ Ò ÒØÖ Ð × Ñ × Ù×Ù Ð × Ø Ò ÑÓ× ½º Á ÒØ ¬ ÓÒ Ý Ñ ÓÖ Ñ ÒØÓ Ð ¾¼± Ù ÒØ Ð Ö Ð È Ö ØÓ¸ ×Ó Ø Ò ÑÙ Ó × ÒØ Ó¸ ÔÙ × ÐÐÓ Ò ¬ Ö Ð ¼± Ð ÔÖÓ Ö Ñ º ¾º Ñ Ó Ð ÓÖ ØÑÓ Ú ×¸ ×Ó Ö ØÓ Ó Ó Ð × Ð Ð ÒØÖ ¸ × Ð ÔÖÓÔ Ó Ð ÓÖ ØÑÓ Ð Ù ÒØ Ò¬ Ò º Ò ×Ø ×Ó ÔÙ Ú Ö Ö× Ò × Ö Ó × Ò Ö ¾ × Ð Ñ × Ô Ð ÖÓ×Ó × ×Ø Ñ ÕÙ Ð Ù Ò ÔÙ ×ÒÖº
  • 255.
    3.5. Eficacia yeficiencia 229 ÙÒ Ð ÓÖ ØÑÓ Ñ × ¬ ÒØ ÓÑÔÙØ ÓÒ ÐÑ ÒØ º ÈÓÖ ÑÔÐÓ¸ Ø Ð Ú Þ ÙÒ ÔÖÓ ×Ó Ö Ø Ó ÙÒ × ×Ø Ñ Ù× Ð ÙÒ Ñ ØÓ Ó × Ò ÐÐÓ ÓÖ Ò Ñ ÒØÓ ÙÝ ÓÑÔÐ × O(n2) Ò ×Ø ×Ó¸ Ð Ñ ØÓ Ó ÔÓ Ö ×Ù ×Ø ØÙ Ö× ÔÓÖ Ð ÙÒÓ O(n Ð n)¸ Ð Ù Ð × ÓÒ× Ö Ð Ñ ÒØ Ñ × ¬ ÒØ º ¿º Ñ Ó Ò Ð Ø ØÙ ÔÖÓ Ö Ñ ÓÒ ÓØÖ ÔÓ× Ð Ò ¬ Ò ÔÙ Ö× ÙÒ Ø ØÙ ÔÓÖ Ô ÖØ ÐÓ× ÔÖÓ Ö Ñ ÓÖ × ÕÙ ÒØÖÓ ÙÞ Ò ¬ Ò º Ñ ÒÙ Ó¸ ×ØÓ Ó ÙÖÖ ÒØÖ ÔÖÓ Ö Ñ ÓÖ × ÒÓÚ Ð ×º ÍÒ ÑÔÐÓ ÒÓØ Ð Ý Ö Ð ÐÓ ÓÒר ØÙÝ Ð Ô × Ô Ö Ñ ØÖÓ× ÔÓÖ Ú ÐÓÖ Ò C++º Ò ØÓ¸ Ò ×Ø Ð Ò Ù ¸ × ÒÓ × Ø Ò Ð Ù Ó Ù Ó¸ Ð Óר Ð Ô × Ô Ö Ñ ØÖÓ× ÔÓÖ Ú ÐÓÖ ÔÙ × Ö ÐØ × ÑÓ¸ ÔÙ × ÒÚÓ ÓÒ ÙÒ ÓÒ Ö ÕÙ Ö ÙÒ ÓÔ Ó ØÓ Ô Ö Ñ ØÖÓ¸ Р٠и × ÙÒ Ð Ò ÓÐ Ð Ó ØÓ¸ ÔÙ ÓÒ×ÙÑ Ö ×Ø ÒØ Ø ÑÔÓº º Ñ Ó Ñ ÒØ Ð Ö ÙÒÓ× ¾¼ ÒÓ׸ Ù Ò Ó ÙÒ ÔÖÓ Ö Ñ ÓÖ ÕÙ Ö ÐÓ Ö Ö Ð ÙÒÓ× ØÓ× Ú ×Ù Ð × ×Ô Ð ×¸ ÙÑ ÒØ ÜÔÐ Ø Ñ ÒØ Ð Ú ÐÓ Ö ÐÓ Ý Ù× ÙÒ ÓÐ× ÐÓ ×Ó Ö Ð ÔÖÓ × ÓÖ Ô Ö Ø ÒÙ Ö Ð ÐÓÖ ÔÖÓ Ù Óº ÕÙ ÐÐ Ð Ñ Ø Ý Ñ Ö Ø Ò Ô ÖÑ Ø ÔÖ Ö ÕÙ ÔÖÓ × ÓÖ × Ñ × Ú ÐÓ × ¹Ó ÔØ ÓÒ × × ×¹ Ö Ò ×ÓÐÙ ÓÒ Ð ÔÖÓ Ð Ñ º ÍÒ ÔÖÓ Ð Ñ ¬ Ò ÔÙ Ø Ö× Ù ÖÞ ÖÙØ ÙÑ ÒØ Ò Ó Ð ÔÓ Ö ÓÑÔÙØ ÓÒ Ðº Ô ÖØ Ñ Ó× × Ó׸ Ð ×Ø ÐÓ × Ö ØÓ Ò Ð Ô ÖÖ Ó ÒØ Ö ÓÖ¸ Ý Ú Ö Ó× Ñ × ÐÓ Ð ×º Ò ÔÖ Ñ Ö ÐÙ Ö¸ ÔÙ ×Ù ×Ø ØÙ Ö× Ð ÓÑÔ Ð ÓÖ ÔÓÖ ÙÒÓ ÕÙ ØÙ ÓÔØ Ñ Þ ÓÒ × Ö × Ú × ×Ô Ð ×º Ò × ÙÒ Ó ÐÙ Ö¸ ÔÙ ÕÙ Ö Ö× Ö Û Ö ×Ô Ð Þ Ó Ó¸ × ÑÔÐ Ñ ÒØ ¸ Ñ × ÔÓØ ÒØ Ú ÐÓ ÔÖÓ × ÓÖ¸ Ò¹ Ø Ñ ÑÓÖ ¸ ÒØ × Ó¸ Ø ÒÓÐÓ ÐÑ Ò Ñ ÒØÓ¸ ÒÙÑ ÖÓ ÔÖÓ × ÓÖ ×¸ Ø Ø Ö º ר ׸ ÖÓ××Ó ÑÓ Ó¸ Ð Ð × ¬ ÓÒ Ð × Ñ Ò Ö × Ó Ø Ú × Ò ÕÙ × ÔÙ Ñ ÓÖ Ö Ð ¬ Ò º ÄÓ Ñ ×¸ Ý ÐÓ ÕÙ Ú Ò Ö ¸ × Ò ÓÐ ×Ù Ø Ú Ý Ô ÖØ Ð ÓÖÔÙ× ×ØÙ Ó ×Ø Ø ÜØÓº 3.5.4 Perfilaje (profiling) Ó ÙÒ ÔÖÓ Ö Ñ Ð Ù Ð × × ×ØÙ Ö ×Ù ¬ Ò ¸ Ù Ð × ×ÓÒ Ð × Ô ÖØ × Ð ÔÖÓ Ö Ñ ÕÙ Ö ÔÖ × ÒØ Ò ÕÙ Ð ¾¼± Ö Ø Ó Ô ÖØ Ð ÓÒÓ Ñ ÒØÓ Ð ÔÖÓ Ö Ñ ÓÖ¸ Ò Ð Ø ÖÑ Ò ÓÒ ×Ø Ö ×ÔÙ ×Ø ¸ ÔÙ Ù× Ö× ÙÒ Ð × ×Ô Ð ÔÖÓ Ö Ñ ÐÐ Ñ Ó Ô Ö¬Ð ÓÖ ´ ÔÖÓ¬Ð Ö µº Ñ Ò Ö Ð Ñ ÒØ и ÙÒ ÔÖÓ¬Ð Ö × ÙÒ ÔÖÓ Ö Ñ ÕÙ ¸ Ó¹ × ×Ø Ó ÔÓÖ Ð ÓÑÔ Ð ÓÖ¸ ÑÙ ×ØÖ Ð Ù ÓÒ ÙÒ ÔÖÓ Ö Ñ Ý Ö ×Ø ר × ×Ó Ö Ð ÔÓ× ÓÒ Ù ÓÒ Ð ÔÖÓ Ö Ñ º ÈÓÖ ÐÓ Ò Ö Ð¸ ÙÒ ÔÖÓ¬Ð Ö Ó Ö Ó× Ö ¬ Ó× ÙÒ Ñ ÒØ Ð × ½º Ð Ô Ö¬Ð ÔÐ ÒÓ Ð Ù Ð ÑÙ ×ØÖ Ð ÙÖ ÓÒ ÓÒ×ÙÑ ÔÓÖ ÖÙØ Ò Ý Ð ÒØ Ú × ÕÙ Ù ÒÚÓ º ¾º Ð Ö Ó ÐÐ Ñ × Ð Ù Ð ÑÙ ×ØÖ ¸ Ô Ö ÙÒ ÓÒ¸ Ù Ð × Ù ÖÓÒ Ð × ÙÒ ÓÒ × ÕÙ Ð ÐÐ Ñ ÖÓÒ Ý Ù ÒØ × Ú × ×ØÓ Ó ÙÖÖ Óº
  • 256.
    230 Cap´ ıtulo 3. Cr´ ıtica de algoritmos Ë Ò Ó ×Ø Ò ÓÕÙ Ò ÓÐ ×Ø ר ¸ Ð ÔÖ × ÓÒ Ð ÔÖÓ¬Ð Ö Ô Ò Ð ÙÖ ÓÒ ØÓØ Ð Ð ÔÖÓ Ö Ñ Ñ ÝÓÖ ÙÖ ÓÒ¸ Ñ ÝÓÖ ÔÖ × ÓÒº Ô × Ö ×Ø Ø ÔÓ ÑÔÖ ¹ × ÓÒ¸ ר Ò ÓÕÙ Ø Ò Ð ÒÓÖÑ Ú ÒØ ÕÙ ÒÓ ÑÔ Ø Ñ × Ó ×Ó Ö Ð ÙÖ ÓÒ Ô ÖÑ Ø Ò ÓÐ ÙØ Ö× Ú ÐÓ × Ö Ò × Ð Ø ÑÔÓ Ö Ðº Ð ÔÖ Ò Ô Ð ÜÔÓÒ ÒØ Ð ÔÖÓ¬Ð Ö ×Ø ר Ó × GNU gprofº À Ý Ú Ö Ó× ÖÓÒØ¹ Ò × Ö ¬ Ó× ÕÙ Ú Ö× Ø Ð Þ Ò Ð Ú ×Ù Ð Þ ÓÒ ÐÓ× Ô Ö¬Ð × ÖÖÓ Ó× ÔÓÖ GNU gprof × Ò Ó Ð Ñ × ÒÓØ Ð ÐÐÓ× kprofº Valgrind Ø Ñ Ò ÔÓ× ÙÒ Ü Ð ÒØ ÔÖÓ¬Ð Ö ×Ø ר Óº ÇØÖÓ Ò ÓÕÙ Ô Ö¬Ð ¸ Ñ × Ø ÖÑ Ò ×Ø ¸ ÓÒ× ×Ø Ò ÓÐÓ Ö ÓÒØ ÓÖ × Ö ØÓ× Ò ÖÙØ Ò Ý Ñ ÓÖ × Ø ÑÔÓº Ð Ò ÓÕÙ × ÑÙ Ó Ñ × ÔÖ ×Ó ÕÙ Ð ×Ø ר Ó Ô ÖÓ Ø Ò Ð ÔÖÓ Ð Ñ ÕÙ ×¹ Ð Ö Ù ÖØ Ñ ÒØ Ð Ø ÑÔÓ Ù ÓÒ Ò ÓÐÓ Ò ÔÐ Ð Ô Ö ÔÖÓ Ö Ñ × ÓÒ Ö ÕÙ Ö Ñ ÒØÓ× Ø ÑÔÓ Ö Ðº ÍÒ ÔÖÓØÓØ ÔÓ Ð Ö ×Ø Ð × ÔÖÓ¬Ð Ö × FunctionCheck ¾ º 3.5.5 Localidad de referencia ÈÓÖ ÐÓ Ò Ö Ð¸ Ð ×Ó ÐÓ× ØÓ× ÔÓÖ Ô ÖØ ÙÒ ÔÖÓ Ö Ñ Ü ÙÒ Ô ØÖÓÒ Ö Ô Ø Ø ÚÓ ÒÓÑ Ò Ó ÐÓ Ð Ö Ö Ò º Ù Ò Ó× ÙÒ ØÓ¸ Ü ×Ø ÙÒ ÐØ ÔÖÓ ¹ Ð ÕÙ ×Ø × Ó ÒÙ ÚÓ Ò ÙÒ Ø ÑÔÓ ÔÖÓÜ ÑÓº ר Ø ÔÓ ÐÓ Ð Ö Ö Ò × Ð Ð¬ Ø ÑÔÓÖ Ð º ÍÒ ÑÙÝ × ÑÔÐ ÑÔÐÓ × Ð Òר Ò ÓÒ ÙÒ Ú Ö Ð ¸ Р٠и ×Ó Ö ØÓ Ó × × × Ù Ò Ù Ò × ÓרÙÑ Ö × ÔÖÓ Ö Ñ ÓÒ¸ Ö Ö× Ô Ö Ð ØÙÖ Ó × Ö ØÙÖ Ò ÙÒ Ø ÑÔÓ ÑÙÝ ÔÖÓÜ ÑÓº ÇØÖÓ Ô ØÖÓÒ ÓÒ× ×Ø Ò Ö ÙÒ ØÓ Ö ÒÓ Ò Ñ ÑÓÖ ÓØÖÓ Ö ÒØ Ñ ÒØ Óº ר Ð × ÐÓ Ð Ö Ö Ò × Ð Ð¬ ×Ô Ð Ý¸ ÙÒ Ù Ò ÑÔÐÓ¸ ÐÓ ÓÒר ØÙÝ Ð ×Ó Ú ØÓÖ × Ý Ñ ØÖ ׺ Ä ÐÓ Ð Ö Ö Ò ¸ ÙÒ Ó Ð ÓÒÓ Ñ ÒØÓ Ð Ö Ð Ð ¼¹¾¼¸ ÒØÙÝ ÙÒ Ñ Ò ×ÑÓ ÑÙÝ ÙØ Ð Þ Ó Ô Ö Ñ ÓÖ Ö Ð Ö Ò Ñ ÒØÓ ÒÓÑ Ò Ó ¸Ú Ö Ó Ö Ò × ÕÙ × Ò ¬ × ÓÒ Ö Ý ÕÙ Ð ÓÖ Þ Ð ØÖ Ò×Ô Ö Ò Ð Ñ Ò ×ÑÓº ÍÒ × ÙÒ ÓÒ ÙÒØÓ ×ØÖ ØÓ¸ ¬Ò ØÓ¸ ×Ùר ÒØ Ó Ò ÙÒ ×ØÖÙ ØÙÖ ØÓ׸ ÕÙ × ÒØ ÔÓÒ ÙÒ ÓÒ ÙÒØÓ ØÓ× ÑÙ Ó Ñ ÝÓÖ Ý ÙÝÓ ×Ó × ÒÓØ Ð Ñ ÒØ Ñ × Ö Ô Ó ÕÙ Ð ÓÒ ÙÒØÓ ØÓ׺ Ù Ò Ó × ÔÓÖ Ú Þ ÔÖ Ñ Ö ÙÒ Ð Ñ ÒØÓ Ð ÓÒ ÙÒØÓ¸ ר × Ù Ö Ò Ð º ÄÓ× × Ù ÒØ × ×Ó× × Ö Ð Þ Ò ×Ó Ö Ð ¸ ÕÙ × ÑÙ Ó Ñ × Ö Ô Óº ÈÙ ×ØÓ ÕÙ Ð × ¬Ò ØÓ¸ ÔÓ× Ð Ñ ÒØ ר Ú Ò ÐÐ ÒÓº Ò ×Ø ×Ó¸ × × Ð ÓÒ Ö ÙÒ ÒØÖ Ð Ô Ö Ð Ñ Ò Ö Ñ Ò Ö ÕÙ ÔÙ ×Ù ×Ø ØÙ Ö× ÔÓÖ Ð ÒÙ Ú º ÈÓÖ ÐÓ Ò Ö Ð¸ × Ð Ñ Ò Ð ÒØÖ ÕÙ Ø Ò Ñ × Ø ÑÔÓ × Ò Ù× Ö× º × ×ÓÒ Ø Ô Ñ ÒØ Ù× Ó× Ò Ð × ÔÐ Ø ÓÖÑ × Ö Û Ö Ô Ö Ô Ð ÖÐ ÖÒ × ÑÔ ÒÓ ÕÙ Ü ×Ø ÒØÖ Ð ÈÍ Ý Ð Ñ ÑÓÖ º ÈÓÖ Ð Ñ ×Ñ Ö ÞÓÒ ÐÓ× × ×Ø Ñ × ÓÔ Ö Ø ÚÓ× ÐÓ× Ù× Ò Ô Ö Ô Ð Ö Ð × × ÒØÖ Ð Ñ ÑÓÖ Ý Ð × Óº Ò Ñ × × ØÙ ÓÒ ×¸ ×Ù Ð Ù Ö Ö× Ò Ð ¸ ÒÓ ×ÓÐÓ Ð ØÓ Ö Ò Ó¸ Ð Ù Ð Ù Ö Ð ÐÓ Ð Ö Ö Ò Ø ÑÔÓÖ Ð¸ × ÒÓ¸ Ø Ñ Ò¸ ÐÓ× ØÓ× Ý ÒØ ׸ Ñ Ò Ö ÕÙ Ø Ñ Ò × Ù Ö Ð ÐÓ Ð ×Ô Ðº Ò Ü º¿º¿ ´Ô Ò µ ×ØÙ Ö ÑÓ× ÙÒ Ò ÓÕÙ Ò Ö Ð Ô Ö Ù× Ö× ×Ó Ö ÓÒ ÙÒØÓ× Ò Ñ ÑÓÖ º 3.5.6 Tiempo de desarrollo ÄÓ× Ñ ÒØ × ÐÓ× Ö Ò Ó×Ó× Ý ÑÓ ÖÒÓ× Ð Ò Ù × × Ö ÔØ Ò Ø Ð × ÓÑÓ Perl¸ Python Ý Ruby¸ ÐÓ× Ù Ð × Ð Ø Ò ÑÙ × ÑÓ Ð × ÖÖÓÐÐÓ Ö Ô Ó ÔÖÓØÓØ ÔÓ× Ý ÔÐ ¹
  • 257.
    3.6. Notas bibliogr´ficas a 231 ÓÒ ×¸ Ø Ò Ò Ð × Ù ÒØ ÔÖÓÚ Ö Ó Ð Ø ÑÔÓ ÙÑ ÒÓ × Ñ × ÑÔÓÖØ ÒØ ÕÙ Ð Ø ÑÔÓ ÈÍ ¾ º ÓÒ ×ØÓ ÜÔÖ × Ò ÙÒ Ð Ñ ÒØÓ ¬ Ý ¬ Ò ÕÙ Ñ ÒÙ Ó × × Ù Ó ¸ Ò ÐÙ× Ú ¸ ÓÑÔÐ Ø Ñ ÒØ ×ÔÖ Ó Ð Ø ÑÔÓ × ÖÖÓÐÐÓ ÙÒ ÔÖÓ Ö Ñ º ÅÓ ÐÓ× Ý ÔÖÓØÓØ ÔÓ× ×ÓÒ ÙÒ Ñ ÒØ Ð × Ò Ò Ò Ö ¸ Ô ÖÓ ÔÓÖ ÙÒ ÜØÖ Ò Ö ÞÓÒ ÔÓ Ó× Ò Ò ÖÓ× ×Ó ØÛ Ö ×Ù Ð Ò Ù× ÖÐÓ× Ù Ò Ó × Ò Ù ÒØÖ Ò ÒØ × ÒÓ× ×Ó ØÛ Ö ÒÓÚ Ó×Ó Ó ÕÙ ÒÓ Ø Ò Ò ÜÔ Ö Ò Ò Ö Ð Þ ÖÐÓº Ò ØÓ Ó ×Ó¸ Ô Ö ×ÙÖ Ó Ð ÓÖ Ö ÔÖÓ Ö Ñ × ÙÝÓ Ø ÑÔÓ × ÖÖÓÐÐÓ × ÑÙ Ó Ñ ÝÓÖ ÕÙ Ð Ú Ð ÔÖÓ Ö Ñ Ò ¹ Ù ÓÒ Ó¸ Ò ÐÙ× Ú ¸ ÐÓ Ù Ð × Ô Ø Ø Ñ ÒØ Ñ × ÓÑÙÒ¸ ÕÙ ÒÓ × Ò ¬ ÒØ × Ó¸ ÑÙ Ó Ô ÓÖ¸ Ò ¬ ׺ Ë ÙÒ Ð × ÓÒ× Ö ÓÒ × ÒØ Ö ÓÖ ×¸ ÓÒ ÐÙÝ ÑÓ× ÓÒ Ð × × Ù ÒØ × Ö ÓÑ Ò ÓÒ × Ø Ò ÒØ × Ð Ö Ö Ð Ø ÑÔÓ × ÖÖÓÐÐÓ ½º ÈÖ Ñ Ð × ÑÔÐ × ÒÓ ÔÓÖ Ð × ÑÔ ÒÓ¸ Ô٠׸ ÓÑÓ Ö Ø Ö Ñ ÒØ ÐÓ ÑÓ× × Ò Ð Ó¸ Ð ¬ ÔÖ Ñ Ð ¬ Ò º ÈÓÖ Ø ÒØÓ¸ Ô Ò× Ò ÓÔØ Ñ Þ ÓÒ ×ÓÐÓ × × × ÙÖ Ó Ð ¬Ò Ý × Ö ÕÙ Ö Ñ × ¬ Ò º ¾º ÁÒÚ ÖØ ØÓ Ó Ð Ø ÑÔÓ Ò × Ö Ó Ò Ö ÒØ Þ Ö ÓÖÖ Ø ØÙ ÐÓ× × ÒÓ× ÒØ × ÔÖÓ Ö Ð Ó ¬ ÓÒº Ò Ú ÖØÙ ×Ø Ö ÓÑ Ò ÓÒ¸ Ù× ÑÓ ÐÓ× Ý Ú Ö ÕÙ ÐÓ× Ü Ùר Ú Ñ ÒØ º Ë Ü ×Ø Ò ×Ô ¬ ÓÒ × ¬ Ò ¸ ÒØÓÒ × Ú Ö ÕÙ Ð × Ò ÐÓ× ÑÓ ÐÓ׺ ÈÖÓØÓØ Ô Ö Ô Ñ ÒØ ÔÖÓØÓØ ÔÓ× ÐÓ× ÑÓ ÐÓ× Ý Ú Ö ¬ Ó× Ý ÓÒÚ Ð ÐÓ× ÓÒ Ð × ÓÒ ÓÒ × ×Ô Ö × Ù ÓÒº Ò ×Ø × ÒØ Ó¸ × Ô Ö Ø Ñ ÒØ ÔÐ Ù× Ð Ù× Ö Ð Ò Ù × ÕÙ Ô ÖÑ Ø Ò × ÖÖÓÐÐ Ö Ø Ú Ñ ÒØ ÔÖÓØÓØ ÔÓ× ¸ Ò ÐÙ× Ú ¸ × Ð ¬ Ò × × Ø × ØÓÖ ¸ × Ö Ð × ÖÖÓÐÐÓ ¬Ò Ø ÚÓ Ò Ð Ð Ò Ù ÔÖÓØÓØ Ô Óº 3.6 Notas bibliogr´ficas a Ð ÓÖ Ò Ñ ÒØÓ¸ ÓÑÓ Ó Ö Ö Ð ÓÑ Ö ¸ × Ò Ù ÒØÖ Ò ØÓ ÙÐØÙÖ Ý ÔÓ ÙÑ Ò º ÈÙ Ö Ö× ÕÙ Ð Ñ ØÓ Ó × Ð ÓÒ × ÙØÓÖ ÙÑ Ò ¸ ÔÙ × ÒÓ × Ò Ù ÒØÖ Ð ÒÓÑ Ö Ð ÙÒ Ò Ú ÙÓ ÕÙ × ØÖ ÙÝ Ô Ö × Ñ ×ÑÓ ×Ù ÙØÓÖ º ÄÓ× ×ØÓÖ ÓÖ × Ð ÓÑÔÙØ ÓÒ ØÖ ÙÝ Ò Ð ÓÖ Ò Ñ ÒØÓ ÔÓÖ Ñ Þ Ð ÂÓ Ò ÚÓÒ Æ ÙÑ ÒÒ ÙÒ Ð × Ñ ÒØ × Ñ × Ò Ð × Ð × ÐÓ º Ð Ñ ØÓ Ó Ò¹ × Ö ÓÒ × Ð ØÖ ÙÝ ÃÓÒÖ Ù× ¸ ÕÙ Ò Ø Ñ Ò × Ð ØÖ ÙÝ Ð × Ù Ö Ñ ÒØÓ Ð ÓÑÔÙØ ÓÖ Ø Ð¾ º Ð ÕÙ ×ÓÖØ Ù × Ù ÖØÓ ÔÓÖ ÖÐ × ÒØ ÓÒÝ Ê Ö ÀÓ Ö Ò ½ ½ º × ÒØÓÒ × ×Ø Ð ÔÖ × ÒØ ¸ Ð Ñ ØÓ Ó × Ó ÒØ Ò× Ú Ñ ÒØ ×ØÙ Óº ÃÒÙØ ½ Ó Ö ÙÒ ÑÙÝ Ø ÐÐ Ó ×ØÙ Ó × ÓÑÓ ÙÒ Ü Ð ÒØ Ö Ù ÒØÓ ×ØÓÖ Ó Ð ÕÙ ×ÓÖØ Ý Ñ × Ñ ØÓ Ó× ÓÖ Ò Ñ ÒØÓº ÊÓ ÖØ Ë Û ¸ Ó Ð ØÙØÓÖ ÃÒÙØ ¸ ÓÒ× ÖÓ ×Ù Ø × × Ó ØÓÖ Ð Ð ×ØÙ Ó Ð ÕÙ ×ÓÖØº ÓÑÓ Ø Ð¸ Ë Û ¿ × ÙÒ Ü Ð ÒØ Ö Ö Ò Ô Ö Ð Ò Ð × × Ð Ñ ØÓ Ó Ý ×Ù× Ú Ö ÒØ × ÔÐ Ø Ú ×º Ä ÒÓØ ÓÒ O¸ ÙÒ Ñ ÒØÓ × Ò Ð Ð Ò Ð × × Ð ÓÖ ØÑÓ׸ Ù ÓÖ Ò ÐÑ ÒØ ÓÒ¹ ÔÓÖ Ð Ñ Ø Ñ Ø Ó Ð Ñ Ò È ÙÐ Ñ ÒÒ Ò ½ ¿ º ¾ × Ù Ó ÔÓÖ ÔÖ Ñ Ö Ú Þ ÔÓÖ ×Ø Ö ØÓÖ Ð Ô Ð Ö Ö Ò × Ó È ÐѺ ¾ Ù× ÓÒ Ó ×Ù ÓÑÔÙØ ÓÖ Ò Ð ÔÓ Ð Ð Ñ Ò Ò Þ º ÉÙ Þ ÔÓÖ ÐÐÓ¸ Ð ÒÓ × Ó ÑÙÝ Ñ Ò ÓÒ Ó ÔÓÖ Ð ×ØÓÖ º
  • 258.
    232 Cap´ ıtulo 3. Cr´ ıtica de algoritmos Ë ÙÒ Ì Ö Ò ¿ ¸ Ð Ò Ð × × ÑÓÖØ Þ Ó Ù × ÖÖÓÐÐ Ó ÔÓÖ Åº ʺ ÖÓÛÒ¸ ÊÓ ÖØ º Ì Ö Ò¸ ˺ ÀÙ Ð ×ØÓÒ Ý Ãº Å Ð ÓÖÒ ¿ º Ò ×Ù ÖØ ÙÐÓ¸ Ì Ö Ò ØÖ ÙÝ Ð × Ù Ö Ñ ÒØÓ Ð Ñ ØÓ Ó ÔÓØ Ò Ð Ò Ð º ËÐ ØÓÖ Ñ ÒØÖ × ÕÙ Ð Ð ¬ Ø ÚÓ ÑÓÖ¹ Ø Þ Ó × Ð ØÖ ÙÝ Ì Ö Ò Ý ËÐ ØÓÖ ¿ º Ä Ú Ö ¬ ÓÒ ÓÖÖ Ø ØÙ × Ò ÒÚ Ö ÒØ × × Ó ÔÓÔÙÐ Ö × Ð Ñ ×ÑÓ Ò Ó Ð ÔÖÓ Ö Ñ ÓÒº Ë Ò Ñ Ö Ó¸ Ð Ö ×Ô ØÓ Ú Ð Ð Ô Ò ×Ø Ö Ð ØÖ Ó Ú ÊÓ× Ò ÐÙÑ ¿¿¸ ¿¾ º Ä ×Ô ¬ ÓÒ Ý Ú Ö ¬ ÓÒ ÙØÓÑ Ø ÔÖÓ Ö Ñ × Ù Ò ¬Ò Ð × ÐÓ× ÒÓ× ¼ Ô ÖÓ ÒÓ Ù ×Ø ¬Ò Ð Ð Ð ¼ ÕÙ × ØÙÚÓ Ð ÖÓ¸ ÓÒ ÐÓ× ØÖ Ó× ¬ÖÓÔÙÐÓ Ø Ð ¸ ÕÙ Ð ÙØÙÖÓ Ð Ú Ö ¬ ÓÒ × ×Ø Ñ × × Ö ÓÖÑ Ð Ý ÙØÓÑ Ø Ñ ÒØ º Ë Ùר Ú Ò ÙÒ ÔÖÓ Ö Ñ ÓÖ¸ ÒØÓÒ ×¸ ÕÙ Þ ¸ Ð ÙÒ ÑÔÖ Ò Ö Ð Ö ÓÒ ÙÒ Ó Ö ÓÑÔÐ Ò ÙÒ × ×Ø Ñ ÓÑÔÙØ ÓÒ Ð ÕÙ Ö ÕÙ Ö Ð Ô ÖØ Ô ÓÒ ÑÙ Ó× ÔÖÓ Ö Ñ ÓÖ ×º Ò × ÒØÓÒ ×¸ Ö ÕÙ Ö Ö ÓÑ Ò Ö Ð × Ù Ò × ÓרÙÑ Ö × Ý ÒÓÖÑ Ð Þ ÖÐ × ÒØÖ ÐÓ× ÔÖÓ Ö Ñ ÓÖ ×º Ò × ÑÓÑ ÒØÓ Ö ÓÒÓ Ö ÑÙÝ Ò Ö Ð ÁÒ Ò Ö Ð ËÓ ØÛ Ö º Ò Ð ÒØ Ö Ò¸ ÔÖ Ñ ÖÓ ÓÑ Ò Ð × Ö ÔÖÓ Ö Ñ ÓÖ Ý ÓÑ Ò ÔÓÖ Ð Ö Ð ÔÖ Ñ Ö Ð ÖÓ¸ Ò Ø ÑÔÓ Ý Ò Ü Ð Ò ¸ ÁÒ Ò Ö Ð ËÓ ØÛ Ö Ì ÅÝØ Ð Å Ò¹ ÅÓÒØ ×× Ý× ÓÒ ËÓ ØÛ Ö Ò Ò Ö Ò Ö Ö Èº ÖÓÓ × º Ð ÑÔÓ ×Ó Ö × ÔÐ Ò Ý Ù Ò × ÓרÙÑ Ö × ÔÖÓ Ö Ñ ÓÒ Ø Ò ÒØ × ÔÖÓ Ù Ö ÔÖÓ Ö Ñ × ÓÖÖ ØÓ× × ÑÙÝ Ú ×ØÓº ÆÓ ݸ Ô٠׸ ×Ù¬ ÒØ ×Ô Ó Ò ×Ø Ø ÜØÓ Ô Ö × ÖÒ Ö Ð Ö ×Ô ØÓº Ë Ò Ñ Ö Ó¸ ÒØ Ð ÔÓ× Ð Ö Ñ ÒØ ÓÒ Ð Ð ØÓÖ ÒØ Ð ÜØ Ò× Ú Ö Ù ÒØ ׸ × × Ò Ð Ö ×ÔÓÒ× Ð Ò ×Ø ×Ù ¹× ÓÒ Ñ Ò ÓÒ Ö ÜÔÐ Ø Ñ ÒØ ÐÓ× ÔÖ Ò Ô Ð × Ø ÜØÓ× Ö Ö Ò ½º ÏÖ Ø Ò ËÓÐ Ó ¾½ ËØ Ú Å Ù Ö Ú Ö× ×Ó Ö ÓÑÓ × Ö Ö ÔÖÓ Ö Ñ × ÕÙ ÒÓ ÓÒØ Ò Ò ÖÖÓÖ ×º ÙÒÕÙ Ô Ö Þ ÑÙÝ Ó× Ó¸ Å Ù Ö Ò× Ò ÙÒ × ÔÐ Ò ÕÙ Ù ÖÞ Ó ¬ Ö ÔÖÓ Ö Ñ × ÓÖÖ ØÓ׺ È Ö Ö ×ÙÑ Ö¸ Å Ù Ö Ð Ö ÙÒ Ñ ÒÓ Ò ØÓÖÒÓ Ð × ØÖ × ÔÖ ÙÒØ × Î Ò Ð º ¾º Ì ÈÖ Ø Ó ÈÖÓ Ö ÑÑ Ò ½ à ÖÒ Ò Ý È × ÙÒ Ð ÖÓ ×Ó Ö Ð × Ù Ò × ÓרÙÑ Ö × ÔÖÓ Ö Ñ ÓÒ¸ × Ö ØÓ ÓÒ ÑÙ ÙØÓÖ ¸ ÔÙ × ×Ù× ÙØÓÖ × ×ÓÒ ÔÖ Ø ÒØ × ÒÚÓÐÙ Ö Ó× Ò Ü Ð× × Ó Ö × ×Ó ØÛ Ö º Ò ÐÑ ÒØ ¸ Ó ÓÑÔÐ Ø ¾¿ ËØ Ú Å ÓÒÒ ÐÐ × ÙÒ ØÖ Ø Ó Ò ÐÓÔ Ó ×Ó Ö Ù Ò × ÓרÙÑ Ö × Ò ÔÖÓ Ö Ñ ÓÒº 3.7 Ejercicios ½º ÑÙ ×ØÖ Ð × ¬ÖÑ ÓÒ × Ü ¿º¾ ´Ô Ò ½ µ¸ Ü ¿º¿ ´Ô Ò ½ µ Ý Ü ¿º ´Ô Ò ½ µº ¾º ÑÙ ×ØÖ ØÓ × Ð × Ö Ð × Ð Ö × ÒÙÒ × Ò Ü ¿º½º º½ ´Ô Ò ½ ¾µº ¿º Ê ×Ù ÐÚ Ü Ø Ñ ÒØ Ð × × Ù ÒØ × Ö ÙÖÖ Ò × ´µ 1, n=1 T (n) = 3T (n − 1) + 2, n>2
  • 259.
    3.7. Ejercicios 233 ´µ 1, n=1 T (n) = 2T (n/2) + 1, n ≥ 2, n ÔÓØ Ò Ü Ø 2 ´µ T (n) = 1 × n=1 2T (n/2) + 6n − 1, n ≥ 2, n ÔÓØ Ò Ü Ø 2 ´µ T (n) = 1 × n≤1 2T (n/2) + Ð n × n>1 º ÓÒ× Ö Ð × Ù ÒØ ÙÒ ÓÒ unsigned int misterio(unsigned int & n) { if (n == 0) return 0; unsigned int suma = 0; for (unsigned int i = 1; i <= n; i++) suma += 2*i - 1; return suma; } ÉÙ Ö ØÓÖÒ Ð ÙÒ ÓÒ º × Ò ÙÒ Ð ÓÖ ØÑÓ Ô ÖØ ÓÒ ØÖ ÔÐ Ø Ð ÓÑÓ Ð ÜÔÐ Ó ÒÜ ¿º¾º¾º ´Ô Ò ½ µº º × Ò Ð ÔÖÓ Ñ ÒØÓ × Ö ØÓ Ò Ñ Þ Ð ÖÖ ÐÓ× ½ ¿ ÑÓ Ó Ø Ð ÕÙ Ð ÖÖ ÐÓ × ÙÒ Ö Ó ×ÓÐÓ ÓÒ×ÙÑ Ð Ñ Ø Ð ×Ô Óº × Ö¸ × Ð ÖÖ ÐÓ ×Ø ÒØÖ [l .. r]¸ ÒØÓÒ × Ð Ñ Ò× ÓÒ Ð ÖÖ ÐÓ b × Ö r−l−1 º 2 º × Ò ÙÒ Ð ÓÖ ØÑÓ Ò Ö Ó¸ ÕÙ × × ÖÚ Ð Ô ØÖÓÒ Ò Ö Ó Iterator¸ ÕÙ ÓÖ Ò ÔÓÖ × Ð ÓÒ ÙÒ × Ù Ò º × Ò Ð Ð ÓÖ ØÑÓ ÓÖÑ Ø Ð ÕÙ × ÐÓ Ñ × ¬ ÒØ ÔÓ× Ð Ò ÖÖ ÐÓ× Ý Ð ×Ø × Ó Ð Ñ ÒØ ÒÐ Þ ×º ºÄ ÑÞÐ Ó× × Ù Ò × ÓÖ Ò × Ù× Ò Ð Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓ ÔÓÖ Ñ Þ Ð Ö ÕÙ Ö ÓÔ Ö ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ× ÐÓ× ÖÖ ÐÓ× Ñ Þ Ð Ö Ò ÙÒ ÖÖ ÐÓ ÙÜ Ð Öº × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ×Ñ ÒÙÝ Ð ×Ô Ó ÓÒ Ð Ð Ñ Ø º º Ò Ð Ð Ø ÑÔÓ Ù ÓÒ Ð × Ù ÒØ × Ù Ó ÔÖÓ Ö Ñ void programa(int l, int r) { if (l >= r) return; O(1) int m = (l + r) / 2;
  • 260.
    234 Cap´ ıtulo 3. Cr´ ıtica de algoritmos programa(l, m - 1); programa(m + 1, r); } ½¼º Ó Ð × Ù ÒØ ÔÖÓ Ö Ñ int programa(int l, int r, int A[]) { if (r < l) return 0; for (int i = l; i < r; i++) x = x + A[i]; int y = 0; y += x + programa(l, r - 1, A); return y; } ´ µ Ò Ð Ð Ø ÑÔÓ Ù ÓÒ ´ µ È Ö Ð ÖÖ ÐÓ ½¸¾¸¿¸ ¸ ¸ º ÉÙ Ú ÐÓÖ ÚÙ ÐÚ Ð ÐÐ Ñ programa(3, 5, A) ½½º È Ö ÙÒÓ ÐÓ× × Ù ÒØ × ÔÖÓ Ö Ñ ×¸ Ò Ð Ð Ø ÑÔÓ Ù ÓÒ ´µ void f() { int i = 0; for(int j = i; j > -1; j++); } ´µ void g(int n) { for (int j = 2n; j < Ð n; j /= 2) i++; } ´µ void h(int n) { for (int x = 1; x < n; x += 2) printf("impar: %d", x); } ´µ void f(int N) { int n = 1; do {
  • 261.
    3.7. Ejercicios 235 n *= 2; for (z = 0; z < n; z++) printf("%dn", z); } while (n < N); } ½¾º ÓÒ× Ö ÙÒ ÖÖ ÐÓ ÓÒ n Ö ÒØ × ÒØ ÖÓ× ×ÓÖ Ò Ó× ÓÑÔÖ Ò Ó× ÒØÖ 0 Ý m, m nº Ë Ö ÕÙ Ö Ø ÖÑ Ò Ö ÙÒ ÒÙÑ ÖÓ ÐØ ÒØ ÒØÖ ÐÓ× ÒØ ÖÓ× ÓÒ ÙÒ Óר Ò ×Ô Ó O(1)º ÄÓ ÙÐØ ÑÓ × Ò ¬ ÕÙ ÒÓ × ÔÙ Ò ÙØ Ð Þ Ö ×ØÖÙ ØÙÖ × ØÓ× ÙÜ Ð Ö × ÙÝÓ ×Ô Ó Ö Þ Ò ÙÒ ÓÒ Ð Ø Ñ ÒÓ Ð ÖÖ ÐÓº ÈÓÖ ÑÔÐÓ¸ Ô Ö m = 1000 Ý ÙÒ ÖÖ ÐÓ A = [ 0 1 2 3 37 28 36 273 2721 99 327 7 354 6 84]¸ 500 ∈ A × ÙÒ ×ÓÐÙ ÓÒº / ´ µ ÈÖÓÔÓÒ ÙÒ Ð ÓÖ ØÑÓ Ù ÖÞ ÖÙØ ÕÙ Ö ×Ù ÐÚ Ð ÔÖÓ Ð Ñ º × Ö¸ Ù×ÕÙ Ò Ð ÖÖ ÐÓ ×Ø ÒÓ Ò ÓÒØÖ Ö Ð Ú ÐÓÖ iº ∀i ∈ [0..m], 0 ≤ i ≤ m ´ µ Ò Ð Ö ÙÖÓ× Ñ ÒØ Ð Ð ÓÖ ØÑÓ ÒØ Ö ÓÖ Ô Ö Ð Ñ ÓÖ¸ Ô ÓÖ Ý ×Ó ÔÖÓÑ Óº ´ µ ÈÖÓÔÓÒ ¸ ÜÔÐ ÕÙ Ý × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ö ×Ù ÐÚ Ð ÔÖÓ Ð Ñ Ò O(n Ð m) Ô Ö Ð Ô ÓÖ ×Óº ´ µ Ó Ð Ü ×Ø Ò Ð Ð ÓÖ ØÑÓ Ð ÔÖ ÙÒØ ÒØ Ö ÓÖ¸ × ÙØ Ù Ð Ý Ò Ù Ð × Ö ÙÒר Ò × ÙÒ Ð ÓÖ ØÑÓ × Ñ ÓÖ¸ Ð O(n Ð m) Ó Ð × Ò Ó Ò ½¾ º ½¿º Ð ÙÐ Ð Ø ÑÔÓ Ù ÓÒ Ð Ð ÓÖ ØÑÓ ÑÙÐØ ÔÐ ÓÒ ÔÓÐ ÒÓÑ Ó× × Ö¹ ÖÓÐÐ Ó Ò Ð ×Ù ¹× ÓÒ ½¼¼º ½º Ð Ñ Ò Ð Ö ÙÖ× ÓÒ ÓÐ Ð Ñ ØÓ Ó quicksort rec()º ½º Ê Ð ÙÒ ×ØÙ Ó ×Ø ר Ó Ö ÐÓ× Ø Ñ ÒÓ× Ô ÖØ ÓÒ × Ô ÖØ Ö Ð × Ù Ð × Ð ÓÖ Ò Ñ ÒØÓ ÔÓÖ Ò× Ö ÓÒ × Ñ × Ö Ô Ó ÕÙ Ð ÕÙ ×ÓÖØº ½º ÁÑÔÐ ÒØ Ð ÓÖ Ò Ñ ÒØÓ ÔÓÖ × Ð ÓÒ ÓÒ Ð ×Ø × × ÑÔÐ Ñ ÒØ ÒÐ Þ × Ð Ø ÔÓ Snode<T>º ½º ÁÑÔÐ ÒØ Ð ÓÖ Ò Ñ ÒØÓ ÔÓÖ Ò× Ö ÓÒ ÓÒ Ð ×Ø × × ÑÔÐ Ñ ÒØ ÒÐ Þ × Ð Ø ÔÓ Snode<T>º ½º ÁÑÔÐ ÒØ Ð ÓÖ Ò Ñ ÒØÓ ÔÓÖ Ñ Þ Ð ÓÒ Ð ×Ø × × ÑÔÐ Ñ ÒØ ÒÐ Þ × Ð Ø ÔÓ Snode<T>º ½º ÁÑÔÐ ÒØ ÙÒ ÕÙ ×ÓÖØ Ø Ö Ø ÚÓ ÕÙ ÓÖ Ò Ð ×Ø × × ÑÔÐ Ñ ÒØ ÒÐ Þ × Ð Ø ÔÓ Snode<T>º ¾¼º ÁÑÔÐ ÒØ Ð ÕÙ ×ÓÖØ ÓÒ Ð ×Ø × × ÑÔÐ Ñ ÒØ ÒÐ Þ × Ð Ø ÔÓ Snode<T>º ¾½º × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ô ÖØ ÓÒ ÙÒ Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ Ö ÙÐ Ö ÓÒ ÒÓ Ó Ö Ð Ø ÔÓ Snode<T>º Ð ÔÖÓØÓØ ÔÓ × Ð × Ù ÒØ Snode<T> * partir(Snode<T> & list, Snode<T> & l1, Snode<T> & l2);
  • 262.
    236 Cap´ ıtulo 3. Cr´ ıtica de algoritmos ÁÒ ÐÑ ÒØ ¸ l1 Ý l2 ר Ò Ú ×º Ð ¬Ò Ð Ð ÐÐ Ñ × Ö ØÓÖÒ Ð Ð Ñ ÒØÓ Ô ÚÓØ Ð Ô ÖØ ÓÒ Ð Ð ×Ø list ÕÙ Ú Ý l1 ÓÒØ Ò ÐÓ× Ð Ñ ÒØÓ× Ñ ÒÓÖ × ÕÙ Ð Ô ÚÓØ Ñ ÒØÖ × ÕÙ l2 ÐÓ× Ñ ÝÓÖ ×º ¾¾º × Ò ÑÔÐ ÒØ ÙÒ ÕÙ ×ÓÖØ ÒÓ Ö ÙÖ× ÚÓ ×Ó Ö Ð ×Ø × Ó Ð × Ø ÔÓ Dnode<T>º ¾¿º × Ò ÑÔÐ ÒØ ÙÒ ÕÙ ×ÓÖØ ÒÓ Ö ÙÖ× ÚÓ ×Ó Ö Ð ×Ø × × ÑÔÐ × Ø ÔÓ Snode<T>º ¾º × Ò ÑÔÐ ÒØ ÙÒ ÕÙ ×ÓÖØ ×Ó Ö Ð ×Ø × Ó Ð × ÓÒ Dnode<T> ÕÙ × Ð ÓÒ Ð Ñ Ò ÒØÖ Ð ÙÒÓ× ÐÓ× Ð Ñ ÒØÓ× ÓÒר ÒØ Ñ ÒØ × ÕÙ Ð × Ð Ð ×Ø º ¾º × Ö Ð ÕÙ ×ÓÖØ Ô Ö Ð ×Ø × Ó Ð Ñ ÒØ ÒÐ Þ × Ñ Ò Ö Ø Ð ÕÙ Ð ØÓÖ Ð × Ð ÓÒ Ð Ô ÚÓØ º ¾º × Ò ÑÔÐ ÒØ Ð × Ù ÒØ ÔÖ Ñ Ø Ú int select_pivot(T a[], const int & l, const int & r, const int& n) Ä Ù Ð ×ÓÖØ Ð Þ Ö n Ò × ÒØÖ l Ý r Ý × Ð ÓÒ Ð Ò ÓÖÖ ×ÔÓÒ ÒØ Ð Ñ Òº ÆÓ Ú Ö ¬ÕÙ Ö Ô Ø Ò ÒØÖ ÐÓ× Ò ×º ¾º ÅÓ ¬ÕÙ Ð ÕÙ ×ÓÖØ Ô Ö Ð ×Ø × ÒÐ Þ × ÔÖ × ÒØ Ó Ò Ü ¿º¾º¾º ´Ô Ò ½ µ Ô Ö ÕÙ Ö Ð ÙÒ Ñ ÓÖ × Ð ÓÒ Ð Ô ÚÓØ º ¾º ×ØÙ Ð ÓÒ×ÙÑÓ ×Ô Ó Ò Ô Ð ÕÙ Ó × ÓÒ Ð Ñ Ö ×ÓÖØ Ó Ð × ÐÐ Ñ × Ö ÙÖ× Ú ×º ¾º ÅÓ ¬ÕÙ Ð ÕÙ ×ÓÖØ Ô Ö Ð ×Ø × ÒÐ Þ × ÔÖ × ÒØ Ó Ò Ü ¿º¾º¾º ´Ô Ò ½ µ Ô Ö ÕÙ Ñ Ò Ñ Ð ÓÒ×ÙÑÓ ×Ô Ó Ò ×Ù× ÐÐ Ñ × Ö ÙÖ× Ú ×º ¿¼º ÐÓ× Ñ ØÓ Ó× ÓÖ Ò Ñ ÒØÓ ÔÖ × ÒØ Ó× Ò ×Ø Ô ØÙÐÓ¸ Ù Ð × Ö Ð Ñ ÓÖ Ô Ö ÓÖ Ò Ö Ð ×Ø × ÒÐ Þ × ¿½º Ð Ñ ×ÑÓ Ö Ó ÕÙ Ð ÒØ Ö ÓÖ¸ Ô ÖÓ ×Ø Ú Þ ÒÓ ÔÙ Ö Ö Ô Ø Ò ÒØÖ ÐÓ× Ò × ×ÓÖØ Ó׺ ¿¾º × Ò ÑÔÐ ÒØ ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ò Ù ÒØÖ Ð i¹ × ÑÓ Ñ ÒÓÖ Ð Ñ ÒØÓ ÙÒ Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ ×ÓÖ Ò ´Snode<T>µº ¿¿º × Ò ÑÔÐ ÒØ ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ò Ù ÒØÖ Ð i¹ × ÑÓ Ñ ÒÓÖ Ð Ñ ÒØÓ ÙÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ ×ÓÖ Ò ´Dnode<T>µº ¿º × Ò ÑÔÐ ÒØ Ð ×ÕÙ Ñ ØÖ ÔÐ Ô ÖØ ÓÒ Ñ ÒØÓ ÜÔÐ Ó Ò Ü ¿º¾º¾º ´Ô Ò ½ µ Ô Ö Ñ Ò Ö Ð Ú × Ö Ô Ø ×º ¿º Ò Ð Ö ÙÖÓ× Ñ ÒØ ¸ Ô Ö ÐÓ× ×Ó× ×Ô Ö Ó Ý Ô ÖÓ¸ Ð × ÑÔ ÒÓ Ð ÔÖ Ñ Ø Ú random search()º ¿º × Ö Ð random search() Ô Ö Ð ×Ø × × ÑÔÐ Ñ ÒØ ÒÐ Þ × Ø ÔÓ Slinkº ¿º Ò Ð Ö ÙÖÓ× Ñ ÒØ ¸ Ô Ö ÐÓ× ×Ó× ×Ô Ö Ó Ý Ô ÖÓ¸ Ð × ÑÔ ÒÓ Ð ÔÖ Ñ Ø Ú random select()º
  • 263.
    3.7. Bibliograf´ ıa 237 ¿ º ÁÑÔÐ ÒØ Ð random search() ÓÒ Ð ×Ø × × ÑÔÐ × Ø ÔÓ Snode<T>º ¿ º ÁÑÔÐ ÒØ Ð random select() ÓÒ Ð ×Ø × × ÑÔÐ × Ø ÔÓ Snode<T>º ¼º ÁÑÔÐ ÒØ Ð ÓÒ ÙÒØÓ ÙÒ Ñ ÒØ Ð ÓÒ ÖÖ ÐÓ× ×ÓÖ Ò Ó× × Ó Ò Ð × ÔÖ Ñ Ø ¹ Ú × random search() Ý random select()º ½º ÁÑÔÐ ÒØ Ð ÓÒ ÙÒØÓ ÙÒ Ñ ÒØ Ð ÓÒ Ð ×Ø × × ÑÔÐ × Ø ÔÓ Snode<T> × Ó Ò Ð × ÔÖ Ñ Ø Ú × random search() Ý random select()º ¾º ÁÑÔÐ ÒØ Ð ÓÒ ÙÒØÓ ÙÒ Ñ ÒØ Ð ÓÒ Ð ×Ø × Ó Ð × Ø ÔÓ Dnode<T> × Ó Ò Ð × ÔÖ Ñ Ø Ú × random search() Ý random select()º ¿º ×ØÙ Ð ¬ Ò Ð Ð ÓÖ ØÑÓ ¿º¾º º ÜØ Ò GNU nana Ô Ö ÕÙ Ñ Ò ÐÓ× Ù ÒØ ¬ ÓÖ × ÕÙ Ú Ö ¬ÕÙ Ò ÓÒØ Ò ÓÖ × Ð Ð ÓØ ALEPHº º È Ö ØÓ Ó× ÐÓ× Ì × Ò Ó× ×Ø Ð ÔÖ × ÒØ ¸ Ú Ö ¬ÕÙ Ð ÔÐ ÓÒ Ð × Ö Ð × ÀÓÐØÞÑ ÒÒ ½½ ÔÖ × ÒØ × Ò Ü ¿º º¿º½ ´Ô Ò ¾¼ µº Bibliograf´ ıa ½ Ð ØÖ Ò º Ú Ð Ð ÓÒ http://www.pf-lug.de/projekte/haya/efence.phpº ¾ Ð Û¬Ò Öº Ú Ð Ð ÓÒ http://www.dwheeler.com/flawfinder/º ¿ È ÙÐ Ñ ÒÒº Ò ÐÝØ × Ð ÒØ ÓÖ º Ð ÒØ ÓÖ ¸ ÔØº ¾º º º Ì Ù ¹ Ò Ö¸ Ä ÔÞ ¸ ½ º Ö Ö Èº ÖÓÓ ×º Ì ÅÝØ Ð Å Ò¹ÅÓÒØ ×× Ý× ÓÒ ËÓ ØÛ Ö Ò Ò Ö Ò ¸ ¾¼Ø ÒÒ Ú Ö× ÖÝ Ø ÓÒº ×ÓÒ Ï ×Рݸ Ê Ò ¸ Å ×׺¸ × ÓÒ Ø ÓÒ¸ ½ º º Ù º Ï × ÓÒ ¹ÓÖ Ö ÐÓ Ò ¬Ò Ø ÙØÓÑ Ø º º Å Ø º ÄÓ ÖÙÒ Ð Ò Å Ø º¸ ß ¾¸ ½ ¼º º º ÓÖ ØÓ¸ º Àº Ë ÐØÞ Ö¸ Ò º ̺ Ð Ò Òº ÅÙÐØ × ß Ø ¬Öר × Ú Ò Ý Ö׺ ÁÒ ËÔÖ Ò ÂÓ ÒØ ÓÑÔÙØ Ö ÓÒ Ö Ò ¸ Ô × ½ß ¿º ÁÈË ÈÖ ×׸ Å Ý ½ ¾º Û×ÓÒ Ò Ð Ö¸ Ú Ù Ò¸ Ë Ø À ÐРѸ Ò Ý ÓÙ¸ Ò Ò Ñ Ò Ðº Ù × × Ú ÒØ Ú ÓÖ Ò Ö Ð ÔÔÖÓ ØÓ Ò ÖÖ Ò ÖÖÓÖ× Ò ×Ýר Ñ× Ó ¸ Ù Ùר ¼ ¾¼¼½º Û×ÓÒ Êº Ò Ð Ö¸ Ò Ñ Ò Ð ¸ Ò Ý ÓÙ¸ Ò Ë Ø À ÐРѺ Ò ×Ýר Ñ ÖÙÐ × Ù× Ò ×Ýר ѹ×Ô ¬ ¸ ÔÖÓ Ö ÑÑ Ö¹ÛÖ ØØ Ò ÓÑÔ Ð Ö ÜØ Ò× ÓÒ׺ ÁÒ ÈÖÓ Ò × Ó Ø Ø ËÝÑÔÓ× ÙÑ ÓÒ ÇÔ Ö Ø Ò ËÝר Ñ × Ò Ò ÁÑÔÐ Ñ ÒØ Ø ÓÒ¸ Ô × ½ß½ ¸ ¾¼¼¼º º º ʺ ÀÓ Ö º Ð ÓÖ Ø Ñ× ÉÙ ×ÓÖØº ÓÑÑÙÒ Ø ÓÒ× Ó Ø Å¸ ´ µ ¿¾½¸ ½ ½º ½¼ È Ö ÀÓÐ Ö¸ Â Ò¹Å Ö Â Þ Õ٠и Ò ÖØÖ Ò Å Ý Öº Ä ØØ Ö× ÈÐ Ò Ø Ð Ñ ÓÖ Ö Ò º ÓÑÔÙØ Ö¸ ¿¼´ µ ¸ ¸ Å Ý ½ º
  • 264.
    238 Cap´ ıtulo 3. Cr´ ıtica de algoritmos ½½ ÀÓÐØÞÑ ÒÒº Ì ÔÓÛ Ö Ó ½¼ ÊÙÐ × ÓÖ Ú ÐÓÔ Ò × ØÝ¹ Ö Ø Ð Ó º ÇŹ ÈÍÌ Ê Á ÓÑÔÙØ Ö¸ ¿ ¸ ¾¼¼ º ½¾ º º ÀÓÐÞÑ ÒÒº Ì ËÔ Ò ÅÓ Ð Ö¸ ÈÖ Ñ Ö Ò Ê Ö Ò Å Ò٠к ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ×× Ù× ØØ×¸ ¾¼¼¿º ½¿ Ö Ö Âº ÀÓÐÞÑ ÒÒº × Ò Ò Î Ð Ø ÓÒ Ó ÓÑÔÙØ Ö ÈÖÓØÓ ÓÐ׺ ÈÖ ÒØ À Ðи Ò Ð ÛÓÓ Ð «×¸ ÆÂ¸ ½ ½º ½ Ö Ö Âº ÀÓÐÞÑ ÒÒº Ì ÑÓ Ð Ö ×Ô Òº Á ÌÖ Ò× Ø ÓÒ× ÓÒ ËÓ ØÛ Ö Ò Ò Ö Ò ¸ ¾¿´ µ ¾ ß¾ ¸ Å Ý ½ º ½ Ö Ö Âº ÀÓÐÞÑ ÒÒº Ò Ò ÐÝ× × Ó Ø×Ø Ø × Ò º ÓÖÑ Ð Å Ø Ó × Ò ËÝר Ñ × Ò¸ ½¿´¿µ ¾ ß¿¼ ¸ ½ º ½ Â Ò¹Å Ö Â Þ ÕÙ Ð Ò ÖØÖ Ò Å Ý Öº Ç Ø Ø ÒÓÐÓ Ý × Ò Ý ÓÒØÖ Ø Ì Ð ××ÓÒ× Ó Ö Ò º ÓÑÔÙØ Ö¸ ¿¼´½µ ½¾ ß½¿¼¸  ÒÙ ÖÝ ½ º Ë Ð×Ó Ð ØØ Ö× ½¼ º ½ ˺ º ÂÓ Ò×ÓÒº ÄÁÆÌ C ÔÖÓ Ö Ñ Öº ÁÒ ÍÆÁ ÈÖÓ Ö ÑÑ Ö Å Ò٠к ÄÄ Ä ×º¸ 7 th Ø ÓÒ¸ ½ º ½ Ö Ò Ïº à ÖÒ Ò Ò ÊÓ È º Ì ÈÖ Ø Ó ÈÖÓ Ö ÑÑ Ò º ×ÓÒ¹Ï ×Рݸ Ê Ò ¸Å ¸½ º ½ ÓÒ Ð º ÃÒÙØ º ËÓÖØ Ò Ò Ë Ö Ò ¸ ÚÓÐÙÑ ¿ Ó Ì ÖØ Ó ÓÑÔÙØ Ö ÈÖÓ Ö ÑÑ Ò º ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ÍË ¸ × ÓÒ Ø ÓÒ¸ ½ º ¾¼ Ð × Ö Å ÁÒØÝÖ ¸ ØÓÖº Ø Ö Î ÖØÙ º ÍÒ Ú Ö× ØÝ Ó ÆÓØÖ Ñ ÈÖ ×׸ ½ º ¾½ ËØ Ú Å Ù Ö º ÏÖ Ø Ò ×ÓÐ Ó Å ÖÓ×Ó Ø³× Ø Ò ÕÙ × ÓÖ Ú ÐÓÔ Ò Ù ¹ Ö ÔÖÓ Ö Ñ׺ ÅÁ ÊÇËÇ Ì¸ ½ ¿º ¾¾ º Å ÒÒ Ò º ÈÒÙ Ð º ËÔ ¬ Ø ÓÒ Ò Ú Ö ¬ Ø ÓÒ Ó ÓÒ ÙÖÖ ÒØ ÔÖÓ Ö Ñ× Ý Î¹ ÙØÓÑ Ø º ÁÒ ÓÒ Ö Ò Ö ÓÖ Ó Ø ½ Ø Å ËÝÑÔÓ× ÙÑ ÓÒ ÈÖ Ò ÔÐ × Ó ÈÖÓ Ö ÑÑ Ò Ä Ò Ù × ´ÈÇÈĵ¸ Ô × ½ß½¾¸ ½ º ¾¿ ËØ Ú Å ÓÒÒ Ðк Ó ÓÑÔÐ Ø º Å ÖÓ×Ó Ø ÈÖ ×׸ Ê ÑÓÒ ¸ Ï º¸ ½ ¿º ¾ ÖØÖ Ò Å Ý Öº × Ò Ý ÓÒØÖ Ø¸ ÓÑÔÓÒ ÒØ× Ò Ù Ò º ÂÇÇȸ ½½´ µ ß ¸½ º ¾ º º ÅÝ Ö׺ Ì ÖØ Ó ËÓ ØÛ Ö Ì ×Ø Ò º ÂÓ Ò Ï Ð Ý ² ËÓÒ׸ ½ º ¾ Æ ÓÐ × Æ Ø Ö ÓØ Ò ÂÙÐ Ò Ë Û Ö º Î Ð Ö Ò ÔÖÓ Ö Ñ ×ÙÔ ÖÚ × ÓÒ Ö Ñ ÛÓÖ º Ð ØÖº ÆÓØ × Ì ÓÖº ÓÑÔÙØº Ë ¸ ´¾µ¸ ¾¼¼¿º ¾ Æ ÓÐ × Æ Ø Ö ÓØ Ò ÂÙÐ Ò Ë Û Ö º Î Ð Ö Ò ÔÖÓ Ö Ñ ×ÙÔ ÖÚ × ÓÒ Ö Ñ ÛÓÖ º Ð ØÖº ÆÓØ × Ì ÓÖº ÓÑÔÙØº Ë ¸ ´¾µ¸ ¾¼¼¿º ¾ Å Ò Ö Ð Î Û Ó Ø ÅÙÐØ × ËÝר Ñ Ú ÐÓÔÑ ÒØº º º ÓÖ ØÓ Ò º ̺ Ð Ò¹ Òº ÁÒ ÓÒ Ö Ò ÓÒ Ê × Ö Ö Ø ÓÒ× Ò ËÓ ØÛ Ö Ì ÒÓÐÓ Ý¸ ÈÖÓÚ Ò ¸ Ê Ó Á×Ð Ò ¸ Ç ØÓ Ö ½ º ¾ º È ÖÖ Øº ÙÒ Ø ÓÒ º http://www710.univ-lyon1.fr/~perret/fnccheck/profiler.htmlº y
  • 265.
    3.7. Bibliograf´ ıa 239 ¿¼ ÈºÂºÅ Ö Ò Ì Ö ËÓ ØÛ Ö ÓÙÒ Ø ÓÒº Ì ÆÍ Æ Æ ÓÑ Ô º ¿½ º ÈÒÙ Ð º Ì Ø ÑÔÓÖ Ð ÐÓ Ó ÔÖÓ Ö Ñ׺ ÁÒ Ó × ¸ Ô × ß ¸ ½ º ¿¾ Ú Ëº ÊÓ× Ò ÐÙѺ ÓÖÖ Ø ÓÒ ØÓ ÔÖ Ø Ð ÔÔÖÓ ØÓ ÔÖÓ Ö ÑÑ Ò Û Ø ×× ÖØ ÓÒ× º Á ÌÖ Ò× Ø ÓÒ× ÓÒ ËÓ ØÛ Ö Ò Ò Ö Ò ¸ ¾½´¿µ ¾ ¸ Å Ö ½ º ¿¿ Ú Ëº ÊÓ× Ò ÐÙѺ ÔÖ Ø Ð ÔÔÖÓ ØÓ ÔÖÓ Ö ÑÑ Ò Û Ø ×× ÖØ ÓÒ׺ Á ÌÖ Ò× Ø ÓÒ× ÓÒ ËÓ ØÛ Ö Ò Ò Ö Ò ¸ ¾½´½µ ½ ß¿½¸  ÒÙ ÖÝ ½ º ¿ Ì Ó º ÊÙÝ× Ò Ö Ö Âº ÀÓÐÞÑ ÒÒº Ú Ò ËÈÁÆ ØÙØÓÖ Ðº ÁÒ ËÙ× ÒÒ Ö Ò Ä ÙÖ ÒØ ÅÓÙÒ Ö¸ ØÓÖ׸ ÅÓ Ð Ò ËÓ ØÛ Ö ¸ ½½Ø ÁÒØ ÖÒ Ø ÓÒ Ð ËÈÁÆ ÏÓÖ × ÓÔ¸ Ö ÐÓÒ ¸ ËÔ Ò¸ ÔÖ Ð ½¹¿¸ ¾¼¼ ¸ ÈÖÓ Ò ×¸ ÚÓÐÙÑ ¾ Ó Ä ¹ ØÙÖ ÆÓØ × Ò ÓÑÔÙØ Ö Ë Ò ¸ Ô × ¿¼ ß¿¼ º ËÔÖ Ò Ö¸ ¾¼¼ º ¿ ÊÓ ÖØ Ë Û º Ð ÓÖ Ø Ñ× Ò È ÖØ× ½ß ÙÒ Ñ ÒØ Ð׸ Ø ×ØÖÙ ØÙÖ ×¸ ×ÓÖØ Ò ¸ × Ö Ò º ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ÍË ¸ ½ º ¿ ËØ Ú Ò Ëº Ë Ò º Ì Ð ÓÖ Ø Ñ × Ò Å Ò٠к ËÔÖ Ò Ö¹Î ÖÐ ¸ ÖÐ Ò¸ Ö¹ Ñ ÒÝ » À Ð Ö ¸ ÖÑ ÒÝ » ÄÓÒ ÓÒ¸ Íà » Ø º¸ ½ º ¿ Ê Ö ËØ ÐÐÑ Ò Ò ÊÓÐ Ò Àº È × º Ù Ò ÛØ Ø ÆÍ ×ÓÙÖ ¹ Ð Ú Ð Ù Öº Ö ËÓ ØÛ Ö ÓÙÒ Ø ÓÒ¸ ÁÒ º¸ ÔÙ ¹ Ë Ö¸ º¼ ÓÖ Ú Ö× ÓÒ º Ø ÓÒ¸ ½ ¿º ÈÖ Ú ÓÙ× Ø ÓÒ ÔÙ Ð × ÙÒ Ö Ø ØÐ Ì Ñ Ò٠к Ù Ùר ½ ¿º ¿ ÊÓ ÖØ º Ì Ö Òº ÑÓÖØ Þ ÓÑÔÙØ Ø ÓÒ Ð ÓÑÔÐ Ü ØÝº Ë Ð ×¸ ¿¼ ß¿½ ¸ ½ º ¿ ̺ Ú Ò ÎÐ º Ì Ö ÕÙ ×Ø ÓÒ× ÓÙØ Ù ÝÓÙ ¬Ò º ½ º ¼ ÂÓ Ò Î ¸ º ̺ ÐÓ ¸ Ì ÝÓ× ÃÓ ÒÓ¸ Ò ÖÝ Å Ö Ûº ÁÌË ×Ø Ø ÚÙÐÒ Ö Ð ØÝ × ÒÒ Ö ÓÖ Ò ·· Ó º ÁÒ ½ Ø ÒÒÙ Ð ÓÑÔÙØ Ö Ë ÙÖ ØÝ ÔÔÐ Ø ÓÒ× ÓÒ Ö Ò º Ÿ Ñ Ö ¾¼¼¼º ½ Ö Ý Ï Ø×ÓÒº Ñ ÐÐÓ ¹ Ù Ñ ÐÐÓ Ð Ö Öݺ Ú Ð Ð ÓÒ http://dmalloc.com/º ¾ Æ Ð Ù× Ï ÖØ º Ð ÓÖ Ø Ñ× + Ø ËØÖÙ ØÙÖ × = ÈÖÓ Ö Ñ׺ ÈÖ ÒØ ¹À ÐÐ Ë Ö × Ò ÙØÓÑ Ø ÓÑÔÙØ Ø ÓÒº ÈÖ ÒØ ¹À Ðи ÍÔÔ Ö Ë Ð Ê Ú Ö¸ ÆÂ ¼ ¸ ÍË ¸ ½ º ¿ È ÖÖ ÏÓÐÔ Ö Ò Ò × Ä ÖÓݺ Ê Ð Ð × Ò Û Ø ÓÙØ ÓÐÐÓ× ÓÒ Ø Ø ÓÒº ÁÒ Óר × ÓÙÖ ÓÙ Ø ×¸ ØÓÖ¸ ÓÑÔÙØ Ö Î Ö ¬ Ø ÓÒ¸ Ø ÁÒØ ÖÒ Ø ÓÒ Ð ÓÒ¹ Ö Ò ¸ Î ³ ¿¸ ÐÓÙÒ ¸ Ö ¸ ÂÙÒ ¾ ¹ ÂÙÐÝ ½¸ ½ ¿¸ ÈÖÓ Ò ×¸ ÚÓÐÙÑ Ó Ä ØÙÖ ÆÓØ × Ò ÓÑÔÙØ Ö Ë Ò ¸ Ô × ß ¼º ËÔÖ Ò Ö¸ ½ ¿º ÂÙÒ Ò Ò ¸ Ò Ë Ö¸ Ò Û×ÓÒ Ò Ð Öº ÔÐÓ Ð ØÛ ظ Ò Ö Ð ×Ýר Ñ ÓÖ ¬Ò Ò × Ö ÓÙ× ×ØÓÖ ×Ýר Ñ ÖÖÓÖ׺ ÁÒ ÈÖÓ Ò × Ó Ø Ø ËÝÑÔÓ× ÙÑ ÓÒ ÇÔ Ö Ø Ò ËÝר Ñ × Ò Ò ÁÑÔÐ Ñ ÒØ Ø ÓÒ¸ ¾¼¼ º Ⱥ ¬ÖÓÔÙÐÓ¸ º Ï ×Ø¸ Àº ÊÙ Ò¸ º ÓÛ Ò¸ Ò º Ö Ò º ÌÓÛ Ö × Ò ÐÝ× Ò Ò ×ÝÒØ × Þ Ò ÔÖÓØÓ ÓÐ׺ Á ÌÖ Ò× Ø ÓÒ× ÓÒ ÓÑÑÙÒ Ø ÓÒ¸ ÓÑѹ ¾ ´ µ ½¾¼½¿ ½¸ ½ ¼º Ò Ö × ÐÐ Ö Ò ÓÖÓØ ÄÙØ Ù׺ ¹ Ö Ö Ô Ð ÖÓÒØ¹ Ò ÓÖ ÍÆÁ Ù Ö׺ ËÁ ÈÄ Æ ÆÓØ ×¸ ¿½´½µ ¾¾ß¾ ¸ ½ º
  • 267.
    Cap´ ıtulo 4 ´ Arboles ÙÒÕÙ ØÙ ÐÑ ÒØ ÓÒ Ø Ò Ò Ð ÓÐÚ Ó¸ × ÑÙ Ó Ø ÑÔÓ¸ ×Ó ÕÙ Ð ÖÒ ÒØ Ý × ÒØ Ó ÙÒ Ó× × Ð ÐÐ Ñ × Ò Ó ÕÙ º × Ý ÙÖ ÒØ × ÒÑ ÑÓÖ Ð ×¸ Ò ×ØÖ Ð × Ý Ð Ò ×¸ × Ö ÕÙ Ð ÕÙ Ð Ó × ×ØÙ Ô ÖØ Ö ×Ù ÓÒØ ÜØÓ ÓÖ Òº ÄÓ ÕÙ ÓÖ ÚÙÐ ÖÑ ÒØ ÐÐ Ñ ÑÓ× ÙØÙÖÓ¸ Ò ×ØÖ ÐÑ ÒØ × Ð ÒÓÑ Ò ×Ø ÒÓ Ó × ¸ ÓÒ × Ú º Ù Ò Ó × ÕÙ Ö × Ö ÕÙ Ö ´ × ÓÒ Ú Ò µ Ý ÕÙ Ú Ò Ö ´ ÓÒ Ú µ ÙÒ Ó× ¸ × ×ØÙ Ý × ÖØ ×Ù Ò ÐÓ × Ö¸ ×Ù ÓÖ Ò Ý Ú Ò Ö Ô ÖØ Ö ×Ù Ò × ×º Ð Ø ÖÑ ÒÓ Ò ÐÓ ¸ ÕÙ ÓÒØ Ò ÒÙ× ½ ¸ ÔÖÓÚ Ò Ð Ð Ø Ò Ò ÐÓ ¸ Ð Ù Ð ÔÖÓÚ Ò ×Ù Ú Þ Ð Ö Ó γενεαλογ α Ý × Ò ¬ Ð ×ØÙ Ó Ð Ñ ÒÓ × Ð ÓÖ Ò ´ Ò × ×µ ר Ð ÔÖ × ÒØ º ÀÓÝ Ò Ð Ò ÐÓ Ø Ò ×ØÙ Ö× ÓÑÓ ÙÒ × ÙÒ Ú ÒØÓ× Ö ×Ô ØÓ ÙÒ ÑÓÚ Ñ ÒØÓ ÜØ ÖÒÓ Ý ÒÓ ÐÓ× Ú ÒØÓ× ÐÐ Ñ Ó Ø ÑÔÓº ר Ø ÔÓ ×ØÙ Ó × Ð ÐÐ Ñ ¸ ÔÓÖ ÐÓ Ò Ö Ð¸ À רÓÖ º ÀÙ Ó ÔÓ ×¸ × Ò Ñ Ö Ó¸ Ò ÕÙ Ð ÙÒÓ× Ò ÐÓ ×Ø × × ÒØ Ò ÕÙ Ð ÕÙ ÙÒ Ó× ÒÓ × Ö Ñ Ø ÙÒ Ñ Ö Ý ÙÒ × Ù Ò Ú ÒØÓ׸ × ÒÓ Ú Ö× × Ý Ú Ö Ð × × Ù Ò × ÕÙ ÔÖÓÚ Ò Ò × ÙÒ ÑÓÑ ÒØÓ ÒÓÑ Ò Ó ÓÖ Ò¸ ÓÒÚ Ö Ò ÓØÖÓ ÑÓÑ ÒØÓ ÐÐ Ñ Ó ÔÖ × ÒØ ¸ Ý ÔÖÓ× Ù Ò Ð Ó ÔÓÖ Ú Ò Ö ÕÙ × ÐÐ Ñ ×Ø ÒÓº ÕÙ ¹ ÐÐÓ× Ò ÐÓ ×Ø × × Ô Ö Ø ÖÓÒ ÕÙ ÓÒÚ Ú Ò ÓÒ Ø ×Ø Ó× ÕÙ Ò ÓÑÔ Ò Ó ×Ù× × Ò ÒØ × Ý ÕÙ Ð × ×Ó Ö Ú Ú Ö Ò ÐÐÓ× Ý ×Ù× × Ò ÒØ ׺ × Ñ ×ÑÓ¸ × × Ò ÖÓÒ ÔÓÖ Ð Ó ÕÙ Ð × ÔÖÓÔ × ÓÖÑ × ÕÙ ÐÐÓ× Ø ×Ø Ó× Ò Ò ×Ù Ú Ò Ö Ý º Ð Ò ÖÓ ÕÙ Ð Ø ×Ø Ó ÓÝ × Ð Ñ ÒØ Ó Ð ÒÓÑ Ö Ö ÓРݸ Ð Ü Ô ÓÒ Ð ÙÐØÙÖ Ø ÒÓÐÓ ¾ ר ÔÓ ¸ Ò Ð × Ö ×Ø ÒØ × Ð Ö ÓÐ Ù× Ó Ø ÒØÓ ×ÓÑ ÖÓ¸ ØÖ Ú × Ð × × Ý Ð Ø ØÙ ׸ ÕÙ × Ó Ð ÜØÖ ÑÓ ×Ù ØÓ Ú Ò Ö ÓÒº ÈÓÖ ÕÙ ×ÓÑ Ö Ô ÖØ ×Ù ÐÐ Þ ¸ ÑÓÒÙÑ ÒØ Ð Ý ÐÓÒ Ú ¸ ÚÖ × Ö ÞÓÒ ×º ÍÒ Ð × ÔÖ Ò Ô Ð ×¸ Ö Ò ÒØ Ö × Ô Ö ÒÙ ×ØÖÓ ÓÒØ ÜØÓ¸ Ö ×Ù ×ØÖÙ ØÙÖ Ò Ö ¸ × ÓÑÓ ×Ù ÚÓÐÙ ÓÒº ÍÒ Ö ÓÐ ÓÑ ÒÞ Ò Ð ÑÙÒ Ó ÓÑÓ ÙÒ × Ñ ÐÐ Ø ÕÙ Ð ÒØ Ñ ÒØ ÒÖ Þ Ý Ö Ñ Ö Ò Ó Ý Ù× Ò Ó Ð ÐÙÞ Ò ÙÒ ØÖ Ñ Ö ÖÕÙ ÕÙ ØÖ Þ ×Ù ¸ ×Ù Ò ÐÓ Ý ÕÙ ØÖ Ò× Ñ Ò Ö ×Ù ×Ø ÒÓº ÙÒÕÙ ÔÓÖ ÐÓ Ò Ö Ð ÙÒ Ö ÓÐ ÐÓ Ñ Ö ÑÓ× ÓÑÓ ÙÒ Ö ÓÐ × Ö¸ ÓÑÓ ÙÒ ØÓ Ó¸ Ò Ó × ÓÒ × Ñ Ö ÑÓ× ×Ù× Ô ÖØ × Ö Þ¸ ØÖÓÒ Ó¸ Ö Ñ ×¸ Ó ×¸ ­ÓÖ ×¸ ºººº Å ÒØÖ × Ñ × Ö × ×Ø Ð Ö Þ¸ Ñ × ÒØ Ù × Ð Ö ÓÒ Ð Ö ÓÐ ÕÙ Ñ Ö ÑÓ× Ò ÐÓ Ñ ÒØ ¸ Ñ ÒØÖ × Ñ × ÐØ Ó ÑÔÐ ×Ø ׸ Ñ × ÓÚ Ò × Ð Ô ÖØ Ö ×Ô ØÓ ÓØÖ × Ò Ö ÓÖ × Ó Ñ × ÒØ ÖÒ ×º ר Ô ØÖÓÒ ×ØÖÙ ØÙÖ Ð¸ ÕÙ ÒÓ × ÓÖÖ ×ÔÓÒ ÓÒ ÙÒ Ñ Ö × Ù Ò ¸ Ô Ö Ò ÙÒ ÒÙÑ Ö × Ñ Ú Ö ½ Î × Ý Ö Ù Ö × Ü ½º¾º¿º ´Ô Ò ½ µº ¾ Ç ÕÙ Þ ¸ Ñ ÓÖ Ó¸ Ð ÒØ ¹ ÙÐØÙÖ º ¾½
  • 268.
    242 Cap´ ´ ıtulo 4. Arboles ÓÒØ ÜØÓ× ÒÙ ×ØÖ Ú ÐÓ× Ù Ð × ÒÓ × Ô Ð ÓÑÔÙØ ÓÒº ÐÓ× ØÓ× Ý Ó× ÙÑ ÒÓ× Ð × ÐÐ Ñ ÑÓ× ×ØÓ× ¸ ÔÙ × ×ØÓ× ×Ø Ò º Ë Ö ÙÑ ÒÓ ×ÓÐÓ Ø Ò × ÒØ Ó ÓÒ ÐÓ× ÓØÖÓ× × Ö × ÙÑ ÒÓ׺ Å × ÙÑ ÒÓ× ×ÓÑÓ× Ò Ð Ñ Ò ÕÙ Ñ × ÒÓ× Ý ÑÓ× Ò Ö Ð ÓÒ Ó ÓÒ ÐÓ× ÓØÖÓ׺ Ð ÙÒ Ñ Ò Ö ÔÓ Ö ÑÓ× Ö ÕÙ ÓÑÓ ÙÑ ÒÓ× ÒÓ× ×Ø Ò Ù ÑÓ× ÒØÖ ÒÓ×ÓØÖÓ× ÔÓÖÕÙ ÐÓ× ×ØÓ× ÕÙ Ö ÑÓ× Ý ×Ø ¹ ÑÓ× Ô Ö Ð ÓØÖÓ ×ÓÒ Ð ÙÒ Ñ Ò Ö Ö ÒØ ׺ ÍÒ ÒØ ÙÓ Ý ÖÑÓ×Ó ÔÖÓÚ Ö Ó Ò Ù Ö Þ ÙÒ ×ØÓ Ò Ö ÙÒ Ø ØÙ ¸ ÙÒ Ø ØÙ Ò Ö ÙÒ Ö Ø Ö Ý ÙÒ Ö Ø Ö Ò Ö ÙÒ ×Ø ÒÓ º Ë Ò Ö Ð Þ ÑÓ׿ ÒÙ ×ØÖ ÒØ ¸ Ó Ð Ð Ù Ò ÓØÖÓ¸ ÔÓ ÑÓ× Ô Ò× Ö Ò Ð Ö Ø Ö Ý Ö Ñ ÑÓÖ Ò Ð × Ø ØÙ × Ý ×ØÓ× ÕÙ ÓÒ Ù ÖÓÒ ÕÙ ÐÐ × Ø ØÙ ׺ ÁÒ Ò Ó Ò ÙÒ Ö Ø Ö Ø Ò ÑÓ× Ö ÓÑÓ × ÔÖÓÝ Ø Ð ×Ø ÒÓº ÆÓ Ò Ð À Ö Ð ØÓ¸ ÕÙ Ò ÐÐ Ñ Ö× Ð Ð ÄÙÑ ÒÓ×Ó Ý ÒÓ Ð Ó× ÙÖÓ ¸ ÕÙ Ð Ö Ø Ö ÙÒ ÓÑ Ö × ×Ù ×Ø ÒÓ º ÓÑÓ ÙÒ ÔÓØ Ø Ó Ý ÑÙÝ Ö Ù Ó Ñ¹ ÔÐÓ¸ ÓÒ× Ö ÑÓ× Ð Ö × ¸ Р٠и Ò ÖØ ÓÖÑ ¸ ר Ð Ö Ý ÕÙ ¸ ×Ù Ú Þ¸ ר ÙÒ Ö Ø Ö Ñ ×ØÓ×Óº Ä Ñ ×Ø ¸ Ù Ò Ó × Ö ÙÒ× Ö ÒØÖÓ ÙÒ ÙØ ÒØ ÒÓ ÓÒ Ò¸ ר ÙÒ ×Ø ÒÓ ÒÑ Ö Ó Ò Ð Ù Ò Ú ×Ù Ý ÒØ Ð Ò ÕÙ Ò Ñ ×Ø × ÓÑÔ ÖØ º Ä Ú ÙÑ Ò ×Ø ÔÐ Ò ÑÙ Ó× Ñ × ×ØÓ׸ Ð ×ÓÒÖ × ¸ Ð ÐÐ ÒØÓ¸ Ð Ö ØÓ¸ Ð ×ÓÑ ÖÓ¸ ººº × ÓÑÓ ×Ù× ÓÒ× Ù ÒØ × Ø ØÙ ׸ Ð Ô Ö ¸ Ð ØÖ ר Þ ¸ Ð ÒÓ Ó¸ Ð ÙÖ Ó× ¸ ºººº Ö Ø Ö × Ñ Ö Ò ÕÙ ÐÐ × Ø ØÙ × Ð Ñ ×ØÓ×Ó¸ Ð ×ØÙØÓ¸ Ð ÔÖ Ñ Ó¸ Ð × ÓÒ¬ Ó¸ Ð Ô Ö× Ú Ö ÒØ ¸ ºººº Ô Ò Ò Ó Ð Ú Ò Ö Ý Ð ×Ù ÖØ ¸ ×Ó× Ö Ø Ö × ÓÒ Ù Ó× ÔÙ Ò ×Ø Ò Ö Ò ÙÒ Ô Ö ¸ ÙÒ ÔÓÐ Ø Ó¸ ÙÒ ÔÓ Ø ¸ ÙÒ Ù ÖÖ ÖÓ¸ ÙÒ ¬ÐÓ×Ó Ó¸ ºººº ÌÓ Ó ×Ø × ÙÖ×Ó ÔÙ × ÒØ Ø Þ Ö× ¸ ÙÒ Ñ Ò Ö ÙÒ Ø ÒØÓ Ö Ù ¸ Ñ × Ñ × ÔÖ Ò× Ð ¸ Ó Ð × Ù ÒØ ÖÑ risa sonrisa llanto grito asombro alegr´a ı picard´a ı tristeza enojo curiosidad amistoso astuto deprimido desconfiado perseverante Padre Pol´tico ı Poeta Guerrero Fil´sofo o Destino ¿ Ò ÐÓ º Ë ÙÒ Ð Ø À Öº
  • 269.
    243 Ò ÐÓ× ×ØÓ׸ ÐÓ× ÒÙ ×ØÖÓ× Ý ÐÓ× Ð ÓØÖÓ¸ × ×Ø Ò ÒÙ ×ØÖÓ× ×Ø ÒÓ׺ ÒØ × ÓÖ Ö ÓÖÑ ÐÑ ÒØ Ð ÓÒ ÔØÓ ÓÑÔÙØ ÓÒ Ð Ö Óи ÑÔ Ô ÑÓ×ÒÓ× ÙÒ ÔÓ Ó Ñ × ÓÒ Ð ×ØÖ Ø Ö ÓÐ Ò ÙÒ ÓÒØ ÜØÓ Ñ × ÓØ ÒÓº Ò Ð ÒØÓÖÒÓ Ò ÐÓ Ó ×Ø ÔÓ ¸ ÕÙ Þ × Ð Ö ÓÐ Ò ÐÓ Ó ¸ Ð Ù Ð ØÖ Þ × Ò Ò ¸ Ý ÙÝ Ö ÔÖ × ÒØ ÓÒ Ò Ö Ð × ÐÙ×ØÖ Ò Ð ¬ ÙÖ º½¸ ÙÒ ÑÔÐ Ö Ö ÔÖ × ÒØ ÒØ ÙÐØÙÖ Ð Ð ×ØÖÙ ØÙÖ Ö ÓÐ Ý ×Ù × Ñ Ð Ö Ô ØÓÖ Ý Ö ÖÕÙ ÓÒ ×Ù Ô Ö Ò ÓÒ Ò ØÙÖ Ðº Bisabuelo Bisabuela Bisabuelo Bisabuela Bisabuelo Bisabuela Bisabuelo Bisabuela Abuelo paterno Abuela paterna Abuelo materno Abuela materna Pap´ a Mam´ a Hijo ÙÖ º½ ÓÖÑ ÒÖÐ ÙÒ Ö ÓÐ Ò ÐÓ Ó ÖÒ ×Ù ×Ø Ö ÓØ ÔÓ Ò ØÙÖ Ð¸ Ò Ð Ö ÓÐ Ò ÐÓ Ó Ð × × Ñ ÐÐ × ´ÐÓ× ×¹ Ù ÐÓ×µ × Ò Ù ÒØÖ Ò Ò Ð × Ó ×¸ Ñ ÒØÖ × ÕÙ Ð ÙÐØ ÑÓ × Ò ÒØ Ò Ð Ö Þº Ò Ð Ñ ×ÑÓ × ÒØ Ó Ò ÐÓ Ó¸ ÙÒÕÙ Ñ × Ò Ú Ù Ð ×Ø ¸ ÙÒ Ô ØÖÓÒ × Ñ Ò Ð Ñ × ¬ Ð ÓÒ Ð Ö ÓÐ Ò ØÙÖ Ð × Ð Ö ÓÐ Ò ×Ø Ó ¸ Ð Ù Ð ØÖ Þ Ð × × Ò Ò Ý ÙÝ ×ØÖÙ ØÙÖ × ¸ Ô ÖÓ ÒÓ Ò Ö Ð¸ × ÐÙ×ØÖ Ò Ð ¬ ÙÖ º¾º Ð Ö ÓÐ Ò ÐÓ Ó Ò Ö Ð Ð ¬ ÙÖ º½ × Ò Ö Ó Ò Ð × ÒØ Ó ÕÙ Ñ Ñ ÖÓ Ø Ò Ü Ø Ñ ÒØ Ó× Ò ×ØÖÓ× Ö ØÓ× Ð Ô Ö Ý Ð Ñ Ö º Ò Ñ Ó¸ Ð ÒÙÑ Ö Ð Ö ÓÐ Ò ×Ø Ó Ô Ò Ö Ð Ö Ø Ö ÔÖÓÐ ¬ Ó Ð Ñ Ð º Ò ÔÖÓ Ö Ñ ÓÒ × Ñ Ò Ð ×ØÖ ÓÒ Ö ÓÐ Ô Ö Ö ÔÖ × ÒØ Ö Ö ÖÕÙ × ÓÑÔÙØÓ¸ ÓÖ Ò × ×Ô Ð × ØÓ× Ó × ØÙ ÓÒ × ÕÙ Ø Ò Ò ÐÓ× Ö ÓÐ × ÙÐØÙÖ Ð × ¸ Ò ÐÙ× Ú ¸ Ò ØÙÖ Ð ×º Ó¸ Ò Ð Ô ØÙÐÓ ½ ÒØÖÓ Ù ÑÓ× Ð ÓÒ ÔØÓ Ö Ò¹ Ð × × Ý ×Ù Ö Ø Ö Ò ÐÓ Ó º Ò ÓÑÔÙØ ÓÒ¸ Ð × ÔÐ ÓÒ × Ð Ö ÓÐ ×ÓÒ ÑÙÝ Ú Ö× × Ý Ú Ò × Ð Ö Ù¹ Ô Ö ÓÒ ¬ ÒØ Ð Ú ×¸ ר Ð Ö ×ÓÐÙ ÓÒ Ò Ð Ø ÜÔÖ × ÓÒ × Ð Ð ÙÐÓ ÓÖÑ Ðº Ð Ö ÓÐ ÙÒ Ñ ÒØ ÑÙ Ó× ×ÕÙ Ñ × Ö ÙÔ Ö ÓÒ Ý Ö ÓÒרÖÙ ÓÒ Ò ÓÖÑ ÓÒ¸ Ø ÒØÓ Ò Ñ ÑÓÖ ÔÖ Ñ Ö ¸ ÓÑÓ Ò × ÙÒ Ö º ÌÓ Ó ÔÖÓ ×Ó ØÖ Ù ÓÒ¸ ÔÓÖ Ñ¹ ÔÐÓ¸ Ð ÓÑÔ Ð ÓÒ Ð ÙÒ Ð Ò Ù ÔÖÓ Ö Ñ ÓÒ¸ ÙØ Ð Þ Ð Ö ÓÐ ÓÑÓ ×ØÖÙ ØÙÖ ÙÒ Ñ ÒØ к Ð Ð ÙÐÓ ÓÖÑ Ð ÙØÓÑ Ø Ó × Ö¸ Ð Ð ÙÐÓ ÜÔÖ × ÓÒ × Ò Ð Ø ×¸
  • 270.
    244 Cap´ ´ ıtulo 4. Arboles Individuo Primog´nito e Hijo 2 Hijo 3 Nieto 1 Nieto 2 Nieto 3 Nieto 4 Bizn 1 Bizn 2 Bizn 3 Bizn 4 Bizn 5 Bizn 6 Bizn 7 Bizn 8 Bizn 9 Bizn 10 biz-biz ÙÖ º¾ ÓÖÑ × ÙÒ Ö ÓÐ Ò ×Ø Ó ÔÓÖ ÑÔÐÓ Ð Ñ Ø ×¸ Ö Ú ×¸ ÒØ Ö Ð ×¸ Ø Ø Ö ¸ Ù× Ð Ö ÓÐ ÓÑÓ ×ØÖÙ ØÙÖ Ö Ô¹ Ö × ÒØ ÓÒ Ð × ÜÔÖ × ÓÒ ×º ÍÒ Ð ÓÖ ×Ø Ô ØÙÐÓ × Ö ÓÖÑ ÖÒÓ× ÓÒ ÐÓ× Ð Ò Ñ ÒØÓ× × Ó× ØÓ× ÙÑÔÐ Ö ÐÓ× × Ù ÒØ × Ó Ø ÚÓ× ½º ÓÒÓ Ö ÐÓ× ÓÒ ÔØÓ× × Ó× Ý ÓÑÓ Ò Þ Ö Ø ÖÑ ÒÓÐÓ ×º ¾º ÓÑÔÖ Ò Ö ÐÓ× Ð ÓÖ ØÑÓ× ÙÒ Ñ ÒØ Ð × Ý ÔÖ Ô Ö Ö Ð Ð ØÓÖ Ò Ð × ÖÖÓÐÐÓ Ð ÓÖ ØÑÓ× Ñ × ÓÑÔÐ Ó׺ ¿º ÈÖ Ô Ö ÖÒÓ× Ô Ö Ð ×ØÙ Ó ×ØÖÙ ØÙÖ × Ö Óи ×Ô Ð Þ ×¸ ÕÙ × Ö Ò × ÖÖÓ¹ ÐÐ × Ò ÓØÖÓ× Ô ØÙÐÓ× ×Ø Ø ÜØÓº ÈÖ × ÒØ Ð ÒØÙ Ø Ú Ý Ò ÐÓ Ð Ö Óи × ÓÑÓ ×Ù ÒØ Ö × Ò Ð Óѹ ÔÙØ ÓÒ¸ ר ÑÓ× ÔÖ ×ØÓ× Ô Ö Ò Ö ÓÖÑ ÐÑ ÒØ ÒÙ ×ØÖÓ ×ØÙ Óº 4.1 Conceptos b´sicos a ÓÑ Ò ÑÓ× ÔÓÖ ÙÒ ¬Ò ÓÒ Ñ Ø Ñ Ø ´ Definici´n 4.1 (Arbol) o ÍÒ Ö ÓÐ T × ¬Ò ÔÓÖ ÙÒ ÓÒ ÙÒØÓ N = {n1, n2, . . . , nn} ÙÒÓ Ó Ñ × ÒÓ Ó× ÕÙ × Ø × Ò Ð × × Ù ÒØ × ÓÒ ÓÒ × ½º Ü ×Ø ÙÒ ÒÓ Ó ×Ô Ð × Ò Ó Ö Þ(T ) ∈ N º ¾º Ð ÓÒ ÙÒØÓ N − {Ö Þ(T )} ÔÙ Ô ÖØ ÓÒ Ö× Ò m Ö ÓÐ × T 1, T 2, . . . , T m Ø Ð ÕÙ {Ö Þ(T )} ∪ T 1 ∪ T 2 ∪ · · · ∪ T m = T T1 ∩ T2 ∩ · · · ∩ Tm = ∅
  • 271.
    4.1. Conceptos b´sicos a 245 ÙÒÓ ÐÓ× ÓÒ ÙÒØÓ× T 1, T 2, . . . , T m ×ÓÒ “sub´rboles” T º a Ð ÓÒØ Ò Ó ÙÒ ÒÓ Ó ni ∈ T × Ö ÔÖ × ÒØ ÓÑÓ Ã (ni)¸ Р٠и Ñ ÒÙ Ó¸ × Ð ÐÐ Ñ Ð Ú º Ä ¬ ÙÖ º¿ ÐÙ×ØÖ ÙÒ ÑÔÐÓ ÓÒ Ð Ö Þ × Ð ÒÓ Ó Ø ÕÙ Ø Ó ÓÒ Ð Ð ØÖ A Ý Ð × Ö × ÐÓ× ×Ù Ö ÓÐ × A ר Ò Ø ÕÙ Ø Ó× ÓÒ B¸ C¸ D Ý E¸ Ö ×Ô Ø Ú Ñ ÒØ º ÆÓØ ÑÓ× ÕÙ Ð Ö ÓÐ Ù Ó Ò Ð ¬ ÙÖ º¿ ר ÒÚ ÖØ Ó Ð Ö Þ ×Ø Ò Ð Ô ÖØ ×ÙÔ Ö ÓÖ Ý Ð × Ó × Ò Ð Ô ÖØ Ò Ö ÓÖº Ú ÒØ Ñ ÒØ ¸ Ü ×Ø ØÓ Ó ÙÒ Ö ÓØ Ò ÐÓ Ó Ô Ö × Ö Ö ÙÒ Ö Óк ÙÒ ÒÓ Ó Ö Ø Ñ ÒØ ÓÒ Ø Ó Ð Ö Þ × Ð ÐÐ Ñ Óº Ü Ô ÓÒ Ð Ö Þ¸ ØÓ Ó ÒÓ Ó Ø Ò ÙÒ “padre”º Ó ÙÒ ÒÓ Ó ni¸ ÐÐ Ñ Ö ÑÓ× Ô Ö (ni) Ð Ô Ö ni Ó×(ni) Ð ÓÒ ÙÒØÓ ÓÖÑ Ó ÔÓÖ ÐÓ× Ó× ÒÑ ØÓ× niº Ð Ñ ×ÑÓ ÑÓ Ó¸ Ó ÙÒ ÒÓ Ó n¸ Ó(n, i) ÒÓØ Ð i¹ × Ñ Ö Ñ nº Ë Ó(n, i) = ∅¸ ÒØÓÒ × n ÒÓ Ø Ò ÙÒ i¹ × Ñ ÖѺ ÙÒ ÒÓ Ó ÕÙ ÒÓ Ø Ò Ó× × Ð ÐÐ Ñ “hoja”¸ ÔÙ × Ð ÓÖ Þ Ð Ó ÙÒ Ö ÓÐ Ò Ð × ÒØ Ó ÕÙ × ÙÒ Ø ÖÑ Ò ÓÒº Ô ÖØ Ð Ö Þ¸ Ð Ö ×ØÓ ÐÓ× ÒÓ Ó× × Ð × ÐÐ Ñ “descendientes” Ð ÒÓ Ó Ö Þ(T )º A B C D E F G H I J K L M O P Q R S T U V ÙÖ º¿ ÍÒ Ö ÓÐ ÑÔÐÓ ÍÒ Ö ÓÐ ÓÒØ Ò ÒÓ Ó× Ý Ö Ó׺ ÍÒ ÒÓ Ó ×Ó ÙÒ Ð Ñ ÒØÓ Ð ÙÒ Ø ÔÓ Ò Ö Ó T º ÍÒ Ö Ó Ö ÔÖ × ÒØ ÙÒ Ö Ð ÓÒ ÒØÖ ÐÓ× Ó× ÒÓ Ó× ÒÚÓÐÙ Ö Ó׺ ÒÓÑ Ò Ö ÑÓ× T Ð ÓÒ ÙÒØÓ Ò¬Ò ØÓ ØÓ Ó× ÐÓ× Ö ÓÐ × ÔÓ× Ð ×º ÍÒ arborescencia × ¬Ò ÓÑÓ ÙÒ ÓÒ ÙÒØÓ ÖÓ Ó Ñ × Ö ÓÐ × × ÙÒØÓ׺ ÍÒ camino < n0, n1, . . . , nn−1, nn > × ÙÒ × Ù Ò ÓÖÖ ×ÔÓÒ ÒØ ÒÓ Ó× ÒØ Ö¹ ÓÒ Ø Ó× ÔÓÖ Ö Ó× Ô ÖØ Ò ÒØ × Ð Ö ÓÐ Ø Ð ÕÙ Ó(n0) = n1 | Ó(n1) = n2 | · · · | Ó(nn−1) = nnº ÍÒ Ñ ÒÓ × ÒÓØ ÔÓÖ Cn ,n ÓÒ ns × Ð ÒÓ Ó Ò Ó Ð Ñ ÒÓ s t Ý nt × Ð ÒÓ Ó ¬Ò Ð Ð Ñ ÒÓº Ä “longitud del camino”¸ ÒÓØ ÓÑÓ | Cn ,n |¸ × Ð ÒØ s t ÒÓ Ó× ÕÙ ÓÒØ Ò Ð Ñ ÒÓº
  • 272.
    246 Cap´ ´ ıtulo 4. Arboles ÄÓ× “ancestros” ni¸ ÒÓØ Ó ÓÑÓ Ò ×ØÖÓ×(ni)¸ × Ð ÓÒ ÙÒØÓ ÓÒ ÓÖÑ Ó ÔÓÖ ÐÓ× ÒÓ Ó× Ô ÖØ Ò ÒØ × Ð Ñ ÒÓ CÖ Þ(T),Ô Ö (n ) × Ö¸ Ð × Ù Ò ÒÓ Ó× ÔÖ ×ÓÖ × × Ð Ö Þ ×Ø niº i Ó× Ó× ÒÓ Ó× ni, nj ∈ T ¸ ÒØÓÒ ×¸ nj × Ò ×ØÖÓ ni × Ý ×ÓÐÓ × ¸ nj ∈ Ò ×ØÖÓ×(ni)º Ð ÙÒÓ× × ÙÖ×Ó× ÙØ Ð Þ Ò ÙÒ ÒÓ ÓÒ “edad de nodo”¸ Ð Ù Ð ×Ø ÔÓÖ ×Ù ÔÓ× ÓÒ ÒØÖÓ Ð Ñ ÒÓ ×Ù× Ò ×ØÖÓ׺ ר ÑÓ Ó¸ Ó ÙÒ Ñ ÒÓ Cn ,n =< 0 n n0, n1, . . . , nn−1, nn >¸ ÑÓ× ÕÙ ni × Ñ × Ú Ó ´Ó Ñ ÝÓÖµ ÕÙ Ù ÐÕÙ Ö ni+c ∈ Cn ,n º i+1 n Ð Ñ ×ÑÓ ÑÓ Ó¸ ÑÓ× ÕÙ ni × Ñ × ÓÚ Ò ´Ó Ñ ÒÓÖµ ÕÙ Ù ÐÕÙ Ö ni−c ∈ Cn ,n º 0 i−1 Ó ÙÒ ÒÓ Ó ni ∈ Cn ,n =< n0, n1, . . . , nn−1, nn >¸ Ð ÓÒ ÙÒØÓ Ó×(ni) × ÐÐ Ñ Ó 0 n Ð i¹ × Ñ Ò Ö ÓÒº Ð “grado” ni ÒÓØ Ó ÓÑÓ Ö Ó(ni)¸ × Ð ÒØ ×Ù Ö ÓÐ × ÕÙ ÓÒØ Ò Ð ÒÓ Ó niº Ð “orden” Ó “grado” ÙÒ Ö ÓÐ × ¬Ò ÓÑÓ Ð ÒÙÑ ÖÓ Ñ Ü ÑÓ Ö Ñ × ÕÙ ÔÙ Ø Ò Ö Ù ÐÕÙ Ö ÒÓ Ó Ð Ö Óк Ë Ð Ö Ó ÙÒ ÒÓ Ó × Ù Ð Ð ÓÖ Ò Ð Ö Óи ÒØÓÒ × ÑÓ× ÕÙ Ð ÒÓ Ó ×Ø ÓÑÔÐ ØÓº Ù Ò Ó ÙÒ Ö ÓÐ ÔÓ× ÑÙ Ó× ÒÓ Ó× Ò ÓÑÔÐ ØÓ× Ý ×ØÓ× ÔÓ× Ò ÑÙÝ ÔÓ × Ö Ñ ×¸ ÒØÓÒ × ÑÓ× ÕÙ Ð Ö ÓÐ × ×Ô Ö Óº Ð Ñ ×ÑÓ ÑÓ Ó¸ Ù Ò Ó Ý ÑÙ Ó× ÒÓ Ó× ÓÑÔÐ ØÓ× ÑÓ× ÕÙ Ð Ö ÓÐ × Ò×Óº Ð “nivel de un nodo” ni¸ ÒÓØ Ó ÓÑÓ Ò Ú Ð(ni)¸ × ¬Ò Ö ÙÖ× Ú Ñ ÒØ ÓÑÓ × Ù Ò Ú Ð(ni) = 0 + Ò Ú Ð(Ô Ö (n )) × ni = 0 Þ(T ) 1 × n > Ö i i Ä “altura de un nodo” ni¸ ÒÓØ ÓÑÓ h(ni) × ¬Ò ÓÑÓ Ð ÒÙÑ ÖÓ ÒÓ Ó× Ñ ÒÓ× ÙÒÓ ÕÙ Ý × ni ר ÙÒ Ó × ØÙ Ò Ð Ñ × ÐØÓ Ò Ú Ðº Ì Ñ Ò ÔÙ ¬Ò Ö× Ö ÙÖ× Ú Ñ ÒØ ÓÑÓ × Ù h(ni) = 0 × ni × ÙÒ Ó 1 + Ñ Ü(h( Ó1(ni)), h( Ó2(ni)), . . . , h( Óm(ni))) ÐÓ ÓÒØÖ Ö Ó Ä “altura de un ´rbol” T × ¬Ò ÓÑÓ Ð ÐØÙÖ Ö Þ(T ) × Ö¸ h(Ö Þ(T ))º a Ä “cardinalidad de un ´rbol” T ¸ ÒÓØ a ÓÑÓ |T |¸ × ¬Ò ÔÓÖ Ð ÒÙÑ ÖÓ ØÓØ Ð ÒÓ Ó× Ð Ö Óк ÁÐÙ×ØÖ Ö ÑÓ× Ð ÙÒÓ× ×ØÓ× ÓÒ ÔØÓ× Ñ ÒØ Ð ¬ ÙÖ º¿º Ä Ö Þ × Ð ÒÓ Ó Ø ÕÙ Ø Ó ÓÒ A Ý ×Ø × ØÙ Ò Ð Ò Ú Ð 0º Ð Ö Ó Ö Þ(T ) × 4¸ ÕÙ Ø Ñ Ò ÓÖÖ ×ÔÓÒ Ð ÓÖ Ò Ð Ö Óк ÄÓ× Ó× A ×ÓÒ B¸ C¸ D Ý Eº Ô Ö (B) = Ô Ö (C) = Ô Ö (D) = Ô Ö (E) = Aº Ä ÐØÙÖ A × 5¸ ÕÙ ÓÖÖ ×ÔÓÒ Ð ÐÓÒ ØÙ Ð Ñ ÒÓ Ñ × Ð Ö Ó × Aº Ì Ð Ñ ÒÓ ×Ø Ó ÔÓÖ CA,U = A, C, H, P, U Ó CA,V = A, C, H, P, V | |CA,V | = 5º ÓÖ ÓÒ× Ö ÑÓ× ÙÒ ÒÓ Ó Ô ÖØ ÙÐ Ö¸ ÔÓÖ ÑÔÐÓ Hº Ì Ò ÑÓ× ¯ Ö Ó(H) = 3 ¯ Ô Ö (H) = C ¯ h(H) = 3 = |CH,U| = |CH,V | Ö Ø × ÓÒ ×Ø Ø ÖÑ ÒÓÐÓ ÓÒ× Ö Ò Ó ÒÓ Ó Ð ¬ ÙÖ º¿º
  • 273.
    4.2. Representaciones deun arbol ´ 247 4.2 Representaciones de un ´rbol a ÌÖ ÓÒ ÐÑ ÒØ ¸ רÓ× Ö ÓÐ × ×ØÖ ØÓ× × Ù Ò Ð Ö Ú × ÐÓ× Ò ØÙÖ Ð ×¸ ÓÑÓ Ò Ð ¬ ÙÖ º¿º × Ö¸ Ð Ö Þ Ò Ð Ô ÖØ ×ÙÔ Ö ÓÖ Ý ×Ù× × Ò ÒØ × Ò Ð × Ô ÖØ × Ò Ö ÓÖ ×º ר Ö ÔÖ × ÒØ ÓÒ × ÓÒ Ò Ð Ñ ÝÓÖ Ð × × ØÙ ÓÒ ×¸ Ô ÖÓ Ð ÙÒÓ× ÔÖÓ Ð Ñ × × ÔÖ ×Ø Ò Ô Ö ÓØÖ × Ö ÔÖ × ÒØ ÓÒ × Ñ × ÓÒÚ Ò ÒØ ׺ 4.2.1 Conjuntos anidados Ä Å Ã Ë Ì Í Î À È Ç É Â Ê Á ÙÖ º ÓÒ ÙÒØÓ× Ò Ó× Ò ×Ø Ö ÔÖ × ÒØ ÓÒ Ð Ö Þ × ÙÒ ÓÒ ÙÒØÓ ÒÓÑ Ö Ö Þ(T ) ÓÒ ×Ù Ö ÓÐ × ÓÑÓ ×Ù ÓÒ ÙÒØÓ׺ ÈÓÖ ÑÔÐÓ¸ Ð ¬ ÙÖ º ÐÙ×ØÖ Ð ÕÙ Ú Ð ÒØ Ò ÓÒ ÙÒØÓ× Ò Ó× Ð Ö ÓÐ Ð ¬ ÙÖ º¿º ר Ö ÔÖ × ÒØ ÓÒ ÔÙ ÙÒ Ñ ÒØ Ö× ×Ó Ö ×ØÖÙ ØÙÖ × ØÓ× ×Ô Ð Þ × Ò ÓÒ ÙÒØÓ׺ 4.2.2 Secuencias parentizadas ÄÓ× ÓÒ ÙÒØÓ× Ò Ó× ÒÓÖ Ò Ð ÓÖ Ò Ô Ö ÓÒ ÐÓ× ×Ù Ö ÓР׸ Ð Ù Ð Ò Ð ÙÒ × × ØÙ ÓÒ × ÔÙ × Ö ÑÔÓÖØ ÒØ º Ë × × Ñ ÒØ Ò Ö ×Ø ÓÖ Ò¸ ÙÒ Ö ¬Ò Ñ ÒØÓ ÓÒ× ×Ø Ò Ö ÔÖ × ÒØ Ö ÐÓ× ÓÒ ÙÒØÓ× ÒØÖ Ô Ö ÒØ × ×º Ò ×Ø ×Ó¸ Ð ×Ó Ø Ú Ö ÔÖ × ÒØ Ð ÓÖ Ò Ô Ö ÓÒ ÐÓ× ×Ù Ö ÓР׺ È Ö Ð Ö ÓÐ Ð × ¬ ÙÖ × º¿ Ý º ¸ × Ø Ò Ð × Ù ÒØ Ö ÔÖ × ÒØ ÓÒ Ô Ö ÒØ Þ (A(B(F(L)(M))(G))(C(H(O)(P(U)(V))(Q)))(D(I)(J(R)))(E(K(S)(T )))) ר Ö ÔÖ × ÒØ ÓÒ Ø Ò Ð Ú ÒØ ÕÙ × Ð Ò Ð Ý Ö ­ ÓÒ Ü Ø ØÙ Ð ØÓÔÓÐÓ Ð Ö Óк ÓÒ× Ö ÑÓ× Ð Ú ÐÙ ÓÒ ÙØÓÑ Ø ÜÔÖ × ÓÒ × Ð Ö ×º ÓÑÓ ÑÔÐÓ¸ ×ÙÑ ÑÓ× Ð ÜÔÖ × ÓÒ Ð Ö 3x4 + 3x3y2 + x2 − 1 . 4x2z ÍÒ ÓÑÔ Ð ÓÖ ÔÓ Ö ØÖ Ù Ö ×Ø ÜÔÖ × ÓÒ Ð Ö ÓÐ Ð ¬ ÙÖ º ¸ Ð Ù Ð Ú ÐÙ Ö× Ñ Ò Ö × Ò ÒØ Ó × ¸ × Ð × Ó × ×Ø Ð Ö Þº ר ÓÖ Ò Ö ­
  • 274.
    248 Cap´ ´ ıtulo 4. Arboles / + ∗ ∗ ∗ ^ −1 4 ^ z 3 ^ 3 ^ ^ x 2 x 2 x 4 x 3 y 2 ÙÖ º Ö ÓÐ Ð ÜÔÖ × ÓÒ Ò¬ 3x4 +3x3 y2 +x2 −1 4x2 z ¬ ÐÑ ÒØ Ð × ÔÓ× Ð × Ý Ú Ð × Ñ Ò Ö × Ò ÕÙ Ð ÜÔÖ × ÓÒ ÔÙ Ú ÐÙ Ö× × Ò ÕÙ × Ô Ö ×Ù × ÒØ Ó Ð Ö Óº Ò Ñ Ø Ñ Ø ¸ Ð ÓÑÔÓ× ÓÒ ÙÒ ÓÒ × ×Ù Ð × Ö Ö× Ñ Ò Ö ÔÖ ¬ × Ö¸ Ð ÒÓÑ Ö Ð ÙÒ ÓÒ Ù ÓÔ Ö ÓÒ ÔÖ ¬ ¸ ÒØ ¸ ÐÓ× ÓÔ Ö Ò Ó׺ ÈÓÖ ÑÔÐÓ¸ f(x, y) Ö ÔÖ × ÒØ ÙÒ ÙÒ ÓÒ f ÓÒ Ó× ÓÔ Ö Ò Ó׺ Ç ÙÖÖ ÕÙ Ð × Ù Ò Ô Ö ÒØ Þ ÙÒ Ö ÓÐ ÜÔÖ × ÓÒ × × ÔÖ ¬ º Ò Ð Ó ÙÖÖ Ò ¸ Ð Ö ÓÐ Ð ¬ ÙÖ º × Ö ÔÖ × ÒØ ÓÑÓ ´»´·´¶´¿µ ´ ´Üµ´ µµ µ ´¶´¿µ ´ ´Üµ´¿µµ ´ ´Ýµ´¾µµ µ ´ ´Üµ´¾µµ ´ ¹½ µµ ´¶ ´ µ ´ ´Üµ´¾µ µ ´Þµ µ µ Ä ÐÒ Ð Ð Ö ÔÖ × ÒØ ÓÒ Ô Ö ÒØ Þ ÔÙ ÙØ Ð Þ Ö× Ô Ö Ð ØÖ Ò×Ñ × ÓÒ Ö ÓÐ × Ò ÙÒ Ö º Ð × Ø Ó ÓÖ Ò Ð ÓÑÙÒ ÓÒ Ó Ø Ò ÙÒ Ö ÔÖ × ÒØ ÓÒ Ô Ö ÒØ ¹ Þ ÕÙ × Ñ Ð Ò ÙÒ Ñ Ò× º Ð Ö Ö Ð Ö ÓÐ Ô Ö ÒØ Þ Ó¸ Ð × Ø Ó ×Ø ÒÓ Ö Ð Þ Ð ØÖ Ò× ÓÖÑ ÓÒ ÒÚ Ö× ¹ × Ñ Ð ¹ Ý Ó Ø Ò ÙÒ ÓÔ Ü Ø Ð Ö Óк Ò Ð Ñ ÝÓÖ ÐÓ× Ð Ò Ù × ÔÖÓ Ö Ñ ÓÒ¸ Ò ÖØ ÐÙ Ó× Ð ØÖÓÒ Ó× Ð ÙÐÓ Ý¸ Ò Ò Ö Ð¸ Ò Ð Ò Ò Ö ¸ Ð × ÜÔÖ × ÓÒ × × ÓÐÓ Ò Ò ÓÖÑ Ò¬ Ý ÐÓ× Ô Ö ÒØ × × × ÓÐÓ Ò Ò ÓÒ ÕÙ Ö ÑÓ× ÑÓ ¬ Ö Ð ÔÖ Ò ÐÓ× ÓÔ Ö ÓÖ ×º ר ÑÓ Ó¸ Ð ÜÔÖ × ÓÒ ÒØ Ö ÓÖ ÔÓ Ö × Ö Ö× Ò ÓÖÑ Ò¬ ÓÑÓ (3*x^4 + 3*x^3*y^2 + x^2 - 1)/ (4*x^2*z) Ä Ù Ð × Ð Ú Ö× ÓÒ Ö ×ÙÑ Ð ÜÔÖ × ÓÒ Ò¬ ÓÖÖ ×ÔÓÒ ÒØ Ð Ö ÓÐ Ð ¬ ÙÖ º º Ä ÜÔÖ × ÓÒ Ò¬ × ÙÒ Ö ÔÖ × ÒØ ÓÒ Ð Ò Ð Ð Ö ÓÐ Ý Ö ÕÙ Ö Ð Ù×Ó Ô Ö ÒØ × × Ô Ö ×Ô ¬ Ö Ð ÓÖ Ò Ô Ö ÓÒ ÐÓ× ÒÓ Ó× Ü Ø Ñ ÒØ Ð Ñ ×Ñ Ñ Ò Ö Ò ÕÙ Ö× ÓÒ Ð ÔÖ Ò Ò Ð × ÜÔÖ × ÓÒ × Ð Ö ×º
  • 275.
    4.2. Representaciones deun arbol ´ 249 4.2.3 Indentaci´n o ÍÒ Ñ Ò Ö ÓÒÚ Ò ÒØ Ý Ö Ø Ô Ö Ù Ö Ö ÓÐ × Ô ÕÙ ÒÓ׸ Ò Ð Ù Ð ÒÓ × Ô Ö Ð ×ØÖÙ ØÙÖ ¸ ÓÒ× ×Ø Ò Ò ÒØ Ö ÔÓÖ Ò Ú Ðº Ä × ÜÔÐ Ñ ÒØ Ð × Ù ÒØ Ð ÓÖ ØÑÓ Algoritmo 4.1 (Dibujo de un ´rbol en modo texto) a Ä ÒØÖ Ð Ð ÓÖ ØÑÓ × ÙÒ Ö ÓÐ Ò ×Ù Ö ÔÖ × ÒØ ÓÒ Ö ¬ Ð × º Ä × Ð × Ð Ö ÔÖ × ÒØ ÓÒ Ò ÒØ Ð Ö Óк Ð Ð ÓÖ ØÑÓ Ø Ò ÙÒ Ô Ö Ñ ØÖÓ ÐÐ Ñ Ó s¸ ¬Ò Ó ÓÑÓ Ð ÒÙÑ ÖÓ ×Ô Ó× Ò Ð Ò Ó × Ô Ö ÓÒ ÓÖ ÞÓÒØ к Ð Ð ÓÖ ØÑÓ × Ö ÙÖ× ÚÓ ÓÒ ÔÖÓØÓØ ÔÓ void dibujar(Node * x)º Ä ÔÖ Ñ Ö ÐÐ Ñ ÙØ Ö× ÓÒ Ð Ö Þ pº ½º ÁÑÔÖ Ñ Ö pº ¾º ∀y ∈ Ó×(x) ´ µ ÁÒ ÒØ Ö s ×Ô Ó× Ð Ö º ´ µ dibujar(y); ´ µ ÁÒ ÒØ Ö s ×Ô Ó× Ð ÞÕÙ Ö º ¿º Ë x × ÙÒ Ó =⇒ ´ µ Ë ÐØ Ð Ò º Ð Ö ÓÐ Ð × ¬ ÙÖ × º¿ Ý º Ø Ò Ð × Ù ÒØ Ö ÔÖ × ÒØ ÓÒ Ò ÒØ A B F L M G C H O P U V Q D I J R E K S T 4.2.4 Notaci´n de Deway o Ä ×ØÖÙ ØÙÖ ÓÒ Ý ÓÒØ Ò Ó ×Ø Ø ÜØÓ Ò Ô ØÙÐÓ׸ × ÓÒ ×¸ Ø Ø Ö ¸ × ÓÖÖ ×ÔÓÒ ÓÒ ÙÒ Ö ÓÖ × Ò Ò Ð Ù Ð ÐÓ× Ô ØÙÐÓ× ×ÓÒ Ö ÓÐ × × ÙÒØÓ׺ Ä × × ÓÒ × ÙÒ Ô ØÙÐÓ ×ÓÒ ÐÓ× ×Ù Ö ÓÐ × Ð Ö Þ Ý¸ Ð Ú Þ¸ Ð × ×Ù ¹× ÓÒ × ×ÓÒ ÐÓ× ×Ù Ö ÓÐ × ÙÒ × ÓÒº ר רÖÙ ØÙÖ ÓÒ Ó ÙÒ Ö ÖÕÙ × ÙÒ Ð Ö ×ØÙ Óº ÈÙ × Ò¸ Ð Ò ÓÕÙ ÙØ Ð Þ Ó Ô Ö ÒÙÑ Ö Ö × ÓÒ ÓÒר ØÙÝ ÙÒ Ñ Ò Ö Ö ÔÖ × ÒØ Ö ÙÒ Ö Óк Ð Ñ ØÓ Ó Ò Ù ×Ø ÓÒ × ÒÓÑ Ò “notaci´n decimal de Deway”¸ ÔÓÖ o Ò ÐÓ ÙÒ ÒÓØ ÓÒ × Ñ Ð Ö Ù× Ô Ö Ð × ¬ Ö Ð ÖÓ× Ò Ð ÓØ ׺ × Ñ ÒØ ¸ Ð ÒÓØ ÓÒ Û Ý × ÙÒ Ñ Ò Ö ÒÙÑ Ö Ö ÒØ ¬ Ö ÙÒ ÚÓ Ñ ÒØ ÒÓ Ó
  • 276.
    250 Cap´ ´ ıtulo 4. Arboles Ð Ö Óк Ð Ö ÓÐ Ð × ¬ ÙÖ × º¿ Ý º ÔÙ Ö ÔÖ × ÒØ Ö× Ñ ÒØ ÐÓ× × Ù ÒØ × ÒÙÑ ÖÓ× ÛÝ (1 : A), (1.1 : B), (1.2 : C), (1.3 : D), (1.4 : E), (1.1.1 : F), (1.1.2 : G), (1.2.1 : H), (1.3.1 : I), (1.3.2 : J), (1.4.1 : K), (1.1.1.1 : L), (1.1.1.2 : M), (1.2.1.1 : O), (1.2.1.2 : P), (1.2.1.3 : Q), (1.3.2.1 : R), (1.4.1.1 : S), (1.4.1.2 : T ), (1.2.1.2.1 : U), (1.2.1.2.2 : V) Ð Ú ÐÓÖ Ò Ó Ð ÒÓØ ÓÒ Û Ý × ÕÙ × ÔÖ × ÖÚ ÒØ Ö Ñ ÒØ Ð ÓÖÑ Ð Ö ÓÐ × Ò Ò × Ùר Ö× ÙÒ ÓÖ Ò × Ù Ò º Ð Ö ÓÐ ÔÙ Ö ×Ø ÙÖ Ö× Ò Ô Ò ÒØ Ñ ÒØ Ð ÓÖ Ò Ò ÕÙ × ÔÖ × ÒØ Ò ÐÓ× ÒÓ Ó׺ ÍÒ Ö ÔÖ × ÒØ ÓÒ × Ò Ð ÒÓØ ÓÒ Û Ý ÔÙ × Ö ÑÙÝ ÙØ Ð Ò Ð ÙÒ × × ØÙ ÓÒ × ÓÒ Ð ÓÒרÖÙ ÓÒ Ð Ö ÓÐ × ÐØ Ñ ÒØ Ò Ñ º Ì Ñ Ò ÔÙ ¹ Ù Ö× Ô Ö Ð ØÖ Ò×Ñ × ÓÒ Ö ÑÓØ Ö ÓÐ × ÑÙÝ Ö Ò × ÕÙ ÒÓ Ø Ò Ò Ò ÙÒ ×ÓÐÓ Ñ Ò× º 4.3 Representaciones de ´rboles en memoria a × Ñ ÒØ ¸ Ü ×Ø Ò Ó× Ñ Ò Ö × Ö ÔÖ × ÒØ Ö ÙÒ Ö ÓÐ Ò Ñ ÑÓÖ ÔÓÖ ÖÖ ÐÓ× Ý ÔÓÖ Ð ×Ø × ÒÐ Þ ×º Ñ × Ö ÔÖ × ÒØ Ò ÙÒ ÒØ ÖÑ Ó ÒØÖ Ú ÐÓ Ý ×Ô Óº 4.3.1 Listas enlazadas Ò ×Ø Ö ÔÖ × ÒØ ÓÒ¸ ÒÓ Ó × ×ØÖÙ ØÙÖ × ÙÒ Ð ÓÖÑ × Ù ÒØ clave R SIBLING L CHILD ÙÝÓ× ÑÔÓ× ÒØ Ö × ×ÓÒ ¯ R SIBLING ÔÙÒØ ÓÖ Ð ÒÓ Ó ÓÖÖ ×ÔÓÒ ÒØ Ð ÖÑ ÒÓ Ö Óº ¯ L CHILD ÔÙÒØ ÓÖ ×Ù Ó Ñ × Ð ÞÕÙ Ö º ÄÓ× ÑÔÓ× R SIBLING ÓÒ ÓÖÑ Ò ÙÒ Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ ÖÑ ÒÓ׺ Ä Ö ×Ø Ð ×Ø × Ð ÒÓ Ó Ñ × Ð ÞÕÙ Ö º Ä ÒØÖ ×Ø Ð ×Ø × Ð ÑÔÓ L CHILD Ð ÒÓ Ó Ô Ö º ÄÓ× ÑÔÓ× L CHILD ÓÒ ÓÖÑ Ò ÙÒ Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ Ò Ö ÓÒ ×º Ó ÙÒ ÒÓ Ó x¸ L CHILD(x) × ×Ù Ó Ñ × Ð ÞÕÙ Ö L CHILD(L CHILD(x)) × Ð Ò ØÓ Ñ × Ð ÞÕÙ Ö x L CHILD(L CHILD(L CHILD(x))) × Ð ÞÒ ØÓ Ñ × Ð ÞÕÙ Ö x Ý × ×Ù × Ú Ñ ÒØ Ô Ö Ð Ö ×ØÓ Ð × Ò Ö ÓÒ ×º Ñ ÒÙ Ó¸ Ð Ó Ñ × Ð ÞÕÙ Ö ÙÒ ÒÓ Ó × Ð Ø Ð ÔÖ ÑÓ Ò ØÓ º Ä ¬ ÙÖ º ÐÙ×ØÖ Ð Ö ÔÖ × ÒØ ÓÒ ÓÒ Ð ×Ø × Ð Ö ÓÐ ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ º º Ë ÒÓ Ý Ñ × ÖÑ ÒÓ× Ó Ò Ö ÓÒ ×¸ ÒØÓÒ × Ð ÔÙÒØ ÓÖ ÓÖÖ ×ÔÓÒ ÒØ × Ñ Ö ÓÒ Ð Ú ÐÓÖ ×Ô Ð NULLº ר Ö ÔÖ × ÒØ ÓÒ × ÓÑÔ Ø Ý ­ Ü Ð ¸ ÔÙ × Ð ÓÖ Ò Ý Ö Ò Ð Ð Ö ÓÐ ÔÙ ÙÑ ÒØ Ö× Ó ×Ñ ÒÙ Ö× Ò Ñ Ñ ÒØ º Ð ×Ô Ó Ó ÙÔ Ó ÔÓÖ ÒÓ Ó ×
  • 277.
    4.3. Representaciones dearboles en memoria ´ 251 / + * * * ^ -1 4 ^ z 3 ^ 3 ^ ^ x 2 x 2 x 4 x 3 y 2 ÙÖ º Ê ÔÖ × ÒØ ÓÒ ÓÒ Ð ×Ø × Ð Ö ÓÐ Ð ¬ ÙÖ º ÓÒר ÒØ Ò Ô Ò ÒØ Ð ÓÖ Ò Ð Ö ÓÐ Ý Ð Ö Ó Ð ÒÓ Óº Ð ×Ô Ö Ó Ò ÒÓ Ó× Ò ÓÑÔÐ ØÓ× ´ÔÓÖ Ð × Ö Ñ × ÒÓ ÙØ Ð Þ ×µ × Ô ÕÙ ÒÓ R SIBLING Ò Ð ÒÓ Ó Ñ × Ð Ö Ð ×Ø ÖÑ ÒÓ׸ Ý L CHILD Ò Ð ÙÐØ ÑÓ × Ò ÒØ Ð ×Ø Ò Ö ÓÒ ×º ÈÖ Ö ÙÒ ÒÓ Ó Ð i¹ × Ñ Ò Ö ÓÒ × Ò × Ö Ó Ö Ð × i−1 Ò Ö ¹ ÓÒ × ÒØ Ö ÓÖ ×º È Ö Ö Ð j¹ × ÑÓ ÖÑ ÒÓ¸ × Ò × Ö Ó Ö ÐÓ× j − 1 ÖÑ ÒÓ× ÔÖ ÒØ ׺ Ë Ð ÓÖ Ò Ð Ö ÓÐ × ÓÒÓ Ó¸ ÒØÓÒ × Ð Ø ÑÔÓ ×Ó ×Ø ÓØ Ó Ý ÔÓÖ ÐÓ Ø ÒØÓ ÔÙ ÓÒ× Ö Ö× ÓÒר ÒØ º Ä Ú Ö× Ø Ð Ð ×ØÖÙ ØÙÖ ÔÙ Ñ ÓÖ Ö× × × ÙØ Ð Þ Ò Ð ×Ø × Ó Ð Ñ ÒØ Ò¹ Ð Þ ×º ÅÙ Ó× Ð ÓÖ ØÑÓ× ÕÙ Ö ÕÙ Ö Ò Ö Ö × Ö ×Ù× Ò ×ØÖÓ× ÔÙ Ò Ò ¬ Ö× ×Ø ÜØ Ò× ÓÒº Ó ÙÒ ÒÓ Ó¸ ÙÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ Ô ÖÑ Ø Ö ÙÔ Ö Ö ÒÑ ¹ Ø Ñ ÒØ Ð Ô Ö º Ð ÒÐ Ó Ð ×Ø Ó ÔÓÖ Ð ÔÙÒØ ÖÓ Ð Ó Ñ × Ð ÞÕÙ Ö Ý Ð ÔÙÒØ ÖÓ Ð Ô Ö º Ð Ñ ×ÑÓ ÑÓ Ó¸ Ð Ð ×Ø ÒÐ Þ ÔÙ × Ö ÐÓ× ÖÑ ÒÓ׸ Ò ÙÝÓ ×Ó Ð ÒÐ Ó Ð ×Ø Ó ÔÓÖ ÐÓ× ÔÙÒØ ÖÓ× Ð ÖÑ ÒÓ ÞÕÙ Ö Ó Ý Ö Ó¸ Ö ×Ô Ø Ú Ñ ÒØ º 4.3.2 Arreglos Ó ÙÒ Ö ÓÐ ÓÖ Ò m¸ ÒÓ Ó ÓÒØ Ò Ð ×Ô Ó Ô Ö Ð ØÓ Ý ÙÒ ÖÖ ¹ ÐÓ m¹ Ñ Ò× ÓÒ Ð ÔÙÒØ ÓÖ × ×Ù× m ×Ù Ö ÓР׺ Ð Ú ÐÓÖ NULL Ò Ð Ù× Ò Ð Ö Ñ ÓÖÖ ×ÔÓÒ ÒØ º ר Ö ÔÖ × ÒØ ÓÒ Ø Ò ÙØ Ð Þ Ö Ñ × ×Ô Ó ÕÙ Ð × Ð ×Ø × ÒÐ Þ ×º Ð ×Ô Ö Ó Ñ ÑÓÖ Ò ÒÓ Ó× Ò ÓÑÔÐ ØÓ× ÔÙ × Ö ÑÔÓÖØ ÒØ × Ð Ö ÓÐ × ÑÙÝ ×Ô Ö Óº Ò Ð Ó ÙÖÖ Ò ¸ Ò Ð Ö ÓÐ ÓÖ Ò 4 Ù Ó Ò Ð ¬ ÙÖ º ¸ ×ÓÐÓ ÙÒ ÒÓ Ó ×Ø ÓÑÔÐ ØÓ ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð Ö ×ØÓ ÐÓ× ÒÓ Ó× Ò ÓÑÔÐ ØÓ× ×Ô Ö Ð Ñ ÒÓ× ÙÒ Ð Ò ÔÙÒØ ÖÓ× ÒÙÐÓ׺ Ä Ö ÔÖ × ÒØ ÓÒ × ×Ø Ø Ò Ð × ÒØ Ó ÕÙ Ð ÓÖ Ò Ð Ö ÓÐ ÒÓ × Ð ÑÓ ¬ Öº ר Ò ÓÕÙ ÒÓ × ÓÒÚ Ò ÒØ Ô Ö ÓÒרÖÙ Ö ÙÒ Ö ÓÐ ÓÖ Ò × ÓÒÓ Óº Ò ÑÙ Ó× ×Ó׸ × ÓÒÚ Ò ÒØ ØÙ Ö Ð ÓÒרÖÙ ÓÒ ÓÒ Ð Ö ÔÖ × ÒØ ÓÒ Ð ×Ø × ÒÐ Þ × Ý ÐÙ Ó ÓÒÚ ÖØ ÖÐÓ Ð Ö ÔÖ × ÒØ ÓÒ Ú ØÓÖ Þ º Ð ×Ó ÙÒ Ò Ö ÓÒ × ÕÙ Ú Ð ÒØ Ð Ð × Ð ×Ø × ÒÐ Þ ×¸ Ô ÖÓ Ð ×Ó Ù ÐÕÙ Ö Ð × Ö Ñ × × Ö ØÓ ר Ö Ø Ö ×Ø × Ð ÕÙ ×Ø Ö ÔÖ × ÒØ ÓÒ Ñ × Ö Ô ÕÙ ×Ù ÓÒØÖ Ô ÖØ ÓÒ Ð ×Ø × ÒÐ Þ ×º
  • 278.
    252 Cap´ ´ ıtulo 4. Arboles / + * * * ^ -1 4 ^ Þ 3 ^ 3 ^ ^ Ü 2 x 2 x 4 x 3 y 2 ÙÖ º Ê ÔÖ × ÒØ ÓÒ ÓÒ ÖÖ ÐÓ× Ð Ö ÓÐ Ð ¬ ÙÖ º ÍÒ ÐØ ÖÒ Ø Ú Ô Ö ×Ø Ò ÓÕÙ × ÙØ Ð Þ Ö ÙÒ ÖÖ ÐÓ Ô Ö × <ÔÙÒØ ÖÓ Ö Ñ ¸ ÓÖ¹ Ò Ð Ö Ñ >º ר ×ÕÙ Ñ ÙØ Ð Þ ÙÒ ×Ô Ó ÔÓÖ ÒÓ Ó ÔÖÓÔÓÖ ÓÒ Ð Ð ÒÙÑ ÖÓ Ö Ñ × Ý ÔÙ Ò Ö ×Ô Ó × Ð Ö ÓÐ × ×Ø ÒØ ×Ô Ö Óº Ë Ð ÒÙÑ ÖÓ Ö Ñ × × ×Ù× ÔØ Ð × Ö ÑÙÝ Ö Ò ¸ Ð ÖÖ ÐÓ ÔÙ ×Ø Ö ÓÖ Ò Ó ÔÓÖ ÓÖ Ò Ð Ö Ñ Ý Ð Ö Ñ ÔÙ × Ö ÐÓ Ö ØÑ Ñ ÒØ ÐÓ Ð Þ Ð Ñ ÒØ Ð Ù×ÕÙ Ò Ö º ×ØÓ Ô Ò Ð Þ Ð Ò× Ö ÓÒ Ý Ð Ð Ñ Ò ÓÒ¸ ÔÙ × Ý ÕÙ Ö Ö Ý ÖÖ Ö Ö × Ò Ð ÖÖ ÐÓº 4.4 ´ Arboles Binarios ÓÖ ÔÖÓ Ö ÑÓ× ×ØÙ Ö ÙÒ Ð × ×Ô Ð Ö ÓÐ ÒÓÑ Ò Ö ÓÐ Ò ¹ Ö Ó º Ð Ö ÓÐ Ò Ö Ó × Ð × ÓÒ ÔØÙ Ð ÙÒ ÑÔÐ Ñ Ð ÓÖ ØÑÓ× Ý ×¹ ØÖÙ ØÙÖ × ØÓ׺ Definici´n 4.2 (Arbol binario) ÍÒ Ö ÓÐ Ò Ö Ó T × ÙÒ ÓÒ ÙÒØÓ ¬Ò ØÓ o ´ ÖÓ Ó Ñ × ÒÓ Ó× ¬Ò Ó Ö ÙÖ× Ú Ñ ÒØ ÓÑÓ × Ù ⎧ ⎪ ⎪ ⎪ ∅ ÒÓØ Ð Ö ÓÐ ⎧ Ö Ó Ú Ó Ò ⎪ ⎨ ⎪ n ⎪ ⎨ × Ð ÒÓ Ó Ö Þ T= ⎪ < Ä(T ), Ö ⎪ Þ(T ), Ê(T ) > ÐÓ ÓÒØÖ Ö Ó | Ä(T ) × Ð ×Ù Ö ÓÐ Ò Ö Ó ÞÕÙ Ö Ó ⎪ ⎪ ⎪ ⎪ ⎩ ⎩ Ê(T ) × Ð ×Ù Ö ÓÐ Ò Ö Ó Ö Ó ´ º½µ Ð ÓÒØ Ò Ó ÙÒ ÒÓ Ó ni × ÒÓØ ÓÑÓ Ã (ni)º ÒÓÑ Ò Ö ÑÓ× B Ð ÓÒ ÙÒØÓ Ò¬Ò ØÓ ØÓ Ó× ÐÓ× Ö ÓÐ × Ò Ö Ó× ÔÓ× Ð ×º Ä ¬Ò ÓÒ Ö ÓÐ Ò Ö Ó × Ö ÒØ Ð ¬Ò ÓÒ Ö ÓÐ Ò Ü º½ ´Ô Ò ¾ µº Ä ×Ø Ò ÓÒ Ð Ö Ð Þ Ð ÒÓ ÓÒ × ÒØ Ó Ð Ö Ñ º Ò Ð Ó Ù¹ ÖÖ Ò ¸ ÐÓ× Ö ÓÐ × Ò Ö Ó× ÐÙ×ØÖ Ó× Ò Ð ¬ ÙÖ º ×ÓÒ Ö ÒØ × Ó Ð ¬Ò ÓÒ º¾ ÑÔ ÖÓ¸ Ó Ð ¬Ò ÓÒ º½¸ ÐÐÓ× ×ÓÒ Ù Ð ×º ר ÖÒ × ÒØ Ó ×¸ ÔÖ × ¹ Ñ ÒØ ¸ Ð Ö Ø Ö ×Ø ÕÙ ÒÓ× Ö ÒØ Þ Ö ÙÒ ÓÖÖ ×ÔÓÒ Ò ÙÒ ÚÓ ÒØÖ ÙÒ Ö ÓÐ
  • 279.
    ´ 4.4. Arboles Binarios 253 Ò Ö Ó Ý ÙÒÓ m¹Ö Ó Ù ÐÕÙ Ö º ÙÖ º Ó× Ö ÓÐ × Ò Ö Ó× Ö ÒØ × 4.4.1 Representaci´n en memoria de un ´rbol binario o a ÄÓ× Ö ÓÐ × Ò Ö Ó× × Ö ÔÖ × ÒØ Ò Ò Ñ ÑÓÖ ÓÒ ÖÖ ÐÓ׺ Ë Ò Ñ Ö Ó¸ ÔÙ ×ØÓ ÕÙ Ð Ñ Ò× ÓÒ Ð ÖÖ ÐÓ × Ó׸ Ð Ö ÔÖ × ÒØ ÓÒ × ÔÖ Ø Ñ ÒØ Ð Ñ ×Ñ ÕÙ ÓÒ Ð ×Ø × ÒÐ Þ ×º Ä ¬ ÙÖ º ÐÙ×ØÖ ÙÒ ÑÔÐÓº G S X B H A Z ÙÖ º Ê ÔÖ × ÒØ ÓÒ Ò Ñ ÑÓÖ ÙÒ Ö ÓÐ Ò Ö Ó Ú ÒØÙ ÐÑ ÒØ ¸ ÔÙ ÓÒÚ Ò Ö ÙÒ Ø Ö Ö ÔÙÒØ ÖÓ ÔÓÖ ÒÓ Ó ÓÖÖ ×ÔÓÒ ÒØ Ð ÒÓ Ó Ô Öº 4.4.2 Recorridos sobre ´rboles binarios a ÄÓ× Ö ÓÐ × Ý ÐÓ× Ö ÓÐ × Ò Ö Ó× Ö ÔÖ × ÒØ Ò ÓÖ Ò × Ö ÖÕÙ Ó׺ È ÖÓ Ö ÓÖ ÑÓ× ÕÙ Ð ÓÑÔÙØ ÓÖ ×ÓÐÓ ÔÖÓ × × Ù Ò × × Ö¸ ÒÓ ÔÙ ×Ø Ò Ù Ö¸ Ò Ð Ñ ×ÑÓ × ÒØ Ó ÒÙ ×ØÖ Ô Ö Ô ÓÒ¸ ÕÙ ÙÒ Ö ÓÐ × ÙÒ Ö Óк ÓÒ× Ö ÑÓ× Ð ÔÖÓ Ð Ñ ÓÒØ Ö Ð ÒÙÑ ÖÓ ÒÓ Ó× ÕÙ ÔÓ× ÙÒ Ö ÓÐ Ò Ö Óº È Ö × Ð × Ô ÕÙ Ò ×¸ ÓÑÓ × Ö × ÙÑ ÒÓ× ÒÓ ×Ø ÑÓ× Ö ×ØÖ Ò Ó× ÔÓÖ Ð ØÓÔÓÐÓ Ð Ö Óк Ó¸ ÔÓ ÑÓ× ÓÖÖ Ö ØÓ × Ð × ÓÒ Ü ÓÒ × ÒØÖ ÐÓ× Ö Ó× Ý ÙÒ ×ÓÑÓ× Ô × ÓÒØ Ö ÐÓ× ÒÓ Ó׺ ÓÒ× Ö ÑÓ× ÓÖ Ð Ú ÐÙ ÓÒ Ð ÜÔÖ × ÓÒ (x2 + x + 1)2y¸ Ð Ù Ð ÔÙ Ö ÔÖ × ÒØ Ö× Ñ ÒØ ÙÒ Ö ÓÐ Ò Ö Ó × Ñ Ð Ö Ð Ð ¬ ÙÖ º½¼º ÈÓ ÑÓ× ÓÑ ÒÞ Ö Ð Ú ÐÙ ÓÒ ×Ó Ö Ù ÐÕÙ Ö ÐÓ× ØÖ × ×Ù Ö ÓÐ × ÕÙ ÔÓ× Ò Ó ×º ÈÓÖ ÑÔÐÓ¸ ÔÓ Ö ÑÓ× Ú ÐÙ Ö x 2¸ ÐÙ Ó 2y¸ ÐÙ Ó x + 1 Ý × ¸ ×Ù × Ú Ñ ÒØ º ÆÓØ ÑÓ× ÕÙ ×Ø ÓÖ Ò Ú ÐÙ ÓÒ ÒÓ ÓÒ× Ö ×Ø Ò × ÒØÖ Ö Ñ × ÔÓÖ ÑÔÐÓ¸ Ð ÕÙ Ý ÒØÖ Ð Ö Ñ x2 Ý 2yº ÆÙ ×ØÖ Ú × ÓÒ ÒÓ× Ô ÖÑ Ø ÑÔÖÓÚ × Ö Ú Ö× × × Ù Ò × Ö ÓÖÖ Ó Ó ÔÖÓ ¹ × Ñ ÒØÓ ×Ó Ö Ð Ö Óк Ò ÙÒ ÓÑÔÙØ ÓÖ¸ ÑÔ ÖÓ¸ ÓÒ Ð Ö ÔÖ × ÒØ ÓÒ ÒÓ Ó Ò Ö Ó ¸ Ð Ú × ÓÒ ×Ø ר Ö ×ØÖ Ò ÔÓÖ Ð × × Ù ÒØ × ÓÒ ÓÒ × ½º Ð ÔÖ Ñ Ö ÒÓ Ó Ó × ÖÚ Ð × Ð Ö Þº ÓÒ× Ù ÒØ Ñ ÒØ ¸ × × ÑÓ× Ñ Ö Ö Ð ÙÒ ×Ù Ö ÓÐ Ò Ô ÖØ ÙÐ Ö¸ ÒØÓÒ × × Ö ÓÖÖ Ö Ò Ö ÓÒ × Ò ÒØ × Ð Ö Þº
  • 280.
    254 Cap´ ´ ıtulo 4. Arboles * + * ^ + 2 y x 2 x 1 ÙÖ º½¼ ÜÔÖ × ÓÒ Ð Ö Ö ÔÖ × ÒØ ÓÒ ÙÒ Ö ÓÐ Ò Ö Ó ¾º × ÙÒ ÒÓ Ó Ù ÐÕÙ Ö ×ÓÐÓ × ÔÙ Ò Ú Ö ×Ù× Ó× Ó× Ñ ÒØ ÐÓ× ÑÔÓ× Ä(T ) Ý Ê(T )º Ü ×Ø Ò Ù ØÖÓ Ô ØÖÓÒ × × Ù Ò × ÖÕÙ Ø Ô × Ó Ö ÓÖÖ Ó× Ô Ö ÔÖÓ × Ö ÙÒ Ö ÓÐ Ò Ö Ó ½º Algoritmo 4.2 (Recorrido prefijo) ´ µ Î × Ø Ð Ö Þº ´ µ Î × Ø Ð Ö Ñ ÞÕÙ Ö Ò ÔÖ ¬ Óº ´ µ Îר Ð Ö Ñ Ö Ò ÔÖ ¬ Óº ¾º Algoritmo 4.3 (Recorrido infijo) ´ µ Î × Ø Ð Ö Ñ ÞÕÙ Ö Ò Ò¬ Óº ´ µ Î × Ø Ð Ö Þº ´ µ Îר Ð Ö Ñ Ö Ò Ò¬ Óº ¿º Algoritmo 4.4 (Recorrido sufijo) ´ µ Î × Ø Ð Ö Ñ ÞÕÙ Ö Ò ×Ù¬ Óº ´ µ Îר Ð Ö Ñ Ö Ò ×Ù¬ Óº ´ µ Î × Ø Ð Ö Þº º Algoritmo 4.5 (Recorrido por niveles) ´ µ Ê ÔØ × ¼ ר Ð h(T ) − 1 Ð Ö ÓÐ ¯ ÁÑÔÖ Ñ ØÓ Ó× ÐÓ× ÒÓ Ó× Ð Ò Ú Ð i ÓÖ Ò Ó× ÞÕÙ Ö Ö º ÅÙ Ó× Ø ÜØÓ× ÒÓÑ Ò Ò ÐÓ× Ö ÓÖÖ Ó× ÔÖ ¬ Ó¸ Ò¬ Ó Ý ×Ù¬ Ó ÓÑÓ ÔÖ ÓÖ Ò¸ ÒÓÖ Ò Ý ÔÓרÓÖ Ò¸ Ö ×Ô Ø Ú Ñ ÒØ Ò Ð ×ÑÓ× ÔÖ ÓÖ Ö¸ ÒÓÖ Ö Ý ÔÓרÓÖ Öº ÔÐ Ò Ó Ð × ¬Ò ÓÒ × ×Ó Ö Ð Ö ÓÐ Ð ¬ ÙÖ º½½¸ Ø Ò ÑÓ× Ð × Ù ÒØ Ö ÓÖÖ Ó ÔÖ ¬ Ó G S B X A Z ´ º¾µ ÈÖ Ñ ÖÓ Ú × Ø ÑÓ× Ð Ö Þ ´Gµ¸ ÐÙ Ó Ð ×Ù Ö ÓÐ ÞÕÙ Ö Ó ´S Bµ Ý ÐÙ Ó Ð ×Ù Ö ÓÐ Ö Ó ´X A Zµº
  • 281.
    ´ 4.4. Arboles Binarios 255 G S X B A Z ÙÖ º½½ Ö ÓÐ Ò Ö Ó Ô Ö ÑÔÐ ¬ Ö Ö ÓÖÖ Ó× È Ö Ð Ö ÓÖÖ Ó Ò¬ Ó Ø Ò ÑÓ× B S G A X Z ´ º¿µ ÈÖ Ñ ÖÓ Ú × Ø ÑÓ× Ð Ö Ñ ÞÕÙ Ö Ò Ò¬ Ó ´B Sµ¸ ÐÙ Ó Ð Ö Þ ´Gµ Ý ÙÐÑ Ò ÑÓ× ÓÒ Ð ×Ù Ö ÓÐ Ö Ó ´A X Zµº Ð Ö ÓÖÖ Ó ×Ù¬ Ó × B S A Z X G ´ºµ ÈÖ Ñ ÖÓ Ú × Ø ÑÓ× Ð Ö Ñ ÞÕÙ Ö Ò ×Ù¬ Ó ´B Sµ¸ ÐÙ Ó Ð Ö Ñ Ö ´A Z Xµ ݸ ÔÓÖ ÙÐØ ÑÓ¸ Ð Ö Þ (Gµº Ò ÐÑ ÒØ ¸ Ð Ö ÓÖÖ Ó ÔÓÖ Ò Ú Ð × × G S X B A Z ´ºµ Ñ ÒÙ Ó¸ Ð × Ù Ò Ð Ö ÓÖÖ Ó Ö Ø Ö Þ Ð ØÓÔÓÐÓ Ð Ö Óк Ò ØÓ¸ ÐÓ× Ö ÓÖÖ Ó× ×Ø Ò ÒØ Ñ Ñ ÒØ Ö Ð ÓÒ Ó× ÓÒ ÑÙ Ó× ÐÓ× Ð ÓÖ ØÑÓ× ×Ó Ö Ö ÓÐ × Ý Ö Ø ÖÞ Ò Ð Ó Ö ×Ù ÓÖÑ º ÓÒ× Ö ÑÓ× Ð Ö ÓÐ ÜÔÖ × ÓÒ × Ð Ö × ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ º½¼º ËÙ Ö ÓÖÖ Ó ×Ù¬ Ó × x 2∧ x 1 + + 2 y ∗ ∗ ´ºµ ÕÙ × Ð ÜÔÖ × ÓÒ ×Ù¬ Ð ÜÔÖ × ÓÒ Ð Ö ´Ú Ü ¾º º ´Ô Ò ½½ µµº Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó × ∗ + ∧x2 + x1 ∗ 2y ´ºµ Ð Ù Ð ÔÙ Ú ÐÙ Ö× ÔÓÖ Ð Ö ÓÖÑ Ò ÐÓ Ð Ú ÐÙ ÓÒ ÙÒ ÜÔÖ × ÓÒ Ò¬ º ÓÖ ÓÒ× Ö ÑÓ× ÙÒ Ð ÓÖ ØÑÓ ÑÔÖ × ÓÒ Ð Ö ÓÐ Ò¬ Óº Algoritmo 4.6 (Impresi´n infija, parentizada, de un ´rbol binario) Ä o a ÒØÖ Ð Ð ÓÖ ØÑÓ × Ð Ö Þ p ÙÒ Ö ÓÐ Ò Ö Óº Ä × Ð × Ð Ö ÓÖÖ Ó Ò¬ Ó¸ Ô Ö ÒØ ¹ Þ Ó ´Ú × Ü º¾º¾ ´Ô Ò ¾ µµº Ð Ð ÓÖ ØÑÓ × Ö ÙÖ× ÚÓ ÓÒ ÔÖÓØÓØ ÔÓ void imprimir(Node *nodo); ÓÒ ÒÓ Ó × Ð Ö Þ Ð Ö ÓÐ ÑÔÖ Ñ Öº Ä ÔÖ Ñ Ö ÐÐ Ñ ÙØ Ö× ÓÒ Ð Ö Þº ½º Ë nodo == NULL Ø ÖÑ Ò º ¾º ÁÑÔÖ Ñ ´ º ¿º imprimir(LLINK(nodo));
  • 282.
    256 Cap´ ´ ıtulo 4. Arboles º ÁÑÔÖ Ñ Ð × Ñ ÓÐÓ ÓÒØ Ò Ó Ò ÒÓ Óº º imprimir(RLINK(nodo)); º ÁÑÔÖ Ñ µ º · · Ü ¾ Ü ½ Ü ¾ · Ü · ½ ÙÖ º½¾ ÈÖÓÝ ÓÒ Ò¬ ÙÒ Ö ÓÐ Ò Ö Ó È Ö Ð Ö ÓÐ Ð ¬ ÙÖ º½¼¸ Ð Ð ÓÖ ØÑÓ ÖÖÓ Ð × Ù Ò ((((x) ∧ (2)) + ((x) + (1))) + ((2) ∗ (y))) ; ´ºµ Ð Ù Ð × ÙÒ × Ù Ò Ò¬ ¸ Ú Ð ¸ Ð ÜÔÖ × ÓÒ Ð Ö º Ò ÓØÖ × Ô Ð Ö ×¸ Ð Ð ÓÖ ØÑÓ º Ó Ø Ò ÙÒ Ö ÔÖ × ÒØ ÓÒ Ô Ö ÒØ Þ Ð Ö ÓÐ Ö ÒØ Ð Ö ÔÖ × ÒØ ÓÒ Ò Ü º¾º¾ ´Ô Ò ¾ µº ר Ö ÔÖ × ÒØ ÓÒ Ø Ñ Ò ÓÒ× ÖÚ Ð ÓÖÑ Ð Ö ÓÐ Ý Ô ÖÑ Ø Ö ÓÒרÖÙ Ö ×Ù ÓÖÑ ÓÖ Ò Ðº ÍÒ ÓÖÑ Ú ×Ù Ð ÒØ ÖÔÖ Ø Ö Ð Ö ÓÖÖ Ó Ò¬ Ó¸ ÕÙ Ö ÕÙ Ö ÕÙ ÕÙ ÐÓ× ÒÓ Ó× ×Ø Ò ×Ù¬ ÒØ Ñ ÒØ × Ô Ö Ó׸ ÓÒ× ×Ø Ò Ñ Ò Ö Ð ÔÖÓÝ ÓÒ ÙÒ ÐÙÞ ×Ó Ö Ð Ö Þº Ð Ö ÓÖÖ Ó Ò¬ Ó × ÔÖÓÝ Ø Ö Ò ÙÒ ÔÐ ÒÓ × ØÙ Ó Ó Ð Ö Óк Ä ¬ ÙÖ º½¾ ×ÕÙ Ñ Ø Þ Ð º ÓÒ× Ö ÑÓ× ÓÖ ÙÒ ÔÖÓ Ð Ñ ÒÚ Ö×Ó Ó Ð ÙÒ Ö ÓÖÖ Ó Ù ÐÕÙ Ö ¸ ÓÑÓ Ó Ø Ò Ö Ð Ö ÓÐ Ä Ö ×ÔÙ ×Ø Ó¬ Ð × ÕÙ ÒÓ × ÔÓ× Ð º Ä Ö ×ÔÙ ×Ø Ó¬ Ó× × ÕÙ ØÓ Ó Ô Ò Ð Ø ÔÓ Ö ÓÐ Ò Ö Óº Ð ÙÒ Ñ Ò Ö ¸ ÙÒ Ö ÓÖÖ Ó¸ ÙÒ Ó Ð ÓÒÓ Ñ ÒØÓ Ö Ð Ø ÔÓ Ð Ö Óи ÓÒÐÐ Ú ×Ù¬ ÒØ Ò ÓÖÑ ÓÒ ×Ó Ö ×Ù ØÓÔÓÐÓ º Ò Ð Ó ÙÖÖ Ò ¸ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó Ô ÖÑ Ø ÒØ ¬ Ö ÒÑ Ø Ñ ÒØ Ð Ö Þ Ý Ð Ö Þ Ð ×Ù Ö ÓÐ ÞÕÙ Ö Óº È ÖÓ ×Ø Ò ÓÖÑ ÓÒ ÔÓÖ × ×ÓÐ ÒÓ × ×Ù¬ ÒØ Ô Ö Ö ÓÒרÖÙ Ö Ð Ö ÓÐ ÓÖ Ò Ðº Ë Ö ÕÙ Ö Ð Ó Ñ ×º Ü ×Ø Ò Ú Ö Ó× Ñ ØÓ Ó× Ô Ö Ó Ø Ò Ö Ð ÓÖÑ ÓÖ Ò Ðº ÌÓ Ó× Ö ÕÙ Ö Ò Ò ÓÖÑ ÓÒ ÓÒ Ðº ÍÒ ÔÖ Ñ Ö Ñ ØÓ Ó × Ò Ö Ð Ñ Ø ÓÖ × Ð Ö ÓÖÖ Ó Ð Ö ÔÖ × ÒØ ÓÒ Ô Ö¹ ÒØ Þ ÜÔÐ Ò Ü º¾º¾ ´Ô Ò ¾ µ × ÙÒ ÑÔÐÓ Ð Ð ÓÖ ØÑÓ º ÑÔÖ × ÓÒ Ò¬ Ô Ö ÒØ Þ × ÓØÖÓ ÑÔÐÓº Ù Ð ×Ð Ö Ò ÒØÖ Ð × Ö ÔÖ × ÒØ ÓÒ × Ô Ö ÒØ Þ × Ü º¾º¾ ´Ô Ò ¾ µ Ý Ð ÔÓÖ Ð Ð ÓÖ ØÑÓ º È Ö Ö ×ÔÓÒ Ö¸ Ó × ÖÚ ÑÓ× Ð Ö ÔÖ × ÒØ ÓÒ Ô Ö ÒØ Þ Ð Ö ÓÐ Ð ¬ ÙÖ º½¼ (∗(+(∧(x)(2))(+(x)(1)))(∗(2)(y))) ´ºµ Ð Ð Ñ Ò Ö ÐÓ× Ô Ö ÒØ × ×¸ Ð ÜÔÖ × ÓÒ Ö ×ÙÐØ ÒØ × ÒØ Ð ÜÔÖ × ÓÒ ´ º µ × Ö¸ × Ð Ö ÓÖÖ Ó ÔÖ ¬ Óº
  • 283.
    ´ 4.4. Arboles Binarios 257 Ä Ö ÔÖ × ÒØ ÓÒ Ô Ö ÒØ Þ Ü º¾º¾ ´Ô Ò ¾ µ × ÙÒ Ú Ö× ÓÒ ÜØ Ò Ð Ö ÓÖÖ Ó ÔÖ ¬ Óº Ð Ñ ×ÑÓ ÑÓ Ó¸ Ð Ö ÔÖ × ÒØ ÓÒ ÓÒרÖÙ ÔÓÖ Ð Ð ÓÖ ØÑÓ º × ÙÒ Ú Ö× ÓÒ ÜØ Ò Ð Ö ÓÖÖ Ó Ò¬ Óº Ñ × Ö ÔÖ × ÒØ ÓÒ × ÓÒØ Ò Ò Ò ÓÖÑ ÓÒ ×Ù¬ ÒØ Ô Ö Ö ÓÒרÖÙ Ö Ð Ö ÓÐ ÓÖ Ò Ðº ÇØÖ ÐØ ÖÒ Ø Ú Ô Ö Ö ÓÒרÖÙ Ö Ð Ö ÓÐ ÓÖ Ò Ð ÓÒ× ×Ø Ò ÓÑ Ò Ö Ð Ò ÓÖ¹ Ñ ÓÒ Ó× Ö ÓÖÖ Ó× Ö ÒØ × ×Ó Ö Ð Ñ ×ÑÓ Ö ÓÐ Ø Ò ÕÙ ÜÔÐ Ö ÑÓ× Ò Ü º º½¿ ´Ô Ò ¾ ½µº * + * + ^ 2 y x 1 x 2 ÙÖ º½¿ Ö ÓÐ ÓÔ Ö ÓÒ × ÕÙ Ú Ð ÒØ Ð Ð ¬ ÙÖ º½¼ ÓÒ Ð Ö ÓÖÖ Ó Ò¬ Ó ÒÓÖÑ Ð¸ × Ò Ô Ö ÒØ × ×¸ ÒÓ × ÔÓ× Ð ÓÒרÖÙ Ö Ð ÙÒ Ö ÓÐ ÔÓÖÕÙ × ÑÔÓ× Ð ÓÒÓ Ö Ð ÔÖ Ò º ÅÙ Ó× Ø ÔÓ× Ö ÓÐ × ÔÙ Ò ÓÒרÖÙ Ö× ÓÒ Ø Ò ×ÓÐÓ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó Ó ×Ù¬ Óº Ü ×Ø Ò ×Ó× Ò ÐÓ× Ù Ð × ÒÓ × Ò × Ö Ó Ó Ø Ò Ö ÙÒ Ö ÓÐ ÒØ Ó Ð ÓÖ Ò Ð¸ Ô ÖÓ × ÕÙ Ú Ð ÒØ ØÓ× Ð ×ØÖ ÓÒº ÍÒ ÑÔÐÓ ÒÓØ Ð ×Ø Ó ÔÓÖ ÐÓ× Ö ÓÐ × ÜÔÖ × ÓÒ × Ð Ö × ÔÓÖ ÑÔÐÓ¸ Ð Ö ÓÐ Ð ¬ ÙÖ º½¿ × Ö ÒØ Ò ÓÖÑ Ô ÖÓ ÕÙ Ú Ð ÒØ Ò ÓÔ Ö ÓÒ Ð Ö ÓÐ Ð ¬ ÙÖ º½¼º Ô × Ö Ð × Ñ Ù ×¸ × ÑÙÝ ÑÔÓÖØ ÒØ ÔÖ Ò Ö ÕÙ ¸ ÙÒ ÜÔÖ × ÓÒ ÔÖ ¬ Ó ×Ù¬ ¸ × ÔÓ× Ð ÓÒרÖÙ Ö ÙØÓÑ Ø Ñ ÒØ ÙÒ Ö ÓÐ ÕÙ Ö ÔÖ × ÒØ ÓÖÖ Ø Ñ ÒØ Ð Ú ÐÙ ÓÒ Ð ÜÔÖ × ÓÒº ×ØÓ × ÑÙÝ ÑÔÓÖØ ÒØ ÔÓÖÕÙ Ð ÙÒ Ñ Ò Ö Ð ÜÔÖ × ÓÒ ×Ù¬ ÔÓ× ×Ù¬ ÒØ Ò ÓÖÑ ÓÒ Ô Ö ÓÒרÖÙ Ö ÙÒ Ö Óи Ö Ó¸ Ô Ö Ö ×ÓÐÚ Ö Ð ÔÖÓ Ð Ñ º Ò ÓØÖ × Ô Ð Ö ×¸ Ò Ð ×Ó Ð × ÜÔÖ × ÓÒ × Ð Ö ×¸ ÔÓ Ö ÑÓ× ÓÔØ Ö ÔÓÖ ÓÒרÖÙ Ö Ð Ö ÓÐ ÕÙ ØÙ Ð Ú ÐÙ ÓÒ ÞÕÙ Ö Ö º ØÓ× Ð ÔÖÓ Ð Ñ ¸ Ð ×ÓÐÙ ÓÒ ×Ø ÝÐ Ñ Ù ÒÓ × ÑÔÓÖØ ÒØ º × Ô٠׸ × ÑÔÖ ÔÓ Ö ÑÓ× ØÖ Ö ÓÒ ÜÔÖ × ÓÒ × ×Ù¬ ׸ ÙÒ ÓÖÑ ¬ Þ Ý ÑÙÝ ÓÑÔ Ø ÐÑ Ò Ö ÜÔÖ × ÓÒ × Ð Ö ×º 4.4.3 Un TAD gen´rico para ´rboles binarios e a ÒØ × ÓÖ Ö Ð ÓÖ ØÑÓ× ÕÙ ÒÓ× ÒØÖ Ò Ò Ò Ð Ö ÓÖÖ Ó Ö ÓР׸ ר Ð Ö ÑÓ× ÙÒ Ì ×Ó Ö Ð Ù Ð ÙÒ Ñ ÒØ Ö ÑÓ× Ð Ñ ÝÓÖ Ð × ×ØÖÙ ØÙÖ × Ö ÓÐ Ò Ö Ó ×Ø Ø ÜØÓº ÅÓ Ð Þ Ö ÑÓ× ÑÔÐ ÒØ Ö ÑÓ× ÙÒ Ñ Ò ×ÑÓ Ò Ö Ó Ô Ö ÓÒרÖÙ Ö ÒÓ Ó× Ò ¹ Ö Ó× º ÐÓ Ð Ö Ó ×Ø Ø ÜØÓ × ÖÖÓÐÐ Ö ÑÓ× Ö ÒØ × ×ØÖÙ ØÙÖ × Ö ÓÐ Ò Ö Óº Ä Ñ ÝÓÖ ÐÐ × × ÑÔÖ Ñ Ò Ö Ò ØÖ × ØÖ ÙØÓ× × Ó× ÙÒ Ð Ú ¸ ÙÒ ÔÙÒØ ÖÓ Ð Ö Ñ ÞÕÙ Ö Ý ÙÒ ÔÙÒØ ÖÓ Ð Ö Ñ Ö º Ë ÙÒ Ð Ø ÔÓ Ö Óи Ð ÒÓ Ó ÔÙ ÓÒØ Ò Ö Ð ÙÒ Ò ÓÖÑ ÓÒ ÓÒ Ð ÓÒØÖÓк ÑÓ׸ ÒØÓÒ ×¸ Ò ÓÒØÖ Ö ÙÒ ÓÖÑ ¬Ò Ö Ò Ö Ñ ÒØ ÒÓ Ó× Ò Ö Ó× Ù ÐÕÙ Ö Ò ÓÐ Ó ÐÓ× × Ù ÒØ × Ö ÕÙ Ö Ñ ÒØÓ×
  • 284.
    258 Cap´ ´ ıtulo 4. Arboles ½º Soporte para atributos generales Ó ÙÒ ÒÓ Ó Ò Ö Ó¸ ÔÓ Ö Ö× Ð Ð Ú Ý ×Ù× Ö Ñ × × Ò ÒØ ׺ רÓ× ØÖ ÙØÓ× ×ÓÒ ÓÑÙÒ × ØÓ Ó× Ð × Ð × × ÒÓ Ó× Ò Ö Ó× ÔÓ× Ð ×º ¾º Especificaci´n de atributos opcionales Ú ÒØÙ ÐÑ ÒØ ¸ o ÔÓ× Ð Ø Ö× Ð Ð Ö Ö ØÖ ÙØÓ× ÔÖÓÔ Ó× ÙÒ Ð × Ô ÖØ ÙÐ Ö ÒÓ Ó Ò Ö Óº ¿º Soporte opcional para destructores virtuales Ð Ù×Ù Ö Ó ÔÙ ØÖ Ö ÓÔ¹ ÓÒ ÐÑ ÒØ ÓÒ ÒÓ Ó× ÕÙ ÔÓ× Ò ×ØÖÙ ØÓÖ × Ú ÖØÙ Ð ×º º Soporte para nodos centinelas especiales ÒÓÖÑ ÐÑ ÒØ ¸ Ð Ö ÓÐ Ú Ó × × Ò Ð Ñ ÒØ Ð Ú ÐÓÖ ×Ô Ð NULLº È Ö ÖØ × ×ØÖÙ ØÙÖ × Ö Óи × ÓÒÚ ¹ Ò ÒØ ÕÙ ×Ø Ö ÓÐ Ú Ó × Ö ÔÖ × ÒØ Ñ ÒØ ÙÒ Òר Ò Ô ÖØ ÙÐ Ö ÒÓ Óº × ÖÖÓÐÐ Ö ÑÓ× ÙÒ ×ÓÐÙ ÓÒ × Ò Ñ ÖÓ× ÕÙ × ÜÔ Ò Ò Ð×× Ô Ö Ñ ØÖ Þ ×º ÄÓ× Ñ ÖÓ× × ¬Ò Ò Ò Ð Ö ÚÓ ØÔÐ ÒÆÓ ºÀ ´Ò Ú Ö ¬Ò µ º ØÔÐ ÒÆÓ ºÀ ´Ò Ú Ö ¬Ò µ ÜÔÓÖØ Ó× Ñ ÖÓ׺ Ð ÔÖ Ñ ÖÓ × ¬Ò Ð × Ù ÒØ ÑÓ Ó ¾ Ñ ÖÓ× ÜØ ÖÒÓ× BinNode<Key> ¾ ≡ ¾ # define DECLARE_BINNODE(Name, height, Control_Data) INIT_CLASS_BINNODE(Name, height, Control_Data) }; template <typename Key> Name<Key> * const Name<Key>::NullPtr = NULL; INIT_CLASS_BINNODE(Name##Vtl, height, Control_Data) virtual ~Name##Vtl() { /* empty */ } }; template <typename Key> Name##Vtl<Key> * const Name##Vtl<Key>::NullPtr = NULL ¬Ò × DECLARE BINNODE¸ Ù× Ò ÙÒ × ¾ ¼ ¸ ¿½ ¸ Ò º DECLARE BINNODE() Ò Ö Ó× Ð × × Ô Ö Ñ ØÖ Þ × ÕÙ Ö ÔÖ × ÒØ Ò ÒÓ Ó× Ò Ö Ó× Ô ÖØ Ò ÒØ × Ð ÙÒ Ð × Ö ÓÐ Ò Ö Óº Ð Ô Ö Ñ ØÖÓ Name × Ð ÒÓÑ Ö ÔÖ ¬ Ó Ð × Ð × × ÕÙ × × Ò Ò Ö Öº Ð Ñ ÖÓ × ÜÔ Ò Ó× Ð × × × ÒØ × Name Ý NameVtlº Ä ÙÒ Ö Ò × ÕÙ NameVtl ÔÓ× ÙÒ ×ØÖÙ ØÓÖ Ú ÖØÙ Ðº Ð Ô Ö Ñ ØÖÓ height Ö ÔÖ × ÒØ ÙÒ ×Ø Ñ Ó Ð ÐØÙÖ Ñ Ü Ñ ÕÙ ÔÙ Ð ÒÞ Ö Ð Ö ÓÐ Ò Ö Óº ÅÙ Ó× Ð ÓÖ ØÑÓ× ×Ó Ö Ö ÓÐ × Ò Ö Ó× ×ÓÒ Ö ÙÖ× ÚÓ׸ ÔÓÖ ÐÓ ÕÙ Ð ÓÒ×ÙÑÓ ×Ô Ó Ò Ô Ð × ÙÒ ØÓÖ ÓÒ× Ö Öº Ò ×Ø × ÒØ Ó¸ Ð ØÖ ÙØÓ height Ó Ö ÙÒ ÔÖÓÜ Ñ Ó Ð ÐØÙÖ Ñ Ü Ñ Ð Ö ÓÐ Ò Ö Ó¸ ÙÝÓ Ú ÐÓÖ × ÖÚ ÐÓ× Ð Ó¹ Ö ØÑÓ× ØÓÑ Ö ÔÖ Ú × ÓÒ × Ö Ð ÓÒ×ÙÑÓ Ò Ô Ð º Ò ÐÑ ÒØ ¸ Ð Ô Ö Ñ ØÖÓ Control Data × ÙÒ Ð × ÕÙ Ö ÔÖ × ÒØ Ò ÓÖÑ ÓÒ ÓÒØÖÓÐ Ð ÒÓ Ó Ò Ö Ó Ô ÖØ Ò ÒØ ÙÒ ×Ô Ð Þ ÓÒ¸ Ð Ù Ð Ú Ö × ÙÒ Ð Ø ÔÓ Ö ÓÐ Ò Ö Ó ÕÙ × Ñ Ò º ÈÓÖ ÑÔÐÓ¸ ÐÓ× Ö ÓÐ × ÖÓ Ó¹Ò ÖÓ¸ ÕÙ ×ØÙ Ö ÑÓ× Ò Ü º ´Ô Ò ½¿µ ÐÑ Ò Ò ÙÒ ÓÐÓÖº ר ÕÙ ÑÓ× ÕÙ Control data ÒÓ ×Ø ר ¹ Ò Ù× Ö× ÔÓÖ Ð Ù×Ù Ö Ó ¬Ò Ð ÅÙ Ó× Ø ÔÓ× Ö ÓÐ × Ò Ö Ó× × ÙØ Ð Þ Ò Ô Ö ÓÒרÖÙ Ö Ñ Ô Ó× ÒØÖ Ð Ú × Ð ÙÒ ÓÑ Ò Ó Ý Ð Ñ ÒØÓ× Ð ÙÒ Ö Ò Óº Ò ×Ø × ØÙ ÓÒ¸ ÐÓ ÕÙ × Ö ÕÙ Ö × ÕÙ ÒÓ Ó ÐÑ Ò ÙÒ Ð Ñ ÒØÓ Ð Ö Ò Ó Óº ÈÙ ×ØÓ ÕÙ ÒÙ ×ØÖ ÔÖ Ø Ò× ÓÒ × Ò Ö ¸ ÒÓ ÔÓ ÑÓ× Ù× Ö Control Data¸ ÔÙ × × ÒÓ ÒÚ Ð Ö ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ ÙÒ Ì Ö ÓÐ ÖÓ Ó Ò Ö Óº Ò Ò Ð ×¸ ÒØ Ò Ð × × Ö × ÒØ Ò Ð ´ ÓÒ × µ
  • 285.
    ´ 4.4. Arboles Binarios 259 ÍÒ Ñ Ò Ö Ö Ð Þ Ö ÙÒ Ñ Ô Ó × Ñ ÒØ Ö Ò ÒØ Ö Þº ËÙÔÓÒ ÑÓ× ÕÙ Ö ÕÙ Ö ÑÓ× ÙÒ Ñ Ô Ó Ñ ÒØ Ö ÓÐ × ÖÓ Ó¹Ò ÖÓº ÈÓÖ ÑÔÐÓ¸ ÙÒ Ñ Ô Ó ÒØÖ ÒÙÑ ÖÓ× ÙÐ Ý Ô ÐÐ Ó׸ ÔÙ ×Ô ¬ Ö× Ð × Ù ÒØ ÑÓ Ó RbNode<int> -key: int -lLink: RbNode * -rlink: RbNode * +RbNode(k:const int &) +RbNode(node:const RbNode &) +RbNode() +reset(): void +get_key(): int& +getL(): RbNode*& +getR(): RbNode*& Persona +apellidos: string +apellidos(): string +modificar_apellidos(in a:string): void Ò ×Ø ×Ó¸ ÑÔÐ ÒØ ÑÓ× ÙÒ Ñ Ô Ó ¬ Ó Ò Ð × ÒØ Ó ÕÙ ×Ø ÓÒØ Ò Ö Ô Ö × Ø ÔÓ [int,string]º Ë × ÑÓ× ÙÒ Ñ Ô Ó Ò Ö Ó¸ Ð Ù Ð × Ñ × ÓÑÔÐ ØÓ¸ ÒØÓÒ × Ð Ð × Ö Ú × Ö ÙÒ ÔÐ ÒØ ÐÐ ¸ ÐÓ Ù Ð¸ Ò Ð ×Ó ÒÙ ×ØÖÓ ÑÔÐÓ¸ ÔÙ ×Ô ¬ Ö× Ð × Ù ÒØ Ñ Ò Ö RbNode<Key> -key: Key -lLink: RbNode<Key> * -rlink: RbNode<Key> * +RbNode(k:const Key &) +RbNode(node:const RbNode<Key> &) +RbNode() +reset(): void +get_key(): Key& +getL(): RbNode<Key>*& +getR(): RbNode<Key>*& key:class Key data:Data Mapppig +apellidos: string +apellidos(): string +modificar_apellidos(in a:string): void ÄÓ× Ö ÓÐ × Ö ÕÙ Ö Ò ÙÒ Ú ÐÓÖ ×Ô Ð Ô Ö Ö ÔÖ × ÒØ Ö Ð Ö ÓÐ Ú Óº Ì Ð Ú ÐÓÖ × ÐÑ Ò Ò Ð ØÖ ÙØÓ ×Ø Ø Ó Name<T>::NullPtr¸ Ð Ù Ð Ò Ð Þ Ö× ÜÔÐ Ø Ñ ÒØ Ð Ú ÐÓÖ Ö ÓÐ Ú Óº ÈÓÖ ÓÑ × ÓÒ¸ DECLARE BINNODE() ×ÙÑ ÕÙ Ð Ö ÓÐ Ú Ó × Ð Ú ÐÓÖ NULLº Ð ÙÒ × Ú × × ÓÒÚ Ò ÒØ ÕÙ NullPtr ÔÙÒØ ÙÒ ÒÓ Ó ÒØ Ò Ð Ô ÖØ ÙÐ Öº Ò ×Ø × × ØÙ ÓÒ × ÑÓ× Ù× Ö Ð Ñ ÖÓ DECLARE BINNODE SENTINEL()¸ Ð Ù Ð × ¬Ò Ð × Ù ÒØ ÑÓ Ó ¾ Ñ ÖÓ× ÜØ ÖÒÓ× BinNode<Key> ¾ +≡ ¾ ¾¼ # define DECLARE_BINNODE_SENTINEL(Name, height, Control_Data) INIT_CLASS_BINNODE(Name, height, Control_Data)
  • 286.
    260 Cap´ ´ ıtulo 4. Arboles Name(SentinelCtor) : Control_Data(sentinelCtor), lLink(NullPtr), rLink(NullPtr) {} static Name sentinel_node; }; template <typename Key> Name<Key> Name<Key>::sentinel_node(sentinelCtor); template <typename Key> Name<Key> * const Name<Key>::NullPtr = &Name<Key>::sentinel_node; INIT_CLASS_BINNODE(Name##Vtl, height, Control_Data) virtual ~Name##Vtl() { /* empty */ } private: Name##Vtl(SentinelCtor) : Control_Data(sentinelCtor), lLink(NullPtr), rLink(NullPtr) {} static Name##Vtl sentinel_node; }; template <typename Key> Name##Vtl<Key> Name##Vtl<Key>::sentinel_node(sentinelCtor); template <typename Key> Name##Vtl<Key> * const Name##Vtl<Key>::NullPtr = &Name##Vtl<Key>::sentinel_node ¬Ò × DECLARE BINNODE SENTINEL¸ Ù× Ò ÙÒ × ¿ ¿¸ ¸ ¸ Ò ½º Ð ÒÓ Ó Ò Ö Ó Ñ × × ÑÔÐ ¸ ÐÐ Ñ Ó BinNode<Key>¸ × ¬Ò Ò ÙÒ ×ÓÐ Ð Ò ¾¼ Ð× BinNode<Key> ¾ ¼ ≡ DECLARE_BINNODE(BinNode, 1024, Empty_Node); ¬Ò × BinNode¸ Ù× Ò ÙÒ × ¿¿ ¸ ¿ ß ¸ ¿ ½ ¸ Ò ¿¾ º BinNodeVtl¸ Ù× Ò ÙÒ × ¿¿ Ò ¿¾ º Í× × DECLARE BINNODE ¾ º Ä Ð × BinNode<Key> ×Ô ¬ Ð Ñ × × ÑÔÐ ÒÓ Ó Ô ÖØ Ò ÒØ ÙÒ Ö ÓÐ Ò Ö Óº Ë Ò ÓÒÓ Ö Ð Ø ÔÓ Ö ÓÐ Ò Ö Ó ÕÙ × ØÖ Ø ¸ ×Ù ÐØÙÖ × ×Ø ÒØ Ú Ö Ð Ý Ô Ò Ð ÓÖ Ò Ò ÕÙ Ð × Ð Ú × × Ò Ò× ÖØ ׺ ÈÓÖ ×Ø Ö ÞÓÒ¸ Ð Ø Ñ ÒÓ ÙÒ Ô Ð ÕÙ ÓÔ Ö ×Ó Ö ÙÒ Ö ÓÐ Ò Ö Ó × Ö ÐÓ ×Ù¬ ÒØ Ñ ÒØ Ö Ò Ô Ö ÕÙ Ô ÖÑ Ø ÐØÙÖ × Ð Ú ×º ÓÑÓ × ÑÙÝ Ð Ø ÖÑ Ò Ö Ð Ñ Ü Ñ ÐØÙÖ ÕÙ ÔÓ Ö Ð ÒÞ Ö ÙÒ Ö ÓÐ Ò Ö Ó Ò Ö Ð¸ Ð ¬ ÑÓ× Ò ÙÒ Ú ÐÓÖ Ö Ò ¸ Ô ÖÓ Ú ÖØ ÑÓ× ÕÙ ×ØÓ ÒÓ Ð Ñ Ò Ð ÔÓ× Ð ÙÒ × ÓÖ ÔÐ º BinNode<Key> ÒÓ Ø Ò ØÖ ÙØÓ× ÓÒØÖÓÐ ×Ô Ð × ÔÓÖ ×Ó¸ ÓÐÓ ÑÓ× Ð Ð × Ú Aleph::Empty Node¸ Ð Ù Ð ×Ø ¬Ò Ò Ð Ð Ð ÓØ º ÈÖ Ð Ø Ö Ð Ð Ð ¸ × ÜÔÓÖØ Ò ÐÓ× × Ù ÒØ × Ñ ÖÓ× ¾¼ Ñ ÖÓ× ÜØ ÖÒÓ× BinNode<Key> ¾ +≡ ¾ # define LLINK(p) ((p)->getL()) # define RLINK(p) ((p)->getR()) # define KEY(p) ((p)->get_key()) Ó ÙÒ ÒÓ Ó p¸ Ð ×Ó Ð Ð Ú × Ö Ð Þ ÓÒ KEY(p)¸ Ð ×Ó Ð Ö Ñ ÞÕÙ Ö ÓÒ LLINK(p) Ý Ð ×Ó Ð ÖÑ Ö ÓÒ RLINK(p)º ÍÒÓ ÐÓ× ØÖ ÙØÓ× ÙÒ ÒÓ Ó Ò Ö Ó Ñ × ÑÔÓÖØ ÒØ × ÐÓ ÓÒ ÓÖÑ Ð Ø ÔÓ Ð Ú ¸ Ð Ù Ð × Ò Ö Ñ ÒØ × ÕÙ Ð Ñ ÒØ Ð ÒÓÑ Ö key typeº ÍÒ ÙÒ ÓÒ Ò Ö ÔÙ ÓÒÓ Ö Ð Ø ÔÓ Ð Ú ÙÒ ÒÓ Ó Ñ ÒØ Ð ÒרÖÙ ÓÒ typename Node::key_type
  • 287.
    ´ 4.4. Arboles Binarios 261 class Key: BinNode +getKey(): Key& +getL(): Name*& +getR(): Name*& +Name(k:const Key&) +Name(control_data:const Control_Data&,k:const Key&) +Name(node:const Name&) +Name(control_data:const Control_Data&) +Name() +reset(): void ÙÖ º½ Ö Ñ ÍÅÄ Ð Ð× BinNode<Key> Ä Ù Ð Ö ¬ Ö Ð Ø ÔÓ Ð Ú Ð ÒÓ Óº Å ÒØ ר ÒØ Ö Þ¸ × ÔÙ ×ÒÖ Ó Ó Ò Ö Ó¸ × Ò Ò × ×Ô ¬ Ö¸ Ò ÓÒÓ Ö ÜÔÐ Ø Ñ ÒØ ¸ Ð Ø ÔÓ Ð Ú ÕÙ Ð Ö Ð ÒÓ Óº ËÙÔÓÒ ÑÓ× ÕÙ × ÑÓ× ÙÒ ÒÓ Ó ÕÙ Ù Ö ÓÑÓ ØÖ ÙØÓ ÓÒØÖÓÐ Ð ÐØÙÖ Ð ÒÓ Óº ¬Ò ÑÓ׸ ÒØÓÒ ×¸ ÙÒ Ð × ÕÙ ÓÒØ Ò Ø Ð ØÖ ÙØÓ Ý ÒÓ× Ú Ð ÑÓ× ÐÓ× Ñ ÖÓ× Ð × Ù ÒØ ÓÖÑ class Altura { private: size_t altura; public: Altura() { /* Empty */ } Altura(size_t a) : altura(a) { /* empty */ } size_t dar_altura() const { return altura; } }; DECLARE_BINNODE(Nodo, 255, Altura); SET_BINNODE_NULL_POINTER(NULL, Nodo); Ð Ñ ÖÓ × ÜÔ Ò Ó× Ð × × ÔÐ ÒØ ÐÐ ÒÓÑ Ò × Nodo<Key> Ý NodoVtl<Key>¸ Ö ×Ô Ø Ú Ñ ÒØ º Ä × Ð × × ×ÓÒ × ÒØ ׸ × ÐÚÓ ÕÙ NodoVtl<Key> ¬Ò ÙÒ ×¹ ØÖÙ ØÓÖ Ú ÖØÙ Ðº Ä ×ØÖÙ ØÙÖ Nodo<Key> × Ð × Ù ÒØ template <typename Key, size_t _MaxHeight = 255> class Nodo : public Altura { public: static Nodo * NullPtr; static const size_t MaxHeight = _MaxHeight; typedef Key key_type; private: Key key; Nodo * lLink; Nodo * rLink;
  • 288.
    262 Cap´ ´ ıtulo 4. Arboles public: Key & get_key() { return key; } Nodo *& getL() { return lLink; } Nodo *& getR() { return rLink; } Nodo(const Key & k) : key(k), lLink(NullPtr), rLink(NullPtr) { } Nodo(const Altura & control_data, const Key& k) : Altura(control_data), key(k), lLink(NullPtr), rLink(NullPtr) { } Nodo(const Altura & control_data) : Altura(control_data), lLink(NullPtr), rLink(NullPtr) { } Nodo() : lLink(NullPtr), rLink(NullPtr) { } Nodo(EmptyCtor) { } void reset() { rLink = lLink = NullPtr; } }; template <typename Key, size_t _MaxHeight> BinNode<Key, _MaxHeight> * BinNode<Key, _MaxHeight>::NullPtr = NULL; Ä × Ð × × Nodo<Key> Ý NodoVtl<Key> Ö ÔÖ × ÒØ Ò Ñ Ð × ÒÓ Ó× Ò Ö Ó× ÓÒ ØÖ ÙØÓ× ÓÒØÖÓÐ ¬Ò Ó× Ò Ð Ð × Altura Ý ÓÒ Ð Ú Ò Ö Keyº Ð ×Ó Ð Ð Ú ×Ø Ó ÔÓÖ get key() Ý ÐÓ× ×Ó× Ð × Ö Ñ × ÞÕÙ Ö Ý Ö ÔÓÖ getL() Ý getR()¸ Ö ×Ô Ø Ú Ñ ÒØ º Nodo<Key> Ö ÔÙ Ð Ñ ÒØ Alturaº ÈÓÖ Ø ÒØÓ¸ ÙÒ Nodo<Key> ׸ Ø Ñ Ò¸ Ø ÔÓ alturaº ר ÑÓ Ó¸ Nodo<Key> Ø Ò ×Ó ØÓ Ð ÒØ Ö Þ ÔÙ Ð Alturaº À Ý Ò Ó Ñ Ò Ö × ÓÒרÖÙ Ö ÙÒ Nodo<Key> Ö ÔÖ × ÒØ × ÔÓÖ ÐÓ× Ò Ó ÓÒרÖÙ ¹ ØÓÖ × Ò Ö Ó× ÐÓ× Ù Ð ×¸ Ü Ô ÓÒ Ð ÕÙ ÒØÓ¸ × ÜÔÐ Ò ÔÓÖ × ×ÓÐÓ׺ Ë × Ö ¹ ÕÙ Ö ÙÒ ÒÓ Ó ÒØ Ò Ð ¸ ר × Òר Ò Ñ ÒØ Ð ÕÙ ÒØÓ ÓÒרÖÙ ØÓÖ¸ Ð Ù Ð Ö ÕÙ Ö ÕÙ Node::Node(SentinelCtor) × ¬Ò Ò Ð Ð × Alturaº Ä ÔÐ ÒØ ÐÐ Nodo<Key> Ø Ò Ó× ØÖ ÙØÓ× ×Ø Ø Ó׺ Node::NullPtr × Ð ÔÙÒ¹ Ø ÓÖ Ð Ö ÓÐ Ú Óº Ò Ð Ñ ÝÓÖ Ð × × ØÙ ÓÒ ×¸ ר ÔÙÒØ ÖÓ Ø Ò Ö Ð Ú ÐÓÖ ÒÙÐÓ Ò ÓØÖ × Ó × ÓÒ ×¸ Node::NullPtr Ö ÓÒ Ö Ð ÒÓ Ó ÒØ Ò Ð º Ð Ú ÐÓÖ Node::NullPtr ¬Ò Ö× ÜÔÐ Ø Ñ ÒØ ÔÓÖ Ð ÒÚÓ ÒØ DECLARE BINNODE Ñ ¹ ÒØ Ð Ñ ÖÓ SET BINNODE NULL POINTERº ר Ñ ÖÓ ØÓÑ ÓÑÓ Ô Ö Ñ ØÖÓ× Ð ÒÓÑ Ö Ð Ð × ÒÓ Ó Ý Ð ÔÙÒØ ÖÓ Ð ÒÓ Ó ÒØ Ò Ð º Ð × ÙÒ Ó ØÖ ÙØÓ ×Ø Ø Ó ÓÖÖ ×ÔÓÒ ÙÒ Ú ÐÓÖ ×Ø Ñ Ó ÐØÙÖ Ñ Ü Ñ ¸ ÕÙ ÔÙ × Ö Ö ÕÙ Ö Ó ÔÓÖ Ð ÙÒÓ× Ð ÓÖ ØÑÓ× Ô Ö Ø ÖÑ Ò Ö Ð Ø Ñ ÒÓ ×Ù× Ô Ð ×º ÍÒ Nodo<Key> ÔÙ Ö ÙØ Ð Þ Ö× º ÈÓÖ ÑÔÐÓ¸ ÔÓ Ö ÑÓ× ÜØÖ ÖÐÓ ÙÒ Ö ÓÐ Ò× ÖØ ÖÐÓ Ò ÓØÖÓº Ò ×Ø ×Ó¸ Ð ×Ø Ó Ð ÒÓ Ó × Ö Ö Ò Óº È Ö ÐÐÓ × ÔÖÓÚ Ð Ñ ØÓ Ó reset()º 4.4.4 Contenedor de funciones sobre ´rboles binarios a ÅÙ × ÓÔ Ö ÓÒ × ×Ó Ö Ö ÓÐ × Ò Ö Ó× × Ò Ô×ÙÐ Ò Ò ÙÒ Ð ÓØ ×Ô ¹ Ð ÕÙ ÓÒØ Ò Ö Ð ÓÖ ØÑÓ× Ø Ô Ó× ×Ó Ö Ö ÓÐ × Ò Ö Ó× Ý ÕÙ × ¬Ò Ò Ð Ö ÚÓ tpl binNodeUtils.Hº Ä Ð ÓØ ÓÒØ Ò Ð ÓÖ ØÑÓ× Ø Ô Ó× ×Ó Ö Ö ÓÐ × Ò Ö Ó× ÔÓÖ ÑÔÐÓ¸ Ù ÓÒ Ö ÓÖÖ Ó׸ ÙÔÐ ÓÒ Ö ÓР׸ Ø Ø Ö º Ä Ñ ÝÓÖ Ô ÖØ Ð × ÙÒ ÓÒ × BinNode Utils ¾ ¿ ×ÓÒ ÔÐ ÒØ ÐÐ × ÓÒ Ð ÓÖÑ Ò Ö Ð × Ù ÒØ
  • 289.
    ´ 4.4. Arboles Binarios 263 template <class Node> funci´n (...) { ... } o × Ö¸ Ð Ø ÔÓ Ô Ö Ñ ØÖ Þ Ó × ÙÒ ÒÓ Ó Ò Ö Ó Ò Ö Ó Nodeº Ð ÓÒØÖ ØÓ Ñ Ò ÑÓ Ô Ö ÕÙ Ð Ð ÓØ ÓÔ Ö × ÕÙ Node ÜÔÓÖØ Ð × ÙÒ ÓÒ × BinNode<Key> ¬Ò × Ò tpl binNode.Hº 4.4.5 Recorridos recursivos Ä ÖÙØ Ò Ö ÓÖÖ Ó × Ö Ñ Ø ×Ù ÙÒ ÓÒ × Ö ÓÖÖ Öº × Ô٠׸ ÙÒ ÖÙØ Ò Ö ÓÖÖ Ó Ò¬ Ó Ø Ò Ö Ð × Ù ÒØ ÔÖÓØÓØ ÔÓ template <class Node> inline int inOrderRec(Node * root, void (*visitFct)(Node*, int, int)) Ä ÙÒ ÓÒ inOrderRec() Ö ÓÖÖ Ò ÓÖÑ Ò¬ Ð Ö ÓÐ Ò Ö Ó ÓÒ Ö Þ root Ý Ö ØÓÖÒ Ð ÒÙÑ ÖÓ ÒÓ Ó× Ú × Ø Ó׺ Ú Þ ÕÙ × Ú × Ø ÙÒ ÒÓ Ó¸ × ØÙ ÙÒ ÐÐ Ñ Ð ÙÒ ÓÒ ÔÙÒØ ÔÓÖ visitFct¸ Ð Ù Ð ÓÖÖ ×ÔÓÒ Ö× ÓÒ Ð × Ù ÒØ ÔÖÓØÓØ ÔÓ template <class Node> void visitFct(Node* node, int level, int position) node × ÙÒ ÔÙÒØ ÖÓ Ð ÒÓ Ó Ú × Ø Ó¸ level × Ð Ò Ú Ð Ó Ð ÔÖÓ ÙÒ Ð ÒÓ Ó Ö ×Ô ØÓ Ð Ö Þ Ý position × ×Ù ÔÓ× ÓÒ ÒØÖÓ Ð Ö ÓÖÖ Óº inOrderRec() × ÙÒ ÛÖ ÔÔ Ö ÙÒ ÙÒ ÓÒ Ö ÙÖ× Ú ¸ ר Ø ¸ Ò Ö ØÙ Ö Ð Ö ÓÖÖ Ó¸ Ð Ù Ð × Ö Ú Ö Ø Ñ ÒØ Ð ¬Ò ÓÒ ¾¿ ÙÒ ÓÒ × BinNode Utils ¾ ¿ ≡ ¾¿ template <class Node> inline static void __inorder_rec(Node * node, const int& level, int & position, void (*visitFct)(Node *, int, int)) { if (node == Node::NullPtr) return; __inorder_rec(static_cast<Node*>(LLINK(node)), level + 1, position, visitFct); (*visitFct)(node, level, position); ++position; __inorder_rec(static_cast<Node*>(RLINK(node)), level + 1, position, visitFct); } Ð Ò Ú Ð level × Ò Ö Ñ ÒØ Ò ÐÐ Ñ ¸ Ñ ÒØÖ × ÕÙ Ð position Ò Úר º ÆÓØ ÑÓ× ÕÙ position × ÙÒ Ô Ö Ñ ØÖÓ ÔÓÖ Ö Ö Ò ¸ ÔÙ × ×Ø Ö ÕÙ Ö ØÙ Ð Þ Ö× Ò Úר º È Ö ÕÙ Ð ÖÙØ Ò × ÓÒ× ×Ø ÒØ ¸ Ð ÐÐ Ñ Ò Ð Ö Ð Þ Ö× ÓÒ Ú ÐÓÖ × level Ý position Ù Ð × ÖÓº ר × Ð ØÖ Ó inOrderRec() ¾¿ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¾¿ ¾ template <class Node> inline int inOrderRec(Node * root, void (*visitFct)(Node*, int, int)) { int position = 0; __inorder_rec(root, 0, position, visitFct); return position; }
  • 290.
    264 Cap´ ´ ıtulo 4. Arboles inOrderRec()Ö ØÓÖÒ Ð ÒÙÑ ÖÓ ÒÓ Ó× ÕÙ ÓÒØ Ò Ð Ö Óк ÄÓ× Ö ÓÖÖ Ó× ÔÖ ¬ Ó Ý ×Ù¬ Ó × ¬Ò Ò Ñ Ò Ö Ò ÐÓ ¾ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¾¿ ¾ template <class Node> inline static void __preorder_rec (Node * p, const int & level, int & position, void (*visitFct)(Node*, int, int)) { if (p == Node::NullPtr) return; (*visitFct)(p, level, position); ++position; __preorder_rec(static_cast<Node*>(LLINK(p)), level + 1, position, visitFct); __preorder_rec(static_cast<Node*>(RLINK(p)), level + 1, position, visitFct); } template <class Node> inline int preOrderRec(Node * root, void (*visitFct)(Node*, int, int)) { int position = 0; __preorder_rec(root, 0, position, visitFct); return position; } template <class Node> inline static void __postorder_rec(Node * node, const int & level, int & position, void (*visitFct)(Node*, int, int)) { if (node == Node::NullPtr) return; __postorder_rec(static_cast<Node*>(LLINK(node)), level + 1, position, visitFct); __postorder_rec(static_cast<Node*>(RLINK(node)), level + 1, position, visitFct); (*visitFct)(node, level, position); ++position; } template <class Node> inline int postOrderRec(Node * root, void (*visitFct)(Node*, int, int)) { int position = 0; __postorder_rec(root, 0, position, visitFct); return position; } ÌÓ × Ð × ÔÖ Ñ Ø Ú × Ö ÓÖÖ Ó ÙÒ ÓÒ × BinNode Utils ¾ ¿ Ø Ò Ò ÓÑÓ ÔÖ Ñ Ö Ô Ö Ñ ØÖÓ Ð Ö Þ Ð Ö ÓÐ Ò Ö Óº Ð × ÙÒ Ó Ô Ö Ñ ØÖÓ × ÙÒ ÙÒ ÓÒ Ú × Ø Ð ÒÓ Ó ÕÙ ÔÖÓÚ Ð Ð ÒØ Ð Ð ÓØ º Ä ÙÒ ÓÒ × Ö ÒÚÓ ÙÖ ÒØ Ð Ú × Ø ÓÖ ×Ù Ö ÓÖÖ Óº ÆÓØ ÑÓ× ÕÙ Ð ÓÒ ÓÒ ÔÖ Ð Ö ÙÖ× ÓÒ × Ð Ú × Ø Ö ÙÒ ÒÓ Ó ÒÙÐÓº 4.4.6 Recorridos no recursivos Ð ×ØÙ Ó ÐÓ× Ö ÓÖÖ Ó× × ÙÒÓ ÐÓ× Ñ ÓÖ × ÒØÖ Ò Ñ ÒØÓ× Ò Ð ÓÖ ØÑ Ö ÓР׸ ÔÙ × ÓØÖÓ× Ð ÓÖ ØÑÓ× Ó Ò Ô ØÖÓÒ × ÙÒ Ö ÓÖÖ Ó Ó ÓÑ Ò ÓÒ × ÐÐÓ׺ ÓÑ Ò ÑÓ× ÔÓÖ Ð Ú Ö× ÓÒ Ñ × × ÑÔÐ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó
  • 291.
    ´ 4.4. Arboles Binarios 265 ¾ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¾ ¾ template <class Node> inline size_t simple_preOrderStack(Node * node, void (*visitFct)(Node *, int, int)) { if (node == Node::NullPtr) return 0; ArrayStack<Node *, Node::MaxHeight> stack; stack.push(node); Node * p; size_t count = 0; while (not stack.is_empty()) { p = stack.pop(); (*visitFct) (p, stack.size(), count++); if (RLINK(p) != Node::NullPtr) stack.push(RLINK(p)); if (LLINK(p) != Node::NullPtr) stack.push(LLINK(p)); } return count; } Í× × ArrayStack ½¼ º Ð Ô ØÖÓÒ Ø Ö Ø ÚÓ Ð Ð ÓÖ ØÑÓ × × ÑÔÐ Ú × Ø ¸ ÒØÖÓ ÙÞ Ð Ö ÓÐ Ö Ó¸ ÐÙ Ó Ð ÞÕÙ Ö Ó Ý × ÕÙ Ð Ô Ð º ÈÙ ×ØÓ ÕÙ Ð Ö ÓÐ ÞÕÙ Ö Ó Ù ÒØÖÓ Ù Ó ×ÔÙ × Ð Ö Ó¸ Ð ÞÕÙ Ö Ó × Ö Ð ÔÖ Ñ ÖÓ ÜØÖ Ö× Ý Ú × Ø Ö× º Ç × ÖÚ ÑÓ× ÕÙ Ð Ò Ú Ð Ð ÒÓ Ó × ÓÖÖ ×ÔÓÒ ÓÒ Ð Ø Ñ ÒÓ ØÙ Ð Ð Ô Ð ÓÖ Ò¸ × ÙÒ Ð ¬Ò ÓÒ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó¸ Ð Ö ÓÐ ÞÕÙ Ö Ó × Ú × Ø ÒÑ ¹ Ø Ñ ÒØ ×ÔÙ × Ú × Ø Ö Ð ÒÓ Óº ÈÓ ÑÓ׸ ÒØÓÒ ×¸ Ñ ÓÖ Ö Ð Ð ÓÖ ØÑÓ × ¸ Ò ÐÙ Ö Ù Ö Ö Ò Ô Ð Ð Ö ÓÐ Ö Ó¸ Ù Ö ÑÓ× ×Ù Ô Ö Ý ×ÙÑ ÑÓ× ÕÙ ØÓ Ó ÒÓ Ó ÜØÖ Ó Ð Ô Ð Ý Ù Ú × Ø Óº ר Ô ØÖÓÒ ÓÒ Ù Ð Ð ÓÖ ØÑÓ × Ù ÒØ ¾ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¾ ¾ template <class Node> inline size_t preOrderStack(Node * node, void (*visitFct)(Node *, int, int)) { if (node == Node::NullPtr) return 0; ArrayStack<Node *, Node::MaxHeight> stack; Node *p = node; size_t count = 0; while (true) { (*visitFct)(p, stack.size(), count++); if (LLINK(p) != Node::NullPtr) { stack.push(p); // push porque p y RLINK(p) faltan por visitarse p = LLINK(p); // avanzar a la izquierda continue; // ir a visitar ra´z rama izquierda ı } while (true) {
  • 292.
    266 Cap´ ´ ıtulo 4. Arboles if (RLINK(p) != Node::NullPtr) { p = RLINK(p); // avanzar a la derecha break; // ir a visitar ra´z rama derecha ı } if (stack.is_empty()) return count; // fin p = stack.pop(); // sacar para ir a rama derecha } } } Í× × ArrayStack ½¼ º ÙÒ ÖØ Ñ Ò Ö ¸ ØÓ Ó Ö ÓÖÖ Ó Ø Ò Ð Ó ÔÖ ¬ Ó¸ ÔÙ × ØÓ Ó Ö ÓÐ × ØÖ Ú × Ð × Ö × ×Ù× ×Ù Ö ÓР׺ ÈÓÖ Ø ÒØÓ¸ × ÒØÙ Ø Ú Ñ ÒØ ×Ô Ö Ð ÕÙ Ð Ö ÓÖÖ Ó Ò¬ Ó Ø Ò ÙÒ ×ØÖÙ ØÙÖ × Ñ Ð Ö Ð ÔÖ ¬ Ó¸ ÔÙ × Ð ÖÒ ×Ò Ð × Ð ÑÓÑ ÒØÓ Ò ÕÙ × Ú × Ø Ð Ö Þº Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó Ú × Ø Ð Ö Þ ÒØ × ÓÒØ ÒÙ Ö ÔÓÖ Ð Ö Ñ ÞÕÙ Ö ¸ Ñ ÒØÖ × ÕÙ Ð Ò¬ Ó ÐÓ ×ÔÙ × Ú Ò Ö × Ð Ö Ñ ÞÕÙ Ö º Ó ×ØÓ¸ ÔÓ ÑÓ× ÔÖ × ÒØ Ö Ð Ú Ö× ÓÒ ÒÓ Ö ÙÖ× Ú Ð Ö ÓÖÖ Ó Ò¬ Ó ¾ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¾ ¾ template <class Node> inline size_t inOrderStack(Node * node, void (*visitFct)(Node *, int, int)) { if (node == Node::NullPtr) return 0; ArrayStack<Node *, Node::MaxHeight> stack; Node *p = node; size_t count = 0; while (true) { if (LLINK(p) != Node::NullPtr) { stack.push(p); // push porque p y RLINK(p) faltan por visitarse p = LLINK(p); // avanzar a la izquierda continue; // continuar bajando por la rama izquierda } while (true) { (*visitFct)(p, stack.size(), count++); if (RLINK(p) != Node::NullPtr) { p = RLINK(p); // avanzar a la derecha break; // ir a visitar ra´z rama derecha ı } if (stack.is_empty()) return count; p = stack.pop(); // sacar para ir a rama derecha } } }
  • 293.
    ´ 4.4. Arboles Binarios 267 Í× × ArrayStack ½¼ º Ð Ö ÓÖÖ Ó ×Ù¬ Ó × Ñ × ÓÑÔÐ Ó Ý ÓרÓ×Ó ÔÓÖÕÙ Ð × ÑÔ Ð Ö Ý ÕÙ Ú Ö ¬ Ö × × ÔÖÓÚ Ò × Ð ÞÕÙ Ö Ó Ð Ö º ÍÒ Ñ Ò Ö ×Ø Ò Ù Ö ×Ø Ð × ÔÖÓÚ Ò Ò ÓÒ× ×Ø Ò Ñ Ö Ö Ð ÒÓ Ó ÑÔ Ð Ó ÓÒ Ð × ÒØ Ó Ð Ö ÓÖÖ Óº ר ÑÓ Ó¸ ÔÓ ÑÓ× ¬Ò Ö Ð × Ù ÒØ Ô Ð ¾ Ð Ö ÓÒ Ô Ð ×Ù¬ ¾ ≡ typedef Aleph::pair<Node*, char> Postorder_Pair; ArrayStack<Postorder_Pair, Node::MaxHeight> stack; Í× × ArrayStack ½¼ º Ð char Ð Ô Ð Ù Ö ÐÓ× Ú ÐÓÖ × × Ù ÒØ × ¯ ’i’ ÁÒ ÕÙ × ÑÔ ÐÓ ÒØ × × Ò Ö ÔÓÖ Ð Ö Ñ ÞÕÙ Ö º ¯ ’l’ ÁÒ ÕÙ × ÑÔ ÐÓ Ö Ö ×Ó Ð Ö Ñ ÞÕÙ Ö º ¯ ’r’ ÁÒ ÕÙ × ÑÔ ÐÓ Ö Ö ×Ó Ð Ö Ñ Ö º × Ò ×Ø ×Ó ÕÙ × Ú × Ø Ö Ð ÒÓ Óº ÍÒ Ö ÓÖÖ Ó ×Ù¬ Ó × Ó Ò ×ØÓ× ÔÖ Ò Ô Ó× ×Ø ÑÔÐ ÒØ Ó Ò Ð Ð ÓØ Ó Ð ÒÓѹ Ö postOrderStack()º Î × Ð Ù ÒØ Ô Ö Ñ ÝÓÖ × Ø ÐÐ × ×Ó Ö Ð ÒרÖÙÑ ÒØ ÓÒ ×Ø Ð ÓÖ ØÑÓº 4.4.7 C´lculo de la cardinalidad a ÈÖÓ Ð Ñ ÒØ ¸ Ð ÔÐ ÓÒ Ñ × × Ò ÐÐ ÐÓ× Ö ÓÖÖ Ó× × Ð ÙÐ Ö Ð Ö ÒÐ ÙÒ Ö ÓÐ Ò Ö Ó¸ Ð Ù Ð ÔÙ ¬Ò Ö× Ö ÙÖ× Ú Ñ ÒØ ÓÑÓ 0 × T =∅ |T | = ´ º½¼µ | Ä(T )| + 1 + | Ê(T )| × T = ∅ ר ¬Ò ÓÒ × ÖÚ Ö Ø Ñ ÒØ Ð Ð ÓÖ ØÑÓ ¾ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¾ ¾ template <class Node> inline size_t compute_cardinality_rec(Node * node) { if (node == Node::NullPtr) return 0; return (compute_cardinality_rec(LLINK(node)) + 1 + compute_cardinality_rec(RLINK(node))); } 4.4.8 C´lculo de la altura a Ê ÙÖ× Ú Ñ ÒØ ¸ Ð ÐØÙÖ ÙÒ Ö ÓÐ Ò Ö Ó T × ¬Ò ÓÑÓ 0 × T =∅ h(T ) = ´ º½½µ 1 + Ñ Ü(h(Ä(T )), h(Ê(T ))) × T = ∅
  • 294.
    268 Cap´ ´ ıtulo 4. Arboles ר ÑÓ Ó¸ × Ò ÑÓ× ÙÒ Ð ÓÖ ØÑÓ ÓÑÔÐ Ø Ñ ÒØ Ö Ñ Ò × ÒØ Ð ¬Ò ÓÒ ¾ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¾ ¾ template <class Node> inline size_t computeHeightRec(Node * node) { if (node == Node::NullPtr) return 0; const size_t left_height = computeHeightRec(LLINK(node)); const size_t right_height = computeHeightRec(RLINK(node)); return 1 + Aleph::max(left_height, right_height); } ¬Ò × computeHeightRec¸ Ù× Ò ÙÒ ¿ ¼ º 4.4.9 Copia de ´rboles binarios a Ó ÙÒ Ö ÓÐ Ò Ö Ó T ¸ ÓÔ ÖÐÓ ÓÒ× ×Ø Ò Ó Ø Ò Ö ÙÒ Ö ÓÐ Ò Ö Ó T ÙÝ ÓÖÑ Ý ÓÒØ Ò Ó × ÓÖÖ ×ÔÓÒ Ü Ø Ñ ÒØ ÓÒ T º ר Ð ÓÖ ØÑÓ ÔÙ ¬Ò Ö× Ö ÙÖ× Ú ¹ Ñ ÒØ ÓÑÓ × Ù ¾ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¾ ¾ template <class Node> inline Node * copyRec(Node * src_root) throw(std::exception, std::bad_alloc) { if (src_root == Node::NullPtr) return (Node*) Node::NullPtr; Node * tgt_root = new Node(*src_root); LLINK(tgt_root) = copyRec<Node>(static_cast<Node*>(LLINK(src_root))); RLINK(tgt_root) = copyRec<Node>(static_cast<Node*>(RLINK(src_root))); return tgt_root; } ¬Ò × copyRec¸ Ù× Ò ÙÒ ¿ ½ º Ò ×Ø Ó Ó × ÑÔÓÖØ ÒØ ÓÑ ÒØ Ö Ð Ñ Ò Ó Ö ÙÖ× ÚÓ Ø ÔÓ׺ ÆÓØ ¹ ÑÓ× ÕÙ copyRec() ÓÔ Ö ÓÐ × Ò Ö Ó× ÓÒ ÒÓ Ó× Ø ÔÓ Node¸ Ð Ù Ð ÔÓ Ö ÖÚ Ö ÙÒ Ð × ÒÓ Ó Ö ÓÐ Ò Ö Óº ÈÓÖ × Ö ÞÓÒ¸ Ð ÐÐ Ñ Ö ÙÖ¹ × Ú copyRec<Node>(LLINK(src root)) ×Ô ¬ Ö ÜÔÐ Ø Ñ ÒØ Ð Ø ÔÓ Node¸ ÔÙ × × ÒÓ¸ Ò Ð ×Ó ÕÙ × ØÖ Ø ÙÒ Ð × Ö Ú ¸ Ð ÓÑÔ Ð ÓÖ ÒÚÓ Ö copyRec() ÓÒ Ð Ð × × Ð Ù Ð ÓÖÖ ×ÔÓÒ Ò LLINK(tgt root) Ý RLINK(tgt root)º Ë Ð Ð × Node × ×Ø ÒØ Ð Ð × ÕÙ Ö ØÓÖÒ Ò LLINK(tgt root) Ý RLINK(tgt root)¸ ÒØÓÒ × Ó ÙÖÖ Ö ÙÒ ÓÒ­ ØÓ Ø ÔÓ׺ Ä ÓÔ × ÙÒ Ð ÓÖ ØÑÓ ÙÒ Ñ ÒØ Ð Ô Ö ÑÔÐ ÒØ Ö Ð ÓÒרÖÙ ØÓÖ ÓÔ Ý Ð ÓÔ Ö ÓÖ × Ò ÓÒ Ò Ø ÔÓ× ×ØÖ ØÓ× ÕÙ Ñ Ò ÔÙÐ Ò Ö ÓÐ × Ò Ö Ó׺ 4.4.10 Destrucci´n de ´rboles binarios o a Ù ÐÕÙ Ö Ì ÕÙ Ñ Ò ÔÙÐ Ö ÓÐ × Ò Ö Ó× ×Ø Ö Ò Ô ×ØÖÙ Ö ØÓ Ó Ð Ö Óк × Ö¸ ÒÚÓ Ö Ð ×ØÖÙ ØÓÖ Ý Ð Ö Ö Ð Ñ ÑÓÖ Ó ÙÔ ÔÓÖ ÒÓ Ó Ð
  • 295.
    ´ 4.4. Arboles Binarios 269 Ö Óк ×ØÓ × Ö Ð Þ Ð × Ù ÒØ ÓÖÑ ¾ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¾ ¾ template <class Node> inline void destroyRec(Node *& root) { if (root == Node::NullPtr) return; destroyRec((Node*&) LLINK(root)); destroyRec((Node*&) RLINK(root)); delete root; root = (Node*) Node::NullPtr; } ¬Ò × destroyRec¸ Ù× Ò ÙÒ × ¿ ½ Ò ¿¾ º ÉÙ Ø ÔÓ Ö ÓÖÖ Ó Ü ×Ø Ð ÓÖ ØÑÓ Ð Ö Ñ ÒØ ¸ Ð ÓÖÑ × ×Ù¬ Ð Ö Þ × Ð Ö ÐÙ Ó Ð Ö Ö Ð × Ó× Ö Ñ ×º ÇØÖ × Ú Ö ÒØ × Ö ÙÖ× Ú × ×Ø Ð ÓÖ ØÑÓ¸ ÕÙ × Ùר Ò ÐÓ× Ñ × Ö ÓÖÖ Ó׸ ×ÓÒ ÔÓ× Ð × Ý Ð × Ò Ö Ó׺ 4.4.11 Comparaci´n de ´rboles binarios o a Ú × × Ò × Ö Ó ÓÑÔ Ö Ö Ó× Ö ÓÐ × Ò Ö Ó׺ × Ñ ÒØ ¸ Ý Ó× Ö Ø Ö Ó× ÕÙ ÔÖ × ÒØ Ö ÑÓ× ÓÒØ ÒÙ ÓÒº 4.4.11.1 Similaridad Ó× Ó× Ö ÓÐ × Ò Ö Ó× T1 Ý T2¸ × ÕÙ T1 ××ÑÐ Ö T2¸ Ý× ÒÓØ ÓÑÓ T1 = T2 = ∅ ∨ T1 T2 ⇐⇒ ´ º½¾µ T1 = T2 = ∅ ∧ Ä(T1 ) Ä(T2 ) ∧ Ê(T1 ) Ê(T2 ) ר ¬Ò ÓÒ ×Ù Ö Ð × Ù ÒØ Ó Ó Ö ÙÖ× ÚÓ ¾ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¾ ¾¼ template <class Node> inline bool areSimilar(Node * t1, Node * t2) { if (t1 == Node::NullPtr and t2 == Node::NullPtr) return true; if (t1 == Node::NullPtr or t2 == Node::NullPtr) return false; return (areSimilar(LLINK(t1), LLINK(t2)) and areSimilar(RLINK(t1), RLINK(t2))); } 4.4.11.2 Equivalencia Ó× Ó× Ö ÓÐ × Ò Ö Ó× T1 Ý T2¸ × ÕÙ T1 × ÕÙ Ú Ð ÒØ T2¸ Ý× ÒÓØ ÓÑÓ T1 = T2 = ∅ ∨ T1 ≡ T2 ⇐⇒ T1 = T2 = ∅ ∧ à (Ö Þ(T1 )) = à (Ö Þ(T2 )) ∧ Ä(T1 ) ≡ Ä(T2 ) ∧ Ê(T1 ) ≡ Ê(T2 ) ´ º½¿µ
  • 296.
    270 Cap´ ´ ıtulo 4. Arboles × Ö¸ T1 Ý T2 ×ÓÒ × Ñ Ð Ö × Ý ÐÓ× ÓÒØ Ò Ó× ÒÓ Ó ×ÓÒ Ü Ø Ñ ÒØ ÐÓ× Ñ ×ÑÓ׺ Ä ¬Ò ÓÒ ÕÙ Ú Ð Ò ÒÓ× ÖÖÓ Ð × Ù ÒØ ÑÔÐ ÒØ ÓÒ Ö ÙÖ× Ú ¾¼ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¾ ¾¼ template <class Node, class Equal> inline bool areEquivalents(Node * t1, Node * t2) { if (t1 == Node::NullPtr and t2 == Node::NullPtr) return true; if (t1 == Node::NullPtr or t2 == Node::NullPtr) return false; if (not Equal () (KEY(t1), KEY(t2))) return false; return (areEquivalents<Node, Equal>(LLINK(t1), LLINK(t2)) and areEquivalents<Node, Equal>(RLINK(t1), RLINK(t2))); } 4.4.12 Recorrido por niveles Ò ×Ø Ð × Ö ÓÖÖ Ó ÙÒ ÓÐ ×Ö Ö Ø Ñ ÒØ Ð ÓÖ Ò Ò ÕÙ × Ò ÔÖÓ × Ö ÐÓ× ÒÓ Ó× ¾¼ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¾¼ ¾¾ template <class Node> inline void levelOrder(Node * root, void (*visitFct)(Node*, int, bool), const size_t & queue_size) { const size_t two_power = static_cast<size_t>(std::log((float)queue_size)/std::log(2.0) + 1); ArrayQueue<Aleph::pair<Node*, bool> > queue(two_power); queue.put(root); for (int pos = 0; not queue.is_empty(); pos++) { Aleph::pair<Node*, bool> pr = queue.get(); Node *& p = pr.first; (*visitFct) (p, pos, pr.second); if (LLINK(p) != Node::NullPtr) queue.put(Aleph::pair <Node*, bool> (LLINK(p), true)); if (RLINK(p) != Node::NullPtr) queue.put(Aleph::pair <Node*, bool> (RLINK(p), false)); } } Í× × ArrayQueue ½¿ º × ÔÓ× Ð ¸ Ò ØÖ Ñ ÒØÓ ÑÙ Ó Ñ × Ø ÑÔÓ¸ Ñ × ÒÓ Ð ×Ô Ó¸ × Ò Ö ÙÒ Ð Ó¹ Ö ØÑÓ Ö ÙÖ× ÚÓ Ô Ö Ö ÓÖÖ Ö ÔÓÖ Ò Ú Ð ×º ר Ú Ö× ÓÒ × Ð Ò Ö Óº Ä ÙÒ ÓÒ Ú × Ø Ø Ò Ð × Ù ÒØ ÔÖÓØÓØ ÔÓ (*visitFct)(Node* p, int pos, bool is_left) × Ð ÒÓ Ó Ú × Ø Ó¸ pos × Ð ÔÓ× ÓÒ Ð ÒÓ Ó Ú × Ø Ó ÒØÖÓ Ð Ö ÓÖÖ Ó Ý is left p × ÙÒ Ú ÐÓÖ ÐÓ Ó ÙÝÓ Ú ÐÓÖ × true × Ð ÒÓ Ó × ÞÕÙ Ö Óº ÍÒ Ð × ÔÐ ÓÒ × Ø Ô ×
  • 297.
    ´ 4.4. Arboles Binarios 271 Ð Ö ÓÖÖ Ó ÔÓÖ Ò Ú Ð × × Ô Ö Ð Ù Ó Ö ÓР׸ Ò ÙÝÓ ×Ó × ÙØ Ð × Ö × p × Ó ÒÓ ÙÒ Ó ÞÕÙ Ö Óº Ä ÐÓ Ð Ð ÓÖ ØÑÓ × ÔÖÓÚ Ö Ð ÔÖÓÔ Á Ç Ð ÓÐ Ô Ö Ö ÒØ Þ Ö Ð ÓÖ Ò Ú × Ø Ö ÕÙ Ö Óº ר Ð ÖÓ ÕÙ Ð ÔÖ Ñ Ö ÒÓ Ó Ú × Ø Ö × Ð Ö Þ¸ ÔÓÖ ÐÓ ÕÙ Ð Ñ Ø ÑÓ× Ò Ð ÓÐ Ý ÓÑ ÒÞ ÑÓ׺ Ú Þ ÕÙ × Ú × Ø ÙÒ ÒÓ Ó¸ ØÓ Ó× ×Ù× ÓÑÔ Ò ÖÓ× Ò Ú Ð Ó Ò Ö ÓÒ Ò × Ö ÐÓ× × Ù ÒØ × ÜØÖ Ö Ð ÓÐ º ×ØÓ × Ö ÒØ Þ ÔÓÖÕÙ Ú Þ ÕÙ Ú × Ø ÑÓ× ÙÒ ÒÓ Ó ÒØÖÓ Ù ÑÓ× Ò Ð ÓÐ ×Ù Ó ÞÕÙ Ö Ó Ý ÐÙ Ó ×Ù Ó Ö Óº רÓ× Ó× Ú Ò ×Ø Ö Ò Ð ÓÐ ×ÔÙ × ÐÓ× Ò ×ØÖÓ× ×Ù Ò Ú Ð ÒØ Ö ÓÖ Ý ×ÔÙ × ×Ù× ÓÑÔ Ò ÖÓ× Ò Ú Ð ÕÙ ×Ø Ò Ð Ð Ó ÞÕÙ Ö Óº Ò Ð ¬ ÙÖ º½ ¸ ÐÓ× ÔÖÓÜ ÑÓ× ÒÓ Ó× Ò Ð ÓÐ ×ÓÒ ÐÓ× ÖÑ ÒÓ× Ö Ó× Ð ØÙ Ð ×ØÓ× ÒÓ Ó× Ù ÖÓÒ ÒØÖÓ Ù Ó× Ù Ò Ó × ×Ø Ò Ð Ò Ú Ð ÙÒÓº ×ÔÙ × Ú Ò Ò ÐÓ× ÒÓ Ó× Ð Ò Ú Ð ØÖ × ÕÙ Ù ÖÓÒ ÒØÖÓ Ù Ó× Ù Ò Ó × ÔÖÓ × ÖÓÒ ÐÓ× ÖÑ ÒÓ× ÞÕÙ Ö Ó× Ð ÒÓ Ó ØÙ к ØÙ Ð Ö ÒØ ÌÖ × ÖÓ ÙÖ º½ ר Ó Ð ÓÐ Ù Ò Ó × ÔÖÓ × Ð ÒÓ Ó Ò Ó ÓÒ ­ ר Ö ÓÖÖ Ó × Ð Ñ × ÓרÓ×Ó ÐÓ× Ù ØÖÓ¸ ÔÙ × × ÔÙ Ö ÕÙ Ö Ö ÐÑ Ò Ö ÑÙ × ÑÓ× ÒÓ Ó× Ò Ð ÓÐ º Ë Ð × Ó × Ð Ö ÓÐ Ø Ò Ò ×Ø Ö Ò Ð Ñ ×ÑÓ Ò Ú Ð¸ ÒØÓÒ ×¸ ÔÓÖ Ò Ú Ð ÕÙ × × Ò ¸ × Ö ÕÙ Ö Ö ÐÑ Ò Ö Ð Ó Ð Ð ÒØ ÒÓ Ó× ×Ø ÐÐ Ö Ð Ò Ú Ð ÓÒ × Ò Ù ÒØÖ Ò Ð × Ó ×º ËÙÔÓÒ ÑÓ× ÕÙ Ð ÒØ ÒÓ Ó× Ò Ú Ð × ÔÓØ Ò Ü Ø Ó× Ó × ¸ Ò Ú Ð Ð Ö ÓÐ ×Ø ÐÐ ÒÓº ÒØÓÒ ×¸ ×ÙÑ Ò Ó ÐØÙÖ ÓÒÓ h¸ ÔÓ ÑÓ× ÜÔÖ × Ö Ð ÒØ ÒÓ Ó× n ÓÑÓ h−1 2iº × Ö¸ Ø Ò Ö ÑÓ× 2h−1 ÒÓ Ó× ÐÑ Ò Ó× Ò Ð i=0 ÓÐ Ù Ò Ó ÒÓ× ØÓÕÙ ÔÖÓ × Ö Ð ÙÐØ ÑÓ Ò Ú Ðº ÈÙ ×ØÓ ÕÙ Ð ÓÖÑ ÙÒ Ö ÓÐ ÔÙ × Ö ×Ø ÒØ Ö ØÖ Ö ¸ Ð ÔÖ Ñ Ø Ú levelOrder() Ö ÓÑÓ Ô Ö Ñ ØÖÓ Ð Ø Ñ ÒÓ Ñ Ü ÑÓ Ð ÓÐ Ý Ð Ð Ð ÒØ Ð ×Ø Ñ Ö ÙÒ Ø Ñ ÒÓ Ù Ó × ÙÒ ×Ù ÔÐ ÓÒº 4.4.13 Construcci´n de ´rboles binarios a partir de recorridos o a ÓÒ× Ö ÑÓ× Ð ÔÖÓ Ð Ñ ÐÑ Ò Ö Ò ÙÒ × Ù Ò ÙÒ Ö ÓÐ Ö ÔÖ × ÒØ Ó Ò Ñ ÑÓ¹ Ö º ר ÔÖÓ Ð Ñ × ÐØÓ ÒØ Ö × Ò × ØÙ ÓÒ × ÓÒ Ö ÕÙ Ö ÑÓ× Ù Ö Ö Ð Ö ÓÐ Ò ÙÒ Ö ÚÓ Ó ØÖ Ò×Ñ Ø ÖÐÓ Ò ÙÒ Ñ Ò× º Ù ÐÕÙ Ö Ø Ò ÕÙ × Ù Ò Ð ÙÒ Ö ÓÐ ´ÐÓ ÐÑ Ò Ò ÙÒ × Ù Ò µ ר × Ò ×Ù× Ö ÓÖÖ Ó׺ Ò Ü º º¾ ´Ô Ò ¾ ¿µ ×ØÙ ÑÓ× Ð ÙÒ × Ø Ò × ÕÙ Ô ÖÑ Ø Ò Ö ÓÒרÖÙ Ö ÙÒ Ö ÓÐ Ò Ö Ó Ô ÖØ Ö ÙÒÓ ×Ù× Ö ÓÖÖ Ó׺ ÆÓ× ×Ø ÓÒ ÙÒ ×ÓÐÓ Ö ÓÖÖ Ó ÔÓÖÕÙ ÓÒÓ ÑÓ× Ð ¬Ò Ð Ö Óк Ë ×Ø ÓÒÓ Ñ ÒØÓ ÒÓ × × ÕÙ Ð ¸ Ó × ÕÙ Ö ÑÓ× × Ù Ò Ð Þ Ö Ñ Ò Ö Ò Ö Ð¸ ÒØÓÒ × Ý Ó× Ñ Ò Ö × × ÐÚ Ö Ð Ö Óк ÆÓØ × ÕÙ × ÙÒ Ð ÕÙ Ú Ð Ò ÒØÖ Ö ÓÐ × Ý Ö ÓÐ × Ò Ö Ó× × ×Ù¬ ÒØ ÓÒ ×ØÙ Ö ÐÓ× Ò Ö Ó׺
  • 298.
    272 Cap´ ´ ıtulo 4. Arboles ÍÒ ÓÒ× ×Ø Ð Ð ÙÐ Ö ×Ù × Ù Ò Ó Ó Ý ÐÙ Ó ÐÑ Ò Ö Ð × Ð Ú × Ò ÔÖ ¬ Ó Ø Ò ÕÙ × Ö Ú Ð Ö Ý ×ØÙ Ö Ò Ü º º¼º ´Ô Ò ¿¾½µº Ä × ÙÒ ÓÒ× ×Ø Ò Ù Ö Ö Ó× Ö ÓÖÖ Ó× Ù Ð ×ÕÙ Ö Ý Ô ÖØ Ö ÐÐÓ× Ö ÓÒרÖÙ Ö Ð Ö ÓÐ ÓÖ Ò Ðº ÈÙ ×ØÓ ÕÙ Ý ÑÓ× ×ØÙ Ó ÐÓ× Ö ÓÖÖ Ó׸ ÒÓ× × Ö × Ò ÐÐÓ Ú ×ÐÙÑ Ö Ö ÖÙØ Ò × ÕÙ ØÓÑ Ò ÙÒ Ö ÓÐ Ý ÐÓ × Ù Ò Ð Òº ÄÓ ÕÙ ÕÙ Þ ÒÓ × Ò Ø Ò Ð × Ð ÒÚ Ö× ÓÒ × Ö¸ Ö ÓÒרÖÙ Ö Ð Ö ÓÐ Ô ÖØ Ö ×Ù× × Ù Ò ×º Ä × Ù ÒØ ÖÙØ Ò Ö ÓÒרÖÙÝ ÙÒ Ö ÓÐ Ò Ö Ó Ô ÖØ Ö ×Ù× Ö ÓÖÖ Ó× ÔÖ ¬ Ó Ò¬ Ó ¾¾ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¾¼ ¾¿ template <template <class> class Node, typename Key> inline Node<Key> * build_tree(DynArray<Key> & preorder, const int & l_p, const int & r_p, DynArray<Key> & inorder, const int & l_i, const int & r_i) { if (l_p > r_p) // ¿est´ vac´o el recorrido? a ı return Node <Key> ::NullPtr; Node<Key> * root = new Node <Key> (preorder[l_p]); // crear la ra´z ı if (r_p == l_p) return root; // recorrido de longitud 1 Ð ÙÐ Ò Ð ÔÓ× ÓÒ ÔÖ ÓÖ Ö Ð Ô Ò ÒÓÖ Ö ¾ ¿ LLINK(root) = build_tree <Node, Key> (preorder, l_p + 1, l_p + i, inorder, l_i, l_i + (i - 1)); RLINK(root) = build_tree <Node, Key> (preorder, l_p + i + 1, r_p, inorder, l_i + i + 1, r_i); return root; } Í× × DynArray ¾º Ä ÓÒרÖÙ ÓÒ Ð Ö ÓÐ ÔÙ Ô ØÓÖ Þ Ö× Ð × Ù ÒØ Ñ Ò Ö l_p r_p preorder[] k L_p R_p inorder[] L_i k R_i l_i i r_i build_tree(preorder,l_p+1,lp+i,inorder,l_i,l_i+(i-1)); build_tree(preorder,l_p+i+1,r_p,inorder,l_i+i+1,r_i); k preorder[] × ÙÒ ÖÖ ÐÓ ÕÙ ÓÒØ Ò Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó ÒØÖ ÐÓ× Ò × l p Ý r pº Ð Ñ ×ÑÓ ÑÓ Ó¸ inorder[] × ÙÒ ÖÖ ÐÓ ÕÙ ÓÒØ Ò Ð Ö ÓÖÖ Ó Ò¬ Ó ÒØÖ ÐÓ× Ò × l i Ý r iº Ä ÖÙØ Ò Ö ØÓÖÒ Ð Ö Þ Ð ÒÙ ÚÓ Ö ÓÐ Ò Ö Óº Ä ÐÓ Ð Ð ÓÖ ØÑÓ × × ÑÔÐ º Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ ÙÒ Ö ÓÖÖ Ó ÔÖ ¬ Ó × Ð Ö Þ Ð Ö Óи Ð Ù Ð Ù× ÑÓ× Ò Ð Ö ÓÖÖ Ó Ò¬ Ó Ý Ó Ø Ò ÑÓ× Ð ×ÔÐ Þ Ñ ÒØÓ iº Ð Ò i Ú Ð Ö ÓÖÖ Ó Ò¬ Ó Ò Ó× Ô ÖØ × ÐÓ× Ð Ñ ÒØÓ× Ð ÞÕÙ Ö ÕÙ ×ÓÒ l i .. i - 1 Ý ÕÙ Ô ÖØ Ò Ò Ð Ö Ñ ÞÕÙ Ö ¸ Ñ ÒØÖ × ÕÙ ÐÓ× Ð Ñ ÒØÓ× Ð Ö ×ÓÒ i + 1 .. r i Ý ÕÙ Ô ÖØ Ò Ò Ð Ö Ñ Ö º Ñ Ó× Ø ÔÓ× Ö ÓÖÖ Ó ÒÓ Ú ÒÞ Ò Úר ÖÐ Ö Ñ Ö ×Ø Ø ÒØÓ ÒÓ × Ý Ú × Ø Ó Ð ØÓØ Ð Ð ×Ù Ö ÓÐ ÞÕÙ Ö Ó
  • 299.
    ´ 4.4. Arboles Binarios 273 Ý Ð Ö Þº ÈÓÖ Ø ÒØÓ¸ Ù×ØÓ ÒØ × ÓÑ ÒÞ Ö Ú × Ø Ö Ð Ö Ñ Ö ¸ Ñ Ó× Ö ÓÖÖ Ó× Ò Ú × Ø Ó Ð Ñ ×Ñ ÒØ ÒÓ Ó× ´Ð Ö Ñ ÞÕÙ Ö Ý Ð Ö Þµº ×ØÓ Ú Ò ÕÙ ÐÓ× Ö ÓÖÖ Ó× ÔÖ ¬ Ó Ò¬ Ó Ð Ö Ñ Ö ×Ø Ò ÓÒØ Ò Ó× Ò Ñ Ó× ÖÖ ÐÓ× ÒØÖ l p + i + 1 Ý r pº Ä Ø ÓÒ Ö ÓÐ Ú Ó × Ö Ð Þ Ù Ò Ó ÐÓ× Ö ÓÖÖ Ó× ×ÓÒ Ú Ó× × Ö¸ Ù Ò Ó ÐÓ× Ò × ÐÓ× Ö ÓÖÖ Ó× × ÖÙÞ Òº Ä Ô ÖØ Ñ × Ð × Ù× Ö Ð ÔÓ× ÓÒ Ö Ð Ø Ú Ð Ö Þ ÒØÖÓ Ð Ö ÓÖÖ Ó Ò¬ Óº ×ØÓ ÐÓ Ö Ð Þ ÑÓ× Ù Ó× Ñ ÒØ Ñ ÒØ Ò×Ô ÓÒ × Ù Ò Ð ¾¿ Ð ÙÐ Ò Ð ÔÓ× ÓÒ ÔÖ ÓÖ Ö Ð Ô Ò ÒÓÖ Ö ¾ ¿ ≡ ´¾ ¾µ int i = 0; for (int j = l_i; j <= r_i; ++j) if (inorder[j] == preorder[l_p]) { i = j - l_i; break; } 4.4.14 Conjunto de nodos en un nivel Ò Ð ÙÒ × × ØÙ ÓÒ × × Ò × Ö Ó ÓÒÓ Ö Ù Ð × ×ÓÒ ÐÓ× ÒÓ Ó× ÙÒ Ö ÓÐ ÕÙ × Ò¹ Ù ÒØÖ Ò Ò ÙÒ Ø ÖÑ Ò Ó Ò Ú Ð i º ÔÓÖ ÑÔÐÓ¸ Ù Ò Ó × Ù Ò Ö ÓР׸ ØÓ× Ùר Ö Ð × ÔÓ× ÓÒ × ÐÓ× ÒÓ Ó× Ò ÙÒ Ò Ú Ð Ø ÖÑ Ò Óº Ä × Ù ÒØ ÖÙØ Ò Ö ÓÖÖ Ö ÙÖ× Ú Ñ ÒØ Ð Ö ÓÐ ÓÒ Ö Þ root Ý Ù Ö Ò Ð Ð ×Ø level list ÐÓ× ÒÓ Ó× ÕÙ × Ò Ù ÒØÖ Ò Ò Ð Ò Ú Ð levelº Ð Ô Ö Ñ ØÖÓ current level ÒÓØ Ð Ò Ú Ð Ð ÒÓ Ó ÕÙ × ×Ø Ú × Ø Ò Ó ¾¿ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¾¾ ¾ template <class Node> inline static void __compute_nodes_in_level(Node * root, const int & level, // nivel deseado const int & current_level, // nivel actual DynDlist<Node*> & level_list) { if (root == Node::NullPtr) return; if (current_level == level) { level_list.append(root); return; // no vale la pena descender m´s a } __compute_nodes_in_level(LLINK(root), level, current_level + 1, level_list); __compute_nodes_in_level(RLINK(root), level, current_level + 1, level_list); } Í× × DynDlist ¿ º Ð Ö ÓÐ × Ö ÓÖÖ Ò ÔÖ ¬ Ó Ý ÐÓ× ÒÓ Ó× × Ù Ö Ò Ò Ð Ð ×Ø ÔÓÖ Ò Ú Ð ÞÕÙ Ö Ö º ÖÒ Ð Ö ÓÖÖ Ó ÔÓÖ Ò Ú Ð ×¸ ÒÓ × Ò × Ö Ó Ù× Ö ÙÒ ÓÐ º ÕÙ Ú Ð Ð ÔÖÓ ÙÒ Ö ÙÖ× Ú º
  • 300.
    274 Cap´ ´ ıtulo 4. Arboles Ä ÖÙØ Ò ÒØ Ö ÓÖ ÐÐ Ñ Ö× ÔÓÖ Ð ÕÙ ÙÒ Ö ÒØ Ö Þ¸ Р٠и × ×Ô ¬ Ð × Ù ÒØ ÓÖÑ ¾ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¾¿ ¾ template <class Node> inline void compute_nodes_in_level(Node * root, const int & level, DynDlist<Node*>& list) { __compute_nodes_in_level(root, level, 0, list); } Í× × DynDlist ¿ º 4.4.15 Hilado de ´rboles binarios a × Ð Ù Ö ÕÙ ÙÒ Ö ÓÐ Ò Ö Ó n ÒÓ Ó× ÓÒ×ÙÑ 2n ÔÙÒØ ÓÖ ×º È ÖÓ ÕÙ Þ ÒÓ × Ø Ò Ð ÔÖ Ò Ö ÕÙ Ô Ö Ù ÐÕÙ Ö Ö ÓÐ Ò Ö Ó Ð ÒØ ØÓØ Ð ÔÙÒ¹ Ø ÖÓ× ÓÒ Ð Ú ÐÓÖ NULL × ÑÔÖ × Ñ ÝÓÖ ÕÙ Ð ÒØ ÔÙÒØ ÖÓ× × Ò Ó׺ Å × Ð ÒØ ´ÔÖÓÔÓ× ÓÒ Ü º¾ ´Ô Ò ¾ µµ ÑÓ×ØÖ Ö ÑÓ× Ð Ú Ö ×Ø ¬ÖÑ ÓÒº ×ÙÑ Ò Ó Ú Ö Þ Ð ¬ÖÑ ÓÒ ÒØ Ö ÓÖ¸ Ð ÙÒÓ× Ò Ù ×Ø ÓÒ Ó Ð ×Ô Ö Ó ×Ô Ó Ù× Ó ÔÓÖ ÐÓ× ÔÙÒØ ÖÓ× ÒÙÐÓ׺ Ø ÒÓÖ Ð ÓÖÖ ¸ ÔÙ Ò ÓÒ× Ö Ö× Ð × × ¹ Ù ÒØ × Ô Ö×Ô Ø Ú × ½º ÈÓ ÑÓ× Ø Ò Ö ØÖ × Ø ÔÓ× ÒÓ Ó× ÓÑÔÐ ØÓ¸ Ò ÓÑÔÐ ØÓ Ý Ó º ÒÓ Ó Ó Ù¹ Ô Ö Ð ×Ô Ó Ü ØÓ × ÙÒ Ð Ø ÔÓ ÒÓ Óº ÈÓÖ ×ÙÔÙ ×ØÓ¸ ÒÓ Ó Ø Ò Ö ÕÙ Ø Ò Ö ÙÒ ÑÔÓ ÓÒ Ð ÕÙ Ò ÕÙ ×Ù Ø ÔÓº ר ×ÓÐÙ ÓÒ × ÙÒ ÐØ ÖÒ Ø Ú ÑÔÓÖØ ÒØ Ý Ô Ð Ð × Ý Ö ÕÙ Ö Ñ ÒØÓ× Ö Ø Ó× ×Ô Óº ÐÐ ÓÐ ¸ × Ò Ñ Ö Ó¸ ר Ø ×ÑÓ Ò Ð × ÒØ Ó ÕÙ × Ð Ö ÓÐ Ñ Ò Ñ Ñ ÒØ ¸ ÒØÓÒ × Ð Ø ÔÓ ÒÓ Ó ÔÙ Ñ Öº Ì Ñ Ò Ð × ÓÔ Ö ¹ ÓÒ × ×Ó Ö ×ØÓ× Ö ÓÐ × ×ÓÒ Ñ × ÓÑÔÐ × ÔÓÖÕÙ ×Ø × Ò ×Ø Ò Ù Ö ÐÓ× Ø ÔÓ× ÒÓ Ó׺ ¾º ÍØ Ð Þ Ö ÐÓ× ÔÙÒØ ÓÖ × ÒÙÐÓ× Ô Ö ÐÑ Ò Ö Ò ÓÖÑ ÓÒ ÓÒ Ðº ÕÙ ×ÙÖ Ð ÔÖ ÙÒØ Ù Ð Ò ÓÖÑ ÓÒ Ô Ö ÕÙ È ÖÐ × Ý Ì ÓÖÒØÓÒ ½ × Ù Ö ÖÓÒ ÙÒ Ù×Ó Ò Ò Ó×Ó ÐÓ× ÔÙÒØ ÖÓ× ÒÙÐÓ׺ Ð Ñ ØÓ Ó ÓÒ× ×Ø Ò Ö ÑÔÐ Þ Ö ÔÙÒØ ÖÓ× ÒÙÐÓ× ÔÓÖ ÐÓ× ÕÙ Ú Ý Ò ÓØÖ × Ô ÖØ × Ð Ö Óк Ä × Ð Ø Ö Ð Ö ÓÖÖ Ó Ý¸ ÓÒ× Ù ÒØ Ñ ÒØ ¸ ÐÓ× Ð ÓÖ ØÑÓ׺ Ó ÙÒ ÒÓ Ó p¸ Ò ÓÑÔÐ ØÓ Ù Ó ¸ Ð ÔÖ Ò Ô Ó ×Ø Ó ÔÓÖ Ð × Ó× Ö Ð × × Ù ÒØ × ¯ LLINK(p) ÔÙÒØ Ð ÒÓ Ó ÔÖ ×ÓÖ Ò¬ Óº ¯ RLINK(p) ÔÙÒØ Ð ÒÓ Ó ×Ù ×ÓÖ Ò¬ Óº Ä ¬ ÙÖ º½ ÐÙ×ØÖ Ð Ð Ó ÙÒ Ö Óк ÄÓ× ÐÓ× ×ÓÒ Ö ÔÖ × ÒØ Ó× Ñ ÒØ Ð Ò × ÓÖØ ׺ ÓÖ ×ØÙ ÑÓ× ÓÑÓ Ö Ð Þ Ö× Ð Ö ÓÖÖ Ó Ò¬ Óº È Ö ÐÐÓ Ú ÑÓ× ÙÒ Ð Ó¹ Ö ØÑÓ ÕÙ Ù×ÕÙ Ð ×Ù ×ÓÖ Ò¬ Óº Algoritmo 4.7 (B´ squeda del sucesor en un arbol hilado) u ´ Ä ÒØÖ Ð Ð Ó¹ Ö ØÑÓ × ÙÒ ÔÙÒØ ÓÖ p ÙÒ ÒÓ Óº Ä × Ð × Ð ×Ù ×ÓÖ Ò¬ Ó pº ½º Ë RLINK(p) × ÙÒ ÐÓ =⇒ Ö ØÓÖÒ RLINK(p)º
  • 301.
    ´ 4.4. Arboles Binarios 275 T º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º D ºº ºº ºº ºº ºº º Z º º ºº ººº º º º º ºº º º º º º º º º ºº º º º ºº º ºº ººº º º º º º ºº ºº º º º º º º ºº ºº º º º º º º ºº ºº º º º º º ºº ºº º º º º C º º º º º º º º º º º º º º º º º R ºº º º ºº ºº ºº ºº º X º º º º º ºº º º º º º º º º ºº ºº º º º º º º º º º º º º ºº ºº º º º º º º º º º º º º º º º º º º º º º º ºº ºº º º º º º º º º º º º º º º º º º º º º ºº ºº º º º º º º º ºº º º º º º º º º º º º º º º º º ºº º ºº º º º º º º º º º º º º º º º º º º º º º º º º ºº º ºº º º º º º º º º º º ºº ººº ºº º º º º º º ºº º ºº º ºº ºº º º º º º º º º º º B º º º ºº º º º º E º º ºº º º º ºº ººº º V º º º º Y º º º º º º º º º º º º º º ºº ºº º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º º º º º º ºº º º º º º º º º ºº º º º º º º º º º º º ºº º º º º º º º º º º º º º º ºº º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º ºº º º º º º º º ºº º º º º º º º º º ºº ºº º º º º º º ºº º º º º º º º ºº º º A º º º º º º º º ºº º º º º º ººº ºº ºº º º º º º º º N º º º º º º º º º º º º º º U º º º º º º º º º º º º º º º W º º º º º º º ºº ºº º º º º ººº ººº ºº º º º ºº º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º º º º º º º º ºº º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º º º º º º º º ºº º º º º º º º º º º ºº º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ºº ºº º º º º º º º º º º º º º º º º º º º º ºº ººº º ºº ºº ºº º º º º º ºº º º º º º º º I º º º º º º º º º ºº º P º º º º º º º ºº º º º ºº º ºº º º º º º º º ºº º ºº º º º º ºººº º º ºº ºº º º º º ºº ºº º º º º º ººº ººº ºº º º º º º º ºº ºº º º º º º º º º º º º º º º º º º º º º º º ºº ºº ºº º ºº º º º º º º º º º º ºº º º º º º º º º º º ºº ºº º º º º º º º º º º ºº ºº º º º º º º º º º º º º º º º º º º º º º ºº ºº º º º º º º º º º H º º º º º º º º º º º º º K ºº ºº ºº ºº º ºº ºº º O º º º º º º º º º º º º º Q º º º º º º º º º º º º º ºº º º º º ºº º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º º º º º º º º º º º ºº º º º º º º º º º º º º º ºº º ºº º º º ºº º º º º º º º º º º º º º º ºº º º º º º º º º º º º º º º º º º º º º ºº ºº º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ºº ºº ºº º ºº º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º ºº ºº ºº º º ºº º º º º º º º º º º º º º º º º º ºº º º º º º º º º º º º º ººº ºº º º º º º ºº ºº ºº º º º º º º º º º ºº ºº ºº ººº ºº º º º º º º º º º º F º º º º º ºº ºº º º º º º º º º J º º º º º º º º º º º º º º º M º º º ººº º ºº º ºº º ºº º ºº ºº º ºº º º º º º º º º ºº º º º º º º º º º º º º º º º º º º º º º ºº ººº º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º ºº º º º º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º º ºº º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º ºº ºº º º º º º º º º º º º º º º º º º º º º ºº º º º º ºº º º º º º ºº º º º º º ºº º º º º º º º º º º º º º º º º º º º º G º º º º º º º º º º º ººº ººº º ºº ºº º º º º º º º º L º º º º º º º º º º º º º º º ºº º ººº ººº º º º ººº ºº º ºº º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º º º º º º º º º º º º ºº º º º º ºº º º º º º º º º º º º º ºº º º º º º ºº º º º º º º º º º º º º º º º º ºº ºº º º º º º º º º ºº ºº ºº º º º º º º º º ºº ºº ºº ºº ºººº º º ºº ºº º º ººº ººº ºº º ÙÖ º½ ÑÔÐÓ Ö ÓÐ Ð Ó ¾º Ë RLINK(p) × Ð Ú ÐÓÖ ÒØ Ò Ð ¬Ò Ö ÓÖÖ Ó =⇒ Ö ØÓÖÒ ÆÍÄĺ ¿º p = RLINK(p) º Ê Ô Ø Ñ ÒØÖ × ÕÙ LLINK(p) ÒÓ × ÙÒ ÐÓ ¯ p = LLINK(p) º Ê ØÓÖÒ p Ä Ú ÒØ Ð Ð Ó ×Ð Ð Ô Ö Ö ÓÖÖ Ö Ð Ö Óк Ð Ö ÓÖÖ Ó Ò¬ Ó Ö ÕÙ Ö Ø ÖÑ Ò Ö Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ Ð Ö ÓÖÖ Ó¸ ÐÙ Ó Ò ÐÐ Ñ Ö ×Ù × Ú Ñ ÒØ Ð Ð ÓÖ ØÑÓ º ר ÐÐ Ö Ð ÙÐØ ÑÓ Ð Ñ ÒØÓº Ð Ð Ó Ö ÕÙ Ö ×Ø Ò Ù Ö × ÙÒ ÔÙÒØ ÓÖ × ÙÒ Ó Ó ÙÒ ÐÓº ÙÒÕÙ ÙÒ Ø ÔÓÖ ÔÙÒØ ÖÓ × ×Ù¬ ÒØ Ô Ö ×Ô ¬ Ö Ø Ð ×Ø Ò ÓÒ¸ ÐÓ× × ×Ø Ñ × Ñ ÑÓÖ ÐÓ× ÓÑÔÙØ ÓÖ × ÑÓ ÖÒÓ× ØÖ Ò ÔÓÖ ÝØ ׺ Ë Ö ÕÙ Ö Ð Ñ ÒÓ× ÙÒ ÝØ Ô Ö ÙØ Ð Þ Ö ÐÓ× Ó× Ø× Ò × Ö Ó׺ Ä × Ñ ÕÙ Ò × ÁË ÔÙÖ × ÒÓ Ö ×ØÖ Ò Ò Ð Ø Ñ ÒÓ ÙÒ ÐÓÕÙ Ñ ÑÓÖ × ÔÓ× Ð ¸ Ô٠׸ Ô ÖØ Ö Ð ÝØ ÜØÖ º Ò Ñ ÕÙ Ò × ÊÁË ¸ ÐÓ× Ö ×ØÖÓ× Ý ×Ù× ÑÔÓ× Ò ×Ø Ö Ð Ò Ó× Ð Ø Ñ ÒÓ Ð Ô Ð Ö Ñ ÑÓÖ º Ò ÓÒ× Ù Ò ¸ Ò Ö ÙÒ ÝØ ÜØÖ ÔÙ × Ò ¬ Ö ÙÒ Ò Ö Ñ ÒØÓ Ð Ø Ñ ÒÓ Ð Ö ×ØÖÓ Ñ ÝÓÖ ÙÒ ÝØ ¸ ÔÙ × Ö ÕÙ Ð Ò Ö Ð ÝØ ÜØÖ ÙÒ Ö ÓÒ ÕÙ × Ù Ð Ø Ñ ÒÓ Ð ÔÐ Öº ÍÒ Ø Ò Ô Ö Ö ÓÒÓ Ö Ó× ÐÓ× ÓÒ× ×Ø Ò ØÙ Ö ÙÒ ØÖ Ò× ÓÖÑ ÓÒ¸ ÒÚ Ö× Ð ¸ ÕÙ ÐÐ Ú Ð Ú ÐÓÖ ÙÒ ÔÙÒØ ÓÖ ÙÒ Ú ÐÓÖ ÓÑÔÖ Ò Ó ÒØÖÓ Ð × ÞÓÒ × ÜØ ÖÒ × Ð Ñ Ò ÓÖ Ñ ÑÓÖ º Ù Ò Ó × Ü Ñ Ò ÙÒ ÔÙÒØ ÓÖ¸ × Ú Ö ¬ × ×Ø × Ò Ù ÒØÖ ÒØÖÓ Ð Ö Ò Ó Ú Ð Ó × Ø Ð × Ð ×Ó¸ ÒØÓÒ × × ØÖ Ø ÙÒ ÔÙÒØ ÓÖ ÐÓ ÓÒØÖ Ö Ó¸ × ØÖ Ø ÙÒ ÐÓ Ý¸ ÔÓÖ ×ÙÔÙ ×ØÓ¸ Ö Ð Þ Ö× Ð ØÖ Ò× ÓÖÑ ÓÒ ÒÚ Ö×
  • 302.
    276 Cap´ ´ ıtulo 4. Arboles ÒØ × Ö Ö Ò Ö Ð ÔÙÒØ ÓÖº ÍÒ Ó ×Ø ÙÐÓ ×Ø Ø Ò × Ð ÔÓÖØ Ð ÒØÖ Ö ÒØ × ÔÐ Ø ÓÖÑ × Ö Û Ö ¸ × ×Ø Ñ ÓÔ Ö Ø ÚÓ¸ ÓÑÔ Ð ÓÖ Ý Ð Ò Ù º Ä ØÖ Ò× ÓÖÑ ÓÒ ØÖ ÓÒ Ð ÓÒ× ×Ø Ò Ö ×Ø ÖÐ ÙÒ Ö ÓÒ ÙÒ Ú ÐÓÖ ÕÙ × ÙÖ ÕÙ Ð Ö ×Ø ר Ö ÒØÖÓ Ð ÞÓÒ ØÓ× Ó Ó Ó Ó¸ ÔÓÖ × ÓÖ Ñ ÒØÓ¸ ÒØÖÓ Ð ÞÓÒ Ð Ô Ð º Ä Ö ×Ø × ÔÓ× Ð ×ÓÐÓ × Ð Ø Ñ ÒÓ Ð ÞÓÒ Ñ ÑÓÖ × Ñ ÒÓÖ Ó Ù Ð Ð ×ÙÑ Ð × ÓØÖ × ÞÓÒ ×º Ú ×¸ ×ØÓ ÒÓ × ÔÓ× Ð º ÆÓ Ó Ö G S X B H A Z ÙÖ º½ Ê ÔÖ × ÒØ ÓÒ Ò Ñ ÑÓÖ ÙÒ Ö ÓÐ Ò Ö Ó Ð Ó Ð ÙÒ × ÒØ Ù × Ñ ÕÙ Ò × ÁË Ø Ò Ò Ð Ø Ñ × × Ò ¬ Ø ÚÓ Ö × ÖÚ Ó Ô Ö Ð × ÒÓº ÓÑÓ ÐÓ× ÔÙÒØ ÓÖ × ÙØ Ð Þ Ò ÒÒ × Ö Ñ ÒØ ר × ÒÓ¸ ÔÙ × Ð × Ö ÓÒ × Ò Ø Ú × ÒÓ Ø Ò Ò × ÒØ Ó¸ ר Ø ÔÓ ÙØ Ð Þ Ö× Ô Ö ÒÓØ Ö × Ð ÔÙÒØ ÓÖ Ö Ó ÒÓ ÙÒ ÐÓº Ä × Ñ ÕÙ Ò × ÑÓ ÖÒ × ×ÓÒ ÊÁË ¸ Ý Ð × ÔÓ × ÁË ÕÙ Ü ×Ø Ò Ø Ò Ò ÑÙ × ÙÒ ÓÒ Ð × ÊÁË º ÀÓÝ Ò ¸ Ð Ð Ò ÓÒ Ð × Ö ÓÒ × Ñ ÑÓÖ × ÙÒ Ð × ÙÒ ÓÒ Ð × ÓÑÙÒ × ÒØÖ ÐÓ× Ó× Ø ÔÓ× Ñ ÕÙ Ò º Ä Ð Ò ÓÒ ÑÔÐ ÕÙ Ð × Ö ÓÒ × Ñ ÑÓÖ ¸ ¹ÐÓ× Ú ÐÓÖ × ÐÓ× ÔÙÒØ ÓÖ ×¹ × ÑÔÖ ×Ø Ò Ð Ò Ó× Ð Ø Ñ ÒÓ Ð ÔÐ Ö Ñ ÑÓÖ º Ò Ð Ñ ÝÓÖ ÖÕÙ Ø ØÙÖ × ÑÓ ÖÒ ×¸ Ð ÐÓÒ ØÙ Ð Ô Ð Ö Ò Ø× × ÑÔÖ × ÔÓØ Ò Ü Ø Ó× × Ö¸ ÔÙ ÜÔÖ × Ö× ÓÑÓ 2 n¸ ÕÙ × Ù Ð 2 8 ÝØ ׺ ×ØÓ ÑÔÐ ÕÙ ØÓ Ó ÔÙÒØ ÓÖ Ú Ð Ó × ÑÔÖ Ø Ò Ö ÐÓ× n − 3 n n− 2 Ø× Ñ ÒÓ× × Ò ¬ Ø ÚÓ× ÓÐÓ Ó× Ò ÖÓº רÓ× Ø× ÔÙ Ò ÙØ Ð Þ Ö× Ô Ö ÐÑ Ò Ö Ò ÓÖÑ ÓÒ ÓÒ Ð Ò Ð Ó ÙÖÖ Ò ¸ Ð Ø Ñ ÒÓ× × Ò ¬ Ø ÚÓ ÙÒ ÔÙÒØ ÓÖ ÔÙ ÙÒ Ö ÓÑÓ Ò ÓÖ ÕÙ × Ò Ð × Ð ÔÙÒØ ÓÖ × Ó ÒÓ ÙÒ ÐÓº À Ý Ú Ö × Ñ Ò Ö × Ñ Ò ÔÙÐ Ö Ð Ø Ñ ÒÓ× × Ò ¬ Ø ÚÓ ÙÒ ÔÙÒØ ÓÖº ÉÙ Þ Ð Ñ × × Ò ÐÐ × Ñ ÒØ ÓÔ Ö ÓÒ × ÐÓ × ×Ó Ö Ð ÔÙÒØ ÓÖ ÓÑÓ × Ù º ¾ Ø ÖÑ Ò Ö × ÙÒ ÔÙÒØ ÓÖ × ÙÒ ÐÓ ¾ ≡ template <class Node> inline bool isThread(Node * p) { return (Node*) (((long) p) & 1); } ¾ ÓÒÚ ÖØ Ö ÙÒ ÔÙÒØ ÓÖ Ò ÙÒ ÐÓ ¾ ≡ template <class Node> inline Node * makeThread(Node * p) { return (Node*) ( ( (long)p) | 1); } ¾ ÓÒÚ ÖØ Ö ÙÒ ÐÓ Ò ÔÙÒØ ÓÖ ¾ ≡ template <class Node> inline Node * makePointer(Node * p) { return (Node*) (((long) p) & -2);
  • 303.
    ´ 4.4. Arboles Binarios 277 } Ð ÙÒ Ñ Ò Ö ¸ Ð Ð Ó ÔÐ ÒØ ÙÒ Ò ÐÓ ÕÙ Ú Ð ÒØ Ð Ö Ò ÒØÖ Ð Ð ×Ø × ÒÐ Þ × Ö ÙÐ Ö × Ý Ð × ÒÓ Ö ÙÐ Ö ×º Ò ×Ø × ÒØ Ó¸ ÙÒ Ö ÓÐ Ð Ó × Ô Ö ÙÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ º Ð Ù Ð ÕÙ Ò Ð × Ð ×Ø × Ö ÙÐ Ö ×¸ × ×Ø ÒØ × Ð ÙØ Ð Þ Ö ÙÒ ÒÓ Ó Ö º Ð Ð ÞÓ ÞÕÙ Ö Ó Ð ÒÓ Ó Ö ÔÙÒØ Ö Ð ÔÖ Ñ Ö ÒÓ Ó Ò¬ Óº Ð Ð ÞÓ Ö Ó ÔÙÒØ Ö Ð Ö Þº Ð ÐÓ ÞÕÙ Ö Ó Ð ÔÖ Ñ Ö ÒÓ Ó Ò¬ Ó Ý Ð Ð ÞÓ Ö Ó Ð ÙÐØ ÑÓ ÒÓ Ó Ò¬ Ó ÔÙÒØ Ö Ò Ð ÒÓ Ó Öº Ä ¬ ÙÖ º½ ÐÙ×ØÖ ÙÒ ÑÔÐÓ Ð Ö ÔÖ × ÒØ ÓÒ Ò Ñ ÑÓÖ ÙÒ Ö ÓÐ Ð Ó ÙØ Ð Þ Ò Ó ÙÒ ÒÓ Ó Ö º È Ö ÒÓØ Ö Ð Ö Ñ Ò × Ò ÓÒ ÙÒ Ð ×Ø ÒÐ Þ ¸ ØÓÑ Ð Ö ÓÐ ÔÓÖ ÐÓ× ÒÓ Ó× B Ý Z Ý ×Ø Ö º 4.4.16 Recorridos pseudo-hilados Ë Ò Ð Ö ÔÖ × ÒØ ÓÒ Ð Ö ÓÐ × Ø Ò ×Ù× ÓÒ × ×Ó Ö Ð Ö Ò Ñ ÒØÓ ÐÓ× Ö ÓÖÖ Ó׸ Ð Ð Ó × Ñ × Ð ÑÔÐ ÒØ Ö ÕÙ Ð Ö ÔÖ × ÒØ ÓÒ ØÖ ÓÒ Ðº Ë ÓÔØ × ÑÓ× ÔÓÖ Ð Ö ÔÖ × ÒØ ÓÒ ØÖ ÓÒ Ð¸ Ü ×Ø Ö ÙÒ Ð ÙÒ ÓÖÑ ÔÖÓÚ Ö ÐÓ× ÔÙÒØ ÖÓ× ÒÙÐÓ× ×Ô Ö Ó× Ä Ö ×ÔÙ ×Ø × ¬ÖÑ Ø Ú ÐÓ× ÔÙÒØ ÖÓ× ÒÙÐÓ× ÔÙ Ò Ù× Ö× ÓÑÓ ÐÓ× Ø ÑÔÓÖ Ð ×º Ó ÙÒ Ö ÓÐ Ò Ö Ó ÓÒ Ö Þ r¸ Ù ÕÙ ÑÓ× Ù Ð × ×Ù ÔÖ ×ÓÖ Ò¬ Óº ×ØÓ × ÕÙ Ú Ð ÒØ Ø ÖÑ Ò Ö Ù Ð × Ð ÙÐØ ÑÓ ÒÓ Ó ÕÙ × Ú × Ø Ò Ò¬ Ó ×Ù Ö Ñ ÞÕÙ Ö º ÈÓ ÑÓ× Ø ÖÑ Ò Ö ØÖ × ×Ó× ¯ Ë Ä(r) = NULL =⇒ r ÒÓ Ø Ò ÔÖ ×ÓÖº ¯ Ë Ä(r) = NULL =⇒ Ø Ò ÑÓ× Ó× ×Ó× ½º Ë Ê(Ä(r)) = NULL =⇒ Ä(r) × ÔÖ ×ÓÖº Ë Ä(r) ÒÓ Ø Ò Ö Ñ Ö ¸ ÒØÓÒ × Ä(r) × Ð ÔÖ ×ÓÖ rº º r º º º º º º º º º º Ä(r) ºº → º º º Predecesor− ºº ºº º º º º º º º º ººº º º ºº ºº ºº º º Ê(r) ºº º º º ºº ºº ºº º ºº º º ºº ºº ºº º º ºººº º ººº ºº ºººººº ºº Ä(Ä(r)) ¾º Ë Ê(Ä(r)) = NULL =⇒ Ð ÔÖ ×ÓÖ × Ð × Ò ÒØ Ñ × Ð Ö Ä(r)º r Ä(r) Ê(r) Ä(Ä(r)) Ê(Ä(r)) ←− Predecesor Ð ÔÖ ×ÓÖ Ð Ö Þ ÙÒ Ö ÓÐ Ò Ö Ó × Ð ÒÓ Ó Ñ × Ð Ö ×Ù ×Ù Ö ÓÐ ÞÕÙ Ö Óº
  • 304.
    278 Cap´ ´ ıtulo 4. Arboles ÈÓÖ × Ñ ØÖ ¸ Ð ×Ù ×ÓÖ Ð Ö Þ ÙÒ Ö ÓÐ Ò Ö Ó × Ð ÒÓ Ó Ñ × Ð ÞÕÙ Ö ×Ù ×Ù Ö ÓÐ Ö Óº Ó ÙÒ Ö ÓÐ Ò Ö Ó Ö Þ r¸ Ð Ö ÓÖÖ Ó Ò¬ Ó ÔÙ × Ò Ö× ÓÒ ÐÓ× × Ù ÒØ × Ð Ò Ñ ÒØÓ× ½º ÒØ × × Ò Ö Ð Ö Ñ ÞÕÙ Ö ¸ Ø ÖÑ Ò Ð ÔÖ ×ÓÖ rpº ¾º À Ê(rp) = r × Ö¸ ÓÐÓÕÙ ÙÒ ÐÓ Ö Ó rp Ô Ö ÕÙ ÔÙÒØ Ð Ö Þ r ´ÕÙ × Ð ×Ù ×ÓÖ rpµº ¿º rp × Ð ÙÐØ ÑÓ ÒÓ Ó Ò Ò¬ Ó Ð Ö Ñ ÞÕÙ Ö rº Ù Ò Ó ÐÓ Ú × Ø ¸ Ö ÙÔ Ö r Ñ ÒØ Ð Ú ÐÓÖ Ê(rp)º ÒØ × Ú × Ø Ö r¸ × ÙÖ × Ö ×Ø ÙÖ Ö Ê(rp) Ð Ú ÐÓÖ ÒÙÐÓº ר ÑÓ× Ò Ô ÓÖ Ö ÙÒ Ð ÓÖ ØÑÓ Ò¬ Ó ÕÙ Ù× ÐÓ× Ô Ö Ð × Ý ÙÝ ÓÖÑ Ò Ö Ð × Ö Ð × Ù ÒØ ¾ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¾ ¾ template <class Node> inline void inOrderThreaded(Node * root, void (*visitFct)(Node*)) { if (root == Node::NullPtr) return; Node *p = root, *r = Node::NullPtr, *q; Ö ÓÖÖ Ó Ò¬ Ó Ð Ó ¾ } × Ö Ð ÒÓ Ó ÕÙ × Ú × Ø Ó ÙÒ ÒÓ Ó Ö Ö ×Ó Ô Ö Ö p Ð Ö º q× Ð Ö ÓÒ ÙÒ ÒÓ Ó ×Ó Ö Ð Ù Ð Ü ×Ø ÙÒ ÐÓ Ø ÑÔÓÖ Ðº r × ÙÒ ÔÙÒØ ÖÓ Ð Ô Ö pº ¾ Ö ÓÖÖ Ó Ò¬ Ó Ð Ó ¾ ≡ ´¾ µ while (p != Node::NullPtr) { q = LLINK(p); if (q == Node::NullPtr) { // No hay rama izq ==> visitar p (*visitFct)(p); r = p; p = RLINK(p); continue; } × Õ Ð ÔÖ ×ÓÖ Ò¬ Ó Ô¾ if (q != r) // tiene p un predecesor? { // si ==> dejar un hilo para luego subir a visitar p RLINK(q) = p; // Aqu´ se coloca el hilo ı p = LLINK(p); // Seguir bajando por la izquierda continue; } (*visitFct)(p); RLINK (q) = Node::NullPtr; // Borrar hilo r = p; p = RLINK(p); // avanzar a la rama derecha }
  • 305.
    ´ 4.4. Arboles Binarios 279 Ð Ñ Ò ×ÑÓ Ð Ð ÓÖ ØÑÓ ÒÓ × ØÖ Ú Ðº È Ö ÔÖ Ö ÓÑÔÐ Ø Ñ ÒØ ×Ù ÙÒ¹ ÓÒ Ñ ÒØ¸ × Ò × Ö ÙÒ Ù ÓÒ Ñ Ò٠и Ð Ù Ð × Ð Ð Ð ØÓÖº ¾ × Õ Ð ÔÖ ×ÓÖ Ò¬ Ó Ô ¾ ≡ ´¾ µ // avanzar hacia el nodo m´s a la derecha de la rama izquierda a while (q != r and RLINK(q) != Node::NullPtr) q = RLINK(q); Ð Ð Ó Ô Ö Ð × ÑÙÝ ÑÔÓÖØ ÒØ ÔÓÖÕÙ ÔÙ Ù× Ö× Ò Ð ÓÖ ØÑÓ× ×Ó Ö Ö ÓÐ × Ò ÐÓ× Ù Ð × × Ð Ó ÙØ Ð Þ Ö Ô Ð Ó Ö ÙÖ× ÓÒ¸ ÔÙ × ÒÓ× ÓÖÖ ×Ô Ó Ò Ô Ð ¸ ÐÓ ÕÙ ÒÓ× Ö ÒØ Þ ÙÒ Ö ÓÖÖ Ó × ÙÖÓ¸ × Ò ÔÖ Ó ÙÔ ÓÒ ÔÓÖ × ÓÖ Ô Ð º ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð Ð Ó × Ö Ð ÓÔ ÓÒ × Ó Ö × Ð ÐØÙÖ Ð Ö ÓÐ × × ÓÒÓ º À ݸ × Ò Ñ Ö Ó¸ ØÖ × ÔÖÓ Ð Ñ × ÓÒ Ð Ð Óº Ð ÔÖ Ñ ÖÓ × ÕÙ Ð Ð ÓÖ ØÑ × Ñ × ÓÑÔÐ º Ð × ÙÒ Ó ÐÓ ÓÒר ØÙÝ Ð Ú ÒØÙ Ð ÓÒ×ÙÑÓ Ø ÑÔÓ Ö ÕÙ Ö Ó Ô Ö Ò ÓÒØÖ Ö Ð ÒÓ Ó ÔÖ ×ÓÖ ÒØ × Ö ÙÒ Ò Ú Ð Ð ÞÕÙ Ö º Ò ÐÑ ÒØ ¸ Ð ÙÐØ ÑÓ ÔÖÓ Ð Ñ × ÕÙ ÐÓ× Ð ÓÖ ØÑÓ× ÕÙ ÙØ Ð Ò Ð Ó Ô Ö Ð ÒÓ ×ÓÒ Ö ÒØÖ ÒØ × × Ö¸ ÒÓ ÔÙ Ò ÙØ Ö× ÓÒ ÙÖÖ ÒØ Ñ ÒØ ×Ó Ö Ð Ñ ×ÑÓ Ö Óк 4.4.17 Correspondencia entre ´rboles binarios y m-rios a Ü ×Ø ÙÒ Ñ ØÓ Ó Ò Ö Ð Ô Ö Ö ÔÖ × ÒØ Ö ÙÒ Ö ÓÖ × Ò ÓÑÓ ÙÒ Ö ÓÐ Ò Ö Ó Ý Ú Ú Ö× º Ð ÔÖÓ Ñ ÒØÓ × ÜÔÐ Ò Ð × Ù ÒØ Ð ÓÖ ØÑÓ Algoritmo 4.8 (Conversi´n de un arbol m-rio a uno binario equivalente) o ´ Ä ÒØÖ × ÙÒ Ö ÓÐ m¹Ö Ó Tm ∈ T º Ä × Ð × ÙÒ Ö ÓÐ Ò Ö Ó T ∈ B ÕÙ Ú Ð ÒØ Tm ½º T = ∅º ¾º ∀ni ∈ Tm ÔÐ ÕÙ Ð × × Ù ÒØ × Ö Ð × ´ µ Ð Ó Ñ × Ð ÞÕÙ Ö niÒ Tm × Ð Ó ÞÕÙ Ö Ó ni ∈ T º ´ µ Ð ÖÑ ÒÓ ÒÑ Ø Ñ ÒØ Ð Ö ni Ò Tm × Ð Ó Ö Ó ni Ò Tº ר Ð ÓÖ ØÑÓ ÔÖÓ Ù ÙÒ Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ Ð m¹Ö Ó Óº ÈÙ ×ØÓ ÕÙ Ð Ö Þ ÙÒ Ö ÓÐ Tm ÒÓ Ø Ò ÖÑ ÒÓ׸ Ð Ö Þ Ð Ö ÓÐ Ò Ö Ó Ö ×ÙÐØ ÒØ ÒÙÒ Ø Ò Ó Ö Óº ר Ó × ÖÚ ÓÒ ÒÓ× ÓÒ Ù ÜØ Ò Ö Ð Ð ÓÖ ØÑÓ º Ô Ö ÕÙ Ñ Ò Ö ÓÖ × Ò ×¸ ÐÓ Ù Ð ÓÒ× ×Ø ¸ × ÑÔÐ Ñ ÒØ ¸ Ò ÓÒ× Ö Ö Ð × Ö × ÐÓ× Ö ÓÐ × Ð Ö ÓÖ × Ò ÓÑÓ ÖÑ ÒÓ× ÙÒ ÔÖ Ñ Ö Ö Þ ¬ Ø º Ò ×Ø ×Ó × ÓÔØ Ö ÙÒ Ö Ø Ö Ó Ô Ö Ø ÖÑ Ò Ö Ð ÓÖ Ò Ò ÕÙ ÐÓ× Ö ÓÐ × Ð Ö ÓÖ × Ò × ÔÖÓ × Ò Ý ÕÙ ÓÒ× ×Ø Ò Ñ Ö ÖÐÓ× ÞÕÙ Ö Ö º À Ý ÙÒ Ñ Ò Ö Ú ×Ù Ð ÒØ ÖÔÖ Ø Ö Ð Ð ÓÖ ØÑÓ º ¸ Ð Ù Ð × ÓÑÓ × Ù ½º Ò Ò Ò ÙÒ Ð ×Ø ÒÐ Þ ÐÓ× Ó× ÑÐ º ¾º Ð Ñ Ò ÐÓ× Ö Ó× Ü ÔØÓ Ð ÕÙ Ú Ð Ó Ñ × Ð ÞÕÙ Ö º
  • 306.
    280 Cap´ ´ ıtulo 4. Arboles A D E B C I J K F G H R S T L M O P Q U V ÙÖ º½ ÍÒ Ö ÓÖ × Ò Ð Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ ÓÒØ Ò Ð Ñ ×Ñ ÒØ Ö Ó× ÕÙ Ð m¹ Ö Óº ÈÓÖ Ð ÞÓ Ú ÖØ Ð Ð Ñ Ò Ó¸ Ü ×Ø ÙÒ Ð ÞÓ ÓÖ ÞÓÒØ Ð Ò Óº Ä ¬ ÙÖ º½ ÐÙ×ØÖ Ð Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ Ð Ö ÓÖ × Ò Ð ¬ ÙÖ º½ ÐÙ Ó ÙØ Ö Ð ÒØ ÖÔÖ Ø ÓÒ Ú ×Ù Ð Ð Ð ÓÖ ØÑÓ º º Ð Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ Ð ¬ ÙÖ º½ × Ü Ø Ñ ÒØ Ð Ö ÔÖ × ÒØ ÓÒ Ñ ¹ ÒØ Ð ×Ø × ÒÐ Þ × Ð Ö ÓÖ × Ò ×ÕÙ Ñ Ø Þ Ò Ð ¬ ÙÖ º½ º Ó ÙÒ ÒÓ Ó Ù ÐÕÙ Ö Ò Ð Ö ÔÖ × ÒØ ÓÒ ÓÒ Ð ×Ø × ÒÐ Þ ×¸ Ð ÔÙÒØ ÓÖ Ð Ð ×Ø Ó× ÙÒ ÔÙÒØ ÓÖ Ð ×Ù Ö ÓÐ ÞÕÙ Ö Óº Ò ÐÓ Ñ ÒØ ¸ Ð ÔÙÒØ ÓÖ ÐÓ× ÖÑ ÒÓ× ÙÒ ÔÙÒØ ÓÖ Ð ×Ù Ö ÓÐ Ö Óº Ë × × ÒØ Ò Ö ÙÐÓ¸ Ö Ð ¬ ÙÖ º½ ÙÒÓ× 45◦ Ò Ð × ÒØ Ó ÓÖ Ö Ó Ý ×Ø Ö ÙÒ ÔÓÕÙ Ø Ò ÐÓ× Ð ÞÓ׺ Ú Ö ÙÒ Ö ÓÐ ÓÒ Ð ÓÖÑ Ð ¬ ÙÖ º¾¼º Ä ÓÖÖ ×ÔÓÒ Ò × ÒÝ Ø Ú Ð ÓÒÚ Ö× ÓÒ ÙÒ Ö ÓÐ m¹Ö Ó ÖÖÓ ÙÒ ÙÒ Ó Ö ÓÐ Ò Ö Óº Ì Ñ Ò × ÒÚ Ö× Ð Ý ×Ù Ð ÓÖ ØÑÓ ÐÑ ÒØ ٠к ÈÙ ×ØÓ ÕÙ T Ý Tb(T ) ×ÓÒ ÕÙ Ú Ð ÒØ × Ô Ö ØÓ Ó T ¸ Ð × Ñ Ò ÔÙÐ ÓÒ × ÕÙ × Ò ×Ó Ö ÙÒ Ö ÓÐ m¹Ö Ó ÔÙ Ò Ô Ö Ø Ñ ÒØ Ö Ð Þ Ö× ×Ó Ö ×Ù ÕÙ Ú Ð ÒØ Ò Ö Óº ÙÒ Ö ÓÖ × Ò ¸ Ü ×Ø Ò Ó× Ñ Ò Ö × Ð Ñ ÒØ Ð × Ö ÓÖÖ ÖÐ × ¯ Recorrido prefijo ½º Î × Ø Ð Ö Þ Ð ÔÖ Ñ Ö Ö ÓÐ ´ Ð Ñ × Ð ÞÕÙ Ö µº ¾º Ê ÓÖÖ Ò ÔÖ ¬ Ó ÐÓ× ×Ù Ö ÓÐ × Ð ÔÖ Ñ Ö Ö Óк ¿º Ê ÓÖÖ Ò ÔÖ ¬ Ó ÐÓ× Ö ÓÐ × Ö ×Ø ÒØ × ÞÕÙ Ö Ö º ¯ Recorrido sufijo ½º Ê ÓÖÖ Ò ×Ù¬ Ó ÐÓ× ×Ù Ö ÓÐ × Ð ÔÖ Ñ Ö Ö ÓÐ ´ Ð Ñ × Ð ÞÕÙ Ö µº
  • 307.
    ´ 4.4. Arboles Binarios 281 A D E B C I J K F G H R S T L M O P Q U V ÙÖ º½ Ê ÔÖ × ÒØ ÓÒ ÓÒ Ð ×Ø × Ð Ö ÓÖ × Ò Ð ¬ ÙÖ º½ ¾º Î × Ø Ð Ö Þ Ð ÔÖ Ñ Ö Ö Óк ¿º Ê ÓÖÖ Ò ×Ù¬ Ó ÐÓ× Ö ÓÐ × Ö ×Ø ÒØ × ÞÕÙ Ö Ö º ÓÖ Ð ÙÐ ÑÓ× Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó Ð Ö ÓÖ × Ò Ð ¬ ÙÖ º½ A B F L MG C H O P U V Q D I J R E K S T ´ º½ µ ר Ö ÓÖÖ Ó ÓÖÖ ×ÔÓÒ Ü Ø Ñ ÒØ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó Ð Ö ÓÐ Ò Ö Ó ÕÙ Ú ¹ Ð ÒØ Ð ¬ ÙÖ º¾¼º ×ÔÙ × ØÓ Ó¸ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó × Ð Ñ Ò Ö ØÓÔÓÐÓ Ñ ÒØ Ò ØÙÖ Ð Ð ×Ø Ö ÐÓ× ÒÓ Ó× Ò ÙÒ Ö Óк Ð Ö ÓÖÖ Ó ×Ù¬ Ó Ð Ö ÓÖ × Ò Ð ¬ ÙÖ º½ × L M F G B O U V P Q H C AI R J D S T K E , ´ º½ µ Ð Ù Ð no ÓÖÖ ×ÔÓÒ Ð Ö ÓÖÖ Ó ×Ù¬ Ó Ð Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ ´¬ ÙÖ º¾¼µº Ò ×Ù ÐÙ Ö¸ Ð × Ù Ò ´ º½ µ ÓÖÖ ×ÔÓÒ Ð Ö ÓÖÖ Ó Ò¬ Ó Ð Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ Ð ¬ ÙÖ º¾¼º ר ÕÙ Ú Ð Ò Ö ÓÖÖ Ó× ´×Ù¬ Ó Ò ÙÒ Ö ÓÖ × Ò ⇐⇒ Ò¬ Ó Ò ×Ù ÕÙ Ú Ð ÒØ Ò Ö Óµ × ÙÒ Ò Ò Ð ÓÖ ØÑ ¸ ÔÙ × Ð Ö ÓÖÖ Ó ×Ù¬ Ó × Ñ × ÓרÓ×Ó ÑÔÐ ÒØ Ö ÕÙ ÐÓ× Ö ÓÖÖ Ó× ÔÖ ¬ Ó Ò¬ Óº Ò Ö ×ÙÑ Ò¸ ÙÒ Ö ÓÖ × Ò Ý Ð Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ Ð ÙÐ Ó × ÙÒ Ð Ð ÓÖ ØÑÓ º ¸ Ø Ò ÑÓ× Ð × × Ù ÒØ × ÓÖÖ ×ÔÓÒ Ò × ÒØÖ ÐÓ× Ö ÓÖÖ Ó× ½º Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó Ð Ö ÓÖ × Ò ÓÖÖ ×ÔÓÒ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó Ð Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ º ¾º Ð Ö ÓÖÖ Ó ×Ù¬ Ó Ð Ö ÓÖ × Ò ÓÖÖ ×ÔÓÒ Ð Ö ÓÖÖ Ó Ò¬ Ó Ð Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ º
  • 308.
    282 Cap´ ´ ıtulo 4. Arboles A B D F C I E L G H J K M O R S P T U Q V ÙÖ º¾¼ Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ Ð Ö ÓÐ Ð ¬ ÙÖ º½ Ò ÙÒ Ö ÓÖ × Ò ¸ ÐÓ× Ö ÓÖÖ Ó× Ò¬ Ó Ý ÔÓÖ Ò Ú Ð × ÒÓ ÔÙ Ò ¬Ò Ö× ÓÒ ÔÖ ¹ × ÓÒº Ð Ö Ñ ÒØ ¸ Ý Ú Ö × Ñ Ò Ö × ¬Ò Ö Ð Ö ÓÖÖ Ó Ò¬ Ó ×Ó Ö ÙÒ Ö ÓÖ × Ò¹ ¸ ÔÙ × Ü ×Ø Ò Ú Ö × Ñ Ò Ö × ÓÐÓ Ö Ð Ö Þ ÒØÖ ×Ù× ×Ù Ö ÓР׺ Ð Ñ ×ÑÓ ÑÓ Ó¸ Ý Ú Ö × ÓÖÑ × ¬Ò Ö Ð Ö ÓÖÖ Ó ÔÓÖ Ò Ú Ð × Ò ÙÒ Ö ÓÖ × Ò º Ä ÕÙ Ú Ð Ò ÒØÖ Ö ÓÖ × Ò × Ý Ö ÓÐ × Ò Ö Ó× × ×ÙÑ ÑÔÓÖØ Ò ÔÖ Ø º Ù ÐÕÙ Ö ÔÖÓ Ð Ñ Ö ÔÖ × ÒØ Ó ÓÒ Ö ÓÖ × Ò × ÔÙ Ö ÔÖ × ÒØ Ö× Ý Ö ¹ ×ÓÐÚ Ö× Ò Ð ÔÐ ÒÓ ÐÓ× Ö ÓÐ × Ò Ö Ó× Ð Ò ÓÕÙ ÒÚ Ö×Ó Ø Ñ Ò × ÔÓ× Ð º ÓÑÓ × Ò ÓÖ × Ý ÔÖÓ Ö Ñ ÓÖ ×¸ ÔÓ ÑÓ× × Ó Ö Ð Ö ÔÖ × ÒØ ÓÒ Ñ × Ù Ò ÙÒ ÓÒ ÓÒ × Ø Ð × ÓÑÓ Ð ÓÑÔÖ Ò× ÓÒ Ð ÔÖÓ Ð Ñ ¸ Ð ¬ Ò Ù ÓÒ¸ Ð × ÑÔÐ ¹ Ð ×ÓÐÙ ÓÒ Ý Ð Ö ÙØ Ð Þ ÓÒ Ð ÓÖ ØÑÓ× Ý Ó Ó× Ü ×Ø ÒØ ׺ Ð Ð Ó Ð Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ ÔÙ × Ö ÙØ Ð Ò ÖØ × Ð × × ÔÖÓ Ð Ñ ×º Ä ¬ ÙÖ º¾½ ÑÙ ×ØÖ Ð Ö ÓÐ Ò Ö Ó Ð Ó ÕÙ Ú Ð ÒØ Ð Ö ÓÖ × Ò Ð ¬ ÙÖ º½ º Ð Ù Ö ×Ø Ö ÔÖ × ÒØ ÓÒ ÓÒ Ð ×Ø × ÒÓ× Ô ÖÑ Ø Ö ÔÖ Ò Ö Ý ÓÖÖÓ ÓÖ Ö Ð × Ò ¬¹ Ó ÐÓ× ÐÓ× Ý ×Ù ÙØ Ð Þ ÓÒ Ô Ö Ö Ö × Ö ×Ó Ö ÐÓ× Ò ×ØÖÓ׺ È Ö ÐÐÓ¸ Ö ÓÖ ÑÓ× ÕÙ Ð Ö ÓÖÖ Ó Ò¬ Ó Ò Ð Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ × ÓÖÖ ×ÔÓÒ ÓÒ Ð Ö ÓÖÖ Ó ×Ù¬ Ó Ò Ð Ö ÓÖ × Ò º ÈÓÖ ÐÓ Ø ÒØÓ¸ Ð Ü Ô ÓÒ ÐÓ× ÒÓ Ó× Ñ × Ð ÞÕÙ Ö Ý Ñ × Ð Ö Ð Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ ¸ ÔÓ ÑÓ× ÓÒ ÐÙ Ö ÓÒ Ð × × Ù ÒØ × Ó × ÖÚ ÓÒ × Ò Ö Ð × ×Ó Ö ÐÓ× ÐÓ× Ý ×Ù × ÒØ Ó Ö ×Ô ØÓ Ð Ö ÓÐ m¹Ö Ó ½º ÍÒ ÐÓ Ö Ó ÔÙÒØ ¸ × ÑÔÖ ¸ ×Ù Ô Ö ¸ ÔÙ × ×Ø × Ð ×Ù ×ÓÖ ×Ù¬ Ó Ò Ð Ö ÓÖ × Ò º ¾º ÍÒ ÐÓ ÞÕÙ Ö Ó ÒÓØ ÕÙ Ð ÒÓ Ó × Ó Ò Ð Ö ÓÐ m¹Ö Ó ×ØÓ × Ù Ö Ø Ñ ÒØ Ð ÕÙ Ú Ð Ò º Ð ÒÓ Ó ×Ø ÒÓ Ð ÐÓ ÓÖÖ ×ÔÓÒ ÓÒ Ð ÔÖ ×ÓÖ ×Ù¬ Ó Ò Ð Ö ÓÐ m¹Ö Óº ÕÙ Ø Ò ÑÓ× Ó× ×Ó× ´ µ Ë Ð Ó × Ð ÒÓ Ó Ñ × Ð ÞÕÙ Ö Ò Ð Ö ÓÐ m¹Ö Ó¸ ÕÙ ÔÙ ÒØ ¬ Ö×
  • 309.
    4.5. Un TADgen´rico para ´rboles e a 283 A º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º B º ºº º º º º º º º º º º º D º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º F º º º º º º º º º º º º º º º º º C º º º º º º º º º º º º º º º º º º I º º º º º º º º º º º ºº º E º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º ºº º º º º º º ºº º º º º º º º º º º º ºº ºº º ºº º º º º º º º º º º ºº ººº º º º º º º ººº º º º º º º º º º º º º ºº º º º º º ºº º º º º º º º ºº ºº º º º º º º ºº ºº ºº º º º ºº º ºº º º º º º º º º º º ºº ºº ººº º º º º º º º ºº º º º º º º ºº º º º º ºº º º º º º º ºº ºº º º º º º º º º º º º º º º ºº º º º ºº º º º º L º ºº º º º º º º º º º º º º º G ºº ºº ºº ºº ºº ºº º º H º º º º º º º º º º ºº º ºº º ººº ºº º º º º ºººº ººº ºº º º º º º º º J ºº ºº ºº ºº ºº ºº º º K º º º º º º º º º º º º º º º º ºº º ºº º º º º º º º º º º º º ºº ºº º º º º º º º º º º º º º º º º º ºº º ºº º ºº ºº ºº º º º ºº º º º º º º º º º º º ºº ºº ºº ºº º º º ºº º º º º º º º º º º ºº ºº ºº ººº º º º º º º º ºº º º ºº ºº º º ºº º º º º º º º º º º º º º ºº ºº ºº º º º º º º º º º º º º º ºº ºº º º º º º º º º º º º º º º º º º º º º ºº º º ºº ºº ºº º º º º º º º º º º º º º º º º º º º ºº ºº ºº ºº º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º º º º º º º º º º º º º º ºº ººº ºº º º º º º º º ºº º º º º º º ºº ººº º º º º º º º º ºº º º º º º º º º º º º º º º º ºº º º º º º º º M º º º º º º º º ºº ºº º º º ºº º º ºº ººº º ºº º º º º º º º O º º º º º º º ºº ºº º º º º º º º º º R º º º º º º º º º º º º ºº º º ºº º º ººº º ºº º º º º º S º º º º º º º º ºº ºº º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º ºº º º º º º º º º º º º º º ºº º º º º º º º º º º ºº º º º º º º º º º º º ºº º º º º º º ºº º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º ºº º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º º º º º º º º º º º º º º ºº º º º º º º º º º º º º º º º º º º º º º º º º º º º º ºº ºº º º º º º º º º º º º º º ºº º ºº º º ºº º º ºº º º º º ºº ºº ºº º º º º ºº ºº º º º ºº ºº º º ºº ººº ºº º º º º ºº º ºº º º º º ººº º ºº ºº º º º º º º P º º º º º º º º º ºººº ººº ºº ºº ºº º º ºº º º º º ºººº ºº º ºº º º º º º º º º º T º º º º º º º º º º º º º º º º º º ºº º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º º º º º º º º º º º ºº º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º º º º º U º ºº º º º º º º º º º º º º Q º º º º º º º º ºº ºº º º º ºº º ºº º ººº ºº º º ºº º º º º º º º ºº º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º º º ºº º º º º º ºº º º º º º º º º º º º ºº º º º º º º º º º º º ºº º º º º º º º º º º º º º º º º º º º ºº º º ººº º ºº ºººº ººº ºº º º º º º º º º V º º º º º º º º ºº ºº º ºº º ºº ºº º º ºº º ºº ºº º º º º º º º º º º º º º º º º ºº º º º º º º º º º º º º º º º º º º º º º º ºº º º º º º º ºº ºº º º º º º º ºº º º ºº ºº ºº º º º º ºº ºº ºº ºº º º ºº º ººº ºº ÙÖ º¾½ Ö ÓÐ Ò Ö Ó¸ Ð Ó¸ ÕÙ Ú Ð ÒØ Ð Ö ÓÐ Ð ¬ ÙÖ º½ Ò Ð ÕÙ Ú Ð ÒØ Ò Ö Ó ÔÓÖÕÙ × ÙÒ Ó ÞÕÙ Ö Ó¸ ÒØÓÒ × Ð ÐÓ ÔÙÒØ ÙÒ Ø Ó ÔÖ ÑÓ Ò ØÓ Ò Ð ÙÒ Ò Ö ÓÒº ÆÓØ ÑÓ× ÕÙ ÔÙ ØÖ Ø Ö× ÙÒ Ø Ó Ö ØÓ Ó ÙÒ Ø Ó Ò Ò Ö ÓÒ × ÒØ Ö ÓÖ ×¸ × ÙÒ Ð ÔÖÓ ÙÒ Ð Ó º ´ µ Ò Ð ×Ó ÓÒØÖ Ö Ó¸ × Ð Ó ÒÓ × Ð Ñ × Ð ÞÕÙ Ö Ò Ö ÓÐ m¹Ö Ó¸ ÒØÓÒ ×¸ Ð ÐÓ ÔÙÒØ ¸ × ÑÔÖ ¸ ×Ù ÖÑ ÒÓ ÞÕÙ Ö Óº 4.5 Un TAD gen´rico para ´rboles e a ÄÓ× Ö ÓÐ × Ò Ö Ó× ÒÓ× Ô ÖÑ Ø Ò Ö ×ÓÐÚ Ö ÙÒ ÑÔÐ Ú Ö ÔÖÓ Ð Ñ ×º ÆÓ Ó ×Ø ÒØ ¸ Ò Ð ÙÒ × Ó × ÓÒ × ÔÙ ÔÖ Ö Ö× ÙÒ Ö ÓÐ Ð ÙÒ ÓÖ Ò Óº Ò ×Ø × ÒØ Ó¸ ר × ÓÒ ØÖ Ø Ö ×Ó Ö Ð × ÒÓ ÑÔÐ ÒØ ÓÒ ÙÒ Ì ÕÙ ÑÓ Ð ÙÒ Ö Óк Ð Ì Ò Ù ×Ø ÓÒ × Ò Ù ÒØÖ Ò Ð Ö ÚÓ ØÔÐ ØÖ ÒÓ ºÀ ¾ ¿ ¸ ÙÝ ×ØÖÙ ØÙÖ Ò Ö Ð × ÓÑÓ × Ù ¾¿ ØÔÐ ØÖ ÒÓ ºÀ ¾ ¿ ≡ template <class T> class Tree_Node { ØÖ ÙØÓ× Tree Node<T> ¾ Å ØÓ Ó× ÔÖ Ú Ó× Tree Node<T> ¾ Å ØÓ Ó× ÔÙ Ð Ó× Tree Node<T> ¾ }; Å ØÓ Ó× ÙØ Ð Ø Ö Ó× Ö ÓÐ × ¾ Ò Ð Ð ÓÖ ÓÒ ×Ø Ì × ÓÒØÓ ÓÒ Ð × Ú Ð Ó× × ÝÙ × ÐÓ× Ô Ö Ð ÔÓ ×ØÙ ÒØ × ÂÓ× Ö ØÓ ´Ñ ×ØÖ µ Ý ÂÙ Ò Ù ÒØ × ´ÔÖ Ö Óµº
  • 310.
    284 Cap´ ´ ıtulo 4. Arboles Ð Ì Tree Node<T> ÑÓ Ð Þ ÙÒ ÒÓ Ó ÙÒ Ö ÓÐ Ò Ö Ð Ð Ù Ð Ù Ö ÙÒ ØÖ ¹ ÙØÓ Ò Ö Ó Ø ÔÓ T ×Ô ¬ Ó Ð × Ù ÒØ ÓÖÑ ¾ ØÖ ÙØÓ× Tree Node<T> ¾ ≡ ´¾ ¿µ ¾ T data; Ð Ù Ð ÔÙ Ö× Ñ ÒØ ¾ Å ØÓ Ó× ÔÙ Ð Ó× Tree Node<T> ¾ ≡ ´¾ ¿µ ¾ T & get_key() { return get_data(); } T & get_data() { return data; } typedef T key_type; ÆÙ ×ØÖ ÔÖ Ñ Ö × ÓÒ × ÒÓ ÓÒ× ×Ø Ò × Ó Ö Ð Ö ÔÖ × ÒØ ÓÒ Ò Ñ ÑÓÖ º ÈÙ ×ØÓ ÕÙ ÔÖ Ø Ò ÑÓ× Ú Ö× Ø Ð Ý Ò Ö Ð ¸ ØÖ Ò× Ö ÑÓ× ÔÓÖ Ð Ö ÔÖ × ÒØ ÓÒ ÓÒ Ð ×Ø ׸ ÔÙ × ×Ø Ó Ö Ñ × Ò Ñ ×ÑÓ ÕÙ ×Ù ÓÒØÖ Ô ÖØ ÓÒ ÖÖ ÐÓ׺ ÓÒ× Ù ÒØ ¹ Ñ ÒØ ¸ Ö ÕÙ Ö ÑÓ× Ó× ÒÐ × Ó Ð × ¾ ØÖ ÙØÓ× Tree Node<T> ¾ +≡ ´¾ ¿µ ¾ ¾ Dlink child; Dlink sibling; child ÒÐ Þ ÐÓ× Ó× Ñ × Ð ÞÕÙ Ö Ý sibling ÒÐ Þ ÐÓ× ÖÑ ÒÓ× ×Ù ×Ó ×Ø Ó ÔÓÖ ÐÓ× × Ù ÒØ × Ñ ØÓ Ó× ¾ Å ØÓ Ó× ÔÙ Ð Ó× Tree Node<T> ¾ +≡ ´¾ ¿µ ¾ ¾ Dlink * get_child_list() { return &child; } Dlink * get_sibling_list() { return &sibling; } ÅÙ × Ú ×¸ ÐÙ Ó Ó Ø Ò Ö ÙÒ ÔÙÒØ ÖÓ Dlink Ó × child Ó sibling¸ Ò ¹ × Ø Ö ÑÓ× ÓÒÚ ÖØ ÖÐÓ ÙÒ Tree Node<T>º È Ö ÐÐÓ¸ Ò Ö ÑÓ× ÙÒ ÓÒ × ÓÒÚ Ö× ÓÒ Ñ ÒØ ÐÓ× Ñ ÖÓ× Ó Ö Ó× ÔÓÖ Ð Ð × Dlink ´Ü ¾º º ´Ô Ò µµ ¾ Å ØÓ Ó× ÔÖ Ú Ó× Tree Node<T> ¾ ≡ ´¾ ¿µ ¾ LINKNAME_TO_TYPE(Tree_Node, child); LINKNAME_TO_TYPE(Tree_Node, sibling); Í× × LINKNAME TO TYPE ¿º ×Ù Ú Þ¸ ר Ô Ö Ñ ØÓ Ó× ÒÓ× Ô ÖÑ Ø ¬Ò Ö Ð ×Ó ÐÓ× ÒÓ Ó× Ð ÒØÓÖÒÓ ÙÒ Tree Node<T> ¾ Å ØÓ Ó× ÔÖ Ú Ó× Tree Node<T> ¾ +≡ ´¾ ¿µ ¾ Tree_Node * upper_link() { return child_to_Tree_Node(child.get_prev()); } Tree_Node * lower_link() { return child_to_Tree_Node(child.get_next()); } Tree_Node * left_link() { return sibling_to_Tree_Node(sibling.get_prev()); } Tree_Node * right_link() { return sibling_to_Tree_Node(sibling.get_next()); } × Ö¸ Ð Ô Ö Ý Ð Ó¸ ØÖ Ú × upper link() Ý lower link()¸ Ò ×Ó ÕÙ × ØÖ Ø ÙÒ ÒÓ Ó ÕÙ × Ð Ñ × Ð ÞÕÙ Ö ¸ Ý ÐÓ× ÖÑ ÒÓ× ÞÕÙ Ö Ó Ý Ö Ó¸ left link() Ý right link()¸ × × ØÖ Ø Ù ÐÕÙ Ö ÓØÖÓ ÒÓ Ó Ö ÒØ Ð ÔÖ ÑÓ Ò ØÓº Ë Ò Ð × Ð ×Ø × ×ÓÒ Ö ÙÐ Ö ×¸ ÐÐ × ÒÓ Ø Ò Ò ÒÓ Ó Ö º ÈÓÖ ×Ø Ö ÞÓÒ¸ ÑÓ× ×Ø Ö ÑÙÝ Ô Ò ÒØ × Ù Ð × Ð ÜØÖ ÑÓ Ð ×Ø º Ò ×Ø × ÒØ Ó¸ Ñ Ö Ö ÑÓ× ÒÓ Ó ÓÒ Ò Ö × ÕÙ ÒÓ× Ò Ö Ò Ð Ø ÔÓ ÒÓ Ó × ÙÒ ÕÙ ×Ø × ÜØÖ ÑÓ Ð ÙÒ Ð ×Ø º È Ö ÐÐÓ¸ ¬Ò ÑÓ× ÐÓ× × Ù ÒØ × Ø× ¾ ØÖ ÙØÓ× Tree Node<T> ¾ +≡ ´¾ ¿µ ¾ struct Flags { unsigned int is_root : 1;
  • 311.
    4.5. Un TADgen´rico para ´rboles e a 285 unsigned int is_leaf : 1; unsigned int is_leftmost : 1; unsigned int is_rightmost : 1; Flags() : is_root(1), is_leaf(1), is_leftmost(1), is_rightmost(1) { } }; Flags flags; Ä Ó × ÖÚ ÓÒ Ý ÑÓ ¬ ÓÒ ×Ø × Ò Ö × ¬Ò Ò ÐÓ× × Ù ÒØ × Ñ ØÓ Ó× ×Ó Ö ÙÒ ÒÓ Ó ¾ Å ØÓ Ó× ÔÙ Ð Ó× Tree Node<T> ¾ +≡ ´¾ ¿µ ¾ ¾ bool is_root() const { return flags.is_root; } bool is_leaf() const { return flags.is_leaf; } bool is_leftmost() const { return flags.is_leftmost; } bool is_rightmost() const { return flags.is_rightmost; } void set_is_root(const bool & value) { flags.is_root = value; } void set_is_leaf(const bool & value) { flags.is_leaf = value; } void set_is_leftmost(const bool & value) { flags.is_leftmost = value; } void set_is_rightmost(const bool & value) { flags.is_rightmost = value; } 4.5.1 Observadores de Tree Node<T> Ô ÖØ Ð × Ò Ö × Ý Ð ØÓ Ò Ö Ó¸ × ÙÒ Tree Node<T> ÔÙ Ò Ó × ÖÚ Ö× ×Ù× ÒÓ Ó× Ý ÒØ × × Ö¸ ×Ù Ô Ö ¸ ×Ù Ó Ñ × Ð ÞÕÙ Ö Ý ×Ù× ÖÑ ÒÓ׺ ÓÑ Ò ÑÓ× ÔÓÖ ÐÓ× ÖÑ ÒÓ׸ ÐÓ× Ù Ð × ×ÓÒ ÐÓ× Ó × ÖÚ ÓÖ × Ñ × × ÑÔÐ × ¾ Å ØÓ Ó× ÔÙ Ð Ó× Tree Node<T> ¾ +≡ ´¾ ¿µ ¾ ¾ Tree_Node * get_left_sibling() { if (is_leftmost()) return NULL; return left_link(); } Tree_Node * get_right_sibling() get right sibling()× × Ñ ØÖ Ñ ÒØ × Ñ Ð Ö get left sibling()º × ÙÒ ÒÓ Ó × ÔÙ Ö ×Ù× Ó× ÜØÖ ÑÓ× Ð Ñ × Ð ÞÕÙ Ö Ý Ð Ñ × Ð Ö ¾ Å ØÓ Ó× ÔÙ Ð Ó× Tree Node<T> ¾ +≡ ´¾ ¿µ ¾ ¾ Tree_Node * get_left_child() { if (is_leaf()) return NULL; return lower_link(); } Tree_Node * get_right_child() { if (is_leaf()) return NULL; Tree_Node * left_child = lower_link(); return left_child->left_link(); }
  • 312.
    286 Cap´ ´ ıtulo 4. Arboles Ñ Ó× Ñ ØÓ Ó× ÔÙ Ò Ö Ö Ö Ð Ñ ×ÑÓ ÒÓ Ó Ò ×Ó ÕÙ this Ø Ò ÙÒ ×ÓÐÓ Ó Ó ×Ø Ú Óº Ò ×Ó ÕÙ Ð Ö Ó Ð ÒÓ Ó × Ñ ÝÓÖ ÕÙ Ó׸ Ð Ö ×ØÓ ÐÓ× ÒÓ Ó× ÔÙ Ö× Ñ ÒØ get left sibling() Ý get right sibling()º ØÓ× Ð Ú Ö× Ø Ð ¸ ÔÙ ÓÒÚ Ò ÖÒÓ× Ð ×Ó × ÙÒ Ð ÓÖ Ò Ð ¾ Å ØÓ Ó× ÔÙ Ð Ó× Tree Node<T> ¾ +≡ ´¾ ¿µ ¾ ¾ Tree_Node * get_child(const int & i) { Tree_Node * c = get_left_child(); for (int j = 1; c != NULL and j < i; ++j) c = c->get_right_sibling(); return c; } Ð Ñ ØÓ Ó Ö ØÓÖÒ NULL × index × Ñ ÝÓÖ Ó Ù Ð ÕÙ Ð Ö Ó Ð ÒÓ Óº Ò ÐÑ ÒØ ¸ Ð ÙÐØ ÑÓ Ó × ÖÚ ÓÖ ÓÒ ÖÒ Ð ÒÓ Ó Ô Ö ¾ Å ØÓ Ó× ÔÙ Ð Ó× Tree Node<T> ¾ +≡ ´¾ ¿µ ¾ ¾ Tree_Node * get_parent() { if (is_root()) return NULL; Tree_Node * p = this; while (not ISLEFTMOST(p)) // retroceda hasta ser el nodo m´s a la izquierda a p = p->left_link(); return p->upper_link(); } ÄÓ× Ö ÓÐ × ÔÙ Ò ×Ó Ö× Ò ÙÒ Ö ÓÖ × Ò 4.5.2 Modificadores de Tree Node<T> Ù Ò Ó × Ö ÙÒ ÒÙ ÚÓ ÒÓ Ó × ×ÙÑ Ö Þ ÙÒ Ö Óк À Ý Ó× Ø ÔÓ× Ò× Ö ÓÒ ÓÑÓ ÖÑ ÒÓ Ý ÓÑÓ Óº Ë ÙÒ Ð Ø ÔÓ Ò× Ö ÓÒ¸ Ð ÒÓ Ó ÔÙ Ö × Ö Ö Þº À Ý Ó× ÓÖÑ × Ò× ÖØ Ö ÓÑÓ ÖÑ ÒÓ Ð ÞÕÙ Ö Ý Ð Ö º Ë Ð ÒÓ Ó ÖÑ ÒÓ × Ö Þ¸ ÒØÓÒ × Ð ÒÓ Ó Ò× ÖØ Ó × Ù × Ò Ó Ö Þº Ò ×Ø ×Ó¸ ØÖ Ø ÑÓ× ÓÒ ÙÒ Ö ÓÖ × Ò × ÕÙ Ð Ñ ÒØ ÐÓ× ÖÑ ÒÓ׺ Ò ×Ó ÓÒØÖ Ö Ó¸ Ð ÒÓ Ó Ò× ÖØ Ó ÓÑÔ ÖØ Ð Ñ ×ÑÓ Ô Ö º Ä Ò× Ö ÓÒ ÓÑÓ ÖÑ ÒÓ Ö Ó × ×Ô ¬ Ð × Ù ÒØ ÓÖÑ ¾ Å ØÓ Ó× ÔÙ Ð Ó× Tree Node<T> ¾ +≡ ´¾ ¿µ ¾ ¾ void insert_right_sibling(Tree_Node * p) { if (p == NULL) return; if (not is_root()) p->set_is_root(false); p->set_is_leftmost(false); Tree_Node * old_next_node = get_right_sibling(); if (old_next_node != NULL) p->set_is_rightmost(false); this->set_is_rightmost(false); this->sibling.insert(SIBLING_LIST(p));
  • 313.
    4.5. Un TADgen´rico para ´rboles e a 287 } Ä Ò× Ö ÓÒ ÓÑÓ ÖÑ ÒÓ ÞÕÙ Ö Ó × ÙÒ ÔÓ Ó Ñ × ÓÑÔÐ ÔÓÖÕÙ p ÔÙ Ú ÒÖ Ð Ó Ñ × Ð ÞÕÙ Ö Ò ÙÝÓ ×Ó¸ Ð ÒØ ÙÓ Ñ × ÞÕÙ Ö × Ö× Ð Ð ×Ø Ó× child Ý ×Ùר ØÙ Ö× ÔÓÖ pº ¾ Å ØÓ Ó× ÔÙ Ð Ó× Tree Node<T> ¾ +≡ ´¾ ¿µ ¾ ¾ void insert_left_sibling(Tree_Node * p) { if (p == NULL) return; if (not this->is_root()) p->set_is_root(false); p->set_is_rightmost(false); Tree_Node * old_next_node = this->get_left_sibling(); if (old_next_node != NULL) p->set_is_leftmost(false); else if (not this->child.is_empty()) // verifica si p devendr´ m´s a la izquierda a a { // this es el m´s a la izquierda ==> p pasar´ a ser el primog´nito a a e Tree_Node * parent = this->get_parent(); Tree_Node * left_child = this->get_left_child(); CHILD_LIST(this)->del(); // sacar this de lista de hijos if (parent != NULL) // ahora meter a p en la lista de hijos parent->insert(p); else left_child->append(p); } this->set_is_leftmost(false); this->sibling.append(SIBLING_LIST(p)); } Ñ × ÔÖ Ñ Ø Ú ×¸ insert right sibling() insert left sibling()¸ Ò× ÖØ Ò ÔÓÖ Ð ÞÕÙ Ö Ý Ö Ý Ö ÕÙ Ö Ò ÕÙ Ð ÒÓ Ó Ò× ÖØ Ö ×Ø Ú Óº Ð × ÙÒ Ó Ø ÔÓ Ò× Ö ÓÒ × Ö¸ ÓÑÓ Ó¸ ÔÙ Ö Ð Þ Ö× ÓÑÓ Ð Ó Ñ × Ð ÞÕÙ Ö Ó Ð Ñ × Ð Ö º À ÕÙ Ð Ð ÞÕÙ Ö ¾ Å ØÓ Ó× ÔÙ Ð Ó× Tree Node<T> ¾ +≡ ´¾ ¿µ ¾ ¾ void insert_leftmost_child(Tree_Node * p) { if (p == NULL) return; p->set_is_root(false); if (this->is_leaf()) { this->set_is_leaf(false); CHILD_LIST(this)->insert(CHILD_LIST(p)); } else { Tree_Node * old_left_child_node = this->lower_link(); old_left_child_node->set_is_leftmost(false); p->set_is_rightmost(false); CHILD_LIST(old_left_child_node)->del(); CHILD_LIST(this)->insert(CHILD_LIST(p));
  • 314.
    288 Cap´ ´ ıtulo 4. Arboles SIBLING_LIST(old_left_child_node)->append(SIBLING_LIST(p)); } } Ì Ñ Ò Ü ×Ø ×Ù ÕÙ Ú Ð ÒØ ÔÓÖ Ð Ö ¸ ÐÐ Ñ Ó insert rightmost child()º ÙÒÕÙ Ú ÒØÙ ÐÑ ÒØ × ÔÓ× Ð ÓÒרÖÙ Ö ÙÒ Ö ÓÖ × Ò Ñ ÒØ Ð ÙÒ × ×Ø × Ð × × Ò× Ö ÓÒ¸ × ÔÖ Ö Ð ÓÒרÖÙ Ö Ö ÓÐ × Ý ÐÙ Ó Ò Ò ÖÐÓ× Ò ÙÒ Ö ÓÖ × Ò Ñ ÒØ Ð × Ù ÒØ Ñ ØÓ Ó ¾ Å ØÓ Ó× ÔÙ Ð Ó× Tree Node<T> ¾ +≡ ´¾ ¿µ ¾ ¾ void insert_tree_to_right(Tree_Node * tree) { tree->set_is_leftmost(false); Tree_Node * old_next_tree = this->get_right_tree(); if (old_next_tree != NULL) tree->set_is_rightmost(false); this->set_is_rightmost(false); SIBLING_LIST(this)->insert(SIBLING_LIST(tree)); } Ð Ô Ö Ñ ØÖÓ tree ÑÔ Ö Ø Ú Ñ ÒØ × Ö ÙÒ Ö ÓÐ × Ö¸ tree Ø Ò ÕÙ × Ö ÙÒ Ö Þ ÐÓ ÓÒØÖ Ö Ó × ÓÒ× Ö ÙÒ ÖÖÓÖº 4.5.3 Observadores de ´rboles a Ö ÓÖ × Ò × ÓÒרÖÙ × Ñ ÒØ insert tree to right() ÔÙ ÓÒ×ÙÐØ Ö× ØÖ Ú × ÐÓ× × Ù ÒØ × Ñ ØÓ Ó× ¾ Å ØÓ Ó× ÔÙ Ð Ó× Tree Node<T> ¾ +≡ ´¾ ¿µ ¾ ¾ Tree_Node * get_left_tree() Tree_Node * get_right_tree() רÓ× Ñ ØÓ Ó× Ö ØÓÖÒ Ò Ð Ö ÓÐ × ØÙ Ó Ð ÞÕÙ Ö Ó Ö this¸ Ö ×Ô Ø Ú ¹ Ñ ÒØ º Ú ÒØÙ ÐÑ ÒØ ¸ ×ÓÐÓ × Ð ÔÖ Ñ Ö Ö ÓÐ Ð Ö ÓÖ × Ò Ó × ¸ × Ð Ñ × Ð ÞÕÙ Ö ¸ ÔÙ ÓÒ×ÙÐØ Ö× Ð Ö ÓÐ Ñ × Ð Ö Ð Ö ÓÖ × Ò Ñ ÒØ × Ù ÒØ ¾ Å ØÓ Ó× ÔÙ Ð Ó× Tree Node<T> ¾ +≡ ´¾ ¿µ ¾ Tree_Node * get_last_tree() 4.5.4 Recorridos sobre Tree Node<T> Ð ÔÖ Ñ Ö Ö Ó Ð Ì Ö Ò ÜÔÐ Ó × Ð × ÖÖÓÐÐÓ ÐÓ× Ö ÓÖÖ Ó׺ ÓÒ× Ö ¹ ÑÓ׸ Ò ÔÖ Ñ Ö ÐÙ Ö¸ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó Ö ÙÖ× ÚÓ ÙÒ Ö ÓÐ ¾ Å ØÓ Ó× ÙØ Ð Ø Ö Ó× Ö ÓÐ × ¾ ≡ ´¾ ¿µ ¾ template <class Node> static inline void __tree_preorder_traversal(Node * root, const int & level, const int & child_index, void (*visitFct)(Node *, int, int)) { (*visitFct)(root, level, child_index); Node * child = root->get_left_child(); for (int i = 0; child != NULL; i++, child = child->get_right_sibling())
  • 315.
    4.5. Un TADgen´rico para ´rboles e a 289 __tree_preorder_traversal(child, level + 1, i, visitFct); } Ä ÖÙØ Ò Ö ÓÖÖ Ö ÙÖ× Ú Ñ ÒØ ¸ Ò ÔÖ ¬ Ó¸ Ð Ö ÓÐ ÓÒ Ö Þ rootº Ò Úר ¸× ÒÚÓ Ð ÙÒ ÓÒ ÔÙÒØ ÔÓÖ (*visitFct)¸ ÙÝÓ× Ô Ö Ñ ØÖÓ× ×ÓÒ Ð ÒÓ Ó Ú × Ø Ó¸ ×Ù Ò Ú Ð ÒØÖÓ Ð Ö ÓÐ Ý ×Ù ÓÖ Ò Ð ÓÑÓ Ó Ö ×Ô ØÓ ×Ù Ô Ö º tree preorder traversal() ÒÓ ×Ø ר Ò ÓÑÓ ÒØ Ö Þ ÔÙ Ð º Ò ×Ù ÐÙ Ö¸ × Ò ÑÓ× Ó× ÔÖ Ñ Ø Ú × ÔÙ Ð × Ö ÓÖÖ Ó ÔÖ ¬ Ó ÕÙ ÐÐ Ñ Ò Ð Ú Ö× ÓÒ ×Ø Ø ¸ ÙÒ Ô Ö ÙÒ Ö ÓÐ Ý ÓØÖ Ô Ö ÙÒ Ö ÓÖ × Ò ¾ Å ØÓ Ó× ÙØ Ð Ø Ö Ó× Ö ÓÐ × ¾ +≡ ´¾ ¿µ ¾ ¾ template <class Node> inline void tree_preorder_traversal(Node * root, void (*visitFct)(Node *, int, int)) { __tree_preorder_traversal(root, 0, 0, visitFct); } template <class Node> inline void forest_preorder_traversal(Node * root, void (*visitFct)(Node *, int, int)) { for (/* nada */; root != NULL; root = root->get_right_tree()) __tree_preorder_traversal(root, 0, 0, visitFct); } Ð Ö ÓÖÖ Ó ×Ù¬ Ó × ÑÙÝ × Ñ Ð Ö Ý ÓÑÔÖ Ò× Ð ÐÙ Ó ×ØÙ Ó Ð Ö ÓÖÖ Ó ÔÖ ¬ Óº 4.5.5 Destrucci´n de Tree Node<T> o ÈÖ Ö Ð Ì Tree Node<T> Ñ Ò Ñ Ñ ÒØ ÓÔ Ö Ø ÚÓ ÒÓ× × × Ò Ð Ð ×ØÖÙ ÓÒ¸ ÙÝ ×Ô ¬ ÓÒ × ÓÑÓ × Ù ¾ Å ØÓ Ó× ÙØ Ð Ø Ö Ó× Ö ÓÐ × ¾ +≡ ´¾ ¿µ ¾ ¾¼ template <class Node> inline void destroy_tree(Node * root) { if (not IS_UNIQUE_SIBLING(root)) SIBLING_LIST(root)->del(); // no ==> sacarlo de lista de hermanos // recorrer los sub´rboles de derecha a izquierda a for (Node * p = root->get_right_child(); p != NULL; /* nada */) { Node * to_delete = p; // respaldar sub´rbol a borrar p a p = p->get_left_sibling(); // Avanzar p a hermano izquierdo destroy_tree(to_delete); // eliminar recursivamente arbol ´ } if (root->is_leftmost()) // to_delete == m´s izquierda ==> sacarlo lista hijos a CHILD_LIST(root)->del(); delete root; } template <class Node> inline void destroy_forest(Node * root) { while (root != NULL) // recorre los arboles de izquierda a derecha ´ { Node * to_delete = root; // respalda ra´z ı
  • 316.
    290 Cap´ ´ ıtulo 4. Arboles root = root->get_right_sibling(); // avanza a siguiente arbol ´ SIBLING_LIST(to_delete)->del(); // elimine arbol de lista de arboles ´ ´ destroy_tree(to_delete); // Borre el arbol ´ } } 4.5.6 B´squeda por n´mero de Deway u u ÈÐ ÒØ ÑÓ×ÒÓ× Ð Ù×ÕÙ ÙÒ ÒÓ Ó Ò ÙÒ Ö ÓÐ Ó ×Ù ÒÙÑ ÖÓ ¹ Û Ý ´Ü º¾º ´Ô Ò ¾ µµº Ò × × ÒØ Ó¸ ¬Ò ÑÓ× ÙÒ Ñ ÒÓ Û Ý ÓÑÓ ÙÒ × ÙÒ ÒØ ÖÓ× Ù Ö Ò ÙÒ ÖÖ ÐÓ Ø ÔÓ int path[] Ý Ð Ñ Ø ÓÒ ÙÒ Ú ÐÓÖ Ò Ø ÚÓ ÕÙ Ò Ð ¬Ò Ð × Ù Ò º Ä ÔÖ Ñ Ø Ú ÙÒ Ñ ÒØ Ð Ù×ÕÙ Û Ý × Ð × Ù ÒØ ¾¼ Å ØÓ Ó× ÙØ Ð Ø Ö Ó× Ö ÓÐ × ¾ +≡ ´¾ ¿µ ¾ ¾¼ template <class Node> static inline Node * __deway_search(Node * node, int path [], const int & idx, const size_t & size) { if (node == NULL) return NULL; if (path[idx] < 0) // verifique si se ha alcanzado el nodo return node; // avance hasta el pr´ximo hijo path[0] o Node * child = node->get_left_child(); for (int i = 0; i < path[idx] and child != NULL; ++i) child = child->get_right_sibling(); return __deway_search(child, path, idx + 1, size); // siga en pr´ximo nivel o } Ä ÖÙØ Ò Ö ØÓÖÒ NULL × Ð ÒÓ Ó ÓÒ Ð ÒÙÑ ÖÓ Û Ý ×Ô ¬ Ó Ò path[] ÒÓ × Ò Ù ÒØÖ Ò Ð Ö ÓÐ Ð Ö ÓÒ Ø Ð ÒÓ Ó¸ Ò ×Ó ÓÒØÖ Ö Óº Ä ÔÖ Ñ Ø Ú ÒØ Ö ÓÖ × ÔÖ Ú ÔÓÖÕÙ ÙÒ Ú Ö× ÓÒ Ñ × ÓÑÔÐ Ø ¸ ÕÙ Ò ÐÙÝ Ù×ÕÙ Ò ÙÒ Ö ÓÖ × Ò ¸ ÔÙ ÑÔÐ ÒØ Ö× Ø Ð ÓÑÓ × Ù ¾¼ Å ØÓ Ó× ÙØ Ð Ø Ö Ó× Ö ÓÐ × ¾ +≡ ´¾ ¿µ ¾ ¼ ¾ ½ template <class Node> inline Node * deway_search(Node * root, int path [], const size_t & size) { for (int i = 0; root != NULL; i++, root = root->get_right_sibling()) if (path[0] == i) return __deway_search(root, path, 1, size); return NULL; } 4.5.7 C´lculo del n´mero de Deway a u Ò ÑÙ Ó× ÓÒØ ÜØÓ× ¸ ÙÒ ÔÖÓ Ð Ñ ÑÔÓÖØ ÒØ ÓÒ× ×Ø Ò Ù× Ö ÙÒ ÒÓ Ó Ò Ð Ö ÓÐ Ý ÒØÓÒ × Ø ÖÑ Ò Ö ×Ù ÒÙÑ ÖÓ Û Ýº È Ö ÐÐÓ¸ ÔÐ ÒØ ÑÓ× ÙÒ Ö ÓÖÖ Ó ÔÖ ¬ Ó Ð Ò Ô ÖØ ÙÐ Ö Ô Ö ÔÖÓ Ö Ñ × ÕÙ Ö ÕÙ Ö Ò ÓÑÓ ÒØÖ Ð ÒÙÑ ÖÓ ÛÝ ÙÒ ÒÓ Óº
  • 317.
    4.5. Un TADgen´rico para ´rboles e a 291 Ö ÓÐ ÓÒ ÙÒ ÖÖ ÐÓ ÕÙ ÓÒØ Ò Ð ÒÙÑ ÖÓ Û Ý ØÙ Ð Ð ÒÓ Ó Ú × Ø Ó × ÙÒ Ð × Ù ÒØ ÔÖÓØÓØ ÔÓ ¾½ Å ØÓ Ó× ÙØ Ð Ø Ö Ó× Ö ÓÐ × ¾ +≡ ´¾ ¿µ ¾¼ ¾½ template <class Node, class Equal> inline static Node * __search_deway(Node * root, const typename Node::key_type & key, const size_t & current_level, int deway [], const size_t & size, size_t & n); search deway() Ù× Ö ÙÖ× Ú Ñ ÒØ Ò Ð Ö ÓÐ ÙÝ Ö Þ × root Ð Ð Ú keyº ÐÐ Ñ Ö ÙÖ× Ú ¸ × Ò Ö Ñ ÒØ Ð Ò Ú Ð current level¸ Ð Ù Ð × Ù× Ô Ö ØÙ Ð Þ Ö Ð ÒÙÑ ÖÓ Û Ý ÐÑ Ò Ó Ò Ð ÖÖ ÐÓ deway Ý ÙÝ Ô × sizeº Ð Ô Ö Ñ ØÖÓ n Ø Ò × ÒØ Ó × × Ò Ù ÒØÖ Ð Ð Ú Ý ÐÑ Ò Ð ÐÓÒ ØÙ Ð ÒÙÑ ÖÓ Û Ýº Ä ÖÙØ Ò ÒØ Ö ÓÖ × Ò ÔÓÖ Ð × Ù ÒØ ÒØ Ö Þ ÔÙ Ð ¾½ Å ØÓ Ó× ÙØ Ð Ø Ö Ó× Ö ÓÐ × ¾ +≡ ´¾ ¿µ ¾ ½ ¾ ½ template <class Node, class Equal> inline Node * search_deway(Node * root, const typename Node::key_type & key, int deway [], const size_t & size, size_t & n) { n = 1; // valor inicial de longitud de n´mero de Deway u for (int i = 0; root != NULL; i++, root = root->get_right_sibling()) { deway[0] = i; Node * result = __search_deway <Node, Equal> (root, key, 0, deway, size, n); if (result != NULL) return result; } return NULL; } ÆÓ× Ö ×Ø ÔÓÖ ¬Ò Ö Ð ÖÙØ Ò ÕÙ Ö ÓÖÖ Ö Ò ÔÖ ¬ Ó Ð Ö ÓÐ Ð Ù×ÕÙ Ð ÐÚ ¾½ Å ØÓ Ó× ÙØ Ð Ø Ö Ó× Ö ÓÐ × ¾ +≡ ´¾ ¿µ ¾ ½ ¾ ¾ template <class Node, class Equal> inline static Node * __search_deway(Node * root, const typename Node::key_type & key, const size_t & current_level, int deway [], const size_t & size, size_t & n) { if (root == NULL) return NULL; if (Equal () (KEY(root), key)) { n = current_level + 1; // longitud del arreglo deway return root; } Node * child = root->get_left_child(); for (int i = 0; child != NULL; i++, child = child->get_right_sibling()) { deway[current_level + 1] = i; Node * result = __search_deway <Node, Equal> (child, key, current_level + 1, deway, size, n); if (result!= NULL) return result;
  • 318.
    292 Cap´ ´ ıtulo 4. Arboles } return NULL; } 4.5.8 Correspondencia entre Tree Node<T> y ´rboles binarios a Ò ×Ø ×Ù ¹× ÓÒ ÑÔÐ ÒØ Ö ÑÓ× Ð ÓÖÖ ×ÔÓÒ Ò ÒØÖ Ö ÓÐ × m¹Ö Ó× Ý Ò Ö Ó× ÜÔÐ Ñ ÒØ Ð Ð ÓÖ ØÑÓ º ÔÖ × ÒØ Ó Ò Ü º º½ ´Ô Ò ¾ µ½¼ º Ð ÔÖ Ñ Ö Ð ÓÖ ØÑÓ ÕÙ × ÖÖÓÐÐ Ö ÑÓ× × Ö Ð Ð ÓÒÚ Ö× ÓÒ ÙÒ Ö ÓÐ m¹Ö Ó¸ ÑÔÐ ÒØ Ó Ñ ÒØ Ð Ì Tree Node<T>¸ ÙÒ Ö ÓÐ Ò Ö Ó ÑÔÐ ÒØ Ó ØÖ Ú × Ð Ì BinNode<Key>º Ù Ò Ó ÑÓ× ÑÔÐ ÒØ Ó ØÖ Ú × Ð Ì ººº ¸ ÒÓ× Ö Ö ÑÓ× ÕÙ Ð Ö ÓÐ m¹Ö Ó Ý Ò Ö Ó × ÙÒ Ñ ÒØ Ò Ò Ð × Ð × × Tree Node<T> Ý BinNode<Key>¸ Ö ×Ô Ø Ú Ñ ÒØ ¸ Ô ÖÓ no necesariamente son exactamente de estas dos clases¸ × ÒÓ ÕÙ ¸ ÔÙ Ö Ò × Ö¸ ÔÓÖ ÑÔÐÓ¸ Ð × × Ö Ú ×º Ä ÓÒÚ Ö× ÓÒ ÙÒ Ö ÓÐ m¹Ö Ó ÙÒÓ Ò Ö Ó × ÜÔÖ × Ö Ø Ñ ÒØ × ÙÒ Ð × Ô ÙØ × Ð Ð ÓÖ ØÑÓ º × Ö¸ Ò Ð Ö ÓÐ Ò Ö Ó¸ ØÓ Ö Ñ ÞÕÙ Ö ÓÖÖ ×ÔÓÒ ÙÒ Ó Ñ × Ð ÞÕÙ Ö Ð Ö ÓÐ m¹Ö Ó Ñ ÒØÖ × ÕÙ ØÓ Ö Ñ Ö ÓÖÖ ×ÔÓÒ Ð × Ù ÒØ ÖÑ ÒÓº Ë ÙÒ ×ØÓ× Ð Ò Ñ ÒØÓ׸ Ð ÑÔÐ ÒØ ÓÒ Ö ×ÙÐØ ÒØ × ÓÑÓ × Ù ¾¾ Å ØÓ Ó× ÙØ Ð Ø Ö Ó× Ö ÓÐ × ¾ +≡ ´¾ ¿µ ¾ ½ ¾ ¾ template <class TNode, class BNode> BNode * forest_to_bin(TNode * root) { if (root == NULL) return BNode::NullPtr; BNode * result = new BNode (root->get_key()); LLINK(result) = forest_to_bin<TNode, BNode>(root->get_left_child()); RLINK(result) = forest_to_bin<TNode, BNode>(root->get_right_sibling()); return result; } Ä ÖÙØ Ò Ñ Ò Ó× Ø ÔÓ× Ò Ö Ó׺ Ð ÔÖ Ñ ÖÓ¸ TNode¸ × ÙÒ ÒÓ Ó m¹Ö Ó × Ó Ò Ð Ì Tree Node<T>º Ð × ÙÒ Ó Ø ÔÓ × BNode¸ Ð Ù Ð Ö ÔÖ × ÒØ Ð ÒÓ Ó Ò Ö Ó Ý ×Ø Ö × Ó Ò BinNode<Key>º Ä Ú Ö ¬ ÓÒ ×ØÓ× Ø ÔÓ× × Ö Ð Þ ÑÔÐ Ø Ñ ÒØ Ò Ø ÑÔÓ Òר Ò ÓÒ Ð ÔÐ ÒØ ÐÐ Ù Ò Ó × ÓÑÔ Ð Ò Ð × ØÖ × Ô ÒÙÐØ Ñ × Ð Ò × Ý × Ú Ö ¬ Ð Ü ×Ø Ò ÐÓ× Ñ ØÓ Ó× ÕÙ × ÒÚÓ Òº Ä ÓÒÚ Ö× ÓÒ ÙÒ Ö ÓÐ Ò Ö Ó ÙÒÓ m¹Ö Ó × ÙÒ ÔÓ Ó Ñ × Ð ÓÖ Ó× Ö ÞÓÒ ÔÓÖ Ð Ù Ð ÒÓ× ÓÒÚ Ò × ÓÑÔÓÒ ÖÐ Ò ÖÙØ Ò × ×Ô ¬ × Ý × Ô Ö × ÕÙ ØÙ Ò ÓÒ × ÓÒ Ö Ø × Ý ÑÓ ÙÐ Ö Þ ×º Ò ×Ø × ÒØ Ó¸ Ý Ó× ÓÒ × Ô Ö ÙÒ Tree Node<T> ½º ÁÒ× Ö ÓÒ ÔÖ ÑÓ Ò ØÓ ÓÑÓ Ý ÐÓ × ÑÓ׸ Ò ÙÒ Ö ÓÐ Ò Ö Ó ÙÒ Ö Ñ ÞÕÙ Ö Ö ÔÖ × ÒØ ÙÒ ÔÖ ÑÓ Ò ØÓ Ò Ð Ö ÓÐ m¹Ö Ó ÕÙ Ú Ð ÒØ º Ù Ò Ó Ò ÙÒ ÒÓ Ó Ò Ö Ó Ñ Ö ÑÓ× ×Ù Ó ÞÕÙ Ö Ó ÐÓ Ò× ÖØ ÑÓ× Ò Ð Ö ÓÐ m¹Ö Ó ÓÑÓ ÔÖ ¹ ÑÓ Ò ØÓº ר ÑÓ Ó¸ ÔÐ ÒØ ÑÓ× Ð ×Ù ÖÙØ Ò × Ù ÒØ ¾¾ Å ØÓ Ó× ÙØ Ð Ø Ö Ó× Ö ÓÐ × ¾ +≡ ´¾ ¿µ ¾ ¾ ¾ ¿ template <class TNode, class BNode> inline static void insert_child(BNode * lnode, TNode * tree_node) Ò Ð × ÒÓ ÑÔÐ ÒØ ÓÒ Ð × ÙÒ ÓÒ × ÜÔÐ ½¼ × Ò ×Ø ×Ù ¹× ÓÒ × Ñ Ò ×Ø Ö × Ò Ð Ö Ð Ô ÖØ Ô ÓÒ ÙÒ Ñ ÒØ Ð ÂÙ Ò Ù ÒØ ׺
  • 319.
    4.5. Un TADgen´rico para ´rboles e a 293 { if (lnode == BNode::NullPtr) return; TNode * child = new TNode(KEY(lnode)); tree_node->insert_leftmost_child(child); } Ð Ô Ö Ñ ØÖÓ lnode × ÙÒ ÒÓ Ó Ò Ö Ó ÕÙ × Ó ÞÕÙ Ö Óº Ð Ô Ö Ñ ØÖÓ tree node × ÙÒ ÒÓ Ó m¹Ö Ó ÕÙ Ú Ð ÒØ Ð ÒÓ Ó Ò Ö Ó Ô Ö lnodeº ¾º ÁÒ× Ö ÓÒ ÖÑ ÒÓ Ò ÐÓ Ñ ÒØ ¸ Ù Ò Ó Ò Ð ÒÓ Ó Ò Ö Ó Ñ Ö ÑÓ× ×Ù Ó Ö Ó ÐÓ Ò× ÖØ ÑÓ× Ò Ð Ö ÓÐ m¹Ö Ó ÓÑÓ ×Ù ÖÑ ÒÓ Ö Óº ×ØÓ ÓÒ Ù Ð × Ù ÒØ ×Ù ÖÙØ Ò ¾¿ Å ØÓ Ó× ÙØ Ð Ø Ö Ó× Ö ÓÐ × ¾ +≡ ´¾ ¿µ ¾ ¾ ¾ ¿ template <class TNode, class BNode> inline static void insert_sibling(BNode * rnode, TNode * tree_node) { if (rnode == BNode::NullPtr) return; TNode * sibling = new TNode(KEY(rnode)); tree_node->insert_right_sibling(sibling); } Ð Ô Ö Ñ ØÖÓ rnode × ÙÒ ÒÓ Ó Ò Ö Ó ÕÙ × Ó Ö Óº Ð Ô Ö Ñ ØÖÓ tree node × ÙÒ ÒÓ Ó m¹Ö Ó ÕÙ Ú Ð ÒØ Ð ÒÓ Ó Ò Ö Ó Ô Ö rnodeº ÓÖ ×Ø ÑÓ× Ð ×ØÓ× Ô Ö ÑÔÐ ÒØ Ö Ð Ð ÓÖ ØÑÓ ÕÙ Ð ÙÐ Ð Ö ÓÐ m¹Ö Ó ÕÙ Ú Ð ÒØ ÙÒÓ Ò Ö Ó ¾¿ Å ØÓ Ó× ÙØ Ð Ø Ö Ó× Ö ÓÐ × ¾ +≡ ´¾ ¿µ ¾ ¿ ¾ ¿ template <class TNode, class BNode> inline static void bin_to_tree(BNode * broot, TNode * troot) { if (broot == BNode::NullPtr) return; insert_child(LLINK(broot), troot); TNode * left_child = troot->get_left_child(); bin_to_tree(LLINK(broot), left_child); insert_sibling(RLINK(broot), troot); TNode * right_sibling = troot->get_right_sibling(); bin_to_tree(RLINK(broot), right_sibling); } Ð Ô Ö Ñ ØÖÓ broot × Ð Ö Þ ÙÒ Ö ÓÐ Ò Ö Ó ÙÒ Ñ ÒØ Ó Ò Ð Ì BinNode<Key>º Ð Ô Ö Ñ ØÖÓ troot × Ð Ö Þ ÙÒ Ö ÓÐ m¹Ö Ó¸ ÙÒ Ñ ÒØ Ó Ò ÐÌ Tree Node<T>¸ ÕÙ Ú Ð ÒØ brootº Ò ÐÑ ÒØ ¸ Ð ÒØ Ö Þ ÔÙ Ð Ý ¬Ò Ø Ú ÕÙ Ö Ð Ö Þ Ò Ð Ý ×Ô Ö Ð ÓÒ¹ רÖÙ ÓÒ Ö ÙÖ× Ú ¸ × ¬Ò Ð × Ù ÒØ ÓÖÑ ¾¿ Å ØÓ Ó× ÙØ Ð Ø Ö Ó× Ö ÓÐ × ¾ +≡ ´¾ ¿µ ¾ ¿ template <class TNode, class BNode> inline TNode * bin_to_forest(BNode * broot) {
  • 320.
    294 Cap´ ´ ıtulo 4. Arboles if (broot == BNode::NullPtr) return NULL; TNode * troot = new TNode (KEY(broot)); bin_to_tree(broot, troot); return troot; } 4.6 Algunos conceptos matem´ticos de los ´rboles a a ÄÓ× Ö ÓÐ × × Ò Ù ÒØÖ Ò ÒØÖ Ð × ×ØÖÙ ØÙÖ × Ñ × ÒØ Ö × ÒØ × Ý ÓÑÔÐ × Ð Ñ Ø Ñ Ø ÓÑ Ò ØÓÖ º Ê ÕÙ Ö ÑÓ׸ × Ò Ñ Ö Ó¸ ÙÒ ÓÖÔÙ× Ñ Ø Ñ Ø Ó¸ Ñ Ò ÑÓ¸ ÕÙ ÒÓ× Ô ÖÑ Ø ÓÖ Ö Ð Ò Ð × × Ð × Ö ÒØ × ×ØÖÙ ØÙÖ × Ö ÓÐ ÕÙ ÐÙ Ó ×ØÙ ¹ Ö ÑÓ׺ ÆÓ× ÓÒ ÖÒ ÓÒÓ Ö ÕÙ Ø ÒØÓ ÙÒ Ö ÓÐ × Ô Ö ÙÒ Ö Óи Ô٠׸ Ô Ö Ð ÙÒ × × ØÙ ÓÒ × ÓÑÔÙØ ÓÒ Ð ×¸ Ñ ÒØÖ × Ñ × ÙÒ Ö ÓÐ × ÙÒ Ö Óи ÒØÓÒ × Ñ × ¬ ÒØ × ×Ù ÙØ Ð Þ ÓÒº ÆÓØ ÑÓ× ÕÙ ÙÒ Ð ×Ø Ð Ñ ÒØÓ× Ò Ò Ð ÓÒ ÔØÓ Ö ÓÐ ÑÔ ÖÓ¸ Ó Ú Ñ ÒØ × ÐÓ× Ö ÓÐ × ØÙÚ × Ò ØÓÔÓÐÓ × × Ñ Ð Ö × Ð × Ð ×Ø ׸ ÒØÓÒ × × Ö ÔÖ Ö Ð ÙØ Ð Þ Ö Ð ×Ø ׺ 4.6.1 Altura de un ´rbol a ÍÒ ÔÖ Ñ Ö Ò ÓÖ Ö ÕÙ Ø Ò Ù ÒÓ ÔÙ × Ö ÙÒ Ö ÓÐ × ÓÒÓ Ö Ð × ÐØÙÖ × ÔÓ× Ð × Ò ÙÒ ÓÒ Ð ÒÙÑ ÖÓ ÒÓ Ó׸ Ô Ö ÐÐÓ × ÙØ Ð ×ØÙ Ö Ð × Ù ÒØ ÔÖÓÔÓ× ÓÒº Proposici´n 4.1 o Ë T ÙÒ Ö ÓÐ m¹Ö Ó ÓÒ n ÒÓ Ó׺ ÒØÓÒ × ÐÓ m (n(m − 1) + 1) ≤ h(T ) ≤ n ´ º½ µ Demostraci´n o ¯ h(T ) ≥ ÐÓ m (n(m − 1) + 1) Ä ÐØÙÖ ÙÒ Ö ÓÐ × Ñ Ò Ñ Ù Ò Ó Ð ÒÙÑ ÖÓ ÒÓ Ó× ÓÑÔÐ ØÓ× × Ñ Ü ÑÓº È Ö ÓÑÔÖ Ò Ö ×ØÓ¸ ÓÒ× Ö ÑÓ× ÓÒרÖÙ Ö ÔÖÓ Ö × Ú Ñ ÒØ ÙÒ Ö ÓÐ m¹Ö Ó Ú ¹ Ø Ò Ó Ò ÐÓ ÔÓ× Ð ÙÑ ÒØ Ö ×Ù ÐØÙÖ º Ô ÖØ Ö Ð Ö ÓÐ Ú Ó¸ ×ÓÐÓ ÔÓ ÑÓ× ÓÐÓ Ö Ð ÒÓ Ó Ö Þº ÄÙ Ó¸ Ø Ò ÑÓ× m ×Ô Ó× ×ÔÓÒ Ð × Ò Ð Ò Ú Ð 1º ÈÓר ¹ Ö ÓÖÑ ÒØ ¸ ÙÒÓ ÐÓ× m ÒÓ Ó× Ð Ò Ú Ð 1 Ø Ñ Ò Ø Ò m Ð × ×ÔÓÒ Ð × ÕÙ ×Ø Ö Ò Ò Ð Ò Ú Ð 2 × Ö m × m Ð × ÕÙ ÔÙ Ò ÓÐÓ Ö× Ò Ð Ò Ú Ð 2º ÓÒØ ÒÙ Ò Ó ×Ø Ð Ò Ö ÞÓÒ Ñ ÒØÓ¸ × Ð Ó × ÖÚ Ö ÕÙ Ò Ú Ð i ÔÙ ÓÒØ Ò Ö ÐÓ ×ÙÑÓ mi ÒÓ Ó׺ ÈÓÖ Ø ÒØÓ¸ Ð ÒÙÑ ÖÓ ÒÓ Ó× ÙÒ Ö ÓÐ ÓÒרÖÙ Ó ×Ø ÓÖÑ ÔÙ ÜÔÖ × Ö× ÓÑÓ h(T)−1 n≤ mi = m0 + m1 + m2 + · · · + mh(T)−1 ´ º½ µ i=0 ÅÙÐØ ÔÐ Ò Ó ´ º½ µ ÔÓÖ m Ø Ò ÑÓ× h(T)−1 mn≤ = m1 + m2 + · · · + mh(T)−1 + mh(T) ´ º½ µ i=0
  • 321.
    4.6. Algunos conceptosmatem´ticos de los ´rboles a a 295 Ê ×Ø Ò Ó ´ º½ µ Ñ ÒÓ× ´ º½ µ¸ Ø Ò ÑÓ× m n − n ≤ mh(T) − 1 =⇒ n(m − 1) + 1 ≤ mh(T) =⇒ ÐÓ m (n(m − 1) + 1) ≤ h(T ) ¯ h(T ) ≤ n È Ö ×Ø ×Ó¸ × Ù ÑÓ× Ð Ð Ò Ö ÞÓÒ Ñ ÒØÓ ÒÚ Ö× Ð ÔÙÒØÓ ÒØ Ö ÓÖ × Ö¸ ÓÒרÖÙ ÑÓ× ÔÖÓ Ö × Ú Ñ ÒØ ÙÒ Ö ÓÐ m¹Ö Ó ØÖ Ø Ò Ó × ÑÔÖ ÙÑ ÒØ Ö ×Ù ÐØÙÖ º Ì Ð Ö ÓÐ × ÕÙ Ð ÕÙ Ø Ò Ü Ø Ñ ÒØ n Ò Ú Ð × Ý ÙÒ ÒÓ Ó ÔÓÖ Ò Ú Ðº È٠׸ ר Ö ÓÐ Ø Ò ÐØÙÖ n ר ÔÖÓÔÓ× ÓÒ Ö Ú Ð ÓØ × Ô Ö Ð Ñ × ÓÖØÓ Ý Ð Ö Ó Ñ ÒÓ × Ð Ö Þ ×Ø ÙÒ Ó Ò ÙÒ ÓÒ Ð Ö Ò Ð Ð Ö Óк ËÙÔÓÒ Ò Ó n ÒÓ Ó׸ Ð Ö ÓÐ Ñ × ÓÖØÓ ÔÓ× Ð Ø Ò ÐØÙÖ h(T ) = ÐÓ m (n(m − 1) + 1) ¸ Ñ ÒØÖ × ÕÙ Ð Ñ × ÐØÓ h(T ) = nº ÄÓ× Ö ÓÐ × ÓÒ ÐØÙÖ Ñ Ò Ñ ×ÓÒ Ö Ò ÑÔÓÖØ Ò ÓÑÔÙØ ÓÒ Ð¸ ÔÙ × ÐÐÓ× Ö ÒØ Þ Ò Ð Ñ ÝÓÖ ¬ Ò ÑÙ Ó× ÐÓ× Ð ÓÖ ØÑÓ× ×Ó Ö Ö ÓР׺ Ð ØÙ и Ü ×Ø Ò ÔÓ Ó× ×ÕÙ Ñ × Ò ÐÓ× Ù Ð × × ÔÙ Ö ×ØÖ Ò Ö Ð ÐØÙÖ ¸ Ò Ñ Ý ¬ ÞÑ ÒØ ¸ Ô Ö ÕÙ ×Ø × Ñ Ò Ñ º × Ô٠׸ ÑÙ × Ú × × Ò × Ö Ó Ñ ÒØ Ò Ö Ö ÓÐ × ÙÝ ÐØÙÖ ÒÓ × Ñ Ò Ñ º Ä Ð ×Ø ÙÐØ Ñ Ð × Ö ÓÐ × × Ñ Ò ÕÙ Ø ÒØÓ ×ØÓ× Ö ÓÐ × × Ö Ò ÐÓ× ÐØÙÖ Ñ Ò Ñ Ý ÒÓ Ö ÐÑ ÒØ ÔÓÖ Ð Ú ÐÓÖ ×Ù ÐØÙÖ º Ê ÕÙ Ö ÑÓ׸ ÒØÓÒ ×¸ ÙÒ Ñ ÓÒ Ð ÕÙ ÒÓ× Ò ÕÙ ÕÙ Ø Ò Ù ÒÓ × Ð Ö Óк Ð Ñ Ö Ó ÓÒ ÔØÙ Ð ×Ø Ñ × ÒÓÑ Ò ÐÓÒ ØÙ Ð Ñ ÒÓ ÒØ ÖÒÓ» ÜØ ÖÒÓ ¸ Ý × ÒÙÒ Ö Ò Ð ×Ù ¹× ÓÒ × Ù ÒØ º 4.6.2 Longitud del camino interno/externo Definici´n 4.3 (Nodo externo) Ë T ÙÒ Ö ÓÐ m¹Ö Ó o ÓÒ n ÒÓ Ó× Ý × ni Ð ÙÒ ÒÓ Ó Ò ÓÑÔÐ ØÓ T Ø Ð ÕÙ Ö Ó(ni) = m < mº ÒØÓÒ ×¸ ÐÓ× ÒÓ Ó× ÜØ ÖÒÓ× ni × ¬Ò Ò ÓÑÓ ÐÓ× Ö Ó(ni) − m ×Ù Ö ÓÐ × ÐØ ÒØ ׺ Ò ÓØÖ × Ô Ð Ö ×¸ ÙÒ ÒÓ Ó ÜØ ÖÒÓ × ØÓ Ó ÔÙÒØ ÖÓ ÒÙÐÓº ÓÒ× Ù ÒØ Ñ ÒØ ¸ ÙÒ ÒÓ Ó ÒØ ÖÒÓ × ØÓ Ó ÒÓ Ó Ô ÖØ Ò ÒØ Ð Ö Óк Ñ ÒÙ Ó × ÓÒÚ Ò ÒØ Ý Ñ × Ð Ò Ð Þ Ö ÙÒ Ö ÓÐ ÓÒ ÙÒ Ú Ö× ÓÒ ×Ô Ð Ò ÕÙ × ÑÙ ×ØÖ Ò ØÓ Ó× ×Ù× ÒÓ Ó× ÜØ ÖÒÓ׺ ÌÖ ÓÒ ÐÑ ÒØ ¸ ÐÓ× ÒÓ Ó× ÒØ ÖÒÓ× × Ö ÔÖ × Ò¹ Ø Ò ÓÒ Ö ÙÐÓ× Ý ÐÓ× ÜØ ÖÒÓ× ÓÒ Ð Ò × ÓÖ ÞÓÒØ Р׺ Ä ¬ ÙÖ º¾¾ ÐÙ×ØÖ Ð Ú Ö× ÓÒ ÜØ Ò ÙÒ Ö ÓÐ Ò Ö Óº ÙÖ º¾¾ Ö ÓÐ Ò Ö Ó ÜØ Ò Ó ÈÓÖ ØÖ ÓÒ¸ Ò ÜÔÖ × ÓÒ × Ð Ö ×¸ ÙÒ ÒÓ Ó ÒØ ÖÒÓ × ÒÓØ ÓÑÓ ni Ý ÙÒÓ ÜØ ÖÒÓ ÓÑÓ nxº
  • 322.
    296 Cap´ ´ ıtulo 4. Arboles Proposici´n 4.2 o Ë T ÙÒ Ö ÓÐ m¹Ö Ó ÓÒ n ÒÓ Ó× ÒØ ÖÒÓ׺ ÒØÓÒ ×¸ Ð ÒÙÑ ÖÓ ÒÓ Ó× ÜØ ÖÒÓ× × (m − 1) n + 1 ´ º½ µ Demostraci´n o × Ð ÖÓ ÕÙ Ü ×Ø Ò m × n ÔÙÒØ ÓÖ ×º ÐÓ× n ÒÓ Ó׸ n − 1 Ø Ò Ò Ô Ö ´Ð Ö Þ ÒÓµº Ü ×Ø Ò¸ ÒØÓÒ ×¸ n − 1 Ö Ñ × Ó ÔÙÒØ ÓÖ × Ö ÒØ × ÒÙÐÓ¸ ÔÓÖ ÐÓ ÕÙ Ð ÒÙÑ ÖÓ ÒÓ Ó× ÜØ ÖÒÓ× ×Ø Ö Ó ÔÓÖ Ð ØÓØ Ð ÔÙÒØ ÓÖ × Ñ ÒÓ× Ð ÒØ ÔÙÒØ ÓÖ × ÒÓ ÒÙÐÓ׺ ×ØÓ × mn − (n − 1) = (m − 1)n + 1 ÈÓÖ Ð ÔÖÓÔÓ× ÓÒ º¾¸ Ô Ö ÙÒ Ö ÓÐ Ò Ö Ó n ÒÓ Ó׸ Ü ×Ø Ò 2n ÔÙÒØ ÓÖ ×¸ n−1 ÔÙÒØ ÓÖ × ÒÓ Ó× ÒØ ÖÒÓ× Ý n + 1 ÒÓ Ó× ÜØ ÖÒÓ׺ Definici´n 4.4 (Cardinalidad del nivel) Ë o T ÙÒ Ö ÓÐ m¹Ö Ó¸ ÒØÓÒ × Ð Ö Ò ¹ Ð Ð Ò Ú Ð i¸ ÒÓØ |nivel(i)|¸ × ¬Ò ÓÑÓ Ð ÒÙÑ ÖÓ ÒÓ Ó× ÒØ ÖÒÓ× Ò Ð Ò Ú Ð iº Definici´n 4.5 (Longitud del camino interno/externo) Ë T ÙÒ Ö ÓÐ m¹Ö Ó o ÓÒ n ÒÓ Ó׺ Ä ÐÓÒ ØÙ Ð Ñ ÒÓ ÒØ ÖÒÓ Ð Ö ÓÐ T ¸ ÒÓØ ÓÑÓ ÁÈÄ(T )¸ × ¬Ò ÓÑÓ ÁÈÄ(T ) = Ò Ú Ð(ni) = i × | Ò Ú Ð (i)| ´ º¾¼µ ∀ni ∈T ∀i ni ÒÓ Ó ÒØ ÖÒÓ Ò ÐÓ Ñ ÒØ ¸ Ð ÐÓÒ ØÙ Ð Ñ ÒÓ ÜØ ÖÒÓ¸ ÒÓØ ÓÑÓ ÈÄ(T )¸ × ¬Ò ÓÑÓ ÈÄ(T ) = Ò Ú Ð(nx) ´ º¾½µ ∀nx ∈T nx ÒÓ Ó ÜØ ÖÒÓ È Ö Ð Ö ÓÐ Ð ¬ ÙÖ º¾¾¸ Ð ÐÓÒ ØÙ Ð Ñ ÒÓ ÒØ ÖÒÓ × ÁÈÄ(T ) = 0 + 1 + 1 + 2 + 2 + 2 + 2 + 3 + 3 + 3 = 19 Ý Ð ÐÓÒ ØÙ Ð Ñ ÒÓ ÜØ ÖÒÓ × ÈÄ(T ) = 3 + 3 + 3 + 3 + 3 + 4 + 4 + 4 + 4 + 4 + 4 = 39 Ð Ð ÙÐÓ Ð ÐÓÒ ØÙ Ð Ñ ÒÓ × ÙÒ Ñ ÒØ Ð Ô Ö Ð Ò Ð × × ÑÔ Ö Ó ¹ × ÑÔ ÒÓ Ð ÓÖ ØÑÓ× × Ó× Ò Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ ÙÒ Ð × Ö ÓÐ Ò Ö Ó ×Ô Ð ÕÙ ×ØÙ Ö ÑÓ× Ñ × Ð ÒØ º ×ØÓ Ùר ¬ × Ò Ö ÙÒ ÔÖ Ñ Ø Ú ÕÙ Ð ÙÐ Ð ÁÈÄ ¾ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¾ ¾ template <class Node> inline static size_t __internal_path_length(Node * p, const size_t & level) { if (p == Node::NullPtr) return 0; return level + __internal_path_length(LLINK(p), level + 1) + __internal_path_length(RLINK(p), level + 1); }
  • 323.
    4.6. Algunos conceptosmatem´ticos de los ´rboles a a 297 Ð Ô Ö Ñ ØÖÓ level Ò Ð Ò Ú Ð ØÙ Ð Ð ÒÓ Ó Ú × Ø Ó Ý Ø Ñ Ò Ò Ð Þ Ö× Ò ÖÓº Ä ÒØ Ö Þ ÔÙ Ð internal path length rec() ÙÒ ÔÙ × ÛÖ ÔÔ Ö ÕÙ ÙØ Ð ÐÐ Ñ Ò Ð ¾ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¾ ¿¿¾ template <class Node> inline size_t internal_path_length(Node * p) { return __internal_path_length(p, 0); } Proposici´n 4.3 o Ë T ÙÒ Ö ÓÐ m¹Ö Ó¸ ÒØÓÒ × m |T | = |T i| + 1 ´ º¾¾µ i=1 m ÁÈÄ(T ) = ÁÈÄ(T i) + |T | − 1 ´ º¾¿µ i=1 m ÈÄ(T ) = ÈÄ(T i) + (m − 1)|T | + 1 ´ º¾ µ i=1 Demostraci´n o È Ö ´ º¾¾µ¸ × Ú ÒØ ÕÙ |T | × Ð ×ÙÑ Ð × Ö Ò Ð × ×Ù× ×Ù Ö ÓÐ × Ñ × ×Ù Ö Þº Ò Ù ÒØÓ ´ º¾¿µ¸ ÒÓØ ÑÓ× ÕÙ Ð ÒÓ Ó Ö Þ T ÒÓ Ø Ò Ò Ò Ò Ð ÐÓÒ ØÙ Ð Ñ ÒÓ¸ ÔÙ × ×Ù Ò Ú Ð × 0º Ù Ò Ó Ð ÙÐ ÑÓ× Ð × ÐÓÒ ØÙ × ÐÓ× Ñ ÒÓ× ÐÓ× ×Ù Ö ÓÐ × T ¸ ×ÙÑ ÑÓ× ÕÙ ÐÓ× ÒÓ Ó× ×Ø Ò ÙÒ Ò Ú Ð Ò Ö ÓÖ × Ö¸ ÒÓ Ó × ×ÙÑ Ó Ò ÙÒ Ò Ú Ð Ñ ÒÓ׺ ÈÓÖ ÑÔÐÓ¸ Ð Ö Þ T i¸ ÕÙ Ò T ר Ò Ð Ò Ú Ð 1 × ÔÓÒ Ö ÓÒ 0 Ò ÐÙ Ö 1 ÐÓ Ñ ×ÑÓ ×Ù ÓÒ Ð Ö ×ØÓ ÐÓ× ÒÓ Ó׺ × Ô٠׸ Ô Ö Ó Ø Ò Ö Ð Ú ÐÓÖ ÁÈÄ(T )¸ ÑÓ× ×ÙÑ Ö 1 ÒÓ Ó ÓÒ× Ö Ó × Ö¸ Ð ÒØ ÒÓ Ó× |T | − 1¸ ÔÙ × Ð Ö Þ ÒÓ Ù ÒØ º Ò ÐÑ ÒØ ¸ Ô Ö ´ º¾ µ¸ Ð Ö ÞÓÒ Ñ ÒØÓ × Ü Ø Ñ ÒØ Ð Ñ ×ÑÓ ÕÙ Ô Ö ´ º¾¿µ¸ ×ÓÐÓ ÕÙ Ð ÒÙÑ ÖÓ ÒÓ Ó× ÜØ ÖÒÓ× ×¸ × ÙÒ ´ º½ µ ´ÔÖÓÔÓ× ÓÒ º¾µ¸ (m − 1)|T | + 1 ר × ÒØ × ×ÓÒ ÙÒ Ñ ÒØÓ× ÑÙ × Ð × ÑÓ×ØÖ ÓÒ × ÒÚÓÐÙ Ö × Ò ÐÓ× Ö ÓР׺ Proposici´n 4.4 o Ë T ÙÒ Ö ÓÐ m¹Ö Óº ÒØÓÒ × ÈÄ(T ) = (m − 1) ÁÈÄ(T ) + m |T | ´ º¾ µ Demostraci´n (por inducci´n sobre la cardinalidad de T ) o o ×ÙÑ Ö ÑÓ× ÕÙ k Ö ÔÖ × ÒØ Ð Ö Ò Ð ÙÒ Ö ÓÐ Tkº ¯ |Tk| = 0 Ò ×Ø ×Ó¸ ÈÄ(T0) = (m − 1) ÁÈÄ(T0) + m |T0| = 0º Ä ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö Ð ×Ó × º ¯ |Tk+1| = k + 1 Ò ×Ø ×Ó¸ ×ÙÑ ÑÓ× ÕÙ Ð ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö ØÓ Ó k Ý ÔÖÓ ÑÓ× Ú Ö ¬ Ö × × ÖØ Ô Ö k + 1º
  • 324.
    298 Cap´ ´ ıtulo 4. Arboles ÓÑ ÒÞ ÑÓ× ÔÓÖ ÔÐ ÒØ Ö Ð Ö ×Ø Ð Ù ÓÒ ´ º¾ µ Ñ ÒÓ× ´ º¾¿µ Ò ÙÒ ÓÒ ÐÓ× Ö ×ÙÐØ Ó× Ð ÔÖÓÔÓ× ÓÒ º¿ ´ Ù ÓÒ × ´ º¾ µ Ý ´ º¾¿µµ m m ÈÄ(Tk+1 ) − ÁÈÄ(Tk+1 ) = ÈÄ(Tk+1 ) + (m − 1)|Tk+1 | + 1 − i ÁÈÄ(Tk+1 ) + |Tk+1 | − 1 i i=1 i=1 m m = ÈÄ(Tk+1 ) + (m − 1)(k + 1) + 1 − i ÁÈÄ(Tk+1 ) − (k + 1) + 1 i i=1 i=1 m m = ÈÄ(Tk+1 ) + mk + m − 2k − i ÁÈÄ(Tk+1 ) i ´ º¾ µ i=1 i=1 ÓÖ ÔÐ ÑÓ× Ð ÔÓØ × × Ò Ù Ø Ú ×Ó Ö Ð Ø ÖÑ ÒÓ m i=1 ÈÄ(Tk+1) i m m ÈÄ(Tk+1 ) − ÁÈÄ(Tk+1 ) = (m − 1) ÁÈÄ(Tk+1 ) + m|Tk+1 | + mk + m − 2k − i i ÁÈÄ(Tk+1 ) i i=1 i=1 m m m = (m − 1) ÁÈÄ(Tk+1 ) + m i |Tk+1 | + mk + m − 2k − i ÁÈÄ(Tk+1 ) i i=1 i=1 i=1 m = (m − 2) ÁÈÄ(Tk+1 ) + 2mk + m − 2k i ´ º¾ µ i=1 ÆÓØ ÑÓ× ÕÙ ¸ ÔÓÖ ´ º¾¾µ¸ m |Tk+1| = (k+1)−1 = kº Ä ×ÙÑ ØÓÖ m ÁÈÄ(Tk+1) i i ÔÙ Ö ÑÔÐ Þ Ö× ÔÓÖ ÁÈÄ(Tk+1) − k¸ ÕÙ × Ð Ö ×ÙÐØ Ó ×Ô Ö Ð ×ÙÑ ØÓÖ i=1 i=1 ´ º¾¿µ Ú ÐÙ Ò Tk+1 ÈÄ(Tk+1 ) − ÁÈÄ(Tk+1 ) = (m − 2)(ÁÈÄ(Tk+1 ) − k) + 2mk + m − 2k = (m − 2) ÁÈÄ(Tk+1 ) − mk + 2k + 2mk + m − 2k =⇒ ÈÄ(Tk+1 ) = (m − 1) ÁÈÄ(Tk+1 ) + m(k + 1) ´ º¾ µ ÕÙ × Ð Ñ ×Ñ ÜÔÖ × ÓÒ Ð ÔÖÓÔÓ× ÓÒ Ú ÐÙ Ô Ö k + 1 ÒÓ Ó× ×Ø ÔÖÓÔÓ× ÓÒ ÒÓ× ÝÙ Ö ×ØÙ Ö ÐÓ× Ð Ñ Ø × Ö Ð ÓÒ Ó× ÓÒ Ð ÐÓÒ ØÙ Ð Ñ ÒÓ¸ ÐÓ× Ù Ð × × ×Ø Ð Ò Ò Ð × Ù ÒØ ÔÖÓÔÓ× ÓÒº Proposici´n 4.5 o Ë T ÙÒ Ö ÓÐ m¹Ö Ó n ÒÓ Ó׺ ÒØÓÒ × ÐÓ m (n(m − 1)) m ÐÓ m (n(m−1)+1) + mn ≤ ÁÈÄ(T ) ≤ n(n − 1) ´ º¾ µ m−1 2 Demostraci´n È Ö o ÑÓ×ØÖ Ö ÁÈÄ(T ) ≤ 2 ¸ ÔÐ ÒØ ÑÓ× Ð ÐÓÒ ØÙ Ð n(n+1) Ñ ÒÓ Ð Ö ÓÐ Ñ ÝÓÖ ÐØÙÖ ÔÓ× Ð º Ì Ð Ö ÓÐ × ÕÙ Ð ÙÝÓ× ÒÓ Ó׸ ÓÒ Ü Ô ÓÒ Ð Ö Þ Ý Ð Ó ¸ ×ÓÐÓ Ø Ò Ò ÙÒ Ö Ñ º Ä ÐÓÒ ØÙ Ð Ñ ÒÓ ×Ø Ö ÓÐ ×Ø ÔÓÖ n n(n − 1) ÁÈÄ(T ) = i= 2 i=0 È Ö ÑÓ×ØÖ Ö Ð ÓØ Ò Ö ÓÖ ÔÐ ÒØ ÑÓ× Ð ÐÓÒ ØÙ Ð Ñ ÒÓ ÜØ ÖÒÓ Ð Ö ÓÐ ÐØÙÖ Ñ Ò Ñ h Ò ÙÒ ÓÒ Ð ÔÖÓÔÓ× ÓÒ º ´Ô º ¾ µ ÈÄ(T ) ≤ hmh = (m − 1) ÁÈÄ(T ) + mn =⇒ hmh + mn ÁÈÄ(T ) ≥ m−1 ´ º¿¼µ
  • 325.
    4.6. Algunos conceptosmatem´ticos de los ´rboles a a 299 ÈÓÖ Ð ÔÖÓÔÓ× ÓÒ º½ ´Ô º ¾ µ¸ ÓÒÓ ÑÓ× Ð Ú ÐÓÖ Ñ Ò ÑÓ hº ËÙר ØÙ ÑÓ׸ Ô٠׸ Ð Ô ÖØ ÞÕÙ Ö ´ º½ µ Ò ´ º¿¼µ ÁÈÄ(T ) ≥ ÐÓ m (n(m − 1)) m ÐÓ (n(m−1)+1) + mn m m−1 ÎÖ × Ð×× Ö ÓÐ × ÒÓ ÓØ Ò Ð ÐØÙÖ ¸ Ô ÖÓ ×ÓÒ¸ Ò ÓÖÑ ¸ Ù ÒÓ׺ Ð ÁÈÄ × ÙÒ Ñ ØÖ ÕÙ Ô ÖÑ Ø ÓÑÔ Ö Ö Ö ÓÐ × ÒØÖ × Ý Ø ÖÑ Ò Ö ÕÙ Ø Ò Ù ÒÓ × ÙÒÓ Ö ×Ô ØÓ Ð ÓØÖÓº ÑÓ× ÕÙ ÙÒ ÒÓ Ó ×Ø ÐÐ ÒÓ Ù Ò Ó ×Ø ÓÒØ Ò ØÓ Ó× ×Ù× Ó׺ ÈÓÖ Ð ÓÒØÖ Ö Ó¸ ÑÓ× ÕÙ ÙÒ ÒÓ Ó ×Ø Ò ÓÑÔÐ ØÓ Ù Ò Ó Ð ÐØ Ð Ñ ÒÓ× ÙÒ Óº 4.6.3 ´ Arboles completos ÓÒ× Ö ÑÓ× Ð Ñ Ò Ö ÓÒרÖÙ Ö ÙÒ Ö ÓÐ m¹Ö Ó n ÒÓ Ó× ÙÝ ÐÓÒ ØÙ Ð Ñ ÒÓ × Ñ Ò Ñ º È Ö ÓÒרÖÙ Ö Ø Ð Ö Óи ÑÓ× ÓÐÓ Ö Ð Ñ ÝÓÖ ÒØ ÒÓ Ó× Ò ÐÓ× Ò Ú Ð × Ò Ö ÓÖ × ÒÓ ÑÓ× ÓÐÓ Ö ÒÓ Ó× Ò ÙÒ Ò Ú Ð ×ÙÔ Ö ÓÖ ×Ø ÕÙ ÒÓ × Ý Ò ÓÑÔÐ Ø Ó ØÓ Ó× ÐÓ× Ò Ú Ð × ÔÖ ×ÓÖ ×º Ë Ù Ò Ó ×Ø Ð Ò Ö ÞÓÒ Ñ ÒØÓ¸ ÔÓ ÑÓ× Ú Ö ÕÙ ×ÓÐÓ ÙÒ ÒÓ Ó¸ Ð Ö Þ¸ ÔÙ ×Ø Ö ×Ø Ò 0 Ð Ö Þº ÐÓ ×ÙÑÓ m ÒÓ Ó× ÔÙ Ò ×Ø Ö ×Ø Ò 1 Ð Ö Þº ÐÓ ×ÙÑÓ m × m = m2 ÒÓ Ó× ÔÙ Ò ×Ø Ö ×Ø Ò 2º Ò Ò Ö Ð¸ ÐÓ ×ÙÑÓ m × m × m · · · × . . . m = mi ÒÓ Ó× ÔÙ Ò ×Ø Ö Ò Ð i¹ × ÑÓ Ò Ú Ðº × Ô٠׸ Ð ÐÓÒ ØÙ Ð Ñ ÒÓ ÒØ ÖÒÓ ×Ø Ö ÓÐ × Ö Ð ×ÙÑ ÐÓ× ÔÖ Ñ ÖÓ× n Ø ÖÑ ÒÓ× Ð × × Ö × 0, 1, 1, . . . 1, 2, 2, . . . 2, 3, 3, . . . , 3, 4, 4, . . . , 4, . . . , mh−1, mh−1, · · · , mh−1 . m m2 Ú × m3 Ú × m4 Ú × ÒØ ÒÓ Ó× Ò Ð ÙÐØ ÑÓ Ò Ú Ð Ë ÙÒ Ö ÓÐ n ÒÓ Ó׸ ÐØÙÖ h¸ ÙÝÓ× ÒÓ Ó× ×Ø Ò Ð × Ñ Ò Ñ × ×Ø Ò × T Ð Ö Þº ÈÓ ÑÓ׸ ÒØÓÒ ×¸ ÒÓØ Ö ÙÒ ÜÔÖ × ÓÒ × Ô Ö Ð ÐÓÒ ØÙ Ð Ñ ÒÓ h−2 ÁÈÄ(T ) = i mi + (h − 1)n ´n × Ð ÒØ ÒÓ Ó× Ò Ð ÙÐØ ÑÓ Ò Ú Ðµ ´ º¿½µ i=0 È Ö ÓÒØ Ö Ð ÒÙÑ ÖÓ ÒÓ Ó× Ò Ð ÙÐØ ÑÓ Ò Ú Ð Ö ÞÓÒ ÑÓ× ÓÑÓ × Ù º h−1 mi i=0 × Ö Ð ØÓØ Ð ÒÓ Ó× × Ð ÙÐØ ÑÓ Ò Ú Ð ×ØÙÚ × ÓÑÔÐ Ø Ñ ÒØ ÐÐ ÒÓº ÓÖ Ò¸ × Ð ÙÐØ ÑÓ Ò Ú Ð ÒÓ ×ØÙÚ × ÓÑÔÐ ØÓ¸ ÒØÓÒ × ÐØ Ö Ò h−1 mi − n ÒÓ Ó× Ô Ö ÓÑÔÐ Ø Ö i=0 Ð Ò Ú Ðº Ñ ×¸ × Ð ÙÐØ ÑÓ Ò Ú Ð ×ØÙÚ × ÓÑÔÐ ØÓ¸ ÒØÓÒ × Ö Ò mh−1 ÒÓ Ó× Ò Ð ÙÐØ ÑÓ Ò Ú Ðº Ë n Ð ÒÙÑ ÖÓ ÒÓ Ó× Ò Ð ÙÐØ ÑÓ Ò Ú Ð¸ ÒØÓÒ × h−1 h−1 n = mh−1 − mi − n = mh−1 − mi + n ´ º¿¾µ i=0 i=0 × Ö¸ Ð Ñ Ü ÑÓ ÒÙÑ ÖÓ ÒÓ Ó× Ò Ð ÙÐØ ÑÓ Ò Ú Ð Ñ ÒÓ× ÐÓ× ÒÓ Ó× ÕÙ ÐØ Ò Ô Ö ÓÑÔÐ Ø Ö Ð Ò Ú Ðº Ð Ö ×ÓÐÚ Ö Ð × ×ÙÑ ØÓÖ × ÒÚÓÐÙ Ö ×¸ Ø Ò ÑÓ× ÁÈÄ(T ) = (h − 1)m h−1 −(h − 2)mh − m mh − 1 (m − 1)2 + (h − 1) mh−1 − m−1 +n ´ º¿¿µ Ä ×ÓÐÙ ÓÒ ¬Ò Ð ´ º¿¿µ × Ð ÓÑÓ Ö Óº
  • 326.
    300 Cap´ ´ ıtulo 4. Arboles ÇØÖ ÓÖÑ Ö ×ÓÐÚ Ö ´ º¿½µ Ý ´ º¿¿µ¸ × ÔÐ ÒØ Ò Ó ÙÒ ×ÙÑ ØÓÖ ×Ø ÒØ ÕÙ Ò¹ ÚÓÐÙ Ö ÐÓ Ö ØÑÓ× n ÁÈÄ(T ) = ÐÓ m i ; ´ º¿ µ i=1 ÙÝ ×ÓÐÙ ÓÒ Ø Ñ Ò × Ð Ò Ö Ó Ý ÕÙ ÔÙ Ö ×ÓÐÚ Ö× ÔÓÖ × ÓÑÔÓ× ÓÒ Ð ×ÙÑ ØÓÖ Ò Ó× Ô ÖØ ׺ ÄÓ× Ö ÓÐ × ÓÑÔÐ ØÓ׸ ÕÙ ×ÓÒ ÐÓÒ ØÙ Ñ ÒÓ Ñ Ò Ñ ¸ ×ÓÒ ÑÙÝ ÑÔÓÖØ ÒØ ׸ ÔÙ × Ö ÔÖ × ÒØ Ò Ð Ñ ÝÓÖ ¬ Ò ÔÓ× Ð ×Ó Ö ÑÙ Ó× Ð ÓÖ ØÑÓ׺ ÍÒ ÔÖÓÔ ÑÙÝ ÒØ Ö × ÒØ ÐÓ× Ö ÓÐ × ÓÑÔÐ ØÓ× ×Ø ÔÓÖ Ð Ó ÕÙ ÐÐÓ× ÔÙ Ò Ö ÔÖ × ÒØ Ö× × Ù Ò ÐÑ ÒØ Ò Ñ ÑÓÖ Ñ ÒØ ÙÒ ÖÖ ÐÓº Ä ¬ ÙÖ º¾¿ ÐÙ×ØÖ ÙÒ Ö ÓÐ ØÖ Ò Ö Ó ÓÑÔÐ ØÓ ÓÒ ÒÓ Ó ×Ø Ø ÕÙ Ø Ó ÓÒ ×Ù Ö ×Ô Ø ÚÓ Ò ÒØÖÓ ÙÒ ÖÖ ÐÓ × Ù Ò Ðº Ä ×ÔÓ× ÓÒ ÐÓ× Ò × ÓÖÖ ×ÔÓÒ ÙÒ Ö ÓÖÖ Ó ÔÓÖ Ò Ú Ð ×º 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 ÙÖ º¾¿ Ö ÓÐ ØÖ Ò Ö Ó ÓÑÔÐ ØÓ ÒÓ Ó× ÒÙÑ Ö Ó× × ÙÒ ÔÓ× ÓÒ Ò ÖÖ ÐÓ × Ù Ò¹ Ð È Ö ×Ø Ò Ù Ö ×Ø Ö ÔÖ × ÒØ ÓÒ Ð ÜÔÐ Ò Ü º¿º¾ ´Ô Ò ¾ ½µ¸ Ð ÒÓ¹ Ø Ö ÑÓ× ÓÑÓ Ö ÔÖ × ÒØ ÓÒ Ñ ÒØ ÖÖ ÐÓ × Ù Ò Ð º Ë i Ð Ò ÙÒ ÒÓ Ó ni ÒØÖÓ ÙÒ Ö ÓÐ n ÒÓ Ó× Ö ÔÖ × ÒØ Ó ÓÒ ÙÒ ÖÖ ÐÓº Ë T (i, j) Ð j¹ × ÑÓ ×Ù Ö ÓÐ Ð Ö Þ ÙÒ ×Ù Ö ÓÐ ÓÒ Ò i ´ÐÓ× Ò × ÓÑ ÒÞ Ò Ò 1µº ÒØÓÒ × m+i−2 i−1 Ô Ö (ni) = m = m ´ º¿ µ T (i, j) = m(i − 1) + 1 + j ´ º¿ µ ר × ÓÖÑÙÐ × ÙÒ ÓÒ Ò Ô Ö Ù ÐÕÙ Ö ÓÖ Ò Ö Óк ÈÓÖ ×Ù× Ú ÒØ ׸ Ð ÒÑ Ò× Ñ ÝÓÖ ÙØÓÖ × Ý Ó ¬ ÓÖ × ÔÖ ¬ Ö Ò ×Ø Ö ÔÖ × ÒØ ÓÒ Ô Ö Ð ÓÖ ØÑÓ× ÕÙ Ñ Ò ¹ Ò Ö ÓÐ × ÓÑÔÐ ØÓ׸ ÒÓØ Ð Ñ ÒØ ÐÓ× Ô× Ò Ö Ó׸ ÙÒ ×ØÖÙ ØÙÖ ÑÙÝ Ú Ö× Ø Ð ÕÙ Ô ÖÑ Ø ¸ ÒØÖ ÓØÖ × Ó× ×¸ ÓÖ Ò Ö ¬ ÒØ Ñ ÒØ ÑÔÐ ÒØ Ö ÓÐ × ÔÖ ÓÖ º
  • 327.
    4.7. Heaps 301 4.7 Heaps ÓÑ Ò ÑÓ× ×Ø × ÓÒ × ÐÓ ×ØÖ ØÓ ÒØÖÓ Ù Ò Ó Ð ¬Ò ÓÒ Ð ×ØÖÙ ¹ ØÙÖ ØÓ× ×Ø × ÓÒ Definici´n 4.6 (Heap) o ÍÒ Ô ½½ T × ÙÒ Ö ÓÐ ÓÒ Ð × Ó× × Ù ÒØ × ÔÖÓÔ × ½º Forma Ð Ö ÓÐ × ÓÑÔÐ ØÓ¸ ÐÓ ÕÙ ÑÔÐ ÕÙ ¸ Ô ØÓÖ Ñ ÒØ ¸ Ü Ð × Ù ÒØ ÓÖÑ ¾º Orden ∀ni ∈ T =⇒ à ( Ó1(ni)) < à (ni) ∧ à ( Ó2(ni)) < à (ni) ∧ · · · ∧ à ( Óm(ni)) < à (ni) Ë ÙÒ Ð Ö Ó Ð Ö Óи ÙÒ Ô ÔÙ × Ö Ò Ö Ó¸ ØÖ Ò Ö Ó Ó Ù ÐÕÙ Ö ÓØÖÓ ÓÖ Òº À Ù ÒØ Ð ÕÙ Ú Ð Ò ÒØÖ ÐÓ× Ö ÓÐ × Ò Ö Ó× Ý Ð × Ö ÓÖ × Ò × ´Ú Ö Ü º º½ ´Ô Ò ¾ µµ¸ Ò ×Ø Ø ÜØÓ ×ÓÐÓ ÓÒ× Ö Ö ÑÓ× ÐÓ× Ô× Ò Ö Ó׺ ÈÓÖ Ø ÒØÓ¸ × × ØÖ Ø ÙÒ Ö ÓÐ Ò Ö Ó¸ ÒØÓÒ × Ð ÔÖÓÔ ÓÖ Ò ÔÙ ÜÔÖ × Ö× ÓÑÓ ∀ni ∈ T =⇒ à (Ä(n1)) < à (ni) ∧ à (Ê(n1)) < à (ni)º 2 14 38 68 31 69 145 104 98 56 48 87 80 228 156 134 149 99 188 243 166 112 185 217 200 207 ÙÖ º¾ ÍÒ Ô Ò ÖÓ Ä ÓÒ ÙÒ Ô × Ö ×ÙÑ Ò Ó× Ö Ø Ö ×Ø × ½º Ð Ñ ÒÓÖ Ð Ñ ÒØÓ ÙÒ ÓÒ ÙÒØÓ Ð Ú × × Ò Ù ÒØÖ ¸ Ö Ø Ñ ÒØ ¸ ÔÓÖ ÓÒ¹ × ÙÒ Ð ÔÖÓÔ ÓÖÑ ¸ Ò Ð Ö Þ Ð Ö ÓÐ Ó ÓØÖÓ ÑÓ Ó¸ Ð ÓÒ×ÙÐØ Ð Ñ ÒÓÖ Ð Ñ ÒØÓ × O(1)º ½½ Ò Ö × Ð ÓÑÔÖ × ÓÒ¸ ÔÖ × ÖÚ Ö ÑÓ× Ð Ø ÖÑ ÒÓ Ò ×Ù ÚÓÞ Ò ÐÓ× ÓÒ ¸ × Ò ØÖ Ù ÓÒº Ñ Ò ÓÒ Ö¸ Ñ ×¸ ÕÙ Ð Ø ÖÑ ÒÓ Ô ÔÐ ÒØ Ð ÙÒ × Ñ Ù ×º Ð Ö ×Ô ØÓ¸ × Ñ Ò ×Ø Ö Ö Ó× Ð Ö ØÓÖ × ½º Ò Ò Ð ×¸ Ð Ø ÖÑ ÒÓ Ô Ø Ò Ú Ö × Ô ÓÒ ×¸ Ô ÖÓ¸ Ò ÒÙ ×ØÖÓ ×Ó¸ ÓÒÒÓØ ÙÒ ÑÓÒØÓÒ ¸ ÙÐØÓ Ó Ô Ð Ó× ×º ÈÓÖ ÑÔÐÓ¸ Ô Ó ÖØÝ ÐÓØ × ¸ Ö ¬ Ö ÙÒ Ô Ð ÖÓÔ ×Ù º ¾º Ò Ð × Ò × ÓÑÔÙØ ÓÒ Ð × Ô × ÙØ Ð Þ Ó Ô Ö ÓÒÒÓØ Ö Ó× Ó× ×º Ä ÔÖ Ñ Ö ÓÒ ÖÒ ÙÒ ×Ô Ö ÓÐ Ò Ö Ó¸ Ð Ù Ð × Ð ×Ù ØÓ ×ØÙ Ó Ð ÔÖ × ÒØ × ÓÒº Ä × ÙÒ Ö ¬ Ö Ð Ñ Ò ×ØÖ ÓÒ Ñ ÑÓÖ Ò ÙÒ ÔÖÓ ×Óº
  • 328.
    302 Cap´ ´ ıtulo 4. Arboles ¾º Ù ÐÕÙ Ö ÑÓ ¬ ÓÒ Ð Ô¸ ÒØ Ò ÑÓ× ÙÒ Ò× Ö ÓÒ Ó Ð Ñ Ò ÓÒ¸ Ù ×Ø O(Ð (n))º ÁÒØÙ Ø Ú Ñ ÒØ ¸ ×ØÓ × ÙÒ ÓÒ× Ù Ò Ð ÔÖÓÔ ÓÖÑ ¸ Ð Ù Ð Ö ÒØ Þ ÕÙ Ð ÐØÙÖ ×Ø ÓØ O(Ð (n))º Ä ×ØÖÙ ØÙÖ ØÓ× ÔÖ Ö Ô Ö ÑÔÐ ÒØ Ö ÙÒ Ô × ÙÒ ÖÖ ÐÓ ÕÙ ÐÑ Ò Ð Ö ÓÖÖ Ó ÔÓÖ Ò Ú Ð × Ð Ö ÓÐ ÓÑÔÐ ØÓº ÈÓÖ ÑÔÐÓ¸ Ð Ô Ð ¬ ÙÖ º¾ ÔÙ Ö ÔÖ × ÒØ Ö× ÓÒ Ð × Ù ÒØ × Ù Ò ¾½ ¿ ¿½ ½ ½¼ ¼ ¾¾ ½ ½¿ ½ ½ ¾ ¿½ ½½¾ ½ ¾½ ¾¼¼ ¾¼ Ð Ù Ð × ÐÑ Ò Ò ÙÒ ÖÖ ÐÓ array[] ×Ô ¬ Ó Ð × Ù ÒØ ÑÓ Ó ¿¼¾ Ñ Ñ ÖÓ× ÔÖ Ú Ó× ArrayHeap<Key> ¿¼¾ ≡ ´¿¼¿ µ ¿¼¾ T * array; Ä Ö Þ¸ Ó × ¸ Ð Ñ ÒÓÖ Ð Ñ ÒØÓ Ð ÓÒ ÙÒØÓ¸ × Ò Ù ÒØÖ Ò ¿¼¾ Ê Þ Ð Ô ¿¼¾ ≡ array[1]; ÆÓØ ÑÓ× ÕÙ × array[1] Ý ÒÓ array[0] × ÔÓÖ ÐÐÓ ÕÙ Ð ÖÖ ÐÓ × Ô ÖØ Ô Ö dim + 1º È Ö Ñ Ò Ö ×Ø רÖÙ ØÙÖ ØÓ׸ ÑÓ× ×Ô ¬ Ö Ð Ñ Ò× ÓÒ Ð ÖÖ ÐÓ Ý ÓÒØ Ö Ð ÒØ Ð Ñ ÒØÓ× Ð Ô Ñ ÒØ ¿¼¾ Ñ Ñ ÖÓ× ÔÖ Ú Ó× ArrayHeap<Key> ¿¼¾ +≡ ´¿¼¿ µ ¿¼¾ ¿¼¾ const size_t dim; size_t num_items; Ó ÙÒ Ò i¸ ÐÓ× ×Ó× Ð Ô Ö Ý ÐÓ× Ó× × ×Ô ¬ Ò Ð × × Ù ÒØ × ÓÖÑ × ½º Padre Ò ×Ø ×Ó ÒÓ× × ÑÓ× Ò ´ º¿ µ ¿¼¾ ÊÙØ Ò × Ô ¿¼¾ ≡ ¿¼¾ static size_t u_index(const size_t & i) { return i >> 1; // divide i entre 2 } ¾º Hijo izquierdo: × ÙÒ ´ º¿ µ ¿¼¾ ÊÙØ Ò × Ô ¿¼¾ +≡ ¿¼¾ ¿¼¿ static size_t l_index(const size_t & i) { return i << 1; // multiplica i por 2 } ¿º Hijo derecho: Ø Ñ Ò × ÙÒ ´ º¿ µ ¿¼¾ Ñ Ñ ÖÓ× ÔÖ Ú Ó× ArrayHeap<Key> ¿¼¾ +≡ ´¿¼¿ µ ¿¼¾ ¿¼ static size_t r_index(const size_t & i) { return (i << 1) + 1; // multiplica i por 2 y suma 1 } רÓ× Ð ÙÐÓ× Ö Ú Ð Ò ÙÒ Ú ÒØ Ð Ô Ò Ö Ó Ö ×Ô ØÓ Ù ÐÕÙ Ö ÓØÖÓ ÓÖ Ò ÐÓ× ÔÖÓ Ù ØÓ× Ý Ú × ÓÒ × ÔÙ Ò Ö Ð Þ Ö× Ö Ô Ñ ÒØ Ñ ÒØ ×ÔÐ Þ Ñ ÒØÓ× Ø×¸ ÐÓ× Ù Ð × ×ÓÒ ×Ù ×Ø Ò ÐÑ ÒØ Ñ × Ö Ô Ó× ÕÙ ÐÓ× ÔÖÓ Ù ØÓ× Ý Ú × ÓÒ × ÕÙ Ó Ö Ð ÔÖÓ × ÓÖ Ó ÙÒ Ð ÓØ º
  • 329.
    4.7. Heaps 303 ÄÓ× Ô× Ò Ö Ó× ÑÔÐ ÒØ Ó× Ñ ÒØ ÖÖ ÐÓ× × ×Ô ¬ Ò Ò Ð Ö ÚÓ ØÔÐ ÖÖ ÝÀ ÔºÀ ¿¼¿ ¸ ÙÝ ×Ô ¬ ÓÒ Ò Ö Ð × ÓÑÓ × Ù ¿¼¿ ØÔÐ ÖÖ ÝÀ ÔºÀ ¿¼¿ ≡ template <typename T, class Compare = Aleph::less<T> > class ArrayHeap { Ñ Ñ ÖÓ× ÔÖ Ú Ó× ArrayHeap<Key> ¿¼¾ Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayHeap<Key> ¿¼ }; ר Ð × Ô Ö Ñ ØÖ Þ ÑÔÐ ÒØ ÙÒ Ô Ò ÖÓ Ð Ñ ÒØÓ× Ø ÔÓ Ò Ö Ó T¸ Ñ ÒØ ÙÒ ÖÖ ÐÓ ×Ø Ø Ó Ý ÓÒ Ö Ø Ö Ó ÓÑÔ Ö ÓÒ ×Ø Ð Ó Ò Ð Ð × Compareº 4.7.1 Inserci´n en un heap o ÓÒ× Ö ÑÓ× ÙÒ Ô Ò Ö Ó Ø Ñ ÒÓ n Ý Ð Ò× Ö ÓÒ ÙÒ ÒÙ ÚÓ Ð Ñ ÒØÓ xº À Ý ÙÒ ×ÓÐÓ ÐÙ Ö¸ ÒØÖÓ Ð Ö Óи Ò Ð Ù Ð ÔÙ Ò Ö× ÙÒ ÒÙ ÚÓ Ð Ñ ÒØÓ × Ò ÐØ Ö Ö Ð ÔÖÓÔ ÓÖÑ Ø Ð ÐÙ Ö × Ô ØÓÖ Þ Ò Ð × Ù ÒØ ¬ ÙÖ x Ö ÒØ Þ Ð ÔÖÓÔ ÓÖÑ ¸ Ö ×Ø ÔÓÖ Ú Ö ¬ Ö ÓÒ¬ÖÑ Ö Ý¸ Ú ÒØÙ ÐÑ ÒØ Ö ×Ø Ù¹ Ö Ö¸ Ð ÓÖ Òº È Ö ÐÐÓ¸ ÒÓ× Ú Ð Ö ÑÓ× Ð ÖÙØ Ò ¿¼¿ ÊÙØ Ò × Ô ¿¼¾ +≡ ¿¼¾ ¿¼ template <typename T, class Compare> inline void sift_up(T * ptr, const size_t & l, const size_t & r) { for (size_t p, i = r; i > l; i = p) { p = u_index(i); // ındice del padre (c = i/2) ´ if (Compare () (ptr[p], ptr[i])) // ¿satisface propiedad orden? return; // si, todo el arreglo es un heap Aleph::swap(ptr[p], ptr[i]); // intercambie y restaure en nivel p } } Ä ÒØÖ sift up() × ÙÒ ÖÖ ÐÓ¸ ÓÒØ ÒØ ÚÓ ÙÒ Ô Ò Ö Ó ÒØÖ l Ý r − 1¸ ÓÒ ÙÒ Ú ÒØÙ Ð Ú ÓÐ ÓÒ Ð ÔÖÓÔ ÓÖ Ò Ò array[n] Ð × Ð × ÙÒ Ô Ò Ö Ó¸ Ò ÓÖÑ Ý ÓÖ Ò¸ ÒØÖ l Ý r¸ ÓÒ Ð Ú ÒØÙ Ð Ú ÓÐ ÓÒ ÓÖÖ º Ð ÔÖÓ ×Ó × ÑÔÐ ¬ Ò Ð ¬ ÙÖ º¾ º × Ñ ÒØ ¸ sift up() × Ú Ö ¬ × Ü ×Ø ÙÒ Ú ÓÐ ÓÒ ÓÖ Ò ÒØÖ ptr[i] Ý ptr[p]º Ë Ø Ð × Ð ×Ó¸ ÒØÓÒ × ÒØ Ö Ñ ×Ù× Ð Ñ ÒØÓ× Ý × Ò ÔÖÓ × Ö Ð Ò Ú Ð Ò Ö ÓÖ × ÒÓ¸ ÒØÓÒ ×¸ ØÓ Ó Ð Ö ÓÐ × ÙÒ Ôº Ð ÔÖÓ ×Ó ÓÒØ ÒÙ ×Ø ÕÙ Ð Ô Ö × Ñ ÒÓÖ Ó × Ð Ò Ð Ö Þº ÑÓ× ÔÖ ×Ø Ö ×Ô Ð Ù Ó Ð Ó ÕÙ ÒØ ÖÚ ÐÓ Ð Ô × [1 . . . n] Ý ÒÓ [0 . . . n − 1]¸ ÓÑÓ ØÖ ÓÒ ÐÑ ÒØ × Ñ Ò Ò ÐÓ× ÖÖ ÐÓ× Ò Ð Ò Ù C Ý C++º ÓÒ× ¹ Ù ÒØ Ñ ÒØ ¸ Ð Ö ÓÒ ptr ר Ö ×ÔÐ Þ Ò ÙÒ ÙÒ º Ð Óר sift up() × ÜÔÖ × ÔÓÖ Ð × Ù ÒØ Ð Ñ Lema 4.1 Ë T ÙÒ Ô Ò ÖÓ n Ð Ñ ÒØÓ× ÓÒ ÙÒ Ú ÓÐ ÓÒ Ú ÒØÙ Ð ÓÖ Ò Ò array[n]º ÒØÓÒ ×¸ Ð ÙÖ ÓÒ sift up(array, 1, n) × O(Ð (n))º
  • 330.
    304 Cap´ ´ ıtulo 4. Arboles 33 33 59 39 59 39 118 108 61 79 118 108 61 79 143 135 123 169 66 81 100 113 143 135 123 169 66 38 100 113 256 198 145 138 170 152 182 227 190 144 120 38 256 198 145 138 170 152 182 227 190 144 120 81 ´µ ´ µ 33 33 59 39 59 38 118 108 38 79 118 108 39 79 143 135 123 169 66 61 100 113 143 135 123 169 66 61 100 113 256 198 145 138 170 152 182 227 190 144 120 81 256 198 145 138 170 152 182 227 190 144 120 81 ´µ ´ µ ÙÖ º¾ ÇÔ Ö ÓÒ sift up() ×Ó Ö Ð Ú ÐÓÖ ÐÚ 38 Demostraci´n o Ð Ø ÑÔÓ Ù ÓÒ sift up() ר Ö ÓÑ Ò Ó ÔÓÖ Ð ÒØ ÒØ Ö Ñ Ó× ÕÙ Ó × ÓÒ Ð Ð Ñ ÒØÓ Ú ÓÐ ØÓÖ Óº Ò ×Ø × ÒØ Ó¸ ÐÓ Ô ÓÖ ÕÙ ÔÙ Ó ÙÖÖ Ö × ÕÙ Ð Ð Ñ ÒØÓ Ú ÓÐ ØÓÖ Ó Ú Ò Ð Ö Þ T º ÈÓÖ Ø ÒØÓ¸ Ð ÒØ Ñ ÜÑ ÒØ Ö Ñ Ó× × ÔÖÓÔÓÖ ÓÒ Ð Ð ÐØÙÖ Ð Ö Óк ÈÙ ×ØÓ ÕÙ T × ÓÑÔÐ ØÓ¸ Ý × ÙÒ × ×ÔÖ Ò Ð ÔÖÓÔÓ× ÓÒ º½¸ ×Ù ÐØÙÖ ×Ø ÓØ ÔÓÖ O(Ð (n)) Å ÒØ sift up()¸ × × ÑÔÐ Ò Ö ÙÒ ÒÙ ÚÓ Ð Ñ ÒØÓ key Ð Ô ¿¼ Ò Ö Ð Ñ ÒØÓ Ð Ô ¿¼ ≡ ´¿¼ µ array[++num_items] = key; // colocar nuevo elemento sift_up <T, Compare> (array, 1, num_items); // restaurar propiedad de orden ÐÓ Ù Ð¸ ÔÓÖ Ð Ð Ñ º½¸ × O(Ð (n))º 4.7.2 Eliminaci´n en un heap o Ä Ð Ñ Ò ÓÒ ÔÙ ÔÐ ÒØ Ö× Ó× Ñ Ò Ö × ´½µ Ð Ñ Ò ÓÒ Ð Ö Þ Ý ´¾µ Ð Ñ ¹ Ò ÓÒ Ù ÐÕÙ Ö Ð Ñ ÒØÓº Ò Ö Ð ¸ Ð ×Ó ´¾µ × Ò Ö Ð Ý ÓÑÔÖ Ò Ð ´½µ¸ Ô ÖÓ¸ Ò ÚÓÖ Ð × ÑÔÐ ¸ ØÖ Ø Ö ÑÓ× Ð ÔÖ Ñ ÖÓ ÔÓÖ × Ô Ö Óº ÓÒ× Ö ÑÓ׸ Ô٠׸ Ð Ð Ñ Ò ÓÒ Ð Ñ ÒÓÖ Ð Ñ ÒØÓ ÙÒ Ô × Ö¸ ×Ù Ö Þº × Ð Ô Ö×Ô Ø Ú ÓÖÑ ÙÒ Ô¸ Ð Ñ Ò Ö Ð Ö Þ ÕÙ Ú Ð ¸ Ô ØÓÖ Ñ ÒØ ¸ ÐÓ × Ù ÒØ ÑÒ x ÐÓ ÕÙ ¸ ÑÓÖ ÓÐÓ Ñ ÒØ ¸ ÒÓ × ÙÒ Ôº À ݸ ÒÙ ÚÓ¸ ÙÒ Ñ Ò Ö Ö ×Ø ÙÖ Ö Ð ÓÖÑ ¸ Ð Ù Ð ÕÙ Ú Ð ¸ Ô ØÓÖ Ñ ÒØ ¸ ÐÓ × Ù ÒØ x x
  • 331.
    4.7. Heaps 305 × Ö¸ Ð ÙÐØ ÑÓ Ð Ñ ÒØÓ ×Ó Ö × Ö Ð Ö Þº Ð ÓÖ Ñ ÒØ ¸ Ð Ô × ÓÖØ ÔÓÖ Ð ÙÐØ ÑÓ Ò Ú Ð Ð Ö ÓРݸ ÓÒ × Ô ÞÓ ¸ × Ö ÐÐ Ò Ð Ù Ó Ó ÔÓÖ Ð Ö Þº Ð ÒÙ ÚÓ Ð Ñ ÒØÓ Ö Þ ÑÙÝ ÔÖÓ Ð Ñ ÒØ Ú ÓÐ Ö Ð ÔÖÓÔ ÓÖ Ò¸ Ð Ù Ð ÔÙ Ö ×Ø ÙÖ Ö× Ñ ÒØ Ð ÔÖÓ Ñ ÒØÓ sift down()¸ Ò Ö Ó ÒØ Ö Ñ Ö Ð Ñ ÒØÓ× Ð Ô ×Ø ÕÙ Ð ÔÖÓÔ ÓÖ Ò × Ö ×Ø ÙÖ º sift down() × Ð Ö Ñ ÒØ Ñ × ÓÑÔÐ Ó ÕÙ sift up()¸ ÔÙ × Ý ÕÙ Ñ Ö Ö ÐÓ× Ó× Ó× Ð Ú ÒØÙ Ð Ð Ñ ÒØÓ Ú ÓÐ ÓÖ Ý × Ó Ö Ô Ö ÒØ Ö Ñ Ö Ð Ñ ÒÓÖ ÐÐÓ׺ ר ÑÓ Ó¸ × Ö ÒØ Þ Ð ÔÖÓÔ ÓÖ Òº Ð ÔÖÓ ×Ó ÓÒØ ÒÙ Ò Ð × Ù ÒØ Ò Ú Ð ×Ø ÕÙ ÐÓ× Ó× Ó× × Ò Ñ ÝÓÖ × Ó × Ð Ò Ð ÙÐØ ÑÓ Ò Ú Ðº 81 38 59 38 59 81 118 108 39 79 118 108 39 79 143 135 123 169 66 61 100 113 143 135 123 169 66 61 100 113 256 198 145 138 170 152 182 227 190 144 120 33 256 198 145 138 170 152 182 227 190 144 120 ´µ ´ µ 38 38 59 39 59 39 118 108 81 79 118 108 61 79 143 135 123 169 66 61 100 113 143 135 123 169 66 81 100 113 256 198 145 138 170 152 182 227 190 144 120 256 198 145 138 170 152 182 227 190 144 120 ´µ ´ µ ÙÖ º¾ ÇÔ Ö ÓÒ sift down() ×Ó Ö Ð Ö Þ 33 Ò Ð Ô Ö ×ÙÐØ ÒØ Ð ¬ ÙÖ º¾ ¿¼ ÊÙØ Ò × Ô ¿¼¾ +≡ ¿¼¿ ¿¼ template <typename T, class Compare> inline void sift_down(T * ptr, const size_t & l, const size_t & r) { size_t i = l, c; while (true) { c = l_index(i); // ındice del hijo izquierdo (c = i/2) ´ if (c > r) // ¿hay hijo izquierdo? return; // no ==> termine if (c + 1 <= r) // ¿hay hijo derecho? if (Compare () (ptr[c + 1], ptr[c])) // s´ ==> escoja el menor ı c++; if (Compare () (ptr[i], ptr[c])) // ¿Satisface propiedad de orden? return; // s´ ==> termine ı Aleph::swap(ptr[c], ptr[i]); i = c; } } Ä ÖÙØ Ò ØÓÑ ÙÒ Ô ÒØÖ [l + 1 . . . r] Ý Ö ×Ø ÙÖ Ð ÔÖÓÔ ÓÖ Òº ×ÔÙ × ØÙ Ð ÐÐ Ñ ¸ Ð × Ù Ò Ú Ò ÙÒ Ô ÓÑÔÐ ØÓ ÒØÖ [l . . . r]º
  • 332.
    306 Cap´ ´ ıtulo 4. Arboles Ä ÙÖ ÓÒ sift down() × Ö Ú Ð Ò Ð × Ù ÒØ Ð Ñ Lema 4.2 Ë T ÙÒ Ô Ò Ö Ó n Ð Ñ ÒØÓ× ÓÒ ÙÒ Ú ÓÐ ÓÒ Ú ÒØÙ Ð ÓÖ Ò Ò array[1]º ÒØÓÒ ×¸ Ð ÙÖ ÓÒ sift down(array, 1, n) × O(Ð (n))º Demostraci´n o ÐØ ÑÔÓ Ù ÓÒ sift down() ר ÓÑ Ò Ó ÔÓÖ Ð ÒØ ÒØ Ö Ñ Ó× ÕÙ Ó × ÓÒ Ð Ð Ñ ÒØÓ Ú ÓÐ ØÓÖ Óº Ò ×Ø × ÒØ Ó¸ ÐÓ Ô ÓÖ ÕÙ ÔÙ Ó ÙÖÖ Ö × ÕÙ Ð Ð Ñ ÒØÓ Ú ÓÐ ØÓÖ Ó Ð Ò Ð Ñ Ü ÑÓ Ò Ú Ð T Ó × ¸ ×Ù ÐØÙÖ º ÈÓÖ Ø ÒØÓ¸ Ð ÒØ Ñ ÜÑ ÒØ Ö Ñ Ó× × ÔÖÓÔÓÖ ÓÒ Ð Ð ÐØÙÖ Ð Ö Óк ÓÑÓ T × ÓÑÔÐ ØÓ ݸ × ÙÒ Ð ÔÖÓÔÓ× ÓÒ º½¸ ×Ù ÐØÙÖ ×Ø ÓØ ÔÓÖ O(Ð (n)) ÓÒ ÐÓ ÒØ Ö ÓÖ Ò Ñ ÒØ ¸ ÔÓ ÑÓ× ÔÐ ÒØ Ö Ð Ð Ñ Ò ÓÒ Ð × Ù ÒØ ÑÓ Ó ¿¼ Ð Ñ Ò Ö Ö Þ Ò Ô ¿¼ ≡ ´¿¼ µ array[1] = array[num_items--]; // sobreescribir la ra´z con ´ltimo elemento ı u sift_down <T, Compare> (array, 1, num_items); // Restaurar propiedad de orden Р٠и × ÙÒ Ð Ð Ñ º¾¸ × O(Ð (n))º Ä × ÙÒ Ñ Ò Ö Ð Ñ Ò Ö¸ Ñ × Ò Ö Ð¸ × ÔÐ ÒØ Ò ÓÒÓ× Ð ×ÙÔÖ × ÓÒ ÙÒ Ð Ñ ÒØÓ Ù ÐÕÙ Ö º È Ö ÐÐÓ¸ × ÑÔÐ Ñ ÒØ ÔÐ ÑÓ× Ð Ñ ×ÑÓ ÔÖ Ò Ô Ó Ð ÔÖ Ñ Ö Ø ÔÓ Ð Ñ Ò ÓÒ ×Ó Ö × Ö Ö Ð Ð Ñ ÒØÓ ÕÙ × ÑÓ× Ð Ñ Ò Ö ÓÒ Ð ÙÐØ ÑÓ Ð × ÙÒ ºÄ Ö Ò ÓÒ Ð ÔÖ Ñ Ö Ñ ØÓ Ó × ÕÙ ÕÙ ÔÙ Ò ÔÖ × ÒØ Ö× Ú ÓÐ ÓÒ × Ð ÓÖ Ò ÔÓÖ Ð Ô Ö Ó ÔÓÖ ÐÓ× Ó׺ ÄÐ Ñ Ö ÑÓ× Ð ÖÙØ Ò Ò Ö Ð ×ÙÔÖ × ÓÒ sift down up()¸ ÔÙ × ÐÐ × Ö Ñ Ø ×ÓÐÓ × × ÓÒ × ¿¼ ÊÙØ Ò × Ô ¿¼¾ +≡ ¿¼ ¿¼ template <typename T, class Compare> inline void sift_down_up(T * ptr, const size_t & l, const size_t & i, const size_t & r) { sift_down <T, Compare> (ptr, i, r); sift_up <T, Compare> (ptr, 1, i); } Ä ÖÙØ Ò Ö ÙÒ array[] ÓÒØ ÒØ ÚÓ ÙÒ Ð Ñ ÒØÓ ÔÓ× Ð Ñ ÒØ Ú ÓÐ ÓÖ Ð ÔÖÓÔ ÓÖ Ò Ò Ð ÔÓ× ÓÒ iº ÈÖ Ñ ÖÓ Ú Ö ¬ × Ý Ú ÓÐ ÓÒ ÒØÖ ×Ù× Ó× ÐÙ Ó ÒØÖ ×Ù Ô Ö º ÓÒ Ð ÖÙØ Ò ÒØ Ö ÓÖ¸ ÔÓ ÑÓ× ÔÐ ÒØ Ö Ð Ð Ñ Ò ÓÒ Ð i¹ × ÑÓ Ð Ñ ÒØÓ Ð Ô ¿¼ Ð Ñ Ò Ö Ð Ñ ÒØÓ ¿¼ ≡ array[i] = array[num_items--]; // sobreescribir i con ultimo elemento ´ sift_down_up <T, Compare> (array, 1, i, n); 4.7.3 Colas de prioridad Ü ×Ø ÙÒ ÑÔÐ × Ñ Ñ × ØÙ ÓÒ × Ò Ð × Ù Ð × Ò Ñ Ñ ÒØ × Ö ÕÙ Ö Ñ Ò Ö ÙÒ ÓÒ ÙÒØÓ Ð Ú × Ý ÓÒÓ Ö Ð Ñ ÒÓÖ Ð Ñ ÒØÓ Ò Ù ÐÕÙ Ö ÑÓÑ ÒØÓº È Ö Ø Ð Ø ÔÓ Ö ÙÒר Ò ¸ × ÑÔÐ ÙÒ Ì ÓÒÓ Ó ÓÑÓ ÓÐ ÔÖ ÓÖ º Ò ÓÔ Ö ÓÒ Ý × ÑÔ ÒÓ¸ Ð ÓÐ ÔÖ ÓÖ × Ö ×ÙÑ Ò Ð Ø Ð × Ù ÒØ ÆÓÑ Ö ÓÔ Ö ÓÒ ¬ Ò Ô ÓÖ ×Ó insert(item) O(Ð (n)) top() O(1) remove(n) O(Ð (n))
  • 333.
    4.7. Heaps 307 Ä × ÓÐ × ÔÖ ÓÖ × ÑÓ Ð Þ Ò Ö Ø Ñ ÒØ Ñ ÒØ Ð Ì ArrayHeap<Key>¸ Ý ÒØÖÓ Ù Ó¸ Ý Ð Ì BinHeap<Key>¸ ÕÙ × Ö ØÖ Ø Ó Ò Ü º º º Ä Ò Ö array allocated Ò × × Ô ÖØÓ Ó ÒÓ Ð ÖÖ ÐÓ Ý × ¬Ò × ¿¼ Ñ Ñ ÖÓ× ÔÖ Ú Ó× ArrayHeap<Key> ¿¼¾ +≡ ´¿¼¿ µ ¿¼¾ mutable bool array_allocated; ÓÒ ×Ø Ò Ö Ð ×ØÖÙ ØÓÖ × × × Ó ÒÓ Ð Ö Ö Ð Ñ ÑÓÖ ¿¼ Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayHeap<Key> ¿¼ ≡ ´¿¼¿ µ ¿¼ virtual ~ArrayHeap() { if (array_allocated and array != NULL) delete [] array; } Ä ÓÒ×ÙÐØ Ð Ñ ÒÓÖ × Ð ÓÔ Ö ÓÒ Ñ × × ÑÔÐ Ý Ö Ô ÙÒ Ô ¿¼ Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayHeap<Key> ¿¼ +≡ ´¿¼¿ µ ¿¼ ¿¼ T & top() { return array[1]; } Ä Ò× Ö ÓÒ Ý Ð Ñ Ò ÓÒ Ø Ñ Ò ×ÓÒ ÑÙÝ × Ò ÐР׸ Ó ÕÙ ØÓ Ó Ð ØÖ ÓÝ × ÓÖ ÐÞ Ó ¿¼ Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayHeap<Key> ¿¼ +≡ ´¿¼¿ µ ¿¼ ¿¼ T & insert(const T & key) throw(std::exception, std::overflow_error) { if (num_items >= dim) throw std::overflow_error("Heap out of capacity"); Ò Ö Ð Ñ ÒØÓ Ð Ô ¿¼ return array[num_items]; } T getMin() { T ret_val = array[1]; ÐÑÒ ÖÖ Þ Ò Ô ¿¼ return ret_val; } Ê ÓÖ ÑÓ× ÕÙ ¸ × ÙÒ × ×ÔÖ Ò ÐÓ× Ð Ñ × º½ Ý º¾¸ ÐÓ× ÐÓÕÙ × Ò Ö Ð Ñ ÒØÓ Ð Ô ¿¼ Ý Ð Ñ Ò Ö Ö Þ Ò Ô ¿¼ ×ÓÒ O(Ð (n))º ÈÙ ×ØÓ ÕÙ Ð Ö ×ØÓ Ð ÒØÓÖÒÓ insert() Ý getMin() × O(1)¸ ÒØÓÒ × ×Ø × ÓÔ Ö ÓÒ × ×ÓÒ O(Ð (n))º 4.7.3.1 Modificaci´n de prioridad o × ÔÐ Ù× Ð ÑÓ ¬ Ö Ð Ú ÐÓÖ ÔÖ ÓÖ ÙÒ Ð Ñ ÒØÓ Ô ÖØ ÙÐ Öº ÓÑÓ ×Ø ÓÔ¹ Ö ÓÒ ÒÓ ÐØ Ö ØÓÔÓÐÓ Ñ ÒØ Ð Ö Óи Ð ÔÖÓÔ ÓÖÑ ×Ø Ö ÒØ Þ º ÄÓ ÙÒ Ó ÕÙ ÑÓ× Ö ÓÖ Ö × ÕÙ Ð ÓÖ Ò × ÔÖ × ÖÚ ¸ ÐÓ ÕÙ × Ö Ð Þ Ñ ÒØ Ð × Ù ÒØ ÓÔ Ö ÓÒ ¿¼ Ñ Ñ ÖÓ× ÔÙ Ð Ó× ArrayHeap<Key> ¿¼ +≡ ´¿¼¿ µ ¿¼ void update(T & data) { const size_t i = &data - array;
  • 334.
    308 Cap´ ´ ıtulo 4. Arboles sift_down_up <T, Compare> (array, 1, i, num_items); } Ä ÖÙØ Ò ×ÙÑ ÕÙ Ð Ú ÐÓÖ ÔÖ ÓÖ Ð i¹ × Ñ ÒØÖ Ð ÖÖ ÐÓ × Ó ÑÓ ¹ ¬ Ý Ö ×Ø ÙÖ Ð ÔÖÓÔ ÓÖ Òº 4.7.4 Heapsort ÓÒ× Ö ÑÓ× ÓÖ Ò Ö ÙÒ ÖÖ ÐÓ array[] n Ð Ñ ÒØÓ׺ ÍÒ Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓ¸ ר Ð ¸ ÓÒ Ö Ò Ñ ÒØÓ O(n Ð (n)) Ô Ö Ð Ô ÓÖ ×Ó¸ Ù Ð × Ñ ÓÖ ÕÙ Ð Ô ÓÖ ×Ó ½¾ Ð ÕÙ×ÓÖØ¸ ÔÙ ÜÔÐ Ö× Ò Ó× × × ½º Ù Ö Ò ÙÒ ÓÐ ÔÖ ÓÖ ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ× Ð ÖÖ ÐÓº ¾º ÜØÖ Ø Ö Ø Ú Ñ ÒØ Ð ÓÐ Ý Ù Ö Ð Ð Ñ ÒØÓ ÜØÖ Ó Ò Ð ÔÓ× ÓÒ Ø Ö ÓÒ iº ÈÙ ×ØÓ ÕÙ Ð ÓÐ × ÑÔÖ Ö ØÓÖÒ Ð Ñ ÒÓÖ Ð Ñ ÒØÓ¸ Ð ¬Ò Ð ×Ø Ø Ö ÓÒ Ð ÖÖ ÐÓ ×Ø Ö ÓÖ Ò Óº ר ÔÖ Ò Ô Ó ÔÙ Ö Ð Þ Ö× Ð × Ù ÒØ ÑÓ Ó ¿¼ À Ô×ÓÖØ ÓÒ ÓÐ ÔÖ ÓÖ ¿¼ ≡ ArrayHeap<T, n> heap; for (int i = 0; i < n; ++i) // inserta elementos de array en heap heap.insert(array[i]); for (int i = 0; i < n; ++i) // extrae ordenadamente del heap y guarda en array array[i] = heap.getMin(); Ô× ÑÓÖ O(n) × O(Ð (n)) = O(n Ð (n))º ÈÓÖ Ø ÒØÓ¸ Ð ÔÖÓ Ñ ÒØÓ × O(n Ð (n)) + O(n Ð (n)) = O(n Ð (n))¸ Ò Ô Ò ÒØ Ñ ÒØ Ð Ô ÖÑÙØ ÓÒ Ð ÖÖ ÐÓº Ë Ò Ñ Ö Ó¸ Ð Ù×Ó Ð Ô Ö ÕÙ Ö ÐÑ Ò Ö ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ× Ð ÖÖ ÐÓ¸ ÔÓÖ ÐÓ ÕÙ Ð ÓÒ×ÙÑÓ ×Ô Ó × O(n) Ö Ø Ö ×Ø Ò × Ð Ò ÑÙ × Ö ÙÒר Ò ×º ÆÓ × Ð ÔÖ Ò Ö ÕÙ ÔÓ ÑÓ× ÙØ Ð Þ Ö Ð ÔÖÓÔ Ó ÖÖ ÐÓ ÕÙ ÔÖ Ø Ò ÑÓ× ÓÖ¹ Ò Ö Ô Ö Ù Ö Ö Ð Ôº È Ö ÐÐÓ¸ × Ò × Ö Ó ÒÚ ÖØ Ö Ð ÓÒ ÓÒ ÓÖ Ò ÑÓ Ó Ø Ð ÕÙ Ð Ö Þ ÐÑ Ò Ð Ñ ÝÓÖ ÒØÖ ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ׺ ×ØÓ × Ö Ð Þ ÐÑ ÒØ Ñ ÒØ ÙÒ Ð × ÒÚÓÐØÓÖ ÕÙ Ö Ð Ð ÒÚ Ö× ÓÒ ½¿ ¿¼ ÓÑÔ Ö ÓÒ ÒÚ ÖØ ¿¼ ≡ template <class T, class Compare> struct Inversed_Compare { bool operator () (const T & op1, const T & op2) const { return Compare () (op2, op1); } }; ר ÑÓ Ó¸ Ð ÔÖ Ñ Ö × ÔÙ ÔÐ ÒØ Ö× ¸ Ô ØÓÖ Ñ ÒØ ¸ Ð × Ù ÒØ Ñ Ò Ö À Ô ÒØÖ 1 i − 1 ×ÓÖ Ò i ½¾ Ê Ú × × ¸ × × Ò × Ö Ó¸ Ò Ü ¿º¾º½º¿ ´Ô Ò ½ µ¸ Ð ÓÒ ÔØÓ ×Ø Ð ÙÒ Ñ ØÓ Ó ÓÖ ¹ Ò Ñ ÒØÓº ½¿ ר Ð × ÒÚÓÐØÓÖ ×Ø ¬Ò Ò Ð Ö ÚÓ ahFunction.Hº
  • 335.
    4.7. Heaps 309 Ð Ù Ð Ö ÓÖÖ Ð ÖÖ ÐÓ × 2 ר n¸ ÙØ Ò Ó¸ Ø Ö ÓÒ i¸ sift up <T, × Ö¸ ÓÖÖ Ò Ó Ð Ú ÒØÙ Ð Ú Ó¹ Inversed Compare<T, Compare> >(arreglo, i) Ð ÓÒ ÕÙ ÖÖ Ö Ò× ÖØ Ö ÙÒ ÒÙ ÚÓ Ð Ñ ÒØÓ Ò Ð ÔÓ× ÓÒ iº Ä ÔÖ Ñ Ö × ÔÙ Ó ¬ Ö× ¸ ÒØÓÒ ×¸ ÓÑÓ × Ù ¿¼ ÓÒÚ ÖØ Ö ÖÖ ÐÓ Ò ÙÒ Ô ÓÒ × Ø ÙÔ´µ ¿¼ ≡ ´¿¼ µ for (int i = 2; i <= n; ++i) sift_up <T, Aleph::Inversed_Compare<T, Compare> > (array, 1, i); Ä × ÓÑ ÒÞ Ö × Ð Ô ÓÑÔÖ Ò Ó ÒØÖ [1 . . . 1] Ý ÐÙ Ó¸ Ø Ö ÓÒ i¸ × ×ÙÑ ÙÒ Ò× Ö ÓÒ Ò Ð ÔÓ× ÓÒ iº Ð ÖÖ ÐÓ ÒØÖ [1 . . . i]] × Ð Ö ×Ø ÙÖ Ð ÔÖÓÔ Ô Ñ ÒØ sift up(array, 1, i)º Ð ¬Ò Ð Ð ÔÖ Ñ Ö × ¸ ØÓ Ó Ð ÖÖ ÐÓ × ÙÒ Ô ÙÝÓ Ñ Ü ÑÓ Ð Ñ ÒØÓ × Ò Ù ÒØÖ Ò Ð Ö Þº Ô ÖØ Ö Ð Ó ÕÙ Ð ÔÓ× ÓÒ ¬Ò Ø Ú Ð Ñ ÝÓÖ Ð Ñ ÒØÓ × n¸ ÔÐ ÒØ ÑÓ× Ð × ÙÒ × Ð × Ù ÒØ ÑÓ Ó swap(ptr[1], ptr[i]) À Ô ÒØÖ 1 i ÇÖ Ò ¬Ò Ø ÚÓ i Ð Ù Ð × ÑÔÐ ÒØ × ¿¼ ÇÖ Ò Ö Ô ÖØ Ö Ð Ô ¿¼ ≡ ´¿¼ ¿½¼ µ for (int i = n; i > 1; --i) { Aleph::swap(array[1], array[i]); // colocar en la ra´z i-´simo item ı e sift_down <T, Aleph::Inversed_Compare<T, Compare> > (array, 1, i - 1); } ÖÓ××Ó ÑÓ Ó¸ × ÒØ Ö Ñ array[1] ÓÒ array[i]¸ ÐÓ ÕÙ ¬ Ð ÓÖ Ò ¬Ò Ø ÚÓ Ò Ð ÒØ ÖÚ ÐÓ [i . . . n]º ר ÒØ Ö Ñ Ó × ÕÙ Ú Ð ÒØ ÕÙ × Ù × Ð Ñ Ò Ó Ð Ô Ð Ñ ÒÓÖ Ð Ñ ÒØÓ × Ö¸ Ð Ð Ö Þº × Ô٠׸ sift down(array, 1, i - 1) Ö ×Ø ÙÖ Ð Ô ÒØÖ [1 . . . i − 1]º ÓÒ ÐÓ ÒØ Ö ÓÖ¸ ÔÓ ÑÓ× ¬Ò ÕÙ Ø Ö Ð Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓ ¿¼ ÊÙØ Ò × Ô ¿¼¾ +≡ ¿¼ ¿½¼ template <typename T, class Compare> void heapsort(T * array, const size_t & n) { --array; //desplazar una posici´n hacia atr´s ==> array[1] == primer elemento o a ÓÒÚ ÖØ Ö ÖÖ ÐÓ Ò ÙÒ Ô ÓÒ × Ø ÙÔ´µ ¿¼ ÇÖ Ò Ö Ô ÖØ Ö Ð Ô ¿¼ } Ü ×Ø ÙÒ Ñ Ò Ö ÐØ ÖÒ Ý Ø Ò ¬ Þ Ð ÐÓÕÙ ÓÒÚ ÖØ Ö ÖÖ ÐÓ Ò ÙÒ Ô ÓÒ × Ø ÙÔ´µ ¿¼ ¸ ÕÙ ÐÓ Ö ¸ Ñ × ¬ ÒØ Ñ ÒØ ¸ Ò O(n)¸ Ô ¬Þ Ö Ð ÖÖ ÐÓº È Ö ÔÖÓÜ Ñ ÖÒÓ׸ ÓÒ× Ö ÑÓ× Ð ÔÖ Ñ Ö Ô × Ð Ô×ÓÖØ Ð × Ù ÒØ ÓÖÑ ×ÓÖ Ò À Ô ÒØÖ i + 1 Ý n i
  • 336.
    310 Cap´ ´ ıtulo 4. Arboles Ó × ¸ ÙÒ ÖÖ Ó × Ð ÙÐØ Ñ ÔÓ× ÓÒ array[n] ר Ð ÔÖ Ñ Ö array[1]º ÈÓ ÑÓ× Ö Ð Þ Ö ×ØÓ Ñ ÒØ sift down() ¿½¼ ÓÒÚ ÖØ Ö ÖÖ ÐÓ Ò ÙÒ Ô ÓÒ × Ø ÓÛÒ´µ ¿½¼ ≡ for (int i = n - 1; i > 1; --i) sift_down <T, Aleph::Inversed_Compare<T, Compare> > (array, i, n); Ð Ò Ð×× ×Ø ÐÓÕÙ × ÙÒ ÔÓ Ó Ñ × ×ÙØ к ÐÐ Ñ sift down() Ù ×Ø O(Ð (r) − Ð (l))¸ ÐÓ ÕÙ ÒÓ× n−1 n−1 O(Ð (r) − Ð (l)) = Ð ´ º¿ µ r O = O(n) ; l i=1 i=1 Óר ÕÙ × Ñ ÓÖ ÕÙ Ð O(n Ð (n)) ×Ó Ó Ð ÐÓÕÙ ÓÒÚ ÖØ Ö ÖÖ ÐÓ Ò ÙÒ Ô ÓÒ × Ø ÙÔ´µ ¿¼ º À ݸ ÙÒ¸ ÙÒ Ñ ÓÖ Ñ × × ÔÖ Ò ÑÓ× Ð Ó ÕÙ ¸ Ô Ö l > n¸ array[l..n] 2 ׸ ÓÒ ÖØ ØÙ ¸ ÙÒ Ô Ò ÔÖÓÔ ÓÖ Ò¸ Ô٠׸ Ô Ö ∀l > n =⇒ 2l > n × Ö¸ ÓÒÚ ÖØ Ö ÖÖ ÐÓ Ò ÙÒ Ô ÓÒ 2 ÒÓ Ý × Ò ÒØ ׺ ÈÓÖ Ø ÒØÓ¸ Ð Ú ÐÓ × Ø ÓÛÒ´µ ¿½¼ ¸ ÔÙ ÙÔÐ Ö× Ð × Ù ÒØ Ñ Ò Ö ¿½¼ ÓÒÚ ÖØ Ö ÖÖ ÐÓ Ò ÙÒ Ô ÓÒ × Ø ÓÛÒ´µ Ñ ÓÖ Ó ¿½¼ ≡ ´¿½¼ µ for (int i = n/2; i >= 1; --i) sift_down <T, Aleph::Inversed_Compare<T, Compare> > (array, i, n); ÐÓ ÕÙ ÒÓ× ÖÖÓ Ð × Ù ÒØ ÒÙ Ú Ú Ö× ÓÒ Ñ ÓÖ Ð Ô×ÓÖØ ¿½¼ ÊÙØ Ò × Ô ¿¼¾ +≡ ¿¼ template <typename T, class Compare> void faster_heapsort(T * array, const size_t & n) { --array; // desplazar una posici´n hacia atr´s ==> array[1] == primer elemento o a ÓÒÚ ÖØ Ö ÖÖ ÐÓ Ò ÙÒ Ô ÓÒ × Ø ÓÛÒ´µ Ñ ÓÖ Ó ¿½¼ ÇÖ Ò Ö Ô ÖØ Ö Ð Ô ¿¼ } 4.7.5 Aplicaciones de los heaps ÄÓ× Ô× ×ÓÒ ÑÙÝ ÑÔÓÖØ ÒØ × Ò × ØÙ ÓÒ × Ò Ð × Ù Ð × × Ö ÕÙ Ö Ñ ÒØ Ò Ö Ý ÓÒÓ Ö Ö Ô Ñ ÒØ ÐÓ× Ú ÐÓÖ × Ð Ñ Ø × ÙÒ ÓÒ ÙÒØÓ × ÙÒ Ð ÙÒ Ö Ø Ö Ó ÓÖ Ò × Ö¸ ×Ù´×µ Ñ ÒÓÖ´ ×µ Ð Ñ ÒØÓ´×µ Ó ×Ù´×µ Ñ ÝÓÖ´ ×µº À Ý ÙÒ ÒØ × Ó × ÓÒ × Ò ÕÙ ×ØÓ × Ò × Ö Óº ÕÙ ÙÒ Ð ×Ø Ò ÓÑÔÐ Ø Ð × ÕÙ Ö ÑÓ× ×ÓÒ Ð × Ñ × ÔÓÔÙÐ Ö × ½º Aritm´tica flotante Ô Ö Ð ÔÖ × ÓÒ ÔÙÒØÓ ­ÓØ ÒØ ¸ × Ö Ø Ó Ð ÓÖ Ò Ò ÕÙ e × Ö Ð Ò Ð × ÓÔ Ö ÓÒ ×¸ Р٠и × ÒÙÒ Ò × Ö Ñ ÒØ ¸ ÓÖÖ ×ÔÓÒ ÓÒ Ð ÜÔÖ × Ó ÔÓÖ Ð ÔÖÓ Ö Ñ ÓÖº ÈÓÖ ÑÔÐÓ¸ Ð ×ÙÑ Ô Ö ÔÖ × ÓÒ × ÙÒ ÒÙÑ ÖÓ ÑÙÝ Ô ÕÙ ÒÓ × ×ÙÑ Ó ´Ó ÑÙÐØ ÔÐ Ò Óµ ÙÒÓ Ö Ò º ÍÒ ×ÕÙ Ñ ÐØ ÔÖ ¹ × ÓÒ Ñ ÒØ Ò Ò ÙÒ Ô ÐÓ× ÓÔ Ö Ò Ó׸ Ñ Ò Ö Ø Ð ÕÙ Ð ×ÙÑ ÔÖ Ú Ð ÐÓ× ÓÔ Ö Ò Ó× Ô ÕÙ ÒÓ׺ ¾º Simulaci´n a eventos discretos ÑÙ × × ØÙ ÓÒ × Ð Ú Ö Ð × ÑÓ Ð Þ Ò Ý o ×ØÙ Ò Ñ ÒØ Ú ÒØÓ× º ÖÓ××Ó ÑÓ Ó¸ ÙÒ Ú ÒØÓ × ÙÒ Ö ÔÖ × ÒØ ÓÒ Ó Ø Ú Ð ÙÒ ×Ù ×Ó ÒØ Ö × ÒØÖÓ Ð × ØÙ ÓÒ ÕÙ × × ×ØÙ Öº ÓÑÓ Ó ØÓ¸ ÙÒ Ú ÒØÓ Ø Ò Ó× ØÖ ÙØÓ× ÙÒ Ñ ÒØ Ð ×
  • 337.
    4.7. Heaps 311 ´ µ Ì ÑÔÓ Ó ÙÖÖ Ò teº ´µ ÓÒ ÑÓ ¬ ÒØ ×Ó Ö Ð ×Ø Ó Ð × ×Ø Ñ ¸ Ð Ù Ð × Ú Ò Ð ÑÓ ¹ ¬ ÓÒ Ð × Ú Ö Ð × Ð ÑÓ ÐÓ Ý¸ ×Ó Ö ØÓ Ó¸ Ò Ð Ò Ö ÓÒ ÒÙ ÚÓ× Ú ÒØÓ× Ò Ð ÙØÙÖÓº ÄÓ× × ×Ø Ñ × × ÑÙÐ ÓÒ Ñ ÒØ Ò Ò ÙÒ Ø ÑÔÓ × ÑÙÐ Ó ÓÖÖ ×ÔÓÒ ÒØ Ð Ø ÑÔÓ Ò ÕÙ × ÙØ Ð × ÑÙÐ ÓÒ Ð Ú ÒØÓ ØÙ к ÁÒ ÐÑ ÒØ ¸ × ÔÖÓ Ö Ñ Ò Ð ÙÒÓ× Ú ÒØÓ× Ò Ð × ÙØ Ö× Ò Ð ÙÒÓ× Ø ÑÔÓ× ¬ Ó׺ ÈÓÖ ÑÔÐÓ¸ ÓÒ× Ö ÑÓ× ØÖ × Ú ÒØÓ× Ò Ð × ÙØ Ö× Ò ØÖ × Ø ÑÔÓ× t e1 e2 e3 Ð Ø ÑÔÓ × ÑÙÐ ÓÒ ÓÑ ÒÞ Ò Ð Ø ÑÔÓ te ¸ ÕÙ × Ù Ò Ó Ó ÙÖÖ Ö e1º ÄÓ× 1 Ú ÒØÓ× × ÓÐÓ Ò Ò ÙÒ Ð ×Ø ÓÖ Ò ÔÓÖ Ø ÑÔÓº Ð × ÑÙÐ ÓÖ¸ × ×Ø Ñ Ø Ñ ÒØ ¸ ÜØÖ Ð Ð ×Ø Ð ÔÖÓÜ ÑÓ Ú ÒØÓ Ò Ð Ø ÑÔÓº ×ØÓ × ÐÓ Ñ Ö Ú ÐÐÓ×Ó ÙÒ × ÑÙÐ ÓÖ Ú ÒØÓ× × Ö ØÓ׸ ÔÙ × Ð Ø ÑÔÓ × × ÑÙÐ Ñ ÒØ ×ÔÐ Þ Ñ ÒØÓ× × Ö ØÓ× ÒØÖ ÐÓ× Ú ÒØÓ׸ Ý ÒÓ ÓÒØ ÒÙ Ñ ÒØ ÓÑÓ Ò Ð Ú Ö Ðº Ú ÒØÓ Ò Ö ÒÙ ÚÓ× Ú ÒØÓ׸ ÙÝÓ× Ø ÑÔÓ× Ó ÙÖÖ Ò × ÓÒÓ Ò ÙÖ ÒØ Ð Ò Ö ÓÒº ËÙÔÓÒ ÑÓ× ÕÙ e1 Ò Ö ÐÓ× Ú ÒØÓ× e1 , e1 , e1 ¸ ÙÝÓ× Ø ÑÔÓ× 1 2 3 Ó ÙÖÖ Ò × Ô ØÓÖ Þ Ò × t e1 e13 e12 e2 e11 e3 Ç × ÖÚ ÑÓ× ÕÙ ÐÓ× ÒÙ ÚÓ× Ú ÒØÓ× e1 , e1 Ó ÙÖÖ Ö Ò ÒØ × ÕÙ e2 ×ØÓ ÕÙ Ö 3 2 Ö ÕÙ Ð ÔÖÓÜ ÑÓ Ú ÒØÓ × ÑÙÐ Ö × e1 Ý ÒÓ e2¸ Ù Ð Ö Ð ÕÙ ×Ø ÔÖÓ Ö Ñ Ó 3 ÒØ × × ÑÙÐ Ö e1º Ð × ÑÙÐ ÓÖ × Ô Ö Ø ×ØÓ ÔÓÖÕÙ Ð Ð ×Ø ר ×ØÖ Ø ¹ Ñ ÒØ ÓÖ Ò ÔÓÖ Ø ÑÔÓº Å ÒØ Ò Ö ÙÒ × Ù Ò ÓÖ Ò ÔÓÖ Ø ÑÔÓ ÒÓ ×ÓÐÓ × ÓרÓ×Ó Ò ÙÖ ÓÒ¸ × ÒÓ ÒÙØ и ÔÙ × ÐÓ ÕÙ Ò Ö Ð × Ö ÕÙ Ö × ÓÒÓ Ö Ð ÔÖÓÜ ÑÓ Ú ÒØÓ Ñ × ÒÑ ØÓ Ò Ø ÑÔÓ × Ö¸ Ð Ñ ÒÓÖº Ä Ð ×Ø Ú ÒØÓ× ÙÒ × ÑÙÐ ÓÖ × ÑÔÐ Ñ ÒØ Ñ ÒØ ÙÒ Ôº Ð × ÑÙ¹ Ð ÓÖ ÜØÖ Ð Ô Ð Ñ ÒÓÖ Ú ÒØÓ Ò Ð Ø ÑÔÓº Ð Ô Ô ÖÑ Ø ¸ Ø Ñ Ò¸ × ÑÙÐ Ö ¬ ÒØ Ñ ÒØ Ð Ò Ð ÓÒ ÙÒ Ú ÒØÓº È Ö ÐÐÓ¸ × Ù× Ð ÓÔ¹ Ö ÓÒ sift down up()º ¿º C´digos de Huffman × Ö Ò ×ØÙ Ó× Ò Ü º½¿ ´Ô Ò ¿ ¿µº o º B´squeda Ò ÓÒØÖ Ö ÐÓ× m Ñ ÒÓÖ × Ð Ñ ÒØÓ× ÙÒ ÓÒ ÙÒØÓ u Ö Ò Ð¹ n m ÔÓÖ ÑÔÐÓ¸ ÓÒÓ Ö ÐÓ× 1000 Ñ ÒÓÖ × Ð Ñ ÒØÓ× ÒØÖ ÙÒ ÓÒ ÙÒØÓ 109 Ð Ú ×º Ò ×Ø ×Ó¸ × Ù× Ö ÙÒ Ô ¬Ò ØÓ × Ö¸ ÙÒÓ ÙÝ Ô ×Ø Ð Ñ Ø mº Ñ ÕÙ Ð Ô × Ú ØÙ Ð Þ Ò Ó¸ × ÓÒÓ Ö Ð Ñ ÝÓÖ Ð Ñ ÒØÓ ÒØÖ ÐÓ× m ÐÑ Ò Ó׸ Ñ Ò Ö Ø Ð ÕÙ ×Ø × ×Ù ×Ø ØÙ Ó ÔÓÖ Ð ÒÙ ÚÓ Ñ ÒÓÖ Ò ÓÒØÖ Óº º Procesamiento ordenado: Ò Ò Ö Ð¸ ØÓ × ØÙ ÓÒ Ò Ð Ù Ð × Ö ÕÙ Ö ÔÖÓ ¹ × Ö ÔÖ Ñ ÖÓ Ð Ñ ÒÓÖ Ð Ñ ÒØÓ¸ × ÑÙÝ ×Ù× ÔØ Ð ÓÒ× Ö Ö ÙÒ Ôº
  • 338.
    312 Cap´ ´ ıtulo 4. Arboles 4.7.6 El TAD BinHeap<Key> À Ý × ØÙ ÓÒ × Ð ÓÖ ØÑ ׸ ×Ó Ö ØÓ Ó ÕÙ ÐÐ × ÕÙ ×Ô Ö Ò Ò Ö Ð ¸ Ò Ð × Ù Ð × ÒÓ × Ø Ò Ü Ø Ð ÒØ Ð Ñ ÒØÓ× ÕÙ × ÔÖÓ × Ö Òº ר × ÓÒÓ Ñ ÒØÓ¸ ÙÒ Ó Ð × Ð ¸ ÔÙ ÓÑÔÐ Ö Ý ÓÑÔÖÓÑ Ø Ö ÓÒ× Ö Ð Ñ ÒØ Ð Ù×Ó ÙÒ ÖÖ ¹ ÐÓ¸ Ô٠׸ Ð Ñ ÒÓ× ÒÙ ×ØÖ ÑÔÐ ÒØ ÓÒ ArrayHeap<Key>¸ Ö ÕÙ Ö ÕÙ ÓÒÓÞ ÑÓ× ×Ù Ñ Ò× ÓÒº Ë Ð Ñ Ò× ÓÒ × ÑÙÝ Ö Ò Ý × Ù× Ò Ú Ö Ó× Ô× ´ÐÓ Ù Ð ÔÙ × Ö Ð ×Ó Ò Ð ÓÖ ØÑÓ× ×Ó Ö Ö Ó×µ¸ ÒØÓÒ × × ÔÙ Ò ÙÖÖ Ö Ò ÙÒ ×Ô Ö Ó Ñ ÑÓÖ ÑÔÓÖØ ÒØ º Ë Ð Ñ Ò× ÓÒ × Ô ÕÙ Ò ¸ ÒØÓÒ × × ÔÙ × Ö ¬ Ö ÔÖÓ × Ñ ÒØÓ ÐØ × Ð º Ò ×ØÓ× Ø ÔÓ× × ØÙ ÓÒ × × ÓÒ× Ö Ö ÙÒ Ô ÐØ Ñ ÒØ Ò Ñ Ó ÕÙ ÓÒ×ÙÑ Ñ ÑÓÖ Ü Ø Ñ ÒØ ÔÖÓÔÓÖ ÓÒ Ð Ð ÒØ Ð Ñ ÒØÓ× ÕÙ Ñ Ò º ÍÒ ÐØ ÖÒ Ø Ú ¸ Ð Ò Ö Ó¸ Ø ÒØÓ Ò ×ØÙ Ó ÓÑÓ Ò × ÒÓ ÑÔÐ ÒØ ÓÒ¸ × ÙØ Ð Þ Ö ÖÖ ÐÓ× Ò Ñ Ó× Ð Ø ÔÓ DynArray<T> × ÖÖÓÐÐ Ó Ò Ü ¾º½º ´Ô Ò ½µº ר Ú Ö ÒØ ¸ ÙÒÕÙ Ñ × ­ Ü Ð ÕÙ Ð Ñ ÖÓ ÖÖ ÐÓ ×Ø Ø Ó¸ Ø Ñ Ò ÔÙ Ò ÙÖÖ Ö Ò ÐÓ× Ñ ×ÑÓ× ÔÖÓ Ð Ñ ×¸ ÔÙ × × Ø Ò ÙÒ ×Ô Ö Ó Ó Ð × ÒØÖ × ÒÓ Ù× × Ð Ö ØÓÖ Ó¸ × Ñ ÒØÓ Ý ÐÓÕÙ º ÍÒ ×Ú ÒØ ÑÔÐ Ñ ÒØ Ö ÙÒ Ô Ñ ÒØ ÙÒ ÖÖ ÐÓ × ÕÙ ¸ ÔÙ ×ØÓ ÕÙ ÐÓ× Ð Ñ ÒØÓ× × ÑÙ Ú Ò¸ ÒÓ × ÔÙ Ò Ñ ÒØ Ò Ö ÔÙÒØ ÓÖ × ×Ó Ö ÐÐÓ׺ ר Ò ÓÒÚ Ò ÒØ ÔÙ Ô Ð Ö× × Ò Ð ArrayHeap<Key> Ù Ö ÑÓ× ÔÙÒØ ÖÓ× Ø Ô Ó× ÐÓ× ØÓ× Ý ÔÖÓ¹ Ö Ñ ÑÓ× Ð Ð × ÓÑÔ Ö ÓÒ Ô Ö ÕÙ ÓÔ Ö ×Ó Ö ÔÙÒØ ÖÓ× Ø Ô Ó׺ È ÖÓ ×ØÓ ÓÒ×ÙÑ ×Ô Ó Ý ÙÖ ÓÒ ÓÒ Ð × Ó Ð ÔÙÒØ ÓÖ ÜØÖ Ý ×Ù Ö Ö Ò º Ò × × ÓÒ × ÖÖÓÐÐ Ö ÑÓ× ÙÒ ×ÓÐÙ ÓÒ × Ò ÒÓ Ó× Ò Ö Ó× Ð Ø ÔÓ BinNode<Key> Ý ¬Ò Ò Ð Ö ÚÓ ¿½¾ ØÔÐ ÒÀ ÔºÀ ¿½¾ ≡ ¬Ò ÓÒ ÒÓ Ó BinHeap<Key> ¿½ template <template <class> class NodeType, typename Key, class Compare = Aleph::less<Key> > class GenBinHeap { typedef NodeType<Key> Node; ØÖ ÙØÓ× BinHeap<Key> ¿½¿ Å Ñ ÖÓ× ÔÖ Ú Ó× BinHeap<Key> ¿½ Å Ñ ÖÓ× ÔÙ Ð Ó× BinHeap<Key> ¿½ }; template <class Key, typename Compare = Aleph::less<Key> > class BinHeap : public GenBinHeap<BinHeapNode, Key, Compare> { typedef BinHeapNode<Key> Node; }; template <class Key, typename Compare = Aleph::less<Key> > class BinHeapVtl : public GenBinHeap<BinHeapNodeVtl, Key, Compare> { typedef BinHeapNodeVtl<Key> Node; }; GenBinHeap<NodeType, Key, Compare ÑÔÐ ÒØ ÙÒ Ô Ò Ö Ó Ñ ÒØ ÒÓ Ó× ¹ Ò Ö Ó× Ø ÔÓ NodeTypeº BinHeap<Key, Compare> Ý BinHeapVtl<Key, Compare> ×ÓÒ ×Ô Ð Þ ÓÒ × Ô Ö Ñ Ò Ö Ó ÒÓ ×ØÖÙ ØÓÖ × Ú ÖØÙ Ð × Ò ÐÓ× ÒÓ Ó׺
  • 339.
    4.7. Heaps 313 ÈÙ ×ØÓ ÕÙ ÙÒ Ô Ò Ö Ó × ÙÒ Ö ÓÐ Ò Ö Ó¸ × Ô Ò× Ö ÕÙ Ð Ø ÔÓ BinNode<Key> ר Ô Ö ÑÔÐ Ñ ÒØ Ö ÙÒ Ô ÐØ Ñ ÒØ Ò Ñ Ó Ô ÖÓ Ý Ó× ¬ ÙÐØ × ½º Ð Ì BinNode<Key> ÒÓ Ø Ò Ñ Ó Ö ØÓ ÓÒÓ Ö Ð Ô Ö ¸ Ð Ù Ð × Ö ÕÙ Ö Ò Ð ÓÔ Ö ÓÒ × sift up() Ý sift down()º À Ý Ó× Ñ Ò Ö × ×ÓÖØ Ö ×Ø Ó ×Ø ÙÐÓº Ä ÔÖ Ñ Ö × Ñ ÒØ ÙÒ Ô Ð ÕÙ Ù Ö Ð Ñ ÒÓ ×Ó × Ð Ö Þ ×Ø Ð ÒÓ Ó ×Ó Ö Ð Ù Ð × ¹ ÙØ sift up() Ó sift down()º Ä × ÙÒ ÓÒ× ×Ø Ò Ñ ÒØ Ò Ö¸ ÔÓÖ ÒÓ Ó¸ ÙÒ ÔÙÒØ ÖÓ ÓÒ Ð Ð Ô Ö º Ð ÔÖ Ñ Ö Ò ÓÕÙ Ø Ò Ð Ú ÒØ ÕÙ ÓÒ×ÙÑ Ñ ÒÓ× ×Ô Ó ÕÙ Ð × ÙÒ Ó¸ Ô ÖÓ Ð Ñ Ò Ó Ð Ô Ð × Ð Ö Þ ×Ø Ð ÒÓ Ó ÓÔ Ö ÓÒ ÓÒ×ÙÑ ÙÒ Ø ÑÔÓ O(Ð (n))º ¾º Ù Ò Ó Ó ÙÖÖ ÙÒ Ò× Ö ÓÒ Ó Ð Ñ Ò ÓÒ¸ × Ò × Ö Ó Ö Ð Ô Ö Ð ÒÓ Ó Ñ× Ð Ö Ð ÙÐØ ÑÓ Ò Ú Ð¸ ÔÙ × ÔÙ Ö ÕÙ Ö Ö× ØÙ Ð Þ Ö ×Ù× ÒР׺ Ë last Ð ÒÓ Ó Ñ × Ð Ö Ð ÙÐØ ÑÓ Ò Ú Ðº ÓÑÓ ÓÒÓ Ö ×Ø ÒÓ Ó Ý ×Ù Ô Ö È Ö Ø ÑÓ×ÒÓ× ÕÙ last Ý ×Ù Ô Ö ÔÙ Ò Ñ Ö Ú Þ ÕÙ Ó ÙÖÖ ÙÒ ÑÓ ¬ ÓÒ ×Ó Ö Ôº ÍÒ Ò ÓÕÙ Ô Ö Ø ÖÑ Ò Ö last ÓÒ× ×Ø Ò Ú Ö ×Ù × Ú Ñ ÒØ Ð Ú ÐÓÖ Ö¹ ÒÐ Ð Ôº Ë Ð Ö Ò Ð × n¸ ÒØÓÒ × n ÑÓ 2 ÒÓ× Ò × last × Ó ÞÕÙ Ö Ó Ó Ö Óº ËÙ × Ú Ñ ÒØ ¸ n ÑÓ 4 ÒÓ× × Ð Ô Ö last × × Ò ÒØ ÞÕÙ Ö Ó Ó Ö Óº Ð ÔÖÓ Ñ ÒØÓ × Ö Ô Ø ×Ø Ð ÒÞ Ö Ð Ö Þ × Ö¸ ר ÕÙ n/i = 1º Ò ×Ø ÑÓÑ ÒØÓ¸ Ø Ò ÑÓ× Ð ÒÙÑ ÖÓ Û Ý¸ ÒÚ ÖØ Ó¸ last ݸ Ô ÖØ Ö Ð¸ ØÓ ×Ù × Ò Ò º Ð Ð ÙÐÓ ÒØ Ö ÓÖ × O(Ð (n))¸ Ø ÒØÓ Ò ×Ô Ó ÓÑÓ Ò ÙÖ ÓÒº ÈÙ Ö Ô Ò¹ × Ö× ÕÙ Ð Ñ ÒØ Ò Ö Ô ÖÑ Ò ÒØ Ñ ÒØ Ð × Ù Ò ÛÝ last¸ ÓÖÖ Ø ÑÔÓ¸ Ô ÖÓ¸ Ò Ð Ô ÓÖ ×Ó¸ ÔÙ × Ö Ò × Ö Ó ØÙ Ð Þ ÖÐ ×Ø Ð Ö Þ Ý ×ØÓ Ù ×Ø O(Ð (n))º Ò ÒÙ ×ØÖÓ × ÒÓ ØÖ Ò× Ö ÑÓ× ÔÓÖ Ð Ö Ô Þº È Ö ×ÓÖØ Ö Ð ÔÖ Ñ Ö Ó ×Ø ÙÐÓ¸ Ù× Ö ÑÓ× ÙÒ ÔÙÒØ ÖÓ Ð Ô Ö ¸ Ð Ù Ð ÔÓ× Ð Ø ØÓ Ó Ð ÓÒØ ÜØÓ Ô Ö Ð × ÓÔ Ö ÓÒ × ÒØ Ö Ñ Ó ÒØÖ Ò Ú Ð × Ö ÕÙ Ö × ÔÓÖ sift up() Ý sift down()º È Ö Ú Ø Ö Ð × ÙÒ Ó Ó ×Ø ÙÐÓ¸ ÔÖÓÚ Ö ÑÓ× ÐÓ× n + 1 ÔÙÒØ ÖÓ× ÒÙÐÓ× Ð Ô Ô Ö Ñ ÒØ Ò Ö ÙÒ Ð ×Ø ¸ Ó Ð Ñ ÒØ ÒÐ Þ ¸ Ö ÙÐ Ö¸ ÐÓ× ÒÓ Ó× ÓÖ ÐÓ× ÙÐØ ÑÓ× Ò Ú Ð × × Ö¸ ÙÒ Ð ×Ø ÓÒ ÓÖÑ ÔÓÖ ÐÓ× ÒÓ Ó× Ó × Ý¸ Ú ÒØÙ ÐÑ ÒØ ¸ Ð ÒÓ Ó Ô Ö last¸ Ð Ù Ð × Ò ÓÑÔÐ ØÓ Ù Ò Ó last × Ó ÞÕÙ Ö Óº ÍÒ Òר Ò ×Ø רÖÙ ØÙÖ ØÓ× ÔÙ Ô ØÓÖ Þ Ö× ÓÑÓ Ò Ð ¬ ÙÖ º¾ º last × ÑÔÖ ÔÙÒØ Ð ÒÓ Ó Ñ × Ð Ö Ð ÙÐØ ÑÓ Ò Ú Ðº head × ÙÒ ÒÓ Ó Ö ¸ ÒØ Ò Ð ¸ ÕÙ Ô ÖÑ Ø ØÖ Ø Ö Ñ Ò Ö Ò Ö Ð Ð ÒØ Ö Ñ Ó ÒØÖ Ð Ö Þ Ý Ð ÙÒÓ ×Ù× Ó× Ó׺ root × ÙÒ ÔÙÒØ ÖÓ Ö Ö Ò ¸ Ô ÖÑ Ò ÒØ ¸ Ð Ö Þ¸ ÕÙ × Ö headº Ê ÕÙ Ö ÑÓ׸ ÒØÓÒ ×¸ ÐÓ× × Ù ÒØ × ØÖ ÙØÓ× Ô Ö Ð Ì BinHeap<Key> ¿½¿ ØÖ ÙØÓ× BinHeap<Key> ¿½¿ ≡ ´¿½¾µ Node head_node; Node * head; Node *& root; Node * last; size_t num_nodes;
  • 340.
    314 Cap´ ´ ıtulo 4. Arboles head 1 root 2 3 4 5 6 7 8 9 10 11 12 last ÙÖ º¾ Ê ÔÖ × ÒØ ÓÒ Ð Ì BinHeap<Key> Ð ÙÐØ ÑÓ ØÖ ÙØÓ¸ num nodes¸ ÓÒØ Ð Þ Ð Ö Ò Ð Ð Ôº ÍÒ BinHeap<Key> × Ò Ð Þ Ý ¬Ò Ð Þ × ¿½ Å Ñ ÖÓ× ÔÙ Ð Ó× BinHeap<Key> ¿½ ≡ ´¿½¾µ ¿½ GenBinHeap() : head(&head_node), root(RLINK(head)), last(&head_node), num_nodes(0) { /* empty */ } virtual ~GenBinHeap() { /* Empty */ } Ä × ÓÒ× Ö ÓÒ × × ÒÓ ÒØ Ö ÓÖ × ÒÓ× ÐÐ Ú Ò ÓÐÓ Ö Ð × Ù ÒØ Ò ÓÖÑ ÓÒ ÓÒ Ð ÔÓÖ ÒÓ Ó ¿½ ¬Ò ÓÒ ÒÓ Ó BinHeap<Key> ¿½ ≡ ´¿½¾µ class BinHeapNode_Data { struct Control_Fields // Definici´n de banderas de control o { int is_leaf : 4; // true si el nodo es hoja int is_left : 4; // true si el nodo es hijo izquierdo }; BinHeapNode_Data * pLink; // puntero al padre Control_Fields control_fields; BinHeapNode_Data() : pLink(NULL) { control_fields.is_leaf = true; control_fields.is_left = true; } BinHeapNode_Data *& getU() { return pLink; } Control_Fields & get_control_fields() { return control_fields; } }; DECLARE_BINNODE(BinHeapNode, 64, BinHeapNode_Data); Í× × DECLARE BINNODE ¾ º ר Ð × ÒÓ Ó Ùר ¬ ¬Ò Ö ÐÓ× Ñ ÖÓ× × Ù ÒØ × ÚÓÖ Ð Ð Ð Ó Ó ¿½ ¬Ò ÓÒ Ñ ÖÓ× BinHeap<Key> ¿½ ≡ # define PREV(p) (p->getL()) # define NEXT(p) (p->getR())
  • 341.
    4.7. Heaps 315 # define ULINK(p) reinterpret_cast<Node*&>((p)->getU()) # define IS_LEAF(p) ((p)->get_control_fields().is_leaf) # define IS_LEFT(p) ((p)->get_control_fields().is_left) # define CTRL_BITS(p) ((p)->get_control_fields()) Ë IS LEAF(p) == true¸ ÒØÓÒ × NEXT(p) Ý PREV(p) ÓÒØ Ò Ò Ð ×Ù ×ÓÖ Ý ÔÖ ×ÓÖ Ð Ð ×Ø Ó ×º Ë ¸ ÔÓÖ Ð ÓÒØÖ Ö Ó¸ IS LEAF(p) == false¸ ÒØÓÒ × ÐÓ× Ñ ×ÑÓ× ÑÔÓ× × Ù× Ò ÓÑÓ LLINK(p) Ý RLINK(p)º Å ÒØ Ð ÑÔÓ IS LEAF(p) ÔÓ ÑÓ× Ø ÖÑ Ò Ö × p Ô ÖØ Ò Ó ÒÓ Ð Ð ×Ø ÒÐ Þ ¿½ Å Ñ ÖÓ× ÔÖ Ú Ó× BinHeap<Key> ¿½ ≡ ´¿½¾µ ¿½ static bool is_in_list(Node * p) { if (IS_LEAF(p)) return true; return ULINK(LLINK(p)) == RLINK(LLINK(p)); } Ð × ÙÒ Ó return Ú Ö ¬ × p × Ð Ô Ö last Ý ×Ø × ×Ù Ó ÞÕÙ Ö Ó ½ º ÇØÖÓ ÔÖ Ó ÕÙ Ö ÕÙ Ö Ö ÑÓ× × ÓÒÓ Ö × ÙÒ ÒÓ Ó Ø Ò Ó ÒÓ ÙÒ ÖÑ ÒÓ ¿½ Å Ñ ÖÓ× ÔÖ Ú Ó× BinHeap<Key> ¿½ +≡ ´¿½¾µ ¿½ ¿½ static bool has_sibling(Node * p) { return ULINK(p) != RLINK(p); } Í× ÑÓ× ×Ø Ñ ØÓ Ó ÔÓÖÕÙ ÓÔ Ö ÙÒ × p × Ô ÖØ Ð Ð ×Ø ÒÐ Þ º 4.7.6.1 Intercambio entre nodos ÉÙ Þ Ð ÖÙØ Ò × Ò Ð ÒÙ ×ØÖ ÑÔÐ ÒØ ÓÒ × Ð ÕÙ ÒØ Ö Ñ Ó× ÒÓ Ó× Ò Ú Ðº ÄÐ Ñ Ö ÑÓ× ×Ø ÖÙØ Ò swap with parent(p)¸ Ý ×Ù Ñ × ÓÒ × ÒØ Ö Ñ Ö Ð ÒÓ Ó p ÓÒ ×Ù Ô Ö º ר × Ð ÖÙØ Ò Ñ × ÓÑÔÐ Ð ÑÔÐ ÒØ ÓÒ ÔÓÖÕÙ Ð ÒØ Ö Ñ Ó ×Ø Ò Ù Ö ÐÓ× ×Ó× Ô ÖØ ÙÐ Ö × Ò ÐÓ× Ù Ð × p ÒÓ Ø Ò Ù ÐÓ ´ Ù Ò Ó ×ÓÐÓ Ý Ó× Ó ØÖ × ÒÓ Ó×µ Ý Ð ×Ó Ò ÕÙ p ר Ò ÙÐØ ÑÓ Ò Ú Ð¸ × ØÙ ÓÒ Ò Ð Ù Ð p × Ô ÖØ Ð Ð ×Ø º Ä ÖÙØ Ò swap with parent() × ×Ø ÒØ ÓÑÔÐ Ý ÒÓ × ÑÙ ×ØÖ Ò ×Ø Ø ÜØÓ ´ ÐÐ ÔÙ Ü Ñ Ò Ö× Ò Ð Ð ÓØ µº swap with parent() ÓÔ Ö Ò Ô Ò ÒØ Ñ ÒØ Ð × ØÙ ÓÒ p ÒØÖÓ Ð Ôº ÈÓ ÑÓ׸ Ô٠׸ ÑÔÐ ÖÐ Ô Ö ØÙ Ö ÐÓ× Ò¹ Ø Ö Ñ Ó× Ö ÕÙ Ö Ó× ÔÓÖ sift up() Ý sift down()¸ Р٠Р׸ ÙÒ Ú Þ Ö Ð Þ Ð ÓÔ¹ Ö ÓÒ swap with parent()¸ ×ÓÒ ÑÙ Ó Ñ × × ÑÔÐ × ÕÙ ×Ù ÓÒØÖ Ô ÖØ ÓÒ ÖÖ ÐÓ× ¿½ Å Ñ ÖÓ× ÔÖ Ú Ó× BinHeap<Key> ¿½ +≡ ´¿½¾µ ¿½ ¿½ virtual void sift_up(Node * p) { while (p != root and Compare() (KEY(p), KEY(ULINK(p)))) swap_with_parent(p); } virtual void sift_down(Node * p) { ½ È Ö ÔÖ Ò Ö ×Ø ×Ó¸ ÙØ × Ð ÖÙØ Ò ÓÒ p=6 Ò Ð ¬ ÙÖ º¾ º
  • 342.
    316 Cap´ ´ ıtulo 4. Arboles while (not IS_LEAF(p)) { Node * cp = LLINK(p); // guarda el menor hijo de p if (has_sibling(cp)) if (Compare() (KEY(RLINK(p)), KEY(LLINK(p)))) cp = RLINK(p); if (Compare() (KEY(p), KEY(cp))) return; swap_with_parent(cp); } } 4.7.6.2 Inserci´n en BinHeap<Key> o Ä ÖÙØ Ò sift up() ÒÓ× Ô ÖÑ Ø ×Ô ¬ Ö Ð ÔÖ Ñ Ö ÖÙØ Ò ÔÙ Ð BinHeap<Key> Ð Ò× Ö ÓÒ¸ Ð Ù Ð × ¬Ò Ð × Ù ÒØ ÑÓ Ó ¿½ Å Ñ ÖÓ× ÔÙ Ð Ó× BinHeap<Key> ¿½ +≡ ´¿½¾µ ¿½ ¿½ Node * insert(Node * p) { if (root == NULL) // ¿heap est´ vac´o? a ı { // S´, inicialice ı root = p; LLINK(p) = RLINK(p) = p; ULINK(p) = head; IS_LEAF(p) = true; IS_LEFT(p) = false; /* root is right child of header node */ last = root; num_nodes = 1; return p; } // inserci´n general o Node * pp = RLINK(last); // padre de actual last LLINK(p) = last; ULINK(p) = pp; if (IS_LEFT(last)) { // p ser´ hijo derecho a IS_LEFT(p) = false; RLINK(p) = RLINK(pp); LLINK(RLINK(pp)) = p; RLINK(pp) = p; } else { // p ser´ hijo izquierdo a IS_LEFT(p) = true; RLINK(p) = pp; IS_LEAF(pp) = false; // si p es izquierdo ==> pp era hoja LLINK(pp) = p; } RLINK(last) = p; last = p; num_nodes++;
  • 343.
    4.7. Heaps 317 sift_up(last); return p; } 4.7.6.3 Eliminaci´n del m´ o ınimo elemento de un BinHeap<Key> È Ö Ð Ð Ñ Ò ÓÒ ÔÓÖ Ð Ö Þ¸ ÔÐ ÑÓ× Ð Ñ ×Ñ ×ØÖ Ø ÜÔÐ Ò Ü º º¾ ´Ô Ò ¿¼ µ ÒØ Ö Ñ Ö Ð Ö Þ ÔÓÖ last Ý ÐÙ Ó ÓÖØ Ö ÔÓÖ lastº È Ö ÐÐÓ¸ ÒÓ× Ú Ð ÑÓ× Ò ÔÖ Ñ Ö ÐÙ Ö ÙÒ ÖÙØ Ò swap root with last()¸ ÙÝ Ñ × ÓÒ × ÒØ Ö Ñ Ö Ð Ö Þ ÓÒ last Ý ÕÙ ÒÓ × ÑÙ ×ØÖ Ò ×Ø Ø ÜØÓ ´ ÐÐ Ø Ñ Ò ÔÙ × Ö Ü Ñ Ò ÒÐ Ð ÓØ µº È ØÓÖ Ñ ÒØ ¸ swap root with last()¸ Ò Ú Ð ÐÓ× ÒÓ Ó׸ ÒÓ ×Ù× ÓÒØ Ò Ó׸ Ö Ð Þ Ð × Ù ÒØ ÓÔ Ö ÓÒ ÖÓÓØ last ÐØ ÓÖØ Ö Ð ÒÓ Ó Ñ × Ð Ö Ð ÙÐØ ÑÓ Ò Ú Ð¸ ÐÓ Ù Ð × Ö Ð Þ × ¿½ Å Ñ ÖÓ× ÔÖ Ú Ó× BinHeap<Key> ¿½ +≡ ´¿½¾µ ¿½ ¿½ Node * remove_last() { Node * ret_val = last; Node * pp = ULINK(last); Node * new_last = LLINK(last); if (IS_LEFT(last)) { IS_LEAF(pp) = true; LLINK(pp) = new_last; } else { RLINK(pp) = RLINK(last); LLINK(RLINK(last)) = pp; } RLINK(LLINK(last)) = pp; last = new_last; num_nodes--; ret_val->reset(); return ret_val; } ר Ñ ÕÙ Ò Ö ÒÓ× Ô ÖÑ Ø ¬Ò Ö getMin() Ü Ø Ñ ÒØ ÓÑÓ ÜÔÐ Ó Ò Ü º º¾ ´Ô Ò ¿¼ µ × Ö¸ ÒØ Ö Ñ Ö root ÓÒ last¸ ÐÙ Ó ÓÖØ Ö ÔÓÖ last ¿½ Å Ñ ÖÓ× ÔÙ Ð Ó× BinHeap<Key> ¿½ +≡ ´¿½¾µ ¿½ ¿½ Node * getMin() { Node *ret_val = root; if (num_nodes == 1) { root = NULL;
  • 344.
    318 Cap´ ´ ıtulo 4. Arboles ret_val->reset(); num_nodes = 0; return ret_val; } swap_root_with_last(); remove_last(); sift_down(root); ret_val->reset(); return ret_val; } 4.7.6.4 Actualizaci´n en un heap o Ð Ù Ð ÕÙ ÓÒ ArrayHeap<Key>¸ × ÔÐ Ù× Ð ÑÓ ¬ Ö Ð Ú ÐÓÖ ÔÖ ÓÖ ÙÒ ÒÓ Ó Ô ÖØ ÙÐ Öº Ò ×Ø ×Ó¸ ØÙ ÑÓ× Ð Ñ ×Ñ ÓÖÖ ÓÒ ¿½ Å Ñ ÖÓ× ÔÙ Ð Ó× BinHeap<Key> ¿½ +≡ ´¿½¾µ ¿½ ¿½ void update(Node * p) { sift_down(p); sift_up(p); } 4.7.6.5 Eliminaci´n de cualquier elemento en un BinHeap<Key> o ÉÙ Þ ÙÒ Ð × ÓÔ Ö ÓÒ × ÕÙ Ñ × Ó Ö × ÒØ Ó ÓÒ ×Ø Ø ÔÓ ÑÔÐ ÒØ ÓÒ Ô ×Ð Ð Ñ Ò Ö¸ Ö ØÖ Ö Ñ ÒØ ¸ Ù ÐÕÙ Ö Ð Ñ ÒØÓ¸ Ð Ö ÓÒ Ð ÒÓ Óº ÍÒ ÑÔÐÓ ×Ø × ØÙ ÓÒ × Ð Ò Ð ÓÒ ÙÒ Ú ÒØÓ¸ Ø ÒØÓ Ò ÙÒ × ×Ø Ñ × ÑÙÐ ÓÒ Ú ÒØÓ× × Ö ØÓ׸ ÓÑÓ Ò ÙÒ Ñ Ò ÓÖ Ú ÒØÓ× Ò Ø ÑÔÓ Ö Ð ½ º Ò ×Ø ×Ó¸ Ø ¹ Ò Ò Ó ÙÒ ÔÙÒØ ÓÖ Ð Ú ÒØÓ¸ Ù Ð ÔÙ ¸ ÔÓÖ ÑÔÐÓ¸ Ö Ú Ö BinHeap<Time>::Node¸ ÔÙ Ð Ñ Ò Ö× Ð Ô Ù ÐÕÙ Ö Ð Ñ ÒØÓ׺ × ÓÒÚ Ò ÒØ Ö Ð Þ Ö ÕÙ Ò Ð ÑÔÐ ÒØ ÓÒ Ð Ô ÓÒ ÖÖ ÐÓ׸ ר ÓÔ Ö ÓÒ Ö ÕÙ Ö ÙÒ ÖÖ Ö ÕÙ × O(n)º È Ö Ð Ñ Ò Ö node × ÓÔ Ö Ô Ö Ó ×Ù ÓÒØÖ Ô ÖØ ArrayHeap<Key> ´½µ × ¹ × ÒÐ Þ last Ð Ö ÓÐ Ý × Ö ×Ô Ð Ò ÙÒ Ú Ö Ð p ×ØÓ × Ö Ð Þ ÓÒ Ð ÓÔ Ö ÓÒ¸ Ý ¬Ò ¸ remove last()º ÄÙ Ó¸ ´¾µ × ×Ù ×Ø ØÙÝ Ð ÒÓ Ó Ð Ñ Ò Ö node ÔÓÖ p ݸ ¬Ò ÐÑ ÒØ ¸ × ÙØ sift down() Ý sift up() Ô Ö Ùר Ö Ð ÔÖÓÔ ÓÖ Òº Ð Ô ×Ó ´¾µ Ð ÓÔ Ö ÓÒ ÒØ Ö ÓÖ × Ú Ð Ð ÓÔ Ö ÓÒ replace node(Node * node, Node * new node)¸ ÙÝÓ ÖÓÐ × Ö ÑÔÐ Þ Ö ÒØÖÓ Ð Ö ÓÐ Ò Ö Ó Ð ÒÓ Ó node ÔÓÖ new nodeº ÌÓ Ó Ð ÓÒØ ÜØÓ Ò × Ö Ó ×Ø Ó¸ ÔÙ × ÒÓ Ó ÓÒØ Ò ÙÒ ÔÙÒØ ÖÓ ×Ù Ô Ö º ר ÓÔ Ö ÓÒ ÔÙ ÓÒ×ÙÐØ Ö× Ò Ð Ð ÓØ º ÓÖ ¸ ×ÓÐÓ ÒÓ× Ö ×Ø Ö Ñ Ø ÖÒÓ× Ð Ø Ò ÜÔÐ Ô Ö ÑÔÐ ÒØ Ö Ð Ð Ñ Ò ÓÒ ÙÒ ÒÓ Ó node ¿½ Å Ñ ÖÓ× ÔÙ Ð Ó× BinHeap<Key> ¿½ +≡ ´¿½¾µ ¿½ ¿¾¼ Node * remove(Node * node) throw(std::exception, std::underflow_error) { ½ Ò ALEPH¸ Ü ×Ø ÙÒ Ì ¸ ÐÐ Ñ Ó TimeoutQueue¸ ÙÝÓ ¬Ò × ÑÓ Ð Þ Ö ÙÒ Ñ Ò ÓÖ Ú ÒØÓ× ÔÖÓ Ö Ñ Ó× ÔÓÖ Ð Ö ÐÓ Ð × ×Ø Ñ º Ä ÑÔÐ ÒØ ÓÒ TimeoutQueue Ù×Ó Ð Ì BinHeap<Key> Ý Ó Ö ¸ ÒØÖ ×Ù× ÙÒ ÓÒ ×¸ Ð Ò Ð ÓÒ ÙÒ Ú ÒØÓ ÔÖ Ú Ñ ÒØ ÔÖÓ Ö Ñ Óº
  • 345.
    4.7. Heaps 319 if (node == root) return getMin(); if (node == last) return remove_last(); Node * p = remove_last(); if (node == last) { remove_last(); insert(p); return node; } replace_node(node, p); update(p); node->reset(); return node; } 4.7.6.6 Destrucci´n de BinHeap<Key> o Ð Ù Ð ÕÙ ÓÒ ÓØÖÓ× Ò ÓÕÙ × ×ÓÐÙ ÓÒ Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð ÕÙ ÑÓ× ×ØÙ ¹ Ó ×Ø Ð ÔÖ × ÒØ ¸ Ò ÐÙ Ö Ñ Ò Ö Ö Ø Ñ ÒØ Ð × Ð Ú × Ð ÓÒ ÙÒØÓ¸ Ð Ì BinHeap<Key> Ñ Ò ÐÓ× ÒÓ Ó× ÕÙ Ð × ÓÒØ Ò Òº Ð Ñ ×ÑÓ ÑÓ Ó¸ Ò ÙÒ ÓÒ Ð ÔÖ Ò¹ Ô Ó ¬Ò¹ ¹¬Ò¸ ÓØÖÓ Ì ¸ Ò ÒÙ ×ØÖÓ ×Ó DynBinHeap<Key>¸ × Ò Ö ÑÒ ÖÐ× Ð Ú × × Ò ÕÙ Ð Ù×Ù Ö Ó Ø Ò ÔÓÖ ÕÙ Ô Ò× Ö Ò ÐÓ× ÒÓ Ó× ÓÑÓ Ó ØÓ× Ñ Ò ÔÙÐ ÓÒ Ð Ôº Ù Ò Ó ÑÔÐ ÒØ ÑÓ× ÙÒ Ú Ö× ÓÒ Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð × Ò Ð Ú × Ý ÒÓ Ò ÐÓ× ÒÓ Ó× ÕÙ Ð ÓÒØ Ò Ò¸ ÙÒ ÓÔ Ö ÓÒ ÙÒ Ñ ÒØ Ð Ð Ì × × Ð ÔÓ× Ð Ð Ö Ö ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ× ¹Ý ØÓ Ð Ñ ÑÓÖ Ó ÙÔ ¹ Ò ÙÒ ×ÓÐ ÓÔ Ö ÓÒº ר × Ð ×Ó¸ ÔÓÖ ÑÔÐÓ¸ Ð × ÓÔ Ö ÓÒ × remove all and delete() ´Ü ¾º º ´Ô Ò µµ Ý destroyrec() ´Ü º º½¼ ´Ô Ò ¾ µµ × Ò × Ô Ö Ð × Ð ×Ø × ÒÐ Þ × Ý ÐÓ× Ö ÓÐ × Ò Ö Ó׸ Ö ×Ô Ø Ú Ñ ÒØ º Ò Ð ×Ó ÙÒ Ô Ò Ñ Ó ÓÑÓ BinHeap<Key>¸ Ó Ð ×ØÖÙ ØÓÖ Ð Ì DynBinHeap<Key>¸ ÒÓ × ÔÓ× Ð ÒÚÓ Ö Ð ÓÔ Ö ÓÒ destroyRec()¸ ÔÙ × Ù× Ð ÓÑÔÐ Ð ÒÓ Ó ÙÒ BinHeap<Key> ÒÓ × ×ÔÓÒ Ð Ú ÐÓÖ NullPtr¸ Ð Ù Ð × × ÖÚ destroyRec() Ô Ö Ö ÓÒÓ Ö Ð × Ó ×º ÍÒ Ø ÒØ ÓÒ Ô Ö ØÖ Ø Ö ÓÒ ×Ø ÔÖÓ Ð Ñ ¸ × Ö¸ Ô Ö Ð Ñ Ò Ö ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ× BinHeap<Key>¸ × ÙÒ ÐÓ Ð × Ù ÒØ ר ÐÓ ¿½ Ð Ñ Ò Ö ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ× Ð BinHeap<Key> ¿½ ≡ while (not this->is_empty()) delete getMin(); ר ÐÓÕÙ ÙÑÔÐ Ð ÙÒ ÓÒ¸ Ô ÖÓ ÜÔ Ò× × ÙÒ Óר Ò Ø ÑÔÓ ÕÙ ÔÙ Ú ÒÖ ÑÔÓÖØ ÒØ ¸ ÔÙ × × O(n Ð (n))¸ ÕÙ × Ñ ÝÓÖ ÕÙ O(n)¸ Ð Ø ÑÔÓ ÕÙ ÒÓ× ÐÐ Ú Ð ¹ ÖÖ Ó ÐÓ× Ð Ñ ÒØÓ× Ý ×Ù ÓÖÖ ×ÔÓÒ ÒØ Ð Ñ Ò ÓÒº × ×Ø Ô Ö×Ô Ø Ú × ÒÓ× Ö Ú Ð Ò × Ö Ó ÔÖÓÚ Ö × Ð Ì BinHeap<Key> ÙÒ ÔÖ Ñ Ø Ú ÕÙ Ð Ñ Ò ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ× Ò O(n)º Ò Ø Ð × ÒØ Ó¸ Ö ÑÓ× ÙÒ Ö ÓÖÖ Ó ×Ù¬ Ó¸ Ö ÙÖ× ÚÓ¸ ÕÙ Ð Ö ÐÓ× ÒÓ Ó× Ð Ô ¿½ Å Ñ ÖÓ× ÔÖ Ú Ó× BinHeap<Key> ¿½ +≡ ´¿½¾µ ¿½ static void __postorder_delete(Node * p, Node * incomplete_node)
  • 346.
    320 Cap´ ´ ıtulo 4. Arboles { if (IS_LEAF(p)) { delete p; return; } __postorder_delete(LLINK(p), incomplete_node); if (p != incomplete_node) __postorder_delete(RLINK(p), incomplete_node); delete p; } ÈÙ ×ØÓ ÕÙ Ò Ð ×ØÖÙ ØÙÖ ØÓ× × ÓÑ Ò Ð ×ØÖÙ ØÙÖ Ö ÓÐ Ò Ö Ó ÓÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ ¸ × Ø Ò Ö ×Ô Ð Ù Ó Ù Ò Ó Ð ÙÐØ ÑÓ ÒÓ Ó ´lastµ¸ × ÞÕÙ Ö Ó ×ÓÐÓ Ò ×Ø ×Ó p × Ö ÙÒ ÒÓ Ó ÙÒ ×ÓÐÓ Ó¸ ÔÓÖ ÐÓ ÕÙ Ð ÐÐ Ñ Ð Ö × Ö Ò ÓÖÖ Ø Ý Ù× ÒØ ÙÒ Ó Ð Ð Ñ Ò ÓÒº ר ÖÙØ Ò × ÒÚÓ ÔÓÖ Ð × Ù ÒØ ÒØ Ö Þ ÔÙ Ð ¿¾¼ Å Ñ ÖÓ× ÔÙ Ð Ó× BinHeap<Key> ¿½ +≡ ´¿½¾µ ¿½ void remove_all_and_delete() { if (root == NULL) return; if (num_nodes <= 3) { while (not this->is_empty()) delete getMin(); return; } if (IS_LEFT(last)) __postorder_delete(root, ULINK(last)); else __postorder_delete(root, NULL); root = NULL; // reiniciar como si se hubiese llamado a constructor last = &head_node; num_nodes = 0; } Ó ÕÙ Ð Ô × ÙÒ Ö ÓÐ ÓÑÔÐ ØÓ¸ Ð Ö × Ó × ÓÖ ÔÐ Ó Ð Ö Ù× ÓÒ × Ñ Ò ÑÓº Ä ÖÙØ Ò remove all and delete() × ÒÚÓ ÔÓÖ Ð ×ØÖÙ ØÓÖ Ð Ì DynBinHeap<Key>¸ Р٠и ÓÑÓ × ×ÙÔÓÒ Ö× ¸ × ÙÒ ÜØ Ò× ÓÒ BinHeap<Key> ÓÖ ÒØ ÑÒ Ö Ð Ú ×º ר ÑÓ Ó¸ Ð ×ØÖÙ ÓÒ × O(n)º 4.8 Enumeraci´n y c´digos de ´rboles o o a ÓÖ ÑÓ× ÙÒ ÔÖÓ Ð Ñ ÓÑ Ò ØÓÖ Ó ÕÙ ¸ × Ò Ø Ò ÐÓ× Ö ÓР׸ Ö Ð ÓÒ ÑÙ¹ Ó× ÓØÖÓ× ÔÖÓ Ð Ñ × ÓÑ Ò ØÓÖ Ó× Ù ÒØÓ× Ö ÓÐ × Ö ÒØ × ÔÙ Ò ÓÒרÖÙ Ö× ÓÒ n ÒÓ Ó× ÈÓÖ ÑÔÐÓ¸ רÓ× ×ÓÒ ØÓ Ó× ÐÓ× ÔÓ× Ð × Ö ÓÐ × 4 ÒÓ Ó×
  • 347.
    4.8. Enumeraci´n yc´digos de ´rboles o o a 321 Ê ÓÖ ÑÓ× ÕÙ Ü ×Ø ÙÒ ÓÖÖ ×ÔÓÒ Ò ÙÒ ÚÓ ÒØÖ ÐÓ× Ö ÓÐ × Ý ÐÓ× Ö ÓÐ × ¹ Ò Ö Ó× ´Ü º º½ ´Ô Ò ¾ µµº Ó ÙÒ Ö ÓÐ Ù ÐÕÙ Ö n ÒÓ Ó׸ ÒØÓÒ ×¸ × ÙÒ Ü º º½ ´Ô Ò ¾ µ¸ Ð Ö Þ ×Ù ÕÙ Ú Ð ÒØ Ò Ö Ó ÒÓ Ø Ò Ö Ñ Ö º Ê ×Ø Ò¸ ÒØÓÒ ×¸ n − 1 ÒÓ Ó× Ô Ö ÓÑ Ò Ö Ò Ð Ö Ñ ÞÕÙ Ö º ÈÓÖ ÐÓ Ø ÒØÓ¸ Ð ÒÙÑ ÖÓ ÔÓ× Ð × Ö ÓÐ × ÕÙ × ÔÙ Ò ÓÒרÖÙ Ö ÓÒ n ÒÓ Ó× × ÕÙ Ú Ð ÒØ Ð ÒÙÑ ÖÓ Ö ÓÐ × Ò Ö Ó× ÕÙ × ÔÙ Ò ÓÒרÖÙ Ö ÓÒ n − 1 ÒÓ Ó׺ ÈÓ ÑÓ× Ö ×ÓÐÚ Ö ×Ø ÔÖÓ¹ ÐÑ ÓÒØ Ó Ò Ð ÓÒØ ÜØÓ Ñ × Ñ Ð Ö Ý¸ ÕÙ Þ Ñ × × ÑÔÐ ¸ ÐÓ× Ö ÓÐ × Ò Ö Ó׺ 4.8.0.7 C´digos de un arbol binario o ´ ÓÑ Ò ÑÓ× ÔÓÖ ÒÙÒ Ö Ð ÓÒ ÔØÓ Ó Ó ÙÒ Ö ÓÐ Ò Ö Óº È Ö ÐÐÓ Ù ÑÓ× ÙÒ Ö ÓÐ ÜØ Ò Ó ¹ ÓÒ ×Ù× ÒÓ Ó× ÜØ ÖÒÓ×¹ Ø Ð ÓÑÓ Ð Ð ¬ ÙÖ º¾ º ÙÖ º¾ ÍÒ Ö ÓÐ Ò Ö Ó ÜØ Ò Ó ÒÓ Ó× ÒØ ÖÒÓ× Ø ÕÙ Ø Ó× ÓÒ a ÒÓ Ó× ÜØ ÖÒÓ× ÓÒ b Definici´n 4.7 o Ë ÙÒ Ö ÓÐ Ò Ö Ó T n ÒÓ Ó׺ Ë ¬Ò Ó Ó(T ) : B −→ {a, b}∗ ÓÑÓ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó Ð Ö ÓÐ ÜØ Ò Ó ÓÒ ×Ù× n ÒÓ Ó× ÒØ ÖÒÓ× ×Ø Ò Ø ÕÙ Ø Ó× ÓÒ a Ý ×Ù× ÜØ ÖÒÓ× ÓÒ bº ÈÓÖ ÑÔÐÓ¸ Ô Ö Ð Ö ÓÐ Ð ¬ ÙÖ º¾ ¸ Ó Ó(T ) = aaaabbabbaabbbababbº ×ØÙ ÑÓ× ÓÑÓ × Ö Ø Ö Þ ÙÒ Ô Ð Ö Ó Ó(T ) ∈ {a, b}∗ º ÒØÖ ¸ ×ÙÑ ÑÓ× ÕÙ L ⊂ {a, b} ∗ × Ð Ð Ò Ù ÕÙ Ö Ø Ö Þ ÙÒ Ó Ó ÙÒ Ö Óк L × ÐÐ Ñ Ó Ð Ò Ù ÄÙ × Û Þ¸ Ò ÓÒÓÖ Ð Ñ Ø Ñ Ø Ó ÔÓÐ Ó Â Ò ÄÙ × Û Þº Proposici´n 4.6 o ÐÐÒ Ù ÄÙ × Û Þ¸ ØÓ Ó× ÐÓ× Ó Ó× ÔÓ× Ð × ×Ø ¬Ò Ó ÔÓÖ L = aLL ∪ b ´ º¿ µ Ò ÓØÖ × Ô Ð Ö ×¸ L = Ó Ó(B)º Ä ÜÔÖ × ÓÒ ´ º¿ µ × ÙÒ ¬Ò ÓÒ Ö ÙÖ× Ú Ð ÓÒ ÙÒØÓ L Ý × Ò ¬ ÕÙ ÙÒ Ô Ð Ö L × Ð Ö ×ÙÐØ Ó ÓÒ Ø Ò Ö a ÓÒ Ó× Ô Ð Ö × × Ù × ÕÙ Ô ÖØ Ò Þ Ò Ð ÓÒ ÙÒØÓ L Ó ÓÒ Ð Ð ØÖ bº ÄÓ Ñ × ÒØ Ö × ÒØ ר Ø ÔÓ ¬Ò ÓÒ × ÕÙ ÑÓ× ¬Ò Ó ÙÒ ÓÒ ÙÒØÓ Ò¬Ò ØÓ Ô Ð Ö × Ò ÙÒ ×ÓÐ ÜÔÖ × ÓÒ Ö ÙÖ× Ú º
  • 348.
    322 Cap´ ´ ıtulo 4. Arboles Demostraci´n o ÈÖ ÑÓ×ØÖ Ö L = Ó Ó(B) ÑÓ× ÑÓ×ØÖ Ö L⊂ Ó Ó(B) Ý L ⊃ Ó Ó(B) ¯ aLL ∪ b ⊂ Ó Ó(B) Ë T = ∅¸ Ø Ò ÑÓ× ÕÙ Ó Ó(∅) = b ⊂ aLL ∪ bº Ë T = ∅¸ ÒØÓÒ × T ÔÙ ÜÔÖ × Ö× ÓÑÓ T =< Ä(T ), Ö Þ(T ), Ê(T ) >º ÈÓÖ Ð ¬Ò ÓÒ Ó Ó¸ Ó Ó(< Ä(T ), Ö Þ(T ), Ê(T ) >) = a Ó Ó(Ä(T )) Ó Ó(Ê(T )) ⊂ Ó Ó(B) ¯ Ó Ó(B) ⊂ aLL ∪ b Ë w ∈ Lº Ë |w| = 1 =⇒ w = Ó Ó(∅) = bº ÐÓ ÓÒØÖ Ö Ó¸ |w| > 1 =⇒ w = auv, u, v ∈ L ÓÒ a ÓÖÖ ×ÔÓÒ Ð Ö Þ ÙÒ Ö ÓÐ T Ñ ÒØÖ × ÕÙ u = Ó Ó(Ä(T )) Ý v = Ó Ó(Ê(T )) Ù Ò Ó Ø Ò ÑÓ× ÙÒ Ô Ð Ö w = uv × Ö¸ ÕÙ ÔÙ ÓÑÔÓÒ Ö× Ð ÓÒ Ø ¹ Ò ÓÒ ÓØÖ × Ó× Ô Ð Ö × u Ý v¸ ÒØÓÒ × u × Ð ÕÙ × ÔÖ ¬ Ó wº ÈÓÖ ÑÔÐÓ¸ × w = abbba¸ ÒØÓÒ × , a, ab, abb, abbb, abbba ×ÓÒ ÔÖ ¬ Ó× w½ º Ò ÐÓ ÕÙ Ö ×Ô Ø ÐÓ× ÔÖ ¬ Ó׸ ÒÓØ Ö ÑÓ× u≤v × u × ÔÖ ¬ Ó v u<v × u × ÔÖ ¬ Ó v Ý u = vº Ò ×Ø ×Ó¸ ÑÓ× ÕÙ u × ÔÖ ¬ Ó ÔÖÓÔ Ó v ÈÖ Ð ÑÔÐÓ ÒØ Ö ÓÖ¸ a < abbba¸ Ô ÖÓ abbba ≤ abbbaº Definici´n 4.8 (Conjunto prefijo) o ÍÒ ÓÒ ÙÒØÓ Ô Ð Ö × × ÔÖ ¬ Ó × Ò Ò ÙÒ ×Ù× Ô Ð Ö × × ÔÖ ¬ Ó Ð ÙÒ Ð × ÓØÖ ×º ×ØÓ ×¸ Ó ÙÒ Ð Ò Ù X¸ × ÕÙ X × ÙÒ Ð Ò Ù ÔÖ ¬ Ó ⇐⇒ ∀u, v ∈ X¸ u Ý v ÒÓ ×ÓÒ ÔÖ ¬ Ó× ÒØÖ × º × Ö¸ u ≤ v =⇒ u = vº ÈÓÖ ÑÔÐÓ¸ X = {ab, baa, bab}º Lema 4.3 Ë X ÙÒ Ð Ò Ù ÔÖ ¬ Ó Ý u, v, u , v ∈ Xº ÒØÓÒ ×¸ uv = u v =⇒ u = u Ý v = v º Ò ÓØÖÓ× Ø ÖÑ ÒÓ׸ × u, v, u , v ∈ X | u = u , v = v =⇒ uv = u v º Demostraci´n (por contradicci´n) o o ËÙÔÓÒ ÑÓ× ÕÙ X × ÙÒ Ð Ò Ù ÔÖ ¬ Ó × Ö¸ uv = u v =⇒ u = u Ó v = v º È Ö Ð Ø Ö Ð ÓÑÔÖ Ò× ÓÒ¸ ×ÙÔ ÖÔÓÒ ÑÓ× Ð × Ô Ð Ö × uv Ý u v ÓÑÓ × Ù u v u v Ò Ð Ö Ñ × ÔÖ ÕÙ u ≤ uº ÈÓ ÑÓ× Ñ Ò Ö ÓØÖ × ×ÙÔ ÖÔÓ× ÓÒ × Ý ×ÙÔÓÒ Ö ÓØÖÓ× ÔÖ ¬ Ó׺ Ò ØÓ Ó ×Ó¸ × Ð ÖÓ ÕÙ Ó u ≤ u Ó v ≤ v º Ë Ò Ñ Ö Ó¸ ÔÙ ×ØÓ ÕÙ ÑÓ× Ó ÕÙ X × ÙÒ ÓÒ ÙÒØÓ ÔÖ ¬ Ó¸ × ÑÔÓ× Ð ÕÙ u × ÔÖ ¬ Ó uº ÈÙ ×ØÓ ÕÙ Ð Ò ÓÒ Ð Ð Ñ × Ð× ¸ Ð Ð Ñ × ÖØÓ ×Ø Ð Ñ ÒÓ× ÔÖÓÔÓÖ ÓÒ Ð Ö ÙÑ ÒØÓ ÔÖ Ò Ô Ð Ô Ö ÑÓ×ØÖ Ö Ð ÔÖÓÔÓ× ÓÒ × ¹ Ù ÒØ Proposici´n 4.7 (Huffman 1952 [9]) o ÐÐÒ Ù ÄÙ × Û Þ × ÔÖ ¬ Óº ½ Ð × Ñ ÓÐÓ ÒÓØ Ð Ô Ð Ö Ú º
  • 349.
    4.8. Enumeraci´n yc´digos de ´rboles o o a 323 Demostraci´n (por contradicci´n inductiva sobre la longitud de una palabra) o o ËÙÔÓÒ ÑÓ× ÕÙ Ð Ð Ò Ù ÄÙ × Û Þ ÒÓ × ÔÖ ¬ Ó¸ ÒØÓÒ × ∃u, v, x ∈ L | ux = vº ¯ |u| = 1: Ò ×Ø ×Ó¸ u = b =⇒ x = =⇒ v = b¸ Ô ÖÓ L ÒÓ ÓÒØ Ò ÐÓ ÕÙ ÑÔÐ ÕÙ L × ÔÖ ¬ Ó Ô Ö ØÓ × Ð Ô Ð Ö × ÐÓÒ ØÙ 1º ¯ ÓÖ ×ÙÑ ÑÓ× ÕÙ L × ÔÖ ¬ Ó Ô Ö ØÓ × Ð × Ô Ð Ö × u, v ∈ L ÐÓÒ ØÙ ÒÓÑ Ò Ð Ý Ü Ñ Ò Ö ÑÓ× × ∃u, x ∈ L | ux = vº × Ö¸ × Ü ×Ø ÙÒ Ô Ð Ö Ñ ÝÓÖ ÐÓÒ ØÙ ÕÙ ÔÙ × Ö ÓÑÔÙ ×Ø ÓÒ ÙÒ Ô Ð Ö Ô ÖØ Ò ÒØ Lº Ë Ò u1, u2, v1, vx, x ∈ L | |u1| < |u| , |u2| < |u| , |u2| < |u| , |v1| < |v| , |v2| < |v|º Ê Ð ÑÓ× Ð × × Ù ÒØ × × ÓÑÔÓ× ÓÒ × u = au1u2 v = av1v2 ÔÐ Ø ÑÓ× au1u2x = av1v2 =⇒ u1u2x = v1v2 ×ØÓ ÒÓ× ÖÖÓ Ó× ×Ó× Ü Ñ Ò Ö ½º |u1| ≤ |v1| Ò ×Ø ×Ó¸ u Ý v × ×ÙÔ ÖÔÓÒ Ò Ð ÓÖÑ × Ù ÒØ u1 u2 x v1 v2 Ä ÙÒ ÔÓ× Ð × ÕÙ u1 = v1¸ ÔÙ × ÐÓ ÓÒØÖ Ö Ó u1 × Ö ÔÖ ¬ Ó v1¸ Ô ÖÓ ÐÐÓ ÒÓ × × ÔÓÖ Ð ÔÓØ × × Ò Ù Ø Ú º ÈÓÖ ÐÓ Ø ÒØÓ¸ x = ∈ Lº Ð / ÔÐ ÒØ Ñ ÒØÓ ×¸ ÒØÓÒ ×¸ ÓÒØÖ ØÓÖ Óº ¾º |v1| < |u1| < |u| Ò ×Ø ×Ó¸ u Ý v × ×ÙÔ ÖÔÓÒ Ò Ð ÓÖÑ × Ù ÒØ u1 u2 x v1 v2 ÒÙ ÚÓ¸ v1 ÒÓ ÔÙ × Ö ÔÖ ¬ Ó u1¸ ÔÙ × × ÒÓ × ÓÒØÖ Ð ÔÓØ × × Ò Ù Ø Ú º ÈÓÖ ÐÓ Ø ÒØÓ¸ v1 = u1 Ý x = ∈ Lº/ Ñ Ó× ×Ó׸ ÓÒ |u1| = |v1| | |u1| < |u|, |v1| < |v|¸ ÓÒØÖ Ò Ð ÔÓØ × × Ò Ù Ø Ú º ÈÓÖ ÐÓ Ø ÒØÓ¸ Ð ÔÓØ × × × ÖØ Proposici´n 4.8 ∀T1, T2 ∈ B, T1 = T2 ⇐⇒ o Ó Ó(T1) = Ó Ó(T2)º Demostraci´n o Ä ÔÖÙ × ×ØÖÙ ØÙÖ Ò Ó× Ô ÖØ × ¯ Inyectividad (=⇒): ÔÐ Ö ÑÓ× Ò Ù ÓÒ ×Ó Ö Ð × Ö Ò Ð × T1 Ý T2º ∀T1, T2 ∈ B, T1 = T2 =⇒ Ó Ó(T1) = Ó Ó(T2)º Caso base: Ë T1 = ∅, T2 = ∅ =⇒ Ó Ó(T1) = b, Ó Ó(T2) = auv, u, v ∈ L =⇒ Ó Ó(T1) = Ó Ó(T2)º
  • 350.
    324 Cap´ ´ ıtulo 4. Arboles Hip´tesis inductiva: Ë T1 = ∅, T2 = ∅ o Ý |T1| = |T2| =⇒ | Ó Ó(T1)| = | Ó Ó(T2)| =⇒ Ó Ó(T1) = Ó Ó(T2)º Ë |T1| = |T2| ÒØÓÒ × w1 = Ó Ó(T1) = au1v1 u1 = Ó Ó(Ä(T1)) v1 = Ó Ó(Ê(T1)) w2 = Ó Ó(T2) = au2v2 u2 = Ó Ó(Ä(T2)) v2 = Ó Ó(Ê(T2)) ÓÖ ÕÙ Ð ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö Ó× Ö ÓÐ × ÙÒ Ñ ×Ñ Ö Ò Ð ÒÓÑ Ò Ð Ý ÔÖÓ ÑÓ× × Ð ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö Ö ÓÐ × Ö ÒÐ Ñ ÝÓÖº ÈÓÖ Ð ÔÓØ × × Ò Ù Ø Ú ¸ Ø Ò ÑÓ× ÕÙ Ó u1 = u2 Ó v1 = v2º ÑÓ× Ö ×ÔÓÒ Ö × au1v1 = au2v2 ´ º¿ µ È Ö ÐÐÓ¸ ÔÐ ÒØ ÑÓ× Ð × Ù ÒØ Ð Ñ Lema 4.4 Ë Ò u1, u2, v1, v2 ∈ Lº Ë u1 = u2 Ó v1 = v2¸ ÒØÓÒ × u1v1 = u2v2º Demostraci´n Ä o ÑÓ×ØÖ ÓÒ × Ö Ú Ð Ð Ñ º¿º Ë Ò ÑÓ× Ð Ð Ñ º¿¸ Ø Ò ÑÓ× ÕÙ u1 = u2 Ó v1 = v2 =⇒ u1v1 = u2v2 ÓÒ u1, u2, v1, v2 ∈ {Ä Ò Ù ÔÖ ¬ Ó}º ÑÔ ÖÓ¸ ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ º × ÑÓ× ÕÙ L × ÙÒ Ð Ò Ù ÔÖ ¬ Óº × Ô٠׸ Ð Ð Ñ × ÖØÓº Ð Ð Ñ º ÒÓ× Ö ÒØ Þ ÕÙ ´ º¿ µ × ÖØÓ Ô Ö Ö ÓÐ × Ò Ö Ó× Ö Ò¹ Ð Ñ ÝÓÖ¸ ÐÓ ÕÙ ÑÔÐ ÕÙ Ó Ó(T ) : B −→ L × ÒÝ Ø Ú º Ä ÒÝ Ø Ú ÔÖÙ ∀T1, T2 ∈ B, T1 = T2 =⇒ Ó Ó(T1) = Ó Ó(T2) ¯ Suprayectividad: Ò ×Ø ×Ó¸ ÑÓ× ÑÓ×ØÖ Ö ÕÙ ∀w ∈ L ∃T ∈ B | Ó Ó(T ) = w ´ º ¼µ Ä ÑÓ×ØÖ ÓÒ × ÔÓÖ Ò Ù ÓÒ ×Ó Ö Ð ÐÓÒ ØÙ wº Ä ÔÓØ × × Ò Ù Ø Ú × ´ º ¼µº – |w| = 1 =⇒ Ó Ó(∅) = b =⇒ ´ º ¼µ × ÖØÓ Ô Ö |w| = 1º – ÓÖ ×ÙÑ ÑÓ× ÕÙ ´ º ¼µ × ÖØÓ Ô Ö ØÓ Ó |w| = n Ý Ú Ö ¬ ÑÓ× × Ð ÔÓØ × × × × Ø × Ô Ö |w| = n + 1º Ë |w| = n + 1¸ Ð Ô Ð Ö w = auv × Ø × |auv| = 1 + |u| + |v|º ÈÓÖ Ð ÔÓØ × × Ò Ù Ø Ú ¸ ∃Tu ∈ B | Ó Ó(Tu) = u Ý ∃Tv ∈ B | Ó Ó(Tv) = v Ø Ð ÕÙ | Ó Ó(Tu)| + | Ó Ó(Tv)| = n =⇒ |w| = 1 + |u| + |v| = n + 1 ÈÙ ×ØÓ ÕÙ Ó Ó(T ) : B −→ L × ÒÝ Ø Ú Ý ×ÙÔÖ Ý Ø Ú ¸ Ó Ó(T ) : B −→ L × Ý Ø Ú º ÍÒÓ ÐÓ× Ø ÓÖ Ñ × ÙÒ Ñ ÒØ Ð × Ð Ø ÓÖ ÓÒ ÙÒØÓ× ×Ø Ð ÕÙ × ÙÒ ÙÒ ÓÒ f : A −→ B × Ý Ø Ú ÒØÓÒ × |A| = |B|º ÈÓÖ ×Ø Ø ÓÖ Ñ ¸ ÔÓ ÑÓ× ÓÒ ÐÙ Ö ÕÙ |B| = |L|º ÄÓ ÕÙ ÑÙ ×ØÖ ÕÙ Ó Ó(T1) = Ó Ó(T2) =⇒ ∀T1, T2 ∈ B, T1 = T2
  • 351.
    4.8. Enumeraci´n yc´digos de ´rboles o o a 325 ÓÖ Ú ÑÓ× ÓÑÓ × Ö Ø Ö Þ ÙÒ Ô Ð Ö Ò Lº È Ö ÐÐÓ¸ ¬Ò ÑÓ× |w|a = Ð ÒÙÑ ÖÓ Ó ÙÖÖ Ò × a Òw |w|b = Ð ÒÙÑ ÖÓ Ó ÙÖÖ Ò × b Òw Proposici´n 4.9 o w ∈ L ⇐⇒ ´µ |w|b = 1 + |w|a Ý ´ º ½µ ´µ ∀u, v, |u| < |w| | w = uv =⇒ |u|a ≥ |u|b Demostraci´n o ´ µ Ë T ÙÒ Ö ÓÐ Ò Ö Ó Ù ÐÕÙ Ö ÓÒ w = Ó Ó(T )ºº ÈÓÖ Ð ¬Ò ÓÒ Ó Ó¸ × ÑÓ× ÕÙ |w|a = |T | × Ö¸ Ð ÒÙÑ ÖÓ ÒÓ Ó× ÒØ ÖÒÓ׺ ÈÓÖ Ð ÔÖÓÔÓ× ÓÒ º¾¸ × ÑÓ× ÕÙ T ÜØ Ò Ó Ø Ò 2|T |+1 ÒÓ Ó× × Ö n ÒÓ Ó× ÒØ ÖÒÓ× Ý n+1 ÒÓ Ó× ÜØ ÖÒÓ׺ × Ô٠׸ |w| = 2|T | + 1 = 2|w|a + 1 = |w|a + |w|b =⇒ |w|b = |w|a + 1 ´ µ ´ Ò Ù ÓÒ ×Ó Ö |w|µ ¯ |w| = 1 =⇒ w = b =⇒ u = =⇒ |u|a = 0 ≥ |u|b = 0º ´µ × ÖØÓ Ô Ö Ð ×Ó ×º ¯ Ë |w| = n + 1Ý ×ÙÑ ÑÓ× ´ µ ÖØÓ Ô Ö ØÓ Ó |w| < n + 1º ÈÓÖ ¬Ò ÓÒ¸ w Ø Ò ÕÙ ×Ø Ö ÓÑÔÙ ×ØÓ ÓÑÓ w = auv Ð × Ñ ÓÐÓ a ÔÓÖ Ð ÔÓØ Ø Ö Þ ÙÒ Ö ÓÐ Ò Ö Ó Ý u Ý v ÐÓ× Ó Ó× Ð × Ö Ñ ÞÕÙ Ö Ý Ö ¸ Ö ×Ô Ø Ú Ñ ÒØ º ÓÒ× Ö ÑÓ× ÙÒ ÔÖ ¬ Ó w Ù ÐÕÙ Ö w¸ Ð Ù Ð ÔÙ Ø Ò Ö Ð ÙÒ Ð× × Ù ÒØ × ÓÒ¬ ÙÖ ÓÒ × w a u v ×Ó ½ w a u ×Ó ¾ w a u v Ò Ð ×Ó ½¸ |u | < |u|¸ ÔÓÖ ÐÓ ÕÙ Ð ÔÓØ × × Ò Ù Ø Ú × ÖØ ÒØÖ u Ý uº ÈÓÖ ÐÓ Ø ÒØÓ¸ |u |a ≥ |u |b ݸ Ó Ú Ñ ÒØ ¸ |au | ≥ |u |º Ò Ð ×Ó ¾¸ |v | < |v|¸ ÔÓÖ ÐÓ ÕÙ Ð ÔÓØ × × Ò Ù Ø Ú × ÖØ ÒØÖ v Ý v ÐÓ ÕÙ Ô ÖÑ Ø Ø ÖÑ Ò Ö ÕÙ |uv |a ≥ |uv |b ݸ Ò ÓÒ× Ù Ò ¸ |auv |a ≥ |auv |b ר ÔÖÓÔÓ× ÓÒ ÒÓ× ÙÒ Ñ Ò Ö ¬ ÒØ × Ñ Ú Ö ¬ Ö × ÙÒ × Ù Ò Ø× × ÙÒ Ô Ð Ö ÄÙ × Û Þ Ó × ¸ × ÙÒ Ô Ð Ö × ÓÖÖ ×ÔÓÒ ÓÒ Ð Ó Ó ÙÒ Ö ÓÐ Ò Ö Óº 4.8.0.8 C´digos de Dick o ÍÒ ÐØ ÖÒ Ø Ú Ô Ö Ó ¬ Ö Ö ÓР׸ ÓÑÔÐ Ø Ñ ÒØ ÕÙ Ú Ð ÒØ ÐÓ× Ó Ó× Ð × ÓÒ ÒØ Ö ÓÖ¸ × Ø ÕÙ Ø Ö Ð Ö ÓÐ ÜØ Ò Ó Ñ Ò Ö Ö ÒØ Ð × Ö Ñ × ÞÕÙ Ö × ÓÒ a Ý Ð × Ö × ÓÒ b Ø Ð ÓÑÓ Ð Ö ÓÐ Ð ¬ ÙÖ º¾ º
  • 352.
    326 Cap´ ´ ıtulo 4. Arboles ÙÖ º¾ Ö ÓÐ Ò Ö Ó ÜØ Ò Ó Ö Ñ × ÞÕÙ Ö × Ø ÕÙ Ø × ÓÒ a Ö Ñ × Ö × ÓÒ b ÍÒ Ô Ð Ö ¸ ÒÓØ ÓÑÓ (T ) : B −→ {a, b}∗ × Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó ÙÒ Ö ÓÐ Ø ÕÙ Ø Ó ÓÒ ×Ù× Ö Ñ × ÞÕÙ Ö × Ò a Ý ×Ù× Ö Ñ × Ö × Ò bº ÈÓÖ ÑÔÐÓ¸ Ô Ö Ð Ö ÓÐ Ð ¬ ÙÖ º¾ (T ) = aaaabbabbaabbbabab × Ð Ó Ø Ò Ö ÙÒ ¬Ò ÓÒ Ö ÙÖ× Ú ÙÒ Ô Ð Ö º Ò ÔÖ Ñ Ö ÐÙ¹ Ö¸ ¬Ò ÑÓ× (∅) = º È Ö ÙÒ Ö ÓÐ ÒÓ Ú Ó¸ Ò ×Ù Ú Ö× ÓÒ ÜØ Ò ¸ T =< Ä(T ), Ö Þ(T ), Ê(T ) >, (< Ä(T ), Ö Þ(T ), Ê(T ) >= a (Ä(T ))b (Ê(T ))º × Ô٠׸ × D × Ð ÓÒ ÙÒØÓ ØÓ × Ð × Ô Ð Ö × ¸ ÒØÓÒ × D = aDbD ∪ Proposici´n 4.10 o Ë D ÐÐÒ Ù ØÓ × Ð × Ô Ð Ö × ¸ ÒØÓÒ × Db = L Ò ÓØÖ × Ô Ð Ö ×¸ Ó Ó(T ) = (T )bº Demostraci´n o D = aDbD ∪ ÓÒ Ø Ò ÑÓ× Ð Ù ÓÒ ÓÒ b =⇒ Db = (aDbD ∪ )b =⇒ Db = a Db Db ∪b × ÙÒ ´ º¿ µ L L L ר ÑÓ× Ò Ô ÓÖÑÙÐ Ö ÙÒ ÒÙ ÚÓ ÔÖÓ Ð Ñ ÓÑ Ò ØÓÖ Ó Ù ÒØ × ÜÔÖ ¹ × ÓÒ × ÕÙ ÙØ Ð Ò n Ô Ö ÒØ × × ÞÕÙ Ö Ó× Ý n Ô Ö ÒØ × × Ö Ó× ×Ø Ò Ð Ò × ÈÓÖ ÑÔÐÓ¸ ((()())())¸ × ÙÒ ÜÔÖ × ÓÒ Ð Ò ¸ Ñ ÒØÖ × ÕÙ ()(((()()))())) ÒÓ ÐÓ × ¹ ÐØ ÙÒ Ô Ö ÒØ × × ÞÕÙ Ö Ó¹º Ä Ö ×ÔÙ ×Ø ר ÔÓÖ Ð ÒØ ÔÐ Ö× ÐÓÒ ØÙ 2nº Ò ØÓ¸ × ÓÒ× Ö ÑÓ× Ð Ö Ø Ö a ÓÑÓ Ð Ô Ö ÒØ × × ÞÕÙ Ö Ó Ý Ð b ÓÑÓ Ð Ö Ó¸ ÙÒ ÔÐ Ö Ö ÔÖ × ÒØ ÙÒ ÜÔÖ × ÓÒ ÓÒ Ô Ö ÒØ × × Ò ÓÖÑ º 4.8.1 N´meros de Catalan u ÓÖ Ö ØÓÑ ÑÓ× Ð ÔÖÓ Ð Ñ ÓÒØ Ö Ð ÒØ Ö ÓÐ × Ò Ö Ó× ÕÙ ÓÒØ Ò Ò n−1 ÒÓ Ó׺ ÆÓØ ÑÓ× ÕÙ ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ º ¸ ÓÒØ Ö Ð ÒÙÑ ÖÓ Ö ÓÐ × × ÕÙ Ú Ð ÒØ ÓÒØ Ö Ð ÒÙÑ ÖÓ Ô Ð Ö × ÄÙ × Û Þ ÐÓÒ ØÙ 2n + 1 Ó Ð ÒÙÑ ÖÓ Ô Ð Ö × ÐÓÒ ØÙ 2nº
  • 353.
    4.8. Enumeraci´n yc´digos de ´rboles o o a 327 Proposici´n 4.11 o Ð ÒÙÑ ÖÓ ØÓØ Ð Ö ÓÐ × Ò Ö Ó× Ö ÒØ × ÓÒ n ÒÓ Ó× × Cn = 1 2n n+1 n . ´ º ¾µ ÓÒ Cn × ÓÒÓ Ó ÓÑÓ Ð n¹ × ÑÓ ÒÙÑ ÖÓ Ø Ð Ò¸ Ò ÓÒÓÖ Ð Ñ Ø Ñ Ø Ó ÐÙ Ò Ø Ð Òº Demostraci´n o Ü ×Ø ÙÒ ÑÓ×ØÖ ÓÒ Ð × × Ò ÔÐ ÒØ Ö Ð × Ù ÒØ Ù ÓÒ Ö ÙÖÖ ÒØ 1 n=0 Cn = n−1 ´ º ¿µ i=0 CiCn−i−1 n>0 . × Ö¸ ÓÐÓ ÑÓ× Ð ÒÓ Ó Ö Þ Ý ÓÒØ ÑÓ× Ð ÒÙÑ ÖÓ ×Ù Ö ÓÐ × ÞÕÙ Ö Ó× Ý Ð ÒÙÑ ÖÓ ×Ù Ö ÓÐ × Ö Ó׺ Ð Ö ÓÐ ÞÕÙ Ö Ó ÔÙ ÓÑ ÒÞ Ö × Ð Ú Ó ×Ø Ð ÕÙ Ø Ò n−1 ÒÓ Ó׺ Ë ÙÒ ×Ù Ö ÓÐ ÞÕÙ Ö Ó Ø Ò i ÒÓ Ó׸ ÒØÓÒ × Ð Ö Ó Ø Ò n−i−1 ÒÓ Ó׺ ÈÓÖ Ð Ö Ð Ð ÔÖÓ Ù ØÓ¸ Ø Ò ÑÓ× CiCn−i−1 Ö ÓÐ × ÔÓ× Ð × ÙÝÓ ×Ù Ö ÓÐ ÞÕÙ Ö Ó Ø Ò i ÒÓ Ó׺ Ò ÐÙ Ö Ö ×ÓÐÚ Ö ×Ø Ù ÓÒ Ö ÙÖÖ ÒØ ¸ ÒÙ ×ØÖ ÑÓ×ØÖ ÓÒ ×Ø Ö × Ò ÙÒ ÒØ ÖÔÖ Ø ÓÒ ÓÑ ØÖ ÔÐ ÒØ ÔÓÖ ÃÖ Ö Ý ËØ Ò×ÓÒ ½¾ º ÙÖ º¿¼ Ñ ÒÓ Ø Ð Ò Ð Ö ÓÐ Ð ¬ ÙÖ º¾ ÈÙ ×ØÓ ÕÙ Ð ÓÖÖ ×ÔÓÒ Ò ÒØÖ Ö ÓÐ × m¹Ö Ó× Ý Ò Ö Ó× × ÒÝ Ø Ú ´Ú Ö Ü º º½ ´Ô Ò ¾ µµ¸ ÓÒØ Ö Ð ÒÙÑ ÖÓ Ö ÓÐ × n ÒÓ Ó× × ÕÙ Ú Ð ÒØ ÓÒØ Ö Ð ÒÙÑ ÖÓ Ö ÓÐ × Ò Ö Ó× n ÒÓ Ó׺ ×ØÓ ÕÙ Ú Ð ÓÒØ Ö Ð ÒÙÑ ÖÓ Ô Ð Ö × ÄÙ × Û Þ ÐÓÒ ØÙ 2n + 1¸ ٠и ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ º½¼¸ × ÕÙ Ú Ð ÒØ ÓÒØ Ö Ð ÒÙÑ ÖÓ Ô Ð Ö × ÐÓÒ ØÙ 2nº Ü ×Ø ÙÒ ÒØ ÖÔÖ Ø ÓÒ Ö ¬ ÙÒ Ô Ð Ö ´Ó ÄÙ × Û Þµ ÒÓѹ Ò Ñ ÒÓ ØÐÒº ÙÒ Ô Ð Ö w = w1w2 . . . w2n+1 ∈ L ÍÒ Ñ ÒÓ Ø Ð Ò × ÓÖÑ Ó ÔÓÖ ÙÒ × Ù Ò ÔÙÒØÓ× Ò Ð ÔÐ ÒÓ x = xi−1 + 1 × wi = a P(w) = p = (x, y) | ∀wi ∈ w1 w2 . . . w2n+1 ∈ L, y = i Ý ´ º µ x = xi−1 − 1 × wi = b Ð Ñ ÒÓ Ø Ð Ò ÓÖÖ ×ÔÓÒ ÒØ Ð Ó Ó Ð Ö ÓÐ Ð ¬ ÙÖ º¾ × ÑÙ ×ØÖ Ò Ð ¬ ÙÖ º¿¼º Ë ÙÒ Ð ÔÖÓÔÓ× ÓÒ º ¸ |u|a ≥ |u|b Ô Ö ØÓ Ó u ÔÖ ¬ Ó ÔÖÓÔ Ó w ∈ L¸ ×ØÓ ÑÔÐ ÕÙ ØÓ Ó Ñ ÒÓ Ø Ð Ò Ñ × ØÖ ×Ô × Ö Ð x ÒØ × Ð ¬Ò Ð Ð Ô Ð Ö º ÓÒØ Ö Ð ÒÙÑ ÖÓ Ô Ð Ö × ÐÓÒ ØÙ 2n × ÕÙ Ú Ð ÒØ ÓÒØ Ö Ð ÒÙÑ ÖÓ Ñ ÒÓ× Ø Ð Ò Ò Ö Ð × ÕÙ ÔÙ Ò ÓÖÑ Ö× ÓÒ n a × Ý n b × Ø Ð ÕÙ ÒÙÒ ÖÙ Ò Ð Ò Ú Ð xº
  • 354.
    328 Cap´ ´ ıtulo 4. Arboles Ð ÒÙÑ ÖÓ ØÓØ Ð Ñ ÒÓ× ÔÓ× Ð × Ø Ð Ò¸ ÕÙ ÖÙ Ò Ó ÒÓ Ð x¸ ר Ó ÔÓÖ Ð ÒÙÑ ÖÓ Ô Ð Ö × ÕÙ × ÔÙ Ò ÓÖÑ Ö ÓÒ n a × Ý n b ׺ ר ÓÒØ Ó ÔÙ Ú ×Ù Ð Þ Ö× Ñ ÒØ Ð × Ù ÒØ ¬ ÙÖ 1 2 3 4 . . . 2n a1 a2 . . . an × Ö¸ Ð ÒÙÑ ÖÓ ÓÑ Ò ÓÒ × 2n Ð × ÒÙÑ Ö × Ò n a × Ð ÒØ b × ×ÓÒ Ð × Ð × Ö ×Ø ÒØ ׺ ר ÑÓ Ó¸ ÓÒ ÐÙ ÑÓ× ÕÙ 2n × Ð ØÓØ Ð n Ñ ÒÓ× Ø Ð Ò ÔÓ× Ð × ÕÙ ÔÙ ÓÒ ÓÖÑ ÙÒ Ô Ð Ö ÓÑÔÙ ×Ø ÔÓÖ Ð Ð ØÓ {a, b}∗ º ר ÑÓ Ó¸ ÔÓ ÑÓ× ÔÐ ÒØ Ö Cn = 2n n − ÒØ Ñ ÒÓ× ÕÙ ÖÙÞ Ò Ð x ´º µ Ê ÕÙ Ö ÑÓ׸ Ô٠׸ ÓÒØ Ö Ð ÒØ Ñ ÒÓ× ÕÙ ÖÙÞ Ò Ð x Ý ÕÙ Ø ÖÑ Ò Ò Ò Ð x¸ ÓÖÖ ×ÔÓÒ ÒØ ÙÒ Ô Ð Ö w ∈ D | |w|a = |w|bº / Ë P = {(0, 0), (1, y1), . . . , (2n − 1, y2n−1), (2n, 0)} , ÙÒ ÓÒ ÙÒØÓ ÔÙÒØÓ× ÕÙ Ö ÔÖ × ÒØ ÙÒ Ñ ÒÓ Ø Ð Ò ÕÙ ÖÙÞ Ð x ÓÖÖ ×ÔÓÒ¹ ÒØ ÙÒ Ô Ð Ö w ∈ Dº ÈÓÖ ÑÔÐÓ¸ Ð × Ù ÒØ Ñ ÒÓ / ØÐÒ ÓÖÖ ×ÔÓÒ Ð Ô Ð Ö aabbbaabbaab ∈ D¸ / Ë p = (x , −1) ∈ P Ð ÔÖ Ñ Ö ÔÙÒØÓ P ÔÓÖ Ó Ð x¸ ÒØÓÒ × ÔÓ ÑÓ× × ÓÑÔÓÒ Ö P(w) = P(uv) = P(u) ∪ P(v) = {(0, 0), (1, y1), . . . , (x , −1)} ∪ (P(w) − P(u)) È Ö ØÓ Ó P(w) = uv, w ∈ D, u ÓÖÖ ×ÔÓÒ Ð ÔÖ ¬ Ó w ÒØÖ {(0, 0), . . . , (x , −1)} × / Ö¸ Ð ÔÖ ¬ Ó ×Ø Ð ÔÖ Ñ Ö ÔÙÒØÓ ÕÙ ×Ø ÔÓÖ Ó Ð xº ¬Ò ÑÓ× Ð Ñ ÒÓ × Ù ÒØ P (w) = P (u) ∪ (P(w) − P (u)) ; u × Ð ÓÑÔÐ Ñ ÒØÓ u × Ö¸ Ð Ô Ð Ö ÓÖÖ ×ÔÓÒ ÒØ Ñ Ö ØÓ × Ð × Ð ØÖ × a ÔÓÖ b Ý ØÓ × Ð × Ð ØÖ × b ÔÓÖ aº P (u) × ¬Ò ÓÑÓ P (w) = {(−2 − x, y) ∈ P(u) | 1 ≤ x ≤ x − 1, (x, y) ∈ P(u) ÈÖ Ð ÑÔÐÓ ÒØ Ö ÓÖ¸ aabbbaabbaab ∈ D × Ô ÖØ ÓÒ / ÒØÓÒ × ÓÑÓ bbaaa.aabbaab Ý Ø Ò Ð × Ù ÒØ Ñ ÒÓ ØÐÒ
  • 355.
    4.8. Enumeraci´n yc´digos de ´rboles o o a 329 ÓÑ ØÖ Ñ ÒØ ¸ P (w) = P (uv) | u¸ ÕÙ × Ð ÔÖ ¬ Ó ÓÖÖ ×ÔÓÒ ÒØ Ð Ñ ÒÓ Ø Ð Ò P(uv) ר Ð ÔÖ Ñ Ö ÔÙÒØÓ Ó Ð x¸ ÔÙ × Ö ÒØ ÖÔÖ Ø Ó ÓÑÓ u ×ÔÐ Þ Ó 2 ÙÒ × ÔÓÖ Ó Ð xº Ä Ö Ð ÓÒ P(w) −→ P (w) | ∀w ∈ D × ÙÒ ÙÒ ÓÒ Ý Ø Ú º ÓÑ ØÖ Ñ ÒØ ¸ / ∀P(w1), P(w2), P(w1) = P(w2) =⇒ P (w1) = P (w2) Ø Ò Ö ÙÒ Ñ Ò ÙÒ º ÄÓ Ñ ×ÑÓ ×Ù ∀P (w1), P (w2), P (w1) = P (w2) =⇒ P(w1) = P(w2)º Ê ØÓÑ Ò Ó ´ º µ¸ ÓÒØ Ö Ð ÒÙÑ ÖÓ Ñ ÒÓ× ÕÙ ÖÙÞ Ò Ð x × ÕÙ Ú Ð ÒØ ÓÒØ Ö Ð ÒÙÑ ÖÓ Ñ ÒÓ× ÕÙ Ô ÖØ Ò × (0, −2) Ý ÖÖ Ò (0, 2n)º Ù ÐÕÙ Ö Ñ ÒÓ ×Ø ÓÖÑ ÓÖÖ ×ÔÓÒ Ö n + 1 Ð ØÖ × a Ý n − 1 Ð ØÖ × bº È ÖØ Ò Ó × −2¸ × Ö ÕÙ Ö Ò 2 Ð ØÖ × a Ñ × ÕÙ Ð Ð ØÖ bº × Ô٠׸ Ü ×Ø Ò n+1 2n Ñ ÒÓ× ÕÙ ÖÙÞ Ò Ð xº ËÙר ØÙ ÑÓ× Ò ´ º µ 2n 2n 1 2n Cn = − = n n+1 n+1 n ÄÓ× ÒÙÑ ÖÓ× Ø Ð Ò Ø Ò Ò ÙÒ ÑÔÓÖØ Ò ØÖ × Ò ÒØ Ð Ò Ð ÓÑ Ò ØÓÖ ¸ ÔÙ × Ü ×Ø Ò ÑÙ × × ØÙ ÓÒ × ÓÒØ Ó ÒØ ¬ × Ñ ÒØ ר Ð × ÒÙÑ ÖÓº ÒØÖ Ð ÙÒ × Ð × ÔÐ ÓÒ × Ø Ò ÑÓ× ¯ Ä ÒØ Ñ Ò Ö × Ò ÕÙ ÙÒ ÔÓÐ ÓÒÓ Ö ÙÐ Ö ÓÒÚ ÜÓ n + 2 Ð Ó× ÔÙ × Ö ÓÖØ Ó Ò n ØÖ Ò ÙÐÓ׺ ÈÓÖ ÑÔÐÓ¸ Ý 1 6 = 5 Ö ÒØ × Ñ Ò Ö × ÓÖØ Ö 4 3 ÙÒ Ô ÒØ ÓÒÓ Ò ØÖ Ò ÙÐÓ׺ ¯ Ð ÒÙÑ ÖÓ Ñ Ò Ö × Ò ÕÙ n ÒÙÑ ÖÓ× ÔÙ Ò × Ö ÑÙÐØ ÔÐ Ó× ×Ó Ø Ú Ñ ÒØ ÓÒ 2n Ô Ö ÒØ × ×º ÈÓÖ ÑÔÐÓ¸ Ý 1 6 = 5º 4 3 (n1(n2(n3n4))) (n1((n2n3)n4)) ((n1n2)(n3n4)) ((n1(n2n3))n4) (((n1n2)n3)n4) ¯ Ð ÒÙÑ ÖÓ ÜÔÖ × ÓÒ × Ô Ö ÒØ Þ × ÓÒ n Ô Ö ÒØ × × ÞÕÙ Ö Ó× Ý n Ô Ö ÒØ × × Ö Ó× ÕÙ ×Ø Ò Ð Ò ×º ¯ Ð ÒÙÑ ÖÓ Ö ÓÐ × Ò Ö Ó× n ÒÓ Ó׺ ¯ Ð ÒÙÑ ÖÓ Ö ÓÐ × n + 1 ÒÓ Ó׺
  • 356.
    330 Cap´ ´ ıtulo 4. Arboles ÙÖ º¿½ Ö ÒØ × Ñ Ò Ö × ÓÖØ Ö ÙÒ Ô ÒØ ÓÒÓ Ò 3 ØÖ Ò ÙÐÓ× ¯ Ð ÒÙÑ ÖÓ Ñ ÒÓ× ÐÓÒ ØÙ 2n Ò ÙÒ Ñ ÐÐ n × n ÕÙ ×Ø Ò ÔÓÖ Ó Ð ÓÒ Ðº ÈÓÖ ÑÔÐÓ¸ Ô Ö ÙÒ Ñ ÐÐ 4 × 4¸ Ý 1 8 = 14 Ñ ÒÓ× 5 4 Ö ÒØ × ÕÙ Ô × Ò Ó Ð ÓÒ Ðº ÙÖ º¿¾ Ö ÒØ × Ñ ÒÓ× Ó Ð ÓÒ Ð Ò ÙÒ Ñ ÐÐ 4×4 ¯ Ð ÒÙÑ ÖÓ Ô Ð Ö × ÐÓÒ ØÙ 2n Ó Ð ÒÙÑ ÖÓ Ô Ð Ö × ÄÙ × Û Þ ÐÓÒ ØÙ 2n + 1º ¯ Ð ÒÙÑ ÖÓ Ñ ÒÓ× Ò Ð ÔÐ ÒÓ¸ ÓÒ ÓÖÑ Ó× ÔÓÖ 2n ÔÙÒØÓ׸ ÕÙ Ô ÖØ Ò × (0, 0) Ý Ø ÖÑ Ò Ò Ò (2n, 0) ÕÙ ÒÓ ÖÙÞ Ò Ð xº 4.9 ´ Arboles binarios de b´squeda u ËÙÔÓÒ ÑÓ× ÕÙ 1300 Ñ ÐÐÓÒ × Ô Ö×ÓÒ × ×Ø Ò ×Ù× Ö Ø × Ð × ÖÚ Ó Ø Ð ÓÒ Óº Ó Ð ÒÓÑ Ö ÙÒ ×Ù × Ö ÔØÓÖ¸ ÓÑÓ Ú Ö Ù Ö ×Ù ÒÙÑ ÖÓ Ø Ð ÓÒ Ó Ë ÐÓ× Ö ×ØÖÓ× ÕÙ ¹ ÐÐ × 1300 Ñ ÐÐÓÒ × Ô Ö×ÓÒ × ×Ø Ò ÓÖ Ò Ó× Ð Ø Ñ ÒØ Ò ÙÒ Ö ÚÓ¸ ÒØÓÒ × Ð Ù×ÕÙ Ò Ö ÒÓ× Ô ÖÑ Ø Ö Ò ÓÒØÖ Ö Ð ÒÙÑ ÖÓ ÐÙÐ Ö Ò Ë ÙÒÒ Ò ¹ ÙÒ ÏÙ Ò ÐÓ ×ÙÑÓ Ð 1300000000 = 31 ÒØ ÒØÓ׺ Ä Ù×ÕÙ Ò Ö Ü ÕÙ Ð × Ù Ò ØÓ× ×Ø ÓÖ Ò Ý ×ØÓ × Ð Ö ÒØ Þ Ö¸ ÔÙ × × ×Ô Ö Ö ÕÙ Ñ ÒÙ Ó Ô Ö Þ Ò ÒÙ ÚÓ× ×Ù × Ö ÔØÓÖ × Ý × Ô Ö Þ¹ Ò ÓØÖÓ׺ ØÙ Ð Þ Ö Ò Ð Ò ÙÒ × Ù Ò ÓÖ Ò ÒÙÑ ÖÓ× Ø Ð ÓÒ Ó× × Ö ÑÙÝ Ò ¬ ÒØ ¸ ÔÙ × Ð Ò× Ö ÓÒ Ý ×ÙÔÖ × ÓÒ Ò ÙÒ × Ù Ò ÓÖ Ò × O(n)º ÓÖØÙÒ Ñ ÒØ ¸ × Ò ÒÓ ÔÓ ÑÓ× Ñ ÒØ Ò Ö × Ò Óר × ÑÔÓÖØ ÒØ × ÙÒ × Ù Ò ÓÖ Ò ¸ × ÔÓ ÑÓ× × ÑÙÐ ÖÐ Ñ ÒØ ÙÒ Ö ÓÐ Ò Ö Ó ÕÙ ÑÙÐ Ð Ù×ÕÙ ÒÖ Ý ÕÙ ÒÓ× Ó Ö Þ ÓÖ Ò Ñ ÒØÓ Ý Ö Ô Þ Ô Ö Ð × ÓÔ Ö ÓÒ × Ò× Ö ÓÒ¸ Ù×ÕÙ Ý ×ÙÔÖ × ÓÒº
  • 357.
    ´ 4.9. Arboles binarios de b´squeda u 331 ´ Definici´n 4.9 (Arbol binario de b´ squeda) o u Ë ÙÒ Ö ÓÐ Ò Ö Ó T =< Ä(T ), Ö Þ(T ), Ê(T ) >¸ ÒØÓÒ ×¸ T × ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ ´ µ × Ý ×ÓÐÓ × ∀ni ∈ Ä(T ) =⇒ à (ni ) < à (Ö Þ(T )) Ý T∈ ⇐⇒ ∀ni ∈ Ê(T ) =⇒ à (ni ) > à (Ö Þ(T )) ר Ö Ð × ÓÒÓ ÓÑÓ Ð ÔÖÓÔ Ó ÓÒ ÓÒ ÓÖ Ò ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ º È Ö ×Ñ ÒÙ Ö Ð ÐÓÒ ØÙ Ð × ÙÖ×Ó¸ Ò ÑÙ Ó× ÓÒØ ÜØÓ× ÙØ Ð Þ Ö ÑÓ× ÔÖ ÒÓØ Ö ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ º 490 51 125 104 371 72 310 439 71 89 218 330 406 460 65 82 192 296 315 345 393 55 158 207 289 303 368 391 403 135 ÙÖ º¿¿ ÍÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ Ó ÙÒ ÒÓ Ó Ù ÐÕÙ Ö ¸ ØÓ Ó× ÐÓ× ÒÓ Ó× Ò Ð ×Ù Ö ÓÐ ÞÕÙ Ö Ó ÒØ Ò Ö Ð Ú× Ñ ÒÓÖ ×¸ Ñ ÒØÖ × ÕÙ ØÓ Ó× ÐÓ× ÒÓ Ó× Ò Ð ×Ù Ö ÓÐ Ö Ó Ò Ø Ò Ö Ð Ú × Ñ ÝÓÖ ×º Ð Ö ÓÐ Ð ¬ ÙÖ º¿¿ × Ø × Ð ¬Ò ÓÒº Ð ÓÖ Ò × ×Ø Ù Ò Ó × Ó × ÖÚ Ð Ö ÓÖÖ Ó Ò¬ Óº È Ö Ð Ö ÓÐ Ð ¬ ÙÖ º¿¿¸ Ð Ö ÓÖÖ Ó Ò¬ Ó × 51 55 65 71 72 82 89 104 125 135 158 192 207 218 289 296 303 310 315 330 345 368 371 391 393 403 406 439 460 490 º ר ÓÖ Ò × Ù Ð Ð ¬Ò ÓÒ Ú × Ø ÐÓ× ÒÓ Ó× Ð ÞÕÙ Ö ¸ ÐÓ× Ù Ð × ×ÓÒ Ñ ÒÓÖ × Ð Ö Þ¸ ÐÙ Ó Ú × Ø Ð Ö Þ Ý¸ ¬Ò ÐÑ ÒØ ¸ Ú × Ø ÐÓ× ÒÓ Ó× Ð Ö ¸ ÕÙ ×ÓÒ Ñ ÝÓÖ × ÕÙ Ð Ö Þº Ä ÔÖÓÔ ÓÖ Ò ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ Ô ÖÑ Ø Ó ¬ ÖÐÓ ÓÒ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó Ó ×Ù¬ Óº × Ö¸ ÔÓ ÑÓ× Ö ÓÒרÖÙ Ö ÓÑÔÐ Ø Ñ ÒØ ÙÒ Ô ÖØ Ö ×Ù Ö ÓÖÖ Ó ÔÖ ¬ Óº Ë n0, n1, . . . , n|T|−1 Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó ÙÒ T =< Ä(T ), Ö Þ(T ), Ê(T ) >º Ð Ö ¹ ÓÖÖ Ó ÔÖ ¬ Ó ÒÓ× ÔÖÓÔÓÖ ÓÒ Ö Ø Ñ ÒØ Ö Þ(T ) = n0 Ý Ö Þ(Ä(T )) = n1º Ä ÔÖÓÔ ÓÖ Ò ÒÓ× Ö ÒØ Þ ÕÙ Ö Þ(Ê(T )) × Ö Ð ÔÖ Ñ Ö ÒÓ Ó Ò Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó ÕÙ ×
  • 358.
    332 Cap´ ´ ıtulo 4. Arboles Ñ ÝÓÖ Ó Ù Ð ÕÙ Ö Þ(T )º × Ô٠׸ ÔÐ ÑÓ× ×Ø Ö ÞÓÒ Ñ ÒØÓ Ö ÙÖ× ÚÓ Ý Ó Ø Ò ÑÓ× Ð Ð ÓÖ ØÑÓ × Ù ÒØ ¿¿¾ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¾ ¿¿¾ template <class Node> inline Node * preorder_to_binary_search_tree(DynArray<typename Node::key_type> & preorder, const int & l, const int & r) { if (l > r) return Node::NullPtr; Node * root = new Node(preorder[l]); if (l == r) return root; Ë first greater Ð ÔÖ Ñ Ö ÒÓ Ó Ñ ÝÓÖ ÕÙ Ð Ö Þ ¿¿¾ LLINK(root) = preorder_to_binary_search_tree<Node>(preorder, l + 1, first_greater - 1); RLINK(root) = preorder_to_binary_search_tree<Node>(preorder, first_greater, r); return root; } Í× × DynArray ¾º right root × Ð ÔÖ Ñ Ö ÒÓ Ó¸ ÞÕÙ Ö Ö ¸ ÕÙ × Ñ ÝÓÖ ÕÙ Ð Ö Þ ´preorder[inf]µ ר ÒÓ Ó × Ð Ö Þ Ð ×Ù Ö ÓÐ Ö Óº È Ö ÐÓ Ð Þ ÖÐÓ¸ Ö ÓÖÖ ÑÓ× Ð Ò ÐÑ ÒØ Ð ÖÖ ÐÓ ¿¿¾ Ë first greater Ð ÔÖ Ñ Ö ÒÓ Ó Ñ ÝÓÖ ÕÙ Ð Ö Þ ¿¿¾ ≡ ´¿¿¾ µ int first_greater = l + 1; while ( (first_greater <= r) and (preorder[first_greater] < preorder[l])) ++first_greater; ר ÒÓ Ó Ô ÖØ ÓÒ Ð ÖÖ ÐÓ Ò Ó× Ô ÖØ ׺ Ä ÔÖ Ñ Ö ÓÑÔÖ Ò ÒØÖ l + 1 Ý right root - 1¸ ÓÖÖ ×ÔÓÒ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó Ð ×Ù Ö ÓÐ ÞÕÙ Ö Óº Ä × ÙÒ Ô ÖØ ¸ ÓÑÔÖ Ò ÒØÖ right root Ý r¸ ÓÖÖ ×ÔÓÒ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó Ð ×Ù Ö ÓÐ Ö Óº 4.9.1 B´squeda en un ABB u ÓÒ× Ö ÑÓ× T ∈ Ý ÙÒ Ð Ú k Ù× Ö× Ò Ð Ö Óк È Ö ÖÐÓ¸ Ò×Ô ÓÒ ¹ ÑÓ× Ã (T )¸ × k = à (T )¸ ÒØÓÒ × k × Ó Ò ÓÒØÖ Óº ÐÓ ÓÒØÖ Ö Ó¸ ÓÑÔ Ö ¹ ÑÓ× k < à (T ) × Ð ÔÖ Ó × ÖØÓ¸ ÒØÓÒ × Ù× ÑÓ× Ò Ð ×Ù Ö ÓÐ ÞÕÙ Ö Ó ÐÓ ÓÒØÖ Ö Ó¸ Ù× ÑÓ× Ò Ð ×Ù Ö ÓÐ Ö Óº Ë ÙÖ ÒØ ר ÔÖÓ ×Ó ÒÓ× Ò ÓÒØÖ ÑÓ× ÓÒ ÙÒ ×Ù Ö ÓÐ Ú Ó¸ ÒØÓÒ × ÓÒ ÐÙ ÑÓ× ÕÙ k ÒÓ × Ò Ù ÒØÖ ÒØÖÓ Ð Ö Óк Ð × Ù ÒØ Ð ÓÖ ØÑÓ Ö ­ ר ÔÖÓ ×Ó ¿¿¾ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¿¿¾ ¿¿¿ template <class Node, class Compare> inline Node * searchInBinTree(Node * root, const typename Node::key_type & key) { while (root != Node::NullPtr) if (Compare () (key, KEY(root))) // ¿Est´ en rama izquierda? a root = static_cast<Node*>(LLINK(root)); // baje a rama izquierda else if (Compare() (KEY(root), key)) // ¿Est´ en rama derecha? a root = static_cast<Node*>(RLINK(root)); // baje a rama derecha else break; // se encontr´! o
  • 359.
    ´ 4.9. Arboles binarios de b´squeda u 333 return root; } ¬Ò × searchInBinTree¸ Ù× Ò ÙÒ ¿¿ º ר ÔÖ Ñ Ø Ú Ù× Ò Ð Ö ÓÐ ÙÒ ÒÓ Ó ÓÒ Ú ÐÓÖ Ð Ú key Ý Ö ØÓÖÒ ×Ù Ö ÓÒ × Ð Ð Ú × Ò ÓÒØÖÓ Ó Node::NullPtr ÐÓ ÓÒØÖ Ö Óº searchInBinTree() × ÙØ Ð Þ Ò Ð Ñ ÝÓÖ Ì ÙÒ Ñ ÒØ Ó× Ò º Ð × ÑÔ ÒÓ ×Ø Ð ÓÖ ØÑÓ Ô Ò Ù Ò ÕÙ Ð Ö Ó ×Ø Ð Ö Óк Ë ×Ø Ø Ò ×Ø Ö ÓÑÔÐ ØÓ¸ ÒØÓÒ × ×Ù ÐØÙÖ Ø Ò Ð |T | º ר ÑÓ Ó¸ × Ö ÒØ Þ ÑÓ× ÕÙ Ð Ö ÓÐ × ÕÙ Ð Ö Ó¸ ÒØÓÒ × Ð Ù×ÕÙ Ò ÙÒ Ö ÓÐ Ò Ö Ó ÒÓ Ö ÕÙ Ö Ö Ñ × Ð |T | ÓÑÔ Ö ÓÒ × Ü Ø Ñ ÒØ Ð Ñ ×Ñ Ð × ÖÚ Ó Ð Ù×ÕÙ ÒÖ º Ð ØÖÙ Ó ×¸ Ô٠׸ ÐÓ Ö Ö ÕÙ Ð × Ò× Ö ÓÒ × Ý ×ÙÔÖ × ÓÒ × Ð Ö ÓÐ ÐÓ Ñ ÒØ Ò Ò Ò ÕÙ Ð Ö Óº 4.9.1.1 B´ squeda del menor y del mayor elemento de un ABB u Ë ÑÓ× ÕÙ Ð Ö ÓÖÖ Ó Ò¬ Ó ÙÒ ÑÙ ×ØÖ Ð × Ù Ò ÓÖ Ò º ÈÓÖ Ø ÒØÓ¸ Ð Ñ ÒÓÖ Ý Ð Ñ ÝÓÖ ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ× Ð ÓÒ ÙÒØÓ ×Ø Ö Ò Ó× ÔÓÖ Ð ÔÖ Ñ Ö Ý ÙÐØ ÑÓ Ð Ñ ÒØÓ× Ð Ö ÓÖÖ Ó Ò¬ Ó¸ ÐÓ× Ù Ð × × ÒØ ¬ Ò Ô ØÓÖ Ñ ÒØ ¸ Ñ Ò Ö Ò Ö Ð¸ Ò Ð × Ù ÒØ ¬ ÙÖ T L(T ) R(T ) M´nimo −→ ı ←− M´ximo a ÈÖ T∈ ¸ Ð Ñ Ò ÑÓ × Ò Ù ÒØÖ Ò Ð ÒÓ Ó Ñ × Ð ÞÕÙ Ö ¸ Ñ ÒØÖ × ÕÙ Ð Ñ Ü ÑÓ Ò Ð Ñ × Ð Ö º ר ÓÒÓ Ñ ÒØÓ¸ × Ù Ò ÐÓ× × Ù ÒØ × Ð ÓÖ ØÑÓ× ¿¿¿ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¿¿¾ ¿¿ template <class Node> Node * find_min(Node * root) { while (LLINK(root) != Node::NullPtr) root = static_cast<Node*>(LLINK(root)); return root; } template <class Node> Node * find_max(Node * root) { while (RLINK(root) != Node::NullPtr) root = static_cast<Node*>(RLINK(root)); return root; } Ñ × ÔÖ Ñ Ø Ú × Ö Ò ÙÒ ÒÓ Ó Ö Þ ÙÒ Ý Ö ØÓÖÒ Ò Ð Ñ Ò ÑÓ Ý Ñ Ü ÑÓ¸ Ö ×Ô Ø Ú Ñ ÒØ º Ë Ð ×Ø ÕÙ Ð Ö Ó¸ ÒØÓÒ × find min() Ý find max() Ø Ò Ò ÓÑÔÐ O(Ð n)º
  • 360.
    334 Cap´ ´ ıtulo 4. Arboles 4.9.1.2 B´ squeda del predecesor y sucesor u ÓT∈ ¸ Ù Ð × Ð ×Ù ×ÓÖ Ã (T )? ÈÓÖ Ð ÔÖÓÔ ÓÖ Ò ÙÒ ¸ × ÑÓ× ÕÙ ×Ø ×Ù ×ÓÖ¸ × Ü ×Ø ¸ × Ò Ù ÒØÖ Ò Ð ÒÓ Ó Ñ × Ð ÞÕÙ Ö Ð ÖÑ Ö Ý Ð ÓÒ ÓÒ Ü ×Ø Ò ×¸ Ùר Ñ ÒØ ¸ ÕÙ Ü ×Ø ÙÒ Ö Ñ Ö º ÐÓ ÒØ Ö ÓÖ¸ × Ù Ð Ð ÓÖ ØÑÓ × Ù ÒØ ¿¿ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¿¿¿ ¿¿ template <class Node> inline Node * find_successor(Node * p, Node *& pp) { pp = p; p = static_cast<Node*>(RLINK(p)); while (LLINK(p) != Node::NullPtr) { pp = p; p = static_cast<Node*>(LLINK(p)); } return p; } find successor() Ö ØÓÖÒ Ð ÒÓ Ó ×Ù ×ÓÖ p Ý ×Ù Ô Ö Ò Ð Ô Ö Ñ ØÖÓ ppº Ä ÐÐ Ñ Ö Ð Þ Ö× ×Ó Ö p Ý ×Ù Ô Ö º ÄÓ Ð ÒØ find successor() × ÕÙ ÒÓ × Ö ÕÙ Ö ÙÒ ÓÔ Ö ÓÖ ÓÑÔ Ö ÓÒº Ä ØÓÔÓÐÓ Ð Ö ÓÐ ÔÖÓÔÓÖ ÓÒ Ð Ö ×ÙÐØ Óº T L(T ) R(T ) ←−Predecesor Sucesor−→ ÙÖ º¿ Í ÓÒ × Ò Ö Ð × Ð ÒÓ Ó ÔÖ ×ÓÖ Ý ×Ù ×ÓÖ Ð Ö Þ ÙÒ Ö ÓÐ T Ä Ù×ÕÙ Ð ÔÖ ×ÓÖ × Ò ÐÓ º 4.9.1.3 B´ squedas especiales sobre un ABB u Ò Ð ÙÒ × ÒÓ Ø Ò Ü Ô ÓÒ Ð × Ó × ÓÒ × × Ö ÕÙ Ö Ò ÓÒØÖ Ö ÙÒ ÒÓ Ó ÕÙ ¸ Ò ÐÙ Ö ÓÖÖ ×ÔÓÒ Ö× ÓÒ Ð Ð Ú ¸ Ð ÙÒ ÓÖÑ Ù Ö ÓØÖ Ö Ð ÓÒ ÓÒ ÐÐ º Ò ×Ø × ØÙ ÓÒ Ò Ò Ó× Ø ÔÓ× Ù×ÕÙ Ð Ð Ô Ö ÙÒ Ð Ú Ô ÖØ Ò ÒØ Ð Ö ÓÐ Ý Ð Ð ÕÙ × Ö Ð Ô Ö ÙÒ Ð Ú ÒÓ Ô ÖØ Ò ÒØ º Ä ÔÖ Ñ Ö Ù×ÕÙ × ÜÔÖ × Ð × Ù ÒØ ÑÓ Ó ¿¿ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¿¿ ¿¿ template <class Node, class Compare> inline Node * search_parent(Node * root, const typename Node::key_type & key, Node *& parent) { while (true) if (Compare () (key, KEY(root)))
  • 361.
    ´ 4.9. Arboles binarios de b´squeda u 335 { if (LLINK(root) == Node::NullPtr) return root; parent = root; root = static_cast<Node*>(LLINK(root)); } else if (Compare () (KEY(root), key)) { if (RLINK(root) == Node::NullPtr) return root; parent = root; root = static_cast<Node*>(RLINK(root)); } else return root; } search parent() Ù× Ð Ð Ú key Ò Ð ÙÝ Ö Þ × rootº Ä ÖÙØ Ò Ö ØÓÖÒ Ð ÒÓ Ó ÕÙ ÓÒØ Ò key Ý ×Ù ÒÓ Ó Ô Ö × Ù Ö Ò Ð Ô Ö Ñ ØÖÓ ÔÓÖ Ö Ö Ò parent¸ Ð ÙÐ Ò Ð Þ Ö× Ò Ð Ô Ö Ð Ö Þº ÓÒ× Ö ÑÓ× Ð × Ù ÒØ ÑÔÐÓ 50 25 80 10 30 90 Ð Ö ÓÐ ÓÒØ Ò Ð × Ð Ú × 10, 25, 30, 50, 80, 90 ÒØÖ ÙÒ ÓÒ ÙÒØÓ Ò¬Ò ØÓ ÔÓ× Ð × Ú ¹ ÐÓÖ ×º Ë Ð Ö ÓÐ Ö × Ò ØÙÖ ÐÑ ÒØ × Ö¸ ×ÓÐÓ ÔÓÖ ×Ù× ÔÙÒØ ׸ Ò ÓÒ ÓÐÓ Ö ÒÙ Ú × Ð Ú × º Ä Ö ×ÔÙ ×Ø × Ú Ò Ò Ð Ö ÓÐ × Ù ÒØ 50 25 80 10 30 [51..79] 90 [−∞..9] [11..24] [26..29] [31..49] [81..89] [91..∞] Ð ÙÒ Ó ×Ô Ó ½ ÔÓÖ ÓÒ ÔÙ Ö Ö Ò ØÙÖ ÐÑ ÒØ ÙÒ × ØÖ Ú × ×Ù× ÒÓ Ó× ÜØ ÖÒÓ׺ Ó ÓØÖÓ ÑÓ Ó¸ ÕÙ Ð Ú Ó ÕÙ Ö ÔÖ × ÒØ ÙÒ ÒÓ Ó ÜØ ÖÒÓ × Ó ÙÔ Ó × Ñ ÒØ ÔÓÖ ÙÒ ÒÙ ÚÓ ÒÓ Ó ÒØ ÖÒÓº ÄÙ Ó ÜÔÖ × Ó ÐÓ ÒØ Ö ÓÖ¸ ÕÙ Ö × ÒØ Ó Ô Ò× Ö ÙÒ Ù×ÕÙ ÙÒ Ö Ò Ó ÕÙ ÒÓ ×Ø Ò Ð Ö Óк Ç × ¸ Ù× Ö ÐÓ× ÔÙÒØÓ× ÔÓÖ ÓÒ ÔÙ Ö Ö ÙÒ ºÌÐ Ù×ÕÙ Ð ÒרÖÙÑ ÒØ Ð ÙÒ ÓÒ ¿¿ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¿¿ ¿¿ template <class Node, class Compare> inline Node * search_rank_parent(Node * root, const typename Node::key_type & key) ½ Ò ×Ø Ô ÖÖ Ó Ð × ÒÓ ÓÒ × ×Ô Ó ¸ Ò ØÙÖ Ð Ý × Ó × ÒÙÒ Ò Ò Ð × ÒØ Ó Ð Ò × ÑÓ ÖÒ º Ë Ù× Ò ÓÑ ÐÐ × Ý Ò × × Ø Ð Ó ÔÓÖÕÙ Ø Ð × × ÕÙ ¸ × Ò Ø Ñ Ò ×ÓÒ ×ØÖ Ø × Ò ÒÙ ×ØÖÓ ÑÙÒ Ó ÓØ ÒÓ¸ ×ÓÒ ÙÒ Ñ × ×ØÖ Ø × Ò Ð × ÙÖ×Ó Ð ÔÖÓ Ö Ñ ÓÒ ÓÑÔÙØ ÓÖ × Ñ Ü Ñ Ù Ò Ó Ð ÓÒ ÔØÓ Ö ÓÐ Ò Ö Ó ×¸ ÓÑÓ Ø Ð¸ ÔÙÖ ×ØÖ ÓÒº
  • 362.
    336 Cap´ ´ ıtulo 4. Arboles ÙÝ ÑÔÐ Ñ ÒØ ÓÒ ÔÙ Ó × ÖÚ Ö× Ò Ð Ð ÓØ º Ä ÖÙØ Ò Ù× Ð Ð Ú key Ò ÙÒ Ö ÓÐ ÓÒ Ö Þ root Ý Ö ØÓÖÒ Ð ÒÓ Ó ÕÙ × Ö Ô Ö ÙÒ Ð Ú keyº 4.9.2 El TAD BinTree<Key> ÒØ × ÒØÖÓ Ù Ö ÐÓ× Ð ÓÖ ØÑÓ× Ò× Ö ÓÒ Ý ×ÙÔÖ × ÓÒ¸ × ÓÒÚ Ò ÒØ ÒØÖÓ Ù Ö ÒÙ ×ØÖÓ Ì × ÕÙ ÑÓ Ð Þ ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ º Ì Ð Ì × ×Ô ¬ Ò Ð Ö ÚÓ ØÔÐ ÒÌÖ ºÀ ¿¿ ÙÝ ×ØÖÙ ØÙÖ × Ð × Ù ÒØ ¿¿ ØÔÐ ÒÌÖ ºÀ ¿¿ ≡ template <template <typename> class NodeType, typename Key, class Compare> class GenBinTree { ¬Ò ÓÒ × ÔÙ Ð × BinTree<Key> ¿¿ Ñ Ñ ÖÓ× ØÓ BinTree<Key> ¿¿ Å ØÓ Ó× BinTree<Key> ¿¿ }; template <typename Key, class Compare = Aleph::less<Key> > class BinTree : public GenBinTree<BinNode, Key, Compare> { /* empty */ }; template <typename Key, class Compare = Aleph::less<Key> > class BinTreeVtl : public GenBinTree<BinNodeVtl, Key, Compare> { /* empty */ }; Í× × BinNode ¾ ¼ Ò BinNodeVtl ¾¼º ØÔÐ ÒÌÖ ºÀ ¿¿ ¬Ò ØÖ × Ð × × ¯ GenBinTree<NodeType, Key, Compare> ÕÙ × Ð Ð × Ò Ö ÕÙ ÑÔÐ ÒØ Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð ×ØÖÙ ØÙÖ × ØÓ×½ Ñ ÒØ ÙÒ º ר Ð × ×ÓÐÓ ×Ø ר Ò ÑÔÐ ÒØ Ö Ý ÒÓ × Ù×Ó Ð Ð ÒØ º ¯ BinTree<Key> ÕÙ × ÙÒ Ð × Ô Ö Ñ ØÖ Þ ÕÙ ÑÔÐ ÒØ Ð ÔÖÓ Ð Ñ ÙÒ Ñ Ò¹ Ø Ð ØÖ Ú × ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ ÒÓ Ó× Ò Ö Ó× ÓÒ Ð Ú × Ø ÔÓ Keyº ר Ð × × ÑÔÐ ÒØ Ö Ø Ñ ÒØ ÔÓÖ Ö Ú ÓÒ ÔÙ Ð GenBinTreeº × Ô٠׸ ×Ù ÒØ Ö Þ × Ü Ø Ñ ÒØ Ð Ñ ×Ñ ÕÙ GenBinTreeº ¯ BinTreeVtl<Key> ÕÙ × ÕÙ Ú Ð ÒØ Ð BinTree<Key> × ÐÚÓ ÕÙ ÐÓ× ÒÓ Ó× ÔÓ× Ò ×ØÖÙ ØÓÖ × Ú ÖØÙ Ð ×º ÈÖ Ð Ø Ö ÐÓ× Ð ÓÖ ØÑÓ׸ ØÓ Ó× ÐÓ× Ø ÔÓ× ×ØÖ ØÓ× × Ó× Ò Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ ÙØ Ð Þ Ö Ò ÙÒ ÒÓ Ó Ö ¿¿ Ñ Ñ ÖÓ× ØÓ BinTree<Key> ¿¿ ≡ ´¿¿ µ Node headNode; Node * head; Node *& root; headNode Ö ÔÖ × ÒØ Ð ÒÓ Ó Ö ¸ head × Ð Ö ÓÒ Ð Ö Ý root × ÙÒ Ö ÖÒ Ð Ð ÞÓ Ö Ó headº Ò ÓØÖÓ× Ø ÖÑ ÒÓ׸ RLINK(head) == rootº ½ Ê ÓÖ Ö Ü ½º¿ ´Ô Ò ½ µº
  • 363.
    ´ 4.9. Arboles binarios de b´squeda u 337 Ä × ÔÖ Ñ Ø Ú × GenBinTree Ñ Ò ÔÙÐ Ò ÒÓ Ó× Ò Ö Ó× ÙÝ ×Ô ¬ ÓÒ × ÜÔÓÖØ Ð Ù×Ù Ö Ó Ð × Ù ÒØ ÑÓ Ó ¿¿ ¬Ò ÓÒ × ÔÙ Ð × BinTree<Key> ¿¿ ≡ ´¿¿ µ typedef NodeType<Key> Node; Ð Ø ÔÓ × Ö BinTree<Key>::Node Ô Ö ÒÓ Ó× ÓÑÙÒ × Ó BinTreeVtl<Key>::Node Ô Ö ÒÓ Ó× ÓÒ ×ØÖÙ ØÓÖ × Ú ÖØÙ Ð ×º GenBinTree esta clase esta destinada solo a implantar no es de uso del cliente class NodeType, class Key, class Compare: GenBinTree -headNode: Node -head: Node * -root: Node * -<<GenBinTree(const GenBinTree<NodeType, Key>& )>> GenBinTree() -<<GenBinTree & operator =(const GenBinTree &)>> operator =() -remove(p:Node*,pp:Node*) +GenBinTree() +search(key:const Key&): Node * +~GenBinTree(): virtual +getRoot(): Node*& +verifyBin(): bool +reset(): void +remove(key:const Key&): Node* Key: BinTree<Key> +BinTree() Key: BinTreeVtl +BinTreeVtl() ÙÖ º¿ Ö Ñ ÍÅÄ Ð × Ð × × ÓÒ ÖÒ ÒØ × BinTree<Key> Ä Ù×ÕÙ × Ö Ñ Ø ÒÚÓ Ö searchInBinTree() ¿¿ Å ØÓ Ó× BinTree<Key> ¿¿ ≡ ´¿¿ µ ¿¿ Node * search(const Key & key) { return searchInBinTree <Node, Compare>(root, key); } Í× × searchInBinTree ¿¿¾ º ÍÒ Ó × ÖÚ ÓÖ × Ò Ð¸ ×Ó Ö ØÓ Ó Ô Ö ÔÓ Ö Ð Ö Ö Ð Ñ ÑÓÖ Ó ÙÔ ÔÓÖ Ð Ö ÓÐ Ò Ö Ó¸ × Ð ÓÒ×ÙÐØ Ð Ö Þ ¿¿ Å ØÓ Ó× BinTree<Key> ¿¿ +≡ ´¿¿ µ ¿¿ ¿¿ Node*& getRoot() { return root; } 4.9.3 Inserci´n en un ABB o Ä Ò× Ö ÓÒ Ó Ð Ö Ñ ÒØÓ Ò ØÙÖ Ð ÙÒ Ö ÓÐ × Ö¸ ÔÓÖ Ð × ÔÙÒØ × Ù Ó ×º Ó ÙÒ ÒÓ Ó Ò× ÖØ Ö p¸ ÑÓ× Ò ÓÒØÖ Ö ÙÒ ÒÓ Ó ÜØ ÖÒÓ Ô Ö ×Ùר ØÙ ÖÐÓ
  • 364.
    338 Cap´ ´ ıtulo 4. Arboles ÔÓÖ p Ñ Ò Ö Ø Ð ÕÙ ÒÓ × Ú ÓÐ Ð ÔÖÓÔ ÓÖ Ò ÙÒ º ×ÙÑ Ò Ó ÕÙ Ð × Ð Ú × ÒÓ × Ö Ô Ø Ò¸ ÓÒ ÓÒ ÕÙ × ÓÖ ÑÔÓÒ ÑÓ× Ð Ì BinTree<Key>¸ Ü ×Ø ÙÒ ×ÓÐÓ ÒÓ Ó ÜØ ÖÒÓ Ô Ö ×Ùר ØÙ Ö ÔÓÖ pº ÈÓÖ ÑÔÐÓ¸ ÓÒ× Ö ÑÓ× Ò× ÖØ Ö ÙÒ ÒÓ Ó ÕÙ ÓÒØ Ò Ú ÐÓÖ Ð Ú 27 23 23 15 47 15 47 10 31 59 10 31 59 27 ´ µ ÒØ × 27 ´ µ ÄÙ Ó 27 РܹÒÓ Ó¹ ÜØ ÖÒÓ ¸ Ó ÞÕÙ Ö Ó Ð 31¸ Ù ×Ùר ØÙ Ó ÔÓÖ ÙÒÓ ÒØ ÖÒÓ ÓÒ Ú ÐÓÖ 27¸ Р٠и ØÖ Ú × ×Ù× Ó× ÒÓ Ó× ÜØ ÖÒÓ׸ Ö Ó× Ö × Ò Ð Ö Óк Ä ÔÖ Ñ Ö ×Ø ÔÓÖ Ð Ð ÞÓ ÞÕÙ Ö Ó Ð 27 Ý ÔÙ Ð Ö Ö Ð Ú × ÒØÖ [24..26]¸ Ñ ÒØÖ × ÕÙ Ð × ÙÒ Ö Ð Ö ÔÖ × ÒØ Ð Ð ÞÓ Ö Ó Ý ÔÓ Ö Ð Ö Ö Ð Ú × ÒØÖ [28..30]º Ð Ö Ó ÒØ Ö ÓÖ ÒÓ× Ò ÕÙ Ô Ö ØÙ Ö ÙÒ Ò× Ö ÓÒ × Ñ Ò ×Ø Ö Ù× Ö Ð ÒÓ Ó ÜØ ÖÒÓ ×Ù ×Ø ØÙ Öº ÓÖ Ò¸ ØÓ× ÒÐ Þ Ö Ð ÒÙ ÚÓ ÒÓ Ó¸ × Ö ¹ ÕÙ Ö Ó Ø Ò Ö ÙÒ ÔÙÒØ ÖÓ Ð ÕÙ × Ö Ð Ô Ö Ð ÒÓ Ó Ò× ÖØ Ö ¹ Ò Ð ÑÔÐÓ¸ ÙÒ ÔÙÒØ ÖÓ Ð ÒÓ Ó ÓÒ Ð Ú 31¹º Ë Ò ×Ø ÓÒ ÔÙ ÒרÖÙÑ ÒØ Ö× Ñ ÒØ Ð ÖÙØ Ò search rank parent() Ñ Ò ÓÒ Ò Ü º º½º¿ ´Ô Ò ¿¿ µ¸ × ÔÖ Ö Ð ¸ ¹ ØÓ× Ð × ÑÔÐ ¸ Ñ ÑÓÖ Þ Ö ×Ø ÔÙÒØ ÖÓ Ö Ð Þ Ò Ó ÙÒ Ù×ÕÙ Ö ÙÖ× Ú Ý ÐÙ Ó Ò× ÖØ Ò Ó Ð ÒÙ ÚÓ ÒÓ Óº ר × Ð Ò ÓÕÙ Ð × Ù ÒØ Ð ÓÖ ØÑÓ ¿¿ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¿¿ ¿¿ template <class Node, class Compare> inline Node * insert_in_binary_search_tree(Node *& root, Node * p) { if (root == Node::NullPtr) return root = p; if (Compare () (KEY(p), KEY(root))) // ¿p < root? return insert_in_binary_search_tree <Node, Compare> // insertar en izquierdo (static_cast<Node*&>(LLINK(root)), p); else if (Compare () (KEY(root), KEY(p))) // ¿p > root? return insert_in_binary_search_tree <Node, Compare> // insertar en derecho (static_cast<Node*&>(RLINK(root)), p); return Node::NullPtr; // clave repetida ==> no hay inserci´n o } ¬Ò × insert in binary search tree¸ Ù× Ò ÙÒ × ¿¿ Ò ¿ º Ä ÖÙØ Ò Ò× ÖØ Ð ÒÓ Ó p Ò Ð ÓÒ Ö Þ root Ý Ö ØÓÖÒ Ð Ö Þ Ð Ö ÓÐ Ò Ö Ó Ö ×ÙÐØ ÒØ Ò ×Ó ÕÙ Ð Ò× Ö ÓÒ Ø Ò Ü ØÓ × Ö¸ × Ð Ð Ú ÓÒØ Ò Ò p ÒÓ × Ò Ù ÒØÖ Ò Ð Ö Óк ÐÓ ÓÒØÖ Ö Ó¸ ÔÙ ×ØÓ ÕÙ ÒÓ × Ô ÖÑ Ø Ò Ð Ú × ÙÔР׸ × Ö ØÓÖÒ Node::NullPtrº ÆÓØ ÑÓ× ÕÙ Ð Ô Ö Ñ ØÖÓ root × Ô × ÔÓÖ Ö Ö Ò ¸ Ô٠׸ Ò Ð ×Ó × Ð Ö ÙÖ× ÓÒ¸ × ÑÓ ¬ Ð Ö Þº
  • 365.
    ´ 4.9. Arboles binarios de b´squeda u 339 Å ÒØ Ð ÒØ Ö ÓÖ ÖÙØ Ò Ò Ö ¸ Ð ÑÔÐ ÒØ ÓÒ Ð Ñ ØÓ Ó insert() × Ñ Ö Ù ×Ø ÓÒ ÓÖÑ ¿¿ Å ØÓ Ó× BinTree<Key> ¿¿ +≡ ´¿¿ µ ¿¿ ¿½ Node * insert(Node *p) { return insert_in_binary_search_tree<Node, Compare>(root, p); } Í× × insert in binary search tree ¿¿ º 4.9.4 Partici´n de un ABB por clave (split) o Ò ×Ø ÓÔ Ö ÓÒ¸ ÙÒ Ö ÓÐ T ÓÒ × Ù Ò Ò¬ Ò Ö Si =< k1, k2, k3, . . . , kn > × Ô ÖØ ÓÒ × ÙÒ ÙÒ Ð Ú kx Ò Ó× Ö ÓÐ × T< Ý T> Ø Ð ÕÙ Si =< k1, k2, k3, . . . , > | < ∀ki ∈ T<, ki < kx Ý Si =< . . . , kn > | ∀ki ∈ T>, ki > kxº > Ä ÔÖ Ñ Ø Ú ÕÙ ÒÓ× Ö Ð Þ Ð Ô ÖØ ÓÒ × ÒÓÑ Ò split key rec(T, kx, T<, T>) ÓÒ T × Ð Ö ÓÐ Ô ÖØ ÓÒ Ö¸ kx × Ð Ð Ú Ô ÖØ ÓÒ Ý T< Ý T> ×ÓÒ ÐÓ× Ö ÓÐ × Ö ×ÙÐØ ÒØ × Ð Ô ÖØ ÓÒº Ð ÔÖ Ò Ô Ó Ö ÙÖ× ÚÓ Ð Ô ÖØ ÓÒ × × ÑÔÐ Ý × Ô ØÓÖ Þ Ò Ð Ö Ñ × Ù ÒØ split key rec(T, k x , T < , T > ) split key rec(T, k x , T < , T > ) K(T ) K(T ) if k x > à (T ) split key rec(R(T), k x , R(T), T > ) L(T ) R(T ) L(T ) T< T> T< T> =⇒ ´ µ Ë ØÙ ÓÒ Ò Ð ´ µ ÄÙ Ó split() ÒÖ Þ ÄÐ Ñ ÑÓ× kx Ð Ð Ú Ô ÖØ ÓÒ Ý ×ÙÔÓÒ ÑÓ× kx > à (T )º Ò ×Ø ×Ó¸ × ØÙ ÙÒ ÐÐ Ñ Ö ÙÖ× Ú split key rec(Ê(T ), kx, T<, T>) ×Ó Ö Ê(T )¸ Ð Ù Ð ÖÖÓ Ó× Ö ÓÐ × T< Ý T> ÔÖÓ Ù ØÓ Ô ÖØ ÓÒ Ö Ê(T ) ÓÒ kxº Ð Ö ×ÙÐØ Ó ¬Ò Ø ÚÓ × T< =< Ä(T ), T, Ä(T ) > ÓÒ Ä(T ) = T<º Ä ÓØÖ Ô ÖØ ÓÒ¸ T>¸ × Ö Ø Ñ ÒØ Ð Ö ÓÐ T> = T>º Ë kx < à (T ) Ð Ð ÓÖ ØÑÓ × × Ñ ØÖ Ñ ÒØ ÒØ Óº Ð ×Ó × Ð Ö ÙÖ× ÓÒ × Ð Ô ÖØ ÓÒ ×Ó Ö Ð Ö ÓÐ Ú Ó¸ Ð Ù Ð ÖÖÓ Ó× Ö ÓÐ × Ú Ó׺ ÓÒ ÐÓ ÒØ Ö ÓÖ¸ Ð Ð ÓÖ ØÑÓ Ö ×ÙÐØ ÒØ Ö × Ö ÓÑÔÖ Ò× Ð × Ò ¬ ÙÐØ × ¿¿ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¿¿ ¿ ½ # define SPLIT split_key_rec<Node, Compare> template <class Node, class Compare> inline bool split_key_rec(Node * root, const typename Node::key_type & key, Node *& ts, Node *& tg) { if (root == Node::NullPtr)
  • 366.
    340 Cap´ ´ ıtulo 4. Arboles { // key no se encuentra en arbol ==> split tendr´ ´xito ´ a e ts = tg = Node::NullPtr; return true; } if ( Compare() (key, KEY(root)) ) // ¿key < KEY(root)? if (SPLIT(static_cast<Node*&>(LLINK(root)), key, ts, static_cast<Node*&>(LLINK(root)))) { tg = root; return true; } else return false; if ( Compare() (KEY(root), key) ) // ¿key > KEY(root)? if (SPLIT(static_cast<Node*&>(RLINK(root)), key, static_cast<Node*&>(RLINK(root)), tg)) { ts = root; return true; } else return false; return false; // clave existe en arbol ==> se deja intacto ´ } ¬Ò × split key rec¸ Ù× Ò ÙÒ × ¿ ½ Ò ¿ º 19 29 split key rec(29, 19, ...) split key rec(13, 19, ...) 13 45 split key rec(25, 19, ...) 8 25 30 77 split key rec(20, 19, ...) 1 12 20 27 53 91 split key rec(15, 19, ...) 15 22 split key rec(18, 19, ...) 18 ÙÖ º¿ ÌÖ Þ Ó ÙÒ Ð Ò Ú × ÓÒ Ø Ò Ù ØÖÓ Ô Ö Ñ ØÖÓ׸ Ó× split key rec() ÒØÖ Ý Ó× × Ð º ÄÓ× ÒØÖ ×ÓÒ Ð Ö Þ Ð Ö ÓÐ Ô ÖØ ÓÒ Ö root Ý Ð Ð Ú Ô ÖØ ÓÒ keyº ÄÓ× Ô Ö Ñ ØÖÓ× × Ð ×ÓÒ Ó× Ö ÓÐ × ts Ý tgº ×ÔÙ × Ð ÐÐ Ñ ¸ ts ÓÒØ Ò Ð Ð Ú × Ñ ÒÓÖ × ÕÙ key Ý tg ÓÒØ Ò Ð × Ñ ÝÓÖ × Ó Ù Ð ×º Ë Ð Ð Ú ÒÓ × Ò Ù ÒØÖ Ò Ð Ö Óи ÒØÓÒ × split key rec() Ö ØÓÖÒ true Ô Ö Ò Ö ÕÙ Ð Ö ÓÐ Ù Ô ÖØ ÓÒ Óº ÐÓ ÓÒØÖ Ö Ó¸ × Ð Ö ÓÐ ÒØ ØÓ Ý × Ö ¹ ØÓÖÒ falseº È ØÓÖ Ñ ÒØ ¸ Ð Ô ÖØ ÓÒ ÔÙ ÒØ ÖÔÖ Ø Ö× ÓÑÓ Ð ØÖ Þ Ó ÙÒ Ð Ò Ú ×ÓÖ × ÙÒ Ð Ð Ú Ô ÖØ ÓÒº Ä ¬ ÙÖ º¿ ÐÙ×ØÖ Ø Ð Ð Ò ÓÒ Ð Ú 19 Ý × Ò Ò Ð ×
  • 367.
    ´ 4.9. Arboles binarios de b´squeda u 341 ÐÐ Ñ × Ö ÙÖ× Ú × Ð Ô ÖØ ÓÒº × Ð ÒÓ Ó Ö Þ 29¸ × Ø ÖÑ Ò ÕÙ ÑÓ× Ô ÖØ ¹ ÓÒ Ö Ð Ö Ñ ÞÕÙ Ö Ö Þ 13¸ ÔÙ × 19 × Ñ ÒÓÖ ÕÙ 29º split key rec(13, 19, ts, tg) Ö ØÓÖÒ Ð Ô ÖØ ÓÒ Ð ×Ù Ö ÓÐ ÓÒ Ö Þ 13º Ð Ô Ö Ñ ØÖÓ ts × Ð Ö ÓÐ T< Ö ×ÙÐØ Ó split key rec (29, 19, ts, tg)¸ Ñ ÒØÖ × ÕÙ Ð Ö ÓÐ T> × Ö < tg, 29, Ê(29) >º ÓÒ Ð ÖÙØ Ò ÒØ Ö ÓÖ¸ Ý ×Ø ÑÓ× Ð ×ØÓ× Ô Ö × Ö Ö Ð Ú Ö× ÓÒ Ð Ô ÖØ ÓÒ Ð Ì BinTree<Key> ¿½ Å ØÓ Ó× BinTree<Key> ¿¿ +≡ ´¿¿ µ ¿¿ ¿ ¿ bool split(const Key & key, GenBinTree & l, GenBinTree & r) { return split_key_rec<Node, Compare>(root, key, l.root, r.root); } Í× × split key rec ¿¿ º 4.9.5 Uni´n exclusiva de ABB (join exclusivo) o ÓÒ× Ö ÑÓ× Ó× Ö ÓÐ × T< Ý T> Ö ×ÙÐØ ÒØ × split key rec() Ý Ð ÓÔ Ö ÓÒ ÒÚ Ö× Ô Ö T< Ý T> Ò ÙÒ Ö ÓÐ T º Ê ÓÖ ÑÓ× ÕÙ Ò ×Ø ×Ó¸ T< Ý T> ×ÓÒ Ü ÐÙÝ ÒØ ׺ ÄÐ Ñ ÑÓ× ×Ø ÓÔ Ö ÓÒ join exclusive(T<, T>)¸ Ð Ù Ð Ö ØÓÖÒ Ð Ö ÓÐ ÓÖÖ ×ÔÓÒ¹ ÒØ ÙÒ Ö T< ÓÒ T>º Ð ¬ ÑÓ× Ð ÓÔ Ö ÓÒ Ü ÐÙ× Ú ÔÓÖÕÙ × ÑÓ× ÕÙ ÐÓ× Ö Ò Ó× Ð Ú × ÒÓ × ×ÓÐ Ô Ò Ý ÕÙ T< ∩ T> = ∅¸ ÐÓ Ù Ð × ÙÒ ÓÒÓ Ñ ÒØÓ ÑÙÝ Ú Ð Ó×Ó¸ ÔÙ × ÒÓ× Ô ÖÑ Ø Ö Ð Þ Ö ÙÒ Ð ÓÖ ØÑÓ Ô ÖØ ÙÐ Ö Ô Ö ×Ø ×Ó ÓÒ Ñ ÓÖ × ÑÔ ÒÓ ÕÙ Ð Ð ÙÒ ÓÒ Ò Ö Ð × ÐÓ× ÒØ ÖÚ ÐÓ× × ×ÓÐ Ô Ò Ó ÐÓ× Ð Ñ ÒØÓ× × ÓÑÔ ÖØ Òº Ä × Ù ÒØ ¬ ÙÖ ÐÙ×ØÖ ÐÓ× ÓÑÔÓÒ ÒØ × Ò Ö Ð × T< Ý T> ÕÙ Ö ÕÙ Ö ÑÓ× Ò¹ Ø ¬ Ö Ô Ö × Ò Ö join exclusive(T<, T>) join exclusive(T<,T> ) T< T> L(T < ) R(T < ) L(T > ) R(T > ) Ð ×ÓÐÙ ÓÒ × Ô ØÓÖ Þ Ð × Ù ÒØ ÑÓ Ó T< T> L(T < ) join exclusive(R(T<),L(T> )) R(T > ) Ð ×Ó × Ð Ð ÓÖ ØÑÓ × ÕÙ Ð ÙÒÓ ÐÓ× Ó× Ö ÓÐ × × Ú Óº ÄÓ ÒØ Ö ÓÖ ÒÓ× ÓÒÐÐ Ú Ð × Ù ÒØ Ð ÓÖ ØÑÓ ¿½ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¿¿ ¿ ¿ template <class Node> inline Node * join_exclusive(Node *& ts, Node *& tg) { if (ts == Node::NullPtr) return tg; if (tg == Node::NullPtr)
  • 368.
    342 Cap´ ´ ıtulo 4. Arboles return ts; LLINK(tg) = join_exclusive(RLINK(ts), LLINK(tg)); RLINK(ts) = tg; Node * ret_val = ts; ts = tg = Node::NullPtr; // deben quedar vac´os despu´s del join ı e return ret_val; } ¬Ò × join exclusive¸ Ù× Ò ÙÒ × ¿ ¿ Ò ¿º ר ÖÙØ Ò ÒÓ× × Ö ×ÙÑ ÙØ Ð Ô Ö × ÑÔÐ ¬ Ö ÓÒ× Ö Ð Ñ ÒØ Ð Ð ÓÖ ØÑÓ Ð Ñ Ò ÓÒ ÙÒ º 4.9.6 Eliminaci´n en un ABB o Ä Ð Ñ Ò ÓÒ ÔÓÖ Ð Ú Ü Ó× × × Ù× Ö Ð ÒÓ Ó ÕÙ ÓÒØ Ò Ð Ð Ú Ý ÐÙ Ó ÕÙ Ø ÖÐÓ Ð Ö Óк È ÖÓ Ý ÙÒ ¬ ÙÐØ ØÓÔÓÐÓ Ô Ö ÕÙ Ø Ö Ð ÒÓ Óº ÓÒ× ¹ Ö ÑÓ× ÙÒ ÒÓ Ó p ÕÙ Ø Ö× ÙÒ Ý Ð × Ù ÒØ ÖÑ q p L(p) R(p) Ë Ð Ø Ö ÐÑ ÒØ ÕÙ Ø ÑÓ× p¸ ÒØÓÒ × ÑÓ× Ö Ð Ó ÓÒ ÐÓ× ØÖ × Ö Ó× ÕÙ ÕÙ Ò ×Ù ÐØÓ× × × Ô Ö p q −→ p¸ p −→ L(p) Ý p −→ R(p)º ÓÒ ÐÑ ÒØ ¸ Ô Ö ÔÓ Ö ÑÓ ¬ Ö ÓÖÖ Ø Ñ ÒØ q¸ ÑÓ× ×Ø Ò Ù Ö Ü Ø Ñ ÒØ × p × Ó ÞÕÙ Ö Ó Ó Ö Óº Ë ÓÒÓ Ò Ó× Ñ Ò Ö × ØÖ Ø Ö ÓÒ Ð ¬ ÙÐØ ÒØ Ö ÓÖ ½º ËÙ ×Ø ØÙ ÑÓ× p ÔÓÖ ×Ù ÒÓ Ó ÔÖ ×ÓÖ Ò Ä(p)¸ Ó ÔÓÖ ×Ù ×Ù ×ÓÖ Ò Ê(p)º À Ý Ó× ÔÙÒØÓ× ÙÒ Ñ ÒØ Ð × ÕÙ ÑÓ× ÒÓØ Öº ÈÖ Ñ ÖÓ¸ Ø ÒØÓ Ð ÔÖ ×ÓÖ ÓÑÓ Ð ×Ù ×ÓÖ p × ÑÔÖ ×ÓÒ Ò ÓÑÔÐ ØÓ׺ Ò Ð ×Ó Ð ÔÖ ×ÓÖ¸ ר ר Ó ÔÓÖ Ð ÒÓ Ó Ñ × Ð ÞÕÙ Ö Ä(p)¸ Ð Ù Ð Ø Ò ÕÙ × Ö Ò ÓÑÔÐ ØÓ¸ ÔÙ × × ÒÓ ÓÒØÖ Ö Ð Ó ÕÙ Ð ÔÖ ×ÓÖ × Ð Ñ × Ð ÞÕÙ Ö º Ð Ö ÞÓÒ Ñ ÒØÓ × Ñ ØÖ Ó Ó ÙÖÖ ÓÒ Ð ×Ù ×ÓÖº ÈÙ ×ØÓ ÕÙ Ð ÒÓ Ó ×Ùר ØÙ Ö ×Ø Ò ÓÑÔÐ ØÓ¸ Ø Ò ÑÓ× ×Ù¬ ÒØ ×Ô Ó Ô Ö ÒÐ Þ Ö Ð × ØÖ × Ö Ñ × × ÒØ Ö Ñ ÑÓ× Ð ÒÓ Ó ×Ù ×Ø ØÙØÓ ÔÓÖ p¸ Ô٠׸ ÔÓÖ ÑÔÐÓ Ò Ð ÔÖ ×ÓÖ¸ ×Ù Ö Ñ ÞÕÙ Ö ÐØ ÒØ × ×Ù ×Ø ØÙÝ ÔÓÖ Ä(p)º Ä × ÙÒ Ù ×Ø ÓÒ ÒÓØ Ö × ÕÙ Ð ÔÖ ×ÓÖ Ý Ð ×Ù ×ÓÖ ×ÓÒ ÐÓ× Ó× ÙÒ Ó× ÔÓ× ¹ Ð × ÒÓ Ó× Ò ÓÑÔÐ ØÓ× ÒØ Ö Ñ Ö¸ Ô٠׸ ÐÓ ÓÒØÖ Ö Ó¸ × Ú ÓÐ Ö Ð ÔÖÓÔ ÓÖ Ò ÙÒ º ÍÒ Ð ÓÖ ØÑÓ Ð ÒØ × Ó Ò ×Ø ÔÖ Ò Ô Ó × ×Ø ÒØ Ð ÓÖ Ó×Ó¸ Ô٠׸ Ô Ö ØÙ Ö ÓÖÖ Ø Ñ ÒØ ÐÓ× ÒØ Ö Ñ Ó׸ × Ö ÕÙ Ö Ò Ñ ÒØ Ò Ö ÔÙÒØ ÖÓ× p¸ ×Ù Ô Ö ¸ Ð ÔÖ ×ÓÖ Ý Ð Ô Ö Ð ÔÖ ×ÓÖº Ò Ò ÙÖ ¸ × Ð ÔÖ ×ÓÖ ÒÓ
  • 369.
    ´ 4.9. Arboles binarios de b´squeda u 343 × Ó ¸ Ý ÕÙ ØÙ Ö ÙÒ Ô ×Ó ÓÒ Ð ÓÒ× ×Ø ÒØ Ò ÓÖØÓ¹ Ö Ù Ø Ö p Ò ×Ù ÒÙ Ú ÔÓ× ÓÒ ÓÒ Ð Ö ÓÐ ÕÙ ×Ø ÓÒØ Ò º Ä Ð Ò Ð ÕÙ Ð ÑÓ× Ò Ð Ô ÖÖ Ó ÒØ Ö ÓÖ ÓÒ× ×Ø Ò ÒÓ ÒØ Ö Ñ Ö ÐÓ× ÓÒØ Ò Ó× ÐÓ× ÒÓ Ó׸ ÔÙ × × ØÖ Ð Ó ÖÒ Ú ÒØÙ Ð × ×ØÖÙ ØÙÖ × ØÓ× ÕÙ ÔÙÒØ Ò ÐÐÓ׺ ר ÓÖÑ ×Ø Ò ×Ù×Ó¸ ÔÙ × Ð ÓØÖ Ñ Ò Ö ¸ ÕÙ ÜÔÐ Ö ÑÓ× ÒÑ Ø ¹ Ñ ÒØ ¸ ÒÓ ×ÓÐÓ × ÑÙ Ó Ñ × × ÑÔÐ ¸ × ÒÓ Ñ × ¬ ÒØ º ØÓ Ó× ÑÓ Ó׸ Ò Ü º º½º¾ ´Ô Ò ¼¾µ × ÑÙ ×ØÖ ×Ø Ø Ò º ¾º Ð Ö ÓÐ ÙÝ Ö Þ × p × ×Ùר ØÙÝ ÔÓÖ Ð Ö ÓÐ Ö ×ÙÐØ ÒØ Ð ÙÒ ÓÒ Ü ÐÙ× Ú ×Ù× Ö Ñ ×º Ò ÙÒ ÓÒ ×ØÓ¸ × ×ÔÖ Ò Ð × Ù ÒØ Ð ÓÖ ØÑÓ ¿¿ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¿½ ¿ # define REMOVE remove_from_search_binary_tree<Node, Compare> template <class Node, class Compare> inline Node * remove_from_search_binary_tree(Node *& root, const typename Node::key_type & key) { if (root == Node::NullPtr) return Node::NullPtr; if (Compare () (key, KEY(root))) // ¿key < KEY(root)? return REMOVE(static_cast<Node*&>(LLINK(root)), key); else if (Compare () (KEY(root), key)) // ¿key > KEY(root)? return REMOVE(static_cast<Node*&>(RLINK(root)), key); Node * ret_val = root; // respaldar root que se va a borrar root = join_exclusive(static_cast<Node*&>(LLINK(root)), static_cast<Node*&>(RLINK(root))); return ret_val; } ¬Ò × remove from search binary tree¸ Ù× Ò ÙÒ × ¿ ¿ Ò ¿ º Í× × join exclusive ¿ ½ º Ð Ô Ö Ñ ØÖÓ root × Ð Ö Þ Ð ¸ Ð Ù Ð × ÔÓÖ Ö Ö Ò ¸ ÓÖÑ Ø Ð ÕÙ × ÑÓ ¬ÕÙ Ð Ö Þ Ù Ò Ó × Ò Ù ÒØÖ Ð Ð Ú º Ð × ÙÒ Ó Ô Ö Ñ ØÖÓ × Ð Ð Ú Ñ ×Ñ Ð Ñ Ò Öº Ð Ù Ð ÕÙ ÓÒ Ð Ò× Ö ÓÒ¸ Ð Ñ ØÓ Ó Ð Ñ Ò ÓÒ BinTree<Key> Ú Ò ÑÙÝ × ÑÔÐ ¿¿ Å ØÓ Ó× BinTree<Key> ¿¿ +≡ ´¿¿ µ ¿ ½ ¿ Node * remove(const Key & key) { return remove_from_search_binary_tree<Node, Compare>(root, key); } Í× × remove from search binary tree ¿ ¿ º 4.9.7 Inserci´n en ra´ de un ABB o ız Ò Ð Ð ÓÖ ØÑÓ Ò× Ö ÓÒ × ÖÖÓÐÐ Ó Ò Ü º º¿ ´Ô Ò ¿¿ µ¸ Ð Ö ÓÐ Ö ÔÓÖ ÐÓ× ÒÓ Ó× ÜØ ÖÒÓ׺ Ð ÙÒ × Ú × × ÔÖ Ö Ð ÕÙ Ð ÒÙ ÚÓ ÒÓ Ó Ú Ò Ö Þ Ð Ö Óк
  • 370.
    344 Cap´ ´ ıtulo 4. Arboles Ä Ø Ò ÒØ Ö ÓÖ ÚÓÖ Ð ÐÓ Ð Ö Ö Ò Ò Ð × ÒØ Ó ÕÙ ÐÓ× ÒÓ Ó× Ö ÒÓ× Ð Ö Þ ×ÓÒ ÐÓ× Ö ÒØ Ñ ÒØ Ò× ÖØ Ó׺ ÁÒ× ÖØ Ö ÙÒ ÒÙ ÚÓ ÒÓ Ó ÓÑÓ Ö Þ × ÑÙÝ Ð ÐÙ Ó ÕÙ × ×ÔÓÒ Ð Ô Ö¹ Ø ÓÒ split key rec() × ÖÖÓÐÐ Ò Ü º º ´Ô Ò ¿¿ µº ÌÓ Ó ÐÓ ÕÙ Ý ÕÙ Ö × Ô ÖØ ÓÒ Ö × ÙÒ Ð Ð Ú Ò× Ö ÓÒ Ý ÐÙ Ó Ø ÖÐ ×Ø Ð Ú ÐÓ× Ö ÓÐ × Ö ×ÙÐØ ÒØ × Ð Ô ÖØ ÓÒ ¿ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¿¿ ¿ template <class Node, class Compare> inline Node * insert_root(Node *& root, Node * p) { Node * l = Node::NullPtr, * r = Node::NullPtr; // guarda resultados de split if (not split_key_rec<Node, Compare>(root, KEY(p), l, r)) return Node::NullPtr; LLINK(p) = l; RLINK(p) = r; root = p; return root; } ¬Ò × insert root¸ Ù× Ò ÙÒ ¿ º Í× × split key rec ¿¿ º Ä ÖÙØ Ò Ö ØÓÖÒ Node::NullPtr × Ð Ö ÓÐ ÓÒØ Ò ÙÒ ÒÓ Ó ÓÒ Ð Ú Ù Ð Ð ÒÓ Ó Ò× Ö ÓÒ pº ÙÖ º¿ Ö ÓÐ Ö ×ÙÐØ ÒØ 512 Ò× Ö ÓÒ × Ð ØÓÖ × Ò Ð Ö Þ 4.9.8 Uni´n de ABB (join) o ÓÒ× Ö ÑÓ× T1, T2 ∈ Ý Ð ÓÔ Ö ÓÒ ÙÒ ÓÒ T1 ∪ T2º Ò ÒÙ ×ØÖ ÒØ Ö Þ¸ Ð ÙÒ ÓÒ × ÒÓÑ Ò Ö join(T1, T2, d)¸ Ð Ù Ð Ö ØÓÖÒ ÙÒ ÔÖÓ Ù ØÓ ÙÒ Ö Ð × Ð Ú × T1 ÓÒ Ð × T2º ÈÙ ×ØÓ ÕÙ ÑÓ× ÓÖ Ó ÒÓ Ø Ò Ö Ð Ú × Ö Ô Ø ×¸ Ð × Ú ÒØÙ Ð × Ö Ô Ø Ò × ÒØÖ T1 Ý T2 × Ù Ö Ö Ò Ò ÙÒ ÙÜ Ð Ö ÐÐ Ñ Ó d¸ Ð Ù Ð × ÙÒ Ô Ö Ñ ØÖÓ ÔÓÖ Ö Ö Ò join()º ÑÓ× ÔÖ Ú Ö ×ØÓ ÔÓÖÕÙ ÐÓ× Ö ÓÐ × ÙÒ Ö ÔÙ Ò Ö× ÓÒרÖÙ Ó Ò Ô Ò ÒØ Ñ ÒØ º ÍÒ ÔÖ Ñ Ö ÓÖÑ ÑÔÐ ÒØ Ö Ð join() × Ö ÓÖÖ Ö Ò ÔÖ ¬ Ó ÙÒ Ö Óи ÔÓÖ Ñ¹ ÔÐÓ T2¸ Ö Ò× ÖØ Ò Ó ×Ù× Ð Ú × Ò Ð ÓØÖÓ Ö ÓÐ T1º
  • 371.
    ´ 4.9. Arboles binarios de b´squeda u 345 ÇØÖ Ñ Ò Ö ¸ ÕÙ Þ Ñ × ÓÒ×ÓÒ ÓÒ Ð Ö ÙÖ× ÓÒ Ò Ö ÒØ ÙÒ Ö ÓÐ Ò Ö Ó¸ × ÐÙ×ØÖ Ò Ð × Ù ÒØ ÖÑ insert root(K(T1 ), T2 ) T1 T1 T2 T2 L(T2 ) R(T2 ) L(T1 ) R(T1 ) L(T1 ) R(T1 ) join(L(T1 ),L(T2 )) join(R(T1 ),R(T2 )) ÌÓÑ ÑÓ× Ð Ö Þ ÙÒÓ ÐÓ× Ö ÓÐ × Ý Ð Ò× ÖØ ÑÓ× ÓÑÓ Ö Þ Ð ÓØÖÓº Ò Ð ×Ó Ð ¬ ÙÖ ØÓÑ ÑÓ× Ð Ö Þ Ð Ö ÓÐ T1 Ý Ð Ò× ÖØ ÑÓ× Ò T2 Ô Ö Ó Ø Ò Ö T2º ÄÙ Ó Ò× ÖØ Ö Ö Þ(T1)¸ Ð × Ö Ñ × ×Ù ÐØ × L(T1) Ý R(T1) × ÙÒ Ò Ö ÙÖ× Ú Ñ ÒØ ÓÒ Ð × Ö Ñ × ÞÕÙ Ö Ý Ö T2 Ó × ¸ Ä(T2) = join(L(T1), L(T2)) Ý Ê(T2) = join(R(T1), R(T2))º ÓÒ Ð ÔÖ Ò Ô Ó ÒØ Ö ÓÖ Ð ÖÓ¸ ÔÓ ÑÓ× × Ò Ö ÙÒ Ð ÓÖ ØÑÓ ¿ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¿ ¿¾ template <class Node, class Compare> inline Node * join(Node * t1, Node * t2, Node *& dup) { if (t1 == Node::NullPtr) return t2; if (t2 == Node::NullPtr) return t1; Node * l = static_cast <Node*> (LLINK(t1)); // respaldos de ramas de t1 Node * r = static_cast <Node*> (RLINK(t1)); t1->reset(); // mientras la clave ra´z de t1 est´ contenida en t2 ı e while (insert_root<Node, Compare>(t2, t1) == Node::NullPtr) { // s´ ==> s´quelo de t1 e ins´rtelo en dup ı a e Node * p = remove_from_search_binary_tree(t1, KEY(t1)); insert_in_binary_search_tree<Node, Compare>(dup, t1); } LLINK(t2) = join<Node, Compare>(l, static_cast<Node*>(LLINK(t2)), dup); RLINK(t2) = join<Node, Compare>(r, static_cast<Node*>(RLINK(t2)), dup); return t2; } Í× × insert in binary search tree ¿¿ ¸ insert root ¿ ¸ Ò remove from search binary tree ¿¿º ÓÖ Ò ÓÖÔÓÖ ÑÓ× ×Ø Ú Ö× ÓÒ Ð Ñ ØÓ Ó ÓÖÖ ×ÔÓÒ ÒØ Ò BinTree<Key> ¿ Å ØÓ Ó× BinTree<Key> ¿¿ +≡ ´¿¿ µ ¿ ¿ void join(GenBinTree & tree, GenBinTree & dup) { root = Aleph::join<Node, Compare> (root, tree.root, dup); tree.root = Node::NullPtr; } 4.9.9 An´lisis de los ´rboles binarios de b´squeda a a u ÌÓ × Ð × ÓÔ Ö ÓÒ × ×ØÙ × ×Ó Ö ÙÒ Ò Ö Ð Þ Ö Ù×ÕÙ × ×Ù Ø ÑÔÓ Ù ÓÒ¸ Ô Ò ¸ ÔÓÖ Ø ÒØÓ¸ Ð Ø ÑÔÓ Ù×ÕÙ ¸ Ð Ù Ð ×Ø ÓØ Ó ÔÓÖ Ð ÐØÙÖ
  • 372.
    346 Cap´ ´ ıtulo 4. Arboles ´ µ insert root() ´ µ insert in search binary tree() ´ µ join() Ö ÓÐ × ´ µ Ý ´ µ ÙÖ º¿ ÑÔÐÓ join() Ö ÓÐ × Ò Ö Ó× Ð Ö Óк ÓÒ× Ù ÒØ Ñ ÒØ ¸ ÐÓ ØÖ × Ò ÒØ Ð Ò Ð Ò Ð × × × ÓÒÓ Ö Ù Ð × Ö Ð Ò Ú Ð ÔÖÓÑ Ó ÙÒ ÒÓ Óº Ò ÐÓ ÕÙ × Ù ÒÙ ×ØÖÓ Ò Ð × ×¸ ×ÙÔÓÒ Ö ÑÓ× ÕÙ Ð ÓÖ Ò Ò× Ö ÓÒ Ð × Ð Ú × × Ð ØÓÖ Ó × Ö¸ ÙÒ ÓÖÑ Ñ ÒØ ×ØÖ Ù Óº × ¸ Ó ÙÒ Ö ÓÐ T ¸ Ý |T |! ÓÖ Ò × Ö ÒØ × Ò× Ö ÓÒ ÕÙ ÔÙ Ò ÔÖÓ Ù Ö C|T| = |T|+1 2|T| Ö ÓÐ × Ò Ö Ó× Ö ÒØ ׺ 1 |T| ÓÖ Ò¸ × ÔÓ× Ð ÑÓ×ØÖ Ö¸ ÔÖ Ö Ð Ñ ÒØ ÔÓÖ Ò Ù ÓÒ¸ ÕÙ ∀|T |, C|T| < |T |!º ÄÓ ÕÙ ÑÔÐ ÕÙ Ð ÙÒÓ× Ö ÓÐ × × Ö Ô Ø Ö Ò Ô Ö Ô ÖÑÙØ ÓÒ × Ò× Ö ÓÒ Ö ÒØ ׺ Proposici´n 4.12 o Ë T ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ n ÒÓ Ó× ÓÒרÖÙ Ó Ð ØÓÖ ¹ Ñ ÒØ × ÙÒ ÙÒ × Ù Ò Ò× Ö ÓÒ Ð ØÓÖ º ÆÓ Ý ×ÙÔÖ × ÓÒ ×º Ë Ò ¯ Sn Ð ÒÙÑ ÖÓ ÒÓ Ó× Ú × Ø Ó× ÙÖ ÒØ ÙÒ Ù×ÕÙ Ü ØÓ× ¸ Ý ¯ Un Ð ÒÙÑ ÖÓ ÒÓ Ó× Ú × Ø Ó× ÙÖ ÒØ ÙÒ Ù×ÕÙ ÐÐ º ÒØÓÒ × ËÒ = 2 1+ 1 n Hn − 3 ≈ 1.386 Ð n = O(Ð n)Ý ÍÒ = 2Hn+1 − 2 ≈ 1.386 Ð (n + 1) = O(Ð n) ÓÒ ËÒ Ý ÍÒ ÒÓØ Ò ÐÓ× ÔÖÓÑ Ó× Sn Ý Un¸ Ö ×Ô Ø Ú Ñ ÒØ Ñ ÒØÖ × ÕÙ Hn × Ð n¹ × ÑÓ ÒÙÑ ÖÓ ÖÑÓÒ Ó½ º ½ Hn = n 1 i=1 i º
  • 373.
    ´ 4.9. Arboles binariosde b´squeda u 347 Demostraci´n o Ð ÒÙÑ ÖÓ ÒÓ Ó× Ú × Ø Ó× Ò ÙÒ Ù×ÕÙ Ü ØÓ× × Ð ÐÓÒ ØÙ Ð Ñ ÒÓ × Ö Þ(T ) ר Ð ÒÓ Ó Ò ÓÒØÖ Óº Ë ni × Ð ÒÓ Ó Ò ÓÒØÖ Ó¸ ÒØÓÒ × |CÖ Þ(T),n | = Ò Ú Ð (ni) + 1¸ ÔÙ × Ð Ò Ú Ð ÓÑ ÒÞ × ÖÓº ÈÓÖ ¬Ò ÓÒ ÔÖÓÑ Ó¸ Ø Ò ÑÓ× i ËÒ = 1 n (Ò Ú Ð (ni) + 1) ∀ni ∈T = 1 n Ò Ú Ð(ni) + 1 ∀ni ∈T = 1 n ÁÈÄ(T ) + 1 ´º µ ËÙר ØÙ ÑÓ× ´ º¾ µ Ò ´ º µ ´ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ º µ Ë = ÈÄ(T ) − 2n + Ò n 1 ´º µ ÓÖ ÔÐ ÒØ ÑÓ× ÙÒ Ù ÓÒ × Ñ Ð Ö Ô Ö ÙÒ Ù×ÕÙ Ò ÖÙ ØÙÓ× º ÈÙ ×ØÓ ÕÙ Ð ÒÓ Ó ÒÓ × Ò Ù ÒØÖ Ò Ð Ö Óи Ð Ù×ÕÙ × Ò Ö ×Ø ÙÒ ÒÓ Ó ÜØ ÖÒÓº Ð ÒÙÑ ÖÓ ÒÓ Ó× Ú × Ø Ó× Ò ÙÒ Ù×ÕÙ Ò ÖÙ ØÙÓ× ×¸ Ô٠׸ ÕÙ Ú Ð ÒØ Ð ÐÓÒ ØÙ Ð Ñ ÒÓ × Ð Ö Þ ×Ø Ð ÒÓ Ó ÜØ ÖÒÓº ÈÓ ÑÓ׸ ÒØÓÒ ×¸ ÔÐ ÒØ Ö Ð ÔÖÓÑ Ó ÐÓÒ ØÙ × ÒØÖ ØÓ Ó× ÐÓ× Ñ ÒÓ× × Ð Ö Þ ×Ø ÙÒ ÒÓ Ó ÜØ ÖÒÓº ×ØÓ × ÍÒ = 1 n+1 Ò Ú Ð(nx) ∀nx nx ÒÓ Ó ÜØ ÖÒÓ = ÈÄ(T ) =⇒ n+1 ÈÄ(T ) = (n + 1) ÍÒ ´º µ ËÙר ØÙ ÑÓ× ´ º µ Ò ´ º µ Í ËÒ = (n + 1)n Ò −2n + 1 ´º µ Ä Ù ÓÒ ´ º µ ÒÓ× ÔÐ ÒØ Ð × Ó× Ò Ó Ò Ø × ÕÙ ÒØ ÒØ ÑÓ× Ò ÓÒØÖ Öº È Ö ÔÓ Ö Ö ×ÓÐÚ ÖÐ Ö ÕÙ Ö ÑÓ× ÙÒ × ÙÒ Ù ÓÒ¸ Ò Ô Ò ÒØ ´ º µ¸ ÕÙ Ø Ñ Ò ÒÓ× Ö Ð ÓÒ ËÒ Ý ÍÒ¸ ËÙÔÓÒ ÑÓ× ÕÙ Ð Ô ÖÑÙØ ÓÒ Ò× Ö ÓÒ × n0n1n2 . . . nn−2nn−1º ÆÓØ ÑÓ× ÕÙ Ð ÒØ ÒÓ Ó× ÕÙ × Ú × Ø Ò Ù Ò Ó × Ù× Ü ØÓ× Ñ ÒØ Ð ÒÓ Ó ni × ÕÙ Ú Ð ÒØ ÙÒÓ Ñ × Ð ÒÙÑ ÖÓ ÒÓ Ó× ÕÙ × Ú × Ø ÖÓÒ ÙÖ ÒØ Ð Ù×ÕÙ Ò ÖÙ ØÙÓ× ÕÙ × Ö Ð ÞÓ ÙÖ ÒØ Ð Ò× Ö ÓÒ niº ×ØÓ ×ÓÐÓ × ÓÖÖ ØÓ × × ×ÙÑ ÕÙ ÒÓ Ý ×ÙÔÖ × ÓÒ ×º Ä Ù× Ò ×ÙÔÖ × ÓÒ × Ö ÒØ Þ ÕÙ ÐÓ× ÒÓ Ó× ÒÙÒ Ñ Ò ÐÙ Ö Ò Ð Ö Óк ÈÓ ÑÓ׸ ÒØÓÒ ×¸ Ö ÕÙ Ë = Í ¹½ +1 ´ º ¼µ ÓÖ ¸ ÔÓÖ Ð Ñ ×Ñ ¬Ò ÓÒ ÔÖÓÑ Ó¸ ÔÓ ÑÓ× ÔÐ ÒØ Ö ÙÒ ÒÙ Ú Ù ÓÒ Ò Ë = (ͼ +1) + (ͽ +1) + (; +1) + · · · + (ÍÒ¹½ +1) n n−1 = 1 + 1 n Í ´ º ½µ i=0
  • 374.
    348 Cap´ ´ ıtulo 4. Arboles Á Ù Ð ÑÓ× ´ º ½µ ÓÒ ´ º µ (n + 1) ÍÒ −2n n−1 n + 1 = 1 + 1 n Í =⇒ i=0 n−1 (n + 1) ÍÒ = Í + 2n ´ º ¾µ i=0 Ú ÐÙ ÑÓ× ´ º ¾µ Ô Ö n−1 Ý Ó Ø Ò ÑÓ× n−2 n ÍÒ¹½ = Í + 2(n − 1) ´ º ¿µ i=0 Ê ×Ø ÑÓ× ´ º ¾µ Ñ ÒÓ× ´ º ¿µ (n + 1) ÍÒ − n ÍÒ¹½ = ÍÒ¹½ + 2 =⇒ ÍÒ = ÍÒ¹½ + n + 1 2 ´º µ ÄÓ ÕÙ ÙÒ Ù ÓÒ Ö ÙÖÖ ÒØ ÍÒ ÕÙ ÔÓ ÑÓ× Ö ×ÓÐÚ ÖÐ ÔÓÖ ÜÔ Ò× ÓÒ ×Ù × Ú ×Ø Ð ÙÐØ ÑÓ Ø ÖÑ ÒÓ Í¼ = 0 ÍÒ = ÍÒ¹½ + n + 1 2 = ÍÒ¹¾ + n + n + 1 2 2 = ÍÒ¹¿ + n − 1 + n + n + 1 2 2 2 = ͽ + 3 + · · · + n − 1 + n + n + 1 2 2 2 2 = ͼ + 2 + 3 + · · · + n − 1 + n + n + 1 2 2 2 2 2 1 1 1 1 1 = 2 + + ··· + + + 2 3 n−1 n n+1 Ä ×Ö n 1 i=1 i × Ð n¹ × ÑÓ ÒÙÑ ÖÓ ÖÑÓÒ Óº × ÔÙ × ÍÒ = 2(Hn+1 − 1) = 2Hn+1 − 2 ≈ 2(ÐÒ (n + 1) − γ) − 2 ≈ 1, 386 Ð (n + 1) ´º µ ¾¼ ÓÖ ×Ùר ØÙ ÑÓ× ´ º µ Ò ´ º µ (n + 1)2(Hn+1 − 1) − 2n ËÒ = n + 1 n+1 = (2(Hn+1 − 1)) − 1 n n+1 1 = 2 Hn + −1 − 1 n n+1 n+1 = 2 Hn − 3 ≈ 2 ÐÒ n ≈ 1, 386 Ð n n ¾¼ Ð × Ñ ÓÐÓ γ ÒÓØ Ð ÓÒר ÒØ ÙÐ Ö Ö Ø Ö Þ ÔÓÖ γ = Ð Ñ (Hn − ÐÒ n) ≈ 0, 5772156649 . . . n−→ ∞ º
  • 375.
    4.10. El TADDynMapTree<Tree, Key, Range, Compare> 349 ÙÖ º¿ ÍÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ 512 Ð Ú × Ð ØÓÖ × ÆÙ רÖÓ Ò Ð × × ×ÙÔÓÒ ÕÙ ÒÓ Ý ×ÙÔÖ × ÓÒ × ÒØ Ö Ð × ÒØÖ Ð × Ò× Ö ÓÒ ×º Ë Ð × ×ÙÔÖ × ÓÒ × ×ÓÒ ÙØ × ×ÔÙ × Ð × Ò× Ö ÓÒ × ×Ø Ú Ö Ð Ö Óи Ð × ÑÔ ÒÓ ÙÒ × O(Ð n)¸ ÔÙ × Ð × ÔÖ Ñ × × Ð ÔÖÓÔÓ× ÓÒ º½¾ ÙÒ ×ÓÒ ÖØ ׺ Ð Ò Ð × × ÓÒ ×ÙÔÖ × ÓÒ × ÒØ Ö Ð × ÒØÖ Ð Ò× Ö ÓÒ × × ÙÒ ÔÖÓ Ð Ñ ÜØÖ Ñ ¹ Ñ ÒØ ¬ ÙÐØÓ×Ó ÕÙ Ð ØÙ Ð ÒÓ × Ó Ö ×Ù ÐØÓ × Ø × ØÓÖ Ñ ÒØ º Ä ¬ ÙÐØ ×ØÖ Ò ÕÙ Ð Ð Ñ Ò ÓÒ ØÙ ÙÒ × ÓÒ ÕÙ ÒÓ × Ð ØÓÖ Ù Ò Ó Ò Ð ÙÒ ÓÒ Ü¹ ÐÙ× Ú × Ó Ù Ð × Ö Ð Ö Þ Ð ×Ù Ö ÓÐ Ö ×ÙÐØ ÒØ º ÆÓ × × Ü Ø Ñ ÒØ ÓÑÓ Ñ Ò ¹ Ö Ð × ÔÖÓ Ð × Ð × Ô ÖÑÙØ ÓÒ × ÒØ רÓ× ×ÔÐ Þ Ñ ÒØÓ׺ Ò Ò ÙÖ ¸ × ÑÔÓÖØ ÒØ ÒÓØ Ö ÕÙ Ð Ð ÓÖ ØÑÓ ×ÙÔÖ × ÓÒ × ÖÖÓÐÐ Ó Ò Ü º º ´Ô Ò ¿ ¾µ ÔÐ ÒØ ÙÒ × Ñ ØÖ ÑÔÓÖØ ÒØ º Ù Ò Ó × ×ÙÔÖ Ñ ÙÒ ÒÓ Ó ÓÑÔÐ ØÓ Ý × ØÙ Ð join exclusive()¸ Ð ÒÓ Ó Ö Þ Ð Ö ÓÐ Ö ×ÙÐØ ÒØ × Ð ×Ù Ö ÓÐ ÞÕÙ Ö Óº ר × ÓÒ Ù× ÕÙ Ð ÒÙÑ ÖÓ ÒÓ Ó× ÔÓÖ Ð Ð Ó ÞÕÙ Ö Ó Ð ÔÙÒØÓ Ð Ñ Ò ÓÒ ×Ñ ÒÙÝ º ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð Ö Þ Ð Ö ÓÐ Ø Ò ×ÔÐ Þ Ö× Ð ÞÕÙ Ö ¸ ÐÓ ÕÙ Ö ÙÒ √ ÕÙ Ð Ö Óº ×ØÙ Ó× ÑÔ Ö Ó× ÖÖÓ Ò ÙÒ ÐÓÒ ØÙ ÔÖÓÑ Ó Ð Ñ ÒÓ × Ø Ò ÒØ O( n)º Ä ÔÖÓÔÓ× ÓÒ º½¾ ÒÓ× ÑÙ ×ØÖ ÕÙ ¸ × ÒÓ × ÒØ Ö Ð Ò ×ÙÔÖ × ÓÒ × ÓÒ Ò× Ö ÓÒ ×¸ Ð × ÑÔ ÒÓ ×Ô Ö Ó Ð Ù×ÕÙ Ý Ð Ò× Ö ÓÒ × O(Ð n)¸ ÐÓ Ù Ð ÙÒ Ö ÓÐ ¹ Ò Ö Ó ÙÒ ÐØ ÖÒ Ø Ú ×Ø ÒØ ÔØ Ð Ô Ö ÑÔÐ ÒØ Ö Ø Ð × × Ñ ÓÐÓ× Ò × ØÙ ÓÒ × ÓÒ Ð ÓÖ Ò Ò× Ö ÓÒ × Ð ØÓÖ Ó Ý Ð ÒÙÑ ÖÓ ×ÙÔÖ × ÓÒ × ÒØ Ö Ð × × Ö Ð Ø Ú Ñ ÒØ Ô ÕÙ ÒÓ ÔÓÖ ÑÔÐÓ¸ Ð Ø Ð × Ñ ÓÐÓ× ÙÒ ÓÑÔ Ð ÓÖº Ä Ñ ÒØ Ð ¹ Ñ ÒØ ¸ Ü ×Ø Ò × ØÙ ÓÒ × ÓÒ Ð ÓÖ Ò Ò× Ö ÓÒ ÔÓ Ö × Ö × × Óº ÈÓÖ ÑÔÐÓ¸ ÐÓ× Ô ÐÐ Ó× Ò ×Ø ÐÐ ÒÓ ×Ø Ò × × Ó× ÔÖÓ Ð Ñ ÒØ ¸ ÙÒ Ô ÐÐ Ó ÓÑÓ Ä ÓÒ × Ö Ñ × Ö Ù ÒØ ÕÙ ÃÒÙØ º 4.10 El TAD DynMapTree<Tree, Key, Range, Compare> Ä Ì BinTree<Key>¸ × ÓÑÓ ÓØÖÓ× Ì Ô Ö ÕÙ ×ØÙ Ö ÑÓ× Ò Ð Ô ØÙÐÓ Ü ¸ ØÙ Ò ØÓ × ×Ù× ÓÔ Ö ÓÒ × Ò ÙÒ ÓÒ ÒÓ Ó× Ý ÒÓ Ò ÙÒ ÓÒ Ð Ø ÔÓ Ð Ú º Ä × Ö ÞÓÒ × Ô Ö ×ØÓ × ÙÒ Ñ ÒØ Ò Ò Ð ÔÖ Ò Ô Ó ¬Ò ¬Ò Ý Ý Ò × Ó Ù × ÒØ Ö ÓÖÑ ÒØ º ÓÑÓ × ÑÔÐ ÒØ ÙÒ ÓÒ ÙÒØÓ Ð Ú × Ñ ÒØ Ò Ó ÔÓÖ Ð ÙÒ Ð × Ó ÓØÖ Ñ Ò Ö ¸ ÓÑÓ × Ö ×Ù ÐÚ Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð Ñ ÒØ ÙÒ ALEPH ÑÔÐ ÒØ Ð ÓÒ ÙÒØÓ ÙÒ Ñ ÒØ Ð ÓÒ Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ Ó× Ñ Ò Ö ×º Ä ÔÖ Ñ Ö × Ñ ÒØ Ð Ø ÔÓ DynSetTree<Tree,Key,Compare>¸ Ð Ù Ð Ò¹
  • 376.
    350 Cap´ ´ ıtulo 4. Arboles רÖÙÑ ÒØ ÙÒ ÓÒ ÙÒØÓ Ð Ú × Ø ÔÓ Key ÑÔÐ ÒØ Ó Ñ ÒØ Ð ÙÒ Ð × Ö ÓÐ Ò ÖÓ Ù×ÕÙ Tree<Key> Ý Ö Ø Ö Ó ÓÑÔ Ö ÓÒ Compareº Ä × ÙÒ Ñ Ò Ö × Ñ ÒØ ÙÒ Ð × Ñ Ô Ó ÐÐ Ñ DynMapTree<Tree, Key, Range, Compare>¸ ÙÝ Ö Ò ÓÒ DynSetTree × ÕÙ Ð ÙÐØ Ñ Ù Ö Ô Ö × Ó × ¸ Ñ Ò ÙÒ ÓÒ ÙÒØÓ Ö Ò Ó Ð Ñ Ô Ó Ó ÙÒ ÓÒº ÌÓ Ó× ÐÓ× Ì ÙÒ Ñ ÒØ Ó× Ò ×Ø Ø ÜØÓ Ü Ò Ð Ñ ×Ñ ÒØ Ö¹ Þ ÕÙ Ð Ì BinTree<Key>º ÈÓÖ × Ö ÞÓÒ¸ DynSetTree<Tree,Key,Compare> Ý DynMapTree<Tree, Key, Range, Compare> ÔÙ Ò ÒרÖÙÑ ÒØ Ö Ù ÐÕÙ Ö Ð × ÓÒ¹ ÙÒØÓ ÑÔÐ Ñ ÒØ Ó Ñ ÒØ Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ º Ò ×Ø × ÓÒ × ÖÖÓÐÐ Ö ÑÓ× Ð Ñ × ÓÑÔÐ Ó ÐÓ× Ì Ñ Ò ÓÒ Ó׸ Ð Ð × DynMapTree<Tree, Key, Range, Compare>º ËÙ ÙÒ ÓÒ × ÑÔÐ ÒØ Ö ÙÒ ÓÒ¹ ÙÒØÓ Ð Ú × Ó ÙÒ Ñ Ô Ó Ð Ú × Ò ÙÒ ÓÑ Ò Ó Ð Ñ ÒØÓ× Ò ÙÒ ÓÒ¹ ÙÒØÓ Ö Ò Ó Ñ ÒØ ÙÒ Ð × º Ð Ì Ò Ù ×Ø ÓÒ × ¬Ò Ò Ð Ö ÚÓ ØÔÐ ÝÒÅ ÔÌÖ ºÀ ¿ ¼ ¿¼ ØÔÐ ÝÒÅ ÔÌÖ ºÀ ¿ ¼ ≡ template < template <typename /* Key */, class /* Compare */> class Tree, typename Key, typename Range, class Compare = Aleph::less<Key> > class DynMapTree { Å Ñ ÖÓ× ÔÖ Ú Ó× DynMapTree<Tree, Key, Range, Compare> ¿ ¼ Å Ñ ÖÓ× ÔÙ Ð Ó× DynMapTree<Tree, Key, Range, Compare> ¿ ½ }; Ð × × Ò Ñ × Ö Ú × DynMapTree<Tree, Key, Range, Compare> ¿ ¾ DynMapTree<Tree, Key, Range, Compare> Ø Ò Ù ØÖÓ Ô Ö Ñ ØÖÓ× Ð × º Ä Ð × Tree Ö ÔÖ × ÒØ Ð Ø ÔÓ ÓÒ Ð Ù Ð × × ÑÔÐ ÒØ Ö Ð Ñ Ô Óº ÒØÖ ÐÓ× Ø ÔÓ× ÔÓ× Ð ×¸ ÒØÖ ÐÓ× × ÖÖÓÐÐ Ó× Ò ×Ø Ø ÜØÓ¸ Ø Ò ÑÓ× BinTree<Key>¸ Rand Tree<Key>¸ Treap<Key>¸ Avl Tree<Key>¸ Rb Tree<Key> Ý Splay Tree<Key>º Ð Ü Ô ÓÒ BinTree<Key>¸ Ð Ö ×ØÓ Ð × Ð × × ÓÖÖ ×ÔÓÒ ×Ô Ð ×¸ ÓÒ ÔÖ ×Ø ÓÒ × ÔÖÓÔ × × ÙÒ Ð Ø ÔÓ Ö Óи ÕÙ ÑÔÐ ÒØ Ò Ð × Ñ ×Ñ × ÓÔ Ö ÓÒ × ÕÙ BinTree<Key>º ר ÑÓ Ó¸ Ð Ù×Ù Ö Ó DynMapTree<Tree, Key, Range, Compare> × Ð ÓÒ ¸ × ÙÒ ×Ù× Ö Ø Ö Ó× Ù Ð Ý Ö ÕÙ Ö Ñ ÒØÓ¸ Ð Ð × ÕÙ × Ù× Öº Ð Ô Ö Ñ ØÖÓ Ð × Key Ö ÔÖ × ÒØ Ð Ø ÔÓ ØÓ ÓÖÖ ×ÔÓÒ ÒØ Ð ÓÑ Ò Ó Ð Ñ Ô Óº Ð Ô Ö Ñ ØÖÓ Range Ö ÔÖ × ÒØ Ð Ø ÔÓ ØÓ Ð Ö Ò Ó Ð Ñ Ô Óº Ë ÐÓ ÕÙ × × × Ñ Ö Ñ ÒØ Ñ ÒØ Ò Ö ÙÒ ÓÒ ÙÒØÓ Ð Ú ×¸ ÒØÓÒ × ×Ø Ô Ö Ñ ØÖÓ × ÓÖÖ ×ÔÓÒ Ö ÓÒ ÙÒ Ð × Ú ÔÓÖ ÑÔÐÓ¸ Empty Node¸ Ð Ù Ð Ù ¬Ò Ó Ý Ù× Ó Ô Ö Ð Ì BinNode<Key>º Ò ÐÑ ÒØ ¸ Ð ÙÐØ ÑÓ Ô Ö Ñ ØÖÓ¸ ÓÒר ØÙÝ Ð Ð × ÓÑÔ Ö ÓÒ ÒØÖ Ð Ú × Ø ÔÓ Keyº ÓÒ ÐÓ ÒØ Ö ÓÖ Ò Ñ ÒØ ¸ ÔÓ ÑÓ× ÔÐ ÒØ Ö ÐÓ× ØÖ ÙØÓ× DynMapTree<Tree, Key, Range, Compare> ¿¼ Å Ñ ÖÓ× ÔÖ Ú Ó× DynMapTree<Tree, Key, Range, Compare> ¿¼ ≡ ´¿ ¼ µ ¿ ½ Tree<Key, Compare> tree;
  • 377.
    4.10. El TADDynMapTree<Tree, Key, Range, Compare> 351 size_t num_nodes; tree × ÙÒ Òר Ò ÓÒ Ð Ú Key Ý num nodes × Ð ÒØ ÒÓ¹ Ó× ÕÙ ÓÒØ Ò Ð Ö ÓÐ treeº ר ÒØ × ÓÒØ Ð Þ Ò Ð × ÔÖ Ñ Ø Ú × DynMapTree<Tree, Key, Range, Compare> ÕÙ Ò× ÖØ Ò Ó Ð Ñ Ò Ò ÒÓ Ó× Ý × Ó ¹ × ÖÚ Ð º Ð Ì BinTree<Key> Ý Ñ × Ì Ö Ð ÓÒ Ó׸ ÓÔ Ö Ò ×Ó Ö ÒÓ Ó× ÕÙ ÐÑ ¹ Ò Ò ÙÒ Ð Ú Ò Ö Ø ÔÓ Keyº ÓÖ Ò¸ Ô Ö Ð Ñ Ô Ó Ö ÕÙ Ö ÑÓ× ÙÒ ØÓ Ñ × Ø ÔÓ Range¸ Ð Ù Ð × ×Ô ¬ ÔÓÖ Ö Ú ÓÒ Ð Ø ÔÓ Ò Ö Ó Tree<Key, Compare>::Node ¿½ Å Ñ ÖÓ× ÔÖ Ú Ó× DynMapTree<Tree, Key, Range, Compare> ¿ ¼ +≡ ´¿ ¼ µ ¿¼ struct Node : public Tree<Key, Compare>::Node { Range data; Node() { /* Empty */ } Node(const Key & _key) : Tree<Key, Compare>::Node(_key) { /* empty */ } Range & get_data() { return data; } }; DynMapTree<Tree, Key, Range, Compare> ÓÔ Ö ÒØ ÖÒ Ñ ÒØ ÓÒ ÒÓ Ó× Ð Ø ÔÓ Node¸ ÐÓ× Ù Ð × × ÓÖ Ò Ò ÔÓÖ Ð Ú Ø ÔÓ Key¸ Ò Ú Ð Ð Ö ÓÐ Ò Ö Ó ÕÙ × ÙØ Ð ¸ Ô ÖÓ ÒÓ Ó ÓÒØ Ò ÙÒ Ô Ö Ø ÔÓ (Key, Range)º ÄÓ× ÓÒרÖÙ ØÓÖ × ÔÓÖ ÓÑ × ÓÒ Ý ÓÔ ÔÙ Ò ÒØÓÒ × ¬Ò Ö× ÙÒØÓ ÓÒ Ð ×¹ ØÖÙ ØÓÖ ¿½ Å Ñ ÖÓ× ÔÙ Ð Ó× DynMapTree<Tree, Key, Range, Compare> ¿ ½ ≡ ´¿ ¼ µ ¿ ½ DynMapTree() : num_nodes(0) { /* empty */ } DynMapTree(DynMapTree & src_tree) : num_nodes(src_tree.num_nodes) { Node * src_root = static_cast<Node*>(src_tree.tree.getRoot()); tree.getRoot() = copyRec(src_root); } virtual ~DynMapTree() { if (num_nodes > 0) destroyRec(tree.getRoot()); } Í× × copyRec ¾ Ò destroyRec ¾ º È Ö Ò× ÖØ Ö ¿½ Å Ñ ÖÓ× ÔÙ Ð Ó× DynMapTree<Tree, Key, Range, Compare> ¿ ½ +≡ ´¿ ¼ µ ¿ ½ ¿ ¾ Range * insert(const Key & key, const Range & data) { Node * node = new Node (key); node->data = data; if (tree.insert(node) == NULL) { delete node; return NULL; } ++num_nodes; return &node->data; }
  • 378.
    352 Cap´ ´ ıtulo 4. Arboles Ä ÖÙØ Ò Ö ØÓÖÒ Ð ÒØ ÒÓ Ó× ÕÙ Ø Ò Ð Ö Óк ÈÙ ×ØÓ ÕÙ ÒÓ × Ô ÖÑ Ø Ò Ð Ñ ÒØÓ× Ö Ô Ø Ó׸ ר ÒØ ÔÙ ÓØ Ö× Ô Ö × Ö × Ó ÙÖÖ Ó Ó ÒÓ Ð Ò× Ö ÓÒº È Ö Ð Ð Ñ Ò ÓÒ¸ ×ÓÐÓ ×Ø Ð Ð Ú ¸ Ý ×Ø × Ö Ð Þ Ñ ÒØ Ð × Ù ÒØ Ñ ØÓ Ó ¿¾ Å Ñ ÖÓ× ÔÙ Ð Ó× DynMapTree<Tree, Key, Range, Compare> ¿ ½ +≡ ´¿ ¼ µ ¿ ½ ¿ ¾ size_t remove(const Key & key) { Node * node = static_cast<Node*>(tree.remove(key)); if (node == NULL) return num_nodes; delete node; return --num_nodes; } remove() Ö ØÓÖÒ Ð ÒØ Ð Ñ ÒØÓ׸ ÐÓ ÕÙ Ô ÖÑ Ø ¸ Ð Ù Ð ÕÙ insert()¸ Ø Ö¹ Ñ Ò Ö × Ù Ó Ó ÒÓ Ð Ñ Ò ÓÒº À Ý Ó × ÓÒ × Ò Ð × Ù Ð × × × Ð Ð Ñ Ò Ö ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ׺ È Ö ÐÐÓ¸ Ù× ÑÓ× Ð Ñ ØÓ Ó empty() ¿¾ Å Ñ ÖÓ× ÔÙ Ð Ó× DynMapTree<Tree, Key, Range, Compare> ¿ ½ +≡ ´¿ ¼ µ ¿ ¾ ¿ ¾ void empty() { num_nodes = 0; destroyRec(tree.getRoot()); } Í× × destroyRec ¾ º À Ý Ó× Ñ Ò Ö × ÓÒ×ÙÐØ Ö ¿¾ Å Ñ ÖÓ× ÔÙ Ð Ó× DynMapTree<Tree, Key, Range, Compare> ¿ ½ +≡ ´¿ ¼ µ ¿ ¾ bool test_key(const Key & key) { Node * node = static_cast<Node*>(tree.search(key)); return node != NULL; } Range * test(const Key & key) { Node * node = static_cast<Node*>(tree.search(key)); return node != NULL ? &(node->get_data()) : NULL; } Ä ÔÖ Ñ Ö ¸ test key() × ×Ø Ò Ô Ö ÓÒ ÙÒØÓ× ÕÙ ×ÓÐÓ ÓÒØ Ò Ò Ð Ú ×¸ Ñ ÒØÖ × ÕÙ Ð × ÙÒ ¸ test()¸ Ô Ö Ñ Ô Ó׺ ÇØÖ Ñ Ò Ö Ò× ÖØ Ö Ý Ù× Ö Ð Ñ ÒØÓ× × Ñ ÒØ Ð ÓÔ Ö ÓÖ []¸ Ð Ù Ð Ò Þ Ð Ú × Ý Ö ØÓÖÒ Ñ Ò × ÒØÖÓ Ð Ö Ò Óº ÈÓÖ ×ÙÔÙ ×ØÓ¸ ר ×ÕÙ Ñ ×ÓÐÓ Ø Ò × ÒØ Ó × × ØÖ Ø ÙÒ Ñ Ô Ó Ý ÒÓ ÙÒ ÓÒ ÙÒØÓ Ð Ú ×º Ð Ì DynMapTree<Tree, Key, Range, Compare> ÔÓ ÑÓ× ×Ô Ð Þ Ö Ú Ö× × Ð × × × ÙÒ Ð Ø ÔÓ Ö ÓÐ Ò Ö Ó Ù×ÕÙ ÔÓÖ ÑÔÐÓ ¿¾ Ð × × Ò Ñ × Ö Ú × DynMapTree<Tree, Key, Range, Compare> ¿ ¾ ≡ ´¿ ¼ µ template <typename Key, typename Type, class Compare = Aleph::less<Key> > class DynMapBinTree : public DynMapTree<BinTree, Key, Type, Compare> { /* Empty */ }; template <typename Key, typename Type, class Compare = Aleph::less<Key> >
  • 379.
    4.11. Extensiones alos ´rboles binarios a 353 class DynMapAvlTree : public DynMapTree<Avl_Tree, Key, Type, Compare> { /* empty */ }; Ð × ÙÒ Ó Ø ÔÓ¸ DynMapAvlTree¸ × ÙÒ Ñ Ô Ó × Ó Ò Ö ÓÐ × Îĸ ÙÒ Ð × ×Ô Ð Ö ÓÐ Ò Ö Ó Ù×ÕÙ ¸ ÙÝ ÐØÙÖ ×Ø Ø ÖÑ Ò ×Ø Ñ ÒØ ÓØ ¸ Ý ÕÙ ×ØÙ Ö ÑÓ× Ò Ü º ´Ô Ò µº À Ý Ñ × Ð × × × ÙÒ ÐÓ× Ø ÔÓ× Ö ÓÐ × Ò Ö Ó׺ 4.11 Extensiones a los ´rboles binarios a Ä Ì BinTree<Key> Ý ×Ù× Ö Ú Ó× ´Ú Ö Ü ´Ô Ò ¿µµ ×ÓÒ ÓÒ Ó× Ô Ö Ö Ð ¹ Þ Ö ÙÒ ×ÓÐÙ ÓÒ Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð ÓÒ Ð × ÓÔ Ö ÓÒ × Ò× Ö ÓÒ¸ Ù×ÕÙ Ý Ð Ñ Ò ÓÒ Ò O(Ð (n))º ×ØÓ × ÙÒ Ö Ò Ô ×Ó Ö ×Ô ØÓ ÙÒ ÖÖ ÐÓ ÓÒ Ð Ò× Ö ÓÒ Ý Ð Ð Ñ Ò ÓÒ ×ÓÒ O(n)º Ë Ò Ñ Ö Ó¸ ÙÒ ÖÖ ÐÓ ÓÖ Ò Ó ÒÓ× Ó Ö Ð ÐØ ÖÒ Ø Ú Ù× Ö Ð i¹ × ÑÓ Ñ ÒÓÖ Ð Ñ ÒØÓ Ò O(1) Ñ ÒØÖ × ÕÙ Ò ÙÒ ×Ø ÓÔ Ö ÓÒ Ö ÕÙ Ö ÙÒ Ö ÓÖÖ Ó Ò¬ Ó ÕÙ × O(n)º Ü ×Ø ÙÒ ×ØÖÙ ØÙÖ ØÓ¸ × Ò ÙÒ ¸ ÕÙ ÒÓ× Ô ÖÑ Ø Ñ ÒØ Ò Ö ÙÒ ÓÒ ÙÒØÓ Ð Ú × ÓÒ Ð × × Ù ÒØ × ÓÔ Ö ÓÒ × Ý ×Ù× Ø ÑÔÓ× ¯ ÁÒ× Ö ÓÒ¸ Ù×ÕÙ Ý Ð Ñ Ò ÓÒ ÙÒ Ð Ú Ò O(Ð (n))º ¯ ×Ó Ð i¹ × ÑÓ Ð Ñ ÒØÓ Ð Ö ÓÖÖ Ó Ò¬ Ó Ò O(Ð (n))º ¯ ÓÒÓ Ñ ÒØÓ Ð ÔÓ× ÓÒ Ò¬ ÙÒ Ð Ú Ò O(Ð (n))º Ð ÔÖ Ò Ô Ó ÙÒ Ñ ÒØ Ð Ð ×ØÖÙ ØÙÖ ØÓ× ×Ù Ý Ò ÐÑ Ò Ö Ð Ö Ò Ð ¹ Ð Ö ÓÐ Ò ÒÓ Óº È Ö ÐÐÓ¸ ÒÓ× Ú Ð Ö ÑÓ× Ð × Ù ÒØ ¬Ò ÓÒ ´ Definici´n 4.10 (Arbol con rangos) o ÍÒ Ö ÓÐ Ò Ö Ó ÓÒ Ö Ò Ó× × ÙÒ Ö ÓÐ Ò Ö Ó ÓÒ ÙÒ ÑÔÓ ÓÒ Ð Ò ÒÓ Ó¸ ÒÓØ Ó (n)¸ ÕÙ ÐÑ Ò Ð Ö Ò Ð Ý Ð Ù Ð× Ø× ∀n ∈ T, (n) = (Ä(n)) + 1 + (Ê(n)), (∅) = 0 ÍÒ ÔÙ × Ö ÜØ Ò Ó Ý ÐÓ ¬Ò ÑÓ× ÓÑÓ × Ù ´ Definici´n 4.11 (Arbol binario de b´ squeda extendido) o u ÍÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ ÜØ Ò Ó T × ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ ÓÒ Ö Ò Ó׺ Ð ÖÓÒ ÑÓ Ö ¬ Ö ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ ÜØ Ò Óº Ä ¬ ÙÖ º ¼ ÐÙ×ØÖ ÙÒ º Ð ÑÔÓ ×ÙÔ Ö ÓÖ × Ð Ð Ú Ý Ð Ò Ö ÓÖ × Ð Ö ÒÐ Ð ×Ù Ö Óк Ò Ð ¬ ÙÖ ¸ ÒÓ Ó Ø Ò ÙÒ Ø ÕÙ Ø ¸ ÕÙ ÒÓ ÓÖÑ Ô ÖØ Ð ×ØÖÙ ØÙÖ ØÓ׸ ÓÖÖ ×ÔÓÒ ÒØ ×Ù ÔÓ× ÓÒ Ò¬ º Ó ni ∈ T | in ¸ ÒØÓÒ ×¸ (Ä(n)) ÒÓ× Ð ÔÓ× ÓÒ Ò¬ ni Ö ×Ô ØÓ Ð ×Ù Ö ÓÐ ÓÒ Ö Þ niº ר × Ð ÓÒÓ Ñ ÒØÓ ÕÙ ÒÓ× Ô ÖÑ Ø Ö Ö Ð Ö ÓÐ ÔÓÖ ×Ù ÔÓ× ÓÒ Ò¬ º ר ÑÓ× Ð ×ØÓ× Ô Ö × Ò Ö ÙÒ Ò Ö ×ØÖÙ ØÙÖ ×ØÖ ÓÒ × Ý Ó Ó ÕÙ ÒÓ× Ñ Ò Ö ÓÐ × ÜØ Ò Ó׺ Ä ÔÖ Ñ Ö × ÓÒ× ×Ø Ò ¬Ò Ö Ð ×ØÖÙ ØÙÖ ÙÒ ÒÓ Ó Ò Ö Ó ÓÑÔÓÒ ÒØ ÙÒ ¸ Ð Ù Ð × ¬Ò Ò Ð Ö ÚÓ ØÔÐ ÒÆÓ ØºÀ ¿ ¿ ¿¿ ØÔÐ ÒÆÓ ØºÀ ¿ ¿ ≡ class BinNodeXt_Data {
  • 380.
    354 Cap´ ´ ıtulo 4. Arboles 25 253 30 19 28 156 284 25 4 2 21 27 29 20 168 256 299 19 5 2 1 0 4 20 22 26 0 44 161 181 255 2 16 1 3 1 1 3 18 24 10 32 130 237 1 1 14 2 9 23 76 208 13 1 6 12 46 99 4 8 5 8 10 14 45 58 89 101 1 2 2 5 7 11 13 15 50 92 100 122 1 1 1 3 17 129 2 16 125 1 ÙÖ º ¼ ÍÒ Ö ÓÐ Ò Ö Ó ÜØ Ò Ó size_t count; // cardinalidad del arbol ´ BinNodeXt_Data() : count(1) { /* empty */ } BinNodeXt_Data(SentinelCtor) : count(0) { /* empty */ } size_t & getCount() { return count; } const size_t & size() const { return count; } void reset() { count = 1; } }; DECLARE_BINNODE_SENTINEL(BinNodeXt, 255, BinNodeXt_Data); # define COUNT(p) ((p)->getCount()) ÈÖ Ñ Ø Ú × × × ×Ó Ö BinNodeXt<Key> ¿ Í× × DECLARE BINNODE SENTINEL ¾ º
  • 381.
    4.11. Extensiones alos ´rboles binarios a 355 Ä Ö ÒÐ × Ù Ö Ò Ð ØÖ ÙØÓ count¸ Ð Ù Ð Ø Ò ×Ù Ó × ÖÚ ÓÖ Ý ÑÓ ¬¹ ÓÖ ¬Ò Ó× Ò Ð Ô ÖØ ÔÙ Ð Ð Ð × BinNodeXt<Key>º Ò ÙÒ × × Ð ÙØ Ð Þ Ö ÙÒ ÒÓ Ó ÒØ Ò Ð ×Ô Ð ÕÙ Ö ÔÖ × ÒØ Ð Ö ÓÐ Ú Óº Ä Ú ÒØ Ð ÒØ Ò Ð × ÕÙ ×Ù ÑÔÓ count × ÑÔÖ × ÖÓ¸ ÐÓ ÕÙ Ú Ø Ð Ò × Ú Ö ¬ Ö × Ð ÒÓ Ó Ó × Ð ÒÙÐÓ Ó ÒÓ Ò ÕÙ ÐÐÓ× Ð ÓÖ ØÑÓ× ÕÙ ÔÖ ÙÒØ Ò Ð Ö Ò Ð º Ä Ö Ò Ð ∅ × 0¸ ÕÙ × Ð Ñ ×ÑÓ Ú ÐÓÖ Ð ÔÓ× ÓÒ Ò¬ ÙÒ ÒÓ Ó Ò ÓÑÔÐ ØÓ ÔÓÖ Ð ÞÕÙ Ö º Ð ÒÓ Ó ÒØ Ò Ð × ÙÒ Òר Ò ×Ø Ø BinNodeXt<Key> ÙÝÓ ×Ô Ó × Ö × Ö¹ Ú Ó Ò Ð Ñ ÖÓ DECLARE BINNODE SENTINELº 4.11.1 Selecci´n por posici´n o o ÓT ∈ ÓÒ Ö Þ r¸ × × Ò ÓÒØÖ Ö Ð i¹ × ÑÓ Ð Ñ ÒØÓ Ò Ð ÔÓ× ÓÒ Ò¬ º Ä ×ØÖÙ ØÙÖ ØÓ׸ ÙÒ Ð Ù×Ó Ð ÒÓ Ó ÒØ Ò Ð ¸ Ó Ö ÙÒ ×ÓÐÙ ÓÒ ÓÑÔÐ Ø Ñ ÒØ ÒÖÐ × Ö¸ × Ò Ò Ò ÙÒ ×Ó Ô ÖØ ÙÐ Ö¸ Ð Ù Ð × Ô ØÓÖ Þ Ð × Ù ÒØ ÑÓ Ó T (r) select rec(r, i) if i < (L(r)) if i > (L(r)) + 1 select rec(L(r), i) select rec(R(r), i - COUNT(LLINK(r)) - 1) L(T ) R(T ) (L(r)) (R(r)) Å Ò ÓÒ Ô ÖØ ÙÐ Ö Ñ Ö Ð ÐÐ Ñ Ö ÙÖ× Ú ÔÓÖ Ð Ö º Ò Ö ÐÑ ÒØ Ð Ò Ó¸ Ù Ò Ó Ù× ÑÓ× ÔÓÖ Ð Ö ¸ ÐÓ ÑÓ× Ö Ð Ø Ú Ñ ÒØ ×Ó Ö ÙÒ Ö ÓÐ ÕÙ ÓÒ¹ Ø Ò (Ê(r)) ÒÓ Ó׸ Ô ÖÓ Ð ÔÓ× ÓÒ i Ð ÐÐ Ñ ÓÖ Ò Ð Ø Ò ÙÒ Ö ÓÐ ÓÒ (r) ÒÓ Ó׺ ÑÓ× Ô٠׸ ÓÑÔ Ò× Ö Ð ÐÐ Ñ ÓÒ Ð ÒØ ÒÓ Ó× ÕÙ Ð Ö ÓÖÖ Ó Ò¬ Ó Ù Ò Ó × Ú ÔÓÖ Ð Ö º ×ØÓ × (L(r)) Ð ×Ù Ö ÓÐ ÞÕÙ Ö Ó Ñ × Ð Ö Þº ÓÒ ÐÓ ÒØ Ö ÓÖÑ ÒØ ÜÔÙ ×ØÓ ÓÑÔÖ Ò Ó¸ Ð Ð ÓÖ ØÑÓ Ö ×ÙÐØ ÒØ × Ö × Ò ÐÐÓ ¿ ÈÖ Ñ Ø Ú × × × ×Ó Ö BinNodeXt<Key> ¿ ≡ ´¿ ¿µ ¿ template <class Node> inline Node * select_rec(Node * r, const size_t & i) { if (i == COUNT(LLINK(r))) return r; if (i < COUNT(LLINK(r))) return select_rec(static_cast<Node*>(LLINK(r)), i); return select_rec(static_cast<Node*>(RLINK(r)), i - COUNT(LLINK(r)) - 1); } Ä Ú Ö× ÓÒ Ø Ö Ø Ú Ø Ñ Ò × ÑÙÝ × Ò ÐÐ ¸ Ñ × × ÙÖ Ý ÑÙ Ó Ñ × ¬ ÒØ ¿ ÈÖ Ñ Ø Ú × × × ×Ó Ö BinNodeXt<Key> ¿ +≡ ´¿ ¿µ ¿ ¿ template <class Node> inline Node * select(Node * r, const size_t & pos) { for (size_t i = pos; i != COUNT(LLINK(r)); /* nada */)
  • 382.
    356 Cap´ ´ ıtulo 4. Arboles if (i < COUNT(LLINK(r))) r = static_cast<Node*>(LLINK(r)); else { i -= COUNT(LLINK(r)) + 1; r = static_cast<Node*>(RLINK(r)); } return r; } 4.11.2 C´lculo de la posici´n infija a o ÙÒ Ð Ú Ü ×Ø ÒØ Ò Ð ¸ × ÑÓ× Ð ÙÐ Ö ×Ù ÔÓ× ÓÒ Ò¬ × Ö¸ ×Ù ÓÖ Ò ÒØÖÓ Ð ÓÒ ÙÒØÓ Ð Ú ×º ר ÔÖÓ Ð Ñ × Ö ×Ù ÐÚ Ö ÙÖ× Ú Ñ ÒØ Ð × Ù ÒØ ÑÓ Ó ¿ ÈÖ Ñ Ø Ú × × × ×Ó Ö BinNodeXt<Key> ¿ +≡ ´¿ ¿µ ¿ ¿ template <class Node, class Compare> inline size_t inorder_position(Node * r, const typename Node::key_type & key, Node *& node) { if (Compare () (key, KEY(r))) return inorder_position(static_cast<Node*>(LLINK(r)), key, node); else if (Compare () (KEY(r), key)) return inorder_position(static_cast<Node*>(RLINK(r)), key, node) + COUNT(LLINK(r)) + 1; else return COUNT(LLINK(r)); } Ä ÖÙØ Ò Ö ÓÑÓ ÒØÖ Ð Ö Þ Ð Ö ÓÐ r Ý Ð Ð Ú keyº Ð Ø Ö Ö Ô Ö Ñ ØÖÓ¸ node¸ × × Ð Ý × ÙÒ ÒÓ Ó ÕÙ ÓÒØ Ò Ð Ð Ú key ר Ö ×ÙÐØ Ó Ø Ò × ÒØ Ó ×ÓÐÓ × Ð Ð Ú Ù Ò ÓÒØÖ º Ð Ú ÐÓÖ Ö ØÓÖÒÓ × Ð ÔÓ× ÓÒ key ÒØÖÓ Ð Ö ÓÖÖ Ó Ò¬ Óº Ò ×Ó ÕÙ key ÒÓ × Ò Ù ÒØÖ Ò Ð Ö Óи ÒØÓÒ × × Ö ØÓÖÒ ÙÒ Ú ÐÓÖ Ò Ø ÚÓº 4.11.3 Inserci´n por clave en ´rbol binario extendido o a Ä Ò× Ö ÓÒ ÔÓÖ Ð Ú × ÒØ Ð ÙÒ ÔÖ × ÒØ ÒÜ º º¿ ´Ô Ò ¿¿ µ¸ × ÐÚÓ ÕÙ Ò × Ø ÑÓ× ØÙ Ð Þ Ö ÐÓ× ÓÒØ ÓÖ × ¿ ÈÖ Ñ Ø Ú × × × ×Ó Ö BinNodeXt<Key> ¿ +≡ ´¿ ¿µ ¿ ¿ template <class Node, class Compare> inline Node * insert_by_key_xt(Node *& r, Node * p) { if (r == Node::NullPtr) return r = p; Node * q; if (Compare () (KEY(p), KEY(r))) { q = insert_by_key_xt<Node, Compare>(static_cast<Node*&>(LLINK(r)), p); if (q != Node::NullPtr) ++COUNT(r); }
  • 383.
    4.11. Extensiones alos ´rboles binarios a 357 else if (Compare ()(KEY(r), KEY(p))) { q = insert_by_key_xt<Node, Compare>(static_cast<Node*&>(RLINK(r)), p); if (q != Node::NullPtr) ++COUNT(r); } else return (Node*) Node::NullPtr; // clave duplicada return q; } Ä × ÒØ Ü × Ý × Ñ ÒØ ×ÓÒ Ð × Ñ ×Ñ × ÕÙ Ô Ö ÐÓ× º 4.11.4 Partici´n por clave o Ä Ô ÖØ ÓÒ ÔÓÖ Ð Ú ÜÔÐ Ò Ü º º ´Ô Ò ¿¿ µ ÔÙ ÑÔÐ ÒØ Ö× ÓÒ Ð Ñ ×Ñ ×ØÖÙ ØÙÖ Ô Ö ÙÒ ¿ ÈÖ Ñ Ø Ú × × × ×Ó Ö BinNodeXt<Key> ¿ +≡ ´¿ ¿µ ¿ ¿ # define SPLIT split_key_rec_xt<Node, Compare> template <class Node, class Compare> inline bool split_key_rec_xt(Node * root, const typename Node::key_type & key, Node *& l, Node *& r) { if (root == Node::NullPtr) { l = r = Node::NullPtr; return true; } if (Compare() (key, KEY(root))) { if (not SPLIT(LLINK(root), key, l, LLINK(root))) return false; r = root; COUNT(r) -= COUNT(l); } else if (Compare() (KEY(root), key)) { if (not SPLIT(RLINK(root), key, RLINK(root), r)) return false; l = root; COUNT(l) -= COUNT(r); } else return false; // clave duplicada return true; } ¬Ò × split key rec xt¸ Ù× Ò ÙÒ ¿ º
  • 384.
    358 Cap´ ´ ıtulo 4. Arboles 4.11.5 Inserci´n en ra´ o ız ÓÒ Ð ÙÒ ÓÒ ÒØ Ö ÓÖ¸ ÔÓ ÑÓ× ÑÔÐ ÒØ Ö Ð Ò× Ö ÓÒ Ò Ð Ö Þ Ó Ð Ñ ×ÑÓ ×ÕÙ Ñ ÕÙ Ð × ÖÖÓÐÐ Ò Ü º º ´Ô Ò ¿ ¿µ ¿ ÈÖ Ñ Ø Ú × × × ×Ó Ö BinNodeXt<Key> ¿ +≡ ´¿ ¿µ ¿ ¿ template <class Node, class Compare> inline Node * insert_root_xt(Node *& root, Node * p) { if (root == Node::NullPtr) return p; if (not split_key_rec_xt<Node, Compare>(root, KEY(p), LLINK(p), RLINK(p))) return Node::NullPtr; COUNT(p) = COUNT(LLINK(p)) + COUNT(RLINK(p)) + 1; root = p; return p; } ¬Ò × insert root xt¸ Ù× Ò ÙÒ º Í× × split key rec xt ¿ º 4.11.6 Partici´n por posici´n o o ר ÓÔ Ö ÓÒ × Ô Ö Ð Ô ÖØ ÓÒ ÔÓÖ Ð Ú ¸ ÓÒ Ð Ü Ô ÓÒ ÕÙ Ð ÔÙÒØÓ Ô ÖØ ÓÒ × Ö ×Ô ØÓ ÙÒ ÔÓ× ÓÒ i Ð Ö ÓÖÖ Ó Ò¬ Óº Ä Ô ÖØ ÓÒ Ö ×ÙÐØ Ò Ó× Ö ÓÐ × Tl =< k1k2 . . . kl > Ý Tr =< ki . . . kn >º Ë ÐÚÓ ÕÙ i ר Ù Ö Ö Ò Ó × Ö¸ i ≥ (T )¸ Ð Ð ÓÖ ØÑÓ × ÑÔÖ Ø Ò Ü ØÓº È Ö ×Ø × ØÙ ÓÒ¸ × Ò ÑÓ× Ð × Ù ÒØ Ð ÓÖ ØÑÓ Ö Ñ Ò × ÒØ Ð Ô ÖØ ÓÒ Ö ÙÖ¹ × Ú ÔÓÖ Ð Ú ¿ ÈÖ Ñ Ø Ú × × × ×Ó Ö BinNodeXt<Key> ¿ +≡ ´¿ ¿µ ¿ ¿ template <class Node> inline void split_pos_rec(Node * r, const size_t & i, Node *& ts, Node *& tg) { if (i == COUNT(r)) // ¿Es la ultima posici´n (que est´ vac´a)? ´ o a ı { ts = r; tg = Node::NullPtr; return; } if (i == COUNT(LLINK(r))) // ¿se alcanz´ la posici´n de partici´n? o o o { ts = LLINK(r); tg = r; LLINK(tg) = Node::NullPtr; COUNT(tg) -= COUNT(ts); return; } if (i < COUNT(LLINK(r))) { split_pos_rec(static_cast<Node*>(LLINK(r)), i, ts, static_cast<Node*&>(LLINK(r))); tg = r;
  • 385.
    4.11. Extensiones alos ´rboles binarios a 359 COUNT(r) -= COUNT(ts); } else { split_pos_rec(static_cast<Node*>(RLINK(r)), i - (COUNT(LLINK(r)) + 1), static_cast<Node*&>(RLINK(r)), tg); ts = r; COUNT(r) -= COUNT(tg); } } ¬Ò × split pos rec¸ Ù× Ò ÙÒ ¿ º 4.11.7 Inserci´n por posici´n o o ÓÒ× Ö ÑÓ× Ð Ö ÓÖÖ Ó Ò¬ Ó k0, k1, k2, . . . , ki−1, ki, ki+1, . . . , kn º Ù Ò Ó Ò× ÖØ ÑÓ× 1 kp Ò Ð i¹ × Ñ ÔÓ× ÓÒ¸ Ð Ö ÓÖÖ Ó Ö ×ÙÐØ ÒØ × k0, k1, k2, . . . , ki−1, kp, ki, ki+1, . . . , kn 1 × Ö¸ Ô ÖØ Ö Ð ÔÓ× ÓÒ i¸ ÐÓ× Ð Ñ ÒØÓ× × ×ÔÐ Þ Ò Ð Ö Ð ÔÓ× ÓÒ Ò¬ kp × i¸ ×Ù ÔÖ ×ÓÖ × ki−1 Ý ×Ù ×Ù ×ÓÖ × kiº Ð Ð ÓÖ ØÑÓ ÕÙ ÔÖÓÔÓÒ ÑÓ× × ÑÙÝ × Ò ÐÐÓ × ÒÓ× Ò×Ô Ö ÑÓ× Ð Ò× Ö ÓÒ Ò Ð Ö Þ ÔÖ × ÒØ Ó Ò Ü º º ´Ô Ò ¿ ¿µ ´Ô º ¿ ¿µ ¿ ÈÖ Ñ Ø Ú × × × ×Ó Ö BinNodeXt<Key> ¿ +≡ ´¿ ¿µ ¿ ¿ template <class Node> inline void insert_by_pos_xt(Node *& r, Node * p, const size_t & pos) { split_pos_rec(r, pos, static_cast<Node*&>(LLINK(p)), static_cast<Node*&>(RLINK(p))); COUNT(p) = COUNT(LLINK(p)) + 1 + COUNT(RLINK(p)); r = p; } Í× × split pos rec ¿ º Ë ÐÚÓ ÕÙ pos ר Ù Ö Ö Ò Ó Ó × ÕÙ × Ù Ð Ó ×Ó Ö Ô × Ð ÒØ Ð Ñ ÒØÓ׸ Ð Ò× Ö ÓÒ × ÑÔÖ Ø Ò Ö Ü ØÓº ÆÓØ ÑÓ× ÕÙ Ð Ò× Ö ÓÒ ÔÓÖ ÔÓ× ÓÒ ÔÙ Ú ÓÐ Ö Ð ÓÒ ÓÒ ÓÖ Ò ÙÒ º 4.11.8 Uni´n exclusiva de ´rboles extendidos o a Ä ÙÒ ÓÒ Ü ÐÙ× Ú ÔÖ × ÒØ Ò Ü º º ´Ô Ò ¿ ½µ × ×ØÖÙ ØÙÖ ÐÑ ÒØ ÒØ Ò ×Ù Ú Ö× ÓÒ Ô Ö Ö ÓÐ × ÜØ Ò Ó׺ ÄÓ ÙÒ Ó ÕÙ ÑÓ× ÑÓ ¬ Ö × Ð ØÙ Ð Þ ÓÒ ÐÓ× ÓÒØ ÓÖ × ¿ ÈÖ Ñ Ø Ú × × × ×Ó Ö BinNodeXt<Key> ¿ +≡ ´¿ ¿µ ¿ ¿¼ template <class Node> inline Node * join_exclusive_xt(Node *& ts, Node *& tg) { if (ts == Node::NullPtr) return tg; if (tg == Node::NullPtr) return ts; LLINK(tg) = join_exclusive_xt(RLINK(ts), LLINK(tg)); RLINK(ts) = tg;
  • 386.
    360 Cap´ ´ ıtulo 4. Arboles COUNT(tg) = COUNT(LLINK(tg)) + 1 + COUNT(RLINK(tg)); // actualizar contadores COUNT(ts) = COUNT(LLINK(ts)) + 1 + COUNT(RLINK(ts)); Node * ret_val = ts; ts = tg = Node::NullPtr; // deben quedar vac´os despu´s del join ı e return ret_val; } ¬Ò × join exclusive xt¸ Ù× Ò ÙÒ ¿ ¼º 4.11.9 Eliminaci´n por clave en ´rboles extendidos o a Ð Ñ Ò Ö ÔÓÖ Ð Ú Ò ÙÒ Ö ÓÐ ÜØ Ò Ó Ø Ñ Ò × ÑÙÝ × Ñ Ð Ö Ð ×ØÙ Ò Ü º º ´Ô º ¿ ¾µ ÓÒ Ð ÓÒ ÕÙ Ý ÕÙ ØÙ Ð Þ Ö ÐÓ× ÓÒØ ÓÖ × Ò Ð Ñ ÒÓ Ù×ÕÙ ¿¼ ÈÖ Ñ Ø Ú × × × ×Ó Ö BinNodeXt<Key> ¿ +≡ ´¿ ¿µ ¿ ¿¼ # define REMOVE remove_by_key_xt<Node, Compare> template <class Node, class Compare> inline Node * remove_by_key_xt(Node *& root, const typename Node::key_type & key) { if (root == Node::NullPtr) return (Node*) Node::NullPtr; // clave no encontrada Node * ret_val = Node::NullPtr; if (Compare () (key, KEY(root))) { ret_val = REMOVE(static_cast<Node*&>(LLINK(root)), key); if (ret_val != Node::NullPtr) // ¿hubo eliminaci´n? o --COUNT(root); // S´ ==> actualizar contador ı return ret_val; } else if (Compare () (KEY(root), key)) { ret_val = REMOVE(static_cast<Node*&>(RLINK(root)), key); if (ret_val != Node::NullPtr) // ¿hubo eliminaci´n? o --COUNT(root); // S´ ==> actualizar contador ı return ret_val; } ret_val = root; // clave encontrada ==> eliminar root = join_exclusive_xt(static_cast<Node*&>(LLINK(root)), static_cast<Node*&>(RLINK(root))); return ret_val; } Í× × join exclusive xt ¿ º 4.11.10 Eliminaci´n por posici´n en ´rboles extendidos o o a Ë Ð ÔÓ× ÓÒ Ò¬ × Ú Ð ¸ ÒØÓÒ ×¸ Ð Ù Ð ÕÙ ÓÒ Ð Ò× Ö ÓÒ Ý Ð Ô ÖØ ÓÒ¸ Ð Ð Ñ Ò ÓÒ × ÑÔÖ Ø Ò Ü ØÓ Ý × ¬Ò ÓÑÓ × Ù ¿¼ ÈÖ Ñ Ø Ú × × × ×Ó Ö BinNodeXt<Key> ¿ +≡ ´¿ ¿µ ¿ ¼ ¿ ¿ template <class Node> inline
  • 387.
    4.12. Rotaci´n de´rboles binarios o a 361 Node * remove_by_pos_xt(Node *& root, const size_t & pos) { if (COUNT(LLINK(root)) == pos) // ¿posici´n encontrada? o { // Si ==> guarde nodo y realice join exclusivo Node * ret_val = root; root = join_exclusive_xt(static_cast<Node*&>(LLINK(root)), static_cast<Node*&>(RLINK(root))); return ret_val; } Node * ret_val; // guarda valor de retorno de llamada recursiva if (pos < COUNT(LLINK(root))) ret_val = remove_by_pos_xt(static_cast<Node*&>(LLINK(root)), pos); else ret_val = remove_by_pos_xt(static_cast<Node*&>(RLINK(root)), pos - (COUNT(LLINK(root)) + 1)); if (ret_val != Node::NullPtr) // ¿hubo eliminaci´n? o --COUNT(root); // Si ==> el arbol con ra´z root perdi´ un nodo ´ ı o return ret_val; } Í× × join exclusive xt ¿ º 4.11.11 Desempe˜o de las extensiones n Ë ÙÒ Ð ÔÖÓÔÓ× ÓÒ Ü º½¾ ´Ô Ò ¿ µ¸ ÙÒ × Ù Ò Ò× Ö ÓÒ Ð ØÓÖ ÔÖÓ Ù ÙÒ Ö ÓÐ ÕÙ Ò ÔÖÓÑ Ó ×Ø ÕÙ Ð Ö Óº ÓÒ× Ù ÒØ Ñ ÒØ ¸ × ÓÒרÖÙ ÑÓ× ÙÒ ÔÓÖ Ò× Ö ÓÒ Ð Ú × Ð ØÓÖ ×¸ ÒØÓÒ × ÐÓ× × ÑÔ ÒÓ× ÙÒ ÓÒ × ÕÙ ÒÓ ÑÓ ¬ÕÙ Ò Ð Ö ÓÐ × Ö Ò O(Ð (n)) ר × Ð ×Ó Ð × Ð ÓÒ¸ Ø ÖÑ Ò ÓÒ Ð ÓÖ Ò Ò¬ Ó Ý Ð Ò× Ö ÓÒ ÔÓÖ Ð Ú º Ò Ð Ô ØÙÐÓ ×ØÙ Ö ÑÓ× Ú Ö× × Ø Ò × Ô Ö Ñ ÒØ Ò Ö ÕÙ Ð Ö Ó× Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ ÕÙ Ñ Ò Ò O(Ð (n)) Ò ØÓ × Ð × ÓÔ Ö ÓÒ ×º ÓÒ Ù ÐÕÙ Ö ×Ø × Ø Ò ×¸ × ÑÔÖ × ÔÓ× Ð Ñ ÒØ Ò Ö ÐÓ× Ö Ò Ó׺ 4.12 Rotaci´n de ´rboles binarios o a Ä ¬ ÙÖ º ½ ÑÙ ×ØÖ Ó× ÕÙ Ú Ð ÒØ × × ÙÒ Ð ÔÖÓÔ ÓÖ Òº ÙÒÓ ÐÐÓ× ÔÙ Ó Ø Ò Ö× Ô ÖØ Ö Ð ÓØÖÓ ØÖ Ú × ÙÒ ØÖ Ò× ÓÖÑ ÓÒ ÐÐ Ñ ÖÓØ ÓÒ º Ð Ö ÓÖÖ Ó Ò¬ Ó Ð Ö ÓÐ º ½´ µ × (αAβ)Bχ¸ Ñ ÒØÖ × ÕÙ Ð Ð º ½´ µ × αA(βBχ)º Ä ÓÔ Ö ÓÒ ÖÓØ ÓÒ ÒÓ Ø Ð ÔÖÓÔ ÓÖ Ò ÙÒ º Ð Ö ÓÐ º ½´ µ × Ó Ø Ò Ô ÖØ Ö Ð Ö ÓÐ º ½´ µ Ñ ÒØ ÙÒ ÖÓØ ÓÒ Ð Ö Ù ÓÖ Ö Ð ÒÓ Ó Bº Ò ÐÓ Ñ ÒØ ¸ Ð Ö ÓÐ º ½´ µ × Ó Ø Ò Ô ÖØ Ö Ð Ö ÓÐ º ½´ µ Ñ ÒØ ÙÒ ÖÓØ ÓÒ Ð ÞÕÙ Ö Ù ÒØ ¹ ÓÖ Ö Ð ÒÓ Ó Aº À Ý Ó× Ö Ø Ö ×Ø × ÑÔÓÖØ ÒØ × ÙÒ ÖÓØ ÓÒ ÕÙ ÑÔÐ ¬ Ö ÑÓ× ÓÒ Ð ÖÓØ ÓÒ Ð Ö ½º Ð ÒÓ Ó A ×Ñ ÒÙÝ Ò ÙÒ Ò Ú Ð¸ Ñ ÒØÖ × ÕÙ Ð Ò Ú Ð Ð ÒÓ Ó B Ð Ö ÓÐ ÓÖ Ò Ð ÙÑ ÒØ Ò ÙÒÓº ¾º Ä Ö Ñ α ×Ñ ÒÙÝ ÒØ Ö Ñ ÒØ Ò ÙÒ Ò Ú Ð¸ Ñ ÒØÖ × ÕÙ Ð Ö Ñ χ ÙÑ ÒØ ÒØ Ö Ñ ÒØ Ò ÙÒ Ò Ú Ðº
  • 388.
    362 Cap´ ´ ıtulo 4. Arboles p q B A q p A B χ α α β β χ ⇐⇒ ´µ ´ µ ÙÖ º ½ ÊÓØ ÓÒ ÙÒ Ö ÓÐ Ò Ö Ó ÓÖ Ú ÑÓ× ÓÑÓ ÑÔÐ ÒØ Ö Ð ÖÓØ ÓÒ Ð Ö ºË p Ð Ö Þ Ð Ö ÓÐ ÖÓØ Ö¸ ÒØÓÒ × ¿¾ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¿ ¿¾ template <class Node> inline Node * rotate_to_right(Node * p) { Node * q = static_cast<Node*>(LLINK(p)); LLINK(p) = RLINK(q); RLINK(q) = p; return q; } rotate to right() Ö ØÓÖÒ Ð ÒÙ Ú Ö Þ Ð Ö ÓÐ ÐÙ Ó Ð ÖÓØ ÓÒº ÓÒ ×Ø Ú ÐÓÖ Ö ØÓÖÒÓ ÔÙ ØÙ Ð Þ Ö× Ð Ô Ö Ð Ö ÓÐ Ö ×ÙÐØ ÒØ º ÈÓÖ ÐÓ Ò Ö Ð¸ ר ÔÖ Ñ Ø Ú × ÙØ Ð Þ Ò Ð ÓÖ ØÑÓ× Ö ÙÖ× ÚÓ× ÕÙ ÒÚÓ Ò ÖÓØ ÓÒ × ×Ù Ö ÓР׺ È Ö Ð ÓÖ ØÑÓ× Ø Ö Ø ÚÓ׸ × Ñ × ÓÒÚ Ò ÒØ ÙØ Ð Þ Ö ÙÒ Ú Ö× ÓÒ Ð ÖÓØ ÓÒ ÕÙ ØÙ Ð ØÙ Ð Þ ÓÒ Ð Ô Ö º È Ö ÐÐÓ¸ ÑÓ× Ô × Ö Ð Ô Ö Ð ×Ù Ö ÓÐ ÕÙ × Ö ÖÓØ Ó ¿¾ ÙÒ ÓÒ × BinNode Utils ¾ ¿ +≡ ¿¾ template <class Node> inline Node * rotate_to_right(Node * p, Node * pp) { Node *q = static_cast<Node*>(LLINK(p)); LLINK(p) = RLINK(q); RLINK(q) = p; if (static_cast<Node*>(LLINK(pp)) == p) // actualizaci´n del padre o LLINK(pp) = q; else RLINK(pp) = q; return q; } pp × Ð Ô Ö Ð ÒÓ Ó pº Ä × Ú Ö× ÓÒ × ÔÓÖ Ð ÞÕÙ Ö ×ÓÒ × Ñ ØÖ ׺
  • 389.
    4.13. C´digos deHuffman o 363 4.12.1 Rotaciones en ´rboles binarios extendidos a ÓÒ Ö ÓÐ × ÜØ Ò Ó× Ý ÕÙ Ø Ò Ö Ù Ó Ùר Ö ÐÓ× ÓÒØ ÓÖ ×º Ê ØÓÑ Ò Ó Ð ×Ó Ò Ö Ð ÖÓØ ÓÒ ÐÙ×ØÖ Ó Ò Ð ¬ ÙÖ º ½¸ Ø Ò ÑÓ× ÙÒ Ö ÓÐ Ò Ö Ó (αAβ)Bχ ÕÙ × ÑÓ× ÖÓØ Öº ÈÓÖ Ð ¬Ò ÓÒ Ö ÓÐ ÜØ Ò Ó¸ Ø Ò ÑÓ× ÕÙ (B) = (α) + 1 + (β) + 1 + (χ) . |B| |α| |{A}| |β| |{B}| |χ| ×ÔÙ × ÖÓØ Ö × ÙÑÔÐ Ö (A) = (α) + 1 + (β) + 1 + (χ) . |A| |α| |{B}| |β| |{B}| |χ| × Ô٠׸ Ð ÔÖ Ñ Ø Ú ÖÓØ ÓÒ Ð Ö ×Ö ¿¿ ÈÖ Ñ Ø Ú × × × ×Ó Ö BinNodeXt<Key> ¿ +≡ ´¿ ¿µ ¿ ¼ template <class Node> inline Node * rotate_to_right_xt(Node* p) { Node * q = static_cast<Node*>(LLINK(p)); LLINK(p) = RLINK(q); RLINK(q) = p; COUNT(p) -= 1 + COUNT(LLINK(q)); COUNT(q) += 1 + COUNT(RLINK(p)); return q; } 4.13 C´digos de Huffman o Ä Ö ÔÖ × ÒØ ÓÒ ×Ø Ø ÜØÓ ÓÒ× ×Ø Ò ÙÒ × Ö × Ñ ÓÐÓ× Ð Ø ÒÓ׸ Ö × Ó׸ Ö ¹ Ó× Ý ÓØÖÓ× Ñ × ÓÒÚ Ò Ó× × ÑÙÒ Ó× ÐÓ× × Ó× Ý Ñ Ø Ñ Ø Ó׺ Ò Ô Ô Ð¸ ÓÒ Ð Ù Ó ÓÖÑ ØÓ¸ ÐÓ× × Ñ ÓÐÓ× ÓÒ ÓÖÑ Ò ÙÒ × Ù Ò Ú ×Ù ÐÑ ÒØ Ð Ð ÔÓÖ ÙÒ ×Ô ÒÓ Ð ÒØ º Ð ÓÒ Ö Ù Ö Ð ×Ô Ó Ó ÙÔ Ó ÔÓÖ ÙÒ Ø ÜØÓ ´Ó × Ù Ò µ × Ð ÒÓÑ Ò ÓÑÔÖ Ñ Ö º Ò Ð Ð ÓÖ ÓÒ ÙÒ Ø ÜØÓ¸ Ý ÙÒ ÓÑÔÖÓÑ ×Ó ÒØÖ Ð ÓÑÔÖ × ÓÒ Ý Ð Ð Ð º Ò Ö × Ð Ð Ð ¸ × × Ö ¬ Ð ÓÑÔÖ × ÓÒ¸ Ý × × ÓÑÓ × Öº Ë ¸ ÔÓÖ ÑÔÐÓ¸ Ð Ð ØÖ × ÑÙÝ Ô ÕÙ Ò ¸ Ù× ÑÓ× Ñ ÒÓ× ×Ô Ó¸ Ô Ô Ð¸ Ô ÖÓ Ð Ø ÜØÓ × Ñ ÒÓ× Ð Ð º ÈÓÖ Ð ÓÒØÖ Ö Ó¸ × Ð Ð ØÖ × ÑÙÝ Ö Ò ¸ ÒØÓÒ × Ö ÕÙ Ö ÑÓ× Ñ × ×Ô Ó¸ Ö Ó¸ Ñ × Ô Ô Ð Ó Ô ÒØ ÐÐ º Ò Ð Ö ÔÖ × ÒØ ÓÒ ÖÒ Ø ÐÓ× × Ñ ÓÐÓ× ÙÒ Ø ÜØÓ × Ù× ÙÒ Ó Ó Ø×º Ò ÒÙ ×ØÖ × Ö ÙÒר Ò ×¸ ÙÒ Ó Ó × ÙÒ Ù Ö Ó Ö ÔÖ × ÒØ ÓÒ × Ñ ÓÐÓ× Ñ ÒØ ÓÑ Ò ÓÒ × Ø×º ÍÒ ÑÔÐÓ ÒÓØ Ð ÐÓ ÓÒר ØÙÝ Ð Ó Ó Ë ÁÁ Ð Ù Ð Ñ Ô × Ù Ò × × Ø Ø× ÙÒ × Ñ ÓÐÓ ¸ Ò Ð × Ù ÒØ Ø Ð ¸ Ð ÙÒ × ×Ù× Ó ÙÖÖ Ò × Ë Ñ ÓÐÓ Î ÐÓÖ Ò Ö Ó Î ÐÓÖ Ñ Ð 1000001 65 1100010 98 1111011 123
  • 390.
    364 Cap´ ´ ıtulo 4. Arboles À Ý ÓØÖÓ× × ×Ø Ñ × Ó ¬ ÓÒ Ö Ø Ö ×¸ ÐÓ× Ù Ð × ÙÒÓ ÑÙÝ ÒÓØ Ð × Ð unicode¸ ÜØ Ò× Ð ¸ × Ù Ò × ÐÓÒ ØÙ Ú Ö Ð Ý ÓÒ Ð ÔÖ Ø Ò× ÓÒ × ÖÚ Ö ØÓ Ó× ÐÓ× × Ñ ÓÐÓ× ØÓ × Ð × Ð Ò Ù ×º × Ò ÑÓ× Σ ÓÑÓ Ð ÓÒ ÙÒØÓ ØÓ Ó× ÐÓ× ÔÓ× Ð × × Ñ ÓÐÓ× ÕÙ ÔÙ ÓÒØ Ò Ö ÙÒ Ø ÜØÓº Ò ×Ø ×Ó¸ ÔÓ ÑÓ× Ó ¬ Ö ÐÓ× |Σ| × Ñ ÓÐÓ× ÓÒ Ð |Σ| Ø×º ÓÖ Ó Ð Ó Ó¸ Ù ÐÕÙ Ö ÒØ ´Ó ÔÖÓ Ö Ñ µ ÔÙ ÒØ ÖÔÖ Ø Ö ¾½ ÙÒ Ø ÜØÓº Ë ÓÒ× Ö ÑÓ× ÙÒ Ø ÜØÓ Ô ÖØ ÙÐ Ö Tx ÙÝÓ× × Ñ ÓÐÓ× × Ö Ñ Ø Ò ÙÒ ÓÒ ÙÒØÓ S ⊂ Σ¸ ÒØÓÒ × ÔÓ Ö ÑÓ× Ó ¬ ÖÐÓ ÓÒ Ð |S| ≤ Ð |Σ| Ø×º È Ö ÐÐÓ¸ ÓÒרÖÙ ÑÓ× ÙÒ Ø Ð Ñ Ô Ó × Ñ ÓÐÓ× × Ù Ò × Ø× Ý ÒÓ× × ÖÚ ÑÓ× ÐÐ Ô Ö ÒØ ÖÔÖ Ø Ö Ð Ø ÜØÓº Ì Ò ÑÓ× ÕÙ ÙÒ ÔÖ Ñ Ö ÓÖÑ ÓÑÔÖ × ÓÒº Ë Ò Ñ Ö Ó¸ ר Ñ ØÓ Ó Ø Ò Ð Ú ÒØÙ Ð ×Ú ÒØ ÕÙ Ð Ø ÜØÓ Ð Ö× ÔÓÖ ÒØ Ô Ó ØÓ× ÓÒרÖÙ Ö Ð Ø Ð º ×ØÓ ÔÙ × Ö ÔÖÓ Ð Ñ Ø Ó Ò Ð ÙÒ × Ö ÙÒר Ò ×¸ Ð Ð ØÙÖ ÙÒ Ö ÚÓ ÔÓÖ ÑÔÐÓ¸ Ý ÔÖÓ Ø ÚÓ Ò ÓØÖ ×¸ Ð ØÖ Ò×Ñ × ÓÒ ÙÒ Ø ÜØÓº ÇØÖÓ Ò ÓÒÚ Ò ÒØ Ð Ò ÓÕÙ ÒØ Ö ÓÖ × ÕÙ × Ñ ÓÐÓ Ó ÙÔ Ð Ñ ×Ñ ÒØ ¹ Ø×¸ Ò Ô Ò ÒØ Ñ ÒØ ×Ù Ö Ù Ò Ô Ö ÓÒ Ò Ð Ø ÜØÓº Ë Ù× × ÑÓ× × Ù Ò × ÐÓÒ ØÙ Ú Ö Ð ¸ ÒØÓÒ × ÔÓ Ö ÑÓ× × Ó Ö × Ù Ò × ÑÙÝ ÓÖØ × Ô Ö × Ñ ÓÐÓ× ÑÙÝ Ö Ù ÒØ × Ý Ö Ð × Ñ × Ð Ö × Ô Ö × Ñ ÓÐÓ× Ö Ö Ô Ö ÓÒº Ä × × Ð ÓÒ Ö ÐÓ× × Ñ ÓÐÓ× ÙÒ Ø¸ ÐÙ Ó ÐÓ× Ó׸ Ý × ×Ù × Ú Ñ ÒØ × ÙÒ Ù Ò Ö Ù ÒØ × Ð Ô Ö ÓÒ Ð × Ñ ÓÐÓ Ò Ð Ø ÜØÓº ÈÓÖ ÑÔÐÓ¸ Ð Ð Ò Ó¸ ÒÓØ Ó¸ Ô Ö ×Ø Ò Ù ÖÐÓ¸ ÓÑÓ ¸ Ý Ð ¸ ÕÙ ×ÓÒ ÑÙÝ Ö Ù ÒØ ׸ ÔÓ Ö Ò × Ö Ð × Ù Ò × 0 Ý 1¸ Ö ×Ô Ø Ú Ñ ÒØ Ñ ÒØÖ × ÕÙ Ð ¸ ¸ Ý ÔÓ Ö Ò ÒÓØ Ö× ÓÑÓ 00¸ 01¸ 10 Ý 11º ÈÙ Ö ÑÓ× ÓÒØ ÒÙ Ö ÓÒ × Ù Ò × Ñ × Ð Ö × ×Ø Ö Ö ÓÑÔÐ Ø Ñ ÒØ Ð ÓÒ ÙÒØÓ Sº È ÖÓ × ¸ Ò ÖÙØÓ¸ ר Ò ÓÕÙ ÔÐ ÒØ ÙÒ Ñ Ù Ò× ÐÚ Ð ÜÔÖ ¹ × ¸ ÔÓÖ Òר Ò Ô ÖØ ÙÐ Ö Ò Ð × Ù Ò 001¸ ÔÙ × ÒÓ × ÔÙ ×Ø Ò Ù Ö × × ØÖ Ø Ó Ó º Ä Ñ Ù ÒØ Ö ÓÖ × ×ÓÐÚ ÒØ × ¸ Ò ØÖ Ñ ÒØÓ Ð ÒØ ÓÑ Ò ÓÒ × ÔÓ× Ð × Ø×¸ Ù× ÑÓ× ÙÒ Ó Ó ÔÖ ¬ Ó¸ Ò Ð × ÒØ Ó Ð ¬Ò ÓÒ º ¾¾ × Ö¸ ÕÙ Ò Ò ÙÒ × Ù Ò si ÐÓÒ ØÙ i × ÔÖ ¬ Ð ÙÒ ÓØÖ Ö ÒÐ ×ÙÔ Ö ÓÖº Ë × Ó ÑÓ× Ô ÖÑÙØ ÓÒ × × Ù Ò × ÔÖ ¬ ׸ ÒØÓÒ × ÔÓ ÑÓ׸ × Ò ÔÖÓ Ð Ñ Ð ÙÒÓ¸ ר Ò Ù ÖÐ × ÒØ ÖÔÖ Ø ÖÐ × Ò ÙÒ Ø ÜØÓº Å × ÙÒ¸ ÔÓ ÑÓ× ÙØ Ð Þ Ö × Ù Ò × ¸ Ð × Ù Ð ×¸ ÓÑÓ ÓÖÓÐ Ö Ó Ð × ÔÖÓÔÓ× ÓÒ × º Ý º½¼¸ ×ÓÒ ÔÖ ¬ ׺ À Ý ÙÒ Ñ ÓÖ ÙÒ Ñ × ×Ù ×Ø Ò Ð Ò Ù× Ö ÙÒ Ó ¬ ÓÒ ÔÖ ¬ ÔÓ ÑÓ× Ñ ¹ Ô Ö Ò O(1)¸ Ò Ð Ò ÓÒ Ð Ð ØÙÖ Ð Ø ÜØÓ¸ ×Ù Ó ¬ ÓÒº È Ö ÐÐÓ¸ Ù× ÑÓ× ÙÒ Ö ÓÐ Ò Ö Ó ÙÝ × Ó × Ó ¬ Ò ÐÓ× × Ñ ÓÐÓ× Sº ÈÓÖ ÑÔÐÓ¸ Ô Ö S = { , a, e, i, b, c}¸ Ù ÐÕÙ Ö Ö ÓÐ Ò Ö Ó 6 Ó × Ó ¬ S Ò Ð Ó ÙÖÖ Ò ¸ Ð Ö ÓÐ × Ù ÒØ ¾½ À ÕÙ ÙÒ Ó Ø Þ ÓÒ ÙÒ ÓÒ ÕÙ Ò Ð Ñ ØÓ ÙÑ ÒÓ × ÑÙÝ ×Ù Ø Ú º ¾¾ Ò Ð × ÓÒ Ü º º¼º ´Ô Ò ¿¾½µ × Ù× ÖÓÒ ÐÓ× × Ñ ÓÐÓ× a ÔÓÖ 0 Ý b ÔÓÖ 1 º
  • 391.
    4.13. C´digos deHuffman o 365 b c Ë Ñ ÓÐÓ Ó Ó 000 001 a e i ÖÖÓ Ð × Ù ÒØ Ñ Ô Ó 010 011 10 11 Ð ÔÖÓÔÓ× ØÓ ר × ÓÒ × ÔÖ × ÒØ Ö Ñ Ò ×ÑÓ× Ô Ö Ó ¬ Ö× ÙÒ × Ø× Ù× Ò Ó Ö ÓÐ × Ó Ó× Ý Ô Ö ÓÒרÖÙ Ö ×ØÓ× ÙÐØ ÑÓ× ÓÔØ Ñ Ñ ÒØ º 4.13.1 Un TAD para ´rboles de c´digo a o Ò Ð ÓÒØ ÜØÓ Ð Ó ¬ ÓÒ × ÑÔÖ ÔÓ ÑÓ× ×Ø Ò Ù Ö Ó× ÒØ × ÙÒÓ Ó ¬ ÓÖ¸ ÕÙ ØÓÑ ÙÒ Ø ÜØÓ Ý ÐÓ ÓÑÔÖ Ñ ¸ Ý ÓØÖÓ Ó ¬ ÓÖ ÕÙ ØÓÑ Ð Ø ÜØÓ ÓÑÔÖ Ñ Ó Ý ÐÓ Ó ¬ Ð × Ù Ò ÓÖ Ò Ðº È Ö Ó ¬ Ö Ù× Ö ÑÓ× Ð × Ù ÒØ Ð × ¿ Ð × Ó ¬ ÓÖ ¿ ≡ class Huffman_Encoder_Engine { Ñ Ñ ÖÓ× ÔÖ Ú Ó× Ó ¬ ÓÖ ¿ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ó ¬ ÓÖ ¿ }; ר Ð× × Ò Ö ÓÒרÖÙ Ö ÙÒ Ö ÓÐ ÔÖ ¬ Ó× ÓÔØ ÑÓ Ý Ó ¬ Ö Ø ÜØÓ× Ò ÙÒ ÓÒ Ð Ö ÓÐ ÒØ Ö ÓÖº ÈÓÖ ÓÔØ ÑÓ ÔÖ Ø Ò ÑÓ× Ö ÕÙ ÙÒ Ø ÜØÓ Ó ¬ Ó ÓÒ ÐÓ× ÔÖ ¬ Ó× Ð Ö ÓÐ ÓÔØ ÑÓ Ó ÙÔ Ð Ñ ÒÓ× ×Ô Ó ÔÓ× Ð º ÈÖ Ó ¬ Ö Ù× Ö ÑÓ× Ð × Ù ÒØ Ð × ¿ Ð× Ó ¬ ÓÖ ¿ ≡ class Huffman_Decoder_Engine { Ñ Ñ ÖÓ× ÔÖ Ú Ó× Ó ¬ ÓÖ ¿ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ó ¬ ÓÖ ¿ }; Ä × Ð × × Ý ÓØÖ × ¬Ò ÓÒ × × Ò Ù ÒØÖ Ò Ò Ð Ö ÚÓ ÀÙ«Ñ ÒºÀ ´Ò Ú Ö ¬Ò µ º Ó ¬ Ö Ý Ó ¬ Ö ÙÒ × Ù Ò Ö ÕÙ Ö Ú Ö × ×ØÖÙ ØÙÖ × ØÓ׺ Ä ÔÖ Ñ Ö ÐÐ × × Ð ÔÖÓÔ Ó Ö ÓÐ Ó Ó׸ Ð Ù Ð × ¬Ò Ð × Ù ÒØ ÑÓ Ó ¿ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Ó ¬ ÓÖ ¿ ≡ ´¿ µ ¿ BinNode<string> * root; Í× × BinNode ¾ ¼ º ¿ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Ó ¬ ÓÖ ¿ ≡ ´¿ µ BinNode<string> * root; Í× × BinNode ¾ ¼ º
  • 392.
    366 Cap´ ´ ıtulo 4. Arboles root ׸ Ò Ñ × Ð × ×¸ Ð Ö Þ ÙÒ Ö ÓÐ ÔÖ ¬ Ó׺ ÈÓר Ö ÓÖÑ ÒØ ¸ Ø ÐÐ Ö ÑÓ× ÙÒ Ð ÓÖ ØÑÓ Ô Ö ÓÒרÖÙ Ö ×Ø Ö ÓÐ Ñ Ò Ö ÓÔØ Ñ ´Ü º½¿º¿ ´Ô Ò ¿ µµº Ð Ñ ×ÑÓ ÑÓ Ó¸ Ø Ñ Ò ÔÐ ÒØ Ö ÑÓ× ÙÒ Ö Ø Ö Ó ¬ Ò Ý ÑÓ×ØÖ Ö ÑÓ× ×Ù ÓÔØ ¹ Ñ ÓÒ ´Ü º½¿º ´Ô Ò ¿ ¿µµº Ò Ð ÒØ Ö Ò¸ Ý ÕÙ × Ò Ð Ö ÕÙ Ð Ö ÓÐ ÙÝ Ö Þ × root ÓÒØ Ò Ò × ´stringµ Ý ÒÓ × Ñ ÓÐÓ× Ë ÁÁº Ä Ö ÞÓÒ × ÕÙ ¸ Ò ÐÙ Ö × Ñ ÓÐÓ× ÔÙÒØÙ Ð ×¸ ÔÙ ×Ø Ð Ö× Ð ÙÒ Ö Ù Ò Ô Ö ÓÒ Ö × × ÒØ Ö × Ý Ó ¬ Ö× ÒØ Ö Ñ ÒØ Ò ÙÒ × Ù Ò Ø×º Æ × Ø ÑÓ× ÙÒ Ø Ð × Ñ ÓÐÓ× Ò Ð Ù Ð ÐÑ Ò ÑÓ× ×Ù× Ö Ù Ò × Ô Ö ÓÒ Ý ÕÙ ÒÓ× Ô ÖÑ Ø ÓÒרÖÙ Ö ÙÒ Ö ÓÐ ÔÖ ¬ Ó׺ Ð Ø ÔÓ ×Ø Ø Ð × ¬Ò × ¿ Ð Ö ÓÒ × ÀÙ«Ñ Ò ¿ ≡ ¿ class Huffman_Node; typedef DynMapTree<Treap_Vtl, string, Huffman_Node *> Symbol_Map; Ä Ø Ð Ñ Ô × Ñ ÓÐÓ× Ø ÔÓ string ÒÓ Ó× ÙÒ Ô ÕÙ Ù× Ö ÑÓ× Ô Ö Ø ÖÑ Ò Ö ÓÔØ Ñ Ñ ÒØ ÐÓ× ÔÖ ¬ Ó׺ Ð Ô Ö Ñ ØÖÓ Treap Vtl × ÙÒ Ð × ×Ô Ð Ö ÓÐ Ò Ö Ó Ù×ÕÙ ÐÐ Ñ Ó ÌÖ Ô¸ Ð Ù Ð × Ö ØÖ Ø Ó Ò Ü º¿ ´Ô Ò µº Ë Ø Ò ÑÓ× Ð ÙÒ ¬ ÙÐØ Ò ÔØ Ö Ð Ø ÔÓ Treap Vtl¸ ÒØÓÒ × ÔÓ ÑÓ× ÙØ Ð Þ Ö¸ ÓÒ Ð Ñ ×Ñ ÒØ Ö Þ Ý¸ ÔÖÓ Ð Ñ ÒØ ÓÒ × ÑÔ ÒÓ × Ñ Ð Ö¸ Ð Ø ÔÓ BinTreeVtl ÔÖ Ú Ñ ÒØ ×ØÙ Ó Ò Ü º º¾ ´Ô Ò ¿¿ µº ÈÓÖ Ö ÞÓÒ × ÕÙ ÜÔÐ Ö ÑÓ× ÔÖÓÒØ Ñ ÒØ ¸ ÙÒ Ö ÓÐ ÔÖ ¬ Ó× × ÓÒרÖÙÝ Ô ÖØ Ö ÙÒ Ô Ð Ù Ð ×Ù× ÒÓ Ó× ×ÓÒ Ø ÔÓ Huffman Node Ý × ¬Ò Ò Ð × Ù ÒØ ÓÖÑ ¿ Ð Ö ÓÒ × ÀÙ«Ñ Ò ¿ +≡ ¿ ¿ typedef BinNode< Aleph::pair<string, size_t> > Freq_Node; struct Huffman_Node : public BinHeap<size_t>::Node { BinNode<string> * bin_node; }; Í× × BinNode ¾ ¼ º ÖÓ××Ó ÑÓ Ó¸ Huffman Node × ÙÒ ÒÓ Ó Ò Ö Ó ÙÒ Ô ÙÝ Ð Ú ¸ ѹ ÒØ get key()¸ × Ð Ö Ù Ò Ô Ö ÓÒ Ó ×Ø ר ÙÒ × Ñ ÓÐÓº Ð ÒÓ Ó Ò Ù ×Ø ÓÒ ÓÒØ Ò ÙÒ ÔÙÒØ ÓÖ ÙÒ ÒÓ Ó ÒØÖÓ Ð Ö ÓÐ ÔÖ ¬ Ó׺ Ð Ø ÔÓ Ô × ¬Ò Ð × Ù ÒØ Ñ Ò Ö ¿ Ð Ö ÓÒ × ÀÙ«Ñ Ò ¿ +≡ ¿ ¿ typedef BinHeap<size_t> Huffman_Heap; Ò ÙÒ ÓÒ ×Ø Ø ÔÓ¸ ¬Ò ÑÓ× Ð × × Ù ÒØ × ÙÒ ÓÒ × ÙÜ Ð Ö × ¿ Ð Ö ÓÒ × ÀÙ«Ñ Ò ¿ +≡ ¿ ¿ static inline const size_t & get_freq(Huffman_Node * huffman_node) static inline void increase_freq(Huffman_Node * huffman_node) static inline void set_freq(Huffman_Node * huffman_node, const size_t & freq) ÓÖ ÔÓ ÑÓ× ¬Ò Ö Ð Ô ÒØÖÓ Ð Ó ¬ ÓÖ Ý ×Ù Ø Ð × Ñ ÓÐÓ× ¿ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Ó ¬ ÓÖ ¿ +≡ ´¿ µ ¿ ¿ Huffman_Heap heap; Symbol_Map symbol_map; ÈÓÖ ÑÔÐÓ¸ symbol map["a"].get key() Ö ØÓÖÒ Ð Ö ÙÒ ×Ó Ð × Ñ ÓÐÓ "a"º
  • 393.
    4.13. C´digos deHuffman o 367 Ä ÙÐØ Ñ ×ØÖÙ ØÙÖ ØÓ× × Ð Ø Ð Ó Ó׸ Ð Ù Ð Ö ÕÙ Ö Ð ¬Ò ÓÒ Ð × Ù ÒØ Ø ÔÓ ¿ Ð Ö ÓÒ × ÀÙ«Ñ Ò ¿ +≡ ¿ typedef DynMapTree<Treap_Vtl, string, BitArray> Code_Map; Í× × BitArray ¿ º ¿ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Ó ¬ ÓÖ ¿ +≡ ´¿ µ ¿ ¿ Code_Map code_map; ר Ø Ð × ÙØ Ð Þ Ô Ö Ó ¬ Ö ÙÒ Ø ÜØÓº Ä × Ð Ö × Ù Ò ÐÑ ÒØ Ð Ø ÜØÓ Ý Ò ÓÒØÖ Ö Ò Ð Ø Ð Ó Ó× Ð ÓÖÖ ×ÔÓÒ ÒØ Ó Ó ØÓ× Ò Ö Ö Ð Ø ÜØÓ Ó ¬ Óº Ð Ù Ð ÕÙ ÓÒ Ð Ø Ð × Ñ ÓÐÓ׸ Ð Ó Ó× × ÑÔÐ Ñ ÒØ ÓÒ ÙÒ ÌÖ Ô ´Ü º¿ ´Ô Ò µµº À Ý ÓØÖÓ× ØÖ ÙØÓ× ÓÒ Ð × ÕÙ Ù× Ö ÑÓ× Ò Ð Ð × Huffman Encoder Engine ¿ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Ó ¬ ÓÖ ¿ +≡ ´¿ µ ¿ ¿ string end_symbol; size_t text_len; end symbol¸ ÕÙ Ø Ñ Ò × ÙØ Ð Þ Ò Huffman Decoder Engine¸ × ÙÒ × Ñ ÓÐÓ ×Ô ¹ Ð ÕÙ ÒÓØ Ð ¬Ò Ð Þ ÓÒ ÙÒ Ø ÜØÓ ×Ù ¬Ò ÓÒ Ó ÝÙ Ø ÖÑ Ò Ö Ù Ò Ó ÙÐÑ Ò ÙÒ × Ù Ò Ø× ÓÖÖ ×ÔÓÒ ÒØ ÙÒ Ø ÜØÓ Ó ¬ Óº text len Ò Ð ÐÓÒ ØÙ Ð Ø ÜØÓ × Ò Ó ¬ Öº 4.13.2 Decodificaci´n o Ð ØÓ ÕÙ ¸ Ó Ø Ú Ñ ÒØ ¸ ÑÓ× ÒÓÑ Ò Ó ÒØ ÖÔÖ Ø Ö ¸ ÐÓ ÔÓ ÑÓ× ÒÓØ Ö ÓÑÓ Ó ¬ Öº ר ÑÓ Ó¸ ×ÙÑ Ò Ó ÙÒ Ö Þ root ÙÒ Ö ÓÐ ÔÖ ¬ Ó× Ý ÙÒ ÔÙÒØ ÖÓ p¸ Ð × Ù ÒØ ÓÖÑ ¸ ÔÓ ÑÓ× Ó ¬ Ö ÙÒ × Ù Ò bit stream bit stream len Ø×¸ Ñ ÒØ Ð × Ù ÒØ ÖÙØ Ò ¿ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ó ¬ ÓÖ ¿ ≡ ´¿ µ void decode(BitArray & bit_stream, const size_t & bit_stream_len, ostream & output) { BinNode<string> * p = root; for (int i = 0; i < bit_stream_len; ++i) { if (bit_stream.read_bit(i) == 0) p = LLINK(p); else p = RLINK(p); if (is_leaf(p)) // ¿es hoja? { // s´ ==> escribir sm´bolo y reiniciar a ra´z ı ı ı const string & symbol = p->get_key(); if (symbol == end_symbol) // ¿se alcanza final? break; output << symbol; p = root; } } } Í× × BinNode ¾ ¼ Ò BitArray ¿ º
  • 394.
    368 Cap´ ´ ıtulo 4. Arboles Ä × Ô ÖØ Ö × Ð Ö Þ Ð Ö ÓРݸ × ÙÒ Ð Ú ÐÓÖ Ø Ð Ó¸ × Ò Ö Ð ÞÕÙ Ö Ó Ö ×Ø Ô Ö Ö Ò Ð ÙÒ Ó ¾¿ º Ò × ÒØÓÒ ×¸ Ð ÔÖ ¬ Ó Ð Ó × ÓÖÖ ×ÔÓÒ ÓÒ ÙÒ × Ñ ÓÐÓº × Ô٠׸ Ô Ö Ó ¬ Ö ÙÒ × Ù Ò Ø×¸ Ð Ù×Ù Ö Ó Òר Ò Ö ÙÒ Ó ØÓ Ø ÔÓ Huffman Decoder Engine¸ ÙÝÓ ÓÒרÖÙ ØÓÖ Ö Ð Ö Þ Ð Ö ÓÐ Ó Ó Ý Ð × Ñ ÓÐÓ ÓÒ× Ö Ó ÓÑÓ ¬Ò Ð ÒØÖ º ÄÙ Ó¸ × ÒÚÓ Ð Ñ ØÓ Ó decode()¸ Ð Ù Ð ÖÖÓ ×Ù × Ð Ð Ô Ö Ñ ØÖÓ outputº ÓÒÓ Ó Ð Ö Óи Ð ÔÖÓ ×Ó Ó ¬ ÓÒ × Ö Ð Ø Ú Ñ ÒØ × Ò ÐÐÓº 4.13.3 Algoritmo de Huffman Ó ÙÒ ÓÒ ÙÒØÓ n × Ñ ÓÐÓ׸ ÕÙ Ö ÑÓ× ÓÒרÖÙ Ö ÙÒ Ö ÓÐ Ó Ó× Ü Ø Ñ ÒØ n Ó ×º À Ò Ó ×ØÖ ÓÒ ÕÙ ×Ø × Ó × ÙÒ Ò ÒÓ Ó× ÜØ ÖÒÓ׸ ÒØÓÒ ×¸ ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ º¾¸ Ù ÐÕÙ Ö Ö ÓÐ n− 1+ n = 2n− 1 ÒÓ Ó׸ ÓÒ Ù ÐÕÙ Ö Ô ÖÑÙØ ÓÒ × Ñ ÓÐÓ× ÓÑÓ Ó × ÓÒר ØÙÝ ÙÒ Ö ÓÐ Ó Ó׺ ÈÓÖ Ð ÔÖÓÔÓ× ÓÒ º½½¸ × ÑÓ× ÕÙ Ü ×Ø Ò C2n−1 = 2n 2(2n−1) 1 2n−1 Ö ÒØ × Ö ÓÐ × Ó Óº ËÙÖ Ò¸ ÒØÓÒ ×¸ Ð × ÔÖ ÙÒØ × Ù Ð × Ó Ö ÓÑÓ ÓÒרÖÙ ÖÐÓ ÀÙ«Ñ Ò × Ù Ö Ó ÙÒ Ñ ØÓ Ó Ô Ö ÓÒרÖÙ Ö ÙÒ Ö ÓÐ ÔÖ ¬ Ó× Ð Ù Ð Ô ÖØ ÙÒ ÓÒ ÙÒØÓ Ò Ó ÓÒ ÐÓ× × Ñ ÓÐÓ× Ý ×Ù× Ö Ù Ò × Ô Ö ÓÒº × Ö¸ ÙÒ ÓÒ ÙÒØÓ ÒÓ Ó× Ð Ø ÔÓ Huffman Node Ý × Ö ØÓº ÄÐ Ñ ÑÓ× ×Ø ÓÒ ÙÒØÓ heap¸ Ð Ù Ð × ÑÔÐ ÒØ Ñ ÒØ ÙÒ Ôº È Ö ÓÒרÖÙ Ö ÙÒ ÒÙ ÚÓ ÒÓ Ó huffman node¸ ÔÖ Ñ ÖÓ Ý ÕÙ × Ð ÓÒ Ö ÐÓ× Ó× ÒÓ Ó× ÓÒ Ñ ÒÓÖ × Ö Ù Ò × Ð × Ù ÒØ ÓÖÑ ¿ × Ð ÓÒ Ö ÐÓ× Ó× ÒÓ Ó× Ñ ÒÓÖ Ö Ù Ò ¿ ≡ ´¿ µ Huffman_Node * l_huffman_node = // nodo izquierdo static_cast <Huffman_Node *> (heap.getMin()); Huffman_Node * r_huffman_node = // nodo derecho static_cast <Huffman_Node *> (heap.getMin()); ÓÒ ×ØÓ× Ó× ÒÓ Ó׸ × ÓÒרÖÙÝ ÙÒ ×Ù ¹ Ö ÓÐ ÀÙ«Ñ Ò Ð × Ù ÒØ ÓÖÑ ¿ Ö Ö ÙÒ ÒÙ ÚÓ ÒÓ Ó ÀÙ«Ñ Ò ¿ ≡ ´¿ µ BinNode <string> * bin_node = new BinNode <string>; Huffman_Node * huffman_node = new Huffman_Node (bin_node); LLINK(bin_node) = l_huffman_node->bin_node; RLINK(bin_node) = r_huffman_node->bin_node; const size_t new_freq = get_freq(l_huffman_node) + get_freq(r_huffman_node); Aleph::set_freq(huffman_node, new_freq); Í× × BinNode ¾ ¼ º Ð ÒÙ ÚÓ ÒÓ Ó × ÓÒרÖÙÝ ÓÑÓ Ô Ö ÐÓ× Ó× Ñ ÒÓÖ × ÓÒØ Ò Ó× Ò Ð Ôº × ÑÔÓÖØ ÒØ ר Ö ÕÙ Ð ÒÙ ÚÓ ×Ù ¹ Ö ÓÐ × Ø ÔÓ BinNode<string>¸ ÕÙ × Ð Ø ÔÓ Ð Ö ÓÐ ÀÙ«Ñ Ò Ý ÒÓ Ø ÔÓ Huffman Nodeº Ä Ñ Ò Ö ¬Ò Ø Ú Ô Ö ÓÒרÖÙ Ö ÙÒ Ö ÓÐ ÔÖ ¬ Ó× × Ö Ð Þ × ¿ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ó ¬ ÓÖ ¿ ≡ ´¿ µ ¿ ¼ BinNode<string> * generate_huffman_tree( ) { while (heap.size() > 1) ¾¿ ÆÓØ ÑÓ× ÕÙ ÙÒ ÔÖ ¬ Ó Ù Ö Ö Ñ Ñ Ö ÒÞ ÓÒ Ð ÒÙÑ ÖÓ ÛÝ Ð Ó º
  • 395.
    4.13. C´digos deHuffman o 369 { × Ð ÓÒ Ö ÐÓ× Ó× ÒÓ Ó× Ñ ÒÓÖ Ö Ù Ò ¿ Ö Ö ÙÒ ÒÙ ÚÓ ÒÓ Ó ÀÙ«Ñ Ò ¿ delete l_huffman_node; delete r_huffman_node; heap.insert(huffman_node); } // Al salir del while, queda en el heap un solo nodo que contiene // la ra´z del arbol de prefijos ı ´ Huffman_Node * huffman_root = static_cast <Huffman_Node *> (heap.getMin()); root = huffman_root->bin_node; delete huffman_root; build_encoding_map(); // construir mapeo de c´digos o return root; } Í× × BinNode ¾ ¼ º 10 10 17 4 6 7 10 15 16 4 6 7 10 15 16 4 6 7 10 15 16 i c b e a =⇒ i c b e a =⇒ i c b e a 58 25 25 33 25 33 10 15 16 17 10 15 16 17 10 15 16 17 a a a 4 6 7 10 4 6 7 10 4 6 7 10 =⇒ i b b e =⇒ i b b e =⇒ i b b e ÙÖ º ¾ ÓÒרÖÙ ÓÒ ÙÒ Ö ÓÐ ÀÙ«Ñ Òº Ä × Ö × ÐÓ× ×Ù ¹ Ö ÓÐ × × Ò Ù ÒØÖ Ò Ò Ð Ôº ÍÒ Ú Þ ÕÙ × Ò Ö Ð Ö ÓÐ ÀÙ«Ñ Ò¸ ÑÓ׸ ØÓ× Ó ¬ Ö¸ ¹ ÒÖÖ Ð ÑÔÓ × Ñ ÓÐÓ× Ó Ó× ÔÖ ¬ Ó׺ ר Ø Ö Ð Ö Ð Þ Ð ÔÖ Ñ Ø Ú build prefix encoding()¸ Ð Ù Ð × ÒרÖÙÑ ÒØ Ð × Ù ÒØ ÓÖÑ ¿ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Ó ¬ ÓÖ ¿ +≡ ´¿ µ ¿ ¿¼ void build_prefix_encoding(BinNode<string> * root, BitArray & array, const size_t & len) { if (is_leaf(root)) { string & str = root->get_key(); code_map.insert(str, BitArray(array, len)); return; } array[len] = 0; // ir hacia la izquierda
  • 396.
    370 Cap´ ´ ıtulo 4. Arboles build_prefix_encoding(LLINK(root), array, len + 1); array[len] = 1; // ir hacia la derecha build_prefix_encoding(RLINK(root), array, len + 1); } Í× × BinNode ¾ ¼ Ò BitArray ¿ º Ä ÖÙØ Ò × ÓÖÖ ×ÔÓÒ ÓÒ ÙÒ Ö ÓÖÖ Ó ÔÖ ¬ Ó¸ Ö ÙÖ× ÚÓ¸ Ð Ö ÓÐ ÀÙ«Ñ Ò ÓÒ Ö Þ rootº Ñ ÕÙ × Ú Ö ÓÖÖ Ò Ó¸ Ð ÔÖ ¬ Ó root¾ × Ú Ñ ÒØ Ò Ò Ó Ò Ð ÖÖ ÐÓ Ø× array Ý ×Ù ÐÓÒ ØÙ × Ñ ÒØ Ò Ò Ð Ô Ö Ñ ØÖÓ lenº Ù Ò Ó × Ð ÒÞ ÙÒ Ó ¸ × Ö¸ Ù Ò Ó Ý Ø Ò ÑÓ× Ð ÔÖ ¬ Ó ÓÑÔÐ ØÓ Ð × Ñ ÓÐÓ¸ Ò× ÖØ ÑÓ× Ò Ð Ñ Ô Ó code map Ð ÙÔÐ <× Ñ ÓÐÓ¸ array>º build prefix encoding() × Ø Ú ÔÓÖ Ð × Ù ÒØ ÔÖ Ñ Ø Ú ¿¼ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Ó ¬ ÓÖ ¿ +≡ ´¿ µ ¿ ¿ ½ void build_encoding_map() { const size_t h = computeHeightRec(root); BitArray array(h * symbol_map.size()); symbol_map.empty(); build_prefix_encoding(root, array, 0); } Í× × BitArray ¿ Ò computeHeightRec ¾ º Ð ÓÖ Ò Ñ Ò ÔÙÐ ÓÒ Ð Ð × Huffman Encoder Engine × ÓÑÓ × Ù ½º ¬Ò Ö × Ñ ÓÐÓ× ÓÒ ×Ù× Ö Ù Ò ×º ¾º Ò Ö Ö Ö ÓÐ ÔÖ ¬ Ó׺ ¿º Ó ¬ Ö Ø ÜØÓ׺ Ò ×Ø × ÓÒ ÑÓ× Ö Ð Þ Ó Ð × ÙÒ × º Ä ÔÖ Ñ Ö × Ö ÜÔÐ Ò Ð × Ù ÒØ ×Ù ¹× ÓÒ¸ Ñ ÒØÖ × ÕÙ Ð Ø Ö Ö × Ö ÜÔÐ Ò Ü º½¿º º 4.13.4 Definici´n de s´ o ımbolos y frecuencias ÒØ × ÓÒרÖÙ Ö Ð Ö ÓÐ ÔÖ ¬ Ó× × ÙÒ Ð Ð ÓÖ ØÑÓ ÒØ Ö ÓÖ¸ ÑÓ× Ò Ö ÐÓ× × Ñ ÓÐÓ× Ý ×Ù× Ö ×Ô Ø Ú × Ö Ù Ò ×º À Ý Ó× Ñ Ò Ö × ÖÐÓº Ä ÔÖ Ñ Ö ÓÒ× ×Ø Ò ×Ô ¬ Ö Ö Ø Ñ ÒØ Ð × Ñ ÓÐÓ Ý ×Ù ÓÖÖ ×ÔÓÒ ÒØ Ö Ù Ò ¸ ÐÓ Ù Ð × Ñ ÒØ set freq(str, freq) ÓÒ str × Ð × Ñ ÓÐÓ ¬Ò Ö Ý freq ×Ù Ö Ù Ò ×Ó º Ð Ñ ØÓ Ó Ò Ù ×Ø ÓÒ × ×Ô ¬ ÓÑÓ × Ù ¿¼ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ó ¬ ÓÖ ¿ +≡ ´¿ µ ¿ ¿¼ void set_freq(const string & str, const size_t & freq) Ä ÓØÖ ÓÖÑ Ò Ö Ö Ù Ò × × Ô ÖØ Ö ÙÒ Ø ÜØÓ¸ ÒØ ¬ Ö ×Ù× × Ñ ÓÐÓ× Ý ÓÒØ Ð Þ Ö ×Ù× Ö Ù Ò × Ô Ö ÓÒº ×ØÓ × Ñ ÒØ read input(input)¸ ÓÒ input × Ð Ø ÜØÓ Ô ÖØ Ö Ð Ù Ð × × ÓÒØ Ð Þ Ö Ð × Ö Ù Ò × ¿¼ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ó ¬ ÓÖ ¿ +≡ ´¿ µ ¿ ¼ ¿ ½ void read_input(char * input ) ¾ Î Ð Ð Ô Ò Ö ÓÖ Ö ÕÙ ×Ø ÔÖ ¬ Ó × ÙÒ Ô Ð Ö ´Ú × Ü º º¼º ´Ô Ò ¿¾ µµº
  • 397.
    4.13. C´digos deHuffman o 371 read input() ×Ù Ý ×Ó Ö Ð ÖÙØ Ò update freq(curr token)¸ Ð Ù Ð × Ö Ñ Ø Ù× Ö curr token Ò Ð Ñ Ô Ó × Ñ ÓÐÓ׸ Ö Ö ÙÒ ÒÙ Ú ÒØÖ × ÒÓ ×Ø Ñ Ô Ó¸ Ò Ö Ñ ÒØ Ö Ò ÙÒÓ Ð Ö Ù Ò Ý ØÙ Ð Þ Ö Ð Ô ¿½ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Ó ¬ ÓÖ ¿ +≡ ´¿ µ ¿ ¼ ¿ ¾ void update_freq(const string & str) { Huffman_Node * huffman_node = NULL; Huffman_Node ** huffman_node_ptr = symbol_map.test(str); if (huffman_node_ptr == NULL) // ¿Fue definido previamente el s´mbolo? ı { // No ==> crear una entrada en symbol_map e insertarlo en heap auto_ptr<BinNode<string> > bin_node_auto ( new BinNode<string> (str) ); huffman_node = static_cast<Huffman_Node*> (heap.insert(new Huffman_Node(bin_node_auto.get()))); symbol_map.insert(str, huffman_node); bin_node_auto.release(); } else huffman_node = *huffman_node_ptr; // Ya definido, recuperarlo increase_freq(huffman_node); heap.update(huffman_node); } Í× × BinNode ¾ ¼ º ÈÙ ×ØÓ ÕÙ Ð ¬Ò ÐÓ× Ñ ØÓ Ó× read input() × Ñ Ö Ö Ð × Ö Ù Ò × Ý ÓÒרÖÙ Ö Ð ÒØÖ ¸ רÓ× ÙÐÑ Ò Ò ÓÒ Ð Ò Ö ÓÒ Ð Ö ÓÐ Ó Ó× ¿½ Ò Ö Ö Ö ÓÐ ¿ ½ ≡ set_end_of_stream(""); generate_huffman_tree(with_freqs); 4.13.5 Codificaci´n de texto o ÍÒ Ú Þ ÓÒרÖÙ Ó ÙÒ Ö ÓÐ ÀÙ«Ñ Ò¸ ÔÓ ÑÓ× Ó ¬ Ö Ð Ø ÜØÓ Ñ ÒØ Ù ÐÕÙ Ö ÐÓ× Ñ ØÓ Ó× encode(input, bit stream)º input × Ð Ø ÜØÓ Ó ¬ Ö Ý bit stream × ÙÒ BitArray Ð Ø ÔÓ ¬Ò Ó Ò Ü ¾º½º¿ ´Ô Ò ¿ µ ¿½ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Ó ¬ ÓÖ ¿ +≡ ´¿ µ ¿ ¼ size_t encode(char * input, BitArray & bit_stream) { char * curr_stream = input; char curr_token[Max_Token_Size]; curr_token[1] = ’0’; size_t bit_stream_len = 0; while (*curr_stream != ’0’) { curr_token[0] = *curr_stream++; append_code(bit_stream, bit_stream_len, code_map[curr_token]); } append_code(bit_stream, bit_stream_len, code_map[""]); return bit_stream_len; } Í× × BitArray ¿ º
  • 398.
    372 Cap´ ´ ıtulo 4. Arboles Ð × ÙÒ Ó Ô Ö Ñ ØÖÓ encode() × Ð ÖÖ ÐÓ Ø× ÕÙ ÓÒØ Ò Ð Ø ÜØÓ Ó ¬ Óº Ð ÔÖÓ ×Ó¸ ÙÒ Ú Þ Ò Ö Ó Ð Ñ Ô Ó ÓÒ ÐÓ× ÔÖ ¬ Ó׸ × ÑÙÝ × Ò ÐÐÓ Ù× Ö Ð × Ñ ÓÐÓ Ð Ó Ò Ð Ñ Ô Ó Ý ÓÒ Ø Ò Ö Ð ÖÖ ÐÓ Ø× Ð ÔÖ ¬ Óº Ì Ð Ø Ö Ð Ö Ð Þ Ð ÔÖ Ñ Ø Ú ÔÖ Ú append code()¸ Ð Ù Ð × ÒרÖÙÑ ÒØ Ð × Ù ÒØ ÑÓ Ó ¿¾ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Ó ¬ ÓÖ ¿ +≡ ´¿ µ ¿ ½ static void append_code(BitArray & bit_stream, size_t & bit_stream_len, const BitArray & symbol_code) { const size_t symbol_code_size = symbol_code.size(); if (bit_stream_len + symbol_code_size > bit_stream.size()) bit_stream.resize(5 * (bit_stream_len + symbol_code_size) / 4); for (int i = 0; i < symbol_code_size; i++) bit_stream[bit_stream_len++] = symbol_code[i]; } Í× × BitArray ¿ º Ð × Ù ÒØ Ø ÜØÓ ÅÙ ÖØ ÒØÓÒ ØÓ Ð Ñ ÓÖ Ó Å × Ù ØÖÓ ÔÖ ÑÓ× À Ö × Ö Ó Ö ÄÓÖ Ó× Ò Ñ º ÄÓ ÕÙ Ò ÓØÖÓ× ÒÓ ÒÚ Ò¸ Ý ÐÓ ÒÚ Ò ÒѺ ÎÓ × ÑÙ ÖØ ×ÓÒ ÖÓÒ Ô ØÓ× ÓÐÓÖ ÓÖ ÒØÓ¸ Ö Ð Ù ÐÕÙ Ú Öº Ñ ÐÐÓÒ × Ñ Ö¬Ð¸ ÎÓ × ÒØ Ù × ÕÙ Ö Ò Ý ×Ø ÙØ × Ñ × Ó ÚÓÞ Ð Ú Ð Ú ÖÓÒ Ðº ÓÒ ØÙÒ Ý ÞÑ Òº Ä × Ð ÚÓ ×Ó Ö Ð × ÓØ × Ý ÒØÓÒ ØÓ Ð Ñ ÓÖ Ó¸ ÑÓÖ × Ó× Ðº ÒÓ ÙÒ ÑÔ Ö ØÖ Þ Ò Ð ÐÙ × ÐØÓ× Ù Ö Ø Ð ÎÖ Ò ÓÒ Ó× Ð Òº ÔÓÖÕÙ Ø Ú × ÑÓÖ Öº ÒÓ ÓÒ × Ò Ö Ò Ñ Ý Ö Ó Ö ¸ ×Ù ÓÖ Ø ÖÑ × ¸ ÐÐ Ñ Ð Ù Ö ÚÐ Ô ÖÓ Ö Ò Ù ØÖÓ ÔÙÒ Ð × Ñ Ø ÐÐ × ÕÙ Ö Ó Ý ØÙÚÓ ÕÙ ×Ù ÙÑ Öº ÓÑÓ Ò Ñ Þº Ù Ò Ó Ð × ×ØÖ ÐÐ × Ð Ú Ò Ö ÓÒ × Ð Ù Ö ×¸ Ù Ò Ó ÐÓ× Ö Ð × ×Ù Ò Ò ÌÖ × ÓÐÔ × × Ò Ö ØÙÚÓ Ú ÖÓÒ × Ð Ð¸ Ý × ÑÙÖ Ó Ô Ö¬Ðº ÚÓ × ÑÙ ÖØ ×ÓÒ ÖÓÒ Î Ú ÑÓÒ ÕÙ ÒÙÒ Ö Ð Ù ÐÕÙ Ú Öº × ÚÓÐÚ Ö Ö Ô Ø Öº ÍÒ Ò Ð Ñ Ö Ó×Ó ÔÓÒ ×Ù Þ Ò ÙÒ Ó Òº ÒØÓÒ Ó ÌÓÖÖ × À Ö ¸ ÇØÖÓ× ÖÙ ÓÖ Ò× Ó¸ Ñ ÓÖ Ó ÙÖ Ö Ò¸ Ò Ò ÖÓÒ ÙÒ Ò Ðº ÑÓÖ ÒÓ Ú Ö ÐÙÒ ¸ Ù Ò Ó ÐÓ× Ù ØÖÓ ÔÖ ÑÓ× ÚÓÞ Ð Ú Ð Ú ÖÓÒ Ð ÐÐ Ò Ò Ñ ¸ ÕÙ Ò Ø ÕÙ Ø Ó Ð Ú ÚÓ × ÑÙ ÖØ × ÖÓÒ Ö Ð Ù ÐÕÙ Ú Ö Ö Ð Ù ÐÕÙ Ú Öº Ö ÕÙ Ö 10368 ÝØ × Ò Ë ÁÁ Ý Ò Ö Ð × Ù ÒØ Ö ÓÐ ÀÙ«Ñ Ò 1296 511 785 243 268 356 429 119 124 125 143 175 181 206 223 e a 60 65 66 77 87 94 101 105 110 113 n r o 29 31 33 33 45 49 49 52 52 53 55 55 56 57 m t u d c l s i n 15 16 16 17 22 23 24 25 26 27 b . v 8 8 8 9 11 11 11 12 12 12 12 13 13 14 j g p q ´ı , 4 4 4 4 4 5 5 6 6 6 6 6 6 7 7 7 V C h z A n ~ y G 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 4 Y e ´ F ! T M ´o B E f L 1 1 1 1 1 1 1 2 2 2 ? U : D ¿ Z H ¡ ´a 0 1 ¬ O
  • 399.
    4.13. C´digos deHuffman o 373 Ð Ù Ð ÐÓ ÓÑÔÖ Ñ 5932 ÝØ ׺ 4.13.6 Optimaci´n de Huffman o Ë ÙÒ ºÊº º º¸ ÓÔØ Ñ ÓÒ × Ò ¬ ÓÒ Ý ØÓ ÓÔØ Ñ Ö º Ð Ú Ö Ó ÓÔØ ¹ Ñ Ö ¹Ù ÓÔØ Ñ Þ Ö ¹ ÓÒÒÓØ ¸ ºÊº º º Ü Ø¸ Ù× Ö Ð Ñ ÓÖ Ñ Ò Ö Ö Ð Þ Ö ÙÒ ØÚ º ÓÖ Ò¸ Ò Ð ×ØÖ ØÓ × ÒØ Ó ÙÒ Ú Ö× Ð ¸ Ü ×Ø ÙÒ Ñ ÓÖ Ñ Ò Ö Ö Ð Þ Ö ÙÒ Ø Ú º Ê ×ÔÓÒ Ö ¬ÖÑ Ø Ú Ñ ÒØ Ý Ö Ù ÒØ ×Ó Ö Ð ×ÙÔÙ ×Ø Ñ ÓÖ Ñ Ò Ö × ÑÙÝ Ð Óº Ë Ô Ö ÙÒ ÖØÓ ×ÙÒØÓ ×ÙÑ ÑÓ× Ý ÑÓ×ØÖ ÑÓ× ÙÒ ÓÔØ ¹ Ñ ÓÒ¸ ÒØÓÒ ×¸ Ò Ð ×ÙÒØÓ Ò Ù ×Ø ÓÒ¸ Ñ × Ö Ö × Ö ÑÓ× Ñ ÓÖ ÖÐÓ Ô Ö ÕÙ × Ð ÓÔØ ÑÓ Ý × Ð Ñ ÓÖ º ÄÓ ÕÙ × Ñ ÓÖ × Ö Ð Ø ÚÓ Ð × Ö ÙÒר Ò ×¸ Ý ×Ø × Ø Ò Ò Ð ÑÓÑ ÒØÓ¸ Ð ÐÙ Ö¸ Ô ÖÓ¸ ×Ó Ö ØÓ Ó¸ ÕÙ Ò ×º ×ÙÑ Ö ÓÔØ Ñ ÓÒ × Ò ÓÒ× Ö ÓÒ Ö ÙÒר Ò Ð ÓÒÐÐ Ú Ô Ð ÖÓ Ô Ö Ð × Ô ÖØ × Ð ÓÒØ ÜØÓ ÕÙ ÒÓ Ù ÖÓÒ ×ÓÔ × ×º ÉÙ Þ ÙÒ Ù ÖØ Ú Ò ÙÐØÙÖ Ð Ð × Ò ÕÙ Ñ ÒÙ Ó ÓÒÐÐ Ú ÙÒ ÓÔØ ¹ Ñ ÓÒ × Ò Ù ÒØÖ Ò ×Ù Ö Þ Ø ÑÓÐÓ º Ò Ð Ø Ò ÓÔØ ÑÓ× ÓÒÒÓØ Ö ×¹ ØÓ Ö Ø Ó ¸ Ô ÖØ Ò ÒØ ÐÓ× ÓÔØ Ñ Ø × ¸ ÕÙ Ò × Ö Ò ÐÓ× Ñ Ñ ÖÓ× Ð × Ò Ó ÖÓ¹ Ñ ÒÓ¸ ÐÓ× ÔÖ ÙÖ×ÓÖ × ÐÓ× ÓÐ Ö × ÒÙ ×ØÖ ÔÓ º Ì Ð Ô Ö ÕÙ Ò Ð ÒØ Ù ÊÓÑ ÐÓ× ÕÙ ÓÞ Ò ÔÐ ÒÓ× Ö Ó׸ ÕÙ Ò × Ø Ò Ñ ÝÓÖ Ô Ð ÓÒ¸ Ó × ¸ optaban ´ ÓÔØ ØÙ× µ¸ Ö Ò ÐÓ× ÒÓ Ð ×º Ê Ð Þ Ð Ð Ö ØÓÖ ÒØ Ö ÓÖ¸ ÔÓ ÑÓ× ÔÖ ÙÒØ ÖÒÓ× × ÙÒ Ö ÓÐ ÀÙ«Ñ Ò ÓÔØ ÑÓ È Ö ÓÒ ÖÓÒØ Ö Ð ÔÖ ÙÒØ ¸ ÑÓ× ÔÐ ÒØ ÖÒÓ× ÙÒ Ö Ø Ö Ó ÕÙ ÒÓ× ÔÓÒ Ö Ð Óר ÙÒ × Ñ ÓÐÓ Ò ÙÒ ÓÒ ×Ù Ö Ù Ò Ô Ö ÓÒ Ý ÕÙ ÒÓ× ÓÒ ÙÞ ÙÒ ÓÖÑ Ò Ö Ð Ý ÙÒ × Ù Ö Ö Ð Ñ ÓÖ Ö ÓÐ Ó Ó׺ Definici´n 4.12 (Longitud ponderada del camino) Ë ÙÒ Ö o ÓÐ Ò Ö Ó T Ò Ð Ù Ð Ó ne ∈ T × Ð × Ò ÙÒ Óר Ó ÔÓÒ Ö ÓÒ w(ne)º ÒØÓÒ ×¸ Ð ÐÓÒ ØÙ ÔÓÒ Ö Ð Ñ ÒÓ¸ ÒÓØ ÓÑÓ ÛÔÐ(T )¸ × ¬Ò ÓÑÓ ÛÔÐ(T ) = Ò Ú Ð(ne) × w(ne) ´º µ ne × Ó È Ö Ð Ö ÓÐ Ð ¬ ÙÖ º ¿¹ Ø Ò ÑÓ× ÛÔÐ(T ) = 2 × (7 + 6) + 3 × (15 + 16 + 10 + 4) = 161 Ù ÒØÓ Ñ ÒÓÖ ÐØÙÖ Ø Ò ÙÒ Ó ¸ Ñ ÒÓÖ × ×Ù Ò Ò ×Ó Ö Ð ÛÔк Ä × ÓÒרÖÙ Ö ÙÒ Ö ÓÐ Ó Ó× ÙÝÓ ÛÔÐ(T ) × Ñ Ò ÑÓ ×Ø × Ð Ö Ø Ö Ó ÓÔØ Ñ ÓÒº Ì Ð Ö ÓÐ × ÒÓÑ Ò ÀÙ«Ñ Ò ¸ Ò ÓÒÓÖ ×Ù × Ù Ö ÓÖ¸ ÕÙ Ò × Ù Ö Ó Ð × Ù ÒØ ÔÖÓÔÓ× ÓÒ Proposici´n 4.13 (Optimaci´n de Huffman - Huffman [8] 1951) Ë N = {n1, n2, . . . , nn} o o ÙÒ ÓÒ ÙÒØÓ ÒÓ Ó× ÓÒ Ô ×Ó× w(n1), w(n2), . . . , w(nn)º Ë T ÙÒ Ö ÓÐ ÔÖ ¬ Ó ÓÒ¹ רÖÙ Ó × ÙÒ Ð Ð ÓÖ ØÑÓ ÀÙ«Ñ Ò ´Ü º½¿º¿ ´Ô Ò ¿ µµº ÒØÓÒ ×¸ ∀T = T =⇒ ÛÔÐ(T ) ≤ ÛÔÐ(T )º ÄÓ ÒØ Ö ÓÖ ÕÙ Ú Ð Ö ÕÙ Ð Ö ÓÐ ÔÖ ¬ Ó× T × Ñ Ò ÑÓ × ÙÒ ×Ù ÐÓÒ ØÙ ÔÓÒ Ö Ð Ñ ÒÓº
  • 400.
    374 Cap´ ´ ıtulo 4. Arboles 13 7 6 b c 15 16 10 4 15 16 10 4 a e i a e i =⇒ ´ µ Ö ÓÐ Ó Ó× ÒØ Ö ÓÖ ´ µ ÒØ Ö ÓÖ × Ò Ó × Ý ÙÖ º ¿ Ö ÓÐ × ÔÖ ¬ Ó× ÑÔÐÓ Demostraci´n o Ä ÔÖÙ × ÓÒרÖÙ Ö ÔÓÖ Ò Ù ÓÒ ×Ó Ö Ð Ö ÒÐ T Ý× ÚÐ Ö Ð × Ù ÒØ Ð Ñ Lema 4.5 Ë T ÙÒ Ö ÓÐ ÓÒ Ô ×Ó× Ò ×Ù× Ó ×º Ë Ò n1 Ý n2 Ð × Ó× Ó × T ÓÒ Ô ×Ó Ñ Ò ÑÓº ÓÒ× Ö ÑÓ× ÙÒ Ö ÓÐ T Ø Ð ÕÙ ×Ø ÓÒØ Ò Ð × Ñ ×Ñ × Ó × ÕÙ T Ü ÔØÓ ÕÙ Ð × Ó × n1 Ý n2 × ×Ù ×Ø ØÙÝ Ò ÔÓÖ ÙÒ Ó n+ ÓÒ w(n+) = w(n1) + w(n2)º ÒØÓÒ ×¸ × ÔÓ× Ð ÓÒרÖÙ Ö ÙÒ Ö ÓÐ T Ø Ð ÕÙ ¾ ÛÔÐ(T ) ≤ ÛÔÐ(T ) − w(n+) ´º µ ÈÓÖ ÑÔÐÓ¸ Ð ¬ ÙÖ º ¿¹ ÐÙ×ØÖ ÙÒ T ÔÓ× Ð Ò Ð Ù Ð × Ð ×ÙÔÖ Ñ Ò Ð × Ó × b Ý cº Ò ×Ø ×Ó¸ wpl(T ) = 13 + 3 × (15 + 16 + 10 + 4) = 148 Demostraci´n À Ý ØÖ × ÔÓ× Ð × × ØÙ ÓÒ × o ÓÒ× Ö Ö Ô Ö n1, n2 ∈ T ½º n1 Ý n2 ×ÓÒ ÖÑ ÒÓ× Ò ×Ø ×Ó¸ ÐÓ× ×ÙÔÖ Ñ ÑÓ× Ý ÓÐÓ ÑÓ× Ò ×Ù Ô Ö n3¸ ÕÙ Ú Ò Ò Ó ¸ w(n3) = w(n1) + w(n2)º Ò ×Ø Ö Óи n3 ר Ò ÙÒ Ò Ú Ð Ò Ö ÓÖ i − 1¸ ÔÓÖ ÐÓ ÕÙ ÛÔÐ(T ) = ÛÔÐ(T ) − i×(w(n1)+w(n2)) + (i−1)×(w(n1)+w(n2)) = ÛÔÐ(T )−(w(n1) + w(n2)) w(n3 ) Ð Ù Ð ¬ Ö Ü Ø Ñ ÒØ ÛÔÐ(T ) Ò w(n3)º ¾º n1 Ý n2 ר Ò Ò Ð Ñ ×ÑÓ Ò Ú Ð ×ÙÑ ÑÓ× s1 ÓÑÓ Ð ÖÑ ÒÓ n1 ´ Ð ×Ó × × Ñ ØÖ Ó ÓÒ n2µº ÒØÓÒ ×¸ ÔÓ ÑÓ× ÒØ Ö Ñ Ö s1 ÓÒ n2 Ý × Ô Ö Ö Ò Ð ×Ó ÒØ Ö ÓÖº ¿º n1 Ý n2 ר Ò Ò Ò Ú Ð × ×Ø ÒØÓ× Ð Ù Ð ÕÙ Ò Ð ÔÙÒØÓ ÒØ Ö ÓÖ¸ ×ÙÑ ÑÓ× s1 ÓÑÓ Ð ÖÑ ÒÓ n1º Ð Ñ ×ÑÓ ÑÓ Ó¸ ×ÙÑ ÑÓ× ÕÙ Ò Ú Ð(n1) > Ò Ú Ð(n2)º ÈÓ ÑÓ× Ô ØÓÖ Þ Ö ×Ø × ØÙ ÓÒ Ð × Ù ÒØ ÑÓ Ó ¾ × × Ò Ð ×Ø Ò Ù Ö Ð ÓÒ ÓÒ ÔÓ× Ð Ò Ð ÒÙÒ Ó Ð Ð Ñ × Ö¸ ÔÙ Ò ÓÒØÖ Ö× ÙÒ ×ÔÓ× ÓÒ ØÓÔÓÐÓ ÓÒ ÐÓ× ÒÓ Ó× Ö ×Ø ÒØ × ÕÙ × Ø × Ð × ÙÐ º
  • 401.
    4.13. C´digos deHuffman o 375 n2 s1 p p s1 n1 n2 n1 ÒØ Ö Ñ ÑÓ× =⇒ n2 ÓÒ s 1 ÓÒ× Ö ÑÓ× Ð Ò Ò ÕÙ Ø Ò Ð ×Ù Ö ÓÐ s1 ×Ó Ö ÛÔÐ(T )¸ Ð Ù Ð ÔÙ ÜÔÖ × Ö× × σ(s1) = w(nx) × Ò Ú Ð (nx) ∀nx ∈ Ó (s1 ) Ù Ò Ó Ö Ð Þ ÑÓ× Ð ÒØ Ö Ñ Ó ÒØÖ s1 Ý n2¸ Ð Ú ÐÓÖ σ(s1) ×Ñ ÒÙÝ σ(s1)¸ ÔÙ × Ò Ú Ð(s1) = Ò Ú Ð(n1) Ò T º ÈÓÖ Ø ÒØÓ ÛÔÐ(T ) = ÛÔÐ(T ) + Ò Ú Ð(n1) × w(n2) − σ(s1) + σ(s1) ≤ ÛÔÐ(T ) Ð ×Ó Ò ÕÙ ×ÓÒ Ù Ð × × Ù Ò Ó s1 × ÙÒ Ó º ÓÖ ¸ Ù Ò Ó ØÙ ÑÓ× Ð Ù× ÓÒ n1 Ý n2 Ò n+¸ Ö Ö × ÑÓ× Ð × ØÙ ÓÒ Ð ÔÖ Ñ Ö ×Ó ÛÔÐ(T ) = ÛÔÐ(T )+(Ò Ú Ð(n1)−1)×(w(n1)+w(s))−σ(s1)+σ(s1 ) ≤ ÛÔÐ(T )−w(n+) Ð ×Ó Ù Ò Ó Ò Ú Ð(n1) < Ò Ú Ð(n2) × × Ñ ØÖ Ó ×Ø Ð Ñ × Ð ÙÒ Ñ ÒØÓ ÑÓ×ØÖ Ø ÚÓ ÕÙ ÒÓ× Ô ÖÑ Ø Ö Ú Ò Ö ÕÙ Ô Ö Ù ÐÕÙ Ö Ö ÓÐ T ≤ T =⇒ ÛÔÐ(T ) ≤ ÛÔÐ(T )º Ê ØÓÑ ÑÓ× Ð ÑÓ×ØÖ ÓÒ Ð ÔÖÓÔÓ× ÓÒ Ý ÔÐ ÒØ ÑÓ× Ò Ù ÓÒ ×Ó Ö Ð Ö ¹ ÒÐ Ð Ö ÓÐ ÀÙ«Ñ Ò T ½º È Ö |T | ≤ 2 Ð Ö ×ÙÐØ Ó × Ö ØÓº ¾º ÓÖ ×ÙÑ ÑÓ× ÕÙ Ð ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö ØÓ Ó Ö ÓÐ ÀÙ«Ñ Ò Ý Ú Ö ¹ ¬ÕÙ ÑÓ× ×Ù Ú Ö Ô Ö Tn+1 × Ö ∀Tn+1 = Tn+1 =⇒ ÛÔÐ(Tn+1) < ÛÔÐ(Tn+1)º Ë Ò n1 Ý n2 Ð × Ó× ÔÖ Ñ Ö × Ó × ÕÙ × Ð ÓÒ Ð Ð ÓÖ ØÑÓ ÀÙ«Ñ Òº ÓÖ ÓÒ× Ö ÑÓ× ÔÐ Ö Ð Ð Ñ º Tn+1 Ý Tn+1 ÓÒ ÐÓ× ÒÓ Ó× n1 Ý n2 Ý ÔÖÓ Ù Ö Ó× Ö ÓÐ × Tn Ý Tnº ÈÙ ×ØÓ ÕÙ n1 Ý n2 ×ÓÒ ÐÓ× ÒÓ Ó× ÓÒ Ñ ÒÓ× Ô ×Ó¸ רÓ× ×ÓÒ ÖÑ ÒÓ× Ò Ð Ö ÓÐ ÀÙ«Ñ Òº ÈÓÖ Ø ÒØÓ ÛÔÐ(Tn) = ÛÔÐ(Tn+1) − w(n1) − w(n2)¾ º ¾ ×ØÓ × Ú Ò Ó Ò Ð ÔÖ Ñ Ö Ô ÖØ Ð ÑÓ×ØÖ ÓÒ ÐÐ Ñ º º
  • 402.
    376 Cap´ ´ ıtulo 4. Arboles È Ö Ð Ö ÓÐ Tn × ÑÓ׸ × ÙÒ Ð Ð Ñ º ¸ ÕÙ ÛÔÐ(Tn) ≤ ÛÔÐ(Tn+1) − (w(n1) + w(n2))º ÓÖ Ò¸ ÙÒÕÙ ÕÙ Þ Ô Ö Þ Ó Ú Ó¸ |Tn| = |Tn| < |Tn+1| = |Tn+1|º ÈÓÖ Ø ÒØÓ¸ ÔÓ ÑÓ× ÔÐ Ö Ð ÔÓØ × × Ò Ù Ø Ú Ô Ö ÓÒ ÐÙ Ö ÕÙ ÛÔÐ(Tn) ≤ ÛÔÐ(Tn) 4.13.6.1 Conclusi´n o Ê Ô ØÙÐ ÑÓ× Ð Ù×Ó Ð Ð ÓÖ ØÑÓ ÀÙ«Ñ Ò Ñ ÒØ Ð Ó× Ð × × ÕÙ ÑÓ× ÔÖ × ÒØ Öº Ð ÒØ Ó ¬ ÓÖ × Ú Ð ÙÒ Òר Ò Huffman Encoder Engine¸ Ñ Ò¹ ØÖ × ÕÙ Ð Ó ¬ ÓÖ ×Ù ÓÒØÖ Ô ÖØ Huffman Decoder Engineº Ç Ú Ñ ÒØ ¸ Ñ × Òר Ò × Ò ÔÓÒ Ö× Ù Ö Ó Ò Ù× Ö Ð Ñ ×ÑÓ Ö ÓÐ ÀÙ«Ñ Òº Ë Ò Ñ¹ Ö Ó¸ ÕÙ Ô Ö ÙÒ Ø ÐÐ ÒØ Ö × ÒØ Ô Ö Ó ¬ Ö Ó Ó ¬ Ö Ð Ø ÜØÓ ÒÓ ÐØ Ð Ö ÓÐ ÀÙ«Ñ Òº ×ØÓ × Ú ÒØ Ò Ð Ó ¬ ÓÖ¸ Ô٠׸ ר × Ö Ñ Ø Ð Ö ÐÓ× × Ñ ÓÐÓ× Ð Ø ÜØÓ Ý¸ ØÖ Ú × Ð Ñ Ô Ó Ó Ó׸ Ñ Ø Ö ÐÓ× ÓÖÖ ×ÔÓÒ ÒØ × ÔÖ ¬ Ó׺ È ÖÓ¸ ÓÑÓ Ö Ð Ó ¬ ÓÖ Ä Ö ×ÔÙ ×Ø ר ÔÓÖ Ð Ø ÓÖ ÔÖ ¬ Ó× ÑÔ Ö¹ Ø Ò Ü º º¼º ´Ô Ò ¿¾½µº Ò ØÓ¸ ÙÒ Ø ÜØÓ Ó ¬ Ó × ÙÒ × Ù Ò ÔÐ Ö× ´Ü º º¼º ´Ô Ò ¿¾ µµ¸ Р٠и ÓÑÓ ÓÖÓÐ Ö Ó Ð ÔÖÓÔÓ× ÓÒ Ü º ´Ô Ò ¿¾¾µ¸ × ÔÖ ¬ Óº ×ØÓ ÑÔÐ ÕÙ ¸ ÙÒ × Ù Ò ÔÖ ¬ Ó׸ ÔÓ ÑÓ× Ö ÓÒÓ ÖÐÓ× ÒØÖ × º Ä Ø Ò Ò Ù ×Ø ÓÒ × Ð Ö Óº 4.14 ´ Arboles est´ticos optimos a ´ ÄÓ× Ö ÓÐ × Ò Ö Ó× ×ÓÒ × Ò Ó× Ô Ö ÑÙÐ Ö Ð Ù×ÕÙ Ò Ö º ËÙ ÓÒ ÔÖ Ò Ô Ð × ÕÙ Ô ÖÑ Ø Ò Ò× Ö ÓÒ × Ý ×ÙÔÖ × ÓÒ × Ò O(Ð (n))º ÓÖ Ò¸ × Ð ÓÒ ÙÒØÓ Ð Ú × Ù × ×Ø Ø Ó × Ö¸ ÒÓ Ó ÙÖÖ Ò× Ö ÓÒ × Ò ×ÙÔÖ × ÓÒ ×¸ ׸ ÔÓÖ ÑÔÐÓ¸ ÙÒ Ö ÓÐ Ò Ö Ó ÐØÙÖ Ñ Ò Ñ ¬ ÒØ ÓÒ× Ö ÑÓ× ×ÔÓÒ Ö Ð × Ð Ú × Ò ÙÒ ÖÖ ÐÓ ÓÖ Ò Ó Ý ØÙ Ö Ð Ù×ÕÙ ÒÖ º ÓÒ ×Ø Ò ÓÕÙ ¸ Ø Ò ÑÓ× ÙÒ Ö ÓÐ ÐÓÒ ØÙ Ñ ÒÓ Ñ Ò ÑÓº Ñ ×¸ ÓÖÖ ÑÓ× ×Ô Ó¸ ÔÙ × ÒÓ Ö ÕÙ Ö ÑÓ× ÙØ Ð Þ Ö ÔÙÒØ ÖÓ׺ ÓÑÓ ÔÙÒØÓ ¬Ò и ÑÓ× Ö Ñ Ö Ö ÕÙ Ð ÖÖ ÐÓ ÔÖÓÚ ÐÓ× × Ð ÓÑÔÙØ ÓÖº Ä Ù×ÕÙ Ò Ö ×ÙÑ ÕÙ Ð Ö Ù Ò ×Ó × ÕÙ Ø Ø Ú Ô Ö ØÓ × Ð × Ð Ú × Ý ×ØÓ ÒÓ × ÖØÓ Ò Ð ÙÒÓ× ×Ó׺ Ð ÙÒ × Ð Ú × × Ò Ñ × ÕÙ ÓØÖ ×º À Ý × ØÙ ÓÒ × Ò ÕÙ Ð Ö Ù Ò ×Ø ר ×Ó ÔÙ ÓÒÓ Ö× ÒØ × ÓÒרÖÙ Ö Ð Ö Óк Ò ×ØÓ× ×Ó׸ ÙÒ Ö Ø Ö Ó ÓÔØ Ñ Ð ÓÒ× ×Ø Ò Ñ Ò Ñ Þ Ö Ð ÒØ ØÓØ Ð ×Ô Ö Ù×Õ٠׺ ÁÒØÙ Ø Ú Ñ ÒØ ¸ ר Ñ Ò Ñ Þ ÓÒ × ÐÓ Ö ÓÐÓ Ò Ó ÐÓ× ÒÓ Ó× ×Ó Ñ × Ö Ù ÒØ Ö ÒÓ× Ð Ö Þº Ð ÓÒ ÔØÓ ÕÙ ÒÓ× Ô ÖÑ Ø Ö Ò ÓÒØÖ Ö Ö ÓÐ × ÓÔØ ÑÓ× ×Ù Ý Ò Ð ¬Ò ÓÒ × Ù ÒØ Definici´n 4.13 (Longitud del camino interna ponderada) Ë o ÙÒ Ö ÓÐ T n ÒÓ Ó׺ Ë P = {pi | pi × Ð Ô ×Ó Ð ÒÓ Ó ni ∈ T | ∀i pi = 1}º ÒØÓÒ ×¸ Ð ÄÓÒ ¹ ØÙ Ð Ñ ÒÓ ÒØ ÖÒ ÔÓÒ Ö × ¬Ò ÓÑÓ n Ci(T ) = (Ò Ú Ð (ni) + 1)pi ´º µ i=1 n Ò Ú Ð(ni) pi + 1 i=1
  • 403.
    ´ 4.14. Arboles est´ticos´ptimos a o 377 z x x z y y y z x x z x z y y ´µ ´ µ ´µ ´µ ´µ ÙÖ º Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ ØÖ × ÒÓ Ó× Ó ÙÒ ÓÒ ÙÒØÓ n Ð Ú × ÓÒ ×Ù× ÔÖÓ Ð × ×Ó¸ Ð ÔÖÓ Ð Ñ ÓÒ× ×Ø Ò Ò ÓÒØÖ Ö ÙÒ Ö ÓÐ n ÒÓ Ó× ÙÝÓ Ci × Ñ Ò ÑÓº Ó ÓØÖÓ ÑÓ Ó¸ ٠и ÒØÖ ØÓ Ó× ÐÓ× ÔÓ× Ð × Ö ÓÐ × n Ð Ú ×¸ Ø Ò Ð Ci Ñ Ò ÑÓ ÓÑÓ ÑÔÐÓ¸ ÓÒ× Ö ÑÓ× Ð ÓÒ ÙÒØÓ ÒÓ Ó× {X, Y, Z} ÓÒ Ô ×Ó× {1/9, 3/9, 5/9}º Ë ÙÒ Ð ÔÖÓÔÓ× ÓÒ º½½ Ü ×Ø Ò 4 3 = 5 Ñ Ò Ö × ×ÔÓÒ Ö ØÖ × ÒÓ Ó× Ò ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ ¸ Ð × Ù Ð × × 1 6 ÐÙ×ØÖ Ò Ò Ð ¬ ÙÖ º º Ä × ÐÓÒ ØÙ × Ñ ÒÓ ÔÓÒ Ö × Ô Ö Ö ÓÐ ×ÓÒ (a) 1 3 5 14 Ci = 3 +2 + = 9 9 9 9 (b) 1 3 5 21 Ci = 1 +2 +3 = 9 9 9 9 (c) 1 3 5 15 Ci = 2 + +2 = 9 9 9 9 (d) 1 3 5 20 Ci = +3 +2 = 9 9 9 9 (e) 1 3 5 16 Ci = 2 +3 + = 9 9 9 9 ×ØÓ ÖÖÓ Ð Ö ÓÐ ´ µ ÓÑÓ Ð ÓÔØ ÑÓ Ö ×ÙÐØ Ó ×ÓÖÔÖ Ò ÒØ Ý Ö Ú Ð ÓÖ ÕÙ ÐÓ ÓÔØ ÑÓ ÒÓ Ò × Ö Ñ ÒØ × ÐÓ ØÖ ÓÒ ÐÑ ÒØ Ù ÒÓ¸ Ô٠׸ Ò ÒÙ ×ØÖÓ ÑÔÐÓ¸ Ð Ö ÓÐ ÓÔØ ÑÓ × Ð Ñ × × ÕÙ Ð Ö Ó × ÙÒ ÐÓ× Ö Ø Ö Ó× ØÖ ÓÒ Ð ×º Ð ÑÔÐÓ ÒØ Ö ÓÖ ÒÓ× ÙÒ Ö Ð × ÓÑÔÐ × Ò Ö ÒØ × ÙÒ Ð Ó¹ Ö ØÑÓº ÈÓ Ö ÑÓ× Ò Ö Ö ØÓ Ó× ÐÓ× Ö ÓÐ × Ù×ÕÙ ÔÓ× Ð × ÓÒ n Ð Ú × Ý ÒØÓÒ × Ñ Ö Ð × ÐÓÒ ØÙ × Ñ ÒÓ ÔÓÒ Ö × Ô Ö × Ð ÓÒ Ö Ð Ñ ÒÓÖº Ç Ú Ñ ÒØ ¸ ר Ø Ò × ÑÙÝ ÓרÓ× Ò Ø ÑÔÓ Ý ×Ô Óº Ð ÔÖ Ñ Ö Ô ×Ó Ð ÓÒ× Ù ÓÒ ÙÒ Ð ÓÖ ØÑÓ × ÔÖ Ò Ö ÕÙ × ÙÒ Ö ÓÐ × ÓÔØ ÑÓ¸ ÒØÓÒ × ×Ù× Ó× Ö Ñ × Ø Ñ Ò ÐÓ ×ÓÒº ÓÖÑ Ð Þ ÑÓ× ×Ø Ó Ò Ð × Ù ÒØ ÔÖÓÔÓ× ÓÒ Proposici´n 4.14 o Ë T ∈ B ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ ÓÔØ ÑÓº ÒØÓÒ ×¸ Ä(T ) Ý Ê(T ) ×ÓÒ ÓÔØ ÑÓ׺ Demostraci´n ´ÈÓÖ ÓÒØÖ o ÓÒµ Ë k1, k2, . . . , kl, . . . , kn Ð Ö ÓÖÖ Ó Ò¬ Ó ÙÒ T ∈ Ò Ö Ð n ÒÓ Ó× ÓÒ Ö Þ Ò Ð Ú klº ר ÑÓ Ó¸ L(T ) ÓÒØ Ò Ð × Ð Ú × {k1, k2, . . . , kl−1} Ý R(T ) Ð × Ð Ú × {kl+1, . . . , kn}º ÈÓ ÑÓ׸ ÒØÓÒ ×¸ × ÙÒ Ð
  • 404.
    378 Cap´ ´ ıtulo 4. Arboles ¬Ò ÓÒ º½¿¸ ÔÐ ÒØ Ö Ci Ò ÙÒ ÓÒ Ð Ö Þ kl¸ Ð × Ù ÒØ ÑÓ Ó¾ l−1 n Ci(T ) = pl + (Ò Ú Ð (ki) + 1)pi + (Ò Ú Ð (ki) + 1)pi i=1 i=l+1 l−1 n = pl + Ci(Ä(T )) + pi + Ci(Ê(T )) + pi i=1 i=l+1 n = pi + Ci(Ä(T )) + Ci(Ê(T )) ´º µ i=1 ËÙÔÓÒ ÑÓ× ÕÙ Ð Ö ÓÐ ÓÔØ ÑÓ ÓÒØ Ò ÙÒ L(T ) Ó R(T ) ÕÙ ÒÓ × ÓÔØ ÑÓº Ò ×Ø ×Ó¸ × ÙÒ ´ º µ¸ Ci(T ) ÙÑ ÒØ Ö Ú ÐÓÖ¸ ÐÓ ÕÙ ÓÒØÖ Ð ×ÙÔÓ× ÓÒ ÕÙ T × ÓÔØ ÑÓº Ä ÔÖÓÔÓ× ÓÒ ×¸ Ô٠׸ Ú Ö Ö 4.14.1 Objetivo del problema Ó ÙÒ ÖÖ ÐÓ ÓÖ Ò Ó K = [k1, k2, . . . , kn] n Ð Ú × Ý ÙÒ ÖÖ ÐÓ Ô Ö Ð ÐÓ P = [p1, p2, . . . , pn] ÔÖÓ Ð × ×Ó¸ Ð ÔÖÓ Ð Ñ ÓÒ× ×Ø ¸ Ö ÙÖ× Ú Ñ ÒØ Ð Ò Ó¸ Ò Ø ÖÑ Ò Ö Ù Ð Ð Ú kl¸ ÒØÖ Ð × n ÔÓ× Ð ×¸ ÓÐÓ Ö× ÓÑÓ Ö Þ Ð Ö ÓÐ ¬Ò Ð T º ÍÒ Ú Þ ÕÙ × Ö Ð ×Ø × Ð ÓÒ¸ Ð Ö ×ØÓ Ð × Ð Ú × ÕÙ Ö Ò Ò Ä(T ) Ý Ê(T ) ÕÙ ØÓØ ÐÑ ÒØ ¬Ò Ó¸ ÔÙ × ×Ø × Ò × Ø × Ö Ð ÔÖÓÔ ÓÖ Ò ÙÒ Ö ÓÐ Ò Ö Óº ÄÓ× ×Ù Ö ÓÐ × × ÓÒרÖÙ Ö Ò Ö ÙÖ× Ú Ñ ÒØ ÔÐ Ò Ó Ð Ñ ×ÑÓ ÔÖ Ò¹ Ô Ó ×Ó Ö [k1, k2, . . . , kl−1] Ý [p1, p2, . . . , pl−1] Ô Ö Ä(T ) Ý [kl+1, . . . , kn] Ý [pl+1, . . . , pn]¸ Ô Ö Ê(T )º ×ØÓ ÒÓ× ÓÒ Ù ÙÒ ¬Ò ÓÒ Ö ÙÖ× Ú Ð Ó×ØÓ × pi,j = j pl Ý Ci,j Ð l=i Ó×ØÓ ØÓØ Ð Ð Ö ÓÐ Ò Ö Ó ÓÔØ ÑÓ ÓÑÔÙ ×ØÓ ÔÓÖ Ð × Ð Ú × ÕÙ Ú Ò × ki ר kjº ÒØÓÒ × j Ci,j = Ñ Ò ´ º ¼µ 1 pi,l−1(1 + Ci,l−1) + pl + pl+1,j(1 + Cl−1,j) l=i pi,j Ö ÓÐ ÞÕÙ Ö Ó kl ÓÑÓ Ö Þ Ö ÓÐ Ö Ó Ð ÔÖÓ Ñ ÒØÓ × ÜÔÓÒ Ò Ð × ÐÓ ÔÐ ÑÓ× Ö Ø Ñ ÒØ º ÆÓ Ó ×Ø ÒØ ¸ ÐÓ× Ö ÓÐ × ÓÔØ ÑÓ× Ò × Ø × Ö Ð ÔÖÓÔ ÓÖ Ò Ý¸ Ò ×Ø × ÒØ Ó¸ Ü ×Ø Ò ÐÓ ×ÙÑÓ n(n+1) 2 Ö ÒØ × Ñ Ò Ö × ×ØÖ Ù Ö Ð ÓÒ ÙÒØÓ K Ò ÙÒ Ö ÓÐ Ò Ö Óº ÈÓ ÑÓ׸ ÒØÓÒ ×¸ × Ò Ö ÙÒ Ð ÓÖ ØÑÓ × Ò ÒØ ÕÙ ÓÑ Ò ÔÓÖ ÓÒרÖÙ Ö ØÓ Ó× ÐÓ× n−1 Ö ÓÐ × ÓÔØ ÑÓ× 2 ÒÓ Ó׺ Ô ÖØ Ö ×Ø Ö ×ÙÐØ Ó¸ ÓÒרÖÙ ÑÓ× ÐÓ× n − 2 Ö ÓÐ × ÓÔØ ÑÓ× 3 ÒÓ Ó× Ý × ×Ù × Ú Ñ ÒØ º ÄÓ× Óר × ÐÓ× ×Ù Ö ÓÐ × ÓÔØ ÑÓ× × ÐÑ Ò Ò Ò ÙÒ Ñ ØÖ Þ COST[] n × n¸ ÓÒ ÒØÖ COST(i,j) Ö ÔÖ × ÒØ Ð Ó×ØÓ Ð Ö ÓÐ ÓÔØ ÑÓ ÒØÖ i Ý jº Ð ÙÐ ÑÓ× Ø Ö Ø Ú Ñ ÒØ ר Ñ ØÖ Þ ÔÓÖ ÓÒ Ð × ×Ø ÐÐ Ö Ð ÓÒ Ð COST(1,n)¸ Ð Ù Ð ÓÒØ Ò Ð Ó×ØÓ ÓÔØ ÑÓ Ð Ö ÓÐ n ÒÓ Ó׺ Ð Ð ÓÖ ØÑÓ ØÓÑ ÓÑÓ ÒØÖ Ó× ÖÖ ÐÓ× Ñ Ò× ÓÒ n¸ ÓÒ n Ö ÔÖ × ÒØ Ð ÒÙÑ ÖÓ Ð Ú ×º Ð ÔÖ Ñ ÖÓ ÐÓ ÐÐ Ñ ÑÓ× keys[] Ý ÓÒØ Ò Ð × Ð Ú ×º Ð × ÙÒ Ó ÐÓ ÐÐ Ñ ÑÓ× [p] Ý ÓÒØ Ò Ð × Ö Ù Ò × ×Ó Ô Ö ÐÚº ¾ Ê ÓÖ ÑÓ× ÕÙ ÙÒ Ò Ú Ð Ò L(T ) Ó R(T ) ר × × Ó Ò ÙÒÓ Ö ×Ô ØÓ T º ÈÓÖ × Ö ÞÓÒ¸ n i=l+1 (Ò Ú Ð(ki )pi ¸ Ò ÓÒ Ò Ú Ð(ki ) × Ö ¬ Ö T¸ × Ci (L(T )) Ð Ö ÞÓÒ Ñ ÒØÓ × Ð Ñ ×ÑÓ ÔÖ Ci (R(T ))
  • 405.
    ´ 4.14. Arboles est´ticos ´ptimos a o 379 Ð Ð ÓÖ ØÑÓ Ö ÕÙ Ö ÓØÖ Ñ ØÖ Þ TREE[] ÕÙ ÐÑ Ò Ð × Ö × ÐÓ× Ö ÓÐ × ÓÔØ ÑÓ׺ Ó ÙÒ Ó×ØÓ ÓÔØ ÑÓ COST(i,j)¸ TREE(i,j) ÓÒØ Ò Ð Ò Ð Ö Þ Ð Ö ÓÐ Ò Ö Ó ÓÔØ ÑÓ ÒØÖÓ Ð ÖÖ ÐÓ keysº 4.14.2 Implantaci´n del problema o ÁÑÔÐ ÒØ ÑÓ× ÒÙ ×ØÖÓ Ð ÓÖ ØÑÓ Ò Ð Ö ÚÓ ÓÔ ÒÌÖ ºÀ ¿ ÙÝ ×ØÖÙ ØÙÖ × Ð × Ù ÒØ ¿ ÓÔ ÒÌÖ ºÀ ¿ ≡ ¬Ò ÓÒ Ñ ÖÓ× ÓÔ ÒÌÖ ¿ ÈÖÓØÓØ ÔÓ× ÙÒ ÓÒ × ÙÜ Ð Ö × ÓÔ ÒÌÖ ´Ò Ú Ö ¬Ò µ ÙÒ ÓÒ × ÙÜ Ð Ö × ÓÔ ÒÌÖ ¿ ¼ template <class Node, typename Key> Node * build_optimal_tree(Key keys[], double p[], const int & n) { Ð Ö ÓÒ Ñ ØÖ × ÒØ ÖÒ × ¿ compute_optimal_costs(cost, p, n, tree); return compute_tree<Node, Key> (keys, tree, n, 1, n); } Í× × compute optimal costs ¿ ¼ Ò compute tree ¿½ º Ð Ö ÚÓ ÜÔÓÖØ ÙÒ ÙÒ ÓÒ ÔÖ Ò Ô Ð ÐÐ Ñ build optimal tree()º Ä ÒØÖ Ð ÙÒ ÓÒ × ÙÒ ÖÖ ÐÓ ÓÖ Ò Ó Ð Ú × keys[]¸ ÙÒ ÖÖ ÐÓ Ô Ö Ð ÐÓ ÔÖÓ Ð × ×Ó ÔÓÖ i¹ × Ñ Ð Ú Ý Ð Ñ Ò× ÓÒ n ÐÓ× Ö ×Ô Ø ÚÓ× ÖÖ ÐÓ׺ Ä × Ð × Ð Ö Þ ÙÒ Ö ÓÐ Ò Ö Ó ÓÔØ ÑÓ ÓÒ ÓÖÑ Ð × ÔÖÓ Ð × ×º Ä × Ð Ú × Ý ÔÖÓ Ð × × ÓÐÓ Ò Ò ÖÖ ÐÓ× ×Ø Ø Ó׺ Ù× Ð Ö Ò ×¹ Ð ¸ Ð × Ñ ØÖ × ÒØ ÖÒ × ×ÓÒ Ñ × Ð × Ñ ÒØ Ò Ö ×Ø Ø ×º ÈÓÖ × Ö ÞÓÒ¸ ݸ Ò Ò ÙÖ ¸ Ô Ö ÒÓ Ð Ñ Ø ÖÒÓ× ÔÓÖ Ð Ö Ñ ÒØ ÓÒ Ñ ÑÓÖ ¸ Ù× Ö ÑÓ× ÖÖ ÐÓ× Ò Ñ Ó× ¿ Ð Ö ÓÒ Ñ ØÖ × ÒØ ÖÒ × ¿ ≡ ´¿ µ DynArray <int> tree((n + 1)*(n + 1)); DynArray <double> cost((n + 1)*(n + 1)); Í× × DynArray ¾º tree[] × ÙÒ Ñ ØÖ Þ ÕÙ ÐÑ Ò Ò × Ð Ô Ö Ñ ØÖÓ ÖÖ ÐÓ keys Ð ÙÒ ÓÒ build optimal tree()º cost[] × ÙÒ Ñ ØÖ Þ ÕÙ ÐÑ Ò Óר × ÐÓ× Ö ÓÐ × Ô Ö Ð × Ö ÕÙ Ö Ó× Ô Ö ÓÒרÖÙ Ö Ð Ö ÓÐ ÓÔØ ÑÓº Ð ×Ó ÓÑÓ Ñ ØÖ Þ ÙÒ ÒØÖ ÙÒ ÖÖ ÐÓ Ò Ñ Ó × ¬Ò Ð × Ù ÒØ ÑÓ Ó ¿ ¬Ò ÓÒ Ñ ÖÓ× ÓÔ ÒÌÖ ¿ ≡ ´¿ µ # define COST(i,j) (cost[(i)*(n+1) + (j)]) # define TREE(i,j) (tree[(i)*(n+1) + (j)]) ¬Ò × COST¸ Ù× Ò ÙÒ × ¿ ¼ Ò ¿ ½ º TREE¸ Ù× Ò ÙÒ × ¿ ¼ Ò ¿ ½ º TREE(i,j) ÐÑ Ò Ð Ò Ð Ö Þ ÙÒ Ö ÓÐ ÓÔØ ÑÓ Ô Ö Ð ÕÙ ÓÒØ Ò Ð × Ð Ú × ÒØÖ i Ý jº Ð ¬Ò и Ð Ö Þ Ð Ö ÓÐ ÓÔØ ÑÓ ¬Ò Ø ÚÓ × Ö keys[TREE(1, n)]¸ Ð Ö Þ Ð Ö ÓÐ ÞÕÙ Ö Ó keys[TREE(1, TREE(1,n) - 1)]¸ Ø Ø Ö º COST(i,j) ÐÑ Ò Ð Ó×ØÓ Ð Ö ÓÐ Ò Ö Ó ÓÒ Ð Ú × ÒØÖ keys[i] Ý keys[j]º
  • 406.
    380 Cap´ ´ ıtulo 4. Arboles ÓÑÓ × Ð ÓרÙÑ Ö ¸ ØÓ Ó Ñ ÖÓ × Ö Ò ¬Ò Ó Ð ¬Ò Ð Ð Ö ÚÓ ¿¼ ÁÒ ¬Ò ÓÒ Ñ ÖÓ× ÓÔ ÒÌÖ ¿ ¼ ≡ # undef COST # undef TREE Í× × COST ¿ Ò TREE ¿ º ÓÖ ¬Ò ÑÓ× Ð ÙÒ ÓÒ compute optimal cost()¸ Ð Ù Ð × ×ØÖÙ ØÙÖ Ò Ó× ÐÓÕÙ × ¿¼ ÙÒ ÓÒ × ÙÜ Ð Ö × ÓÔ ÒÌÖ ¿ ¼ ≡ ´¿ µ ¿ ¼ static inline void compute_optimal_costs(DynArray <double> & cost, double p[], const int & n, DynArray <int> & tree) { ÁÒ Ö ×ØÖÙ ØÙÖ × ÒØ ÖÒ × ¿ ¼ ÓÒרÖÙ Ö Óר × ÓÔØ ÑÓ× ¿ ¼ } ¬Ò × compute optimal costs¸ Ù× Ò ÙÒ ¿ º Í× × DynArray ¾º compute optimal cost() Ð ÙÐ Ð × Ñ ØÖ × Óר × COST[] Ý ÐÓ× Ò × Ð × Ö × ×Ù Ö ÓÐ ÓÔØ ÑÓ Ò TREE[]º Ð ÔÖ Ñ Ö ÐÓÕÙ ÁÒ Ö ×ØÖÙ ØÙÖ × ÒØ ÖÒ × ¿ ¼ ¸ ÓÐÓ ÐÓ× Ú ÐÓÖ × Ò Ð × Ò Ð × Ö ×Ô Ø Ú × Ñ ØÖ × ¿¼ ÁÒ Ö ×ØÖÙ ØÙÖ × ÒØ ÖÒ × ¿ ¼ ≡ ´¿ ¼ µ int i, j, k; for (i = 1; i <= n; ++i) { COST(i, i - 1) = 0; TREE(i, i) = i; } Í× × COST ¿ Ò TREE ¿ º Ð × ÙÒ Ó ÐÓÕÙ × Ð ÕÙ Ð ÙÐ ÐÓ× Óר × ¬Ò Ø ÚÓ׺ ÈÖ Ñ ÖÓ ÓÒ ÐÓ× ×Ù Ö ÓÐ × 2 ÒÓ Ó׸ ÐÙ Ó ÓÒ ÐÓ× 3¸ Ý × ×Ù × Ú Ñ ÒØ ר Ó Ø Ò Ö Ð Ú ÐÓÖ COST(0, n-1) Ý Ð Ö Þ Ö ×ÙÐØ ÒØ Ò TREE(0, n-1) ¿¼ ÓÒרÖÙ Ö Óר × ÓÔØ ÑÓ× ¿ ¼ ≡ ´¿ ¼ µ for (i = 0; i < n; ++i) for (j = 1; j <= n - i; ++j) { k = j + i; TREE(j, k) = min_index(cost, j, k, n); COST(j, k) = sum_p(p, j, k) + COST(j, TREE(j, k) - 1) + COST(TREE(j, k) + 1, k); } Í× × COST ¿ ¸ min index ¿ ½ ¸ sum p ¿ ¼ ¸ Ò TREE ¿ º sum p() ØÙ Ð ×ÙÑ Ð × ÔÖÓ Ð × ÒØÖ j Ý k Ý × ¬Ò ÓÑÓ × Ù ¿¼ ÙÒ ÓÒ × ÙÜ Ð Ö × ÓÔ ÒÌÖ ¿ ¼ +≡ ´¿ µ ¿¼ ¿½ static inline double sum_p(double p[], const int & i, const int & j) {
  • 407.
    ´ 4.14. Arboles est´ticos ´ptimos a o 381 double sum = 0.0; for (int k = i - 1; k < j; ++k) sum += p[k]; return sum; } ¬Ò × sum p¸ Ù× Ò ÙÒ ¿ ¼ º min index() Ö ØÓÖÒ ÙÒ Ò l¸ ÓÑÔÖ Ò Ó ÒØÖ j Ý k¸ Ø Ð ÕÙ COST(j, l - 1) + COST(l + 1, k) × Ñ Ò ÑÓº ר Ú ÐÓÖ × Ð ÙÐ Ñ ÒØ ÖÖ Ó Ö ØÓ l ÒØÖ j Ýk ¿½ ÙÒ ÓÒ × ÙÜ Ð Ö × ÓÔ ÒÌÖ ¿ ¼ +≡ ´¿ µ ¿¼ ¿½ static inline int min_index(DynArray <double>& cost, const int & j, const int & k, const int & n) { int ret_val; double min_sum = 1e32; for (int i = j; i <= k; ++i) { const double sum = COST(j, i - 1) + COST(i + 1, k); if (sum < min_sum) { min_sum = sum; ret_val = i; } } return ret_val; } ¬Ò × min index¸ Ù× Ò ÙÒ ¿ ¼ º Í× × COST ¿ Ò DynArray ¾º Ð ÓÖÑ ÔÐ ÒØ ¸ min index() × O(n)¸ ÙÝ ÐÐ Ñ Ó ÙÖÖ ÒØÖÓ Ó× Ð ÞÓ× O(n)º ÄÓ ÒØ Ö ÓÖ ÑÔÐ ÕÙ ÒÙ ×ØÖÓ Ð ÓÖ ØÑÓ × O(n3) ÙÒ Ø ÑÔÓ ÑÙ Ó Ñ ÓÖ ÕÙ Ð ÜÔÓÒ Ò Ð ÕÙ ÔÖÓ Ù Ö Ð Ð ÓÖ ØÑÓ Ù ÖÞ ÖÙØ ¸ Ô ÖÓ ÙÒ Ù ×Ø ÓÒ Ð Ô Ö Ú ÐÓÖ × n ÑÙÝ Ö Ò ×º Ä Ù×ÕÙ Ð Ò Ñ Ò ÑÓ Ð ÙÐ Ó Ò min index() ÔÙ Ñ ÓÖ Ö× × ÐÓ Ö ÑÓ× ÑÓ×ØÖ Ö ÕÙ Ð ×Ù Ö ÓÐ Ñ Ò ÑÓ × Ò Ù ÒØÖ Ò Ð Ö Ò Ó TREE(j, k - 1) ≤ TREE(j, k) ≤ TREE(j + 1, k)º Ò ×Ø ×Ó¸ ÔÙ ÑÓ×ØÖ Ö× ÕÙ Ð Ð ÓÖ ØÑÓ × O(n 2)¸ ÐÓ ÕÙ × Ð ÓÑÓ Ö Óº ÆÓ× Ö ×Ø ÓÒרÖÙ Ö Ð Ö ÓÐ Ô ÖØ Ö Ð Ñ ØÖ Þ TREEº Ð Ò Ð Ö Þ × TREE(1,n)¸ Ð ×Ù ×Ù Ö ÓÐ ÞÕÙ Ö Ó × TREE(1, TREE(1,n)) Ý × ×Ù × Ú Ñ ÒØ º ר ÑÓ× Ð ×ØÓ׸ Ô٠׸ Ô Ö × Ò Ö Ð ÖÙØ Ò ¿½ ÙÒ ÓÒ × ÙÜ Ð Ö × ÓÔ ÒÌÖ ¿ ¼ +≡ ´¿ µ ¿ ½ template<class Node, typename Key> static inline Node * compute_tree(Key keys[], DynArray<int>& tree, const int & n, const int & i, const int & j) { if (i > j) return Node::NullPtr; Node * root = new Node (keys[TREE(i, j) - 1]); LLINK(root) = compute_tree <Node, Key>(keys, tree, n, i, TREE(i, j) - 1);
  • 408.
    382 Cap´ ´ ıtulo 4. Arboles 54 38 66 29 42 63 69 24 71 7 98 3 108 0 ÙÖ º Ö ÓÐ Ò Ö Ó ÓÔØ ÑÓ 14 Ð Ú × ×ØÖ Ù × ÒÓÑ ÐÑ ÒØ ÓÒ p = 0, 5 RLINK(root) = compute_tree <Node, Key>(keys, tree, n, TREE(i, j) + 1, j); return root; } ¬Ò × compute tree¸ Ù× Ò ÙÒ ¿ º Í× × DynArray ¾ Ò TREE ¿ º 4.15 Notas bibliogr´ficas a Ë ÔÙ Ö Ö ÕÙ Ð ÒÓ ÓÒ Ñ Ø Ñ Ø Ö ÓÐ Ý ×Ù× ÓÒ ÔØÓ× ÙÒ Ñ ÒØ Ð × ×ÓÒ Ö ×ÙÐØ Ó Ú Ö × Ö × Ý Ò Ö ÓÒ × Ò Ð Ø ÓÖ ÓÒ ÙÒØÓ׺ Ð ÚÓÐÙÑ Ò ½ Ð ÖØ Ó ÓÑÔÙØ Ò ÔÖÓ Ö ÑÑ Ò ÃÒÙØ ½¼ ¸ Ö ÓÔ Ð ÐÓ× Ò Ó× Ð Ó Ö ¬ Ó× ×Ó Ö ÐÓ× ÓÖ Ò × Ñ Ø Ñ Ø Ó× ÐÓ× Ö ÓР׺ Ð Ñ ×ÑÓ ÑÓ Ó¸ ÃÒÙØ × ÙÒ Ð × Ñ ÓÖ × Ö ¹ Ö Ò × Ô Ö ÓÑÔÐ Ø Ö Ð × Ñ Ø Ñ Ø × ×Ó × ÐÓ× Ö ÓÐ × ÔÖ × ÒØ × Ò ×Ø Ø ÜØÓ Ý ÓØÖÓ× Ø ÔÓ× Ö ÓÐ × ÕÙ ÒÓ ×ØÙ ÑÓ׺ × ÖÖÓÐÐÓ× Ñ Ø Ñ Ø Ó× Ñ × ÔÖÓ ÙÒ Ó× ÔÙ Ò Ò ÓÒØÖ Ö× Ò ÙÒ Ø ÜØÓ ÓÖÑ Ð ×Ó Ö Ø ÓÖ Ö Ó׺ Ò Ð Ó ÙÖÖ Ò ¸ Ö ÓÑ Ò¹ ÑÓ× Ð Ð × Ó À Ö Öݸ Ö Ô Ì ÓÖÝ º × ÖÖÓÐÐÓ× Ö ÒØ × ÔÙ Ò Ò ÓÒØÖ Ö× Ò Ð Ø ÜØÓ ÓÑ Ò ØÓÖ Ð Ð ÓÖ Ø Ñ× ÃÖ Ö Ý ËØ Ò×ÓÒ ½¾ º ÄÓ× Ó Ó× ÙÒ Ö ÓÐ Ò Ö Ó¸ Ð Ð Ò Ù ÄÙ × Û Þ Ý Ð Ð Ö ÒÓØ ÓÒ ÔÓÐ ¸ Ù ÖÓÒ ×ØÙ Ó× ÔÓÖ Ð Ñ Ø Ñ Ø Ó ÔÓÐ Ó Â Ò ÄÙ × Û Þ ½ º Ð ÓÖÔÙ× ÓÑÔÖ × ÓÒ ÓÑÓÒ Ñ Ñ ÒØ ÐÐ Ñ Ó ÀÙ«Ñ Ò Ù × Ù ÖØÓ ÔÓÖ Ú ÀÙ«Ñ Ò Ò ½ ¾¸ Ò ÕÙ Ð ÒØÓÒ × ×ØÙ ÒØ Ó¬ Ð º ÁÒØ Ö × ÒØ Ñ ÒØ ¸ ÀÙ«Ñ Ò Ñ × ÕÙ ×Ó Ô Ø ÒØ Ö ×Ù× × Ù Ö Ñ ÒØÓ׺ È Ö ÙÒ Ö Ú × ÓÒ Ý Ò Ð × × Ð Ø ÓÖ Ó Ó× Ö ÓÐ Ò Ö Ó¸ Ö ÓÑ Ò ÑÓ× Ð ÓÖ Öר Ð Ý È ÖÖ Ò ¾ º Ë ÙÒ ÃÒÙØ ½½ ÐÓ× Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ Ù ÖÓÒ × Ù ÖØÓ× Ò Ô Ò ÒØ ¹ Ñ ÒØ ÔÓÖ Ú Ö Ó× ÒÚ ×Ø ÓÖ × ÙÖ ÒØ Ð ½ ¼º ÒÙ ÚÓ¸ Ð Ð ØÓÖ × Ö Ñ Ø Ó Ð Ó Ö ÃÒÙØ ½½ Ô Ö ÓÒ×ÙÐØ Ö Ð × Ö Ö Ò × Ü Ø ×º ÌÓ Ó× ÐÓ× Ð ÖÓ× ×ØÖÙ ØÙÖ × ØÓ× ÓÒ× Ö Ò Ú Ö Ó× Ô ØÙÐÓ× ÐÓ× Ö ÓР׺ Ò × × ÒØ Ó¸ Ù ÐÕÙ Ö ÓØÖÓ Ø ÜØÓ × ÖÚ Ö ÖÒ ÓÒ Ðº Ë Ò Ñ Ö Ó¸ Ò ÐÓ ÕÙ
  • 409.
    4.15. Notas bibliogr´ficas a 383 Ö ÓÐ × × Ö ¬ Ö ¸ Ò Ò ÙÒ Ð ÖÓ¸ Ò ÐÙ Ó ÔÓÖ ×ÙÔÙ ×ØÓ Ð ÔÖ × ÒØ ¸ ÔÙ ÓÒ× Ö Ö× ÓÑÔÐ ØÓº ÍÒ Ø ÜØÓ Ö ÒØ ¸ Ø ËØÖÙ ØÙÖ × Ù× Ò Ò ++ Ä Ò × Ñ¸ Ù¹ Òר Ò Ý Ì Ò Ò ÙÑ ½¿ ¸ Ü ÑÔÐ × Ö ­ Ü ÓÒ × ÔÖ Ø × Ý ÔÖ × ÒØ ÔÐ ÓÒ × Ö Ð ×¸ ÒÓØ Ð Ñ ÒØ ¸ Ð Ú ÐÙ ÓÒ ÜÔÖ × ÓÒ × Ö ØÑ Ø × Ñ ÒØ Ö ÓÐ × Ð Ó׺ ÄÓ× Ö ÓÐ × Ð Ó× Ù ÖÓÒ × Ù ÖØÓ× ÔÓÖ º º È ÖÐ × Ý º Ì ÓÖÒØÓÒ ½ º ÙÒÕÙ ×Ù Ù×Ó × ¬ ÙÐØÓ×Ó¸ ר Ð × Ö ÓÐ × Ù× Ò ÔÐ ÓÒ × ×Ø ר ׸ ØÓÖ × Ø ÜØÓ× Ý ÔÐ ÓÒ × Ö ¬ × ÕÙ Ñ Ò Ò Ö Ò × ÚÓÐÙÑ Ò × Ò ÓÖÑ ÓÒº ÄÓ× Ö ÓÐ × ÓÒ Ö Ò Ó ÔÖ × ÒØ Ó× Ò Ü º½½ ´Ô Ò ¿ ¿µ Ù ÖÓÒ × ÖÖÓÐÐ Ó× ÔÓÖ ×Ø Ö ØÓÖ Ô Ö Ð ÔÖ × ÒØ ØÖ Ó ÓÑÓ ÒרÖÙÑ ÒØÓ Ø Ó ÓÒ × ÙÖ Ò × Ó × ÖÖÓÐÐ Ó× ÔÖ Ú Ñ ÒØ º Ä × × ×Ó Ö Ð Ù×Ó Ö Ò Ó× Ô Ö Ð Ú ØÓÖ Þ ÓÒ Ö ÓÐ × × ÔÖ × ÒØ Ô Ö ÙÒ Ð × Ö ÓÐ ÕÙ Ð Ö Ó ÒÓÑ Ò Ó ÎÄ ÔÓÖ Ö Ò º Ô Ö ÒØ Ñ ÒØ ¸ Ð ØÖ Ó Ö Ò × Ô ÓÒ ÖÓ Ò ÐÓ× Ð ÓÖ ØÑÓ× ÓÒ Ø Ò ÓÒ Ý Ô Ö¹ Ø ÓÒº ÄÓ× Ó Ó× ÀÙ«Ñ Ò ×ÓÒ ÓÑÓÒ ÑÓ× Ú º ÀÙ«Ñ Ò ÕÙ Ò ÐÓ× × Ù Ö Ó ÙÖ ÒØ Ð Ö Ð Þ ÓÒ ×Ù× Ø × × Ó ØÓÖ Ðº ÄÓ× Ô׸ ÙÒØÓ ÓÒ Ð Ô×ÓÖØ¸ Ù ÖÓÒ ÔÖ × ÒØ Ó× ÔÓÖ ÔÖ Ñ Ö Ú Þ ÔÓÖ Âº Ϻ º Ï ÐÐ Ñ× ½ Ý Êº Ϻ ÐÓÝ º Ò Ð ÓÔ Ò ÓÒ ×Ø Ö ØÓÖ¸ Ð Ñ × ÙØ ÒØ Ý Ñ ×ØÖ Ð ÜÔÐ ÓÒ ×Ó Ö Ô× Ð ÓÖ ÒØÐ Ý Ò ÈÖÓ Ö ÑÑ Ò È ÖÐ× ½ º Ä ÜÔÐ ÓÒ × Ø Ò Ü Ð× ÕÙ × ÑÙ Ó× ÒÓ× ´½ µ Ù Ò Ó ×Ø Ö ØÓÖ ×ØÙ Ó ÐÓ× Ô׸ ר ÒÓ ÔÙ ×ÔÖ Ò Ö× ×Ù ×ÕÙ Ñ ÔÖ × ÒØ ÓÒ ÐÓ× Ô׺ Ë ÖÚ ¸ Ô٠׸ ר ÔÖ × ÒØ Ô ÖÖ Ó ÓÑÓ ÔÐ Ø × Ý Øº ÓÖÑ Ö¸ Ä × Ö×ÓÒ Ý Ê Ú ×Ø ¿ ÔÖ × ÒØ Ò × ÖÖÓÐÐÓ× ÐØ ÖÒ Ø ÚÓ× Ö ÓÐ × ÜØ Ò Ó× Ô Ö ÓØÖ Ð × Ö ÓÐ ÕÙ Ð Ö Ó ÐÐ Ñ Ó ÖÓ Ó¹Ò ÖÓº Ð ÓÖ Ð × Ó Ë Û ¸ Ð ÓÖ Ø Ñ× Ò È ÖØ× ½ß ½ ¸ × Ö Ø Ö Þ ÔÓÖ ÜÔÓÒ Ö ÑÙ Ó× Ð ÓÖ ØÑÓ׸ ÓÖÑ ÑÙÝ ÓÒ × Ô ÖÓ Ú × Ò ÓÑÔÐ Ø Ý Ò ØÖ Ñ ÒØÓ Ð ÓÖÑ Ð ×ÑÓº Ô × Ö ÐÐÓ¸ Ð Ë Û × ÙÒ Ð × Ñ ÓÖ × Ö Ö Ò × Ô Ö Ò Ö Ð ÙÒ Ð ÓÖ ØÑÓ ×Ô ¬ Óº Ð ÚÓÐÙÑ Ò ¿ Ð ÖØ Ó ÓÑÔÙØ Ö ÔÖÓ Ö ÑÑ Ò ÃÒÙØ ½½ ÓÒØ Ò ÙÒ Ò Ð × × Ñ Ø Ñ Ø Ó ×Ø ÒØ Ü Ùר ÚÓ ÐÓ× Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ Ý ÐÓ× Ö ÓÐ × ÓÔØ ÑÓ׺ Ð ÁÒØÖÓ Ù Ø ÓÒ ØÓ Ð ÓÖ Ø Ñ× ÓÖÑ Ò¸ Ä × Ö×ÓÒ Ý Ê Ú ×Ø ¿ ¸ ÓÒ× Ö ÙÒ Ô ØÙÐÓ Ð × ÜØ Ò× ÓÒ × ×Ó Ö Ö ÓÐ × Ò Ö Ó׺ ÙÒÕÙ ×Ø Ô ØÙÐÓ × × Ò ÙÒ Ð × Ô ÖØ ÙÐ Ö Ö ÓÐ ÐÐ Ñ Ó ÖÓ Ó¹Ò ÖÓ ´Ú Ö Ü º ´Ô Ò ½¿µµ¸ Ð × ÜØ Ò× ÓÒ × ÔÖÓÔ¹ Ù ×Ø × ÔÙ Ò Ù× Ö× ×Ó Ö ÔÖ Ø Ñ ÒØ Ù ÐÕÙ Ö Ð × Ö ÓÐ Ò Ö Ó Ù×ÕÙ º Ð Ð ÓÖ ØÑÓ Ò× Ö ÓÒ Ò Ð Ö Þ ÔÖ × ÒØ Ó Ò Ü º º ´Ô Ò ¿ ¿µ Ù × Ù ÖØÓ ÔÓÖ ËØ Ô ×ÓÒ Ý Ö ÔÓÖØ Ó Ò Ñ Ø Ó ÓÖ ÓÒרÖÙ Ø Ò Ò ÖÝ × Ö ØÖ × Ý Ñ Ò Ò× ÖØ ÓÒ× Ø Ø ÖÓÓØ ½ º ר ØÖ Ó Ñ Ö Ó ÙÒ ØÓ ×Ó Ö ÐÓ× Ö ÓÐ × Ò Ö Ó׸ ÔÙ × Ó Ô ÒÙ Ú × × Ý Ù×Ó׸ ÒÓØ Ð Ñ ÒØ ¸ ÐÓ× Ð ÓÖ ØÑÓ× ÓÒ Ø Ò ÓÒ Ý Ô ÖØ ÓÒ ÔÖ × ÒØ Ó× Ò Ü º º ´Ô Ò ¿ µ Ý Ü º½½º ´Ô Ò ¿ µ Ý ÐÓ× Ö ÓÐ × Ð ØÓÖ Þ Ó× ÕÙ × Ö Ò ÔÖ × ÒØ Ó× Ò Ü º¾ ´Ô Ò µº ÄÓ× Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ ÓÔØ ÑÓ× Ù ÖÓÒ ÔÖÓÔÙ ×ØÓ× Ý ×ØÙ Ó× ÔÓÖ ÀÙ Ý ÌÙ Ö Ò ½ ½ º
  • 410.
    384 Cap´ ´ ıtulo 4. Arboles 4.16 Ejercicios ½º ÅÓ ¬ÕÙ Ð Ð ÓÖ ØÑÓ º½ Ô Ö ÕÙ ÑÔÖ Ñ ÙÒ Ö ÓÐ Ö ØÖ Ö Ñ ÒØ Ö Ò ÕÙ ÒÓ ÕÙ Ô Ò Ð Ñ Ó ÑÔÖ × ÓÒ ´Ô ÒØ ÐÐ Ó ÑÔÖ ×ÓÖ µ ´·µ ¾º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ØÓÑ ÓÑÓ ÒØÖ ÙÒ × Ù Ò ×ÓÖ Ò ´ÙÒ Ð ×Ø Ó ÙÒ Ú ØÓÖ¸ ÔÓ Ó ÑÔÓÖØ µ¸ Ô Ö × <Î ÐÓÖ ÒÓ Ó¸ ÆÙÑ ÖÓ Û Ý>¸ Ý Ö ØÓÖÒ Ð Ö ÓÐ Ö ÔÖ × ÒØ Ó ÓÒ Ð ×Ø × ÒÐ Þ × Ý ÓÒ ÖÖ ÐÓ׺ ¿º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ØÓÑ ÒØÖ ÙÒ Ö ÓÐ Ù ÐÕÙ Ö Ý Ö ØÓÖÒ ÙÒ × Ù Ò ÓÖ Ò ÒÙÑ ÖÓ× Û Ýº ÓÒ× Ö ÐÓ× Ó× Ø ÔÓ× Ö ÔÖ × ÒØ ÓÒ Ð ×Ø × ÒÐ Þ × Ý ÖÖ ÐÓ׺ º × ÙØ Ý × Ò ÙÒ ×ØÖÙ ØÙÖ ØÓ ÓÖ ÒØ Ð ÒÓØ ÓÒ Û Ýº ×¹ ÙØ Ð ÙÒÓ× ÓÒØ ÜØÓ× Ò ÐÓ× Ù Ð × ×Ù × ÒÓ × Ö Ùר ¬ Óº º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ù×ÕÙ ÙÒ Ð Ú Ò ÙÒ Ö ÓÐ Ò¹ Ö Ó Ö ÔÖ × ÒØ Ó Ñ ÒØ Ð ×Ø × ÒÐ Þ ×º × ÙØ ×Ó Ö Ð × Ö ÒØ × ×ØÖ Ø × Ù×ÕÙ º º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ù ÒØ Ð ÒÙÑ ÖÓ ÒÓ Ó× Ò ÙÒ Ö ÓÐ Ò¹ Ö Ó Ö ÔÖ × ÒØ Ó Ñ ÒØ Ð ×Ø × ÒÐ Þ ×º º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ö ÓÖÖ Ò ×Ù¬ Ó ÙÒ Ö ÓÐ Ö ÔÖ × ÒØ Ó ÓÒ Ð ×Ø ׺ º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ × Ö Ð Ö ÔÖ × ÒØ ÓÒ Ô Ö ÒØ Þ ÙÒ Ö Óк º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÓÒÚ ÖØ ÙÒ Ö ÓÐ Ö ÔÖ × ÒØ Ó ÓÒ Ð ×Ø × ÒÐ Þ × Ò ×Ù ÕÙ Ú Ð ÒØ Ö ÔÖ × ÒØ Ó ÓÒ ÖÖ ÐÓ׺ Ê Ð Ó× Ö ×ÔÙ ×Ø × Ð ÔÖ Ñ Ö ÓÒ¹ × Ö Ò Ó ÓÒÓ Ó Ð ÓÖ Ò Ð Ö Óи Ð × ÙÒ ÓÒ× Ö Ò ÓÐÓ × ÓÒÓ Óº ½¼º ÓÒ ÓÑÓ Ð Ñ Ø Ö Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó Ô Ö ÕÙ ÓÒØ Ò Ð Ò ÓÖÑ ÓÒ Ö ¹ ÕÙ Ö Ô Ö Ö ÓÒרÖÙ Ö Ð Ö ÓÐ ÓÖ Ò Ðº ½½º ÓÒ ÓÑÓ Ð Ñ Ø Ö Ð Ö ÓÖÖ Ó ×Ù¬ Ó Ô Ö ÕÙ ÓÒØ Ò Ð Ò ÓÖÑ ÓÒ Ö ¹ ÕÙ Ö Ô Ö Ö ÓÒרÖÙ Ö Ð Ö ÓÐ ÓÖ Ò Ðº ½¾º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÓÒרÖÙÝ ÙÒ Ö ÓÐ Ò Ö Ó Ô ÖØ Ö ÐÓ× Ö ÓÖÖ Ó× Ò¬ Ó Ý ×Ù¬ Óº ½¿º ÅÓ ¬ÕÙ Ð Ö ÓÖÖ Ó ÔÓÖ Ò Ú Ð × level order ´Ü º º½¾ ´Ô Ò ¾ ¼µµ Ô Ö ÕÙ Ù× ÙÒ ÙÒ ÓÒ Ú × Ø ÕÙ Ö Ð Ò Ú Ð Ý Ð ÔÓ× ÓÒ ÒØÖÓ Ð Ö ÓÖÖ Óº ½ º × Ò ÙÒ Ð ÓÖ ØÑÓ ÒÓ Ö ÙÖ× ÚÓ ÕÙ ÓÔ Ö ÓÐ × Ò Ö Ó׺ ´·µ ½ º × Ò ÙÒ Ð ÓÖ ØÑÓ ÒÓ Ö ÙÖ× ÚÓ ÕÙ ×ØÖÙÝ Ö ÓÐ × Ò Ö Ó׺ ´·µ ½ º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ö ÓÖÖ Ò ÔÖ ¬ Ó ÙÒ Ö ÓÐ Ò Ö Ó Ð Óº ½ º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ö ÓÖÖ Ò ×Ù¬ Ó ÙÒ Ö ÓÐ Ò Ö Ó Ð Óº ½ º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ð ÙÒ Ö ÓÐ Ò Ö Óº Ä ÒØÖ × ÙÒ Ö ÓÐ Ò Ö Ó ÒÓÖÑ Ð Ð × Ð × Ð Ñ ×ÑÓ Ö Óи Ô ÖÓ ×Ù× ÒÓ Ó× ×Ø Ò Ð Ó× × ÙÒ º º½ º ½º Ó ÙÒ Ö ÓÐ Ò Ö Ó¸ × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ØÙ Ð ÓÔ Ð º
  • 411.
    4.16. Ejercicios 385 ¾¼º ËÙÔÓÒ ÙÒ Ö ÓÐ Ò Ö Ó ÙÝÓ× ÒÓ Ó× Ø Ò Ò ÙÒ ÑÔÓ ÓÒ Ð ÐÐ Ñ Ó PLINK Ý ÕÙ ÒÓØ Ð ÒÓ Ó Ô Ö º Ó ÙÒ ÒÓ Ó Ù ÐÕÙ Ö p¸ × Ò Ð ÓÖ ØÑÓ× ÒÓ Ö ÙÖ× ÚÓ× Ý × Ò Ô Ð Ô Ö ´ µ Ø ÖÑ Ò Ö Ð ÒÓ Ó ÔÖ ×ÓÖ Ý¸ ´ µ Ø ÖÑ Ò Ö Ð ÒÓ Ó ×Ù ×ÓÖº ¾½º ÄÓ× Ö ÓÖÖ Ó× Ô× Ù Ó¹ Ð Ó× ÒÓ ÓÒ× Ö Ò Ð ÔÓ× ÓÒ Ð ÒÓ Ó Ò Ð Ö ÓÖÖ Ó Ò ×Ù Ò Ú Ðº ÅÓ ¬ÕÙ Ð × ÙÒ ÓÒ × Ò Ù ×Ø ÓÒ Ô Ö ÕÙ × Ò ÐÙÝ Ò ×ØÓ× Ô Ö Ñ ØÖÓ׺ ´··µ ¾¾º × Ò ÙÒ ÖÙØ Ò Ö ÙÖ× Ú ÕÙ Ö ÓÖÖ ÔÓÖ Ò Ú Ð × ÙÒ Ö ÓÐ Ò Ö Ó Ý Ù× ×Ô ¹ Ó O(1)º ´·µ ¾¿º × Ò ÙÒ Ð ÓÖ ØÑÓ ÒÓ Ö ÙÖ× ÚÓ ÕÙ ØÙ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó ×Ó Ö ÙÒ Ö ÓÖ ×¹ Ò ×Ô ¬ Ñ ÒØ Ð Ì Tree Node<T>º ¾ º × Ò ÙÒ Ð ÓÖ ØÑÓ ÒÓ Ö ÙÖ× ÚÓ ÕÙ ØÙ Ð Ö ÓÖÖ Ó ×Ù¬ Ó ×Ó Ö ÙÒ Ö ÓÖ ×¹ Ò ×Ô ¬ Ñ ÒØ Ð Ì Tree Node<T>º ¾ º ÓÒ× Ö ÐÓ× × Ù ÒØ × Ö ÓÖÖ Ó× ×Ó Ö ÙÒ Ö ÓÖ × Ò Prefijo ¾ ½ ¿ ½ ½ ½¾ ½¼ ½½ ½ ½¿ ½ ½ ½ ¾¼ Sufijo ½¾¿ ½¼ ½½ ½¾ ½¿ ½ ½ ½ ½ ½ ½ ¾¼ Ù Ð Ö ÓÖ × Ò º ¾º ¬Ò ÑÔÐ ÒØ Ð × Ñ Ð Ö ÒØÖ Ó× Ö ÓÐ × ×Ô ¬ Ó× Ñ ÒØ Ð Ì Tree Node<T>º ¾º ¬Ò ÑÔÐ ÒØ Ð ÕÙ Ú Ð Ò ÒØÖ Ó× Ö ÓÐ × ×Ô ¬ Ó× Ñ ÒØ Ð Ì Tree Node<T>º ¾º × Ò ÙÒ Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓ ÕÙ ÑÔÐ ÒØ Ð ÓÔ ÙÒ Ö ÓÐ ×Ô ¬ Ó Ñ ¹ ÒØ Ð Ì Tree Node<T>º ¾º × Ò ÙÒ Ð ÓÖ ØÑÓ ÒÓ Ö ÙÖ× ÚÓ ÕÙ ÑÔÐ ÒØ Ð ÓÔ ÙÒ Ö ÓÐ ×Ô ¬ Ó Ñ ÒØ Ð Ì Tree Node<T>º ¿¼º × Ò ÙÒ Ð ÓÖ ØÑÓ ÒÓ Ö ÙÖ× ÚÓ ÕÙ Ö Ð Ð Ù×ÕÙ ÔÓÖ ÒÙÑ ÖÓ Û Ýº ¿½º Ù Ð Ö ÓÖ × Ò ÕÙ Ú Ð ÒØ Ð × Ù ÒØ Ö ÓÐ Ò Ö Ó
  • 412.
    386 Cap´ ´ ıtulo 4. Arboles 9 6 21 4 7 16 22 1 5 8 10 18 24 2 13 17 19 23 25 3 11 14 20 12 15 ¿¾º Ù Ð Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ Ð Ö ÓÖ × Ò × Ù ÒØ 1 14 26 27 2 8 9 10 17 18 19 20 28 29 30 31 3 4 5 6 7 11 12 13 21 22 15 16 23 24 25 ¿¿º ÓÑÔÐ Ø Ð ×ÓÐÙ ÓÒ Ð Ù ÓÒ ´ º¿¿µº ´··µ ¿ º ÓÑÔÐ Ø Ð ×ÓÐÙ ÓÒ Ð Ù ÓÒ ´ º¿ µº ´·µ ¿ º Ë (ni) Ð Ö Ò Ð Ð Ö ÓÐ Ò Ö Ó ÙÝ Ö Þ × niº ÑÙ ×ØÖ ÕÙ ÁÈÄ(T ) = (ni) ∀ni T|ni ÒØ ÖÒÓ ¿ º Ò Ö Ð Ð ÜÔÖ × ÓÒ ÒØ Ö ÓÖ Ô Ö Ö ÓÐ × m¹Ö Ó׺ ¿ º × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ ØÖ Ò× ÓÖÑ ÙÒ Ö ÓÐ m¹Ö Ó ÓÑÔÐ ØÓ¸ Ö ÔÖ × ÒØ Ó ÓÒ Ð ×Ø ׸ Ò ÙÒ ÖÖ ÐÓ × Ù Ò Ðº ¿ º × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ ØÖ Ò× ÓÖÑ ÙÒ Ö ÓÐ Ò Ö Ó ÓÑÔÐ ØÓ Ò ÙÒ ÖÖ ÐÓ × ¹ Ù Ò Ðº ¿ º × Ö ÙÒ Ú Ö× ÓÒ ÒÓ Ö ÙÖ× Ú Ð Ð ÓÖ ØÑÓ ÕÙ Ð ÙÐ Ð ÐØÙÖ ÙÒ Ö ÓÐ Ò Ö Óº
  • 413.
    4.16. Ejercicios 387 ¼º ÓÒ× Ö Ð × × Ù ÒØ × Ð Ò × Ð Ð ÓÖ ØÑÓ ÔÖ × ÒØ Ó Ò Ü º º ´Ô Ò ¾ µ Ô Ö Ð ÓÔ ÙÒ Ö ÓÐ Ò Ö Ó I(RLINK(tgt_root) == Node::NullPtr); if (LLINK(tgt_root) != Node::NullPtr) destroyRec(LLINK(tgt_root)); delete tgt_root; ´ µ ÈÓÖ ÕÙ Ð × ÖØÓ Ø Ò × ÒØ Ó ´ µ Ð if Ý Ð ×ØÖÙ ÓÒ Ð ×Ù Ö ÓÐ ÞÕÙ Ö Ó ×ÓÒ Ö ÙÒ ÒØ ׸ ÔÓÖ ÕÙ ½º × Ö ÙÒ Ú Ö× ÓÒ Ö ÙÖ× Ú Ð Ð ÓÖ ØÑÓ ×ØÖÙ ÓÒ ÑÓ×ØÖ Ó Ò Ü º º½¼ ´Ô Ò ¾ µ ÕÙ Ð Ö ÐÓ× ÒÓ Ó× Ò ÔÖ ¬ Óº ¾º × Ö ÙÒ Ú Ö× ÓÒ Ö ÙÖ× Ú Ð Ð ÓÖ ØÑÓ ×ØÖÙ ÓÒ ÑÓ×ØÖ Ó Ò Ü º º½¼ ´Ô Ò ¾ µ ÕÙ Ð Ö ÐÓ× ÒÓ Ó× Ò Ò¬ Óº ¿º × Ö ÙÒ Ú Ö× ÓÒ ÒÓ Ö ÙÖ× Ú ¸ ×Ù¬ Ó¸ Ð Ð ÓÖ ØÑÓ ×ØÖÙ ÓÒ ÑÓ×ØÖ Ó Ò Ü º º½¼ ´Ô Ò ¾ µ ÕÙ ¸ Ò ×Ó ÕÙ Ó ÙÖÖ ÙÒ × ÓÖ ÔÐ ¸ Ð Ö ÓÐ Ò ÙÒ ×Ø Ó ÓÒ× ×Ø ÒØ º º × Ö ÙÒ ÔÖÓ Ö Ñ ÕÙ Ö ÓÖÖ ÙÒ Ö ÓÐ Ò Ö Ó ÔÓÖ Ò Ú Ð × Ö ÞÕÙ Ö º º ÁÑÔÐ ÒØ Ð Ö ÓÖÖ Ó ×Ù¬ Ó Ñ ÒØ Ô× Ù Ó¹ Ð Óº ´··µ º ÅÓ ¬ÕÙ Ð Ö ÓÖÖ Ó Ò¬ Ó Ô× Ù Ó¹ Ð Ó Ô Ö Ó Ø Ò Ö ÙÒ Ö ÓÖÖ Ó Ò¬ Ó ÒÚ Ö×Ó × Ö¸ Ð Ö ÓÖÖ Ó Ò¬ Ó Ö ÞÕÙ Ö º ´·µ º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ö ÓÑÓ ÒØÖ Ð ÒÙÑ ÖÓ Û Ý ÙÒ ÒÓ Ó Ù ÐÕÙ Ö Ý Ð Ö ÓÐ Ò Ö Ó ÓÒ Ö × Ð ÒÓ Ó Ý Ö ØÓÖÒ Ð ÒÓ Ó Ò Ù ×Ø ÓÒº º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ØÓÑ ÒØÖ ÙÒ Ö ÓÐ Ò Ö Ó Ý ÓÒרÖÙÝ ÙÒ ÓÒ ÙÒØÓ ÓÑÔÙ ×ØÓ ÔÓÖ ØÓ Ó× ÐÓ× ÒÓ Ó× Ö ÔÖ × ÒØ Ó× Ò ÒÙÑ ÖÓ× Û Ýº º Ò × ÐÓ ÔÐ ÒØ Ó Ð Ò Ó Ü º ´Ô Ò ¿¾¼µ¸ Ð ÙÐ Ð ÒÙÑ ÖÓ Ö ÓÖ ×¹ Ò × ÔÓ× Ð × ÕÙ × ÔÙ Ò ÔÐ ÒØ Ö ÓÒ n ÒÓ Ó׺ ¼º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ø ÖÑ Ò × ÙÒ × Ù Ò Ø× ÓÖÖ ×ÔÓÒ ÙÒ Ô Ð ¹ Ö ÄÙ × Û Þº ½º Ó ÙÒ Ö ÓÐ Ò Ö Ó¸ × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ò Ö Ð Ô Ð Ö ÄÙ × Û Þ ÓÖÖ ×ÔÓÒ ÒØ º ¾º ÑÙ ×ØÖ ÕÙ Ð Ð Ò Ù × ÔÖ ¬ Óº ¿º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÑÔÖ Ñ Ð Ö ÓÖÖ Ó ÔÓÖ Ò Ú Ð × ÒÚ Ö×Ó ÙÒ Ö ÓÐ Ò Ö Óº × Ö¸ ÔÖ Ñ ÖÓ × Ð ×Ø Ò ÞÕÙ Ö Ö ÐÓ× ÒÓ Ó× Ð ÙÐØ ÑÓ Ò Ú Ð ÐÙ Ó ÐÓ× Ð Ô ÒÙÐØ ÑÓ Ý × ×Ù × Ú Ñ ÒØ ר ÐÐ Ö Ð Ö Þº º Ó ÙÒ Ö ÓÐ Ò Ö Ó Ù ÐÕÙ Ö ¸ Ð Ö ÓÖÖ Ó ÓÑÔÐ Ñ ÒØÓ ÔÓÖ Ò Ú Ð × × ¬Ò Ó ÓÑÓ Ð Ð ×Ø Ó ÐÓ× ÒÓ Ó× ÕÙ ÐØ Ò ÔÓÖ Ò Ú Ð Ô ÖØ Ö Ð Ö Þ ×Ø Ð ÒÓ Ó Ñ ÝÓÖ ÐØÙÖ º ÈÓÖ ÑÔÐÓ¸ Ô Ö Ð Ö ÓÐ Ð ¬ ÙÖ º ¸ Ð Ö ÓÖÖ Ó ÓÑÔÐ Ñ ÒØÓ × 7, 8, 11, 14, 15 × Ö¸ ÐÓ× ÒÓ Ó× ÕÙ ÐØ Ö Ò Ô Ö ÕÙ Ð Ö ÓÐ ×Ø ÓÑÔÐ ØÓ ר ×Ù ÐØÙÖ º
  • 414.
    388 Cap´ ´ ıtulo 4. Arboles ½ ¾ ¿ ½¼ ½½ ½¾ ½¿ ½ ½ ÙÖ º Ö ÓÐ Ò Ö Ó ÑÔÐÓ ´µ ×Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ð ÙÐ Ð Ö ÓÖÖ Ó ÓÑÔÐ Ñ ÒØÓ ÙÒ Ö ÓÐ Ò Ö Óº ×ÙÑ ÕÙ ÐÓ× ÒÓ Ó× ×Ø Ò Ø ÕÙ Ø Ó× ÔÓÖ Ò Ú Ð Ô ÖØ Ö Ð ÔÓ× ÓÒ ÖÓº ´·µ ´µ ×Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ò Ö ÙÒ Ö ÓÐ ÓÑÔÐ Ñ ÒØÓº ×ØÓ ×¸ ÙÒ Ö ÓÐ ÙÝ × Ó × Ò Ò ÓÒ ÐÓ× ÒÓ Ó× ÐØ ÒØ × Ð Ö ÓÐ Ô Ö ÕÙ Ð Ö ÓÐ ×Ø ÓÑÔÐ ØÓº ´·µ º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÔÓ ÙÒ Ö ÓÐ Ò Ö Ó × Ö¸ ÕÙ Ð Ñ Ò Ð Ñ Ò Ñ ÒØ ÒÓ Ó× Ô Ö ÚÓÐÚ ÖÐÓ ÙÒ Ö ÓÐ ÓÑÔÐ ØÓº º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ò Ù ÒØÖ Ð Ñ × Ð Ö Ó Ñ ÒÓ ÔÓÖ Ð Ö ÓÒØ Ò Ó Ò ÙÒ Ö ÓÐ Ò Ö Óº º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÓÒרÖÙÝ ÙÒ Ö ÓÐ Ò Ö Ó Ô ÖØ Ö ÙÒ Ô Ð Ö ÄÙ × Û Þº ´·µ º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ò Ö ÙÒ Ö ÓÐ Ò Ö Ó n ÒÓ Ó× ÓÒ n × ÙÒ Ú ÐÓÖ ÓÒר ÒØ º ´·µ º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ø ÖÑ Ò × ÙÒ ÜÔÖ × ÓÒ Ð Ö Ø Ò ×Ù× Ô Ö ÒØ × × Ð Ò Ó׺ ´·µ ¼º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ò Ö ÙÒ Ö ÓÐ Ò Ö Ó Ð ØÓÖ Ó n ÒÓ Ó׺ Ä ÒØ n × ÙÒ Ô Ö Ñ ØÖÓ Ð Ð ÓÖ ØÑÓ Ý ØÓ Ó× ÐÓ× Ö ÓÐ × Ò Ø Ò Ö Ð Ñ ×Ñ ÔÖÓ Ð º ´··µ ½º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÓÒרÖÙÝ ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ Ô ÖØ Ö ×Ù Ö ÓÖÖ Ó ×Ù¬ Óº ¾º Ó ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ ¸ × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÓÒרÖÙÝ ÙÒ × Ù Ò Ò× Ö ÓÒ ÕÙ Ö ÔÖÓ ÙÞ ÙÒ Ö ÓÐ Ò Ö Ó ÕÙ Ú Ð ÒØ º ¿º × Ò ÑÔÐ ÒØ ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ð ×Ø ÐÓ× Ö Ò Ó× Ð Ú × ÕÙ ÒÓ × Ò Ù ÒØÖ Ò Ò Ð Ö Óк º × Ò ÙÒ ÒÓ Ó Ò Ö Ó ÕÙ ¸ Ñ × Ð Ð Ú ¸ Ø Ò ÙÒ ÒÐ Ó Ð Dlinkº ÅÓ¹ ¬ÕÙ Ð × ÖÙØ Ò × Ò× Ö ÓÒ Ý Ð Ñ Ò ÓÒ Ò Ö ÓÐ Ò Ö Ó Ù×ÕÙ Ô Ö ÕÙ Ð ÑÔÓ Dlink ÙÒ ÐÓ× ÜÔÐ ØÓ׺ Ð Ö ÓÖÖ Ó Ð Ð ×Ø ÓÖÖ ×ÔÓÒ Ö Ð Ö ÓÖÖ Ó Ò¬ Ó Ò Ð Ö ÓÐ Ò Ö Óº º × Ò ÙÒ Ú Ö× ÓÒ Ø Ö Ø Ú ¸ × Ò Ù× Ö Ô Ð ¸ Ð ÔÖÓ Ñ ÒØÓ insert in binary search tree()º
  • 415.
    4.16. Ejercicios 389 º × Ò ÙÒ Ú Ö× ÓÒ Ø Ö Ø Ú ¸ × Ò Ù× Ö Ô Ð ¸ Ð ÔÖÓ Ñ ÒØÓ remove from search binary tree()º º × Ò ÙÒ Ú Ö× ÓÒ Ø Ö Ø Ú ¸ × Ò ÙØ Ð Þ Ö Ô Ð ¸ Ð ÔÖÓ Ñ ÒØÓ split key rec()º º Ù ÐÓ× Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ ÓÖÖ ×ÔÓÒ ÒØ × Ð Ô ÖØ ÓÒ Ð × Ù ÒØ Ö ÓÐ × ÙÒ Ð Ð Ú 250 244 122 279 41 203 266 293 5 49 156 214 255 270 291 297 4 36 66 163 245 264 65 73 159 189 63 72 54 º × Ö ÙÒ Ú Ö× ÓÒ Ð Ð Ñ Ò ÓÒ ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ ÕÙ ¸ Ù Ò Ó × ØÖ Ø ×ÙÔÖ Ñ Ö ÙÒ ÒÓ Ó ÓÑÔÐ ØÓ¸ × Ó Ð Þ Ö Ù Ð × Ö Ð ÒÓ Ó × Ð ÓÒ Ö ÓÑÓ Ö Þ Ð join exclusive() Ù Ð × × Ö Ò Ð × Ú ÒØ × ×Ø Ò ÓÕÙ ¼º × Ò ÙÒ Ú Ö× ÓÒ Ø Ö Ø Ú ¸ × Ò Ù× Ö Ô Ð ¸ Ð ÔÖÓ Ñ ÒØÓ remove from binary tree()º ÝÙ Ö Ú × ÐÓ× ÙÒ Ñ ÒØÓ× ÜÔÐ Ó× Ò Ü º º ´Ô Ò ¿ ¾µ¹½º ½º ÑÙ ×ØÖ ÕÙ × ÒÓ Ý Ð Ú × ÙÔР׸ ÒØÓÒ × join() Ý join preorder() ×ÓÒ ÕÙ Ú Ð ÒØ ׺ × Ö¸ ÔÖÓ Ù Ò Ü Ø Ñ ÒØ Ð Ñ ×ÑÓ Ö Óк ¾º Ù Ð Ö ÓÐ Ò Ö Ó Ö ×ÙÐØ ÒØ Ô Ö Ð × × Ù ÒØ × × Ù Ò × Ò× Ö ÓÒ ´ µ ¾¾¼ ½ ¼¼ ¿½ ¿ ½¾¾¿ ½¿¿ ¿¾ ½ ½¾¼ ½¼½ ½ ¾ ½ ½¿½ ¿ ´ µ ½¾¼ ¾ ¾¼ ½¼¿ ½¼ ¿¿½ ¿½ ¿½ ½¾¼¿ ½¾ ¼ ½ ¾¾ ½¾¿½ ´ µ ½ ¼ ½¾ ¿ ½½ ¿ ½¿ ½ ½¼ ½ ¼ ½½ ¿ ½¼ ´ µ ¼½ ½ ¿ ½¼¾ ½ ¾ ¾ ¿ ½½ ¿ ¿ ´ µ ½ ½ ¿ ½½ ¾ ½½½ ¿ ½ ¾¾ ´ µ ¿ ½ ½ ¼ ½½½½ ½¾¼ ½½ ½ ¿½ ½¼½ ¾ ½¼ ½ ½½ ½¿ ¿ ¿º Ù Ð Ö ÓÐ Ò Ö Ó Ö ×ÙÐØ ÒØ Ô Ö Ð × × Ù ÒØ × × Ù Ò × Ò× Ö ÓÒ Ò Ð Ö Þ ´ µ ¾ ½ ½ ¼ ½ ½ ¿ ¼ ½¾¿ ½¿ ½ ¿¾ ½ ¾¿½ ½¼ ¾ ½¾ ¼ ½¾½ ¿¾¼
  • 416.
    390 Cap´ ´ ıtulo 4. Arboles ´ µ ¼ ¼ ¿ ½½ ¿¾ ½¾ ¿ ½¿¼¿ ¼ ¾¿ ½¾½ ´ µ ½ ½ ¿¾¼ ½¼¾ ¼ ¿¾ ¾ ¼ ½½½ ½¾½½ ½¾ ½¼ ½¼ ½¿ ¿ ´ µ ¾¼½ ¼ ½½¿ ½¼ ½½ ¾¼¿ ¼ ½ ¾ ¾ ½¿ ¼ ½ ¼ ¾¼ ½ ´ µ ¾¼ ¾¾½ ½ ½½ ½¾¼¼ ½¾½ ½¾ ½¼ ½ ½¼ ¿ ½½¾ ¿ ¿ ½¾¿ ´ µ ¾ ½¼ ¿ ½¼ ½ ½½¾ ¾½¿ ½ ½½ ½½ º Ó× ÐÓ× × Ù ÒØ × Ö ÓÖÖ Ó× ÔÖ ¬ Ó× Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ ´ µ ½¼ ¿ ½¼¼ ½ ¿ ½¾ ½ ½ ½ ¿ ½½ ½¿¿¿º ´ µ ½½ ¿ ½ ½½ ¾ ¾¾ ½¼ ¼ ¿ ¾¼ ½¼¼¿ ½¿ ½ ½¾ ¼ ´ µ ¾ ¾ ¼ ½½ ¾¿¼ ¾ ¼ ¼ ½ ¾ ¼½ ½ ¼ ½¾ ¼ ½½ ½ ¿½ ´ µ ¾¼ ½ ¿ ½ ½ ½¿ ¿ ½ ¾ ¾½ ¼ ¼¼ ¼ ½¼ ½ ½ ½¿¾ ´ µ ½½¾ ¼ ¼ ½½¾¼ ¾ ½¿ ¾ ¾ ¾ ¼ ½ ½½ ¼ ½ ¿ ½¿ ´µ Ù Ð Ö ÓÐ ÓÖÖ ×ÔÓÒ ÒØ º ´µ Ð ÙÐ Ð ÁÈĺ º Ó× ÐÓ× × Ù ÒØ × Ö ÓÖÖ Ó× ×Ù¬ Ó× Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ ´ µ ½¾¿ ¼ ½¼¼ ¿½ ¿¼¿ ½¾ ¼ ½¿ ¿ ½¿ ¾ ½¾¼ ½ ½¿ ½¼ ¿ ¾¿¼ ´ µ ½ ½½ ½¾ ½¼½ ¿ ¾ ½¼ ½¼ ½¼¾ ½¾ ½¾ ½¾ ½½½ ½ ½¿ ¼ ´ µ ¼ ½ ½ ½ ½ ¾ ½¼½¿ ½¿ ½ ½ ½¼ ½½ ¾ ½¼¿¾ ´ µ ¾¿¼ ¿½ ¿½ ½¼ ¿¿ ¿ ¿ ½ ¿¾ ½½ ¿ ¼½ ½¾ ¿¿ ´ µ ¿¼ ¿ ½ ¿ ¿ ½¼ ½¼¼½ ½¾ ½ ½ ¾¾ ¾½ ½¼¿ ´µ Ù Ð Ö ÓÐ ÓÖÖ ×ÔÓÒ ÒØ º ´µ Ð ÙÐ Ð ÁÈĺ ´µ ÑÙ ×ØÖ ÕÙ Ð ×ÙÑ ØÓÖ ÔÐ ÒØ Ò ´ º¿ µ ´Ü º º ´Ô Ò ¿¼ µµ ׸ Ò ØÓ¸ O(n)º º ÓÒ× Ö ÙÒ Ô ØÖ Ò Ö Ó × Ö¸ ÙÒ Ö ÓÐ ØÖ Ò Ö Ó ÓÑÔÐ ØÓ ´ ÓÒ Ð ÔÖÓÔ ØÖ Ò ÙÐ Öµ Ø Ð ÓÑÓ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
  • 417.
    4.16. Ejercicios 391 ¸ Ñ ×¸ ÓÒ Ð ÔÖÓÔ ÓÖ Ò Ó × ÕÙ Ô Ö Ð Ú Ð Ö Óи Ð × Ð Ú × × Ò ÒØ × × ÑÔÖ ×ÓÒ Ñ ÝÓÖ ×º ÓÒ× Ö Ð × Ù ÒØ ÓÔ Ö ÓÒ ×Ó Ö ÙÒ ÒÓ Ó Ù ÐÕÙ Ö p ÙÒ Ô ØÖ Ò Ö Ó Node * child(Node * p, int i) p¸ ÓÑÓ Ý × Ó¸ × ÙÒ ÒÓ Ó ÙÒ Ô ØÖ Ò Ö Óº i × Ð ÓÖ Ò Ð Ð Ó × Ö ´ µ i == 0 Ð Ó Ñ × Ð ÞÕÙ Ö º ´ µ i == 1 Ð Ó Ð ÒØÖÓº ´ µ i == 2 Ð Ó Ñ × Ð Ö º ÈÙ ×ÙÑ Ö¸ ÙÒÕÙ ×Ó ÒÓ × × Ò Ð Ð ÔÖÓ Ð Ñ ¸ ÕÙ Ò Ù× Ò ÙÒ Ó child() Ö ØÓÖÒ NULLº Ð Ó Ø ÚÓ ×Ø ÔÖÓ Ð Ñ × × Ù Ö Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ò Ù ÒØÖ Ð × Ù Ò ÓÖ Ò Ð ×¸ Ô Ö Ñ ØÖÓ× child()¸ Ø Ð × ÕÙ ØÖ Ú × ÐÐ Ñ × ×Ù × Ú × × Ò ÓÒØÖ Ö Ð ÙÐØ ÑÓ Ð Ñ ÒØÓ Ð Ô ØÖ Ò Ö Óº ÈÓÖ ÑÔÐÓ¸ Ô Ö Ð ¬ ÙÖ ÒØ Ö ÓÖ¸ Ð × Ù Ò × 2, 0, 2¸ Р٠и Ô ÖØ Ò Ó × Ð Ö Þ 1 Ô ÖÑ Ø child(1, 2) = 4 −→ child(4, 0) = 11 −→ child(11, 2) = 34 Ð × Ù Ð × × Ñ Ó Ò Ò Ð ÒÓ Ó Ø ÕÙ Ø Ó ÓÒ 34º º Ò Ö Ð Ð ÔÖÓ Ð Ñ ÒØ Ö ÓÖ Ô Ö Ô× n¹Ö Ó׺ º ÜÔÐ ÕÙ ÓÑÓ ÔÙ ÓÖ Ò Ö× ÙÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ Ñ ÒØ Ð Ô×ÓÖØ ÓÒ ÓÒ×ÙÑÓ ×Ô Ó O(1)º º Ò × Ð Ö ­ Ü ÓÒ Ð Ö Ó ÒØ Ö ÓÖ¸ ÑÔÐ ÒØ Ð Ô×ÓÖØ ×Ó Ö Ð ×Ø × Ø ÔÓ Dnode<T>º ¼º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ö ÓÖÖ ÙÒ × Ù Ò n Ð Ñ ÒØÓ× Ý Ò Ù ÒØÖ ÐÓ× m n Ñ ÒÓÖ × Ð Ñ ÒØÓ׺ ÜÔÐ ÕÙ Ø ÐÐ Ñ ÒØ ÓÑÓ × ÙØ Ð Þ Ð Ô Ô Ö ÓÒØ Ò Ö Ý Ñ ÒØ Ò Ö¸ Ü Ø Ñ ÒØ ¸ m Ð Ñ ÒØÓ× Ñ ÕÙ × Ò×Ô ÓÒ Ð × Ù Ò º ½º × Ò ÙÒ Ì DynArrayHeap<T> ÙÒ Ñ ÒØ Ó Ò Ð Ì DynArray<T> ´Ü ¾º½º ´Ô Ò ½µµº × ÙØ ÐÓ× Ø Ñ ÒÓ× Ù Ó× Ð Ö ØÓÖ Ó¸ × Ñ ÒØÓ Ý ÐÓÕÙ º ÙÒ Ö Ø Ö Ó Ù ÒÓ Ô Ö ÓÖØ Ö Ð ÖÖ ÐÓ Ñ Ò Ö Ø Ð ÕÙ Ð ÓÒ¹ ×ÙÑÓ Ñ ÑÓÖ × Ñ Ò ÑÓº ¾º ÅÓ ¬ÕÙ Ð Ì BinHeap<Key> Ô Ö ÕÙ ÒÓ Ó ÔÖ × Ò Ð ÔÙÒØ ÓÖ Ð Ô Öº ¿º ÅÓ ¬ÕÙ Ð Ì BinHeap<Key> Ô Ö ÔÖ × Ò Ö Ð Ð ×Ø Ó ×º ÍØ Ð Ô Ö¹ Ñ Ò ÒØ Ñ ÒØ ÙÒ × Ù Ò ÕÙ Ð Ö Ù Ð ÒÙÑ ÖÓ Û Ý last¸ Ñ Ò Ö Ø Ð ÕÙ ÑÓ ¬ ÓÒ Ð Ô Ð Ù× Ô Ö Ù Ö ÐÓ× ÒÓ Ó× ØÙ Ð Þ Öº º ÑÙ ×ØÖ ÔÓÖ Ò Ù ÓÒ ÕÙ ÙÒ Ô n ÒÓ Ó× Ø Ò n/2 Ó ×º º ÓÒ× Ö ÙÒ Ð ×Ø ÒÐ Þ Ö ÔÖ × ÒØ Ñ ÒØ Ð Ì Dnode<int>º ÓÒ× Ö Ð × Ù ÒØ ÒØ Ö Þ
  • 418.
    392 Cap´ ´ ıtulo 4. Arboles Dnode<int> * los_mas_grandes(Dnode<int> & l, int m) Ä Ù Ð Ö ØÓÖÒ ÙÒ ÒÙ Ú Ð ×Ø ÓÒØ ÒØ Ú Ð × ÓÔ × ÐÓ× m Ñ ÝÓÖ × ÒÙÑ ÖÓ× ÐÑ Ò Ó× Ò lº × Ò ÒרÖÙÑ ÒØ Ð ÖÙØ Ò Ò Ù ×Ø ÓÒ Ð Ñ Ò Ö Ñ × ¬ ÒØ × Ò ÕÙ × Ø Ò ÕÙ ÓÖ Ò Ö Ð Ð Ð ×Ø º º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ØÓÑ ÓÑÓ ÒØÖ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó Ò¬ Ó ÙÒ Ö ÓÐ Ý Ö ØÓÖÒ ÓÑÓ × Ð Ð Ö ÓÖÖ Ó ÔÓÖ Ò Ú Ð ×º ÆÓ × ÓÒרÖÙ Ö Ð Ö Óк º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ö ÓÑÓ ÒØÖ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ Ý Ö ØÓÖÒ ×Ù ÁÈĺ ÆÓ × ÓÒרÖÙ Ö Ð Ö Óк º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ö ÓÑÓ ÒØÖ Ð Ö ÓÖÖ Ó ×Ù¬ Ó ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ Ý Ö ØÓÖÒ ×Ù ÁÈĺ ÆÓ × ÓÒרÖÙ Ö Ð Ö Óк º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ù ÒØ Ð ÒØ ÒÓ Ó× Ò Ð i¹ × ÑÓ Ò Ú Ð ÙÒ Ö ÓÐ Ò Ö Óº ´·µ ¼º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ù ÒØ Ð ÒØ ÒÓ Ó× Ò ÓÑÔÐ ØÓ× ÒÓ Ó × ÙÒ Ö ÓÐ Ò Ö Óº ½º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ù ÒØ Ð ÒØ ÒÓ Ó× ÐÐ ÒÓ× ÙÒ Ö ÓÐ Ò Ö Óº ¾º ËÙÔÓÒ ÕÙ ÒÓ Ó ÔÓ× ÙÒ ÑÔÓ ÓÒ Ð nextº × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÒÐ ØÓ Ó× ÒÓ Ó× Ð Ö ÓÐ × ÙÒ Ð Ö ÓÖÖ Ó Ò¬ Óº ¿º È Ö ÐÓ× × Ù ÒØ × Ô Ö × Ö ÓÐ × Ö ÔÖ × ÒØ Ó× ÓÒ ×Ù× Ö ÓÖÖ Ó× ÔÖ ¬ Ó׸ ÓÒ×¹ ØÖÙÝ Ð Ö ÓÐ ÔÖÓ Ù ØÓ Ð ÓÔ Ö ÓÒ join()º ´ µ ¯ ½ ¾ ¾¾ ¿ ½ ½¾¿ ½¼ ½¾¾ ¯ ½¿ ¾½ ¿¿ ¼ ½¾ ¾ ½¼ ½¾ ½ ¿ ´ µ ¯ ½¾ ¾ ¾¿ ¾¼ ½ ½½ ¾½ ½¼ ¾ ¿½ ½ ¼ ½¾½ ½¾ ¯ ¿¿ ¾ ½ ½½ ¾ ¼ ½½¼ ½¼ ½ ½ ¾ ´µ ¯ ½¾ ¾ ¾ ¿¾ ½¾¿ ½¼¼ ½ ¼ ¿ ½¼ ½½ ½¿ ½¿ ¯ ¾ ¿ ¿½ ¾ ½ ½¿½ ½½¼ ½¼ ½½ ½¾ ½ ¿ ´ µ ¯ ¼ ½¿ ½½ ½ ¾ ½¾¾ ¿ ½½ ½ ¯ ¿¿ ¾¿ ¾¾ ¾ ½ ¾½ ¿ ¿ ¿ ½¼ ½½ ½¿ ´µ ¯ ½½ ¾ ½¼½ ¾ ¼ ½ ½¼ ½½ ½¿ ¯ ½¾ ¾¿ ½ ½¾¿ ½¼¿ ½ ½½ ½¾ ½ ¼ ´µ ¯ ½¾¿ ½ ¿¿ ½½¾ ¼ ½¼ ½¼ ½¼ ½¾½ ½¾¾ ½ ¯ ¾¼ ½ ¾ ¿ ½¿ ¾ ½ ½¼ ½ ¾ º Ó× 2 Ö ÓÐ × Ò Ö Ó× T1 Ý T2¸ × ¬Ò Ð Ö Ð ÓÒ × × Ñ ØÖ Ó ¸ ÒÓØ ÓÑÓ T1 T2 ÓÑÓ T1 = T2 = ∅ =⇒ T1 T2 ∨ T1 T2 ⇐⇒ T1 = T2 = ∅ =⇒ ∗ Ö Þ(T1 ) ∗Ö Þ(T2 ) ∧ Ä(T1 ) Ê(T2 ) ∧ Ä(T1 ) Ê(T2 ) × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ØÓÑ ÓÑÓ ÒØÖ Ó× Ö ÓÐ × Ý Ø ÖÑ Ò × ×ÓÒ × Ñ ØÖ Ó׺
  • 419.
    4.16. Ejercicios 393 º × Ò ÑÔÐ ÒØ ÙÒ Ú Ö× ÓÒ Ø Ö Ø Ú ¸ × Ò Ù× Ö Ô Ð ¸ Ð Ð ÓÖ ØÑÓ inorder position()º º ÅÓ ¬ÕÙ Ð ÔÖ Ñ Ø Ú insert in pos() ÜÔÐ Ò Ü º½½º¿ ´Ô Ò ¿ µ Ô Ö ÕÙ Ú Ð ÕÙ Ð Ð Ú Ð ÒÓ Ó Ò× ÖØ Ö ÒÓ Ú ÓÐ Ð ÔÖÓÔ ÓÖ Ò ÙÒ º º × Ò ÙÒ Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓ ÕÙ Ð ÙÐ Ð ÔÓ× ÓÒ Ò¬ ÙÒ Ð Ú Ð Ö Óк º Ó ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ ÓÒ Ö Ò Ó× Ý ÙÒ Ð Ú Ù×ÕÙ ¸ × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ö ØÓÖÒ Ð ÔÓ× ÓÒ Ò¬ Ð Ð Ú × ×Ø × Ò Ù ÒØÖ Ò Ð Ö Óи Ó Ð ÔÓ× ÓÒ Ò¬ ÕÙ ØÓÑ Ö Ð Ð Ú ×ÔÙ × Ð Ò× Ö ÓÒº º ÁÑÔÐ ÒØ ÙÒ Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓ ÕÙ Ö Ð Ð ÙÒ ÓÒ Ò Ö Ð Ó× º ½¼¼º ÁÑÔÐ ÒØ ÙÒ Ð ÓÖ ØÑÓ Ø Ö Ø ÚÓ¸ ÕÙ ÒÓ Ù× Ô Ð ¸ ÕÙ Ö Ð Ð ÙÒ ÓÒ Ò Ö Ð Ó× º ½¼½º × Ò ÙÒ Ì × Ó Ò Ö ÓÐ × ÓÒ Ö Ò Ó ÕÙ ÑÓ Ð ÖÖ ÐÓ× ¬ ÒØ ׺ ½¼¾º × Ò ÙÒ Ú Ö× ÓÒ Ø Ö Ø Ú ¸ × Ò Ù× Ö Ô Ð ¸ Ð Ð ÓÖ ØÑÓ split key rec() Ý ÕÙ Ð Ö ÓÐ ÒØ ØÓ × Ð Ð Ú Ý × Ò Ù ÒØÖ Ò Ð Ö Óк ´··µ ½¼¿º × Ò ÙÒ Ú Ö× ÓÒ Ø Ö Ø Ú Ð ÙÒ ÓÒ split pos rec() ÜÔÐ Ò Ü º½½º ´Ô Ò ¿ µº ½¼ º × Ò ÙÒ ÖÙØ Ò ÕÙ Ù×ÕÙ ÙÒ Ð Ú Ò ÙÒ Ö ÓÐ Ò Ö Ó Ý¸ Ò ×Ó Ò ÓÒØÖ ÖÐ ¸ ÖÓØ Ð ÒÓ Ó ×Ø Ð Ö Þº ½¼ º ÑÙ ×ØÖ ÕÙ Ð Ö ÓÐ Ò Ö Ó ÔÖÓ Ù Ó ÔÓÖ insert in binary search tree() ÓÒ Ð × Ù Ò Ò× Ö ÓÒ S =< k1, k2, . . . , kn > × Ü Ø Ñ ÒØ Ù Ð Ð ÔÖÓ Ù Ó ÔÓÖ insert root() ×Ó Ö Ð × Ù Ò ÒÚ ÖØ S =< kn, kn−1, . . . , k1 >º ½¼ º × Ò ÙÒ Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓ¸ × Ó Ò ÖÓØ ÓÒ ×¸ ÕÙ Ö Ð Ð Ò× Ö ÓÒ ÔÓÖ Ð Ö Þ Ò ÙÒ º Ð Ð ÓÖ ØÑÓ Ù× Ö Ð ÒÓ Ó ÜØ ÖÒÓ ÕÙ Ð Ö Ö Ð ÒÙ ÚÓ ÒÓ Ó Ý ×ÔÙ × ÖÓØ Ö Ö ÙÖ× Ú Ñ ÒØ ×Ù Ô Ö ×Ø ÕÙ ×Ø Ú Ò Ò Ö Þº ½¼ º ´Sugerido por Andr´s Arciaµ ÜÔÐ ÕÙ Ð ÓÔ Ö ÓÒ ÕÙ Ö Ð Þ Ð × Ù ÒØ e ÖÙØ Ò Node * program(Node * root) { if (root == NullPtr) return NullPtr; while (RLINK(root) != NullPtr) root = rotate_to_left(RLINK(root)); program(LLINK(root)); return root; } ½¼ º × Ò ÙÒ ÖÙØ Ò ÕÙ × Ð ÓÒ ÙÒ ÒÓ Ó Ò Ð i¹ × Ñ ÔÓ× ÓÒ Ý ÐÓ ÖÓØ Ð ÒÓ Ó ×Ø Ð Ö Þº ½¼ º ÑÙ ×ØÖ ÕÙ Ð × ÔÖ Ñ Ø Ú × insert root rec() Ý insert root() × ÑÔÖ ÔÖÓ¹ Ù Ò Ö ÓÐ × ÕÙ Ú Ð ÒØ ׺
  • 420.
    394 Cap´ ´ ıtulo 4. Arboles ½½¼º Ó ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ Ý Ð Ð ÓÖ ØÑÓ Ò× Ö ÓÒ ÔÖ × ÒØ Ó Ò Ü º º¿ ´Ô Ò ¿¿ µ¸ Ð ÙÐ Ð Ú Ö ÒÞ ×Ó Ö Ð ÒÙÑ ÖÓ ÒÓ Ó× Ú × Ø Ó× Ò ÙÒ Ù×ÕÙ º ´··µ ½½½º ÈÓÖ ÕÙ Ð Ú ÐÓÖ Node::MaxHeight = 80 × Ù Ó Ô Ö Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ ½½¾º Ó ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ Ý Ð Ð ÓÖ ØÑÓ Ò× Ö ÓÒ Ò Ð Ö Þ ÔÖ × ÒØ Ó Ò Ü º º ´Ô Ò ¿ ¿µ¸ Ð ÙÐ Ð × ×Ô Ö ÒÞ × Ý Ú Ö ÒÞ × Ð × ÒØ × ÒÓ Ó× Ú × Ø Ó× Ò Ù×ÕÙ × Ü ØÓ× × Ò ÖÙ ØÙÓ× ×º ´··µ ½½¿º Ó ÙÒ ¸ × Ò ÙÒ Ð ÓÖ ØÑÓ ¬ ÒØ ÕÙ ÜØÖ ÙÒ Ö Ò Ó Ð Ú × ÒØÖ i Ý j¸ j > iº ´··µ ½½ º Ó× Ó× Ö ÓÐ × A1 Ý A2¸ × Ò ÙÒ Ð ÓÖ ØÑÓ ¬ ÒØ ÕÙ Ò× ÖØ A1 Ô ÖØ Ö Ð ÔÓ× ÓÒ i A2º ½½ º ÓÒ× Ö Ð ÔÖ Ñ Ø Ú remove by pos() ÜÔÐ Ò Ü º½½º ´Ô Ò ¿ ¼µº × Ò ÙÒ Ú Ö× ÓÒ × Ò Ð Ñ Ò ÓÒ Ð Ö Þ Ý ÓÒ Ø Ò ÓÒ ÐÓ× ×Ù Ö ÓÐ × Ö ×Ø ÒØ ׺ ½½ º ÅÓ ¬ÕÙ ÐÓ× Ð ÓÖ ØÑÓ× Ò× Ö ÓÒ¸ Ð Ñ Ò ÓÒ¸ ÓÒ Ø Ò ÓÒ Ý Ô ÖØ ÓÒ Ô Ö ÕÙ ÙÒ ÓÒ Ò Ò Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ ÜØ Ò Ó׺ ½½ º × Ò ÙÒ Ð ÓÖ ØÑÓ Ø Ö Ø ÚÓ ¬ ÒØ ÕÙ ØÙ Ð ÓÒ Ø Ò ÓÒ Ó× Ö ÓÐ × Ò Ö Ó׺ ´·µ ½½ º × Ò ÙÒ Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓ ¬ ÒØ ÕÙ ØÙ Ð ÙÒ ÓÒ Ó× Ö ÓÐ × Ò Ö Ó׺ ½½ º × Ò ÙÒ Ð ÓÖ ØÑÓ Ø Ö Ø ÚÓ ¬ ÒØ ÕÙ ØÙ Ð ÙÒ ÓÒ Ó× Ö ÓÐ × Ò Ö Ó׺ ´·µ ½¾¼º × Ò ÙÒ Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓ ¬ ÒØ ÕÙ ØÙ Ð ÒØ Ö× ÓÒ Ó× Ö ÓÐ × Ò Ö Ó׺ ½¾½º × Ò ÙÒ Ð ÓÖ ØÑÓ Ø Ö Ø ÚÓ ¬ ÒØ ÕÙ ØÙ Ð ÒØ Ö× ÓÒ Ó× Ö ÓÐ × Ò Ö Ó׺ ´·µ ½¾¾º × Ò ÙÒ Ð ÓÖ ØÑÓ Ö ÙÖ× ÚÓ ¬ ÒØ ÕÙ ØÙ Ð ÖÒ Ó× Ö ÓÐ × Ò ¹ Ö Ó× T1 ÝT2º ×ØÓ ×¸ T1 − T2 Ö ØÓÖÒ Ö Ð Ö ÓÐ Ò Ö Ó T1 Ü ÔØÓ ÕÙ ÐÐ × Ð Ú × ÕÙ × Ò Ù ÒØÖ Ò Ò T2º ½¾¿º × Ö ÙÒ ÔÖÓ Ö Ñ ÕÙ Ò× ÖØ Ð × n Ð Ú × Ñ Ò Ö ÕÙ Ð Ö ÓÐ ÕÙ ÕÙ Ð ¹ Ö Óº ´·µ ½¾ º Ò Ù ÒØÖ ÙÒ ÜÔÖ × ÓÒ Ò Ð Ø ÕÙ Ò Ö Ð ×Ù × ÓÒ Ò× Ö ÓÒ × Ô Ö ÕÙ Ð Ö ÓÐ ÕÙ ÕÙ Ð Ö Óº ´··µ Ayuda: ÓÒ× Ö n = 2k × Ö¸ n × ÙÒ ÔÓØ Ò Ü Ø Ó׺ ½¾ º Ê Ð ÙÒ Ð ÓÖ ØÑÓ ÕÙ ØÙ Ð ÙÒ ÓÒ Ó× Ö ÓÐ × Ò Ö Ó× Ù×Õ٠ܹ Ø Ò Ó׺ Ð Ö ÓÐ Ö ×ÙÐØ ÒØ ÒÓ Ø Ò Ö Ð Ú × Ö Ô Ø ×º
  • 421.
    4.16. Ejercicios 395 ½¾ º Ê Ð ÙÒ Ð ÓÖ ØÑÓ ÕÙ ØÙ Ð ÒØ Ö× ÓÒ Ó× Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ ÜØ Ò Ó׺ Ð Ö ÓÐ Ö ×ÙÐØ ÒØ ÒÓ Ø Ò Ö Ð Ú × Ö Ô Ø ×º ½¾ º ÅÓ ¬ÕÙ Ð × ÖÙØ Ò × insert root rec() insert root() ÔÖ × ÒØ × Ò º º Ô Ö ÕÙ Ñ Ò Ò Ö ÓÐ × Ò Ö Ó× ÜØ Ò Ó׺ ½¾ º ØÙ Ñ × Ö Ò Ñ ÒØÓ Ô Ö ØÓ Ó× ÐÓ× Ö ÓÖÖ Ó× ÑÔÐ ÒØ Ó× Ò BinNode Utilsº ÙÒ Ö ÔÓÖØ Ø ÐÐ Ó ×Ù× ÜÔ Ö Ñ ÒØÓ× ÕÙ × Ò Ð ÔÓÖ Ú Ö× ÓÒ Ö ÓÖÖ Ó Ð ÒÙÑ ÖÓ ÒÓ Ó× Ý Ð Ø ÑÔÓ ØÓØ Ð Ö ÓÖÖ Óº ½¾ º × Ò ÑÔÐ ÒØ ÙÒ Ø ÔÓ ×ØÖ ØÓ ØÓ ÕÙ Ö ÔÖ × ÒØ ÙÒ Ö ÓÐ Ò Ö Ó ÕÙ Ó ÙÔ ×Ô Ó Ñ Ò ÑÓº × Ö¸ Ð ÑÔÐ ÒØ ÓÒ Ö Ñ Ò Ö ÐÓ× ØÖ × Ø ÔÓ× ÒÓ Ó× × Ò Ð Ó× Ò Ü º º½ ´Ô Ò ¾ µ¹½ ÓÑÔÐ ØÓ¸ Ò ÓÑÔÐ ØÓ Ý Ó º ½¿¼º × Ò ÙÒ Ì Ù×Ó Ò Ö Ð ÕÙ ÑÓ Ð Ö ÓÐ × n¹Ö Ó× × Ó× Ò Ð Ì DynArray<T>º ½¿½º × n Ð Ú ×¸ ÑÙ ×ØÖ ÕÙ Ü ×Ø Ò n(n ) Ö ÓÐ × Ò Ö Ó× Ö ÒØ × ÕÙ ÐÑ ¹ 2 1 Ò Ò Ð × n Ð Ú ×º ½¿¾º Ó Ð × Ù ÒØ Ö ÓÐ ÀÙ«Ñ Ò 539 217 322 103 114 143 179 48 55 55 59 68 75 88 91 e 24 24 26 29 29 30 33 35 37 38 44 44 l i o r s a 12 12 13 13 14 15 16 17 18 20 21 23 d m t u n n 6 6 7 7 7 8 8 8 8 9 10 10 b q . f , g p y 3 4 4 4 4 4 5 5 v D c 2 2 2 2 2 2 2 2 2 3 o u ´ ´ E L h 1 1 1 1 1 1 1 1 1 1 T R ´ ´ S ´ J B a ı e x 0 1 ¬ P Ó ¬ÕÙ Ð × Ù ÒØ Ò Ø× ½¼¼¼½¼½¼¼¼¼½½½½¼½¼½½¼½½½½¼¼¼¼½¼¼¼½½½½¼¼½½½¼¼¼¼¼¼¼¼½½½½½¼½¼½½¼½¼½¼¼ ¼½¼½½½¼½½¼½½¼½½½½¼¼½¼½¼¼¼½½½½½½½¼¼½¼¼½½¼¼½¼¼½¼¼½½¼½¼½½¼¼¼¼½¼½¼½¼½¼
  • 422.
    396 Cap´ ´ ıtulo 4. Arboles ¼¼½½½½½½½¼½½¼½½¼½½½¼½¼¼¼½¼½½¼¼½½¼½½¼¼¼½¼¼¼½¼½½¼½½¼¼½¼½¼½½½½¼½¼¼¼½½ ½½½½½½¼¼½¼½½½½¼½¼½½¼¼½¼½¼¼¼½½½½½½¼½¼¼¼¼½½¼¼¼¼½¼½¼¼¼½¼¼½¼¼¼½½½½¼¼½¼ ¼½½½¼¼½¼½¼½½½½¼½½½½½½½¼¼¼½½½¼¼½½½¼¼¼½½¼¼¼¼½¼½½½½¼½½¼½¼½½¼¼½½½¼¼¼¼¼ ¼½¼½½½½¼¼¼½¼¼½¼½½¼½¼¼½¼½¼½¼¼½¼½½½¼¼½½½½½½¼½¼¼¼¼½½½¼¼½¼½¼½½½½½¼½½½¼ ½½¼¼½¼¼¼½½½¼¼¼½¼½½½½¼½½½¼¼¼½½¼¼¼½½¼½½¼¼½½½¼¼½¼½¼½½½½¼½½½½½½½¼½¼¼¼¼ ½½½½½¼½½½¼¼½½¼¼¼¼½¼¼¼¼¼¼½¼¼½½¼½½¼¼½½¼½½¼¼½¼½¼½¼½½½½¼½½½¼¼¼½¼½¼¼½¼½ ½½¼¼½½½½½½¼½¼¼¼¼¼¼¼½¼¼¼¼¼½¼¼½½½½½½¼¼½½¼½¼½½¼½½¼½½½¼¼¼¼¼¼½½¼½¼¼½½½½ ¼¼¼¼½½½¼½½¼¼½¼½½½¼½¼½¼½½½¼½¼½¼½½¼½¼½¼¼¼½¼½¼½¼½½¼½½½½½¼½¼½¼½¼½½¼¼½¼ ½¼½½½½¼½½½¼¼¼½½½½¼½¼½½¼¼½¼½¼¼¼½½¼¼½½¼½¼½½¼½¼½¼¼¼½¼¼¼½¼¼¼¼¼½¼¼½½½½½ ½¼¼½½¼½¼½½¼½½¼½½½¼¼¼¼¼¼½½¼½¼¼½½½½¼¼¼¼½½½¼½½¼¼½¼½½½¼½¼½½¼½½½½½¼½¼¼¼ ¼½½½½½¼¼¼½½½½¼¼½¼½¼½½¼¼¼¼¼¼¼¼½½½½½½¼¼½½¼½½¼½½¼¼½¼½¼¼½¼½½½½½¼½½½½¼½ ¼½¼½½½¼½¼¼½¼½¼½¼¼½½¼½¼½¼¼¼¼½½¼½½¼¼¼½½¼½½½¼¼¼½¼½½¼½¼½¼½½½½¼½½½½½½½½ ¼¼¼¼½¼¼½¼½½½¼¼½¼¼½½¼¼½½½½¼½½½½½½½¼¼¼¼½½½¼½½¼¼½¼½½½½¼½½¼½½¼½½½½¼¼½½ ½½½¼¼½¼¼½¼½¼½½¼½½½½¼¼½½¼½¼½¼½¼½¼½½¼¼¼½¼½¼½½¼¼¼¼½½½½¼¼½¼¼¼½½¼¼¼¼¼¼¼ ½½¼¼¼½½½¼½¼½½½¼¼¼½½½¼¼½½½½¼½¼½¼½½¼¼½¼½¼¼½¼¼½¼½¼½¼½½½¼¼¼¼¼¼½¼½½½¼¼¼ ½½½¼¼½½½½½¼¼¼¼¼½¼¼½¼¼¼½¼½½¼½½½½¼¼½½¼½¼¼¼¼¼½½½¼½½¼¼½¼½½½¼¼¼½¼½½½½¼½ ¼½½½½¼½¼¼½½¼½¼¼¼¼¼¼¼¼½¼½½½½¼½¼½½½¼¼¼¼¼¼½¼½½½½¼½½½¼½½¼½½¼¼½¼½¼¼½½¼¼ ½¼½½½½½½¼¼¼¼¼¼½¼½¼½¼½¼½½½¼½½¼½½¼½¼½½½¼¼¼½½¼¼½¼½¼¼½¼½½½½½¼½½¼¼½½¼¼½ ½¼½¼½½¼½¼½¼¼¼½¼¼¼½¼¼¼¼¼½¼¼½½½½½½¼¼½½¼½¼½½¼½½¼½½½¼¼¼¼¼¼½½¼½¼¼½½½½¼¼ ¼½½½¼¼½¼½¼½½½½½¼¼½¼¼½¼¼½¼¼½½¼¼½¼½¼½½½½¼½½½½½½½¼¼¼½½½¼¼½½½½¼¼¼½½¼½½ ¼½¼¼½½½¼¼½½¼½¼¼¼¼¼¼¼½¼½½½¼¼¼½½½¼¼½½½¼½¼½¼¼¼½½¼½½½½¼¼¼½½¼½¼½¼½½½½½½ ¼¼½½½½¼½½½½½½½¼¼¼½¼½½½½¼½¼½½½½¼¼¼½½¼½¼½¼½¼½½¼¼¼¼¼¼¼¼½½½½¼½¼½½½¼¼½¼ ¼½½¼¼½¼¼½¼½¼½¼½¼½½¼½¼¼¼¼¼½½½¼½½¼¼½¼½½½½¼¼½¼½½½¼½¼½½¼½½½½½¼¼¼¼¼¼½¼½ ½½¼¼¼½½½¼¼½½½¼¼½¼½¼½½¼¼½¼½¼¼½½¼¼½½½¼¼½½½¼¼¼½¼½½½½¼½¼½½½½¼¼¼½½¼½½¼¼ ¼¼½½½¼¼½¼¼½¼½¼½¼½¼¼¼½½¼¼½½¼½¼½½¼½¼½¼¼¼½¼¼¼½¼¼¼¼¼½¼¼½½½½½½¼¼½½¼½¼½½ ¼½½¼½½½¼¼¼¼¼¼½½¼½¼¼½½½½¼¼¼¼½½½¼½½¼¼½¼½½½½¼½½½¼½½½½¼¼½¼½½½½½½½¼½½½¼ ¼½¼½½¼¼½¼½½½½¼½¼¼¼½½¼¼½½½½¼¼¼½¼½¼½¼½¼½½½¼¼½¼¼¼½¼½½¼½½¼¼½¼½¼½½¼½¼¼½ ½½¼¼¼¼½½¼¼½½¼½¼½¼¼¼¼½½¼¼¼¼½½½¼½¼¼¼¼½¼½½½½½½¼¼½¼½¼¼½½½¼½½½½½¼½¼½¼¼½ ¼½¼½¼½¼¼¼½½¼¼½½½½¼¼¼¼½¼¼¼¼¼½½½¼½½¼¼½½½½½½½¼¼½¼¼¼½½¼½½½¼¼¼¼¼¼½¼½¼½¼ ¼¼½½½¼¼¼½¼½½¼½½¼¼½¼½½¼½½¼½¼¼½½½¼¼½½¼½¼½¼½½½½½½½¼¼½¼¼¼½½¼½½½¼¼½½½¼¼ ¼½¼½½¼½½¼¼½¼½½¼½½¼½¼¼½½½¼¼¼¼½½½½½½½¼½½¼½½¼½½½½¼¼½¼¼¼¼¼¼½½½¼¼½¼½½½¼ ¼¼¼¼¼½¼¼¼¼½¼½¼½½½½¼½½½½½½½½¼¼¼½½½¼½½¼½¼¼½½½¼¼¼¼½½¼¼½½¼½¼½½¼½¼½½½½½ ½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½¼¼¼¼½½½¼¼½½½½¼¼½½¼¼¼¼¼¼½¼½½½½¼¼¼½¼ ½½½¼½½¼¼½½¼½¼½¼½½½½¼¼¼¼½½½½¼½½½½¼¼½½¼¼¼¼¼¼½¼½¼½¼½½¼½¼½¼½½½¼½¼¼¼ ½¿¿º Ë S ÙÒ × Ù Ò Ó ¬ × ÙÒ Ð Ð ÓÖ ØÑÓ ÀÙ«Ñ Òº × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ð Ð × Ù Ò ¸ ר Ò ÐÓ× ÔÖ ¬ Ó× ×Ø ÒØÓ× Ý Ö ØÓÖÒ Ð Ö ÓÐ ÀÙ«Ñ Ò ÓÖÖ ×ÔÓÒ ÒØ ÐÓ× ÔÖ ¬ Ó׺ ´·µ ½¿ º Ù Ð × Ð ÕÙ Ú Ð Ò ÒØÖ ÙÒ Ô Ð Ö Ý ÙÒ ÒÙÑ ÖÓ ÛÝ ½¿ º Ð ÙÐ Ð Ö ÓÐ ÓÔØ ÑÓ Ô Ö ÐÓ× × Ù ÒØ × ÓÒ ÙÒØÓ× Ð Ú × Ý ÔÖÓ Ð × ´ µ 10 17 30 31 63 68 74 80 88 93 99 103 114 143 14 0.00003 0.00046 0.00320 0.01389 0.04166 0.09164 0.15274 0.19638 0.19638 0.15274 0.09164 0.04166 0.01389 0.00320 0.00046 ´ µ 17 39 42 53 54 66 75 85 89 90 96 98 115 119 143 0.00047 0.00470 0.02194 0.06339 0.12678 0.18594 0.20660 0.17708 0.11806 0.06121 0.02449 0.00742 0.00165 0.00025 0.00002
  • 423.
    4.16. Bibliograf´ ıa 397 ´ µ 6 8 12 40 59 62 65 69 90 103 109 118 128 134 138 0.00475 0.03052 0.09156 0.17004 0.21862 0.20613 0.14724 0.08113 0.03477 0.01159 0.00298 0.00058 0.00008 0.00001 0.00000 ´ µ 18 21 34 41 53 54 56 57 65 77 98 104 122 124 131 0.00000 0.00000 0.00001 0.00008 0.00058 0.00298 0.01159 0.03477 0.08113 0.14724 0.20613 0.21862 0.17004 0.09156 0.03052 ½¿ º Ð ÙÐ Ð × ×ØÖ Ù ÓÒ × ÔÖÓ Ð Ô Ö ÙÒÓ ÐÓ× Ö ÓÐ × Ð ÔÖ ÙÒØ ÒØ Ö ÓÖº ½¿ º ÄÓ× Ö ÓÐ × ×Ø Ø Ó× ÓÔØ ÑÓ× ÔÖ × ÒØ Ó× Ò Ü º½ ´Ô Ò ¿ µ ×ÙÑ Ò ÕÙ Ð × Ð Ú × Ù× Ö × ÑÔÖ ×Ø Ò ÔÖ × ÒØ ׺ ÓÒ× Ö Ð ÔÖÓ Ð Ñ ÓÒרÖÙ Ö ÙÒ Ö ÓÐ ÓÔØ ÑÓ ÓÒ × ÔÓ× Ð ØÙ Ö Ù×ÕÙ × Ò ÖÙ ØÙÓ× ×º × ×Ø ×Ó¸ × ¬Ò ÙÒ ÖÖ ÐÓ ÓÒ Ð q Ñ Ò× ÓÒ n + 1 ÓÒ qi Ö ÔÖ × ÒØ Ð ÔÖÓ Ð ÕÙ ÙÒ Ð Ú Ù×ÕÙ ×Ø ÓÑÔÖ Ò ÒØÖ ki Ý ki+1 Ø Ð ÕÙ i=1 pi + n n i=0 qi = 1º ´ µ È Ö ×Ø Ú Ö ÓÒ Ð ÔÖÓ Ð Ñ ¸ ¬Ò Ð ÐÓÒ ØÙ Ð Ñ ÒÓ ÔÓÒ Ö º ´ µ ÅÓ ¬ÕÙ Ð Ð ÓÖ ØÑÓ ÔÖ × ÒØ Ó Ò Ü º½ ´Ô Ò ¿ µ Ô Ö ÕÙ × ÓÒ× Ö Ò Ù×ÕÙ × Ò ÖÙ ØÙÓ× ×º ÝÙ ÓÒ× Ö ÕÙ Ð Ù×ÕÙ Ò ÖÙ ØÙÓ× × Ö Ð Þ ÙÒ ÒÓ Ó Ü¹ Ø ÖÒÓº ´·µ ½¿ º ´Tomado y traducido de Lewis-Denenberg [14]µ Ë ÙÒ ÐÓ× Ø ÖÑ ÒÓ× ÔÖ × ÒØ ¹ Ó× Ò Ü º½ ´Ô Ò ¿ µ¸ × TREE(j,k)¸ 1 ≤ j ≤ k ≤ n¸ Ð Ö Þ Ð Ö ÓÐ Ò Ö Ó ÓÔØ ÑÓ Ô Ö Ð ÓÒ ÙÒØÓ Ð Ú × kj, . . . , kkº ´ µ ÑÙ ×ØÖ ÕÙ × 1 ≤ j ≤ k ≤ n¸ ÒØÓÒ × Ü ×Ø Ò Ö ÓÐ × ÓÔØ ÑÓ× Ø Ð ÕÙ TREE(j,k - 1) ≤ TREE(j,k) ≤ TREE(j,k)º ÁÒØÙ Ø Ú Ñ ÒØ ¸ ×ØÓ ÕÙ Ö Ö ÕÙ Ò Ö ÙÒ ÒÙ Ú Ð Ú Ð ÜØÖ ÑÓ Ö Ó Ð × Ù Ò ÒÓ Ù× ÕÙ Ð Ö Þ Ð Ö ÓÐ ÓÔØ ÑÓ × ×ÔÐ Ð Ö º Ò ÐÓ Ñ ÒØ ¸ ×Ù ÐÓ Ñ ×ÑÓ × Ð Ð Ú × Ò× ÖØ ÔÓÖ Ð ÜØÖ ÑÓ ÞÕÙ Ö Óº ´ µ ÑÙ ×ØÖ ÕÙ Ð Ù×ÕÙ Ð ×Ù Ö ÓÐ ÓÔØ ÑÓ × Ö ×ØÖ Ò TREE(j,k - 1) ≤ TREE(j,k) ≤ TREE(j,k)¸ ÒØÓÒ ×¸ Ô Ö Ú ÐÓÖ i Ð Ð ÓÖ ØÑÓ ÔÖ × Ò¹ Ø Ó Ò Ü º½ ´Ô Ò ¿ µ¸ Ð for (j = ...) × O(n) ݸ ÔÓÖ Ò ¸ Ð Ð ÓÖ ØÑÓ ÐÓ Ð × O(n2)º Ayuda: ÆÓ × ÔÙ ØÙ Ö Ð ÔÖÙ × × Ù× ÙÒ Ð Ñ Ø Ô Ö Ð for (j = ...) Ý ÒØÓÒ × ÑÙÐØ ÔÐ Ö ÔÓÖ nº Ò ×Ù ÐÙ Ö¸ Ò ×ÙÑ Ö× ÔÓÖ × Ô Ö Ó Ð × ÐÓÒ ØÙ × ÐÓ× Ö Ò Ó× Ù× Öº Bibliograf´ ıa ½ º ĺ ÒØÐ Ýº ÈÖÓ Ö ÑÑ Ò È ÖÐ׺ ×ÓÒ¹Ï ×Рݸ ½ º ¾ º Öר Ð Ò º È ÖÖ Òº Ì ÓÖÝ Ó Ó ×º Ñ ÈÖ ×׸ Æ Û ÓÖ ¸ ½ º ¿ ̺ Àº ÓÖÑ Ò¸ º º Ä × Ö×ÓÒ¸ Ò Êº ĺ Ê Ú ×Øº ÁÒØÖÓ Ù Ø ÓÒ ØÓ Ð ÓÖ Ø Ñ׺ ÅÁÌ ÈÖ ×׸ Ñ Ö ¸ Å ¸ ÍË ¸ ½ º
  • 424.
    398 Cap´ ´ ıtulo 4. Arboles º º Ö Ò º Ä Ò Ö Ð ×Ø× Ò ÔÖ ÓÖ ØÝ ÕÙ Ù × × Ð Ò Ò ÖÝ ØÖ ׺ È Ø × ×¸ ÓÑÔÙØ Ö Ë Ò Ô ÖØÑ ÒØ¸ ËØ Ò ÓÖ ÍÒ Ú Ö× ØÝ¸ ½ ¾º ʺ Ϻ ÐÓÝ º Ð ÓÖ Ø Ñ ¾ ÌÖ ×ÓÖØ ¿º ÓÑѺ Ÿ ¼½¸ ½ º Ö Ò À Ö Öݺ Ö Ô Ì ÓÖݺ ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ½ º ̺ º ÀÙ Ò º º ÌÙ Öº ÇÔØ Ñ Ð ÓÑÔÙØ Ö × Ö ØÖ × Ò Ú Ö Ð Ð Ò Ø ÐÔ Ø Ó ×º ËÁ Šº ÔÔÐ Å Ø º¸ ¾½ ½ ß ¿¾¸ ½ ½º º º ÀÙ«Ñ Òº Ñ Ø Ó ÓÖ Ø ÓÒרÖÙ Ø ÓÒ Ó Ñ Ò ÑÙÑ Ö ÙÒ Ò Ý Ó ×º ÈÖÓ º ÁºÊº º¸ ¼ ½¼ ß½½¼½¸ ½ ½º Ú º ÀÙ«Ñ Òº Ñ Ø Ó ÓÖ Ø ÓÒרÖÙ Ø ÓÒ Ó Ñ Ò ÑÙÑ¹Ö ÙÒ Ò Ý Ó ×º ÈÖÓ Ò × Ó Ø ÁÊ ¸ ¼´ µ ½¼ ß½½¼½¸ Ë ÔØ Ñ Ö ½ ¾º ½¼ ÓÒ Ð º ÃÒÙØ º ÙÒ Ñ ÒØ Ð Ð ÓÖ Ø Ñ׸ ÚÓÐÙÑ ½ Ó Ì ÖØ Ó ÓÑÔÙØ Ö ÈÖÓ Ö ÑÑ Ò º ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ÍË ¸ Ø Ö Ø ÓÒ¸ ½ º ½½ ÓÒ Ð º ÃÒÙØ º ËÓÖØ Ò Ò Ë Ö Ò ¸ ÚÓÐÙÑ ¿ Ó Ì ÖØ Ó ÓÑÔÙØ Ö ÈÖÓ Ö ÑÑ Ò º ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ÍË ¸ × ÓÒ Ø ÓÒ¸ ½ º ½¾ ÓÒ Ð Äº ÃÖ Ö Ò ÓÙ Ð × Êº ËØ Ò×ÓÒº ÓÑ Ò ØÓÖ Ð Ð ÓÖ Ø Ñ׺ Ê ÈÖ ×׸ ½ º ÁË Æ ¼¹ ¿¹¿ ¹ º ½¿ Ý Ä Ò × Ñ¸ ÅÓ× Ù Òר Ò¸ Ò ÖÓÒ Åº Ì Ò Ò ÙѺ Ø ×ØÖÙ ØÙÖ × Ù× Ò Ò ··º ÈÖ ÒØ ¹À Ðи ÍÔÔ Ö Ë Ð Ê Ú Ö¸ ÆÂ ¼ ¸ ÍË ¸ ½ º ½ À ÖÖÝ Êº Ä Û × Ò Ä ÖÖÝ Ò Ò Ö º Ø ËØÖÙ ØÙÖ × Ò Ì Ö Ð ÓÖ Ø Ñ׺ À ÖÔ Ö ÓÐÐ Ò× ÈÙ Ð × Ö׸ Æ Û ÓÖ ¸ ½ ½º ½ º ÄÙ × Û Þº Ç ÞÒ Þ Ò Ù ÔÓØÖ Þ ÐÓ Ñ Ø Ñ ØÝ ÞÒ ´ÓÒ Ø ÑÔÓÖØ Ò Ò Ò × Ó Ñ Ø Ñ Ø ÐÓ µº Æ Ù ÈÓÐ× ¸ ½¼ ¼ ß ¾¼¸ ½ ¾ º ½ º º È ÖÐ × Ò º Ì ÓÖÒØÓÒº ËÝÑ ÓÐ Ñ Ò ÔÙÐ Ø ÓÒ Ý Ø Ö Ð ×Ø×º ÓÑÑÙÒ ¹ Ø ÓÒ× Ó Ø Å¸ ¿´ µ ½ ß¾¼ ¸ ÔÖ Ð ½ ¼º ½ ÊÓ ÖØ Ë Û º Ð ÓÖ Ø Ñ× Ò È ÖØ× ½ß ÙÒ Ñ ÒØ Ð׸ Ø ×ØÖÙ ØÙÖ ×¸ ×ÓÖØ Ò ¸ × Ö Ò º ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ÍË ¸ ½ º ½ º º ËØ Ô Ò×ÓÒº Ñ Ø Ó ÓÖ ÓÒרÖÙ Ø Ò Ò ÖÝ × Ö ØÖ × Ý Ñ Ò Ò× Ö¹ Ø ÓÒ× Ø Ø ÖÓÓØº ÁÒØ ÖÒ Ø ÓÒ Ð ÂÓÙÖÒ Ð Ó ÓÑÔÙØ Ö Ò ÁÒ ÓÖÑ Ø ÓÒ Ë Ò ×¸ ´½µ ½ ß¾ ¸ ÖÙ ÖÝ ½ ¼º ½ º Ϻ º Ï ÐÐ Ñ׺ Ð ÓÖ Ø Ñ ¾¿¾ À ÈËÇÊ̺ ÓÑѺ Ÿ ¿ ß¿ ¸ ½ º
  • 425.
    Cap´ ıtulo 5 Tablas hash Ä Ø ÒÓÐÓ ØÖ Ò× ÓÖÑ Ó Ð Þ Ð ÑÙÒ Ó × Ó¸ ÓÑÙÒ Ò ×Ô Ò× Ð Ô Ö Ð Ú ¸ ÕÙ ÓÑÔÖ Ò × ØÓØ Ð ÐÐ Ñ ÔÐ Ò Ø º ÈÙ Ö ÑÓ× Ö ÕÙ ×Ø ÒÓ Ñ ÒÓ× ÙÒ × ÐÓ ØÓ Ô Ö×ÓÒ ×Ó ÐÓ Ò ØÙÖ Ð Ð Ò ØÙÖ Ð Þ × Ö¸ Ð ÑÙÒ Ó ÐÐ ÒÓ Ö ¸ Ø ÖÖ Ý Ù ÓÒ × ×Ø Ò Ù Ò ÐÓ× ØÖ × Ö Ò × Ö ÒÓ× Ñ Ò Ö Ð¸ Ú Ø Ð Ý Ò Ñ Ð Ý Ò Ð Ù Ð Ô Ò × × ÒÓØ Ò Ô Ö Ð × ÐÓ ÙÑ ÒÓº ÀÓÝ Ò ¸ ÔÖ Ø Ñ ÒØ ÒÓ Ý ×Ô Ó Ð ÔÐ Ò Ø ÕÙ ÒÓ ×Ø Ô ÖÑ Ó ÔÓÖ ÐÓ ÙÑ ÒÓ¸ Ø Ð ÜØÖ ÑÓ ÕÙ Ô Ö ÑÙ Ó× ÙÒ ×ØÖÙ ØÙÖ ÓÒ Ö ØÓ¸ ÓÒ Ð ÕÙ × ÓÒÚ Ú × Ð Ò Ñ ÒØÓ¸ Ð × Ô Ö ÓÑÔÐ Ø Ñ ÒØ Ò ØÙÖ Ðº ÍÒ Ñ Ö Ö ×Ó Ö Ð Þ Ø ÖÖ ×ØÖ ÒÓ× ÔÖÓÔÓÖ ÓÒ ÙÒ Ù Ò Ö Ù ÒØÓ Ð Ø ÒÓÐÓ ØÖ Ò× ÓÖÑ Ó Ð ÑÙÒ Óº Ä Ú ×Ø ר Ð Ò ÔÓÖ ÔÓÐ ÓÒÓ× Ý Ð Ò × Ö ÙÐ Ö ×¸ Ô × Ö ÕÙ ×ØÓ× Ô ÖØ ÖÓÒ ×ØÖ ÓÒ × Ñ Ø Ñ Ø ×¸ ÕÙ ÒÓ ×ÓÒ Ò ØÙÖ Ð ×º Ä Ô Ö×Ô Ø Ú Ö Ð Þ Ø ÖÖ Ò Ð ÒÓ× Ö Ú Ð Ô ÖØ ÐÓ× ÔÖÓ ÙÒ × ÑÓ× Ñ Ó× ÕÙ ×Ø ×Ù Ö Ó Ð Ó × ÖÚ Ö Ò Ð Ø ÖÖ ÔÓÐ ÓÒÓ× Ý Ð Ò × Ô Ö Ø ×º ÐÓ× Ú Ö× × ÑÓ× Ó ØÓ× Ø ÒÓÐÓ Ó× ÓÝ Ò ¸ ÙÒÓ ÒÓ Ø Ò ÑÓ ÖÒÓ¸ Ô ÖÓ ÕÙ ÓÒØÖ Ù Ó × Ú Ñ ÒØ × Ñ Ó Ð ÑÙÒ Ó¸ ÐÓ Ò ÖÒ Ð ÙØÓÑÓÚ Ðº ¹ Ø Ò ÑÓÒÓ× ÙÒ Ö Ú ÑÓÑ ÒØÓ Ý Ñ Ø ÑÓ× ÓÑÓ × Ö Ð ÑÙÒ Ó × ÒÓ Ü ×Ø × ×Ø ÖØ ØÓº Ð ÙØÓÑÓÚ Ð¸ ÕÙ ÓÝ ÒÓ× × Ò ØÙÖ Ð ¸ × ÙÒ Ñ Ó ØÖ Ò×ÔÓÖØ × Ò Ð Ô Ö ÒÙ ×ØÖ ÓÖÑ Ú º ¸ × Ò Ñ Ö Ó¸ × ÑÔÖ × ÓÒ ÒØ Ù Ò Ð Ò ÒØ ÒÓ× ÔÙ × Ö½º Ñ Ò Ö ÙÒ ÔÓ Ó × ÑÔÐ ×Ø ¸ ÔÓ ÑÓ× Ö ÕÙ Ù Ò Ó ÙÒ ÙØÓÑÓÚ Ð ÒÓ ×Ø Ò ÑÓÚ Ñ ÒØÓ ×Ø Ó ÙÔ ÙÒ ×Ô Óº ÌÓ ØÚ ÙÑ Ò ÕÙ Ù ÒØ ÓÒ Ð ÙØÓÑÓÚ Ð Ô ÖØ ÙÐ Ö ÓÑÓ Ñ Ó ØÖ Ò×ÔÓÖØ ¸ Ò ØÖ Ñ ÒØÓ Ð ØÖ Ò×ÔÓÖØ ÔÙ Ð Ó¸ ÓÒ× ¹ Ö Ö Ð ×Ø ÓÒ Ñ ÒØÓº ÄÓ× ÒØÖÓ× ÓÑ Ö Ð × ÓÝ ¸ ÓÒÓ× ÙÒ Ø ÔÓ ×Ó ÐÑ ÒØ Ô ÖØ ÙÐ Ö ÙÒ Ú ¸ Ò ÓÖ × Ð ÓÒ×ÙÑ ×ÑÓ × Ò Ö Ò Ó ×Ø ÔÓ Ý Ö Ø Ö ×Ø Ô ÙÐ Ö ÙÒ ×ØÖ ØÓ ×Ó Ð¸ ×ÓÒ Ù ÒÓ× ÑÔÐÓ׺ ÍÒ ÔÖÓ Ð Ñ ÒØ Ö × Ù Ò Ó × × Ò ÙÒ Ó Ö Ú Ð Ò ÙÒ Ñ ÒØ ÓÒ ÒÓ Ü ×Ø ØÖ Ò×ÔÓÖØ ÔÙ Ð Ó ¹ Ù ×Ø ÓÒ ÕÙ Ö × Ö ÑÙÝ Ü Ô ÓÒ Ð¹ ÓÒ× ×Ø Ò ÒØ ÖÖÓ Ö ÔÓÖ Ð ÒØ ×ÙÔ Ö¬ Ô Ö Ð ×Ø ÓÒ Ñ ÒØÓº ÍÒ ÔÖ Ñ Ö Ô ×Ó ÓÒ× ×Ø Ò ×Ø Ñ Ö Ð ÒØ ×Ô Ö ÙØÓÑÓÚ Ð × Ý × ÖÐ Ô Ò ÐÙ Ö × Ð ×Ø ÓÒ Ñ ÒØÓº ÖÓ××Ó ÑÓ Ó¸ ÙÒ ×Ø ÓÒ Ñ ÒØÓ ÔÙ Ô ØÓÖ Þ Ö× Ð × Ù ÒØ ÑÓ Ó ½ Ð ØÖ Ò× ÓÖÑ ÓÒ ÕÙ ×Ø Ð ÑÔ ÖØ Ó ÙÒ Ù ÓÑÓ Å Ö ¸ ר ÒØ Ö ÔÖ × ÒØ Ø Ú ÐÓ Ò ØÙÖ Ð ¸ × ÙÒ Ù Ò Ò ÓÖº ¿
  • 426.
    400 Cap´ ıtulo 5. Tablas hash 11 6 2 7 M−2 0 1 2 3 ººººººººººººººººººººººººººººººººººººººº M−2 M−1 Ò Ö Ñ ÒØ ¸ Ð ×Ø ÓÒ Ñ ÒØÓ Ø Ò M ÔÙ ×ØÓ× ÔÓ× Ð × ÒÙÑ Ö Ó× × Ù Ò ÐÑ ÒØ º ÄÓ× ÙØÓÑÓÚ Ð × ÖÖ Ò × Ù Ò ÐÑ ÒØ Ý × ×Ø ÓÒ Ò Ò Ð ÔÖ Ñ Ö ÔÙ ×ØÓ ×ÔÓÒ Ð º Ð ÓÒÓ Ñ ÒØÓ ÓÒ×ÓÐ Ó Ö ÓÑ Ò ÕÙ Ø Ð Ô ÖÖÓ ÙÒ ÔÓÖ ÒØ ÔÐ Ò ØÙ ÒØÖ Ð ± Ý ¼±º × Ö¸ × ÙÒ ÐÓ ×Ô Ö Ó¸ Ö ÙÒ ×Ó Ö ÒØ ÒØÖ Ð ¾ ± Ý ½¼ ±º ÉÙ Ø Ò ÕÙ Ú Ö Ð × ØÙ ÓÒ Ð ×Ø ÓÒ Ñ ÒØÓ ÓÒ ÐÓ× Ð ÓÖ ØÑÓ× Ý ×ØÖÙ ¹ ØÙÖ × ØÓ× ÓÒ× Ö ÑÓ× ÙÒ ÓÒ ÙÒØÓ Ò Ö Ó K Ð Ú ×¸ ÒØÖÓ ÙÒ ÔÓ× Ð ÓÑ Ò Ó K¸ Ý ÙÒ ×Ø ÓÒ Ñ ÒØÓ ÓÒ Ô M ÕÙ Ð Ö Ö Ð × Ð Ú ×º ÓÖ ÓÒ¹ × Ö ÑÓ× Ð Ü ×Ø Ò ÙÒ ÙÒ ÓÒ ÒÝ Ø Ú ¾ h(k) : K −→ [0, M − 1]¸ Ð Ù Ð ÔÙ Ô ØÓÖ Þ Ö× × K [0..M − 1] i 0 1 2 M−1 1 1 2 i M−1 2 M−1 Ó ÐÓ ÒØ Ö ÓÖ¸ ÔÓ ÑÓ× ÒØÖÓ Ù Ö ÓÖÑ ÐÑ ÒØ Ð ÓÒ ÔØÓ Ø Ð × Ó Ø Ð ×Ô Ö× ÓÒ ¿ Definici´n 5.1 (Tabla Hash) Ë o ÙÒ ÓÒ ÙÒØÓ Ð Ú × K Ô ÖØ Ò ÒØ × ÙÒ ÓÑ Ò Ó Kº ÍÒ Ø Ð × × ¬Ò ÓÑÓ ½º ÍÒ ÖÖ ÐÓ Ø ÔÓ K M ÒØÖ ×º ÈÓÖ ÐÓ Ò Ö Ð¸ |K| = M¸ ÙÒÕÙ ÔÙ Ö Ò Ó Ò Öº ¾º ÍÒ ÙÒ ÓÒ h(k) : K −→ [0, M − 1] ÐÐ Ñ ÙÒ ÓÒ × º ÙÒ Ö ×ØÖÓ Ð Ö ÒØ ÙÒ Ð Ú Ò ÙÒ Ø Ð × × Ð ÒÓÑ Ò “cubeta” Ó ×Ù ÕÙ Ú Ð ÒØ Ò ÐÓ× ÓÒ “bucket”º Å ÒØ Ð ÖÖ ÐÓ Ý Ð ÙÒ ÓÒ h(k) : K −→ [0, M − 1] ÔÓ ÑÓ× Ù× Ö ÙÒ Ø Ð × Ô Ö ÑÔÐ ÒØ Ö Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð ×ØÖÙ ØÙÖ × ØÓ׺ Ë A[M] ÙÒ ÖÖ ÐÓ Ô Ö × Ø ÔÓ K × {0, 1} × Ö¸ A[i].key Ò Ð Ð Ú ¸ Ñ ÒØÖ × ÕÙ A[i].busy Ò × Ð ÒØÖ ×Ø Ó ÙÔ Ó ÒÓº ÒØÓÒ ×¸ ÖÓ××Ó ÑÓ Ó¸ Ð × ØÖ × ÓÔ Ö ÓÒ × × × × Ö Ð Þ Ò Ð × Ù ÒØ ÑÓ Ó Inserci´n de clave k: o ½º i = h(k) ÑÓ M ¾ × h : D −→ R ÕÙ × ÒÝ Ø Ú ⇐⇒ ∀x, y ∈ D =⇒ h(x) = h(y)º ÍÒ ÙÒ ÓÒ ÒÝ Ø Ú Ø Ñ Ò × ÐÐ Ñ ÙÒÓ ÙÒÓ º ¿ ÔÓÖ × ¸ ר × ÓÐ × ÓÒ Ð ÙÒÓ× ØÖ Ù ØÓÖ × Ð ×Ø ÐÐ ÒÓº Ò Ð ×Ó ÓÒ Ö ØÓ¸ Ð ØÖ Ù ÓÒ ×Ø ÐÐ Ò ¿ Ø ËØÖÙ ØÙÖ × Ò Ð ÓÖ Ø Ñ× Ó¸ ÀÓÔ ÖÓ Ø Ý ÍÐÐÑ Ò ¾ º
  • 427.
    5.1. Manejo decolisiones 401 ¾º A[i].key = k ¿º A[i].busy = 1 B´ squeda de clave k: u ½º i = h(k) ÑÓ M ¾º if (A[i].busy == 1) return true; else return false; Eliminaci´n de clave k: o ½º i = h(k) ÑÓ M ¾º A[i].busy = 0 ÆÓØ ÑÓ× ÕÙ Ò Ò ÙÒ Ð × ÓÔ Ö ÓÒ × ÓÒØ Ò Ø Ö ÓÒ ×º ÈÓÖ Ø ÒØÓ¸ Ð Óר Ð × ØÖ × ÓÔ Ö ÓÒ × Ô Ò Ö Ø Ñ ÒØ Ð Óר h(k) : K −→ [0, M − 1]º ÓÒ× Ù ÒØ ¹ Ñ ÒØ ¸ × h(k) : K −→ [0, M − 1] × O(1)¸ ÒØÓÒ × Ð × ØÖ × ÓÔ Ö ÓÒ × ×ÓÒ O(1)º À ÕÙ ¸ Ô٠׸ Ð Ö Ò Þ ×Ø רÖÙ ØÙÖ ØÓ׺ Ë h(k) : K −→ [0, M − 1] ÒÓ × ÒÝ Ø Ú ¸ ÒØÓÒ × × ÔÓ× Ð ÕÙ Ó× Ð Ú × ×Ø ÒØ × ki, kj ∈ K Ð ÙÒ ÓÒ × Ð × × Ò Ð Ñ ×ÑÓ Ú ÐÓÖ Ó × ¸ h(ki) = h(kj)º Ò ×Ø ×Ó¸ ÑÓ× ÕÙ Ü ×Ø ÙÒ “colisi´n”º Ä Ñ ÝÓÖ o Ð × Ú × ÒÓ ÓÒÓ ÑÓ× ÓÒ Ü Ø ØÙ Ð ÓÒ ÙÒØÓ Ð Ú × K ⊂ K¸ ÐÓ Ù Ð Ñ × ÔÓ× Ð ÙÒ ÓÐ × ÓÒº × Ð × Ó× ×¸ Ô Ö ÕÙ ÙÒ Ø Ð × ÓÒ ÙÒ ÙÒ ÓÒ h(k) : K −→ [0, M − 1] ÒÓ Ò¹ Ý Ø Ú × Ø × ÓÔ Ö ÓÒ × Ò O(1)¸ ר ÓÒØ ÑÔÐ Ö Ó× Ö ÕÙ Ö Ñ ÒØÓ× × Ò Ð × ½º Ð ÓÑÔÙØÓ Ð ÙÒ ÓÒ h(k) : K −→ [0, M − 1] Ö Ð Þ Ö× Ò O(1)¸ ÓÒ ÙÒ ÑÙÝ ÔÓ Ó Óר ÓÒר ÒØ Ý ×Ù ÓÑÔÓÖØ Ñ ÒØÓ ÑÙÐ Ö ÙÒ ×ØÖ Ù ÓÒ × Ö Ø ÙÒ ÓÖÑ ÒØÖ [0, M − 1]º ÈÙ ×ØÓ ÕÙ ÔÙ Ò Ö ÓÐ × ÓÒ ×¸ ר × Ò Ö Ù Ö× Ð Ñ Ò ÑÓ ÔÓ× Ð ×Ø × Ð × ÒØ Ó ÕÙ h(k) : K −→ [0, M − 1] ÑÙÐ Ð Ð ØÓÖ º ¾º ÈÓÖ Ð Ñ ×Ñ ÔÓ× Ð Ø Ò Ö ÓÐ × ÓÒ ×¸ ÙÒÕÙ Ù × Ñ Ò Ñ ¸ × Ø Ò Ö ÙÒ ×ØÖ Ø Ô Ö Ñ Ò ÖÐ × × Ö¸ × Ö¸ × ×Ø Ñ Ø Ñ ÒØ ¸ ÕÙ Ö ÓÒ ÕÙ ÐÐ × ÒÙ Ú × Ð Ú × ÕÙ ÓÐ Ò Ò ÓÒ ÓØÖ × Ý ÔÖ × ÒØ × Ò Ð Ø Ð º Ä ×ØÖ Ø × Ö Ø Ð ÕÙ ÒÓ × Ö ¬ÕÙ Ð Ø ÑÔÓ O(1) Ð Ñ Ó Ô Ö ÙÒ Ø Ð × º 5.1 Manejo de colisiones ÓÑÓ Ý ÐÓ ÑÓ× × Ò Ð Ó¸ × ÒÓ × ÓÒÓ Ð ÓÒ ÙÒØÓ Ð Ú × ÕÙ × Ò× ÖØ Ö Ò Ò Ð Ø Ð ¸ ÒØÓÒ × ×ÓÒ ÔÓ× Ð × Ð × ÓÐ × ÓÒ ×º ÉÙ Ø Ò ÔÖÓ Ð × ×ÓÒ ÍÒ Ñ Ö ÙÒ Ð Ö ÔÖÓ Ð Ñ ÒÓ× Ò ×Ù ÔÖÓ Ð º 5.1.1 La paradoja del cumplea˜os n Ê Ð¹ Þ Ö ÑÓ× Ð ÔÖÓ Ð ÓÐ × ÓÒ Ñ ÒØ ÙÒ Ð × Ó ÔÖÓ Ð Ñ Ð Ø ÓÖ ÔÖÓ Ð ×º ËÙÔÓÒ ÑÓ× ÙÒ ÖÙÔÓ n Ô Ö×ÓÒ ×¸ ÕÙ Ø Ò ÔÖÓ Ð × ÕÙ Ó× Ô Ö×ÓÒ × Ø Ò Ò Ð Ñ ×Ñ ÙÑÔÐ ÒÓ× º ÄÓ× Ø ÜØÓ× ÔÖÓ Ð × Ó Ö Ò ÙÒ ×ÓÐÙ ÓÒ ÔÖ × ×Ø ÔÖÓ Ð Ñ º Ò Ö × Ð × ÑÔÐ Ý Ð ÓÖÖÓ ×Ô Ó¸ ÕÙ ÐÓ Ó Ö ÑÓ× Ñ ÒØ ÙÒ Ú Ñ × ÓÖØ ¸ Ô ÖÓ Ñ × ÑÔÖ × º
  • 428.
    402 Cap´ ıtulo 5. Tablas hash Ë ÙÒ xi,j ÙÒ Ú Ö Ð Ð ØÓÖ ¬Ò Ð × Ù ÒØ ÑÓ Ó xi,j = 0 × Ð × Ô Ö×ÓÒ × i Ý j ÒÓ ÙÑÔÐ Ò ÒÓ× Ð Ñ ×ÑÓ ´ º½µ 1 × Ð × Ô Ö×ÓÒ × i Ý j ÙÑÔÐ Ò ÒÓ× Ð Ñ ×ÑÓ ÓÖ ¬Ò ÑÓ× Ð × Ù ÒØ Ú Ö Ð Ð ØÓÖ X= xi,j ´ º¾µ ∀i=i ÙÝ ×Ô Ö ÒÞ E(X)¸ Ò Ú ÖØÙ Ð × ¬Ò ÓÒ × ÔÐ ÒØ ׸ ÒÓ× ÔÖÓÔÓÖ ÓÒ Ð ÒØ ×Ô Ö Ô Ö × Ô Ö×ÓÒ × ÕÙ ÙÑÔÐ Ò ÒÓ× Ð Ñ ×ÑÓ º ÈÓÖ ¬Ò ÓÒ E(X) = E xi,j ; ´ º¿µ ∀i=i Ð Ù Ð ÔÙ ÔÐ ÒØ Ö× ÓÑÓ E(X) = E(xi,j) . ´ºµ ∀i=i ×ØÓ ÒÓ× ÔÐ ÒØ Ð Ò × Ð ÙÐ Ö E(xi,j)¸ Р٠Р׸ ÔÓÖ ¬Ò ÓÒ¸ × E(xi,j) = 0 × P(xi,j = 0) + 1 × P(xi,j = 1) = P(xi,j = 1) . ´ºµ Ä Ù ×Ø ÓÒ Ö ÕÙ Ö ¸ Ô٠׸ Ð ÙÐ Ö P(xi,j = 1) × Ö¸ Ð ÔÖÓ Ð ÕÙ Ó× Ô Ö×ÓÒ × Ô ÖØ ÙÐ Ö × ÙÑÔÐ Ò ÒÓ× Ð Ñ ×ÑÓ Ý ×Ø ¸ Ð Ò Ö ÙÐ Ð ÙÒÓ׸ × 1 P(xi,j = 1) = . 365 ÆÓ ×ÓÖÔÖ Ò ÒØ Ñ ÒØ ¸ Ð ÙÒÓ× Ò ÙÖÖ Ò Ò Ð ÖÖÓÖ Ô Ò× Ö ÕÙ × ØÖ Ø ÙÒ ÔÖÓ Ð ÓÒ ÓÒ Ð¸ ÐÓ Ù Ð ÒÓ × Ð ×Óº È Ö ÔÖ Ò ÖÐÓ¸ Ñ Ò ÑÓ×ÒÓ× ÕÙ ÒÓ× Ò ÓÒØÖ ÑÓ× Ò ÙÒ ÖÙÔÓ Ý ÒÓ× ÔÖ ÙÒØ ÑÓ× Ù Ò ÔÖÓ Ð × ÕÙ ØÙ ÙÑÔÐ × ÒÓ× Ð Ñ ×ÑÓ ÕÙ ÝÓ Ä Ö ×ÔÙ ×Ø × 1/365¸ Ô٠׸ Ð ÝÓ ÓÒÓ Ö Ñ ÙÑÔÐ ÒÓ× Ö Ú Ð Ð ×Ù ×Ó ÒØ Ö × ÔÖÓ Ð ÒØÖ ØÓ Ó× ÐÓ× 365 ÔÓ× Ð ×º × ÔÙ × n(n − 1) E(X) = n 1 2 365 = 730 . ´ºµ ÄÓ Ù Ð¸ Ð ÔÐ ÒØ Ö Ð × ÙÐ E(xi,j) ≥ 1 ÒÓ× ÖÖÓ ÓÑÓ Ö × √ √ 2921 − 1 2921 + 1 n1 = − , n2 = ≈ 27, 523138 . 2 2 ×ØÓ ÑÔÐ ÕÙ Ô Ö ÙÒ ÖÙÔÓ 28 Ô Ö×ÓÒ × × ×Ô Ö Ó Ò ÓÒØÖ Ö ÙÒ Ô Ö ÓÒ Ð Ñ ×Ñ ÙÑÔÐ ÒÓ× Ô Ö Ð Ó Ð Ô Ö×ÓÒ × ´n = 56, E(X) = 56×55 = 4.2192µ¸ ÔÓ ÑÓ× 730 ×Ô Ö Ö Ù ØÖÓ Ô Ö × Ô Ö×ÓÒ × ÓÒ Ð Ñ ×ÑÓ ÙÑÔÐ ÒÓ׺ È Ö ÙÒ ×Ù ×Ó Ò Ô Ö Ò Ð ØÓÖ Ó Ò Ô Ò ÒØ ÓÑÓ ÐÓ × Ð Ò Ñ ÒØÓ¸ Ð ÔÖÓ Ð ÓÐ × ÓÒ × ×Ø ÒØ ÐØ ¸ ÐÓ ÕÙ Ò Ð Ò × ÔÖ Ô Ö Ö× ×Ù Ú ÒØÙ Ð º Ò ÐÓ ÕÙ × Ù ¸ × ÙØ Ö ÑÓ× Ú Ö × ×ØÖ Ø × Ô Ö ÐÑ ¹ Ò Ö ÓÐ × ÓÒ × Ò ÙÒ Ø Ð × º
  • 429.
    5.1. Manejo decolisiones 403 5.1.2 Estrategias de manejo de colisiones ÓÒ× Ö ÑÓ× ÙÒ ÓÒ ÙÒØÓ Ò Ö Ó Ð Ú × ÓÐ Ò ÒØ × Kc = {k1, k2, . . . , kn} Ó × ¸ ∀ki, kj ∈ Kc =⇒ h(ki) = h(kj)º Ë ÓÒÓ Ò Ó× ÖÙÔÓ× Ø Ò × Ô Ö Ð Ö ÓÒ ÓÒ ÙÒØÓ× ÓÐ × ÓÒ × Encadenamiento Ð × ÓÐ × ÓÒ × × ÒÐ Þ Ò Ò ÙÒ Ó Ú Ö × Ð ×Ø × ÒÐ Þ × ÙÖ Ó ÒØÖÓ Ð Ñ ×Ñ Ø Ð º Direccionamiento abierto Ð × ÓÐ × ÓÒ × × ÓÐÓ Ò Ö Ø Ñ ÒØ ÒØÖÓ Ð ÔÖÓÔ Ø Ðº ÙÒ ×Ø × Ø Ò × Ø Ò ×Ù× Ú ÒØ × Ý ×Ú ÒØ × Ý × Ù × ÙÒ Ð ÓÒØ ÜØÓ Ù×Óº 5.1.3 Encadenamiento Ä ÙÒ Ñ ÒØ Ð Ð Ò Ò Ñ ÒØÓ × ÕÙ Ð × ÓÐ × ÓÒ × × Ù Ö Ò Ò ÙÒ Ð ×Ø × ÑÔÐ Ó Ó Ð Ñ ÒØ ÒÐ Þ º Ù Ò Ó ÐÓ× ÒÓ Ó× Ð Ð ×Ø × Ù Ö Ò Ù Ö Ð Ø Ð ¸ ÑÓ× ÕÙ × ØÖ Ø Ò Ò Ñ ÒØÓ × Ô Ö Óº Ò Ð × ÒØ Ó ÒÚ Ö×Ó¸ Ù Ò Ó ÐÓ× ÔÖÓÔ Ó× ÒÓ Ó× Ð Ð ×Ø ×ÓÒ Ô ÖØ Ð Ø Ð ¸ ÑÓ× ÕÙ × ØÖ Ø Ò Ò Ñ ÒØÓ ÖÖ Óº 5.1.3.1 Encadenamiento separado Ò ×Ù ÓÖÑ Ñ × × ÑÔÐ ¸ Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó × ÑÔÐ ÒØ Ñ ÒØ ÙÒ Ø Ð ÔÙÒØ ÖÓ× Ð ×Ø × × ÑÔÐ Ñ ÒØ ÒÐ Þ ×¸ ÙÝ Ö ÔÖ × ÒØ ÓÒ ÔÙ Ú ×Ù Ð Þ Ö× Ð × Ù ÒØ ÑÓ Ó 0 k10 k1 1 2 k8 3 4 5 k9 k5 k2 6 7 8 k3 9 10 k7 k4 11 M−2 M−1 k11 k6 Ä ¬ ÙÖ ÑÙ ×ØÖ ÙÒ ÓÒ ÙÒØÓ 12 Ð Ú × ki ÓÒ i Ö ÔÖ × ÒØ Ð ÓÖ Ò Ò× Ö ÓÒº ÒØÖ Ò Ð ÖÖ ÐÓ × ÙÒ ÔÙÒØ ÓÖ Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ Ð Ð ×Ø ÒÐ Þ ÓÐ × ÓÒ ×º ÌÓ × Ð × ÓÔ Ö ÓÒ × Ö ÕÙ Ö Ò Ð ÙÐ Ö j = h(k) ÑÓ M¸ ÓÒ k × ÙÒ Ð Ú ×Ø Ñ Ò Ö ¸ Ð ÒØÖ tabla[j] × Ð ÔÙÒØ ÖÓ Ð Ð ×Ø ÒÐ Þ º ÍÒ Ú ÐÓÖ ÔÙÒØ ÓÖ ÒÙÐÓ Ò ÕÙ Ð Ð ×Ø ר Ú × Ö¸ ÕÙ ÒÓ Ý Ò Ò ÙÒ Ð Ñ ÒØÓ ×Ó Ó Ð Ò j ר × Ð ØÖ Ù ÓÒ Ð Ø Ö Ð Ð Ø ÖÑ ÒÓ Ù× Ó Ò Ò Ð × ÓÔ Ò Ö ×Ò º
  • 430.
    404 Cap´ ıtulo 5. Tablas hash Ò Ð ÖÖ ÐÓº ÐÓ ÓÒØÖ Ö Ó¸ Ü ×Ø ÙÒ Ð ×Ø ÒÐ Þ Ð Ú × ÓÐ Ò ÒØ × Ò Ò ×º Ò Ð ÑÔÐÓ Ð ÒØÖ 11 ÑÙ ×ØÖ Ó× Ð Ú × k7, k4 ÙÝÓ Ú ÐÓÖ ÙÒ ÓÒ × ÖÖÓ Ó Ð Ñ ×ÑÓ Ö ×ÙÐØ Ó ´10µº Ò ALEPH ר Ø ÔÓ Ø Ð ×Ø ÑÔÐ ÒØ Ó Ò Ð Ö ÚÓ ØÔÐ Ð × ºÀ ¼ ¸ ÙÐ ÑÔÐ ÒØ Ý ÜÔÓÖØ Ú Ö × Ð × × Ô Ö Ñ ØÖ Þ ×¸ Ð × Ù Ð ×¸ Ð Ñ × ÑÔÓÖØ ÒØ × ¼ ØÔÐ Ð × ºÀ ¼ ≡ template <typename Key, class BucketType, class Cmp> class GenLhashTable { typedef BucketType Bucket; ÈÖÓØÓØ ÔÓ ÔÙÒØ ÖÓ ÙÒ ÓÒ × ¼ Å Ñ ÖÓ× ØÓ ÒÄ × Ì Ð ¼ Å ØÓ Ó× ÔÙ Ð Ó× ÒÄ × Ì Ð ¼ }; Ù Ø× LhashTable<Key> ¼ ¬Ò × GenLhashTable¸ Ù× Ò ÙÒ ¼ º GenLhashTable<Key, BucketType> ÑÔÐ ÒØ ØÓ Ó Ð Ñ Ò Ó Ò Ö Ó Ð Ø Ð × Ò Ð Ù Ð Ð × Ù Ø × ×ÓÒ Ø ÔÓ BucketTypeº Cubetas Ä Ñ Ò Ö Ñ × × ÑÔÐ Ñ Ò Ö ÙÒ Ù Ø Ò Ò Ö× Ô Ö Ñ ÒØ × Ñ ÒØ Ð Ø ÔÓ Dnode<T> ×ØÙ Ó Ò Ü ¾º º ´Ô Ò µ ¼ Ù Ø × LhashTable<Key> ¼ ≡ ´¼ µ ¼ template <typename Key> class LhashBucket : public Dnode<Key> { LhashBucket(const LhashBucket & bucket) : Dnode<Key>(bucket) { /* empty */ } LhashBucket() { /* Empty */ } LhashBucket(const Key & key) : Dnode<Key>(key) { /* Empty */ } Key & get_key() { return this->get_data(); } }; template <typename Key> class LhashBucketVtl : public Dnode<Key> { LhashBucketVtl(const LhashBucketVtl & bucket) : Dnode<Key>(bucket) { /* empty */ } LhashBucketVtl() { /* Empty */ } virtual ~LhashBucketVtl() { /* Empty */ } LhashBucketVtl(const Key & key) : Dnode<Key>(key) { /* Empty */ } Key & get_key() { return this->get_data(); } }; ¬Ò × LhashBucket¸ Ù× Ò ÙÒ × ¼ Ò ¿ º Í× × Dnode º Ð ÑÔÐ Ó Ð Ø ÔÓ Dnode<T> ÒÓ× Ð Ø Ö Ò Ñ ÒØ Ð × ÓÔ Ö ÓÒ × Ò Ô ÖØ ÙÐ Ö Ð Ð Ñ Ò ÓÒ¸ Ð Ù Ð Ò ÙÒ Ð ×Ø × ÑÔÐ Ö ÕÙ Ö Ö Ñ ÒØ Ò Ö ÙÒ ÔÙÒØ ÖÓ Ð Ð Ñ ÒØÓ ÔÖ ×ÓÖº Ä ÙÒ ×Ø Ò ÓÒ ÒØÖ ÙÒ Ð × Ý Ð ÓØÖ × Ð ÔÖ × Ò Ð ×ØÖÙ ØÓÖ Ú ÖØÙ Ðº À Ý Ó× Ñ Ò Ö × ×Ó Ö ÓØÖÓ× ØÓ× Ð Ð Ú Ø ÔÓ Key ¬Ò Ò Ð Ù Ø
  • 431.
    5.1. Manejo decolisiones 405 ½º Ë Ö ÙÒ Ö ×ØÖÓ¸ ÔÓÖ ÑÔÐÓ Ø ÔÓ Record¸ ÕÙ ÓÒØ Ò ØÓ Ó× ÐÓ× ØÓ× ÒØ Ö ×¸ Ò ÐÙ Ð Ð Ú Ø ÔÓ Keyº ×ÔÙ × × Ð Ö ÙÒ Ù¹ Ø ´LhashBucket<Record> Ó LhashBucketVtl<Record>¸ Ý × ¬Ò Ð ÓÔ Ö ÓÖ Record::operator==(const Record&) Ô Ö ÕÙ ×ÓÐÓ ÓÑÔ Ö Ð Ð Ú Ø ÔÓ Ã Ýº Ä Ø Ð × ÔÙ ¬Ò Ö× Ñ ÒØ Ù ÐÕÙ Ö ÐÓ× ØÖ × Ø ÔÓ× GenLhashTable¸ LhashTable Ó LhashTableVtlº ÄÓ× Ó× ÙÐØ ÑÓ× Ø ÔÓ× × ÓÖÖ ×ÔÓÒ Ò ÓÒ Ø Ð × ÕÙ Ñ Ò Ò Ù Ø × × Ò Ó ÓÒ ×ØÖÙ ØÓÖ × Ú ÖØÙ Ð × Ý × ¬Ò Ò ÔÓÖ ×Ô Ð Þ ÓÒ GenLhashTable ¼ Ù Ø× LhashTable<Key> ¼ +≡ ´¼ µ ¼ template <typename Key, class Cmp = Aleph::equal_to<Key> > class LhashTable : public GenLhashTable<Key, LhashBucket<Key>, Cmp> { // ... }; template <typename Key, class Cmp = Aleph::equal_to<Key> > class LhashTableVtl : public GenLhashTable<Key, LhashBucketVtl<Key>, Cmp> { // ... }; ¬Ò × LhashTable¸ Ù× Ò ÙÒ × ¿¾¸ ¿¿¸ Ò º LhashTableVtl¸ Ò Ú Ö Ù× º Í× × GenLhashTable ¼ Ò LhashBucket ¼ º ¾º Ë Ö Ú ÙÒ Ð ×Derivada Ù ÐÕÙ Ö Ð × Ð × × Ù Ø × LhashBucket<Key> Ó LhashBucketVtl<Key> Ò ÓÒ × ÓÐÓÕÙ Ò ÐÓ× ØÓ× ÕÙ × Ö ÕÙ Ö Ò ×Ó Ö Ð Ø ÔÓ Keyº Ä Ø Ð × × Òר Ò Ñ ÒØ LhashBucket<Key> Ó LhashBucketVtl<Key>¸ × ÙÒ × Ö ÕÙ Ö Ó ÒÓ ×ØÖÙ ØÓÖ × Ú ÖØÙ Ð ×º Ä Ò× Ö ÓÒ Ý Ð Ð Ñ Ò ÓÒ ÔØ Ò Ù Ø × Ø ÔÓ Derivada¸ ÔÙ × ×ÓÒ Ù Ø × ÔÓÖ Ö Ò º Ä Ù×ÕÙ Ö ØÓÖÒ ÙÒ Ù Ø Ð Ñ Ð LhashBucket<Key>¸ Ð Ù Ð ÓÒÚ ÖØ Ö× ÜÔÐ Ø Ñ ÒØ Derivada × × Ö ÕÙ Ö ÓÒÓ Ö Ð Ù Ø Derivadaº Atributos de LhashTable<Key> Ç Ú Ñ ÒØ ¸ ÙÒ ØÖ ÙØÓ × Ò Ð¸ Ð Ù Ð Ð Ö ÑÓ× Ñ × Ð ÒØ ¸ × Ð ÙÒ ÓÒ × ¸ ÕÙ ØÖ Ò× ÓÖÑ ÙÒ Ð Ú Ø ÔÓ Key ÙÒ Ò ØÙÖ Ðº Ì Ð ÙÒ ÓÒ Ø Ò Ö Ð ÔÖÓØÓØ ÔÓ × Ù ÒØ ¼ ÈÖÓØÓØ ÔÓ ÔÙÒØ ÖÓ ÙÒ ÓÒ × ¼ ≡ ´¼ µ typedef size_t (*Hash_Fct)(const Key &); Ð Ø ÔÓ LhashTable<Key> Ñ ÒØ Ò ¸ Ô٠׸ ÙÒ ÔÙÒØ ÖÓ ×Ø Ø ÔÓ ¼ Å Ñ ÖÓ× ØÓ ÒÄ × Ì Ð ¼ ≡ ´¼ µ ¼ Hash_Fct hash_fct; Ä Ñ × ÓÒ ×Ø Ø ÔÓ × Ñ Ò Ö ÓÖÑ ÒÖ Ð ÙÒ ÓÒ × º ÌÓ Ó ÓÒרÖÙ ØÓÖ Ø Ð × Ö ÕÙ Ö ×Ø ÙÒ ÓÒº Å ÒØ static cast<Derivada*>(cubeta)º
  • 432.
    406 Cap´ ıtulo 5. Tablas hash Ð × ÙÒ Ó ØÖ ÙØÓ × Ð Ø Ð Ñ ×Ñ × Ö¸ Ð ÖÖ ÐÓ ÔÙÒØ ÖÓ× Ù Ø ×¸ Ð Ù Ð × ¬Ò Ð × Ù ÒØ Ñ Ò Ö ¼ Å Ñ ÖÓ× ØÓ ÒÄ × Ì Ð ¼ +≡ ´¼ µ ¼ ¼ typedef Dnode<Key> BucketList; // Tipo lista de cubetas typedef typename Dnode<Key>::Iterator BucketItor; // Iterador de lista cubetas typedef Dnode<Key> Node; // Sin´nimo de nodo o BucketList * table; Í× × Dnode º À Ý ÙÒ ÔÓ Ó ÞÙ Ö × ÒØ Ø ÕÙ Ð Ø Ð × Ð Ö ÓÒ ×º Ò Ò ÙÖ ¸ Ý ÙÒ Ð Ö ÓÒ ÙÒ Ø Ö ÓÖ¸ Ð Ù Ð Ô ÖÑ Ø Ö ÓÖÖ Ö ÙÒ Ð ×Ø ÓÐ × ÓÒ ×º Ð Ö ×ØÓ ÐÓ× ØÖ ÙØÓ× × ¬Ò Ò ÓÑÓ × Ù ¼ Å Ñ ÖÓ× ØÓ ÒÄ × Ì Ð ¼ +≡ ´¼ µ ¼ size_t M; // Tama~o de la tabla n size_t N; // N´mero de elementos que tiene la tabla u size_t busy_slots_counter; // Cantidad de entradas del arreglo ocupadas bool remove_all_buckets; // Indica si se deben liberar las cubetas // cuando se llame al destructor Ð ØÖ ÙØÓ busy slots counter Ù ÒØ Ð ÒØ ÒØÖ × Ð ÖÖ ÐÓ table[] ÕÙ ×Ø Ò Ú ×º × ÙÒ Ò ÓÖÑ ÓÒ ÑÙÝ ÑÔÓÖØ ÒØ Ô Ö ÓÒÓ Ö Ð Ò Ú Ð ×Ô Ö× ÓÒ Ð ÙÒ ÓÒ × º Ë N < M¸ ÒØÓÒ × Ð Ö Ó Ù×Ý ×ÐÓØ× ÓÙÒØ Ö ÒÓ× N Ð ØÚ Ð ÙÒ ÓÒ × Ò Ø ÖÑ ÒÓ× ×Ô Ö× ÓÒº ÍÒ Ú ÐÓÖ Ô ÕÙ ÒÓ Ò ÕÙ Ý ÑÙ × ÓÐ × ÓÒ ×º Ð Ù×Ù Ö Ó LhashTable<Key> Ø Ò Ð Ö ×ÔÓÒ× Ð Ô ÖØ Ö Ð Ñ ÑÓÖ Ô Ö Ð × Ù Ø ×¸ × ÓÑÓ¸ Ú ÒØÙ ÐÑ ÒØ ¸ Ð Ð Ö ÖР׺ × ÙØ ÑÓ× Ð Ö ÞÓÒ × Ö ×ØÓ Ù Ò Ó Ð ÑÓ× Ð ÔÖ Ò Ô Ó ¬Ò¹ ¹¬Ò ´Ü ½º º¾ ´Ô Ò ¾¾µµ Ý ÐÓ ÑÓ× ÔÐ Ó ÐÓ Ð Ö Ó ÐÓ× ×Ø ÒØÓ× Ì ÕÙ ÑÓ× × Ò Óº Ò × × ÒØ Ó¸ × ×Ø ÒØ ÙØ Ð Ø Ò Ö ÙÒ ÖÙØ Ò ÕÙ Ú Ð ÒØ remove all and delete() Dlink ´Ü ¾º º ´Ô Ò µµ Ó destroyRec() ÐÓ× Ö ÓÐ × Ò Ö Ó× ´Ü º º½¼ ´Ô Ò ¾ µµº × Ô٠׸ Ð ØÖ ÙØÓ remove all buckets() Ð Ò Ð ×ØÖÙ ØÓÖ LhashTable<Key> ÕÙ Ð Ö Ö ØÓ Ð Ñ ÑÓÖ º Ë × × Ú Ö Ð Ø Ð ¸ ÒØÓÒ × ÔÙ ÒÚÓ Ö× Ð Ñ ØÓ Ó empty() ¼ Å ØÓ Ó× ÔÙ Ð Ó× ÒÄ × Ì Ð ¼ ≡ ´¼ µ ¼ void empty() { for (int i = 0; i < M; ++i) for (BucketItor itor(table[i]); itor.has_current(); /* nothing */) delete static_cast<Bucket*>(itor.del()); busy_slots_counter = 0; N = 0; } Inserci´n o ÍÒ ×ÙÒØÓ ÒØ Ö × × Ð ÐÙ Ö Ð Ð ×Ø Ò ÕÙ Ò× ÖØ Ö× ÙÒ ÒÙ Ú ÓÐ × ÓÒ Ð ÔÖ Ò Ô Ó¸ Ð ¬Ò Ð Ù ÓÖ Ò Ö Ð Ð ×Ø º Ù ÐÕÙ Ö ×Ø × Ú Ö ÒØ × ÒÓ Ù× Ö Ò Ö Ô Ö¹ Ù× ÓÒ Ò Ð × ÑÔ ÒÓ¸ Ô ÖÓ × × × ÑÔÐ Ñ ÒØ ÒÐ Þ ¸ ÒØÓÒ × Ð ÔÖ Ö Ò × ÔÓÖ Ð Ö ÒØ ¸ ÑÓ Ó ÕÙ Ð Ò× Ö ÓÒ × ÐÓ Ñ × ÓÒר ÒØ Ñ ÒØ Ö Ô º Ë Ð Ð ×Ø × Óи ÒØÓÒ × ÕÙ × Ò× ÖØ Ð ÔÖ Ò Ô Ó Ó ¬Ò Ð × Ò Ö ÒØ Ò Ø ÑÔÓº
  • 433.
    5.1. Manejo decolisiones 407 ÇØÖÓ ØÓÖ ÒØ Ö × × ÓÒ× Ö Ö Ó ÒÓ Ö Ô Ø Ò Ð Ú ×º ÖÒ ÐÓ× Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ ¸ Ò ÙÒ Ø Ð × × ÔÖ Ö Ð ÒÓ Ú Ö ¬ Ö Ö Ô Ø Ò ÔÓÖÕÙ × ÒÓ × Ö ÕÙ Ö ÙÒ Ù×ÕÙ Ò Ð Ð ×Ø ÓÐ × ÓÒ × Ú Þ ÕÙ × ØÙ ÙÒ Ò× Ö ÓÒº ÓÖ ÔÓ ÑÓ× ×Ô ¬ Ö Ð Ò× Ö ÓÒ Ò LhashTable<Key>¸ Ð Ù Ð × Ö Ð Þ ¸ ÑÙÝ × Ò ÐÐ Ñ ÒØ ¸ × ¼ Å ØÓ Ó× ÔÙ Ð Ó× ÒÄ × Ì Ð ¼ +≡ ´¼ µ ¼ ¼ Bucket * insert(Bucket * bucket) { const size_t i = (*hash_fct)(bucket->get_key()) % M; if (table[i].is_empty()) // ¿est´ vac´a la lista table[i]? a ı ++busy_slots_counter; // s´ ==> actualizar contador de ocupaci´n ı o table[i].append(bucket); // insertar cubeta al final ++N; return bucket; } Ë Ð ÐÐ Ñ (*hash fct)(key) × O(1)¸ ÒØÓÒ × insert() ׸ ÓÒ ÖØ ØÙ Ø ÖÑ ¹ Ò ×Ø ¸ O(1)º B´squeda u Ä Ù×ÕÙ ÓÒ× ×Ø Ò Ð ÙÐ Ö Ð ÒØÖ Ð Ø Ð Ñ ÒØ Ð ÙÒ ÓÒ × Ý ÐÙ Ó Ò Ö ÓÖÖ Ö Ð i¹ × Ñ Ð ×Ø ר ÕÙ × Ò Ù ÒØÖ k Ó ×Ø ÕÙ × ÐÐ Ù Ð ¬Ò и Ò ÙÝÓ ×Ó × ØÖ Ø ÙÒ Ù×ÕÙ ÐÐ ¼ Å ØÓ Ó× ÔÙ Ð Ó× ÒÄ × Ì Ð ¼ +≡ ´¼ µ ¼ ¼ Bucket * search(const Key & key) const { const size_t i = (*hash_fct)(key) % M; if (table[i].is_empty()) return NULL; for (BucketItor it(table[i]); it.has_current(); it.next()) { Bucket * bucket = static_cast<Bucket*>(it.get_current()); if (Cmp() (bucket->get_key(), key)) return bucket; } return NULL; } Ð × ÑÔ ÒÓ ×Ø ÖÙØ Ò ÔÒ Ð ÐÓÒ ØÙ Ð Ð ×Ø table[i]º Eliminaci´n o Ä Ð Ñ Ò ÓÒ × Ö Ø Ý ÓÒ ÙÖ ÓÒ Ü Ø Ñ ÒØ ÓÒר ÒØ ÙÒ Ú Þ ÕÙ × ÓÒÓ Ð Ö ÓÒ Ð Ù Ø ¼ Å ØÓ Ó× ÔÙ Ð Ó× ÒÄ × Ì Ð ¼ +≡ ´¼ µ ¼ ¿½ Bucket * remove(Bucket * bucket) { Bucket * next = // guarda pr´xima colisi´n o o static_cast<Bucket*>(bucket->get_next()); bucket->del(); // eliminar de su lista de colisiones if (next->is_empty()) // ¿la lista devino vac´a? ı
  • 434.
    408 Cap´ ıtulo 5. Tablas hash --busy_slots_counter; // s´ ==> actualizar contador de listas ocupadas ı --N; return bucket; } 5.1.3.2 An´lisis del encadenamiento separado a ÈÓÖ × ÑÔÐ Ö Ø ¸ ×ÙÑ Ö ÑÓ× ÙÒ Ø Ð ÓÒ× ×Ø ÒØ ÙÒ ÖÖ ÐÓ ÒÓ Ó× Ö Ð ×Ø × ÓÐ × ÓÒ × Ö ÙÐ Ö × Ý Ó Ð Ñ ÒØ ÒÐ Þ × Ð Ø ÔÓ Dnode<T> ×ØÙ Ó Ò Ü ¾º º ´Ô Ò µº Ó Ð Ñ ×ÑÓ ×Ô Ö ØÙ¸ Ø Ñ Ò ×ÙÑ Ö ÑÓ× ÕÙ Ð Ò× Ö ÓÒ × ÑÔÖ × Ö Ð Þ Ð ¬Ò Ð Ð Ð ×Ø º Ð × ÑÔ ÒÓ Ð Ò× Ö ÓÒ × Ö Ø Ñ ÒØ O(1) Ñ ÒØ Ð ÓÔ Ö ÓÒ append() ÒÐ Ö ÕÙ ÖÖÓ Ð ÙÒ ÓÒ × º Ð × ÑÔ ÒÓ Ð Ð Ñ Ò ÓÒ Ô Ò Ð × ÑÔ ÒÓ Ð Ù×ÕÙ º ×Ù Ú Þ¸ Ð × ÑÔ ÒÓ Ð Ù×ÕÙ ¸ Ü ØÓ× Ó ÐÐ ¸ Ô Ò Ð ÐÓÒ ØÙ Ð Ð ×Ø º ÈÓÖ Ø ÒØÓ¸ Ð × ÑÔ ÒÓ ×Ô Ö Ó ×Ø Ö ÓÑ Ò Ó ÔÓÖ Ð ÐÓÒ ØÙ ×Ô Ö Ð Ð ×Ø º Ò ÐÓ ÕÙ × Ù ÒÙ ×ØÖÓ Ò Ð × ×¸ M ÒÓØ Ð ÐÓÒ ØÙ Ð ÖÖ ÐÓ ÒØ ÖÒÓ Ý N Ð ÒÙÑ ÖÓ Ð Ñ ÒØÓ× ÕÙ ÓÒØ Ò Ð Ø Ð º α = N/M Ò Ð ØÓÖ Ö Ð Ø Ð × Ö¸ ÕÙ Ø Ò ÐÐ Ò ×Ø Ð Ø Ð º ÓÒ ×Ø Ø ÖÑ ÒÓÐÓ × ¸ ÔÓ ÑÓ× ÒØÖÓ Ù Ö ÒÙ ×ØÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð Lema 5.1 Longitud esperada de una lista de colisiones Ë h(k) : K −→ [0, M − 1] ÙÒ ÙÒ ÓÒ × O(1) ÕÙ ×ØÖ ÙÝ ÙÒ ÓÖÑ Ñ ÒØ ÐÓ× Ð Ñ ÒØÓ× K [0, M − 1]º Ë T ÙÒ Ø Ð × ÐÓÒ ØÙ M ÓÒ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ × ÔÓÖ Ò Ò Ñ ÒØÓ × Ô Ö Ó Ý ÕÙ ÓÒØ Ò N Ð Ñ ÒØÓ׺ Ë |li| Ð ÒÙÑ ÖÓ ÒÓ Ó× Ð i¹ × Ñ Ð ×Ø Ò T [i]º ÒØÓÒ ×¸ Ð ÐÓÒ ØÙ ×Ô Ö li × li = N M =α ´ºµ Demostraci´n ÈÙ ×ØÓ o ÕÙ h(k) : K −→ [0, M − 1] × ×ØÖ ÙÝ ÙÒ ÓÖÑ Ñ ÒØ ¸ P(h(k) = i) = M Ô Ö ÙÒ 1 ÐÚ Ù ÐÕÙ Ö k ∈ Kº Ë P(k ∈ li) Ð ÔÖÓ Ð ÕÙ Ð Ð Ú × Ð Ö Ò Ð i¹ × Ñ Ð ×Ø Ó¹ ÖÖ ×ÔÓÒ ÒØ Ð ÒØÖ T [i]º Ð Ö Ñ ÒØ ¸ × ÙÒ Ð Ó × ÖÚ ÓÒ Ð Ô ÖÖ Ó ÒØ Ö ÓÖ¸ P(k ∈ li) = P(h(k) = i) = Mº × Ô٠׸ Ø Ò ÑÓ× N Ð Ú × ÙÒ ÓÖÑ Ñ ÒØ Ö Ô ÖØ × Ò M 1 Ð ×Ø ׺ Ð ×Ø li × ÓÖÖ ×ÔÓÒ ÓÒ ÙÒ ×ØÖ Ù ÓÒ ÒÓÑ Ð ÓÒ Ô Ö Ñ ØÖÓ p = M 1 Ý N ÒØ Ò× ÝÓ׺ ÈÓÖ Ø ÒØÓ¸ Ð Ñ × NM1 ר Ð Ñ × Ö Ú Ò ÐÓ× Ó× × Ù ÒØ × ÕÙ ÓÒØ Ð Þ Ò Ð ÒØ Ù Ø × ÕÙ × Ú × Ø Ò Ò ÙÒ Ù×ÕÙ ÐÐ Ý Ü ØÓ× ¸ Ö ×Ô Ø Ú Ñ ÒØ º Lema 5.2 Cantidad de cubetas inspeccionadas en una b´ squeda fallida sobre u una tabla hash con resoluci´n de colisiones por encadenamiento separado o Ë h(k) : K −→ [0, M − 1] ÙÒ ÙÒ ÓÒ × O(1) ÕÙ ×ØÖ ÙÝ ÙÒ ÓÖÑ Ñ ÒØ ÐÓ× Ð Ñ ÒØÓ× K [0, M − 1]º Ë T ÙÒ Ø Ð × ÐÓÒ ØÙ M ÓÒ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ × ÔÓÖ Ò Ò Ñ ÒØÓ × Ô Ö Ó Ý ÕÙ ÓÒØ Ò N Ð Ñ ÒØÓ׺ ÒØÓÒ ×¸ Ð ÒÙÑ ÖÓ Ù Ø × ÕÙ × Ò×Ô ÓÒ Ò Ò ÙÒ Ù×ÕÙ ÐÐ × UN = α = N M ´ºµ
  • 435.
    5.1. Manejo decolisiones 409 Demostraci´n o Ë k ÙÒ Ð Ú ÕÙ ÒÓ ×Ø ÒØÖÓ Ð Ø Ð º Ð ÔÖ Ñ Ö Ô ×Ó Ð Ù×ÕÙ × Ó Ø Ò Ö li = T [h(k)]º ר ÑÓ Ó¸ Ð ÒÙÑ ÖÓ Ù Ø × Úר Ö × ÓÖÖ ×ÔÓÒ ÓÒ Ð ÒÙÑ ÖÓ ÒÓ Ó× li¸ ÔÙ × × Ò × Ö Ó Ö ÓÖÖ Ö ÒØ Ö Ñ ÒØ li Ô Ö ×Ø Ö × ÙÖÓ× ÕÙ k ÒÓ × Ò Ù ÒØÖ Ò Ð Ø Ð º ÈÓÖ Ð Ð Ñ º½¸ × ÑÓ× ÕÙ li = α Lema 5.3 Cantidad de cubetas inspeccionadas en una b´squeda exitosa sobre u una tabla hash con resoluci´n de colisiones por encadenamiento separado o Ë h(k) : K −→ [0, M − 1] ÙÒ ÙÒ ÓÒ × O(1) ÕÙ ×ØÖ ÙÝ ÙÒ ÓÖÑ Ñ ÒØ ÐÓ× Ð Ñ ÒØÓ× K [0, M − 1]º Ë T ÙÒ Ø Ð ÐÓÒ ØÙ M ÓÒ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ × ÔÓÖ Ò Ò Ñ ÒØÓ × Ô Ö Ó Ý ÕÙ ÓÒØ Ò N Ð Ñ ÒØÓ׺ Ë k ∈ K ÙÒ Ð Ú Ù ÐÕÙ Ö º ÒØÓÒ ×¸ Ð ÒÙÑ ÖÓ ×Ô Ö Ó ÒÓ Ó× ÕÙ × Ú × Ø Ò Ò ÙÒ Ù×ÕÙ Ü ØÓ× × SN = 1 + α − 2 2M 1 ´ºµ Demostraci´n Ë K = {k0, k1, . . . , kN−1}¸ Ð ÓÒ ÙÒØÓ o Ð Ú × ÔÖ × ÒØ × Ò Ð Ø Ð ¸ ÓÒ i Ö ÔÖ × ÒØ Ð ÓÖ Ò Ò× Ö ÓÒ × Ö k0 × Ð ÔÖ Ñ Ö Ð Ú Ò× ÖØ ¸ Ñ ÒØÖ × ÕÙ kN−1 × Ð ÙÐØ Ñ º ØÓ× Ð × ÑÔÐ ¸ ×ÙÑ Ö ÑÓ× ÕÙ ÒÓ × Ô ÖÑ Ø Ò Ð Ú × ÙÔР׸ ÐÓ ÕÙ Ö ÕÙ Ö ÙÒ Ù×ÕÙ × Ù Ò Ð ×Ó Ö ÙÒ Ð ×Ø Ù Ò Ó × Ö Ð Þ ÙÒ Ò× Ö ÓÒº Ë pi Ð ÔÖÓ Ð ÕÙ × Ù×ÕÙ Ð Ð Ú ÔÖ × ÒØ kiº Ë lk Ð ÒÙÑ ÖÓ Ð Ñ ÒØÓ× ÕÙ ÔÖ i Ò ki Ò ×Ù Ð ×Ø ÓÐ × ÓÒ ×º ÒØÓÒ × N−1 E(lki ) = pilki . i=0 ×ÙÑ Ò Ó ÕÙ Ù ÐÕÙ Ö Ð Ú Ø Ò Ù Ð ÔÖÓ Ð × Ö Ù× ¸ ÒØÓÒ × pi = 1/Nº ×ÔÙ × Ò× ÖØ Ö Ð Ð Ú ki¸ Ý i Ð Ñ ÒØÓ× Ò Ð Ø Ð ¸ ÐÓ ÕÙ ¸ × ÙÒ Ð Ð Ñ º½¸ ÕÙ Ð ÐÓÒ ØÙ Ð Ð ×Ø ÓÒ Ö × ki × lk = i/Mº Ç × ÕÙ Ô Ö Ò ÓÒØÖ Ö ki i Ý ÕÙ Ö ÓÖÖ Ö M Ù Ø × ÔÖ i ×ÓÖ ×¸ ÔÙ × ki × Ò× ÖØÓ Ð ¬Ò Ð Ð Ð ×Ø Ý ÒÓ × Ô ÖÑ Ø Ò ÙÔÐ Ó׺ ×ØÓ ÓÒØ Ð Þ ÙÒ ØÓØ Ð M + 1¸ ÔÙ × Ý ÕÙ i Ö Ð Ù Ø ÕÙ ÓÒØ Ò kiº ר ÑÓ Ó¸ Ð ÒÙÑ ÖÓ ×Ô Ö Ó Ù Ø× Ü ÑÒ Ö× Ö N−1 N−1 i 1 i E(lki ) = pi +1 = +1 M N M i=0 i=0 N−1 N−1 1 1 N−1 = i+ 1 = +1 N M 2M i=0 i=0 α 1 = − +1 2 2M ÓÒ ×ØÓ× Ó× Ö ÒØ × Ð Ñ ×¸ ר ÑÓ× Ð ×ØÓ× Ô Ö ÒÙÒ Ö Ý ÑÓ×ØÖ Ö Ð ÔÖÓÔÓ× ÓÒ × Ù ÒØ Proposici´n 5.1 Desempe˜ o esperado de una tabla hash con resoluci´n de co- o n o lisiones por encadenamiento separado
  • 436.
    410 Cap´ ıtulo 5. Tablas hash Ë h(k) : K −→ [0, M − 1] ÙÒ ÙÒ ÓÒ × O(1) ÕÙ ×ØÖ ÙÝ ÙÒ ÓÖÑ Ñ ÒØ ÐÓ× Ð Ñ ÒØÓ× K [0, M − 1]º Ë T ÙÒ Ø Ð ÐÓÒ ØÙ M ÓÒ Ö ×ÓÐÙ ÓÒ ÓÐ ¹ × ÓÒ × ÔÓÖ Ò Ò Ñ ÒØÓ × Ô Ö Ó Ý ÕÙ ÓÒØ Ò ÙÒ Ñ Ü ÑÓ ÓØ Ó N Ð Ñ ÒØÓ׺ ÒØÓÒ ×¸ Ð × ÑÔ ÒÓ ×Ô Ö Ó Ð × ÓÔ Ö ÓÒ × Ò× Ö ÓÒ¸ Ù×ÕÙ Ý Ð Ñ Ò ÓÒ × O(α) = O(1)º Demostraci´no Ð ÔÙÒØÓ ÖÙ Ð Ð ÑÓ×ØÖ ÓÒ × ÔÖ Ò Ö ÕÙ Ø ÒØÓ M ÓÑÓ N ×ÓÒ Ú ÐÓÖ × ÓÒר ÒØ Ñ ÒØ ÓØ Ó׺ ÈÓÖ ÓØ Ó ÒØ Ò ÑÓ× ÕÙ ¸ × Ò N ÔÙ × Ö Ñ ÝÓÖ ÕÙ M¸ רÓ× Ú ÐÓÖ × ×Ø Ò ÓØ Ó× Ñ Ü ÑÓ× ÓÒÓ Ó׸ Ö ÞÓÒ ÔÓÖ Ð Ù Ð α Ø Ñ Ò ×Ø ÓØ Ó ÙÒ Ú ÐÓÖ Ñ Ü ÑÓ ÓÒר ÒØ º Ð Ö Ó ×ØÓ¸ ÔÓ ÑÓ× × Ô Ö Ö ÙÒ Ð × ÓÔ Ö ÓÒ × Inserci´n o Ò ×Ø ×Ó × Ö Ð Þ ÙÒ Ù×ÕÙ ÐÐ ¸ Р٠и × ÙÒ Ð Ð Ñ º¾¸ ×Ô Ö Ò×Ô ÓÒ Ö α = O(1) Ù Ø ×º B´squeda u ½º Ë Ð Ù×ÕÙ × ÐÐ ¸ ÒØÓÒ × Ð Ð Ñ º¾ ÔÐ Ý Ð ×Ô Ö ÒÞ × α = O(1) ´ º½¼µ ¾º Ë Ð Ù×ÕÙ × Ü ØÓ× ¸ ÒØÓÒ × Ð Ð Ñ º¿ ÔÐ Ý Ð ×Ô Ö ÒÞ × 1+ α 2 − 1 2M = O(1) ´ º½½µ Eliminaci´n o Ò ×Ø ×Ó × Ö Ð Þ ÙÒ Ù×ÕÙ Ü ØÓ× ¸ Ð Ù Ð Ò Ð Ø Ñ ÒØ Ö ÓÖ × ÑÓרÖÓ × Ö O(1) Ê ×Ô ØÓ Ð Ì LhashTable<Key>¸ Ð ÑÓ×ØÖ ÓÒ ×ÓÐÓ Ø Ò Ð Ù×ÕÙ ¸ Ô٠׸ ÔÓÖ ×Ù ÙÒ ÓÒ Ð ¸ Ò ×Ø Ì Ø ÒØÓ Ð Ò× Ö ÓÒ ÓÑÓ Ð Ð Ñ Ò ÓÒ ×ÓÒ O(1)º ÍÒ Ú ÒØ Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó × ÕÙ Ð ÒÙÑ ÖÓ Ð Ñ ÒØÓ× N ÔÙ × Ö Ñ ÝÓÖ ÕÙ Ð Ø Ñ ÒÓ Ð Ø Ð Mº Ä Ò× Ö ÓÒ ÒÓ Ø Ò ¸ ÒØÓÒ ×¸ ÔÓÖÕÙ ÔÖ Ó ÙÔ Ö× ÔÓÖ Ð × ÓÖ ¸ ÐÓ ÕÙ ÒÓ× ÔÖÓÔÓÖ ÓÒ ­ Ü Ð Ö ÙÒר Ò ×º ÐÓ× Ò ÓÕÙ × ØÖ ÓÒ Ð × Ô Ö Ñ Ò Ö ÓÐ × ÓÒ ×¸ ר × Ð ÙÒ Ó ÕÙ Ô ÖÑ Ø N > M × Ò ÕÙ ÑÙ Ó × Ö Ð Ö Ò Ñ ÒØÓ ×Ô Ö Óº ÆÓØ ÑÓ× ÕÙ Ð × ÑÔ ÒÓ Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó × ÙÒ ÔÖ ÓÒ¸ ÕÙ Ø Ò ÔÖÓ Ð ÐÐ × º ÍÒ Ò Ó Ö ×ÔÙ ×Ø ÒÓ× Ð × ÔÖÓÔÓÖ ÓÒ Ð Ú Ö ÒÞ ¸ Ð Ù Ð × ÐÑ ÒØ Ð ÙÐ Ð Ð ÔÖÙ Ð Ð Ñ º½ Ò Ð ÕÙ Ø ÖÑ Ò ÑÓ× ÕÙ Ð ÐÓÒ ØÙ ÙÒ Ð ×Ø ÓÐ × ÓÒ × × ×ØÖ ÙÝ ÒÓÑ ÐÑ ÒØ ÓÒ Ô Ö Ñ ØÖÓ p = M Ý N ÒØ 1 Ò× ÝÓ׺ ÈÓÖ Ø ÒØÓ¸ Ð Ú Ö ÒÞ × Ú Ö= σ2 = N M 1− 1 M = α− α M ´ º½¾µ Ù ÒØÓ Ñ ÝÓÖ × M¸ Ñ × ÔÖÓÜ Ñ × Ð Ú Ö ÒÞ Ð Ú ÐÓÖ α = liº Å ÒØÖ × Ñ ÝÓÖ × Ð ÒØ Ð Ñ ÒØÓ׸ Ñ ÝÓÖ Ø Ò × Ö Ð Ú Ö ÒÞ º Ë Ò Ñ Ö Ó¸ ר Ó × ÖÚ ÓÒ × Ò Ð Ö Ó α ݸ Ùר Ñ ÒØ ¸ Ð ÔÖÓÔÓ× ØÓ Ð ÙÐØ Ñ ÜÔÖ × ÓÒ × Ö ­ Ö Ð Ó ÕÙ ¸ Ñ ÝÓÖ Ö Ó¸ Ó × ¸ Ñ ÝÓÖ ÔÐ Ò ØÙ ¸ Ñ ÝÓÖ × Ð Ú Ö ÒÞ º
  • 437.
    5.1. Manejo decolisiones 411 5.1.3.3 Encadenamiento cerrado Ð Ù Ð ÕÙ Ò Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó¸ Ò ×Ø ×ØÖ Ø Ð × ÓÐ × ÓÒ × × Ò Ò Ò Ò Ð ×Ø × ÒÐ Þ ×¸ Ô ÖÓ Ð Ö Ò ×ØÖ Ò ÕÙ Ð × Ù Ø × Ö × Ò Ò Ð ÔÖÓÔ Ø Ð º Ù Ò Ó Ó ÙÖÖ ÙÒ ÓÐ × ÓÒ¸ × ×ÓÒ Ð Ò ÐÑ ÒØ Ð Ø Ð Ò Ù×ÕÙ ÙÒ Ù Ø Ú º Ä Ø Ð ÑÔÐÓ Ð ×Ù ¹× ÓÒ ÒØ Ö ÓÖ¸ ÓÒ Ð × Ñ ×Ñ × Ð ×Ø × ÓÐ × ÓÒ ×¸ × Ú ×ÐÙÑ Ö × 0 k1 1 k10 2 k8 3 k11 4 5 k2 6 k5 7 k9 8 k3 9 10 k4 11 k7 M−2 M − 1 k6 ÆÓØ ÑÓ× Ð ÓÐ × ÓÒ {k6, k11}¸ Ð Ù Ð Ö ÕÙ Ö Ó ÓÒØ ÒÙ Ö Ð ×ÓÒ Ó ÔÓÖ Ð ÔÖ Ò Ô Ó Ð Ø Ð ×Ø Ð ÒÞ Ö Ð Ù ÖØ ÒØÖ Ð Ø Ð × Ö¸ Ð ×ÓÒ ÓÐÒ Ð × Ö Ö ÙÐ Öº Ð ×ÓÒ Ó Ö ÕÙ Ö ÙÒ ÓÖÑ ×Ø Ò Ù Ö × ÙÒ Ù Ø ×Ø Ó ÒÓ Ú º Ä Ñ Ò Ö Ò Ö ØÖ ÓÒ Ð × Ù× Ö ÙÒ Ø ÓÒ Ú ÐÓÖ BUSY Ô Ö Ò Ö Ó ÙÔ ÓÒ¸ Ó¸ EMPTY Ô Ö Ò Ö ×ÔÓÒ Ð º B´squeda u Ä Ù×ÕÙ × ÒØ Ð Ð Ò Ò Ñ ÒØÓ × Ô Ö Óº Eliminaci´n o Ä Ð Ñ Ò ÓÒ¸ ÕÙ Ö ÕÙ Ö Ð Ù×ÕÙ ¸ × Ö Ñ Ø Ñ Ö Ö Ð ÒØÖ ÕÙ ÓÒØ Ò Ð Ð Ñ ÒØÓ Ð Ñ Ò Ö ÓÑÓ Empty ݸ Ò ×Ó ÕÙ ×ÔÙ × Ý Ò ÓÐ × ÓÒ ×¸ × ÓÖØÓ¹ Ö Ù Ø Ö Ð ÒÐ Ð Ð Ñ ÒØÓ ÔÖ ×ÓÖ Ô Ö ÕÙ ÔÙÒØ Ð Ð Ñ ÒØÓ ×Ù ×ÓÖº ÍÒ ×Ó ×Ô ÐÑ ÒØ Ô ÖØ ÙÐ Ö Ó ÙÖÖ Ù Ò Ó × Ð Ñ Ò Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ ÒØÖÓ ÙÒ Ð ×Ø ÓÐ × ÓÒ ×º Ò ×Ø × ØÙ ÓÒ¸ Ð ÓÖØÓ¹ Ö Ù ØÓ ÒÓ × ÔÙ Ö Ð Þ Ö Ö Ø Ñ ÒØ ¸ ÔÙ × ÒÓ × Ø Ò ÙÒ ÓÐ × ÓÒ ÕÙ ÔÖ Ð Ð Ñ ÒØÓ Ð Ñ Ò Óº È Ö Ö ×ÓÐÚ Ö ×ØÓ¸ Ð × ÙÒ Ó Ð Ñ ÒØÓ Ò Ð Ð ×Ø × ÑÙ Ú Ð ÔÓ× ÓÒ Ð Ñ Ò ÓÒ Ý¸ Ô ÖØ Ö ×Ø ÔÓ× ÓÒ¸ × Ö Ð Þ Ð ÓÖØÓ¹ Ö Ù ØÓ Ð Ø Ö Ö Ð Ñ ÒØÓ ÓÐ Ò ÒØ º È Ö ÙÒ ÔÓØ Ø Ó ÓÒ ÙÒØÓ ÓÐ × ÓÒ × {ki, kj, kk, kl}¸ Ð × ØÙ ÓÒ × ÔÙ ÒØ ÖÔÖ Ø Ö Ô ØÓÖ Ñ ÒØ × Ò Ò Ð ×¸ Ð Ù×ÕÙ ÙÒ Ù Ø ÓÒ ×Ø ØÙ× EMPTY × Ð ÒÓÑ Ò ÔÖÓ Ò º ËÓÒ Ö × Ð Ø ÖÑ ÒÓ ÕÙ Ù× Ö ÑÓ× Ò ×Ø ÐÐ ÒÓ Ô Ö Ö Ö ÖÒÓ× Ð Ô Ð Ö ÒØ Ö ÓÖº
  • 438.
    412 Cap´ ıtulo 5. Tablas hash ki kj kj kk kk kl kl ÈÙ ×ØÓ ÕÙ ÓÒ ×Ø Ø Ò ÐÓ× Ð Ñ ÒØÓ× ÔÙ Ò ÑÓÚ Ö× ×Ù ÔÓ× ÓÒ ÓÖ Ò Ð Ò¹ × Ö ÓÒ¸ ר ×ÕÙ Ñ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ × ÒÓ Ô ÖÑ Ø Ñ ÒØ Ò Ö ÔÙÒØ ÖÓ× Ð Ñ ÒØÓ× Ð ÓÒ ÙÒØÓ ÐÑ Ò Ó Ò Ð Ø Ð × ØÙ ÓÒ Ò × Ð Ò Ð ÙÒÓ× ×Ó׺ Inserci´n o Ä Ò× Ö ÓÒ × Ð ÓÔ Ö ÓÒ Ñ × ÓÑÔÐ Ò ×Ø ×ÕÙ Ñ Ý × Ö Ð Þ ÓÑÓ × Ù ½º i = h(k) ÑÓ M ¾º Ë A[i].busy == EMPTY =⇒ ´ µ A[i].key = k ´ µ A[i].busy = BUSY ´ µ Ì ÖÑ Ò Öº ¿º ÐÓ ÓÒØÖ Ö Ó =⇒ ´ µ Ê ÓÖÖ Ö Ð Ð ×Ø ÒÐ Þ ×Ø Ð ÙÐØ ÑÓ Ð Ñ ÒØÓ × k ×Ù ÔÓ× ÓÒ Ò Ð Ø Ðº ´ µ Ô ÖØ Ö k Ù× Ö Ð Ò ÐÑ ÒØ Ò Ð Ø Ð Ð ÔÖ Ñ Ö ÒØÖ ÓÒ Ú ÐÓÖ EMPTY × i Ð Ò ×Ø ÒØÖ º ´ µ A[i].key = k ´ µ A[i].busy = BUSY ´ µ A[j].next = A[i] 5.1.3.4 An´lisis informal del encadenamiento cerrado a × ÖÒÓ× Ð ×ÙÑ Ö ÕÙ × M ≈ ∞¸ ÒØÓÒ × Ð Ò Ð × × × ÔÖÓÜ Ñ Ó Ð Ò ¹ Ò Ñ ÒØÓ × Ô Ö Óº ר ×ÙÔÓ× ÓÒ Ð Ó ÖÖ Ð ×Ø ¸ ÒÓ× Ô ÖÑ Ø ÔÖ Ò Ö ÕÙ ¸ Ô Ö M N¸ × ÙÒ ÐÓ× Ð Ñ × ´ º¾µ Ý ´ º¿µ¸ Ð Ò Ð × × ÔÙ ÔÖÓÜ Ñ Ö× SN ≈ α 2 − 1 2M +1 ´ º½¿µ UN ≈ α ´ º½ µ ÚÖ ≈ α− α M ´ º½ µ Ò Ð ×Ù ¹× ÓÒ Ü º½º º¿ ´Ô Ò ¾¼µ ÔÖ × ÒØ Ö ÑÓ× ÙÒ Ò Ð × × Ñ × ÓÖÑ Ð ÕÙ × ÔÐ Ð ×Ø ×ØÖ Ø º
  • 439.
    5.1. Manejo decolisiones 413 Å ÒØÖ × Ñ ÒÓÖ × Ð Ö α¸ Ñ × ÔÖ × Ý Ö Ð ×Ø × Ð ÔÖÓÜ Ñ ÓÒº À ר ÕÙ Ú ÐÓÖ α × ÙÑÔÐ Ð ÔÖÓÜ Ñ ÓÒ Ð Ò Ð × × ÓØÖ Ø Ò ¸ ÜÔÐ Ó Ò Ü º½º º ´Ô Ò ¾ µ¸ ÒÓ× Ô ÖÑ Ø Ú ×ÐÙÑ Ö Ö ÕÙ Ð ÔÖÓÜ Ñ ÓÒ × Ù Ò ×Ø ÙÒ ØÓÖ Ö α = 0, 7 × Ö¸ ÙÒ ÔÓÖ ÒØ Ó ÙÔ ÓÒ Ð ¼±º ÄÓ ÒØ Ö ÓÖ ÒÓ× Ò ÕÙ × × ÑÓ× ÒרÖÙÑ ÒØ Ö Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð ÓÒ ÙÒ Ø Ð × Ý × ÑÔ ÒÓ ×Ô Ö Ó O(1)¸ ÒØÓÒ × ÑÓ× ×Ø Ñ Ö Ð ÒØ ×Ô Ö Ð Ñ ÒØÓ× ÕÙ Ú ÑÓ× Ù Ö Ö Ý¸ Ò ÙÒ ÓÒ Ð ×Ø Ñ ÓÒ¸ × Ó Ö M ÑÓ Ó ÕÙ ÒÓ× × Ø × Ð Ú ÐÓÖ α Ô Ö Ð Ù Ð ÐÓ× Ö ×ÙÐØ Ó× ×ÓÒ Ù ÒÓ׸ Ñ × ÙÒ Ñ Ö Ò Ó ØÓÖ ÖÖÓÖº Ë ¸ ÔÓÖ ÑÔÐÓ¸ ×Ô Ö ÑÓ× 1000 Ð Ñ ÒØÓ׸ ÒØÓÒ × × Ó ÑÓ× M = 1465¸ ÐÓ Ù Ð Ù Ö Ð ¼± Ñ Ò ÓÒ Ó¸ Ñ × ÙÒ ± ÓÑÓ ØÓÖ ÖÖÓÖ Ò Ò Ö Ð º ÍÒ Ñ ÓÖ Ô Ö ×Ø Ò ÓÕÙ ÓÒ× ×Ø Ò ÑÔÐ Ö ÙÒ Ö ÓÒØ Ù Ð Ø Ð Ü ÐÙ¹ × Ú Ñ ÒØ º Ò ×Ø ×Ó Ð Ø Ð Ø Ò ÙÒ Ø Ñ ÒÓ M + C ÒØÖ ×º Ù Ò Ó Ó ÙÖÖ ÙÒ ÓÐ × ÓÒ¸ ÒØÓÒ × Ð ×ÓÒ Ó Ð Ò Ð × Ö Ð Þ ÒØÖ Ð Ö Ò Ó [M..C)º Ê ×ÙÐØ Ó× ÑÔ Ö Ó× Ö ÔÓÖØ Ó× ÔÓÖ ¾¿ Ò Ò ÕÙ ÙÒ Ú ÐÓÖ C ≈ 1.14M × ×Ù¬ ÒØ Ô Ö ×Ô Ö Ö Ò× ÓÐ × ÓÒ × Ó× Ð Ñ ÒØÓ׺ ×ØÓ Ø Ò × ÒØ Ó Ð ÐÙÞ Ð Ô Ö Ó Ð ÙÑÔÐ ÒÓ׸ Ð Ù Ð Ô Ø ÒØ ÐÓ ×Ø ÒØ ÔÖÓ Ð ÕÙ × ÙÒ ÓÐ × ÓÒ Ó× Ð Ñ ÒØÓ× Ô ÖÓ ÙÒ Ò Ð × × Ô Ö ÓÐ × ÓÒ × ØÖ × Ó Ñ × Ð Ñ ÒØÓ× ÒÓ× Ò ÑÙ Ñ ÒÓ× ÔÖÓ Ð º ר ר Ó ØÖ Ø Ñ ÒØÓ Ð × Ø Ð × × ¸ ÔÖÓ Ð Ñ ÒØ Ð ÙÒ Ð ØÓÖ Ý Ó × ÖÚ Ó¸ ÓÑÓ ×Ú ÒØ ר Ò ÓÕÙ ¸ Ð Ð Ñ Ø ÓÒ ÕÙ × ÑÔÓÒ ×Ó Ö Ð Ñ Ü ÑÓ ÒÙÑ ÖÓ Ð Ñ ÒØÓ× ÕÙ ÔÓ ÑÓ× Ù Ö Ö Ò ÙÒ Ø Ð × ÓÒ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ × ÔÓÖ Ò Ò Ñ ÒØÓ ÖÖ Óº Ó Ð Ñ ×Ñ Ð Ò Ô Ò× Ñ ÒØÓ¸ Ø Ñ Ò × ÔÙ Ö Ó × ÖÚ Ö¸ ÓÑÓ Ú ÒØ Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó¸ ÕÙ ×Ø Ô ÖÑ Ø Ù Ö Ö Ñ × Ð ¹ Ñ ÒØÓ× ÕÙ Ð Ú ÐÓÖ Mº ٠Р׸ ÒØÓÒ ×¸ Ð × ÒØ Ó ×Ø Ø Ò Ð ×ÓÑ ÖÓ Ý Ð ×ÓÖÔÖ × Ñ Ö Ó ÑÙ Ó× ×ØÙ ÒØ ׸ Ò ÐÙ× Ú ¸ Ð ÙÒÓ× ×ØÙ Ó×Ó׸ Ù Ò Ó × Ö Ð Þ ÕÙ ¸ ÓÒ× Ö Ò Ó ÓÖÖ Ø Ñ ÒØ ÐÓ× ØÓÖ × ÒÚÓÐÙ Ö Ó׸ Ò Ô ÖØ ÙÐ Ö¸ Ð Ú ÐÓÖ ×Ô Ö Ó N¸ ÐÓ× Ò ÓÕÙ × ÕÙ Ö ×Ù ÐÚ Ò ÓÐ × ÓÒ × ÒØÖÓ Ð Ñ ×Ñ Ø Ð Ø Ò Ò × Ö Ñ ÓÖ × ÑÔ ÒÓ ÕÙ Ð Ò Ò Ñ ÒØÓ × Ô Ö Óº Ä ÔÖ Ò× ÓÒ ×Ø Ö Ð × Ð Ø Ñ ÒØ Ð × × Ù ÒØ × Ó × ÖÚ ÓÒ × ½º Ò Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó Ð × Ù Ø × × Ô ÖØ Ò Ý Ð Ö Ò ØÖ Ú × Ð Ñ Ò ¹ ÓÖ Ñ ÑÓÖ º Ð Ñ Ò Ó Ñ ÑÓÖ Ò Ñ ¸ Ø ÒØÓ Ô Ö Ö × ÖÚ ÖÐ ÓÑÓ Ô Ö Ð Ö ÖÐ ¸ ÒÓ ×ÓÐÓ ØÓÑ ÙÒ Ø ÑÔÓ Ñ × Ö ×Ô ØÓ ÙÒ Ò ÓÕÙ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ × ÕÙ Ð × ÓÐÓÕÙ ÒØÖÓ Ð Ñ ×Ñ Ø Ð ¸ × ÒÓ ÕÙ ×Ù × ÑÔ ÒÓ × Ú Ö ¹ Ð × ÙÒ Ð Ö Ð Ñ Ò ÓÖ Ö ÕÙ ¸ ×Ù Ú Þ¸ Ô Ò ÓÒ ÓÒ × Ø Ð × ÓÑÓ Ö Ù Ò Ö × ÖÚ ÓÒ Ý Ð Ö Ó Ý Ð ÒØ ØÙ Ð ÐÓÕÙ × Ö × ÖÚ Ó׺ È Ö Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó¸ Ð Ô ÖØ Ó Ø Ð ÓÔ Ö ÓÒ Ò× Ö ÓÒ¸ Ñ ÒØÖ × ÕÙ Ð Ð Ö ÓÒ Ð Ð Ñ Ò ÓÒº ÈÓÖ Ð ÓÒØÖ Ö Ó¸ ÓÒ Ð Ò Ò Ñ ÒØÓ ÖÖ Ó Ý Ñ × ×ØÖ Ø × ÕÙ ÓÐÓ Ò Ð × ÓÐ × ÓÒ × ÒØÖÓ Ð Ñ ×Ñ Ø Ð ¸ ÒÓ × Ù× Ð Ñ Ò ÓÖ Ñ ÑÓÖ º Ð Ù Ò ÔÙ Ö ×Ù Ö Ö Ø Ò Ö ÔÖ ¹ Ô ÖØ Ó ÙÒ ÓÒ ÙÒØÓ Ù Ø ×¸ Ô ÖÓ¸ ÒÓ × ×ØÓ Ô Ö Ó ÙÒ Ò ÓÕÙ ÖÖ Ó º ¾º Ò Ð Ò Ò Ñ ÒØÓ ÖÖ Ó Ý Ñ × ×ØÖ Ø × ÕÙ ÓÐÓÕÙ Ò ÓÐ × ÓÒ × ÒØÖÓ Ð Ñ ×Ñ Ø Ð ¸ Ð ×ÓÒ Ó Ð Ò Ð × Ö Ð Þ ×Ó Ö Ù Ø × ÕÙ ×Ø Ò ÓÒØ Ù × Ò Ò Ò Ò Ö ¸ ×Ù Ð Ù× Ö× Ð Ø ÖÑ ÒÓ ØÓÖ × ÙÖ Ô Ö ÜÔÖ × Ö ÙÒ ×Ó Ö ¹ Ð ÙÐÓ Ò ÓÒ× ¹ Ö ÓÒ Ð Ò ÖØ ÙÑ Ö Ð ÑÓ ÐÓ¸ ÖÖÓÖ × Ð ÙÐÓ Ò ×Ù× Ú Ö× × × × Ý Ø ×¸ Ý ÖÖÓÖ × Ò Ð × Ö × ×Ô Ö ×º
  • 440.
    414 Cap´ ıtulo 5. Tablas hash Ñ ÑÓÖ ¸ ÐÓ ÕÙ ÔÖÓÚ Ð Ð Ö Û Ö º ÈÓÖ Ð ÓÒØÖ Ö Ó¸ ÓÒ Ð Ò ¹ Ò Ñ ÒØÓ × Ô Ö Ó¸ Ð × Ù Ø × ×Ø Ò Ò Ö ÓÒ × Ñ ÑÓÖ × ÓÒØ Ò٠׺ ÈÓÖ ÓÒ× Ù ÒØ ¸ Ô Ö Ð Ñ ×ÑÓ ÓÒ ÙÒØÓ ÓÐ × ÓÒ ×¸ ×Ù Ò×Ô ÓÒ ÒØÖÓ Ð ÔÖÓÔ Ø Ð Ø Ò × Ö ÓÒ× Ö Ð Ñ ÒØ Ñ × Ö Ô ÕÙ ×Ù Ò×Ô ÓÒ ÐÓ Ð Ö Ó ÙÒ Ò Ù Ø × × ÓÒØ ÒÙ × Ò Ð Ñ ÑÓÖ ¸ ÔÙ × Ð ÔÖ Ñ ÖÓ ÔÖÓÚ Ð Ý Ð ÓØÖÓ ÒÓº 5.1.4 Direccionamiento abierto ÓÑÓ Ý ÐÓ Ò ÑÓ׸ Ò Ð Ö ÓÒ Ñ ÒØÓ ÖØÓ ØÓ ÓÐ × ÓÒ × Ö ×Ù ÐÚ ÒØÖÓ Ð Ø Ð × Ò ÔÙÒØ ÓÖ Ð ÓÐ × ÓÒº ÙÒ Ñ ÒØ ÐÑ ÒØ ¸ Ð × Ð × ÓÒØ Ò Ò Ö ×ØÖÓ× ÓÒ Ð Ú ÐÓÖ Ð Ú Ý ÙÒ Ñ Ö ¸ ÒÓÑ Ò ×Ø ØÙ× ¸ ÓÒ ØÖ × ÔÓ× Ð × Ú ÐÓÖ × EMPTY Ð Ð ×Ø ×ÔÓÒ Ð Ô Ö ÐÑ Ò Ö ÙÒ Ð Ú º BUSY Ð Ð ×Ø Ó ÙÔ ÔÓÖ ÙÒ Ð Ú º DELETED Ð Ð ÓÒØ Ò ÙÒ ÒØÖ ÕÙ Ò Ð ÙÒ ÑÓÑ ÒØÓ ÓÒØÙÚÓ ÙÒ Ð Ú Ý ÕÙ ÐÙ Ó Ù ÓÖÖ º Å × Ð ÒØ Ú Ö ÑÓ× ÔÓÖ ÕÙ × Ò × Ö ×Ø Ñ Ö º ÍÒ Ù Ø tabla[i] ÔÙ ×Ø Ö Ó ÙÔ ÓÑÓ Ö ×ÙÐØ Ó Ö ØÓ Ð ÙÒ ÓÒ × Ó ÔÓÖÕÙ × ÙÒ ÓÐ × ÓÒ Ý Ù × Ó ÔÓÖ Ð ÙÒ Ø Ò ×ÓÒ Óº Ù ÐÕÙ Ö ÐÓ× Ó× ×Ó× × ×Ø Ò Ù Ñ ÒØ ÓÑÔÖÓ ÓÒ Ð ÔÖ Ó h(Ø Ð [i]) = iº Ë Ð ÔÖ Ó × ÖØÓ¸ ÒØÓÒ × Ð Ð Ú ÒÓ Ù ÙÒ ÓÐ × ÓÒº 5.1.4.1 Sondeo ideal (sondeo uniforme) ÈÙ ×ØÓ ÕÙ Ð × ÓÐ × ÓÒ × Ò ×Ø Ö ÒØÖÓ Ð ÔÖÓÔ Ø Ð ¸ Ð ×ØÖ Ø × Ö Ñ Ø Ò ÓÒØÖ Ö ÙÒ Ù Ø ÙÝÓ Ú ÐÓÖ × ×Ø ÒØÓ EMPTYº ÈÙ Ö× ÕÙ Ð ×ØÖ Ø ×Ô Ö× ÓÒ ÖÖ ´ Ö ÓÒ Ñ ÒØÓ ÖØÓµ × ÙÒ ×ØÖ Ø ×ÓÒ Óº ٠Р׸ ÒØÓÒ ×¸ Ð ×ØÖ Ø ×ÓÒ Ó Ð Ë ÔÖ ×ÙÑ ÕÙ × ÕÙ ÐÐ ÕÙ Ò×Ô ÓÒ Ð ØÓÖ Ñ ÒØ Ð × Ù Ø × × Ö¸ Ù Ò Ó Ó ÙÖÖ ÙÒ ÓÐ × ÓÒ¸ Ð ÔÖÓÜ Ñ Ù Ø ×ÓÒ Ö Ò ÓÒ ÓÐÓ Ö Ð ÓÐ × ÓÒ × Ð ÓÒ Ö× Ð ØÓÖ Ñ ÒØ Ò Ð Ò¹ Ø ÖÚ ÐÓ [0, M− 1]º Ì Ô Ñ ÒØ ¸ ר ×ÙÔÓ× ÓÒ × ÓÒÓ ÓÑÓ hashing o dispersi´n o universal Ý × Ð Ð ÔÓÖÕÙ Ð Þ ÐÓ ÕÙ × Ö Ð Ñ ÓÖ × ÑÔ ÒÓ Ù ÐÕÙ Ö ×ØÖ Ø ÖÖ Ñ Ò Ó ÓÐ × ÓÒ ×º Lema 5.4 (Peterson 1957 [27]) Cantidad de cubetas inspeccionadas en una b´ squeda fallida sobre una tabla hash con resoluci´n de colisiones por direc- u o cionamiento y sondeo ideal Ë h(k) : K −→ [0, M − 1] ÙÒ ÙÒ ÓÒ × O(1) ÕÙ ×ØÖ ÙÝ ÙÒ ÓÖÑ Ñ ÒØ ÐÓ× Ð Ñ ÒØÓ× K [0, M − 1]º Ë T ÙÒ Ø Ð × ÐÓÒ ØÙ M ÓÒ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ × ÔÓÖ Ö ÓÒ Ñ ÒØÓ ÖØÓ Ý ÕÙ ÓÒØ Ò N Ð Ñ ÒØÓ׺ Ë k ∈ K ÙÒ Ð Ú Ù ÐÕÙ Ö º ÒØÓÒ ×¸ Ð ÔÖÓÑ Ó Ù Ø × ÕÙ × Ú × Ø Ò Ò ÙÒ Ù×ÕÙ ÐÐ × M+1 UN = M−N+1 ´ º½ µ
  • 441.
    5.1. Manejo decolisiones 415 Demostraci´n o ÒÙÒ ÑÓ× UN Ð × Ù ÒØ Ñ Ò Ö UN = ËÙÑ Ð ÌÓØ Ð ÒØ ÓÒ¬ ÙÖ ×ÓÒ Ó× i ÓÒ × ÔÓ× Ð × Ù Ø × Ò Ù×ÕÙ Ð Ø Ð × ÐÐ = πi πN ´ º½ µ Ë Ø Ò ÑÓ× M Ù Ø × ÒÙÑ Ö × ÒØÖ 1 Ý M Ð × Ö Ô ÖØ ÑÓ× Ð × N Ð Ú × Ò× ÖØ ׸ ÒØÓÒ × Ð ØÓØ Ð Ñ Ò Ö × ÔÓ× Ð × ÖÐÓ × M Ó × ¸ Ð ØÓØ Ð ÓÒ¬ ÙÖ ÓÒ × N ÔÓ× Ð × Ð Ø Ð × ×ØÓ × πNº Ë i Ð ÒØ Ù Ø × ÕÙ × Ò×Ô ÓÒ Ò Ò ÙÒ Ù×ÕÙ ÐÐ ÓÒ ×ÓÒ Ó Ðº È Ö ÕÙ × ÓÒ×ÙÑ Ò i ×ÓÒ Ó׸ Ð × ÔÖ Ñ Ö × i − 1 Ù Ø × Ò Ø Ò Ö ×Ø ØÙ× BUSY¸ Ñ ÒØÖ × ÕÙ Ð ×Ø ØÙ× Ð ÙÐØ Ñ × Ö EMPTYº Ò i ×ÓÒ Ó× × Ö Ú × Ò i − 1 Ù Ø × ÕÙ ÓÒØ Ò Ò Ð Ú × Ñ ÒØÖ × ÕÙ Ð i¹ × Ñ Ù Ø ×ÓÒ ×Ø Ú º Ä ÒØ ×ÔÓ× ÓÒ × Ò ÕÙ × ×ÓÒ Ò i − 1 Ð Ú × × ÕÙ Ú Ð ÒØ Ð ÒØ ÑÒÖ× ×ØÖ Ù Ö Ð × N − i + 1 Ð Ú × Ö ×Ø ÒØ × Ò Ð × M − k Ù Ø × Ö ×Ø ÒØ × × Ö N−i+1 M−i Ô Ö ÙÒ ×ÔÓ× ÓÒ Ð Ú × Ô ÖØ ÙÐ Öº Ð ØÓØ Ð ÔÓ× Ð × Ð ×ÙÑ Ô Ö ØÓ Ó× ÐÓ× Ú ÐÓÖ × ÔÓ× Ð × i M M M−i M−i πi = i N−i+1 = i M−N−1 ´ÈÓÖ × Ñ ØÖ n k = n n−k µ i=1 i=1 M−1 M−2 1 0 = +2 + · · · + (M − 1) +M M−N−1 M−N−1 M−N−1 M−N−1 M−1 M−1 M−1 = (M − i) i M−N−1 = M i M−N−1 − i i M−N−1 ´ º½ µ i=0 i=0 i=0 ÓÖ ¸ ØÓ× ÔÐ Ö Ð ÔÖÓÔ Ð ×ÙÑ ØÓÖ Ð Ò ×ÙÔ Ö ÓÖ ÐÓ× Ó ¬¹ ÒØ × ÒÓÑ Ð × ¸ Ú ÑÓ× ÜÔÖ × Ö Ð ØÓÖ i ÓÑÓ i + 1 M−1 M−1 i i πi = M − (i + 1 − 1) M−N−1 M−N−1 i=0 i=0 M−1 M−1 i i = (M − 1) − (i + 1) ´ º½ µ M−N−1 M−N−1 i=0 i=0 (A) (B) ´ µ × Ð ÙÐ Ð Ö Ø Ñ ÒØ ÔÓÖ Ð ÔÖÓÔ Ð ×ÙÑ ØÓÖ Ð Ò ×ÙÔ Ö ÓÖ M M (A) = (M − 1) = (m − 1) ´ÔÓÖ × Ñ ØÖ µ ´ º¾¼µ M−N N Ð Ù ÒØÓ ´ µ¸ ÔÓ ÑÓ× ×ÓÖ Ö½¼ Ð ØÓÖ (i − 1) × ÑÙÐØ ÔÐ ÑÓ× Ý Ú ÑÓ× ÔÓÖ `n ´ ` ´ Ê Ù Ö × ÕÙ k = ÔÙ × ÐÓ× k Ð Ñ ÒØÓ× ÓÑ Ò Ó× × ÑÔÖ ×Ó Ö Ò n − kº n n−k Ä ÔÖÓÔ Ò Ù ×Ø ÓÒ × × ¬Ò ÓÑÓ n ! ! k n+1 = . k=0 m m+1 ÍÒ Ü Ð ÒØ Ö Ö Ò ×Ó Ö ÓÔ Ö ÓÒ × ÓÒ Ó ¬ ÒØ × ÒÓÑ Ð × ÐÓ ÓÒר ØÙÝ Ð Ø ÜØÓ ÓÒ Ö Ø Å ØÑ Ø × ½ º ½¼ ! ! n n n−1 = . m m m−1
  • 442.
    416 Cap´ ıtulo 5. Tablas hash (M − N − 1) M−1 M−N i (B) = (i + 1) M−N M−N−1 i=0 M−1 i+1 M+1 = (M − N) = (M − N) M−N M−N+1 i=0 M+1 = (M − N) ´ÔÓÖ × Ñ ØÖ µ ´ º¾½µ N ËÙר ØÙÝ Ò Ó ´ µ Ý ´ µ Ò ´ º½ µ M M+1 πi = (M − 1) − (M − N) N N M! (M + 1)! = (M − 1) − (M − N) (m − N)!N! (M − N + 1)!N! M! (M + 1)M! = (M − 1) − (M − N) (m − N)!N! (M − N + 1)(M − N)!N! M M−N M+1 M = (M + 1) 1− = ´ º¾¾µ N M−N+1 M−N+1 N Ð ×Ùר ØÙ Ö ´ º¾¾µ Ý Ð Ú ÐÓÖ πN = m Ò ´ º½ µ Ó Ø Ò ÑÓ× ´ º½ µ N ÓÒ ÓÖÑ M, N −→ ∞¸ Ð ÜÔÖ × ÓÒ ´ º½ µ Ø Ò − + −1 UN = Ð Ñ MM N 1 1 = (1 − α)−1 M,N− →∞ + ´ º¾¿µ Ð Ö ×ÙÐØ Ó ÔÖÓÜ Ñ M+1 ≈ α¸ ÐÓ ÕÙ Ò Ð Ö Ð N ÔÙ × Ö ÔÖ ×Ó¸ ÔÙ × ×Ù Ð Ù× Ö× ÙÒ Ù Ø Ñ × ÕÙ Ð Ú ÐÓÖ ÔÖ Ú ×ØÓ M ÕÙ ÙÒ ÒØ Ò Ð Ô Ö Ø Ò Ö Ð ×ÓÒ Ó Ò ØÓ Ó× ÐÓ× ×Ó׺ ÁÒØÙ Ø Ú Ñ ÒØ ¸ Ð ÔÖÓ Ð ÕÙ Ð Ò× Ö ÓÒ Ó ÙÖÖ Ò Ð ÔÖ Ñ Ö ×ÓÒ Ó ´ Ð Ö ØÓ Ö ×ÙÐØ ÒØ Ð ÙÒ ÓÒ × µ × αº Ð Ñ ×ÑÓ ÑÓ Ó¸ Ð ÔÖÓ Ð Ö ÕÙ Ö Ö× Ó× ×ÓÒ Ó׸ × α Ò ¬Ò¸ Ò Ö ÐÑ ÒØ ¸ Ð ÔÖÓ Ð 2º Ö ÕÙ Ö Ö× k ×ÓÒ Ó× Ð × × αkº Ä ÒØ ×ÓÒ Ó× ÕÙ × Ö Ð Þ Ò Ò ÙÒ Ù×ÕÙ Ü ØÓ× ×Ø ÜÔÖ × ÔÓÖ Ð Ð Ñ × Ù ÒØ Lema 5.5 (Peterson 1957 [27]) Cantidad de cubetas inspeccionadas en una b´squeda exitosa sobre una tabla hash con resoluci´n de colisiones por di- u o reccionamiento y sondeo ideal Ë h(k) : K −→ [0, M − 1] ÙÒ ÙÒ ÓÒ × O(1) ÕÙ ×ØÖ ÙÝ ÙÒ ÓÖÑ Ñ ÒØ ÐÓ× Ð Ñ ÒØÓ× K [0, M − 1]º Ë T ÙÒ Ø Ð × ÐÓÒ ØÙ M ÓÒ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ × ÔÓÖ Ö ÓÒ Ñ ÒØÓ ÖØÓ Ý ÕÙ ÓÒØ Ò N Ð Ñ ÒØÓ׺ Ë k ∈ K ÙÒ Ð Ú Ù ÐÕÙ Ö º ÒØÓÒ ×¸ Ð ÔÖÓÑ Ó Ù Ø × ÕÙ × Ú × Ø Ò Ò ÙÒ Ù×ÕÙ Ü ØÓ× × M+1 SN = N HM+1 − HM−N+1 ´ º¾ µ
  • 443.
    5.1. Manejo decolisiones 417 Demostraci´n Ë Si Ð ÔÖÓÑ Ó o Ù Ø × ÕÙ × ×ÓÒ Ò Ò ÙÒ Ù×ÕÙ Ü ØÓ× ×Ó Ö ÙÒ Ø Ð ÓÒ i Ð Ñ ÒØÓ׺ Ð ÙÒ Ñ ÒØÓ Ð ÑÓ×ØÖ ÓÒ × ÜÔÖ × Ö ÙÒ Ù×ÕÙ ×Ó Ö ÙÒ Ø Ð ÕÙ ÓÒØ Ò i Ð Ñ ÒØÓ× Ò ÙÒ ÓÒ Ð Ù×ÕÙ ÐÐ ÕÙ Ù Ó Ö Ð Þ Ö× Ô Ö Ò× ÖØ Ö Ð i¹ × ÑÓ Ð Ñ ÒØÓ Ó × Si = Ui−1º Ð ÔÖÓÑ Ó SN ÔÙ ÜÔÖ × Ö× ¸ Ò Ø ÖÑ ÒÓ× ´ º½ µ¸ Ð × Ù ÒØ Ñ Ò Ö N−1 1 Si = Ui N i=0 N−1 N−1 1 M+1 M+1 1 = = N M−i+1 N M−i+1 i=0 i=0 M+1 = HM+1 − HM−N+1 N Ó Ð Ñ ×Ñ ÔÖÓÜ Ñ ÓÒ M, N −→ ∞ Ý Ð ÔÖÓÜ Ñ ÓÒ ÐÓ× ÒÙÑ ÖÓ× ÖÑÓÒ Ó×½½ + Ð Ñ Si M,N− →∞ = Ð Ñ MN 1 ÐÒ (M + 1) − ÐÒ (M − N + 1) M,N− →∞ = ÐÑ M,N−→∞ 1 ÐÒ M + 1 α M−N+1 = 1 ÐÒ 1 α 1−α ´ º¾ µ ÓÑÓ Ý ÐÓ ÑÓ× Ò Ó¸ Ð ×ÓÒ Ó Ð × ÐÓ ÕÙ × ÔÖ ×ÙÑ ÖÖÓ Ö Ð Ñ ÓÖ × ÑÔ ÒÓº Ò Ð ÔÖ Ø × ÖÖ Ð ÔÓÖÕÙ ¸ Ô ÖØ ÕÙ × Ñ × Ó Ð ÒÖÖ ×ÓÒ Ó× Ð ØÓÖ Ó× Ò Ô Ò ÒØ × Ô Ö Ù ÐÕÙ Ö ÓÒ ÙÒØÓ Ð Ú ×¸ × ÔÓ× Ð ¸ ÙÒÕÙ ÑÙÝ ÑÔÖÓ Ð Ò Ð Ñ Ò ÕÙ M × Ñ × Ö Ò ¸ ÕÙ Ð ×ÓÒ Ó Ð ÒÓ Ò Ù ÒØÖ ÙÒ Ù Ø ×ÔÓÒ Ð º Ð ×ÓÒ Ó Ð Ý Ð × ÓØ × ÜÔÖ × × ÔÓÖ ´ º¾¿µ Ý ´ º¾ µ ÒÓ× ÔÖÓÔÓÖ ÓÒ Ò ÙÒ Ö Ö Ò × ÑÔ ÒÓ Ô Ö ÓØÖÓ× Ò ÓÕÙ × ×ÓÒ Ó ÕÙ ×ØÙ Ö ÑÓ× ÒÑ Ø Ñ ÒØ º 5.1.4.2 Sondeo lineal Ð ×ÓÒ Ó Ð Ò Ð × ÑÙÝ × Ñ Ð Ö Ð Ð Ò Ò Ñ ÒØÓ ÖÖ Ó × Ó ÙÖÖ ÙÒ ÓÐ × ÓÒ¸ ÒØÓÒ × Ð ÔÖÓÜ Ñ Ð ×ÓÒ Ö × Ö Ð × Ù ÒØ ×ÔÓÒ Ð ¸ ÙÝ Ñ Ö × ×Ø ÒØ EMPTY¸ Ö ×ÙÐØ ÒØ Ð Ò×Ô ÓÒ × Ù Ò Ð Ô ÖØ Ö Ð Ò Ó ÔÓÖ Ð ÙÒ ÓÒ × º Ä Ø Ð ÑÔÐÓ ÕÙ ÑÓ× ÑÓ×ØÖ Ó Ô Ö Ð × Ó× ×ØÖ Ø × ÒØ Ö ÓÖ × × Ô ØÓÖ Þ × ½½ Hn ≈ ÐÒ n + O(1)º
  • 444.
    418 Cap´ ıtulo 5. Tablas hash 0 k1 E 1 k10 B 2 k8 E 3 k11 B 4 E 5 k2 B 6 k5 B 7 k9 B 8 k3 B 9 E 10 k4 B 11 k7 B E E M−2 E M − 1 k6 B ÆÓØ ÑÓ× ÕÙ Ð ×ØÖ Ù ÓÒ Ð × Ð Ú × × ÒØ Ð Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó¸ ÔÙ × ×ÓÒ Ö ×ÙÐØ ÒØ × Ð Ñ ×ÑÓ Ø ÔÓ ×ÓÒ Óº ALEPH Ø Ò ÙÒ Ì ¸ ÒÓÑ Ò Ó OLHashTable<Key,Record>¸ ÕÙ ÑÔÐ ÒØ ÙÒ Ø Ð × ÓÒ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ × ÔÓÖ Ö ÓÒ Ñ ÒØÓ ÖØÓ Ý ×ÓÒ Ó Ð Ò Ðº Ð Ì Ò Ù ×Ø ÓÒ × ÜÔÓÖØ Ò Ð Ö ÚÓ ØÔÐ ÓÐ × ºÀ ½ ½ ØÔÐ ÓÐ × ºÀ ½ ≡ template <typename Key, typename Record, class Cmp = Aleph::equal_to<Key> > class OLhashTable { Å Ñ ÖÓ× ÔÙ Ð Ó× OLHashTable<Key,Record> ½ }; OLHashTable<Key,Record> Ö ÔÖ × ÒØ ÙÒ Ø Ð × ¸ ÓÒ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ × ÖØ Ý ×ÓÒ Ó Ð Ò Ð Ù Ø ×¸ Ò Þ ÔÓÖ Ð Ú × Ø ÔÓ Key Ý ÕÙ Ù Ö Ö ×ØÖÓ× Ø ÔÓ Recordº B´squeda u Ä Ù×ÕÙ ÙÒ Ð Ú × Ö Ñ Ø ½ Å Ñ ÖÓ× ÔÙ Ð Ó× OLHashTable<Key,Record> ½ ≡ ´½ µ ½ Record * search(const Key & key) { // Comenzar desde ındice hash y sondear linealmente hasta ´ // encontrar una cubeta EMPTY for (int i = (*hash_fct)(key) % M, c = 0; c < M and table[i].status != EMPTY; ++c, ++i) if (table[i].status == BUSY) // ¿Hay una clave en la cubeta? if (Cmp() (table[i].key, key)) // Comparar la clave return &table[i].record; return NULL; // No se encuentra la clave } Ð Ð ÞÓ × Ø Ò Ù Ò Ó × ×ÓÒ ÙÒ Ð ÙÝÓ ×Ø ØÙ× × EMPTYº ÍÒ Ð ÓÒ ×Ø ØÙ× Ù Ð BUSY × Ö Ú × Ô Ö Ú Ö ¬ Ö × ÓÒØ Ò Ð Ð Ú Ù×ÕÙ º ÍÒ Ð ÓÒ ×Ø ØÙ× DELETED ÒÓ ÓÒØ Ò Ð Ú ¸ Ô ÖÓ ÓÑÓ ×Ø Ò Ð Ñ ÒÓ ÙÒ ÓÐ × ÓÒ¸ Ý ÕÙ ÓÒØ ÒÙ Ö Ð ×ÓÒ Ó ×Ó Ö Ð × Ù ÒØ Ù Ø º
  • 445.
    5.1. Manejo decolisiones 419 Inserci´n o Ä Ò× Ö ÓÒ × Ö Ñ Ø Ò ÓÒØÖ Ö Ð ÔÖ Ñ Ö Ù Ø ¸ × Ö ×ÙÐØ ÒØ Ö Ø Ð ÙÒ ÓÒ × Ó Ð ×ÓÒ Ó Ð Ò Ð¸ ÓÒ ×Ø ØÙ× ×Ø ÒØÓ BUSYº ×ØÓ × ÔÐ ÒØ Ñ ÒØ Ð × Ù ÒØ Ñ ØÓ Ó ½ Å Ñ ÖÓ× ÔÙ Ð Ó× OLHashTable<Key,Record> ½ +≡ ´ ½ µ ½ ½ Record * insert(const Key & key, const Record & record) { if (N >= M) throw std::overflow_error("Hash table is full"); int i = (*hash_fct)(key) % M; while (table[i].status != BUSY) // Sondear linealmente cubetas disponibles i = (i + 1) % M; // i contiene celda con DELETED o EMPTY ==> ocuparla table[i].key = key; table[i].record = record; table[i].status = BUSY; N++; return &table[i].record; } Eliminaci´n o Ä Ð Ñ Ò ÓÒ × Ð ÓÔ Ö ÓÒ ÔÓÐ Ñ ×Ø ×ØÖ Ø ¸ Ô ÖÓ × ÙÒ Ñ ÒØ ÐÑ ÒØ × ÑÔÐ ´½µ Ò ÓÒØÖ Ö Ð Ù Ø ÕÙ ÓÒØ Ò Ð Ð Ú Ð Ñ Ò Ö Ý ´¾µ Ñ Ö ÖÐ ÓÒ DELETEDº Ä × Ù Ø × Ñ Ö × ÓÑÓ DELETED Ö ÔÖ × ÒØ Ò ÙÒ Óר ÓÒ Ð Ð Ù×ÕÙ ¸ ÔÙ × ×Ø × Ò Ò×Ô ÓÒ Ö× ÙÒÕÙ ÒÓ ÓÒØ Ò Ò Ð Ú ×º ×ØÓ ÔÐ ÒØ ÙÒ ÔÖÓ Ð Ñ ÒØÖÓÔ Ñ ÕÙ ÙÑ ÒØ Ð ÒØ Ð Ñ Ò ÓÒ ×¸ ÔÙ Ò Ó Ó ÙÖÖ Ö Ð ¹ × ÓÖØÙÒ × ØÙ ÓÒ Ø Ò Ö ÕÙ Ö Ú × Ö ØÓ × Ð × Ù Ø × Ð Ø Ð Ò ÙÒ Ù×ÕÙ ÐÐ ÙÒÕÙ Ð Ø Ð ÓÒØ Ò ÑÙÝ ÔÓ Ó× Ð Ñ ÒØÓ׺ ÓÒ× Ù ÒØ Ñ ÒØ ¸ ÓÒ Ö ¹ ÓÒ Ñ ÒØÓ ÖØÓ Ð × Ð Ñ Ò ÓÒ × Ò × Ö Ü Ô ÓÒ Ð ×º Mejoras a la eliminaci´n o Ä ÒØÖÓÔ Ù× ÔÓÖ Ð ÙÑÙÐ ÓÒ Ù Ø × ÓÒ ×Ø ØÙ× DELETED ÔÙ ÓÒØÖ Ö¹ Ö ×Ø Ö× Ñ ÒØ ÙÒ Ø Ò ÕÙ ÖÖ Ð Ö ÔÓÖ Ð Ù Ø Ð Ñ Ò ÒØÖÓ Ð Ò ÓÐ × ÓÒ ×º ר ÑÓ Ó¸ Ð ÙÐØ Ñ Ù Ø Ð Ò ÔÙ Ñ Ö Ö× ÓÒ Ð Ú ÐÓÖ EMPTYº ÈÙ ×ØÓ ÕÙ Ð Ð Ñ Ò ÓÒ Ö ÕÙ Ö ÙÒ Ù×ÕÙ ¸ Ð ÒØ Ö Þ Ô Ö Ð Ñ Ò Ö × ÔÐ ÒØ Ò ÙÒ ÓÒ ÙÒ ÔÙÒØ ÖÓ Ð Ö ×ØÖÓ ÕÙ × × Ð Ñ Ò Öº ר ÑÓ Ó¸ Ð Ù×Ù Ö Ó ÔÙ ¸ Ú ÒØÙ ÐÑ ÒØ ¸ ÓÖÖ Ö Ð Ö Ô Ø ÓÒ Ð ØÖ Ó Ù×ÕÙ º Ó ×ØÓ¸ ÒÓ Ö ×ÙÐØ Ö Ð ÓÑÔÖ Ò Ö Ð ÖÙØ Ò Ð Ñ Ò ÓÒ ½ Å Ñ ÖÓ× ÔÙ Ð Ó× OLHashTable<Key,Record> ½ +≡ ´½ µ ½ void remove(Record * record) { Bucket * bucket = record_to_bucket(record); int i = bucket - &table[0]; // ındice cubeta a eliminar (brecha) ´ for (int j = (i + 1) % M; true; ++j) // cerrar la brecha i switch (table[j].status) { case BUSY: if (Cmp () ((*hash_fct)(table[j].key), bucket->key)) // ¿hay colisi´n? o
  • 446.
    420 Cap´ ıtulo 5. Tablas hash { // contiene colisi´n ==> mover su contenido hacia table[i] o table[i].key = table[j].key; table[i].record = table[i].record; table[i].status = BUSY; table[j].status = DELETED; // deviene DELETED, eventualmente // candidata a EMPTY i = j; // table[j] deviene cubeta brecha } break; case DELETED: // en este caso, la cubeta i no puede marcarse con // EMPTY porque si no rompe la cadena de sondeo lineal i = j; // table[j] deviene cubeta brecha break; case EMPTY: // en este caso j ser´a la cubeta que detendr´a la b´squeda, ı ı u // pero, puesto que i est´ m´s atr´s y no interrumpe la a a a // b´squeda, la marcamos con EMPTY y terminamos u table[i].status = EMPTY; N--; return; // terminar } } ר ÖÙØ Ò ÖÖ Ð Ö ÓÒ ×Ø ØÙ× DELETED Ý Ñ Ö Ð ÙÐØ Ñ Ù Ø Ð Ò ÓÐ × ÓÒ × ÓÑÓ EMPTYº ÙÒÕÙ ×Ø Ñ ÓÖ Ñ ÓÖ Ð ÔÖÓ ×Ó Ù×ÕÙ ¸ ר Ö Ð ÒØ Þ Ð Ð Ñ Ò ÓÒº Ë Ð × Ð Ñ Ò ÓÒ × ×ÓÒ Ü Ô ÓÒ Ð ×¸ ÒØÓÒ × × ÔÖ Ö Ð ÙØ Ð Þ Ö Ð ÑÙÝ × ÑÔÐ Ð Ó¹ Ö ØÑÓ Ñ Ö Ö Ð Ù Ø ÓÒ DELETED Ý Ö Ñ ÒØ Ö Nº Ä Ñ ÓÖ ÔÐ ÒØ Ð Ñ ×ÑÓ ÔÖÓ Ð Ñ ÑÓÚ Ñ ÒØÓ Ù Ø × ÕÙ Ø Ò Ð Ò ¹ Ò Ñ ÒØÓ ÖÖ Óº ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ø ÑÔÓ Ó × ÔÙ Ò Ñ ÒØ Ò Ö ÔÙÒØ ÖÓ× Ð Ñ ÒØÓ× Ð Ø Ðº 5.1.4.3 An´lisis informal del sondeo lineal a Ð Ò Ð × × ÕÙ ÔÖ × ÒØ Ö ÑÓ× Ò ×Ø ×Ù ¹× ÓÒ ×Ø × Ó Ò ÐÓ× Ö ×ÙÐØ Ó× ÔÖ × ÒØ Ó× ÔÓÖ Ë Û Ý Ð ÓÐ Ø ¾ Ý × ÙÒ Ñ ÒØ Ò Ò Ð × Ù ÒØ ÔÖÓÔÓ× ÓÒ¸ Ù Ð Ù Ð ÔÖ Ñ Ö Ð ÓÖ ØÑÓ ÕÙ ÃÒÙØ Ò Ð ÞÓ Ü ØÓ× Ñ ÒØ Proposici´n 5.2 (Knuth 1962 [19]) Cantidad de cubetas accedidas en direc- o cionamiento abierto y sondeo lineal Ë h(k) : K −→ [0, M − 1] ÙÒ ÙÒ ÓÒ × O(1) ÕÙ ×ØÖ ÙÝ ÙÒ ÓÖÑ Ñ ÒØ ÐÓ× Ð Ñ ÒØÓ× K [0, M − 1]º Ë T ÙÒ Ø Ð × ÐÓÒ ØÙ M ÓÒ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ × ÔÓÖ Ö ÓÒ Ñ ÒØÓ ÖØÓ Ý ×ÓÒ Ó Ð Ò Ðº Ë k ∈ K ÙÒ Ð Ú Ù ÐÕÙ Ö º ÒØÓÒ ×¸ Ð ÔÖÓÑ Ó Ù Ø × ÕÙ × Ú × Ø Ò Ò ÙÒ Ù×ÕÙ ÐÐ × N−1 (N − 1)! 1 1 UN = + 2 2 Mi(N − i − 1)! = 1 2 1+ 1 1−α +O 1 N ; ´ º¾ µ i=0 Ý Ð ÔÖÓÑ Ó Ô Ö ÙÒ Ù×ÕÙ Ü ØÓ× × N−1 1 1 SN = + 2 2 i N! Mi(N − i)! = 1 2 1+ 1 (1 − α)2 +O 1 N . ´ º¾ µ i=0
  • 447.
    5.1. Manejo decolisiones 421 Demostraci´n o ÈÓÖ ×Ù ÓÑÔÐ ¸ Ð ÑÓ×ØÖ ÓÒ × Ò Ö Óº ÓÒ×ÙÐØ × Ë Û Ý Ð ÓÐ Ø ¾ Ý ÃÒÙØ ½ ¸ ¾¼ Ô Ö ÐÓ× Ø ÐÐ × Corolario 5.1 Desempe˜ o esperado de una tabla hash con resoluci´n de coli- n o siones por direccionamiento abierto y sondeo lineal Ë h(k) : K −→ [0, M − 1] ÙÒ ÙÒ ÓÒ × O(1) ÕÙ ×ØÖ ÙÝ ÙÒ ÓÖÑ Ñ ÒØ ÐÓ× Ð Ñ ÒØÓ× K [0, M − 1]º Ë T ÙÒ Ø Ð ÐÓÒ ØÙ M ÓÒ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ × ÔÓÖ Ö ÓÒ Ñ ÒØÓ ÖØÓ Ý ×ÓÒ Ó Ð Ò Ðº ÒØÓÒ ×¸ Ð × ÑÔ ÒÓ ×Ô Ö Ó Ð × ÓÔ Ö ÓÒ × Ò× Ö ÓÒ¸ Ù×ÕÙ Ý Ð Ñ Ò ÓÒ × O(α) = O(1)º Demostraci´n M ר o ÓØ Ó ÙÒ Ú ÐÓÖ ÓÒר ÒØ º ÈÙ ×ØÓ ÕÙ Ð Ø Ð × ÖÖ ¸ N <= M¸ ÐÓ ÕÙ ÑÔÐ ÕÙ α × ÓÒר ÒØ º Ò Ú ÖØÙ ×Ø Ó¸ Ð × ÜÔÖ × ÓÒ × ´ º¾ µ Ý ´ º¾ µ ×ÓÒ ÓÒר ÒØ ׺ Ä Ò× Ö ÓÒ ×Ø Ø ÖÑ Ò ÔÓÖ Ð Ù×ÕÙ ÐРݸ ÔÙ ×ØÓ ÕÙ ´ º¾ µ × ÓÒר ÒØ ¸ Ð × ÑÔ ÒÓ ×Ô Ö Ó Ø Ñ Ò × ÓÒר ÒØ º Ö Ó¸ Ð Ò× Ö ÓÒ × O(1)º Ä Ù×ÕÙ ÐÐ Ò Ò Ð Ñ ×Ñ × ØÙ ÓÒ ÕÙ Ð Ò× Ö ÓÒº Ä Ù×ÕÙ Ü ØÓ× ÔÒ ´ º¾ µ¸ Ð Ù Ð Ø Ñ Ò × ÓÒר ÒØ º Ä Ð Ñ Ò ÓÒ ÓÒ Ð Ì OLHashTable<Key,Record> × Ø ÖÑ Ò ×Ø Ñ ÒØ ÓÒ×¹ Ø ÒØ º Ù ÐÕÙ Ö ÓØÖÓ Ì × Ó Ò Ð ×ÓÒ Ó Ð Ò Ð ÕÙ Ö ÕÙ Ö ÙÒ Ù×ÕÙ Ò Ò ÐÓ× ×Ó× ÒØ Ö ÓÖ × ÓÖ ÕÙ ÑÓ× ÑÓ×ØÖ Ó Ð ÔÖÓÔÓ× ÓÒ ÕÙ ÒÓ× Ö Ø Ö Þ Ð × ÑÔ ÒÓ Ð ×ÓÒ Ó Ð Ò Ð¸ Ñ Ø ÑÓ× Ö ÐÓ ÕÙ ÐÐ ÒÓ× Ö Ú Ð º Ä ¬ ÙÖ × º½ Ý º¾ ÐÙ×ØÖ Ò ÐÓ× ¹ × ÑÔ ÒÓ× Ô Ö Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó¸ ×ÓÒ Ó Ð Ò Ð Ý ×ÓÒ Ó Ð Ô Ö Ð Ù×ÕÙ ÐÐ Ý Ü ØÓ× ¸ Ö ×Ô Ø Ú Ñ ÒØ º + ËÓÒ Ó Ð 3 3 + Ò Ò Ñ ÒØÓ × Ô Ö Ó 3 º + 3 ËÓÒ Ó Ð Ò Ð + + 3 + 3 + 3 + 3 + 3 ¿º + 3 3 + 3 + 33 ¿ + 3 + + 3 + 33 + 33 ¾º ++ 3 3 + + 33 ++ 33 3 + 333 + + 333 ¾ ++ 33 ++333 ++ 3 ++ 33 ++ 33 ½º ++ 3 ++ 3 +3333 +3333 ++ +333 + +33 +++3 +++3 +333 +333 33333 33333 ++++ ++++ ½ 3333 ++++ 333 +++ ¼ ¼º½ ¼º¾ ¼º¿ ¼º ¼º ¼º ¼º ¼º ¼º α ÙÖ º½ ÒØ Ù Ø × Ò×Ô ÓÒ × Ò ÙÒ Ù×ÕÙ ÐÐ Ð ×ÓÒ Ó Ð Ò Ð × Ö Ô Ö Ð Ù×ÕÙ Ü ØÓ× Ù Ò Ó Ð Ø Ð × Ò Ù ÒØÖ Ò ÙÒ ¼± ÔÐ Ò ØÙ Ô ÖØ Ö ÐÐ ¸ Ð Ô Ò ÒØ Ú Ò ÑÔÓÖØ ÒØ Ý Ð ÒØ Ù Ø× ÕÙ × Ò×Ô ÓÒ Ò ÙÑ ÒØ ÒÓØ Ð Ñ ÒØ º ÒØ × Ð ¼± Ð ÒØ Ò×Ô ÓÒ × × Ò ÔÖÓÑ Ó Ñ ÒÓÖ ÕÙ ØÖ ׸ ÐÓ Ù Ð × ÔØ Ð × ÑÓ Ù ÒØ Ð º
  • 448.
    422 Cap´ ıtulo 5. Tablas hash Ò Ù ÒØÓ Ð Ù×ÕÙ ÐÐ ¸ Ð ×ÙÒØÓ ÑÔ ÓÖ ÒØ × Ô Ö Ð ×ÓÒ Ó Ð Ò Ðº Ô ÖØ Ö Ð ¼± × Ò×Ô ÓÒ Ò Ò ÔÖÓÑ Ó Ù ØÖÓ Ù Ø × Ò ÙÒ Ù×ÕÙ ÐÐ ¸ ÐÓ ÕÙ × ÕÙ Ú Ð ÒØ Ö ÕÙ × ×ÓÒ Ò Ù ØÖÓ Ù Ø × Ò ÙÒ Ò× Ö ÓÒº Ì Ò ÑÓ׸ Ô٠׸ ÙÒ Ñ Ö Ò ÒØÖ Ð ¼± Ý Ð ¼± Ò Ð Ù Ð Ð ×ÓÒ Ó Ð Ò Ð × Ò ÔÖÓÑ Ó ÔØ Ð º Ù Ð × Ð ÔÓÖ ÒØ ÔÐ Ò ØÙ Ò ÕÙ ÔÓ ÑÓ× ØÖ Ö ÓÒ Ð ×ÓÒ Ó Ð Ò Ð Ñ Ò Ö × ÙÖ Ä ÔÖ ÙÒØ ÒØ Ö ÓÖ Ö ÕÙ Ö Ù ×Ø ÓÒ Ö Ù Ð¸ ÒØÖ Ð × Ó× ÙÖÚ ×¸ × Ð Ñ × Ö ÔÖ ¹ × ÒØ Ø Ú Ó ÕÙ Þ Ñ ÓÖ¸ Ó¸ Ù Ð ÒØÖ Ð × Ó× Ù×ÕÙ × × Ð Ñ × ÑÔÓÖØ ÒØ ÈÓÖ ÐÓ Ò Ö Ð Ð Ù×ÕÙ Ó ÓÒ×ÙÐØ ÐÓ ÕÙ Ý ×Ø Ò ÙÒ ÓÒ ÙÒØÓ × Ñ × Ö Ù ÒØ ÕÙ Ð Ù×ÕÙ ÐÐ º Ò ×Ø × ÒØ Ó¸ Ð Ö ¬ º¾ × Ð Ñ × ÑÔÓÖØ ÒØ º Ó ×Ø Ö Ø Ö Ó Ý Ð ÓÒÓ Ñ ÒØÓ ÑÔ Ö Ó¸ ÔÓ ÑÓ× Ö ÕÙ Ð ×ÓÒ Ó Ð Ò Ð × ÓÖ Ð ×Ø ÙÒ Ñ Ü ÑÓ ÒØÖ Ð ¼ Ý ¼± ÔÐ Ò ØÙ º ÉÙ Ø ÒØÓ Ù ×Ø Ð ¿¼¹¾¼± ×Ó ÙÔ ÓÒ ÍÒ Ô Ö×Ô Ø Ú ÒØ Ö × ÒØ Ô Ö ÓÖ Ö ×Ø ÔÖ ÙÒØ ÒÓ× Ð ÔÖÓÔÓÖ ÓÒ ÓÑÔ Ö Ö Ð ×Ô Ó Ó ÙÔ Ó ÔÓÖ Ð Ò Ò Ñ ÒØÓ × Ô Ö Óº ËÓÒ Ó Ð 3 + º Ò Ò Ñ ÒØÓ × Ô Ö Ó + ËÓÒ Ó Ð Ò Ð + + + + 3 ¿º + 3 + + 3 ¿ + + 3 3 ++ 3 + 3 3 ¾º + + + 3 3 3 + + 3 ++ 333 3 ¾ ++ ++ 33 33 3 ++ 3333 ++ 3333 ++ + 3 ½º +++ 3333 +++ 3333 +++ +3333333 +++ +3333333 +++ ++ ++3333 ++333 +++++ 3 ++++++ +3333333 +3333333 ½ +333 333+ +++ +++ ++++++++3 333333333 333333333 ++++++++ ¼ ¼º½ ¼º¾ ¼º¿ ¼º ¼º ¼º ¼º ¼º ¼º α ÙÖ º¾ ÒØ Ù Ø × Ò×Ô ÓÒ × Ò ÙÒ Ù×ÕÙ Ü ØÓ× ÉÙ × ÐÓ ÕÙ Ö Ð ×ÓÒ Ó Ð Ò Ð¸ Ø Ò ÒÓØ Ð Ò Ð × Ö ¬ ׸ Ö ×Ô ØÓ Ð ×ÓÒ Ó Ð Ä Ö ×ÔÙ ×Ø × ÓÒÓ Ó Ð ÖÓØÙÐÓ ÖÙÔ Ñ ÒØÓ ÔÖ Ñ Ö Ó º × Ú ÒØ ÕÙ Ù ÐÕÙ Ö Ð Ú ÓÐ × ÓÒ h(k1) = i ÔÓØ Ò ÙÒ ÓÐ × ÓÒ h(k2) = i + 1º ÓÒ ÓÖÑ ÙÑ ÒØ Ð ÒØ Ð Ñ ÒØÓ׸ × ÓÖÑ Ò Ò × Ð Ò Ð × ÓÐ × ÓÒ × Ò ØÓÖÒÓ Ð ÔÓ× ÓÒ iº Ë Ò Ñ Ö Ó¸ Ò Ð ÔÖ Ø ¸ ר × Ò × ×ÓÒ ØÓÐ Ö Ð × ×Ø Ð ÔÓÖ ÒØ ÔÐ Ò ØÙ ÜÔÖ × Ó ´ ¼±µ¸ ÔÙ × ×Ù ÓÒØ Ù Ò Ð ÖÖ ÐÓ ÔÖÓÚ Ð Ð ÓÑÔÙØ ÓÖ ½¾ º ÓÒ ÒÙ ×ØÖ ÑÔÐ ÒØ ÓÒ Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó Ø Ò ÑÓ× ÙÒ Ó ÙÔ ÓÒ Ò Ñ ÑÓÖ SL = 2MSpST + 2NSpST . ´ º¾ µ ÓÒ Sp × Ð ×Ô Ó Ó ÙÔ Ó ÔÓÖ ÙÒ ÔÙÒØ ÖÓ Ý ST × Ð ×Ô Ó Ó ÙÔ Ó ÔÓÖ Ð Ð Ú º ½¾ רÓ× ÔÓÖ ÒØ × ÔÙ Ò ÓÖÖÓ ÓÖ Ö× ´Ó Ö ÙØ Ö× µ Ñ ÒØ cachegrind ¾ º
  • 449.
    5.1. Manejo decolisiones 423 Ò Ð Ñ ×ÑÓ × ÒØ Ó¸ ÓÒ Ð Ö ÓÒ Ñ ÒØÓ ÖØÓ Ø Ò ÑÓ× ÙÒ Ó ÙÔ ÓÒ Ñ ÑÓ¹ Ö SO = M(ST + 1) ´ º¾ µ Ð Ö Ñ ÒØ ¸ SO < SL¸ ÐÓ ÕÙ ÒÓ × Ò ¬ ÕÙ ÒÓ ÔÙ Ö Ù Ö× Ð ÓÒ×ÙÑÓ Ñ ÑÓÖ Ð Ò Ò Ñ ÒØÓ × Ô Ö Óº ÈÓÖ ÑÔÐÓ¸ ÔÓ ÑÓ× Ù× Ö Ð ×Ø × × ÑÔÐ × Ý ÙÒ Ø Ð ÔÙÖÓ× ÔÙÒØ ÖÓ׺ Ä × Ö ¬ × º½ Ý º¾ ÑÙ ×ØÖ Ò ÓÒØÙÒ ÒØ Ñ ÒØ Ð ×ÙÔ Ö ÓÖ Ø ÓÖ Ð Ò ¹ Ò Ñ ÒØÓ × Ô Ö Ó Ò Ù ÒØÓ Ð ÒØ ×ÓÒ Ó× ÕÙ × Ö Ð Þ Ò Ô Ö Ù ÐÕÙ Ö Ù×ÕÙ º È ÖÓ¸ ÓÑÓ Ý ÐÓ Ò ÑÓ× Ò Ü º½º¿º ´Ô Ò ½¾µ¸ Ð ×ÓÒ Ó Ð Ò Ð ÔÖÓÚ Ð Ð ÓÑÔÙØ ÓÖ¸ ÙÒ ÔÐ ÒÓ Ù ÓÒ ÕÙ × Ú Ö Ó× ÓÖ Ò × Ñ Ò ØÙ Ñ × Ú ÐÓÞ ÕÙ Ð ×Ó Ö Ñ ÒØ Ó Ð Ñ ÑÓÖ ¸ × Ò ÔÖÓÚ Ö Ð ¸ ÕÙ Ö ÕÙ Ö Ö Ð Ò Ò Ñ ÒØÓ × Ô Ö Óº Ò Ò ÙÖ ¸ Ð Ò× Ö ÓÒ Ð Ñ Ò ÓÒ Ö ÕÙ Ö Ò Ô Ð Ö Ð Ñ Ò ÓÖ Ñ ÑÓÖ Ò Ñ ¸ Ñ ÒØÖ × Ð Ö ÓÒ Ñ ÒØÓ ÖØÓ ÒÓº Ù Ò Ó × Ø Ò Ð ÒØ ×Ô Ö Ð Ú × Ñ Ò Ö¸ Ð Ö ÓÒ Ñ ÒØÓ ÖØÓ ÓÒ ×ÓÒ Ó Ð Ò Ð ×¸ ÔÖÓ Ð Ô ÖÓ ×ÓÖÔÖ Ò ÒØ Ñ ÒØ ¸ ÙÒ ÓÒ ÐÓ× Ö ÙÑ ÒØÓ× Ò Ñ ÒÓ¸ Ð Ñ ÓÖ Ò ÓÕÙ Ô Ö Ñ Ò Ö ÙÒ Ø Ð × º Ä × Ö ÞÓÒ × × ÔÙ Ò Ö ×ÙÑ Ö Ò ¯ × ÑÙÝ × ÑÔÐ ÑÔÐ ÒØ Ö¸ ÐÓ ÕÙ ÑÔÐ ÙÒ Ó Óר ÓÒר ÒØ º ¯ ÆÓ ÙØ Ð Þ Ð Ñ Ò ÓÖ Ñ ÑÓÖ Ò Ñ º ¯ ÔÖÓÚ Ð Ð ÓÑÔÙØ ÓÖº Ù Ò Ó × ÑÔÖ Ø Ó Ð ×ÓÒ Ó Ð Ò Ð ÓÑÓ ×Ú ÒØ × ÔÓ ÑÓ× ÒÙÒ Ö ¯ Ð Ö ÓÒ Ñ ÒØÓ ÖØÓ ×Ø ×ÙÔ Ø Ó ÙÒ ×Ø Ñ ÓÒ ÓÖÖ Ø Ð ÒÙÑ ÖÓ Ð Ñ ÒØÓ× Ñ Ò Öº Ë ×ØÓ ÐÐ ¸ ÒØÓÒ × Ð ÖÙÔ Ñ ÒØÓ Ö ÓÒ× Ö ¹ Ð Ñ ÒØ Ð × ÑÔ ÒÓº Ò Ó × ÓÒ × ÒÓ × ÔÓ× Ð ×ÔÓÒ Ö ÙÒ Ù Ò ×Ø Ñ ÓÒº Ò ×ØÓ× ×Ó׸ × ÓÑÓ × × × ÙÒ Ø Ð × Ò Ö Ð¸ × ÔÖ Ö Ð Ð Ò Ò Ñ ÒØÓ × Ô Ö Óº ¯ Ä Ð Ñ Ò ÓÒ Ò Ð ×ÓÒ Ó Ð Ò Ð ÓÒÐÐ Ú Ú ÒØÙ Ð × Ò ÓÒÚ Ò ÒØ ׺ Ð Ð ÓÖ ØÑÓ Ð Ñ Ò ÓÒ ÕÙ × ÖÖÓÐÐ ÑÓ× Ø Ò Ð ×Ú ÒØ ÑÓÚ Ö ´ÔÓÖ ÓÔ µ ÐÓ× ÓÒØ Ò Ó× Ð × Ù Ø ×º ÆÓ ÔÓ ÑÓ׸ Ô٠׸ Ñ ÒØ Ò Ö ÔÙÒØ ÖÓ× ÐÓ× Ð Ñ ÒØÓ× ÙÒ Ø Ð ÓÒ ×ÓÒ Ó Ð Ò Ðº Ë Ô Ð ÑÓ× Ð Ð Ñ Ò ÓÒ Ñ × × ÑÔÐ ¸ × Ö¸ ×ÓÐÓ Ñ Ö Ö Ð Ù Ø ÓÒ DELETED¸ ÒØÓÒ × ÒÓ ÔÓ ÑÓ× Ô ÖÑ Ø Ö ÑÙ × Ð Ñ Ò ÓÒ ×¸ ÔÙ × ×Ø × Ö Ò Ð Ù×ÕÙ º × ÔÓ× Ð ×ÙÔ Ö Ö Ð ×ÓÒ Ó Ð Ò Ð Ä Ù ×Ø ÓÒ ÕÙ Ú Ð Ò ÓÒØÖ Ö ÙÒ ÓÖÑ Ú Ø Ö Ð ÖÙÔ Ñ ÒØÓ ÔÖ Ñ Ö Óº ÓÖ × ×Ø ÔÖ ÙÒØ Ò Ð × ×Ù ¹× ÓÒ × ×Ù × ¹ Ù ÒØ ׺ 5.1.4.4 Sondeo cuadr´tico a Ð ×ÓÒ Ó Ù Ö Ø Ó × ÙÒ Ñ ÒØ ÐÑ ÒØ × ÑÔÐ º Ë Ó ÙÖÖ ÙÒ ÓÐ × ÓÒ Ò Ð ÔÓ× ÓÒ i¸ ÒØÓÒ × Ð ÔÖÓÜ Ñ Ù Ø ×ÓÒ Ö ×Ø ÔÓÖ i2 ÑÓ Mº Ä ×Ø ×ØÖ Ø × Ú Ø Ö Ð ÖÙÔ Ñ ÒØÓ ÔÖ Ñ Ö Ó Ý Ð ÓÖÑ ÓÒ Ò × Ð Ò Ð × ÓÐ × ÓÒ × ÕÙ ×ÓÒ Ð × ÕÙ Ö Ò Ð × ÑÔ ÒÓ Ò Ð ×ÓÒ Ó Ð Ò Ðº
  • 450.
    424 Cap´ ıtulo 5. Tablas hash È ÖÓ ×Ø ×ØÖ Ø ÓÒÐÐ Ú Ð ÔÖÓ Ð Ñ ÕÙ × Ð Ö ÒØ Þ Ö ÕÙ ØÓ × Ð × Ù Ø × × Ò ×ÓÒ ×¸ ÔÙ × i2 ÑÓ M ÒÓ Ò × Ö Ñ ÒØ Ù Ö ØÓ Ó Ð Ö Ò Ó [0, M)º Ù Ò Ó Ð Ø Ð Ð ÒÞ Ð ¼± ÔÐ Ò ØÙ ÒÓ Ý Ö ÒØ ×ÓÐÙØ ÕÙ Ð ×ÓÒ Ó Ù Ö Ø Ó Ò Ù ÒØÖ ÙÒ Ù Ø ×ÔÓÒ Ð º Ï ×× ¿¼ ÑÙ ×ØÖ ÕÙ × ÔÓ× Ð Ò ÓÒØÖ Ö Ø Ð Ù Ø × M × ÔÖ ÑÓº Ò Ò ÙÖ ¸ ÓÒ M ÔÖ ÑÓ Ý M = 4k + 3 Ð ×ÓÒ Ó Ù Ö Ø Ó Ò×Ô ÓÒ ØÓ Ð Ø Ð º Ð ×ÓÒ Ó Ù Ö Ø Ó ÑÔ Ð ÓÖÑ ÓÒ Ò × Ð Ò Ð × ÓÐ × ÓÒ¸ Ô ÖÓ ÒÓ ÑÙÐ Ð ×ÓÒ Ó Ð ÔÓÖÕÙ Ð ÓÔ Ö ÓÒ i2 Ò × Ð ØÓÖ Ò × ÑÙÐ ÙÒ ÓÑÔÓÖØ Ñ ÒØÓ Ð ØÓ¹ Ö Óº ÓÒ× Ù ÒØ Ñ ÒØ ¸ ÓÒ Ð ×ÓÒ Ó Ù Ö Ø Ó × ÔÖ × ÒØ Ð ÖÙÔ Ñ ÒØÓ × ÙÒ Ö Ó Ý Ð ÓÖÑ ÓÒ Ò × Ò ØÓÖÒÓ Ð × ÓÐ × ÓÒ × i2 ÑÓ Mº Ì Ò Ð ×Ú ÒØ ¸ Ñ ×¸ × Ö Ñ × ÓÑÔÐ Ó ÑÔÐ ÒØ Ö Ý ÑÔÓÒ Ö Ö ×ØÖ ÓÒ Ð × Ð ÓÒ M ÙÒ ÒÙÑ ÖÓ ÔÖ ÑÓ¸ Ð Ó ÕÙ ÒÓ × ÑÔÖ × ÔÓ× Ð º 5.1.4.5 Doble hash × ÔÓ× Ð ÒרÖÙÑ ÒØ Ö Ð ×ÓÒ Ó Ð ÓÒ× Ö ÑÓ× ×ÔÓÒ Ö M ר ÒØ × ÙÒ ÓÒ × × {h1(k), h2(k), . . . , hM(k)} ÓÒ ÓÑÔÓÖØ Ñ ÒØÓ× Ð ØÓÖ Ó× Ò Ô Ò ÒØ × Ò ×Ø × ØÙ ÓÒ¸ ÔÓ ÑÓ× ×ÓÒ Ö ÐÑ ÒØ × ÒÚÓ ÑÓ× ÔÖ Ñ Ò Ñ ÒØ h1(k) ݸ × Ý ÓÐ × ÓÒ¸ ÒØÓÒ × ×ÓÒ ÑÓ× Ð × Ù Ø × Ò Ð ÓÖ Ò h2(k), h3(k), . . . , hM(k) ר Ò ÓÒ¹ ØÖ Ö ÙÒ Ù Ø ×ÔÓÒ Ð º ר × Ò Ö Ó × Ô Ö Ø Ñ ÒØ Ø Ð ¸ Ô ÖÓ Ý × ÖÒÓ× Ú ÒØ ×Ù ¬ ÙÐØ ¸ ÒÓ ×ÓÐÓ Ò Ù ÒØÓ Ð × Ð M¸ × ÒÓ Ò Ù ÒØÓ ×Ù Ò Ö Ð Ö ×Ô ØÓ Ð Ø Ñ ÒÓ M¸ × ÓÑÓ Ð Ø ÔÓ Ð Ú Ô Ö Ð Ù Ð × ÒרÖÙÑ ÒØ Ð Ñ Ð ÙÒ ÓÒ × × º Ô × Ö Ð × ÓÒ× Ö ÓÒ × ÒØ Ö ÓÖ ×¸ Ü ×Ø ÙÒ Ü Ð ÒØ Ý Ö Ð Ø Ú Ñ ÒØ Ö Ø ÑÒÖ ÑÙÐ Ö Ð ×ÓÒ Ó Ð ÓÒ× ×Ø ÒØ Ò ÙØ Ð Þ Ö Ó× ÙÒ ÓÒ × × Ô Ö ÐÓ× ÔÖ Ñ Ö Ý × ÙÒ Ó ×ÓÒ Ó׸ Ö ×Ô Ø Ú Ñ ÒØ º Ë ÐÓ× Ó× ×ÓÒ Ó× Ð ØÓÖ Þ Ó× Ù× Ò ÓÐ × ÓÒ¸ Ò¹ ØÓÒ × Ù× ÑÓ× ×ÓÒ Ó Ð Ò Ðº Ä ÙÒ Ñ ÒØ Ð × ÑÙÐ Ö Ð ×ÓÒ Ó Ð Ô Ö Ð ÔÖ Ñ Ö ÓÐ × ÓÒº ÁÒØÙ Ø Ú Ñ ÒØ ¸ × Ö ÓÖ ÑÓ× Ð Ô Ö Ó Ð ÙÑÔÐ ÒÓ׸ ×ØÓ Ø Ò × ÒØ Ó ÔÓÖÕÙ Ð ÔÖÓ Ð ØÖ ÔÐ Ó Ñ × ÓÐ × ÓÒ Ö ÜÔÓÒ Ò ÐÑ ÒØ ´α3, α4, . . . Ý × ×Ù × Ú Ñ ÒØ µº Ú ÒØÙ ÐÑ ÒØ ¸ × Ô Ö Ø Ñ ÒØ Ö Ð Þ Ð ¸ ÙÒÕÙ Ò Ø ÑÔÓ ÓÒר ÒØ Ñ × ÓרÓ×Ó¸ ÙÒ ØÖ ÔРݸ Ò Ò Ö Ð¸ ÙÒ m¹ × º Ò ALEPH¸ ÙÒ Ø Ð × ÓÒ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ × ÔÓÖ Ö ÓÒ Ñ ÒØÓ ÖØÓ Ý Ó Ð ÙÒ ÓÒ × × ÜÔÓÖØ ÔÓÖ Ð Ì ODhashTable<Key, Record>¸ Ð Ù Ð × ×Ô ¬ Ò Ð Ö ÚÓ ØÔÐ Ó × ºÀ ¾ ¾ ØÔÐ Ó × ºÀ ¾ ≡ template <typename Key, typename Record, class Cmp = Aleph::equal_to<Key> > class ODhashTable { Å Ñ ÖÓ× ÔÖ Ú Ó× ODhashTable<Key, Record> ¾ Å Ñ ÖÓ× ÔÙ Ð Ó× ODhashTable<Key, Record> ¾ }; ¬Ò × ODhashTable¸ Ù× Ò ÙÒ ¾ º Ò Ð ÔÖ Ø ¸ ODhashTable<Key, Record> × Ò ÒØ Ö Þ ÒØ OLHashTable<Key,Record>¸ Ð ÙÒ Ö Ò ×ØÖ Ò ÕÙ Ð ÓÒרÖÙ ØÓÖ Ö ÕÙ Ö Ð × ÙÒ ÙÒ ÓÒ × º
  • 451.
    5.1. Manejo decolisiones 425 El problema de la eliminaci´n con el doble hash o Ù Ò Ó ×ØÙ ÑÓ× Ð ×ÓÒ Ó Ð Ò Ð¸ ÜÔÐ ÑÓ× Ð ÔÖÓ Ð Ñ ÕÙ ÔÐ ÒØ Ð × ÑÔ ÒÓ Ð Ó ÕÙ Ð × Ù Ø × Ò Ñ Ö Ö× ÓÒ Ð Ú ÐÓÖ DELETEDº Ò ÕÙ Ð ÒØÓÒ × × ÖÖÓÐÐ ÑÓ× ÙÒ Ø Ò Ö Ñ Ò × ÒØ Ð ÖÖ ÙÖ Ö ¸ ÕÙ ÔÐ ÑÓ× Ð Ì OLHashTable<Key,Record> Ý ÕÙ ÒÓ× Ô ÖÑ Ø Ô ÙÐ Ø Ò Ñ ÒØ Ö Ð Ñ Ò Ò Ó Ð ×Ø ØÙ× DELETEDº ÓÒ Ð Ó Ð × ÒÓ × ÔÓ× Ð ×Ø Ø Ò ÔÓÖÕÙ ÔÙ Ò Ü ×Ø Ö Ð Ú × Ø Ð × ÕÙ h1(k) = h2(k)¸ ÐÓ ÕÙ ÔÙ ÖÖ Ö ÙÒ × ØÙ ÓÒ Ò Ð ÕÙ × ÑÔÓ× Ð Ø ÖÑ Ò Ö × Ð Ð Ú ÓÐ × ÓÒÓ Ò Ð ÔÖ Ñ Ö Ó × ÙÒ Ó ×ÓÒ Óº Ò Ò Ö Ð Ð ÔÖÓ Ð Ñ × Ð Ñ ×ÑÓ × Ù× ÑÓ× ØÖ × Ó Ñ × ÙÒ ÓÒ × × Ó¸ × × × Ù Ö × Ð ×Ó¸ ÑÔÐ Ö ÑÓ× ×ÓÒ Ó Ðº Ò Ò ÙÖ ¸ Ð Ñ ØÓ Ó ÖÖ Ö Ö × Ù Ø × ÓÒ ×Ø ØÙ× DELETED ´Ü º½º º¾ ´Ô Ò ½ µµ ÑÙ Ú ÐÓ× ÓÒØ Ò Ó× Ð × Ù Ø × ÑÓÚ Ñ ÒØÓ Ò × Ð Ò Ð ÙÒ × × ØÙ ÓÒ ×º Ë Ù× ÑÓ× Ó Ð × ¸ ÓÑÓ¸ ÒØÓÒ ×¸ ØÖ Ø ÑÓ× ÓÒ Ð Ð Ñ Ò ÓÒ À Ý Ó× Ò ÓÕ٠׸ × Ù ÖØÓ× ÔÓÖ ÔÖ Ñ Ö Ú Þ ÔÓÖ Ó× ÒÚ ×Ø ÓÖ × ÔÓÒ × × ½ ¸ ÕÙ ÒÓ ÑÙ Ú Ò Ð × Ù Ø × Ý ÕÙ ×Ù Ú Þ Ð Ñ Ò Ò Ð ÒØÖÓÔ Ù× ÔÓÖ Ð × Ù Ø × DELETED ½º Ë Ñ ÒØ Ò Ð Ù ÒØ Ð × Ù Ø × ÓÒ ×Ø ØÙ× DELETEDº Ù Ò Ó Ð Ò Ú Ð Ö Ù Ø × DELETED Ð Ò ÙÒ ÙÑ Ö Ð Ó¸ ÔÓÖ ÑÔÐÓ¸ ÙÒ ¿¼±¸ ØÓ × Ð × Ù Ø × ÓÒ Ú ÐÓÖ DELETED × Ñ Ö Ò ÓÒ Ú ÐÓÖ EMPTYº ÄÙ Ó¸ × Ö ÓÖÖ ÒØ Ö Ñ ÒØ Ð Ø Ð Ý × Ü Ñ Ò Ù Ð × Ù Ø × ÓÒ ×Ø ØÙ× BUSY × Ò Ù ÒØÖ Ò Ò ÙÒ Ò ×ÓÒ Ó Ø Ð ÕÙ × Ö ÕÙ Ö Ñ Ö Ö Ù Ø × ÒØ ÖÑ × ÓÒ ×Ø ØÙ× DELETEDº ר Ø Ò Ø Ò Ð Ò ÓÒÚ Ò ÒØ ÕÙ ÓÒ×ÙÑ Ø ÑÔÓ O(M)¸ ÐÓ Ù Ð × ×Ø ÒØ ÒÓØ Ð Ö ×Ô ØÓ Ð × ÑÔ ÒÓ ×Ô Ö Ó O(1)º Ñ ×¸ × Ð ÔÓ× Ð Ø Ö Ð Ù ÓÒ Ð × Ñ × ÓÔ Ö ÓÒ × Ñ ÒØÖ × × ØÙ ר Ð ÑÔ Þ º Ú ÒØÙ ÐÑ ÒØ ¸ Ò Ñ ÒÓ× Ó Ø Ò Ö ÕÙ ÑÓÚ Ö Ð ÙÒ × Ù Ø ×¸ ÕÙ ÐÐ × ÓÐ Ò¹ ÒØ × ÓÒ ×Ø ØÙ× BUSY¸ ÕÙ × Ò ÔÖÓ Ù ØÓ Ð ×ÓÒ Ó Ð Ò Ð¸ ÔÙ Ò Ö ¹ÐÓ Ð Þ Ö× Ñ ÒØ × ÑÔÐ Ö ¹ Ò× Ö ÓÒº ¾º Ä ÓØÖ Ø Ò ¸ Ò Ð Ò Ý ÓÒ ÙÖ ÓÒ ÓÒר ÒØ ¸ × Ñ ÒØ Ò Ö ÙÒ ÓÒØ ÓÖ ×ÓÒ Ó× Ò Ù Ø ÕÙ ÒÓÑ Ò Ö ÑÓ× probe counterº ÁÒ ÐÑ ÒØ ¸ Ù¹ Ø Ø Ò ×Ø ØÙ× EMPTY Ý ÓÒØ ÓÖ Ò ÖÓº ÓÒ ÓÖÑ Ó ÙÖÖ Ò Ò× Ö ÓÒ × Ý Ð × Ù Ø × ×Ø Ò Ò ÙÒ Ò ×ÓÒ Ó¸ × Ò Ö Ñ ÒØ Ò ÐÓ× ÓÒØ ÓÖ × Ð × Ù¹ Ø × ÓÑÔÓÒ ÒØ × Ð Ò º Ò ÐÓ Ñ ÒØ ¸ Ù Ò Ó Ó ÙÖÖ Ò Ð Ñ Ò ÓÒ ×¸ × Ö Ñ ÒØ Ò Ð × Ù Ø × ÒØÖ Ð ÔÖ Ñ Ö ×ÓÒ Ó Ý Ð Ù Ø Ð Ñ Ò º Ù Ò Ó Ð ÓÒØ ÓÖ ÙÒ Ù Ø ÓÒ ×Ø ØÙ× DELETED Ú Ò ÖÓ¸ ÒØÓÒ ×¸ ÔÙ ×ØÓ ÕÙ Ð Ù¹ Ø ÒÓ ÖÓÑÔ Ò Ò ÙÒ Ò ×ÓÒ Ó¸ ר ÔÙ Ñ Ö Ö× ÓÒ × ÙÖ ÓÑÓ EMPTYº È Ö Ð Ø ÔÓ ODhashTable<Key, Record> ÑÔÐ Ö ÑÓ× Ð × ÙÒ Ø Ò º Atributos de ODhashTable<Key, Record> Ò ÙÒ ÓÒ Ð Ø Ò Ð Ñ Ò ÓÒ ÕÙ Ö Ò ÑÓ× ÔÖ × ÒØ Ó Ý × Ð ÓÒ Ó¸ ÐÓ ÔÖ Ñ ÖÓ ÕÙ ÑÓ× Ö × ¬Ò Ö Ð ×ØÖÙ ØÙÖ Ð Ù Ø ¾ Å Ñ ÖÓ× ÔÖ Ú Ó× ODhashTable<Key, Record> ¾ ≡ ´¾µ ¾ struct Bucket {
  • 452.
    426 Cap´ ıtulo 5. Tablas hash Key key; // clave Record record; // registro unsigned status : 4; // status EMPTY, DELETED o BUSY unsigned probe_type : 4; // sondeo: FIRST_PROBE SECOND_PROBE LINEAR_PROBE unsigned short probe_counter; // contador de sondeos }; ÄÓ× ØÖ × ÔÖ Ñ ÖÓ× ØÖ ÙØÓ× × ¬Ò Ò ÓÖÑ ÒØ Ð Ù Ø OLHashTable<Key,Record>º Ð ØÖ ÙØÓ probe type Ò × ÙÒ Ð Ú ÐÑ Ò Ò Ð Ù Ø × Ö ×ÙÐØ ÒØ Ð ÔÖ Ñ ÖÓ ´FIRST PROBEµ Ó × ÙÒ Ó ´SECOND PROBEµ ×ÓÒ Ó× Ó Ð ×ÓÒ Ó Ð Ò Ð ´LINEAR PROBEµ Ô ÖØ Ö Ð Ø Ö Ö ÓÐ × ÓÒº ÆÓØ ÑÓ× ÕÙ status Ý probe type ×ÓÒ ÑÔÓ× Ø× ´Ò Ð ×µ Ý ÕÙ Ñ Ó× ÓÒ ÓÖÑ Ò ÙÒ ÝØ Ü ØÓº Ð ÙÐØ ÑÓ ØÖ ÙØÓ¸ probe counter¸ Ò ¸ Ø Ð ÓÑÓ ÐÓ ÑÓ× ÜÔÐ Ö¸ Ð Ò¹ Ø Ð Ú × ÕÙ ÓÐ Ò Ò Ò ÙÒ Ò ÓÐ × ÓÒ × ÕÙ Ô ÖØ × Ð ÔÖ Ñ Ö ×ÓÒ Ó ÓÒ Ð ÔÖ Ñ Ö ÙÒ ÓÒ × ¸ ר Ð ÙÐØ ÑÓ ×ÓÒ Ó ÓÒ Ð × ÙÒ ÙÒ ÓÒ × Ó ÓÒ Ð ÙÒ ÒØ ×ÓÒ Ó× Ð Ò Ð ×º ÈÓÖ ÑÔÐÓ¸ probe counter == 4¸ ÒØÓÒ × ×ØÓ Ò ÕÙ × Ù Ø ×Ø Ò Ð Ñ ÒÓ ×ÓÒ Ó ÕÙ ÓÑ ÒÞ ÔÓÖ Ð ÔÖ Ñ Ö ÙÒ ÓÒ × ¸ ÐÙ Ó ÔÓÖ Ð × ÙÒ ÙÒ ÓÒ × ¸ Ñ × Ó× Ù Ø × ×ÓÒ × Ð Ò ÐÑ ÒØ º ÄÓ× ØÖ ÙØÓ× Ð ÔÖÓÔ Ø Ð × ¬Ò Ò Ð × Ù ÒØ Ñ Ò Ö ¾ Å Ñ ÖÓ× ÔÖ Ú Ó× ODhashTable<Key, Record> ¾ +≡ ´ ¾ µ ¾ ¾ Bucket * table; // arreglo de cubetas Hash_Fct first_hash_fct; // primera funci´n hash o Hash_Fct second_hash_fct; // segunda funci´n hash o size_t M; // tama~o de la tabla n size_t N; // n´mero de cubetas ocupadas u size_t deleted_entries_counter; // n´mero de cubetas DELETED u size_t empty_entries_counter; // n´mero de cubetas EMPTY u ÐÓ× Ù Ð × × Ò Ð Þ Ò Ò Ð ÓÒרÖÙ ØÓÖ Ð × Ù ÒØ Ñ Ò Ö ¾ Å Ñ ÖÓ× ÔÙ Ð Ó× ODhashTable<Key, Record> ¾ ≡ ´¾µ ¾ ODhashTable(Hash_Fct __first_hash_fct, Hash_Fct __second_hash_fct, const size_t & len) : table(new Bucket[len]), first_hash_fct(__first_hash_fct), second_hash_fct(__second_hash_fct), M(len), N(0), deleted_entries_counter(0), empty_entries_counter(M) { /* empty */ } Í× × ODhashTable ¾ º B´squeda u Ð × ÓÔ Ö ÓÒ × ÕÙ Ö ÕÙ Ö Ò ×ÓÒ Ó׸ Ð Ù×ÕÙ × Ð Ñ × × ÑÔÐ ¾ Å Ñ ÖÓ× ÔÙ Ð Ó× ODhashTable<Key, Record> ¾ +≡ ´ ¾ µ ¾ ¾ Record * search(const Key & key) { int i = (*first_hash_fct)(key) % M; // primer sondeo con primera funci´n hash o if (table[i].status == EMPTY) return NULL; if (table[i].status == BUSY and Cmp() (table[i].key, key)) return &table[i].record; i = (*second_hash_fct)(key) % M; // Segundo sondeo con segunda funci´n hash o
  • 453.
    5.1. Manejo decolisiones 427 if (table[i].status == BUSY and Cmp() (table[i].key, key)) return &table[i].record; // sondeo lineal a partir del ındice dado por segunda funci´n hash ´ o for (int count = 0; count < M and table[i].status != EMPTY; count++) { advance_index(i); if (table[i].status == BUSY and Cmp() (table[i].key, key)) return &table[i].record; } return NULL; // sondeo no encontr´ la clave o } Inserci´n o È Ö Ñ ÓÖ Ö Ð ÓÑÔÖ × ÓÒ Ð Ð ÓÖ ØÑÓ Ò× Ö ÓÒ¸ ÓÒ ÓÒ × Ò Ð Ô Ö Ð Ð ¹ Ð Ý ÓÖÖ Ø ØÙ ¸ Ò Ô×ÙÐ Ö ÑÓ× Ð Ö × ÖÚ ÓÒ Ð Ù Ø Ò Ð × Ù ÒØ ÖÙØ Ò ¾ Å Ñ ÖÓ× ÔÖ Ú Ó× ODhashTable<Key, Record> ¾ +≡ ´ ¾ µ ¾ ¾ Record* allocate_bucket(Bucket & bucket, const unsigned char & probe_type, const Key & key, const Record & record) { ++N; if (bucket.status == EMPTY) --empty_entries_counter; else --deleted_entries_counter; bucket.key = key; bucket.record = record; bucket.status = BUSY; bucket.probe_type = probe_type; bucket.probe_counter++; return &bucket.record; } ¬Ò × allocate bucket¸ Ù× Ò ÙÒ ¾ º Ä ÖÙØ Ò Ö ÙÒ Ù Ø Ò Ð Ù Ð × × Ò× ÖØ Ö ÔÓÖ ÓÔ Ð Ô Ö ´key,recordµ ÓÒ ×ÓÒ Ó Ø ÔÓ probe type ´FIRST PROBE¸ SECOND PROBE Ó LINEAR PROBEµº Ä ÖÙØ Ò ÒØ Ö ÓÖ Ô ÖÑ Ø ÓÒ ÒØÖ Ö Ð Ò× Ö ÓÒ Ò Ð ×ÙÒØÓ ÒØ Ö × ×Ø ×ØÙ Ó Ð Ñ Ò Ö ×ÓÒ Ö ÓÒ Ó× ÙÒ ÓÒ × × Ý ÐÙ Ó Ð Ò Ð × Ó ÙÖÖ Ò ØÖ × Ó Ñ × ÓÐ × Ó¹ Ò ×º × Ñ ÒØ ¸ Ò Ô Ò ÒØ Ñ ÒØ ×Ù ×Ø ØÙ׸ Ù Ø ×ÓÒ ÙÖ ÒØ Ð Ò× Ö ÓÒ¸ Ò Ö Ñ ÒØ Ö× Ð ×Ù ÓÒØ ÓÖ ÓÐ × ÓÒ × ¾ Å Ñ ÖÓ× ÔÙ Ð Ó× ODhashTable<Key, Record> ¾ +≡ ´ ¾ µ ¾ ¾ Record* insert(const Key & key, const Record & record) { if (N >= M) throw std::overflow_error("Hash table is full"); int i = (*first_hash_fct)(key) % M; // sondeo con primera funci´n hash o if (table[i].status != BUSY) // ¿cubeta disponible? return allocate_bucket(table[i], FIRST_PROBE, key, record); table[i].probe_counter++; // por aqu´ se sondear´ colisi´n ==> incrementar contador ı a o i = (*second_hash_fct)(key) % M; // sondeo con segunda funci´n hash o
  • 454.
    428 Cap´ ıtulo 5. Tablas hash if (table[i].status != BUSY) // ¿cubeta disponible? return allocate_bucket(table[i], SECOND_PROBE, key, record); do // sondear linealmente a partir de ındice de segundo sondeo e ´ // incrementar cada contador de cubeta sondeada { // por esta cubeta se sondear´ una colisi´n ==> incrementar contador a o table[i].probe_counter++; advance_index(i); } while (table[i].status == BUSY); // parar si DELETED o EMPTY return allocate_bucket(table[i], LINEAR_PROBE, key, record); // listo } Í× × allocate bucket ¾ º Eliminaci´n o Ä Ð Ñ Ò ÓÒ × Ð ÓÔ Ö ÓÒ Ñ × Ð ×Ø Ì º ר ׸ Ò ÐÓ ÕÙ ÓÒ ÖÒ Ð ×ÓÒ Ó¸ ÒÚ Ö× Ð Ò× Ö ÓÒ ÐÓ× ÓÒØ ÓÖ × Ð × Ù Ø × ×ÓÒ × Ò Ö¹ Ñ ÒØ Ö× º Ò Ò ÙÖ ¸ × ÙÖ ÒØ ר ÓÔ Ö ÓÒ ÕÙ × Ø Ø Ò Ù Ø × ÕÙ ÔÙ Ò Ñ Ö Ö× ÓÑÓ EMPTY Ð Ú Ö ¬ Ö ÕÙ ×Ù× ÓÒØ ÓÖ × Ú Ò Ò Ò ÖÓº × Ô٠׸ ØÓ× ÜÔÖ × Ö Ð Ð Ñ Ò ÓÒ ×ÓÐÓ Ò Ø ÖÑ ÒÓ× Ð ×ÓÒ Ó¸ Ð Ö Ñ ÒØÓ Ð ÓÒØ ÓÖ ÙÒ Ù Ø Ý ×Ù Ú ÒØÙ Ð Ñ Ö Ó ÓÑÓ EMPTY × Ö Ð Þ Ñ ÒØ Ð × Ù ÒØ ÖÙØ Ò ¾ Å Ñ ÖÓ× ÔÖ Ú Ó× ODhashTable<Key, Record> ¾ +≡ ´ ¾ µ ¾ ¾ void decrease_probe_counter(Bucket * bucket) { bucket->probe_counter--; if (bucket->probe_counter == 0) // ¿puede marcarse EMPTY sobre la cubeta? { bucket->status = EMPTY; --deleted_entries_counter; ++empty_entries_counter; } } ¬Ò × decrease probe counter¸ Ù× Ò ÙÒ ¾º Ð Ñ ×ÑÓ ÑÓ Ó¸ Ð Ù Ø Ð Ñ Ò Ö × ×¹Ð Ö Ñ ÒØ ÙÒ ÖÙØ Ò × Ñ ØÖ Ð allocate bucket() ÑÔÐ Ó Ô Ö Ð Ò× Ö ÓÒ ¾ Å Ñ ÖÓ× ÔÖ Ú Ó× ODhashTable<Key, Record> ¾ +≡ ´¾µ ¾ void deallocate_bucket(Bucket * bucket) { bucket->probe_counter--; if (bucket->probe_counter == 0) { bucket->status = EMPTY; bucket->probe_type = NO_PROBED; ++empty_entries_counter; } else { bucket->status = DELETED;
  • 455.
    5.1. Manejo decolisiones 429 ++deleted_entries_counter; } --N; } ¬Ò × deallocate bucket¸ Ù× Ò ÙÒ ¾º Ð Ù Ð ÕÙ Ò Ð × Ø Ð × × ÒØ Ö ÓÖ ×¸ Ð Ð Ñ Ò ÓÒ Ö ÙÒ ÔÙÒØ ÖÓ Ð Ö ×ØÖÓ¸ ÐÓ ÕÙ Ñ × × ÑÔÐ Ð Ð ÓÖ ØÑÓ¸ ÔÙ × ÓÖÖ Ó Ó Ô Ö Ð Ù×Õ٠Р٠غ רӏ ÙÒ Ó Ð × Ó× ÖÙØ Ò × ÒØ Ö ÓÖ ×¸ ÒÓ× Ô ÖÑ Ø Ö × Ò Ö ÙÒ Ð Ñ Ò ÓÒ ÕÙ ×ÓÐÓ × ÓÒ ÒØÖ Ò Ö Ñ ÒØ Ö ÐÓ× ÓÒØ ÓÖ × ÒØÖ Ð ÔÖ Ñ Ö ×ÓÒ Ó Ý Ð Ù Ø Ð Ñ Ò Öº ÕÙ ¸ Ô٠׸ Ð ÙØ Ð Ð ØÖ ÙØÓ probe type¸ ÔÙ × ×Ø ÒÓ× Ô ÖÑ Ø Ø ÖÑ Ò Ö Ò ÕÙ ÔÙÒØÓ Ð Ò ×ÓÒ Ó × Ò Ù ÒØÖ Ð Ù Ø ¾ Å Ñ ÖÓ× ÔÙ Ð Ó× ODhashTable<Key, Record> ¾ +≡ ´ ¾ µ ¾ ¿¼ void remove(Record * record) { Bucket * bucket = record_to_bucket(record); if (bucket->probe_type != FIRST_PROBE) { const int i_fst_probe = (*first_hash_fct)(bucket->key) % M; decrease_probe_counter(&table[i_fst_probe]); if (bucket->probe_type == LINEAR_PROBE) { // cubeta fue apartada durante sondeo lineal ==> decrementar segundo // sondeo y a partir de aqu´ decrementar todas las cubetas hasta ı // llegar a la que vamos a eliminar const int i_snd_probe = ((*second_hash_fct)(bucket->key) % M); decrease_probe_counter(&table[i_snd_probe]); int i = i_snd_probe; const int last_index = bucket_to_index(bucket); for (advance_index(i); i != last_index; advance_index(i)) decrease_probe_counter(&table[i]); } } deallocate_bucket(bucket); } Í× × deallocate bucket ¾ Ò decrease probe counter ¾ º 5.1.4.6 An´lisis informal del doble hash a ÓÑÓ Ý ÐÓ ÑÓ× Ö Ø Ö Ó¸ Ð Ó Ð × ÑÙÐ Ð ×ÓÒ Ó Ðº Ç × ÖÚ ÓÒ × ÑÔ Ö × ½ Ò Ò ÕÙ ×Ø ÑÙÐ ÓÒ × ×Ø ÒØ ÖØ Ö º × Ô٠׸ Ò Ð ÔÖ Ø ¸ Ð ÓÑÔÓÖØ Ñ ÒØÓ Ð Ó Ð × × ÕÙ Ô Ö Ð Ð Ð ×ÓÒ Ó Ð Ý Ð × ÙÖÚ × ÑÓ×ØÖ × Ò Ð × ¬ ÙÖ × º½ ´Ô º ¾½µ Ý º¾ ´Ô º ¾¾µ ÓÖÖÓ ÓÖ Ò × × Ú Ö ÓÒº Ð ¼± ÔÐ Ò ØÙ ¸ Ð Ó Ð × Ö Ð Þ ½¼ ×ÓÒ Ó× Ô Ö ÙÒ Ù×ÕÙ ÐРݸ ÑÙÝ ÑÔÓÖØ ÒØ ¸ ¾¸ ×ÓÒ Ó× Ô Ö ÙÒ Ù×ÕÙ Ü ØÓ× º ר × ÓØ ׸ ÜÔÖ × × Ò ÙÒ ÓÒ α Ò Ô Ò ÒØ × Ð Ú ÐÓÖ M¸ Ò ÕÙ Ð × ÑÔ ÒÓ ×Ô Ö Ó Ð Ù×ÕÙ ¸ Ü ØÓ× Ó ÐÐ ¸ × ÓÒר ÒØ º ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð Ò× Ö ÓÒ Ý Ð Ù×ÕÙ ÓÒ Ð Ó Ð × ×ÓÒ O(1) ר ÙÒ ¼± ÔÐ Ò ØÙ º ×ÔÙ × ×Ø ÙÑ Ö Ð¸ Ð × ÑÔ ÒÓ ÔÙ Ö Ö× O(M)º
  • 456.
    430 Cap´ ıtulo 5. Tablas hash Ë × Ó ÑÓ׸ ÔÓÖ × ÙÖ ¸ ÙÒ ¼± ÓÑÓ ØÓÐ Ö Ò ÔÐ Ò ØÙ ¸ ÒØÓÒ × Ð ½¼¹ ¾¼± Ö Ò Ö ×Ô ØÓ Ð ×ÓÒ Ó Ð Ò Ð ÔÙ Ó Ö ÖÒÓ× ÙÒ Ò Ò ÑÔÓÖØ ÒØ Ò ×Ô Ó ÕÙ Ú Ö × ÙÒ × Ð Ø Ñ ÒÓ Ð Ð Ú Ý Ð Ö ×ØÖÓº Ù Ð × Ð Ò Ò Ò Ø ÑÔÓ ÓÖ Ö Ð ÔÖ ÙÒØ ÒØ Ö ÓÖ × Ð Ó ÔÓÖÕÙ Ð Ó Ð × ÒÓ ×ÓÐÓ × Ò Ø ÑÔÓ ÓÒר ÒØ Ñ × ÓרÓ×Ó ÕÙ Ð ×ÓÒ Ó Ð Ò Ð¸ × ÒÓ ÕÙ × ×Ø ÒØ ÔÖÓ Ð ÕÙ Ð × ÙÒ Ó ×ÓÒ Ó Ù× ÙÒ ÖÙÔØÙÖ Ð º × ÕÙ ¸ ÔÓÖ ×Ù × ÑÔÐ Ý Ù Ò × ÑÔ ÒÓ Ò Ö Ð¸ Ð ×ÓÒ Ó Ð Ò Ð × Ð × Ó Ò ØÓ Ô Ö ÓÒ ÙÒØÓ× Ô ÕÙ ÒÓ× Ý Ñ ÒÓ× Ò ÐÓ× Ù Ð × × ×Ø Ñ Ð Ð Ø Ñ ÒÓ¸ Ó Ò × ØÙ ÓÒ × ÔÖÓ Ö Ñ ÓÒ Ö Ô Ø Ð × ÓÑÓ Ð ÔÖÓØÓØ Ô Ó Ó Ð ÓÒØ Ò Ò º Ä ÓÒ Ð Ó Ð × × ÔÖ Ù ÒØÓ Ñ ÝÓÖ × × Ò M Ý N Ò ÐÓ× Ù Ð × ÐÓ× ½¼ ×ÓÒ Ó× ÕÙ ØÓÑ Ð Ù×ÕÙ ÐÐ Ý Ð Ò× Ö ÓÒ¸ ×ÓÒ ÒÓØ Ð × Ñ Ñ ÒØ Ñ ÓÖ × ÕÙ ÐÓ× ¿ ×ÓÒ Ó× ÕÙ Ò ÔÖÓÑ Ó ØÓÑ Ö Ð Ù×ÕÙ ÐÐ × Ð Ø Ð ×ØÙÚ × Ð ¼± ÔÐ Ò ØÙ º Ò Ù ÒØÓ Ð ×Ô Ó¸ Ñ ÝÓÖ × Ú ÐÓÖ × M Ý N¸ Ñ ÝÓÖ × Ð ×Ô Ö Ó Ò Ù Ø × Ú × ÕÙ Ö ÕÙ Ö Ö ÑÓ× ÓÒ Ð ×ÓÒ Ó Ð Ò Ðº È × Ó Ð ¼± ÔÐ Ò ØÙ ¸ Ð Ó Ð × Ü ÖÙÔ Ñ ÒØÓ × ÙÒ Ö Ó Ý × Ö Ò ×Ù× ÓÔ Ö ÓÒ ×º × ÜØÖ Ñ Ñ ÒØ ÑÔÓÖØ ÒØ Ö ÒØ Þ Ö ×Ø ÓØ º Ò × ÒØ × ×¸ ÐÓ× Ö Ø Ö Ó× ÕÙ ÓÒ Ù Ò × Ó Ö Ó Ð × ÓÑÓ ×ØÖ Ø ×ÓÒ Ó × Ö ×ÙÑ Ò Ò ½º Ö Ò ÒØ Ð Ú ×¸ ÐÓ ÕÙ ÑÔÐ ÕÙ Ð Ú ÐÓÖ × Ó Ö M × ÐØÓ Ý Ð ×Ô Ö Ó Ò Ù Ø × ×Ó ÙÔ × × Ñ ÝÓÖ ÓÒ Ð ×ÓÒ Ó Ð Ò Ðº ¾º ÈÓ Ó Ñ Ö Ò ×Ô Ö Ó ÔÓÖ ÑÔÐÓ¸ ÔÓ Ñ ÑÓÖ º Ë Ð ×Ø Ñ Ó ×Ó Ö N × ÔÖ ×Ó Ý ÒÓ ÑÙÝ Ö Ò ¸ ÒØÓÒ × Ð ×ÓÒ Ó Ð Ò Ð × Ð × Ð ÓÒ × × N × Ö Ò ¸ ÒØÓÒ × Ó Ð × º Ë Ð ×Ø Ñ Ó N × ÑÔÖ ×Ó¸ ÒØÓÒ × Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó × Ð Ñ ÓÖ ×ØÖ Ø º 5.1.5 Reajuste de dimensi´n en una tabla hash o ÄÙ Ó ÐÓ× Ò Ð × × Ö Ð Þ Ó׸ ÒÓ Óר ÖÒÓ× ÔÖ Ò Ö ÕÙ ¸ Ò Ô Ò ÒØ Ñ ÒØ Ð ×ØÖ Ø Ô Ö ØÖ Ø Ö ÓÒ Ð × ÓÐ × ÓÒ ×¸ Ù ÒØÓ Ñ × Ô ÕÙ ÒÓ × α¸ Ñ ÒÓÖ × Ð ÔÖÓ Ð ÓÐ × ÓÒ Ý¸ ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ñ ÓÖ × Ð × ÑÔ ÒÓ Ð ×ØÖ Ø º ÈÓÖ ÓØÖ Ô ÖØ ¸ ÙÒÕÙ × Ó × ÓÒ Ð¸ Ð Ñ Ð ×Ù ÖØ Ü ×Ø ݸ Ú ÒØÙ ÐÑ ÒØ ¸ Ó Ð ÓÒ ÙÒØÓ Ð Ú × ×ÙÔ Ö Ð ×Ø Ñ ÓÒ N¸ Ó Ð Ñ Ð Þ Ö Ù× ÙÒ ÒØ ÐØ ÓÐ × ÓÒ ×º ÈÙ Ö× Ð Ó Ð Ö ×Ô ØÓ À Ý Ó× Ñ Ò Ö × ØÖ Ø Ö ÓÒ Ð Ñ Ð ×Ù ÖØ º Ä ÔÖ Ñ Ö ¸ × Ò Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó Ý ÕÙ × Ö ÜÔÐ Ò Ü º½º ´Ô Ò ¿¿µ¸ Ö Ù Ð ÖÖ ÐÓ Ý Ð × Ù Ø × Ô Ö Ö ÒØ Þ Ö ÙÒ ÐÓÒ ØÙ Ñ Ü Ñ Ð ×Ø ÓÐ × ÓÒ ×º Ä × ÙÒ ¸ Ó ØÓ ר ×Ù ¹× ÓÒ¸ ÓÒ× ×Ø × ÑÔÐ Ñ ÒØ Ò Ô ÖØ Ö ÙÒ ÒÙ ÚÓ ÖÖ ÐÓ ÓÒ M Ñ ÝÓÖ Ý Ö Ù Ö Ð × Ð Ú ×º ר ÑÓ Ó¸ Ð Ö Ùר ÓÒ Ð Ó Ð × ÔÙ ÔÐ ÒØ Ö× Ð × Ù ÒØ Ñ Ò Ö ¿¼ Å Ñ ÖÓ× ÔÙ Ð Ó× ODhashTable<Key, Record> ¾ +≡ ´¾µ ¾ const size_t & resize(const size_t & new_size) { Bucket * new_table = new Bucket [new_size]; // aparta nuevo arreglo Bucket * old_table = table; // respaldar valores de la antigua tabla
  • 457.
    5.1. Manejo decolisiones 431 const size_t old_M = M; table = new_table; // reiniciar tabla a nuevo arreglo M = new_size; empty_entries_counter = M; deleted_entries_counter = 0; N = 0; for (int i = 0; i < old_M; ++i) // recorrer antigua tabla y reinsertar if (old_table[i].status == BUSY) insert(old_table[i].key, old_table[i].record); delete [] old_table; return M; } Ä ÓÔ Ö ÓÒ ×¸ ÓÒ ÔØÙ Ð Ý ×ØÖÙ ØÙÖ ÐÑ ÒØ ¸ × Ò ÐÐ ÒØ Ô Ö Ð ×ÓÒ Ó Ð Ò Ðº Ð Ö Ø Ö Ó Ô Ö ÒÚÓ ÖÐ ÐÓ Ø ÖÑ Ò Ð ÕÙ Ð Ú ÐÓÖ α ×ÙÔ Ö Ó × ÔÖÓÜ Ñ Ð ÙÑ Ö Ð Ò ÕÙ × ÔÖ ÙÒ Ù Ò × ÑÔ ÒÓº Ò Ð ×Ó Ð Ó Ð × ¸ ÔÙ Ö ÑÓ× ÒÚÓ Ö Ð Ö Ùר Ù Ò Ó ÒÓ× ÔÖÓÜ Ñ ÑÓ× Ð ¼± ÔÐ Ò ØÙ º × ÔÐ Ù× Ð Ö Ùר Ö × ÙÒ ÙÒ ÔÐ Ò ØÙ ×Ô Ö Ó Ù Ø × ×Ø ×ØÖ Ø Ø Ò ×Ø ÒØ × ÒØ Ó × Ð × Ò× Ö ÓÒ × × Ò Ý Ð Ø Ð × Ù× ÔÖ Ò Ô ÐÑ ÒØ Ô Ö Ð Ù×ÕÙ º Ò ×Ø ×Ó¸ ÔÙ Ö ÑÓ× Ö Ùר Ö Ð Ø Ð ÙÒ M Ò Ö ÓÖ Ñ Ò Ö ÕÙ ×Ñ ÒÙÝ ÑÓ× Ð ×Ô Ö Ó Ò Ù Ø × Ý Ö ×Ô Ø ÑÓ× Ð ÙÑ Ö Ð × ÑÔ ÒÓº À Ý Ó× Ù ×Ø ÓÒ Ñ ÒØÓ× ×Ø ÓÔ Ö ÓÒº Ð ÔÖ Ñ ÖÓ ÐÐÓ× × ×Ù Óר O(M) + O(M ) ÙÖ ÓÒ Ò Ð Ù Ð × Ö ÔÖÓ Ø ÚÓ ÙØ Ö Ù ÐÕÙ Ö ÓØÖ ÓÔ Ö ÓÒº ר Ú Ò¹ ØÙ Ð ÔÖÓ Ð Ñ × Ñ Ø ¸ Ñ × ÒÓ × Ú Ø Ð ØÓ Ó¸ ÓÒØ Ð Þ Ò Ó Ð ÙÒ Ø ÑÔÓ Ó Ó × Ö¸ ÙÒ Ú Þ ÕÙ α Ú Ò Ö Ò Ð ÙÑ Ö Ð¸ ÒØÓÒ × ×Ô Ö ÑÓ× ÔÓÖ ÙÒ Ø ÑÔÓ ÔÖÙ¹ ÒØ Ú Ö × ÒÓ Ó ÙÖÖ Ò ÓÔ Ö ÓÒ × × ÜÔ Ö Ð Ø ÑÔÓ ×Ô Ö ¸ ÒØÓÒ × ÔÖÓ ÑÓ× Ö Ùר Ö Ó Ð ×Ô Ö ÒÞ ÕÙ ÒÓ ×ØÓÖ ÑÓ× Ð × ÓØÖ × ÓÔ Ö ÓÒ ×º Ð × ÙÒ Ó Ù ×Ø ÓÒ Ñ ÒØÓ¸ Ú Ð Ó ×ÓÐÓ Ô Ö Ð × Ø Ð × ÖÖ ×¸ × ÕÙ × ÑÙ Ú Ò ÐÓ× ÓÒØ Ò Ó× Ð × Ù Ø ×º ÓÒ Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó¸ ÒÓ Ø Ò ÑÓ× ×Ø ÔÖÓ Ð Ñ º Ð Ö Ùר Ò Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó Ø Ò Ó× Ú ÒØ ׺ Ä ÔÖ Ñ Ö ¸ Ý Ñ Ò¹ ÓÒ ¸ × Ð ÔÓ× Ð N > Mº Ä × ÙÒ Ö Ò × ÑÔÐ ØÓÑ Ö ÔÖ Ú ¹ × ÓÒ × Ô Ö Ô ÖÑ Ø Ö Ð Ò× Ö ÓÒ ÙÖ ÒØ Ð ÔÖÓ ×Ó Ö Ùר º ¿½ Å ØÓ Ó× ÔÙ Ð Ó× ÒÄ × Ì Ð ¼ +≡ ´¼ µ ¼ size_t resize(const size_t & new_size) { BucketList * new_table = new BucketList [new_size]; BucketList * old_table = table; // guardar estado de la tabla actual const size_t old_size = M; table = new_table; // hacer tabla vac´a con arreglo new_table ı M = new_size; busy_slots_counter = 0; N = 0; for (int i = 0; i < old_size; ++i) // reinsertar cubetas en nueva tabla // recorrer lista colisiones en old_table[i] for (BucketItor it(old_table[i]); it.has_current(); /* Nada */) insert(static_cast<Bucket*>(it.del())); // eliminar e insertar en table[] delete [] old_table; // liberar memoria antigua tabla return M; }
  • 458.
    432 Cap´ ıtulo 5. Tablas hash 5.1.6 Manejo din´mico de cubetas (TAD DynLhashTable<Key, Record>) a ÙÐ × Ð ÑÒÖ Ñ× ÒÖÐ ÜÔÓÖØ Ö ÙÒ Ì × Ó Ò ÙÒ Ø Ð × Ë ØÖ Ø Ö ÙÒ Ñ Ô Ó ÒØÖ Ð Ú × Ý Ö ×ØÖÓ׸ ÙÝ ÒØ Ö Þ Ý Ù×Ó ×ÓÒ ×¹ Ø ÒØ × Ñ Ð Ö × ÐÓ× Ñ Ô Ó× ÕÙ Ö Ð Þ ÑÓ× ÓÒ Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ ´Ø ÔÓ DynMapTree<Tree, Key, Range, Compare>¹ Ü º½¼ ´Ô Ò ¿ µµº ÄÓ× Ø ÔÓ× Ø Ð × × OLHashTable<Key,Record> Ý ODhashTable<Key, Record> × Ø × Ò ×Ø Ö ÕÙ Ö Ñ ÒØÓ ÓÒ Ð × ÐÚ ÕÙ ×ØÓ× Ð Ñ Ø Ò Ð ÒØ ÐÚ× Ð Ú ÐÓÖ M × Ð ÓÒ Ó Ò ÓÒרÖÙ ÓÒº Ð Ì LhashTable<Key> ÒÓ Ø Ò ×Ø ÔÖÓ Ð Ñ ¸ Ô ÖÓ ×Ø Ò Ñ Ò Ö ×ØÖÓ× Ö Ø Ñ ÒØ Ò ØÖ Ø ÓÒ Ð Ñ ÑÓÖ Ò Ñ º À Ý ÙÒ ÐØ ÖÒ Ø Ú ÕÙ ¸ Ò ØÖ Ñ ÒØÓ ÙÒ ÔÓ Ó Ø ÑÔÓ ÓÒר ÒØ ¸ × ÖÖÓÐÐ ¹ Ö ÑÓ× Ò Ü º½º ´Ô Ò ¿¿µº ÈÓÖ ÐÓ× ÑÓÑ ÒØÓ׸ Ò ×Ø × ÓÒ ÜØ Ò Ö ÑÓ× Ð Ø ÔÓ LhashTable<Key> Ô Ö ÕÙ Ñ Ò ÙÒ Ö Ò Ó ×Ó Ó Ð ÓÒ ÙÒØÓ Ð Ú × Ý ØÖ Ø ÓÒ Ð Ñ ÑÓÖ Ò Ñ º Ð Ø ÔÓ Ò Ù ×Ø ÓÒ ÐÓ ÒÓÑ Ò ÑÓ× DynLhashTable<Key, Record>¸ Ð Ù Ð ÑÓ Ð Þ ÙÒ Ø Ð × ¸ ÓÒ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ × Ò Ò ¸ ÕÙ ×Ó Ð Ñ ÒØÓ× Ø ÔÓ key ÓÒ Ö ×ØÖÓ× Ø ÔÓ Record Ý ÕÙ × ×Ô ¬ Ò Ð Ö ÚÓ ØÔÐ ÝÒÄ × ºÀ ¿¾ ¸ ÙÝ ×ØÖÙ ØÙÖ Ò Ö Ð × ÓÑÓ × Ù ¿¾ ØÔÐ ÝÒÄ × ºÀ ¿¾ ≡ template <typename Key, typename Record, class Cmp = Aleph::equal_to<Key> > class DynLhashTable : public LhashTable<Key> { Å Ñ ÖÓ× ÔÖ Ú Ó× DynLhashTable<Key, Record> ¿¾ typedef typename DynLhashTable<Key, Record>::Hash_Fct Hash_Fct; Å Ñ ÖÓ× ÔÙ Ð Ó× DynLhashTable<Key, Record> ¿¿ }; Í× × LhashTable ¼ º Ä Ø Ð × ÔÙ Ö× ÓÑÓ ÙÒ ÖÖ ÐÓ ÓÒ ÐÓ× Ò × ×ÓÒ Ð Ú × Ø ÔÓ key Ý ÐÓ× ÓÒØ Ò Ó× Ð ÖÖ ÐÓ ×ÓÒ Ö ×ØÖÓ× Ø ÔÓ Recordº È Ö ÐÐÓ¸ DynLhashTable<Key, Record> ÜÔÓÖØ ×Ó Ö Ö × Ð ÓÔ Ö ÓÖ []º ÓÑÓ × Ú ¸ DynLhashTable<Key, Record> Ö ¸ Ø ÒØÓ Ô ÖØ ×Ù ÒØ Ö Þ ÓÑÓ Ô ÖØ ×Ù ÑÔÐ ÒØ ÓÒ¸ LhashTable<Key>º Å ØÓ Ó× ÓÑÓ ÐÓ× Ó × ÖÚ ÓÖ × Ý Ð Ö Ùר Ý ×Ø Ò ÑÔÐ ÒØ Ó× ÔÓÖ LhashTable<Key>º ÄÓ Ñ ×ÑÓ × ÔÙ ÖÔÖ Ð Ñ Ò Ó Ð ×ØÖ Ø º Ä Ð ÓÖ DynLhashTable<Key, Record> × Ö Ñ Ø ¸ ÒØÓÒ ×¸ Ð ¬Ò ÓÒ Ð Ö Ò Ó Ý Ð Ñ Ò Ó Ñ ÑÓÖ º Ä ¬Ò ÓÒ Ð Ö Ò Ó × Ö Ð Þ Ñ ÒØ ÙÒ Ù Ø ÖÚ LhashTable<Key>::Bucket ¿¾ Å Ñ ÖÓ× ÔÖ Ú Ó× DynLhashTable<Key, Record> ¿¾ ≡ ´ ¿¾ µ ¿¿ struct DLBucket : public LhashTable<Key>::Bucket { Record record; DLBucket(const Key & key, const Record & _record) : LhashTable<Key>::Bucket(key), record(_record) { /* Empty */ } }; ¬Ò × DLBucket¸ Ù× Ò ÙÒ ¿¿º Í× × LhashTable ¼ º ÍÒ Ú Þ ¬Ò Ð Ù Ø ¸ Ð × ÓÔ Ö ÓÒ × ÔÖ Ò Ô Ð × ×ÓÒ ÓÒ ÔØÙ ÐÑ ÒØ × Ò ÐР׸ ÔÙ × Ð Ñ Ò Ó Ð ×ØÖ Ø Ý ×Ø ÒרÖÙÑ ÒØ Ó Ò LhashTable<Key>º Ä Ò× Ö ÓÒ
  • 459.
    5.1. Manejo decolisiones 433 ׸ Ô٠׸ ÓÑÓ × Ù ¿¿ Å Ñ ÖÓ× ÔÙ Ð Ó× DynLhashTable<Key, Record> ¿¿ ≡ ´ ¿¾ µ ¿¿ Record * insert(const Key & key, const Record & record) { DLBucket * bucket = new DLBucket (key, record); LhashTable<Key>::insert(bucket); return &bucket->record; } Í× × DLBucket ¿¾ Ò LhashTable ¼ º Ð Ó Ó × Ð Ò Ð ÔÓÖÕÙ Ð ×ØÖ Ø Ý ×Ø ÑÔÐ ÒØ Ò LhashTable<Key>º Ä Ù×ÕÙ × Ö Ñ Ø ÙÒ ÛÖ ÔÔ Ö Ð Ù×ÕÙ LhashTable<Key> ¿¿ Å Ñ ÖÓ× ÔÙ Ð Ó× DynLhashTable<Key, Record> ¿¿ +≡ ´ ¿¾ µ ¿¿ ¿¿ Record * search(const Key & key) { DLBucket * bucket = static_cast<DLBucket*>(LhashTable<Key>::search(key)); return bucket != NULL ? &bucket->record : NULL; } Í× × DLBucket ¿¾ Ò LhashTable ¼ º Ä Ð Ñ Ò ÓÒ Ö ÕÙ Ö ØÖ Ò× ÓÖÑ Ö ÙÒ Ö ×ØÖÓ ÙÒ Ù Ø ¿¿ Å Ñ ÖÓ× ÔÖ Ú Ó× DynLhashTable<Key, Record> ¿¾ +≡ ´ ¿¾ µ ¿¾ static DLBucket * record_to_bucket(Record * rec) { DLBucket * ret_val = 0; size_t offset = reinterpret_cast<size_t>(&ret_val->record); return reinterpret_cast<DLBucket*>(reinterpret_cast<size_t>(rec) - offset); } Í× × DLBucket ¿¾ º ÓÒ ×Ø Ñ ØÓ Ó¸ Ð Ð Ñ Ò ÓÒ Ø Ñ Ò × ÑÙÝ × ÑÔÐ ¿¿ Å Ñ ÖÓ× ÔÙ Ð Ó× DynLhashTable<Key, Record> ¿¿ +≡ ´ ¿¾ µ ¿¿ void remove(Record * record) { DLBucket* bucket = record_to_bucket(record); LhashTable<Key>::remove(bucket); delete bucket; } Í× × DLBucket ¿¾ Ò LhashTable ¼ º Ä Ð ÓÒ × ÒרÖÙÑ ÒØ Ð Ì DynLhashTable<Key, Record> Ò ¸ ÙÒ Ú Þ Ñ ×¸ Ð ÓÒ Ð ÔÖ Ò Ô Ó ¬Ò¹ ¹¬Ò ´Ü ½º º¾ ´Ô Ò ¾¾µµº 5.1.7 Tablas hash lineales ÍÒ ÓÒ ÓÒ ×Ó Ö Ð Ù Ð × ×Ùר ÒØ Ò Ð × ÔÖ ÓÒ × × ÑÔ ÒÓ ÕÙ ÒÓ× Ó Ö Ò Ð × Ú Ö× × ×ØÖ Ø × Ô Ö ØÖ Ø Ö ÓÒ Ð × ÓÐ × ÓÒ × × ÕÙ Ð ØÓÖ Ö α ÒÓ Ü Ð ÙÑ Ö Ð Ô Ö Ð Ù Ð × ÙÑÔÐ Ð ÔÖ ÓÒº Ù ÒØÓ Ñ ÝÓÖ × Ð Ö ¸ Ò Ô Ò Ò¹ Ø Ñ ÒØ Ð ×ØÖ Ø Ô Ö ØÖ Ø Ö ÓÒ Ð × ÓÐ × ÓÒ ×¸ Ñ ÝÓÖ × Ö Ð ÔÖÓ Ð ÕÙ × Ö Ð × ÑÔ ÒÓº
  • 460.
    434 Cap´ ıtulo 5. Tablas hash Ë ÑÓ× ÕÙ Ð ØÓÖ Ö α ÔÙ ×Ñ ÒÙ Ö× × Ö Ùר ÑÓ× Ð Ø Ð ÙÒ Ñ ÝÓÖ Ú ÐÓÖ M Ý Ö Ù ÑÓ× Ð × Ù Ø ×º È ÖÓ¸ ÓÑÓ Ý ÐÓ × ÑÓ׸ ר Ö Ùר Ø Ò ÙÒ ÔÖ Ó O(M)+O(M )º Ä ×ØÖÙ ØÙÖ ÕÙ ØÖ Ø Ö ÑÓ× Ò ×Ø ×Ù ¹× ÓÒ Ø Ò Ð Ù ×Ø ÓÒ ÔÙ Ö× ÙÑ ÒØ Ó Ð ÖÖ ÐÓ Ò Ñ Ñ ÒØ ÁÒØÙ Ø Ú Ñ ÒØ ¸ ÑÓ× × Ö ÕÙ ×ØÓ × ÔÓ× Ð × Ù× ÑÓ× ÙÒ ÖÖ ÐÓ Ò Ñ Ó Ð Ø ÔÓ ×ØÙ Ó Ò Ü ¾º½º ´Ô Ò ½µº ÈÓÖ ×Ø Ð Ó¸ ÒÓ Ø Ò ÑÓ× Óר × ÑÔÓÖØ ÒØ × ¹Ñ ÝÓÖ × ÕÙ O(1)¹ ÕÙ Ô Ö ÔÓÖ Ð Ó Ö ÐÓ Ð Þ Ö Ð Ø Ð º Ð ×ÙÒØÓ × Ö Ð Ò ÓÒØÖ Ö ÙÒ Ñ Ò Ö Ñ Ö Ò Ñ Ñ ÒØ Ð Ú ÐÓÖ Mº Ð Ò ÓÕÙ Ø Ð × ÕÙ ×ØÙ Ö ÑÓ× ÒרÖÙÑ ÒØ Ö ÑÓ× Ò ×Ø ×Ù ¹× ÓÒ¸ Ù Ð Ö Ð Þ Ð ×Ø ÓÒ ÒÑ M¸ × Ð ÒÓÑ Ò ×Ô Ö× ÓÒ Ð Ò Ð ´Ð Ò Ö × Ò µº Ä Ø Ò Ù × Ù ÖØ ÔÓÖ Ú Þ ÔÖ Ñ Ö Ô Ö ÐÑ Ò Ñ ÒØÓ × ÙÒ Ö Ó ¾ Ý ×Ø ÔÖ × ÒØ ÓÒ ×Ø × Ò Ð Ä Ö×ÓÒ ¾¾ º Ð Ò ÓÕÙ ÙØ Ð Þ ÙÒ ÖÖ ÐÓ Ò Ñ Ó DynArray<T>º Ð Ú ÐÓÖ M Ú Ö Ò Ñ Ñ ÒØ Ò ÙÒ ÓÒ αº ×Ø ÑÓ Ó Ð × ÔÖ ÓÒ × × ÑÔ ÒÓ × ÑÔÖ × ÙÑÔÐ Ò × Ò Ò × Ô Ö ÔÓÖ Ð Ö Ùר º Ä Ø Ð × Ð Ò Ð ×Ø ÑÔÐ ÒØ Ñ ÒØ Ð Ø ÔÓ LinearHashTable<Key> ¸ Ð Ù Ð × ×Ô ¬ Ò Ð Ö ÚÓ ØÔÐ Ð ÒÀ × ºÀ ¿ ¸ ÙÝ ×Ô ¬ ÓÒ × × Ð × Ù ÒØ ¿ ØÔÐ Ð ÒÀ × ºÀ ¿ ≡ template <typename Key, template <class> class BucketType, class Cmp = Aleph::equal_to<Key> > class GenLinearHashTable { Å Ñ ÖÓ× ÔÖ Ú Ó× LinearHashTable<Key> ¿ Å Ñ ÖÓ× ÔÙ Ð Ó× LinearHashTable<Key> ¿ }; template <typename Key, class Cmp = Aleph::equal_to<Key> > class LinearHashTable : public GenLinearHashTable<Key, LhashBucket, Cmp> { // ... }; template <typename Key, class Cmp = Aleph::equal_to<Key> > class LinearHashTableVtl : public GenLinearHashTable<Key, LhashBucketVtl, Cmp> { // ... }; Í× × LhashBucket ¼ º GenLinearHashTable<Key, BucketType × Ð Ø ÔÓ Ò Ö Ó ÕÙ ÑÔÐ ÒØ Ð Ø Ð × ÐÒ Ð¸ Ñ ÒØÖ × ÕÙ LinearHashTable<Key, Cmp> Ý LinearHashTableVtl<Key, Cmp> ×ÓÒ ÐÓ× Ø ÔÓ× ÜÔÓÖØ Ó× Ô Ö Ð Ù×Ó ÕÙ Ñ Ò Ò Ù Ø × × Ò Ý ÓÒ ×ØÖÙ ØÓÖ Ú ÖØÙ Ðº Ä × ×ØÖÙ ØÙÖ × Ð × Ù Ø × ×ÓÒ Ü Ø Ñ ÒØ Ð × Ñ ×Ñ × ÕÙ Ð × Ð Ø ÔÓ LhashTable<Key> ×ØÙ Ó Ò Ü º½º¿º½ ´Ô Ò ¼¿µº 5.1.7.1 Expansi´n/contracci´n de una tabla hash lineal o o Ë Ò Ó table[] ÙÒ ÖÖ ÐÓ Ò Ñ Ó¸ ×Ù Ñ Ò× ÓÒ × ÙÑ ÒØ Ý × ÓÒØÖ Ò Ñ Ñ ÒØ Ò Ø ÑÔÓ O(1)º È Ö ÐÐÓ¸ × Ñ Ò Ò ÐÓ× × Ù ÒØ × ØÖ ÙØÓ× ÙÑ Ö Ð × ¿ Å Ñ ÖÓ× ÔÖ Ú Ó× LinearHashTable<Key> ¿ ≡ ´¿ µ ¿
  • 461.
    5.1. Manejo decolisiones 435 float upper_alpha; // factor de carga superior float lower_alpha; // factor de carga inferior LinearHashTable<Key> Ñ ÒØ Ò Ô ÖÑ Ò ÒØ Ñ ÒØ Ð ØÓÖ Ö α = N/Mº ×ÔÙ × ÙÒ Ò× Ö ÓÒ¸ α × ÓÑÔ Ö ÓÒ upper alpha × α ≥ ÙÔÔ Ö ÐÔ ¸ ÒØÓÒ × Ð Ø Ð × ÜÔ Ò Ø ÒØ × ÙÒ × ÓÑÓ × Ò × Ö Ó Ô Ö ÐÐ Ú Ö Ð Ö ÙÒ Ú ÐÓÖ Ò Ö ÓÖ ÙÔÔ Ö ÐÔ ÙÖ ÒØ ר ÔÖÓ ×Ó¸ Ð ÙÒ × Ù Ø × ×ÓÒ Ö Ù ×º Ë Ñ ØÖ Ñ ÒØ ¸ × ÐÙ Ó ÙÒ Ð Ñ Ò ÓÒ α ≤ ÐÓÛ Ö ÐÔ ¸ ÒØÓÒ × Ð Ø Ð × ÓÒØÖ ÙÒ Ó Ñ × Ú × ×Ø ÕÙ Ð Ö ×Ø ÔÓÖ Ó ÐÓÛ Ö ÐÔ Ù ÐÑ ÒØ ¸ Ð ÙÒ × Ù Ø × × Ö Ù Òº Ð ØÖÙ Ó Ð ×Ô Ö× ÓÒ Ð Ò Ð ×ØÖ ¸ Ô٠׸ Ò Ð Ñ Ò Ö Ò ÕÙ Ð Ò ÐÑ ÒØ × ÜÔ Ò Ý ÓÒØÖ Ð Ø Ð ¸ × ÓÑÓ Ò Ð ÓÖÑ Ò ÕÙ × Ñ Ò Ð ÙÒ ÓÒ × º ÄÓ× Ú ÐÓÖ × Ò Ð × upper alpha Ý lower alpha × ×Ô ¬ Ò ÙÖ ÒØ Ð ÓÒ¹ רÖÙ ÓÒ ÙÒ Ó ØÓ LinearHashTable<Key> ¸ Ð Ù Ð ÜÔÓÖØ ÑÓ ¬ ÓÖ × ÕÙ Ô Ö¹ Ñ Ø Ò Ùר Ö Ò Ñ Ñ ÒØ ÐÓ× Ú ÐÓÖ × ÙÑ Ö Ð × Ö º Ð ×Ø Ó ÜÔ Ò× ÓÒ Ó ÓÒØÖ ÓÒ Ð Ø Ð ¸ × Ñ ÒØ Ò Ñ ÒØ ÐÓ× × Ù ÒØ × Ó× ØÖ ÙØÓ× ¿ Å Ñ ÖÓ× ÔÖ Ú Ó× LinearHashTable<Key> ¿ +≡ ´ ¿ µ ¿ ¿ size_t p; // ındice de la lista que se particiona (o aumenta) ´ size_t l; // cantidad de veces que se ha duplicado la tabla Ð ÖÖ ÐÓ × ÑÔÖ Ö Ó Ö ÔÓÖ ×Ù ÜØÖ ÑÓ Ö Óº Ð Ò p × Ö ÖÒ Ó× Ñ Ò Ö × ½º table[p + M] × Ð ÒØÖ Ð ÖÖ ÐÓ ÔÓÖ ÓÒ ×Ø × ÜÔ Ò Ó ÓÒØÖ ¸ × ÙÒ × Ð ÓÔ Ö ÓÒ Ý Ð Ú ÐÓÖ Ð ØÓÖ Ö αº ¾º table[p] ÓÒØ Ò Ð Ð ×Ø ÓÐ × ÓÒ × ÕÙ × Ô ÖØ ÓÒ Ö × Ó ÙÖÖ × ÙÒ Ü¹ Ô Ò× ÓÒº Ù Ò Ó Ó ÙÖÖ ÙÒ ÜÔ Ò× ÓÒ¸ Ð ÙÒ × Ù Ø × Ð Ð ×Ø table[p] × Ô × Ò Ð Ð ×Ø table[M + p]º Ë Ñ ØÖ Ñ ÒØ ¸ Ù Ò Ó Ó ÙÖÖ ÙÒ ÓÒØÖ ÓÒ¸ ØÓ × Ð × Ù Ø × table[M + p] × ØÖ ×Ð Ò table[p]º Ù Ò Ó × ÜÔ Ò × Ò Ö Ñ ÒØ Ð Ò p × Ñ ØÖ Ñ ÒØ ¸ × Ö Ñ ÒØ Ù Ò Ó × ÓÒØÖ º M M 0 1 2 3 4 5 0 1 2 3 4 5 6 p p ´ µ ר Ó Ò Ð ´ µ ÄÙ Ó Ð ÔÖ Ñ Ö Ü¹ Ô Ò× ÓÒ M M M 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 10 p p ´ µ ÄÙ Ó ÜÔ Ò× ÓÒ × ´ µ ÄÙ Ó ÜÔ Ò× ÓÒ × ´ Ð Ú ÐÓÖ M × Ù¹ ÔÐ µ ÙÖ º¿ ÈÖÓ ×Ó ÜÔ Ò× ÓÒ ÐÓ Ð Ø Ð ÔÖ M=5 È Ö ÔÓ Ö Ð ÙÐ Ö Ð ØÓÖ Ö ¸ ÑÓ× ÓÒÓ Ö Ò ØÓ Ó ÑÓÑ ÒØÓ Ð Ø Ñ ÒÓ ÐÓ Ó ØÙ Ð Ð Ø Ð ´M µ ר Ú ÐÓÖ ÐÓ Ñ ÒØ Ò Ö ÑÓ× Ò Ð × Ù ÒØ ØÖ ÙØÓ ¿ Å Ñ ÖÓ× ÔÖ Ú Ó× LinearHashTable<Key> ¿ +≡ ´ ¿ µ ¿ ¿ size_t MP; // guarda el valor p + M
  • 462.
    436 Cap´ ıtulo 5. Tablas hash Ò Ò ÙÖ ¸ ר ØÖ ÙØÓ ÒÓ× ÔÓÒ Ö Ø ×ÔÓ× ÓÒ Ð Ð ÙÐÓ p + Mº Ù Ò Ó p = 2M¸ Ð Ø Ñ ÒÓ ÐÓ Ó Ð Ø Ð × ÙÔÐ Ý × Ö Ò Ò M = 2M¸ p = 0 Ý MP = Mº Ò ØÓ Ó ÑÓÑ ÒØÓ 0 ≤ p ≤ 2lM − 1º Ä ÙÒ ÓÒ Ð ØÖ ÙØÓ l ׸ ÒØÓÒ ×¸ ÓØ Ö Ð ÓÒØÖ ÓÒ Ð Ú ÐÓÖ ÓÖ Ò Ð M ÕÙ Ý × Ó ×Ô ¬ Ó Ò ÓÒרÖÙ ÓÒº Ò ÜÔ Ò× ÓÒ» ÓÒØÖ ÓÒ Ý ÕÙ ×Ø Ö Ô Ò ÒØ Ð ÔÖ Ó p == 2Mº È Ö Ò Ö ÙÒ ÔÓ Ó Ø ÑÔÓ Ð ÙÐÓ¸ Ð ÔÖÓ Ù ØÓ 2M × Ù Ö Ò Ð ØÖ ÙØÓ ÅÅ = 2M ¿ Å Ñ ÖÓ× ÔÖ Ú Ó× LinearHashTable<Key> ¿ +≡ ´¿ µ ¿ ¿ size_t MM; // producto 2*M Ð ÔÖÓ ×Ó ÜÔ Ò× ÓÒ × ÐÙ×ØÖ Ò Ð ¬ ÙÖ º¿ Ô Ö M = 5º Ò Ú ÖØÙ ÐÓ ÜÔÐ Ó¸ Ð ÑÓÑ ÒØÓ ÜÔ Ò Ö Ð Ø Ð ÐÓ× Ú ÐÓÖ × p¸ l¸ M], [[MP Ý MM × ØÙ Ð Þ Ò Ð × Ù ÒØ Ñ Ò Ö ¿ ØÙ Ð Þ Ö ×Ø Ó ÜÔ Ò× ÓÒ ¿ ≡ ´¿ µ ++p; ++MP; if (p == M) // (p == 2*M) ¿debe duplicarse el tama~o de la tabla? n { // s´ ==> modificar el tama~o de la tabla a 2*M ı n ++l; // Cantidad de veces que se ha duplicado la tabla p = 0; MP = M = MM; // se les asigna 2*M MM = multiply_by_two(MM); } Ë Ñ ØÖ Ñ ÒØ ¸ Ð ÓÒØÖ ÓÒ Ð Ø Ð × Ð ÔÖÓ ×Ó ÒÚ Ö×Ó ¿ ØÙ Ð Þ Ö ×Ø Ó ÓÒØÖ ÓÒ ¿ ≡ ´¿ µ if (p == 0) // ¿debe dividirse entre 2 el tama~o de la tabla? n { // s´ ==> actualizar tama~o de la tabla a M/2 ı n --l; // Cantidad de veces que se ha duplicado la tabla disminuye MM = M; // se divide entre dos M = divide_by_two(M); p = M - 1; } else --p; // no ==> s´lo reducir ındice p o ´ --MP; Ð Ò ÓÕÙ Ò Ñ Ó ÜÔ Ò× ÓÒ» ÓÒØÖ ÓÒ ÔÐ ÒØ ÙÒ ÔÖÓ Ð Ñ ÓÒ Ð Ø ÖÑ ¹ Ò ÓÒ Ð Ò Ò Ð Ø Ð Ý Ð Ú ÐÓÖ ÕÙ ÖÖÓ Ð ÙÒ ÓÒ × º ÙÒ Ð Ú k¸ ØÖ ÓÒ ÐÑ ÒØ Ð Ò Ò Ð Ø Ð × Ø ÖÑ Ò Ñ ÒØ h(k) ÑÓ M ; Ô ÖÓ ×Ø Ú ÐÓÖ Ö Ð Ö Ò Ó ÒØÖ × [0, M − 1] Ý ÔÓÖ Ù Ö Ð Ö Ò Ó ÒØÖ × ÜÔ Ò × [M, M + p]º Ð ÔÖÓ Ð Ñ × Ö ×Ù ÐÚ Ñ ÒØ Ð Ú ÐÓÖ p Ý ÑÓ ¬ Ò Ó Ð ÐÐ Ñ Ð ÙÒ ÓÒ × Ð × Ù ÒØ Ñ Ò Ö ¿ Å Ñ ÖÓ× ÔÖ Ú Ó× LinearHashTable<Key> ¿ +≡ ´ ¿ µ ¿ ¿ size_t call_hash_fct(const Key & key) const
  • 463.
    5.1. Manejo decolisiones 437 { const size_t hash = (*hash_fct)(key); const size_t i = hash % M; return i < p ? hash % MM : i; } ¬Ò × call hash fct¸ Ù× Ò ÙÒ × ¿ Ò ¼º Ê ÓÖ ÑÓ× ÕÙ p × Ð Ò Ð Ð ×Ø ÜÔ Ò× ÓÒ» ÓÒØÖ ÓÒº Ò Ð Ö Ò Ó [0, M − 1] Ð Ø Ð ÓÒØ Ò Ù Ø × × Ò × ÔÓÖ (¶ × Ø)( Ý) ÑÓ M ; ´ º¿¼µ Ñ ÒØÖ × ÕÙ Ò Ð Ö Ò Ó [M, M + p] Ð × Ù Ø × × × Ò Ò ÔÓÖ (¶ × Ø)( Ý) ÑÓ 2M . ´ º¿½µ Ù Ò Ó p = 2M¸ ÒØÓÒ × ØÓ Ó Ð Ö Ò Ó [0, 2M − 1] ÔÙ × Ö Ù ÖØÓ ÓÒ Ð ÑÓ ÙÐÓ 2Mº Ù Ò Ó Ó ÙÖÖ ÙÒ ÜÔ Ò× ÓÒ × Ô ÖØ ÓÒ Ð Ð ×Ø ÓÐ × ÓÒ × ÙÝÓ Ò ÒÐ Ø Ð × pº Ä Ð ×Ø Ð Ð ×Ø ÓÐ × ÓÒ × table[p] × Ö ÓÖÖ ÒØ Ö Ñ ÒØ Ý × ÒÚÓ call hash fct() Ô Ö Ð Ú º ÕÙ ÐÐ × Ð Ú × ÙÝÓ Ò × Ð Ñ ×ÑÓ ×Ù ÒØÖ p Ô ÖÑ Ò Ò Ò Ð Ð ×Ø ¸ Ñ ÒØÖ × ÕÙ ÕÙ ÐÐ × ÙÝÓ Ò × ×Ø ÒØÓ M + p ×ÓÒ ÑÓÚ × table[M + p]º Ä ¬ ÙÖ º ÐÙ×ØÖ ÐÓ× ×Ø Ó× ÒØ × Ý ×ÔÙ × ÙÒ ÜÔ Ò× ÓÒº 0 70 10 0 70 10 1 206 11 p=11 206 266 11 1676 86 p=2 2 M=5 M=5 2 3 13 77 3 13 77 4 99 94 14 4 99 94 14 5 435 15 35 5 435 15 35 6 266 1676 86 6 7 ´ µ ÒØ × ÜÔ Ò Ö table[2] ´ µ table[2] ÜÔ Ò table[6] ÙÖ º ÑÔÐÓ Ô ÖØ ÓÒ» ÓÒØÖ ÓÒ ÙÒ Ð ×Ø Ð ÔÖÓ ×Ó Ô ÖØ ÓÒ ÙÒ ÒØÖ × Ö ØÓ ÔÙ ÒרÖÙÑ ÒØ Ö× Ð × Ù ÒØ ÓÖÑ ¿ È ÖØ ÓÒ Ö Ð ×Ø ¿ ≡ ´¿ µ BucketList * src_list_ptr = table.test(p); if (src_list_ptr != NULL) // ¿table[p] est´ escrita? a if (not src_list_ptr->is_empty()) // ¿table[p] no est´ vac´a’ a ı { BucketList * tgt_list_ptr = NULL;
  • 464.
    438 Cap´ ıtulo 5. Tablas hash // recorrer lista colisiones y mover cubetas de table[p+M] for (BucketItor it(*src_list_ptr); it.has_current(); /* nada */) { Bucket * bucket = static_cast<Bucket*>(it.get_current()); it.next(); // avance al siguiente elemento de la lista const Key & key = bucket->get_key(); const int i = (*hash_fct)(key) % MM; if (i == p) // ¿pertenece esta clave a table[p]? continue; // s´ ==> clave sigue en table[p] ==> procese siguiente ı if (tgt_list_ptr == NULL) tgt_list_ptr = &table.touch(MP); // bucket no pertenece a table[p] sino a table[p+m] ==> // eliminar bucket de table[i] e insertarlo en table[p+m] bucket->del(); tgt_list_ptr->append(bucket); } if (src_list_ptr->is_empty()) // ¿table[p] qued´ vac´a? o ı --busy_slots_counter; // s´ ==> un slot vac´o ı ı ++busy_slots_counter; // uno nuevo por table[p+M] } Ð ÐÓÕÙ ÓÒ× Ö Ð ÔÓ× Ð ÕÙ Ð Ð ×Ø table[p] ר Ú Ó¸ Ò ÐÙ× Ú ¸ ÕÙ Ñ × Ý × ÓÖ Ö Ò º Ð Ñ ×ÑÓ ÑÓ Ó¸ × Ò Ò ÙÒÓ ÐÓ× Ð Ñ ÒØÓ× table[p] Ô × table[MP]¸ ÒØÓÒ × × ÔÓ× Ð ÕÙ Ð ÒØÖ table[MP] ÒÓ Ó ÙÔ Ñ ÑÓÖ º ÒØ Ò × ´× ÔÖ ×ÙÑ µ Ð × Ú × ØÙ × Ð ÜÔ Ò× ÓÒ¸ ÔÓ ÑÓ× × Ö Ö ÙÒ ÖÙØ Ò ÕÙ Ð Ö Ð Ý ÕÙ × ÒÚÓ Ú Þ ÕÙ Ó ÙÖÖ ÙÒ Ò× Ö ÓÒ ¿ Å Ñ ÖÓ× ÔÖ Ú Ó× LinearHashTable<Key> ¿ +≡ ´ ¿ µ ¿ ¿ void expand() { // expandir la tabla hasta que la carga est´ debajo de upper_alpha e for (float alpha = 1.0*N/MP; alpha >= upper_alpha; alpha = 1.0*N/MP) { È ÖØ ÓÒ Ö Ð ×Ø ¿ ØÙ Ð Þ Ö ×Ø Ó ÜÔ Ò× ÓÒ ¿ } } ¬Ò × expand¸ Ù× Ò ÙÒ × ¼ Ò º ÆÓØ ÑÓ× ÕÙ Ð ÜÔ Ò× ÓÒ ×ÓÐÓ × ÐÙ Ö × × Ü Ð ØÓÖ Ö º Ð ÔÖÓ ×Ó ÓÒØÖ ÓÒ ÔÙ ÒØ ÖÔÖ Ø Ö× Ð ÒÚ Ö× Ð ÜÔ Ò× ÓÒ Ô × Ö ÐÓ× Ð Ñ ÒØÓ× Ð Ð ×Ø table[M + p] Ð Ð ×Ø table[p] Ø Ñ Ò × ÐÙ×ØÖ Ò Ð ¬ ÙÖ º × × ÒØ ÖÔÖ Ø Ö ÞÕÙ Ö º Ò ×Ø ×Ó¸ Ð ÔÖÓ ×Ó ¹ ÓÒØÖ ÓÒ¹ × ÑÙ Ó Ñ × Ö Ô Ó¸ ÔÙ × ÒÓ × Ò × Ö Ó Ö ÓÖÖ Ö Ò Ò ÙÒ Ð × Ð ×Ø ׸ ×ÓÐÓ ÓÒ Ø Ò ÖÐ table[M + p] table[p]¸ Ð Ù Ð Ð Ö Ð Þ Ö Ø Ý ÓÒר ÒØ Ñ ÒØ ÙÒ ÓÔ Ö ÓÒ Ð Ì Dlink ´Ü ¾º º ´Ô Ò µµ ¿ Ù× ÓÒ Ö Ð ×Ø ¿ ≡ ´¿ µ if (MP < table.size()) // ¿Existe table[MP]]? { BucketList * src_list_ptr = table.test(MP); if (src_list_ptr != NULL) // ¿existe entrada para table[p+M]? {
  • 465.
    5.1. Manejo decolisiones 439 if (not src_list_ptr->is_empty()) // ¿est´ vac´a table[p+M]? a ı { // no ==> fusionar las listas BucketList & tgt_list = table.touch(p); // asegura table[p] tgt_list.concat_list(src_list_ptr); --busy_slots_counter; // table[p+M] devino vac´a ı } table.cut(MP); // eventualmente liberar memoria de table[p+M] } } Ä ÖÙØ Ò ÓÒØÖ ÓÒ¸ Ù Ð × ÒÚÓ ÓÒ Ð Ñ Ò ÓÒ¸ × ¬Ò ¸ ÒØÓÒ ×¸ Ð × Ù ÒØ ÓÖÑ ¿ Å Ñ ÖÓ× ÔÖ Ú Ó× LinearHashTable<Key> ¿ +≡ ´¿ µ ¿ void contract() { // contraer la tabla hasta que la carga est´ por debajo de lower_alpha e for (float alpha = (1.0*N)/MP; alpha <= lower_alpha and MP > len; alpha = (1.0*N)/MP) { ØÙ Ð Þ Ö ×Ø Ó ÓÒØÖ ÓÒ ¿ Ù× ÓÒ Ö Ð ×Ø ¿ } } ¬Ò × contract¸ Ù× Ò ÙÒ ¼ º ÄÓ ÒÓÚ Ó×Ó ÙÒ Ø Ð × Ð Ò Ð × Ð ÔÖÓ ×Ó ÜÔ Ò× ÓÒ» ÓÒØÖ ÓÒº Ö ×ØÓ¸ רÖÙ ØÙÖ ÐÑ ÒØ ¸ Ð × ÓÔ Ö ÓÒ × ×ÓÒ ÒØ × Ð × Ð Ö ×ØÓ ÐÓ× Ò ÓÕÙ × ×ØÙ Ó׺ 5.1.7.2 B´ squeda en LinearHashTable<Key> u Ä Ù×ÕÙ ¸ ÓÑÓ × ØÖ ÓÒ ÙÒ Ø Ð × ¸ × Ð ÓÔ Ö ÓÒ Ñ × × ÑÔÐ ¿ Å Ñ ÖÓ× ÔÙ Ð Ó× LinearHashTable<Key> ¿ ≡ ´¿ µ ¼ Bucket * search(const Key & key) { const int i = call_hash_fct(key); BucketList * list = table.test(i); if (list == NULL) // ¿Ha sido escrita alguna vez table[i]? return NULL; // No ==> el elemento no se encuentra en la tabla if (list->is_empty()) return NULL; // buscar key en la lista de cubetas for (BucketItor it(*list); it.has_current(); it.next()) { Bucket * bucket = static_cast<Bucket*>(it.get_current()); if (Cmp() (key, bucket->get_key())) return bucket; } return NULL; } Í× × call hash fct ¿ º
  • 466.
    440 Cap´ ıtulo 5. Tablas hash Ä Ò ÙÖ ×Ø Ù×ÕÙ Ö ×Ô ØÓ ÐÓ× ÓØÖÓ× Ø ÔÓ× Ø Ð × × Ð Ó ÕÙ ¸ ÔÙ ×ØÓ ÕÙ Ð ÖÖ ÐÓ Ò Ñ Ó Ô ÖØ Ñ ÑÓÖ Ò ÙÒ ÓÒ Ð ÔÖ Ñ Ö × Ö ØÙÖ ¸ × ÔÖÓ Ð ÕÙ Ý Ò ÒØÖ × ÕÙ ÒÓ Ý Ò × Ó Ô ÖØ ׺ 5.1.7.3 Inserci´n en LinearHashTable<Key> o ¼ Å Ñ ÖÓ× ÔÙ Ð Ó× LinearHashTable<Key> ¿ +≡ ´¿ µ ¿ ¼ Bucket* insert(Bucket * bucket) { const int i = call_hash_fct(bucket->get_key()); BucketList & list = table.touch(i); // asegura memoria para table[i] if (list.is_empty()) ++busy_slots_counter; list.append(bucket); ++N; expand(); return bucket; } Í× × call hash fct ¿ Ò expand ¿ º 5.1.7.4 Eliminaci´n en LinearHashTable<Key> o ¼ Å Ñ ÖÓ× ÔÙ Ð Ó× LinearHashTable<Key> ¿ +≡ ´¿ µ ¼ Bucket * remove(Bucket * bucket) { Bucket * next = static_cast<Bucket*>(bucket->get_next()); bucket->del(); // elimine de lista de colisiones if (next->is_empty()) // ¿lista de colisiones qued´ vac´a? o ı --busy_slots_counter; // s´ ==> un slot vac´o ı ı --N; contract(); return bucket; } Í× × contract ¿ º 5.1.7.5 An´lisis de la dispersi´n lineal a o ÒØ × ÒÙÒ Ö Ð ÔÖÓÔÓ× ÓÒ ÙÒ Ñ ÒØ и × Ñ Ò ×Ø Ö ÒÓØ Ö ÕÙ ¸ × ÐÚÓ Ð × ÜÔ Ò× ÓÒ × Ý ÓÒØÖ ÓÒ ×¸ ÙÒ Ø Ð × Ð Ò Ð × × Ñ Ð Ö ÙÒ Ø Ð × ØÖ ÓÒ Ð ÓÒ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ × ÔÓÖ Ò Ò Ñ ÒØÓ × Ô Ö Óº ÓÑÓ Ø Ð¸ ÒÓ ÒÓ× × Ö ÜØÖ ÒÓ Ò Ð Þ Ö Ð ×Ô Ö× ÓÒ Ð Ò Ð Ô ÖØ Ö Ð Ò Ð × × Ö Ð Þ Ó ÓÒ Ð Ò Ò Ñ ÒØÓ × Ô Ö Óº Proposici´n 5.3 (Larson 1988 [22]) Cantidad de cubetas revisadas en una o b´ squeda sobre una tabla hash lineal u Ë h(k) : K −→ [0, M − 1] ÙÒ ÙÒ ÓÒ × O(1) ÕÙ ×ØÖ ÙÝ ÙÒ ÓÖÑ Ñ ÒØ ÐÓ× Ð Ñ ÒØÓ× K [0, M − 1]º Ë T ÙÒ Ø Ð × Ð Ò Ð ÐÓÒ ØÙ M ÓÒ N Ð ¹ Ñ ÒØÓ׺ ÒØÓÒ ×¸ Ð ÔÖÓÑ Ó Ù Ø × ÕÙ × Ú × Ø Ò Ò ÙÒ Ù×ÕÙ ÐÐ × α ≤ UN ≤ 9 16 +α ; ´ º¿¾µ
  • 467.
    5.1. Manejo decolisiones 441 Ý Ð ÔÖÓÑ Ó Ô Ö ÙÒ Ù×ÕÙ Ü ØÓ× × 1+ 1 + M α 1 ≤ SN ≤ 1 + 1 9 + α M 16 . ´ º¿¿µ Demostraci´n o Ë l Ð ÐÓÒ ØÙ ÙÒ Ð × Ð ×Ø × ÓÐ × ÓÒ × Ò Ð Ò Ò Ñ ÒØÓ × Ô Ö Óº Ë ÙÒ Ð Ð Ñ º½ ´ Ù ÓÒ ´ º µ¸ Ô º ¼ µ¸ l = N/Mº ÄÓ× Ð Ñ × º¾ ´ Ù ÓÒ ´ º µ¸ Ô º ¼ µ Ý º¿ ´ Ù ÓÒ ´ º µ¸ Ô º ¼ µ¸ ÕÙ ×ØÙ ÑÓ× ÓÒ Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó¸ ÔÐ ÒØ Ò ÐÓ× ÔÖÓÑ Ó× Ù Ò Ó ÒÓ Ó ÙÖÖ Ò ÜÔ Ò× ÓÒ × Ó ÓÒØÖ ÓÒ ×º Ò ×Ø × ÒØ Ó¸ ×ÙÑ Ò Ó ÙÒ ØÓÖ Ö y¸ ÔÓ ÑÓ× ¬Ò Ö Ð × × Ù ÒØ × ÙÒ ÓÒ × u(y) = y ; ´ º¿ µ Ô Ö Ð ÔÖÓÑ Ó Ù Ø × ÕÙ × Ò×Ô ÓÒ Ò ÙÒ Ù×ÕÙ Ò ÖÙ ØÙÓ× Ý s(y) = 1 + 1 + y M 1 ; ´ º¿ µ Ô Ö Ð Ð ÔÖÓÑ Ó Ù Ø × ÕÙ × Ò×Ô ÓÒ Ò ÙÒ Ù×ÕÙ Ü ØÓ× º ÍÒ Ñ Ö Ñ × Ù Ó× ¸ Ô ÖÑ Ø ÒØ ÖÔÖ Ø Ö u(y) Ý s(y) Ò Ð Ñ ×ÑÓ × ÒØ Ó Ù Ò Ó p=0 × Ö¸ Ù Ò Ó ÒÓ Ó ÙÖÖ Ó Ò Ò ÙÒ ÜÔ Ò× ÓÒ¸ Ð ÜÔ Ò× ÓÒ ÙÔÐ Ö Ð Ú ÐÓÖ M ´Ú × ØÙ Ð Þ Ö ×Ø Ó ÜÔ Ò× ÓÒ ¿ µ Ó Ð ÓÒØÖ ÓÒ Ú Ö ÒØÖ M ´Ú × ØÙ Ð Þ Ö ×Ø Ó ÓÒØÖ ÓÒ ¿ µº È Ö Ø Ð × Ð Ò Ð Ø Ñ ÒÓ M¸ ×Ù× M Ð ×Ø × ÓÐ × ÓÒ × ÔÙ Ò ×ØÖ Ù Ö× Ò ¯ p ÔÖ Ñ Ö × Ð ×Ø × ÕÙ Ò × Ó Ô ÖØ ÓÒ ×º ¯ M − P Ð ×Ø × ÕÙ ÒÓ Ò × Ó Ô ÖØ ÓÒ ×¸ Ý ¯ p Ð ×Ø × Ö ×ÙÐØ ÒØ × Ö Ô ÖØ ÓÒ Ó Ð × ÔÖ Ñ Ö × p Ð ×Ø ׺ Ä × ØÙ ÓÒ × ÔÙ Ô ØÓÖ Þ Ö Ñ Ò Ö Ô ÖØ ÙÐ Ö ´p = 2µ¸ × ÓÑÓ Ø Ñ Ò Ñ Ò Ö Ò Ö Ð¸ × p p+M . . . M Ä × Ð ×Ø × ÕÙ ÒÓ Ò × Ó Ô ÖØ ÓÒ × ÓÒØ Ò Ò¸ Ò ÔÖÓÑ Ó¸ l Ù Ø ×º Ó Ð ×ÙÔÓ× ÓÒ Ð ØÓÖ Ô Ö Ð ÙÒ ÓÒ × ¸ ÙÒ Ð ×Ø ÐÓÒ ØÙ ÔÖÓÑ Ó l × Ô ÖØ ÓÒ Ò Ó× Ð ×Ø × Ø Ñ ÒÓ ÕÙ Ø Ø ÚÓ l/2º Ò ÙÒ ÓÒ ÐÓ ¬Ò Ó¸ Ð ØÓØ Ð Ù Ø × × Ö Ô ÖØ ÒØÓÒ × Ò N= p l 2 + (M − p)l + p l 2 = pl + (M − p)l = Ml ´ º¿ µ ÒÓ Ô ÖØ ÓÒ × Ô ÖØ ÓÒ × Ö ×ÙÐØ ÒØ × Ô ÖØ ÓÒ Ð ØÓÖ Ö ÙÒ Ø Ð × Ð Ò Ð ×Ø ¸ ÒØÓÒ ×¸ ¬Ò Ó ÔÓÖ p+M α= Ml p+M =⇒ l = α M ´ º¿ µ Ë x = p/M Ó × ¸ Ð ÔÖÓÔÓÖ ÓÒ Ð ×Ø × ÕÙ Ò × Ó Ô ÖØ ÓÒ ×º ר ÑÓ Ó¸ ´ º¿ µ × ¬Ò ÓÑÓ l = α(1 + x) ´ º¿ µ
  • 468.
    442 Cap´ ıtulo 5. Tablas hash ´ º¿ µ ÔÖÓÚ Ò Ð Ð Ò Ð Ð ÒØ ×Ô Ö Ù Ø × Ò ÙÒ Ð ×Ø ÕÙ ÒÓ × Ó Ô ÖØ ÓÒ ÙÑ ÒØ Ð Ò ÐÑ ÒØ α 2αº Ù ÐÕÙ Ö Ù×ÕÙ ¸ Ü ØÓ× Ó ÐÐ ¸ Ø Ò ÔÖÓ Ð x Ö Ð Þ Ö× ×Ó Ö ÙÒ Ð ×Ø Ô ÖØ ÓÒ Ó Ö ×ÙÐØ ÒØ ÙÒ Ô ÖØ ÓÒº Ð Ñ ×ÑÓ ÑÓ Ó¸ Ý ÙÒ ÔÖÓ Ð (1 − x) ÕÙ Ð Ù×ÕÙ Ô Ö Ò ÙÒ Ð ×Ø ÕÙ ÒÓ × Ó Ô ÖØ ÓÒ º Ë ¬Ò ÑÓ× U(x) ÓÑÓ Ð ÒØ ×Ô Ö Ù Ø × Ú × Ø Ö Ò ÙÒ Ù×ÕÙ ÐÐ Ù Ò Ó ÙÒ ÔÖÓÔÓÖ ÓÒ x Ð × Ð ×Ø × Ð Ø Ð Ò × Ó Ô ÖØ ÓÒ ×¸ ÒØÓÒ ×¸ × ÙÒ ´ º¿ µ¸ Ù Ð ÒÓ× Ò Ð ÒØ ×Ô Ö Ù Ø × ÕÙ × Ú × Ø Ö Ò¸ U(x) × ¬Ò ÓÑÓ α(1 + x) U(x) = x u(l/2) + (1 − x) u(l) = x u + (1 − x) u(α(1 + x)) 2 = α 2 (2 + x − x2) ´ º¿ µ Ð Ñ ×Ñ Ñ Ò Ö ¸ × ¬Ò ÑÓ× S(x) ÓÑÓ Ð ÒØ ×Ô Ö Ù Ø × Úר Ö Ò ÙÒ Ù×ÕÙ Ü ØÓ× Ù Ò Ó ÙÒ ÔÖÓÔÓÖ ÓÒ x Ð × Ð ×Ø × Ð Ø Ð Ò × Ó Ô ÖØ ¹ ÓÒ ×¸ ÒØÓÒ ×¸ × ÙÒ ´ º¿ µ¸ Ù Ð ÒÓ× Ò Ð ÒØ ×Ô Ö Ù Ø × ÕÙ × Ú × Ø Ö Ò¸ S(x) × ¬Ò ÓÑÓ α(1 + x) S(x) = x s(l/2) + (1 − x) s(l) = x s + (1 − x) s(α(1 + x)) 2 1 α(1 + x) 1 α(1 + x) = x 1+ + + (1 − x) 1 + + M 2×2 M 2 = 1+ 1 α + (2 + x − x2) M 4 ´ º ¼µ Ò Ñ Ó× Ø ÔÓ× Ù×ÕÙ ¸ Ð Ñ Ò ÑÓ ×Ô Ö Ó Ù Ø × Ö Ú × × Ó ÙÖÖ Ù Ò Ó Ð Ø Ð ÒÓ × ÜÔ Ò Ó ´x = 0µ Ó Ù Ò Ó Ð ÜÔ Ò× ÓÒ ÙÔÐ Ó Ð Ø Ñ ÒÓ Ð Ø Ð ´x = 1µº ר ÑÓ Ó¸ Ð × ÓØ × Ò Ö ÓÖ × ×Ø Ò ¬Ò × ÔÓÖ UN = U(0) = α 1 α SN = S(0) = 1 + + M 2 ÆÓØ ÑÓ׸ ÓÑÓ Ö ×Ô Ö Ö× ¸ ÕÙ ×Ø × ×ÓÒ Ð × Ñ ×Ñ × ÓØ × ÕÙ Ô Ö Ð Ò ¹ Ò Ñ ÒØÓ × Ô Ö Ó × Ò ÜÔ Ò× ÓÒ» ÓÒØÖ ÓÒº Ò ÐÓ Ñ ÒØ ¸ Ð Ñ Ü ÑÓ ×Ô Ö Ó Ù Ø × Ö Ú × × Ó ÙÖÖ Ù Ò Ó x = 1/2 =⇒ p = M/2¸ ÔÙ × ´ º¿ µ Ý ´ º ¼µ ×ÓÒ Ñ Ü ÑÓ× Ù Ò Ó x − x2 × Ñ Ü ÑÓº ×ØÓ ÕÙ Ú Ð Ö ÕÙ M/2 Ð ×Ø × Ò × Ó Ô ÖØ ÓÒ × Ò M/2 Ð ×Ø × ÓÒ Ð ×¸ Ñ ÒØÖ × ÕÙ Ö ×Ø Ò M/2 Ð ×Ø × × Ò Ô ÖØ ÓÒ Öº × ÔÙ × 9 UN = U(0) = α 8 1 9 SN = S(0) = 1 + + α M 16 Ð Óר ÐÓ Ð Ö Ó ÙÒ ÐÓ ÜÔ Ò× ÓÒ¸ ר Ø ÖÑ Ò Ó ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ × Ù ÒØ º Proposici´n 5.4 (Larson 1988 [22]) Coste promedio de b´ squeda en una tabla o u hash lineal
  • 469.
    5.1. Manejo decolisiones 443 Ë TÙÒ Ø Ð × Ð Ò Ð ÐÓÒ ØÙ M ÓÒ N Ð Ñ ÒØÓ׺ ÒØÓÒ ×¸ Ð Óר ÔÖÓÑ ¹ Ó Ù×ÕÙ ÐÓ Ð Ö Ó ÙÒ ÐÓ ÜÔ Ò× ÓÒ ×Ø Ø ÖÑ Ò Ó ÔÓÖ UN M = 13 12 α ; ´ º ½µ Ô Ö ÙÒ Ù×ÕÙ ÐÐ Ý (13α + 12)M + 12 SN M = 12M ; ´ º ¾µ Ô Ö ÙÒ Ù×ÕÙ Ü ØÓ× º Demostraci´n o Ð Ö ×ÙÐØ Ó × Ð Ö Ø Ñ ÒØ ÒØ Ö Ö ´ º¿ µ Ý ´ º ¼µ 1 UN M = α 2 (2 + x − x2) x ´ º ¿µ 0 Ý 1 M SN = 1+ 1 α + (2 + x − x2) x M 4 ´º µ 0 × Ô٠׸ Ò ×Ø Ø ÔÓ Ø Ð ¸ Ð ØÓÖ Ö × ÑÔÖ Ô ÖÑ Ò ÓÒר ÒØ Ñ ÒØ ÓØ Ó¸ ÐÓ ÕÙ ÔÓ× Ð Ø ÒÙÒ Ö Ð ÓÖÓÐ Ö Ó × Ù ÒØ º Corolario 5.2 Desempe˜ o de las operaciones en una tabla hash lineal n Ë h(k) : K −→ [0, M − 1] ÙÒ ÙÒ ÓÒ × O(1) ÕÙ ×ØÖ ÙÝ ÙÒ ÓÖÑ Ñ ÒØ ÐÓ× Ð Ñ ÒØÓ× K [0, M − 1]º Ë T ÙÒ Ø Ð × Ð Ò Ð ÐÓÒ ØÙ M ÓÒ N й Ñ ÒØÓ× Ý ØÓÖ Ö αl ≤ alpha ≤ alphaº ÒØÓÒ ×¸ Ð × ÑÔ ÒÓ ×Ô Ö Ó Ð× ÓÔ Ö ÓÒ × Ò× Ö ÓÒ¸ Ù×ÕÙ Ý Ð Ñ Ò ÓÒ × O(1)º Demostraci´n o Ä Ò× Ö ÓÒ Ö ÕÙ Ö ÙÒ Ù×ÕÙ ÐÐ ¸ Ð Ù Ð Ö ÕÙ Ö Ö ÓÖÖ Ö¸ × ÙÒ ´ º ½µ¸ 13 12 αÙ Ø × Ò ÔÖÓÑ Óº ÈÙ ×ØÓ ÕÙ α × ÓÒר ÒØ ¸ ´ º ½µ × ÓÒר ÒØ Ý Ð Ò× Ö ÓÒ × O(1)º ÄÓ Ñ ×ÑÓ Ó ÙÖÖ Ô Ö Ð Ù×ÕÙ ÐÐ º È Ö ÙÒ Ù×ÕÙ Ü ØÓ× × Ö ÓÖÖ Ò¸ × ÙÒ ´ º µ¸ (13α+12)M+12 12M Ù Ø ×¸ ÒØ ÕÙ Ø Ñ Ò × ÓÒר ÒØ ¸ ÔÙ × α × ÓÒר ÒØ º Ä Ù×ÕÙ Ü ØÓ× ×¸ ÔÓÖ Ø ÒØÓ¸ O(1)º Ë Ð Ð Ñ Ò ÓÒ × ÓÑÓ Ð × Ò ÑÓ׸ ÒØÓÒ × ×Ø × O(1) ÓÖÑ Ø ÖÑ Ò ×Ø º Ë × × Ò Ð Ù×ÕÙ ¸ ÒØÓÒ × ×Ø Ö Ø Ö Þ ÔÓÖ Ð Ù×ÕÙ Ü ØÓ× ¸ Ð Ù Ð Ý ÑÓ×ØÖ ÑÓ× × O(1) Ä Ö Ò ÓÒ ×Ø Ø ÔÓ Ø Ð × ÕÙ ÒÓ Ý Ò × ÙØ Ö Ð Ó×¹ ØÓ×Ó Ö Ùר Ô Ö Ñ ÒØ Ò Ö Ð ØÓÖ Ö Ð Ú ÐÓÖ ÕÙ Ó Ö Þ Ð × ÑÔ ÒÓ ×Ô ¹ Ö Ó Ð Ö × Ò Ñ Ñ ÒØ Ùר Ò Ø ÑÔÓ ÓÒר ÒØ º ÁÒ Ô Ò ÒØ Ñ ÒØ Ð ÒØ Ð Ñ ÒØÓ׸ Ð Ö × ÑÔÖ ×Ø Ö ÓØ ݸ ÔÓÖ Ø ÒØÓ¸ Ð × ÑÔ ÒÓ × Ö ÓÒר ÒØ Ñ ÒØ ×Ô Ö Ó º ׸ Ô٠׸ ר Ò ÓÕÙ ÓÒ Ó Ô Ö ØÓ × Ð × × ØÙ ÓÒ × Ò ÕÙ × Ö ÕÙ Ö ÙÒ Ø Ð × ÈÓÖ ×ÙÔÙ ×ØÓ ÕÙ ÒÓ ÔÓÖ Ú Ö × Ö ÞÓÒ ×º Ò ÔÖ Ñ Ö ÐÙ Ö¸ Ù× Ð ÖÖ ÐÓ Ò Ñ Ó¸ ÔÓÖ Ñ × ÕÙ ÒÓ× Ý ÑÓ× × ÓÖÞ Ó Ò ÙÒ Ù ÓÒ ÐØÓ × ÑÔ ÒÓ Ù Ò Ó × Ò ÑÓ× Ð Ø ÔÓ DynArray<T>¸ ר ÖÖ Óר × ÓÒר ÒØ × Ñ ÝÓÖ × ÕÙ Ð Ð ÖÖ ÐÓ ÓÒØ ÙÓ ØÖ ÓÒ Ð ÕÙ ÑÔÐ ÑÓ× ÓÒ Ð Ò Ò Ñ ÒØÓ × Ô Ö Óº × Ô٠׸ Ô Ö × ØÙ ÓÒ × Ò Ð × Ù Ð × × ×Ø Ñ ÓÖÖ Ø Ñ ÒØ Ð Ú ÐÓÖ N¸ Ð ×Ô Ö× ÓÒ Ð Ò Ð × Ð Ò ÓÕÙ Ñ × Ð ÒØÓ ØÓ Ó× ÐÓ× ÕÙ ÑÓ× ×ØÙ Óº Ó ÓØÖÓ ÑÓ Ó¸ × × ×Ø Ò Ô ×Ø Ñ Ö ÓÖÖ Ø Ñ ÒØ N¸ ÙÒ ÓÒ ÙÒ ÖØÓ Ñ Ö Ò Ò ÖØ ÙÑ Ö ¸ ÒØÓÒ × × ÔÖ Ö Ð ÓÔØ Ö Ð ÙÒÓ ÐÓ× Ò ÓÕÙ × ÕÙ Ý
  • 470.
    444 Cap´ ıtulo 5. Tablas hash ÑÓ× ×ØÙ Ó Ò ÙÒ ÓÒ Ð × ÓÒ× Ö ÓÒ × × Ò Ü º½º º º ÄÓ× Ö ÙÑ ÒØÓ× ×ÓÒ × ÑÔÐ × × ÑÔÐ Ý Ñ ÓÖ × ÑÔ ÒÓº ËÙÖ ÒØÓÒ × Ð ÔÖ ÙÒØ Ù Ò Ó ÑÓ× Ù× Ö ×Ô Ö× ÓÒ Ð Ò Ð º À Ý Ó× × Ò Ö¹ Ó× ÙÒ Ñ ÒØ Ð × ½º Ù Ò Ó ÒÓ × ÓÒÓÞ Ð ×Ø Ñ ÓÒ N¸ Ù Ð × Ð × ØÙ ÓÒ Ù Ò Ó × Ñ Ò Ò ÓÒ ÙÒØÓ× Ñ Ò Ö Ò Ö Ðº ¾º Ù Ò Ó¸ ÙÒÕÙ × ÓÒÓÞ ÙÒ ×Ø Ñ ÓÒ Ñ Ü Ñ N¸ ר ­Ù ØÙ Ö Ù ÒØ ¹ Ñ ÒØ ÒØÖ Ú ÐÓÖ × ÜØÖ ÑÓ׺ Ò × ÒØ × ×¸ Ð ×Ô Ö× ÓÒ Ð Ò Ð Ø Ò Ð Ó Ð ÓÒ Ü Ö × ÑÔ ÒÓ ×Ô Ö Ó O(1) ÓÒ ÙÒ ÓÒ×ÙÑÓ Ñ ÑÓÖ ÔÖÓÔÓÖ ÓÒ Ð Ð ÒØ Ð Ñ ÒØÓ× ÕÙ × Ñ Ò Òº × Ö Ð ÓÔ ÓÒ Ù Ò Ó × ØÖ Ø Ò ÓÒ ÙÒØÓ× Ò Ö Ð × ÔÓÖ ÑÔÐÓ¸ ÐÓ× Ñ Ô Ó× Ð Ò Ù × ÓÑÓ python Ó perl Ó Ð ÔÖÓÔÙ ×Ø Ð ×Ø Ò Ö C++ Ñ Ô Ó × ¸ ÐÐ Ñ hash mapº 5.2 Funciones hash ÌÓ Ó× ÐÓ× Ö ×ÙÐØ Ó× Ò Ð Ø Ó× × ÑÔ ÒÓ ×Ó Ö ÐÓ× ×ÕÙ Ñ × Ö ×ÓÐÙ ÓÒ ÓÐ ¹ × ÓÒ × ×ÙÑ Ò ÕÙ h(k) : K −→ [0, M − 1] × O(1) Ý ÕÙ ×Ø ÑÙÐ ÙÒ ×ØÖ Ù ÓÒ ÔÖÓ Ð ÙÒ ÓÖÑ º Ë Ò ×Ø × ÔÖ Ñ × ×¸ Ò Ò ÙÒÓ ÕÙ ÐÐÓ× Ö ×ÙÐØ Ó× × Ú Ö Þº × Ó Ú Ñ ÒØ × Ò Ð¸ ÒØÓÒ ×¸ ÕÙ Ð ÙÒ ÓÒ × ÙÑÔÐ ×ØÓ× Ö ÕÙ × ØÓ׺ È ÖÓ Ý ÑÙ Ó Ñ × ÕÙ ×ØÓ× Ñ ÖÓ× Ö ÕÙ × ØÓ× Ù Ò Ó × × Ò ÙÒ ÙÒ ÓÒ × º 5.2.1 Interfaz a la funci´n hash o Ê ÔÐ ÒØ ÑÓ× h(k) : K −→ [0, M − 1] Ò Ø ÖÑ ÒÓ× ÓÑÔÙØ ÓÒ Ð × Ó Ð × Ù ÒØ Ø ÔÓ¹ ÒØ Ö Þ template <typename Key> size_t hash_fct(const Key & key); Á ÐÑ ÒØ ¸ Ð ÙÒ ÓÒ ØÓÑ ÙÒ Ð Ú Ò Ö Ø ÔÓ Key Ý Ð ØÖ Ò× ÓÖÑ ÙÒ Ò¹ Ø ÖÓ ÒØÖ 0 Ý Ð Ñ × Ö Ò ÒØ ÖÓ ÕÙ ÔÙ Ö ÔÖ × ÒØ Ö× Ò Ð Ø ÔÓ size tº Ê ÓÖ ÑÓ× ÕÙ Ð Ò ÒØÖÓ Ð Ø Ð × Ð ÙÐ Ñ ÒØ (*hash_fct)(key) mod M; Ä Ò ØÙÖ Ð Þ Key ÒÓ Ò × Ö Ñ ÒØ × ÒÙÑ Ö ¸ Ò ÙÝÓ ×Ó ÑÓ× Ò ÓÒ¹ ØÖ Ö ÙÒ ØÖ Ò× ÓÖÑ ÓÒ key Ð Ø ÔÓ size tº × ÕÙ ×Ø Ð ÑÓ× Ð × Ù ÒØ ÔÖÓØÓ ÓÐÓ Ô Ö Ð Ö ×ÙÐØ Ó (*hash fct)(key) ½º Ë Key ÒÓ × ÒÙÑ Ö Ó¸ ÒØÓÒ × ØÖ Ò× ÓÖÑ ÖÐÓ Ð Ø ÔÓ size tº ¾º ×ÙÑ Ò Ó ÕÙ key Ý × Ò Ù ÒØÖ Ò Ð ÓÑ Ò Ó size t ¹ÔÓÖ Ú Ö Ø Ó ÔÓÖ Ð ØÖ Ò× ÓÖÑ ÓÒ ÒØ Ö ÓÖ¹¸ ×Ô Ö× Ö key¸ ÐÓ Ñ × ÕÙ × ÔÙ ¸ Ò ÐÓ ÔÓ× Ð ÓÒ ÑÙÐ ÓÒ Ð ØÓÖ ¸ Ð ÓÑ Ò Ó size tº ר ×Ô Ö× ÓÒ ×¸ Ò × ¸ Ð ØÖ Ò× ÓÖÑ ÓÒº ÈÙ ×ØÓ ÕÙ Ò ALEPH × ÑÔÖ ÙÐÑ Ò ÑÓ× Ð Ø ÖÑ Ò ÓÒ h(k) : K −→ [0, M − 1] ÓÒ Ð ÐÐ Ñ (*hash fct)(key) mod M¸ ר ÓÔ Ö ÓÒ¸ ÓÑÓ Ú Ö ÑÓ× ÔÖÓÒØ ¹ Ñ ÒØ ¸ Ø Ñ Ò ÔÙ × Ö Ô ÖØ Ð ×Ô Ö× ÓÒº
  • 471.
    5.2. Funciones hash 445 5.2.2 Holgura de dispersi´n o Ð Ñ ÝÓÖ ÒØ ÖÓ ÔÓ× Ð ×Ø ×ÙÔ Ø Ó Ð Ñ ÝÓÖ Ú ÐÓÖ ÕÙ × ÔÙ Ö ÔÖ × ÒØ Ö ÓÒ Ð Ø ÔÓ size tº Ð ÒØ ÔÓ× Ð ×Ø ÒØÓ× Ú ÐÓÖ × ÕÙ ÔÙ ÖÖÓ Ö h(k) : K −→ [0, M − 1] × Ð ÒÓÑ Ò ÓÐ ÙÖ ×Ô Ö× ÓÒ Ñ ÒØÖ × Ñ ÝÓÖ × Ð ÒØ ÒÙÑ ÖÓ× ×¹ Ø ÒØÓ× ÕÙ ÔÙ Ò Ö Ö Ð ÙÒ ÓÒ × ¸ Ñ ÝÓÖ × ×Ù ÓÐ ÙÖ ×Ô Ö× ÓÒº × Ô٠׸ Ò ÒÙ ×ØÖÓ ÓÒØ ÜØÓ¸ ÙÒ Ö ÕÙ Ö Ñ ÒØÓ Ð ÙÒ ÓÒ × × Ø Ò Ö Ð Ñ ÝÓÖ ÓÐ ÙÖ ×Ô Ö× ÓÒ ÔÓ× Ð º Ò ÔÖÓ Ö Ñ ÓÒ¸ Ð ¬Ò Ù ÒØ ׸ ØÓ Ó Ø ÔÓ ØÓ ÔÙ Ö ÔÖ × ÒØ Ö× ÓÑÓ ÙÒ × ÙÒ Ø×º Ù ÐÕÙ Ö × Ð Ò ÓÐ Ð ÓÑ Ò Ó K¸ ∀ki, kj ∈ K, ki = kj =⇒ ki Ý kj Ø Ò Ö Ò × Ù Ò × Ø× ר ÒØ ׺ Ò ×Ø × ÒØ Ó¸ × ×Ø ÒØ × Ð ÕÙ h(k) : K −→ [0, M − 1] ÓÒ× Ö todos¸ ÐÓ× Ø× ÙÒ Ð Ú ¸ ÔÙ × ×Ø Ñ Ò Ö × Ð Ø Ñ ÓÖ Ð Ö Ô ÖØ Ö K Ò Ð ×Ô ØÖÓ size t ݸ ÔÓÖ Ø ÒØÓ¸ × ÙÑ ÒØ Ð Ô ×Ô Ö× ÓÒº È ÖÓ ÒÓ ×Ø ÓÒ ÓÒ× Ö Ö ØÓ Ó× ÐÓ× Ø×º È Ö ÓÑÔÖ Ò Ö ÐÐÓ¸ Ü Ñ Ò ÑÓ× ÙÒ Ø Ô × ØÙ ÓÒ Ð ÑÙÒ Ó Ö Ð ÔÖÓ Ö Ñ ÓÒº ÓÒ× Ö ÑÓ× ÓÑÓ Ð Ú × × ÑÔÐ × Ò× Ö Ø Ö × ´char*µ Ý h(k) ÓÑÓ Ð ×ÙÑ ÐÓ× Ö Ø Ö × Ð Ò º h(k) Ò Ò Ð Ö Ò Ó [0, n−1 si]º Ë size t ר i=0 Ö ÔÖ × ÒØ Ó ÓÒ 32 Ø×¸ Ð Ú ÐÓÖ Ñ Ü ÑÓ Ö ÔÖ × ÒØ Ö ÓÒ size t × 232 = 4294967296 i=0 siº Ë Ø Ò ÑÓ× Ð Ú × Ð Ø × ÙÝ ÐÓÒ ØÙ × 30 Ö Ø Ö ×¸ ÒØÓÒ × ÓÒ n−1 Ú ÐÓÖ × Ö Ø Ö × ÒØÖ [65, 90] ∪ [61, 122]½¿ ¸ Ð Ö Ò Ó h(k) × [61 × 30, 122 × 30] = [1950, 3660] ×ØÓ ÑÔÐ ÕÙ ÑÓ× Ð Ó 232 −3660+1950 Ú ÐÓÖ × ÔÓ× Ð × ÕÙ ÔÓ Ö ØÓÑ Ö h(k) Ö ÔÖ × ÒØ Ó ÓÒ size t × M > 1710¸ ÒØÓÒ ×¸ ÓÒ ÖØ ØÙ ¸ M − 1710 ÒØÖ × Ñ × × Ö Ò × Ý Ù ÐÕÙ Ö × Ð Ø Ò ÕÙ Ð ÓÒ Ð × ÓÐ × ÓÒ × ÓÑÔÐ Ø Ñ ÒØ Ú Ò º ÍÒ Ø Ð × ÓÒ × ÙÒ ÓÒ ÔÙ ÐÐ Ñ Ö× ÙÒ Ø Ð Ñ × º 5.2.3 Plegado o doblado de clave ÓÒ× Ö Ö ØÓ Ó× ÐÓ× Ø× ÙÒ Ð Ú ×Ø ×ÙÔ Ø Ó Ð Ø Ñ ÒÓ Ð Ø ÔÓ size t ½ ¸ Ð Ù Ð ×Ø Ø ÖÑ Ò Ó ÔÓÖ Ð × Ö Ø Ö ×Ø × Ö Û Ö Ý Ð ÓÑÔ Ð ÓÖº Ì Ñ Ò¸ × ØÙ ÑÓ× ÓÔ Ö ÓÒ × Ö ØÑ Ø × ÓÑÓ Ð ÑÔÐ ¬ Ò Ð ×Ù ¹× ÓÒ ÔÖ ÒØ ¸ ÔÓ ÑÓ× Ø Ò Ö ÙÒ × ÓÖ º Ð Ø Ò ØÖ ÓÒ Ð Ô Ö ÓÒ ÖÓÒØ Ö ×Ø ÔÖÓ Ð Ñ × Ð ÓÒÓ Ó Ð Ô ÖØ Ô Ó ÔÐ Ó Ó Ó Ð Ó º ÈÐ Ö ÙÒ Ð Ú ÓÒ× ×Ø Ò × ÓÒ ÖÐ Ò Ô ÞÓ× Ñ × Ô ÕÙ ÒÓ× Ý ÓÑ Ò ÖÐÓ× ÓÒ ×ÙÑ ×¸ Ó ×½ Ü ÐÙ× ÚÓ× Ó ×ÔÐ Þ Ñ ÒØÓ׺ ÍÒ Ð Ú n ÝØ × ÔÐ Ö× Ò sizeof(size t) ÝØ ׺ Ë ÙÒ Ð Ò ÓÐ Ð Ð Ú ÔÓ ÑÓ× × Ð ÓÒ Ö Ô ÞÓ× ¸ ÔÓÖ ÑÔÐÓ¸ n/sizeof(size t) Ò ÙÒ ÓÖ Ò × Ó Ó Ô Ö Ú Ö Ð ÙÒ Ô ÖØ ÙÐ Ö × × Óº ÈÓÖ ÑÔÐÓ¸ × Ø Ò ÑÓ× ÙÒ Ð Ú ¾¼ ÝØ ׸ Ý sizeof(size t) == 4¸ ÒØÓÒ × ÔÓ ÑÓ× ÓÒ× Ö Ö Ð × Ò Ð × Ñ × × Ò ¬ Ø Ú × ÐÓ× ÝØ × ÒØÖ Ð × ÈÐ Ó ÙÒ Ò Ý Ò ÝØ × ≡ char buf[sizeof(size_t)]; char * ptr = (char*) key + 6; // comienzo del centro en 20 bytes for (int i = 0; i < 4; ++i) { ½¿ רÓ× ×ÓÒ ÐÓ× Ú ÐÓÖ × Ë ÁÁ Ô Ö ÐÓ× × Ñ ÓÐÓ× Ð Ø ÒÓ× ÒÓ ÒØÙ Ó׺ ½ Ç Ð Ø ÔÓ ÕÙ × ÙØ Ð ÓÑÓ Ö Ò Ó × ÙÒ × Ð ×Óº ½ Ó × × Ð ÔÐÙÖ Ð Þ ÓÒ Óº
  • 472.
    446 Cap´ ıtulo 5. Tablas hash buf[i] = (ptr[0]>>4) | (ptr[1]>>4); ptr += 2; } Ò ÔÓ× ÙÒ Ù Ò ×Ô Ö× ÓÒ¸ Ò Ð × ÒÓ ÙÒ Ù Ò ÔÐ Ó × ÓÒÚ Ò ÒØ Ò Ö Ð ÞÓÒ Ð Ð Ú Ò Ð Ù Ð × ÔÖ × ÒØ Ñ × Ú Ö× ¸ ÔÙ × × × Ð ÞÓÒ ÓÒ Ñ ÝÓÖ ÔÓØ Ò Ð Ô Ö ÑÙÐ Ö Ð × Ð ØÓÖ º Ë Ñ ØÖ Ñ ÒØ ¸ Ð × ÞÓÒ × ÓÒ Ñ ÒÓÖ Ú Ö ×ÓÒ Ñ × Ù× ÒØ × Ö Ô Ø Ò ×º 5.2.4 Heur´ ısticas de dispersi´n o Ò × ÒØ × ×¸ Ô Ö Ð ÙÐ Ö h(k) : K −→ [0, M − 1] Ø Ò ÑÓ× ÐÓ× × Ù ÒØ × Ö ÕÙ Ö Ñ ÒØÓ× ½º ÉÙ × ÑÙÝ Ö Ô ¸ ÒÓ ×ÓÐÓ O(1)¸ × ÒÓ ÕÙ ×Ù Ø ÑÔÓ ÓÒר ÒØ × Óº ¾º ÉÙ Ø Ò ×Ù¬ ÒØ ÓÐ ÙÖ ×Ô Ö× ÓÒº ¿º ÉÙ ÐÓ× Ö ×ÙÐØ Ó× Ö Ø Ö Ò ÙÒ ×ØÖ Ù ÓÒ ÔÖÓ Ð ÙÒ ÓÖÑ º רÓ× ØÖ × Ö ÕÙ Ö Ñ ÒØÓ׸ Ð Ñ × Ð × Ð Ø Ö ÖÓ¸ ÔÙ × Ð × Ð ÓÒ × ÔÖ Ò × Ò Ð Ò Ö ÓÒ ÒÙÑ ÖÓ× Ð ØÓÖ Ó× ½ Ò Ò ÕÙ × ÖØÓ Ð¸ ÔÓÖ ÒÓ Ö ÑÔÓ× Ð ¸ Ò Ö Ö ÒÙÑ ÖÓ× Ð ØÓÖ Ó× Ô ÖØ Ö ØÓ× ÕÙ ÒÓ ÐÓ× ×ÓÒ ½ º Æ ¸ ר Ð ÔÖ × ÒØ ¸ × Ù ÖØÓ ÙÒ Ø Ò ×Ô Ö× ÓÒ Ò Ö Ð ÕÙ ÑÙÐ ÙÒ ×ØÖ Ù ÓÒ ÙÒ ÓÖÑ ¸ Ô ÖÓ × × ÓÒÓ Ò Ü Ð ÒØ × ÙÖ ×Ø × ÕÙ ¸ ÓÔ Ö × ×Ó Ö ÙÒ Ö ÔÖ × ÒØ ÓÒ ÒÙÑ Ö ¸ ÑÙÐ Ò Ð Ð ØÓÖ º 5.2.4.1 Dispersi´n por divisi´n o o Ð Ñ ØÓ Ó ×Ô Ö× ÓÒ Ñ × ÔÓÔÙÐ Ö × Ùר Ñ ÒØ Ð ÕÙ ÑÓ× ÑÔÐ Ó ØÖ Ú × ØÓ Ó× ÐÓ× Ø ÔÓ× × ÖÖÓÐÐ Ó× h(k) = k ÑÓ M ´º µ È ÖÓ Ò ×Ø Ø ÔÓ ÙÒ ÓÒ × Ö Ø Ð × Ð ÓÒ Ð Ú ×ÓÖ Ó × ¸ Ð Ú ÐÓÖ M¸ Р٠и Ñ ÒÙ Ó¸ × Ð ÔÖÓÔ Ó Ø Ñ ÒÓ Ð Ø Ð ½ º Ë ÑÓ× ÕÙ Ù ÐÕÙ Ö ÒØ ÖÓ k n ØÓ× ÔÙ ÜÔÖ × Ö× ÓÑÓ n−1 k= di × b i ; i=0 ÓÒ di × ÙÒ ØÓ Ý b × Ð × Ð × ×Ø Ñ ÒÙÑ Ö Óº Ò ×Ø × ÒØ Ó¸ Ð Ú × ÓÒ ÒØ Ö k/M ÔÙ ÜÔÖ × Ö× ÓÑÓ n−1 i=0 di × bi k M = M . ´º µ ½ Ò ÔÖÓ Ö Ñ ÓÒ¸ Ö ÑÔÓ× Ð × ÑÙÝ Ù ÖØ ¸ ÔÙ × ÐÓ Ú ÖØÙ Ð ×Ô Ó Ô Ö ÑÙ Ó ÔÓ× Ð º ½ Ò ÐÓ ÕÙ × Ù ¸ ÑÓ× ×Ø Ö Ô Ò ÒØ × Ð Ó ÕÙ M ÒÓ Ò × Ö Ñ ÒØ × Ð Ø Ñ ÒÓ Ð Ø Ðº
  • 473.
    5.2. Funciones hash 447 Ð Ö ×ØÓ Ð Ú × ÓÒ¸ k ÑÓ M¸ ÔÙ ÒØ ÖÔÖ Ø Ö× ÓÑÓ k ÑÓ M = k − k k/M ÐÓ Ù Ð¸ × ÙÒ ´ º µ¸ ÔÙ ÜÔÖ × Ö× ÓÑÓ n−1 i=0 di × bi k ÑÓ M = k − M n−1 n−1 i=0 di × bi = di × b i − M . ´º µ i=0 ר ÜÔÖ × ÓÒ ÒÓ× Ô ÖÑ Ø Ú Ö ÕÙ ÐÓ× ×ÙÑ Ò Ó× Ñ ÒÓ× × Ò ¬ Ø ÚÓ׸ ÕÙ ÐÐÓ× Ø Ð × ÕÙ di × ni < M¸× ÑÔÖ ÓÒ ÓÖÑ Ò Ô ÖØ k ÑÓ M¸ ÔÙ × ×ØÓ× ÒÓ ×ÓÒ¸ Ò Ø ÖÑ ÒÓ× Ð Ø¹ Ö Ð ×¸ ÒØ Ö Ñ ÒØ Ú × Ð × ÔÓÖ Mº × Ô٠׸ ´ º µ ÔÙ ÜÔÖ × Ö× Ö ÙÖ× Ú Ñ ÒØ ÓÑÓ k ÑÓ M = di × bi + di × bi ÑÓ M ∀i|di ×bi <M ∀i|di ×bi ≥M di × bi = di × bi + ÑÓ M ÑÓ M; ´ º µ M ∀i|di ×bi <M ∀i|di ×bi ≥M ÁÒ Ú × Ð Ê ×ØÓ Ö ×ØÓ× Ó × ¸ ØÓ Ó× ÐÓ× ×ÙÑ Ò Ó× k ÕÙ ÒÓ ×ÓÒ ÒØ Ö Ñ ÒØ Ú × Ð × ÔÓÖ M Ñ × Ð Ö ×ØÓ Ð ×ÙÑ ÐÓ× Ö ×ØÓ×½ º Ð ÔÖ Ñ Ö ×ÙÑ Ò Ó ´ º µ ÐÓ ÐÐ Ñ Ö ÑÓ× ÐÓ Ò Ú × Ð Ý Ð × ÙÒ Ó Ð Ö ×ØÓ Ö ×ØÓ× º ר ÒØ ÖÔÖ Ø ÓÒ Ð Ö ×ØÓ ÒÓ× Ð Ø ÔÖ Ò Ö Ð ØÖ × Ò Ò ÕÙ Ø Ò Ð ¹ Ù × Ð ÓÒ Ð Ú ×ÓÖ M ×Ó Ö Ð ÓÒ× Ö ÓÒ ØÓ× Ð × Ù Ò ÕÙ ÜÔÖ × kº ´ º µ × ÔÙ Ú Ö ÕÙ ÐÓ× ÙÒ Ó× ØÓ× ÕÙ × ÓÒØ Ð Þ Ö Ò ÓÒ × ÙÖ ×ÓÒ ÐÓ× Ð ÓÑÔÓÒ ÒØ Ò Ú × Ð º Ð Ö ×ØÓ Ö ×ØÓ× Ô Ò Ð ÑÙÐØ ÔÐ Ö ×Ô ØÓ Mº Ë ÙÒ × Ð Ú ÐÓÖ M¸ Ð ÓÔ Ö ÓÒ ÑÓ ÙÐÓ ØÓÑ Ö Ò Ù ÒØ Ó ÒÓ Ð ÙÒÓ× ØÓ× kº ÍÒ ÑÔÐÓ ÔÙ ÝÙ Ö ÕÙ ÐÐÓ× ÕÙ ÙÒ ÒÓ ÐÓ Ò Ö Ð Þ Óº Ë Ø Ò ÑÓ× M = 100 Ý × Ñ Ð¸ ÒØÓÒ × Ð Ö ×ØÓ ×ÓÐÓ ×Ø Ø ÖÑ Ò Ó ÔÓÖ ÐÓ Ò Ú × Ð ¸ ÔÙ × ÐÓ× Ö ×ØÓ× Ö ×Ø ÒØ × ×ÓÒ ÒÙÐÓ× Ý ÓÒ ÐÐÓ× Ð Ö ×ØÓ Ö ×ØÓ׺ ÓÒ M = bw ÒÓ ÑÔÓÖØ Ù Ð × Ð Ú ÐÓÖ k¸ Ð Ö ×ØÓ ×ÓÐÓ ÓÒ× Ö ÐÓ× w ÙÐØ ÑÓ× ØÓ× kº Ë ¸ ÔÓÖ ÑÔÐÓ¸ ÐÓ× ÙÐØ ÑÓ× ØÓ× k ר Ò × × Ó× ×Ø Ö ÒØÖ 20 Ý 30 Ý M = 100¸ ÒØÓÒ × h(k) ר Ö × × Ó × Ö Ò Ó ÐÓ ÕÙ ÖÖÙÑ ØÓ × Ð × ÜÔ Ø Ø Ú × × ÑÔ ÒÓ¸ ÔÙ × h(k) ר Ö ÑÙ Ó × Ö Ð ØÓÖ º Ì ÑÔÓ Ó ×Ø M = 2w¸ ÔÙ × ÔÙ Ö Ü ×Ø Ö Ð ÙÒ Ô ØÖÓÒ ÑÙÐØ ÔÐ Ò ÐÓ× ×ÙÑ Ò Ó× di × biº ÈÓÖ ÑÔÐÓ¸ 75312 ÑÓ 150 = 12 = 75312 ÑÓ 100 Ù Ò Ó Ñ Ö ÑÓ× ÕÙ 150 = 10 × 5 × 3¸ ÒÓ ×ÓÐÓ Ú ÑÓ× ÙÒ ÑÙÐØ ÔÐ ÓÑÓ Ô Ö Ù Ò Ó M = 100¸ × ÒÓ ÕÙ ¸ ÓÑÓ ×ÙÑ Ò Ó Ð Ö ×ØÓ Ö ×ØÓ× × ÑÙÐØ ÔÐÓ 5 Ð Ò Ò ÙÒ ØÓ × ×Ù ÑÙÐØ ÔÐ ÔÓÖ 3 Ò Ø ÖÑ ÒÓ× Ñ × × ÑÔР׸ ØÓ Ø Ò ÔÖÓ Ð 1/3 ÒÓ × Ö ÓÒ× Ö Óº Ò Ò ÙÖ ¸ Ð ×ÙÑ Ö ×ØÓ× Ø Ñ Ò Ø Ò Ù Ò ÔÖÓ Ð × Ö ÑÙÐØ ÔÐÓ ØÖ ׺ ½ × ÒÓØ Ö ÕÙ ! n−1 k ÑÓ M= (di × b ) ÑÓ M i ÑÓ M ; i=0 Ó × ¸ Ð Ö ×ØÓ × ÔÙ ¬Ò Ö¸ × ÑÔÐ Ñ ÒØ ¸ ÓÑÓ Ð Ö ×ØÓ ÐÓ× Ö ×ØÓ׺ × ÖÖÓÐÐ ÑÓ× Ð Ö ÔÖ × ÒØ ÓÒ × ÙÒ k ÑÓ M = k − k/M ÔÓÖÕÙ ÓÒ× Ö ÑÓ× ÕÙ Ô ÖÑ Ø ÔÖ Ò Ö Ñ ÓÖº
  • 474.
    448 Cap´ ıtulo 5. Tablas hash Ä × ÓÒ× Ö ÓÒ × ×Ó Ö Ð ÑÙÐØ ÔÐ ÕÙ ÑÓ× Ö Ð Þ Ó ×ÓÒ Ú Ð × Ô Ö Ù ÐÕÙ Ö × ÒÙÑ Ö Ò Ô ÖØ ÙÐ Ö Ð Ò Ö º Ù Ò Ó × Ð ÓÒ ÑÓ× Ð Ñ ØÓ Ó Ú × ÓÒ ÓÑÓ ÙÒ ÓÒ × ¸ ÑÓ× ×Ø Ö ×ÙÑ ¹ Ñ ÒØ Ô Ò ÒØ × ×Ø ÑÙÐØ ÔÐ ¸ ÔÙ × Ð Þ Ö ÔÙ Ù ÖÒÓ× Ò ÓÒØÖ º Ë ÒÓ ×ÔÓÒ ÑÓ× Ø ÑÔÓ Ó Ò ÑÓ Ô Ö ×ØÙ Ö Ð ÑÙÐØ ÔÐ ¸ ÒØÓÒ × ÔÓ ÑÓ× × Ð ¹ ÓÒ Ö M ÓÑÓ ÙÒ ÒÙÑ ÖÓ ÔÖ ÑÓ¸ ÐÓ ÕÙ × ÙÖ ÕÙ Ò Ò ÙÒÓ ÐÓ× ×ÙÑ Ò Ó× k Ø Ò Ð ÙÒ Ö Ð ÓÒ ÑÙÐØ ÔÐ º Ð Ñ ØÓ Ó Ú × ÓÒ ÙÒ Ó ÙÒ × Ð ÓÒ M¸ ÓÑÓ Ú ×ÓÖ Ý Ð Ú Þ ÓÑÓ Ø Ñ ÒÓ Ð Ø Ð ¸ × Ð Ñ ØÓ Ó ×Ô Ö× ÓÒ Ñ × ÔÓÔÙÐ Öº Ð Ò ÓÕÙ ALEPH ÓÒÐÐ Ú Ö Ø Ñ ÒØ ר Ñ ØÓ Ó¸ ÙÒÕÙ ÒÓ Ð × Ð ÓÒ M ÓÑÓ ÔÖ ÑÓ¸ Ù Ð × Ð Ð Ù×Ù Ö Ó Ð Ì º Ò × ¸ ר Ñ ØÓ Ó × ×Ø ÒØ × Ò ÐÐÓ Ý Ö Ô Ó¸ Ô ÖÓ ÒÓ × Ù ØÓ × Ð × Ö ÙÒר Ò × ÔÓÖ ÑÔÐÓ¸ × ÐÓ Ù× ÑÓ× Ö Ø Ñ ÒØ ¸ ÒÓ × ÑÔÖ × Ð¸ Ò ÙÒ ÓÒ Ø Ñ ÒÓ ÓÖ Ò Ð Ó Ð Ö Ùר ¸ × ÙÖ Ö ÕÙ M × ÔÖ ÑÓº 5.2.4.2 Dispersi´n por multiplicaci´n o o ר Ñ ØÓ Ó Ø Ò Ð Ú ÒØ ÕÙ ÔÙ ÔØ Ö× Ô Ö Ù ÐÕÙ Ö Ø Ñ ÒÓ Ø Ðº Definici´n 5.2 (Fraccional de un n´mero real) Ë o u x ÙÒ ÒÙÑ ÖÓ Ö Ð ÔÓ× Ø ÚÓ¸ Ð Ö ÓÒ Ð x¸ ÒÓØ Ó ÓÑÓ {x}¸ × Ð Ô ÖØ Ö ÓÒ Ð xº ÈÓÖ ÑÔÐÓ¸ {1, 6252345} = 0, 6252345º Ð Ñ ØÓ Ó ÑÙÐØ ÔÐ ÓÒ ¬Ò ÙÒ ÙÒ ÓÒ × Ð × Ù ÒØ ÑÓ Ó h(k) = {k θ} M ; ´º µ ÓÒ θ × ÙÒ ØÓÖ ÑÙÐØ ÔÐ ÓÒº ÙÐ × Ö Ð Ú ÐÓÖ Ð ØÓÖ θ º Ë × ÑÓ× ÑÙÐ Ö Ð Ð ØÓÖ ¸ ÒØÓÒ × ×Ù Ò ÓÒ × ÒØ Ó Ö ÕÙ Ô Ö ÚÓÖ ÖÐ Ð × Ó Ò × Ö Ð Ó ÖÖ ÓÒ Ðº ÈÙ × Ò¸ Ö ×ÙÐØ ÕÙ Ð Ñ Ø Ñ Ø ÒÓ× × Ù Ö ÙÒ Ð × Ò¬Ò Ø ÒÙÑ ÖÓ× ÐÐ Ñ Ó× ÖÖ ÓÒ Ð × Ò Ð × ÒØ Ó ÕÙ ÒÓ ÔÙ Ò ÜÔÖ × Ö× ÓÑÓ ÙÒ Ö ÞÓÒ ´ Ö ÓÒµ ݸ Ý × Ð × ÓÒ× Ö ÓÒ × ×Ó Ö Ð ÑÙÐØ ÔÐ M Ò Ð ×Ù ¹× ÓÒ ÒØ Ö ÓÖ¸ × ÑÓ× ÕÙ Ð × Ö ÞÓÒ × ´ Ö ÓÒ ×µ Ø Ò Ò × × Ö Ð × Ð Ú ×º Proposici´n 5.5 (Tur´n-1958) ½ o a Ë θ ÙÒ ÒÙÑ ÖÓ ÖÖ ÓÒ Ð Ý n ÙÒ ÒØ ÖÓ ÔÓ× Ø ÚÓº ÒØÓÒ × ÐÓ× n + 1 Ö ÓÒ Ð × {θ}, {2θ}, {3θ}, . . . , {nθ} Ø Ò Ò ÐÓ ×ÙÑÓ ØÖ × ÐÓÒ ØÙ × ×Ø ÒØ × Ý Ð ÔÖÓÜ ÑÓ Ö ÓÒ Ð {(n + 1)θ} × Ð Ò ÙÒ Ð × Ñ ÝÓÖ × ÐÓÒ ØÙ ׺ Demostraci´n o Î × ÃÒÙØ ½ Ð ÓÒÓ Ñ ÒØÓ ÕÙ ÒÓ× ÔÓÖØ ר Ø ÓÖ Ñ × ØÖ Ù Ò Ð × Ù ÒØ × Ó × ÖÚ ÓÒ × ½º {kθ} Ý {(k + 1)θ} ÔÙ Ò ×Ø Ö × Ô Ö Ó× ÔÓÖ ØÖ × ×Ø Ò × ÔÓ× Ð × Ý¸ ¾º {kθ} Ý {(k + 1)θ} ר Ò Ò ÒØÖ × ÒØÖ Ð × Ó× Ñ ÝÓÖ × ÐÓÒ ØÙ ׺ ר × Ô Ö ÓÒ × ÐÓ ÕÙ ÑÙÐ Ð Ð ØÓÖ º ½ Ø Ó ÔÓÖ ÃÒÙØ ½ º
  • 475.
    5.2. Funciones hash 449 ½ 3 3 ¼º 3 3 ¼º 3 3 ¼º 3 3 ¼º 3 3 {ϕk} ^ ¼º 3 3 ¼º 3 3 3 ¼º¿ 3 3 ¼º¾ 3 3 ¼º½ 3 3 ¼3 ¼ ½ ¾ ¿ ½¼ ½½ ½¾ ½¿ ½ ½ ½ ½ ½ ½ ¾¼ ¾½ ÙÖ º Î ÐÓÖ × Ð Ö ÓÒ Ð {kϕ} ^ ÃÒÙØ ½ ×Ù Ö ÕÙ √ −1 5−1 θ=ϕ=ϕ ^ = , 2 × ÙÒ Ù Ò × Ð ÓÒ Ò ÑÙ Ó× ×Ó× Ý ÒÓÑ Ò ×Ø ×Ô Ö× ÓÒ ÓÒ º È ÖÓ¸ ÔÓÖ ÕÙ × Ù ÒÓ ×Ø ÒÙÑ ÖÓ ϕ × Ð Ö ÔÖÓ Ó ÐÓ ÕÙ × ÓÒÓ ÓÑÓ Ð ^ ÔÖÓÔÓÖ ÓÒ ÙÖ Ó Ð Ö Ó Ú ÒÓ ¸ Ô٠׸ × Ø ÑÔÓ× ÒÑ ÑÓÖ Ð ×¸ × ÕÙ × Ð ÔÖÓÔÓÖ ÓÒ ÓÒ ÕÙ ÐÓ× Ó× × ÓÖ ÖÓÒ Ð ÑÙÒ Ó¾¼ º Ä ÔÖÓÔÓÖ ÓÒ ϕ¸ ÕÙ ¸ ÓÑÓ Ú ÑÓ׸ × ÖÖ ÓÒ Ð¸ ÐÓ ÕÙ Ò Ö ¸ ÕÙ Þ ¸ ×ÙÑ Ò Ó ÙÒ Ó× Ö ÓÒ Ð¸ ÕÙ Ý Ð Ó ÖÖ ÓÒ Ð Ò ÐÓ Ú ÒÓ¸ ÒÓ ×ÓÐÓ × Ù Ù Ò Ð Ò ØÙÖ Ð Þ ¸ × ÒÓ ÕÙ ÓÑÔÖÓ Ó × Ö ×Ø ÒØ Ù Ò Ò ÙÒ ÑÔÐ Ñ ÓÑ Ò Ó× ÑÙ× ¸ ÖÕÙ Ø ØÙÖ ¸ Ò Ò Ö ×¸ Ø Ø Ö º Î Ð Ð Ô Ò ÓÒר Ø Ö Ð ×ØÖ Ù ÓÒ ÑÙÐØ ÔÐ Ø Ú ¸ ÓÒ ÙÒÓ× ÔÓ Ó× Ú ÐÓÖ × k¸ ØÖ Ú × Ó × ÖÚ ÓÒ Ð Ö ¬ º ¸ Ð Ù Ð ÓÒר Ø ÑÓ× ÕÙ Ð Ú × × Ù Ò Ð × ×Ø Ò Ò Ð ×Ô Ö× ÓÒ ÔÓÖ ÑÔÐÓ¸ h(5) = 0 Ý h(6) = 4¸ Ô ÖÓ¸ Ñ ×¸ Ð Ô Ö Ò Ð ÔÖÓÔ Ö ¬ Ò ÔÙ Ö × Ö Ð ÙÒ ×ØÖ Ù ÓÒ ÙÒ ÓÖÑ º Ú ÑÓ׸ Ô٠׸ ÕÙ Ð ×Ô Ö× ÓÒ ÔÓÖ ÑÙÐØ ÔÐ ÓÒ Ö Ô ÖØ ÐÓ× ÔÖÓ Ù ØÓ× ÓÒ ×Ù¬¹ ÒØ ר Ò ¸ ÐÓ× ÒØ Ö Ð × Ò Ð ÙÒ ÓÖ Ò Ô Ö ÒØ Ý × Ò Ô Ò ÒØ Ð Ú ÐÓÖ Mº Ò Ò ÙÖ ¸ ר Ñ ØÓ Ó Ø Ò Ð Ú ÒØ Ø Ò Ö × Ö Ñ × Ö Ô Ó ÕÙ Ð Ú × ÓÒ¸ ÔÙ × × Ñ × Ö Ô Ó ÑÙÐØ ÔÐ Ö ÕÙ Ú Öº À ݸ Ñ ×¸ ÙÒ ØÖÙ Ó Ô Ö ÑÙÐØ ÔÐ Ö Ö Ô Ñ ÒØ ¸ ÕÙ ÒÓ× ÓÖÖ Ð Óר Ô Ð Ö Ð Ö ØÑ Ø Ò ÔÙÒØÓ ­ÓØ ÒØ º Ë w Ð ÐÓÒ ØÙ Ð Ð Ú Ò Ø× Ý × Ó ÑÓ× M = 2zº × Ö × ÐØ Ö¸ Ò ÔÖ Ñ Ö ÐÙ Ö¸ ÓÑÓ M = 2z¸ h(k) ÔÙ Ö ÔÖ × ÒØ Ö× ÓÒ z Ø×º Ë σ = kθ Ö ÔÖ × ÒØ Ó Ò w Ø×º Ð ÔÖÓ Ù ØÓ ÒØ ÖÓ kσ ¹ÒÓ Ò ÔÙÒØÓ ­ÓØ ÒØ ¹ Ø Ò ÙÒ ÐÓÒ ØÙ 2w Ø× Ú Ò Ó× Ô Ð Ö × w Ø× p0 Ý p1 Ø Ð × ÕÙ kσ = p1 kθ + p0{kθ}º È ØÓÖ Ñ ÒØ ¸ ÔÓ ÑÓ× Ñ Ö Ö Ð ×ÙÒØÓ Ð × Ù ÒØ Ñ Ò Ö ¾¼ Ò Ü º º¾º¾ ´Ô Ò ½½µ × ÜÔÐ ÙÒ ÔÓ Ó Ñ × Ð Ð ÙÐÓ ×Ø ÒÙÑ ÖÓ Ý ×Ù Ö Ð ÓÒ ÓÒ ÐÓ× ÒÙÑ ÖÓ× ÓÒ º Ò Ü º ´Ô Ò µ × Ö Ð Þ Ò Ð ÙÒ × Ö Ö Ò × ×ØÓÖ × Ð Ù×Ó ×Ø ÔÖÓÔÓÖ ÓÒº
  • 476.
    450 Cap´ ıtulo 5. Tablas hash w bits k 1 × σ = θ2w p1 = kθ h(k) p0 = {kθ} , z bits ר ÑÓ Ó¸ ÐÓ× z Ø× Ñ × × Ò ¬ Ø ÚÓ× p0 Ö ÔÖ × ÒØ Ò Ð Ú ÐÓÖ h(k) h(k) × Ó Ø Ò ÓÒ ×ÔÐ Þ Ö z Ø× Ð ÞÕÙ Ö p0 Ó ÓÒ ÙÒ and Ö ØÑ Ø Ó ÒØÖ p0 Ý Ð Ô Ð Ö ÓÒ ÓÖÑ 11 . . . 1 00 . . . 0 º Ò Ö Ò Ó× Ò ÙÖ ¸ × ÒÓ× × ÙÖ ÑÓ× ÕÙ z Ú × w−z Ú × σ × ÑÔ Ö¸ ÒØÓÒ × ×Ø Ñ ØÓ Ó Ö ÒØ Þ ÕÙ Ð Ô Ð Ö p0 × ×ØÖ ÙÝ ÙÒ ÓÖÑ Ñ ÒØ Ø Ð ÓÑÓ ÐÓ Ú Ò Ð × Ù ÒØ Ø ÓÖ Ñ Proposici´n 5.6 (Lewis-Denemberg 1991 [23]) ´Aleatoriedad de {kθ}) o Ë σ = θ2z Ø Ð ÕÙ σ × ÑÔ Öº Ë K Ð ÓÒ ÙÒØÓ Ð Ú ×¸ Ð Ù Ð ×Ø Ö ÔÖ × ÒØ Ó ÓÒ Ô Ð Ö × w Ø×º Ë kσ = p1 kθ + p0{kθ} | k ∈ Kº ÒØÓÒ ×¸ Ô Ö Ù ÐÕÙ ÖÔÖ Ð Ú × ×Ø ÒØ × k1, k2 ∈ K σk1 ÑÓ 2w = σk2 ÑÓ 2w ´ º ¼µ Ó ÓØÖÓ ÑÓ Ó¸ × ÙÒ Ð ¬ ÙÖ ÒØ Ö ÓÖ k1θ , {k1θ} = k2θ , {k2θ} . ´ º ½µ p1 p0 p1 p0 Ä ÔÖÓÔÓ× ÓÒ × ÕÙ Ú Ð ÒØ ÒÙÒ Ö ÕÙ Ô Ö Ð × Ô Ð Ö × Ñ ÒÓ× × Ò ¬ Ø Ú × {k1θ} = {k2θ}º Demostraci´n o ×ÙÑ ÑÓ× k1 < k2 Ý × Dk = k2 − k1º Ð Ö ÙÑ ÒØÓ Ð ÔÖÙ ×ØÖ Ò ÑÓ×ØÖ Ö ÕÙ (σk2 ÑÓ 2w) − (σk1 ÑÓ 2w) = σ(k2 − k1) ÑÓ 2w = σDk ÑÓ 2w = 0 ÐÓ Ù Ð Ø Ò × ÒØ Ó ÔÓÖÕÙ Dk = 0 Ý Ð ÑÓ ÙÐÓ Ü Ð ÔÖÓÔ ×ØÖ ÙØ Ú º Ë Ò σ = i=0 σi2 w−1 i Ý D = k w−1 i=0 di2 iº Ð ÔÖÓ Ù ØÓ σDk ÔÙ ÜÔÖ × Ö× ÓÑÓ w−1 w−1 σDk = σi2i × di2i i=0 i=0 = σ020 + σ12 + · · · + σw−12w−1 × d020 + d121 + · · · + dw−12w−1 1 2w−2 i = σjdi−j 2i ´ º ¾µ i=0 j=0 Ë dp Ð ÔÖ Ñ Ö Ø Ñ ÒÓ× × Ò ¬ Ø ÚÓ Dk ÙÝÓ Ú ÐÓÖ × 1 ר ÑÓ Ó dp−1 = dp−2 = · · · = d0 = 0º × ÖÒÓ× Ð ÖÓ ÕÙ Ð ×ÙÑ ØÓÖ ÒØ ÖÒ ´ º ¾µ × ÒÙÐ Ô Ö i < pº ÓÖ Ò¸ Ô Ö i = p p σjdp−j = σ0dp , j=0 ÔÙ × ÐÓ× ×ÙÑ Ò Ó× Ö ×Ø ÒØ × ×ÓÒ ÒÙÐÓ× Ó ÕÙ dp−j = 0 Ô Ö j < pº ר ÑÓ Ó¸ Ð Ø p σDk × 1¸ ÐÓ ÕÙ ÑÔÐ ÕÙ Dk = 0 Ý σk1 ÑÓ 2w = σk ÑÓ 2w Ô Ö ØÓ Ó k = k 2 1 2
  • 477.
    5.2. Funciones hash 451 Ð Ø ÓÖ Ñ ÒØ Ö ÓÖ ÑÔÐ ÕÙ ØÓ × Ð × Ð Ú × ÔÓ× Ð × w Ø× × ×ØÖ ÙÝ Ò ÙÒ ÓÖÑ Ñ ÒØ Ò Ð Ô Ð Ö p0 = {kθ}º ÈÓÖ ×ÙÔÙ ×ØÓ¸ Ö Ò ÓÐ × ÓÒ × ÒØÖ ÐÓ× z Ø× Ñ × × Ò ¬ Ø ÚÓ× ÕÙ ÓÒ ÓÖÑ Ò h(k)º ר Ø Ò × Ù ÑÙÝ Ò Ô Ö ÙÒ Ø Ð × Ð Ò Ð Ò Ð Ù Ð Ð Ø Ñ ÒÓ M × ÙÔÐ º Ñ ×¸ ÒÓ × Ð ÔØ ÖÐ Ô Ð Ö × Ø× ÐÓÒ ØÙ Ö ØÖ Ö º 5.2.5 Dispersi´n de cadenas de caracteres o À Ý ÙÒ Ú ×Ø ÒØ × ØÙ ÓÒ × Ò ÕÙ Ð Ò Þ ÓÒ × Ö Ð Þ ÔÓÖ ÙÒ Ò Ö Ø Ö ×º ׸ Ô٠׸ ÑÔÓÖØ ÒØ Ñ Ø Ö ×Ó Ö Ð ×Ô Ö× ÓÒ Ò ×¸ Ô ÖØ ÕÙ ¸ ÓÑÓ ÐÓ ÑÔÐ ¬ ÑÓ× Ò Ü º¾º¾ ´Ô Ò µ¸ × Ö Ð Ø Ú Ñ ÒØ Ð ÓÒרÖÙ Ö ÙÒ Ô × Ñ ÙÒ ÓÒ × º Ë ÒÓ × ×ÔÓÒ Ð Ø ÑÔÓ Ý Ò ÑÓ¸ ÒØÓÒ × × ÓÒÚ Ò ÒØ ØÖ Ò× Ö ÔÓÖ Ò ÓÒÓ × Ý ¬ ÒØ × ÙÒ ÓÒ × × º Ä × × Ù ÒØ × ×ÓÒ ÔÙ Ð × Ý Ù Ò × ÑÔ ÒÓ ½º ½ À× Öר Ò ½ ≡ size_t berstein_hash(unsigned char * str) { size_t hash = 5381; int c; while (c = *str++) hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ return hash; } Ä × Ö ÞÓÒ × ×Ó Ö Ð × Ó Ò Ð Ú ÐÓÖ Ò Ð 5381 Ý Ð ÒÙÑ ÖÓ Ñ Ó 33 ÙÒ ÒÓ Ò × Ó × Ù ÖØ ׺ ¾º ½ À× Ð × ×Ø Ñ × Ñ ¾ ½ ≡ size_t sdbm_hash(unsigned char * str) { size_t hash = 0; int c; while (c = *str++) hash = c + (hash << 6) + (hash << 16) - hash; return hash; } 5.2.6 Dispersi´n universal o ÈÓÖ ÑÙÝ Ù Ò ÕÙ × ÙÒ ÙÒ ÓÒ ×Ô Ö× ÓÒ¸ ר ÔÙ Ô Ö Ö Ò ÙÒ × Ö ÓÐ × ÓÒ × Ý¸ ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ò Ö Ö × Ö Ñ ÒØ Ð × ÑÔ ÒÓ ÙÒ Ø Ð × º Ä Ñ Ð ×Ù ÖØ ¸ ÑÔÖÓ Ð Ò Ð Þ Ö Ô ÖÓ ÔÓ× Ð ¸ ÒÓ Ò × Ö Ñ ÒØ ÔÓ Ö × Ö Ð Ù× ÒØ ÙÒ × Ö ÓÐ × ÓÒ ×º ËÙÔÓÒ ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ ÕÙ × Ø Ò ÓÒÓ Ñ ÒØÓ Ü ØÓ Ð ÙÒ ÓÒ × ÕÙ × ÑÔÐ Ò Ð ÙÒ Ø ÖÑ Ò ÔÐ ÓÒº ÈÙ Ö Ó ÙÖÖ Ö ÕÙ × ÓÒÓ Ñ ÒØÓ × ÙØ Ð Ô Ö Ò Ö Ö Ò× Ö ÓÒ × ÓÐ Ò ÒØ × ÕÙ Ö Ò Ð × ÑÔ ÒÓº
  • 478.
    452 Cap´ ıtulo 5. Tablas hash ÙÖ Ó× Ñ ÒØ ¸ Ø Ð ÓÑÓ ÐÓ ×ØÙ ÑÓ× ÓÒ Ð ÕÙ ×ÓÖØ ´Ü ¿º¾º¾º ´Ô Ò ½ ¾µµ¸ ÙÒ ÑÒÖ Ú Ø Ö Ð Ñ Ð ×Ù ÖØ ¸ × ÓÑÓ Ø Ñ Ò Ò ×Ø ×Ó¸ Ð Ñ Ð ¸ × Ñ ÒØ Ð ØÓÖ Þ ÓÒ ÐÓ ÕÙ ÕÙ Þ ÕÙ Ú Ð Ö ÕÙ Ð Ñ Ð ×Ù ÖØ × ÓÑ Ø ÓÒ Ð Þ Ö¾½ º ÍÒ × ÑÔÐ Ñ Ò Ö Ð ØÓÖ Þ Ö × Ù× Ö Ó× ÙÒ ÓÒ × ×Ô Ö× ÓÒ h1(k) Ý h2(k)º Ù Ò Ó Ó ÙÖÖ ÙÒ Ò× Ö ÓÒ¸ × × Ð ÓÒ Ð Þ Ö ÒØÖ h1 Ý h2 Ð ÙÒ ÓÒ × ÕÙ × ÑÔÐ Ö º Ù Ò Ó × Ö ÕÙ Ö Ù× Ö¸ × ÓÑ ÒÞ ÓÒ Ù ÐÕÙ Ö Ð × ÙÒ ÓÒ ×º Ë Ð Ð Ú × Ò Ù ÒØÖ ¸ ÒØÓÒ × ÕÙ ÐÐ × Ð ÙÒ ÓÒ ÓÒ ÕÙ ÔÙ Ó Ö× Ò× ÖØ Ó¾¾ ÐÓ ÓÒØÖ Ö Ó¸ × ÔÖÙ ÓÒ Ð ÓØÖ ÙÒ ÓÒº Ç Ú Ñ ÒØ ר Ø Ò ÒÐ ÒØ ÐÓ× Ð ÓÖ ØÑÓ׸ Ô ÖÓ ÓÑ Ø Ð ÙÒ Ñ Ð × × Ó Ò Ð × ÙÒ Ò× Ö ÓÒ Ð Ú ×º Ò Ð Ñ ×ÑÓ ×Ô Ö ØÙ Ð ØÓÖ Þ ÓÒ¸ Ò ÐÙ Ö Ù× Ö Ý × Ó Ö × ÑÙÐØ Ò Ñ ÒØ Ó× Ó Ñ × ÙÒ ÓÒ × ×Ô Ö× ÓÒ¸ ÔÓ Ö ÑÓ× × Ð ÓÒ Ö ÙÒ Ð Þ Ö Ú Þ ÕÙ Ð Ø Ð ¹ Ú Ò Ú º ר Ø Ø ÒÓ Ö Ò ÐÓ ×ÓÐÙØÓ Ð × ÑÔ ÒÓ Ý ÖÓÑÔ ÓÑÔÐ Ø Ñ ÒØ Ð ÙÒ × × Ó × ÓÖØÙÒ Ó Ó Ñ Ð Ó×Óº Ä × Ù ÒØ ¬Ò ÓÒ ×Ø Ð ÙÒ Ö ÕÙ Ö Ñ ÒØÓ ÕÙ ÙÒ ÓÒ ÙÒØÓ ÙÒ ÓÒ × ×Ô Ö× ÓÒ ÔØ Ð × ¾¿ Definici´n 5.3 (Familia universal de funciones hash) Ë o H = {h0(k), h2(k), . . . , hW−1(k)} ÙÒ ÓÐ ÓÒ ÙÒ ÓÒ × ×Ô Ö× ÓÒ × ÙÒ ÓÑ Ò Ó K Ð Ö Ò Ó [0, M)º Ë ÕÙ H × ÙÒ Ú Ö× Ð × Ý ×ÓÐÓ × |{∀hi, hj ∈ H | hi(k1) = hj(k2)}| 1 ∀k1, k2 ∈ K =⇒ ≤ |H| M Ó ÓØÖÓ ÑÓ Ó¸ Ð Ñ Ü ÑÓ Ô ÖÑ Ø Ó ÓÐ × ÓÒ × ÕÙ ÔÙ Ò Ó ÙÖÖ Ö ÓÒ Ó× Ô Ö × Ð Ú × × ÐÓ ×ÙÑÓ H/Mº À × Ó ÑÓ×ØÖ Ó ÕÙ Ô Ö ÙÒ Ñ Ð ÙÒ Ú Ö× Ð Ö Ò Ð |H| Ð × ÑÔ ÒÓ × ÓÑÔÐ Ø Ñ ÒØ ÕÙ Ô Ö Ð Ò ØÓ × Ð × ×ØÖ Ø × Ö ×ÓÐÙ ÓÒ ÕÙ ÑÓ× ×ØÙ Ó ¾ º Á Ù ÐÑ ÒØ ¸ × ÑÓ×ØÖ Ó¾ ÕÙ Ô Ö K = {0, 1, . . . , M − 1} | |K| = L Ý hi,j(k) = (ik + b) ÑÓ L ÑÓ M , ´ º ¿µ ÒØÓÒ × H = {hi,j(k) | 1 ≤ i ≤ L ∧ 1 ≤ j ≤ L} ´º µ Ì Ò ÑÓ׸ Ô٠׸ ÙÒ Ñ ØÓ Ó Ô Ö ×ÔÓÒ Ö L ÙÒ ÓÒ × × Ý Ö Ð Þ Ö Ð ØÓÖ Þ ÓÒº 5.2.7 Dispersi´n perfecta o À Ý Ó × ÓÒ × Ò ÕÙ Ð ÓÒ ÙÒØÓ Ð Ú × Ò Þ Ö × ¬Ò ØÓ Ý ÓÒÓ Óº Ò ×Ø ×Ó¸ × ÔÓ× Ð × Ò Ö ÙÒ ÙÒ ÓÒ × Ý Ø Ú Ý ÓÑÔÐ Ø ¸ ÓÒ ¬ Ò ÓÑÔÙØÓ O(1)¸ ÕÙ Ñ Ô ØÓ Ó Ð ÓÒ ÙÒØÓ ÐÚ× Ð Ö Ò Ó [0, M)º Ð Ø ÑÔÓ ×Ó ×Ø Ö ÒØ Þ Ó × Ö O(1) Ý ÒÓ × Ö ÕÙ Ö Ñ Ò Ö ÓÐ × ÓÒ × ´Ð ÙÒ ÓÒ × × Ý Ø Ú µº ¾½ Þ Ö ÔÖÓÚ Ò Ð Ö Þ Ö ÕÙ × Ò ¬ Ó ¸ Ô ÖÓ Ø Ñ Ò ­ÓÖ × º ¾¾ ÆÓØ ÑÓ× ÕÙ ÔÙ Ó ÙÖÖ Ö h1 (k) = h2 (k)¸ Ö ÞÓÒ ÔÓÖ Ð Ù Ð ÒÓ × ÔÙ × Ö Ù Ð Ù Ð ÙÒ ÓÒ Ù× Ô Ö Ò× ÖØ Öº ¾¿ Ä ÓÒÒÓØ ÑÓ× ÔØ Ð × ÔÓÖÕÙ Ð ¬Ò ÓÒ × Ö Ð ÞÓ ÔÓר Ö ÓÖ ÐÓ× × Ù Ö Ñ ÒØÓ׺ ¾ ÈÙ ÓÒ×ÙÐØ Ö× ÓÖÑ Ò¸ Ä × Ö×ÓÒ Ý Ê Ú ×Ø Ó ÃÒÙØ ½ º ¾ ÓÒ×ÙÐØ × Ä Û ×¹ Ò Ò Ö ¾¿ Ô Ö Ø ÐР׺
  • 479.
    5.3. Otros usosde las tablas hash y de la dispersi´n o 453 ÙÒ ÙÒ ÓÒ × ÓÑÓ Ð × Ö Ø × Ð ÒÓÑ Ò Ô Ö Ø Ý Ü ×Ø Ò Ú Ö × Ø Ò × Ý ÔÖÓ Ö Ñ × ÓÒ×ÙÑ Ó× Ô Ö Ò Ö Ö Ð ÙÒ ÓÒ Ò Ù ×Ø ÓÒº Ë Ò Ð × × ØÙ ÓÒ × Ò ÕÙ × ÓÒÓ ØÓ Ó Ð ÓÒ ÙÒØÓ Ð Ú × ×ÓÒ Ó × ÓÒ Ð ×¸ Ø Ñ¹ ÔÓ Ó ×ÓÒ Ü Ô ÓÒ Ð ×º ÓÒ× Ö ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ ÙÒ ÓÒ Ö Ó Ö Ò × Ö Ö Ó ×Ø Ø Ñ ÒØ Ò ÙÒ Î º Ò ×Ø ×Ó¸ Ú Ð Ô Ö Ø Ñ ÒØ Ð Ô Ò Ö Ö Ò Ñ ÑÓÖ ÙÒ ÙÒ ÓÒ × Ô Ö Ø ÕÙ Ñ Ô Ð Ô Ð Ö Ð Ù ÓÒ × Ò Ð Î º Ò GNU Ü ×Ø ÙÒ Ü Ð ÒØ Ý Ò Ö Ð ÔÖÓ Ö Ñ ¸ ÐÐ Ñ Ó gperf ½ ¸ Ô Ö Ò Ö Ö ÙÒ¹ ÓÒ × × Ô Ö Ø × Ù ÐÕÙ Ö Ø ÔÓ Ð Ú º 5.3 Otros usos de las tablas hash y de la dispersi´n o 5.3.1 Identificaci´n de cadenas o Ë ÙÒ Ð ÓÒ ÙÒ ÙÒ ÓÒ ×Ô Ö× ÓÒ¸ ר ÔÙ ÙØ Ð Þ Ö× ¸ ÓÒ ÔÖÓ Ð Ø ÒÓ Ò ÙÒ ÓÒ Ð Ð ÙÒ ÓÒ × ¸ Ô Ö Ö ÓÒÓ Ö ÙÒ ×Ù ¹× Ù Ò ÒØÖÓ ÓØÖ º Ä ÙÒ Ñ ÒØ Ð × ÕÙ Ô Ö Ó× × Ù Ò × s1 = s2 Ð ÔÖÓ Ð ÕÙ h(s1) = h(s2) × ×Ø ÒØ × Ð ÙÒ ÓÒ × × Ù Ò º ר × Ð ÔÖ Ò Ô Ó Ð ÓÖ ØÑÓ× Ù×ÕÙ Ô ØÖÓÒ × Ò×Ô Ö Ó× Ò ÙÒ Ð Ö Ð ÓÖ ØÑÓ ÐÐ Ñ Ó Ê Ò¹Ã ÖÔ ½ ¸ Ò ÓÒÓÖ Ð × ÔÖ Ñ Ö × Ô Ö×ÓÒ × ÕÙ ÐÓ ×¹ Ù Ö ÖÓÒº Ù ÓÖ Ò ÐÑ ÒØ ÓÒ Ó Ô Ö Ð Ù×ÕÙ ×Ù ¹ Ò × Ö Ø Ö ×º Ä × Ð ÙÐ Ö ÔÖ Ú Ñ ÒØ ÙÒ Ù ÐÐ Ø Ð Ö ´¬Ò ÖÔÖ ÒØµ Ò Ð × Ù ÒØ ÓÒØ ÜØÓ Ð ÓÖ ØÑ Ó C»C++ ¿ Ð ÓÖ ØÑÓ Ò Ó Ê Ò¹Ã ÖÔ ¿ ≡ int rabin_karp_search(char * str, char * sub) { // guardar longitudes de las cadenas involucradas const size_t m = strlen(sub); const size_t n = strlen(str); Ð ÙÐ Ö Ò Ô ×Ù Ý Ô ÙÖÖ Ù ÐÐ × Ø Ð Ö × ×Ù Ý ×ØÖ ¼ ÅÙÐØ ÔÐ Ò Ó Ø Ù ÐÐ ØÐ Ö // recorrer la cadena str en b´squeda de la sub-cadena sub u for (int i = 0; i < n - m + 1; ++i) { if (fp_sub == fp_curr) // ¿coinciden las huellas digitales? { // s´ ==> verificar si &str[i] se corresponde con la sub-cadena ı for (char * aux = str[i], int k = 0; k < m; ++k) if (aux[k} != sub[k]) break; // falso positivo return i; // str[i] contiene la cadena } Ð ÙÐ Ö Ù ÐÐ Ø Ð Ö Ô ÙÖÖ Ô Ö ×ØÖ ·½ } return -1; // sub-cadena no se encuentra } ÓÑÓ Ú ÑÓ׸ Ð Ð ÓÖ ØÑÓ × ×ØÖÙ ØÙÖ ÐÑ ÒØ × ÑÔÐ Ý ÑÙÝ × Ñ Ð Ö Ð Ù×ÕÙ Ò ÖÙØÓ Ð ×Ù ¹ Ò ¸ Ð Ù Ð × O(n × m)º ×ØÓ × ×ÔÖ Ò Ó × ÖÚ Ö ÕÙ Ô Ö ÕÙ Ð Ð ÓÖ ØÑÓ Ê Ò¹Ã ÖÔ Ú Ð Ð Ô Ò Ö ×Ô ØÓ Ð Ù ÖÞ ÖÙØ × Ò ÙÑÔÐ Ö Ó× Ó× ×
  • 480.
    454 Cap´ ıtulo 5. Tablas hash ½º Ð Ð ÙÐÓ Ð ÐÓÕÙ Ð ÙÐ Ö Ù ÐÐ Ø Ð Ö Ô ÙÖÖ Ô Ö ×ØÖ ·½ × Ö Ö Ô Ó¸ O(1)¸ ÔÖ Ö Ð Ñ ÒØ º ¾º Ä ÒØ Ð×Ó× ÔÓ× Ø ÚÓ× × Ö Ô ÕÙ Ò ¸ ÔÙ × ×Ù Ó ÙÖÖ Ò ÖÖ Óѹ Ô Ö Ö ÐÓ× m Ö Ø Ö × Ð ×Ù ¹ Ò º ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ò Ð Ñ Ò ÕÙ × Ø Ø Ò Ñ × Ð×Ó× ÔÓ× Ø ÚÓ¸ Ð Ð ÓÖ ØÑÓ Ê Ò¹Ã ÖÔ Ø Ò Ö O(n × m) × Ñ ØÖ Ñ ÒØ ¸ Ñ ÒÓ× Ð×Ó× ÔÓ× Ø ÚÓ× Ö Ò Ð Ð ÓÖ ØÑÓ O(n)º Ð Ð ÙÐÓ Ð Ù ÐÐ Ø Ð Ö ÒÓ × ÓØÖ Ó× ÕÙ ÙÒ ÙÒ ÓÒ × ¬Ò ¸ ×Ó Ö ÙÒ Ò Ö Ø Ö × Ò Ö ×ØÖ Ð × Ù ÒØ Ñ Ò Ö | ×ØÖ |−1 h(רÖ) = רÖi ×B| ×ØÖ |−1−i ÑÓ M ; ´º µ i=0 ÓÒ B ×Ð× Ð × ×Ø Ñ Ó ¬ ÓÒ ´Ö ܵ ÙÒ × Ñ ÓÐÓ Ô ÖØ Ò ÒØ ÙÒ Ò Ö Ø Ö × Ý ×ØÖi × Ð i¹ × ÑÓ × Ñ ÓÐÓ Ð × Ù Ò ×ØÖº × Ñ Ò ×Ø Ö Ö ÓÖ Ö Ü º¾º º½ ´Ô Ò µ Ð ÔÖÓÔ ×ØÖ ÙØ Ú ÕÙ ÒÓ× Ò ÕÙ Ð Ö ×ØÓ Ð ×ÙÑ × Ù Ð Ð Ö ×ØÓ Ð ×ÙÑ ÐÓ× Ö ×ØÓ× ¾ Ó × (i + k) ÑÓ M = (i ÑÓ M) + (k ÑÓ M) ÑÓ M . ´º µ Ä ÔÖÓÔ ×ØÖ ÙØ Ú Ð ÑÓ ÙÐÓ Ø Ñ Ò × ÔÐ Ð ÔÖÓ Ù ØÓ × Ö (ik) ÑÓ M = (i ÑÓ M)(k ÑÓ M) ÑÓ M . ´º µ ÔÖ Ò Ö Ð Ö Ø Ö ×ØÖ ÙØ ÚÓ Ð ÑÓ ÙÐÓ ÒÓ× × ÑÙÝ ÙØ Ð ÔÓÖÕÙ ÒÓ× Ô ÖÑ Ø Ð ÙÐ Ö ´ º µ Ò ÙÒ ÓÒ ÐÓ× ÑÓ ÙÐÓ× | ×ØÖ |−1 h(רÖ) = רÖi ×B| ×ØÖ |−1−i ÑÓ M ÑÓ M i=0 | ×ØÖ |−1 = (רÖi ÑÓ M) B| ×ØÖ |−1−i ÑÓ M ÑÓ M ÑÓ M i=0 | ×ØÖ |−1 = (רÖi ÑÓ M) (B| ×ØÖ |−1−i ÑÓ M) ÑÓ M ÑÓ M ÑÓ M; i=0 ´ º µ ÐÓ Ù Ð × ×ÙÑ Ñ ÒØ Ö Ò Ó×Ó¸ ÔÙ × ÒÓ× Ú Ø ÔÖ Ó ÙÔ ÖÒÓ× ÔÓÖ Ð Ú ÒØÙ Ð × ÓÖ ÒÙÑ Ö Ó Ð × ×ÙÑ × Ý ÔÓØ Ò ×º Ê Ò Ý Ã ÖÔ ½ ÑÙ ×ØÖ Ò ÓÑÓ h(רÖ) ×Ô Ö× ÑÙÝ Ò ÓÒ ÓÖÑ Ð Ú ÐÓÖ M × × Ð ÓÒ ÓÑÓ ÙÒ ÒÙÑ ÖÓ ÔÖ ÑÓº ÓÒ Ð ÓÒÓ Ñ ÒØÓ ´ º µ¸ ÔÓ ÑÓ× Ó ¬ Ö Ð ÐÓÕÙ Ò Ð Ð ÙÐ Ö Ò Ô ×Ù Ý Ô ÙÖÖ Ù ÐÐ × Ø Ð Ö × ×Ù Ý ×ØÖ ¼ ≡ ´ ¿µ const size_t radix = 256; // radix de un s´mbolo ı size_t fp_sub = 0; size_t fp_curr = 0; for (int i = 0; i < m; ++i) { fp_sub = (radix*fp_sub + sub[i]) % M; fp_sub = (radix*fp_curr + str[i]) % M; } ¾ Î × Ø Ñ Ò ´ º µ Ý Ð ÒÓØ Ô Ð Ô Ò º
  • 481.
    5.3. Otros usosde las tablas hash y de la dispersi´n o 455 Ð ÐÓÕÙ ØÓÑ O(m)º Ä Ù ÐÐ Ø Ð Ö pf sub ×ÓÐÓ × Ð ÙÐ ÙÒ Ú Þ¸ Ô ÖÓ Ð Ð ×Ù ¹ Ò ×ØÖ Ò Ð ÔÓ× ÓÒ i Ð ÙÐ Ö× n − i Ú ×º Ë Ù× Ö ÑÓ× Ð Ñ ×ÑÓ ÔÖÓ Ñ ÒØÓ ÕÙ Ô Ö Ð ÐÓÕÙ Ð ÙÐ Ö Ò Ô ×Ù Ý Ô ÙÖÖ Ù ÐÐ × Ø Ð Ö × ×Ù Ý ×ØÖ ¼ ¸ ÒØÓÒ × Ð Ð ÓÖ ØÑÓ Ê Ò¹Ã ÖÔ × Ö O(n × m) ÓÒ ÙÒ Óר ÓÒר ÒØ Ñ ÝÓÖ ÕÙ Ð Ð ÓÖ ØÑÓ Ù ÖÞ ÖÙØ º Ð ØÖÙ Ó Ð Ð ÓÖ ØÑÓ Ö × Ò ÕÙ Ð Ù ÐÐ ØÐ Ô Ö Ð ×Ù ¹ Ò ×ØÖi+1 ÐÓÒ ØÙ m¸ ÕÙ Ö ×ÙÑ Ö ÑÓ× ÓÑÓ h(רÖi+1)¸ ÔÙ Ð ÙÐ Ö× Ò Ø ÑÔÓ Ò Ô Ò ÒØ m Ò ÙÒ ÓÒ Ð Ú ÐÓÖ ÔÖ Ú Ó h(רÖi) ØÓ Ó ÐÓ ÕÙ ÑÓ× Ö × Ö ×Ø ÖÐ h(רÖi+1) Ð ÔÖ Ñ Ö ×ÙÑ Ò Ó h(רÖi)¸ ÔÙ × ×Ø Ý ÒÓ × Ô ÖØ Ð Ù ÐÐ Ø Ð¸ Ý Ò ÖÐ Ð ÒÙ ÚÓ ×ÙÑ Ò Ó Ô Ö ×ØÖi+1º ×ØÓ × Ù ÓÑÔÙØ Ö h(רÖi+1) × ÙÒ h(רÖi+1) = B h(stri) + רÖi+m − Bm רÖi ÑÓ M ; ´º µ ר Ø Ò × ÐÐ Ñ ×Ô Ö× ÓÒ ÒÖÓÐÐ ´ × ÖÓÐÐ µº Ó ×ØÓ× Ø ÖÑ ÒÓ׸ Ð Ú ÐÓÖ fp curr Ô Ö Ð i¹ × Ñ Ø Ö ÓÒ × Ð ÙÐ × Ð ÙÐ Ö Ù ÐÐ Ø Ð Ö Ô ÙÖÖ Ô Ö ×ØÖ ·½ ≡ ´ ¿µ fp_curr = (radix*(fp_curr - str[i]*fact) + str[i + m]) % M; ÅÙÐØ ÔÐ Ò Ó Ø Ù ÐÐ ØÐ Ö ≡ ´ ¿µ const size_t fact = (size_t) pow(radix, m - 1); // radix^(m-1) Ð Ñ ØÓ Ó Ù ÐÐ Ø Ð Ö × ÔÐ ÙÒ ÑÔÐ ÒØ × ØÙ ÓÒ ×º Ò ÔÖ Ñ Ö ÐÙ Ö¸ Ð Ð ÓÖ ØÑÓ ÔÙ Ö× Ñ × Ò Ö Ð Ô Ö Ö ÓÒÓ Ö Ô ØÖÓÒ × Ó ØÖ ¹ Ñ Ò× ÓÒ Ð × × ÐÓ× Ó ØÓ× Ò Ð ÔÐ ÒÓ Ó ×Ô Ó × ÓÒ× Ö Ò ÓÑÓ Ñ ØÖ × Ó ÖÖ ÐÓ× ØÖ Ñ Ò× ÓÒ Ð ×¸ ÐÓ× Ù Ð ×¸ Ð ¬Ò Ù ÒØ ׸ Ô Ö Ò Ò × Ù Ò ×º ÍÒ Ò Ò ×Ø Ð ÓÖ ØÑÓ × ÕÙ Ð ÐÓÒ ØÙ Ð ×Ù ¹× Ù Ò Ù× Ö ÒÓ Ò ÙÖ ÒØ Ð ÖÖ Ó Ð × Ù Ò Ò Ð ÕÙ × Ù× ×ØÓ ÓÒØÖ ×Ø ÓÒ ÓØÖÓ× Ð ÓÖ ØÑÓ× ÕÙ × ÒÐ ÒØ Ò Ñ ÕÙ Ð × Ù Ò Ù× Ö × Ñ ÝÓÖ ÐÓÒ ØÙ º Ð Ú ÐÓÖ M ÔÙ × Ð ÓÒ Ö× Ð ØÓÖ Ñ ÒØ ¸ Ñ Ò Ö Ø Ð ÕÙ ÙÒ ÔÓØ Ø Ó Ú Ö× Ö Ó ÒÓ ÔÙ Ø Ö Ð Ð ÓÖ ØÑÓ ÓÐÓ Ò Ó ÓÑÓ ÙÒ ÒØÖ ÙÒ × Ù Ò Ù× Ö ÕÙ Ù× ÑÙ × ÓÐ × ÓÒ ×º ÓÑÔ ÖØ Ö Ð Ö Ñ ÒØ Ð ÓÒÓ Ñ ÒØÓ × ÙÒ ÓÒ ÓÒ × Ò Ð Ô Ö × Ö × Ö ÙÑ ÒÓº È ÖÓ Ù Ö× Ð Ñ Ö ØÓ ÓØÖÓ ÒÓ ×ÓÐÓ ÔÙ ÖÖ Ö ÜÔÐÓØ ÓÒ Ð ÔÖÓ ÑÓ¸ × ÒÓ ÕÙ Ú ÓÒØÖ Ð × Ò Ð Ú Ò ÓÑÙÒ º Ð Ù Ö× Ð× Ñ ÒØ ÙÒ × Ù Ö Ñ ÒØÓ ×Ò ÖÐÓ Ó × Ð ÒÓÑ Ò ÔÐ Ó º Ò Ð × Ù Ö Ñ ÒØÓ ×¸ × ÓÑÓ Ò Ù ÐÕÙ Ö ÓØÖÓ Ó Ö Ö¸ × ÔÙ ÔÐ Öº È Ö ÐÓ × Ö ØÓ¸ Ý Ò Ò Ö Ð Ô Ö ØÓ ÔÖÓ Ù ÓÒ Ö ÔÖ × ÒØ Ð ÓÑÓ ÙÒ × Ù Ò ¸ ÔÙ ÑÓ ¬ Ö× Ð Ð ÓÖ ØÑÓ Ê Ò¹Ã ÖÔ Ô Ö Ú Ö ¬ Ö ÙØÓÑ Ø Ñ ÒØ × Ú ÒØÙ ÐÑ ÒØ × ÓÑ Ø Ó Ð ÙÒ ÔÐ Óº Ò ×Ø ×Ó¸ × × Ò ÙÒ ÙÒ ÓÒ × ÕÙ ÑÓ Ð Ð × Ù Ò ×Ó×Ô Ó× ÔÐ Óº 5.3.2 Supertraza Ä ÓÑÔÙØ ÓÒ ×Ø ÐÐ Ò ÔÖÓ Ð Ñ × ÕÙ Ñ Ò Ò ÓÒ ÙÒØÓ× ØÓ× ÑÙÝ Ö Ò × ÑÙ Ó× ÐÐÓ× ÒØÖ Ø Ð × Ò Ð × ÒØ Ó ÕÙ Ð ÒØ ØÓ× × ÜÔÓÒ Ò Ðº À Ý Ó × ÓÒ × Ò Ð × Ù Ð × ÙÒ ØÓ Ó Ö ×ÙÐØ Ó Ù Ö Ö× ØÓ× ÒÓ Ö Ô Ø Ö ×Ù Ð ÙÐÓ Ý¸ ×Ó Ö ØÓ Ó¸ ÒÓ Ö Ô Ø Ö ÐÓ× ØÓ× ÕÙ ×Ù Ò Ð Ö Ò × Ù ÖØÓº ÓÒ× Ö ÑÓ× ÙÒ × Ù Ò ÒÖ ØÓ× < d1 −→ d2 −→ d3 −→ · · · −→ dn > Ø Ð ÕÙ d2 Ô Ò Ð Ð ÙÐÓ d1 Ý × × Ù Ò Ð Ý Ò Ö Ñ ÒØ Ô Ö ØÓ Ó ØÓ di+1¸
  • 482.
    456 Cap´ ıtulo 5. Tablas hash ÕÙ Ö ÕÙ Ö Ð ÙÐ Ö diº Ä ÙÖ Ö ØÓ di Ò ÙÒ Ø Ð × × ÕÙ ¸ × ÙÒ Ð Ò ÓÐ Ð ÔÖÓ Ð Ñ ¸ ÔÙ Ó ÙÖÖ Ö ÕÙ Ð Ð ÙÐÓ ÙÒ ØÓ di Ô Ö Þ Ö Ô Ø Ó × ×Ø × Ð ×Ó¸ ÒØÓÒ ×¸ Ð Ð ÙÐÓ ØÓ Ð × Ù Ò ×Ù ¹× Ù ÒØ di ´di+1 −→ di+1 −→ · · · −→ di+k >µ × Ö Ô Ø ÒÙ ÚÓº ÌÓÑ ÑÓ× ÓÑÓ ÑÔÐÓ ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ù ÖÞ ÖÙØ × Ù Ö Ñ Ò Ö × ÓÐÓ Ö n Ö Ò × Ò ÙÒ Ø Ð ÖÓ Ö Þ × Ò ÕÙ ×Ø × × Ñ Ò Òº × Ö¸ ÓÑ ÒÞ ÑÓ× ÔÓÖ ÓÐÓ Ö ÙÒ Ö Ò Ò Ð × ÕÙ a1 Ý ÔÖÓ× Ù ÑÓ× Ö ÙÖ× Ú Ñ ÒØ ÓÐÓ Ö Ð × Ù ÒØ Ò Ð × ÙÒ × ÕÙ × b × Ò ÕÙ ×Ø Ñ Ò a1º ÓÑ ÒÞ Ò Ó ÔÓÖ b1 Ú ÑÓ× ÕÙ Ð Ö Ò Ñ Ò Þ Ð ÔÙ ×Ø Ò a1 ÐÓ Ñ ×ÑÓ Ó ÙÖÖ × Ð ÓÐÓ ÑÓ× Ò b2º ר × Ó× ÓÑ Ò ÓÒ ×¸ ÕÙ ¬Ò Ø Ú Ñ ÒØ ÒÓ ÓÒ Ù Ò Ð ×ÓÐÙ ÓÒ¸ ×ÓÒ ÓÒÚ Ò ÒØ × Ù Ö ÖÐ × ØÓ× ÕÙ ¸ Ò ÙÒ Ø Ð ÖÓ n × n × ÕÙ × ÒÓ Ö Ô Ø ÑÓ× Ð Ð ÙÐÓ Ò Ú ÒÓº È Ö ÐÐÓ¸ Ð × Ù Ò ÜÔÐÓÖ × Ù Ö Ò ÙÒ Ø Ð º ÙÒÕÙ Ð ÔÖÓ Ð Ñ ÒØ Ö ÓÖ ÔÙ Ö ×ÓÐÚ Ö× × Ò Ò × ÙÒ Ø Ð ¸ ר ÐÙ×ØÖ Ó× ×Ô ØÓ× ÒØ Ö × ´½µ Ð Ù Ö Ö ×Ø Ó Ð ÙÐÓ Ô Ö Ú Ø Ö Ö Ô Ø ÓÒ Ý ´¾µ Ð Ó ÕÙ ÓÒ ÓÖÑ ÙÑ ÒØ Ð Ñ Ò× ÓÒ Ð Ø Ð ÖÓ Ý Ð ÒØ Ö Ò× ÙÑ ÒØ Ð ÒØ ר Ó׺ È Ö ÙÒ Ø Ð ÖÓ Ñ Ò× ÓÒ n ÑÙÝ Ö Ò ¸ Ð ÒØ ר Ó× ÔÙ × Ö Ò ÓÖ Ð º Ò Ð ÓÑ Ò Ó Ð ÜÔÐÓÖ ÓÒ Ö Ó× Ò Ñ Ó× ×Ø Ó¸ × × Ù Ö Ó ÙÒ ÑÙÝ ÒØ Ö × ÒØ Ø Ò ÐÐ Ñ ×ÙÔ ÖØÖ Þ ½ º Ò ÐÙ Ö Ù Ö Ö ÒØ Ö Ñ ÒØ Ð ×Ø Ó Ð ÙÐÓ¸ × × Ò ÙÒ ÙÒ ÓÒ ×Ô Ö× ÓÒ Ý × Ñ Ö Ò ÙÒ Ø Ð Ø× ×Ù Ô Ö ÓÒº ר Ñ Ö ÙÑ ÒØ ÓÒ× Ö Ð Ñ ÒØ Ð Ô ÐÑ Ò Ñ ÒØÓ¸ ÔÙ × ×ÓÐÓ × Ö ÕÙ Ö ÙÒ Ø ÔÓÖ ×Ø Ó¸ ÐÓ ÕÙ ÙÑ ÒØ Ð Ô ØÖ Ø Ö ÓÒ Ð × Ð Ð ÔÖÓ¹ Ð Ñ º Ë Ò Ñ Ö Ó¸ ÒÓ Ý Ñ Ò Ö Ø ÖÑ Ò ×Ø × Ö × ÙÒ × ÐÑ Ò Ó Ò Ð Ø Ð ÓÖÖ ×ÔÓÒ Ð ×Ø Ó ØÙ Ð Ð ÙÐÓ Ó × ØÖ Ø ÓØÖÓ ×Ø Ó ÕÙ Ù× ÓÐ × ÓÒº Ò ÓØÖ × Ô Ð Ö ×¸ × ÑÔÓ× Ð Ö ÒØ Þ Ö ÕÙ ØÓ Ó× ÐÓ× ×Ø Ó× × Ù Ö Òº ÁÑÔÓ× Ð Ò Ö ÒØ Þ Ö ÒÓ Ü ÐÙÝ ×Ù ÔÖÓ Ð º Ä Ò ÖØ ÙÑ Ö ÒØ Ö ÓÖ × Ø ÙØ Ò Ó Ð Ø Ò ÓÒ ×Ø ÒØ × ÙÒ ÓÒ × × Ñ Ò Ö Ó Ö Ö ÙÒ Ù Ò ÜÔ Ø Ø Ú Ù Ö Ö ØÓ Ó× ÐÓ× ×Ø Ó× ÔÓ× Ð ×º 5.3.3 Cache (el TAD Hash Cache<Key,Data> ) ÍÒÓ ÐÓ× ÔÖ Ò Ô Ð × Ù×Ó× Ð × Ø Ð × ×Ô Ö× ÓÒ × Ð ÒרÖÙÑ ÒØ ÓÒ ×º ÍÒ × ÙÒ Ø Ð ×Ó Ø Ú ¸ ¬Ò Ø Ô ÖÓ ×Ó Ö Ô Ó¸ ÕÙ × ÓÐÓ ÒØÖ ÙÒ ÔÖÓ Ö Ñ Ý ÙÒ ÓÒ ÙÒØÓ ØÓ׺ È Ö ÕÙ × Ö ÓÑÔ Ò× Ð ÙØ Ð Þ ÓÒ ÙÒ ¸ ר × Ö ÑÙ Ó Ñ × Ö Ô Ó ÕÙ Ð × ÑÔÐ ×Ó Ð ÓÒ ÙÒØÓ ØÓ׺ È ØÓÖ Ñ ÒØ ¸ Ð ×ÙÒØÓ ÔÙ ÒØ ÖÔÖ Ø Ö× Ð × Ù ÒØ ÑÓ Ó Programa Medio contentivo a Cache a de datos velocidad velocidad a velocidad Vc Vd Vp
  • 483.
    5.3. Otros usosde las tablas hash y de la dispersi´n o 457 Ò ÙÒ × ØÙ ÓÒ Ð ÓÖ ØÑ ¸ Ð ÔÖÓ Ö Ñ × ÙØ ÙÒ Ú ÐÓ vp Ý ØÓ× ÙÒ ÓÒ ÙÒØÓ ÕÙ ÓÔ Ö Ú ÐÓ vdº Ð ¸ ÓÔ Ö Ú ÐÓ vc | vp < vc < vdº ר ÑÓ Ó¸ Ù Ò Ó × × Ù× Ö ÙÒ ØÓ¸ × Ö Ú × ÔÖ Ñ ÖÓ Ð Ý¸ × × Ò Ù Ò¹ ØÖ ¸ ÒØÓÒ × × Ö ÙÔ Ö Ð ØÓ × Ò Ò × Ô Ö Ð Óר ÕÙ ÖÖ ÖÐÓ Ú ÐÓ vdº Ä × ×Ùר ÒØ Ò Ð Ö Ð ¼¹¾¼ Ñ Ò ÓÒ Ò Ü ¿º º½ ´Ô Ò ¾¾ µº Ä ÔÐ Ö ÔÖÓÚ Ò Ð Ú Ö Ó ÐÓ Ö ÕÙ × Ò ¬ × ÓÒ Ö Ý ÐÓ ÐÙ× ÓÒ ÔÓÖÕÙ Ú × ×Ø × Ñ Ò ØÖ ×Ô Ö ÒØ Ñ ÒØ × Ö¸ Ð ÔÖÓ Ö Ñ ÐÓ× ØÓ× ×ÙÑ Ò Ó ÕÙ × Ò Ù ÒØÖ Ò Ò ÙÒ Ñ Ó ×Ô Ö Ó × Ò ÓÒÓ Ñ ÒØÓ Ö Ð Ü ×Ø Ò Ð ×Ø × Ð × ØÙ ÓÒ¸ ÔÓÖ ÑÔÐÓ¸ Ò Ö Û Ö º ÄÓ× Ö Ò × × Ø Ñ Ò Ð ÐÐ Ñ Ò ÒØ ¹Ñ ÑÓÖ ´ ÒØ Ñ ÑÓ Ö µ¸ ×Ó Ö ØÓ Ó Ô Ö Ð Ö Û Ö º À Ý ÙÒ Ú ×Ø ÒØ Ö ÙÒר Ò × Ò ÕÙ Ð Ù×Ó ÙÒ Ð ÖÒ ÒØÖ ÙÒ ÑÙÝ ÐØÓ Ý ÔÓ Ö × ÑÔ ÒÓº Ä × ØÙ ÓÒ × Ø Ô × × ÔÙ Ò Ö ×ÙÑ Ö ÓÑÓ × Ù Medio de almacenamiento de datos distinto a memoria principal: ÐÓ× Ò Ú Ð × ÐÑ Ò Ñ ÒØÓ¸ Ò ÓÖ Ò Ö ÒØ Ð Ú ÐÓ Ý Ö ÒØ Ð Ô ¸ ÔÙ Ò Ð × ¬ Ö× ÓÑÓ ½º Å ÑÓÖ ÔÖ Ò Ô Ðº ¾º Å ÑÓÖ × ÙÒ Ö ´ × Ó× ÙÖÓ×µº ¿º Å ÑÓÖ Ø Ö Ö ´ ¹ÊÇŸ Î ¸ Ñ ÑÓÖ × ­ × ¸ ÒØ ×µº º Å ÑÓÖ Ö ÑÓØ ´ ×ÔÓÒ Ð ÔÓÖ Ö µº Ù Ò Ó ÐÓ× ØÓ× ÕÙ ÙÒ ÔÖÓ Ö Ñ × Ò Ù ÒØÖ Ò Ò ÙÒ Ò Ú Ð Ñ ÑÓÖ Ñ × Ð ÒØÓ ÕÙ Ð Ñ ÑÓÖ ÔÖ Ò Ô Ð¸ ÒØÓÒ × ÙÒ ÒØÖ Ð Ñ ÑÓÖ ÔÖ Ò Ô Ð Ý Ð Ñ Ó ÐÑ Ò Ñ ÒØÓ ÔÙ Ð Ö Ö ×Ùר Ò ÐÑ ÒØ Ð Ù ÓÒº Estructuras de datos est´ticas: ÔÓÖ Ö ÞÓÒ × a Ú Ö× Ò ÓÐ ¸ ÔÙ Ó ÙÖÖ Ö ÕÙ Ý ÕÙ ÑÔÐ Ö ÙÒ ×ØÖÙ ØÙÖ ØÓ× ÕÙ ÒÓ × Ù ÖØÓ ×Ø ÐÓ Ö Ù¹ Ô Ö ÓÒº ÈÓÖ ÑÔÐÓ¸ ×ÙÔÓÒ ÑÓ× ÕÙ Ñ ÒØ Ò ÑÓ× Ò ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ ÙÒ ÓÒ¹ ÙÒØÓ Ö ×ØÖÓ׺ Ð Ö ÓÐ × Ò Þ ÔÓÖ Ð ÙÒ Ð Ú ÔÖ Ò Ô Ð ÒÙÑ Ö ÔÓÖ Ò×¹ Ø Ò ÙÒ ÒÙÑ ÖÓ ÙÐ ¸ ÐÓ ÕÙ Ô ÖÑ Ø ÙÒ Ö ÙÔ Ö ÓÒ ×Ô Ö O(Ð (n)) Ô Ö Ù ÐÕÙ Ö Ö ×ØÖÓº ÓÒ Ñ ÒÓ× Ö Ù Ò × Ö ÕÙ Ö Ö ÙÔ Ö Ö ÔÓÖ Ð ÙÒ Ð Ú Ð Ø × ÙÒ Ö ÙÒ Ô ÐÐ Ó¸ ÓÑÓ Ð × Ó ÖÕÙ Ø ÔÓº Ò ×Ø ×Ó¸ ÔÙ × Ö ÑÙÝ ÓרÓ×Ó¸ Ý ÔÖÓ Ð ¹ Ñ ÒØ ÒÒ × Ö Ó¸ Ò Þ Ö Ñ ÒØ ÙÒ × ÙÒ Ó Ö ÓÐ Ò Ö Óº Ò ×Ù ÐÙ Ö¸ ÔÓ ÑÓ× Ù Ö Ö Ò ÙÒ ¸ Ò Þ Ó ÔÓÖ Ô ÐÐ Ó¸ ÐÓ× Ö ×ØÖÓ× Ñ × Ö ÒØ Ñ ÒØ ÓÒ×Ùй Ø Ó׸ × Ò ÔÓÖ ÙÐ Ó ÔÓÖ Ô ÐÐ Ó¸ ÑÓ Ó Ø Ð ÕÙ Ú ÒØÙ ÐÑ ÒØ ÒÓ× ÓÖÖ ÑÓ× ÙÒ Ù×ÕÙ × Ù Ò Ð ×Ó Ö Ð ÓÒ ÙÒØÓ Ð Ú ×º C´lculos que puedan repetirse: Ò ÑÙ × Ó × ÓÒ ×¸ × Ö ÕÙ Ö Ò Ö Ð Þ Ö Ð ÙÐÓ× a ÓÑÔÐ Ó× ×Ù× ÔØ Ð × Ö Ô Ø Ö× º Ò ×Ø ×Ó¸ ÔÓ ÑÓ× Ù Ö Ö Ò ÙÒ Ð × Ù Ò ÓÖ Ò Ö Ð Ð ÙÐÓ Ý ×Ù Ö ×ÙÐØ Óº ר ÑÓ Ó¸ × Ð Ò Ñ Ð ÔÖÓ Ö Ñ Ö ÕÙ Ö ÒÙ ÚÓ Ð Ð ÙÐÓ¸ ר Ý × Ò Ù ÒØÖ ×ÔÓÒ Ð º Ò ×Ø × ØÙ ÓÒ ×Ù Ð Ù× Ö× Ô ÖØ Ð × Ù Ò ÓÖ Ò Ö Ð ÙÐÓ ÓÑÓ Ð Ú ÙÒ ÙÒ ÓÒ ×Ô Ö× ÓÒº
  • 484.
    458 Cap´ ıtulo 5. Tablas hash Ä ÑÔ×ÓÒ ¾½ ÙÒ Ü Ð ÒØ ÜÔÓ× ÓÒ Ð Ö ×Ô ØÓ × Ð Ô Ö×Ô Ø Ú Ð × ÒÓ × ×Ø Ñ ×º ÍÒ Ö Ø Ö ×Ø ÑÙÝ ÑÔÓÖØ ÒØ ÙÒ × ÕÙ × ¬Ò ØÓ × Ö¸ Ø Ò ÙÒ Ô Ñ Ü Ñ ¸ ÓÒ× Ö Ð Ñ ÒØ Ñ ÒÓÖ ÕÙ Ð Ð ÓÒ ÙÒØÓ Ó ØÓ Ð ×Ø ÓÒº Ù Ò Ó × Ö ÕÙ Ö Ò× ÖØ Ö ÙÒ ØÓ Ò ÙÒ ÐÐ ÒÓ¸ ÒØÓÒ × Ý ÕÙ × Ð ÓÒ Ö ÙÒÓ ×Ù× ØÓ× ÓÒØ Ò Ó× Ý ×Ù ×Ø ØÙ ÖÐÓ ÔÓÖ Ð ÒÙ ÚÓº Ù Ð × Ð ÓÒ Ö× Ë × Ó ÑÓ× ÙÒ ØÓ ÕÙ × Ö Ö Ö Ò Ó Ò ÙÒ ÙØÙÖÓ Ö ÒÓ¸ ÒØÓÒ ×¸ Ò ÐÓ ÕÙ ÓÒ ÖÒ Ð ØÓ × Ó¸ Ô Ö ÑÓ× Ð ÓÒ Ð º Ò ×Ø × ÒØ Ó¸ Ð ÐÓ Ð Ö Ö Ò ×Ù Ö × Ð ÓÒ Ö Ð ØÓ Ñ × ÒØ ÙÓº ÈÖÓ Ð Ñ ÒØ Ð Ø Ð × × Ð ×ØÖÙ ØÙÖ ØÓ× ÓÒ Ô Ö ÑÔÐ ÒØ Ö ÙÒ Ò Ñ ÑÓÖ ÔÖ Ò Ô Ðº × Ò ÐÑ ÒØ ÔÓÖ ÙÒ Ö ÞÓÒ × Ò ÔÖÓÑ Ó Ð ×ÕÙ Ñ Ö Ù¹ Ô Ö ÓÒ Ñ × Ö Ô Ó ÕÙ × ÓÒÓ º ÍÒ × ÙÒ ÝÙ Ð × ÑÔ ÒÓ¸ Ô ÖÓ ×Ù ÓÒ ÔÒ Ð Ô ØÖÓÒ ×Óº ÆÓ ׸ Ô٠׸ Ö Ø Ó Ð Ø Ò Ö ÙÒ × ÑÔ ÒÓ Ö ÒØ Þ Ó¸ ÔÙ × × ×Ø Ù × Ð ×Ó¸ ÒØÓÒ × ÒÓ Ö ÑÓ× Ù× Ö ÙÒ º Ò Ò ÙÖ ¸ Ð ÙÒ ÓÒ × ÔÙ Ö ÔÖ × ÒØ Ö Ô ÖØ ÐÓ ÕÙ × ÔÖ Ø Ò Ù Ö Öº ÓÑÓ ÑÔÐÓ× Ø Ò ÑÓ× ÐÓ× Ù×Ó× × Ö ØÓ× Ò Ð × Ó× ×Ù ¹× ÓÒ × ÒØ Ö ÓÖ × Ý Ð ×Ô Ö× Ö Ð ÙÐÓ× ÕÙ ÔÙ Ò Ö Ô Ø Ö× º ALEPH ÓÒØ Ò ÙÒ Ì ¸ ÐÐ Ñ Ó Hash Cache<Key,Data> ÙÝ ×Ô ¬ ÓÒ ×Ø ÓÒØ Ò Ò Ð Ö ÚÓ ØÔÐ × ºÀ ØÔÐ × ºÀ ≡ template <typename Key, typename Data, class Cmp = Aleph::equal_to<Key> > class Hash_Cache { ÒØÖ Hash Cache<Key,Data> Å Ñ ÖÓ× ÔÖ Ú Ó× Hash Cache<Key,Data> Å Ñ ÖÓ× ÔÙ Ð Ó× Hash Cache<Key,Data> ¾ }; ¬Ò × Hash Cache¸ Ù× Ò ÙÒ × ¾ Ò º Hash Cache<Key,Data> ÑÔÐ Ñ ÒØ ÙÒ Ò Þ Ó ÔÓÖ Ð Ú × Ø ÔÓ Key¸ ÕÙ Ù Ö ØÓ× Ø ÔÓ Data Ý ÕÙ ×Ø ÑÔÐ ÒØ Ó Ñ ÒØ ÙÒ Ø Ð × º ÈÙ ×ØÓ ÕÙ ÙÒ ×Ø ר Ò Ó × Ö ¬Ò ØÓ Ý ÐÓ Ñ × Ö Ô Ó ÔÓ× Ð ¸ Ð Ù×Ó ÙÒ Ø Ð × Ð Ò Ð ÒÓ Ô Ö ÓÒ× Ð º À ר ÓØ ÓÒ¸ ÔÓ ÑÓ× Ö ÕÙ Ù ÐÕÙ Ö Ò ÓÕÙ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ × ´Ý ×Ù× Ø ÔÓ× Ö Ð ÓÒ Ó×µ ÔÙ Ù× Ö× ÓÑÓ ØÖ × ÓÒ Ó ÑÔÐ ÒØ ÓÒº ÈÓÖ ×Ù × ÑÔÐ ¸ Ù× Ö ÑÓ× Ð Ø ÔÓ LhashTable<Key> Å Ñ ÖÓ× ÔÖ Ú Ó× Hash Cache<Key,Data> ≡ ´ µ LhashTable<Key, Cmp> hash_table; Í× × LhashTable ¼ º ×ØÓ ÑÔÐ ¬Ò Ö ÙÒ Ð × Ù Ø ¸Ð Ù Ð× ¬Ò Ð × Ù ÒØ ÑÓ Ó ÒØÖ Hash Cache<Key,Data> ≡ ´ µ class Cache_Entry : public LhashTable<Key, Cmp>::Bucket { Data data; Å Ñ ÖÓ× ÔÖ Ú Ó× ÒØÖ Hash Cache<Key,Data> Å Ñ ÖÓ× ÔÙ Ð Ó× ÒØÖ Hash Cache<Key,Data> }; // fin class Cache_Entry ¬Ò ×
  • 485.
    5.3. Otros usosde las tablas hash y de la dispersi´n o 459 Cache Entry¸ Ù× Ò ÙÒ × Ò ¾ß º Í× × LhashTable ¼ º Ð Ó × ÖÚ ÓÖ Ð Ð Ú × Ö LhashTable<Key, Cmp>::Bucket¸ Ý Ð Ð ØÓ × ¬Ò ÓÑÓ Å Ñ ÖÓ× ÔÙ Ð Ó× ÒØÖ Hash Cache<Key,Data> ≡ ´ µ Data & get_data() { return data; } È Ö Ø ÖÑ Ò Ö Ù Ð ÐÓ× Ð Ñ ÒØÓ× ÓÒØ Ò Ó× Ò Ð × Ð Ñ × ÒØ ÙÓ¸ Ð × Ù Ø × Ð Ø Ð × × ÓÖ Ò Ò Ò ÙÒ ÓÐ × Ð ÒØÖ Ñ × ÒØ Ù Ñ ÒØ ¹ ר Ð Ñ ÒÓ× Ö ÒØ Ñ ÒØ Ù× º Ò ÐÙ Ö Ù× Ö ÙÒ ÓÐ × Ô Ö ¸ ¬Ò ÑÓ× Ð × Ù ÒØ ØÖ ÙØÓ ÒØ ÖÒÓ Ð ÒØÖ Ð Å Ñ ÖÓ× ÔÖ Ú Ó× ÒØÖ Hash Cache<Key,Data> ≡ ´ µ Dlink dlink_lru; // enlace a la cola lru ¬Ò × dlink lru¸ Ù× Ò ÙÒ º Ë Ø Ò ÑÓ× ÙÒ ÔÙÒØ ÖÓ Ð ÑÔÓ dlink lru¸ ÒØÓÒ × Ð × Ù ÒØ Ñ ÖÓ Dlink ´Ü ¾º º ´Ô Ò ¿µµ Ò Ö ÙÒ ÙÒ ÓÒ ÓÒÚ Ö× ÓÒ Å Ñ ÖÓ× ÔÖ Ú Ó× Hash Cache<Key,Data> +≡ ´ µ LINKNAME_TO_TYPE(Cache_Entry, dlink_lru); Í× × Cache Entry ¸ dlink lru ¸ Ò LINKNAME TO TYPE ¿º Ý ÙÒ ÔÙÒØ ÖÓ Ð ØÖ ÙØÓ dlink lru × Ó Ø Ò Ñ ÒØ Å Ñ ÖÓ× ÔÖ Ú Ó× ÒØÖ Hash Cache<Key,Data> +≡ ´ µ Dlink* link_lru() { return &dlink_lru; } Í× × dlink lru º ÄÊÍ × ÖÓÒ ÑÓ Ò Ð × Ð ×Ø Ö ÒØÐÝ Ù× ¸ Ù Ð Ð Ø Ö ÐÑ ÒØ × Ò ¬ Ñ ÒÓ× Ö ÒØ Ñ ÒØ ÙØ Ð Þ Ó º Ò ÒÙ ×ØÖÓ × ÙÖ×Ó ×Ø ÐÐ ÒÓ ÑÔÐ Ö ÑÓ× Ð Ö × Ñ × ÒØ Ù Ñ ÒØ Ó º dlink lru × ÙÒ Ó Ð ÒÐ ÒØÖÓ ÙÒ Ð ×Ø Ó Ð ¹ Ñ ÒØ ÒÐ Þ Ö ÙÐ Ö¸ ÙÝÓ ×Ø Ó × Ñ ÒØ Ò × Ð Ó ØÓ Hash Cache<Key,Data> Ñ ÒØ ÐÓ× × Ù ÒØ × ØÖ ÙØÓ× Å Ñ ÖÓ× ÔÖ Ú Ó× Hash Cache<Key,Data> +≡ ´ µ ¼ Dlink lru_list; // cabecera de la lista lru size_t num_lru; // n´mero de elementos en lista lru u ¬Ò × lru list¸ Ù× Ò ÙÒ × ¾¸ ¿¸ Ò º ÈÓÖ Ñ × ÒØ Ù ÕÙ ÔÙ × Ö ÙÒ ÒØÖ Ò Ð ¸ Ý × ØÙ ÓÒ × Ò Ð × Ù Ð × × Ö ÕÙ Ö ÕÙ ×Ø ÒÓ × ×Ù ×Ø ØÙÝ Ù Ò Ó Ð ×Ø ÐÐ ÒÓ Ò Ö × ÙÒ ÒÙ Ú ÒØÖ º ר Ø ÔÓ ÒØÖ × Ñ Ö ÓÑÓ ØÖ Ò ´lockedµ Ý × ÒØ ¬ Ñ ÒØ Ð × Ù ÒØ ØÖ ÙØÓ Å Ñ ÖÓ× ÔÖ Ú Ó× ÒØÖ Hash Cache<Key,Data> +≡ ´ µ bool locked; // indica si la entrada est´ trancada a Ù Ò Ó Ó Ø Ò ÑÓ× Ð ÒØÖ Ñ × ÒØ Ù Ñ ÒØ ¸ Ò × Ø ÑÓ× × Ö × ×Ø Ó ÒÓ ÓÒØ Ò Ò Ð Ø Ð × º È Ö ÐÐÓ¸ Ñ ÒØ Ò ÑÓ× ÙÒ ØÖ ÙØÓ ÕÙ Ò ×Ø ר Ó Å Ñ ÖÓ× ÔÖ Ú Ó× ÒØÖ Hash Cache<Key,Data> +≡ ´ µ ¼ bool is_in_hash_table; // indica si la entrada est´ contenida dentro de a // la tabla hash
  • 486.
    460 Cap´ ıtulo 5. Tablas hash ÄÓ× ØÖ ÙØÓ× Cache Entry ÓÒ ÓÖÑ Ò Ð × Ù ÒØ רÖÙ ØÙÖ Ô ØÓÖ key dlink de hash data locked is in hash table dlink inside dlink lru ËÓÒ ØÖ × Ó Ð × ÒÐ × Ð Ð Ù Ø Ð Ø Ð × ´dlink × µ¸ dlink lru ÕÙ × Ð Ð ÓÐ ÓÖ Ò ÔÓÖ Ø ÑÔÓ ×Ó Ý dlink inside ÕÙ × Ð Ð Ð ×Ø Ù Ø × ÕÙ ×Ø Ò ÒØÖÓ Ð Ø Ð × º ר ÐØÙÖ Ð ÜÔÐ ÓÒ ÕÙ Þ Ð Ù Ò Ý Ý ÔÐ ÒØ Ó ÓÑÓ Ó ÓÒ Ð Ù× Ö Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó Ò ÐÙ Ö ÙÒ Ò ÓÕÙ ÖÖ Óº Ë ÙØ Ð Þ × ÑÓ× Ð ×ÓÒ Ó Ð Ò Ð¸ ÒØÓÒ × Ø Ò Ö ÑÓ× Ð ÔÖÓ Ð Ñ ÕÙ Ð × ÒØÖ × × ÔÙ Ò ÑÓÚ Ö Ý ÐÐÓ ÑÔ ÕÙ ÓØÖ ×ØÖÙ ØÙÖ ØÓ ÔÙÒØ ÙÒ Ó ØÓ Cache Entryº ÓÒ Ð ×ÓÒ Ó ÔÓÖ Ó Ð × Ø Ò ÑÓ× Ð ÔÖÓ Ð Ñ Ø Ò Ö ÕÙ ¬Ò Ö Ó× ÙÒ ÓÒ × × Ý ÙÒ ÔÓ Ó Ñ × Ø ÑÔÓ ×Ø Öº × Ô٠׸ Ö ÑÓ× ÕÙ Ð Ì Hash Cache<Key,Data> ÒÓ Ô ÖØ Ò Ð Ö Ñ ÑÓÖ Ô Ö Ò Ò ÙÒ ÒØÖ cache entry ר × × Ô ÖØ Ò Ò ÙÒ ÖÖ ÐÓ ÓÒØ ÙÓ Ò Ø ÑÔÓ ÓÒרÖÙ ÓÒº ר ÑÓ Ó¸ ÔÖÓÚ ÑÓ× Ð ÔÖÓÔ Ó Ð ÓÑÔÙØ ÓÖ Ý ÒÓ ×Ô Ö ¹ ÑÓ× Ø ÑÔÓ Ò ÐÐ Ñ × Ð Ñ Ò ÓÖ Ñ ÑÓÖ ÁÒ ÐÑ ÒØ ¸ ר × ÒØÖ × ×Ø Ò Ò ÓÐ × Ó Ð × Ù ÒØ ÒÐ ¼ Å Ñ ÖÓ× ÔÖ Ú Ó× ÒØÖ Hash Cache<Key,Data> +≡ ´ µ Dlink dlink_inside; // enlace a la lista de entradas que ÙÝÓ ×Ø Ó × Ñ Ò Ó Ò Hash Cache<Key,Data> Ñ ÒØ ÐÓ× ØÖ ÙØÓ× ¼ Å Ñ ÖÓ× ÔÖ Ú Ó× Hash Cache<Key,Data> +≡ ´ µ ½ Dlink inside_list; // lista de cubetas ya apartadas y metidas en tabla hash size_t cache_size; // m´ximo n´mero de entradas que puede contener el cache a u ¬Ò × cache size¸ Ù× Ò ÙÒ × ¾ Ò º inside list¸ Ù× Ò ÙÒ × Ò º cache-size lru list ..... inside list ÙÖ º ר Ó Ò Ð Ð ÖÖ ÐÓ ÓÒØ ÙÓ Ù Ø ×º ÌÓ × Ð × ÒØÖ × Ô ÖØ Ò Ò Ð Ð ×Ø ÐÖÙº ÄÓ× ÒÐ × Ð × ÓÐ × ÙÒ Cache Entry × Ñ Ò Ò Ð × Ù ÒØ ÑÓ Ó ½º lru list ÓÐ ÒØÖ × ÓÖ Ò × × Ð Ñ × ÒØ Ù Ñ ÒØ ר Ð Ñ × Ö ÒØ Ñ ÒØ º ÁÒ ÐÑ ÒØ ¸ Ð ×Ø Ú Ó Ý ØÓ × ×Ù× ÒØÖ × ÔÖ ¹ Ô ÖØ × ÒÐ Þ × ÔÓÖ ×Ø ÓÐ º ¾º inside list Ð ×Ø ÒØÖ × Ò× ÖØ × Ò Ð Ø Ð × º ÁÒ ÐÑ ÒØ ¸ ר Ð ×Ø ר Ú ¸ ÔÙ × Ð ÒÓ ÓÒØ Ò Ò Ò ÙÒ Ð Ñ ÒØÓº Ä × ÒØÖ × Ò ×Ø Ð ×Ø
  • 487.
    5.3. Otros usosde las tablas hash y de la dispersi´n o 461 Ø Ñ Ò ×Ø Ò ÓÖ Ò × × Ð Ñ × ÒØ Ù Ñ ÒØ ר Ð Ñ × Ö Ò¹ Ø Ñ ÒØ º ÆÓØ ÑÓ׸ × Ò Ñ Ö Ó¸ ÕÙ ÔÙ ×ØÓ ÕÙ ×Ø ÓÐ ×ÓÐÓ ÓÒØ Ò Ò¹ ØÖ × ÐÓ Ñ ÒØ Ô ÖØ Ò ÒØ × Ð ¸ ×Ù ×Ø Ó ÒÓ Ò × Ö Ñ ÒØ × Ð Ñ ×ÑÓ ÕÙ Ð Ð ÓÐ lru list¸ Ð Ù Ð ÓÖ Ò ÒØÖ × ÕÙ Ô ÖØ Ò Ò Ó ÒÓ Ð º 45 lru list false 0 true inside list 1 false 0 false 1 false 2 false 2 375 3 3 true true 4 4 5 false false 6 58 false 5 7 true 8 false 6 9 false 479 locked list false 7 true ÙÖ º ר Ó ÙÒ Ø Ñ ÒÓ ÓÒ Ø Ð × Ø Ñ ÒÓ ½¼º Ë ÑÙ ×ØÖ Ð ÖÖ ÐÓ Ð Ø Ð × Ý Ð ÖÖ ÐÓ ÔÖ ¹ Ô ÖØ Ó Ù Ø ×º ÄÓ× ÒÐ × Ð Ø Ð × ×ÓÒ ÓÒØ ÙÓ׸ ÐÓ× Ð Ð ×Ø ÒØÖ × ÕÙ ×Ø Ò ÒØÖÓ Ð Ø Ð ÔÙÒØ Ó× Ý ÐÓ× Ð Ð ×Ø ÄÊÍ ØÖ Þ Ó׺ Ä ÒØÖ ÓÒ Ð Ú ¿ ¸ ÕÙ × ÓÐ × ÓÒ Ò Ð Ø Ð × ÓÒ Ð Ð Ú ¸ ר ØÖ Ò ÔÓÖ ×Ó Ô ÖØ Ò Ð Ð ×Ø locked listº Ä ÙÒ ÙÒ ÓÒ Ð Ð ×Ø inside list × ÔÖÓÚ Ö ÙÒ Ø Ö ÓÖ × ÑÔÐ ×Ó Ö ÐÓ× Ð Ñ ÒØÓ× Ð º Ë Ð Ø Ð ×Ø ÐÐ Ò ¸ ÒØÓÒ × inside list Ú Ò Ú º ¿º locked list Ä × ÒØÖ × ØÖ Ò × × × Ò lru list Ý × ÒØÖÓ Ù Ò Ò ÙÒ Ø Ö Ö Ð ×Ø ¬Ò × ½ Å Ñ ÖÓ× ÔÖ Ú Ó× Hash Cache<Key,Data> +≡ ´ µ ¼ ¾ Dlink locked_list; // lista de entradas trancadas size_t num_locked; // n´mero de elementos trancados u
  • 488.
    462 Cap´ ıtulo 5. Tablas hash Ð ÒÐ dlink lru × Ü ÐÙÝ ÒØ Ó Ð Ù Ø ×Ø Ò lru list Ó Ò locked list Ú ÒØÙ ÐÑ ÒØ ¸ ÙÒÕÙ ÒÓ Ö × Ö Ð ×Ó¸ ÔÙ ÙÑ ÒØ Ö× Ð Ø Ñ ÒÓ Ð º È Ö ÐÐÓ¸ × Ô ÖØ ÙÒ ÒÙ ÚÓ ÖÖ ÐÓ Cache Entryº È Ö ÔÓ Ö Ð Ö ÖÐÓ׸ ÐÓ× ÐÓÕÙ × ÖÖ ÐÓ× Cache Entry × ÒÐ Þ Ò Ò ÙÒ Ð ×Ø ÕÙ ¬Ò ÑÓ× Ð × Ù ÒØ ÑÓ Ó ¾ Å Ñ ÖÓ× ÔÖ Ú Ó× Hash Cache<Key,Data> +≡ ´ µ ½ ¾ typedef Dnode<Cache_Entry*> Chunk_Descriptor; Chunk_Descriptor chunk_list; ¬Ò × chunk list¸ Ù× Ò ÙÒ × ¾ Ò º Í× × Cache Entry Ò Dnode º chunk list × Ð ÙÐØ ÑÓ ØÖ ÙØÓ Hash Cache<Key,Data> Ý ¬Ò Ð Ð ×Ø ÐÓÕÙ × ´ ÖÖ ÐÓ× Cache Entryµº ר ÑÓ× Ð ×ØÓ× Ô Ö ¬Ò Ö Ð ÓÒרÖÙ ØÓÖ ¾ Å Ñ ÖÓ× ÔÙ Ð Ó× Hash Cache<Key,Data> ¾ ≡ ´ µ Hash_Cache(size_t (*hash_fct)(const Key&), const size_t & __hash_size, const size_t & __cache_size) : hash_table(hash_fct, __hash_size, false), num_lru(0), cache_size(__cache_size), num_locked(0) { // apartar entradas del cache Cache_Entry * entries_array = new Cache_Entry [cache_size]; // apartar el descriptor del arreglo std::auto_ptr<Chunk_Descriptor> chunk_descriptor (new Chunk_Descriptor (entries_array)); chunk_list.insert(chunk_descriptor.get()); for (int i = 0; i < cache_size; i++) // insertar Cache_Entry en lista lru insert_entry_to_lru_list(&entries_array[i]); chunk_descriptor.release(); } Í× × Cache Entry ¸ cache size ¼ ¸ chunk list ¾¸ Hash Cache ¸ Ò insert entry to lru list ¾ º Ó × ÖÚ ÑÓ× ÕÙ Ð ÓÒרÖÙ ØÓÖ Ô Ð ÙÒ Ñ ØÓ Ó ÒØ ÖÒÓ insert entry to lru list()¸ Р٠и ÙÒØÓ ÓÒ ÓØÖÓ× Ñ ØÓ Ó× ÔÖ Ú Ó× Ò ØÓÖÒÓ lru list¸ × ¬Ò Ò Ð × Ù ÒØ ÑÓ Ó ¾ Å Ñ ÖÓ× ÔÖ Ú Ó× Hash Cache<Key,Data> +≡ ´ µ ¾ ¿ void insert_entry_to_lru_list(Cache_Entry * cache_entry) { num_lru++; lru_list.insert(cache_entry->link_lru()); } void remove_entry_from_lru_list(Cache_Entry * cache_entry) { num_lru--; cache_entry->link_lru()->del(); } ¬Ò × insert entry to lru list¸ Ù× Ò ÙÒ × ¾ Ò º remove entry from lru list¸ Ù× Ò ÙÒ º Í× × Cache Entry Ò lru list º
  • 489.
    5.3. Otros usosde las tablas hash y de la dispersi´n o 463 Ä Ñ ×Ñ Ð × ÖÙØ Ò × × ¬Ò Ô Ö Ð Ð ×Ø locked listº Ð ¬Ò Ð ÓÐ lru list ÒÓ × ÓØÖÓ ÕÙ ÒרÖÙÑ ÒØ Ö Ð ÓÖ Ò × ÙÒ Ð ×Óº À Ý Ú Ö × × ØÙ ÓÒ × Ò Ð Ù Ð × ×Ø ÓÐ Ø Ò ÕÙ ØÙ Ð Þ Ö× ½º Ù Ò Ó × Ò× ÖØ ÙÒ ÒÙ ÚÓ Ð Ñ ÒØÓ Ò Ð ¸ Ó Ø Ò ÑÓ× ×Ù Cache Entry Ð Ö ÒØ lru list¸ Ð Ù Ð ÓÒØ Ò Ð Ð Ñ ÒØÓ Ñ × ÒØ Ù Ñ ÒØ Ó ¹Ö ÓÖ ÑÓ× ÕÙ ØÓ × Ð × ÒØÖ × Cache Entry × Ñ Ø Ò Ò ×Ø ÓÐ ÙÖ ÒØ Ð ÓÒרÖÙ ÓÒ Ð ¹º ¾º Ù Ò Ó Ö Ö Ò ÑÓ× ÙÒ Ð Ñ ÒØÓ ÒØÖÓ Ð ÑÓ× ×Ô ¬ Ö ÕÙ ×Ø × Ð Ñ × Ö ÒØ Ñ ÒØ Ó Ô Ö ÐÐÓ¸ Ð Ñ Ò ÑÓ× ×Ù Cache Entry ØÖ Ú × Ð Ó Ð ÒÐ dlink lru Ý ÐÓ Ö ¹ Ò× ÖØ ÑÓ× Ò Ð ØÖ × ÖÓº ×ØÓ ÐÓ Ö Ð Þ Ð × Ù ÒØ ÖÙØ Ò ¿ Å Ñ ÖÓ× ÔÖ Ú Ó× Hash Cache<Key,Data> +≡ ´ µ ¾ ¿ void do_mru(Cache_Entry * cache_entry) { cache_entry->link_lru()->del(); // elimine de su posici´n actual o lru_list.insert(cache_entry->link_lru()); // col´quelo en el trasero o } ¬Ò × do mru¸ Ù× Ò ÙÒ × ¿ Ò º Í× × Cache Entry Ò lru list º do mru() Ð ÒØÖ Ñ × Ö ÒØ Ñ ÒØ cache entry º ¿º Ù Ò Ó Ð Ñ Ò ÑÓ× ÙÒ Ð Ñ ÒØÓ Ð ÐÓ ÓÐÓ ÑÓ× Ò Ð Ö ÒØ ¸ ÓÒ ÕÙ ÒרÖÙÑ ÒØ Ð × Ù ÒØ ÖÙØ Ò ¿ Å Ñ ÖÓ× ÔÖ Ú Ó× Hash Cache<Key,Data> +≡ ´ µ ¿ ¿ void do_lru(Cache_Entry * cache_entry) { cache_entry->link_lru()->del(); // elimine de su posici´n actual o lru_list.append(cache_entry->link_lru()); // ins´rtelo en el frente e } Í× × Cache Entry Ò lru list º do lru() Ð ÒØÖ Ñ × ÒØ Ù Ñ ÒØ cache entry º ÓÖ ×Ø ÑÓ× ÔÖ ×ØÓ× Ô Ö ÑÓ×ØÖ Ö ÙÒ ÖÙØ Ò Ö Ø ¸ Ð Ù Ð × Ð ÓÒ Ð ÒØÖ Ñ × ÒØ Ù ´ ÓÒØ Ò Ó ÒÓ Ò Ð µÝÐ Ð Ñ × Ö ÒØ Ñ ÒØ ¿ Å Ñ ÖÓ× ÔÖ Ú Ó× Hash Cache<Key,Data> +≡ ´ µ ¿ void remove_entry_from_hash_table(Cache_Entry * cache_entry) { cache_entry->link_inside()->del(); hash_table.remove(cache_entry); cache_entry->is_in_hash_table = false; do_lru(cache_entry); } Cache_Entry * get_lru_entry() { // obtenga la entrada m´s antigua -la menos recientemente accedida a Dlink * lru_entry_link = lru_list.get_prev();
  • 490.
    464 Cap´ ıtulo 5. Tablas hash Cache_Entry * cache_entry = dlink_lru_to_Cache_Entry(lru_entry_link); // si cache_entry contenida en tabla ==> eliminarlo if (cache_entry->is_in_hash_table) remove_entry_from_hash_table(cache_entry); do_mru(cache_entry); // la entrada deviene la m´s recientemente accedida a return cache_entry; } ¬Ò × get lru entry¸ Ù× Ò ÙÒ º remove entry from hash table¸ Ù× Ò ÙÒ º Í× × Cache Entry ¸ do mru ¿ ¸ Ò lru list º remove entry from hash table() Ð Ñ Ò cache entry Ð Ø Ð × Ý Ð ØÓÖÒ ÓÑÓ Ð ÒØÖ Ñ × ÒØ Ù Ñ ÒØ º get lru entry() × Ð ÖÙØ Ò Ö Ø ÕÙ × Ð ÓÒ Ð ÒØÖ Ñ × ÒØ Ù Ñ ÒØ Ý ÕÙ × ÒÚÓ Ù Ò Ó × Ò× ÖØ ÙÒ ÒÙ ÚÓ Ð Ñ ÒØÓ Ò Ð º ÜÔÐ Ó ×ØÓ¸ ÔÓ ÑÓ× ÑÓ×ØÖ Ö Ð Ò× Ö ÓÒ Å Ñ ÖÓ× ÔÙ Ð Ó× Hash Cache<Key,Data> ¾ +≡ ´ µ ¾ Cache_Entry * insert(const Key & key, const Data & data) { Cache_Entry * cache_entry = get_lru_entry(); // obtener entrada m´s antigua a cache_entry->get_key() = key; // escribirle el par cache_entry->get_data() = data; inside_list.insert(cache_entry->link_inside()); // ins´rtela en inside_list e hash_table.insert(cache_entry); // insertarla en la tabla hash cache_entry->is_in_hash_table = true; return cache_entry; } Í× × Cache Entry ¸ get lru entry ¿ ¸ Ò inside list ¼ º Ð Ñ ÒØ Ò ÙÒ ×Ù ¹ ÓÒ ÙÒØÓ ÐÓ× ÙÐØ ÑÓ× cache size Ð Ñ ÒØÓ× Ó× ÓÒ Ð ×Ô Ö ÒÞ ÕÙ ¸ × × Ö Ö Ò Ò ÒÙ ÚÓ¸ ÒØÓÒ × ÒÓ × Ô Ù ÙÒ Óר ÐØÓ ÔÓÖ ×Ù Ù×ÕÙ Ò Ð ÓÒ ÙÒØÓ ÔÖ Ò Ô Ðº È Ö Ù× Ö Ò Ð ÔÖÓÚ ÑÓ× Ð × Ù ÒØ ÖÙØ Ò Å Ñ ÖÓ× ÔÙ Ð Ó× Hash Cache<Key,Data> ¾ +≡ ´ µ Cache_Entry * search(const Key & key) { // buscar en la tabla hash Cache_Entry * cache_entry = static_cast<Cache_Entry*>(hash_table.search(key)); if (cache_entry != NULL) // ¿fue encontrada la clave? { // s´ ==> hacerla la m´s recientemente usada ı a do_mru(cache_entry); move_to_inside_front(cache_entry); } return cache_entry; } Í× × Cache Entry Ò do mru ¿º Ä Ù×ÕÙ Ö Ö × Ð ÒØÖ Ò Ð Ò Ð × ÒØ Ó ÕÙ Ð Ð Ñ ×Ö Ò¹ Ø Ñ ÒØ º È Ö ØÖ Ò Ö ÙÒ ÒØÖ × Ö¸ Ô Ö × ÙÖ Ö ÕÙ ÐÐ ÒÓ × × Ð Ù Ò Ó Ó ÙÖÖ ÙÒ Ò× Ö ÓÒ¸ × ÑÔÐ Ð × Ù ÒØ Ñ ØÓ Ó Å Ñ ÖÓ× ÔÙ Ð Ó× Hash Cache<Key,Data> ¾ +≡ ´ µ void lock_entry(Cache_Entry * cache_entry)
  • 491.
    5.3. Otros usosde las tablas hash y de la dispersi´n o 465 { remove_entry_from_lru_list(cache_entry); insert_entry_to_locked_list(cache_entry); cache_entry->lock(); } Í× × Cache Entry Ò remove entry from lru list ¾º Ò ÐÓ Ñ ÒØ ¸ Ð ÒØÖ × ÔÙ ×ØÖ Ò Ö Å Ñ ÖÓ× ÔÙ Ð Ó× Hash Cache<Key,Data> ¾ +≡ ´ µ void unlock_entry(Cache_Entry * cache_entry) { remove_entry_from_locked_list(cache_entry); insert_entry_to_lru_list(cache_entry); cache_entry->unlock(); } Í× × Cache Entry Ò insert entry to lru list ¾º Ä Ð Ñ Ò ÓÒ ÙÒ Ð Ñ ÒØÓ Ò Ð ÔÙ Ô Ö Ö ÙÒ ÓÔ Ö ÓÒ Ö ÙÒ ÒØ ÒÒ × Ö ¸ ÔÙ × ×Ø ÓÒ Ø Ò ×ÓÐÓ ÒÓ Ö Ñ × ÙÒ ÒØÖ Ô Ö ÕÙ ×Ø × Ð Ð º Ë Ò Ñ Ö Ó¸ Ð ÓÒÓ Ñ ÒØÓ ÖØ ÖÓ ÕÙ ÙÒ Ð Ú Ñ × × Ö ÒÓ ×ÓÐÓ Ô ÖÑ Ø ×ÔÓÒ Ö ×Ù ÒØÖ Ô Ö ÙÒ Ò× Ö ÓÒ¸ × ÒÓ ÕÙ ÔÓØ Ò ÓØÖ × Ð Ú × Ò ¬ Ö× Ð º ÈÓÖ ×Ó¸ × ÙÒ Ð Ò ÓÐ Ð ÔÐ ÓÒ¸ ÔÙ Ó ÒÓ × Ö ÑÙÝ Ú Ð Ó× Ð × Ù ÒØ ÔÖ Ñ Ø Ú Ð Ñ Ò ÓÒ Å Ñ ÖÓ× ÔÙ Ð Ó× Hash Cache<Key,Data> ¾ +≡ ´ µ void remove(Cache_Entry * cache_entry) { remove_entry_from_hash_table(cache_entry); } Í× × Cache Entry Ò remove entry from hash table ¿º Ä × Ð ÓÒ Ð Ø Ñ ÒÓ Ð ÔÙ × Ö Ö Ø Ô Ö Ð × ÑÔ ÒÓ ÐÓ Ð ÙÒ × ×Ø Ñ º ÍÒ Ô Ò×Ù¬ ÒØ ÔÙ Ö ÕÙ Ð × Ò× Ö ÓÒ × Ö ÑÔÐ Ò ÒØÖ × ÕÙ × Ö Ò Ö Ö Ò ×º Ë ×ØÓ Ó ÙÖÖ ¸ ÒØÓÒ × Ð Ù×ÕÙ × ÑÔÖ × Ö Ú Ò Ý Ð × ÑÔ ÒÓ Ð ×Ó ÐÓ Ð × Ö Ö ÙÒ ÔÙÒØÓ Ô ÓÖ ÕÙ × ÒÓ × ØÙÚ × Ð º ר ÒÓÑ ÒÓ × Ð ÒÓÑ Ò Ø Ö × Ò ¾ Ý ÔÙ × Ö ×ÙÑ Ñ ÒØ ÓרÓ×Ó × Ð × ÑÔÐ Ò Ð Ñ ÒÓ Ö Ø Ó ÙÒ × ×Ø Ñ Ù ×Ø ÓÒ ÕÙ ×Ù Ð × Ö Ð ×Óº × Ô٠׸ Ù Ò Ó × ÓÔØ ÔÓÖ Ð ÑÔÐ Ó ÙÒ ¸× ¸ Ò Ð Ñ ÝÓÖ Ñ ÔÓ× Ð ¸ ×ÔÓÒ Ö ÙÒ ×Ø Ñ ÓÒ ÔÖ × Ð Ö Ð ÓÒ Ö Ö Ò Ð ÓÒ ÙÒØÓº Ò ×ØÓ ÔÙ × Ö ÑÙÝ ÑÔÓÖØ ÒØ Ð Ö Ð ÓÒ ¼¹¾¼ ´Ü ¿º º½ ´Ô Ò ¾¾ µµ¸ Ô ÖÓ¸ Ù ÒØ Ð Óר ÕÙ ÔÙ ÖÖ Ö ÙÒ Ñ Ó Ó ÖÖÓÖ Ò Ð ×Ø Ñ ÓÒ¸ × Ö ÓÑ Ò Ð ÕÙ Ð Ø Ñ ÒÓ Ð ÔÙ Ùר Ö× Ò Ø ÑÔÓ Ù ÓÒº Ä × ÕÙ × ÙÖ ÒØ Ð Ù ÓÒ × Ö Ú Ð Ò × Ö Ó Ö ÙÒ Ùר ¸ ÒØÓÒ × ×Ø × ÔÓ× Ð ¸ ÐÓ Ù Ð ×Ø × Ö ÙÒ Ò ÓÕÙ Ò Ñ Ó ÓÑÓ Ð ÙÒ Ø Ð × Ð Ò Ðº Ò Ú ÖØÙ ×ØÓ¸ × Ò ÑÓ× Ð × Ù ÒØ ÖÙØ Ò ÜÔ Ò× ÓÒ Å Ñ ÖÓ× ÔÙ Ð Ó× Hash Cache<Key,Data> ¾ +≡ ´ µ void expand(const size_t & plus_size) { ¾ Ä ØÖ Ù ÓÒ Ð Ø Ö Ð ×Ø Ø ÖÑ ÒÓ × Ð ÔÓÖÕÙ Ô Ò× ÑÓ× ÕÙ ÒÓ Ü ×Ø ÙÒ ÕÙ Ú Ð ÒØ Ö ØÓ ר ÐÐ ÒÓº Ò Ð ÓÒØ ÜØÓ Ð ¸ Ø Ö × Ò Ð ÓÖ Þ ­ Ð Ö ¸ Ô٠׸ ÔÓÖ ÐÓ Ò Ö Ð¸ Ù Ò Ó ÙÒ ÒØÖ Ò ×Ø ר Ó ÖÖ ÙÒ Ô Ò Ð Ñ × Ó × Ú Ö ×Ó Ö Ð × ×Ø Ñ ÕÙ ÐÓ Ù× º
  • 492.
    466 Cap´ ıtulo 5. Tablas hash const size_t new_cache_size = cache_size + plus_size; Cache_Entry * entries_array = new Cache_Entry [plus_size]; std::auto_ptr<Chunk_Descriptor> // apartar el descriptor chunk_descriptor (new Chunk_Descriptor (entries_array)); // Calcular nuevo tama~o de tabla y relocalizar sus entradas n const float curr_hash_ratio = 1.0*cache_size/hash_table.capacity(); const size_t new_hash_capacity = new_cache_size/curr_hash_ratio; hash_table.resize(new_hash_capacity); for (int i = 0; i < plus_size; i++) // meter nuevas entradas en lru_list insert_entry_to_lru_list(&entries_array[i]); chunk_list.insert(chunk_descriptor.release()); cache_size = new_cache_size; } Í× × Cache Entry ¸ cache size ¼ ¸ chunk list ¾ ¸ expand ¿ ¸ insert entry to lru list ¾ ¸ Ò lru list º ÆÓ× Ö ×Ø ÙÒ Ø ÐÐ ÙÐØ ÑÓ ÙÒ Ø Ö ÓÖ ×Ó Ö ÐÓ× Ð Ñ ÒØÓ× Ð Å Ñ ÖÓ× ÔÙ Ð Ó× Hash Cache<Key,Data> ¾ +≡ ´ µ class Iterator : public Dlink::Iterator { Iterator(Hash_Cache & cache) : Dlink::Iterator(&cache.inside_list) { } Cache_Entry * get_current() { return Cache_Entry::dlink_inside_to_Cache_Entry(Dlink::Iterator::get_current()); } }; Í× × Cache Entry ¸ Hash Cache ¸ Ò inside list ¼ º ÈÙ ×ØÓ ÕÙ × Ø Ö ×Ó Ö Ð Ð ×Ø inside list¸ ×ÓÐÓ ÐÓ× Ð Ñ ÒØÓ× ÓÒØ Ò Ó× Ò Ð ×ÓÒ Ú ×ØÓ׺ ÈÙ ×ØÓ ÕÙ ×Ø Ð ×Ø ר ÓÖ Ò ÔÓÖ Ø ÑÔÓ ×Ó¸ Ð ÓÖ Ò Ú × Ø × × Ð Ñ × Ö ÒØ Ñ ÒØ Ó ×Ø Ð Ñ ÒÓ× Ö ÒØ Ñ ÒØ Óº 5.4 Notas bibliogr´ficas a Ò ×Ù Ü Ð×Ó Ð ÖÓ ×Ó Ö ÔÖÓ Ö Ñ ÓÒ¸ Ú Ò Ö Ä Ò Ò ¾ Ñ Ò ÓÒ ¸ Ñ Ø ÓÖ Ñ ÒØ ¸ ÕÙ × Ð Ð ØÓ × ×Ø Ö Ò ÙÒ ×Ð × ÖØ Ý Ð × Ò × Ó Ö ÙÒ ×ÓÐ ×ØÖÙ ¹ ØÙÖ ØÓ׸ ÒØÓÒ × ×Ø × Ö Ð Ø Ð × º ÔÓÖ ÕÙ ÙÒ ÔÖÓ Ö Ñ ÓÖ Ú ÖØÙÓ×Ó ÓÒ¹ × Ö Ø Ò Ú Ø Ð ×Ø רÖÙ ØÙÖ ÉÙ Þ ÔÓÖÕÙ Ð ÒÓ × ÙÒÓ ÒÓ × ÙÒÓ ÐÓ× × Ö × Ø Ô Ñ ÒØ ÓÑ Ò Ó× ÔÓÖ ÙÒ Ø ÖÑ Ò ×Ø Ð ÑÙÒ Óº Ò ÐÓ ÓÒ Ö ØÓ Ð ÔÖÓ Ö Ñ ÓÒ¸ ÔÓ ÑÓ× Ö ÕÙ Ð ×Ô Ö× ÓÒ × ÙÒ Ø Ò ÓÑÔÐ Ø Ñ ÒØ × Ò Ð ÔÖÓ Ð × Ö¸ ÖÙ Ñ ÒØ Ð Ò Ó¸ Ò ×Ó ÕÙ Ò ×ØÖ ÐÑ ÒØ ÐÐ Ñ ÑÓ× Ð ×Ù ÖØ Ó Þ Ö¸ Ý ÕÙ ÓÝ × Ñ Ö ÓÒ × Òº ÓÑÓ × Ö ÜØÖ Ò ×Ø ¬Ð ÔÓÖ Ð Ø ÖÑ Ò ×ÑÓ ÕÙ ÑÙÝ ÔÓ Ó× ÔÖÓ Ö Ñ ÓÖ × × Ô Ö Ø Ò ÕÙ ÑÔÐ Ö ÙÒ Ù Ò ÙÒ ÓÒ ×Ô Ö× ÓÒ Ô Ö Ù× Ö Ò ÙÒ ÖÖ ÐÓ¸ × Ò ÔÖ Ó ÙÔ Ö× Ð × ÓÐ × ÓÒ × Ò Ñ Ö Ö Ð × Ð ×¸ Ø Ò ÑÙ × Ñ ÓÖ × ÔÖÓ Ð × Ò ÓÒØÖ Ö Ö Ô Ñ ÒØ ÙÒ Ð Ú ÕÙ Ð Ñ Ö Ù×ÕÙ × Ù Ò Ðº Ð ÓÑ Ö ÕÙ Ó ÔÖ Ö Ö × Ö ÓÖØÙÒ Ó ÕÙ Ù ÒÓ¸ Ø Ò ÙÒ ÔÖÓ ÙÒ Ô Ö×Ô Ø Ú Ð Ú º Ä ÒØ Ø Ñ Ö ÓÒÓ Ö ÕÙ ÙÒ Ö Ò Ô ÖØ Ð Ú ÔÒ Ð ×Ù ÖØ º Ñ Ó Ô Ò× Ö Ò ØÓ Ó ÐÓ Ø ÒØÓ ×Ó Ö ÐÓ ÕÙ ÒÓ Ø Ò ÑÓ× ÓÒØÖÓкºº ¾ º ¾ ÈÖ Ñ ÙÐÓ Ð Ô Ð ÙÐ Å Ø ÈÓ ÒØ º
  • 493.
    5.5. Ejercicios 467 ר Ø ÙÒ Ô Ð ÙÐ ÏÓÓ Ý ÐÐ Ò ÒÓ× Ò ÙÒ ÔÓ Ó Ð × Ò ÕÙ Ò ×Ø ÔÓ Ø Ò ÑÓ× Ð Þ Öº À ÙÒÓ× ¾ ¼¼ ÒÓ× ÑÓ Ö ØÓ¸ ÕÙ Þ ÙÒÓ ÐÓ× ÔÖ Ñ ÖÓ× ÕÙ Ô Ò× ÒÐ ØÙ Ð ØÓÑÓ¸ ÕÙ Ò Ð Þ Ö Ý Ð ×ÔÓÒØ Ò Ý ÓÒ× Ò º Å ÕÙ Ú ÐÓ Ú Ó Ò Ð ×Ù ÖØ ÙÒ ØÓÖ Ø ÖÑ Ò ÒØ Ô Ö Ð ×Ø ÒÓ ÐÓ× ÔÙ ÐÓ׺ Ð ¹ ÓÖ Þ Ð Ú ÓÑÓ ÙÒ Ö Ó ÙÝÓ ­Ù Ö ÓØ ÒÓ Ð ×Ù ÖØ ÔÓ Ñ Ö ÙÒ ÒÙÒ ÓÒ¸ ÔÓÖ ÑÔÐÓº Ó × × ÒØ Ó Ð ÓÖ Ó¸ Ð Ö ÓÑ Ò ÔÖ Ô Ö Ö× Ô Ö Ù Ò Ó Ð ×Ù ÖØ ØÓÖÒ × Ý ÐÓ Ð ÓÖ Þ ÓÒ Ð ÓÒרÖÙ ÓÒ ÙÒ ÕÙ º Ò Ð Ú ÑÓ ÖÒ ×ØÓ ÔÙ ØÖ Ù Ö× Ð ÓÖÖÓº Ò Ð Ú Ð ÔÖÓ Ö Ñ ÓÒ ÙÒ ×ØÖ Ø Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ ×º Ë ÙÒ ÃÒÙØ Ð ×Ô Ö× ÓÒ Ù × Ù ÖØ Ò Ô Ò ÒØ Ñ ÒØ ÔÓÖ Àº Ⱥ ÄÙ Ò ½ Ý Ñ Ð Ø Ð Ò ½ ¿º Ð ÙÐØ ÑÓ ÖØ ÙÐÓ Ñ Ò ÓÒ Ð ×ÓÒ Ó Ð ¹ Ò Ðº Ð Ò Ò Ñ ÒØÓ × Ô Ö Ó Ý Ð Ñ ØÓ Ó Ú × ÓÒ Ô Ö ÔÖ Ñ ÖÓ × Ù ÖØÓ ÔÓÖ ÙÑ Ý º Ð ×ÓÒ Ó Ð Ò Ð Ù ×Ù Ö Ó ÔÓÖ Ö× ÓÚ ½¼ ¸ ÙÝÓ Ò Ð × ×¸ ÜØÖ Ñ Ñ ÒØ ¬ Ùй ØÓ×Ó¸ Ù × Ù ÖØÓ ÔÓÖ ÔÖ Ñ Ö Ú Þ ÔÓÖ ÃÒÙØ Ò ½ ¾¸ ÓÑÓ Ð Ñ ×ÑÓ ÐÓ ÜÔÐ Ò ÙÒ ÒÓØ Ô Ô Ò ½ Ô º ¿º Ð ÑÓ ÐÓ ×ÓÒ Ó Ð¸ ÜØÖ Ñ Ñ ÒØ ÙØ Ð ÓÑÓ Ñ Ö Ó Ò Ð × × Ð × Ø Ò × ×ÓÒ Ó¸ Ù ÒØÖÓ Ù Ó ÔÓÖ È Ø Ö×ÓÒ Ò ½ ¾ º Ä ÔÖ Ó Ð ÙÑÔÐ ÒÓ× × ÙÒ ÔÖÓ Ð Ñ Ð × Ó Ð Ø ÓÖ ÔÖÓ Ð ×º ÍÒ ÔÖ × ÒØ ÓÒ Ö ÙÖÓ× ÔÙ Ò ÓÒØÖ Ö× Ò Ð Ð × Ó ÐÐ Ö ½½ º ר Ô Ö Ó Ù Ò Ö ÐÞ Ò Ð Ð Ö ÙÒ ÓÒ Q Ê Ñ ÒÙ Ò ½¿ º ÍÒ Ò Ð × × ×Ù ÔÐ ÓÒ Ò Ð ÔÖÓ Ö Ñ ÓÒ ÔÙ Ò ÓÒØÖ Ö× Ò ½¾ º Ä Ø Ò ÔÖ × ÒØ Ò ×Ø Ø ÜØÓ Ô Ö Ð Ñ Ò Ö Ð × Ð × Ñ Ö × DELETED ÓÒ Ð Ó Ð × Ù ÔÖ × ÒØ ÔÓÖ ÔÖ Ñ Ö Ú Þ Ò ½ º ÍÒ ÑÔÐ ÒØ ÓÒ ÓÒ Ö Ø ¸ Ô ÖØ Ð ÕÙ ÜÔÙ ×Ø ÒÓ × ÓÒÓ ÔÙ Ð Ñ ÒØ º Ä ×Ô Ö× ÓÒ ÙÒ Ú Ö× Ð Ù × Ù ÖØ Ò ½ ÔÓÖ ÖØ Ö Ý Ï Ñ Ò º Ä ×Ô Ö× ÓÒ Ð Ò Ð Ù ÔÓÔÙÐ Ö Þ ÔÓÖ Ð È ÙÐ Ä Ö×ÓÒ ¾¾ Ý ×Ù × Ù Ö Ñ ÒØÓ Ù Ö ÔÓÖØ Ó ÔÓÖ ÔÖ Ñ Ö Ú Þ Ò ½ ¼ ÔÓÖ Ï ØÓÐ Ä ØÛ Ò ¾ ¸ Ò Ð ÓÑ Ò Ó Ð × × × ØÓ׺ Ä ×Ô Ö× ÓÒ Ô Ö Ø Ô Ö ¬Ò Ð × ÐÓ× × Ø ÒØ º ÍÒ ÖØ ÙÐÓ Ô Ö Ñ Ø Ó × ÐÐ º 5.5 Ejercicios ½º × Ö ÙÒ Ð ÓÖ ØÑÓ Ð Ñ Ò ÓÒ ÙÒ Ø Ð × ÓÒ ÓÐ × ÓÒ × × Ô Ö Ñ ÒØ Ò Ò × Ò Ð ×Ø × × ÑÔÐ Ñ ÒØ ÒÐ Þ ×º ¾º Ä ÙÒ ÓÒ Ð Ñ Ò ÓÒ ÐÓ× Ì LhashTable<Key> Ý DynLhashTable<Key, Record> ÒÓ Ú Ö ¬ × Ð Ö ×ØÖÓ Ð Ñ Ò Ö Ô ÖØ Ò Ð Ø Ð º × ÙØ Ö ÒØ × Ò ÓÕÙ × ÔÖ ØÙ Ö ×Ø Ú Ö ¬ ÓÒº ¿º ÑÙ ×ØÖ Ð ÔÖÓÔÓ× ÓÒ º¾º ´·µ º ÜÔÐ ÕÙ Ø ÐÐ Ñ ÒØ Ð ÓÒרÖÙ ÓÒ Ð ÜÔÖ × ÓÒ ´ º¾ µº
  • 494.
    468 Cap´ ıtulo 5. Tablas hash º ×ÙÑ Ò Ó Ò Ò Ñ ÒØÓ × Ô Ö Ó ÓÒ Ð ×Ø × × ÑÔÐ × Ý ÙÒ Ø Ð ÔÙÖÓ× ÔÙÒ¹ Ø ÖÓ׸ Ð ÙÐ Ð ÓÒ×ÙÑÓ ×Ô Óº Ô ÖØ Ö Ù Ð Ú ÐÓÖ α Ý ST Ð Ö ¹ ÓÒ Ñ ÒØÓ ÖÖ Ó × Ñ ÒÓ× ÓרÓ×Ó Ò ×Ô Ó º ÓÒ× Ö ÙÒ Ø Ð × ÓÒ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ × ÔÓÖ Ò Ò Ñ ÒØÓ × Ô Ö Ó ´ ÓÒ Ð ×Ø × ÒÐ Þ ×µ¸ ÙÒ Ø Ñ ÒÓ Ø Ð M = 13 Ý ÙÒ ÙÒ ÓÒ × h(k) = k ÑÓ Mº ´µ Ù Ð Ø Ð Ö ×ÙÐØ ÒØ Ð × Ù ÒØ × Ù Ò Ò× Ö ÓÒ 23, 13, 20, 5, 7, 2, 40, 50, 30, 45, 12, 21, 33, 34 ´ µ ×ÙÑ Ò Ó ÕÙ Ð × Ð Ú × ×Ø Ò ÒØÖ ½ Ý ½¼¼¸ ÕÙ ÒÓ × Ö Ô Ø Ò Ý ÕÙ Ð Ú Ø Ò Ð Ñ ×Ñ ÔÖÓ Ð Ù× Ö× ¸ Ð ÙÐ º ÈÖÓ Ð ÕÙ ÙÒ Ð Ú × Ò Ù ÒØÖ Ò Ð Ø Ð º º ÈÖÓ Ð ÕÙ ÙÒ Ð Ú × Ò Ù ÒØÖ Ò Ð Ø Ð Ý ÕÙ × Ö ÕÙ Ö Ö ÓÖÖ Ö Ó× ´¾µ Ó Ñ × ÒÓ Ó× ÙÖ ÒØ ×Ù Ù×ÕÙ º º ×ÙÑ ÙÒ Ø Ð × ÓÒ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ × ÓÒ Ò Ò Ñ ÒØÓ × Ô Ö Óº ×ÙÑ ÙÒ ÒØ ×Ô Ö Ð Ú × 105 ÓÒ ÙÒ ×Ú ÓÒ 104º ËÙ Ö ÙÒ Ø Ñ ÒÓ Ø Ð Ø Ð ÕÙ Ð ØÓÖ Ö α ÒÓ Ü Ð 97 ±º Ð ÙÐ Ð ÐÓÒ ØÙ ×Ô Ö Ð ×Ø ÓÐ × ÓÒ li Ý ×Ù ×Ú ÓÒ Ø Ô º º Ä ×ØÖÙ ØÙÖ Ù Ø ÙØ Ð Þ ÔÓÖ Ð Ì ODhashTable<Key, Record> ÙØ Ð Þ ÙÒ ÑÔÓ ×Ô Ð ÒÓÑ Ò Ó probe typeº ÙÞ Ð Ñ Ò Ö Ò ÕÙ × ÔÙ Ø ÖÑ Ò Ö Ò Ø ÑÔÓ Ù ÓÒ Ð Ò ÓÖÑ ÓÒ ÔÓÖØ ÔÓÖ ×Ø ÑÔÓº Ó ÓØÖÓ¸ ÓÑÓ ÔÙ ÔÖ × Ò Ö× ×Ø ÑÔÓ º Ò Ð Ì ODhashTable<Key, Record>¸ ÙÞ ÙÒ Ñ Ò Ö ÔÖ × Ò Ö ÐÓ× ÑÔÓ× Ð Ù Ø status Ý probe typeº ´·µ ½¼º ÙÒ Ø Ð × ÓÒ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ × ÔÓÖ Ö ÓÒ Ñ ÒØÓ ÖØÓ¸ ¹ ÙÞ ÙÒ Ð ÓÖ ØÑÓ Ò Ö Ð Ó× × × ÕÙ Ö ÙÞ Ð Ñ Ò ÑÓ Ð ÒØ Ù Ø× ÓÒ ×Ø Ó DELETEDº Ð Ð ÓÖ ØÑÓ ÔÓ Ö × Ö ÔÐ Ó Ô Ö Ù ÐÕÙ Ö ×ØÖ Ø Ö ×ÓÐÙ ÓÒ ÔÓÖ Ö ÓÒ Ñ ÒØÓ ÖØÓº Ä ÔÖ Ñ Ö × ÓÒ× ×Ø Ò Ü Ñ Ò Ö Ð Ø Ð Ý Ñ Ö Ö ÓÒ EMPTY ØÓ × Ð × ÒØÖ × ÓÒ Ú ÐÓÖ DELETEDº Ä × ÙÒ × ×ØÙ Ð × Ù Ø × ÓÒ Ú ÐÓÖ BUSY Ý Ø ÖÑ Ò Ù Ð × Ù Ø × ÓÒ ×Ø Ó EMPTY Ò× Ö Ñ × Ð ×Ø Ó DELETED Ñ Ò Ö ÕÙ Ð Ð Ú ÔÙ × Ö ÐÓ Ð Þ º ÆÓ ר Ô ÖÑ Ø Ó ÑÓÚ Ö ÐÓ× Ö ×ØÖÓ× ÓÒØ Ò Ó× Ò Ð × Ù Ø ×º ´·µ ½½º ÒÙÒ Ð × Ú ÒØ × Ý ×Ú ÒØ × Ð Ð ÓÖ ØÑÓ ÒÙÒ Ó Ò Ð ÔÖ ÙÒØ ÒØ Ö ÓÖº ½¾º Ð ÙÐ ÙÒ ÜÔÖ × ÓÒ × Ñ Ð Ö ´ º¾ µ ÕÙ ÓÑÔ Ö Ð Óר Ò ×Ô Ó Ð Ì ODhashTable<Key, Record> ÓÒ Ð OLHashTable<Key,Record>º ½¿º Ë ÙÒ Ø Ð × Ø Ñ ÒÓ m = 23 ÓÒ Ö ×ÓÐÙ ÓÒ ÓÐ × ÓÒ × ÔÓÖ Ö ¹ ÓÒ Ñ ÒØÓ ÖØÓ Ý Ù×Ó Ó× ÙÒ ÓÒ × × ´µ h1(k) = k ÑÓ 23
  • 495.
    5.5. Ejercicios 469 ´µ h2(k) = 1 + (k ÑÓ 19) ×ÙÑ ÓÑÓ ×ÕÙ Ñ × Ò ÓÒ Ð Ñ ÒØÓ Ð ÓÖÑÙÐ (h1(k) + i × h2(k)) ÑÓ m, m = 23¸ ÓÒ i × Ð ÒÙÑ ÖÓ ÓÐ × ÓÒ × k Ð ÑÓÑ ÒØÓ Ð Ò× Ö ÓÒº × Ö¸ × h1(k) ÒÓ Ø Ò ÓÐ × ÓÒ ´i = 0µ¸ ÒØÓÒ × Ð Ð Ñ ÒØÓ × Ò× ÖØ Ó Ò Ð ÔÓ× ÓÒ h1(k)º Ë Ý ÙÒ ÓÐ × ÓÒ¸ ÒØÓÒ × Ð Ð Ñ ÒØÓ × Ò× ÖØ Ó Ò h1(k) + h2(k) × Ý Ó× ÓÐ × ÓÒ ×¸ ÒØÓÒ × Ð Ð Ñ ÒØÓ × Ò× ÖØ Ó Ò h1(k) + 2h2(k)¸ Ý × ×Ù × Ú Ñ ÒØ º ´ µ × Ö Ð ÔÓ× ÓÒ ÒØÖÓ Ð Ø Ð ´Ó Ù Ð Ø Ð µ ÐÙ Ó Ð × Ù ÒØ × ÙÒ Ò× Ö ÓÒ 4 13 27 31 28 26 40 23 47 1 ´ µ ×ÙÑ ÕÙ Ó ÙÖÖ ÙÒ ÓÒ×ÙÐØ ÒØÖ ÙÒ ØÓØ Ð 20 ÔÓ× Ð × Ð Ú ×º º Ù Ð × Ð ÔÖÓ Ð Ò ÓÒØÖ Ö Ð Ð Ú º Ù Ð × Ð ÔÖÓ Ð ÒÓ Ò ÓÒØÖ Ö Ð Ð Ú º Ù Ð × Ð ÔÖÓ Ð ÕÙ ÙÒ Ù×ÕÙ Ü ØÓ× × Ö ×Ù ÐØ ÓÒ Ð ÔÖ Ñ Ö ÙÒ ÓÒ × Úº Ù Ð × Ð ÔÖÓ Ð ÕÙ ÙÒ Ù×ÕÙ Ü ØÓ× × Ö ×Ù ÐØ ÓÒ Ð × ÙÒ ÙÒ ÓÒ × ½ºÀ ÙÒ Ò Ð × × ÓÑÔ Ö Ø ÚÓ ÒØÖ ÐÓ× Ì DynLhashTable<Key, Record> Ý ODhashTable<Key, Record>º ÒÙÒ Ú ÒØ ׸ ×Ú ÒØ ׸ × Ñ Ð ØÙ × Ý Ö¹ Ò ×º ½º ÙÒ Ø Ð × Ð Ò Ð¸ Ð ÙÐ Ð ÒØ ×Ô Ö ÐÐ Ñ × Ð ÙÒ ÓÒ × Ú Þ ÕÙ Ó ÙÖÖ ÙÒ Ò× Ö ÓÒ Ó Ù×ÕÙ º ´·µ ½ º Ä ÑÔÐ ÒØ ÓÒ DynLhashTable<Key, Record> Ö LhashTable<Key> Ð ÑÔÐ ÒØ ÓÒ Ý Ô ÖØ ×Ù ÒØ Ö Þº ÈÙ ×ØÓ ÕÙ DynLhashTable<Key, Record> × Ö Ú ÔÙ Ð Ñ ÒØ LhashTable<Key>¸ Ý Ñ ØÓ Ó× LhashTable<Key>¸ ÕÙ ÒÓ ×ÓÒ Ô ÖØ Ð ÒØ Ö Þ DynLhashTable<Key, Record>¸ ÕÙ ÔÙ Ò ÐÐ Ñ Ö× × ÙÒ Òר Ò DynLhashTable<Key, Record>º ÈÓÖ ÑÔÐÓ¸ Ð Ù×Ù Ö Ó ÔÓ Ö ÒÚÓ Ö Ð Ò× Ö ÓÒ LhashTable<Key> × ÙÒ Ó ØÓ Ø ÔÓ DynLhashTable<Key, Record> DynHashTable<int, Record> table; LhashTable<int>::Bucket bucket = new LhashTable<int>::Bucket (key); table.insert(bucket); ÜÔÐ ÕÙ ÙÒ Ñ Ò ×ÑÓ Ô Ö Ú Ø Ö ÕÙ ×ØÓ Ó ÙÖÖ º × Ö¸ Ô Ö ÑÔ Ö Ó¸ Ò Ð Ô ÓÖ ÐÓ× ×Ó׸ Ô Ö Ø Ø Ö ÕÙ Ð Ù×Ù Ö Ó ÐÐ ÑÓ Ð Ò× Ö ÓÒ LhashTable<Key> Ý Ö ÔÓÖØ Ö ÙÒ ÖÖÓÖ Ò Ø ÑÔÓ Ù ÓÒº ½ º ÓÒ× Ö Ð ÔÖÓ Ð Ñ Ð Ü ×Ø Ò ÙÒ Ó ØÓº ×ØÓ ×¸ Ó ÙÒ ÔÙÒØ ÖÓ ÙÒ Ó ØÓ Ø ÔÓ¸ ÑÓ× Object¸ × × Ú Ö ¬ Ö × Ð Ö ÓÒ Ñ ÑÓÖ ÔÙÒØ Ø Ú Ñ ÒØ ÙÒ Ó ØÓ × Ø ÔÓº
  • 496.
    470 Cap´ ıtulo 5. Tablas hash × ÙØ ØÓ × Ð × ÐØ ÖÒ Ø Ú × ÔÓ× Ð × Ô Ö × Ò Ö ÙÒ × ×Ø Ñ Ò Ö Ð Ú Ö ¬ ÓÒ Ü ×Ø Ò Ó ØÓ׺ ½º ÁÑÔÐ ÒØ Ð × Ð × × LhashTable<Key> Ý LhashTableVtl<Key> Ô Ö ÕÙ ÙØ Ð Ò Ð ×Ø × × ÑÔÐ Ñ ÒØ ÒÐ Þ × Ò ÐÙ Ö Ó Ð Ñ ÒØ ÒÐ Þ ×º ½º ÁÑÔÐ ÒØ Ð × Ð × × LhashTable<Key> Ý LhashTableVtl<Key> Ô Ö ÕÙ ÙØ Ð Ò Ð ×Ø × ÒÐ Þ × ÓÖ Ò ×º Ê Ð ÙÒ ×ØÙ Ó ÓÑÔ Ö Ø ÚÓ ÓÒ Ð ÑÔÐ ÒØ ÓÒ ØÖ ÓÒ Ð ÜÔÐ Ò Ü º½º¿º½º ¾¼º Ð ÙÐ Ð ÔÖÓ Ð ÕÙ Ð ÓÔ Ö ÓÒ k ÑÓ 150 ×ÓÐÓ ØÓÑ Ò Ù ÒØ ÐÓ× Ó× ØÓ× Ñ ÒÓ× × Ò ¬ Ø ÚÓ׺ ¾½º ÓÒ× Ö ÙÒ Ø Ð × Ð Ò Ð ÓÒ Ú ÐÓÖ Ò Ð M = 5 Ý ÙÒ ØÓÖ Ö Ñ Ü ÑÓ Ô ÖÑ Ø Ó αu = 0, 9º È Ö Ð × Ù ÒØ × Ù Ò Ò× Ö ÓÒ 181 186 10 6 5 58 191 22 113 7 83 118 138 122 16 18 150 39 48 157 Ù Ð ×Ø Ó Ö ×ÙÐØ ÒØ Ð Ø Ð ÐÙ Ó Ð × Ò× Ö ÓÒ ×º Bibliograf´ ıa ½ ØØÔ »»ÛÛÛº ÒÙºÓÖ »×Ó ØÛ Ö » Ô Ö »º ¾ Ó¸ ÀÓÔ ÖÓ Ø¸ Ò ÍÐÐÑ Òº Ø ËØÖÙ ØÙÖ × Ò Ð ÓÖ Ø Ñ׺ ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ ½ ¿º ¿ Ó¸ ÀÓÔ ÖÓ Ø¸ Ò ÍÐÐÑ Òº רÖÙ ØÙÖ × ØÓ× Ý Ð ÓÖ ØÑÓ׺ ×ÓÒ¹Ï ×Ð Ý Á ÖÓ Ñ Ö Ò ¸ ½ º ÌÖ Ù Ò Ñ Ö Ó Î Ö × Î ÐÐ Þ Ò Ý ÂÓÖ ÄÓÞ ÒÓ ÅÓÖ ÒÓº Ò Åº Ñ Ð¸ Ð Ò Åº Ó Ñ ¸ ƺ ÊÓ ×Ø Ö¸ Ò ÖØ ÙÖ Äº Ë Ñ٠к Ì Ý Ö × ÙÒ ÖØ Ò ´ µº Ñ Ð ÓÖ Ò Ø Ø Ó ÓÔ Ò Ö ×× Ò Û Ø Ð Ò Ö ÔÖÓ Ò ¸ Û Û × Ð Ø Ö Ò Ô Ò ÒØÐÝ Ö × ÓÚ Ö Ò ÔÙ Ð × ½¼ º¸ ½ ¿º Ò Ð Âº ÖÒר Òº È Ò Û Ò Ð º ÖÒר Òº ÖØ Ö Ò Ï Ñ Òº ÍÒ Ú Ö× Ð Ð ×× × Ó × ÙÒ Ø ÓÒ׺ ÁÒ ËÌÇ Å ËÝÑÔÓ¹ × ÙÑ ÓÒ Ì ÓÖÝ Ó ÓÑÔÙØ Ò ´ËÌÇ µ¸ ½ º ʺº ÐÐ º Å Ò Ñ Ð Ô Ö Ø × ÙÒ Ø ÓÒ× Ñ × ÑÔÐ º ÓÑÑÙÒ Ø ÓÒ× Ó Ø Å¸ ¾¿´½µ ½ ß½ ¸  ÒÙ ÖÝ ½ ¼º ̺ Àº ÓÖÑ Ò¸ º º Ä × Ö×ÓÒ¸ Ò Êº ĺ Ê Ú ×Øº ÁÒØÖÓ Ù Ø ÓÒ ØÓ Ð ÓÖ Ø Ñ׺ ÅÁÌ ÈÖ ×׸ Ñ Ö ¸ Å ¸ ÍË ¸ ½ º ÖÒÓÐ Áº ÙÑ Ýº ÁÒ Ü Ò ÓÖ Ö Ô Ö Ò ÓÑ ×× Ñ ÑÓÖÝ ×Ýר Ñ׺ ÓÑÔÙØ Ö× Ò ÙØÓÑ Ø ÓÒ¸ ´½¾µ ß ¸ Ñ Ö ½ º Öר Ô Ô Ö Ò ÓÔ Ò Ð Ø Ö ØÙÖ ÓÒ × Ò º Öר Ù× Ó × Ò Ý Ø Ò Ø ÑÓ ÙÐÙ× Ó Ú × ÓÒ Ý ÔÖ Ñ ÒÙÑ Öº Å ÒØ ÓÒ× Ò Ò ÓÖ ÓÐÐ × ÓÒ Ò Ð Ò ¸ ÙØ ÒÓØ ÓÔ Ò Ö ×× Ò º Ë ½¼ ÓÖ Ø Ð ØØ Öº
  • 497.
    5.5. Bibliograf´ ıa 471 ½¼ º Ⱥ Ö× ÓÚº Ó Ð Ý º Æ Ù ËËËʸ ½½ ¾ ß ¿¼¸ ½ º Ê × ÓÚ ÖÝ Ò ¬Öר ÔÙ Ð Ø ÓÒ Ó Ð Ò Ö ÓÔ Ò Ö ×× Ò º Ë ¸ º ½½ Ϻ ÐÐ Öº Ò ÁÒØÖÓ Ù Ø ÓÒ ØÓ ÈÖÓ Ð ØÝ Ì ÓÖÝ Ò Ø× ÔÔÐ Ø ÓÒ׺ ÂÓ Ò Ï Ð Ý¸ ÔÙ ¹ÂÏ Ö¸ ½ ¼º Ë Ø × Ù×× ÓÒ Ó Ø ÖØ Ý Ô Ö ÓÜ Ò Ë Ø ÓÒ ¾º¿º ½¾ Ⱥ Ð ÓРظ º Ö Ý¸ Ò Äº Ì ÑÓÒ Öº ÖØ Ý Ô Ö Óܸ ÓÙÔÓÒ ÓÐÐ ØÓÖ׸ Ò Ð ÓÖ Ø Ñ× Ò × Ð ¹ÓÖ Ò Þ Ò × Ö º Ì Ò Ð Ê ÔÓÖØ ËÌ Æ¹ ˹ ¹½½ ¸ Ô ÖØ¹ Ñ ÒØ Ó ÓÑÔÙØ Ö Ë Ò ¸ ËØ Ò ÓÖ ÍÒ Ú Ö× ØÝ¸ ½ ¸ Ù Ùרº ½¿ È Ð ÔÔ Ð ÓРظ Ⱥ º Ö Ò Ö¸ Ⱥ à Ö× Ò Ó Ö¸ Ò Àº ÈÖÓ Ò Öº ÇÒ Ö Ñ ÒÙ Ò³× É¹ ÙÒ Ø ÓÒº Ì Ò Ð Ê ÔÓÖØ Êʹ½ ¼¸ ÁÒÖ ¸ ÁÒר ØÙØ Æ Ø ÓÒ Ð Ê Ö Ò ÁÒ ÓÖÑ Ø ÕÙ Ø Ò ÙØÓÑ Ø ÕÙ º ½ ʺ ĺ Ö Ñ¸ º º ÃÒÙØ ¸ Ò Çº È Ø × Ò º ÓÒ Ö Ø Å Ø Ñ Ø × ÓÙÒ¹ Ø ÓÒ ÓÖ ÓÑÔÙØ Ö Ë Ò º ×ÓÒ¹Ï ×Ð Ý ÈÙ º¸ ½ º ½ Ì Ó ÙÒ Ò ÓØÓº ËØÙ × ÓÒ × Ò ½º ÓÑÔ Ö ×ÓÒ Ó × Ò Ð ÓÖ Ø Ñ× Û Ø Ý Ð Ø ÓÒº ÂÓÙÖÒ Ð Ó Ø ÁÒ ÓÖÑ Ø ÓÒ ÈÖÓ ×× Ò ËÓ ØÝ Ó Â Ô Ò¸ ¿´½µ ½ß½¾¸ ½ ¼º ½ Ö Ö Âº ÀÓÐÞÑ ÒÒº Ò Ò ÐÝ× × Ó Ø×Ø Ø × Ò º ÓÖÑ Ð Å Ø Ó × Ò ËÝר Ñ × Ò¸ ½¿´¿µ ¾ ß¿¼ ¸ ½ º ½ à ÖÔ Ò Ê Òº Æ ÒØ Ö Ò ÓÑ Þ Ô ØØ ÖÒ¹Ñ Ø Ò Ð ÓÖ Ø Ñ׺ Á ÅÂÊ Á Å ÂÓÙÖÒ Ð Ó Ê × Ö Ò Ú ÐÓÔÑ ÒØ¸ ¿½¸ ½ º ½ ÓÒ Ð º ÃÒÙØ º Ë Ñ ÒÙÑ Ö Ð Ð ÓÖ Ø Ñ׸ ÚÓÐÙÑ ¾ Ó Ì ÖØ Ó ÓÑÔÙØ Ö ÈÖÓ Ö ÑÑ Ò º ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ÍË ¸ Ø Ö Ø ÓÒ¸ ½ º ½ ÓÒ Ð º ÃÒÙØ º ËÓÖØ Ò Ò Ë Ö Ò ¸ ÚÓÐÙÑ ¿ Ó Ì ÖØ Ó ÓÑÔÙØ Ö ÈÖÓ Ö ÑÑ Ò º ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ÍË ¸ × ÓÒ Ø ÓÒ¸ ½ º ¾¼ ÓÒ Ð º ÃÒÙØ º Ë Ð Ø È Ô Ö× ÓÒ Ò ÐÝ× × Ó Ð ÓÖ Ø Ñ׺ ËÄÁ ÈÙ Ð Ø ÓÒ׸ ËØ Ò ÓÖ ¸ ¸ ÍË ¸ ¾¼¼¼º ¾½ ÙØÐ Ö Ïº Ä ÑÔ×ÓÒº À ÒØ× ÓÖ ÓÑÔÙØ Ö ×Ýר Ñ × Òº Á ËÓ ØÛ Ö ¸ ½´½µ ½½ß¾ ¸  ÒÙ ÖÝ ½ º ¾¾ Ä Ö×ÓÒº ÝÒ Ñ × Ø Ð ×º Å ÓÑÑÙÒ Ø ÓÒ× Ó Ø Å¸ ¿½¸ ½ º ¾¿ À ÖÖÝ Êº Ä Û × Ò Ä ÖÖÝ Ò Ò Ö º Ø ËØÖÙ ØÙÖ × Ò Ì Ö Ð ÓÖ Ø Ñ׺ À ÖÔ Ö ÓÐÐ Ò× ÈÙ Ð × Ö׸ Æ Û ÓÖ ¸ ½ ½º ¾ Ï ØÓÐ Ä ØÛ Òº Ä Ò Ö × Ò Ò Û Ð ÓÖ Ø Ñ ÓÖ ¬Ð × Ò Ø Ð × Ö ×× Ò º ÁÒ Á Ç ¸ Ô × ¾ ¼ß¾ ¸ ½ ¼º ¾ Æ ÓÐ × Æ Ø Ö ÓØ Ò ÂÙÐ Ò Ë Û Ö º Î Ð Ö Ò ÔÖÓ Ö Ñ ×ÙÔ ÖÚ × ÓÒ Ö Ñ ÛÓÖ º Ð ØÖº ÆÓØ × Ì ÓÖº ÓÑÔÙØº Ë ¸ ´¾µ¸ ¾¼¼¿º ¾ ÇÞ Ò Ø ÓÞ Ò ÜÙ׺ÝÓÖ Ùº º È Ò Û Ð ÔÖÓÝ ØÓ × Ñº
  • 498.
    472 Cap´ ıtulo 5. Tablas hash ¾ Ϻ Ϻ È Ø Ö×ÓÒº Ö ×× Ò ÓÖ Ö Ò ÓÑ ×× ×ØÓÖ º Á Å ÂÓÙÖÒ Ð Ó Ê × Ö Ò Ú ÐÓÔÑ ÒØ¸ ½´¾µ¸ ÔÖ Ð ½ º ¾ ÊÓ ÖØ Ë Û Ò È Ð ÔÔ Ð ÓРغ Ò ÁÒØÖÓ Ù Ø ÓÒ ØÓ Ø Ò ÐÝ× × Ó Ð Ó¹ Ö Ø Ñ׺ ×ÓÒ¹Ï ×Ð Ý ÈÙ Ð × Ò ÓÑÔ Òݸ ½ º ¾ È Ø Ö Ú Ò Ö Ä Ò Òº ÜÔ ÖØ ÈÖÓ Ö ÑÑ Ò ¹ Ô Ë Ö Ø×º ËÙÒËÓ Ø ÈÖ ×× ¹ ÈÖ ÒØ À ÐÐ Ì ØØÐ ¹¸ ½ º ÁË Æ ¼¹½¿¹½ ¾ ¹ º ¿¼ ź º Ï ×׺ Ø ËØÖÙ ØÙÖ × Ò Ð ÓÖ Ø Ñ Ò ÐÝ× × Ò º ×ÓÒ Ï ×Рݸ ½ º Ë Ò ÒÓØ Ò ¸ Ò Ñ Ò ÙÑÑ Ò ×¸ ³ ¾º
  • 499.
    Cap´ ıtulo 6 ´ Arboles de b´squeda equilibrados u ÉÙ Þ Ð ÙÒ Ú Þ Ð ÒÓ ÓÒ ÕÙ Ð Ö Ó × ÒÓ× Ý Ô Ö Ó Ó ÙÒ Ò ×ØÖ Ð¹ Ñ ÒØ ÒÑ ÑÓÖ Ð Ý ÙÝÓ ×Ô ØÓ Ú ×Ù Ð × Ð × Ù ÒØ Ä Ñ Ò Ô ØÓÖ Þ ÙÒ ÖØ ØÓ ÒØ ÕÙ × ÑÓ¸ ÓÒ Ø Ò Ò ØÙ Ð Ð ×Ù×Ó¸ Ô ÖÓ ÙÒ Ú ÒØ Ò Ð ÙÒÓ× × ×Ó× ÓÒØ ÜØÓ׸ ÙÝ ¬Ò Ð × Ô × Ö Ó × ¸ Ñ Ö Ô ×Ó׺ Ä × ÓÐÓ Ö Ò ÙÒÓ ÐÓ× ÔÐ Ø ÐÐÓ× ÐÓ ÕÙ × × Ô × Ö¸ Ñ ÒØÖ × ÕÙ Ò Ð ÓØÖÓ × ÔÓÒ Ò Ô ×Ó× Ö ÖÒ ØÙ ÐÑ ÒØ ÐÐ Ñ Ó× ÔÐÓÑ × º Ù Ò Ó ÐÓ× ÔÐ Ø ÐÐÓ× Ð ÒÞ Ò Ù Ð ÐØÙÖ × ÕÙ ÕÙ Ð Ö ÙÑ ÕÙÙ× ¸ ÕÙ × Ò ¬ Ù Ð Ý Ð Ö ÕÙ Ö Ð ÒÓÑ Ö ÖÓÑ ÒÓ Ð ÔÐÓÑ Ý ÙÒ Ú ÒØ ÓÑÓ ÙÒ Ñ Ö Ð Ô ×Ó Ó Ú ÐÓÖ ÓÒÓÑ Óº Ð ÖØ ØÓ Ò Ù ×Ø ÓÒ¸ Ó ÒÓ × Ð ÒÓÑ Ò Ð ÒÞ ¸ Ô ÖÓ ÒØ ÒÓ ÐÓ× ÖÓÑ ÒÓ× Ø Ñ Ò ÐÓ Ñ ÒØ ÖÓÒ ÓÑÓ Ð Ö ¸ ÔÙ × ×ØÓ× Ö ¬Ò ÖÓÒ Ð Ñ Ò ×ÑÓ Ø Ð ÓÖÑ ÕÙ Ð Ö ÞÓ Ð Ð ÒÞ ÔÓ ×ÔÐ Þ Ö× Ý ×Ùר ØÙ Ö Ð ÙÒ × ÔÐÓÑ × Ö Ö Ò º × ÒØÓÒ ×¸ Ð Ð ÒÞ Ó Ð Ö × Ñ ÓÐ Þ Ó × ØÙ ÓÒ × Ò Ð × Ù Ð × × Ò Ð Ð ÙÒ ×Ô Ù Ð Ó ÕÙ Ð Ö Ó Ò Ô ÖØ ÙÐ Ö¸ × Ó Ð × Ñ ÓÐÓ Ð Ùר ¸ ÕÙ Þ Ð Ú ÖØÙ Ñ × Ð ÙÐØ Ú Öº Ò Ð Ñ ØÓ ÐÓ× Ö ÓÐ × Ò Ö Ó׸ Ð ÕÙ Ð Ö Ó × Ô ØÓÖ Þ Ó Ð Ý Ò ÓÒÓ Ñ Ò × Ù ÒØ T L(T ) R(T ) Ä × Ö Ñ × Ð Ö ÓÐ T Ø Ò Ò Ô ×Ó× ÕÙ Ú Ð ÒØ × × Ö¸ ÓÒØ Ò Ò Ð × Ñ ×Ñ × ÒØ × ÒÓ Ó׺ T ר Ö ¸ ÒØÓÒ ×¸ Ò ÕÙ Ð Ö Ó Ó ÕÙ Ð Ö Óº Ê ÙÖ× Ú Ñ ÒØ ¸ × ØÓ Ó× ÐÓ× ÒÓ Ó× T ר Ò ÕÙ Ð Ö Ó׸ ÒØÓÒ × Ð ÐØÙÖ T Ø Ò O(Ð (n))¸ ÐÓ Ù Ð ¿
  • 500.
    474 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u ÕÙ Ð Ö Ò Ñ ÒØÓ Ð Ù×ÕÙ ×Ó Ö ÙÒ Ö ÓÐ × Ø Ñ Ò O(Ð (n))º Ð Ù Ð ÕÙ Ó ÙÖÖ ÓÒ Ð × Ú ÖØÙ ×¸ ÐÓ× Ö ÓÐ × ×ØÖ ØÓ× ×ÓÒ Ù ÒÓ× Ò Ð Ñ Ò ÕÙ ×ØÓ× ×Ø Ò ÕÙ Ð Ö Ó׺ 6.1 Equilibrio de ´rboles a Ò ÙÒ ÔÖ Ñ Ö Òר Ò ¸ ÔÓ ÑÓ× ÒØ ÒØ Ö Ð ÒÞ Ö ÙÒ ÕÙ Ð Ö Ó × Ó Ò Ð × Ù ÒØ ¬Ò ÓÒ Definici´n 6.1 (Equilibrio fuerte de Wirth [17]) ÍÒ Ö ÓÐ o Ò Ö Ó Ì × ÕÙ Ð Ö Ó ⇐⇒ ∀ni ∈ T , | | Ä(ni)| − | Ê(ni)| | ≤ 1 Ó ×Ø ¬Ò ÓÒ¸ ÔÓ ÑÓ× × Ò Ö ÙÒ ÔÖ Ñ Ö Ð ÓÖ ØÑÓ ÕÙ ÒÓ× ÕÙ Ð Ö ÙÒ Ö Óк ÆÙ רÖÓ Ð ÓÖ ØÑÓ ÙØ Ð Þ ÐÓ× Ö ÓÐ × ÜØ Ò Ó× ´ µ ÜÔÐ Ó× Ò Ü º½½ ´Ô Ò ¿ ¿µº Ä × ÓÔ Ö ÓÒ × Ö ÕÙ Ö × Ð × Ò ÐÙ ÑÓ× Ò Ð Ö ÚÓ ØÔÐ Ð Ò ØºÀ ´Ò Ú Ö ¬Ò µ º ÍÒ Ð × Ú ÒØ × ÙÒ × Ð ÓÔ Ö ÓÒ × Ð ÓÒ ´Ü º½½º½ ´Ô Ò ¿ µµº Å ÒØ ר ÓÔ Ö ÓÒ¸ ÔÓ Ö ÑÓ× × Ð ÓÒ Ö Ð Ð Ú Ð ÒØÖÓ Ý ÖÐ Ö Þ Ð Ö Óк Ð ÒÙÑ ÖÓ ÒÓ Ó× Ò Ñ Ó× Ð Ó× Ö Ö ÐÓ ×ÙÑÓ Ò ÙÒÓº Ë ÔÐ ÑÓ× ×Ø ÔÖÓ ¹ Ñ ÒØÓ Ö ÙÖ× Ú Ñ ÒØ Ó Ø Ò ÑÓ× ÙÒ Ö ÓÐ ÕÙ Ð Ö Ó × ÙÒ Ï ÖØ º Ê ÕÙ Ö ÑÓ× ÙÒ ÙÒ ÓÒ ÕÙ × Ð ÓÒ ÙÒ ÒÓ Ó × ÙÒ ×Ù ÔÓ× ÓÒ Ò¬ Ý ÐÓ ×Ù ×Ø Ð Ö Þº Ì Ð ÓÔ Ö ÓÒ × ¬Ò ÓÑÓ × Ù ÊÙØ Ò × ÕÙ Ð Ö Ó ≡ template <class Node> inline Node * select_gotoup_root(Node * root, const size_t & i) { if (i == COUNT(LLINK(root))) return root; if (i < COUNT(LLINK(root))) { LLINK(root) = select_gotoup_root(LLINK(root), i); root = rotate_to_right_xt(root); } else { RLINK(root) = select_gotoup_root(RLINK(root), i - COUNT(LLINK(root)) - 1); root = rotate_to_left_xt(root); } return root; } ¬Ò × select gotoup root¸ Ù× Ò ÙÒ º select gotoup root() × Ð ÓÒ Ð i¹ × ÑÓ ÒÓ Ó Ð Ö ÓÐ ÓÒ Ö Þ root Ý ÐÓ ×Ù ×Ø Ð Ö Þº Ë ØÓÑ ÑÓ× ÙÒ Ö ÓÐ n ÒÓ Ó׸ × Ð ÓÒ ÑÓ× Ð ÒÓ Ó ÓÖÖ ×ÔÓÒ ÒØ Ð ÔÓ× ÓÒ n/2 Ý ÐÓ ×Ù ÑÓ× ×Ø Ð Ö Þ¸ ÒØÓÒ ×¸ Ò Ú Ð Ð ÒÓ Ó n/2¸ Ð ÖÒ ÒÓ Ó× ÒØÖ ×Ù ×Ù Ö ÓÐ ÞÕÙ Ö Ó Ý Ö Ó × ÐÓ ×ÙÑÓ ÙÒÓº Ë ÔÐ ÑÓ× Ð Ñ ×ÑÓ ÔÖ Ò Ô Ó Ö ÙÖ× Ú Ñ ÒØ ¸ Ù ÑÓ× Ð Ð ÓÖ ØÑÓ × Ù ÒØ ÊÙØ Ò × ÕÙ Ð Ö Ó +≡
  • 501.
    6.1. Equilibrio de´rboles a 475 template <class Node> inline Node * balance_tree(Node * root) { if (COUNT(root) <= 1) return root; root = select_gotoup_root(root, COUNT(root) / 2); LLINK(root) = balance_tree(LLINK(root)); RLINK(root) = balance_tree(RLINK(root)); return root; } Í× × select gotoup root º ÔÙ Ö Ð Þ Ö× Ñ ÒØ Ð Ô ÖØ ÓÒ ÔÓÖ ÔÓ× ÓÒ ÜÔÐ select gotoup root() ÒÜ º½½º ´Ô Ò ¿ µº ×ØÓ × Ð Ó Ö Óº ´ µ ÒØ × ÐÒ Ö ´ µ ×ÔÙ × ÐÒ Ö ÙÖ º½ ÑÔÐÓ ÕÙ Ð Ö Ó ÙÒ Ö ÓÐ Ð ØÓÖ Ó Ñ ÒØ balance() Ë Ð Ö ÓÐ ÓÖ Ò Ð Ù ÓÒרÖÙ Ó Ô ÖØ Ö ÙÒ × Ù Ò Ð ØÓÖ ¸ ÒØÓÒ × ×Ù ÐØÙÖ Ø Ò O(Ð n) Ý Ð × ÑÔ ÒÓ select gotoup root() ÐÐ Ñ Ó × balance tree() × O(Ð n)º Ò ×Ø ÑÓÑ ÒØÓ Ð Ö ÓÐ ÕÙ Ô ÖØ ÓÒ Ó Ò Ó× Ô ÖØ × ÕÙ Ø Ø Ú ×¸ ÙÒ ÓÒ ÙÒ ÓÒ×ÙÑÓ Ø ÑÔÓ ÔÖÓÔÓÖ ÓÒ Ð Ð Ñ Ø Ð ÒØÖ º ÈÓ ÑÓ׸ Ô٠׸ ÔÐ ÒØ Ö Ð × Ù ÒØ Ù ÓÒ Ö ÙÖÖ ÒØ Ô Ö Ð × ÑÔ ÒÓ balance tree() T (n) = 1 × n≤1 . 2T (n/2) + O(Ð n) × n>1 ËÙÔÓÒ Ò Ó ÕÙ n × ÙÒ ÔÓØ Ò Ü Ø 2¸ Ö Ð Þ ÑÓ× Ð ØÖ Ò× ÓÖÑ ÓÒ n = 2k =⇒ k = Ð nº ×ØÓ ÒÓ× ÔÐ ÒØ T (2k) = 2T (2k−1) + k .
  • 502.
    476 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u Ú Ò ÓÐ Ù ÓÒ ÒØÖ 2k¸ Ø Ò ÑÓ× T (2k) T (2k−1) k = + k 2k 2k−1 2 T (2k−2) k − 1 k = k−2 + k−1 + k 2 2 2 k T (2k−3) k − 2 k − 1 k i = k−3 + k−2 + k−1 + k = 1 + =⇒ 2 2 2 2 2i i=1 k k T (n) n = 1+ i 2i =⇒ T (n) = n + n i 2i . ´ º½µ i=1 i=1 Sk Ä ×ÓÐÙ ÓÒ Ð Ö ÙÖÖ Ò Ô Ò ¸ Ô٠׸ Ð Ú ÐÓÖ Ð ×ÙÑ ØÓÖ Sk = k i i=1 2i ¸Ð Ù Ð ÔÙ Ö ×ÓÐÚ Ö× ÔÓÖ Ô ÖØÙÖ ÓÒ k i Sk = =⇒ 2i i=1 k k+1 i+1 Sk + = 2k+1 2i+1 i=0 k k i 1 = + =⇒ 2i+1 2i+1 i=0 i=0 Sk 2 k k+1 Sk 2 = 2i+1 1 − 2k+1 . ´ º¾µ i=0 Qk Ð Ú Þ¸ ´ º¾µ Ô Ò Ð ×ÓÐÙ ÓÒ k Qk = 1 2i+1 = 1 1 1 + 2 + · · · + k+1 . 2 2 2 ´ º¿µ i=0 ÅÙÐØ ÔÐ Ò Ó ´ º¿µ ÔÓÖ 2 Ø Ò ÑÓ× 2Qk = 1 + 1 1 1 + 2 + ··· + k . 2 2 2 ´ºµ ÓÖ Ö ×Ø ÑÓ× ´ º µ Ñ ÒÓ× ´ º¿µ ÐÓ ÕÙ ÒÓ× ÓÑÓ ×ÓÐÙ ÓÒ ´ º¿µ Qk = 1 − 1 2k+1 ; ´ºµ ÙÝÓ Ú ÐÓÖ¸ Ð ×Ùר ØÙ ÖÐÓ Ò ´ º¾µ ÒÓ× ÖÖÓ k+1 k+2 Sk = 2 − 1 2k − k =2− k 2 2 ´ºµ ËÙר ØÙÝ Ò Ó ´ º µ Ò ´ º½µ Ø Ò ÑÓ× T (n) = n + n 2 − k+1 = n+n 2− Ð n+2 = 3n − Ð n − 2, n ≥ 1 ; ´ºµ 2k n
  • 503.
    ´ 6.2. Arboles aleatorizados 477 Ö ×ÙÐØ Ó ÕÙ × O(n Ð n)º balance tree() ׸ Ô٠׸ O(n Ð n)¸ ÙÒ Ø ÑÔÓ ÓרÓ×Ó × Ð ÙÒ ÓÒ × ÒÚÓ Ö¹ Ù ÒØ Ñ ÒØ º À ר Ð ÔÖ × ÒØ ¸ Ò × Ù ÖØÓ ÙÒ Ð ÓÖ ØÑÓ ÔØ Ð ÕÙ ÑÓ ¹ ¬ÕÙ ÙÒ Ý ÕÙ Ö ÒØ ÙÒ ÓÒ ÓÒ ÕÙ Ð Ö Ó Ù ÖØ º Ê ÞÓÒ ÔÓÖ Ð Ù Ð × ÓÔØ Ó ÔÓÖ Ö Ð Ö Ð × ÓÒ ÓÒ × ÕÙ Ð Ö Ó Ô Ö ÖÐ × Ñ ÒÓ× Ö ×ØÖ Ø Ú ×º Ë ÙÒ Ð × Ø Ò × Ð ÓÖ ØÑ ׸ ÔÓ ÑÓ× ÔÐ ÒØ Ö Ð × Ù ÒØ Ð × ¬ ÓÒ ÐÓ× Ñ Ò ×ÑÓ× ÕÙ Ð Ö Ó ÓÒÓ Ó× ¯ Equilibrio Probabil´ ıstico: ר Ò ÓÕÙ ÓÒ× ×Ø Ò ØÓÑ Ö × ÓÒ × Ð ØÓÖ × Ø Ò ÒØ × Ö ×Ø Ð Ö Ð ÕÙ Ð Ö Óº ÄÓ× Ö ÓÐ × Ó Ø Ò Ó׸ Ó Ö Ò ÙÒ Ø ÑÔÓ ×Ô Ö Ó O(Ð n) Ô Ö ØÓ × Ð × ÓÔ Ö ÓÒ ×º ר Ð × ÕÙ Ð Ö Ó ×ØÙ Ö ÑÓ× Ó× ×ØÖÙ ØÙÖ × ÐÓ× Ö ÓÐ × Ð ØÓÖ Þ Ó× Ý ÐÓ× ØÖ Ô׺ ¯ Equilibrio garantizado: Ò ×Ø Ò ÓÕÙ × ÔÐ ÒØ Ò ÓÒ ÓÒ × ÕÙ Ð Ö Ó¸ Ñ ÒÓ× Ö ×ØÖ Ø Ú × ÕÙ Ð Ù ÖØ ¸ ÕÙ Ô ÖÑ Ø Ò ÑÓ ¬ ÓÒ × O(Ð n) ×Ó Ö ÙÒ Ö ÓÐ Ò Ö Ó Ý ÕÙ ÓØ Ò Ð ÐØÙÖ O(Ð n)º ÄÓ× Ñ ØÓ Ó× ×Ø Ø ÔÓ Ó Ö Ò ÙÒ Ö ÒØ O(Ð n) Ò ØÓ × Ð × ÓÔ Ö ÓÒ ×º Ó ×Ø Ø ÔÓ ÕÙ Ð Ö Ó ×ØÙ Ö ÑÓ× Ó× ×ØÖÙ ØÙÖ × ÐÓ× Ö ÓÐ × ÎÄ Ý ÐÓ× Ö ÓÐ × ÖÓ Ó¹Ò ÖÓ׺ ¯ Equilibrio amortizado: ר Ò ÓÕÙ ÓÒ× ×Ø Ò ÙØ Ö ÓÔ Ö ÓÒ × ×Ô Ð × ÙÖ ÒØ Ð Ù ÓÒ Ù ÐÕÙ Ö ÓÔ Ö ÓÒ Ñ Ò Ö Ø Ð ÕÙ Ð Ö ÓÐ Ø Ò ×Ø Ö ÕÙ Ð Ö Óº Ó ×Ø ÓÒ Ô ÓÒ¸ × Ö ÒØ Þ ÙÒ Óר ÑÓÖØ Þ Ó O(p Ð n) Ô Ö p ÓÔ Ö ÓÒ × ×Ù × Ú × ×Ó Ö Ð Ö Óк Ò ×Ø ÖÙÔÓ¸ Ð ÙÒ Ø Ò ÑÓÖØ Þ ÓÒÓ Ô Ö ÕÙ Ð Ö Ö Ö ÓÐ × × Ð ×ÔÐ Ó ´splayµ¸ ÑÔÐ Ò ÐÓ× Ö ÓÐ × ×ÔРݺ 6.2 ´ Arboles aleatorizados ÍÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ Ð ØÓÖ Þ Ó ´ µ × ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ ÜØ Ò Ó ´ Ò Ü º½½ ´Ô Ò ¿ ¿µµ ÓÒ ÓÔ Ö ÓÒ × ×Ô Ð × ÕÙ Ö ÒØ Þ Ò ÕÙ Ð × ÙÒ Ö ÓÐ Ð ØÓÖ Óº Ê ÓÖ ÑÓ× ÕÙ ÙÒ × ÙÒ Ö ÓÐ Ò Ð ÕÙ ÒÓ Ó ÐÑ Ò Ð Ö Ò Ð Ð Ö ÓÐ Ð Ù Ð Ð × Ö Þº ÆÓØ ÑÓ× Ð ×Ø Ò ÓÒ ÕÙ ÑÓ× ÒØÖ Ð ØÓÖ Ó Ý Ð ØÓÖ Þ Ó º ÁÒ ÓÖÑ ÐÑ ÒØ ¸ ÙÒ Ö ÓÐ Ð ØÓÖ Ó × ÕÙ Ú Ð ÒØ ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ ÓÒרÖÙ Ó Ô ÖØ Ö × Ù Ò × Ò× Ö ÓÒ Ð ØÓÖ × Ñ ÒØÖ × ÕÙ ÙÒÓ Ð ØÓÖ Þ Ó × ÙÒÓ Ø Ð ÕÙ ×Ù× ÓÔ Ö ¹ ÓÒ × Ö ÒØ Þ Ò ÕÙ ×Ø × ÑÔÖ × Ð ØÓÖ Ó¸ Ò Ô Ò ÒØ Ñ ÒØ Ð Ø ÔÓ ÓÔ Ö ÓÒº ´ Definici´n 6.2 (Arbol binario de b´ squeda aleatorio (ABBA)) o u Ë T ÙÒ Ö ÓÐ Ò ÖÓ Ù×ÕÙ ÓÒ Ö Ò Ð |T | = nº ¯ Ë n = 0¸ ÒØÓÒ × T = ∅ × ÙÒ º ¯ Ë n > 0¸ ÒØÓÒ × T × ÙÒ × Ý ×ÓÐÓ × Ä(T ) Ý Ê(T ) ×ÓÒ Ò Ô Ò ÒØ ׸ Ý P(| Ä(T )| = i | |T | = n) = ´ºµ 1 , 0 ≤ i < n, n > 0 n
  • 504.
    478 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u Ð ÔÙÒØÓ ÖÙ Ð Ð ¬Ò ÓÒ¸ ×Ô ¬ Ñ ÒØ Ð Ù ÓÒ ´ º µ¸ × ÕÙ Ù ÐÕÙ Ö Ð × Ð Ú × Ð Ö ÓÐ Ø Ò Ü Ø Ñ ÒØ Ð Ñ ×Ñ ÔÖÓ Ð × Ö Ð Ö Þ Ð Ö Óк ר ÔÖÓÔ × ÙÒ Ñ ÒØ Ð Ô Ö Ð × ÒÓ ÐÓ× Ð ÓÖ ØÑÓ× Ò× Ö ÓÒ Ý Ð Ñ Ò ÓÒº È Ö ÔÖÓ Ù Ö ÙÒ ¸ Ù ÐÕÙ Ö Ð Ú Ò× ÖØ Ö Ø Ò Ö Ð ÙÒ ÔÓ× Ð Ú ÒÖÐ Ö Þ Ð Ö Óи Ó Ð Ö Þ Ð ÙÒÓ ×Ù× ×Ù Ö ÓР׺ Ð Ñ ×ÑÓ ÑÓ Ó¸ Ù Ò Ó × Ð Ñ Ò ÙÒ Ð Ú ¸ Ù ÐÕÙ Ö Ð × Ð Ú × Ö ×Ø ÒØ × Ø Ò Ö ÔÓ× Ð × Ú ÒÖ Ö Þ Ð Ö ÓÐ Ó ×Ù× ×Ù Ö ÓР׺ 6.2.1 El TAD Rand Tree<Key> ÒØ × ÜÔÐ Ö ÐÓ× Ð ÓÖ ØÑÓ׸ Ö ÕÙ Ö ÑÓ× Ð ÙÒ × × × Ô Ö ÙÒ Ì ÕÙ ÒÓ× ÑÓ Ð ÙÒ º Ì Ð Ì × ÒÓÑ Ò Gen Rand Tree<Key> Ý × Ò Ù ÒØÖ Ò Ð Ö ÚÓ ØÔÐ Ö Ò ØÖ ºÀ ÙÝ ×ØÖÙ ØÙÖ ÙÒ Ñ ÒØ Ð × Ð × Ù ÒØ ØÔÐ Ö Ò ØÖ ºÀ ≡ template <template <typename> class NodeType, typename Key, class Compare> class Gen_Rand_Tree { typedef NodeType<Key> Node; Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Rand Tree<Key> Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Rand Tree<Key> }; Ð × × ÔÙ Ð × Rand Tree<Key> ¬Ò × Gen Rand Tree¸ Ù× Ò ÙÒ º Ð ÔÖ Ñ Ö Ô ×Ó Ô Ö ÑÔÐ ÒØ Ö Gen Rand Tree<Key> × ¬Ò Ö Ð ×ØÖÙ ØÙÖ Ð ÒÓ Ó ÕÙ ÓÒ ÓÖÑ ÙÒ ØÔÐ Ö Ò ÆÓ ºÀ ≡ DECLARE_BINNODE_SENTINEL(RandNode, 80, BinNodeXt_Data); ¬Ò × RandNode¸ Ù× Ò ÙÒ º RandNodeVtl¸ Ù× Ò ÙÒ º Í× × DECLARE BINNODE SENTINEL ¾ º ÁÒØ ÖÒ Ñ ÒØ ¸ Ð Ì Gen Rand Tree<Key> ØÖ ÓÒ Ð Ñ ×ÑÓ Ø ÔÓ ÒÓ Ó Ñ¹ ÔÐ Ó Ô Ö ÐÓ× Ö ÓÐ × ÓÒ Ö Ò Ó ×ØÙ Ó× Ò Ü º½½ ´Ô Ò ¿ ¿µ ÐÓ× ÒÓ Ó× Ù Ö Ò Ð Ö ÒÐ Ð Ö ÓÐ Ý NullPtr × ÙÒ ÒÓ Ó ÒØ Ò Ð ÙÝ Ö Ò Ð × ÖÓº Ä Ð × Gen Rand Tree<Key> Ö ÕÙ Ö ÙÒ Ò Ö ÓÖ ÒÙÑ ÖÓ× Ô× Ù Ó Ð ØÓ¹ Ö Ó׺ È Ö ÐÐÓ¸ ÒÓ× Ú Ð ÑÓ× Ð Ð ÓØ gsl½º Í× Ö ÑÓ× Ð Ò Ö ÓÖ ØÓÖ¹ Ò Ó ´ ÌÛ ×Ø µ¸ ØÙ ÐÑ ÒØ ÓÒÓ Ó ÓÑÓ Ð Ñ ÓÖ Ò Ö ÓÖ ÓÒÓ Ó ÒÙÑ ÖÓ× × Ù Ó¹ Ð ØÓÖ Ó× ½¼¸ ¸ ½½ º ÍÒ ÔÙÒØ ÖÓ Ð Ó ØÓ gsl¸ Ò Ö ÓÖ ÒÙÑ ÖÓ× Ð ØÓÖ Ó׸ ÔÙ Ó Ø Ò Ö× Ñ ÒØ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Rand Tree<Key> ≡ ´ µ ¼ gsl_rng * gsl_rng_object() { return r;} ØÖ Ú × ×Ø ÔÙÒØ ÖÓ¸ Ð Ù×Ù Ö Ó ÔÙ ÐØ Ö Ö Ð Ò Ö ÓÖ ×Ù ÔÐ ÒÓ Ö × Óº ÄÓ× Ñ Ñ ÖÓ× ØÓ Gen Rand Tree<Key> Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Rand Tree<Key> ≡ ´ µ Node * tree_root; gsl_rng * r; ½ Gnu Scientific Library º
  • 505.
    ´ 6.2. Arboles aleatorizados 479 tree root × ÙÒ ÔÙÒØ ÓÖ Ð Ö Þ Ö ÓÐ Ð ØÓÖ Þ Óº r × ÙÒ ÔÙÒØ ÓÖ Ð Ó ØÓ Ò Ö ÓÒ ÒÙÑ ÖÓ× Ô× Ù Ó Ð ØÓÖ Ó× Ð Ð ÓØ gslº Ä × Ð × × ÕÙ × ÜÔÓÖØ Ò Ð Ù×Ù Ö Ó Ð × × ÔÙ Ð × Rand Tree<Key> ≡ ´ µ template <typename Key, class Compare = Aleph::less<Key> > class Rand_Tree : public Gen_Rand_Tree<RandNode, Key, Compare> { /* empty */ }; template <typename Key, class Compare = Aleph::less<Key> > class Rand_Tree_Vtl : public Gen_Rand_Tree<RandNodeVtl, Key, Compare> { /* empty */ }; Í× × Gen Rand Tree ¸ RandNode ¸ Ò RandNodeVtl º 6.2.1.1 Inserci´n en un ABBA o Ä × Ð Ð ÓÖ ØÑÓ Ò× Ö ÓÒ × ØÙ Ö × ÓÒ × Ð ØÓÖ ×¸ Ò ÙÒ ÓÒ Ð ¬Ò ÓÒ º¾¸ ÕÙ Ø ÖÑ Ò Ò × Ð ÒÓ Ó Ò× ÖØ Ö Ú Ò Ó ÒÓ Ö Þ Ý¸ × ÑÓ Ó¸ Ö ÒØ Ò ÕÙ Ð Ö ÓÐ Ò Ö Ó Ö ×ÙÐØ ÒØ × Ð ØÓÖ Óº È Ö ÐÐÓ¸ ÔÖ × ÒØ ÑÓ× Ð Ð ÓÖ ØÑÓ × Ù ÒØ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Rand Tree<Key> +≡ ´ µ Node * random_insert(Node * root, Node * node) { if (root == Node::NullPtr) // ¿inserci´n en ´rbol vac´o? o a ı return node; const long & n = COUNT(root); Ò Ö ÖÒ Ð ØÓÖ Ó ÒØÖ ¼ Ý Ò ¼ ; if (rn == n) // ¿Gana node el sorteo de ser ra´z? ı return insert_root_xt <Node, Compare> (root, node); // s´, node ser´ ra´z ı a ı Node * result; if (Compare () (KEY(node), KEY(root))) // ¿insertar en arbol izquierdo? ´ { result = random_insert(LLINK(root), node); // inserta en rama izquierda if (result != Node::NullPtr) // ¿hubo inserci´n? o { // si ==> actualizar rama y contadores LLINK(root) = result; ++COUNT(root); } } else if (Compare() (KEY(root), KEY(node)))// ¿insertar en arbol derecho? ´ { result = random_insert(RLINK(root), node); // inserta en rama derecha if (result != Node::NullPtr) // ¿hubo inserci´n? o { // si ==> actualizar rama y contadores RLINK(root) = result; ++COUNT(root); } } else return Node::NullPtr; // clave duplicada ==> no hay inserci´n o return result;
  • 506.
    480 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u } ¬Ò × random insert¸ Ù× Ò ÙÒ ¼ º Í× × insert root xt ¿ º Ð ÔÙÒØÓ ÒØÖ Ð Ð Ò× Ö ÓÒ × Ð ×ÓÖØ Ó ØÙ Ó Ò Ò Ö ÖÒ Ð ØÓÖ Ó ÒØÖ ¼ Ý Ò ¼ ¸ Р٠и Ò ÓÒ×ÓÒ ÓÒ Ð ¬Ò ÓÒ º¾¸ × Ð ÒÓ Ó Ò× ÖØ Ö Ú Ò Ö Ö Þ Ó ÒÓ ¼ Ò Ö ÖÒ Ð ØÓÖ Ó ÒØÖ ¼ Ý Ò ¼ ≡ ´ µ const size_t rn = gsl_rng_uniform_int(r, n + 1); Ä Ò× Ö ÓÒ Ò Ð Ö Þ × Ö Ð Þ ÔÓÖ Ð ÖÙØ Ò insert root xt() ÜÔÐ Ò Ü º½½º ´Ô Ò ¿ µº random insert() ÑÔÐ ÒØ Ð Ò× Ö ÓÒ Ð ØÓÖ Þ º Ä Ú Ö× ÓÒ ÔÙ Ð Ð Ò× Ö ÓÒ Ô Ö Ð Ø ÔÓ Gen Rand Tree<Key> × ×Ô ¬ ÓÑÓ × Ù ¼ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Rand Tree<Key> +≡ ´ µ ¼ Node * insert(Node * p) { Node * result = random_insert(tree_root, p); if (result == Node::NullPtr) return NULL; tree_root = result; return p; } Í× × random insert º 6.2.1.2 Eliminaci´n en un ABBA o Ò Ð Ð Ñ Ò ÓÒ Ò ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ ¸ Ð × ÓÒ × Ó Ö Ð Ö Þ Ö ×ÙÐØ ÒØ Ð ÙÒ ÓÒ Ü ÐÙ× Ú × ÑÔÖ × Ð Ö Þ Ð ×Ù ¹ Ö ÓÐ ÞÕÙ Ö Ó ´Ü º½½º ´Ô Ò ¿ µµº ×ØÓ ÒØÖÓ Ù ÙÒ × × Ó Ò Ð ÕÙ Ð Ö Ó ÔÖÓ Ð ×Ø Ó Ò ÓÒØÖ Ð Ð ØÓÖ º ËÓÖØ Ö ÙÒ ÓÖÑ Ñ ÒØ Ù Ð Ð × Ö × ¹ ÞÕÙ Ö Ó Ö ¹ Ö ÑÔÐ Þ Ö× ÒÓ ÙÒ ÓÒ ¸ ÔÙ × ÒÓ × ÔÓÒ Ö Ð ÒØ ÒÓ Ó× ÕÙ Ø Ò ÖѺ Ð ØÖÙ Ó Ô Ö ÕÙ Ð ÙÒ ÓÒ Ü ÐÙ× Ú ÔÖÓ ÙÞ ÙÒ Ö ÓÐ Ð ØÓÖ Ó × ×ÓÖØ Ö¸ Ò ÙÒ ÓÒ Ð× Ö ÒР׸ Ù Ð Ð × Ö × Ú Ò Ö Ð Ö Þ Ð Ö ×ÙÐØ Óº ר × ÔÐ ×Ñ Ò Ð Ð ÓÖ ØÑÓ × Ù ÒØ ¼ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Rand Tree<Key> +≡ ´ µ ¼ ½ Node * random_join_exclusive(Node * tl, Node * tr) { if (tl == Node::NullPtr) return tr; if (tr == Node::NullPtr) return tl; const size_t & m = COUNT(tl); const size_t & n = COUNT(tr); Ò Ö ÖÒ Ð ØÓÖ Ó ÒØÖ ½ Ý Ñ · Ò ½ if (rn <= m) { // rama izquierda gana sorteo COUNT(tl) += COUNT(tr); RLINK(tl) = random_join_exclusive(RLINK(tl), tr); return tl;
  • 507.
    ´ 6.2. Arboles aleatorizados 481 } else { COUNT(tr) += COUNT(tl); LLINK(tr) = random_join_exclusive(tl, LLINK(tr)); return tr; } } ¬Ò × random join exclusive¸ Ù× Ò ÙÒ ½ º ½ Ò Ö ÖÒ Ð ØÓÖ Ó ÒØÖ ½ Ý Ñ · Ò ½ ≡ ´ ¼µ const size_t rn = 1 + gsl_rng_uniform_int(r, m + n); ÍÒ Ú Þ Ö Ð Þ Ð ÙÒ ÓÒ Ü ÐÙ× Ú Ð ØÓÖ Þ ¸ Ð Ð Ñ Ò ÓÒ Ð ØÓÖ Ò Ö ÓÐ Ò ÖÓ Ù×ÕÙ ÓÒ Ö Ò Ó× × ×ØÖÙ ØÙÖ ÐÑ ÒØ ÒØ Ð ÙÒ ½ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Rand Tree<Key> +≡ ´ µ ¼ ½ Node * random_remove(Node *& root, const Key & key) { if (root == Node::NullPtr) return Node::NullPtr; Node * ret_val; if (Compare() (key, KEY(root))) { ret_val = random_remove(LLINK(root), key); if (ret_val != Node::NullPtr) COUNT(root)--; return ret_val; } else if (Compare() (KEY(root), key)) { ret_val = random_remove(RLINK(root), key); if (ret_val != Node::NullPtr) COUNT(root)--; return ret_val; } // clave encontrada ret_val = root; root = random_join_exclusive(LLINK(root), RLINK(root)); ret_val->reset(); return ret_val; } ¬Ò × random remove¸ Ù× Ò ÙÒ ½º Í× × random join exclusive ¼º Ä ÐÓ Ð Ð ÓÖ ØÑÓ × × Ò Ö Ö ÙÖ× Ú Ñ ÒØ ר Ð ÒÓ Ó Ð Ñ Ò Öº ÍÒ Ú Þ Ò ÓÒØÖ Ó ×Ø ÒÓ Ó¸ × ØÙ ÙÒ ÓÒ Ø Ò ÓÒ Ð ØÓÖ ÒØÖ Ð Ö Ñ ÞÕÙ Ö Ý Ð Ö ¸ Ð Ù Ð × Ð Ö ×ÙÐØ Ó Ð Ð Ñ Ò ÓÒº ÙÐÑ Ò ÑÓ× ×Ø × ÓÒ ÓÒ Ð ×ØÖÙ ØÙÖ Ð ÖÙØ Ò ÔÙ Ð Ð Ñ Ò ÓÒ ½ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Rand Tree<Key> +≡ ´ µ ½ Node * remove(const Key & key)
  • 508.
    482 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u { Node * ret_val = random_remove(tree_root, key); return ret_val != Node::NullPtr ? ret_val : NULL; } Í× × random remove ½ º 6.2.2 An´lisis de los ´rboles aleatorizados a a Ä ÒØÖ Ð Ò ×Ø Ò Ð × × × ÑÓ×ØÖ Ö ÕÙ ÐÓ× Ð ÓÖ ØÑÓ× Ò× Ö ÓÒ º¾º½º½ Ý Ð Ñ Ò ÓÒ º¾º½º¾¸ ÔÖÓ Ù Ò Ö ÓÐ × Ð ØÓÖ Ó× Ò Ð × ÒØ Ó Ð ¬Ò ÓÒ º¾º Lema 6.1 (Mart´ ınez y Roura 1998 [8]) Ë Ò T< Ý T> ÐÓ× Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ ÔÖÓ Ù Ó× ÔÓÖ Ð ÐÐ Ñ split key rec xt(T , x, T<, T>) ÑÔÐ ÒØ × ÙÒ Ð Ð ÓÖ ØÑÓ ÜÔÐ Ó Ò Ü º½½º ´Ô Ò ¿ µº Ë T × ÙÒ Ö ÓÐ Ð ØÓÖ Ó¸ Ò¹ ØÓÒ ×¸ T< Ý T> ×ÓÒ Ö ÓÐ × Ð ØÓÖ Ó× Ò Ô Ò ÒØ ׺ split key rec xt(Ê(T ), x, T< , T> ) T T< y y>x y Ä(T ) Ê(T ) Ä(T ) Ê(T< ) T> =⇒ ´ µ ÒØ × Ô ÖØ ¹ ´ µ ×ÔÙ × Ô ÖØ ÓÒ Ö ÓÒ Ö ÙÖ º¾ split key rec xt(T , x, T<, T>) Demostraci´n (Por inducci´n sobre n = |T |) o o n = 0: × T = ∅¸ ÒØÓÒ × split key rec xt(T , x, T<, T>) ÔÖÓ Ù T< = T> = ∅¸ Ð Ù Ð × ÔÓÖ ¬Ò ÓÒ ÙÒ Ö ÓÐ Ð ØÓÖ Þ Óº Ð Ð Ñ ×¸ Ô٠׸ ÖØÓ Ô Ö n = 0º n > 0: ÓÖ ×ÙÑ ÑÓ× ÕÙ Ð Ð Ñ × ÖØÓ Ô Ö ØÓ Ó n Ý Ú Ö ¬ ÑÓ× × Ð Ð Ñ × ÖØÓ Ô Ö n + 1º Ë y = à (Ö Þ(T ))º Ë x > y¸ ÒØÓÒ × b Ö Þ(T<) = Ö Þ(T ) Ý Ð Ö ÓÐ T> Ý Ð ×Ù Ö ÓÐ Ö Ó Ê(T<) × Ð ÙÐ Ò Ö ÙÖ× Ú Ñ ÒØ ÓÒ Ð ÐÐ Ñ split key rec xt(Ê(T ), x, T<, T>) ÈÓÖ ÔÖ Ñ × Ð Ð Ñ ¸ Ä(T ) × Ð ØÓÖ Ó Ò¹ Ô Ò ÒØ ¸ ÔÙ × T Ø Ñ Ò ÐÓ ×º ÈÓÖ Ð ÔÓØ × × Ò Ù Ø Ú ¸ ÐÓ× Ö ÓÐ × Ê(T<) Ý T> ×ÓÒ Ð ØÓÖ Ó× Ò Ô Ò ÒØ ׸ ÔÙ × ÐÐÓ× ×ÓÒ Ð Ö ×ÙÐØ Ó Ð ÐÐ Ñ split key rec xt(Ê(T ), x, T<, T>)º Ð Ö ÞÓÒ Ñ ÒØÓ ÒØ Ö ÓÖ ÔÓ ÑÓ× ÓÒ ÐÙ Ö ÕÙ ÕÙ T> × Ð ØÓÖ Ó Ò Ô Ò ÒØ º ÉÙ Ö T< Ë ÑÓ× ÕÙ ×Ù× Ö Ñ × ÞÕÙ Ö Ý Ö ×ÓÒ Ð ØÓÖ × Ò Ô Ò ÒØ ׺ ÆÓ× ÐØ ¸ ÒØÓÒ ×¸ ÑÓ×ØÖ Ö ÕÙ Ð Ù ÓÒ º × × Ø × Ô Ö T<º È Ö ÐÐÓ ÑÓ× Ú Ö ¬ Ö ÕÙ ∀z ∈ T< , P(Ö Þ(T<) = z) = m ÓÒ m = |T<|º 1 ×ØÓ × ÕÙ Ú Ð ÒØ ÔÐ ÒØ Ö P(Ö Þ(T ) = z ∩ Ö Þ(T ) < x) P(Ö Þ(T<) = z | Ö Þ(T ) < x) = 1/n 1 = = P(Ö Þ(T ) < x) m/n m
  • 509.
    ´ 6.2. Arboles aleatorizados 483 Ë Ñ ØÖ Ñ ÒØ ¸ Ð Ñ ×ÑÓ Ö ÞÓÒ Ñ ÒØÓ × ÔÐ × x < y¸ ÒØ Ö Ñ Ò Ó ÐÓ× ÖÓÐ × T< Ý T>¸ Ö ×Ô Ø Ú Ñ ÒØ Ð Ð Ñ º½ × ÙØ Ð ÔÓÖÕÙ Ð Ô ÖØ ÓÒ × ÙÒ ÓÔ Ö ÓÒ ÒØ ÖÒ Ð Ò× Ö ÓÒ¸ ÙÝ Ú Ð Þ ×Ø ÑÓ×ØÖ ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ × Ù ÒØ Proposici´n 6.1 (Mart´ o ınez y Roura 1998 [8]) Ë T ÙÒ Ö ÓÐ Ð ØÓÖ Ó Ý × p ÙÒ ÒÓ Ó Ò× ÖØ Ö ÓÒ Ð Ú kº ÒØÓÒ ×¸ Ð ÐÐ Ñ insert(T , p) ÑÔÐ ÒØ Ò Ü º¾º½º½ ´Ô Ò µ ÔÖÓ Ù ÙÒ Ö ÓÐ Ð ØÓÖ Óº Demostraci´n (Por inducci´n sobre n = |T |) o o n = 0: × T = ∅¸ ÒØÓÒ × insert(∅, p) = pº ÄÓ× ×Ù Ö ÓÐ × Ä(p) Ý Ê(p) ×ÓÒ Ú Ó׸ ÐÓ× Ù Ð ×¸ ÔÓÖ ¬Ò ÓÒ¸ ×ÓÒ Ð ØÓÖ Ó׺ ËÓ Ö p × Ú Ö ¬ ÕÙ P(Ö Þ(p) = k) = 1 = |p| º 1 × Ô٠׸ insert(∅, p) = p × ÙÒ Ö ÓÐ Ð ØÓÖ Ó Ý Ð Ð Ñ × ÖØÓ Ô Ö n = 0º n > 0: ÓÖ ×ÙÑ ÑÓ× ÕÙ Ð Ð Ñ × ÖØÓ Ô Ö ØÓ Ó n Ý Ú Ö ¬ ÑÓ× × ÐÓ × Ô Ö n + 1º Ë T =insert(T , p)¸ × x = à (p) y = Ö Þ(T )º ÒØ × Ò× ÖØ Ö x, P(Ö Þ(T ) = y) = n ¸ ÔÙ × T × Ð ØÓÖ Óº 1 Ô ÖØ Ö ×Ø × ×ÙÔÓ× ÓÒ ×¸ ÔÓ ÑÓ× ×Ø Ò Ù Ö Ó× ×Ó× ×ÔÙ × Ð Ò× Ö ÓÒ ´½µ ÕÙ y ÓÒØ ÒÙ ÓÑÓ Ö Þ T Ó ´¾µ ÕÙ x × Ð Ö Þ T ½º Ë Ö Þ(T ) = y¸ ÒØÓÒ × x Ô Ö Ö Ò Ð ×ÓÖØ Ó Ò Ö ÖÒ Ð ØÓÖ Ó ÒØÖ ¼ Ý Ò ¼ Ö Ð Þ Ó ÔÓÖ Ð Ð ÓÖ ØÑÓ Ò× Ö ÓÒ Ý Ð ÔÖ Ó rn == n × Ö Ð×Óº Ä ÔÖÓ Ð ÕÙ Ð ÔÖ Ó rn == n × Ð×Ó × n+1 ´ Ð n ÓÑÔÐ Ñ ÒØÓ ÔÖÓ Ð ×Ø Ó n+1 ¸ ÕÙ × Ð ÔÖÓ Ð 1 ÕÙ x × Ö Þ T µº × ÔÙ × ∀y ∈ T , P(Ö Þ(T ) = y) 1 n 1 = × = n n+1 n+1 P(Ö Þ(T)=y) P(Ö Þ(T )=y) Ò ×Ø ×Ó x × Ö Ò× ÖØ Ó Ò Ð ÙÒÓ ÐÓ× ×Ù Ö ÓÐ × T ݸ ÔÓÖ Ð ÔÓØ × × Ò Ù Ø Ú ¸ Ð Ö ×ÙÐØ Ó × Ö ÙÒ Ö ÓÐ Ð ØÓÖ Óº ¾º Ë Ö Þ(T ) = x¸ ÒØÓÒ × x Ð ÔÖ Ó rn == n ×Ö ÖØÓ ×ØÓ ×Ù ÓÒ ÔÖÓ Ð P(Ö Þ(T ) = x) = n+1 ¸ ÕÙ × ÐÓ ×Ô Ö Ó × 1 ÙÒ Ð Ð ÓÖ ØÑÓº ÈÓÖ ÓØÖ Ô ÖØ ¸ T = < T<, x, T> >¸ ÓÒ T< Ý T> ×ÓÒ ÐÓ× Ö ÓÐ × Ö ×ÙÐØ ÒØ × random join(T , x, T<, T>) ÐÓ× Ù Ð × ×ÓÒ¸ ÔÓÖ Ð Ð Ñ º½¸ Ð ØÓÖ Ó× Ð Ö ×ÙÐØ Ó ÒØ Ö ÓÖ ÔÓ ÑÓ× ×Ø Ð Ö Ð ÓÖÓÐ Ö Ó × Ù ÒØ º Corolario 6.1 Ë K = {k1, k2, . . . , kn} ÙÒ ÓÒ ÙÒØÓ Ð Ú × Ù ÐÕÙ Ö º Ë T ÙÒ Ö ÓÐ Ð ØÓÖ Þ Óº ÒØÓÒ ×¸ Ù ÐÕÙ Ö Ô ÖÑÙØ ÓÒ Ò× Ö ÓÒ K ×Ó Ö T ¸ × ÙÒ Ð Ð Ó¹ Ö ØÑÓ × ÖÖÓÐÐ Ó Ò Ü º¾º½º½ ´Ô Ò µ¸ ÔÖÓ Ù ÙÒ Ö ÓÐ Ð ØÓÖ Þ Óº Ð ÓÖÓÐ Ö Ó ÓÒÐÐ Ú ÑÔÐ ÓÒ × ÑÔÓÖØ ÒØ ׺ Ò ÔÖ Ñ Ö ÐÙ Ö¸ Ù ÐÕÙ Ö × Ð ÓÖ Ò Ò× Ö ÓÒ¸ × ÑÔÖ Ó Ø Ò Ö ÑÓ× ÙÒ Ö ÓÐ Ð ØÓÖ Þ Óº Ò ÓØÖ × Ô Ð Ö ×¸ Ð Ö ÓÐ Ö ×ÙÐØ ÒØ × ÕÙ Ú Ð ÒØ ÙÒ ÓÒרÖÙ Ó Ô ÖØ Ö ÙÒ × Ù Ò Ò× Ö ÓÒ Ð ØÓÖ º ÓÒ× Ù ÒØ Ñ ÒØ ¸ ØÓ Ó× ÐÓ× Ö ×ÙÐØ Ó× ÓÒÓ Ó× Ô Ö ÙÒ ×ÓÒ ÔÐ Ð × Ð Ñ × ÑÔÓÖØ ÒØ ÐÐÓ× × Ð ÔÖÓÔÓ× ÓÒ º½¾ ÕÙ ÒÓ× ÔÖÓÑ Ð ÐØÙÖ Ð Ö ÓÐ O(Ð n)º
  • 510.
    484 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u Ò Ù ÒØÓ Ð Ð Ñ Ò ÓÒ¸ Ð ÔÖ Ñ Ö Ô ×Ó Ô Ö Ò Ð Þ ÖÐ × ×ØÙ Ö Ð ÙÒ ÓÒ Ü ÐÙ× Ú Ð ØÓÖ ¸ Ð Ù Ð × Ò Ð Þ Ò Ð Ð Ñ × Ù ÒØ Lema 6.2 (Mart´ ınez y Roura 1998 [8]) Ë Ò T< Ý T> Ó× Ö ÓÐ × Ð ØÓÖ Ó× Ò Ô Ò¹ ÒØ × Ø Ð ÕÙ ∀kl ∈ T<, ∀kr ∈ T>, kl < kr × Ö¸ ØÓ × Ð × Ð Ú × T< ×ÓÒ ×ØÖ Ø ¹ Ñ ÒØ Ñ ÒÓÖ × ÕÙ Ð × Ð Ú × T>º ÒØÓÒ ×¸ T = random join exclusive(T<, T>) × ÙÒ Ö ÓÐ Ð ØÓÖ Óº Demostraci´n (por inducci´n sobre m = |T<| y n = |T>|) o o m = 0 o n = 0: Ó ×Ø ÔÖ Ó¸ Ø Ò ÑÓ× Ó× ×Ó× ½º Ë m = 0 Ý n = 0¸ ÒØÓÒ × random join exclusive(T<, T>) = ∅¸ Р٠Р׸ ÔÓÖ ¬Ò ÓÒ¸ Ð ØÓÖ Óº ¾º Ë m = 0 Ó n = 0¸ ÒØÓÒ × random join exclusive(T<, T>) Ö ØÓÖÒ Ð Ö ÓÐ ÒÓ Ú Ó Ð Ô Ö¸ Р٠Р׸ ÔÓÖ ÔÖ Ñ × Ð Ð Ñ ¸ Ð ØÓÖ Óº Ð Ð Ñ ×¸ Ô٠׸ ÖØÓ Ô Ö m = 0 Ó n = 0º m > 0 y n > 0: × ¯ a=à (Ö Þ(T>))¸ ¯ b=à (Ö Þ(T>)) Ý ¯ T = random join exclusive(T<, T>) ×ÙÑ ÑÓ× ÕÙ a Ò Ð ×ÓÖØ Ó Ò Ö ÖÒ Ð ØÓÖ Ó ÒØÖ ½ Ý Ñ · Ò ½ ØÙ Ó Ò Ð random join exclusive() × ÖÖÓÐÐ Ó Ò Ü º¾º½º¾ ´Ô Ò ¼µ Ó × ÕÙ Ð ÔÖ Ó rn <= m × ÖØÓº ×ØÓ ÑÔÐ ÕÙ a × Ö Ð Ö Þ T º ÈÓ ÑÓ× Ó×ÕÙ Ö Ð Ö ÓÐ Ö ×ÙÐØ ÒØ Ð × Ù ÒØ ÑÓ Ó T = random join exclusive(T<, T> ) a random join exclusive(Ê(T< ), T> ) Ä(T< ) T> ÈÓÖ Ð ×ØÖÙ ØÙÖ Ð Ð ÓÖ ØÑÓ Ý Ð Ö ×ÙÐØ Ó Ð ×ÓÖØ Ó¸ Ð ÖÑ ÞÕÙ Ö T × Ä(T )¸ Ñ ÒØÖ × ÕÙ Ð Ö × Ð ÐÐ Ñ Ö ÙÖ× Ú random join exclusive(Ê(T<), T>)º ÓÖ Ò¸ Ä(T ) × ÙÒ Ö ÓÐ Ð ØÓÖ Ó Ô٠׸ ÔÓÖ ÔÖ Ñ × Ð Ð Ñ ¸ T Ø Ñ Ò ÐÓ ×º Á Ù ÐÑ ÒØ ¸ ÔÓÖ Ð ÔÓØ × × Ò Ù Ø Ú ¸ T> Ø Ñ Ò × Ð ØÓÖ Óº Ä(T ) Ý T> ×ÓÒ Ò Ô Ò ÒØ ׸ ÔÙ × Ä(T ) Ý Ê(T ) ×ÓÒ¸ ÔÓÖ ÔÖ Ñ × Ð Ð Ñ ¸ Ò Ô Ò ÒØ × Ý T> = random join exclusive(Ê(T<), T>) ׸ ÔÓÖ Ð ÔÓØ × × Ò Ù Ø Ú ¸ Ò Ô Ò ÒØ º À Ò Ó ÑÓ×ØÖ Ó ÕÙ Ð × ÖÑ× T ×ÓÒ Ð ØÓÖ × Ò Ô Ò ÒØ ׸ ×ÓÐÓ ÒÓ× Ö ×Ø ÑÓ×ØÖ Ö ÕÙ ∀x ∈ T< , P(Ö Þ(T ) = x) = m+n º ×ØÓ × 1 1 m 1 P(Ö Þ(T ) = x) = P(Ö Þ(Ä(T )) = x) × P(rn <= M × ÖØÓ) = × = m m+n m+n ÓÒ ×Ø Ð Ñ ¸ ר ÑÓ× Ò Ô ×ØÙ Ö Ð Ð Ñ Ò ÓÒ¸ Ð Ù Ð × Ò Ð Þ Ò Ð ÔÖÓÔÓ× ÓÒ × Ù ÒØ
  • 511.
    ´ 6.2. Arboles aleatorizados 485 ınez y Roura 1998 [8]) Ë T ÙÒ Proposici´n 6.2 (Mart´ o Ö ÓÐ Ð ØÓÖ Ó Ý x ÙÒ Ð Ú ÓÒØ Ò Ò T º Ë Ð ÐÐ Ñ remove(T , x) Ý × T Ð Ö ÓÐ Ð ØÓÖ Ó Ö ×ÙÐØ ÒØ ×ÔÙ × Ð ÐÐ Ñ remove()º ÒØÓÒ ×¸ T × ÙÒ Ö ÓÐ Ð ØÓÖ Óº Demostraci´n (por inducci´n sobre n = |T |) o o n = 1: ÒØÓÒ × T = ∅¸ Р٠Р׸ ÔÓÖ ¬Ò ÓÒ¸ Ð ØÓÖ Óº n > 1: ÒØÓÒ × ×ÙÑ ÑÓ× ÕÙ Ð Ð Ñ × ÖØÓ Ô Ö ØÓ Ó |T | < n Ý Ú Ö ¬ ÑÓ× × Ø Ñ Ò × ÖØÓ Ô Ö nº ÕÙ ÔÓ ÑÓ× × Ô Ö Ö Ó× ×Ó× ½º Ë Ö Þ(T ) = x¸ ÒØÓÒ × x × Ð Ñ Ò Ó ÙÒÓ ÐÓ× ×Ù Ö ÓÐ × T ݸ ÔÓÖ Ð ÔÓØ × × Ò Ù Ø Ú ¸ ר Ð Ñ Ò ÓÒ ÖÖÓ ÙÒ Ö ÓÐ Ð ØÓÖ Óº ¾º Ë Ö Þ(T ) = x¸ ÒØÓÒ × remove(T , x) ØÙ Ð ÐÐ Ñ random join(Ä(T ), Ê(T )) Р٠и ÔÓÖ Ð Ð Ñ º¾¸ × ÙÒ Ö ÓÐ Ð ØÓÖ Óº ÈÓ ÑÓ× ¬ÖÑ Ö¸ ÒØÓÒ ×¸ ÕÙ Ä(T ) Ý Ê(T ) ×ÓÒ Ö ÓÐ × Ð ØÓÖ Ó× Ò Ô Ò ÒØ ׺ ÆÓ× Ö ×Ø ÔÓÖ ÓÑÔÖÓ Ö ÕÙ ∀y ∈ T , P(Ö Þ(T ) = y) = n−1 ¸ ÐÓ Ù Ð × Ú Ö ¬ ÓÑÓ × Ù 1 P(Ö Þ(T ) = y) = P(Ö Þ(T ) = y | Ö Þ(T ) = x) × P(Ö Þ(T ) = x) + P(Ö Þ(T ) = y | Ö Þ(T ) = x) × P(Ö Þ(T ) = x) = P(Ö Þ(random join(Ä(T ), Ê(T ))) = y) × 1 + n − P(Ö Þ(T ) = y | Ö Þ(T ) = x) × n n 1 1 1 1 n−1 1 = × + × = n−1 n n−1 n n−1 ÙÖ º¿ ÍÒ Ö ÓÐ Ð ØÓÖ Þ Ó 512 ÒÓ Ó× Ð × ÔÖÓÔÓ× ÓÒ × ÑÓ×ØÖ ×¸ ÔÓ ÑÓ× ÒÙÒ Ö Ð × Ù ÒØ ÓÖÓÐ Ö Óº Corolario 6.2 Ë T × ÙÒ Ö ÓÐ Ð ØÓÖ Þ Ó Ù ÐÕÙ Ö ¸ ÒØÓÒ × Ù ÐÕÙ Ö × Ù Ò Ò× Ö ÓÒ × Ý Ð Ñ Ò ÓÒ × ÔÖÓ Ù ÙÒ Ö ÓÐ Ð ØÓÖ Óº Ë ÙÒ Ð ÓÖÓÐ Ö Ó ÒØ Ö ÓÖ¸ Ù ÐÕÙ Ö × Ð × Ù Ò Ò× Ö ÓÒ¸ ÓÒ Ð Ñ Ò ÓÒ × ÒØ Ö Ð × Ö ØÖ Ö ×¸ Ð Ö ÓÐ Ö ×ÙÐØ ÒØ × ÑÔÖ × Ð ØÓÖ Óº ÈÓ ÑÓ׸ Ô٠׸ ÓÒ ÐÙ Ö ÕÙ Ò ÔÖÓÑ Ó Ð ÐØÙÖ Ð Ö ÓÐ Ð ØÓÖ Þ Ó × O(Ð n)º ÈÙ ×ØÓ ÕÙ Ð Ø ÑÔÓ Ð × ÓÔ Ö ÓÒ × Ò× Ö ÓÒ Ý Ð Ñ Ò ÓÒ Ô Ò Ð ÐØÙÖ ¸ ÔÓ ÑÓ× ÓÒ ÐÙ Ö¸ Ø Ñ Ò¸ ÕÙ Ò ÔÖÓÑ Ó Ð Ò× Ö ÓÒ Ý Ð Ð Ñ Ò ÓÒ ×ÓÒ O(Ð n)º ÄÓ× Ö ÓÐ × Ð ØÓÖ Þ Ó× Ø Ò Ò Ó× Óר × ÓÒ Ð × Ö ×Ô ØÓ ÐÓ× Ò Ö Ó× Ð × Ó׺ Ò ÔÖ Ñ Ö ÐÙ Ö¸ Ð ×ØÖÙ ØÙÖ ÒÓ Ó ÙÒ Ö ÕÙ Ö ×Ô Ó ÓÒ Ð Ô Ö Ð¹ Ñ Ò Ö Ð Ö Ò Ð º Ò × ÙÒ Ó ÐÙ Ö¸ ÙÒ Ö ÕÙ Ö ÓÔ Ö ÓÒ × ÓÒ Ð × Ö ×Ô ØÓ ÙÒ º ÙÖ ÒØ Ð Ò× Ö ÓÒ¸ × Ò × Ö Ó ØÙ Ö ÙÒ Ô ÖØ ÓÒ Ý ØÙ Ð Þ Ö Ð× Ö ÒР׺ Ô × Ö Ð × Ö ×ØÖ ÓÒ × ÒØ Ö ÓÖ ×¸ ÙÒ Ø Ò Ð Ú ÒØ ÐÑÒ Ö Ð Ô Ð ÖÓ Ö ÔÖ × ÒØ Ó ÔÓÖ Ð × × Ó Ò Ð × Ù Ò Ò× Ö ÓÒ Ý Ð × Ò× Ö ÓÒ × ÒØ Ö¹ Р׺ Ò Ò ÙÖ ¸ Ð ÓÒØ ÓÖ ÔÖ × ÒØ Ò ÒÓ Ó Ð Ø Ô Ö Ø Ý Ò ØÙÖ Ð¹ Ñ ÒØ Ð ×Ó ÔÓÖ ÔÓ× ÓÒ¸ ÓÒ ØÓ × ×Ù× ÓÔ Ö ÓÒ × ×Ó ×¸ Ø Ð ÓÑÓ × ÜÔÐ Ó Ò Ü º½½ ´Ô Ò ¿ ¿µº ×ØÓ ÙÐØ ÑÓ × ÕÙ Þ Ð Ö Ò ÓÒ ×Ø ×ÕÙ Ñ ÕÙ Ð Ö Óº
  • 512.
    486 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u 6.3 Treaps ÓÖ ×ØÙ Ö ÑÓ× ÓØÖÓ Ò ÓÕÙ Ð ØÓÖ Þ ÓÒ Ö ÐÑ ÒØ Ö ÒØ ÙÒ Ð ×ØÖÙ ØÙÖ ØÖ Ôº Definici´n 6.3 (Treap) o Ë T ÙÒ Ö ÓÐ Ò Ö Ó Ò Ù Ð ÒÓ Ó ni Ø Ò Ó× ÑÔÓ× × Ö ½º à (ni) ∈ K × Ð Ð Ú Ù×ÕÙ ¸ ÓÒ K × ÙÒ ÓÒ ÙÒØÓ ÓÖ Ò Ð Ù ÐÕÙ Ö º ¾º ÈÊÁÇ(ni) ∈ P × Ð ÔÖ ÓÖ Ð ÒÓ Ó¸ ÓÒ P × ÙÒ ÓÒ ÙÒØÓ ÓÖ Ò Ð Ù ÐÕÙ Ö º ÒØÓÒ ×¸ T × ÙÒ ØÖ Ô × Ý ×ÓÐÓ × ¯ T ∈ × ÙÒ Ð × Ð Ú × Kº ¯ ∀ni ∈ T, ÈÊÁÇ(ni) ≤ ÈÊÁÇ(Ä(ni)) y ÈÊÁÇ(ni) ≤ ÈÊÁÇ(Ê(ni)) . Ä × ÙÒ ÔÖÓÔ × ÒÓÑ Ò Ö Ð ÓÒ Ð Ò ×ØÖÓº Ë Ð × ÔÖ ÓÖ × ×ÓÒ ÙÒ ×¸ × Ö¸ × ×Ø × ÒÓ × Ö Ô Ø Ò¸ ÒØÓÒ × Ð ØÖ Ô × ÒÓÑ Ò Ó ÔÙÖÓ º Ä ÔÖ Ñ Ö ÔÖÓÔ ÓÖÖ ×ÔÓÒ Ð ÓÖ Ò ÙÒ Ð × ÙÒ Ð ÓÖ Ò ÙÒ Ôº ÐÐ ¸ Ô٠׸ Ð ÒÓÑ Ö ØÖ Ô ØÖ Ý Ôº ÈÓ ÑÓ× Ö Ø Ö Þ Ö ÙÒ ØÖ Ô ÓÑÓ ÙÒ × Ù Ò Ô Ö × ´ Ð Ú ¸ ÔÖ ÓÖ µ ÓÖÖ ×¹ ÔÓÒ ÒØ ÐÓ× ÓÒØ Ò Ó× ÒÓ Óº ÈÓÖ ÑÔÐÓ¸ Ð ØÖ Ô Ð ¬ ÙÖ º ÔÙ Ö ¹ Ø Ö Þ Ö× ÓÑÓ (1, 470)¸ (2, 537)¸ (3, 625)¸ (5, 658)¸ (7, 608)¸ (8, 652)¸ (14, 685)¸ (17, 713)¸ (19, 729)¸ (21, 575)¸ (22, 769)¸ (24, 571)¸ (27, 515)¸ (44, 734)¸ (45, 587)¸ (55, 511)¸ (56, 659)¸ (60, 854)¸ (61, 681)¸ (62, 457)¸ (65, 718)¸ (66, 718)¸ (77, 558)¸ (84, 649)¸ (86, 646)¸ (89, 454)¸ (92, 490)¸ (93, 725)¸ (94, 761)¸ (96, 440) ÍÒ ØÖ Ô Ø Ò ÙÒ ÔÖÓÔ ÑÙÝ ÒØ Ö × ÒØ Ö Ø Ö Þ ÔÓÖ Ð × Ù ÒØ Ð Ñ º Lema 6.3 (Lema de la unicidad del treap (Seidel - Aragon 1996) [13]) Ë K = {k1, k2, . . . kn} ÙÒ ÓÒ ÙÒØÓ Ð Ú × Ý P = {p1, p2, . . . pn} ÙÒ ÓÒ ÙÒØÓ ÔÖ ÓÖ ×º ÒØÓÒ ×¸ Ð ÓÒ ÙÒØÓ {(k1, p1), (k2, p2), . . . (kn, pn), } ⊂ K × P Ø Ò ÙÒ ÙÒ Ó ØÖ Ôº Demostraci´n (Por inducci´n sobre n) o o n = 1: Ò ×Ø ×Ó Ü ×Ø ÙÒ ÙÒ Ó ØÖ Ô ÓÒ ÓÖÑ Ó ÔÓÖ ÙÒ Ô Ö ÙÒ Óº Ð Ð Ñ × ÖØÓ ÔÖ n = 1º n > 1: ÓÖ ×ÙÑ ÑÓ× ÕÙ Ð Ð Ñ × ÖØÓ Ô Ö ØÓ Ó n Ý Ú Ö ¬ ÑÓ× ×Ù Ú Ö Ô Ö n + 1º ÈÙ ×ØÓ ÕÙ Ð × ÔÖ ÓÖ × ×ÓÒ ÙÒ ×¸ Ð ØÖ Ô n + 1 ÒÓ Ó× ×ÓÐÓ ÔÙ Ø Ò Ö ÙÒ Ö Þ ÙÝ ÔÖ ÓÖ × Ð Ñ ÒÓÖ ØÓ ׺ Ë (ki, pi) Ð ÒÓ Ó Ö Þ Ð ØÖ Ôº ÍÒ Ú Þ Ø ÖÑ Ò Ð Ö Þ Ð ØÖ Ô Ý Ù× Ð ÔÖÓÔ ÓÖ Ò ÙÒ ¸ Ð ÓÒ ÙÒØÓ ÒÓ Ó× Ð × Ö Ñ × ÞÕÙ Ö Ý Ö ÕÙ Ø ÖÑ Ò Ó Ò K< = {(k1, p1), . . . , (Ki−1, pi−1)} Ý K> = {(ki+1, pi+1), . . . , (kn, pn)}¸ Ö ×Ô Ø Ú Ñ ÒØ º ÈÓÖ Ð ÔÓØ × × Ò Ù Ø Ú ¸ K< Ý K>¸ ÙÝ × Ö Ò Ð × ×ÓÒ Ò Ö ÓÖ × n + 1¸ Ø Ò Ò ØÖ Ô× ÙÒ Ó׺ Ð Ð Ñ × ÖØÓ Ô Ö ØÓ Ó n Ò ÕÙ ÓÒ× ×Ø Ð Ð ØÓÖ ÙÒ ØÖ Ô Ä Ö ×ÔÙ ×Ø × Ò Ù ÒØÖ Ò Ð × Ð ÓÒ Ð ÔÖ ÓÖ º Ù Ò Ó × Ö ÙÒ ÒÙ ÚÓ ÒÓ Ó¸ × × Ð ÓÒ Ð ÔÖ ÓÖ Ð ØÓÖ Ñ ÒØ ¸ × Ò× ÖØ Ð ÒÓ Ó × ÙÒ Ð Ð ÓÖ ØÑÓ Ð × Ó Ò× Ö ÓÒ Ò Ý Ð × Ú ÓÐ ÓÒ × Ú ÒØÙ Ð × Ð Ö Ð ÓÒ Ð Ò ×ØÖÓ × ÓÖÖ Ò Ñ ÒØ ÖÓØ ÓÒ ×º
  • 513.
    6.3. Treaps 487 96 440 89 454 62 92 457 490 1 77 93 470 558 725 55 66 86 94 511 718 646 761 27 56 65 84 515 659 718 649 2 45 61 537 587 681 24 44 60 571 734 854 21 575 7 22 608 769 3 8 625 652 5 14 658 685 17 713 19 729 ÙÖ º ÑÔÐÓ ØÖ Ôº ÑÔÓ× ×ÙÔ Ö ÓÖ × Ö ÔÖ × ÒØ Ò Ð × Ð Ú × Ò Ö ÓÖ × ÔÖ ÓÖ ¹ × 6.3.1 El TAD Treap<Key> Ð ÔÖ Ñ Ö Ô ×Ó Ò Ð × ÒÓ ÙÒ Ì ÕÙ ÒÓ× ÑÓ Ð ÙÒ ØÖ Ô × Ø ÖÑ Ò Ö Ð ×ØÖÙ ØÙÖ Ð ÒÓ Ó ÕÙ ÐÓ ÓÒ ÓÖÑ º À Ý Ó× Ñ Ò Ö × Ò Ö Ð × ÑÔÐ ÒØ Ö ÙÒ ØÖ Ô
  • 514.
    488 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u Ö ÙÖ× Ú Ó Ø Ö Ø Ú Ñ ÒØ º Ñ Ó× Ò ÓÕÙ × ×ÓÒ ÑÙÝ × Ò ÐÐÓ× Ý ÓÑÔ ÖØ Ò Ð ×ØÖÙ ØÙÖ Ð ÒÓ Óº ÈÓÖ × Ö ÞÓÒ¸ Ñ ÒØ Ò Ö ÑÓ× Ð ×ØÖÙ ØÙÖ Ð ÒÓ Ó Ò ÙÒ Ö ÚÓ × Ô Ö Ó ÒÓÑ Ò Ó ØÖ ÔÆÓ ºÀ ¸ Ð Ù Ð × ×ØÖÙ ØÙÖ ÓÑÓ × Ù ØÖ ÔÆÓ ºÀ ≡ const long Max_Priority = ULONG_MAX; const long Min_Priority = 0; class TreapNode_Data { unsigned long priority; TreapNode_Data () : priority (Max_Priority) { /* empty */ } unsigned long & getPriority () { return priority; } }; DECLARE_BINNODE_SENTINEL(TreapNode, 80, TreapNode_Data); # define PRIO(node) ( (node) -> getPriority () ) ¬Ò × TreapNode¸ Ù× Ò ÙÒ º Í× × DECLARE BINNODE SENTINEL ¾ º ÕÙ × ¬Ò Ð ÒÓ Ó Ò Ö Ó TreapNode<Key> ÕÙ ÐÑ Ò ÙÒ ÔÖ ÓÖ Ñ ÒØ Ð Ñ ØÓ Ó getPriority() Ó Ð Ñ ÖÓ PRIOº Ð Ö ÚÓ ÜÔÓÖØ Ó× ÓÒר ÒØ × Min Priority Ý Max Priority ÕÙ ÓÖÖ ×ÔÓÒ Ò ÐÓ× Ú ÐÓÖ × Ñ Ò ÑÓ Ý Ñ Ü ÑÓ ÕÙ ÔÙ Ø Ò Ö ÙÒ ÔÖ ÓÖ º ÍÒ TreapNode<Key> Ø Ò ÙÒ Ú ÐÓÖ Node::NullPtr ÔÙÒØ Ó ÙÒ ÒØ Ò Ð ÓÒ ÔÖ ÓÖ Ñ Ü Ñ º ר ÒÓ Ó ÙÒ ÒØ Ò Ð Ô Ö Ø Ò Ö ÖÓØ ÓÒ × × Ò ÒØ × Ó × Ð Ö Óк ÆÙ ×ØÖ ÑÔÐ ÒØ ÓÒ Ð ØÖ Ô Ö ÕÙ Ö ÙÒ ÒÓ Ó Ö Ô Ö Ð Ö Þº Ì Ð ÒÓ Ó Ø Ñ Ò ÙÒ ÒØ Ò Ð Ô Ö Ø Ò Ö ÖÓØ ÓÒ × × Ò ÒØ × Ð Ö Þº ÓÖ ÔÖÓ ÑÓ× × ÖÖÓÐÐ Ö Ð Ì Treap<Key> ØÔÐ ØÖ ÔºÀ ≡ template <template <typename> class NodeType, typename Key, class Compare> class Gen_Treap { Å Ñ ÖÓ× Gen Treap<Key> }; Ð × × ÔÙ Ð × Gen Treap<Key> ¬Ò × Gen Treap¸ Ù× Ò ÙÒ º ÒØ × ÑÔÐ ÒØ Ö ÐÓ× ÓÒרÖÙ ØÓÖ ×¸ × Ò × Ö Ó ¬Ò Ö ÐÓ× ØÖ ÙØÓ× ÒØ ÖÒÓ× Gen Treap<Key> Å Ñ ÖÓ× Gen Treap<Key> ≡ ´ µ Node head; Node * head_ptr; Node *& tree_root; head × ÙÒ ÒÓ Ó Ö ¸ Ô Ö ÒØ Ò Ð Ð Ö Þ¸ head ptr × ÙÒ ÔÙÒØ ÓÖ Ð ÒÓ Ó Ö Ý tree root × ÙÒ Ö Ö Ò ÔÙÒØ ÓÖ Ð Ö Þ Ð ØÖ Ôº ÍÒ ØÖ Ô Ö ÕÙ Ö ÙÒ ÙÒ ÓÒ ÕÙ Ò Ö ÒÙÑ ÖÓ× Ð ØÓÖ Ó× ÓÖÖ ×ÔÓÒ ÒØ × Ð × ÔÖ ÓÖ ×º È Ö ÐÐÓ¸ ÒÓ× Ú Ð ÑÓ× Ð Ð ÓØ gsl¾º Í× Ö ÑÓ× Ð Ò Ö ÓÖ ØÓÖ¹ ¾ Gnu Scientific Library º
  • 515.
    6.3. Treaps 489 Ò Ó ´ ÌÛ ×Ø µ¸ ØÙ ÐÑ ÒØ ÓÒÓ Ó ÓÑÓ Ð Ñ ÓÖ Ò Ö ÓÖ ÒÙÑ ÖÓ× × Ù Ó¹ Ð ØÓÖ Ó× ½¼¸ ¸ ½½ Å Ñ ÖÓ× Gen Treap<Key> +≡ ´ µ ¼ gsl_rng * r; Ä Ð × Gen Treap<Key> ÒÓ × Ô Ö Ù×Ó Ö ØÓ Ð Ð ÒØ ¸ ÔÙ × ×Ù ÖÓÐ × ÑÔÐ ÒØ Ö ÙÒ ØÖ Ô Ò Ö Ó ÕÙ × Ò Ô Ò ÒØ ÕÙ ×Ù× ÒÓ Ó× × Ò Ú ÖØÙ Ð × Ó ÒÓº Ð Ð ÒØ Ù× Ö Ð ÙÒ Ð × × Ù ÒØ × Ð × × Ð × × ÔÙ Ð × Gen Treap<Key> ≡ ´ µ template <typename Key, class Compare = Aleph::less<Key> > class Treap : public Gen_Treap<TreapNode, Key, Compare> { /* empty */ }; template <typename Key, class Compare = Aleph::less<Key> > class Treap_Vtl : public Gen_Treap<TreapNodeVtl, Key, Compare> { /* empty */ }; Í× × Gen Treap Ò TreapNode º 6.3.2 Inserci´n en un treap o ÓÒ ÔØÙ ÐÑ ÒØ ¸ Ð Ò× Ö ÓÒ ÙÒ ÒÓ Ó p ÔÙ Ö Ø Ö Þ Ö× Ò Ó× Ô ÖØ × ½º ØÙ Ö ÙÒ Ò× Ö ÓÒ ÓÑÓ Ò × Ö¸ ×Ù ×Ø ØÙ Ö Ð ÒÓ Ó ÜØ ÖÒÓ ÔÓÖ pº ¾º ÊÓØ Ö p¸ ÓÖÑ ÕÙ ×Ø ×Ù Ò Ú Ð¸ ר ÕÙ ×Ù ÔÖ ÓÖ ÒÓ Ú ÓÐ Ð Ö Ð ÓÒ Ò ×ØÖ Ðº ר ÑÓ× ÔÖ Ô Ö Ó× Ô Ö ÑÔÐ ÒØ Ö Ð Ð ÓÖ ØÑÓ Ò× Ö ÓÒ ÁÒ× Ö ÓÒ Ò Gen Treap<Key> ≡ static Node * insert(Node * root, Node * p) { if (root == Node::NullPtr) return p; Node * insertion_result = NULL; if (Compare() (KEY(p), KEY(root))) { insertion_result = insert(LLINK(root), p); if (insertion_result == Node::NullPtr) return Node::NullPtr; LLINK(root) = insertion_result; if (PRIO(insertion_result) < PRIO(root)) return rotate_to_right(root); else return root; } else if (Compare() (KEY(root), KEY(p))) { insertion_result = insert(RLINK(root), p); if (insertion_result == Node::NullPtr) return Node::NullPtr; RLINK(root) = insertion_result; if (PRIO(insertion_result) < PRIO(root))
  • 516.
    490 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u return rotate_to_left(root); else return root; } return Node::NullPtr; } insert() ØÙ ÙÒ Ù×ÕÙ Ö ÙÖ× Ú Ð Ð Ú ÓÒØ Ò Ò Ð ÒÓ Ó pº Ë × Ò¹ Ù ÒØÖ ÙÒ ÒÓ Ó ÓÒ Ø Ð Ð Ú ¸ ÒØÓÒ × × Ö ØÓÖÒ Node::NullPtr º Ë ¸ ÔÓÖ Ð ÓÒØÖ Ö Ó¸ ÒÓ × Ò Ù ÒØÖ Ð Ð Ú ¸ ÒØÓÒ × Ð Ö ÙÖ× ÓÒ × Ø Ò Ò Ð ÒÓ Ó ÜØ ÖÒÓ ÓÒ Ò ÐÑ ÒØ × Ò× ÖØ Ð ÒÓ Óº Ä × Ù Ò Ö ÙÖ× Ú Ö ØÓÖÒÓ× Ú Ö ¬ × Ý ÙÒ Ú ÓÐ ÓÒ Ð Ö Ð ÓÒ Ò ×ØÖ Ð¸ Ð Ù Ð Ú ÒØÙ ÐÑ ÒØ × ÓÖÖ ÓÒ ÙÒ ÖÓØ ÓÒº Ä Ú Ö× ÓÒ ÒØ Ö ÓÖ insert() × ÙÒ Ñ Ñ ÖÓ ÔÖ Ú Ó¸ ר Ø Ó¸ ÙÝÓ ÖÓÐ × Ö Ð Þ Ö Ð Ò× Ö ÓÒ Ý ÓÖÖ Ö Ð × Ú ÓÐ ÓÒ × Ð Ö Ð ÓÒ Ò ×ØÖ Ðº Ä × Ð ÓÒ Ð ØÓÖ Ð ÔÖ ÓÖ Ý Ð ÒÚÓ ÓÒ Ò Ð Ð Ñ ØÓ Ó Ö ÙÖ× ÚÓ ×ÓÒ Ö Ð Þ Ó× ÔÓÖ Ð Ú Ö× ÓÒ ÔÙ Ð insert() ÙÝ ¬Ò ÓÒ × ÓÑÓ × Ù ¼ Å Ñ ÖÓ× Gen Treap<Key> +≡ ´ µ ¼ Node * insert(Node * p) { PRIO(p) = gsl_rng_get(r); // selecci´n aleatoria de prioridad o Node * result = insert(tree_root, p); if (result == Node::NullPtr) return NULL; tree_root = result; return p; } 6.3.3 Eliminaci´n en treap o Ä Ð Ñ Ò ÓÒ × ÓÒ ÔØÙ ÐÑ ÒØ Ñ × × ÑÔÐ ÕÙ Ð Ð × Ò ÙÒ º ÈÖ Ñ ÖÓ × Ù× Ð ÒÓ Ó ÓÒ Ð Ð Ú ÒØ Ö ×º ÍÒ Ú Þ Ù Ó¸ Ð ÒÓ Ó × ÖÓØ Ñ Ò Ö ÕÙ ×Ù Ó Ñ ÒÓÖ ÔÖ ÓÖ ×Ù Ò Ú Ðº Ð ÔÖÓ ×Ó ÓÒØ ÒÙ ×Ø ÕÙ Ð ÒÓ Ó Ð Ñ Ò Ö ÚÒ Ó Ò × ÑÓÑ ÒØÓ Ð ÒÓ Ó × ×Ù ×Ø ØÙÝ ÔÓÖ Node::NullPtr º ËÓÖÔÖ Ò ÒØ Ñ ÒØ ¸ ÙÒ Ú Ö× ÓÒ Ø Ö Ø Ú Ð Ð Ñ Ò ÓÒ × ÐÑ ÒØ Ö Ð Þ Ð¸Ð Ù Ð × ×ØÖÙ ØÙÖ Ò Ó× Ô ÖØ × ÕÙ × ÔÖ × ÒØ Ò ÓÑÓ × Ù ¼ Å Ñ ÖÓ× Gen Treap<Key> +≡ ´ µ ¼ Node * remove(const Key & key) { Ù× Ö ÒÓ Ó ÐÑÒ ÖÔ ¼ if (p == Node::NullPtr) return NULL; // clave no fue encontrada ÊÓØ Ö Ô ×Ø ÕÙ ÚÒ Ó ½ p->reset(); return p; } Ð ÔÖ Ñ Ö ÐÓÕÙ ¸ Ù× Ö ÒÓ Ó ÐÑÒ Ö Ô ¼ ¸× Ò Ö Ù Ö Ð ÒÓ Ó ×ÙÔÖ Ñ Ö p Ý × ¬Ò ÓÑÓ × Ù ¼ Ù× Ö ÒÓ Ó Ð Ñ Ò Ö Ô ¼ ≡ ´ ¼ µ
  • 517.
    6.3. Treaps 491 Node ** pp = &RLINK(head_ptr); Node * p = tree_root; while (p != Node::NullPtr) if (Compare() (key, KEY(p))) { pp = &LLINK(p); p = LLINK(p); } else if (Compare() (KEY(p), key)) { pp = &RLINK(p); p = RLINK(p); } else break; ר ÐÓÕÙ Ð Ö Ó× Ú Ö Ð ×º Ä Ú Ö Ð p Ù Ö Ð Ö ÓÒ Ð ÒÓ Ó ×ÙÔÖ Ñ Öº ÈÙ ×ØÓ ÕÙ Ò Ð × ÙÒ × Ð ÒÓ Ó p × Ö ÖÓØ Ó ×Ø ÕÙ Ú Ò Ó ¸ × Ò × Ö Ó¸ Ò ÔÖ Ò Ô Ó¸ Ù Ö Ö Ð Ö ÓÒ Ð ÒÓ Ó Ô Ö Ø Ð ÕÙ Ñ Ò Ö ×Ø × ØÙ Ð Ò ÖÓØ ÓÒº ÓÑÓ Ð Ð ÓÖ ØÑÓ × Ø Ö Ø ÚÓ¸ × ÔÖ Ö Ð Ù Ö Ö Ð Ö ÓÒ Ð Ð ÒØÖÓ Ð ÒÓ Ó Ô Ö ÕÙ ÔÙÒØ p Ø Ð ÔÙÒØ ÓÖ × Ñ ÒØ Ò Ò Ð Ú Ö Ð ppº Ð × ÙÒ Ó ÐÓÕÙ ¸ ÊÓØ Ö Ô ×Ø ÕÙ Ú Ò Ó ½ × ×Ô ¬ Ð × Ù ÒØ ÑÓ Ó ½ ÊÓØ Ö Ô ×Ø ÕÙ Ú Ò Ó ½ ≡ ´ ¼ µ while ( Ô ÒÓ × Ó ½ ) if (PRIO(LLINK(p)) < PRIO(RLINK(p))) { *pp = rotate_to_right(p); pp = &RLINK(*pp); } else { *pp = rotate_to_left(p); pp = &LLINK(*pp); } *pp = Node::NullPtr; Ä ÙÐØ Ñ Ð Ò × Ð ÕÙ ¬Ò ÐÑ ÒØ Ð Ñ Ò Ð ÒÓ Ó p Ð × Ò ÖÐ Ð Ð Ð ÒÓ Ó ÕÙ ÔÙÒØ p Ð ÒÓ Ó ÜØ ÖÒÓ Node::NullPtr º Ð ÔÖ Ó Ô ÒÓ × Ó ½ ÓÒ× ×Ø Ò Ú Ö ¬ Ö × ÐÓ× ×Ù Ö ÓÐ × p ×ÓÒ ÜØ ÖÒÓ׺ ×ØÓ × Ö Ð Þ Ð × Ù ÒØ Ñ Ò Ö ½ Ô ÒÓ × Ó ½ ≡ ´ ½µ not (LLINK(p) == Node::NullPtr and RLINK(p) == Node::NullPtr) × Ð ÑÓÑ ÒØÓ Ö Ð Þ Ö ÙÒ Ó × ÖÚ ÓÒ ÒØ Ö × ÒØ Ð Ð Ñ Ò ÓÒ ÙÒ ÒÓ Ó Ó ÙÖÖ Ü Ø Ñ ÒØ Ò Ð Ñ ×ÑÓ × Ø Ó ÓÒ ×Ø × Ù × Ò× ÖØ Óº Ê ÓÖ ÑÓ× ÕÙ Ð Ò× Ö ÓÒ ÓÑ ÒÞ ÔÓÖ ÓÐÓ Ö Ð ÒÙ ÚÓ ÒÓ Ó ÓÑÓ Ó º Ë ÑÓ× Ð Ñ Ò Ö ÙÒ Ð Ú Ý ÐÙ Ó Ò× ÖØ ÖÐ ¸ Ð Ó Ð ÒÓ Ó Ò× Ö ÓÒ × Ü Ø Ñ ÒØ Ð Ñ ×Ñ ÕÙ ÙÒÓ Ù Ð Ñ Ò º ÍÒ ÑÔÐÓ ×Ø × ØÙ ÓÒ × ÐÙ×ØÖ ÓÒ Ð ÒÓ Ó 38 Ð ¬ ÙÖ ºº ÁÒØÙ Ø Ú Ñ ÒØ ר ÒÓÑ ÒÓ × Ú Ò Ó ÔÓÖ Ð Ð Ñ Ð ÙÒ Ð ØÖ Ô
  • 518.
    492 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u 5 8 5 1 12 8 70 28 1 38 0 8 38 70 26 24 38 26 0 12 39 28 39 24 28 30 54 30 8 28 40 21 40 38 54 36 69 36 21 64 22 64 69 97 89 42 22 43 43 89 81 81 42 42 42 97 ´µ ´ µ 5 5 8 8 1 12 1 12 70 28 70 28 0 8 39 0 8 39 24 38 30 24 38 30 38 40 28 40 26 36 54 36 28 64 21 38 64 54 42 69 26 42 21 43 22 43 69 81 89 81 22 42 42 89 97 97 ´µ ´ µ ÙÖ º ÑÔÐÓ Ð Ñ Ò ÓÒ Ð Ð Ú 38 Ò ÙÒ ØÖ Ôº Ä ÔÓ× ÓÒ ¬Ò Ð Ð 38 ÒØ × ×ÙÔÖ Ñ ÖÐÓ × Ð Ñ ×Ñ ÕÙ Ð ÔÓ× ÓÒ Ò Ð Ò× Ö ÓÒº ´Ð Ñ º¿µº È Ö ÕÙ Ð ØÖ Ô × ÙÒ Ó ØÖ Ú × ØÓ × Ð × ÑÓ ¬ ÓÒ ×¸ Ð Ò× Ö ÓÒ Ý Ð Ñ Ò ÓÒ × ÑÔÖ Ò Ú Ö Ð Ñ ×ÑÓ ØÖ Ôº 6.3.4 An´lisis de los treaps a Ò Ò Ð × × ÐÓ× ØÖ Ô× Ö ÕÙ Ö ×Ø Ð Ö ÙÒ ÔÖÓÔ ÑÙÝ ×Ó Ð Ð ØÓÖ Ð ÔÖÓÔ Ù× Ò Ñ ÑÓÖ Ò Ð × × ÓÒ × Ð ØÓÖ ×º Ì Ð ÔÖÓÔ ×Ø ÔÓÖ Ð × Ù ÒØ ÔÖÓÔÓ× ÓÒ
  • 519.
    6.3. Treaps 493 Proposici´n 6.3 o ÍÒ ØÖ Ô T × ÙÒ Ö ÓÐ Ò Ö Ó Ð ØÓÖ Óº Ò ÓØÖ × Ô Ð Ö ×¸ ÙÒ ØÖ Ô × ÕÙ Ú Ð ÒØ ÙÒ ÓÒרÖÙ Ó Ô ÖØ Ö ÙÒ × ¹ ÙÒ Ò× Ö ÓÒ Ð ØÓÖ º Demostraci´n ÈÙ ×ØÓ ÕÙ Ð × ÔÖ ÓÖ o × ×ÓÒ × Ð ÓÒ × Ð ØÓÖ Ò Ô Ò ÒØ ¹ Ñ ÒØ ¸ ÔÓ ÑÓ× ×ÙÑ Ö ÕÙ ØÓ × Ð × ÔÖ ÓÖ × ×ÓÒ × Ó × ÒØ × ÕÙ × Ò Ð × ÙÒ Ò× Ö ÓÒº Ë K = {k1, k2, . . . , kn} ÙÒ × Ù Ò Ò× Ö ÓÒ Ù ÐÕÙ Ö Ý × P = {p1, p2, . . . , pn} ÙÒ ÓÒ ÙÒØÓ ÔÖ ÓÖ × × Ð ÓÒ × Ð ØÓÖ Ò Ô Ò ÒØ Ñ ÒØ ÕÙ ×ÓÒ × Ò × Ð × Ð Ú × K Ø Ð ÕÙ Ô Ö (ki, pi) ÓÑÔÓÒ Ö ÙÒ ÒÓ Ó Ð ØÖ Ôº ÈÓÖ Ð Ð Ñ º¿¸ × ÑÓ× ÕÙ × Ð × Ð Ú × Ý ×Ù× ÔÖ ÓÖ × Ð ØÖ Ô × ÙÒ Óº ×ØÓ ÑÔÐ ÕÙ Ð ÓÖ Ò Ò× Ö ÓÒ ÒÓ Ø Ð ØÖ Ô Ö ×ÙÐØ ÒØ º ר ÑÓ Ó¸ × Ò Ô Ö Ò Ö Ð ¸ ÔÓ ÑÓ× ×ÙÑ Ö ÙÒ × Ù Ò Ò× Ö ÓÒ SABB ÕÙ Ú × Ð Ñ ÒÓÖ ×Ø Ð Ñ ÝÓÖ ÔÖ ÓÖ Ð Ù Ð ÔÓ ÑÓ× Ö Ð Þ Ö Ð × × Ù ÒØ × Ó × ÖÚ ÓÒ × ½º Ê ×Ô ØÓ Ð ÓÒ ÙÒØÓ Ð Ú × K¸ Ð ÔÖÓ Ð ÕÙ SABB × Ð Ú ÐÓÖ ÙÒ Ô ÖÑÙØ ÓÒ ×Ô ¬ × |K|! ¸ ÔÙ × Ð ÓÖ Ò Ð Ô ÖÑÙØ ÓÒ ×Ø 1 Ó ÔÓÖ Ð ÓÖ Ò Ð × ÔÖ ÓÖ × ÕÙ ×ÓÒ × Ò × Ð ØÓÖ Ñ ÒØ Ð Ú º ÈÓÖ Ø ÒØÓ¸ Ð × Ù Ò SABB ÓÖ Ò ÔÓÖ ÔÖ ÓÖ × Ð ØÓÖ ¸ ÔÙ × Ð × ÔÖ ÓÖ × Ù ÖÓÒ × Ó × Ð ØÓÖ Ò Ô Ò ÒØ Ñ ÒØ º ¾º SABB ÒÓ Ù× ÖÓØ ÓÒ × Ò Ð ØÖ Ô¸ ÔÙ × ÒÓ Ó × Ò× ÖØ Ó ÓÑÓ Ó Ý¸ ÔÙ ×ØÓ ÕÙ Ù Ò× ÖØ Ó ÔÓÖ ÔÖ ÓÖ × Ò ÒØ ¸ Ð Ö Ð ÓÒ Ò ×ØÖ Ð Ñ × × Ú ÓÐ º ÐÓ ÒØ Ö ÓÖ¸ ÔÓ ÑÓ× ÓÒ ÐÙ Ö ÕÙ Ð Ò× Ö ÓÒ SABB Ó ÙÖÖ Ð Ñ ×Ñ Ñ Ò Ö ÕÙ Ò ÙÒ º ÈÙ ×ØÓ ÕÙ SABB × ÙÒ × Ù Ò Ð ØÓÖ Ý ÕÙ Ð Ò× Ö ÓÒ Ó ÙÖÖ ÓÑÓ Ò ÙÒ ¸ ÔÓ ÑÓ× ÓÒ ÐÙ Ö ÕÙ ÙÒ ØÖ Ô × ÕÙ Ú Ð ÒØ ÙÒ ÓÒרÖÙ Ó Ô ÖØ Ö ÙÒ × ÙÒ Ò× Ö ÓÒ Ð ØÓÖ ÙÖ º ÍÒ ØÖ Ô 512 ÒÓ Ó× Ä ÔÖÓÔÓ× ÓÒ ÒØ Ö ÓÖ ÒÓ× Ö ÒØ Þ ÕÙ Ð Ø ÑÔÓ ×Ô Ö Ó Ô Ö Ð Ù×ÕÙ Ò ÙÒ ØÖ Ô × O(Ð n)º ÉÙ Ö Ð × Ò× Ö ÓÒ × Ý ×ÙÔÖ × ÓÒ × Ç × ÖÚ ÑÓ× ÕÙ Ñ × ÓÔ Ö ÓÒ × ×Ø Ò ÓÑ Ò × ÔÓÖ Ð ÐØÙÖ Ð Ö ÓÐ Ý ÕÙ ×Ø × Ö ×ÙÐØ Ò Ò ØÖ Ô׺ Ä ÒØ Ñ Ü Ñ ÖÓØ ÓÒ × Ø Ñ Ò × ÙÒ ÓÒ Ð ÐØÙÖ º ר Ñ Ò Ö ¸ ÔÓ ÑÓ× ÓÒ ÐÙ Ö ÕÙ Ð × ÓÔ Ö ÓÒ × Ò× Ö ÓÒ¸ Ù×ÕÙ Ý Ð Ñ Ò ÓÒ ×ÓÒ O(Ð n)º
  • 520.
    494 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u 6.3.5 Prioridades impl´ ıcitas ÄÓ× ØÖ Ô× ×ÓÒ Ö ÓÐ × Ð ØÓÖ Ó׺ ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð × ÑÔ ÒÓ Ð Ù×ÕÙ × ÕÙ Ú Ð ÒØ ÐÓ× Ö ÓÐ × Ð ØÓÖ Þ Ó׺ Ò Ù ÒØÓ Ð ×Ô Ó¸ ÐÓ× Óר × Ø Ñ Ò ×ÓÒ ÕÙ Ú Ð ÒØ ׸ ÔÙ × Ñ Ó× Ö ÓÐ × Ö ÕÙ Ö Ò ÐÑ Ò Ö ÙÒ ÒØ ÖÓ ÓÒ Ð ÔÓÖ ÒÓ Ó Ò ÐÓ× Ö ÓÐ × Ð ØÓÖ Þ Ó× × Ð Ö Ò Ð Ò ÐÓ× ØÖ Ô× × Ð ÔÖ ÓÖ º ËÓÖÔÖ Ò ÒØ Ñ ÒØ ¸ Ò ÙÒ ØÖ Ô ÔÓ ÑÓ× Ó Ú Ö Ð ÔÖ ÓÖ × Ð ×Ù ×Ø ØÙ ÑÓ× ÔÓÖ ÙÒ ÙÒ ÓÒ × ÕÙ ØÖ Ò× ÓÖÑ Ð Ð Ú ÙÒ Ú ÐÓÖ ÔÖ ÓÖ º ר Ñ Ò Ö ¸ Ð ÔÖ ÓÖ ÒÓ Ò × Ø ÐÑ Ò Ö× ¸ ÔÙ × ×Ø ÔÙ Ð ÙÐ Ö× ÑÔÐ Ø Ñ ÒØ ÚÞ ÕÙ × Ö ÕÙ Ö º Ð ØÖ Ô Ó ÙÔ Ö ¸ ÒØÓÒ ×¸ ÙÒ ×Ô Ó ÕÙ Ú Ð ÒØ Ð ÙÒ º È Ö ÕÙ ×Ø Ò ÓÕÙ × ¬ Þ¸ × Ò × Ö ÙÒ Ù Ò ÙÒ ÓÒ × º Ò ×Ø × ÒØ Ó¸ ØÓ Ð Ø ÓÖ ÙÒ ÓÒ × × ÑÔ ÖØ Ò Ü º¾ ´Ô Ò µ × ÔÐ Ð º 6.4 ´ Arboles AVL ÍÒ Ö ÓÐ Îĸ Ó ÙÒ Îĸ × ÙÒ Ð × ×Ô Ð Ö ÓÐ Ò Ö Ó Ù×ÕÙ ¬Ò Ó ÓÑÓ × Ù o ´ Definici´n 6.4 (Arbol AVL) Ë T ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ º Ë ÕÙ T × ÎÄ × Ý ×ÓÐÓ × ∀ni ∈ T, −1 ≤ h(Ê(ni)) − h(Ä(ni)) ≤ 1 ´ºµ × Ö¸ Ô Ö ØÓ Ó ÒÓ Ó¸ Ð ÖÒ ÐØÙÖ ÒØÖ Ð Ö Ñ ÞÕÙ Ö Ý Ö ÒÓ Ü Ö Ð ÙÒ º È Ö ÙØÙÖÓ× × ÙÖ×Ó׸ Ð ÖÒ ÐØÙÖ ÙÒ ÒÓ Ó ni × ÒÓÑ Ò δ(ni) = h(Ê(ni)) − h(Ä(ni))º Ò ÓÒØ ÜØÓ× Ó Ó¸ δ(ni) × ÒÓØ ÓÑÓ DIFF(n)º ÙÖ º ÍÒ Ö ÓÐ ÎÄ 512 ÒÓ Ó× Ä ÓÒ ÓÒ ´ º µ × ÒÓÑ Ò ÓÒ ÓÒ ÎÄ Ý × Ñ ÒÓ× Ù ÖØ ÕÙ Ð ÕÙ Ð Ö Ó Ù ÖØ Ï ÖØ ¬Ò Ó Ò Ü º½ ´Ô Ò µº Ä × Ô Ö Ö ÙÒ ÔÓ Ó ÕÙ Ð Ö Ó Ò Ö × Ð ÓÖ ØÑÓ× Ñ × ¬ ÒØ × ÕÙ Ö ÒØ Ò Ð ÓÒ ÓÒ Îĺ Å × Ð ÒØ ÑÓ×ØÖ Ö ÑÓ× ÕÙ Ð ÐØÙÖ ÙÒ ÎÄ ×Ø ÐÓ Ö ØÑ Ñ ÒØ ÓØ º Ä Ò Ò ×ØÖ ¸ ÒØÓÒ ×¸ Ò ÐÓ Ö Ö Ð ÓÖ ØÑÓ× ÑÓ ¬ ÓÒ ÐÓ Ö ØÑ Ó׺ ×ØÓ × Ø Ð × ÐÑ Ò ÑÓ× Ò ÒÓ Ó Ò ÓÖÑ ÓÒ ×Ó Ö Ð ÕÙ Ð Ö Óº Ë ÓÒÓ Ò Ó× ÓÖÑ × ÑÔÐ ÒØ Ö ÙÒ Îĺ Ä ÔÖ Ñ Ö ¸ ÕÙ × Ð Ñ × ÔÓÔÙÐ Ö Ý ¬ ÒØ ¸ Ô ÖÓ Ø Ñ Ò Ð Ñ × Ð¸ ÓÒ× ×Ø Ò ÐÑ Ò Ö Ò ÒÓ Ó Ð ÖÒ ÐØÙÖ ×º È Ö ÐÐÓ ×ÓÐÓ × Ö ÕÙ Ö Ò Ó× Ø×¸ ÐÓ× Ù Ð ×¸ Ó ÐÓ× Ö ÕÙ Ö Ñ ÒØÓ× Ð Ò ÓÒ Ô Ð Ö ÑÔÙ ×ØÓ× ÔÓÖ Ð × ÖÕÙ Ø ØÙÖ × ÑÓ ÖÒ ×¸ Ò ÜØ Ò Ö× ×Ø Ð ÐÓÒ ØÙ Ð Ô Ð Ö Ð ÖÕÙ Ø ØÙÖ º
  • 521.
    ´ 6.4. Arboles AVL 495 Ä × ÙÒ ÑÔÐ ÒØ ÓÒ ÓÒ× ×Ø Ò ÐÑ Ò Ö Ò ÒÓ Ó ×Ù ÐØÙÖ º ÈÙ ×ØÓ ÕÙ Ð Ö ÓÐ × ÐÓ Ö ØÑ Ñ ÒØ ÓØ Ó¸ ÙÒ ÝØ × ×Ù¬ ÒØ º ר ÐØ ÖÒ Ø Ú ÓÒ Ù Ð ÓÖ ØÑÓ× Ñ × × Ò ÐÐÓ׸ Ô ÖÓ Ñ ÒÓ× ¬ ÒØ ¸ Ô٠׸ Ù Ò Ó × ÑÓ ¬ Ð Ö Óи × Ö ÕÙ Ö Ò ØÙ Ð Þ Ö Ñ × ÒÓ Ó× ÓÒ ×Ù ÐØÙÖ º Ò ×Ø Ø ÜØÓ ÓÔØ Ö ÑÓ× Ð ÔÖ Ñ Ö ×Ø ÐÓ ÑÔÐ ÒØ ÓÒ × Ö¸ ÐÑ Ò Ö ÑÓ× Ð ÖÒ ÐØÙÖ × Ò ÒÓ Óº Ä ×ØÖÙ ØÙÖ ÙÒ ÒÓ Ó ÎÄ × ¬Ò Ò Ð Ö ÚÓ ÚÐÆÓ ºÀ ¸ Ð Ù Ð Ø Ò Ð ×ØÖÙ ØÙÖ × Ù ÒØ ÚÐÆÓ ºÀ ≡ class AvlNode_Data { signed char diff; // diferencia de altura AvlNode_Data() : diff(0) { /* EMPTY */ } signed char & getDiff() { return diff; } }; DECLARE_BINNODE(AvlNode, 40, AvlNode_Data); # define DIFF(p) ((p)->getDiff()) Í× × AvlNode Ò DECLARE BINNODE ¾ º 6.4.1 El TAD Avl Tree<Key> Ð Ì Gen Avl Tree<Key> ¬Ò ÙÒ Ð × Ò Ö Ö ÓÐ ÎÄ Ò Ô Ò ÒØ ÕÙ Ð ÒÓ Ó × Ú ÖØÙ Ð Ó ÒÓº Ä Ð × Ò Ù ×Ø ÓÒ × ¬Ò Ò Ð Ö ÚÓ ØÔÐ ÚкÀ ¸ ÕÙ × ¬Ò ÓÒØ ÒÙ ÓÒ ØÔÐ ÚкÀ ≡ template <template <typename> class NodeType, typename Key, class Compare> class Gen_Avl_Tree { typedef NodeType<Key> Node; Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Avl Tree<Key> Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Avl Tree<Key> }; template <typename Key, class Compare = Aleph::less<Key> > class Avl_Tree : public Gen_Avl_Tree<AvlNode, Key, Compare> { /* empty */ }; template <typename Key, class Compare = Aleph::less<Key> > class Avl_Tree_Vtl : public Gen_Avl_Tree<AvlNodeVtl, Key, Compare> { /* empty */ }; Í× × AvlNodeº Ä × Ð × × Avl Tree Vtl<Key> Ý Avl Tree<Key> ¬Ò Ò Ö ÓÐ × ÕÙ Ñ Ò Ò ÒÓ Ó× Ú ÖØÙ Ð × Ý ÒÓÖÑ Ð × Ö ×Ô Ø Ú Ñ ÒØ º ÙÒÕÙ ÔÓÖ ÐÓ Ò Ö Ð ÐÓ× Ð ÓÖ ØÑÓ× ×Ó Ö Ö ÓÐ × ×ÓÒ Ò ØÙÖ ÐÑ ÒØ ÜÔÖ × Ð × Ò ÓÖÑ Ö ÙÖ× Ú ¸ ÐÓ× Ö ÓÐ × ÎÄ ÒÓ Ò Ò Ò ×Ø Ø ÓÖ º Ä × ÑÔÐ ÒØ ÓÒ × Ö ÙÖ¹ × Ú × ÕÙ × ÓÒÓ Ò ×Ø Ò × × Ò ÐÑ Ò Ö Ò ÒÓ Ó ×Ù ÐØÙÖ Ý ØÙ Ð Þ ÖÐ Ö ÙÖ× Ú Ñ ÒØ Ò ÑÓ ¬ ÓÒº Ò ÒÙ ×ØÖÓ ×Ó¸ Ò Ö × ÐÓ Ö Ö ÙÒ ÑÔÐ ÒØ ÓÒ Ñ × ¬ ÒØ ÕÙ Ð Ö ÙÖ× Ú ¸ ÙØ Ð Þ Ö ÑÓ× ÙÒ Ô Ð ¸ Ð Ù Ð × ×Ô ¬ ÓÑÓ × Ù Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Avl Tree<Key> ≡ ´ µ FixedStack<Node *, Node::MaxHeight> avl_stack; ¬Ò × avl stack¸ Ù× Ò ÙÒ × ¸ ¸ ¼¼ß ¼¿¸ Ò ¼º Í× × FixedStack ½¼ º
  • 522.
    496 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u avl stack ×ÑÔÖ Ù Ö Ö Ð Ñ ÒÓ Ù×ÕÙ × Ð Ö Þ ×Ø Ð ÒÓ Ó Ò× ÖØ Ó Ó Ð Ñ Ò Óº ÈÙ ×ØÓ ÕÙ Ð ÐØÙÖ ÙÒ ÎÄ ×Ø ÓØ ¸ Ð Ô Ð ÒÓ Ö ÕÙ Ö Ú Ö ¬ ÓÒ × × ÓÖ º Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Avl Tree<Key> +≡ ´ µ Node head_node; Node * head_ptr; Node *& root; Compare cmp; head node × ÙÒ ÒÓ Ó ÙÜ Ð Ö ÕÙ × Ö Ô Ö Ð ÒÓ Ó Ö Þº head ptr × ÙÒ ÔÙÒØ ÓÖ Ð ÒÓ Ó ÙÜ Ð Öº Ð Ù×Ó Ð ÒÓ Ó Ö × ÑÙÝ ÙØ Ð Ô Ö Ò Ö Ð Þ Ö Ð × ÖÓØ ÓÒ ×º Ë ÒÓ Ù× × ÑÓ× ×Ø Ö ¸ ÒØÓÒ × Ð ÖÓØ ÓÒ Ð Ö Þ Ö ØÖ Ø Ö× × Ô Ö Ñ ÒØ º head ptr × ÑÔÖ ×Ø Ö Ò× ÖØ Ó Ò Ð Ô Ð º ØÓ× Ð ÓÖ ØÑ Ó׸ × ÓÒ× Ö Ö ÕÙ Ð Ô Ð ×Ø Ú Ù Ò Ó ×Ø ×ÓÐÓ ÓÒØ Ò Ð ÒÓ Ó Ö º ÈÐ ÒØ ÑÓ׸ ÒØÓÒ ×¸ Ð × × Ù ÒØ × ÙÒ ÓÒ × Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Avl Tree<Key> +≡ ´ µ bool avl_stack_empty() { return avl_stack.top() == head_ptr; } void clean_avl_stack() { avl_stack.popn (avl_stack.size() - 1); } ¬Ò × avl stack empty¸ Ù× Ò ÙÒ × ¼¼ Ò ¼½ º clean avl stack¸ Ù× Ò ÙÒ × ¸ ¼¼ß ¼¾¸ Ò ¼º Í× × avl stack º avl stack empty() ÖØÓÖÒ ÖØÓ × avl stack ר ÐÓ Ñ ÒØ Ú º clean avl stack() Ð ÑÔ Ð Ô Ð × Ö¸ ÜØÖ ØÓ Ó× ×Ù× Ð Ñ ÒØÓ׺ ÈÓÖ ÓÒÚ Ò ÓÒ¸ Ð Ö Þ root × Ö Ð Ö Ð ÒÓ Ó Ö head ptrº ÆÓØ ÑÓ× ÕÙ root × ÙÒ Ö Ö Ò RLINK (head ptr) Ý ÒÓ ÙÒ ÔÙÒØ ÖÓº ר Ö ÒÓ× Ô ÖÑ Ø ØÖ Ö Ö Ø Ñ ÒØ ÓÒ RLINK (head ptr) Ñ ÒØ Ð ÒÓÑ Ö rootº 6.4.1.1 Inserci´n en un arbol AVL o ´ ÓÒ× Ö ÑÓ× ÙÒ ÎÄ Ò Ð Ù Ð × Ö Ð Þ ÙÒ Ò× Ö ÓÒ Ð × Ò ÙÒ × Ö¸ Ð ÒÓ Ó × Ò× ÖØ ÓÑÓ Ó Ò Ð ÐÙ Ö Ó ÙÔ Ó ÔÓÖ Ð ÒÓ Ó ÜØ ÖÒÓ Ö ×ÙÐØ Ó Ð Ù×ÕÙ º Ì Ð Ò× Ö ÓÒ Ð Ö Ð Þ Ð Ð ÓÖ ØÑÓ × Ù ÒØ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Avl Tree<Key> ≡ ´ µ ¼½ Node * insert(Node * p) { if (root == Node::NullPtr) { root = p; return p; } Node *pp = search_and_stack_avl(KEY(p)); if (cmp (KEY(p), KEY(pp))) LLINK (pp) = p; else if (cmp (KEY(pp), KEY(p))) RLINK(pp) = p; else { // clave duplicada clean_avl_stack();
  • 523.
    ´ 6.4. Arboles AVL 497 return NULL; } restore_avl_after_insertion(KEY(p)); return p; } Í× × clean avl stack ¸ restore avl after insertion ¼¼ ¸ Ò search and stack avl º Ä ÙÒ ÓÒ search and stack avl() Ù× Ð Ð Ú ÓÒØ Ò Ò p Ý Ð Ú Þ Ù Ö ØÓ Ó Ð Ñ ÒÓ Ù×ÕÙ Ò Ð Ô Ð avl stack Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Avl Tree<Key> +≡ ´ µ Node * search_and_stack_avl(const Key & key) { Node * p = root; do // desciende en b´squeda de key y empila camino de b´squeda u u { avl_stack.push(p); if (cmp(key, KEY(p))) // ¿key < KEY(p)? p = LLINK(p); else if (cmp(KEY(p), key)) // ¿key > KEY(p)? p = RLINK(p); else return p; // clave duplicada } while (p != Node::NullPtr); return avl_stack.top(); } ¬Ò × search and stack avl¸ Ù× Ò ÙÒ × Ò ¼½ º Í× × avl stack º Ë KEY(p) Ý × Ò Ù ÒØÖ Ò Ð Ö Óи ÒØÓÒ × search and stack avl() Ö ØÓÖÒ Ð ÒÓ Ó ÕÙ ÓÒØ Ò Ð Ð Ú º Ä ÙÔÐ ÓÒ × Ø Ø Ò Ð ÔÖ Ñ Ö ifº Ò ×Ó ÓÒØÖ Ö Ó¸ pp × Ð Ô Ö Ð ÒÓ Ó Ò× ÖØ Ö pº Ð ÒÓ Ó p × Ò× ÖØ × Ñ ÒØ Ý × ØÙ Ð Þ Ð ØÓÖ ÐÒ ppº Restauraci´n de la condici´n AVL o o ×ÔÙ × Ð Ò× Ö ÓÒ × ¸ × Ú Ö ¬ × Ó ÙÖÖ ÙÒ Ú ÓÐ ÓÒ Ð ÓÒ ÓÒ Îĸ Ð Ù Ð × Ö Ø Ö Þ Ò Ó× ×Ó× Ò Ö Ð ×º Ð ÔÖ Ñ ÖÓ ÐÐÓ× × ÐÙ×ØÖ Ò Ð ¬ ÙÖ º ´ µº ÁÒ ÐÑ ÒØ ¸ Ð ÒÓ Ó y × Ò Ù ÒØÖ Ô Ö Ø Ñ ÒØ ÕÙ Ð Ö Ó¸ Ñ ÒØÖ × ÕÙ ×Ù Ô Ö x ר Ð Ö Ñ ÒØ × ÕÙ Ð Ö Ó Ð Ö º Ç ÙÖÖ ¸ ÒØÓÒ ×¸ Ð Ò× Ö ÓÒ ÙÒ Ú ÐÓÖ Ñ ÝÓÖ ÕÙ y¸ Ð Ù Ð ÕÙ Ð Ö Ñ χ ÙÑ ÒØ ÐØÙÖ º Ð ÒÓ Ó x ×Ù Ö ÙÒ × ÕÙ Ð Ö Ó ÕÙ Ú ÓÐ Ð ÓÒ ÓÒ Îĺ Ä Ú ÓÐ ÓÒ × Ö Ø Ò Ð ¬ ÙÖ º ´ µ × ÓÖÖ Ñ ÒØ ÙÒ ÖÓØ ÓÒ Ð ÞÕÙ Ö Ð ÒÓ Ó y¸ ÙÝÓ Ö ×ÙÐØ Ó Ò Ö Ð × ÐÙ×ØÖ Ò Ð ¬ ÙÖ º ´ µº ÆÓØ ÑÓ× ÕÙ Ò Ð × Ó× ¬ ÙÖ × ¹ º ´ µ Ý º ´ µ¹ Ð Ú ÐÓÖ ÐØÙÖ ÐÓ Ð h + 2 Ô ÖÑ Ò ÒØ ØÓº ÈÓÖ ÐÓ Ø ÒØÓ¸ × Ð × Ò Ò T × ÎÄ ÒØ × Ð Ò× Ö ÓÒ¸ Ø Ñ Ò ÐÓ × ×Ô٠׺ Ò ÓØÖ × Ô Ð Ö ×¸ Ô Ö Ð ×Ó × ÕÙ Ð Ö Ó Ð ¬ ÙÖ º ´ µ¸ Ð ÓÖÖ ÓÒ Ö ×ÙÐØ ÒØ ×ÔÙ × Ð ÖÓØ ÓÒ ÔÖÓ Ù ÙÒ Ö ÓÐ ÒØ Ö Ñ ÒØ Îĺ Ð × ÕÙ Ð Ö Ó ÐÙ×ØÖ Ó Ò Ð ¬ ÙÖ º ´ µ Ø Ò ÙÒ ×Ó × Ñ ØÖ Ó ÕÙ Ó ÙÖÖ Ù Ò Ó Ð Ò× Ö ÓÒ × ÔÖÓ Ù ÔÓÖ Ð ÞÕÙ Ö º Ö ¬ Ñ ÒØ ¸ Ð × ÕÙ Ð Ö Ó Ý ×Ù ÓÖÖ ÓÒ ×
  • 524.
    498 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u T T x y 2 0 y x 1 0 α χ h β α β h+1 χ h h+1 =⇒ ´µ ´ µ ÙÖ º ÈÖ Ñ Ö ×Ó Ò× Ö ÓÒ Ò ÙÒ Ö ÓÐ ÎÄ Ú Ò Ù Ð ÕÙ Ð × ¬ ÙÖ × º ´ µ Ý º ´ µ Ö ­ × Ò ÙÒ ×Ô Óº ÄÓ× Ú ÐÓÖ × ÐÓ× ØÓÖ × Ô ÖÑ Ø Ò ÒØ ¬ Ö Ð × ØÙ ÓÒ × ÕÙ Ð Ö Ó ÑÓ×ØÖ Ò Ð ¬ ÙÖ º ´ µº Ó ÙÒ ÒÓ Ó x ÓÒ ÙÒ × ÕÙ Ð Ö Ó¸ ÔÓ ÑÓ× Ö Ø Ö Þ Ö Ð × × Ù ÒØ × × ØÙ ÓÒ × Ý ×Ù× ÓÖÖ ×ÔÓÒ ÒØ × ÓÒ × ½º Ë DIFF(x) == 2 and DIFF(y) == 1 =⇒ × ØÙ ÙÒ ÖÓØ ÓÒ × ÑÔÐ Ð ÞÕÙ Ö º ¾º Ë DIFF(x) == -2 and DIFF(y) == -1 =⇒ × ØÙ ÙÒ ÖÓØ ÓÒ × ÑÔÐ Ð Ö º ÄÓ× Ñ ØÓ Ó× rotateLeft() Ý rotateRight() ÖÓØ Ò Ð ÒÓ Ó p Ð ÞÕÙ Ö Ý Ö Ö ×Ô Ø Ú Ñ ÒØ º ÄÓ× Ñ ØÓ Ó× Ò ØÙ Ð Þ Ö ÐÓ× ØÓÖ × ÕÙ Ð Ö Ó ÐÓ× ÒÓ Ó× ÒÚÓÐÙ Ö Ó׺ Ð Ö ×Ô ØÓ¸ Ü ×Ø ÙÒ ×Ó ÕÙ ×ÓÐÓ Ó ÙÖÖ ÙÖ ÒØ Ð Ð Ñ Ò ÓÒ¸ Ú ÐÙ Ó Ò Ð if Ý ÕÙ ÜÔÐ Ö ÑÓ× ÔÓר Ö ÓÖÑ ÒØ º ÐÓ ÓÒØÖ Ö Ó¸ ÐÓ× ØÓÖ × Ð Ò × ÓÐÓ Ò Ò ÖÓº × ÔÓ× Ð Ù Ö ÐÓ× Ñ Ó× Ò ÐÓ× ØÓÖ × Ý Ùר ÖÐÓ× ØÖ Ú × ÓÔ Ö ÓÒ × Ö ØÑ Ø × ÑÔ ÖÓ¸ × Ö ÕÙ Ö Ò Ú Ö Ó× if Ô Ö ÖÐÓº ÈÓÖ ÐÓ Ø ÒØÓ¸ × Ñ × × ÑÔÐ Ö Ò Ö ÐÓ× ×Ó× Ý × Ò Ö ÐÓ× ØÓÖ × Ö Ø Ñ ÒØ º Ð × ÙÒ Ó ×Ó Ú ÓÐ ÓÒ Ð ÓÒ ÓÒ ÎÄ × ÐÙ×ØÖ Ò Ð ¬ ÙÖ º ´ µº Ð Ö ÓÐ ÎÄ T ×Ù Ö ÙÒ × ÕÙ Ð Ö Ó ÔÓÖ Ð Ö Ò Ð ÒÓ Ó x¸ Ù× Ó ÔÓÖ ÙÒ ÙÑ ÒØÓ ÐØÙÖ Ð ÒÓ Ó z ÕÙ ×Ø Ô Ö Ø Ñ ÒØ ÕÙ Ð Ö Óº Ä Ò× Ö ÓÒ ÔÙ Ó ÙÖÖ Ö ÔÓÖ Ù ÐÕÙ Ö ÐÓ× Ð Ó× zº Ð × ÕÙ Ð Ö Ó × ÓÖÖ Ñ ÒØ Ó× ÖÓØ ÓÒ × ×Ù × Ú × Ð ÒÓ Ó zº ÈÖ Ñ ÖÓ¸ Ð ÒÓ Ó z × ÖÓØ Ð Ö ¸ ÐÙ Ó Ð ÞÕÙ Ö º Ä ÓÖÖ ÓÒ × ÐÙ×ØÖ Ò Ð ¬ ÙÖ º ´ µº ÒØ × Ý ×ÔÙ × Ð ÓÖÖ ÓÒ¸ Ð ÐØÙÖ ÐÓ Ð Ð Ö Óи h + 2¸ × Ð Ñ ×Ñ º ÓÒ× Ù ÒØ Ñ ÒØ ¸ × Ð × Ò Ò T × Îĸ ÒØÓÒ ×¸ ×ÔÙ × Ð Ò× Ö ÓÒ Ý ÔÓר Ö ÓÖ ÓÖÖ ÓÒ¸ Ð × Ò Ò Ø Ñ Ò × Îĺ Ð ×Ó ÐÙ×ØÖ Ó Ò Ð × ¬ ÙÖ × º ´ µ Ý º ´ µ Ø Ò ×Ù ÓÖÖ ×ÔÓÒ ÒØ × Ñ ØÖ Ó ÔÓÖ Ð ÞÕÙ Ö ¸ Ð Ù Ð × ÕÙ Ú Ð ÒØ Ö ­ Ö Ð × ¬ ÙÖ × Ò ÙÒ ×Ô Óº Ä ÒØ ¬ ÓÒ Ð × ØÙ ÓÒ × ÕÙ Ð Ö Ó Ð ¬ ÙÖ º ´ µ¸ ÙÒØÓ ÓÒ ×Ù ÓÖÖ ÓÒ¸ × Ö Ø Ö Þ Ð × Ù ÒØ Ñ Ò Ö
  • 525.
    ´ 6.4. Arboles AVL 499 T x 2 T y z −1 0 α z x y h −1 0 1 δ χ h χ α β δ β h−1 h−1 h =⇒ ´µ ´ µ ÙÖ º Ë ÙÒ Ó ×Ó Ò× Ö ÓÒ Ò ÙÒ Ö ÓÐ ÎÄ ½º Ë DIFF(x) == 2 and DIFF(y) == -1 =⇒ ÔÖ Ñ ÖÓ × ÖÓØ Ð ÒÓ Ó z Ð Ö Ý ÐÙ Ó Ð ÞÕÙ Ö º ¾º Ë DIFF(x) == -2 and DIFF(y) == 1 =⇒ ÔÖ Ñ ÖÓ × ÖÓØ Ð ÒÓ Ó z Ð ÞÕÙ Ö Ý ÐÙ Ó Ð Ö º ÄÓ× Ñ ØÓ Ó× doubleRotateLeft() Ý doubleRotateRight() Ö Ð Þ Ò Ð × Ó Ð × ÖÓØ ¹ ÓÒ × Ð ÞÕÙ Ö Ý Ö ¸ Ö ×Ô Ø Ú Ñ ÒØ º ÄÓ× ×Ó× ÔÖ × ÒØ Ó× Ò Ð × ¬ ÙÖ × º ´ µ Ý º ´ µ¸ ÙÒØÓ ÓÒ ×Ù× ÕÙ Ú Ð ÒØ × × Ñ ØÖ Ó׸ Ö Ø Ö Þ Ò × ØÙ ÓÒ × Ú ÓÐ ÓÒ Ð ÓÒ ÓÒ ÎÄ ÕÙ Ó ÙÖÖ Ò ÙÖ ÒØ Ð Ò× Ö ÓÒº Ð × ¬ Ö ÑÓ× Ð × ÓÒ × ÓÖÖ ÓÒ Ò Ð × Ù ÒØ Ö Ò Ó Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Avl Tree<Key> +≡ ´ µ enum Rotation_Type { ROTATE_LEFT, ROTATE_RIGHT, DOUBLE_ROTATE_LEFT, DOUBLE_ROTATE_RIGHT }; ר Ø ÔÓ Ú ÐÓÖ × ÚÙ ÐØÓ ÔÓÖ ÙÒ ÖÙØ Ò ÕÙ Ü Ñ Ò ÙÒ ÒÓ Ó × ÕÙ Ð Ö Ó Ý Ø ÖÑ Ò ¸ Ò ÙÒ ÓÒ Ð Ø ÔÓ × ÕÙ Ð Ö Ó¸ Ù Ð Ð × ÖÓØ ÓÒ × Ö ÔÐ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Avl Tree<Key> +≡ ´ µ ¼¼ static Rotation_Type rotation_type(Node * p) { Node * pc; // guarda hijo de p if (DIFF(p) == 2) // hacia la izquierda { pc = RLINK(p); if (DIFF(pc) == 1 or DIFF(pc) == 0) return ROTATE_LEFT; return DOUBLE_ROTATE_LEFT; } pc = LLINK(p); if (DIFF(pc) == -1 or DIFF(pc) == 0) return ROTATE_RIGHT; return DOUBLE_ROTATE_RIGHT; }
  • 526.
    500 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u ¬Ò × rotation type¸ Ù× Ò ÙÒ ¼¼ º rotation type() × ÐÐ Ñ ÔÓÖ ÙÒ ÙÒ ÓÒ Ù×Ó Ò Ö Ð ÕÙ Ö ×Ø ÙÖ Ð ÓÒ ÓÒ Îĺ ËÙ ×ØÖÙ ØÙÖ Ò Ö Ð ÓÖÖ ×ÔÓÒ Ú Ö ¬ Ö ÐÓ× Ù ØÖÓ Ø ÔÓ× ÖÓØ ÓÒ Ò ÙÒ ÓÒ Ð ÒÓ Ó Ú ÓÐ ØÓÖ Ó Ð ÓÒ ÓÒ ÎÄ Ý Ð ØÓÖ ×Ù Óº ÆÓØ ÑÓ× ÕÙ rotation type() ØÙ ÙÒ Ú Ö ¬ ÓÒ ÓÒ Ð¸ DIFF(pc) == 0¸ ÓÖÖ ×ÔÓÒ ÒØ ÓØÖÓ ×Ó ÕÙ ×ÓÐÓ × ÔÖ × ÒØ Ò Ð Ð Ñ Ò ÓÒ Ý ÕÙ ÜÔÐ Ö ÑÓ× ÔÓר Ö ÓÖÑ ÒØ º ÄÓ ÒØ Ö ÓÖ ÔÖÓÔÓÖ ÓÒ ØÓ Ð ÙØ Ð Ö Ö ÕÙ Ö Ô Ö Ö ×Ø ÙÖ Ö Ð ÓÒ ÓÒ ÎÄ Ò Ù ÐÕÙ Ö ÐÓ× ×Ó× Ò× Ö ÓÒ ¼¼ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Avl Tree<Key> +≡ ´ µ ¼¼ static Node * restore_avl(Node * p, Node * pp) { Node ** link = LLINK(pp) == p ? &LLINK(pp) : &RLINK(pp); switch (rotation_type(p)) { case ROTATE_LEFT: return *link = rotateLeft(p); case ROTATE_RIGHT: return *link = rotateRight(p); case DOUBLE_ROTATE_LEFT: return *link = doubleRotateLeft(p); case DOUBLE_ROTATE_RIGHT: return *link = doubleRotateRight(p); } return NULL; } ¬Ò × restore avl¸ Ù× Ò ÙÒ × ¼½ Ò ¼ º Í× × doubleRotateLeft¸ doubleRotateRight¸ rotateLeft¸ rotateRight¸ Ò rotation type º Ð Ñ ØÓ Ó restore avl() ØÓÑ Ó× ÒÓ Ó× ÓÑÓ Ô Ö Ñ ØÖÓ׺ Ð ÔÖ Ñ ÖÓ¸ p¸ × Ð ÒÓ Ó ÕÙ ×Ù Ö Ð × ÕÙ Ð Ö Ó Ð × ÙÒ Ó¸ pp¸ × Ð Ô Ö pº Ò ÙÒ ÓÒ Ð Ø ÔÓ × ÕÙ Ð Ö Ó Ø ÖÑ Ò Ó ÔÓÖ rotation type()¸ restore avl() ÑÔÖ Ò Ð × ÓÒ × Ò × Ö × Ô Ö Ö ×Ø ÙÖ Ö Ð ÓÒ ÓÒ Îĺ À ר Ð ÔÖ × ÒØ ¸ ÑÓ× × ÖÖÓÐÐ Ó ÙÒ × Ö ÖÙØ Ò × Ò Ö × ÓÖÖ Ö ÙÒ Ú ÓÐ ÓÒ Ð ÓÒ ÓÒ ÎÄ Ò ÙÒ ÒÓ Óº ÆÓ× Ö ×Ø Ø ÖÑ Ò Ö Ù Ð × Ð ÒÓ Ó ÕÙ ×Ù Ö Ð × ÕÙ Ð Ö Óº È Ö Ð Ò× Ö ÓÒ¸ ר ÓÒ Ñ ÑÓÖ Þ Ö Ð ÙÐØ ÑÓ ÒÓ Ó × ÕÙ Ð Ö Ó Ò Ð Ñ ÒÓ Ù×ÕÙ ¸ ÔÙ × ×Ø × Ð ÙÒ Ó ×Ù× ÔØ Ð ×Ù Ö Ö ÙÒ × ÕÙ Ð Ö Óº Í Ó ×Ø ÒÓ Ó¸ × ØÙ Ð Þ ×Ù ØÓÖ Ý × Ú Ö ¬ × × Ö ÕÙ Ö ÑÔÖ Ò Ö ÓÒ × ÓÖÖ Ø Ú × ÓÒ Ð Ñ ØÓ Ó restore avl()º ÓÖ ×ÓÐÓ ÒÓ× Ö ×Ø ÙÒ ÖÙØ Ò ÕÙ Ù×ÕÙ ÒØÖÓ Ð Ô Ð Ð ÒÓ Ó × ÕÙ Ð Ö Ó¸ ØÙ Ð Ð ØÓÖ Ý¸ Ú ÒØÙ ÐÑ ÒØ ¸ ØÙ Ð ÓÖÖ ÓÒ ¼¼ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Avl Tree<Key> +≡ ´ µ ¼¼ ¼¿ void restore_avl_after_insertion(const Key & key) { Node *pp = avl_stack.pop(); // padre del nodo insertado Ùר Ö ØÓÖ Ð Ô Ö Ð ÒÓ Ó Ò× ÖØ Ó ¼½ if (avl_stack_empty()) return; // pp es ra´z ı Node *gpp; // padre de pp ØÙ Ð Þ Ö Ò ×ØÖÓ× ÔÔ ¼½ clean_avl_stack(); } ¬Ò ×
  • 527.
    ´ 6.4. Arboles AVL 501 restore avl after insertion¸ Ù× Ò ÙÒ º Í× × avl stack ¸ avl stack empty ¸ Ò clean avl stack º Ð ÐÓÕÙ Ùר Ö ØÓÖ Ð Ô Ö Ð ÒÓ Ó Ò× ÖØ Ó ¼½ ÜØÖ Ð ÔÖ Ñ Ö ÒÓ Ó Ò Ð Ô Ð ¸ ØÙ Ð Þ ×Ù ØÓÖ Ý Ú Ö ¬ × ×Ø ÒÓ × Ð Ö Þ ¼½ Ùר Ö ØÓÖ Ð Ô Ö Ð ÒÓ Ó Ò× ÖØ Ó ¼½ ≡ ´ ¼¼ µ if (key > KEY(pp)) // ajuste el factor del padre del nodo insertado DIFF(pp)++; else DIFF(pp)--; if (DIFF(pp) == 0) { // en este caso, altura del ascendiente de pp no aumenta clean_avl_stack(); return; } Í× × clean avl stack º ØÙ Ð Þ Ö Ò ×ØÖÓ× ÔÔ ¼½ Ö Ú × Ò ×ØÖÓ gpp pp Ý ØÙ Ð Þ ×Ù ØÓÖº Ë Ð ØÓÖ Ð ÙÒ gpp × ÖÓ¸ ÒØÓÒ × Ð ÐØÙÖ gpp Ô ÖÑ Ò Ù Ð Ý¸ ÔÙ ×ØÓ ÕÙ Ð × Ò Ò gpp × Îĸ Ð Ö ×ØÓ Ð Ö ÓÐ × ÎÄ Ý Ð Ð ÓÖ ØÑÓ Ø ÖÑ Ò º Ò ×Ó ÓÒØÖ Ö Ó¸ × Ö Ú × × Ý ÙÒ Ú ÓÐ ÓÒ Ð ÓÒ ÓÒ Îĸ Ð Ù Ð × ÓÖÖ º Ò ×Ø ÙÐØ ÑÓ ×Ó Ð Ð ÓÖ ØÑÓ Ø Ñ Ò Ø ÖÑ Ò ¸ ÔÙ × × ÑÓ× ÕÙ Ò Ð Ò× Ö ÓÒ Ð Ö ÓÐ ÓÑÔÐ ØÓ × ÎÄ ÐÙ Ó ØÙ Ö Ð ÔÖ Ñ Ö ÓÖÖ ÓÒ ¼½ ØÙ Ð Þ Ö Ò ×ØÖÓ× ÔÔ ¼½ ≡ ´ ¼¼ µ do // buscar nodo con factor igual a 0 { gpp = avl_stack.pop(); // actualizar factores de equilibrio if (key > KEY(gpp)) DIFF(gpp)++; else DIFF(gpp)--; if (DIFF(gpp) == 0) break; // no se necesita reajuste else if (DIFF(gpp) == -2 or DIFF(gpp) == 2) // ¿se viola condici´n AVL? o { // se requiere reajuste Node *ggpp = avl_stack.pop(); restore_avl(gpp, ggpp); break; } } while (not avl_stack_empty()); Í× × avl stack ¸ avl stack empty ¸ Ò restore avl ¼¼ º 6.4.1.2 Eliminaci´n en un arbol AVL o ´ רÖÙ ØÙÖ ÐÑ ÒØ ¸ Ð Ð Ñ Ò ÓÒ × Ú Ò ØÖ × Ô ×Ó× ´½µ Ù× Ö Ð ÒÓ Ó Ð Ñ Ò Ö¸ ´¾µ Ð Ñ Ò ÖÐÓ Ý ´¿µ Ö Ú × Ö Ð ÓÒ ÓÒ ÎÄ Ý Ú ÒØÙ ÐÑ ÒØ Ö ×Ø ÙÖ ÖÐ º Ò × × ÒØ Ó¸ Ð ÔÖÓ Ñ ÒØÓ × ÔÐ ÒØ Ð × Ù ÒØ ÑÓ Ó ¼½ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Avl Tree<Key> +≡ ´ µ Node * remove(const Key & key)
  • 528.
    502 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u { if (root == Node::NullPtr) return NULL; Node * p = search_and_stack_avl(key); if (no_equals<Key, Compare> (KEY(p), key)) { // clave no fue encontrada clean_avl_stack(); return NULL; } Ð Ñ Ò ÓÒ × Ô ¼¾ restore_avl_after_deletion(removed_key); return p; } Í× × clean avl stack ¸ restore avl after deletion ¼ ¸ Ò search and stack avl º Eliminaci´n f´ o ısica del nodo Ð Ñ Ò ÓÒ × Ô ×¼¾ ÙÒ Ñ ÒØ Ò Ð ×ÕÙ Ñ ÐØ ÖÒ Ø ÚÓ Ð Ñ Ò ÓÒ ÜÔÐ Ó Ò Ü º º ¹½ ´Ô Ò ¿ ¾µ¸ Р٠и Ö ÓÖ ÑÓ׸ ÓÒ× ×Ø Ò Ö ÒØ Þ Ö ÕÙ Ð ÒÓ Ó Ð Ñ Ò Ö × Ò ÓÑÔÐ ØÓ ݸ Ò Ð ×Ó ÕÙ × ÓÑÔÐ ØÓ¸ ÒØÓÒ × ×Ùר ØÙ ÖÐÓ ÔÓÖ Ð ×Ù ×ÓÖ Ó Ð ÔÖ ×ÓÖº Ò ÒÙ ×ØÖÓ ×Ó¸ ÓÔØ ÑÓ× ÔÓÖ Ð ×Ù ×ÓÖ Ý ÔÐ ÒØ ÑÓ× Ð × Ù ÒØ Ð ÓÖ ØÑÓ ¼¾ Ð Ñ Ò ÓÒ × Ô ¼¾ ≡ ´ ¼½ µ Key removed_key = KEY(p); Node * pp = avl_stack.top(1); // obtener padre de p while (true) { if (LLINK(p) == Node::NullPtr) // ¿incompleto por la izquierda? { // S´, ate a pp el hijo de p ı if (LLINK(pp) == p) LLINK(pp) = RLINK(p); else RLINK(pp) = RLINK(p); break; } if (RLINK(p) == Node::NullPtr) // ¿incompleto por la izquierda? { // S´, ate a pp el hijo de p ı if (LLINK(pp) == p) LLINK(pp) = LLINK(p); else RLINK(pp) = LLINK(p); break; } // en este punto, p es un nodo completo ==> intercambiar por sucesor Node * succ = swapWithSuccessor(p, pp); removed_key = KEY(succ); } if (pp == head_ptr) // verifique si se elimin´ la ra´z o ı { // factores quedan inalterados y no se viola condici´n AVL o clean_avl_stack(); return p;
  • 529.
    ´ 6.4. Arboles AVL 503 } Í× × avl stack Ò clean avl stack º Ë Ó ÙÖÖ ÙÒ ÒØ Ö Ñ Ó Ð ÒÓ Ó Ð Ñ Ò Ö ÓÒ ×Ù ×Ù ×ÓÖ Ò¬ Ó¸ ÒØÓÒ × Ð ÒÓ Ó Ð Ñ Ò Ó ÒÓ × ÖÚ Ô Ö ØÙ Ð Þ Ö Ð ØÓÖ Ð ÒÓ Ó ×Ù ×ÓÖ¸ ÔÙ × Ü ×Ø ÙÒ Ú ÓÐ ÓÒ Ø ÑÔÓÖ Ð Ð ÔÖÓÔ ÓÖ Ò ÙÒ º ÈÓÖ ×Ø Ö ÞÓÒ¸ Ð Ú Ö Ð removed key ÐÑ Ò Ð Ð Ú × ÙÒ Ð Ù Ð × ØÙ Ð Þ Ö Ò ÐÓ× ØÓÖ × Ò Ð Ñ ÒÓ Ù×ÕÙ º ÓÑÓ ×Ù ÒÓÑ Ö ÐÓ ÜÔÖ × ¸ Ð ÖÙØ Ò swapNodeWithSuccessor() ÒØ Ö Ñ p ÓÒ ×Ù ×Ù ×ÓÖ Ò¬ Óº Ð Ü Ô ÓÒ ÐÓ× ×Ô ØÓ× Ô ÖØ Ò ÒØ × ÐÓ× Ö ÓÐ × Îĸ Ð × Ù ÒØ ÑÔÐ ÒØ ÓÒ × ×ØÖÙ ØÙÖ ÐÑ ÒØ ÒØ Ô Ö Ð Ð Ñ Ò ÓÒ Ò ØÓ Ð × Ö ÓÐ ¹ Ò ÖÓ Ù×ÕÙ ÕÙ ×Ù Ý Þ Ò Ð ÒØ Ö Ñ Ó Ð ÒÓ Ó Ð Ñ Ò Ó ÓÒ ×Ù ×Ù ×ÓÖ ´Ó ÔÖ ×ÓÖµ Ò¬ Ó ¼¿ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Avl Tree<Key> +≡ ´ µ ¼¼ ¼ Node* swapWithSuccessor(Node * p, Node *& pp) { // Referencia al tope de la pila, pues p ser´ intercambiado con el a // sucesor y la posici´n en la pila la ocupar´ el sucesor de p o a Node *& ref_to_stack_top = avl_stack.top(); // encuentre el sucesor a la vez que actualiza la pila Node *fSucc = p; // padre del sucesor Node *succ = RLINK(p); // b´squeda comienza desde RLINK(p) u avl_stack.push(succ); while (LLINK(succ) != Node::NullPtr) // descienda hasta el m´s a la izquierda a { fSucc = succ; succ = LLINK(succ); avl_stack.push(succ); } // actualice antigua entrada de pila ocupada por p. Equivalente a // intercambiar antiguo tope (antes de buscar sucesor) con el actual ref_to_stack_top = succ; avl_stack.top() = p; if (LLINK(pp) == p) // actualice el nuevo hijo de pp (sucesor) LLINK(pp) = succ; else RLINK(pp) = succ; LLINK(succ) = LLINK(p); // intercambie las ramas izquierdas LLINK(p) = Node::NullPtr; if (RLINK(p) == succ) // actualice ramas derechas { // sucesor es exactamente el hijo derecho de p RLINK(p) = RLINK(succ); RLINK(succ) = p; pp = succ; } else { // sucesor es el descendiente m´s a la izquierda de RLINK(p) a Node *succr = RLINK(succ); RLINK(succ) = RLINK(p); LLINK(fSucc) = p; RLINK(p) = succr; pp = fSucc; }
  • 530.
    504 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u DIFF(succ) = DIFF(p); // intercambie factores de equilibrio return succ; } Í× × avl stack º Restauraci´n de la condici´n AVL o o T x 2 y y 0 T 1 x 0 α h+1 β χ h χ α β h+1 h+1 h =⇒ ´µ ´ µ ÙÖ º½¼ ÈÖ Ñ Ö ×Ó Ð Ñ Ò ÓÒ Ò ÙÒ Ö ÓÐ ÎÄ Ä ¬ ÙÖ º½¼´ µ ÐÙ×ØÖ Ð ÔÖ Ñ Ö ×Ó × ÕÙ Ð Ö Ó Ù× Ó ÔÓÖ ÙÒ Ð Ñ Ò ÓÒº Ä ¬ ÙÖ ×ÙÔÓÒ ÙÒ Ð Ñ Ò ÓÒ Ò Ð Ö Ñ α ÕÙ Ð Ù× ÙÒ ÔÖ ÐØÙÖ º Ä × ØÙ ÓÒ × ÒØ Ð ¬ ÙÖ º ´ µ Ý ×Ù ÓÖÖ ÓÒ × Ñ Ð Ö × Ö¸ ÙÒ ÖÓØ ÓÒ Ð ÞÕÙ Ö ÙÝÓ Ö ×ÙÐØ Ó¸ ÒØ Ó Ð ¬ ÙÖ º ´ µ¸ × ÔÖ × ÒØ Ò Ð ¬ ÙÖ º½¼´ µº T x 2 T y z −1 0 α z x y h − − − δ h α δ β χ h−1 β χ h =⇒ ´µ ´ µ ÙÖ º½½ Ë ÙÒ Ó ×Ó Ð Ñ Ò ÓÒ Ò ÙÒ Ö ÓÐ ÎÄ Ó Ð ÒÓ Ó Ò Ð Ù Ð Ó ÙÖÖ Ð Ú ÓÐ ÓÒ¸ Ð ÒØ ¬ ÓÒ Ð ÔÖ Ñ Ö ×Ó × ÒØ Ð Ð Ò× Ö ÓÒ × Ö¸ ØÓÖ × ÓÒ Ð Ñ ×ÑÓ × ÒÓ Ý ÙÒ ÙÒ ÖÒ º È Ö ×Ø ×Ó¸ ÒØÓÒ ×¸ ÔÓ ÑÓ× Ö ÙØ Ð Þ Ö Ð ÖÙØ Ò rotation type()º Ë Ò Ñ Ö Ó¸
  • 531.
    ´ 6.4. Arboles AVL 505 ÖÒ Ð Ò× Ö ÓÒ¸ Ð Ö ÓÐ T ×Ù Ö ÙÒ Ô Ö ÒÖÐ ÐØÙÖ º Ò ØÓ¸ ÒØ × Ð Ð Ñ Ò ÓÒ¸ Ð Ö ÓÐ T Ø Ò ÐØÙÖ Ò Ö Ð h + 3¸ Ñ ÒØÖ × ÕÙ ×ÔÙ × Ð Ñ Ò Ö Ð ÐØÙÖ Ò Ö Ð × h + 2º ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð × Ò Ò T ÔÙ ×Ù Ö Ö ÙÒ × ÕÙ Ð Ö Ó Ú ÓÐ ØÓÖ Ó Ð ÓÒ ÓÒ Îĺ Ä ¬ ÙÖ º½½´ µ ÑÙ ×ØÖ Ð × ÙÒ Ó ×Ó Ð Ñ Ò ÓÒ Ò ÙÒ Îĸ Ð Ù Ð Ø Ñ Ò × × Ñ Ð Ö Ð × ÙÒ Ó ×Ó Ð Ò× Ö ÓÒ ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ º ´ µº Ò Ð ¬ ÙÖ º½½´ µ¸ Ð Ö Ñ α ×Ù Ö ÙÒ Ô Ö ÐØÙÖ ÙÒ Ð Ñ Ò ÓÒ Ó ÙÒ Ùר ÕÙ Ð Ö Óº ÖÒ Ð ¬ ÙÖ º ´ µ¸ Ð ÒÓ Ó z ÔÙ ×Ø Ö Ô Ö Ø Ñ ÒØ ÕÙ Ð Ö Ó Ó ×Ù Ö Ö ÙÒ Ð ÖÓ Ý ÒÓ Ú ÓÐ ØÓÖ Ó × ÕÙ Ð Ö Óº Ò ØÓ Ó ×Ó¸ Ð ÐØÙÖ z × h + 1º Ä ÓÖÖ ÓÒ × ÔÖ × ÒØ Ò Ð ¬ ÙÖ º½½´ µ¸ ÕÙ × Ð Ñ ×Ñ ÕÙ Ô Ö Ð Ò× Ö ÓÒ ÔÖ × ÒØ ÒÐ ¬ ÙÖ º ´ µ ÙÒ ÖÓØ ÓÒ Ó Ð ¸ ÖÙÞ ¸ Ð ÒÓ Ó z Ð Ö Ý ÐÙ Ó Ð ÞÕÙ Ö º Ë Ñ Ð Ö Ð ÔÖ Ñ Ö ×Ó¸ Ð × ÙÒ Ó Ø Ñ Ò Ö Ù Ð ÐØÙÖ Ò Ö Ð Ð Ö ÓÐ T h + 3 h + 2º ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ø Ñ Ò × Ò × Ö Ó Ö Ú × Ö Ð × Ò Ò T Ò Ù×ÕÙ Ú ÓÐ ÓÒ × Ð ÓÒ ÓÒ ÎÄ Ù× × ÔÓÖ Ð Ùר º Ó ÙÒ ÒÓ Ó Ú ÓÐ ØÓÖ Ó Ð ÓÒ ÓÒ Îĸ Ð × ÙÒ Ó ×Ó × ÙÒ ÚÓ Ñ ÒØ ÒØ ¬ Ð ÐÓ× × ÒÓ× Ð ÒÓ Ó Ú ÓÐ ØÓÖ Ó Ý ×Ù Ó ×ÓÒ ÒÚ Ö×Ó׺ ÈÙ ×ØÓ ÕÙ ×Ø × Ð Ñ ×Ñ × ØÙ ÓÒ ÕÙ ÓÒ Ð × ÙÒ Ó ×Ó Ú ÓÐ ÓÒ Ò Ð Ò× Ö ÓÒ¸ Ø Ñ Ò ÔÓ ÑÓ× Ö ÙØ Ð Þ Ö Ð ÖÙØ Ò rotation type()º Ð Ø Ö Ö Ý ÙÐØ ÑÓ ×Ó Ú ÓÐ ÓÒ Ù× Ó ÔÓÖ ÙÒ Ð Ñ Ò ÓÒ × ÐÙ×ØÖ Ò Ð ¬ ÙÖ º½¾´ µº ÕÙ Ð Ö Ñ α Ô Ö ÐØÙÖ Ó ÙÒ Ð Ñ Ò ÓÒ Ó ÙÒ Ùר ÔÖ Ú Óº ר ×Ó Ý ×Ù ×ÓÐÙ ÓÒ ×ÓÒ Ô Ö Ó× Ð ÔÖ Ñ Ö ×Ó ÐÙ×ØÖ Ó Ò Ð × ¬ ÙÖ × º½¼´ µ Ý º½¼´ µ¸ Ö ×Ô Ø Ú Ñ ÒØ º Ä Ö Ò ×ØÖ Ò ÕÙ Ð ÒÓ Ó y ר ÕÙ Ð Ö Óº ר ×Ó Ø Ñ Ò × ÙÒ ÚÓ Ñ ÒØ ÒØ ¬ Ð Ð Ó Ð ÒÓ Ó Ú ÓÐ ØÓÖ Ó ×Ø ÕÙ Ð Ö Ó Ý Ù ÓÒ× Ö ¸ Ô ÖÓ ×Ø ÓÖ ÒÓ ÜÔÐ ¸ Ò Ð × ÒÓ Ð ÖÙØ Ò rotation type()º Ä ÓÖÖ ÓÒ Ð Ø Ö Ö ×Ó ÓÒ× ×Ø Ò ÙÒ ÖÓØ ÓÒ × ÑÔÐ Ð ÞÕÙ Ö ÕÙ ÖÖÓ ÓÑÓ ×ÓÐÙ ÓÒ Ð × ØÙ ÓÒ × Ö Ø Ò Ð ¬ ÙÖ º½¾´ µº Ó ÕÙ y ר Ò ÐÑ ÒØ ÕÙ Ð Ö Ó¸ Ð ÐØÙÖ Ò Ö Ð T ÒÓ Ñ º ÈÓÖ ÐÓ Ø ÒØÓ¸ × Ð × Ò Ò T × Îĸ Ð Ö ÓÐ Ö ×ÙÐØ ÒØ Ð ÓÖÖ ÓÒ Ø Ñ Ò ÐÓ × Ý Ð Ð Ñ Ò ÓÒ ÔÙ ÙÐÑ Ò Ö ÒØ רT ×Óº T x y 2 −1 y x 0 1 χ α h α h β χ β h h =⇒ ´µ ´ µ ÙÖ º½¾ Ì Ö Ö ×Ó Ð Ñ Ò ÓÒ Ò ÙÒ Ö ÓÐ ÎÄ ÙÒÓ ÐÓ× ØÖ × ×Ó׸ Ø Ò ×Ù× ÕÙ Ú Ð ÒØ × × Ñ ØÖ Ó× ÐÑ ÒØ ÒØ ÖÔÖ Ø Ð × Ñ Ò Ò ÓÐÓ× Ö ­ Ó× Ò ÙÒ ×Ô Óº Ñ Ò Ö Ò Ö Ð¸ ×ÔÙ × Ð Ð Ñ Ò ÓÒ × ¸ ÑÓ× Ö ØÖÓ Ö Ò Ð Ñ ÒÓ
  • 532.
    506 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u Ù×ÕÙ ¸ ØÙ Ð Þ Ö ØÓÖ Ý Ö Ú × ÖÐÓ Ô Ö Ú Ö × Ü ×Ø Ð ÙÒ Ú ÓÐ ÓÒº Ë × Ò Ù ÒØÖ ÙÒ ØÓÖ ÕÙ Ö ÔÖ × ÒØ ÙÒ Ú ÓÐ ÓÒ¸ ÒØÓÒ × ÑÓ× ÓÖÖ ÖÐ × ÙÒ ÐÓ× ×Ó× ÔÖ × ÒØ Ó׺ Ë Ð ÓÖÖ ÓÒ ÓÖÖ ×ÔÓÒ Ð Ø Ö Ö ×Ó¸ ÒØÓÒ × Ð Ð ÓÖ ØÑÓ Ø ÖÑ Ò º ÐÓ ÓÒØÖ Ö Ó¸ ÑÓ× Ö Ô Ø Ö Ð ÔÖÓ Ñ ÒØÓ ×Ø Ò ÓÒØÖ Ö ÙÒ ØÓÖ ÕÙ ÒÓ Ö ÔÖ × ÒØ ÙÒ Ú ÓÐ ÓÒ Ó ×Ø Ò ÓÒØÖ ÖÒÓ× ÓÒ Ð Ö Þº ר ÓÒ Ù Ø × ÜÔÖ × Ò Ð × Ù ÒØ ÙÒ ÓÒ ¼ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Avl Tree<Key> +≡ ´ µ ¼¿ void restore_avl_after_deletion(const Key & key) { Node * pp = avl_stack.top(1); // padre de p Node * ppp = avl_stack.popn(3); // elimina de pila p, su padre y su abuelo while (true) { // actualice factores de equilibrio if (key >= KEY(pp)) DIFF(pp)--; else DIFF(pp)++; if (DIFF(pp) == -2 or DIFF(pp) == 2) // verifique una violaci´n AVL o pp = restore_avl(pp, ppp); if (DIFF(pp) != 0 or pp == root) break; // altura global del arbol no ha cambiado ==> terminar ´ pp = ppp; // avance al pr´ximo ascendiente o ppp = avl_stack.pop(); } clean_avl_stack(); } ¬Ò × restore avl after deletion¸ Ù× Ò ÙÒ ¼½ º Í× × avl stack ¸ clean avl stack ¸ Ò restore avl ¼¼ º 6.4.2 An´lisis de los ´rboles AVL a a ÓÑ ÒÞ Ö ÑÓ× ÒÙ ×ØÖÓ Ò Ð × × ÔÓÖ Ð ÔÖ × ÒØ ÓÒ Ð × Ù ÒØ ÔÖÓÔÓ× ÓÒ Ý × Ù× ÓÒ ×Ù× ÓÒ× Ù Ò × Proposici´n 6.4 (Adelson Velsky - Landis, 1962 [1]) o Ë T ÙÒ Ö ÓÐ ÎÄ ÓÒ n ÒÓ¹ Ó׸ ÒØÓÒ × Ð (n + 1) ≤ h(T ) < 1.4404 Ð (n + 2) − 0.3277 ´ º½¼µ Demostraci´n Î Ö Ü º º¾º¾º o Ä ÑÓ×ØÖ ÓÒ × Ð Ó ¬ ÙÐØÓ× Ý × × ÖÖÓÐÐ Ö Ò Ø ÐÐ Ò Ð × × ÓÒ × ×Ù × ¹ Ù ÒØ ׺ È ÖÓ ×Ù× ÓÒ× Ù Ò × Ô Ö Ð Ò Ð × × Ð × ÓÔ Ö ÓÒ × Ò× Ö ÓÒ Ý Ð Ñ ¹ Ò ÓÒ ×ÓÒ ÑÙ Ó Ñ × Ú ÒØ ׺ Ä ÔÖ Ñ Ö Ó × ÖÚ ÓÒ ÕÙ ÓÒÐÐ Ú Ð ÔÖÓÔÓ× ÓÒ º½¼ × ÕÙ Ð ÐØÙÖ Ñ Ü Ñ ÙÒ Ö ÓÐ ÎÄ × O(Ð n)º ÆÓ ÑÔÓÖØ Ù ÒØÓ Ö Þ Ð Ö Óи Ð ÙÑ ÒØÓ Ð ÐØÙÖ × ÑÔÖ × ÐÓ Ö ØÑ Óº Ê ×Ô ØÓ Ð Óר ÓÒר ÒØ Ø Ò ÑÓ׸ Ò Ð Ô ÓÖ ÐÓ× ×Ó׸ ÙÒ ÐØÙÖ ÙÒ 44± Ñ ÝÓÖ ÕÙ Ð ÙÒ Ö ÓÐ Ô Ö Ø Ñ ÒØ ÕÙ Ð Ö Óº Ò Ð × × ØÙ ÓÒ × Ö ×Ø ÒØ ׸ Ð ÐØÙÖ ×
  • 533.
    ´ 6.4. Arboles AVL 507 Ñ ÒÓÖ Ý Ð Ø ÑÔÓ Ù×ÕÙ × Ñ ÓÖº ÓÖ Ò¸ ÕÙ Ø Ò ÓרÓ×Ó × ×Ø 44± Ë Ö ÓÖ ÑÓ× ÐÓ× 1300 Ñ ÐÐÓÒ × ÒÓ× ÓÒ× Ö Ó× Ò Ò Ü º ¸ Ð ÒÓÑ Ö Ò Ë ÙÒ¹ Ò Ò ÙÒ ÏÙ ÔÙ × Ö ÐÓ Ð Þ Ó Ò ÐÓ ×ÙÑÓ 1.44 Ð 1300000000 = 44 ÒØ ÒØÓ׸ 13 Ñ × ÕÙ ÓÒ ÙÒ Ö ÓÐ Ô Ö Ø Ñ ÒØ ÕÙ Ð Ö Ó Ý ×ØÓ ×ÓÐÓ × ×ÓÑÓ× ÑÙÝ × ÓÖØÙÒ Ó׺ Ä ÓØ ÑÔÙ ×Ø ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ º½¼ Ø Ò Ö Ø Ñ ÒØ Ð Ù×ÕÙ º ÉÙ Ö Ð Ò× Ö ÓÒ Ý Ð Ñ Ò ÓÒ Ä Ò× Ö ÓÒ Ö ÕÙ Ö ÙÒ Ù×ÕÙ ÕÙ ¸ ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ º½¼¸ × O(Ð n)º ÄÙ Ó¸ × Ö ØÖÓ Ò Ð Ñ ÒÓ Ù×ÕÙ Ô Ö Ú Ö¹ ¬ Ö × Ý Ð ÙÒ × ÕÙ Ð Ö Ó¸ ÕÙ ÒÓ ØÓÑ Ñ × ØÖ × ÒÓ Ó׸ Ý ÕÙ ÐÓ ¸ Ô٠׸ ÓÒר ÒØ Ñ ÒØ ÓØ Óº Ë × Ò Ù ÒØÖ ÙÒ × ÕÙ Ð Ö Ó¸ ÒØÓÒ × ×Ø × ÓÖÖ Ò¸ ÐÓ ×ÙÑÓ¸ Ó× ÖÓØ ÓÒ ×¸ Ð × Ù Ð × Ø Ñ Ò ×Ø Ò ÓÒר ÒØ Ñ ÒØ ÓØ ׺ ÈÓ ÑÓ× ÓÒ ÐÙ Ö¸ ÒØÓÒ ×¸ ÕÙ Ð Ò× Ö ÓÒ × O(Ð n) + O(1) + O(1) = O(Ð n)º Ð ÔÖ Ñ Ö Ô ×Ó Ð Ð Ñ Ò ÓÒ × ÙÒ Ù×ÕÙ ¸ Ð Ù Ð Ý ÓÒ ÐÙ ÑÓ× ÕÙ ØÓÑ O(Ð n)º ×Ô٠׸ ÑÓ× Ö ØÖÓ Ö Ò Ð Ñ ÒÓ Ù×ÕÙ ¸ Ú Ö ¬ Ö × Ý × ÕÙ ¹ Ð Ö Ó Ý¸ × × Ð ×Ó¸ ÓÖÖ ÖÐÓº Ê ÓÖ ÑÓ× ÕÙ ÙÒ ÓÖÖ ÓÒ × ÕÙ Ð Ö Ó ÔÙ Ù× Ö ÓØÖÓ × ÕÙ Ð Ö Ó Ò Ð × Ò Ò Ð ÒÓ Ó ÓÖÖ Óº Ò Ð Ô ÓÖ ÐÓ× ×Ó׸ Ð ÔÖ Ñ Ö ÓÖÖ ÓÒ ÔÙ Ù× Ö ÙÒ Ò ÓÖÖ ÓÒ × ×Ù × Ú × ÕÙ ÔÙ ÐÐ Ö ×Ø Ð Ö Þº ÈÙ ×ØÓ ÕÙ Ð ÐØÙÖ × O(Ð n) Ð Ò ÓÖÖ ÓÒ × × ÐÓ ×ÙÑÓ O(Ð n) × ×Ø ÐÐ × ×Ø Ð Ö Þº Ä Ð Ñ Ò ÓÒ ×¸ Ô٠׸ O(Ð n) + O(Ð n) = O(Ð n) Ñ × ÓרÓ× ÕÙ Ð Ò× Ö ÓÒ Ô ÖÓ Ø Ñ Ò O(Ð n)º Ò ÓÒ ÐÙ× ÓÒ¸ ØÓ × Ð × ÓÔ Ö ÓÒ × ÙÒ Ö ÓÐ ÎÄ ×ÓÒ O(Ð n) Ô Ö Ð Ô ÓÖ ×Óº Ë × Ö ÕÙ Ö Ò Ö ÒØ × × ÑÔ ÒÓ Ý × ×ÔÓÒ ÙÒ ÑÔÐ Ñ ÒØ ÓÒ¸ ÐÓ× Ö ÓÐ × ÎÄ ×ÓÒ ÙÒ Ù Ò × Ó Ò º 6.4.2.1 ´ Arboles de Fibonacci È Ö ÑÓ×ØÖ Ö Ð ÔÖÓÔÓ× ÓÒ º½¼¸ × ÓÒÚ Ò ÒØ ×ØÙ Ö ÙÒ Ð × ×Ô Ð Ö ÓÐ ÒÓÑ Ò Ó ÓÒ º Definici´n 6.5 (Arbol de Fibonacci) ÍÒ o ´ Ö ÓÐ ÓÒ ÓÖ Ò k¸ ÒÓÑ Ò Ó Tk¸ × ¬Ò Ö ÙÖ× Ú Ñ ÒØ ÓÑÓ ⎧ ⎪∅ ⎪ ⎨ × k=0 Tk = ⎪ ∅, 0, ∅ × k=1 ⎪ ⎩T , k−1 (k + 1) − 1, T k−2 + (k + 1) × k≥2 Ð ÙÐØ ÑÓ Ø ÖÑ ÒÓ¸ Tk−1, (k + 1) − 1, Tk−2 + (k + 1) ¸ ÒØ ÖÔÖ Ø Ö× Ù Ó× ¹ Ñ ÒØ º Ä Ö Ñ ÞÕÙ Ö ¸ Tk−1 × Ð Ö ÓÐ ÓÒ ÓÖ Ò k − 1º Ä Ö Þ Tk ר Ø ÕÙ Ø ÓÒ (k + 1) − 1 ÓÒ (i) × Ð i¹ × ÑÓ ÒÙÑ ÖÓ ÓÒ º Ä ÖÑ Ö × Ð Ö ÓÐ ÓÒ ÓÖ Ò k − 2 Ô ÖÓ ÓÒ ØÓ Ó× ×Ù× ÒÓ Ó× ×ÙÑ Ó× Ò (k + 1)º Ä ¬ ÙÖ º½¿ ÑÙ ×ØÖ Ð Ö ÓÐ ÓÒ Ô Ö k = 8º Ä Ö Ñ ÞÕÙ Ö × Ð Ö ÓÐ T7º ×Ù Ú Þ¸ Ð Ö Ñ ÞÕÙ Ö T7 × Ð Ö ÓÐ T6 ÕÙ Ò ×Ù Ú Þ Ø Ò Ö Ñ ÞÕÙ Ö T5 Ý × ×Ù × Ú Ñ ÒØ º Ä Ö Ñ Ö Tk Ø Ò Ü Ø Ñ ÒØ Ð Ñ ×Ñ ÓÖÑ ÕÙ Tk−1¸ Ô ÖÓ ÒÓ Ó × Ò Ö Ñ ÒØ Ó Ò (k + 1)º ÈÓÖ ÑÔÐÓ¸ Ò Ð ¬ ÙÖ º½¿ × ÔÙ Ú Ö ¬ Ö ÕÙ Ð Ö Ñ Ö ÔÖ Ò Ô Ð Ø Ò Ü Ø Ñ ÒØ Ð Ñ ×Ñ ÓÖÑ ÕÙ T6¸ Ü ÔØÓ ÕÙ ÐÓ× Ú ÐÓÖ × ÒÓ Ó ×ÓÒ Ò Ö Ñ ÒØ Ó× Ò (9) = 34º
  • 534.
    508 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u 33 20 46 12 28 41 51 7 17 25 31 38 44 49 53 4 10 15 19 23 27 30 32 36 40 43 45 48 50 52 2 6 9 11 14 16 18 22 24 26 29 35 37 39 42 47 1 3 5 8 13 21 34 0 ÙÖ º½¿ Ö ÓÐ ÓÒ ÓÖ Ò 8 Ð ¬ ÙÖ º½¿ × Ó × ÖÚ ÕÙ Ð Ø ÕÙ Ø ÒÓ Ó × Ü Ø Ñ ÒØ ×Ù ÔÓ× ÓÒ Ò¬ º ר ØÖÙ Ó ¿ ÒÓ× Ô ÖÑ Ø ÒØÙ Ö Ð Ö Ò Ð ÙÒ Ö ÓÐ ÓÒ º Ä Ö Þ Ð Ö ÓÐ ÓÒ ÓÖ Ò 8 ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ º½¿ × (8 + 1) − 1 = 33º ÈÙ ×ØÓ ÕÙ ÐÓ× ÒÓ Ó× ×Ø Ò Ø ÕÙ Ø Ó× ÓÒ ×Ù ÔÓ× ÓÒ Ò¬ ¸ (7 + 2) = 33 × Ð ÒØ ÒÓ Ó× ÕÙ ÔÖ Ò Ð Ö ÓÐ ÞÕÙ Ö Óº È ÖÓ¸ ÔÓÖ ¬Ò ÓÒ¸ Ä(T8) = T7¸ ÔÓÖ ÐÓ ÕÙ ÔÓ ÑÓ× Ù Ö ÕÙ |T7| = (7 + 2) − 1º ÈÓ ÑÓ× Ó × ÖÚ Ö Ö ÒØ × Ö ÓÐ × ÓÒ Ý ÓÖÖÓ ÓÖ Ö ×Ø ÒØÙ ÓÒ Ñ ÒØ Ð × Ù ÒØ ÔÖÓÔÓ× ÓÒ Proposici´n 6.5 o Ð ÒÙÑ ÖÓ ÒÓ Ó× ÙÒ Ö ÓÐ ÓÒ ÓÖ Ò k × (k + 2) − 1º Demostraci´n (por inducci´n sobre k) o o ¯ k=0 Ò ×Ø ×Ó¸ |T0| = (0) = 0º Ä ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö k = 0º ¯ k>0 ÓÖ ×ÙÑ ÑÓ× ÕÙ Ð ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö ØÓ Ó k Ý Ú Ö ¬ ÑÓ× × ÙÒ ÐÓ × Ô Ö k + 1º ÈÓÖ ¬Ò ÓÒ |Tk+1| = |Tk| + 1 + |Tk−1| ´ º½½µ × Ö¸ Ð ÒÙÑ ÖÓ ÒÓ Ó× Ð Ö Ñ ÞÕÙ Ö Ñ × Ð Ö Þ Ñ × Ð ÒÙÑ ÖÓ ÒÓ Ó× Ð Ö Ñ Ö º ÔÐ Ò Ó Ð ÔÓØ × × Ò Ù Ø Ú Ð Ù ÓÒ ´ º½½µ¸ Ø Ò ÑÓ× |Tk+1| = (k + 1) − 1 + 1 + (k + 1) − 1 = (k + 2) + (k + 1) − 1 = (k + 3) − 1 ¿ Ò Ö Ð ¸ Ð ÒØ Ö × ÔÖ Ñ Ö Ó ÐÓ× Ö ÓÐ × ÓÒ × ØÓÔÓÐÓ Ó¸ Ô ÖÓ Ð Ñ Ò Ö Ò ÕÙ ÐÓ× Ø ÕÙ Ø ÑÓ× ÒÓ× Ñ × ÔÖ Ò× Ð Ð × ÑÓ×ØÖ ÓÒ ×º
  • 535.
    ´ 6.4. Arboles AVL 509 Ä ÔÖÓÔÓ× ÓÒ ×¸ ÒØÓÒ ×¸ ÖØ Ô Ö ØÓ Ó k Ä ÐØÙÖ ÙÒ Ö ÓÐ ÓÒ Ø Ñ Ò × ÐÑ ÒØ ×Ù Ö Ð ÔÓÖ Ó × ÖÚ ÓÒº Ò Ð ×Ó Ð Ö ÓÐ ÓÖ Ò 8 ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ º½¿ × 8 × Ö¸ ×Ù ÓÖ Òº Proposici´n 6.6 o Ä ÐØÙÖ Ð Ö ÓÐ ÓÒ ÓÖ Ò k × kº Demostraci´n (por inducci´n sobre k) o o ¯ k=0 ר ×Ó × Ö ØÓ ÔÙ × Ð Ö ÓÐ Ú Ó Ø Ò ÐØÙÖ ÒÙÐ º ¯ k>0 ÓÖ ×ÙÑ ÑÓ× ÕÙ Ð ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö ØÓ Ó k Ý Ú Ö ¬ ÑÓ× Ô Ö k + 1º Ë Tk+1 Ð Ö ÓÐ ÓÒ ÓÖ Ò k + 1º ÒØÓÒ ×¸ h(Tk+1) = 1 + Ñ Ü(h(Tk), h(Tk−1))º ÔÐ Ò Ó Ð ÔÓØ × × Ò Ù Ø Ú ¸ Ñ Ü(h(Tk), h(Tk−1)) = h(Tk) = k¸ ÔÓÖ ÐÓ ÕÙ h(Tk+1) = 1 + k ÙÖ º½ Ö ÓÐ ÓÒ ÓÖ Ò 13 Ä ÔÖÓÔÓ× ÓÒ ÒØ Ö ÓÖ × ÙÒ Ñ ÒØ Ð Ô Ö ÑÓ×ØÖ Ö ÕÙ ÙÒ Ö ÓÐ ÓÒ × Îĸ Ù ×Ø ÓÒ ÕÙ Ö ×ÔÓÒ Ð ÔÖÓÔÓ× ÓÒ ÕÙ × Ù Proposici´n 6.7 o ÍÒ Ö ÓÐ ÓÒ × Îĺ Demostraci´n Ë Tk Ð Ö ÓÐ o ÓÒ ÓÖ Ò kº ÓÒרÖÙ Ö ÑÓ× Ð ÑÓ×ØÖ ÓÒ ÔÓÖ Ò Ù ÓÒ ×Ó Ö k ¯ k = 0 ר ×Ó × Ö ØÓ ÔÙ × Ð Ö ÓÐ Ú Ó × Îĺ ¯ k = 1 Ò ×Ø ×Ó T1¸ ÓÑÔÙ ×ØÓ ÔÓÖ ÙÒ ×ÓÐÓ ÒÓ Ó¸ × ÙÒ Ö ÓÐ Îĺ ¯ k>0 ÓÖ ×ÙÑ ÑÓ× ÕÙ Ð ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö ØÓ Ó k Ý Ú Ö ¬ ÑÓ× Ô Ö Tk+1º È Ö ÕÙ Tk+1 × Îĸ Ð ÖÒ ÐØÙÖ × ØÓ Ó× ×Ù× ÒÓ Ó× ÒÓ Ü Ö ÙÒÓº ÈÓÖ ¬Ò ÓÒ¸ Ð × Ö Ñ × Tk+1 ×ÓÒ Ö ÓÐ × ÓÒ ¸ ÐÓ× Ù Ð ×¸ ÔÓÖ Ð ÔÓØ × × Ò Ù Ø Ú ¸ ×ÓÒ Îĺ × Ô٠׸ Ð ÙÒ Ó ÒÓ Ó Ò ÕÙ Ý ÕÙ Ú Ö ¬ Ö Ð ÓÒ ÓÒ ÎÄ × Ò Ð Ö Þ Tk+1º Ä ÖÒ ÐØÙÖ × Ö Þ(Tk+1) ר ÔÓÖ δ(raiz(Tk+1)) = h(Ê(Tk+1)) − h(Ä(Tk+1)) = h(Tk−1) − h(Tk) Р٠и ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ º ¸ × k − 1 − k = −1º ÈÙ ×ØÓ ÕÙ ØÓ Ó× ÐÓ× ÒÓ Ó× Tk+1 × Ø × Ò Ð ÓÒ ÓÒ Îĸ Tk+1 × ÎÄ Ý Ð ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö ØÓ Ó k Ù ÐÕÙ Ö Ö ÓÐ ÓÒ × Îĺ × ×Ø Ô Ö×Ô Ø Ú ¸ ÐÓ× Ö ÓÐ × ÓÒ ×ÓÒ ÐØÓ ÒØ Ö ×¸ ÔÙ × ÒÓ× Ö Ø Ö Þ Ò Ö ÓÐ × ÎÄ ÐØÙÖ Ñ Ü Ñ º È Ö ÔÖ Ö ×Ø Ù ×Ø ÓÒ¸ Ö ÕÙ Ö ÑÓ× Ð × Ù ÒØ ¬Ò ÓÒ
  • 536.
    510 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u ´ Definici´n 6.6 (Arbol AVL cr´ o ıtico) Ë T ÙÒ Ö ÓÐ ÎÄ ÐØÙÖ hº Ë ÕÙ T × Ö Ø Ó × Ý ×ÓÐÓ × ¸ Ð Ð Ñ Ò Ö ÙÒ ÒÓ Ó¸ Ð Ö ÓÐ × Ö ÎÄ Ó Ô Ö ÐØÙÖ º Ä × Ù ÒØ ÔÖÓÔÓ× ÓÒ ÒÓ× ×Ø Ð Ð Ö Ø ÙÒ Ö ÓÐ ÓÒ º Proposici´n 6.8 ÍÒ Ö ÓÐ o ÓÒ × ÙÒ Ö ÓÐ ÎÄ Ö Ø Óº Demostraci´n (por inducci´n sobre k = |T |) o o ¯ k=0 Ò ×Ø ×Ó¸ T0 = ∅ ÕÙ ¸ × Ò × ÔÓÖ ¬Ò ÓÒ Îĸ ÒÓ Ñ Ø Ð Ñ Ò ÓÒº ¯ k = 1 Ò ×Ø ×Ó T1 × ÙÒ Ö ÓÐ ÓÒ ÓÖÑ Ó ÔÓÖ ÙÒ ×ÓÐÓ ÒÓ Óº Ð ØÙ Ö Ð ÙÒ Ð Ñ Ò ÓÒ ÔÓ× Ð × Ô Ö Ò T0¸ Р٠и ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ º ¸ Ø Ò Ñ ÒÓÖ ÐØÙÖ ÕÙ T1º Ð Ð Ñ × ÔÙ × ÖØÓ Ô Ö ×Ø ×Óº ¯ k = 2 Ò ×Ø ×Ó × ØÖ Ø T2¸ Ð Ù Ð ×ÓÐÓ × ÔÓ× Ð Ð Ñ Ò Ö Ó× ÒÓ Ó׺ ÁÒ Ô Ò ÒØ Ñ ÒØ Ð ÒÓ Ó ÕÙ Ð Ñ Ò ÑÓ׸ Ð Ö ÓÐ Ô Ö Ò T1 Ó × ÕÙ × Ô Ö ÐØÙÖ º ¯ k = 3 ÒØÓÒ × Ø Ò ÑÓ× T3 T3 2 T2 1 3 T0 T1 0 ÕÙ Ø Ò ÑÓ× Ù ØÖÓ ×Ó× ½º Ë Ð Ñ Ò ÑÓ× Ð ÒÓ Ó 0¸ ÒØÓÒ × Ð Ö ÓÐ Ô Ö ÐØÙÖ º ¾º Ë Ð Ñ Ò ÑÓ× Ð ÒÓ Ó 3¸ ÒØÓÒ × Ð Ö ÓÐ × Ö ÎÄ Ý Ù ÐÕÙ Ö Ùר ÕÙ × ÓÒÐÐ Ú ÙÒ Ô Ö ÐØÙÖ º ¿º Ë Ð Ñ Ò ÑÓ× Ð ÒÓ Ó 1¸ ÒØÓÒ × Ð Ø Ö Ð Ö Þ 2 ÓÒ Ð Ó 0 Ð Ö ÓÐ Ô Ö ÐØÙÖ º º Ò ÐÑ ÒØ ¸ × Ð Ñ Ò ÑÓ× Ð Ö Þ 2¸ ÒØÓÒ × Ø Ò ÑÓ× Ó× ÐØ ÖÒ Ø Ú × Ô Ö ×Ùר ØÙ ÖÐ ´ µ ÓÐÓ ÑÓ× Ð ÒÓ Ó 1 ÓÑÓ Ö Þ¸ ÐÓ ÕÙ ÖÖ ÕÙ Ð Ö ÓÐ Ô Ö ÐØÙÖ º ´ µ ÓÐÓ ÑÓ× Ð ÒÓ Ó 3 ÓÑÓ Ö Þ¸ ÐÓ ÕÙ Ù× ÕÙ Ð Ö ÓÐ × Ö Îĺ ¯ k>3 ÓÖ ×ÙÑ ÑÓ× ÕÙ Ð Ð Ñ × ÖØÓ Ô Ö ØÓ Ó k Ý Ú Ö ¬ ÑÓ× × ÙÒ ÐÓ × Ô Ö k + 1º Ð Ö ÓÐ Tk+1 ÔÙ Ô ØÓÖ Þ Ö× ÓÑÓ Tk+1 Tk Tk−1
  • 537.
    ´ 6.4. Arboles AVL 511 ÈÓÖ Ð ÔÓØ × × Ò Ù Ø Ú ¸ ÐÓ× Ö ÓÐ × Tk Ý Tk−1 ×ÓÒ Ö Ø Ó׸ × ÕÙ Ð Ð Ñ Ò Ö Ù ÐÕÙ Ö ÒÓ Ó ÐÐÓ× Ð Ö ÓÐ Ö × Ö ÎÄ Ó Ô Ö Ö ÐØÙÖ º × Ô٠׸ Ð ÙÒ Ó ÔÙÒØÓ Ù ÐÓ ÓÒר ØÙÝ Ð Ð Ñ Ò ÓÒ Ð Ö Þ Tk+1º Ð Ð Ñ Ò Ö Ð Ö Þ¸ ÕÙ × ÙÒ ÒÓ Ó ÓÑÔÐ ØÓ¸ ÑÓ× ×Ùר ØÙ ÖÐ ÔÓÖ Ð ÙÒÓ ÐÓ× ÒÓ Ó× Tk Ó Tk−1º Ì Ò ÑÓ× Ó× ×Ó× ½º ËÙר ØÙ ÑÓ× Ð Ö Þ ÔÓÖ ÙÒ ÒÓ Ó Tk × Tk Ô Ö ÐØÙÖ ¸ ÒØÓÒ × Tk+1 Ø Ñ Ò Ô Ö ÐØÙÖ º Ë Tk × Ö Îĸ ÒØÓÒ × Tk+1 Ø Ñ Ò × Ö Îĺ ¾º ËÙר ØÙ ÑÓ× Ð Ö Þ ÔÓÖ ÙÒ ÒÓ Ó Tk−1 × Tk−1 × Ö Îĸ ÒØÓÒ × Tk+1 ØÑ Ò × Ö Îĺ Ë Tk−1 Ô Ö ÐØÙÖ ¸ ÒØÓÒ × Ó ÙÖÖ ÙÒ Ú ÓÐ ÓÒ Ð ÓÒ ÓÒ ÎÄ Ò Ð Ö Þ Tk+1¸ ÔÙ × δ(Tk+1) = −2º Tk+1 ÔÙ × × Ö Îĺ ÈÙ ×ØÓ ÕÙ Tk+1 × ÙÒ ÎÄ Ö Ø Ó¸ ÒØÓÒ × Ð ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö ØÓ Ó k ×ØÙ Ó× ÐÓ× Ö ÓÐ × ÓÒ ¸ Ø Ò ÑÓ× ØÓ × Ð × ÖÖ Ñ ÒØ × Ö ÕÙ Ö × Ô Ö Ð ÑÓ×ØÖ ÓÒ Ð ÔÖÓÔÓ× ÓÒ º º 6.4.2.2 Demostraci´n de la proposici´n 6.4 o o Ä ÐØÙÖ Ñ Ò Ñ ÙÒ Ö ÓÐ ÎÄ × Ð Ñ ×Ñ ÕÙ Ô Ö Ù ÐÕÙ Ö Ö ÓÐ Ò Ö Ó¸ Ð Ù Ð Ù ÑÓ×ØÖ Ò Ð ÔÖÓÔÓ× ÓÒ º½º ÈÓÖ Ø ÒØÓ¸ ÒÓ× ÓÒ ÒØÖ Ö ÑÓ× Ò ×ØÙ Ö Ð ÐØÙÖ Ñ Ü Ñ ÕÙ ÔÙ Ð ÒÞ Ö ÙÒ Ö ÓÐ Îĺ ר ÑÓ× ÒØ Ö × Ó× Ò Ò ÓÒØÖ Ö ÙÒ Ñ Ò Ö ×ÔÓÒ Ö n ÒÓ Ó× Ò ÙÒ Ö ÓÐ ÎÄ Ñ Ò Ö Ø Ð ÕÙ ×Ù ÐØÙÖ × Ñ Ü Ñ º Ò ÓØÖ × Ô Ð Ö ×¸ ÑÓ× ×ÔÓÒ Ö ÐÓ× n ÒÓ Ó× Ò ÙÒ Ö ÓÐ Ö Ø Óº ÓÑÓ × ÑÓ× Ð ÔÖÓÔÓ× ÓÒ º ¸ ÙÒ Ö ÓÐ ÓÒ × Ö Ø Óº Ð Ñ ×ÑÓ ÑÓ Ó¸ ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ º ¸ ÙÒ Ö ÓÐ ÓÒ × Îĺ ÓÒ × ÙÖ ¸ ÔÓ ÑÓ× Ù× Ö Ð ÓØ Ð ÐØÙÖ Ñ Ü Ñ ØÖ Ú × ÙÒ Ö ÓÐ ÓÒ º ÙÒ ÐØÙÖ ÒÓÑ Ò Ð h¸ ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ º ¸ Ð Ö ÓÐ ÓÒ Th¸ ÎÄ Ý Ö Ø Ó¸ Ø Ò ¸ × ÙÒ Ð ÔÖÓÔÓ× ÓÒ º ¸ (h + 2) − 1 ÒÓ Ó׺ × Ô٠׸ ÔÐ ÒØ ÑÓ× n ≥ |Th| = (h + 2) − 1 ´ º½¾µ Ù ÐÕÙ Ö Ö ÓÐ ÎÄ ÐØÙÖ h Ø Ò ÕÙ Ø Ò Ö Ù Ð Ó Ñ × ÒÓ Ó× ÕÙ |Th|¸ ÔÙ × Th × Ö Ø Óº ר ÑÓ Ó¸ ÐÓ ÙÒ Ó ÕÙ ÒÓ× Ö ×Ø × Ò ÓÒØÖ Ö ÙÒ ÜÔÖ × ÓÒ ÕÙ ÒÓ× ÒÓØ Ð n¹ × ÑÓÒÙÑ ÖÓ ÓÒ Ý ×Ô Ö h Ð × Ù Ð ´ º½¾µº Ô ÖØ Ö Ð ÓÒÓ Ñ ÒØÓ ÕÙ (0) = 0, (0) = 1¸ ÑÓ× Ö ×ÓÐÚ Ö Ð Ù ÓÒ Ö ÙÖÖ Ò (k) = (k − 1) + (k − 2) =⇒ ´ º½¿µ (k + 2) = (k + 1) + (k) =⇒ ´ º½ µ Ä Ù ÓÒ ´ º½ µ × ÙÒ Ù ÓÒ Ö ÙÖÖ ÒØ ÓÑÓ Ò × ÙÒ Ó ÓÖ Òº Ë ¹ ÒÓÑ Ò ×Ø Ñ Ò Ö ÔÓÖÕÙ × Ö Ñ Ò × ÒØ ÙÒ Ù ÓÒ Ö Ò Ð ÓÑÓ Ò × ÙÒ Ó ÓÖ Òº Ó¸ Ð × Ù ÓÒ × Ö ÙÖÖ Ò × Ñ ÒÙ Ó × ÒÓÑ Ò Ò Ù ¹ ÓÒ × Ö Ò × ¸ ÔÓÖ ×Ù × Ñ Ð ØÙ × ÓÒ Ð × Ù ÓÒ × Ö Ò Ð ×º Ò ×Ø × ÒØ Ó¸
  • 538.
    512 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u Ð Ù ÓÒ ´ º½ µ × Ö Ñ Ò × ÒØ ÙÒ Ù ÓÒ Ö Ò Ð Ð Ò Ð ÓÑÓ Ò × ÙÒ Ó ÓÖ Ò ÓÒ Ó ¬ ÒØ × ÓÒר ÒØ × × Ö¸ ÓÖÑ y + a1 y + a2 y = 0º ÓÖ ÔÓ ÑÓ× Ö ×ÓÐÚ Ö Ð Ù ÓÒ Ö ÙÖÖ ÒØ ´ º½ µ Ñ ÒØ ÙÒ Ñ ØÓ Ó Ò ÐÓ Ó Ö ×ÓÐÙ ÓÒ ÙÒ Ù ÓÒ Ö Ò Ðº È Ö ÐÐÓ¸ Ð Ù Ð ÕÙ ÓÒ ÙÒ Ù ÓÒ Ö Ò Ð ÓÑÓ Ò × ÙÒ Ó ÓÖ Ò¸ ÔÐ ÑÓ× Ð ØÖ Ò× ÓÖÑ ÓÒ × Ù ÒØ (k) = c ωk, c, ω = 0, k ≥ 2 . ´ º½ µ ËÙר ØÙ ÑÓ× ´ º½ µ Ò ´ º½ µ¸ ÐÓ ÕÙ ÔÖÓÔÓÖ ÓÒ Ð Ù ÓÒ Ö Ø Ö ×Ø × Ù ÒØ c ωk+2 = c ωk+1 + c ωk , ´ º½ µ Р٠и Ð Ú Ö ÔÓÖ c ωk¸ ÔÙ × ÑÔÐ ¬ Ö× Ð Ð Ò Ö Ù ÓÒ Ú Ò ω2 − ω − 1 = 0 , ´ º½ µ ÙÝ × Ö × ×ÓÒ √ 1± 5 ω= 2 . ´ º½ µ רÓ× ÒÙÑ ÖÓ× ×ÓÒ Ð Ò Ö Ó׸ Ð ÒÙÑ ÖÓ ϕ Ý ϕ ÙÝÓ× ^ Ú ÐÓÖ × ×ÓÒ √ 1+ 5 ϕ = 2√ ≈ 1.61803 , ´ º½ µ 1− 5 ϕ = ^ 2 ≈ 0.61803 ´ º¾¼µ ר Ñ Ò Ö ¸ Ð ×ÓÐÙ ÓÒ Ò Ö Ð × (k) = c1 ϕk + c2 ϕk ^ ´ º¾½µ È Ö Ò ÓÒØÖ Ö ÐÓ× Ú ÐÓÖ × c1 Ý c2¸ ÑÓ× ÐÓ Ñ ×ÑÓ ÕÙ ÓÒ ÙÒ Ù ÓÒ Ö Ò Ð ÔÐ ÒØ ÑÓ× ÙÒ × ×Ø Ñ Ù ÓÒ × ÓÒ Ú ÐÓÖ × ÓÒÓ Ó× (k)º Ò ×Ø ×Ó¸ ÙØ Ð Þ ÑÓ× (0) = 0 Ý (1) = 1 (0) = 0 = c1 ϕ0 + c2 ϕ0 = c1 + c2 ^ ´ º¾¾µ (1) = 1 = c1 ϕ1 + c2 ϕ1 = c1 ϕ + c2 ϕ ^ ^ ´ º¾¿µ Ð Ù ÓÒ ´ º¾¾µ Ø Ò ÑÓ× c2 = −c1 ´ º¾ µ Ý ×Ùר ØÙÝ Ò Ó ´ º¾ µ Ò ´ º¾¿µ c1 ϕ − c1 ϕ = 1 =⇒ c1(ϕ − ϕ) = 1 =⇒ c1 = ^ ^ 1 ϕ−ϕ^ =√ 1 ´ º¾ µ 5 ÓÑ Ò Ò Ó ´ º¾ µ Ý ´ º¾ µ Ò ´ º¾½µ ϕk − ϕk ^ 1 1 (k) = √ ϕk − √ ϕk = ^ √ ´ º¾ µ 5 5 5
  • 539.
    ´ 6.5. Arboles rojo-negro 513 ÈÙ ×ØÓ ÕÙ ϕ < 1¸ Ð Ø ÖÑ ÒÓ ϕk Ú Ò ÜÔÓÒ Ò ÐÑ ÒØ ÑÙÝ Ô ÕÙ ÒÓ ÓÒ ÓÖÑ ^ ^ Ö k¸ Ö Ó¸ ϕ × ×ÔÖ Ð Ò ´ º¾ µ√Ô Ö Ú ÐÓÖ × k ÑÙÝ Ö Ò ×º ÓÒ× Ù ÒØ ¹ ^ Ñ ÒØ ¸ (k) × ×Ø ÒØ Ö ÒÓ ϕk/ 5 ÓÒ ÓÖÑ Ö kº × Ô٠׸ ÔÓ ÑÓ× Ø Ò Ö ÙÒ ÜÔÖ × ÓÒ Ñ × × ÑÔÐ Ô Ö Ð ÙÐ Ö Ð k¹ × ÑÓ ÒÙÑ ÖÓ ÓÒ ϕk (k) = √ Ö ÓÒ Ó Ð ÒØ ÖÓ Ñ × ÔÖÓÜ ÑÓ ´ º¾ µ 5 ÐÓ Ù Ð ÒÓ× Ô ÖÑ Ø ÓÑÔÐ Ø Ö Ð ÑÓ×ØÖ ÓÒ Ð ÔÖÓÔÓ× ÓÒ º º ÓÖ Ö ØÓÑ ÑÓ× Ð × Ù Ð ´ º½¾µ n ≥ |Th| = (h + 2) − 1 =⇒ ´ º¾ µ > √ ϕ h+2 Ö ÓÒ Ó Ð ÒØ ÖÓ Ñ × Ö ÒÓ − 1 =⇒ ´ º¾ µ 5 n > √ ϕ h+2 −2 ´ º¿¼µ 5 ÆÓØ ÑÓ× ÕÙ Ð Ù ÓÒ ´ º¾ µ ר Ð ÕÙ Ð ÙÒ ÓÒ Ö ÓÒ Ó Ð ÒØ ÖÓ Ñ × Ö ÒÓ ÔÐ Ö× º È Ö ×Ô Ö h Ð Ò Ù ÓÒ ´ º¾ µ¸ × Ö Ò × Ö Ó ÓÒÓ Ö Ð ÒÚ Ö× Ð ÙÒ ÓÒ Ö ÓÒ Óº ÈÓÖ × Ö ÞÓÒ¸ Ö ×Ø ÑÓ× ÙÒ ÙÒ ÐÐ Ó Ö Ó Ð Ò Ù ÓÒ ´ º¾ µ ݸ Ô ÖØ Ö ÐÐ ¸ ÜÔÖ × ÑÓ× ÙÒ × Ù Ð ×ØÖ Ø √ ϕh+2 < 5 (n + 2) =⇒ √ h+2 < ÐÓ ϕ [ 5 (n + 2)] =⇒ √ h < ÐÓ ϕ (n + 2) + ÐÓ ϕ ( 5) − 2 =⇒ Ð (n + 2) − 0.3277 =⇒ h < Ð ϕ h < 1.4404 Ð (n + 1) − 0.3277 6.5 ´ Arboles rojo-negro ÓÖ ×ØÙ Ö ÑÓ× ÙÒ Ð × Ö ÓÐ Ò Ö Ó ÙÝÓ ×ÕÙ Ñ Ð Ò Ø Ñ Ò × Ö Ò¹ Ø Þ Óº Ð ×ÕÙ Ñ × ÖÓÑ Ø Ó Ò Ð × ÒØ Ó ÕÙ ÐÓ× ÒÓ Ó× ×ÓÒ ÓÐÓÖ Ó× ÖÓ Ó Ó Ò ÖÓ¸ Ö ×Ô Ø Ú Ñ ÒØ º Ä × Ö Ð × ÓÐÓÖ ÓÒ ÔÖÓÔÓÖ ÓÒ Ò Ö ÙÑ ÒØÓ× ÓÑ Ò ØÓÖ Ó׸ Ò ÙÒ ÓÒ Ð × ÔÓ× Ð × ÓÑ Ò ÓÒ × ÓÐÓÖ ×¸ ÕÙ Ö ÒØ Þ Ò ÙÒ ÕÙ Ð Ö Óº ´ Definici´n 6.7 (Arbol rojo-negro) o ÍÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ¸ Ó ÊÆ¸ × ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ ¸ ÓÒ ÙÒ ØÖ ÙØÓ ÓÒ Ð Ò ÙÒÓ ×Ù× ÒÓ Ó× ÒÓÑ Ò Ó ÓÐÓÖ ¸ ÕÙ × Ø × Ð × × Ù ÒØ × ÓÒ ÓÒ × ÒÓÑ Ò × ÖÓÑ Ø × ¯ Condici´n crom´tica primaria ÙÒ ÒÓ Ó × ÖÓ Ó Ó Ò ÖÓº o a ¯ Condici´n roja × ÙÒ ÒÓ Ó × ÖÓ Ó¸ ÒØÓÒ × ×Ù× Ó× o Ó× Ò × Ö Ò ÖÓ׺ ×ØÓ Ö ÒØ Þ ÕÙ Ó× ÒÓ Ó× ÖÓ Ó× ÒÙÒ ÔÙ Ò ×Ø Ö ÓÒØ ÙÓ× Ò Ð Ñ ÒÓ Ù×ÕÙ º ¯ Condici´n negra Ù ÐÕÙ Ö Ñ ÒÓ o × Ð Ö Þ ×Ø ÙÒ ÒÓ Ó ÜØ ÖÒÓ ÓÒØ Ò Ð Ñ ×ÑÓ ÒÙÑ ÖÓ ÒÓ Ó× Ò ÖÓ׺
  • 540.
    514 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u ¯ Nodo externo negroÐÓ× ÒÓ Ó× ÜØ ÖÒÓ× ×ÓÒ Ò ÖÓ׺ ר ¬Ò ÓÒ Ý ÐÓ× Ð ÓÖ ØÑÓ× Ö ×ÙÐØ ÒØ × ×Ø Ò Ù ÖØ Ñ ÒØ Ò×Ô Ö Ó× Ð Ü Ð× ÔÖ × ÒØ ÓÒ ÐÓ× Ö ÓÐ × ÖÓ Ó¹Ò ÖÓ Ö ÏÓÓ ½ º ËÙ ¬Ò ÓÒ ¬ Ö Ð Ö ¹ Ñ ÒØ ÓØÖÓ× ×ØÙ Ó×Ó× ÕÙ Ü Ò ÕÙ Ð Ö Þ × ÑÔÖ × Ò Ö º Ä ¬ ÙÖ º½ ÐÙ×ØÖ ÙÒ ÑÔÐÓ ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ò Ð Ù Ð ÐÓ× ÒÓ Ó× ÖÓ Ó× ×Ø Ò ×ÓÑ Ö Ó׺ 48 34 74 6 41 53 90 4 11 38 46 49 69 86 96 2 5 7 32 35 39 42 64 73 78 87 93 98 28 62 ÙÖ º½ ÍÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ä ÓÒ ÓÒ Ò Ö Ùר ¬ ÙÒ ÒÙ ÚÓ ÓÒ ÔØÓ Ð ÐØÙÖ Ò Ö ¸ Ð Ù Ð × ¬Ò ÓÑÓ × Ù Definici´n 6.8 (Altura negra en un nodo rojo-negro) Ë T ÙÒ Ö o ÓÐ ÖÓ Ó¹Ò ÖÓ Ý ni ∈ T ÙÒ ÒÓ Ó Ù ÐÕÙ Ö Tº Ë ¬Ò Ð ÐØÙÖ Ò Ö ni¸ ÒÓØ ÓÑÓ (ni)¸ ÓÑÓ Ð ÒÙÑ ÖÓ ÒÓ Ó× Ò ÖÓ× × ni ר Ù ÐÕÙ Ö ÒÓ Ó ÜØ ÖÒÓ Tº ÆÓØ ÑÓ× ÕÙ Ð ÐØÙÖ Ò Ö ×Ø ¬Ò Ô Ö Ù ÐÕÙ Ö Ñ ÒÓ × Ö Þ(T )º ×ØÓ × ÙÒ ÓÒ× Ù Ò Ö Ø Ð ÓÒ ÓÒ Ò Ö ÕÙ ÒÓ× Ö ÒØ Þ ÕÙ ×Ø ÐØÙÖ × Ð Ñ ×Ñ Ò Ô Ò ÒØ Ñ ÒØ Ð Ó ÕÙ × ÓÒ× Ö º Ð ÔÖ Ñ Ö Ô ×Ó Ð × ÒÓ ÙÒ Ø ÔÓ ×ØÖ ØÓ ØÓ × ×Ô ¬ Ö ÙÒ ÒÓ Ó ÖÓ Ó¹Ò ÖÓ ½ Ö ÆÓ ºÀ ½ ≡ typedef unsigned char Color; # define COLOR(p) ((p)->getColor()) # define RED (0) # define BLACK (1) class RbNode_Data { Color color; // RED o BLACK RbNode_Data() : color(RED) { /* empty */ } RbNode_Data(SentinelCtor) : color(BLACK) { /* empty */ }
  • 541.
    ´ 6.5. Arboles rojo-negro 515 Color& getColor() { return color; } }; DECLARE_BINNODE_SENTINEL(RbNode, 128, RbNode_Data); ¬Ò × RbNode¸ Ù× Ò ÙÒ ½ º Í× × DECLARE BINNODE SENTINEL ¾ º Ä Ð × RbNode ר × Ò Ô Ö ÙÑÔÐ Ö Ð × ÓÒ ÓÒ × × º Ð ÓÒרÖÙ ØÓÖ ÔÓÖ ÓÑ × ÓÒ × ÑÔÖ Ö ÙÒ ÒÓ Ó ÖÓ Óº ÍÒ ÒÙ ÚÓ ÒÓ Ó ÖÓ Ó ÒÓ ÐØ Ö Ð ÐØÙÖ Ò Ö ¸ ÔÓÖ ÓÒ× Ù ÒØ ¸ × ÔÖ × ÖÚ Ð ÓÒ ÓÒ Ò Ö º ØÓ× × Ø × Ö Ð ÙÐØ Ñ ÓÒ ÓÒ Ý Ð Ø Ö ÐÓ× Ð ÓÖ ØÑÓ׸ ÐÓ× Ö ÓÐ × ÖÓ Ó¹Ò ÖÓ Ù× Ò ÙÒ ÒÓ Ó ÒÙÐÓ ÒØ Ò Ð ÕÙ × Ò ÖÓº ÁÒØÙ Ø Ú Ñ ÒØ ÔÓ ÑÓ× ÔÖ Ö Ð ÕÙ Ð Ö Ó ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ ØÓ Ó ÒÓ Ó ×Ø Ô Ö Ø Ñ ÒØ Ò ÖÓ ¹ ÕÙ Ð Ö Ó × Ö¸ Ô Ö ØÓ Ó ÒÓ Ó¸ Ð ÖÒ ÐØÙÖ × Ò Ö × ÒØÖ ×Ù× Ó× Ö Ñ × × ÒÙÐ º Ó¸ Ð Ö ÓÐ ÖÓ Ó¹Ò ÖÓ ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ º½ ר ÔØ Ð Ñ ÒØ ÕÙ Ð Ö Óº ÙÖ º½ ÍÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ 512 ÒÓ Ó× 6.5.1 El TAD Rb Tree<Key> Ä Ì Gen Rb Tree<Key> ¬Ò ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ ÙÝ × ÓÔ Ö ÓÒ × ÔÖ Ò Ô Ð × ×ÓÒ Ò ÙÒ ÓÒ ÒÓ Ó× ÖÓ Ó¹Ò ÖÓ ¬Ò Ó× ÒØ Ö ÓÖÑ ÒØ º Ä ×ØÖÙ ØÙÖ ÔÖ Ò Ô Ð × ÓÑÓ × Ù ½ ØÔÐ Ö ØÖ ºÀ ½ ≡ template <template <typename> class NodeType, typename Key, class Compare> class Gen_Rb_Tree { typedef NodeType<Key> Node; Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Rb Tree<Key> ½ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Rb Tree<Key> ½ }; template <typename Key, class Compare = Aleph::less<Key> > struct Rb_Tree : public Gen_Rb_Tree<RbNode, Key, Compare> { /* Empty */ }; template <typename Key, class Compare = Aleph::less<Key> > struct Rb_Tree_Vtl : public Gen_Rb_Tree<RbNodeVtl, Key, Compare> { /* Empty */ }; Í× × RbNode ½ º ÄÓ× ÙÒ Ñ ÒØÓ× ÑÔÐ ÒØ ÓÒ ×ÓÒ ÑÙÝ × Ñ Ð Ö × ÐÓ× Ñ × Ö ÓÐ × Ò Ö Ó× ×¹ ØÙ Ó× ÙÒ ÒÓ Ó Ö ¸ ÙÒÓ ÒØ Ò Ð Ý ÐÙ ÓÒ Ù×Ó Ó ÒÓ Ð Ö ÙÖ× Ú º
  • 542.
    516 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u ÄÓ× Ð ÓÖ ØÑÓ× ×ÓÒ Ñ × × Ò ÐÐÓ× ÕÙ ÐÓ× ÙÒ Ö ÓÐ Îĸ Ô ÖÓ ÒÓ ÐÓ ×Ù¬ ÒØ ÓÑÓ Ô Ö Ô ÖÑ Ø Ö ÙÒ ÑÔÐ ÒØ ÓÒ Ò ØÙÖ ÐÑ ÒØ Ö ÙÖ× Ú º ÍÒ Ð× × ÓÒ × ÕÙ ØÓÑ ÑÓ× ÔÖ ÓÖ × Ö Ð Þ Ö ÙÒ ÑÔÐ ÒØ ÓÒ Ø Ö Ø Ú × ×Ø ÙÒ Ô Ð ¸ Ð Ù Ð Ùר ¬ ÐÓ× × Ù ÒØ × ØÖ ÙØÓ× ½ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Rb Tree<Key> ½ ≡ ´½µ ½ Node head_node; // nodo cabecera centinela Node * head; // puntero a cabecera centinela Node *& root; FixedStack<Node*, Node::MaxHeight> rb_stack; Í× × FixedStack ½¼ º Ä Ò× Ö ÓÒ Ý Ð Ñ Ò ÓÒ Ö ÕÙ Ö Ò ÑÔ Ð Ö Ð Ñ ÒÓ Ù×ÕÙ º ר ÓÒ × Ö Ð Þ ÔÓÖ ÙÒ ÖÙØ Ò ×Ô ¬ ½ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Rb Tree<Key> ½ +≡ ´½µ ½ ½ Node * search_and_stack_rb(const Key & key) { Node * p = root; rb_stack.push(head); do { rb_stack.push(p); if (Compare () (key, KEY(p))) p = LLINK(p); else if (Compare () (KEY(p), key)) p = RLINK(p); else return p; } while (p != Node::NullPtr); return rb_stack.top(); } ¬Ò × search and stack rb¸ Ù× Ò ÙÒ × ½ Ò ¾¼º 6.5.1.1 Inserci´n en un arbol rojo-negro o ´ Ò ÔÖ Ò Ô Ó¸ Ð Ò× Ö ÓÒ × Ü Ø Ñ ÒØ Ù Ð Ð Ò× Ö ÓÒ Ò ÙÒ Ö ÓÐ Ò Ö Ó ×Ø Ò Öº ÄÙ Ó¸ × × Ò × Ö Ó¸ × ØÙ Ò ÐÓ× Ùר × Ô Ö ÔÖ × ÖÚ Ö Ð Ð Ò ½ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Rb Tree<Key> ½ ≡ ´ ½ µ ¾¼ Node * insert(Node * p) { if (root == Node::NullPtr) return root = p; // inserci´n en arbol vac´o o ´ ı Node * q = search_and_stack_rb(KEY(p)); if (Compare () (KEY(p), KEY(q))) LLINK(q) = p; else if (Compare () (KEY(q), KEY(p))) RLINK(q) = p; else { rb_stack.empty();
  • 543.
    ´ 6.5. Arboles rojo-negro 517 return NULL; // clave duplicada } fix_red_condition(p); return p; } Í× × fix red condition ½ Ò search and stack rb ½ º Ä ÖÙØ Ò ÑÔÐ ÒØ Ð Ò× Ö ÓÒ × Ð × º fix red condition() Ú Ö ¬ Ú ÓÐ ÓÒ × Ð × ÓÒ ÓÒ × ÖÓÑ Ø × Ý Ð × ÓÖÖ × × Ð ×Óº Ò Ð ×Ó Ð Ò× Ö ÓÒ¸ Ð ØÖÙ Ó × Ò× ÖØ Ö ÙÒ ÒÓ Ó ÖÓ Ó¸ ÔÙ × ×Ø ÒÓ ÐØ Ö Ð ÓÒ ÓÒ Ò Ö ¸ Ö Ó¸ Ð Ð Ò ÐØÙÖ × Ò Ö ×º ÑÔ ÖÓ¸ Ð Ò× Ö ÓÒ ÙÒ ÒÓ Ó ÖÓ Ó ÔÙ Ù× Ö ÙÒ Ú ÓÐ ÓÒ Ð ÓÒ ÓÒ ÖÓ × Ð Ô Ö Ð ÒÓ Ó Ò× ÖØ Ó × ÖÓ Óº Ë Ð Ô Ö Ð ÒÓ Ó Ò× ÖØ Ó × Ò ÖÓ¸ ÒØÓÒ × Ð Ö ÓÐ Ö ×ÙÐØ ÒØ × ÖÓ Ó¹Ò ÖÓ Ý Ð Ð ÓÖ ØÑÓ Ø ÖÑ Ò º ÐÓ ÓÒØÖ Ö Ó¸ × Ò × Ö Ó Ö ×Ø Ð Ö Ð ÓÒ ÓÒ ÖÓ × Ò ÐØ Ö Ö Ð ÓÒ ÓÒ Ò Öº Ä ×ØÖÙ ØÙÖ fix red condition() × ÓÑÓ × Ù ½ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Rb Tree<Key> ½ +≡ ´½µ ½ ¾¾ void fix_red_condition(Node * p) { while (p != root) { Node * pp = rb_stack.pop(); // padre de p if (COLOR(pp) == BLACK) // ¿padre de p negro? break; // s´ ==> no hay nodos rojos consecutivos ==> terminar ı if (root == pp) // ¿p es hijo directo de la ra´z? ı { // s´ ==> colorear ra´z de negro y terminar ı ı COLOR(root) = BLACK; break; } Node * ppp = rb_stack.pop(); // abuelo de p Node * spp = LLINK(ppp) == pp ? RLINK(ppp) : LLINK(ppp); // t´o de p ı if (COLOR(spp) == RED) // ¿t´o de p rojo? ı { // intercambiar colores entre los niveles COLOR(ppp) = RED; COLOR(pp) = BLACK; COLOR(spp) = BLACK; p = ppp; continue; // avanzar al pr´ximo ancestro y verificar violaciones o } Node * pppp = rb_stack.pop(); // bisabuelo de p if (LLINK(pp) == p and LLINK(ppp) == pp) { rotate_to_right(ppp, pppp); COLOR(pp) = BLACK; } else if (RLINK(pp) == p and RLINK(ppp) == pp) { rotate_to_left(ppp, pppp); COLOR(pp) = BLACK; } else
  • 544.
    518 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u { if (RLINK(pp) == p) { rotate_to_left(pp, ppp); rotate_to_right(ppp, pppp); } else { rotate_to_right(pp, ppp); rotate_to_left(ppp, pppp); } COLOR(p) = BLACK; } COLOR(ppp) = RED; break; // ´rbol es rojo-negro ==> terminar a } rb_stack.empty(); } ¬Ò × fix red condition¸ Ù× Ò ÙÒ ½ º Ð Ð ÓÖ ØÑÓ ØÓÑ ÓÑÓ ÒØÖ ÙÒ ÒÓ Ó p¸ ÕÙ × Ð ÒÓ Ó Ò× ÖØ Öº Ä × Ð × ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ ÓÒ Ð ÒÓ Ó p Ò× ÖØ Óº Ð Ò Ó Ð while¸ p × ÙÒ ÒÓ Ó ÖÓ Ó Ö Ò Ò× ÖØ Óº Ð ÙÒ × ÓÖÖ ÓÒ × ÔÙ Ò Ù× Ö ÓØÖ × Ú ÓÐ ÓÒ × ×Ó Ö Ð × Ò Ò pº Ù Ò Ó ×ØÓ Ó ÙÖÖ ¸ p × ØÙ Ð Þ ÕÙ ÔÙÒØ ×Ó Ö ÙÒ ÒÓ Ó ÖÓ Ó ÕÙ Ú ÓÐ Ð ÓÒ ÓÒ ÖÓ º Ë ÐÔ Ö p × Ò ÖÓ¸ ÒØÓÒ × Ð ÒÙ ÚÓ ÒÓ Ó ÒÓ Ù× Ò Ò ÙÒ Ú ÓÐ ÓÒ Ý Ð Ð ÓÖ ØÑÓ Ø ÖÑ Ò º ר × Ð ÔÖ Ñ Ö Ú Ö ¬ ÓÒ Ð whileº Ë ¸ ÔÓÖ Ð ÓÒØÖ Ö Ó¸ pp × ÖÓ Ó¸ ÒØÓÒ × Ø Ò ÑÓ× Ó× ÒÓ Ó× ÖÓ Ó× ÓÒ× ÙØ ÚÓ× ÕÙ Ú ÓÐ Ò Ð ÓÒ ÓÒ ÖÓ º Ä ÓÖÖ ÓÒ × Ö Ð Þ × ÙÒ ÐÓ× × Ù ÒØ × ×Ó× ½º p × Ó Ö ØÓ Ð Ö Þ ×Ø × ØÙ ÓÒ × Ú Ö ¬ Ò Ð × ÙÒ Ó if Ý × Ö ×Ù ÐÚ ÓÐÓÖ Ò Ó Ð Ö Þ Ò ÖÓ root root pp p p =⇒ Ð Ö ÓÐ Ö ×ÙÐØ ÒØ × ÖÓ Ó¹Ò ÖÓ Ý Ð Ð ÓÖ ØÑÓ Ø ÖÑ Ò º ¾º Ì Ó p × ÖÓ Ó ×Ø Ö ÙÒר Ò ¸ Ø Ø ÔÓÖ Ð Ø Ö Ö if¸ × ×ÓÖØ ÓÒ ÙÒ ÒØ Ö Ñ Ó ÓÐÓÖ × ÒØÖ ÐÓ× Ò Ú Ð ×º × Ö¸ Ð Ù ÐÓ p Ú Ò ÖÓ Ó Ý ×Ù× Ó× Ó× Ú Ò Ò Ò ÖÓ׺ ÄÓ× Ó× ×Ó× ÔÓ× Ð × × ÑÙ ×ØÖ Ò Ò Ð ¬ ÙÖ º½ º ÄÙ Ó ×Ø Ùר Ð Ô Ö ppp × ÔÓ Ö × Ö ÖÓ Ó¸ ÐÓ ÕÙ ÖÖ Ö ÙÒ Ú ÓÐ ÓÒ Ð ÓÒ ÓÒ ÖÓ º ÈÓÖ × Ö ÞÓÒ¸ ÙØ ÑÓ× p = ppp Ý Ú ÒÞ ÑÓ× ÙÒ ÒÙ Ú Ø Ö ÓÒº ¿º Ì Ó p × Ò ÖÓ Ò ×Ø ×Ó Ö Ð Þ ÑÓ× ÖÓØ ÓÒ × ÕÙ ØÖ Ò× ÓÖÑ Ò Ð ÔÖÓ Ð Ñ Ò ÙÒÓ ÐÓ× ÒØ Ö ÓÖ ×º
  • 545.
    ´ 6.5. Arboles rojo-negro 519 ppp ppp pp spp pp spp p p χ δ χ δ α β α β ppp =⇒ ppp pp spp pp spp p p α δ α δ β χ β χ =⇒ ÙÖ º½ ÁÒØ Ö Ñ Ó ÓÐÓÖ × ÒØÖ ÐÓ× Ò Ú Ð × À Ý Ó× ÔÓ× Ð × × ØÙ ÓÒ × Ò Ö Ð × ´ µ ר × ØÙ ÓÒ × ÑÙ ×ØÖ Ò Ð ¬ ÙÖ º½ Ý × Ø Ø ÔÓÖÕÙ p¸ pp Ý ppp ר Ò ÓÑÔÐ Ø Ñ ÒØ Ð Ò Ó× × Ð ÞÕÙ Ö Ó Ð Ö º ËÙ Ø ÓÒ Ý ÔÖÓ × Ñ ÒØÓ Ó ÙÔ ÐÓ× Ù ÖØÓ Ý ÕÙ ÒØÓ ifº Ä ÓÖÖ ÓÒ ÓÒ× ×Ø Ò ØÙ Ö ÙÒ ÖÓØ ÓÒ × ÑÔÐ pp ÐÐ Ó spp ×ØÓ ÕÙ pp Ú Ò Ð Ö Þ Ð ×Ù Ö Óк ÈÓÖ ÙÐØ ÑÓ¸ × ÒØ Ö Ñ Ò ÐÓ× ÓÐÓÖ × pp Ý pppº ppp pp pp spp p ppp p spp χ δ α β χ α β δ =⇒ ÙÖ º½ ÊÓØ ÓÒ Ý ÓÐÓÖ ÓÒ Ô Ö Ö ×Ø ÙÖ Ö ÓÒ ÓÒ ÖÓ ´ µ × × ØÙ ÓÒ × ÐÙ×ØÖ Ò Ð ¬ ÙÖ º½ ¸ × ÔÖ × ÒØ Ù Ò Ó p¸ pp Ý ppp ÒÓ ×Ø Ò ÓÑÔÐ Ø Ñ ÒØ Ð Ò Ó׺ Ä ×ÓÐÙ ÓÒ ÓÒ× ×Ø Ò ÙÒ Ó Ð ÖÓØ ÓÒ ÖÙÞ p Ð Ð Ó sppº Ò ×Ø ×Ó¸ p Ú Ò Ð Ö Þ Ð ×Ù Ö ÓÐ Ý ÐÓ× ÓÐÓÖ × p Ý ppp ×ÓÒ ÒØ Ö Ñ Ó׺
  • 546.
    520 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u ppp p pp spp pp ppp p spp α δ α β χ β χ δ =⇒ ÙÖ º½ Ó Ð ÖÓØ ÓÒ p Ý ÓÐÓÖ ÓÒ Ô Ö Ö ×Ø ÙÖ Ö ÓÒ ÓÒ ÖÓ Ò Ð × Ó× × ØÙ ÓÒ × ÒØ Ö ÓÖ ×¸ Ð Ö ÓÐ Ö ×ÙÐØ ÒØ × ÖÓ Ó¹Ò ÖÓ Ý Ð Ð ÓÖ ØÑÓ Ø ÖÑ Ò º Ð ÙÒ × Ø Ö ÓÒ × ÔÙ Ò Ó ÙÖÖ Ö Ù Ò Ó × Ò Ð × ÙÒ Ó ×Ó¸ ÔÙ Ò Ó × Ö Ò × Ö Ó ×Ù Ö ×Ø Ð Ö Þº Ù Ò Ó ×ØÓ Ó ÙÖÖ ¸ Ð Ú ÒØÙ Ð Ú ÓÐ ÓÒ Ð ÓÒ ÓÒ ÖÓ ×Ñ ÒÙÝ Ó× Ò Ú Ð ×º ר ÑÓ Ó¸ Ð ÒÙÑ ÖÓ Ñ Ü ÑÓ Ø Ö ÓÒ × ×Ø ÓØ Ó ÔÓÖ Ð ÐØÙÖ Ð Ö ÓÐ Ú ÒØÖ Ó× ´h/2µº 6.5.1.2 Eliminaci´n en un arbol rojo-negro o ´ Ò ÔÖ Ò Ô Ó¸ Ð Ð Ñ Ò ÓÒ × × Ñ Ð Ö Ð ÙÒ Ö ÓÐ Ò Ö Ó ×Ø Ò Öº ÄÙ Ó¸ × × Ò × Ö Ó¸ × Ö Ð Þ Ò ÐÓ× Ùר × ÕÙ Ö ×Ø ÙÖ Ò Ð × ÓÒ ÓÒ × ÖÓÑ Ø ×º ¾¼ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Rb Tree<Key> ½ +≡ ´½µ ½ Node* remove(const Key & key) { if (root == Node::NullPtr) return NULL; Node * q = search_and_stack_rb(key); if (no_equals<Key, Compare> (KEY(q), key)) // ¿clave no encontrada? { rb_stack.empty(); return NULL; } Node * pq = rb_stack.top(1); // padre de 1 Node * p; // hijo de q luego de que este ha sido eliminado ´ repeat: // Eliminaci´n tradicional en ´rbol binario de b´squeda o a u if (LLINK(q) == Node::NullPtr) { if (LLINK(pq) == q) p = LLINK(pq) = RLINK(q); else p = RLINK(pq) = RLINK(q); goto end; } if (RLINK(q) == Node::NullPtr) { if (LLINK(pq) == q)
  • 547.
    ´ 6.5. Arboles rojo-negro 521 p = LLINK(pq) = LLINK(q); else p = RLINK(pq) = LLINK(q); goto end; } find_succ_and_swap(q, pq); goto repeat; end: if (COLOR(q) == BLACK) // ¿se elimin´ un nodo negro? o fix_black_condition(p); q->reset(); rb_stack.empty(); return q; } Í× × find succ and swap¸ fix black condition ¾¾¸ Ò search and stack rb ½ º Ä ÖÙØ Ò Ù× Ð Ð Ú Ð Ú Þ ÕÙ ÑÔ Ð Ð Ñ ÒÓ Ù×ÕÙ º Ð ÒÓ Ó Ð Ñ Ò Ö × ÐÐ Ñ Ó q Ý ×Ù Ô Ö pqº Ð while ÑÔÐ ÒØ Ð Ð Ñ Ò ÓÒ × Ð ÒÓ Ó¸ Р٠и ר × ÐØÙÖ × Ð ×ØÙ Ó¸ × Ö ÓÑÔÖ × Ð Ô Ö Ð Ð ØÓÖº ×ÔÙ × Ð Ð Ñ Ò ÓÒ × ¸ Ü ×Ø Ð Ö × Ó Ú ÓÐ ÓÒ Ð ÓÒ ÓÒ Ò Ö ¸ ÔÙ × Ð ÒÓ Ó Ð Ñ Ò Ó ÔÙ × Ö × Ó Ò ÖÓ¸ ÐÓ ÕÙ ÔÖÓÚÓ ÙÒ Ô Ö Ò ÐØÙÖ Ò Ö º Ò Ð ÒØ ¸ ÐÐ Ñ Ö ÑÓ× p Ð ÒÓ Ó Ð Ù Ð ÔÙ Ø Ò Ö ÙÒ ¬ Ø Ò ÒÓ Ó× Ò ÖÓ׺ find succ and swap() ÒØ Ö Ñ q ÓÒ ×Ù ×Ù ×ÓÖ Ò¬ Óº Ä ÖÙØ Ò × ×ØÖÙ ØÙÖ Ð¹ Ñ ÒØ ÒØ Ð Ú Ö× ÓÒ Ô Ö Ö ÓÐ × ÎÄ ´Ü º º½º¾ ´Ô Ò ¼¾µµº find succ and swap() × Ö Ñ Ð Ö Ð Ð ØÓÖº Ð ÙÒ Ó ÔÙÒØÓ Ö ÓÖ Ö × ÕÙ × × Ð Ñ Ò ÙÒ ÒÓ Ó ÓÑÔÐ ØÓ¸ ÒØÓÒ × Ð ×Ù ×ÓÖ ¹Ó ÔÖ ×ÓÖ¹ ÕÙ × ×Ùר ØÙÝ Ö Ö Ð Ñ ×ÑÓ ÓÐÓÖ Ð ÒÓ Ó Ð Ñ Ò Óº ר Ñ Ò Ö ¸ Ð Ú ÓÐ ÓÒ Ú ÒØÙ Ð Ó ÙÖÖ ×Ó Ö ÙÒ ÒÓ Ó ÕÙ ÓÒ ÖØ Þ × Ò ÓÑÔÐ ØÓº pp p sp ¹ α β snp np ÙÖ º¾¼ ÓÒ Ñ Ð Ö × ÓÒ ÒØ × ÒÓ Ó ÖÓ Ó Ä Ð Ñ Ò ÓÒ ×Ø Ò Ö Ò ÙÒ × ÑÔÖ × Ö Ñ Ø Ð Ð Ñ Ò ÓÒ ÙÒ ÒÓ Ó ÙÝÓ Ô Ö × Ò ÓÑÔÐ ØÓº Ä × ØÙ Ö ÙÒ ÓÖØÓ¹ Ö Ù ØÓ ¹Ü º º ´Ô Ò ¿ ¾µ¹ Ð Ó q Ð Ù Ð ÒÓÑ Ò ÑÓ× pº Ë q × ÖÓ Ó¸ ÒØÓÒ × Ð Ö ÓÐ Ö ×ÙÐØ ÒØ × ÖÓ Ó¹Ò ÖÓº Ð ÔÖÓ Ð Ñ ×ÙÖ Ù Ò Ó q × Ò ÖÓ¸ ÔÙ × × Ú ÓÐ Ð ÓÒ ÓÒ Ò Ö º Ò ×Ø ×Ó¸ Ö ÑÓ× ÕÙ Ü ×Ø ÙÒ ¬ Ø ÙÒ ÒÓ Ó Ò ÖÓ Ò Ð Ñ ÒÓ × Ð Ô Ö Ð ÒÓ Ó Ð Ñ Ò Ó ×Ø pº Ñ Ò Ö Ò Ö Ð¸ Ð ×ØÖ Ø Ö ×Ø ÙÖ ÓÒ Ð ÓÒ ÓÒ Ò Ö × Ò ÓÒØÖ Ö ÙÒ ÒÓ Ó ÖÓ Ó Ò Ð × ÒÑ ÓÒ × p Ø Ð ÓÑÓ × Ò Ò Ð ¬ ÙÖ º¾¼º Ë × Ò Ù ÒØÖ Ø Ð ÒÓ Ó¸ ÒØÓÒ × ×Ø ÔÙ Ô × Ö× Ð Ð Ó Ð ¬ Ø Ý ÓÐÓÖ ÖÐÓ Ò ÖÓ Ô Ö × ÓÑÔ Ò× Ö Ð ¬ غ Ð ØÖ Ó × Ö Ð Þ Ó ÔÓÖ Ð ÖÙØ Ò fix black condition()¸ Ð Ù Ð
  • 548.
    522 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u ØÓÑ ÓÑÓ ÒØÖ ÙÒ ÒÓ Ó p ÓÒ ÙÒ ¬ Ø Ò ÙÒ ÒÓ Ó Ò ÖÓ ÕÙ × Ö Ö ×Ø ÙÖ Óº Ä × Ð × ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓº Ä ×ØÖÙ ØÙÖ Ð ÖÙØ Ò × Ð × Ù ÒØ ¾¾ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Rb Tree<Key> ½ +≡ ´½µ ½ void fix_black_condition(Node * p) { if (COLOR(p) == RED) // ¿p es rojo? { // s´ ==> lo pintamos de negro y terminamos ı COLOR(p) = BLACK; // esto compensa el d´ficit e return; } Node * pp = rb_stack.popn(2); // padre de p while (p != root) { Node * sp = LLINK(pp) == p ? RLINK(pp) : LLINK(pp); // hermano de p if (COLOR(sp) == RED) // ¿hermano de p es rojo? ÖÓØ Ö ×Ô Ð Ð Ó Ô ÒØ Ö Ñ Ö ×Ù× ÓÐÓÖ × ¾¿ Ð ÙÐ Ö ÐÓ× ×Ó Ö ÒÓ× Ô ´ Ó× ×Ôµ ¾¿ if (COLOR(np) == RED) // ¿np es rojo? { ÖÓØ Ö ×Ô Ô¸ Ö ÖÐ ÓÐÓÖ ÔÔ Ý Ô ÒØ Ö Ò ÖÓ ÒÔ Ý ÔÔ ¾ return; } if (COLOR(snp) == RED) // ¿snp es rojo? { ÖÓØ Ö Ó Ð ×ÒÔ Ý Ô ÒØ Ö Ò ÖÓ ÔÔ ¾ ; return; } if (COLOR(pp) == RED) // ¿pp es rojo? { ÒØ Ö Ñ Ö ÓÐÓÖ × Ô Ý ÔÔ ¾ ; return; } // no hay nodo rojo en las adyacencias de p ==> desplazar el // d´ficit hacia pp y repetir la iteraci´n e o COLOR(sp) = RED; p = pp; pp = rb_stack.pop(); } } ¬Ò × fix black condition¸ Ù× Ò ÙÒ ¾¼º Ä ÖÙØ Ò ÓÑ ÒÞ ÔÓÖ Ú ÐÙ Ö × Ð ÒÓ Ó ¬ Ø Ö Ó × ÖÓ Ó Ò × ×Ó ×Ø ÓÒ Ô ÒØ Ö p Ò ÖÓ Ý Ð Ö ÓÐ Ò Ö Ð × ÖÓ Ó¹Ò ÖÓ × ØÙ ÓÒ Ý ÓÖÖ ÓÒ ÐÙ×ØÖ × Ò Ð ¬ ÙÖ º¾½º Ò Ð ×Ó ÓÒØÖ Ö Ó¸ Ð Ð ÓÖ ØÑÓ ÒØÖ Ò ÙÒ ÐÓ ÕÙ Ù× ÙÒ ÒÓ Ó ÖÓ Ó Ò Ð ÞÓÒ ÒÑ Ö Ò Ð ¬ ÙÖ º¾¼ Ô Ö ÒØ ÒØ Ö ×Ùר ØÙ Ö Ð ÒÓ Ó Ò ÖÓ Ý × ÓÑÔ Ò× Ö Ð ¬ غ Ä Ø Ö ÓÒ Ü Ñ Ò ÐÓ× ÒÓ Ó× Ð ÞÓÒ Ò Ð ÓÖ Ò sp¸ np¸ snp Ý pp¸ × ÙÒ ÐÓ× × Ù ÒØ × ×Ó×
  • 549.
    ´ 6.5. Arbolesrojo-negro 523 pq RN q pq ←− Nodo a eliminar RN p p =⇒ ÙÖ º¾½ Ð Ñ Ò ÓÒ ÙÒ ÒÓ Ó Ò ÖÓ ÓÒ Ó ÖÓ Ó ½º sp ÖÓ Ó Ð × ØÙ ÓÒ Ý ×Ù ÓÖÖ ÓÒ × ÑÙ ×ØÖ Ò Ò Ð ¬ ÙÖ º¾¾º sp pp pp δ p - sp p - χ α β χ δ α β =⇒ ÙÖ º¾¾ ×Ó Ù Ò Ó sp × ÖÓ Ó ¾¿ ÖÓØ Ö ×Ô ÐÐ Ó Ô ÒØ Ö Ñ Ö ×Ù× ÓÐÓÖ × ¾¿ ≡ ´ ¾¾µ { Node *& ppp = rb_stack.top(); // abuelo de p if (LLINK(pp) == p) { sp = LLINK(sp); ppp = rotate_to_left(pp, ppp); } else { sp = RLINK(sp); ppp = rotate_to_right(pp, ppp); } COLOR(ppp) = BLACK; COLOR(pp) = RED; } ר ÓÒ ÙÑ ÒØ Ð ÒÓ Ó ¬ Ø Ö Ó Ò ÙÒ Ò Ú Ð¸ Ô ÖÓ ÕÙ Ð ÒÙ ÚÓ ÖÑ ÒÓ p × Ò ÖÓ Ý ÕÙ ÒØÖ Ò Ð ÞÓÒ Ñ Ð Ö × ÓÒ ÒØ × × Ö Ø Ò Ð ¬ ÙÖ º¾¼º Ë sp × Ò ÖÓ¸ ÒØÓÒ × Ý ÕÙ Ö Ú × Ö ×Ù× ×Ó Ö ÒÓ׸ Ô ÖÓ ÒØ ׸ × Ò × Ø Ð Ù¹ Ð ÖÐÓ× Ð × Ù ÒØ Ñ Ò Ö ¾¿ Ð ÙÐ Ö ÐÓ× ×Ó Ö ÒÓ× Ô ´ Ó× ×Ôµ ¾¿ ≡ ´ ¾¾µ Node * np, * snp; // sobrinos de nodo p if (LLINK(pp) == p) // ¿p es hijo izquierdo? { // s´ ==> que sp es hijo derechos ı np = RLINK(sp);
  • 550.
    524 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u snp = LLINK(sp); } else { np = LLINK(sp); snp = RLINK(sp); } ¾º ÖÓ Ó Ð × ØÙ ÓÒ × ÐÙ×ØÖ Ò Ð ¬ ÙÖ º¾¿ Ý × ÒØ ¬ ÔÓÖÕÙ np ר Ð Ò Ó np Ð Ö ÓÒ spº Ä ×ÓÐÙ ÓÒ ÓÒ× ×Ø Ò ÖÓØ Ö sp Ð Ð Ó p Ý ÓÐÓÖ Ö Ò ÖÓ np Ý ppº ÓÒ ×ØÓ Ò ÑÓ× Ð ÒÓ Ó Ò ÖÓ pp Ò Ð Ñ ÒÓ p¸ ÐÓ ÕÙ ÓÑÔ Ò× Ð ¬ غ ¾ ÖÓØ Ö ×Ô Ô¸ Ö ÖÐ ÓÐÓÖ ÔÔ Ý Ô ÒØ Ö Ò ÖÓ ÒÔ Ý ÔÔ ¾ ≡ ´ ¾¾µ Node * ppp = rb_stack.top(); if (RLINK(sp) == np) rotate_to_left(pp, ppp); else rotate_to_right(pp, ppp); COLOR(sp) = COLOR(pp); COLOR(pp) = BLACK; COLOR(np) = BLACK; pp sp RN RN p pp sp np - p np α β χ χ δ δ α β =⇒ ÙÖ º¾¿ ×Ó Ù Ò Ó np × ÖÓ Ó ¿º snp ÖÓ Ó Ð × ØÙ ÓÒ × ÐÙ×ØÖ Ò Ð ¬ ÙÖ º¾ × ÑÙÝ × Ñ Ð Ö Ð ÒØ Ö ÓÖ Ü ÔØÓ ÕÙ ÒÓ Ý Ð Ò ÓÒ ÓÑÔÐ Ø Ð Ö º Ä ×ÓÐÙ ÓÒ Ø Ñ Ò × × Ñ Ð Ö ÖÓØ Ö snp Ó× Ú × Ð Ð Ó p Ý ÐÙ Ó ÓÐÓÖ Ö Ò ÖÓ pp Ý spº Ð Ù Ð ÕÙ Ð ×Ó ÒØ Ö ÓÖ¸ Ð ÒÒ Ð ÒÓ Ó Ò ÖÓ pp Ò Ð Ñ ÒÓ p ÓÑÔ Ò× Ð ¬ غ ¾ ÖÓØ Ö Ó Ð ×ÒÔ Ý Ô ÒØ Ö Ò ÖÓ ÔÔ ¾ ≡ ´ ¾¾µ Node * ppp = rb_stack.top(); if (LLINK(sp) == snp) { rotate_to_right(sp, pp); rotate_to_left(pp, ppp); } else { rotate_to_left(sp, pp);
  • 551.
    ´ 6.5. Arboles rojo-negro 525 rotate_to_right(pp, ppp); } COLOR(snp) = COLOR(pp); COLOR(pp) = BLACK; pp snp RN RN p sp pp sp - snp np p np α β χ δ χ δ φ α β φ =⇒ ÙÖ º¾ ×Ó Ù Ò Ó snp × ÖÓ Ó º pp ÖÓ Ó Ð × ØÙ ÓÒ × ÑÙ ×ØÖ Ò Ð ¬ ÙÖ º¾ Ý × Ö ×Ù ÐÚ ÒØ Ö Ñ Ò Ó ÐÓ× ÓÐÓÖ × pp ÓÒ spº ×ÔÙ × ×Ø Ùר ¸ Ð Ñ ÒÓ p Ò ÙÒ ÒÓ Ó Ò ÖÓ ØÖ Ú × ×Ù Ô Ö ¸ Ñ ÒØÖ × ÕÙ Ð Ñ ÒÓ sp Ô ÖÑ Ò ÓÒ Ð Ñ ×Ñ ÒØ ÒÓ Ó× Ò ÖÓ׺ ר Ùר ×ÓÐÓ ÔÙ Ö Ð Þ Ö× × × Ò Ú ÐÙ Ó ÐÓ× ×Ó× ÒØ Ö ÓÖ ×¸ ÔÙ × × ÔÓ Ö Ú ÓÐ Ö Ð ÓÒ ÓÒ ÖÓ × Ð ÙÒÓ ÐÓ× ×Ó Ö ÒÓ× p Ù × ÖÓ Óº ¾ ÒØ Ö Ñ Ö ÓÐÓÖ × Ô Ý ÔÔ ¾ ≡ ´ ¾¾µ COLOR(pp) = BLACK; COLOR(sp) = RED; pp pp p sp p sp - snp np snp np =⇒ ÙÖ º¾ ×Ó Ù Ò Ó Ð Ô Ö p × ÖÓ Ó º Æ Ò ÙÒÓ ÐÓ× Ñ Ð Ö × × ÖÓ Ó × ÐÓ× ×Ó× ÒØ Ö ÓÖ × ÐÐ Ò¸ ÒØÓÒ × ÒÓ Ý ÒÓ Ó× ÖÓ Ó× Ò Ð ÞÓÒ ÒÑ Ö Ò Ð ¬ ÙÖ º¾¼º ÒØ ר × ØÙ ÓÒ¸ Ð ÙÒ × Ð × ×ÔÐ Þ Ö Ð ¬ Ø ÐÔ Ö p Ý ÐÙ Ó Ö Ô Ø Ö Ð ÔÖÓ Ñ ÒØÓ ÒØ Ö ÓÖ ÓÒ p = ppº Ð ×ÔÐ Þ Ñ ÒØÓ¸ ÐÙ×ØÖ Ó Ò Ð ¬ ÙÖ º¾ ¸ ÓÒ× ×Ø × ÑÔÐ Ñ ÒØ Ò ÓÐÓÖ Ö sp ÖÓ Óº ÓÒ ×ØÓ Ð Ñ Ò ÑÓ× ÙÒ ÒÓ Ó Ò ÖÓ Ô ÖØ Ö sp Ý ØÖ ×Ð ÑÓ× Ð ¬ Ø ppº Ð Ð ÓÖ ØÑÓ Ø Ö × ÒÓ × Ò Ù ÒØÖ Ò ÒÓ Ó× ÖÓ Ó× Ò Ð ÞÓÒ ÒÑ Ö ÒÐ ¬ ÙÖ º¾¼º Ä ÒØ Ñ ÜÑ Ø Ö ÓÒ × Ô Ò × Ý Ó ÒÓ ÒÓ Ó× ÖÓ Ó× Ò Ð × ÒÑ ÓÒ × Ð Ñ ÒÓ Ù×ÕÙ Ð Ð Ú Ð Ñ Ò º Ò Ð Ô ÓÖ ÐÓ× ×Ó׸ ÔÙ × Ö Ò × Ö Ó ×Ù Ö ×Ø Ð Ö Þº Ò ×Ø × ØÙ ÓÒ¸ Ð ¬ Ø Ó ÙÖÖ Ô Ö ØÓ Ó× ÐÓ× Ñ ÒÓ× × Ð Ö Þ ×Ø Ù ÐÕÙ Ö ÒÓ Ó ÒÙÐÓ¸ ÔÓÖ ÐÓ ÕÙ ÒÓ Ý Ú ÓÐ ÓÒ Ð ÓÒ ÓÒ Ò Ö º
  • 552.
    526 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u pp pp - p sp p sp - snp np snp np =⇒ ÙÖ º¾ ×ÔÐ Þ Ñ ÒØÓ Ð ¬ Ø ÔÔ Ð Ñ ÒÓ Ñ × Ð Ö Ó × Ù Ò Ó Ð Ð Ñ Ò ÓÒ Ó ÙÖÖ Ò ÙÒ Ð× Ó ×Ñ× ÔÖÓ ÙÒ × Ò ÐØÙÖ Ò Ö º ×ØÓ ÑÔÐ ÕÙ Ð Ð Ó ÓÔÙ ×ØÓ p Ð Ö ÓÐ ×Ø Ö Ô Ö Ø Ñ ÒØ Ð Ò Ó¸ ÔÙ × × ÒÓ Ð ÞÓÒ ÒÓ × Ö ÓÑÔÐ Ø Ñ ÒØ Ò Ö º Ð Ð Ñ º ÒÓ× ÑÓ×ØÖ Ö ÕÙ Ð ÐØÙÖ Ð ÞÓÒ ÓÑÔÐ Ø Ñ ÒØ Ò Ö × h/2 Ô Ö Ð Ô ÓÖ Ö Óк Ä ÔÖÓÔÓ× ÓÒ º ÒÓ× ÑÓ×ØÖ Ö ÕÙ Ð ÐØÙÖ Ñ Ü Ñ × 2 Ð (n + 2) − 2º × Ô٠׸ Ð Ð Ñ Ò ÓÒ × O(Ð n) Ô Ö Ð Ô ÓÖ ×Óº 6.5.2 An´lisis de los ´rboles rojo-negro a a ÓÑ Ò ÑÓ× ÔÓÖ Ö ÓÖ Ö ÕÙ Ð ÓÒ ÓÒ Ò Ö Ö ÒØ Þ ¸ ÔÓÖ × Ñ ×Ñ ¸ ÙÒ Ð Ò Ò Ú Ð ÒÓ Ó× Ò ÖÓ׺ Ë ×ÓÐÓ × Ù ÒØ Ò ÐÓ× ÒÓ Ó× Ò ÖÓ׸ ÒØÓÒ ×¸ Ô Ö ÒÓ Ó¸ Ð ÖÒ ÐØÙÖ × ÒØÖ Ð × Ó× Ö Ñ × × ÖÓº Ó Ð ÐØÙÖ Ò Ö ¸ Ð Ö ÓÐ ×Ø Ô Ö Ø Ñ ÒØ ÕÙ Ð Ö Óº Ð Ò Ð × × × Ò Ó ¸ ÒØÓÒ ×¸ Ò ×ØÙ Ö Ð ÑÔ ØÓ ÐÓ× ÒÓ Ó× ÖÓ Ó× ×Ó Ö Ð ÐØÙÖ ÐÓ Ð Ð Ö Óк ÈÓÖ Ð ÓÒ ÓÒ ÖÓ ¸ Ð ÐØÙÖ ÜÔÖ × Ö× Ò ÙÒ ÓÒ ÒÓ Ó× Ò ÖÓ׸ ÔÙ × ÒÓ ÔÙ Ò Ö Ó× ÒÓ Ó× ÖÓ Ó× ÓÒ× ÙØ ÚÓ׺ Ð ÒÙÑ ÖÓ Ñ Ü ÑÓ ÒÓ Ó× ÖÓ Ó× ÒÚÓÐÙ¹ Ö Ó× ÒÓ ÔÙ Ü Ö¸ Ô٠׸ Ð ÒÙÑ ÖÓ ÒÓ Ó× Ò ÖÓ× Ñ × ÙÒÓº Ñ Ò Ö ÒØÙ Ø Ú ÔÓ ÑÓ× Ö ÕÙ Ò Ð Ô ÓÖ ×Ó Ð ÐØÙÖ Ñ Ü Ñ ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ ×Ø Ø ÖÑ ¹ Ò ÔÓÖ Ð ÐÓÒ ØÙ Ñ Ü Ñ Ò ÒÓ Ó× Ò ÖÓ× ÑÙÐØ ÔÐ ÔÓÖ Ó׺ × Ö¸ ×ÙÑ ÑÓ× ÕÙ Ð Ñ ÒÓ Ð Ö Ñ Ñ × Ð Ö ×Ø Ö ÔÐ ØÓ ÒÓ Ó× ÖÓ Ó× ÒØ Ö Ð Ó× ÒØÖ ÒÓ Ó× Ò ÖÓ׺ ÓÒ ×Ø × Ó × ÖÚ ÓÒ × Ò Ñ ÒØ ¸ ר ÑÓ× Ð ×ØÓ× Ô Ö ÒÙÒ Ö Ð ÔÖÓÔÓ× ÓÒ × Ù ÒØ º Proposici´n 6.9 ´ o Ù ×ÝË Û ¹½ µË T ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ ÓÒ n ÒÓ Ó× Ý ÐØÙÖ hº ÒØÓÒ × h ≤ 2 Ð (n + 2) − 2 ´ º¿½µ Demostraci´n o Ð Ò ÓÕÙ × × Ñ Ð Ö Ð ÙØ Ð Þ Ó Ò ÐÓ× Ö ÓÐ × ÎÄ ´ÔÖÓÔÓ× ÓÒ º µº × Ö¸ Ú ÑÓ× Ø ÖÑ Ò Ö Ù Ð × Ð Ö ÓÐ ÖÓ Ó¹Ò ÖÓ ÐØÙÖ h ÓÒ Ð Ñ Ü ÑÓ ÒÙÑ ÖÓ ÒÓ Ó׺ È Ö ÐÐÓ¸ ÑÓ× ÒØ ¬ Ö ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ö Ø Óº ´ Definici´n 6.9 (Arbol rojo-negro cr´ o ıtico) Ë T ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ ÐØÙÖ h(T )º Ë ÕÙ T × Ö Ø Ó × Ý ×ÓÐÓ × Ð ÕÙ Ø ÖÐ ÙÒ Ó Ð Ö ÓÐ × Ö ÖÓ Ó¹Ò ÖÓ Ó Ô Ö ÐØÙÖ º Ð Ù Ð ÕÙ ÓÒ ÐÓ× Ö ÓÐ × Îĸ Ð Ö Ò Ð ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ö Ø Ó × Ñ Ò Ñ Ð ÐØÙÖ h(T ) × Ö¸ × T × Ö Ø Ó¸ ÒÓ × ÔÓ× Ð Ø Ò Ö ÙÒ Ö ÓÐ Ð Ñ ×Ñ ÐØÙÖ ÓÒ Ñ ÒÓÖ ÒØ ÒÓ Ó׺
  • 553.
    ´ 6.5. Arboles rojo-negro 527 ÓÖ ÔÖÓ ÑÓ× ×ØÙ Ö Ù ÒØÓ× ÒÓ Ó× Ø Ò ÙÒ Ö ÓÐ Ö Ø Ó Ò ÙÒ ÓÒ ×Ù ÐØÙÖ º ÈÖ Ñ ÖÓ ÓÑ Ò ÑÓ× ÔÓÖ Ó × ÖÚ Ö Ð × Ö Ò × ÐØÙÖ Ò ÐÓ× ÒÓ Ó× ÙÒ Ö ÓÐ Ö Ø Óº Lema 6.4 Ë T ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ö Ø Ó ÐØÙÖ h(T ) > 1 ÓÒ Ö Ñ × Ä(T ) Ý Ê(T ) Ö ×Ô Ø Ú Ñ ÒØ º ÒØÓÒ × h(Ä(T )) = h(Ê(T ))º Demostraci´n (por reducci´n al absurdo) ËÙÔÓÒ ÑÓ× ÕÙ Ü ×Ø ÙÒ Ö ÓÐ ÖÓ Ó¹ o o Ò ÖÓ Ö Ø Ó ÓÒ h(Ä(T )) = h(Ê(T ))º ÈÙ ×ØÓ ÕÙ h(T ) > 1¸ ÔÓ ÑÓ× Ö ÑÔÐ Þ Ö Ù ÐÕÙ Ö Ð × Ö Ñ × ÔÓÖ ÓØÖÓ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ñ × Ô ÕÙ ÒÓ Ò ÐØÙÖ Ý Ö Ò Ð ¸ ÐÓ ÕÙ ÖÖÓ Ö ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ö ÒÐ Ò Ö ÓÖº ×ØÓ Ù× ÙÒ ÓÒØÖ ÓÒ¸ ÔÙ × ÑÓ× Ó ÕÙ T × Ö Ø Óº Ð Ð Ñ × ÔÙ × ÖØÓ ÓÖ Ú ÑÓ× Ù ÒØÓ× ×Ù Ö ÓÐ × Ö Ø Ó× Ü ×Ø Ò ÒØÖÓ ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ö Ø Óº Lema 6.5 Ë T ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ö Ø Ó ÐØÙÖ h(T ) > 1º ÒØÓÒ ×¸ h(Ê(T )) = h(T ) − 1 =⇒ Ê(T ) × Ö Ø Ó Ý ÔÓÖ ÐÓ Ø ÒØÓ Ñ Ò ÑÓº Ä × ØÙ ÓÒ × Ñ ØÖ ¸ × Ö¸ × h(Ä(T )) = h(T ) − 1¸ × ÕÙ Ú Ð ÒØ º Demostraci´n (por reducci´n al absurdo) ËÙÔÓÒ ÑÓ× ÕÙ T × Ö Ø Ó Ý ÕÙ Ê(T )) o o ÒÓ × Ö Ø Óº ÒØÓÒ ×¸ Ê(T ) ÔÓ Ö × Ö Ö ÑÔÐ Þ Ó ÔÓÖ ÙÒ ×Ù Ö ÓÐ T , h(T ) = h(T ) − 1 Ø Ð ÕÙ |T | < | Ê(T )|º ×ØÓ ÑÔÐ Ö ÕÙ T Ø Ò Ñ ÒÓ× ÒÓ Ó× Ð Ñ ×Ñ ÐØÙÖ ¸ ÐÓ Ù Ð × ÙÒ ÓÒØÖ ÓÒ ÓÒ Ð ×ÙÔÓ× ÓÒ ÕÙ T × Ö Ø Ó ÓÒ ×Ø Ð Ñ ¸ ÔÓ ÑÓ× ×ØÙ Ö Ð ÓÑÔÓ× ÓÒ ÖÓÑ Ø ÙÒÓ ÐÓ× ×Ù Ö ÓÐ × ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ö Ø Óº Lema 6.6 Ë T ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ö Ø Ó ÐØÙÖ h(T ) > 1º ÒØÓÒ ×¸ h(Ê(T )) = h(T ) − 1 =⇒ ½º Ä(T ) ÒÓ Ø Ò ÒÓ Ó× ÖÓ Ó׺ ¾º Ä(T ) × ÙÒ Ö ÓÐ Ô Ö Ø Ñ ÒØ ÕÙ Ð Ö Ó Ý ÓÑÔÐ ØÓº Demostraci´n o ½º Ë Ä(T ) Ø Ò ÙÒ ÒÓ Ó ÖÓ Ó¸ ÒØÓÒ × ×Ø ÒÓ Ó ÔÙ × Ö ×ÙÔÖ Ñ Ó Ý ×Ùר ØÙ Ó ÔÓÖ Ð Ö ÓÐ Ú Óº Ð Ö ÓÐ Ö ×ÙÐØ ÒØ × ÖÓ Ó¹Ò ÖÓ Ô ÖÓ Ø Ò Ñ ÒÓ× ÒÓ Ó׸ ÐÓ ÕÙ Ú ÓÐ Ð ×ÙÔÓ× ÓÒ ÕÙ T × Ö Ø Óº ¾º ÈÙ ×ØÓ ÕÙ Ä(T ) ×ÓÐÓ ÓÒØ Ò ÒÓ Ó× Ò ÖÓ׸ Ð ÙÒ ÓÖÑ ÔÖ × ÖÚ Ö Ð ÓÒ ÓÒ Ò Ö × ÕÙ Ä(T ) × Ô Ö Ø Ñ ÒØ ÕÙ Ð Ö Ó Ý ÓÑÔÐ ØÓ ר Ð Ñ ÑÙ ×ØÖ ÕÙ Ð ÓÖÑ ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ö Ø Ó × Ð Ð ¬ ÙÖ º¾ º × Ö¸ Ð Ö Ñ Ñ ÒÓÖ ÐØÙÖ × ÒØ Ö Ñ ÒØ Ò Ö Ý Ô Ö Ø Ñ ÒØ Ð Ò º ÆÓØ ÕÙ Ð Ð Ñ º Ø Ñ Ò Ò ÕÙ Ð ÓÖÑ Ð ×Ù Ö ÓÐ Ö Ó Ð ¬ ÙÖ º¾ ׸ Ò Ø ÖÑ ÒÓ× Ö ÙÖ× ÚÓ׸ × Ñ Ð Ö Ð ¬ ÙÖ º¾ º ר Ó × ÖÚ ÓÒ × ÑÙÝ ÑÔÓÖØ ÒØ ÔÓÖÕÙ ÒÓ× Ô ÖÑ Ø Ö Ð ÙÐ Ö ÙÒ ÓØ Ð ÒØ ÒÓ Ó× ÒÓ Ó× ÕÙ Ø Ò ÙÒ Ö ÓÐ Ö Ø Ó Ò ÙÒ ÓÒ ×Ù ÐØÙÖ º Ë T × ÖÓ Ó¹Ò ÖÓ¸ ÒØÓÒ × (Ä(T )) = (Ê(T ))º Ë ¸ Ñ ×¸ T × Ö Ø Ó¸ ÒØÓÒ × (Ê(T )) = h(Ä(T ))¸ Ô٠׸ ÔÓÖ Ð Ð Ñ º ¸ Ä(T ) ×ÓÐÓ Ø Ò ÒÓ Ó× Ò ÖÓ׺ ÈÓÖ Ð Ð Ñ º ¸ × ÑÓ× ÕÙ h(Ê(T )) = h(T ) − 1º Ð Ñ ×ÑÓ ÑÓ Ó¸ Ø Ñ Ò ÔÓÖ Ð Ð Ñ º ¸ × Ê(T ) × Ö Ø Ó¸ ÒØÓÒ × ×Ø Ø Ò Ö Ð ÓÖÑ ÑÓ×ØÖ ÔÓÖ Ð Ð Ñ º º
  • 554.
    528 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u h/2 h−1 ÙÖ º¾ ÓÖÑ ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ö Ø Ó Lema 6.7 Ë T ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ö Ø Ó ÐØÙÖ h(T ) = hº ÒØÓÒ ×¸ (T ) = h 2 ´ º¿¾µ Demostraci´n (por inducci´n sobre la altura h) o o ¯ h=0 Ò ×Ø ×Ó 0/2 = 0 Ý Ð ÔÓØ × × × ×Ú Ð º ¯ h>0 ÓÖ ×ÙÔÓÒ ÑÓ× ÕÙ Ð Ð Ñ × Ú Ð Ó Ô Ö ØÓ Ó Ö ÓÐ Th ÖÓ Ó¹Ò ÖÓ Ö Ø Ó ÐØÙÖ h Ý Ú Ö ¬ ÑÓ× × ÙÒ ÐÓ × Ô Ö Ð Ö ÓÐ Th+1 ÐØÙÖ h+1º Ä ÑÓ×ØÖ ÓÒ ÔÒ Ö Ð Ó ÕÙ h × Ô Ö Ó ÑÔ Ö ½º Ë h × ÑÔ Ö =⇒ h + 1 × Ô Öº Ò ×Ø ×Ó¸ × ÓÐÓÖ ÑÓ× Ò ÖÓ Ð Ö Þ Th+1 Ø Ò ÑÓ× (Th+1) = (Th) + 1 =⇒ h h−1 = +1= + 1 =⇒ 2 2 h+1 h+1 = 2 = 2 ´ º¿¿µ Ð Ð Ñ × Ú Ð Ó Ô Ö h ÑÔ Öº ¾º Ë h × Ô Ö =⇒ h + 1 × ÑÔ Öº Ò ×Ø ×Ó¸ × ÓÐÓÖ ÑÓ× ÖÓ Ó Ð Ö Þ Th+1 Ø Ò ÑÓ× (Th+1) = (Th) =⇒ h+1 = h 2 = 2 ´ º¿ µ Ð Ð Ñ × Ú Ð Ó Ô Ö h¸ Ô Ö Ó ÑÔ Ö Ä ÑÓ×ØÖ ÓÒ Ð Ð Ñ º ÔÖ Ò× Ð Ð Ó ÕÙ Ð ÓÐÓÖ Ð Ö Þ ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ ÔÙ × Ö Ò ÖÓ ×ÓÐ Ñ ÒØ × Ð ÐØÙÖ Ð Ö ÓÐ × Ô Öº Ð Ð Ñ º Ô ÖÑ Ø ÓÑÔÐ Ø Ö Ð ÔÖÙ Ð Ø ÓÖ Ñ ÔÓÖÕÙ ÓÖ ÔÓ ÑÓ× Ð ÙÐ Ö ÙÒ ÜÔÖ × ÓÒ ÕÙ Ò ÕÙ Ð ÒØ ØÓØ Ð ÒÓ Ó× ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ö Ø Óº Ë Th × ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ö Ø Ó ÐØÙÖ h¸ ÒØÓÒ × |Th| = 1 + | Ä(Th)| + | Ê(Th)| ´ º¿ µ
  • 555.
    ´ 6.5. Arboles rojo-negro 529 ÈÓÖ ÐÓ× Ð Ñ × º Ý º ¸ × ÑÓ× ÕÙ Ä(Th) ×ÓÐÓ Ø Ò ÒÓ Ó× Ò ÖÓ׸ ÔÓÖ Ò | Ä(Th)| = 2 (h−1)/2 −1 ´ º¿ µ ÈÓÖ ÓØÖ Ô ÖØ ¸ ÔÓÖ Ð Ð Ñ º ¸ × ÑÓ× ÕÙ Ê(Th) × Ö Ø Ó Ý ÕÙ ×Ù ÐØÙÖ × h − 1º ËÙר ØÙ ÑÓ× ´ º¿ µ Ò ´ º¿ µ Ý Ó Ø Ò ÑÓ× ÙÒ Ù ÓÒ Ö ÙÖÖ ÒØ ÐÑ ÒØ Ö ×ÓÐÙ Ð |Th| = |Th−1| + 2 (h−1)/2 ´ º¿ µ Р٠и Ð ÜÔ Ò Ö |Th−1| |Th| = |Th−2| + 2 (h−2)/2 +2 (h−1)/2 ´ º¿ µ ¯ Ë h × Ô Ö =⇒ |Th| = |Th−2| + 2(h−2)/2 + 2(h−2)/2 = |Th−2| + 2h/2 =⇒ h/2 |Th| = 2i = 2h/2+1 − 2 ´ º¿ µ i=1 ¯ Ë h × ÑÔ Ö =⇒ |Th| = |Th−2| + 2(h−3)/2 + 2(h−1)/2 =⇒ |Th| = |Th−2| + 2−1 . 2(h−1)/2 + 2(h−1)/2| =⇒ |Th| = |Th−2| + 3 . 2(h−3)/2 =⇒ (h−3)/2 |Th| = |Th−2| + 3 . 2i = 1 + 3 . 2(h−3)/2 − 3 = 3 . 2(h−3)/2 − 2 ´ º ¼µ i=0 È Ö ÓÑÔÐ Ø Ö Ð ÑÓ×ØÖ ÓÒ¸ × n Ð ÒÙÑ ÖÓ ÒÓ Ó× ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ ÐØÙÖ hº n × Ö Ñ ÝÓÖ Ó Ù Ð Ð ÒÙÑ ÖÓ ÒÓ Ó× Ð Ö ÓÐ ÖÓ Ó¹Ò ÖÓ Ö Ø Ó ÐØÙÖ hº ÌÓÑ Ò Ó Ð Ñ ÒÓÖ Ø ÖÑ ÒÓ Ö Ó Ð × Ù ÓÒ × ´ º¿ µ Ý ´ º ¼µ ÔÐ ÒØ ÑÓ× n ≥ 2h/2+1 − 2 =⇒ n + 2 ≥ 2h/2+1 =⇒ Ð (n + 2) ≥ h 2 + 1 =⇒ h ≤ 2 Ð (n + 2) − 2 Ä Ñ Ü Ñ ÐØÙÖ ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ × ÔÖÓÜ Ñ Ñ ÒØ ÙÒ ¾ ± Ñ × Ö Ò ÕÙ Ð Ñ Ü Ñ ÐØÙÖ ÙÒ Ö ÓÐ ÎÄ ´2 Ð (n + 2) Ú Ö×Ù× 1.4404 Ð (n + 2)µº × Ô٠׸ Ò Ð Ø Ñ ÒØ ¸ Ð × ÑÔ ÒÓ Ð Ù×ÕÙ Ö × Ö ×ÙÔ Ö ÓÖ Ò ÐÓ× Ö ÓÐ × ÎÄ ÕÙ Ò ÐÓ× Ö ÓÐ × ÖÓ Ó¹Ò ÖÓº ÑÔ ÖÓ¸ ר Ö Ò ÒÓ × × Ò ¬ Ø Ú º Ð × ÑÔ ÒÓ Ñ Ó× Ö ÓÐ × × ÑÙÝ × Ñ Ð Öº
  • 556.
    530 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u 6.6 ´ Arboles splay ÄÓ× Ö ÓÐ × Ð ØÓÖ Þ Ó× Ý ÐÓ× ØÖ Ô× × Ò ×Ù× ÕÙ Ð Ö Ó× ×Ó Ö Ð ØÓÑ × ÓÒ × Ð ØÓÖ ×º Ò ÔÖÓÑ Ó¸ Ð ÐØÙÖ ×ØÓ× Ö ÓÐ × Ú Ò ÐÓ Ö ØÑ ÓÒ ÔÖÓ Ð × ÑÙÝ × Þ × Ø Ò Ö ÙÒ Ñ Ð ×Óº ÄÓ× Ö ÓÐ × ÎÄ Ý ÖÓ Ó¹Ò ÖÓ × Ò ×Ù× ÕÙ Ð Ö Ó× Ò Ö Ð × ×Ô Ð × ÕÙ × Ñ ÒØ Ò Ò Ò Ø ÑÔÓ× ÐÓ Ö ØÑ Ó׺ Ò ×Ø Ð × Ö ÓÐ × Ð ÐØÙÖ Ñ Ü Ñ Ý¸ ÔÓÖ Ò ¸ Ð Ø ÑÔÓ ×Ó¸ ר Ò ÐÓ Ö ØÑ Ñ ÒØ ÓØ Ó׺ Ü ×Ø ÙÒ Ø Ö Ö ÐØ ÖÒ Ø Ú ÕÙ Ð Ö Ó × Ò ØÙ Ö ÑÓ ¬ ÓÒ × ×ØÖÙ ØÙÖ Ð × ×Ó Ö Ð Ö ÓÐ ÕÙ Ø Ò Ò ÚÓÐÚ ÖÐÓ ÕÙ Ð Ö Óº Ì Ð ÐØ ÖÒ Ø Ú × Ð Ó ØÓ ×ØÙ Ó× ×Ø × ÓÒ ÐÓ× Ö ÓÐ × ×ÔРݺ ÓÒ× Ö ÑÓ× Ð × ØÖ × ÓÔ Ö ÓÒ × Ð × × ×Ó Ö ÙÒ Ø Ð × Ñ ÓÐÓ× Ý ÙÒ ÖÖ ÐÓ ÕÙ ÐÑ Ò ÐÓ× Ð Ñ ÒØÓ× ×ÓÖ Ò Ñ ÒØ º ÓÑÓ Ú ÑÓ× Ò Ü ¾º½º½ ´Ô Ò ¿½µ¸ Ò ÙÒ ÖÖ ÐÓ Ð × ØÖ × ÓÔ Ö ÓÒ × ×ÓÒ O(n)º ÓÖ ÓÒ× Ö ÑÓ× ÙÒ ÑÓ ¬ ÓÒ ×Ó Ö Ð ÑÔÐ ÒØ ÓÒ ØÖ ÓÒ Ð Ú Þ ÕÙ × Ö Ð Þ ÙÒ ×Ó¸ × ÔÓÖ Ù×ÕÙ ¸ Ò× Ö ÓÒ Ó Ð Ñ Ò ÓÒ¸ Ð Ð Ñ ÒØÓ × ÓÐÓ Ó Ò Ð ÔÖ Ñ Ö ÔÓ× ÓÒº Ó ×Ø Ö Ð ¸ Ð Ò× Ö ÓÒ Ý Ð Ñ Ò ÓÒ Ú Ò Ò O(1) Ô Ö ØÓ Ó× ÐÓ× ×Ó× Ý Ð Ù×ÕÙ O(n) Ô Ö Ð Ô ÓÖ ×Óº Ë Ð ÔÐ ÓÒ Ü ÐÓ Ð Ö Ö Ò ¸ ÒØÓÒ × Ð Ù×ÕÙ Ø Ò × Ö O(1)¸ ÔÙ × ÐÓ Ð Ñ ÒØÓ× Ö ÒØ Ñ ÒØ Ó× × Ò Ù ÒØÖ Ò Ò Ð × ÔÖ Ñ Ö × ÔÓ× ÓÒ × Ð ÖÖ ÐÓº ÉÙ Ø Ò Ù Ò × ×Ø Ø Ò ÄÓ× Ò Ð × × ÓÖÑ Ð × Ý ÑÔ Ö Ó× ÑÙ ×ØÖ Ò ÕÙ × ÑÙÝ Ù Ò Ò ÑÙ Ó× ×Ó׺ Ù Ò Ó ÒÓ Ý ÐÓ Ð Ö Ö Ò ¸ Ð Ù×ÕÙ × O(n) Ô Ö ÐÓ× ×Ó× ÔÖÓÑ Ó Ý Ô ÓÖ¸ ÙÒ × ÑÔ ÒÓ ÔØ Ð ×Ø × Ð × Ñ Ò ×º Ë ÔÙ ÔÐ Ö Ð Ø Ò ÒØ Ö ÓÖ Ô Ö ÐÓ× Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ Ä Ö ×¹ ÔÙ ×Ø × ¬ÖÑ Ø Ú Ý Ð ÔÖ Ñ Ö Ø ÒØ ÓÒ × ÑÓÚ Ö Ð ÒÓ Ó Ö ÒØ Ñ ÒØ Ó ×Ø Ð Ö Þº Ä Ò× Ö ÓÒ ÓÒ× ×Ø Ö Ò Ò× ÖØ Ö Ò Ð Ö Þ × ÙÒ ÐÓ× Ð ÓÖ ØÑÓ× ×ØÙ¹ Ó× Ò Ü º º ´Ô Ò ¿ ¿µº Ð Ñ ×ÑÓ ÑÓ Ó¸ ÔÓ Ö ÑÓ× × Ò Ö ÙÒ ÖÙØ Ò × Ñ Ð Ö Ð select() ×ØÙ Ó Ò Ü º½½º½ ´Ô Ò ¿ µ ÕÙ Ù×ÕÙ ÙÒ Ð Ú Ý Ñ ÒØ ÖÓØ ¹ ÓÒ × ×Ù × Ú × ×Ù Ð ÒÓ Ó Ò ÓÒØÖ Ó ×Ø Ð Ö Þº Ð Ù Ð ÕÙ ÓÒ ÐÓ× ÖÖ ÐÓ׸ ר Ø Ò ÔÖÓ Ó Ø Ò Ö ÙÒ × ÑÔ ÒÓ Ù ÒÓ Ô Ö ÔÐ ÓÒ × ÕÙ Ü Ò ÐÓ Ð Ö Ö Ò º Ä Ñ ÒØ Ð Ñ ÒØ ¸ ÔÙ ×ØÓ ÕÙ Ð Ø Ò ÒÓ Ö Ð Þ Ò Ò ÙÒ Ùר ÕÙ Ð Ö Ó ×Ó Ö Ð Ö Óи ר ÔÖÓ Ð Ñ ÒØ ÒÓ × Ö ÑÙÝ ÕÙ Ð Ö Óº È ÓÖ ÙÒ¸ × ÐÓ× ×Ó× ×ÓÒ × × Ó× ÙÒ ÜØÖ ÑÓ Ð ÓÖ Ò Ð × Ð Ú ×¸ Ð Ö ÓÐ ÔÙ Ú Ò Ö × Ú Ö Ñ ÒØ × ÕÙ Ð Ö Óº ËÐ ØÓÖ Ý Ì Ö Ò ½ × Ù Ö ÖÓÒ ÙÒ Ø Ò Ùר ÕÙ Ö ÒØ Þ ÕÙ Ð Ó×ØÓ ÔÖÓÑ Ó n ÓÔ Ö ÓÒ × × O(Ð n)º ËÙ Ø Ò × ÒÓÑ Ò ×ÔÐ Ý Ò Ý ÐÓ× Ö ÓÐ × Ö ×ÙÐØ ÒØ × ×ÓÒ ÒÓÑ Ò Ó× Ö ÓÐ × ×ÔÐ Ý º × Ñ ÒØ ¸ Ð ×ÔÐ Ý Ò ÓÒ× ×Ø Ò ÐÐ Ú Ö ÙÒ ÒÓ Ó Ó ×Ø Ð Ö Þ Ñ ÒØ ÓÔ Ö ÓÒ × ×Ô Ð × ÕÙ ÚÓÖ Ö Ò ÙØÙÖÓ× ×Ó׺ Ä ÔÖ Ñ Ö Ð × ÓÔ Ö ÓÒ × × ÒÓÑ Ò Þ ¹Þ Ý × ÐÙ×ØÖ Ò Ð ¬ ÙÖ º¾ º Î ×Ø ÞÕÙ Ö Ö ¸ Ð ÓÔ Ö ÓÒ × ÒÓÑ Ò zig zig right¸ Ñ ÒØÖ × ÕÙ Ò Ð × ÒØ Ó ÓÒØÖ Ö Ó × ÒÓÑ Ò zig zig leftº Ä ÓÔ Ö ÓÒ ×Ù Ð ÒÓ Ó A ØÖ × Ò Ú Ð × Ý × ¬Ò ÓÑÓ × Ù ¿¼ ÓÔ Ö ÓÒ × Þ ¿¼ ≡ ´ ¿¾ µ ¿½ Ò ×Ø ÐÐ ÒÓ ÒÓ Ü ×Ø ÙÒ Ø ÖÑ ÒÓ ÕÙ Ù Ñ ÒØ Ö ­ Ð Ô Ð Ö ×ÔÐ Ý º Ò ÓÒØÖ ÑÓ× Ò ÔÐ Ó Ý Ò ×ÔÐ Ó Ð × ÔÖÓÜ Ñ ÓÒ × Ñ × Ö ÔÖ × ÒØ Ø Ú ×¸ Ô ÖÓ¸ ÒÙ ×ØÖÓ Ù Ó¸ Ö ÓÐ × ×ÔÐ Ó× Ó Ö ÓÐ × ÔÐ Ó× ÒÓ ÜÔÖ × Ò ÐÓ× Ñ ×ÑÓ× × Ò ¬ Ó× ÕÙ ×ÔÐ Ý ØÖ × º ÈÓÖ × Ö ÞÓÒ¸ ÔÖ Ö ÑÓ× ÙØ Ð Þ Ö Ð Ø ÖÑ ÒÓ ÓÖ Ò Ðº
  • 557.
    ´ 6.6. Arboles splay 531 p C A B δ B A p α χ C β α β χ δ =⇒ ÙÖ º¾ ÇÔ Ö ÓÒ Þ ¹Þ static Node * zig_zig_right(Node* p) { Node * q = LLINK(p); Node * r = LLINK(q); LLINK(p) = RLINK(q); LLINK(q) = RLINK(r); RLINK(q) = p; RLINK(r) = q; return r; } Ä ÓÔ Ö ÓÒ × Ñ ØÖ × ÕÙ Ú Ð ÒØ Ó × ÖÚ Ö Ð ¬ ÙÖ º¾ Ö ÞÕÙ Ö Ý × ÒÓÑ Ò zig zig left()¸ Ð Ù Ð × ÒרÖÙÑ ÒØ × Ñ ØÖ Ñ ÒØ × Ñ Ð Öº C p B A p A C δ B α α β χ δ β χ =⇒ ÙÖ º¾ ÇÔ Ö ÓÒ Þ ¹Þ Ä × ÙÒ ÓÔ Ö ÓÒ × ÒÓÑ Ò Þ ¹Þ Ý × ÐÙ×ØÖ Ò Ð ¬ ÙÖ º¾ º ר ÓÔ Ö ÓÒ × ÕÙ Ú Ð ÒØ ÙÒ Ó Ð ÖÓØ ÓÒº Ð Ù Ð ÕÙ Ð Þ ¹Þ ¸ Ð ÒÓ Ó p ×Ù ØÖ × Ò Ú Ð × Ý × ¬Ò ÓÑÓ × Ù ¿½ ÓÔ Ö ÓÒ × Þ ¿¼ +≡ ´ ¿¾ µ ¿¼ static Node * zig_zag_right(Node* p) { LLINK(p) = rotate_to_left(LLINK(p)); return rotate_to_right(p); } Ð ÕÙ Ú Ð ÒØ × Ñ ØÖ Ó × ÒÓÑ Ò zig zag left()º Ä ÙÐØ Ñ ÓÔ Ö ÓÒ¸ ÕÙ × ÒÓÑ Ò Þ ¸ ÓÒ× ×Ø Ò ØÙ Ö ÙÒ ÖÓØ ÓÒ × ÑÔÐ Ý
  • 558.
    532 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u ×ÓÐÓ × Ö Ð Þ × Ð ÒÓ Ó ÕÙ Ú Ò Ö Ö Þ × Ò Ù ÒØÖ Ò Ð Ò Ú Ð 1 × Ö¸ Ü Ø Ñ ÒØ ÙÒ Ò Ú Ð Ò Ö ÓÖ Ð Ö Þ º Ó ÙÒ ÒÓ Ó x Ò ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ ¸ Ð ×ÔÐ Ý Ò Ð ÒÓ Ó x ÓÒ× ×Ø Ò ×Ù ÖÐÓ ×Ø Ð Ö Þ Ñ ÒØ Ð × ÓÔ Ö ÓÒ × Þ ¸ Þ ¹Þ Ý Þ ¹Þ º ÄÓ× Ò Ð × × ÔÓר Ö ÓÖ × ÑÓ×ØÖ Ö Ò ÕÙ × ×ØÓ × Ö Ð Þ ÔÓÖ ×Ó¸ ÒØÓÒ × Ð Ó×ØÓ ÔÖÓÑ Ó n ×Ó× × O(Ð n)º 6.6.1 El TAD Splay Tree<Key> Ð Ì Gen Splay Tree<Key> ÑÓ Ð Þ ÙÒ Ö ÓÐ Ò Ö Ó Ù×ÕÙ Ò Ð ÕÙ Ù ÐÕÙ Ö Ð × ÓÔ Ö ÓÒ × Ù× ÙÒ ×ÔÐ Ý Ò Ð ÒÓ Ó Óº Ð Ì × ¬Ò Ò Ð Ö ÚÓ ØÔÐ ×ÔÐ Ý ØÖ ºÀ ¿¾ ¸ Ð Ù Ð × ¬Ò ÓÑÓ × Ù ¿¾ ØÔÐ ×ÔÐ Ý ØÖ ºÀ ¿¾ ≡ template <template <typename> class NodeType, typename Key, class Compare> class Gen_Splay_Tree { typedef NodeType<Key> Node; ÓÔ Ö ÓÒ × Þ ¿¼ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Splay Tree<Key> ¿¾ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Splay Tree<Key> ¿ }; template <typename Key, class Compare = Aleph::less<Key> > struct Splay_Tree : public Gen_Splay_Tree<BinNode, Key, Compare> { /* Empty */ }; template <typename Key, class Compare = Aleph::less<Key> > struct Splay_Tree_Vtl : public Gen_Splay_Tree<BinNodeVtl, Key, Compare> { /* Empty */ }; Í× × BinNode ¾ ¼ Ò BinNodeVtl ¾¼º Ð Ì Gen Splay Tree<Key> ÒÓ Ö ÕÙ Ö ¬Ò Ö ÙÒ ÒÙ Ú Ð × ÒÓ Ó Ò Ö Ó¸ ÔÙ × ÒÓ × Ò × Ö Ó ÐÑ Ò Ö Ò ÓÖÑ ÓÒ ×Ø Ó Ò ÒÓ Óº Ä × ÓÔ Ö ÓÒ × Þ ¹Þ Ý Þ ¹Þ ÒÚÓÐÙ Ö Ò 4 ÒÓ Ó× ÕÙ ×ÓÒ Ü Ñ Ò Ó× Ó Ó× Ô Ö×Ô Ø Ú ×º ÈÖ Ñ ÖÓ¸ Ö ÕÙ Ö ÑÓ× Ø ÖÑ Ò Ö Ù Ð Ð × × × ÓÔ Ö ÓÒ × ÔÓ× Ð × ÙØ Ö× º Ë ÙÒ Ó¸ ÑÓ× ÙØ Ö Ð ÓÔ Ö ÓÒ Ò Ù ×Ø ÓÒº Ð ×ÔÐ Ý Ò ÙÒ ÒÓ Ó ÒÚÓÐÙ Ö ¸ ÒØÓÒ ×¸ ØÓ Ó× ÐÓ× ÒÓ Ó× Ð Ñ ÒÓ Ù×ÕÙ × Ð Ö Þ ×Ø Ð ÒÓ Ó ÓÒ × Ö Ð Þ Ð ×ÔÐ Ý Ò º ÈÓÖ Ø ÒØÓ¸ Ù× ÑÓ× ÙÒ Ô Ð ÕÙ ÐÑ Ò Ð Ñ ÒÓ ÒØ ÖÓ Ù×ÕÙ ¿¾ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Splay Tree<Key> ¿¾ ≡ ´ ¿¾ µ ¿¿ struct Node_Desc { Node * node; Node ** node_parent; }; ArrayStack<Node_Desc, Node::MaxHeight> splay_stack; Í× × ArrayStack ½¼ º ÒØÖ Ð Ô Ð Ù Ö Ö ×ØÖÓ× Ø ÔÓ Node Desc¸ Ð Ù Ð ×Ù Ú Þ Ù Ö Ó× Ú ÐÓÖ × Ð ÒÓ Ó Ô ÖØ Ð Ñ ÒÓ Ù×ÕÙ Ý ÙÒ Ó Ð ÔÙÒØ ÓÖ ×Ù Ô Ö º Ð ÔÙÒØ ÖÓ Ó Ð Ô ÖÑ Ø ØÙ Ö Ð × ÖÓØ ÓÒ × × Ò Ò × ÔÖ ÙÒØ Ö ÕÙ Ð Ó¸ ÞÕÙ Ö Ó Ó Ö Ó¸ × Ò Ù ÒØÖ Ð Ô Ö º Î × Ü º ½ ´Ô Ò ¿ ¾µº
  • 559.
    ´ 6.6. Arboles splay 533 Ä ÓÒ ×ÔÐ Ý Ø Ò ÕÙ Ð Ö Ö Ð Ö Óи Ô ÖÓ ÒÓ Ü ÐÙÝ ÙÒ ×Ó ÑÙÝ × ÓÖ¹ ØÙÒ Óº Ú ÒØÙ ÐÑ ÒØ ¸ splay stack ÔÙ Ø Ò Ö ÙÒ × ÓÖ ÕÙ × Ö Ñ Ò Óº ÈÓÖ × Ö ÞÓÒ¸ ¬Ò ÑÓ× ÙÒ Ñ ØÓ Ó ×Ô Ð ÕÙ Ò× ÖØ ÙÒ ÒÓ Ó Ò Ð Ô Ð Ý ÕÙ Ú Ö ¬ Ð × ÓÖ ¿¿ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Splay Tree<Key> ¿¾ +≡ ´ ¿¾ µ ¿¾ ¿¿ void push_in_splay_stack(Node * p, Node ** pp) { try { splay_stack.push(Node_Desc(p, pp)); } catch (std::overflow_error) { splay_stack.empty(); throw; } } ¬Ò × push in splay stack¸ Ù× Ò ÙÒ × ¿¿ß¿ º Ä ÙÒ Ö ×ÔÓÒ× Ð push in splay stack() × ØÖ Ô Ö Ð Ü Ô ÓÒ std::overflow errorº Ë ×ØÓ Ó ÙÖÖ ¸ ÐÓ ÙÒ Ó ÕÙ × × Ú Ö Ð Ô Ð ÒØ × ÔÖÓÔ Ö Ð Ü Ô ÓÒº push in splay stack() × ÙØ Ð Þ Ú Þ ÕÙ × ØÙ ÙÒ Ù×ÕÙ ¸ Ð Ù Ð × Ö Ð Þ ÔÓÖ Ð ÖÙØ Ò × Ù ÒØ ¿¿ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Splay Tree<Key> ¿¾ +≡ ´ ¿¾ µ ¿¿ ¿ void search_and_push_in_splay_stack(const Key & key) { splay_stack.empty(); Node ** pp = &RLINK(head); Node * p = root; while (p != NULL) // buscar iterativamente key { push_in_splay_stack(p, pp); if (Compare()(key, KEY(p))) { pp = &LLINK(p); p = LLINK(p); } else if (Compare()(KEY(p), key)) { pp = &RLINK(p); p = RLINK(p); } else return; } } ¬Ò × search and push in splay stack¸ Ù× Ò ÙÒ × ¿ Ò ¿º Í× × push in splay stack ¿¿ º × ÙÒ ÖÙØ Ò ÑÙÝ ÑÔÓÖØ ÒØ Ð Ù Ð × Ò ×¹ search and push in splay stack() Ô Ò× Ð ÓÑÔÖ Ò Öº × Ñ ÒØ ¸ Ð ÖÙØ Ò Ù× ÙÒ ÒÓ Ó ÓÒ Ð Ú key Ý ÑÔ Ð Ð Ñ ÒÓ Ù×ÕÙ Ò Ô Ò ÒØ Ñ ÒØ ÕÙ × Ò Ù ÒØÖ Ó ÒÓ Ð Ð Ú º Ë Ð Ù×ÕÙ
  • 560.
    534 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u × Ü ØÓ× ¸ ÒØÓÒ × Ð ØÓÔ Ð Ô Ð ÓÒØ Ò Ð ÒÓ Ó Ò ÓÒØÖ Óº ÐÓ ÓÒØÖ Ö Ó¸ Ð ØÓÔ ÓÒØ Ò Ð ÙÐØ ÑÓ ÒÓ Ó ÒØ × Ð ÜØ ÖÒÓ ØÙÚÓ Ð Ù×ÕÙ º Ä ÖÙØ Ò × ÑÔÐ Ô Ö Ð × ØÖ × ÓÔ Ö ÓÒ × × × Ò× Ö ÓÒ¸ Ù×ÕÙ Ý Ð Ñ Ò ÓÒº ÄÓ× ØÖ ÙØÓ× Ö ×Ø ÒØ × Ý ×ÓÒ Ñ Ð Ö × Ð Ð ØÓÖ ¿ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Splay Tree<Key> ¿¾ +≡ ´ ¿¾ µ ¿¿ ¿ Node head_node; Node *head; Node *&root; Ä ×Ò Ð ÑÔÐ ÒØ ÓÒ ×Ù Ý Ò ÙÒ ÖÙØ Ò splay() ÕÙ Ö Ð Þ Ð ×ÔÐ Ý Ò Ð ÒÓ Ó × ØÙ Ó Ò Ð ØÓÔ Ð Ô Ð º splay() Ö ÕÙ Ö Ø ÖÑ Ò Ö Ð Ø ÔÓ ÓÔ Ö ÓÒ ÙØ Ö × ÙÒ Ð Ð Ò ÓÒ Ð Ñ ÒÓ Ù×ÕÙ º ×ØÓ × Ö Ð Þ Ó ÔÓÖ Ð × Ù ÒØ ÖÙØ Ò ¿ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Splay Tree<Key> ¿¾ +≡ ´ ¿¾ µ ¿ ¿ enum Zig_Type { ZIG_LEFT, ZIG_RIGHT, ZIG_ZAG_LEFT, ZIG_ZAG_RIGHT, ZIG_ZIG_LEFT, ZIG_ZIG_RIGHT }; Zig_Type zig_type(Node *& p, Node **& pp) { Node_Desc first = splay_stack.pop(); Node_Desc second = splay_stack.pop(); Zig_Type ret = Compare()(KEY(second.node), KEY(first.node)) ? ZIG_LEFT : ZIG_RIGHT; if (splay_stack.is_empty()) { p = second.node; pp = second.node_parent; return ret; } Node_Desc third = splay_stack.pop(); pp = third.node_parent; p = third.node; if (ret == ZIG_LEFT) return Compare()(KEY(third.node), KEY(second.node)) ? ZIG_ZIG_LEFT : ZIG_ZAG_RIGHT; return Compare()(KEY(second.node), KEY(third.node)) ? ZIG_ZIG_RIGHT : ZIG_ZAG_LEFT; } ¬Ò × zig type¸ Ù× Ò ÙÒ ¿ º zig type() Ö ØÓÖÒ Ð Ø ÔÓ ÓÔ Ö ÓÒ ÕÙ Ö Ð Þ Ö× ×Ó Ö Ð ÒÓ Ó Ò Ð ØÓÔ Ð ÔÐ º ÓÒ ÐÑ ÒØ ¸ Ð ÖÙØ Ò ÚÙ ÐÚ ÐÓ× Ú ÐÓÖ × p Ý pp ÓÖÖ ×ÔÓÒ ÒØ × Ð ÙÐØ ÑÓ ÒÓ Ó Ò Ð Ò Ð ÓÔ Ö ÓÒ Ý ×Ù Ô Ö º ר ÑÓ× Ð ×ØÓ× Ô Ö Ð ÖÙØ Ò splay()¸ Ð Ù Ð × ÑÙÝ × Ò ÐÐ ÙÒ Ú Þ ¬Ò Ð Ñ ÕÙ Ò Ö Ò × Ö ¿ Ñ Ñ ÖÓ× ÔÖ Ú Ó× Gen Splay Tree<Key> ¿¾ +≡ ´ ¿¾ µ ¿ void splay() { if (splay_stack.is_empty() or splay_stack.top().node == root) return; Node **pp, *p; while (true) { switch (zig_type(p, pp)) {
  • 561.
    ´ 6.6. Arboles splay 535 case ZIG_LEFT: *pp = rotate_to_left(p); break; case ZIG_RIGHT: *pp = rotate_to_right(p); break; case ZIG_ZIG_LEFT: *pp = zig_zig_left(p); break; case ZIG_ZIG_RIGHT: *pp = zig_zig_right(p); break; case ZIG_ZAG_LEFT: *pp = zig_zag_left(p); break; case ZIG_ZAG_RIGHT: *pp = zig_zag_right(p); break; } if (splay_stack.is_empty()) break; push_in_splay_stack(p, pp); } } ¬Ò × splay¸ Ù× Ò ÙÒ × ¿ Ò ¿º Í× × push in splay stack ¿¿ Ò zig type ¿ º splay() × Ð ÖÙØ Ò ÙÒ Ñ ÒØ Ð Ð Ì Gen Splay Tree<Key>º ÐÐ ×ÙÑ ÕÙ × ØÙÓ ÙÒ ÐÐ Ñ ÔÖ Ú search and push in splay stack() Ý ÕÙ Ð ØÓÔ Ð Ô Ð ÓÒØ Ò Ð ÒÓ Ó ×Ó Ö Ð Ù Ð × × Ö Ð Þ Ö Ð ×ÔРݺ Ú Þ ÕÙ × ÙØ Ù ÐÕÙ Ö ÓÔ Ö ÓÒ Ò× Ö ÓÒ¸ Ù×ÕÙ Ó Ð Ñ Ò ÓÒ¸ × Ö Ð Þ Ö ÙÒ ×ÔÐ Ý Ð Ö Óк Ä ×Ø ÓÔ Ö ÓÒ × ÑÓÖØ Þ Ö ÐÓ× ×Ó× × ÓÖØÙÒ Ó× Ý ÕÙ Ð Ö Ö Ð Ö Óк Ð × ØÖ × ÓÔ Ö ÓÒ × ÙÒ Ñ ÒØ Р׸ Ð Ñ × × ÑÔÐ × Ð Ù×ÕÙ ¸ Ð Ù Ð × ¬Ò ÓÑÓ × Ù ¿ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Splay Tree<Key> ¿ ≡ ´ ¿¾ µ ¿ Node * search(const Key & key) { if (root == NULL) return NULL; search_and_push_in_splay_stack(key); splay(); if (are_equals<Key, Compare>(key, KEY(root))) return root; return NULL; } Í× × search and push in splay stack ¿¿ Ò splay ¿ º Ä Ù×ÕÙ × ÑÙÝ × Ò ÐÐ ÔÓÖÕÙ ØÓ Ð Ò Ö ×ØÖÙ ØÙÖ × Ò Ù ÒØÖ ÑÔÐ ÒØ ÔÓÖ ÐÓ× Ñ ØÓ Ó× ÔÖ Ú Ó× search and push in splay stack() Ý splay()º ÆÓØ ÕÙ Ð ×ÔÐ Ý × ÑÔÖ × Ö Ð Þ ¸ Ò Ô Ò ÒØ Ñ ÒØ ÕÙ Ð Ù×ÕÙ × ÐÐ Ó ÒÓº Ä Ò× Ö ÓÒ × Ð Ö Ñ ÒØ Ñ × ÓÑÔÐ Ô ÖÓ¸ Ð Ù Ð ÕÙ ÓÒ Ð Ù×ÕÙ ¸ ØÓ Ó Ð ØÖ Ó × ÑÔÐ ÒØ Ó ÔÓÖ search and push in splay stack() Ý splay() ¿ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Splay Tree<Key> ¿ +≡ ´ ¿¾ µ ¿ ¿ Node * insert(Node * p) { if (root == NULL) { root = p; return root; } search_and_push_in_splay_stack(KEY(p)); Node * pp = splay_stack.top().node;
  • 562.
    536 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u if (Compare()(KEY(p), KEY(pp))) // meter p en la pila { LLINK(pp) = p; push_in_splay_stack(p, &LLINK(pp)); } else if (Compare()(KEY(pp), KEY(p))) { RLINK(pp) = p; push_in_splay_stack(p, &RLINK(pp)); } else { // clave duplicada splay(); // de todos modos hacemos el splay return NULL; } splay(); return root; } Í× × push in splay stack ¿¿ ¸ search and push in splay stack ¿¿ ¸ Ò splay ¿ º È Ö Ð Ð Ñ Ò ÓÒ × Ø Ò Ò Ó× ÐØ ÖÒ Ø Ú × Ð Ð Ñ Ò ÓÒ Ð × ÕÙ ÒØ ÙÒ ÒÓ Ó ÓÑÔÐ ØÓ × Ð ÓÒ Ð ×Ù ×ÓÖ Ó ÔÖ ×ÓÖ¸ Ó Ñ ÒØ Ð ÓÔ Ö ÓÒ join() × ÖÖÓÐÐ Ò Ü º º ´Ô Ò ¿ µº ÈÓÖ × Ö Ð Ñ × × Ò ÐÐ Ý ÔÓ× Ð Ñ ÒØ Ð Ñ × ¬ Þ¸ × Ó ÑÓ× Ð × ÙÒ ÐØ ÖÒ Ø Ú ¿ Ñ Ñ ÖÓ× ÔÙ Ð Ó× Gen Splay Tree<Key> ¿ +≡ ´ ¿¾ µ ¿ Node * remove(const Key & key) { search_and_push_in_splay_stack(key); splay(); // Suba el nodo hasta la ra´z mediante el splay ı if (no_equals <Key, Compare> (KEY(root), key)) return NULL; // key no est´ a Node * p = root; root = join_exclusive(LLINK(root), RLINK(root)); p->reset(); return p; } Í× × join exclusive ¿ ½ ¸ search and push in splay stack ¿¿ ¸ Ò splay ¿ º Ð Ð ÓÖ ØÑÓ Ö Ð Þ Ð Ù×ÕÙ Ð ÒÓ Ó Ð Ñ Ò Ö Ý Ö Ð Þ ÙÒ ×ÔÐ Ý Ò Ô Ò ÒØ Ñ ÒØ ÕÙ Ð Ù×ÕÙ Ý × Ó Ü ØÓ× Ó ÒÓº Ë Ð Ð Ú × Ò Ù ÒØÖ Ò Ð Ö Óи ÒØÓÒ × Ð Ö Þ ÓÒØ Ò Ð ÒÓ Ó Ð Ñ Ò Ö Ý Ð Ö ÓÐ Ö ×ÙÐØ ÒØ × Ð ÓÒ Ø Ò ÓÒ ×Ù× Ö Ñ ×º Ò ×Ó ÓÒØÖ Ö Ó¸ Ð Ð ÓÖ ØÑÓ Ø ÖÑ Ò ¸ ÔÙ × ÒÓ × Ò × Ö Ó Ö Ð Þ Ö ÓØÖ ÓÔ Ö ÓÒº 6.6.2 An´lisis de los ´rboles splay a a Ð Ò Ð × × ÙÒ Ö ÓÐ ×ÔÐ Ý × Ô Ö Ñ Ø Ó Ð ÑÓÖØ Þ Óº ÌÓ × Ð × ÓÔ Ö ÓÒ × Ö Ð Þ Ò ÙÒ Ù×ÕÙ ¸ ÙÝÓ × ÑÔ ÒÓ Ô Ò Ð ÔÖÓ ÙÒ¹ Ð ÒÓ Ó ÔÓר Ö ÓÖÑ ÒØ ¸ × Ö Ð Þ Ð ×ÔÐ Ý Ð ÒÓ Ó¸ ÙÝÓ × ÑÔ ÒÓ Ø Ñ Ò ÔÒ Ð ÐÓÒ ØÙ Ð Ñ ÒÓ ÒØÖ Ð Ö Þ Ý Ð ÒÓ Óº Ä Ò× Ö ÓÒ Ý Ð Ù×ÕÙ Ø Ò Ò O(Ò Ú Ð(ni)) + O(Ò Ú Ð(ni)) = O(Ò Ú Ð(ni))¸ Ñ ÒØÖ × ÕÙ Ð Ð Ñ Ò ÓÒ Ø Ò O(Ò Ú Ð (ni)) + O(Ò Ú Ð (ni)) + O(Ò Ú Ð (ni)) = O(Ò Ú Ð (ni))¸ × Ò Ó Ò Ú Ð(ni) Ð Ò Ú Ð Ð
  • 563.
    ´ 6.6. Arboles splay 537 ÒÓ Ó ×Ù ØÓ Ð ÓÔ Ö ÓÒ ×ÔРݺ ×ØÓ ÒÓ× ×Ù Ö ÕÙ Ð ÙÒ ÓÒ ÔÓØ Ò Ð ÓÒ× Ö Ö Ð Ò Ú Ð ÐÓ× ÒÓ Ó× ÓÑÓ Ô ÖØ Ð Óר º Ä ÐÓÒ ØÙ Ð Ñ ÒÓ ÒØ ÖÒÓ¸ ÔÖ × ÒØ Ò Ð ¬Ò ÓÒ Ü º ´Ô Ò ¾ µ¸ ÒÓ× ÖÖÓ ÙÒ Ñ ØÖ ÕÙ ÓÒ× Ö Ð Ò Ú Ðº ÓÖ Ò¸ Ð Ö Ø Ö ÑÙÐ ÓÒ Ð Ù×ÕÙ Ò Ö ¸ Ý Ð × Ò Ó Ð × × ÒØ Ö ÓÖ × Ö ÓÐ × Ò Ö Ó× ÕÙ ÑÓ× ×ØÙ Ó¸ ×Ù Ö Ò ÕÙ ÓÒ× Ö ÑÓ× Ð ÐÓ Ö ØÑÓ Ò Ð ÙÒ ÓÒ ÔÓØ Ò Ð ÕÙ ÒÓ× ÔÓÒ Ö Ð Ò Ú Ðº Definici´n 6.10 (Rango de un ´rbol) o a Ë ÙÒ Ö ÓÐ Ò Ö Ó T n ÒÓ Ó׺ Ë (ni) Ð ÒØ ÒÓ Ó× Ð ×Ù ¹ Ö ÓÐ ÓÒ Ö Þ Ò niº ÒØÓÒ ×¸ Ð Ö Ò Ó T ¸ ÒÓØ Ó ÓÑÓ r(T )¸ × ¬Ò ÓÑÓ r(T ) = Ð (T ) ´ º ½µ ËÐ ØÓÖ Ý Ì Ö Ò ½ × Ð ÓÒ ÖÓÒ ÙÒ ÙÒ ÓÒ ÔÓØ Ò Ð × Ò Ð Ö Ò Ó ÙÒ Ö ÓÐ Ð × Ù ÒØ ÑÓ Ó Φ(T ) = r(ni) = Ð (ni) ´ º ¾µ ∀ni ∈T ∀ni ∈T ni × ÒØ ÖÒÓ ni × ÒØ ÖÒÓ Ò ÖØ ÓÖÑ ¸ ר ÔÓØ Ò Ð × Ö Ñ Ò × ÒØ Ð ÁÈÄ(T ) Ò Ð × ÒØ Ó ÕÙ ÔÓÒ Ö Ù Ò ÕÙ Ð Ö Ó ×Ø T º Ä Ö Ò ÓÒ× ×Ø Ò ÕÙ Φ(T ) ר ÓØ Ó ÔÓÖ O(n Ð (n))¸ Ñ ÒØÖ × ÕÙ Ð ÁÈÄ(T ) ÔÓÖ O(n2)º È Ö ÙÒ Ö ÓÐ ÓÑÔÐ ØÓ Ð Ö Ò Ó × Ô ÕÙ ÒÓ¸ ÔÓÖ ÑÔÐÓ¸ Ô Ö T= Φ(T ) = Ð (9) + Ð (5) + 2 Ð (3) + 5 Ð (1) ≈ 8, 66 ; Ñ ÒØÖ × ÕÙ ÓÒ ÙÒ Ö ÓÐ Ñ × × ÕÙ Ð Ö Ó Ð Ö Ò Ó × Ñ ÝÓÖ ÔÓÖ ÑÔÐÓ¸ Ô Ö T= Φ(T ) = Ð (9) + Ð (8) + Ð (7) + Ð (4) + 2 Ð (2) + 3 Ð (1) ≈ 17, 62 . Å ÒØÖ × Ñ × ÕÙ Ð Ö Ó ×Ø ÙÒ Ö Óи Ñ ÒÓÖ × ×Ù ÔÓØ Ò Ð Ò ÐÓ Ñ ÒØ ¸ Ñ ÒØÖ × Ñ ÒÓ× ÕÙ Ð Ö Ó¸ Ñ ÝÓÖ ×Ø ׺ Proposici´n 6.10 ´Ä o Ñ ×Ó ÙÒ Ö ÓÐ ×ÔÐ Ý ¹ ËÐ ØÓÖ Ý Ì Ö Ò ½ ½ µ Ë T ÙÒ Ö ÓÐ ×ÔÐ Ý Ý k ∈ T ÙÒ Ð Ú º Ë Ò i−1(k) Ý i(k) Ð × Ö Ò Ð × Ð ×Ù ¹ Ö ÓÐ ÙÝ Ö Þ × k ÒØ × Ý ×ÔÙ × ÙÒ Ô ×Ó ÙÒ ×ÔÐ Ý ÙÒ ØÓØ Ð m Ô ×Ó׺ Ë Ò ri−1(k) Ý ri(k) ÐÓ× Ö Ò Ó× k ÒØ × Ý ×ÔÙ × ÙÒ Ô ×Ó Ð ×ÔÐ Ý ÙÒ ØÓØ Ð m Ô ×Ó׺ ÒØÓÒ ×¸ Ð Óר ÑÓÖØ Þ Ó Ò Ð i¹ × ÑÓ Ô ×Ó¸ ¬Ò Ó ÓÑÓ i¸ ר ÓØ Ó ÓÑÓ 3ri(k) − 3ri−1(k) × i<m i≤ ´ º ¿µ 3ri(k) − 3ri−1(k) + O(1) × i = m
  • 564.
    538 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u Demostraci´n o Ä ÑÓ×ØÖ ÓÒ ÓÒ× ×Ø Ò Ð ÙÐ Ö Ð Óר ÑÓÖØ Þ Ó Ô Ö Ø ÔÓ ÓÔ Ö ÓÒ ÕÙ Ó ÙÖÖ ÙÖ ÒØ ÙÒ Ô ×Ó Ð ×ÔÐ Ý ÒØÖ ÐÓ× m Ö ÕÙ Ö Ó× Ô Ö ×Ù Ö k ר Ð Ö Þº ר ÑÓ Ó i = Øi +Φ(Ti) − Φi−1(Ti−1) ´º µ ÓÒ Ti−1 Ý Ti ×ÓÒ ÐÓ× Ö ÓÐ × ÒØ × Ý ×ÔÙ × ÙÒ Ô ×Ó Ò Ð ×ÔÐ Ý ÒØÖ ÐÓ× ØÖ × ÔÓ× Ð × Ø ÔÓ× ¬Ò Ó׺ Ë k Ð ÒÓ Ó ÕÙ ×Ù Ö Ò Ú Ð Ò ÙÒÓ ÐÓ× Ô ×Ó× Ð ×ÔРݸ ÒØÓÒ ×¸ ØÓ× ×Ø ÑÓ×ØÖ ÓÒ¸ ÔÐ ÒØ Ö ÑÓ× ÙÒ ÔÖ × ÒØ ÓÒ Ñ ÒÓ× ÔÖ × ÐÐÑ ×Ó i ≤ 3ri(k) − 3ri−1(k) + O(1) , 1 ≤ i ≤ m ´º µ Ò ÐÓ ÕÙ × Ù ¸ ØÖ Ø Ö ÑÓ× ÐÓ× ØÖ × ÔÓ× Ð × Ô ×Ó× ÕÙ Ó ÙÖÖ Ò Ò ÙÒ ×ÔÐ Ý ½º zig b k Ti−1 = k χ Ti = α b α β =⇒ β χ Ò ×Ø ×Ó¸ Ð ÙÖ ÓÒ ÓÒר ÒØ ÕÙ Ú Ð ÙÒ ÖÓØ ÓÒ¸ Ö ÞÓÒ ÔÓÖ Ð Ù Ð ×Ùѹ ÑÓ× Øi = 1º Ð Þ ÒÓ ÐØ Ö Ð × Ö Ò Ð × Ð × Ö Ñ × α¸ β Ý χ¸ ÔÓÖ ÐÓ ÕÙ ×Ù× Ö Ò Ó× × Ò ÐÒ ÒÐ ÖÒ ÔÓØ Ò Ðº ÈÓÖ ÐÓ Ø ÒØÓ¸ Ð ÖÒ ÔÓØ Ò Ð ×ÓÐÓ ÓÒØ Ò ÐÓ× Ö Ò Ó× ÐÓ× ÒÓ Ó× k Ý bº ר ÑÓ Ó i = 1 + ri(k) + ri(b) − ri−1(k) − ri−1(b) ´º µ ÆÓØ ÑÓ׸ ÔÓÖ Ó × ÖÚ ÓÒ Ð ¬ ÙÖ Ð Þ ¸ ÕÙ i−1(b) = i(k)¸ ÔÓÖ ÐÓ ÕÙ ri(k) − ri−1(b) = 0¸ ÐÓ ÕÙ ÒÓ× i = 1 + ri(b) − ri−1(k) ´º µ Ð Ñ ×ÑÓ ÑÓ Ó¸ ri−1(b) ≥ ri(k)¸ ÔÓÖ ÐÓ ÕÙ ÔÓ ÑÓ× ÔÐ ÒØ Ö Ð × Ù Ð × Ù ÒØ i ≤ 1 + ri(k) − ri−1(k) ´º µ ≤ 3ri(k) − 3ri−1(k) + O(1) ¾º zig-zig c k Ti−1 = b δ Ti = α b k χ β c α β =⇒ χ δ
  • 565.
    ´ 6.6. Arboles splay 539 Ò ×Ø ×Ó Ø ÑÔÓ Ó Ñ Ò Ð × Ö Ò Ð × α¸ β¸ χ Ý δ¸ ÔÓÖ ÐÓ ÕÙ ÐÓ× Ö Ò Ó× Ô ÖÑ Ò Ò Ù Ð × ÒØÖ Ti−1 Ý Ti Ý × Ò Ð Ò ÑÙØÙ Ñ ÒØ Ò Ð Ð ÙÐÓ Ð Ö Ò Ð ÔÓØ Ò Ðº ÈÓÖ ÓØÖ Ô ÖØ ¸ Ð Þ ¹Þ × Ñ × ÓרÓ×Ó Ò ÙÖ ÓÒ ÕÙ Ð Þ º Ò ÓÑÔÐ Ø ÑÔÓ¸ × ÔÙ Ö ÕÙ Ð Þ ¹Þ ØÙ ÙÒ ÖÓØ ÓÒ Ñ ×¸ Ð Ù Ð × ÔÖÓÔÓÖ ÓÒ Ð 2 Ó × Ð Ó Ð Ð Þ º ÈÓÖ ÐÓ Ø ÒØÓ¸ Ð Óר ÑÓÖØ Þ Ó × ¬Ò ÓÑÓ i = 2 + ri(k) + ri(b) + ri(c) − ri−1(k) − ri−1(b) − ri−1(c) Ò ×Ø ×Ó¸ i−1(c) = i(k)¸ ÐÓ ÕÙ ÕÙ ri−1(c) − ri(k) = 0¸ ÔÓÖ ÐÓ ÕÙ Ð ÜÔÖ × ÓÒ ÒØ Ö ÓÖ Ú Ò Ò i = 2 + ri(b) + ri(c) − ri−1(k) − ri−1(b) ´º µ Á Ù Ð ÕÙ Ô Ö Ð Þ ¸ ri−1(b) ≥ ri−1(k) Ý ri(k) ≥ ri(b)º ËÙ ×Ø ØÙ ÑÓ× Ò Ð Ù ÓÒ ÒØ Ö ÓÖ Ý Ð ÑÓ× ÙÒ × Ù Ð i ≤ 2 + ri(k) + ri(c) − 2ri−1(k) ´ º ¼µ Ë Ò i−1(k) i(c) x= (k) , y= ´ º ½µ i i(k) ÈÙ ×ØÓ ÕÙ i(k) > i−1(k) Ý i(k) > i(c)¸ ÒØÓÒ × x > 0 y > 0º Ò Ò ÙÖ ¸ x+y< 1 ÐÓ Ù Ð × Ú Ò ÜÔÖ × Ò Ó Ð × Ö Ò Ð × Ò ÙÒ ÓÒ ×Ù× ×Ù ¹ Ö ÓÐ × 1 + (α) + (β)1 + (β) + (χ) 2 + (α) + (β) + (χ) + (δ) x+y= = ´ º ¾µ 3 + (α) + (β) + (χ) + (δ) 3 + (α) + (β) + (χ) + (δ) ÓÑÓ × ÓØ Ö Ð (x) + Ð (y) Ó¸ Ó ÓØÖÓ ÑÓ Ó¸ Ù Ð × Ö Ð Ñ Ü ÑÓ Ú ÐÓÖ ÕÙ ØÓÑ Ö Ð (x) + Ð (y) Ä Ö ×ÔÙ ×Ø × ØÖ Ø Ò Ð × Ù ÒØ Ð Ñ Lema 6.8 Ë Ò x, y ∈ R | x > 0, y > 0, x + y ≤ 1¸ ÒØÓÒ ×¸ Ð (x) + Ð (y) ≤ −2º Demostraci´n ÈÓÖ ÙÒ ÔÖÓÔ o Ý ÓÒÓ ¸ Ð (x) + Ð (y) = Ð (xy)º Ä ÙÖÚ Ð ÐÓ Ö ØÑÓ × ÑÓÒÓØÓÒ Ñ ÒØ Ö ÒØ ݸ ÒØÖÓ Ð ÓÑ Ò Ó ÒÙ ×ØÖÓ ÒØ Ö ×¸ Ü Ð × Ù ÒØ ÓÖÑ ½ lg(n) ¼º ¼ ¹¼º ¹½ ¹½º ¹¾ ¹¾º ¹¿ ¼ ¼º¾ ¼º ¼º ½ ½º¾ ½º ½º ¾ n
  • 566.
    540 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u Ð Ú ÐÓÖ Ð (xy) × Ñ Ü ÑÓ Ù Ò Ó Ð ÔÖÓ Ù ØÓ xy × Ñ Ü ÑÓº × Ð × ÓÒ ¹ ÓÒ × x y¸ xy × Ñ Ü ÑÓ Ù Ò Ó x = y = 1/2 =⇒ Ð (xy) = −2 ÓÖ ÜÔ Ò ÑÓ× Ð (x) + Ð (y) i−1(k) i(c) Ð (x) + Ð (y) = Ð +Ð i(k) i(k) = Ð i−1(k) − Ð i(k) + Ð i(c) −Ð i(k) = Ð i−1(k) +Ð i(c) − 2Ð i(k) = ri−1(k) + ri(c) − 2ri−1(k) ´ º ¿µ Ò ÙÒ ÓÒ Ð Ð Ñ º ¸ ÔÐ ÒØ ÑÓ× Ð × Ù ÒØ × ÙÐ ri−1(k) + ri(c) − 2ri(k) ≤ −2 =⇒ 2ri(k) − ri(k) − ri−1(k) − 2 ≥ 0 ´º µ ÓÑÓ Ð Ö ×ÙÐØ Ó × ÔÓ× Ø ÚÓ ÐÓ ÔÓ ÑÓ× ×ÙÑ Ö Ð × ÙÐ ´ º ¼µ i ≤ 2 + ri(k) + ri(c) − 2ri−1(k) + 2ri(k) − ri(k) − ri−1(k) − 2 ≤ 3ri(k) − 3ri−1(k) ≤ 3ri(k) − 3ri−1(k) + O(1) ´º µ ¿º zig-zag c Ti−1 = a δ k α k Ti = a c β χ =⇒ α β χ δ Ð Ö ÞÓÒ Ñ ÒØÓ Ò ×Ø ×Ó × ÓÑÔÐ Ø Ñ ÒØ × Ñ Ð Ö Ð ÒØ Ö ÓÖ ×Ø ´ º µº Ç × ÖÚ Ò Ó ÕÙ ri−1(a) ≥ ri−1(k)¸ Ý ÕÙ ri(k) ≥ ri(c)ÔÐ ÒØ ÑÓ× Ð × Ù ÒØ ¹ × ÙÐ i ≤ 2 + ri(a) + ri(c) − 2ri−1(k) ´º µ Ë Ò i(a) i(c) x= , y= ´º µ i(k) i(k) Ò ×Ø ÑÓÑ ÒØÓ × Ö Ð ÖÓ ÕÙ x + y < 1¸ Ö ÞÓÒ ÔÓÖ Ð Ù Ð¸ ÔÐ Ò Ó Ð Ð Ñ º Ø Ò ÑÓ× ÕÙ Ð x + Ð y ≤ −2 =⇒ i(a) i(ca) Ð (k) +Ð ≤ −2 =⇒ i i(k) 2ri(k) − ri(a) − ri(c) − 2 ≥ 0 ´º µ
  • 567.
    ´ 6.6. Arboles splay 541 Ò ÐÑ ÒØ ¸ ×ÙÑ Ò Ó Ð Ð Ó ÞÕÙ Ö Ó ´º µ Ð Ö Ó ´ º µ¸ Ø Ò ÑÓ× i ≤ 2ri(k) − 2ri−1(k) ´º µ ≤ 3ri(k) − 3ri−1(k) + O(1) ÄÓ× ØÖ × ×Ó× ÔÓ× Ð × ÙÒ Ô ×Ó Ð ×ÔÐ Ý ×Ø Ò ÓØ Ó× ÔÓÖ 3ri(k) − 3ri−1(k) + O(1) ÙÖ º¿¼ ÍÒ Ö ÓÐ ×ÔÐ Ý 512 ÒÓ Ó× Ð ÐÑ ×Ó × Ð × ÑÓ×ØÖ Ø Ú ÙÒÓ× Ù ÒØÓ× Ø ÓÖ Ñ × ×Ó Ö ÐÓ× Ö ÓÐ × ×ÔРݸ ÒØÖ ÐÐÓ× Ð × Ù ÒØ Proposici´n 6.11 o Ð Óר ÑÓÖØ Þ Ó s ÙÒ ÓÔ Ö ÓÒ splay() ×Ó Ö ÙÒ ÒÓ Ó k Ô ÖØ Ò ÒØ ÙÒ Ö ÓÐ ×ÔÐ Ý × O(Ð n)º Demostraci´n Ä ÓÔ Ö ÓÒ ×ÔÐ Ý ÔÙ o Ñ Ò Ö× ÓÑÓ ÙÒ × Ù Ò Ô ×Ó× Þ × ÙÒ Ð ÓÖ ÒØ ÓÒ Ð ÒÓ Ó ÙÝÓ Ó×ØÓ ÑÓÖØ Þ Ó ØÓØ Ð ÔÙ ¬Ò Ö× ÓÑÓ m s = i . i=1 ר × Ù Ò ÓÔ Ö ÓÒ × ÔÙ Ô ØÓÖ Þ Ö× Ð × Ù ÒØ ÑÓ Ó m º º º i+1 i k º º º 1
  • 568.
    542 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u Ð ÒÓ Ó k ×Ù Ð Ö Þ Ñ ÒØ m − 1 ÓÔ Ö ÓÒ × Þ ¹Þ Ó Þ ¹Þ Ý ÙÒ m¹ × Ñ ÓÔ Ö ÓÒ ÕÙ ÔÓ Ö × Ö Ù ÐÕÙ Ö Ð × ØÖ × ÔÓ× Ð ×º Å × ÔÖ × Ñ ÒØ × ÑÓ׸ ÔÓÖ ÐÐ Ñ ×Ó¸ ÕÙ ÐÓ× m − 1 ÔÖ Ñ ÖÓ× Ô ×Ó× ×Ø Ò ÓØ Ó× ÔÓÖ 3ri(k) − 3ri−1(k)¸ ÔÙ × ×Ø Ú ÐÓÖ ÓØ Ø ÒØÓ Ð Þ ¹Þ ÓÑÓ Ð Þ ¹Þ Ñ ÒØÖ × ÕÙ Ð ÙÐØ Ñ ÓÔ Ö ÓÒ ÔÙ Ö × Ö Ù ÐÕÙ Ö Ð × ØÖ ׸ Ö ÞÓÒ ÔÓÖ Ð Ù Ð × Ò × Ö Ó ÓØ ÖÐ Ð Ñ Ü ÑÓ × Ö¸ 3rm(k) − 3rm−1(k) + 1º Ò × ÐÓ ÒØ Ö ÓÖ¸ ÔÓ ÑÓ× ¬Ò Ö m−1 s = 3ri (k) − 3ri−1 (k) + 3rm (k) − 3rm−1 (k) + 1 i=1 m−1 m−1 = 3ri (k) − 3ri−1 (k) + 3rm (k) − 3rm−1 (k) + 1 i=1 i=1 = 3r1 (k) + 3r2 (k) + · · · + 3rm−1 (k) − 3r0 (k) + 3r1 (k) + · · · + 3rm−2 (k) + 3rm (k) − 3rm−1 (k) + 1 = 3rm (k) − 3r0 (k) + 1 ≤ 3rm (k) + 1 = 1 + Ð n = O(Ð n) ÓÑÓ ÓÖÓÐ Ö Ó Ð ÔÖÓÔÓ× ÓÒ º½½ ÔÓ ÑÓ× ÒÙÒ Ö ÕÙ p ÓÔ Ö ÓÒ × ×Ó Ö ÙÒ Ö ÓÐ ×ÔÐ Ý Ø Ò Ò Óר ÑÓÖØ Þ Ó O(p Ð n)º Ò ØÓ¸ ÓÑÓ Ý ÐÓ ÜÔÖ × ÑÓ× ÒØ Ö ÓÖÑ ÒØ ¸ Ð ÙÒ ÓÒ ÔÓØ Ò Ð ÓÒ× Ö Ð Ð ÕÙ Ð Ö Ó Ð Ö Óи Ð Ù Ð Ù ÒØ Ô Ö Ð Ø ÑÔÓ Ù×ÕÙ ÕÙ Ö Ð Þ ÙÒ ÓÔ Ö ÓÒ ÙÒ Ö ÓÐ ×ÔРݺ 6.7 Conclusi´n o ר Ô ØÙÐÓ ØÖ ØÓ Ð ÕÙ Ð Ö Ó Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ º Ä ×Ù Ý ÒØ × Ñ Ò Ñ Þ Ö Ð ÒØ ÒÓ Ó× Ò×Ô ÓÒ Ö Ò ÙÒ Ù×ÕÙ º Ø ÒÓÖ ÐÓ ÒØ Ö ÓÖ¸ ×ØÙ ÑÓ× Ú Ö × Ð × × ÕÙ Ð Ö Ó ÙÒØÓ ÓÒ ×Ù× Ö ÓÐ × ÓÖ¹ Ö ×ÔÓÒ ÒØ ׺ Ò ÔÖ Ñ Ö ÐÙ Ö¸ ÓÒ× Ö ÑÓ× Ð ÕÙ Ð Ö Ó Ù ÖØ Ï ÖØ Ý × ÖÖÓÐÐ ÑÓ× ÙÒ Ð ÓÖ ØÑÓ O(n Ð n) ÕÙ ÕÙ Ð Ö ÙÒ Ù ÐÕÙ Ö º Ð × ÖÖÓÐÐÓ ×Ø Ð ÓÖ ØÑÓ ÒÓ× Ô ÖÑ Ø Ó Ô Ö Ø ÖÒÓ× Ð × Ú × ØÙ × Ý ¬ ÙÐØ × Ò Ö ÒØ × Ð ÕÙ Ð Ö Óº Ð Ö ×ØÓ Ð Ô ØÙÐÓ × ÓÒ× ÖÓ ×ØÙ Ö Ò Ó Ð × × Ö ÓÐ × ÕÙ Ð Ö Ó× Ð ¹ ØÓÖ Þ Ó׸ ØÖ Ô׸ Îĸ ÖÓ Ó¹Ò ÖÓ Ý ×ÔРݺ ÙÒÓ ÓÒ ×Ù× Ú ÒØ × Ý ×Ú ÒØ × ÓÒ× Ö Ö × ÙÒ Ð ÔÐ ÓÒº Ð ×Ù × Ö ÔØÓÖ Ð ÔÖ × ÒØ Ø ÜØÓ ÐÐ Ú Ó ÙÒ ×ØÙ Ó ÑÔ Ö Ó ×Ó Ö ÐÓ× Ö ÒØ × Ø ÔÓ× Ö ÓР׺ ÄÓ× Ö ×ÙÐØ Ó׸ × Ò Ö ÓÖ ×Ø ר Ó¸ ÑÙ Ó Ñ ÒÓ× × Ò ÜÔÖ × Ö ÒØ ÖÚ ÐÓ× ÓÒ¬ ÒÞ ¸ × ÑÙ ×ØÖ Ò Ò Ð × ¬ ÙÖ × º¿½¸ º¿¾¸ º¿ Ý º¿ Ö ×Ô Ø Ú Ñ ÒØ º Ä × Ö ¬ × Ò Ù ×Ø ÓÒ ÓÖÖ ×ÔÓÒ Ò Ñ × ×Ó Ö Ð × Ù ÒØ ÜÔ Ö Ñ ÒØÓ ½º Ë Ò Ö ÙÒ × Ù Ò Ð ØÓÖ Ð Ú × Ò× Ö ÓÒº ¾º È Ö Ø ÔÓ Ö ÓÐ × Ö Ð Þ ¿ Ú × Ð Ò× Ö ÓÒ Ð × Ù Ò ÒØ Ö ÓÖ Ý¸ ÔÓØ Ò Ü Ø ¾¸ × ØÙ Ò Ð × Ñ ×º Ä ×Ñ × ÓÒ × ÜÔÖ × Ø ÑÔÓ ÓÖÖ ×ÔÓÒ Ò ÐÓ× Ú ÐÓÖ × Ñ × Ö ÒÓ× Ð ÒØÖÓ Ð ÒØ ÖÚ ÐÓ ÓÒ¬ ÒÞ Ý Ù ÖÓÒ Ö Ð Þ Ó× ×Ó Ö ÙÒ ÁÒØ Ð È ÒØ ÙÑ ÁÁÁ ¼¼ Å Þº Å × ×Ó Ö ÖÕÙ Ø ØÙÖ × Ö ÒØ × ¹ËÔ Ö Ý ÅÁÈ˹¸ ×ØÙ Ó× ×Ó Ö × × Ó× Ô Ö Ú Ö ¬ Ö ÓÒ × Ð ×ÔРݸ ÓØÖ × Ñ ØÖ × ¹ÒÙÑ ÖÓ ÖÓØ ÓÒ ×¸ ÔÓÖ ÑÔÐÓ¹ Ý Ò Ð × × Ñ × Ü Ùר ÚÓ× ÙÒ ×Ø Ò Ô Ò ÒØ × Ý × ÙÒ ÑÔÓ ÖØ Ð Ô Ö ØÖ Óº
  • 569.
    6.7. Conclusi´n o 543 ¼ ÎÄ 3 ¼ ÊÓ Ó¹Ò ÖÓ + Ð ØÓÖ Þ Ó 2 2 × ÌÖ Ô × × 2 ¼ ËÔÐ Ý 2 2 × × Ò ÖÓ 2 2 2 × ¼ ÐØÙÖ Ñ Ò Ñ Ð 2 2 × × Ø × Ù × Ö ¿¼ 2 × × × 2 2 + 3 + 3 3 + × 3 3 + + ¾¼ 2 2 + + 3 + 3 × × × + 3 + 3 2 + 3 3 3 + ½¼ × 2 3 3 3 2 + + × 2 × 3 + + 3 3 + + × × 3 + 2 2 3 + 3 3 + 2 × + 2 ¼32 × + ¼ ½¼ ½ ¾¼ n=2 k ÙÖ º¿½ ÐØÙÖ Ö ÒØ × Ä Ñ ÒÓÖ ÙÖ ÓÒ Ñ ÒØÖ Ð × ØÖ × Ö Ô Ø ÓÒ × × ÓÒ× Ö ÓÑÓ Ð Ø ÑÔÓ ÙÖ ÓÒº ÄÓ ÒØ Ö ÓÖ × Ö Ô Ø Ó Ú × × Ö¸ × Ò Ö ÖÓÒ × Ù Ò × Ð ØÓÖ × Ò× Ö ÓÒº Ä × Ö ¬ × ÓÖÖ ×ÔÓÒ Ò ÐÓ× ÔÖÓÑ Ó׺ Ä ¬ ÙÖ º¿½ ÐÙ×ØÖ Ð × ÐØÙÖ × ÐÓ× × × Ø ÔÓ× ×ØÙ Ó× Ô Ö × Ù Ò × Ò× Ö ÓÒ Ð ØÓÖ ×º ר Ñ × ÙØ Ð ÔÓÖÕÙ ÒÓ× ÙÒ Ð Ó×ØÓ Ñ Ü ÑÓ ÒÚÓÐÙ Ö Ó Ò Ð Ù×ÕÙ º Ò ×Ø × ÒØ Ó¸ Ð ¬ ÙÖ º¿½ Ú Ò Ý ÓÒ¬ÖÑ Ð Ø ÓÖ Ö ÕÙ ÐÓ× Ö ÓÐ × ÖÓ Ó¹Ò ÖÓ Ý ÎÄ ×ÓÒ ÐÓ× ÕÙ Ø Ò Ò Ñ ÒÓ× ÐØÙÖ º Ä ×ÓÖÔÖ × ×Ø Ö ¬ × ÕÙ ¸ Ð Ñ ÒÓ× Ô Ö ÒØÖ × Ð ØÓÖ ×¸ ÐÓ× Ö ÓÐ × ÖÓ Ó¹Ò ÖÓ ÒÓ Ð ÒÞ Ò Ð ÓØ Ø ÓÖ 2 Ð (n + 1) − 2º Ð ÐÓÒ ØÙ Ð Ñ ÒÓ ÒØ ÖÒÓ ÒÓ× Ò Ù Ò ÕÙ Ð Ö Ó ×Ø Ð Ö Óк Ò ×Ø × ÒØ Ó Ð ¬ ÙÖ º¿¾ Ú Ò ÕÙ Ð Ð ØÓ Ó× ÐÓ× Ö ÓÐ × × ÕÙ Ú Ð ÒØ ¸ × Ò Ó Ð Ö Ñ ÒØ ÚÓÖ Ð ÐÓ× Ö ÓÐ × ÎÄ Ý ÖÓ Ó¹Ò ÖÓº Ä × ¬ ÙÖ × º¿½ Ý º¿¾ × ÓÒ Ò Ð Ó×ØÓ Ð ÓÔ Ö ÓÒ ×ÔÐ Ý Ô Ö ÐÓ× Ö ÓÐ × Ð Ñ ×ÑÓ ÒÓÑ Ö ¸ ÔÙ × Ð ÜÔ Ö Ñ ÒØÓ ÒÓ ÓÒ× Ö Ò ÑÙÐ Ð ÐÓ Ð Ö ÖÒ º Ò ×Ø × ÒØ Ó¸ Ô Ö ÕÙ × Ù ÐÕÙ Ö ÒØÖ Ð × Ð Ú × Ø Ò Ð Ñ ×Ñ ÔÖÓ Ð Ù× Ö× ¸ ÒØÓÒ × Ð Ö ÓÐ ×ÔÐ Ý × Ð Ñ × ÔÓ Ö × ÑÔ ÒÓº È ÖÓ ×ØÓ × ÔÙ × Ö Ð Ó×Ó¸ ÔÙ × Ð ÐÓ Ð Ö Ö Ò Ù ÙÒ ÖÓÐ ÙÒ Ñ ÒØ Ð Ò Ð Ñ ÝÓÖ Ð× ÔÐ ÓÒ ×º Ò ÐÓ× Ö ÓÐ × ÐØÙÖ ÓØ ¸ ÐÓ× ÔÖÓ Ð ×Ø Ó× Ý ÐÓ× Ò Ö Ó× Ð × Ó׸ Ð × Ð Ú × Ñ × Ö ÒØ × Ø Ò Ò Ò ÓÒØÖ Ö× Ð × Ó × Ñ ÒØÖ × Ñ × ÓÚ Ò × ÙÒ Ð Ú ¸ Ñ ÝÓÖ × Ð Ø ÑÔÓ ×Ô Ö Ó Ù×ÕÙ º ×ØÓ ÒÓ ×Ù ÓÒ ÙÒ Ö ÓÐ ×ÔÐ Ý Ð × Ð Ú × Ö ÒØ Ñ ÒØ × × Ò Ù ÒØÖ Ò Ö Ò × Ð Ö Þ¸ ÔÓÖ ÐÓ ÕÙ Ð × ÑÔ ÒÓ Ö × Ö ÓÒ× Ö Ð Ñ ÒØ Ñ ÓÖ Ô Ö ÔÐ ÓÒ × ÓÒ ÐÓ Ð Ö ÖÒ º Ä × ÙÖ ÓÒ × Ò× Ö ÓÒ Ý Ð Ñ Ò ÓÒ Ô Ö ÐÓ× Ö ÓÐ × ×ÔÐ Ý ÒÓ × ÑÙ ×ØÖ Ò ÔÓÖÕÙ ×ÓÒ Ø Ò ÒÓØ Ð Ñ ÒØ ×ÙÔ Ö ÓÖ × Ð Ö ×ØÓ ÕÙ ×Ù Ú ×Ù Ð Þ ÓÒ Ó ×Ø ÙÐ Þ Ö ÔÖ Ö Ð × Ö Ò × ÒØÖ Ð × Ñ × ÙÖÚ ×º Ë Ò ÐÓ× Ò Ó Ò ÓÕÙ × ÕÙ Ð Ö Ó Ó Ö Ò × ÑÔ ÒÓ× O(Ð n) Ô Ö Ð × ØÖ × ÓÔ ¹
  • 570.
    544 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u 1.07374e+09 AVL Rojo−negro Aleatorizado Treap 3.35544e+07 Binario Splay IPL mínimo 1.04858e+06 32768 IPL 1024 32 1 0.03125 0 5 10 15 20 2**k ÙÖ º¿¾ ÁÈÄ Ô Ö Ö ÒØ × ´ Ò × Ð ÐÓ Ö ØÑ µ Ö ÓÒ × ÙÒ Ñ ÒØ Р׸ × ÖÙ Ð Ó × ÖÚ Ö ÕÙ Ô Ö Ð Ò× Ö ÓÒ Ý Ð Ñ Ò ÓÒ ØÓ Ó× ×ØÓ× Ò ÓÕÙ × ÕÙ Ð Ö Ó ÖÖ Ò Óר × ÓÒר ÒØ × × Ú Ö Ñ ÒØ Ñ ÝÓÖ × ÕÙ ÐÓ× ÙÒ Ð × Óº Ä × ¬ ÙÖ × º¿ Ý º¿ Ú Ò Ò Ö Ñ Ø Ñ ÒØ ר ×Ô ØÓ Ð Ð× Ó × Ð Ñ × Ö Ô Ó ×Ø 2 19 ÒÓ Ó× Ô Ö Ð Ò× Ö ÓÒ Ý 2 14 ÒÓ Ó× Ô Ö Ð Ð Ñ Ò ÓÒº Ô ÖØ Ö ×ØÓ× Ú ÐÓÖ ×¸ Ð Ð × Ó × Ð Ö Ñ ÒØ Ò Ö ÓÖ Ô ÖÓ × Ø Ò Ù ÒÓ ÓÑÓ Ð ÖÓ Ó¹Ò ÖÓ Ý Ð Îĺ È Ö ×Ø ÙÐØ Ñ Ó × ÖÚ ÓÒ ÒÓ × ÓÐÚ Ö ÕÙ ÐÓ× ÓÖ Ò × Ò× Ö ÓÒ ×ÓÒ Ð ØÓÖ Ó׺ Ò Ð × Ð ÓÒ ÙÒ Ö ÓÐ ÒÓ × ×ÔÖ Ö Ð Ù×Ó ÙÒ Ð × Óº Ò Ø Ð × ÒØ Ó¸ ÙÒ ÓÒ× Ö Ö× ÒØ × ÕÙ Ù Ð ×ÕÙ Ö ÐÓ× Ñ ØÓ Ó× ÕÙ Ð Ö Ó × ÖÖÓÐÐ Ó× Ò ×Ø Ô ØÙÐÓº Ä × Ð ÓÒ ÙÒ ÓÒ× Ö Ö ÐÓ× × Ù ÒØ × ×Ô ØÓ× ½º Ä × Ð Ò ÙÒ ÓÒ Ð ÒÙÑ ÖÓ ÒÓ Ó× × Ô ÕÙ Ò Ó Ñ Ò º ¾º Ä × × Ù Ò × Ò× Ö ÓÒ ÒÓ Ò ×Ø Ö ÓÒ× Ö Ð Ñ ÒØ × × ×¸ ÔÙ × ÙÒ × O(Ð n) Ô Ö Ò× Ö ÓÒ × Ð ØÓÖ ×º Ë Ð × × Ù Ò × Ò× Ö ÓÒ ×ÓÒ Ð ØÓÖ ×¸ ÒØÓÒ × × ÔÙ ÓÒ× Ö Ö ÙÒ Ô Ö Ö Ò × × Ð ×º ¿º ÈÙ ×ØÓ ÕÙ Ð × Ð Ñ Ò ÓÒ × Ö Ò ÙÒ ¸ Ð ÒÙÑ ÖÓ Ð Ñ Ò ÓÒ × ×Ö ÑÙ Ó Ñ ÒÓÖ ÕÙ Ð Ò× Ö ÓÒ ×º º Ð × ÑÔ ÒÓ O(Ð n) × ÔÖÓ Ð ×Ø Óº ÙÒ ÓÒ Ò× Ö ÓÒ × Ð ØÓÖ × Ý Ù× Ò Ð Ñ Ò ÓÒ ×¸ ÙÒ ÔÙ Ü Ö ÙÒ ×Ó × ÓÖØÙÒ Óº ÈÓÖ ÐÓ Ø ÒØÓ¸ ÙÒ ÒÓ ÙØ Ð Þ Ö× × Ü ×Ø Ò Ö ÕÙ Ö Ñ ÒØÓ ×ÓÐÙØÓ× × ÑÔ ÒÓº Ä ×Ù Ý ÒØ ÐÓ× Ò ÓÕÙ × Ð ØÓÖ Þ Ó× × Ð Ñ Ò Ö Ù ÐÕÙ Ö × × Ó Ò Ð Ò× Ö ÓÒ Ó Ð Ñ Ò ÓÒ Ñ ÒØ × ÓÒ × Ð ØÓÖ × ÕÙ Ð ØÓÖ Þ Ò Ð Ö ÓÐ Ò ÓÐÓ ÕÙ Ú Ð ÒØ ÙÒ ÓÒרÖÙ Ó Ô ÖØ Ö ÙÒ × Ù Ò Ð Þ Öº ÓÒ× Ù ÒØ Ñ ÒØ ¸ × ÔÙ ÑÔÐ Ö ÙÒ Ö ÓÐ Ð ØÓÖ Þ Ó Ó ÙÒ ØÖ Ô Ù Ò Ó × Ø Ñ × × Ó Ò Ð ÒØÖ º ÈÙ ×ØÓ
  • 571.
    6.7. Conclusi´n o 545 ´ µ ÌÖ Ô ´ µ Ð ØÓÖ Ó ´ µ ËÔÐ Ý ´ µ ÎÄ ´ µ ÊÓ Ó¹Ò ÖÓ ÙÖ º¿¿ Ö ÒØ × ÑÓ ÐÓ× ÕÙ Ð Ö Ó Ý ×Ù× Ö ÓÐ × Ö ×ÙÐØ ÒØ × Ô Ö Ð Ñ ×Ñ × ÙÒ 512 Ð Ú × Ð ØÓÖ ×
  • 572.
    546 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u ½ ÎÄ 3 2 ½ ÊÓ Ó¹Ò ÖÓ + 2 Ð ØÓÖ Þ Ó 2 2 2 ½¾ ÌÖ Ô × 2 Ò ÖÓ 2 ½¼ 2 2 2 × × μ× × 2 × × × 3 + 23 3 + × × 3 3 + 2 2 + + 2 × × 3 3 3 + + 2 2 2 × 3 + 3 + 2 2 2 2 2 2 × × + × 3 3 + ¾× 3 3 3 3 3 3 3 3 3 3 + × × × + 3 × × × × × × + + + + + + + + + + ¼ ¼ ½¼ ½ ¾¼ n=2 k ÙÖ º¿ Ì ÑÔÓ Ò× Ö ÓÒ Ô Ö Ö ÒØ × ÕÙ Ð × ÑÔ ÒÓ × ÔÖÓ Ð ×Ø Ó¸ × Ö ÒØ Þ Ö Ð Ð Ð Ò Ö ÓÖ ÒÙÑ ÖÓ× Ô× Ù Ó Ð ØÓÖ Ó׺ ÙÒ ÓÒ ÙÒ Ù Ò Ò Ö ÓÖ ÒÙÑ ÖÓ× Ð ØÓÖ Ó׸ Ð × ÑÔ ÒÓ ÙÒ Ò ÓÕÙ Ð ØÓÖ Þ Ó × ×Ù× ÔØ Ð Ð Ò ÓÖØÙÒ Óº × Ô٠׸ ÐÓ× ÕÙ Ð Ö Ó× ÔÖÓ Ð ×Ø Ó× ÒÓ Ò Ù× Ö× × × ÔÖ × ÒØ Ò Ö ×ØÖ ÓÒ × Ù ÖØ × × ÑÔ ÒÓº Ä × ¬ ÙÖ × º¿ Ý º¿ Ú Ò Ò Ð Ö ÓÐ Ð ØÓÖ Þ Ó ÓÑÓ ÙÒÓ ÐÓ× Ñ × ÓרÓ×Ó׺ Ó¸ Ô Ö Ð Ò× Ö ÓÒ¸ × ÔÖ ÙÒ Ö ÓÒ ÔÖ Ð ÓÒ ÓÖÑ ÙÑ ÒØ Ð ÒÙÑ ÖÓ ÒÓ Ó׺ Ö ÓÒ ÕÙ ÒÓ Ó ÙÖÖ ÓÒ Ð ÓØÖ ÐØ ÖÒ Ø Ú Ð ØÓÖ Þ Ð ØÖ Ôº Ò Ð ÓÔ Ò ÓÒ Ð ÙØÓÖ¸ ×ØÓ × ÜÔÐ Ð ÔÓÖ Ð × × Ù ÒØ × Ö ÞÓÒ × ½º ÄÓ× Ö ÓÐ × Ð ØÓÖ Ó× ×ÓÒ Ñ × × Ò× Ð × Ð Ð Ð Ò Ö ÓÖ ÒÙÑ ÖÓ× Ð ØÓ¹ Ö Ó× ÕÙ ÐÓ× ØÖ Ô׺ ÄÓ× Ö ÕÙ Ö Ò ÒÙÑ ÖÓ× Ð Þ Ö ÒØÖ ÖÓ Ý Ð Ö Ò Ð Ð Ö ÓÐ Ñ ÒØÖ × ÕÙ Ð × ÔÖ ÓÖ × ÐÓ× ØÖ Ô× ÙØ Ð Þ Ò ØÓ Ó Ð ×Ô ØÖÓ Ð Ò Ö ÓÖ ÒÙÑ ÖÓ× Ð ØÓÖ Ó׺ ר Ó × ÑÔÓÖØ ÒØ ÓÒ× Ö Ö ÔÓÖÕÙ Ð Ö Ò Ó Ö ×ØÖ Ò Ó ÐÓ× Ö ÓÐ × Ð ØÓÖ Ó× ÐÓ Ñ × × Ò× Ð ÐР׸ × × Ó× Ý Ñ × ÑÔ Ö ÓÒ × Ð Ò Ö ÓÖ ÒÙÑ ÖÓ× Ð ØÓÖ Ó׺ ÇØÖÓ ×Ô ØÓ ÓÒ× Ö Ö × ÕÙ Ð ØÖ Ô ØÙ ÑÙ × Ñ ÒÓ× ÐÐ Ñ × Ð Ò Ö ÓÖ ÒÙÑ ÖÓ× Ð ØÓÖ Ó× ÕÙ Ð º Ð ØÖ Ô Ò Ö ÙÒ Ð ØÓÖ Ó ÙÒ ×ÓÐ Ú Þ ÔÓÖ Ò× Ö ÓÒ Ñ ÒØÖ × ÕÙ Ð ØÙ ×ÓÖØ Ó× Ò Ð Ò× Ö ÓÒ Ý Ò Ð Ð Ñ Ò ÓÒº Ñ ×¸ Ð ÔÙ Ö Ð Þ Ö Ú Ö Ó× ×ÓÖØ Ó× Ò ÓÔ Ö ÓÒº Ä ÒØ ×Ô Ö ×ÓÖØ Ó× Ô Ò Ð Ö ÒÐ Ð Ö ÓÐ Ñ ÝÓÖ ÒØ ÒÓ Ó׸ Ñ ÝÓÖ Ð ÒÙÑ ÖÓ ×Ô Ö Ó ×ÓÖØ Ó׺ ר ÓÒ× Ö ÓÒ × × Ò Ð¸ ÔÙ × ÑÙ Ó× Ò Ö ÓÖ × ×Ù Ö Ò Ø Ò Ð × ÒØ Ó ÕÙ ×Ù Ð ØÓÖ ×Ñ ÒÙÝ ÓÒ ÓÖÑ ÙÑ ÒØ Ð ÒÙÑ ÖÓ ÐÐ Ñ ×º ¾º ÄÓ× Ð ÓÖ ØÑÓ× Ð ØÖ Ô ×ÓÒ Ñ × × ÑÔÐ × Ý Ø Ò Ò Ñ ÒÓ× Óר × ÓÒר ÒØ × ÕÙ ÐÓ× Ð º Ä × Ù× ÓÒ ÒØ Ö ÓÖ Ú Ò Ð Ö Ñ ÒØ ÕÙ × Ü ×Ø Ò Ö ×ØÖ ÓÒ × Ò× ÐÚ Ð × × ÑÔ ÒÓ Ý × ÒÓ Ý ×Ô Ó Ô Ö Ð Ñ Ð ×Ù ÖØ ¸ ÒØÓÒ × Ð × Ó Ò ØÓ ×
  • 573.
    6.8. Notas bibliogr´ficas a 547 2 2 × ÎÄ 3 × ÊÓ Ó¹Ò ÖÓ + 2 × 3 Ð ØÓÖ Þ Ó 2 2 + 3 ÌÖ Ô × 2 + Ò ÖÓ × × 3 + 2 × 3 3 + 2 + 3 2 × + 3 μ× × 2 3 + × + 3 × + 3 2 ¿ + 2 × 3 + ¾ 3 3 2 3 3 + × × 3 3 3 + + 2 + 2 + 2 2 3 3 3 3 3 + + × × × × 2 + + + + + 2 × 2 2 2 × × × × × 2 ½ × 2 ¼ ½¼ ½ ¾¼ n=2 k ÙÖ º¿ Ì ÑÔÓ Ð Ñ Ò ÓÒ Ô Ö Ö ÒØ × ÙÒ Ö ÓÐ ÓÒ ÐØÙÖ ÓØ ÙÒ ÎÄ Ó ÙÒ ÖÓ Ó¹Ò ÖÓº Ë × × ÙÒ ÑÔÐ Ñ ÒØ ÓÒ × Ò ÐÐ Ý ÕÙ Ü Ù Ò Ø ÑÔÓ¸ ÒØÓÒ ×¸ Ò Ð ÓÔ Ò ÓÒ Ð ÙØÓÖ¸ ÐÓ× ØÖ Ô× ×ÓÒ Ð Ñ ÓÖ ÐØ ÖÒ Ø Ú º Ò ÐÑ ÒØ ¸ × × Ø Ò ÓÒÓ Ñ ÒØÓ ÙÒ Ù Ò ÐÓ Ð Ö ÖÒ ¸ ÒØÓÒ × Ð × ÑÔ ÒÓ ÐÓ× Ö ÓÐ × ×ÔÐ Ý ÔÙ × Ö ×Ô Ø ÙÐ Öº 6.8 Notas bibliogr´ficas a Ä ×ØÓÖ ÐÓ× Ò ÓÕÙ × ÕÙ Ð Ö Ó ÙÒ Ö ÓÐ ÓÑ ÒÞ ÔÓÖ ÐÓ× Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ Ð × Ó׺ ÔÖ Ò Ô Ó ½ ¼¸ ÐÓ× ÒÚ ×Ø ÓÖ × Ý × Ò ÕÙ Ð × ÔÖÓÑ × × × ÑÔ ÒÓ ÙÒ ×ÓÐÓ Ö Ò Ú ÒØ × ÓÒ ÓÒ Ø Ò Ö × Ù Ò × Ò× Ö ÓÒ Ð ØÓÖ × Ý ÒÓ Ó ÙÖÖ Ö Ü × Ú × Ð Ñ Ò ÓÒ ×º Ò ½ ¾ × ÔÙ Ð ÖÓÒ ÐÓ× Ö ÓÐ × ÎÄ ÔÓÖ Ð×ÓÒ Î Ð× Ý Ý Ä Ò × ½ º À ר Ö ÒØ ¹ Ñ ÒØ ¸ רÓ× Ö ÓÐ × Ô ÖÑ Ò ÖÓÒ Ð × Ó Ò ØÓ Ò Ð ÑÔÐ ÒØ ÓÒ Ø Ð × × Ñ ÓÐÓ× Ò Ñ ÑÓÖ ÔÖ Ò Ô Ðº ÙÒ ÓÝ Ò ¸ ר Ð × Ö ÓÐ × Ù× Ö Ù ÒØ Ñ ÒØ Ý ÓÒ ÓÖÑ Ð ×Ø Ò Ö ÑÙ × ÔÐ ÓÒ ×º Ð ÒÙÑ ÖÓ ϕ × ÑÙÝ ÑÔÓÖØ ÒØ Ò ÑÙ Ó× ÐÙ Ö × Ð × Ñ Ø Ñ Ø ×º × ÔÖÓ Ð ÕÙ ×Ù Ù×Ó ÔÖÓÚ Ò Ð ÑÙÒ Ó ÖØ ר Ó Ô٠׸ × Ø ÑÔÓ× ÒÑ ÑÓÖ Ð ×¸ ϕ × Ó ÓÒ× Ö Ó ÓÑÓ Ð Ñ × ÐÐ ÔÖÓÔÓÖ ÓÒ ÒØÖ Ó× Ö ÒØ × Ø Ñ ÒÓ׺ × Ö Ïº ¹ ×ØÖ ÜÔÓÒ ÐÓ× ÒÙÑ ÖÓ× ÓÒ Ý Ð × ÓÒ ÙÖ ÓÖ ÒØ Ð× Ò × ÓÑÔÙØ ÓÒ Ð × º ר ÔÖÓÔÓÖ ÓÒ ×Ø ÓÒÑ Ò × ÒØ Ñ ÒØ ÔÖ × ÒØ ÐÓ Ð Ö Ó ØÓ Ð Ò ØÙÖ Ð Þ ¸ Ð Ò ØÓÑ ÙÑ Ò ¸ Ò ÐÙ× Ú º ÓÑÓ ÑÔÐÓ× Ú Ò Ó×Ó׸ Ð ÓÑ Ð Ó × ÓÒ× Ö Ó ÔÓÖ ÐÓ× × ÙÐØÓÖ × ÓÑÓ Ð Ú × ÓÒ Ò ØÙÖ Ð ØÓ Ó Ð Ù ÖÔÓº ÈÙ × Ò¸ Ð ×Ø Ò × Ð ×Ù ÐÓ Ð ÓÑ Ð Ó¸ Ú ÒØÖ Ð ×Ø Ò × Ð ÓÑ Ð Ó ×Ø Ð Þ × ϕº Ð Ñ ×ÑÓ ÑÓ Ó¸ Ü Ø Ñ ÒØ Ð Ñ ×Ñ ÔÖÓÔÓÖ ÓÒ × ÔÖ × ÖÚ ÒØÖ Ð Þ Ý Ð ÕÙ ÓÒ ϕ ר Ù Ó Ò Ð ÔÙÒØ Ð Ò Ö Þº ÌÓ × Ð × Ô ÖØ × Ð Ù ÖÔÓ ÙÑ ÒÓ Ö ×Ô Ø Ò ×Ø ÔÖÓÔÓÖ ÓÒº Ä ÔÖÓÔÓÖ ÓÒ Ò Ù ×Ø ÓÒ × ÕÙ ¸ Ð Ú Ö ÙÒ × Ñ ÒØÓ Ò Ó× Ô ÖØ ׸ ÑÓ× x y¸ × × Ø × Ð × Ù ÒØ Ù ÓÒ x+y = y º Ë × Ö Ð Þ Ð ØÖ Ò× ÓÖÑ ÓÒ ϕ = y × Ø Ò Ð Ù ÓÒ Ú Ò x x x
  • 574.
    548 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u ¬Ò Ð × ½ ¼ ÒÚ ×Ø ÓÒ × Ò Ö ÙÔ Ö ÓÒ Ð Ú × Ò ÐÑ Ò Ñ ÒØÓ × ÙÒ¹ Ö Ó ÓÒ Ù ÖÓÒ ÙÒ ÒÙ Ú Ý ÔÓÔÙÐ Ö Ð × Ö ÓÐ Ð ¸ × Ù ÖØÓ ÔÓÖ Ý Ö º ר Ð × Ö ÓÐ Ò ÖÓ ÙÒ ÓÖÖ ÒØ ÒÚ ×Ø ÓÒ ÕÙ ÓÒ Ù Ó Ú Ö× × ×ØÖÙ ØÙÖ × Ù×ÕÙ Ò Ñ ÑÓÖ ÔÖ Ò Ô Ð¸ ÒÓØ Ð Ñ ÒØ Ð Ö ÓÐ ¾¹¿ × Ù ÖØÓ ÔÓÖ ÀÓÔ ÖÓ Ø Ý × Ö ØÓ ÔÓÖ Ó¸ ÀÓÔ ÖÓ Ø Ý ÍÐÐÑ Ò ¾ Ý Ð Ö ÓÐ Ò Ö Ó × Ñ ØÖ Ó ÕÙ × ÙÒ ×Ó Ô ÖØ ÙÐ Ö Ð Ö ÓÐ × Ù ÖØÓ ÔÓÖ Ý Ö ¿ º ÄÓ× Ö ÓÐ × ÖÓ Ó¹Ò ÖÓ ×ÓÒ ÙÒ ÕÙ Ú Ð ÒØ Ò Ö Ó ÙÒ Ø ÔÓ Ö ÓÐ Ù Ø ÖÒ Ö Ó ÒÓÑ Ò Ó ÔÓÖ Ý Ö ¾¹¿¹ º ÁÑÔÐ ÒØ Ö Ö ÓÐ × ¾¹¿¹ Ò Ñ ÑÓÖ × ÓÑÔÐ Ó ÔÓÖÕÙ Ò ÙÒ ÒÓ Ó Ò Ñ ÒØ Ò Ö× Ð Ú × ÓÖ Ò × Ý ÔÙÒØ ÖÓ× ÐÓ× Ó׺ ר Ð Ö ØÓÖ × ÑÔÓÖØ ÒØ ÔÓÖÕÙ Ð × ÑÓ×ØÖ ÓÒ × Ö Ð Ö ÒØ Ð Ò ÔÙ Ò Ö Ð Þ Ö× Ö Ø Ñ ÒØ ÓÒ ÐÓ× Ö ÓÐ × ¾¹¿¹ º Ò½ ¸ Ù ×ÝË Û ÔÖÓÚ ÖÓÒ ÙÒ ×ÓÑÓÖ¬×ÑÓ ÒØÖ ÐÓ× Ö ÓÐ × ¾¹¿¹ Ý ÐÓ× Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ Ý ÒÙÒ ÖÓÒ Ð Ö ÓÐ Ó ØÓ ר × ÓÒ Ð Ö ÓÐ ÖÓ Ó¹Ò ÖÓº Ô ÖØ ÕÙ × Ñ × Ð ÑÔÐ ÒØ Ö ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ ÕÙ ÙÒ Ö ÓÐ ¾¹¿¹ ¸ Ð ¬Ò ÓÒ º ר Ð ÙÒ Ò ÓÕÙ ÓÑ Ò ØÓÖ Ó¸ Ò ØÙÖ Ð¸ Ô Ö Ú Ö ÔÓÖ ÕÙ ÐÓ× Ö ÓÐ × ÖÓ Ó¹Ò ÖÓ ×ÓÒ Ð Ò Ó׺ ÏÓÓ ½ ¸ Ó Ö ÙÒ Ü Ð ÒØ × Ñ Ô Ö×Ô Ø Ú ÐÓ× Ö ÓÐ × ÖÓ Ó¹Ò ÖÓ × Ò ×Ù× ÔÖÓÔ × ÖÓÑ Ø × Ó Ð Ù Ð × ÓÒר ØÙÝÓ Ð × ÙÖ×Ó ×Ø Ø ÜØÓº ÄÓ× ØÖ Ô× Ù ÖÓÒ × Ù ÖØÓ× ÔÓÖ ÎÙ ÐÐ Ñ Ò Ò ½ ½ Ý ×ØÙ Ó× Ò ÔÖÓ ÙÒ ÔÓÖ Ë Ð Ý Ö ÓÒ ½¿ º ÈÓÖ ×Ù × ÑÔ ÒÓ Ý × Ò ÐÐ Þ¸ ר Ð × Ö ÓÐ × Ð × Ð ÓÒ ÚÓÖ Ø ÑÙ × ÔÐ ÓÒ ×º ÅÙ × Ö Ò × × ×ÓÒ × ÑÔÐ × Ý Ò ØÙÖ Ð × ÓÒ ÓÒ ÕÙ Ý Ý Ò × Ó Ö Ú ¹ Р׺ ÍÒ ÒÓØ Ð ÑÔÐÓ ÐÓ ÓÒר ØÙÝ Ò ÐÓ× Ö ÓÐ × Ð ØÓÖ Þ Ó× × Ù ÖØÓ× ÔÓÖ Å Ö¹ Ø Ò Þ Ý ÊÓÙÖ º ÙÖ ÒØ × ÐÓ× Ø ÓÖ Ó× Ù× ÖÓÒ ÙÒ ×ØÖÙ ØÙÖ Ð ØÓÖ Ò ØÙÖ Ð ÕÙ Ö ×ÓÐÚ × Ð × Ñ ØÖ Ð Ð Ñ Ò ÓÒ ÙÒ º Ô × Ö Ð ØÖ Ô ÎÙ ÐÐ Ñ Ò ½ Ý ÕÙ Ë Ð Ý Ö ÓÒ Ý Ò ÑÓ×ØÖ Ó ×Ù Ð ØÓÖ Ý ÕÙ Ú Ð Ò ÓÒ Ð ½¿ ¸ Ð Ö ÓÐ Ð ØÓÖ Þ Ó × ÙÒ ×ØÖÙ ØÙÖ Ò ØÙÖ Ð ÕÙ ÔÓÒ Ö ÔÖÓ Ð ×Ø Ñ ÒØ × ÙÒ Ð ÕÙ Ð Ö Ó Ù ÖØ Ï ÖØ ½ º × ÔÖ Ò Ô Ó× Ð ÓÑÔÙØ ÓÒ¸ ÐÓ× × Ò ÓÖ × × ×Ø Ñ × Ò ÙØ Ð Þ Ó Ð Þ¹ Ñ ÒØ ÙÖ ×Ø × ÙØÓ¹ Ùר ÒØ × ÕÙ ÑÙ Ú Ò Ð Ñ ÒØÓ× Ö ÒØ Ñ ÒØ Ó× ÔÓ× ¹ ÓÒ × Ö Ô Ó ×Óº × Ð × Ù Ö Ñ ÒØÓ Ð Ò× Ö ÓÒ ÔÓÖ Ð Ö Þ ½ ¸ ÑÙ Ó× ÔÖÓ Ö Ñ ÓÖ × Ù× ÖÓÒ ×Ø ×Ô ØÓ Ô Ö ÔÖÓÚ Ö Ð ÐÓ Ð Ö Ö Ò º È ÖÓ ÒÓ Ù ×Ø ½ ¸ Ù Ò Ó ËÐ ØÓÖ Ý Ì Ö Ò ÔÙ Ð ÖÓÒ ÐÓ× Ö ÓÐ × ×ÔÐ Ý ½ ¸ ÕÙ × ×ÔÙ×Ó ÙÒ Ö ÓÐ ÐÓ Ö ØÑ Ó Ò Ð × ÒØ Ó ÑÓÖØ Þ Óº Ò Ò ÙÖ ¸ ר Ù ÙÒÓ ÐÓ× ÔÖ Ñ ÖÓ× ×ØÙ Ó× ÓÒÚ Ò ÒØ × ×Ó Ö Ð Ò Ð × × ÑÓÖØ Þ Óº 6.9 Ejercicios ½º Ù ÒØÓ× ÒÓ Ó× Ø Ò Ð Ö ÓÐ Ð ¬ ÙÖ º½´ µ ϕ 2 − ϕ − 1 = 0º ÈÙ ×ØÓ ÕÙ Ð Ñ ÝÓÖ ×ÓÑÓ× Ö Ý ÒØ ׸ Ò ÓÒÓÖ Ó׸ Ö ÓÖ Ð ÍÒ Ú Ö×Ó ¹Ý Ð ÀÓÑ Ö Ò ÐÙ× Ú ¹ ϕ × ÐÐ Ñ Ó Ð ÒÙÑ ÖÓ Ú ÒÓ¸ Ð ÒÙÑ ÖÓ Ó׸ Ð Ö Ó ÓÖÓ Ó¸ ÖØ ר Ñ ÒØ ¸ Ð × ÓÒ ÙÖ ¸ ÔÙ × Ô Ö ÕÙ Ù Ð ÔÖÓÔÓÖ ÓÒ ÕÙ Ó× ÙØ Ð ÞÓ Ô Ö Ö Ö ÒÙ ×ØÖÓ ÑÙÒ Óº Ð ÒÓÑ Ö ϕ × Ò ÓÒÓÖ ×¸ ÓÒ× Ö Ó Ð Ñ × Ö Ò × ÙÐØÓÖ Ð ÒØ Ù Ö ¸ ÙØÓÖ Ð ×Ø ØÙ Ù× Ò Ð ÑÓÒØ ÇÐ ÑÔÓ¸ Ö Ð Þ Ñ Ö¬Ð Ý ÓÖÓ¸ ÔÖÓÜ Ñ Ñ ÒØ Ò Ð ÒÓ ¼ º º ר Ó Ö ¸ Ù Ò ÐÙ ÔÓÖ Ð ÔÓ Ø ÒØ Ô Ø Ö Ë ÓÒ¸ Ò ×Ù Ð Ö Ð ×Ø Ð × × Ø Ñ Ö Ú ÐÐ × Ð ÑÙÒ Ó ÒØ ÙÓº
  • 575.
    6.9. Ejercicios 549 ¾º × Ò Ð ÖÙØ Ò select gotoup root() ÔÖ × ÒØ Ò Ü º½ ´Ô Ò µ Ò ÙÒ ÓÒ Ð ÔÖÓ Ñ ÒØÓ insert by pos xt(()) ÜÔÐ Ó Ò Ü º½½º ´Ô Ò ¿ µº ¿º ÙØ Ð × × Ù ÒØ × × Ù Ò × Ò× Ö ÓÒ Ò ÙÒ Ö ÓÐ Ð ØÓÖ Óº ´ µ ½¾ ½ ¿ ¿¼ ½ ½ ½ ¼ ½¾ ¿ ½½ ½½¼ ½¿ ½ ½ ½ ½½ ½½¾ ½ ½ ´ µ ½ ¿ ½½ ¿ ½½½ ½¾ ½ ½¼½ ½¾ ¿ ½¾ ½ ½ ¾½ ½ ½¿ ½ ½ ½ ´ µ ½ ½ ½ ¾ ½¼ ½ ½ ½ ¿ ½¾ ½¼¾ ½¿ ½ ¾ ¿ ½ ½½ ½ ½ ¾ ½ ´ µ ½¼ ½¼ ¿ ½ ½ ¼ ½¿ ¿ ½ ¾ ½ ½ ½¼¼ ½½¾ ½ ¾ ½ ½ ¿ ½ ¼ ¿¿ ´ µ ½¾¿ ½ ¿ ½¿ ½ ¼ ½½ ½ ¼ ¾ ½¿ ¿ ½ ½ ½ ½¼ ¾ ½¼½ È Ö ØÓ × Ð × × Ù Ò ×¸ ×ÙÑ Ð × Ù ÒØ × Ù Ò ÒÙÑ ÖÓ× Ð ØÓÖ Ó× ÒØÖ ½ Ý ½¼¼ ¿½ ¿ ¾ ½½ ½¼ ¿ ¿ ¾¿ ¿ ½ ¿¼ ¿½ ½ ½¾ ¿ ¿¾ ¼ ¿ ¿¾ ½ ¿ ¿ ½ ¾ ½¾ ½¿ ½ ¿ ½½ ¼ ¿¿ ¾ ½¿ ¿¼ ¾½ ½ ¿ ½ ¿ ½ ¿½ ¾¿ ¼ ¿ ¿¼ ¿ ¿ ¼ ½ ¿ ¼ ½ ¿¼ ¾ ¾¿ ¿ ¼ ¿¿ ½¼ ¾¾ ¿ ¿¾ ¾ ½ ¼ ¿ ½¾ ½¼ ½¼ ¾ ¿ ¾ ¾½ ¾ ½ ¾ ½ ¿ ¿ ¾ ¾¼ ¼ ¿½ ¾¼ ¼ ¿ ½¿ ½¿ ½ ¼ ¿ ¿ ¿ ¿ ¿¾ ½ ½ ½ ¼ ¿¾ ¾ ½ ½¾ ¾ ¿¿ ¾ º È Ö ÐÓ× × Ù ÒØ × Ö ÓÐ × Ð ØÓÖ Ó׸ ¬Ò Ó× ÔÓÖ ×Ù× Ö ÓÖÖ Ó× ÔÖ ¬ Ó׸ ÙØ Ð × × Ù Ò × Ð Ñ Ò ÓÒ × ´ µ Prefijo: ½½ ½ ½ ½ ½¼¾ ¿ ¼ ½ ¿ ½¼¿ ½¾ ½¾ ½ ¼ ½ ½ ¿ ½ ¾ ½ ¼ ½ ½ Secuencia de eliminaci´n: o ½¾ ½ ½ ½½ ½¾ ½ ¼ ½ ½ ½¼¾ ½ ¿ ´µ Prefijo: ½ ½ ¿ ½¼ ¼ ¿¿ ¿½ ¾¾ ¼ ½ ¾ ½ ½ ½ ½ ½½¾ ½¿ ½ ½ Secuencia de eliminaci´n: o ¿½ ½ ¾¾ ½ ½¼ ½½¾ ½ ½ ½ ½ ´µ Prefijo: ½¿¾ ¿ ¾ ½¾ ¼ ¾ ½¼ ½¼¾ ½ ¿ ½¿ ½ ½ ½ ½ ½ Secuencia de eliminaci´n: o ½ ½ ½ ½ ¾ ½ ¿ ´µ Prefijo: ¾ ¾½ ½¿ ¿¼ ¿ ½ ½ ½¿¾ ½¼ ½¼½ ½ ¾ ½ ¼ ½ ½ Secuencia de eliminaci´n: o ¾ ½¿¾ ½¿ ½¼½ ½ ¼ ½ ½ ´µ Prefijo: ½ ¼ ¿ ¿ ¿ ½¿ ¿ ¾ ¿ ½½ ½ ¼ ½¾ ½¾¾ ½ ½¿ ½ ¾ ½ ½ Secuencia de eliminaci´n: o ¼ ¿ ½¾ ½ ¼ ½ ¾ ½¾¾ ½ ¿ ½¿ È Ö ØÓ Ó× ÐÓ× Ö Ó× ×ÙÑ Ð × Ù ÒØ × Ù Ò ÒÙÑ ÖÓ× Ð ØÓÖ Ó× ÒØÖ ½ Ý ½¼¼ ½ ¿ ½¼¼ ¿ ¾¼ ¿ ¾ ½ ½¼¼ ¼ ¼ ½ ½ ¾½ ¾ ¼ ¼ ¿ ½ ¾¿ ¼¿ ¾ ¿¿ ¿ ¼ ¿½ ¾ ¿ ½¾ ½ ¿ ¿ ¾½ ¿ ¾ ¼ ¿ ½¼¼ ¿ ¿ ½¼ ½¿ ½¼¼ ½ ¿ ¼ ¿ ¿ ½ ¼ ¿¼ ¿¼ ¿ ¾ ¿ ½ ¾ ½¾ ½¾ ¾ ¿¼ ¼ ¿ ¿¾ ¿ ¿ ½ ½ ¼ ¼½ ¼ ¿ ½¾ ½ ¾ ¾½ ¾ ¾ ¾ ¾ ¾ ¼½ ¼ ½ º ×ØÙ Ð × ÑÔ ÒÓ Ð × Ù ÒØ Ð ÓÖ ØÑÓ Ô Ö Ð Ñ Ò Ö Ò ÙÒ Ö ÓÐ Ð ØÓÖ Þ Óº Ë Ð ÒÓ Ó Ð Ñ Ò Ö ×Ø Ò ÓÑÔÐ ØÓ¸ ÒØÓÒ × × ØÙ Ð Ð Ñ Ò ÓÒ ØÖ ÓÒ Ðº Ë ¸ ÔÓÖ Ð ÓÒØÖ Ö Ó¸ Ð ÒÓ Ó ×Ø ÓÑÔÐ ØÓ¸ ÒØÓÒ × × Ö Ð Þ ÙÒ ×ÓÖØ Ó Ô Ö × Ó Ö Ù Ð ÐÓ× ÒÓ Ó׸ Ð ÔÖ ×ÓÖ Ó Ð ×Ù ×ÓÖ¸ × Ö ÒØ Ö Ñ Óº Ð ÔÖ ×ÓÖ Ø Ò Ö ÙÒ ÔÖÓ Ð 1 | Ä(T)| × Ö × Ð ÓÒ Ó¸ Ñ ÒØÖ × ÕÙ Ð ×Ù ×ÓÖ ØÒÖ ÙÒ ÔÖÓ Ð | Ê(T)| º ÈÖÙ 1 Ó × ÔÖÙ ÕÙ Ð Ö ÓÐ Ö ×ÙÐØ ÒØ × Ð ØÓÖ Óº ´·µ
  • 576.
    550 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u º Ò Ð Ù Ó× Ñ ÒØ Ð Ð ÓÖ ØÑÓ Ò× Ö ÓÒ Ò ÙÒ Ö ÓÐ Ð ØÓÖ Þ Ó Ý ×Ø Ñ Ð ÒØ ×Ô Ö ×ÓÖØ Ó× ÙÒØÓ ÓÒ ×Ù Ú Ö ÒÞ º º Ò Ð Ù Ó× Ñ ÒØ Ð Ð ÓÖ ØÑÓ Ð Ñ Ò ÓÒ Ò ÙÒ Ö ÓÐ Ð ØÓÖ Þ Ó Ý ×Ø Ñ Ð ÒØ ×Ô Ö ×ÓÖØ Ó× ÙÒØÓ ÓÒ ×Ù Ú Ö ÒÞ º º ÓÑÓ × Ñ Ò ÓÒ Ó¸ ÙÒÓ ÐÓ× ÔÖÓ Ð Ñ × ÐÓ× Ö ÓÐ × Ð ØÓÖ Þ Ó× × ÕÙ × Ö Ð Þ Ò ÑÙ Ó× ×ÓÖØ Ó× ÕÙ Ò ÕÙ Ð Ò Ö ÓÖ ÒÙÑ ÖÓ× Ð ØÓÖ Ó× Ð¹ Ò ×Ù ÔÙÒØÓ Ø Ñ × Ö Ô Ñ ÒØ º ÈÖÓÔÓÒ ÙÒ ×ÕÙ Ñ ÕÙ Ñ Ò Ñ Ð × ÔÓ× Ð × Ø Ð Ò Ö ÓÖ ÒÙÑ ÖÓ× Ð ØÓÖ Ó׺ º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ò Ö ÙÒ Ö ÓÐ Ù×ÕÙ Ð ØÓÖ Ó × Ö¸ ÕÙ ÓÖÖ ×¹ ÔÓÒ Ð ¬Ò ÓÒ Ö ÓÐ Ð ØÓÖ Ó Ò Ü º¾ ´Ô Ò µº ½¼º ÓÒ× Ö Ð × Ù ÒØ ÔÖÓØÓØ ÔÓ ÙÒ ÓÒ template <class Node> luka_to_tree(char *& cod) Ð Ù Ð Ö ØÓÖÒ Ð Ö ÓÐ Ò Ö Ó ÓÖÖ ×ÔÓÒ ÒØ Ð Ô Ð Ö ÄÙ × Û Þ ÐÑ ¹ Ò Ò cod ´Ú Ö Ü º ´Ô Ò ¿¾½µµº ×ÙÑ ÕÙ Ð Ô Ð Ö × ÓÖÖ Ø º × Ö Ð ÙÒ ÓÒ Ò Ù ×Ø ÓÒº ½½º Ê Ð Ð × ÔÖÙ × ×Ø ר × Ô ÖØ Ò ÒØ × Ô Ö Ú Ö ¬ Ö × Ð ×ÓÖØ Ó Ò× Ö ÓÒ Ò Ð Ö Þ × ×ØÖ ÙÝ ÓÒ ÔÖÓ Ð p = n+1 º 1 ½¾º Ê Ð Ð × ÔÖÙ × ×Ø ר × Ô ÖØ Ò ÒØ × Ô Ö Ú Ö ¬ Ö × Ð ×ÓÖØ Ó Ô Ö Ð × Ð ÓÒ Ð Ö Þ Ð Ð ÓÖ ØÑÓ ÓÒ Ø Ò ÓÒ Ð ØÓÖ × ×ØÖ ÙÝ ÓÒ ÔÖÓ Ð p = m¸ ÓÒ m × Ð 1 ÒØ ÒÓ Ó× Ð Ö ÓÐ ÞÕÙ Ö Óº ½¿º × Ò ÙÒ Ð ÓÖ ØÑÓ ÙÒ ÓÒ Ó× Ö ÓÐ × Ð ØÓÖ Ó× T1 Ý T2 Ø Ð ÕÙ Ð Ú × Ô ÖØ Ò ÒØ × T1 ÔÙ Ò × Ö Ñ ÝÓÖ × ÕÙ Ð ÙÒ × Ð Ú × Ô ÖØ Ò ÒØ × T2º Ð Ð ÓÖ ØÑÓ × Ö O(n Ð (n))º ½º × Ò ÙÒ Ð ÓÖ ØÑÓ ÙÒ ÓÒ Ó× Ö ÓÐ × Ð ØÓÖ Ó× T1 Ý T2 Ø Ð ÕÙ Ð Ú × Ô ÖØ Ò ÒØ × T1 ÔÙ Ò × Ö Ñ ÝÓÖ × ÕÙ Ð ÙÒ × Ð Ú × Ô ÖØ Ò ÒØ × T2º Ð Ð ÓÖ ØÑÓ × Ö O(n Ð (n))º ½º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ö Ð Ð Ò× Ö ÓÒ ÔÓÖ ÔÓ× ÓÒ Ò ÙÒ Ö ÓÐ Ð ØÓÖ Þ Óº Ð Ö ÓÐ Ö ×ÙÐØ ÒØ × Ö Ð ØÓÖ Óº ÑÙ ×ØÖ ×Ù Ö ×ÔÙ ×Ø º ´·µ ½º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ö Ð Ð Ð Ñ Ò ÓÒ ÔÓÖ ÔÓ× ÓÒ Ò ÙÒ Ö ÓÐ Ð ØÓÖ Þ Óº Ð Ö ÓÐ Ö ×ÙÐØ ÒØ × Ö Ð ØÓÖ Óº ÑÙ ×ØÖ ×Ù Ö ×ÔÙ ×Ø º ´·µ ½º × Ò ÙÒ Ì ÕÙ Ú Ð ÒØ Gen Rand Tree<Key> Ò Ð Ù Ð ØÓ × Ð × ÓÔ Ö ÓÒ × ÒÓ × Ò Ö ÙÖ× Ú ×º ½º ÙØ Ð × × Ù ÒØ × × Ù Ò × Ò× Ö ÓÒ Ò ÙÒ ØÖ Ô ´ µ ¾½ ¾½ ½ ½¾¿ ½ ½¾ ½ ¼ ½½ ½ ¾ ½¼ ¿¿ ¿ ¿ ´ µ ½½ ¾ ½¾ ½¼ ½ ½¼¼ ½ ¾ ½ ½ ¼ ½¾ ½ ¿ ´ µ ½ ½ ½ ½ ½¾¼ ½ ¾ ½½ ½¾¿ ½ ½ ½ ½ ½ ¿½ ½¼ ½ ¿ ½ ¾ ½
  • 577.
    6.9. Ejercicios 551 ´ µ ½¿¼ ½ ½ ¾ ½ ¾ ½¾ ½¾ ½ ¿ ¼ ½¾¾ ½¿ ½ ¼ ½ ½ ¿¼ ½ ½ ¿ ´ µ ½ ½ ¿ ½¾¼ ½ ½ ½ ¼ ½ ½ ½¿ ¾ ½½ ½½ ¾½ ½¼ ½¼ ½ ¼ ½ ½ ½ È Ö ØÓ × ÐÓ× Ö Ó׸ Ù× Ð × Ù ÒØ × Ù Ò ÒÙÑ ÖÓ× Ð ØÓÖ Ó× ¿¿ ½ ¾¿ ½ ¼½ ¿ ¿ ¿ ¾ ¾½ ¼ ½ º È Ö ÐÓ× × Ù ÒØ × ØÖ Ô׸ ¬Ò Ó× ÔÓÖ ×Ù× Ö ÓÖÖ Ó× ÔÖ ¬ Ó׸ ÙØ Ð × × Ù Ò × Ð Ñ Ò ÓÒ × ´µ Prefijo: ½ ¾¾ ½ ½ ½¾ ¿¼ ¿ ½¾ ½¾ ½½ ½½¿ ½½½ ½ ¼ ½ ¿ ½ ½ Secuencia de eliminaci´n: ½ o ¾¿ ½ ½½ ½½½ ¼ ½ ½ ½ ´µ Prefijo: ½ ¾ ¿¾ ½ ¿ ½ ½¾ ¼ ½¼¾ ½¾ ½½ ½¼ ½¿ ½ ½ ½ ¾ Secuencia de eliminaci´n: o ½¼¼ ¿½ ½ ¼ ½ ½¼ ½ ½¼ ¾ ¿¾ ´µ Prefijo: ¿ ½¿ ½ ¼ ½¿¿ ½½¾ ½ ½ ¿ ½ ½ ½ ½ ½½¿ ¿ Secuencia de eliminaci´n: o ½¿¿ ½ ½ ½ ½ ½ ½½ ´µ Prefijo: ½ ¼ ¿ ¾ ½ ½½¼ ½¼¾ ¿ ½¾ ½ ½ ½ ½ ½ ½ ½ ½ ½ Secuencia de eliminaci´n: o ¾¾ ¿ ¿ ¿ ½½ ½ ¼ ½¾¿ ½¾¿ ¾ ´µ Prefijo: ½¾¾ ½½¿ ¾ ¾¾ ¾ ¾ ½ ¾ ½¿¿ ½¾ ½ ¿ ½¿ ½ ½ ½ ½ ½ ½ ½ Secuencia de eliminaci´n: o ½ ¼ ¾ ½ ¼ ¾ ½½ ½ ¾¼º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÓÒרÖÙÝ ÙÒ ØÖ Ô Ó× × Ò Ó× ÖÖ ÐÓ× ÓÒ Ð Ú × Ý ÔÖ ÓÖ ×º Ð Ð ÓÖ ØÑÓ ÒÓ ÔÙ Ù× Ö Ð × ÔÖ Ñ Ø Ú × Ð ØÖ Ôº ¾½º × Ò ÙÒ Ì ÕÙ Ú Ð ÒØ Gen Treap<Key> Ò Ð Ù Ð ØÓ × Ð × ÓÔ Ö ÓÒ × ÒÓ × Ò Ö ÙÖ× Ú ×º ¾¾º × Ò ÙÒ Ð ÓÖ ØÑÓ O(n Ð (n)) ÕÙ ØÙ Ð ÙÒ ÓÒ Ó× ØÖ Ô׺ ¾¿º × Ò ÙÒ Ð ÓÖ ØÑÓ O(n Ð (n)) ÕÙ ØÙ Ð ÒØ Ö× ÓÒ Ó× ØÖ Ô׺ ¾º × Ò ÙÒ Ð ÓÖ ØÑÓ O(n Ð (n)) ÕÙ ØÙ Ð Ô ÖØ ÓÒ ´×ÔРص Ó× ØÖ Ô׺ ¾º ÓÒ× Ö ÙÒ ØÖ Ô Ò Ð Ù Ð Ð ÔÖ ÓÖ ×Ø ÔÓÖ Ð ÒÙÑ ÖÓ ×Ó׺ Ñ ÝÓÖ ÒÙÑ ÖÓ ×Ó׸ Ñ ÒÓÖ × Ð ÔÖ ÓÖ º ר ÑÓ Ó Ð ØÖ Ô Ú Ò Ö ÙØÓ Ùר ÒØ Ò Ð × ÒØ Ó ÕÙ Ð × Ð Ú × Ö ÒØ Ñ ÒØ × × Ò ÓÒØÖ Ö Ò Ò Ð Ö Þº ×ØÙ Ý ÓÑÔ Ö ×Ø Ñ ØÓ Ó ÓÒ Ð × Ð ÓÒ Ð ØÓÖ ÔÖ ÓÖ ×º ¾º ÓÒ× Ö Ð Ò× Ö ÓÒ ÔÓÖ Ð Ö Þ ÙÒ ØÖ Ô Node * insert_root(Node * r, Node * p) Ä Ù Ð Ò× ÖØ Ð ÒÓ Ó p¸ ÓÒ Ð Ú K(p) Ý ÔÖ ÓÖ ×Ó Ð ØÓÖ Ñ ÒØ P(p)¸ ız Ð ØÖ Ô rº como ra´ ´ µ ÁÒרÖÙÑ ÒØ Ð Ð ÓÖ ØÑÓ ÕÙ ÑÔÐ ÒØ insert root()º ´ µ ×ÙÑ Ò Ó ÕÙ Ð Ú ÐÓÖ P(p) × ÙÒ Ó Ò Ð ØÖ Ô Ö ×ÙÐØ ÒØ ¸ ÑÙ ×ØÖ ÕÙ Ð Ð ÓÖ ØÑÓ Ð ÔÖ ÙÒØ ÒØ Ö ÓÖ Ò Ö ÙÒ ØÖ Ôº
  • 578.
    552 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u ¾º ÙØ Ð × × Ù ÒØ × × Ù Ò × Ò× Ö ÓÒ Ò ÙÒ Ö ÓÐ ÎÄ ´ µ ¾¿ ¾¼ ½ ½ ½ ½¼ ½¿ ¾¼ ½ ½ ¿ ½ ¾¿½ ½ ¾¿ ¾ ½¿ ¿¼ ½ ¾ ¼ ¿ ´ µ ¾¼ ¾¾ ¾½ ¿ ½¾ ¾¾½ ¾¿¼ ½ ¾ ¾¼½ ¾¼ ¾½¾ ½ ¿ ½¿ ¾½ ½¾¾ ½ ´ µ ¾ ½ ½½¿ ½ ½ ½ ½ ¾ ½ ¾¾¿ ½¼ ½¾¾ ½ ½ ½¼¼ ½½ ½ ¾½ ¾ ½ ¾¾ ½ ¾ ½¾¿ ¾¾ ¾ ¾½¾ ´ µ ½ ¾ ½ ¿ ¾½¿ ¾¿¼ ¾ ½½ ½ ½ ¾¿½ ¼ ½ ¿ ½¼ ¾¾ ¾ ½¾ ½¿¾ ½ ½¿ ´ µ ¿ ¾¿ ½ ¾ ¾ ½ ¾ ½ ½¼ ¿¼ ½ ¼ ¾ ½ ¾¿¾ ¿ ½ ¼ ½ ¼ ½¼¼ ½¿¿ ¼ ¾ ½¿ ½¾ ½ ¾¿ ½½ ¾¿ ¾ º È Ö ÐÓ× × Ù ÒØ × Ö ÓÐ × Îĸ ¬Ò Ó× ÔÓÖ ×Ù× Ö ÓÖÖ Ó× ÔÖ ¬ Ó׸ ÙØ Ð × × Ù Ò × Ð Ñ Ò ÓÒ × ´µ Prefijo: ½¿ ½¼¿ ¾ ¾¾ ½ ½¾ ¼ ½¾¿ ½¾½ ½¾ ½¿ ½ ½ ½ ¾ ½ ¾ ½ ½ ½ ¿ ½ ¾¼ ½ ¾¿ Secuencia de eliminaci´n: o ½¾¿ ½¾½ ½ ½ ½¿ ½ ¿ ½¾ ¾¾ ¾¼ ¾ ½ ´µ Prefijo: ½¾ ½ ¾ ¾½ ¾ ¾ ¿ ½½ ¾¼ ½ ½ ½ ¿ ½ ½ ¾ ½ ¼ ¾¾ ¾½½ ¾½¿ ¾ ¾¿ Secuencia de eliminaci´n: o ½ ¾ ¾½½ ¾ ¾¿ ½¾ ¾ ½ ¾½ ´µ Prefijo: ½½¼ ¾ ½½ ½ ¾½ ¿ ½ ¼ ½¼¾ ½ ½ ½ ¿ ½ ½ ½ ½ ¾ ½ ½ ½ ¾½ ¾½¼ ¾¼ ¾¾ ¾¾ ¾¿¼ Secuencia de eliminaci´n: ¼ ¾½ o ¾¾ ½ ½ ¿ ½½ ½ ¾ ½ ¾ ½ ´µ Prefijo: ½ ½ ½¿ ½½ ¿ ½ ½ ¼ ½¾ ¾½ ¾¼¿ ½ ½ ¿ ¾¼½ ½ ¾ ¾½¿ ¾¼ ¾¿¾ ¾¿½ ¾¾ ¾ ¿ Secuencia de eliminaci´n: ½ ¾¾ ¾½¿ ¾¼ o ½ ½ ¾¿½ ½½ ´µ Prefijo: ½ ¾ ½¿½ ¾ ½½¼ ½¼ ½½ ½ ½ ½ ½¿ ½ ¾ ½ ½ ½ ½ ½ ¿ ½ ¼ ¾¾¾ ¾¼½ ¾½ ¾ ¾¿ ¾¿½ ¾ Secuencia de eliminaci´n: ½ ½¿½ ¾¼½ ½ o ½ ½ ¼ ½ ¾ ¾½ ¾¿ ½ ¾ ½ ¾ºË ÒÓ Ó ÙÒ Ö ÓÐ ÎÄ ÐÑ Ò ×Ù ÐØÙÖ ¸ Ù ÒØÓ× Ø× × Ö ÕÙ Ö Ò ¿¼º Ð ÙÐ Ð ÓÑÔÐ Ø ÑÔÓ Ð ÙÒ ÓÒ is avl()º ¿½º ÁÑÔÐ ÒØ ÒØ Ö Ñ ÒØ ÙÒ Ì ÕÙ ÑÓ Ð Ö ÓÐ × ÎÄ Ò Ð Ù Ð ÒÓ Ó Ù Ö ×Ù ÐØÙÖ º ´·µ ¿¾º × Ò ÙÒ Ð ÓÖ ØÑÓ O(n Ð (n)) ÕÙ ØÙ Ð ÙÒ ÓÒ Ó× Ö ÓÐ × Îĺ ¿¿º × Ò ÙÒ Ð ÓÖ ØÑÓ O(n Ð (n)) ÕÙ ØÙ Ð Ô ÖØ ÓÒ ´×ÔРص Ó× Ö ÓÐ × Îĺ ¿ º × Ò ÙÒ Ð ÓÖ ØÑÓ O(n Ð (n)) ÕÙ ØÙ Ð ÒØ Ö× ÓÒ Ó× Ö ÓÐ × Îĺ ¿ º × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ø ÖÑ Ò × ÙÒ Ö ÓÐ Ò Ö Ó × ÓÒ º Ð ÙÐ ×Ù ÓÑÔÐ Ø ÑÔÓº ¿ º × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ò Ö Ð Ö ÓÐ ÓÒ ÓÖ Ò kº
  • 579.
    6.9. Ejercicios 553 ¿º´ ÅÓ ÚÖ ¹ ½ ½ µ ÑÙ ×ØÖ ÕÙ √ (n + 1) 1+ 5 ÐÑ n→∞ (n) = 2 . ÓÒ (i) × Ð ¹ × ÑÓ ÒÙÑ ÖÓ ÓÒ º ¿º Ç Ø Ò ÙÒ ÜÔÖ × ÓÒ ÕÙ ÒÓØ Ð ÒÙÑ ÖÓ Ó × ÙÒ Ö ÓÐ ÓÒ º ¿º ÑÙ ×ØÖ ÕÙ Ð Ò× Ö ÓÒ Ò ÙÒ Ö ÓÐ ÎÄ Ù× ÐÓ Ñ × ÙÒ ÖÓØ ÓÒ Ó Ð º ¼º ÜÔÐ ÕÙ Ý × ÖÖÓÐÐ ÙÒ Ñ ØÓ Ó Ô Ö Ö ÓÒרÖÙ Ö ÙÒ Ö ÓÐ ÎÄ Ó Ð Ö ÓÖÖ Ó Ò¬ Ó Ð × Ð Ú × Ý ÐÓ× Ú ÐÓÖ × ÖÒ ÐØÙÖ ÒÓ Óº ½º ÑÙ ×ØÖ ÕÙ Ô Ö ØÓ Ó Ö ÓÐ Îĸ Ü ×Ø ÙÒ ÓÐÓÖ ÓÒ ÖÓ Ó¹Ò ÖÓº ´·µ ¾º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ü Ñ Ò ÙÒ Ö ÓÐ Ò Ö Ó Ù ÐÕÙ Ö Ý Ø ÖÑ Ò × × ÓÐÓÖ Ð º ¿º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÓÐÓÖ ÖÓ Ó¹Ò ÖÓ ÙÒ Ö ÓÐ Ù ÐÕÙ Ö ÕÙ Ý Ô × Ó Ð Ø ×Ø Ð Ö Ó ÒØ Ö ÓÖº º ÙØ Ð × × Ù ÒØ × × Ù Ò × Ò× Ö ÓÒ Ò ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ ´ µ ½ ¾ ½¼ ½ ½ ½½ ½ ½½ ½ ½ ¾½ ½ ½¾ ½ ¾½¿ ½ ½ ¿ ´ µ ½½¼ ½ ½ ½ ¼ ½¼ ½¾ ¾ ¼ ¼ ¿ ½¼ ½ ¾¼ ½ ¿ ½ ½ ½¼½ ¾¼ ½ ½ ´ µ ½ ¾ ½ ¿ ¿½ ½¾ ¾¿ ¼ ¾ ½¾ ½ ½ ½¿¿ ½¿ ¾ ¿¾ ¿ ½¼¾ ¾¼¼ ¾¾¼ ¼ ´ µ ¾¾ ¾¾ ½ ½ ½ ½ ¾½ ¾ ¼ ¾¾ ¾¿ ½ ¼ ½ ¿ ¾ ¾ ½ ½ ¾ ½ ¾ ¾¾ ½ ´ µ ½ ¾ ½¼ ¼ ¾ ½½ ½¾ ¾¾½ ½¾¾ ½ ½¼ ½¾ ¾ ½ ¾¼ ¾½ ½ ¾½¿ ¿¾ ¾ ½ ¾ º È Ö ÐÓ× × Ù ÒØ × Ö ÓÐ × Îĸ ¬Ò Ó× ÔÓÖ ×Ù× Ö ÓÖÖ Ó× ÔÖ ¬ Ó׸ ÙØ Ð × × Ù Ò × Ð Ñ Ò ÓÒ × ´µ Prefijo: ½ ½ ¿ ¼ ¼ ½ ¿ ½¾ ½¼ ½ ½ ½ ¿ ½ ½ ½ ½ ¿ ¾ ¾½ ¾½ ¾½½ ¾¿¾ ¾¾ ¾¿ ¾ ¾ ¾ ¾ ¼ ¾ Secuencia de eliminaci´n: ¾ ½ ¿ ½ ¾¾ ½¼ ½ o ¼ ¾½ ½ ½¾ ¾ ¼ ¾½ ¾ ´µ Prefijo: ½ ¼ ¿ ¾¼ ½ ¾ ¿¾ ½¿¿ ½ ½¿ ½ ¾ ¾ ¾½¿ ½ ½ ½ ½ ¼ ¾ ¾ ¾ ¼ ¾ ¾ ¾ ¾ ¾ ¾ Secuencia de eliminaci´n: ¾ ¾ ¾ ½ ¼ ¾ ½ ¿¾ ¾ ¼ ¾ ¾ ½¿¿ ¾ ¾½¿ ¾ ¾ ½ o ½ ´µ Prefijo: ½¾ ¾ ¿ ½¾ ¿½ ¾ ¿ ½¼ ¿ ½¾ ¾ ½ ½ ½ ½ ¼ ½ ¿ ½ ¼ ½ ½ ¿ ¾¾ ¾¾ ¾ ¾ ¾ ¾ ½ ¾ ½ ¾ Secuencia de eliminaci´n: ½ ¾ ½ o ¾ ¿½ ½¾ ¾ ½ ½ ¿ ½ ½¾ ¾ ½ ½ ¼ ¾ ½¼ ´µ Prefijo: ½ ¾¿ ½¿ ½¼ ¾¾ ¿ ¿¼ ½½ ¿ ½¿ ½¿ ½ ½ ¾ ¾ ½ ½ ½ ½ ¾¾ ½ ¾¾ ¾ ¾¾ ¾ ½¾ ¾ Secuencia de eliminaci´n: ¾ ¾¾ ¾ ¾ ¾ ¾ ½¿ ¾ ¾ ½ ½¿ ½ ¾ ¿ ½ ½ ½¿ o ´µ Prefijo: ½¼ ¿ ¾½ ¿ ¿ ¼ ½ ¿ ¼ ¼ ¿ ¾ ¾¾ ½ ½¾ ½¾ ½½¼ ½¿¼ ½ ½ ¿ ½ ¾¾ ½ ¾ ¿ ¾¿ ¾ ¼ ¾
  • 580.
    554 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u Secuencia de eliminaci´n: o ½ ½¾ ½¿¼ ¿ ½ ¿¾ ¾ ¿½ ½¿ ½ ¾ ¾½ º ´ÌÓÑ Ó Ý ØÖ Ù Ó È Ö ÖÖÝ ½¾ µ Ù ÙÒ Ö ÓÐ ÎÄ Ô Ö Ð Ù Ð Ð Ð Ñ¹ Ò ÓÒ ÙÒ ÒÓ Ó Ö ÕÙ Ö Ó× ÖÓØ ÓÒ × Ó Ð ×º Ù Ð Ö Óи ÒØ ¬ÕÙ Ð ÒÓ Ó Ð Ñ Ò Ö Ý ÜÔÐ ÕÙ ÔÓÖÕÙ Ó× ÖÓØ ÓÒ × ×ÓÒ Ò × Ö × Ý ×Ù¬ ÒØ ׺ ´·µ º ÓÒ× Ö Ð × Ù ÒØ ÔÖÓØÓØ ÔÓ Ù×ÕÙ template <typename T> int search(T a[], const T & x, int n) a × ÙÒ ÖÖ ÐÓ ÓÖ Ò Ó n Ð Ñ ÒØÓ× Ò Ð Ù Ð × Ù× Ð Ð Ú xº Ð ¬Ò ר ÔÖÓ Ð Ñ × ÑÔÐ ÒØ Ö ÙÒ ×ÕÙ Ñ Ù×ÕÙ ÒÓÑ Ò Ó ¹ ÓÒ ¸ Ð Ù Ð ×ØÖÙ ØÙÖ Ð × Ó × ÖÚ ÓÒ × ×Ó Ö Ð ÖÖ ÐÓ Ð × Ù ÒØ Ñ Ò Ö ÒÖÐ 0 1 2 3 4 5 6 7 8 9 10 Base T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 Fk × Ð k¹ × ÑÓ ÒÙÑ ÖÓ ÓÒ º i × Ð ÔÓ× ÓÒ Ò×Ô ÓÒ ØÙ и Ñ ÒØÖ × ÕÙ p Ý q ×ÓÒ ÐÓ× ÒÙÑ ÖÓ× ÓÒ ÓÖ Ò ÒÑ Ø Ñ ÒØ Ò Ö ÓÖ iº Ä Ð ×ÕÙ Ñ Ù×ÕÙ × ÓÑÔ Ö Ö x ÓÒ a[i] ݸ × x != a[i]¸ ÒØÓÒ ×¸ × ÙÒ ÕÙ x × Ñ ÒÓÖ Ó Ñ ÝÓÖ a[i]¸ ×ÔÐ Þ Ö ÐÓ× ÒØ ÖÚ ÐÓ× Ù×ÕÙ ÙÒ ÒØ ÖÚ ÐÓ Ñ ÒÓÖ Ó Ñ ÝÓÖ ÕÙ iº ´ µ ×ÙÑ Ò Ó ÕÙ n + 1 = Fk+1¸ × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÑÔÐ ÒØ Ð Ù×ÕÙ ÓÒ º ÝÙ ½ ÐÓ× Ò × q Ý p × ÑÔÖ ×ÓÒ ÒÙÑ ÖÓ× ÓÒ× ÙØ ÚÓ× ÓÒ ¸ Ñ ÒØÖ × ÕÙ × ÒÓ × ÑÔÖ × Ð ×Ó Ô Ö Ð Ò iº ÝÙ ¾ Ð Ú ÐÓÖ Ò Ð i × Fkº ÝÙ ¿ Ä ÓÒ ÓÒ Ô Ö × ÕÙ x != a[i] Ý q == 0 or p == 1º × Ö¸ Ð Ð Ñ ÒØÓ ÒÓ × Ò Ù ÒØÖ Ý ÒÓ × ÔÓ× Ð ×ÔÐ Þ Ö Ð ÒØ ÖÚ ÐÓ × Ò ÕÙ × ×Ð Ð ÖÖ ÐÓº ´ µ Ò Ð Ð Ø ÑÔÓ Ù ÓÒ Ð Ù×ÕÙ ÓÒ º ´ µ ÓÑÓ ÔÙ Ö× × n + 1 = Fk+1 º ´ÌÓÑ Ó Ý ØÖ Ù Ó È Ö ÖÖÝ ½¾ µ ÑÙ ×ØÖ ÕÙ ∀n ∈ N Ü ×Ø ÙÒ Ö ÓÐ ÎÄ Ô Ö Ð Ù Ð Ð Ð Ñ Ò ÓÒ ÙÒ ÒÓ Ó Ö ÕÙ Ö Ü Ø Ñ ÒØ n ÖÓØ ÓÒ ×º ÁÒ ÕÙ ÓÑÓ × ÓÒרÖÙÝ Ø Ð Ö Óи Ò ÕÙ Ñ Ò Ö Ò Ö Ð Ð ÒÓ Ó Ð Ñ Ò Ö Ý ÜÔÐ ÕÙ ÔÓÖÕÙ n ÖÓØ ÓÒ × ×ÓÒ Ò × Ö ×º º × Ò ÙÒ Ð ÓÖ ØÑÓ O(n Ð (n)) ÕÙ ØÙ Ð ÙÒ ÓÒ Ó× Ö ÓÐ × ÖÓ Ó¹Ò ÖÓº ¼º × Ò ÙÒ Ð ÓÖ ØÑÓ O(n Ð (n)) ÕÙ ØÙ Ð Ô ÖØ ÓÒ ´×ÔРص Ó× Ö ÓÐ × ÖÓ Ó¹ Ò ÖÓº ½º × Ò ÙÒ Ð ÓÖ ØÑÓ O(n Ð (n)) ÕÙ ØÙ Ð ÒØ Ö× ÓÒ Ó× Ö ÓÐ × ÖÓ Ó¹Ò ÖÓº ¾º ÙØ Ð × × Ù ÒØ × × Ù Ò × Ò× Ö ÓÒ Ò ÙÒ Ö ÓÐ ×ÔÐ Ý
  • 581.
    6.9. Ejercicios 555 ´ µ ½ ¿ ¾¾¼ ¾¼ ½¿ ¾¼ ¾ ¾ ½ ¾ ½ ¾ ¿½ ½ ½¾ ½ ¾¿ ½ ½ ¾ ¿ ¾ ¼¾ ½½ ½ ¼ ¼ ¾ ¼ ½½ ´ µ ¿ ½ ¾ ½¼ ¾ ¼ ½¼ ¾¼ ¿¾ ½ ½ ¾ ½ ¼ ¿ ¿¼ ½ ½ ½¼½ ¾ ¿ ¾¼ ¿ ½ ½ ¿ ½ ¿ ´ µ ½¿ ¾¼¼ ½ ½ ½ ¿ ¾¿ ¾¾½ ¿ ¿¿ ¾½ ¾¾ ¾ ¾½ ¾ ½ ¾ ¾ ¿ ½¼¼ ½ ¾ ½ ¾ ¾ ½ ¿ ¾¼ ¿ ¾ ¾ ½ ´ µ ½½¾ ½¾ ½ ¾¿ ¾ ¾¾ ¿ ¾¾ ¾ ¼ ½ ¾ ¾¿ ¿ ¾¿¾ ½½ ½ ¾ ½¿ ¾¾ ¿¿ ¾ ¾¾ ½ ½ ½½½ ´ µ ¾ ½ ½ ½ ¾¼ ¾ ½¾½ ½¾ ½¼ ¾ ½ ½ ¾ ¾ ¿ ½½ ½½ ½ ¾ ¿ ¾ ¾¼ ½ ¾¿ ¾¿ ½ ½ ½ ¼ ½¿ ¾ ½ ½¼ ¿º È Ö ÐÓ× × Ù ÒØ × Ö ÓÐ × Îĸ ¬Ò Ó× ÔÓÖ ×Ù× Ö ÓÖÖ Ó× ÔÖ ¬ Ó׸ ÙØ Ð × × Ù Ò × Ð Ñ Ò ÓÒ × ´ µ Prefijo: ½ ¾½ ¿ ¾ ¾ ¾ ¿ ¾¾ ¾¼ ½¿¼ ½ ½ ¾ ¾ ¾ ½ ¾¿ ¾¿¼ ¾ ¾ ¼¾ ¾ ¼¾ ½¾ ¾ Secuencia de eliminaci´n: ¾ ¾ ¾ ½ o ¿ ¾¾ ½ ¾¿ ¿ ¾¼ ¾½ ´ µ Prefijo: ¾ ¾ ½¼ ¿ ½ ½ ¼ ¿ ½ ¼ ¾¿ ½ ¼ ¾¿½ ½ ¼ ½ ¾ ½ ½ ¾¼ ¾¾ ¾½½ ¾½ ¾ ¾ ¼ ¾ ¼ ¾ ½ ¾ ¿ Secuencia de eliminaci´n: ½¼ ¼ o ¾ ½ ½ ¾ ½ ¼ ¿ ½ ½ ¼ ¾¿½ ¾ ¾ ¼ ¾ ¿ ´µ Prefijo: ¾½ ¾½ ½ ½ ½ ½ ½¿¼ ½¾¾ ¾¿ ½ ½¼ ¾ ¼ ¿ ½½¿ ½ ½ ½ ¾¼¾ ¾¼¼ ¾½¿ ¾¿ ¾ ¾ ¾ ½ ¾ ¾ ¾ ¾ Secuencia de eliminaci´n: ¾ ¾½¿ ½ ½¾¾ o ¿ ½ ¾¿ ¾ ¾ ¾ ½ ½ ¾½ ´ µ Prefijo: ¼ ½¼ ½ ¾ ½ ¿¼ ¾¾ ¾ ½ ¿ ¼ ½ ½ ¿ ½¿½ ½½ ½ ¿ ¾¿ ½ ½ ½¾ ¾ ¾¾ ½¾ ¿¾ ¾ Secuencia de eliminaci´n: ½ ½¼ ¼ ¾ ¼ ½ ¾¿ o ¾ ½ ¿ ¾ ½½ ¾ ´µ Prefijo: ¼ ¾ ¾¼ ½ ½¾ ¾ ½ ¾ ¿ ½¿ ½¿ ¼ ½¼ ½½ ½ ¾ ½ ¾¾¾ ¾½¿ ½ ¼ ½ ½ ½ ½ ¾½½ ¾ ¾ ½ ¾ ¾ ¿ Secuencia de eliminaci´n: ½ ¾ ¼ ¾ ½ ¾ ¿ o ¾¼ ¾ ½ ½½ ¾½¿ ¿ ½¿ ½¼ º Ù Ð Ö ÓÐ ÎÄ Ö ×ÙÐØ ÒØ Ð Ñ Ò Ö Ð ÒÓ Ó 53 Ð Ö ÓÐ Ð ¬ ÙÖ º½¿º º Ó Ð × Ù ÒØ Ö ÓÐ ÎÄ
  • 582.
    556 Cap´ ´ ıtulo 6. Arboles de b´ squeda equilibrados u 20 7 33 2 12 25 41 0 4 9 15 22 28 36 46 1 3 5 8 10 13 17 21 23 26 30 34 38 43 49 6 11 14 16 18 24 27 29 31 35 37 39 42 44 47 51 19 32 40 45 48 50 52 53 Ù Ð Ö ÓÐ Ö ×ÙÐØ ÒØ Ð Ñ Ò Ö Ð ÒÓ Ó 0 ´ ÖÓµº º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ ØÙ Ð Ô ÖØ ÓÒ ÙÒ Ö ÓÐ ×ÔРݺ ÑÙ ×ØÖ ÕÙ Ð ÐØÙÖ Ð Ö ÓÐ Ö ×ÙÐØ ÒØ × ÐÓ Ö ØÑ º Bibliograf´ ıa ½ º ź г×ÓÒ¹Î Ð³× Ò º ź Ä Ò ×º Ò Ð ÓÖ Ø Ñ ÓÖ Ø ÓÖ Ò Þ Ø ÓÒ Ó Ò ÓÖÑ Ø ÓÒº ËÓÚ Ø Å Ø Ñ Ø × Ó Ð Ý¸ ¿ ½¾ ß½¾ ¿¸ ½ ¾º ¾ Ð Ö Îº Ó¸ ÂÓ Ò º ÀÓÔ ÖÓ Ø¸ Ò Â «Ö Ý º ÍÐÐÑ Òº Ì × Ò Ò Ò ÐÝ× × Ó ÓÑÔÙØ Ö Ð ÓÖ Ø Ñ׺ ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ÍË ¸ ½ º ¿ ÊÙ ÓÐ Ý Öº ËÝÑÑ ØÖ Ò ÖÝ ¹ØÖ × Ø ×ØÖÙ ØÙÖ Ò Ñ ÒØ Ò Ò Ð ÓÖ Ø Ñ׺ Ø ÁÒ ÓÖÑ Ø ¸ ½´ µ ¾ ¼ß¿¼ ¸ ÆÓÚ Ñ Ö ½ ¾º ÊÙ ÓÐ Ý Ö Ò Û Ö Åº Å Ö Øº ÇÖ Ò Þ Ø ÓÒ Ò Ñ ÒØ Ò Ò Ó Ð Ö ÓÖ Ö Ò ×º Ø ÁÒ ÓÖÑ Ø ¸ ½ ½ ¿ß½ ¸ ½ ¾º º Ϻ ×ØÖ º ÁÒ ÓÒÓÙÖ Ó ¬ ÓÒ º ÁÒ º ĺ Ù Ö Ò Åº ÖÓݸ ØÓÖ׸ ÈÖÓ Ö Ñ ÓÒרÖÙ Ø ÓÒ¸ ÚÓÐÙÑ Ó Ä ØÙÖ ÆÓØ × Ò ÓÑÔÙØ Ö Ë Ò ¸ Ô × ß ¼º ËÔÖ Ò Ö Î ÖÐ ¸ ½ º ØØÔ »»ÛÛÛº ÒÙºÓÖ »×Ó ØÛ Ö » ×лº Ù × Ò Ë Û º ÖÓÑ Ø Ö Ñ ÛÓÖ ÓÖ Ð Ò ØÖ ׺ ÁÒ Ç Ë Á ËÝÑÔÓ× ÙÑ ÓÒ ÓÙÒ Ø ÓÒ× Ó ÓÑÔÙØ Ö Ë Ò ´ Ç Ëµ¸ Ô × ß¾½¸ ½ º ÓÒÖ Ó Å ÖØ Ò Þ Ò Ë ÐÚ ÓÖ ÊÓÙÖ º Ê Ò ÓÑ Þ Ò ÖÝ × Ö ØÖ ׺ ÂÓÙÖÒ Ð Ó Ø Å¸ ´¾µ ¾ ß¿¾¿¸ Å Ö ½ º Å ÓØÓ Å Ø×ÙÑÓØÓ Ò Ó× ÖÙ ÃÙÖ Ø º ÌÛ ×Ø ËÊ Ò Ö ØÓÖ׺ Å ÌÖ Ò×¹ Ø ÓÒ× ÓÒ ÅÓ Ð Ò Ò ÓÑÔÙØ Ö Ë ÑÙÐ Ø ÓÒ¸ ¾´¿µ ½ ß½ ¸ ÂÙÐÝ ½ ¾º
  • 583.
    6.9. Bibliograf´ ıa 557 ½¼ Å ÓØÓ Å Ø×ÙÑÓØÓ Ò Ó× ÖÙ ÃÙÖ Ø º ÌÛ ×Ø ËÊ Ò Ö ØÓÖ× ÁÁº Å ÌÖ Ò× Ø ÓÒ× ÓÒ ÅÓ Ð Ò Ò ÓÑÔÙØ Ö Ë ÑÙÐ Ø ÓÒ¸ ´¿µ ¾ ß¾ ¸ ÂÙÐÝ ½ º ½½ Å ÓØÓ Å Ø×ÙÑÓØÓ Ò Ì Ù Æ × ÑÙÖ º Ì ÝÒ Ñ Ö Ø ÓÒ Ó ×ØÖ ÙØ Ö Ò ÓÑ ÒÙÑ Ö Ò Ö ØÓÖ׺ ÁÒ ÈÈË ¸ ½ º ½¾ Á Ò È Ö ÖÖݺ ÈÖÓ Ð Ñ× ÓÒ Ð ÓÖ Ø Ñ׺ ÈÖ ÒØ ¹À Ðи Ò Ð ÛÓÓ Ð «×¸ ÆÂ¸ ½ º ½¿ ʺ Ë Ð Ò º ʺ Ö ÓÒº Ê Ò ÓÑ Þ × Ö ØÖ ׺ Ð ÓÖ Ø Ñ ¸ ½ ´ » µ ß ¸ Ç ØÓ Ö»ÆÓÚ Ñ Ö ½ º ½ º º ËÐ ØÓÖ Ò ÊÓ ÖØ Ì Ö Òº Ë Ð ¹ Ùר Ò Ò ÖÝ Ë Ö ÌÖ ×º ÂÓÙÖÒ Ð Ó Ø Å¸ ´¿¾µ ½ ß¾¼ ¸ ½ º ½ º º ËØ Ô Ò×ÓÒº Ñ Ø Ó ÓÖ ÓÒרÖÙ Ø Ò Ò ÖÝ × Ö ØÖ × Ý Ñ Ò Ò× Ö¹ Ø ÓÒ× Ø Ø ÖÓÓØº ÁÒØ ÖÒ Ø ÓÒ Ð ÂÓÙÖÒ Ð Ó ÓÑÔÙØ Ö Ò ÁÒ ÓÖÑ Ø ÓÒ Ë Ò ×¸ ´½µ ½ ß¾ ¸ ÖÙ ÖÝ ½ ¼º ½ Â Ò ÎÙ ÐÐ Ñ Òº Ø ×ØÖÙ ØÙÖ ÓÖ Ñ Ò ÔÙÐ Ø Ò ÔÖ ÓÖ ØÝ Õ٠٠׺ ÓÑÑÙÒ Ø ÓÒ× Ó Ø Å¸ ¾½´ µ ¿¼ ß¿½ ¸ ÔÖ Ð ½ º ½ Æ Ð Ù× Ï ÖØ º Ð ÓÖ Ø Ñ× + Ø ËØÖÙ ØÙÖ × = ÈÖÓ Ö Ñ׺ ÈÖ ÒØ ¹À ÐÐ Ë Ö × Ò ÙØÓÑ Ø ÓÑÔÙØ Ø ÓÒº ÈÖ ÒØ ¹À Ðи ÍÔÔ Ö Ë Ð Ê Ú Ö¸ ÆÂ ¼ ¸ ÍË ¸ ½ º ½ Ö ÏÓÓ º Ø ËØÖÙ ØÙÖ ×¸ Ð ÓÖ Ø Ñ׸ Ò È Ö ÓÖÑ Ò º ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ ½ ¿º
  • 585.
    Cap´ ıtulo 7 Grafos ÒÙ ×ØÖÓ× × ÒØ Ó× × Ò×ÓÖ Ð ×¸ Ô Ö ÕÙ Ð Ú ×Ø × Ð ÕÙ Ó ÙÔ Ð Ñ ÝÓÖ Ô ÖØ ÒÙ ×ØÖ Ô Ö Ô ÓÒº ÆÙ ×ØÖ Ñ ÑÓÖ Ý Ö Ù Ö Ó ×Ø Ò ÑÔÖ Ò Ó× Ò Ö Ò Ñ Ñ Ò × Ú ×٠Р׺ Ò ÑÙ × Ó × ÓÒ × ÔÖ Ö ÑÓ× ØÖ Ø Ö ÓÒ Ñ Ò × ÔÓÖÕÙ ÒÓ× ×ÓÒ Ñ × ÓÒ Ö Ø × ÒÙ ×ØÖ Ô Ö Ô ÓÒ Ý ÒØ Ò Ñ ÒØÓ ÕÙ ÐÓ× ÓÒ ÔØÓ× ×ØÖ ØÓ׺ Ù Ò Ó Ð ÑÓ× ÓÒ ÐÓ ÔÙÖ Ñ ÒØ ×ØÖ ØÓ¸ × ÑÙÝ ÔÓ× Ð ÕÙ ×Ó ÑÓ× ÙÒ Ñ Ò Ú ×٠к Ù Ò Ó × Ù ÑÓ× ØÖ × ¸ ÔÓÖ ÑÔÐÓ¸ × ÔÓ× Ð ÕÙ × ÒÓ× Ô Ö Þ ÙÒ Ñ Ò Ö Ð ¹ ÓÒ ÙÒ ØÖ ÔÐ Ó Ð ØÓ 3 º Ò Ð ÓÒרÖÙ ÓÒ Ð ÓÒÓ Ñ ÒØÓ ÙÑ ÒÓ ×Ù Ð Ò ÙØ Ð Þ Ö× Ñ Ò × ÖØ ¬ Ð × Ô Ö ÜÔÖ × Ö Ñ ÓÖ × Ý ÓÒ ÔØÓ׸ Ó Ô Ö × ÒØ Ø Þ ÖÐ × Ò ÙÒ Ñ Ò ÕÙ Ò ÐÓ Ý Ö ×ÙÑ ÐÓ× ×ÙÒØÓ× ÒØ Ö ×º Ä × Ñ Ò × ×Ø Ø ÔÓ ×ÓÒ ÐÐ Ñ × ÓÑÙÒÑ ÒØ Ö ¬ Ó× º ÄÓ× Ö ¬ Ó× ÖØ × ÒÓ× × Ö¸ ÙÖÚ × Ñ Ø Ñ Ø × Ù × Ò Ð ÖØ × ÒÓ ÓÓÖ Ò ×¸ Ô ÖÑ Ø Ò Ñ Ö Ö ÑÔÐ Ñ ÒØ Ð ÓÑÔÓÖØ Ñ ÒØÓ ÙÒ ÙÒ ÓÒ ÓÑÔÓÖ¹ Ø Ñ ÒØÓ ÕÙ ÔÙ ×Ø Ö Ó ÙÐØÓ Ò Ð Ñ Ö ÓÖÑÙÐ º ר Ð × Ö ¬ Ó × ÖØ ¬ Ð Ò Ð × ÒØ Ó ÕÙ ÒÓ × Ò Ù ÒØÖ Ò ØÙÖ ÐÑ ÒØ Ó × ¸ ÒÓ × ÓÖÖ ×ÔÓÒ ÓÒ ÙÒ Ñ Ò ÔÖ Ò Ð ÑÙÒ Ó Ò ØÙÖ Ðº Ü ×Ø ÙÒ ÑÔÐ Ú Ö ÔÖÓ Ð Ñ × Ò Ð Ù Ð × Ò ÜÔÖ × Ö Ö Ð ÓÒ × ÒØÖ Ó× × Ð ÙÒ Ø ÔÓº ÉÙ Þ ÙÒ Ù Ò ÑÔÐÓ Ô Ö ×Ø Ø ÑÔÓ ÐÓ ÓÒר ØÙÝ ÙÒ Ñ Ô Ú Ð ÕÙ Ö ÔÖ × ÒØ ÙÒ Ö ÖÖ Ø Ö × ÒØÖ Ù ×º Ò Ð Ö ÓÑÔÙØ ÓÒ Ð¸ ר Ø ÔÓ Ö ¬ Ó × Ð ÒÓÑ Ò ÓÖÑ ÐÑ ÒØ “grafo”º Ð Ø ÖÑ ÒÓ Ö Ó ÔÖÓÚ Ò Ð Ö Ó γρ φος ´ Ö Ó×µ¸ Ð Ù Ð × Ò ¬ × Ö ØÙÖ º Ä × Ö ØÙÖ × ÜÔÖ × ÓÒ × Ò×ÓÖ Ð½ ×Ó Ø Ò Ñ Ö Ú ÐÐÓ×Ó Ý Ñ ×Ø Ö Ó×Ó ÓÑÓ ÐÓ × Ð Ð Ò Ù º Ù Ò Ó Ð ÑÓ׸ ÒÓ Ö ÕÙ Ö ÑÓ× Ð ÔÖ × Ò Ð × Ö ØÓÖ¾ ¸ × ÒÓ Ð ÙÒ × ÒØ Ó Ô Ö Ô ÓÒ Ý ÒØÖ Ò Ñ ÒØÓ ÓÑÓ Ð ØÓÖº ÄÓ× Ö ¬ Ó× ÓÒר ØÙÝ Ò ÙÒ Ð × ÔÖ Ñ Ö × ÓÖÑ × ÙÑ Ò × Ö ÔÖ × ÒØ Ö ÓÒÓ Ñ ÒØÓ Ý Ð ÓÑÔÙØ ÓÒ Ý ÔÖÓ Ö Ñ ÓÒ ÒÓ × Ô Ò Ð Ö ÕÙ Þ ÜÔÖ × Ú ÐÓ Ö ¬ Óº Ò Ø ÖÑ ÒÓ× Ñ Ø Ñ Ø Ó׸ ÙÒ Ö Ð ÓÒ × ÙÒ ×Ù ÓÒ ÙÒØÓ ´R ⊆ A × Bµ Ð ÙÒ ÔÖÓ Ù ØÓ ÖØ × ÒÓ ÒØÖ Ó× ÓÒ ÙÒØÓ× A Ý Bº Ò ×Ø × ÓÒ ÒÓ× ÒØ Ö ¹ × Ò Ö Ð ÓÒ × ÒØÖ Ó× × ÙÒ Ñ ×ÑÓ Ø ÔÓ¸ ÔÓÖ ÐÓ ÕÙ ÐÓ× ÓÒ ÙÒØÓ× ÓÖ Ò Ý ×¹ Ø ÒÓ ×ÓÒ ÐÓ× Ñ ×ÑÓ× Ý Ð Ö Ð ÓÒ¸ Ð ¬ Ò Ö ¸ × Ö ¬ Ö Ð ÔÖÓ Ù ØÓ ÖØ ¹ × ÒÓ A × Aº À Ý Ú Ö Ó× ×ÕÙ Ñ × Ö ¬ Ó× Ô Ö ÜÔÖ × Ö ÙÒ Ö Ð ÓÒ Ò Ö º Ò ÑØÑØ × Ö Ù ÒØ ÙØ Ð Þ Ö ÐÓ× Ö Ñ × × Ø Ð ×¸ Ô ÖÓ ×ØÓ× ×ÓÒ Ò ÓÖÖÓ×Ó× ½ Ò × Ú ×٠и Ø Ø Ð Ó Ð ÙÒ ÓØÖ Ð × º ¾ ÙÒÕÙ ÔÙ Ò Ô Ö Ö× Ð ÙÒ × ÑÓ ÓÒ × ÒØ ÖÔÖ Ø ÓÒ × ÒÚÓÐÙ Ö × Ù Ò Ó× ×Ù Ö ¹ Ø Ñ ÒØ Ð Ð ØÓÖº
  • 586.
    560 Cap´ ıtulo 7. Grafos Ô Ö Ð × Ö Ð ÓÒ × Ò Ö ×º Ò ÐÓ ÕÙ ÓÒ ÖÒ ×Ø ×ØÙ Ó¸ Ü ×Ø ÙÒ Ö ÔÖ ¹ × ÒØ ÓÒ Ö ¬ ÕÙ Ô ÖÑ Ø Ñ Ö Ö Ý ÒØ Ò Ö Ñ ÓÖ ÙÒ Ö Ð ÓÒº Ä ¬ ÙÖ º½ ÐÙ×ØÖ Ð Ö Ð ÓÒ R = {(a, b), (a, c), (a, d), (b, a), (b, c), (b, d), (b, f), (b, e), (c, a), (c, b), (c, g), (c, f), (c, h), (d, a), (d, b), (d, e), (g, c), (g, h), (f, c), (f, b), (f, h)} ⊆ A×A, A = {a, b, c, d, e, f, g, h}¸ ÙÒ Ñ Ò Ö Ö ÒØ ݸ Ò Ò Ö Ð Ñ × × ÑÔÐ ¸ ÕÙ ÙÒ Ö Ñ × Ø Ðº ÙÖ º½ ÑÔÐÓ Ö Ð ÓÒ ÜÔÖ × ÓÒ ÙÒ Ö ¬ Ó ÙÖ × ÓÑÓ Ð º½¹ × ÒÓÑ Ò Ò Ö Ó× º Ò Ð ÑÔÐÓ Ò Ù ×Ø ÓÒ¸ × ÔÖ ¹ Ò Ú ×Ù ÐÑ ÒØ Ð × ÓÒ Ü ÓÒ × ÒØÖ ÐÓ× Ð Ñ ÒØÓ× Ð ÓÒ ÙÒØÓ Aº ÄÓ× Ð Ñ Ò¹ ØÓ× × Ù Ò Ò ÖÖ Ó× ÒØÖ Ö ÙÐÓ׸ Ñ ÒØÖ × ÕÙ Ð × Ö Ð ÓÒ × ÒØÖ ÐÐÓ× × Ò¹ Ò Ñ ÒØ × Ð Ò × ÕÙ ÓÒ Ø Ò ÐÓ× Ö ÙÐÓ׺ × ÑÙÝ ÔÓ× Ð ÕÙ Ð Ð ØÓÖ Ð × Ñ × × Ò ÐÐÓ ÔÖ Ö Ð Ö Ð ÓÒ Ñ ÒØ Ð ¬ ÙÖ º½¸ ÕÙ Ò ×Ù Ö ÔÖ × ÒØ ÓÒ Ñ Ø Ñ Ø R = {(a, b), (a, c), (a, d), (b, a), (b, c), (b, d), (b, f), (b, e), (c, a), (c, b), (c, g), (c, f), (c, h), (d, a), (d, b), (d, e), (g, c), (g, h), (f, c), (f, b), (f, h)}, A = {a, b, c, d, e, f, g, h}º ÒÐ Ö Ö Ó׸ ÐÓ× Ð Ñ ÒØÓ× Ö Ð ÓÒ × ÒÓÑ Ò Ò Ú ÖØ × Ó ÒÓ Ó׸ Ñ ÒØÖ × ÕÙ Ð × Ö Ð ÓÒ × × ÐÐ Ñ Ò Ö ×Ø × Ó Ö Ó׺ Ò Ð ÑÔÐÓ Ð ¬ ÙÖ º½¹ ÐÓ× Ú ÖØ × × Ù Ò ÓÒ Ö ÙÐÓ× Ø ÕÙ Ø Ó× ÓÒ ÐÓ× Ð Ñ ÒØÓ× Ð ÓÒ ÙÒØÓ A = {a, b, c, d, e, f, g, h}¸ Ô ÖÓ ÒÓ Ü ×Ø Ò Ò ÙÒ Ö ×ØÖ ÓÒ ×Ó Ö Ð ÓÖÑ Ú ×Ù Ð ÕÙ Ø Ò Ö ÙÒ ÒÓ Ó ÔÓ Ö Ö× Ù Ó ÓÒ Ù Ö Ó׸ ØÖ Ò ÙÐÓ× Ó Ù ÐÕÙ Ö ÓØÖ ¬ ÙÖ º ÈÓÖ ÐÓ Ò Ö Ð¸ Ò Ñ Ø Ñ Ø Ð Ñ Ù ÒÓ × Ò Ú ×Ø º È ÖÓ Ú × ×¸ Ù×¹ Ø Ñ ÒØ ¸ Ò Ð Ô ÜÔÖ × Ö ÓÖÑ × Ö ¬ × Ö ÒØ × Ô Ö ÙÒ Ñ ×Ñ Ö Ð ÓÒ¸ Ò ÓÒ Ö × Ð ÔÓ Ö ×ØÖ ÓÒ Ý Ö ÔÖ × ÒØ ÓÒ ÙÒ Ö Óº ÍÒ Ö Ó ×¸ Ô٠׸ ÙÒ ×ØÖÙ ØÙÖ ØÓ× ÓÖ ÒØ Ð Ö ÔÖ × ÒØ ÓÒ Ö ¬ Ð × Ö Ð ÓÒ × Ò¹ ØÖ Ð Ñ ÒØÓ× ÙÒ Ñ ×ÑÓ Ø ÔÓº Ä Ö ÞÓÒ ÕÙ ÑÓØ Ú ÐÓ× ÔÖÓ Ö Ñ ÓÖ ×¸ Ò Ò ÖÓ׸ Ñ Ø Ñ Ø Ó× Ý Ñ × ÔÖ Ø ÒØ × ÙØ Ð Þ Ö Ö Ó׸ × Ð ÓÑÓ ÕÙ ÓÒÐÐ Ú Ô Ö Ð ÒØ Ò Ñ ÒØÓ Ð Ñ Ò Ö ×ØÖ ÓÒ × Ö ¬ ׺ ÑÓ× ÔÖ × ÒØ Ö Ð Ô Ö ÕÙ × Ð Ö Ó ÙÒ ×ØÖ ÓÒ Ò Ö Ð ÕÙ ÔÖ Ø Ò Ö Ö ÙÒ Ú ×Ø Ñ ÔÖÓ Ð Ñ × Ò ÐÓ× Ù Ð × × ÔÙ Ò ÜÔÖ × Ö Ö Ð ÓÒ × ÒØÖ Ð Ñ ÒØÓ× ÙÒ Ñ ×ÑÓ Ø ÔÓ Ý ÒÓ× × Ñ × ÓÑÓ Ó Ú ×Ù Ð Þ ÖÐ × Ò ÙÒ Ö ¬ Óº Ë ÒÐ Ö Ó × Ú ×Ù Ð Ò ×Ù × ÒØ Ó × Ò×ÓÖ Ð¸ ×Ù ØÖ Ø Ñ ÒØÓ Ø Ò Ó× Ô Ö×Ô Ø Ú × ×ØÙ Ó ÕÙ ÒÓ ÐÓ ×ÓÒ Ð Ñ Ø Ñ Ø ÓÑ Ò ØÓÖ Ý Ð ÔÖÓ Ö Ñ ÓÒº Ð ÓÒ ÔØÓ Ö Ó Ý ×Ù× ÔÖÓ Ð Ñ × ×Ó Ó× Ü ×Ø Ò × ÑÙ Ó ÒØ × ÕÙ Ð ÔÖÓ Ö Ñ ÓÒº ÈÙ ×ØÓ ÕÙ Ð Ñ ÝÓÖ ÐÓ× ÔÖÓ Ð Ñ × ÕÙ ÑÓ Ð Þ Ò ÐÓ× Ö Ó× Ö ¹ ÕÙ Ö Ò ÑÙ Ó ÓÑÔÙØÓ¸ ÙÖ ÒØ ÑÙ Ó Ø ÑÔÓ ×Ù ÒØ Ö × Ý ×ØÙ Ó ×ØÙÚÓ Ö × ÖÚ Ó ÐÓ× Ñ Ø Ñ Ø Ó׺ Ä Ô Ö×Ô Ø Ú Ñ Ø Ñ Ø Ø Ò ÒÚ ×Ø Ö Ð Ö Ó ÓÑÓ ÙÒ Ö Ð ÓÒ × Ö¸ ÓÑ Ò ØÓÖ ÐÑ ÒØ º
  • 587.
    7.1. Fundamentos 561 Ä ÓØÖ Ô Ö×Ô Ø Ú Ð Ò Ð × × Ð ÓÒר ØÙÝ Ð ÔÖÓ Ö Ñ ÓÒ Ð ÓÖ ØÑÓ× ×Ó Ö Ö Ó׺ Ó× Ð ÓÖ ØÑÓ× ÔÐ ÒØ Ò × Ó× Ð ÓÖ ÙÒ × Ð Ý ÓÑÔÐ ÕÙ ÙÒ ÒÓ × Ó ÓÖ ×Ø Ð ÔÖ × ÒØ º ÄÓ× Ð ÓÖ ØÑÓ× ×Ó Ö Ö Ó× ÓÒ Ù Ò Ð Ù×Ó Ú Ö× × ×ØÖÙ ØÙÖ × ØÓ× Ý Ð ÓÖ ØÑÓ׺ ÈÓÖ Ð ÒØ Ö ÙÒ ÑÔÐÓ¸ Ð Ð ÙÐÓ Ñ ÒÓ× ÓÔØ ÑÓ× ÔÙ Ö ÕÙ Ö Ö Ð ÓÖ ØÑÓ× ÓÖ Ò Ñ ÒØÓ Ý Ô× Ò Ö Ó׺ 7.1 Fundamentos ÓÑÓ ÒØÙ Ø Ú Ñ ÒØ Ý × Ñ Ò ÓÒ Ó¸ ÙÒ Ö Ó G × ¬Ò ÓÖÑ ÐÑ ÒØ Ñ ÒØ ÙÒ ÙÔÐ G =< V, A > ÓÑÔÙ ×Ø Ó× ÓÒ ÙÒØÓ× V × Ð ÓÒ ÙÒØÓ Ú ÖØ × Ó ÒÓ Ó× Ý A × Ð ÓÒ ÙÒØÓ Ö ×Ø × Ó Ö Ó× Ò Ð ÑÔÐÓ Ð ¬ ÙÖ º¾¸ V × ÓÑÔÓÒ ÔÓÖ ¿º Ð × Ð ØÖ × × Ð A ר Ð M¸ Ñ ÒØÖ × ÕÙ A ÐÓ ÓÑÔÓÒ Ò Ð × ÓÒ Ü ÓÒ × ÒÙÑ Ö × × Ð 1 ר Ð 29º 29 B 2 J 3 H 4 M 5 1 28 9 15 8 16 7 L 14 6 A 10 D E 17 25 N 24 11 12 13 18 18 22 23 I 27 C 20 F 21 G 26 K ÙÖ º¾ ÍÒ Ö Ó Ä ÒÙÑ Ö ÓÒ ÐÓ× Ö Ó× Ð × ¬ ÙÖ × º¾ Ý º¿ ÒÓ Ö ÔÖ × ÒØ Ñ Ò ØÙ × Ó Ø ÔÓ׺ Ë ÙÒ Ð × Ö Ø Ö ×Ø × Ð ÔÐ ÓÒ¸ ÐÓ× ÒÓ Ó× Ý Ö Ó× ÔÙ Ò ×Ó Ö× Ð × Ø ÔÓ× ØÓ׺ ÈÓÖ ÑÔÐÓ¸ ÙÒ Ö Ó Ú Ð ÖÖ Ø Ö × Ù Ö Ö Ò ×Ù× ÒÓ Ó× ÐÓ× ÒÓÑ Ö × Ð × Ù × ÙÒØÓ ÓÒ Ò ÓÖÑ ÓÒ ØÙÖ ×Ø Ý × ÖÚ Ó× × Ó× ´ ר ÓÒ × ×ÓÐ Ò ¸ ÓØ Р׸ Ø Ø Ö µº ÄÓ× Ö Ó× Ö ÔÖ × ÒØ Ö Ò Ð × ÖÖ Ø Ö × Ý ÐÑ Ò Ö Ò Ð × ×Ø Ò × ÒØÖ Ð × Ù × ÙÒØÓ ÓÒ ÙÒ Ð ¬ ÓÖ ÕÙ Ò × ×Ù Ð ´ ÙØÓÔ ×Ø ¸ ÖÖ Ø Ö ¸ ØÖÓ ¸ Ø Ø Ö µº Ñ ÒÙ Ó¸ ר Ð × Ö Ó¸ Ò Ô ÖØ ÙÐ Ö ÕÙ Ð ÙÝÓ× Ö Ó× Ù Ö Ò ÒØ ׸ × Ð ÒÓÑ Ò Ö Ó ÓÒ Ô ×Ó× ¸ ÔÓÖÕÙ Ð × ÒØ × × ÔÓÒ Ö Ò Ý × ÙØ Ð Þ Ò Ò Ð ÓÖ ØÑÓ× ÔÓÖ ÑÔÐÓ¸ Ô Ö Ð ÙÐ Ö Ð ×Ø Ò Ñ × ÓÖØ ÒØÖ Ó× Ù ×º Ò Ð Ö Ó Ð ¬ ÙÖ º¾¸ Ù ÐÕÙ Ö Ö Ó Ö Ð ÓÒ ×Ù× ÒÓ Ó× Ò ÐÓ× Ó× × ÒØ Ó׺ ÈÓÖ ÑÔÐÓ¸ Ð Ö Ó 1 Ö ÔÖ × ÒØ Ð × Ö Ð ÓÒ × A → B Ý B → A¸ Ö ×Ô Ø Ú Ñ ÒØ º Ò Ø ÖÑ ÒÓ× Ñ Ø Ñ Ø Ó׸ Ð Ö Ó 1 Ö ÔÖ × ÒØ (A, B), (B, A) ∈ A × Aº Ò Ô Ð Ö × Ñ Ø Ñ Ø ×¸ Ð Ö Ð ÓÒ Ö ÔÖ × ÒØ ÔÓÖ Ð Ö Ó Ð ¬ ÙÖ º¾ × × Ñ ØÖ º Ù Ò Ó Ð Ö Ð ÓÒ ÒÓ × × Ñ ØÖ ¸ ÒØÓÒ × Ð Ö Ó × “dirigido” Ý ÐÓ× Ö Ó× × Ð × ÓÐÓ Ò ­ × ÕÙ Ò Ò Ð × ÒØ Ó Ð Ö Ð ÓÒ ÒØÖ Ó× ÒÓ Ó׺ ÍÒ grafo dirigido ¿ ÈÓÖ ÐÓ Ò Ö Ð¸ ÐÓ× ÔÖÓ Ö Ñ ÓÖ × Ù× Ò Ð Ø ÖÑ ÒÓ ÒÓ Ó ¸ Ñ ÒØÖ × ÕÙ ÐÓ× Ñ Ø Ñ Ø Ó× ÔÖ ¬ Ö Ò Ð Ø ÖÑ ÒÓ Ú ÖØ º Ð Ñ ×ÑÓ ÑÓ Ó¸ ÐÓ× ÔÖÓ Ö Ñ ÓÖ × ÙØ Ð Þ Ò Ð ÚÓ ÐÓ Ö Ó Ñ ÒØÖ × ÕÙ ÐÓ× Ñ Ø Ñ Ø Ó× × Ò Ð Ò Ò ÔÓÖ Ù× Ö Ö ×Ø º ÈÙ ×ØÓ ÕÙ ×Ø Ø ÜØÓ × Ñ × Ô Ö ÔÖÓ Ö Ñ ÓÖ ×¸ × Ù× Ö Ò Ò ÔÖ Ö Ò ÐÓ× Ø ÖÑ ÒÓ× nodo Ý arco¸ Ö ×Ô Ø Ú Ñ ÒØ º
  • 588.
    562 Cap´ ıtulo 7. Grafos Ø Ñ Ò × ÒÓÑ Ò “digrafo”º Ä ¬ ÙÖ º¿ ÑÙ ×ØÖ ÙÒ ÑÔÐÓº ÆÓØ × ÕÙ Ð Ö Ó 1 Ö Ó × Ð ÒÓ Ó A Ð ÒÓ Ó B Ö ÔÖ × ÒØ (A, B) ∈ Rº Ð Ñ ×ÑÓ ÑÓ Ó¸ ÒÓØ × ÕÙ (B, A) ∈ R × ÜÔÖ × ÔÓÖ Ð Ù× Ò / Ð ÖÓ Ö Ó × B Aº B 2 E 1 3 A 4 5 6 F 9 7 C 8 D ÙÖ º¿ ÍÒ Ö ÓÓ Ö Ó Ö Ó Ð ÒÙÑ ÖÓ Ö Ó× ÓÒ Ø Ó× ÙÒ ÒÓ Ó × ÐÐ Ñ Ó Ð grado del nodoº Ð Ö Ó Ð Ö Ó × Ð Ñ ÝÓÖ Ö Ó ÒØÖ ØÓ Ó× ×Ù× ÒÓ Ó׺ Ó ÙÒ ÒÓ Ó v¸ ÐÓ× ÒÓ Ó× Ö Ø Ñ ÒØ ÓÒ Ø Ó× × v ØÖ Ú × ×Ù× Ö Ó× × ÐÐ Ñ Ò ÒÓ Ó× Ý ÒØ ׺ ÈÓÖ ÑÔÐÓ¸ Ò Ð Ö Ó Ð ¬ ÙÖ º¿¸ ÐÓ× ÒÓ Ó× Ý ÒØ × B ×ÓÒ {C, D, E}º ÄÓ× ÒÓ Ó× × ÐÓ× Ù Ð × × ÐÐ Ö Ø Ñ ÒØ ÙÒ ÒÓ Ó v × ÒÓÑ Ò Ò nodos incidentesº È Ö Ð ÑÔÐÓ ÒØ Ö ÓÖ¸ A × Ð ÙÒ Ó ÒÓ Ó Ò ÒØ Bº ÍÒ Ö Ó × incidente ×Ó Ö Ð´ÐÓ×µ ÒÓ Ó´×µ ÕÙ Ð ÓÒ Ø º ר Ö × ÔÐ Ð ÙÒ Ö Ó ÒÓ Ö Ó¸ Ô ÖÓ ÔÙ ÓÑÔÐ ¹ Ñ ÒØ Ö× × ÐÓ× ÒÙÑ ÖÓ× Ö Ó× ÒØÖ ÒØ × Ý × Ð ÒØ × × Ð × ÐÐ Ñ Ò “grado de entrada” Ý “grado de salida”¸ Ö ×Ô Ø Ú Ñ ÒØ º Ó ÙÒ Ö Ó Ö Ó¸ ×Ù ÒÓ Ó ÓÖ Ò × Ð ÒÓÑ Ò Ý ÒØ Ý Ð ×Ø ÒÓ Ò ÒØ º ÍÒ “camino” È ∈ G ÙÒ Ö Ó G × ¬Ò ÓÑÓ ÙÒ × Ù Ò ÒØ Ö Ð ÒÓ Ó× Ý Ö Ó× Gº À Ý Ú Ö × ÓÖÑ × ÜÔÖ × Ö ÙÒ Ñ ÒÓ¸ Ð × Ù Ð × Ô Ò Ò Ð Ø ÔÓ Ö Ó Ý Ð ÔÐ ÓÒº Ò Ð ×Ó Ð Ö Ó Ð ¬ ÙÖ º¾¸ Ð × Ù Ò È = A → B → J → H → N → L → I Ò ÙÒ Ñ ÒÓ × Ð ÒÓ Ó A ר Ð ÒÓ Ó Iº ÇØÖ Ñ Ò Ö ÔÙ × Ö Ö Ø Ñ ÒØ A, B, J, H, N, L, I¸ Ó Ñ ÒØ Ð × Ø ÕÙ Ø × ÐÓ× Ö Ó× 1, 2, 3, 16, 6, 25 ר ÙÐØ Ñ ÓÖÑ ×Ø ×ÙÔ Ø ÕÙ ÐÓ× Ö Ó× ×Ø Ò Ø ÕÙ Ø Ó× Ö ÕÙ × ØÓ ÕÙ ÒÓ × Ö ÙÒ× Ö Ò Ð ¬Ò ÓÒ ÓÖÑ Ð Ö Óº Ä ÐÓÒ ØÙ ÙÒ Ñ ÒÓ × ÓÑÔÓÒ ÔÓÖ Ð ÒÙÑ ÖÓ Ö Ó× ÕÙ ×Ø ÓÒØ Ò Ó × ¸ Ð ÒÙÑ ÖÓ ÒÓ Ó× Ñ ÒÓ× ÙÒÓº ÍÒ Ð × ÔÐ ÓÒ × Ñ × ÑÔÓÖØ ÒØ × ÐÓ× Ö Ó× Ð ÓÒר ØÙÝ Ð Ù×ÕÙ Ñ ÒÓ× × ÙÒ Ð ÙÒ Ö ×ØÖ ÓÒ º ÉÙ Þ Ð ÔÖÓ Ð Ñ Ñ × ÔÓÔÙÐ Ö × Ð Ù×ÕÙ Ð Ñ ÒÓ Ñ Ò ÑÓ ÒØÖ ÙÒ Ô Ö ÒÓ Ó׺ ÍÒ Ñ ÒÓ ÙÝÓ ÔÖ Ñ Ö Ý ÙÐØ ÑÓ ÒÓ Ó × Ò Ù Ð × × ÒÓÑ Ò ciclo o circuitoº Ë Ð ÐÓÒ ØÙ Ð ÐÓ × ÙÒÓ¸ ÒØÓÒ × Ð Ñ ÒÓ × Ð Ð ¬ “simple” “bucle” Ó “lazo”º Ð Ö Ó Ð ¬ ÙÖ º¾ ÓÒØ Ò ÙÒ ×ÓÐÓ ÐÓ × ÑÔÐ Ò Ð ÒÓ Ó J × Ö¸ Ð Ô Ö (J, J)º ÍÒ Ö Ó G =< V, A > × Ð ¬ conexo × Ô Ö ØÓ Ó× ÐÓ× Ô Ö × ÓÖ Ò Ó× ÒÓ Ó× (v1, v2) ∈ G Ü ×Ø ÙÒ Ñ ÒÓ × v1 ר v2º ÜÔÖ × Ó ÓØÖ Ñ Ò Ö ¸ ÙÒ Ö Ó × ÓÒ ÜÓ × Ô Ö ØÓ Ó ÒÓ Ó Ð Ö Ó Ü ×Ø ÙÒ ÐÓ ÕÙ ÒÓ × × ÑÔÐ º ÍÒ Ö Ó × ÕÙ × total¸ completamente conexo Ó¸ × ÑÔÐ Ñ ÒØ ¸ completo¸ × ÒÓ Ó Ð Ö Ó × Ý ÒØ Ð Ö ×ØÓº Ð Ö Ó ÙÒ Ö Ó ÓÑÔÐ ØÓ × ×Ù ÒÙÑ ÖÓ ÒÓ Ó׺ Ä ¬ ÙÖ º ÐÙ×ØÖ Ð Ö Ó ÓÑÔÐ ØÓ Ö Ó 5º
  • 589.
    7.1. Fundamentos 563 A B C D F ÙÖ º ÍÒ Ö Ó ÓÑÔÐ ØÓ Ö Ó5 Ð grafo complemento ÙÒ Ö Ó G¸ ÕÙ × ÒÓØ G¸ × Ð Ö Ó ÓÑÔÙ ×ØÓ ÔÓÖ ÐÓ× Ö Ó× ÕÙ × Ö ÕÙ Ö Ö Ò Ô Ö ÕÙ G Ú Ò × ÓÑÔÐ ØÓº Ó ÓØÖÓ ÑÓ Ó¸ Ð Ö Ó ÓÑÔÐ ØÓ Ö Ó |V| Ñ ÒÓ× ÐÓ× Ö Ó× Gº Ä ¬ ÙÖ º ÐÙ×ØÖ ÙÒ ÑÔÐÓº Ä ÙÒ ÓÒ ÙÒ Ö Ó Ý ×Ù ÓÑÔÐ Ñ ÒØÓ × Ð Ö Ó ÓÑÔÐ ØÓ Ö Ó |V|º Ð ÙÒÓ× Ð ÓÖ ØÑÓ× Ö ÕÙ Ö Ò Ð ÙÐ Ö Ð Ö Ó ÓÑÔÐ Ñ ÒØÓ ÓØÖÓ× Ö ÕÙ Ö Ò Ð Ö Ó ÓÑÔÐ ØÓ¸ Ð Ù Ð ÔÙ Ð ÙÐ Ö× × × Ø Ò Ð ÓÑÔÐ Ñ ÒØÓ Ñ ÒØ Ð ÙÒ ÓÒ G ∪ Gº A B A B C D C D F F ´µ ´ µ ÙÖ º ÍÒ Ö Ó Ý ×Ù ÓÑÔÐ Ñ ÒØÓ Ä × × Ð × Ò ÒÙÑ ÖÓ ÒÓ Ó× Ý Ö Ó× ×ÓÒ ÐÓ× ØÓÖ × ÔÖ Ò Ô Ð × ÕÙ Ò Ò Ò Ð Ø ÑÔÓ Ù ÓÒ ÙÒ Ð ÓÖ ØÑÓ ×Ó Ö ÙÒ Ö Óº Ò Ð × ÜÔÖ × ÓÒ × Ð ÙÐÓ׸ ÔÖ Ð Ø Ö Ð × ÙÖ×Ó¸ Ð × Ö Ò Ð × ÐÓ× ÓÒ ÙÒØÓ× V Ý A ×Ù Ð Ò Ö ÔÖ × ÒØ Ö× Ö Ø Ñ ÒØ × Ò Ð × ÖÖ ×º B 2 J 3 H 1 4 6 7 8 14 A 9 D E 17 18 1 11 12 13 15 16 C 10 F 17 G ÙÖ º ÍÒ ÑÙÐØ Ö Ó ÙÒ Ö Ó ÕÙ Ø Ò Ó× Ó Ñ × Ö Ó× ÕÙ ÓÒ Ø Ò ÐÓ× Ñ ×ÑÓ× ÒÓ Ó× × Ð ÒÓÑ Ò ¸ Ò Ô Ö Ö × × ÓÒ ÐÓ× ÓÒ ÙÒØÓ׸ “multigrafo”º Ä ¬ ÙÖ º ÐÙ×ØÖ ÙÒ ÑÔÐÓº ÍÒ ÑÙÐØ ¹
  • 590.
    564 Cap´ ıtulo 7. Grafos Ö Ó ÔÙ × Ö Ö Ó¸ Ò ÙÝÓ ×Ó × Ð ÐÐ Ñ multidigrafo Ó multigrafo dirigidoº ÍÒ Ö Ó Ö ÙÒ ÒØ × Ø Ð “paralelo”º Ó ÙÒ Ö Ó G =< V, A >¸ Ù ÐÕÙ Ö ×Ù ÓÒ ÙÒØÓ G =< V , A > | (V ⊆ V)(A ⊆ A | ∀a = (v1, v2) ∈ A =⇒ v1, v2 ∈ V ) × ÒÓÑ Ò subgrafo Gº Ä ¬ ÙÖ º ÐÙ×ØÖ Ó× ×Ù Ö Ó× Ð ÐÙ×ØÖ Ó Ò Ð ¬ ÙÖ º¾º Ù ÐÕÙ Ö ×Ù Ö Ó ÓÑÔÐ ØÓ × ÒÓÑ Ò cliqueº B H 4 M 5 1 28 16 7 L 14 6 A 10 D E 17 25 N 24 11 12 13 18 22 23 I 27 C 20 F G 26 K ´µ ´ µ ÙÖ º Ó× ×Ù Ö Ó× Ð Ö Ó Ò º¾ ÙÒ Ö Ó ÕÙ ÒÓ × ÓÒ ÜÓ × Ð ÐÐ Ñ “inconexo”º ÍÒ Ö Ó Ò ÓÒ ÜÓ G × ÓÑÔÓÒ Ö Ó× ÓÒ ÜÓ׸ ÐÓ× Ù Ð × × ÒÓÑ Ò Ò “subgrafos conexos de G”º ÍÒ Ö Ó ÓÒ ÜÓ × Ò ÐÓ× × ÒÓÑ Ò “´rbol”º Å Ò ×Ø Ö ÒÓØ Ö ÕÙ ×Ø × ÙÒ a ÒØ ÖÔÖ Ø ÓÒ Ö ÒØ Ð Ö ÓÐ ØÖ Ø Ò Ü º½ ´Ô Ò ¾ µ¸ ÔÙ × Ò ×Ø ×Ó ÒÓ × Ö ÕÙ × ØÓ ÒÓØ Ö ÙÒ ÒÓ Ó Ö Þ ÙÒÕÙ Ò ÑÔ ÖÐÓº ÍÒ “´rbol abarcador” ÙÒ Ö Ó ÓÒ ÜÓ G × ÙÒ Ö ÓÐ ÓÑÔÙ ×ØÓ ÓÒ Ö Ó× G a ÕÙ ÓÒØ Ò ØÓ Ó× ÐÓ× ÒÓ Ó× Gº Ä ¬ ÙÖ º ÐÙ×ØÖ ÙÒ Ö ÓÐ Ö ÓÖ Ð Ö Ó ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ º¾º B 2 J H M 15 8 16 7 L 6 A 10 D E 17 25 N 13 18 I 27 C 20 F 21 G K ÙÖ º ÍÒ Ö ÓÐ Ö ÓÖ Ð ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ º¾ Ð ÙÒÓ× Ð ÓÖ ØÑÓ× Ö ÕÙ Ö Ò Ú Ö ¬ Ö × Ð Ö Ó × “bipartido” Ó Ò ÓÒØÖ ÖÐÓº ÍÒ Ö Ó × “bipartido” × ×Ø ÔÙ Ú Ö× Ò Ó× ÓÒ ÙÒØÓ× × ÙÒØÓ× ÒÓ Ó× B Ý C Ø Ð ÕÙ ÐÓ× Ö Ó× ÙÒ ÓÒ ÙÒØÓ ÓÒ Ø Ò ÒÓ Ó× B ÓÒ ÒÓ Ó× C Ý ÕÙ ÒÓ Ü ×Ø ÓÒ Ü ÓÒ ÒØÖ ÐÓ× ÒÓ Ó× ÙÒ Ñ ×ÑÓ ÓÒ ÙÒØÓº Ä ¬ ÙÖ º ÑÙ ×ØÖ ÙÒ ÑÔÐÓº Ð × ÒØ Ó Ú ×Ù Ð Ð ÓÒ ÔØÓ Ö Ó ×ÙÖ Ð ÓÐÓÖ ÓÒ × ×Ó ÑÓ× ÓÐÓÖ × ÐÓ× ÒÓ Ó× Ó Ö Ó׺ Ð ÔÖÓ Ð Ñ ÓÐÓÖ Ö ÒÓ Ó× ÓÒ× ×Ø Ò Ô ÒØ Ö ÐÓ× ÒÓ Ó× Ñ Ò Ö Ø Ð ÕÙ Ó× ÒÓ Ó× Ý ÒØ × ÒÓ Ø Ò Ò Ð Ñ ×ÑÓ ÓÐÓÖº Ò Ð Ñ ×ÑÓ × ÒØ Ó¸ Ò ÒÐ× “spanning tree”º
  • 591.
    7.1. Fundamentos 565 B H D A A B C D E F G C E B F G H I J A I J ´µ ´ µ ÙÖ º ÍÒ Ö Ó Ô ÖØ Ó ÓÐÓÖ Ö Ö Ó× ÓÒ× ×Ø Ò Ô ÒØ ÖÐÓ× ÓÖÑ Ø Ð ÕÙ Ó× Ö Ó× ÕÙ Ò Ò ×Ó Ö Ð Ñ ×ÑÓ ÒÓ Ó Ø Ò Ò ÓÐÓÖ × Ö ÒØ ׺ Ó× Ö Ó× G1 =< V1, A1 > Ý G2 =< V2, A2 > ×ÓÒ ×ÓÑÓÖ Ó× × × ÔÓ× Ð Ñ Ö Ð × Ø ÕÙ Ø × V1 ÔÓÖ Ð × V2 Ø Ð ÕÙ A1 = A2º Ä ¬ ÙÖ º½¼ ÑÙ ×ØÖ ÙÒ ÑÔÐÓº 6 A B 1 C D 2 4 3 F G 5 ÙÖ º½¼ Ó× Ö Ó× ×ÓÑÓÖ Ó× ÍÒ Ö Ó × ÐÐ Ñ Ó planar × × ÔÓ× Ð Ù ÖÐÓ Ò ÙÒ ÔÐ ÒÓ × Ò ÕÙ ×Ù× Ö Ó× × ÖÙ Òº ÍÒ Ñ ÒÓ ÙÐ Ö ÒÓ × ÙÒÓ ÕÙ Ô × ÔÓÖ ØÓ Ó× ÐÓ× Ö Ó× Ü Ø Ñ ÒØ ÙÒ Ú Þº ר Ø ÔÓ Ñ ÒÓ Ø Ô ¬ Ð ÙÒ × × ØÙ ÓÒ × ÓÔØ Ñ ÓÒ ÔÓÖ ÑÔÐÓ¸ Ð Ö ÓÖÖ Ó ÙÒ ÖØ ÖÓº ÍÒ Ñ ÒÓ Ñ ÐØÓÒ ÒÓ × ÙÒÓ ÕÙ Ô × ÔÓÖ ØÓ Ó× ÐÓ× ÒÓ Ó× Ü Ø Ñ ÒØ ÙÒ Ú Þº Ð Ù Ð ÕÙ Ð Ð × ÒØ Ö ÓÖ¸ ר Ø ÔÓ Ñ ÒÓ Ø Ñ Ò ÑÓ Ð Þ × ØÙ ÓÒ × ÓÔØ Ñ ÓÒ ÔÓÖ ÑÔÐÓ¸ Ð Ñ ÒÓ ÕÙ Ö ÙÒ Ú × Ø ÓÖ Ñ Ó Ô Ö Ù Ö Ö ØÓ × Ð × Ù × ×Ù Ö ×ÔÓÒ× Ð º ÄÓ× Ö Ó× Ö ÔÖ × ÒØ Ò ÙÒ Ð × ÔÖÓ Ð Ñ × Ñ × ÓÑÔÐ ÕÙ Ù×Ó ÒØ Ò× ÚÓ ÑÔÐ ÒØ ÓÒ × Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð ×ØÖÙ ØÙÖ ØÓ׺ Ä Ò ÓÐ ÔÖÓ Ð Ñ × ÓÒ Ö Ó× ÔÙ Ð × ¬ Ö× Ò Ù ØÖÓ Ø ÔÓ׺ Ð ÔÖ Ñ Ö Ø ÔÓ ÔÖÓ Ð Ñ × Ð × ¬ Ò “de existencia”º Ó ÙÒ Ö Ó Ý ÙÒÓ× Ö ÕÙ Ö Ñ ÒØÓ× ×Ó Ö ×Ø ¸ Ü ×Ø ÙÒ Ö Ó ÕÙ × Ø × ÐÓ× Ö ÕÙ Ö Ñ ÒØÓ× ÈÓÖ ÑÔÐÓ¸ × ÙÒ Ö Ó ÔÐ Ò Ö Ð × ÙÒ Ó Ø ÔÓ × Ø Ô ¬ Ò “de construcci´n”º ÍÒ Ú Þ ÕÙ × ÓÒÓ Ð Ü ×¹ o ØÒ ÙÒ Ö Ó ×Ô Ð¸ ÒØÓÒ × ÓÑÓ ÓÒרÖÙ ÖÐÓ º Ð ÙÒ Ú × ÒÓ × Ò × Ö Ó Ø ÖÑ Ò Ö Ð Ü ×Ø Ò ÔÓÖÕÙ ×Ø × ÓÒÓ ÒØ Ñ ÒÓ ÔÓÖ ÑÔÐÓ׸ Ô Ö Ð Ù¹
  • 592.
    566 Cap´ ıtulo 7. Grafos Ð Ö Ð Ö ÓÐ Ö ÓÖ Ó Ð ÙÒ Ñ ÒÓº ÇØÖ × Ú × × ÓÒÚ Ò Ø ÖÑ Ò Ö Ð Ü ×Ø Ò ÔÖ Ñ ÖÓ¸ ÒØ × ÓÖ Ö Ð ÓÒרÖÙ ÓÒ ÔÓÖ Òר Ò ¸ Ð Ù Ó ÙÒ Ö Ó ÔÐ Ò Öº Ð Ø Ö Ö Ø ÔÓ × Ø Ð Ò “de enumeraci´n” Ó “conteo”º ÍÒ Ú Þ ÕÙ × Ø ÖÑ Ò o Ð Ü ×Ø Ò ¸ ÒØÓÒ × × × ÓÒÓ Ö Ð ÒØ ×ÓÐÙ ÓÒ ×º ÈÓÖ ÐÓ Ò Ö Ð¸ רÓ× ÔÖÓ Ð Ñ × Ø Ò Ò Ñ × Ð ÒØ Ö × Ñ Ø Ñ Ø Ó ÕÙ ÔÐ Ø ÚÓº Ò ÐÑ ÒØ ¸ Ð ÙÐØ ÑÓ Ø ÔÓ ÔÖÓ Ð Ñ × ÒÓÑ Ò “de optimizaci´n” Ý ÓÒ× ×Ø o Ò ÓÒרÖÙ Ö Ð Ñ ÓÖ ×ÓÐÙ ÓÒ × ÙÒ Ð ÙÒ Ö Ø Ö Ó ÓÔØ Ñ ÓÒº Ò ÐÓ ÕÙ × Ù ×Ø Ø ÜØÓ × Ò ÓÒØÖ Ö Ò ÑÙ Ó× ÑÔÐÓ× Ú Ö Ò Ó × Ð Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ ×Ø Ð ÓÒרÖÙ ÓÒ ÙÒ Ñ ÒÓ Ñ ÐØÓÒ ÒÓº 7.2 Estructuras de datos para representar grafos Ë ÓÒÓ Ò Ó× ×ÕÙ Ñ × Ô Ö Ö ÔÖ × ÒØ Ö Ö Ó× Ò Ð Ñ ÑÓÖ ÙÒ ÓÑÔÙØ ÓÖ Ñ ¹ ØÖ × Ó Ð ×Ø × ÒÐ Þ ×º C D B A E G F ÙÖ º½½ ÍÒ Ö Ó 7.2.1 Matrices de adyacencia ÈÙ ×ØÓ ÕÙ ÙÒ Ö Ó Ö ÔÖ × ÒØ Ú ×Ù ÐÑ ÒØ ÙÒ Ö Ð ÓÒ¸ Ð × Ñ ØÖ × Ô Ö Ò × Ö Ð ×¹ ØÖÙ ØÙÖ Ò ØÙÖ Ð º Ó¸ ר × Ø Ò Ò ÙÒ ØÖ ÓÒ Ù×Ó Ü ØÓ× Ò Ð Ñ Ø Ñ Ø Ô Ö ÜÔÖ × Ö Ý Ñ Ò ÔÙÐ Ö Ö Ð ÓÒ × Ò Ö × Ý¸ ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ö Ó׺ ÍÒ Ñ ØÖ Þ ÕÙ Ö ÔÖ × ÒØ ÙÒ Ö Ó × ÒÓÑ Ò “de adyacencia”º Ë ØÖ Ø ÙÒ Ñ ØÖ Þ Ù Ö M[V × V] ÙÝ × ÒØÖ × M(i, j) Ö ÔÖ × ÒØ Ò Ð ÓÒ Ü ÓÒ ÒØÖ Ð ÒÓ Ó i Ý jº Ä Ñ Ò Ñ Ò ÓÖÑ ÓÒ Ò × Ö Ò ÒØÖ × ÙÒ Ø ÕÙ Ò ÕÙ Ð Ü ×Ø Ò Ó ÒÓ Ð Ö Óº Ð Ö Ó Ð ¬ ÙÖ º½½ × Ö ÔÖ × ÒØ Ñ ÒØ Ð Ñ ØÖ Þ ÑÓ×ØÖ Ò Ð ¬ ÙÖ º½¾º ÍÒ ÖÓ Ò Ð Ù× Ò Ö Ó¸ Ñ ÒØÖ × ÕÙ ÙÒ ÙÒÓ ×Ù ÔÖ × Ò º Ë Ð Ø ÔÓ ØÓ ×Ó Ó ÙÒ ÒÓ Ó ÒÓ × ÒØ ÖÓ¸ ÒØÓÒ × Ý ÕÙ ÑÔÐ ÒØ Ö ÙÒ Ñ Ô Ó ÒÓ Ó× Ò × Ð Ñ ØÖ Þº Ä Ñ Ò Ö Ñ × × ÑÔÐ ÖÐÓ × Ñ ÒØ ÙÒ ÖÖ ÐÓ ÒÓ Ó× ÙÝÓ× Ò × × ÓÖÖ ×ÔÓÒ Ò ÓÒ Ò × Ò Ð Ñ ØÖ Þº Ë Ð ÖÖ ÐÓ ×Ø ÓÖ Ò Ó¸ ÒØÓÒ × Ð Ù×ÕÙ Ò Ö ÜÔÐ Ò Ü ¿º½º ´Ô Ò ½ µ Ò Ù ÒØÖ ÑÙÝ ¬ ÞÑ ÒØ ÙÒ Ò Ó ÙÒ ÒÓ Óº
  • 593.
    7.2. Estructuras dedatos para representar grafos 567 ⎛ ⎞ A B C D E F G ⎜ ⎟ ⎛ ⎞ ⎜ A ⎟ 0 1 1 1 0 1 1 ⎜ ⎟ ⎜ 1 ⎜ B ⎟ ⎜ 0 1 0 1 1 1 ⎟ ⎟ ⎜ ⎟ ⎜ 1 ⎜ ⎜ C ⎟ ⎟ ⎜ 1 0 1 1 0 0 ⎟ ⎟ ⎜ D ⎟ ⎜ ⎟ ⎜ ⎟ ⎜ 1 0 1 0 1 0 0 ⎟ ⎜ ⎟ ⎜ ⎟ ⎜ E ⎟ ⎜ 0 1 1 1 0 1 0 ⎟ ⎝ ⎠ ⎜ ⎟ F ⎝ 1 1 0 0 1 0 1 ⎠ G 1 1 0 0 0 1 0 ÙÖ º½¾ Å ØÖ Þ Ý Ò Ð Ö Ó Ò Ð ¬ ÙÖ º½½ Ë ÐÓ× Ö Ó× ÒÓ Ø Ò Ò Ð ÙÒ Ø ÔÓ ×Ó Ó¸ ÒØÓÒ × Ð Ì BitArray¸ ×ØÙ Ó Ò Ü ¾º½º¿ ´Ô Ò ¿ µ¸ ÔÙ ÙØ Ð Þ Ö× ÓÑÓ × ÑÔÐ ÒØ ÓÒ Ð Ñ ØÖ Þ Ý¹ Ò º ÈÓÖ ÐÓ ÓÒØÖ Ö Ó¸ × ÐÓ× Ö Ó× ×Ó Ò Ð ÙÒ Ø ÔÓ¸ ÒØÓÒ × ÒØÖ Ð Ñ ØÖ Þ ÔÓ Ö Ö ÔÖ × ÒØ Ö Ð Òר Ò Ð Ø ÔÓ ÕÙ ×Ø Ö ×Ó Ð Ö Óº Ò ×Ø ×Ó¸ Ö ÕÙ Ö ÑÓ× ÙÒ Òר Ò ×Ô Ð Ð Ø ÔÓ Ô Ö Ò Ö Ð Ù× Ò Ð Ö Óº ÍÒ Ñ ØÖ Þ Ý Ò Ó ÙÔ O(V 2) Ð × Óר ÐØÓ ÙÒ Ô Ö Ö Ó× Ñ Ò × Ð º ÈÓÖ ×Ø Ö ÞÓÒ¸ Ö ×ÙÐØ ÒØ Ö × ÒØ Ð Ù×Ó ×ØÖÙ ØÙÖ × Ö ÔÖ × ÒØ ÓÒ Ñ ¹ ØÖ × ×Ô Ö × ÕÙ ÒÓ Ó ÙÔ Ò ×Ô Ó ÔÓÖ ÒØÖ × ÒÙÐ × Ò ÒÙ ×ØÖÓ ×Ó¸ ÔÓÖ Ù× Ò Ö Ó׺ ÍÒ ÔÖ Ñ Ö Ñ Ò Ö ÓÖÖ Ö Ñ ÑÓÖ Ð ÓÒר ØÙÝ ÓÒ× Ö Ö Ð Ø ÔÓ Ö Óº Ë Ð Ñ ØÖ Þ ÒÓ Ö ÔÖ × ÒØ ÙÒ Ö Ó¸ ÒØÓÒ × ×Ø ÓÒ ×ÓÐÓ Ù Ö Ö ÐÓ× Ð Ñ ÒØÓ× ×Ó Ö Ó Ó Ð ÓÒ Ðº Ð Ñ ×ÑÓ ÑÓ Ó¸ × Ð Ö Ó ÒÓ ÓÒØ Ò Ð ÞÓ׸ ÒØÓÒ × ÒÓ × Ò × Ö Ó ÓÒ× Ö Ö Ð ÓÒ Ðº ÍÒ Ñ ØÖ Þ ØÖ ÓÒ Ð Ö ÕÙ Ö ÙÒ ÐÓÕÙ Ñ ÑÓÖ ÓÒØ ÙÓ ÔÖÓÔÓÖ ÓÒ Ð O(V 2)º Ñ ÕÙ ÙÑ ÒØ V ¸ × Ñ × Ð Ô Ö ÙÒ Ñ Ò ÓÖ Ñ ÑÓÖ Ò ÓÒØÖ Ö ÙÒ ÐÓÕÙ ÓÒØ ÙÓº ÍÒ ×ÕÙ Ñ ÙÒ ÓÒ ÐÑ ÒØ ÕÙ Ú Ð ÒØ ¸ ÓÒ× ×Ø Ò Ô ÖØ Ö ÙÒ ÖÖ ¹ ÐÓ ÖÖ ÐÓ× ÙÝ Ö ÔÖ × ÒØ ÓÒ Ô ØÓÖ × ÑÙ ×ØÖ Ò Ð ¬ ÙÖ º½¿º Ò × ×Ó¸ Ð Ñ Ò ÓÖ Ñ ÑÓÖ Ö ÕÙ Ö Ô ÖØ Ö V ÐÓÕÙ × ÓÒØ ÙÓ× Ø Ñ ÒÓ V ¸ ÐÓ Ù Ð × Ñ × Ð ÕÙ ÙÒÓ ×ÓÐÓ V × V º Ò C++¸ ÙÒ Ñ ØÖ Þ Ý Ò Ö Ó× Ð Ø ÔÓ T × ÐÖ Ò Ð × Ù ÒØ ÑÓ Ó Ò Ð Þ Ö ÖÖ ÐÓ ÖÖ ÐÓ× ≡ T ** matriz = new T * [V]; for (int i = 0; i < V; ++i) matriz[i] = new T [V]; ר Ó Ó ÔÙ ÑÓ ¬ Ö× Ô Ö Ù× Ö Ð Ø ÔÓ BitArray¸ ÐÓ ÕÙ × ÓÑÓ Ö Óº À Ý Ð ÓÖ ØÑÓ× ÕÙ × × ÑÔ Ò Ò Ñ ÓÖ ÓÒ Ñ ØÖ × Ý Ò ÕÙ ÓÒ ×Ù ÓÒ¹ ØÖ Ô ÖØ ÕÙ Ù× Ð ×Ø × ÒÐ Þ ×º Ð ÙÒÓ× Ð ÓÖ ØÑÓ× ÓÒ Ñ ØÖ × Ý Ò Ö ÕÙ Ö Ò ÓØÖ × Ñ ØÖ × Ô Ö Ñ ÒØ Ò Ö ×Ø Ó ×Ù× Ð ÙÐÓ׸ ÐÓ ÕÙ Ò Ö Ñ ÒØ Ð Óר Ò Ñ ÑÓ¹ Ö º Ô ÖØ Ð ÔÖÓÚ Ñ ÒØÓ Ð Ø ÔÓ Ö Ó¸ ÓØÖ ÓÖÑ ÓÖÖ Ö ×Ô Ó × Ù× Ö ÙÒ ÖÖ ÐÓ ×Ô Ö Ó Ð Ø ÔÓ DynArray<T> ×ØÙ Ó Ò Ü ¾º½º ´Ô Ò ½µº ÍÒ Ñ ØÖ Þ Ý Ò Ö ÕÙ Ö ÓÒÓ Ö ÔÖ ÓÖ Ð ÒÙÑ ÖÓ ÒÓ Ó׺ ÈÓÖ ×Ø Ö ÞÓÒ¸ ר Ö ÔÖ × ÒØ ÓÒ ÒÓ × ÓÒÚ Ò ÒØ Ô Ö × ØÙ ÓÒ × Ò Ð × Ù Ð × Ð Ö Ó × Ð Ò× ÖØ Ò Ý Ð Ñ Ò Ò ÒÓ Ó× Ó Ö Ó× Ò Ñ Ñ ÒØ º
  • 594.
    568 Cap´ ıtulo 7. Grafos A 0 1 1 1 0 1 1 B 1 0 1 0 1 1 1 C 1 1 0 1 1 0 0 D 1 0 1 0 1 0 0 E 0 1 1 1 0 1 0 F 1 1 0 0 1 0 1 G 1 1 0 0 0 1 0 ÙÖ º½¿ ÖÖ ÐÓ ÖÖ ÐÓ× ÓÖÖ ×ÔÓÒ ÒØ Ð Ñ ØÖ Þ Ý Ò Ð ¬ ÙÖ º½½ 7.2.2 Listas de adyacencia Ó ÙÒ ÒÓ Ó v Ô ÖØ Ò ÒØ ÙÒ Ö Ó¸ ×Ù Ð ×Ø Ý Ò × ÓÑÔÓÒ ÔÓÖ ÐÓ× ÒÓ Ó× ÐÓ× Ù Ð × v ר ÓÒ Ø Ó Ñ ÒØ Ö Ó׺ ר ÑÓ Ó¸ Ô Ö Ö ÔÖ × ÒØ Ö ÙÒ Ö Ó Ò Ñ ÑÓÖ ¸ × ÙØ Ð Þ Ò Ð ×Ø × Ý Ò ÔÖ ÒÓ Ó Ð Ö Óº Ä ¬ ÙÖ º½ ÐÙ×ØÖ ÙÒ ÑÔÐÓº A B C D F G B A C G F E C A D B E D E D A E D C B F F B G A E G B A F ÙÖ º½ Ä ×Ø × Ý Ò Ð Ö Ó Ò Ð ¬ ÙÖ º½½ ÒÓ Ó ÙÒ Ð ×Ø Ý Ò Ù Ö Ð Ö ÓÒ Ñ ÑÓÖ ÙÒ Ú ÖØ Ò Ð Ö Ó ÓÖÖ ×ÔÓÒ ÒØ Ð Ü ×Ø Ò ÙÒ Ö Óº ÈÙ ×ØÓ ÕÙ Ò ÙÒ Ö Ó ÐÓ× Ö Ó× ×ÓÒ Ö ÓÒ Ð ×¸ רÓ× × Ö ­ Ò Ó× Ú × Ò Ð Ö ÔÖ × ÒØ ÓÒ ÓÒ Ð ×Ø × Ý Ò Ó × ¸ ÙÒ Ú Þ ÔÓÖ ÒÓ Ó ÜØÖ ÑÓ Ö Óº ÈÓÖ ÑÔÐÓ¸ Ò Ð Ö Ó Ð ¬ ÙÖ º½½¸ Ð Ö Ó A ↔ B Ô Ö Ò Ð × Ð ×Ø × Ý Ò ÐÓ× ÒÓ Ó A Ý Bº Ä ÙÔÐ Ö Ó× Ò Ð × Ð ×Ø × Ý Ò ÖÖ ÙÒ ×Ó Ö Ó×ØÓ ×Ô Ó Ù Ò Ó ÐÓ× Ö Ó× ×Ó Ò Ð ÙÒ Ø ÔÓ ØÓ¸ ÔÙ × × ÙÔÐ Ò ÓÖÑ ÓÒº ÈÓÖ ÓØÖ Ô ÖØ ¸ Ð ÙÒÓ× Ð ÓÖ ØÑÓ× Ù Ö Ò ×Ø Ó Ð ÙÐÓ Ò ÐÓ× Ö Ó׸ ÐÓ ÕÙ Ö ÕÙ Ö ¸ Ò ×Ó Ñ ÒØ Ò Ö× Ð ÙÔÐ Ñ Ò ÓÒ ¸ ÕÙ Ð ×Ø Ó × ØÙ Ð Ò Ó× Ö ÓÒ × Ñ ÑÓÖ Ö ÒØ ׺ ÈÓÖ ×Ø Ö ÞÓÒ¸ × ÔÖ Ö Ð ×ØÖ Ö ÙÒ Ö Ó Ý Ù Ö Ö Ö ÓÒ × ×Ø Ò Ð × Ð ×Ø × Ý Ò ¸ Ò ÐÙ Ö Ù Ö Ö Ö ÓÒ × ÒÓ Ó׺ ר Ñ Ò Ö ¸ Ð Ð ×Ø Ý Ò Ú Ò ÙÒ Ð ×Ø Ö Ó׺ Ä ×Ø Ò ÓÒ Ð ÒÓ Ó ×Ø ÒÓ × Ö Ð Þ × ÙÒ Ð ÒÓ Ó ÔÖÓÔ Ø Ö Ó Ð Ð ×Ø º Ò Ð ÑÔÐÓ Ð ¬ ÙÖ º½½ × ÒÓ× Ò ÓÒØÖ ÑÓ× Ò Ð Ð ×Ø Ý Ò Ð ÒÓ Ó B Ý Ò ÓÒØÖ ÑÓ× Ð Ö Ó A ↔ B¸ ÒØÓÒ × × ÑÓ× ÕÙ × ØÖ Ø Ð Ö Ó ÓÒ × ÒØ Ó B ↔ Aº ÓÒ Ð ×ÕÙ Ñ ÒØ Ö ÓÖ × ÔÙ Ñ ÒØ Ò Ö ×Ø Ó Ò ÐÓ× Ö Ó× × Ò Ò × Ð Ö ÓÒ Ð × ÙÔÐ × ÒÓ Ó׺ ר ×ÕÙ Ñ Ø Ñ Ò ÙÒ ÓÒ ÓÒ Ö Ó× ÜÔ Ò× × Ë Ù× Ú ÖØ Ò ÐÙ Ö ÒÓ Ó Ô Ö ×Ø Ò Ù ÖÐÓ ÒÓ Ó Ò Ð Ð ×Ø Ý Ò º
  • 595.
    7.3. Un TADpara grafos (List Graph<Node, Arc>) 569 ÙÒ Ó×ØÓ Ò Ñ ÑÓÖ Ð Ö Ñ ÒØ ×ÙÔ Ö ÓÖ ÕÙ Ð Ù Ö Ö ÐÓ× ÒÓ Ó׺ Ä × Ð ×Ø × Ý Ò Ø Ò Ò Ú Ö × Ú ÒØ × Ö ×Ô ØÓ Ð × Ñ ØÖ ׺ Ä ÔÖ Ñ Ö ÐР׸ × ÕÙ Ð Óר Ò ×Ô Ó × Ü Ø Ñ ÒØ ÔÖÓÔÓÖ ÓÒ Ð Ð ÒÙÑ ÖÓ Ö Ó׺ ×ØÓ × ØÖ Ù Ò ÓÖÖÓ× Ñ ÑÓÖ Ù Ò Ó Ð Ö Ó × ×Ô Ö Óº Ä × ÙÒ Ú ÒØ × ÕÙ × Ð Ø ÓÔ Ö Ö Ð Ö Ó Ò ÙÒ ÓÒ ×Ù Ö Ø Ö Ö ¬ Ó × Ö¸ Ò ÙÒ ÓÒ ÒÓ Ó× Ý Ö Ó׺ ×ØÓ Ò Ò Ö Ð ÒÓ ×Ù ÓÒ ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ù× ÙÒ Ñ ØÖ Þ Ý Ò Ð Ù Ð ÔÖÓ Ð Ñ ÒØ Ø Ò × ÒØ Ó Ñ Ø Ñ Ø Ó¸ Ô ÖÓ ÒÓ Ð Ö ¬ Ó ÕÙ × Ò Ð ÑÓ× Ð ÔÖ Ò Ô Ó Ð Ô ØÙÐÓº Ä ÙÐØ Ñ Ú ÒØ ÕÙ ÔÖ ÑÓ× Ò Ð Ö ÔÖ × ÒØ ÓÒ ÓÒ Ð ×Ø × × ×Ù ­ Ü Ð Ô Ö Ð Ñ Ò Ó Ñ ÑÓÖ Ý Ò Ñ ×ÑÓº ÈÙ ×ØÓ ÕÙ × Ô ÖØ Ñ ÑÓÖ Ò ÙÒ ÓÒ ÒÓ Ó× Ý Ö Ó׸ × Ñ × × ÑÔÐ Ô Ö Ð Ñ Ò ÓÖ Ñ ÑÓÖ Ó Ø Ò Ö ÐÓÕÙ × ÙÒ Ò × Ò Ö Ó× Ò ÕÙ Ý ÔÓ Ñ ÑÓÖ Ó ×Ø ר ÑÙÝ Ö Ñ ÒØ º ÈÓÖ ÓØÖÓ Ð Ó¸ ÔÓÖ ×Ù Ö Ø Ö Ð ×Ø ׸ ר Ö ÔÖ × ÒØ ÓÒ × ÑÙ Ó Ñ × Ò Ñ Ô Ö ÓÔ Ö ÓÒ × ÒØ Ö Ð × Ò× Ö ÓÒ Ý Ð Ñ Ò ÓÒ ×Ó Ö ØÓ Ó × Ð × Ð ×Ø × ×ÓÒ Ó Ð Ñ ÒØ ÒÐ Þ ×º ÓÑÓ ×Ú ÒØ ÔÓ ÑÓ× ÒØ ¬ Ö ÕÙ Ð Ú Ö ¬ ÓÒ Ü ×Ø Ò ÙÒ Ö Ó × Ò Ð ÔÖÓÑ Ó Ó Ô ÓÖ ÐÓ× ×Ó× O(V)¸ ÔÙ × × Ò × Ö ÙÒ Ù×ÕÙ Ò ÙÒ Ð ×Ø Ý Ò º ÓÒ ÙÒ Ñ ØÖ Þ¸ Ò Ñ Ó¸ ר Ú Ö ¬ ÓÒ × O(1) Ó O(Ð (n))º ÓÒ ÙÒ Ñ ØÖ Þ Ý Ò ¸ ÐÓ× Ö Ó× Ô Ö Ò Ò Ð ÓÖ Ò Ó ÔÓÖ ×Ù× ¬Ð × ´Ó ÓÐÙÑÒ ×µº Ò Ð ÑÔÐÓ Ð ¬ ÙÖ º½½¸ ÐÓ× Ö Ó× Ð ÒÓ Ó D × ÑÔÖ Ô Ö Ò ÔÖ Ñ ÖÓ ÕÙ ÐÓ× ÕÙ Ú Ò Ð ÒÓ Ó Eº ÓÒ Ð ×Ø × Ý Ò ¸ Ð ÓÖ Ò Ô Ö ÓÒ ÐÓ× Ö Ó× Ý¸ ÔÓÖ Ø ÒØÓ¸ ×Ù ÓÖ Ò ÔÖÓ × Ñ ÒØÓ × Ö Ð Ø ÚÓ ×Ù ÔÓ× ÓÒ ÒØÖÓ Ð Ð ×Ø Ý Ò º Ð Ú Þ¸ Ð ÓÖ Ò Ô Ö ÓÒ Ô Ò Ð ÓÖ Ò Ò× Ö ÓÒ Ò Ð Ö Óº Ô ÖØ Ð ×Ù ÖØ ¸ ÔÓÖ ÐÓ Ò Ö Ð ×ØÓ ÒÓ Ô Ö Ø Ò Ö ÑÔÐ ÓÒ × × ÑÔ ÒÓº 7.3 Un TAD para grafos (List Graph<Node, Arc>) Ò ×Ø × ÓÒ ÔÖ × ÒØ Ö ÑÓ× Ð × ÒÓ ÑÔÐ ÒØ ÓÒ Ð Ì List Graph<Node, Arc>¸ Ð Ù Ð ÔÖ Ø Ò ÑÓ Ð Þ Ö Ö Ó× Ò Ö Ð × ÕÙ ÔÙ Ò Ù× Ö× Ô Ö Ð Ñ ÝÓÖ Ð×× ÔÐ ÓÒ × ÓÒÓ × ×Ó Ö Ö Ó׺ Ô × Ö ÕÙ Ò ×Ù × ÒØ Ó Ú ×Ù Ð ÙÒ Ö Ó Ô Ö × Ö ÑÙÝ Ò Ö Ð¸ ר ×ØÖ ÓÒ ÓÒ ÔØÓ × Ù× Ô Ö Ö ×ÓÐÚ Ö ÔÖÓ Ð Ñ × ÑÙÝ ×Ø ÒØÓ׺ ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ò ÓÒØÖ Ö ÙÒ Ô ØÖÓÒ Ò Ö Ð ÕÙ Ô ÖÑ Ø ÑÓ Ð Þ Ö ÙÒ Ì ÕÙ ÙÒ ÓÒ Ô Ö ØÓ × Ð × Ð × × ÔÖÓ Ð Ñ × ×Ó Ö Ö Ó× × Ð Ó Ðº Ñ ×¸ ÓÑÓ Ý × Ö Ò × Ó¸ ÐÙ Ó Ò× ×Ø Ö Ò Ð ÔÖ Ò Ô Ó ¬Ò¹ ¹¬Ò ´Ü ½º º¾ ´Ô Ò ¾¾µµ¸ Ð Ò Ö Ð Ø Ò ×Ù× Óר × Ò Ð × ÒØ Ó ÕÙ Ð ÙÒ × ÔÐ ÓÒ × ÒÓ Ö ÕÙ Ö Ò Ð Ñ ÕÙ Ò Ö ×ÔÐ Ô Ö ØÖ Ø Ö ÓÒ ØÓ Ó× ÐÓ× ×Ó× ÔÓ× Ð ×º Ð Ó Ó Ô ÖØ Ò ÒØ ÐÓ× Ì ÙÒ Ñ ÒØ Ð × ×Ó Ö Ö Ó× × ×Ô ¬ Ò Ð Ö ÚÓ tpl graph.Hº ÈÙ Ö Ö× ÕÙ ÙÒ Ð × ÔÖ Ò Ô Ð × ¬ ÙÐØ × Ô Ö ÑÓ Ð Þ Ö ÙÒ Ì Ö Ó× × Ð Ó ÕÙ ×Ø ÒÚÓÐÙ Ö ÓØÖ × Ð × × Ó ØÓº × Ò ÐÑ ÒØ ¸ ÙÒ Ö Ó Ñ Ò ÒÓ Ó× Ý Ö Ó׸ ÐÓ× Ù Ð ×¸ Ò ÑÙ Ó× ×Ó׸ Ý ÕÙ ØÖ Ø ÖÐÓ× ÓÑÓ ÙÒ ×ØÖ ÓÒ × Ô Ö ¸ ÙÒÕÙ Ö Ð ÓÒ ¸ Ð ÔÖÓÔ Ó Ö Óº ÍÒ ×Ô ØÓ × Ò Ð Ô Ö Ð ÓÑÔÖ × ÓÒ × Ð Ó × ÖÚ Ò ÕÙ × Ò Ð ÑÓÑ ÒØÓ Ò ÕÙ × ¬Ò Ð Ö Ó¸ × Ö¸ Ù Ò Ó ×Ø × Ð Ö Ý × ÓÑÔ Ð ¸ ÕÙ × ÓÒÓ Ö Ò ÓÑÔÐ Ø Ñ ÒØ ÐÓ× Ø ÔÓ× ÒÓ Ó× Ý Ö Ó׺ Ó ×Ù ÐØÓ Ò Ñ ×ÑÓ¸ List Graph<Node, Arc> ÓÒר ØÙÝ Ð ÔÖ Ò Ô Ð Ì Ô ÖØ Ò ÒØ ÐÓ× Ö Ó׺ ר Ì Ô ÖÑ Ø ÓÔ Ö¸ × Ò Ö Ý ÑÓ ¬ Ö ×Ù ØÓÔÓÐÓ Ö ¹
  • 596.
    570 Cap´ ıtulo 7. Grafos Ø Ö ×Ø × Ò × Ö × Ô Ö ÙÒ ÑÔÐ Ñ Ð ÓÖ ØÑÓ׺ Ð ÓÖ ØÑÓ× × Ó× Ò Ñ ØÖ × Ý Ò Ù× Ö Ò ÙÒ Ñ Ð Ì ÓÖ ÒØ Ó× Ñ ØÖ × Map Matrix Graph<GT>¸ Matrix Graph<GT> Ý Ady Mat<GT, Entry>¸ ÐÓ× Ù Ð × × Ö Ò Ø ÐÐ Ñ ÒØ × ÖÖÓÐÐ ¹ Ó× Ò Ü º ´Ô Ò µº 7.3.1 Grafos ÍÒ List Graph<Node, Arc> × ÙÒ Ð × ÕÙ ÑÓ Ð Þ ÙÒ Ö Ó ÑÔÐ Ñ ÒØ Ó ÓÒ Ð ×Ø × Ý Ò º ËÙ× Ô Ö Ñ ØÖÓ× Ø ÔÓ ×ÓÒ Ð ÒÓ Ó Ý Ð Ö Ó¸ Ý × ¬Ò Ð × Ù ÒØ ÑÓ Ó ¼ Ö Ó× ¼ ≡ template <typename __Graph_Node, typename __Graph_Arc> class List_Graph { Ì ÔÓ× List Graph<Node, Arc> ¼ Å Ñ ÖÓ× ÔÖ Ú Ó× List Graph<Node, Arc> Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ ÁØ Ö ÓÖ × List Graph<Node, Arc> }; ¬Ò × List Graph¸ Ù× Ò ÙÒ × ¼ ¸ ½ ¸ ¸ ¸ ¸ ¸ ß ½¸ ß ¸ Ò ¼½º È Ö ÔÓ Ö Ù× Ö ÙÒ Ó ØÓ List Graph<Node, Arc> × Ò × Ö Ó Ö ¬Ò Ó ÐÓ× Ø ÔÓ× ÒÓ Ó× Ý Ö Ó׸ Ù ×Ø ÓÒ Ð ÕÙ ÒÓ× Ó Ö ÑÓ× Ò Ð × ÔÖÓÜ Ñ × ×Ù ¹× ÓÒ ×º List Graph<Node, Arc> × Ö ÑÔÐ Ñ ÒØ ÙØ Ð Þ Ó Ô Ö Ð ÔÖÓ Ö Ñ ÓÒ Ò Ö × Ö¸ Ô Ö ÔÖÓ Ö Ñ Ö Ð ÓÖ ØÑÓ× ÕÙ ÙÒ ÓÒ Ò Ô Ö Ð × × Ò Ö Ð × Ö Ó׺ Ò Ð ÔÖÓ Ö Ñ ÓÒ Ò Ö × Ñ ÒÙ Ó Ò × Ö Ó ÓÒÓ Ö ÐÓ× ×Ù Ø ÔÓ× List Graph<Node, Arc>¸ ÐÓ× Ù Ð × × ¬Ò Ò ÓÒØ ÒÙ ÓÒ ¼ Ì ÔÓ× List Graph<Node, Arc> ¼ ≡ ´ ¼µ typedef List_Graph<__Graph_Node, __Graph_Arc> Graph_Class; typedef __Graph_Node Node; typedef __Graph_Arc Arc; typedef typename Node::Node_Type Node_Type; typedef typename Arc::Arc_Type Arc_Type; Í× × List Graph ¼ º ÓÒ× Ö ÑÓ× Ð × Ù ÒØ Ö Ñ ÒØÓ Ó Ó¸ Ð Ù Ð ÑÔÐ ¬ Ð Ù×Ó ×ØÓ× Ø ÔÓ× template <class GT> void fct(GT & g) { typename GT::Arc * arc; typename GT::Arc_Type dato; // ... } Ä ÙÒ ÓÒ × Ò Ö Ý Ö ÙÒ List Graph<Node, Arc> ÐÐ Ñ Ó GTº Ä ÔÖ Ñ Ö ÐÒ Ð Ö ÙÒ ÔÙÒØ ÖÓ ÙÒ Ö Ó Ñ ÒØÖ × ÕÙ Ð × Ù ÒØ Ð Ö ÙÒ Ú Ö Ð Ð Ñ ×ÑÓ Ø ÔÓ ÕÙ Ð ØÖ ÙØÓ ×Ó Ó Ð Ö Óº ÆÓØ ÑÓ× ÕÙ ×Ø Ó Ó × Ò Ö Ó Ò Ð × ÒØ Ó ÕÙ Ö ÓÔ Ö Ö ×Ó Ö Ù ÐÕÙ Ö ÓÑ Ò ÓÒ Ø ÔÓ× ÒÓ Ó× Ý Ö Ó׺ Ò ÐÓ ÕÙ × Ù Ð × × Ù ÒØ × ×Ù ¹× ÓÒ ×¸ Ñ Ò ÓÒ Ö ÑÓ× ÓÔ Ö ÓÒ × ×Ó Ö List Graph<Node, Arc> Ò Ú Ð ÒØ Ö Þ Ý ÒÓ ÑÔÐ ÒØ ÓÒº
  • 597.
    7.3. Un TADpara grafos (List Graph<Node, Arc>) 571 7.3.2 Digrafos (List Digraph<Node, Arc>) Ð Ì ÕÙ ÑÓ Ð Þ Ö Ó× × ÒÓÑ Ò List Digraph<Node, Arc>º Ì ÒØÓ ÒÚ Ð ×ØÖÙ ØÙÖ ØÓ׸ ÓÑÓ Ò Ú Ð ÒØ Ö Þ¸ Ð List Graph<Node, Arc> Ø Ò × ØÓ Ó ÐÓ Ö ÕÙ Ö Ó Ô Ö Ñ Ò Ö Ö Ó׺ ÈÓÖ × Ö ÞÓÒ ¬Ò Ö ÑÓ× List Digraph<Node, Arc> ÔÓÖ Ö Ò ÔÙ Ð List Graph<Node, Arc> Ø Ð ÓÑÓ × ÔÖ × ÒØ ÓÒØ ÒÙ ÓÒ ½ Ö Ó× ½ ≡ template <typename Node_Info, typename Arc_Info> class List_Digraph : public List_Graph<Node_Info, Arc_Info> { List_Digraph(); List_Digraph(const List_Digraph & dg); List_Digraph & operator = (List_Digraph & dg); }; ¬Ò × List Digraph¸ Ù× Ò ÙÒ × Ò º Í× × List Graph ¼º Ä ÒØ Ö Þ List Digraph<Node, Arc> × ÒØ Ð List Graph<Node, Arc> Ó¸ ׸ ÔÓÖ Ö Ú ÓÒ Ð × ×¸ Ð Ñ ×Ñ º Ò Ú Ð ÑÔÐ Ñ ÒØ ÓÒ¸ Ð ÖÒ Ö × Ò ÕÙ Ò List Graph<Node, Arc> × Ö ÙÒ Ð Ö Ó¸ × Ò Ø Ö Ð Ó Ö Ò ÐÓ× Ð ÓÖ ØÑÓ× Ý ÓÒ ÙÒ Ð ÖÓ ÓÒ×ÙÑÓ ×Ô Ó¸ Ô Ö Ö ÔÖ × ÒØ Ö Ð Ö ÓÒ Ð Ð Ö Ó¸ Ñ ÒØÖ × ÕÙ Ò List Digraph<Node, Arc> ×ÓÐÓ × ÓÐÓ Ð Ö Ó Ò Ð Ð ×Ø Ý Ò ×Ù ÒÓ Ó Ý ÒØ º ÈÙ Ö × ØÙ ÓÒ × Ò Ð × Ù Ð × × Ò × Ö Ó Ø ÖÑ Ò Ö × ÙÒ Ó ØÓ Ø ÔÓ List Graph<Node, Arc> × Ó ÒÓ ÙÒ Ö Óº È Ö ÐÐÓ¸ × ÔÖÓÚ Ð ÔÖ Ñ Ø Ú × Ù ÒØ ½ Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ ≡ ´ ¼µ ¾ bool is_digraph() const; Ð Ù Ð Ö ØÓÖÒ true × Ð Ó ØÓ × ÙÒ Ö Ó false ÐÓ ÓÒØÖ Ö Óº 7.3.3 Nodos È Ö Ö ÔÖ × ÒØ Ö ÙÒ ÒÓ Ó ÙÒ Ö Ó¸ × ÙØ Ð Þ Ð Ì Graph Node<Node Type>¸ ÙÝ ×Ô ¬ ÓÒ Ò Ö Ð × ÓÑÓ × Ù ½ ¬Ò ÓÒ ÒÓ Ó Ö Ó ½ ≡ template <typename Node_Info> class Graph_Node : public Dlink { typedef Graph_Node Node; typedef Node_Info Node_Type; Å Ñ ÖÓ× Graph Node<Node Type> ¾ }; ¬Ò ÓÒ ÒÓ Ó Ö Ó ½ ÑÓ Ð Þ ÙÒ ÒÓ Ó Ô ÖØ Ò ÒØ ÙÒ Ö Ó ÑÔÐ Ò¹ Ø Ó Ñ ÒØ Ð ×Ø × Ý Ò º ÍÒ Graph Node<Node Type> × ÙÒ Ð × ÔÐ ÒØ ÐÐ ÙÝÓ Ô Ö Ñ ØÖÓ × Ð Ø ÔÓ Ó ØÓ ×Ó Ó Ð ÒÓ Ó Ý ÕÙ × ÒÓÑ Ò Node Infoº Ë × × ¸ ÔÓÖ ÑÔÐÓ¸ ÙÒ Ö Ó Ù ×¸ ÒØÓÒ × Ð Ð Ò × Ù ÒØ Graph_Node<Ciudad> * nodo;
  • 598.
    572 Cap´ ıtulo 7. Grafos Ð Ö ÙÒ ÔÙÒØ ÖÓ ÒÓ Ó ÓÒ ØÖ ÙØÓ Ø ÔÓ Ciudadº Ú ÒØÙ ÐÑ ÒØ ¸ × ÒÓ × Ö ÕÙ Ö Ò Ò ÙÒ ØÖ ÙØÓ Ô Ö ÙÒ ÒÓ Ó Ó¸ × × ÔÖ ¬ Ö ÓÐÓ ÖÐÓ Ò ÙÒ Ö Ú ÓÒ¸ ÒØÓÒ × ÔÓ ÑÓ× ×Ô ¬ ÖÐÓ ÓÒ ØÖ ÙØÓ× Ú Ó× Ð × Ù ÒØ ÓÖÑ Graph_Node<Empty_Class> node; Ð ØÖ ÙØÓ ÙÒ ÒÓ Ó × Ù Ö Ò Ð Ñ Ñ ÖÓ ØÓ node info¸ Ð Ù Ð × ÐÖ ÓÑÓ × Ù ¾ Å Ñ ÖÓ× Graph Node<Node Type> ¾ ≡ ´ ½µ ¾ Node_Info node_info; Ý ÕÙ × Ó × ÖÚ Ý ÑÓ ¬ Ñ ÒØ ¾ Å Ñ ÖÓ× Graph Node<Node Type> ¾ +≡ ´ ½µ ¾ ¾ Node_Info & get_info() { return node_info; } ÒØÖÓ ÙÒ List Graph<Node, Arc>¸ ÒÓ Ó Ô ÖØ Ò ÙÒ Ð ×Ø Ö ÙÐ Ö Ó Ð ¹ Ñ ÒØ ÒÐ Þ ÒÓ Ó׺ Ð ÒÐ ÒØÖÓ × Ð ×Ø × this Ñ ÒØ Ö Ò ÔÙ Ð Dlinkº 7.3.3.1 Inserci´n de nodos o È Ö Ð ÓÑÔÖ Ò× ÓÒ ×Ø ×Ù ¹× ÓÒ Ý Ð × ×Ù ¹× Ù ÒØ × × Ò × Ö Ó ÔÖ Ò Ö ÕÙ ÙÒ Ö Ó List Graph<Node, Arc> Ù× Ó ØÓ× Ø ÔÓ List Graph<Node, Arc>::Node Ý ÒÓ ×ØÖ Ø Ñ ÒØ Ø ÔÓ Graph Node<Node Type>º ÙÒÕÙ ×Ò Ù Ö × Ö× Ò Graph Node<Node Type>¸ List Graph<Node, Arc>::Node ÔÓ Ö × Ö ÙÒ Ö Ú ÓÒº ÈÓÖ ×Ø Ö ÞÓÒ¸ ØÓ× Ð ÓÑÔÐ Ø ØÙ Ø ÔÓ׸ × Ò × Ö Ó Ò× ×Ø Ö Ò ÕÙ Ò ÙÒ List Graph<Node, Arc> Ð ÒÓ Ó × Ø ÔÓ List Graph<Node, Arc>::Nodeº À Ð Ð Ö ØÓÖ ÒØ Ö ÓÖ ÔÓ ÑÓ× Ð Ö Ð Ò× Ö ÓÒ ÙÒ ÒÓ Ó Ò ÙÒ List Graph<Node, Arc>º À Ý Ó× ÓÔ Ö ÓÒ × ¾ Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ ½ ¾ inline virtual Node * insert_node(Node * node); inline virtual Node * insert_node(const Node_Type & node_info); Ä ÔÖ Ñ Ö Ú Ö× ÓÒ ØÓÑ ÙÒ ÒÓ Ó Ý Ö Ó¸ × Ö¸ ÙÝ ÓÒרÖÙ ÓÒ Ý Ù Ö Ð Þ ¸ Ý ÐÓ Ò× ÖØ ÒØÖÓ Ð Ö Óº Ä × ÙÒ Ô ÖØ Ð Ñ ÑÓÖ Ô Ö ÙÒ Ó ØÓ Ø ÔÓ List Graph<Node, Arc>::Node¸ Ð × Ò Ð ØÖ ÙØÓ node info Ý ÐÙ Ó ÐÓ Ò× ÖØ ÒØÖÓ Ð Ö Óº Ë ÒÓ Ý Ñ ÑÓÖ ×Ù¬ ÒØ Ô Ö Ö Ö Ð ÒÓ Ó¸ ÒØÓÒ × × Ò Ö Ð Ü Ô ÓÒ ×Ø Ò Ö bad allocº ØÓ× ÒÓ Ö Ð ÒØ Þ Ö Ð × ÑÔ ÒÓ Ò Ñ Ó List Graph<Node, Arc>¸ insert node() ÒÓ Ö Ð Þ Ò Ò ÙÒ Ú Ð ÓÒ ÓÖÖ Ø ØÙ ÔÓÖ ÑÔÐÓ¸ Ð Ó Ð Ò¹ × Ö ÓÒº 7.3.3.2 Eliminaci´n de nodos o È Ö Ð Ñ Ò Ö ÙÒ ÒÓ Ó ÙÒ Ö Ó ×ÓÐÓ ×Ø Ø Ò Ö ÙÒ ÔÙÒØ ÖÓ Ð Ñ ×ÑÓ ¾ Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ ¾ ¿ inline virtual void remove_node(Node * node);
  • 599.
    7.3. Un TADpara grafos (List Graph<Node, Arc>) 573 remove node() Ð Ñ Ò Ð Ö Ó Ð ÒÓ Ó node ÙÒØÓ ØÓ Ó× ×Ù× Ö Ó× Ò ÒØ × Ý Ý ¹ ÒØ ׺ ÌÓ Ð Ñ ÑÓÖ Ó ÙÔ ÔÓÖ Ð ÒÓ Ó Ý ×Ù× Ö Ó× × Ð Ö º Ó Ð Ñ ×ÑÓ ×Ô Ö ØÙ ÒÓ ×Ø Ö ÐÓ× Ò Ú Ð ÓÒ¸ remove node() ÒÓ Ö Ð Þ Ú Ö ¬ ÓÒ ÓÖÖ Ø ØÙ ÔÓÖ ÑÔÐÓ¸ Ð Ð Ñ Ò ÓÒ ÙÒ ÒÓ Ó ÕÙ ÒÓ Ô ÖØ Ò Þ Ð Ö Óº 7.3.3.3 Acceso a los nodos de un grafo Ë Ò Ð × ÓÔ Ö ÓÒ × Ò× Ö ÓÒ ÚÙ ÐÚ Ò Ð ÔÙÒØ ÖÓ Ð ÒÓ Ó Ò× ÖØ Ó¸ ÐÓ ÕÙ Ô ÖÑ Ø Ö ÓÖ ÖÐÓ ¸ ÔÙ Ö ÕÙ Ö Ö× ×Ó ÐÓ× ÒÓ Ó× × ÙÒ List Graph<Node, Arc>º Ä ÔÖ Ñ Ø Ú × Ô Ö Ó Ø Ò Ö ÙÒ ÒÓ Ó Ù ÐÕÙ Ö Ð Ö Ó × ¿ Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ ¾ ¿ inline Node * get_first_node(); Ä Ù Ð Ö ØÓÖÒ ÙÒ ÒÓ Ó Ù ÐÕÙ Ö ÓÒØ Ò Ó ÒØÖÓ Ð Ö Óº get first node() × ÙÒ ÔÙÒØÓ Ù ÐÕÙ Ö ×Ó Ð Ö Óº ÆÓ Ö× Ò Ò ÙÒ ÓÒ× Ö ÓÒ Ö Ð ÒÓ Ó ÕÙ Ö ØÓÖÒ Ö ×Ø ÔÖ Ñ Ø Ú º Ð ÒÙÑ ÖÓ ÒÓ Ó× ÕÙ ÓÒØ Ò ÙÒ List Graph<Node, Arc> ÔÙ ÓÒÓ Ö× Ñ ¹ ÒØ ¿ Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ ¿ ¿ inline const size_t & get_num_nodes() const; B´squeda de nodos u Ó ÙÒ Ö Ó¸ ÔÙ ÔÐ ÒØ Ö× Ð Ù×ÕÙ Ð ÙÒ ÒÓ Ó ÕÙ Ö ÙÒ Ð ÙÒ × Ö ¹ Ø Ö ×Ø ׺ List Graph<Node, Arc> Ó Ö ØÖ × ÓÖÑ × Ù×ÕÙ ¸ × Ù Ò Ð ×¸ × Ö ÕÙ ×Ù Óר × O(n) ´|V| = nµ ÔÓÖ ÐÓ ÕÙ ÒÓ × Ö ÓÑ Ò ×Ù Ù×Ó × Ð Ù×ÕÙ × ÑÙÝ Ö Ù ÒØ º × Ñ Ò ×Ø Ö × Ò Ð Ö ÕÙ × Ð ÔÐ ÓÒ Ö ÕÙ Ö Ù×ÕÙ × Ö Ù ÒØ ׸ ÒØÓÒ × × ÔÖ Ö Ð Ò Þ Ö ÐÓ× ÒÓ Ó× Ò Ð ÙÒ ×ØÖÙ ØÙÖ ØÓ× ×Ô Ð ÙÒ Ø Ð × Ó Ð ÙÒ Ð × Ö ÓÐ Ò Ö Ó Ù×ÕÙ º Ð ÔÖ Ñ Ö Ø ÔÓ Ù×ÕÙ ×Ø Ó ÔÓÖ ¿ Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ ¿ ¿ template <class Equal> Node * search_node(const Node_Type & node_info); Ò ×Ø ×Ó¸ × Ö Ð Þ ÙÒ Ù×ÕÙ × Ù Ò Ð ÓÒ Ö Ø Ö Ó Ù Ð Equal ×Ó Ö ÐÓ× ØÖ ÙØÓ× Ð ÒÓ Óº Ä Ð × Equal Ô ÖÑ Ø ×Ø Ð Ö Ð ÙÒ Ö Ø Ö Ó × Ð Ø ÚÓ ×Ó Ö Ð ÙÒ Ô ÖØ ÐÓ× ØÖ ÙØÓ׺ Ë × × Ò ÓÑÔ Ö Ö ÒØ Ö Ñ ÒØ ÐÓ× ØÖ ÙØÓ׸ ÒØÓÒ × × ÔÙ Ù× Ö Ð × Ù ÒØ Ú Ö× ÓÒ ÔÓÖ ÓÑ × ÓÒ ¿ Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ ¿ Node * search_node(const Node_Type & node_info); Ä × ÔÖ Ñ Ö × Ú Ö× ÓÒ × List Graph<Node, Arc> ÓÒØ Ò Ò ÒÚ Ö ÒØ × ÕÙ Ò ÖØÓ ÑÓ Ó Ô ÖÑ Ø Ò Ú Ð Ö ×Ù Ù×Óº ÆÓ Ó ×Ø ÒØ ¸ × Ð Ñ Ò ÖÓÒ ÔÓÖÕÙ Ð Ö ÓÒ × ÑÔ ÒÓ Ô Ö Ð ÓÖ ØÑÓ× ÔÖÓØÓØ Ô Ó× Ö Ø Ò × Ú Ö ÕÙ ÑÔ ÙÒ Ó ¬ ÓÒ ÔÖÓ Ù Ø Ú º
  • 600.
    574 Cap´ ıtulo 7. Grafos Ð Ù Ð ÒÚÓ Ð ÓÔ Ö ÓÖ == Ð Ð × Node Typeº Ð × ÙÒ Ó Ø ÔÓ Ù×ÕÙ ÓÒ× ×Ø Ò Ú Ö ¬ Ö × Ð ÙÒ ÒÓ Ó Ô ÖØ ÙÐ Ö × Ó ÒÓ Ô ÖØ Ð Ö Ó Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ ¿ bool node_belong_to_graph(Node * node); node belong to graph() Ö ØÓÖÒ true × node × Ô ÖØ Ð Ö Ó false ÐÓ ÓÒØÖ Ö Óº Ú × × Ö ÕÙ Ö Ù× Ö ÙÒ ÒÓ Ó ÓÒ Ö Ø Ö ×Ø × ÕÙ ÒÓ ×ÓÒ Ô ÖØ ×Ù× ØÖ ¹ ÙØÓ× Ø Ô Ó× ´ Ð × Node::Node Type Ó Node Infoµº ÈÓÖ ÑÔÐÓ¸ Ð ÙÒ Ò ÓÖÑ ÓÒ ÓÐÓ ÔÓÖ Ö Ú ÓÒ Graph Node<Node Type>º ÈÙ ×ØÓ ÕÙ ÒÓ Ý Ñ Ò Ö ÓÒÓ¹ Ö ÔÖ ÓÖ ×Ø × Ð × × Ö ÙÒר Ò ×¸ Ð ÙÒ ÓÖÑ ÕÙ × ÒÓ× Ó ÙÖÖ Ô Ö ÓÑÙÒ Ö Ò ÓÖÑ ÓÒ ×Ó Ö Ð Ù×ÕÙ × ÓÒ ÙÒ ÔÙÒØ ÖÓ ÓÔ Óº × Ô٠׸ ÒÙ ×ØÖ ÙÐØ Ñ Ð × Ù×ÕÙ × Ö Ð Þ Ð × Ù ÒØ ÓÖÑ Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ template <class Equal> Node * search_node(void * ptr); Р٠и Ù× Ò Ó Ð Ö Ø Ö Ó Ù Ð bool Equal::operator() (Node * curr, void * ptr)¸ Ù× ÙÒ ÒÓ Ó ÓÒ Ö Ø Ö ×Ø × ×Ô ¬ × Ò Ð ÔÙÒØ ÓÖ ptrº Iterador de nodos Ó ÙÒ List Graph<Node, Arc> Ý ÙÒ Ñ Ò Ö Ö ÓÖÖ Ö ØÓ Ó× ×Ù× ÒÓ Ó׺ È Ö ÐÐÓ¸ List Graph<Node, Arc> ÜÔÓÖØ Ð × Ù ÒØ ×Ù Ð × ÁØ Ö ÓÖ × List Graph<Node, Arc> ≡ ´ ¼µ class Node_Iterator : public Dlink::Iterator { inline Node_Iterator() { /* empty */ } inline Node_Iterator(List_Graph & _g); inline Node_Iterator(const Node_Iterator & it); inline Node_Iterator & operator = (const Node_Iterator & it); inline Node * get_current_node(); Node * get_current() { return get_current_node(); } }; ¬Ò × Node Iterator¸ Ù× Ò ÙÒ × ¾ß ¸ ¸ ¼¸ ¸ ¼¼ ¸ ½¼ ¸ ¾¼ ¸ ¿ ¸ ¸ ¾¸ ¸ ¸ ¸ ¾¸ ¿¸ ¸ ¸ ½ß ¿¸ ¾ ¸ ½ ¸ ¼¾ ¸ ½ ¸ ¾¾¸ ¾¿¸ Ò ¾ º Í× × List Graph ¼ º Ä ÓÔ Ö ÓÒ get current node() Ö ØÓÖÒ Ð ÒÓ Ó ØÙ Ð Ò ÓÒ × Ò Ù ÒØÖ Ð Ø Ö ¹ ÓÖº ÈÓÖ Ö ÞÓÒ × ÓÑÔ Ø Ð ¸ Ð Ñ ØÓ Ó ØÖ ÓÒ Ð get current() × ×Ó Ö Ö Ô Ö ÕÙ ÒÚÓÕÙ get current node()º Node Iterator Ö ÓÖÖ ØÓ Ó× ÐÓ× ÒÓ Ó× Ð Ö Ó Ò Ô Ò ÒØ Ñ ÒØ ×Ù× Ö Ð ÓÒ × ÓÒ Ø Ú º ÈÙ ×ØÓ ÕÙ Ö Ú Dlink::Iterator¸ Ð × ÓÔ Ö ÓÒ × ×ÔÐ Þ ¹ Ñ ÒØÓ Ý Ù ÓÒ ×ÓÒ Ð × Ñ ×Ñ × next()¸ prev() Ý has current()º Ð ÓÖ Ò Ú × Ø Node Iterator ÓÒ× Ö Ö× Ò Ø ÖÑ Ò Óº Ä × Ù ÒØ ÙÒ ÓÒ ÑÔÐ ¬ Ð Ö ÓÖÖ Ó ØÓ Ó× ÐÓ× ÒÓ Ó× Ð Ö Ó Ý Ð ÑÔÖ × ÓÒ¸ ÔÖ ÙÒÓ ÐÐÓ׸ Ð ÒÙÑ ÖÓ Ö Ó× template <class GT> void recorrer(GT & g) {
  • 601.
    7.3. Un TADpara grafos (List Graph<Node, Arc>) 575 for (typename GT::Node_Iterator it(g); it.has_current(); it.next()) print("%dn", g.get_num_arc(it.get_current_node()); } Iterador de arcos de un nodo Ü ×Ø ÙÒ Ð × Ø Ö ÓÖ Ð Ù Ð Ö ÓÖÖ ÐÓ× Ö Ó× Ý ÒØ × ÙÒ ÒÓ Óº ÈÓ× Ð ¹ Ñ ÒØ ר × Ð Ø Ö ÓÖ Ñ × ÔÓÔÙÐ Ö ÑÔÓÖØ ÒØ ¸ ÔÙ × × Ð × Ù ÐÕÙ Ö Ö ÓÖÖ Ó ÓÑÔÙØÓ ×Ó Ö ÙÒ Ö Óº ËÙ ×Ô ¬ ÓÒ × ÓÑÓ × Ù ÁØ Ö ÓÖ × List Graph<Node, Arc> +≡ ´ ¼µ class Node_Arc_Iterator : public Dlink::Iterator { Å Ñ ÖÓ× ÔÖ Ú Ó× Ø Ö ÓÖ ÆÓ Å Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ ÆÓ }; ¬Ò × Node Arc Iterator¸ Ù× Ò ÙÒ × ¸ ¸ ¸ ¼ ¸ ½¾ ¸ ½ ¸ ½ ß½ ¸ ¾¾¸ ¾ ¸ ¾ ¸ ¾ ¸ ¾ ¸ ¿¼ ¸ ¿ ¸ ¿ ¸ ¸ ¸ ¿¸ ¸ ¾ ¸ ¸ ¸ ¾¸ ¸ ¸ ½ß ¿¸ ¼ ¸ ¼ ¸ ½ ¸ ½ ¸ ¿¿ ¸ ¼¸ ½ ¸ ß ¸ ½ ¸ ½ ¸ Ò ¾¿ º Ä × ÓÖÑ × Ð Ö Ö ´ ÓÒרÖÙ Öµ ÙÒ Ó ØÓ Node Arc Iterator × ÜÔÖ × Ò Ñ ÒØ ÐÓ× × Ù ÒØ × ÓÒרÖÙ ØÓÖ × Å Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ ÆÓ ≡ ´ µ inline Node_Arc_Iterator(); inline Node_Arc_Iterator(Node * _src_node); inline Node_Arc_Iterator(const Node_Arc_Iterator & it); Í× × Node Arc Iterator º ÁÒØ Ö × ÒØ Ó × ÖÚ Ö ÕÙ Ð Ó ØÓ ×Ó Ó ÙÒ Node Arc Iterator × ÙÒ ÒÓ Ó Ô ÖØ Ò ÒØ ÙÒ Ö Ó Ý ÒÓ Ð Ö Ó Ñ ×ÑÓº Node Arc Iterator Ö ÕÙ Ö Ð ÓÔ Ö ÓÖ × Ò ÓÒ¸ ÑÓ Ó Ø Ð ÕÙ × ÔÙ Ò ÓÔ Ö ×Ø Ó× Ø ÑÔÓÖ Ð × Ø Ö ÓÒº È Ö ÐÐÓ Ö ÕÙ Ö ÑÓ× Ð ÓÔ Ö ÓÖ = Å Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ ÆÓ +≡ ´ µ inline Node_Arc_Iterator & operator = (const Node_Arc_Iterator & it); Í× × Node Arc Iterator º ÈÙ ×ØÓ ÕÙ Node Arc Iterator ׸ ÔÓÖ Ö Ú ÓÒ¸ Ð Ø ÔÓ Dlink::Iterator¸ ר ÓÒØ Ò ØÓ Ó× ×Ù× Ñ ØÓ Ó× ×Ó Ó× ´next()¸ prev()¸ has current()¸ Ø Ø Ö µº Ð Ó ØÓ ØÙ Ð Ð Ø Ö ÓÖ × Ñ ÒØ Å Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ ÆÓ +≡ ´ µ typedef Arc * Item_Type; typedef Node * Set_Type; inline Arc * get_current_arc(); Arc * get_current() { return get_current_arc(); } inline Node * get_tgt_node(); get current arc() Ö ØÓÖÒ Ð Ö Ó ØÙ Ð ´ Ø ÔÓ Arcµ¸ Ñ ÒØÖ × ÕÙ get tgt node() Ö ØÓÖÒ Ð ÒÓ Ó ×Ø ÒÓ Ð Ö Ó ØÙ Ð ´ Ð ÒÓ Ó ÓÖ Ò × Ð ÕÙ Ð ×Ó Ö Ð Ù Ð × Ø Ö µº get tgt node() × ÑÙÝ ÙØ Ð ÔÓÖÕÙ Ò ×Ø ×Ó × × ×Ø Ò Ù Ð ÒÓ Ó ×Ø ÒÓ × Ö¸ ÕÙ Ð ÕÙ ×Ø ÓÒ Ø Ó Ð ÜØÖ ÑÓ Ð Ö Ó ØÙ Ð Ð ÒÓ Ó ÓÖ Ò ×Ó Ö Ð Ù Ð × ×Ø Ø Ö Ò Óº
  • 602.
    576 Cap´ ıtulo 7. Grafos Ë Ñ Ð Ö Ð Ø Ö ÓÖ ×Ó Ö ÒÓ Ó׸ Ð Ñ ØÓ Ó get current() ר ×Ó Ö Ö Ó Ô Ö ÕÙ ÒÚÓÕÙ get current arc()]. [[Node Arc Iterator × Ð ÔÖ Ò Ô Ð Ñ Ò ×ÑÓ Ô Ö Ñ Ò ÔÙÐ Ö Ö Ó× ÑÔÐ ÒØ Ó× Ñ ÒØ Ð ×Ø × ÒÐ Þ ×º × ÑÔÓÖØ ÒØ ר Ö ÕÙ ÐÓ× Ö Ó× ÙÒ ÒÓ Ó × Ú × Ø Ò Ò ÙÒ ÓÖ Ò Ò Ø ÖÑ Ò Ó¸ Р٠и ÓÒ× Ö Ö× Ð ØÓÖ Ó ÔÓÖ Ù ÐÕÙ Ö ÔÐ ÓÒ ÕÙ Ù×Ó Node Arc Iteratorº 7.3.4 Arcos ÍÒ Ö Ó ÙÒ Ö Ó × ¬Ò Ñ ÒØ Ð Ì Graph Arc<Arc Type> ÓÑÓ × Ù ¬Ò ÓÒ ÖÓ Ö Ó ≡ template <typename Arc_Info> class Graph_Arc : public Dlink { typedef Graph_Arc Arc; typedef Arc_Info Arc_Type; ØÖ ÙØÓ× Graph Arc<Arc Type> ¾ Å ØÓ Ó× Graph Arc<Arc Type> }; ¬Ò × Graph Arc¸ Ù× Ò ÙÒ º Graph Arc<Arc Type> ÑÓ Ð Þ ÙÒ Ö Ó Ô ÖØ Ò ÒØ ÙÒ Ö Ó ÑÔÐ ÒØ Ó Ñ ÒØ Ð ×Ø × Ý Ò º Ð Ù Ð ÕÙ Graph Node<Node Type>¸ Graph Arc<Arc Type> × ÙÒ Ð × Ô Ö Ñ ØÖ Þ ÙÝÓ Ø ÔÓ ×Ó Ó¸ Arc Info¸ ÓÒר ØÙÝ Ð Ò ÓÖÑ ÓÒ Ö Ð ¹ ÓÒ Ð ÖÓÝÐ Ù Ð× Ñ ÒØ Å ØÓ Ó× Graph Arc<Arc Type> ≡ ´ µ ½ Arc_Info & get_info() { return arc_info; } Ë × × ¸ ÔÓÖ ÑÔÐÓ¸ ÙÒ Ö Ó ÖÖ Ø Ö ×¸ ÒØÓÒ × Ð × Ù ÒØ Ð Ò Arc<Carretera> * arco; Ð Ö ÙÒ ÔÙÒØ ÓÖ ÙÒ Ö Ó ÕÙ Ù× ÓÑÓ ØÖ ÙØÓ ÙÒ Ø ÔÓ Carreteraº ÍÒ Ö Ó ÓÒ Ø Ó× ÒÓ Ó× ÐÐ Ñ Ó× ÓÖ Ò Ý ×Ø ÒÓ ÕÙ ÔÙ Ò Ö× Ð × Ù ÒØ Ñ Ò Ö Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ inline Node * get_src_node(Arc * arc); inline Node * get_tgt_node(Arc * arc); × ÑÓÑ ÒØÓ Ð Ö Ö Ó× Ó× × Ò Ö Ð ÓÒ ÐÓ× Ñ ØÓ Ó× ×Ó Ö ÙÒ Ö Ó ½º Ò Ð ×Ó ÙÒ Ö Ó¸ רÓ× Ñ ØÓ Ó× ÒÓ Ò × Ö Ñ ÒØ Ø Ò Ò × ÒØ Ó × ÙÒ Ð Ö ÓÒ Ð Ö Ó × ÑÔÐ Ñ ÒØ ÓÒ ÓÖÑ Ò ÙÒ Ñ Ò Ö ÓÒÓ Ö ÐÓ× ÒÓ Ó× ÕÙ ×Ø ÓÒ Ø º Ò Ð ×Ó ÙÒ Ö Ó¸ ÔÓÖ ×ÙÔÙ ×ØÓ¸ get src node() Ö ØÓÖÒ Ð ÒÓ Ó Ý ÒØ Ý get tgt node() Ð Ò ÒØ º ¾º Ñ × ÔÖ Ñ Ø Ú ×¸ × ÓÑÓ Ð Ñ ÝÓÖ Ð× ×Ó ÙÒ Ö Ó¸ ×ÓÒ Ô ÖØ Ð Ð × List Graph<Node, Arc> Ý ÒÓ Ð Ð × Graph Arc<Arc Type>º ×ØÓ ÑÔÐ ÕÙ ÓÒÓ Ö× Ð Ö Ó Ô Ö ÔÓ Ö ÒÚÓ Ö ÙÒÓ ×ØÓ× Ñ ØÓ Ó׺
  • 603.
    7.3. Un TADpara grafos (List Graph<Node, Arc>) 577 Ð Ó ÕÙ × Ø Ò × ÒØ Ó × ÓÒÓ Ö Ù Ð × Ð ÒÓ Ó ÕÙ ÓÒ Ø ÙÒ Ö Ó Ó ÙÒ ÒÓ Ó ÓÖ Òº È Ö ×ØÓ¸ × ÔÖÓÚ Ð × Ù ÒØ ÔÖ Ñ Ø Ú Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ inline Node * get_connected_node(Arc * arc, Node * node); Ä Ù Ð × ÑÔÖ Ö ØÓÖÒ Ð ÒÓ Ó ÓÒ Ø Ó node¸ ÔÓÖ Ð Ö Ó arc Ò Ô Ò ÒØ Ñ ÒØ ÕÙ × ÙÒ Ö Ó Ó Ö Óº Ç × ÓÒ ÐÑ ÒØ ¸ ÔÙ × Ö Ò × Ö Ó Ò Ö × ÙÒ ÒÓ Ó ×Ø Ó ÒÓ Ö Ð ÓÒ Ó ÓÒ ÓØÖÓ ØÖ Ú × ÙÒ Ö Óº È Ö ÐÐÓ¸ × ÔÖÓÔÓÖ ÓÒ Ð ÔÖ Ñ Ø Ú × Ù ÒØ Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ inline bool node_belong_to_arc(Arc * arc, Node * node) const; Ä Ù Ð Ö ØÓÖÒ true × node ר ÓÒ Ø Ó Ð Ö Ó arcº 7.3.4.1 Inserci´n de arcos o È Ö ¬Ò Ö ÙÒ Ö Ó Ò ÙÒ Ö Ó Ò Ö× ¬Ò Ó Ò× ÖØ Ó Ò Ð Ö Ó ×Ù× Ó× ÒÓ Ó× Ñ ÒØ Ð × ÔÖ Ñ Ø Ú × ÓÖÖ ×ÔÓÒ ÒØ × ¬Ò × Ò Ü º¿º¿º½ ´Ô Ò ¾µº ÓÒ Ð × Ö ÓÒ × ÐÓ× ÒÓ Ó׸ ÔÙ ÒÚÓ Ö× Ð × Ù ÒØ ÔÖ Ñ Ø Ú Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ inline virtual Arc * insert_arc(Node * src_node, Node * tgt_node, const typename Arc::Arc_Type & arc_info); src node Ý tgt node ×ÓÒ ÐÓ× ÒÓ Ó× ÕÙ Ö Ð ÓÒ Ð Ö Óº Ë × ØÖ Ø ÙÒ Ö Ó¸ ÒØÓÒ × Ð ÓÖ Ò ÒØÖ ÐÓ× ÒÓ Ó× ÒÓ Ø Ò ÑÔÓÖØ Ò º Ë ¸ ÔÓÖ Ð ÓÒØÖ Ö Ó¸ × ØÖ Ø ÙÒ Ö Ó¸ ÒØÓÒ × src node × Ð ÒÓ Ó Ý ÒØ Ý tgt node Ð Ò ÒØ º arc info × Ð Ú ÐÓÖ ØÖ ÙØÓ Ð Ö Ó ÓÒ ÕÙ × × Ö ÖÐÓº insert arc() Ô ÖØ Ð Ñ ÑÓÖ Ö ÕÙ Ö Ô Ö Ð Ö Ó¸ ÓÒרÖÙÝ Ð Ö Ó Ô Ö ÐÓ× Ú ÐÓÖ × ×Ô ¬ Ó× ÔÓÖ ÐÓ× Ô Ö Ñ ØÖÓ׸ ÐÓ Ò× ÖØ Ò Ð Ö Ó Ý Ö ØÓÖÒ Ð Ö ÓÒ Ñ ÑÓÖ Ð ÒÙ ÚÓ Ö Óº Ë ÒÓ Ý ×Ù¬ ÒØ Ñ ÑÓÖ ¸ × Ò Ö Ð Ü Ô ÓÒ bad allocº 7.3.4.2 Eliminaci´n de arcos o È Ö Ð Ñ Ò Ö ÙÒ Ö Ó¸ ×ÓÐÓ × Ö ÕÙ Ö ÓÒÓ Ö ×Ù Ö ÓÒ Ý ÒØÓÒ × Ú Ð Ö× Ð Ñ ØÓ Ó × Ù ÒØ Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ inline virtual void remove_arc(Arc * arc); Ð Ù Ð Ð Ñ Ò Ð Ö Ó Ð Ö Ó arc Ý Ð Ö Ð Ñ ÑÓÖ º Ð Ñ ØÓ Ó ÒÓ Ö Ð Þ Ò Ò ÙÒ Ú Ö ¬ ÓÒ ÓÖÖ Ø ØÙ ÔÓÖ ÑÔÐÓ¸ Ð Ð Ñ Ò ÓÒ ÙÒ Ö Ó ÕÙ ÒÓ Ü ×Ø Ò Ð Ö Óº ÄÓ× Ñ ØÓ Ó× ÕÙ ÐØ Ö Ò Ð ØÓÔÓÐÓ ¸ ÒØ Ò × ¸ insert node()¸ remove node()¸ insert arc() Ý remove arc() ×ÓÒ Ú ÖØÙ Ð ×º ×ØÓ × × Ð Ô Ö ×Ù Ö Ù×Ó ÙÒ ÓÒ Ð ÔÓÖ Ô ÖØ ÜØ Ò× ÓÒ × Ó ×Ô Ð Þ ÓÒ × Ö Ú ×º Ð ÙÒÓ× Ð ÓÖ ØÑÓ× ×Ó Ö Ö Ó× Ö ÕÙ Ö Ò Ð Ñ Ò Ö ÓÒ ÙÒØÓ× Ö Ó׸ Ö Ð Þ Ö ÙÒ Ð ÙÐÓ Ô Ö Ð Ý ÐÙ Ó Ö ×Ø ÙÖ ÖÐÓ׺ Ò ×Ø × × ØÙ ÓÒ × × × Ð ÕÙ Ð Ð Ñ ¹ Ò ÓÒ Ö Ó × ØÓÔÓÐÓ ¸ ÓÒ Ö Ø Ö Ø ÑÔÓÖ Ð¸ Ý ÒÓ ÓÑÔÐ Ø ÓÑÓ × ÔÐ ÒØ ÓÒ remove arc()º È Ö ÐÐÓ¸ × ÔÖÓÚ Ð × Ù ÒØ ÔÖ Ñ Ø Ú Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ inline virtual void desconnect_arc(Arc * arc);
  • 604.
    578 Cap´ ıtulo 7. Grafos ÍÒ Ö Ó × ÓÒ Ø Ó Ñ ÒØ desconnect arc() ÔÙ ÓÒ Ø Ö× ÒÙ ÚÓ ØÖ Ú × Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼µ inline virtual Arc * connect_arc(Arc * arc); 7.3.4.3 Acceso a los arcos de un grafo ÍÒ Ñ Ò Ö ÔÖ Ñ Ò Ó Ø Ò Ö ÙÒ Ö Ó Ù ÐÕÙ Ö ÙÒ Ö Ó Ð ÓÒ ÓÖÑ Ð Ñ ØÓ Ó Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ inline Arc * get_first_arc(); Ð Ù Ð Ö ØÓÖÒ ÙÒ Ö Ó Ù ÐÕÙ Ö Ð Ö Óº ÆÓ Ò Ö× ×ÙÔÓ× ÓÒ × Ö ÙÐ Ö Ó × Ö Ö ØÓÖÒ Óº Ë Ò Ñ Ö Ó¸ ÐÓ× Ö Ó× ÒØÖÓ Ð Ö Ó ÔÙ Ò ÓÖ Ò Ö× Ñ ÒØ Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ template <class Compare> inline void sort_arcs(); sort arcs<Compare>() ÓÖ Ò ÐÓ× Ö Ó× × ÙÒ Ð Ö Ø Ö Ó ÓÑÔ Ö ÓÒ Compare¸ Ð Ù Ð ÒÚÓ Ð ÓÔ Ö ÓÖ bool Compare::operator () (Arc * a1, Arc * 2)º Ð ÔÖÓ¹ Ö Ñ ÓÖ × Ö ×ÔÓÒ× Ð ÑÔÐ ÒØ Ö Ð ×Ó Ð ØÖ ÙØÓ Ð Ö Ó ÔÓÖ Ð Ù Ð × ÓÑÔ Ö Ý Ð ÓÑÔ Ö ÓÒ Ñ ×Ñ º Ð ÓÖ Ò Ñ ÒØÓ × Ö Ð Þ Ò O(n Ð (n)) ÓÒ ÓÒ×ÙÑÓ ×Ô Ó O(1)º Ð ÒÙÑ ÖÓ Ö Ó× ÙÒ Ö Ó ÔÙ ÓÒÓ Ö× Ñ ÒØ Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ inline const size_t & get_num_arcs() const; Ð ÒÙÑ ÖÓ Ö Ó× ÕÙ Ø Ò ÙÒ ÒÓ Ó Ñ ÒØ Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼µ inline const size_t & get_num_arcs(Node * node) const; B´squeda de arcos u È Ö ÐÓ× Ö Ó× Ü ×Ø Ò Ù ØÖÓ Ø ÔÓ× Ù×ÕÙ ¸ ÐÓ× Ù Ð × × ÒÙÒ Ò ÓÒØ ÒÙ ÓÒ ½º Ù×ÕÙ ÔÓÖ ØÖ ÙØÓ Arc::Arc Type Ó Arc Info Ò ×Ø ×Ó ÔÓ ÑÓ× Ù× Ö Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ template <class Equal> Arc * search_arc(const Arc_Type & arc_info); Arc * search_arc(const Arc_Type & arc_info); Ä ÔÖ Ñ Ö Ú Ö× ÓÒ Ù× Ð Ö Ø Ö Ó ÓÑÔ Ö ÓÒ Equal¸ ÐÓ ÕÙ Ô ÖÑ Ø × ÖÒ Ö Ð ÙÒ Ô ÖØ ÐÓ× ØÖ ÙØÓ× Ò Ð Ù×ÕÙ º Ä × ÙÒ Ú Ö× ÓÒ ÒÚÓ Ö Ø Ñ ÒØ Ð ÓÔ Ö ÓÖ bool Node Type::operator == (const Node Type & info)º ¾º ÈÖÙ Ô ÖØ Ò Ò Ö Ð Þ ÔÓÖ Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ bool arc_belong_to_graph(Arc * arc); Ê ÓÖ ÑÓ× ÕÙ ×ÓÒ × ÒÓÒ ÑÓ׺
  • 605.
    7.3. Un TADpara grafos (List Graph<Node, Arc>) 579 Ë Ö ØÓÖÒ true × ÙÒ Ö Ó ÓÒ Ö ÓÒ arc Ô ÖØ Ò Ð Ö Ó false ÐÓ ÓÒØÖ Ö Óº ¿º Ü ×Ø Ò ÙÒ Ö Ó ÒØÖ Ó× ÒÓ Ó× Ô Ö ÐÐÓ × Ù× Ð × Ù ÒØ ÙÒ ÓÒ ÙÒ ÓÒ × List Graph<Node, Arc> ≡ template <class GT, class SA> typename GT::Arc * search_arc(GT & g, typename GT::Node * src_node, typename GT::Node * tgt_node); Ð Ù Ð Ö ØÓÖÒ Ð Ö ÓÒ ÙÒ Ö Ó Ò ×Ó Ü ×Ø Ö Ð ÙÒÓ ÒØÖ ÐÓ× ÒÓ Ó× src node Ý tgt nodeº ÖÒ ×Ù× ÖÙØ Ò × ÔÖ ×ÓÖ ×¸ ÕÙ ×ÓÒ Ñ ØÓ Ó× List Graph<Node, Arc>¸ ר Ú Ö× ÓÒ × ÙÒ ÙÒ ÓÒ ÜØ ÖÒ Ð Ð × º ×ØÓ Ô ÖÑ Ø ×Ô Ð Þ Ö Ú Ö× ÓÒ × Ô ÖØ ÙÐ Ö × search arc() ÕÙ × ÖÒ Ò ÐÓ× Ö Ó× × ÙÒ Ð ÙÒ Ö Ø Ö Óº Ä ÔÖ Ñ Ø Ú ÙÒ ÓÒ Ô Ö Ö Ó׺ Ò ×Ó ØÖ Ø Ö× ÙÒ ÑÙÐØ Ö Ó ´Ó ÑÙÐØ Ö Óµ Ý Ö Ñ × ÙÒ Ö Ó ÒØÖ ÐÓ× ÒÓ Ó× ÒÚÓÐÙ Ö Ó׸ × Ö ØÓÖÒ Ù ÐÕÙ Ö ÒØÖ ÐÓ× Ö ÙÒ ÒØ × × Ò ÓÒ× Ö ÓÒ Ð ÙÒ Ö Ø Ö Ó ×Ô ¬ Óº º Ù×ÕÙ ×Ô Ð Þ ×Ø × Ð ×Ó Ù Ò Ó Ò Ð Ù×ÕÙ × × ×Ø Ò Ù Ö Ð ÙÒ ØÓ ÕÙ ÒÓ × Ô ÖØ ÐÓ× ØÖ ÙØÓ× Ð Ö Ó ´Arc Typeµº Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ ¾ template <class Equal> Arc * search_arc(void * ptr); Ä ÖÙØ Ò Ö ØÓÖÒ Ð Ö ÓÒÐ Ö Ó ÕÙ × Ø × ÙÐ ÔÓÖ bool Equal::operator () (Arc * arc, void *ptr)¸ Ó NULL Ò ×Ó ÕÙ × Ý Ò Ö ÓÖÖ Ó ØÓ Ó× ÐÓ× Ö Ó× × Ò × Ø × Ö Ð Ö Ø Ö Ó ÙÐ º ÌÓ × Ð × Ù×ÕÙ × ×ÓÒ O(E) Ô Ö Ð Ô ÓÖ ×Ó ´ Ù×ÕÙ ÐÐ µº Iterador sobre los arcos de un grafo ÄÓ× Ö Ó× ÙÒ Ö Ó ÔÙ Ò Ó × ÖÚ Ö× Ñ ÒØ Ð × Ù ÒØ Ø Ö ÓÖ ÁØ Ö ÓÖ × List Graph<Node, Arc> +≡ ´ ¼µ class Arc_Iterator : public Dlink::Iterator { inline Arc_Iterator() { /* empty */ } inline Arc_Iterator(List_Graph & _g); inline Arc_Iterator(const Arc_Iterator & it); inline Arc_Iterator & operator = (const Arc_Iterator & it); inline Arc * get_current_arc(); Arc * get_current() { return get_current_arc(); } }; ¬Ò × Arc Iterator¸ Ù× Ò ÙÒ × ¾ß ¸ ¸ ¼ ¸ ß ¼¼¸ ½¼ ¸ ¸ ¸ ¸ ¸ ¿½¸ ¿ ¸ ½ ¸ ½ ¸ ¼¿ ¸ ½ ¸ ¾¾¸ ¾ ¸ Ò ¿¾ º Í× × List Graph ¼ º
  • 606.
    580 Cap´ ıtulo 7. Grafos Ð Ù Ð ÕÙ ÓÒ ÐÓ× Ø Ö ÓÖ × ×Ø Ø ÜØÓ¸ Arc Iterator ÓÒØ Ò Ð × ÙÒ ÓÒ × Ø Ô × next()¸ prev() Ý has current() ´ÔÓÖ Ö Ú ÓÒ Dlink::Iteratorµº Ä Ó Ø Ò ÓÒ Ð Ö Ó Ú × Ø ØÙ Ð × Ö Ð Þ Ñ ÒØ get current arc()º Ë ÐÓ× Ö Ó× ÒÓ Ò × Ó ÓÖ Ò Ó׸ ÒØÓÒ × Ð ÓÖ Ò Ú × Ø × Ò Ø ÖÑ Ò Ó ÐÓ ÓÒØÖ Ö Ó¸ Ð Ø Ö ÓÖ Ú × Ø Ö ÐÓ× Ö Ó× × ÙÒ Ð ÓÖ Ò ×Ø Ð Ó Ò Ð ÙÐØ Ñ ÒÚÓ ÓÒ sort arcs()º 7.3.5 Atributos de control de nodos y arcos Ò ÑÙ Ó× ×Ó׸ ÐÓ× Ð ÓÖ ØÑÓ× ×Ó Ö Ö Ó× Ö ÕÙ Ö Ò Ñ ÒØ Ò Ö ÙÒ ×Ø Ó Ð ÙÐÓ Ò ×Ù× ÒÓ Ó× Ý Ö Ó׺ ÉÙ Þ Ð ×Ó Ñ × ÓÑÙÒ × Ñ Ö Ö Ó Ô ÒØ Ö ÓÑÓ Ú × Ø Ó ÙÒ ÒÓ Ó Ó ÙÒ Ö Óº Ò ×Ø × ÒÓ ÓÒØ ÑÔÐ ÑÓ× ØÖ × Ñ Ò Ö × ÐÐ Ú Ö ×Ø Ó¸ Ø ÒØÓ Ò ÐÓ× ÒÓ Ó× ÓÑÓ Ò ÐÓ× Ö Ó× Ø× ÓÒØÖÓи ÓÒØ ÓÖ × Ý ÓÓ × º Ð× ×Ø Ó × Ù Ö Ö Ø Ñ ÒØ Ò Ð ÒÓ Ó Ó Ò Ð Ö Óº 7.3.5.1 Bits de control ØÓ× Ô ÒØ Ö ÒÓ Ó× Ý Ö Ó× ×ÓÐÓ × Ö ÕÙ Ö ÙÒ Øº ÈÓ Ö ÑÓ× Ñ ÒØ Ò Ö ÙÒ Ø ÔÓÖ ÒÓ Ó Ý Ö Ó Ò ÙÒ Ú ÐÓÖ ÖÓ Ý¸ Ð ÔÖÓ × ÖÐÓ × ÙÒ Ð ÒØ Ö × Ð Ð ÓÖ ØÑÓ¸ Ô ÒØ ÖÐÓ ÓÒ ÙÒÓº Ð ÔÖÓ Ð Ñ ×Ø Ø Ò × ÕÙ ÐÓ× Ð ÓÖ ØÑÓ× ÕÙ Ù× Ò Ð Ø Ú Ò Ò ÒÓ¹Ö ÒØÖ ÒØ ׺ ÈÓÖ ÑÔÐÓ¸ ÙÒ ÔÖÙ ÓÒ Ø Ú ÔÙ Ò×Ô ÓÒ Ö ÐÓ× ÒÓ Ó× ØÖ Ú × ÐÓ× Ö Ó× Ý Ô ÒØ ÖÐÓ× Ñ ÕÙ ÐÓ× Ú × Ø º Ð Ö Ó × Ö ÓÒ ÜÓ × × Ú × Ø Ò ØÓ Ó× ÐÓ× ÒÓ Ó× × Ö¸ × Ð ¬Ò Ð Ð Ø Ö ÓÒ ØÓ Ó× ÐÓ× ÒÓ Ó× ×Ø Ò Ô ÒØ Ó׺ ÓÖ Ò¸ ÓØÖÓ Ð ÓÖ ØÑÓ ÕÙ ÒÚÓÕÙ ÔÖÙ × ÓÒ Ø Ú ÒÓ ÔÙ Ù× Ö Ð Ñ ×ÑÓ Ø Ù× Ó ÔÓÖ Ð ÔÖÙ ÓÒ Ø Ú Ô Ö Ô ÒØ Ö ×Ù× ÒÓ Ó׸ ÔÙ × ÓÑÔÖÓÑ Ø Ö Ð ÓÒ× ×Ø Ò Ð Ø ×Ø ÓÒ Ø Ú º È Ö ØÖ Ø Ö ÓÒ Ð × ØÙ ÓÒ ÒØ Ö ÓÖ Ù× Ö ÑÓ× Ú Ö Ó× Ø× Ð × ¬ Ó× × ÙÒ Ð Ð ÓÖ ØÑÓ ÕÙ ÐÓ× ÙØ Ð º רÓ× × ×Ô ¬ Ò ÓÑÓ × Ù ¼ ¬Ò ÓÒ Ø× ÓÒØÖÓÐ ¼ ≡ ÆÙÑ ÖÓ Ø ½ class Bit_Fields { unsigned int depth_first : 1; unsigned int breadth_first : 1; unsigned int test_cycle : 1; unsigned int is_acyclique : 1; unsigned int test_path : 1; unsigned int find_path : 1; unsigned int kruskal : 1; unsigned int prim : 1; unsigned int dijkstra : 1; unsigned int euler : 1; unsigned int maximum_flow : 1; unsigned int spanning_tree : 1; unsigned int build_subtree : 1; unsigned int convert_tree : 1; unsigned int cut : 1; unsigned int min : 1;
  • 607.
    7.3. Un TADpara grafos (List Graph<Node, Arc>) 581 Bit_Fields() : depth_first(0), breadth_first(0), test_cycle(0), find_path(0), kruskal(0), prim(0), dijkstra(0), euler(0), maximum_flow(0), spanning_tree(0), build_subtree(0), convert_tree(0), cut(0), min(0) { /* empty */ } Å ØÓ Ó× Ø× ÓÒØÖÓÐ ½ }; ¬Ò × Bit Fields¸ Ù× Ò ÙÒ ¾º Bit Fields × ÙÒ ØÖ ÙØÓ ÕÙ Ñ Ò ÓÑÓ Ñ Ò ÑÓ 16 Ø× ר Ò Ó× ÐÐ Ú Ö ×Ø Ó Úר º Ù ÐÕÙ Ö Ø ÓÒØÖÓÐ ÔÙ ÓÒ×ÙÐØ Ö× Ñ ÒØ ½ Å ØÓ Ó× Ø× ÓÒØÖÓÐ ½ ≡ ´ ¼µ ½ bool get_bit(const int & bit) const { switch (bit) { case Aleph::Depth_First: return depth_first; // ... } } × ÓÑÓ Ø Ñ Ò¸ Ú ÒØÙ ÐÑ ÒØ ¸ ÔÙ ÑÓ ¬ Ö× ØÖ Ú × ½ Å ØÓ Ó× Ø× ÓÒØÖÓÐ ½ +≡ ´ ¼µ ½ void set_bit(const int & bit, const int & value) { switch (bit) { case Aleph::Depth_First: depth_first = value; break; // ... } } ÄÓ× Ø× ÓÒØÖÓÐ ×Ø Ò ÒÙÑ Ö Ó× Ñ Ñ ÒØ × ÙÒ ×Ù ¬Ò ÔÖ Ø Ò Ó ÔÓÖ ÓØÖÓ× Ð ÓÖ ØÑÓ× ½ ÆÙÑ ÖÓ Ø ½ ≡ ´ ¼µ enum Graph_Bits { Depth_First, Breadth_First, Test_Cycle, Is_Acyclique, Test_Path, Find_Path, Kruskal, Prim, Dijkstra, Euler, Maximum_Flow, Spanning_Tree, ÒÐ Ö ÔÖÓ Ö Ñ ÓÒ¸ ÙÒ ÒÙÑ ÖÓ Ñ Ó × ÙÒÓ ÕÙ × ÒÓÑ Ö Ó ÓÒ ÙÒ ÒØ ¬ ÓÖº
  • 608.
    582 Cap´ ıtulo 7. Grafos Build_Subtree, Convert_Tree, Cut, Min, }; ÈÓÖ ÑÔÐÓ¸ Ð Ð ÓÖ ØÑÓ ÔÖÙ ÐÓ ÒÚÓ Ö control_bits.set_bit(Test_Cycle, 1); ØÓ× Ô ÒØ Ö ÙÒ Ú × Ø º ÒÓ Ó Ý Ö Ó ÙÒ Ö Ó ÓÒØ Ò Ø× ÓÒØÖÓÐ ×Ô ¬ Ó× ÓÑÓ × Ù ¾ Å Ñ ÖÓ× Graph Node<Node Type> ¾ +≡ ´ ½µ ¾ ¿ Bit_Fields control_bits; Í× × Bit Fields ¼º ¾ ØÖ ÙØÓ× Graph Arc<Arc Type> ¾ ≡ ´ µ ¿ Bit_Fields control_bits; Í× × Bit Fields ¼º Ò ÙÒ ÒÓ Ó ÐÓ× Ø× ÓÒØÖÓÐ ÔÙ Ò Ö× Ñ ÒØ ¾ Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼µ ¾ inline Bit_Fields & get_control_bits(Node * node); Í× × Bit Fields ¼º Ì Ñ Ò ÔÙ Ò ÓÐÓ Ö× ØÓ Ó× ÐÓ× Ø× Ò ÖÓ Ñ ÒØ ¾ Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼µ ¾ ¾ inline void reset_bit(Node * node, const int & bit); Ç × Ò Ö× ÙÒ Ø Ò Ô ÖØ ÙÐ Ö ØÖ Ú × ¾ Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼µ ¾ ¾ inline void set_bit(Node * node, const int & bit, const int & value); Ò ÐÓ Ñ ÒØ ¸ Ü ×Ø Ò Ð × Ñ ×Ñ × ÓÔ Ö ÓÒ × Ô Ö ÙÒ Ö Ó ¾ Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ ¾ ¾ inline Bit_Fields & get_control_bits(Arc * arc); inline void reset_bit(Arc * arc, const int & bit); inline void set_bit(Arc * arc, const int & bit, const int & value); Í× × Bit Fields ¼º Ë ÔÙ Ò Ö Ò Ö ÐÓ× Ø× ÓÒØÖÓÐ ØÓ Ó× ÐÓ× ÒÓ Ó× Ó Ö Ó× ÙÒ Ö Ó Ñ ÒØ ¾ Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ ¾ ¿ void reset_bit_nodes(const int & bit) { for (Node_Iterator itor(*this); itor.has_current(); itor.next()) reset_bit(itor.get_current_node(), bit); } void reset_bit_arcs(const int & bit) { for (Arc_Iterator itor(*this); itor.has_current(); itor.next()) reset_bit(itor.get_current_arc(), bit); } Í× × Arc Iterator Ò Node Iterator º ÄÓ× Ù Ð × ÓÐÓ Ò Ò ÖÓ¸ × Ô Ö ÐÓ× ÒÓ Ó× Ó Ö Ó׸ Рع × ÑÓ bit ÓÒØÖÓк
  • 609.
    7.3. Un TADpara grafos (List Graph<Node, Arc>) 583 7.3.5.2 Contadores Ð × ÙÒ Ó Ò Ú Ð Ò Ñ Ò Ó ×Ø Ó Ô Ö ÙÒ ÒÓ Ó Ó Ö Ó × ÙÒ ÓÒØ ÓÖ ÒØ ÖÓº ÈÓÖ ÐÓ Ò Ö Ð¸ ר × Ù× Ô Ö Ø ÖÑ Ò Ö Ð ÒØ Ú × Ø × Ó Ô Ö Ñ Ö Ö ÓÐÓÖ × º ËÙ ¬Ò ÓÒ Ô Ö ÙÒ ÒÓ Ó × ÓÑÓ × Ù ¿ Å Ñ ÖÓ× Graph Node<Node Type> ¾ +≡ ´ ½µ ¾ long counter; Ý Ô Ö ÙÒ Ö Ó ¿ ØÖ ÙØÓ× Graph Arc<Arc Type> ¾ +≡ ´ µ ¾ long counter; Ð ÓÒØ ÓÖ ÔÙ Ö× Ó Ö Ò Ö× ´ ÓÐÓ Ö× Ò ÖÓµ Ô Ö ÐÓ× ÒÓ Ó× ¿ Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼µ ¾ ¿ inline long & get_counter(Node * node); inline void reset_counter(Node * node); Ó Ô Ö ÐÓ× Ö Ó× ¿ Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼µ ¿ ¿ inline long & get_counter(Arc * arc); inline void reset_counter(Arc * arc); Á Ù ÐÑ ÒØ ÔÓ ÑÓ× Ö Ò Ö ÐÓ× ÓÒØ ÓÖ × ´ ÓÐÓ ÖÐÓ× Ò ÖÓµ ØÓ Ó× ÐÓ× ÒÓ Ó× Ó Ö Ó× ¿ Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ ¿ void reset_counter_nodes() { for (Node_Iterator itor(*this); itor.has_current(); itor.next()) reset_counter(itor.get_current_node()); } void reset_counter_arcs() { for (Arc_Iterator itor(*this); itor.has_current(); itor.next()) reset_counter(itor.get_current_arc()); } Í× × Arc Iterator Ò Node Iterator º 7.3.5.3 Cookies Ü ×Ø Ò ÑÙ Ó× Ð ÓÖ ØÑÓ× ÕÙ Ö ÕÙ Ö Ò ×Ó Ö ×Ø Ó Ð ÙÐÓ ÙÒ Ñ Ò Ö ÑÙÝ Ô ÖØ ÙÐ Ö Ð Ø ÔÓ Ð ÓÖ ØÑÓ Ý Ô Ö ÐÓ× Ù Ð × ÐÓ× Ø× ÓÒØÖÓÐ Ý ÓÒØ ÓÖ × ÒÓ ×ÓÒ ×Ù¹ ¬ ÒØ ׺ Ä Ù×ÕÙ Ð Ñ ÒÓ Ñ × ÓÖØÓ × ÙÒ ×ØÖ ¸ ÔÓÖ ÑÔÐÓ¸ Ò × Ø Ù Ö Ö ÖØ Ò ÓÖÑ ÓÒ Ø ÑÔÓÖ Ð Ò ÐÓ× Ö Ó׺ Ä ÓÖÑ Ý Ù×Ó ×Ø ר Ó × Ô ÖØ ÙÐ Ö Ð Ð ÓÖ ØÑÓ ×ØÖ Ý ÔÓ× Ð Ñ ÒØ ÒÓ × ÖÚ Ô Ö ÓØÖÓ× Ð ÓÖ ØÑÓ׺ Ê ÕÙ Ö ÑÓ׸ ÒØÓÒ ×¸ ÙÒ ÓÖÑ Ñ × ÑÔÐ ×Ó Ö ×Ø Ó Ò Ö Óº ÈÙ ×ØÓ ÕÙ Ò ÑÙ × Ó × ÓÒ × Ð ×Ø Ó × Ø ÑÔÓÖ Ð × Ö¸ ×ÓÐÓ × Ö ÕÙ Ö ÙÖ ÒØ Ð Ù ÓÒ Ð Ð ÓÖ ØÑÓ¸ ÒÓ × ÓÒÚ Ò ÒØ Ô Ö Ñ ØÖ Þ ÖÐÓ Ò ÙÒ ÔÐ ÒØ ÐÐ ÕÙ × Ð Ô × Ð ÒÓ Ó Ó Ö Ó Ù Ò Ó ×ØÓ× × Òר Ò Òº ÍÒ ÓÖÑ Ò Ö ¸ Ô ÖÓ Ð ¸ Ô Ö ×Ó Ö Ò Ö Ñ ÒØ ØÓ× ÐÓ× ÒÓ Ó× × ØÖ Ú × ÙÒ “cookie”º Ð Ø ÖÑ ÒÓ ÓÓ ÔÖÓÚ Ò Ð ÔÖÓ Ö Ñ ÓÒ × ×Ø Ñ ×
  • 610.
    584 Cap´ ıtulo 7. Grafos Ý ÓÒÒÓØ ÙÒ Ô Ö Ñ ØÖÓ ÓÔ Ó ÕÙ × Ð ØÖ ×Ñ Ø ÙÒ ÙÒ ÓÒº Ò ÒÙ ×ØÖÓ ×Ó¸ ÙÒ ÓÓ × ÙÒ ÔÙÒØ ÖÓ ÓÔ Ó ÕÙ × Ð ×Ó ÙÒ ÒÓ Ó Ó ÙÒ Ö Óº × Ô٠׸ ÐÓ× ÒÓ Ó× Ý ÐÓ× Ö Ó× ÔÓ× Ò ÙÒ ØÖ ÙØÓ cookie¸ ÙÝ ×Ô ¬ ÓÒ × Ð × Ù ÒØ Å Ñ ÖÓ× Graph Node<Node Type> ¾ +≡ ´ ½µ ¿ ¾ void * cookie; ØÖ ÙØÓ× Graph Arc<Arc Type> ¾ +≡ ´ µ ¿ ½ void * cookie; ÄÓ× ÓÓ × ÔÙ Ò Ö× Ñ ÒØ Ð × × Ù ÒØ × ÔÖ Ñ Ø Ú × Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ ¿ inline void *& get_cookie(Node * node); inline void *& get_cookie(Arc * arc); get cookie()Ö ØÓÖÒ ÙÒ Ö Ö Ò ÓÒ ÔÖ Ú Ð Ó× ÓÑÔÐ ØÓ׺ ÄÓ× ÓÓ × ØÓ Ó× ÐÓ× ÒÓ Ó× Ó Ö Ó× ÔÙ Ò Ö Ò Ö× Ñ ÒØ Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ void reset_cookie_nodes() { for (Node_Iterator itor(*this); itor.has_current(); itor.next()) itor.get_current_node().cookie = NULL; } void reset_cookie_arcs() { for (Arc_Iterator itor(*this); itor.has_current(); itor.next()) itor.get_current_arc().cookie = NULL; } Í× × Arc Iterator Ò Node Iterator º ËÙÔÓÒ ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ ÕÙ Ò × Ø ÑÓ× Ù Ö Ö Ò ÒÓ Ó ÙÒ Ð ×Ø Ò Ñ Ú ÐÓÖ × Ö Ð ×º Ë Ø Ò ÑÓ× ÙÒ ÔÙÒØ ÓÖ ÙÒ ÒÓ Ó¸ ÒÓÑ Ò Ó node¸ ÒØÓÒ × ÙÒ ÓÖÑ ÖÐÓ × ÓÑÓ × Ù node->get_cookie() = new DynDlist<float>; Ù Ò Ó Ð Ù×Ù Ö Ó Ö ÕÙ Ö Ö Ð Ð ×Ø ¸ ÔÙ ÖÐÓ Ñ ÒØ ÙÒ ×Ø Ò static_cast<DynDlist<float>*>(node->get_cookie()) ... ÈÓÖ ×ÙÔÙ ×ØÓ¸ ÒÓ ÓÐÚ Ö× ÒØÖ Ö Ñ ÑÓÖ Ð × ×Ø Ñ Ù Ò Ó ×Ø Ý ÒÓ × Ö ÕÙ Ö º Ì Ð ÓÒ × Ö Ð Þ ÓÑÓ × Ù delete static_cast<DynDlist<float>*>(node->get_cookie()) Ë Ð Ù×Ù Ö Ó Ö ÕÙ Ö ÙÒ ×Ø Ó ×ØÖÙ ØÙÖ Ó¸ ÒØÓÒ × ×Ø ÙØ Ð Þ ÙÒ ×ØÖÙ ØÙÖ struct Ó class × ÙÒ × Ð ×Óº Ú × × Ò × Ö Ó Ù Ö Ö Ð ÙÒ Ò ÓÖÑ ÓÒ ×Ó Ð Ö Ó¸ ÒÓ ÐÓ× ÒÓ Ó× Ó Ö Ó× ÔÓÖ ÑÔÐÓ¸ Ð ÙÒ ÒÓ Ó Ó Ö Ó ÒØ Ò Ð Ú ÐÓÖ Ø ÑÔÓÖ Ðº È Ö ×ØÓ× ×Ó׸ ×ÔÓÒ ÑÓ× ÙÒ ÓÓ Ò Ð Ö Ó Å Ñ ÖÓ× ÔÖ Ú Ó× List Graph<Node, Arc> ≡ ´ ¼µ void * cookie;
  • 611.
    7.3. Un TADpara grafos (List Graph<Node, Arc>) 585 Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼µ void *& get_cookie() { return cookie; } Mapeo entre nodos y arcos ÍÒ Ù×Ó ÑÔÓÖØ ÒØ Ð cookie × ÑÔÐ ÒØ Ö Ð Ñ Ô Ó ÒØÖ Ö Ó× ÓÑÓÑÓÖ Ó× Ó ×Ó¹ ÑÓÖ Ó׺ Ò ÖØÓ× Ð ÓÖ ØÑÓ׸ Ò Ð Ó ÙÖÖ Ò Ð Ð ÙÐÓ Ð Ö ÓÐ Ö ÓÖ¸ × Ð ÙÐ Ö ÙÒ Ö Ó ÓÒ Ð ÓÖÖ ×ÔÓÒ ÒØ Ð Ö ÓÐ Ö ÓÖº È Ö ÒØ ¬ Ö ÒØÖÓ Ð Ö ÓÐ Ö ÓÖ Ù Ð × ×Ù ÒÓ Ó Ò Ð Ö Ó ÓÖ Ò Ð¸ Ð cookie ÐÑ Ò Ð Ñ Ò Ð ÒÓ Ó ÒØÖÓ Ð Ö ÓÐ Ý Ú Ú Ö× º ר Ø ÔÓ Ð ÓÖ ØÑÓ× Ð × ÔÙ × Ö ÑÙÝ ÙØ Ð Ð × × Ù ÒØ × ÔÖ Ñ Ø Ú × Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼µ static void map_nodes(Node * p, Node * q); static void map_arcs(Arc * p, Arc * q); map nodes() Ñ Ô ÒØÖ × ÐÓ× ÒÓ Ó× p Ý q¸ Ö ×Ô Ø Ú Ñ ÒØ º Ë Ý Ü ×Ø ÙÒ Ñ Ô Ó ÔÖ Ú Ó Ó × × p->get cookie() ÓÒØ Ò ÙÒ Ö ÓÒ¸ ÒØÓÒ × map nodes() Ö Ð Þ ÙÒ Ñ Ô Ó ÓÑÔÙ ×ØÓº ÈÓÖ ÑÔÐÓ¸ ×ÙÔÓÒ ÑÓ× ÕÙ p Ý q ר Ò Ñ Ô Ó× ÒØÖ × Ý ÕÙ Ö Ð Þ ÑÓ× Ð × Ù ÒØ ÐÐ Ñ map_nodes(q, t); ÒØÓÒ ×¸ Ð Ñ Ô Ó Ö ×ÙÐØ ÒØ × ÔÙ ÒØ ÖÔÖ Ø Ö ÓÑÓ p ←→ q ←→ t ←→ pº Ð Ñ Ô Ó ÒØÖ Ö Ó× Ö Ð Þ Ó Ñ ÒØ map arcs() Ø Ò × Ñ ÒØ × Ñ Ð Ö Ð ÐÓ× ÒÓ Ó׺ Ä × ÔÖ Ñ Ø Ú × Ñ Ô Ó Ô ÖÑ Ø Ò Ñ ÒØ Ò Ö Ò × Ñ Ô Ó× Ý ÓÒר ØÙÝ Ò ÙÒ ÑÒÖ × ÑÔÐ ¬ Ö ÑÙ Ó× Ð ÓÖ ØÑÓ׺ Ä × ØÙ ÓÒ Ñ × ÓÑÙÒ Ø Ò Ð × Ð × × Ð ÓÖ ØÑÓ× ÕÙ ÑÓ ¬ Ò Ð Ö Ó Ô Ö ØÙ Ö ×Ù× Ð ÙÐÓ× ÐÓ ÕÙ ÖÖ Ô Ö Ð Ö Ó ÓÖ Ò Ðº È Ö Ú Ø Ö ×Ó¸ Ö Ð Þ ÑÓ× ÙÒ ÓÔ ÓÒ Ñ Ô Ó Ý ÓÔ Ö ÑÓ× ×Ó Ö Ð ÓÔ º ÄÓ× ÓÓ × Ð Ö Ó ÓÔ Ñ ÒØ Ò Ò Ð Ñ Ò Ð Ö Ó ÓÖ Ò Ðº ÈÓÖ ×ÙÔÙ ×ØÓ¸ ×ØÓ Ø Ñ Ò Ö ÕÙ Ö ÕÙ × Ñ Ô Ò ÐÓ× Ö Ó× ÐÓ ÕÙ × Ö Ð Þ Ñ Ò Ö × Ñ Ð Ö ÐÓ× ÒÓ Ó׺ Ð Ù×Ó ÐÓ× ÓÓ ×¸ ÙÒÕÙ ×Ø ÒØ ­ Ü Ð ¸ × ÑÙÝ Ð Ó ÔÓÖÕÙ ÒÓ ×Ø Ò ×ÓÑ Ø Ó× Ð × ×Ø Ñ Ø ÔÓ× Ð ÓÑÔ Ð ÓÖº ÈÓÖ × Ö ÞÓÒ¸ × ÐØ Ñ ÒØ Ö ÓÑ Ò Ð × ÙÖ Ö× ÕÙ ÐÓ× ÓÓ × × Ò Ñ ÒØ ÙÒ ÓÒ × ÕÙ ØÙ Ò Ð ÓÒÚ Ö× ÓÒ Ø ÔÓº 7.3.5.4 Reinicio de nodos y arcos ÌÓ Ó× ÐÓ× ØÖ ÙØÓ× ÓÒØÖÓÐ ÙÒ ÒÓ Ó Ó ÙÒ Ö Ó¸ × Ö¸ ÐÓ× Ø×¸ Ð ÓÒØ ÓÖ Ý Ð ÓÓ ¸ ÔÙ Ò Ö Ò Ö× ÓÑÔÐ Ø Ñ ÒØ Ñ ÒØ Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼µ inline void reset_node(Node * node); inline void reset_arc(Arc * arc); Ì Ñ Ò ÔÙ Ò Ö Ò Ö× ØÓ Ó× ÐÓ× ØÖ ÙØÓ× ÓÒØÖÓÐ ØÓ Ó× ÐÓ× ÒÓ Ó× Ó Ö Ó× Ð Ö Óº Ò ×Ø × ÒØ Ó ÔÓ ÑÓ× ÐÙ×ØÖ Ö ÙÒ Ù×Ó ÓÒ Ö ØÓ Ð× Ð×× Operate On Nodes()() Ý Operate On Arcs()()º
  • 612.
    586 Cap´ ıtulo 7. Grafos × Ñ ÒØ ¸ ÐÓ ÕÙ × ÑÓ× × Ö ÓÖÖ Ö ÒÓ Ó ÒÚÓ Ö reset() Ô Ö ØÖ ¹ ÙØÓ ÓÒØÖÓк ר Ø Ú × ÔÙ ×Ô ¬ Ö Ñ ÒØ Ð × Ù ÒØ Ð × ÓÔ Ö ÓÒ Å Ñ ÖÓ× ÔÖ Ú Ó× List Graph<Node, Arc> +≡ ´ ¼µ struct Reset_Node { void operator () (List_Graph&, Node * node) const { node->control_bits.reset(); node->counter = 0; node->cookie = NULL; } }; Í× × List Graph ¼ º ÓÖ × ÑÔÐ Ñ ÒØ × Ö ÑÓ× Ð Ö Ò ÓÒ ÐÓ× ÒÓ Ó× Ñ ÒØ ÒÚÓ ÓÒ operate on nodes() ÓÒ Reset Node ÓÑÓ ÓÔ Ö ÓÒ Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼µ void reset_nodes() { Operate_On_Nodes <Graph_Class, Reset_Node> () (*this); } Ò ÐÓ Ñ ÒØ ¸ Ð Ñ ×Ñ Ø Ò × ÔÐ Ô Ö Ö Ò Ö ÐÓ× Ö Ó׺ × Ø Ô Ó¸ ÒØ × Ö Ð Þ Ö ÙÒ Ð ÙÐÓ ÕÙ ÒÚÓÐÙ Ö ÐÓ× ØÖ ÙØÓ× ÓÒØÖÓи Ø ÒØÓ ÒÓ Ó× ÓÑÓ Ö Ó׸ ÒÚÓ Ö reset nodes() Ý reset arcs() Ô Ö Ð ÑÔ ÖÐÓ× Ú ÐÓÖ × ÙØ Ð Þ Ó× ÔÓÖ Ð ÙÐÓ× ÔÖ Ú Ó׺ 7.3.6 Macros de acceso a nodos y arcos ØÓ× ÐØ Ö Ð Ð Ð Ó Ó¸ ÙÒÕÙ Ò ØÖ Ñ ÒØÓ Ð ÒÓר Ó × ÒØ Ø Ó Ð ÓÑÔ Ð ÓÖ¸ Ð ÑÔÐ ÒØ ÓÒ List Graph<Node, Arc> Ý Ð ÙÒÓ× Ð ÓÖ Ø¹ ÑÓ× Ù× Ò ÐÓ× × Ù ÒØ × Ñ ÖÓ× Å ÖÓ× Ô Ö Ö Ó× ≡ # define NODE_BITS(p) ((p)->control_bits) # define NODE_COUNTER(p) ((p)->counter) # define IS_NODE_VISITED(p, bit) (NODE_BITS(p).get_bit(bit)) # define NODE_COOKIE(p) ((p)->cookie) # define ARC_COUNTER(p) ((p)->counter) # define ARC_BITS(p) ((p)->control_bits) # define IS_ARC_VISITED(p, bit) (ARC_BITS(p).get_bit(bit)) # define ARC_COOKIE(p) ((p)->cookie) 7.3.7 Construcci´n y destrucci´n de List Graph<Node, Arc> o o × Ñ ÒØ ¸ ÙÒ Ö Ó ÔÙ ÓÒרÖÙ Ö× ÔÓÖ ÓÑ × ÓÒ Ó ÔÓÖ ÓÔ × ÓØÖÓ Ö Ó Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ inline List_Graph(); inline List_Graph(const List_Graph & g); Í× × List Graph ¼ º Ð ÔÖ Ñ Ö ÓÒרÖÙ ØÓÖ Ö ÙÒ Ö Ó Ú Ó ´× Ò ÒÓ Ó× Ý Ö Ó×µ Ð × ÙÒ Ó Ö Ð Þ ÙÒ ÓÔ Ö Ó gº
  • 613.
    7.3. Un TADpara grafos (List Graph<Node, Arc>) 587 × ÔÓ× Ð × Ò ÖÐ ÙÒ Ö Ó ÓØÖÓ Ö Ó Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼µ inline List_Graph& operator = (List_Graph & g); Í× × List Graph ¼ º Ò ×Ø ×Ó¸ Ð Ö Ó ×Ø ÒÓ × ×ØÖÙÝ ÓÑÔÐ Ø Ñ ÒØ Ý × ÓÔ Ð Ù ÒØ gº Ð ×ØÖÙ ØÓÖ Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼ µ inline virtual ~List_Graph(); Í× × List Graph ¼ º Ð Ñ Ò Ð Ö Ó ØÓ Ó× ÐÓ× ÒÓ Ó× Ý Ö Ó× ÕÙ ×Ø ÓÒØ Ò º ÌÓ Ð Ñ ÑÓÖ × Ð Ö º Ë ÔÙ ÓÒרÖÙ Ö ÙÒ Ö Ó Ô ÖØ Ö ÙÒ Ö Ó¸ × ÓÑÓ Ø Ñ Ò × Ò ÖÐ ÙÒ Ö Ó ÙÒ Ö Óº Ò × ×Ó¸ ÐÓ× Ö Ó× Ö Ó× ×ÓÒ ×Ùר ØÙ Ó× ÔÓÖ Ö Ó× Ö ÓÒ Ð × Å Ñ ÖÓ× ÔÙ Ð Ó× List Graph<Node, Arc> ½ +≡ ´ ¼µ inline List_Graph(List_Digraph<Node, Arc> & g); inline List_Graph & operator = (List_Digraph<Node, Arc> & g); Í× × List Digraph ½ Ò List Graph ¼º Ò Ó × ÓÒ × ÒÓ Ø Ò Ü Ô ÓÒ Ð ×¸ × Ö ÕÙ Ö ¸ Ñ × Ð ÓÔ Ð Ö Ó¸ ÙÒ Ñ Ô Ó ×ÓÑÓÖ Ó ÒØÖ Ð × ÓÔ ×º Ò ×Ø × ØÙ ÓÒ ×Ô Ð ÔÙ Ù× Ö× Ð × Ù ÒØ ÙÒ ÓÒ ÙÒ ÓÒ × List Graph<Node, Arc> +≡ template <class GT> void copy_graph(GT & gtgt, GT & gsrc, const bool & cookie_map = false); Р٠и Ò ×Ó ÕÙ Ð Ô Ö Ñ ØÖÓ cookie map × ÖØÓ¸ Ö Ð Þ ÙÒ Ñ Ô Ó Ý Ø ÚÓ ÒØÖ ÐÓ× Ó× Ö Ó× ØÖ Ú × ÐÓ× ÓÓ × ×Ù× ÒÓ Ó× Ý Ö Ó׺ Ð ¬Ò Ð Ð ÓÔ ¸ Ð ÔÙÒØ ÖÓ cookie ÒÓ Ó ÓÒØ Ò Ö Ð Ñ Ò Ò Ð Ö Ó ÓÔ Ù Ð × ÔÐ Ô Ö ÐÓ× Ö Ó׺ ÆÓØ × ÕÙ Ð ÓÔ Ñ Ô × ÙÒ ÙÒ ÓÒ ÜØ ÖÒ Ð Ð × × Ö¸ ÒÓ × ÙÒ Ñ ØÓ Ó List Graph<Node, Arc>º Ä Ö ÞÓÒ × ÕÙ × ÑÔÓ× Ð ÓÒÓ Ö Ð Ø ÔÓ ¬Ò Ð ÐÓ× ÒÓ Ó× Ý Ö Ó× ÙÒ Ð × × Ò List Graph<Node, Arc>º Ð ÖÐ ÜØ ÖÒ Ð Ð × ¸ × ×Ø Ò ÔÓ× ÓÒ ÓÒÓ Ö ÐÓ× Ø ÔÓ× Ò Ù ×Ø ÓÒ Ý Ö Ð Þ Ö Ð × ÓÔ × Ù ×º ÓÒ× Ù ÒØ Ñ ÒØ ¸ ÒÓ × Ö ÓÑ Ò Ð ÕÙ Ð ÓÔ Ö Ó× ×Ù Ý Þ Ò Ð ÓÒרÖÙ ØÓÖ ÓÔ Ó Ð ÓÔ Ö ÓÖ × Ò ÓÒº Ä ÓÔ Ñ Ô × ÑÙÝ ÙØ Ð Ô Ö Ð Ö Ð Þ ÓÒ ÑÙ Ó× Ð ÓÖ ØÑÓ׺ ÈÓÖ ÑÔÐÓ¸ Ô Ö Ð ÙÐ Ö Ð ÓÑÔÐ Ñ ÒØÓ ÙÒ Ö Ó¸ ÔÓ ÑÓ׸ Ò ÔÖ Ñ Ö ÐÙ Ö¸ ÓÔ Ö Ð Ö Ó¸ ÐÙ Ó Ò× ÖØ ÑÓ× ×Ó Ö Ð ÓÔ ÐÓ× Ö Ó× Ò × Ö Ó× Ô Ö ÚÓÐÚ ÖÐÓ ÓÑÔÐ Ø Ñ ÒØ ÓÒ ÜÓ Ý¸ ¬Ò ÐÑ ÒØ ¸ Ð Ñ Ò ÑÓ× Ð ÓÔ ÕÙ ÐÐÓ× Ö Ó× ÕÙ Ý Ò × Ó Ñ Ô Ó׺ ÆÓ ØÓ × Ð × Ú × × ÓÒÚ Ò ÒØ Ñ Ô Ö Ð × ÓÔ × Ñ ÒØ ÐÓ× ÓÓ ×º Ä Ò Ö Ð ¹ Ð ×Ó Ð Ö ÔÖ × ÒØ ØÓ × ØÙ ÓÒ Ò Ð Ù Ð Ð Ö Ó ÓÔ Ö Ý ÓÒØ Ò ØÓ× Ò ÐÓ× ÓÓ ×º ר × Ð Ö ÞÓÒ ÔÓÖ Ð Ù Ð Ð Ñ Ô Ó ÒØÖ ÐÓ× ÓÓ × × ÓÔ ÓÒ Ð Ð ÓÔ º × ÔÓ× Ð ÓÖÖ Ö ÜÔÐ Ø Ñ ÒØ ÙÒ Ö Ó × Ö¸ Ð Ñ Ò Ö ØÓ Ó× ×Ù× ÒÓ Ó× ´Ý Ö Ó×µº È Ö ÐÐÓ × Ù× Ð × Ù ÒØ Ñ ØÓ Ó ÙÒ ÓÒ × List Graph<Node, Arc> +≡ template <class GT> inline void clear_graph(GT & g); ר ÔÖ Ñ Ø Ú × ÑÙÝ Ú Ð Ó× Ù Ò Ó × Ù× Ò Ö Ó× Ø ÑÔÓÖ Ð × ÓÖÖ ×ÔÓÒ ÒØ × Ð ÙÐÓ× ÒØ ÖÑ Ó׺
  • 614.
    588 Cap´ ıtulo 7. Grafos 7.3.8 Operaciones gen´ricas sobre nodos e Ò Ó × ÓÒ × × Ö ÕÙ Ö Ö Ð Þ Ö ÙÒ ÓÔ Ö ÓÒ ×Ô ¬ ×Ó Ö ØÓ Ó× ÐÓ× ÒÓ Ó× ÔÓÖ Ñ¹ ÔÐÓ¸ ÓÐÓ Ö Ð ÙÒ Ú ÐÓÖ Ò Ð ØÖ ÙØÓº È Ö Ø Ð × ØÓ× × ÔÖÓÚ Ò Ð × × Ù ÒØ × ÖÙØ Ò ×¸ Ð × Ù Ð ×¸ ÔÓÖ ×Ù × Ò ÐÐ Þ¸ × ÑÔÐ ÒØ Ò Ö Ø Ñ ÒØ ÙÒ ÓÒ × List Graph<Node, Arc> +≡ template <class GT, class Operation, class SN = Default_Show_Node<GT> > class Operate_On_Nodes { void operator () (GT & g) const { for (Node_Iterator<GT, SN> it(g); it.has_current(); it.next()) Operation () (g, it.get_current_node()); } void operator () (GT & g, void * ptr) const { for (Node_Iterator<GT, SN> itor(g); itor.has_current(); itor.next()) Operation () (g, itor.get_current_node(), ptr); } }; Í× × Node Iterator º ÓÑÓ × Ú ¸ × Ò × Ð × × Ö ÓÖÖ Ò ÒÓ Ó Ð Ö Ó g Ø ÔÓ Ò Ö Ó GT Ý ØÙ Ò Ð ÓÔ Ö ÓÒ Operation () () ×Ó Ö ÒÓ Óº Ä × ÙÒ Ú Ö× ÓÒ Ô ÖÑ Ø Ô × Ö Ô Ö Ñ ØÖÓ× ØÖ Ú × Ð ÔÙÒØ ÖÓ ptrº 7.3.9 Operaciones gen´ricas sobre arcos e Ð Ù Ð ÕÙ Ô Ö ÐÓ× ÒÓ Ó׸ × ÔÓ× Ð ØÙ Ö ÓÔ Ö ÓÒ × Ò Ö × ×Ó Ö ØÓ Ó× ÐÓ× ÒÓ Ó× Ð Ö Óº È Ö ÐÐÓ¸ × ÔÖÓÚ ¸ ÔÓÖ ÑÔÐÓ Ð × Ù ÒØ ÓÔ Ö ÓÒ ÙÒ ÓÒ × List Graph<Node, Arc> +≡ template <class GT, class Operation, class SA = Default_Show_Arc<GT> > class Operate_On_Arcs { void operator () (GT & g) const { for (Arc_Iterator<GT, SA> it(g); it.has_current(); it.next()) Operation () (g, it.get_current_arc()); } void operator () (GT & g, typename GT::Node * node) const { for (Node_Arc_Iterator<GT, SA> it(node); it.has_current(); it.next()) Operation () (g, it.get_current_arc()); } }; Í× × Arc Iterator Ò Node Arc Iterator º Ä × Ñ ÒØ × × Ñ Ð Ö Ð ÐÓ× ÒÓ Ó× ´Ú Ö Ü º¿º ´Ô Ò µµº Ä × ÙÒ ÓÔ Ö ÓÒ ×ÓÐÓ × Ö ÙÒ× Ö ÐÓ× Ö Ó× Ý ÒØ × ÙÒ ÒÓ Óº
  • 615.
    7.3. Un TADpara grafos (List Graph<Node, Arc>) 589 7.3.10 Implantaci´n de List Graph<Node, Arc> o List Graph<Node, Arc> Ñ Ò Ó× Ð ×Ø × Ö ÙÐ Ö × Ó Ð Ñ ÒØ ÒÐ Þ × ÙÒ Ð ×Ø ×Ù× ÒÓ Ó× Ý ÓØÖ ×Ù× Ö Ó׺ Ð ×Ø ×Ó ÙÒ ÓÒØ ÓÖ ×Ù× Ð Ñ ÒØÓ× Å Ñ ÖÓ× ÔÖ Ú Ó× List Graph<Node, Arc> +≡ ´ ¼µ Dlink node_list; // lista de nodos size_t num_nodes; // cantidad de nodos Dlink arc_list; // lista de arcos size_t num_arcs; // cantidad de arcos num nodes Ý num arcs ÓÒØ Ð Þ Ò Ð × ÒØ × ØÓØ Ð × ÒÓ Ó× Ý Ö Ó× Ð Ö Óº רÓ× ØÖ ÙØÓ× × ØÙ Ð Þ Ò Ò Ð ÔÖ Ñ Ø Ú × Ò× Ö ÓÒ Ý Ð Ñ Ò ÓÒº node list Ý arc list ×ÓÒ Ð × Ö ×¸ Ø ÔÓ Dlink¸ Ð × Ð ×Ø × ÒÓ¹ Ó× Ý Ö Ó׸ Ö ×Ô Ø Ú Ñ ÒØ ¸ ÕÙ ÓÒØ Ò Ð Ö Óº Ê ÓÖ ÑÓ× ÕÙ Ð × Ð × × Graph Node<Node Type> Ý Graph Arc<Arc Type> Ö Ú Ò Dlinkº Ä × Dlink¸ Ô٠׸ ÓÒ ÓÖÑ Ò Ð × ¸ Ð ÒÐ Ó Ð Ð Ð ×Ø × node list Ý arc listº ÓÑÓ node list Ý arc list ×ÓÒ¸ ÔÓÖ Ö Ú ÓÒ¸ Ø ÔÓ Dlink¸ ÔÐ ÒØ ÑÓ× Ð × × Ù ÒØ × ÙÒ ÓÒ × ÓÒÚ Ö× ÓÒ Dlink Graph Node<Node Type> Ý Graph Arc<Arc Type> Å Ñ ÖÓ× ÔÖ Ú Ó× List Graph<Node, Arc> +≡ ´ ¼µ static Node * dlink_to_node(Dlink * p) { return static_cast<Node*>(p); } static Arc * dlink_to_arc(Dlink * p) { return static_cast<Arc*>(p); } 7.3.10.1 Acceso a nodos y arcos ÓÒ ×Ø × ÓÒÚ Ö× ÓÒ × Ý ÔÓ ÑÓ× Ó ¬ Ö Ð Ð Ñ ÒØ ÐÓ× Ñ ØÓ Ó× × Ó× ×Ó ÒÓ Ó× Ý Ö Ó× Å Ñ ÖÓ× ÔÖ Ú Ó× List Graph<Node, Arc> +≡ ´ ¼µ ¾ ÁÑÔÐ ÒØ ÓÒ List Graph<Node, Arc> ≡ ¼ template <typename Node, typename Arc> Node * List_Graph<Node, Arc>::get_first_node() { return dlink_to_node(node_list.get_next()); } template <typename Node, typename Arc> Arc * List_Graph<Node, Arc>::get_first_arc() { return dlink_to_arc(arc_list.get_next()); } Í× × List Graph ¼ º Ì ÒØÓ Ð Ù×ÕÙ ÒÓ Ó× ÓÑÓ Ð Ö Ó× Ö ÕÙ Ö Ò Ø Ö Ö ×Ó Ö Ð ÓÖÖ ×ÔÓÒ ÒØ Ð ×Ø ´node list Ó arc list × ÙÒ × Ð ×Óµº ÈÓÖ × Ö ÞÓÒ¸ ÒÓ× ÓÒÚ Ò ÑÔÐ Ñ ÒØ Ö ×ØÓ× Ø Ö ÓÖ × ØÓ× ÕÙ Ð × Ù×ÕÙ × × Ö Ð Ò Ñ ÒØ ÐÐÓ׺ Iterador de nodos Ä Ð × Node Iterador × ÑÔÐ ÒØ Ö Ø Ñ ÒØ ÔÓÖ Ö Ú ÓÒ ÔÙ Ð Dlink::Iteratorº
  • 616.
    590 Cap´ ıtulo 7. Grafos Iterador de arcos Ä Ñ ×Ñ ÓÒ× Ö ÓÒ ÕÙ Ô Ö Ð Ø Ö ÓÖ ×Ó Ö ÐÓ× ÒÓ Ó× ÔÐ ×Ó Ö Ð Ø Ö ÓÖ ×Ó Ö ÐÓ× Ö Ó׸ ÔÙ × ×ØÓ× Ø Ñ Ò × ÙÒ Ñ ÒØ Ò Ò Dlinkº B´squeda de nodos u ÄÓ× Ö ÒØ × ×Ø ÐÓ× Ù×ÕÙ ÒÓ Ó× Ý Ö Ó× × ÒרÖÙÑ ÒØ Ò ØÖ Ú × Ð ÙÒÓ× ÐÓ× Ó× Ø Ö ÓÖ × ÔÖ × ÒØ Ó× Ò Ð × × ÓÒ × ÔÖ Ú ×º Ä ÑÔÐ Ñ ÒØ ÓÒ ÙÒ Ð × ÔÖ Ñ Ø Ú × ÐÙ×ØÖ Ð ×ÕÙ Ñ Ò Ö Ð ¼ ÁÑÔÐ ÒØ ÓÒ List Graph<Node, Arc> +≡ ¼ template <typename Node, typename Arc> template <class Equal> Node * List_Graph<Node, Arc>::search_node(const typename Node::Node_Type & node_info) { for (Node_Iterator itor(*this); itor.has_current(); itor.next()) { Node * current_node = itor.get_current_node(); if (Equal() (current_node->get_info(), node_info)) return current_node; } return NULL; } Í× × List Graph ¼ Ò Node Iterator º Ð Ü Ô ÓÒ Ð ×Ô Ð Þ ÓÒ ÔÓÖ ÓÑ × ÓÒ¸ ÖÙØ Ò × ÙÒ Ñ ÒØ Ò Ð Ø Ö ÓÖ ×Ó Ö ÒÓ Ó× Ð Ö Ó Node Iteratorº B´squeda de arcos u Ä Ù×ÕÙ ÙÒ Ö Ó ÒØÖÓ Ð Ö Ó × Ö Ñ Ò × ÒØ Ð ÙÒ ÒÓ Ó Ö ÓÖÖ Ö Ñ ÒØ Ð Ø Ö ÓÖ Ö Ó× ×Ø × Ø × Ö Ð Ù×ÕÙ Ó ÖÐÓ× Ö ÓÖÖ Ó ÒØ Ö Ñ ÒØ ¸ Ò ÙÝÓ ×Ó Ð Ù×ÕÙ × ÐÐ º Ä ÑÔÐ Ñ ÒØ ÓÒ × ÓÑÓ × Ù ¼ ÁÑÔÐ ÒØ ÓÒ List Graph<Node, Arc> +≡ ¼ ½ template <typename Node, typename Arc> template <class Equal> Arc * List_Graph<Node, Arc>::search_arc(const typename Arc::Arc_Type & arc_info) { for (Arc_Iterator it(*this); it.has_current(); it.next()) { Arc * current_arc = it.get_current_arc(); if (Equal () (current_arc->get_info(), arc_info)) return current_arc; } return NULL; } Í× × Arc Iterator Ò List Graph ¼º Å × Ð ÒØ ¸ Ù Ò Ó ¬Ò ÑÓ× Ð Ø Ö ÓÖ Ö Ó× ×Ó Ö ÙÒ ÒÓ Ó¸ ÑÔÐ Ñ ÒØ Ö ÑÓ× Ð Ù×ÕÙ ÙÒ Ö Ó ÕÙ ÓÒ Ø Ó× ÒÓ Ó׺
  • 617.
    7.3. Un TADpara grafos (List Graph<Node, Arc>) 591 7.3.10.2 Arcos ÍÒ Ö Ó ÓÒ Ø Ó× ÒÓ Ó× ÐÐ Ñ Ó× ÓÖ Ò Ý ×Ø ÒÓ¸ Ð Ö Ó× Ð × Ù ÒØ Ñ Ò Ö ½ ØÖ ÙØÓ× Graph Arc<Arc Type> ¾ +≡ ´ µ ¿ void * src_node; // nodo origen void * tgt_node; // nodo destino רÓ× ØÖ ÙØÓ× ×ÓÒ Ø ÔÓ void* ÔÓÖÕÙ × ÙÒ Graph Arc<Arc Type> ÒÓ × ÔÙ ÓÒÓ Ö Ð Ø ÔÓ Ü ØÓ Graph Node<Node Type> ר × ÓÒÓ Ö Ù Ò Ó × Ò×¹ Ø Ò Ð Ö Óº Ä ÑÔÐ ÒØ ÓÒ Ð ×Ó ×ØÓ× ØÖ ÙØÓ× × Ö Ð Þ × Ð Ð × List Graph<Node, Arc> Ð × Ù ÒØ Ñ Ò Ö ½ ÁÑÔÐ ÒØ ÓÒ List Graph<Node, Arc> +≡ ¼ ½ template <typename Node, typename Arc> Node * List_Graph<Node, Arc>::get_src_node(Arc * arc) { return static_cast<Node*>(arc->src_node); } template <typename Node, typename Arc> Node * List_Graph<Node, Arc>::get_tgt_node(Arc * arc) { return static_cast<Node*>(arc->tgt_node); } template <typename Node, typename Arc> bool List_Graph<Node, Arc>::node_belong_to_arc(Arc * arc, Node * node) const { return node == arc->src_node or node == arc->tgt_node; } Í× × List Graph ¼ º È Ö Ð ÑÔÐ ÒØ ÓÒ get connected node() × Ò ÑÓ× ÙÒ ÖÙØ Ò ÓÑÓÒ Ñ ¸ Ô ÖØ Graph Arc<Arc Type>¸ ÕÙ ÒÓ× × ÖÚ ÒØ ÖÑ Ö ½ Å ØÓ Ó× Graph Arc<Arc Type> +≡ ´ µ void * get_connected_node(void * node) { return src_node == node ? tgt_node : src_node; } Ñ ÒØ ÐÐ Ö Ð Þ Ö Ð Ñ ØÓ Ó List Graph<Node, Arc> ½ ÁÑÔÐ ÒØ ÓÒ List Graph<Node, Arc> +≡ ½ template <typename Node, typename Arc> Node * List_Graph<Node, Arc>::get_connected_node(Arc * arc, Node * node) { return static_cast<Node*>(arc->get_connected_node(node)); } Í× × List Graph ¼ º Listas de adyacencia Ä ÒÓ ÓÒ ØÖ ÓÒ Ð Ð ×Ø Ý Ò ×Ù Ö ÕÙ ÙÒ ÒÓ Ó ÓÒØ Ò ÙÒ Ð ×Ø ÒÓ Ó× Ý ÒØ × ÙÒØÓ ÓÒ ÐÓ× ØÖ ÙØÓ× ×Ó Ó× Ð Ö Óº Ð ÔÖÓ Ð Ñ ×Ø Ò ÓÕÙ × ÕÙ ¸ Ô Ö ÙÒ Ö Ó ´ÒÓ ÙÒ Ö Óµ ÑÓ× ÙÔÐ Ö Ü Ø Ñ ÒØ ÕÙ ÐÐ Ò ÓÖÑ ÓÒº ר Ö ÙÒ Ò ÖÖ Ð ÔÖÓ Ð Ñ ÕÙ ¸ ÔÓÖ ÑÔÐÓ¸ × × Ö ÕÙ Ö ÑÓ ¬ Ö Ð Ö Ó¸
  • 618.
    592 Cap´ ıtulo 7. Grafos ÒØÓÒ × ÑÓ× ÒØÖ Ö ÔÓÖ ÐÓ× Ó× ÒÓ Ó× ´ Ð ÓÖ Ò Ý ×Ø ÒÓµ Ý Ö Ð Þ Ö Ó× ÑÓ ¬ ¹ ÓÒ ×º ÈÓÖ × Ö ÞÓÒ¸ Ô Ö Ú Ö Ð ÔÖÓ Ð Ñ Ó Ö Ò ÒØ Ö ÓÖ Ý ÔÓÖ ¬ Ò ¬Ò ÑÓ× Ð Ø ÔÓ Arc Node¸ ÙÝ ×Ô ¬ ÓÒ × ÓÑÓ × Ù ¾ ¬Ò ÓÒ Ö Ó¹ÆÓ Ó ¾ ≡ struct Arc_Node : public Dlink { void * arc; Arc_Node() : arc(NULL) { /* empty */ } Arc_Node(void * __arc) : arc(__arc) { /* empty */ } }; ¬Ò × Arc Node¸ Ù× Ò ÙÒ × ¾ß Ò ß º Arc NodeÖ Ú Dlink¸ ÔÓÖ ÐÓ ÕÙ ×Ø × Ô ÖØ ÙÒ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ º Ð ÑÔÓ arc× ÙÒ ÔÙÒØ ÖÓ ÙÒ Graph Arc<Arc Type> ´Ó Ñ Ð Ö Ð ÔÓÖ Ö Ú ÓÒµº ר ÑÓ Ó¸ Ð Ð ×Ø Ý Ò ÙÒ ÒÓ Ó × Ð Ö ÓÑÓ × Ù ¾ Å Ñ ÖÓ× Graph Node<Node Type> ¾ +≡ ´ ½µ Dlink arc_list; ×ØÓ Ø ÖÑ Ò ÓÒ ÓÖÑ Ö Ð ×ØÖÙ ØÙÖ ØÓ× ÙÒ ÒÓ Ó Ó Ú ÖØ Ö Ó¸ Ð Ù Ð × Ö ÔÖ × ÒØ Ô ØÓÖ Ñ ÒØ Ð ÑÓ Ó × Ù ÒØ Dlink arc_list (lista de arcos del nodo) counter num_arcs counter Dlink control_bits Node_Info Enlace cookie del nodo en la lista de nodos del grafo Å ÒØÖ × ÕÙ Ð ×ØÖÙ ØÙÖ ÙÒ Arc Node × ×Ö Ô ØÓÖ Ñ ÒØ Ð × Ù ÒØ ÓÖÑ Dlink Puntero hacia el arco enlace void* del Arc_Node en la lista arc_list de un nodo ר Ñ Ò Ö ¸ × × ÐØ Ö ÙÒ Ö Ó¸ Ð ÑÓ ¬ ÓÒ × Ö Ð Þ ×Ó Ö ÙÒ ×ÓÐ Òר Ò Ø ÔÓ Graph Arc<Arc Type> Ý Ð ×Ø Ó Ð Ö Ó × Ñ ÒØ Ò Ó Ö ÒØ Ô Ö ÐÓ× Ó× ÒÓ Ó× ÓÒ Ø Ó׺ Ä Ð ×Ø Ý Ò ÙÒ ÒÓ Ó × Ø ÔÓ Dlink¸ Ô ÖÓ ×Ù× ÒÓ Ó× ×ÓÒ Ø ÔÓ Arc Nodeº ÑÓ׸ Ô٠׸ ×ÔÓÒ Ö Ð ÓÒÚ Ö× ÓÒ ¾ Å Ñ ÖÓ× ÔÖ Ú Ó× List Graph<Node, Arc> +≡ ´ ¼µ ¿ static Arc_Node * dlink_to_arc_node(Dlink * p) { return static_cast<Arc_Node*>(p); } Í× × Arc Node ¾ º Ò Ö ×ÙÑ Ò¸ Ñ Ò ÑÓ× ØÖ × Ø ÔÓ× Ð ×Ø × Ö ÙÐ Ö × Ó Ð Ñ ÒØ ÒÐ Þ × Ð Ð ×Ø ØÓ Ó× ÐÓ× ÒÓ Ó× Ð Ö Ó¸ Ð Ð ×Ø ØÓ Ó× ÐÓ× Ö Ó× Ð Ö Ó Ý Ð Ð ×Ø ÔÓÖ ÒÓ Ó ×Ù× Ö Ó׺ Ì Ð × Ð ×Ø × ×ÓÒ × Ñ ÒØ Ð Ð × Dlinkº ÈÓÖ × Ö ÞÓÒ¸ ÔÐ ÒØ ÑÓ× Ð × × Ù ÒØ × ÙÒ ÓÒ × ÓÒÚ Ö× ÓÒ Ë Ø Ò ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ ÙÒ ÔÙÒØ ÖÓ ÙÒ Ó ØÓ Node¸ ÔÓ ÑÓ× Ö Ð ÔÖ Ñ ÖÓ ×Ù× Ö Ó× Ò ×Ù Ð ×Ø Arc Node Ì Ò × Ù Ó ÓÒ Ð Ñ Ù º Ò ×Ø Ö × ÒÓ× Ö Ö ÑÓ× ÐÓ× ÒÓ Ó× ÙÒ Ð ×Ø ÒÐ Þ Ý ÒÓ ÐÓ× ÙÒ Ö Óº
  • 619.
    7.3. Un TADpara grafos (List Graph<Node, Arc>) 593 Arc_Node * p = dlink_to_arc_node(node->arc_list.get_next()); Ð ÙÐ ØÖ Ò× ÓÖÑ Ö× ÙÒ Ó ØÓ Ø ÔÓ Arc Ñ ÒØ Arc * arc = static_cast<Arc*>(p->arc); ÔÙ × p->arc × Ø ÔÓ void*º È Ö Ò ÙÐÞ Ö ÙÒ ÔÓ Ó ×Ø ÓÒÚ Ö× ÓÒ¸ Ð Ò Ô×ÙÐ ÑÓ× Ò Ð × Ù ÒØ ÔÖ Ñ Ø Ú ¿ Å Ñ ÖÓ× ÔÖ Ú Ó× List Graph<Node, Arc> +≡ ´ ¼µ ¾ ¿ static Arc * void_to_arc(Arc_Node * arc_node) { return static_cast<Arc*>(arc_node->arc); } Í× × Arc Node ¾ º ÓÑÔÐ Ø ÑÓ× ÓÖ Ð ÑÓ Ð Þ ÓÒ Ð ×ØÖÙ ØÙÖ ØÓ× ¬Ò к Ê ÓÖ ÑÓ× ÕÙ ÙÒ ÒÓ Ó Ø Ò ÙÒ Ð ×Ø arc list Ð Ñ ÒØÓ× Ø ÔÓ Arc Node ÒÐ Þ Ó× Ñ ¹ ÒØ × ÔÙÒØ ÖÓ× Ó Ð × Dlinkº ×Ù Ú Þ¸ ÙÒ Arc Node Ø Ò ÙÒ ÔÙÒØ ÖÓ ÙÒ Ö Ó Ø ÔÓ Graph Arc<Arc Type>º ר ÓÒ¬ ÙÖ ÓÒ Ô ÖÑ Ø ÙÒ Ò× Ö ÓÒ O(1) Ð Ú Þ ÕÙ ÒÓ × Ö ÙÒ Ð Ö Óº Ë Ò Ñ Ö Ó¸ × Ð × Ó× ×¸ Ð Ð Ñ Ò ÓÒ ÙÒ Ö Ó Ö ÕÙ Ö Ö Ö ÓÖÖ Ö Ð Ð ×Ø Ö Ó× Ð ÒÓ Ó ×Ø ÒÓ Ô Ö Ò ÓÒØÖ Ö ×Ù Arc Node Ý Ð Ñ Ò ÖÐÓº ÈÓÖ ×Ø Ö ÞÓÒ¸ ÓÐÓ Ö ÑÓ× Ò Graph Arc<Arc Type> ÙÒ Ó Ð ÔÙÒØ ÖÓ Ð Arc Node¸ ÙÒÓ Ð Ð ÒÓ Ó ÓÖ Ò¸ ÓØÖÓ Ð Ð ÒÓ Ó ×Ø ÒÓº Ð Graph Arc<Arc Type> Ø Ò Ö ¸ ÒØÓÒ ×¸ Ð ÓÖÑ Ô ØÓÖ × Ù ÒØ src_arc_node counter Dlink control_bits Arc_Info enlace cookie en la lista de arcos del tgt_arc_node grafo ÄÓ ÕÙ ÓÒÐÐ Ú Ð × × Ù ÒØ × Ð Ö ÓÒ × Ô Ö ÙÒ Ö Ó ¿ ØÖ ÙØÓ× Graph Arc<Arc Type> ¾ +≡ ´ µ ½ Arc_Node * src_arc_node; // puntero al Arc_Node del nodo fuente Arc_Node * tgt_arc_node; // puntero al Arc_Node del nodo destino Í× × Arc Node ¾ º Ý ÙÝ ÓÒ¬ ÙÖ ÓÒ ÒÓ× Ô ÖÑ Ø Ö ×ÓÐÚ Ö Ó× ÔÖÓ Ð Ñ × ½º Ð ÑÓÑ ÒØÓ Ð Ñ Ò Ö ÙÒ Ö Ó Ò ÙÒ Ö Ó¸ Ö ÕÙ Ö ÑÓ× Ð Ñ Ò Ö Ð Arc Node Ð × Ð ×Ø × Ð ÒÓ Ó ÓÖ Ò Ý ×Ø ÒÓ Ö ×Ô Ø Ú Ñ ÒØ º ×ØÓ × ÐÓ Ö Ò O(1) Ñ ÒØ Ð ×Ó ÐÓ× ÑÔÓ× src arc node Ý tgt arc nodeº ¾º Ù Ò Ó × ØÖ Ø ÙÒ Ö Ó¸ Ð ÒÓ Ó ×Ø ÒÓ Ð Ö Ó ÒÓ ÓÒØ Ò ÙÒ Arc Node ÕÙ ÔÙÒØ Ð Ö Óº Ð Ñ ×ÑÓ ÑÓ Ó Ð ÑÔÓ tgt arc node × Ñ ÒØ Ò Ò NULLº List Digraph<Node, Arc> Ö ØÓ Ð ÒØ Ö Þ List Graph<Node, Arc> Ý × ØÓ ×Ù ÑÔÐ ÒØ ÓÒº Ò Ð ÙÒ × ÓÔ Ö ÓÒ ×¸ Ö ÕÙ Ö Ö ÑÓ× Ø ÖÑ Ò Ö × × ØÖ Ø ÙÒ Ö Ó Ó ÙÒ Ö Óº È Ö ÐÐÓ¸ ÙØ Ð Þ Ö ÑÓ× ÙÒ Ò Ö ÐÓ ¿ Å Ñ ÖÓ× ÔÖ Ú Ó× List Graph<Node, Arc> +≡ ´ ¼µ ¿ bool digraph; Ð Ú ÐÓÖ digraph × true × × ØÖ Ø ÙÒ Ö Ó false ÐÓ ÓÒØÖ Ö Óº
  • 620.
    594 Cap´ ıtulo 7. Grafos A B C counter num_arcs=2 counter A control_bits cookie counter control_bits cookie 1 counter num_arcs=2 counter B control_bits counter cookie Arc_Nodes control_bits cookie 2 counter num_arcs=2 counter counter C control_bits control_bits cookie cookie 3 Arcos Nodos ÙÖ º½ ÍÒ Ö Ó × ÑÔÐ Ý Ð ×Ø Ó ×Ù ×ØÖÙ ØÙÖ ØÓ× Iterador de arcos sobre un nodo ÓÑÓ Ý × Ó¸ ÙÒ Ø Ö ÓÖ Ö Ó× Ô ÖØ Ö ÙÒ ÒÓ Ó × Ö Ð Þ Ô ÖØ Ö Dlink::Iterator¸ ÔÙ × Arc Node × ÔÓÖ Ö Ú ÓÒ Ø ÔÓ Dlinkº Ô ÖØ Ù Ö Ö Ð Ö Ó Ý Ð ÒÓ Ó × Ð Ù Ð × Ø Ö ¸ Node Arc Iterator¸ Ñ ÒØ Ò Ð ÙÒ ÓÒ ÕÙ Ø ÖÑ Ò Ù Ð Ö Ó ÑÓ×ØÖ Ö Å Ñ ÖÓ× ÔÖ Ú Ó× Ø Ö ÓÖ ÆÓ ≡ ´ µ Node * src_node; ÈÙ ×ØÓ ÕÙ Node Arc Iterator × ÔÓÖ Ö Ú ÓÒ Ø ÔÓ Dlink::Iterator¸ ר Ø Ò ØÓ Ó× ÐÓ× Ñ ØÓ Ó× ×Ó Ó× ´next()¸ prev()¸ has current()¸ Ø Ø Ö µº Ð Ñ ØÓ Ó Dlink::Iterator::get current() ÒÓ ÔÙ Ù× Ö× Ö Ø Ñ ÒØ ÔÓÖÕÙ ×Ø Ö ØÓÖÒ ÙÒ Dlink Ý Ò × Ø ÑÓ× ÓÒÓ Ö Ò ÔÖ Ò Ô Ó Ð Arc Nodeº ÈÓÖ Ø ÒØÓ¸ × Ò ÑÓ× ×Ø ÓÒ¹ Ú Ö× ÓÒ Å Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ ÆÓ +≡ ´ µ Arc_Node * get_current_arc_node() { return dlink_to_arc_node(Dlink::Iterator::get_current()); } Í× × Arc Node ¾ º B´squeda de un arco dados dos nodos u ÓÒ Ð Ø Ö ÓÖ Ö Ó× ×Ó Ö ÙÒ ÒÓ Ó¸ ÔÓ ÑÓ× ÑÔÐ ÒØ Ö ÐÑ ÒØ Ð Ù×ÕÙ ÙÒ Ö Ó ÕÙ ÓÒ Ø Ó× ÒÓ Ó׺ Ä × ØÓÑ Ö ÙÒÓ ÐÓ× ÒÓ Ó׸ ÔÖ Ö Ð Ñ ÒØ Ð ÕÙ
  • 621.
    7.3. Un TADpara grafos (List Graph<Node, Arc>) 595 ÓÒØ Ò Ñ ÒÓ× Ö Ó׸ Ý × ÐÐ Ö ÓÖÖ Ö ×Ù× Ö Ó× ×Ø Ò ÓÒØÖ Ö Ð ÓØÖÓ ÒÓ Ó Ó ×Ø ÕÙ ÒÓ Ý Ò Ñ × Ö Ó× ÕÙ Ö ÓÖÖ Ö¸ Ò ÙÝÓ ×Ó Ð Ù×ÕÙ × ÐÐ º ÁÑÔÐ ÒØ ÓÒ ÙÒ ÓÒ × List Graph<Node, Arc> ≡ template <class GT, class SA> typename GT::Arc * search_arc(GT & g, typename GT::Node * src_node, typename GT::Node * tgt_node) { Node_Arc_Iterator<GT, SA> itor; typename GT::Node * searched_node; if (g.is_digraph() or src_node->num_arcs < tgt_node->num_arcs) // nodo con menos arcos { searched_node = tgt_node; itor = Node_Arc_Iterator<GT, SA>(src_node); } else { searched_node = src_node; itor = Node_Arc_Iterator<GT, SA>(tgt_node); } for (/* nada */; itor.has_current(); itor.next()) if (itor.get_tgt_node() == searched_node) // ¿conecta a searched_node? return itor.get_current_arc(); return NULL; } Í× × Node Arc Iterator º 7.3.10.3 Inserci´n de nodos o Ð ÔÖ Ñ Ö Ø ÔÓ Ò× Ö ÓÒ ×ÙÑ ÕÙ Ð Ñ ÑÓÖ Ô Ö Ð ÒÓ Ó Ý × Ó Ô ÖØ Ý× ÒרÖÙÑ ÒØ Ð × Ù ÒØ Ñ Ò Ö ÁÑÔÐ ÒØ ÓÒ List Graph<Node, Arc> +≡ ½ template <typename Node, typename Arc> Node * List_Graph<Node, Arc>::insert_node(Node * node) { ++num_nodes; node_list.append(node); return node; } Í× × List Graph ¼ º Ð × ÙÒ Ó Ø ÔÓ ÜØ Ò Ð ØÖ Ó ÒØ Ö ÓÖ Ô Ö Ô ÖØ Ö Ð Ñ ÑÓÖ Ô Ö Ð ÒÓ Ó Ý ÓÐÓ ÖÐ Ð Ò ÓÖÑ ÓÒ Ð ÓÖÑ × Ù ÒØ ÁÑÔÐ ÒØ ÓÒ List Graph<Node, Arc> +≡ template <typename Node, typename Arc> Node * List_Graph<Node, Arc>::insert_node(const typename Node::Node_Type & node_info) { return List_Graph<Node, Arc>::insert_node( new Node (node_info) ); } Í× × List Graph ¼ º
  • 622.
    596 Cap´ ıtulo 7. Grafos 7.3.10.4 Inserci´n de arcos o È Ö Ò× ÖØ Ö ÙÒ Ö Ó Ò ÓÒÓ Ö× ÐÓ× ÒÓ Ó× ÕÙ ×Ø Ö Ð ÓÒ ¸ ÐÓ× Ù Ð × Ò Ö× Ò× ÖØ Ó ÔÖ Ú Ñ ÒØ Ò Ð Ö Óº Ä Ò× Ö ÓÒ ÙÒ Ö Ó × Ö ×ÙÑ Ò ÐÓ× × Ù ÒØ × Ô ×Ó× ½º Ô ÖØ Ö Ñ ÑÓÖ Ô Ö Ð Ö Ó ´ Ø ÔÓ Arcµ Ý × Ò ÖÐ ×Ù× ØÓ׺ ¾º Ë Ð Ò× Ö ÓÒ Ó ÙÖÖ Ò ÙÒ Ö Ó ´ÒÓ ÙÒ Ö Óµ¸ ÒØÓÒ × Ô ÖØ Ö Ñ ÑÓÖ Ô Ö ÙÒ Ó ØÓ Ø ÔÓ Arc Node ÓÖÖ ×ÔÓÒ ÒØ Ð ÒÓ Ó ×Ø ÒÓ tgt node¸ ÓÐÓ ÖÐÓ ÔÙÒØ Ö Ð Ö Ó Ö Ó Ò ´½µ Ò× ÖØ ÖÐÓ Ò Ð Ð ×Ø Ý Ò tgt nodeº Ò ×Ø ÔÙÒØÓ ÑÓ× ×Ø Ö Ô Ò ÒØ × ÕÙ Ð Ö Ó Ò× ÖØ Ö ÒÓ Ö ÔÖ × ÒØ ÙÒ ÐÓ Ý × ¸ × ÑÓ Ó¸ ÒÓ ÙÔÐ Ö Ð Arc Nodeº ¿º Ô ÖØ Ö Ñ ÑÓÖ Ô Ö ÙÒ Ó ØÓ Ø ÔÓ Arc Node ÓÖÖ ×ÔÓÒ ÒØ Ð ÒÓ Ó ÓÖ Ò src node¸ ÓÐÓ ÖÐÓ ÔÙÒØ Ö Ð Ö Ó Ö Ó Ò ´½µ Ò× ÖØ ÖÐÓ Ò Ð Ð ×Ø Ý Ò src node º ÁÒ× ÖØ Ö Ð Ö Ó Ò Ð Ð ×Ø Ö Ó× Ð Ö Óº Ð Ð ÓÖ ØÑÓ ÒØ Ö ÓÖ × Ó ¬ ÓÑÓ × Ù ÁÑÔÐ ÒØ ÓÒ List Graph<Node, Arc> +≡ template <typename Node, typename Arc> Arc * List_Graph<Node, Arc>::insert_arc(Node * src_node, Node * tgt_node) { // paso (1): apartar memoria para Arc e iniciar auto_ptr<Arc> arc ( new Arc ); // apartar memoria para arco arc->src_node = src_node; // Iniciar sus campos arc->tgt_node = tgt_node; // paso (3) (parcial): apartar memoria para Arc_Node de src_node auto_ptr<Arc_Node> src_arc_node ( new Arc_Node (arc.get()) ); // Paso (2): si es grafo ==> apartar memoria para Arc_Node del tgt_node if (not digraph) // si es digrafo ==> no hay que insertar en el otro nodo { // inserci´n en nodo destino o if (src_node == tgt_node) // verificar si se trata de un ciclo arc->tgt_arc_node = src_arc_node.get(); /* este es un ciclo */ else { // apartar arco nodo para tgt_node auto_ptr<Arc_Node> tgt_arc_node ( new Arc_Node (arc.get()) ); // inserci´n en lista de adyacencia de tgt_node o arc->tgt_arc_node = tgt_arc_node.get(); tgt_node->arc_list.append(tgt_arc_node.get()); tgt_node->num_arcs++; tgt_arc_node.release(); // desbloquear auto-puntero tgt_arc_node } } // paso (3) (resto) inserci´n en lista adyacencia src_node o arc->src_arc_node = src_arc_node.get(); src_node->arc_list.append(src_arc_node.get()); src_node->num_arcs++; arc_list.append(arc.get()); // paso (4) insertar arco lista de arcos de grafo ++num_arcs; src_arc_node.release(); // desbloquear tgt_arc_node
  • 623.
    7.3. Un TADpara grafos (List Graph<Node, Arc>) 597 return arc.release(); // desbloquear arc } Í× × Arc Node ¾ Ò List Graph ¼º Ä Ó ¬ ÓÒ × Ð Ö Ñ ÒØ Ö ÒØ Ð Ð ÓÖ ØÑÓ Ò ×Ø ÐÐ ÒÓ ÔÓÖÕÙ Ò ÐÐ × ÓÒ× Ö Ð ÔÓ× Ð ÕÙ Ó ÙÖÖ ÙÒ ÐÐ Ñ ÑÓÖ º È Ö Ñ ÒØ Ò Ö Ð Ó Ó ÐÓ Ñ × Ô Ö Ó Ð Ð ÓÖ ØÑÓ Ò ×Ø ÐÐ ÒÓ Ù× ÑÓ× ÙØÓ¹ÔÙÒØ ÖÓ×½¼ º ÈÓÖ ×Ó¸ Ð ×ØÖ Ø × Ô ÖØ Ö ÐÓ× ØÖ × ÐÓÕÙ × Ñ ÑÓÖ ÕÙ Ö ÕÙ Ö ÑÓ× ´ Ð Ð Arc Ý ÐÓ× Ó× Arc Nodeµ ݸ × ÒÓ Ó ÙÖÖ Ó Ü Ô ÓÒ¸ ÒØÓÒ × ÔÓ ÑÓ× Ò× ÖØ Ö Ò ØÓ × Ð × Ð ×Ø × × Ò Ö × Ó ÐÐ º 7.3.10.5 Eliminaci´n de arcos o Ä Ð Ñ Ò ÓÒ ÙÒ Ö Ó × Ñ × × Ò ÐÐ ÔÓÖÕÙ ÒÓ Ý ÔÙÒØÓ× Ú ÒØÙ Ð × Ü Ô ÓÒ½½ º Ð ÔÖÓ Ñ ÒØÓ × Ö ×ÙÑ Ò ÐÓ× × Ù ÒØ × Ô ×Ó× ½º Ð Ñ Ò Ö Ð × Ð ×Ø Ý Ò Ð ÒÓ Ó ÓÖ Ò Ð Arc Node Ý Ð Ö Ö ×Ù Ñ ÑÓÖ º Ð ×Ó ×Ø Arc Node × ÔÓÖ Ð ØÖ ÙØÓ arc->src arc nodeº ¾º Ë × ØÖ Ø ÙÒ Ö Ó ´ÒÓ ÙÒ Ö Óµ¸ ÒØÓÒ × Ð Ñ Ò Ö Ð × Ð ×Ø Ý Ò Ð ÒÓ Ó ×Ø ÒÓ Ð Arc Node Ý Ð Ö Ö ×Ù Ñ ÑÓÖ º Ð ×Ó ×Ø Arc Node × ÔÓÖ Ð ØÖ ÙØÓ arc->tgt arc nodeº Ò ×Ø Ô ×Ó Ý ÕÙ ÔÖ ×Ø Ö Ø Ò ÓÒ ÕÙ Ð Ö Ó × ÙÒ ÐÓ¸ Ò ÙÝÓ ×Ó ÒÓ Ý ÕÙ Ò Ð Ñ Ò Ö Ð Ð ×Ø Ý Ò Ò Ð Ö Ö Ð Ñ ÑÓÖ Ñ × ÓÒ × Ý Ù ÖÓÒ × Ò Ð Ô ×Ó ÒØ Ö ÓÖº ¿º Ò ÐÑ ÒØ ¸ Ð Ñ Ò Ö Ð Ö Ó Ð Ð ×Ø Ö Ó× Ð Ö Ó Ý Ð Ö Ö ×Ù Ñ ÑÓÖ º ÄÓ× Ô ×Ó× ÒØ Ö ÓÖ × × Ö ­ Ò Ò Ð × Ù ÒØ Ó Ó ÁÑÔÐ ÒØ ÓÒ List Graph<Node, Arc> +≡ template <typename Node, typename Arc> void List_Graph<Node, Arc>::remove_arc(Arc * arc) { // paso (1): eliminaci´n del Arc_node del nodo origen src_node o Node * src_node = get_src_node(arc); Arc_Node * src_arc_node = arc->src_arc_node; src_arc_node->del(); // desenlaza src_node de la lista de nodos src_node->num_arcs--; // decrementa contador de arcos de src_node delete src_arc_node; // entrega memoria if (not digraph) { // eliminaci´n arco en nodo destino o Node * tgt_node = get_tgt_node(arc); if (src_node != tgt_node) // verificar eliminaci´n de ciclo o { // paso (2): eliminaci´n del Arc_node del nodo destino tgt_node o Arc_Node * tgt_arc_node = arc->tgt_arc_node; tgt_arc_node->del(); tgt_node->num_arcs--; ½¼ ÍÒ ÙØÓ¹ÔÙÒØ ÖÓ × ÙÒ Ð × Ó ØÓ ÔÙÒØ ÓÖ ÕÙ Ñ Ò Ð Ð Ö ÓÒ ÙØÓÑ Ø Ñ ÑÓÖ Ù Ò Ó × ÒÚÓ Ð ×ØÖÙ ØÓÖº ר ÑÓ Ó¸ × ÓÖÖ Ð Ò ÐÙ× ÓÒ ÙÒ Ñ Ò ÓÖ Ü Ô ÓÒ × ÕÙ ÔÖ Ú ÙÒ ÐÐ Ñ ÑÓÖ Ý ÕÙ Ö ÕÙ Ö Ð ÑÔ Ö ×Ø Ó ÒØ ÖÑ Óº ÄÓ× ÙØÓ¹ÔÙÒØ ÖÓ× × Ð Ö Ò Ù Ò Ó× ÙØ Ð Ñ ØÓ Ó release() Ò ×Ø ×Ó¸ Ð ×ØÖÙ ØÓÖ ÒÓ ØÙ Ö Ð deleteº ½½ Ë ÐÚÓ ÕÙ × ØÖ Ø ÙÒ ÖÖÓÖ Ð Ù×Ù Ö Ó¸ ÔÓÖ ÑÔÐÓ¸ Ð Ñ Ò ÓÒ Ó Ð Ó ÙÒ Ù Ò Ð ÑÔÐ ÒØ ÓÒº
  • 624.
    598 Cap´ ıtulo 7. Grafos delete tgt_arc_node; } } // eliminaci´n de arco del grafo o arc->del(); // desenlazar arc de la lista de arcos del grafo --num_arcs; delete arc; } Í× × Arc Node ¾ Ò List Graph ¼º 7.3.10.6 Eliminaci´n de nodos o Ä Ð Ñ Ò ÓÒ ÙÒ ÒÓ Ó ÔÙ Ô Ö Ö ÓÑÔÐ ÒØ Ð Ö ÕÙ Ö Ñ ÒØÓ ÕÙ Ò Ð Ñ Ò Ö× ØÓ Ó× ×Ù× Ö Ó× Ò ÒØ × Ý Ý ÒØ ׺ Ô × Ö ØÓ Ó¸ × ÒÓ × ØÖ Ø ÙÒ Ö Ó¸ Ö ×ÙÐØ × Ò ÐÐ × ÒÓ× × ÑÓ× Ò Ð Ð Ñ Ò ÓÒ Ð Ö Ó ÑÔÐ ÒØ ÒÐ ×Ù ¹× ÓÒ ÒØ Ö ÓÖ ÁÑÔÐ ÒØ ÓÒ List Graph<Node, Arc> +≡ template <typename Node, typename Arc> void List_Graph<Node, Arc>::remove_node(Node * node) { if (not digraph) // Eliminar arcos adyacentes a node while (not node->arc_list.is_empty()) // repita mientras a´n hayan arcos u { // obtener el Arc_Node Arc_Node * arc_node = dlink_to_arc_node(node->arc_list.get_next()); Arc * arc = void_to_arc(arc_node); // obtener el arco remove_arc(arc); // eliminarlo del grafo } else for (Arc_Iterator it(*this); it.has_current();) { Arc * arc = it.get_current(); if (get_src_node(arc) == node or get_tgt_node(arc) == node) { it.next(); remove_arc(arc); } else it.next(); } // en este punto el nodo ya no tiene arcos node->del(); // desenlazar nodo de lista de nodos del grafo --num_nodes; delete node; } Í× × Arc Iterator ¸ Arc Node ¾ ¸ Ò List Graph ¼º Ë × ØÖ Ø ÙÒ Ö Ó¸ ÒØÓÒ × Ð Ù ×Ø ÓÒ × Ñ × Ð Ò ¬ ÒØ ¸ Ô٠׸ ÓÒ Ð ×ØÖÙ ØÙÖ ØÓ× × Ò ¸ ÒÓ ÕÙ ÓØÖ ÐØ ÖÒ Ø Ú ÕÙ Ñ Ö Ö ØÓ Ó× ÐÓ× Ö Ó× Ý Ð Ñ Ò Ö ÕÙ ÐÐÓ× ÕÙ ÔÙÒØ Ò nodeº ×ØÓ ÔÙ × Ö ÜØÖ Ñ Ñ ÒØ Ò ¬ ÒØ Ý × ×Ø Ö ÓÒ× ÒØ ר Óר Ð ÓÖ ÐØ Ö Ö Ð ØÓÔÓÐÓ ÙÒ Ö Óº
  • 625.
    7.3. Un TADpara grafos (List Graph<Node, Arc>) 599 7.3.10.7 Limpieza de grafos remove node() ÒÓ× Ð Ñ ÝÓÖ Ô ÖØ Ð ØÖ Ó Ò × Ö Ó Ô Ö Ð ÑÔ Ö ÙÒ Ö Ó ´ÓÔ¹ Ö ÓÒ clear graph()µ¸ ÔÙ × ×Ø × Ö Ñ Ø Ð Ñ Ò Ö ØÓ Ó× ÐÓ× ÒÓ Ó× Ð Ö Ó ÁÑÔÐ ÒØ ÓÒ ÙÒ ÓÒ × List Graph<Node, Arc> +≡ ¼¼ template <class GT> void clear_graph(GT & g) { for (Arc_Iterator<GT> it(g); it.has_current(); ) // eliminar arcos { typename GT::Arc * arc = it.get_current(); it.next(); g.remove_arc(arc); } for (Node_Iterator<GT> it(g); it.has_current(); ) // eliminar nodos { typename GT::Node * p = it.get_current(); it.next(); // avanzar antes de borrar por consistencia de iterador g.remove_node(p); // eliminarlo del grafo } } Í× × Arc Iterator Ò Node Iterator º ÈÙ ×ØÓ ÕÙ remove arc() Ý remove node() ×ÓÒ Ú ÖØÙ Ð ×¸ ÔÙ Ö ØÓ ÙÒ Ò Ö Ú ÓÒº ÈÓÖ ×Ó¸ × Ñ × × ÙÖÓ Ð Ñ Ò Ö ÐÓ× Ö Ó× Ý ÐÙ Ó ÐÓ× ÒÓ Ó׸ Ò ÐÙ Ö Ð Ñ Ò Ö Ö Ø Ñ ÒØ ÐÓ× ÒÓ Ó× ´ÕÙ ÒØÖ Ò× Ñ ÒØ Ø Ñ Ò Ð Ñ Ò Ò ÐÓ× Ö Ó×µº 7.3.10.8 Mapeo de nodos y arcos Ê ÓÖ ÑÓ× ÕÙ ×Ø ÔÙÐ ÑÓ× Ð Ñ Ô Ó ÒÓ Ó× Ý Ö Ó× ØÖ Ú × ÐÓ× ÓÓ ×º ÓÒ¹ ÒØÖ ÑÓ×ÒÓ× Ò map node()¸ Ð Ù Ð Ñ Ô ÐÓ× ÓÓ × Ó× ÒÓ Ó× Ý ÔÖ × ÖÚ Ð Óѹ ÔÓ× ÓÒ Ñ Ô Ó× Ò Ð × ÒØ Ó ÕÙ × ÐÓ× ÓÓ × ×ÓÒ ×Ø ÒØÓ× NULL¸ ÒØÓÒ × Ð Ñ Ô Ó × ÔÖÓÔ ÓÑÓ × ÐÓ× ÓÓ × Ù × Ò ÙÒ Ð ×Ø ÒÐ Þ Ö ÙÐ Öº ÁÒ ÐÑ ÒØ ¸ × ÒÓ Ý Ñ Ô Ó¸ ÒØÓÒ × node map(p, q) ÓÒרÖÙÝ Ð × Ù ÒØ ÓÒ¬ ÙÖ ÓÒ ÒÐ × p q ÄÙ Ó¸ × Ó ÙÖÖ ÓØÖ ÐÐ Ñ node map(q,r)¸ ÒØÓÒ × ÐÓ× ÒÐ × Ú Ò Ò Ò p q r Ð Ö Ñ ÒØ ¸ ÐÓ× Ñ Ô Ó× Ò ÓÑÔÓÖØ Ö× ÓÑÓ × ØÖ Ø × ÙÒ Ò× Ö ÓÒ Ò ÙÒ Ð ×Ø Ö ÙÐ Ö¸ × ÑÔÐ Ñ ÒØ ÒÐ Þ ¸ × Ò ÒÓ Ó Ö º ÄÓ ÕÙ ÒÓ× ÓÒ Ù ÁÑÔÐ ÒØ ÓÒ List Graph<Node, Arc> +≡ ¼½ template <typename Node, typename Arc> void List_Graph<Node, Arc>::map_nodes(Node * p, Node * q) { if (NODE_COOKIE(p) == NULL)
  • 626.
    600 Cap´ ıtulo 7. Grafos { NODE_COOKIE(p) = q; NODE_COOKIE(q) = p; return; } NODE_COOKIE(q) = NODE_COOKIE(p); NODE_COOKIE(p) = q; } template <typename Node, typename Arc> void List_Graph<Node, Arc>::map_arcs(Arc * p, Arc * q) { if (ARC_COOKIE(p) == NULL) { ARC_COOKIE(p) = q; ARC_COOKIE(q) = p; return; } ARC_COOKIE(q) = ARC_COOKIE(p); ARC_COOKIE(p) = q; } Í× × List Graph ¼ º 7.3.10.9 Copia de grafos Ñ Ò Ö Ò Ö Ð¸ Ð ÓÔ ÔÙ × Ô Ö Ö× Ò Ó× × × ´½µ ÓÔ ÒÓ Ó× Ý ´¾µ ÓÔ Ö Ó׺ ÓÔ Ö ÒÓ Ó× × Ö Ð Ø Ú Ñ ÒØ Ð ÔÓÖ ÒÓ Ó Ð Ö Ó ÓÖ Ò × Ö ÙÒ ÓÔ Ý × Ò× ÖØ Ò Ð Ö Ó ×Ø ÒÓº Ä ÓÔ Ö Ó× × × Ñ Ð Ö ÔÓÖ Ö Ó Ð Ö Ó ÓÖ Ò × Ö ÙÒ ÓÔ Ý × Ò× ÖØ Ò Ð Ö Ó ×Ø ÒÓº Ê ÓÖ ÑÓ× ÕÙ Ô Ö Ò× ÖØ Ö ÙÒ Ö Ó Ý ÕÙ ×Ô ¬ Ö ×Ù× ÒÓ Ó׺ Ù Ò Ó Ò×Ô ÓÒ ÑÓ× ÙÒ Ö Ó Ð Ö Ó ÓÖ Ò¸ ÐÓ× ÒÓ Ó× ÕÙ Ü Ñ Ò ÑÓ× Ö ¬ Ö Ò Ð Ö Ó ÓÖ Ò¸ Ô ÖÓ Ð Ö Ó Ò× ÖØ Ö Ò Ð Ö Ó ×Ø ÒÓ Ö ÕÙ Ö ÒÓ Ó× Ö ×Ô ØÓ Ð Ö Ó ×Ø ÒÓ Ý ÒÓ Ö ×Ô ØÓ Ð ÓÖ Òº Ë ÒÓ× ÔÖ × ÒØ ÒØÓÒ × Ð × Ù ÒØ ÔÖÓ Ð Ñ Ó ÙÒ ÒÓ Ó Ð Ö Ó ÓÖ Ò¸ ÓÑÓ ÓÒÓ Ö ×Ù ÕÙ Ú Ð ÒØ Ò Ð Ö Ó ÓÔ ×Ø ÒÓ ÍÒ Ñ Ò Ö ÖÐÓ × Ö Ñ ÒØ ÙÒ Ñ Ô Ó ÒÓ Ó× ÒØÖ ÐÓ× Ó× Ö Ó× ØÖ Ú × ×Ù× ÓÓ ×¸ Ô ÖÓ Ð × Ñ ÒØ Ð ÒØ Ö Þ copy graph() ÔÙ ÑÔ Ö ×Ø Ø ÔÓ Ñ Ô Ó ´ Ù Ò Ó Ð Ô Ö Ñ ØÖÓ cookie map == falseµº ÈÓÖ × Ö ÞÓÒ¸ Ö Ð Þ Ö ÑÓ× Ð Ñ Ô Ó Ñ ÒØ ÙÒ Ø Ð ÒרÖÙÑ ÒØ ÓÒ ÙÒ Ö ÓÐ ÎÄ ¼¼ Ð Ö ÓÒ Ø Ð Ñ Ô Ó ¼¼ ≡ ´ ¼¼ µ DynMapAvlTree<typename GT::Node*, typename GT::Node*> mapping_table; mapping table Ñ Ô ÒÓ Ó× Ð Ö Ó ÓÖ Ò src graph ÒÓ Ó× Ð Ö Ó ×Ø ÒÓ thisº Ð Ñ ØÓ Ó ÓÔ × ×Ô ¬ ÓÑÓ × Ù ¼¼ ÁÑÔÐ ÒØ ÓÒ ÙÒ ÓÒ × List Graph<Node, Arc> +≡ template <class GT> void copy_graph(GT & gtgt, GT & gsrc, const bool & cookie_map) { clear_graph(gtgt); // limpiar this antes de copiar Ð Ö ÓÒ Ø Ð Ñ Ô Ó ¼¼ // Fase (1): recorrer nodos de grafo src_graph e insertar copia en this
  • 627.
    7.3. Un TADpara grafos (List Graph<Node, Arc>) 601 for (typename GT::Node_Iterator it(gsrc); it.has_current(); it.next()) { typename GT::Node * src_node = it.get_current_node(); auto_ptr<typename GT::Node> tgt_node(new typename GT::Node(src_node)); mapping_table.insert(src_node, tgt_node.get()); // insertar en mapeo typename GT::Node * tgt = tgt_node.release(); gtgt.insert_node(tgt); // insertarla en grafo destino if (cookie_map) GT::map_nodes(src_node, tgt); } // fase (2): por cada arco de src_graph, crear en this un // arco que conecte a los nodos mapeados de mapping_table for (typename GT::Arc_Iterator it(gsrc); it.has_current(); it.next()) { typename GT::Arc * src_arc = it.get_current_arc(); // obtener im´genes de nodos en el grafo destino y crear arco a typename GT::Node * src_node = mapping_table[gsrc.get_src_node(src_arc)]; typename GT::Node * tgt_node = mapping_table[gsrc.get_tgt_node(src_arc)]; typename GT::Arc * tgt_arc = gtgt.insert_arc(src_node, tgt_node); *tgt_arc = *src_arc; if (cookie_map) GT::map_arcs(src_arc, tgt_arc); } } Í× × Arc Iterator Ò Node Iterator º Ô ÖØ ×Ù ÙØ Ð Þ ÓÒ ÔÙ Ð Ò Ð ÓÒØ ÜØÓ ÙÒ ÔÐ ÓÒ¸ copy graph() × Ù× Ó ÔÓÖ Ð ÓÒרÖÙ ØÓÖ ÓÔ Ý Ð ÓÔ Ö ÓÖ × Ò ÓÒº 7.3.10.10 Ordenamiento de arcos ÄÓ× Ö Ó× ×Ø Ò ÓÒØ Ò Ó× Ò Ð Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ arc listº È Ö ÓÖ Ò ÖÐÓ׸ ÒÓ× Ú Ð Ö ÑÓ× Ð Ñ Ö ×ÓÖØ ÑÔÐ Ñ ÒØ Ó Ò Ü ¿º¾º½º ´Ô Ò ½ µº Ô Ð ÑÓ× Ð Ñ Ö ×ÓÖØ ÔÓÖ Ú Ö × Ö ÞÓÒ ×º Ò ÔÖ Ñ Ö ÐÙ Ö¸ Ö Ò ¸ ÔÓÖ Òר Ò ¸ Ð ÕÙ ×ÓÖØ¸ Ð × ÑÔ ÒÓ O(n Ð (n)) Ð Ñ Ö ×ÓÖØ ר Ö ÒØ Þ Ó Ý ÒÓ ×ÙÔ Ø Ó Ð Ô ÖÑÙØ ÓÒº Ò × ÙÒ Ó ÐÙ Ö¸ Ð ÓÒ×ÙÑÓ ×Ô Ó Ð Ñ Ö ×ÓÖØ × ÐÓ ×ÙÑÓ O(Ð (n))¸ ÖÒ Ð O(n) ÕÙ × Ð Ô ÓÖ ×Ó ÓÒ×ÙÑÓ Ô Ö Ð ÕÙ ×ÓÖØ ÓÒ Ð ×Ø × ÒÐ Þ ×º × Ô٠׸ Ð ÓÖ Ò Ñ ÒØÓ ÐÓ× Ö Ó× × Ö Ñ Ø ¼½ ÁÑÔÐ ÒØ ÓÒ List Graph<Node, Arc> +≡ template <typename Node, typename Arc> template <class Compare> void List_Graph<Node, Arc>::sort_arcs() { mergesort<Cmp_Arc<Compare> >(arc_list); } Í× × List Graph ¼ Ò mergesort ½ º sort arcs() Ö Ð Ð× ÓÑÔ Ö ÓÒ Compare ×Ó Ö ÔÙÒØ ÖÓ× Ö Ó× Ø ÔÓ Arc ר Ð × ¸ ÕÙ Ð ÔÖÓÚ Ö Ð Ù×Ù Ö Ó ÒØ Ö × Ó Ò ÓÖ Ò Ö ÐÓ× Ö Ó׸ Ö Ð Þ Ð ÓÑÔ Ö ÓÒ bool operator () (Arc *, Arc *)º È ÖÓ Ð Ñ Ö ×ÓÖØ ×Ó Ö Ð ×Ø × Ò¹ Ð Þ × ÒÚÓ bool operator () (Dlink *, Dlink *) ´Ü ¿º¾º½º ´Ô Ò ½ µµ¸ Ô Ö ÓÑÔ Ö Öº ÑÓ׸ Ô٠׸ × Ö Ö Ð Ð × ÓÑÔ Ö ÓÒ Ô Ö mergesort()¸ Ð Ù Ð × ÒÓÑ Ò Cmp Arcº ËÙ ÙÒ ÓÒ × ÓÒÚ ÖØ Ö ÐÓ× ÔÙÒØ ÖÓ× Ø ÔÓ Dlink Arc* ÒÚÓ Ö Ð ÓÑÔ Ö ÓÒ Compareº
  • 628.
    602 Cap´ ıtulo 7. Grafos 7.4 TAD camino sobre un grafo (Path<GT>) Ä Ù×ÕÙ Ñ ÒÓ× × ÙÒ Ð × Ø Ú × Ñ × ÓÑÙÒ × Ò Ð Ñ Ò ÔÙÐ ÓÒ ×Ó Ö ÙÒ Ö Óº ÈÓÖ ×ØÓ Ú Ð Ð Ô Ò ÙÒ Ì ÕÙ ÑÓ Ð Ñ ÒÓ× Ý Ð Ø ×Ù ÓÒרÖÙ ÓÒº Ð Ì Path<GT> ÑÓ Ð Þ ÙÒ Ñ ÒÓ ×Ó Ö ÙÒ List Graph<Node, Arc>¸ ×Ù ×ØÖÙ ¹ ØÙÖ Ò Ö Ð × ¬Ò ÓÑÓ × Ù ¼¾ Ñ ÒÓ Ö Ó ¼¾ ≡ ¾¿ template <class GT> class Path { Ì ÔÓ× Ô Ø ¼¾ Å Ñ ÖÓ× ÔÖ Ú Ó× Ô Ø ¼¾ Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ }; ¬Ò × Path¸ Ù× Ò ÙÒ × ¼¿¸ ¼ ¸ ¾¿ß¾ ¸ ¸ ½ ¸ ½ ¸ ¾¾¸ ¾ ¸ ¿ ß ½¸ ¾ ¸ ¿¸ ¼ ¸ ¼ ¸ ¿¿¸ Ò ¿º Ð Ô Ö Ñ ØÖÓ Ø ÔÓ GT × Ö Ø ÔÓ List Graph<Node, Arc>¸ List Digraph<Node, Arc> Ó Ð ÙÒ Ð × × Ò ÒØ º Path<GT> Ù Ö Ð Òר Ò Ð Ö Ó Ò ÙÒ ØÖ ÙØÓ ¼¾ Å Ñ ÖÓ× ÔÖ Ú Ó× Ô Ø ¼¾ ≡ ´ ¼¾ µ ¼¾ GT * g; Ð Ù Ð × ÓÒ×ÙÐØ Ð Ñ ÒØ ¼¾ Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ ≡ ´ ¼¾ µ ¼¾ GT & get_graph() { return *g; } Ò Ó × ÓÒ × × Ö ÕÙ Ö ×Ó Ö ÙÒ Ð ÙÐÓ ÙÒ Ñ ÒÓ ÓÒØ Ð Þ Ö ×Ù Óר ¸ ÔÓÖ ÑÔÐÓº ØÓ× ÔÓ× Ð Ø Ö ×Ó Ö Ð ÙÒ Ò ÓÖÑ ÓÒ ÙÒ Ñ ÒÓ¸ Path<GT> ÓÒØ Ò ÙÒ ÔÙÒØ ÖÓ ÓÓ ¼¾ Å Ñ ÖÓ× ÔÖ Ú Ó× Ô Ø ¼¾ +≡ ´ ¼¾ µ ¼¾ ¼¿ void * cookie; Ð Ù Ð × Ò Ð Þ Ó NULL Ò Ø ÑÔÓ ÓÒרÖÙ ÓÒ Ý Ó × ÖÚ Ð Ý ÑÓ ¬ Рѹ ÒØ Ð × Ù ÒØ Ñ ØÓ Ó ¼¾ Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡ ´ ¼¾ µ ¼¾ ¼¾ void *& get_cookie() { return cookie; } Ò Ó × ÓÒ ×¸ × Ò × Ö Ó Ú Ð Ö × ÙÒ Ñ ÒÓ ×Ó Ö ÙÒ Ö Ó Ö ¬ Ö ÙÒ Ö Ó Ô ÖØ ¹ ÙÐ Öº Ð Ñ ØÓ Ó ¼¾ Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡ ´ ¼¾ µ ¼¾ ¼¿ bool inside_graph(GT & gr) const { return g == &gr; } Ö ØÓÖÒ true × gr × Ð Ñ ×ÑÓ Ö Ó ÕÙ Ñ Ò Ð Òר Ò Ó ØÓ Path<GT>º Ä Ð × Path<GT> Ð ÐÓ× Ø ÔÓ× ÓÒ ÖÒ ÒØ × ÐÓ× ÒÓ Ó× Ý Ö Ó× Ð Ö Ó Ð × Ù ÒØ Ñ Ò Ö ¼¾ Ì ÔÓ× Ô Ø ¼¾ ≡ ´ ¼¾ µ typedef typename GT::Node_Type Node_Type; typedef typename GT::Arc_Type Arc_Type;
  • 629.
    7.4. TAD caminosobre un grafo (Path<GT>) 603 ÄÓ Ñ ×ÑÓ × ÔÐ Ô Ö ÐÓ× ÔÙÒØ ÖÓ× ÒÓ Ó× Ý Ö Ó× ÓÒ Ð Ü Ô ÓÒ ÕÙ ×ØÓ× × Ñ Ò Ò Ñ Ò Ö ÔÖ Ú ¼¿ Å Ñ ÖÓ× ÔÖ Ú Ó× Ô Ø ¼¾ +≡ ´ ¼¾ µ ¼¾ ¼¿ typedef typename GT::Node Node; typedef typename GT::Arc Arc; ÆÙ ×ØÖ Ñ Ò Ö Ö ÔÖ × ÒØ Ö ÙÒ Ñ ÒÓ × Ñ ÒØ ÐÓ× Ö Ó× ÕÙ ÐÓ Óѹ ÔÓÒ Òº ר ÓÖÑ × Ò Ô Ò ÒØ Ó× Ò Ö × × Ø Ð × ÓÑÓ ÕÙ × ØÖ Ø ÙÒ ÑÙÐØ Ö Ó¸ ÙÒ Ö Ó¸ Ø Ø Ö º ÈÙ ×ØÓ ÕÙ Ò List Graph<Node, Arc> Ý Ò ×Ù Ö Ú Ó List Digraph<Node, Arc>¸ ÙÒ Ö Ó ÒÓ ÜÔÖ × Ð Ö ÓÒ¸ × Ò × Ö Ó Ò¹ Ö Ù Ð × Ð ÒÓ Ó ÓÖ Òº ר ÑÓ Ó¸ Ð ÓØÖÓ ÒÓ Ó Ð Ö Ó × Ö Ð ×Ù ×ÓÖ Ò Ð Ñ ÒÓº Ä Ó × ÖÚ ÓÒ ÒØ Ö ÓÖ ×Ù Ö Ð × Ù ÒØ Ö ÔÖ × ÒØ ÓÒ ×ØÖÙ ØÙÖ ØÓ× ÔÙÒØÓ Ð Ñ ÒÓ ¼¿ Å Ñ ÖÓ× ÔÖ Ú Ó× Ô Ø ¼¾ +≡ ´ ¼¾ µ ¼¿ ¼¿ struct Path_Desc { Node * node; // nodo origen Arc * arc; // arco adyacente Path_Desc(Node * _node = NULL, Arc * _arc = NULL) : node(_node), arc(_arc) {} }; ¬Ò × Path Desc¸ Ù× Ò ÙÒ × ¼¿¸ ¼ ¸ Ò ¼ º ר ÑÓ Ó¸ ÙÒ Ñ ÒÓ × Ö ÔÖ × ÒØ ÓÑÓ ÙÒ Ð ×Ø Path Desc ¼¿ Å Ñ ÖÓ× ÔÖ Ú Ó× Ô Ø ¼¾ +≡ ´ ¼¾ µ ¼¿ DynDlist<Path_Desc> list; Í× × DynDlist ¿ Ò Path Desc ¼¿ º Ä ÓÖÑ ØÖ ÓÒ Ð ½¾ Ð Ö Ö ÙÒ Ñ ÒÓ × ÙÒÓ Ú Ó ÕÙ Ö ¬ Ö ÙÒ Ø ÖÑ ¹ Ò Ó Ö Ó ¼¿ Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡ ´ ¼¾ µ ¼¾ ¼¿ Path(GT & _g, void * __cookie = NULL) : g(&_g), cookie(__cookie) { /* empty */ } Í× × Path ¼¾ º Ð ÓÒרÖÙ ØÓÖ Ò ÙÒ Ñ ÒÓ Ú Ó ×Ó Ö Ð Ö Ó gº Ç × ÓÒ ÐÑ ÒØ ÔÙ Ö ÕÙ Ö Ö× Ð ÓÒרÖÙ ØÓÖ ÔÓÖ ÓÑ × ÓÒ ¼¿ Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡ ´ ¼¾ µ ¼¿ ¼¿ Path(void * __cookie = NULL) : g(NULL), cookie(__cookie) { /* empty */ } Í× × Path ¼¾ º Ð Ù Ð ÒÓ Ø Ò Ö Ó ×Ó Óº È Ö ÓÑ ÒÞ Ö ÓÔ Ö Ö ×Ó Ö ÙÒ Ñ ÒÓ Ú Ó Ý ÕÙ Ò Ö Ù Ð × ×Ù ÒÓ Ó Ò Ðº ×ØÓ × Ö Ð Þ Ñ ÒØ Ð × Ù ÒØ ÔÖ Ñ Ø Ú ¼¿ Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡ ´ ¼¾ µ ¼¿ ¼ void init(Node * start_node) { list.append(Path_Desc(start_node)); } Í× × Path Desc ¼¿ º ½¾ ÒÖ Ð Ð ØÖ ÓÒ ÙÒ ÒÓ ×Ø Òר ØÙ º
  • 630.
    604 Cap´ ıtulo 7. Grafos ÓÒ start node × ÒÓ Ó Ò Ó Ð Ñ ÒÓº Ë ÔÙ Ö ÐÓ Ñ ×ÑÓ Ò Ø ÑÔÓ ÓÒרÖÙ ÓÒ Ñ ÒØ ¼ Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡ ´ ¼¾ µ ¼¿ ¼ Path(GT & _g, Node * start_node, void * __cookie = NULL) : g(&_g), cookie(__cookie) { init(start_node); } Í× × Path ¼¾ º ÓÒ start node × Ð ÒÓ Ó Ò Ó Ð Ñ ÒÓº ÈÙ ×ØÓ ÕÙ × Ô ÖÑ Ø Ð Ö Ö ÙÒ Path<GT> × Ò ×Ô ¬ Ö ×Ù Ö Ó¸ ÑÓ× × Ò Ö ÙÒ ×ÕÙ Ñ ÕÙ Ô ÖÑ Ø ×Ô ¬ ÖÐÓ¸ ÐÙ Ó Ð Ö Ó ÙÒ Path<GT>º È Ö ÐÐÓ¸ ÔÖÓÚ ÑÓ× Ð × Ù ÒØ ÔÖ Ñ Ø Ú ¼ Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡ ´ ¼¾ µ ¼ ¼ void set_graph(GT & __g, Node * start_node = NULL) { clear_path(); g = &__g; if (start_node == NULL) return; init(start_node); } Ä ÐÓÒ ØÙ ÙÒ Ñ ÒÓ × Ð ÒÙÑ ÖÓ Ö Ó× ÕÙ ÐÓ ÓÑÔÓÒ Òº Ò ÒÙ ×ØÖ ×ØÖÙ ¹ ØÙÖ ØÓ׸ ר Ò ÓÖÑ ÓÒ ×Ø ÔÓÖ Ð ÒÙÑ ÖÓ Ð Ñ ÒØÓ× Ð ØÖ ÙØÓ list ¼ Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡ ´ ¼¾ µ ¼ ¼ const size_t & size() const { return list.size(); } Ì Ñ Ò × ÔÓ× Ð ÔÖ ÙÒØ Ö × Ð Ñ ÒÓ ×Ø Ó ÒÓ Ú Ó ¼ Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡ ´ ¼¾ µ ¼ ¼ bool is_empty() const { return list.is_empty(); } Ä Ð ÑÔ Þ ÙÒ Ñ ÒÓ ÓÒ× ×Ø Ò ÓÖÖ Ö ØÓ Ó× ×Ù× ÒÓ Ó× Ý Ö Ó׸ÐÓ Ù Ð × Ö Ð Þ ÓÒ Ð ÓÔ Ö ÓÒ × Ù ÒØ ¼ Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡ ´ ¼¾ µ ¼ ¼ void clear_path() { while (not list.is_empty()) list.remove_first(); } Ä Ù Ð Ú Ð Ð ×Ø Path Descº × ÔÓ× Ð ÓÒרÖÙ Ö ÙÒ Ñ ÒÓ ÓÔ ÓØÖÓ Ñ ÒÓ Ó × Ò ÖÐÓ ¼ Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡ ´ ¼¾ µ ¼ ¼ Path(const Path & path) : g(path.g), list(path.list) { /* empty */ } Path & operator = (const Path & path) { clear_path(); g = path.g; list = path.list; return *this; } Í× × Path ¼¾ º
  • 631.
    7.4. TAD caminosobre un grafo (Path<GT>) 605 Ä × Ò ÓÒ Ð ÑÔ Ð Ñ ÒÓ ×Ø ÒÓ ÒØ × ÓÔ Ö Ð Ñ ÒÓ ÓÖ Ò pathº list.get last()->arc ר Ö¸ siempre¸ Ò NULLº ר ÑÓ Ó¸ list.get first()->node × Ð ÔÖ Ñ Ö ÒÓ Ó Ð Ñ ÒÓ Ñ ÒØÖ × ÕÙ list.get last()->node Ð ÙÐØ ÑÓº Ð Ö Ó¹ ÖÖ Ó Ð Ñ ÒÓ × ×Ø Ò Ù ÒØÖ ÐÓ× Ö Ó× Ñ ÒØ Ð ÑÔÓ node Path Desc listº ÄÙ Ó Ø Ò Ö ÙÒ Ñ ÒÓ Ò Ó × Ö¸ ÓÒ ×Ù ÔÖ Ñ Ö ÒÓ Ó¸ Ð ÓÒרÖÙ ÓÒ Ð Ñ ÒÓ × Ö Ñ Ø Ò ÖÐ ÐÓ× Ö Ó׺ È Ö ÐÐÓ¸ × ×ÔÓÒ Ð × Ù ÒØ ÓÔ Ö ÓÒ ¼ Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡ ´ ¼¾ µ ¼ ¼ void append(Arc * arc) { Path_Desc & last_path_desc = list.get_last(); // ultimo elemento de list last_path_desc.arc = arc; list.append(Path_Desc(g->get_connected_node(arc, last_path_desc.node))); } Í× × Path Desc ¼¿ º ÇØÖ ÓÖÑ Ò Ö ÙÒ ÓÑÔÓÒ ÒØ Ð Ñ ÒÓ × ×Ô ¬ Ö Ð × Ù ÒØ ÒÓ Ó Ò ÐÙ Ö Ð Ö Óº È Ö ÐÐÓ¸ × ÔÖÓÚ Ð append() ÔÓÖ ÒÓ Ó ¼ Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡ ´ ¼¾ µ ¼ ¼ void append(Node * node) { if (list.is_empty()) { init(node); return; } Node * last_node = get_last_node(); Arc * arc = search_arc(*g, last_node, node); append(arc); } Ä ÖÙØ Ò × Ð ÔÓÖÕÙ ÔÙ ÖÖ Ö Ñ Ù × ×Ó Ö ÑÙÐØ Ö Ó× Ý ÑÙÐØ ¹ Ö Ó׺ ÄÓ ÓÑÙÒ Ò Ð ÓÒרÖÙ ÓÒ Ñ ÒÓ× × ÔÓÖ Ð ÜØÖ ÑÓ ÒÓÑ Ò Ó ÙÐØ ÑÓ ÒÓ Ó º Ë Ò Ñ Ö Ó¸ Ó × ÓÒ ÐÑ ÒØ × ÔÓ× Ð ÜØ Ò Ö Ð Ñ ÒÓ ÔÓÖ Ð ÔÖ Ñ Ö ÒÓ Ó × Ö¸ Ò Ö ÙÒ ÒÙ ÚÓ ÒÓ Ó Ó Ö Ó Ø Ð ÕÙ ×Ø Ú Ò Ð ÔÖ Ñ ÖÓº ×ØÓ × Ö Ð Þ Ñ ÒØ Ð × ÓÒØÖ Ô ÖØ × insert()º ÄÓ× ÜØÖ ÑÓ× ÙÒ Ñ ÒÓ × ÓÒ×ÙÐØ Ò Ñ ÒØ Ð × ÔÖ Ñ Ø Ú × × Ù ÒØ × ¼ Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡ ´ ¼¾ µ ¼ ¼ Node * get_first_node() { return list.get_first().node; } Node * get_last_node() { return list.get_last().node; } Arc * get_first_arc() { return list.get_first().arc; } Arc * get_last_arc() { typename DynDlist<Path_Desc>::Iterator it(list); it.reset_last(); it.prev(); return it.get_current().arc; } Í× × DynDlist ¿ Ò Path Desc ¼¿ º
  • 632.
    606 Cap´ ıtulo 7. Grafos ר × ÖÙØ Ò ×¸ ÕÙ Þ Ð ÕÙ Ñ Ö ÙÒ ÜÔÐ ÓÒ × get last arc()º Ê ÓÖ ÑÓ× ÔÖ Ñ ÖÓ ÕÙ ÙÒ DynDlist<T> ×ÓÐÓ ÔÙ Ö× ÔÓÖ ×Ù× ÜØÖ ÑÓ׺ Ë × × ÙÒ Ð Ñ ÒØÓ Ö ÒØ ¸ ÒØÓÒ × × Ò × Ö Ó Ö ÓÖÖ Ö Ð × Ù Ò ØÖ Ú × ÙÒ Ø Ö ÓÖº ÓÖ Ò¸ get last arc() Ö ØÓÖÒ Ö Ð ÙÐØ ÑÓ Ö Ó Ð Ñ ÒÓ¸ Ô ÖÓ ×Ø ÒÓ × Ò Ù ÒØÖ Ò Ð ÙÐØ ÑÓ Path Desc list¸ × ÒÓ Ò Ð Ô ÒÙÐØ ÑÓº À ÐÐ Ð Ö ÞÓÒ ÔÓÖ Ð Ù Ð Ð Ø Ö ÓÖ × ÔÓ× ÓÒ Ò Ð ÙÐØ ÑÓ Path Desc Ý ÐÙ Ó Ö ØÖÓ ÙÒ ÔÓ× ÓÒº ר ÓÖÑ ¸ × Ð Ô ÒÙÐØ ÑÓ Path Desc × Ð ÙÐØ ÑÓ Ö Óº ÅÙ Ó× Ð ÓÖ ØÑÓ׸ ×Ó Ö ØÓ Ó ÐÓ× ÕÙ ØÙ Ò Ö ØÖÓ ×Ó ´ ØÖ Ò µ¸ ÓÒרÖÙÝ Ò Ñ ÒÓ× ÙÝÓ× ÜØÖ ÑÓ× ¬Ò Ð × Ò × Ö ÓÖÖ Ó׺ ÈÓÖ ×Ø Ö ÞÓÒ¸ × Ò ×Ô Ò× Ð Ð × Ù ÒØ ÔÖ Ñ Ø Ú ¼ Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡ ´ ¼¾ µ ¼ ¼ void remove_last_node() { list.remove_last(); list.get_last().arc = NULL; } Ð Ù Ð ÓÖÖ Ð ÙÐØ ÑÓ Ö Ó ´ ÙÒØÓ ÓÒ ×Ù ÒÓ Óµ Ð Ñ ÒÓº ÄÙ Ó ÓÒרÖÙ Ó ÙÒ Ñ ÒÓ¸ ÔÙ Ö ÕÙ Ö Ö× Ö ÓÖÖ ÖÐÓº È Ö ×ØÓ × ÔÖÓÚ ÙÒ Ø Ö ÓÖ ÙÒØÓ ÓÒ ÙÒ Ñ Ð ÙÒ ÓÒ × ÓÔ Ö ÓÒ ×Ó Ö ÐÓ× ÓÑÔÓÒ ÒØ × ÙÒ Ñ ÒÓº ¼ Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡ ´ ¼¾ µ ¼ ¼ class Iterator : public DynDlist<Path_Desc>::Iterator { // ... Path_Desc & get_curr_path_desc() { return this->DynDlist<Path_Desc>::Iterator::get_current(); } Node * get_current_node() { return this->get_curr_path_desc().node; } Arc * get_current_arc() { return this->get_curr_path_desc().arc; } bool has_current_arc() const { return this->has_current() and not this->is_in_last(); } bool has_current_node() const { return this->has_current(); } }; Í× × DynDlist ¿ Ò Path Desc ¼¿ º ¼ Å Ñ ÖÓ× ÔÙ Ð Ó× Ô Ø ¼¾ +≡ ´ ¼¾ µ ¼ template <class Operation> void operate_on_nodes() { for (Iterator it(*this); it.has_current(); it.next()) Operation () (it.get_current_node()); } template <class Operation> void operate_on_arcs() {
  • 633.
    7.5. Recorridos sobregrafos 607 for (Iterator it(*this); it.has_current(); it.next()) Operation () (it.get_current_arc()); } 7.5 Recorridos sobre grafos Ë Ò ÒØ ¬ Ó Ó× Ô ØÖÓÒ × ÖÕÙ Ø Ô Ó× ÜÔÐÓÖ ÓÒ¸ ÐÐ Ñ Ó× Ù×ÕÙ Ò ÔÖÓ¹ ÙÒ Ý Ò ÑÔÐ ØÙ ¸ Ö ×Ô Ø Ú Ñ ÒØ º Ä Ñ ÝÓÖ ÐÓ× Ð ÓÖ ØÑÓ× ×Ó Ö Ö Ó× Ü ÙÒ Ù ÓØÖ Ó Ñ × Ñ Ò Ö × ÜÔÐÓÖ ÖÐÓº Ä ÐÓ× Ö ÓÖÖ Ó× × × Ñ Ð Ö ÐÓ× ÐÓ× Ö ÓÐ × ×ØÙ Ó× Ò Ð Ô ØÙÐÓ Ü × Ö ÙÒ Ô ØÖÓÒ ÔÖÓ × Ñ ÒØÓ ÔÖ × ÒØ Ò ÑÙ Ó× Ð ÓÖ ØÑÓ׺ ÄÓ× Ö ÓÖÖ Ó× Ý ÓØÖ × ÔÖ Ñ Ø Ú × × × Ò ÐÐÓ× × ¬Ò Ò Ò Ð Ö ÚÓ tpl graph utils.Hº 7.5.1 Iteradores filtro × ÔÖÓ Ð ÕÙ Ð Ø Ö ÓÖ × Ò Ù ÒØÖ ÒØÖ ÐÓ× Ñ × ÙØ Ð × Ý Ú Ö× Ø Ð × Ô ØÖÓÒ × × ÒÓ ½ º À ר Ð ÔÖ × ÒØ ¸ Ù ÐÕÙ Ö ÐÓ× Ø Ö ÓÖ × ÕÙ ÑÓ× ÔÖ × ÒØ Ó ÓÑÔÖ Ò Ð ØÓØ Ð Ð ÓÒ ÙÒØÓ Ð ÕÙ Ö ¬ Ö Òº ÈÖÓÒØ Ñ ÒØ ÓÒר Ø Ö ÑÓ× ÕÙ ÑÙ Ó× ÔÖÓ Ð Ñ × ÑÓ Ð Þ Ó× ×Ó Ö Ö Ó× Ö ÕÙ Ö Ò ×Ӭר × ×ØÖÙ ØÙÖ × ØÓ׸ × ÓÑÓ Ð ÑÔÐ Ó ×Ø ÒØÓ× Ð ÓÖ ØÑÓ׺ Ù× ×ØÓ¸ ÔÓÖ ÐÓ ÓÑÙÒ¸ × Ò Ö ÒרÖÙÑ ÒØ Ö Ð ÓÖ ØÑÓ× ×Ó Ö Ö Ó× ÒÓ × ÙÒ Ø Ö × Ò ÐÐ ¸ Ñ Ü Ñ Ù Ò Ó ÔÖ Ø Ò ÑÓ× Ð Ò Ö Ð Ý ÒÖ º Ò Ò ÙÖ ¸ ÐÓ× Ö Ó× Ö ÕÙ Ö Ò ×Ø ÒØ ×Ô Ó Ñ ÑÓÖ ¸ ÔÓÖ ÐÓ ÕÙ ×Ù ÓÖÖ ÔÙ × Ö Ö Ø Ó Ò ÑÙ × × ØÙ ÓÒ ×º Ú × × ÑÔÓÖØ ÒØ ÔÖÓ × Ö Ð ÙÒ × Ð × × ÒÓ Ó Ó Ö Ó ÙÒ Ö Ó Ý × ÖØ × ÓØÖÓ׺ ÍÒ Ñ Ò Ö Ò Ö ¬ÐØÖ Ö Ð × Ù Ò ÔÖ × ÒØ ÔÓÖ ÙÒ Ø Ö ÓÖ ÓÒ× ×Ø Ò Ù× Ö ÙÒ “iterador filtro”¸ Ð Ù Ð Ò ÒØ Ö Þ × ÑÙÝ × Ñ Ð Ö ÙÒ Ø Ö ÓÖ ØÖ ¹ ÓÒ Ðº È Ö ÙÒ Ø Ö ÓÖ ¬ÐØÖÓ ×Ô ¬ Ö× Ð ÓÒ ÙÒØÓ ×Ó Ö Ð Ù Ð × Ø Ö ¸ ÙÒ Ø Ö ÓÖ ×Ó Ö ÕÙ Ð ÓÒ ÙÒØÓ Ý ÙÒ ÙÒ ÓÒ ÕÙ × ÙÒ Ð Ñ ÒØÓ ÚÙ ÐØÓ ÔÓÖ Ð Ø ¹ Ö ÓÖ Ó ÒÓ × Ö ÑÓ×ØÖ Ó ÔÓÖ Ð Ø Ö ÓÖ ¬ÐØÖÓº ËÙ ×Ô ¬ ÓÒ Ö × Ò Ð Ö ÚÓ filter iterator.H¸ Ð Ù Ð × ¬Ò ÓÑÓ × Ù ¼ ¬ÐØ Ö Ø Ö ØÓÖºÀ ¼ ≡ template <class Container, class It, class Show_Item> class Filter_Iterator : public It { Å Ñ ÖÓ× ÔÖ Ú Ó× Ø Ö ÓÖ ¬ÐØÖÓ ¼ Å Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ ¬ÐØÖÓ ¼ }; ¬Ò × Filter Iterator¸ Ù× Ò ÙÒ × ¼ ß½¼º Ù Ò Ó × Òר Ò ÙÒ Ø Ö ÓÖ ¬ÐØÖÓ ´Filter Iteratorµ¸ × ×Ô ¬ Ò ØÖ × Ð × × Ô Ö Ñ ØÖ Þ × × ÙÒ ÐÓ Ý Ñ Ò ÓÒ Ó ½º Container Ð Ø ÔÓ ÓÒ ÙÒØÓ ×Ó Ö Ð Ù Ð × Ø Ö º ¾º It ÙÒ Ø Ö ÓÖ ×Ó Ö Ð ÓÒ ÙÒØÓ Containerº ÁÒØ ÖÒ Ñ ÒØ ¸ Ð Ø Ö ÓÖ ¬ÐØÖÓ Òר Ò ÙÒ Ø Ö ÓÖ Ø ÔÓ Container::It ÓÒ Ð Ù Ð × Ö ÓÖÖ Ò ÐÓ× Ð Ñ ÒØÓ× Containerº
  • 634.
    608 Cap´ ıtulo 7. Grafos ¿ºShow Item ÙÒ Ð × ÕÙ Ø ÖÑ Ò × ÙÒ Ð Ñ ÒØÓ Ð ÓÒ ÙÒØÓ Ó ÒÓ × Ö ÑÓ×ØÖ Ó ÔÓÖ Ð Ø Ö ÓÖº ×ØÓ × Ö Ð Þ Ñ ÒØ Ð ÐÐ Ñ ÐÓ bool Show Item::operator()(Container&, Container::Item Type&) Ð Ù Ð Ö¹ ØÓÖÒ Ö true × Ð Ð Ñ ÒØÓ ÑÓ×ØÖ Ö× Ó false ÐÓ ÓÒØÖ Ö Óº Ä ÑÔÐ ÒØ ÓÒ × Ö Ð Ø Ú Ñ ÒØ × Ò ÐÐ Ý ×Ø ÙÒ Ñ ÒØ Ò Ð Ö Ú ÓÒ ÔÙ Ð Container::Itº È Ö ÒרÖÙÑ ÒØ Ö Ð ÐÐ Ñ ÓÒÚ Ò Show Item()()¸ Ö ÕÙ Ö ÑÓ× Ù Ö Ö Ð ÓÒ ÙÒØÓ Ò ÔÙÒØ ÖÓ ÓÑÓ ØÖ ÙØÓ Ð Ð × ¼ Å Ñ ÖÓ× ÔÖ Ú Ó× Ø Ö ÓÖ ¬ÐØÖÓ ¼ ≡ ´¼µ ¼ Container * cont; Ñ ×¸ ÑÔÐ Ö ÑÓ× Ó× Ø ÔÓ ÖÙØ Ò ×¸ ÙÒ Ô Ö ÓÐÓ Ö Ð Ø Ö ÓÖ Ò ÙÒÓ ÐÓ× ÜØÖ ÑÓ× Ð × Ù Ò Ý ÓØÖ Ô Ö Ú ÒÞ ÖÐÓ ×Ø × Ö Ð Þ Ò Ð × Ù ÒØ Ñ Ò Ö ¼ Å Ñ ÖÓ× ÔÖ Ú Ó× Ø Ö ÓÖ ¬ÐØÖÓ ¼ +≡ ´¼µ ¼ void goto_first_valid_item() { try { // colocarse en el primer elemento que acepte Show_Item for (It::reset_first(); true; It::next()) if (not It::has_current() or Show_Item () (*cont, It::get_current())) return; } catch (std::overflow_error) { /* se queda en overflow sin propagar */ } } void forward() { It::next(); try { // avanzar hasta el siguiente item que acepte Show_Item for (;true; It::next()) if (not It::has_current() or Show_Item () (*cont, It::get_current())) return; } catch (std::overflow_error) { /* se queda en overflow sin propagar */ } } goto first valid item() ÓÐÓ Ð Ø Ö ÓÖ ¬ÐØÖÓ Ò Ð ÔÖ Ñ Ö Ð Ñ ÒØÓ Ú Ð Ó ÕÙ Ø Ö¹ Ñ Ò Show Item()(*cont,It::get current())µº forward() ÐÓ Ú ÒÞ ×Ø Ð ÔÖ Ñ Ö ÔÓ× ÓÒ Ú Ð × ÙÒ Ð Ñ ×ÑÓ Ö Ø Ö Óº Ò Ñ × ÓÔ Ö ÓÒ × Ü ×Ø Ð ÔÓ× Ð ÕÙ ÒÓ Ý Ñ × Ð Ñ ÒØÓ× ÕÙ ÑÓ×ØÖ Öº Ò ×Ø ×Ó¸ Ð Ø Ö ÓÖ Ö× Ò Ð ×Ø Ó × ÓÖ std::overflow error × Ò ÔÖÓÔ Ö Ð Ü Ô ÓÒ ´ Ñ ÒÓ× ÕÙ × ÙØ ÙÒ next() ×Ó Ö ÙÒ Ø Ö ÓÖ × ÓÖ Ó¸ Ý ×Ø × Ð Ö ÞÓÒ ÔÓÖ Ð Ù Ð Ð ÔÖ Ñ Ö next() ×Ó Ö forward() ÒÓ ØÖ Ô Ð Ü Ô ÓÒµº À Ý Ó× ÖÙØ Ò × Ò ÐÓ × Ô Ö ÓÐÓ Ö Ð Ø Ö ÓÖ Ò Ð ÙÐØ ÑÓ Ð Ñ ÒØÓ Ý Ú ÒÞ Ö ØÖ × goto last valid item() Ý backward()º Ä × ÖÙØ Ò × ÚÒ ¬Ò × Ó ÙÐØ Ò Ð ÒÑ × Ö Ñ ÒØÓ Ð Ñ ÒØÓ× ØÖ Ú × Show Itemº Å ÒØ ÐР׸ Ð ÒרÖÙÑ ÒØ ÓÒ × Ö ÐÑ ÒØ ÓÑÔÖ Ò× Ð ¼ Å Ñ ÖÓ× ÔÙ Ð Ó× Ø Ö ÓÖ ¬ÐØÖÓ ¼ ≡ ´¼µ typedef typename It::Item_Type Item_Type; Filter_Iterator() : cont(NULL) { /* empty */ } Filter_Iterator(Container & cont) : It(cont), cont(&cont)
  • 635.
    7.5. Recorridos sobregrafos 609 { goto_first_valid_item(); } Filter_Iterator(const Filter_Iterator & it) : It(it), cont(it.cont) { /* empty */ } Filter_Iterator & operator = (const Filter_Iterator & it) { *((It*) this) = it; cont = it.cont; return *this; } void next() { forward(); } void prev() { backward(); } void reset_first() { goto_first_valid_item(); } void reset_last() { goto_last_valid_item(); } Í× × Filter Iterator ¼ º Å ÒØ ר ÔÖ Ñ Ø Ú × ÙÒ Ø Ö ÓÖ ¬ÐØÖÓ Ó Ö Ð ÐÙ× ÓÒ × Ö ÙÒ Ø Ö ÓÖ ALEPH ´Ó Ö Ü Ø Ñ ÒØ ×Ù Ñ ×Ñ ÒØ Ö Þµº ÄÓ× Ø Ö ÓÖ × ALEPH Ù ÖÓÒ × Ò Ó× Ô Ò× Ò Ó Ò Ð Ö Ò Ñ ÒØÓ Ý Ð Ð º × ÔÖ Ò Ô ÐÑ ÒØ ÔÓÖ × Ö ÞÓÒ ÕÙ ×ØÓ× ÒÓ ÜÔÓÖØ Ò ÙÒ ÒØ Ö Þ Ö Ñ Ò × ÒØ Ð Ð Ð ÓØ stdc++¸ ÔÙ × ×Ø ÙÐØ Ñ ÓÒ×ÙÑ Ø ÑÔÓ× Ò ÓÔ × Ø ÑÔÓÖ Ð ×½¿ º 7.5.1.1 Iterador filtro de arcos de un nodo Ð Ø Ö ÓÖ ¬ÐØÖÓ ÕÙ ÑÓ× ¬Ò Ö × ÔÐ Ð ÔÖ Ø Ñ ÒØ Ù ÐÕÙ Ö ÓÒØ Ò ÓÖ ALEPH ÐÓ× Ö Ð ÓÒ Ó× ÐÓ× Ö Ó× Ò ÐÙ× Ú º ÓÒ× Ù ÒØ Ñ ÒØ ¸ × ÙÒ Ð × Ö ÙÒ×¹ Ø Ò × Ð ÓÖ ØÑ ׸ Ð ÙÒ × Ú × Ò × Ø Ö ÑÓ× Ø Ö Ö Ñ Ò Ö ÕÙ ÐÓ× Ð ÓÖ ØÑÓ× ÒÓ Ú Ò Ð ÙÒ × Ð × × Ö Ó× ÐÓ× Ù× Ó× Ô Ö Ð ÙÐÓ Ô Ö Ð ×¸ ÔÓÖ ÑÔÐÓº ÈÓÖ ×Ø Ö ÞÓÒ¸ ¬Ò Ö ÑÓ× ÙÒ Ø Ö ÓÖ ÜØ ÖÒÓ Ð Ð × List Graph<Node, Arc> ÕÙ ÓÔ Ö ×Ó Ö ÐÓ× Ö Ó× ÙÒ ÒÓ Óº Ì Ð Ð × × ×Ô ¬ Ð ÑÓ Ó × Ù ÒØ ¼ ÁØ Ö ÓÖ × ¬ÐØÖÓ× List Graph<Node, Arc> ¼ ≡ ½¼ template <class GT, class Show_Arc = Default_Show_Arc<GT> > class Node_Arc_Iterator : public Filter_Iterator<typename GT::Node*, typename GT::Node_Arc_Iterator, Show_Arc> { }; Í× × Filter Iterator ¼ Ò Node Arc Iterator º Ë Ò Ó ÖÚ Filter Iterator ÓÒ Ð Ø Ö ÓÖ ÒÓ Ó× Ð Ö Ó¸ Ð ÒØ Ö Þ Node Arc Iterator × ÒØ List Graph<Node, Arc> Node Arc Iteratorº Ä Ð × ÐÓ Ð Node Arc Iterator Ø Ò ÙÒ ×Ô Ð Þ ÓÒ ÔÓÖ ÓÑ × ÓÒ ÕÙ ÒÓ Ö Ð Þ Ò Ò ÙÒ ¬ÐØÖ Ó Ý ÕÙ × ÑÔÐ ÒØ Ó ÔÓÖ Ð Ð × Default Show Arcº × Ö¸ × ÒÓ × ×Ô ¬ ÙÒ Ð × ¬ÐØÖÓ Ö Ó׸ ÒØÓÒ × Node Arc Iterator ÑÙ ×ØÖ ØÓ Ó× ÐÓ× Ö Ó׺ ר Ø Ö ÓÖ × Ö ÑÔÐ Ñ ÒØ ÙØ Ð Þ Ó ÔÓÖ ÐÓ× Ð ÓÖ ØÑÓ× Ö Ó׺ ËÙ Ú Ö× ÓÒ ÔÓÖ ÓÑ × ÓÒ × Ò × ÑÔ ÒÓ ÕÙ Ú Ð ÒØ Ð Ø Ö ÓÖ ½¿ ÍÒ ÑÔÐÓ Ø Ô Ó for (typename set<T>::iterator = s.begin(); it < s.end(); it++)
  • 636.
    610 Cap´ ıtulo 7. Grafos List Graph<Node, Arc> Node Arc Iterator¸ ÔÙ × Ð Ö Ø Ö ÒÐ Ò ÐÓ× Ñ ØÓ Ó× Ð Ô ÖÑ Ø Ð ÓÑÔ Ð ÓÖ Ö Ð Þ Ö Ö Ø Ñ ÒØ Ð ÐÐ Ñ º 7.5.1.2 Iterador filtro de arcos Ë Ñ Ð Ö Ð Ø Ö ÓÖ ÒØ Ö ÓÖ¸ Ô ÖÓ Ô Ö ØÓ Ó× ÐÓ× Ö Ó× Ö Ó¸ ¬Ò ÑÓ× ÙÒ Ø Ö ÓÖ ¬ÐØÖÓ ½¼ ÁØ Ö ÓÖ × ¬ÐØÖÓ× List Graph<Node, Arc> ¼ +≡ ¼ ½¼ template <class GT, class Show_Arc = Default_Show_Arc<GT> > class Arc_Iterator : public Filter_Iterator<GT, typename GT::Arc_Iterator, Show_Arc> { }; Í× × Arc Iterator Ò Filter Iterator ¼º Ð Ù×Ó ×Ø Ø Ö ÓÖ × Ñ ÒÓ× Ö Ù ÒØ ÕÙ Node Arc Iteratorº 7.5.1.3 Iterador filtro de nodos ÅÙ Ó Ñ ÒÓ× Ö Ù ÒØ Ù×Ó¸ Ô ÖÓ ÔÐ Ù× Ð ¸ ¬Ò ÑÓ× ÙÒ Ø Ö ÓÖ ¬ÐØÖÓ ×Ó Ö ÐÓ× ÒÓ Ó× ½¼ ÁØ Ö ÓÖ × ¬ÐØÖÓ× List Graph<Node, Arc> ¼ +≡ ½¼ template <class GT, class Show_Node = Default_Show_Node<GT> > class Node_Iterator : public Filter_Iterator<GT, typename GT::Node_Iterator, Show_Node> { }; Í× × Filter Iterator ¼ Ò Node Iterator º 7.5.2 Recorrido en profundidad Ò ÙÒ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ ¸ Ð Ö Ó × Ú × Ø ØÖ Ø Ò Ó ÓÒ ÓÖÑ Ö Ð Ñ ÒÓ Ñ × Ð Ö Ó ÔÓ× Ð ÒØ × Ö ØÓÖÒ Ö ÙÒ ÒÓ Ó Ý Ú × Ø Óº × ÙÒ Ö ÓÖÖ Ó Ò ÓÐ Ö ÙÖ× Ú º Ë dft(p) Ù × Ð ÔÖ Ñ Ø Ú Ö ÓÖÖ Ó ×Ó Ö Ð ÒÓ Ó p¸ ÒØÓÒ × Ð Ð ÓÖ ØÑÓ Ò Ö Ð × Ö ÓÑÓ × Ù º Algoritmo 7.1 (Recorrido en profundidad desde el nodo p ) Ð Ð ÓÖ ØÑÓ × Ö ¹ ÙÖ× ÚÓ ÓÒ ÔÖÓØÓØ ÔÓ dft(p) ÓÒ p × Ð ÒÓ Ó ØÙ Ð Ú × Ø º Ë Ù× ÙÒ Ú Ö Ð ÐÓ Ð¸ num nodes¸ ÙÝÓ Ú ÐÓÖ Ò Ð × ÖÓ¸ Ô Ö ×Ò Ð ÖÐ Ò¹ Ø ÒÓ Ó× Ú × Ø Ó׺ ½º Ë p ר Ô ÒØ Ó × Ö¸ Ý Ù Ñ Ö Ó ÓÑÓ Ú × Ø Ó¸ =⇒ Ö ØÓÖÒ º ¾º È ÒØ Ö pº ¿º ÁÒ Ö Ñ ÒØ Ö num nodes Ò ÙÒÓº º Ë num nodes == |V| =⇒ ØÓ Ó× ÐÓ× ÒÓ Ó× Ð Ö Ó Ò × Ó Ö ÓÖÖ Ó× Ý Ð Ð ÓÖ ØÑÓ Ø ÖÑ Ò º º È Ö ØÓ Ó Ö Ó a Ý ÒØ p ´ µ Ë q Ð ÒÓ Ó Ò ÒØ × p ØÖ Ú × Ð Ö Ó aº
  • 637.
    7.5. Recorridos sobregrafos 611 ´ µ ÄÐ Ñ Ö dft(q); Ë Ð Ò ÔÖÓ ÙÒ ÔÓÖÕÙ ¸ Ó Ð ÒÓ Ó p¸ Ð Ö ÓÖÖ Ó ÒÓ Ö Ú × ÙÒ ÒÙ ÚÓ Ö Ó p −→ r ר ÒÓ Ö Ö ÓÖÖ Ó ÓÑÔÐ Ø Ñ ÒØ Ò ÔÖÓ ÙÒ Ð ÒÓ Ó q × Ð Ö Ó ØÙ Ð p −→ qº ÅÙ × Ú × ÙÒ ÔÖÓ Ð Ñ ×Ó Ö Ö Ó× ÓÒ× ×Ø Ò Ù× Ö ÙÒ ÒÓ Ó ÓÒ Ð ÙÒ × Ö ¹ Ø Ö ×Ø × ÕÙ Ö ÔÖ × ÒØ Ò Ð ×ÓÐÙ ÓÒº ÈÓÖ ×Ø Ö ÞÓÒ¸ ÐÓ× Ö ÓÖÖ Ó× ×Ó Ö Ö Ó× Ø Ñ Ò × Ð ÒÓÑ Ò ¸ Ò ×Ø ÒØ Ñ ÒØ ¸ Ù×ÕÙ × º ÑÔÐ Ö ÑÓ× ÓÑÓ × ÒÓÒ ÑÓ¸ ÒØÓÒ ×¸ Ð ÜÔÖ × ÓÒ Ù×ÕÙ Ò ÔÖÓ ÙÒ Ô Ö Ö Ö Ö Ð Ö ÓÖÖ Ó ÓÑÓÒ ÑÓº Î ÑÓ× ÓÖ ÓÑÓ Ó ¬ Ö Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ º È Ö ÐÐÓ¸ Ü Ñ Ò ÑÓ× Ð ÔÖÓØÓØ ÔÓ Ð ÙÒ ÓÒ Ö ÙÖ× Ú ÕÙ ÒÓ× ÑÔÐ ÒØ Ö Ð Ð ÓÖ ØÑÓ º½ ½½ Ê ÓÖÖ Ó Ò ÔÖÓ ÙÒ ½½ ≡ ½¾ template <class GT, class SA> inline static bool __depth_first_traversal(GT & g, typename GT::Node * node, typename GT::Arc * arc, bool (*visit)(GT & g, typename GT::Node *, typename GT::Arc *), size_t & count); ר × Ð ÖÙØ Ò Ö ÙÖ× Ú ÕÙ ÑÔÐ ÒØ Ð Ð ÓÖ ØÑÓ º½º depth first traversal<GT,SA>() ÓÔ Ö ×Ó Ö ÙÒ Ó ØÓ Ö Ú Ó List Graph<Node, Arc>¸ Ð Ù Ð ×Ø ÜÔÖ × Ó ÔÓÖ Ð Ô Ö Ñ ØÖÓ Ø ÔÓ GTº Ð Ô Ö Ñ ØÖÓ Ø ÔÓ SA Ö ÔÖ × ÒØ Ð Ö Ø ¹ ÖÓ ÑÖ ÐÓ× Ö Ó× ÒØ ÖÒ Ñ ÒØ ¸ depth first traversal() ÙØ Ð Þ ÙÒ Ø Ö ÓÖ ¬ÐØÖÓ ×Ó Ö ÐÓ× Ö Ó׺ ר ÑÓ Ó¸ × ÔÙ ÓÒ¬ ÙÖ Ö Ð Ö ÓÖÖ Ó Ô Ö ÓÒ× Ö Ö Ó ÒÓ Ö Ó× Ð Ö Ó × ÙÒ Ð ÙÒ Ö Ø Ö Óº ÄÓ× Ô Ö Ñ ØÖÓ× Ð ÙÒ ÓÒ × × Ö Ò × ½º g Ð Ö Ó ×Ó Ö Ð Ù Ð × Ö Ð Þ Ð Ö ÓÖÖ Óº ¾º node Ð ÒÓ Ó ÕÙ × ×Ø Ú × Ø Ò Óº ¿º arc Ð Ö Ó × Ð Ù Ð × ÐÐ Ð ÒÓ Ó nodeº º (*visit)() ÔÙÒØ ÖÓ Ð ÙÒ ÓÒ Ú × Ø º Ë ×Ø ÔÙÒØ ÖÓ × ×Ø ÒØÓ ÒÙÐÓ¸ ÒØÓÒ × Ð ÙÒ ÓÒ Ú × Ø × ÒÚÓ Ð ÔÖ Ñ Ö Ú Þ ÕÙ × Ú ÙÒ ÒÓ Óº Ä ÙÒ ÓÒ Ú × Ø Ø Ò ÐÓ× × Ù ÒØ × Ô Ö Ñ ØÖÓ× ´ µ g Ð Ö Ó ÕÙ × ×Ø Ú × Ø Ò Óº ´ µ n ÔÙÒØ ÖÓ Ð ÒÓ Ó Ú × Ø Óº ´ µ a ÔÙÒØ ÖÓ Ð Ö Ó ÕÙ ÓÒ Ù Ð ÒÓ Ó Ú × Ø Ó nº (*visit)() Ö ØÓÖÒ ÙÒ Ú ÐÓÖ ÐÓ Óº Ë × true ÒØÓÒ × × ×ÙÑ ÕÙ Ð Ù×ÕÙ Ø ÖÑ Ò Ó ÐÓ ÓÒØÖ Ö Ó¸ Ð Ù×ÕÙ ÔÖÓ× Ù ×Ø ÕÙ (*visit)() Ö ØÓÖÒ ØÖÙ Ó ×Ø ÕÙ × Ý Ò Ú × Ø Ó ØÓ Ó× ÐÓ× Ö Ó× Ý ÒÓ Ó× Ð Ö Ó × ÙÒ ×Ù ÓÒ Ø Ú º º node counter Ô Ö Ñ ØÖÓ ÔÓÖ Ö Ö Ò ÕÙ ÓÒØ Ð Þ Ð ÒØ ÒÓ Ó× Ú × ¹ Ø Ó׺
  • 638.
    612 Cap´ ıtulo 7. Grafos depth first traversal() Ö ÓÖÖ Ö ÙÖ× Ú Ñ ÒØ Ð Ö Ó Ô ÖØ Ö Ð ÒÓ Ó nodeº Ð Ú ÐÓÖ Ö ØÓÖÒÓ (*visit)() Ô ÖÑ Ø Ø Ò Ö Ð Ù×ÕÙ × ÙÒ Ð ÙÒ Ö Ø Ö Ó ×Ô ¬ Ó Ñ Ó Ò Ð ÙÒ ÓÒº Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ × ÒÚÓ ÔÓÖ ÔÖ Ñ Ö Ú Þ × Ð × Ù ÒØ ÖÙØ Ò Ù×Ó ÔÙ Ð Ó ½¾ Ê ÓÖÖ Ó Ò ÔÖÓ ÙÒ ½½ +≡ ½½ ½¾ template <class GT, class SA> inline size_t depth_first_traversal(GT & g, typename GT::Node * start_node, bool (*visit)(GT & g, typename GT::Node *, typename GT::Arc *) ) { g.reset_bit_nodes(Depth_First); // reiniciar bit Depth_First de los nodos g.reset_bit_arcs(Depth_First); // reiniciar bit Depth_First de los arcos size_t counter = 0; // inicialmente no se ha visitado ning´n nodo u __depth_first_traversal <GT, SA> (g, start_node, NULL, visit, counter); return counter; } Ð Ù Ð ÜÔÐÓÖ Ò ÔÖÓ ÙÒ Ð Ö Ó g Ô ÖØ Ö Ð ÒÓ Ó start node Ý Ö ØÓÖÒ Ð ÒØ ÒÓ Ó× Ú × Ø Ó׺ Ë × ×Ô ¬ ÙÒ ÙÒ ÓÒ Ú × Ø ¸ ÒØÓÒ × ×Ø × ÒÚÓ ÚÞ ÕÙ ÙÖ ÒØ Ð ÜÔÐÓÖ ÓÒ × × Ù Ö ÙÒ ÒÓ Óº À Ý ÓØÖ Ú Ö× ÓÒ¸ ÕÙ ÒÓ Ö ÕÙ Ö ×Ô ¬ Ö Ð ÒÓ Ó Ò Ó¸ ÕÙ ÖÖ Ò Ð Ú × Ø ×Ó Ö ÙÒ ÒÓ Ó Ù ÐÕÙ Ö Ð Ö Ó ´ Ð ÕÙ ÖÖÓ get first node()µº ÒØ × ÑÔÐ ÒØ Ö depth first traversal() × ÓÒÚ Ò ÒØ Ö Ð Þ Ö Ð ÙÒ × Ð Ö ¹ ØÓÖ × ÕÙ ÒÓ× ÝÙ Ö Ò ÓÑÔÖ Ò Ö Ð Ó Ó ×Ø Ý ÓØÖÓ× Ð ÓÖ ØÑÓ× ×Ó Ö Ö Ó׺ Ò ÔÖ Ñ Ö ÐÙ Ö¸ ÓÖ ÑÓ× Ð Ñ Ò Ö Ñ Ö Ö ÐÓ× ÒÓ Ó׸ Ð Ù Ð × Ö Ñ ÒØ ÙÒ Ø ÓÒØÖÓÐ Ò ÒÙ ×ØÖÓ ×Ó¸ Ð Ø Depth Firstº Ò × ÙÒ Ó ÐÙ Ö¸ ØÓ× Ð Ö Ö Ð Ö ÓÖÖ Ó¸ Ú ÑÓ× Ñ Ö Ö¸ Ø Ñ Ò¸ ÐÓ× Ö Ó× Ú ×ØÓ׺ ×ØÓ ÒÓ× ÓÖÖ ÐÐ Ñ × Ö ÙÖ× Ú × ÕÙ Ú Ò Ö ×Ó Ö ÒÓ Ó× ÔÖ Ú Ñ ÒØ Ú × Ø Ó× × ÓØÖÓ Ñ ÒÓº À × Ð × Ð Ö ØÓÖ × Ô ÖØ Ò ÒØ ׸ ÔÓ ÑÓ× ÔÖ × ÒØ Ö Ð ÖÙØ Ò Ö ÙÖ× Ú ½¾ Ê ÓÖÖ Ó Ò ÔÖÓ ÙÒ ½½ +≡ ½¾ template <class GT, class SA> inline static bool __depth_first_traversal(GT & g, typename GT::Node * node, typename GT::Arc * arc, bool (*visit)(GT & g, typename GT::Node *, typename GT::Arc *), size_t & count) { if (IS_NODE_VISITED(node, Depth_First)) return false; NODE_BITS(node).set_bit(Depth_First, true); // marca nodo visitado count++; // Aqu´ se visita el nodo mediante la funci´n de visita ı o // recorrer arcos de node y visitar recursivamente nodos conectados for (Node_Arc_Iterator<GT, SA> it(node); it.has_current(); it.next()) { typename GT::Arc * arc = it.get_current_arc();
  • 639.
    7.5. Recorridos sobregrafos 613 if (IS_ARC_VISITED(arc, Depth_First)) continue; ARC_BITS(arc).set_bit(Depth_First, true); // marca arco actual visitado if (__depth_first_traversal<GT, SA>(g, it.get_tgt_node(), arc, visit, count)) return true; // ya se explor´ cabalmente it.get_tgt_node() o } return false; // retorne y siga explorando } Í× × Node Arc Iterator º ÆÓØ × ÕÙ Ð ÓÒ ÓÒ Ø Ö ÓÒ Ð for ÓÒ× Ö Ð Ø Ò ÓÒ × Ý × ÒÚר Ó ØÓ Ó× ÐÓ× ÒÓ Ó׺ B J H M L A D E N I C F G K ÙÖ º½ ÍÒ Ö Ó ÑÔÐÓ Ò ÖØÓ ÑÓ Ó¸ Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ × Ö Ñ Ò × ÒØ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó ×Ó Ö ÙÒ Ö Óк Ó¸ ×Ù ÒØ ÖÔÖ Ø ÓÒ ÓÑÓ Ö ÓÐ × ÑÙÝ ÙØ Ð Ô Ö ×ØÙ Ö Ð × ÒØ Ó Ð ÜÔÐÓÖ ÓÒº Ä ¬ ÙÖ º½ ÐÙ×ØÖ Ó× ÒØ ÖÔÖ Ø ÓÒ × Ö ÓÖÖ Ó Ô Ö Ð Ö Ó Ð ¬ ÙÖ º½ ÙÒ Ö ÓÖÖ Ó ÕÙ ÓÑ ÒÞ Ò Ð ÒÓ Ó A Ý ÓØÖÓ Ò Nº ÍÒ Ú Þ ×Ø Ð Ó Ð ÒÓ Ó Ò Ó¸ Ð ÓÖ Ò Ú × Ø Ô Ò Ð ØÓÔÓÐÓ Ð Ö Ó Ý Ð ÓÖ Ò Ò ÕÙ × ÔÖ × ÒØ Ò ÐÓ× Ö Ó× Ò Ð × Ð ×Ø × Ý Ò ÒÓ Óº Ð ÓÖ ØÑÓ× × Ó× Ò Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ × Ù× Ò Ù Ò Ó × ×Ø Ñ ÕÙ Ð ÒÓ Ó ×ÓÐÙ ÓÒ ×Ø Ð ÒÓ Ð Ò Óº ÆÓØ ÑÓ× ÕÙ ÐÓ× Ö ÓÐ × ÔÖÓ ÙÒ Ð ¬ ÙÖ º½ ×ÓÒ Ð Ö Ó× Ý Ð Ó× ¸ ÓÒ ÔÓ × Ö Ñ ×º Ð ÔÖ Ñ ÖÓ × ÔÐ ÒÓ ÔÓÖÕÙ Ô ÖØ Ö A × ÔÓ× Ð Ú × Ø Ö ÒØ Ö Ñ ÒØ Ð Ö Ó × Ò Ò × Ö Ö × Ö ÙÒ ÒÓ Ó Ý Ú × Ø Óº Ò Ð × ÙÒ Ó Ö ÓÐ Ú ÑÓ× ÙÒ Ö Ö ×Ó Ð ÒÓ Ó Gº Ë Ð Ö Ó × ÓÒ ÜÓ¸ ÒØÓÒ × Ð Ù×ÕÙ Ò ÔÖÓ ÙÒ Ö ÕÙ Ö ÐÓ ×ÙÑÓ O(V) + O(E) = O(Ñ Ü(V, E)) Ô ×Ó× Ô Ö Ò Ð Þ Ö ÐÓ× Ø× ÐÓ× ÒÓ Ó× Ý Ö Ó׺ ÈÓר Ö ÓÖÑ ÒØ ¸ Ð ÖÙØ Ò ÓÑ ÒÞ Ò Ð ÔÖ Ñ Ö ÒÓ Ó Ð Ö Ó Ý ÐÓ ×ÙÑÓ ÐÐ Ñ Ö ÙÖ× Ú Ñ ÒØ V Ú × depth first traversal()º ÙÖ ÒØ ÐÐ Ñ Ö ÙÖ× Ú × Ö ÓÖÖ ¸ ÒØ Ö Ñ ÒØ ¸ Ð Ð ×Ø Ý Ò Ð ÒÓ Ó Ú × Ø ÐÓ ÕÙ ÑÔÐ ÕÙ ¸ Ò Ð Ô ÓÖ ÐÓ× ×Ó׸ × Ú × Ø Ö Ò ØÓ Ó× ÐÓ× Ö Ó׺ ÈÓÖ Ø ÒØÓ¸ Ð Ù×ÕÙ Ò ÔÖÓ ÙÒ ÓÒ Ð ×Ø × ÒÐ Þ × ×¸ Ô Ö Ð Ô ÓÖ ×Ó¸ O(V) + O(E)º Ð Ô ÓÖ Óר Ò ×Ô Ó Ð ÜÔÐÓÖ ÓÒ Ò ÔÖÓ ÙÒ Ó ÙÖÖ × Ð Ö Ó × Ù ÖØ ¹ Ñ ÒØ ÓÒ ÜÓº ÍÒ Ò ÓÒ ×ØÓ × ÑÙ ×ØÖ Ñ Ö Ò Ó Ð Ö ÓÐ Ö ÓÖ Ò ÔÖÓ ÙÒ¹ Ð ¬ ÙÖ º½ ¹´ µº Ç × ÖÚ ÑÓ× ÕÙ Ø Ò ÙÒ ×ÓÐ Ö Ñ ÐÓ ÕÙ × ÕÙ Ú Ð ÒØ ÙÒ Ð ×Ø ÒÐ Þ º Ò ×Ø ×Ó¸ Ð ÔÖÓ ÙÒ Ö ÙÖ× Ú × ÔÖÓÔÓÖ ÓÒ Ð O(V)º Ë Ð Ö Ó ÒÓ × ÓÒ ÜÓ¸ ÒØÓÒ × Ð Ö ÓÖÖ Ó ÙÐÑ Ò × Ò Ö Ú × Ø Ó ØÓ Ó× ÐÓ× ÒÓ Ó× ÕÙ ÐÐÓ× ÕÙ × Ò Ú × Ø Ó× Ô Ò Ö Ò Ð ÒÓ Ó ÔÓÖ Ð Ù Ð × Ò Ð Ù×ÕÙ º Ð Ö ÓÖÖ Ó ÕÙ ÑÓ× ÔÖ × ÒØ Ó Ù× ÒÓ Ó׸ ÔÓÖ ×Ó ÔÓ ÑÓ× Ø Ò ÖÐÓ Ù Ò Ó ×
  • 640.
    614 Cap´ ıtulo 7. Grafos A B J N D E C D F A E B G J H H M M N L L G I F K K C I ´µ ´ µ ÁÒ Ó Ò Æ ÁÒ Ó Ò ÙÖ º½ Ö ÓÐ × Ö ÓÖ × ÔÖÓ ÙÒ Ð Ö Ó Ð ¬ ÙÖ º½ Ò Ú × Ø Ó ØÓ Ó× ÐÓ× ÒÓ Ó׺ Ò Ó × ÓÒ ×¸ Ð Ù×ÕÙ × ÔÐ ÒØ Ò ÙÒ ÓÒ Ö Ó׸ Ò ÙÝÓ ×Ó Ð Ö ÓÖÖ Ó Ø Ò × Ö Ñ × ÓרÓ×Ó¸ ÔÙ × Ð Ø Ò ÓÒ Ö× Ù Ò Ó × Ý Ò Ú × Ø Ó ØÓ Ó× ÐÓ Ö Ó׺ 7.5.3 Conectividad entre grafos ÍÒ Ð × ÔÐ ÓÒ × Ñ × × ÑÔÐ × Ð Ù×ÕÙ Ò ÔÖÓ ÙÒ × Ð ÔÖÙ ÓÒ ¹ ØÚ ÙÒ Ö Óº Ä × × Ö ÓÖÖ Ö Ð Ö Ó Ý Ú Ö ¬ Ö × Ù ÖÓÒ Ú × Ø Ó× ØÓ Ó× ÐÓ× ÒÓ Ó׸ Ò ÙÝÓ ×Ó ÔÓ ÑÓ× ÓÒ ÐÙ Ö ÓÒ ÖØ ØÙ ÕÙ Ð Ö Ó × ÓÒ ÜÓº À Ý ÙÒ ÓÒ× Ö ÓÒ ÓÒ Ð ÕÙ ÒÙ ×ØÖÓ Ð ÓÖ ØÑÓ Ý ÓÒ× ×Ø Ò Ö Ú × Ö Ð ÒØ Ö Ó׸ Р٠и × × Ñ ÒÓÖ Ð ÒÙÑ ÖÓ ÒÓ Ó× Ñ ÒÓ× ÙÒÓ¸ ÒØÓÒ × ÔÓ ÑÓ× ÓÒ ÐÙ Ö ÕÙ Ð Ö Ó × Ò ÓÒ ÜÓ Ý ÓÖÖ ÖÒÓ× Ð Ö ÓÖÖ Óº Ä ÖÙØ Ò Ö ×ÙÐØ ÒØ × ÑÔÐ ÒØ ¸ ÒØÓÒ ×¸ Ð × Ù ÒØ Ñ Ò Ö ½ ÈÖÙ ÓÒ Ø Ú ½ ≡ template <class GT, class SA> inline bool test_connectivity(GT & g) { if (g.get_num_arcs() < g.get_num_nodes() - 1)
  • 641.
    7.5. Recorridos sobregrafos 615 return false; return depth_first_traversal <GT, SA> (g, NULL) == g.get_num_nodes(); } test connectivity() Ö ØÓÖÒ true × Ð Ö Ó × ÓÒ ÜÓ¸ false ÐÓ ÓÒØÖ Ö Óº Ä ÔÖÙ ×Ó Ö Ð ÒÙÑ ÖÓ Ö Ó× Ú Ð ÓÒ Ö × Ð Ô Ò ÔÓÖÕÙ ØÓÑ Ø ÑÔÓ O(1) Ý ÔÙ ÓÖÖ Ö Óר × Ð Ò Ð ×º ÑÔ ÖÓ¸ ר × ÑÔÐ ÔÖÙ ÓÒ Ø Ú ÒÓ × ÓÖÖ Ø × ØÖ Ø ÑÓ× ÓÒ ÙÒ ÑÙÐØ Ö Óº test connectivity() ÒÓ ÓÔ Ö ×Ó Ö Ö Ó׺ ר Ð × ÓÒ Ø Ú × ×ØÙ Ò Ü º º½º 7.5.4 Recorrido en amplitud ÓÑÓ ÐÓ ÑÓ× Ò Ó¸ Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ ÑÙÐ Ð Ö ÓÖÖ Ó ÔÖ ¬ Ó ×Ó Ö ÙÒ Ö ÓÐ ØÖ Ø Ö ÐÓ Ñ × ÔÖÓ ÙÒ Ó Ò Ò Ú Ð ÒØ × Ö Ö × Ö ÔÖÓ × Ö Ö Ó× ÙÒ ÒÓ Ö ÓÖÖ Ó׺ ÇØÖ ÓÖÑ ÔÖÓ × Ö Ð Ö ÓÖÖ Ó ×Ó Ö ÙÒ Ö Ó ÕÙ ÔÖ Ú Ð ÐÓ× ÒÓ Ó× Ñ × Ö ÒÓ× ×Ó Ö ÐÓ× Ñ × Ð ÒÓ× Ý ÕÙ ¸ × ÙÒ Ð Ò ÓÐ Ð Ö Ó¸ ÔÙ × Ö Ñ × ÓÒÚ Ò ÒØ ¸ × Ð Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ º Ò ×Ø Ð × Ù×ÕÙ ÒÓ × ÔÖÓ × ÙÒ ÒÓ Ó ÙÒ Ò Ú Ð i ר ÕÙ ÒÓ × Ý Ò ÔÖÓ × Ó ØÓ Ó× ÐÓ× ÒÓ Ó× Ð Ò Ú Ð ÒØ Ö ÓÖ i − 1 × Ö¸ ÙÒ ×Ô Ö ÓÖÖ Ó× ÔÓÖ Ò Ú Ð ×º Ð Ñ Ó Ô Ö Ù Ö Ö ÐÓ× ÒÓ Ó× ÔÓÖ Ò Ú Ð × × Ð Ñ ×ÑÓ ÕÙ Ô Ö ÐÓ× Ö ÓÐ × ÙÒ ÓÐ º Ò ÒÙ ×ØÖÓ ×Ó¸ Ù× ÑÓ× ÙÒ ÓÐ ÔÙÒØ ÖÓ× Ö Ó׺ A B C D F N J H E G E H G M L I K M N L K D J F I A B C ´ µ ÁÒ Ó Ò ´ µ ÁÒ Ó Ò Æ ÙÖ º½ Ö ÓÐ × Ö ÓÖ × ÑÔÐ ØÙ Ð Ö Ó Ð ¬ ÙÖ º½ Ä Ö Ò × Ò Ð ÒØÖ Ð Ù×ÕÙ Ò ÑÔÐ ØÙ Ý Ð ÔÖÓ ÙÒ × ÕÙ Ð ÑÔÐ ØÙ ÜÔÐÓÖ ÐÓ× Ñ ÒÓ× Ñ × ÓÖØÓ× ÔÖ Ñ ÖÓ¸ Ñ ÒØÖ × ÕÙ Ð ÔÖÓ ÙÒ Ø Ò Ö ÔÓÖ ÐÓ× Ñ × Ð Ö Ó׺ ר Ó× Ò Ô Ö Ø Ñ ÒØ ÓÒØÖ ×Ø Ò Ó ÐÓ× Ö ÓÐ × Ö ÓÖÖ Ó׸ ÐÓ× Ù Ð × ×ÓÒ Ñ × ÖÓÒ Ó×Ó× Ô Ö Ð Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ ´Ú Ö ¬ ÙÖ × Ü º½ ´Ô Ò ½ µ Ý Ü º½ ´Ô Ò ½ µµº Ä ÔÖ Ñ Ø Ú ÒÓ × Ö ÙÖ× Ú º Ì Ò Ð Ñ ×Ñ ÒØ Ö Þ Ô Ö Ñ ØÖÓ× ÕÙ ×Ù ÓÒØÖ Ô ÖØ Ò ÔÖÓ ÙÒ Ý × ÒרÖÙÑ ÒØ Ð × Ù ÒØ ÑÓ Ó ½ Ê ÓÖÖ Ó Ò ÑÔÐ ØÙ ½ ≡ ¾ template <class GT, class SA> inline size_t breadth_first_traversal(GT & g, typename GT::Node * start, bool (*visit)(GT &, typename GT::Node *, typename GT::Arc *) ) {
  • 642.
    616 Cap´ ıtulo 7. Grafos g.reset_bit_nodes(Breadth_First); g.reset_bit_arcs(Breadth_First); DynListQueue<typename GT::Arc*> q; // cola de arcos pendientes // ingresar a la cola los arcos de nodo start for (Node_Arc_Iterator<GT, SA> it(start); it.has_current(); it.next()) q.put(it.get_current_arc()); NODE_BITS(start).set_bit(Breadth_First, true); // marcar visitado start size_t node_counter = 0; // contador de nodos visitados // mientras queden arcos en cola y resten todos por visitar while (not q.is_empty() and node_counter < g.get_num_nodes()) { typename GT::Arc * arc = q.get(); // extraiga arco m´s cercano de la cola a ARC_BITS(arc).set_bit(Breadth_First, true); // marcar arco typename GT::Node * src = g.get_src_node(arc); typename GT::Node * tgt = g.get_tgt_node(arc); if (IS_NODE_VISITED(src, Breadth_First) and IS_NODE_VISITED(tgt, Breadth_First)) continue; typename GT::Node * visit_node = // seleccionar nodo a visitar IS_NODE_VISITED(src, Breadth_First) ? tgt : src; // Aqu´ se visita el nodo mediante la funci´n de visita ı o NODE_BITS(visit_node).set_bit(Breadth_First, true); node_counter++; // insertar en cola arcos del nodo reci´n visitado e for (Node_Arc_Iterator<GT, SA> it(visit_node); it.has_current(); it.next()) { typename GT::Arc * curr_arc = it.get_current_arc(); if (IS_ARC_VISITED(curr_arc, Breadth_First)) continue; // revise nodos del arcos para ver si han sido visitados if (IS_NODE_VISITED(g.get_src_node(curr_arc), Breadth_First) and IS_NODE_VISITED(g.get_tgt_node(curr_arc), Breadth_First)) continue; // nodos ya visitados ==> no vale la pena meter el arco q.put(curr_arc); } } return node_counter; } Í× × DynListQueue ½ ¼ Ò Node Arc Iterator º Ä Ù×ÕÙ Ò ÑÔÐ ØÙ Ø Ò × Ö Ñ × ÓרÓ× Ò Ø ÑÔÓ Ý Ò ×Ô Ó ÕÙ Ð ÔÖÓ ÙÒ ¸ ÔÙ × Ð Ò ÓÐ Ñ ÒØÓ Ñ ÒØ Ò Ö Ó× ÕÙ ÒÓ Ò × Ó Ú × Ø Ó× ÐÓ ÕÙ ÒÓ ×Ù ÓÒ Ð ÑÔ Ð Ñ ÒØÓ Ð Ù×ÕÙ Ò ÔÖÓ ÙÒ ÕÙ ÐÑ Ò Ö Ó× Ú × Ø Ó׺ Ð Ô ÓÖ ×Ó Ù ÓÒ Ð Ù×ÕÙ Ò ÑÔÐ ØÙ Ó ÙÖÖ Ù Ò Ó × Ò × Ö Ó Ú × Ø Ö ØÓ Ó× ÐÓ× Ö Ó× ÒØ × Ö Ú ×ØÓ ØÓ Ó× ÐÓ× ÒÓ Ó× Ó × ¸ O(E)¸ Ù Ð × Ð Ñ ×ÑÓ Ð Ù×ÕÙ Ò ÔÖÓ ÙÒ º È Ö Ò Ð Þ Ö Ð Óר Ò ×Ô Ó × ÓÒÚ Ò ÒØ Ó × ÖÚ Ö Ð Ò Ñ Ò× Ö ÓÒ Ý Ð Ñ Ò ÓÒ Ö Ó× Ò Ð ÓÐ º Ù Ò Ó × × Ð ÓÐ ÙÒ Ö Ó Ô ÖØ Ò ÒØ Ð Ò Ú Ð i ´Ö ×Ô ØÓ Ð ÒÓ Ó Ò Óµ¸ Ð ÓÐ ÔÙ ÓÒØ Ò Ö Ö Ó× Ð Ò Ú Ð i Ý Ð ×ÙÔ Ö ÓÖ i + 1º Ë ÒØ ÖÔÖ Ø ÑÓ× Ð Ö ÓÖÖ Ó ÓÑÓ Ð Ö ÓÖÖ Ó ÔÓÖ Ò Ú Ð × ÙÒ Ö Óи ÒØÓÒ × ÔÓ ÑÓ× Ô Ö Ø ÖÒÓ× ÕÙ ÐÓ ×ÙÑÓ × Ø Ò Ö Ò E/2 Ö Ó× Ò Ð ÓÐ ÐÓ ÕÙ ÕÙ Ú Ð ÙÒ Óר O(E)¸ Ù Ð ÔÙ × Ö ×Ø ÒØ Ñ ÝÓÖ ÕÙ Ð Óר Ò ×Ô Ó O(V) Ð Ö ÓÖÖ Ó
  • 643.
    7.5. Recorridos sobregrafos 617 Ò ÔÖÓ ÙÒ º Ù Ò Ó Ö ÓÖÖ Ö Ò ÔÖÓ ÙÒ Ó Ò ÑÔÐ ØÙ Ä Ö ×ÔÙ ×Ø Ô Ò Ú Ö Ó× ØÓÖ ×¸ ÐÓ× Ù Ð × Ð ÔÖ Ò Ô Ð × Ð ÔÖ ×ÙÒ ÓÒ Ö Ò ÕÙ × Ø Ò Ö Ð ÒÓ Ó ×ÓÐÙ ÓÒ¸ ÓÒ× Ö Ò Ó ÕÙ Ð Ö Ø Ö Ó Ö Ò Ò Ð ØÓÔÓÐÓ Ð Ö Ó Ý ×Ù Ò× º Ë Ð ÒÓ Ó ×ÓÐÙ ÓÒ × ÔÖ ×ÙÑ Ö ÒÓ¸ ÒØÓÒ × Ð Ö Ø Ö Ó ÑÔÐ ØÙ Ø Ò Ò ÓÒØÖ ÖÐÓ Ñ × Ö Ô Ó ÕÙ Ð ÔÖÓ ÙÒ º À Ý ÙÒ Ó × ÖÚ ÓÒ Ø ÖÑ Ò ÒØ Ô Ö Ð Ù×ÕÙ Ò ÑÔÐ ØÙ ÙÒ ÒÓ Ó Ô ÖØ ÙÐ Ö ×Ø ÓÒ ÖØ ØÙ Ò Ù ÒØÖ Ð Ñ ÒÓ Ñ × ÓÖØÓ Ò ÒØ Ö Ó׺ ÈÓÖ ÓרÙÑ Ö ¸ ÒÓ Ò Ö Ð ¸ × Ø Ò Ö Ð Þ Ö ÔÖ Ñ ÖÓ ÙÒ Ù×ÕÙ Ò ÔÖÓ ÙÒ¹ Ô Ö Ò ÓÒØÖ Ö ÙÒ ×ÓÐÙ ÓÒ Ó ÙÒ ÔÖÓÜ Ñ ÓÒ Ý¸ ÔÓר Ö ÓÖÑ ÒØ ¸ Ô Ö ¬Ò ÖÐ ¸ × Ö Ð Þ ÙÒ Ò ÑÔÐ ØÙ º 7.5.5 Prueba de ciclos ÈÐ ÒØ ÑÓ× Ð ÔÖÓ Ð Ñ Ø ÖÑ Ò Ö × Ü ×Ø Ó ÒÓ ÙÒ ÐÓ Ô ÖØ Ö ÙÒ ÒÓ Ó Ô ÖØ ÙÐ Ö src nodeº Ò ×Ø ×Ó¸ ÙÒ Ö Ø Ö Ó Ò ÔÖÓ ÙÒ Ô Ö ÔÖ Ö Ð Ð ÑÔÐ ØÙ ÔÓÖÕÙ ÒÓ ×Ø Ø ÑÔÓ Ò ×Ô Ó Ò ÐÓ× Ö Ó× Ô Ö Ð × ÕÙ ÙÒ ÒÓ ×ÓÒ ÔÖÓ × Ó׺ ÍÒ Ù×ÕÙ Ò ÔÖÓ ÙÒ Ô Ö Ð¸ × Ö¸ ÕÙ ÒÓ Ò × Ö Ñ ÒØ ÔÖ Ø Ò Ú × Ø Ö ØÓ Ó× ÐÓ× ÒÓ Ó׸ × ÖÚ Ô Ö Ø Ø Ö × Ü ×Ø ÙÒ ÐÓ Ô ÖØ Ö ÙÒ ÒÓ Óº Ä × ÜÔÐÓÖ Ö Ö ÙÖ× Ú Ñ ÒØ ר Ò ÓÒØÖ Ö Ð ÒÓ Ó Ô ÖØ ¸ Ò ÙÝÓ ×Ó Ð ÔÖÙ × ÔÓ× Ø Ú ¸ Ó ÙÐÑ Ò Ö Ð Ù×ÕÙ ¸ Ò ÙÝÓ ×Ó × Ò Ø Ú º ÆÙ ×ØÖ ÔÖÙ ÐÓ × ÔÓÝ ×Ó Ö Ð × Ù ÒØ ÖÙØ Ò Ö ÙÖ× Ú ½ Ù×ÕÙ ÐÓ ½ ≡ ½ template <class GT, class SA> inline static bool __test_cycle(GT & g, typename GT::Node * src_node, typename GT::Node * curr_node); test cycle() × Ù×Ó ÔÖ Ú Ó¸ Ö Ð Þ Ð ÜÔÐÓÖ ÓÒ Ö ÙÖ× Ú Ò ÔÖÓ ÙÒ ÔÓÖ Ð ÒÓ Ó curr node Ò Ù×ÕÙ Ð ÒÓ Ó src node Ý Ñ Ò ØÖ × Ô Ö Ñ ØÖÓ× ½º g Ð Ö Ó ×Ó Ö Ð Ù Ð × Ö Ð Þ Ð ÔÖÙ º ¾º src node Ð ÒÓ Ó Ô Ö Ð Ù Ð × Ú Ö ¬ × Ü ×Ø ÙÒ ÐÓº ¿º curr node × Ð ÒÓ Ó Ú × Ø Ð ÐÐ Ñ Ö ÙÖ× Ú º Ä ÖÙØ Ò Ö ØÓÖÒ true × × curr node × Ð ÒÞÓ Ð ÒÓ Ó Ò Ð src node Ò ×Ø ×Ó¸ Ü ×Ø ÙÒ ÐÓº Ë × Ö ÓÖÖ ÒØ Ö Ý Ö ÙÖ× Ú Ñ ÒØ Ð ÓÑÔÓÒ ÒØ ÓÒ Ø Ó curr node¸ ÒØÓÒ × ÔÓ ÑÓ× ÓÒ ÐÙ Ö ÕÙ Ô × Ò Ó ÔÓÖ curr node ÒÓ × ÔÓ× Ð Ð ÒÞ Ö src node Ý ÕÙ ÔÓÖ ÐÓ Ø ÒØÓ ÔÓÖ ×Ø Ú ÒÓ Ý ÐÓº Ò ×Ø ×Ó Ö ØÓÖÒ ÑÓ× falseº Ä ÒØ Ö Þ ÔÙ Ð × ÔÐ ÒØ Ý × ÒרÖÙÑ ÒØ Ð × Ù ÒØ ÓÖÑ ½ Ù×ÕÙ ÐÓ ½ +≡ ½ ½ template <class GT, class SA> inline bool test_for_cycle(GT & g, typename GT::Node * src_node) { g.reset_bit_nodes(Test_Cycle); // reiniciar bit Test_Cycle para los nodos g.reset_bit_arcs(Test_Cycle); // reiniciar bit Test_Cycle para los arcos // explorar recursivamente a trav´s de los arcos adyacentes a src_node e for (Node_Arc_Iterator<GT, SA> it(src_node); it.has_current(); it.next())
  • 644.
    618 Cap´ ıtulo 7. Grafos { typename GT::Arc * arc = it.get_current_arc(); if (IS_ARC_VISITED(arc, Test_Cycle)) continue; ARC_BITS(arc).set_bit(Test_Cycle, true); // pintar arco if (__test_cycle<GT,SA> (g, src_node, it.get_tgt_node())) // ¿ciclo por arc? return true; // s´ ==> retornar true y detener la exploraci´n ı o } // En este punto se han explorado todos los caminos desde src_node // sin encontrar de nuevo a src_node ==> no existe ciclo return false; } Í× × Node Arc Iterator º test for cycle() Ö ØÓÖÒ true × Ü ×Ø ÙÒ ÐÓ × src node false ÐÓ ÓÒ¹ ØÖ Ö Óº ÍÒ ÔÙÒØÓ × Ò Ð Ò ×Ø Ð ÓÖ ØÑÓ × ÕÙ ¸ ÖÒ ÐÓ ÕÙ ÔÐ ÒØ ÑÓ× Ò Ð × ×Ù ¹× ÓÒ × ÒØ Ö ÓÖ × ÓÒ ÖÒ ÒØ × Ð × Ù×Õ٠׸ ÒÓ ÑÓ× Ø Ò ÖÒÓ× Ù Ò Ó Ý ÑÓ× Ú × Ø Ó ØÓ Ó× ÐÓ× ÒÓ Ó׸ ÔÙ × Ð ÙÒ ÐÓ ÔÙ Ö Ò ÓÒØÖ Ö× ÔÓÖ Ð ÙÒ Ö Ó ÕÙ ÒÓ Ý × Ó Ú × Ø Óº ÆÓ Ø Ò ÑÓ× Ò ×Ø ×Ó ÓØÖ ÐØ ÖÒ Ø Ú ÕÙ ÜÔÐÓÖ Ö ØÓ Ó× ÐÓ× Ö Ó׸ Ö ÞÓÒ ÔÓÖ Ð Ù Ð Ð Ð ÓÖ ØÑÓ × O(E) Ô Ö Ð Ô ÓÖ ×Ó Ò ÕÙ ÒÓ Ü ×Ø ÐÓº Ó ÐÓ ÒØ Ö ÓÖ¸ ר ÑÓ× Ð ×ØÓ× Ô Ö ÑÔÐ ÒØ Ö Ð ÜÔÐÓÖ ÓÒ Ö ÙÖ× Ú ½ Ù×ÕÙ ÐÓ ½ +≡ ½ template <class GT, class SA> inline static bool __test_cycle(GT & g, typename GT::Node * src_node, typename GT::Node * curr_node) { if (src_node == curr_node) return true; // ciclo detectado! if (IS_NODE_VISITED(curr_node, Test_Cycle)) return false; NODE_BITS(curr_node).set_bit(Test_Cycle, true); // marque nodo // busque los caminos desde current_node a ver si llega a src_node for (Node_Arc_Iterator<GT, SA> it(curr_node); it.has_current(); it.next()) { typename GT::Arc * arc = it.get_current_arc(); if (IS_ARC_VISITED(arc, Test_Cycle)) continue; ARC_BITS(arc).set_bit(Test_Cycle, true); // marque arco if (__test_cycle<GT,SA>(g, src_node, it.get_tgt_node())) return true; // ciclo encontrado desde el arco actual } // En este punto se han explorado todos los caminos desde curr_node // sin encontrar src_node ==> no existe ciclo que pase por curr_node return false; } Í× × Node Arc Iterator º
  • 645.
    7.5. Recorridos sobregrafos 619 7.5.6 Prueba de aciclicidad ÍÒ Ö Ó × Ð Ó × ×Ø ÒÓ ÓÒØ Ò ÐÓ׺ ÓÑÓ ÑÙ Ó× Ð ÓÖ ØÑÓ× Ö ÕÙ Ö Ò Ú Ö ¬ Ö ×Ø ÓÒ ÓÒ ×Ó Ö Ð ÙÐÓ× Ö Ó× Ô Ö Ð ×¸ × ÑÔÓÖØ ÒØ ÕÙ ×Ø ÔÖÙ × Ö Ð ¬ ÒØ Ñ ÒØ º ÍÒ Ú Ö ÒØ Ð Ð ÓÖ ØÑÓ ÒØ Ö ÓÖ ÔÖÙ ÐÓ× ÔÙ ÙØ Ð Þ Ö× Ô Ö Ú Ö ¬ Ö Ð ×Ó Ö ÙÒ Ö Ó Ò ÓÒ ÜÓº ÈÓ ÑÓ× ÒÚÓ Ö test for cycle() Ô Ö ÒÓ Ó Ð Ö Ó Ý¸ × ØÓ × Ð × Ù ÓÒ × ÖÖÓ Ò ÓÑÓ Ö ×ÙÐØ Ó Ð×Ó¸ ÒØÓÒ × Ð Ö Ó × Ð Óº Ð ÔÖ Ò Ô Ó Ð ÔÖÙ Ð × ÕÙ × ÙÖ ÒØ Ð ÜÔÐÓÖ ÓÒ Ð Ö Ó¸ Ô × Ò Ó ÔÓÖ ÙÒ Ö Ó ÒÓ Ú × Ø Ó¸ Ú ÑÓ× ÙÒ ÒÓ Ó Ý Ú × Ø Ó¸ ÒØÓÒ × Ð Ö Ó Ø Ò ÙÒ ÐÓ ´ Ð ÕÙ Ô ÖÑ Ø Ö Ö × Ö Ð ÒÓ Ó Ú × Ø Ó ÔÓÖ ÙÒ Ñ ÒÓ Ö ÒØ µº Ò Ú ÖØÙ ×Ø Ó × ÖÚ ÓÒ ÔÓ ÑÓ× ÔÐ ÒØ Ö Ð × Ù ÒØ ÖÙØ Ò ¸ ÔÖ Ú ¸ Ö ÙÖ× Ú ¸ ÜÔÐÓÖ ÓÒ Ò ÔÖÓ ÙÒ ½ ÈÖÙ Ð ½ ≡ ¾¼ template <class GT, class SA> inline static bool __is_graph_acyclique(GT & g, typename GT::Node * curr_node) { if (IS_NODE_VISITED(curr_node, Is_Acyclique)) return false; NODE_BITS(curr_node).set_bit(Is_Acyclique, true); // marcar nodo for (Node_Arc_Iterator<GT, SA> i(curr_node); i.has_current(); i.next()) { typename GT::Arc * arc = i.get_current_arc(); if (IS_ARC_VISITED(arc, Is_Acyclique)) continue; ARC_BITS(arc).set_bit(Is_Acyclique, true); if (not __is_graph_acyclique<GT,SA>(g, i.get_tgt_node())) return false; } // todos los arcos recorridos sin encontrar ciclo ==> el grafo es // ac´clico pasando por curr_node ı return true; } Í× × Node Arc Iterator º is graph acyclique() Ö Ð Þ ÙÒ ÔÖÙ Ð Ô ÖØ Ö Ð ÒÓ Ó curr nodeº Ë Ö ØÓÖÒ true × Ý Ð false ÐÓ ÓÒØÖ Ö Óº Ä Ø Ò ÓÒ × Ö Ð Þ Ù Ò Ó × Ø Ø ÙÒ ÐÓ Ò ×Ø ×Ó is graph acyclique() Ö ØÓÖÒ falseº Ð ÕÙ ÒÓ × Ò Ù ÒØÖ ÐÓ ÔÓÖ Ð ÙÒ Ö Ó Ý ÒØ curr node ÒÓ ÑÔÐ ÕÙ ÒÓ Ü ×Ø Ð ÙÒÓ ÔÓÖ ÓØÖÓ ×Ù× Ö Ó׺ ËÓÐÓ Ù Ò Ó × Ý Ò ÜÔÐÓÖ Ó ØÓ¹ Ó× ÐÓ× Ö Ó× curr node × Ò Ò ÓÒØÖ Ö ÐÓ × ÕÙ ÔÓ ÑÓ× ÓÒ ÐÙ Ö ÕÙ Ô × Ò Ó ÔÓÖ curr node Ð Ö Ó × Ð Óº Ë ÙÒ ×Ù Ö Ó ÙÒ Ö Ó ÓÒ ÜÓ × Ð Ó¸ ÒØÓÒ ×¸ × Ò ÑÔÓÖØ Ö × Ù Ð ÒÓ Ó × Ò ¸ ÙÒ Ù×ÕÙ Ò ÔÖÓ ÙÒ Ø Ø Ö ÙÒ ÐÓ ÔÓÖ Ò Ù ÒØÖÓ ÙÒ ÒÓ Ó Ý Ñ Ö Óº Ë ×Ó ÒÓ Ó ÙÖÖ ¸ × Ö¸ × ÒÓ ÔÓ ÑÓ× Ö Ö × Ö Ð ÒÓ Ó ÓÖ Ò Ð Ù×ÕÙ ¸ ÒØÓÒ ×¸ ÓÒ ØÓ ÖØ ØÙ ¸ Ð ×Ù Ö Ó × Ð Óº Ë ×Ó ×Ù Ô Ö ØÓ Ó× ÐÓ× ÒÓ Ó× ÓÒ ÜÓ׸ ÒØÓÒ × Ð Ö Ó × Ð Óº À Ý ÙÒ Ó × ÖÚ ÓÒ ÖÙ Ð Ò Ð ×Ó ÙÒ Ö Ó ÓÒ ÜÓ ´ÒÓ ÙÒ Ö Ó¸ ÑÙÐØ Ö Ó
  • 646.
    620 Cap´ ıtulo 7. Grafos Ó ÑÙÐØ Ö Óµ × Ð ÒØ Ö Ó× × Ñ ÒÓÖ ÕÙ Ð ÒÓ Ó׸ ÒØÓÒ × Ð Ö Ó ÒÓ ÔÙ ÓÒØ Ò Ö Ò Ò ÙÒ ÐÓº ר Ó ÒÓ× ÓØ Ð ÔÖÙ Ð O(V)º Ä ÔÖÙ ÔÙ Ò Ö× × Ù ÐÕÙ Ö ÒÓ Ó Ý Ð × Ù ÒØ Ú Ö× ÓÒ ÔÙ Ð × Ô Ö Ø Ñ ÒØ ÔÐ Ð ¾¼ ÈÖÙ Ð ½ +≡ ½ ¾¼ template <class GT, class SA> inline bool is_graph_acyclique(GT & g, typename GT::Node * start_node) { if (g.get_num_arcs() >= g.get_num_nodes()) return false; g.reset_bit_arcs(Is_Acyclique); g.reset_bit_nodes(Is_Acyclique); return __is_graph_acyclique<GT,SA>(g, start_node); } is graph acyclique()Ö Ð Þ Ð ÜÔÐÓÖ ÓÒ Ö ÙÖ× Ú Ò ÔÖÓ ÙÒ start node × Ð ÒÓ Ó Ò Ó Ð ÔÖÙ ¸ Ð Ù Ð Ô ÖØ Ò Ö ÙÒ ÓÑÔÓÒ ÒØ Ö Ó ×Ó×Ô Ó×Ó Ø Ò Ö ÙÒ ÐÓº Ä ÙØ Ð Ð ÒØ Ö Þ ÒØ Ö ÓÖ × Ù Ò Ó start node Ý × Ó Ò Ó Ò Ð ÙÒ Ð ÙÐÓ Ý × Ö ÕÙ Ö Ú Ö ¬ Ö × Ð ÓÒ Ù× Ó ÒÓ ÙÒ ÐÓº ר ÖÙØ Ò ÙÒ ÓÒ Ô Ö Ù ÐÕÙ Ö Ö Ó ÓÒ ÜÓ ´× Ò ÑÔÓÖØ Ö Ð ÒÓ Ó Ò Óµ Ó Ô Ö Ú Ö¬ Ö Ð × ÙÒ ÒÓ Ó Ô ÖØ ÙÐ Ö start nodeº Ë ÒÓ × Ø Ò ÓÒÓ Ñ ÒØÓ Ö Ð ÓÒ Ø Ú Ð Ö Ó¸ ÒØÓÒ × × Ò × Ö Ó Ò×Ô ÓÒ Ö ÐÓ× Ú ÒØÙ Ð × ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× Ð Ö Ó Ù ×Ø ÓÒ ÕÙ × ÔÙ Ö Ð Þ Ö Ð × Ù ÒØ ÑÓ Ó ¾¼ ÈÖÙ Ð ½ +≡ ¾¼ template <class GT, class SA> inline bool is_graph_acyclique(GT & g) { if (g.get_num_arcs() >= g.get_num_nodes()) return false; g.reset_bit_arcs(Is_Acyclique); g.reset_bit_nodes(Is_Acyclique); for (Node_Iterator<GT> it(g); it.has_current(); it.next()) // recorrer nodos { typename GT::Node * current_node = it.get_current_node(); if (IS_NODE_VISITED(current_node, Is_Acyclique)) continue; if (not __is_graph_acyclique<GT,SA>(g, current_node)) return false; } return true; } Í× × Node Iterator º ×ÔÙ × Ð ÔÖ Ñ Ö ÐÐ Ñ is graph acyclique(g, curr node)¸ Ð ÙÒÓ× ÒÓ Ó× Ý ÕÙ Ò Ñ Ö Ó× ÓÒ Ð Ú ÐÓÖ Is Acyclique ×Ó Ö ×ØÓ× ÒÓ × Ö Ô Ø Ö Ð ÔÖÙ Ð º ÈÙ ×ØÓ ÕÙ is graph acyclique() Ø Ø ÐÓ Ú Ö ¬ Ò Ó × ÙÒ ÒÓ Ó × Ó Ó ÒÓ Ú × Ø Ó¸ ר ÒÓ ÓÔ Ö Ô Ö Ö Ó׺ Ë Ø Ò ÑÓ× ÙÒ Ö Ó¸ ÒØÓÒ × ÔÓ ÑÓ× ÐÐ Ñ Ö test for cycle() Ô Ö ÒÓ Ó
  • 647.
    7.5. Recorridos sobregrafos 621 Ð Ö Óº Ë Ò ÓÒØÖ ÑÓ× ÙÒ ÐÓ ÒÓ× Ø Ò ÑÓ× Ý × ÑÓ× ÕÙ Ð Ö Ó ÒÓ × Ð Óº Ë ÔÖÓ ÑÓ× Ô Ö ØÓ Ó× ÐÓ× ÒÓ Ó׸ ÒØÓÒ × ÔÓ ÑÓ× ÓÒ ÐÙ Ö ÕÙ Ð Ö Ó × Ð Óº ר Ø Ò ÖÖ ÙÒ Óר O(V × E)º Ò Ü º º ´Ô Ò µ × ÖÖÓÐÐ Ö ÑÓ× ÙÒ Ø Ò ÕÙ Ø ÖÑ Ò Ð Ð Ò O(V + E)º 7.5.7 B´squeda de caminos por profundidad u Ä Ù×ÕÙ Ñ ÒÓ× × ÕÙ Þ Ð ÔÖÓ Ð Ñ Ñ × ÓÑÙÒ Ý Ö Ø Ó ÐÓ× Ö Ó׺ À Ý Ú Ö× × Ú Ö ÒØ ׸ ÒØÖ Ð Ù Ð × Ø Ò ÑÓ× ½º Ü ×Ø Ò Ó× Ó× ÒÓ Ó׸ Ü ×Ø ÙÒ Ñ ÒÓ ÒØÖ ÐÐÓ× ¾º Ø ÖÑ Ò ÓÒ ÙÒ Ñ ÒÓ Ò ÓÒØÖ Ö ÙÒ Ñ ÒÓ ÙÒ ÒÓ Ó ÓÖ Ò ÙÒÓ ×Ø ÒÓº ¿º Ñ ÒÓ Ñ Ò ÑÓ Ø ÖÑ Ò Ö Ð Ñ ÒÓ Ñ ÒÓÖ Óר ÒØÖ Ó× ÒÓ Ó׺ º Ñ ÒÓ ÙÐ Ö ÒÓ ÙÒ Ñ ÒÓ ÙÐ Ö ÒÓ Ó¸ × ÑÔÐ Ñ ÒØ ¸ ÙÒ ÙÐ Ö ÒÓ ¸ × ÙÒ Ñ ÒÓ ÕÙ Ô × ÔÓÖ ØÓ Ó× ÐÓ× Ö Ó× × Ò Ö Ô Ø Ö Ò Ò ÙÒÓ ÐÐÓ׺ ÕÙ Ø Ò ÑÓ׸ Ø Ñ Ò¸ Ú Ö× ×Ø Ò ÓÒ × Ð Ü ×Ø Ò ¸ Ð Ø ÖÑ Ò ÓÒ ÙÒ ÙÐ Ö ÒÓ Ý Ð Ù×ÕÙ ÙÒÓ Óר Ñ Ò ÑÓº º Ñ ÒÓ Ñ ÐØÓÒ ÒÓ ÙÒ Ñ ÒÓ Ñ ÐØÓÒ ÒÓ Ó¸ × ÑÔÐ Ñ ÒØ ¸ ÙÒ Ñ ÐØÓÒ ÒÓ ¸ × ÙÒ Ñ ÒÓ ÕÙ Ô × ÔÓÖ ØÓ Ó× ÐÓ× ÒÓ Ó× × Ö Ô Ø Ö Ò Ò ÙÒÓ ÐÐÓ׺ Ò ×Ø ×Ù ¹× ÓÒ ×ÓÐÓ × ÖÖÓÐÐ Ö ÑÓ× ÔÖÙ Ü ×Ø Ò Ý Ø ÖÑ Ò ÓÒ Ñ ÒÓ׺ Ò Ð × ÓÒ Ü º ´Ô Ò ½¼µ ×ØÙ Ö ÑÓ× Ú Ö Ó× Ð ÓÖ ØÑÓ× Ô Ö Ø ÖÑ Ò Ö Ð Ñ ÒÓ Óר Ñ Ò ÑÓº 7.5.7.1 Prueba de existencia Ó ÙÒ Ô Ö ÒÓ Ó× ÓÑÓ Ø ÖÑ Ò Ö × Ü ×Ø ÙÒ Ñ ÒÓ ÒØÖ ÐÐÓ× ÄÐ Ñ ÑÓ× test for path() Ð ÖÙØ Ò Ö ÙÖ× Ú ¸ ÕÙ ÜÔÐÓÖ Ò ÔÖÓ ÙÒ Ð Ö Ó¸ Ò Ù×ÕÙ ÙÒ ÒÓ Ó ¬Ò Ñ ÒÓ end node Ý ÙÝÓ ÔÖÓØÓØ ÔÓ × ÒÙÒ ÓÒØ ÒÙ ÓÒ ¾½ ÈÖÙ Ñ ÒÓ ¾½ ≡ ¾¾ template <class GT, class SA> inline static bool __test_for_path(GT& g, typename GT::Node * curr_node, // nodo procedencia typename GT::Node * end_node); // arco destino g × Ð Ö Óº curr node × Ð ÒÓ Ó ØÙ Ð ÕÙ × ×Ø Ú × Ø Ò Ó Ý end node × Ð ÒÓ Ó ×Ø ÒÓ Ð Ñ ÒÓº Ë × Ò Ù ÒØÖ end node¸ ÒØÓÒ × Ü ×Ø Ð Ñ ÒÓ Ô × Ò Ó ÔÓÖ curr node Ý Ð ÖÙØ Ò Ö ØÓÖÒ trueº Ë × ÜÔÐÓÖ Ò ØÓ × Ð × Ú × ÔÓÖ curr node × Ò Ò ÓÒØÖ Ö end node¸ ÒØÓÒ × × ÓÒ ÐÙÝ ÕÙ Ô × Ò Ó ÔÓÖ curr node ÒÓ Ü ×Ø Ñ ÒÓ end node Ý Ð ÖÙØ Ò Ö ØÓÖÒ falseº È Ö ×Ø ÔÖÓ Ð Ñ ¸ Ð ÓÒÓ Ñ ÒØÓ ÕÙ Ø Ò ÑÓ× ×Ó Ö Ð ÓÒ Ø Ú Ð Ö Ó ÒÓ× ÝÙ ÙÒ ÔÓ Óº Ð Ö Ó ÔÙ × Ö Ò ÓÒ ÜÓ Ý ÙÒ × Ü ×Ø Ö Ñ ÒÓ ÒØÖ ÐÓ× ÒÓ Ó× ÓÒ× Ö Ó׺ × Ð × Ó× ×¸ Ò ×Ø × ØÙ ÓÒ ÒÓ Ø Ò ÑÓ× Ñ × ÐØ ÖÒ Ø Ú ÕÙ ÜÔÐÓÖ Ö Ð
  • 648.
    622 Cap´ ıtulo 7. Grafos Ö Óº È ÖÓ × Ð Ö Ó × ÓÒ ÜÓ ´Ý ÒÓ × Ö Óµ¸ ÒØÓÒ × ÓÒ ÖØ ØÙ Ü ×Ø ÙÒ Ñ ÒÓ ÒØÖ Ù ÐÕÙ Ö ×Ù× ÒÓ Ó× Ý ÒÓ Ö ÕÙ Ö ÑÓ× ÜÔÐÓÖ ÖÐÓº Î ÑÓ× ÓÖ ÓÑÓ × ÔÐ Ð ÖÙØ Ò ÒØ Ö ÓÖ Ô Ö Ð ÔÖÙ Ü ×Ø Ò Ñ ÒÓ ÒØÖ ÙÒ ÒÓ Ó Ò Ð start node Ý ÓØÖÓ ¬Ò Ð end node ¾¾ ÈÖÙ Ñ ÒÓ ¾½ +≡ ¾½ ¾¾ template <class GT, class SA> inline bool test_for_path(GT& g, typename GT::Node * start_node, typename GT::Node * end_node) { // si el grafo es conexo ==> existe camino if (not g.is_digraph() and g.get_num_arcs() >= g.get_num_nodes()) return true; g.reset_bit_nodes(Test_Path); // reiniciar bit Test_Path para nodos y arcos g.reset_bit_arcs(Test_Path); // buscar recursivamente caminos por arcos adyacentes a start_node for (Node_Arc_Iterator<GT, SA> i(start_node); i.has_current(); i.next()) { typename GT::Arc * arc = i.get_current_arc(); ARC_BITS(arc).set_bit(Test_Path, true); // marcar arco if (__test_for_path<GT, SA>(g, i.get_tgt_node(), end_node)) return true; } // todos los arcos de start_node han sido explorados sin encontrar un // camino hasta end_node ==> no existe camino return false; } Í× × Node Arc Iterator º test for path() Ö ØÓÖÒ true × Ü ×Ø ÙÒ Ñ ÒÓ ÒØÖ start node Ý end node false ÐÓ ÓÒØÖ Ö Óº Ä ÔÖÙ Ñ ÒÓ Ô Ö Ð × Ö¸ Ø ÖÑ Ò Ö × Ý ÙÒ Ñ ÒÓ × ÙÒ ÒÓ Ó ÒØ ÖÑ Ó curr node ר ÙÒÓ ¬Ò Ð end node × ÑÔÐ Ñ ÒØ × ÙÒ Ð Ô ØÖÓÒ Ù×ÕÙ Ò ÔÖÓ ÙÒ ¾¾ ÈÖÙ Ñ ÒÓ ¾½ +≡ ¾¾ template <class GT, class SA> inline static bool __test_for_path(GT & g, typename GT::Node * curr_node, // nodo procedencia typename GT::Node * end_node) // arco destino { if (curr_node == end_node) return true; // se alcanz´ a end_node o if (IS_NODE_VISITED(curr_node, Test_Path)) // ¿Ya se visit´ curr_node? o return false; // s´, no explore ı NODE_BITS(curr_node).set_bit(Test_Path, true); // pintar curr_node // buscar recursivamente a trav´s de arcos de curr_node e for (Node_Arc_Iterator<GT, SA> i(curr_node); i.has_current(); i.next()) { typename GT::Arc * arc = i.get_current_arc(); if (IS_ARC_VISITED(arc, Test_Path)) continue; ARC_BITS(arc).set_bit(Test_Path, true); // pintar arco if (__test_for_path<GT, SA>(g, i.get_tgt_node(), end_node))
  • 649.
    7.5. Recorridos sobregrafos 623 return true; } // todos los arcos adyacente de curr_node fueron explorados sin // encontrar a end_node ==> no existe camino pasando por curr_node return false; } Í× × Node Arc Iterator º Ç × ÖÚ ÑÓ× ÕÙ ¸ Ò ØÖ Ñ ÒØÓ Ð ¬ Ò ¸ ØÖ Ú × test for path() ÔÓ ¹ ÑÓ× Ò ÓÒØÖ Ö ÐÓ× Ó Ð ÞÓ׺ Ð Ø ÑÔÓ Ù ÓÒ test for path() ׸ Ò Ð Ô ÓÖ ×Ó¸ ÔÖÓÔÓÖ ÓÒ Ð Ð ÒØ Ö Ó׸ ÔÙ × ×Ø ÒÓ Ø Ö Ö Ñ × E Ú ×º test for path() ׸ ÔÓÖ Ø ÒØÓ¸ O(E)º ÓÒ Ð Ö ÔÖ × ÒØ ÓÒ Ñ ØÖ и Ü ×Ø ÙÒ Ñ Ò Ö Ð ÙÐ Ö Ð × Ö Ð ÓÒ × ÓÒ ¹ ØÚ ÒØÖ ØÓ Ó× ÐÓ× ÒÓ Ó× ÙÒ Ö Óº Ì Ð Ö Ð ÓÒ × ÐÐ Ñ Ð Ù×ÙÖ ØÖ Ò× Ø Ú Ý × Ð ÙÐ Ñ ÒØ ÙÒ Ð ÓÖ ØÑÓ ÐÐ Ñ Ó Ï Ö× ÐÐ ÕÙ × Ö ÔÖ × ÒØ Ó Ò Ü º º ´Ô Ò ½µº 7.5.7.2 B´ squeda de camino entre dos nodos u Ò ÓØÖ × Ó × ÓÒ ×¸ ÓÒ ÓÒ ÔÓÖ ×ÙÔÙ ×ØÓ ×Ù Ü ×Ø Ò ¸ ÐÓ ÕÙ × × × Ò ÓÒØÖ Ö Ý ÓÒרÖÙ Ö ÙÒ Ñ ÒÓ Ù ÐÕÙ Ö ÒØÖ Ó× ÒÓ Ó׺ È Ö ÐÐÓ¸ × Ò Ö ÑÓ× ÙÒ ÔÖ Ñ Ø Ú ¸ ÑÙÝ × Ñ Ð Ö Ð Ð ×Ù ¹× ÓÒ ÒØ Ö ÓÖ¸ ÙÝÓ ¬Ò × Ó Ø Ò Ö ÙÒ Ó ØÓ Ø ÔÓ Path ÓÒØ ÒØ ÚÓ ÙÒ Ñ ÒÓ ÒØÖ Ó× ÒÓ Ó× Ý ÓÒ Ð ÒØ Ö Þ × Ù ÒØ ¾¿ Ñ ÒÓ Ö Ó ¼¾ +≡ ¼¾ ¾¿ template <class GT, class SA> inline bool find_path_depth_first(GT& g, typename GT::Node * start_node, typename GT::Node * end_node, Path<GT> & path); Í× × Path ¼¾ º find path depth first() Ò Ù ÒØÖ Ý ÓÒרÖÙÝ ¸ Ñ ÒØ ÙÒ Ù×ÕÙ Ò ÔÖÓ ÙÒ ¸ ÙÒ Ñ ÒÓ ÒØÖ start node Ý end node Ð Ö Ó× gº Ð Ñ ÒÓ Ö ×ÙÐØ ÒØ × Ù Ö Ò Ð Ô Ö Ñ ØÖÓ pathº Ä ÖÙØ Ò Ö ØÓÖÒ true × ¸ Ò ØÓ¸ × ÐÓ Ö Ò ÓÒØÖ Ö ÙÒ Ñ ÒÓ false ÐÓ ÓÒØÖ Ö Ó¸ Ò ÙÝÓ ×Ó Ð Ú ÐÓÖ path ÓÒ× Ö Ö× Ò Ø ÖÑ Ò Óº Ä ÙÒ ÓÒ ÓÒØ ÑÔÐ ÐÓ× × Ù ÒØ × Ô Ö Ñ ØÖÓ× Ø ÔÓ ½º GT Ð Ø ÔÓ Ö Óº ¾º SA Ð ¬ÐØÖÓ Ð Ø Ö ÓÖ Ö Ó׺ ÅÙ Ó× Ð ÓÖ ØÑÓ× Ö ÕÙ Ö Ò Ù× Ö Ñ ÒÓ× ÒØÖ Ô Ö × ÒÓ Ó׺ ÈÓÖ ×Ó¸ ÔÙ × Ö ÙØ Ð Ô Ö Ñ ØÖ Þ Ö Ð Ñ ØÓ Ó find path depth first() Ó × ¸ ÕÙ ×Ø × Ô × Ó ÓÑÓ Ô Ö Ñ ØÖÓ ÙÒ Ñ ØÓ Óº × Ð Ð Ò Ù C¸ Ð Ñ Ó ØÖ ÓÒ Ð Ô Ö ×ØÓ × ÙÒ ÔÙÒ¹ Ø ÖÓ ÙÒ ÓÒ¸ Ô ÖÓ Ð ×Ø Ò Ö C++ ÒÓ Ô ÖÑ Ø ÔÙÒØ ÖÓ× ÙÒ ÓÒ × ÔÐ ÒØ ÐР׺ È Ö ÓÒØÓÖÒ Ö ×Ø × ØÙ ÓÒ¸ Ý Ð Ú Þ ÖÐ ÙÒ ×Ø ÐÓ Ñ × ÐÓ× Ó ØÓ׸ ÜÔÓÖØ Ö ÑÓ× find path depth first() Ó Ð ÒÓÑ Ö ÙÒ Ð × ¾¿ Ñ ÒÓ Ö Ó ¼¾ +≡ ¾¿ ¾ template <class GT, class SA = Default_Show_Arc<GT> > class Find_Path_Depth_First {
  • 650.
    624 Cap´ ıtulo 7. Grafos bool operator () (GT & g, typename GT::Node * start_node, typename GT::Node * end_node, Path<GT> & path) const { return find_path_depth_first<GT, SA> (g, start_node, end_node, path); } }; Í× × Path ¼¾ º find path depth first() × Ð ÒØ Ö Þ ÔÙ Ð ¸ Ð Ù Ð × ÔÓÝ ×Ó Ö Ð ÖÙØ Ò × ¹ Ù ÒØ ¸ ÕÙ × Ð ÕÙ Ö Ð Þ Ð ÜÔÐÓÖ ÓÒ Ö ÙÖ× Ú Ò ÔÖÓ ÙÒ ¾ Ñ ÒÓ Ö Ó ¼¾ +≡ ¾¿ ¾ template <class GT, class SA> inline bool __find_path_depth_first(GT& g, typename GT::Node * curr_node, // nodo actual typename GT::Arc * curr_arc, // arco procedencia typename GT::Node * end_node, // nodo destino Path<GT> & curr_path) // camino actual { if (curr_node == end_node) // ¿se alcanz´ nodo final? o { // s´, terminar a~adir el arco y terminar ı n curr_path.append(curr_arc); return true; } if (IS_NODE_VISITED(curr_node, Find_Path)) // ¿No ha sido visitado? return false; // s´ ==> desde el no hay camino ı ´ curr_path.append(curr_arc); // a~adir curr_arc al camino n NODE_BITS(curr_node).set_bit(Find_Path, true); // buscar recursivamente a trav´s de arcos de curr_node e for (Node_Arc_Iterator<GT, SA> i(curr_node); i.has_current(); i.next()) { typename GT::Arc * next_arc = i.get_current_arc(); if (IS_ARC_VISITED(next_arc, Find_Path)) continue; ARC_BITS(next_arc).set_bit(Find_Path, true); // marcar arco typename GT::Node * next_node = i.get_tgt_node(); // continuamos exploraci´n en profundidad desde next_node o if (__find_path_depth_first<GT, SA> (g, next_node, next_arc, end_node, curr_path)) return true; // se encontr´ camino, terminar retornando true o } curr_path.remove_last_node(); return false; } Í× × Node Arc Iterator Ò Path ¼¾ º Ä ×ØÖÙ ØÙÖ × Ð Ñ ×Ñ ÕÙ Ð Ð × Ö ÒØ × ÜÔÐÓÖ ÓÒ × Ò ÔÖÓ ÙÒ ÕÙ ÑÓ× ÔÖ × ÒØ Óº Ä Ö Ò ×ØÖ Ò ÕÙ ÒØ × Ú × Ø Ö Ö ÙÖ× Ú Ñ ÒØ ÐÓ× Ö Ó× curr node¸ ÐÓ Ò ÑÓ× Ð Ñ ÒÓº Ë Ö ÓÖÖ ÑÓ× ØÓ Ó× ÐÓ× Ö Ó× curr node × Ò Ò ÓÒØÖ Ö ÙÒ Ñ ÒÓ end node¸ ÒØÓÒ × × ÑÓ× curr node Ð Ñ ÒÓº Ð Ò ÓÐ Ö ÙÖ× Ú Ð Ð ÓÖ ØÑÓ¸ path ÙÒ ÓÑÓ Ô Ð º ÈÓÖ Ø ÒØÓ¸ Ð Ñ Ü ÑÓ Ø Ñ ÒÓ
  • 651.
    7.5. Recorridos sobregrafos 625 path ÔÓ Ö Ð ÒÞ Ö O(E)º find path depth first() Ö ØÓÖÒ true × ×ÐÓ Ö ÓÒרÖÙ Ö ÙÒ Ñ ÒÓ ¹ end node ÔÖÓÚ Ò Ò Ó × current nodeº À ÝÓ× Ô Ö Ñ ØÖÓ× ÓÒ Ð × Ö ×Ô ØÓ test for path() Ð Ö Ó ØÙ Ð current arc Ý Ð Ñ ÒÓ pathº path × ÙÒ Ô Ö Ñ ØÖÓ × Ð ÕÙ ÓÒØ Ò Ð Ú ÐÓÖ Ð Ñ ÒÓ Ò ÓÒØÖ Óº current arc × ÙÒ Ö Ó ÙÝÓ ÒÓ Ó ÓÖ Ò × current node ÕÙ × Ö ÕÙ Ö ÔÓÖÕÙ Ò Ð Ð × Path × Ò× ÖØ ÔÓÖ Ö Ó× Ý ÒÓ ÔÓÖ ÒÓ Ó׺ ÆÓ× Ö ×Ø ÑÔÐ ÒØ Ö Ð ÔÖ Ñ Ø Ú ÔÙ Ð ¾ Ñ ÒÓ Ö Ó ¼¾ +≡ ¾ template <class GT, class SA> inline bool find_path_depth_first(GT & g, typename GT::Node * start_node, typename GT::Node * end_node, Path<GT> & path) { path.clear_path(); // limpiamos path path.init(start_node); // insertamos nodo origen g.reset_bit_nodes(Find_Path); g.reset_bit_arcs(Find_Path); NODE_BITS(start_node).set_bit(Find_Path, true); // marcar start_node visitado // explorar recursivamente cada arco de start_node for (Node_Arc_Iterator<GT, SA> i(start_node); i.has_current(); i.next()) { typename GT::Arc * arc = i.get_current_arc(); ARC_BITS(arc).set_bit(Find_Path, true); typename GT::Node * next_node = i.get_tgt_node(); if (IS_NODE_VISITED(next_node, Find_Path)) continue; if (__find_path_depth_first<GT, SA>(g, next_node, arc, end_node, path)) return true; } return false; } Í× × Node Arc Iterator Ò Path ¼¾ º Ù Ò Ó × × ÓÒרÖÙ Ö ´Ó Ø ÖÑ Ò Ö Ü ×Ø Ò µ ÙÒ Ñ ÒÓ Ù ÐÕÙ Ö ÒØÖ Ó× ÒÓ Ó׸ × ÔÖ Ö Ð Ú Ð Ö× ¸ Ò ÙÒ ÔÖ Ñ Ö Òר Ò ¸ ÙÒ ÜÔÐÓÖ ÓÒ Ò ÔÖÓ ÙÒ º ÄÙ Ó¸ × × Ö ÕÙ Ö ÙÒÓ Ñ × ÓÖØÓ Ò Ö Ó׸ Ó ÕÙ ÓÒ×ÙÑ Ñ ÒÓ× Ñ ÑÓÖ ¸ ÒØÓÒ × ÔÙ Ö× ÔÓÖ ÑÔÐ ØÙ º ÇØÖ × ØÙ ÓÒ Ò Ð Ù Ð × ¬Ò Ø Ú Ñ ÒØ ÔÖ Ö Ð Ð ÜÔÐÓÖ ÓÒ Ò ÔÖÓ ÙÒ × Ù Ò Ó × Ù×ÕÙ ÙÒ Ñ ÒÓ ×Ó Ö ÙÒ Ö Ó Ð Ó Ó ÙÒ Ö Óк 7.5.8 B´squeda de caminos por amplitud u Ð ¬Ò ר ×Ù ¹× ÓÒ × ÓÒרÖÙ Ö ÙÒ Ñ ÒÓ ÔÓÖ ÑÔÐ ØÙ ÒØÖ Ó× ÒÓ Ó× start Ý endº Ð ÓÑ ÒÞ Ö ÔÓÖ start¸ ÜÔÐÓÖ ÑÓ× Ý ÑÔ Ð ÑÓ× ØÓ Ó× ×Ù× Ö Ó× Ò Ù×ÕÙ endº Ë ÒÓ ÑÓ× ÐÐ Ó end¸ ÒØÓÒ × ÓÒØ ÒÙ ÑÓ× ÔÓÖ ØÓ Ó× ÐÓ× Ñ ÒÓ× ÐÓÒ ØÙ Ó׺ ר ÔÖÓ ×Ó ÓÒØ ÒÙ ×Ø Ò ÓÒØÖ Ö Ð Ñ ÒÓ Ò Ù ×Ø ÓÒº È Ö Ö Ð Þ Ö Ð ×ØÖ Ø ÒØ Ö ÓÖ¸ Ð ÓÐ Ù Ö Ö Ñ ÒÓ× Ô Ö Ð × × Ð ÒÓ Ó Ò Ó ×Ø Ð Ð ÙÐØ ÑÓ Ò Ú Ð ÕÙ × Ý ÜÔÐÓÖ Ó ÐÓ ÕÙ × ×Ô ¬ Ð
  • 652.
    626 Cap´ ıtulo 7. Grafos × Ù ÒØ ÑÓ Ó ¾ Ð Ö ÓÒ ÓÐ Ñ ÒÓ× ¾ ≡ ´¾µ DynListQueue<Path<GT>*> q; // cola de caminos parciales Í× × DynListQueue ½ ¼ Ò Path ¼¾ º ÆÓØ × ÕÙ × ÙÒ ÓÐ ÔÙÒØ ÖÓ× Ñ ÒÓ׸ ÐÓ ÕÙ ÑÔÐ ÕÙ Ð Ñ ÑÓÖ ×ØÓ× Ô ÖØ Ö× Ý¸ ×Ó Ö ØÓ Ó¸ Ù Ò Ó × Ú Ð ÓÐ ¸ Ð Ö Ö× º ÓÑÓ × ØÖ Ø ÔÙÒØ ÖÓ× Path* Ð ×ØÖÙ ØÓÖ Ð ÓÐ ÒÓ Ð Ö Ö Ð Ñ ÑÓÖ Ó ÙÔ ÔÓÖ ÐÓ× Ñ ÒÓ׸ ÐÓ ÕÙ Ö ÕÙ Ö Ð × Ù ÒØ ÓÒ ÜÔÐ Ø Ô Ö Ð Ö Ö Ð ÓÐ ¾ Ú Ö ÓÐ Ý Ð Ö Ö Ñ ÒÓ× ¾ ≡ ´¾µ while (not q.is_empty()) delete q.get(); ר ÓÒ Ö× Ð ¬Ò Ð Ð ÔÖÓ Ñ ÒØÓ Ð Ù×ÕÙ ¸ × Ý Ò ÓÒØÖ Ó Ó ÒÓ ÙÒ Ñ ÒÓ¸ Ó × Ó ÙÖÖ ÙÒ Ü Ô ÓÒº ÈÖ Ñ Ò Ö Ð Ñ ÒÓ ØÙ Ð ÜÔÐÓÖ ÓÒ¸ Ñ Ò Ö ÑÓ× Ð × Ù ÒØ Ú Ö Ð ¾ ÐÖ ÓÒ Ñ ÒÓ ØÙ Ð ¾ ≡ ´¾µ Path<GT> * path_ptr = NULL; Í× × Path ¼¾ º Ä Ò× Ö ÓÒ Ò Ð ÓÐ Ö ÕÙ Ö ´½µ Ô ÖØ Ö Ñ ÑÓÖ Ô Ö Ð Ñ ÒÓ Ý ´¾µ Ð ÔÖÓÔ ÓÒ Ò× ÖØ Ö Ò Ð ÓÐ º ÈÙ ×ØÓ ÕÙ Ý Ñ Ò Ó Ñ ÑÓÖ Ò Ñ × ÓÔ Ö ÓÒ ×¸ Ù× Ö ÑÓ× ÙÒ ÖÙØ Ò ÓÒ ÙØÓ¹ÔÙÒØ ÖÓ× ¾ Ê ÓÖÖ Ó Ò ÑÔÐ ØÙ ½ +≡ ½ ¾ template <class GT> inline static void __insert_in_queue(GT & g, DynListQueue<Path<GT> *> & q, typename GT::Node * node, typename GT::Arc * arc, Path<GT> * path_ptr = NULL) { auto_ptr<Path<GT> > path_auto; if (path_ptr == NULL) path_auto = auto_ptr<Path<GT> >(new Path<GT>(g, node)); // camino desde node else path_auto = auto_ptr<Path<GT> >(new Path<GT>(*path_ptr)); // copia de *path_ptr path_auto->append(arc); // a~adir el nuevo arco n q.put(path_auto.get()); // insertar el nuevo camino en cola path_auto.release(); } Í× × DynListQueue ½ ¼ Ò Path ¼¾ º insert in queue() Ö ÙÒ ÒÙ ÚÓ Ñ ÒÓ ÓÒ Ð Ö Ó Ò Ó arc Ý ÐÓ Ò ÓÐ Ò Ð ÓÐ qº Ä ÖÙØ Ò Ñ Ò ÙÒ Ú Ö Ð Path ÐÐ Ñ path auto¸ Р٠и × ÙÒ Ð Ú ÐÓÖ path ptr¸ × ÔÖÓ × Ó× ÔÓ× Ð × ÓÖÑ × ½º Ë path ptr == NULL ÒØÓÒ × path auto × ÙÒ ÒÙ ÚÓ Ñ ÒÓ ÓÒ ÒÓ Ó Ò¹ Ó nodeº ¾º Ë path ptr != NULL ÒØÓÒ × Ð Ñ ÒÓ ÓÒØ Ò Ó Ò *path ptr × ÓÔ path autoº
  • 653.
    7.5. Recorridos sobregrafos 627 Ò Ù ÐÕÙ Ö ÐÓ× Ó× ×Ó׸ Ð Ö Ó arc × Ð Ò path auto Ý ×Ø × Ò× ÖØ Ò Ð ÓÐ º ÓÒ ÐÓ ÒØ Ö ÓÖ¸ ÔÓ ÑÓ× × Ò Ö Ð × Ù ÒØ Ù×ÕÙ Ñ ÒÓ Ò ÑÔÐ ØÙ ¾ Ê ÓÖÖ Ó Ò ÑÔÐ ØÙ ½ +≡ ¾ ¾ template <class GT, class SA> inline bool find_path_breadth_first(GT& g, typename GT::Node * start, typename GT::Node * end, Path<GT> & path) { path.clear_path(); // limpiamos cualquier cosa que est´ en path e g.reset_bit_nodes(Find_Path); g.reset_bit_arcs(Find_Path); Ð Ö ÓÒ ÓÐ Ñ ÒÓ× ¾ Ð Ö ÓÒ Ñ ÒÓ ØÙ Ð ¾ // insertar los caminos parciales con nodo inicio start for (Node_Arc_Iterator<GT, SA> i(start); i.has_current(); i.next()) __insert_in_queue<GT>(g, q, start, i.get_current_arc()); NODE_BITS(start).set_bit(Find_Path, true); // m´rquelo visitado a while (not q.is_empty()) // repetir mientras haya arcos sin visitar { path_ptr = q.get(); // extraiga camino actual typename GT::Arc * arc = path_ptr->get_last_arc(); ARC_BITS(arc).set_bit(Find_Path, true); // marcar arco typename GT::Node * tgt = path_ptr->get_last_node(); if (IS_NODE_VISITED(tgt, Find_Path)) // ¿visit´ ´ltimo nodo de camino? o u { // s´ ==> el camino no conduce al nodo end ==> borrar camino ı delete path_ptr; continue; } if (tgt == end) // ¿se encontr´ un camino? o { // s´ ==> path_ptr contiene el camino buscado ı path.swap(*path_ptr); // copiar resultado al par´metro path a Ú Ö ÓÐ Ý Ð Ö Ö Ñ ÒÓ× ¾ return true; } NODE_BITS(tgt).set_bit(Find_Path, true); // marcar ultimo nodo camino ´ // insertar en cola arcos del nodo reci´n visitado e for (Node_Arc_Iterator<GT, SA> i(tgt); i.has_current(); i.next()) { typename GT::Arc * curr_arc = i.get_current_arc(); if (IS_ARC_VISITED(curr_arc, Find_Path)) // ¿se visit´ arco? o continue; // s´ ==> avanzar al siguiente (ya fue visto) ı // revise nodos del arco para ver si han sido visitados if (IS_NODE_VISITED(g.get_src_node(curr_arc), Find_Path) and IS_NODE_VISITED(g.get_tgt_node(curr_arc), Find_Path)) continue; // nodos ya visitados ==> no vale la pena meter arco __insert_in_queue<GT>(g, q, NULL, curr_arc, path_ptr); } delete path_ptr; // borrar camino extra´do de la cola ı } // fin while (not q.is_empty())
  • 654.
    628 Cap´ ıtulo 7. Grafos Ú Ö ÓÐ Ý Ð Ö Ö Ñ ÒÓ× ¾ return false; } Í× × Node Arc Iterator Ò Path ¼¾ º Ë ÔÖ ×Ø Ö ÑÙ Ø Ò ÓÒ Ð Ö Ö ÐÓ× Ñ ÒÓ× ÕÙ × Ò Ú ×ØÓ× Ý × Ó× Ò × ÔÓÖÕÙ Ð ÒÓ Ó Ý Ý × Ó Ú × Ø Ó¸ Ó Ò × ÔÓÖÕÙ path ptr Ý Ý × Ó ÓÔ Óº ÓÑÓ × ÔÖ Ö¸ find path breadth first() ÓÒ×ÙÑ ÑÙ Ñ × Ñ ÑÓÖ ÕÙ ×Ù ÓÒØÖ Ô ÖØ Ò ÔÖÓ ÙÒ º Ô ÖØ ÕÙ Ð ÓÐ Ø Ò Ö Ö Ñ × ÕÙ ÙÒ Ô Ð ¸ Ù Ð × Ð ×Ó Ò Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ ¸ Ð ÓÐ Ù Ö Ñ ÒÓ× ÒØ ÖÓ× × Ð ÒÓ Ó Ò Óº Ð Ù Ð ÕÙ Ô Ö find path depth first()¸ find path breadth first() Ø Ñ Ò ÔÙ ÒÚÓ Ö× Ñ ÒØ ÙÒ Òר Ò ×Ô Ð Ð × ¾ Ê ÓÖÖ Ó Ò ÑÔÐ ØÙ ½ +≡ ¾ template <class GT, class SA = Default_Show_Arc<GT> > class Find_Path_Breadth_First { bool operator () (GT & g, typename GT::Node * start, typename GT::Node * end, Path<GT> & path) const { return find_path_breadth_first <GT, SA> (g, start, end, path); } }; Í× × Path ¼¾ º 7.5.9 ´ Arboles abarcadores de profundidad Ð Ó ØÓ ר ×Ù ¹× ÓÒ × × ÖÖÓÐÐ Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ ¸ Ô ÖØ Ö ÙÒ ÒÓ Ó Ò Ó¸ ÜÔÐÓÖ Ò ÔÖÓ ÙÒ ÙÒ Ö Ó Ý ÓÒרÖÙÝ ÓØÖÓ Ö Ó ÓÖÖ ×ÔÓÒ ÒØ ÙÒ Ö ÓÐ Ö¹ ÓÖº Ì Ð ÖÙØ Ò Ø Ò Ð × Ù ÒØ ÓÖÑ Ò Ö Ð ¾ Ö ÓÐ × Ö ÓÖ × ¾ ≡ ¿¼ template <class GT, class SA> inline bool find_depth_first_spanning_tree(GT & g, typename GT::Node * gnode, GT & tree) { ÁÒ Ð Þ Ö ÓÒרÖÙ ÓÒ Ö ÓÐ Ö ÓÖ ¾ Ê ÓÖÖ Ö Ò ÔÖÓ ÙÒ ÒÓ Ó× Ý ÒØ × ÒÓ ¾ return true; } Ñ Ò ØÖ × Ô Ö Ñ ØÖÓ× find depth first spanning tree() ½º g ÙÒ Ö Ó ÓÒ ÜÓ ×Ó Ö Ð Ù Ð × Ö ÕÙ Ö ÓÒרÖÙ Ö ÙÒ Ö ÓÐ Ö ÓÖº ¾º gnode Ð ÒÓ Ó Ò Ð × Ð Ù Ð × × ÓÑ ÒÞ Ö Ð ÓÒרÖÙ ÓÒ Ð Ö ÓÐ Ö¹ ÓÖº
  • 655.
    7.5. Recorridos sobregrafos 629 ¿º tree ÙÒ Ö Ó × Ð ÓÒ × ÓÐÓ Ö Ð Ö ÓÐ Ö ÓÖ Ö ×ÙÐØ ÒØ º Ð Ú ÐÓÖ Ö ØÓÖÒÓ × true × Ü ×Ø ÙÒ Ö ÓÐ Ö ÓÖ false ÐÓ ÓÒØÖ Ö Óº Ò Ò ÙÖ ¸ find depth first spanning tree() Ñ Ô ÐÓ× ÒÓ Ó× Ý Ö Ó× ØÖ Ú × ÐÓ× ÓÓ ×º ר ÑÓ Ó¸ Ð Ù×Ù Ö Ó ÔÙ ÓÒÓ Ö¸ ÒØÖÓ Ð Ö Ó¸ Ù Ð × ÒÓ Ó× Ó Ö Ó× Ô ÖØ Ò Ò Ð Ö ÓÐ Ö ÓÖº ÒØ × ÓÑ ÒÞ Ö Ð ÜÔÐÓÖ ÓÒ Ö ÙÖ× Ú g¸ × Ò × Ö Ó Ð ÑÔ Ö ×Ù× Ø× ÓÒØÖÓÐ Ý × ÙÖ Ö× ÕÙ tree ר Ú Ó ¾ ÁÒ Ð Þ Ö ÓÒרÖÙ ÓÒ Ö ÓÐ Ö ÓÖ ¾ ≡ ´¾ µ g.reset_nodes(); g.reset_arcs(); clear_graph(tree); // asegurar que arbol destino est´ vac´o ´ e ı NODE_BITS(gnode).set_bit(Spanning_Tree, true); // marcar gnode typename GT::Node * tnode = tree.insert_node(gnode->get_info()); GT::map_nodes(gnode, tnode); Í× ÑÓ× Ð Ø Spanning Tree Ô Ö Ô ÒØ Ö ÙÒ ÒÓ Ó Ó Ö Ó ÕÙ Ý × Ó Ú × Ø Óº ÓÒ ÐÓ ÒØ Ö ÓÖ Ò Ñ ÒØ ¸ ÔÓ ÑÓ× ÔÐ ÒØ Ö Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ Ô ÖØ Ö gnode ¾ Ê ÓÖÖ Ö Ò ÔÖÓ ÙÒ ÒÓ Ó× Ý ÒØ × ÒÓ ¾ ≡ ´¾ ¿¼ µ for (Node_Arc_Iterator<GT, SA> i(gnode); i.has_current(); i.next()) { typename GT::Arc * arc = i.get_current_arc(); if (IS_ARC_VISITED(arc, Spanning_Tree)) continue; typename GT::Node * arc_tgt_node = i.get_tgt_node(); if (IS_NODE_VISITED(arc_tgt_node, Spanning_Tree)) continue; // nodo destino tambi´n ya ha sido visitado desde otro arco e if (__find_depth_first_spanning_tree<GT,SA>(g, arc_tgt_node, arc, tree, tnode)) return false; // ya el arbol est´ calculado ´ a } Í× × Node Arc Iterator º Ä ×ØÖÙ ØÙÖ × × Ñ Ð Ö Ð ÓØÖÓ× Ð ÓÖ ØÑÓ× × Ó× Ò Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ º Ä ÖÙØ Ò Ö ÙÖ× Ú × find depth first spanning tree()¸ Ð Ù Ð ÔØ ÐÓ× × Ù ÒØ × Ô Ö Ñ ØÖÓ× Ò Ð ÓÖ Ò ÔÖ × ÒØ Ó ½º g Ð Ö Ó Ö ÓÖÖ Öº ¾º arc tgt node ÙÒ ÒÓ Ó ÒØÖÓ g ÕÙ ÙÒ ÒÓ × Ó Ú × Ø Ó Ý ÕÙ ÒÓ Ø Ò Ñ Ò Ò treeº ¿º garc Ð Ö Ó ØÙ Ð g ÙÝÓ ÒÓ Ó ÓÖ Ò × gnodeº ÆÓØ ÑÓ× ÕÙ Ð Ö Ó ÙÒ ÒÓ Ø Ò Ñ Ò Ò tree ר × Ö Ò× ÖØ Ó Ð ÓÑ ÒÞÓ find depth first spanning tree()º º gnode ÙÒ ÒÓ Ó g¸ Ý Ú × Ø Ó¸ ÕÙ Ø Ò Ñ Ò Ò treeº º tree Ð Ö ÓÐ Ö ÓÖ ÕÙ × ×Ø ÓÒרÖÙÝ Ò Óº º tnode Ð Ñ Ò gnode Ò treeº ÆÓØ ÑÓ× ÕÙ Ò ×Ø ×Ó ÙÒ ÒÓ Ó ×Ø ÒÓº
  • 656.
    630 Cap´ ıtulo 7. Grafos Ä ÖÙØ Ò Ö ÙÖ× Ú Ö ×ÙÐØ ÒØ Ø Ò ¸ ÒØÓÒ ×¸ Ð × Ù ÒØ ÑÔÐ ÒØ ÓÒ ¿¼ Ö ÓÐ × Ö ÓÖ × ¾ +≡ ¾ ¿¼ template <class GT, class SA> inline static bool __find_depth_first_spanning_tree(GT & g, typename GT::Node * gnode, typename GT::Arc * garc, GT & tree, typename GT::Node * tnode) { NODE_BITS(gnode).set_bit(Spanning_Tree, true); // marcar nodo ARC_BITS(garc).set_bit(Spanning_Tree, true); // marcar arco // insertar tgt_node en arbol y mapearlo ´ typename GT::Node * tree_tgt_node = tree.insert_node(gnode->get_info()); GT::map_nodes(gnode, tree_tgt_node); // insertar arc en arbol y mapearlo ´ typename GT::Arc * tarc = tree.insert_arc(tnode, tree_tgt_node, garc->get_info()); GT::map_arcs(garc, tarc); tnode = tree_tgt_node; // esto hace que el bloque de recorrido sea el mismo if (tree.get_num_nodes() == g.get_num_nodes()) // ¿se ha abarcado el grafo? return true; // tree ya contiene el arbol abarcador ´ Ê ÓÖÖ Ö Ò ÔÖÓ ÙÒ ÒÓ Ó× Ý ÒØ × ÒÓ ¾ return false; } ר Ð ÓÖ ØÑÓ × ÙÒ Ñ ÒØ Ð ÒØ Ò Ö ×Ù ÓÒ ÓÒ Ô Ö ¸ Ù Ð × Ð ÒÞ Ù Ò Ó × Ò Ö Ó ØÓ Ó× ÐÓ× ÒÓ Ó× g × Ö¸ Ù Ò Ó Ð ÒØ ÒÓ Ó× tree × Ð Ñ ×Ñ ÕÙ Ð gº Ì Ñ Ò × ÑÔÓÖØ ÒØ ÒÓØ Ö ÕÙ Ð Ú Ø Ö Ð Ò ÙÖ ÙÒ Ö Ó Ó ÒÓ Ó Ý Ú × Ø Ó Ò tree¸ × ÑÔÓ× Ð Ù× Ö ÙÒ ÐÓ Ö ÞÓÒ ÕÙ Ö ÒØ Þ ÕÙ tree × ¸ Ò ØÓ¸ ÙÒ Ö Óк 7.5.10 ´ Arboles abarcadores de amplitud Ò Ð Ñ ×ÑÓ × ÒØ Ó ÕÙ Ô Ö ÙÒ Ö ÓÐ Ö ÓÖ Ò ÔÖÓ ÙÒ ¸ ÔÓ ÑÓ× ÔÐ ÒØ Ö ÙÒ ÖÙØ Ò ÕÙ ÒÓ× ÜØÖ Ð Ö Ó Ð Ö ÓÐ Ö ÓÖ ÓÖÖ ×ÔÓÒ ÒØ Ð Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ × ÙÒ ÒÓ Ó Óº Ì Ð ÖÙØ Ò × Ö Ð Þ Ð × Ù ÒØ Ñ Ò Ö ¿¼ Ö ÓÐ × Ö ÓÖ × ¾ +≡ ¿¼ ¿¾ template <class GT, class SA> inline void find_breadth_first_spanning_tree(GT & g, typename GT::Node * gnode, GT & tree) { g.reset_bit_nodes(Spanning_Tree); g.reset_bit_arcs(Spanning_Tree); clear_graph(tree); // inicialice arbol e inserte copia mapeada de gnode ´ auto_ptr<typename GT::Node> tnode_auto (new typename GT::Node(gnode)); tree.insert_node(tnode_auto.get()); GT::map_nodes(gnode, tnode_auto.release()); DynListQueue<typename GT::Arc*> q; // recorra arcos gnode e ins´rtelos en cola e for (Node_Arc_Iterator<GT, SA> i(gnode); i.has_current(); i.next()) q.put(i.get_current_arc()); NODE_BITS(gnode).set_bit(Spanning_Tree, true); // marque visitado gnode
  • 657.
    7.5. Recorridos sobregrafos 631 while (not q.is_empty()) // repita mientras queden arcos en la cola { typename GT::Arc * garc = q.get(); // sacar arco y marcarlo ARC_BITS(garc).set_bit(Spanning_Tree, true); typename GT::Node * gsrc = g.get_src_node(garc); // nodos de garc typename GT::Node * gtgt = g.get_tgt_node(garc); if (IS_NODE_VISITED(gsrc, Spanning_Tree) and IS_NODE_VISITED(gtgt, Spanning_Tree)) continue; // los dos nodos de garc ya fueron visitados if (IS_NODE_VISITED(gtgt, Spanning_Tree)) // ¿gtgt visitado? Aleph::swap(gsrc, gtgt); // s´, interc´mbielo con gsrc ı a typename GT::Node * tsrc = // imagen de gsrc en tree static_cast<typename GT::Node*>(NODE_COOKIE(gsrc)); NODE_BITS(gtgt).set_bit(Spanning_Tree, true); // marque gtgt visitado // crear copia de gtgt, insertarlo en tree y mapearlo auto_ptr<typename GT::Node> ttgt_auto (new typename GT::Node(gtgt)); tree.insert_node(ttgt_auto.get()); typename GT::Node * ttgt = ttgt_auto.release(); GT::map_nodes(gtgt, ttgt); // insertar nuevo arco en tree y mapearlo typename GT::Arc * tarc = tree.insert_arc(tsrc, ttgt, garc->get_info()); GT::map_arcs(garc, tarc); if (tree.get_num_nodes() == g.get_num_nodes()) // ¿tree abarca a g? break; // insertar en cola arcos de gtgt for (Node_Arc_Iterator<GT, SA> i(gtgt); i.has_current(); i.next()) { typename GT::Arc * current_arc = i.get_current_arc(); if (IS_ARC_VISITED(current_arc, Spanning_Tree)) continue; // revise nodos de arcos para ver si han sido visitados if (IS_NODE_VISITED(g.get_src_node(current_arc), Spanning_Tree) and IS_NODE_VISITED(g.get_tgt_node(current_arc), Spanning_Tree)) continue; // nodos ya visitados ==> no vale la pena meter el arco q.put(current_arc); } } } Í× × DynListQueue ½ ¼ Ò Node Arc Iterator º ÈÙ ×ØÓ ÕÙ Ð ÓÐ × Ó Ø Ò Ò Ö Ó× ÐÓ× Ù Ð × ÙÒ ×ÓÐÓ ÒÓ Ó ×Ø ÓÒØ Ò Ó Ò tree ݸ Ñ ×¸ tree × Ô ÖÑ Ò ÒØ Ñ ÒØ ÓÒ ÜÓ¸ ÒØÓÒ × × ÑÔÓ× Ð ÕÙ Ð Ò ÐÙ× ÓÒ ÙÒ ÒÙ ÚÓ Ö Ó Ù× ÙÒ ÐÓº tree ׸ ÔÓÖ Ø ÒØÓ¸ ÙÒ Ö ÓÐ Ö ÓÖº 7.5.11 ´ Arboles abarcadores en arreglos ÍÒ Ñ Ò Ö ÑÙÝ × ÑÔÐ Ö ÔÖ × ÒØ Ö ÙÒ Ö Óи ÕÙ ÒÓ ÜÔÐ ÑÓ× Ò Ð Ô ØÙÐÓ Ü ¸ ÓÒ× ×Ø Ò Ñ ÒØ Ò Ö ÙÒ ÖÖ ÐÓ Ô Ö × ÒÓ Ó Ð Ö Óк ÒØÖ i Ð ÖÖ ÐÓ ÓÒØ Ò Ð Ô Ö Ð ÒÓ Ó ÙÝÓ Ò Ó ÒÙÑ ÖÓ × iº Ä × Ô ØÓÖ Þ Ñ ÒØ ÐÓ× ÑÔÐÓ× Ð ¬ ÙÖ º½ º È Ö Ð ×Ó ÙÒ Ö ÓÐ Ö ÓÖ ÙÒ Ö Ó Ý¸ Ò Ò Ö Ð Ô Ö Ö ÓÐ × Ù ÐÕÙ Ö Ò ÓÐ ¸ Ð Ö ÔÖ × ÒØ ÓÒ Ô ØÓÖ Þ ×ÙÑ ÕÙ ÐÓ× ÒÓ Ó× ×Ø Ò ÒÙÑ Ö Ó׸ ÐÓ ÕÙ ÒÓ×
  • 658.
    632 Cap´ ıtulo 7. Grafos 6 3 0 3 4 5 2 5 6 4 1 ¼ ½ ¾ ¿ 0 1 2 ¼ ½ ¾ ¿ ¾ ¼ ¿ ¿ ¹ ¹ ¿ ¿ ¿ ´µ ´ µ ÙÖ º½ Ó× ÑÔÐÓ× Ö ÓÐ × Ö ÔÖ × ÒØ Ó× ÓÒ ÖÖ ÐÓ× Ö ×ØÖ Ò Ð Ö ÔÖ × ÒØ ÓÒº È Ö Ú Ø Ö ×ØÓ¸ ÑÔÐ ÑÓ× ÙÒ ÖÖ ÐÓ ÔÙÒØ ÖÓ× ÒÓ Ó׸ Ò Ð Ù Ð Ð ÒØÖ ÓÒØ ÒØ Ú NULL Ö ÔÖ × ÒØ Ð Ö Þº ÓÑÓ Ð Ì List Graph<Node, Arc> Ô ÖÑ Ø Ö ÔÖ × ÒØ Ö ÑÙÐØ Ö Ó׸ Ð Ñ ÖÓ ÖÖ ¹ ÐÓ Ô Ö × ÒÓ × ×Ù¬ ÒØ Ô Ö ×Ø Ò Ù Ö ÑÙÐØ ¹ Ö Ó׺ ר Ñ Ù ÔÙ Ö ×Óй Ú Ö× Ñ ÒØ ÙÒ ÖÖ ÐÓ Ö Ó× Ò ÐÙ Ö Ð ÒÓ Ó׺ ÑÔ ÖÓ¸ ×ØÓ × Ú Ð Ó ×ÓÐÓ × Ð Ö ÓÐ Ö ÓÖ Ö ¬ Ö ÙÒ Ö Óº × ÕÙ ¸ Ò Ö × Ð Ò Ö Ð ¸ ÑÔÐ Ö ÑÓ× Ó× ÖÖ ÐÓ× ÔÙÒØ ÖÓ׸ ÙÒÓ ÒÓ Ó× Ý ÓØÖÓ Ö Ó׺ Ë g × ÙÒ Ö Ó Ý Ð ÙÒ Ñ Ò Ö Ø Ò ÑÓ× ÙÒ Ö ÓÐ Ö ÓÖ Ö ÔÖ × ÒØ Ó Ò ÐÓ× ÖÖ ÐÓ× ÔÙÒØ ÖÓ× ÒÓ Ó× pred[] Ý Ö Ó× arcs[]¸ Ö ×Ô Ø Ú Ñ ÒØ ¸ ÒØÓÒ × ÔÓ ÑÓ× Ó Ø Ò Ö ÙÒ Ö Ó tree ÓÒØ ÒØ ÚÓ Ö ÓÐ Ö ÓÖ Ñ ÒØ Ð × Ù ÒØ ÖÙØ Ò ¿¾ Ö ÓÐ × Ö ÓÖ × ¾ +≡ ¿¼ template <class GT> void build_spanning_tree(GT & g, GT & tree, DynArray<typename GT::Node> * pred, DynArray<typename GT::Arc> * arcs, const bool with_map = false) { tree.clear(); for (int i = 0; i < g.get_num_nodes(); ++i) { typename GT::Arc * garc = arcs[i]; if (garc == NULL) continue; typename GT::Node * gsrc = g.get_src_node(garc); typename GT::Node * tsrc = NULL; if (IS_NODE_VISITED(gsrc, Spanning_Tree)) tsrc = static_cast<typename GT::Node*>(NODE_COOKIE(gsrc)); else { NODE_BITS(gsrc).set_bit(Spanning_Tree, true); // marcar bit tsrc = tree.insert_node(gsrc->get_info()); } typename GT::Node * gtgt = g.get_tgt_node(garc); typename GT::Node * ttgt = NULL; if (IS_NODE_VISITED(gtgt, Spanning_Tree)) ttgt = static_cast<typename GT::Node*>(NODE_COOKIE(gtgt)); else
  • 659.
    7.5. Recorridos sobregrafos 633 { NODE_BITS(gtgt).set_bit(Spanning_Tree, true); // marcar bit ttgt = tree.insert_node(gtgt->get_info()); } typename GT::Arc * tarc = tree.insert_arc(tsrc, ttgt, garc->get_info()); ARC_BITS(garc).set_bit(Min, true); if (with_map) { GT::map_nodes(gsrc, tsrc); GT::map_nodes(gtgt, ttgt); GT::map_arcs(garc, tarc); } } } Í× × arcs ¾ ¸ DynArray ¾¸ Ò pred ¾ º Ð Ô Ö Ñ ØÖÓ with map Ò × Ð Ö ÓÐ Ö ÓÖ Ó ÒÓ Ñ Ô Ö× ÓÒ Ð Ö Ó gº Ô ÖØ Ð ÓÒÓÑ ×Ô Ó¸ Ö ÔÖ × ÒØ Ö Ö ÓÐ × Ö ÓÖ × Ö Ó× Ñ ÒØ ÖÖ ÐÓ× × Ô ÖØ ÙÐ ÖÑ ÒØ ÙØ Ð Ô Ö Ð ÓÖ ØÑÓ× Ù×ÕÙ Ñ ÒÓ× Ñ Ò ÑÓ× ×¹ Ô ¬ Ñ ÒØ ÐÓ× Ð ÓÖ ØÑÓ× ÐÓÝ Ý ÐÐÑ Ò¹ ÓÖ ¸ ÐÓ× Ù Ð × ×ØÙ Ö ÑÓ× Ò Ü º º¾ Ý Ü º º¿¸ Ö ×Ô Ø Ú Ñ ÒØ º 7.5.12 Conversi´n de un ´rbol abarcador a un Tree Node<T> o a Ò Ü º ´Ô Ò ¾ ¿µ × ÖÖÓÐÐ ÑÓ× Ð Ì Tree Node<T>¸ Ð Ù Ð ÑÓ Ð Þ ÙÒ Ö ÓÐ m¹Ö Ó Ñ ÒØÖ × ÕÙ Ò Ð ×Ù ¹× ÓÒ × ÔÖ ÒØ × ÑÓ× × ÖÖÓÐÐ Ö Ð ÓÖ ØÑÓ× Paraguiapos Coro 82 Cumaná 254 310 10 Pto La Cruz Caracas 55 Barcelona 109 252 199 Maracaibo Maracay 139 166 49 Maturín 130 Valencia 315 251 435 El Tigre 171 222 San Juan Machiques San Felipe 130 Pto Ordaz 295 220 100 Santa Barbara 107 252 Valera 86 120 241 Ciudad Bolivar San Antonio 59 36 Carora 102 69 86 167 Barquisimeto La Fría El Vigía 261 San Cristobal San Carlos 48 79 113 173 22 Mérida 526 Sacramento 38 Rubio 180 Guanare El Cantón 94 150 Barinas 547 200 San Fernando Caparo ÙÖ º¾¼ ÍÒ Ö Ó Ú Ð Ù × Ý ×Ø Ò × Ô Ö Ð ÙÐ Ö Ö ÓÐ × Ö ÓÖ × ÓÖÖ ×ÔÓÒ ÒØ ÐÓ× Ö ÓÖÖ Ó× Ò ÔÖÓ ÙÒ Ý Ñ¹ ÔÐ ØÙ ÙÒ Ö Óº Ò ×Ø ×Ù ¹× ÓÒ × ÖÖÓÐÐ Ö ÑÓ× ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÒÓ× ÓÒÚ ÖØ ÙÒ Ö ÓÐ Ö ÓÖ Ø ÔÓ List Graph<Node, Arc> ÙÒ Ö ÓÐ Ø ÔÓ Tree Node<T>º Ô ÖØ ×Ù Ú ÐÓÖ Ø Ó¸ ר ÖÙØ Ò ÒÓ× Ô ÖÑ Ø Ö Ô Ð Ö Ð Ù Ó ÙØÓÑ Ø Ó Ö ÓÐ × m¹Ö Ó× Ý × ×ÕÙ Ñ Ø Þ Ö¸ ÐÓ Ð Ö Ó ×Ø Ø ÜØÓ¸ Ö ÒØ × Ö ÓÐ × ÕÙ × × Ù Ö Ò Ò ÑÙ Ó× ÐÓ× Ð ÓÖ ØÑÓ× ÕÙ Ü ×Ø Ò ×Ó Ö Ö Ó׺ ÆÙ רÖÓ Ð ÓÖ ØÑÓ ÓÒÚ Ö× ÓÒ Ö × Ò Ð Ö ÚÓ graph to tree.Hº
  • 660.
    634 Cap´ ıtulo 7. Grafos Merida El Vigia La Fria Machiques Maracaibo Sta Barbara Coro Paraguaipos Valencia Barquisimeto Carora Guanare Valera Barinas Caparo Sn Fernando Rubio Sn Juan Sn Cristobal Caracas Sn Antonio Smento Barcelona Maracay El Canton Pto La Cruz Sn Felipe Cumana Sn Carlos Maturin Pto Ordaz Cd Bolivar El Tigre ÙÖ º¾½ Ö ÓÐ Ö ÓÖ Ò ÔÖÓ ÙÒ Ð Ö Ó Ð ¬ ÙÖ Ü º¾¼ ´Ô Ò ¿¿µ ÓÒ ÒÓ Ó Ò Ó Å Ö Ä ÓÒÚ Ö× ÓÒ × ÒÚÓ ØÖ Ú × Ð × Ù ÒØ ÒØ Ö Þ ¿ ÓÒÚ Ö× ÓÒ List Graph<Node, Arc> Tree Node<T> ¿ ≡ ¿ template <class GT, typename Key, class Convert> static Tree_Node<Key> * graph_to_tree_node(GT & g, typename GT::Node * groot); Ä Ù Ð Ö ØÓÖÒ ÙÒ Ö ÓÐ Ø ÔÓ Tree Node<Key>* ÓÖÖ ×ÔÓÒ ÒØ Ð Ö ÓÐ Ö ÓÖg ÓÒ Ö Þ Ò groot½ º graph to tree node()Ø Ò ØÖ × Ô Ö Ñ ØÖÓ× Ø ÔÓ ½º GT Ð Ø ÔÓ List Graph<Node, Arc>¸ ÕÙ ÓÒØ Ò ÙÒ Ö ÓÐ Ö ÓÖ¸ Ý ÕÙ × × ÓÒÚ ÖØ Ö Tree Node<T>º ¾º Key Ä Ð Ú ÕÙ × ÐÑ Ò Ö Ò Ð Tree Node<T>º ¿º Convert ÍÒ Ð × ØÖ Ò× ÓÖÑ ÓÒ × typename GT::Node* Tree Node<Key>*º ½ ÄÓ× Ö ÓÐ × Ù Ó× Ò ×Ø Ø ÜØÓ ×ÓÒ ÔÖÓ × Ó× ÓÒ ÙÒ ÖÙØ Ò ÐÐ Ñ generate tree() Ö × ÒØ Ò Ð Ö ÚÓ generate tree.H¸ Ð Ù Ð Ò Ö ÙÒ Ö ÓÐ ÒØÖ Ð ÔÖÓ Ö Ñ Ù Ó ntreepicº
  • 661.
    7.5. Recorridos sobregrafos 635 Ò Ð ÓÔ Ö ÓÖ () ר Ð × × Ð Ð ÓÒÚ Ö× ÓÒ ØÖ Ú × Ð × Ù ÒØ ÐÐ Ñ void operator () (typename GT::Node * groot, Tree_Node<Key>* troot) Ú Þ ÕÙ × Ö Ý × Ñ Ô ÙÒ ÒÓ Ó Ø ÔÓ groot Ø ÔÓ typename GT::Node *¸ × ÒÚÓ Convert () (groot, troot); Ä Ù Ð ÜØÖ Ð ÙÒ Ò ÓÖÑ ÓÒ groot¸ Ð ÓÒÚ ÖØ Ð Ø ÔÓ Key Ý × Ò ×Ø Ö ×ÙÐØ Ó troot->get key()º º SA Ð ¬ÐØÖÓ Ö Ó׺ graph to tree node() × ÔÓÝ ×Ó Ö Ð × Ù ÒØ ÖÙØ Ò ÔÖ Ú ¿ ÓÒÚ Ö× ÓÒ List Graph<Node, Arc> Tree Node<T> ¿ +≡ ¿ ¿ template <class GT, typename Key, class Convert> static void __graph_to_tree_node(GT & g, typename GT::Node * groot, Tree_Node<Key> * troot); Ð Ù Ð× Ò Ö Ö ÓÖÖ Ö Ö ÙÖ× Ú Ñ ÒØ Ð Ö ÓÐ Ö ÓÖg Ô ÖØ Ö Ð ÒÓ Ó groot Ý Ñ ÒØ Ò Ò troot Ð ÕÙ Ú Ð ÒØ Ø ÔÓ Tree Node<Key>º Å ÒØ graph to tree node() ÔÓ ÑÓ× ÑÔÐ ÒØ Ö Ð ÖÙØ Ò ÔÖ Ò Ô Ð Ð × ¹ Ù ÒØ Ñ Ò Ö ¿ ÓÒÚ Ö× ÓÒ List Graph<Node, Arc> Tree Node<T> ¿ +≡ ¿ ¿ template <class GT, typename Key, class Convert, class SA> inline Tree_Node<Key> * graph_to_tree_node(GT & g, typename GT::Node * groot) { Tree_Node<Key> * troot = new Tree_Node<Key>; // apartar memoria para ra´z ı Convert () (groot, troot); //convertir de groot y copiar a troot __graph_to_tree_node <GT, Key, Convert, SA> (g, groot, troot); return troot; } graph to tree() Ò Ð Þ Ð Ö Þ Tree Node<Key>º Ð Ö ×ØÓ Ð ØÖ Ó ÐÓ Ö Ð Þ Ð ÜÔÐÓÖ ÓÒ Ö ÙÖ× Ú groot ÑÔÐ ÒØ ÔÓÖ graph to tree() ¿ ÓÒÚ Ö× ÓÒ List Graph<Node, Arc> Tree Node<T> ¿ +≡ ¿ template <class GT, typename Key, typename Convert, class SA> static void __graph_to_tree_node(GT & g, typename GT::Node * groot, Tree_Node<Key> * troot) { typedef typename GT::Node Node; typedef typename GT::Arc Arc; // recorrer arcos de groot y construir recursivamente for (Node_Arc_Iterator<GT, SA> it(groot); it.has_current(); it.next()) { Arc * arc = it.get_current_arc(); if (IS_ARC_VISITED(arc, Convert_Tree)) continue; ARC_BITS(arc).set_bit(Convert_Tree, true); // marcar visitado arc
  • 662.
    636 Cap´ ıtulo 7. Grafos Node * gtgt = it.get_tgt_node(); Tree_Node<Key> * ttgt = new Tree_Node<Key>; // crear nuevo nodo Convert () (gtgt, ttgt); // asignarle la clave troot->insert_rightmost_child(ttgt); // insertarlo como hijo __graph_to_tree_node <GT, Key, Convert, SA> (g, gtgt, ttgt); } } Í× × Node Arc Iterator º × ×Ù¬ ÒØ ÓÒ ×ÓÐÓ Ñ Ö Ö ÐÓ× Ö Ó× ÕÙ Ý × Ò Ú × Ø Ó¸ Ô٠׸ ÓÑÓ g × ÙÒ Ö Óи ÒÓ Ý ÔÓ× Ð Ú × Ø Ö Ð ÒÓ Ó × ÓØÖÓ Ö Óº Ð Ø Ñ Ö × ÒÓ¹ Ñ Ò Convert Treeº Merida El Vigia Valera Barinas La Fria Sta Barbara Carora Maracaibo Caparo Guanare Sn Fernando MachiquesSn Cristobal Barquisimeto Coro Paraguaipos Rubio Sn Carlos Sn Juan Sn Antonio Smento Valencia Sn Felipe Caracas El Tigre El Canton Maracay Barcelona Cd Bolivar Pto La Cruz Pto Ordaz Cumana Maturin ÙÖ º¾¾ Ö ÓÐ Ö ÓÖ Ò ÑÔÐ ØÙ Ð Ö Ó Ð ¬ ÙÖ Ü º¾¼ ´Ô Ò ¿¿µ ÓÒ ÒÓ Ó Ò Ó Å Ö 7.5.13 Componentes inconexos de un grafo Ó ÙÒ Ö Ó¸ × × Ø ÖÑ Ò Ö Ð ÒØ ×Ù Ö Ó× Ò ÓÒ ÜÓ× ÕÙ ÐÓ ÓÒ ÓÖÑ Òº Ø Ð × ØÓ׸ ÓÒ× Ö ÑÓ× Ð × Ù ÒØ ÔÖ Ñ Ø Ú ¿ ÓÑÔÓÒ ÒØ × Ò ÓÒ ÜÓ× ¿ ≡ ¿ template <class GT, class SA> inline void inconnected_components(GT & g, DynDlist<GT> & list); Í× × DynDlist ¿ Ò inconnected components ¿ º inconnected components() Ö ÙÒ Ö Ó g Ý ÙÒ Ð ×Ø Ú listº ÄÙ Ó Ð ¹ Ù ÓÒ Ð ÔÖ Ñ Ø Ú ¸ list ÓÒØ Ò ÐÓ× ×Ù Ö Ó× Ñ Ô Ó× g ÓÖÖ ×ÔÓÒ ÒØ × ×Ù× ÓÑÔÓÒ ÒØ × Ò ÓÒ ÜÓ׺ Ë g × ÓÒ ÜÓ¸ ÒØÓÒ × list ÓÒØ Ò ÙÒ ×ÓÐÓ Ö Óº À Ý Ú Ö × Ñ Ò Ö × ÔÖÓÚ Ö Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ Ô Ö Ö ×ÓÐÚ Ö ×Ø ÔÖÓ¹ Ð Ñ ¸ Ð ÙÒ × Ñ × ¬ ÒØ × Ý ÓØÖ × Ñ × × ÑÔÐ × ÑÔÐ ÒØ Öº Ò ØÓ Ó× ÐÓ× ×Ó׸ Ð × × Ö ÓÖÖ Ö ÐÓ× ÒÓ Ó× Ð Ö Ó × ÙÒ ÕÙ Ð ÒÓ Ó Ü Ñ Ò Ó × Ý Ú × Ø Ó Ó ÒÓº ÍÒ Ð ÓÖ ØÑÓ × ÑÔÐ ÓÒ× ×Ø Ò Ö Ð Þ Ö Ó× Ô × ×º Ä ÔÖ Ñ Ö Ö ÓÖÖ ÐÓ× Ö Ó× ÔÓÖ ÔÖÓ ÙÒ Ý Ô ÒØ ÐÓ× ÒÓ Ó× × ÙÒ Ð ÓÒ Ø Ú º Ð ¬Ò Ð ×Ø Ô × ¸ ÐÓ× ÒÓ Ó× Ý Ö Ó× ÕÙ Ò Ô ÒØ Ó× × ÙÒ Ð ÓÐÓÖ Ð ÓÑÔÓÒ ÒØ Ò ÓÒ ÜÓ × Ð Ù Ð × Ò Ó ×Ù
  • 663.
    7.5. Recorridos sobregrafos 637 Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ º ÙÖ ÒØ ר Ô × × Ò× ÖØ Ò ÐÓ× ÒÓ Ó׸ Ñ × ÒÓ ÐÓ× Ö Ó׸ Ò ÐÓ× ×Ù Ö Ó× Ö ×ÙÐØ Ó׺ ÈÓר Ö ÓÖÑ ÒØ ¸ Ò ÙÒ × ÙÒ Ô × ¸ × Ö ÓÖÖ Ò ÐÓ× Ö Ó× Ý ×ØÓ׸ × ÙÒ ×Ù ÓÐÓÖ¸ × Ò× ÖØ Ò Ò ×Ù ÓÖÖ ×ÔÓÒ ÒØ ×Ù Ö Ó Ö ×ÙÐØ Óº Ä ÔÖ Ñ Ö Ô × Ð Ð ÓÖ ØÑÓ ØÓÑ O(E)¸ Ñ ÒØÖ × ÕÙ Ð × ÙÒ O(E)º ÈÓÖ Ø ÒØÓ¸ Ð Ð ÓÖ ØÑÓ × O(E)º Ë ÔÙ ÐÓ Ö Ö ÙÒ Ð ÓÖ ØÑÓ Ñ × ¬ ÒØ ÕÙ ÓÖÖ Ð × ÙÒ Ô × × × ÓÒרÖÙÝ Ö Ø Ñ ÒØ Ð ×Ù Ö Ó ÙÖ ÒØ Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ ¸ Ò ÐÙ Ö ÔÓר Ö ÖÐÓ Ô Ö Ð × ÙÒ Ô × º ר × Ð Ò ÓÕÙ ÕÙ ÑÔÐ Ö ÑÓ׺ ÓÒ× Ö ÑÓ× Ð ÔÖ Ñ Ø Ú × Ù ÒØ ¿ ÓÑÔÓÒ ÒØ × Ò ÓÒ ÜÓ× ¿ +≡ ¿ ¿ template <class GT, class SA> inline void build_subgraph(GT & g, // grafo original GT & sg, // componente inconexo typename GT::Node * g_src, // nodo actual en g size_t & node_count); // contador de nodos build subgraph() Ö ÓÖÖ Ò ÔÖÓ ÙÒ Ð Ö Ó g Ý ÓÒרÖÙÝ ÙÒ ÓÑÔÓÒ ÒØ sg × ÙÒ Ð ÓÒ Ø Ú Ð ÒÓ Ó ÕÙ × ×Ø Ú × Ø Ò Óº g src × Ð ÒÓ Ó ØÙ Ð g ÕÙ × ÒØ ÒØ Ú × Ø Öº node count × ÙÒ ÓÒØ ÓÖ ×Ó Ö Ð ÒÙÑ ÖÓ ÒÓ Ó× Ú × Ø Ó× ÕÙ Ô ÖÑ Ø Ø Ø Ö Ù Ò Ó× Ò×Ô ÓÒ Ó ØÓ Ó Ð Ö Óº build subgraph() × ÒÚÓ Ó ÔÓÖ inconnected components()¸ Ð Ù Ð Ö ÓÖÖ ØÓ Ó× ÐÓ× ÒÓ Ó× Ð Ö Ó Ý¸ Ô Ö ÒÓ Ó curr node ÕÙ ÒÓ Ý × Ó Ú × Ø Ó¸ Ö Ð Þ ÙÒ ÐÐ Ñ build subgraph()¸ Ð Ù Ð ÓÒרÖÙ Ö Ð ÓÑÔÓÒ ÒØ Ò ÓÒ ÜÓ ÓÖÖ ×ÔÓÒ ÒØ Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ × curr nodeº È Ö ÔÓ Ö Ñ Ô Ö ØÓ Ó Ð ÓÑÔÓÒ ÒØ Ò ÓÒ ÜÓ¸ Ð Ø Ò ÓÒ Ö Ð Þ Ö× Ù Ò Ó × Ý Ò Ö ÓÖÖ Ó ØÓ Ó× ÐÓ× Ö Ó׺ Ó Ð × Ö ÒØ ÔÖ Ñ × ×¸ ÔÓ ÑÓ× ÒÙÒ Ö Ð Ð ÓÖ ØÑÓ ¬Ò Ø ÚÓ ¿ ÓÑÔÓÒ ÒØ × Ò ÓÒ ÜÓ× ¿ +≡ ¿ ¿ template <class GT, class SA> inline void inconnected_components(GT & g, DynDlist <GT> & list) { g.reset_nodes(); g.reset_arcs(); size_t count = 0; // contador de nodos visitados for (typename GT::Node_Iterator i(g); // recorrer nodos de g count < g.get_num_nodes() and i.has_current(); i.next()) { typename GT::Node * curr = i.get_current_node(); if (IS_NODE_VISITED(curr, Build_Subtree)) continue; // crear subgrafo componente inconexo conectado por curr_node list.append(GT()); // crea subgrafo y lo inserta en lista GT & subgraph = list.get_last(); // referencia grafo insertado en list build_subgraph <GT, SA> (g, subgraph, curr, count); // subgrafo a curr } } ¬Ò × inconnected components¸ Ù× Ò ÙÒ ¿º Í× × DynDlist ¿ Ò Node Iterator º ÓÖ ÔÓ ÑÓ× ÑÔÐ ÒØ Ö build subgraph()¸ Ð Ù Ð × Ö Ñ Ø ÜÔÐÓÖ Ö Ò ÔÖÓ ÙÒ¹ × ÙÒ ÒÓ Ó g src Ð Ù×ÕÙ ØÓ Ó× ÐÓ× Ö Ó× Ý ÒÓ Ó× × ÕÙ Ð × ×
  • 664.
    638 Cap´ ıtulo 7. Grafos g srcÝ ÕÙ ÓÒ ÓÖÑ Ö Ò ÙÒ ÓÑÔÓÒ ÒØ ÓÒ ÜÓ Ð Ö Ó ¿ ÓÑÔÓÒ ÒØ × Ò ÓÒ ÜÓ× ¿ +≡ ¿ template <class GT, class SA> inline void build_subgraph(GT & g, // grafo original GT & sg, // subgrafo componente inconexo typename GT::Node * g_src, // nodo actual en g size_t & node_count) { if (IS_NODE_VISITED(g_src, Build_Subtree)) return; NODE_BITS(g_src).set_bit(Build_Subtree, true); // marcar g_src visitado ++node_count; typename GT::Node * sg_src = // imagen de g_src en sg static_cast<typename GT::Node *>(NODE_COOKIE(g_src)); if (sg_src == NULL) // ¿est´ mapeado g_src? a { // No, cree imagen de g_src en el subgrafo sg y mapee sg_src = sg.insert_node(g_src->get_info()); GT::map_nodes(g_src, sg_src); } for (Node_Arc_Iterator<GT, SA> i(g_src); // explore desde g_src node_count < g.get_num_nodes() and i.has_current(); i.next()) { typename GT::Arc * arc = i.get_current_arc(); if (IS_ARC_VISITED(arc, Build_Subtree)) continue; // avance pr´ximo arco o ARC_BITS(arc).set_bit(Build_Subtree, true); // marque arc visitado typename GT::Node * g_tgt = i.get_tgt_node(); // nodo destino de arc typename GT::Node * sg_tgt = static_cast<typename GT::Node *>(NODE_COOKIE(g_tgt)); if (sg_tgt == NULL) // ¿est´ mapeado en sg? a { // no, hay que mapearlo e insertarlo en el subgrafo sg sg_tgt = sg.insert_node(g_tgt->get_info()); GT::map_nodes(g_tgt, sg_tgt); } // tenemos los nodos en el subgrafo, insertamos arco y lo mapeamos typename GT::Arc * sg_arc = sg.insert_arc(sg_src, sg_tgt, arc->get_info()); GT::map_arcs(arc, sg_arc); build_subgraph<GT,SA>(g, sg, g_tgt, node_count); // prosigue recursivamente } } Í× × Node Arc Iterator º 7.5.14 Puntos de articulaci´n de un grafo o Ó ÙÒ Ö Ó ÓÒ ÜÓ¸ ÙÒ punto de articulaci´n, o de corte × ÙÒ ÒÓ Ó Ø Ð ÕÙ Ð o Ð Ñ Ò Ö× Ú Ð Ö Ó Ò Ð Ñ ÒÓ× Ó× ×Ù Ö Ó× × ÙÒØÓ׺ Ä ¬ ÙÖ º¾¿ ÑÙ ×ØÖ ÙÒ ÑÔÐÓ Ò Ð Ù Ð ×Ù× ÔÙÒØÓ× ÖØ ÙÐ ÓÒ ×Ø Ò Ö × ÐØ Ó׺ ÄÓ× ×Ù Ö Ó× × ÙÒØÓ× Ö ×ÙÐØ ÒØ × Ð Ð Ñ Ò ÓÒ ÐÓ× ÔÙÒØÓ× ÓÖØ ÙÒ Ö Ó × ÒÓÑ Ò Ò ÐÓÕÙ × Ó ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× º Ä Ø ÖÑ Ò ÓÒ ÐÓ× ÔÙÒØÓ× ÖØ ÙÐ ÓÒ × ÙÒ Ñ ÒØ Ð Ô Ö Ð ÔÖÙ ÔÐ Ò Ö Ý Ô Ö Ð ÙÒÓ× Ð ÓÖ ØÑÓ× Ù Ó Ð Ú Þ ÕÙ ÓÒר ØÙÝ ÓØÖ ÔÐ ÓÒ
  • 665.
    7.5. Recorridos sobregrafos 639 M K B E G I J A F L K H D C ÙÖ º¾¿ ÍÒ Ö Ó Ý ×Ù× ÔÙÒØÓ× ÖØ ÙÐ ÓÒ Ñ × Ð Ù×ÕÙ Ò ÔÖÓ ÙÒ º Ì Ñ Ò¸ ÖØÓ ÑÓ Ó¸ Ö Ú Ð ÐÓ× ÔÙÒØÓ× Ö Ø Ó× ÙÒ Ö Óº ÈÓÖ ÑÔÐÓ¸ Ò ÙÒ Ö Ð ØÖ ¸ ÐÓ× ÔÙÒØÓ× ÖØ ÙÐ ÓÒ Ò Ò ÐÓ× ÔÙÒØÓ× ÕÙ Ð ÐÐ Ö ÔÙ Ò ÓÑÔÖÓÑ Ø Ö Ð Ö ÐÓ Ñ ×ÑÓ ÔÐ Ð Ñ ÝÓÖ Ð×× Ö × ØÖ Ò×ÔÓÖØ ¸ Ô ÕÙ Ø × Ö ¸ Ø Ø Ö º ÒÐ Ù ÓÒ ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ø ÖÑ Ò ÐÓ× ÒÓ Ó× ÓÖØ ¸ × Ñ Ò ×Ø Ö Ö ¹ Ø Ö Þ Ö Ð ÙÒ × ×Ù× ÔÖÓÔ × Ý ×Ù× Ö Ð ÓÒ × ÓÒ ÙÒ Ö ÓÐ Ö ÓÖ ÔÖÓ Ù Ó ÔÓÖ ÙÒ Ù×ÕÙ Ò ÔÖÓ ÙÒ º ÓÑ Ò ÑÓ× ÔÓÖ Ð Ñ × × ÑÔÐ ØÓ ׸ Ö Ø Ö Þ ÔÓÖ Ð × Ù ÒØ Ð Ñ º Lema 7.1 Ë ÙÒ ÒÓ Ó v × ÓÖØ ¸ Ø Ð ÕÙ Ú ÙÒ Ö Ó G Ò Ó× ÓÑÔÓÒ ÒØ × G1 Ý G2¸ Ö ×Ô Ø Ú Ñ ÒØ ¸ ÒØÓÒ ×¸ Ñ ÒÓ × ÙÒ ÒÓ Ó u Ò G1 ÙÒ ÒÓ Ó w Ò G2 ¸Ò × Ö Ñ ÒØ ¸ ÓÒØ Ò Ö vº Demostraci´n Ë Ð Ð Ñ ÒÓ Ù × o ÖØÓ¸ ÒØÓÒ × × Ö ÓÒØÖ ØÓÖ Ó ÕÙ v Ù × ÙÒ ÔÙÒØÓ ÓÖØ ¸ ÔÙ × Ü ×Ø Ö ÓØÖÓ Ñ ÒÓ ÒØÖ u Ý w ÕÙ Ò Ö ÓØÖ Ö Ñ ÓÒ ¹ Ø Ú º Ä × Ù ÒØ ¬ ÙÖ ÒÓ× Ô ØÓÖ Þ ×Ø × ØÙ ÓÒ u v w G2 G1 Ä ÔÖÓÔ ÒØ Ö ÓÖ × ÑÔÓÖØ ÒØ Ô Ö Ö Ø Ö Þ Ö ÙÒ Ö Ð ÓÒ ÕÙ Ô Ö ÒØÖ ÙÒ ÒÓ Ó ÓÖØ Ù Ò Ó ×Ø × Ö Þ ÙÒ Ö ÓÐ Ö ÓÖ ÔÖÓ ÙÒ º Ò ×Ø × ÒØ Ó¸ ÔÓ ÑÓ× ÑÓ×ØÖ Ö ÓØÖÓ Ð Ñ ÕÙ ÓÒר ØÙÝ Ð ÔÖ Ñ Ö ÙÒ Ñ ÒØÓ Ô Ö ÙÒ Ð ÓÖ ØÑÓ Ð ÙÐÓ ÒÓ Ó× ÓÖØ º B F I J A D H C G L K ÙÖ º¾ ÍÒ Ö Ó ÓÒ ÙÒ ÔÙÒØÓ ÖØ ÙÐ ÓÒ
  • 666.
    640 Cap´ ıtulo 7. Grafos Lema 7.2 Ë T Ð Ö ÓÐ Ö ÓÖ ÔÖÓ ÙÒ ÙÒ Ö Ó G =< V, E > Ò Ö Ó Ô ÖØ Ö ÙÒ ÒÓ Ó vº ÒØÓÒ ×¸ v × ÙÒ ÒÓ Ó ÓÖØ ÙÒ Ö Ó G × Ý ×ÓÐÓ × Ð Ö Þ v Ø Ò Ñ × ÙÒ Óº Demostraci´n È Ö o ÑÓ×ØÖ Ö Ð Ò × ¸ ÔÐ ÒØ ÑÓ× Ð Ò Ó Ð Ð Ñ ×ÙÔÓÒ ¹ ÑÓ× ÕÙ v × ÙÒ ÒÓ Ó ÓÖØ ÓÒ ÙÒ ÙÒ Ó Ó w v w G-v . . Ë Ð × ØÙ ÓÒ Ù × × ¸ ÒØÓÒ × w × Ö Ö Þ ÙÒ Ö ÓÐ Ö ÓÖ Ò ÔÖÓ ÙÒ ÕÙ Ù Ö ÒØ Ö Ñ ÒØ Ð Ö ×ØÓ ÐÓ ÒÓ Ó× V − {v}¸ ÐÓ ÕÙ ÓÒØÖ Ð ¬ÖÑ ÓÒ ÕÙ v × ÙÒ ÒÓ Ó ÓÖØ º ÈÙ ×ØÓ ÕÙ Ð Ò ÓÒ Ð Ð Ñ × ÙÒ ÓÒØÖ ÓÒ¸ × Ò × Ö Ó ÕÙ v Ø Ò Ó× Ó Ñ × Ó× Ò Ð Ö ÓÐ Ö ÓÖ Ò Ù ÒØÓ Ð ×Ù¬ Ò ¸ ×ÙÔÓÒ ÑÓ× Ó× ÒÓ Ó× u Ý w Ó× v v u w Æ Ò ÙÒÓ ÐÓ× × Ò ÒØ × u × Ò ×ØÖÓ Ó × Ò ÒØ w Ò T Ò ÐÓ Ñ ÒØ ¸ ÐÓ Ñ ×ÑÓ Ó ÙÖÖ Ô Ö wº ÈÙ ×ØÓ ÕÙ T Ù Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ ¸ ØÓ Ó× ÐÓ× ÒÓ Ó× Ð ×Ù ¹ Ö ÓÐ u ×ÓÒ Ú × Ø Ó× ÒØ × ÕÙ ÐÓ× ÒÓ Ó× Ð ×Ù ¹ Ö ÓÐ wº ×ØÓ Ò ÕÙ Ò Ò ÙÒ ÒÓ Ó v ר ÓÒ Ø Ó ÙÒ ÒÓ Ó w ÔÓÖ Ð ÙÒ Ö Ó G¸ ÔÓÖÕÙ × ÒÓ Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ ÐÓ× Ù × × Ù ÖØÓº ÄÓ ÕÙ ÑÔÐ ÕÙ Ñ ÒÓ ÒØÖ ÙÒ ÒÓ Ó Ð ×Ù ¹ Ö ÓÐ u ÙÒ ÒÓ Ó Ð ×Ù ¹ Ö ÓÐ w ÓÒØ Ò Ð ÒÓ Ó Ö Þ v¸ Р٠и ÔÓÖ Ð Ð Ñ º½¸ × ÙÒ ÔÙÒØÓ ÓÖØ ר Ð Ñ ¸ ÔÓ ÑÓ× × Ò Ö ÙÒ ÔÖ Ñ Ö Ð ÓÖ ØÑÓ ÓÒ× ×Ø ÒØ Ò Ü Ñ Ò Ö ÒÓ Ó v¸ Ð ÙÐ Ö ×Ù Ö ÓÐ Ö ÓÖ Ò ÔÖÓ ÙÒ Ô ÖØ Ö v Ý Ú Ö ¬ Ö × v Ø Ò Ñ × ÙÒ Ö Ñ º Ä ÓÑÔÐ × O(V) Ú × ÐÓ ÕÙ ÑÓÖ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ º ÈÓÖ Ø ÒØÓ¸ Ð Ô ÓÖ × ÑÔ ÒÓ ×Ø Ð ÓÖ ØÑÓ × O(V 2) Ó O(V × E) × ÙÒ Ð Ò× Ð Ö Óº Ð Ð ÓÖ ØÑÓ ÒØ Ö ÓÖ ÔÙ Ö Ð Þ Ö× × Ò Ò × ÓÒרÖÙ Ö Ð Ö ÓÐ Ö¹ ÓÖº ר ÓÒ Ö Ð Þ Ö ÙÒ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ ØÖ ÓÒ Ð × Ó Ò depth first traversal() Ý ÔÖ ×Ø Ö Ø Ò ÓÒ Ð Ð ÞÓ ÜØ ÖÒÓ ÕÙ Ò Ð ÜÔÐÓÖ ÓÒ Ô ÖØ Ö ÙÒ ÒÓ Ó vº Ë Ð ÐÐ Ñ depth first traversal() ×Ó Ö Ð ÔÖ Ñ Ö Ö Ó v ÒÓ Ù Ö ØÓ Ó× ÐÓ× ÒÓ Ó׸ ÒØÓÒ × v ÓÑÓ Ö Þ Ð Ö ÓÐ Ö ÓÖ Ò ÔÖÓ ÙÒ Ø Ò Ñ × ÙÒ Ö Ñ Ý ×¸ ÔÓÖ Ø ÒØÓ¸ ÙÒ ÒÓ Ó ÓÖØ º ÈÙ Ò Ð ÙÐ Ö× ÐÓ× ÔÙÒØÓ× ÓÖØ ÓÒ ÙÒ ×ÓÐ ÜÔÐÓÖ ÓÒ Ò ÔÖÓ ÙÒ Ð Ö Ó ÆÓ× ÔÖÓÜ Ñ Ö ÑÓ× Ð Ö ×ÔÙ ×Ø Ñ ÒØ ÓØÖÓ Ð Ñ º
  • 667.
    7.5. Recorridos sobregrafos 641 ººº ººº ººº ºº ºº ºº D ºº ºº ºº ºº º º ºº ºº ºº ºº º ºººº ºº º ºº ºº ºº ºº ºº ºº ºº ºº ºº ºº º ºº ºº º ºº ºº ºº ºº ºº º ºº ºº º º ºº º ºº º º º º B ºº º º ºº º º ººº ººº ººº ºº ºº ºº º º ºº º ºº ººº ººº ºº ºº ºº ºº º º º º ººº ºº ºº º ºº º º º ºº ººº º ºº ººº º ºº ºº ºº ºº ºº º º º ºº ºº ºº º ºº ºº ºº º º ºº º ºº º º º ºº ºº ºº º º º ºº º ºº º º º º ºº º º A ºº º º º º º º º º º J º º ºº º º ººº ºº º º ºº º º º ºº º º º ºº º º º ºº ºº º º º ºº ºº º ºº ºº º ººº º º ºº º ºº ºº ºº º ºº ºº ºº ºº º ºº º º º º º º ººº ºº ººº ºº ºº ºº º º ºº ºº º ºº ºººº ºº ºº ºº º ºº ºº ºººº º ºº ºº ºº º C ºº º ºº ºº º ºº º I ºº º º º ºº ºº ºº º º ºº ºº ºº º ºº ºº ºº ºº ºº ºº º º º º º ºº º º º ºº º º º º ºº ºº º º º ºº º ºº º ºº º ºº º ºº ºº ºº º º º º º º ºº º ºº º º º º ºº º º G ººº ººº ººº ººº º ººº ººº º º ºº ºº º º º º º º º º º º H ºº º º º º º ºº º ºº º º º º H º ºº º ºººº ºººº ººº º ºº ººº º ººº ºº º ºº º ººº ºº º ººº ºº º ººº ºº ºº º º º º ºº º ºº º ºº º º º ºº ºº ººº ºº º ºº º º º º ººº ºº ºº ºº º ºº º ºº º ºº ºº º º º º ºº º ºº º º º ºº ººº ºº º ºº º º º º ºº º º ºº F º º º º º º ºº ºº ºº F ºº ºº ºº º º º º º º L º ºº º ºº ºº F ºº ºº ºº º º º º ºº ºº I ººº ººº ººº ººº ººº ºº º ºº ºº ºº ºº º ºº ºº ºº º º º ººº º ºº ºº ºº º º ºº ºº ºº ºº º º º º ººº ºº ºº ºº º ºº ºº ºº º ºº ºº º ºº º º ºº ºº ºº ºº º ºº ºº ºº º º º ºº ºº ºº º º ºº ºº º ºº ºº ºº ºº ºº ºº º º ºº º ºº ºº ºº º ºº º ºº ººº ººº ººº ºº º ºº º º ºº ºº ºº º ºº º ºº ºº ºº º ººº º H ººº ººº ººº B º ººº º K º B º ººº º º L º ººº ººº ººº ºº º º ººº ººº ººº ºº ºº ºº º ºº º º ººº ººº ººº ººº ºº ºº ºº º ºº º ººº ººº ººº º º ººº ººº ºº º ºº º º ººº ºº ºº ºº ºº ºº º ºº º º º º º ºº º º ººº ºº ºº ºº ºº ºº º ºº º º º º ººº ººº ºº º º º ººº ºº ºº º ºº ºº º ºº ºº º ºº º ºº ºº º º º ºº ºº º ºº ºº º ºº º ºº º º ºº ººº ºº ºº ºº ºº º ºº ºº º º ºº º ºº º º º ºº º ºº º º ºº ºº º º ºº ºº º º ºº º º º º º º ºº º º º º º ºº ºº º ºº ºº º ººº º º º ºº ººº ºº ºººº º º º º ºº ººº ºº ºººº º º º ºº º ºº ºº ºº º ºº ºº º ºº º º º ºº º ºº ºº ºº º ºº ºº ºº º ºº º ºº º ººº ººº ºº º º º º º º º ºº I ººº ººº ººº ººº ººº ºº º º º º º ºº ºº A º º º º º º º º º º º º º º º º º º º º º º ºº ºº A ºº º º º º º º º º º º º º º º º º º º º º J ººº ººº ºº ººº ººº ºº ºº ººº º º º º ººº º º º º ººº ºº ºº ºº º ºº º º º º º º ºº º ºº º º º º º ºº ºº º ººº ºº ºº ºº º ºº º ºº ºº ºº º ºº º ºº º ºº º º º º º º º ºº ºº º º ºº º ºº º º º º º ºº ºº º º ºº º º ºº ºº ºº º º º º ºº º º º º ºº ºº º º º º ºº ººº ººº ºº º º ººº ºº ºº º º ºº º º ºº ººº ººº ºº ºº º º º ººº ººº ºº ººº º º º º ººº º º ººº º ººº ººº ººº ºº ººº ººº ººº ººº ººº L º º º º ºº º º º ºº º ººº ººº º º ºº ºº ººº ººº ºº C º º º º º ºº ºº ºº º º º ºº ºº º º ººº ººº º º ºº ºº ºº ººº ºº C º º º ºº º º º ºº ºº ºº ººº ººº K º º ºººº ºº ºººº º ºº º ºººº ºº ºººº º ºº º ººº ºº ºº ººº º ººº º ºº ºº ºº ºººº º ºº ºº ºº ºº ºº ºº º ºº ºº ºº ºº º º º ºº ºº ºº ºº ºº º º ºº ºº º ºº ºº º ºººº º º º ºº ºº º ººº º º º º ºº ºº ººº º ºº ºº ºº ºº º ºº ºº ºº º º º º º º º ºº ºº ºº º º ºº º º ºº º ººº ººº ººº ºº º º ºº ºº ºº º º º º º º ºº º º ºº ºº ºº º º º º º º º º º J ººº ººº ºº º ºº º º º G ºº º º º º º ºº º º º º º º º º º º º º G ºº º º º º º ºº º º º º º º º º º º ºº ºº ºº ºº ºº ºº º º º º º º ºº º ºººº ºº º ºº º º º º ºº º ºº ºº ºº ºº º º º º º ºº ºº º º º º º º ºº ºº ºº º ºº ºº ºº ºº º ºº º º º ºº ºº ºº ºº º ºº º º º º ººº ººº ºº ººº ººº ºº ºº º ºº º ºº º ººº ººº ºº ºº º ºº º ºº º ººº ººº ºº ºº ºº ººº ºº ººº ºº ººº ººº K ººº ººº D ººº ºº ºº ººº ººº D ºº ºº ºº ´µ ´ µ ÓÑ ÒÞÓ Ò Â ´ µ ÓÑ ÒÞÓ Ò À ÓÑ ÒÞÓ Ò ÙÖ º¾ Ö ÓÐ × Ö ÓÖ × Ð Ö Ó Ð ¬ ÙÖ º¾ ÙÒØÓ ÓÒ ÐÓ× Ö Ó× ÒÓ¹ Ö ÓÖ ×º Ì ÒØÓ Ò Ð ¬ ÙÖ ´ µ ÓÑÓ ´ µ¸ Ò Ò ÙÒ × Ò ÒØ Ð ÒÓ Ó À Ø Ò ÙÒ Ö Ó ÒÓ¹ Ö ÓÖ ÕÙ ÓÒ Ø ÙÒ Ò ×ØÖÓ Àº Ò Ð ¬ ÙÖ ´ µ¸ À × Ö Þ Ý ÓÒØ Ò Ó× Ö Ñ ×¸ ÐÓ ÕÙ × Ø × Ð Ð Ñ º¾º B F I J A D H C G L K ÙÖ º¾ ÍÒ Ö Ó × Ò ÔÙÒØÓ× ÖØ ÙÐ ÓÒ Lema 7.3 Ë G =< V, E > ÙÒ Ö Óº Ë T =< V, E >, E ⊂ E ÙÒ Ö ÓÐ Ö ÓÖ ÔÖÓ ÙÒ Gº Ë E ⊂ E Ð ÓÒ ÙÒØÓ Ö Ó× ÒÓ¹ Ö ÓÖ × ¸ Ó× ÔÓÖ ÐÓ× Ö Ó× ÕÙ ×Ø Ò Ò E Ô ÖÓ ÒÓ Ò E º ÒØÓÒ ×¸ ÙÒ ÒÓ Ó v ∈ G¸ ÕÙ ÒÓ × Ö Þ T ¸ × ÙÒ ÒÓ Ó ÓÖØ × Ý ×ÓÐÓ × v Ø Ò ÙÒ Ó w Ò T Ø Ð ÕÙ Ò Ò ÙÒ × Ò ÒØ w ר ÓÒ Ø Ó ÙÒ Ò ×ØÖÓ v Ò T ÔÓÖ ÙÒ Ö Ó ÒÓ¹ Ö ÓÖº Ò ÓØÖ × Ô Ð Ö ×¸ v × ÙÒ ÒÓ Ó ÓÖØ × ×Ø ÓÒØ Ò ÙÒ ×Ù ¹ Ö ÓÐ ÙÝÓ× Ö Ó× ÒÓ¹ Ö ÓÖ × ÒÓ ÓÒ Ø Ò ÒÓ Ó× Ò ×ØÖÓ× vº ÓÑÓ ÑÔÐÓ׸ ÓÒ× Ö Ð × ¬ ÙÖ × º¾ ¹ Ý º¾ ¹ º Ò Ð ¬ ÙÖ º¾ ¹ Ò Ò ÙÒÓ ÐÓ× Ö Ó× ÒÓ¹ Ö ÓÖ × Ð ×Ù ¹ Ö ÓÐ H ÓÒ Ö Þ I ÓÒ Ø ÙÒ Ò ×ØÖÓ Hº Ò Ð ¬ ÙÖ º¾ ¹ ¸ Ò Ò ÙÒÓ ÐÓ× ÒÓ Ó× Ð ×Ù ¹ Ö ÓÐ ÙÝ Ö Þ × F × ÓÒ Ø ÓÒ ÙÒ Ö Ó ÒÓ¹ Ö ÓÖ ÙÒ Ò ×ØÖÓ Hº
  • 668.
    642 Cap´ ıtulo 7. Grafos ÈÓÖ Ð ÓÒØÖ Ö Ó¸ Ò Ð Ñ Ð ¬ ÙÖ × º¾ Ú ÑÓ× ÕÙ ØÓ Ó ×Ù ¹ Ö ÓÐ ÓÒØ Ò ÙÒ Ö Ó ÒÓ¹ Ö ÓÖ ÕÙ ÓÒ Ø ÙÒ Ò ×ØÖÓ Ð Ö Þº Demostraci´n Ë Ñ Ð Ö Ð Ð Ñ ÒØ Ö ÓÖ¸ Ô Ö ÔÖÓ Ö Ð Ò × o Ò ÑÓ× Ð Ð Ñ × Ö ×ÙÔÓÒ ÑÓ× ÕÙ Ü ×Ø ÙÒ ÒÓ Ó ÓÖØ v Ø Ð ÕÙ ÙÒ × Ò ÒØ w Ø Ò ÙÒ Ö Ó Ò G ÕÙ ÓÒ Ø ÙÒ Ò ×ØÖÓ u vº Ì Ð × ØÙ ÓÒ ÔÙ Ô ØÓÖ Þ Ö× Ð × Ù ÒØ ÑÓ Ó u Ò ×ØÖÓ ÖÓ Ò ÆÓ Ó v ÓÖØ w × Ò ÒØ Ä Ô ØÓÖ Þ ÓÒ Ö Ú Ð Ð ÓÒØÖ ÓÒº Ò ÔÖ Ñ Ö ÐÙ Ö Ü ×Ø ÙÒ Ñ ÒÓ × u w Ô × Ò Ó ÔÓÖ v¸ ÔÙ × ×Ø ר ¬Ò Ó ÔÓÖ Ð Ö ÓÐ Ö ÓÖº Ë Ò Ñ Ö Ó¸ Ø Ñ Ò Ü ×Ø Ö ÙÒ Ñ ÒÓ × u w × Ò Ô × Ö ÔÓÖ vº Ä ÙÒ ÓÖÑ Ò ÕÙ Ó ÙÖÖ ×ØÓ × ÕÙ u Ý v Ô ÖØ Ò Þ Ò Ð Ñ ×ÑÓ ÓÑÔÓÒ ÒØ Ò ÓÒ ÜÓ ÕÙ Ù× Ö Ð ×ÙÔÖ × ÓÒ vº È ÖÓ ×ØÓ × ÙÒ ÓÒØÖ ÓÒ¸ ÔÙ × × Ô ÖØ Ò × Ò Ð Ñ ×ÑÓ ÓÑÔÓÒ ÒØ Ò ÓÒ ÜÓ¸ ÒØÓÒ × ÒÓ Ü ×Ø Ö ÙÒ Ñ ÒÓ ÒØÖ u Ý w Ô × Ò Ó ÔÓÖ v Ä ×Ù¬ Ò × Ñ × × ÑÔÐ º ËÙÔÓÒ ÑÓ× ÕÙ v Ø Ò ÙÒ Ó w Ø Ð ÕÙ Ò Ò ÙÒ × Ò ÒØ w ר ÓÒ Ø Ó ÙÒ Ò ×ØÖÓ v ÔÓÖ ÙÒ Ö Ó G ÕÙ ÒÓ Ô ÖØ Ò Þ T º ÒØÓÒ ×¸ Ñ ÒÓ Ò G × w ר Ð ÒÓ Ó Ö Þ T Ô × Ö ÔÓÖ v¸ ÐÓ ÕÙ Ò ¸ × ÙÒ Ð Ð Ñ º½¸ ÕÙ v × ÙÒ ÒÓ Ó ÓÖØ ר Ð Ñ ÔÓ Ö ÑÓ× × Ò Ö ÙÒ Ð ÓÖ ØÑÓ ÓÒ× ×Ø ÒØ Ò Ð ÙÐ Ö Ð Ö ÓÐ Ö ÓÖ × ÙÒ ÒÓ Ó Ù ÐÕÙ Ö º ÈÓÖ ÒÓ Ó w ÒÓ Ö Þ Ò Ð Ö ÓÐ Ö ÓÖ × ×Ø Ð Ò Ó× ÓÒ ÙÒØÓ× A Ý D Ò ×ØÖÓ× Ý × Ò ÒØ ׸ Ö ×Ô Ø Ú Ñ ÒØ º ÄÙ Ó × ÑÔÐ Ð ÓÒÓ Ñ ÒØÓ Ð Ð Ñ Ô Ö Ø ÖÑ Ò Ö × w × Ó ÒÓ ÓÖØ º ÙÒÕÙ ×Ø Ð ÓÖ ØÑÓ × Ö Ð Þ Ð ¸ ר Ö ÕÙ Ö Ñ ÑÓÖ Ô Ö Ð Ö ÓÐ Ö ÓÖ Ý Ð Ø ÖÑ Ò ÓÒ ÐÓ× ÓÒ ÙÒØÓ× A Ý D¸ ÐÓ Ù Ð ÒÓ × × ÑÔÐ Ö Ð Þ Öº ÓÖØÙÒ Ñ ÒØ ¸ Ó ÙÒÓ ÒÓ Ó v Ý ÙÒÓ ×Ù× Ó× w¸ Ü ×Ø ÙÒ Ñ Ò Ö Ò Ö Ø Ø ÖÑ Ò Ö Ù Ð × ÒÓ Ó× Ô ÖØ Ò Ò Ð ÓÒ ÙÒØÓ A ÐÓ× Ò ×ØÖÓ× v Ý Ð ÓÒ ÙÒØÓ D ÐÓ× × Ò ÒØ × wº È Ö ÐÐÓ¸ Ö ÕÙ Ö ÑÓ× Ð × Ù ÒØ ¬Ò ÓÒ Definici´n 7.1 (N´ mero o u ) Ë ÙÒ Ö Ó ÓÒ ÜÓ G =< V, E > ×Ó Ö Ð Ù Ð × Ö Ð Þ ÙÒ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ º Ë v ∈ V ÙÒ ÒÓ Óº ÒØÓÒ ×¸ (v) × ¬Ò ÓÑÓ Ð ÓÖ Ò Ð Ú × Ø ÙÒ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ Ò Ð Ù Ð (v) = 0º Ò ÓØÖ × Ô Ð Ö ×¸ (v) ÒÓØ Ð ÓÖ Ò Ú × Ø Ò ÙÒ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ º Corolario 7.1 Ë T ÙÒ Ö ÓÐ Ö ÓÖ ÔÖÓ ÙÒ ÙÒ Ö Ó G ÙÝÓ× ÒÓ Ó× ×Ø Ò Ø ÕÙ Ø Ó× × ÙÒ Ð ÓÖ Ò Ú × Ø º ÒØÓÒ × ½º Ä Ö Þ T × ÙÒ ÒÓ Ó ÓÖØ × Ý ×ÓÐÓ × ×Ø Ø Ò Ñ × ÙÒ Óº ר ×Ó ×Ø ÐÙ×ØÖ Ó Ò Ð ¬ ÙÖ º¾ ¹ ÓÒ Ð ÒÓ Ó ÓÖØ Hº ¾º ÍÒ ÒÓ Ó v¸ ÒÓ Ö Þ T ¸ × ÓÖØ × Ý ×ÓÐÓ × v Ø Ò ÙÒ Ó w Ø Ð ÕÙ Ò Ò ÙÒ × Ò ÒØ w ר ÓÒ Ø Ó ÔÓÖ ÙÒ Ö Ó ÒÓ¹ Ö ÓÖ ÙÒ ÒÓ Ó ÙÝÓ × Ñ ÒÓÖ ÕÙ (v)º
  • 669.
    7.5. Recorridos sobregrafos 643 ºººº ºººº ººº ºº º º D ºº ºº ºº ºº º º ºº ºº ºº ºººº ºº º ºº º ºº ºº ºº ºº ºº ºº ºº ºº ºº ºº º ºº ºº º ºº ºº ºº ººº ºº º ºº ºº º º ºº º º º º º º º B ºº H º ºº º ºº ººº ººº ººº ºº ºº ºº º ºº º º º º º ºº ººº ººº ºº ºº ºº ºº º º ºº ºº ºº ºº ºº ººº ºº ºº º º º º º º ºº ººº ºº ºº ºº ºº ºº ºº ºº ºº º º ººº º ºº º ºº º º º º º º ºº ºº º º ºº ºº ºº º º ºº ºº º ºº º ºº ºº ºº ºº º ºº º ºº º º ºº ºº ºº º º º ºº ºº º º º º º ºº ºº º º ºº º A º º º º º º º º º º º º J º ºº ºº ºº ºº º º º º º ºº ºº ºº º º F º ºº º º º º º ºº º ººº ºº º º ºº º ºº º ºº º ºº º º ºº º ºº º º ºº º º º ºº º º º ºº ººº ºº º º ºº º º º ºº ºº º ºº ºº º º º º º ºº ºº º º º º º º ºº º ºº ºº º º ºº º º º ºº º º º º º ºº ºº ºº ºº º º º ººº ºº º º º º º º º ºº ºº º ºº º ºº º ºº ººº ºº ºº ºº º º º º º ºº ºº ºººº º º º º º ºº ºº ºº º º º º ºº º º ºº ºº ºººº º ºº ºº ºº º C ºº ºº ºº º ºº º I º º º º ºº º º ºº º ºº º º º º º º º º º º ºººº º ººº º ºººº º º º ººº ººº ºººº B º ºº º ºº º ºººº ºº ºº º ºº ºº ºº º º º º º º º ºº ºº º º ºº º º ºº º ºº ºº ºº º º º º º ºº º º º ºº º º º º ºº º ºº ºº ºº ºº ºº º º º º º ºº ºº ºº º º º º º º ºº º º º ºº º ºº º ºº º º ºº ºº ºº ºº ºº º º º º º º º º º ºº º º º º ºº º º º º ºº º ºº º º º º º º º ºº º º º ºº ºº ºº ºº º º º º º º º º º ºº º º º º º ºº º ºº ººº ºº G ººº ººº ººº ººº º ººº ººº º º ºº º º º º ºº º º º ºº ºº º º ºº F ºº º º º ºº º º º º º º º ººº º º º º º º º ºº ºº ºº ºº ºº º º º º º A º ºº º º ºº º ºº º ºº ºº ºº º º ººº ºººº º º º ºº º ºº º ºº º ºº º º º º º ºº ºº º ºº º ºº º º º º ºº º ºº º ºº ººº ºººº ºº ºº ºº ºº º ºº º ºº º º º º º º º ºº º ºº º º º ººº ºº º ºººº ºº º º º ºº ºº ºº ºº ºº º ºº º ºº º ºººº º º ºº º º º ºº º º º º º ºº ºº ºº ºº º ºº ººº ºº ºº º º ºº º º º º º º ººº ººº ºº ººº ººº ºº º ºº º º º º º ºº ººº º º ººº ºº º º ºº º º ºº ºº º º ºº º º º º º º º º ºº º ºº º ºº º ºº º ºº ºº ººº ºº º ºº ºº º º º º º ºº º ºº º º º º º º º ººº ºº º ºº º ºº ºº ºº F ººº ººº ººº ººº º º º º ºº ºº ººº º º ººº ºº ºº ººº B ºº º ºº º ºº º º º º º º º º º º º º º º º º º º º ººº ºº º º º ºº º ºº º ººº ºº º º C ººº ºº º ºº º ºº º ººº ºº ººº ºº ºº ºº º ººº ººº º º º º º º ºº º ºº º º º ººº ºº ººº ºº º ºº º ºº º ºº º ºº º ºº º ºº ºº ºº ºº º ºº ºº º ºº º º ºº ººº º º º º º º º º º º ºº º ºº º º ºº º º ºº º ºº º ºº º º º ºº º º º ºº º º ºº º ºº º ºº º ºº º º º º º º º º ºº ºº ºº º º º º º º º º ºº ºº º ºº ºººº º ºº º º º ºº ºº ºº ººº º º º ºº º ºº º ºº º ºº º ºº ºº ºº º º º º ºº ºº º º ºº ºº ºº º ºº ºº ºº º ºº º º ººº ººº ººº ºº º ºº º º º ºº º º º º º º ºº º ºº ºº ººº ººº ºº º ºº º ººº º º ºº º º º º º º º ººº ººº ºº ººº ººº ººº H ººº ººº º º º º º º º º º º ºº º º º º º º º º º º º A ºº º º º ºº ºº º º º º º ºº ºº ºº º º ºº º º º ºº ºº º ºº º º º º º ºº º ººº ºº G ºº º ºº ºº º ºº º º º º º ººº º º ºº º º ºº º º º º ºº ºº ºº ºº ºº ºº º º ºº º º º º º º º ºº ºº ºº ºº ºº º º º ºº º ºº º ºº º º º ºº º ºº º ºº ºº º º ºº º º ºº ºº ºº ºº º ºº º ºº º ºº º º ºº º º º º º ºº º º ºº º º ºº ºº º ºº º º ºº ºº ºº º º º ºº º ºº ºº ºº ºº ºº º º º ºº ºº º º º º ºº º ºº º º º º º ºº ººº ººº ºº ºº º º ººº º º ºº ºº º ººº ººº ºº ºº º º º º º ºº ºº º ºº ºº ºº º º º ºº º ºº º º º º º º ºº º ºº ºº I ºººº ººº ººº ººº ºº º º º ººº ºº ºº ºº º ºº ºº º º ºº º º º º º ººº ºº º º C º ºº ºº ºº ºº º º º º º º º º º º º ºº º º D ºº ºººº ººº ººº ºº ºº º º º º º L ººº ººº ººº ººº º ºº ºº ºº º ººº ºº ºº ºº º º ºº ºº ºº º ºº ºº ººº º º ºº º º ººº ºº ºº º º ºº ºº ºº ºº ºº ºº º ºº º º ºº ºº º º ºº ººº ºº º º º º º ºº ºº ºº ºº ºº º º º º ºº º ºº ºº º º º ºº º º º ºº ºº º ºº º ºº ºº ºº º ºº ºº º ºº º ºº ºº º ºº º ºº º º º ºº ºº º ººº ºº º ººº º º ºº ºº ºº ºº ºº ºº º ºº ºº º ºº º º ºº º ºº ºº º º ºº º º ºººº ºººº º º º º ººº ºº ºº º ºº º ººº º º º ºº ººº ººº ºº ºººº º ºº º ºººº L º º º º º º ºº ºº ºº º ºº º º ºº º º ººº º º º º ººº ºº ººº ººº ººº G ºº º ºº º º º º ºº º ººº ººº º º ºº º º º ººº º º ºº º I º º º º º ººº ºº ºº ºº º ºº ºº ºº º ººº ºº º ººº º ºº º ºº ºº ººº º º º ºº º º º º º º º ºº º ºº º ºº ºº º ºº ºº º ºº ºº ºº ºº º ºº º ºº º ºº º º º º º º º º ºº º º ºº º º º º º ºº ºº ºº º ºº ºº ºº ºº ºº ººº º º º º º º º ººº ººº º ºº º ººº ººº ººº ºº º º ºº º º ºº º ºº º º º º ºº º º ººº ººº ºº º º º º º J ººº ººº ºº D º ºº ºº º º º ºº ºº ºº º ºº ºº º º º º L º º ºº º º ºº º º ºº ºº º J ººº ººº ººº º ºº º ºº ººº ºº ºº º º ºº ºº ºº ºº º ºº ºº ºº ºº ºº º ºº ºº º ººº º º º ºº ºº ºº ºº ºº ººº º ºº ºº ºº ºº ºº ºº ºº º º ººº ºº ºº ººº ººº ºº ººº ººº ºº º º º ººº ººº ºº º º ººº ººº ºº ººº ººº K ººº ººº H ºº ºº ºº º K K ´µ ´ µ ÓÑ ÒÞÓ Ò Â ´ µ ÓÑ ÒÞÓ Ò À ÓÑ ÒÞÓ Ò ÙÖ º¾ Ö ÓÐ × Ö ÓÖ × Ð Ö Ó Ð ¬ ÙÖ º¾ ÙÒØÓ ÓÒ ÐÓ× Ö Ó× ÒÓ¹ Ö ÓÖ ×º ÕÙ ÓÒ¬ÖÑ ÑÓ× ÕÙ ÒÓ Ü ×Ø Ò ÔÙÒØÓ× ÓÖØ ¸ Ô٠׸ Ò ØÓ × Ð × ¬ ÙÖ ×¸ Ô Ö ØÓ Ó ÒÓ Ó ÒÓ Ö Þ v¸ × ÑÔÖ Ý ÙÒ Ö Ó ÒÓ¹ Ö ÓÖ ÔÓÖ Ó ÕÙ ÓÒ Ø ÙÒ ÒÓ Ó Ò ×ØÖÓ vº ר Ô ÖØ Ð ÓÖÓÐ Ö Ó × ÐÓ Ñ ÒØ ÓÑÔÐ º Ò × ÒØ × ×¸ Ð ÓÖ ØÑ Ñ ÒØ ¸ Ð ÔÖÙ Ô Ö ÙÒ ÒÓ Ó v ÓÒ× ×Ø Ò ÓÒ× Ö Ö Ó w v Ý Ñ Ö Ö ØÓ Ó× ×Ù× × Ò ÒØ ׺ Ë ØÓ Ó× ÐÓ× Ö Ó× ÒÓ Ö ÓÖ × ØÓ Ó× ÐÓ× × Ò ÒØ × w ÓÒ Ø Ò ÒÓ Ó× ÓÒ Ñ ÒÓÖ ÕÙ (v) ÒØÓÒ × v × ÙÒ ÒÓ Ó ÓÖØ º È ØÓÖ Ñ ÒØ ¸ Ð ×ÙÒØÓ × ÓÖÖÓ ÓÖ Ò Ð × ¬ ÙÖ × º¾ ¹ Ý º¾ ¹ º Ò º¾ ¹ ¸ Ð ÒÓ Ó H¸ ÕÙ × ÓÖØ ¸ Ø Ò ÙÒ ×ÓÐ Ö Ñ ÓÒ Ö Þ I Ý × ÓÒר Ø ÕÙ Ò Ò ÙÒÓ ÐÓ× × Ò ÒØ × u ∈ {L, J, K} I × ÓÒ Ø ÔÓÖ ÙÒ Ö Ó ÒÓ¹ Ö ÓÖ ÓØÖÓ ÒÓ Ó u ÙÝÓ df(u) > (H) = 6º Ð Ñ ×ÑÓ ÑÓ Ó¸ Ô Ö Ð ¬ ÙÖ º¾ ¹ ¸ ÔÓ ÑÓ× Ú Ö ÕÙ ¸ Ô Ö Ð Ö Ñ ÙÝ Ö Þ × F¸ ×ÓÐÙØ Ñ ÒØ Ò Ò ÙÒÓ ×Ù× × Ò ÒØ × u ∈ {B, A, C, G, D} Ø Ò Ò df(v) > (H) = 2º Demostraci´n o ½º Ò ×Ø ×Ó Ð ÔÖÙ × ×ÔÖ Ò Ð Ð Ñ º¾ ¾º Ë ÙÒ Ð Ð Ñ º¿¸ × v × ÙÒ ÒÓ Ó ÓÖØ ¸ ÒØÓÒ × Ø Ò ÕÙ Ü ×Ø Ö ÙÒ Ó w ÙÝÓ× × Ò ÒØ × ÒÓ ÓÒ Ø Ò ÙÒ Ò ×ØÖÓ v ØÖ Ú × ÙÒ Ö Ó ÒÓ¹ Ö ÓÖº Ð ¬Ò ÓÒ Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ ¸ × ×ÔÖ Ò ÕÙ Ô Ö Ù ÐÕÙ Ö Ò ×¹ ØÖÓ u v =⇒ (u) < df(v)º ÈÓÖ Ø ÒØÓ¸ ØÓ Ó× ÐÓ× Ö Ó× ÒÓ¹ Ö ÓÖ × Ð ÙÒ
  • 670.
    644 Cap´ ıtulo 7. Grafos ººº ººº ººº D,0,- ºº ºº ºº ºº ºº ºº ºº º º ºº ºº ºº ºº º ºººº ºº º ºº ºº ºº ºº ºº ºº ºº ºº ºº ºº º ºº ºº º ºº ºº º ºº º ºº ºº ºº ºº º º º º ºº º º º º º º ºº ºº º ºº ººº ººº ºº B,1,0 ººº ººº ººº ºº ºº ºº º ºº ºº º º ºº ºº º ºº º º º ººº ºº ºº º º º º º ºº ººº º ºº ººº ºº ºº ºº ºº ºº º º º ºº º ºº ºº º º º ºº ºº º º ºº º º ºº ºº º ºº ºº ºº º ºº º º ºº º º º º ºº º º ºº A,2,0 ºº º º º º º º º º º º º J,0,- º º ºº º ºº ººº ºº º ºº º º º º º º º ºº º º º ºº º º º ºº ºº º ºº ºº º º º ºº º ºº ººº ºº º ºº ºº ºº º º º ºº ºº º ºº ºº º ººº ºº ººº ºº ºº ºº ºº º ºº ºº º ºº ºººº º ºº ºº º ºº ºº ºº º ºººº º ºº C,3,0 ºº ºº º ºº ºº º ºº ºº ºº º I,1,0 º ºº º ºº ºº ºº º º º ºº ºº ºº º ºº º º º ºº ºº ºº º º º º º º ºº ºº ºº º º ºº ºº ºº º º ºº ºº º º º ºº º º ºº º ºº ºº ºº º º º º º º ºº º ºº º º º ºº º º G,4,0 ººº ººº ººº ººº º ººº ººº º º ºº º º º º º º ºº º º º H,2,0 º º º º º º º ºº º ºº º º º H,0,- º º ºº ºººº ºººº ººº º º ºº ººº º º ºº º º ºº º ººº ºº º ºººº ºº º ººº ºº º º º º º ºº º ºº º º º º º ºº ºº ººº º ºº º ºº º º º º ººº ºº º º ºº º º ºº º ºº º ºº º º ºº º ºº º º º ºº ººº ºº º ºº º º º º ºº º º ºº F,5,0 º º º º º F,3,2 º ºº ºº ºº ºº ºº ºº º º º L,9,0 º ºº º F,1,0 ºº º ºº ºº ºº ºº ºº º º º ºº º º º I,7,0 ººº ººº ººº ººº ººº ºº ºº ºº ºº ºº ºº º º º º ºº ºº ºº ºº º º º º ººº ºº ºº ººº ºº ºº ºº ºº ºº º º º ºº ºº ºº ºº º º ºº ºº ºº ºº ºº º ºº ºº ºº º ºº ºº ºº º º º ºº ºº ºº ºº ºº ºº ºº º º º ºº ºº ºº º º ºº ºº ºº ºº º º º º ºº ºº º º ºº º ºº ºº ººº ººº ººº ºº ºº º ºº º ºº ºº ºº º ººº º º H,6,4 ººº ººº ººº º B,4,2 º ººº K,10,0 º º B,2,0 º ººº º º L,8,0 ºº ººº ººº ººº ººº ººº ººº ººº ºº ºº ººº ººº º ºº º ººº ººº ººº ºº ºº ºº º ºº º ººº ººº ººº º º ººº ººº ºº º ºº º º ººº ºº ºº ºº ºº ºº º ºº º º º º º ºº º º ººº ºº ºº ºº ºº ºº º ºº º º º º ººº ººº ºº º º º ººº ºº ºº º ºº ºº º ºº ºº º ºº º ºº º º ºº º ºº ºº º ºº ºº º ºº º ºº º º ºº ººº ºº ºº ººº º ºº ºº º º ºº º ºº º º º ºº º ºº º º ºº ºº º º ºº ºº º º ºº º º º º ºº º º ºº º º º º º ºº ºº º ºº ºº º ºº º ºº ºº ººº ºººº º º º º º ºº ººº ºº ºººº º º º ºº º ºº ºº ºº ººº º ºº ºº ºº º ºº ºº ºº º ºº º ºº º ºº º ºº ºº ºº º ºº º ºº º ººº ººº ºº º º º º º I,7,6 ººº ººº ººº ººº ººº ºº º º º º º ºº ºº A,5,2 º º º º º º º º º º º º º º º º º º º º ºº ºº A,3,0 º º º º º º º º º º º º º º º º º º º º º º J,9,7 ººº ººº ºº ººº ººº ºº ºº ººº º º º º º ººº º º º º ººº ºº º º ºº º ºº º º º º º ºº ºº º ºº º º º º º º ºº ºº ºº ºº ºº ºº ºº º ºº º º ºº º ºº º ºº ºº ºº º º ºº º º º º ºº ºº º º º ºº º º º º º º ºº ºº º ºº º ºº ºº ºº ºº º ºº º º º º ºº º º º ºº ºº ººº ººº ºº ºº º ºº ººº ººº ºº º º º º º º º º ººº ººº ºº ºº º º º º ººº ººº ºº ººº º º º ººº º º ººº º ººº ººº ººº ºº ººº ººº ººº ººº ººº L,8,6 º º º º º ºº º ºº º º ººº ººº º º ºº ºº C,6,2 ºº ººº ºº º º º ºº º º º ºº ºº ºº ºº ºº ºº ººº ººº º º ºº ºº C,4,0 ºº ººº ºº º º º ºº º º º ºº ºº ºº ººº ººº K,10,8 º º ºººº ºº ºººº º º º º ºººº ºº ºººº º ºº º ººº ºº ºº ºº º ºººº º º ºº ºº ºººº º ºº ºº ºº ºº ºº ºº º º ºº ºº ºº ºº º º º º º ºº ºº ºº ºº º º ºº º ºº ºº ºº º º ººº º º º º ºº ºº ºº ºººº º º º º ºº ºº ººº º ºº ºº ºº ºº º ºº ºº ºº º º ºº º º º º º º ºº ºº ºº º º ºº º º ºº º ººº ººº ººº ºº º º ºº ºº ºº º º º º ºº º º ºº ºº ºº º º º º º º º º º º J,9,7 ººº ººº ºº º º º º º º G,7,2 ºº º º º º º º º º º º º ºº º º º º º º º º G,5,0 ºº º º º º º ºº º º º º º º ººº º ºº º º º º º ºº º º º º º ºº ºº ºº ºº º º ºº º ºº ºº º º ºº º ºº ºº ºº ºº ºº º º ºº ºº º º º º ºº ºº º ºº ºº ºº º ºº º º ºº ºº º º ºº º ºº º ºº ºº º ºº ºº ºº ººº ººº ºº ººº ººº ºº ºº º ºº º ºº º ººº ººº ºº ºº º ºº º ºº º ººº ººº ºº ººº º ººº ºº ººº ºº ººº ººº K,10,8 ººº ººº D,8,3 ººº ºº ºº ººº ººº D,6,1 ºº ºº ºº ´µ ´ µ ÓÑ ÒÞÓ Ò Â ´ µ ÓÑ ÒÞÓ Ò À ÓÑ ÒÞÓ Ò ÙÖ º¾ Ö ÓÐ × Ö ÓÖ × Ð Ö Ó Ð ¬ ÙÖ º¾ ÙÒØÓ ÓÒ ×Ù× ÒÙÑ ÖÓ× ¸ ÐÓÛ Ý Ö Ó× ÒÓ¹ Ö ÓÖ × × Ò ÒØ ÙÒ Ó w v Ø Ò Ò ÕÙ ÓÒ Ø Ö ÒÓ Ó× ÙÝÓ× × Ò Ñ ÒÓÖ × ÕÙ (v)¸ ÔÙ × × ÒÓ Ð Ð Ñ º¿ ÒÓ × Ö ÖØÓ Ð ÓÖÓÐ Ö Ó ÒØ Ö ÓÖ ÒÓ× ÔÖÓÔÓÖ ÓÒ ÙÒ Ñ Ò Ö ÓÑÔÙØ ÓÒ ÐÑ ÒØ Ñ × ¬ ÒØ Ø ÖÑ Ò Ö ÐÓ× ÒÓ Ó× ÓÖØ ÙÒ Ö Óº × Ñ ÒØ ¸ ÔÓ Ö ÑÓ× Ð ÙÐ Ö ÙÒ ×ÓÐÓ Ö ÓÐ Ö ÓÖ Ò ÔÖÓ ÙÒ Ý¸ ÔÓÖ ÒÓ Ó ÔÐ ÑÓ× Ð ÓÒÓ Ñ ÒØÓ Ð ÓÖÓ¹ Ð Ö Ó º½º È Ö ÓÖÖ ÖÒÓ× Ð ÓÒרÖÙ ÓÒ Ð Ö ÓÐ Ö ÓÖ¸ ÒÙÒ Ö ÑÓ× Ð × Ù ÒØ ÓÒ¹ ÔØÓº Definici´n 7.2 (N´ mero o u ÐÓÛ) Ë G =< V, E > ÙÒ Ö Ó ÓÒ ÜÓ ×Ó Ö Ð Ù Ð × Ö Ð Þ ÙÒ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ º Ë v ∈ V ÙÒ ÒÓ Óº ÒØÓÒ ×¸ ÐÓÛ(v) × ¬Ò ÓÑÓ Ð Ñ Ò ÑÓ ÒØÖ (v) Ý ÐÓ× ÒÓ Ó× ÓÒ Ø Ó× v ÔÓÖ Ñ ÒÓ× ÓÒ ÓÖÑ Ó× ÔÓÖ Ö Ó× Ö ÓÖ × Ý ÒÓ¹ Ö ÓÖ ×º ÆÓØ × ÕÙ Ò ÙÒ Ö ÓÐ Ö ÓÖ¸ ÐÓ× Ö Ó× Ö ÓÖ × ×ÓÒ Ö Ó׸ Ñ ÒØÖ × ÕÙ ÐÓ× ÒÓ¹ Ö ÓÖ × ÒÓº ÑÔÐÓ× × ÑÙ ×ØÖ Ò Ò Ð × ¬ ÙÖ × º¾ Ý º¾ ÔÖ ×Ø × Ø Ò ÓÒ Ú Ö ¬ Ö ÕÙ ÐÓ× ÒÙÑ ÖÓ× ÐÓÛ ÒÓ Ó ´ Ü ÔØÓ Ð Ö Þµ¸ × ÓÖÖ ×ÔÓÒ Ò Ð ¬Ò ÓÒº ÍÒ ÓÖÑ ÐØ ÖÒ Ý¸ ÓÑÔÙØ ÓÒ ÐÑ ÒØ ¸ Ñ × ÓÒÚ Ò ÒØ ¬Ò Ö ÐÓÛ(v) × ÓÑÓ
  • 671.
    7.5. Recorridos sobregrafos 645 × Ù ⎧ ⎪df(v) ⎪ ⎨ ÐÓÛ(v) = Ñ Ò ÑÓ ÒØÖ (x) | x Ù ÐÕÙ Ö ÒÓ Ó ÓÒ Ø Ó v ÔÓÖ Ö Ó ÒÓ¹ Ö ÓÖ ´ º½µ ⎪ ⎪ ⎩ÐÓÛ(w) | w ÙÒ Ó v ÁÒ ÓÖÑ ÐÑ ÒØ ¸ Ð ÔÖÙ × ÑÙÝ × Ò ÐÐ × v × ÙÒ Ó Ò Ð Ö ÓÐ Ö ÓÖ¸ Ò¹ ØÓÒ × Ð Ø Ö Ö ÔÓ× Ð ÕÙ Ü ÐÙ Ý Ð × Ó× ÔÖ Ñ Ö × × ÓÖÖ ×ÔÓÒ Ò ÓÒ Ð ¬Ò ÓÒ º¾º ÐÓ ÓÒØÖ Ö Ó¸ Ò Ø ÖÑ ÒÓ× Ö ÙÖ× ÚÓ× ¸ ÐÓÛ(v) Ñ ÑÓÖ Þ Ð Ñ Ò ÑÓ ØÓ Ó× ×Ù× × Ò ÒØ ׺ Ä ÓÖÑ ÐØ ÖÒ ÒÓ× ÙÒ ÓÖÑÙÐ ÓÑÔÐ Ø Ô Ö Ø ÖÑ Ò Ö ÐÓ× ÔÙÒØÓ× ÓÖØ ÙÒ Ö Ó Ò ÙÒ ×ÓÐ ÜÔÐÓÖ ÓÒ¸ × Ò ÙØ Ð Þ Ö ÙÒ Ö ÓÐ Ö ÓÖ ÔÖÓ ÙÒ ÓÒ Ð¸ ÕÙ × Ö ×ÙÑ Ò Ð × Ù ÒØ ÓÖÓÐ Ö Ó Corolario 7.2 Ë T ÙÒ Ö ÓÐ Ö ÓÖ ÔÖÓ ÙÒ ÙÒ Ö Ó G =< V, E >º Ë v ÙÒ ÒÓ Ó ÕÙ ÒÓ × Ð Ö Þ T º ÒØÓÒ ×¸ v × ÙÒ ÒÓ Ó ÓÖØ × Ý ×ÓÐÓ v Ø Ò ÙÒ Ó w Ø Ð ÕÙ ÐÓÛ(w) ≥ (v)º Demostraci´n Ë o ×ÔÖ Ò Ö Ø Ñ ÒØ Ð × ÙÒ Ó ÔÙÒØÓ Ð ÓÖÓÐ Ö Ó º½º Ë ÐÓÛ(w) ≥ (v) ÒØÓÒ × Ò Ò ÙÒ × Ò ÒØ w × ÓÒ Ø ÙÒ Ò ×ØÖÓ v ººº ººº ººº ºº D,0,- ºº ºº ºº ºº ºº ºº ºº º ºº ººººº ºº º ºº º ºº ºº ºº ºº ºº ºº ºº ºº ºº ºº ºº ºº ºº ºº ºº ºº º ºº º ºº ºº º º º º º º º º º º º B,1,0 ºº ºº H,0,- º º º º ººº ººº ººº ºº ºº ºº º º ºº º º º º ºº ººº ºº ºº º ºº ºº ºº º º º ºº º ºº º ººº º ºº ºº ºº ºº º º ºº º º º º º ºº º ºº ºº ºº º ºº ºº º º º ºº º ºº º ºº º º º ºº ºº ººº ºº ºº ºº ºº ºº ºº º ºº ºº ºº º º º º º ºº ºº º ºº º ºº º º ºº ºº º ºº º º º º º º º ºº ºº º º º º ºº º º º A,2,0 º º º º º º º º º º º º J,0,- º ºº ººº º ºº ºº ºº º º ººº ºº ººº F,1,0º ºº º º º º º º ºº º ººº ºº º ºº º º º ºº ºº ºº ºº º ºº º º ºº º º º ºº º º º ºº º ºº ºº º º ºº º ºº º ºº ºº º ºº ºº º ºº º º ºº ºº º º º º º ºº º ºº ºº º º ºº º º º ºº º º º º ºº º ºº ºº ºº ºº º º º º º º º º º ºº ºº º º º ºº ºº ººº ºº ººº ºº ºº ºº º º º ºº º º ººººº º º º º º ºº º ººº ºº º º º º ºº º ººº ºº ºº ºººº ºººº C,3,0 ºº º º ºº º ºº ººº I,1,0 º º º ººº º ºº º º º º º º º º º º º º ººº º º ººº º ººº ºº º ººº º ºººº º ºº B,2,0 º ºº º ºº º ºººº ºº ºº º º ºº º º ºº º º º º º ºº ºº º º º º ºº º ºº ºº º º º º ººº º º º ºº ºº ºº ºº ºº º ºº º º º ºº ººº º ºº º º º ºº ºº º º º ºº º ºº ºº º ºº º º º º ºº ºº ºº º º º º º º º º ºº ººº º º ººº º º º º ºº ºº º º º ºº º º º º º º º º ºº º º º º º º ºº º ºº ººº ºº ºº ºº ºº º º º º º º º º º ºº º º º º ºº G,4,0 ºº ºº º ºº ººº ººº ººº ººº º º ºº ººº º º ºº º º º ºº º º º F,2,0 º ºº ºº ººº ºº º º º º º º º º º º º º º º ºº º º º º ºº ºº ºº ºº º º º º º º º º º º A,3,0 º ºº ºº º ºº º ºº ººº ºº ºº ºº º ºº º º ºººº ººº ºº ºº º ºº º ºº º ºº º ºº º ººº º ººº º ºº º º º º ººº ºº º ºº ºº ºº ºº º º º º º º º ºº ºº º º º ºº ººº ººº ºº ºº ººº ºº º ººº ºº º º ºº ºº ºº º º º ºº ºº º ºº º ºººº º º ºº º º º ººº º º º º º º ºº ºº º º ºº º ºº º º ºº º º ºº º º º º º ººº ºº º º ºººº ººº º º ºº ººº ºº ººº º º º º º ºº º º ºº º º ºº º º º º º º ºº ººº º ººº ºº ºº º º º ººº º ºº ºº º º ºº º º º º ººº ººº ºº º º ºº º ºº º ºº ººº ººº º º º º º º ºº º F,5,0 ººº ººº ººº ººº ººº ºº º º º º º º ºº º ºººº º ºº º ººº º º B,3,0 ººº ººº ºººº ºº º º ºº º ºº º º º º º º ºº º º º º º º º º ºº º ººº º º º ºº º ºº º ººº ººº ºº º º C,4,0 ºº º ºº º ºº º º ºº ººº ºº ºº ºº º ºº º º º º º ºº ºº º º ºº º º º ºº º º º º º ºº ºººº ºº º º º ºº ºº ºº º ºº º ºº º º ºº º º º ººº ºº ºº ººº ºº º º º º ºº ºº º º º º ºº º º º º º º º º º º º º ºº ºº ºº º ºº º º ºº º º º ºº º ºº º º ºº º º º º ºº º ºº º ºº º º º º º º ºº º ºº º ºº º º º ºº ºº ºº º º ºº º º º º º º º ºº º º ººº ºº ºº º ºº ºº º º ººº ººº ººº ºº ºº º ºº º ºº º º º º º ºº ºº ºº º º ºº ºº ºº º ºº ºº ºº º º ººº º º ºº º º º º º º ºº º ººº º ººº ººº ºº º ºº º ºº º º º º º º º ººº ººº ºº H,6,4 ººº ººº ººº ººº ººº º º º º º º º º º ºº º º º º º º A,4,0 º ºº ºº ºº ºº ºº º º º º ºº ºº ºº º º ºº º º º º ºº ºº º ºº º ººº º ºº ºº G,5,0 º º ºº ºº º ºº º º º º ºº º º º º ºº ºº ºº º ºº ºº ºº ºº ºº º ºº º ºº ºº ºº ºº ºº ºº º ººº º ºº º º º º ºº ºº ºº º º ºº º º º ºº º ºº º ºº ºº º º ºº º ºº º º º ºº ºº º ºº ºº º º º º º º ºº º ºº º ºº ºº º ºº º º º º º ºº º ºº º º ººº ºº º º º º ºº º º º º º ºº º º ºº ºº ºº º º ºº º º ºº ºº º ºº ºº º ººº ººº º º ººº º ººº ºº º º ºº º º º º º º º º ººº ººº º º º º ºº ººº ºº ºº º º º º ºº ºº ºº ºº º º º º º º ºº º º º ºº º I,7,4 ºººº ººº ººº ºº ºº º º ººº ºº ºº º ºº ºº º ºº ºº º º º º ººº ººº C,5,0 º º º ºº ºº ºº ºº º º º º º ºº º ºº º D,6,1ºº º º º º º º º º ºººº ººº ºº º L,7,0 ººº ººº ººº ºº ºº ºº ºº ººº ºº ºº ººº ººº º º ºº ºº º ºº ºº ºº ººº ºº ºº ºº º ººº ººº ºº ºº º º ºº º ºº ºº ºº ºº º ºº º º ºº ºº ºº ºº ºº º º ºº º º º ºº ºº ºº º º º º º º º ºº ºº ºº ºº º º º º º º º ºº ºº º º ºº º º ºº º ºº ºº ºº ºº º ºº º ºº ºº ºº º ºº ºº º º º º º ºº º º ºº ºº º ººººº º ººº º ºº º ºº ººº ºº ºº ºº ºº ºº ºº ºº º ºº º ºº º ºº º º º ºº ºº ºº º º ºº ºº º ºººº ºººººº º º ººº ºº ºº ºº ºº º º ºº º º ººº ºº ºº ººº º ºL,8,4 ººº ººº ºº º º º º º º ºº ºº ºº º ºº º ºº º º ººº º º ººº º G,6,0 ººº ººº ºº ºº º ººº º º ººº º ºº º ºº º ºº º º I,8,0 º ºº º º º º º º º º ºº º ºº º ºº ººº ºº ºº ºººº ººº º ºº º º º º º ººº ºº ºº ºº ºº º ºº º ºº ººº º º º º ºº ºº º ºº ºº ºº º ººº ºº ººº º ºº º º º ºº º º ºº ºº º ºººº ºº º º ºº ºººº º º ºº º ºº º ºº º º º º º ºº ºº ºº ºº º ºº º ºº ºº º º º º º º º ººº ºº ºº ºº ººº ººº ºº ºº ºº º º ºº º ºº ºº ºº º º º º º ººº ººº ºº º º J,9,7 ººº ººº ººº D,7,2 ºº ºº ºº ºº ºº L,8,0 º º º º º º º º J,9,7 ººº ººº ººº º º º º ºº º ºº º º ºº ºº ºº º ºº ºº º ºº ºº º ºººº º º ºººº º º º ºº ºº ºº ºº ºº ºº º º ºº º º ºº ºº ºº º º º ºº ºº ºº ºº ºº ºº ºº ºº ºº º º ººº ººº ºº ººº ººº ºº ºº ºº ºº º ººº ºº ºº º ºº ººº ººº ºº ºº ººº ººº ºº ººº ººº K,10,8 ººº ººº H,9,1 ºº K,10,0 ºº ºº K,10,7 ´µ ´ µ ÓÑ ÒÞÓ Ò Â ´ µ ÓÑ ÒÞÓ Ò À ÓÑ ÒÞÓ Ò ÙÖ º¾ Ö ÓÐ × Ö ÓÖ × Ð Ö Ó Ð ¬ ÙÖ º¾ ÙÒØÓ ÓÒ ×Ù× ÒÙÑ ÖÓ× ¸ ÐÓÛ Ý Ö Ó× ÒÓ¹ Ö ÓÖ ×º
  • 672.
    646 Cap´ ıtulo 7. Grafos ÈÖ Ö Ñ × ÓÑÔÖ × Ð Ð ÒרÖÙÑ ÒØ ÓÒ Ð Ð ÓÖ ØÑÓ ÕÙ Ø ÖÑ Ò ÐÓ× ÔÙÒØÓ× ÓÖØ ¸ ÔÐ ÒØ ÑÓ× Ð × × Ù ÒØ × ÔÖ Ñ Ø Ú × ÈÙÒØÓ× ÓÖØ ≡ template <class GT> inline static long & df(typename GT::Node * p) template <class GT> inline static long & low(typename GT::Node * p) Ä × Ù Ð × Ö ØÓÖÒ Ò ÐÓ× Ú ÐÓÖ × (p) Ý ÐÓÛ (p)¸ Ö ×Ô Ø Ú Ñ ÒØ º ÓÑÓ ÔÓ ÑÓ× ÔÖ Ö¸ Ð Ú ÐÓÖ Ð ÓÒØ ÓÖ ÒÓ Ó × Ù× Ô Ö ÐÑ Ò Ö ¸ Ñ ÒØÖ × ÕÙ Ð Ð ÔÙÒØ ÖÓ ÓÓ Ô Ö ÐÑ Ò Ö ÐÓÛ(p)º רӏ ÔÓÖ ×ÙÔÙ ×ØÓ¸ ÑÔ Ð Ð ÙÐÓ ÐÓ× ÔÙÒØÓ× ÓÖØ × ÐÓ× ÓÓ × ÐÓ× ÒÓ Ó× ×Ø Ò × Ò Ó ÙØ Ð Þ Ó׺ ÒØ × ÓÑ ÒÞ Ö Ð Ð ÙÐÓ¸ Ò Ò Ð Þ Ö× ÐÓ× ÒÓ Ó× Ý Ö Ó× Ð Ö Ó ÐÓ ÕÙ × Ö Ð Þ Ð × Ù ÒØ ÓÖÑ ÁÒ Ð Þ Ö ÒÓ Ó× Ý Ö Ó× ≡ ´ µ Operate_On_Nodes <GT, Init_Low <GT> > () (g); g.reset_arcs(); ÓÒ Ð Ò Ð Þ ÓÒ ÙÒ ÒÓ Ó ×Ø ÒרÖÙÑ ÒØ ÔÓÖ Ð Ð × Init Low¸ ÙÝ ×Ô ¹ ¬ ÓÒ × ÓÑÓ × Ù ÈÙÒØÓ× ÓÖØ +≡ template <class GT> struct Init_Low { void operator () (GT & g, typename GT::Node * node) { g.reset_counter(node); // inicializa df low <GT> (node) = -1; // inicializa low } }; Ð × Ù ÒØ Ô ×Ó × ¬Ò Ö Ð ÒØ Ö Þ¸ ÐÐ Ñ compute cut nodes(g, start, list)¸ ÙÝÓ× Ô Ö Ñ ØÖÓ× ×ÓÒ Ð Ö Ó¸ Ð ÒÓ Ó Ò Ó Ù×ÕÙ Ý ÙÒ Ð ×Ø ×Ó Ö Ð Ù Ð × ÐÑ Ò Ò ×Ù× ÔÙÒØÓ× ÖØ ÙÐ ÓÒ ÈÙÒØÓ× ÓÖØ +≡ ¾ template <class GT, class SA> void compute_cut_nodes(GT & g, typename GT::Node * start, DynDlist<typename GT::Node *> & list) { ÁÒ Ð Þ Ö Ø ÓÒ ÒÓ Ó× ÓÖØ ÜÔÐÓÖ Ö Ö ÙÖ× Ú Ñ ÒØ Ð × Ö Ñ × ×Ø ÖØ Î Ö ¬ Ö × ×Ø ÖØ × ÙÒ ÒÓ Ó ÓÖØ } Í× × DynDlist ¿ º Ä ÖÙØ Ò Ø Ò ØÖ × × × ÙÝ × ÙÒ ÓÒ × ×Ø Ò Ð Ö Ñ ÒØ ÒÙÒ ×º Ô ÖØ Ö Ò Ö ÐÓ× Ö Ó× Ý ÒÓ Ó׸ Ö ÕÙ Ö ÑÓ× Ð ÓÒØ ÓÖ ÐÓ Ð Ú × Ø × ÕÙ Ø ÖÑ Ò Ö Ð ÒÓ Ó¸ Ð ÒÓ Ó Ò Ð ÔÓÖ ÓÒ ÓÑ ÒÞ Ö Ù× Ö Ý ÙÒ ÓÒØ ÓÖ ÐÐ Ñ × Ð ÜÔÐÓÖ ÓÒ Ö ÙÖ× Ú ¸ Ð Ù Ð × Ö ÑÔÐ ÒØ ÔÓÖ compute cut nodes() ÁÒ Ð Þ Ö Ø ÓÒ ÒÓ Ó× ÓÖØ ≡ ´ µ ÁÒ Ð Þ Ö ÒÓ Ó× Ý Ö Ó× long current_df = 0; // contador global de visitas
  • 673.
    7.5. Recorridos sobregrafos 647 NODE_BITS(start).set_bit(Depth_First, true); // pintar visitado start df <GT> (start) = current_df++; int call_counter = 0; // contador llamadas recursivas call counter Ù ÒØ Ð ÒØ ÐÐ Ñ × Ö Ð Þ × compute cut node()¸ ÐÓ Ù Ð ÐÙ Ó Ô ÖÑ Ø Ö Ø ÖÑ Ò Ö × start × Ó ÒÓ ÙÒ ÒÓ Ó ÓÖØ º Ä × × Ù ÒØ × Ð ÜÔÐÓÖ ÓÒ Ö ÙÖ× Ú ØÓ Ó× ÐÓ× ÒÓ Ó× ÓÒ Ø Ó× ÔÓÖ start ÜÔÐÓÖ Ö Ö ÙÖ× Ú Ñ ÒØ Ð × Ö Ñ × ×Ø ÖØ ≡ ´ µ // Recorra los arcos de start mientras g no haya sido abarcado for (Node_Arc_Iterator<GT, SA> i(start); i.has_current() and current_df < g.get_num_nodes(); i.next()) { typename GT::Node * tgt = i.get_tgt_node(); if (IS_NODE_VISITED(tgt, Depth_First)) continue; typename GT::Arc * arc = i.get_current_arc(); if (IS_ARC_VISITED(arc, Depth_First)) continue; ARC_BITS(arc).set_bit(Depth_First, true); __compute_cut_nodes <GT, SA> (g, list, tgt, arc, current_df); ++call_counter; } Í× × Node Arc Iterator º Ë ÙÒ Ð ÔÖ Ñ Ö ÔÙÒØÓ Ð ÓÖÓÐ Ö Ó º½¸ start × ÙÒ ÒÓ Ó ÓÖØ × Ð Ö ÓÐ Ö ÓÖ ÔÖÓ ÙÒ ÓÒ Ö Þ start Ø Ò Ñ × ÙÒ Óº Ò ÐÓ Ø ÖÑ ÒÓ× ×Ø Ð ÓÖ ØÑÓ¸ ×ØÓ ×Ø Ø ÖÑ Ò Ó ÔÓÖ Ð ÒØ Ú × ÕÙ × ÜÔÐÓÖ Ö ÙÖ× Ú Ñ ÒØ ÙÒ ÒÓ Ó ÓÒ Ø Ó start Ó ÓØÖÓ ÑÓ Ó¸ Ð ÒØ Ú × ÕÙ × ÐÐ Ñ compute cut nodes()º Ë × ÐÐ Ñ ÙÒ ×ÓÐ Ú Þ¸ ÒØÓÒ × Ð Ö Ó × ÓÑÔÐ Ø Ñ ÒØ Ö Ó × Ð ÔÖ Ñ Ö Ö Ó Ú ×ØÓ × start Ý ÔÓÖ ÐÓ Ø ÒØÓ start ÒÓ ÔÙ × Ö ÙÒ ÒÓ Ó ÓÖØ º ÐÓ ÓÒØÖ Ö Ó¸ × Ò ÑÔÓÖØ Ö Ð Ú ÐÓÖ Ü ØÓ call counter¸ start × ÓÖØ º ÄÓ ÒØ Ö ÓÖ × ÜÔÖ × ¸ ÒØÓÒ ×¸ Ð × Ù ÒØ ÑÓ Ó Î Ö ¬ Ö × ×Ø ÖØ × ÙÒ ÒÓ Ó ÓÖØ ≡ ´ µ if (call_counter > 1) // ¿es la ra´z un punto de articulaci´n? ı o { NODE_BITS(start).set_bit(Cut, true); list.append(start); } Ú Þ ÕÙ × Ø Ø ÙÒ ÒÓ Ó ÓÖØ ¸ ר × Ñ Ö Ö ÓÒ Ð Ø Cut¸ Р٠и ÐÙ Ó¸ ÒÓ× × ÖÚ Ö Ô Ö Ñ Ö Ö ÐÓ× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× ×Ó Ó× ÐÓ× ÔÙÒØÓ× ÓÖØ º Ä ÒØ Ö Þ Ð ÜÔÐÓÖ ÓÒ Ö ÙÖ× Ú ¸ compute cut nodes()¸ × ÜÔÖ × Ò Ð × ¹ Ù ÒØ ÐÓÕÙ ¬Ò ÓÒ Ð Ö ÓÖÖ Ó Ö ÙÖ× ÚÓ Ô Ö ÐÓ× ÔÙÒØÓ× ÓÖØ ≡ template <class GT, class SA> inline static void __compute_cut_nodes(GT & g, DynDlist<typename GT::Node *> & list, typename GT::Node * p, typename GT::Arc * a, long & curr_df); Í× × DynDlist ¿ º
  • 674.
    648 Cap´ ıtulo 7. Grafos ÙÝÓ× Ô Ö Ñ ØÖÓ× × ¬Ò Ò ÓÑÓ × Ù ½º g Ð Ö Óº ¾º list Ð Ð ×Ø ÒÓ Ó× ÓÖØ º compute cut nodes() Ò ÔÙÒØÓ ÓÖØ Ò ÓÒØÖ Ó ×Ø Ð ×Ø º ¿º p Ð ÒÓ Ó ØÙ ÐÑ ÒØ × Ò Ó Ú × Ø Óº º a Ð Ö Ó × Ð Ù Ð × Ð ÒÞ pº ר ׸ Ò Ð Ö ÓÐ Ö ÓÖ ÔÖÓ ÙÒ ¸ Ð Ö Ó ÕÙ ÓÒ Ø ×Ù ÒÓ Ó Ô Ö º º curr df Ð Ú ÐÓÖ ØÙ Ð Ð ÓÒØ ÓÖ Ú × Ø × ÕÙ × Ö × Ò Ó Ð ÒÓ Ó × Ò Ó Ú × Ø Ó ÓÑÓ ×Ù Ú ÐÓÖ º Ä ÑÔÐ ÒØ ÓÒ compute cut nodes() Ò Ð Ö ÙÖ× ÓÒ¸ Ð Ð ÙÐÓ ÐÓ× Ú ÐÓ¹ Ö × ÐÓÛ ÒÓ Ó Ý Ð ×Ø Ò ÓÒ ÕÙ Ð ÒÓ Ó Ú × Ø Ó × Ó ÒÓ ÙÒ Ó ÒØÖÓ Ð Ú ÒØÙ Ð Ö ÓÐ Ö ÓÖ ÔÖÓ ÙÒ ÁÑÔÐ ÒØ ÓÒ Ð Ö ÓÖÖ Ó Ö ÙÖ× ÚÓ Ô Ö ÐÓ× ÔÙÒØÓ× ÓÖØ ≡ template <class GT, class SA> inline static void __compute_cut_nodes(GT & g, DynDlist<typename GT::Node *> & list, typename GT::Node * p, typename GT::Arc * a, long & curr_df) { NODE_BITS(p).set_bit(Depth_First, true); // pinte p como visitado low <GT> (p) = df <GT> (p) = curr_df++; // as´gnele df ı // Recorrer recursivamente arcos de p mientras g no haya sido abarcado bool p_is_cut_node = false; for (Node_Arc_Iterator <GT, SA> i(p); i.has_current(); i.next()) { typename GT::Arc * arc = i.get_current_arc(); if (arc == a) continue; // a es el padre de arc ==> ignorarlo por definci´n o typename GT::Node * tgt = i.get_tgt_node(); // nodo destino de arc if (IS_NODE_VISITED(tgt, Depth_First)) { if (not IS_ARC_VISITED(arc, Depth_First)) // ¿es arco no-abarcador? if (df <GT> (tgt) < low <GT> (p)) // s´, verificar valor de low ı low <GT> (p) = df <GT> (tgt); // actualizar low(p) continue; } if (IS_ARC_VISITED(arc, Depth_First)) continue; ARC_BITS(arc).set_bit(Depth_First, true); // marque arco __compute_cut_nodes <GT, SA> (g, list, tgt, arc, curr_df); if (low <GT> (tgt) < low <GT> (p)) // verificar hijo de p - low(tgt) low <GT> (p) = low <GT> (tgt); // actualizar low(p) if (low <GT> (tgt) >= df <GT> (p) and df <GT> (tgt) != 0) // ¿de corte? p_is_cut_node = true;
  • 675.
    7.5. Recorridos sobregrafos 649 } // p fue explorado recursivamente if (p_is_cut_node) { NODE_BITS(p).set_bit(Cut, true); list.append(p); } } Í× × DynDlist ¿ Ò Node Arc Iterator º Ä ÖÙØ Ò ÔÖÓÚ Ð ÔÖÓÔ Ó Ö ÓÖÖ Ó ×Ó Ö ÐÓ× Ö Ó× Ô Ö Ð ÙÐ Ö ÐÓÛ(p) Ü Ø ¹ Ñ ÒØ × ÙÒ Ð ÓÖÑÙÐ ´ º½µº ÁÒ ÐÑ ÒØ ¸ ÐÓÛ(p) = (p) ÐÙ Ó¸ ÙÖ ÒØ Ð Ò×Ô ÓÒ ÐÓ× Ö Ó× p¸ × Ø ÖÑ Ò × × ØÖ Ø Ð Ö Ó Ô Ö ¸ ÙÒ Ö Ó ÒÓ¹ Ö ÓÖ Ó ÙÒ Óº Ñ Ö ×Ó Ö ÙÒ Ö Ó Ó Ó ÙÒÓ ÒÓ¹ Ö ÓÖ Ú Ö ¬ × Ý ÙÒ Ú ÐÓÖ Ñ ÒÓÖ Ô Ö ÓÐÓ ÖÐ ÐÓÛ(p)º × ÑÙÝ ÑÔÓÖØ ÒØ Ö Ð Ö Ð ÓÖÑ Ò ÕÙ Ð Ð ÓÖ ØÑÓ ×Ø Ò Ù Ð × ØÖ × Ð × × Ö Ó׺ ÄÓ× Ö Ó× ÒÓ¹ Ö ÓÖ × × ÒØ ¬ Ò ÔÓÖÕÙ ÒÓ ×ÓÒ Ñ Ö Ó× ÓÒ Ð Ø Depth Firstº Ð Ö Ó Ô Ö × ×Ø Ò Ù Ñ ÒØ Ð Ô Ö Ñ ØÖÓ aº Ò ÐÑ ÒØ ¸ ÐÓ× Ö Ó× Ð Ö ÓÐ Ö ÓÖ × ×ÓÒ Ñ Ö Ó× Ù×ØÓ ÒØ × Ð ÐÐ Ñ Ö ÙÖ× Ú º 19 18 20 16 17 15 9 8 14 21 28 27 23 26 13 10 7 1 22 24 25 11 12 2 3 4 5 6 ÙÖ º¿¼ ÍÒ Ö Ó ÓÒ Ú Ö Ó× ÔÙÒØÓ× ÓÖØ ÈÙ ×ØÓ ÕÙ Ô Ö Ø ÖÑ Ò Ö × p × ÙÒ ÒÓ Ó ÓÖØ × Ò × Ö Ó Ò×Ô ÓÒ Ö ØÓ Ó× ×Ù× Ö Ó× ´ Ö ÓÖ × Ý ÒÓ¹ Ö ÓÖ ×µ¸ Ð Ø Ò ÓÒ Ð Ö ÓÖÖ Ó Ö× Ù Ò Ó × Ý Ò Ñ Ö Ó ØÓ Ó× ÐÓ× Ö Ó× Ý ÒÓ ØÓ Ó× ÐÓ× ÒÓ Ó׺ ×ÔÙ × ÙÒ ÐÐ Ñ Ö ÙÖ× Ú ¸ × × ÕÙ tgt × ÙÒ Ó pº ÈÓÖ × Ö ÞÓÒ¸ × ÓÑÔ Ö ÐÓÛ(tgt) ≥ (p) Ô Ö Ø Ø Ö × p × ÙÒ ÒÓ Ó ÓÖØ º Ð Ð ÓÖ ØÑÓ ÔÖÓÔ Ð Ñ ÒÓÖ Ú ÐÓÖ low × Ð × Ó × ×Ø ×Ù× Ò ×ØÖÓ׸ ÔÙ × Ð × Ñ ÑÓÖ Þ Ö × Ü ×Ø ÙÒ Ö Ó ÒØÖÓ ÙÒ × Ò Ò ÕÙ ÖÙ Ó ÒÓ ÙÒ × Ò Ò º
  • 676.
    650 Cap´ ıtulo 7. Grafos 1,0,- ºº ºº ºº ºº ºº ºº ºº ºº º ºº ºº ºº ºº ºº º º ºº ºº ºº ºº ºº ºº ºº ºº ºº ºº º ºº ººº ºº º º ºº ºº 2,1,0 º ºº º º º 7,6,6 º ºº ºº ºº ºº º 14,13,13 º º º º º ººº º º ºº ºº º º 21,20,0 º º º ºº º º º ºº º ºº ºº º º º º ºº º º º º ºº º º º º º ºº ºº ºº º º º ºº º ºº º º ºº º º º º º ºº º º º º º º º º º º ºº ºº º º º º º º º º ºº ºº º º º º º ºº º º º ºº º º º ºº º ºº ºº ºº º º º º ºº º º º º º ºº ºº ºº º º º º º º º º º º º º º º 5,2,0º ºº º º º º º º º 8,7,6 º ºº º ºº º º º º 15,14,13 º º º º º º ºº ºº ºº ºº ºº ºº 23,21,0 º º º º º º º º º º º ºº ºº ºº ºº º º º º º º º º º º ºº ºº ºº º º º º º º º º º º º ºº º ºº º ºº ºº º º º º º º º º ºº ºº ºº º º º ºº ºº º º º ºº º º º ºº º º º º º º º ºº º º ºº ºº º º º º º º º º º º º º º º ºº º º º º º º º ºº ºº ºº º ºº º º ºººº º º º º º º º º º ººº º º ºº ºº º º ºº º º ººº ºº º ºº º º º ºº º º º º º º º 4,3,0 º º º º º º º º ººº º ºº º ºº º 10,8,6 º º º ºº ºº º 18,15,13 º º º º º º º ºº ºº º ºº 22,22,0 28,23,21 ºº ºº º º º º º º º º º º º º º º º ºº º ºº ºº º ºº º º ºº º º º º ºº º º ºº º º º ºº º º º º º º ºº º º º º º º ºº º ºº ºº ºº º ºº º º º ºº º ºº º º ºº º ºº º ºº º ºº º º º ººº º º º º º º º º ºº ºº ºº º º º º º º º º º º º º º º º º º º ºº º º º º º º º ºº º º ºº ºº ºº º º ºº º º º º º º º ºº ºº ºº ºº º ºº º º º ºº ºº ºº º º º º º º º º º º º º º º 6,4,0 º º ºº ºº ºº ºº º 9,9,6 ºº º ºº º 19,16,13 º º º º º º º º º º º º º 24,24,21 º º º º º º º º º º ºº ºº º º º º º º º ºº ºº ºº º ºº º º º º º º º º º º º º ºº º ºº º º º º º º º º º º º º º º ºº ºº ºº º º º º º º º º º ºº º º º º ºº ººº º º º º º º º º º º º º º º º º º ºº º ºº º º º º º º º º º º ºº º ºº º º º ºº º º º º ºº ºº º º º º º º º º º 3,5,0 º ºº ººº ºº ºº ºº ºº 13,10,6 º º º 20,17,13 16,19,13º º º º º º ºº º º º º27,25,23 º ºº ºº º ºº ºº ºº ºº º º º ºº ºº ºº º º º º º º ºº ºº º º º º ºº º º º ºº ºº º º º ºº ºº ºº º º ºº ºº º ºº º º º º º ºº º º ºº º º ºº ºº ºº º º º º º º º º ººº º º ºº ºº ºº º ººº ººº º ºº ºº ºº ºº 11,11,6 º 17,18,13 25,26,24 º ºº º º º º º ºº ºº ºº º ºº º º º ºº ºº ºº º º º ºº ºº ºº ºº ºº º º º º º ºº º º º º 12,12,6 26,27,25 º º º ÙÖ º¿½ Ö ÓÐ Ö ÓÖ ÔÖÓ ÙÒ Ð Ö Ó Ð ¬ ÙÖ º¿¼ ÙÒØÓ ÓÒ ×Ù× Ý ÐÓÛº 7.5.15 Componentes conexos de los puntos de corte ÍÒ Ú Þ ÕÙ ÑÓ× Ð ÙÐ Ó ÐÓ× ÔÙÒØÓ× ÓÖØ ¸ ÔÙ × Ö × Ð ÓÒÓ Ö Ù Ð × ×ÓÒ ×Ù× “componentes conexos” Ó¸ Ø Ñ Ò¸ “bloques” × Ö¸ ÐÓ× ×Ù Ö Ó× Ö ×ÙÐØ ÒØ × ×ÙÔÖ Ñ Ö ÐÓ× ÔÙÒØÓ× ÓÖØ º ÍÒ ÔÖ Ñ Ö Ý ÑÙÝ × ÑÔÐ Ð ÓÖ ØÑÓ Ô Ö Ø ÖÑ Ò Ö ÐÓ× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× ÓÒ× ×Ø Ò ØÓÑ Ö ÙÒ ÓÔ Ñ Ô Ð Ö Ó Ý ×Ó Ö ×Ø Ð Ñ Ò Ö ×Ù× ÒÓ Ó× ÓÖØ º ÄÓ× ×Ù Ö Ó× Ö ×ÙÐØ ÒØ × ×ÓÒ Ö Ø Ñ ÒØ ÐÓ× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× Ð Ö Óº Ð ÔÖÓ Ð Ñ ×Ø Ð ÓÖ ØÑÓ × ÕÙ ÔÙ × Ö ÓרÓ×Ó Ò ×Ô Ó × Ð Ö Ó × ÑÙÝ Ö Ò º Ò Ò ÙÖ ¸ ÔÙ × Ö ÒØ Ö × ÒØ ¸ ÒÓ ×ÓÐÓ Ø Ò Ö ÐÓ× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× × ÒÓ Ð Ö ×ØÓ Ð Ö Ó ÓÖ Ò Ð ÑÓ Ó Ø Ð ÕÙ ¸ ÔÙ Ö ÑÓ× Ö ÓÒרÖÙ ÖÐÓ Ô ÖØ Ö ×Ù× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ׸ ÔÙÒØÓ× ÓÖØ Ý Ö Ó× ÕÙ ÓÒØ Ò Ò Ð Ñ ÒÓ× ÙÒ ÔÙÒØÓ ÓÖØ º × ÑÓÑ ÒØÓ ÒØÖÓ Ù Ö Ó× ÒÙ Ú × ¬Ò ÓÒ ×º Definici´n 7.3 (Arco de corte) o Ë ÙÒ Ö Ó G =< V, E > Ý Ó× ÒÓ Ó× ÓÖØ u, v Ø Ð × ÕÙ ×ØÓ× ÓÒ ÓÖÑ Ò ÙÒ Ö Ó a = (u, v) ∈ Eº ÒØÓÒ ×¸ Ð Ö Ó (u, v) × ÒÓÑ Ò Ó ÓÖØ º Ó ÓØÖÓ ÑÓ Ó¸ ÙÒ Ö Ó ÓÖØ × ÕÙ Ð ÓÒ ÓÖÑ Ó ÔÓÖ Ó× ÒÓ Ó× ÓÖØ º È ØÓÖ Ñ ÒØ ¸ ÙÒ Ö Ó ÓÖØ × Ò Ö Ð Þ Ð × Ù ÒØ ÑÓ Ó G1 u v G2 ÈÓÖ ÑÔÐÓ¸ ÐÓ× Ö Ó× (1, 7) Ý (1, 14) Ð Ö Ó Ð ¬ ÙÖ º¿¼ ×ÓÒ ÓÖØ º Definici´n 7.4 (Arco de cruce) o Ë ÙÒ Ö Ó G =< V, E > Ý ÙÒ Ö Ó a ∈ E Ø Ð ÕÙ
  • 677.
    7.5. Recorridos sobregrafos 651 ר ÓÑÔÙ ×ØÓ ÔÓÖ ÙÒ ÒÓ Ó ÓÖØ u Ý ÔÓÖ ÙÒ ÒÓ Ó v Ô ÖØ Ò a = (u, v) ÒØ Ð ÙÒ ÓÑÔÓÒ ÒØ ÓÒ ÜÓº ÒØÓÒ ×¸ Ð Ö Ó a = (u, v) × ÐÐ Ñ Ó ÖÙ º È ØÓÖ Ñ ÒØ ¸ ÙÒ Ö Ó ÖÙ × Ò Ö Ð Þ Ð × Ù ÒØ ÑÓ Ó u v G2 ÈÓÖ ÑÔÐÓ¸ ÐÓ× Ö Ó× (1, 2), (1, 21) Ý (1, 22) Ð Ö Ó Ð ¬ ÙÖ º¿¼ ×ÓÒ¸ ÒØÖ ÓØÖÓ× Ñ ×¸ ÖÙ º Ä ×Ø Ò ÓÒ ×Ø × Ð × × Ö Ó× ÒÓ× × ÖÚ Ö Ô Ö ÒÚ ÖØ Ö Ð ÙÒ Ô ÖØ ÓÒ Ñ ÒØÓ Ð Ö Ó × ÙÒ ×Ù× ÒÓ Ó× ÓÖØ º Ô ÖØ ÐÓ× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× Ý ÐÓ× ÒÓ Ó× ÓÖØ ¸ Ö ÕÙ Ö ÑÓ× ÐÓ× Ö Ó× ÓÖØ Ý ÖÙ Ô Ö ÔÓ Ö Ö ÓÒרÖÙ Ö Ð Ö Ó ÓÖ Ò Ðº Ç Ø Ò Ö ÑÓ× ÐÓ× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× Ò Ó× × ×º Ä ÔÖ Ñ Ö × × Ò Ö Ô ÒØ Ö ÐÓ× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ׸ ÐÓ× ÒÓ Ó× Ý Ö Ó× ÓÖØ Ý ÐÓ× Ö Ó× ÖÙ ÓÒ Ö ÒØ × ÓÐÓÖ × ÑÓ Ó Ø Ð ÕÙ Ò Ð × × Ù ÒØ × Ð × ×Ø Ò º È Ö ×Ø × ÑÔÐ Ö ÑÓ× Ð ÖÙØ Ò paint subgraphs()º ÙÒ Ð ×Ø ÒÓ Ó× ÓÖØ Ð ÙÐ Ñ ÒØ compute cut nodes()¸ paint subgraphs() Ô ÒØ ÐÓ× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× Ð Ö Ó × ÙÒ ÐÓ× ÓÖØ ׺ ר Ø Ò ¸ Ñ × ÓÑÔÐ ¸ Ô ÖÓ ÓÒ Ñ ÒÓÖ ÓÒ×ÙÑÓ ×Ô Ó¸ ÓÒ× ×Ø Ò Ô ÒØ Ö Ð Ö Ó Ô ÖØ Ö ÙÒ ÔÙÒØÓ ÓÖØ Ö Ñ Ò Ó ÐÓ× ÓÐÓÖ × × ÙÒ × Ö Ö × Ð ÔÙÒØÓ Ô Ö¹ Ø Ó × Ð Ò ÓØÖÓ ÔÙÒØÓ ÓÖØ º ×ØÓ ÔÖ ×ÙÑ ÕÙ Ð × Ñ Ö × Ò × ´ Ð Ø Cutµ ÔÓÖ compute cut nodes() ÙÒ × Ù Ò ÔÖ × ÒØ ׺ ÄÐ Ñ Ö ÑÓ× ÒÙ ×ØÖ ÔÖ Ñ Ø Ú × paint subgraphs()¸ Ð Ù Ð Ø Ò Ð × Ù ÒØ ÒØ Ö Þ template <class GT, class SA> long paint_subgraphs(GT & g, const DynDlist<typename GT::Node*> & cut_node_list); g × ÙÒ Ö Ó ÓÒ ×Ù× ÒÓ Ó× ÓÖØ Ð ÙÐ Ó× Ý Ù Ö Ó× Ò Ð Ð ×Ø cut node list Ñ ÒØÖ × ÕÙ cut arc list × ÙÒ Ô Ö Ñ ØÖÓ × Ð ÕÙ Ö ØÓÖÒ ÐÓ× Ö Ó× ÓÖØ Ð Ö Óº Ð Ú ÐÓÖ Ö ØÓÖÒÓ × Ð ÒØ ÓÐÓÖ × Ò ÓÒØÖ Ó × ¸ Ð ÒØ ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× Ó ÐÓÕ٠׺ paint subgraphs() ×ÙÑ ÕÙ ÔÖ Ú Ñ ÒØ × ÙØÓ ×Ó Ö Ð Ö Ó Ð ÖÙØ Ò compute cut nodes()º ÄÙ Ó ÙÒ ÐÐ Ñ paint subgraphs()¸ Ð Ö Ó g Ú Ò ÓÐÓÖ Ó Ð ×¹ Ù ÒØ ÓÖÑ ½º ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× ÐÖ ÓÖ ÙÒ ÒÓ Ó ÓÖØ ×ÓÒ ÓÐÓÖ Ó× ÓÒ ÙÒ ÓÐÓÖ ÒØÖ 0 Ý n ÓÒ n × Ð ÒØ ØÓØ Ð ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× ÕÙ Ø Ò Ð Ö Óº ÈÓÖ ÓÐÓÖ Ó× ¸ Ò× ×Ø ÑÓ׸ ÕÙ Ö ÑÓ× Ö ÕÙ ØÓ Ó× ÐÓ× ÒÓ Ó× Ý Ö Ó× Ô ÖØ Ò ÒØ × ÙÒ ÓÐÓÖ i Ø Ò Ò ×Ù Ú ÐÓÖ ÓÒØ ÓÖ Ò iº ¾º ÄÓ× ÒÓ Ó× ÓÖØ Ø Ò Ò ÓÐÓÖ 0º ¿º ÄÓ× Ö Ó× ÓÖØ Ø Ò Ò ÓÐÓÖ 0 Ý Ð Ø Cut Ò trueº º ÄÓ× Ö Ó× ÖÙ ×ÓÒ ÓÐÓÖ Ó× ÓÒ Ð ÓÐÓÖ ×Ô Ð Cross Arcº ÆÓØ ÑÓ× ÕÙ ×Ø Ð× Ö Ó ÒÓ ×¸ Ò ÓÖØ Ò Ô ÖØ Ò ÙÒ ÓÑÔÓÒ ÒØ ÓÒ ÜÓº
  • 678.
    652 Cap´ ıtulo 7. Grafos Ð ÓÐÓÖ ÙÒ Ö Ó ÖÙ × ¬Ò ÓÑÓ ¾ ÈÙÒØÓ× ÓÖØ +≡ ¾ const long Cross_Arc = -1; ¬Ò × Cross Arc¸ Ù× Ò ÙÒ × ¾ Ò ¿º È Ö Ú Ö ¬ Ö × ÙÒ Ö Ó × ÖÙ ¸ ÑÔÐ Ö ÑÓ× Ð ÔÖ Ñ Ø Ú × Ù ÒØ ¾ ÈÙÒØÓ× ÓÖØ +≡ ¾ ¿ template <class GT> inline static bool is_a_cross_arc(typename GT::Arc * a) { return ARC_COUNTER(a) == Cross_Arc; } Í× × Cross Arc ¾ º Ä × ÙÒ × ÓÒ× ×Ø Ò Ñ Ô Ö Ð Ö Ó ÔÖ Ú Ñ ÒØ Ô ÒØ Ó × ÙÒ Ð ÙÒÓ ÐÓ× ÓÐÓÖ × ÑÔÐ Ó× Ò Ð ÔÖ Ñ Ö × º È Ö ×Ø × × ÑÔÐ Ò Ó× ÔÖ Ñ Ø Ú × ½º template <class GT, class SA> void map_subgraph(GT & g, GT & sg, const long & color); Ë ÙØ Ð Þ Ô Ö Ó Ø Ò Ö ÐÓ× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× Ð Ö Ó × ÙÒ ×Ù× ÔÙÒØÓ× Ö¹ Ø ÙÐ ÓÒº g × ÙÒ Ö Ó ÓÒ ×Ù× ÒÓ Ó× ÓÖØ ÔÖ Ú Ñ ÒØ Ð ÙÐ Ó× Ý Ñ Ö Ó Ñ ¹ ÒØ compute cut nodes()º sg × Ð Ö Ó Ò ÓÒ × × Ó Ø Ò Ö ÙÒ ÓÔ Ñ Ô Ð ÓÑÔÓÒ ÒØ ÓÒ ÜÓ ÓÐÓÖ color ÔÖ Ú Ñ ÒØ Ô ÒØ Ó Ñ ¹ ÒØ paint subgraphs()º ÆÓØ ÑÓ× ÕÙ ÑÓ× Ö Ð Þ Ö Ø ÒØ × ÐÐ Ñ × ×Ó Ö ×Ù Ö Ó× sg ר ÒØÓ× ÓÑÓ ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× Ø Ò gº Ç × ¸ Ð ÒØ ÓÐÓÖ ×¸ Ù Ð × Ð Ú ÐÓÖ Ö ØÓÖÒÓ paint subgraphs()º ¾º template <class GT, class SA> void map_cut_graph(GT & g, DynDlist<typename GT::Node*> & cut_node_list, GT & cut_graph, DynDlist<typename GT::Arc*> & cross_arc_list); Ç Ø Ò Ð Ö Ó ÓÖØ × Ö¸ Ð Ö Ó ÓÑÔÙ ×ØÓ ÔÓÖ ØÓ Ó× ÐÓ× ÒÓ Ó× Ý Ö Ó× ÓÖØ º g × ÙÒ Ö Ó ÓÒ ×Ù× ÒÓ Ó× ÓÖØ ÔÖ Ú Ñ ÒØ Ð ÙÐ Ó× Ý Ñ Ö Ó Ñ ¹ ÒØ compute cut nodes()º cut node list × Ð Ð ×Ø ÒÓ Ó× ÓÖØ Ø Ñ Ò Ó Ø Ò ÐÙ Ó ÐÐ Ñ Ö compute cut nodes()º cut graph × Ð Ö Ó ÓÒ × × ÙÒ ÓÔ Ñ Ô Ð Ö Ó ÓÖØ º Ò ÐÑ ÒØ ¸ cross arc list × Ð Ð ×Ø Ö Ó× ÖÙ Ò g¸ ÐÓ× Ù Ð × ÒÓ Ô ÖØ Ò Ò Ò ÐÓ× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ׸ Ò Ð Ö Ó ÓÖØ º 7.5.15.1 Pintado de componentes conexos ÖÓ××Ó ÑÓ Ó¸ Ð Ø Ò Ô ÒØ Ó ÓÒ× ×Ø Ò Ò Ö ÙÒ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ × ÙÒ ÔÙÒØÓ ÓÖØ ÓÒ ÙÒ ÓÐÓÖ Ò Ð 0º Ù Ò Ó Ð Ö ÓÖÖ Ó Ö ÙÖ× ÚÓ Ð Ò ÙÒ ÒÓ Ó ÓÖØ ¸ ÕÙ ÔÙ × Ö Ð Ñ ×ÑÓ Ô ÖØ ¸ ÒØÓÒ × × Ö Ð Þ ÙÒ Ñ Ó ´ Ò Ö Ñ ÒØÓµ
  • 679.
    7.5. Recorridos sobregrafos 653 ÓÐÓÖº ÙÖ ÒØ Ð Ö ÓÖÖ Ó ÙÒ ÓÑÔÓÒ ÒØ ¸ Ø ÒØÓ ÐÓ× ÒÓ Ó× ÓÑÓ ÐÓ× Ö Ó× ×ÓÒ ÓÐÓÖ Ó× ÓÒ Ð ÓÐÓÖ ØÙ к ÍÒ Ú Þ ÕÙ ØÓ Ó× ÐÓ× Ö Ó× Ý Ò × Ó Ö ÓÖÖ Ó× × Ò ÖÙÞ Ö ÙÒ ÔÙÒØÓ ÓÖØ ¸ ÒØÓÒ × Ð Ö Ó ×Ø Ö ÓÐÓÖ Ó × ÙÒ ÐÓ× ÓÑÔÓÒ ÒØ × ×Ó Ó× ×Ù× ÔÙÒØÓ× ÖØ ÙÐ ÓÒº ¿ ÈÙÒØÓ× ÓÖØ +≡ ¾ ¿ template <class GT, class SA> inline static void __paint_subgraph(GT & g, typename GT::Node * p, // Nodo actual typename GT::Arc * a, // Arco que conduce a p const long & current_color) { if (is_a_cut_node <GT> (p)) return; // p es de corte ==> ign´relo! o paint_arc <GT> (a, current_color); if (is_node_painted <GT> (p)) return; paint_node <GT> (p, current_color); // recorrer y pintar recursivamente el bloque a trav´s de arcos de p e for (Node_Arc_Iterator<GT, SA> it(p); it.has_current(); it.next()) { typename GT::Arc * arc = it.get_current_arc(); if (is_arc_painted <GT> (arc)) continue; __paint_subgraph <GT, SA> (g, it.get_tgt_node(), arc, current_color); } } Í× × Node Arc Iterator º ר Ú Ö× ÓÒ ×ÙÑ ÕÙ p × Ð ÒÞ × ÙÒ ÒÓ Ó Ý Ô ÒØ Ó ÓÒ current colorº Ð Ò Ó¸ Ó × ¸ Ð ÔÖ Ñ Ö ÒÓ Ó ÕÙ × ÒØÖ Ô ÒØ Ö Ý ÕÙ ×Ø ÓÒ Ø Ó ÙÒ Ö Ó ÖÙ ¸ × Ô ÒØ Ö Ñ ÒØ Ð × Ù ÒØ Ú Ö× ÓÒ ¿ ÈÙÒØÓ× ÓÖØ +≡ ¿ ¿ template <class GT, class SA> inline static void __paint_subgraph(GT & g, typename GT::Node * p, const long & current_color) { paint_node <GT> (p, current_color); for (Node_Arc_Iterator<GT, SA> it(p); it.has_current(); it.next()) { typename GT::Arc * arc = it.get_current_arc(); if (is_arc_painted <GT> (arc)) continue; __paint_subgraph <GT, SA> (g, it.get_tgt_node(), arc, current_color); } } Í× × Node Arc Iterator º ר Ú Ö× ÓÒ Ò Ð ÓÐÓÖ ÓÒ ÙÒ ÓÑÔÓÒ ÒØ ÓÒ ÜÓ Ð Ù Ð × Ð ÐÐ × ÙÒ ÒÓ Ó ÓÖØ Ú ×ØÓ ÔÓÖ Ð × Ù ÒØ ÖÙØ Ò ¿ ÈÙÒØÓ× ÓÖØ +≡ ¿ template <class GT, class SA> inline static void __paint_from_cut_node(GT & g, typename GT::Node * p, long & current_color)
  • 680.
    654 Cap´ ıtulo 7. Grafos { // pintar recursivamente con distintos colores los bloques conectados a p for (Node_Arc_Iterator<GT, SA> it(p); it.has_current(); it.next()) { typename GT::Arc * arc = it.get_current_arc(); typename GT::Node * tgt_node = it.get_tgt_node(); if (is_a_cut_node <GT> (tgt_node)) // ¿ es un arco de corte? { ARC_BITS(arc).set_bit(Cut, true); // marque arco como de corte continue; // avance a pr´ximo arco o } else { paint_arc <GT> (arc, Cross_Arc); // marque arco como de cruce if (is_node_painted <GT> (tgt_node)) continue; } // pintar recursivamente con current_color nodo conectado a arc // (no es ni de corte ni de cruce) __paint_subgraph <GT, SA> (g, tgt_node, current_color); current_color++; // cambiar color (siguiente arco pertenece a otro bloque) } } Í× × Cross Arc ¾ Ò Node Arc Iterator º ÓÑÓ × Ú ¸ paint from cut node() ØÓÑ ÙÒ ÒÓ Ó ÓÖØ Ý × Ò Ö ÒÚÓ Ö paint subgraph() ×Ó Ö Ð Ö Ó ØÙ Ð Ó Ô ÒØ ÖÐ Ö Ó ÓÖØ º Ò ÐÑ ÒØ ¸ ÒÓ Ö ×Ø ÑÔÐ Ñ ÒØ Ö Ð ÖÙØ Ò ÔÖ Ò Ô Ð ÈÙÒØÓ× ÓÖØ +≡ ¿ template <class GT, class SA> inline long paint_subgraphs(GT & g, const DynDlist<typename GT::Node*> & cut_node_list) { g.reset_counter_nodes(); g.reset_counter_arcs(); long current_color = 1; // Recorrer cada nodo de corte y pintar sus bloques for (typename DynDlist<typename GT::Node*>::Iterator i(cut_node_list); i.has_current(); i.next()) __paint_from_cut_node <GT, SA> (g, i.get_current(), current_color); return current_color; } Í× × DynDlist ¿ º ×ÔÙ × Ð ÙÐ Ö ÐÓ× ÔÙÒØÓ× ÓÖØ Ý Ø Ò ÖÐÓ× Ò cut node list¸ Ð Ù×Ù Ö Ó ÒÚÓ paint subgraphs() Ô Ö Ô ÒØ Ö ÓÒ ×Ø ÒØÓ× ÓÐÓÖ × ÐÓ× ÐÓÕÙ × Ð Ö Óº ÐÓÕÙ ÔÙ ×Ø Ò Ù Ö× Ñ ÒØ ×Ù ÓÐÓÖº ÄÓ× Ö Ó× ÖÙ × ×Ø Ò Ù Ò ØÖ Ú × Ð ÓÐÓÖ ×Ô Ð Cross Arcº ÄÓ× ÒÓ Ó× Ý Ö Ó× ÓÖØ × ×Ø Ò Ù Ò Ñ ÒØ Ð Ø Cutº À ר Ð ÔÖ × ÒØ ¸ ÒÓ × Ö Ð Þ Ó ÙÒ ÓÔ ÓÒ Ð Ð Ö Óº
  • 681.
    7.5. Recorridos sobregrafos 655 7.5.15.2 Copia mapeada de componentes conexos Ò Ð ÙÒ × Ö ÙÒר Ò ×¸ × ÓÒÚ Ò ÒØ ÓÔ Ö ÐÓ× ×Ø ÒØÓ× ÐÓÕÙ × ÙÒ Ö Óº ÈÓÖ ÑÔÐÓ¸ ÐÓ× Ð ÓÖ ØÑÓ× Ù ÓÓ Ø ÓÒ ÔÐ Ò Ö × ÑÔÐ ¬ Ò ×Ù× Ð ÙÐÓ× ØÖ Ò Ó ×Ó Ö ÐÓ× ÐÓÕ٠׺ ÈÙ ×ØÓ ÕÙ Ñ ÒÙ Ó × Ò × Ö Ó ÑÓ ¬ Ö ÐÓ× ÐÓÕ٠׸ × ÔÖ Ö Ð ÖÐÓ ×Ó Ö ÓÔ × ÕÙ ×Ó Ö Ð Ö Ó ÓÖ Ò Ðº Ð ÔÖÓ ×Ó ÒØ ¬ ÓÒ¸ ÓÔ Ý Ñ Ô Ó ÙÒ ×Ù Ö Ó¸ Ó ÙÒ ÓÐÓÖ × × ÑÔÐ ÙÒ Ú Þ ÕÙ × Ø Ò Ò Ô ÒØ Ó× ÐÓ× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× Ù× Ö Ý Ò ÓÒØÖ Ö Ð ÔÖ Ñ Ö ÒÓ Ó ÓÒ Ð ÓÐÓÖ ÒØ Ö × Ý¸ Ô ÖØ Ö Ð¸ Ö Ð Þ Ö ÙÒ ÜÔÐÓÖ ÓÒ Ò ÔÖÓ ÙÒ ÕÙ Ú × Ø ¸ ÓÔ Ý Ñ Ô ÐÓ× ÒÓ Ó× Ý Ö Ó× ÓÒ Ð Ñ ×ÑÓ ÓÐÓÖº ËÓ Ö ÙÒ ÒÓ Ó Ð Ö Ó gsrc¸ ÓÒ Ð ÓÐÓÖ ÒØ Ö × color ¸ Ý ÓÔ Ó Ý Ñ Ô Ó ÙÒ ×Ù Ö Ó sg¸ Ð Ö ×ØÓ Ð Ñ Ô Ó × ÓÑÔÐ Ø ¸ Ö ÙÖ× Ú Ñ ÒØ ¸ Ð × Ù ÒØ Ñ Ò Ö ÈÙÒØÓ× ÓÖØ +≡ template <class GT, class SA> inline static void __map_subgraph(GT & g, // grafo con ptos de corte GT & sg, // subgrafo donde se copia bloque typename GT::Node * gsrc, // nodo de g ya copiado en sg const long & color) { typename GT::Node * tsrc = // imagen de gsrc en sg static_cast<typename GT::Node*>(NODE_COOKIE(gsrc)); // recorrer arcos de gsrc y a~adir a sg aquellos con el color de inter´s n e for (Node_Arc_Iterator <GT, SA> i(gsrc); i.has_current(); i.next()) { typename GT::Arc * garc = i.get_current_arc(); if (get_color <GT> (garc) != color or IS_ARC_VISITED(garc, Build_Subtree)) continue; // arco es de otro color o ya est´ visitado a ARC_BITS(garc).set_bit(Build_Subtree, true); // marque arco typename GT::Node * gtgt = i.get_tgt_node(); // nodo destino de garc typename GT::Node * ttgt = NULL; // imagen de gtgt en sg if (IS_NODE_VISITED(gtgt, Build_Subtree)) // ¿gtgt ya est´ en sg? a ttgt = static_cast<typename GT::Node*>(NODE_COOKIE(gtgt)); // s´ı else { // gtgt no est´ en sg ==> copiarlo y mapearlo a auto_ptr<typename GT::Node> ttgt_auto(new typename GT::Node(gtgt)); sg.insert_node(ttgt_auto.get()); GT::map_nodes(gtgt, ttgt_auto.get()); NODE_BITS(gtgt).set_bit(Build_Subtree, true); // marque gtgt ttgt = ttgt_auto.release(); } // copiar y mapear arco en sg typename GT::Arc * tarc = sg.insert_arc(tsrc, ttgt, garc->get_info()); GT::map_arcs(garc, tarc); __map_subgraph<GT, SA> (g, sg, gtgt, color); // recursivamente a gtgt } } Í× × Node Arc Iterator º map subgraph() Ñ Ö ÐÓ× ÒÓ Ó× Ý Ö Ó× Ú × Ø Ó× ÓÒ Ð Ø Build Subtree ר ÑÓ Ó¸ × ×Ø Ò Ù ÕÙ ÙÒ ÒÓ Ó Ó Ö Ó ÓÒ Ð ÓÐÓÖ ÒØ Ö × Ý × Ó Ó ÒÓ Ñ Ô Óº Ä ÖÙØ Ò ÒØ Ö Þ map subgraph() Ù× ×Ó Ö Ð Ö Ó g Ð ÔÖ Ñ Ö ÒÓ Ó ÓÒ ÓÐÓÖ
  • 682.
    656 Cap´ ıtulo 7. Grafos colorÝÑ Ô Ð ÓÑÔÓÒ ÒØ ÓÒ ÜÓ Ð ×Ù Ö Ó sgº Ë ×Ô ¬ ÓÑÓ × Ù ÈÙÒØÓ× ÓÖØ +≡ template <class GT, class SA> void map_subgraph(GT & g, GT & sg, const long & color) { clear_graph(sg); typename GT::Node * first = NULL; // busque primer nodo con el color for (typename GT::Node_Iterator it(g); it.has_current(); it.next()) if (get_color <GT> (it.get_current_node()) == color) first = it.get_current_node(); // cree first, ins´rtelo en sg y map´elo e e auto_ptr<typename GT::Node> auto_tsrc ( new typename GT::Node(first) ); sg.insert_node(auto_tsrc.get()); GT::map_nodes(first, auto_tsrc.release()); NODE_BITS(first).set_bit(Build_Subtree, true); // m´rquelo visitado a __map_subgraph <GT, SA> (g, sg, first, color); // mapee first } Í× × Node Iterator º ÆÓ× Ö ×Ø ÔÓÖ ÓÒרÖÙ Ö Ð Ö Ó ÓÖØ Ý Ù Ö Ö ÐÓ× Ö Ó× ÖÙ º È Ö ÐÐÓ¸ ÓÒ ÙÒ Ô × ×Ó Ö Ð Ð ×Ø ÒÓ Ó× ÓÖØ Ö ÑÓ× Ý Ñ Ô ÑÓ× ×Ù× Ñ Ò × Ò Ð Ö Ó ÓÖØ cut graphº ×Ô٠׸ ØÙ ÑÓ× ÙÒ ÖÖ Ó ×Ó Ö ØÓ Ó× ÐÓ× Ö Ó׺ ÄÓ× ÕÙ ×Ø Ò Ô ÒØ Ó× ÐÓ× ÒÓÖ ÑÓ׸ ÔÙ × Ô ÖØ Ò Ò ÐÓ× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ׺ ÄÓ× Ö Ó× ÓÖØ ÐÓ× ÓÔ ÑÓ× Ò× ÖØ ÑÓ× Ò cut graph Ñ ÒØÖ × ÕÙ ÐÓ× ÖÙ ÐÓ× Ò× ÖØ ÑÓ× Ò Ð Ð ×Ø cross arc listº ÍÒ Ø ÐÐ × Ò Ð × Ô Ö Ø Ö× ÕÙ ¸ Ð Ü Ô ÓÒ ÐÓ× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× Ý Ð Ö Ó ÓÖØ ¸ ÐÓ× Ö Ó× ÖÙ ÒÓ ×ÓÒ ÓÔ Ó׺ ÈÙÒØÓ× ÓÖØ +≡ template <class GT, class SA> void map_cut_graph(GT & g, DynDlist<typename GT::Node*> & cut_node_list, GT & cut_graph, DynDlist<typename GT::Arc*> & cross_arc_list) { clear_graph(cut_graph); // recorra lista de nodos de corte e ins´rtelos en cut_graph e for (typename DynDlist<typename GT::Node*>::Iterator it(cut_node_list); it.has_current(); it.next()) { typename GT::Node * gp = it.get_current(); auto_ptr<typename GT::Node> tp_auto ( new typename GT::Node(gp) ); cut_graph.insert_node(tp_auto.get()); GT::map_nodes(gp, tp_auto.release()); } // recorra arcos de g ==> cut_graph={arcos no corte} cross_arc_list={de cruce} for (Arc_Iterator <GT, SA> it(g); it.has_current(); it.next()) { typename GT::Arc * garc = it.get_current_arc(); if (is_a_cross_arc <GT> (garc)) { cross_arc_list.append(garc); continue; } if (not is_an_cut_arc <GT> (garc))
  • 683.
    7.6. Matrices deadyacencia 657 continue; typename GT::Node * src = static_cast<typename GT::Node*>(NODE_COOKIE(g.get_src_node(garc))); typename GT::Node * tgt = static_cast<typename GT::Node*>(NODE_COOKIE(g.get_tgt_node(garc))); typename GT::Arc * cut_arc = cut_graph.insert_arc(src, tgt, garc->get_info()); GT::map_arcs(garc, cut_arc); } } Í× × Arc Iterator Ò DynDlist ¿º Ð Ö Ó cut graph × Ò ÓÒ ÜÓ Ý ×Ù× ÓÑÔÓÒ ÒØ × ÔÙ Ò ÐÐ Ö× Ñ ÒØ build subgraph() ÑÔÐ ÒØ Ò ÓÑÔÓÒ ÒØ × Ò ÓÒ ÜÓ× ¿ ´Ü º º½¿ ´Ô Ò ¿ µµ 7.6 Matrices de adyacencia À ר Ð ÔÖ × ÒØ ¸ ÑÓ× Ö ×Ù ÐØÓ ÙÒ ÒØ ÑÔÓÖØ ÒØ ÔÖÓ Ð Ñ × ÓÒ Ð Ø ÔÓ List Graph<Node, Arc>¸ × Ó Ò Ð ×Ø × Ý Ò º Ä Ö ÔÖ × ÒØ ÓÒ ÓÒ Ð ×Ø × Ø Ò Ð Ö Ò Ú ÒØ Ð Ò Ñ ×ÑÓ ÔÓ ÑÓ× Ú Ö× Ø ÐÑ ÒØ Ò Ö Ý ×ÙÔÖ Ñ Ö ÒÓ Ó× Ý Ö Ó׺ ÓÒ Ð × Ñ ØÖ × Ý Ò ×ØÓ × ÓÒ× Ö Ð Ñ ÒØ Ñ × Ðº Ë Ò Ñ Ö Ó¸ Ü ×Ø ÙÒ ÑÔÐ Ó ÓÖÔÙ× Ð Ø ÓÖ Ö Ó׸ × ÓÑÓ ÙÒ ÜØ Ò× Ú Ö Ö ÙÒר Ò × × ÑÔ ÒÓ¸ Ò Ð × Ù Ð × ÔÙ × Ö ÔÖ Ö Ð Ù× Ö Ð Ñ ØÖ Þ Ý Ò ÓÑÓ Ö ÔÖ × ÒØ ÓÒ ÙÒ Ö Óº ALEPH ÜÔÓÖØ ÐÓ× × Ù ÒØ × Ì Ú Ò ÙÐ Ó× Ð × Ñ ØÖ × Ý Ò ½º Map Matrix Graph<GT> ÑÓ Ð Þ ÙÒ Ñ ØÖ Þ Ý Ò ÑÔÓ ÙÒ Ö Ó Ø ÔÓ GT × Ó ×Ó Ö List Graph<Node, Arc>º ר Ì ÑÔÐ ÓÑÓ Ó ¹ ØÓ× Ð × Ð × × Graph Node<Node Type> Ý Graph Arc<Arc Type> ÙØ Ð Þ × Ô Ö List Graph<Node, Arc>º Ð ×Ó ÙÒ ÒØÖ Ð Ñ ØÖ Þ Ö ØÓÖÒ ÙÒ Graph Arc<Arc Type> Ý × Ö Ð Þ ×Ô ¬ Ò Ó ÐÓ× ÒÓ Ó× Ø ÔÓ Graph Node<Node Type>º ÄÓ× Ú ÐÓÖ × ÔÓ× Ð × ×ÓÒ ÙÒ ÔÙÒØ ÖÓ ÙÒ Graph Arc<Arc Type> Ó NULL × ÒÓ Ý Ö Óº Map Matrix Graph<GT> ÒÓ ×Ø ר Ò Ð ÙÐÓ× × ÑÔÐ Ñ ÒØ ¸ ÓÒר ØÙÝ Ð ÔÖ Ñ Ö Ô ×Ó Ô Ö Ó Ø Ò Ö ÙÒ Ñ ØÖ Þ Ý Ò º ¾º Matrix Graph<GT> ÑÓ Ð Þ ÙÒ Ñ ØÖ Þ Ý Ò ÙÒ List Graph<Node, Arc> ÓÒ ÐÓ× Ø ÔÓ× ×Ó Ó× ÓÑÓ ØÖ ÙØÓ× Ð × Ð × × Graph Node<Node Type> Ý Graph Arc<Arc Type>º ¿º Ady Mat<GT, Entry> ÑÓ Ð Þ ÙÒ Ñ ØÖ Þ Ý Ò Ò Ð Ù Ð Ð Ù×Ù Ö Ó ×Ô ¬ Ð Ø ÔÓ ØÓ ÕÙ × × ÓÑÓ ÒØÖ Ð Ñ ØÖ Þº º Bit Mat Graph<GT> Ð Ù Ð ÑÓ Ð Þ ÙÒ Ñ ØÖ Þ Ý Ò Ø×º Ä × ØÖ × Ð × ÒØ Ö ÓÖ × × ¬Ò Ò Ò Ð Ö ÚÓ tpl matgraph.Hº
  • 684.
    658 Cap´ ıtulo 7. Grafos 7.6.1 El TAD Map Matrix Graph<GT> Ð ¬Ò ר Ì × ×ÔÓÒ Ö ÙÒ Ö ÔÖ × ÒØ ÓÒ Ñ ØÖ Ð ÙÒ Ö Ó ×Ô ¬ Ó ÓÒ Ð Ì List Graph<Node, Arc>º Ë ×Ô ¬ ÓÑÓ × Ù Map Matrix Graph<GT> ≡ template <class GT, class SA = Default_Show_Arc<GT> > class Map_Matrix_Graph { Ì ÔÓ× ÔÙ Ð Ó× Map Matrix Graph<GT> ´Ò Ú Ö ¬Ò µ Å Ñ ÖÓ× ÔÖ Ú Ó× Map Matrix Graph<GT> Å Ñ ÖÓ× ÔÙ Ð Ó× Map Matrix Graph<GT> }; ÁÑÔÐ ÒØ ÓÒ Map Matrix Graph<GT> Map Matrix Graph<GT> Ñ Ô ÙÒ Ö Ó Ø ÔÓ List Graph<Node, Arc> ÙÒ Ñ ¹ ØÖ Þ Ý Ò º ÈÓ× Ó× ÓÒרÖÙ ØÓÖ × Å Ñ ÖÓ× ÔÙ Ð Ó× Map Matrix Graph<GT> ≡ ´ µ Map_Matrix_Graph(GT & g); Map_Matrix_Graph(Map_Matrix_Graph & mat); Ð ÔÖ Ñ Ö ÓÒרÖÙ ØÓÖ ØÓÑ ÙÒ List Graph<Node, Arc> Ø ÔÓ GT Ý ÓÒרÖÙÝ ÙÒ Ñ ØÖ Þ Ý Ò Ñ Ô Óº Ð × ÙÒ Ó × Ð ÓÒרÖÙ ØÓÖ ÓÔ º ÍÒ Ñ Ó Ò Ð ÒØ Ö Ó× Ó ÒÓ Ó× Ð List Graph<Node, Arc>no se refleja Ò ÙÒ Ñ Ô Ó Map Matrix Graph<GT>º ÆÓ Ó ×Ø ÒØ ¸ × ÔÖ ×Ø Ö ×Ô Ð Ù Ó ÓÒ Ð Ñ ØÓ Ü ×Ø Ò Ð List Graph<Node, Arc>¸ Ð Ù Ð ×ØÖÙ Ö× ×ÔÙ × ØÓ Ó Ó ØÓ Map Matrix Graph<GT> ÕÙ Ð ×Ø Ö Ð ÓÒ Óº Ð ×Ó ÙÒ Ð Ñ ÒØÓ Ð Ñ ØÖ Þ × Ö Ð Þ Ñ ÒØ Ð ÓÔ Ö ÓÖ () ´ÒÓ ÓÒ Ð ÓÔ Ö ÓÖ ØÖ ÓÒ Ð []µº À Ý Ù ØÖÓ ÔÖ × ÒØ ÓÒ × ½º Å Ñ ÖÓ× ÔÙ Ð Ó× Map Matrix Graph<GT> +≡ ´ µ inline Node * operator () (const long & i); Ê ØÓÖÒ Ð ÔÙÒØ ÓÖ ÙÒ ÒÓ Ó ÓÖÖ ×ÔÓÒ ÒØ Ð i¹ × Ñ ÒØÖ Ð Ñ ØÖ Þº ÈÓÖ ÑÔÐÓ¸ × Ø Ò ÑÓ× Ð × Ù ÒØ Ð Ö ÓÒ Map_Matrix_Graph<Grafo> m(g); ÓÒ g × ÙÒ Ó ØÓ Ø ÔÓ Grafo ÖÚ Ó List Graph<Node, Arc>º Ò¹ ØÓÒ ×¸ Ð × Ù ÒØ ÓÔ Ö ÓÒ Grafo::Node * p = m(20); × Ò Ð ÔÙÒØ ÖÓ ÒÓ Ó p Ð Ú × ÑÓ¹ÔÖ Ñ Ö ÒÓ Ó Ð Ö Óº ¾º Å Ñ ÖÓ× ÔÙ Ð Ó× Map Matrix Graph<GT> +≡ ´ µ inline long operator () (Node * node) const;
  • 685.
    7.6. Matrices deadyacencia 659 Ê ØÓÖÒ Ð Ò Ó ÔÓ× ÓÒ ÒØÖÓ Ð Ñ ØÖ Þ Ð ÒÓ Ó ÓÒ Ö ÓÒ nodeº ¿º Å Ñ ÖÓ× ÔÙ Ð Ó× Map Matrix Graph<GT> +≡ ´ µ inline Arc * operator () (Node * src_node, Node * tgt_node) const; Ê ØÓÖÒ Ð ÔÙÒØ ÓÖ Ö Ó ÒØÖ ÐÓ× ÒÓ Ó× src node Ý tgt nodeº Ë ÒÓ Ü ×Ø Ø Ð Ö Ó¸ ÒØÓÒ × × Ö ØÓÖÒ NULLº º Å Ñ ÖÓ× ÔÙ Ð Ó× Map Matrix Graph<GT> +≡ ´ µ ¼ inline Arc * operator () (const long & i, const long & j) const; Ê ØÓÖÒ Ð ÔÙÒØ ÓÖ Ö Ó ÒØÖ ÐÓ× ÒÓ Ó× ÓÒ Ò × ÒØÖÓ Ð Ñ ØÖ Þ i Ý j¸ Ö ×Ô Ø Ú Ñ ÒØ º ÄÓ× Ò × ÔÙ Ò Ó Ø Ò Ö× ÔÖ Ú Ñ ÒØ Ñ ÒØ Ð ÓÔ Ö ÓÖ (ptr)¸ ÓÒ ptr × ÙÒ ÔÙÒØ ÖÓ ÒÓ Óº Ä Ö Ø Ö ×Ø Ñ × ÔÖ ÙÒ Ñ ØÖ Þ Ý Ò × Ð ×Ó Ö ØÓ ÐÓ× ÒÓ Ó× Ý Ö Ó× ÐÓ ÕÙ Ô ÖÑ Ø ÙÒ ÔÖÙ Ö Ó O(1)º Ò ÒÙ ×ØÖ ÑÔÐ ÒØ ÓÒ ÑÓ× × ÙÖ Ö × × ÑÔ ÒÓº × ÔÓÖ ×Ó ÕÙ × Ö ÑÓ× ÒÙ ×ØÖ ÑÔÐ ÒØ ÓÒ Ò Ð Ø ÔÓ DynArray<T> ÜÔÐ Ó Ü ¾º½º ´Ô Ò ½µº Ò ÔÖ Ñ Ö ÐÙ Ö¸ Ø Ò Ö ÑÓ× ÙÒ ÖÖ ÐÓ ÒÓ Ó× ×Ô ¬ Ó Ð × Ù ÒØ Ñ Ò Ö Å Ñ ÖÓ× ÔÖ Ú Ó× Map Matrix Graph<GT> ≡ ´ µ ¼ DynArray<Node*> nodes; Í× × DynArray ¾º ר ÓÖÑ ¸ ØÓ Ó ×Ó nodes[i] Ö ØÓÖÒ Ò O(1) Ð ÔÙÒØ ÓÖ ÒÓ Óº ÓÑÓ Ø Ñ Ò Ù× Ö ÑÓ× ×Ø ר ÐÓ Ò Ð × Ð × × Matrix Graph<GT> Ý Ady Mat<GT, Entry>¸ ÒÓ × ÑÙÝ ÓÒÚ Ò ÒØ Ò Ô×ÙÐ Ö Ð ×Ó Ò ÙÒ ÖÙØ Ò ÔÖ Ú ÍØ Ð Ø Ö Ó× Ô Ö Ñ ØÖ × Ý Ò ≡ ¼ template <typename GT> inline static typename GT::Node * get_node(DynArray<typename GT::Node *> & nodes, const long & i) { return nodes.access(i); } Í× × DynArray ¾º nodes × ÙÒ ÖÖ ÐÓ ÒÓ Ó× i × Ð Ò ×Óº ÈÓ ÑÓ׸ Ô٠׸ ÑÔÐ ÒØ Ö ÒÙ ×ØÖ ÔÖ Ñ Ö Ú Ö× ÓÒ Ð ÓÔ Ö ÓÖ () ÁÑÔÐ ÒØ ÓÒ Map Matrix Graph<GT> ≡ ´ µ ¼ template <class GT, class SA> typename GT::Node * Map_Matrix_Graph<GT, SA>::operator () (const long & i) { return get_node <GT> (nodes, i); }
  • 686.
    660 Cap´ ıtulo 7. Grafos ØÓ× Ð ÙÐ Ö ÐÓ Ñ × Ö Ô Ñ ÒØ ÔÓ× Ð Ð Ò ÙÒ ÒÓ Ó Ó ÙÒ ÔÙÒØ ÖÓ¸ Ð ÖÖ ÐÓ nodes ר Ö ÓÖ Ò Ó ÔÓÖ Ð × Ö ÓÒ × ×Ù× ÔÙÒØ ÖÓ׺ ר ÑÓ Ó¸ Ð Ð ÙÐÓ ÙÒ Ò ÔÙ Ö ×ÓÐÚ Ö× Ò Ö Ñ ÒØ Ò O(Ð (n)) Ñ ÒØ Ð Ù×ÕÙ ÒÖ ¼ ÍØ Ð Ø Ö Ó× Ô Ö Ñ ØÖ × Ý Ò +≡ ½ template <typename GT> inline static long index_of_node(DynArray<typename GT::Node *> & nodes, const long & n, typename GT::Node * p) { return Aleph::binary_search<typename GT::Node*>(nodes, p, 0, n - 1); } Í× × binary search ¿¾ Ò DynArray ¾º nodes × ÙÒ ÖÖ ÐÓ ÓÖ Ò Ó ÔÙÒØ ÖÓ× ÒÓ Ó׸ n × Ð ÒØ ÒÓ Ó× Ý p × Ð ÔÙÒØ ÓÖ Ù× Öº index of node() × Ù× ÔÓÖ Ð × Ù ÒØ Ú Ö× ÓÒ Ð ÓÔ Ö ÓÖ () ¼ ÁÑÔÐ ÒØ ÓÒ Map Matrix Graph<GT> +≡ ´ µ ½ template <class GT, class SA> long Map_Matrix_Graph<GT, SA>::operator () (typename GT::Node * node) const { return index_of_node <GT> (nodes, num_nodes, node); } ÒØ × ÑÔÐ ÒØ Ö Ð Ö ×ØÓ ÐÓ× Ñ ØÓ Ó× Ð Ð × Map Matrix Graph<GT>¸ ¹ ÑÓ× ×Ô ¬ Ö Ð Ö ×ØÓ ×Ù× Ñ Ñ ÖÓ× ØÓº Ò ÔÖ Ñ Ö ÐÙ Ö¸ ÔÙ Ö ÕÙ Ö Ö× Ð ÔÖÓÔ Ó List Graph<Node, Arc> ¼ Å Ñ ÖÓ× ÔÖ Ú Ó× Map Matrix Graph<GT> +≡ ´ µ ¼ GT * lgraph; Ð ÙÐ × × Ð Ñ ÒØ ¼ Å Ñ ÖÓ× ÔÙ Ð Ó× Map Matrix Graph<GT> +≡ ´ µ ¼ GT & get_list_graph() { return *lgraph; } Ä ÒØ ÒÓ Ó× Ð Ö Ó Ó × ¸ Ð Ñ Ò× ÓÒ Ð Ñ ØÖ Þ¸ Ð ÐÑ Ò Ö ÑÓ× Ò ÙÒ Ö Ö Ò ¼ Å Ñ ÖÓ× ÔÖ Ú Ó× Map Matrix Graph<GT> +≡ ´ µ ¼ ½ mutable size_t num_nodes; Ð Ù Ð × Ö ÙÒ Ö Ö Ò Ö Ø Ð List Graph<Node, Arc> ÓÒØ Ò Ó Ò lgraphº ר ØÖ ÙØÓ × Ó × ÖÚ Ð ØÖ Ú × ¼ Å Ñ ÖÓ× ÔÙ Ð Ó× Map Matrix Graph<GT> +≡ ´ µ ¼ ¾ const size_t & get_num_nodes() const { return num_nodes; } Ä Ñ ØÖ Þ Ö Ó× Ø Ñ Ò Ð Ö ÔÖ × ÒØ Ö ÑÓ× ÓÒ ÙÒ DynArray<T> Ñ Ò× ÓÒ n×n ÓÒ n = num nodesº ÆÓ × Ú ×ÐÙÑ Ö ÓØÖ ÐØ ÖÒ Ø Ú ÕÙ ÒÓ Ò ÙÖÖ Ò Ù×ÕÙ Ð Ò Ð ÐÓ× Ö Ó× Ò lgraphº Ê ÓÖ ÑÓ× ÕÙ Ð ÓÒ×ÙÑÓ Ñ ÑÓÖ DynArray<T> × ÔÖÓÔÓÖ ÓÒ Ð Ð ÒØ ¹ ÒØÖ × ÕÙ × Ý Ò × Ö ØÓº ×ØÓ ÒÓ× ÔÖÓÔÓÖ ÓÒ ÙÒ Ö Ò Ú ÒØ Ò ÓÒÓÑ ×Ô Óº À Ö Ò¸ × Ò Ñ Ö Ó¸ Ð ÙÒ × ÒØÖ × ÓÖÖ ×ÔÓÒ ÒØ × NULL ÕÙ × Ò¹ ÓÒØÖ Ö Ò Ò Ð ÖÖ ÐÓ Ò Ñ Óº ÈÓÖ × Ö ÞÓÒ¸ ÒÓ ÑÓ× Ð Ö Ö Ö Ø Ñ ÒØ Ð Ó ÓÑÓ DynArray<Arc*> arcos(n*n);
  • 687.
    7.6. Matrices deadyacencia 661 ÔÙ × Ö ÕÙ × Ö Ö ÜÔÐ Ø Ñ ÒØ ÐÓ× Ö Ó× ÒÓ Ü ×Ø ÒØ × ÓÒ Ð Ú ÐÓÖ NULL¸ ÐÓ ÕÙ ÕÙ ÖÖ Ö × Ö Ö Ò Ð × n × n ÒØÖ × Ý Ô Ö Ö Ð Ú ÒØÙ Ð ÓÖÖÓ ×Ô Óº È Ö Ô Ð Ö Ð ÔÖÓ Ð Ñ ÒØ Ö ÓÖ¸ Ù× Ö ÑÓ× Ð × Ù ÒØ Ø ÔÓ ÒØ ÖÑ Ó ½ Å Ñ ÖÓ× ÔÖ Ú Ó× Map Matrix Graph<GT> +≡ ´ µ ¼ ½ struct Mat_Entry { Arc * arc; Mat_Entry(Arc * __arc = NULL) : arc(__arc) { /* empty */ } }; × Ô٠׸ Ð × ÒØÖ × ÕÙ ÓÒØ Ò Ò Ñ ÑÓÖ ¸ Ô ÖÓ ÕÙ ÒÓ Ý Ò × Ó × Ö Ø ×¸ ÓÒ¹ Ø Ò Ö Ò Ð Ú ÐÓÖ NULL ÔÖ Ú Ñ ÒØ × Ò Ó ÔÓÖ Ð ÓÒרÖÙ ØÓÖ ÔÓÖ ÓÑ × ÓÒº Ä Ñ ØÖ Þ Ý Ò × Ð Ö ¸ ÒØÓÒ ×¸ ÓÑÓ × Ù ½ Å Ñ ÖÓ× ÔÖ Ú Ó× Map Matrix Graph<GT> +≡ ´ µ ½ DynArray<Mat_Entry> mat; Í× × DynArray ¾º ÈÙ ×ØÓ ÕÙ Ð Ñ ØÖ Þ × ÑÔÐ ÒØ ÓÒ ÙÒ ÖÖ ÐÓ ÙÒ ¹ Ñ Ò× ÓÒ Ð¸ ÔÐ ÒØ ÑÓ× Ð × ¹ Ù ÒØ ÔÖ Ñ Ø Ú ½ ÍØ Ð Ø Ö Ó× Ô Ö Ñ ØÖ × Ý Ò +≡ ¼ ½ inline static long index_array(const long & i, const long & j, const long & n) Ä Ù Ð Ö ØÓÖÒ Ð Ò Ð ×Ó (i,j) ÒØÖÓ ÙÒ DynArray<T> Ù× Ó Ô Ö ÑÔÐ ÒØ Ö ÙÒ Ñ ØÖ Þ n*nº Ð ×Ó ÙÒ ÒØÖ ÙÒ Ñ ØÖ Þ Ý Ò × Ö ÐÞ Ò Ö Ñ ÒØ Ð × Ù ÒØ ÓÖÑ ½ ÍØ Ð Ø Ö Ó× Ô Ö Ñ ØÖ × Ý Ò +≡ ½ template <typename Entry> inline static Entry * read_matrix(const DynArray<Entry> & mat, const long & i, const long & j, const long & n) { const long index = index_array(i, j, n); if (not mat.exist(index)) return NULL; return &const_cast<Entry&>(mat.access(index)); } ¬Ò × read matrix¸ Ù× Ò ÙÒ ½º Í× × DynArray ¾º Ä ÖÙØ Ò Ð Ð ÒØÖ (i,j) Ò Ð DynArray<T>mat Ø ÔÓ Entry ÕÙ ÑÔÐ ÒØ ÙÒ Ñ ØÖ Ü n*nº ÓÒ ÐÓ ÒØ Ö ÓÖ ÔÓ ÑÓ× ÑÔÐ ÒØ Ö Ð Ö ×ØÓ ÐÓ× ÓÔ Ö ÓÖ × ×Ó ½ ÁÑÔÐ ÒØ ÓÒ Map Matrix Graph<GT> +≡ ´ µ ¼ ¾ template <class GT, class SA> typename GT::Arc * Map_Matrix_Graph<GT, SA>::operator () (const long & i, const long & j) const { Mat_Entry * mat_entry = read_matrix<Mat_Entry>(mat, i, j, num_nodes); if (mat_entry == NULL) return NULL;
  • 688.
    662 Cap´ ıtulo 7. Grafos return mat_entry->arc; } template <class GT, class SA> typename GT::Arc * Map_Matrix_Graph<GT, SA>::operator () (Node * src_node, Node * tgt_node) const { Mat_Entry * mat_entry = read_matrix<Mat_Entry>(mat, index_of_node<GT>(nodes, num_nodes, src_node), index_of_node<GT>(nodes, num_nodes, tgt_node), num_nodes); if (mat_entry == NULL) return NULL; return mat_entry->arc; } Í× × read matrix ½ º ÍÒ Ú Þ ¬Ò Ó× ÐÓ× ×Ó׸ ÒÓ× Ö ×Ø ÔÓÖ ¬Ò Ö ÐÓ× ÓÒרÖÙ ØÓÖ × Ý Ð × Ò ÓÒº È Ö ÐÐÓ¸ ÒÓ× ÓÒÚ Ò Ð × Ù ÒØ ÖÙØ Ò ÓÔ ¾ Å Ñ ÖÓ× ÔÙ Ð Ó× Map Matrix Graph<GT> +≡ ´ µ ¼ void copy_list_graph(GT & g); Í× × copy list graph ¿ º Ð Ù Ð ÓÔ Ö Ó g Ö ÔÖ × ÒØ Ó ÓÒ ÙÒ List Graph<Node, Arc> this¸ Ö ÔÖ × ÒØ Ó ÓÒ Map Matrix Graph<GT>º ר ÖÙØ Ò ÒÓ× Ô ÖÑ Ø ÑÙÝ ÓÒ × Ñ ÒØ ÑÔÐ ÒØ Ö ÐÓ× ÓÒרÖÙ ØÓÖ × Ý Ð × Ò ÓÒ ÔÓÖ ÑÔÐÓ ¾ ÁÑÔÐ ÒØ ÓÒ Map Matrix Graph<GT> +≡ ´ µ ½ ¿ template <class GT, class SA> Map_Matrix_Graph<GT, SA>::Map_Matrix_Graph(GT & g) : lgraph(&g), num_nodes(g.get_num_nodes()) { copy_list_graph(g); } Í× × copy list graph ¿ º È Ö ÙÐÑ Ò Ö ÓÒ ×Ø Ð × ¸ ÑÓ× ÒרÖÙÑ ÒØ Ö copy list graph()¸ Ð Ù Ð × Ö Ñ Ø ¸ × Ñ ÒØ ¸ Ó× × × ½º ¾ ÓÔ Ö ÒÓ Ó× ¾ ≡ ´ ¿µ int i = 0; for (typename GT::Node_Iterator it(g); it.has_current(); it.next(), ++i) nodes[i] = it.get_current_node(); quicksort(nodes); // ordenar nodes de modo que se soporte la b´squeda binaria u Í× × Node Iterator Ò quicksort ½¿º ¾º ¾ ÓÔ Ö Ö Ó× ¾ ≡ ´ ¿µ for (typename GT::Node_Iterator nit(g); nit.has_current(); nit.next()) { Node * src = nit.get_current_node(); const long src_idx = index_of_node<GT>(nodes, num_nodes, src); // para cada arco de src escribirlo en la matriz mat for (Node_Arc_Iterator<GT, SA> ait(src); ait.has_current(); ait.next()) {
  • 689.
    7.6. Matrices deadyacencia 663 Arc * arc = ait.get_current_arc(); Node * tgt = g.get_connected_node(arc, src); const long tgt_idx = index_of_node<GT>(nodes, num_nodes, tgt); write_matrix<Mat_Entry>(mat, src_idx, tgt_idx, num_nodes, arc); } } Í× × Node Arc Iterator Ò Node Iterator º ÆÓØ ÑÓ× Ð Ù×Ó write matrix()¸ Ð Ù Ð Ò Ö Ñ ÒØ ÒרÖÙÑ ÒØ Ð × Ö ØÙÖ Ò ÙÒ ÒØÖ ÙÒ Ñ ØÖ Þ ÑÔÐ Ñ ÒØ ÓÒ DynArray<T>º ÒØ Ò × Ð × × ×¸ Ð ÓÔ × ×Ø ÒØ × ÑÔÐ ¿ ÁÑÔÐ ÒØ ÓÒ Map Matrix Graph<GT> +≡ ´ µ ¾ template <class GT, class SA> void Map_Matrix_Graph<GT, SA>::copy_list_graph(GT & g) { // copiar atributos lgraph = &g; num_nodes = g.get_num_nodes(); nodes.cut(); // limpiar arreglos din´micos de contenidos anteriores a mat.cut(); ÓÔ Ö ÒÓ Ó× ¾ ÓÔ Ö Ö Ó× ¾ } ¬Ò × copy list graph¸ Ù× Ò ÙÒ × ¾ Ò ¼º 7.6.2 El TAD Matrix Graph<GT> Ð Ì Map Matrix Graph<GT> Ö ÒØ Ñ ÒØ ×ØÙ Ó¸ ×ÓÐÓ × ÖÚ Ô Ö Ó Ø Ò Ö ÙÒ Ö ÔÖ × ÒØ ÓÒ Ñ ØÖ Ð Ò ÙÒ ÓÒ Ó ØÓ× Ø ÔÓ Graph Node<Node Type> Ý Graph Arc<Arc Type>º ÍÒ ÑÓ ¬ ÓÒ ×Ó Ö ÙÒ ÒØÖ Ñ ØÖ Ð (i, j) Map Matrix Graph<GT> Ö ÙÒ Ò ÙÒ ÑÓ ¬ ÓÒ Ö Ø ×Ó Ö Ð Ö Ó Ø ÔÓ Graph Arc<Arc Type>º Ú × ÐÓ ÕÙ × Ö ÕÙ Ö × ÙÒ Ñ ØÖ Þ ÓÔ ÙÒ List Graph<Node, Arc> Ó ÙÒ Map Matrix Graph<GT> ÕÙ × ÔÙ ÑÓ ¬ Ö × Ò ÐØ Ö Ö Ð Ö Ó ÓÖ Ò Ð ´ Ò× ×Ø ÑÓ׸ Ø ÔÓ List Graph<Node, Arc>µº Ð ÔÖÓÔÓ× ØÓ Matrix Graph<GT> ׸ Ô٠׸ Ó Ø Ò Ö ÙÒ Ñ ØÖ Þ Ý Ò ÙÝÓ× ÓÒØ Ò Ó× × Ò ÐÓ× ÓÒØ Ò Ó× ÐÓ× Ö Ó× ÙÒ Ö Ó ÓÖ Ò ÐÑ ÒØ Ö ÔÖ × ÒØ Ó ÓÒ List Graph<Node, Arc>º Matrix Graph<GT> × ¬Ò ÔÓÖ Ð × Ù ÒØ Ð × ¿ Matrix Graph<GT> ¿ ≡ template <typename GT, class SA = Default_Show_Arc<GT> > class Matrix_Graph { Å Ñ ÖÓ× ÔÖ Ú Ó× Matrix Graph<GT> Å Ñ ÖÓ× ÔÙ Ð Ó× Matrix Graph<GT> }; ¬Ò × Matrix Graph¸ Ù× Ò ÙÒ º
  • 690.
    664 Cap´ ıtulo 7. Grafos Ä Ö Ò ÙÒ Ñ ÒØ Ð ÓÒ Map Matrix Graph<GT> × ÕÙ Matrix Graph<GT> × ÙÒ Ñ ØÖ Þ Ò Ô Ò ÒØ Ð List Graph<Node, Arc> ÓÖ Ò Ð¸ ×Ó Ö Ð Ù Ð × ÔÙ Ò Ö Ð Þ Ö ÑÓ ¬ ÓÒ × Ø ÒØÓ ÐÓ× Ú ÐÓÖ × ÐÓ× ÒÓ Ó× ÓÑÓ ÐÓ× ÐÓ× Ö Ó׺ ÆÓ × ÔÓ× Ð Ó Ø Ò Ö Ð List Graph<Node, Arc> Ô ÖØ Ö ÙÒ Ó ØÓ Ø ÔÓ Matrix Graph<GT>º Matrix Graph<GT> Ù× Ö× ÔÓÖ ÕÙ ÐÐ × ÔÐ ÓÒ × ÕÙ ×ÓÐÓ × Ò ØÖ Ö ÓÒ Ñ ØÖ × Ý Ò º ÄÓ× ØÖ ÙØÓ× Matrix Graph<GT> ×ÓÒ ÑÙÝ × Ñ Ð Ö × ÐÓ× Map Matrix Graph<GT> Å Ñ ÖÓ× ÔÖ Ú Ó× Matrix Graph<GT> ≡ ´ ¿ µ DynArray<Node_Type> nodes; DynArray<Arc_Type> arcs; mutable size_t n; Í× × arcs ¾ Ò DynArray ¾º n ×Ð ÒØ ÒÓ Ó× Ð Ö Ó Ó × ¸ Ð Ñ Ò× ÓÒ Ð Ñ ØÖ Þ Ý Ð ÖÖ ÐÓ ÒÓ Ó׺ Ð ×Ó ÙÒ ÒØÖ (i) ÙÒ Ó ØÓ Matrix Graph<GT> Ö ØÓÖÒ ÙÒ Ó ØÓ Ø ÔÓ typename GT::Node Typeº Ò ÐÓ Ñ ÒØ ¸ Ð ×Ó ÙÒ ÒØÖ (i, j) Ö ØÓÖÒ ÙÒ Ó ØÓ Ø ÔÓ typename GT::Arc Typeº ÓÒ Ð Ñ ØÖ Þ arcs¸ × ÒÓ× ÔÐ ÒØ ÙÒ Ô ÕÙ ÒÓ Ò ÓÒÚ Ò ÒØ Ô Ö ÓÖÖ Ö Ð ×Ô Ó Ó ÙÔ Ó ÔÓÖ Ð × ÒØÖ × ÒÙÐ × × Ö¸ ÔÓÖ Ð × ÒØÖ × Ò Ð × Ù Ð × ÒÓ Ý Ò Ö Ó׺ È Ö ÐÐÓ¸ ÒÓ× × ÖÚ Ö ÑÓ× Ð × Ù ÒØ ØÖ ÙØÓ ÓÒ Ð Å Ñ ÖÓ× ÔÖ Ú Ó× Matrix Graph<GT> +≡ ´ ¿ µ mutable Arc_Type Null_Value; ¬Ò × Null Value¸ Ù× Ò ÙÒ × ß º Ð Ù Ð Ö ÔÖ × ÒØ ÐÓ ÕÙ × ÓÒ× Ö Ð Ù× Ò Ö Óº ר Ú ÐÓÖ ×Ô Ð ÔÙ Ó × ÖÚ Ö× Ñ ÒØ Å Ñ ÖÓ× ÔÙ Ð Ó× Matrix Graph<GT> ≡ ´ ¿ µ const Arc_Type & null_value() const { return Null_Value; } Í× × Null Value º Ë Ð ×Ó (i, j) ÙÒ Matrix Graph<GT> Ö ØÓÖÒ Null value¸ ÒØÓÒ × ÒÓ Ü ×Ø Ö Ó ÒØÖ Ð ÒÓ Ó i Ý jº Ì ÒØÓ Ð ÓÒרÖÙ ÓÒ ÓÑÓ Ð × Ò ÓÒ × ÔÓÝ Ò Ò ÙÒ ÖÙØ Ò ÓÑÙÒ ÐÐ Ñ copy()¸ Ð Ù Ð × ×Ó Ö Ö Ò Ó× Ú Ö× ÓÒ × Å Ñ ÖÓ× ÔÖ Ú Ó× Matrix Graph<GT> +≡ ´ ¿ µ void copy(Matrix_Graph & mat) { n = mat.n; // copiar atributos Null_Value = mat.Null_value; nodes.cut(); // limpiar memoria de arreglos din´micos a arcs.cut(); arcs.set_default_initial_value(Null_Value); for (int i = 0; i < n; ++i) // recorrer mat[i,j] y copiarla a nodes[], arcs[] { nodes[i] = mat.nodes[i]; for (int j = 0; j < n; ++j) { const long mat_index = index_array(i, j, n); if (not arcs.exist(mat_index)) continue; arcs.touch(mat_index) = mat.arcs.access(mat_index);
  • 691.
    7.6. Matrices deadyacencia 665 } } } void copy(GT & g) { n = g.get_num_nodes(); DynArray<typename GT::Node *> ptr; // arreglo temporal int i = 0; for (typename GT::Node_Iterator it(g); it.has_current(); it.next(), ++i) ptr[i] = it.get_current_node(); quicksort(ptr); // ordenar por si se requiere relaci´n con Map_Matrix_Graph o arcs.set_default_initial_value(Null_Value); for (i = 0; i < n; ++i) // coloca contenidos de ptr[] en nodes[] { typename GT::Node * src = ptr[i]; nodes[i] = src->get_info(); for (Node_Arc_Iterator<GT, SA> it(src); it.has_current(); it.next()) { typename GT::Arc * arc = it.get_current_arc(); typename GT::Node * tgt = it.get_tgt_node(); const long j = index_of_node<GT>(ptr, n, tgt); const long mat_index = index_array(i, j, n); arcs[mat_index] = arc->get_info(); } } } Í× × arcs ¾ ¸ DynArray ¾¸ Matrix Graph ¿ ¸ Node Arc Iterator ¸ Node Iterator ¸ Null Value ¸ Ò quicksort ½ ¿ º ÄÓ× ×Ó× ÐÓ× Ð Ñ ÒØÓ× Ð Ñ ØÖ Þ × Ö Ð Þ Ò Ñ ÒØ Ð ÓÔ Ö ÓÖ () Ñ Ò Ö × Ñ Ð Ö Ð Ø ÔÓ ×ØÙ Ó Ò Ü º º½ ´Ô Ò µº Ò Ð ×Ó ÙÒ ÒØÖ Ñ ØÖ Ð (i, j) × Ö Ð Þ Ð ×Ø Ò ÓÒ ÒØÖ ÙÒ Ð ØÙÖ Ý × Ö ØÙÖ º ÁÐÙ×ØÖ ÑÓ× Ð Ñ Ò Ö Ò ÕÙ × Ñ Ò Ð Ñ ÑÓÖ ÓÒ Ð ÖÖ ÐÓ Ò Ñ Ó Ý ÐÓ× Ú ÐÓÖ × ÒÙÐÓ× Ñ ÒØ Ð × Ù ÒØ ÓÔ Ö ÓÖ ×Ó ÙÒ Ñ ØÖ Þ ÓÒר ÒØ Å Ñ ÖÓ× ÔÙ Ð Ó× Matrix Graph<GT> +≡ ´ ¿ µ const Arc_Type & operator () (const long & i, const long & j) const { const long mat_index = index_array(i, j, n); if (not arcs.exist(mat_index)) // ¿Existe entrada? return Null_Value; // No ==> no hay arco return arcs.access(mat_index); } Í× × arcs ¾ Ò Null Value º 7.6.3 El TAD Ady Mat<GT, Entry> Ò ÑÙ × Ö ÙÒר Ò × × Ö ÕÙ Ö ÙÒ Ñ ØÖ Þ ÓÑÓÑÓÖ ÙÒ Ý Ò ÕÙ ÓÒ¹ Ø Ò Ú ÐÓÖ × ×Ø ÒØÓ× Ý¸ ÑÙÝ ÔÖÓ Ð Ñ ÒØ ¸ Ø ÔÓ× Ö ÒØ × ÐÓ× Ð Ö Óº ÈÓÖ Ñ¹ ÔÐÓ¸ ÔÙ Ö Ò × Ø Ö× ÙÒ Ñ ØÖ Þ ÓÒØ ÒØ Ú ÙÖ ÓÒ × ØÖ Ý ØÓ× ÒØÖ Ö Ó׺ È Ö Ð × ØÙ ÓÒ ÒØ Ö ÓÖ × Ø Ò Ð Ø ÔÓ Ady Mat<GT, Entry>¸ Ð Ù Ð ÑÓ Ð Þ ÙÒ Ñ ØÖ Þ Ð Ñ ÒØÓ× Ø ÔÓ Entry Type Ý ×Ô ¬ Ð × Ù ÒØ ÓÖÑ
  • 692.
    666 Cap´ ıtulo 7. Grafos Ady Mat<GT, Entry> ≡ template <class GT, typename __Entry_Type, class SA = Default_Show_Arc<GT> > class Ady_Mat { Å Ñ ÖÓ× ÔÖ Ú Ó× Ady Mat<GT, Entry> Å Ñ ÖÓ× ÔÙ Ð Ó× Ady Mat<GT, Entry> }; ÁÑÔÐ ÒØ ÓÒ Ñ ØÓ Ó× Ady Mat<GT, Entry> ¬Ò × Ady Mat¸ Ù× Ò ÙÒ × ß Ò ¾½ß¾¿º Ady Mat<GT, Entry> ר Ö ×ØÖ Ø Ñ ÒØ Ð Ó ÙÒ Ó ØÓ List Graph<Node, Arc>º Ð ÔÙÒØÓ × Ò Ð Ò Ð Ð × Ady Mat<GT, Entry> ר Ó ÔÓÖ Ð Ó ÕÙ Ð Ù×Ù Ö Ó ÔÙ Ö Ð Ø ÔÓ ØÓ× ÕÙ Ð Ö Ö Ò Ð × ÒØÖ × Ð Ñ ØÖ Þº ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ady Mat<GT, Entry> ÒÓ Ò × Ö Ñ ÒØ Ö ÔÖ × ÒØ ÙÒ Ñ ØÖ Þ Ý Ò º ÄÓ× ØÖ ÙØÓ× Ady Mat<GT, Entry> ×ÓÒ ÑÙÝ × Ñ Ð Ö × ÐÓ× Ð × Ñ ØÖ × ÒØ ¹ Ö ÓÖ × Å Ñ ÖÓ× ÔÖ Ú Ó× Ady Mat<GT, Entry> ≡ ´ µ GT * lgraph; DynArray<Node*> nodes; DynArray<Entry_Type> mat; mutable size_t num_nodes; mutable Entry_Type Null_Value; Í× × DynArray ¾ Ò Null Value º ÄÓ× ×Ó× ÙÒ Ó ØÓ Ady Mat<GT, Entry> ×ÓÒ × Ñ Ð Ö × ÐÓ× Map Matrix Graph<GT>º ÄÓ× ÒÓ Ó× ÔÙ Ò Ö Ö Ö× ÔÓÖ ÔÙÒØ ÖÓ× ÒÓ Ó× Ò ÙÒ List Graph<Node, Arc> Ó ÔÓÖ ×Ù× Ò × ÒØ ÖÓ× Ö ×Ô ØÓ Ð Ñ ØÖ Þº Ð ÓÒ×ÙÑÓ Ñ ÑÓÖ Ð Ñ ØÖ Þ × ÔÖÓÔÓÖ ÓÒ Ð Ð ÒØ ÒØÖ × ÕÙ Ý Ò × Ó × Ö Ø ×º ÍÒ ÒØÖ (i, j) ÕÙ ÒÓ Ý × Ó × Ö Ø ÔÙ Ö ØÓÖÒ Ö false Ù Ò Ó × ÒÚÓÕÙ mat.exist(index)º × ÔÓÖ ×Ø Ñ Ó ÕÙ × Ø Ø × Ð ÒØÖ × ÒÙÐ º Ð Ö ×ØÓ ÐÓ× ØÖ ÙØÓ× ×ÓÒ Ó × ÖÚ Ð × Å Ñ ÖÓ× ÔÙ Ð Ó× Ady Mat<GT, Entry> ≡ ´ µ GT & get_list_graph() { return *lgraph; } const Entry_Type & null_value() const { return Null_Value; } const size_t & get_num_nodes() const { return num_nodes; } Í× × Null Value º Ð Ù×Ó Null Value × Ð Ñ ×ÑÓ ÕÙ Ð Ð Ð × Matrix Graph<GT> ¬Ò Ö Ð ÖÓ Ò Ð Ñ ØÖ Þ Ý Ô ÖÑ Ø Ö ÙÒ ÓÖÖÓ ×Ô Ó ÔÓÖ ÐÓ× Ö Ó× Ù× ÒØ ׺ ÈÙ ×ØÓ ÕÙ Ð Ø ÔÓ ØÓ ÕÙ ÓÒØ Ò Ð Ñ ØÖ Þ × Ò Ô Ò ÒØ Ð Ó ØÓ List Graph<Node, Arc>¸ ÒÓ Ý Ò × Ó ÙÔ Ö ×Ô Ó ÔÖ ÓÖ Ô Ö Ð ÓÒØ Ò Ó Ð Ñ ØÖ Þº ÈÓÖ ×Ó Ø Ò × ÒØ Ó Ð × Ù ÒØ ÓÒרÖÙ ØÓÖ Å Ñ ÖÓ× ÔÙ Ð Ó× Ady Mat<GT, Entry> +≡ ´ µ Ady_Mat(GT & g) : lgraph(&g), num_nodes(lgraph->get_num_nodes()) { copy_nodes(g); } Í× × Ady Mat º Ò ×Ø ×Ó Ð Ñ ØÖ Þ ÒÓ Ó ÙÔ Ñ ÑÓÖ Ò ÐÑ ÒØ ר × Ô ÖØ Ö Ñ ÕÙ Ð × ÒØÖ × × Ú Ý Ò × Ö Ò Óº Ë Ò Ñ Ö Ó¸ × × ÓÔØ ÔÓÖ ÓÒרÖÙ Ö ×Ø ÓÖÑ ÙÒ Ó ØÓ Ady Mat<GT, Entry>¸ ÒØÓÒ × Ð Ù×Ù Ö Ó ¸ Ð Ñ ×ÑÓ¸ Ò Ö Ö× ×Ö Ö
  • 693.
    7.6. Matrices deadyacencia 667 ØÓ × Ð × ÒØÖ × Ð Ñ ØÖ Þ ´ ØÖ Ú × Ð ÓÔ Ö ÓÖ (i, j)µ¸ ÔÙ × Ð Ú ÐÓÖ Null Value ÒÓ × ¬Ò Ó Ó¸ ¬Ò Ö Null Value ÒØ × Ö Ð Þ Ö Ù ÐÕÙ Ö × Ö ØÙÖ º Ð Ì ÒÓ Ú Ö ¬ ר ÓÖ Òº À Ý Ó× Ñ Ò Ö × ÓÖÖ Ö Ñ ÑÓÖ ÔÓÖ Ù× Ò Ö Ó× Ó ÔÓÖÕÙ Ð ÔÐ ÓÒ Ñ Ò Ð ÙÒ Ð Ñ ÒØÓ ÒÙÐÓ¸ Ð ÔÖ Ñ Ö ÓÒ× ×Ø Ò ¬Ò Ö Null Value Ò Ø ÑÔÓ ÓÒרÖÙ ÓÒ Ñ ÒØ Å Ñ ÖÓ× ÔÙ Ð Ó× Ady Mat<GT, Entry> +≡ ´ µ Ady_Mat(GT & g, const Entry_Type & null) : lgraph(&g), num_nodes(lgraph->get_num_nodes()), Null_Value(null) { copy_nodes(*lgraph); } Í× × Ady Mat Ò Null Value º Ò ×Ø ×Ó¸ Entry Type × Ö Ð Ñ ×ÑÓ Ø ÔÓ ÕÙ GT::Arc Typeº ÍÒ ÖÖÓÖ ÓÑÔ ¹ Ð ÓÒ Ò Ö Ö× × ÒÓ × × º Ä × ÙÒ Ñ Ò Ö × Ñ ÒØ Ð × Ù ÒØ ÔÖ Ñ Ø Ú Å Ñ ÖÓ× ÔÙ Ð Ó× Ady Mat<GT, Entry> +≡ ´ µ void set_null_value(const Entry_Type & null) { Null_Value = null; } Í× × Null Value º Ð Ø ÔÓ Ady Mat<GT, Entry> ר ר Ò Ó Ô Ö Ù Ö Ö ØÓ× Ù ÐÕÙ Ö Ø ÔÓ ×Ó Ö ØÓ Ó Ô Ö Ð ÙÐÓ× Ø ÑÔÓÖ Ð × Ö ÕÙ Ö Ó× ÔÓÖ Ð ÓÖ ØÑÓ× Ö Ó× × Ò Ó× Ô Ö Ñ ØÖ × Ý Ò º ÓÑÓ Ø Ð¸ × ÑÙÝ ÓÑÙÒ Ò Ð Þ Ö Ñ ØÖ × Ø ÔÓ Ady Mat<GT, Entry>º È Ö ×Ø Ø Ö ¸ × ÔÖÓÚ Ò Ó× Ð × × ÒØ Ö × ½º Å Ñ ÖÓ× ÔÙ Ð Ó× Ady Mat<GT, Entry> +≡ ´ µ template <class Operation> void operate_all_arcs_list_graph(); Í× × operate all arcs list graph º ר ÔÖ Ñ Ø Ú ÙØ Ð ÓÔ Ö ÓÒ Operation() ×Ó Ö ÒØÖ Ð Ñ ØÖ Þ ÕÙ ÓÒØ Ò ÙÒ Ö Ó Ò List Graph<Node, Arc>º ÆÓØ ÑÓ× ÕÙ Ð ÓÔ Ö ÓÒ ÒÓ × ÒÚÓ Ô Ö Ö Ó× Ù× ÒØ ׺ Ð ÓÖÑ ØÓ Ð Ð × Operation() × Operation()(mat, arc, i, j, entry)¸ ÙÝÓ× Ô Ö Ñ ØÖÓ× × × Ö Ò × ´ µ mat × ÙÒ Ö Ö Ò Ð Ó ØÓ Ady Mat<GT, Entry> ×Ó Ö Ð Ù Ð × ×Ø Ö Ð Þ Ò Ó Ð ÓÔ Ö ÓÒº ´ µ arc × ÙÒ ÔÙÒØ ÓÖ Ð Ö Ó ÒØÖÓ Ð List Graph<Node, Arc> ×Ó Ó Ð Ñ ØÖ Þº ´µi × Ð Ò Ð ÒÓ Ó ÓÖ Ò Ò Ð Ñ ØÖ Þº ´µj × Ð Ò Ð ÒÓ Ó ×Ø ÒÓ Ò Ð Ñ ØÖ Þº ´ µ entry × ÙÒ Ö Ö Ò Ð ÓÒØ Ò Ó Ð ÒØÖ (i, j) Ò Ð Ñ ØÖ Þº Ú ÒØÙ ÐÑ ÒØ ¸ × × Ö ÕÙ Ö ØÖ Ò×Ñ Ø Ö Ð ÙÒ Ô Ö Ñ ØÖÓ ÓÒ Ð Ð ÓÔ Ö ÓÒ¸ ÒØÓÒ × ÔÙ Ù× Ö× Ð × Ù ÒØ Ú Ö× ÓÒ Å Ñ ÖÓ× ÔÙ Ð Ó× Ady Mat<GT, Entry> +≡ ´ µ template <class Operation> void operate_all_arcs_list_graph(void * ptr); Í× × operate all arcs list graph º
  • 694.
    668 Cap´ ıtulo 7. Grafos Ä Ù Ð ÒÚÓ Operation()(mat, arc, i, j, entry, ptr)º ÓÑÓ ÑÔÐÓ¸ ÓÒ× Ö ÑÓ× Ò Ð Þ Ö ÙÒ Ñ ØÖ Þ ÓÒ ÐÓ× Ú ÐÓÖ × ×Ø Ò × Ù Ö Ó× Ò Ö Óº ËÙÔÓÒ Ò Ó ÕÙ Ð ×Ø Ò ÙÒ Ö Ó × × Ð Ñ ÒØ ÙÒ Ñ ØÓ Ó Ð Ö Ó ÐÐ Ñ Ó get distance()¸ Ð Ò Ð Þ ÓÒ ÙÒ Ö Ó Ò Ð Ñ ØÖ Þ ÔÙ ×Ô ¬ Ö× ×Ø ÑÓ Ó struct Init_Arc { void operator () (AdyMat<Grafo) & mat, Grafo::Arc * arc, int & i, int & j, Entry & entry) { entry = arc->get_distance(); } }; ר ÑÓ Ó¸ ÔÙ Ò Ò Ö× ØÓ × Ð × ÒØÖ ×Ñ ÒØ mat.operate_all_arcs_list_graph <Init_Arc> (); ÈÙ ×ØÓ ÕÙ ×ÓÐÓ × Ò Ð Þ Ò ÒØÖ × Ô Ö Ö Ó× ÒØÖÓ Ð List Graph<Node, Arc> ×Ó Ó¸ ÕÙ ÐÐ × ÒØÖ × Ò ÓÒ ÒÓ Ý Ö Ó ÓÒØ Ò Ò Ð Ú ÐÓÖ Null Valueº ¾º Ä × ÙÒ ÒØ Ö Þ ×Ø × Ò Ò × Ady Mat<GT, Entry> Å Ñ ÖÓ× ÔÙ Ð Ó× Ady Mat<GT, Entry> +≡ ´ µ template <class Operation> void operate_all_arcs_matrix(); template <class Operation> void operate_all_arcs_matrix(void * ptr); Í× × operate all arcs matrix º Ð ×ÕÙ Ñ × × Ñ Ð Ö Ð ÒØ Ö ÓÖ¸ × ÐÚÓ ÕÙ ¸ Ò ×Ø ×Ó¸ × Ö ÓÖÖ Ò ØÓ × Ð × ÒØÖ × Ý¸ ÔÓÖ Ø ÒØÓ¸ × Ô ÖØ Ð Ñ ÑÓÖ Ô Ö ØÓ ׺ ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð ÓÒ×ÙÑÓ ×Ô Ó × O(n2)º Ð ×ÕÙ Ñ Ô Ö Ñ ØÖÓ× Ð Ð × Operation() × Ð × Ù ÒØ ´ µ mat Ö Ö Ò Ð Ñ ØÖ Þº ´ µ src node ÔÙÒØ ÖÓ Ð ÒÓ Ó ÓÖ Ò ÒØÖÓ Ð List Graph<Node, Arc> ×Ó¹ Óº ´ µ tgt node ÔÙÒØ ÖÓ Ð ÒÓ Ó ×Ø ÒÓ ÒØÖÓ Ð List Graph<Node, Arc> ×Ó¹ Óº ´µs Ò Ð ÒÓ Ó ÓÖ Òº ´µt Ò Ð ÒÓ Ó ×Ø ÒÓº ´ µ entry Ö Ö Ò ÒØÖ ÒØÖÓ Ð Ñ ØÖ Þº ´ µ ptr ´ÓÔ ÓÒ Ð × ÙÒ Ð ÒØ Ö Þµ ÔÙÒØ ÖÓ ÓÔ Óº Ð Ö¬ Ð ÒØ Ö Þ¸ ÔÓ ÑÓ× ÑÓ×ØÖ Ö Ð ÙÒ × Ð × ÑÔÐ Ñ ÒØ ÓÒ × ÐÓ× Ñ ØÓ Ó× ÒØ Ö ÓÖ × ÁÑÔÐ ÒØ ÓÒ Ñ ØÓ Ó× Ady Mat<GT, Entry> ≡ ´ µ template <class GT, typename __Entry_Type, class SA> template <class Operation> void Ady_Mat<GT, __Entry_Type, SA>::operate_all_arcs_list_graph()
  • 695.
    7.6. Matrices deadyacencia 669 { // recorrer todos los nodos del grafo for (typename GT::Node_Iterator nit(*lgraph); nit.has_current(); nit.next()) { Node * src = nit.get_current_node(); const long src_idx = index_of_node<List_Graph_Type>(nodes, num_nodes, src); // recorrer todos los arcos del nodo origen for (Node_Arc_Iterator<GT, SA> at(src); at.has_current(); at.next()) { Arc * arc = at.get_current_arc(); const long tgt_idx = index_of_node<List_Graph_Type>(nodes, num_nodes, arc->get_tgt_node()); Entry_Type & entry = mat.touch(index_array(src_idx, tgt_idx, num_nodes)); Operation () (*this, arc, src_idx, tgt_idx, entry); } } } template <class GT, typename __Entry_Type, class SA> template <class Operation> void Ady_Mat<GT, __Entry_Type, SA>::operate_all_arcs_matrix() { const long & n = num_nodes; for (int s = 0; s < n; ++s) { Node * src_node = get_node<GT>(nodes, s); for (int t = 0; t < n; ++t) { Node * tgt_node = get_node<GT>(nodes, t); Entry_Type & entry = mat.touch(index_array(s, t, num_nodes)); Operation () (*this, src_node, tgt_node, s, t, entry); } } } ¬Ò × operate all arcs list graph¸ Ù× Ò ÙÒ º operate all arcs matrix¸ Ù× Ò ÙÒ × Ò ¾¿ º Í× × Ady Mat ¸ Node Arc Iterator ¸ Ò Node Iterator º 7.6.4 El TAD Bit Mat Graph<GT> Ä ÙÐØ Ñ Ð × Ñ ØÖ Þ × ÒÓÑ Ò Bit Mat Graph<GT> Ý Ö ÔÖ × ÒØ ÙÒ ÑÙÝ × ÑÔÐ Ñ ØÖ Þ Ý Ò Ø×º ÍÒ Ú ÐÓÖ ÙÒÓ Ò ÔÖ × Ò Ö Ó ÙÒÓ ÒÙÐÓ¸ Ù× Ò¹ º ÈÓÖ ×ÙÔÙ ×ØÓ¸ Ð Ø ÔÓ Ò Ù ×Ø ÓÒ ×Ø × Ó Ò Ð Ì BitArray × ÖÖÓÐÐ Ó Ò Ü ¾º½º¿ ´Ô Ò ¿ µ Ý × ¬Ò Ð × Ù ÒØ Ñ Ò Ö Å ØÓ Ó× ÔÖ Ú Ó× Bit Mat Graph<GT> ≡ ´ µ ¼ BitArray bit_array; Í× × BitArray ¿ º Å ÒØÖ × ÕÙ Ð Bit Mat Graph<GT> × ×Ô ¬ Ñ ÒØ Ð × Ù ÒØ Ð × Bit Mat Graph<GT> ≡ template <class GT, class SA = Default_Show_Arc<GT> > class Bit_Mat_Graph
  • 696.
    670 Cap´ ıtulo 7. Grafos { Å ØÓ Ó× ÔÖ Ú Ó× Bit Mat Graph<GT> Å ØÓ Ó× ÔÙ Ð Ó× Bit Mat Graph<GT> ¼ }; ¬Ò × Bit Mat Graph¸ Ù× Ò ÙÒ × ¼ ¸ ¾¸ Ò ¿º ÍÒ Bit Mat Graph<GT> Ö ÔÖ × ÒØ ÙÒ Ñ ØÖ Þ Ý Ò ¸ ÙÝÓ× Ø× ×ÓÐÓ ÜÔÖ × Ò ÔÖ × Ò Ó Ù× Ò Ö Ó ÒØÖÓ ÙÒ Ö Ó Ö ÔÖ × ÒØ Ò Ó ÓÒ ÙÒ List Graph<Node, Arc>º Bit Mat Graph<GT> ÒÓ × ÖÚ Ô Ö Ñ Ò Ö ÑÙÐØ Ö Ó× Ó ÑÙй Ø Ö Ó׺ Bit Mat Graph<GT> Ñ ÒØ Ò ÙÒ ÔÙÒØ ÓÖ Ð List Graph<Node, Arc> ×Ó Ó¸ ÙÒ ÖÖ ÐÓ Ò Ñ Ó ÒÓ Ó× ÕÙ Ô ÖÑ Ø Ö Ð ÙÐ Ö Ö Ô Ñ ÒØ Ð Ò Ñ ÒØ Ð Ù×ÕÙ Ò Ö Ý Ð ÒØ ÒÓ Ó× ¼ Å ØÓ Ó× ÔÖ Ú Ó× Bit Mat Graph<GT> +≡ ´ µ GT * lgraph; DynArray<typename GT::Node*> nodes; mutable size_t n; Í× × DynArray ¾º À Ý Ú Ö × Ñ Ò Ö × ÓÒרÖÙ Ö ÙÒ Bit Mat Graph<GT> ¼ Å ØÓ Ó× ÔÙ Ð Ó× Bit Mat Graph<GT> ¼ ≡ ´ µ ¼ Bit_Mat_Graph() : lgraph(NULL) { /* empty */ } Bit_Mat_Graph(GT & g) : lgraph(&g) { copy_list_graph(g); } Bit_Mat_Graph(const Bit_Mat_Graph & bitmat) : bit_array(bitmat.bit_array), lgraph(bitmat.lgraph), nodes(bitmat.nodes), n(bitmat.n) { /* empty */ } Bit_Mat_Graph(const size_t & dim) : bit_array(dim*dim), lgraph(NULL), nodes(dim), n(dim) { /* empty */ } Í× × Bit Mat Graph Ò copy list graph ¿º Ð Ù ÖØÓ ÓÒרÖÙ ØÓÖ ÒÓ Ö ÕÙ Ö ÙÒ List Graph<Node, Arc> ÔÓÖÕÙ ×Ø ר Ò Ó Ô Ö Ð Ö Ö Ñ ØÖ × Ø× Ù× Ö× Ô Ö Ð ÙÐÓ× Ô Ö Ð ×º רӏ ÔÓÖ ×ÙÔÙ ×ØÓ¸ ÑÔ Ð ×Ó ÔÓÖ Ö ÓÒ × ÒÓ Ó× Ò ÙÒ List Graph<Node, Arc>º Ú ÒØÙ ÐÑ ÒØ ¸ × ÔÙ ×Ô ¬ Ö Ð List Graph<Node, Arc> ÔÓÖ × Ô Ö Ó¸ × ÓÑÓ Ø Ñ Ò ÓÒ×ÙÐØ ÖÐÓ ¼ Å ØÓ Ó× ÔÙ Ð Ó× Bit Mat Graph<GT> ¼ +≡ ´ µ ¼ ¼ void set_list_graph(GT & g) { lgraph = &g; copy_list_graph(g); } GT * get_list_graph() { return lgraph; } ¬Ò × set list graph¸ Ù× Ò ÙÒ ¿ º Í× × copy list graph ¿º Ò ÐÑ ÒØ ¸ ÑÓ× ÑÔÐ ÒØ Ö Ð × Ù ØÖÓ ÓÖÑ × ×Ó¸ Ó× Ð × Ù Ð × ÔÙ Ò ÒרÖÙÑ ÒØ Ö× Ö Ø Ñ ÒØ ÓÖÑ × Ñ Ð Ö Ð × Ð × × Ñ ØÖ × ÕÙ Ý ÑÓ× ØÖ Ø Ó ¼ Å ØÓ Ó× ÔÙ Ð Ó× Bit Mat Graph<GT> ¼ +≡ ´ µ ¼ Node * operator () (const long & i)
  • 697.
    7.6. Matrices deadyacencia 671 { return Aleph::get_node<GT>(nodes, i); } long operator () (Node * node) const { return index_of_node<GT>(nodes, n, node); } Ä ÑÔÐ ÒØ ÓÒ Ð ×Ó ÙÒ ÒØÖ Ñ ØÖ Ð (i, j) × Ñ × ÓÑÔÐ ÕÙ Ð × ÒØ Ö ÓÖ ×¸ ÔÙ × Ð ÓÑÔ Ð ÓÖ Ý Ð Ñ ÝÓÖ Ö Û Ö ÒÓ Ñ Ò Ò Ø× ÓÑÓ ÙÒ ÙÒ º Ð ÓÑÔ Ð ÓÖ Ñ Ò Ô Ð Ö × ÓÑÔÙ ×Ø × ÔÓÖ Ø×º ÆÓ ÔÓ ÑÓ׸ Ô٠׸ ÑÔÐ ÒØ Ö Ð ÓÔ Ö ÓÖ (i, j) Ô Ö ÕÙ Ö ØÓÖÒ ÙÒ Øº Ì ÑÔÓ Ó ÒÓ× × ÖÚ ÕÙ Ð ÓÔ Ö ÓÖ (i, j) ÒÓ× Ö ØÓÖÒ ÙÒ Ô Ð Ö Ø ÔÓ int¸ ÔÙ × Ð ×Ó ÔÓ Ö × Ö × Ö ØÙÖ º ÑÓ׸ ÒØÓÒ ×¸ ר Ò Ù Ö ÐÓ× ×Ó× × Ö ØÙÖ ÐÓ× Ð ØÙÖ Ý¸ Ô Ö ÐÐÓ¸ Ù× Ö ÑÓ× ÙÒ Ð × Proxy Ò Ð Ñ ×ÑÓ ×Ø ÐÓ ÕÙ ÓØÖÓ× Ø ÔÓ× Ý ×ØÙ Ó׺ 7.6.5 Algoritmo de Warshall ÁÐÙ×ØÖ Ö ÑÓ× ÒÙ ×ØÖ ÔÖ Ñ Ö ÙØ Ð Þ ÓÒ ÙÒ Ñ ØÖ Þ Ý Ò Ô Ö ÑÔÐ ÒØ Ö ÙÒ Ð Ö Ð ÓÖ ØÑÓ ÕÙ Ð ÙÐ ØÓ × Ð × Ö Ð ÓÒ × ÓÒ Ø Ú ÙÒ Ö Ó ØÖ Ú × ÐÓ× ×Ø ÒØÓ× Ñ ÒÓ׺ Ð Ð ÓÖ ØÑÓ Ò Ù ×Ø ÓÒ Ø Ò Ñ × × ÒØ Ó ×Ó Ö Ö Ó× Ö Ó× Ý × ÓÒÓ Ó ÓÑÓ Ï Ö× ÐÐ ¿ Ò ÓÒÓÖ ×Ù × Ù Ö ÓÖº 02 04 06 10 13 03 07 09 11 01 05 08 12 14 ÙÖ º¿¾ ÍÒ Ö Ó Ö Ó ÓÑÓ ÒÙÒ ÑÓ× Ð ÔÖ Ò Ô Ó¸ ÙÒ Ö Ó × ÙÒ Ñ Ò Ö Ö ÔÖ × ÒØ Ö ÙÒ Ö Ð ÓÒ Ñ Ø Ñ Ø º Ò ×Ø × ÒØ Ó¸ ÙÒ Ö Ð ÓÒ Ò Ö E ×Ó Ö ÙÒ ÓÒ ÙÒØÓ V ´ÐÓ ÕÙ ÓÒ ÓÖÑ Ð Ö Ó < V, E >µ es transitiva × ∀x, y, z ∈ V, (x, y), (y, z) ∈ Eº ÍÒ grafo transitivo × ØÓ Ó ÕÙ Ð ÕÙ Ö ÔÖ × ÒØ ÙÒ Ö Ð ÓÒ ØÖ Ò× Ø Ú º Definici´n 7.5 (Clausura transitiva) Ä Ð Ù×ÙÖ o ØÖ Ò× Ø Ú ÙÒ Ö Ð ÓÒ R × Ð Ö Ð ÓÒ R∗ ¬Ò ÔÓÖ ØÓ Ó Ô Ö (x, y) ∈ R∗ Ø Ð ÕÙ Ü ×Ø ÙÒ Ñ ÒÓ ÒØÖ x yº Ä Ð Ù×ÙÖ ØÖ Ò× Ø Ú R∗ ÙÒ Ö Ð ÓÒ R × Ð Ñ Ò Ñ Ö Ð ÓÒ ÕÙ ÓÒØ Ò Rº Ë ÙÒ Ö Ð ÓÒ R × Ö ÔÖ × ÒØ Ñ ØÖ ÐÑ ÒØ ¸ ÒØÓÒ ×¸ Ð Ñ ØÖ Þ ÓÖÖ ×ÔÓÒ ÒØ Ð Ö Ð ÓÒ R∗ Ö ÔÖ × ÒØ ØÓ × Ð × Ö Ð ÓÒ × ÔÓ× Ð × ÓÒ Ø Ú ÒØÖ ÔÖ ÒÓ Ó׺ ÍÒ ÒØÖ R∗ = 0 Ò ÕÙ Ü ×Ø ÙÒ Ñ ÒÓ ÒØÖ ÐÓ× ÒÓ Ó× i Ý jº Ð ÙÐ Ö (i,j) R∗ ÒÓ× Ô ÖÑ Ø ¸ Ô٠׸ ÑÔÐ Ñ ÒØ Ö ÙÒ ÔÖÙ Ü ×Ø Ò Ñ ÒÓ ÒØÖ Ù ÐÕÙ Ö Ô Ö ÒÓ Ó׺ Ð Ð ÓÖ ØÑÓ Ï Ö× ÐÐ Ô Ö Ð ÙÐ Ö Ð Ð Ù×ÙÖ ØÖ Ò× Ø Ú × × ÖÚ Ð ÓÒרÖÙ ÓÒ Ö Ð ÓÒ × ÒØÖ Ñ ÒÓ× ÐÓÒ ØÙ i + 1º Ä × ÓÒרÖÙ Ö ÙÒ × Ù Ò
  • 698.
    672 Cap´ ıtulo 7. Grafos Ö Ð ÓÒ × ÒØ ÖÑ × ´Ó Ö Ó×µ R0, R1, R2, . . . , Rnº Ò Ø Ö ÓÒ ÕÙ Ð ÙÐ Rk¸ × Ü Ñ Ò Ò ØÓ Ó× ÐÓ× ØÖ Ó× (vk, vi, vj) ÒÓ Ó× R k−1º Ë Ð ØÖ Ò× ØÓÖ vi −→ vj −→ vk Ü ×Ø Ò R k−1¸ ÒØÓÒ × × Ò Ð Ö Ó vi −→ vk R k k i j k i j =⇒ ´ µ Rk−1 ´ µ Rk ÙÖ º¿¿ Ò ÙÖ Ö Ó Ò Rk ÈÓÖ ×ÙÔÙ ×ØÓ¸ × ÒØÖÓ ÙÒ ØÖ Ó (vk, vi, vj) Ò Rk−1 Ý Ü ×Ø ÙÒ Ö Ó vi −→ vk¸ ÒØÓÒ × Ð ÒØÖ Rk = 1º Ä ÓÖÑÙÐ Ö ×ÙÐØ ÒØ ׸ ÒØÓÒ × i,j Ri = Ri−1 ∨ (Ri−1 ∧ Ri−1) i,j i,j i,k k,j ´ º¾µ Ð ÔÖÓ ×Ó × ÙØ n Ú × ×Ø ÐÐ Ö ÐÓ× Ñ ÒÓ× ÐÓÒ ØÙ nº ÄÓ ÕÙ ÒÓ× ÖÖÓ n ∗ R =R = n Rk−1 × Rk ´ º¿µ k=1 Ä ÓÔ Ö ÓÒ Rk−1 × Rk × Ö Ð Þ × ÙÒ ´ º¾µº ½ ¾ ¿ ½¼ ½½ ½¾ ½¿ ½ ½ ¼ ¼ ½ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¾ ¼ ¼ ¼ ½ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¿ ¼ ¼ ¼ ¼ ½ ½ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ½ ¼ ¼ ¼ ¼ ½ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ½ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ½ ¼ ¼ ¼ ¼ R0 = ¼ ¼ ¼ ½ ¼ ¼ ¼ ½ ½ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ½ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ½ ¼ ½ ¼ ¼ ½¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ½ ¼ ½½ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ½ ¼ ½¾ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ½ ¼ ¼ ¼ ½¿ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ½ ½ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ½ ¼ ¼ ÙÖ º¿ Å ØÖ Þ Ý Ò Ø× Ð Ö Ó Ð ¬ ÙÖ º¿¾ Ð Ð ÙÐÓ Ð Ð Ù×ÙÖ ØÖ Ò× Ø Ú ÙÒ Ö Ó Ö ÔÖ × ÒØ Ó Ñ ÒØ ÙÒ Ó ØÓ Ø ÔÓ List Graph<Node, Arc> × ÒרÖÙÑ ÒØ Ò Ð Ö ÚÓ Û Ö× ÐкÀ ¾ ×Ô ¬ Ó Ð × Ù ÒØ ÓÖÑ ¾ Û Ö× ÐкÀ ¾ ≡ template <class GT, class SA> void warshall_compute_transitive_clausure(GT & g, Bit_Mat_Graph<GT, SA> & mat) {
  • 699.
    7.6. Matrices deadyacencia 673 Ð ÙÐ Ö Ð Ù×ÙÖ ØÖ Ò× Ø Ú ¿ } Í× × Bit Mat Graph º × ÙÒ List Graph<Node, Arc> ×Ó Ö Ð Ù Ð × × Ð ÙÐ Ö Ð Ð Ù×ÙÖ ØÖ Ò× Ø Ú g Ñ ÒØÖ × ÕÙ mat × Ð Ö ×ÙÐØ Ó Ð Ð Ù×ÙÖ Ò Ù ×Ø ÓÒ × ÙÒ Ð Ð ÓÖ ØÑÓ Ï Ö× Ðк ØÓ× ÓÖÖÓ ×Ô Ó¸ ÔÓ ÑÓ× × Ò Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ ×ÓÐÓ Ù× Ó× Ñ ØÖ × Ñ Ò Ö Ø Ð ÒÓ Ö ÙÒ Ö Ð ×Ô Ó Ð × n Ñ ØÖ ׺ È Ö ÐÐÓ¸ ÒÓÑ Ò ÑÓ× mat ÓÑÓ Ð Ñ ØÖ Þ Ø× Rk Ò Ð Ø Ö ÓÒ k Ý mat prev ÓÑÓ Rk−1¸ Ð Ù Ð Ý ÕÙ Ò ÖR 0 ¿ Ð ÙÐ Ö Ð Ù×ÙÖ ØÖ Ò× Ø Ú ¿ ≡ ´ ¾µ ¿ Bit_Mat_Graph<GT, SA> mat_prev(g); Í× × Bit Mat Graph º ÒØ × Ò Ö Ù ÐÕÙ Ö Ð ÙÐÓ¸ ÑÓ× × ÙÖ Ö ÕÙ mat ר ×Ó Ó Ð Ö Óg ¿ Ð ÙÐ Ö Ð Ù×ÙÖ ØÖ Ò× Ø Ú ¿ +≡ ´ ¾µ ¿ ¿ if (mat.get_list_graph() != &g) mat.set_list_graph(g); Í× × set list graph ¼ º ÆÓ× Ö ×Ø ÑÔÐ ÒØ Ö Ð Ö ×ØÓ Ð Ð ÓÖ ØÑÓ × ÙÒ ´ º¿µ ¿ Ð ÙÐ Ö Ð Ù×ÙÖ ØÖ Ò× Ø Ú ¿ +≡ ´ ¾µ ¿ const size_t & n = mat.get_num_nodes(); for (int k = 0; k < n; k++) { for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) mat(i, j) = mat_prev(i, j) or (mat_prev(i, k) and mat_prev(k, j)); mat_prev = mat; } ½ ¾ ¿ ½¼ ½½ ½¾ ½¿ ½ ½ ½ ¼ ½ ½ ½ ½ ½ ½ ½ ½ ½ ½ ½ ½ ¾ ½ ¼ ½ ½ ½ ½ ½ ½ ½ ½ ½ ½ ½ ½ ¿ ½ ¼ ½ ½ ½ ½ ½ ½ ½ ½ ½ ½ ½ ½ ½ ¼ ½ ½ ½ ½ ½ ½ ½ ½ ½ ½ ½ ½ ½ ¼ ½ ½ ½ ½ ½ ½ ½ ½ ½ ½ ½ ½ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ½ ½ ½ ½ ½ R∗ = ½ ¼ ½ ½ ½ ½ ½ ½ ½ ½ ½ ½ ½ ½ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ½ ½ ½ ½ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ½ ½ ½ ½ ½ ½¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ½ ½ ½ ½ ½½ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ½ ½ ½ ½ ½¾ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ½ ½ ½ ½ ½¿ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ½ ½ ½ ½ ½ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼ ½ ½ ½ ½ ÙÖ º¿ Ð Ù×ÙÖ ØÖ Ò× Ø Ú Ð Ö Ó Ð Ð ¬ ÙÖ º¿¾ ´Ô º ½µº
  • 700.
    674 Cap´ ıtulo 7. Grafos 7.7 T´picos sobre grafos dirigidos o Ð Ò Ó ×Ø Ô ØÙÐÓ ÒØÖÓ Ù ÑÓ× Ð ÒÓ ÓÒ Ö Ó Ö Ó Ó Ö Óº Ò Ü º¿º¾ ´Ô Ò ½µ ÔÖ × ÒØ ÑÓ× Ð Ì ÕÙ ÐÓ Ö ÔÖ × ÒØ ¸ List Digraph<Node, Arc>¸ ÙÝ ÑÔÐ ÒØ ÓÒ ×¸ ÙÒ Ñ ÒØ ÐÑ ÒØ ¸ ÒØ Ð List Graph<Node, Arc>¸ ÔÙ × ×Ø ÙÐØ Ñ × ×Ù × ÔÓÖ Ö Ò º × ØÓ Ó× ÐÓ× Ð ÓÖ ØÑÓ× ÕÙ ×Ø Ð ÔÖ × ÒØ ÑÓ× × Ò Ó ÓÔ Ö Ò ÓÒ Ö Ó׺ Ó¸ ÐÓ× Ð ÓÖ ØÑÓ× Ñ ØÖ Р׸ Ò Ð Ó ÙÖÖ Ò Ð Ï Ö× ÐÐ Ô Ö Ð Ð Ù×ÙÖ ØÖ Ò× Ø Ú ¸ Ý Ð ÐÓÝ ¹Ï Ö× ÐÐ Ô Ö Ð Ð ÙÐÓ Ñ ÒÓ× Ñ Ò ÑÓ׸ Ù ÖÓÒ ÓÒ Ó× Ô Ö Ö Ó׺ ÐÐÓ× ÓÔ Ö Ò Ô Ö Ø Ñ ÒØ ×Ó Ö Ö Ó× ÔÓÖÕÙ ÙÒ Ö Ó ×¸ Ø Ñ Ò¸ ÙÒ Ö Ó½ º À ר Ð ÔÖ × ÒØ ¸ ÐÓ× Ö ÓÖÖ Ó× Ý ×Ù× Ð ÓÖ ØÑÓ× Ö Ú Ó× ÒÓ× Ò × ÖÚ Ó ÓÑÓ ÒרÖÙÑ ÒØÓ× Ô Ö ÓØÖÓ× Ð ÓÖ ØÑÓ׺ ÈÓÖ ×Ó¸ × Ñ Ò ×Ø Ö Ù ×Ø ÓÒ Ö Ò ÕÙ Ñ Ò ÐÓ× Ö ÓÖÖ Ó× ×Ó Ö Ö Ó× Ä Ò ÓÐ Ð Ö ÓÖÖ Ó ÓÑÓ ÒרÖÙÑ ÒØÓ Ô Ò Ó× ØÓÖ × ÙÒ Ñ ÒØ Ð × ´½µ Ð ÓÒ Ø Ú Ý ´¾µ ×Ù Ö Ø Ö Ð Óº Ê Ú × Ö Ò ÐÓ× Ö Ó× Ð ÙÒÓ× ÐÓ× ÔÖÓ Ð Ñ × ÕÙ ÒÓ× ÔÐ ÒØ ÑÓ× ÓÒ ÐÓ× Ö Ó× ÒÓ× Ö Ú Ð Ö ×ØÓ× ØÓÖ ×º 7.7.1 Conectividad entre digrafos Ò Ö Ó׸ Ð ÓÒ Ø Ú ÔÙ × Ö ÓÒ Ù× º Ó× ÒÓ Ó× ×ÓÒ ÓÒ ÜÓ× Ó ×Ø Ò Ö Ø Ñ ÒØ ÓÒ Ø Ó× × ÒØÖ ÐÐÓ× Ü ×Ø ÙÒ Ö Óº Ð Ñ ×ÑÓ ÑÓ Ó¸ ×ÓÒ ÓÒ ÜÓ× Ó ×Ø Ò Ò Ö Ø Ñ ÒØ ÓÒ Ø Ó× × ÒØÖ ÐÐÓ× Ü ×Ø ÙÒ Ñ ÒÓ ÕÙ ÐÓ× ÓÒ Ø º Ë Ñ¹ Ð ÖÑ ÒØ ¸ ÙÒ Ö Ó × ÓÒ ÜÓ × ØÓ Ó× ×Ù× ÒÓ Ó× ×ÓÒ ÓÒ ÜÓ׺ Ò ÙÒ Ö Ó¸ ÑÔ ÖÓ¸ ÕÙ ÙÒ ÒÓ Ó p ר ÓÒ Ø Ó q ÒÓ ÑÔÐ ÕÙ q ר ÓÒ Ø Ó pº ר ÓØ Ò ÓÒ× Ù Ò × Ò ÐÓ× Ð ÓÖ ØÑÓ׺ Ò Ð Ó ÙÖÖ Ò ×Ø ×Ù ¹× ÓÒ¸ ÒÓ× Ö Ú Ð ÕÙ Ð ÖÙØ Ò test connectivity() ×ØÙ Ò Ü º º¿ ´Ô Ò ½ µ ÒÓ ÒÓ× × ÖÚ Ô Ö Ö Ó׺ È Ö Ö Ó× Ñ ÒÙ Ó × ÔÖ Ö Ð ÑÔÐ Ö Ð ÒÓ ÓÒ Ð ÒÞ Ð ÒØÖ Ó× ÒÓ Ó× ÙÒ ÒÓ Ó q × Ð ÒÞ Ð × ÓØÖÓ p × Ü ×Ø ÙÒ Ñ ÒÓ p −→ qº × Ð × Ó× ×¸ ÔÓ ÑÓ× Ö Ð Þ Ö ÙÒ ÔÖÙ ÓÒ Ø Ú × Ò ÓÒÓ× Ò Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ ÕÙ Ú Ö ¬ÕÙ × × ÒÓ Ó × ÔÙ Ò Ð ÒÞ Ö ÐÓ× Ö ×Ø ÒØ ׸ Ð Ù Ð Ý Ù ÔÖ Ú Ñ ÒØ ÒרÖÙÑ ÒØ Ð ÓÖ ØÑÓ× Ô Ö Ö Ó× ≡ template <class GT, class SA> bool is_reachable(GT & g, typename GT::Node * src, typename GT::Node * tgt) { return test_for_path <GT, SA> (g, src, tgt); } ½ ÕÙ ÔÙ Ö Ú Ð Ö× ÒÓ× ÙÒ Ò ÓÒ× ×Ø Ò ÜÔÖ × ÔÓÖ Ð Ó ÕÙ List Digraph<Node, Arc> Ö List Graph<Node, Arc> Ý ÒÓ Ð Ö Ú × ÓÑÓ ÔÙ Ö ×Ù Ö Ö Ð Ð Ò Ö ÞÓÒ Ñ ÒØÓ ÕÙ ×Ø ÑÓ× ØÓÑ Ò Óº Ä ÒÚ Ö× ÓÒ × Ð ×ØÖÙ ØÙÖ ØÓ× Ý Ð Ö ÙØ Ð Þ ÓÒº Ò ÐÓ ÕÙ ÓÒ ÖÒ Ð ÑÔÐ ÒØ ÓÒ¸ Ð ÙÒ ÖÒ ÒØÖ ÐÓ× Ó× Ø ÔÓ× × Ò Ù ÒØÖ Ò Ð ÑÔÐ ÒØ ÓÒ Ð Ñ ØÓ Ó insert arc() ´Ü º¿º½¼º ´Ô Ò µµº Ë Ó × ÖÚ ÑÓ× Ò ×Ø Ñ ØÓ Ó¸ ÔÓ ÑÓ× Ô Ö Ø ÖÒÓ× ÕÙ ÔÓ Ö ÑÓ× ÑÔÐ ÒØ Ö ÐÓ× Ö Ó× ÓÑÓ × ÐÓ× Ö Ó׺ Ä × ÓÒ Ó Ó ÕÙ ÐÓ× Ð ÓÖ ØÑÓ× ×Ó Ö Ö Ó× ×ÓÒ Ñ × Ò Ö Ð × ÕÙ ÐÓ× Ö Ó× Ý¸ ×Ó Ö ØÓ Ó¸ Ñ × × ÑÔР׺ È Ö Ô٠׸ ÓÒ Ñ × × ÒØ Ó ÓÑÙÒ ÕÙ ÐÓ× Ö Ó× × Ò × Ó Ø Ú ´Ø Ò Ò ÐÓ× Ñ ×ÑÓ× Ñ ØÓ Ó×µ Ý ×Ù Ø Ú ÐÓ× Ö Ó× Ý ÒÓ Ð ÓÒØÖ Ö Óº
  • 701.
    7.7. T´picos sobregrafos dirigidos o 675 Ä Ñ ×Ñ ÖÙØ Ò × Ò Ð Ù×ÕÙ Ò ÔÖÓ ÙÒ ÔÙ Ù× Ö× ¸ × Ò ÔÖÓ Ð Ñ Ð ÙÒÓ Ô Ö Ö Ó× Ö ÔÖ × ÒØ Ó× ÓÒ Ð ×Ø ׺ 7.7.2 Inversi´n de un digrafo o Ò Ó × ÓÒ ×¸ ÔÙ × Ö ÙØ Ð Ó Ø Ò Ö Ð Ö Ó ÒÚ Ö×Ó G =< V, E > × Ö¸ ÙÒ Ö Ó ÓÒ ÐÓ× Ñ ×ÑÓ× ÒÓ Ó× Ô ÖÓ ×Ù× Ö Ó× ÒÚ ÖØ Ó׺ ×ØÓ × ÐÓ Ö ÑÙÝ ÐÑ ÒØ Ö ÓÖÖ Ò Ó Ð Ö Ó Ò× ÖØ Ò Ó Ö Ó× ÒÚ ÖØ Ó Ò Ð Ö Ó ×Ø ÒÓ Ð ÓÖ ØÑÓ× Ô Ö Ö Ó× +≡ template <class GT, class SA> void invert_digraph(GT & sg, GT & rg) { // recorrer todos los arcos del digrafo sg for (Arc_Iterator<GT, SA> it(sg); it.has_current(); it.next()) { typename GT::Arc * arc = it.get_current(); typename GT::Node * ssrc = sg.get_src_node(arc); // procesar nodo origen typename GT::Node * rsrc = NODE_COOKIE(ssrc); if (rsrc == NULL) // ¿ya est´ creado ssrc en rg? a { // no == crearlo, insertarlo y mapearlo auto_ptr<typename GT::Node> rsrc_auto(new typename GT::Node(ssrc)); sg.insert_node(rsrc_auto.get()); GT::map_nodes(ssrc, rsrc_auto.get()); rsrc = rsrc_auto.release(); } typename GT::Node * stgt = sg.get_tgt_node(arc); // procesar nodo destino typename GT::Node * rtgt = NODE_COOKIE(stgt); if (rtgt == NULL) // ¿ya est´ creado ssrc en rg? a { // no == crearlo, insertarlo y mapearlo auto_ptr<typename GT::Node> rtgt_auto(new typename GT::Node(stgt)); sg.insert_node(rtgt_auto.get()); GT::map_nodes(stgt, rtgt_auto.get()); rtgt = rtgt_auto.release(); } rg.insert_arc(rtgt, rsrc, arc->get_info()); } } Í× × Arc Iterator º invert digraph() × ÙÒ ÖÙØ Ò ÑÙÝ × ÑÔÐ º Ð Ö Ñ ÒØ ¸ ×Ù × ÑÔ ÒÓ × O(E) Ý Ñ ÒÙ Ó × Ù× ÓÑÓ Ø Ô Ò Ð ÓØÖÓ× Ð ÓÖ ØÑÓ× ÐÓ ÕÙ ÔÓÖ ÐÓ Ò Ö Ð ÐÓ× Ñ× Ð ÒØÓ× Ý ÓרÓ×Ó× Ò ×Ô Ó ÚÓÖ ×Ù Ð Ð º ÍÒ ÔÐ ÓÒ × ÓÒÓ Ö Ð Ö Ó ÒØÖ ÙÒ ÒÓ Óº Ó ÙÒ ÒÓ Ó p¸ sg.get num arcs(p) ÒÓ× ÔÖÓÔÓÖ ÓÒ Ð Ö Ó × Ð ¸ Ñ ÒØÖ × ÕÙ rg.get num arcs(p) Ð ÒØÖ º Ò ÜÔÖ × ÓÒ × ÓÖÑ Ð ×¸ ×Ù Ð × Ò Ö× Ð Ö Ó ÒØÖ ÓÑÓ Ò(v) Ý ÓÙØ (v) ÓÑÓ Ð × Ð º ÒÐ Ö Ö Ó× ×Ù Ð Ò Ù× Ö× ÐÓ× Ø ÖÑ ÒÓ× Ö Ó Ý Ò Ô Ö Ö ÖÖ Ð Ö Ó × Ð ¸ Ý Ö Ó Ò Ò Ô Ö Ð ÒØÖ º Ò × × ÒØ Ó¸ × ×Ø Ò Ù Ò Ó× Ð × × ÒÓ Ó× ×Ô Ð ×º ÙÒÓ Ð Ù Ð ×ÓÐÓ Ð ÐÐ Ù Ò Ö Ó× Ý × Ð Ù Ð ÒÓ × Ð Ò Ò ÙÒÓ¸ × Ö¸ ÙÒÓ ÙÝÓ Ö Ó Ý Ò × ÖÓ¸ × Ð Ø Ð ×ÙÑ ÖÓ º
  • 702.
    676 Cap´ ıtulo 7. Grafos Ò Ð × ÒØ Ó × Ñ ØÖ Ñ ÒØ ÒÚ Ö×Ó¸ ÙÒÓ × Ð Ù Ð ×ÓÐÓ × Ð Ò Ö Ó× Ý ÒÓ Ð ÐÐ Ù Ò Ò ÙÒÓ¸ Ó × ¸ ÙÒÓ ÓÒ Ö Ó Ò Ò ÖÓ¸ × ÐÐ Ñ Ù ÒØ º 7.7.3 Componentes fuertemente conexos de un digrafo ÍÒ × Ñ Ð Ö Ð ÓÒ Ø Ú Ò Ö Ó× × Ð “conectividad fuerte”º ÑÓ× ÕÙ Ó× ÒÓ Ó× u Ý v ר Ò Ù ÖØ Ñ ÒØ ÓÒ Ø Ó× × Ü ×Ø Ò ÐÓ× Ñ ÒÓ× u v Ý v uº Ò ÙÒ ÓÒ ×Ù Ð ÒÞ Ð ¸ ÑÓ× ÕÙ ÙÒ Ö Ó × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ × ØÓ Ó× ×Ù× ÒÓ Ó× ×ÓÒ Ð ÒÞ Ð × ÒØÖ × º ÓÒØÖ Ö Ñ ÒØ ¸ ÑÓ× ÕÙ × ÐÑ ÒØ ÓÒ ÜÓ × ÒÓ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓº ÍÒ Ò ÓÒ Ð Ù ÖÞ ÓÒ Ø Ú ÙÒ Ö Ó ÔÙ ÓÒÓ Ö× Ñ ÒØ Ð Ð ÓÖ ØÑÓ Ï Ö× ÐÐ ´Ü º º ´Ô Ò ½µµº Ë Ð Ö Ó × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ¸ Ò¹ ØÓÒ × ×Ù Ð Ù×ÙÖ ØÖ Ò× Ø Ú ÒÓ ÓÒØ Ò ÖÓ׺ Ò ÓÒØÖ ÑÓ׸ Ô٠׸ Ò ×Ø Ð ÓÖ ØÑÓ ÙÒ Ø Ò O(V 3) Ô Ö Ú Ö Ù Ö ÔÓÖ Ð ÓÒ Ø Ú Ù ÖØ ¸ × ÓÑÓ Ø Ñ Ò Ò Ö ×Ó Ö Ð Ð ÒÞ Ð ÒØÖ Ù ÐÕÙ Ö Ô Ö ÒÓ Ó׺ ×ÔÓÒ Ò Ó Ð Ð Ù×ÙÖ ØÖ Ò× Ø Ú ¸ Ð ÔÖÙ Ð ÒÞ Ð ØÓÑ ÐÓ ×ÙÑÓ O(Ð V)¸ × × Ö ÕÙ Ö Ò Þ Ö ÐÓ× ÒÓ Ó׺ A E A E B D D B D D C F C F ´µ ´ µ ÙÖ º¿ ÍÒ Ö Ó Ý ×Ù× Ó× ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ× È Ö Ö Ó× ÒÓÖÑ × Ý Ò×Ó× Ð Ð ÓÖ ØÑÓ Ï Ö× ÐÐ ÔÙ × Ö Ò ÔÐ Ð Ò ×Ô Ó Ò ×ØÓ× ×Ó׸ ÔÓ ÑÓ× ÓÔØ Ö ÙÒ ×ØÖ Ø × Ò Ð ÖÙØ Ò is reachable() ÒÚÓ ÖÐ Ô Ö Ô Ö ÒÓ Ó× ÒÓ× Ð Ñ ×ÑÓ ØÖ Ó Ò O(V 2) × O(V E) = O(V 3E) Ô ×Ó× Ñ × ÓרÓ×Ó Ò Ø ÑÔÓ¸ Ô ÖÓ Ñ ÒÓ× Ò ×Ô Óº Ò ÙÒ ÓÒ Ð ÓÒ Ø Ú Ù ÖØ ¸ Ò ÙÒ Ö Ó ÔÙ Ò ÒØ ¬ Ö× ×Ù× “componentes fuertemente conexos” × Ö¸ ÐÓÕÙ × Ó ×Ù ¹ Ö Ó× ÐÑ ÒØ ÓÒ ÜÓ× ÒØÖ × ¸ Ô ÖÓ Ù ÖØ Ñ ÒØ ÓÒ ÜÓ× Ò ×Ù× ÒÓ Ó× ÒØ ÖÒÓ׺ À Ý Ú Ö Ó× Ý Ð Ö × Ð ÓÖ ØÑÓ× Ô Ö Ð ÙÐ Ö ÐÓ× ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ׺ 7.7.3.1 Algoritmo de Kosaraju Ð Ñ × ÒØ ÙÓ Ð ÓÖ ØÑÓ ÓÒÓ Ó Ô Ö Ø ÖÑ Ò Ö ÐÓ× ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ× ÙÒ Ö Ó¸ Ý ÔÖÓ Ð Ñ ÒØ Ð Ñ × × ÑÔÐ ÓÑÔÖ Ò Ö¸ × Ð ÓÒÓ ÓÑÓ Ð ÃÓ× Ö Ùº Algoritmo 7.2 (Algoritmo de Kosaraju para los componentes fuertes) Ä ÒØÖ × ÙÒ Ö Ó G =< V, E >º Ä × Ð × ÙÒ Ð ×Ø l ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ׺ ½º l=∅
  • 703.
    7.7. T´picos sobregrafos dirigidos o 677 ¾º Ê Ð ÙÒ Ù×ÕÙ Ò ÔÖÓ ÙÒ Ò G Ò Ð Ù Ð ÐÓ× ÒÓ Ó× × ÒÙÑ Ö Ò ÔÓÖ ×Ù ÓÖ Ò Ø ÖÑ Ò ÓÒº Ë (v) ר ÒÙÑ ÖÓº (v) × × Ò Ð ¬Ò Ð ÐÐ Ñ Ö ÙÖ× Ú depth first traversal(g, v, ...)º ¿º ÓÒרÖÙÝ Ð Ö Ó ÒÚ ÖØ Ó G =< V, E > Ñ Ô Ó ÓÒ G × Ö¸ ÐÓ× ÑÔÓ× (v) Ò G ×ÓÒ ÐÓ× Ñ ×ÑÓ× Ð ÙÐ Ó× Ò Ð Ô ×Ó ¾º º Ë SÐ × Ù Ò ÒÓ Ó× ÓÖ Ò × Ò ÒØ Ñ ÒØ ÔÓÖ º Ë i = 0º º ∀v ∈ S =⇒ ´ÐÓ× ÒÓ Ó× Ô Ö Ò ÓÖ Ò Ó× ÔÓÖ (v)µ ´ µ Ë v ÒÓ ×Ø Ñ Ö Ó =⇒ º Ë T =∅ º T = { Ö Ó Ð ÒÞ Ð ÔÓÖ Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ × v} Ð ¬Ò Ð ÐÓ¸ T × ÙÒ ÓÑÔÓÒ ÒØ Ù ÖØ Ñ ÒØ ÓÒ ÜÓ Gº º Å ÖÕÙ ØÓ Ó× ÐÓ× ÒÓ Ó× Ý Ö Ó× T º º l = l ∪ Tº 2 11 2 1 10 11 1 10 A B G F A B G F 3 5 3 5 E H I J E H I J 7 6 7 6 C D K C D K 9 8 4 9 8 4 ´µ Ð Ö Ó ÐÙ Ó Ð ÔÖ Ñ Ö Ö ÓÖÖ Ó ´ µ Ð Ö Ó ÒÚ ÖØ Ó G ÙÖ º¿ Ä × Ó× × × Ð Ð ÓÖ ØÑÓ ÃÓ× Ö Ùº ÄÓ× ÒÓ Ó× ×Ø Ò Ø ÕÙ Ø Ó× × ÙÒ ×Ù ÓÖ Ò Ø ÖÑ Ò ÓÒ Ö ÙÖ× Ú Ò ÔÖÓ ÙÒ º Ë ×ÙÑ ÕÙ Ð ÐÐ Ñ Ò Ð Ó ÙÖÖ Ò Ð Ð ÒÓ Ó º ÈÓ ÑÓ× ÒØ ¬ Ö ØÖ × × × ÔÖ Ò Ô Ð ×¸ ØÓ × O(E) Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ ÕÙ ÒÙÑ Ö ÐÓ× ÒÓ Ó× ÔÓÖ ×Ù ÓÖ Ò Ø ÖÑ Ò ÓÒ Ö ÙÖ× Ú ¸ Ð ÓÒרÖÙ ÓÒ G Ý Ð Ö ÓÖÖ Ó ¬Ò Ð ÓÖ Ò Ó × Ò ÒØ Ñ ÒØ Ò Ð ÕÙ × × Ù Ö Ò ÐÓ× ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ׺ Ó ÙÒ ÐÓÕÙ Ù ÖØ Ñ ÒØ ÓÒ ÜÓ¸ Ð ÒÙÑ Ö ÓÒ ×Ù× ÒÓ Ó× Ó ÙÖÖ × Ð Ñ × Ö ÒØ Ñ ÒØ ר Ð Ñ × ÒØ Ù Ñ ÒØ Ú × Ø Óº ÈÓÖ ÑÔÐÓ¸ Ò Ð ÐÓÕÙ Ñ × Ð Ö Ð Ö Ó Ð ¬ ÙÖ º¿ ¹ Ú ÑÓ× ÕÙ Ð ÒÓ Ó ´ µ × ÙÐØ ÑÓ Ò Ö× Ú × Ø Ó¸ Ñ ÒØÖ × ÕÙ Ð ´½½µ Ð ÔÖ Ñ ÖÓº × Ð Ö Ó ÒÚ Ö×Ó Ð ¬ ÙÖ º¿ ¹ ÓÒר Ø ÑÓ× ÕÙ × ´ µ × Ð ÒÞ Ò ØÓ Ó× ÐÓ× ÒÓ Ó׺ ÆÓ ÑÔÓÖØ × Ù Ð ÒÓ Ó × Ò Ð Ö ÓÖÖ Ó¸ ÓÑÓ ÐÙ Ó × Ú Ö ÒÚ ÖØ Ó¸ × × ÙÖ Ð Ó ÖØÙÖ Ð ÐÓÕÙ ÒØ ÖÓº ÆÓØ ÑÓ× ÕÙ ÒÓ × Ò × Ö Ó ÓÖ Ò Ö ÐÓ× ÒÓ Ó× ÔÓÖ ×Ù ÒÙÑ Ö ÓÒ¸ Ò ÙØ Ð Þ Ö ÙÒ Ô Ô Ö ÓÒÓ Ö Ð Ñ ÝÓÖ ×Ø ÓÒ Ø Ò Ö ÙÒ ÖÖ ÐÓ Ý Ù Ö ÖÐÓ× × ÙÒ Ð Ø ÖÑ Ò ÓÒº Ä ÒרÖÙÑ ÒØ ÓÒ Ð Ð ÓÖ ØÑÓ ÃÓ× Ö Ù¸ × ÓÑÓ ×Ù Ú Ö ¬ ÓÒ ÓÖÖ Ø ØÙ ¸ × Ð Ò Ò Ö Óº
  • 704.
    678 Cap´ ıtulo 7. Grafos 7.7.3.2 Algoritmo de Tarjan Ð Ð ÓÖ ØÑÓ Ì Ö Ò Ø Ò Ð Ú ÖØÙ ÒØ ¬ Ö ÐÓ× ÐÓÕÙ × ÙÒ Ö Ó Ò ÙÒ ×ÓÐ Ô × º ÓÒ× Ö ÑÓ× Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ ×Ó Ö ÙÒ Ö Óº Ä ÖÙØ Ò ÕÙ ÙÒ ÒØ Ö Þ Ð Ð ÓÖ ØÑÓ Ý ÕÙ ÒÚÓ Ð Ö ÓÖÖ Ó Ö ÙÖ× ÚÓ Ò × × ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ× ≡ ¿ template <class GT, class SA> inline void strongly_connected_components(GT & g, DynDlist <GT> & block_list, DynDlist<typename GT::Arc*> & arc_list) { ÁÒ ÐÞ ÖÌ Ö Ò for (typename GT::Node_Iterator it(g); curr_df < n; it.next()) { typename GT::Node * v = it.get_current(); if (not IS_NODE_VISITED(v, Aleph::Depth_First)) // ¿p visitado? __scc<GT, SA>(g, block_list, stack, v, curr_df); } ÓÒרÖÙ Ö Ý Ñ Ô Ö ÐÓ× ÐÓÕÙ × ¾ } Í× × DynDlist ¿ Ò Node Iterator º g × Ð Ö Ó ×Ó Ö Ð Ù Ð × × Ð ÙÐ Ö ÐÓ× ÐÓÕ٠׺ block list × ÙÒ Ð ×Ø Ö Ó× Ñ Ô Ó× ÓÖÖ ×ÔÓÒ ÒØ ÐÓ× ×Ø ÒØÓ× ÐÓÕÙ × gº Ò ÐÑ ÒØ ¸ ÐÓ× Ö Ó× g ÕÙ ÖÙÞ Ò ÒØÖ ÐÓ× ÐÓÕÙ × × Ù Ö Ò Ò Ð Ð ×Ø arc listº Ä ÖÙØ Ò ÑÔÐ Ð ÙÒ × Ú Ö Ð × ÒØ ÖÒ ×¸ Ð × Ù Ð × ÓÖ × Ñ Ò ×Ø Ö Ð Ö ¬ Ö Ð × × Ù ÒØ × ÁÒ Ð Þ Ö Ì Ö Ò ≡ ´ ¿µ long curr_df = 0; // contador de visitas const long & n = g.get_num_nodes(); curr df × Ð ÓÒØ ÓÖ ÒÓ Ó× Ú × Ø Ó׸ Ð Ù Ð ×ÓÐÓ × Ò Ö Ñ ÒØ Ð × Ù Ö Ö ÙÒ ÒÓ Ó ÒÓ Ú × Ø Óº strongly connected components() ÒÚÓ Ð ÖÙØ Ò scc()¸ Ð Ù Ð × ÙÒ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ Ö ÙÖ× ÚÓº Ð for Ö Ú × ÐÓ× ÒÓ Ó׸ ÒÚÓ scc() Ô Ö ÒÓ Ó ÒÓ Úר Ó Ý × Ø Ò ÙÒ Ó× Ò Ú × Ø Ó ØÓ Ó× ÐÓ× ÒÓ Ó׸ ÐÓ Ù Ð × Ø Ø Ù Ò Ó curr df == nº scc() × ¬Ò Ð × Ù ÒØ ÑÓ Ó ÊÙØ Ò × ×Ø Ø × Ì Ö Ò ≡ ¿ template <class GT, class SA> inline void __scc(GT & g, DynDlist <GT> & list, DynListStack<typename GT::Node*> & stack, typename GT::Node * v, long & df_count) { ÁÒ Ó Ö ÓÖÖ Ó ×Ó Ö v ½ Ê ÓÖÖ Ö Ò ÔÖÓ ÙÒ Ð ÓÑÔÓÒ ÒØ Ù ÖØ Ñ ÒØ ÓÒ ÜÓ v ¾ Î Ö ¬ Ö × (v) = ÐÓÛ(v) Ý Ú ÒØÙ ÐÑ ÒØ × ÑÔ Ð Ö ÐÓÕÙ ½ } Í× × DynDlist ¿ Ò DynListStack ½½ º
  • 705.
    7.7. T´picos sobregrafos dirigidos o 679 ר ÖÙØ Ò Ö ÓÖÖ Ò ÔÖÓ ÙÒ Ð ÒÓ Ó vº g × Ð Ö Ó ×Ó Ö Ð Ù Ð × Ð ÙÐ Ò ÐÓ× ÐÓÕ٠׸ list × ÙÒ Ð ×Ø ÐÓÕ٠׸ stack × ÙÒ Ô Ð ÒÓ Ó× Ú × Ø Ó× ÙÝÓ × ÒØ Ó ÜÔÐ Ö ÑÓ× Ñ × Ð ÒØ ¸ v × Ð ÒÓ Ó ØÙ Ð ÕÙ × Ö ÓÖÖ Ò ÔÖÓ ÙÒ Ý df count × Ð ÓÒØ ÓÖ Ú × Ø ×º B1 B2 B4 A B G F J B5 E H I K M N B3 C D L O ÙÖ º¿ ÍÒ Ö Ó ÓÒ ×Ù× ÐÓÕÙ × ÓÒ× Ö ÑÓ× ÙÒ ÒÓ Ó Ù ÐÕÙ Ö vº × × Ò Ð Ô Ö Ð ÒØ Ò Ñ ÒØÓ ÔÖ Ò Ö ÕÙ ÙÒ ÐÐ Ñ Ö ÙÖ× Ú scc(v,...) Ö ÒØ Þ × Ù Ö Ö ÒØ Ö Ñ ÒØ Ð ÐÓÕÙ Ð ÕÙ Ô ÖØ Ò vº ÌÓÑ ÑÓ× Ð Ö Ó Ð ¬ ÙÖ º¿ Ý ÑÔÐ ¬ÕÙ ÑÓ× Ú Ö × ÐÐ Ñ ×º Ë Ð ÐÐ Ñ Ó ÙÖÖ ×Ó Ö Ð ÒÓ Ó Å¸ ÒØÓÒ × ×Ø ×ÓÐÓ × × Ù Ö ÙÒ ×ÓÐÓ ÐÓÕÙ ¸ Ð B5º Ë Ð ÐÐ Ñ Ó ÙÖÖ ×Ó Ö H¸ ÒØÓÒ × × × Ù Ö Ò ÐÓ× ÐÓÕÙ × B3¸ B4 Ý B5º Ë Ð ÐÐ Ñ Ó ÙÖÖ ×Ó Ö ¸ ÒØÓÒ × × × Ù Ö Ò ØÓ Ó× ÐÓ× ÐÓÕ٠׺ ËÙÖ ¸ Ô٠׸ Ð ÔÖ ÙÒØ Ü ×Ø Ð ÙÒ Ñ Ò Ö Ð Ñ Ø Ö Ð ÐÓÕÙ × Ö¸ Ù Ò Ó Ò×Ô ÓÒ ÑÓ× ÙÒ Ö Ó w → x¸ ÓÑÓ ÔÓ ÑÓ× × ÖÒ Ö × w Ý x ר Ò Ó ÒÓ Ò Ð Ñ ×ÑÓ ÐÓÕÙ Ä ×ÓÐÙ ÓÒ Ù × Ù ÖØ ÔÓÖ Ì Ö Ò ¿ ¸ ¾¼ Ý × × ÖÚ ÐÓ× ÑÔÓ× Ý ÐÓÛ ×ØÙ Ó× Ò Ü º º½ ´Ô Ò ¿ µ¸ ´ º½µ Ô º Ö Ð Ð ÙÐÓ ÐÓ× ÔÙÒØÓ× ÓÖØ Ó ÖØ ÙÐ ÓÒº Ò ÕÙ Ð ÒØÓÒ ×¸ ¬Ò ÑÓ× (v) ÓÑÓ Ð ÓÖ Ò Ò ÕÙ × Ú × Ø Ó Ð ÒÓ Ó v ÔÓÖ ÙÒ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ Ý ÐÓÛ(v) ÓÑÓ Ð Ñ Ò ÑÓ ÒØÖ ØÓ Ó× ÐÓ× ÒÓ Ó× ÓÒ Ø Ó× v ÔÓÖ Ñ ÒÓ× ÓÒ ÓÖÑ Ó× ÔÓÖ Ö Ó× Ö ÓÖ × Ý ÒÓ¹ Ö ÓÖ ×º ÈÙ ×ØÓ ÕÙ × ØÖ Ø ÙÒ Ö Ó¸ ÒÓ Ö ÕÙ Ö ÑÓ× Ô Ò× Ö Ò Ö Ó× ÒÓ¹ Ö ÓÖ ×¸ × ÒÓ¸ Ñ × Ò¸ Ò ÒÓ Ó× Ð ÒÞ Ð ×º ר ÑÓ Ó¸ ÐÓÛ(v) ÔÙ ¬Ò Ö× Ñ × × ÑÔÐ ÓÑÓ ÐÓÛ(v) = Ñ Ò ÑÓ Ð ÓÑÔÓÒ ÒØ Ù ÖØ Ñ ÒØ ÓÒ ÜÓ ÓÒ × Ò Ù ÒØÖ v ´ º µ B1 B2 11,5 10,5 8,8 9,8 B4 A B G F J 3,1 B5 7,5 2,1 1,1 14,13 15,13 E H I K M N 5,5 12,12 C D 6,5 B3 L 4,1 O 13,13 ÙÖ º¿ ÍÒ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ Ð Ö Ó Ð ¬ ÙÖ º¿ º ÒÓ Ó ×Ø Ø ÕÙ Ø Ó ÓÒ Ð Ô Ö , ÐÓÛº ÁÒ Ô Ò ÒØ Ñ ÒØ Ð ÒÓ Ó ÔÓÖ ÓÒ Ò ÑÓ× ÙÒ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ ¸ Ð Ú ÐÓÖ ÐÓÛ(v)¸ Ô Ö Ù ÐÕÙ Ö ÒÓ Ó v¸ ÓÖÖ ×ÔÓÒ Ö× ÓÒ Ð Ú ÐÓÖ (v) Ð ÔÖ Ñ Ö ÒÓ Ó Ú × Ø Ó ÒØÖÓ Ð ÐÓÕÙ º Ê ØÓÑ Ò Ó Ð ÑÔÐÓ Ð ¬ ÙÖ º¿ ¸ ÙÒ Ú ÒØÙ Ð ÓÖ Ò Ú × Ø ÔÙ Ü Ñ Ò Ö× Ò Ð ¬ ÙÖ º¿ º Ð ÓÖ Ò ÔÖ Ñ Ö × ÐÐ Ñ × scc(v,...)
  • 706.
    680 Cap´ ıtulo 7. Grafos Ö Ð Þ Ó ÔÓÖ strongly connected components() × ÑÙ ×ØÖ Ò Ð ¬ ÙÖ º ¼º Ö ÓÐ ÓÖÖ ×ÔÓÒ ÙÒ ÐÐ Ñ × Ð for strongly connected components() Ñ ÒØÖ × ÕÙ Ö ÓÐ ÑÙ ×ØÖ ÐÓ× ÐÓÕÙ × ÕÙ × × Ù Ö Ò Ò ÐÐ Ñ scc()º K-(1,1) C-(5,5) O-(13,13) I-(2,1) D-(6,5) M-(14,13) J-(3,1) E-(7,5) N-(15-13) L-(4,1) G-(8,8) B-(10,5) H-(12,12) F-(9,8) A-(11,5) ÙÖ º ¼ Ö ÓÐ × Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ ÔÖ Ð Ö Ó Ð ¬ ÙÖ º¿ º ÒÓ Ó ÑÙ ×ØÖ Ð Ø ÕÙ Ø Ð ÒÓ Ó Ý ×Ù× ÒÙÑ ÖÓ× Ý ÐÓÛº Ð ¬ ÙÖ º ¼ ÔÓ ÑÓ× Ö Ð ÙÒ × Ó × ÖÚ ÓÒ × Ò ÔÓ× × ÖÒ Ö × ÙÒ Ô Ö ÒÓ Ó× ×Ø Ò Ó ÒÓ ÒØÖÓ Ð Ñ ×ÑÓ ÐÓÕÙ ½º Ë Ð Ö ÓÐ Ø Ò ÙÒ ×ÓÐ Ö Ñ ¸ ÒØÓÒ × ×Ø ÓÒØ Ò ÙÒ ×ÓÐÓ ÐÓÕÙ º ר × Ð ×Ó ÐÓ× ÐÓÕÙ × B4 Ý B5º ¾º Ë Ð Ö ÓÐ ÓÒØ Ò Ú Ö × Ö Ñ ×¸ ÒØÓÒ × Ý Ø ÒØ × Ö Ñ × ÓÑÓ ÐÓÕ٠׺ ר × Ð ×Ó Ð × ÙÒ Ó Ö Óи ÙÝ Ö Þ × ¸ Ð Ù Ð ÓÒØ Ò ÐÓ× ÐÓÕÙ × B1¸ B2 Ý B3º Ò ×Ø ×Ó¸ ÓÑÓ ×Ø Ò Ù ÑÓ× ÙÒ ÐÓÕÙ Ð ÓØÖÓ ÍÒ Ó × ÖÚ ÓÒ Ñ × Ø ÐÐ ÒÓ× Ô ÖÑ Ø ÒØ ¬ Ö ÕÙ ÐÓ× ÐÓÕÙ × B2 Ý B3 × Ò Ù ÒØÖ Ò Ò Ö Ñ × × Ð ÒÓ Ó º ÕÙ ÒÓ× Ô Ö Ð ÔÖ ÙÒØ ÓÑÓ ÒØ ¬ ÑÓ× Ð Ò Ó ÙÒ Ö Ñ º Ä Ö ×ÔÙ ×Ø ר ÔÓÖ Ð Ô Ö < (v), ÐÓÛ(v) >º Ò Ó Ö Ñ ¸ ÕÙ × ÓÖÖ ×ÔÓÒ Ð Ò Ó ÙÒ ÐÓÕÙ ¸ × ÒØ ¬ ÔÓÖ Ð Ó ÕÙ (v) = ÐÓÛ(v)º ×ØÓ × Ò Ô Ò ÒØ Ð ÓÖÑ Ð Ö Ñ º Ó ÙÒ ÒÓ Ó v¸ Ð Ú ÐÓÖ (v) × Ð ÙÐ Ð Ñ ÒØ ÙÒ ÓÒØ ÓÖ Ú × Ø ×¸ Ñ ÒØÖ × ÕÙ Ð Ú ÐÓÖ ÐÓÛ(v) × Ð ÙÐ Ð ÔÓÖ Ö ØÓÖÒÓ Ö ÙÖ× ÓÒ ´ ØÖ µº ÈÓÖ ÐÓ× ÑÓÑ ÒØÓ׸ ÓÒ ÓÖÑ ÑÓ×ÒÓ× ÓÒ ×ÙÑ Ö ÕÙ × Ð ÙÐ Ð Ú ÐÓÖ ÐÓÛ(v) Ý ×ØÙ ÑÓ× ÙÒ ÔÖ Ñ Ö Ð Ñ º Lema 7.4 Ë ÙÒ Ö Ó G =< V, E > Ý T =< V, E > ÙÒ Ö ÓÐ Ö ÓÖ Ò ÔÖÓ ÙÒ Ù ÐÕÙ Ö º Ë v ∈ V ÙÒ ÒÓ Ó Ù ÐÕÙ Ö G Ý Tº Ë (v) = ÐÓÛ (v)¸ ÒØÓÒ × ∀w ∈ G, T | ÐÓÛ (w) = ÐÓÛ (v) =⇒ w Ô ÖØ Ò Ð Ñ ×ÑÓ ÐÓÕÙ vº Demostraci´n (Por contradicci´n) ËÙÔÓÒ Ö ÕÙ Ü ×Ø ÙÒ ÒÓ Ó w ÓÒ ÐÓÛ (w) = o o ÐÓÛ(v) ÕÙ ÒÓ Ô ÖØ Ò Ð Ñ ×ÑÓ ÐÓÕÙ v ÓÒØÖ ´ º µ¸ Ð Ù Ð ÒÙÒ ÐÓÛ(w) ÓÑÓ Ð Ñ Ò ÑÓ Ð ÐÓÕÙ ÓÒ × Ò Ù ÒØÖ w ×ÙÑ Ò Ó ÕÙ Ø Ò ÑÓ× ÙÒ Ö Ó ÓÒ ×Ù× Ú ÐÓÖ × Ý ÐÓÛ Ð ÙÐ Ó׸ ÔÓ ÑÓ× ×Ø Ò Ù Ö ×Ù× ÐÓÕÙ × Ð × Ù ÒØ ÑÓ Ó ½º ÒÓ Ó v ÓÒ (v) = ÐÓÛ(v) × Ò Ù ÒØÖ Ò ÙÒ ÐÓÕÙ ×Ø ÒØÓº Ü ×Ø Ò Ø ÒØÓ× ÐÓÕÙ × ÓÑÓ ÒÓ Ó× ÕÙ × Ø × Ò (v) = ÐÓÛ(v)º
  • 707.
    7.7. T´picos sobregrafos dirigidos o 681 ¾º ÈÓÖ ÐÓÕÙ ÒØ ¬ Ó Ñ ÒØ ÙÒ ÒÓ Ó v ÓÒ (v) = ÐÓÛ(v)¸ ÒØ ¬ Ö ÕÙ ÐÐÓ× ÒÓ Ó× w ÓÒ ÐÓÛ(w) = ÐÓÛ(v) רÓ× Ô ÖØ Ò Ò Ð Ñ ×ÑÓ ÐÓÕÙ v À Ý ÓØÖÓ ÓÒÓ Ñ ÒØÓ¸ × Ò Ð Ô Ö Ð Ð ÓÖ ØÑÓ Ý ×Ù ¬ Ò ¸ ÕÙ × Ö Ø Ö Þ Ñ ÒØ Ð ÔÖÓÜ ÑÓ Ð Ñ º Lema 7.5 Ë ÙÒ Ö Ó G =< V, E > Ý T =< V, E > ÙÒ Ö ÓÐ Ö ÓÖ Ò ÔÖÓ¹ ÙÒ Ù ÐÕÙ Ö º Ë v ∈ V ÙÒ ÒÓ Ó Ù ÐÕÙ Ö G Ý Tº Ë (v) = ÐÓÛ (v)¸ Ò¹ ØÓÒ × Ð ÐÓÕÙ ÕÙ Ð Ñ Ø v ר ÒØ Ö Ý Ü Ø Ñ ÒØ ÓÒØ Ò Ó Ò ÙÒ × Ù Ò < (v, (v), ÐÓÛ (v)) , (w, (w), ÐÓÛ (w)) , . . . , (z, (z), ÐÓÛ (v)) > ÕÙ ÓÑ ÒÞ Ò Ð ÔÖ Ñ Ö ÒÓ Ó Ú × Ø Ó Ð ÐÓÕÙ Ý ÙÐÑ Ò Ò ÙÒ Ó Ð Ö Óк Demostraci´n È Ö o ÑÓ×ØÖ Ö ÕÙ Ð × Ù Ò ÓÒØ Ò ØÓ Ó× ÐÓ× ÒÓ Ó× Ð ÐÓÕÙ ÐÓ ÑÓ× ÔÓÖ ÓÒØÖ ÓÒº ËÙÔÓÒ ÑÓ× ÕÙ Ü ×Ø Ð × Ù Ò Ô ÖÓ ÕÙ ×Ø ÒÓ ÓÒØ Ò ØÓ Ó ÐÓÕÙ º ÈÓÖ Ð ¬Ò ÓÒ ´ º µ Ð × Ù Ò ÓÑ ÒÞ Ö ÔÓÖ ÙÒ ÒÓ Ó v Ð ÐÓÕÙ ÓÒ Ð Ú ÐÓÖ Ñ × Ó ×Ù ÐÓÕÙ ¸ ÔÙ × × ØÖ Ø Ð ÔÖ Ñ Ö ÒÓ Ó Ú × Ø Ó Ò Ð ÐÓÕÙ º ÈÓÖ Ð Ð Ñ º ØÓ Ó ÒÓ Ó w Ð ÐÓÕÙ ÕÙ ÓÒØ Ò v Ø Ò ÐÓÛ(w) = ÐÓÛ(v)º ÓÖ Ò¸ ÔÙ ×ØÓ ÕÙ ØÓ Ó ÒÓ Ó w ÙÒ ÐÓÕÙ × Ð ÒÞ Ð × v¸ Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ × Ù Ö Ö ÙÖ× Ú Ñ ÒØ ØÓ Ó Ð ÐÓÕÙ ¸ ÔÓÖ ÐÓ ÕÙ ØÓ Ó× ×Ù× ÒÓ Ó× ×Ø Ò Ò Ð × ÙÒ º È Ö ÙÐÑ Ò Ö¸ ÑÓ× ÑÓ×ØÖ Ö ÕÙ × Ð × Ù Ò ÑÔ Þ Ý Ø ÖÑ Ò Ò ÒÓ Ó× ÓÒ Ð Ñ ×ÑÓ ÐÓÛ¸ ÒØÓÒ × ×Ø ÒÓ ÓÒØ Ò Ò Ò ÙÒ ÒÓ Ó ÓØÖÓ ÐÓÕÙ º ËÙÔÓÒ ÑÓ× ÕÙ Ü ×Ø ÙÒ × Ù Ò (v, (v), ÐÓÛ (v), . . . , (x, (x), ÐÓÛ(x))), . . . , (z, (z), ÐÓÛ(v)) Ó × ¸ Ð × Ù Ò Ø Ò Ð Ñ ÒÓ× ÙÒ ÒÓ Ó x ÓÒ ÐÓÛ(x) = ÐÓÛ(v)º ×ØÓ × Ò ¬ Ö ÕÙ × Ú × ØÓ ÙÒ ÒÓ Ó ÓØÖÓ ÐÓÕÙ ÓÒ ÐÓÛ(x) Ý ÐÙ Ó × Ö Ö ×Ó Ð ÐÓÕÙ ÓÒ ÐÓÛ(v)¸ ÐÓ ÕÙ ÓÒØÖ ÕÙ x ר Ò ÓØÖÓ ÐÓÕÙ ¸ ÔÙ × × Ð ÒÞ Ð × Ð ÐÓÕÙ ÓÒ ÐÓÛ(v) Ä × Ù Ò ÕÙ ÓÒ ÓÖÑ Ð ÐÓÕÙ × × Ù Ö Ö ÙÖ× Ú Ñ ÒØ ÓÐ × ÙÒ ÐÐ Ñ × scc(v,...)→ scc(w...)→ · · · → scc(z,...)º Ð Ñ Ö ÖÐÓ ×Ø ÓÖÑ Ö Ú Ð Ð ÔÖ Ò Ô Ó × Ò Ð Ð Ð ÓÖ ØÑÓ¸ Ù Ð Ô ÖÑ Ø ÒØ ¬ Ö ÔÐ Ò Ñ ÒØ Ð ÐÓÕÙ ÙÒ Ô Ð ÒÓ Ó× ØÖ Ö ÙÖ× ÚÓº Ð ÒØÖ Ö scc(v,...) × ÑÔ Ð v ½ ÁÒ Ó Ö ÓÖÖ Ó ×Ó Ö v ½ ≡ ´ ¿ µ ¾ push_in_stack<GT>(stack, v); Ä ÔÐ × ÒÓÑ Ò stack Ý × ÙÒ Ô Ö Ñ ØÖÓ ÔÓÖ Ö Ö Ò scc()¸ ÐÓ ÕÙ Ð ÐÓ Ð ØÓ × Ð × ÐÐ Ñ ×º ÍÒ Ú Þ Ö ÓÖÖ Ó× Ò ÔÖÓ ÙÒ ÐÓ× ÒÓ Ó× Ý ÒØ × v¸ × ÔÖ ÙÒØ ÔÓÖ (v) = ÐÓÛ(v)º Ë × ÖØÓ¸ ÒØÓÒ × Ð Ô Ð ÓÒØ Ò Ð × Ù Ò z, y, . . . , w, v ´ ÒÚ ÖØ µ¸ ÔÓÖ ÐÓ ÕÙ ÔÓ ÑÓ׸ ÓÒ × ÙÖ ¸ × ÑÔ Ð Ö Ð ÐÓÕÙ ×Ø ÕÙ × ÕÙ ÑÓ× v ½ ÎÖ¬ Ö × (v) = ÐÓÛ(v) Ý Ú ÒØÙ ÐÑ ÒØ × ÑÔ Ð Ö ÐÓÕÙ ½ ≡ ´ µ if (low <GT> (v) == df <GT> (v)) // ¿primer nodo visitado del bloque? { // s´ ==> saque los nodos del bloque que est´n en pila ı a const size_t & block_idx = list.size(); list.append(GT()); GT & block = list.get_last(); while (true) // sacar el bloque de la pila hasta sacar a v { typename GT::Node * p = pop_from_stack<GT>(stack); typename GT::Node * q = block.insert_node(p->get_info());
  • 708.
    682 Cap´ ıtulo 7. Grafos GT::map_nodes(p, q); NODE_COUNTER(p) = NODE_COUNTER(q) = block_idx; if (p == v) break; } } Ð Ú ÐÓÖ block idx × Ð ÒÙÑ ÖÓ ÐÓÕÙ º ר Ò Ô ÖÑ Ø ¸ ÐÙ Ó Ö Ö ÓÖÖ Ó ÒØ Ö Ñ ÒØ Ð Ö Ó¸ Ö ÓÒÓ Ö ÐÓ× ×Ø ÒØÓ× ÐÓÕ٠׺ Ä Ø ÖÑ Ò ÓÒ ÐÓÛ(v) Ø Ñ Ò × ÔÓÖ ØÖ º Ù Ò Ó Ú × Ø ÑÓ× ÙÒ ÒÓ Ó v¸ Ð Ú ÐÓÖ ÐÓÛ(v) × Ò Ò (v) ¾ ÁÒ Ó Ö ÓÖÖ Ó ×Ó Ö v ½ +≡ ´ ¿ µ ½ NODE_BITS(v).set_bit(Aleph::Depth_First, true); df<GT>(v) = low<GT>(v) = df_count++; ÄÙ Ó × Ö Ú × Ò ÐÓ× Ö Ó× v Ý × ÒÚÓ Ö ÙÖ× Ú Ñ ÒØ scc(w,...) ÔÓÖ ÒÓ Ó w ÕÙ × ÓÒ ÜÓ v Ý ÕÙ ÒÓ Ý × Ó Ú × Ø Ó ¾ Ê ÓÖÖ Ö Ò ÔÖÓ ÙÒ Ð ÓÑÔÓÒ ÒØ Ù ÖØ Ñ ÒØ ÓÒ ÜÓ v ¾ ≡ ´ ¿ µ // recorrer en profundidad todos los nodos conectados a v for (Node_Arc_Iterator<GT, SA> it(v); it.has_current(); it.next()) { typename GT::Node * w = it.get_tgt_node(); if (not IS_NODE_VISITED(w, Aleph::Depth_First)) { __scc <GT, SA> (g, list, stack, w, df_count); low <GT> (v) = Aleph::min(low <GT> (v), low <GT> (w)); } else if (is_node_in_stack<GT>(w)) // si est´ en pila ==> v fue visitado antes que p a low <GT> (v) = Aleph::min(low <GT> (v), df <GT> (w)); } Í× × Node Arc Iterator º Ð× ÐÖ scc(g, list, stack, w, df count)¸ w Ý Ø Ò Ð ÙÐ Ó ×Ù ÐÓÛ(w)¸ ÔÓÖ ÐÓ ÕÙ ×Ø × ÓØ ÓÒ ÐÓÛ(v) Ô Ö Ú Ö ¬ Ö × × Ò Ù ÒØÖ ÙÒ Ú ÐÓÖ Ñ ÒÓÖ ÕÙ Ð ØÙ к Ë wÝ × Ó Ú × Ø Ó × ÓØÖ Ø Ö ÓÒ strongly connected components()¸ ÒØÓÒ × ÑÓ× Ú Ö ¬ Ö ×Ù ÐÓÛ(w) ×ÓÐÓ × w Ô ÖØ Ò Ð ÐÓÕÙ v¸ ÐÓ ÕÙ Ú Ö ¬ ÑÓ× ÔÓÖ Ð ÔÖ × Ò w ÒÐ ÔÐ º È Ö ÐÑ Ò Ö ÐÓ× Ú ÐÓÖ × Ý ÐÓÛ ÑÔÐ Ö ÑÓ× Ð ÓÒØ ÓÖ Ý Ð ÓÓ ¸ Ü Ø Ñ ÒØ Ð Ñ ×Ñ Ñ Ò Ö ¸ Ý ÓÒ Ð × Ñ ×Ñ × ÖÙØ Ò ×¸ ÕÙ ÑÔÐ ÑÓ× Ò Ü º½ ´Ô Ò µº È Ö ÙÐÑ Ò Ö¸ Ð ÙÐØ Ñ Ô ÖØ Ð Ð ÓÖ ØÑÓ Ì Ö Ò ÓÒ× ×Ø Ò ÓÒרÖÙ Ö ÐÓ× ×Ù ¹ Ö Ó× Ñ Ô Ó× ÐÓ× ÐÓÕÙ × ¾ ÓÒרÖÙ Ö Ý Ñ Ô Ö ÐÓ× ÐÓÕÙ × ¾ ≡ ´ µ // recorrer cada uno de los subgrafos parciales y a~adir sus arcos n for (typename DynDlist<GT>::Iterator i(block_list); i.has_current(); i.next()) { // recorrer todos los nodos del bloque GT & block = i.get_current(); for (typename GT::Node_Iterator j(block); j.has_current(); j.next()) { typename GT::Node * gsrc = j.get_current(); // nodo actual del bloque // recorrer los arcos de gsrc
  • 709.
    7.7. T´picos sobregrafos dirigidos o 683 for (Node_Arc_Iterator<GT, SA> k(gsrc); k.has_current(); k.next()) { typename GT::Node * gtgt = k.get_tgt_node(); typename GT::Arc * ga = k.get_current_arc(); if (NODE_COUNTER(gsrc) != NODE_COUNTER(gtgt)) // ¿arco inter-bloque? { // s´ ==> a~´dalo a arc_list ı na arc_list.append(ga); continue; } // insertar y mapear el arco en el sub-bloque typename GT::Node * bsrc = (typename GT::Node*) NODE_COOKIE(gsrc); typename GT::Node * btgt = (typename GT::Node*) NODE_COOKIE(gtgt); typename GT::Arc * ba = block.insert_arc(bsrc, btgt, ga->get_info()); GT::map_arcs(ga, ba); } } } Í× × DynDlist ¿ ¸ Node Arc Iterator ¸ Ò Node Iterator º strongly connected components() Ö Ð Þ ÙÒ ØÖ Ó Ð ÓÖ Ó×Ó¸ Ô ÖÓ Ö ÒØ Þ Ó Ø Ò Ö ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ× ÓÑÓ ×Ù Ö Ó׺ Ú ×¸ ×ÓÐÓ × ÔÖ Ö Ð ÒØ ¬ Ö ÐÓ× ÓÑÔÓÒ ÒØ × × Ò Ò × Ñ ÒØ Ò ÖÐÓ× ÓÑÓ Ö Ó׺ Ò × ×Ó¸ ÔÓ ¹ ÑÓ× ÔÐ ÒØ Ö Ð × Ù ÒØ Ú Ö× ÓÒ ¿ ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ× +≡ template <class GT, class SA> inline void strongly_connected_components(GT & g, DynDlist<DynDlist<typename GT::Node*> > & blocks) { ÁÒ ÐÞ ÖÌ Ö Ò for (typename GT::Node_Iterator it(g); curr_df < n; it.next()) { typename GT::Node * v = it.get_current(); if (not IS_NODE_VISITED(v, Aleph::Depth_First)) // ¿p visitado? __scc<GT, SA>(g, blocks, stack, v, curr_df); } } Í× × DynDlist ¿ Ò Node Iterator º Ä Ö Ò ¸ Ö ×Ô ØÓ Ð Ú Ö× ÓÒ ÕÙ ×Ø ÓÖ ÑÓ× × ÖÖÓÐÐ Ó¸ ×ØÖ Ò ÕÙ Ò ÐÙ Ö Ð ÙÐ Ö Ý Ö ØÓÖÒ Ö ÙÒ Ð ×Ø ×Ù Ö Ó׸ ØÖ ÑÓ× ÓÒ ÙÒ Ð ×Ø Ð ×Ø ÒÓ Ó× Ð ×Ø ÓÒØ Ò ÐÓ× ÒÓ Ó× Ô ÖØ Ò ÒØ × ÙÒ ÓÑÔÓÒ ÒØ º ר Ú Ö× ÓÒ ×Ó Ö Ö strongly connected components() Ø Ñ Ò Ö ÕÙ Ö ×Ó Ö Ö Ö scc() Ô Ö ÕÙ Ö Ð Ð ×Ø Ð ×Ø × ¿ ÊÙØ Ò × ×Ø Ø × Ì Ö Ò +≡ template <class GT, class SA> inline void __scc(GT & g, DynDlist<DynDlist<typename GT::Node*> > & list, DynListStack<typename GT::Node*> & stack, typename GT::Node * v, long & df_count) {
  • 710.
    684 Cap´ ıtulo 7. Grafos ÁÒ Ó Ö ÓÖÖ Ó ×Ó Ö v ½ Ê ÓÖÖ Ö Ò ÔÖÓ ÙÒ Ð ÓÑÔÓÒ ÒØ Ù ÖØ Ñ ÒØ ÓÒ ÜÓ v ¾ Î Ö ¬ Ö × (v) = ÐÓÛ(v) Ý Ú ÒØÙ ÐÑ ÒØ ÐÐ Ò Ö Ð ×Ø } Í× × DynDlist ¿ Ò DynListStack ½½ º Ä ×ØÖÙ ØÙÖ × × Ò ÐÑ ÒØ ÒØ Ð ÒØ Ö ÓÖÑ ÒØ × ÖÖÓÐÐ ¸ × ÐÚÓ ÔÓÖ Ð ÙÐØ ÑÓ ÐÓÕÙ ¸ Î Ö ¬ Ö × (v) = ÐÓÛ(v) Ý Ú ÒØÙ ÐÑ ÒØ ÐÐ Ò Ö Ð ×Ø ¸ Ð Ù Ð× × Ö Ð × Ù ÒØ ÑÓ Ó Î Ö ¬ Ö × (v) = ÐÓÛ(v) Ý Ú ÒØÙ ÐÑ ÒØ ÐÐ Ò Ö Ð ×Ø ≡ ´ ¿ µ if (low <GT> (v) == df <GT> (v)) // ¿primer nodo visitado del bloque? { // s´ ==> saque los nodos del bloque que est´n en pila ı a list.append(DynDlist<typename GT::Node*>()); DynDlist<typename GT::Node*> & l = list.get_last(); while (true) // sacar el bloque de la pila hasta sacar a v { typename GT::Node * p = pop_from_stack<GT>(stack); l.append(p); if (p == v) break; } } Í× × DynDlist ¿ º ÆÓØ ÑÓ× ÕÙ ×Ø Ú Ö× ÓÒ strongly connected components() Ø Ò ×Ø ÒØ × Ò¹ Ø Ó ÔÖ Ø Óº Ò ÔÖ Ñ Ö ÐÙ Ö¸ ÓÑÓ ÒÓ Ö ÕÙ Ö ÓÒרÖÙ Ö ×Ù Ö Ó× Ñ Ô Ó× ÐÓ× ÐÓÕ٠׸ × Ñ × ¬ ÒØ Ò Ø ÑÔÓ Ý ×Ô Óº Ò × ÙÒ Ó ÐÙ Ö¸ Ð Ñ ÖÓ Ó ×ÔÖÖ ÐÓ× ÒÓ Ó× Ð Ö Ó Ò ÓÒ ÙÒØÓ× × ÙÒ ×Ù Ô ÖØ Ò Ò Ð ÓÑÔÓÒ ÒØ Ù ÖØ Ñ ÒØ ÓÒ ÜÓ ÖÖÓ ×Ø ÒØ Ò ÓÖÑ ÓÒ ×Ó Ö Ð ÓÒ Ø Ú º Ò Ð Ó ÙÖÖ Ò ¸ ØÓ Ó Ð ØÖ Ó ÕÙ Ý Ö Ð Þ ÑÓ× Ñ Ô Ö ÐÓ× ÐÓÕÙ × Ò ×Ù Ö Ó× ÔÙ Ö× ÓÒ Ð Ð ×Ø Ð ×Ø ׺ Ð ÔÙÒØÓ ÕÙ × ÕÙ ÓÒ Ø Ò ×ÓÐÓ Ø Ò Ö ÙÒ ÒÓ Ó Ð ÓÑÔÓÒ ÒØ Ù ÖØ Ñ ÒØ ÓÒ ÜÓ Ý × Ø Ò ÔÓ× Ð ÔÖÓ × ÖÐÓ × Ò Ø Ö ÐÓ× Ñ × ÓÑÔÓÒ ÒØ ׺ 7.7.4 Prueba de aciclicidad Ò Ü º º ´Ô Ò ½ µ × Ò ÑÓ× Ð ÔÖ Ñ Ø Ú is grapph acyclique()¸ ר Ò Ú Ö¹ ¬ Ö ÔÓÖ Ð Ü ×Ø Ò ÐÓ Ò ÙÒ Ö Óº ÓÑÓ ÕÙ ÐÐ ÖÙØ Ò × × Ò Ð Ô ÒØ Ó ÐÓ× ÒÓ Ó׸ ÐÐ ÒÓ ÙÒ ÓÒ Ô Ö Ö Ó׺ Ù Ò Ó × Ò Ù ÒØÖ ÙÒ ÒÓ Ó ÕÙ Ý × Ó Ô ÒØ Ó¸ ÒÓ Ý Ñ Ò Ö × Ö × ÐÓ Ù ÔÓÖ ÙÒ ÐÓ Ó ÔÓÖ ÔÖÓ Ò × ÙÒ ÒÓ Ó Ô ÖØ Ò ÒØ ÓØÖÓ ÐÓÕÙ º ÇØÖ ÔÖ Ñ Ø Ú ÕÙ × ÖÖÓÐÐ ÑÓ× Ò Ü º º ´Ô Ò ½ µ Ù test cycle()º ÈÓ ÑÓ× Ú Ö ¬ Ö ÔÓÖ Ð Ð ÐÐ Ñ Ò Ó test cycle() ÔÓÖ ÒÓ Ó Ð Ö Ó ×Ø Ù Ö Ö ØÓ Ó× ÐÓ× ÒÓ Ó× Ó Ò ÓÒØÖ Ö ÙÒ ÐÓº ר Ò ÓÕÙ ØÓÑ Ö O(V × E)º Ð Ð ÓÖ ØÑÓ Ì Ö Ò ÔÙ ÑÔÐ Ö× Ô Ö Ø ÖÑ Ò Ö ¬ ÒØ Ñ ÒØ × ÙÒ Ö Ó Ø Ò Ó ÒÓ ÐÓ׺ Ë Ô ÖØ ÑÓ× Ð Ó ÕÙ ÙÒ ÐÓÕÙ ÓÖÞ Ñ ÒØ Ø Ò Ö ÐÓ׸ ÒØÓÒ × Ð Ù ÓÒ Ð Ð ÓÖ ØÑÓ Ì Ö Ò Ö Ö Ø Ñ ÒØ Ö ×ÔÓÒ Ö ÔÓÖ ×Ù Ü ×Ø Ò º Ò ÓØÖ × Ô Ð Ö ×¸ × Ð ÒØ ÐÓÕÙ × ÙÒ Ö Ó × Ñ ÒÓÖ ÕÙ Ð ÒÓ Ó׸ ÒØÓÒ × Ü ×Ø Ð Ñ ÒÓ× ÙÒ ÐÓ¸ ÔÙ × ÙÒ ÓÑÔÓÒ ÒØ Ù ÖØ Ñ ÒØ ÓÒ ÜÓ ÓÒØ Ò ÙÒ ÐÓº
  • 711.
    7.7. T´picos sobregrafos dirigidos o 685 Ò Ø ÖÑ ÒÓ× Ð Ð ÓÖ ØÑÓ¸ ×ØÓ ÕÙ Ú Ð Ø Ø Ö × ÙÒ × Ù Ò ÔÓÔ× Ò Ð ÐÓÕÙ Î Ö ¬ Ö × (v) = ÐÓÛ(v) Ý Ú ÒØÙ ÐÑ ÒØ × ÑÔ Ð Ö ÐÓÕÙ ½ ÓÒØ Ò Ñ × ÙÒ ÒÓ Óº Ë Ð Ð ÞÓ ÜØÖ Ð Ñ ÒÓ× Ó× ÒÓ Ó׸ ÒØÓÒ × Ø Ò ÑÓ× ÙÒ ÓÑÔÓÒ ÒØ Ù ÖØ Ñ ÒØ ÓÒ ÜÓ Ó× Ó Ñ × ÒÓ Ó׸ Р٠и ÔÓÖ ¬Ò ÓÒ¸ ÓÒØ Ò ÙÒ ÐÓº Ë ÙÒ Ð × ÓÒ× Ö ÓÒ × ×¸ Ð ÖÙØ Ò Ö ÙÖ× Ú Ú Ò Ò ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ× +≡ ¿ template <class GT, class SA> inline static bool __ida(GT & g, DynListStack<typename GT::Node*> & stack, typename GT::Node * v, long & df_count) { push_in_stack <GT> (stack, v); NODE_BITS(v).set_bit(Aleph::Depth_First, true); df <GT> (v) = low <GT> (v) = df_count++; // recorrer en profundidad todos los nodos conectados a v for (Node_Arc_Iterator <GT, SA> it(v); it.has_current(); it.next()) { typename GT::Node * w = it.get_tgt_node(); if (not IS_NODE_VISITED(w, Aleph::Depth_First)) { if (__ida <GT, SA> (g, stack, w, df_count)) return true; low <GT> (v) = Aleph::min(low <GT> (v), low <GT> (w)); } else if (is_node_in_stack <GT> (w)) // si est´ en pila ==> v fue visitado antes que p a low <GT> (v) = Aleph::min(low <GT> (v), df <GT> (w)); } if (low< GT> (v) == df <GT> (v)) // ¿primer nodo visitado del bloque? { // s´ ==> verifique si tiene dos o m´s nodos ı a int i = 0; for (; true; ++i) // sacar el bloque de la pila hasta sacar a v { typename GT::Node * p = pop_from_stack <GT> (stack); if (p == v) break; } return i > 1; // si sacamos dos o m´s nodos entonces hay ciclo a } return false; } Í× × DynListStack ½½ Ò Node Arc Iterator º ida() × ÙÒ ÖÙØ Ò ×Ø Ø º Ä Ù×Ó ÔÙ Ð Ó × ¬Ò ÓÑÓ ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ× +≡ template <class GT, class SA> inline bool is_digraph_acyclique(GT & g) { long curr_df = 0; // contador de visitas const long & n = g.get_num_nodes();
  • 712.
    686 Cap´ ıtulo 7. Grafos DynListStack<typename GT::Node*> stack; // pila de nodos que define rama for (Node_Iterator <GT, SA> it(g); curr_df < n; it.next()) { typename GT::Node * v = it.get_current(); if (not IS_NODE_VISITED(v, Aleph::Depth_First)) // ¿p visitado? if (__ida <GT, SA> (g, stack, v, curr_df)) // visita recursivamente a p return true; } return false; } Í× × DynListStack ½½ Ò Node Iterator º Ä Ù Ð Ø Ò Ð Ñ ×Ñ ×ØÖÙ ØÙÖ ÕÙ strongly connected components()º ר Ð ÓÖ ØÑÓ Ø ÖÑ Ò Ð Ü ×Ø Ò ÐÓ× Ò ÙÒ Ö Ó Ò Ø ÑÔÓ O(V + E) Ý ÓÒ ÙÒ Ñ Ü ÑÓ ÓÒ×ÙÑÓ ×Ô Ó O(V)º 7.7.5 C´lculo de ciclos en un digrafo a Ò Ð Ñ ×ÑÓ Ø Ò Ö Ð Ú Ö ÒØ Ð ×Ù ¹× ÓÒ ÔÖ ÒØ ¸ ÔÓ ÑÓ× ÑÔÐ Ö Ð Ð Ó¹ Ö ØÑÓ Ì Ö Ò Ô Ö Ð ÙÐ Ö Ø Ú Ý ¬ ÒØ Ñ ÒØ ÙÒ ÐÓ Ò ÙÒ Ö Óº Ù Ò Ó × ÑÓ× Ð Ô Ð Ò Ð ÐÓÕÙ Î Ö ¬ Ö × (v) = ÐÓÛ(v) Ý Ú ÒØÙ Ð¹ Ñ ÒØ × ÑÔ Ð Ö ÐÓÕÙ ½ ¸ ÓÒרÖÙ ÑÓ× ÙÒ Ö Ó ÙÜ Ð Ö ÕÙ Ñ Ô Ð ÓÑÔÓ¹ Ò ÒØ ÓÒ ÜÓº ËÓ Ö ×Ø ÓÑÔÓÒ ÒØ ¸ Ù× ÑÓ× ÙÒ ÐÓ Ñ ÒØ ÙÒ Ù×ÕÙ Ò ÔÖÓ ÙÒ º Ò ÐÑ ÒØ ¸ Ñ ÒØ Ð Ñ Ô Ó¸ ÓÒרÖÙ ÑÓ× Ð Ñ ÒÓ ÓÖÖ ×ÔÓÒ ÒØ Ð ÐÓ ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ× +≡ template <class GT, class SA> inline static bool __cc(GT & g, DynListStack<typename GT::Node*> & stack, typename GT::Node * v, long & df_count, Path<GT> & path) { push_in_stack <GT> (stack, v); NODE_BITS(v).set_bit(Aleph::Depth_First, true); df <GT> (v) = low <GT> (v) = df_count++; // recorrer en profundidad todos los nodos conectados a v for (Node_Arc_Iterator <GT, SA> it(v); it.has_current(); it.next()) { typename GT::Node * w = it.get_tgt_node(); if (not IS_NODE_VISITED(w, Aleph::Depth_First)) { if (__cc <GT, SA> (g, stack, w, df_count, path)) return true; low <GT> (v) = Aleph::min(low <GT> (v), low <GT> (w)); } else if (is_node_in_stack <GT> (w)) // si est´ en pila ==> v fue visitado antes que p a low <GT> (v) = Aleph::min(low <GT> (v), df <GT> (w)); } if (low <GT> (v) == df <GT> (v)) // ¿primer nodo visitado del bloque?
  • 713.
    7.7. T´picos sobregrafos dirigidos o 687 { // saque nodos que est´n en pila e insertelos en un bloque auxiliar a GT block; // grafo auxiliar DynMapAvlTree<typename GT::Node*, typename GT::Node*> table; while (true) // saca el componente y lo inserta en block { typename GT::Node * p = pop_from_stack<GT>(stack); typename GT::Node * q = block.insert_node(p->get_info()); table.insert(q, p); table.insert(p, q); if (p == v) break; } if (block.get_num_nodes() == 1) return false; // si block s´lo tiene un nodo no hay ciclo o // terminanos de construir el bloque con los arcos for (typename GT::Node_Iterator j(block); j.has_current(); j.next()) { typename GT::Node * bsrc = j.get_current(); // nodo actual del bloque typename GT::Node * gsrc = table[bsrc]; // recorrer los arcos de gsrc for (Node_Arc_Iterator<GT, SA> k(gsrc); k.has_current(); k.next()) { typename GT::Node * gtgt = k.get_tgt_node(); typename GT::Node ** btgt_ptr = table.test(gtgt); if (btgt_ptr == NULL) // ¿arco del bloque? continue; typename GT::Arc * ga = k.get_current_arc(); block.insert_arc(bsrc, *btgt_ptr, ga->get_info()); } } // buscar ciclo en block. typename GT::Arc * a = block.get_first_arc(); Path<GT> aux_path(block); Find_Path_Depth_First <GT> () (block, block.get_tgt_node(a), block.get_src_node(a), aux_path); path.clear_path(); for (typename Path<GT>::Iterator it(aux_path); it.has_current(); it.next()) path.append(table[it.get_current_node()]); path.append(table[block.get_tgt_node(a)]); return true; } return false; } Í× × DynListStack ½½ ¸ Node Arc Iterator ¸ Node Iterator ¸ Ò Path ¼¾ º Find Path Depth First <GT> ()ÒÓ ×Ø × Ò Ô Ö Ò ÓÒØÖ Ö ÐÓ׺ ÈÓÖ ÐÐÓ¸ ÐÓ ÕÙ ÑÓ× × × Ð ÓÒ Ö ÙÒ Ö Ó Ù ÐÕÙ Ö s −→ t Ý Ò ÓÒØÖ Ö ÙÒ Ñ ÒÓ t sº ר ÑÓ Ó¸ Ð ÐÓ ÐÓ ÓÒ ÓÖÑ t s −→ tº Ä ÖÙØ Ò ÔÖ Ò Ô Ð × ÒÓÑ Ò compute cycle in digraph()¸ ÙÝ ×ØÖÙ ØÙÖ ¸ ÓÒ Ð Ò Ó ÖÖ Ö Ð ÐÓ¸ × × Ñ Ð Ö strongly connected components()º
  • 714.
    688 Cap´ ıtulo 7. Grafos 7.7.6 Digrafos ac´ ıclicos (DAG) Definici´n 7.6 (Digrafo ac´ o ıclico -DAG-) ÍÒ Ö Ó Ð ÓÓ ½ ¸ × ÙÒ Ö Ó ×Ò ÐÓ׺ Ð ÑÔÐ Ó Ñ × ÔÓÔÙÐ Ö ÐÓ× Ö Ó× Ð Ó× × Ô Ö ÑÓ Ð Þ Ö ÔÐ Ò ¬ ÓÒ × Ù ÓÖ Ö Ó׺ Ò ×Ø ×Ó¸ ÐÓ× ÒÓ Ó× Ö ÔÖ × ÒØ Ò Ø Ö × Ó Ø Ú × ÕÙ ÒרÖÙÑ ÒØ Ò ÙÒ Ó Ö Ý ÐÓ× Ö Ó× Ð × ÔÖ Ò × ÔÓ× Ð × Ð × Ø Ú ×º ÓÒ× Ö ÑÓ׸ Ð Ø Ö Ò Ö Ð Ú ×Ø Ö× ¸ Ð Ù Ð ÓÒ× ×Ø Ò ÓÐÓ Ö× Ð × ÔÖ Ò × Ò ÙÒ ÓÖ Ò ×Ô ¬ Ó ÕÙ ÔÙ Ö Ð ÓÒ Ö× × ÙÒ Ð × Ù ÒØ Ö Ó Medias Interiores Camisa Zapatos Pantalon Corbata Correa Chaleco Paltó Ì Ò ÑÓ× ÒÙ Ú ÓÒ ×¸ Ö ×ÙÑ × Ò Ð Ö Ó Ó ÐÓ× ÒÓÑ Ö × Ð × ÔÖ Ò ×¸ ÕÙ ÒÓ ÔÙ Ò Ö Ð Þ Ö× Ò ÙÒ ÓÖ Ò Ö ØÖ Ö Ó¸ × ÒÓ Ò Ð ÜÔÖ × Ó ÔÓÖ Ð × Ö Ð ÓÒ × Ð Ö Óº È Ö Ú ×Ø ÖÒÓ× Ù Ñ ÒØ ÒÓ ÔÓ ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ ÓÐÓ ÖÒÓ× Ð ÓÖÖ ÒØ × ÕÙ Ð Ô ÒØ ÐÓÒº Ò ÙÒ Ö Ó Ð Ó × ÑÔÖ × ×Ø Ò Ù Ò¸ Ù Ò Ó Ñ ÒÓ׸ ÙÒ ÒÓ Ó Ù ÒØ Ý ÙÒÓ ×ÙÑ ÖÓº Ò Ð Ú ×Ø Ö× Ø Ò ÑÓ× ÐÓ× ÒØ Ö ÓÖ ×¸ Ñ × Ý Ñ × ÓÑÓ Ù ÒØ ׸ Ñ ÒØÖ × ÕÙ ÐÓ× Þ Ô ØÓ× Ý Ð Ô ÐØÓ ÓÑÓ ×ÙÑ ÖÓ׺ 7.7.7 Planificaci´n de tareas o Ì Ò ÖÖ Ó ÔÓÖ ÒÙ ×ØÖ ÙÐØÙÖ ÒÓ× ×Ø Ð Ú ×Ø Ö× ¸ ÕÙ ÕÙ Þ ÒÓ ÔÖ ÑÓ× Ò Ð Ò × Ð ÓÖ Ò ÓÖÖ ØÓ¸ Ò Ð ÓÑÔÐ Ò Ö ÒØ ÕÙ ÔÙ Ø Ò Ö Ð Ò ÓÒØÖ Ö Ó ÓÖ Ò ½ º ÓÒ ÓÖÑ ÙÑ ÒØ Ð ÒØ ØÚ ׸ ÙÑ ÒØ Ð ¬ ÙÐØ º Ò Ó Ö × Ö Ò ×¸ × Ò × Ö Ó¸ Ò ÑÙ × Ó × ÓÒ × Ö٠и Ò ÓÒØÖ Ö Ð ÓÖ Ò × Ù Ò Ð ÓÖÖ ØÓ Ò ÕÙ Ò ÙØ Ö× ØÓ × Ð × Ø Ö × Ó Ø Ú ×º Ì Ð ÓÖ Ò × ÒÓÑ Ò Ó ÓÖ Ò Ñ ÒØÓ ØÓÔÓÐÓ Ó º Ð Ú ×Ø Ö× ÔÙ ÓÖ Ò Ö× ØÓÔÓÐÓ Ñ ÒØ ¸ × ÒÓ Ó× Ù ÒØ × ×Ø ÒÓ Ó× ×ÙÑ ¹ ÖÓ׸ Ð × Ù ÒØ Ñ Ò Ö Ô ØÓÖ Interiores Pantalon Medias Camisa Correa Corbata Chaleco Zapatos Paltó ½ Ð ÒÐ× Ö Ø Ý Ð ÕÙ Ö Ô º ½ ÓÒ× Ö ÙÒ Ò Ú ÙÓ ÕÙ ÒÓ ÓÒÓÞ Ð ÙÐØÙÖ Ó ÒØ Ð Ý × Ð ÔÖÓÔÓÒ Ú ×Ø Ö× º ÓÒ× Ö ¸ Ø Ñ Ò¸ Ñ Ò Ö ÔÓÖ Ð × ÐÚ Ñ ÞÓÒ ÓÒ Ú ×Ø Ñ ÒØ × Ó ÒØ Р׺
  • 715.
    7.7. T´picos sobregrafos dirigidos o 689 × Ö¸ × Ð × Ø Ú × Ò Ð × Ó ÔÖ Ñ Ò ×¸ Ô × Ò Ó ÔÓÖ Ð × ÒØ ÖÑ × × ÙÒ Ð × Ô Ò Ò ×¸ ר Ð × ¬Ò Р׺ Ò Ð ÒרÖÙÑ ÒØ ÓÒ ÙÒ Ó Ö ¸ Ý × ØÙ ÓÒ × Ò Ð × ÕÙ × ÔÓ× Ð Ö Ð Þ Ö Ø Ú ¹ × Ò Ô Ö Ð ÐÓ¸ Ú × × ÑÙÐØ Ò Ñ ÒØ º Ò Ð Ó ÙÖÖ Ò ÓÒ Ð Ú ×Ø Ö× ¸ ÔÓ Ö ÑÓ× ÔÓÒ ÖÒÓ× ÐÓ× ÒØ Ö ÓÖ × Ñ ÒØÖ × ÓØÖ × Ó× Ô Ö×ÓÒ × Ñ × ÒÓ× ÓÐÓ Ò Ð Ñ × Ý Ð × Ñ ×º Ë ÓÒ× Ö ÑÓ× ÙÒ ÙÖ ÓÒ ÓÒר ÒØ Ô Ö Ð ÓÐÓ ÓÒ ÙÒ ÔÖ Ò Ú ×Ø Ö¸ ÒØÓÒ ×¸ Ò ÐÙ Ö ÑÔÐ Ö ÒÙ Ú Ô ×Ó× Ô Ö Ú ×Ø ÖÒÓ× ×ÓÐÓ׸ ÔÓ Ö ÑÓ× ÑÔÐ Ö Ò Ó × ÒÓ× ÝÙ Ò Ó× Ô Ö×ÓÒ × Ñ ×º È Ö ÔÖ Ò ÖÐÓ¸ Ú ÑÓ× Ð × Ù ÒØ ¬ ÙÖ Medias Interiores Camisa Paso 1 Pantalon Corbata Paso 2 Zapatos Correa Paso 3 Chaleco Paso 4 Paltó Paso 5 Ù Ò Ó × Ó Ö Ò Ô Ö Ð ÐÓ¸ Ý ÕÙ × Ò ÖÓÒ Þ Ö ÐÓ× Ó Ö ÒØ × Ô Ö ÕÙ ÒÓ ÑÔÖ Ò Ò Ø Ö × × Ò ÕÙ ÔÖ Ú Ñ ÒØ × Ý Ò ÙÐÑ Ò Ó Ø Ú × Ô Ò ÒØ × Ö Ð Þ × ÔÓÖ ÓØÖÓ× Ó Ö ÒØ ׺ ÈÓÖ ÑÔÐÓ¸ Ð Ø Ö ÕÙ ÓÐÓÕÙ Ð × Ñ × ×Ô Ö Ö ÕÙ Ð Ô ÒØ ÐÓÒ ×Ø ÔÙ ×ØÓ ÒØ × ÔÓÒ Ö ÐÓ× Þ Ô ØÓ׺ Ð ÔÖÓ Ð Ñ ÒØ Ö ÓÖ ÔÙ Ó Ø Þ Ö× Ñ Ò Ö Ò Ö Ð ÓÑÓ Ð ÔÐ Ò ¬ ÓÒ n Ø Ö ×¸ ÙÝ Ô Ò Ò × ×Ø ¬Ò ÔÓÖ ÙÒ Ö Ó Ð Ó¸ Ò m Ó Ö ÒØ ׺ Ð × Ø Ö × × Ð × ÔÙ ×Ó Ö ÙÒ ÙÖ ÓÒ Ó Óר º Ò ×Ø ×Ó¸ × ØÖ Ø Ò ÓÒØÖ Ö Ð Ñ Ò Ñ ÔÐ Ò ¬ ÓÒ × Ö¸ Ò ÓÒØÖ Ö m > 1 × Ù Ò × Ø Ö ×¸ Ô Ö ÖÐ m Ó Ö ÒØ ׸ Ñ Ò Ö Ø Ð ÕÙ Ð ÙÖ ÓÒ Ó Óר ØÓØ Ð × Ñ Ò ÑÓº ÄÓ Ö Ó× Ø Ö × ÔÙ Ò × ÑÔÐ ¬ Ö× × ÙÒ Ö ÙÒר Ò × Ð × ØÙ ÓÒ Ö Ð ÑÓ Ð Þ ¸ Ð Ñ Ó Ù ÓÒ Ý Ð ¬Ò Ð ÔÐ Ò ¬ ÓÒº ÈÓ ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ ×ÙÑ Ö ÕÙ ÓÐÓ Ö× Ð Ñ × Ý Ð ÓÖ Ø ×ÓÒ ÙÒ ×ÓÐ Ø Ö ÓÒ ÙÒ ÙÖ ÓÒ Ñ ÝÓÖº ר ÓÒ × Ð ÒÓÑ Ò Ö Ù ÓÒ ÔÓÖÕÙ Ö Ù Ð ÒØ ÒÓ Ó× Ð Ö Ó¸ × ÑÔÐ ¬ Ð ÓÑÔÖ Ò× ÓÒ Ð ÑÓ ÐÓ Ý ÔÓÖ ÐÓ Ò Ö Ð Ö Ù Ð Ø ÑÔÓ Ù ÓÒº Ò × × Ù Ò Ð ×¸ × Ö¸ Ñ ÒÓ× × ÑÔÐ × ÒÓ Ó× ÓÒ ÙÒ ×ÓÐÓ Ö Ó ÒØÖ Ý ÓØÖÓ × Ð ¸ ÔÙ Ò ÓÑÔÖ Ñ Ö× ÙÒ ×ÓÐÓ ÒÓ Ó ÓÒ× ×Ø ÒØ ×Ù ×ÙÑ Ø Ö ×º Ä Ö Ù ÓÒ ÒØ Ö ÓÖ × ØÙÓ ×Ó Ö ÙÒ Ò × Ù Ò Ð¸ Ô ÖÓ ÔÙ Ô Ö Ø Ñ ÒØ Ö Ð Þ Ö× ×Ó Ö ÙÒ ×Ù ¹ Ö Ó ÒØ ÖÓº ÓÑÓ ÑÔÐÓ ÙÐÑ Ò ÒØ ÓÒ× Ö ÑÓ× ×Ø ÒÙ Ú ÓÖ Ò Þ ÓÒ Ð Ú ×Ø Ö× Medias, interiores Camisa Pantalon, Zapatos Correa Corbata Chaleco Paltó
  • 716.
    690 Cap´ ıtulo 7. Grafos ÄÓ× Ö Ó× ÔÐ Ò ¬ ÓÒ Ø Ò Ò Ú Ö× × ÔÐ ÓÒ ×¸ ÒØÖ Ð × Ù Ð × Ñ Ò¹ ÓÒ Ö ½º ÈÐ Ò ¬ ÓÒ ÒרÖÙ ÓÒ × Ò ÙÞ Ö ÔÓÖ ÙÒÓ Ó Ú Ö Ó× ÔÖÓ × ÓÖ × ÐÓ× Óѹ Ô Ð ÓÖ × Ò Ö Ò ÒרÖÙ ÓÒ × Ò Ó Ó Ñ ÕÙ Ò º ÒרÖÙ ÓÒ Ø Ò ÙÒ ÙÖ ÓÒ Ò ÐÓ× Ý ÙÒ ÔÖ Ò ×Ó Ö ÓØÖ × Ô Ö ÕÙ ÒÓ Ó ÙÖÖ ÖÙÔØÙÖ Ð Ò¹ ÙÞ Ñ ÒØÓ ´Ô Ô Ð Ò Ò µº Ò ×Ø ×Ó¸ Ð ÓÑÔ Ð ÓÖ ÓÒרÖÙÝ ÙÒ Ö Ó Ð Ó × ÙÒ Ð Ò ÓÐ Ð ÔÖÓ × ÓÖ Ý ÓÔØ Ñ Þ Ð × Ù Ò ÒרÖÙ ÓÒº ¾º ÈÐ Ò ¬ ÓÒ Ó Ö × Ó ÔÖÓÝ ØÓ× ÔÓÖ ÑÔÐÓ¸ Ô Ö ÓÒרÖÙ Ö ÙÒ ÓÑÔÐ Ó ¬ Ó× × ÔÙ Ö Ð Þ Ö ÙÒ Ö Ó ØÚ × Ý¸ Ò ÙÒ ÓÒ ÐÓ× Ó Ö ÒØ × ´ ÓÒרÖÙ ØÓÖ ×¸ Ñ ÕÙ Ò Ö ×¸ ÒØ Ô Ö×ÓÒ ×µ¸ Ò ÓÒØÖ Ö ÙÒ ÔÐ Ò ¬ ÓÒ Ó Óר Ó Ñ Ò Ñ ÙÖ ÓÒº 7.7.8 Ordenamiento topol´gico o Ü ×Ø ÙÒ Ð × Ó Ý × ÑÔÐ × ÑÓ Ð ÓÖ ØÑÓ Ô Ö Ò ÓÒØÖ Ö ÙÒ ÓÖ Ò Ñ ÒØÓØÓÔÓÐÓ Ó ÙÒ Ö Ó Ð Ó Algoritmo 7.3 (Ordenamiento topol´gico) Ä o ÒØÖ Ð Ð ÓÖ ØÑÓ × ÙÒ Ö Ó Gº Ä × Ð × ÙÒ Ð ×Ø ÒÓ Ó× l¸ Ò ÐÑ ÒØ Ú ¸ ÓÖÖ ×ÔÓÒ ÒØ Ð ÓÖ Ò Ñ ÒØÓ ØÓÔÓÐÓ Ó Ð Ö Ó Gº Ê Ô Ø Ñ ÒØÖ × G Ø Ò ÒÓ Ó× ½º × Ó ÙÒ ÒÓ Ó ×ÙÑ ÖÓ v ´ÙÒÓ ÕÙ ÒÓ Ø Ò Ö Ó× × Ð µº ¾º Ð Ñ Ò ÐÓ G ÙÒØÓ ÓÒ ØÓ Ó× ×Ù× Ö Ó× ÒØÖ º ¿º ÁÒ× ÖØ v Ð Ð ×Ø lº ר Ð ÓÖ ØÑÓ Ò Ù ÒØÖ Ð ÓÖ Ò Ñ ÒØÓ Ñ Ò Ö ÒÚ Ö× × ÐÓ× ×ÙÑ ÖÓ× ×Ø ÐÓ× Ù ÒØ ׺ Ø Ö ÓÒ Ð Ñ Ò ÙÒ ×ÙÑ ÖÓ Ð Ö Ó¸ ÐÓ ÕÙ ÓÒ ÖØ ØÙ ¸ Ð Ð Ñ Ò Ö ×Ù× Ö Ó× ÒØÖ ¸ Ð Ñ ÒÓ× ÙÒ ÒÙ ÚÓ ×ÙÑ ÖÓ ÒØÖÓ Ð Ö Óº Ð Ð ÓÖ ØÑÓ ÔÖÓ Ö × ×Ø ÕÙ ×ÓÐÓ ÕÙ Ò ÙÒÓ Ó Ñ × Ù ÒØ ׺ ÍÒ Ñ Ò Ö Ö Ø Ý × ÑÔÐ ÑÔÐ ÒØ Ö Ð Ð ÓÖ ØÑÓ º¿ × Ó Ø Ò Ò Ó Ð Ö Ó ÒÚ Ö×Ó Ý ÒØÓÒ × ÙØ Ö Ð Ø Ö ÐÑ ÒØ Ð Ð ÓÖ ØÑÓº Ð ÙÒ Ó Ò ÓÒÚ Ò ÒØ × ÕÙ × ÙÔÐ Ð ×Ô Ó¸ ÐÓ ÕÙ ÔÙ × Ö ÓרÓ×Ó Ô Ö Ö Ó× ÒÓÖÑ ×º Ð Ð ÓÖ ØÑÓ º¿ ÔÙ ÔÐ ÒØ Ö× Ô Ö Ø Ñ ÒØ Ò ÙÒ ÓÒ ÐÓ× Ù ÒØ × × Ö¸ × Ð ÓÒ Ö ÒÓ Ó× Ù ÒØ ׸ Ð Ñ Ò ÖÐÓ× ÙÒØÓ ×Ù× Ö Ó× × Ð Ý ÓÒØ ÒÙ Ö ÓÒ ÐÓ× ÒÙ ÚÓ× Ù ÒØ ׺ ÙÒ Ò ×Ø ×Ó¸ × Ò × Ö Ó Ö Ð Þ Ö ÙÒ ÓÔ × × × ÓÒ× ÖÚ Ö Ð Ö Ó ÓÖ Ò Ðº Ä ÑÔÐ ÒØ ÓÒ Ð Ð ÓÖ ØÑÓ º¿ × Ò ØÙ Ö ÙÒ ÓÔ Ð Ö Ó × Ñ × ÓÑÔÐ ¸ ÔÙ × ÑÓ× ØÖ Ø Ö ÓÒ Ó× ÔÖÓ Ð Ñ × ÕÙ Ð Ì List Digraph<Node, Arc> ÒÓ ÒÓ× Ö ×Ù ÐÚ Ö Ø Ñ ÒØ ´½µ Ø ÖÑ Ò Ö Ð Ö Ó ÒØÖ ÙÒ ÒÓ Ó Ý ´¾µ ÔÖÓ × Ö Ö Ô Ñ ÒØ ÐÓ× ÒÓ Ó׸ × ÐÓ× ×ÙÑ ÖÓ× ×Ø ÐÓ× Ù ÒØ ׺
  • 717.
    7.7. T´picos sobregrafos dirigidos o 691 Ordenamiento topol´gico por profundidad o Ë ÙÒ Ð × ÒØ Ó¸ ÔÓ ÑÓ× ÓÒ× Ö Ö Ó× Ð × × Ð ÓÖ ØÑÓ׺ Ë Ú ÑÓ× × ÐÓ× ×ÙÑ ÖÓ× ÐÓ× Ù ÒØ ׸ ÒØÓÒ × ÙÒ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ ¸ ÕÙ Ú × Ø ÒÓ Ó Ò ×Ù¬ Ó¸ ÓÑ ÒÞ Ö ÔÓÖ Ð ÔÖ Ñ Ö ×ÙÑ ÖÓ ÕÙ × Ò ÓÒØÖ Óº Ó ÙÒ ÒÓ Ó Ù ÐÕÙ Ö curr¸ ר ÔÙ Ö ÓÖÖ Ö× Ö ÙÖ× Ú Ñ ÒØ ¸ Ò ÔÖÓ ÙÒ Ý Ò ×Ù¬ Ó¸ Ð × Ù ÒØ ÓÖÑ ½ ÇÖ Ò Ñ ÒØÓ ØÓÔÓÐÓ Ó ½ ≡ ½ template <class GT, class SA> static inline void __topological_sort(GT & g, typename GT::Node * curr, DynDlist<typename GT::Node*> & list) { if (IS_NODE_VISITED(curr, Depth_First)) return; NODE_BITS(curr).set_bit(Depth_First, 1); // marcarlo como visitado // visitar recursivamente en sufijo los nodos adyacentes a curr for (Node_Arc_Iterator<GT, SA> it(curr); it.has_current() and list.size() < g.get_num_nodes(); it.next()) __topological_sort<GT, SA> (g, it.get_tgt_node(), list); list.insert(curr); // inserci´n en sufijo de un nodo que devino sumidero o } Í× × DynDlist ¿ Ò Node Arc Iterator º Ë Ò ÑÔÓÖØ Ö Ù Ð × Ð ÔÖ Ñ Ö ÒÓ Ó × Ð Ù Ð × ÒÚÓÕÙ ×Ø ÖÙØ Ò ¸ ר Ú ÒÞ Ö Ö ÙÖ× Ú Ñ ÒØ ר Ò ÓÒØÖ Ö ÙÒ ÒÓ Ó Ý Ú × Ø Ó Ó ×Ø ÙÒ ×ÙÑ ÖÓ Ò ×Ø ÙÐØ ÑÓ ×Ó¸ ÒÓ × ÒØÖ Ò Ð for Ý Ð ÒÓ Ó × Ò× ÖØ Ò listº ÈÙ ×ØÓ ÕÙ Ò× ÖØ ÑÓ× Ò list Ð ÔÖ Ò Ô Ó¸ Ð ÔÖ Ñ Ö ×ÙÑ ÖÓ ÕÙ × Ó × ÖÚ × Ö Ð ÙÐØ ÑÓ ÒÓ Ó Ò Ð Ð ×Ø ¸ Ñ ÒØÖ × ÕÙ Ð ÙÐØ ÑÓ Ó × ÖÚ Ó¸ Ó × ¸ ÙÒ Ù ÒØ ¸ × Ö Ð ÔÖ Ñ ÖÓº ÁÒ× ÖØ Ö Ò list ÓÑÓ Ò ÙÒ Ô Ð ÒÓ× ÔÖÓÔÓÖ ÓÒ Ð ÓÖ Ò ØÓÔÓÐÓ Óº ÍÒ Ú Þ ÕÙ ÒÚÓ Ð ÙÐØ Ñ ÒרÖÙ ÓÒ list.insert(curr)¸ ØÓ Ó× ÐÓ× ÒÓ Ó× Ð ÒÞ ¹ Ð × × curr Ý Ò × Ó Ò× ÖØ Ó× Ò listº ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð ÓÖ Ò Ò× Ö ÓÒ × ÓÖÖ ØÓ¸ ÔÙ × curr Ú ÒØ × Ò ×Ù ÓÖ Ò ØÓÔÓÐÓ Óº × ÑÔÓÖØ ÒØ Ó × ÖÚ Ö ÕÙ Ð ÓÒ ÓÒ Ø Ò ÓÒ Ð for Ò ÐÙÝ Ð Ó ÕÙ Ý ØÓ Ó× ÐÓ× ÒÓ Ó× Ý Ò × Ó Ú × Ø Ó׺ ×ØÓ × Ø Ø Ù Ò Ó Ð ÒØ ÒÓ Ó× Ð Ð ×Ø × Ð Ñ ×Ñ ÕÙ Ð Ö Ò Ð Ð Ö Óº Ò ×Ó ÕÙ topological sort() × Ò × ÙÒ ÒÓ Ó ÕÙ ÒÓ × Ù ÒØ ¸ Ó ÕÙ Ü ×Ø Ò Ú Ö Ó× Ù ÒØ ׸ Ö ×Ø Ö Ò ÒÓ Ó× × Ò Ú × Ø Ö¸ Ö Ó × Ò Ò× ÖØ Ö Ò Ð Ð ×Ø º ×ØÓ × Ö ×Ù ÐÚ × ÑÔÐ Ñ ÒØ Ö ÓÖÖ Ò Ó ØÓ Ó× ÐÓ× ÒÓ Ó× Ð Ö Ó ÒÚÓ Ò Ó topological sort() ½ ÇÖ Ò Ñ ÒØÓ ØÓÔÓÐÓ Ó ½ +≡ ½ ¾ template <class GT, class SA> inline void topological_sort(GT & g, DynDlist<typename GT::Node*> & list) { for (typename GT::Node_Iterator it(g); it.has_current() and list.size() < g.get_num_nodes(); it.next()) { typename GT::Node * curr = it.get_current_node(); if (not IS_NODE_VISITED(curr, Depth_First)) __topological_sort<GT, SA>(g, curr, list); }
  • 718.
    692 Cap´ ıtulo 7. Grafos } Í× × DynDlist ¿ Ò Node Iterator º topological sort() ÔÙ Ø Ö Ö Ø ÒØ × Ú × ÓÑÓ Ö Ó× Ø Ò Ð Ö Ó ×ØÓ ÕÙ Ð × ÑÔ ÒÓ Ø Ò O(E) ÐÓ Ù Ð¸ Ò Ð Ô ÓÖ ÐÓ× ×Ó׸ ÔÙ × Ö O(V 2)º È ÖÓ¸ ÔÓÖ ÐÓ Ò Ö Ð¸ Ô Ö ÙÒ Ö Ó Ð Ó¸ E ≈ 2V º A I P F M B J Q G N C K R O H D L S →À→Ä→Ã→Ç→Ë→ → → → → →Â→Æ→Ê→Å→É→Á→È ´ µ topological sort() →À→Ä→Ã→Ç→Ë→ → → → → →Â→Æ→Ê→Å→É→Á→È ´ µ q topological sort() ÙÖ º ½ ÍÒ Ö Ó Ý ×Ù× ÓÖ Ò Ñ ÒØÓ× ØÓÔÓÐÓ Ó× Ordenamiento topol´gico por amplitud o ÇØÖÓ Ò ÓÕÙ Ô Ö ÓÖ Ò Ö ØÓÔÓÐÓ Ñ ÒØ × ÕÙ Ô Ö ÓÒ ÙÒ Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ ÐÓ ÕÙ ÓÒÐÐ Ú Ð Ú ÒØ ÓÒØÖÓÐ Ö Ñ ÓÖ Ð ÓÒ×ÙÑÓ ×Ô Ó Ð Ð Ñ Ø ÖÐÓ ÙÒ ÓÐ ÒÓ Ó× ¹ ÓÒ Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ ¸ Ð Ö ÙÖ× ÓÒ ÔÙ Ð ÒÞ Ö O(V)¸ ÐÓ ÕÙ ÔÙ Ö ¸ Ò Ð ÙÒÓ× ×Ó׸ ÖÖ Ö Ô Ð ÖÓ Ô Ö Ð Ô Ð Ð × ×Ø Ñ ¹ ¾ ÇÖ Ò Ñ ÒØÓ ØÓÔÓÐÓ Ó ½ +≡ ½ ¿ template <class GT, class SA> inline void q_topological_sort(GT & g, DynDlist<typename GT::Node*> & list) { // recorra todos los nodos para contabilizar su grado de entrada for (typename GT::Node_Iterator i(g); i.has_current(); i.next()) for (Node_Arc_Iterator <GT, SA> j(i.get_current_node()); j.has_current(); j.next()) // incremente grado entrada nodo destino NODE_COUNTER(j.get_tgt_node())++; // revisar nodos con grado de entrada 0 y meterlos en cola DynListQueue<typename GT::Node*> q; // cola de fuentes for (typename GT::Node_Iterator it(g); it.has_current(); it.next()) { typename GT::Node * p = it.get_current_node(); if (NODE_COUNTER(p) == 0) // ¿es un nodo fuente? q.put(p); // s´ ==> colocarlo en la cola ı } while (not q.is_empty()) { typename GT::Node * p = q.get(); // saque ultimo nodo fuente ´ list.append(p); // ins´rtelo en el orden topol´gico e o
  • 719.
    7.7. T´picos sobregrafos dirigidos o 693 // decrementar grado de entrada de cada nodo adyacente a p for (Node_Arc_Iterator<GT, SA> it(p); it.has_current(); it.next()) { typename GT::Node * tgt = it.get_tgt_node(); if (--NODE_COUNTER(tgt) == 0) // ¿tgt deviene nodo fuente? q.put(tgt); // s´ ==> col´quelo en la cola ı o } } } Í× × DynDlist ¿ ¸ DynListQueue ½ ¼ ¸ Node Arc Iterator ¸ Ò Node Iterator º Ð × ÑÔ ÒÓ ×Ø Ð ÓÖ ØÑÓ × 2 × O(V) ÔÓÖ ÐÓ× Ó× ÔÖ Ñ ÖÓ× Ð ÞÓ× Ñ × O(E) ÔÓÖ Ð whileº ÄÓ ÕÙ ÒÓ× ÖÖÓ O(E) ÓÑÓ × ÑÔ ÒÓ Ò Ö Ð Ð Ð ÓÖ ØÑÓ¸ ÙÒ Ö Ò Ñ ÒØÓ × Ñ Ð Ö Ð Ú Ö× ÓÒ × Ò Ð Ù×ÕÙ Ò ÔÖÓ ÙÒ º Rangos topol´gicos o Ð Ö Ò Ó ØÓÔÓÐÓ Ó ÙÒ ÒÓ Ó × ×Ù Ò Ú Ð Ò Ð Ö Ó Ö ×Ô ØÓ Ð × Ø Ö × ÕÙ ÐÓ ÔÖ Ò Ý Ð × ÕÙ ÐÓ× ×Ù Òº ÍÒ Ö Ò Ó ØÓÔÓÐÓ Ó × × ¹× Ò ×Ô ¬ Ö ÕÙ × ØÖ Ø ÙÒ ÒÓ Ó¹¸ × ÙÒ ÓÒ ÙÒØÓ Ø Ö × ÕÙ ÔÙ Ò Ö Ð Þ Ö× Ò Ô Ò ÒØ Ñ ÒØ ÙÒ Ú Þ ÕÙ Ò × Ó ÙÐÑ Ò × Ð × Ø Ú × Ð Ö Ò Ó ÔÖ ×ÓÖº ÈÓÖ ÑÔÐÓ¸ ÐÓ× Ö Ò Ó× ØÓÔÓÐÓ Ó× Ð Ö Ó Ð ¬ ÙÖ º ½ ×ÓÒ ½º R1 = {A, C, D} ¾º R2 = {B, G, H} ¿º R3 = {F, K, L} º R4 = {I, J, O} º R5 = {M, N, S} º R6 = {P, Q, R} ÄÓ ÕÙ × Ò ¬ ÕÙ × Ð × Ø Ö × ØÓÑ × Ò Ð Ñ ×Ñ ÙÖ ÓÒ¸ ÒØÓÒ × ÔÖ Ñ ÖÓ Ö ÕÙ ÙØ Ö R1¸ ÐÙ Ó R2 Ý × ×Ù × Ú Ñ ÒØ º Ð Ð ÙÐÓ ÐÓ× Ö Ò Ó× ÔÙ Ö Ð Þ Ö× Ñ ÒØ Ù ÐÕÙ Ö ÐÓ× Ð ÓÖ ØÑÓ× ÓÖ Ò Ñ ÒØÓ ØÓÔÓÐÓ Óº À ÕÙ ÙÒ Ú Ö ÒØ Ð × Ó Ò ÑÔÐ ØÙ ÕÙ ÑÔÐ Ó× ÓÐ × ¿ ÇÖ Ò Ñ ÒØÓ ØÓÔÓÐÓ Ó ½ +≡ ¾ template <class GT, class SA> inline void q_topological_sort(GT & g, DynDlist<DynDlist<typename GT::Node*>*> & ranks) { // recorra todos los nodos para contabilizar su grado de entrada for (typename GT::Node_Iterator i(g); i.has_current(); i.next()) for (Node_Arc_Iterator <GT, SA> j(i.get_current_node()); j.has_current(); j.next()) // incremente grado entrada nodo destino NODE_COUNTER(j.get_tgt_node())++; // revisar nodos con grado de entrada 0 y meterlos en cola DynListQueue<typename GT::Node*> q; // cola de fuentes for (typename GT::Node_Iterator it(g); it.has_current(); it.next())
  • 720.
    694 Cap´ ıtulo 7. Grafos { typename GT::Node * p = it.get_current_node(); if (NODE_COUNTER(p) == 0) // ¿es un nodo fuente? q.put(p); // s´ ==> colocarlo en la cola ı } while (not q.is_empty()) { DynDlist<typename GT::Node*> * rank = new DynDlist<typename GT::Node*>; DynListQueue<typename GT::Node*> aq; while (not q.is_empty()) // saca todos los nodos del nivel i { typename GT::Node * p = q.get(); // saque ultimo nodo fuente ´ rank->append(p); // ins´rtelo en el rango topol´gico e o // decrementar grado de entrada de cada nodo adyacente a p for (Node_Arc_Iterator<GT, SA> it(p); it.has_current(); it.next()) { typename GT::Node * tgt = it.get_tgt_node(); if (--NODE_COUNTER(tgt) == 0) // ¿tgt deviene nodo fuente? aq.put(tgt); // s´ ==> col´quelo en cola auxiliar ı o } } ranks.append(rank); q.swap(aq); } } Í× × DynDlist ¿ ¸ DynListQueue ½ ¼ ¸ Node Arc Iterator ¸ Ò Node Iterator º Ð Ð ÓÖ ØÑÓ × ×ØÖÙ ØÙÖ ÐÑ ÒØ × Ñ Ð Ö q topological sort()º Ð Ô Ö Ñ ØÖÓ ranks × ÙÒ Ð ×Ø Ð ×Ø × ÒÓ Ó׺ Ð ×Ø × ÙÒ Ö Ò Ó Ý ÓÒØ Ò ÐÓ× ÒÓ Ó× ÕÙ ÐÓ ÓÒ ÓÖÑ Òº Ä Ð ×Ø ר ÓÖ Ò ÔÓÖ Ð ÓÖ Ò Ð Ö Ò Ó × Ö¸ Ð ÔÖ Ñ Ö Ð ×Ø ÓÒØ Ò Ð × Ø Ö × ÕÙ × ÙØ Ò ÔÖ Ñ ÖÓ Ý × ×Ù × Ú Ñ ÒØ º Ð Ð ÓÖ ØÑÓ ÑÔÐ ÙÒ ÓÐ ÙÜ Ð Ö aqº Ù Ò Ó × Ö Ñ ÒØ Ð Ö Ó Ý × Ø Ö¹ Ñ Ò ÕÙ Ý ÕÙ Ò ÓÐ Ö¸ Ð ÒÓ Ó × Ñ Ø Ò qaº ÍÒ Ú Þ ÕÙ × Ò × Ó ØÓ Ó× ÐÓ× ÒÓ Ó× Ö Ó ÖÓ¸ ÐÓ× Ù Ð × ÓÖÖ ×ÔÓÒ Ò ÐÓ× Ð Ö Ò Ó ØÙ и ÐÓ× ÒÓ Ó× qa × ÓÔ Ò ´ Ò O(1) Ñ ÒØ swap()µ q Ý × Ö Ô Ø Ð ÔÖÓ Ñ ÒØÓº Ò Ó × ÓÒ ×¸ Ð × Ø Ö × ÒÓ Ø Ò Ò Ð Ñ ×Ñ ÙÖ ÓÒ¸ ÐÓ ÕÙ Ò ÖØ ÓÖÑ ÖÓÑÔ ÓÒ Ð ÔÖ Ð ÓÒº Ò ×Ø × × ØÙ ÓÒ ×¸ Ð × Ø Ö × ÔÙ Ò Ú Ö× Ò ÙÖ ÓÒ × Ø ÖÑ Ò × Ý × ÓÒרÖÙ Ö ÙÒ Ö Ó ÕÙ Ú Ð ÒØ ÙÝÓ× ÒÓ Ó× Ö ÔÖ × ÒØ Ò Ð Ñ ×Ñ ÙÖ ÓÒº ËÓ Ö ×Ø Ö Ó ÜØ Ò Ó × Ð ÙÐ Ð Ö Ò Óº 7.8 Arboles abarcadores m´ ınimos Ó ÙÒ Ö Ó ÓÒ ÜÓ G =< V, E > ÓÒ ×Ø Ò × ´Ó Ô ×Ó×µ¸ ÙÒ Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ × ÙÒ Ö ÓÐ Ö ÓÖ G Ø Ð ÕÙ Ð ×ÙÑ ØÓØ Ð ×Ù× ×Ø Ò × × Ñ Ò Ñ º ÄÓ× Ö ÓÐ × Ö ÓÖ × Ø Ò Ò ÑÙÝ ÙØ Ð × ÔÐ ÓÒ ×º ËÙÔÓÒ ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ Ð ÔÐ Ò ¬ ÓÒ ÙÒ × ×Ø Ñ ÖÖÓÚ Ö Ó Ò ÓÒ Ð¸ Ó ÙÒ Ö ØÖ Ò×Ñ × ÓÒ Ð ØÖ Ô Ö Ð Ô ×º Ñ Ó× ÔÖÓÝ ØÓ× ÓÒÐÐ Ú Ò Óר × Ò Ø ÖÑ ÒÓ× ØÖ Ó¸ ÙÖ ÓÒ Ý ¬¹ Ò Ò Ñ ÒØÓº Ò ×Ø × × ØÙ ÓÒ × × ÔÙ ÑÓ Ð Þ Ö ÙÒ Ö Ó ØÓ × Ð × ÐØ ÖÒ Ø Ú × Ø Ð × ÙÒ ÐÓ× Ø ÖÑ ÒÓ× Ñ Ò ÓÒ Ó׺ Ð Ö Ó Ñ ÒØ Ò Ö Ð × ÔÓ× Ð × Ú × Ò
  • 721.
    7.8. Arboles abarcadoresm´ ınimos 695 G C L H Á À à I F B M Ä K D A Å Â J ´µ ´ µ ÙÖ º ¾ ÍÒ Ö Ó Ý ×Ù Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ ÙÒ ÓÒ Ð Ó Ö ¸ Ó Ð ÙÖ ÓÒ ÓÒרÖÙ ÓÒ Ó Ð Óר ¬Ò Ò Ñ ÒØÓº Ò Ñ × × ØÙ ÓÒ ×¸ ÙÒ Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ ÒÓ× ÔÖÓÔÓÖ ÓÒ Ð Ö Ñ Ò Ñ ¸ × ÙÒ ÐÓ× Ø ÖÑ ÒÓ× Ð ÑÓ ÐÓ¸ ÕÙ Ö ÒØ Þ ÓÑÔÐ Ø ÓÒ Ø Ú º ÓÒ× Ö ÑÓ× ÙÒ Ö Ó G =< V, E > Ý ÙÒ Ö ÓÐ Ö ÓÖ T =< V, E > | E ⊂ Eº ÈÙÒØÙ Ð ÑÓ× Ð ÙÒ × Ó × ÖÚ ÓÒ × ×Ó Ö Ð Ö Ø Ö Ö ÓÐ Ý Ñ Ò Ñ Ð T ½º Ë G ÓÒØ Ò ÐÓ׸ ÒØÓÒ ×¸ ÓÒ ÖØ ØÙ ¸ |E | < |E|º ¾º Ë T × Ñ Ò ÑÓ¸ ÒØÓÒ × Ô ×Ó(e) × Ñ Ò Ñ ´ºµ ∀e∈E Ë ÒÓ Ü ×Ø Ò Ò ÙÒ Ú ÐÓÖ Ö Ô Ø Ó Ô ×Ó Ò G¸ ÒØÓÒ × ÒÓ Ü ×Ø Ò Ò ÙÒ ÓØÖÓ ÓÒ ÙÒØÓ E ÙÝ ×ÙÑ × Ñ ÒÓÖº ÐÓ ÓÒØÖ Ö Ó¸ ÔÙ Ò Ü ×Ø Ö ÙÒÓ Ó Ñ × ÓÒ ÙÒØÓ× Ö Ó× E ÙÝ ×ÙÑ × Ù Ð Ð E ¸ Ô ÖÓ ×ØÓ× Ø Ñ Ò ×ÓÒ Ñ Ò ÑÓ׺ Ó ÓØÖÓ ÑÓ Ó¸ ÙÒ Ö Ó G ÔÙ Ø Ò Ö Ú Ö Ó× Ö ÓÐ × Ö ÓÖ × Ñ Ò ÑÓ׺ ÍÒ Ð ÓÖ ØÑÓ ÕÙ Ò Ù ÒØÖ ÙÒ Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ ×Ø Ò Ù Ö ÐÓ× Ö Ó× ÕÙ Ô ÖØ Ò Ò E ÐÓ× ÕÙ ÒÓ Ô ÖØ Ò Òº Ù Ò Ó ÓÒ× Ö ÑÓ× ÙÒ Ö Ó G¸ ÓÑÓ × ÑÓ× × ×Ø Ô ÖØ Ò Ó ÒÓ Ð Ö ÓÐ Ö ÓÖ È Ö Ð ÓÖ ×Ø Ù ×Ø ÓÒ Ö ÕÙ Ö Ö ÑÓ× Ð × Ù ÒØ ¬Ò ÓÒ Definici´n 7.7 (Corte de un grafo) Ë ÙÒ Ö Ó Gº ÍÒ o ÓÖØ ×Ó Ö G × ÙÒ Ô ÖØ ÓÒ G Ò Ó× ×Ù Ö Ó× × ÙÒØÓ× G1 Ý G2º ÄÓ× Ö Ó× Ð Ñ Ò Ó× G¸ × Ö¸ ÕÙ ÐÐÓ× ÕÙ ÓÒ Ø Ò ÒÓ Ó× G1 ÓÒ ÒÓ Ó× G2¸ × ÒÓÑ Ò Ò Ö Ó× ÓÖØ º Ä × ØÙ ÓÒ Ò Ù ×Ø ÓÒ × ÔÙ Ô ØÓÖ Þ Ö ×
  • 722.
    696 Cap´ ıtulo 7. Grafos G . G1 . G2 . arcos de corte Ë Ò ×Ø ¬ ÙÖ Ñ Ò ÑÓ× ÙÒ Ö ÓÐ Ö ÓÖ¸ ÒØÓÒ ×¸ ÒÓ× × Ö Ó Ú Ó ÕÙ ×ÓÐÓ ÙÒÓ ÒØÖ ÐÓ× Ö Ó× ÖÙ Ô ÖØ Ò Ð Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ¸ Ô٠׸ ÐÓ ÓÒØÖ Ö Ó¸ Ö ÙÒ ÐÓ Ý ÒÓ ÔÓ Ö ÑÓ× Ö ÕÙ × ÙÒ Ö ÓÐ Ö ÓÖº Ù Ð ÒØÖ ØÓ Ó× ÐÓ× Ö Ó× ÖÙ Ô ÖØ Ò Ð Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ Ä Ö ×ÔÙ ×Ø ÒÓ× Ð Ó Ö Ð × Ù ÒØ ÔÖÓÔÓ× ÓÒº Proposici´n 7.1 (Propiedad del corte - Sedgewick-2001 [33]) Ë G =< V, E > o ÙÒ Ö Ó Ý T =< V, E > | E ⊂ E¸ ÙÒ Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ Gº Ë < G1, G2 > ÙÒ ÓÖØ Ù ÐÕÙ Ö Gº ÒØÓÒ × Ð Ö Ó ÖÙ Ñ Ò ÑÓ ÒØÖ ÐÓ× ÔÓ× Ð × ÖÙ ÒØÖ G1 Ý G2 Ô ÖØ Ò Ð Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓº Demostraci´n (por contradicci´n) o o ËÙÔÓÒ ÑÓ× ÙÒ ÓÖØ Ù ÐÕÙ Ö < G1, G2 > Ý Ð Ü ×Ø Ò ÙÒ Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ T =< V, E > ÙÝÓ Ö Ó ÖÙ ÒÓ × Ð Ñ Ò ÑÓº Ë Ò T1 Ý T2 ÐÓ× ÓÑÔÓÒ ÒØ × T × ÙÒ Ð ÓÖØ º È ØÓÖ ÑÓ× Ð ×ÙÒØÓ × T . T1 . T2 . arcos de corte Ë a Ð ÖÓ ÖÙ ÒØÖ T1 Ý T2¸ Р٠и ÓÑÓ Ý ÐÓ ÑÓ× Ó¸ ÒÓ × Ð Ñ Ò ÑÓ ÐÓ× ÖÙ ÒØÖ G1 Ý G2º ÈÙ ×ØÓ ÕÙ T1 Ý T2 ×ÓÒ Ð Ó׸ ÔÓ ÑÓ× ×ÙÔÖ Ñ Ö Ð Ö Ó ÖÙ a Ý ×Ù ×Ø ØÙ ÖÐÓ ÔÓÖ Ð ÖÙ Ñ Ò ÑÓ amin Ý × Ö Ö ÙÒ Ö ÓÐ Ö ÓÖ T =< V, E >=< V, E − {a} ∪ {aÑ Ò } >º ÈÙ ×ØÓ ÕÙ Ô ×Ó(amin) < Ô ×Ó(a) =⇒ ∀e∈E Ô ×Ó(e) < ∀e∈E Ô ×Ó(e)º ÄÓ ÕÙ ÓÒØÖ Ð ÔÖ Ñ × Ò Ð ÕÙ T × Ð Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ Gº Ä ÔÖÓÔÓ× ÓÒ × ÔÙ × ÖØ ÄÓ× Ð ÓÖ ØÑÓ× ÕÙ ØÖ Ø Ö ÑÓ× ÓÒרÖÙÝ Ò ÔÖÓ Ö × Ú Ñ ÒØ ÙÒ Ö ÓÐ T ÔÓÖ Ò ÙÖ ÔÖÓ Ö × Ú Ö Ó׺ Ú Þ ÕÙ × Ò ÙÒ ÒÙ ÚÓ Ö Ó Ð Ö ÓÐ T × Ú Ö ¬ × × Ù× ÙÒ ÐÓº Ë × ×¸ ÒØÓÒ × Ð Ö Ó Ö Ò Ò Ó × Ð Ñ Ò Ð Ö ÓÐ ÐÓ ÓÒØÖ Ö Ó¸ ר Ô ÖØ Ò Ð Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓº Ä Ö Ò ÒØÖ ÐÓ× Ð ÓÖ ØÑÓ× × Ð Ñ Ò Ö Ò ÕÙ × × Ó Ò ÐÓ× Ö Ó× Ð Ö Ó Ô Ö ÖÐÓ× Ò ÓÖÔÓÖ Ò Ó T º ר ÑÓ Ó¸ ÔÓ ÑÓ× Ú ×ÐÙÑ Ö Ö Ð × Ù ÒØ Ô ØÖÓÒ Ò Ö Ð ÙÒ Ð ÓÖ ØÑÓ Ð ÙÐÓ Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ Algoritmo 7.4 (Patr´n general de c´lculo de ´rbol abarcador m´ o a a ınimo) ÒØÖ ÙÒ Ö Ó ÓÒ Ô ×Ó× ÓÒ ÜÓ G =< V, E >º Ë Ð ÍÒ Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ T =< V, E > Gº
  • 723.
    7.8. Arboles abarcadoresm´ ınimos 697 ½º Ë T =< V , E >=< ∅, ∅ >º ¾º Ê Ô Ø Ñ ÒØÖ × T ÒÓ ÖÕÙ G ´µ (*)Ë Ð ÓÒ ÓÒ Ö Ø Ö Ó ÙÒ Ö Ó e ∈ E Ý Ö Ð E = E − {e} ´ ר × Ð Ô ×Ó ÕÙ Ú Ö × ÙÒ Ð Ð ÓÖ ØÑÓµº ´ µ E = E ∪ eº ´ µ Ë T × Ð Ó =⇒ º (**) × Ó Ö Ð Ö Ó ÕÙ × Ô ÖØ Ð ÐÓ ÕÙ Ø Ò Ñ ÝÓÖ Ô ×Óº º E = E − {e} ר רÖÙ ØÙÖ × Ð Ñ ×Ñ Ô Ö ÐÓ× Ó× Ð ÓÖ ØÑÓ× ÕÙ ×ØÙ Ö ÑÓ׸ Ñ ÒØ Ó× ÃÖÙ× Ð Ý ÈÖ Ñ¸ Ö ×Ô Ø Ú Ñ ÒØ º Ä Ö Ò ÒØÖ ÐÐÓ× Ö × ÔÖ ÑÓÖ ÐÑ ÒØ Ò Ð Ô ×Ó ¾ × Ö¸ Ò Ð Ñ Ò Ö Ò ÕÙ × × Ó Ò ÐÓ× Ö Ó× Ô Ö Ò× ÖØ ÖÐÓ× Ò T º ÍÒ ÖÒ × ÙÒ Ö × ÓÑÓ × Ø Ø × T Ý Ö Gº Ù Ò Ó Ð Ò ÐÙ× ÓÒ ÙÒ ÒÙ ÚÓ Ö Ó Ò Ð Ö ÓÐ T Ù× ÙÒ ÐÓ Ð Ñ Ò Ö× Ð Ö Ó Ô ÖØ Ð ÐÓ ÕÙ Ø Ò Ñ ÝÓÖ Ô ×Óº Ä ÔÖÓÔÓ× ÓÒ × Ù ÒØ ÒÓ× Ú Ò ÕÙ Ð Ö ÓÐ Ö ÓÖ Ö ×ÙÐØ ÒØ × Ñ Ò ÑÓº Proposici´n 7.2 (Propiedad del ciclo - Sedgewick-2001 [33]) o Ë G ÙÒ Ö Ó ÓÒ ÜÓ Ù ÐÕÙ Ö Ý T ×Ù Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓº Ë G ÙÒ Ö Ó ÓÒרÖÙ Ó ÔÓÖ Ò ÙÖ ÙÒ Ö Ó e Gº ÒØÓÒ ×¸ Ò Ö e T Ý Ð Ñ Ò Ö Ð Ö Ó Ñ ÝÓÖ Ô ×Ó Ò Ð ÐÓ Ö ×ÙÐØ Ò ÙÒ Ö ÓÐ Ö ÓÖ T ÕÙ × Ñ Ò ÑÓº Demostraci´n Ë e × Ð Ö Ó ÓÒ Ñ ÝÓÖ Ô ×Ó Ð o ÐÓ¸ ÒØÓÒ × ×Ø ÒÓ ÔÙ × Ö Ô ÖØ T ÔÓÖÕÙ × ÒÓ T ÒÓ × Ö Ñ Ò ÑÓ ´ Ü ×Ø Ö ÓØÖÓ Ö Ó Ñ ÒÓÖ Ô ×Óµº ÐÓ ÓÒØÖ Ö Ó¸ × emax Ð Ö Ó Ô ÖØ Ð ÐÓ ÓÒ Ñ ÝÓÖ Ô ×Óº Ð Ñ Ò Ö emax T ÐÓ ÓÖØ Ò Ó× Ö ÓÐ × × ÙÒØÓ× ÐÓ× Ù Ð ×¸ × ÙÒ Ð ÔÖÓÔÓ× ÓÒ º½ ר Ò ÓÒ Ø Ó× Ò T ÔÓÖ Ð Ñ Ò ÑÓ Ö Ó ÖÙ º T ׸ ÔÓÖ Ø ÒØÓ¸ Ñ Ò ÑÓ 7.8.1 Acceso a los pesos del grafo Ë ÔÖ Ø Ò ÑÓ× Ð ÓÖ Ö Ð ÓÖ ØÑÓ× Ò Ö Ð × Ô Ö Ð ÙÐ Ö Ö ÓÐ × Ö ÓÖ × Ñ Ò ÑÓ׸ × Ö¸ ÕÙ ÓÔ Ö Ò Ô Ö Ù ÐÕÙ Ö Ð × Ô ×Ó׸ ÒØÓÒ × ÑÓ× × Ô Ö Ö Ð Ð ÓÖ ØÑÓ ØÓ Ó ÐÓ ÕÙ Ø Ò ÐÓ× Ô ×Ó׺ Ò Ø Ð × ÒØ Ó¸ Ù× Ö ÑÓ× Ó× Ð × × ÕÙ × Ö Ò Ô Ö Ñ ØÖÓ× Ø ÔÓ× ÙÒ Ð ÓÖ ØÑÓ Ô Ö Ð ÙÐ Ö Ð Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ ½º Distance<GT> Ð × ×Ó Ð Ô ×Ó ÙÒ Ö Ó¸ Ð Ù Ð ÜÔÓÖØ Ö ÐÓ× × Ù ÒØ × ØÖ ÙØÓ× ´ µ Distance<GT>::Distance Type Ð Ø ÔÓ ØÓ ÕÙ Ö ÔÖ × ÒØ ÙÒ Ô ×Ó Ò ÙÒ Ö Óº ´ µ typename Distance<GT>::Distance Type operator () (typename GT::Arc *a) Ö ¹ ØÓÖÒ Ð Ú ÐÓÖ Ô ×Ó ÓÒØ Ò Ó Ò Ð Ö Ó aº ´ µ typename Distance<GT>::Max Distance ÓÒר ÒØ ר Ø ÓÖÖ ×ÔÓÒ ÒØ Ð Ú ÐÓÖ Ñ Ü ÑÓ ×Ø Ò ÕÙ ÙÒ Ð ÓÖ ØÑÓ ÓÒ× Ö Ö ÓÑÓ Ú ÐÓÖ Ò¬Ò ØÓº
  • 724.
    698 Cap´ ıtulo 7. Grafos ´µ ÓÒר ÒØ ר Ø ÓÖÖ ×ÔÓÒ ÒØ typename Distance<GT>::Zero Distance Ð Ð Ñ ÒØÓ Ò ÙØÖÓ Ð ×ÙÑ º ÌÖ ÓÒ ÐÑ ÒØ ¸ Ò Ð ÒÑ Ò× Ñ ÝÓÖ ×Ó׸ ר × Ö Ð ÖÓº ¾º Compare<GT> Ð × ÕÙ Ö Ð Þ Ð ÓÑÔ Ö ÓÒ ÒØÖ Ó× Ô ×Ó× Ý ÕÙ ÜÔÓÖØ Ö bool operator () (const typename Distance<GT>::Distance_Type & op1, const typename Distance<GT>::Distance_Type & op2) const; Ô Ö ÑÔÐ ÒØ Ö Ð Ö Ð ÓÒ Ñ ÒÓÖ ÕÙ º ¿º Plus Ð × ×ÙÑ ÒØÖ ×Ø Ò × ÑÔÐ ÒØ Ñ ÒØ Ð ÓÔ Ö ÓÖ typename Distance<GT>::Distance_Type Plus::operator () (const typename Distance<GT>::Distance_Type & op1, const typename Distance<GT>::Distance_Type & op2) const; Ä × Ð × × Distance Ý Compare × ÓÒ Ù Ò Ó ÙÒ Ð × ×Ô Ð ÓÑÔ Ö ÓÒ Ö Ó× ÙÝ ¬Ò ÓÒ × ÓÑÓ × Ù ÓÑÔ Ö ÓÖ Ö Ó× ≡ template <class GT, class Distance, class Compare> struct Distance_Compare { bool operator () (typename GT::Arc * a1, typename GT::Arc * a2) const { return Compare () ( Distance () (a1) , Distance () (a2) ); } }; ¬Ò × Distance Compare¸ Ù× Ò ÙÒ × ¸ ¼¿¸ Ò ¼º ÍÒ ÔÖ Ñ Ö ÓÖÑ ÓÒ Ù Ö ×Ø × Ð × × × ÑÔÐ ÒØ Ò Ó Ð Ð ÙÐÓ Ð Óר ÙÒ Ö Ó × Ö¸ Ð ×ÙÑ ÐÓ× Ô ×Ó× ØÓ Ó× ×Ù× Ö Ó׺ È Ö ÐÐÓ¸ Ö ÕÙ Ö ÑÓ× ÙÒ Ù ÖØ Ð × ÕÙ ÑÔÐ ÒØ Ð ×ÙÑ Ô ×Ó× ÓÑÔ Ö ÓÖ Ö Ó× +≡ template <class GT, class Distance, class Compare, class Plus, class SA> typename Distance::Distance_Type total_cost(GT & g) { typename Distance::Distance_Type sum = Distance::Zero_Distance; // recorrer todos los arcos y sumar su peso for (Arc_Iterator <GT, SA> it(g); it.has_current(); it.next()) sum = Plus () (sum, Distance () (it.get_current_arc())); return sum; } template <class GT, class Distance> typename Distance::Distance_Type total_cost(GT & g) { typedef Aleph::less<typename Distance::Distance_Type> Less; typedef Aleph::plus<typename Distance::Distance_Type> Plus; return total_cost <GT, Distance, Less, Plus, Default_Show_Arc<GT> > (g); } Í× × Arc Iterator º
  • 725.
    7.8. Arboles abarcadoresm´ ınimos 699 7.8.2 Algoritmo de Kruskal Ð Ð ÓÖ ØÑÓ ÃÖÙ× Ð × Ð ÓÒ ÐÓ× Ö Ó× Ò× ÖØ Ö Ò T × ÙÒ ×Ù Ô ×Ó¸ × Ð Ñ ÒÓÖ Ð Ñ ÝÓÖº È Ö ÐÐÓ¸ ÐÓ× Ö Ó× × ÓÖ Ò Ò ÔÖ Ú Ñ ÒØ ¸ Ñ Ò Ö Ø Ð ÕÙ ¸ Ø Ö Ò Ó ×Ó Ö ÐÐÓ× ´Ú Ö Ü º¿º½¼º½ ´Ô Ò ¼µµ¸ רÓ× Ô Ö Þ Ò ÓÖ Ò Ñ ÒØ º ר ÓÖ Ò Ñ ÒØÓ ÔÖ Ú Ó ÐÓ Ö Ð Þ ÑÓ× Ð × Ù ÒØ ÑÓ Ó ÓÖ Ò Ö Ö Ó× ≡ ´ ¼½µ g.template sort_arcs<Distance_Compare<GT, Distance, Compare> >(); Í× × Distance Compare º × Ö¸ × ÒÚÓ Ð Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓ Ö Ó× ÔÐ ÒØ Ó Ò Ü º¿º½¼º½¼ ´Ô Ò ¼½µº ÈÖÓ × Ö ÐÓ× Ö Ó× ÓÖ Ò Ñ ÒØ × Ð ×ØÖ Ø ÕÙ Ò Ð ×Ó Ð Ð ÓÖ ØÑÓ ÃÖÙ× Ð ÙÑÔÐ Ð ÖÓÐ Ð Ô ×Ó ¾ Ð Ð ÓÖ ØÑÓ Ò Ö Ó º º Ð ÔÖÓ ×Ó Ô Ö Ó Ø Ò Ö Ð Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ¸ ÐÙ Ó Ø Ò Ö ÐÓ× Ö Ó× ÓÖ Ò Ó× × Ð Ò ¸ Ö Ò × Ö × Ó׸ Ð × Ù ÒØ Ñ Ò Ö Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ × ÙÒ ÃÖÙ× Ð ≡ ´ ¼½µ // Recorrer arcos ordenados de g hasta que numero de arcos de tree sea // igual a numero de nodos de g for (Arc_Iterator<GT, SA> arc_itor(g); tree.get_num_arcs() < g.get_num_nodes() - 1; arc_itor.next()) { // obtenga siguiente menor arco typename GT::Arc * arc = arc_itor.get_current_arc(); Î Ö ¬ Ö × ÒÓ Ó ÓÖ Ò Ü ×Ø Ò ØÖ ¼¼ Î Ö ¬ Ö × ÒÓ Ó ×Ø ÒÓ Ü ×Ø Ò ØÖ ¼¼ typename GT::Arc * arc_in_tree = tree.insert_arc(tree_src_node, tree_tgt_node, arc->get_info()); if (Has_Cycle <GT, SA> () (tree)) // verifique si nuevo arco causa un ciclo { // hay ciclo ==> hay que remover el arco tree.remove_arc(arc_in_tree); // eliminar arco e ir a procesar continue; // siguiente arco } GT::map_arcs(arc, arc_in_tree); } Í× × Arc Iterator º Ð ÐÓ Ñ Ö ÐÓ× Ö Ó× Ð Ö Ó × Ð Ñ ÒÓÖ ×Ø Ð Ñ ÝÓÖº Ö Ó ÕÙ × Ñ Ö Ó × Ò× ÖØ Ò tree ݸ × ×Ø ÒÓ Ù× ÙÒ ÐÓ¸ ÒØÓÒ × ×Ø × Ô ÖØ Ð Ö ÓÐ Ö ÓÖº Ð ÔÖÓ ×Ó ÓÒØ ÒÙ ×Ø ÕÙ Ð ÒØ Ö Ó× Ð Ö ÓÐ × Ü Ø Ñ ÒØ Ð ÒØ ÒÓ Ó× Ð Ö Ó Ñ ÒÓ× ÙÒÓ¸ ÐÓ Ù Ð × Ð Ò ÓÒ ÕÙ Ð Ö ÓÐ Ý Ö ÓÑÔÐ Ø Ñ ÒØ ÐÓ× ÒÓ Ó× Ð Ö Ó × Ò Ô Ö Ö ×Ù ÓÒ ÓÒ Ö ÓÐ ¹ Ù ÐÕÙ Ö ÓØÖÓ Ö Ó ÕÙ × Ò× ÖØ Ò tree Ù× Ö ÙÒ ÐÓ¹º ÍÒ Ö Ò ÓÒ Ð Ð ÓÖ ØÑÓ ÃÖÙ× Ð¸ ÔÖ Ò× Ð Ñ ÒØ Ò×Ô ÓÒ ×Ù× ÐÓÕÙ × ÔÖ Ò Ô Ð ×¸ × ÕÙ ÔÙ ÑÓ ¬ Ö× ÓÒ Ö Ð Ø Ú Ð Ô Ö ÕÙ ÓÔ Ö ÓÒ ÙÖÖ ÒØ Ñ ÒØ º Ò ÔÖ Ñ Ö ÐÙ Ö¸ ÓÑÓ ×Ù ÒØ Ñ ÒØ ÜÔÐ ÑÓ× ÓÒ Ð ÕÙ ×ÓÖØ Ò Ü ¿º¾º¾º ´Ô Ò ½ µ¸ ÔÓ ÑÓ× Ð Ö ÖÐÓ ×Ù ×Ø Ò ÐÑ ÒØ × ÐÓ ÑÓ ¬ ÑÓ× Ô Ö Ù× Ö Ú Ö Ó× ÔÖÓ × ÓÖ × Ñ Ø Ö Ð ×º Å × Ð¸ Ô ÖÓ ÓÑÔÖÓ Ñ ÒØ ÔÓ× Ð ¸ × ÑÓ ¹ ¬ Ö Ð ÐÓÕÙ Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ × ÙÒ ÃÖÙ× Ð Ô Ö ÕÙ Ñ Ò ÐÓ× ÐÓÕÙ × ÒØ ÖÒÓ× Î Ö ¬ Ö × ÒÓ Ó ÓÖ Ò Ü ×Ø Ò ØÖ ¼¼ Ý Î Ö ¬ Ö × ÒÓ Ó ×Ø ÒÓ Ü ×Ø Ò ØÖ ¼¼ Ò ÔÖÓ × ÓÖ × Ö ÒØ ׺ ÈÓÖ Ö ÕÙ Ö Ñ ÒØÓ× ÒØ Ö Þ¸ Ô Ö Ò× ÖØ Ö ÙÒ Ö Ó Ò tree × Ò × Ö Ó ÕÙ ×Ù× ÒÓ Ó×
  • 726.
    700 Cap´ ıtulo 7. Grafos L 4 M 2 N 3 O 6 P L 4 M 2 N 3 O 6 P 10 12 10 8 3 1 3 1 1 7 10 12 10 8 3 1 3 1 1 7 F 5 G 15 H I J 4 K F 5 G 15 H I J 4 K 2 2 2 2 9 4 1 7 3 2 1 2 5 2 9 4 1 7 3 2 1 2 5 2 A 3 B 4 C 3 D 4 E A 3 B 4 C 3 D 4 E ´µ ´ µ L 4 M 2 N 3 O 6 P L 4 M 2 N 3 O 6 P 10 12 10 8 3 1 3 1 1 7 10 12 10 8 3 1 3 1 1 7 F 5 G 15 H I J 4 K F 5 G 15 H I J 4 K 2 2 2 2 9 4 1 7 3 2 1 2 5 2 9 4 1 7 3 2 1 2 5 2 A 3 B 4 C 3 D 4 E A 3 B 4 C 3 D 4 E ´µ ´ µ L 4 M 2 N 3 O 6 P L 4 M 2 N 3 O 6 P 10 12 10 8 3 1 3 1 1 7 10 12 10 8 3 1 3 1 1 7 F 5 G 15 H I J 4 K F 5 G 15 H I J 4 K 2 2 2 2 9 4 1 7 3 2 1 2 5 2 9 4 1 7 3 2 1 2 5 2 A 3 B 4 C 3 D 4 E A 3 B 4 C 3 D 4 E ´µ ´µ ÙÖ º ¿ ÈÖÓ Ö ×Ó Ð Ð ÓÖ ØÑÓ ÃÖÙ× Ð ´ ¬ ÙÖ ÓÖÖ ×ÔÓÒ ØÖ × Ø Ö ÓÒ ×µ Ý Ý Ò × Ó ÔÖ Ú Ñ ÒØ Ò× ÖØ Ó׺ ר × Ð ÖÓÐ × Ó ÐÓ× ÐÓÕÙ × Î Ö ¬ Ö × ÒÓ Ó ÓÖ Ò Ü ×Ø Ò ØÖ ¼¼ Ý Î Ö ¬ Ö × ÒÓ Ó ×Ø ÒÓ Ü ×Ø Ò ØÖ ¼¼ ¸ Ð Ù Ð ÓÑ ÒØ Ö ÑÓ× Ð ÔÖ Ñ ÖÓ ¼¼ Î Ö ¬ Ö × ÒÓ Ó ÓÖ Ò Ü ×Ø Ò ØÖ ¼¼ ≡ ´ µ typename GT::Node * g_src_node = g.get_src_node(arc); // nodo origen en g typename GT::Node * tree_src_node; // nodo origen en tree if (not IS_NODE_VISITED(g_src_node, Aleph::Kruskal)) // ¿est´ en tree? a { // No, crearlo en tree, atarlo al cookie y marcar como visitado NODE_BITS(g_src_node).set_bit(Aleph::Kruskal, true); tree_src_node = tree.insert_node(g_src_node->get_info()); GT::map_nodes(g_src_node, tree_src_node); } else tree_src_node = static_cast<typename GT::Node*>(NODE_COOKIE(g_src_node)); ÓÑÓ × Ú ¸ Ð ÐÓÕÙ Ø Ò Ó× ­Ù Ó× Ó Ð ÒÓ Ó Ý ×Ø Ò× ÖØ Ó Ý Ñ Ô Ó Ò tree ´­Ù Ó Ð elseµ¸ Ó Ý ÕÙ Ö ÖÐÓ¸ Ñ Ö ÖÐÓ Ý Ñ Ô ÖÐÓº Ð ÓØÖÓ ÐÓÕÙ × × Ñ Ð Ö Ô ÖÓ ÓÒ Ð ÓØÖÓ ÜØÖ ÑÓ Ð Ö Ó ¼¼ Î Ö ¬ Ö × ÒÓ Ó ×Ø ÒÓ Ü ×Ø Ò ØÖ ¼¼ ≡ ´ µ typename GT::Node * g_tgt_node = g.get_tgt_node(arc); typename GT::Node * tree_tgt_node; // Nodo destino en arbol abarcador ´ if (not IS_NODE_VISITED(g_tgt_node, Aleph::Kruskal)) { // No, crearlo en tree, atarlo al cookie y marcar como visitado NODE_BITS(g_tgt_node).set_bit(Aleph::Kruskal, true);
  • 727.
    7.8. Arboles abarcadoresm´ ınimos 701 tree_tgt_node = tree.insert_node(g_tgt_node->get_info()); GT::map_nodes(g_tgt_node, tree_tgt_node); } else tree_tgt_node = static_cast<typename GT::Node*>(NODE_COOKIE(g_tgt_node)); ÓÒ ØÓ × Ð × ×ØÖÙ ØÙÖ × ÒØ Ö ÓÖ ×¸ ÔÓ ÑÓ× ×Ô ¬ Ö Ð ÖÙØ Ò ÒØ Ö Þ ¼½ Ð ÓÖ ØÑÓ ÃÖÙ× Ð ¼½ ≡ template <class GT, class Distance, class Compare, class SA> inline void kruskal_min_spanning_tree(GT & g, GT & tree) { g.reset_bit_nodes(Aleph::Kruskal); // limpiar bits de marcado clear_graph(tree); // limpia grafo destino ÓÖ Ò Ö Ö Ó× Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ × ÙÒ ÃÖÙ× Ð } Ð ¬Ò Ð Ð ÐÐ Ñ ¸ tree ÓÒØ Ò ÙÒ Ö ÓÐ Ö ÓÖ ÙÝÓ× cookies¸ Ø ÒØÓ ÒÓ Ó× ÓÑÓ Ö Ó׸ ר Ò Ñ Ô Ó× Ð Ö Ó g Ý Ú Ú Ö× º Ä × ×Ø Ò × ÐÓ× Ö Ó× ×ÓÒ Ø ÔÓ Distance::Distance Type Ý × ÔÓÖ ×Ø Ð × º Ä × ÓÑÔ Ö ÓÒ × ÒØÖ ×Ø Ò Ð × Ö Ð Þ Ð Ð × Compareº Ä ÑÔÐ ÒØ ÓÒ ÓÑÔÐ Ø Ö × Ò Ð Ö ÚÓ Kruskal.Hº 7.8.2.1 An´lisis del algoritmo de Kruskal a Ð Ø ÑÔÓ Ù ÓÒ ×Ø Ö Ó ÔÓÖ Ð ×ÙÑ ÐÓ× ÐÓÕÙ × ÓÖ Ò Ö Ö Ó× Ñ× Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ × ÙÒ ÃÖÙ× Ð º Ë ÑÓ׸ ÔÓÖ Ò Ð × × ÔÖ Ú Ó׸ ÕÙ Ð Ñ ÓÖ Ñ Ò Ö ÓÖ Ò Ö ÙÒ Ð ×Ø × O(n Ð (n))¸ ÔÓÖ ÐÓ ÕÙ Ð ÐÓÕÙ ÓÖ Ò Ö Ö Ó× Ü O(E Ð E)¸ ×Ô Ö Ó Ó Ø ÖÑ Ò ×Ø × ÙÒ Ð Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓº È Ö Ð ÐÓÕÙ Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ × ÙÒ ÃÖÙ× Ð ×ÙÑ ÑÓ׸ ÓÑÓ Ô ÓÖ ×Ó¸ ÕÙ Ð ÓÒ¬ ÙÖ ÓÒ Ö Ó× × Ø Ð ÕÙ ×ØÓ× Ò Ö Ú × Ö× Óѹ ÔÐ Ø Ñ ÒØ º Ð while Ö ÕÙ Ö Ö ¸ Ô٠׸ O(E) Ø Ö ÓÒ ×º ÒØÖÓ Ð while × Ù¹ Ø Ò ÓÒר ÒØ Ñ ÒØ Ó× ÓÔ Ö ÓÒ × Ð Ò× Ö ÓÒ Ð Ö Ó Ò tree Ý Ð ÔÖÙ ¹ Ð has cycle()º Ä Ò× Ö ÓÒ ÙÒ Ö Ó × O(1)¸ Ñ ÒØÖ × ÕÙ Ð ÒÚÓ ÓÒ has cycle() ´Ú Ö Ü º º ´Ô Ò ½ µµ × O(V)¸ Ô٠׸ ÔÓÖ ×Ù ÓÒ ÓÒ Ö ÓÐ Ó Ö Ó¸ Ô Ö ÐÑ ÒØ Ò ÓÒ ÜÓ¸ Ò tree E ≤ V º Ð ÐÓÕÙ Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ × ÙÒ ÃÖÙ× Ð ÓÒÐÐ Ú ¸ ÒØÓÒ ×¸ O(E) × O(V) = O(E V) Ò Ð Ô ÓÖ ÐÓ× ×Ó׺ Ð Ð ÓÖ ØÑÓ ÃÖÙ× Ð ÓÒ×ÙÑ ¸ Ô Ö Ð Ô ÓÖ ×Ó¸ O(E Ð E) + O(E V) = O(max(E Ð E, E V)¸ ÐÓ Ù Ð ÐÓ ØÖ Ø ÚÓ Ô Ö Ö Ó× ×Ô Ö Ó׺ 7.8.2.2 Correctitud del algoritmo de Kruskal È Ö Ú Ò Ö Ð ÓÖÖ Ø ØÙ ¸ × Ö¸ × Ð Ð ÓÖ ØÑÓ Ò ØÓ Ò Ù ÒØÖ ÙÒ Ö ÓÐ Ö¹ ÓÖ Ñ Ò ÑÓ¸ ÒÓ× Ú Ð Ö ÑÓ× Ð × Ù ÒØ ÔÖÓÔÓ× ÓÒ Proposici´n 7.3 o Ë G ÙÒ Ö Ó ÓÒ ÜÓ Ù ÐÕÙ Ö º ÒØÓÒ × Ð Ð ÓÖ ØÑÓ ÃÖÙ× Ð Ò Ù ÒØÖ ÙÒ Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓº
  • 728.
    702 Cap´ ıtulo 7. Grafos Demostraci´n (por inducci´n sobre V) o o ½º V≤2 Ð ÔÖÙ × ÒÑ Ø º ¾º V > 2 ×ÙÑ ÑÓ× ÕÙ Ð ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö ØÓ Ó n Ý Ú Ö ¬ Ö ÑÓ× ×Ù Ú Ð Þ Ô Ö n + 1º ÈÓÖ Ð ÔÓØ × × Ò Ù Ø Ú ¸ Ð Ð ÓÖ ØÑÓ Ñ ÒØ Ò ÙÒ Ö ÓÖ × Ò Ö ÓÐ × Ö¹ ÓÖ × Ñ Ò ÑÓ׺ Ù Ò Ó × ØÓÑ ÙÒ Ö Ó a n + 1 ÔÙ Ò Ó ÙÖÖ Ö Ó× × ØÙ ÓÒ × ´ µ ÉÙ × Ö ÙÒ ÐÓ¸ Ò ÙÝÓ ×Ó¸ ÔÙ ×ØÓ ÕÙ ÐÓ× Ö Ó× Ù ÖÓÒ Ú ×ØÓ× ÓÖ Ò ¹ Ñ ÒØ ¸ a × Ð Ö Ó ÓÒ Ñ ÝÓÖ Ô ×Ó ÒØÖÓ Ð ÐÓ Ù× Óº ר ÑÓ Ó¸ Ð Ð Ñ Ò ÖÐÓ Ð Ö Óи × ÙÒ Ð ÔÖÓÔ Ð ÐÓ ´ÔÖÓÔº Ü º¾µ¸ Ð Ö ÓÖ × Ò × ÔÖ × ÖÚ Ý ×Ø × Ö ÓÐ × Ö ÓÖ × Ñ Ò ÑÓ׺ ´ µ ÆÓ × Ö ÙÒ ÐÓ¸ Ò ÙÝÓ ×Ó Ð ÓÒ a ÙÒ Ó× ÓÑÔÓÒ ÒØ × Ò¹ ÓÒ ÜÓ׺ ÓÖ Ò¸ ÔÙ ×ØÓ ÕÙ a × Ú ×ØÓ ÓÖ Ò Ñ ÒØ ¸ a × Ð Ñ Ò ÑÓ Ö Ó ÖÙ ÒØÖ ×ØÓ× Ó× ÓÑÔÓÒ ÒØ × Ý¸ ÔÓÖ Ð ÔÖÓÔ ÓÖØ ´ÔÖÓÔº Ü º½µ¸ Ð ÓÑÔÓÒ ÒØ Ö ×ÙÐØ ÒØ × ÙÒ Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ Ä ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö ØÓ Ó Ö Ó 7.8.3 Algoritmo de Prim Ð × ÙÒ Ó Ð ÓÖ ØÑÓ Ô Ö ÓÒרÖÙ Ö ÙÒ Ö ÓÐ Ö ÓÖ × × Ò ÙÒ ÑÓ ¬ ÓÒ Ð Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ Ò Ð Ù Ð¸ Ò ÐÙ Ö ÑÔÐ Ö ÙÒ ÓÐ Á Ǹ × Ù× ÙÒ ÓÐ ÔÖ ÓÖ ÕÙ ÔÓÒ Ö ÐÓ× Ô ×Ó× ÐÓ× Ö Ó׺ 7.8.3.1 Interfaz del algoritmo de Prim Ð Ð ÓÖ ØÑÓ ÈÖ Ñ × ÒÚÓ Ñ ÒØ Ð × × Ù ÒØ ÒØ Ö Þ ¼¾ Ð ÓÖ ØÑÓ ÈÖ Ñ ¼¾ ≡ template <class GT, class Distance, class Compare, class SA> inline void prim_min_spanning_tree(GT & g, GT & tree) { ÁÒ ÐÞ Ö ÈÖ Ñ ¼ ÐÖ ÓÒ ÓÐ ÔÖ ÓÖ ¼ ÁÒ Ð Þ Ö Ô ¼ Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ × ÙÒ ÈÖ Ñ ¼ } ÙÒ ÓÒ ÐÑ ÒØ ¸ ר ÒØ Ö Þ × Ü Ø Ð Ð Ð ÓÖ ØÑÓ ÃÖÙ× Ðº 7.8.3.2 Heap exclusivo de arcos m´ ınimos Ð Ð ÓÖ ØÑÓ ÈÖ Ñ × ×ØÖÙ ØÙÖ ÐÑ ÒØ × Ñ Ð Ö Ð Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ º Ä ÖÒ ×ØÖ Ò ÕÙ Ð ÐÙ Ö ÑÔÐ Ö ÙÒ ÓÐ Á Ç × ÑÔÐ ÙÒ ÔÖ ÓÖ ¸ Ð Ù Ð ×Ù Ú Þ ×Ù Ý ×Ó Ö ÙÒ Ôº Ò Ð Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ ´Ü º º ´Ô Ò ½ µµ¸ Ð Óר Ò ×Ô Ó Ó Ð ÓÐ ÔÙ Ð ÒÞ Ö O(E)º Ò Ð ÔÖ Ø ¸ ר × Ð Ñ ×ÑÓ ÓÒ×ÙÑÓ ÕÙ ÖÖ ÙÒ Ôº Ë Ð Ö Ó × Ò×Ó¸ Ð Óר Ø Ò O(V 2)º
  • 729.
    7.8. Arboles abarcadoresm´ ınimos 703 Ü ×Ø ÙÒ Ø Ò ¸ ÔÖ × ÒØ ÔÓÖ Ë Û ¿¿ ¸ ÕÙ Ö Ù ×Ù ×Ø Ò ÐÑ ÒØ Ð Ø Ñ ÒÓ Ð Ô ÒÓ Ñ × V ÒØÖ × ÐÓ ÕÙ ÑÔÐ ÕÙ Ð Óר Ò Ø ÑÔÓ × Ö Ù O(Ð V) Ý Ð ×Ô Ó O(V)º Ä Ò Ö ÒØ ר Ø Ò ×Ù Ý Ò Ð × Ù ÒØ ¬Ò ÓÒº Definici´n 7.8 (Heap exclusivo de arcos m´ o ınimos) ÍÒ Ô Ü ÐÙ× ÚÓ Ö Ó× Ñ Ò ÑÓ× × ÙÒ Ô ÕÙ Ù Ö Ö Ó× ÙÒ Ö Ó ÓÖ Ò Ó× ÔÓÖ ×Ù Ô ×Ó Ñ Ò Ö Ø Ð ÕÙ ¸ Ò Ò Ò ÙÒ ÑÓÑ ÒØÓ¸ ÔÙ Ò Ü ×Ø Ö Ó× Ö Ó× ÓÒ Ð Ñ ×ÑÓ ÒÓ Ó ×Ø ÒÓº È Ö ÙÒ Ö Ó G =< V, E >¸ × ÑÔÓ× Ð ÕÙ Ð Ô ÓÒØ Ò Ñ × V − 1 Ö Ó׸ ÔÙ × × ÒÓ Ö Ò Ó× Ö Ó× ÓÒ Ð Ñ ×ÑÓ ÒÓ Ó ×Ø ÒÓº ÈÓÖ ×Ù Ö Ø Ö Ô¸ × Ö ÒØ Þ ÕÙ Ð ÜØÖ ÓÒ ÙÒ Ö Ó × ÓÖÖ ×ÔÓÒ Ö ÓÒ Ð Ô ×Ó Ñ Ò ÑÓ ÒØÖ ØÓ Ó× ÐÓ× Ò ÐÙ Ó× Ò Ð ÓÒ ÙÒØÓº ÍÒ Ô Ø Ð ÓÑÓ Ð ÕÙ ÑÓ× ¬Ò Ö × ÑÔÐ ÒØ Ð Ñ ÒØ Ð Ì BinHeap<Key> ×ØÙ Ó Ò Ü º ´Ô Ò ¿¼½µº ר Ð × Ô¸ ÕÙ ÐÐ Ñ Ö ÑÓ× ArcHeap<GT, Distance, Compare, Access Arc>¸ × ¬Ò Ò Ð Ö ÚÓ Ö ÔºÀ ¼¿ ¼¿ Ö ÔºÀ ¼¿ ≡ template <class GT, class Distance, class Compare, class Access_Heap_Node> struct ArcHeap : public BinHeap<typename GT::Arc*, Distance_Compare<GT, Distance, Compare> > { ØÖ ÙØÓ× ÔÙ Ð Ó× Ö À Ô ¼¿ }; ¬Ò × ArcHeap¸ Ù× Ò ÙÒ × ¼ ¸ ¼ ¸ ½¾ ¸ Ò ½ º Í× × Distance Compare º Ð Ö ÚÓ ¬Ò Ð Ð × ArcHeap<GT, Distance, Compare, Access Arc>¸ Р٠Рѹ ÔÐ Ñ ÒØ ÙÒ Ô Ü ÐÙ× ÚÓ Ö Ó× Ñ Ò ÑÓ׸ Ô ÖØ Ò ÒØ × ÙÒ Ö Ó Ø ÔÓ GT¸ ÓÒ ×Ó ÐÓ× Ô ×Ó× ÐÓ× Ö Ó× Ñ ÒØ Ð Ð × Distance Ý ÓÑÔ Ö ÓÒ ÒØÖ Ð × ×Ø Ò¹ × ØÖ Ú × Ð Ð × Compareº Ð × ÒØ Ó Ð Ô Ö Ñ ØÖÓ Ø ÔÓ Access Arc × Ö ÜÔÐ Ó ÔÖÓÒØ Ñ ÒØ º ÓÑÓ × ÔÙ Ó × ÖÚ Ö Ð Ð Ö ÓÒ¸ ר Ö Ð ÑÔÐ Ñ ÒØ ÓÒ BinHeap<Key>¸ ÔÙ × Ð ÓÖ Ò × Ð × ÙÒÓ ÐÓ× Ö ÕÙ Ö Ñ ÒØÓ× ÔÖ Ò Ô Ð × Ù Ò Ó × ÜØÖ Ð ÙÒ Ö Óº ר ÑÓ Ó¸ Ð BinHeap<Key> Ñ Ò Ö ÒÓ Ó× Ð × Ù ÒØ Ø ÔÓ ¼¿ ØÖ ÙØÓ× ÔÙ Ð Ó× Ö À Ô ¼¿ ≡ ´ ¼¿ µ ¼ typedef typename BinHeap<typename GT::Arc*, Distance_Compare<GT, Distance, Compare> >::Node Node; Í× × Distance Compare º Ò ×Ø Ô Ð ÓÔ Ö ÓÒ Ò× Ö ÓÒ ÙÒ Ö Ó × Ö ×ÙÑ Ó Ð × Ù ÒØ Ð ÓÖ ØÑÓ Algoritmo 7.5 ´ÁÒ× Ö ÓÒ Ò Ö Ò ÙÒ Ô Ü ÐÙ× ÚÓµ Ä ÒØÖ × ÙÒ Ö Ó a ÕÙ Ö Ð ÓÒ Ó× ÒÓ Ó× s Ý t¸ ÓÖ Ò Ý ×Ø ÒÓ¸ Ö ×Ô Ø Ú Ñ ÒØ º s × ÙÒ ÒÓ Ó ÕÙ Ý Ô ÖØ Ò ÙÒ Ö ÓÐ Ö ÓÖ Ý × Ó¸ ÔÓÖ Ø ÒØÓ¸ Ú × Ø Óº t ÒÓ × Ó Ú × Ø Ó Ý ÒÓ Ô ÖØ Ò Ð Ö ÓÐ Ö ÓÖº ½º Ù×ÕÙ Ò Ð Ô ÙÒ Ö Ó a Ø Ð ÕÙ ×Ù ÒÓ Ó ×Ø ÒÓ × tº ¾º Ë a × Ó Ò ÓÒØÖ Ó =⇒
  • 730.
    704 Cap´ ıtulo 7. Grafos ´µË a < a =⇒ ´× ÙÒ ÐÓ ÕÙ ÖÖÓ Ð Ð × ×Ø Ò µ º ×Û Ô(a, a ) ´ ÒØ Ö Ñ a ÓÒ a µ ´ µ ÐÑÒ a Ð Ô ¿º ÁÒ× ÖØ a Ò Ð Ô × Ò × Ö Ó Ò ÓÒØÖ Ö ÙÒ Ñ Ò Ö Ö Ô Ö ÙÔ Ö Ö a ÕÙ ÒÓ ÓÑÔÖÓÑ Ø Ð ¹ × ÑÔ ÒÓ Ð Ôº ÈÓ ÑÓ× Ù× Ö ÙÒ Ø Ð ÒÓ Ó× ×Ø ÒÓ× Ö Ó× ÓÒØ Ò Ó× Ò Ð Ô¸ Ð Ù Ð ÔÙ Ö ÒרÖÙÑ ÒØ Ö× Ñ ÒØ ÙÒ Ø Ð × Ó ÙÒ Ö ÓÐ Ö ÓÖ¸ Ô ÖÓ ×ØÓ ÖÖ Ò ÖØ ÙÑ Ö ¸ × Ù× ÑÓ× ÙÒ Ø Ð × ¸ Ó Óר × O(Ð (n)) × Ù× ÑÓ× Ö ÓÐ × Ò Ö Ó׺ Ò Ú ÖØÙ ÐÓ ÒØ Ö ÓÖ¸ ÙÒÕÙ Ò ØÖ Ñ ÒØÓ Ð Ð Ö ¸ ÒÓØ Ö ÑÓ× Ò ÒÓ Ó Ð Ö Ó¸ ØÖ Ú × Ð ÓÓ ¸ ÙÒ ÔÙÒØ ÖÓ Ð ÒÓ Ó Ð Ô ÒØÖÓ Ð ArcHeapº È Ö Ö Ð ÓÓ ¸ ÒÓ× Ú Ð ÑÓ× ÙÒ Ð × ×Ó¸ ÒÓÑ Ò Access Heap Node¸ ÙÝÓ ÓÔ Ö ÓÖ () ÓÖÖ ×ÔÓÒ Ö× ÓÒ Ð × Ù ÒØ ÔÖÓØÓØ ÔÓ template <class GT, class Distance, class Compare> typename BinHeap<typename GT::Arc*, Distance_Compare<GT, Distance, Compare> >::Node *& Access_Heap_Node::operator () (typename GT::Node * p); Ð ÓÔ Ö ÓÖ Ö ØÓÖÒ ÙÒ ÔÙÒØ ÖÓ Ð ÒÓ Ó Ð Ô ÕÙ ÓÒØ Ò ÙÒ Ö Ó Ò ÐÙ¹ Ó Ò Ð ArcHeap ÙÝÓ ÒÓ Ó ×Ø ÒÓ × p¸ Ó NULL¸ × Ð Ô ÒÓ ÓÒØ Ò Ò Ò ÙÒ Ö Ó ÓÒ p ÓÑÓ ÒÓ Ó ×Ø ÒÓº × Ö ×ÔÓÒ× Ð Ð Ù×Ù Ö Ó ArcHeap Ð ÕÙ Access Heap Node::operator () Ö ØÓÖÒ NULL Ð ÔÖ Ñ Ö Ú Þ Ò ÕÙ × Ò× ÖØ ÙÒ Ö Ó ÓÒ ÙÒ ÒÓ Ó ×Ø ÒÓº × ÑÙÝ ÑÔÓÖØ ÒØ ÕÙ × Ö ØÓÖÒ ÙÒ Ö Ö Ò ÙÒ ÔÙÒØ ÖÓ Ý ÒÓ ÙÒ ÓÔ ÑÓ Ó Ø Ð ÕÙ × ÔÙ Ñ Ö Ð Ú ÐÓÖ Ð ÔÙÒØ ÓÖº ÓÖ ÔÓ ÑÓ× ÑÔÐ ÒØ Ö Ð Ò× Ö ÓÒ × ÙÒ Ð Ð ÓÖ ØÑÓ º ¼ ØÖ ÙØÓ× ÔÙ Ð Ó× Ö À Ô ¼¿ +≡ ´ ¼¿ µ ¼¿ ¼ void put_arc(typename GT::Arc * arc, typename GT::Node * tgt) { Node *& heap_node = Access_Heap_Node () (tgt); if (heap_node == NULL) // ¿existe arco insertado en el heap? { // No ==> crear nuevo nodo para el heap y asignarle arco heap_node = new Node; heap_node->get_key() = arc; this->insert(heap_node); return; } // dos arcos con mismo nodo destino ==> seleccionar menor y descartar mayor typename GT::Arc *& arc_in_heap = heap_node->get_key(); // ¿arc_in_heap tiene distancia menor que arc? if (Distance_Compare <GT, Distance, Compare> () (arc_in_heap, arc)) return; // S´ ==> el antiguo arco permanece en el heap y nuevo se ignora ı // arc_in_heap ser´ el arco reci´n insertado arc a e arc_in_heap = arc; // cambia el arco update(heap_node); // actualiza el heap con el nuevo peso de arc } ¬Ò × put arc¸ Ù× Ò ÙÒ × ¼ ¸ ¼¸ ½ ¸ Ò ½ º Í× × Distance Compare º
  • 731.
    7.8. Arboles abarcadoresm´ ınimos 705 È Ö ÙÒ Ö Ó G =< V, E >¸ Ð Óר ÙÒ Ò× Ö ÓÒ Ö Ó× × O(Ð V)¸ ÔÙ × Ð ×Ù ×Ø ØÙ ÓÒ ÙÒ Ö Ó ÓØ Ð Ô ÙÒ Ñ Ü ÑÓ V − 1 Ð Ñ ÒØÓ׺ Ä Ð Ñ Ò ÓÒ × Ø Ò ÓÑÔÐ ÓÑÓ Ð Ò× Ö ÓÒ¸ Ô٠׸ Ô ÖØ Ð Ñ Ò Ó Ñ ÑÓÖ ¸ Ý ÕÙ × ÙÖ Ö ÕÙ Ð Ö Ó Ð Ñ Ò Ó ÒÓ × Ö Ð ÓÒ ÓÒ ×Ù ÒÓ Ó ×Ø ÒÓ ¼ ØÖ ÙØÓ× ÔÙ Ð Ó× Ö À Ô ¼¿ +≡ ´ ¼¿ µ ¼ typename GT::Arc * get_min_arc() { Node * heap_node = this->getMin(); typename GT::Arc * arc = heap_node->get_key(); // seleccionar nodo que retorne la clase de acceso typename GT::Node * p = static_cast<typename GT::Node*>(arc->src_node); if (Access_Heap_Node () (p) != heap_node) p = static_cast<typename GT::Node*>(arc->tgt_node); Access_Heap_Node () (p) = NULL; delete heap_node; return arc; } ¬Ò × get min arc¸ Ù× Ò ÙÒ × ¼ Ò ½ º ÈÙ ×ØÓ ÕÙ Ð Ô Ý ×Ø ÓØ Ó ÙÒ Ñ Ü ÑÓ V −1 Ö Ó׸ Ð Ð Ñ Ò ÓÒ × O(Ð V)º 7.8.3.3 Inicializaci´n del algoritmo de Prim o ÄÓ ÔÖ Ñ ÖÓ ÕÙ ÑÓ× Ö × ¬Ò Ö Ð ×ØÖÙ ØÙÖ ÕÙ ÓÒØ Ò Ö Ð ÓÓ ÙÒ ÒÓ Ó¸ ÑÓ Ó Ø Ð ÕÙ ÔÓ ÑÓ× Ù× Ö Ð Ô Ü ÐÙ× ÚÓ × Ò Ó Ò Ð ×Ù ¹× ÓÒ ÔÖ ÒØ ¼ ¬Ò ÓÒ × ÈÖ Ñ ¼ ≡ ¼ template <class GT> struct Prim_Info { typename GT::Node * tree_node; // imagen del nodo en el arbol abarcador ´ void * heap_node; // puntero dentro del heap exclusivo }; ¬Ò × Prim Info¸ Ù× Ò ÙÒ ¼ º Ð ÑÔÓ tree node Ù Ö Ð Ñ Ò Ð ÒÓ Ó ÒØÖÓ Ð Ö ÓÐ Ö ÓÖ¸ Ñ ÒØÖ × ÕÙ heap node Ð Ö ÓÒ ÒØÖÓ Ð Ô Ü ÐÙ× ÚÓ ÕÙ Ù Ö Ð Ñ Ò ÑÓ Ö Ó Ð ÒÓ Ó Ò Ù ×Ø ÓÒ ÓÑÓ ×Ø ÒÓº heap node × Ð Ö ÓÑÓ void* Ó ÕÙ Ø Ò ÑÓ× Ö ÒØ × ÖÙ × Ø ÔÓ× ÒÚÓÐÙ Ö Ó׺ Ð ÓÒרÖÙ ØÓÖ × ÙÖ ÕÙ ÙØÓÑ Ø Ñ ÒØ ÐÓ× ÑÔÓ× × Ò Ò Ò NULL Ù Ò Ó × Ô ÖØ Ð Ñ ÑÓÖ º Ó ÙÒ ÔÙÒØ ÖÓ ÒÓ Ó p¸ Ð ×Ó ×ØÓ× ÑÔÓ× × Ð Ø Ñ ÒØ ÐÓ× × Ù ÒØ × Ñ ÖÓ× PRIMINFO()¸ TREENODE() Ý HEAPNODE()º ÓÖ ¸ × ÙÒ ÐÓ× Ö ÕÙ Ö Ñ ÒØÓ× Ð Ø ÔÓ ArcHeap<GT, Distance, Compare, Access Arc>¸ ÑÓ× ×Ô ¬ Ö Ð ×Ó Ð ÑÔÓ heap node ¼ ¬Ò ÓÒ × ÈÖ Ñ ¼ +≡ ¼ ¼ template <class GT, class Distance, class Compare> struct Prim_Heap_Info { typedef typename ArcHeap<GT, Distance, Compare, Prim_Heap_Info>::Node Node; Node *& operator () (typename GT::Node * p) { return (Node*&) HEAPNODE(p); } };
  • 732.
    706 Cap´ ıtulo 7. Grafos ¬Ò × Prim Heap Info¸ Ù× Ò ÙÒ ¼ º Í× × ArcHeap ¼¿ º Ä Ò Ð Þ ÓÒ Ð ÓÓ Ð ÒÓ Ó × Ö Ð Þ Ñ ÒØ ¼ ¬Ò ÓÒ × ÈÖ Ñ ¼ +≡ ¼ template <class GT> struct Init_Prim_Info { void operator () (GT & g, typename GT::Node * p) { g.reset_bit(p, Aleph::Prim); NODE_COOKIE(p) = new Prim_Info<GT>; } }; ¬Ò × Init Prim Info¸ Ù× Ò ÙÒ ¼ º Í× × Prim Info ¼ º ¼ ÁÒ Ð Þ Ö ÈÖ Ñ ¼ ≡ ´ ¼¾µ Operate_On_Nodes <GT, Init_Prim_Info <GT> > () (g); Í× × Init Prim Info ¼ º ×ÔÙ × ÕÙ Ð Ð ÓÖ ØÑÓ ÈÖ Ñ Ð ÙÐ Ð Ö ÓÐ Ö ÓÖ¸ × Ð Ö Ð Ñ ÑÓÖ Ó Ù¹ Ô ÔÓÖ ÐÓ× ÓÓ ×º È ÖÓ ÒØ × Ñ Ô Ò ÐÓ× ÒÓ Ó× Ñ ÒØ Ð × Ñ Ò × Ò Ð Ö ÓÐ Ö¹ ÓÖ ÕÙ ×Ø Ò ÓÒØ Ò × Ò Ð ÑÔÓ tree nodeº ÄÓ ÕÙ Ö ×Ø Ð Ò Ð Þ ÓÒ Ð Ð ÓÖ ØÑÓ ÈÖ Ñ ÓÒ ÖÒ Ð Ô Ü ÐÙ× ÚÓº Ò ÔÖ Ñ Ö ÐÙ Ö ×Ù Ð Ö ÓÒ ¼ Ð Ö ÓÒ ÓÐ ÔÖ ÓÖ ¼ ≡ ´ ¼¾µ typedef Prim_Heap_Info<GT, Distance, Compare> Acc_Heap; ArcHeap<GT, Distance, Compare, Acc_Heap> heap; Í× × ArcHeap ¼¿ Ò Prim Heap Info ¼ º Ò ØÓ Ó ÑÓÑ ÒØÓ¸ Ð ÓÔ Ö ÓÒ heap.get min arc() ÒÓ× ÖÖÓ Ð Ö Ó ÓÒ Ð Ñ ÒÓÖ Ô ×Ó ÒØÖ ØÓ Ó× ÐÓ× Ò ÐÙ Ó× ÒØÖÓ Ð Ôº ר ׸ ר ÐÓ× ÑÓÑ ÒØÓ׸ Ð ÙÒ Ö Ò ÓÒ Ð ÓÐ ØÖ ÓÒ Ð ÑÔÐ Ò Ð Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ ×ØÙ Ó Ò Ü º º½¼ ´Ô Ò ¿¼µº Ò × ÙÒ Ó ÐÙ Ö¸ Ð Ò× Ö ÓÒ ÐÓ× Ö Ó× Ý ÒØ × Ð ÒÓ Ó Ò Ó ¼ ÁÒ Ð Þ Ö Ô ¼ ≡ ´ ¼¾µ typename GT::Node * first = g.get_first_node(); NODE_BITS(first).set_bit(Aleph::Prim, true); // marcarlo visitado TREENODE(first) = tree.insert_node(first->get_info()); // imagen first en tree // meter en heap arcos iniciales del primer nodo for (Node_Arc_Iterator<GT,SA> it(first); it.has_current(); it.next()) { typename GT::Arc * arc = it.get_current_arc(); ARC_BITS(arc).set_bit(Aleph::Prim, true); heap.put_arc(arc, it.get_tgt_node()); } Í× × Node Arc Iterator Ò put arc ¼º
  • 733.
    7.8. Arboles abarcadoresm´ ınimos 707 7.8.3.4 El algoritmo de Prim ÓÖ ×Ø ÑÓ× Ð ×ØÓ× Ô Ö ÓÒרÖÙ Ö Ø Ö Ø Ú Ñ ÒØ Ð Ö ÓÐ Ö ÓÖ Ò Ð ÓÖ Ò ×Ø Ð ¹ Ó ÔÓÖ Ð ÓÐ ¸ ÐÓ Ù Ð × Ö Ð Þ Ð × Ù ÒØ Ñ Ò Ö ¼ Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ × ÙÒ ÈÖ Ñ ¼ ≡ ´ ¼¾µ while (tree.get_num_nodes() < g.get_num_nodes()) // mientras tree no abarque a g { // obtenga siguiente menor arco typename GT::Arc * min_arc = heap.get_min_arc(); typename GT::Node * src = g.get_src_node(min_arc); typename GT::Node * tgt = g.get_tgt_node(min_arc); if (IS_NODE_VISITED(src, Aleph::Prim) and IS_NODE_VISITED(tgt, Aleph::Prim)) continue; // Este arco cerrar´a un ciclo en el ´rbol ı a typename GT::Node * tgt_node = IS_NODE_VISITED(src, Aleph::Prim) ? tgt : src; // inserte en arbol, guarde node de arbol y marquelo visitado ´ ´ TREENODE(tgt_node) = tree.insert_node(tgt_node->get_info()); NODE_BITS(tgt_node).set_bit(Aleph::Prim, true); // insertar en heap arcos no visitados de tgt_node for (Node_Arc_Iterator<GT, SA> it(tgt_node); it.has_current(); it.next()) { typename GT::Arc * arc = it.get_current_arc(); if (IS_ARC_VISITED(arc, Aleph::Prim)) continue; ARC_BITS(arc).set_bit(Aleph::Prim, true); // marcar arco typename GT::Node * tgt = it.get_tgt_node(); if (IS_NODE_VISITED(tgt, Aleph::Dijkstra)) continue; // nodo visitado ==> causar´ ciclo ==> no insertar en heap a heap.put_arc(arc, tgt); } // insertar nuevo arco en tree y mapearlo typename GT::Arc * tree_arc = tree.insert_arc(TREENODE(src), TREENODE(tgt), min_arc->get_info()); GT::map_arcs(min_arc, tree_arc); } Í× × get min arc ¼ ¸ Node Arc Iterator ¸ Ò put arc ¼º ÓÑÓ Ú Ö ÑÓ× ÔÓר Ö ÓÖÑ ÒØ ¸ Ð Ö ÓÐ Ö ÓÖ Ö ×ÙÐØ ÒØ ר ÔÖÓ ×Ó × Ñ Ò ÑÓº À Ý ÙÒ Ö Ò ÖÙ Ð Ò Ð Ñ Ò Ö Ò ÕÙ Ð Ð ÓÖ ØÑÓ ÈÖ Ñ ØÖ Ø ÓÒ Ð ÔÖÓÔ Ð ÐÓ ´ º¾ Ô º µ Ý ÕÙ ÒÓ× Ô ÖÑ Ø Ú Ö ÙÒ ÔÖÙ Ð º ÈÙ ×ØÓ ÕÙ Ð Ö ÓÐ Ö ÓÖ tree × ÑÔÖ × ÓÒ ÜÓ¸ ÔÓ ÑÓ׸ ÔÓÖ × ÑÔÐ Ò×Ô ÓÒ Ú × Ø ÐÓ× ÒÓ Ó× ÙÒ Ö Ó ÔÖÓ × Ó¸ Ø ÖÑ Ò Ö × Ð Ò ÐÙ× ÓÒ Ð ÒÙ ÚÓ Ö Ó Ò tree Ù× Ö ÙÒ ÐÓº Ë Ñ Ó× ÒÓ Ó× Ý Ò × Ó Ú × Ø Ó׸ ÒØÓÒ ×¸ Ð Ò× Ö ÓÒ Ð Ö Ó Ù× Ö ÙÒ ÐÓ ÐÓ ÓÒØÖ Ö Ó¸ Ð Ö Ó ÓÖÑ Ô ÖØ Ð Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓº ÓÒ Ð Ð ÓÖ ØÑÓ ÃÖÙ× Ð ÒÓ ÔÓ ÑÓ× Ö ×Ø ÓÒ× Ö ÓÒ ÔÓÖÕÙ tree × Ò ÓÒ ÜÓº 7.8.3.5 An´lisis del algoritmo de Prim a Ð Ò Ð × × ÓÑÔÐ ØÓ Ð Ð ÓÖ ØÑÓ ÈÖ Ñ Ö ÕÙ Ö ÓÒØ Ð Þ Ö ×Ù× ÐÓÕÙ × ÔÖ Ò Ô Ð × ÁÒ Ð Þ Ö ÈÖ Ñ ¼ ¸ ÁÒ Ð Þ Ö Ô ¼ ¸ Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ × ÙÒ ÈÖ Ñ ¼ Ý × Ò Ð Þ Ö ÈÖ Ñ ´Ò Ú Ö ¬Ò µ º Ä Ò Ð Þ ÓÒ Ô Ö Ô ÖØ Ö ÐÓ× ÓÒØ Ò Ó× ÐÓ× ÓÓ × Ý ×Ù Ð Ö ÓÒ Ð ¬Ò Ð Ö ÕÙ Ö Ò ÖÖ Ö ØÓ Ó× ÐÓ× ÒÓ Ó× Ð Ö Óº Ñ Ó× ×ÓÒ¸ ÔÓÖ Ø ÒØÓ¸ O(V)º
  • 734.
    708 Cap´ ıtulo 7. Grafos L 4 M 2 N 3 O 6 P L 4 M 2 N 3 O 6 P 10 12 10 8 3 1 3 1 1 7 10 12 10 8 3 1 3 1 1 7 F 5 G 15 H I J 4 K F 5 G 15 H I J 4 K 2 2 2 2 9 4 1 7 3 2 1 2 5 2 9 4 1 7 3 2 1 2 5 2 A 3 B 4 C 3 D 4 E A 3 B 4 C 3 D 4 E ´µ ´ µ L 4 M 2 N 3 O 6 P L 4 M 2 N 3 O 6 P 10 12 10 8 3 1 3 1 1 7 10 12 10 8 3 1 3 1 1 7 F 5 G 15 H I J 4 K F 5 G 15 H I J 4 K 2 2 2 2 9 4 1 7 3 2 1 2 5 2 9 4 1 7 3 2 1 2 5 2 A 3 B 4 C 3 D 4 E A 3 B 4 C 3 D 4 E ´µ ´ µ L 4 M 2 N 3 O 6 P L 4 M 2 N 3 O 6 P 10 12 10 8 3 1 3 1 1 7 10 12 10 8 3 1 3 1 1 7 F 5 G 15 H I J 4 K F 5 G 15 H I J 4 K 2 2 2 2 9 4 1 7 3 2 1 2 5 2 9 4 1 7 3 2 1 2 5 2 A 3 B 4 C 3 D 4 E A 3 B 4 C 3 D 4 E ´µ ´µ ÙÖ º ÈÖÓ Ö ×Ó Ð Ð ÓÖ ØÑÓ ÈÖ Ñ ´ ¬ ÙÖ ÓÖÖ ×ÔÓÒ ØÖ × Ø Ö ÓÒ ×µ Ð ÐÓÕÙ ÁÒ Ð Þ Ö Ô ¼ Ö ÓÖÖ ÐÓ× Ö Ó× Ð ÒÓ Ó ÓÖ Òº Ò Ð ÑÙÝ ÜØÖ ÑÓ Ô ÓÖ ×Ó Ò Ð ÕÙ Ð ÒÓ Ó ×Ø ÓÒ Ø Ó Ð Ö ×ØÓ ÐÓ× ÒÓ Ó׸ ÁÒ Ð Þ Ö Ô ¼ × O(V)º ÄÓ× ØÖ × ÐÓÕÙ × ÒØ Ö ÓÖ × ×ÓÒ¸ Ò ÓÒ ÙÒØÓ¸ O(V)º Ò Ù ÒØÓ Ð ÐÓÕÙ Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ × ÙÒ ÈÖ Ñ ¼ ¸ ר × ÙÒ ÔÓ Ó Ñ × ×ÙØ Ð Ò Ð Þ Ö ÔÓÖÕÙ Ð ÒØ Ø Ö ÓÒ × Ð while Ô Ò ÐÓ ÕÙ ×Ù ÓÒ Ð for ÒØ ÖÒÓ¸ Р٠и ×Ù Ú Þ¸ Ø ÑÔÓ Ó Ø Ò ÙÒ ÒØ Ö Ô Ø ÓÒ × Ü Ø º Ë Ü Ñ Ò ÑÓ× ÓÒ Ù Ó Ð ÐÓÕÙ ¸ ÒØÓÒ × ÔÓ ÑÓ× Ö Ð Þ Ö ÕÙ ÑÓ× Ò Ö Ó× ÒØ × ½º Ð ÒÙÑ ÖÓ Ú × ÕÙ × Ð Ô Ü ÐÙ× ÚÓ¸ Ð Ù Ð ÒÓ× ÔÖÓÔÓÖ ÓÒ Ð ÓÑÔÐ Ð while ÓÑ Ò Ó ÓÒ Ð forº Ó Ð ×ÙÔÙ ×ØÓ ÕÙ Ð Ö Ó × ÓÒ ÜÓ¸ × Ð ÖÓ ÕÙ ØÓ Ó× ÐÓ× ÒÓ Ó× Ò×Ö Ñ Ö Ó× ÔÓÖ Ð Ð ÓÖ ØÑÓ¸ ÔÙ × ×Ø × Ò × Ð ÔÖ Ñ Ö Ö Ó Ð ÒÓ Ó ÓÖ Ò Ý ÙÐÑ Ò ×Ø ÕÙ ØÓ Ó× ÐÓ× ÒÓ Ó× ×Ø Ò Ö Ó׸ ÐÓ Ù Ð × Ð ÓÒ ÓÒ Ô Ö Ð whileº ÒÙ ÚÓ ÒÓ Ó Ò×Ô ÓÒ Ó ÖÖ ×Ù Ò ÐÙ× ÓÒ Ò Ð Ö ÓÐ Ö ¹ ÓÖ ½ Ý Ð ÓÒ× Ù ÒØ Ò× Ö ÓÒ ØÓ Ó× ÐÓ× Ö Ó× ÒÓ Ú × Ø Ó× Ý ÒØ × Ð ÒÓ Ó Ö Ò ÔÖÓ × Óº Ù Ò Ó Ó ÙÖÖ Ð Ò× Ö ÓÒ Ð ÙÐØ ÑÓ ÒÓ Ó¸ Ý ØÓ Ó× ÐÓ× Ö Ó× Ð Ö Ó Ò × Ó Ú × Ø Ó× Ý¸ ÓÑÓ ×ØÓ× ×ÓÒ Ñ Ö Ó׸ × × Ò Ð Ô ÙÒ ×ÓÐ Ú Þº ½ Ê ÓÖ ÑÓ× ÕÙ Ò ×Ø Ð ÓÖ ØÑÓ Ð Ö ÓÐ Ö ÓÖ × ÑÔÖ × ÓÒ ÜÓ¸ ÐÓ ÕÙ × ÙÖ ÕÙ ÒÓ × Ö Ö ÙÒ ÐÓ Ù Ò Ó × Ò× ÖØ Ò Ð Ö ÓÐ ÙÒ ÒÓ Ó ÒÓ Ú × Ø Óº
  • 735.
    7.8. Arboles abarcadoresm´ ınimos 709 Î ÑÓ׸ Ô٠׸ ÕÙ × Ö Ð Þ Ò ÐÓ ×ÙÑÓ E Ò× Ö ÓÒ × Ö Ó Ò Ð Ôº Ò Ù ÒØÓ Ð ÒØ ÜØÖ ÓÒ ×¸ ÑÓ× ÒÓØ Ö ÕÙ ¸ ÔÙ ×ØÓ ÕÙ ØÖ Ø ÑÓ× ÓÒ ÙÒ Ô Ü¹ ÐÙ× ÚÓ¸ ר × Ö Ó× ÙÖ ÒØ Ð Ò× Ö ÓÒ Ò ÙÒ Óר O(1)º Ç ÙÖÖ Ò¸ ÒØÓÒ ×¸ ÐÓ ×ÙÑÓ V ÜØÖ ÓÒ × Ö Ó× ÐÓ ÕÙ ÒÓ× ÖÖÓ ÙÒ ÓÑÔÐ O(V +E) = O(E) Ô Ö Ð ÒØ Ö Ô Ø ÓÒ × ÕÙ Ö Ð Þ Ò Ð while Ý Ð for ÓÑ Ò Ó׺ Ë Ò ÐÙ Ö ÙÒ Ô Ü ÐÙ× ÚÓ ØÖ Ø × ÑÓ× ÓÒ ÙÒ Ô ØÖ ÓÒ Ð¸ ÒØÓÒ × Ö Ð ¹ Þ Ö ÑÓ× E ÜØÖ ÓÒ × Ø Ò Ö ÑÓ× ÙÒ Ð ÓÖ ØÑÓ Ñ × Ð ÒØÓ Ô ÖÓ ÓÒ Ð Ñ ×Ñ ÓÑÔÐ Ø Ö ØÚ º ¾º Ð Ø Ñ ÒÓ Ñ Ü ÑÓ Ó ÔÖÓÑ Ó Ð Ô¸ Ð Ù Ð ÒÓ× ÔÖÓÔÓÖ ÓÒ Ð Óר ÓÔ Ö Ö ÓÒ Ðº ÈÙ ×ØÓ ÕÙ Ù× ÑÓ× ÙÒ Ô Ü ÐÙ× ÚÓ¸ × × ÙÖÓ¸ ÐÓ ÕÙ ÔÖ Ò ÑÓ× Ò Ð ¬Ò ÓÒ º ´Ü º º¿º¾ ´Ô Ò ¼¾µµ¸ ÕÙ ×Ù Ø Ñ ÒÓ ÒÓ Ü V−1 Ð Ñ ÒØÓ׸ ÐÓ ÕÙ ÒÓ× ÖÖÓ ÙÒ Óר ÓÔ Ö ÓÒ O(Ð V) ÔÓÖ Ð Ò× Ö ÓÒ Ó Ð Ñ Ò ÓÒº Ð Óר ÙÒ ÓÔ Ö ÓÒ ×Ó Ö Ð Ô Ü ÐÙ× ÚÓ ×¸ Ô٠׸ O(Ð V)º Ð × ÒØ × Ö ÒØ Ñ ÒØ Ð ÙР׸ ÔÓ ÑÓ× ÓÒ ÐÙ Ö ÕÙ Ð Óר Ð ÐÓÕÙ Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ × ÙÒ ÈÖ Ñ ¼ × O(E) × O(Ð V) = O(E Ð V)º ÄÓ× Ù ØÖÓ ÐÓÕÙ × ÒÚÓÐÙ Ö Ó× ÓÒØ Ð Þ Ò O(V) + O(E Ð V) = O(E Ð V)¸ ÕÙ × Ð × ÑÔ ÒÓ ¬Ò Ø ÚÓ Ò Ø ÑÔÓ Ð Ð ÓÖ ØÑÓ ÈÖ Ñº × ÑÔÓÖØ ÒØ × ÑÓ ×Ø Ö ÕÙ × Ù× × ÑÓ× ÙÒ Ô ØÖ ÓÒ Ð Ô Ö Ù Ö Ö ÐÓ× Ö Ó׸ ÒØÓÒ × Ð Óר ÙÒ ÓÔ Ö ÓÒ ×Ó Ö Ð Ô ×Ø Ö ÓØ Ó ÔÓÖ O(Ð E)¸ Ð Ù Ð ÓØ Ö Ð Ð ÓÖ ØÑÓ ÈÖ Ñ ÙÒ × ÑÔ ÒÓ O(E Ð E)¸ ÙÒ Óר ×Ù ×Ø Ò ÐÑ ÒØ Ñ ÝÓÖ Ð ÕÙ ÒÓ× ÔÖÓÔÓÖ ÓÒ Ð Ô Ü ÐÙ× ÚÓº Ò ÐÓ Ñ ÒØ ¸ Ø Ò Ö ÑÓ× ÙÒ Óר Ò ×Ô Ó O(E) Ú Ö×Ù× Ð O(V)º Ð Ô Ü ÐÙ× ÚÓ¸ ÙÒÕÙ ÓÑÔÐ Ó¸ ÒÓ × ÙÒ ÔÖ Ó¸ ÔÙ × ×Ù Ù×Ó × Ö ÓÑÔ Ò× ÓÒ Ö ×¸ Ø ÒØÓ Ò Ø ÑÔÓ ÓÑÓ Ò ×Ô Óº Ð Ð ÓÖ ØÑÓ ÈÖ Ñ × Ð Ñ ØÓ Ó ÔÖ Ö Ò Ô Ö Ö Ó× Ò×Ó׺ 7.8.3.6 Correctitud del algoritmo de Prim Proposici´n 7.4 o Ë G ÙÒ Ö Ó ÓÒ ÜÓ Ù ÐÕÙ Ö º ÒØÓÒ × Ð Ð ÓÖ ØÑÓ ÈÖ Ñ Ò Ù ÒØÖ ÙÒ Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓº Demostraci´n (por inducci´n sobre el n´ mero de nodos) o o u ½º V<2 Ò ×Ø ×Ó¸ Ð Ô Ö ØÓÖÒ Ð Ñ ÒÓÖ Ö Ó Ð ÒÓ Ó Ò Ð Ý ÓÒרÖÙÝ ÙÒ Ö ÓÐ Ô Ö Ð Ó× ÒÓ Ó× Ð Ù Ð ×¸ ÓÒ ÖØ ØÙ Ñ Ò ÑÓº ¾º V > 2 ÓÖ ×ÙÑ ÑÓ× Ð ÔÖÓÔÓ× ÓÒ ÖØ Ô Ö ÙÒ Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ Ô Ö Ðº ÍÒ Ó × ÖÚ ÓÒ ÖÙ Ð Ô Ö ×Ø ÑÓ×ØÖ ÓÒ × ÔÖ Ò Ö ÕÙ Ð Ô × ÑÔÖ ÒÓ× Ð Ñ ÒÓÖ Ö Ó ÒØÖ ÐÓ× Ö ×Ø ÒØ × ´ÐÓ Ñ ×ÑÓ Ó ÙÖÖ ÓÒ Ð Ð ÓÖ ØÑÓ ÃÖÙ× Ðµº Ù Ò Ó × ÜØÖ ÙÒ Ñ ÒÓÖ Ö Ó¸ Ü ×Ø Ò Ó× ÔÓ× Ð × ´ µ ÉÙ Ð Ö Ó ÓÖÑ ÙÒ ÐÓ¸ Ò ÙÝÓ ×Ó¸ ÔÓÖ Ð ÔÖÓÔ Ð ÐÓ¸ ר × Ð Ñ ÝÓÖ ÒØÖ ØÓ Ó× ÐÓ× Ö Ó× ÕÙ ÓÒ ÓÖÑ Ò Ð ÐÓ Ý¸ ÔÓÖ Ð ÔÓØ × × Ò Ù Ø Ú ¸ Ð Ö ÓÐ Ö ÓÖ × Ñ Ò ÑÓº ´ µ ÉÙ Ð Ö Ó ÒÓ ÓÖÑ ÙÒ ÐÓ¸ Ò ÙÝÓ ×Ó¸ ÔÐ ÒØ Ò Ó ÙÒ ÓÖØ ÒØÖ Ð Ö ÓÐ Ö ÓÖ Ô Ö Ð Ý ÙÒ Ö Ó ÙÒ ×ÓÐÓ ÒÓ Ó¸ Ð Ö Ó × Ð Ñ Ò ÑÓ ÒØÖ
  • 736.
    710 Cap´ ıtulo 7. Grafos ÐÓ× ÔÓ× Ð × ÖÙ ´ Ù ÜØÖ Ó Ð Ôµ ݸ ÓÑÓ ÐÓ × ÑÓ× Ð ÔÖÓÔ ÖÙ ¸ Ð ÒÙ ÚÓ Ö ÓÐ × Ñ Ò ÑÓº Ä ÔÖÓÔÓ× ÓÒ × ÔÙ × ÖØ Ô Ö ØÓ Ó× ÐÓ× ÒÓ Ó× Ö Ó 7.9 Caminos m´ ınimos Ò Ö Ó× ÔÓÒ Ö Ó׸ Ð ÔÖÓ Ð Ñ Ð Ñ ÒÓ Ñ Ò ÑÓ ÓÒ× ×Ø Ò Ò ÓÒØÖ Ö ÙÒ Ñ ÒÓ ÒØÖ ÙÒ Ô Ö ÒÓ Ó× Ø Ð ÕÙ Ð ×ÙÑ ØÓØ Ð ØÓ Ó× ÐÓ× Ô ×Ó× × Ñ Ò Ñ º ÓÑÓ ÑÔÐÓ× ÔÓ ÑÓ× ÓÒ× Ö Ö ½º × Ù × Ý ×Ø Ò × ÒØÖ ÖÖ Ø Ö ×¸ Ò ÓÒØÖ Ö Ð Ñ ÒÓ Ñ ÒÓÖ ×Ø Ò ÒØÖ ÙÒ Ô Ö Ù ×º ¾º × Ù × Ý ÙÖ ÓÒ × Ò ÓÖ × ÚÙ ÐÓ Ò Ú ÓÒ Ý Ò × Ð ×¸ × ÙÒ Ó ÖØ × Ý ×ÔÓÒ Ð × ÖÓÐ Ò ×¸ ÓÒ× Ù Ö Ð Ø Ò Ö Ö Ó ÕÙ ÐÐ Ú ÙÒ Ù ÓØÖ Ò Ð Ñ ÒÓÖ Ø ÑÔÓ ÔÓ× Ð º Ë Ñ ÑÓ× ÙÖ ÓÒ × ÔÓÖ Óר × ÓÒÓÑ Ó׸ ÒØÓÒ × ÔÓ ÑÓ× ÔÐ ÒØ Ö Ð Ò¹ ÓÒØÖ Ö Ð Ø Ò Ö Ö Ó ÓÒÓÑ Ñ ÒØ Ñ × Ö ØÓº ¿º ÙÒ Ö ÓÑÔÙØ ÓÖ ×¸ × × Ò ÓÒØÖ Ö Ð Ñ ÒÓ Ñ × ÓÖØÓ ÒÓ Ó× ÒØ ÖÑ Ó× ÔÓÖ ÓÒ ÔÙ Ò Ö ÙÐ Ö ÐÓ× Ô ÕÙ Ø × Ò Ð Ñ ÒÓÖ Ø ÑÔÓ ÔÓ× Ð º Ò ÐÓ Ñ ÒØ ¸ × × ØÖ Ø ÙÒ Ö Ø Ð ÓÒ ¸ ÒØÓÒ ×¸ ØÓ× ÔÖ ×Ø Ö Ù Ò × ÖÚ Ó Ý¸ Ð Ú Þ¸ ÓÖÖ Ö Óר ׸ × × Ò ÓÒØÖ Ö Ð Ñ ÒÓ Ñ × ÓÖØÓ Ò¹ ØÖ ÓÒÑÙØ ÓÖ × ÒØ ÖÑ Ö Ó× Ø Ð Ñ Ò Ö ÕÙ × Ñ ÓÖ Ò Ô Ö Ñ ØÖÓ× ÓÑÓ ÐØÒ ØÖ Ò×Ñ × ÓÒ ´ ÙÒ Ñ ÒØ Ð Ô Ö Ð ÓÒÚ Ö× ÓÒµ Ó ÒØ ÐÐ Ñ × × ÑÙÐØ Ò × ÕÙ ÔÙ Ò ØÙ Ö× Ò Ð Ö º º ÍÒ ÖÓ ÓØ¸ Ò ÙÒ ÓÒ ×Ù× Ñ Ò ×ÑÓ× Ú × ÓÒ¸ ÔÐ Ò ¬ Ö ÙÒ ØÖ Ý ØÓ × ÙÒ ÔÙÒØÓ ÓØÖÓº Ð Ø ÖÖ ÒÓ Ý ×Ù× Ó ×Ø ÙÐÓ× × ÑÓ Ð Þ Ñ ÒØ ÙÒ Ö Óº Ò ×Ø ×Ó¸ Ô Ö ÓÖÖ Ö Ø ÑÔÓ Ý Ò Ö ¸ × Ð ÙÐ Ð Ñ ÒÓ Ñ Ò Ñ ×Ø Ò ÒØÖ ÐÓ× ÔÙÒØÓ׺ À Ý ÑÙ × Ñ × × ØÙ ÓÒ × Ò Ð × ÕÙ ÔÙ Ô Ö Ö ×Ø ÔÖÓ Ð Ñ º È Ö ÕÙ ×Ø Ø Ò × ÒØ Ó¸ Ð Ö Ó × Ö ÓÒ ÜÓ Ó ÕÙ Ð Ñ ÒÓ× Ü ×Ø ÙÒ Ñ ÒÓ ÒØÖ ÙÒ Ô Ö ÒÓ Ó× Ù ×Ø ÓÒ ÙÐØ Ñ ÕÙ ÔÓ ÑÓ× Ø ÖÑ Ò Ö Ñ ÒØ Ð ÖÙØ Ò test for path() ×ØÙ Ò Ü º º º½ ´Ô Ò ¾½µº ÄÓ× ØÖ × Ð ÓÖ ØÑÓ× Ñ ÒÓ× Ñ Ò ÑÓ× ÕÙ ×ØÙ Ö ÑÓ× Ò ×Ø × ÓÒ ÓÔ Ö Ò Ô Ö Ö Ó׺ ËÓÐÓ Ð Ð ÓÖ ØÑÓ ×ØÖ ÓÔ Ö Ô Ö Ö Ó׺ ÍÒ Ñ Ò Ö Ò ÓÖ Ö ×Ø ÔÖÓ Ð Ñ × ÑÓ ¬ Ö ÐÓ× Ð ÓÖ ØÑÓ× Ù×ÕÙ Ñ ÒÓ× ÕÙ ÑÓ× ×ØÙ Ó½ Ô Ö ÕÙ ÜÔÐÓÖ Ò ØÓ Ó× ÐÓ Ñ ÒÓ× ÔÓ× Ð × ÒØÖ Ð Ô Ö ÒÓ Ó׺ Ä × ÕÙ × ÓÒØ Ð Ò Ý × Ù Ö Ò ØÓ Ó× ÐÓ Ñ ÒÓ× ÔÓ× Ð × ÒØÖ Ð Ô Ö Ò Ù ×Ø ÓÒ Ý × × Ó Ð Ñ ÒÓÖ ÒØÖ ÐÐÓ׺ Ð ÔÖÓ Ð Ñ ×Ø Ò ÓÕÙ × ÕÙ ÓÑÔÙØ ÓÒ ÐÑ ÒØ × ÒØÖ Ø Ð ¸ ÔÙ × Ð ÒØ Ñ ÒÓ× ÔÓ× Ð × ÒØÖ Ù ÐÕÙ Ö Ô Ö ÒÓ Ó× × ÓÑ Ò ØÓÖ º ½ ÊÙØ Ò × find path depth first() Ò Ü º º º¾ ´Ô Ò ¾¿µ Ý find path breadth first() Ò Ü º º ´Ô Ò ¾ µº
  • 737.
    7.9. Caminos m´ ınimos 711 ÆÓÖÑ ÐÑ ÒØ ÔÓÖ Ö ÞÓÒ × ×ØÖ ÓÒ¸ × ÔÐ Ù× Ð Ø Ò Ö Ô ×Ó× Ò Ø ÚÓ× Ò ÙÒ Ö Óº Ò ×Ø × ÒØ Ó¸ Ò Ð ×ØÙ Ó Ý Ð ÙÐÓ Ñ ÒÓ× Ñ Ò ÑÓ× Ý ÙÒ ×ÙÖ Ó Ñ Ø Ñ Ø Ó Ý¸ ÔÓ× Ð Ñ ÒØ × Ó¸ Ð Ù Ð ÑÓ× Ø Ò Ö ×Ô Ð Ù Óº Ë ØÖ Ø ÐÓ× ÐÓ× Ò Ø ÚÓ׺ ËÓÒ ×ÙÖ Ó× ÔÓÖÕÙ ×Ù Ü ×Ø Ò Ò Ð Ö Ó ÔÐ ÒØ ÙÒ ÐÓ ÕÙ Ò¬Ò Ø Ñ ÒØ Ö ÓÖÖ Ó × Ö Ñ Ò ÑÓº 7.9.1 Algoritmo de Dijkstra Ò ½ ¸ × Ö Ïº ×ØÖ ¸ ÔÓ× Ð Ñ ÒØ ÙÒÓ ÐÓ× ÒØ ¬ Ó× Ð × Ò × ÓÑÔÙØ ¹ ÓÒ Ð × Ñ × Ö Ò Ó×Ó× ØÓ Ó× ÐÓ× Ø ÑÔÓ׸ ÞÓ ÔÙ Ð Ó ÙÒ Ð ÓÖ ØÑÓ Ô Ö Ò ÓÒØÖ Ö ØÓ Ó× ÐÓ× Ñ ÒÓ× Ñ × ÓÖØÓ× ÒØÖ ÙÒ ÒÓ Ó Ò Ó Ý Ð Ö ×ØÓ ÐÓ× Ð Ö Óº Ð Ð ÓÖ ØÑÓ ×ØÖ ÔÙ ÑÔÐ Ö× Ô Ö Ö Ó× Ó Ö Ó׺ × ×Ø ÒØ Ù Ó Ô Ö Ö Ó× Ù Ð ÒÓ׺ ÌÓ Ó ÐÓ Ô ÖØ Ò ÒØ Ð Ð ÙÐÓ Ñ ÒÓ× Ñ Ò ÑÓ× × ÙÒ Ð Ð ÓÖ ØÑÓ ×ØÖ ×Ù ¹ Ý Ò Ð Ö ÚÓ Dijkstra.Hº À Ý ÙÒ Ö Ò Ö Ñ Ò × Ò ÒØÖ Ð Ð ÓÖ ØÑÓ ×ØÖ Ý Ð ÈÖ Ñ ÜÔÖ × ÔÓÖ Ð Ó ÕÙ Ñ Ó× × × Ò Ò ÙÒ ÜÔÐÓÖ ÓÒ Ö Ó × ÙÒ Ð × ÔÖ ÓÖ ×º Ä Ö Ò × Ò Ð ×Ù Ý Ò ÕÙ Ð Ð ÓÖ ØÑÓ ×ØÖ Ù× Ú ÐÓÖ × Ô Ö Ð × Ø ÒØÓ Ò ÐÓ× ÒÓ Ó× ÓÑÓ Ò ÐÓ× Ö Ó׺ Ó ÙÒ ÒÓ Ó Ò Ð v0¸ Ù Ð Ö ÔÖ × ÒØ Ð ÒÓ Ó ÓÖ Ò ÙÒ Ñ ÒÓ Ñ Ò ÑÓ¸ ÐÓ× Ú ÐÓÖ × ÐÓ× ÕÙ Ð ÑÓ× × Ö ¬ Ö Ð Ð ÓÖ ØÑÓ ×ØÖ × Ð × ¬ Ò Ð × Ù ÒØ ÑÒÖ Para los nodos: Ó ÙÒ ÒÓ Ó Ù ÐÕÙ Ö vu¸ (vi) Ö ÔÖ × ÒØ Ð Ñ Ò Ñ ×Ø Ò ÙÑÙÐ × v0 ר viº ÁÒ ÐÑ ÒØ ¸ (v0) = 0º Para los arcos: Ó ÙÒ Ö Ó Ù ÐÕÙ Ö e ÒØÖ ÐÓ× Ý ÒØ × ÙÒ ÒÓ Ó vi¸ ÈÓØ(e) × Ò Ð ×Ø Ò ÔÓØ Ò Ð ÙÑÙÐ Ù Ö Ö × Ð ÒÓ Ó v0 ר Ð ÒÓ Ó ×Ø ÒÓ eº Ë d(e) × Ò Ð ×Ø Ò ´Ó Ô ×Óµ Ð Ö Ó e¸ ÒØÓÒ ×¸ Ó ÙÒ ÒÓ Ó vi ÈÓØ(e) = (vi) + d(e) ´ºµ ר ÓÔ Ö ÓÒ × Ö Ð Þ Ô Ö Ö Ó ÙÒ ÒÓ Ó ØÖ Ò× ØÓ ÙÖ ÒØ Ð Ù ÓÒ Ð Ð ÓÖ ØÑÓº ÁÒ ÐÑ ÒØ ¸ Ô Ö Ð ÒÓ Ó Ò Ó v0¸ ∀e Ý ÒØ v0, ÈÓØ(e) = d(e)¸ ÔÙ × Ð ×Ø Ò ÙÑÙÐ × v0 × ÒÙÐ ´ (v0) = 0µº Ð Ð ÓÖ ØÑÓ ×ØÖ ÙØ Ð Þ ÙÒ Ô Ü ÐÙ× ÚÓ ´Ü º º¿º¾ ´Ô Ò ¼¾µµ × ÙÒ ÐÓ× ÔÓØ Ò Ð × Ö Ó׺ ÓÑÓ Ø Ð¸ Ð × ÓÔ Ö ÓÒ × ×Ó Ö Ð Ô ÒÓ Ü Ò O(Ð V) Ò Ø ÑÔÓ Ý O(V) Ò ×Ô Óº ¬Ò Ó ÙÒ Ô Ü ÐÙ× ÚÓ × ÙÒ ÔÓØ Ò Ð × Ö Ó׸ Ð Ð ÓÖ ØÑÓ ×ØÖ × ×ØÖÙ ØÙÖ ÐÑ ÒØ Ù Ð Ð ÈÖ Ñº Ë Ò Ñ Ö Ó¸ Ð Ð ÓÖ ØÑÓ ×ØÖ Ö ÕÙ Ö ÙÒ ÔÓ Ó Ñ× Ù Ó¸ ÔÙ × Ñ Ò Ò ÓÖÑ ÓÒ ÓÒ Ð Ø ÒØÓ Ô Ö ÐÓ× ÒÓ Ó× ÓÑÓ Ô Ö ÐÓ× Ö Ó׺
  • 738.
    712 Cap´ ıtulo 7. Grafos Ð ÔÖÓØÓØ ÔÓ ÒÙ ×ØÖ ÑÔÐ Ñ ÒØ ÓÒ Ð Ð ÓÖ ØÑÓ ×ØÖ × ¬Ò Ð × Ù ÒØ ÑÓ Ó ½¾ ÈÖÓØÓØ ÔÓ Ð Ð ÓÖ ØÑÓ ×ØÖ ½¾ ≡ ½ template <class GT, class Distance, class Compare, class Plus, class SA> inline void dijkstra_min_spanning_tree(GT & g, typename GT::Node * start_node, GT & tree) { Ð ÓÖ ØÑÓ ×ØÖ ½ } g × Ð Ö Ó ´Ó Ö Óµ ×Ó Ö Ð Ù Ð × × Ð ÙÐ Ö ÙÒ Ö ÓÐ Ö ÓÖ ×Ø Ò × Ñ Ò Ñ ×º start node × Ð ÒÓ Ó Ò Ð¸ Ð Ù Ð ÔÙ ÓÒ× Ö Ö× Ö Þ Ð Ö ÓÐ Ö ¹ ÓÖº Ò ÐÑ ÒØ ¸ tree × Ð Ö ÓÐ Ö ÓÖ Ñ ÒÓ× Ñ Ò ÑÓ× ÓÒ Ò Ó ´Ó Ö Þµ Ò start nodeº ÄÙ Ó Ð Ù ÓÒ¸ g Ý tree ר Ò Ñ Ô Ó× Ñ ÒØ ×Ù× ÓÓ ×º Ò Ù ÒØÓ ÐÓ× Ø ÔÓ× Ô Ö Ñ ØÖ Þ Ó׸ GT × Ð Ø ÔÓ Ð Ö Ó Ý Ð Ö ÓÐ Ö ÓÖ ×Ø Ò × Ñ Ò Ñ ×º Distance × ÙÒ Ð × ÕÙ Ð ×Ø Ò ÐÑ Ò Ò Ð Ö Ó × ÙÒ Ð Ò ÓÐ ÓÒ ÕÙ × ¬Ò Ð Ô ×Óº Compare × ÙÒ Ð × ÓÑÔ Ö ÓÒ ÒØÖ Ø ÔÓ× typename Distance::Distance Typeº Plus × ÙÒ Ð × ÕÙ Ö Ð Þ Ð ×ÙÑ Ð Ö ×Ø Ò ×º ÈÓÖ ÙÐØ ÑÓ¸ SA × ÙÒ ¬ÐØÖÓ Ö Ó׺ 7.9.1.1 Distancia acumulada en los nodos Ä ×Ø Ò ÙÑÙÐ ÔÙ Ù Ö Ö× Ñ ÒØ Ð ÓÓ Ð ÒÓ Óº ÑÓ× Ô ÖØ Ö ÙÒ ÐÓÕÙ Ñ ÑÓÖ Ò ÓÒ ÐÑ Ò Ö Ð ÙÑÙÐ Ó (vi)º Ù Ö Ö ÑÓ׸ Ô٠׸ ÔÓÖ ÒÓ Ó¸ Ð Ò ÓÖÑ ÓÒ ¬Ò ÔÓÖ Ð × Ù ÒØ Ö ×ØÖÓ ½¾ ÁÒ ÓÖÑ ÓÒ ÔÓÖ ÒÓ Ó Ò ×ØÖ ½¾ ≡ ½¾ template <class GT, class Distance> struct Dijkstra_Node_Info { typename GT::Node * tree_node; // Imagen del nodo en el arbol abarcador ´ typename Distance::Distance_Type dist; // distancia acumulada void * heap_node; Dijkstra_Node_Info() : tree_node(NULL), dist(Distance::Zero_Distance), heap_node(NULL) { /* empty */ } }; ¬Ò × Dijkstra Node Info¸ Ù× Ò ÙÒ ½¿º tree node ׸ ÓÑÓ ×Ù ÓÑ ÒØ Ö Ó ÐÓ Ò ¸ Ð Ñ Ò Ð ÒÓ Ó Ò Ð Ö ÓÐ Ö ÓÖ Ñ ÒÓ× Ñ Ò ÑÓ׺ dist × Ð ÙÑÙÐ Ó (vi) × start nodeº heap node × ÙÒ ÔÙÒØ ÖÓ ÙÒ ÒÓ Ó ÒØÖÓ Ð Ô Ü ÐÙ× ÚÓ ÓÖ Ò Ó ÔÓÖ ÔÓØ Ò Ð ×º Ò ÓÒ×ÓÒ ÓÒ Ð ÒØ Ö Þ ArcHeap¸ ÑÓ× ×Ô ¬ Ö Ð Ð × ×Ó Ð ÑÔÓ heap node ½¾ ÁÒ ÓÖÑ ÓÒ ÔÓÖ ÒÓ Ó Ò ×ØÖ ½¾ +≡ ½¾ template <class GT, class Distance, class Compare> struct Dijkstra_Heap_Info { typedef typename ArcHeap<GT, Distance, Compare, Dijkstra_Heap_Info>::Node Node; Node *& operator () (typename GT::Node * p) { return (Node*&) HEAPNODE(p); }
  • 739.
    7.9. Caminos m´ ınimos 713 }; ¬Ò × Dijkstra Heap Info¸ Ù× Ò ÙÒ ½ º Í× × ArcHeap ¼¿ º Ä Ñ Ò ÔÙÐ ÓÒ ÐÓ× ÑÔÓ× ÒØ Ö ÓÖ × × Ö Ð Þ ØÖ Ú × ÐÓ× × Ù ÒØ × Ñ ÖÓ× ½¿ ¬Ò ÓÒ Ñ ÖÓ× Ô Ö Ð ÓÖ ØÑÓ ×ØÖ ½¿ ≡ // conversi´n de cookie a Node_Info o # define DNI(p) (static_cast<Dijkstra_Node_Info<GT, Distance>*>(NODE_COOKIE((p)))) // Acceso al nodo del arbol en el grafo ´ # define TREENODE(p) (DNI(p)->tree_node) # define ACC(p) (DNI(p)->dist) // Acceso a la distancia acumulada # define HEAPNODE(p) (DNI(p)->heap_node) Í× × Dijkstra Node Info ½¾ º Ð Ø ÔÓ List Graph<Node, Arc> ×ÔÓÒ ØÓ Ð Ñ ÕÙ Ò Ö Ô Ö Ò Ð Þ Ö Ý ×¹ Ò Ð Þ Ö ÐÓ× ÒÓ Ó׺ Ë ÙÒ ÐÐÓ¸ ¬Ò ÑÓ× Ð Ò Ð Þ ÓÒ Ð × Ù ÒØ Ñ Ò Ö ½¿ Ð × Ô ÖØ ÓÖ Ò ÓÖÑ ÓÒ Ô Ö ÒÓ Ó ½¿ ≡ template <class GT, class Distance> struct Initialize_Dijkstra_Node { void operator () (GT & g, typename GT::Node * p) { g.reset_bit(p, Aleph::Dijkstra); NODE_COOKIE(p) = new Dijkstra_Node_Info <GT, Distance>; } }; Í× × Dijkstra Node Info ½¾ º Ò ÐÓ Ñ ÒØ ¸ Ð Ð × Ô Ö ×¹ Ò Ð Þ Ö × ¬Ò × ½¿ Ð × Ð Ö ÓÖ Ò ÓÖÑ ÓÒ Ô Ö ÒÓ Ó ½¿ ≡ template <class GT, class Distance> struct Destroy_Dijkstra_Node { void operator () (GT &, typename GT::Node * p) { Dijkstra_Node_Info <GT, Distance> * aux = DNI(p); // guardar bloque liberar GT::map_nodes (p, TREENODE(p)); delete aux; // liberar bloque } }; Í× × Dijkstra Node Info ½¾ º ÈÙ ×ØÓ ÕÙ Ð ÓÓ × ÙØ Ð Þ Ô Ö Ù Ö Ö ×Ø Ó Ø ÑÔÓÖ Ð Ð ÙÐÓ¸ ר ÕÙ ÒÚ Ð Ó¸ ÙÖ ÒØ Ð Ð ÙÐÓ¸ Ô Ö Ù Ö Ö Ð Ñ Ò Ð ÒÓ Ó Ò Ð Ö ÓÐ Ö ÓÖº ÈÓÖ × Ö ÞÓÒ¸ Ð Ñ Ô Ó Ð ÒÓ Ó × Ö Ð Þ Ð ¬Ò Ð Ð Ð ÙÐÓ¸ ÙÖ ÒØ Ð Ð Ö ÓÒ Ð Ò ÓÖÑ ÓÒ Dijkstra Node Infoº ÄÓ Ñ ×ÑÓ Ó ÙÖÖ Ö ÓÒ ÐÓ× Ö Ó× Ý Ð ÔÓØ Ò Ðº Ä Ò Ð Þ ÓÒ Ý ×¹ Ò Ð Þ ÓÒ × Ö Ð Þ Ò¸ ØÖ Ú × Ð Ñ ÕÙ Ò Ö List Graph<Node, Arc>¸ Ð × Ù ÒØ × ÓÖÑ × ½¿ Ô ÖØ Ö Ñ ÑÓÖ Ô Ö ÐÓ× ÒÓ Ó× ½¿ ≡ ´½ µ Operate_On_Nodes <GT, Initialize_Dijkstra_Node <GT, Distance> > () (g);
  • 740.
    714 Cap´ ıtulo 7. Grafos ½ Ä Ö Ö Ñ ÑÓÖ Ô Ö ÐÓ× ÒÓ Ó× ½ ≡ ´½ ½ µ Operate_On_Nodes <GT, Destroy_Dijkstra_Node <GT, Distance> > () (g); Ò Ñ Ó× ÐÓÕÙ × g × Ð Ö Ó ×Ó Ö Ð Ù Ð × × Ð ÙÐ Ö ÐÓ× Ñ ÒÓ× Ñ × ÓÖØÓ׺ 7.9.1.2 Potencial en los arcos Ä Ò ÓÖÑ ÓÒ Ô Ö ÙÒ Ö Ó × Ô Ö Ð Ð ÒÓ Ó Ý × ¬Ò Ñ Ò Ö ×ÑÐ Ö ½ ÁÒ ÓÖÑ ÓÒ ÔÓÖ Ö Ó Ò ×ØÖ ½ ≡ template <class GT, class Distance> struct Dijkstra_Arc_Info { typename GT::Arc * tree_arc; // imagen en el arbol abarcador ´ typename Distance::Distance_Type pot; // potencial del arco }; ¬Ò × Dijkstra Arc Info¸ Ù× Ò ÙÒ ½º Ð Ñ Ò Ó ×Ø רÖÙ ØÙÖ Ñ ÒØ Ñ ÖÓ׸ ×Ù Ò Ð Þ ÓÒ Ý Ð Ö ÓÒ × Ö Ð Þ Ñ Ò Ö ×ÑÐ Ö ÓÒ ÐÓ× ÒÓ Ó׺ Ä ÓÖÑ Ò ÕÙ × Ô ÖØ Ò Ð Þ Ð ÔÓØ Ò Ð ÙÒ Ö Ó × × Ñ Ð Ö Ð ÙÒ ÒÓ Ó ½ Ð × Ô ÖØ ÓÖ Ò ÓÖÑ ÓÒ Ô Ö Ö Ó ½ ≡ template <class GT, typename Distance> struct Initialize_Dijkstra_Arc { void operator () (GT & g, typename GT::Arc * a) { g.reset_bit(a, Aleph::Dijkstra); ARC_COOKIE(a) = new Dijkstra_Arc_Info <GT, Distance>; POT(a) = Distance::Zero_Distance; TREEARC(a) = NULL; } }; Í× × Dijkstra Arc Info ½ ¸ POT¸ Ò TREEARCº Ò ÐÓ Ñ ÒØ ÓÒ Ð Ð Ö ÓÒ Ñ ÑÓÖ ½ Ð × Ð Ö ÓÖ Ò ÓÖÑ ÓÒ Ô Ö Ö Ó ½ ≡ template <class GT, class Distance> struct Destroy_Dijkstra_Arc { void operator () (GT &, typename GT::Arc * ga) { Dijkstra_Arc_Info<GT, Distance> * aux = DAI(ga); typename GT::Arc * ta = TREEARC(ga); if (ta != NULL) // ¿pertenece este arco al arbol abarcador? ´ GT::map_arcs (ga, ta); // s´ ==> mapearlo ı delete aux; } }; Í× × Dijkstra Arc Info ½ Ò TREEARCº
  • 741.
    7.9. Caminos m´ ınimos 715 ÓÖ ¸ ÓÖÑ × Ñ Ð Ö ÓÑÓ ÑÓ× ÓÒ ÐÓ× ÒÓ Ó׸ ×Ô ¬ ÑÓ× Ð Ô ÖØ Ó Ý Ð Ö ÓÒ Ñ ÑÓÖ ½ Ô ÖØ Ö Ñ ÑÓÖ Ô Ö ÐÓ× Ö Ó× ½ ≡ ´½ µ Operate_On_Arcs <GT, Initialize_Dijkstra_Arc<GT, Distance> > () (g); ½ Ä Ö Ö Ñ ÑÓÖ Ô Ö ÐÓ× Ö Ó× ½ ≡ ´½ ½ µ Operate_On_Arcs <GT, Destroy_Dijkstra_Arc<GT, Distance> > () (g); ÒØ × ¬Ò Ö Ð Ô ÑÓ× ×Ô ¬ Ö Ð Ñ Ò Ö Ò ÕÙ × ÓÑÔ Ö Ò ÐÓ× ÔÓØ Ò¹ Ð× ½ ÓÑÔ Ö ÓÒ ÒØÖ ÔÓØ Ò Ð × ½ ≡ template <class GT, class Compare, class Distance> struct Compare_Arc_Data { bool operator () (typename GT::Arc * a1, typename GT::Arc * a2) const { return Compare () (POT(a1), POT(a2)); } }; ¬Ò × Compare Arc Data¸ Ò Ú Ö Ù× º Í× × POTº ×ØÓ ÒÓ× Ô ÖÑ Ø ÐÖÖ Ð Ô ½ Ð Ö ÓÒ Ô Ò ×ØÖ ½ ≡ ´½ ½ µ typedef Dijkstra_Heap_Info<GT, Distance, Compare> Acc_Heap; ArcHeap<GT, Distance, Compare, Acc_Heap> heap; Í× × ArcHeap ¼¿ Ò Dijkstra Heap Info ½¾ º 7.9.1.3 El algoritmo de Dijkstra Ð Ð ÓÖ ØÑÓ Ø Ò Ó× × × ÙÒ Ò Ð Þ ÓÒ ÓØÖ Ð ÙÐÓº Ä Ò Ð Þ ÓÒ Ô ÖØ Ð Ñ ÑÓÖ ÓÒ Ð Ô Ö Ð ×Ø Ò ÙÑÙÐ Ý ÐÓ× ÔÓØ Ò Ð × ½ ÁÒ Ð Þ Ö Ð ÓÖ ØÑÓ ×ØÖ ½ ≡ ´½ ½ µ clear_graph(tree); // limpiar arbol abarcador destino ´ Ô ÖØ Ö Ñ ÑÓÖ Ô Ö ÐÓ× ÒÓ Ó× ½¿ Ô ÖØ Ö Ñ ÑÓÖ Ô Ö ÐÓ× Ö Ó× ½ NODE_BITS(start_node).set_bit(Aleph::Dijkstra, true); ACC(start_node) = Distance::Zero_Distance; TREENODE(start_node) = tree.insert_node(start_node->get_info()); NODE_COOKIE(TREENODE(start_node)) = start_node; ÓÒ Ð Ô Ý Ð Ñ Ò Ó Ð Ñ ÑÓÖ ÑÓ× × Ö ÑÙÝ Ù Ó×Ó׺ Ð Ô Ù Ö Ö Ó׸ ÐÓ× Ù Ð × ×Ù Ú Þ Ñ ÒØ Ò Ò ÐÓ× ÔÓØ Ò Ð × Ô ÖØ Ó× Ò Ô ÖØ Ö Ñ ÑÓÖ Ô Ö ÐÓ× Ö Ó× ½ º Ò ×Ø × ÒØ Ó¸ × ÑÙÝ ÑÔÓÖØ ÒØ ÕÙ Ð Ô × ×ØÖÙÝ ÒØ × Ð Ð Ö ÓÒ Ñ ÑÓÖ ÙØ Ò Ð ÐÓÕÙ Ä Ö Ö Ñ ÑÓÖ Ô Ö ÐÓ× Ö Ó× ½ º Ë Ó ÙÖÖ Ð Ö Ú ×¸ ÒØÓÒ × Ð Ô Ö Ö Ò Ö ÓÓ × ÕÙ Ý Ù ÖÓÒ Ð Ö Ó׺ È Ö × ÙÖ Ö ×ØÓ¸ Ö Ö ÑÓ× ÙÒ ÐÓÕÙ ÒØ ÖÒÓ ÓÒ × Ð Ö Ö Ð Ôº × ÑÓ Ó¸ Ð ×ØÖÙ ØÙÖ Ò Ö Ð Ð Ð ÓÖ ØÑÓ ×ØÖ ÕÙ ÓÑÓ × Ù ½ Ð ÓÖ ØÑÓ ×ØÖ ½ ≡ ´ ½¾ µ ÁÒ Ð Þ Ö Ð ÓÖ ØÑÓ ×ØÖ ½
  • 742.
    716 Cap´ ıtulo 7. Grafos { // bloque adicional para asegurar que el heap se destruya antes que // los bloques almacenados en los cookies Ð Ö ÓÒ Ô Ò ×ØÖ ½ Å Ø Ö Ö Ó× Ò Ð× Ò Ô ½ Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ ×ØÖ ½ } // aqu´ se destruye el heap ı Ä Ö Ö Ñ ÑÓÖ Ô Ö ÐÓ× Ö Ó× ½ Ä Ö Ö Ñ ÑÓÖ Ô Ö ÐÓ× ÒÓ Ó× ½ Ð Ù Ð ÕÙ Ð Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ Ý Ð Ð ÓÖ ØÑÓ ÈÖ Ñ¸ ÑÓ× Ñ Ø Ö ÐÓ× Ö Ó× Ò Ó Ò Ð Ô ÒØ × Ò Ö Ð Ð ÙÐÓ ½ Å Ø Ö Ö Ó× Ò Ð × Ò Ô ½ ≡ ´½ ½ µ for (Node_Arc_Iterator<GT, SA> it(start_node); it.has_current(); it.next()) { typename GT::Arc * arc = it.get_current_arc(); POT(arc) = ARC_DIST(arc); ARC_BITS(arc).set_bit(Aleph::Dijkstra, true); heap.put_arc(arc, it.get_tgt_node()); } Í× × ARC DIST¸ Node Arc Iterator ¸ POT¸ Ò put arc ¼º ÍÒ Ú Þ ÕÙ ÐÓ× ÔÓØ Ò Ð × Ò Ð × ×Ø Ò Ò Ð Ô Ý Ð Ú ÐÓÖ ×Ø Ò ÒÙÐ Ò start node¸ × Ò Ð Ø Ö ÓÒ Ô Ö Ð ÙÐ Ö Ð Ö ÓÐ Ö ÓÖ ×ØÖ ¸ ÙÝ × Ö Ñ × ×ÓÒ Ñ ÒÓ× Ñ Ò ÑÓ× × Ð Ö Þ start node ½ Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ ×ØÖ ½ ≡ ´½ µ while (tree.get_num_nodes() < g.get_num_nodes()) // mientras tree no abarque a g { Ç Ø Ò Ö Ý ÔÖÓ × Ö ÔÖÓÜ ÑÓ Ö Ó ÓÒ Ñ ÒÓÖ ÔÓØ Ò Ð ½ ØÙ Ð Þ Ö ÔÓØ Ò Ð × Ý Ñ Ø ÖÐÓ× Ò Ô ½ } Ð ÐÓÕÙ Ö Ô Ø Ø ÚÓ × Ù Ò Ó tree Ö g¸ ÐÓ Ù Ð × Ø Ø Ù Ò Ó tree Ð ÒÞ Ð Ñ ×Ñ ÒØ ÒÓ Ó׺ Ð Ù Ð ÕÙ Ð Ð ÓÖ ØÑÓ ÈÖ Ñ¸ Ð ×ØÖ Ñ ÒØ Ò tree ÓÒ ÜÓ¸ ÐÓ ÕÙ Ô ÖÑ Ø Ø Ø Ö ÐÓ× ÔÓÖ × ÑÔÐ Ñ Ö Ó ÐÓ× ÒÓ Ó× Ú × Ø Ó׸ ×ÒÒ × ÙÒ ÔÖÙ Ð º ÈÓÖ ÑÓ ÙÐ Ö ¸ × ÑÙÝ ÓÒÚ Ò ÒØ Ú Ö Ð Ð ÙÐÓ ÒØ ÖÒÓ Ð Ð ÞÓ Ò Ó× Ô ÖØ × ×ØÖÙ ØÙÖ ÐÑ ÒØ ÒØ × Ð Ð Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ Ý Ð Ð ÓÖ ØÑÓ ÈÖ Ñ ½º ½ Ç Ø Ò Ö Ý ÔÖÓ × Ö ÔÖÓÜ ÑÓ Ö Ó ÓÒ Ñ ÒÓÖ ÔÓØ Ò Ð ½ ≡ ´ ½ ½ µ typename GT::Arc * garc = heap.get_min_arc(); // obtener arco menor potencial typename GT::Node * gsrc = g.get_src_node(garc); typename GT::Node * gtgt = g.get_tgt_node(garc); // ¿Est´n los dos nodos visitados? a if (IS_NODE_VISITED(gsrc, Aleph::Dijkstra) and IS_NODE_VISITED(gtgt, Aleph::Dijkstra)) continue; // ambos visitados ==> insertar este arco causar´a ciclo ı typename GT::Node * new_node = // seleccionar nodo no visitado IS_NODE_VISITED(gsrc, Aleph::Dijkstra) ? gtgt : gsrc; // insertar nuevo nodo en arbol y guardarlo en registro de nodo ´ typename GT::Node * ttgt = tree.insert_node(new_node->get_info()); TREENODE(new_node) = ttgt; NODE_BITS(new_node).set_bit(Aleph::Dijkstra, true);
  • 743.
    7.9. Caminos m´ ınimos 717 typename GT::Arc * tarc = // insertar nuevo arco en tree y guardarlo en registro tree.insert_arc(TREENODE(gsrc), TREENODE(gtgt), garc->get_info()); TREEARC(garc) = tarc; Í× × get min arc ¼ Ò TREEARCº ¾º ½ ØÙ Ð Þ Ö ÔÓØ Ò Ð × Ý Ñ Ø ÖÐÓ× Ò Ô ½ ≡ ´½ ½µ ACC(new_node) = POT(garc); // actualizar distancia recorrida desde nodo inicial const typename Distance::Distance_Type & acc = ACC(new_node); // por cada arco calcular potencial e insertarlo en heap for (Node_Arc_Iterator<GT, SA> it(new_node); it.has_current(); it.next()) { typename GT::Arc * arc = it.get_current_arc(); if (IS_ARC_VISITED(arc, Aleph::Dijkstra)) continue; ARC_BITS(arc).set_bit(Aleph::Dijkstra, true); typename GT::Node * tgt = it.get_tgt_node(); if (IS_NODE_VISITED(tgt, Aleph::Dijkstra)) continue; // nodo visitado ==> causar´ ciclo ==> no se mete en heap a POT(arc) = Plus () (acc, ARC_DIST(arc)); // calcula potencial heap.put_arc(arc, tgt); } Í× × ARC DIST¸ Node Arc Iterator ¸ POT¸ Ò put arc ¼º × ÑÔÓÖØ ÒØ Ö Ñ Ö Ö Ð ÓÒ ÕÙ ÔÓÖØ Ú Ö ¬ Ö × Ð ÒÓ Ó ×Ø ÒÓ Ð Ö Ó Ý × Ó Ú × Ø Óº Ò ØÓ¸ ר Ú Ö ¬ ÓÒ ÔÙ ÓÖÖ ÑÓ× ÙÒ Ò× Ö ÓÒ Ð Ô¸ ÙÝÓ Óר × O(Ð V)º Ó ×Ø Ñ ×Ñ Ð Ò Ó × ÖÚ ÓÒ¸ ÒÓØ ÑÓ× ÕÙ ÔÙ Ó ÙÖÖ Ö ÕÙ Ð ×Ø ÒÓ arc Ý Ý × Ó Ú × Ø Ó¸ ÔÙ × Ý ÔÙ Ü ×Ø Ö ÓØÖ Ú Ò× ÖØ Ò Ð Ô ÕÙ Ð Ò Ð ÒÓ Ó ×Ø ÒÓº ÈÓÖ × Ö ÞÓÒ¸ × Ò × Ö Ó ÕÙ Ò Ð ÐÓÕÙ Ç Ø Ò Ö Ý ÔÖÓ × Ö ÔÖÓÜ ÑÓ Ö Ó ÓÒ Ñ ÒÓÖ ÔÓØ Ò Ð ½ × Ú Ö ¬ÕÙ Ú × Ø ÐÓ× Ó× ÒÓ Ó× Ð Ö Óº Ð Ð ÓÖ ØÑÓ ×ØÖ ÔÙ ÑÔÐ ÒØ Ö× ÐÑ ÒØ ÓÒ Ñ ØÖ × Ý Ò ºÄ רÖÙ ØÙÖ × × Ñ Ð Ö ¸ Ò ÐÙ× Ú ¸ ÔÙ Ù Ö Ö× Ò ÙÒ Ñ ØÖ Þ ÕÙ ÓÒØ Ò ØÓ Ó× ÐÓ× ÔÖ× Ñ ÒÓ× Ñ Ò ÑÓ׺ ר Ø Ò × ×ØÙ Ö Ò Ü º º¾ ´Ô Ò ¾¼µº 7.9.1.4 C´lculo de un camino m´ a ınimo Ð Ð ÓÖ ØÑÓ ÒØ Ö ÓÖ Ð ÙÐ ÙÒ Ö ÓÐ Ö ÓÖ ÓÒ Ö Þ Ò Ð ÒÓ Ó ÓÖ Òº ËÙ× Ö Ñ × Ö ÔÖ × ÒØ Ò Ñ ÒÓ× Ñ Ò ÑÓ× × Ð ÓÖ Ò Ù ÐÕÙ Ö ÓØÖÓ ÒÓ Óº Ë ÐÓ ÕÙ × ÔÖ Ø Ò × ÓÒÓ Ö ÙÒ Ñ ÒÓ Ñ Ò ÑÓ ÒØÖ Ó× ÒÓ Ó׸ ÒØÓÒ × ÔÓ ÑÓ× ÓÖÖ Ö Ø ÑÔÓ Ù ÓÒ × Ø Ò ÑÓ× Ð Ð ÙÐÓ Ð Ö ÓÐ Ö ÓÖ ÙÒ Ú Þ ÕÙ × Ð Ò Ð ÒÓ Ó ×Ø ÒÓº ×ØÓ ÐÓ ÔÓ ÑÓ× ÔÐ ÒØ Ö Ð × Ù ÒØ Ñ Ò Ö ½ ÈÖÓØÓØ ÔÓ Ð Ð ÓÖ ØÑÓ ×ØÖ ½¾ +≡ ½¾ template <class GT, class Distance, class Compare, class Plus, class SA> inline void dijkstra_min_path(GT & g, typename GT::Node * start_node, typename GT::Node * end_node,
  • 744.
    718 Cap´ ıtulo 7. Grafos L 4 M 2 N 3 O 6 P L 4 M 2 N 3 O 6 P 10 12 10 8 3 1 3 1 1 7 10 12 10 8 3 1 3 1 1 7 F 5 G 15 H I J 4 K F 5 G 15 H I J 4 K 2 2 2 2 9 4 1 7 3 2 1 2 5 2 9 4 1 7 3 2 1 2 5 2 A 3 B 4 C 3 D 4 E A 3 B 4 C 3 D 4 E ´µ ´ µ L 4 M 2 N 3 O 6 P L 4 M 2 N 3 O 6 P 10 12 10 8 3 1 3 1 1 7 10 12 10 8 3 1 3 1 1 7 F 5 G 15 H I J 4 K F 5 G 15 H I J 4 K 2 2 2 2 9 4 1 7 3 2 1 2 5 2 9 4 1 7 3 2 1 2 5 2 A 3 B 4 C 3 D 4 E A 3 B 4 C 3 D 4 E ´µ ´ µ L 4 M 2 N 3 O 6 P L 4 M 2 N 3 O 6 P 10 12 10 8 3 1 3 1 1 7 10 12 10 8 3 1 3 1 1 7 F 5 G 15 H I J 4 K F 5 G 15 H I J 4 K 2 2 2 2 9 4 1 7 3 2 1 2 5 2 9 4 1 7 3 2 1 2 5 2 A 3 B 4 C 3 D 4 E A 3 B 4 C 3 D 4 E ´µ ´µ ÙÖ º ÈÖÓ Ö ×Ó Ð Ð ÓÖ ØÑÓ ×ØÖ ÓÒ Ö Þ Ò Ð ÒÓ Ó ´ ¬ ÙÖ ÓÖÖ ×¹ ÔÓÒ ØÖ × Ø Ö ÓÒ ×µ Path<GT> & min_path) { GT tree; // arbol abarcador temporal ´ ÁÒ Ð Þ Ö Ð ÓÖ ØÑÓ ×ØÖ ½ { Ð Ö ÓÒ Ô Ò ×ØÖ ½ Å Ø Ö Ö Ó× Ò Ð× Ò Ô ½ Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ ×ØÖ Ô Ö Ð ½ } Ù× Ö Ò ØÖ Ñ ÒÓ ÒØÖ ×Ø ÖØ ÒÓ Ý Ò ÒÓ ½ Ä Ö Ö Ñ ÑÓÖ Ô Ö ÐÓ× Ö Ó× ½ Ä Ö Ö Ñ ÑÓÖ Ô Ö ÐÓ× ÒÓ Ó× ½ } Í× × Path ¼¾ º Ä ÔÖ Ñ Ö Ô ÖØ Ð Ð ÓÖ ØÑÓ × ÑÙÝ × Ñ Ð Ö Ð ÐÓÕÙ Ð ÓÖ ØÑÓ ×ØÖ ½ º Ä ÙÒ Ö Ò ×Ø ÔÓÖ Ð ÐÓÕÙ Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ ×ØÖ Ô Ö Ð ½ ÙÝ ×ØÖÙ ØÙÖ × Ô Ö Ð ÐÓÕÙ Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ ¹ ×ØÖ ½ ¸ × ÐÚÓ ÕÙ ¸ Ô Ö ÓÖÖ Ö Ø ÑÔÓ Ù ÓÒ¸ Ð Ð ÙÐÓ Ð Ö ÓÐ Ö ÓÖ × Ø Ò Ù Ò Ó × Ñ Ö Ð ÒÓ Ó ×Ø ÒÓ end node¸ Ó × ¸ Ù Ò Ó gtgt == end node ½ Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ ×ØÖ Ô Ö Ð ½ ≡ ´½ µ while (tree.get_num_nodes() < g.get_num_nodes()) // mientras tree no abarque a g {
  • 745.
    7.9. Caminos m´ ınimos 719 Ç Ø Ò Ö Ý ÔÖÓ × Ö ÔÖÓÜ ÑÓ Ö Ó ÓÒ Ñ ÒÓÖ ÔÓØ Ò Ð ½ if (gtgt == end_node) // ¿est´ end_node en arbol abarcador? a ´ break; // s´ ==> camino m´nimo ya est´ en arbol abarcador ı ı a ´ ØÙ Ð Þ Ö ÔÓØ Ò Ð × Ý Ñ Ø ÖÐÓ× Ò Ô ½ } Ð Ø ÖÑ ÒÓ ×Ø ÐÓÕÙ ¸ tree ÓÒØ Ò ÙÒ Ö ÓÐ Ö ÓÖ¸ ÔÖÓ Ð Ñ ÒØ Ô Ö Ð¸ ÕÙ ÓÒØ Ò ÙÒ Ñ ÒÓ Ñ Ò ÑÓ × start node ר end nodeº ÄÓ ÔÖ Ñ ÖÓ ÕÙ ÑÓ׸ Ô٠׸ × Ò ÓÒØÖ Ö × Ñ ÒÓ Ñ Ò ÑÓ ½ Ù× Ö Ò ØÖ Ñ ÒÓ ÒØÖ ×Ø ÖØ ÒÓ Ý Ò ÒÓ ½ ≡ ´½ µ ½ Path<GT> tree_min_path(tree, TREENODE(start_node)); find_path_depth_first(tree, TREENODE(start_node), TREENODE(end_node), tree_min_path); Í× × Path ¼¾ º tree min pathÓÒØ Ò Ð Ñ ÒÓ Ñ Ò ÑÓ Ò tree¸ Ô ÖÓ ÐÓ ÕÙ × ÑÓ× × Ð Ñ ÒÓ Ñ Ò ÑÓ Ò gº × Ô٠׸ Ð × Ù ÒØ × ÓÒ× ×Ø Ò ÓÔ Ö¸ × Ù Ò Ó Ð Ñ Ô Ó¸ Ð Ñ ÒÓ tree min pathÐ Ô Ö Ñ ØÖÓ min path ½ Ù× Ö Ò ØÖ Ñ ÒÓ ÒØÖ ×Ø ÖØ ÒÓ Ý Ò ÒÓ ½ +≡ ´ ½ µ ½ min_path.clear_path(); min_path.init(start_node); typename Path<GT>::Iterator it(tree_min_path); for (it.next(); it.has_current(); it.next()) min_path.append(GRAPHNODE(it.get_current_node())); Í× × Path ¼¾ º 7.9.1.5 Correctitud del algoritmo de Dijkstra ÍÒ ×ÙÒØÓ × Ò Ð ÓÒÓ Ñ ÒØÓ × ÕÙ Ð Ð ÓÖ ØÑÓ ×ØÖ ÒÓ ÓÔ Ö ÓÖÖ Ø Ñ ÒØ Ô Ö Ö Ó× Ò Ø ÚÓ׺ Ð Ð ÓÖ ØÑÓ ×ÙÑ ÕÙ Ð ×Ø Ò ØÓØ Ð × Ð ÒÓ Ó ÓÖ Ò ÒÓ 2 3 -2 0 2 1 ÙÖ º ÑÔÐÓ Ö Ó Ò Ø ÚÓ ÕÙ ÐÐ Ö Ð Ð ÓÖ ØÑÓ ×ØÖ Ö ÔÖ Ñ × ÙÒ Ñ ÒØ Ð Ô Ö Ù Ö Ô ÖØ Ò Ò ÙÒ Ö Ó Ð Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ ÓÒ Ö Þ Ò Ð ÒÓ Ó ÓÖ Òº ÓÒ× Ö ÑÓ׸ ÔÓÖ ÓÒØÖ ¹ ÑÔÐÓ¸ Ð Ö Ó Ð ¬ ÙÖ º Ý ÓÖ Ò Ò Ð ÒÓ Ó 0º Ð Ð ÓÖ ØÑÓ ×ØÖ × Ð ÓÒ ÓÑÓ Ö ÓÐ Ö ÓÖ ÐÓ× Ö Ó× 0 −→ 2 Ý 0 −→ 1¸ ÐÓ ÕÙ ¸ Ð× Ñ ÒØ ¸ Ð Ö Ó 0 −→ 2 ÓÑÓ Ð Ñ ÒÓ Ñ Ò ÑÓ × 0 ר 2 ÓÒ Óר 3¸ Ù Ò Ó Ð Ñ Ò ÑÓ × 0 −→ 1 −→ 2 ÓÒ Óר 0º Ê Ð Þ Ð Ð Ö ØÓÖ ÒØ Ö ÓÖ¸ ÔÓ ÑÓ× ×Ø Ð Ö Ð ÓÖÖ Ø ØÙ Ó Ð × Ù ÒØ ÔÖÓÔÓ× ÓÒ Proposici´n 7.5 o Ë G ÙÒ Ö Ó ÓÒ ÜÓ Ù ÐÕÙ Ö º ÒØÓÒ × Ð Ð ÓÖ ØÑÓ ×ØÖ ×Ó Ö ÙÒ ÒÓ Ó ÓÖ Ò v Ò Ù ÒØÖ ÙÒ Ö ÓÐ Ö ÓÖ ÓÒØ ÒØ ÚÓ ØÓ Ó× ÐÓ× Ñ ÒÓ× Ñ Ò ÑÓ× × vº
  • 746.
    720 Cap´ ıtulo 7. Grafos Demostraci´n (por contradicci´n inductiva sobre la cantidad de nodos V) o o ËÙÔÓÒ ÙÒ Ö Ó ÓÒ ÜÓ G =< V, E >¸ ÙÒ ÒÓ Ó v ∈ V Ö Þ ÙÒ Ö ÓÐ Ö ÓÖ ×ØÖ Ý ÙÒ Ö ÓÐ Ö ÓÖ T =< V, E >º Ð ÙÒ Ñ ÒØÓ Ð ÑÓ×ØÖ ÓÒ ×ØÖ Ò ×ÙÔÓÒ Ö ÕÙ Ü ×Ø ÙÒ Ö Ó a ∈ E º / ½º V =2 Ò ×Ø ×Ó¸ Ð Ö ÓÐ Ö ÓÖ × Ð ÒÓ Ó ÓÖ Ò Ø Ò ÙÒ ×ÓÐÓ Ö Ó Ð Ù Ð × Ð Ñ Ò ÑÓ × ÙÒ Ð Ð ÓÖ ØÑÓº Ò ×Ø ×Ó¸ a ∈ E × ÙÒ ÓÒØÖ / ÓÒ¸ ÔÙ × Ð Ô Ö ÒØ Þ ÕÙ Ð ÔÖ Ñ Ö Ö Ó ÕÙ × ÔÖÓ × × Ð Ñ Ò ÑÓ Ý ÒØ vº ¾º ÓÖ ×ÙÔÓÒ ÑÓ× ÕÙ Ð ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö ØÓ Ó V ≤ n Ý ÓÒר Ø ÑÓ× × ÐÓ × Ô Ö V = n + 1º Ë v ∈ V Ð ÒÓ Ó ÓÖ Ò Ð Ö ÓÐ Ö ÓÖ Ý w ÙÒ ÒÓ Ó ×Ø ÒÓ ÕÙ Ò Ð Ø Ö ÓÒ n ÒÓ × Ò Ù ÒØÖ Ò Ð Ö ÓÐ Ö ÓÖ T º Ë ×ÙÑ ÑÓ× ÕÙ w × Ð ÙÐØ ÑÓ ÒÓ Ó Ò ÐÙ Ö Ò T ¸ ÒØÓÒ ×¸ ÐÙ Ó Ð Ø Ö ÓÒ n + 1¸ ×ÙÑ ÑÓ× ÕÙ ∃a ∈ E | a × / Ñ Ò ÑÓ ÒØÖ v Ý wº Ë w × Ð ÙÐØ ÑÓ ÒÓ Ó Ò ÐÙ Ö Ò T ¸ ÒØÓÒ × Ð Ô ÓÒØ Ò Ö Ó× ÕÙ ¸ Ó ÓÒ ÓÖÑ Ò ÐÓ× Ó ÓÒ Ø Ò wº ÄÓ× Ö Ó× ÕÙ ÓÒ ÓÖÑ Ò ÐÓ× ÒÓ ×ÓÐÓ ÒÓ Ô ÖØ Ò Ò T ¸ × ÒÓ ÕÙ ÒÓ ÔÙ Ò × Ö Ñ Ò ÑÓ× ÔÙ × ÙÒ ÐÓ ÙÑ ÒØ Ð Óר º × Ô٠׸ ×ÓÐÓ ÒÓ× ÒØ Ö × Ò ÐÓ× Ö Ó× Ò Ð Ô Ð Ø ÔÓ x −→ w ÕÙ ÓÒ Ø Ò ÙÒ ÒÓ Ó x ∈ V ÓÒ wº ÈÙ ×ØÓ ÕÙ Ð Ô ×Ø ÓÖ Ò Ó ÔÓÖ ÐÓ× ÔÓØ Ò Ð × × w ר x¸ Ð Ð ÓÖ ØÑÓ ×ØÖ × Ö Ð Ö Ó ÓÒ Ñ ÒÓÖ Óר ØÓØ Ð × vº ÓÖ Ò¸ Ð Ü ×Ø Ò ÙÒ Ö Ó Ñ Ò ÑÓ a ∈ E × ÙÒ ÓÒØÖ / ÓÒ¸ Ô٠׸ Ð ÙÐØ ÑÓ Ö Ó x −→ w ÓÖÖ ×ÔÓÒ ÙÒ Óר ØÓØ Ð Ñ Ò ÑÓ ÒØÖ v Ý w 7.9.1.6 An´lisis del algoritmo de Dijkstra a Ð Ò Ð × × × ÔÖ Ø Ñ ÒØ × Ñ Ð Ö Ð Ð Ð ÓÖ ØÑÓ ÈÖ Ñ¸ ÔÙ × Ð × ×ØÖÙ ØÙÖ × ­Ù Ó Ñ Ó× Ð ÓÖ ØÑÓ× ×ÓÒ Ð × Ñ ×Ñ ×º ÄÓ× ÐÓÕÙ × Ò Ð Þ ÓÒ Ô ÖØ Ö Ñ ÑÓÖ Ô Ö ÐÓ× ÒÓ Ó× ½¿ Ý Ô ÖØ Ö Ñ ÑÓÖ Ô Ö ÐÓ× Ö Ó× ½ ÓÒ×ÙÑ Ò O(V) + O(E)¸ ÐÓ Ù Ð¸ ÔÙ ×ØÓ ÕÙ Ð Ö Ó × ÓÒ ÜÓ¸ ÔÙ ÓÒ× Ö Ö× O(E)º ÄÓ Ñ ×ÑÓ Ó ÙÖÖ Ô Ö ÐÓ× ÐÓÕÙ × ¬Ò Ð × Ä Ö Ö Ñ ÑÓÖ Ô Ö ÐÓ× Ö Ó× ½ Ý Ä Ö Ö Ñ ÑÓÖ Ô Ö ÐÓ× ÒÓ Ó× ½ º × Ô٠׸ Ð Ò Ð × × × ÒØÖ Ò ÓÒØ Ð Þ Ö Ð × Ø Ö ÓÒ × Ð ÐÓÕÙ Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ ×ØÖ ½ ¸ ÙÝÓ Ò Ð × × × ÒØ Ó Ð Ð Ð ÓÖ ØÑÓ ÈÖ Ñ¸ ÔÙ × Ð ×ØÖÙ ØÙÖ × Ð Ñ ×Ñ Ý Ð Ð ÓÖ ØÑÓ ×ØÖ Ø Ñ Ò Ù× Ð Ô Ü ÐÙ× ÚÓº Ð ÐÓÕÙ Ð ÙÐ Ö Ö ÓÐ Ö ÓÖ ×ØÖ ½ Ø Ò ÙÒ ÓÑÔÐ Ò Ø ÑÔÓ O(E Ð V)¸ Ù Ð × Ð × ÑÔ ÒÓ ¬Ò Ø ÚÓ Ð Ð ÓÖ ØÑÓ ×ØÖ º 7.9.2 Algoritmo de Floyd-Warshall Ð Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ Ð ÙÐ ØÓ Ó× ÐÓ× Ñ ÒÓ× Ñ Ò ÑÓ× ÒØÖ Ô Ö × ÒÓ Ó׺ × ÙÒ Ú Ö ÒØ Ð Ð ÓÖ ØÑÓ Ï Ö× ÐÐ Ô Ö Ð ÙÐ Ö Ð Ð Ù×ÙÖ ØÖ Ò× Ø Ú ×ØÙ Ó Ò Ü º º ´Ô Ò ½µº ÓÑÓ Ø Ð¸ ÓÔ Ö ×Ó Ö Ñ ØÖ × Ý Ò Ý ÔÓ× Ð Ú ÖØÙ ÓÔ Ö Ö ÓÒ Ô ×Ó× Ò Ø ÚÓ׺ ÈÙ ÔØ Ö× Ô Ö Ø Ø Ö Ý Ø ÖÑ Ò Ö ÐÓ× Ò Ø ÚÓ׺ Ð Ð ÓÖ ØÑÓ Ù ÔÖ Ñ Ö Ñ ÒØ Ö ÔÓÖØ Ó × Ù ÖØÓ ÔÓÖ ÐÓÝ ½½ ¸ Ô ÖÓ¸ ÔÙ ×ØÓ ÕÙ ×ØÖÙ ØÙÖ ÐÑ ÒØ × × Ñ Ð Ö Ð Ï Ö× Ðи ×Ù Ð ÐÐ Ñ Ö× Ð ÐÓÝ ¹Ï Ö× ÐÐ º Ä ×Ô ¬ ÓÒ Ð Ð ÓÖ ØÑÓ × Ò Ù ÒØÖ Ò Ð Ö ÚÓ Floyd.Hº
  • 747.
    7.9. Caminos m´ ınimos 721 7.9.2.1 Interfaces Ð Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ Ñ Ò Ð × × Ù ÒØ × ÒØ Ö × ½º ¾½ ÁÒØ Ö × Ð Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ ¾½ ≡ template <class GT, typename Distance, class Compare, class Plus, class SA> void floyd_all_shortest_paths (GT & g, Ady_Mat<GT, typename Distance::Distance_Type, SA> & dist, Ady_Mat<GT, long, SA> & path); Í× × Ady Mat Ò floyd all shortest paths ¾½ º Ä ÖÙØ Ò Ö Ù ØÖÓ Ô Ö Ñ ØÖÓ× Ø ÔÓ ´ µ GT Ð Ø ÔÓ Ö Ó ´Ó Ö Óµº ´ µ Distance × Ð Ð × ÕÙ Ñ Ò Ð × ×Ø Ò ×º Å Ò Ñ ÐÑ ÒØ ¸ ר ÜÔÓÖØ Ö ÐÓ× ØÖ ÙØÓ× × Ù ÒØ × ÜÔÐ Ó× Ò Ü º º½ ´Ô Ò µ º Distance Typeº Ö Ó׺ º Max Distanceº º Zero Distance Úº operator () (typename GT::Arc *)º ´ µ Compare Ð × ÓÑÔ Ö ÓÒ ÒØÖ ×Ø Ò ×º ´ µ Plus Ð × ×ÙÑ ÒØÖ ×Ø Ò ×º ´ µ SA ¬ÐØÖÓ Ö Ó׺ ÄÓ× Ô Ö Ñ ØÖÓ× Ð ÖÙØ Ò ×ÓÒ ´ µ g Ð Ö Ó Ó Ö Ó Ö ÔÖ × ÒØ Ó Ñ ÒØ ÙÒ Ú Ö ÒØ List Graph<Node, Arc>º ´ µ dist Ñ ØÖ Þ Óר × Ñ Ò ÑÓ× ÒØÖ Ô Ö × ÒÓ Ó׺ ÒØÖ ×Øi,j ÓÒØ Ò Ð Óר Ñ Ò ÑÓ ÒØÖ ÐÓ× ÒÓ Ó× Ò × Ò Ð Ñ ØÖ Þ Ý Ò i Ý j Ö ×Ô Ø Ú Ñ ÒØ º ´ µ path Ñ ØÖ Þ Ö ÙÔ Ö ÓÒ Ñ ÒÓ׺ ÒØÖ Ô Ø i,j ÓÒØ Ò Ð ÒÓ Ó k ÕÙ Ô × ÔÓÖ Ð Ñ ÒÓ Ñ Ò ÑÓ ÒØÖ i Ý jº ÁÒ×Ô ÓÒ × ×Ù × Ú × Ô Ø k,j ר ÕÙ Ô Ø k,j = j Ô ÖÑ Ø Ò Ö ÙÔ Ö Ö × Ò Ù×ÕÙ Ð Ñ ÒÓ Ñ Ò ÑÓ ÒØÖ Ð Ô Ö < i, j >º Ä ÖÙØ Ò ÒØ Ö ÓÖ × ÑÔÐ ÒØ Ö Ò Ð × Ù ÒØ ÐÓÕÙ ¾½ ÊÙØ Ò × Ð Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ ¾½ ≡ template <class GT, typename Distance, class Compare, class Plus, class SA> void floyd_all_shortest_paths (GT & g, Ady_Mat<GT, typename Distance::Distance_Type, SA> & dist, Ady_Mat<GT, long, SA> & path) { ÁÒ Ð Þ Ö Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ ¾¿ Ð ÓÖ ØÑÓ ÐÓÝ ¾ } ¬Ò × floyd all shortest paths¸ Ù× Ò ÙÒ ¾½ º Í× × Ady Mat º
  • 748.
    722 Cap´ ıtulo 7. Grafos ¾º ¾¾ Ê ÙÔ Ö ÓÒ Ñ ÒÓ× ¾¾ ≡ ¾¾ template <class Mat> void find_min_path(Mat & p, const long & src_index, const long & tgt_index, Path<typename Mat::List_Graph_Type> & path); Í× × find min path ¾ Ò Path ¼¾ º ÙÒ Ñ ØÖ Þ Ñ ÒÓ× Ñ Ò ÑÓ× Ð ÙÐ Ñ ÒØ floyd all shortest paths()¸ Ð ÖÙØ Ò ÓÒרÖÙÝ ÙÒ Ñ ÒÓ Ñ Ò ÑÓ ÒØÖ ÐÓ× Ô Ö × ÒÓ Ó× ÓÒ Ò × src index Ý tgt indexº ¿º ¾¾ Ê ÙÔ Ö ÓÒ Ñ ÒÓ× ¾¾ +≡ ¾¾ ¾ template <class Mat> void find_min_path(Mat & p, typename Mat::Node * src_node, typename Mat::Node * tgt_node, Path<typename Mat::List_Graph_Type> & path) { find_min_path(p, p(src_node), p(tgt_node, path); } Í× × find min path ¾ Ò Path ¼¾ º Ë Ñ Ð Ö Ð ÒØ Ö ÓÖ¸ × ÐÚÓ ÕÙ ÐÓ× ÒÓ Ó× × ×Ô ¬ Ò Ö Ø Ñ ÒØ Ñ ÒØ ÔÙÒØ ÖÓ× Ò Ð Ö ÔÖ × ÒØ ÓÒ ÓÒ Ð ×Ø × ÒÐ Þ ×º 7.9.2.2 El algoritmo de Floyd-Warshall Ë Ñ Ð Ö Ð Ï Ö× Ðи Ð Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ ÑÔÐ ØÖ × Ð ÞÓ× ÕÙ ÜÔÐÓÖ Ò¸ ÓÑÔ Ö Ò Ý × Ð ÓÒ Ò ÐÓ× Ñ ÒÓ× ÐÓÒ ØÙ 1, 2, . . . V ר Ù Ö Ö Ð ÒÙÑ ÖÓ ÒÓ Ó׺ Inicializaci´n o Ä × ÓÒ× ×Ø Ò ÓÒ× Ö Ö ÒÓ Ó× ÒØ ÖÑ Ó× Ñ ÒÓ× Ñ × ÓÖØÓ× Ó Ð Ñ ×ÑÓ ÔÖ Ò Ô Ó Ð Ï Ö× Ðк È Ö ÐÐÓ¸ Ð Ð ÓÖ ØÑÓ ÙØ Ð Þ ÙÒ Ñ ØÖ Þ ×Øi,j ר Ò × n × n ÙÝÓ× Ú ÐÓÖ × Ò Ð × Ó Ò ÐÓ × Ù ÒØ ⎧ ⎪ ⎨ × Ü ×Ø Ö Ó ÒØÖ i Ý j ⎪Ci,j רi,j = ⎪∞ 0 × ÒÓ Ü ×Ø Ö Ó ÒØÖ i Ý j ; ´ºµ ⎪ ⎩0 × i=j Ci,j × Ð Ô ×Ó Ð Ö Ó ÒØÖ Ð ÒÓ Ó i Ý jº Ó ÙÒ Ö Ó¸ ÐÓ× Ú ÐÓÖ × Ò Ð × × ÓÐÓ Ò Ñ ÒØ Ð × Ù ÒØ Ð × ¾¾ ÁÒ Ð Þ ÓÒ Ñ ØÖ × ¾¾ ≡ template <class AM, class Distance, class SA> struct Initialize_Dist_Floyd { typedef typename AM::List_Graph_Type::Arc_Type Arc_Type; typedef typename AM::List_Graph_Type GT; typedef typename GT::Node Node; typedef typename GT::Arc Arc;
  • 749.
    7.9. Caminos m´ ınimos 723 typedef typename Distance::Distance_Type Distance_Type; // inicializa cada entrada de la matriz void operator () (AM & mat, Node * src, Node * tgt, const long & i, const long & j, Distance_Type & entry, void * p) const { Ady_Mat <typename AM::List_Graph_Type, long, SA> & path = * reinterpret_cast <Ady_Mat <typename AM::List_Graph_Type, long> *> (p); if (i == j) // ¿es diagonal de la matriz? { // s´ ==> la distancia es cero ı entry = Distance::Zero_Distance; path(i, j) = j; return; } GT & g = mat.get_list_graph(); Arc * arc = search_arc(g, src, tgt); // arco en representaci´n con listas o if (arc == NULL) // ¿existe un arco? { // s´ ==> se coloca coste infinito ı entry = Distance::Max_Distance; return; } // existe arco ==> extraiga distancia entry = Distance () (arc); // la coloca en cost(i, j) path(i, j) = j; // coloca camino directo } }; ¬Ò × Initialize Dist Floyd¸ Ù× Ò ÙÒ ¾¿ º Í× × Ady Mat º ר ÓÔ Ö ÓÖ × ÒÚÓ Ó Ò Ð × Ð Ò Ð Þ ÓÒ Ð Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ ¾¿ ÁÒ Ð Þ Ö Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ ¾¿ ≡ ´ ¾½ µ ¾¿ typedef typename Distance::Distance_Type Dist_Type; typedef Ady_Mat <GT, Dist_Type> Dist_Mat; dist.template operate_all_arcs_matrix <Initialize_Dist_Floyd <Dist_Mat, Distance, SA> > (&path); Í× × Ady Mat ¸ Initialize Dist Floyd ¾¾ ¸ Ò operate all arcs matrix º ÄÓ ÕÙ Ð × Ñ ØÖ × Ò ÐÓ× ×Ø Ó× Ò Ð × × ÙÒ ´ º µº Ð Ö ×ØÓ Ð × Ò Ð Þ ÓÒ × ¬ Ö Ð ÙÒ × ÓÒר ÒØ × Ñ Ò Ö ÐØ Ö Ð ØÖ Ó ÓÔØ Ñ Þ ÓÒ Ð ÓÑÔ Ð ÓÖ ¾¿ ÁÒ Ð Þ Ö Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ ¾¿ +≡ ´ ¾½ µ ¾¿ const Dist_Type & max = Distance::Max_Distance; const long & n = g.get_num_nodes(); El algoritmo de Floyd-Warshall ÓÑÓ Ý ÐÓ × Ò Ð ÑÓ׸ Ð Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ ÙØ Ð Þ ØÖ × Ð ÞÓ× Ò Ó× ÕÙ ÜÔÐÓÖ Ò Ñ ÒÓ× ÔÓ× Ð × Ý Ò Ð Ñ Ò ÑÓº Ò ÙÒ Ø Ö ÓÒ k¸ ÒØÖ ×Øk i,j ÓÒØ Ò Ð Óר Ñ Ò ÑÓ Ô Ö Ö Ð ÒÓ Ó i Ð ÒÓ Ó j ÓÒ ÙÒ Ö Ó ÐÓÒ ØÙ
  • 750.
    724 Cap´ ıtulo 7. Grafos kº È ØÓÖ Ñ ÒØ ¸ Ò Ð k¹ × Ñ Ø Ö ÓÒ¸ Ð Ù ×Ø ÓÒ × ÔÙ ÔÐ ÒØ Ö Ð × Ù ÒØ ÑÒÖ k רk−1 i,k רk−1 k,j i j רk−1 i,j Ì Ò ÑÓ× ÙÒ Óר רk−1 ÔÖ Ú Ñ ÒØ Ð ÙÐ Ó Ô Ö Ö × Ð ÒÓ Ó i ר Ð jº ÓÖ Ð i,j Ù ×Ø ÓÒ ÓÒ× ×Ø Ò Ù× Ö × Ò Ó× Ñ ÒÓ× Ô Ö Ð × ( i, k) Ý ( k, j)¸ ÓÒ ×Ø Ò × Ô Ö Ð × ×Øk−1 Ý ×Øk−1¸ Ö ×Ô Ø Ú Ñ ÒØ ¸ Ý Ú ÐÙ Ö × ×Øk−1 + רk−1 × Ñ ÒÓ× ÓרÓ×Ó ÕÙ i,k k,j i,k k,j רi,j º ÓÖÑ ÐÑ ÒØ ¸ Ð k−1 × ÓÒ × ÔÐ ÒØ Ð × Ù ÒØ ÑÓ Ó ×Øk = Ñ Ò ×Øk−1 i,j ´ºµ i,j רk−1 + רk−1 i,k k,j Ä Ù Ð × ÑÓ Ð Þ Ñ Ò Ö × Ñ Ð Ö Ð Ð ÓÖ ØÑÓ Ï Ö× ÐÐ ¾ Ä ÞÓ Ð Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ ¾ ≡ for (int k = 0; k < n; ++k) for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) if (dist(i, k) + dist(k, j) < dist(i, j)) dist(i, j) = dist(i, k); Ä Ö Ò × Ò Ð ÓÒ Ð Ð ÓÖ ØÑÓ Ï Ö× ÐÐ × ÕÙ Ð if × Ü ×Ø ÙÒ Ñ ÒÓ Ñ ÒÓÖ Óר ÕÙ Ô × ÔÓÖ ÙÒ Ñ ÒÓ ÓÒ ÒÓ Ó ÒØ ÖÑ Ó kº À Ý ÙÒ ÓÔØ Ñ ÓÒ Ð Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ ÓÒ× ×Ø ÒØ Ò Ó × ÖÚ Ö ÕÙ ¸ × Ð ÒØÖ ×Øk−1 = ∞¸ ÒØÓÒ ×¸ ÓÒ ÖØ ØÙ ¸ ÒÓ Ö ÙÒ Ñ ÒÓ Ñ × ÓÖØÓ ÕÙ Ô × i,j ÔÓÖ Ð ÒÓ Ó ÒØ ÖÑ Ó kº Ò ÙÒ ÓÒ ×Ø Ó × ÖÚ ÓÒ¸ ÔÓ ÑÓ× ÔÐ ÒØ Ö ÙÒ Ú Ö ÒØ ÕÙ ÓÖÖ Ð × Ø Ö ÓÒ × Ð Ð ÞÓ Ñ × ÒØ ÖÒÓ ¾ Ð ÓÖ ØÑÓ ÐÓÝ ¾ ≡ ´ ¾½ µ for (int k = 0; k < n; ++k) for (int i = 0; i < n; ++i) if (dist(i, k) < max) // ¿es posible encontrar una distancia menor? for (int j = 0; j < n; ++j) { // calcule nueva distancia pasando por k Dist_Type new_dist = Plus () (dist(i, k), dist(k, j)); if (Compare () (new_dist, dist(i,j))) // ¿d(i,j) < d(i,k) + d(k,j)? { dist(i, j) = new_dist; // actualice menor distancia path(i, j) = path(i, k); // actualice nodo intermedio } } Ê ÓÖ ÑÓ× ÕÙ Plus::operator()() ÑÔÐ Ñ ÒØ Ð ×ÙÑ ¸ Ñ ÒØÖ × ÕÙ Compare::operator()() Ð ÓÑÔ Ö ÓÒº Ä ØÙ Ð Þ ÓÒ Ð Ñ ØÖ Þ Ô Ø i,j × Ö ÜÔÐ Ò Ü º º¾º ´Ô Ò ¾ µº È Ö Ð Ö Ó Ð ¬ ÙÖ º Ð Ð ÓÖ ØÑÓ Ð ÙÐ Ð × × Ù ÒØ × Ñ ØÖ × ÔÓÖ Ø Ö ÓÒ
  • 751.
    7.9. Caminos m´ ınimos 725 -2 B 3 D H 2 1 -2 3 4 2 5 3 -1 -1 A F G 3 2 2 4 1 -1 C E I 4 -4 ÙÖ º ÍÒ Ö Ó ÓÒ ×Ø Ò × Ò Ø Ú × À Á À Á 0 2 ∞ ∞ ∞ 5 ∞ ∞ ∞ ∞ 0 ∞ 3 ∞ 1 ∞ ∞ ∞ 1 ∞ 0 ∞ 4 ∞ ∞ ∞ ∞ D0 ∞ ∞ ∞ 0 ∞ 2 ∞ 4 ∞ P0 À ∞ ∞ ∞ ∞ 0 ∞ 2 ∞ −2 Á ∞ ∞ −1 −2 2 0 ∞ ∞ ∞ ∞ ∞ ∞ 3 ∞ −1 0 2 ∞ À À ∞ ∞ ∞ −2 ∞ ∞ −1 0 ∞ À À Á ∞ ∞ ∞ ∞ ∞ ∞ 4 3 0 Á À Á À Á À Á 0 2 ∞ ∞ ∞ 5 ∞ ∞ ∞ ∞ 0 ∞ 3 ∞ 1 ∞ ∞ ∞ 1 3 0 ∞ 4 6 ∞ ∞ ∞ D1 ∞ ∞ ∞ 0 ∞ 2 ∞ 4 ∞ P1 À ∞ ∞ ∞ ∞ 0 ∞ 2 ∞ −2 Á ∞ ∞ −1 −2 2 0 ∞ ∞ ∞ ∞ ∞ ∞ 3 ∞ −1 0 2 ∞ À À ∞ ∞ ∞ −2 ∞ ∞ −1 0 ∞ À À Á ∞ ∞ ∞ ∞ ∞ ∞ 4 3 0 Á À Á À Á À Á 0 2 ∞ 5 ∞ 3 ∞ ∞ ∞ ∞ 0 ∞ 3 ∞ 1 ∞ ∞ ∞ 1 3 0 6 4 4 ∞ ∞ ∞ D2 ∞ ∞ ∞ 0 ∞ 2 ∞ 4 ∞ P2 À ∞ ∞ ∞ ∞ 0 ∞ 2 ∞ −2 Á ∞ ∞ −1 −2 2 0 ∞ ∞ ∞ ∞ ∞ ∞ 3 ∞ −1 0 2 ∞ À À ∞ ∞ ∞ −2 ∞ ∞ −1 0 ∞ À À Á ∞ ∞ ∞ ∞ ∞ ∞ 4 3 0 Á À Á À Á À Á 0 2 ∞ 5 ∞ 3 ∞ ∞ ∞ ∞ 0 ∞ 3 ∞ 1 ∞ ∞ ∞ 1 3 0 6 4 4 ∞ ∞ ∞ D3 ∞ ∞ ∞ 0 ∞ 2 ∞ 4 ∞ P3 À ∞ ∞ ∞ ∞ 0 ∞ 2 ∞ −2 Á 0 2 −1 −2 2 0 ∞ ∞ ∞ ∞ ∞ ∞ 3 ∞ −1 0 2 ∞ À À ∞ ∞ ∞ −2 ∞ ∞ −1 0 ∞ À À Á ∞ ∞ ∞ ∞ ∞ ∞ 4 3 0 Á À Á À Á À Á 0 2 ∞ 5 ∞ 3 ∞ 9 ∞ ∞ 0 ∞ 3 ∞ 1 ∞ 7 ∞ 1 3 0 6 4 4 ∞ 10 ∞ D4 ∞ ∞ ∞ 0 ∞ 2 ∞ 4 ∞ P4 À ∞ ∞ ∞ ∞ 0 ∞ 2 ∞ −2 Á 0 2 −1 −2 2 0 ∞ 2 ∞ ∞ ∞ ∞ 3 ∞ −1 0 2 ∞ À À ∞ ∞ ∞ −2 ∞ 0 −1 0 ∞ À À Á ∞ ∞ ∞ ∞ ∞ ∞ 4 3 0 Á À Á
  • 752.
    726 Cap´ ıtulo 7. Grafos À Á À Á 0 2 ∞ 5 ∞ 3 ∞ 9 ∞ ∞ 0 ∞ 3 ∞ 1 ∞ 7 ∞ 1 3 0 6 4 4 6 10 2 D5 ∞ ∞ ∞ 0 ∞ 2 ∞ 4 ∞ P5 À ∞ ∞ ∞ ∞ 0 ∞ 2 ∞ −2 Á 0 2 −1 −2 2 0 4 2 0 ∞ ∞ ∞ 3 ∞ −1 0 2 ∞ À À ∞ ∞ ∞ −2 ∞ 0 −1 0 ∞ À À Á ∞ ∞ ∞ ∞ ∞ ∞ 4 3 0 Á À Á À Á À Á 0 2 2 1 5 3 7 5 3 1 0 0 −1 3 1 5 3 1 1 3 0 2 4 4 6 6 2 D6 2 4 1 0 4 2 6 4 2 P6 À ∞ ∞ ∞ ∞ 0 ∞ 2 ∞ −2 Á 0 2 −1 −2 2 0 4 2 0 −1 1 −2 −3 1 −1 0 1 −1 À 0 2 −1 −2 2 0 −1 0 0 À À Á ∞ ∞ ∞ ∞ ∞ ∞ 4 3 0 Á À Á À Á À Á 0 2 2 1 5 3 7 5 3 1 0 0 −1 3 1 5 3 1 1 3 0 2 4 4 6 6 2 D7 2 4 1 0 4 2 6 4 2 P7 À 1 3 0 −1 0 1 2 3 −2 Á 0 2 −1 −2 2 0 4 2 0 −1 1 −2 −3 1 −1 0 1 −1 À −2 0 −3 −4 0 −2 −1 0 −2 À À Á 3 5 2 1 5 3 4 3 0 Á À Á À Á À Á 0 2 2 1 5 3 4 5 3 1 0 0 −1 3 1 2 3 1 1 3 0 2 4 4 5 6 2 D8 2 4 1 0 4 2 3 4 2 P8 À À 1 3 0 −1 0 1 2 3 −2 Á 0 2 −1 −2 2 0 1 2 0 −1 1 −2 −3 1 −1 0 1 −1 À −2 0 −3 −4 0 −2 −1 0 −2 À À Á 1 3 0 −1 3 1 2 3 0 Á À À À À À À À À Á À Á À Á 0 2 2 1 5 3 4 5 3 1 0 0 −1 3 1 2 3 1 1 3 0 1 4 3 4 5 2 D9 2 4 1 0 4 2 3 4 2 P9 À À −1 1 −2 −3 0 −1 0 1 −2 Á Á Á Á Á Á Á Á 0 2 −1 −2 2 0 1 2 0 −1 1 −2 −3 1 −1 0 1 −1 À −2 0 −3 −4 0 −2 −1 0 −2 À À Á 1 3 0 −1 3 1 2 3 0 Á À À À À À À À À Á 7.9.2.3 An´lisis del algoritmo de Floyd-Warshall a È Ö ×ØÙ Ö Ð × ÑÔ ÒÓ Ð ÐÓÕÙ ÁÒ Ð Þ Ö Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ ¾¿ ¸ ÑÓ× ÓÒ× Ö Ö Ð ×ØÖÙ ØÙÖ Ð ÖÙØ Ò operate all arcs list graph() × Ö Ø Ò Ü º º¿ ´Ô Ò µ Ý Ú Ö ¬ Ö ÕÙ ×Ø ÙØ O(V 2) Ø Ö ÓÒ ×¸ ÔÙ × Ò Ö Ð ¹ × Ö ÓÖÖ ØÓ Ð Ñ ØÖ Þº ÈÓÖ Ø Ö ÓÒ¸ × ÒÚÓ Ð ÓÔ Ö ÓÖ () Ð Ð × Initialize Dist Floyd¸ Ð Ù Ð ÙØ ÙÒ Ù×ÕÙ Ð Ò Ð search arc() Ý ÕÙ × O(V) ¾¼ º Ä Ò Ð Þ ÓÒ ÓÒ×ÙÑ ¸ ÒØÓÒ ×¸ O(V 2) × O(E) = O(V 2 E)º Ð Ö Ñ ÒØ ¸ Ð ÐÓÕÙ Ð ÓÖ ØÑÓ ÐÓÝ ¾ × O(V 3)º Ð Ð ÓÖ ØÑÓ ÔÖ × ÒØ Ó ×¸ ÒØÓÒ ×¸ O(V 2 E)¸ Ö ×ÙÐØ Ó ÕÙ ¬ Ö Ð ØÖ ÓÒ Ð O(V 3) ×Ó Ó Ð Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× Ðк Ä Ö ÞÓÒ × × ÑÔÐ ¸ Ð Ò Ð × × ØÖ ÓÒ Ð ×ÙÑ ÕÙ Ð Ö Ó Ý ×Ø ÓÐÓ Ó Ò ÙÒ Ñ ØÖ Þ Ý Ò º ¾¼ Ê ÓÖ ÑÓ× ÕÙ Ð ÑÔÐ ÒØ ÓÒ search arc() ÔÖ × ÒØ Ò Ü º¿º½¼º¾ ´Ô Ò µ Ù× ÒØÖ ÐÓ× Ö Ó× Ð ÒÓ Ó ÙÝÓ Ö Ó × Ñ ÒÓÖ Ý ÒÓ ÒØÖ ØÓ Ó× ÐÓ× Ö Ó× Ð Ö Óº ÕÙ ¸ Ô٠׸ ÕÙ Ð Ù×ÕÙ ÙÒ Ö Ó Ó ×Ù× Ó× ÒÓ Ó× ×Ø ÓØ ¸ Ô Ö Ð Ô ÓÖ ×Ó¸ ÔÓÖ O(V )º
  • 753.
    7.9. Caminos m´ ınimos 727 7.9.2.4 Correctitud del algoritmo de Floyd-Warshall Ä ÓÖÖ Ø ØÙ Ð Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ × ÖÒÓ× Ñ Ö Ò × ÑÓ× ÔÖ ¹ Ò Ó ÕÙ Ð Ð ÓÖ ØÑÓ Ï Ö× ÐÐ ÜÔÐÓÖ ØÓ Ó× ÐÓ× Ñ ÒÓ× ÔÓ× Ð × ÒØÖ Ô Ö × ÒÓ Ó׺ ×ØÓ ÔÙ ÔØ Ö× ÓÑÓ ÓÖÖ ØÓ × ×ÙÑ ÑÓ× ÕÙ Ð Ð ÓÖ ØÑÓ Ï Ö× ÐÐ Ð ÙÐ Ð Ð Ù×ÙÖ ØÖ Ò× Ø Ú Ð Ö Ð ÓÒ Ò Ö ÓÒ ÓÖÑ ÔÓÖ Ð Ö Ó ´Ú Ö Ü º º ´Ô Ò ½µµ ¾½ º Ð Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ Ø Ñ Ò ÜÔÐÓÖ ØÓ Ó× ÐÓ× Ô Ö × Ñ ÒÓ׸ ÐÓ Ù Ð × ÓÖÖÓ ÓÖ ÔÖ Ò Ó Ð × Ñ Ð ØÙ ÒØÖ Ð × Ù ÓÒ × ´ º¿µ Ý ´ º µº Ø Ö ÓÒ ÒØ ÖÒ Ð Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ Ü Ñ Ò Ý ÓÑÔ Ö ÙÒ ÒÙ ÚÓ Óר ÒØÖ ÙÒ Ô Ö ÒÓ Ó׺ ÈÓÖ Ô Ö ÒÓ Ó׸ Ð Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ ÜÔÐÓÖ ØÓ Ó× ÐÓ× Ñ ÒÓ× ÔÓ× Ð × Ý × Ð ÓÒ Ð Ñ ÒÓÖ ÐÐÓ׺ ÈÓÖ Ø ÒØÓ¸ Ð Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ × Ù Ö ØÓ Ó× ÐÓ× Ñ ÒÓ× Ñ Ò ÑÓ× ÒØÖ Ô Ö × ÒÓ Ó׺ 7.9.2.5 Recuperaci´n de caminos o Ä Ñ ØÖ Þ ×Øi,j Ð ÙÐ ÔÓÖ Ð Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ ÓÒØ Ò ÐÓ× Óר × Ñ Ò ÑÓ× ÒØÖ Ô Ö ÒÓ Ó× i Ý jº Ð ¬Ò Ð Ñ ØÖ Þ Ô Ø i,j × Ù Ö Ö Ð ÒÓ Ó k ÕÙ Ô ÖÑ Ø Ð Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ Ò ÓÒØÖ Ö Ð Ñ Ò ÑÓ Ú ÐÓÖ ×Øi,jº Ð ÔÖÓ Ñ ÒØÓ find min path()¸ ÕÙ Ö ÙÔ Ö Ý ÓÐÓ Ò path Ð Ñ ÒÓ Ñ × ÓÖØÓ¸ ÒØÖ ÐÓ× ÒÓ Ó× ÙÝÓ× Ò × ÓÖ Ò Ý ×Ø ÒÓ Ò Ð Ñ ØÖ Þ Ý Ò p ×ÓÒ src index Ý tgt index¸ × ÒרÖÙÑ ÒØ Ð × Ù ÒØ ÑÓ Ó ¾ Ê ÙÔ Ö ÓÒ Ñ ÒÓ× ¾¾ +≡ ¾¾ template <class Mat> void find_min_path(Mat & p, const long & src_idx, const long & tgt_idx, Path<typename Mat::List_Graph_Type> & path) { typedef typename Mat::List_Graph_Type GT; GT & g = p.get_list_graph(); typename GT::Node * src = p(src_idx); path.set_graph(g, src); for (int i = src_idx, j; j != tgt_idx; i = j) { j = p(i, tgt_idx); path.append(p(j)); } } ¬Ò × find min path¸ Ù× Ò ÙÒ ¾¾º Í× × Path ¼¾ º ÈÙ ×ØÓ ÕÙ ÔÙ Ö ÓØÖÓ× Ð ÓÖ ØÑÓ× ÕÙ Ñ ÒØ Ò Ò Ñ ØÖ × Ñ ÒÓ× × Ñ Ð Ö ×¸ ר Ð ÓÖ ØÑÓ ÐÓ Ò ÐÙ ÑÓ× Ò Ð Ö ÚÓ mat path.Hº ¾½ Ò Ð ×Ù ¹× ÓÒ Ü º º ´Ô Ò ½µ ÒÓ × ÑÓרÖÓ ÕÙ Ð Ð ÓÖ ØÑÓ Ï Ö× ÐÐ × ÓÖÖ ØÓº
  • 754.
    728 Cap´ ıtulo 7. Grafos 7.9.3 Algoritmo de Bellman-Ford Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¸ ½ ¸ ÐÐ Ñ Ó × Ò ÓÒÓÖ ×Ù× ÔÖ Ñ ÖÓ× × Ù Ö ÓÖ × ÓÒÓ Ó× ¾¾ ¸ Ò Ô Ò ÒØ × ÒØÖ × ¸ Ò Ù ÒØÖ ØÓ Ó× ÐÓ× Ñ ÒÓ× Ñ Ò ÑÓ× × ÙÒ ÒÓ Ó Óº Ð Ð ÓÖ ØÑÓ ÓÔ Ö ÓÒ ÐÓ× Ò Ø ÚÓ× Ý Ø Ò Ð Ö Ò ÓÒ Ô ÖÑ Ø Ö ×Ù Ø ÓÒº × ×ÑÐ Ö Ð ×ØÖ Ò Ð × ÒØ Ó ÕÙ ÓÒרÖÙÝ ÙÒ Ö ÓÐ Ö ÓÖ ØÓ Ó× ÐÓ× Ñ ÒÓ× Ñ Ò ÑÓ× × ÙÒ ÒÓ Ó ÓÖ Ò¸ Ð Ù Ð ÕÙ Ö ÕÙ Ö ×Ó Ö ÒÓ Ó Ð ×Ø Ò ÙÑÙÐ × Ð ÓÖ Òº Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ Ö × Ò Ð Ö ÚÓ Bellman Ford.H¸ Ò Ð Ù Ð × Ü¹ ÔÓÖØ Ò Ð × × Ù ÒØ × ÔÖ Ñ Ø Ú × ¾ ÊÙØ Ò × Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¾ ≡ ¿ template <class GT, class Distance, class Compare, class Plus, class SA> inline bool bellman_ford_min_spanning_tree(GT & g, typename GT::Node * start_node, GT & tree) { ÁÒ Ð Þ ÓÒ Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¾ Ð ÓÖ ØÑÓ Ò Ö Ó ÐÐÑ Ò¹ ÓÖ ¿½ Ø ÓÒ ÐÓ× Ò Ø ÚÓ× ¿ ÓÒרÖÙ ÓÒ Ö ÓÐ Ö ÓÖ Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¿ } template <class GT, class Distance, class Compare, class Plus, class SA> inline bool q_bellman_ford_min_spanning_tree(GT & g, typename GT::Node * start_node, GT & tree) { ÁÒ Ð Þ ÓÒ Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¾ Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¿¾ Ø ÓÒ ÐÓ× Ò Ø ÚÓ× ¿ ÓÒרÖÙ ÓÒ Ö ÓÐ Ö ÓÖ Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¿ } bellman ford min spanning tree() Ð ÙÐ Ð Ö ÓÐ Ö ÓÖ Ñ ÒÓ× Ñ Ò ÑÓ× × Ð ÒÓ Ó ÓÖ Ò start node × ÙÒ Ð Ð ÓÖ ØÑÓ Ð × Óº Ð Ô Ö Ñ ØÖÓ Ø ÔÓ GT Ö ÔÖ ¹ × ÒØ Ð Ö Ó¸ Distance Ð Ð × ÜØÖ ØÓÖ ÐÓ× Ô ×Ó× ÓÒØ Ò Ó× Ò ÐÓ× Ö Ó׸ Compare Ð ÓÑÔ Ö ÓÒ ÒØÖ Ô ×Ó׸ Plus Ð ×ÙÑ ÒØÖ Ô ×Ó× Ý SA Ð ¬ÐØÖÓ ×Ó Ö ÐÓ× Ö Ó׺ Ë Ü ×Ø Ð Ö ÓÐ Ö ÓÖ Ñ ÒÓ× Ñ Ò ÑÓ¸ ÒØÓÒ × Ð ÖÙØ Ò Ö ØÓÖÒ true ÐÓ ÓÒØÖ Ö Ó¸ Ü ×Ø ÙÒ ÐÓ Ò Ø ÚÓ Ý × Ö ØÓÖÒ falseº q bellman ford min spanning tree() × ÙÒ Ú Ö× ÓÒ Ñ ÓÖ ÕÙ Ù× ÒØ ÖÒ Ñ ÒØ ÙÒ ÓÐ ÒÓ Ó׸ ÐÓ ÕÙ ÓÒÐÐ Ú Ñ ÝÓÖ ÓÒ×ÙÑÓ ×Ô Ó Ô ÖÓ Ø Ò ×Ù ×Ø Ò ÐÑ ÒØ Ð Ö Ö Ð Ð ÓÖ ØÑÓº 7.9.3.1 Inicializaci´n del algoritmo de Bellman-Ford o È Ö Ñ ÒØ Ò Ö Ð Ö ÓÐ Ö ÓÖ¸ Ð Ð ÓÖ ØÑÓ ÙØ Ð Þ Ó× ÖÖ ÐÓ× Ø ÑÔÓÖ Ð ×¸ ÙÒÓ ÒÓ Ó× ÔÖ ×ÓÖ ×¸ Ô ÖØ ÐÓ× Ñ ÒÓ× Ñ Ò ÑÓ× Ý ÓØÖÓ Ö Ó× ØÓ Ó × ÙÒ ÐÓ ØÖ Ø Ó Ò Ü º º½½ ¾ ÁÒ Ð Þ ÓÒ Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¾ ≡ ´¾ ¼µ ¾ ¾¾ Ò Ö Ð ¸ Ô Ö ÕÙ Ý ÓØÖÓ× ÙØÓÖ ×º Î Ò× Ð × ÒÓØ × Ð Ó Ö ¬ × Ò Ü º½ ´Ô Ò µÔ Ö Ð Ö ØÓÖ × Ð Ö ×Ô ØÓº
  • 755.
    7.9. Caminos m´ ınimos 729 DynArray<typename GT::Node*> pred; DynArray<typename GT::Arc*> arcs; ¬Ò × arcs¸ Ù× Ò ÙÒ × ¿¾¸ ¸ ¸ ¾ ¸ ¿¼ ¸ ¿¿ ¸ ¿ ¸ ¿ ¸ ¿ ¸ Ò ¼º pred¸ Ù× Ò ÙÒ × ¿¾¸ ¾ ¸ ¿¼ ¸ ¿¿ ¸ ¿ ¸ ¿ ¸ Ò ¼º Í× × DynArray ¾º ÈÓÖ ÒÓ Ó¸ × Ñ ÒØ Ò Ð × Ù ÒØ Ò ÓÖÑ ÓÒ ¾ ÁÒ ÓÖÑ ÓÒ ÔÓÖ ÒÓ Ó Ò ÐÐÑ Ò¹ ÓÖ ¾ ≡ template <class GT, class Distance> struct Bellman_Ford_Node_Info { int idx; typename Distance::Distance_Type acum; }; ¬Ò × Bellman Ford Node Info¸ Ù× Ò ÙÒ ¾ º idx × ÐÒ ÒØÖÓ Ð ÖÖ ÐÓ preds¸ ÙØ Ð Þ Ó Ô Ö Ö Ò O(1) Ð ÒÓ Ó ÔÖ ×ÓÖ Ò Ð Ñ ÒÓ Ñ Ò ÑÓ Ô Ö Ðº acum × Ð ×Ø Ò Ô Ö Ð ÙÑÙÐ × Ð ÒÓ Ó ÓÖ Ò start nodeº Ð ×Ó ÐÓ× ÑÔÓ× ×Ø רÖÙ ØÙÖ × Ð Ø Ñ ÒØ ÐÓ× Ñ ÖÓ× NI Ô Ö idx Ý ACU Ô Ö acum¸ Ö ×Ô Ø Ú Ñ ÒØ º Ð Ú ÐÓÖ Ò Ð ACU(start node) × ÖÓ¸ Ñ ÒØÖ × ÕÙ Ð Ð Ö ×ØÓ × Ò¬Ò ØÓº Ò Ø ÖÑ ÒÓ× Ó Ó¸ Ð Ú ÐÓÖ Ò Ð ACU(start node) × Distance::Zero Distance Ý Distance::Max Distance Ô Ö Ð Ö ×ØÓº ÄÓ× ÒÓ Ó× Ý ÐÓ× ÖÖ ÐÓ× × Ò Ò Ñ ÒØ Ð × Ù ÒØ Ð ÞÓ ¾ ÁÒ Ð Þ ÓÒ Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¾ +≡ ´ ¾ ¼µ ¾ ¿¼ { typename GT::Node_Iterator it(g); for (int i = 0; it.has_current(); ++i, it.next()) { pred[i] = NULL; arcs[i] = NULL; typename GT::Node * p = it.get_current_node(); g.reset_bit(p, Aleph::Min); // colocar bit en cero Bellman_Ford_Node_Info <GT, Distance> * ptr = new Bellman_Ford_Node_Info <GT, Distance>; ptr->idx = i; ptr->acum = Distance::Max_Distance; // infinito NODE_BITS(p).set_bit(Min, false); NODE_BITS(p).set_bit(Breadth_First, false); NODE_COOKIE(p) = ptr; } } Í× × arcs ¾ ¸ Bellman Ford Node Info ¾ ¸ Node Iterator ¸ Ò pred ¾ º Ð Ø Breadth First × ÙØ Ð Þ Ö Ô Ö ×Ø Ò Ù Ö ÒÓ Ó× ÕÙ × Ý Ò Ò× ÖØ Ó Ò ÙÒ ÓÐ º Í× ÑÓ× Breadth First ÔÓÖÕÙ Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ Ö ÓÖÖ Ð Ö Ó Ò ÑÔÐ ØÙ ¸ ÐÓ ÕÙ ÑÓ×ØÖ Ö ÑÓ× Ò Ü º º¿º ´Ô Ò ¿½µº Ð Ø Min × Ö ÜÔÐ Ó Ò Ü º º¿º º
  • 756.
    730 Cap´ ıtulo 7. Grafos Ð ÙÒ Ó ÒÓ Ó ÓÒ Ú ÐÓÖ ÙÑÙÐ Ó ×Ø Ò ÓÒÓ Ó Ð ÔÖ Ò Ô Ó × start node ¿¼ ÁÒ Ð Þ ÓÒ Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¾ +≡ ´¾ ¼µ ¾ ACU(start_node) = Distance::Zero_Distance; 7.9.3.2 Manejo del ´rbol abarcador a ÖÒ Ð Ð ÓÖ ØÑÓ ×ØÖ ¸ Ò Ð ÐÐÑ Ò¹ ÓÖ Ð × Ö Ñ × Ð Ö ÓÐ Ö ÓÖ × ÑÓ ¬ Ò ÙÖ ÒØ Ð Ð ÙÐÓº ÈÓÖ × Ö ÞÓÒ¸ × ÓÒÚ Ò ÒØ Ð Ö ÔÖ × ÒØ ÓÒ Ö ÓÐ ÜÔÐ Ò Ü º º½½º ÄÐ Ñ ÑÓ× pred Ð ÖÖ ÐÓ Ô Ö × Ô Ö Ö ÔÖ × ÒØ Ö Ð Ö Óк ËÙÔÓÒ ÑÓ× ÙÒ ÒÓ Ó p ÙÝÓ Ò Ò pred × kº Ä ÒØÖ pred[i] Ò ÕÙ Ð ÒÓ Ó ÓÖÖ ×ÔÓÒ ÒØ Ð Ò k Ø Ò Ð Ú ÐÓÖ pred[k] ÓÑÓ ÒÓ Ó ÔÖ ×ÓÖ Ò Ð Ö ÓÐ Ö ÓÖ Ñ ÒÓ× Ñ Ò ÑÓ× × Ð ÒÓ Ó start nodeº ÈÓÖ ÑÔÐÓ¸ Ð Ö ÓÐ 4 6 3 0 2 7 5 1 × Ö ÔÖ × ÒØ Ò Ð ÖÖ ÐÓ pred ÓÑÓ ÁÒ Ò pred ¼ ½ ¾ ¿ ÆÓ Ó ÔÙÒØ Ó 4 2 6 4 ¹ 2 4 3 ר ¬ ÙÖ Ö ÔÖ × ÒØ ÐÓ× Ò × ÐÓ× ÒÓ Ó× Ò pred Ô ÖÓ Ö ÓÖ ÑÓ× ÕÙ Ò ÒÙ ×ØÖ ÑÔÐ Ñ ÒØ ÓÒ × Ù Ö Ò ÔÙÒØ ÖÓ× ÒÓ Ó׺ Ë Ò Ð ØÖ Ò× ÙÖ×Ó Ð Ð ÙÐÓ × ÑÓ ¬ ÙÒ Ö Ñ Ð Ö Óи ÒØÓÒ × ×Ø ÓÒ ÑÓ ¬ Ö Ð Ô Ö Ð ÒÓ Ó Ò ÔÖ º 7.9.3.3 El algoritmo gen´rico Bellman-Ford e Ð ÔÖ Ò Ô Ó ÙÒ Ñ ÒØ Ð Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ Ö × Ò ÐÓ ÕÙ × ÓÒÓ ÓÑÓ “relajaci´n de arco”º o ÓÒ× Ö Ò Ó ÕÙ ÒÓ Ó ÐÑ Ò Ð Ñ Ò Ñ ×Ø Ò Ù¹ ÑÙÐ × ÓÖ Ò¸ Ð Ö Ð ÓÒ ÙÒ Ö Ó s → t ÓÒ× ×Ø Ò Ú Ö ¬ Ö × (s) + w(s → t) < (t)º Ë Ð ÔÖ Ó × ÖØÓ¸ ÒØÓÒ × × ØÙ Ð Þ (t) = (s) + w(s → t) ÐÓ ÓÒØÖ Ö Ó (t) Ô ÖÑ Ò ÒÚ Ö Ð º Ð ÔÖÓ ×Ó ÒØ Ö ÓÖ × Ó ¬ Ð × Ù ÒØ ÑÓ Ó ¿¼ Ê Ð Ö Ö Ó ¿¼ ≡ ´ ¿½µ const typename Distance::Distance_Type & acum_src = ACU(src); if (acum_src == Distance::Max_Distance) continue; const typename Distance::Distance_Type & dist = Distance () (arc); typename Distance::Distance_Type & acum_tgt = ACU(tgt); const typename Distance::Distance_Type sum = Plus () (acum_src, dist); if (Compare () (sum, acum_tgt)) // ¿sum < acum_tgt?
  • 757.
    7.9. Caminos m´ ınimos 731 { const int & idx = IDX(tgt); pred[idx] = src; arcs[idx] = arc; acum_tgt = sum; } Í× × arcs ¾ Ò pred ¾ º Ò Ø ÖÑ ÒÓ× Ð Ö Ó u→ v¸ ר ÜÔÖ × ÓÒ × ÕÙ Ú Ð ÒØ w − ¯ if (v) > (u) + w =⇒ – pred[v] = u – (v) = (u) + w Ä Ö Ð ÓÒ ÓÒ× ×Ø Ò ØÖ Ø Ö ×Ñ ÒÙ Ö Ð ÙÑÙÐ Ó Ð ÒÓ Ó tgt nodeº Ì Ð ×¹ Ñ ÒÙ ÓÒ ×ÓÐÓ Ó ÙÖÖ × Ð ÔÖ Ó (v) = (u) + w × ÖØÓ¸ Ò ÙÝÓ ×Ó¸ Ð ÖÖ ÐÓ pred × ØÙ Ð Þ Óº Ù Ó Ô ÖØ ÙÐ Ö ÑÓ× ÔÖ ×Ø Ö ÓÒ Ð Ö ÔÖ × ÒØ ÓÒ ∞º Ë × × Ó Ð Ñ ÝÓÖ ÒÙÑ ÖÓ Ö ÔÖ × ÒØ Ð ¸ ÒØÓÒ × Ð ÓÔ Ö ÓÒ (u) + w ÔÙ ÖÖ Ö ÙÒ × ÓÖ º ÐÐ ÔÙ × Ð if acum src == Distance::Max Distance) ÕÙ ÒÓ× ×ÙÔ ÖÚ × Ø Ð ÔÓ× Ð º ÙÒ × ¸ × ÔÓ× Ð ¸ ÙÒÕÙ ×Ô Ö ÑÓ× ÑÔÖÓ Ð ¸ Ø Ò Ö × ÓÖ × × ÐÓ× Ú ÐÓÖ × Ð × ×Ø Ò × ×ÓÒ ÑÙÝ Ö Ò ×¸ Ö ÒÓ× Ð Ñ Ü ÑÓº ÖÓ××Ó ÑÓ Ó¸ Ð Ð ÙÐÓ Ð Ö ÓÐ Ö ÓÖ ÓÒ× ×Ø Ò Ö Ú × Ö ØÓ Ó× ÐÓ× Ö Ó× Ý Ö Ð ¹ ÖÐÓ׸ ÐÓ ÕÙ × Ö Ð Þ Ð × Ù ÒØ ÑÓ Ó ¿½ Ð ÓÖ ØÑÓ Ò Ö Ó ÐÐÑ Ò¹ ÓÖ ¿½ ≡ ´¾ ¼µ for (int i = 0, n = g.get_num_nodes() - 1; i < n; ++i) // recorrer los arcos para evaluar relajamiento for (Arc_Iterator<GT, SA> it(g); it.has_current(); it.next()) { typename GT::Arc * arc = it.get_current_arc(); typename GT::Node * src = g.get_src_node(arc); typename GT::Node * tgt = g.get_tgt_node(arc); Ê Ð Ö Ö Ó ¿¼ } Í× × Arc Iterator º ר Ó Ó ÔÓ ÑÓ× ÒÓØ Ö × Ò ¬ ÙÐØ ÕÙ × ÙØ Ò O(V E) Ú ×º Ë ÒÓ Ó ×Ó ×Ù ÔÖÓÔ Ó ÖÖ ÐÓ pred¸ ÒØÓÒ × Ð ×ÙÔ ÖÔÓ× ÓÒ ÐÓ× ÖÖ ÐÓ× ÓÒ ÓÖÑ Ð Ñ ØÖ Þ Ñ ÒÓ× path Ü Ø Ñ ÒØ Ò Ð Ñ ×ÑÓ ×Ø ÐÓ ÕÙ Ò Ð Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× Ðк 7.9.3.4 Algoritmo mejorado de Bellman-Ford Ð ÐÓÕÙ Ð ÓÖ ØÑÓ Ò Ö Ó ÐÐÑ Ò¹ ÓÖ ¿½ × × ÑÔРݸ Ú Ö ÑÓ× ×Ô٠׸ ÓÖÖ ØÓ Ý ÐÑ ÒØ ÔØ Ð Ñ ØÖ × Ý Ò º ÈÓ ÑÓ× Ñ ÓÖ ÖÐÓ × Ó × ÖÚ ¹ ÑÓ× ÕÙ Ù Ò Ó Ò ÙÒ Ø Ö ÓÒ ÒÓ × ÑÓ ¬ÕÙ Ò ÐÓ× ÙÑÙÐ Ó× ÙÒ Ô Ö ÒÓ Ó× ÓÒ Ø Ó× ÔÓÖ ÙÒ Ö Ó¸ ÒØÓÒ ×¸ Ò Ð × Ù ÒØ Ø Ö ÓÒ Ð Ö Ó Ø ÑÔÓ Ó × Ö Ð Ö º ÌÑ Ò ÑÓ× ÒÓØ Ö¸ ÓÑÓ Ò ØÓ × ÔÙ Ó × ÖÚ Ö Ò Ð ¬ ÙÖ º ¸ ÕÙ Ò Ð × ÔÖ Ñ Ö × Ø Ö ÓÒ × ÔÙ Ò Ö ÒÓ Ó× ÙÝÓ× ÙÑÙÐ Ó× Ô ÖÑ Ò Ò ÒÚ Ö ÒØ × Ø Ò¹ Ò ÕÙ × ÔÓØ Ò Ñ ÕÙ Ð Ö Ó × Ñ × Ö Ò Ó Ñ × ×Ô Ö Óº
  • 758.
    732 Cap´ ıtulo 7. Grafos 3 2 3 2 3 2 B D H B D H B D H ∞ 1 ∞ -2 ∞ 2 1 ∞ -2 ∞ 2 1 2 -2 ∞ 1 1 1 2 -1 1 3 2 -1 2 -1 1 3 2 -1 2 -1 1 3 2 -1 2 2 2 5 5 5 A F G A F G A F G 1 1 1 0 ∞ ∞ 0 5 ∞ 0 3 ∞ 3 2 3 2 3 2 1 1 2 4 -2 1 1 2 4 -2 1 1 2 4 -2 -1 -1 -1 -1 -1 -1 4 4 4 -2 -2 -2 C E I C E I C E I ∞ 1 ∞ ∞ ∞ 1 ∞ ∞ 2 1 5 ∞ ´µ ¼ ´ µ ½ ´µ ¾ 3 2 3 2 3 2 B D H B D H B D H 2 1 2 -2 4 2 1 2 -2 4 2 1 2 -2 4 1 1 1 2 -1 1 3 2 -1 2 -1 1 3 2 -1 2 -1 1 3 2 -1 2 2 2 5 5 5 A F G A F G A F G 1 1 1 0 3 3 0 3 3 0 3 3 3 2 3 2 3 2 1 1 2 4 -2 1 1 2 4 -2 1 1 2 4 -2 -1 -1 -1 -1 -1 -1 4 4 4 -2 -2 -2 C E I C E I C E I 2 1 5 3 2 1 2 1 2 1 2 0 ´ µ ¿ ´µ ´µ 3 2 3 2 3 2 B D H B D H B D H 2 1 2 -2 4 2 1 2 -2 4 2 1 2 -2 4 1 1 1 2 -1 1 3 2 -1 2 -1 1 3 2 -1 2 -1 1 3 2 -1 2 2 2 5 5 5 A F G A F G A F G 1 1 1 0 3 3 0 3 3 0 3 3 3 2 3 2 3 2 1 1 2 4 -2 1 1 2 4 -2 1 1 2 4 -2 -1 -1 -1 -1 -1 -1 4 4 4 -2 -2 -2 C E I C E I C E I 2 1 2 0 2 1 2 0 2 1 2 0 ´µ ´ µ ´µ ÙÖ º ÈÖÓ Ö ×Ó Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ÓÒ Ö Þ Ò Ð ÒÓ Ó º Ç × ÖÚ ¹ ÑÓ× ÕÙ Ð Ö ÓÐ Ö ÓÖ ¬Ò Ø ÚÓ Ô ÖÑ Ò ÒÚ Ö ÒØ Ô ÖØ Ö Ð Ð ÕÙ ÒØ ع Ö ÓÒ ´i = 5µº ÈÓÖ Ø ÒØÓ¸ ÙÒ Ñ ÓÖ Ð Ð ÓÖ ØÑÓ ÓÒ× ×Ø Ò ÔÖÓ × Ö ×ÓÐÓ ÕÙ ÐÐÓ× Ö Ó× ÙÝÓ× ÙÑÙÐ Ó× ×Ù ÒÓ Ó ×Ø ÒÓ Ý Ò × Ó ÑÓ ¬ Ó× Ý¸ Ð Ú Þ¸ × ÙÖ Ö ÕÙ ÒÓ × Ö Ô Ø Ð ÔÖÓ × Ñ ÒØÓ ÙÒ Ö Ó × Ò ÕÙ ÔÖ Ú Ñ ÒØ × Ý Ò ÔÖÓ × Ó Ð Ö ×ØÓ ÐÓ× Ö Ó׺ ר ÓÒ Ù Ø ­Ù Ó ÔÓ ÑÓ× ÑÓ Ð Þ ÖÐ Ñ ÒØ Ð ×ØÖÙ ØÙÖ ­Ù Ó ×Ø Ò Ô Ö ÐÐÓ × Ö¸ ÙÒ ÓÐ ÕÙ ÐÑ Ò ÕÙ ÐÐÓ× ÒÓ Ó× ÙÝÓ ÙÑÙÐ Ó Ý × Ó ÑÓ ¬ Óº Ì Ð ÓÐ × Ð Ö ÓÑÓ × Ù ¿¾ Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¿¾ ≡ ´ ¾ µ ¿¿ DynListQueue<typename GT::Node*> q; ÓÐÓ Ö ÒØ Ò Ð ¿¿ put_in_queue <GT> (q, start_node); Í× × DynListQueue ½ ¼ º Ä ÓÐ ÓÒØ Ò Ð ÔÖ Ñ Ö ÒÓ Ó ÙÝÓ ÙÑÙÐ Ó × Ó ÑÓ ¬ Ó Ý × ÓÒÓ Ó Ð ÒÓ Ó
  • 759.
    7.9. Caminos m´ ınimos 733 ÓÖ Òº Ê ÓÖ ÑÓ× ÕÙ Ð Ø Breadth First × Ò Ð ÞÓ Ù Ò Ó × Ô ÖØÓ Ð Ñ ÑÓÖ Ô Ö Ð ØÖ ÙØÓ Bellman Ford Node Info ´Ü º º¿º½ ´Ô Ò ¾ µµº Ä ÖÙØ Ò put in queue() Ò ÓÐ Ð ÒÓ Ó Ý Ð Ñ Ö Ð Ø Breadth First¸ Ð Ù Ð × Ô ÖØ Ð × Ù ÒØ ØÖ Ó ÖÙØ Ò × Ò ØÓÖÒÓ Ð ÓÐ ¿¿ ÊÙØ Ò × ÓÐ Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¿¿ ≡ template <class GT> inline static void put_in_queue(DynListQueue<typename GT::Node*> & q, typename GT::Node * p) { q.put(p); NODE_BITS(p).set_bit(Breadth_First, true); } template <class GT> inline static typename GT::Node * get_from_queue(DynListQueue<typename GT::Node*> & q) { typename GT::Node * p = q.get(); NODE_BITS(p).set_bit(Breadth_First, false); return p; } template <class GT> inline static bool is_in_queue(typename GT::Node * p) { return IS_NODE_VISITED(p, Breadth_First); } Í× × DynListQueue ½ ¼ º Ð ÔÖÓÔÓ× ØÓ Ñ Ò Ö Ð ÓÐ ÓÒ ×Ø × ÖÙØ Ò × × × ÙÖ Ö× ÒÓ Ø Ò Ö ÙÔÐ Ó× Ò Ð ÓÐ º Ð ÒÙÑ ÖÓ ØÓØ Ð Ö Ô Ø ÓÒ × ÕÙ ÙØ Ð ÐÓÕÙ Ð ÓÖ ØÑÓ Ò Ö Ó ÐÐÑ Ò¹ ÓÖ ¿½ × Ü Ø Ñ ÒØ V −1×E Ú × ÓÖÖ ×ÔÓÒ ÒØ Ð × V −1 Ö Ð ÓÒ × ×Ó Ö ÐÓ× E Ö Ó׺ ר ÒØ × ÑÔÓÖØ ÒØ ÔÓÖÕÙ ÒÓ× ÓØ Ð Ñ Ü Ñ ÒØ Ú × ÕÙ Ö Ø Ö Ö Ð Ú Ö× ÓÒ ÓÒ ÓÐ ¸ × Ò Ô Ö ÙÒ Ö ÔÖ × ÒØ ÓÒ ÓÒ Ð ×Ø × Ý Ò Ø Ð ÓÑÓ List Digraph<Node, Arc>º × ¸ ÑÓ× Ò ÓÒØÖ Ö ÙÒ Ñ Ò Ö × ÑÙÐ Ö Ð V − 1 Ø Ö ÓÒ ×º È Ö ÖÐÓ¸ Ë Û ¿¿ ÔÖÓÔÓÒ Ù× Ö ÙÒ Ú ÐÓÖ Ò¹ Ø Ò Ð Ò Ð ÓÐ ÕÙ ÒÓ× Ò ÕÙ Ù Ò Ó Ð Ð ÓÖ ØÑÓ Ò Ö Ó ÐÐÑ Ò¹ ÓÖ ¿½ Ö Ó ÙÒ Ö Ð ÓÒ ØÓ Ó× ÐÓ× Ö Ó× ¿¿ ÓÐÓ Ö ÒØ Ò Ð ¿¿ ≡ ´ ¿¾µ typename GT::Node __sentinel; typename GT::Node * sentinel = &__sentinel; put_in_queue <GT> (q, sentinel); ר ÑÓ Ó¸ Ú Þ ÕÙ × ÕÙ ÑÓ× Ð ÓÐ sentinel Ø Ò Ö ÑÓ× Ð × ÙÖ Ö Ö Ð Þ Ó Ð Ñ ×ÑÓ ØÖ Ó ÕÙ ÙÒ Ø Ö ÓÒ ÜØ ÖÒ Ð Ð ÓÖ ØÑÓ Ò Ö Ó ÐÐÑ Ò¹ ÓÖ ¿½ º × Ð × Ó× ×¸ Ð Ð ÓÖ ØÑÓ Ñ ÓÖ Ó Ö ×ÙÐØ ÒØ × ÓÒ ÓÖÑ ÓÑÓ × Ù ¿¿ Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¿¾ +≡ ´ ¾ µ ¿¾ for (int i = 0, n = g.get_num_nodes() - 1; not q.is_empty(); ) { typename GT::Node * src = get_from_queue <GT> (q); if (src == sentinel) // ¿se saca el centinela? if (i++ == n)
  • 760.
    734 Cap´ ıtulo 7. Grafos break; else put_in_queue <GT> (q, sentinel); // recorrer y relajar arcos del nodo src for (Node_Arc_Iterator<GT, SA> it(src); it.has_current(); it.next()) { typename GT::Arc * arc = it.get_current_arc(); const typename Distance::Distance_Type & acum_src = ACU(src); if (acum_src == Distance::Max_Distance) continue; typename GT::Node * tgt = it.get_tgt_node(); const typename Distance::Distance_Type & w = Distance()(arc); const typename Distance::Distance_Type sum_src = Plus()(acum_src, w); typename Distance::Distance_Type & acum_tgt = ACU(tgt); if (Compare () (sum_src, acum_tgt)) // relajar arco { const int & idx = IDX(tgt); pred[idx] = src; arcs[idx] = arc; acum_tgt = sum_src; if (not is_in_queue <GT> (tgt)) put_in_queue <GT> (q, tgt); } } } Í× × arcs ¾ ¸ Node Arc Iterator ¸ Ò pred ¾ º ר Ó Ó × Ñ Ò ×Ø Ö ÓÑ ÒØ Ö ½º Ð Ø Breadth First¸ Ð Ù Ð × Ó ÙÐØ Ó Ò Ð × ÊÙØ Ò × ÓÐ Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¿¿ ¸ Ú Ø ÕÙ ÙÒ ÒÓ Ó ×Ø ÒÓ ´tgtµ¸ ÙÝÓ ÙÑÙÐ Ó Ý × Ó ÑÓ ¬ Ó Ò Ð Ø Ö ÓÒ ØÙ и × Ó Ð Ñ ÒØ ÒØÖÓ Ù Ó Ò Ð ÓÐ º ÈÓÖ Ð Ú ÙÒ Ö Ó ÕÙ ÙÒ ÒÓ Ý × Ó ÔÖÓ × Ó¸ × ÔÓ× Ð ÑÓ ¬ Ö Ð ÙÑÙ¹ Ð Ó ÙÒ ÒÓ Ó ÕÙ × Ò Ù ÒØÖ Ò Ð ÓÐ Ò× Ð i¹ × Ñ Ø Ö ÓÒ ØÙ Ð Ó Ð ÙÒ i − 1¹ × Ñ Ø Ö ÓÒ ÒØ Ö ÓÖº ¾º Ð ÓÖ Ò Ð ÓÐ Ö ÒØ Þ ÕÙ ¸ Ð Ñ ÒÓ× Ò Ð ÔÖ Ñ Ö Ø Ö ÓÒ ´i = 0µ¸ Ð Ö ÓÖÖ Ó × Ü Ø Ñ ÒØ ÙÒÓ ÑÔÐ ØÙ º ÈÓר Ö ÓÖÑ ÒØ ¸ Ò ÙÒ Ø Ö ÓÒ i¸ Ò ÙÒ ÓÒ ÐÓ× ÒÓ Ó× ÕÙ Ý Ò × Ó Ñ Ø Ó× Ò Ð ÓÐ ´×ÓÐÓ ÕÙ ÐÐÓ× ÙÝÓ ÙÑÙÐ Ó Ý × Ó ÑÓ ¬ Óµ¸ × ÔÖÓ × Ö Ò Ù Ð Ó Ñ ÒÓ× Ö Ó× ÕÙ Ò Ð Ø Ö ÓÒ 0º ÕÙ × Ù ÔÓÖÕÙ ×Ø Ð ÓÖ ØÑÓ Ø Ò × Ö Ñ × Ö Ô Ó ÕÙ Ð Ð ÓÖ ØÑÓ Ò Ö Ó ÐÐÑ Ò¹ ÓÖ ¿½ º Ð ÓÖ Ò Ð ÓÐ × ÙÖ ÕÙ × ÔÖÓ × Ò Ö Ó× ÓÒ Ø Ó× ÒÓ Ó× ÙÝÓ× Ù¹ ÑÙÐ Ó× Ý Ò × Ó ÑÓ ¬ Ó׸ ÐÓ ÕÙ ÔÓ× Ð Ø ÙÒ Ö Ð ÓÒ ÕÙ ×Ñ ÒÙÝ Ð ÙÑÙÐ Óº ÈÓÖ Ð ÓÒØÖ Ö Ó¸ ÓÒ Ð Ð ÓÖ ØÑÓ Ò Ö Ó ÐÐÑ Ò¹ ÓÖ ¿½ Ö Ò Ø Ö ÓÒ × ÕÙ ÓÒ ÖÒ Ò Ö Ó× ÙÝÓ× ÙÑÙÐ Ó× ÓÖ Ò Ý ×Ø ÒÓ ×ÓÒ Ò¬Ò ØÓ× Ý ÕÙ ¸ ÔÓÖ Ø ÒØÓ¸ ÒÓ × ÑÓ ¬ Ö Ò Ô × Ö ÕÙ Ð Ö Ó × Ö Ú × Óº ÈÓÖ ÕÙ Ø Ò ÑÓ× ÓØÖ Ö Ð ÔÓÖÕÙ Ð Ð ÓÖ ØÑÓ × Ó Ò Ð ÓÐ Ø Ò × Ö Ñ × ¬ ÒØ ÕÙ Ð Ò Ö Óº
  • 761.
    7.9. Caminos m´ ınimos 735 3 2 3 2 B D H B D H ∞ 1 ∞ -2 ∞ 2 1 ∞ -2 ∞ 1 1 2 -1 1 3 2 -1 2 -1 1 3 2 -1 2 2 5 5 A F G A F G 1 1 0 ∞ ∞ 0 ∞ ∞ 3 2 3 2 1 1 2 4 -2 1 1 2 4 -2 -1 -1 -1 -1 4 4 -2 -2 C E I C E I ∞ ∞ ∞ ∞ ∞ ∞ 1 ´µ 1 ´ µ 3 2 3 2 B D H B D H 2 2 4 2 2 4 1 -2 1 -2 1 1 2 -1 1 3 2 -1 2 -1 1 3 2 -1 2 2 5 5 A F G A F G 1 1 0 3 3 0 3 3 3 2 3 2 1 1 2 4 -2 1 1 2 4 -2 -1 -1 -1 -1 4 4 -2 -2 C E I C E I 2 2 1 2 2 0 1 ´µ 1 ´ µ ÙÖ º ÈÖÓ Ö ×Ó Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ Ñ ÓÖ Ó ÓÒ Ö Þ Ò Ð ÒÓ Ó º ¬ ÙÖ ÓÖÖ ×ÔÓÒ E Ö Ó× Ò×Ô ÓÒ Ó׸ ÐÓ ÕÙ ¸ Ù ÒØ Ð ÒØ ¬ ÙÖ × Ö ×Ô ØÓ Ð ¬ ÙÖ º ¸ Ó Ö ÙÒ Ð Ð Ö ÓÒ Ð Ð ÓÖ ØÑÓ Ñ ÓÖ Óº ¿º ÍÒ Ö Ó a Ö Ð Ó ÙÝÓ ÒÓ Ó ×Ø ÒÓ × Ó Ñ Ø Ó Ò Ð ÓÐ ÒÓ ÚÓÐÚ Ö Ú × Ø Ö× ×Ø ÕÙ ØÓ Ó× ÐÓ× Ö Ó× Ý ÒØ × ÐÓ× ÒÓ Ó× ÒØ Ö ÓÖ × Ð ÓÐ Ý Ò × Ó Ú × Ø Ó׺ Ä Ø Ö ÓÒ 0 Ú × Ø ¸ ÓÒ ÖØ Þ ¸ ØÓ Ó× ÐÓ× Ö Ó׸ ÔÙ × ÐÓ× ÙÑÙÐ Ó× ÐÓ× ÒÓ Ó× Ø Ò Ò Ú ÐÓÖ Ò¬Ò ØÓ¸ ÐÓ ÕÙ × ÙÖ ×Ù Ö Ð ÓÒº ÍÒ Ö Ó a Ö Ð Ó Ò Ð Ø Ö ÓÒ i Ö ×Ô Ö Ö Ð Ø Ö ÓÒ i + 1 Ô Ö Ú ÒØÙ ÐÑ ÒØ ÚÓÐÚ Ö × Ö Ö Ð Óº º Ë Ð Ö Ó ÒÓ ÓÒØ Ò ÐÓ× Ò Ø ÚÓ׸ ÒØÓÒ × × × ÙÖÓ ÕÙ Ð ÓÐ × Ú Ö ¸ Ô٠׸ Ù Ò Ó Ð Ð ÓÖ ØÑÓ ×Ø Ð ÐÓ× ÙÑÙÐ Ó× ×Ù× Ú ÐÓÖ × ¬Ò Ø ÚÓ׸ × Ö¸ ×Ù× Óר × Ñ Ò ÑÓ׸ ÒÓ Ö Ò Ñ × Ò× Ö ÓÒ × Ò Ð ÓÐ º º Ë ¸ ÔÓÖ Ð ÓÒØÖ Ö Ó¸ Ð Ö Ó ÓÒØ Ò Ð ÙÒ ÐÓ Ò Ø ÚÓ¸ ÒØÓÒ × ÐÓ× ÙÑÙÐ Ó× ÐÓ× ÒÓ Ó× Ô ÖØ Ð ÐÓ × ÑÔÖ × Ö Ò Ö Ð Ó׸ ÔÓÖ ÐÓ ÕÙ Ð Ð ÓÖ ØÑÓ ÒÓ × Ø Ò Ö ÔÓÖ Ð ÓÐ Ú º Ò ×Ø ×Ó¸ Ð ÓÒØ ÓÖ i Ð ÒÞ Ö Ð Ú ÐÓÖ V − 1¸ ÐÓ ÕÙ Ø Ò Ö Ð Ð ÓÖ ØÑÓº 7.9.3.5 Detecci´n de ciclos negativos o Ü ×Ø Ò ÔÖÓ Ð Ñ × ×Ó Ö Ö Ó× ÕÙ ÔÐ ÒØ Ò ØÖ Ò× ÓÖÑ Ö Ô ×Ó× Ö Ó× ×Ù ÖØ ÕÙ ×ØÓ× Ú Ò Ò Ò Ø ÚÓ× Ó Ð ÓÒ Ö Ó× ¬ Ø Ó× ÓÒ Ô ×Ó× Ò Ø ÚÓ׺ Ó¸ ×
  • 762.
    736 Cap´ ıtulo 7. Grafos Ð Ô Ö×Ô Ø Ú Ð ÑÓ Ð Þ ÓÒ¸ × ÔÓ× Ð Ñ Ò Ö Ö Ó× Ò Ø ÚÓ× ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ù Ò Ó Ñ ÒÓ× ÔÓÖ Ø ÓÒ ÖÖÓÖ¸ × ÔÐ Ù× Ð ÑÓ Ð Þ Ö ÙÒ Ö Ó ÕÙ ÓÒØ Ò ÐÓ× Ò Ø ÚÓ׺ ÓÑÓ × Ö × Ü ×Ø Ó ÒÓ ÙÒ ÐÓ È Ö Ø Ö ×Ø ÔÖ ÙÒØ ¸ × Ñ Ò ×Ø Ö Ø Ò Ö Ò Ù ÒØ ÕÙ Ð Ñ Ü Ñ ÐÓÒ ØÙ Ò Ö Ó× ÙÒ Ñ ÒÓ × ÐÓ ×ÙÑÓ V − 1º × ¸ Ð Ð for Ò Ð ÓÖ ØÑÓ Ò Ö Ó ÐÐÑ Ò¹ ÓÖ ¿½ ׸ Ùר Ñ ÒØ ¸ Ö Ð Þ Ö V − 1 × E Ö Ð ÓÒ ×¸ Ð × Ù Ð ×¸ Ò ×Ø Ò ÙÑÙÐ Ù Ö Ò ÐÓ× Ñ ÒÓ× Ò Ö Ó× Ñ × Ð Ö Ó× ÔÓ× Ð ×º ÄÙ Ó Ð V −1¹ × Ñ Ø Ö ÓÒ¸ Ú ÐÓÖ (v) ÓÒØ Ò Ð Ñ Ò Ñ ×Ø Ò × Ð ÓÖ Ò¸ ÔÓÖ ÐÓ ÕÙ ÒÓ × ÔÓ× Ð Ö Ð Ö Ñ × Ö Ó׺ Ä ÓÒ× Ö ÓÒ ÒØ Ö ÓÖ × ÓÖÖ Ø ×ÓÐÓ × ÒÓ Ý ÐÓ× Ò Ø ÚÓ׸ Ô٠׸ × ÐÓ× Ý¸ ÒØÓÒ × × ÑÔÖ × Ö ÔÓ× Ð Ö Ð Þ Ö Ö Ð ÓÒ × ÓÒ Ð ×¸ Ò¬Ò Ø Ñ ÒØ Ñ ÒÙ Ó¸ ÕÙ ×Ñ ÒÙÝ Ò Ð Ú ÐÓÖ (v) ÒÓ Ó ÒÚÓÐÙ Ö Ó Ò Ð ÐÓº ÓÒ× Ù ÒØ Ñ ÒØ ¸ ÙÒ Ñ Ò Ö Ö Ø Ø Ø Ö Ð ÙÒ ÐÓ Ò Ø ÚÓ ÓÒ× ×Ø Ò Ö Ð Þ Ö ÙÒ ÙÐØ Ñ Ø Ö ÓÒ Ò Ð Ù Ð¸ Ó ÙÖÖ Ö ÙÒ Ö Ð ÓÒ¸ ÑÔÐ Ð ÔÖ × Ò ÙÒ ÐÓ Ò Ø ÚÓº ר ÑÓ Ó¸ Ô Ö Ø Ø Ö × Ý ÙÒ ÐÓ Ò Ø ÚÓ ×Ø ÓÒ Ú Ö ¬ Ö × × ÔÓ× Ð Ö Ð Þ Ö Ð Ñ ÒÓ× ÙÒ Ö Ð ÓÒ Ñ × ¿ Ø ÓÒ ÐÓ× Ò Ø ÚÓ× ¿ ≡ ´¾ ¼µ bool negative_cycle = false; // recorrer todos los arcos en b´squeda de un ciclo negativo u for (Arc_Iterator<GT, SA> it(g); it.has_current(); it.next()) { typename GT::Arc * arc = it.get_current_arc(); typename GT::Node * src = g.get_src_node(arc); const typename Distance::Distance_Type & acum_src = ACU(src); if (acum_src == Distance::Max_Distance) continue; typename GT::Node * tgt = g.get_tgt_node(arc); const typename Distance::Distance_Type & dist = Distance () (arc); typename Distance::Distance_Type & acum_tgt = ACU(tgt); const typename Distance::Distance_Type sum = Plus ()(acum_src, dist); if (Compare () (sum, acum_tgt)) // ¿se relaja arco? { // s´ ==> ciclo negativo! ı negative_cycle = true; const int & idx = IDX(tgt); pred[idx] = src; arcs[idx] = arc; acum_tgt = sum; } } Í× × Arc Iterator ¸ arcs ¾ ¸ Ò pred ¾ º Ð ÐÓÕÙ ÓÔ Ö ÓÖÖ Ø Ñ ÒØ Ô Ö ÐÓ× Ó× Ð ÓÖ ØÑÓ׺ ØÓ× ÕÙ ¸ ÓÑÓ Ú Ö ÑÓ× ÔÓר Ö ÓÖÑ ÒØ ¸ Ð ÐÓ ÕÙ Ù Ö Ó Ò ÐÓ× ÖÖ ÐÓ× pred Ý arcs¸ × ÑÔÓÖØ ÒØ ÙÐÑ ¹ Ò Ö ÒØ Ö Ñ ÒØ Ð forº Ë ×ÓÐÓ × ØÖ Ø × Ö × Ü ×Ø Ó ÒÓ ÙÒ ÐÓ Ò Ø ÚÓ¸ ÒØÓÒ × ÔÓ ÑÓ× Ø Ò ÖÒÓ× Ô Ò × ÐÓ Ø Ø ÑÓ׺
  • 763.
    7.9. Caminos m´ ınimos 737 7.9.3.6 Construcci´n del ´rbol abarcador o a Ë ÒÓ Ý ÐÓ× Ò Ø ÚÓ׸ ÒØÓÒ × ÓÒרÖÙ ÑÓ× Ð Ö ÓÐ Ö ÓÖ ÐÓ ÕÙ ÔÙ Ö× Ò ÙÒ ×ÓÐ Ô × Ö ÓÖÖ Ò Ó Ð ÖÖ ÐÓ arcs Ò× ÖØ Ò Ó ÐÓ× ÒÓ Ó× Ý Ö Ó× Ð Ú Þ ÕÙ ÐÓ× Ñ Ô ÑÓ׺ ÙÖ ÒØ ר Ô × ÔÖÓÚ ÑÓ× Ô Ö Ð Ö Ö Ð Ñ ÑÓÖ Ó ÙÔ ÔÓÖ ÐÓ× ÓÓ ×º È Ö Ø ÖÑ Ò Ö × Ð ÓÓ ÐÑ Ò ÙÒ Ñ Ô Ó Ó ÙÒ ÔÙÒØ ÖÓ ÙÒ ×ØÖÙ ØÙÖ Bellman Ford Node Info ÒÓ× Ú Ð ÑÓ× Ð Ø Minº Ë ÙÒ ÒÓ Ó ×Ø Ñ Ö Ó ÓÒ Min¸ ÒØÓÒ × ×Ù ÓÓ Ñ Ô Ð ÒÓ Ó Ð Ö ÓÐ Ö ÓÖ ÐÓ ÓÒØÖ Ö Ó¸ Ð ÒÓ Ó ÒÓ ×Ø Ò Ð Ö ÓÐ Ö ÓÖ Ý Ð ÓÓ ÓÒØ Ò ÙÒ ÔÙÒØ ÖÓ ÙÒ Ó ØÓ Bellman Ford Node Info ¿ ÓÒרÖÙ ÓÒ Ö ÓÐ Ö ÓÖ Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¿ ≡ ´ ¾ µ if (negative_cycle) // ¿hay ciclos negativos? // liberar memoria de los cookies de los nodos y terminar for (int i = 0; i < g.get_num_nodes(); ++i) // Construir arbol abarcador ´ { typename GT::Arc * garc = arcs[i]; if (garc == NULL) continue; typename GT::Node * gsrc = g.get_src_node(garc); typename GT::Node * tsrc = NULL; if (IS_NODE_VISITED(gsrc, Min)) tsrc = static_cast<typename GT::Node*>(NODE_COOKIE(gsrc)); else { NODE_BITS(gsrc).set_bit(Min, true); // marcar bit delete NI(gsrc); tsrc = tree.insert_node(gsrc->get_info()); GT::map_nodes(gsrc, tsrc); } typename GT::Node * gtgt = g.get_tgt_node(garc); typename GT::Node * ttgt = NULL; if (IS_NODE_VISITED(gtgt, Min)) ttgt = static_cast<typename GT::Node*>(NODE_COOKIE(gtgt)); else { NODE_BITS(gtgt).set_bit(Min, true); // marcar bit delete NI(gtgt); ttgt = tree.insert_node(gtgt->get_info()); GT::map_nodes(gtgt, ttgt); } typename GT::Arc * tarc = tree.insert_arc(tsrc, ttgt, garc->get_info()); GT::map_arcs(garc, tarc); ARC_BITS(garc).set_bit(Min, true); } return false; // no hay ciclos negativos Í× × arcs ¾ º ÓÒ Ð Ö ÓÐ Ö ÓÖ tree ÔÓ ÑÓ× × ÖÚ ÖÒÓ× Ð ÖÙØ Ò find path depth first() ×ØÙ Ò Ü º º º¾ ´Ô Ò ¾¿µ Ý × Ò ÓÒØÖ Ö ÙÒ Ñ ÒÓ Ñ Ò ÑÓ × start node Ù ÐÕÙ Ö ÓØÖÓ ÒÓ Óº
  • 764.
    738 Cap´ ıtulo 7. Grafos 7.9.3.7 An´lisis del algoritmo de Bellman-Ford a Ò Ð Þ Ö Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ Ö ÕÙ Ö Ò Ð Þ Ö ×Ù× Ù ØÖÓ× ÐÓÕÙ ÔÖ Ò Ô Ð × ÁÒ Ð Þ ÓÒ Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¾ ¸ Ð ÓÖ ØÑÓ Ò Ö Ó ÐÐÑ Ò¹ ÓÖ ¿½ ¸ Ø ÓÒ ÐÓ× Ò Ø ÚÓ× ¿ Ý ÓÒרÖÙ ÓÒ Ö ÓÐ Ö ÓÖ Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¿ º ÁÒ Ð Þ ÓÒ Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¾ Ö ÕÙ Ö Ö ÓÖÖ Ö ÐÓ× ÒÓ Ó× Ý ÐÓ× Ö Ó× ÐÓ ÕÙ ÖÖÓ ÙÒ ÓÑÔÐ O(V + E)º Ð ÓÖ ØÑÓ Ò Ö Ó ÐÐÑ Ò¹ ÓÖ ¿½ Ø Ö ¸ Ø Ð ÓÑÓ ÐÓ Ñ Ö ÑÓ× Ò Ü º º¿º¿ ´Ô Ò ¿¼µ¸ V × E Ú ×º Ø ÓÒ ÐÓ× Ò Ø ÚÓ× ¿ Ø Ö ÐÓ ×ÙÑÓ O(E)º רӏ ÙÒ Ó Ð ÓÖ ØÑÓ ÒÖ Ó ÐÐÑ Ò¹ ÓÖ ¿½ × ÔÖÓÜ Ñ O(V E)º Ò ÐÑ ÒØ ¸ ÓÒרÖÙ ÓÒ Ö ÓÐ Ö ÓÖ Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¿ ØÓÑ O(V) Ú ×º ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð Ð ÓÖ ØÑÓ ØÓÑ O(V +E)+O(V E)+O(V) = O(V E)º Ä Ú Ö× ÓÒ Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¿¾ × Ò Ð ÓÐ Ø Ò Ð Ñ ×Ñ ÓÑÔÐ ¸ ÙÒ Ó ÙÒ Óר ÓÒ Ð ×Ô Ó O(V) Ô ÖÓ Ò Ð ÔÖ Ø ¸ Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¿¾ Ø Ò × Ö Ñ × Ú ÐÓÞ ÕÙ Ð ÓÖ ØÑÓ Ò Ö Ó ÐÐÑ Ò¹ ÓÖ ¿½ º 7.9.3.8 Correctitud del algoritmo de Bellman-Ford Proposici´n 7.6 o ¾¿ Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ × Ó Ò Ð ÐÓÕÙ Ð ÓÖ ØÑÓ Ò Ö Ó ÐÐÑ Ò¹ ÓÖ ¿½ × ÓÖÖ ØÓº Demostraci´n (por inducci´n sobre la i-´sima iteraci´n) o o e o Ä ÔÖÓÔÓ× ÓÒ × ÓÖÖ Ø × ÒÓ Ü ×Ø Ñ ÒÓ × u v¸ Ò ÙÝÓ ×Ó Ð Óר × Ò¬Ò ØÓ Ý ÒÓ Ý Ö Ó׺ ÐÓ ÓÒØÖ Ö Ó¸ Ú Ö ¬ ÑÓ× ÔÓÖ Ò Ù ÓÒº Ä ÔÓØ × × Ò Ù Ø Ú × ÕÙ ÐÙ Ó Ð i¹ × Ñ Ø Ö ÓÒ Ð Ú ÐÓÖ (v) × Ñ ÒÓÖ Ó Ù Ð Ð Ñ ÒÓ Ñ × ÓÖØÓ ÓÑÔÙ ×ØÓ ÔÓÖ i Ó Ñ ÒÓ× Ö Ó׺ Ë u ∈ V Ð ÒÓ Ó ÓÖ Ò ´start node Ò Ð Ð ÓÖ ØÑÓµ Ý × v ∈ V ÙÒ ÒÓ Ó Ù ÐÕÙ Ö º ÒØÓÒ × ½º i = 0 ÄÙ Ó Ð ÔÖ Ñ Ö Ø Ö ÓÒ¸ v ÔÙ Ò ÐÓ Ö× Ó Ó× ×Ó× ´ µ Ë Ü ×Ø ÙÒ Ö Ó u→ v¸ ÒØÓÒ × (v) = w¸ Ð Ù Ð × Ð Ñ Ò ÑÓ Ñ ÒÓ ÔÓ× Ð w − ÓÑÔÙ ×ØÓ ÔÓÖ ÙÒ ×ÓÐÓ Ö Óº ´ µ Ë ÒÓ Ü ×Ø Ö Ó Ö ØÓ ÒØÖ u Ý v¸ ÒØÓÒ × (v) = ∞ Ý Ð ÒØ Ö Ó× ÒÚÓÐÙ Ö × ÒÙÐ ÐÓ ÕÙ ÒÓ Ú ÓÐ Ð ÔÓØ × × Ò Ù Ø Ú º ¾º i > 0 ÓÖ ×ÙÑ ÑÓ× ÕÙ Ð ÔÓØ × × Ò Ù Ø Ú × ÖØ Ô Ö ØÓ Ó i Ý Ú Ö ¬ ÑÓ× × ÙÒ ÐÓ × Ô Ö i + 1º ÈÓ ÑÓ× ×Ø Ò Ù Ö Ó× ×Ó× ÒØÖ Ñ ÒÓ× × u v ´ µ Ü ×Ø ÙÒ Ñ ÒÓ Ñ Ò ÑÓ p ÓÑÔÙ ×ØÓ ÔÓÖ i Ó Ñ ÒÓ× Ö Ó× Ò ×Ø ×Ó¸ ÔÙ ×ØÓ ÕÙ p × Ñ Ò ÑÓ¸ ØÓ Ö Ð ÓÒ v ÒÓ Ø Ö Ð Ú ÐÓÖ (v)º ´ µ Ò Ð ×Ó ÓÒØÖ Ö Ó¸ Ü ×Ø ÙÒ Ñ ÒÓ p × u v¸ ÓÑÔÙ ×ØÓ ÔÓÖ i Ó Ñ ÒÓ× Ö Ó׸ ÕÙ × Ð Ñ × ÓÖØÓ ÔÓ× Ð ÒØÖ ØÓ Ó× ÐÓ× Ñ ÒÓ× ÔÓ× Ð × × u v ÐÓÒ ØÙ i+1º ר Ñ ÒÓ ÔÙ ×ØÖÙ ØÙÖ Ö× Ð × Ù ÒØ ÑÓ Ó ¾¿ × Ò Ð ÔÖÙ Ë Û ¿¿ º
  • 765.
    7.9. Caminos m´ ınimos 739 ÒÓ Ó× Ù Û Ú × Ö¸ ÙÒ Ñ ÒÓ i Ó Ñ ÒÓ× Ö Ó× × u w Ý ÙÒ Ö Ó × w vº ÈÓÖ Ð ÔÓØ × × Ò Ù Ø Ú ¸ (w) ÓÒØ Ò Ð Óר Ñ Ò ÑÓ × u w ÔÓ× Ð ÓÒ i Ó Ñ ÒÓ× Ö Ó׺ Ð ÐÓÕÙ Ð ÓÖ ØÑÓ Ò Ö Ó ÐÐÑ Ò¹ ÓÖ ¿½ Ú ÑÓ× ÕÙ Ð Ø Ö ÓÒ i + 1 Ó × ÖÚ Ö ØÓ Ó× ÐÓ× Ö Ó× w Ý × Ð ÓÒ Ö Ð Ö Ó ÕÙ Ú v ØÙ Ð Þ Ò Ó ×Ù (v) 7.9.3.9 B´ squeda de ciclos negativos u Ò Ó × ÓÒ ×¸ ÒÓ ×ÓÐÓ × Ò × Ö Ó × Ö × Ü ×Ø Ó ÒÓ ÙÒ ÐÓ¸ × ÒÓ Ø ÖÑ Ò ÖÐÓ Ü Ø ¹ Ñ ÒØ ´ÒÓ Ó× Ý Ö Ó×µº ÓÑÓ ÖÐÓ Ù Ò Ó ÙØ ÑÓ× Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ×Ó Ö ÙÒ Ö Ó ÓÒ Ð Ñ ÒÓ× ÙÒ ÐÓ Ò Ø ÚÓ¸ Ð × Ö Ð ÓÒ × ÐÓ× Ö Ó× ÓÑÔÓÒ ÒØ × Ð ÐÓ × ÑÔÖ ×Ñ ÒÙÝ Ò ÐÓ× Ú ÐÓÖ × ×Ù× ÒÓ Ó׺ Ú Þ ÕÙ × Ö Ð ÙÒ Ö Ó¸ Ð Ô Ö v × ØÙ Ð Þ Ò Ð ÖÖ ÐÓ pred[]º ÓÑÓ ×ØÓ ×Ù Ô Ö ØÓ Ó× ÐÓ× ÒÓ Ó׸ Ò ÐÙ Ó× ÐÓ× Ð ÐÓ¸ Ð ÖÖ ÐÓ pred[] ÓÒØ Ò Ð ´Ó ÐÓ×µ ÐÓ´×µ Ò Ù ×Ø ÓÒº Ä Ö ­ Ü ÓÒ ÒØ Ö ÓÖ ÒÓ× Ö Ú Ð ÙÒ ÐØ ÖÒ Ø Ú Ô Ö Ø Ø Ö ÙÒ ÐÓ¸ Ð Ù Ð ÓÒ¹ × ×Ø Ò Ù× Ö Ô Ö Ó Ñ ÒØ Ò Ð ÖÖ ÐÓ pred[] Ð Ü ×Ø Ò ÙÒ ÐÓº Ë ÐÓ Ò ÓÒØÖ ÑÓ׸ ÒØÓÒ × Ø Ò ÑÓ× Ð Ð ÙÐÓ Ð Ö ÓÐ Ö ÓÖ Ý ÜØÖ ÑÓ× Ð ÐÓ Ð ÖÖ ÐÓº Ë pred[] ÓÒØ Ò Ð ÐÓ¸ ÒØÓÒ ×¸ ÓÑÓ Ù× ÖÐÓ º ÈÓÖ × ÑÔÐ ¸ ×Ùר Ò¹ Ø Ò ÔÖ Ú Ó× × ÖÖÓÐÐÓ׸ ÒÓ× Ú Ð Ö ÑÓ× Ð Ð × Compute Cycle In Digraph() × Ò Ð Ð ÙÐÓ ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ× × ÙÒ Ð Ð ÓÖ ØÑÓ Ì Ö Ò Ò Ü º º ´Ô Ò µº È ÖÓ ×Ø Ð × Ö ÕÙ Ö ÕÙ Ð Ö Ó ×Ø Ö ÔÖ × ÒØ Ó Ò ÙÒ Ö Ú ÓÒ List Digraph<Node, Arc> Ý ÒÓ Ò ÐÓ× ÖÖ ÐÓ× pred[] Ý arcs[]º È Ö Ð ÙÐ Ö Ð ÐÓ ÑÓ׸ Ô٠׸ ÓÒרÖÙ Ö ÙÒ Ó ØÓ Ø ÔÓ List Digraph<Node, Arc> Ý ×Ó Ö Ð Ò ÓÒØÖ Ö Ð ÐÓº Ð ÔÖÓ Ñ ÒØÓ ÔÙ Ö ×ÙÑ Ö× × ½º ÓÒרÖÙ Ö ÙÒ Ö Ó ÙÜ Ð Ö Ô ÖØ Ö ÐÓ× ÖÖ ÐÓ× pred[] Ý arcs[]º ÄÐ Ñ ÑÓ× aux ר Ö Ó¸ Ð Ù Ð ×Ø Ö Ñ Ô Ó Ð Ö Ó ÓÒ ÐÓ׺ aux ÓÒØ Ò ÓÒ ÖØ ØÙ ÙÒ ÐÓ¸ ÔÙ × ×Ø ÓÒרÖÙ Ó Ô ÖØ Ö ÐÓ× ÖÖ ÐÓ× pred[] Ý arcs[] Ö ×ÙÐØ ÒØ × Ð Ø ÓÒ ÙÒ ÐÓ ÔÓÖ Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ º ¾º ÑÔÐ Ö Ð Ð × Compute Cycle In Digraph¸ ×Ó Ö Ð Ö Ó ÙÜ Ð Ö Ô Ö Ù Ö ÙÒÓ ×Ù× ÐÓ× ´ÔÙ Ö Ñ ×µº Ë path Ø Ð ÐÓº ¿º Ð ÐÓ ×Ó Ö g × ¬Ò ÔÓÖ Ð Ñ Ô Ó path Ò gº ÒØ Ò Ó ×Ø ÔÖÓ Ñ ÒØÓ¸ ÔÐ ÒØ ÑÓ× Ð × Ù ÒØ ÖÙØ Ò ¿ ÊÙØ Ò × Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¾ +≡ ¾ ¼ template <class GT> bool search_cycle(GT & g, DynArray<typename GT::Node *> & pred, DynArray<typename GT::Arc *> & arcs, Path<GT> & cycle) {
  • 766.
    740 Cap´ ıtulo 7. Grafos const size_t & n = pred.size(); // debe ser la cantidad de nodos de g DynMapAvlTree<typename GT::Node*, typename GT::Node*> nodes_table; GT aux; // construir grafo auxiliar aux for (int i = 0; i < n; ++i) // insertar nodos en aux { typename GT::Node * p = pred.access(i); if (p == NULL or NODE_COOKIE(p) != NULL) // ¿nodo ya insertado y mapeado? continue; // s´ ==> avance al siguiente ı typename GT::Node * q = aux.insert_node(p->get_info()); GT::map_nodes(p, q); nodes_table.insert(q, p); } for (int i = 0; i < n; ++i) // insertar arcos en aux { typename GT::Arc * a = arcs.access(i); if (a == NULL or ARC_COOKIE(a) != NULL) continue; typename GT::Node * gsrc = g.get_src_node(a); typename GT::Node * gtgt = g.get_tgt_node(a); if (NODE_COOKIE(gsrc) == NULL or NODE_COOKIE(gtgt) == NULL) continue; // Uno de los nodos no est´ en pred ==> no es parte de ciclo a typename GT::Node * aux_src = (typename GT::Node*) NODE_COOKIE(gsrc); typename GT::Node * aux_tgt = (typename GT::Node*) NODE_COOKIE(gtgt); aux.insert_arc(aux_src, aux_tgt); } Path<GT> path; // buscar el ciclo en aux mediante algoritmo de Tarjan if (not Compute_Cycle_In_Digraph <GT> () (aux, path)) return false; // no existe ciclo cycle.set_graph(g); // mapear ciclo en aux al camino cyle en g for (typename Path<GT>::Iterator it(path); it.has_current(); it.next()) cycle.append(nodes_table[it.get_current_node()]); return true; } Í× × arcs ¾ ¸ DynArray ¾¸ Path ¼¾ ¸ Ò pred ¾ º search cycle() Ù× Ò Ð ×Ù ¹ Ö Ó g ¬Ò Ó ÔÓÖ ÐÓ× ÖÖ ÐÓ× pred[] Ý arcs[]¸ Ö ×ÙÐØ ÒØ × Ð Ù ÓÒ Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¸ Ð ÔÖ × Ò ÙÒ ÐÓº Ë Ð ÐÓ × Ò ÓÒØÖ Ó¸ ÒØÓÒ × Ð ÙÒ ÓÒ Ö ØÓÖÒ true Ý Ù Ö Ò Ð Ñ ÒÓ cycle Ð ÐÓº ÐÓ ÓÒØÖ Ö Ó¸ Ö ØÓÖÒ falseº Ä × ÒØ Ö × ÕÙ ÑÓ× × ÖÖÓÐÐ Ó Ò ØÓÖÒÓ Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ Ò Ò × Ü ×Ø Ó ÒÓ ÙÒ ÐÓ Ò Ø ÚÓ¸ Ô ÖÓ ÒÓ ÐÓ Ø ÖÑ Ò Òº ÈÙ ×ØÓ ÕÙ ÒØ ¬ Ö ÐÓ× Ò Ø ÚÓ× × ÙÒ Ø Ö ÔÐ Ù× Ð Ô Ö ÓØÖÓ× Ð ÓÖ ØÑÓ׸ Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ÔÙ ÑÔÐ Ö× Ô Ö Ð ÙÐ ÖÐÓ׺ Ò × × ÒØ Ó¸ × Ò Ö ÑÓ× Ð ÖÙØ Ò × Ù ÒØ ¼ ÊÙØ Ò × Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¾ +≡ ¿ ½ template <class GT, class Distance, class Compare, class Plus, class SA> inline bool bellman_ford_negative_cycle(GT & g, typename GT::Node * start_node, Path<GT> & cycle) { GT tree; // arbol sobre el cual opera algoritmo de Bellman-Ford ´ ÁÒ Ð Þ ÓÒ Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¾
  • 767.
    7.9. Caminos m´ ınimos 741 Ð ÓÖ ØÑÓ Ò Ö Ó ÐÐÑ Ò¹ ÓÖ ¿½ Ø ÓÒ ÐÓ× Ò Ø ÚÓ× ¿ if (not negative_cycle) return false; Search_Cycle <GT> () (g, pred, arcs, cycle); return true; } Í× × arcs ¾ ¸ Path ¼¾ ¸ Ò pred ¾ º ÓÑÓ ÔÖ ÑÓ׸ Ð ÖÙØ Ò × × Ò ÐÑ ÒØ Ù Ð ÕÙ q bellman ford min spanning tree()º Ð Ò Ó × ÕÙ ÒÓ × Ð ÙÐ Ð Ö ÓÐ Ö ÓÖ ×ÓÐÓ × Ø ÖÑ Ò × Ü ×Ø Ò Ó ÒÓ ¹ ÐÓ× Ü ×Ø Ö¸ ÒØÓÒ × × Ö ØÓÖÒ ¸ Ò Ð Ô Ö Ñ ØÖÓ cycle¸ Ð ÐÓ ÓÒ × Ø ØÓ Ð Ò ØÚ º 7.9.3.10 C´lculo de ciclos negativos en un digrafo a Ä ÖÙØ Ò ÒØ Ö ÓÖ ×ÓÐÓ Ð ÙÐ ÐÓ× Ò Ð ÓÑÔÓÒ ÒØ Ù ÖØ Ñ ÒØ ÓÒ ÜÓ Ð ÕÙ Ô ÖØ Ò Þ start node¸ ÐÓ Ù Ð ÒÓ Ö ×ÔÓÒ ×ÓÐÙØ Ñ ÒØ × g Ø Ò Ó ÒÓ ÐÓ× Ò ¹ Ø ÚÓ׺ Ë × ÔÖ Ø Ò ÒÖÐ Ý × ÙÖ Ö × Ü ×Ø Ò Ó ÒÓ ÐÓ× Ò Ø ÚÓ× Ò ÙÒ Ö Ó Ù ÐÕÙ Ö ¸ ÒØÓÒ ×¸ ÙÒÕÙ Ð Ø Ò × ÙÒ Ñ ÒØ ÐÑ ÒØ Ð Ñ ×Ñ ¸ ÑÓ× Ö Ð Þ Ö ÙÒ ÔÓ Ó Ñ × ØÖ Óº × Ñ ÒØ ¸ Ð Ø Ò ÕÙ ÑÔÐ Ö ÑÓ× Ô Ö Ù× Ö ÐÓ× Ò Ø ÚÓ× × Ö ×ÙÑ Ò ½º Ç Ø Ò C = { ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ×} ¾º ∀c ∈ C =⇒ ´ µ Ë there is is cycle = Bellman Ford Negative Cycle() ÙØ Ó ×Ó Ö c Ô ÖØ Ö ÙÒ ÒÓ Ó Ù ÐÕÙ Ö cº ´ µ Ë there is cycle =⇒ º Å Ô Ð ÐÓ Ó Ø Ò Ó ÔÓÖ Bellman Ford Negative Cycle() Ð ¹ Ö Ó ÓÖ Ò Ð g º Ì ÖÑ Ò Ö ÓÒ Ú ÐÓÖ Ö ØÓÖÒÓ true ¿º Ì ÖÑ Ò Ö ÓÒ Ú ÐÓÖ Ö ØÓÖÒÓ false È Ö Ð ÔÖ Ñ Ö Ô ×Ó ÔÓ ÑÓ× Ô Ö Ø Ñ ÒØ Ù× Ö Ð ÖÙØ Ò Strongly Connected Components(g, list)¸ × ÖÖÓÐÐ Ò Ü º º¿º¾ ´Ô Ò µº ÄÓ ÕÙ ÒÓ× Ô ÖÑ Ø ¬Ò Ö ½ ÊÙØ Ò × Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¾ +≡ ¼ template <class GT, class Distance, class Compare, class Plus, class SA> inline bool bellman_ford_negative_cycle(GT & g, Path<GT> & cycle) { DynDlist<DynDlist<typename GT::Node*> > blocks; Strongly_Connected_Components <GT, SA> () (g, blocks); // recorrer todos los bloques for (typename DynDlist<DynDlist<typename GT::Node*> >::Iterator it(blocks); it.has_current(); it.next()) { DynDlist<typename GT::Node*> & block = it.get_current(); if (block.size() == 1) continue;
  • 768.
    742 Cap´ ıtulo 7. Grafos typename GT::Node * src = block.get_first(); // nodo desde donde iniciar if (bellman_ford_negative_cycle <GT, Distance, Compare, Plus, SA> (g, src, cycle)) return true; } return false; } Í× × DynDlist ¿ Ò Path ¼¾ º 7.9.4 Discusi´n sobre los algoritmos de caminos m´ o ınimos Ð ÔÖÓ Ð Ñ Ñ ÒÓ Ñ Ò ÑÓ × ÙÒÓ ÐÓ× ÔÖÓ Ð Ñ Ö ×ÓÐÙ Ð × Ñ × ÑÔÓÖØ ÒØ × ÐÓ× Ö Ó׺ ÒØÖ ÐÓ× Ð ÓÖ ØÑÓ× ×ØÙ Ó׸ Ý ÓØÖÓ× Ü ×Ø ÒØ ׸ Ù Ò Ó Ý ÓÑÓ × Ð ÓÒ Ö ÙÒÓ º ÁÒ ÑÓ× ÒÙ ×ØÖ × Ù× ÓÒ ÔÖ × ÒØ Ò Ó Ð × Ù ÒØ Ø Ð Ö Ô ØÙÐ Ø Ú Ø ÑÔÓ× Ù ÓÒ Ý ×Ô Ó Ð ÓÖ ØÑÓ Ê ÔÖ × ÒØ ÓÒ × ÑÔ ÒÓ ×Ô Ó ×ØÖ Ä ×Ø × Ý Ò O(E Ð V) O(V) ÐÓÝ Å ØÖ × Ý Ò O(V ) 3 O(V 2 ) ÐÐÑ Ò¹ ÓÖ Ä ×Ø × Ý Ò O(V E) O(V) À Ý Ú Ö Ó× Ö Ø Ö Ó× Ô Ö Ø Ö × ÔÖ ÙÒØ º ÍÒÓ ÔÖ Ñ ÖÓ ×Ø Ø ÖÑ Ò Ó ÔÓÖ Ð Ó ÕÙ Ð Ö Ó × Ó ÒÓ Ö Óº Ë × ØÖ Ø ÙÒ Ö Ó × Ò Ô ×Ó× Ò Ø ÚÓ׸ ÒØÓÒ ×¸ Ó ×Ù Ñ ÓÖ Ö Ò Ñ ÒØÓ¸ Ð Ð ÓÖ ØÑÓ ×ØÖ × Ð × Ó Ò ØÓº ÄÓ× Ö Ó× ÔÓÒ Ö Ó× Ò ØÙÖ Ð × ÒÓ Ø Ò Ò Ô ×Ó× Ò Ø ÚÓ× ÔÓÖ Ò ØÙÖ Ð ÒØ Ò ÑÓ× ÕÙ Ð Ö Ó ÑÓ Ð Þ Ö Ø Ñ ÒØ ÙÒ × ØÙ ÓÒ Ð Ú Ö Ð Ý ÒÓ × ÙÒ ÓÒ× Ù Ò Ð ÙÒ ØÖ Ò× ÓÖÑ ÓÒ Ñ Ø Ñ Ø º ÈÓÖ ÑÔÐÓ¸ Ò Ù ÐÕÙ Ö Ö Ó Ù Ð ÒÓ¸ × Ö¸ ÙÒÓ ÕÙ Ö ÔÖ × ÒØ ר Ò × Ù Ð Ò ×¸ Ó Ò ÙÒ Ö Ó Ø ÑÔÓÖ Ð¸ Ó × ÙÒÓ ÕÙ ÑÓ Ð ÙÖ ÓÒ ×¸ Ð Ð ÓÖ ØÑÓ ×ØÖ × Ð Ñ ÓÖ ÓÔ ÓÒ Ô Ö Ð ÙÐ Ö Ð Ñ ÒÓ Ñ Ò ÑÓ ÒØÖ ÙÒ Ô Ö ÒÓ Ó׺ Ä Ü ×Ø Ò Ô ×Ó× Ò Ø ÚÓ× × ÖØ ÔÐ ÒÓ Ð Ð ÓÖ ØÑÓ ×ØÖ º Ò ×Ø × ØÙ ÓÒ¸ Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ × Ð ÔÖ Ö Ò ¸ ÔÙ × ÒÓ ×ÓÐÓ Ü Ñ ÓÖ Ø ÑÔÓ¸ × ÒÓ ÕÙ Ø Ø ÐÓ× Ò Ø ÚÓ× ÙÒÕÙ ×ØÓ ÙÐØ ÑÓ × Ñ × ÙÒ ÓÒ× Ö ÓÒ Ú Ð ¹ ÓÒ ÕÙ Ö Ð Ñ Ø Ñ Ø ¸ ÒÓ × Ô ÙÒ Óר × Ò ¬ Ø ÚÓ ÔÓÖ Ð Ú Ö ¬ ÓÒº ÈÐ ÒØ × Ð × Ö ­ Ü ÓÒ × ÒØ Ö ÓÖ ×¸ ÒÓ× Ô Ö ¸ ÒØÓÒ ×¸ Ð × Ù ÒØ ÔÖ ÙÒØ Ù Ò Ó Ù× Ö Ð Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ ÍÒ ÔÖ Ñ Ö Ö ×ÔÙ ×Ø ÓÒ× ×Ø Ò Ö Ù Ò Ó × Ö ÕÙ Ö Ò Ð ÙÐ Ö ØÓ Ó× ÐÓ× Ô Ö × Ñ ÒÓ× Ñ Ò ÑÓ׺ Ø Ð × ØÓ׸ ÓÒÚ Ò ÓÑÔ Ö Ö ÐÓ× ÓØÖÓ× Ð ÓÖ ØÑÓ× ÔÖ × ÒØ Ó× Ô Ö ØÓ Ó× ÐÓ Ô Ö × Ñ ÒÓ× Ñ Ò ÑÓ× Ð ÓÖ ØÑÓ × ÑÔ ÒÓ ×Ô Ó ×ØÖ O(V E Ð V) O(V 2 ) + O(V) ÐÓÝ O(V 3 ) O(V 2 ) ÐÐÑ Ò¹ ÓÖ O(V 2 E) O(V 2 ) + O(V) È Ö Ö Ó× Ò×Ó× Ò ÐÓ× ÕÙ E ≈ V2 Ð Ð ÓÖ ØÑÓ ×ØÖ × ÓרÓ×Ó Ý ÒÓ× ÕÙ Ð ÐÐÑ Ò¹ ÓÖ ÓÑÓ Ð ÙÒ Ó ÓÑÔ Ø Ø ÚÓ Ò Ø ÑÔÓ¸ Ñ × ÒÓ Ò ×Ô Óº × Ð × Ó× ×¸ Ð Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ × Ð × Ó Ò Ù Ò Ó Ö ÕÙ Ö ÑÓ× Ð ÙÐ Ö ØÓ Ó× ÐÓ× Ô Ö × Ñ ÒÓ× Ñ Ò ÑÓ× Ý Ð Ö Ó× Ò×Ó Ñ ÒØÖ × ÕÙ Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ÐÓ × Ù Ò Ó Ð Ö Ó × ×Ô Ö Óº
  • 769.
    7.10. Redes deflujo 743 È ÖÓ Ð ÔÖ ÙÒØ Ý Ö ­ Ü ÓÒ ÔÖ Ú × ÒÓ Ø Ò Ò × ÒØ Ó × Ò Ð ÔÖ ÙÒØ Ö ÙÒÓ × Ö ÕÙ Ö Ò Ð ÙÐ Ö ØÓ Ó× ÐÓ× Ô Ö × Ñ ÒÓ× Ñ Ò ÑÓ× ÖÓ××Ó ÑÓ Ó¸ Ü ×Ø Ò Ó× × ØÙ ÓÒ × Ù Ò Ó × Ö ÕÙ Ö ×ÔÓÒ Ö Ð Ñ Ò ÑÓ ÒØÖ Ù ÐÕÙ Ö Ô Ö ÒÓ Ó× Ó Ù Ò Ó × Ö ÕÙ Ö ÓÒÓ Ö Ð Ñ ØÖÓ ÙÒ Ö º Ò Ö Ó׸ Ð Ñ ØÖÓ × ¬Ò ÓÑÓ Ð Ñ ÒÓ × ÑÔÐ Ñ × Ð Ö Óº Ä Ö ×ÔÙ ×Ø ר ÒØ ÖÖÓ ÒØ Ð ÔÖÓÔÓÖ ÓÒ Ð Ñ × Ð Ö Ó Ñ ÒÓ ÒØÖ ÙÒ Ô Ö ÒÓ Ó׸ ØÓ ÕÙ × ÓÖÖ ×ÔÓÒ ÓÒ Ð Ñ Ü ÑÓ Ú ÐÓÖ Ð Ñ ØÖ Þ Óר × ÖÖÓ ÔÓÖ Ð Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ Ó ÔÓÖ Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ Ò ×Ù Ú Ö× ÓÒ Ô Ö ØÓ Ó× ÐÓ× Ñ ÒÓ× Ñ Ò ÑÓ׺ 7.10 Redes de flujo Ä × Ó× × ÕÙ ÒÓ× ×ÓÒ ÑÙÝ Òר ØÙ × Ú Ò Ò Ô ÖØ ÒÙ ×ØÖÓ ÓÒ Ó Ý ØÖ × ÓÒ Óº × ÕÙ Þ ÔÓÖ ÐÐÓ ÕÙ Ø Ò ÑÓ× ÒÓ ×Ø Ò Ù ÖÐ × Ý¸ ÑÙ Ó Ñ ÒÓ׸ Ö ÓÒÓ Ö Ð ØÖ × Ò Ò ÕÙ Ð ÙÒ × ÐÐ × Ø Ò Ò ×Ó Ö ÒÙ ×ØÖ Ú º ÍÒ × × Ó× ×¸ Ù Ù ¸ ÙÒ Ñ ÒØ Ð Ô Ö ÒÙ ×ØÖÓ ÑÓ Ó Ú ¸ × Ð ØÙ Ó Ó ØÙ Ö ÓÒ Ð ­Ù Ó ÕÙ ×Ø ÐÐ Ú Ý Ð Ö ØÖ Ò×ÔÓÖØ ¸ ÐÐ Ñ ØÙ Ö × ÕÙ ×Ø Ø ÒÓÐÓ ÓÒÐÐ Ú º × ÖÒÓ× Ö Ñ Ò × ÒØ ÙÒ Ô Ö Ò ÓÒ ÒØÖ ÙÒ Ö ØÙ Ö × Ý ÙÒ Ö Ó Ð × ØÙ Ö × ×ÓÒ Ö Ó× Ý ÐÓ× ÑÔ ÐÑ × ÕÙ ÙÒØ Ò Ó× Ó Ñ × ØÙ Ö × ×ÓÒ ÒÓ Ó׺ ÈÙ ×ØÓ ÕÙ Ð Ö ØÖ Ò×ÔÓÖØ ÙÒ ­Ù Ó¸ Ø Ñ Ò ÑÓ× Ö ÔÖ Ò Ó ÕÙ × ØÖ Ø ÙÒ Ö Ó Ö Ó¸ ÔÙ × Ð ­Ù Ó Ö ÙÐ Ò ÙÒ ×ÓÐ Ö ÓÒº ÙÒ Ö Ó ÕÙ Ð ÙÒ ÓÖÑ ÑÓ Ð ÙÒ Ö ØÙ Ö × Ý Ð ÙÒ Ð × ­Ù Ó Ö ÙÐ ÒØ × Ð ÒÓÑ Ò Ö º 7.10.1 Definiciones y propiedades fundamentales Definici´n 7.9 (Red) ÍÒ Ö o × ÙÒ Ö Ó G =< V, E > ÓÒ Ø Ó ÓÒ ÓÖÑ Ó ÔÓÖ Ð ÕÙ ÒØÙÔÐ < V, E, s, t, C > ÓÒ ½º s∈V× Ð ÒÓ Ó Ù ÒØ Ù ÓÖ Ò ´ Ò(s) = 0µº t ∈ V × Ð ÒÓ Ó ×ÙÑ ÖÓ Ó Ø ÖÑ Ò Ð ´ ÓÙØ (t) = 0µº ¾º ¿º C : E −→ C × ÙÒ ÙÒ ÓÒ Ô ÕÙ Ð × Ò Ö Ó e ∈ E ÙÒ Ô ­Ù Ó Ô(e) Ö ÙÐ ÒØ ÔÓÖ Ð Ö Ó ¾ º ÈÓÖ ÐÓ Ò Ö Ð¸ C = Z + × Ö¸ Ð × Ô × ×ÓÒ ÒØ ÖÓ× ÔÓ× Ø ÚÓ׺ Ë Ò Ñ Ö Ó¸ ÔÙ Ò × Ö Ô Ö Ø Ñ ÒØ Ö ÓÒ Ð ×¸ ÖÖ ÓÒ Ð × Ó Ð ÙÒ ÓØÖ Ð × Ò ÐÐÓ Ò Ð × ÒØ Ó Ð Ö Ó ÕÙ Ö ÔÖ × ÒØ ÙÒ Ñ Ò ØÙ ­Ù Óº Ò Ð ÙÒÓ× ÓÒØ ÜØÓ׸ ר Ð × Ö × Ð ÒÓÑ Ò “red capacitada”º Ò Ø ÖÑ ÒÓ× Ñ × Ñ Ð Ö × ÓÒ Ð Ú Ò Ö ÒÙ ×ØÖÓ × ÙÖ×Ó¸ ÙÒ Ö × ÙÒ Ö Ó ÓÒ Ô ×Ó× ÓÒ × ×Ô ¬ ÙÒ ÒÓ Ó Ù ÒØ Ý ÙÒÓ ×ÙÑ ÖÓº Ä ¬ ÙÖ º ¼ ÐÙ×ØÖ ÙÒ ÑÔÐÓ Ò Ð Ù Ð Ð ÒÓ Ó × Ð Ù ÒØ ¸ Á Ð ×ÙÑ ÖÓ Ý ÐÓ× Ô ×Ó× ÐÓ× Ö Ó× Ð × Ô × ØÙ Ö º Ò ÙÒ Ö × ÑÔÓÖØ ÒØ ÒÓØ Ö Ó Ø Ú Ñ ÒØ ÐÓ× ÓÒ ÙÒØÓ× Ö Ó× × Ð ÒØ × Ý ÒØÖ ÒØ × ÙÒ ÒÓ Óº Ò × × ÒØ Ó¸ Ó ÙÒ ÒÓ Ó v ∈ V ¸ ÁÆ(v) × Ð ÓÒ ÙÒØÓ Ö Ó× ÒØÖ ÒØ × Ñ ÒØÖ × ÕÙ ÇÍÌ(v) Ð × Ð ÒØ ׺ ¾ ÌÙ Ó Ó Ò Ð¸ Ø Ø Ö ¸ × ÙÒ × Ð ×Óº
  • 770.
    744 Cap´ ıtulo 7. Grafos K 6 E 8 L 5 4 5 4 9 5 A D 4 7 H 3 I F 6 7 6 3 4 B 1 G 10 J ÙÖ º ¼ ÍÒ Ö Ò × ØÙ ÓÒ × Ð Ú Ö Ð¸ ÔÙ Ò ÔÐ ÒØ Ö× ÑÙÐØ ¹Ö × × Ö¸ ÙÒ ÑÙÐØ Ö Óº ×ØÓ × ÓÖÖ ×ÔÓÒ ÓÒ Ð Ó Ø Ò Ö Ó× Ó Ñ × ØÙ Ö × ÒØÖ ÙÒ Ô Ö ÒÓ Ó׺ ×ØÓ ÔÙ × Ö ÙÒ ÔÓ Ó ÔÖÓ Ð Ñ Ø Ó Ñ Ò Ö¸ ×Ó Ö ØÓ Ó × Ù× ÑÓ× Ñ ØÖ × Ô ÖÓ Ò Ø ÖÑ ÒÓ× ÑÓ Ð Þ ÓÒ¸ Ð Ò ÙÖ ÙÒ ØÙ Ö Ö ÙÒ ÒØ × ×ØÖ ÓÒ ÙÒ ÙÑ ÒØÓ Ð Ô Ð Ö Ó ÒØÖ ÐÓ× ÒÓ Ó× ÒÚÓÐÙ Ö Ó× Ñ ÒØÖ × ÕÙ ÙÒ ÓÖØ ØÙ Ö × Ò ¬ ÙÒ ×Ñ ÒÙ ÓÒº Definici´n 7.10 (Flujo factible) o Ë N =< V, E, s, t, C > ÙÒ Ö ­Ù Óº ÍÒ ­Ù Ó Ø Ð × ÙÒ ÙÒ ÓÒ f : E −→ C ÕÙ Ð × Ò ÙÒ Ú ÐÓÖ f(e) Ö Ó¸ ÒÓÑ Ò Ó ­Ù Ó Ö ÙÐ ÒØ ÕÙ × Ø × Ð × × Ù ÒØ ÓÒ ÓÒ × ½º Condici´n de capacidad: o ∀e ∈ E =⇒ f(e) ≤ Ô(e) ´ºµ ¾º Condici´n de conservaci´n del flujo: o o ∀v ∈ V|v = s ∧ v = t =⇒ f(e) = f(e) ´ º½¼µ ∀e∈ÁÆ(v) ∀e∈ÇÍÌ(v) K 6/2 E 8/5 L 5/3 4/1 5/3 4/1 9/1 5/3 A D 4/1 F 7/1 H 3/3 I 6/4 3/3 7/1 4/1 6/1 B 1/1 G 10/1 J ÙÖ º ½ ÍÒ ­Ù Ó Ø Ð ×Ó Ö Ð Ö Ð ¬ ÙÖ º ¼ Ä ¬ ÙÖ º ½ ÑÙ ×ØÖ ÙÒ ÑÔÐÓ ÙÒ ­Ù Ó Ø Ð ×Ó Ö Ð Ö Ð ¬ ÙÖ º ¼º Ä Ô × × ÓÐÓ Ò Ð ÞÕÙ Ö Ý Ð ­Ù Ó Ö ÙÐ ÒØ Ð Ö º Ë ÙÒ Ð Ò ÓÐ Ð ÓÒ ÙÒØÓ ÕÙ Ö ÔÖ × ÒØ ÐÓ× ­Ù Ó׸ ÐÓ× Ú ÐÓÖ × Ò ÐÓ× Ö Ó× ÔÙ Ò × Ô Ö Ö× Ñ ÒØ ÓÑ ×¸ ÖÖ × Ó × ÑÔÐ Ñ ÒØ ×Ô Ó׺ Ü Ô ÓÒ Ð Ù ÒØ Ý Ð ×ÙÑ ÖÓ ØÓ Ó ÒÓ Ó × Ø × Ð ÓÒ ÓÒ ÓÒ× ÖÚ ÓÒ ­Ù Óº
  • 771.
    7.10. Redes deflujo 745 Definici´n 7.11 (Valor de flujo) o Ð Ú ÐÓÖ ­Ù Ó Ò ÙÒ Ö N =< V, E, s, t, C > ÓÒ ­Ù Ó f¸ ÒÓØ Ó ÓÑÓ ­Ù Ó(N, f) × ¬Ò ÓÑÓ ­Ù Ó(N, f) = f(e) = f(e) ´ º½½µ ∀e∈ÇÍÌ(s) ∀e∈ÁÆ(t) Ò ÓØÖ × Ô Ð Ö ×¸ Ð Ú ÐÓÖ ­Ù Ó × Ð ÒØ ­Ù Ó ÕÙ Ð Ù ÒØ ¸ Ð Ù Ð × Ö Ð Ñ ×Ñ ÕÙ ÐÐ Ð ×ÙÑ ÖÓº Ò Ð ¬ ÙÖ º ½ Ð Ú ÐÓÖ ­Ù Ó × 7º 7.10.2 El TAD Net Graph<TNode,TArc,T> Ä × Ö × Ô Ø × ÑÓ Ð Þ Ò × ØÙ ÓÒ × Ö Ð × ÐÓ× ÑÙÒ Ó× Ò ØÙÖ Ð Ý Ø ¹ ÒÓÐÓ Óº ÈÙ ×ØÓ ÕÙ ÙÒ Ö × ÙÒ Ö Ó Ö Ó¸ ÒÓ× Ú Ð Ö ÑÓ× Ð Ì List Digraph<Node, Arc>º Ð Ì Ö ×ÙÐØ ÒØ ÐÓ ÒÓÑ Ò ÑÓ× Net Graph<TNode,TArc,T>º Ð Ö Ñ ÒØ ¸ Ò ÙÒ Ö ÑÓ× Ñ Ò Ö Ó× Ú ÐÓÖ × ÒÓÑ Ò Ð × Ð ÖÓ Ó Ð ¹ Ñ ÒØÓ Ò ÙØÖÓ Ð ×ÙÑ Ý Ð Ò¬Ò ØÓ¸ ÐÓ× Ù Ð × ¬Ò ÑÓ× Ð × Ù ÒØ Ñ Ò Ö Å Ñ ÖÓ× Net Graph<TNode,TArc,T> ≡ ´ µ mutable Flow_Type Infinity; Ð Ò Ó × Ò Ð Net Graph<TNode,TArc,T> Ö × Ò ÕÙ ÐÓ× Ö Ó× Ñ Ò Ò Ð Ô Ý ­Ù Óº È Ö ÐÐÓ¸ ¬Ò ÑÓ× ÙÒ ÒÙ ÚÓ Ø ÔÓ Ö Ó¸ Ö Ó Graph Arc<Arc Type>¸ Ô Ö × Ö Ù× Ó ÓÒ Net Graph<TNode,TArc,T> ÖÓ Ö ≡ template <typename Arc_Info, typename F_Type = long> class Net_Arc : public Graph_Arc<Arc_Info> { typedef F_Type Flow_Type; Flow_Type cap; Flow_Type flow; Å Ñ ÖÓ× Net Arc<Arc Info,F Type> ¼ }; Í× × Graph Arc º Ä Ð × Net Arc<Arc Info,F Type> ×ÓÐÓ × ×Ø Ò ÑÓ Ð Þ Ö ÒרÖÙÑ ÒØ Ö Ð Ù¹ Ò × Ú Ð ÓÒ × ÒÓ × ×Ø Ò Òר Ò Ö× ÔÓÖ Ð Ù×Ù Ö Ó Ò Ö× Ñ ÒØ Ð ÙÒÓ ×Ù× Ñ ØÓ Ó׺ ØÓ× × ÑÔ ÒÓ Ò Ø ÑÔÓ¸ Ò ØÖ Ñ ÒØÓ ÙÒ ÔÓ Ó ×Ô Ó¸ Ô ÖÓ Ò Ð ÒØ Ö × Ð Ú Ð ÓÒ¸ ¬Ò ÑÓ× Ð Ð × Net Node<Node Info,F Type> Ö Ú Graph Node<Node Type> ÆÓ Ó Ö ≡ template <typename Node_Info, typename F_Type = long> class Net_Node : public Graph_Node<Node_Info> { typedef F_Type Flow_Type; size_t in_degree; Flow_Type out_cap; Flow_Type in_cap; Flow_Type out_flow; Flow_Type in_flow; Net_Node()
  • 772.
    746 Cap´ ıtulo 7. Grafos : in_degree(0), out_cap(0), in_cap(0), out_flow(0), in_flow(0) { /* empty */ } }; in degree ÐÑ Ò Ð ÒØ Ö Ó× ÒØÖ ÒØ × ´Ð × Ð ÒØ × Ý × Ò Ù ÒØÖ × Graph Node<Node Type>µ ר × ÒØ × × ÖÚ Ò Ô Ö Ø ÖÑ Ò Ö Ò O(1) ÒÓ Ó× Ù ÒØ × Ý ×ÙÑ ÖÓ׺ out cap × Ð Ô × Ð Ó × Ð ×ÙÑ ØÓ × Ð × Ô × ÐÓ× Ö Ó× × Ð Ñ ÒØÖ × ÕÙ in cap × Ð ×ÙÑ Ð× ÒØÖ º out flow × Ð ×ÙÑ ØÓØ Ð ­Ù Ó ÒØÖ ÒØ Ñ ÒØÖ × ÕÙ in flow Ð Ð × Ð ÒØ º ר × Ñ Ò ØÙ × Ô ÖÑ Ø Ò Ú Ö ¬ Ö Ð ÓÒ ÓÒ ÓÒ× ÖÚ ÓÒ ­Ù Ó¸ × ÙÒ ´ º½¼µ¸ Ñ ÒØ Ð ÔÖ Ó out flow == in flowº ÄÓ× ØÖ ÙØÓ× ÙÒ ÒÓ Ó Ö ×ÓÒ Ó × ÖÚ Ð × Ñ ÒØ Ð × × Ù ÒØ × ÔÖ Ñ Ø Ú × Å Ñ ÖÓ× Net Graph<TNode,TArc,T> +≡ ´ µ const Flow_Type & get_in_cap(Node * node) const { return node->in_cap; } const Flow_Type & get_out_cap(Node * node) const { return node->out_cap; } const size_t & get_in_degree(Node * node) const { return node->in_degree; } const size_t & get_out_degree(Node * node) const { return get_num_arcs(node); } const Flow_Type & get_out_flow(Node * node) const { return node->out_flow; } const Flow_Type & get_in_flow(Node * node) const { return node->in_flow; } Ô ÖØ Ð Ò ÓÖÑ ÓÒ ØÖ ÙØÓ× Node Info Ý Arc Info¸ ÑÓ× Ö ÒÓØ Ó ÕÙ Ð × Ð × × Net Arc<Arc Info,F Type> Ý Net Node<Node Info,F Type> Ñ Ò Ò ÓÑÓ Ô Ö Ñ ØÖÓ ÔÐ ÒØ ÐÐ ÙÒ Ø ÔÓ Ö ØÑ Ø Ó ÐÐ Ñ Ó F Type¸ ÜÔÓÖØ Ó ÔÓÖ Ñ × Ð × × Ó Ð × ÒÓÒ ÑÓ Flow Typeº ÈÓÖ ÓÑ × ÓÒ¸ Flow Type × long¸ Ô ÖÓ Ò ÔÙ Ö × Ö float Ó Ù ÐÕÙ Ö ÓØÖÓ Ø ÔÓ Ð Ö Óº Ä Ö × ¬Ò Ñ ÒØ Ð Ø ÔÓ Net Graph<TNode,TArc,T> ÙÝ ×Ô ¬ ÓÒ ¹ Ò Ö Ð × ÓÑÓ × Ù Net Graph<TNode,TArc,T> ≡ template <class NodeT, class ArcT> class Net_Graph : public List_Digraph<NodeT, ArcT> { typedef List_Digraph<NodeT, ArcT> Digraph; typedef ArcT Arc; typedef NodeT Node; typedef typename Arc::Flow_Type Flow_Type; typedef typename Node::Node_Type Node_Type; typedef typename Arc::Arc_Type Arc_Type; Å Ñ ÖÓ× Net Graph<TNode,TArc,T> }; Í× × List Digraph ½ º ÄÓ× × ÒÓÒ ÑÓ× Ø ÔÓ× Ø Ò Ò ÐÓ× Ñ ×ÑÓ× × ÒØ Ó× ÕÙ Ô Ö ÐÓ× Ø ÔÓ× Ö Ó List Graph<Node, Arc> Ý List Digraph<Node, Arc>º 7.10.3 Manejos de varios fuentes o sumideros × Ð ÖÓ ÕÙ ÙÖ ÒØ Ð ÓÒרÖÙ ÓÒ ÙÒ Ö Ü ×Ø Ö Ò Ú Ö Ó× Ù ÒØ × Ý ×ÙÑ ÖÓ׺ Ë Ò Ñ Ö Ó¸ × ÔÐ Ù× Ð ¸ Ø ÒØÓ Ò Ú Ð Ð ÔÖÓÔ Ó Ì ¸ × ÓÑÓ Ð × Ó¸ Ø Ò Ö ÙÒ Ö ÓÒ Ú Ö Ó× Ù ÒØ × Ý ×ÙÑ ÖÓ׺ È Ö ÓÒÓ Ö Ö Ô Ñ ÒØ ÐÓ× ÒÓ Ó× Ù ÒØ × Ý ×ÙÑ ÖÓ× × ÙØ Ð Þ Ò × Ò Ó× ÓÒ ÙÒØÓ× Ò Ñ Ó× ÙÝ ÑÔÐ ÒØ ÓÒ × × Ò Ð Ø ÔÓ set<T> Ð Ð ÓØ ר Ò Ö C++¸ Ð
  • 773.
    7.10. Redes deflujo 747 Ù Ð Ò ALEPH ר × Ó Ò Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ Ð ØÓÖ Ñ ÒØ ÕÙ Ð Ö Ó× Ð Ø ÔÓ ØÖ Ô ×ØÙ Ó Ò Ü º¿ ´Ô Ò µ Å Ñ ÖÓ× Net Graph<TNode,TArc,T> +≡ ´ µ Aleph::set<Node*> src_nodes; Aleph::set<Node*> sink_nodes; src nodes ÐÑ Ò Ð Ð ×Ø ÒÓ Ó× Ù ÒØ Ý tgt nodes Ð ×ÙÑ ÖÓ׺ Ù Ò Ó × Ö ÙÒ ÒÓ Ó¸ ר × Ò× ÖØ Ò Ñ Ó× Ö ÓР׺ Ù Ò Ó × Ò× ÖØ ÙÒ Ö Ó¸ × Ð Ñ Ò ×Ù ÒÓ Ó ÓÖ Ò sink nodes Ý ×Ù ×Ø ÒÓ src nodesº ר ÑÓ Ó¸ Ò Ù ÐÕÙ Ö ÑÓÑ ÒØÓ ÓÒÓ ÑÓ× ÐÓ× Ù ÒØ × Ý ×ÙÑ ÖÓ× Ð Ö º È Ö ÓÒÓ Ö ÐÓ× ÒÓ Ó× Ù ÒØ × Ó ÐÓ× ×ÙÑ ÖÓ׸ × ÜÔÓÖØ Ò ÔÖ Ñ Ø Ú × Ö Ö Ò ÐÓ× ÓÒ ÙÒØÓ× Å Ñ ÖÓ× Net Graph<TNode,TArc,T> +≡ ´ µ Aleph::set<Node*> & get_src_nodes() { return src_nodes; } Aleph::set<Node*> & get_sink_nodes() { return sink_nodes; } ÈÓÖ Ö ÞÓÒ × ÔÖ Ø × Ð × Ö Ö Ò × ×ØÓ× ÓÒ ÙÒØÓ× ÒÓ ×ÓÒ ÓÒר ÒØ ׸ Ô ÖÓ ×Ø × ÒÓ ×Ø Ò ×Ø Ò × ÑÓ ¬ ÓÒº Ä ÙØ Ð Þ ÓÒ ÙÒ ×ÓÐÓ Ù ÒØ Ý ÙÒ ×ÓÐÓ ×ÙÑ ÖÓ Ò ÙÒ Ö × ÔÓÖ × ÑÔÐ Ñ Ø Ñ Ø Ý Ð ÓÖ ØÑ º Ë Ð Ö ÔÓ× Ñ × ÙÒ Ù ÒØ Ó ×ÙÑ ÖÓ¸ ÒØÓÒ × ×Ø × Ö Ù ÓÐÓ Ö ÙÒ ÒÓ Ó ×ÙÔÖ ¹ Ù ÒØ ÙÒ Ó¸ ÕÙ ÒÓ × Ô ÖØ ÐÓ Ð Ö ¸ ÓÒ Ø Ó ÐÓ× Ù ÒØ × ØÖ Ú × Ö Ó× ÓÒ Ô Ù Ð Ð ×ÙÑ Ð× Ô × ÐÓ× Ö Ó× × Ð ØÓ Ó× ÐÓ× Ù ÒØ ׺ Ð Ñ ×ÑÓ ÑÓ Ó¸ ÐÓ× ×ÙÑ ÖÓ× × ÓÒ Ø Ò ÙÒ ×ÓÐÓ ×ÙÔÖ ¹×ÙÑ ÖÓ ÓÒ Ö Ó× Ô Ù Ð Ð ×ÙÑ ØÓ × Ð × Ô × ÐÓ× Ö Ó× ÒØÖ ØÓ Ó× ÐÓ× ×ÙÑ ÖÓ׺ Ä ¬ ÙÖ º ¾ ÐÙ×ØÖ ÙÒ ÑÔÐÓº A F A f1 F FA D I f2 f6 FI D I S FB B G T f3 f7 FJ B G FC E J f4 f8 E J C H f5 f9 C f6 H ´ µÊ ÓÒ Ú Ö Ó× Ù ÒØ × Ý ×ÙÑ ÖÓ× ´ µ Ä Ñ ×Ñ Ö ÓÒ ÙÒ ×ÙÔÖ Ù ÒØ Ý ×ÙÑ ÖÓ ÙÖ º ¾ ÑÔÐÓ Ö Ù ÓÒ ÙÒ Ö ÓÒ Ú Ö Ó× ÒÓ Ó× Ù ÒØ × Ý ×ÙÑ ÖÓ× ÙÒ ÓÒ ÙÒ ×ÙÔÖ ¹ Ù ÒØ Ý ÙÒ ×ÙÔÖ ¹×ÙÑ ÖÓº Ä Ô ÐÓ× ×ÙÔÖ ¹ Ö Ó× ÕÙ Ñ Ò Ò × Ð Ù ÒØ × FA = Ô(ÇÍÌ(A)), FB = Ô(ÇÍÌ(B)), FC = Ô(ÇÍÌ(C))¸ Ý Ð ÐÓ× ÕÙ ÖÖ Ò Ð ×ÙÑ ÖÓ FI = Ô(ÁÆ(J)), FJ = Ô(ÁÆ(J))º Ä Ò ÙÖ ×ÙÔÖ ¹ÒÓ Ó× × Ö Ð Þ ØÖ Ú × Ð × Ù ÒØ ÑÐ ÔÖ Ñ Ø Ú × ÔÙ Ð × Å Ñ ÖÓ× Net Graph<TNode,TArc,T> +≡ ´ µ void make_super_source() { DynDlist<Node*> src_list; for (typename Aleph::set<Node*>::iterator it = src_nodes.begin();
  • 774.
    748 Cap´ ıtulo 7. Grafos it != src_nodes.end(); ++it) src_list.append(*it); Node * super_source = insert_node(); while (not src_list.is_empty()) { Node * p = src_list.remove_first(); insert_arc(super_source, p, get_out_cap(p)); } with_super_source = true; } void unmake_super_source() { remove_node(*src_nodes.begin()); with_super_source = false; } void make_super_sink() { DynDlist<Node*> sink_list; for (typename Aleph::set<Node*>::iterator it = sink_nodes.begin(); it != sink_nodes.end(); ++it) sink_list.append(*it); Node * super_sink = insert_node(); while (not sink_list.is_empty()) { Node * p = sink_list.remove_first(); insert_arc(p, super_sink, get_in_cap(p)); } with_super_sink = true; } void unmake_super_sink() { remove_node(*sink_nodes.begin()); with_super_sink = false; } void make_super_nodes() { make_super_source(); make_super_sink(); } void unmake_super_nodes() { unmake_super_source(); unmake_super_sink(); } Í× × DynDlist ¿ º ר × ÔÖ Ñ Ø Ú ×¸ Ò Ô ÖØ ÙÐ Ö Ð × Ó× ÙÐØ Ñ ×¸ × Ö Ò ÒÚÓ × ÔÓÖ ÙÒ Ð ÓÖ ØÑÓ Ð ÙÐÓ ­Ù Ó Ñ Ü ÑÓ Ð ÔÖ Ò Ô Ó Ý ¬Ò Ð ×Ù× Ð ÙÐÓ׺ ÓÑÓ ÔÙ ÔÖ Ö× ¸ Ð × ÖÙØ Ò × ÑÔÐ Ò Ð × Ò Ö × ÐÓ × with super source Ý with super sink Ô Ö Ò Ö × Ý Ó ÒÓ ×ÙÔÖ ¹ÒÓ Ó׺ ר × Ò Ö × ×ÓÒ ØÖ ÙØÓ× Net Graph<TNode,TArc,T>º
  • 775.
    7.10. Redes deflujo 749 ÍÒ Ú Þ ØÖ Ò× ÓÖÑ Ð Ö Ñ ÒØ make super nodes()¸ × Ö ÒØ Þ ÕÙ × Ø Ò ÙÒ ×ÓÐÓ Ù ÒØ Ý ÙÒ ×ÓÐÓ ×ÙÑ ÖÓº × Ô٠׸ Ú Ð Ð Ô Ò ×ÔÓÒ Ö Ó× Ó × ÖÚ ÓÖ × Å Ñ ÖÓ× Net Graph<TNode,TArc,T> +≡ ´ µ Node * get_source() { return *get_src_nodes().begin(); } Node * get_sink() { return *get_sink_nodes().begin(); } 7.10.4 Operaciones topol´gicas sobre una red capacitada o Net Graph<TNode,TArc,T>Ö ÕÙ Ö ×Ó Ö Ö Ö Ý ÜØ Ò Ö Ð ÙÒ × ÙÒ ÓÒ × List Digraph<Node, Arc>¸×Ô ¬ Ñ ÒØ Ð × Ö Ð ÓÒ × ÓÒ Ð Ñ Ò Ó ÒÓ Ó× Ý Ö Ó׺ ÓÑ Ò ÑÓ× ÔÓÖ Ð Ò× Ö ÓÒ ÙÒ ÒÓ Ó Å Ñ ÖÓ× Net Graph<TNode,TArc,T> +≡ ´ µ Node * insert_node(const Node_Type & node_info) { Node * p = Digraph::insert_node(node_info); src_nodes.insert(p); sink_nodes.insert(p); return p; } Ä ÖÙØ Ò Ô Ð Ð Ñ ÕÙ Ò Ö List Digraph<Node, Arc>¸ ÙÝÓ × ÒÓÒ ÑÓ ÒØÖÓ Net Graph<TNode,TArc,T> × Digraphº Ä ×Ó Ö Ö ÜØ Ò Ð Ò Ö Ð ÒÙ ÚÓ ÒÓ Ó ÐÓ× ÓÒ ÙÒØÓ× src nodes Ý sink nodesº ÓÖ Ú ÑÓ× Ð ÜØ Ò× ÓÒ Ô Ö Ð Ò× Ö ÓÒ ÙÒ Ö Ó Å Ñ ÖÓ× Net Graph<TNode,TArc,T> +≡ ´ µ ¼ virtual Arc * insert_arc(Node * src_node, Node * tgt_node, const typename Arc::Arc_Type & arc_info, const Flow_Type & cap, const Flow_Type & flow) { // inserci´n en la clase base o Arc * arc = Digraph::insert_arc(src_node, tgt_node, arc_info); src_nodes.erase(tgt_node); // elimina destino de src_nodes sink_nodes.erase(src_node); // elimina fuente de sink_nodes arc->cap = cap; // ajuste capacidad y flujo de arco arc->flow = flow; tgt_node->in_degree++; // actualiza informaci´n de control de nodo o src_node->out_cap += cap; tgt_node->in_cap += cap; src_node->out_flow += flow; tgt_node->in_flow += flow; return arc; } insert arc() ×Ó Ö Ö Ó Ò Ð Þ Ð ×Ø Ó ÐÓ× ­Ù Ó× Ò ÐÓ× ÒÓ Ó× ÓÖ Ò Ý ×¹ Ø ÒÓ × ÓÑÓ Ð Ö Ó ÒØÖ Ð ÒÓ Ó ×Ø ÒÓº ÍÒ Ú Þ ÕÙ Ü ×Ø ÙÒ Ö Ó src node→tgt node¸ src node ÓÒ ÖØ ØÙ × Ö ÙÒ ×ÙÑ ÖÓ¸ Ñ ÒØÖ × ÕÙ tgt node × Ö Ù ÒØ ÐÐ Ð × Ð Ñ Ò ÓÒ × ÐÓ× ÓÒ ÙÒØÓ× src nodes Ý sink nodesº ØÓ× Ú Ö× Ø Ð ¸ Net Graph<TNode,TArc,T> ÜÔÓÖØ Ú Ö× ÓÒ × ×Ó Ö Ö × insert arc() ÓÒ ×Ø ÒØ × ÔÖ × ÒØ ÓÒ × Ô Ö Ô Ö Ñ ØÖÓ× Ô Ý ­Ù Ó
  • 776.
    750 Cap´ ıtulo 7. Grafos Ð × Ù Ð × ÕÙ Þ Ð Ñ × ÒØ Ö × ÒØ × ¼ Å Ñ ÖÓ× Net Graph<TNode,TArc,T> +≡ ´ µ ¼ virtual Arc * insert_arc(Node * src_node, Node * tgt_node, const Flow_Type & cap) { return insert_arc(src_node, tgt_node, Arc_Type(), cap, 0); } Ä Ð Ñ Ò ÓÒ ÙÒ Ö Ó Ö ÕÙ Ö ØÙ Ð Þ Ö Ð Ö Ó ÒØÖ Ð ÒÓ Ó ×Ø ÒÓ Ý ÐÓ× ÙÑÙÐ Ó× ­Ù Ó× ÐÓ× ÒÓ Ó׸ × ÓÑÓ Ð Ò ÙÖ Ú ÒØÙ Ð Ò ÐÓ× ÓÒ ÙÒ¹ ØÓ× src nodes Ý sink nodesº ÈÓÖ ×Ó¸ Ò Net Graph<TNode,TArc,T> Ø Ñ Ò ÑÓ× ×Ó Ö Ö Ö ¼ Å Ñ ÖÓ× Net Graph<TNode,TArc,T> +≡ ´ µ ¼ ¼ virtual void remove_arc(Arc * arc) { Node * src = get_src_node(arc); Node * tgt = get_tgt_node(arc); if (--(tgt->in_degree) == 0) src_nodes.insert(tgt); src->out_cap -= arc->cap; src->out_flow -= arc->flow; tgt->in_cap -= arc->cap; tgt->in_flow -= arc->flow; Digraph::remove_arc(arc); if (get_num_arcs(src) == 0) sink_nodes.insert(src); } Ä Ð Ñ Ò ÓÒ ÙÒ ÒÓ Ó Ö ÕÙ Ö Ð Ñ Ò Ö ÐÓ× ÓÒ ÙÒØÓ× src nodes Ý sink nodes ´ Ò ×Ó ÕÙ Ð ÒÓ Ó × Ò Ù ÒØÖ Ò Ð ÙÒÓ ÐÐÓ×µ¸ Ô ÖÓ Ø Ñ Ò Ö ÕÙ Ö ØÙ ¹ Ð Þ Ö ÐÓ× ×Ø Ó× ÐÓ× ÒÓ Ó× ÓÒ Ø Ó× ÔÓÖ ÐÓ× Ö Ó× Ð ÒÓ Ó Ð Ñ Ò Óº Ò Ð Ð × List Graph<Node, Arc> ×ØÓ × Ö ×Ù ÐÚ ÐÐ Ñ Ò Ó ×Ù × Ú Ñ ÒØ remove arc()º ÕÙ Ý ÕÙ Ö ÐÓ Ñ ×ÑÓ Ñ × Ð Ð Ñ Ò ÓÒ ÐÓ× ÓÒ ÙÒØÓ× src nodes Ý sink nodesº ËÙÖ ÒØÓÒ × Ð ÔÖ ÙÒØ ÔÓ ÑÓ× Ö Ù× Ö List Graph<Node, Arc>::remove node() Ä Ö ×ÔÙ ×Ø × ¬ÖÑ Ø Ú ¸ ÔÙ × remove arc() × ÙÒ Ñ ØÓ Ó Ú ÖØÙ Ð × Ð Ð × × List Graph<Node, Arc>º ר ÑÓ Ó¸ ÒרÖÙÑ ÒØ Ö remove node() × ÑÙÝ × ÑÔÐ ¼ Å Ñ ÖÓ× Net Graph<TNode,TArc,T> +≡ ´ µ ¼ ¼ virtual void remove_node(Node * p) { Digraph::remove_node(p); src_nodes.erase(p); sink_nodes.erase(p); } Ä ÒרÖÙ ÓÒ ¬Ò Ð Digraph::remove node(p) ÒÚÓ Ö Ð Ð Ñ Ò ÓÒ ÐÓ× Ö Ó× ÙÒ ÒÓ Ó ´Ú Ö Ü º¿º½¼º ´Ô Ò µµº ÈÙ ×ØÓ ÕÙ remove arc() × Ú ÖØÙ Ð¸ Digraph::remove node(p) ÒÚÓ Net Graph<TNode,TArc,T>::remove arc()º ÅÙ Ó× ÔÖÓ Ð Ñ × Ö Ó× × Ö ×Ù ÐÚ Ò ØÖ Ú × Ö × ­Ù Óº × ÔÙ × ÔÐ Ù× Ð Ý ÔÖÓ Ð ÓÒרÖÙ Ö ÙÒ Ö Ô ÖØ Ö ÙÒ Ö Ó Ý Ü ×Ø ÒØ ¸ Ö ×ÓÐÚ Ö ÓÒ ÐÐ Ð ÔÖÓ Ð Ñ Ò Ù ×Ø ÓÒ¸ Ý ÐÙ Ó Ö Ö × Ö Ð Ö Ó ÓÖ Ò Ðº ÈÓÖ ×Ø Ö ÞÓÒ¸ × × Ð ×ÔÓÒ Ö ÙÒ ÓÒרÖÙ ØÓÖ ÓÔ Ö Ó ÕÙ ÒÓ× ÓÒרÖÙÝ ÙÒ Ö Ñ Ô ¼ Å Ñ ÖÓ× Net Graph<TNode,TArc,T> +≡ ´ µ ¼ ½
  • 777.
    7.10. Redes deflujo 751 Net_Graph(Digraph & digraph) { Net_Graph::Net_Graph(); // inicializa atributos copy_graph(*this, digraph, true); // copia mapeada } À Ý ÓØÖÓ ÓÒרÖÙ ØÓÖ Net Graph(Net Graph & net)¸ Ð Ù Ð ÒÓ Ö Ð Þ Ð ÓÔ Ñ Ô º È Ö ÕÙ Ð ÓÒרÖÙ ØÓÖ Ô ÖØ Ö ÙÒ Ö Ó Ø Ò × ÒØ Ó¸ × Ö ÕÙ Ö ÔÓ Ö Ò Ö Ó ÑÓ ¬ Ö ÐÓ× Ú ÐÓÖ × Ô Ý ­Ù Óº È Ö ÐÐÓ¸ ÜÔÓÖØ ÑÓ× Ð × Ù ÒØ Ô Ö ÔÖ Ñ Ø Ú × ½ Å Ñ ÖÓ× Net Graph<TNode,TArc,T> +≡ ´ µ ¼ ½ void set_cap(Arc * arc, const Flow_Type & cap) { const Flow_Type old_cap = arc->cap; arc->cap = cap; Node * src_node = get_src_node(arc); src_node->out_cap -= old_cap; src_node->out_cap += cap; Node * tgt_node = get_tgt_node(arc); tgt_node->in_cap -= old_cap; tgt_node->in_cap += cap; } void set_flow(Arc * arc, const Flow_Type & flow) { const Flow_Type old_flow = arc->flow; arc->flow = flow; Node * src_node = get_src_node(arc); src_node->out_flow -= old_flow; src_node->out_flow += flow; Node * tgt_node = get_tgt_node(arc); tgt_node->in_flow -= old_flow; tgt_node->in_flow += flow; } ÈÓÖ ×ÙÔÙ ×ØÓ¸ Ø Ñ Ò ÑÓ× ÔÓ Ö ÓÒÓ Ö ÐÓ× ØÖ ÙØÓ× Ö ×Ó Ó× ÙÒ Ö ¸ ÐÓ ÕÙ Ö Ð Þ ÑÓ× Ñ ÒØ Ó× Ó × ÖÚ ÓÖ × ½ Å Ñ ÖÓ× Net Graph<TNode,TArc,T> +≡ ´ µ ½ ½ const Flow_Type & get_flow(Arc * arc) const { return arc->flow; } const Flow_Type & get_cap(Arc * arc) const { return arc->cap; } ÍÒ ÖÙØ Ò ×Ø ÒØ × Ð ÓÒ× ×Ø Ò Ö ¹ Ò Ö ÙÒ Ö ×ØÓ ×¸ ÓÐÓ Ö ×Ù Ú ÐÓÖ ­Ù Ó Ò ÖÓ ½ Å Ñ ÖÓ× Net Graph<TNode,TArc,T> +≡ ´ µ ½ ¾ void reset() { for (Arc_Iterator<Net_Graph> it(*this); it.has_current(); it.next()) it.get_current()->flow = 0; for (Node_Iterator<Net_Graph> it(*this); it.has_current(); it.next()) { Node * p = it.get_current(); p->in_flow = p->out_flow = 0; }
  • 778.
    752 Cap´ ıtulo 7. Grafos } Í× × Arc Iterator Ò Node Iterator º ÈÖÓ Ð Ñ ÒØ ÙÒ Ð × ÔÖ Ñ Ø Ú × ÙÒ Ñ ÒØ Ð × × ÓÒÓ Ö Ð Ú ÐÓÖ Ð ­Ù Ó Ð Ö ¾ Å Ñ ÖÓ× Net Graph<TNode,TArc,T> +≡ ´ µ ½ ¼ const Flow_Type & flow_value() { return get_source()->out_flow; } 7.10.5 Cortes de red Ð ÙÒÓ× ÔÖÓ Ð Ñ × Ö Ó× ÔÙ Ò ÔÐ ÒØ Ö× Ò Ø ÖÑ ÒÓ× ÙÒ Ö ÒÚ Ö× Ñ ÒØ º ÍÒ ÔÖ Ñ Ö Ú Ò ÙÐÓ ÒØÖ ×Ø × Ó× Ú × ÓÒ × × ÒÓØ Ö Ò Ð ÔÖÓÜ Ñ ¬Ò ÓÒº Definici´n 7.12 (Corte de una red) o Ë ÙÒ Ö N =< V, E, s, t, C >º Ë Ò ½º Vs = {s} ∪ {v ∈ V | v = t} ¾º Vt = {t} ∪ {v ∈ V | v = s} Ì Ð × ÕÙ Vs ∪ Vt = V ∧ Vs ∩ Vt = ∅ × Ö¸ ÙÒ Ô ÖØ ÓÒ × ÙÒØ V ¸ ÒÓÑ Ò Vs¸ ÕÙ ÓÒØ Ò Ð ÒÓ Ó Ù ÒØ Ô ÖÓ ÒÓ Ð ×Ø ÒÓ Ý Vt¸ ÕÙ ÓÒØ Ò Ð ÒÓ Ó ×Ø ÒÓ Ô ÖÓ ÒÓ Ð Ù ÒØ º ÍÒ ÓÖØ Ð Ö N¸ ÒÓØ Ó < Vs, Vt >¸ × ¬Ò ÔÓÖ Ð ÓÒ ÙÒØÓ Ö Ó× ÕÙ ÓÒ Ø Ò ÒÓ Ó× Vs ÒÓ Ó× Vtº ÆÓØ ÑÓ× ÕÙ < Vs, Vt > ÒÓ ÓÒØ Ò ÐÓ× Ö Ó× ÕÙ Ú Ò × Vt < Vs, Vt >º ר ÓÒ ÙÒØÓ × ÒÓØ ÓÑÓ < Vs, Vt > Ä ¬ ÙÖ º ¿ ÐÙ×ØÖ ÙÒ ÓÖØ ÓÒ Vs = {A, B, D, F, G, K} Ý Vt = {E, H, I, J, L} ÓÒ < Vs, Vt >= {(K → E), (D → E), (F → H), (G → H), (G → J)} Ý < Vs, Vt >= {(L → F)}º Vt Vs K 6 E 8 L 5 4 5 4 9 5 A D 4 7 H 3 I F 6 7 6 3 4 B 1 G 10 J ÙÖ º ¿ ÍÒ ÓÖØ ×Ó Ö Ð Ö Ð ¬ ÙÖ º ¼ Ñ ÒÙ Ó¸ Ð Ð Ø Ö ØÙÖ Ö Ó× ÒÓÑ Ò < Vs, Vt > ÓÑÓ ÙÒ ÓÖØ ×¹Ø ¸ ÔÓÖ Ð Ó ÕÙ ×ÓÒ ÐÓ× ÒÓ Ó× Ù ÒØ Ý ×ÙÑ ÖÓ ÐÓ× ÕÙ ÓÑ Ò Ò Ð Ô ÖØ ÓÒº Ð ×ÙÒØÓ × Ò Ð Ð Ô Ö Ò ÓÒ ÒØÖ Ð Ö Ý Ð Ö Ó × Ð Ö Ø Ö Ò Ñ Ó ÙÒ ­Ù Ó Ò Ð ØÙ Ö º Ë ¸ ÔÓÖ ÑÔÐÓ¸ Ö ÑÓ× ÙÒ ÐÐ Ú Ý ÒÓ ×ÙÖØ Ù ¸ ÒØÓÒ × ÒØÙ ÑÓ× ÕÙ Ý ÙÒ ÓÖØ Ò Ð ÙÒ Ô ÖØ º Ä Ö Ð ÓÒ ÓÒ Ø Ú ÙÒ Ö Ó ÔÙ ×ØÙ Ö× × ÙÒ ×Ø ÒØÙ ÓÒº Ë Ø Ò ÑÓ× ÙÒ Ö Ó Ý × ÑÓ× Ú Ö Ù Ö ×Ù ÓÒ Ø Ú ¸ ÒØÓÒ × ÔÓ Ö ÑÓ× ÒÝ Ø ÖÐ ÙÒ ­Ù Ó Ð ­Ù Ó Ô ÖÑ Ö ØÓ Ó× ÐÓ× ÒÓ Ó× ÓÒ Ø Ó׺
  • 779.
    7.10. Redes deflujo 753 Definici´n 7.13 (Valor de flujo de un corte) o Ë ÙÒ Ö N =< V, E, s, t, C > ÓÒ ­Ù Ó f Ý ÙÒ ÓÖØ Ù ÐÕÙ Ö < Vs, Vt >º Ð Ú ÐÓÖ ­Ù Ó Ð ÓÖØ × ¬Ò ÓÑÓ ­Ù Ó(< Vs, Vt >, f) = f(e) − f(e) ´ º½¾µ ∀e∈ÇÍÌ(Vs ) ∀e∈ÁÆ(Vt ) ÓÒ ÇÍÌ(Vs) ×ÓÒ ÐÓ× Ö Ó× Ð ÓÖØ ÕÙ Ú Ò × Vs Vt ݸ Ö ÔÖÓ Ñ ÒØ ¸ ÁÆ(Vt) ×ÓÒ ÐÓ× Ö Ó× Ð ÓÖØ ÕÙ Ú Ò × Vt Vsº Proposici´n 7.7 (Equivalencia de flujo entre una red y un corte) Ë o ÙÒ Ö N =< V, E, s, t, C > ÓÒ ­Ù Ó f Ý ÙÒ ÓÖØ Ù ÐÕÙ Ö < Vs, Vt >º ÒØÓÒ × ­Ù Ó(< Vs, Vt >, f) = ­Ù Ó(N, f) =⇒ ´ º½¿µ f(e) − f(e) = f(e) − f(e) ´ º½ µ ∀e∈ÇÍÌ(Vs ) ∀e∈ÁÆ(Vt ) ∀e∈ÇÍÌ(s) ∀e∈ÁÆ(s) = f(e) ∀e∈ÇÍÌ(s) Demostraci´n o Ë ÑÓ× ÔÓÖ ¬Ò ÓÒ¾ ¸ ÕÙ ­Ù Ó(N, f) = f(e) − f(e) . ∀e∈ÇÍÌ(Vs ) ∀e∈ÁÆ(Vt ) × Ô٠׸ ÔÓ ÑÓ× ÔÐ ÒØ Ö Ð Ú ÐÓÖ ­Ù Ó Ð ÓÖØ ÓÑÓ ­Ù Ó(N, f) = f(e) − f(e) ∀v∈Vs ∀e∈ÇÍÌ(v) ∀e∈ÁÆ(v) = f(e) − f(e) . ´ º½ µ ∀v∈Vs ∀e∈ÇÍÌ(v) ∀v∈Vs ∀e∈ÁÆ(v) Ü Ñ Ò ÑÓ× Ð × Ù ÒØ × ØÙ ÓÒ Ô ØÓÖ Ò Ð ÕÙ × ÒØ ¬ ÙÒ ÒÓ Ó v ∈ Vs¸ Ð Ù Ð ÔÙ Ò Ö Ð Þ Ö× × Ò Ò Ò ÙÒ ÔÖÓ Ð Ñ Vt Vs t s v {e ∈ ÇÍÌ(v) | e ∈< Vs , Vt >} {e ∈ ÇÍÌ(v) | e ∈< Vs , Vt >} / ÕÙ × ×ÔÖ Ò ÕÙ ÐÓ× Ö Ó× ×Ð v ÔÙ Ò Ô ÖØ ÓÒ Ö× Ò ÇÍÌ(v) = {e ∈ ÇÍÌ(v) | e ∈< Vs, Vt >} / ∪ {e ∈ ÇÍÌ(v) | e ∈< Vs, Vt >} ¾ Ò ×Ø ÔÙÒØÓ × × Ò Ð Ö ÓÖ Ö Ó ÒÓØ Ö ÕÙ ÔÙ ×ØÓ ÕÙ Ð Ù ÒØ s ÒÓ Ø Ò Ö Ó× ÒØÖ ¸ Ð Ö ×Ø Ò Ó ∀e∈ÁÆ(s) f(e) = 0º ÈÓÖ ÓÒ× Ù ÒØ Ð ­Ù Ó ÙÒ Ö × ∀e∈ÇÍÌ(s) f(e) − ∀e∈ÁÆ(s) f(e) = ∀e∈ÇÍÌ(s) f(e) ÐÓ ÕÙ × ÓÖÖ ×ÔÓÒ ÓÒ ´ º½½µº
  • 780.
    754 Cap´ ıtulo 7. Grafos × Ö¸ ÐÓ× Ö Ó× ÕÙ ÓÒ Ø Ò ÒÓ Ó× Ô ÖØ Ò ÒØ × Vs Ý ÐÓ× ÕÙ ÓÒ Ø Ò ÒÓ Ó× Ô ÖØ Ò ÒØ × Vt ¾ º ÜØ Ò Ò Ó ×Ø Ó × ÖÚ ÓÒ Ô Ö ØÓ Ó Ð ÓÒ ÙÒØÓ Vs¸ ÒØÓÒ × ÇÍÌ(v) = {e ∈ ÇÍÌ(v) | e ∈< Vs, Vt >} ∪ {e ∈ ÇÍÌ(v) | e ∈< Vs, Vt >} / ∀v∈Vs ∀v∈Vs = {e ∈ ÇÍÌ(Vs) | e ∈< Vs, Vt >} ∪ < Vs, Vt > / ´ º½ µ ר Ö ×ÙÐØ Ó ÒÓ× Ô ÖÑ Ø ÓÖÑÙÐ Ö f(e) = f(e) + f(e) ´ º½ µ ∀v∈Vs ∀e∈ÇÍÌ(v) ∀e∈{e∈ÇÍÌ(v)|e/ s ,Vt >} ∈<V ∀e∈<Vs ,Vt > Ð Ñ ×ÑÓ ÑÓ Ó¸ ÓÒ Ð Ö ×ÙÐØ Ó Ò ÐÓ Ó ´ º½ µ¾ f(e) = f(e) + f(e) ´ º¾¼µ ∀v∈Vs ∀e∈ÁÆ(v) ∀e∈{e∈ÁÆ(v)|e/ s ,Vt >} ∈<V ∀e∈<Vs ,Vt > ËÙ ×Ø ØÙÝ Ò Ó ´ º½ µ Ý ´ º¾¼µ Ò ´ º½ µ ­Ù Ó(N, f) = f(e) + f(e) − ∀e∈{e∈ÇÍÌ(v)|e/ s ,Vt >} ∈<V ∀e∈<Vs ,Vt > f(e) − f(e) ´ º¾½µ ∀e∈{e∈ÁÆ(v)|e/ s ,Vt >} ∈<V ∀e∈<Vs ,Vt > Ä ÔÖÙ Ö ÕÙ Ö ÔÖ Ò Ö ÕÙ f(e) = f(e) . ∀e∈{e∈ÇÍÌ(v)|e/ s ,Vt >} ∈<V ∀e∈{e∈ÁÆ(v)|e/ s ,Vt >} ∈<V Ó¸ ÐÓ ÕÙ Ñ ×ÓÒ ÐÓ× ÒÓ Ó׸ Ô ÖÓ ÐÓ× Ö Ó× ×ÓÒ ÐÓ× Ñ ×ÑÓ׸ ÔÙ × ÙÒ Ö Ó ÕÙ × × Ð Ò ÙÒ ÒÓ Ó ÐÓ × ÒØÖ Ò ×Ù ×Ø ÒÓº ÔÖ Ò Ó ×ØÓ¸ ´ º¾½µ × ÔÐ ÒØ ÓÑÓ ­Ù Ó(N, f) = f(e) − f(e) , ∀e∈<Vs ,Vt > ∀e∈<Vs ,Vt > ÐÓ Ù Ð¸ ÔÓÖ Ð ÓÒ ÓÒ ÓÒ× ÖÚ ÓÒ Ð ­Ù Ó¸ × ÓÖÖ ×ÔÓÒ ÓÒ Ð ­Ù Ó Ð ÒÓ Ó Ù ÒØ ¸ ÔÙ × Ò Ð Ö ×ØÓ ÐÓ× ÒÓ Ó× ×Ø × ÓÒ× ÖÚ Ý Ð Ö Ò × ÒÙÐ ÓÑÓ ÓÖÓÐ Ö Ó Ð ÔÖÓÔÓ× ÓÒ ÒØ Ö ÓÖ ÔÓ ÑÓ× ×Ø Ð Ö ÕÙ ¸ Ó ÙÒ ÓÖØ < Vs, Vt >¸ ÒØÓÒ × ­Ù Ó(< Vs, Vt >, f) = f(e) = f(e) = ­Ù Ó(N, f) ´ º¾¾µ ∀e∈ÇÍÌ(s) ∀e∈ÁÆ(t) ¾ Ò ÐÓ Ñ ÒØ ÁÆ(v) = {e ∈ ÁÆ(v) | e ∈< Vs , Vt >} / ∪ {e ∈ ÁÆ(v) | e ∈< Vs , Vt >} . ´ º½ µ ¾ [ ÁÆ(v) = {e ∈ ÁÆ(Vs ) | e ∈< Vs , Vt >} ∪ / < Vs , Vt > ´ º½ µ ∀v∈V s
  • 781.
    7.10. Redes deflujo 755 7.10.6 Flujo m´ximo/corte m´ a ınimo Ä Ö Ý ­Ù Ó Ó Ö Ñ ÝÓÖ ÒØ Ö × Ù Ò Ó ÒÓ× ÔÖ ÙÒØ ÑÓ× ÓÑÓ Ò ÓÒØÖ ÑÓ× ÙÒ ­Ù Ó f Ø Ð Ñ Ò Ö ÕÙ ×Ø × Ñ Ü ÑÓ º Ì Ð ­Ù Ó Ñ Ü ÑÓ × ÒÓØ ÓÑÓ f∗ º × Ò ÐÑ ÒØ ¸ ר × Ð ÔÖÓ Ð Ñ ÒרÖÙÑ ÒØÓ ×Ø × ÓÒ Ý¸ ÐÓ Ð ¬ ÑÓ× ÒרÖÙÑ ÒØ Ð ÔÓÖÕÙ Ð ÔÖÓ Ð Ñ Ð ­Ù Ó Ñ Ü ÑÓ × Ú ÙÐÓ Ö ×ÓÐÙ ÓÒ ÙÒ ÑÔÐ Ñ ÓØÖÓ× ÔÖÓ Ð Ñ ×º Ò ×Ø × ÒØ Ó¸ ÒÓ× ÓÒÚ Ò ÑÓ×ØÖ Ö Ð Ô Ö Ð Ð ×ÑÓ ÒØÖ ÙÒ ­Ù Ó Ñ Ü ÑÓ Ý ÙÒ ÓÖØ Ô Ñ Ò Ñ ÐÓ ÕÙ Ö ÕÙ Ö Ð × Ù ÒØ ¬Ò ÓÒº Definici´n 7.14 (Capacidad de un corte) Ë o ÙÒ Ö N =< V, E, s, t, C > Ý ÙÒ ÓÖØ Ù ÐÕÙ Ö < Vs, Vt >º Ä Ô Ð ÓÖØ ¸ ÒÓØ ÓÑÓ Ô(< Vs, Vt >)¸ × ¬Ò ÓÑÓ Ð ×ÙÑ Ð× Ô × ÐÓ× Ö Ó× Ô ÖØ Ò ÒØ × Ð ÓÖØ º Ç × Ô(< Vs, Vt >) = Ô(e) ´ º¾¿µ ∀e∈<Vs ,Vt > Ò ÓÒØÖ Ö Ð ­Ù Ó Ñ Ü ÑÓ ÙÒ Ö ×Ø ×ØÖ Ñ ÒØ Ö Ð ÓÒ Ó ÓÒ Ò ÓÒØÖ Ö ÙÒ ÓÖØ Ô Ñ Ò Ñ ÔÓÖ Ð × ÑÔÐ Ö ÞÓÒ ÕÙ ÙÒ ­Ù Ó Ñ Ü ÑÓ × Ö Ñ ÒÓÖ Ó Ù Ð ÕÙ Ð Ñ Ò Ñ Ô ÔÓ× Ð ÕÙ × Ò Ù ÒØÖ Ò ÙÒ ÓÖØ Ö º Ò ØÓ¸ ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ º × ÑÓ× ÕÙ ­Ù Ó(N, f) ≤ Ô(e) − f(e) = Ô(< Vs, Vt >) − f(e), ∀e∈<Vs ,Vt > ∀e∈<Vs ,Vt > ∀e∈<Vs ,Vt > ´ º¾ µ ÔÙ × ∀e ∈ E =⇒ f(e) ≤ Ô(e)º ÈÓÖ Ø ÒØÓ¸ Ó ÕÙ ÐÓ× ­Ù Ó× ×ÓÒ ÔÓ× Ø ÚÓ× ­Ù Ó(N, f) ≤ Ô(< Vs, Vt >) . ´ º¾ µ ÓÒ× Ù ÒØ Ñ ÒØ ¸ × f∗ × ÙÒ ­Ù Ó Ñ Ü ÑÓ¸ ÒØÓÒ × ­Ù Ó(N, f∗ ) ≤ Ô(< Vs, Vt >) ´ º¾ µ ×ØÓ ÒÓ× ÓÒ Ù ÙÒ ÑÙÝ ÒØ Ö × ÒØ Ö ×ÙÐØ Óº Proposici´n 7.8 Ë f ÙÒ ­Ù Ó ×Ó Ö ÙÒ Ö o N =< V, E, s, t, C > Ý < Vs, Vt > ÙÒ ÓÖØ ×Ó Ö Ð Nº Ë ­Ù Ó(N, f) = Ô(< Vs, Vt >) ÒØÓÒ × f × ÙÒ ­Ù Ó Ñ Ü ÑÓ Ý < Vs, Vt > × ÙÒ ÓÖØ Ô ÑÒÑ º Demostraci´n Ë o ÙÒ ­Ù Ó Ñ Ü ÑÓ ×Ó Ö N Ý × < Vs, Vt >min Ð ÓÖØ Ñ Ò ÑÓ f∗ Nº È ØÓÖ ÑÓ× Ò Ö Ñ ÒØ Ð ÓÖØ Ñ Ò ÑÓ Ð × Ù ÒØ Ñ Ò Ö < Vs , Vt >min Vt Vs t s < Vs , Vt >min ÈÓÖ ¬Ò ÓÒ¸ × ÑÓ× ÕÙ × s Ô ÖØ ÙÒ ­Ù Ó f∗ ÓÒ Ú ÐÓÖ ­Ù Ó(N, f∗ )º ר Ú ÐÓÖ × Ü Ø Ñ ÒØ Ð Ñ ×ÑÓ ÕÙ ÐÐ tº Ð Ö Ñ ÒØ ¸ Ô Ö ÕÙ f∗ ÔÙ Ô × Ö ÔÓÖ < Vs, Vt >¸ × ÙÑÔÐ Ö ÕÙ ­Ù Ó(N, f∗) ≤ Ô(< Vs, Vt >) ݸ ÔÙ ×ØÓ ÕÙ Ð ÔÖÓÔÓ× ÓÒ ¬ÖÑ
  • 782.
    756 Cap´ ıtulo 7. Grafos ÕÙ ­Ù Ó(N, f∗ ) = Ô(< Vs, Vt >)¸ ÒØÓÒ × f∗ × Ð Ñ Ü ÑÓ ÔÓ× Ð ÕÙ ÔÙ Ô × Ö ÔÓÖ < Vs, Vt > ÐÓ ÕÙ ÓÖÖÓ ÓÖ ´ º¾ µº Ä Ñ Ü Ñ Ð f∗ ר ÔÙ × ÑÓ×ØÖ ËÙÔÓÒ ÑÓ× ÕÙ Ô(< Vs, Vt >) = K = ­Ù Ó(N, f∗ )¸ Ô ÖÓ ÕÙ < Vs, Vt > ÒÓ × Ñ Ò ÑÓº Ë × Ù × ¸ ÒØÓÒ × Ü ×Ø Ö ÓØÖÓ ÓÖØ ÓÒ ÙÒ Ô K < K¸ Ô ÖÓ ÔÓÖ ×Ø Ô ÒÓ ÔÙ ­Ù Ö f∗ ¸ ÔÙ × ­Ù Ó(N, f∗ ) > K º Ä ÓÒØÖ ÓÒ ÑÙ ×ØÖ ÔÙ × Ð ÑÒÑ Ð < Vs, Vt > Ä ÔÖÓÔÓ× ÓÒ ÒÓ× Ò ÕÙ × Ð ÙÐ ÑÓ× Ð ­Ù Ó Ñ Ü ÑÓ¸ ÒØÓÒ × Ð ÓÑ Ò ÓÒ ÙÝÓ ÓÒ ÙÒØÓ Ö Ó× < Vs, Vt > ÒÓ× ÓÒ Ô Ù Ð Ð ­Ù Ó ÓÖÖ ×ÔÓÒ Ð ÓÖØ Ñ Ò ÑÓº Corolario 7.3 Ë f∗ ÙÒ ­Ù Ó Ñ Ü ÑÓ ×Ó Ö ÙÒ Ö N =< V, E, s, t, C > ÓÒ ÓÖØ Ñ Ò ÑÓ < Vs, Vt >º ÒØÓÒ × ½º ∀e ∈< Vs, Vt >=⇒ f(e) = Ô(e) ´ º¾ µ ¾º ∀e ∈< Vs, Vt >=⇒ f(e) = 0 ´ º¾ µ Demostraci´n o ½º ÁÒÑ ØÓ Ð ÔÖÓÔÓ× ÓÒ º ¾º ÈÙ ×ØÓ ÕÙ ∀e∈ÇÍÌ(s) f(e) = ∀e∈ÁÆ(t) f(e) = ­Ù Ó(N, f∗ )¸ ÒØÓÒ × ­Ù Ó(< Vs, Vt >, f∗) = 0¸ ÔÙ × ÐÓ ÓÒØÖ Ö Ó f∗ ÒÓ × Ö Ñ Ü ÑÓ Ð ÓÖÓÐ Ö Ó ÒÓ× ¬Ò Ñ × Ð ÓÑÔÙØÓ ÙÒ ÓÖØ Ñ Ò ÑÓ Ô ÖØ Ö Ð ÓÒÓ Ñ ÒØÓ Ð ­Ù Ó Ñ Ü ÑÓº ÌÓ Ó Ö Ó ÕÙ Ô ÖØ Ò Þ < Vs, Vt > Ø Ò Ú ÐÓÖ ­Ù Ó Ù Ð ×Ù Ô º Ò ÐÓ Ñ ÒØ ¸ ØÓ Ó Ö Ó ÕÙ Ô ÖØ Ò Þ < Vs, Vt > Ø Ò Ú ÐÓÖ ­Ù Ó ÖÓº Ë ×Ø Ö Ø Ö Ó Ð ÙÒ ÑÓ× ÓÑÓ ÓÒ ÓÒ ÕÙ Ð ×ÙÑ Ð × Ô × ÐÓ× Ö Ó× < Vs, Vt > Ø Ò ÕÙ ÓÖÖ ×ÔÓÒ Ö× ÓÒ Ð Ú ÐÓÖ ­Ù Ó Ñ Ü ÑÓ¸ ÒØÓÒ × Ø Ò ÑÓ× ÙÒ Ñ ØÓ Ó Ô Ö Ð ÙÐ Ö Ð ÓÖØ Ñ Ò ÑÓ¸ Ó Ð ­Ù Ó Ñ Ü ÑÓº 7.10.7 Caminos de aumento ÄÓ× Ð ÓÖ ØÑÓ× Ð ÙÐÓ ­Ù Ó Ñ Ü ÑÓ × × Ò Ò Ò ÓÒØÖ Ö Ñ ÒÓ× ×Ô Ð × ÐÐ Ñ ¹ Ó× ÙÑ ÒØÓº ÁÒ ÓÖÑ ÐÑ ÒØ ¸ ÙÒ Ñ ÒÓ ÙÑ ÒØÓ × ÙÒ × Ù Ò Ö Ó× ÒØÖ Ð Ù ÒØ Ý Ð ×ÙÑ ÖÓ ÔÓÖ Ð Ù Ð × ÔÙ ÙÑ ÒØ Ö Ð ­Ù Óº Ë Ò Ñ Ö Ó¸ ÒÓ × ÙÒ Ñ ÒÓ ØÖ ÓÒ Ð Ý¸ Ô Ö ÔÖ Ò Ö ÐÐÓ¸ Ö ÕÙ Ö ÑÓ× ÙÒ ¬Ò ÓÒ ÒØ ÖÑ º Definici´n 7.15 (Semi-camino) ÍÒ × Ñ ¹ Ñ ÒÓ Ò ÙÒ o Ö N =< V, E, s, t, C >¸ Ó Ù × ¹ Ñ ÒÓ¸ × ÙÒ × Ù Ò < s, e1, v1, e2, . . . , ek−1, t > ÒÓ Ó× Ý Ö Ó× ÒØÖ Ð ÒÓ Ó Ù ÒØ Ý Ð ×ÙÑ ÖÓº ÆÓØ ÑÓ× ÕÙ ÐÓ× Ö Ó× ÙÒ × Ñ ¹ Ñ ÒÓ ÒÓ Ò × Ö Ñ ÒØ Ú Ò Ö Ó× × Ð Ù ÒØ Ð ×ÙÑ ÖÓ ÔÙ Ò Ö Ö Ó× × Ð ×Ø ÒÓ Ð ×ÙÑ ÖÓº ÍÒ Ö Ó × Ð Ù ÒØ Ð ×ÙÑ ÖÓ × ÒÓÑ Ò “arco de adelanto”º Ë Ñ ØÖ Ñ ÒØ ¸ ÙÒÓ × Ð ×ÙÑ ÖÓ Ð Ù ÒØ “arco de retroceso”º ÈÓÖ ÑÔÐÓ¸ Ò Ð × Ù ÒØ × Ñ ¹ Ñ ÒÓ Ð Ö ÑÓ×ØÖ Ò Ð ¬ ÙÖ º ¼
  • 783.
    7.10. Redes deflujo 757 K L 5 4 5 A D 4 F I ÄÓ× Ö Ó× {(A, K), (K, B), (B, F), (L, I)} ×ÓÒ Ð ÒØÓ¸ Ñ ÒØÖ × ÕÙ {(L, F)} × Ö ØÖÓ ×Óº ÓÒ Ð × Ñ ¹ Ñ ÒÓ¸ ÔÓ ÑÓ× ¬Ò Ö Ð Ñ ÒÓ ÙÑ ÒØÓº Definici´n 7.16 (Camino de aumento) o Ë ÙÒ Ö N =< V, E, s, t, C >º ÍÒ Ñ ÒÓ ÙÑ ÒØÓ Ca × ÙÒ × Ñ ¹ Ñ ÒÓ Ò N Ø Ð ÕÙ Ð ­Ù Ó ×Ù× Ö Ó× Ð ÒØÓ ÔÙ Ò Ö Ñ ÒØ Ö× Ý Ð ×Ù× Ö Ó× Ö ØÖÓ ×Ó Ö Ñ ÒØ Ö× º Ë Ca × ÙÒ Ñ ÒÓ ÙÑ ÒØÓ¸ ÒØÓÒ ×¸ ÔÓÖ ¬Ò ÓÒ¸ Ô Ö Ù ÐÕÙ Ö Ö Ó e Ð ÒØÓ f(e) < Ô(e)¸ ÔÙ × × ÒÓ ÒÓ Ö ÓÖÑ Ò Ö Ñ ÒØ Ö Ð ­Ù Óº Ò Ð Ñ ×ÑÓ × ÒØ Ó¸ Ô Ö Ù ÐÕÙ Ö Ö Ó e Ö ØÖÓ ×Ó f(e) > 0º Ä ÒØ Ò ÕÙ ÔÙ Ò Ö Ñ ÒØ Ö× Ð ­Ù Ó Ò ÙÒ Ö Ó Ð ÒØÓ¸ Ó Ö Ñ ÒØ Ö× Ò ÙÒÓ Ö ØÖÓ ×Ó × ÒÓÑ Ò ×Ð ÓÒ ´ ×Ð µ¾ ¸ × × Ò Δe Ý × Ø ÖÑ Ò Ð × Ù ÒØ Ñ Ò Ö Δe = Ô(e) − f(e) × e × Ð ÒØÓ ´ º¾ µ f(e) × e × Ö ØÖÓ ×Ó Ó ÙÒ Ñ ÒÓ ÙÑ ÒØÓ Ca¸ Ð Ñ Ü Ñ ÒØ Ò ÕÙ ÔÙ ÙÑ ÒØ Ö× Ð ­Ù Ó Ð Ö ÔÓÖ × Ñ ÒÓ ×Ø ×ÙÔ Ø Ð ÓÒ ÓÒ ÓÒ× ÖÚ ÓÒ ­Ù Ó Ý × Ø ÖÑ Ò ÓÑÓ ΔCa = ÑÒ ∀e∈Ca Δe ; ´ º¿¼µ × Ö¸ Ð “m´ınimo eslab´n” Ð Ñ ÒÓ o ÙÑ ÒØÓº Ë Ò ÓÒØÖ ÑÓ× ÙÒ Ñ ÒÓ ÙÑ ÒØÓ Ca ×Ó Ö ÙÒ Ö ¸ ÒØÓÒ × × × ÙÖÓ ÕÙ ×Ó Ö ×Ù× Ö Ó× ÔÓ ÑÓ× ÙÑ ÒØ Ö Ó ×Ñ ÒÙ Ö Ð Ú ÐÓÖ ­Ù Ó Ò Ð Ú ÐÓÖ Ð Ñ Ò ÑÓ ×Ð ÓÒº ×ØÓ Ò Ð Ö Ø Ö Ð ÓÖ ØÑ Ó ÐÓ× Ñ ÒÓ× ÙÑ ÒØÓ Ò Ð Ø ÖÑ Ò ÓÒ Ð ­Ù Ó Ñ Ü ÑÓº 4 3 K 2 E 5 L 2 2 3 3 1 2 3 1 8 1 3 3 3 6 A D F H 3 I 1 1 3 4 3 3 6 5 1 1 5 2 9 B 1 G J 1 ÙÖ º Ê Ö × Ù Ð Ð Ö Ó Ð ¬ ÙÖ º ½º ÄÓ× Ö Ó× ­Ù Ó Ö ×Ø ÒØ ×ÓÒ ÓÒØ ÒÙÓ׸ Ñ ÒØÖ × ÕÙ ÐÓ× Ö × Ù Ð × ×ÓÒ ÔÙÒØ Ó׺ ¾ ר × Ð Ø ÖÑ ÒÓ ×Ø ÐÐ ÒÓ ÕÙ ×Ø ×Ù× Ö ØÓ Ó ÑÔÐ Ö ÔÓÖ Ð Ø ÖÑ ÒÓ Ò Ð × ×Ð º
  • 784.
    758 Cap´ ıtulo 7. Grafos Definici´n 7.17 (Red residual) Ë ÙÒ Ö N =< V, E, s, t, C > ÓÒ Ú ÐÓÖ o ­Ù Ó ­Ù Ó(N, f)º Ð Ö Ó Ö × Ù Ð N ÒÓØ Ó ÓÑÓ N =< V, E , s, t, C >¸ Ø Ð ÕÙ E Ý C × ÓÒרÖÙÝ Ò Ð × Ù ÒØ ÑÓ Ó ½º ∀e = (u, v) ∈ E =⇒ ´ µ ∃e = (u, v) ∈ E | Ô(e ) = Ô(e) − f(e) ´ Ö Ó ­Ù Ó Ö ×Ø ÒØ µº ´ µ ∃e = (v, u) ∈ E | Ô(e) = f(e) ´ Ö Ó Ö × Ù Ðµº Ä ¬ ÙÖ º ÐÙ×ØÖ Ð Ö Ö × Ù Ð Ð Ö Ó ÓÒ Ú ÐÓÖ ­Ù Ó ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ º ½º Ä Ö Ö × Ù Ð ÒÓ× Ô ÖÑ Ø Ò ÓÒØÖ Ö Ñ ÒÓ× ÙÑ ÒØÓ Ñ ÒØ × Ù×ÕÙ × Ñ ÒÓ׸ × ÔÓÖ ÔÖÓ ÙÒ Ó ÔÓÖ ÑÔÐ ØÙ ¸ × Ð Ù ÒØ Ð ×ÙÑ ÖÓ¸ Ò Ð Ñ ×ÑÓ × ÒØ Ó ÐÓ× Ð ÓÖ ØÑÓ× ×ØÙ Ó× Ò Ü º º º¾ ´Ô Ò ¾¿µ Ý Ü º º ´Ô Ò ¾ µº × Ø ÒÓÖ¸ Ð ¬ ÙÖ º ¹ ÑÙ ×ØÖ ÙÒ Ú ÒØÙ Ð Ñ ÒÓ Ò ÓÒØÖ Ó ÔÓÖ ÙÒ ÔÓØ Ø Ù×ÕÙ Ò ÔÖÓ ÙÒ Ý Ð ÓÖÖ ×ÔÓÒ ÒØ Ñ ÒÓ ÙÑ ÒØÓ ´ º ¹ µº 4 3 4 K 2 E 5 L K E L 2 2 2 3 2 2 8 3 1 2 3 1 8 1 3 3 3 6 3 6 A D F H 3 I A D F H I 1 1 3 4 3 3 6 5 1 1 5 2 9 B 1 G J 1 ´µ Ñ ÒÓ Ò ÓÒØÖ Ó ÔÓÖ ÔÖÓ ÙÒ ´ µ Ñ ÒÓ ÙÑ ÒØÓ Ò Ð Ö ÙÖ º ÍÒ Ñ ÒÓ ÙÑ ÒØÓ Ò Ð Ö Ö × Ù Ð Ð ¬ ÙÖ º º ÍÒ Ú Þ ÐÐ Ó ÙÒ Ñ ÒÓ ÙÑ ÒØÓ¸ ÔÓ ÑÓ× Ò Ö Ñ ÒØ Ö Ð ­Ù Ó Ð Ö Ò Ð Ú ÐÓÖ ×Ù Ñ Ò ÑÓ ×Ð ÓÒº È Ö Ð ¬ ÙÖ ÑÔÐÓ º ½ Ý Ð Ñ ÒÓ ÙÑ ÒØÓ ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ º ¹ ÓÒ Ñ Ò ÑÓ ×Ð ÓÒ ΔC = 1¸ ÔÓ ÑÓ× ÑÓ ¬ Ö Ð ­Ù Ó a ÐÓ× Ö Ó× Ð Ñ ÒÓ ÙÑ ÒØÓ Ò Ð Ú ÐÓÖ ΔC º ×ØÓ ÒÓ× ÓÒ Ù Ð Ú ÐÓÖ ­Ù Ó a Ð ¬ ÙÖ º º K 6/3 E 8/5 L 5/4 4/1 5/2 4/1 9/0 5/4 A D 4/2 F 7/2 H 3/3 I 6/4 7/1 6/1 3/3 4/1 B 1/1 G 10/1 J ÙÖ º ÍÒ ­Ù Ó Ø Ð ×Ó Ö Ð Ö Ð ¬ ÙÖ º ¼ ÐÙ Ó Ò Ö Ñ ÒØ Ö Ð ­Ù Ó Ò ΔCa = 2 ÓÖÖ ×ÔÓÒ ÒØ Ð Ñ Ò ÑÓ ×Ð ÓÒ Ð Ñ ÒÓ ÙÑ ÒØÓ ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ º ¹º Ð ÑÓ ¬ ÓÒ Ö Ð Þ ¸ ÕÙ Ô ÖÓ Ò Ð ¬ ÙÖ º ¸ ÒÓ× ÓÒÚ Ò ×Ø Ð Ö Ð × × Ù ÒØ × Ó × ÖÚ ÓÒ × ÔÓÖ × Ô Ö Ó
  • 785.
    7.10. Redes deflujo 759 ½º Ð Ú ÐÓÖ Ð ­Ù Ó Ð Ö × Ò Ö Ñ ÒØÓ 7 8º ¾º Ä × ÑÓ ¬ ÓÒ × ×Ó Ö Ð ­Ù Ó ×ÓÐÓ ÒÚÓÐÙ Ö Ò Ö Ó× Ð Ñ ÒÓ ÙÑ ÒØÓº ¿º Ô × Ö Ð × ÑÓ ¬ ÓÒ × Ö Ð Þ ×¸ × Ñ ÒØ Ò Ð ÓÒ ÓÒ ÓÒ× ÖÚ ÓÒ ­Ù Ó ×Ó Ö ÐÓ× ÒÓ Ó× ÕÙ ÓÒ ÓÖÑ Ò Ð Ñ ÒÓ ÙÑ ÒØÓº ר × Ó × ÖÚ ÓÒ × × Ò Ö Ð Þ Ò Ó Ð × Ù ÒØ ÔÖÓÔÓ× ÓÒº Proposici´n 7.9 (Ford-Fulkerson 1956 [12]) Ë ÙÒ Ö N =< V, E, s, t, C > ÓÒ o Ú ÐÓÖ ­Ù Ó ­Ù Ó(N, f)º Ë Ca ÙÒ Ñ ÒÓ ÙÑ ÒØÓ ×Ó Ö Ð Ö N¸ Ð ÙÐ Ó Ñ ÒØ ÙÒ Ù×ÕÙ t Ò Ð Ö Ö × Ù Ð Ô ÖØ Ö s Ý ÙÝÓ Ñ Ò ÑÓ ×Ð ÓÒ × ΔCa º ÒØÓÒ ×¸ Ð ­Ù Ó Ð Ö ÔÙ ÙÑ ÒØ Ö× Ò Ð Ú ÐÓÖ ΔCa Ð × Ù ÒØ ÑÓ Ó ⎧ ⎪f(e) + ΔCa × e × ÙÒ Ö Ó ⎪ Ð ÒØÓ ⎨ f(e) = f(e) − ΔCa × e × ÙÒ Ö Ó ⎪ Ö ØÖÓ ×Ó ´ º¿½µ ⎪ ⎩f(e) Ò Ù ÐÕÙ Ö ÓØÖÓ ×Ó Demostraci´n ÄÓ× o Ö Ó× Ð Ö Ó ÕÙ ×ÓÒ ÑÓ ¬ Ó× ×ÓÒ ÕÙ ÐÐÓ× ÕÙ Ô ÖØ Ò Ò Caº ÈÙ ×ØÓ ÕÙ ΔCa × Ð Ú ÐÓÖ Ñ Ò ÑÓ ÒØÖ Ð ÙÒ Ô(e) − f(e) Ý f(e) ´Ú Ö ¬Ò ÓÒ Ü º½ Ô º µ¸ Ð Ò Ö Ñ ÒØÓ ×Ó Ö ÙÒ Ö Ó Ð ÒØÓ e ÒÓ ×Ó Ö Ô × Ô(e)º Ð Ñ ×ÑÓ ÑÓ Ó¸ Ð Ö Ñ ÒØÓ ×Ó Ö ÙÒÓ Ö ØÖÓ ×Ó e ÒÓ × Ñ ÒÓÖ ÕÙ 0º ÈÓÖ Ø ÒØÓ¸ × ÔÖ × ÖÚ Ð ÓÒ ÓÒ Ô ×Ó Ö ØÓ Ó× ÐÓ× ÒÓ Ó× ÒÚÓÐÙ Ö Ó× Ò Caº ÈÓÖ ¬Ò ÓÒ¸ ÐÓ× ÜØÖ ÑÓ× Ca ×ÓÒ s Ý tº ÈÙ ×ØÓ ÕÙ Ca Ù Ð ÙÐ Ó Ô ÖØ Ö s¸ × × ÙÖÓ ÕÙ Ð ÔÖ Ñ Ö Ö Ó s → v Ca × Ð ÒØÓ ÔÓÖ Ø ÒØÓ¸ Ð ­Ù Ó Ð Ö × ÙÑ ÒØ Ð Ò Ö Ñ ÒØ Ö Ð ­Ù Ó Ò Ð Ö Ó Ð ÒØÓ Ò Ð Ú ÐÓÖ ΔC º Ë Ñ Ð ÖÑ ÒØ ¸ a Ð ÙÐØ ÑÓ Ö Ó Ca¸ ÓÒ ÓÖÑ w → t¸ ÕÙ ÙÐÑ Ò Ò t Ø Ñ Ò × Ð ÒØÓ Ý ×Ù ­Ù Ó × Ò Ö Ñ ÒØ Ò Ð Ñ ×ÑÓ Ú ÐÓÖ ΔC º × Ô٠׸ Ð Ú ÐÓÖ ­Ù Ó Ð Ö ÙÑ ÒØ a Ò ΔC ºa È Ö Ð Ö ×ØÓ ÐÓ× ÒÓ Ó× Ca ÑÓ× Ú Ö ¬ Ö ÕÙ × ÔÖ × ÖÚ Ð ÓÒ ÓÒ ÓÒ× ÖÚ ÓÒ Ð ­Ù Óº Ä × ÔÓ× Ð × ÓÑ Ò ÓÒ × ÙÒ ÒÓ Ó Ù ÐÕÙ Ö v ∈ Ca, v = s, v = t ×ÓÒ ½º +ΔC a +ΔC → v →a Ò ÙÝÓ ×Ó Ð Ò Ö Ñ ÒØÓ ×Ó Ö Ð ­Ù Ó ÒØÖ ÒØ × Ð Ñ ×ÑÓ ÕÙ Ô Ö Ð ­Ù Ó × Ð ÒØ º ¾º −ΔC a ←− v ←−a −ΔC × Ñ ØÖ Ó Ð ÒØ Ö ÓÖ¸ Ô ÖÓ ÓÒ Ö Ñ ÒØÓº ¿º −ΔC a ←− v → a +ΔC × Ò ÑÔÓÖØ Ö Ù Ð × ×ÓÒ ÐÓ× Ö Ó× Ò ÒØ × Ó Ý ÒØ × v¸ Ò Ù ÒØÓ× ×ØÓ× ×ÓÒ¸ Ð ­Ù Ó × ÓÒ× ÖÚ ¸ ÔÙ × Ò ÙÒ Ö Ó × Ð × ÙÑ ÒØ Ò ΔC Ô ÖÓ Ò a ÓØÖÓ × Ö Ñ ÒØ Ò Ð Ñ ×Ñ ÒØ º º +Δ v −Δ × Ñ ØÖ Ó Ð ×Ó ÒØ Ö ÓÖ Ô ÖÓ Ô Ö Ö Ó× ÒØÖ → Ca ←− Ca 7.10.8 Calculo de la red residual Ë ÐÓ× Ñ ÒÓ× ÙÑ ÒØÓ × Ð ÙÐ Ò ÔÓÖ Ò×Ô ÓÒ Ð Ö Ö × Ù Ð¸ ÒØÓÒ × Ö ¹ ÕÙ Ö ÑÓ× Ò ÓÒØÖ Ö ÙÒ Ñ Ò Ö Ð ÙÐ ÖÐ º ÍÒ ÔÖ Ñ Ö ÓÒ× ×Ø Ò Ö Ð Þ Ö ÙÒ ÓÔ Ñ Ô ¸ ÑÓ ¬ ÖÐ ×Ù× Ö Ó× ×Ù× Ô × Ö ×Ø ÒØ × Ý ÐÙ Ó Ò ÖÐ ÐÓ× Ö Ó× Ö × ¹ ٠Р׺ ËÓ Ö Ð Ö Ö × Ù Ð × ÔÙ ØÙ Ð Þ Ö Ð ­Ù Ó Ð ×Ð ÓÒ Ñ Ò ÑÓ ÙÒ Ñ ÒÓ
  • 786.
    760 Cap´ ıtulo 7. Grafos ÙÑ ÒØÓ Ý Ö Ô Ø Ö Ð Ù×ÕÙ Ñ ÒÓ× ÙÑ ÒØÓ Ý ØÙ Ð Þ ÓÒ × ­Ù Ó ×Ø Ñ Ü Ñ Þ ÖÐÓº È ÖÓ ×Ø Ò ÓÕÙ ÓÒÐÐ Ú Ð ÔÖÓ Ð Ñ ÙÔÐ Ö Ð ×Ô Ó Ò ÒÓ Ó× Ý Ð ÓÐ Ö Ó׺ ÈÙ Ö× Ò Ø ÑÔÓ ÕÙ Ô Ö Ð Ý × Ò Ò × ÙÔÐ Ö Ä Ö ×ÔÙ ×Ø × ¬ÖÑ Ø Ú × Ö¸ ÔÓ ÑÓ× Ö ÔÖ × ÒØ Ö Ð Ö Ö × Ù Ð ×Ó Ö Ð Ö ÓÖ Ò Ðº È Ö ÐÐÓ¸ Ò ÑÓ× ÙÒ ØÖ ÙØÓ Ð Ö Ó ÕÙ Ò ÕÙ × Ð Ö Ó × Ó ÒÓ Ö × Ù Ð Ý ÜÔÓÖØ ÑÓ× ÒØ Ö × ÕÙ ÑÙ ×ØÖ Ò ÐÓ× Ô ×Ó× ÙÒ Ö Ó × ÙÒ ´ º¿½µº È Ö × Ö × Ð Ö Ó × Ó ÒÓ Ö × Ù Ð¸ Ù Ö Ö ÑÓ× Ð Ñ Ò Ö × Ù Ð Ð Ö Ó Ò ÔÙÒØ ÖÓ Ý ÙÒ Ò ÓÒ ÐÓ ¼ Å Ñ ÖÓ× Net Arc<Arc Info,F Type> ¼ ≡ ´ µ Net_Arc * img_arc; bool is_residual; Ë this × ÙÒ Ö Ó Ö × Ù Ð¸ ÒØÓÒ × img arc × ÙÒ ÔÙÒØ ÖÓ Ð Ö Ó Ð Ù Ð this × Ö × Ù Ðº Ò ÐÓ Ñ ÒØ ¸ × this × ÙÒ Ö Ó Ô ÖØ Ð Ö ¸ ÒØÓÒ × img arc × Ð Ö ÓÒ ×Ù Ö Ó Ö × Ù Ðº Ð ØÖ ÙØÓ is residual Ò × this × Ó ÒÓ Ö × Ù Ðº ÄÓ× Ð ÓÖ ØÑÓ× Ð ÙÐÓ ­Ù Ó Ñ Ü ÑÓ × Ó× Ò Ù×ÕÙ × Ñ ÒÓ× Ù¹ Ñ ÒØÓ ×Ó Ö Ð Ö Ö × Ù Ð × × Ò Ò Ð “capacidad restante” Ò Ð Ö Ó¸ Ð Ù Ð ÒÓÑ Ò Ö ÑÓ× ÓÑÓ Cr(e) = Ô(e) − f(e) Ô Ö ÙÒ Ö Ó ÒÓÖÑ Ðº È Ö ÕÙ Ð ÐÙ× ÓÒ Ô Ö ×Ø ÒØ × Ð Ñ ×Ñ ×Ó Ö ÙÒ Ö Ó Ö × Ù Ð e¸ × Ø × Ö× ÕÙ Ô(e) − f(e) = Ô(e) − f(e)º × ¸ ÐÓ× Ú ÐÓÖ × ÙÒ Ö Ó Ö × Ù Ð × ÑÔÖ × ÓÐÓ Ò Ò Ô(e) = Ô(e) ´ º¿¾µ f(e) = Ô(e) − f(e) ´ º¿¿µ ר ÑÓ Ó¸ Ô Ö ÙÒ Ö Ó Ù ÐÕÙ Ö e Ý ×Ù Ö × Ù Ð e¸ Ôr(e) = Ô(e)−f(e) ÔÖÓÔÓÖ ÓÒ Ð Ô Ö ×Ø ÒØ e Ñ ÒØÖ × ÕÙ Ôr(e) = Ô(e) − f(e) = f(e) ÔÖÓÔÓÖ ÓÒ Ð ­Ù Ó Ö ÙÐ ÒØ ÔÓÖ eº ÈÙ ×ØÓ ÕÙ ÙÒ Ö Ó Ö × Ù Ð Ò ÐÑ ÒØ × ÓÖÖ ×ÔÓÒ ÓÒ ÙÒÓ Ö Ð¸ Ò ×Ù Ö ÓÒ × ×Ô ¬ Ð Ö Ó Ö Ð ¼ Å Ñ ÖÓ× Net Graph<TNode,TArc,T> +≡ ´ µ ¾ ½ void insert_residual_arc(Arc * arc) { Arc * residual_arc = Digraph::insert_arc(get_tgt_node(arc), get_src_node(arc)); residual_arc->is_residual = true; residual_arc->img_arc = arc; residual_arc->cap = arc->cap; residual_arc->flow = arc->cap - arc->flow; arc->img_arc = residual_arc; } Ð ¬Ò Ð Ö Ö × Ù Ð × × ÖÚ Ö Ñ Ó Ô Ö Ð ÙÐ Ö Ñ ÒÓ× ÙÑ ÒØÓº ÈÓÖ ×Ø Ö ÞÓÒ¸ ÒÓ Ú Ð Ð Ô Ò ÔÖ Ó ÙÔ Ö× ÔÓÖ Ð × Ú ÒØÙ Ð × Ò ÓÒ× ×Ø Ò × Ù× × ÔÓÖ Ð ÔÖ × Ò ÐÓ× Ö Ó× Ö × Ù Ð × Ð Ö Ó × Ð ÙÒ ÒÓ Ó Ó Ð Ö ÓÖÖ Ö ÐÓ× Ö Ó× ÙÒ Ö ¸ ÔÓÖ ÑÔÐÓ׺ Ð Ö Ó Ö × Ù Ð × Ö Ô Ö Ð ÙÐ Ö Ð ­Ù Ó Ñ Ü ÑÓ Ý × ×ØÖÙÝ ÒÑ Ø Ñ ÒØ ר × Ý Ð ÙÐ Óº Ä Ð Ñ Ò ÓÒ ÙÒ Ö Ó Ö × Ù Ð Ö Ð Þ Ö× Ô ÖØ ÙÐ ÖÑ ÒØ × Ö¸ ÒÓ ÔÓ ¹ ÑÓ× ÒÚÓ Ö Net Graph<TNode,TArc,T>::remove arc()¸ ÔÙ × ×Ø ÔÖ ×ÙÑ Ö ÕÙ Ð
  • 787.
    7.10. Redes deflujo 761 Ö Ó × Ô ÖØ ÐÓ Ð Ö ¸ ÐÓ ÕÙ ÒÓ × ×Ô ¬ Ñ ÒØ Ð ×Óº × ¸ ÐÓ ÑÓ× Ñ ÒØ ÓØÖ ÔÖ Ñ Ø Ú Ô ÖØ ÙÐ Ö ½ Å Ñ ÖÓ× Net Graph<TNode,TArc,T> +≡ ´ µ ¼ ½ void remove_residual_arc(Arc * arc) { Digraph::remove_arc(arc); } Ë Ò Ó Ò× ÖØ Ö Ý Ð Ñ Ò Ö Ö Ó× Ö × Ù Ð ×¸ Ð ÓÒרÖÙ ÓÒ Ý ×ØÖÙ ÓÒ Ð Ö Ö × Ù Ð ÒØÖÓ Ð ÔÖÓÔ Ö ×ÓÒ Ö Ø × ½ Å Ñ ÖÓ× Net Graph<TNode,TArc,T> +≡ ´ µ ½ void make_residual_net() { size_t n = this->get_num_arcs(); // cantidad de arcos residuales a insertar for (Arc_Iterator<Net_Graph> it(*this); it.has_current() and n > 0; it.next()) { Arc * arc = it.get_current_arc(); if (not arc->is_residual) { insert_residual_arc(arc); --n; } } } void unmake_residual_net() { for (Arc_Iterator<Net_Graph> it(*this); it.has_current(); ) { Arc * arc = it.get_current_arc(); if (arc->is_residual) { it.next(); remove_residual_arc(arc); } else it.next(); } } Í× × Arc Iterator º 7.10.9 Calculo de caminos de aumento ÓÑÓ Ý ÐÓ ÑÓ× Ò Ó¸ Ð Ù×ÕÙ ÙÒ Ñ ÒÓ ÙÑ ÒØÓ ØÖ Ú × Ð Ö Ö × Ù Ð × Ö Ñ Ø ÙÒ Ù×ÕÙ Ñ ÒÓ × Ð Ù ÒØ ר Ð ×ÙÑ ÖÓº Ì Ð Ù×ÕÙ ÔÙ Ö Ð Þ Ö× ÔÓÖ ÔÖÓ ÙÒ Ó ÑÔÐ ØÙ ØÖ Ú × Ð × ÔÖ Ñ Ø Ú × Ð ÙÐÓ Ñ ÒÓ× ×ØÙ × Ò Ü º º º¾ ´Ô Ò ¾¿µ Ý Ü º º ´Ô Ò ¾ µ¸ Ö ×Ô Ø Ú Ñ ÒØ º ØÓ× ÙØ Ð Þ Ö Ü Ø Ñ ÒØ Ð × Ñ ×Ñ × ÔÖ Ñ Ø Ú × ÑÓ× Ö ÕÙ Ð Ð × Node Arc Iterator Ö Ð Ð Ù×ÕÙ ×Ó Ö Ð Ö Ö × Ù Ð Ý ÒÓ ×Ó Ö Ð ÓÖ Ò Ðº Ò ÓØÖ × Ó × ÓÒ × × Ö Ò × Ö Ó ÕÙ Ð Ø Ö ÓÖ ×ÓÐÓ ÑÙ ×ØÖ Ö Ó× Ö × Ù Ð × Ý Ò ÓØÖ × Ñ × ØÓ Ó× ÐÓ× Ö Ó׺
  • 788.
    762 Cap´ ıtulo 7. Grafos D 4/0 E 8/0 I 4/0 K D 4 E 8 I 4 K 6/0 3/0 4/0 5/0 3/0 4/0 3/0 4/0 6 3 4 5 3 4 3 4 A 7/0 B 6/0 F 4/0 H 5/0 M A 7 B 6 F 4 H 5 M 5/0 5/0 3/0 5/0 7/0 6/0 4/0 6/0 5 5 3 5 7 6 4 6 C G J 5/0 L C G J 5 L 4/0 6/0 4 6 ´µ ´ µ ÙÖ º ÍÒ Ö ÑÔÐÓ Ý ×Ù Ö × Ù Ðº È Ö ØÖ Ø Ö ÓÒ ×ØÓ ¬Ò ÑÓ× ÙÒ Ð × ¬ÐØÖÓ ÕÙ ¬ÐØÖ Ð Ö Ó × ÙÒ Ð Ú ÐÓÖ Ð ­Ù Ó Ö ×Ø ÒØ ¸ × ×Ø Ó ÒÓ Ð Ö Ó Ö × Ù Ð ¾ ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ ≡ ¾ template <class N> class Res_F { bool operator () (typename N::Node *, typename N::Arc * a) const { return (a->cap - a->flow) != 0; } }; ÓÒ ×Ø ¬ÐØÖÓ¸ find path depth first() Ý find path breadth first()¸ ÒÚÓ × ×Ó¹ Ö Ð Ö Ó ÓÒ Ð Ö Ö × Ù Ð¸ Ò ÓÒØÖ Ö Ò Ö Ø Ý ØÖ ×Ô Ö ÒØ Ñ ÒØ Ñ ÒÓ× Ù¹ Ñ ÒØÓ ÒØÖ Ð Ù ÒØ Ý ×ÙÑ ÖÓº 7.10.10 Incremento del flujo por un camino de aumento Ë Ø Ò ÑÓ× ÙÒ Ñ ÒÓ ÙÑ ÒØÓ Ù Ö Ó Ò ÙÒ Ó ØÓ Ø ÔÓ Path<Net Graph> ´× ÙÒ Ü º ´Ô Ò ¼¾µµ¸ ÒØÓÒ ×¸ × ÙÒ ´ º¿½µ¸ ÔÓ ÑÓ× Ò Ö Ñ ÒØ Ö Ð ­Ù Ó Ð Ö º È Ö ÐÐÓ¸ ¬Ò ÑÓ× Ð × Ù ÒØ ÔÖÓ Ñ ÒØÓ ¾ ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ ¾ ¿ template <class Net> typename Net::Flow_Type increase_flow(Net & net, Path<Net> & path) { typename Net::Flow_Type slack = net.Infinity; // valor del eslab´n m´nimo o ı // calcular el eslab´n m´nimo del camino de aumento o ı for (typename Path<Net>::Iterator it(path); it.has_current_arc(); it.next()) { typename Net::Arc * arc = it.get_current_arc(); const typename Net::Flow_Type w = arc->cap - arc->flow; if (w < slack) slack = w; } // aumentar el flujo de la red por el camino de aumento for (typename Path<Net>::Iterator it(path); it.has_current_arc(); it.next()) { typename Net::Arc * arc = it.get_current_arc();
  • 789.
    7.10. Redes deflujo 763 typename Net::Arc * img = (typename Net::Arc*) arc->img_arc; arc->flow += slack; img->flow -= slack; if (not arc->is_residual) { net.increase_out_flow(net.get_src_node(arc), slack); net.increase_in_flow(net.get_tgt_node(arc), slack); } else { net.decrease_in_flow(net.get_src_node(arc), slack); net.decrease_out_flow(net.get_tgt_node(arc), slack); } } return slack; } Í× × Path ¼¾ º Ù Ò Ó × Ò Ö Ñ ÒØ Ð ­Ù Ó ÙÒ Ö Ó Ö × Ù Ð × ÜÔÖ × ÕÙ Ý ÙÒ ×Ñ ÒÙ ÓÒ Ð ­Ù Ó Ð Ö Ó Ö Ð Ò ÐÓ Ñ ÒØ ¸ Ð Ò Ö Ñ ÒØÓ ×Ó Ö ÙÒ Ö Ó ÒÓÖÑ Ð ÑÔÐ ÙÒ ÙÑ ÒØÓ Ð Ô Ö ×Ø ÒØ Ð Ö Ó Ö × Ù Ðº ÕÙ ÕÙ × Ú Ð Ó ÙÑ ÒØ Ö Ð ­Ù Ó Ò arc Ý ×Ñ ÒÙ ÖÐÓ Ò img Ò Ô Ò ÒØ Ñ ÒØ ÕÙ arc × Ó ÒÓ Ö × Ù Ðº 7.10.11 El algoritmo de Ford-Fulkerson À ר Ð ÔÖ × ÒØ ÑÓ× × Ù ÖØÓ ÓÒÓ Ñ ÒØÓ Ö ÓÑÓ Ò Ö Ñ ÒØ Ö Ð ­Ù Ó ÙÒ Ö º ÓÑÓ Ò ÓÒØÖ Ö Ð ­Ù Ó Ñ Ü ÑÓ ÙÒ Ñ ÒØ ÐÑ ÒØ ¸ ÔÓ ÑÓ× ÔÐ ÒØ Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÔÖÓ Ö × Ú Ñ ÒØ Ù×ÕÙ Ñ ÒÓ× ÙÑ ÒØÓ Ò Ö Ñ ÒØ Ð ­Ù Ó ×Ø ÕÙ ×Ø Ú Ò Ñ Ü ÑÓº Ù Ð × Ö Ð ÓÒ ÓÒ ÔÖ ÍÒ ÔÖ Ñ Ö Ö ×ÔÙ ×Ø ÒÓ× Ð ÖÖÓ Ð ÓÖÓÐ Ö Ó º¿ Ô º Ô ÖÓ ×Ø Ú ÔÙ × Ö ÓÑÔÙØ ÓÒ ÐÑ ÒØ ÓרÓ× ¸ ÔÙ × Ö ÕÙ Ö Ñ Ò Ö ÓÒ ÙÒØÓ× ÓÑ Ò ØÓÖ ÐÑ ÒØ º ÍÒ Ú Ñ × ¬ ÒØ Ð ÔÖÓÔÓÖ ÓÒ Ð × Ù ÒØ ÔÖÓÔÓ× ÓÒº Proposici´n 7.10 o Ëf ÙÒ ­Ù Ó ÙÒ Ö Nº ÒØÓÒ × f × Ñ Ü ÑÓ × Ý ×ÓÐÓ × ÒÓ Ü ×Ø ÙÒ Ñ ÒÓ ÙÑ ÒØÓ Ò Nº Demostraci´n Ä Ò × o × ÑÙ ×ØÖ ÔÓÖ ÓÒØÖ ÓÒº Ë f × Ñ Ü ÑÓ Ô ÖÓ Ü ×Ø ÙÒ Ñ ÒÓ ÙÑ ÒØÓ¸ ÒØÓÒ ×¸ × ÙÒ ´ º¿½µ¸ × ÔÓ× Ð Ò Ö Ñ ÒØ Ö Ð ­Ù Ó¸ ÐÓ ÕÙ ÓÒØÖ ¬ÖÑ Ö ÕÙ f × Ñ Ü ÑÓ È Ö ÑÓ×ØÖ Ö Ð ×Ù¬ Ò ¸ ×ÙÔÓÒ ÑÓ× ÕÙ ÒÓ Ü ×Ø ÙÒ Ñ ÒÓ ÙÑ ÒØÓº Ä Ù× Ò Ñ ÒÓ× ÙÑ ÒØÓ Ò ÕÙ Ð ÒÓ Ó ×ÙÑ ÖÓ × Ò Ð ÒÞ Ð × Ð Ù ÒØ ¸ ÔÙ × Ð Ö Ó Ö Ù Ó ×Ø Ö Ò ÓÒ ÜÓ × Ö¸ ØÓ Ó Ñ ÒÓ Ò Ð Ö Ó Ö Ù Ó ÕÙ Ô ÖØ × Ð Ù ÒØ × ÓÖØ Ð Ð ÒÞ Ö Ö Ó× ÓÒ ­Ù Ó Ù Ð ×Ù Ô º ÆÓ × ÔÓ× Ð ¸ ÔÓÖ Ø ÒØÓ¸ ÙÑ ÒØ Ö Ñ × Ð ­Ù Ó¸ ÐÓ ÕÙ Ò ÕÙ f × Ñ Ü ÑÓ ×Ø ÔÖÓÔÓ× ÓÒ ÒÓ× Ó Ö Ð Ö Ø Ö Ó Ô Ö ÕÙ ×Ø ÑÓ× Ù× Ò Ó Ý × Ð × Ð × Ù ÒØ Ð ÓÖ ØÑÓ Ò Ö Ó ¿ ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ ¾ template <class Net, template <class, class> class Find_Path> typename Net::Flow_Type aumenting_path_maximum_flow(Net & net, const bool & leave_residual = false)
  • 790.
    764 Cap´ ıtulo 7. Grafos { net.make_super_nodes(); net.make_residual_net(); typename Net::Node * source = net.get_source(); typename Net::Node * sink = net.get_sink(); while (true) // mientras exista un camino de aumento { Path<Net> path(net); if (not Find_Path <Net, Res_F<Net> > () (net, source, sink, path)) break; increase_flow <Net> (net, path); } const typename Net::Flow_Type ret_val = source->out_flow; if (not leave_residual) { net.unmake_residual_net(); net.unmake_super_nodes(); } return ret_val; } Í× × Path ¼¾ º Ð Ô Ö Ñ ØÖÓ leave residual Ð Ò Ð Ð ÓÖ ØÑÓ ÕÙ Ð Ö Ö × Ù Ð ÒÓ Ð Ö Ö× º ×ØÓ ÔÙ × Ö ÙØ Ð Ô Ö ÓØÖÓ× Ð ÓÖ ØÑÓ× ÒØÖ ÐÐÓ× Ð Ð ÙÐÓ Ð ÓÖØ Ñ Ò ÑÓº È Ö ÕÙ ×Ø Ð ÓÖ ØÑÓ ÓÔ Ö ÓÖÖ Ø Ñ ÒØ ¸ Ð × Ù×ÕÙ × Ñ ÒÓ× ÙÑ ÒØÓ ×ÓÐÓ Ò ÓÒ× Ö Ö Ö Ó× ÒÓÖÑ Ð × ÙÝ Ô Ý ×Ø Ð ÒÞ ¸ Ó Ö Ó× Ö × Ù Ð × ÕÙ ÓÒØ Ò Ò Ð ÙÒ ­Ù Óº È Ö ÐÐÓ¸ Òר Ò ÑÓ× Ð Ù×ÕÙ ÓÒ Ð ¬ÐØÖÓ Res F<Net>º ÍÒ Òר Ò Ð Ð ÓÖ ØÑÓ Ò Ö Ó ÒØ Ö ÓÖ Ô Ö Ù×ÕÙ × Ñ ÒÓ× Ò ÔÖÓ ÙÒ ¹ ×Ó Ö Ð Ö Ö × Ù Ð ÒÓ× ÓÒ Ù Ð ÔÖ Ñ Ö Ý Ñ × Ð Ö Ð ÓÖ ØÑÓ × Ù ÖØÓ Ô Ö ­Ù Ó Ñ Ü ÑÓ Ð Ð ÓÖ ØÑÓ ÓÖ ¹ ÙÐ Ö×ÓÒ ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ ¿ template <class Net> typename Net::Flow_Type ford_fulkerson_maximum_flow(Net & net, const bool & leave_residual = false) { return aumenting_path_maximum_flow<Net, Find_Path_Depth_First>(net, leave_residual); } ØÓ× Ô Ö Ñ ØÖ Þ Ö Ð Ð ÓÖ ØÑÓ ­Ù Ó Ñ Ü ÑÓ¸ Ò ÓØÖ × ÔÐ ÓÒ × ÕÙ ÐÓ Ö ÕÙ Ö Ò¸ ÜÔÓÖØ Ö ÑÓ× ×Ø Ð ÓÖ ØÑÓ Ó Ð ÒÓÑ Ö ÙÒ Ð × ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ template <class Net> class Ford_Fulkerson_Maximum_Flow { typename Net::Flow_Type operator () (Net & net, const bool & leave_residual = false) const { return ford_fulkerson_maximum_flow(net, leave_residual); } }; Ò ÐÓ ÕÙ × Ù ¸ ØÓ Ó× ÐÓ× Ð ÓÖ ØÑÓ× ­Ù Ó Ñ Ü ÑÓ ÕÙ × ÖÖÓÐÐ Ö ÑÓ× Ø Ò Ö Ò ×Ù Ð × ÒÚÓ ÒØ º
  • 791.
    7.10. Redes deflujo 765 D 4/0 E 8/0 I 4/0 K D 4 E 8 I 4 K 6/0 3/0 4/0 5/0 3/0 4/0 3/0 4/0 6 3 4 5 3 4 3 4 A 7/0 B 6/0 F 4/0 H 5/0 M A 7 B 6 F 4 H 5 M 5/0 5/0 3/0 5/0 7/0 6/0 4/0 6/0 5 5 3 5 7 6 4 6 C G J 5/0 L C G J 5 L 4/0 6/0 4 6 ´µ ´ µ D 4 E 8 I 4 K D 4/0 E 8/0 I 4/0 K 6 3 4 5 3 4 3 4 6/0 3/0 4/0 5/0 3/0 4/0 3/0 4/0 A 7 B 6 F 4 H 5 M A 7/0 B 6/0 F 4/0 H 5/0 M 2 4 3 5 3 5 6 4 3 3 3 5/3 5/0 3/3 5/0 7/3 6/0 4/0 6/3 2 C 4 G 6 J L C G J 5/3 L 3 4/0 6/0 ´µ ´ µ D 4/0 E 8/0 I 4/0 K D 4 E 8 I 4 K 6/0 3/0 4/0 5/0 3/0 4/0 3/0 4/0 6 3 4 5 3 4 3 4 5 4 A 7/2 B 6/2 F 4/0 H 5/0 M A B F 4 H 5 M 2 2 2 2 1 5/3 5/0 3/3 5/0 7/5 6/0 4/0 6/5 5 3 5 6 4 3 5 5 C G J 5/5 L C G J L 4/0 6/0 4 6 5 ´µ ´µ D 4/0 E 8/0 I 4/0 K D 4 E 8 I 4 K 6/0 3/0 4/0 5/0 3/0 4/0 3/0 4/0 6 3 4 5 3 4 3 4 4 3 A 7/3 B 6/3 F 4/0 H 5/0 M A B F 4 H 5 M 3 3 5 2 2 5/3 5/0 3/3 5/0 7/5 6/1 4/0 6/6 5 3 5 4 6 3 5 1 C G J 5/5 L C G J L 4/0 6/0 4 6 5 ´µ ´ µ ÙÖ º ÚÓÐÙ ÓÒ Ð Ð ÓÖ ØÑÓ ÓÖ ¹ ÙÐ Ö×ÓÒ ×Ó Ö Ð Ö Ð ¬ ÙÖ º º ÙÖ × Ð ÞÕÙ Ö ÑÙ ×ØÖ Ò Ð ×Ø Ó ­Ù Ó Ð Ö Ý Ö × ÐØ Ò Ð Ñ ÒÓ ÙÑ ÒØÓº ÙÖ × Ð Ö ÑÙ ×ØÖ Ò Ð Ö Ö × Ù Ð¸ ÙÒØÓ ÓÒ Ð Ñ ÒÓ ÙÑ ÒØÓ Ø Ð ÓÑÓ × × Ù Ö Ò Ð Ù×ÕÙ Ö Ó× ÓÒ Ú ÐÓÖ 0 ÒÓ × ÑÙ ×ØÖ Ò Ò Ð Ö Ö × Ù Ðº
  • 792.
    766 Cap´ ıtulo 7. Grafos Ð Ð ÓÖ ØÑÓ ÓÖ ¹ ÙÐ Ö×ÓÒ × × Ò Ò ÓÒØÖ Ö Ñ ÒÓ× ÙÑ ÒØÓ ÔÓÖ Ù×ÕÙ Ò ÔÖÓ ÙÒ Ý ÔÖÓ Ö × Ú Ñ ÒØ Ò Ö Ñ ÒØ Ö Ð ­Ù Ó Ò Ð ×Ð ÓÒ Ñ Ò ÑÓº ÄÓ× Ñ ÒÓ× × ÐÓ Ð Þ Ò Ò Ð Ö Ö × Ù Ð ÕÙ × ÓÒרÖÙÝ ÓÑÓ ÜØ Ò× ÓÒ Ð Ö ÓÖ Ò Ð Ý Ð × ØÙ Ð Þ ÓÒ × Ð ­Ù Ó Ø Ñ Ò × Ö Ð Þ Ò ×Ó Ö Ð Ö º Ä × ¬ ÙÖ × º Ý º ÐÙ×ØÖ Ò ØÓ × Ð × Ø Ö ÓÒ × Ð Ð ÓÖ ØÑÓ ÓÖ ¹ ÙÐ Ö×ÓÒ ×Ó Ö Ð Ö ÑÓ×ØÖ Ò Ð ¬ ÙÖ º º 7.10.11.1 An´lisis del algoritmo de Ford-Fulkerson a ÈÙ ×ØÓ ÕÙ Ð Ö Ó Ö × Ù Ð × ÓÒרÖÙÝ ×Ó Ö Ð ÔÖÓÔ Ö Ñ ÒØ Ð Ñ ØÓ Ó make residual net() ´Ü º½¼º½¼ ´Ô Ò ¾µµ¸ Ð ÓÒ×ÙÑÓ ×Ô Ó × O(E)¸ ÒØ ÕÙ ×ÓÖ Ð ×Ô Ó ÕÙ ÔÙ Ó ÙÔ Ö Ð Ñ ÒÓ ÙÑ ÒØÓ pathº Ð Óר Ò ÙÖ ÓÒ Ð ÓÒרÖÙ ÓÒ Ð Ö Ö × Ù Ð × O(E)¸ ÔÙ × × Ö ÕÙ Ö Ò Ö Ú × Ö ØÓ Ó× ÐÓ× Ö Ó× Ð Ö º Ä ÙÖ ÓÒ Ñ Ü Ñ Ó ÔÖÓÑ ÙÒ Ù×ÕÙ Ñ ÒÓ ÙÑ ÒØÓ ÔÓÖ ÜÔÐÓ¹ Ö ÓÒ Ò ÔÖÓ ÙÒ ×Ø ÓØ ÔÓÖ O(E) Ô Ö Ð Ô ÓÖ ×Ó ÐÓ Ù Ð × Ú ÒØ Ô × Ö ØÒÖ Ð ÓÐ Ö Ó׺ Ë N Ù × Ð ÒØ Ú × ÕÙ Ö Ô Ø Ð while¸ ÒØÓÒ × Ð ÙÖ ÓÒ Ð Ð ÓÖ ØÑÓ × O(E) + N × O(E) = N × O(E)º ÈÓÖ Ø ÒØÓ¸ Ð ÙÖ ÓÒ Ô Ò ÕÙ Ø Ò Ù ÒÓ × Ð Ñ ÒÓ ÙÑ ÒØÓ Ò ÓÒØÖ Ó ÔÓÖ find path depth first()º Ù ÒØÓ Ñ ÝÓÖ × Ð Ñ Ò ÑÓ ×Ð ÓÒ ÙÒ Ñ ÒÓ ÙÑ ÒØÓ¸ Ñ × × Ö Ö Ð Ò Ö Ñ ÒØÓ Ð ­Ù Ó Ð Ú ÐÓÖ Ñ Ü ÑÓº Ä ÓÒ ÙÒ Ñ ÒÓ ÙÑ ÒØÓ ×ØÖ ¸ Ò¹ ØÓÒ ×¸ Ò ÕÙ ×Ù ×Ð ÓÒ Ñ Ò ÑÓ × ÐØÓº Ò ×Ø × ÒØ Ó¸ find path depth first() ÒÓ ÒÓ× Ó Ö Ò Ò ÙÒ Ö Ø Ö Ó Ð ÖÙØ Ò Ò Ù ÒØÖ Ð Ñ ÒÓ ÙÑ ÒØÓ × ÙÒ Ð × Ö¹ ÙÒר Ò × ØÓÔÓÐÓ ×¸ Ð × Ù Ð ×¸ ÒÙ ×ØÖÓ× ØÓ× ÔÙ Ò ÓÒ× Ö Ö× Ð ØÓÖ ×º ÈÓÖ Ø ÒØÓ¸ ×ÙÑ Ò Ó Ô × ÒØ Ö ×¸ ÔÙ Ö Ò Ö ÕÙ Ö Ö× O(f∗ ) Ö Ô Ø ÓÒ × Ô Ö ÐÐ Ö Ð Ñ Ü ÑÓ¾ º Ò Ð ÓÑ Ò Ó ÒØ ÖÓ¸ ×ØÓ ×Ù × find path depth first() × ÑÔÖ ÒÓ× Ò Ù ÒØÖ Ñ ÒÓ× ÓÒ ×Ð ÓÒ Ñ Ò ÑÓ ÙÒ Ø Ö Óº È Ö ÔÖ Ò Ö Ñ ÓÖ Ð ×ÙÒØÓ¸ ÓÒ× Ö ÑÓ× Ð Ö Ð ¬ ÙÖ º ½º Ë Ð ×Ù ÖØ ÕÙ Ð ÔÖ Ñ Ö Ñ ÒÓ ÙÑ ÒØÓ × Ù ÖØÓ ÔÓÖ find path depth first() × s → v → w → t¸ ÒØÓÒ ×¸ ford fulkerson maximum flow() ÔÙ Ö Ð Þ Ö N Ò Ö Ñ ÒØÓ× ­Ù Ó × ¸ Ô ÖØ Ö Ð Ö Ó Ö × Ù Ð Ð ¬ ÙÖ º ½¹ ¸ find path depth first() × ÑÔÖ Ò Ù ÒØÖ ÓÑÓ Ñ ÒÓ ÙÑ ÒØÓ s → w → v → t¸ ÙÝÓ ×Ð ÓÒ Ñ Ò ÑÓ × ÑÔÖ × Ö 1º ÍÒ Ð × Ö Ø × Ð Ð ÓÖ ØÑÓ ÓÖ ¹ ÙÐ Ö×ÓÒ × ÕÙ ×Ù Ø ÖÑ Ò ÓÒ ÒÓ ×Ø Ö Ò¹ ØÞ × Ð × Ô × × Ö ÔÖ × ÒØ Ò ÓÒ ÖÖ ÓÒ Ð ×º Ä Ö Ø × Ò ÓÐ Ø ÓÖ ¸ ÔÙ × × ÐÓ× ÖÖ ÓÒ Ð × × Ö ÔÖ × ÒØ Ò Ò ÔÙÒØÓ ­ÓØ ÒØ ¸ ÒØÓÒ × ÐÓ× ×Ù × ÚÓ× ÙÑ ÒØÓ× ­Ù Ó Ø ÖÑ Ò Ò Ð ÒÞ Ò Ó Ð Ú ÐÓÖ Ô ÙÒ Ö Óº Ë × ÑÔÐ Ò Ö ÓÒ × ÓÑÓ Ô ×¸ ÒØÓÒ × ×Ø × ÔÙ Ò ØÖ Ò× ÓÖÑ Ö× ÒØ ÖÓ× × ÙÒ ×Ù Ñ Ò ÑÓ ÓÑÙÒ ÑÙÐØ ÔÐÓº Ë Ò Ñ Ö Ó¸ ÙÒ × ×ÙÔ Ø ÑÓ× Ð × Ô × Ð ÓÑ Ò Ó ÒØ ÖÓ Ý ÙÒ ÜÔÐÓÖ ÓÒ Ò ÔÖÓ ÙÒ Ø ÖÑ Ò ×Ø ¸ Ð Ð ÓÖ ØÑÓ ÓÖ ¹ ÙÐ Ö×ÓÒ ÔÙ Ü Ö¸ Ò Ð Ô ÓÖ ×Ó¸ ÙÒ ¬ Ò O(f ∗ × E)¸ ÐÓ ÕÙ ¸ ÓÑÓ × ÔÖ Ò Ð ÑÔÐÓ Ð ¬ ÙÖ º ½¸ ÔÙ Ö × Ö ×Ø ÒØ × Ú ÖÓº ¾ Ê ÓÖ ÑÓ× ÕÙ f∗ × Ð Ú ÐÓÖ ­Ù Ó Ñ Ü ÑÓº
  • 793.
    7.10. Redes deflujo 767 5 1 D 4/0 E 8/3 I 4/3 K D 4 E I K 3 3 1 6/0 3/0 4/0 5/0 3/3 4/0 3/0 4/3 6 3 4 5 3 4 3 3 1 A 7/6 B 6/6 F 4/0 H 5/0 M A B F 4 H 5 M 6 6 2 2 2 3 5/3 5/0 3/3 5/0 7/5 6/4 4/3 6/6 5 3 5 6 3 5 1 4 C G J 5/5 L C G J L 4/0 6/0 4 6 5 ´µ ´ µ 5 D 4/0 E 8/3 I 4/4 K D 4 E I K 4 3 2 4 1 6/0 3/1 4/0 5/1 3/3 4/1 3/0 4/4 6 4 3 3 4 1 3 1 1 A 7/6 B 6/6 F 4/0 H 5/0 M A B F 4 H 5 M 6 6 1 2 2 5/3 5/0 3/3 5/0 7/5 6/5 4/4 6/6 5 3 5 4 6 3 5 5 C G J 5/5 L C G J L 4/0 6/0 4 6 5 ´µ ´ µ 5 D 4/0 E 8/3 I 4/4 K D 4 E I K 4 3 2 1 6/0 3/3 4/0 5/3 3/3 4/1 3/0 4/4 6 3 4 3 3 4 3 3 1 2 3 A 7/6 B 6/6 F 4/2 H 5/2 M A B F H M 6 6 2 2 1 2 2 5/3 5/0 3/3 5/0 7/5 6/5 4/4 6/6 5 3 5 4 6 3 5 5 C G J 5/5 L C G J L 4/0 6/0 4 6 5 ´µ ´µ 2 5 D 4/2 E 8/3 I 4/4 K D E I K 4 2 3 4 1 6/2 3/3 4/0 5/5 3/3 4/1 3/0 4/4 3 4 5 3 3 4 2 3 1 1 A 7/6 B 6/6 F 4/4 H 5/4 M A B F H M 6 4 6 4 1 2 2 5/3 5/0 3/3 5/0 7/5 6/5 4/4 6/6 5 3 5 4 6 3 5 5 C G J 5/5 L C G J L 4/0 6/0 4 6 5 ´µ ´ µ ÙÖ º ÓÒØ ÒÙ ÓÒ Ð Ð ÓÖ ØÑÓ ÓÖ ¹ ÙÐ Ö×ÓÒ ×Ó Ö Ð Ö Ð ¬ ÙÖ º º ÆÓØ × ÕÙ Ò Ð ÙÐØ Ñ Ö Ö × Ù Ð Ð ×ÙÑ ÖÓ Ú Ò Ò ÓÒ ÜÓ¸ ÐÓ ÕÙ Ø ÖÑ Ò Ð ÔÖ Ð Ð ÓÖ ØÑÓº
  • 794.
    768 Cap´ ıtulo 7. Grafos 1 4 D 4/3 E 8/4 I 4/4 K D E I K 4 3 4 3 6/3 3/3 4/0 5/5 3/3 4/0 3/0 4/4 3 4 5 3 4 3 4 3 1 A 7/6 B 6/6 F 4/4 H 5/5 M A B F H M 6 4 5 6 1 2 2 5/3 5/0 3/3 5/0 7/5 6/5 4/4 6/6 5 3 5 4 6 3 5 5 C G J 5/5 L C G J L 4/0 6/0 4 6 5 ´µ ´ µ ÙÖ º ¼ ר Ó ¬Ò Ð Ð Ð ÓÖ ØÑÓ ÓÖ ¹ ÙÐ Ö×ÓÒ ÓÒ Ð Ö Ð ¬ ÙÖ º º v v v N-1 N N N N/1 N 1 t s 1 t s 1/1 t s 1/1 N/1 N N N N/1 N w w 1 w ´ µ Ö ÓÖ × Ù Ð ´ µ ÓÒ Ð Ò Ö Ñ ÒØÓ ­Ù Ó ´ µ Ö Ó Ö × Ù Ð Ö ×ÙÐØ ÒØ ÙÖ º ½ ÑÔÐÓ Ö ÙÝÓ Ô ÓÖ ×Ó ÓÒ ÙÒ Ù×ÕÙ Ò ÔÖÓ ÙÒ Ö ÕÙ Ö O(N) Ò Ö Ñ ÒØÓ× ­Ù Ó Ô Ö Ð Ð ÓÖ ØÑÓ ÓÖ ¹ ÙÐ Ö×ÓÒº 7.10.12 El algoritmo de Edmonds-Karp ÍÒ Ö ¬Ò Ñ ÒØÓ Ð Ð ÓÖ ØÑÓ ÒØ Ö ÓÖ ×ØÖ Ò ×Ù ×Ø ØÙ Ö Ð Ù×ÕÙ Ò ÔÖÓ ÙÒ ÙÒ Ñ ÒÓ ÙÑ ÒØÓ ÔÓÖ ÙÒ Ò ÑÔÐ ØÙ º Ë Ò Ð Ù×ÕÙ Ò ÑÔÐ ØÙ Ø Ò × Ö ÙÒ ÔÓ Ó Ñ × ÓÒ ÖÓ× Ò Ñ ÑÓÖ ÕÙ Ð ÔÖÓ ÙÒ ¸ Ó Ð Ò ÓÐ Ñ ÒØÓ Ñ ÒÓ× Ô Ö Ð ×¸ ר ×ÙØ Ð Ñ Ó × ÙÖ ÙÒ Ö Ò Ñ ÒØÓ ÓÒ× Ö Ð Ñ ÒØ Ñ × ¬ ÒØ ÕÙ Ð Ð ÓÖ ØÑÓ ÓÖ ¹ ÙÐ Ö×ÓÒ O(V E2)¸ Ô Ö Ð Ô ÓÖ ×Óº À Ù ÒØ ØÓ Ð Ñ ÕÙ Ò Ö ×ÔÐ ¸ Ð Ð ÓÖ ØÑÓ ÑÓÒ ×¹Ã ÖÔ × ×ØÖÙ ØÙÖ ÐÑ ÒØ ÒØ Ó Ð ÓÖ ¹ ÙÐ Ö×ÓÒ ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ ¾ template <class Net> typename Net::Flow_Type edmonds_karp_maximum_flow(Net & net, const bool & leave_residual = false) { return aumenting_path_maximum_flow<Net, Find_Path_Breadth_First>(net, leave_residual); } Ð ×ÙØ Ð × ÑÓ Ñ Ó ×Ó Ö ÙÒ Ô Ð Ö ¹ ÔØ ÔÓÖ Ö Ø ¹ ׸ ÓÑÓ Ú Ö ÑÓ× ÔÖÓÒØ ¹ Ñ ÒØ ¸ ÙÒ Ñ ÒØ Ð Ô Ö ÓØ Ö Ð × ÑÔ ÒÓ Ð Ð ÓÖ ØÑÓº Ä × ¬ ÙÖ × º ¾ Ý º ¿ ÐÙ×ØÖ Ò ØÓ × Ð × Ø Ö ÓÒ × Ð Ð ÓÖ ØÑÓ ÑÓÒ ×¹Ã ÖÔ ×Ó Ö Ð Ö ÑÓ×ØÖ Ò Ð ¬ ÙÖ º º Ô × Ö Ð × Ð Ý Ð Þ Ö¸ Ð Ð ÓÖ ØÑÓ Ð ÙÐ Ð ­Ù Ó Ñ Ü ÑÓ Ò ÙÒ Ø Ö ÓÒ Ñ ÒÓ× ÕÙ ÓÒ Ð Ð ÓÖ ØÑÓ ÓÖ ¹ ÙÐ Ö×ÓÒ ´Ú Ö ¬ ÙÖ × º Ý º ¸ Ô ×º Ý µº È Ö ÒÙ ×ØÖ × Ö ÙÒר Ò ×¸ Ý ÙÒ Ò Ò Ò × ÑÔ ÒÓ ÐÑ ÒØ ÔÖ Ò× Ð º Ð ÔÓ×ØÖ ¸ ÓÒ ×Ø Ð ÓÖ ØÑÓ¸ Ð ÖÙØ Ò increase flow() ÓÔ Ö Ñ × Ö Ô Ó ÕÙ ÓÒ Ð
  • 795.
    7.10. Redes deflujo 769 D 4/0 E 8/0 I 4/0 K D 4 E 8 I 4 K 6/0 3/0 4/0 5/0 3/0 4/0 3/0 4/0 6 3 4 5 3 4 3 4 A 7/0 B 6/0 F 4/0 H 5/0 M A 7 B 6 F 4 H 5 M 5/0 5/0 3/0 5/0 7/0 6/0 4/0 6/0 5 5 3 5 7 6 4 6 C G J 5/0 L C G J 5 L 4/0 6/0 4 6 ´µ ´ µ D 4/0 E 8/0 I 4/0 K D 4 E 8 I 4 K 6/0 3/0 4/0 5/0 3/0 4/0 3/0 4/0 6 3 4 5 3 4 3 4 A 7/0 B 6/0 F 4/0 H 5/0 M A 7 B 6 F 4 H 5 M 3 2 3 5/3 5/0 3/3 5/0 7/0 6/3 4/0 6/3 5 3 5 7 4 3 3 3 C G J 5/0 L C G J 5 L 4/0 6/0 4 6 ´µ ´ µ D 4/0 E 8/0 I 4/0 K D 4 E 8 I 4 K 6/0 3/0 4/0 5/0 3/0 4/0 3/0 4/0 6 3 4 5 3 4 3 4 4 3 A 7/3 B 6/3 F 4/0 H 5/0 M A B F 4 H 5 M 3 3 2 5/3 5/0 3/3 5/0 7/0 6/6 4/0 6/6 5 3 5 7 6 4 6 3 C G J 5/0 L C G J 5 L 4/0 6/0 4 6 ´µ ´µ D 4/0 E 8/0 I 4/0 K D 4 E 8 I 4 K 6/0 3/0 4/0 5/0 3/0 4/0 3/0 4/0 6 3 4 5 3 4 3 4 1 1 2 A 7/6 B 6/6 F 4/3 H 5/3 M A B F H M 6 6 3 3 2 5/3 5/0 3/3 5/0 7/0 6/6 4/0 6/6 5 3 5 7 6 4 6 3 C G J 5/0 L C G J 5 L 4/0 6/0 4 6 ´µ ´ µ D 4/0 E 8/0 I 4/0 K D 4 E 8 I 4 K 2 4 6/0 3/1 4/0 5/1 3/0 4/0 3/0 4/0 6 4 3 4 3 4 1 1 1 1 A 7/6 B 6/6 F 4/4 H 5/4 M A B F H M 6 4 6 4 2 5/3 5/0 3/3 5/0 7/0 6/6 4/0 6/6 5 3 5 7 6 4 6 3 C G J 5/0 L C G J 5 L 4/0 6/0 4 6 ´µ ´µ ÙÖ º ¾ ÚÓÐÙ ÓÒ Ð Ð ÓÖ ØÑÓ ÑÓÒ ×¹Ã ÖÔ ×Ó Ö Ð Ö Ð ¬ ÙÖ º º
  • 796.
    770 Cap´ ıtulo 7. Grafos ÓÖ ¹ ÙÐ Ö×ÓÒ¸ ÔÙ × Ð Ô × ÔÖ Ð ÙÐ Ö Ð ×Ð ÓÒ Ñ Ò ÑÓ × ×Ó Ö Ð Ñ ÒÓ Ñ × ÓÖØÓº 6 2 D 4/0 E 8/2 I 4/2 K D 4 E I K 2 2 4 2 6/0 3/3 4/0 5/1 3/0 4/0 3/0 4/2 6 3 4 3 4 3 1 2 1 1 A 7/6 B 6/6 F 4/4 H 5/4 M A B F H M 6 4 6 4 2 5/3 5/0 3/3 5/0 7/0 6/6 4/0 6/6 5 3 5 7 6 4 6 3 C G J 5/0 L C G J 5 L 4/0 6/0 4 6 ´µ ´ µ 2 4 D 4/2 E 8/4 I 4/4 K D E I K 4 2 4 4 4 6/2 3/3 4/0 5/1 3/0 4/0 3/0 4/4 3 4 3 4 3 4 2 1 1 1 A 7/6 B 6/6 F 4/4 H 5/4 M A B F H M 6 4 6 4 2 5/3 5/0 3/3 5/0 7/0 6/6 4/0 6/6 5 3 5 7 6 4 6 3 C G J 5/0 L C G J 5 L 4/0 6/0 4 6 ´µ ´ µ ÙÖ º ¿ ÓÒØ ÒÙ ÓÒ Ð Ð ÓÖ ØÑÓ ÑÓÒ ×¹Ã ÖÔ ×Ó Ö Ð Ö Ð ¬ ÙÖ º º 7.10.12.1 An´lisis del algoritmo de Edmonds-Karp a ÍÒ Ù×ÕÙ Ò ÑÔÐ ØÙ Ö ÕÙ Ö O(E) Ô Ö Ð Ô ÓÖ ×Ó ´Ú Ö Ü º º ´Ô Ò ½ µµº ÒÙ ÚÓ¸ Ð × ÑÔ ÒÓ Ð Ð ÓÖ ØÑÓ ×Ø Ö ÓØ Ó ÔÓÖ N × O(E)¸ ÓÒ N × Ö Ð Ñ Ü Ñ ÒØ Ø Ö ÓÒ ×¸ Ó Ð Ñ Ü Ñ ÒØ Ò Ö Ñ ÒØÓ× ­Ù Óº ÓÑÓ Ð Ù×ÕÙ × Ò ÑÔÐ ØÙ ¸ ÐÓ× Ñ ÒÓ× ÙÑ ÒØÓ × × Ù Ö Ò × ÐÓ× Ñ × ÓÖØÓ× ¸ Ò ÒØ Ö Ó׸ ר ÐÓ× Ñ × Ð Ö Ó׺ ¬Ò ÑÓ× d(u, v) ÓÑÓ Ð ×Ø Ò Ò Ö Ó× ÙÒ Ñ ÒÓ ÒØÖ Ó× ÒÓ Ó× u Ý vº Lema 7.6 Ë Ca ÙÒ Ñ ÒÓ i ÙÑ ÒØÓ Ð ÙÐ Ó ÔÓÖ find path breadth first() ÙÖ ÒØ Ð i¹ × Ñ Ø Ö ÓÒ Ð Ð ÓÖ ØÑÓ ÑÓÒ ×¹Ã ÖÔº ÒØÓÒ ×¸ ÐÙ Ó Ð i¹ × ÑÓ Ò Ö Ñ ÒØÓ Ð ­Ù Ó¸ di+1(s, t) ≥ di(s, t)º Demostraci´n Ä o ÑÓ×ØÖ ÓÒ ÕÙ Ú Ð ÑÓ×ØÖ Ö ÕÙ ¸ ×Ó Ö Ð Ö Ó Ö × Ù Ð¸ ∀v ∈ V − {s, t} Ø Ð ÕÙ Ò Ò ÙÒ Ñ ÒÓ ÙÑ ÒØÓ ×Ñ ÒÙÝ Ð ×Ø Ò Ò Ö Ó× Ð Ñ ÒÓ Ñ × ÓÖØÓ ÒØÖ s Ý vº ×ØÓ ÔÙ ÑÓ×ØÖ Ö× ÔÓÖ ÓÒØÖ ÓÒº ËÙÔÓÒ ÑÓ× Ci = s v Ð Ñ ÒÓ Ñ × ÓÖØÓ Ò Ö Ó× × s ר vº ÓÖ ×ÙÔÓÒ ÑÓ× Ð Ü ×Ø Ò ÙÒ Ñ ÒÓ ÙÑ ÒØÓ Ca ¸ Ð ÙÐ Ó ÔÓÖ i find path breadth first()¸ ÕÙ ÓÒØ Ò ÙÒ Ñ ÒÓ Ñ × ÓÖØÓ × Ö¸ ÕÙ di+1(s, v) < d(Ci)º ÑÓ× ÓÒ× Ö Ö Ó× × ØÙ ÓÒ × Ò Ö Ð ×
  • 797.
    7.10. Redes deflujo 771 1 4 D 4/3 E 8/4 I 4/4 K D E I K 4 3 4 3 6/3 3/3 4/0 5/5 3/3 4/0 3/0 4/4 3 4 5 3 4 3 4 3 1 A 7/6 B 6/6 F 4/4 H 5/5 M A B F H M 6 4 5 6 1 2 2 5/3 5/0 3/3 5/0 7/5 6/5 4/4 6/6 5 3 5 4 6 3 5 5 C G J 5/5 L C G J L 4/0 6/0 4 6 5 ´µ ´ µ ÙÖ º ר Ó ¬Ò Ð Ð Ð ÓÖ ØÑÓ ÑÓÒ ×¹Ã ÖÔ ÓÒ Ð Ö Ð ¬ ÙÖ º º ½º v ∈ Cai =⇒ Ci / × Ù × Ò Ó Ñ Ò ÑÓ Ò Ö Ó׺ ¾º ∃w ∈ Ci|w ∈ Ca =⇒ ÔÓ ÑÓ× ÓÒ× Ö Ö Ó× ÔÓ× Ð i × ´ µ Ë Ca = s v w t¸ ÒØÓÒ × Ci × Ù × Ò Ó Ñ Ò ÑÓº È ÖÓ¸ i ´ µ Ë Ca = s w v × Ö ÙÒ ÓÒØÖ i ÓÒ ÓÒ Ð Ó ÕÙ Ci × Ð Ñ Ò ÑÓ Ñ ÒÓ Ò Ö Ó× × s vº ר ÙÒ ÔÓ× Ð × ÙÒ ÓÒØÖ ÓÒº Ð Ð Ñ × ÔÙ × ÖØÓ o ıtico de un camino de aumento) Ë Ca = s Definici´n 7.18 (Arco cr´ v1 ...u → v vm t ÙÒ Ñ ÒÓ ÙÑ ÒØÓ Ù ÐÕÙ Ö ×Ó Ö ÙÒ Ö Ö × Ù Ðº Ë ÕÙ ÙÒ Ö Ó (u, v) ∈ Ca × Ö Ø Ó × ×Ù Ô Ò Ð Ö ÓÖ× ÙÐ × ÙÐ Ð Ñ Ò ÑÓ ×Ð ÓÒ Ca Ý (u, v) ∈ E × Ö¸ (u, v) ∈ E º / Ä ÔÖÓÔ ÙÒ Ñ ÒØ Ð ÙÒ Ö Ó Ö Ø Ó × ÕÙ ×Ø × Ð Ñ Ò Ð Ö Ö× ÙÐ Ð Ò Ö Ñ ÒØ Ö× Ð ­Ù Ó × × ØÖ Ø ÙÒ Ö Ó Ð ÒØÓ¸ Ó Ð Ö Ñ ÒØ Ö× 0 × × ÙÒÓ Ö ØÖÓ ×Óº Ô ÖØ Ö ×Ø Ó¸ ÔÓ ÑÓ× ×Ø Ð Ö ÕÙ × Ð Ñ ÒÓ ÙÑ ÒØÓ Ca ÓÒØ Ò ÙÒ Ö Ó Ö Ø Ó (u, v)¸ ÒØÓÒ ×¸ Ô Ö ÙÒ Ø Ö ÓÒ ÙØÙÖ ¸ ÙÒ Ñ ÒÓ i ÙÑ ÒØÓ Ca ÕÙ ÒÚÓÐÙ Ö ÐÓ× ÒÓ Ó× u Ý v × × ÙÖÓ ÕÙ d(Ca ) ≥ d(Ca ) + 2º È Ö i+k i+k i ÔÖ Ò Ö ×Ø Ó¸ Ó × ÖÚ ÑÓ× Ð × Ù ÒØ ¬ ÙÖ Ca i s u v t Arco cr´ ıtico w Ca i+k Ä Ð Ò ÓÒØ ÒÙ ÐÙ×ØÖ ÙÒ ÔÓØ Ø Ó Ñ ÒÓ ÙÑ ÒØÓ ÓÒ ÙÒ Ö Ó Ö Ø Ó u, v Ð i¹ × Ñ Ø Ö ÓÒ Ð Ð ÓÖ ØÑÓ ÑÓÒ ×¹Ã ÖÔ Ñ ÒØÖ × ÕÙ Ð Ð Ò ÔÙÒØ ÙÒ Ñ ÒÓ ÙÑ ÒØÓ Ò ÙÒ Ø Ö ÓÒ ÙØÙÖ i + kº Ð Ò Ö Ñ ÒØ Ö× Ð ­Ù Ó Ð Ö Ó Ö Ø Ó × Ô Ö º ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ù ÐÕÙ Ö Ñ ÒÓ ÙÑ ÒØÓ ÙØÙÖÓ ÕÙ ÒÚÓÐÙ Ö u Ý v Ø Ò ÕÙ ÓÒØ Ò Ö¸ Ù Ò Ó Ñ ÒÓ׸ ÙÒ ÒÓ Ó ÒØ ÖÑ Ó w Ý Ó× Ö Ó× Ñ × ×ØÓ × × ÙÖÓ ÔÓÖÕÙ ÐÓ× Ñ ÒÓ× ÙÑ ÒØÓ × Ù× Ò Ò ÑÔÐ ØÙ ¸ ÐÓ ÕÙ ¸ ÓÑÓ Ý ÐÓ Ð Ö ÑÓ׸ Ö ØÓÖÒ Ñ ÒÓ× × ÐÓ× Ñ × ÓÖØÓ× ÐÓ× Ñ × Ð Ö Ó׺
  • 798.
    772 Cap´ ıtulo 7. Grafos Ä Ñ Ü Ñ ÐÓÒ ØÙ ÔÓ× Ð ÙÒ Ñ ÒÓ ÙÑ ÒØÓ × V ÒÓ Ó׺ ÓÒ× Ù ÒØ ¹ Ñ ÒØ ¸ ÙÒ Ö Ó ÔÙ × Ö Ö Ø Ó Ò ÐÓ ×ÙÑÓ V/2 Ñ ÒÓ× ÙÑ ÒØÓº ÈÓÖ Ø ÒØÓ¸ Ð Ñ Ü Ñ ÒØ ÔÓ× Ð Ñ ÒÓ× ÙÑ ÒØÓ × E × 2 º V ÐÓ ÒØ Ö ÓÖ ÓÒ ÐÙ ÑÓ× ÕÙ Ð Ð ÓÖ ØÑÓ ÑÓÒ ×¹Ã ÖÔ × E× V ×O(E) = O(VE2)º 2 Ë Ð Ö × ×Ô Ö ¸ ÐÓ ÕÙ ÒÓ × Ò Ö Ù ÒØ ¸ ÒØÓÒ × E ≈ c V Ý Ð Ð ÓÖ ØÑÓ ÑÓÒ ×¹Ã ÖÔ × Ö O(V 3) 7.10.13 Algoritmos de empuje y pre-flujo ÍÒ ­Ù Ó × Ò Ñ Ó Ò Ð × ÒØ Ó ÕÙ Ð ­Ù Ó × ÑÔÖ ×Ø ÓÖÖ Ò Ó ÔÓÖ Ð × ØÙ Ö × × ÒÓ¸ ÒØÓÒ × ÒÓ ÔÓ Ö ÑÓ× Ð Ö ­Ù Óº ÁÑ Ò ÑÓ× ÙÒ Ö ØÙ Ö Ù ¸ ÔÓÖ ÑÔÐÓº ËÙÔÓÒ ÑÓ× ÕÙ × ÑÓ× Ñ Ü Ñ Þ Ö Ð ÒØ Ù ÕÙ ÐÐ Ð ×ÙÑ ÖÓº ÍÒ Ò ÓÕÙ ÕÙ ×Ù Ö Ð ÒØÙ ÓÒ × × ØÙÖ Ö Ð Ñ Ü ÑÓ Ð × ØÙ Ö × Ð ÒÓ Ó Ù ÒØ ר ݸ ×Ù × Ú Ñ ÒØ ¸ × ÐÓ× ÒÓ Ó× Ñ × Ý ÒØ × Ð Ù ÒØ ר Ð ×ÙÑ ÖÓ¸ Ö ¬Ò Ò Ó Ð × ÐÐ Ú × ­Ù Ó Ð × ØÙ Ö × Ð Ö Ñ Ò Ö Ø Ð ÕÙ Ð ­Ù Ó Ò Ð ÔÙ Ö ÙÐ Ö × Ò ÓÒØ Ò ÓÒº × ÖÒÓ× Ð ÖÓ ÕÙ Ð Ñ Ü ÑÓ Ú ÐÓÖ ­Ù Ó Ø Ò ÕÙ × Ö Ñ ÒÓÖ Ó Ù Ð ×Ø ­Ù Ó Ò Ð¸ × ÓÑÓ ÕÙ ¸ × ØÓ × Ð × ÐÐ Ú × ×Ø Ò ÄÓ× ÒÓ Ó× ×Ø ÒÓ Ð × ØÙ Ö × ÕÙ Ñ Ò Ò Ð ×ÙÑ ÖÓ Ø Ò Ö Ò ÕÙ ×ÔÓÒ Ö ÙÒ ×Ô Ð Ú ÖÓ׸ ÑÓ Ó ÕÙ Ð ­Ù Ó × Ð ÒØ Ð Ù ÒØ ÔÙ Ñ ÒØ Ò Ö× ÓÒר ÒØ Ñ ÒØÖ × × Ú Ò Ùר Ò Ó Ð × ÐÐ Ú × Ð Ö ×ØÓ Ð × ØÙ Ö ×º ר Ô ØÖÓÒ ÒØÙ Ø ÚÓ × Ð ÙÒ Ñ ÒØÓ ÙÒ × Ö Ð ÓÖ ØÑÓ× ÒÓÑ Ò Ó× “empuje de pre-flujo”¸ Ö ÔÓÖØ Ó× × Ù ÖØÓ× ÔÓÖ ÔÖ Ñ Ö Ú Þ ÔÓÖ ÓÐ Ö Ý Ì Ö¹ Ò ½ ¸½ º Definici´n 7.19 (Pre-flujo) Ë o ÙÒ Ö N =< V, E, s, t, C >º ÍÒ “pre-flujo” × ÙÒ ÓÒ ÙÒØÓ E ⊂ E Ö Ó× ÓÒ Ú ÐÓÖ ­Ù Ó ÔÓ× Ø ÚÓ Ø Ð ÕÙ ∀e = (u, v) ∈ E ½º f(e) ≤ Ô(e)¸ Ý ¾º u = s, v = s =⇒ ÇÍÌ(u) ≤ ÁÆ(u), ÇÍÌ(v) ≤ ÁÆ(v)º Ò ÓØÖ × Ô Ð Ö ×¸ Ð ­Ù Ó ×Ð × Ö Ñ ÒÓÖ Ó Ù Ð ÕÙ Ð ÒØÖ º ÁÑÔÓÖØ ÒØ Ó × ÖÚ Ö ÕÙ Ó ×Ø ¬Ò ÓÒ ÒÓ × ÙÑÔÐ ¹Ø ÑÔÓÖ ÐÑ ÒØ ¹ Ð ÓÒ ÓÒ ÓÒ× ÖÚ ÓÒ Ð ­Ù Ó ÐÐ ¸ Ô٠׸ Ð Ò × ×ØÖ Ø Ý × Ñ ÒØ ÓÒ Ö Ø ÕÙ ÒÓ Ó ÔÓ× Ð Ð Ú ÖÓº ÈÓÖ Ð Ñ ×Ñ Ö ÞÓÒ × ÕÙ ×Ø Ñ Ð Ð ÓÖ ØÑÓ× × Ð ÒÓÑ Ò ÔÖ ¹­Ù Ó ¸ ÔÙ × ÙÖ ÒØ Ð Ù ÓÒ Ð ÔÖÓ Ñ ÒØÓ ÒØÙ Ø ÚÓ ÒÓ Ý ­Ù Ó ×Ó Ö Ð ÙÒÓ× ÒÓ Ó׸ Ò ÐÙ Ó Ð ×ÙÑ ÖÓº ÍÒ ÒÓ Ó ×Ø ÒØÓ Ð Ù ÒØ Ó Ð ×ÙÑ ÖÓ × ÐÐ Ñ Ó ÒØ ÖÒÓ º ÍÒ ÒÓ Ó ÒØ ÖÒÓ ÙÝÓ ­Ù Ó ÒØÖ × Ñ ÝÓÖ ÕÙ Ð × Ð × ÒÓÑ Ò Ó “activo”º Ò ÙÒ ÓÒ Ð Ì Net Graph<TNode,TArc,T>¸ Ð Ø ÖÑ Ò ÓÒ ÙÒ ÒÓ Ó Ø ÚÓ × × ÑÔÐ ¾ ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ ¿ template <class Net> static bool is_node_active(typename Net::Node * p) { return p->in_flow > p->out_flow; }
  • 799.
    7.10. Redes deflujo 773 È Ö ÙÒ ÒÓ Ó Ø ÚÓ u¸ Ð Ú ÐÓÖ ÁÆ(u) − ÇÍÌ(u) × ÒÓÑ Ò Ó Ü ×Ó Ý ÒÓØ Ó ÓÑÓ Ü ××(u)º Ë Ù Ò Ó ÓÒ Ð ÔÖÓ Ñ ÒØÓ ÒØÙ Ø ÚÓ Ð ÙÒ Ñ ÒØ Ð ÙÒ Ð ÓÖ ØÑÓ ÔÖ ¹ ­Ù Ó × ÓÑ ÒÞ Ö ÑÔÙ Ö × Ð Ù ÒØ Ð Ñ ÝÓÖ ÒØ ÔÓ× Ð ­Ù Ó ×Ø ÕÙ ÒÓ × ÔÙ ÑÔÙ Ö Ñ × ×Ó Ö Ð ×ÙÑ ÖÓº Ò ×Ø ÑÓÑ ÒØÓ Ð ­Ù Ó × Ö Ñ Ü ÑÓ¸ Ô ÖÓ ÑÙÝ ÔÖÓ Ð Ñ ÒØ Ö Ò ÒÓ Ó× Ø ÚÓ× ÙÝÓ ÕÙ Ð Ö Ó Ý ÕÙ Ö ×Ø ÙÖ Öº ÓÑÓ Ð Ö ÒÓ Ó× Ý Ö Ó× ÔÓÖ ÓÒ ÑÔÙ Ö ÔÖ ¹­Ù Ó Ð Ò Ó Ð Ð ÓÖ ØÑÓ Ð Ö ×ÔÙ ×Ø × Ö Ø Ð Ù ÒØ Ý ØÓ Ó× ×Ù× Ö Ó׺ ÄÙ Ó¸ ÐÓ× ÒÓ Ó× Ø ÚÓ× ×ÓÒ Ð Ð × Ô ÖÓ¸ ÔÓÖ Ù Ð × ÒØÖ ×Ù× Ö Ó× ÑÔÙ Ö Ð ÔÖ ¹­Ù Ó ×Ø ÔÖ ÙÒØ Ú ÞÓÖ Ð ×ÙÒØÓ Ñ × ÓÑÔÐ Ó ×Ø Ð × Ð ÓÖ ØÑÓ¸ ÔÙ × Ð Ð ÙÐÓ Ð ­Ù Ó Ñ Ü ÑÓ Ý Ð Ø ÖÑ Ò ÓÒ ÔÒ ÙÒ × Ó Ò Ù Ð ÔÖÓÜ ÑÓ ÒÓ Ó ÔÖÓ × Ö Ý ÔÓÖ Ù Ð × ÒØÖ ×Ù× Ö Ó× × Ð ÑÔÙ Ö ÔÖ ¹­Ù Óº 7.10.13.1 Altura de un nodo Ä ÑÐ Ð ÓÖ ØÑÓ× ÕÙ ÔÖÓÒØ Ñ ÒØ ¬Ò Ö ÑÓ׸ ×Ù Ý Ð ×Ó Ò Ð ÔÖÓÜ ÑÓ ÒÓ Ó Ò Ð ÐØÙÖ º Definici´n 7.20 (Funci´n de altura de un nodo) o o Ë ÙÒ Ö N =< V, E, s, t, C > ÓÒ Ö Ö × Ù Ð N =< V, E , s, t, C >º ÍÒ ÙÒ ÓÒ ÐØÙÖ Ah : V −→ N × ÙÒ ÙÒ ÓÒ ÒØÖ ÐÓ× ÒÓ Ó× Ð Ö Ø Ð ÕÙ ½º h(t) = 0º ¾º ∀e = (u, v) ∈ E =⇒ h(u) ≤ h(v) + 1º Ê ÓÖ ÑÓ× ÕÙ ÙÒ ÙÒ ÓÒ × ÙÒ ÓÒ ÙÒØÓ Ô Ö × ÓÖ Ò Ó׺ Ò ÒÙ ×ØÖÓ ×Ó Ô ÖØ ÙÐ Ö Ð Ø ÔÓ Ah = {(u1, h(u1)), (u2, h(u2)), . . . (un, h(un))}º ÍÒ Ö Ó e = (u, v) × Ð ¬ “elegible” × h(u) = h(v) + 1º È Ö Ñ ÒØ Ò Ö Ð Ú ÐÓÖ Ð ÙÒ ÓÒ ÐØÙÖ ÙÒ ÒÓ Ó¸ Ù× Ö ÑÓ× ×Ù ÓÒØ ÓÖ ´Ú × Ü º¿º º¾ ´Ô Ò ¿µµ ¿ ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ ¾ template <class Net> static long & node_height(typename Net::Node * p) { return NODE_COUNTER(p); } Ä Ô ÖØ Ò Ò Ó ÒÓ ÙÒ ÒÓ Ó Ð ÓÒ ÙÒØÓ Ah Ø ÖÑ Ò Ð ÙÒ ÓÒº Ä Ð ÙÒ ÓÒ ÐØÙÖ × Ñ ÒØ Ò Ö ÙÒ Ö Ð ÓÒ ÔÖÓÜ Ñ ÒØÖ Ð ÔÖ ¹ ­Ù Ó Ý ÐÓ× ÒÓ Ó× Ù ÒØ Ý ×ÙÑ ÖÓº Ù Ò Ó Ð ÐØÙÖ ÙÒ ÒÓ Ó Ø ÚÓ × Ñ ÒÓÖ ÕÙ Ð Ð Ù ÒØ ¸ ÒØÓÒ × × ÔÖÓ Ð ÑÔÙ Ö ÔÖ ¹­Ù Ó Ð ×ÙÑ ÖÓº Ë Ñ ØÖ Ñ ÒØ ¸ × Ð ÐØÙÖ × Ñ ÝÓÖ¸ ÒØÓÒ × ÔÖÓ Ð Ñ ÒØ Ý ÕÙ ÚÓÐÚ Ö ÔÖ ¹­Ù Ó Ð Ù ÒØ º 7.10.13.2 Algoritmo gen´rico de pre-flujo e Ò Ú ÖØÙ ×Ù Ö Ø Ö ÒØÙ Ø ÚÓ¸ ÐÓ× Ð ÓÖ ØÑÓ× × Ó× Ò ÑÔÙ ÔÖ ¹­Ù Ó ×ÓÒ Ñ × × ÑÔÐ × ÕÙ ÐÓ× × Ó× Ò Ù×ÕÙ × Ñ ÒÓ× ÙÑ ÒØÓº Ò Ò ÙÖ ¸ ÔÖ Ø Ñ ÒØ × ØÓ Ó Ð ÓÖ ØÑÓ ÔÖ ¹­Ù Ó ×Ù Ý ×Ó Ö Ð × Ù ÒØ Ð ÓÖ ØÑÓ Ò Ö Óº
  • 800.
    774 Cap´ ıtulo 7. Grafos Algoritmo 7.6 (Algoritmo gen´rico de empuje de pre-flujo) e Ä ÒØÖ × ÙÒ Ö N =< V, E, s, t, C >º Ä × Ð × Ð Ñ ×Ñ Ö ÓÒ Ú ÐÓÖ × ­Ù Ó Ùר Ó Ð Ñ Ü ÑÓ Ú ÐÓÖ ­Ù Óº Ñ × Ð Ö Ö × Ù Ð N =< V, E , s, t, C >¸ Ð Ð ÓÖ ØÑÓ Ù× ÙÒ ×ØÖÙ ¹ ØÙÖ ØÓ× ÒØ ÖÒ ¸ ÒÓÑ Ò Ah¸ ÙÝÓ ¬Ò × ÑÔÐ ÒØ Ö Ð ÙÒ ÓÒ ÐØÙÖ º ÒÓ Ó u ×Ó ×Ù Ú ÐÓÖ h(u) Ø Ð ÓÑÓ × ÜÔÐ Ó Ò Ð ×Ù ¹× ÓÒ ÒØ Ö ÓÖº ½º Ð ÙÐ Ö Ð Ö Ö × Ù Ð N ¾º × Ò Ö ÒÓ Ó u ×Ù Ú ÐÓÖ h(u) × ÙÒ ¬Ò ÓÒ º¾¼ ¿º Ah = ∅ ´ Ð ÓÒ ÙÒØÓ ÒÓ Ó× Ø ÚÓ×µ º ∀e = (s, u) ∈ s ÈÖ ¹­Ù Ó Ò Ð Ö Ó× Ð ÒÓ Ó Ù ÒØ ½ ´ µ f(e) = Ô(e) [Saturaci´n]o ´ µ Ë u = t =⇒ Ah = Ah ∪ {u} [a˜adir u al conjunto de nodos activos] n º Å ÒØÖ × Ah = ∅ [Equilibrar nodos activos] ´ µ Ë Ð ÓÒ ÙÒ ÒÓ Ó Ø ÚÓ u ∈ Ah, Ah = Ah − {u} ´ µ ∀e ∈ u, e ∈ E [Empuje de pre-flujo de u] º Ë e = (u, v) × ÙÒ “arco elegible” × Ö¸ × h(u) = h(v) + 1 =⇒ ÑÔÙ Ö ÔÖ ¹­Ù Ó ÔÓÖ Ö Ó ØÙ Ð ½ º fp = Ñ Ò( Ü ××(u), Ô(e) − f(e)) [Flujo a empujar sobre el arco] º f(e) = fp º Ü ××(u) = Ü ××(u) − fp º Ë u = s Ý u = t =⇒ Ah = Ah ∪ {v} ´ µ Ë Ü ××(u) > 0 =⇒ h(u) = h(u) + 1, Ah = Ah ∪ {u} ´u × ÙÒ ÙÒ ÒÓ Ó Ø ÚÓ ÓÒ ÙÒ Ò Ö Ñ ÒØÓ Ò Ð ÙÒ ÓÒ ÐØÙÖ µ Ð Ð ÓÖ ØÑÓ ÑÔÙ ØÓ Ó Ð ÔÓ× Ð ÔÖ ¹­Ù Ó ÔÓÖ ÐÓ× Ö Ó× Ð Ù ÒØ º È ÙÐ Ø Ò Ñ ÒØ ¸ × ÙÒ Ð ÓÖ Ò Ò ÕÙ × ÔÖ × ÒØ Ò ÐÓ× ÒÓ Ó× Ø ÚÓ׸ Ð Ü ×Ó × Ú ÔÖÓÔ Ò Ó ×Ø Ð ÒÞ Ö Ð ×ÙÑ ÖÓº Ù Ò Ó ×Ø Ú Ò × ØÙÖ Ó¸ Ð Ü ×Ó Ö ØÓÖÒ Ð Ù ÒØ Ö Ò Ò Ó× ¸ × × ÔÓ× Ð ¸ Ò ÕÙ ÐÐÓ× ÒÓ Ó× ÕÙ Ø Ò Ò Ô º Ò ÐÑ ÒØ ¸ Ù Ò Ó Ð Ü ×Ó Ð ÒÞ Ð Ù ÒØ ¸ ר × Ð Ö ×Ø ×Ù× Ö Ó× ×Ø ÕÙ Ð ­Ù Ó Ú Ò ×Ø Ð º Ò ×Ø ר Ó¸ Ð ­Ù Ó × Ñ Ü ÑÓ Ý Ý ÒÓ Ü ×Ø Ò ÒÓ Ó× Ø ÚÓ׺ Ò Ð ÒרÖÙ ÓÒ ´ µ × Ø ÖÑ Ò × × ÑÔÙ Ó ÒÓ ÔÖ ¹­Ù Ó ÔÓÖ Ö Ó × Ð ÒØ Ð ÒÓ Ó ØÙ ÐÑ ÒØ × Ð ÓÒ Óº Ë ÒÓ × ÐÓ Ö ÑÔÙ Ö ØÓ Ó Ð Ü ×Ó¸ ÒØÓÒ × Ð ÒÓ Ó × ÓÐÓ Ó ÒÙ ÚÓ Ò Ah¸ Ô ÖÓ ÓÒ ÙÒ Ú ÐÓÖ h(u) Ò Ö Ñ ÒØ Ó Ò ÙÒ ÙÒ ×ØÓ × ÐÓ ÕÙ Ô ÖÑ Ø ÕÙ Ú ÒØÙ ÐÑ ÒØ ÓØÖ Ø Ö ÓÒ ×Ó Ö Ð Ñ ×ÑÓ ÒÓ Ó Ú ÓÑÓ Ð Ð ÙÒ Ö Ó ÕÙ Ò ÙÒ Ø Ö ÓÒ Ô × ÒÓ ÐÓ Ù Ý¸ Ò ÐÙ Ö Ú ÒÞ Ö Ð ÔÖ ¹­Ù Ó Ð ×ÙÑ ÖÓ¸ × Ö ØÖÓ Ð Ù ÒØ ¸ ÔÙ Ò Ó Ó ÙÖÖ Ö¸ Ò ÐÙ× Ú ¸ ÕÙ × ×Ñ ÒÙÝ Ò ÐÓ× ­Ù Ó× Ñ Ò ÒØ × Ð Ù ÒØ º ÍÒ Ñ Ò Ö ÔÖÓÜ Ñ Ö× Ð ÓÒ Ð Ð ÓÖ ØÑÓ ÓÒ× ×Ø Ò Ü Ñ Ò Ö ÐÓ ÕÙ × ÙÒ Ñ Ð ×Ó Ô Ö ÙÒ Ð ÓÖ ØÑÓ Ù ÐÕÙ Ö × Ó Ò Ð Ù×ÕÙ ÙÒ Ñ ÒÓ ÙÑ ÒØÓº È Ö ÐÐÓ¸ ÓÒ× Ö ÑÓ× ÙÒ Ö Ò Ö Ð ÓÒ Ð × Ù ÒØ ÓÖÑ
  • 801.
    7.10. Redes deflujo 775 x y Ò ×Ø Ð × Ö Ð ÒÓ Ó x Ø Ò × Ø ÙÖ ÓÒ × ÕÙ Ö ×ÙÐØ Ò ÓÒ ×Ø ÒÓ yº Ò ×Ø ×Ó¸ × Ö ÕÙ Ö Ò ÓÒØÖ Ö × Ø Ñ ÒÓ× ÙÑ ÒØÓ¸ Ô Ö ÔÓ Ö ÐÐ Ò Ö ÐÓ× ÒÓ Ó× x y Ñ ÒØÖ × ÕÙ ÙÒ Ð ÓÖ ØÑÓ × Ó Ò ÑÔÙ ÔÖ ¹­Ù Ó ÔÖÓ Ð Ñ ÒØ ÐÓ× ÐÐ Ò Ö Ô Ò × × ÑÔÙ Ð Ü ×Ó xº ÒØ × ÒרÖÙÑ ÒØ Ö Ð Ð ÓÖ ØÑÓ Ò Ö Ó Ý Ð ÙÒÓ× Ô ÖØ ÙÐ Ö ×¸ ÑÓ× ÔÖÓ Ö ×Ù ÓÖÖ Ø ØÙ × Ö¸ ÕÙ Ð ÙÐ Ð ­Ù Ó Ñ Ü ÑÓº Ò ÐÓ ÕÙ × Ù ¸ ÔÐ ÒØ Ö ÑÓ× ÙÒ × Ö ÔÖÓÔÓ× ÓÒ × ×Ø Ò × ÔÖÓ Ö Ð ÔÖÓÔÓ× ÓÒ ÓÖÖ Ø ØÙ º × Ö ÑÓ× ÒÙ ×ØÖÓ × ÙÖ×Ó Ò Ð ÔÐ ÒØ Ñ ÒØÓ Ë Û ¿¿ ¸ Ð Ù Ð ÓÒ× Ö ÑÓ× × Ð Ñ × ÐÑ ÒØ ÔÖÓÔ Ð º Ð ÔÖ Ñ Ö Ô ×Ó Ð ÔÖÙ ÓÖÖ Ø ØÙ × ÑÓ×ØÖ Ö ÕÙ Ð ÙÒ ÓÒ ÐØÙÖ × ÚÐ º Proposici´n 7.11 (Sedgewick 2002 [33]) Ë ÙÒ Ö o N =< V, E, s, t, C > ÓÒ Ö Ö × Ù Ð N =< V, E , s, t, C >º Ë h : V −→ N ÙÒ ÙÒ ÓÒÐØÙÖ º ÒØÓÒ × Ð Ð ÓÖ ØÑÓ Ò Ö Ó ÑÔÙ ÔÖ ¹­Ù Ó º ÓÒ× ÖÚ Ð Ú Ð Þ Ð ÙÒ ÓÒ ÐØÙÖ × ÙÒ Ð ¬Ò ÓÒ º¾¼º Demostraci´n È Ö ¬ÖÑ Ö ÕÙ h × Ú Ð ¸ Ý ÕÙ o ÑÓ×ØÖ Ö ÕÙ ÐÓ Ð Ö Ó Ð Ù ÓÒ Ð Ð ÓÖ ØÑÓ h(u) ≤ h(v) + 1 Ô Ö ØÓ Ó Ö Ó Ð Ö Ö × Ù Ðº Ð Ô ×Ó ¾ × Ò Ú ÐÓÖ × ÓÖÖ ØÓ× × ÙÒ Ð ¬Ò ÓÒº Ñ ×¸ Ah × Ò ÐÑ ÒØ Ú Óº ÈÓÖ ÐÓ ÕÙ Ð ÑÓ×ØÖ ÓÒ × Ö Ñ Ø ÓÑÔÖÓ Ö ÕÙ ÐÓ× ÒÓ Ó× ÕÙ × ÒØÖÓ ÙÞ Ò Ah × Ø × Ò Ð ¬Ò ÓÒº ÁÑ Ò ÑÓ× ÙÒ ÒÓ Ó Ø ÚÓ uº Ë ÒÓ Ü ×Ø Ò Ò ÙÒ Ö Ó Ð Ð ¸ ÒØÓÒ × h(u) = h(u) + 1 Ý u Ö Ö × Ð ÓÒ ÙÒØÓ ÐÓ× ÒÓ Ó× Ø ÚÓ× ÓÒ h(u) Ò Ö Ñ ÒØ Ó Ò ÙÒÓ ÔÓÖ Ð ÒרÖÙ ÓÒ º ÒØ × ×Ø ÒרÖÙ ÓÒ¸ ÙÒ ÓÒ ÙÒØÓ Ú Ð Ó Ah = {(v1, h(v1)), (v2, h(v2)), . . . (u, h(u)), . . . , (vn, h(vn))} ÐÙ Ó¸ Ð ÓÒ ÙÒØÓ Ø Ò ÓÖÑ Ah = {(v1, h(v1)), (v2, h(v2)), . . . (u, h(u) + 1), . . . , (vn, h(vn))}¸ Ð Ù Ð × Ù × Ò Ó Ú Ð Ó × ÙÒ Ð ¬Ò ÓÒº Ë u Ø Ò ÙÒÓ Ó Ñ × Ö Ó× Ð Ð ×¸ ÒØÓÒ × Ð ÙÒÓ× × × ØÙÖ Ö Ò ÔÐ Ò Ô ¸ × Ô Ö Ö Ò Ð Ö Ö × Ù Ð Ý Ô Ö Ö Ò ÓØÖÓ× ÒÚ Ö×Ó׺ ÓÒ× Ö ÑÓ× Ð ÙÐØ ÑÓ ÐÓ× Ö Ó× Ð Ð × u → v¸ Ð Ù Ð Ø ÖÑ Ò Ö ÕÙ u Ô ÖÑ Ò Þ Ó ÒÓ ÒØÖÓ Ð ÓÒ ÙÒØÓ ÒÓ Ó× Ø ÚÓ׺ ÑÓ× ÓÒØ ÑÔÐ Ö Ó× ÔÓ× Ð × ½º ÉÙ u → v × × ØÙÖ ÔÐ Ò Ô Ò ×Ø ×Ó¸ u → v Ø Ñ Ò × Ô Ö
  • 802.
    776 Cap´ ıtulo 7. Grafos Ð Ö Ö × Ù Ð¸ × Ö ÙÒ Ö Ó ÒÚ Ö×Ó v → u Ý u × Ö ÙÒ ÒÓ Ó Ø ÚÓº ÈÓÖ ÐÓ ÕÙ Ð ÙÒ ÓÒ h × ÓÖÖ Ø º ¾º ÉÙ u → v ÒÓ × × ØÙÖ ÔÐ Ò Ô Ò ×Ø ×Ó¸ u → v × Ñ ÒØ Ò Ò Ð Ö Ö × Ù Ð¸ Ô Ö ÙÒ ÒÙ ÚÓ Ö Ó v → u¸ Ô ÖÓ h(u) × Ò Ö Ñ ÒØ º Ä × ØÙ ÓÒ ¬Ò Ð × ÔÙ Ñ Ò Ö × . . Nuevos nodos . a Ah u v Ö Ó w → u × Ø × h(w) ≤ h(u) + 1¸ ÔÙ × u Ù Ò Ö Ñ ÒØ Óº È Ö ÐÓ× Ö Ó× u → v Ý v → u Ø Ò ÑÓ× ÕÙ h(u) = h(v)¸ ÐÓ ÕÙ × Ø × Ð Ú Ð Þ Ð ÙÒ ÓÒ ÐØÙÖ Ä ÓØ ÓÒ Ð Ú ÐÓÖ h(u) ÒÓ× ÓØ Ð ÒØ Ö Ó× ÕÙ ÓÒØ Ò Ð Ñ ÒÓ Ñ Ò ÑÓ u t¸ Ø Ð ÓÑÓ ÐÓ ×Ø Ð Ð ÔÖÓÔÓ× ÓÒ × Ù ÒØ º Proposici´n 7.12 (Sedgewick 2002 [33]) Ë ÙÒ Ö o N =< V, E, s, t, C > ÓÒ Ö Ö × Ù Ð N =< V, E , s, t, C >º Ë Ah : V −→ N ÙÒ ÙÒ ÓÒ ÐØÙÖ º ÒØÓÒ ×¸ ∀v ∈ V h(v) × Ñ ÒÓÖ Ó Ù Ð ÕÙ Ð Ð ÐÓÒ ØÙ Ð Ñ ÒÓ Ñ × ÓÖØÓ Ò Ö Ó× × v t Ò Ð Ö Ö × Ù Ðº Demostraci´n Ë d Ð ÐÓÒ ØÙ o Ð Ñ ÒÓ Ñ × ÓÖØÓ Ò Ö Ó× × ÙÒ ÒÓ Ó v tº Ë Cv,t = v = v1 → v2 · · · → vd = t Ð Ñ ÒÓ Ñ × ÓÖØÓ Ò Ð Ö Ö × Ù Ðº ÒØÓÒ × h(v) = h(v1) ≤ h(v2) + 1 ≤ h(v3) + 1 ººº ≤ h(vd) + d = h(t) + d = d Ð Ð ÓÖ ØÑÓ × ÑÔÖ Ñ ÒØ Ò ÓÒ Ø Ó Ð Ü ×Ó × Ö¸ ÒÓ Ý ÒÓ Ó× Ø ÚÓ× ÕÙ ×Ø Ò Ò ÓÒ ÜÓ× Ò Ð Ö Ö × Ù Ðº ÁÒ ÐÑ ÒØ Ð Ü ×Ó ­Ù Ó¸ Ñ Ò Ð Ù ÒØ Ý × Ö Ð ×ÙÑ ÖÓ¸ Ð Ù Ð Ø Ò h(t) = 0 Ý ÒÙÒ × Ò Ahº ÄÓ× Ü ×Ó× ×ÓÒ ÔÖÓÔ Ó× Ð ×ÙÑ ÖÓ Ò Ð ÒרÖÙ ÓÒ ´ µ º Ë ÒÓ × Ð ÒÞ Ð ×ÙÑ ÖÓ¸ Ó ÙÒ Ö ×Ø Ò ÒÓ Ó× Ø ÚÓ׸ ÒØÓÒ × Ð Ü ×Ó × ÑÔÙ Ó Ð Ù ÒØ Ô Ö Ö Ñ Ò¹ Ø ÖÐÓº ר Ó¸ ר Ð ÔÖ × ÒØ ÒØÙ Ø ÚÓ¸ ÔÙ ÓÒ¬ÖÑ Ö× Ó Ø Ú Ñ ÒØ Ñ ÒØ Ð × Ù ÒØ ÔÖÓÔÓ× ÓÒº Proposici´n 7.13 (Sedgewick 2002 [33]) Ë ÙÒ o Ö N =< V, E, s, t, C > ÓÒ Ö Ö × Ù Ð N =< V, E , s, t, C >º Ë Ah : V −→ N ÙÒ ÙÒ ÓÒ ÐØÙÖ º ÒØÓÒ ×¸ ÙÖ ÒØ Ð Ù ÓÒ Ð Ð ÞÓ Ð Ð ÓÖ ØÑÓ º ¸ Ô Ö ÒÓ Ó Ø ÚÓ ½º Ü ×Ø ÙÒ Ñ ÒÓ Ò Ð Ö Ö × Ù Ð × Ð ÒÓ Ó Ø ÚÓ ×Ø Ð Ù ÒØ º ¾º ÆÓ Ü ×Ø Ñ ÒÓ × Ð Ù ÒØ Ð ×ÙÑ ÖÓº
  • 803.
    7.10. Redes deflujo 777 Demostraci´n ´ÔÓÖ Ò Ù o ÓÒ ×Ó Ö ÐÓ× ÒÓ Ó× Ø ÚÓ×µ ÒØ × ÒØÖ Ö Ð Ð ÞÓ¸ Ð Ô ×Ó ÒØÖÓ Ù Ò Ah ØÓ Ó× ÐÓ× ÒÓ Ó× {u1, u2, . . . , un} Ý ÒØ × sº רÓ× Ö Ó× ×ÓÒ × ØÙÖ Ó× ×Ù ÔÐ Ò Ô ¸ ÐÓ ÕÙ ÑÔÐ Ð Ô Ö ÓÒ Ö Ó× (u1, s), (u2, s), . . . (un, s) Ò Ð Ö Ö × Ù Ð Ý Ð × Ô Ö ÓÒ ÐÓ× ÒÚ Ö×Ó× (s, u1), (s, u2), . . . (s, un)º ÄÓ× ÒÓ Ó× Ø ÚÓ× u1, u2, . . . , un Ø Ò Ò Ñ ÒÓ× ×Ø Ð ×ÙÑ ÖÓ Ý Ð Ù ÒØ ݸ ÔÓÖ Ð × Ô Ö ÓÒ ÐÓ× ÒÚ Ö×Ó׸ s ÕÙ × ÓÒ Ø Óº ÈÓÖ Ø ÒØÓ¸ Ð ÒØÖ Ö Ð Ð ÞÓ Ð ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö ÐÓ× ÒÓ Ó× Ø ÚÓ× Ò Ð × Ý ÒØ × Ð Ù ÒØ º ÓÖ ×ÙÑ ÑÓ× ÕÙ Ð ÔÖÓÔÓ× ÓÒ × ÖØ Ô Ö ØÓ Ó ÒÓ Ó ÒØÖÓ Ð ÓÒ ÙÒØÓ Ah ÒÓ Ó× Ø ÚÓ׺ Ä ÙÒ Ñ Ò Ö ÕÙ × Ò ÙÒ ÒÙ ÚÓ ÒÓ Ó v Ah¸ × Ö¸ ÕÙ Ô Ö Þ ÙÒ ÒÙ ÚÓ ÒÓ Ó Ø ÚÓ¸ × ÕÙ × ÙÒ ØÙ Ð Ø ÚÓ u Ü ×Ø ÙÒ Ö Ó Ð Ð u → v ´ ÒרÖÙ ÓÒ ´ µ µº À Ý Ó× ×Ó× ÓÒ× Ö Ö ½º v ÒÙÒ × Ó Ø ÚÓ Ò ×Ø ×Ó h(u) = h(v) + 1º ÒØ × ÑÔÙ Ö ÔÓÖ u → v¸ ÒÓ Ý Ñ ÒÓ v s¸ ÔÙ × ÐÓ× Ö Ó× × Ð ÒØ × v ÒÓ ×ÓÒ Ö × Ù Ð ×º Ù Ò Ó × ÑÔÙ Ü ×Ó ÔÓÖ Ð Ö Ó u → v¸ Ô Ö ÙÒ Ö Ó Ö × Ù Ð × Ð ÒØ v → uº ÈÓÖ Ð ÔÓØ × × Ò Ù Ø Ú ¸ Ü ×Ø ÙÒ Ñ ÒÓ u s ÔÓÖ Ø ÒØÓ¸ Ð Ö Ó Ö × Ù Ð v → u Ö ÒØ Þ ÕÙ Ø Ñ Ò Ü ×Ø ÙÒ Ñ ÒÓ × v sº Ð Ñ ×ÑÓ ÑÓ Ó¸ ÔÓÖ Ð ÔÓØ × × Ò Ù Ø Ú ÒÓ Ý Ñ ÒÓ s t Ý Ð Ò ÙÖ Ð Ö Ó v → u ÒÓ ÐØ Ö ×Ø ¬ÖÑ ÓÒº ¾º v Ý Ù Ø ÚÓ Ò ÙÒ ÐÓ ÒØ Ö ÓÖ ×Ø ×Ó Ó ÙÖÖ Ù Ò Ó v × × Ah Ý ÒÓ Ý Ò Ò ÙÒ Ö Ó Ð Ð º Ë Ò Ö Ñ ÒØ Ð Ú ÐÓÖ h(v) Ý v Ö Ö × Ah × Ò ÐØ Ö Ö Ð ØÓÔÓÐÓ Ð Ö Ö× ÙÐ Ä ÔÖÓÔÓ× ÓÒ × ÓØ Ð Ô Ö Ó× ×Ó× Ô ÖØ ÙÐ Ö × Ù ÓÒ ÑÓ×ØÖ Ó× Ò Ð ÑÐ ¬ ÙÖ × º ´Ô º µ¸ º ´Ô º µ Ý º ¼ ´Ô º ¿µº ÓÖ Ø Ò ÑÓ× ØÓ × Ð × ÖÖ Ñ ÒØ × Ò × Ö × Ô Ö Ú Ö ¬ Ö Ð ÓÖÖ Ø ØÙ Ð Ð Ó¹ Ö ØÑÓ º º Proposici´n 7.14 (Sedgewick 2002 [33]) o Ð Ð ÓÖ ØÑÓ º Ð ÙÐ Ð ­Ù Ó Ñ Ü ÑÓ ÙÒ Ö º Demostraci´n o Ð ÔÖ Ñ Ö ×ÙÒØÓ ÓÑÔÖÓ Ö × ÕÙ Ð Ð ÓÖ ØÑÓ ÙÐÑ Ò Ó × ¸ Ú Ö ¹ ¬ Ö ÕÙ ÙÒ Ú Þ ÕÙ × ÒØÖ Ð Ð ÞÓ ´ ÒרÖÙ ÓÒ µ ר Ø ÖÑ Ò º Ä Ø ÖÑ Ò ÓÒ Ó ÙÖÖ Ù Ò Ó Ah Ú Ò Ú Óº Æ × Ø ÑÓ׸ ÒØÓÒ ×¸ Ñ Ö Ö Ð Ñ Ò Ö Ò ÕÙ Ah Ö Ý Ö Ý × ÙÖ ÖÒÓ× ÕÙ Ð Ð ÞÓ ÔÖÓ Ö × × Ö¸ ÕÙ ÒÓ Ò ÙÒ ÐÓ Ò¬Ò ØÓº Ah Ö ÔÓÖ Ó× Ö ÞÓÒ ×º Ä ÔÖ Ñ Ö × ÔÓÖ ÑÔÙ ÔÖ ¹­Ù Ó ÔÓÖ ÙÒ Ö Ó u → v ´ ÒרÖÙ ÓÒ ´ µ µ¸ Ò ÙÝÓ ×Ó v Ú Ò Ø ÚÓº Ä × ÙÒ × ÔÓÖÕÙ ÒÓ × ÔÙ ÑÔÙ Ö ØÓ Ó Ð ­Ù Ó ÙÒ ÒÓ Ó Ø ÚÓ ´ ÒרÖÙ ÓÒ µ Ò ×Ø ×Ó¸ u Ö Ö × Ah ÓÒ ÙÒ Ú ÐÓÖ h(u) Ò Ö Ñ ÒØ Óº Ah ×ÓÐÓ Ö Ò Ð ÒרÖÙ ÓÒ º ÈÓÖ Ø ÒØÓ¸ Ð Ø ÖÑ Ò ÓÒ Ð Ð ÓÖ ØÑÓ Ô Ò ÕÙ Ð ÒØ Ò ÙÖ × Ah ר ÓØ º Ò ×Ø × ÒØ Ó¸ ÒÓ× × Ö ÑÙÝ ÙØ Ð Ð × Ù ÒØ Ð Ñ º Lema 7.7 ÙÖ ÒØ Ð Ù ÓÒ Ð Ð ÓÖ ØÑÓ Ò Ö Ó º ¸ ∀u ∈ V =⇒ h(u) < 2V º
  • 804.
    778 Cap´ ıtulo 7. Grafos Demostraci´n o Ë ÑÓ׸ × ÙÒ Ð ÔÖÓÔÓ× ÓÒ º½¾¸ ÕÙ h(u) × Ñ ÒÓÖ Ó Ù Ð ÕÙ Ð ÐÓÒ ØÙ Ð Ñ ÒÓ Ñ × ÓÖØÓ × u tº ÓÑÓ ØÖ Ø ÑÓ× ÓÒ ÙÒ Ö Ö × Ù Ð¸ ÔÓ ÑÓ× Ø Ò Ö ×Ø Ð Ó Ð Ö Ó× Ý ÔÙ Ö Ñ ÒÓ× ÕÙ Ô × Ò ÔÓÖ Ð Ù ÒØ º ÈÓÖ Ø ÒØÓ¸ Ð Ñ ÒÓ Ñ × Ð Ö Ó × ÙÒ ÒÓ Ó u t ÒÓ ÔÙ Ü Ö 2V Ö Ó׸ ÔÙ × × ÒÓ ÓÒØÖ Ö Ð ÔÖÓÔÓ× ÓÒ º½¾ ÓÒ Ð ÓÒÓ Ñ ÒØÓ ×Ø Ð Ñ ¸ ÔÓ ÑÓ× ¬ÖÑ Ö ÕÙ Ð ÒØ Ú × ÕÙ Ð ÒרÖÙ ÓÒ Ò ÒÓ Ó× Ah ר ÓØ º Ð Ñ ×ÑÓ ÑÓ Ó¸ Ô Ö ÕÙ Ð ÒרÖÙ ÓÒ ´µ Ò Ð ÒÓ Ó Ø ÚÓ v¸ Ð Ö Ó u v Ø Ò ÕÙ × Ö Ð Ð × Ö¸ h(u) = h(v)+1º ÁÒ Ô Ò ÒØ Ñ ÒØ Ð × ÓÑ Ò ÓÒ × ÕÙ × ×Ù Ò¸ Ð Ú ÐÓÖ h(u) ר ÓØ Ó¸ ÔÓÖ ÐÓ ÕÙ Ð Ñ Ü Ñ ÒØ Ú × ÕÙ × Ò ÙÒ ÒÓ Ó Ø ÚÓ v ÔÓÖ Ý Ò × ÙÒ ÒÓ Ó u Ø Ñ Ò ÐÓ ×Ø º ÈÙ ×ØÓ ÕÙ Ð Ð ÞÓ ÜØÖ ÒÓ Ó× Ø ÚÓ× Ah Ý Ð ÒØ Ò ÙÖ × Ah ר ÓØ ¸ ÓÒ ÐÙ ÑÓ× ÕÙ Ah Ú Ò Ú Ó¸ ÔÓÖ ÐÓ ÕÙ Ð Ð ÞÓ Ø ÖÑ Ò Ý ÓÒ Ð Ð Ð ÓÖ ØÑÓ ÍÒ Ú Þ ÕÙ Ah Ú Ò Ú Ó Ð Ö ÓÒØ Ò ÙÒ ­Ù Ó Ø Ð º Ò ×Ø ר Ó × ÑÓ׸ ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ º½¿¸ ÕÙ ÒÓ Ü ×Ø Ò Ò ÙÒ Ñ ÒÓ × Ð Ù ÒØ Ð ×ÙÑ ÖÓ¸ ÔÓÖ ÐÓ ÕÙ ÒÓ Ü ×Ø Ò Ò ÙÒ Ñ ÒÓ ÙÑ ÒØÓº ÓÒ× Ù ÒØ Ñ ÒØ ¸ × ÙÒ Ð ÔÖÓÔÓ× ÓÒ Ü º½¼ ´Ô Ò ¿µ¸ Ð ­Ù Ó × Ñ Ü ÑÓ Ð Ò Ð×× × ÑÔ ÒÓ Ð Ð ÓÖ ØÑÓ Ô Ò Ð Ñ Ò Ö Ò ÕÙ ÑÔÐ ÒØ Ð ÓÒ ÙÒØÓ ÒÓ Ó× Ø ÚÓ× Ahº È ÖÓ ÒØ × ÓÖ Ö ×Ø ÑÔÐ ÒØ ÓÒ¸ ÑÓ× × Ó Ö ÙÒ ÓÖÑ × Ò Ö ÐÓ× Ú ÐÓÖ × Ò Ð × ÐØÙÖ ÒÓ Óº 7.10.13.3 Valores iniciales de la funci´n de altura o ÀÝÚÖ ×ÑÒÖ× × Ò Ö Ú ÐÓÖ × Ò Ð × h(u) ÕÙ × Ø × Ò Ð ¬Ò ÓÒ Ý ¹ Ù ÓÒ Ð Ð ÓÖ ØÑÓ º º È ÖÓ Ð Ò Ð Þ ÓÒ ÔÙ × Ö × Ò Ð Ô Ö Ð × ÑÔ ÒÓº È Ö Ò Ö ×ØÓ¸ ÓÒ× Ö ÑÓ× Ð × Ù ÒØ Ò Ð Þ ÓÒ V u=s h(u) = 0 u=s ÙÒÕÙ ×Ø ÓÒ¬ ÙÖ ÓÒ × Ú Ð ¸ ר Ø Ò Ù× Ö ÜØÖ ÓÒ × Ú Ò × × Ö Ü¹ ØÖ ÓÒ × ÒÓ Ó× × Ò Ö Ó× Ð Ð ×º ÄÙ Ó V Ø Ö ÓÒ ×¸ ÙÒÓ ÐÓ× ÒÓ Ó× Ý ÒØ × Ð Ù ÒØ Ð ÒÞ Ð Ú ÐÓÖ V + 1 Ý Ú Ò Ð Ð º Ù Ð × Ð Ñ ÓÖ ÓÒ¬ ÙÖ ÓÒ × ÙÒ ÔÖ ÙÒØ ÕÙ Ô Ú Ö× × ÒÚ ×Ø ÓÒ × ÕÙ ÓÒ× Ö Ò¸ ÒØÖ ÓØÖ × Ó× ×¸ Ð ØÓÔÓÐÓ Ð Ö Ó¸ Ð Ø ÔÓ Ö ÕÙ ÑÓ Ð Þ ¸ ×Ù× ÔÙÒØÓ× ÓÖØ ¸ Ø Ø Ö ¸ ÕÙ ÒÓ ÓÖ Ö ÑÓ× Ò ×Ø Ø ÜØÓº ÓÖ Ò¸ Ð Ð ÓÖ ØÑÓ ÑÓÒ ×¹Ã ÖÔ ÒÓ× ÔÖÓÔÓÖ ÓÒÓ Ð Ñ Ò Ö Ò Ö Ñ × ÓÖØ Ö × Ð Ù ÒØ Ð ×ÙÑ ÖÓ Ð Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ º Ò ÐÓ ÕÙ × Ù ¸ ÓÒ× Ö ÑÓ× ÓÑÓ Ú ÐÓÖ Ò Ð h(u) Ð ÐÓÒ ØÙ Ñ × ÓÖØ × u ר Ð ×ÙÑ ÖÓ¸ Ð Ù Ð ÔÙ Ð ÙÐ Ö× Ò O(E) Ñ ÒØ ÙÒ Ö Ó¹ ÖÖ Ó Ò ÑÔÐ ØÙ Ò Ó × Ð ×ÙÑ ÖÓ Ý Ö Ø Ñ ÒØ Ö Ð Þ Ð ÔÓÖ Ð ÖÙØ Ò breadth first traversal() ×ØÙ Ò Ü º º ´Ô Ò ½ µº ØÓ× Ð × ÑÔÐ Ý Ð ¬ Ò ¸ breadth first traversal() ×ÓÐÓ ÓÒ× Ö Ö Ö Ó× Ö × Ù Ð ×º È Ö ÐÐÓ¸ ¬Ò ÑÓ× Ð × Ù ÒØ Ö Ø Ö Ó Ñ Ö Ö Ó¿¼ ¿¼ Î × Ü º º½º½ ´Ô Ò ¼ µ Ý Ü º º ´Ô Ò ½ µ Ô Ö Ö Ö × Ö Ñ ÑÓÖ º
  • 805.
    7.10. Redes deflujo 779 ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ ¿ template <class N> class Res_Arc { bool operator () (typename N::Node *, typename N::Arc * a) const { return a->is_residual; } }; ÓÒ ×Ø × ÑÔÐ ¬ÐØÖÓ¸ Ð ÒÚÓ ÓÒ breadth first traversal() ×Ó Ö Ð Ö Ó Ö × Ù Ð Ò × Ð ×ÙÑ ÖÓ ÓÔ Ö ÓÑÓ × × ØÖ Ø × Ð Ö ÒÚ Ö× ´× Ò Ò × ÓÒרÖÙ ÖÐ µº Ë × Ò ÑÓ× h(t) = 0¸ ÒØÓÒ × Ð × Ù ÒØ ÙÒ ÓÒ Ú × Ø ×Ó Ö ÒÓ Ó × Ò Ð ÐÓÒ ØÙ Ð Ñ ÒÓ Ñ × ÓÖØÓ Ð ×ÙÑ ÖÓ ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ template <class Net> static bool initial_height(Net & net, typename Net::Node * p, typename Net::Arc * a) { node_height<Net>(p) = node_height<Net>(net.get_src_node(a)) + 1; return false; } Ë Ú × Ø ÑÓ× Ò ÑÔÐ ØÙ Ð ÒÓ Ó p ÔÖÓÚ Ò ÒÓ × Ð Ö Ó a¸ ÒØÓÒ × node height<Net>(net.get src node(a)) + 1 ´ÕÙ × ÓÖÖ ×ÔÓÒ ÓÒ h(p) + 1µ Ò ÕÙ Ý ÙÒ Ö Ó Ñ × × Ð ×ÙÑ ÖÓº Ð Ô ×Ó ¾ Ð Ð ÓÖ ØÑÓ Ò Ö Ó º × ÑÔÐ ÒØ Ð × Ù ÒØ ÑÓ Ó ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ template <class Net> static void init_height_in_nodes(Net & net) { breadth_first_traversal <Net, Res_Arc<Net> > (net, net.get_sink(), &initial_height); } ר ÑÓ Ó¸ Ð ÐÐ Ñ init height in nodes() × ÒÖ ÒÓ Ó ×Ù ×Ø Ò ×Ø Ð ×ÙÑ ÖÓº 7.10.13.4 Manejo del conjunto Ah Ð Ñ Ò Ó Ð ÓÒ ÙÒØÓ Ah Ò Ô Ö Ø Ñ ÒØ ÓÒ ÐÓ× Ö Ø Ö Ó× Ð ÔÖÓ Ð Ñ ÙÒ Ñ Ò¹ Ø Ðº × ÕÙ Ò ÔÖ Ñ Ö Òר Ò ÔÙ Ö ÑÓ× ÑÔÐ Ö Ù ÐÕÙ Ö ×ØÖÙ ØÙÖ ØÓ× ÒØÖ Ð × Ú Ö× × ×ØÙ ×º Ë Ò Ñ Ö Ó¸ Ð ÓÒÓ Ñ ÒØÓ ×Ó Ö Ð Ö Ø Ö Ó Ð Ð Ö Ó ÒÓ× Ó Ö Ñ Ò Ö × ÑÔÐ Ö ÙÒ ×ØÖÙ ØÙÖ ØÓ× ÕÙ ¸ Ù Ò Ó ÜØÖ ÙÒ ÒÓ Ó Ah ÒÓ× Ó Ö Þ ÙÒ Ö Ò ÔÖÓ Ð ÕÙ ×Ø ÓÒØ Ò Ö Ó× Ð Ð ×º Ò ×Ø × ÒØ Ó¸ Ð × ÑÔÐ ÒØ ÓÒ × ÔÖ Ö × ×ÓÒ Ð × ÓÖ ÒØ × Ð ­Ù Ó Ò Ô ÖØ ÙÐ Ö¸ ÓÐ × Á Ç Ý ÔÖ ÓÖ º ØÓ× Ó Ø Ò Ö ÙÒ ÑÔÐ ÒØ ÓÒ Ò Ö ¸ ÑÔÐ ÑÓ× Ð × × Ù ÒØ × ÖÙØ Ò × Ô Ö Ò× ÖØ Ö Ý Ð Ñ Ò Ö Ð ÓÒ ÙÒØÓ Ah ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ ¼ template <class Q_Type> static void put_in_active_queue(Q_Type & q, typename Q_Type::Item_Type & p) { if (p->control_bits.get_bit(Aleph::Maximum_Flow))
  • 806.
    780 Cap´ ıtulo 7. Grafos return; p->control_bits.set_bit(Aleph::Maximum_Flow, true); q.put(p); } template <class Q_Type> static typename Q_Type::Item_Type get_from_active_queue(Q_Type & q) { typename Q_Type::Item_Type p = q.get(); p->control_bits.set_bit(Aleph::Maximum_Flow, false); return p; } put in active queue() Ò× ÖØ Ð Ð Ñ ÒØÓ p Ò ÙÒ ÓÐ q Ø ÔÓ Ò Ö Ó Q Type¸ Ñ ÒØÖ × ÕÙ get from active queue ÜØÖ ÙÒ Ð Ñ ÒØÓ× Ð ÓÐ qº È Ö Ø Ø Ö ¬ ÒØ Ñ ÒØ Ý Ú Ø Ö Ò× Ö ÓÒ × ÙÔР׸ Ñ Ö ÑÓ× Ð Ø ÓÒØÖÓÐ Maximum Flow Ù Ò Ó ÙÒ ÒÓ Ó ×Ø ÒØÖÓ Q Typeº Ù Ò Ó ÐÙ Ó ÑÔÙ Ö Ð ÔÖ ¹­Ù Ó ÙÒ ÒÓ Ó u ר ÙÒ Ô ÖÑ Ò Ø ÚÓ¸ Ð Ö Ö × Ah ÓÒ ÙÒ Ú ÐÓÖ Ò Ö Ñ ÒØ Ó h(u)º ÍÒ Ù ×Ø ÓÒ ÒØ Ö × × Ù Ò ÔÖÓ Ð × ÕÙ ÓÒ Ð Ú ÐÓÖ Ò Ö Ñ ÒØ Ó h(u) u ÓÒØ Ò Ö Ó× Ð Ð × 7.10.13.5 Implantaci´n del algoritmo gen´rico o e Ð Ù Ð ÕÙ ÓÒ ÐÓ× Ð ÓÖ ØÑÓ× × Ó× Ò Ù×ÕÙ Ñ ÒÓ× ÙÑ ÒØÓ¸ ÐÓ× ÔÖ ¹ ­Ù Ó Ø Ñ Ò Ò ÐÓ Ö× Ò ÙÒÓ Ò Ö Ó¿½ ¼ ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ template <class Net, class Q_Type> typename Net::Flow_Type generic_preflow_vertex_push_maximum_flow(Net & net, const bool & leave_residual = false) { net.make_residual_net(); net.reset_counter_nodes(); init_height_in_nodes(net); typename Net::Node * source = net.get_source(); typename Net::Node * sink = net.get_sink(); Q_Type q; // instancia el conjunto de nodos activos ÈÖ ¹­Ù Ó Ò Ð Ö Ó× Ð ÒÓ Ó Ù ÒØ ½ while (not q.is_empty()) // mientras haya nodos activos { typename Net::Node * src = get_from_active_queue(q); typename Net::Flow_Type excess = src->in_flow - src->out_flow; for (Node_Arc_Iterator<Net, Res_F<Net> > it(src); it.has_current() and excess > 0; it.next()) { typename Net::Arc * arc = it.get_current_arc(); typename Net::Node * tgt = net.get_tgt_node(arc); if (node_height<Net>(src) != node_height<Net>(tgt) + 1) // ¿elegible? continue; // no ==> avance al siguiente arco ÑÔÙ Ö ÔÖ ¹­Ù Ó ÔÓÖ Ö Ó ØÙ Ð ½ } ¿½ Ë ÓÑ Ø ¸ ÔÓÖ × ÑÔÐ ¸Ð Ö ÓÒ ÐÓ× ×ÙÔÖ Ù ÒØ Ý ×ÙÑ ÖÓº
  • 807.
    7.10. Redes deflujo 781 if (excess > 0) // ¿src a´n sigue activo? u { // s´ ==> incremente h(src) y re-inserte en q ı node_height<Net>(src)++; put_in_active_queue(q, src); } } const typename Net::Flow_Type ret_val = source->out_flow; if (not leave_residual) net.unmake_residual_net(); return ret_val; } Í× × Node Arc Iterator º Ä ×ØÖÙ ØÙÖ × × ÒØ ¹Ý × Ð ÙÒ × Ô Ö×Ô Ø Ú × Ñ × ÓÑÔÖ Ò× Ð ¹ Ð ÜÔÖ ¹ × Ò Ö Ñ Ø Ñ Ø Ò Ü º ´Ô Ò µº Ä ÒרÖÙ ÓÒ ½ × ÓÖÖ ×ÔÓÒ ÓÒ Ð ÒÚÓ ÓÒ Ð Ñ ØÓ Ó net.make residual net()¸ Ñ ÒØÖ × ÕÙ Ð ¾ × ÓÖÖ ×ÔÓÒ ÓÒ Ð ÐÐ Ñ Ð ÖÙØ Ò init height in nodes(net)º Ð ÑÔÙ ÔÖ ¹­Ù Ó Ò Ð ÔÓÖ ÐÓ× Ö Ó× Ñ Ò ÒØ × Ð Ù ÒØ ´ ÒרÖÙ ÓÒ µ × Ö ÐÞ × ½ ÈÖ ¹­Ù Ó Ò Ð Ö Ó× Ð ÒÓ Ó Ù ÒØ ½ ≡ ´ ¼µ for (Node_Arc_Iterator<Net, Res_F<Net> > it(source); it.has_current(); it.next()) { typename Net::Arc * arc = it.get_current_arc(); typename Net::Node * tgt = net.get_tgt_node(arc); arc->flow = tgt->in_flow = arc->cap - arc->flow; // inunde arco actual arc->img_arc->flow = 0; if (tgt != sink) put_in_active_queue(q, tgt); // tgt deviene activo } source->out_flow = source->out_cap; Í× × Node Arc Iterator º Ç × ÖÚ Ò Ó Ð ÓÒ ÓÒ ÓÒ× ÖÚ ÓÒ Ð ­Ù Ó¸ × Ø ÒØ ÓÖ Ô Ö ÐÓ× ÔÖÓ Ö Ñ ÓÖ × ÒÓÚ Ð × ÑÔÙ Ö Ð Ô Ñ Ò Ñ ÒØÖ Ð ØÓØ Ð × Ð Ð Ù ÒØ Ý Ð ØÓØ Ð ÒØÖ Ð ×ÙÑ ÖÓº × ÑÓ Ó ÔÓ Ö Ò ×Ñ ÒÙ Ö× Ð × Ø Ö ÓÒ ×º È ÖÓ ×ØÓ ÒÓ Ò × Ö Ñ ÒØ ÙÒ ÓÒ ÔÓÖÕÙ ÔÓ Ö Ó ÙÖÖ Ö ÕÙ Ð ÙÒÓ× ÐÓ× ÒÓ Ó× Ý ÒØ × Ð Ù ÒØ ÒÓ Ú Ò × Ø ÚÓ ÐÓ ÕÙ ÔÓ× Ð Ø Ö ÕÙ Ð Ð ÓÖ ØÑÓ Ñ × ÐÓ Ú × º Ð ÔÖ Ñ Ö ÑÔÙ × Ö ×Ù Ñ Ü Ñ Ô º Ð ÑÔÙ ÔÖ ¹­Ù Ó ÔÓÖ Ð Ö Ó × ÐÑ ÒØ ÓÑÔÖ Ò× Ð × × ÒØ Ò Ð Ñ Ò Ó Ð Ö Ö × Ù Ð¿¾ ½ ÑÔÙ Ö ÔÖ ¹­Ù Ó ÔÓÖ Ö Ó ØÙ Ð ½ ≡ ´ ¼µ const typename Net::Flow_Type flow_avail_in_arc = arc->cap - arc->flow; typename Net::Flow_Type flow_to_push = Aleph::min(flow_avail_in_arc, excess); arc->flow += flow_to_push; arc->img_arc->flow -= flow_to_push; if (arc->is_residual) { net.decrease_out_flow(tgt, flow_to_push); net.decrease_in_flow(src, flow_to_push); ¿¾ Î × Ø Ñ Ò Ð Ñ ØÓ Ó increase flow() Ò Ü º½¼º½¼ ´Ô Ò ¾µº
  • 808.
    782 Cap´ ıtulo 7. Grafos } else { net.increase_out_flow(src, flow_to_push); net.increase_in_flow(tgt, flow_to_push); } excess -= flow_to_push; if (is_node_active<Net>(tgt) and tgt != sink and tgt != source) put_in_active_queue(q, tgt); 7.10.13.6 An´lisis del algoritmo de pre-flujo a Ð Ò Ð×× × ÒØÖ Ò Ð × ¬ Ö Ý ÓØ ÒØ ÓÔ Ö ÓÒ × ÕÙ Ó ÙÖÖ Ò ÒØÖÓ Ð while (not q.is empty()) ¹ ÒרÖÙ ÓÒ Ò Ð ÓÖ ØÑÓ Ò Ö Ó¹º Ð Ö ×Ô ØÓ¸ Ð × ¬ÕÙ ¹ ÑÓ× Ð × ÓÔ Ö ÓÒ × Ò ½º ÑÔÙ × ØÙÖ ÒØ Ð Ù ÓÒ Ð ÐÓÕÙ ÑÔÙ Ö ÔÖ ¹­Ù Ó ÔÓÖ Ö Ó ØÙ Ð ½ ¹ ÒרÖÙ ÓÒ ´ µ Ò Ð Ð ÓÖ ØÑÓ Ò Ö Ó¹ ÕÙ ÐÓ Ö ÐÐ Ò Ö Ð Ö Ó ×Ù ÔÐ Ò ¹ Ô º ÍÒ ÑÔÙ × ØÙÖ ÒØ ÑÔÐ Ð Ò ÙÖ ÙÒ ÒÓ Ó Ð ÓÒ ÙÒØÓ Ah Ý Ð ¹ × Ô Ö ÓÒ Ð Ö Ó Ò Ð Ö Ö × Ù Ðº ¾º ÑÔÙ ÒÓ × ØÙÖ ÒØ ÙÒ Ù ÓÒ Ð ÐÓÕÙ ÑÔÙ Ö ÔÖ ¹­Ù Ó ÔÓÖ Ö Ó ¹ ØÙ Ð ½ ÕÙ ÒÓ ÐÓ Ö ÐÐ Ò Ö Ð Ö Ó ×Ù ÔÐ Ò Ô º ¿º ÁÒ Ö Ñ ÒØÓ Ó Ö ¹ Ø ÕÙ Ø Ó Ù ÓÒ Ð if (excess > 0) ¹ ÒרÖÙ ÓÒ Ò Ð Ð ÓÖ ØÑÓ Ò Ö Ó¹º Ä ÒØ Ò Ö Ñ ÒØÓ× × ÐÓ Ñ × Ð ÓÒØ Ð Þ Ö¸ × ÙÒ ÐÓ ÑÙ ×ØÖ Ð Ð Ñ × Ù ÒØ º Lema 7.8 (Cantidad de incrementos) Ë ÙÒ Ö N =< V, E, s, t, C > ÓÒ Ö Ö × ¹ Ù Ð N =< V, E , s, t, C >º ÒØÓÒ × Ð ÒØ Ò Ö Ñ ÒØÓ× ÕÙ Ó ÙÖÖ Ò Ð Ð ÓÖ ØÑÓ º × ÐÓ ×ÙÑÓ 2V 2º Demostraci´n ÄÓ× Ò Ö Ñ ÒØÓ× Ó ÙÖÖ Ò ×Ó Ö V − 2 ÒÓ Ó× o Ð Ö ¸ ÔÙ × Ð Ù ÒØ Ý Ð ×ÙÑ ÖÓ ÒÙÒ ×ÓÒ Ø ÚÓ׺ ÒÓ Ó × Ò Ö Ñ ÒØ Ò ÙÒÓ ×Ø ÙÒ Ñ Ü ÑÓ 2V − 1¸ × ÙÒ Ð Ð Ñ º º ÈÓÖ Ø ÒØÓ¸ Ð ÒØ Ò Ö Ñ ÒØÓ× × (V − 1) × (2V − 1) < 2V 2 ÓÖ ÓÒØ Ð Þ ÑÓ× Ð ÒØ ÑÔÙ × × ØÙÖ ÒØ ׺ Lema 7.9 (Cantidad de empujes saturantes) Ë ÙÒ Ö N =< V, E, s, t, C > ÓÒ Ö Ö × Ù Ð N =< V, E , s, t, C >º ÒØÓÒ × Ð ÒØ ÑÔÙ × × ØÙÖ ÒØ × × Ñ ÒÓÖ ÕÙ 2VEº Demostraci´n o ËÙÔÓÒ ÑÓ× Ó× ÒÓ Ó× Ù Ð ×ÕÙ Ö u Ý v ÐÓ× Ù Ð × × ÑÓ× ÓÒ¹ Ø Ð Þ Ö Ð ÒØ ÑÔÙ × × ØÙÖ ÒØ ׺ È Ö ÕÙ Ó ÙÖÖ Ø Ò ÑÔÙ ¸ Ü ×Ø Ö Ò Ð Ö Ö × Ù Ð Ó ÙÒ Ö Ó u → v Ó ÙÒÓ v → uº ËÙÔÓÒ ÑÓ× ÕÙ Ó ÙÖÖ ÙÒ ÑÔÙ × ØÙÖ ÒØ Ò Ð Ö Ó u → vº ×ØÓ ÑÔÐ ÕÙ h(u) = h(v) + 1º × Ò Ð ÒÓØ Ö ÕÙ Ô Ö ÕÙ Ó ÙÖÖ ÓØÖÓ ÑÔÙ × ØÙÖ ÒØ Ò u → v
  • 809.
    7.10. Redes deflujo 783 ÔÖ Ñ ÖÓ Ó ÙÖÖ Ö ÙÒ ÑÔÙ Ò v → u¸ ÔÙ × Ô Ö ÕÙ u → v Ú Ò Ð Ð ÙÑÔÐ Ö× ÒÙ ÚÓ ÕÙ h(u) = h(v) + 1º h(v) Ò Ö Ñ ÒØ Ö× Ò Ð Ñ ÒÓ× 2 ÙÒ ×º Ë ÑÓ׸ ÔÓÖ Ð Ð Ñ º ¸ ÕÙ ∀x ∈ V =⇒ h(x) < 2V º ÈÓÖ Ø ÒØÓ¸ Ð ÒØ Ú × ÕÙ ÙÒ ÒÓ Ó ÔÙ Ò Ö Ñ ÒØ Ö× × Ñ ÒÓÖ ÕÙ 2V º À ݸ Ô٠׸ ÐÓ ×ÙÑÓ 2V ÑÔÙ × × ØÙÖ ÒØ × Ò u → vº ÅÙÐØ ÔÐ Ò Ó ÔÓÖ Ð ÒØ Ö Ó× Ø Ò ÑÓ× ÙÒ ØÓØ Ð Ñ Ü ÑÓ 2VE ÑÔÙ × × ØÙÖ ÒØ ׺ ÆÓ× Ö ×Ø ÓÒØ Ð Þ Ö Ð ÒØ ÑÔÙ × ÒÓ¹× ØÙÖ ÒØ ׸ Ð Ù Ð × ×Ø Ð ÔÓÖ Ð × Ù ÒØ Ð Ñ º Lema 7.10 Ë ÙÒ Ö N =< V, E, s, t, C > ÓÒ Ö Ö × Ù Ð N =< V, E , s, t, C >º ÒØÓÒ × Ð ÒØ ÑÔÙ × × ØÙÖ ÒØ × × Ñ ÒÓÖ ÕÙ 4V 2(V + E)º Demostraci´n o ¬Ò ÑÓ× Ð × Ù ÒØ ÙÒ ÓÒ ÔÓØ Ò Ð ×Ó Ö Ð ÓÒ ÙÒØÓ Ah Φ(Ah) = h(u) ´ º¿ µ u∈Ah À Ý Ó× Ñ Ò Ö × Ò ÕÙ ÔÙ Ò Ö Ñ ÒØ Ö× Ð Ú ÐÓÖ Φ(Ah) ½º ÍÒ ÑÔÙ × ØÙÖ ÒØ Ò ×Ø ÓÔ Ö ÓÒ × Ò ÙÒ ÒÙ ÚÓ ÒÓ Ó Ah¸ Ô ÖÓ ÒÓ × ÙÑ ÒØ Ò Ò ÙÒ Ú ÐÓÖ h(u) Ô Ö Ù ÐÕÙ Ö ÒÓ Ó uº ÈÓÖ Ð Ð Ñ º × ÑÓ× ÕÙ h(u) < 2V Ô Ö Ù ÐÕÙ Ö uº ÍÒ ÑÔÙ × ØÙÖ ÒØ ÙÑ ÒØ Φ(Ah) Ò ÐÓ ×ÙÑÓ 2V º ÈÙ ×ØÓ ÕÙ Ð ÒØ ÑÔÙ × × ØÙÖ ÒØ × ×Ø ÓØ ÔÓÖ 2VE ´Ð Ñ º µ¸ Ð Ò Ö Ñ ÒØÓ ÐÓ× ÑÔÙ × × ØÙÖ ÒØ × ×Ó Ö Φ(Ah) ר ÓØ Ó ÔÓÖ 2V × 2VE = 4V 2Eº ¾º ÍÒ Ò Ö Ñ ÒØÓ Ò Ö Ñ ÒØÓ ÙÒ ÒÓ Ó u ÙÑ ÒØ Φ(Ah) Ò ÙÒÓº Ä Ò Ò ÙÒ ÒÓ Ó Ù ÐÕÙ Ö u ×Ó Ö Φ(Ah) ׸ ÔÓÖ Ð Ð Ñ º ¸ Ñ ÒÓÖ ÕÙ 2V º ÈÓÖ Ð Ð Ñ º × ÑÓ× ÕÙ Ð ÒØ Ñ ÜÑ Ò Ö Ñ ÒØÓ× × Ñ ÒÓÖ ÕÙ 2V 2º ÈÓÖ Ø ÒØÓ¸ Ð Ò Ò ÐÓ× Ò Ö Ñ ÒØÓ× ×Ó Ö Φ(Ah) × Ñ ÒÓÖ ÕÙ 2V 2 × 2V = 4V 2V º ÉÙ Ö ÐÓ× ÑÔÙ × ÒÓ¹× ØÙÖ ÒØ × ËÙÔÓÒ ÑÓ× ÕÙ Ó ÙÖÖ ÙÒ ÑÔÙ ÒÓ¹ × ØÙÖ ÒØ ×Ó Ö ÙÒ Ö Ó u → vº Ò ×Ø ÑÓÑ ÒØÓ u Ú Ò Ò Ø ÚÓ Ý v ÔÖÓ Ð Ñ ÒØ Ø ÚÓº × Ô٠׸ Φ(Ah) = Φ(Ah) − h(u) + h(v)¸ Ô ÖÓ¸ ÔÙ ×ØÓ ÕÙ h(u) = h(v) + 1¸ ÒØÓÒ × Φ(Ah) = Φ(Ah) − h(v) − 1 + h(v) = Φ(Ah) − 1º Ç × ¸ Φ(Ah) Ö Ð Ñ ÒÓ× Ò ÙÒ ÙÒ º À Ò Ó ÓÒ ÐÙ Ó ÕÙ ÐÓ× ÑÔÙ × ÒÓ¹× ØÙÖ ÒØ × ÒÓ Ò Ö Ñ ÒØ Ò Ð Ú ÐÓÖ Φ(Ah)¸ ÓØ Ö Ð ÙÒ ÓÒ ÔÓØ Ò × ×Ø Ö Ó ÔÓÖ Φ(Ah) < 4V 2E + 4V 2V = 4V 2(V + E) ÁÒ Ö Ñ ÒØÓ× ÑÔÙ × × ØÙÖ ÒØ × ÓÖ Ø Ò ÑÓ× ØÓ × Ð × ÖÖ Ñ ÒØ × Ò × Ö × Ô Ö ÓÒ ÐÙ Ö Ö Ð × ÑÔ ÒÓ Ð ÓÖ ØÑÓ Ò Ö Óº Proposici´n 7.15 Ë ÙÒ Ö N =< V, E, s, t, C > ÓÒ Ö Ö × Ù Ð N =< V, E , s, t, C >º o Ë Ah : V −→ N ÙÒ ÙÒ ÓÒ ÐØÙÖ º ÒØÓÒ × Ð ÒØ ÓÔ Ö ÓÒ × ÕÙ ÙØ Ð Ð ÓÖ ØÑÓ Ò Ö Ó º × O(V 2E)º
  • 810.
    784 Cap´ ıtulo 7. Grafos Demostraci´n o ÁÒÑ Ø ÐÓ× Ð Ñ × º ¸ º Ý º½¼ 7.10.13.7 Empuje de pre-flujo FIFO Ð ÓÖ Ò Ò ÕÙ × ÑÔÙ Ð ÔÖ ¹­Ù Ó ØÖ Ú × ÐÓ× ÒÓ Ó× ÔÙ Ò Ö ÒÓØ Ð Ñ ÒØ Ò Ð Ö Ò Ñ ÒØÓ ÙÒ Ð ÓÖ ØÑÓ ÔÖ ¹­Ù Óº Ë ØÖ Ø ÑÓ× ÕÙ Ð ÔÖ ¹­Ù Ó Ð Ò ÐÓ Ñ × Ö Ô Ñ ÒØ ÔÓ× Ð Ð ×ÙÑ ÖÓ¸ ÒØÓÒ × ÙÒ Ò ÓÕÙ ÕÙ ÜØÖ Ð ÓÐ ÐÓ× ÒÓ Ó× Ò ÔÖÓ ÙÒ ÔÖÓ Ð Ñ ÒØ Ø Ò ¸ ÙÖ ×Ø Ñ ÒØ Ð Ò Ó¸ Ñ × ÔÓ× Ð × ÖÖ Ö Ñ × Ö Ô Ó Ð ×ÙÑ ÖÓº Ò ×Ø × ÒØ Ó¸ ÙÒ Ñ Ò Ö ÑÙÐ Ö Ð ÔÖÓ × Ñ ÒØÓ Ò ÔÖÓ ÙÒ ÓÒ× ×Ø Ò Ò ÓÐ Ö Á Ç ÐÓ× ÒÓ Ó× Ø ÚÓ׺ ר Ò ÓÕÙ × Ö Ø Ñ ÒØ ÒרÖÙÑ ÒØ Ð Ô ÖØ Ö Ð Ð ÓÖ ØÑÓ Ò Ö Ó ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ ¼ template <class Net> typename Net::Flow_Type fifo_preflow_maximum_flow(Net & net, const bool & leave_residual = false) { return generic_preflow_vertex_push_maximum_flow <Net,DynListQueue<typename Net::Node*> >(net, leave_residual); } Í× × DynListQueue ½ ¼ º Ë ØÖ Ø Ð Ð ÓÖ ØÑÓ Ò Ö Ó ÓÒ Ô Ö Ñ ØÖÓ Ø ÔÓ Q Type Òר Ò Ó ÙÒ ÓÐ Ø ÔÓ DynListQueue<T> ×ØÙ Ó Ò Ü ¾º º ´Ô Ò ½ ¼µº 6 4/0 3 8/0 0 4/0 0 D E I K 4 0 3 0 2 0 1 0 6/6 3/3 4/0 5/0 3/0 4/0 3/0 4/0 0 7/7 7 6/0 0 4/0 0 5/0 0 A B F H M 4 21 3 0 2 0 1 0 0 0 5/5 5/0 3/0 5/0 7/0 6/0 4/0 6/0 5 0 0 5/0 0 C 4/0 G 6/0 J L 3 0 4 0 2 0 1 0 ÙÖ º × Ò Ð ÙÒ Ð ÓÖ ØÑÓ ÔÖ ¹­Ù Ó ×Ó Ö Ð Ö Ð ¬ ÙÖ º º Ò ×Ø ×Ó ØÓ Ó× ÐÓ× Ö Ó× × Ð ÒØ × Ð Ù ÒØ ×ÓÒ ÒÙÒ Ó× ´Ý ר Ò Ö × ÐØ Ó×µº Ä × ÐØÙÖ × ÒÓ Ó ×Ø Ò Ù × Ð ×ÙÖÓ ×Ø º ÍÒ Ù ÓÒ ÓÑÔÐ Ø ×Ø Ð ÓÖ ØÑÓ ×Ó Ö Ð Ö Ó Ð ¬ ÙÖ º × ÑÙ ×ØÖ Ò Ð ¬ ÙÖ º ´Ô ׺ ¹ µ¿¿ º ÆÓØ × ÕÙ Ð ×ÙÑ ÖÓ × Ð ÒÞ Ó Ò Ð Ó Ø Ú ¬ ÙÖ ÓÒ ÙÒ Ú ÐÓÖ ­Ù Ó 6º Ä ÙÖ ×Ø ÒØ ÒØ Ö ÓÖÖ Ö Ò ÔÖÓ ÙÒ ØÖ Ú × Ö Ó× Ð Ð ×¸ Ô ÖÓ ÒÓ × ØÖ Ø ÙÒ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ ØÖ ÓÒ Ðº ר Ö× Ð × ÒØ Ó ÙÖ ×Ø Ó¸ ÔÙ × ÒÐ Ð Ð ÐÓ× Ö Ó× Ò Ò ÐÓ× Ú ÐÓÖ × Ô × Ý Ð ÓÖ Ò Ò ÕÙ ×ØÓ× × ÔÖ × ÒØ Ò ÙÖ ÒØ Ð × Ø Ö ÓÒ ×º ר Ð ÓÖ ØÑÓ × O(V 3)º ÍÒ Ú ÑÓ×ØÖ ÓÒ ÓÒ× ×Ø Ò ¬Ò Ö ÓÑÓ ÙÒ ÓÒ , Ah = ∅ ÔÓØ Ò Ð Φ(Ah) = 0 Ý Ü Ñ Ò Ö Ð Ú ÐÓÖ Φ(Ah) × ÙÒ Ñ Ü{h(u) | u ∈ Ah} , Ah = ∅ ¿¿ ÙÒÕÙ × ÑÙ ×ØÖ Ò Ñ × ¬ ÙÖ ×¸ ÒÓ Ý Ñ × Ø Ö ÓÒ × ÕÙ ÓØÖÓ× Ò ÓÕÙ × × Ó× Ò Ñ ÒÓ× ÙÑ ÒØÓ¸ ÔÙ × Ð × ¬ ÙÖ × Ô Ö ÐÓ× Ð ÓÖ ØÑÓ× ÓÖ ¹ ÙÐ Ö×ÓÒ Ý ÑÓÒ ×¹Ã ÖÔ ÓÒØ Ò Ò ÐÓ× Ñ ÒÓ× ÙÑ ÒØÓ¸ ÔÓÖ ÐÓ× Ù Ð × Ý ÕÙ Ø Ö Öº
  • 811.
    7.10. Redes deflujo 785 ×× Ñ Ø × Ò Ð ÓÐ º Ä ÔÖ Ñ Ö × Ð Ð Ñ Ø Ð ÓÒ ÙÒØÓ ÒÓ Ó× Ø ÚÓ× Ù×ØÓ ×ÔÙ × [u1, u2, . . . um] ÙØ Ö ÈÖ ¹­Ù Ó Ò Ð Ö Ó× Ð ÒÓ Ó Ù ÒØ ½ º ÄÙ Ó¸ Ð × × × × Ù ÒØ × ×Ø Ò Ð Ñ Ø × ÔÓÖ Ð ÓÒ ÙÒØÓ ÒÓ Ó× Ø ÚÓ× ÐÙ Ó ÕÙ um × Ð Ð ÓÐ º Ð Ò Ð × × × Ö Ð Þ ×Ù × Ú Ñ ÒØ º 6 4/0 3 8/0 0 4/0 0 6 4/0 3 8/0 0 4/0 0 D E I K D E I K 4 0 3 0 2 0 1 0 4 0 3 0 2 0 1 0 6 3 4/0 5/0 3/0 4/0 3/0 4/0 6 3 4/0 5/0 3/0 4/0 3/0 4/0 0 7 6/0 0 4/0 0 5/0 0 0 7 6/0 3 4/0 0 5/0 0 A 7 B F H M A 7 B F H M 4 21 3 0 2 0 1 0 0 04 21 3 0 2 0 1 0 0 0 5 5/0 3/0 5/0 7/0 6/0 4/0 6/0 5 5/0 3 5/0 7/0 6/0 4/0 6/0 5 0 0 5/0 0 5 0 0 5/0 0 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 3 0 4 0 2 0 1 0 4 3 4 0 2 0 1 0 6 4/0 3 8/0 0 4/0 0 6 4/0 3 8/0 0 4/0 0 D E I K D E I K 4 0 3 0 2 0 1 0 4 0 3 3 2 0 1 0 5/3 6 3 4/0 5/0 3/0 4/0 3/0 4/0 6 3 4/0 3/0 4/0 3/0 4/0 3 0 7 9 4/0 0 5/0 0 0 7 12 4/0 0 5/0 0 A 7 B 6 F H M A 7 B 6 F H M 4 21 4 6 2 0 1 0 0 04 21 4 6 2 0 1 0 0 0 5 5/0 3 5/0 7/0 6/0 4/0 6/0 5 5/0 3 5/0 7/0 6/0 4/0 6/0 5 0 0 5/0 0 5 0 0 5/0 0 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 4 3 4 0 2 0 1 0 4 3 4 0 2 0 1 0 6 7 8/0 0 4/0 0 6 7 8/0 0 4/0 0 D 4 E I K D 4 E I K 5 4 3 3 2 0 1 0 5 4 3 3 2 0 1 0 5/3 5/3 6 3 4/0 3/0 4/0 3/0 4/0 6 3 4/0 3/0 4/0 3/0 4/0 3 3 0 7 12 4/0 0 5/0 0 0 7 12 4 5/0 0 A 7 B 6 F H M A 7 B 6 F 4 H M 4 21 4 6 2 0 1 0 0 04 21 5 6 3 10 1 0 0 0 5 5/0 3 5/0 7/0 6/0 4/0 6/0 5 5/0 3 5/0 7/0 6 4/0 6/0 5 0 0 5/0 0 5 0 0 5/0 6 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 4 3 4 0 2 0 1 0 5 3 4 0 2 0 1 0 8/4 8/4 6 7 4 4/0 0 4 7 4 4/0 0 D 4 E I K D 4 E I K 5 4 3 7 2 0 1 0 5 4 3 7 2 0 1 0 4 4 5/3 6/4 5/3 6 3 4/0 3/0 4/0 3/0 4/0 3 4/0 3/0 4/0 3/0 4/0 3 4 3 0 7 12 4 5/0 0 0 7 12 4 5/0 0 A 7 B 6 F 4 H M A 7 B 6 F 4 H M 4 21 5 6 3 10 1 0 0 04 19 5 6 3 10 1 0 0 0 5 5/0 3 5/0 7/0 6 4/0 6/0 5 5/0 3 5/0 7/0 6 4/0 6/0 5 0 0 5/0 6 5 0 0 5/0 6 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 5 3 4 0 2 0 1 0 5 3 4 0 2 0 1 0 ÙÖ º Ð ÓÖ ØÑÓ ÔÖ ¹­Ù Ó ÓÒ ÓÐ ×Ó Ö Ö Ð ¬ ÙÖ º º Ð ÒÓ Ó ÜØÖ Ó ÙÒØÓ ÓÒ ×Ù× Ö Ó× Ð Ð × ×ÓÒ Ö × ÐØ Ó׺ Ð ­Ù Ó ÒØÖ ÒØ × ÓÐÓ Ð ÒÓÖ ×Ø Ð ÒÓ Ó¸ Ð × Ð ÒØ Ð ×ÙÖ ×Ø Ý Ð Ú ÐÓÖ Ð ÐØÙÖ ×ÙÖÓ ×Ø º
  • 812.
    786 Cap´ ıtulo 7. Grafos 8/4 8/4 4 7 4 4/0 0 4 7 4 4/0 0 D 4 E I K D 4 E I K 5 4 3 7 2 0 1 0 5 4 3 7 2 0 1 0 4 4 6/4 5/3 6/4 5/3 3 4/0 3/0 4/0 3/0 4/0 3 4/0 3/0 4/0 3/0 4/0 4 3 4 3 5/4 0 7 12 4 5/0 6 0 7 12 4 10 A 7 B 6 F 4 H M A 7 B 6 F 4 H M 4 19 5 6 3 10 1 0 0 04 19 5 6 3 10 1 4 0 0 4 5 5/0 3 5/0 7/0 6 4/0 6 5 5/0 3 5/0 7/0 6 4/0 6 5 0 0 5/0 6 5 0 0 5/0 6 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 5 3 4 0 2 0 1 6 5 3 4 0 2 0 1 6 8/4 8/4 4 7 4 4/0 0 4 7 4 4/0 0 D 4 E I K D 4 E I K 5 4 3 7 2 0 1 0 5 4 3 7 2 0 1 0 4 4 6/4 5/3 6/4 5/3 3 4/0 3/0 4/0 3/0 4/0 3 4/0 3/0 4/0 3/0 4/0 4 3 4 3 5/4 5/4 0 7 12 4 10 0 7 12 4 10 A 7 B 6 F 4 H M A 7 B 6 F 4 H M 4 19 5 6 3 12 1 4 0 04 17 5 6 3 12 1 4 0 0 4 4 7/2 5/3 7/2 5 5/0 3 5/0 6 4/0 6 5/0 3 5/0 6 4/0 6 2 3 2 5 0 2 5/0 6 3 0 2 5/0 6 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 5 3 4 0 2 0 1 6 5 3 4 0 2 0 1 6 8/4 8/4 4 7 4 4/0 0 4 7 4 4 D 4 E I K D 4 E I 4 K 5 4 3 7 2 0 1 0 5 4 3 7 2 4 1 0 4 4 6/4 5/3 6/4 5/3 3 4/0 3/0 4/0 3/0 4/0 3 4/0 3/0 4/0 3/0 4/0 4 3 4 3 7/6 5/4 7/6 5/4 0 6 12 4 10 0 6 12 4 10 A B 6 F 4 H M A B 6 F 4 H M 4 16 5 6 3 12 1 4 0 04 16 5 6 3 12 1 4 0 0 6 4 6 4 5/3 7/2 5/3 7/2 5/0 3 5/0 6 4/0 6 5/0 3 5/0 6 4/0 6 3 2 3 2 3 0 2 5/0 6 3 0 2 5/0 6 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 5 3 4 0 2 0 1 6 5 3 4 0 2 0 1 6 8/4 8/4 4 7 4 4 4 7 4 4 D 4 E I 4 K D 4 E I 4 K 5 4 3 7 2 4 1 0 5 4 3 7 2 4 1 4 4 4 6/4 5/3 6/4 5/3 3 4/0 3/0 4/0 3/0 4/0 3 4/0 3/0 4/0 3/0 4 4 3 4 3 7/6 5/4 7/6 5/4 0 6 12 4 10 0 6 12 4 14 A B 6 F 4 H M A B 6 F 4 H M 4 16 5 6 3 12 1 4 0 04 16 5 6 3 12 1 4 0 0 6 4 6 4 5/3 7/2 5/3 7/2 5/0 3 5/0 6 4/0 6 5/0 3 5/0 6 4/0 6 3 2 3 2 5/2 5/2 3 0 2 8 3 0 2 8 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 5 3 4 0 2 2 1 6 5 3 4 0 2 2 2 6 2 2 8/4 8/4 4 7 4 4 4 7 4 4 D 4 E I 4 K D 4 E I 4 K 5 4 3 7 2 4 1 4 5 4 3 7 2 4 1 4 4 4 6/4 5/3 6/4 5/3 3 4/0 3/0 4/0 3/0 4 3 4/0 3/0 4/0 3/0 4 4 3 4 3 7/6 5/4 7/6 0 6 12 6 14 0 6 12 6 15 A B 6 F 4 H M A B 6 F 4 H 5 M 4 16 5 6 3 12 1 4 0 04 16 5 6 3 12 3 5 0 0 6 4 6 5/3 7/2 2 5/3 7/2 2 5/0 3 5/0 6 6 5/0 3 5/0 6 6 3 2 4/2 3 2 4/2 5/2 5/2 3 0 2 8 3 0 2 8 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 5 3 4 0 2 2 2 8 5 3 4 0 2 2 2 8 2 2
  • 813.
    7.10. Redes deflujo 787 8/4 8/3 4 7 5 4 4 7 4 4 D 4 E I 4 K D 4 E I 4 K 5 4 3 7 4 4 1 4 5 4 4 6 4 4 1 4 4 3 6/4 5/3 1 6/4 5/3 1 3 4/0 3/0 3/0 4 3 4/0 3/0 3/0 4 4 3 4/1 4 3 4/1 7/6 7/6 0 6 12 6 15 0 6 12 6 15 A B 6 F 4 H 5 M A B 6 F 4 H 5 M 4 16 5 6 3 12 3 6 0 04 16 5 6 3 12 3 6 0 0 6 6 5/3 7/2 2 5/3 7/2 2 5/0 3 5/0 6 6 5/0 3 5/0 6 6 3 2 4/2 3 2 4/2 5/2 5/2 3 0 2 8 3 0 2 8 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 5 3 4 0 2 2 2 8 5 3 4 0 2 2 2 8 2 2 8/3 8/3 4 7 4 4 4 7 4 4 D 4 E I 4 K D 4 E I 4 K 5 4 4 7 4 4 1 4 5 4 4 7 4 4 1 4 3 3 6/4 5/4 1 6/4 5/4 1 3 4/0 3/0 3/0 4 3 4/0 3/0 3/0 4 4 4 4/1 4 4 4/1 7/6 7/6 0 6 13 6 15 0 6 13 6 15 A B 6 F 4 H 5 M A B 6 F 4 H 5 M 4 16 5 6 3 12 3 6 0 04 16 5 6 3 13 3 6 0 0 6 6 5/3 7/2 2 5/3 7/3 2 5/0 3 5/0 6 6 5/0 3 5/0 6 6 3 2 4/2 3 3 4/2 5/2 5/2 3 0 2 8 3 0 3 8 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 5 3 4 0 2 2 2 8 5 3 4 0 3 2 2 8 2 2 8/3 8/3 4 7 4 4 4 7 4 4 D 4 E I 4 K D 4 E I 4 K 5 4 4 7 4 4 1 4 5 4 4 7 4 4 1 4 3 3 6/4 5/4 1 6/4 5/4 1 3 4/0 3/0 3/0 4 3 4/0 3/0 3/0 4 4 4 4/1 4 4 4/1 7/6 7/6 0 6 13 6 15 0 6 13 7 15 A B 6 F 4 H 5 M A B 6 F 4 H 5 M 4 16 5 6 3 13 3 6 0 04 16 5 6 3 13 4 6 0 0 6 6 5/3 7/3 2 5/3 7/3 3 5/0 3 5/0 6 6 5/0 3 5/0 6 6 3 3 4/2 3 3 4/3 5/3 5/3 3 0 3 9 3 0 3 9 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 5 3 4 0 3 3 4 8 5 3 4 0 3 3 4 9 3 3 8/3 8/3 4 7 4 4 4 7 4 4 D 4 E I 4 K D 4 E I 4 K 5 4 4 7 4 4 1 4 5 4 4 7 4 4 1 4 3 3 6/4 5/4 1 6/4 5/4 1 3 4/0 3/0 3/0 4 3 4/0 3/0 3/0 4 4 4 4/1 4 4 4/1 7/6 4/3 7/6 4/3 0 6 13 6 15 0 6 13 6 15 A B 6 F H 5 M A B 6 F H 5 M 4 16 5 6 4 12 4 6 0 04 16 5 6 4 13 4 6 0 0 6 3 6 3 5/3 7/3 3 5/3 7/4 3 5/0 3 5/0 6 6 5/0 3 5/0 6 6 3 3 4/3 3 4 4/3 5/3 5/3 3 0 3 9 3 0 4 9 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 5 3 4 0 3 3 4 9 5 3 4 0 5 3 4 9 3 3 8/3 8/3 4 7 4 4 4 7 4 4 D 4 E I 4 K D 4 E I 4 K 5 4 4 7 4 4 1 4 5 4 4 7 4 4 1 4 3 3 6/4 5/4 1 6/4 5/4 1 3 4/0 3/0 3/0 4 3 4/0 3/0 3/0 4 4 4 4/1 4 4 4/1 7/6 4/3 7/6 4/3 0 6 13 6 15 0 6 13 6 15 A B 6 F H 5 M A B 6 F H 5 M 4 16 5 6 4 13 4 6 0 04 16 5 6 4 13 4 6 0 0 6 3 6 3 5/3 7/4 3 5/3 7/4 3 5/0 3 5/0 6 6 5/0 3 5/0 6 6 3 4 4/3 3 4 4/3 1 5/3 1 1 5/3 3 1 4 9 4 1 4 9 C 4/0 G J L C G J L 5 3 6 0 5 4 4 9 5 3 6 1 5 4 4 9 6/1 3 4/1 6/1 3
  • 814.
    788 Cap´ ıtulo 7. Grafos 4 4/4 7 8/3 4 4/4 4 D E I K 5 4 4 7 4 4 1 4 6/4 3/3 4/0 5/4 3/0 4/1 3/0 4/4 0 7/6 6 6/6 13 4/3 6 5/5 15 A B F H M 4 15 5 6 4 13 4 6 0 0 5/2 5/0 3/3 5/0 7/4 6/6 4/3 6/6 3 1 4 5/3 9 C 4/1 G 6/1 J L 5 3 6 1 5 4 4 9 ÙÖ º ר Ó ¬Ò Ð Ù ÓÒ Ð ÓÖ ØÑÓ ÔÖ ¹­Ù Ó ×Ó Ö Ð ¬ ÙÖ º Ô Ö ÓÐ Á Ǻ 7.10.13.8 Empuje de pre-flujo con mayor distancia Ä × ÙÒ ÙÖ ×Ø Ñ × ÔÓÔÙÐ Ö¸ Ð Ù Ð ÑÔ Ö Ñ ÒØ Ö ×ÙÐØ Ñ ÓÖ ÕÙ Ð ÓÐ Á Ǹ ÓÒ× ×Ø Ò Ñ Ö Ö ÐÓ× ÒÓ Ó× Ø ÚÓ× Ò ÑÔÐ ØÙ º Ä ÒØÙ Ø Ú × ÑÔÙ Ö ØÓ Ó Ð ÔÖ ¹­Ù Ó ÔÓ× Ð ÒØ × Ú ÒÞ Ö ÙÒ Ò Ú Ð × Ö × ÐÓ× ÒÓ Ó× Ñ × ×Ø ÒØ × Ð ×ÙÑ ÖÓ ×Ø ÐÓ× Ñ × Ö ÒÓ׺ Ä ×ØÖÙ ØÙÖ ØÓ× ÕÙ ÒÓ× Ó Ö ×Ø × ÔÐ Ò × ÙÒ ÓÐ ÔÖ ÓÖ ÙÝ ÜØÖ ÓÒ Ö ØÓÖÒ Ð ÒÓ Ó Ø ÚÓ ÓÒ Ñ ÝÓÖ ÐØÙÖ Ó × ¸ × Ð ÔÖ ÓÖ Ð ÒÓ Ó Ø ÚÓ Ñ × Ö ÒÓ Ù ÒØ ¹Ó Ñ × Ð ÒÓ Ð ×ÙÑ ÖÓ × ÙÒ ÓÒÚ Ò Ú Ö¹º Ä ÓÐ ÔÖ ÓÖ ×Ø Ò ×ÔÓÒ Ð × Ó Ù ÐÕÙ Ö ÐÓ× Ø ÔÓ× ×Ó Ó× ÐÓ× Ô׺ Ò ÒÙ ×ØÖÓ ×Ó¸ ÑÔÐ Ö ÑÓ× Ð Ø ÔÓ DynBinHeap<Key>¸ Ð Ù Ð × Ð Ú Ö× ÓÒ ÒÑ Ð Ø ÔÓ BinHeap<Key> ×ØÙ Ó Ò Ü º º ´Ô Ò ¿½¾µº Ð Ö Ø Ö Ó ÓÑÔ Ö ÓÒ ÒØÖ ÐÓ× Ð Ñ ÒØÓ× Ð Ô × ¬Ò Ð × Ù ÒØ Ñ Ò Ö ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ template <class Net> struct Compare_Height { bool operator () (typename Net::Node * n1, typename Net::Node * n2) const { return node_height<Net>(n1) > node_height<Net>(n2); } }; Ä ÓÑÔ Ö ÓÒ ×Ø ÒÚ ÖØ ØÓ× Ö ÒØ Þ Ö ÕÙ × ÑÔÖ × ÜØÖ Ð ÒÓ Ó ÓÒ Ñ ÝÓÖ ÔÖ ÓÖ º ר Ð Ó Ð Ö Ø Ö Ó ÓÑÔ Ö ÓÒ¸ Ð Ö Ð Þ ÓÒ Ð ÑÔÙ ÓÒ Ð ÙÖ ×Ø ÔÓÖ ÑÔÐ ØÙ × Ö Ø ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ ¾ template <class Net> typename Net::Flow_Type heap_preflow_maximum_flow(Net & net, const bool & leave_residual = false) { return generic_preflow_vertex_push_maximum_flow <Net, DynBinHeap<typename Net::Node*, Compare_Height<Net> > > (net, leave_residual); } Ä Ù ÓÒ ÓÑÔÐ Ø ×Ø Ð ÓÖ ØÑÓ ×Ó Ö Ð Ö Ó Ð ¬ ÙÖ º × ÑÓ×ØÖ Ò Ð ¬ ÙÖ º ´Ô ׺ ¹ ¾µº Ð ÒÓ Ó ×ÙÑ ÖÓ × Ð ÒÞ Ò Ð ÓÒ Ú Ø Ö ÓÒ¸ ÓÒ ÙÒ Ú ÐÓÖ ­Ù Ó 4 ØÖ × Ø Ö ÓÒ × Ñ ÒÓ× ÕÙ ÓÒ Ð ÓÐ Á Ç Ý ÙÒ Ú ÐÓÖ ­Ù Ó Ñ ÒÓ׺
  • 815.
    7.10. Redes deflujo 789 Ò Ø ÖÑ ÒÓ× Ð ÙÖ ×Ø ÔÓ ÑÓ× Ö ÕÙ ÔÙ ×ØÓ ÕÙ × ØÖ Ø Ö Ò ÑÔÐ ØÙ ¸ × ÑÓÖ Ñ × Ò Ð ÒÞ Ö Ð ×ÙÑ ÖÓº Ä Ñ ×Ñ Ó × ÖÚ ÓÒ ÔÐ Ô Ö Ð Ú ÐÓÖ ­Ù Ó Ò Ö ÓÖ Ð ­Ù Ó ×Ø ÓÒ ÒØÖ Ó Ð Ù ÒØ ¸ Ñ ÒØÖ × ÕÙ ÓÒ Ð ÓÐ Á Ç ×Ø ×Ô Ö× Ó ØÖ Ú × ÐÓ× Ñ ÒÓ× ÕÙ Ð ×Ù ÖØ Ò ÔÖÓ ÙÒ Ý Ø ÖÑ Ò Óº × ÑÓ×ØÖ Ð ÕÙ ×Ø Ð ÓÖ ØÑÓ × ÙØ Ò O(V 3) Ô ×Ó׺ È Ö ÐÐÓ¸ × ¬Ò Ð Ñ ×Ñ ÙÒ ÓÒ ÔÓØ Ò Ð ÕÙ Ô Ö Ð ÓÐ Á Ǹ Ô ÖÓ × Ñ Ö Ð × Ù Ò ÓÒ ÕÙ ÐÓ× ÒÓ Ó× Ø ÚÓ× ×ÓÒ Ü Ñ Ò Ó׺ 6 4/0 3 8/0 0 4/0 0 6 7 8/0 0 4/0 0 D E I K D 4 E I K 4 0 3 0 2 0 1 0 5 4 3 0 2 0 1 0 6 3 4/0 5/0 3/0 4/0 3/0 4/0 6 3 4/0 5/0 3/0 4/0 3/0 4/0 0 7 6/0 0 4/0 0 5/0 0 0 7 6/0 0 4/0 0 5/0 0 A 7 B F H M A 7 B F H M 4 21 3 0 2 0 1 0 0 04 21 3 0 2 0 1 0 0 0 5 5/0 3/0 5/0 7/0 6/0 4/0 6/0 5 5/0 3/0 5/0 7/0 6/0 4/0 6/0 5 0 0 5/0 0 5 0 0 5/0 0 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 3 0 4 0 2 0 1 0 3 0 4 0 2 0 1 0 4 7 8/0 0 4/0 0 4 7 8/0 0 4/0 0 D 4 E I K D 4 E I K 5 4 3 0 2 0 1 0 5 4 3 0 2 0 1 0 6/4 6/4 3 4/0 5/0 3/0 4/0 3/0 4/0 3 4/0 5/0 3/0 4/0 3/0 4/0 4 4 0 7 6/0 0 4/0 0 5/0 0 0 7 6/0 3 4/0 0 5/0 0 A 7 B F H M A 7 B F H M 4 19 3 0 2 0 1 0 0 04 19 3 0 2 0 1 0 0 0 5 5/0 3/0 5/0 7/0 6/0 4/0 6/0 5 5/0 3 5/0 7/0 6/0 4/0 6/0 5 0 0 5/0 0 5 0 0 5/0 0 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 3 0 4 0 2 0 1 0 5 3 4 0 2 0 1 0 4 7 8/0 0 4/0 0 4 7 8/0 0 4/0 0 D 4 E I K D 4 E I K 5 4 3 0 2 0 1 0 5 4 3 0 2 0 1 0 6/4 6/4 3 4/0 5/0 3/0 4/0 3/0 4/0 3 4/0 5/0 3/0 4/0 3/0 4/0 4 4 0 7 6/0 3 4/0 0 5/0 0 0 7 9 4/0 0 5/0 0 A 7 B F H M A 7 B 6 F H M 4 17 3 0 2 0 1 0 0 04 17 5 6 2 0 1 0 0 0 5/3 5/3 5/0 3 5/0 7/0 6/0 4/0 6/0 5/0 3 5/0 7/0 6/0 4/0 6/0 3 3 3 0 0 5/0 0 3 0 0 5/0 0 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 5 3 4 0 2 0 1 0 5 3 4 0 2 0 1 0 8/2 4 7 8/0 0 4/0 0 4 7 2 4/0 0 D 4 E I K D 4 E I K 5 4 3 0 2 0 1 0 5 4 3 7 2 0 1 0 2 6/4 6/4 3 4/0 5/0 3/0 4/0 3/0 4/0 3 4/0 5 3/0 4/0 3/0 4/0 4 4 7/6 7/6 0 6 9 4/0 0 5/0 0 0 6 14 4/0 0 5/0 0 A B 6 F H M A B 6 F H M 4 16 5 6 2 0 1 0 0 04 16 5 6 2 0 1 0 0 0 6 6 5/3 5/3 5/0 3 5/0 7/0 6/0 4/0 6/0 5/0 3 5/0 7/0 6/0 4/0 6/0 3 3 3 0 0 5/0 0 3 0 0 5/0 0 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 5 3 4 0 2 0 1 0 5 3 4 0 2 0 1 0 ÙÖ º Ð ÓÖ ØÑÓ ÔÖ ¹­Ù Ó ÓÒ Ô ×Ó Ö Ð Ö Ð ¬ ÙÖ º º
  • 816.
    790 Cap´ ıtulo 7. Grafos 8/2 8/2 4 7 2 4/0 0 4 7 2 4/0 0 D 4 E I K D 4 E I K 5 4 3 7 2 0 1 0 5 4 3 7 2 0 1 0 2 2 6/4 6/4 3 4/0 5 3/0 4/0 3/0 4/0 3 4/0 5 3/0 4/0 3/0 4/0 4 4 7/6 7/6 0 6 14 4 5/0 0 0 6 14 4 5/0 0 A B 6 F 4 H M A B 6 F 4 H M 4 16 5 6 3 10 1 0 0 04 16 5 6 3 14 1 0 0 0 6 6 5/3 5/3 7/4 5/0 3 5/0 7/0 6 4/0 6/0 5/0 3 5/0 6 4/0 6/0 3 3 4 3 0 0 5/0 6 3 0 4 5/0 6 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 5 3 4 0 2 0 1 0 5 3 4 0 2 0 1 0 8/2 4/2 4 7 2 2 8/2 4/2 D 4 E I K 5 4 3 7 2 2 1 0 4 7 2 2 2 2 D 4 E I K 5 4 3 7 2 2 1 0 2 2 6/4 3 4/0 5 3/0 4/0 3/0 4/0 6/4 4 3 4/0 5 3/0 4/0 3/0 4/0 4 7/6 0 6 14 4 5/0 0 7/6 A B 6 F 4 H M 4 16 5 6 3 14 1 0 0 0 0 6 14 4 5/0 0 6 A B 6 F 4 H M 4 16 5 6 3 14 1 0 0 0 6 5/3 7/4 5/0 3 5/0 6 4/0 6/0 5/3 7/4 3 4 5/0 3 5/0 6 4/0 6/0 3 4 5/4 3 0 4 10 C 4/0 G 6/0 J L 5 3 4 0 2 4 1 0 3 0 4 5/0 6 4 C 4/0 G 6/0 J L 5 3 4 0 2 0 1 0 8/2 4/2 8/2 4/2 4 7 2 2 4 7 2 2 D 4 E I K D 4 E I K 5 4 3 7 2 2 1 0 5 4 3 7 2 2 1 0 2 2 2 2 6/4 6/4 3 4/0 5 3/0 4/0 3/0 4/0 3 4/0 5 3/0 4/0 3/0 4/0 4 4 7/6 7/6 0 6 14 4 5/0 6 0 6 14 8 5/0 6 A B 6 F 4 H M A B 6 F 4 H M 4 16 5 6 3 14 1 0 0 04 16 5 6 3 14 1 0 0 0 6 6 5/3 7/4 5/3 7/4 5/0 3 5/0 6 4/0 6 5/0 3 5/0 6 4 6 3 4 3 4 5/4 5/4 3 0 4 10 3 0 4 10 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 5 3 4 0 2 4 2 6 5 3 4 0 2 4 2 10 4 4 8/2 4/2 8/2 4/2 4 7 2 2 4 7 5 2 D 4 E I K D 4 E I K 5 4 3 7 2 2 1 0 5 4 3 7 2 2 1 0 2 2 2 2 6/4 6/4 3 3 4/0 5 3/0 4/0 3/0 4/0 3 4/0 5 3/0 3/0 4/0 4 4 4/3 7/6 7/6 0 6 14 8 11 0 6 14 8 11 A B 6 F 4 H 5 M A B 6 F 4 H 5 M 4 16 5 6 3 14 3 5 0 04 16 5 6 3 14 3 8 0 0 6 6 5/3 7/4 5/3 7/4 5/0 3 5/0 6 4 6 5/0 3 5/0 6 4 6 3 4 3 4 5/4 5/4 3 0 4 10 3 0 4 10 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 5 3 4 0 2 4 2 10 5 3 4 0 2 4 2 10 4 4 8/2 8/1 4 7 5 4 4 7 4 4 D 4 E I 4 K D 4 E I 4 K 5 4 3 7 4 4 1 0 5 4 5 6 4 4 1 0 2 1 6/4 3 6/4 3 3 4/0 5 3/0 3/0 4/0 3 4/0 5 3/0 3/0 4/0 4 4/3 4 4/3 7/6 7/6 0 6 14 8 11 0 6 14 8 11 A B 6 F 4 H 5 M A B 6 F 4 H 5 M 4 16 5 6 3 14 3 8 0 04 16 5 6 3 14 3 8 0 0 6 6 5/3 7/4 5/3 7/4 5/0 3 5/0 6 4 6 5/0 3 5/0 6 4 6 3 4 3 4 5/4 5/4 3 0 4 10 3 0 4 10 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 5 3 4 0 2 4 2 10 5 3 4 0 2 4 2 10 4 4
  • 817.
    7.10. Redes deflujo 791 8/2 8/2 4 7 5 4 4 7 4 4 D 4 E I 4 K D 4 E I 4 K 5 4 5 7 4 4 1 0 5 4 5 7 4 4 1 0 2 2 6/4 3 6/4 2 3 4/0 5 3/0 3/0 4/0 3 4/0 5 3/0 3/0 4/0 4 4/3 4 4/2 7/6 7/6 0 6 14 8 11 0 6 14 8 11 A B 6 F 4 H 5 M A B 6 F 4 H 5 M 4 16 5 6 3 14 3 8 0 04 16 5 6 3 14 3 7 0 0 6 6 5/3 7/4 5/3 7/4 5/0 3 5/0 6 4 6 5/0 3 5/0 6 4 6 3 4 3 4 5/4 5/4 3 0 4 10 3 0 4 10 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 5 3 4 0 2 4 2 10 5 3 4 0 2 4 2 10 4 4 8/2 8/2 4 7 4 4 4 7 4 4 D 4 E I 4 K D 4 E I 4 K 5 4 5 7 4 4 1 0 5 4 5 7 4 4 1 0 2 2 6/4 2 6/4 2 3 4/0 5 3/0 3/0 4/0 3 4/0 5 3/0 3/0 4/0 4 4/2 4 4/2 7/6 7/6 0 6 14 7 11 0 6 14 7 11 A B 6 F 4 H 5 M A B 6 F 4 H 5 M 4 16 5 6 3 14 3 7 0 04 16 5 6 3 14 3 7 0 0 6 6 5/3 7/4 3 5/3 7/4 3 5/0 3 5/0 6 6 5/0 3 5/0 6 6 3 4 4/3 3 4 4/3 5/4 5/3 3 0 4 10 3 0 4 9 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 5 3 4 0 2 4 3 9 5 3 4 0 4 3 3 9 4 3 8/2 8/2 4 7 4 4 4 7 4 4 D 4 E I 4 K D 4 E I 4 K 5 4 5 7 4 4 1 0 5 4 5 7 4 4 1 0 2 2 6/4 2 6/4 2 3 4/0 5 3/0 3/0 4/0 3 4/0 5 3/0 3/0 4/0 4 4/2 4 4/2 7/6 7/6 0 6 14 7 11 0 6 14 8 11 A B 6 F 4 H 5 M A B 6 F 4 H 5 M 4 16 5 6 3 14 3 7 0 04 16 5 6 3 14 4 7 0 0 6 6 5/3 7/4 3 5/3 7/4 5/0 3 5/0 6 6 5/0 3 5/0 6 4 6 3 4 4/3 3 4 5/4 5/4 3 0 4 10 3 0 4 10 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 5 3 4 0 4 4 4 9 5 3 4 0 4 4 4 10 4 4 8/2 8/2 4 7 4 4 4 7 4 4 D 4 E I 4 K D 4 E I 4 K 5 4 5 7 4 4 1 0 5 4 5 7 4 4 1 0 2 2 6/4 2 6/4 2 3 4/0 5 3/0 3/0 4/0 3 4/0 5 3/0 3/0 4/0 4 4/2 4 4/2 7/6 4/3 7/6 4/3 0 6 14 7 11 0 6 14 7 11 A B 6 F H 5 M A B 6 F H 5 M 4 16 5 6 5 13 4 7 0 04 16 5 6 5 14 4 7 0 0 6 3 6 3 5/3 7/4 5/3 1 7/4 5/0 3 5/0 6 4 6 5/0 3 6 4 6 3 4 3 5/1 4 5/4 5/4 3 0 4 10 3 1 4 10 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 5 3 4 0 4 4 4 10 5 3 6 0 4 4 4 10 4 4 8/2 8/2 4 7 4 4 4 7 4 4 D 4 E I 4 K D 4 E I 4 K 5 4 5 7 4 4 1 0 5 4 5 7 4 4 1 0 2 2 6/4 2 6/4 2 3 4/0 5 3/0 3/0 4/0 3 4/0 5 3/0 3/0 4/0 4 4/2 4 4/2 7/6 4/3 7/6 4/3 0 6 14 7 11 0 6 14 7 11 A B 6 F H 5 M A B 6 F H 5 M 4 16 5 6 5 14 4 7 0 04 15 5 6 5 14 4 7 0 0 6 3 6 3 5/3 1 7/4 5/2 1 7/4 5/0 3 6 4 6 5/0 3 6 4 6 3 5/1 4 2 5/1 4 1 5/4 1 5/4 4 1 4 10 3 1 4 10 C G 6/0 J L C G 6/0 J L 5 3 6 1 4 4 4 10 5 3 6 1 4 4 4 10 4/1 4 4/1 4
  • 818.
    792 Cap´ ıtulo 7. Grafos 4 4/4 7 8/2 4 4/4 4 D E I K 5 4 5 7 4 4 1 4 6/4 3/3 4/0 5/5 3/0 4/2 3/0 4/4 0 7/6 6 6/6 14 4/3 7 5/5 15 A B F H M 4 15 5 6 5 14 4 7 0 0 5/2 5/0 3/3 5/1 7/4 6/6 4/4 6/6 3 1 4 5/4 10 C 4/1 G 6/0 J L 5 3 6 1 4 4 4 10 ÙÖ º ר Ó ¬Ò Ð Ù ÓÒ Ð ÓÖ ØÑÓ ÔÖ ¹­Ù Ó ×Ó Ö Ð ¬ ÙÖ º ÓÒ ÓÐ ÔÖ ÓÖ º 7.10.13.9 Empuje de pre-flujo con cola aleatoria × ÑÙÝ ÔÖÓ Ð ÜØÖ Ö ÒÓ Ó× Ø ÚÓ× × Ò Ö Ó× Ð Ð ×º ÈÓÖ ×Ó¸ × × Ð Ñ Ò Ñ Þ Ö Ð ÒØ ר Ð × ÜØÖ ÓÒ × Ú Ò ×¸ ÐÓ Ù Ð Ô Ò Ð ×Ù ÖØ ØÓÔÓÐÓ Ð Ö Ó¸ Ð ×Ù ÖØ ÓÒ ÕÙ × Ñ Ö Ò ÐÓ× Ö Ó× Ý Ð ×Ù ÖØ ÓÒ ÕÙ × ÔÖ × ÒØ Ò ÐÓ× Ú ÐÓÖ × Ð × Ô ×º × ¸ Ø ÒØÓ Ô Ö Ò Ð ×Ù ÖØ ÕÙ × Ø ÒØ ÓÖ ÒØÖÓ Ù ÖÐ Ò Ð Ð ÓÖ ØÑÓº × Ø ÒÓÖ¸ ÙÒ ×ØÖÙ ØÙÖ ØÓ× Ô Ö Ö ÔÖ × ÒØ Ö Ah × ÒÓÑ Ò “cola aleatoria”¸ Ð Ù Ð ÔÙ ÑÔÐ ÒØ Ö× ÑÙÝ ÐÑ ÒØ ¾ ØÔÐ Ö Ò ÓÑ ÕÙ Ù ºÀ ¾ ≡ template <class T> class Random_Set { DynArray<T> array; gsl_rng * r; void put(const T & item) { array[array.size()] = item; } T get() { const size_t pos = gsl_rng_uniform_int(r, array.size()); // ındice al azar ´ T ret_val = array.access(pos); array.access(pos) = array.access(array.size() - 1); array.cut(array.size() - 1); return ret_val; } }; Í× × DynArray ¾º Ç × ¸ ÙÒ ÓÐ ÙÝ ÓÔ Ö ÓÒ get() × Ð ÓÒ Ð Þ Ö Ð Ð Ñ ÒØÓ Ð Ñ Ò Öº ÓÒ ×Ø רÖÙ ØÙÖ ¸ ÔÓ ÑÓ× ÑÔÐ ÒØ Ö Ð × Ù ÒØ ×Ô Ð Þ ÓÒ ¾ ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ template <class Net> typename Net::Flow_Type random_preflow_maximum_flow(Net & net, const bool & leave_residual = false) { return generic_preflow_vertex_push_maximum_flow <Net, Random_Set<typename Net::Node*> > (net, leave_residual); } ÍÒ Ù ÓÒ ÓÑÔÐ Ø ¸ Ù Ò ¸ ÓÒ ×Ø ÓÐ ¸ × ÑÙ ×ØÖ Ò Ð ¬ ÙÖ º ¼ ´Ô ׺ ¿¹ µº
  • 819.
    7.10. Redes deflujo 793 6 4/0 3 8/0 0 4/0 0 6 7 8/0 0 4/0 0 D E I K D 4 E I K 4 0 3 0 2 0 1 0 5 4 3 0 2 0 1 0 6 3 4/0 5/0 3/0 4/0 3/0 4/0 6 3 4/0 5/0 3/0 4/0 3/0 4/0 0 7 6/0 0 4/0 0 5/0 0 0 7 6/0 0 4/0 0 5/0 0 A 7 B F H M A 7 B F H M 4 21 3 0 2 0 1 0 0 04 21 3 0 2 0 1 0 0 0 5 5/0 3/0 5/0 7/0 6/0 4/0 6/0 5 5/0 3/0 5/0 7/0 6/0 4/0 6/0 5 0 0 5/0 0 5 0 0 5/0 0 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 3 0 4 0 2 0 1 0 3 0 4 0 2 0 1 0 6 7 8/0 0 4/0 0 6 7 8/0 0 4/0 0 D 4 E I K D 4 E I K 5 4 3 0 2 0 1 0 5 4 3 0 2 0 1 0 6 3 4/0 5/0 3/0 4/0 3/0 4/0 6 3 4/0 5/0 3/0 4/0 3/0 4/0 0 7 6 4/0 0 5/0 0 0 7 6 4/0 0 5/0 0 A 7 B 6 F H M A 7 B 6 F H M 4 21 4 6 2 0 1 0 0 04 21 4 7 2 0 1 0 0 0 1 5 5/0 3/0 5/0 7/0 6/0 4/0 6/0 5 3/0 5/0 7/0 6/0 4/0 6/0 5/1 5 0 0 5/0 0 6 0 0 5/0 0 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 3 0 4 0 2 0 1 0 3 0 4 0 2 0 1 0 6 7 8/0 0 4/0 0 6 7 8/0 0 4/0 0 D 4 E I K D 4 E I K 5 4 3 0 2 0 1 0 5 4 3 0 2 0 1 0 6 3 4/0 5/0 3/0 4/0 3/0 4/0 6 3 4/0 5/0 3/0 4/0 3/0 4/0 0 7 6 4/0 0 5/0 0 0 7 6 4/0 0 5/0 6 A 7 B 6 F H M A 7 B 6 F H M 4 21 4 7 2 6 1 0 0 04 21 4 7 2 6 1 0 0 0 1 1 5 3/0 5/0 7/0 6 4/0 6/0 5 3/0 5/0 7/0 6 4/0 6 5/1 5/1 6 0 0 5/0 6 6 0 0 5/0 6 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 3 0 4 0 2 0 1 0 3 0 4 0 2 0 1 6 4 7 8/0 0 4/0 0 4 7 8/0 0 4/0 0 D 4 E I K D 4 E I K 5 4 3 0 2 0 1 0 5 4 3 0 2 0 1 0 6/4 6/4 3 4/0 5/0 3/0 4/0 3/0 4/0 3 4/0 5/0 3/0 4/0 3/0 4/0 4 4 0 7 6 4/0 0 5/0 6 0 7 9 4/0 0 5/0 6 A 7 B 6 F H M A 7 B 6 F H M 4 19 4 7 2 6 1 0 0 04 19 4 7 2 6 1 0 0 0 1 1 5 3/0 5/0 7/0 6 4/0 6 5 3 5/0 7/0 6 4/0 6 5/1 5/1 6 0 0 5/0 6 6 0 0 5/0 6 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 3 0 4 0 2 0 1 6 5 3 4 0 2 0 1 6 4 7 8/0 0 4/0 0 4 7 8/0 0 4/0 0 D 4 E I K D 4 E I K 5 4 3 0 2 0 1 0 5 4 3 0 2 0 1 0 6/4 6/4 3 4/0 5/0 3/0 4/0 3/0 4/0 3 4/0 5/0 3/0 4/0 3/0 4/0 4 4 4/3 0 7 9 4/0 0 5/0 6 0 7 9 3 5/0 6 A 7 B 6 F H M A 7 B 6 F H M 4 16 4 7 2 6 1 0 0 04 16 4 7 2 9 1 0 0 0 3 1 5/2 1 5/2 3 5/0 7/0 6 4/0 6 3 5/0 7/0 6 4/0 6 2 5/1 2 5/1 3 0 0 5/0 6 3 0 0 5/0 6 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 5 3 4 0 2 0 1 6 5 3 4 0 2 0 1 6 ÙÖ º ¼ ÍÒ Ù ÓÒ ÓÑÔÐ Ø ÚÓÖ Ð ´¿¾ Ø Ö ÓÒ ×µ Ð Ð ÓÖ ØÑÓ ÔÖ ¹­Ù Ó ÓÒ ÓÐ Ð ØÓÖ ×Ó Ö Ð Ö Ð ¬ ÙÖ º º
  • 820.
    794 Cap´ ıtulo 7. Grafos 8/2 8/2 4 7 2 4/0 0 4 7 2 4/0 0 D 4 E I K D 4 E I K 5 4 3 7 2 0 1 0 5 4 3 7 2 0 1 0 2 2 6/4 6/4 3 4/0 5 3/0 4/0 3/0 4/0 3 4/0 5 3/0 4/0 3/0 4/0 4 4 4/3 0 7 14 3 5/0 6 0 7 14 4 5/0 6 A 7 B 6 F H M A 7 B 6 F 4 H M 4 16 4 7 2 9 1 0 0 04 16 4 7 3 10 1 0 0 0 3 1 5/2 1 5/2 3 5/0 7/0 6 4/0 6 3 5/0 7/0 6 4/0 6 2 5/1 2 5/1 3 0 0 5/0 6 3 0 0 5/0 6 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 5 3 4 0 2 0 1 6 5 3 4 0 2 0 1 6 8/2 4/2 8/2 4/2 4 7 2 2 4 7 2 2 D 4 E I K D 4 E I K 5 4 3 7 2 2 1 0 5 4 3 7 2 2 1 0 2 2 2 2 6/4 6/4 3 4/0 5 3/0 4/0 3/0 4/0 3 4/0 5 3/0 4/0 3/0 4/0 4 4 5/4 0 7 14 4 5/0 6 0 7 14 4 10 A 7 B 6 F 4 H M A 7 B 6 F 4 H M 4 16 4 7 3 10 1 0 0 04 16 4 7 3 10 1 4 0 0 4 1 5/2 1 5/2 3 5/0 7/0 6 4/0 6 3 5/0 7/0 6 4/0 6 2 5/1 2 5/1 3 0 0 5/0 6 3 0 0 5/0 6 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 5 3 4 0 2 0 1 6 5 3 4 0 2 0 1 6 8/2 4/2 4 7 2 2 8/2 4/2 D 4 E I K 5 4 3 7 2 2 1 0 4 7 2 2 2 2 D 4 E I K 5 4 3 7 2 2 1 0 2 2 6/4 3 4/0 5 3/0 4/0 3/0 4/0 6/4 4 3 4/0 5 3/0 4/0 3/0 4/0 4 5/4 0 7 14 4 10 5/4 A 7 B 6 F 4 H M 4 16 4 7 3 14 1 4 0 0 0 7 14 4 10 4 A 7 B 6 F 4 H M 4 16 4 7 3 14 1 4 0 0 4 1 5/2 7/4 3 5/0 6 4/0 6 1 5/2 7/4 2 5/1 4 3 5/0 6 4/0 6 2 5/1 4 5/4 3 0 4 10 C 4/0 G 6/0 J L 5 3 4 0 2 4 1 6 3 0 4 5/0 6 4 C 4/0 G 6/0 J L 5 3 4 0 2 0 1 6 8/2 4/2 8/2 4/2 4 7 2 2 4 7 2 2 D 4 E I K D 4 E I K 5 4 3 7 2 2 1 2 5 4 3 7 2 2 1 2 2 2 2 2 6/4 4/2 6/4 4/2 3 4/0 5 3/0 4/0 3/0 3 4/0 5 3/0 4/0 3/0 4 2 4 2 5/4 5/4 0 7 14 4 12 0 7 14 8 12 A 7 B 6 F 4 H M A 7 B 6 F 4 H M 4 16 4 7 3 14 1 4 0 04 16 4 7 3 14 1 4 0 0 4 4 1 5/2 7/4 1 5/2 7/4 3 5/0 6 4/0 6 3 5/0 6 4 6 2 5/1 4 2 5/1 4 5/4 5/4 3 0 4 10 3 0 4 10 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 5 3 4 0 2 4 2 6 5 3 4 0 2 4 2 10 4 4 8/2 4/2 8/2 4/2 4 7 2 2 4 7 5 2 D 4 E I K D 4 E I K 5 4 3 7 2 2 1 2 5 4 3 7 2 2 1 2 2 2 2 2 6/4 4/2 6/4 3 4/2 3 4/0 5 3/0 4/0 3/0 3 4/0 5 3/0 3/0 4 2 4 4/3 2 0 7 14 8 13 0 7 14 8 13 A 7 B 6 F 4 H 5 M A 7 B 6 F 4 H 5 M 4 16 4 7 3 14 3 5 0 04 16 4 7 3 14 3 8 0 0 1 5/2 7/4 1 5/2 7/4 3 5/0 6 4 6 3 5/0 6 4 6 2 5/1 4 2 5/1 4 5/4 5/4 3 0 4 10 3 0 4 10 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 5 3 4 0 2 4 2 10 5 3 4 0 2 4 2 10 4 4
  • 821.
    7.10. Redes deflujo 795 8/2 8/2 4 7 5 4 4 7 5 4 D 4 E I 4 K D 4 E I 4 K 5 4 3 7 4 4 1 2 5 4 3 7 4 4 1 4 2 2 6/4 3 4/2 6/4 3 3 4/0 5 3/0 3/0 3 4/0 5 3/0 3/0 4 4 4/3 2 4 4/3 0 7 14 8 13 0 7 14 8 15 A 7 B 6 F 4 H 5 M A 7 B 6 F 4 H 5 M 4 16 4 7 3 14 3 8 0 04 16 4 7 3 14 3 8 0 0 1 5/2 7/4 1 5/2 7/4 3 5/0 6 4 6 3 5/0 6 4 6 2 5/1 4 2 5/1 4 5/4 5/4 3 0 4 10 3 0 4 10 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 5 3 4 0 2 4 2 10 5 3 4 0 2 4 2 10 4 4 8/1 8/1 4 7 4 4 4 7 4 4 D 4 E I 4 K D 4 E I 4 K 5 4 5 6 4 4 1 4 5 4 5 7 4 4 1 4 1 1 6/4 3 6/4 1 3 3 4/0 5 3/0 3/0 4 3 5 3/0 3/0 4 4 4/3 4 4/1 4/3 0 7 14 8 15 0 8 14 8 15 A 7 B 6 F 4 H 5 M A 7 B 6 F 4 H 5 M 4 16 4 7 3 14 3 8 0 04 16 5 7 3 14 3 8 0 0 5/2 1 7/4 5/2 1 7/4 3 5/0 6 4 6 3 5/0 6 4 6 2 5/1 4 2 5/1 4 5/4 5/4 3 0 4 10 3 0 4 10 C 4/0 G 6/0 J L C 4/0 G 6/0 J L 5 3 4 0 2 4 2 10 5 3 4 0 2 4 2 10 4 4 4 4/4 7 8/1 4 4/4 4 D E I K 5 4 5 7 4 4 1 4 6/4 3/3 4/1 5/5 3/0 4/3 3/0 4/4 0 7/6 7 6/6 14 4/4 8 5/5 15 A B F H M 4 15 5 7 3 14 3 8 0 0 5/2 5/1 3/3 5/0 7/4 6/6 4/4 6/6 3 0 4 5/4 10 C 4/0 G 6/0 J L 5 3 4 0 2 4 2 10 ÙÖ º ½ ÍÐØ Ñ × Ø Ö ÓÒ × Ý ×Ø Ó ¬Ò Ð Ù ÓÒ Ð ÓÖ ØÑÓ ÔÖ ¹­Ù Ó ×Ó Ö Ð ¬ ÙÖ º ÓÒ ÓÐ Ð ØÓÖ º Ä Ø Ð × Ù ÒØ Ö ×ÙÑ Ð ÒØ ØÓØ Ð Ø Ö ÓÒ × ÕÙ ØÓÑ Ò Ð × ØÖ × ÙÖ ×Ø × ÔÖ Ð Ö ÑÔÐÓ À ÙÖ ×Ø ÆÙÑ ÖÓ ØÖ ÓÒ × ÓÐ Á Ç ÓÐ ÔÖ ÓÖ ¿ ÓÐ Ð ØÓÖ ÑÒ ¾ ¹ ÔÖÓÑ Ó ¼¸¿ ¹ Ñ Ü ¼ Ð ÔÖÓÑ Ó × Ð ÙÐÓ Ô Ö 100 Ù ÓÒ ×º È Ö Ð ÑÔÐÓ¸ Ð ÓÐ Ð ØÓÖ Ó Ö ÙÒ Ù ÓÒ ÔÖÓÑ Ó Ñ ÓÖ Ð × ÓØÖ × Ó× ÙÖ ×Ø ׺ Ò Ð ÑÔÐÓ ÑÓ×ØÖ Ó × ØÙÚÓ Ð ×Ù ÖØ Ð ÒÞ Ö Ð ×ÙÑ ÖÓ Ò Ò Ó Ø Ö ÓÒ × ÓÒ Ð Ñ ×ÑÓ Ú ÐÓÖ ­Ù Ó ÕÙ ÓÒ Ð ÓÐ Á Ç ´6µº 7.10.13.10 Algoritmo gen´rico de empuje de pre-flujo por arcos e ÍÒ ÐØ ÖÒ Ø Ú Ð Ð ÓÖ ØÑÓ Ò Ö Ó ÓÒ× ×Ø Ò Ñ Ò Ö ÙÒ ×ØÖÙ ØÙÖ ØÓ× ÓÖ Ò¹ Ø Ð ÓÒ ÙÒØÓ Ö Ó× Ð Ð × Ò ÐÙ Ö Ð ÐÓ× ÒÓ Ó× Ø ÚÓ׺ Ä ÜØÖ ÓÒ Ð
  • 822.
    796 Cap´ ıtulo 7. Grafos ÓÐ × Ö Ð ÙÒ Ö Ó Ð Ð × ÙÒ Ð ÙÒ Ö Ø Ö Ó ÓÑ Ò Ó ÓÒ Ð ÐØÙÖ Ð ÒÓ Óº ÑÓ× Ø Ò Ö ×Ô Ð Ù Ó ÓÒ Ð Ö ¹ Ø ÕÙ Ø Ó¸ ÔÙ × Ù Ò Ó Ó ÙÖÖ ÙÒ Ò Ö Ñ ÒØÓ ÐØÙÖ ÙÒ ÒÓ Ó¸ Ö Ó× Ú Ò Ò Ð Ð ×¸ Ô ÖÓ ÓØÖÓ× ÕÙ Ö Ò Ð Ð × Ú Ò Ò Ò Ð Ð ×º Ä ×ØÖÙ ØÙÖ ØÓ× Ñ Ò Ö Ø ÒØÓ ÐÓ× ÒÓ Ó× Ø ÚÓ× ÓÑÓ ÐÓ× Ö Ó× Ð Ð ×º À Ý Ú Ö × Ñ Ò Ö × Ñ ÒØ Ò Ö Ð ÓÒ ÙÒØÓ Ö Ó× Ð Ð ×º ÇÔØ Ö ÑÓ× ÔÓÖ ÑÔÐ Ö Ó× ÓÒ ÙÒØÓ× Ð ÐÓ× Ö Ó× Ð Ð × Ý Ð ÐÓ× ÒÓ Ó× Ø ÚÓ× Ý ÒÓ ÒÓ× ÔÖ Ó ÙÔ Ö ÑÓ׸ Ò Ð Ò ¸ ÔÓÖ × Ö Ö Ó× ÕÙ Ò × Ö Ð Ð × Ù Ò Ó Ó ÙÖÖ ÙÒ Ò Ö Ñ ÒØÓº Ó ÐÓ ÒØ Ö ÓÖ¸ ÓÒ× Ö ÑÓ× Ð × Ù ÒØ Ð ÓÖ ØÑÓ Ò Ö Ó ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ ¾ template <class Net, class QN_Type, class QA_Type> typename Net::Flow_Type generic_preflow_edge_maximum_flow(Net & net, const bool & leave_residual = false) { net.make_residual_net(); net.reset_counter_nodes(); init_height_in_nodes(net); typename Net::Node * source = net.get_source(); typename Net::Node * sink = net.get_sink(); QA_Type q; // conjunto de arcos elegibles QN_Type p; // conjunto de nodos activos ÁÒÙÒ Ö Ö Ó× Ð Ù ÒØ process_active_arcs: while (not q.is_empty()) // mientras haya arcos elegibles { typename Net::Arc * arc = get_from_active_queue(q); typename Net::Node * src = net.get_src_node(arc); typename Net::Node * tgt = net.get_tgt_node(arc); if (node_height<Net>(src) != node_height<Net>(tgt) + 1) // ¿a´n elegible? u continue; // No ==> ignore arco typename Net::Flow_Type excess = src->in_flow - src->out_flow; if (excess == 0) // ¿fuente fue descargado en una iteraci´n anterior? o { // s´ ==> ignore arco ı remove_from_active_queue(p, src); continue; // avance al siguiente arco elegible } ÑÔÙ Ö ÔÖ ¹­Ù Ó ÔÓÖ Ö if (is_node_active<Net>(tgt) and tgt != source and tgt != sink) Å Ø Ö Ò Õ Ö Ó× Ð Ð× ØØ if (excess == 0) // ¿se descarg´ el fuente? o { // s´ ==> fuente deviene inactivo ı remove_from_active_queue(p, src); continue; } if (src != source and src != sink and // ¿empuje no-saturante? not has_arcs_in_active_queue<Net>(src)) { // s´ ==> incremente h(active) y re-inserte arc en q ı remove_from_active_queue(p, src); node_height<Net>(src)++; put_in_active_queue(p, src);
  • 823.
    7.10. Redes deflujo 797 Å Ø Ö Ò Õ Ö Ó× Ð Ð× ×Ö } } while (not p.is_empty()) // mientras haya nodos activos { typename Net::Node * src = get_from_active_queue(p); node_height<Net>(src)++; put_in_active_queue(p, src); Å Ø Ö Ò Õ Ö Ó× Ð Ð× ×Ö goto process_active_arcs; // volver a procesar nuevos arcos elegibles } if (not leave_residual) net.unmake_residual_net(); return source->out_flow; } Ð Ð ÓÖ ØÑÓ Ñ Ò Ó× Ð ÞÓ× ÓÒØ ÒÙÓ× ´whileµ¸ ÙÒÓ ×Ó Ó ÜØÖ Ö Ý ÔÖÓ ¹ × Ö ÙÒ Ð Ñ ÒØÓ ÙÒ ÓÒ ÙÒØÓº Ð ÔÖ Ñ Ö ÓÒ ÙÒØÓ q¸ Ø ÔÓ QN Type¸ Ö ÔÖ × ÒØ Ð ÒÓ Ó× Ø ÚÓ׸ Ñ ÒØÖ × ÕÙ Ð × ÙÒ Ó p¸ Ø ÔÓ QA Type¸ Ð Ö Ó× Ð Ð ×º Ñ Ó× Ð ÞÓ× ×ÓÒ Ô ÖØ ÙÒ ×ÙÔÖ ¹Ð ÞÓ ÑÔÐ ØÓ ÓÒ ÓÖÑ Ó ÔÓÖ Ð ÒרÖÙ ÓÒ goto process active arcs¸ ÕÙ ÖÓÑÔ Ù Ò Ó Ý ÒÓ Ý Ñ × ÒÓ Ó× Ø ÚÓ׺ ÄÓ× ÓÒ ÙÒØÓ× q Ý p ×ÓÒ Ò Ð Þ Ó× ÔÓÖ Ð ÐÓÕÙ Ò Ð ÁÒÙÒ Ö Ö Ó× Ð Ù ÒØ ¸ ÙÝÓ ¬Ò Ð ÓÖ ØÑ Ó × Ð Ñ ×ÑÓ ÕÙ Ð ÈÖ ¹­Ù Ó Ò Ð Ö Ó× Ð ÒÓ Ó Ù ÒØ ½ Ö Ö Ð Ñ Ü ÑÓ ÔÖ ¹­Ù Ó Ò Ð ÁÒÙÒ Ö Ö Ó× Ð Ù ÒØ ≡ ´ µ for (Node_Arc_Iterator<Net, Res_F<Net> > it(source); it.has_current(); it.next()) { typename Net::Arc * arc = it.get_current_arc(); typename Net::Node * tgt = net.get_tgt_node(arc); arc->flow = tgt->in_flow = arc->cap - arc->flow; // inunde arco actual arc->img_arc->flow = 0; // arco residual sin capacidad // meter arcos elegibles de tgt for (Node_Arc_Iterator<Net, Res_F<Net> > it(tgt); it.has_current(); it.next()) { typename Net::Arc * a = it.get_current_arc(); if (node_height<Net>(tgt) == node_height<Net>(net.get_tgt_node(a)) + 1) put_in_active_queue(q, a); // mete en cola de arcos elegibles } put_in_active_queue(p, tgt); // mete en cola de nodos activos } source->out_flow = source->out_cap; Í× × Node Arc Iterator º Ð ÐÓÕÙ ÑÔÙ Ö ÔÖ ¹­Ù Ó ÔÓÖ Ö ¸ ××ÑÐ Ö ÑÔÙ Ö ÔÖ ¹­Ù Ó ÔÓÖ Ö Ó ØÙ Ð ½ ÑÔÙ Ö ÔÖ ¹­Ù Ó ÔÓÖ Ö ≡ ´ µ const typename Net::Flow_Type push = Aleph::min(excess, arc->cap - arc->flow); arc->flow += push; arc->img_arc->flow -= push; if (arc->is_residual) {
  • 824.
    798 Cap´ ıtulo 7. Grafos net.decrease_out_flow(net.get_tgt_node(arc), push); net.decrease_in_flow(net.get_src_node(arc), push); } else { net.increase_in_flow(net.get_tgt_node(arc), push); net.increase_out_flow(net.get_src_node(arc), push); } excess -= push; Ù Ò Ó × ÑÔÙ Ð ÔÖ ¹­Ù Ó ÔÓÖ arc¸ Ð ÒÓ Ó ×Ø ÒÓ tgt ÔÖÓ Ð Ñ ÒØ Ú Ò Ø ÚÓº Ò × ×Ó¸ Ý ÕÙ Ñ Ø Ö Ò Ð ÓÐ q ÐÓ× Ö Ó× × Ð ÒØ × tgt ÕÙ × Ò Ð Ð × Ý tgt Ò p Å Ø Ö Ò Õ Ö Ó× Ð Ð × Ø Ø ≡ ´ µ { for (Node_Arc_Iterator<Net, Res_F<Net> > it(tgt); it.has_current(); it.next()) { typename Net::Arc * a = it.get_current_arc(); if (node_height<Net>(tgt) == node_height<Net>(net.get_tgt_node(a)) + 1) put_in_active_queue(q, a); } put_in_active_queue(p, tgt); } Í× × Node Arc Iterator º ×ÔÙ × Å Ø Ö Ò Õ Ö Ó× Ð Ð × Ø Ø ¸ ÔÙ ×Ù Ö ÕÙ src × Ý × Ö Ó ÓÑÔÐ Ø Ñ ÒØ º Ò × ×Ó¸ src Ú Ò Ò Ø ÚÓ Ý Ý ÕÙ Ð Ñ Ò ÖÐÓ Ð ÓÒ ÙÒØÓ ÒÓ Ó× Ø ÚÓ׺ × × Ð ÙÒ ÓÒ Ð if (excess == 0)º Ð ÐÓÕÙ ÒØÖÓ Ð if (src != source and ...) × ÕÙ Þ Ð Ô ÖØ Ñ × Ð ÓÑÔÖ Ò Öº ÕÙ Ý ÕÙ Ú Ö ¬ Ö × Ð ÒÓ Ó src Ú ÒÓ Ò Ø ÚÓ¸ ÐÓ Ù Ð × ÓÒÓ Ñ ÒØ Ð ÔÖ Ó excess > 0º Ë × Ð×Ó¸ ÒØÓÒ × ÓÒ × ÙÖ Ý × Ò Ø ÚÓ¸ ÔÙ × Ð Ü ×Ó Ù Ö Ò Ó Ò Ð Ö Óº ÐÓ ÓÒØÖ Ö Ó¸ ÑÓ× Ú Ö ¬ Ö × ÑÔÙ Ö ÔÖ ¹­Ù Ó ÔÓÖ Ö Ù Ó ÒÓ × ØÙÖ ÒØ ¸ Ù ×Ø ÓÒ ÕÙ Ð Ø ÖÑ Ò Ð Ü ×Ø Ò Ö Ó× × Ð src ÕÙ ×Ø Ò ÒØÖÓ Ð ÓÐ ×Ø × Ð ¬Ò Ð ÖÙØ Ò has arcs in active queue<Net,Q Type>(q, src)¸ ÙÝ ÑÔÐ ÒØ ÓÒ ×ÓÐÓ × Ö Ñ Ø Ò×Ô ÓÒ Ö Ð Ø Maximum Flow Ò ÐÓ× Ö Ó× × Ð ÒØ srcº Ò Ð Ò Ö Ñ ÒØÓ ÐØÙÖ ÙÒ ÒÓ Ó Ý ÕÙ × ÙÖ Ö× Ó × ÖÚ Ö Ú Ö Ó× ×ÙÒØÓ× ¯ ÈÙ ×ØÓ ÕÙ src ר Ø ÚÓ¸ ר × Ò Ù ÒØÖ ÒØÖÓ Ð ÓÒ ÙÒØÓ pº Ë ÙÒ Ð ×ØÖÙ ¹ ØÙÖ ØÓ× ÒØ Ö Þ QN Type¸ ÒÓ × ÔÙ Ö Ð Þ Ö Ö Ø Ñ ÒØ Ð Ò Ö Ñ ÒØÓ node height<Net>(src)++ × src ר ÓÒØ Ò Ó ÒØÖÓ Ð ÓÒ ÙÒØÓ¸ ÔÙ × × Ø Ð × ÔÐ Ò ÓÖ Ò Ð ×ØÖÙ ØÙÖ ØÓ׺ × ÔÓÖ × Ö ÞÓÒ ÕÙ Ð Ò Ö Ñ ÒØÓ × src p¸ Ò Ö Ñ ÒØ Ð ÐØÙÖ Ý Ñ Ø ÒÙ ÚÓ Ò pº ¯ Ð Ò Ö Ñ ÒØÓ node height<Net>(src)++; ÔÙ ÔÖÓÚÓ Ö Ð Ô Ö ÓÒ Ý ¹ × Ô Ö ÓÒ Ö Ó× Ð Ð ×¸ Ø ÒØÓ × Ð ÒØ × × ÓÑÓ ÒØÖ ÒØ × srcº ÈÓÖ ÐÓ× Ö Ó× × Ð ÒØ × ÒÓ Ý ÔÖÓ Ð Ñ Ò Ö Ú × ÖÐÓ׸ ÐÐÓ× ×ÓÒ Ö Ø Ñ ÒØ × Ð × Ô ÖÓ ÐÓ× ÒØÖ ÒØ × ÒÓ ÐÓ ×ÓÒº Ò ×Ø ×Ó¸ Ð Ö × Ó Ó ÕÙ Ð Ö Ö × Ù Ð ×Ø ÒØÖÓ Ð ÔÖÓÔ Ö Ù ÙÒ Ô Ô Ð × Ò Ð¸ ÔÙ × ÔÓÖ Ö Ó ÒØÖ ÒØ src Ü ×Ø
  • 825.
    7.10. Redes deflujo 799 ÙÒ Ö Ó Ö × Ù Ð ÕÙ ÒÓ× Ô ÖÑ Ø ÓÒÓ Ö Ò O(1) Ð Ö Ó ÒØÖ ÒØ srcº Å Ø Ö Ò Õ Ö Ó× Ð Ð × ×Ö ≡ ´ µ for (Node_Arc_Iterator<Net> it(src); it.has_current(); it.next()) { typename Net::Arc * a = it.get_current_arc(); // arco saliente desde src if (node_height<Net>(src) == node_height<Net>(net.get_tgt_node(a)) + 1 and a->cap - a->flow > 0) put_in_active_queue(q, a); typename Net::Arc * i = a->img_arc; // arco entrante a src if (i->cap - i->flow > 0 and // ¿i es elegible? node_height<Net>(net.get_src_node(i)) == node_height<Net>(src) + 1) put_in_active_queue(q, i); } Í× × Node Arc Iterator º Ð Ø Ö ÓÖ ÒÓ ÙØ Ð Þ Ð ¬ÐØÖÓ Res F ¬Ò Ó Ò Ü º½¼º ´Ô Ò ¾µ¸ ÔÙ × ×Ø Ùר Ñ ÒØ ÒÓ× ¬ÐØÖ Ö Ö Ó× × ØÙÖ Ó× Ý ÒÓ× ÑÔ Ö Ú Ö Ð ÒÓ Ó ÓÖ Ò ÙÒ Ö Ó ÒØÖ ÒØ srcº ÄÓ× Ö Ó× ÓÒØ Ò Ó× Ò q ÕÙ Ò × Ö Ð Ð × × ÑÔÐ Ñ ÒØ × ÒÓÖ Òº ÈÙ Ö ÑÓ× × Ò Ö ÙÒ ×ØÖÙ ØÙÖ ØÓ× ÕÙ Ô ÖÑ Ø Ð Ò Ö Ñ ÒØÓ Ö ØÓ Ý Ð Ñ¹ Ò ÐÓ× Ö Ó× ÒÓ Ð Ð × Ò O(1)º È Ö ÕÙ ×Ø Ò ÓÕÙ × ÙÒ ÐÓ× Ö Ó× Ð Ð × Ò ÕÙ ¬ Ö Ð Ð ÓÖ ØÑÓ Ò Ö Ó × ÙÒ ÒÓ Ó× Ø ÚÓ× Ê ×ÙÐØ ÕÙ ÓÒ ×Ø Ð ÓÖ ØÑÓ × ÒØÙ Ø Ú Ñ ÒØ Ñ × × Ò ÐÐÓ Ô Ò× Ö Ð ÓÖ Ò ØÖ Ø Ñ ÒØÓ ÐÓ× ÒÓ Ó× Ø ÚÓ׺ ÓÒ× Ö ÑÓ× Ð ÙÒ × ×Ô Ð Þ ÓÒ × ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ template <class Net> typename Net::Flow_Type depth_first_preflow_edge_maximum_flow(Net & net, const bool & leave_residual = false) { typedef DynSetTreap<typename Net::Node*> Active; typedef DynListStack<typename Net::Arc*> Stack; return generic_preflow_edge_maximum_flow<Net,Active,Stack>(net, leave_residual); } Í× × DynListStack ½½ º ÄÓ× ÒÓ Ó× Ø ÚÓ× × Ù Ö Ò Ò ÙÒ ØÖ Ô ´Ü º¿ ´Ô Ò µµ ÙÝ ÓÔ Ö ÓÒ get() Ö ØÓÖÒ Ð Ñ ÝÓÖ Ú ÐÓÖ Ó × Ð ÒÓ Ó Ñ ÝÓÖ ÐØÙÖ º ÍÒ Ò Ö Ñ ÒØÓ Ù ×Ø O(Ð V)¸ Óר ÕÙ ÔÙ ÐÐ Ú Ö× O(1) × × Ð ÓÖ ÓÒ Ù Ó ÙÒ Ø Ð × ¸ ÙÝ ÙÒ ÓÒ × Ò ÐÙÝ Ð ÐØÙÖ Ý Ð Ö ÓÒ Ð ÒÓ Óº ÈÓ Ö × Ö¸ ÔÓÖ ÑÔÐÓ¸ Ð Ø ÔÓ ODhashTable<Key, Record> ¬Ò Ó Ò Ü º½º º ´Ô Ò ¾ µ ÓÒ ÙÒ Ø Ñ ÒÓ Ùר Ó ÙÒ ¾¼± Ñ × Ö ×Ô ØÓ V º ÄÓ× Ö Ó× Ð Ð × × Ò Ù ÒØÖ Ò Ò ÙÒ Ô Ð ¸ ÔÓÖ ÐÓ ÕÙ ×Ù ÔÖÓ × Ñ ÒØÓ Ó Ð ÖÕÙ Ø ÔÓ Ò ÔÖÓ ÙÒ º ÇØÖ Ú Ö× ÓÒ¸ רÖÙ ØÙÖ ÐÑ ÒØ ÑÙÝ × Ñ Ð Ö Ô ÖÓ ÔÖÓ × Ñ ÒØÓ ÑÙÝ ×Ø ÒØÓ × ¬Ò ÓÑÓ ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ ¼¼ template <class Net> typename Net::Flow_Type breadth_first_preflow_edge_maximum_flow(Net & net, const bool leave_residual = false)
  • 826.
    800 Cap´ ıtulo 7. Grafos { typedef DynSetTreap<typename Net::Node*> Active; typedef DynListQueue<typename Net::Arc*> Queue; return generic_preflow_edge_maximum_flow<Net, Active, Queue>(net, leave_residual); } Í× × DynListQueue ½ ¼ º Ä Ù Ð Ö ÓÖÖ ÐÓ× Ö Ó× Ð Ð × Ò ÔÖÓ ÙÒ º Ò ÐÑ ÒØ ¸ ÔÙ Ö ÑÓ× ×Ô ¬ Ö ÙÒ ÔÖ ÓÖ Ð Ð ÒØÖ Ó× Ö Ó× ¼¼ ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ ¼¼ template <class Net> struct Compare_Arc { bool operator () (typename Net::Arc * a1, typename Net::Arc * a2) const { typename Net::Node * src1 = (typename Net::Node *) a1->src_node; typename Net::Node * src2 = (typename Net::Node *) a2->src_node; if (src1->counter == src2->counter) return a1->cap - a1->flow > a2->cap - a2->flow; return src1->counter > src2->counter; } }; Ð Ö Ø Ö Ó Ñ Ö Ð × ÐØÙÖ × ÐÓ× ÒÓ Ó× ÓÖ Ò Ö Óº Ë ×Ø × ×ÓÒ Ù Ð ×¸ ÒØÓÒ × × Ð Ð Ö Ó ÕÙ Ø Ò Ñ ÝÓÖ Ô ×ÔÓÒ Ð ¸ Ó Ð ÜÔ Ø Ø Ú ÕÙ × ÑÔÙ Ð Ñ ÝÓÖ ÒØ ­Ù Óº Ë ¸ ÔÓÖ Ð ÓÒØÖ Ö Ó¸ Ð × ÐØÙÖ × ¬ Ö Ò¸ ÒØÓÒ × × × Ù Ð Ö Ø Ö Ó ÔÖ ÓÖ Ý × × Ð ÓÒ Ð Ö Ó ÓÒ Ñ ÝÓÖ ÐØÙÖ º ÓÒ Ð ÔÖ ÓÖ ¬Ò ¸ ÔÓ ÑÓ× ¬Ò Ö ÓØÖ Ð × Ð ÓÖ ØÑÓ ¼¼ ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ ¼¼ ¼¼ template <class Net> typename Net::Flow_Type priority_first_preflow_edge_maximum_flow(Net & net, const bool & leave_residual = false) { typedef DynSetTreap<typename Net::Node*> Active; typedef DynBinHeap<typename Net::Arc*, Compare_Arc<Net> > Prio_Queue; return generic_preflow_edge_maximum_flow <Net, Active, Prio_Queue> (net, leave_residual); } Ò ÐÑ ÒØ ¸ Ø Ñ Ò ÔÓ ÑÓ× Ð Ö Ð Þ Ö ¼¼ ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ ¼¼ ¼¾ template <class Net> typename Net::Flow_Type random_first_preflow_edge_maximum_flow(Net & net, const bool & leave_residual = false) { typedef DynSetTreap<typename Net::Node*> Active; typedef Random_Set <typename Net::Arc*> Random_Queue; return generic_preflow_edge_maximum_flow <Net, Active, Random_Queue> (net, leave_residual); }
  • 827.
    7.10. Redes deflujo 801 7.10.13.11 Conclusi´n sobre algoritmos de pre-flujo o Ð × Ù Ö Ñ ÒØÓ Ý ×ØÙ Ó ÙÖ ×Ø × ÓÖ Ò ÔÖÓ × Ñ ÒØÓ ÒÓ Ó× Ø ÚÓ× × Ò ÐÓ× Ø ÑÔÓ× ØÙ Ð × ÙÒ ÑÔÓ ÒÚ ×Ø ÓÒ ÖØ к × Ø ÒÓÖ × ÑÔÓÖØ ÒØ ר Ö Ð ÙÒ × Ú × ÜÔÐÓÖ ÓÒ Ô Ö Ð × Ù Ö Ñ ÒØÓ Ñ ÓÖ × Ð ÓÖ ØÑÓ× Ó ×Ù ÔØ ÓÒ Ð × × ÔÖÓ Ð Ñ × Ô ÖØ ÙÐ Ö ×º Ä ÔÖ Ñ Ö Ú × Ð × Ò ÓÒ Ò Ð Ð ÙÒ ÓÒ ÐØÙÖ º Ò ÒÙ ×ØÖÓ ×ØÙ Ó ×ÓÐÓ ÑÓ× ÓÒ× Ö Ó Ð ×Ø Ò ×Ø Ð ×ÙÑ ÖÓ¸ Ô ÖÓ ÔÙ Ö ÑÓ× Ô Ò× Ö Ò ÓØÖÓ׺ ÈÓÖ ÑÔÐÓ¸ ÔÓ Ö ÑÓ× ÔÖ ÓÖ Þ Ö ÕÙ × Ð Ò Ò ÔÖ Ñ ÖÓ ÕÙ ÐÐÓ× ÒÓ Ó× ÙÝÓ× Ö Ó× × Ð × Ò ×Ø ÒØ × Ö Ò ×¸ ÑÓ Ó ÕÙ ×ØÓ× Ø Ò Ò Ð Ñ ÝÓÖ ÔÓ× Ð Ú ÒÖ Ò Ø ÚÓ× Ò ×Ù ÔÖ Ñ Ö Ó × ÖÚ ÓÒ Ø Ñ Ò ÔÓ Ö Ò ÓÒ× Ö Ö× Ð Ô ØÓØ Ð ÒØÖ × Ö¸ ÖÐ ÔÖ ÓÖ ÕÙ ÐÐÓ× ÒÓ Ó× ÕÙ Ò ÓÒ ÙÒØÓ ÔÙ Ò ÒÚ Ö Ý Ö Ö Ñ ÝÓÖ × ­Ù Ó׺ ÇØÖÓ Ñ ÒÓ ÜÔÐÓÖ ÓÒ ÐÓ ÓÒ ÓÖÑ Ð × ÒÓ ×ØÖÙ ØÙÖ ØÓ× ÐØ Ñ ÒØ ¬ ÒØ × Ô Ö Ñ Ò Ö ÐÓ× ÓÒ ÙÒØÓ× Ö Ó× Ð Ð × Ý ÒÓ Ó× Ø ÚÓ׺ ÓÑÓ Ú ÑÓ׸ Ð Ð ÓÖ ØÑÓ Ò Ö Ó ÓÖ ÒØ Ó Ö Ó× ´Ü º½¼º½¿º½¼ ´Ô Ò µµ × Ñ × Ñ Ð Ð Ò Ù ÒØÓ Ð ÓÖ Ò ÜÔÐÓÖ ÓÒ Ð Ö ¸ Ô ÖÓ Ð Ð ÓÖ ØÑÓ ×Ô Ö ÙÒÓ× Ù ÒØÓ× ÐÓ× Ó ÜØÖ ÓÒ × Ö Ó× ÕÙ ÒÓ ×ÓÒ Ð Ð ×º ÍÒ ×ØÖÙ ØÙÖ ØÓ× ÕÙ Ñ× Ò× ÖØ Ö Ò O(1) Ø Ñ Ò Ô ÖÑ Ø Ð Ñ Ò Ö Ö Ó× ÒÓ Ð Ð × ÐÙ Ó ÙÒ Ò Ö Ñ ÒØÓ ÙÑ ÒØ Ö Ð ¬ Ò º Ä Ø Ö Ö Ú ¸ ÔÓÖ ×ÙÔÙ ×ØÓ¸ ÓÒ× ×Ø Ò Ò ÓÒØÖ Ö Ñ ÓÖ × Ð ÓÖ ØÑÓ׺ × Ø ÒÓÖ¸ ÙÒ Ú Ö ÒØ ÑÔÙ ÔÖ ¹­Ù Ó × ÒÓÑ Ò ÔÓÖ ÐÓÕÙ × º Ä ÓÒ× ×Ø Ò × Ô Ö Ö Ð Ö Ò ÐÓÕÙ × ´×Ù Ö Ó×µ ÔÓÖ ÓÒ × ÐÐ Ú Ð ÔÖ ¹­Ù Óº ÈÓÖ ÑÔÐÓ¸ Ð Ö Ó ÑÔÐ Ö Ð ¬ ÙÖ º ÔÓ Ö ÑÓ× × ÓÑÔÓÒ ÖÐÓ Ò ÐÓ× ÐÓÕÙ × ÓÒ ÓÖÑ Ó× ÔÓÖ {D, E, I, K}, {B, F, H} Ý {C, G, J, L}º ר ¸ Ô ÖØ ÕÙ ÔÙ ÖÑ×ÖÔ Ó Ð Ð ÙÐÓ¸ × Ò ØÙÖ ÐÑ ÒØ Ô Ö Ð Ð Þ Ð × Ö¸ ÐÓ× ÐÓÕÙ × ÔÙ Ò ÔÖÓ × Ö× Ò Ô Ö Ð ÐÓ ÔÓÖ Ú Ö Ó× ÔÖÓ × ÓÖ × × ÙÒ Ð Ö Û Ö º 7.10.14 C´lculo del corte m´ a ınimo Ì Ð Ú Þ × ÑÓÑ ÒØÓ ÓÒÚ Ö× Ö ×Ó Ö ÔÐ ÓÒ × ÓÒ Ö Ø × ÕÙ ÒÓ× Ò Ñ × ÔÖ Ò× ¹ Ð × ÐÓ× ÓÒÓ Ñ ÒØÓ׺ ÓÒ× Ö ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ Ð ­Ù Ó ÙØÓÑÓØÓÖ ÙÒ Ù º × Ò ÔÓ× Ð Ó Ø Ò Ö ÙÒ ÑÓ ÐÓ ÙÝÓ ¬Ò × Ñ Ü Ñ Þ Ö Ð ­Ù Ó ÙØÓÑÓÚ Ð × ÙÖ ÒØ Ó¹ Ö × Ö Ø × ÒØÖ ÙÒ ÜØÖ ÑÓ Ù ÒØ Ý ÓØÖÓ ×ÙÑ ÖÓº Ò × × ÒØ Ó¸ Ð ­Ù Ó Ñ Ü ÑÓ × Ö ÑÙÝ ÙØ Ð Ô Ö × Ò Ö ÙÒ ÔÓÐ Ø Ö ÓÒ ØÖ Ò× ØÓ ÔÖÓ Ö Ñ ÓÒ ÐÓ× × Ñ ÓÖÓ׸ ×Ú Ó׸ Ú Ð Ò Ú × Ö Ø ×¸ Ø Ø Ö ¸ Ø Ò ÒØ × ÓÒ ×Ø ÓÒ Ö Ð ØÖ ¬ Óº ÓÒ ÑÙ Ó Ñ Ö Ó¸ Ò ×Ø Ú ÔÓר¹ÑÓ ÖÒ × Ò Ù ÒØÖ Ò ÒÙÑ ÖÓ× × ÑÓ× ÑÔÐÓ× Ò ÕÙ ¸ Ô × Ö ÓÒÓ Ö Ð ­Ù Ó Ñ Ü ÑÓ Ý ÑÔÖ Ò Ö ÓÖÖ Ø Ñ ÒØ ÔÓÐ Ø × Ô Ö ÔÖ × ÖÚ ÖÐÓ¸ Ð ­Ù Ó ÙØÓÑÓØÖ Þ × Ð Ò ÒØ Ô Ö Ð Ù Ò º Ò ×ØÓ× ×Ó× ÔÙ Ö ÔÐ ÒØ Ö× ÙÑ ÒØ Ö Ð Ô Ú Ðº Ù Ð × ×ÓÒ ÐÓ× ÐÙ Ö × Ù Ò ÓÒ ÙÑ ÒØ Ö× Ð Ô Ä Ö ×ÔÙ ×Ø ÓÑ ÒÞ ÔÓÖ Ð ÓÖØ Ñ Ò ÑÓº Ò ØÓ¸ Ð ÓÖØ Ñ Ò ÑÓ Ö ÔÖ × ÒØ ÙÒ ÓÒ ÙÒØÓ Ö Ó× ÕÙ × × Ö Ù × Ò Ñ ÒÓ× Ö Ð ­Ù Ó Ð Ö º Ë ØÖ Ø Ú × Ö Ø ×¸ ÐÓ ÕÙ Ñ ÒÙ Ó × Ð Ø Ð Ù ÐÐÓ ÓØ ÐÐ º À Ý ÑÙ × Ñ × Ö ÙÒר Ò × Ð ÔÓר¹ÑÓ ÖÒ Ú Ö Ð Ò Ð × Ù Ð × Ð ÔÖÓ Ð Ñ Ð ­Ù Ó Ñ Ü ÑÓ Ý ×Ù Ù Ð ÓÖØ Ñ Ò ÑÓ ÔÙ Ò × Ö Ö Ø ÙØ Ð ¸ × ÙÒ Ö Ù Ø Ò ¸ ÙÒ Ö ÖÖÓÚ Ö Ó ØÖ Ò×ÔÓÖØ Ò Ô Ö Ó Ó× Ù ÖØ Ñ Ò Ó ÙÒ Ö ØÖ Ò×Ñ × ÓÒ Ð ØÖ º
  • 828.
    802 Cap´ ıtulo 7. Grafos Ê Ö × ÑÓ× Ð ×ÙÒØÓ ÓÖÑ Ð Ð ÓÖØ Ñ Ò ÑÓ ØÖ Ø Ó Ò Ü º½¼º ´Ô Ò µº Ò ÕÙ Ð ÒØÓÒ × × Ù Ö ÑÓ× ÓÒÓ Ñ ÒØÓ¸ Ô ÖØ ÙÐ ÖÑ ÒØ Ð ×Ø Ð Ó ÔÓÖ Ð ÓÖÓÐ Ö Ó º¿ ´Ô º µ¸ ÕÙ ÒÓ× Ô ÖÑ Ø ¬Ò Ö ÙÒ Ð ÓÖ ØÑÓ Ð ÙÐÓ ÓÖØ Ñ Ò ÑÓº Ò Ð Ñ ×ÑÓ × ÒØ Ó¸ Ð ÔÖÓÔÓ× ÓÒ º ´Ô º µ¸ ÒÓ× Ó Ö ÖØ ØÙ ÕÙ ÔÓÖ Ð Ú Ð ­Ù Ó Ñ Ü ÑÓ ÔÓ ÑÓ× Ò ÓÒØÖ Ö Ð ÓÖØ Ñ Ò ÑÓº ØÓ× ÔÖ Ò Ö Ð ÑÔÓÖØ Ò Ð ÓÖ ØÑ ÕÙ ÐÐÓ× ÓÒÓ Ñ ÒØÓ׸ Ô Ö¹ Ñ Ø ÑÓ×ÒÓ× Ñ Ö Ö ÙÒ ÔÓ Ó Ð ÓÑÔÐ Ò ÓÒØÖ Ö Ù ÖÞ ÖÙØ Ð ÓÖØ Ñ Ò ÑÓº × Ñ ÒØ ¸ Ø Ò Ö ÑÓ× ÕÙ Ø ÖÑ Ò Ö Ð × ÓÑ Ò ÓÒ × ÔÓ× Ð × ÐÓ× ÓÒ ÙÒØÓ× Vs Ý Vt ÙÒØÓ ÓÒ ×Ù× Ö Ó× ÖÙ º ÍÒ Ð ÓÖ ØÑÓ × Ó Ò ×Ø ÔÖ Ò Ô Ó Ö ÕÙ Ö Ö ¸ ÔÖÓ¹ Ü Ñ Ñ ÒØ ¸ Ü Ñ Ò Ö V−2 V−2 ÓÑ Ò ÓÒ × Vs Ý Vt ÔÓ× Ð ×º ÈÓÖ i=0 i ÙÒÓ ÐÐÓ׸ Ö ÕÙ Ö ÓÖÖ Ö ÐÓ× E Ö Ó× Ô Ö Ø ÖÑ Ò Ö Ð ÓÖØ º Ë Ö ÕÙ Ö Ö Ò¸ ÒØÓÒ ×¸ i ×E Ø Ö ÓÒ × ÒØ ÓÑ Ò ØÓÖ ÐÑ ÒØ ÜÔÐÓ× Ú ÒØÖ Ø Ð Ô ÖØ Ö V−2 V−2 i=0 × Ð × Ñ Ò ×º ÔÖ Ò ÑÓ׸ Ô٠׸ ÕÙ Ð ×Ø Ñ Ó ×Ó Ö ÐÓ× Ö Ó× ÖÙ ÕÙ ÒÓ× ÔÖÓÔÓÖ ÓÒ Ð ÓÖÓÐ Ö Ó º¿ ´Ô º µ ÒÓ× Ö Ù ÑÙÝ × Ò ¬ Ø Ú Ñ ÒØ Ð ¬ ÙÐØ Ð ÔÖÓ Ð Ñ ×Ø ÓÒ ÓÒרÖÙ Ö Ð ÓÒ ÙÒØÓ Ö Ó× × ØÙÖ Ó× Ó ÔÐ ÒÓ׸ × Ö¸ ÕÙ ÐÐÓ× ÙÝÓ ­Ù Ó × Ù Ð ×Ù Ô ¸ Ý Ù ÐÕÙ Ö ÓÑ Ò ÓÒ ÒØÖ ×ØÓ× Ö Ó× ÙÝ ×ÙÑ × Ù Ð Ð Ñ Ü ÑÓ Ú ÐÓÖ ­Ù Ó ÓÒ Ö Ó× Ö ØÖÓ ×Ó ÓÒ ­Ù Ó ÖÓ × ÙÒ ÓÖØ Ñ Ò ÑÓº ÑÔ ÖÓ¸ ÙÒ ÓÒ ×Ø ÓÒÓ Ñ ÒØÓ Ð ÔÖÓ Ð Ñ × Ù × Ò Ó Ð Ó ÓÑÔÐ Óº ÈÙ × ÑÔÐ ¬ Ö× Ð Ð ÙÐÓ Ð ÓÖØ Ä Ö ×ÔÙ ×Ø × ¬ÖÑ Ø Ú × Ö ÓÖ ÑÓ× Ð ÔÖÓÔÓ× ÓÒ º½¼ ´Ô º ¿µ Ù Ð ÒÓ× × ÙÖ ÕÙ × ÒÓ Ü ×Ø ÙÒ Ñ ÒÓ ÙÑ ÒØÓ¸ ÒØÓÒ × Ð ­Ù Ó × Ñ Ü ÑÓº È ÖÓ¸ ÕÙ ×Ù Ý ØÖ × ×Ø ÓÒÓ Ñ ÒØÓ ÕÙ ÒÓ× Ô ÖÑ Ø Ð ÙÐ Ö Ö Ô Ý ÖØ Ö Ñ ÒØ Ð ÓÖØ Ñ Ò ÑÓ Ä Ö ×ÔÙ ×Ø ÔÙ ÔÐ ÒØ Ö× ÓÑÓ ÓÖÓÐ Ö Ó Ð ÔÖÓÔÓ× ÓÒ º½¼ ´Ô º ¿µ ÔÙ ×ØÓ ÕÙ ÒÓ Ü ×Ø Ñ ÒÓ ÙÑ ÒØÓ¸ ÒØÓÒ × × ÑÔÓ× Ð ÐÐ Ö Ð ×ÙÑ ÖÓº ÈÓÖ Ø ÒØÓ¸ Vs × Ð ÓÒ ÙÒØÓ ÒÓ Ó× Ð ÒÞ Ð × × s Ý Vt × V − Vsº ÍÒ × ÑÔÐ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ ×Ó Ö Ð Ö Ö × Ù Ð Ö ×ÙÐØ ÒØ ÐÙ Ó Ñ Ü Ñ Þ Ö Ð ­Ù Ó ÒÓ× ÔÙ × Ù Ö Ö Ð ÓÒ ÙÒØÓ Vsº Ô ÖØ Ö Ð Ó ÒØ Ö ÓÖ¸ ÔÓ ÑÓ× Ò ÙÒ ÔÖ Ñ Ö Òר Ò × Ò Ö ÙÒ ÙÒ ÓÒ Ú × Ø Ô Ö Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ Ð Ö Ö × Ù Ð ÕÙ ÒÓ× Ò Ð ÓÒ ÙÒØÓ vs ptr ÐÓ× ÒÓ Ó× Ô ÖØ Ò ÒØ × Vs ¼¾ ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ ¼¼ ¼¿ template <class Net> static bool add_vertex_to_vs(Net &, typename Net::Node * node, typename Net::Arc*) { ((Aleph::set<typename Net::Node*>*)vs_ptr)->insert(node); return false; // indica que debe seguir explorando } vs ptr × ÙÒ ÔÙÒØ ÖÓ ÐÓ Ð Ð ÓÒ ÙÒØÓ Vsº ר ÑÓ Ó¸ ÔÓ ÑÓ× ÔÐ ÒØ Ö Ð Ð ÙÐÓ Vs × ¼¾ Ð ÙÐ Ö Vs ¼¾ ≡ ´ ¼¿ µ vs_ptr = &vs; depth_first_traversal <Net, Res_F<Net> > (net, source, &add_vertex_to_vs); ÄÙ Ó Ð Ö ÓÖÖ Ó¸ vs ÓÒØ Ò ØÓ Ó Ð ÓÒ ÙÒØÓ Vsº Ð ÓÒ ÙÒØÓ Vt ÔÓ Ö Ð ÙÐ Ö× ÔÓÖ Ò×Ô ÓÒ Ò Vs¸ Ô ÖÓ ÙÒ Ú Ñ × ÜÔ Ø ÓÒ× ×Ø Ð Ñ Ö Ö Ð Ø Depth First ÕÙ Ñ Ö Ó Ð ÐÐ Ñ depth first traversal() × ÒÓ Ó ÒÓ ×Ø Ñ Ö Ó¸ ÒØÓÒ × ×Ø Ô ÖØ Ò Vtº Ð Ð ÙÐÓ Vt × ÔÐ ÒØ Ð × Ù ÒØ ÑÓ Ó ¼¾ Ð ÙÐ Ö Vt ¼¾ ≡ ´ ¼¿ µ
  • 829.
    7.10. Redes deflujo 803 const size_t size_vt = net.get_num_nodes() - vs.size(); for (Node_Iterator<Net> it(net); it.has_current() and vt.size() < size_vt; it.next()) { typename Net::Node * p = it.get_current(); if (not IS_NODE_VISITED(p, Aleph::Depth_First)) vt.insert(p); } Í× × Node Iterator º ÄÙ Ó ÓÒÓ Ó× vs Ý vt ÐÓ ÕÙ Ö ×Ø × ÓÒÓ Ö ÐÓ× Ö ×Ô Ø ÚÓ× Ö Ó× ÖÙ º È Ö ÐÐÓ¸ Ö ÓÖÖ ÑÓ× ØÓ Ó× ÐÓ× Ö Ó× ÕÙ ÒÓ × Ò Ö × Ù Ð × Ý × Ð ÓÒ ÑÓ× ÕÙ ÐÐÓ× ÕÙ × Ø × Ò Ð × ÓÒ ÓÒ × Ð ÓÖÓÐ Ö Ó º¿ ´Ô º µº ×ØÓ Ö ÕÙ Ö ¬ÐØÖ Ö ÐÓ× Ö Ó× Ö× ÙÐ× ¼¿ ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ ¼¾ ¼¿ template <class N> class No_Res_Arc { bool operator () (N&, typename N::Arc * a) const { return not a->is_residual; } }; ÓÒ ×Ø ¬ÐØÖÓ¸ Ò×Ô ÓÒ ÑÓ× ÐÓ× Ö Ó× Ð Ö Ö × Ù Ð Ý ÔÖÓ × ÑÓ× ÕÙ ÐÐÓ× ÓÒ f(e) = 0 Ý f(e) = Ô(e) ¼¿ Ð ÙÐ Ö Ö Ó× ÖÙ Ð ÓÖØ Ñ Ò ÑÓ ¼¿ ≡ ´ ¼¿ µ for (Arc_Iterator<Net, No_Res_Arc<Net> > it(net); it.has_current(); it.next()) { typename Net::Arc * arc = it.get_current(); if (arc->flow == 0) // ¿candidato a arco de retroceso? if (vt.count(net.get_src_node(arc)) > 0 and // ¿arc desde vt hacia vs? vs.count(net.get_tgt_node(arc)) > 0) { cutt.insert(arc); continue; } if (arc->flow == arc->cap) // ¿candidato a arco de cruce? if (vs.count(net.get_src_node(arc)) > 0 and // ¿arc desde vs hacia vt? vt.count(net.get_tgt_node(arc)) > 0) cuts.insert(arc); } Í× × Arc Iterator º ÄÓ× ÐÓÕÙ × × ÖÖÓÐÐ Ó× × ÙÒØ Ò × Ù Ò ÐÑ ÒØ Ô Ö Ö Ð Þ Ö Ð Ð ÙÐÓ Ð ÓÖØ Ñ Ò ÑÓ ¼¿ ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ ¼¿ ¼ template <class Net, template <class> class Maxflow> typename Net::Flow_Type min_cut(Net & net, Aleph::set<typename Net::Node*> & vs, Aleph::set<typename Net::Node*> & vt, DynDlist<typename Net::Arc *> & cuts, DynDlist<typename Net::Arc *> & cutt, const bool leave_residual = false)
  • 830.
    804 Cap´ ıtulo 7. Grafos D 4/1 E 1/1 I 4/1 K 6/1 3/3 4/0 3/3 3/0 4/0 3/0 4/1 3/3 A 7/3 B F 4/4 H 5/4 M 1/0 5/3 5/0 3/3 5/0 7/2 3/3 4/0 6/5 C G J 5/2 L 4/0 6/0 ÙÖ º ¾ ÍÒ ÓÖØ Ñ Ò ÑÓ ×Ó Ö ÙÒ Ö Ô Ø º ÄÓ× Ö Ó× Ô ÖØ Ò ÒØ < Vs, Vt > ×ÓÒ Ö × ÐØ Ó׸ Ñ ÒØÖ × ÕÙ ÐÓ× Ô ÖØ Ò ÒØ × < Vs, Vt > Ò Ð Ò ÓÖØ º { Maxflow <Net> () (net, true); // calcula flujo m´ximo y deja red residual a typename Net::Node * source = net.get_source(); Ð ÙÐ Ö Vs ¼¾ Ð ÙÐ Ö Vt ¼¾ Ð ÙÐ Ö Ö Ó× ÖÙ Ð ÓÖØ Ñ Ò ÑÓ ¼¿ if (not leave_residual) { net.unmake_residual_net(); net.unmake_super_nodes(); } return source->out_flow; } Í× × DynDlist ¿ º min cut() Ô Ö Ñ ØÖ Þ Ð Ø ÔÓ Ö Ð Ù Ð × Ð × Ð ÙÐ Ö Ð ­Ù Ó Ñ Ü ÑÓ Ý Ð ÓÖØ Ñ Ò ÑÓ Ý Ð Ð ÓÖ ØÑÓ Ð ÙÐÓ ­Ù Ó Ñ Ü ÑÓ ÕÙ × × ÑÔÐ Öº ÄÓ× Ô Ö Ñ ØÖÓ× Ð ÙÒ ÓÒ ×ÓÒ Ð Ö net¸ Ð ÓÒ ÙÒØÓ Vs vs¸ Ð ÓÒ ÙÒØÓ Vt vt¸ Ð ÓÒ ÙÒØÓ Ö Ó× < Vs, Vt > cuts Ý Ð ÓÒ ÙÒØÓ Ö Ó× < Vs, Vt > cuttº 7.10.15 Aumento o disminuci´n de flujo de una red o Ò Ð × Ö × Ö Ð × ÒÓ × ÑÔÖ × Ö ÕÙ Ö Ñ Ü Ñ Þ Ö Ð ­Ù Óº ÒØÖÓ Ð × Ö ÙÒר Ò × × ÔÓ× Ð ¸ ÓÑÓ Ö ÕÙ Ö Ñ ÒØÓ¸ ÙÒ Ùר Ð ­Ù Ó ÙÒ Ú ÐÓÖ Óº ÓÒ× Ö ÑÓ× ÙÒ ­Ù Ó Ô ØÖÓÐ Ó ÔÓÖ ÙÒ Ö ÓÐ Ó Ù ØÓ× ÕÙ ÓÑÔÖ Ò × ÐÓ× ÔÓÞÓ× ×Ø ÐÓ× Ø ÒÕÙ × ÐÐ Ò ÖÓ׺ ÆÓ× ÒØ Ö × ×Ø Ð × ­Ù Ó ÔÓÖÕÙ ÒÓ × Ø Ò Ö¿ º Ò ×Ø ×Ó¸ × ÙÒ Ð Ñ Ò Ò ÐÓ× ÐÐ Ò ÖÓ׸ ÔÙ × Ö Ò × Ö Ó Ñ ÒØ Ò Ö Ð ­Ù Ó ÙÒ Ú ÐÓÖ ×Ô ¬ Óº ÓÑÓ Ò Ö Ñ ÒØ Ö Ó Ö Ñ ÒØ Ö Ð ­Ù Ó Ò ÙÒ Ú ÐÓÖ Ó Ò ×Ø × ØÙ ÓÒ Ó Ö ÑÙ Ó × ÒØ Ó Ð Ñ ÒÓ ÙÑ ÒØÓ¸ ÔÙ × ×Ù ×Ð ÓÒ Ñ Ò ÑÓ Ø ÖÑ Ò ÙÒ ÓØ Ò Ö Ñ ÒØÓ ´Ó Ö Ñ ÒØÓµ Ð ­Ù Ó ÔÓÖ Ð Ñ ÒÓ Ò Ù ×Ø ÓÒº Ë ÑÓ׸ ÔÓÖ Ð ÔÖÓÔÓ× ÓÒ º ¸ ÕÙ × Ø Ò ÑÓ× ÙÒ Ñ ÒÓ ÙÑ ÒØÓ Ca ÓÒ Ñ Ò ÑÓ ×Ð ÓÒ × ΔC ¸ ÒØÓÒ × Ð ­Ù Ó ÔÙ a ÙÑ ÒØ Ö× Ò ÙÒ Ú ÐÓÖ x ≤ ΔC º È Ö a Ò Ö Ñ ÒØ Ö Ó Ö Ñ ÒØ Ö Ð ­Ù Ó Ò ÙÒ Ú ÐÓÖ x ÑÓ× Ò ÓÒØÖ Ö ÙÒ Ñ ÒÓ ÓÒ ×Ð ÓÒ Ñ Ò ÑÓ ΔC ≥ xº a ¿ Ð Ô ØÖÓÐ Ó¸ Ù Ò Ó × Ò Ù ÒØÖ ÒÑÓÚ Ð¸ Ø Ò ×ÓÐ ¬ Ö× º
  • 831.
    7.10. Redes deflujo 805 Ò ÓÒØÖ Ö ÙÒ Ñ ÒÓ ÙÑ ÒØÓ ÓÒ ÓÒ Ó ÕÙ ×Ù ×Ð ÓÒ Ñ Ò ÑÓ × Ñ ÝÓÖ Ó Ù Ð ÙÒ x × × Ò ÐÐÓ × ÑÔÐ ÑÓ× ÙÒ ¬ÐØÖÓ Ô Ö Ð Ø Ö ÓÖ ×Ó Ö ÐÓ× Ö Ó× ÕÙ ÒÓÖ ÐÓ× Ö Ó× ÙÝÓ ­Ù Ó Ö ×Ø ÒØ × Ñ ÒÓÖ ÕÙ xº È Ö ÐÐÓ¸ ¬Ò ÑÓ× Ð × Ù ÒØ Ð × ¬ÐØÖÓ Ð Ø Ö ÓÖ Ö Ó× ¼ ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ ¼¿ ¼ template <class N> class Flow_Filter { static typename N::Flow_Type min; typename N::Arc * operator () (typename N::Node *, typename N::Arc * arc) { return arc->cap - arc->flow >= min ? arc : NULL; } }; Ä Ð × Flow Filter<N> ¬ÐØÖ Ö Ó× ÙÝÓ ­Ù Ó Ö ×Ø ÒØ × Ñ ÒÓÖ ÕÙ Ð Ú ÐÓÖ min¿ º ר ÑÓ Ó¸ ÔÓ ÑÓ× ÔÖÓ Ö Ñ Ö Ð Ù×ÕÙ ÙÒ Ñ ÒÓ ÙÑ ÒØÓ¸ ÓÒ ÙÑ Ö Ð min¸ Ð × Ù ÒØ Ñ Ò Ö ¼ ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ ¼ ¼ template <class Net, template <class, class> class Find_Path> bool find_aumenting_path(Net & net, Path<Net> & path, const typename Net::Flow_Type & min_slack) { Flow_Filter<Net>::min = min_slack; typename Net::Node * src = net.get_source(); typename Net::Node * sink = net.get_sink(); if (not net.residual_net) net.make_residual_net(); return Find_Path<Net, Flow_Filter<Net> > () (net, src, sink, path); } Í× × Path ¼¾ º find aumenting path() Ù× ÙÒ Ñ ÒÓ ÙÑ ÒØÓ ÓÒ ×Ð ÓÒ Ñ Ò ÑÓ ×Ù¬ ÒØ Ô Ö ÙÑ ÒØ Ö Ð ­Ù Ó Ò Ð Ú ÐÓÖ min slackº Ð Ø ÔÓ Ù×ÕÙ ´ Ò ÔÖÓ ÙÒ Ó Ò ÑÔÐ ØÙ µ × ÙÒ Ô Ö Ñ ØÖÓ Ø ÔÓ Ð ÖÙØ Ò º Ë Ð Ñ ÒÓ Ü ×Ø ¸ ÒØÓÒ × Ð ÖÙØ Ò Ö ØÓÖÒ true ÐÓ ÓÒØÖ Ö Ó¸ Ö ØÓÖÒ falseº ÉÙ ×Ù × × × Ò ÓÒØÖ Ö ÙÒ Ñ ÒÓ ×¹ ÙÑ ÒØÓ Ó × ÙÒÓ ÔÓÖ Ð Ù Ð¸ Ò ÐÙ Ö ÙÑ ÒØ Ö Ð ­Ù Ó Ò ÙÒ Ú ÐÓÖ Ó¸ × ×Ñ ÒÙÝ º Ä Ø Ò × × Ñ Ð Ö¸ ÓÒ Ð ×ÙØ Ð Ö Ò ÕÙ Ð Ù×ÕÙ Ö Ð Þ Ö× × Ð ×ÙÑ ÖÓ Ð Ù ÒØ ¼ ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ ¼ ¼ template <class Net, template <class, class> class Find_Path> bool find_decrementing_path(Net & net, Path<Net> & path, const typename Net::Flow_Type & min_slack) { Flow_Filter<Net>::min = min_slack; typename Net::Node * src = net.get_source(); typename Net::Node * sink = net.get_sink(); if (not net.residual_net) ¿ ÍÒ ÔÖÓ Ð Ñ Ð × ÒÓ ×Ø Ð × × ÕÙ ÒÓ × Ö ÒØÖ ÒØ º ÙÖ ÒØ Ð Ø ÑÔÓ Ò ÕÙ ÙÒ Ð Ó¹ Ö ØÑÓ ×Ø ÑÔÐ Ò Ó Flow Filter Ð Ú Ö Ð min ÒÓ ÔÙ × Ö ÙØ Ð Þ º ÙØÙÖ × Ú Ö× ÓÒ × ALE PH Ñ Ò Ö Ò ×Ø Ô Ö Ñ ØÖÓ ÓÖÑ Ö ÒØÖ ÒØ º
  • 832.
    806 Cap´ ıtulo 7. Grafos D 4/0 E 8/0 I 4/0 K D 4/0 E 8/0 I 4/0 K 6/0 3/0 4/0 5/0 3/0 4/0 3/0 4/0 6/0 3/0 4/0 5/0 3/0 4/0 3/0 4/0 A 7/0 B 6/0 F 4/0 H 5/0 M A 7/3 B 6/3 F 4/0 H 5/0 M 5/1 5/0 3/1 5/0 7/1 6/0 4/0 6/1 5/1 5/0 3/1 5/0 7/4 6/0 4/0 6/4 C G J 5/1 L C G J 5/4 L 4/0 6/0 4/0 6/0 ´ µ slack = 1 ´ÔÖÓ ÙÒ µ ´ µ slack = 3 ´ÔÖÓ ÙÒ µ D 4/0 E 8/0 I 4/0 K D 4/4 E 8/0 I 4/0 K 6/0 3/0 4/0 5/0 3/0 4/0 3/0 4/0 6/4 3/0 4/0 5/4 3/0 4/0 3/0 4/0 A 7/3 B 6/3 F 4/0 H 5/0 M A 7/3 B 6/3 F 4/4 H 5/4 M 5/3 5/0 3/3 5/0 7/4 6/2 4/0 6/6 5/3 5/0 3/3 5/0 7/4 6/2 4/0 6/6 C G J 5/4 L C G J 5/4 L 4/0 6/0 4/0 6/0 ´ µ slack = 2 ´ ÑÔÐ ØÙ µ ´ µ slack = 4 ´ ÑÔÐ ØÙ µ ÙÖ º ¿ ÁÒ Ö Ñ ÒØÓ× ×Ù × ÚÓ× Ð ­Ù Ó Ñ ÒØ Ñ ÒÓ× ÙÑ ÒØÓ Ò ÓÒØÖ Ó× ÔÓÖ find aumenting path() net.make_residual_net(); return Find_Path<Net, Flow_Filter<Net> > () (net, sink, src, path); } Í× × Path ¼¾ º È Ö Ò Ö Ñ ÒØ Ö Ð ­Ù Ó¸ × ÑÔÐ ÙÒ Ú Ö ÒØ Ð ÖÙØ Ò increase flow()¸ ¹ × ÖÖÓÐÐ Ò Ü º½¼º½¼ ´Ô Ò ¾µ¸ ÓÒ ÙÒ Ô Ö Ñ ØÖÓ ÓÒ Ð valº Ë × × ¸ ÔÓÖ ÑÔÐÓ¸ ÙÑ ÒØ Ö Ð ­Ù Ó Ò ÙÒ Ú ÐÓÖ val ØÖ Ú × ÙÒ Ñ ÒÓ ÙÑ ÒØÓ¸ ÒØÓÒ × × ÒÚÓ increase flow(net, path, val)¸ Ð Ù Ð Ò Ö Ñ ÒØ Ð ­Ù Ó Ò val Ý ÒÓ Ò Ð ×Ð ÓÒ Ñ Ò ÑÓ pathº Ò ÐÓ Ñ ÒØ ¸ ÓØÖ ÖÙØ Ò ¸ ÐÐ Ñ decrease flow() Ð ØÖ Ó ÒÚ Ö×Ó Ó × Ö Ñ ÒØ Ö Ð ­Ù Ó Ò ÙÒ Ú ÐÓÖ valº ¼ ÙÒ ÓÒ × Ô Ö Net Graph<TNode,TArc,T> ¾ +≡ ¼ template <class Net> void increase_flow(Net & net, Path<Net> & path, const typename Net::Flow_Type & val) { // aumentar el flujo de la red por el camino de aumento for (typename Path<Net>::Iterator it(path); it.has_current_arc(); it.next()) { typename Net::Arc * arc = it.get_current_arc(); typename Net::Arc * img = (typename Net::Arc *) arc->img_arc; if (arc->cap - arc->flow < val) throw std::domain_error("minimum slack of aumenting path es smaller " "than val"); arc->flow += val; img->flow -= val;
  • 833.
    7.10. Redes deflujo 807 if (not arc->is_residual) { net.increase_out_flow(net.get_src_node(arc), val); net.increase_in_flow(net.get_tgt_node(arc), val); } else { net.decrease_in_flow(net.get_src_node(arc), val); net.decrease_out_flow(net.get_tgt_node(arc), val); } } } template <class Net> void decrease_flow(Net & net, Path<Net> & path, const typename Net::Flow_Type & val) { if (not net.residual_net) throw std::domain_error("Residual net is not created"); // decrementar el flujo de la red por el camino de decremento for (typename Path<Net>::Iterator it(path); it.has_current_arc(); it.next()) { typename Net::Arc * arc = it.get_current_arc(); typename Net::Arc * img = (typename Net::Arc *) arc->img_arc; if (arc->cap - arc->flow < val) throw std::domain_error("minimum slack of decrementing path es smaller " "than val"); arc->flow -= val; img->flow += val; if (not arc->is_residual) { net.decrease_out_flow(get_src_node(arc), val); net.decrease_in_flow(net.get_tgt_node(arc), val); } else { net.increase_out_flow(get_tgt_node(arc), val); net.increase_in_flow(net.get_src_node(arc), val); } } } Í× × Path ¼¾ º × ÑÔÓÖØ ÒØ Ñ Ò ÓÒ Ö ÕÙ Ð ÖÙØ Ò ÒÓ Ú Ö ¬ ÕÙ × ØÖ Ø ×ØÖ Ø Ñ ÒØ ÙÒ Ñ ÒÓ ÙÑ ÒØÓº ×ØÓ Ó Ö Ð ÔÓ× Ð Ò Ö Ñ ÒØ Ö Ð ­Ù Ó ÔÓÖ ÙÒ Ñ ÒÓ ÕÙ ÒÓ Ò × Ö Ñ ÒØ Ô ÖØ × Ð Ù ÒØ Ý ÐÐ Ù Ð ×ÙÑ ÖÓº Ð Ñ ×ÑÓ ÑÓ Ó¸ Ð Ñ ÒÓ ÔÙ × Ö ÙÒ ÐÓ¸ ÐÓ ÕÙ Ó Ö Ö ÒØ Ö × Ñ × Ð ÒØ Ù Ò Ó ×ØÙ ÑÓ× Ö ÙÐ ÓÒ × ´Ü º½½º ´Ô Ò ½ µµ Ý ­Ù Ó× Ñ Ü ÑÓ× Óר Ñ Ò ÑÓ ´Ü º½¾ ´Ô Ò ¾ µµº
  • 834.
    808 Cap´ ıtulo 7. Grafos 7.11 Reducciones al problema del flujo m´ximo a Ò Ð × ÓÒ Ô × ×ØÙ ÑÓ× ÙÒ × Ö Ð ÓÖ ØÑÓ× Ý ×ØÖÙ ØÙÖ ØÓ× Ø Ò ÒØ × Ö ×ÓÐÚ Ö Ð ÔÖÓ Ð Ñ Ð ­Ù Ó Ñ Ü ÑÓº Ê ×ÙÐØ ÕÙ ×Ø ÔÖÓ Ð Ñ ¸ ÕÙ Ö ÑÓ× ÒÓ ÒÓ× Ù ÑÙÝ × ÑÔÐ Ö ×ÓÐÚ Ö¸ × ÙÒ Ñ ÒØÓ ÑÓ Ð Þ ÓÒ ÒרÖÙÑ ÒØÓ ×ÓÐÙ ÓÒ ÙÒ Ú ×Ø ÒØ ÔÖÓ Ð Ñ × Ñ ×º Ò ×Ø × ÓÒ Ñ Ò ÓÒ Ö ÑÓ× Ð ÙÒ × × ØÙ ÓÒ × Ð ÑÙÒ Ó Ø ÒÓÐÓ Ó Ò ÕÙ Ð ­Ù Ó Ñ Ü ÑÓ × ÔÐ Ð ¸ ÒÙÒ Ö ÑÓ× Ú Ö ÒØ × ÔÖÓ Ð Ñ × Ö Ù Ð × Ð ­Ù Ó Ñ Ü ÑÓ Ý ×ØÙ Ö ÑÓ× ÓÒ Ð ÙÒ Ö Ó Ø ÐÐ Ð ÙÒÓ× ÐÐÓ׺ Ä Ð Ø Ö ØÙÖ Ñ Ò ÓÒ ÓÑÓ ÔÖ Ñ Ö Ú Ö ÒØ Ð Ñ Ò Ó Ú Ö Ó× Ù ÒØ × Ý ×ÙÑ ¹ ÖÓ׺ ר ÔÖÓ Ð Ñ Ù ×ØÙ Ó Ý Ö ×Ù ÐØÓ Ò Ü º½¼º¿ ´Ô Ò µº Ò Ù Ð × ÓÒØ ÜØÓ× ÔÙ Ô Ö Ö Ò ÐÓ× ÓÒØ ÜØÓ× ÙÐØÙÖ Ð ×¸ ÔÓÖ ÖÐÓ Ð ÙÒ Ñ Ò Ö ¸ × ÑÙÝ ÔÖÓ Ð ÕÙ Ð Ö Ø Ò Ú Ö Ó× Ù ÒØ × Ý ×ÙÑ ÖÓ× × ÕÙ ÔÓÖ ×Ø Ú ÒÓ× Ö ×Ùй Ø Ò ÔÖ Ø × Ð × ÔÖ Ñ Ø Ú × make super nodes() Ý unmake super nodes() ÔÖ × ÒØ × Ò Ü º½¼º¿ ´Ô Ò µº 7.11.1 Flujo m´ximo en redes no-dirigidas a Ä ÙÒ Ð ÕÙ Ó ÕÙ ­ÙÝ ÔÓÖ ÙÒ Ö ØÙ Ö × ÒÓ ×ÙÑ Ð × ÒØ Óº Ó¸ ÔÓÖ ÙÒ ØÙ Ó ÔÙ Ö ÙÐ Ö ­Ù Ó Ò Ù ÐÕÙ Ö × ÒØ Óº × Ô٠׸ ר ÒØÖÓ Ð × ÜÔ Ø Ø Ú × Ð ÑÙÒ Ó Ø ÒÓÐÓ Ó Ò ÓÒØÖ Ö × ØÙ ÓÒ × Ò Ð × Ù Ð × × × Ñ Ü Ñ Þ Ö Ð ­Ù Ó Ý ÓÒÓ Ö ×Ù× ØÙ Ö × Ö Ø × Ó × ¸ Ð ÓÖØ Ñ Ò ÑÓº Ò × ØÙ ÓÒ × ×Ø Ø ÔÓ¸ Ø Ò Ö ÑÓ× Ö Ó× ÔÓÖ ÐÓ× Ù Ð × × Ô ÖÑ × Ð Ð ­Ù Ó Ò Ñ Ó× × ÒØ Ó׺ ÍÒ Ö ÒÓ¹ Ö G =< V, E, C >¸ ÓÒ Ô ×Ó× ÒØ ÖÔÖ Ø Ð × ÓÑÓ Ô ×¸ Ø Ò ÙÒ ÕÙ Ú Ð ÒØ Ö Ó Ö ØÓ < V, E , C > ÔÓÖ Ö Ó (u, v) = e ∈ E Ô Ô(e) Ü ×Ø Ò Ó× Ö Ó× eu = (u, v) ∈ E Ý ev = (v, u) ∈ E Ñ Ó× ÓÒ Ô Ô(eu) = Ô(ev) = Ô(e)º B D B D A F s A F t C E C E ´ µ Ê ÒÓ¹ Ö ´ µ ÕÙ Ú Ð ÒØ Ö Ó ÓÒ Ù ÒØ Ý ×ÙÑ ÖÓ ÙÖ º ÕÙ Ú Ð Ò ÒØÖ ÙÒ Ö ÒÓ¹ Ö Ý ÙÒ Ö º ÍÒ ØÓ Ô Ö ÒØ Ð ØÖ Ò× ÓÖÑ ÓÒ ÒØ Ö ÓÖ × ÕÙ Ð Ö ÒÓ Ø Ò Ò Ù ÒØ Ò ×ÙÑ ÖÓº Ò ÙÒ Ö ØÙ Ö × ×Ø ÔÓ Ö Ô Ö Ö × Ö Ð ×Óº ÈÓÖ ÑÔÐÓ¸ ÓÒ× ¹ Ö ÑÓ× ÙÒ × ×Ø Ñ Ö Ö Ö ÓÒ Ò Ð Ù Ð × Ñ Ò ×Ø Ö Ñ Ü Ñ Þ Ö Ð ­Ù Ó Ð ÕÙ Ó Ö Ö Ö ÒØ ÙÒ × ×Ø Ñ Ö ÓÒ ÓÒ Ó Ó Ð ÓÒ ÔÓÖ Ø Ö Ó ÙÖÖ Ò × Ô Ö¹ Ø ÙÐ Ö ×º Ò ØÓ Ð × × ×Ø Ñ × ­Ù Ó × Ö ÕÙ Ö ÓÑ Ö Ð ­Ù Ó × Ð Ñ ÒÓ× ÙÒ ØÙ Ó Ò Ð Ô Ö ÕÙ Ð ­Ù Ó × ÓÒØ ÒÙÓ¸ × Ö ÕÙ Ö ÖÖ Ö Ð Ð ÞÓ ÓÑ Óº Ô Ö Ò Ô٠׸ Ð Ù ÒØ Ý Ð ×ÙÑ ÖÓº Ä ¬ ÙÖ º ÐÙ×ØÖ ÙÒ Ö ÒÓ¹ Ö Ý ×Ù ÕÙ Ú Ð ÒØ Ò Ö Ô Ø ÓÒ ÙÒ Ù ÒØ s × ÓÒ × ÒÚ Ö ÙÒ ­Ù Ó Ò Ð¸ Ý
  • 835.
    7.11. Reducciones alproblema del flujo m´ximo a 809 ÙÒ ×ÙÑ ÖÓ ÔÓÖ ÓÒ × Ö Ó Ö Ð ­Ù Ó Ô Ö ÓÑ ÖÐÓ ÒÙ ÚÓº Ð ÐÓ× Ú ÐÓÖ × Ô × ÐÓ× Ö Ó× × Ð Ù ÒØ Ý Ð ×ÙÑ ÖÓ Ò ÓÖÖ ×ÔÓÒ Ö× ÓÒ Ð Ô ­Ù Ó ×ÔÓÒ Ð Ð Ù Ð ÔÙ × Ö Ñ ÝÓÖ ÕÙ Ð Ú ÐÓÖ ­Ù Ó Ñ Ü ÑÓ ÕÙ ÔÙ Ö ÙÐ Ö ÔÓÖ Ð Ö º Ä Ú Ð ÞÑ Ø Ñ Ø Ð ÕÙ Ú Ð ÒØ × Ð ÑÓ×ØÖ Öº Ù ÐÕÙ Ö ­Ù Ó Ö ÙÐ ÒØ ÔÓÖ Ð Ö ÒÓ¹ Ö ÔÙ Ô Ö Ø Ñ ÒØ Ö ÙÐ Ö ÔÓÖ Ð Ö ÕÙ Ú Ð ÒØ Ò × ×Ó ÙÒÓ ÐÓ× Ó× Ö Ó× Ò Ð Ö Ö Ø Ò Ú ÐÓÖ ­Ù Ó ÖÓº ÚÓÐÚ Ö× Ð Ö Ð Ö Ó ÒÓ × ÔÖÓ Ð Ñ Ø Óº ËÙÔÓÒ ÑÓ× Ù ÐÕÙ Ö Ô Ö Ö Ó× u → v Ý v → u ÓÒ Ú ÐÓÖ × ­Ù Ó f(u → v) Ý f(v → u)¸ Ö ×Ô Ø Ú Ñ ÒØ º Ë f(u → v) > f(v → u) ÒØÓÒ × f(u ↔ v) = f(u → v) − f(v → u) Ý Ð ­Ù Ó Ú Ò Ð × ÒØ Ó u → v ÐÓ ÓÒØÖ Ö Ó¸ f(u ↔ v) = f(v → u) − f(u → v) Ý Ð ­Ù Ó Ú Ò Ð × ÒØ Ó v → uº ÈÙ ×ØÓ ÕÙ ×Ø × Ö Ù ÓÒ × ×ÓÒ Ö Ð Þ Ð × Ñ ÒØ Ð × ÒØ Ö × ÐÓ× Ì List Graph<Node, Arc> Ý Net Graph<TNode,TArc,T>¸ ר × ×ÓÒ Ð × Ò Ö ¹ Ó׺ 7.11.2 Capacidades en nodos ÍÒ × ØÙ ÓÒ Ø ÒÓÐÓ Ñ ÒØ ×Ô Ö Ð ¸ Ô ÖÓ Ø Ñ Ò¸ ÙØ Ð Ô Ö Ð ÙÒ × × ØÙ ÓÒ × ÑÓ Ð Þ ÓÒ¸ × Ð ÓÒ× Ö Ö Ô × Ò ÐÓ× ÒÓ Ó׺ Ò ×Ø ×Ó¸ ÙÒ Ú ÐÓÖ Ô ÒÓ Ó Ò ÙÒ ­Ù Ó Ñ Ü ÑÓ ÕÙ ×Ø ÔÙ Ö Öº Ä ¬ ÙÖ º ¹ ÑÙ ×ØÖ ÙÒ ÑÔÐÓº B‘ 4 B“ 3 E‘ 4 E“ 3 4 5 3 2 B,4 E,4 5 A‘ 8 A“ 3 D‘ 3 D“ G‘ 6 G“ 3 4 4 2 A,8 3 D,3 4 G,6 1 2 2 1 5 2 5 2 C,3 4 F,5 C‘ 3 C“ 4 F‘ 5 F“ ´ µÊ ÓÒ Ô × Ò ÐÓ× ÒÓ Ó× ´ µÊ Ô Ø ÕÙ Ú Ð ÒØ ÙÖ º ÑÔÐÓ ÙÒ Ö ÓÒ Ô Ò ÐÓ× ÒÓ Ó× Ý ×Ù ÕÙ Ú Ð ÒØ ÙÒ Ö ØÖ ÓÒ Ðº ÍÒ Ö ÓÒ Ô × Ò ÐÓ× ÒÓ Ó× ÔÙ ØÖ Ò× ÓÖÑ × ÙÒ Ö ØÖ ÓÒ Ð Ñ ÒØ Ð Ñ ØÓ Ó × Ù ÒØ Algoritmo 7.7 Conversi´n de una red con capacidades en los nodos a una red o tradicional Ä ÒØÖ × ÙÒ Ö → =< V, E, → s, t > ÓÒ Ô − G C, − × Ò ÐÓ× ÒÓ Ó׺ Ä × Ð × ÙÒ Ö ØÖ ÓÒ Ð N G =< V , E , C , s, t >º ½º ∀u ∈ V Ô ÖØ ÓÒ Ò Ó× ÒÓ Ó× u Ý u | u , u ∈ V º ÈÓÖ Ô ÖØ ÓÒ¸ Ò E ÙÒ Ö Ó u → u ∈ E ÓÒ Ô Ô(u →u )= Ô(u)º ¾º ∀e = (u → v) ∈ E × ÓÖÖ ×ÔÓÒ ÓÒ e = (u → v ) ∈ E º
  • 836.
    810 Cap´ ıtulo 7. Grafos Ä ¬ ÙÖ º ¹ ÑÙ ×ØÖ Ð ÕÙ Ú Ð ÒØ × ÙÒ Ð Ñ ØÓ Ó Ð Ö Ð ¬ ÙÖ º ¹ º Ä Ð ÓØ ÓÒØ Ò ÙÒ ÑÔÐ Ñ ÒØ ÓÒ ×Ø ×ÕÙ Ñ ÐÐ Ñ ¸ Net Cap Graph<TNode,TArc,T>¸ ÓÒØ Ò Ò Ð Ö ÚÓ tpl netcapgrah.Hº 7.11.3 Flujo realizable Ò Ð ÙÒ × Ö ÙÒר Ò × × Ö ÕÙ Ö Ò ÔÖÓÚ × ÓÒ × ­Ù Ó × Ö¸ Ð ÙÒÓ× ÒÓ Ó× Ð Ö Ö ÕÙ Ö Ò Ö Ö ÙÒ ÒØ ×Ô ¬ ­Ù Óº × ÔÓ× Ð ¸ Ø Ñ Ò¸ ÕÙ ÓØÖÓ× ÒÓ Ó× ÔÖÓÚ Ò ­Ù Óº ËÙÔÓÒ ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ ÙÒ Ö ØÖ Ò×ÔÓÖØ Ý Ð Ö Ð Þ ÓÒ Ú ÒØÓ Ü Ô ÓÒ Ð¸ Ø Ð ÓÑÓ ÙÒÓ× Ù Ó× ÔÓÖØ ÚÓ׸ ÕÙ Ñ Ð × Ñ Ò ×º ÓÑÓ Ð Ö Ú Ð × Ù × Ò Ó Ð Ñ ×Ñ ¸ Ð ØÓÔÓÐÓ Ð Ö ÒÓ Ñ ¸ Ô ÖÓ Ð ÒØ Ö × × ×Ø Ò Ý ×Ô Ö× ÓÒ Ó Ö ¬ ÐÓ× ÐÙ Ö × Ð × ÓÑÔ Ø ÓÒ × ØÖ Ò× ÓÖÑ Ð × Ñ Ò ×º Ò × ØÙ ÓÒ × ×Ø Ø ÔÓ¸ ×Ù Ð ÙÑ ÒØ Ö× Ð Ô ØÖ Ò×ÔÓÖØ ØÖ Ý Ò Ó Ù× × ÓÒ Ð ×¸ Ô Ö ÒÙ ×ØÖ × ØÙ ÓÒ ÑÔÐÓº Ë ØÙ ÓÒ × ÓÑÓ Ð ÕÙ ÑÓ× × Ö Ö ÔÙ Ò ÑÓ Ð Þ Ö× ÓÐÓ Ò Ó ×Ó Ö ÐÓ× ÒÓ Ó× Ú ÐÓÖ × Ñ Ò Ý ÔÖÓÚ × ÓÒº ÍÒ Ú ÐÓÖ ÔÓ× Ø ÚÓ Ò ÕÙ Ð ÒÓ Ó ÔÙ ×ÙÔÐ Ö Ò ­Ù Ó Ð Ú ÐÓÖ Ò Ù ×Ø ÓÒ ÙÒ Ú ÐÓÖ Ò Ø ÚÓ × Ò ¬ ÙÒ Ñ Ò ­Ù Ó × Ö¸ Ò Ð ÒÓ Ó Ò Ù ×Ø ÓÒ × Ö ÕÙ Ö Ö Ö Ð ­Ù Ó Ñ Ò Óº ר Ð × Ö × Ð ÒÓÑ Ò Ö Ô Ø ÓÒ ÔÖÓÚ × ÓÒ ­Ù Ó º 4 5 8 8 10 B,-8 F,8 K,8 B F K 20 A,20 C,-6 E,10 L,4 P,-19 A C E L P 19 D,-4 G,-8 M,5 D G M 8 6 8 4 ´ µÊ Ñ Ò »ÔÖÓÚ × ÓÒ ´ µÊ Ô Ø ÕÙ Ú Ð ÒØ ÙÖ º ÑÔÐÓ ÕÙ Ú Ð Ò ÒØÖ Ö Ñ Ò »ÔÖÓÚ × ÓÒ Ý ÙÒ Ö Ô ¹ Ø º Ë ÓÑ Ø Ò Ð × Ô × ÐÓ× Ö Ó× Ò Ð Ö ÓÖ Ò Ð Ý Ò Ð ÕÙ Ú Ð ÒØ ר ÙÐØ Ñ ÑÙ ×ØÖ Ô × ÕÙ Ú Ð ÒØ × ÔÖÓÚ × ÓÒ ×º ÅÓ ÐÓ× ×Ø Ð × ÒÓ ×ÓÒ Ô Ö Ò Ü Ô ÓÒ Ð ×º Ò ×Ø × Ö ÙÒר Ò × Ð ÔÖ ÙÒØ ÒØ Ö × × Ú Ö Ù Ö × × ÔÙ Ó ÒÓ × Ø × Ö Ð × Ñ Ò × Ò ÙÒ ÓÒ Ð × ÔÓ× Ð × ÔÖÓÚ × ÓÒº ÍÒ Ö ×ÔÙ ×Ø Ò Ø Ú ¸ ÑÓ×ØÖ Ø Ú ¸ Ò Ö ÕÙ Ý ÕÙ Ò ÓÒØÖ Ö Ñ × ÔÖÓÚ × ÓÒ¸ Ñ ÒØÖ × ÕÙ ÙÒ ¬ÖÑ Ø Ú ÕÙ ÓÒ Ð ÔÖÓÚ × ÓÒ Ò Ö ×ØÖÙ ØÙÖ × × ÔÙ Ò × Ø × Ö Ð × Ñ Ò ×º Ë Ð Ö ×ÔÙ ×Ø × ¬ÖÑ Ø Ú ¸ ÒØÓÒ × ÑÓ× ÕÙ Ü ×Ø ÙÒ ­Ù Ó Ö Ð Þ Ð ¸ ÔÙ × ØÓ Ó× ÐÓ× ÒÓ Ó× Ñ Ò ÔÙ Ò Ó Ø Ò Ö ×Ù ­Ù Ó Ö ÕÙ Ö Ó ÐÓ ÓÒØÖ Ö Ó¸ ÑÓ× ÕÙ Ð ­Ù Ó × ÖÖ Ð Þ Ð Ó ÕÙ ÒÓ Ü ×Ø Ð Ö Ð Þ Ð º ÓÑÓ × Ö × Ü ×Ø ÙÒ ­Ù Ó Ö Ð Þ Ð Ë Ò ×ÓÖÔÖ × ¸ Ð Ö ×ÔÙ ×Ø ÒÓ× Ð Ð
  • 837.
    7.11. Reducciones alproblema del flujo m´ximo a 811 Ð ÙÐÓ Ð ­Ù Ó Ñ Ü ÑÓ ×Ó Ö ÙÒ Ö ÕÙ Ú Ð ÒØ º Ò ÔÖ Ò Ô Ó¸ ÔÓ ÑÓ× Ð ÙÐ Ö Ð ­Ù Ó Ñ Ü ÑÓ Ý ÐÙ Ó Ú Ö ¬ Ö × ×Ø × Ø × Ð × ÔÖÓÚ × ÓÒ × ×º Ë Ò Ñ Ö Ó¸ × Ò ÓÒØÖ ÑÓ× ÒÓ Ó× ÓÒ ÐÐ × ÔÖÓÚ × ÓÒ ×¸ Ô ÖØ ÙÐ ÖÑ ÒØ Ò Ñ Ò ×¸ ÒÓ ÔÓ ÑÓ× ÓÒ ÐÙ Ö ÕÙ ÒÓ Ü ×Ø ÓØÖÓ ­Ù Ó Ñ ÒÓÖ ÕÙ × Ö Ð Þ Ð º Ä ×ÓÐÙ ÓÒ × ØÖ Ò× ÓÖÑ Ö Ð Ö ÙÒ ÕÙ Ú Ð ÒØ Ý ×Ó Ö ÐÐ Ð ÙÐ Ö Ð ­Ù Ó Ñ Ü ÑÓº ÍÒ Ö Ô Ø ÓÒ ÔÖÓÚ × ÓÒ ­Ù Ó Ø Ò ÙÒ ÕÙ Ú Ð ÒØ Ò ÙÒ Ö Ô Ø º Ä ÕÙ Ú Ð Ò ÓÒ× ×Ø Ò Ò Ö ÙÒ ×ÙÔÖ ¹ Ù ÒØ Ý ÙÒ ×ÙÔÖ ¹×ÙÑ ÖÓº × Ð ×ÙÔÖ ¹ Ù ÒØ Ñ Ò Ò Ö Ó× ÐÓ× ÒÓ Ó× ÔÖÓÚ ÓÖ × ÓÒ Ô Ù Ð Ð Ú ÐÓÖ ÔÖÓÚ × ÓÒº À Ð ×ÙÔÖ ¹×ÙÑ ÖÓ Ò Ò Ö Ó× × ÐÓ× ÒÓ Ó× Ñ Ò ÒØ × ÓÒ Ô ÙÐ Ð ­Ù Ó Ñ Ò Óº Ò Ð Ö ÕÙ Ú Ð ÒØ ÒÓ × Ò × Ö Ó ÓÐÓ Ö Ú ÐÓÖ × ÔÖÓÚ × ÓÒ¸ ÔÙ × ×ØÓ× ×Ø Ò ÜÔÖ × Ó× Ò Ð × Ô × ÐÓ× Ö Ó× ÒØÖ ×ÙÔÖ ¹ Ù ÒØ Ý Ð ×ÙÔÖ ¹ ×ÙÑ ÖÓ¸ Ö ×Ô Ø Ú Ñ ÒØ º ÍÒ Ö ÓÒ ÔÖÓÚ × ÓÒ ­Ù Ó × Ö Ð Þ Ð × Ð ­Ù Ó Ñ Ü ÑÓ Ð Ö ÕÙ Ú Ð ÒØ ÐÓ Ö ÐÐ Ò Ö ØÓ Ó× ÐÓ× Ö Ó× Ò Ó× × Ö¸ ÐÓ× ÕÙ Ñ Ò Ò × Ð ×ÙÔÖ ¹ Ù ÒØ Ý ÐÓ ÕÙ ÐÐ Ò Ð ×ÙÔÖ ¹×ÙÑ ÖÓº Ò Ð ÙÒÓ× ×Ó׸ × ÔÓ× Ð × Ö ÕÙ Ð ­Ù Ó × ÖÖ Ð Þ Ð × Ð Ô × Ð ÒØ Ð ×ÙÔÖ ¹ Ù ÒØ × ×Ø ÒØ Ð ÒØÖ ÒØ ÔÓÖ Ð ×ÙÔÖ ¹×ÙÑ ÖÓº ×ØÓ × Ó Ð ÓÒ ÓÒ ÓÒ× ÖÚ ÓÒ Ð ­Ù Ó Ý × Ð ×Ó Ô Ö Ð Ö ÑÔÐÓ Ð ¬ ÙÖ º ¹ ¸ Р٠и Ô Ö Ð Ö ÕÙ Ú Ð ÒØ Ð ¬ ÙÖ º ¹ Ø Ò ÙÒ Ô × Ð ÒØ Ð ×ÙÔÖ ¹ Ù ÒØ 55 Ñ ÒØÖ × ÕÙ Ð ÒØÖ ÒØ Ð ×ÙÔÖ ¹×ÙÑ ÖÓ × 45º ר ÓÒÓ Ñ ÒØÓ × Ú × Ð × Ð Ö ÓÖ Ò Ð¸ Ò Ð × ÒØ Ó ÕÙ Ô Ö ÕÙ Ð ­Ù Ó × Ö Ð Þ Ð ¸ Ð ØÓØ Ð ÔÖÓÚ × ÓÒ Ø Ò ÕÙ × Ö Ñ ÝÓÖ Ó Ù Ð Ð Ñ Ò ¸ Ô ÖÓ ÐÓ ÓÒØÖ Ö Ó ÒÓ Ò × Ö Ñ ÒØ × ÖØÓ ÔÓÖ ×Ó¸ × Ð ÔÖÓÚ × ÓÒ × Ñ ÝÓÖ Ó Ù Ð Ð Ñ Ò × Ò × Ö Ó Ð ÙÐ Ö Ð ­Ù Ó Ñ Ü ÑÓ ×Ó Ö Ð Ö ÕÙ Ú Ð ÒØ Ô Ö Ö ×ÔÓÒ Ö × Ð ­Ù Ó × Ó ÒÓ Ö Ð Þ Ð º Ò ÙÒ × ØÙ ÓÒ ­Ù Ó ÖÖ Ð Þ Ð ¸ Ð ÓÖØ Ñ Ò ÑÓ ÒÓ× ÒØ ¬ ÓØÖÓ× ÔÙÒØÓ× ÔÓÖ ÓÒ ÔÙ ÙÑ ÒØ Ö× Ð ÔÖÓÚ × ÓÒ Ó¸ Ò ×Ù ÑÔÓ× Ð ¸ Ö Ù Ö× Ó Ö Ö ÓÒ Ö× Ð ÑÒ º Ø ÒÓÖ Ð ­Ù Ó Ö Ð Þ Ð ¸ Ò Ð Ð ÓØ × ÒרÖÙÑ ÒØ Ð Net Sup Dem Node¸ ×¹ Ô ¬ Ó Ò Ð Ö ÚÓ tpl net sup dem.Hº Ë Ò Ñ Ö Ó¸ ÑÙ × Ú × × ÔÖ Ö Ð ÔÐ Ö Ð Ø Ò Ò Ð ÓÒØ ÜØÓ Ð ÔÖÓ Ð Ñ ¸ Ò ÐÙ Ö ÑÔÐ Ö ×Ø Ì º 7.11.4 M´ximo emparejamiento bipartido a ÓÒ× Ö ÑÓ× n Ô Ö×ÓÒ × Ý n Ø ÔÓ× ØÖ Ó׺ È Ö Ô Ö×ÓÒ ¸ × Ø Ò ÙÒ Ð ×Ø ÔÓ× Ð × ØÖ Ó× Ó¸ Ò ÐÓ Ñ ÒØ ¸ ÔÓÖ ØÖ Ó × Ø Ò ÙÒ Ð ×Ø Ô Ö×ÓÒ × ÕÙ ÔÙ Ò ÖÐÓº Ü ×Ø ÙÒ × Ò ÓÒ Ô Ö×ÓÒ × ØÖ Ó× ÕÙ Ù Ö ØÓ Ó× ÐÓ× ØÖ Ó× Ý Ô Ö×ÓÒ × Ë Ü ×Ø ¸ Ù Ð × × ÒÓ Ü ×Ø ¸ Ù Ð × Ð × Ò ÓÒ ÕÙ Ù Ö Ð Ñ ÝÓÖ ÒØ Ô Ö×ÓÒ × Ó ØÖ Ó× ×Ø ÔÖÓ Ð Ñ ¸ ØÖ ÓÒ ÐÑ ÒØ ÓÒÓ Ó ÓÑÓ Ð × Ò ÓÒ ¸ ÓÒר ØÙÝ Ð Ú ¹ Ö ÒØ Ñ × × ÑÔÐ ÙÒ Ñ Ð ÔÖÓ Ð Ñ × Ñ × Ò Ö Ð ÕÙ ØÖ Ø Ö ÑÓ× Ñ × Ð ÒØ º ÈÓÖ ÐÓ× ÑÓÑ ÒØÓ׸ × Ñ Ò ×Ø Ö ÒØÖÓ Ù Ö Ð ÙÒ × ¬Ò ÓÒ × ÓÖÑ Ð ×º Definici´n 7.21 (Emparejamiento) o Ó ÙÒ Ö Ó G =< V, E >¸ ÙÒ ÑÔ Ö Ñ ÒØÓ × ÙÒ ×Ù ÓÒ ÙÒØÓ Ö Ó× M ⊂ E Ø Ð ÕÙ ÒÓ Ü ×Ø Ò Ó× Ö Ó× Ò M ÕÙ Ò Ò ×Ó Ö ÙÒ ÒÓ Ó ÓÑÙÒº ÍÒ emparejamiento es de cardinalidad m´xima a × |M| × Ñ Ü ÑÓ × Ö¸ × Ò ÐÙÝ Ð Ñ ÝÓÖ ÒØ Ö Ó׺
  • 838.
    812 Cap´ ıtulo 7. Grafos -6 0 -4 0 -6 0 -4 0 D 6/0 E 8/0 I 4/0 K D 6/6 E 8/4 I 4/4 K 6/6 3/3 4/0 5/3 3/0 4/0 3/0 4/0 6/6 3/3 4/0 5/5 3/0 4/0 3/0 4/4 0 0 -5 0 -15 0 0 -5 0 -15 A 7/1 B 1/1 F 1/0 H 5/0 M A 7/1 B 1/1 F 1/1 H 5/3 M 5/3 5/0 3/3 5/2 7/0 6/0 4/0 6/0 5/3 5/0 3/3 5/0 7/2 6/6 4/2 6/6 0 -4 0 -3 0 -4 0 -3 C G J 5/0 L C G J 5/2 L 4/0 6/0 4/0 6/0 ´ µ ÐÙ Ó Ñ Ü ÑÓ ×Ó Ö Ö ÜØ Ò ´ µ ÐÙ Ó Ñ Ü ÑÓ -6 0 -4 0 -6 0 -4 0 D 6/3 E 8/7 I 4/3 K D 6/6 E 8/4 I 4/4 K 9/9 9/9 4/0 5/5 3/0 4/0 3/0 4/3 9/6 9/5 4/2 5/5 3/0 4/0 3/0 4/4 0 0 -5 0 -15 0 0 -5 0 -15 A 7/7 B 8/7 F 1/0 H 5/0 M A 7/3 B 8/4 F 1/1 H 5/5 M 5/3 5/0 11/5 5/5 7/1 6/6 4/0 6/3 5/1 5/1 11/6 5/4 7/5 6/5 4/4 6/6 0 -4 0 -3 0 -4 0 -3 C G J 5/0 L C G J 5/5 L 4/2 6/1 4/4 6/0 ´ µ ÐÙ Ó Ñ Ü ÑÓ ×Ó Ö Ö ÜØ Ò ´ µ ÐÙ Ó Ñ Ü ÑÓ ÙÖ º Ó× ÑÔÐÓ× ­Ù Ó Ö Ð Þ Ð ×Ó Ö Ñ Ò ×º Ä ¬ ÙÖ ´ µ ÑÙ ×ØÖ ÙÒ ­Ù Ó Ñ Ü ÑÓ ÓÒ ÓÖØ Ñ Ò ÑÓ ×Ó Ö Ð Ö ÜØ Ò ÕÙ ÒÓ × Ø × Ð × ÔÖÓÚ × ÓÒ × ÐÙ Ó Ò Ð ¬ ÙÖ ´ µ¸ Ð ­Ù Ó Ñ Ü ÑÓ Ð Ö ÕÙ ÑÙ ×ØÖ ÙÒ ­Ù Ó Ñ Ü ÑÓ Ò× Ø × ØÓÖ Óº Ð Ò Ð × × Ð ÓÖØ Ñ Ò ÑÓ¸ × Ò Ö Ñ ÒØ Ò Ô × Ò ÐÓ× Ö Ó× Ð ÓÖØ ¸ ÐÓ ÕÙ ÓÒ Ù ÙÒ ­Ù Ó Ö Ð Þ Ð ¸ Ø ÒØÓ Ò Ð Ö ÜØ Ò ÑÓ×ØÖ Ò Ð ¬ ÙÖ ´ µ¸ ÓÑÓ Ò Ð Ö × ÑÔÐ ÑÓ×ØÖ Ò Ð ¬ ÙÖ ´ µº ÍÒ emparejamiento es bipartido × Ð Ö Ó × Ô ÖØ Óº ÍÒ emparejamiento es perfecto × × Ò ÐÙÝ ØÓ Ó× ÐÓ× ÒÓ Ó× Ð Ö Óº Ù Ò Ó Ø Ò ÑÓ× ÙÒ Ö Ó ÓÒ Ô ×Ó׸ ÙÒ emparejamiento es m´ximo × Ð ×ÙÑ a ÐÓ× Ô ×Ó× ÐÓ× Ö Ó× M × Ñ Ü Ñ º Ë Ñ ØÖ Ñ ÒØ ¸ es m´ ınimo × Ð ×ÙÑ × Ñ Ò Ñ º × Ò Ö n Ô Ö×ÓÒ × n ØÖ Ó× ÔÙ Ö ×ÓÐÚ Ö× Ñ ÒØ ÙÒ Ö Ó Ô ÖØ Ó ÕÙ ÑÓ Ð Ð × Ö Ð ÓÒ × ÒØÖ Ð × Ô Ö×ÓÒ × Ý ÐÓ× ÔÓ× Ð × ØÖ Ó× Ø Ð ÓÑÓ Ð ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ º ¹ º Ð ÑÔ Ö Ñ ÒØÓ Ö Ò Ð Ñ Ü Ñ ÒÓ× ÔÖÓÔÓÖ ÓÒ Ð × Ò ÓÒ ÕÙ Ñ × Ù Ö Ô Ö×ÓÒ × Ý ØÖ Ó׺ ÈÙ ×ØÓ ÕÙ Ø Ö Ò Ñ ÒØ Ð ÔÖÓ Ð Ñ Ð × Ò ÓÒ¸ Ó × ¸ ÜÔÐÓÖ Ö ØÓ × Ð × ÓÑ Ò ÓÒ × ÔÓ× Ð × ÑÔ Ö Ñ ÒØÓ¸ Ú Ò ÒØÖ Ø Ð ¸ ÕÙ Þ ×Ø × Ð ÔÖ Ñ Ö × ØÙ ÓÒ Ò Ð ÕÙ ÔÓ ÑÓ× ÔÖ Ö Ð ÔÓØ Ò Ð Ð Ø ÓÖ Ö × ­Ù Ó Ò Ð Ö ×ÓÐÙ ÓÒ ÔÖÓ Ð Ñ × ×Ó Ö Ö Ó׺ ÍÒ Ö Ó Ô ÖØ Ó ×Ó Ö Ð Ù Ð × ÑÓ× Ò ÓÒØÖ Ö ÙÒ ÑÔ Ö Ñ ÒØÓ Ö ÒÐ Ñ Ü Ñ ÔÙ ÑÓ Ð Þ Ö× Ñ ÒØ ÙÒ Ö ­Ù Óº ÖÓ××Ó ÑÓ Ó¸ Ð ÔÖÓ Ñ ÒØÓ × Ð × Ù ÒØ Algoritmo 7.8 (Transformaci´n de un grafo bipartido a una red de flujo) o
  • 839.
    7.11. Reducciones alproblema del flujo m´ximo a 813 L R ´ µ ÍÒ ÑÔ Ö Ñ ÒØÓ ÒÓ ¹ ´ µ ÍÒ ÑÔ Ö Ñ ÒØÓ Ô ÖØ Ó Ô ÖØ Ó ÙÖ º ÑÔÐÓ× ÑÔ Ö Ñ ÒØÓº ÄÓ× Ö Ó× Ð ÑÔ Ö Ñ ÒØÓ ×ÓÒ Ö × ÐØ Ó׺ ÒØÖ ÙÒ Ö Ó Ô ÖØ Ó G =< V, E > | V = L ∩ R ´L Ý R ×ÓÒ ÐÓ× ÓÒ ÙÒØÓ× Ð Ô ÖØ ÓÒµº ËÐ ÙÒ Ö Ô Ø → =< V , E , C, s, t > ÕÙ Ú Ð ÒØ ×Ó Ö Ð Ù Ð ÔÙ − G Ð ÙÐ Ö× ÙÒ ÑÔ Ö Ñ ÒØÓ Ö ÒÐ Ñ ÜÑ º ½º V = V ∪ {s} ∪ {t}º ¾º ∀e = (u, v) ∈ E =⇒ E = E ∪ {(u, v)} | Ô(e) = 1º ¿º ∀u ∈ L =⇒ E = E ∪ {(s, u)} | Ô((s, u)) = 1º º ∀u ∈ R =⇒ E = E ∪ {(u, t)} | Ô((u, t)) = 1º ÙÖ º Ö Ó Ö Ó ÕÙ Ú Ð ÒØ Ð Ð ¬ ÙÖ º ¹ 7.11.4.1 Flujo m´ximo y emparejamiento bipartido a Ä ØÖ Ò× ÓÖÑ ÓÒ ÒØ Ö ÓÖ ÒÓ× Ó Ö ÙÒ Ö Ô Ø ¸ ÙÝÓ ­Ù Ó Ñ Ü ÑÓ ÒÓ× ÖÖÓ ¸ Ùר Ñ ÒØ ¸ ÙÒ Ö Ò Ð Ù Ð ×Ù× Ö Ó× × ØÙÖ Ó× ÓÒ ÓÖÑ Ò ÙÒ ÑÔ Ö Ñ ÒØÓ Ö ÒÐ Ñ ÜÑ º ÌÓ Ó× ÐÓ× Ö Ó× Ð ØÖ Ò× ÓÖÑ ÓÒ Ø Ò Ò Ô 1º ÌÓ Ó ÒÓ Ó Ò L Ø Ò ¹ Ô ÒØÖ 1 Ý Ô ×Ð Ù Ð Ð ÒÙÑ ÖÓ Ö Ó× ÕÙ × ÓÒ Ø Ò ÓÒ Rº Ë Ñ ØÖ Ñ ÒØ ¸ ØÓ Ó ÒÓ Ó Ò R Ø Ò Ô ÒØÖ Ù Ð Ð ÒÙÑ ÖÓ Ö Ó× ÒØÖ Ý Ô × Ð 1º Ð Ö Ñ ÒØ ¸ Ð Ñ Ü ÑÓ ­Ù Ó ×Ø Ö ×
  • 840.
    814 Cap´ ıtulo 7. Grafos Ù Ð |L| = |R| Ó × ¸ Ð ÒÙÑ ÖÓ Ö Ó× × Ð Ð Ù ÒØ Ó Ð ÒØÖ Ð ×ÙÑ ¹ ÖÓº ÍÒ Ñ ÒÓ ÙÑ ÒØÓ Ù ÐÕÙ Ö ¸ ÙÝÓ ×Ð ÓÒ Ñ Ò ÑÓ × ÑÔÖ × 1¸ × Ù Ö ÙÒ × Ò ÓÒ (u, v) | u ∈ L, v ∈ Rº Ù Ò Ó Ð Ñ ÒÓ ÙÑ ÒØÓ × Ò Ö Ñ ÒØ ¸ ÐÓ× ÒÓ Ó× u Ý v ÕÙ Ò Ò ÓÒ ÜÓ× Ò Ð Ö Ö × Ù Ðº Ð ÒÓ Ó u × Ò × Ð × Ð Ù ÒØ s Ý t × Ò × Ð × vº ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ù ÐÕÙ Ö ÔÖÓÜ ÑÓ Ñ ÒÓ ÙÑ ÒØÓ ÒÓ ÓÒØ Ò Ö Ò u Ò vº ÍÒ Ú Þ ÕÙ ÒÓ Ü ×Ø Ò Ñ × Ñ ÒÓ× ÙÑ ÒØÓ¸ Ð ­Ù Ó × Ñ Ü ÑÓ ´ÔÖÓÔÓ× ÓÒ Ü º½¼ ´Ô Ò ¿µµº ÈÙ ×ØÓ ÕÙ Ð ­Ù Ó × Ñ Ü ÑÓ Ý ÐÓ× Ö Ó× Ø ÒÒ Ô × ÙÒ Ø Ö ×¸ Ð ÒØ Ö Ó× ÓÒ ­Ù Ó ÙÒ Ø Ö Ó ÕÙ Ú Ò × L R × Ñ Ü Ñ º Ð ÑÔ Ö Ñ ÒØÓ Ö ÒÐ Ñ Ü Ñ ×Ø Ó ÔÓÖ ÕÙ ÐÐÓ× Ö Ó× ÒØÖ L Ý R ÙÝÓ ­Ù Ó × ÙÒ Ø Ö Óº 7.11.4.2 An´lisis del emparejamiento bipartido por flujo m´ximo a a Ä ÙÖ ÓÒ Ð Ð ÙÐÓ Ð ÑÔ Ö Ñ ÒØÓ Ô ÖØ Ó × Ð ×ÙÑ ÙÖ ÓÒ × Ð Ð Ó¹ Ö ØÑÓ º ¸ ÐÙ Ó Ð Ñ Ü Ñ Þ ÓÒ Ð ­Ù Ó Ý¸ ¬Ò ÐÑ ÒØ ¸ Ð Ö ÓÒÓ Ñ ÒØÓ ÐÓ× Ö Ó× ÕÙ Ô ÖØ Ò Ò Ð ÑÔ Ö Ñ ÒØÓº ÔÐ Ö Ð Ð ÓÖ ØÑÓ º ×Ó Ö ÙÒ Ö Ó Ô ÖØ Ó Ô Ö Ó Ø Ò Ö Ð Ö ÕÙ Ú Ð ÒØ ×Ó Ö Ð Ù Ð Ñ Ü Ñ Þ Ö Ð ­Ù Ó ØÓÑ O(E) Ô ×Ó× Ð Ñ ×Ñ ÓÑÔÐ × Ö ÕÙ Ö Ô Ö Ö ÓÒÓ Ö ÐÓ× Ö Ó× Ð ÑÔ Ö Ñ ÒØÓ ÐÙ Ó Ñ Ü Ñ Þ Ó Ð ­Ù Óº Ò Ù ÒØÓ Ð ÙÖ ÓÒ Ð Ñ Ü Ñ Þ ÓÒ ­Ù Ó¸ ÑÓ× Ó × ÖÚ Ö ÕÙ Ð × ÙÖ ¹ ÓÒ × ÐÓ× Ð ÓÖ ØÑÓ× ×ØÙ Ó× Ù ÖÓÒ Ù × Ô Ö ÐÓ× Ô ÓÖ × ×Ó׸ ÓÒ× Ö Ò Ó ØÓÔÓÐÓ × Ö ØÖ Ö ×¸ ÐÓ Ù Ð ÒÓ × Ð × ØÙ ÓÒ ÙÒ Ö Ó Ô ÖØ Ó¸ Ò Ñ ÒÓ× ÙÒ Ð Ð Ö ÕÙ Ú Ð ÒØ º ÓÒ× Ö ÑÓ× Ð Ð ÓÖ ØÑÓ ÓÖ ¹ ÙÐ Ö×ÓÒ Ó ÑÓÒ ×¹Ã ÖÔ ÙØ Ó ×Ó Ö Ð Ö ÕÙ Ú Ð ÒØ ÙÒ Ö Ó Ô ÖØ Óº Ò Ò Ö Ð¸ Ð ÙÖ ÓÒ ×Ø ÔÓÖ NO(E)¸ ÓÒ N ÓÒר ØÙÝ Ð ÒØ Ñ ÒÓ× ÙÑ ÒØÓ Ð Ö Ö Ù º Ð Ö Ñ ÒØ ¸ Ò Ð ×Ó Ð Ö ØÖ Ò× ÓÖÑ ×Ó Ö Ð Ö Ó Ô ÖØ Ó¸ V Ö Ó× × ×ØÖ ÙÝ Ò ÒØÖ ÐÓ× Ö Ó× ×Ð Ð Ù ÒØ Ý ÐÓ× ÒØÖ Ð ×ÙÑ ÖÓº ÈÙ ×ØÓ ÕÙ Ð Ö ØÖ Ò× ÓÖÑ ×ÓÐÓ Ø Ò Ô × ÙÒ Ø Ö ×¸ Ù ÐÕÙ Ö Ñ ÒÓ ÙÑ ÒØÓ Ý ×Ù Ò Ö Ñ ÒØÓ ÓÖØ ÙÒ Ö Ó × Ð Ð Ù ÒØ Ý ÙÒÓ Ð ×ÙÑ ÖÓ ÕÙ Ð Ð ÓÖ ØÑÓ ÓÖ ¹ ÙÐ Ö×ÓÒ ÒÓ Ø Ò Ð ÔÖÓ Ð Ñ Ð ÒØ Ö Ð× Ô ×º ÈÓÖ Ø ÒØÓ¸ Ð Ñ Ü Ñ ÒØ Ñ ÒÓ× ÙÑ ÒØÓ × ÔÖ × ÒØ Ù Ò Ó Ð ÒØ Ö Ó× × Ð Ù ÒØ Ý Ð ×ÙÑ ÖÓ × Ñ Ü Ñ º Ì Ð ÒØ × V/2º Å Ü Ñ Þ Ö Ð ­Ù Ó Ð Ö ØÖ Ò× ÓÖÑ ØÓÑ V O(E) = O(VE) Ô ×Ó× 2 Ù ÓÒº 7.11.4.3 C´lculo de la bi-partici´n a o Ë Ø Ò ÑÓ× ÙÒ Ö Ó G Ô ÖØ Ó¸ ÙÒ Ô ×Ó × Ò Ð Ô Ö Ð ÒרÖÙÑ ÒØ ÓÒ ÒÙ ×¹ ØÖÓ Ð ÓÖ ØÑÓ × Ð ÙÐ Ö Ð ¹Ô ÖØ ÓÒº ÓÑÓ ×Ø ÔÖÓ Ð Ñ ÔÙ Ú Ö× ÔÓÖ × Ô ¹ Ö Ó¸ ר Ñ Ö ÙÒ ØÖ Ø Ñ ÒØÓ Ò Ö Ð ÕÙ ÐÓ × ÖÖÓÐÐ Ö ÑÓ× Ò Ð Ö ÚÓ Ð Ð ÓØ tpl bipartite.H¸ Ð Ù Ð ÓÒØ Ò ÖÙØ Ò × ÙØ Ð Ø Ö × ÓÒ ÖÒ ÒØ × Ö Ó× Ô ÖØ Ó× ×Ô ¬ Ñ ÒØ Ð ÔÖÙ ¹Ô ÖØ ÓÒ test bipartite() Ý ×Ù Ð ÙÐÓ compute bipartite()º À Ý Ú Ö × Ñ Ò Ö × Ú Ö ¬ Ö Ð Ö Ø Ö Ô ÖØ Ó ÙÒ Ö Óº Ë ÙÒ Ö Ó × Ô Ö¹ Ø Ó¸ ÒØÓÒ × ×Ø ÒÓ Ø Ò Ò Ò ÙÒ ÐÓ ÐÓÒ ØÙ ÑÔ Öº È Ö ÑÓ×ØÖ ÖÐÓ ÓÒ× Ö ÑÓ× ÙÒ ÐÓ ÐÓÒ ØÙ ÑÔ Öº Ð Ó × ÓÑÓ u1 → u2 → u3 → u4 → u5 → u1º Ë × Ù ÑÓ× Ð ÐÓ Ý ÐØ ÖÒ Ø Ú Ñ ÒØ × Ò ÑÓ× Ð × Ô ÖØ ÓÒ × ÔÓ ÑÓ× Ö L = {u1, u3, u5}
  • 841.
    7.11. Reducciones alproblema del flujo m´ximo a 815 R = {u2, u4}¸Ô ÖÓ Ð Ö Ó u5 → u1 ÖÓÑÔ Ð Ô ÖØ ÓÒº Á Ù Ð Ó ÙÖÖ × ÓÑ ÒÞ ÑÓ× × Ù ÐÕÙ Ö ÓØÖÓ ÒÓ Ó Ð ÐÓº Ë Ò Ö Ð Þ ÑÓ× ×Ø ÓÒØÖ ÑÔÐÓ Ô Ö Ù ÐÕÙ Ö ÐÓÒ ØÙ ÑÔ Ö ÒÓ× Ò ÓÒØÖ ÑÓ× ÓÒ Ð Ñ ×Ñ ÓÒØÖ ÓÒº ÇØÖ ÓÖÑ ¸ Ñ ÒÓ× Ð Ö ¸ Ô ÖÓ ÓÑÔÙØ ÓÒ ÐÑ ÒØ Ñ × ¬ ÒØ ¸ × Ú Ö ¬ Ö × Ð Ö Ó × ¹ ÓÐÓÖ Ð × Ö¸ × ÔÙ Ô ÒØ Ö× ÓÒ ×ÓÐÓ Ó× ÓÐÓÖ × × Ò ÕÙ Ð Ñ ×ÑÓ ÓÐÓÖ ÓÐ Ò º ר Ñ Ò Ö Ú Ö ÒÓ× ÓÖÖ × Ò Ö ÙÒ Ð ÓÖ ØÑÓ × Ó Ò ÐÓ׸ Ð Ú Þ ÕÙ ÒÓ× ÝÙ Ö Ø Ñ ÒØ ÓÒרÖÙ Ö ÐÓ× ÓÒ ÙÒØÓ× L Ý Rº Ð × Ù ÒØ Ð ÓÖ ØÑÓ ÙØ Ð Þ Ð ÓÐÓÖ Ó Ô Ö ÓÒרÖÙ Ö Ð Ô ÖØ ÓÒ ½ ÊÙØ Ò × Ô Ö Ö Ó× Ô ÖØ Ó× ½ ≡ ½ template <class GT> void compute_bipartite(GT & g, DynDlist<typename GT::Node *> & l, DynDlist<typename GT::Node *> & r) { DynDlist<typename GT::Node *> red, blue; typename GT::Node * p = g.get_first_node(); color<GT>(p) = Bp_Red; red.put(p); l.put(p); while (true) if (not red.is_empty()) // ¿Hay rojo cuyos arcos no hayan sido mirados? { typename GT::Node * p = red.get(); for (Node_Arc_Iterator<GT> it(p); it.has_current(); it.next()) { typename GT::Arc * a = it.get_current(); if (color<GT>(a) == Bp_Red) throw std::domain_error("Graph is not bipartite"); else if (color<GT>(a) == Bp_Blue) continue; color<GT>(a) = Bp_Red; typename GT::Node * q = it.get_tgt_node(); if (color<GT>(q) == Bp_Red) throw std::domain_error("Graph is not bipartite"); else if (color<GT>(q) == Bp_Blue) continue; color<GT>(q) = Bp_Blue; blue.put(q); r.put(q); } } else if (not blue.is_empty()) // ¿Hay azul cuyos arcos no hayan sido mirados? { typename GT::Node * p = blue.get(); for (Node_Arc_Iterator<GT> it(p); it.has_current(); it.next()) { typename GT::Arc * a = it.get_current(); if (color<GT>(a) == Bp_Blue) throw std::domain_error("Graph is not bipartite"); else if (color<GT>(a) == Bp_Red) continue; color<GT>(a) = Bp_Blue; typename GT::Node * q = it.get_tgt_node();
  • 842.
    816 Cap´ ıtulo 7. Grafos if (color<GT>(q) == Bp_Blue) throw std::domain_error("Graph is not bipartite"); else if (color<GT>(q) == Bp_Red) continue; color<GT>(q) = Bp_Red; red.put(q); l.put(q); } } else break; } Í× × DynDlist ¿ Ò Node Arc Iterator º Ä ÖÙØ Ò ×Ô Ö Ð Ü Ô ÓÒ std::domain error × Ð Ö Ó ÒÓ × Ô ÖØ Óº Ë ÐÓ ×¸ ÒØÓÒ × × Ö ØÓÖÒ Ò Ò Ð × Ð ×Ø × l Ý r ÐÓ× ÒÓ Ó× ÕÙ ÓÒ ÓÖÑ Ò Ð Ô ÖØ ÓÒº 7.11.4.4 Construcci´n de la red bipartita o ÓÒ ÐÓ× ÓÒ ÙÒØÓ× Ð Ô ÖØ ÓÒ¸ Ý Ø Ò ÑÓ× Ð Ô Ô Ö Ð ÙÐ Ö ÙÒ Ö ÕÙ Ú ¹ Ð ÒØ Ñ Ô Ð Ö Óº ÄÐ Ñ ÑÓ× g Ð Ö Ó Ô ÖØ Ó Ý net Ð Ö ÙÜ Ð Ö ÕÙ × ÑÓ× ØÖ Ò× ÓÖÑ Ö¸ Ð Ù Ð × ×Ô ¬ Ð × Ù ÒØ Ñ Ò Ö ½ ÓÒרÖÙ Ö Ö ÕÙ Ú Ð ÒØ ½ ≡ ´½ µ ½ typedef Net_Graph<Net_Node<Empty_Class>, Net_Arc<Empty_Class> > Aux_Net; Aux_Net net; Ð Ð ÙÐÓ net × Ö Ð Þ ¸ ÒØÓÒ ×¸ Ð × Ù ÒØ ÑÓ Ó ½ ÓÒרÖÙ Ö Ö ÕÙ Ú Ð ÒØ ½ +≡ ´½ µ ½ // recorrer nodos de g e insertar imagen en net for (Node_Iterator<GT> it(g); it.has_current(); it.next()) { typename GT::Node * p = it.get_current(); NODE_COOKIE(p) = net.insert_node(); NODE_COOKIE((typename GT::Node *)NODE_COOKIE(p)) = p; } typename Aux_Net::Node * source = net.insert_node(); // recorrer nodos de l, atarlos al fuente e insertar sus arcos dirigidos for (typename DynDlist<typename GT::Node*>::Iterator i(l); i.has_current(); i.next()) { typename GT::Node * p = i.get_current(); typename Aux_Net::Node * src = (typename Aux_Net::Node *) NODE_COOKIE(p); net.insert_arc(source, src, 1); for (Node_Arc_Iterator<GT> j(p); j.has_current(); j.next()) { typename GT::Arc * arc = j.get_current_arc(); typename Aux_Net::Node * tgt = (typename Aux_Net::Node *) NODE_COOKIE(g.get_tgt_node(arc)); typename Aux_Net::Arc * a = net.insert_arc(src, tgt, 1); ARC_COOKIE(arc) = a; ARC_COOKIE(a) = arc; } } typename Aux_Net::Node * sink = net.insert_node();
  • 843.
    7.11. Reducciones alproblema del flujo m´ximo a 817 // recorrer nodos de r y atarlos al sumidero for (typename DynDlist<typename GT::Node*>::Iterator it(r); it.has_current(); it.next()) { typename GT::Node * p = it.get_current(); net.insert_arc((typename Aux_Net::Node*)NODE_COOKIE(p), sink, 1); } Í× × DynDlist ¿ ¸ Node Arc Iterator ¸ Ò Node Iterator º 7.11.4.5 Extracci´n del emparejamiento de la red maximizada o Ë matching × Ð Ð ×Ø Ö Ó× ÕÙ ÓÒ ÓÖÑ Ò Ð ÑÔ Ö Ñ ÒØÓ¸ ×Ù Ø ÖÑ Ò ÓÒ × Ö Ð Þ Ñ ÒØ Ò×Ô ÓÒ Ð Ö ÙÜ Ð Ö net Ò Ù×ÕÙ ÐÓ× Ö Ó× × ØÙÖ Ó× ×Ù Ñ Ò Ò Ð Ö Ó g Ô ÖØ Ò Ð ÑÔ Ö Ñ ÒØÓº ½ ÜØÖ Ö Ò Ø ÐÓ× Ö Ó× × ØÙÖ Ó× ½ ≡ ´½ µ for (Arc_Iterator<Aux_Net> it(net); it.has_current(); it.next()) { typename Aux_Net::Arc * a = it.get_current(); if (a->flow == 0) continue; typename GT::Arc * arc = (typename GT::Arc *) ARC_COOKIE(a); if (arc == NULL) continue; matching.append(arc); } Í× × Arc Iterator º 7.11.4.6 Implantaci´n final del emparejamiento de cardinalidad m´xima o a ÓÒ ÐÓ× ÐÓÕÙ × ÒØ Ö ÓÖ × × ÓÒ ÓÖÑ Ð Ð ÓÖ ØÑÓ ¬Ò Ð ½ ÊÙØ Ò × Ô Ö Ö Ó× Ô ÖØ Ó× ½ +≡ ½ template <class GT, template <class> class Max_Flow> void compute_maximum_cardinality_bipartite_matching (GT & g, DynDlist<typename GT::Arc *> & matching) { DynDlist<typename GT::Node *> l, r; compute_bipartite(g, l, r); ÓÒרÖÙ Ö Ö ÕÙ Ú Ð ÒØ ½ Max_Flow <Aux_Net> () (net); ÜØÖ Ö Ò Ø ÐÓ× Ö Ó× × ØÙÖ Ó× ½ } Í× × DynDlist ¿ º 7.11.5 Circulaciones ÈÙ ÓÒ Ö× ÙÒ Ö × Ò Ù ÒØ × Ò ×ÙÑ ÖÓ× ÓÒ× Ö ÑÓ× ÙÒ Ö ØÖ ÓÒ Ð N =< V, E, C, s, t > Ý ÙÒ Ð Ö ÑÓ ¬ ÓÒ ×Ó Ö ÐÐ ÓÒ× ×Ø ÒØ Ò Ò Ö ÙÒ Ö Ó ÓÒ Ô Ù Ð Ñ Ü( Ô(ÇÍÌ(s)), Ô(ÁÆ(t)))º Ä Ò Ö Ð × Ô ØÓÖ Þ Ò
  • 844.
    818 Cap´ ıtulo 7. Grafos t s Nodos internos Arco que hace el ciclo ÙÖ º ¼ ÖÑ ÒÖÐ ÙÒ Ö ÙÐ ÓÒ Ð ¬ ÙÖ º ¼ Ý Ú Ò ÕÙ ¸ Ð Ñ ÒÓ× Ò Ð ×Ó Ò Ö Ó ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ ¸ × ÓÒ Ð ÙÒ Ö × Ò Ù ÒØ × Ò ×ÙÑ ÖÓ× Ö Ù Ð ÙÒ ÓÒ ÙÒ Ù ÒØ Ý ÙÒ ×ÙÑ ÖÓº ÙÒ ­Ù Ó ÔÓÖ ÙÒ Ö × Ò Ù ÒØ × Ò ×ÙÑ ÖÓ× × Ð ÒÓÑ Ò “circulaci´n”¸ ÔÙ × o Ð ÓÖ Þ ÙÒ × ØÙ ÓÒ Ò Ð Ù Ð Ò ÒØÖ Ò × Ð ­Ù Ó Ð Ö × ÑÔÐ Ñ ÒØ ¸ ÔÓ× Ð Ø Ó ÔÓÖ Ð ÙÒ ÜØÖ Ò Ò Ö ¿ ¸ Ó ØÓ× Ð ÑÓ ÐÓ¸ Ð ­Ù Ó Ö ÙÐ ×Ø Ð Ñ ÒØ ÔÓÖ Ð Ö ×ÒÒ × ×Ô ¬ Ö ÙÒ ÒØÖ Ý × Ð ­Ù Óº ÆÓØ ÑÓ× ÕÙ ÙÒ Ö ÙÐ ÓÒ ÖÖ Ð Ñ ÒÓ× ÙÒ ÐÓ Ò ÙÒ Ö Ó Ö Ó × ØÙ ÓÒ ÕÙ ÜÔÐ Ø Ñ ÒØ ÒÓ ÑÓ× ×ØÙ Ó ×Ø Ð ÔÖ × ÒØ º ÄÓ× Ð ÓÖ ØÑÓ× Ñ Ü Ñ Þ ÓÒ ­Ù Ó ÔÖ × ÒØ Ó× ÓÔ Ö Ò ×Ó Ö Ö × ÕÙ ÔÙ Ò ÓÒØ Ò Ö ÐÓ× ÒØ ÖÒÓ׸ Ô ÖÓ ÓÒ ÙÒ ×ÓÐÓ Ù ÒØ Ý ÙÒ ×ÙÑ ÖÓº ׸ Ò Ò Ö Ð¸ ÙÒ Ö × Ò Ù ÒØ × Ò ×ÙÑ ÖÓ× Ö Ù Ð ÙÒ Ö ØÖ ÓÒ Ð Ä Ö ×ÔÙ ×Ø × ¬ÖÑ Ø Ú Ù ÐÕÙ Ö Ö Ô Ø Ú Ð ¸ ×Ò Ù ÒØ Ò ×ÙÑ ÖÓ¸ ÔÙ Ö Ù Ö× ÙÒ Ö ÓÒ ÙÒ Ù ÒØ Ý ÙÒ ×ÙÑ ÖÓ Ý ×Ó Ö ×Ø ÙÐØ Ñ ÔÐ Ö ÐÓ× Ð ÓÖ ØÑÓ× ×ØÙ Ó׺ ÍÒ ÐÓ ÔÙ Ö Ù Ö× ÙÒ ×Ù ¹Ö ÓÒ ÙÒ Ù ÒØ Ý ÙÒ ×ÙÑ ÖÓ × ÑÔÐ Ñ ÒØ ÓÒ ÓÖØ Ö Ð ÐÓ Ý ×ÙÑ Ö ×Ù× ÜØÖ ÑÓ× ÓÑÓ Ù ÒØ × Ý ×ÙÑ ÖÓ׺ Ä Ö × × ÓÑÔÓÒ × ÐÓ× ÐÓ× Ñ × × ÑÔР׸ ÕÙ ÒÓ Ø Ò Ò ÒÓ Ó× ÓÑÙÒ ×¸ ÐÓ× Ñ × ÓÑÔÐ Ó׸ ÕÙ Ø Ò Ò ÒÓ Ó× ÓÑÙÒ × ÓÒ ÓØÖÓ× ÐÓ׺ Ð Ö Ó × Ð ÒÓ Ó ÖÖÓ ÙÒ ÔÖ Ñ Ö ÔÖÓÜ Ñ ÓÒ¸ Ô ÖÓ Ý ÓØÖ Ñ ØÖ ¸ ÕÙ ÔÖ × ÒØ Ö ÑÓ× ÔÖÓÒØ Ñ ÒØ ÕÙ Ó Ö Ñ ÓÖ Ò ÓÖÑ ÓÒ Ö Ð ÓÒ Ø Ú Ð Ö Ó Ý ÕÙ × ÒÓÑ Ò ÓÒ Ø Ú Ò Ö Ó× º Ð Ð ÓÖ ØÑÓ ÓÒÚ Ö× ÓÒ Ò Ö Ð × Ð Ó Ò Ö Óº 4/4 E 3/3 F B 4/4 5/4 2/1 3/2 2/1 H A 5/2 2/1 3/3 5/3 C D G 6/5 3/3 ÙÖ º ½ ÍÒ Ö ÙÐ ÓÒ ÍÒ ×Ô ØÓ ÒØ Ö × ÒØ ÙÒ Ö ÙÐ ÓÒ × ÕÙ ×Ù Ú ÐÓÖ ­Ù Ó ÔÙ Ö ÔÖ × ÒØ Ö× ÓÑÓ ÙÒ ÓÒ ÙÒØÓ ­Ù Ó× Ö ÙÐ ÒØ × ÔÓÖ ×Ù× ÐÓ׺ ÈÓÖ ÑÔÐÓ¸ Ð Ö ÙÐ ÓÒ Ð ¬ ÙÖ º ½ ÔÙ ÜÔÖ × Ö× Ñ ÒØ ÐÓ× × Ù ÒØ × ÐÓ× ¿ × Ñ ÒØ × ÓÒ Ð Ñ ÒØ Ò Ö ÙÒ Ö ÙÐ ÓÒ ÔÓÖ Ð Ñ Ö Ò Ö ¸ Ô ÖÓ Ò Ð ÑÙÒ Ó Ö Ð × ÑÔÖÓ Ðº
  • 845.
    7.11. Reducciones alproblema del flujo m´ximo a 819 ÐÓ Î ÐÓÖ ­Ù Ó A→B→E→A ½ A→B→E→F→H→G→D→C→A ½ A→B→E→F→H→D→C→A ½ A→B→E→D→C→A ½ C→E→D→C ¾ D→F→H→D ½ D→F→H→G→D ½ Ä ÒØ ÖÔÖ Ø ÓÒ ÒØ Ö ÓÖ ÙÒ ­Ù Ó Ú Ò ÕÙ ¸ Ô Ö ÙÒ Ö × Ò Ù ÒØ × Ò ×Ù¹ Ñ ÖÓ׸ Ð ­Ù Ó Ñ Ü ÑÓ × Ö Ù Ò ÓÒØÖ Ö ÙÒ Ö ÙÐ ÓÒ ÕÙ Ñ Ü Ñ Ð ­Ù Ó Ò Ö Óº ÈÓ ÑÓ׸ × Ò ÔÖÓ Ð Ñ ¸ ÙÑ ÒØ Ö Ð ­Ù Ó Ð Ö × Ù Ö Ò ÓÐ ÐÓ׸ й ÙÐ Ò ÓÐ × ×Ù Ô Ñ Ò Ñ Ý ÙÑ ÒØ Ò Ó Ð ­Ù Ó Ò ×Ø Ú ÐÓÖ ÐÓ Ð Ö Ó ØÓ Ó Ð ÐÓº B 4/3 E 3/3 F B 4/3 E 3/3 F 4/3 5/4 4/3 5/4 2/0 2/0 3/2 2/1 H 3/0 2/1 H A 5/2 A 5/0 2/1 2/1 3/3 3/3 5/3 5/3 C D G C D G 6/5 3/3 6/3 3/3 ´ µA→B→E→A ´ µ C→E→D→C 4/3 E 3/3 F 4/0 E 3/0 F B B 4/3 5/3 4/0 5/0 2/0 2/0 3/0 2/0 H 3/0 2/0 H A 5/0 A 5/0 2/0 2/0 3/3 3/0 5/3 5/0 C D G C D G 6/3 3/3 6/0 3/0 ´ µ D→F→H→D ´ µ A→B→E→F→H→G→D→C→A ÙÖ º ¾ ÑÔÐÓ Ð Ø ÓÖ Ñ × ÓÑÔÓ× ÓÒ ­Ù Ó ×Ó Ö Ð Ö ÙÐ ÓÒ Ð ¬ ÙÖ º ½ Ä Ø Ð ÐÓ× ÒØ Ö ÓÖ ÒÓ× Ú Ò Ð × ÒØ Ó Ö ÙÐ ÓÒ º Ò ØÓ¸ ÐÓ × ÙÒ Ö ÙÐ ÓÒº Ò Ð ×Ó Ð Ø Ð ¸ Ò ÓÒØÖ ÑÓ× 7 Ö ÙÐ ÓÒ ×º ÆÓØ ÑÓ× ÕÙ × ØÙÚ × ÑÓ× ÙÒ Ö ÓÒ ÙÒ Ù ÒØ Ý ÙÒ ×ÙÑ ÖÓ¸ Ø Ö ÙÒ Ö Ó × Ð ×ÙÑ ÖÓ Ð Ù ÒØ ÒÓ× Ø ÒØ × Ö ÙÐ ÓÒ × ÓÑÓ Ñ ÒÓ× ×Ø ÒØÓ× Ü ×Ø Ò × Ð Ù ÒØ Ð ×ÙÑ ÖÓº Ð Ú ÐÓÖ ­Ù Ó Ð Ö ÔÙ ÜÔÖ × Ö× ÓÑÓ ÙÒ ×ÙÑ ÐÓ× Ý ­Ù Ó׺ È ÖÓ Ð Ñ ×Ñ Ö Ý ×Ù Ú ÐÓÖ ­Ù Ó Ø Ñ Ò ÔÙ Ö ÔÖ × ÒØ Ö× ÓÑÓ ÙÒ ÓÑÔÓ× ÓÒ ÐÓ× Ý ­Ù Ó¸ Ø Ð ÓÑÓ ÐÓ Ú Ò Ð ÔÖÓÔÓ× ÓÒ × Ù ÒØ º Proposici´n 7.16 (Descomposici´n de flujo) o o Ù ÐÕÙ Ö Ö ÙÐ ÓÒ ÔÙ Ö ÔÖ × Ò¹ Ø Ö× ÓÑÓ ÙÒ ­Ù Ó ÒØÖ ÙÒ ÓÒ ÙÒØÓ ÐÓ Ñ × |E| ÐÓ× ×Ø ÒØÓ׺ Demostraci´n o ÓÒ× Ö ÑÓ× Ð × Ù ÒØ Ð ÓÖ ØÑÓ × ÓÑÔÓ× ÓÒ
  • 846.
    820 Cap´ ıtulo 7. Grafos Algoritmo 7.9 (Descomposici´n de una circulaci´n en ciclos) o o ½º Ë E = ∅ Ð ÓÒ ÙÒØÓ ÐÓ× ÕÙ × ÓÑÔÓÒ Ò Ð Ö ÙÐ ÓÒº E ÓÒØ Ò Ò Ð Ñ ÒØÓ× Ð ÓÖÑ (e , Δ)¸ ÓÒ e × ÙÒ ÐÓ Ý Δ Ð Ú ÐÓÖ ­Ù Ó ÕÙ Ö ÙÐ ÔÓÖ Ð ÐÓº ¾º while Ü ×Ø Ò Ö Ó× ×Ó Ö N ´ µ Ò Ù ÒØÖ ÙÒ ÐÓ e º ´ µ Ø ÖÑ Ò Ð ×Ð ÓÒ Ñ Ò ÑÓ Ð ÐÓ Δº ´ µ E = E ∪ {(e , Δ)} ´ µ ∀e ∈ e =⇒ f(e) = f(e) − Δº ´ µ Ð Ñ Ò N ´Ó Ð ÐÓµ ØÓ Ó× ÐÓ× Ö Ó× ÓÒ ­Ù Ó ÖÓº ÍÒ ÑÔÐÓ Ù ÓÒ ×Ø Ð ÓÖ ØÑÓ × Ú Ò Ó Ò Ð ¬ ÙÖ º ¾º À Ý ØÖ × Ó × ÖÚ ÓÒ × ÖÙ Ð × ×Ø Ð ÓÖ ØÑÓ ÕÙ ÒÓ× ÝÙ Ò Ö Ð Þ Ö Ð ¹ ÑÓ×ØÖ ÓÒ ½º Ð ÓÒ ÙÒØÓ Ö ×ÙÐØ ÒØ E Ô ÖÑ Ø Ö ÓÒרÖÙ Ö ÒØ Ö Ñ ÒØ Ð Ö º ¾º ÈÙ ×ØÓ ÕÙ Ø Ö ÓÒ Ð Ñ Ò ÙÒ ÐÓ¸ ÐÓ× ÐÓ× ÓÒØ Ò Ó× Ò E ×ÓÒ ×Ø ÒØÓ׺ ¿º Ð Ð ÓÖ ØÑÓ Ø ÖÑ Ò Ò ÐÓ ×ÙÑÓ |E| Ø Ö ÓÒ ×¸ ÕÙ × Ð Ñ Ü Ñ ÒØ ÔÓ× Ð ÐÓ׺ Ù ÒØ ר × Ó × ÖÚ ÓÒ × Ð ÔÖÓÔÓ× ÓÒ × ÖØ 7.11.6 Conectividad de grafos Ê Ö × ÑÓ× Ð ÓÒ Ø Ú ÙÒ Ö Óº Ò × × ÒØ Ó¸ Ù Ò ÓÒ ÜÓ ÔÙ ÓÒ× Ö Ö× ÙÒ Ö Ó Ó× Ñ ØÖ × Ò Ù ÒØ Ð ÔÖ ÙÒØ Ý × ÒÓÑ Ò Ò “conectividad en arcos” Ý “conectividad en nodos”¸ Ö ×Ô Ø Ú Ñ ÒØ º Ä ÓÒ ¹ ØÚ Ò Ö Ó× × Ð Ñ Ò Ñ ÒØ Ö Ó× ÕÙ Ò Ð Ñ Ò Ö× ÙÒ Ö Ó Ô Ö ÕÙ ×Ø ÕÙ Ú Ó Ò Ó× ÓÑÔÓÒ ÒØ × Ò ÓÒ ÜÓ׺ Ë Ñ Ð ÖÑ ÒØ ¸ Ð ÓÒ Ø Ú Ò ÒÓ Ó× × Ð Ñ Ò Ñ ÒØ ÒÓ Ó× Ö ÑÓÚ Ö Ô Ö ÕÙ Ð Ö Ó Ú Ò × ÓÒ Ø Óº ÆÓ×ÓØÖÓ× Ý ÑÓ× ×ØÙ Ó × ¬Ò × Ð ÓÒ Ø Ú º Ò Ü º º½ ´Ô Ò ¿ µ ×ØÙ ÑÓ× ÐÓ× ÔÙÒØÓ× ÖØ ÙÐ ÓÒ Ó ÓÖØ ¸ ÐÓ× Ù Ð × Ð ÙÒ × Ñ Ò Ö ÜÔÖ × Ò ÓÒ Ø Ú × Ò ÒÓ Ó× ÙÒ Ø Ö × Ý Ñ ×¸ ÔÓÖÕÙ ÕÙ × ÖÖÓÐÐ ÑÓ× ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ò O(E) ÒÓ× Ð ÙÐ ØÓ Ó× ÐÓ× ÒÓ Ó× ÓÖØ º Ñ ×¸ Ô Ö ÑÙ × × ØÙ ÓÒ × × ×Ù¬ ÒØ Ð ÙÐ Ö ÐÓ× ÒÓ Ó× ÓÖØ ¸ ÕÙ × Ö ØÓ Ò Ø ÑÔÓ Ý ×Ô Ó ´O(E) Ý O(1)¸ Ö ×Ô Ø Ú ¹ Ñ ÒØ µ¸ Ò ÐÙ Ö Ð ÙÐ Ö ÓÒ Ø Ú × ÕÙ ¸ ÓÑÓ Ú Ö ÑÓ× Ò ×Ø ×Ù ¹× ÓÒ¸ ×ÓÒ Ñ × ÓרÓ× ×º ÈÓÖ ÓØÖ Ô ÖØ ¸ ÙÖ ÒØ ÒÙ ×ØÖÓ ×ØÙ Ó Ö ÓÐ × Ö ÓÖ × Ñ Ò ÑÓ× ÔÖ × ÒØ ÑÓ× Ð ¬Ò ÓÒ ÓÖØ ´ º Ô º µº Ä ÓÒ Ø Ú Ò Ö Ó× ÒÓ × ÓØÖ Ó× ÕÙ Ð ÙÐ Ö ÙÒ ÓÖØ Ô Ñ Ò Ñ ¸ Ð Ü Ô ÓÒ ÕÙ ÑÓ× ÖÐÓ Ò Ø ÖÑ ÒÓ ÙÒ Ö Ó Ý ÒÓ ÙÒ Ö Óº À Ö ÐØ ¸ Ô٠׸ ÙÒ Ô Ö Ð ÐÓ ÒØÖ Ð × Ö × ­Ù Ó× Ý ÐÓ× Ö Ó׸ Ð Ù Ð Ù ÑÓ×ØÖ Ó Ò Ü º½½º½ ´Ô Ò ¼ µº
  • 847.
    7.11. Reducciones alproblema del flujo m´ximo a 821 7.11.6.1 El teorema de Menger Ñ ÒÙ Ó¸ ÙÒ Ú ÐÓÖ ÓÒ Ø Ú Ò Ö Ó× k × Ð ÒÓÑ Ò k¹ ÓÒ Ü ÓÒ Ý × ÒÓØ ÓÖÑ ÐÑ ÒØ ÓÑÓ Ke(G)º ÑÓ× ÕÙ ÙÒ Ö Ó × k¹ ÓÒ Ø Ó × s t × ¸ Ô Ö ØÓ Ó ÓÒ ÙÒØÓ C k − 1 ÒÓ Ó׸ Ü ÔØÙ Ò Ó s Ý t¸ Ü ×Ø ÙÒ Ñ ÒÓ × s tº Ó ÓØÖÓ ÑÓ Ó¸ ÒÓ × ÔÓ× Ð × ÓÒ Ø Ö s t × Ò Ð Ñ Ò Ö k ÒÓ Ó׺ Ó× Ñ ÒÓ× ÒØÖ s Ý t × ÒÓÑ Ò Ò Ò Ô Ò ÒØ × × ×ØÓ× ÒÓ Ø Ò Ò ÒÓ Ó× Ò ÓÑÙÒ ´ Ð Ü Ô ÓÒ s Ý tµº ר ÑÓ× Ð ×ØÓ× Ô Ö ÒÙÒ Ö ÙÒÓ ÐÓ× Ø ÓÖ Ñ × Ñ × ÒØ Ö × ÒØ × Ð Ø ÓÖ Ö Ó׸ × Ù ÖØÓ ÒØ × Ð ÓÑÔÙØ ÓÒ ÑÓ ÖÒ ¸ Ð Ø ÓÖ Ñ Å Ò Öº Proposici´n 7.17 (Karl Menger 1928 [29]) o Ë ÙÒ Ö Ó × k¹ ÓÒ Ø Ó × ÙÒ ÒÓ Ó s ÓØÖÓ t¸ ÒØÓÒ × Ü ×Ø Ò k Ñ ÒÓ× Ò Ô Ò ÒØ × × s tº Demostraci´n o Ó ÙÒ Ö Ó Ù ÐÕÙ Ö ¸ ÓÒ× Ö ÑÓ× ÙÒ Ö Ô Ø ÓÒ ÐÓ× Ñ ×ÑÓ ÒÓ Ó× Ý Ö Ó× ÔÙ ×ØÓ× Ô ÙÒ Ø Ö º ÄÙ Ó Ð Ñ Ò ÑÓ× ØÓ Ó× ÐÓ× Ö Ó× ÒØÖ ÒØ × s Ý ØÓ Ó× ÐÓ× × Ð ÒØ × tº ÓÖ Ñ Ü Ñ ÑÓ× Ð Ö º ÈÓÖ Ð ÔÖÓÔÓ× ÓÒ º × ÑÓ× ÕÙ Ð Ö Ò Ð Ð ÓÖØ Ñ Ò ÑÓ × k¸ ÔÙ × ØÓ × Ð × Ô × ×ÓÒ ÙÒ Ø Ö × Ý Ð Ö Ó × k ÓÒ Ø Óº Ë ÑÓ׸ ÔÓÖ Ð Ø ÓÖ Ñ º½ × ÓÑÔÓ× ÓÒ ­Ù Ó¸ ÕÙ ÔÓ ÑÓ× Ö ÔÖ × ÒØ Ö Ð ­Ù Ó × s t ÓÑÓ ÙÒ ÓÒ ÙÒØÓ Ñ ÒÓ× × ÙÒØÓ׿ ÙÝ ×ÙÑ ­Ù Ó× ´ÔÓÖ Ñ ÒÓµ × Ð Ú ÐÓÖ ­Ù Ó Ð Ö º ÈÙ ×ØÓ ÕÙ Ð Ö Ò Ð Ð ÓÖØ Ñ Ò ÑÓ × k¸ Ü ×Ø Ò k Ñ ÒÓ× ×Ø ÒØÓ× × s t¸ ÙÒÓ ÔÓÖ Ö Ó Ð ÓÖØ Ñ Ò ÑÓ Ð Ø ÓÖ Ñ Å Ò Ö Ù Ò ÐÑ ÒØ ÓÖÑÙÐ Ó Ô Ö Ö Ó׺ ËÙ ÒÙÒ Ó Ý ¹ ÑÓ×ØÖ ÓÒ ×ÓÒ Ð Ó× ÓÑÓ Ö Óº Ò ×Ø Ñ ØÓ¸ ÒÓ× ÔÓÖØ Ö Ø Ñ ÒØ Ð ÓÒÓ Ñ ÒØÓ Ô Ö × Ò Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ð ÙÐ Ke(G) ݸ Ñ × ÙÒ¸ Ô Ö Ð ÙÐ Ö Ð ÓÖØ Ö Ø Ó Ó Ñ Ò ÑÓ × Ö¸ Ð ÓÒ ÙÒØÓ ×Ô ¬ Ó Ö Ó× ÕÙ Ý ÕÙ ×ÙÔÖ Ñ Ö Ô Ö ÕÙ Ð Ö Ó Ú Ò Ô ÖØ Ó Ò Ó× Ó Ñ × ×Ù ¹ Ö Ó׺ 7.11.6.2 C´lculo de Ke(G) a → − ÄÐ Ñ ÑÓ× G Ð Ö ØÖ Ò× ÓÖÑ ÕÙ Ú Ð ÒØ ÙÒ Ö ÒÓ¹ Ö º È Ö Ò ÓÒØÖ Ö Ke(G) ÔÓ ÑÓ× ÔÐ Ö Ð × Ù ÒØ × ÑÔÐ × ÑÓ Ð ÓÖ ØÑÓº Algoritmo 7.10 (C´lculo de Ke(G)) a ÒØÖ ÍÒ Ö Ó G =< V, E >º Ë Ð Ke(G)º ½º Ð ÙÐ →º − G ¾º Ë s Ð ÒÓ Ó Ò → ÓÖÖ ×ÔÓÒ ÒØ Ð ÒÓ Ó − G Ñ ÒÓÖ Ö Ó Ò Gº ¿º Ke(G) = ∞ º ∀v ∈ V | v = s ´ µ t=v ¿ Ø × ÙÒ Ð ÞÓ t → s ÕÙ ÓÒ ÓÖÑ Ð ÐÓ s t→s Ý× Ø Ò Ð Ö ÙÐ ÓÒº
  • 848.
    822 Cap´ ıtulo 7. Grafos ´ µ Ë Ð Ö N =< V, E , C, s, t > Ø Ð ÕÙ C = {1 | e ∈ E ∪ Ô(e) = 1} ´ µ Å Ü Ñ Þ Ö N Ý Ð ÙÐ Ö Ð ÓÖØ Ô Ñ Ò Ñ < Vs, Vt >º ´ µ if ­Ù Ó N < Ke(G) =⇒ º Ke(G) = | < Vs, Vt > | º ÕÙ Ú ÒØÙ ÐÑ ÒØ × ÔÙ Ù Ö Ö < Vs, Vt >º 7.11.6.3 Implantaci´n del algoritmo de c´lculo de Ke(G) o a Ä ÑÔÐ ÒØ ÓÒ Ð Ð ÙÐÓ Ð ÓÒ Ø Ú × Ö Ð Ø Ú Ñ ÒØ × ÑÔÐ ¸ Ù ÒØ ÕÙ Ý ×ÔÓÒ ÑÓ× ØÓ Ð Ñ ÕÙ Ò Ö Ò × Ö Ô Ö ÒרÖÙÑ ÒØ Ö Ð × ÒרÖÙ ÓÒ × Ð Ð ÓÖ ØÑÓ º½¼º ÓÑ Ò ÑÓ׸ ÒØÓÒ ×¸ ÓÒ Ð Ð ÙÐÓ → − G → − ¾¾ Ð ÙÐ Ö G ¾¾ ≡ ´ ¾¿ µ typedef Net_Graph<Net_Node<Empty_Class>, Net_Arc<Empty_Class> > Net; Net net; typename Net::Node * source = NULL; // fuente ser´ el de menor grado de salida a long min_degree = numeric_limits<long>::max(); // menor grado de salida for (Node_Iterator<GT> it(g); it.has_current(); it.next()) { typename GT::Node * p = it.get_current(); NODE_COOKIE(p) = net.insert_node(); if (g.get_num_arcs(p) < min_degree) { source = (typename Net::Node *) NODE_COOKIE(p); min_degree = g.get_num_arcs(p); } } if (min_degree <= 1) return min_degree; // No vale la pena el c´lculo porque este es el resultado a for (Arc_Iterator<GT> it(g); it.has_current(); it.next()) { typename GT::Arc * a = it.get_current(); typename Net::Node * src = (typename Net::Node*) NODE_COOKIE(g.get_src_node(a)); typename Net::Node * tgt = (typename Net::Node*) NODE_COOKIE(g.get_tgt_node(a)); if (src != source) net.insert_arc(tgt, src, 1); if (tgt != source) net.insert_arc(src, tgt, 1); } Í× × Arc Iterator Ò Node Iterator º ØÓ× ÓÖÖ Ö ×Ô Ó Ý ÒÓ Ø Ò Ö ÕÙ ÑÔÐ Ö ÙÒ Ø Ð ¸ ÒÓ Ó → × Ù Ö − G Ò Ð ÓÓ Ð ÒÓ Ó Ò Gº ÙÖ ÒØ Ð Ô × ×Ó Ö ÐÓ× ÒÓ Ó× G ÔÖÓÚ ÑÓ× Ô→Ö Ø ÖÑ Ò Ö Ð ÒÓ Ó Ñ ÒÓÖ Ö Óº Ð ¬Ò Ð Ð ÔÖ Ñ Ö for¸ source × Ð Ñ Ò Ò − Ð ÒÓ Ó Ñ ÒÓÖ Ö Ó G Ò Gº Ë Ð Ö Ó × Ò Ö ÓÖ Ó Ù Ð Ð ÙÒ ¸ ÒØÓÒ × ÒÓ Ú Ð Ð Ô Ò ÔÖÓ× Ù Ö¸ ÔÙ × Ð ÓÒ Ø Ú ÒÓ ÔÙ → Ö Ñ ÝÓÖº − × Ð ÐÓÕÙ Ð ÙÐ Ö G ¾¾ ÒÓ× Ù Ö ÐÓ× Ô ×Ó× ½ Ý ¾ Ð Ð ÓÖ ØÑÓ º½¼º Ð Ô ×Ó × ÒרÖÙÑ ÒØ ÓÒ ÙÒ for ÕÙ Ö ÓÖÖ ØÓ Ó× ÐÓ× ÒÓ Ó× → ´net Ò Ð − G ÑÔÐ ÒØ ÓÒµ Ý Ú Ö ¬ÕÙ ÒÓ ÔÖÓ × Ö Ð Ù ÒØ º Ë sink Ð ÒÓ Ó ØÙ Ð ×Ó Ö Ð Ù Ð × Ò Ù ÒØÖ Ð for Ñ Ò ÓÒ Óº
  • 849.
    7.11. Reducciones alproblema del flujo m´ximo a 823 Ð Ô ×Ó ÓÒ× ×Ø Ò ×ÙÔÖ Ñ Ö ÐÓ× Ö Ó× ÕÙ × Ð Ò sink ´ ר ÑÓ Ó Ú Ò ×ÙÑ ÖÓµ¸ Ô ÖÓ ÑÓ× Ù Ö Ö ×ØÓ× Ö Ó× ×ÙÔÖ Ñ Ó× Ô Ö Ö ×Ø ÙÖ ÖÐÓ× Ò Ð × Ù ÒØ Ø Ö ÓÒº ×ØÓ × ÑÔÐ ÒØ Ð × Ù ÒØ ÓÖÑ ¾¿ Ð Ñ Ò Ö Ö Ó× × Ð ÒØ × × Ò ¾¿ ≡ ´ ¾¿µ DynDlist<typename Net::Arc*> from_sink_arcs; for (Node_Arc_Iterator<Net> it(sink); it.has_current(); it.next()) from_sink_arcs.append(it.get_current()); for (typename DynDlist<typename Net::Arc*>::Iterator it(from_sink_arcs); it.has_current(); it.next()) net.desconnect_arc(it.get_current()); Í× × DynDlist ¿ Ò Node Arc Iterator º ÑÔÐ ÑÓ× ÙÒ Ð ×Ø Ö Ó× Ð Ñ Ò Ö from sink arcsº Ê Ð Þ ÑÓ× Ó× Ô × ×¸ Ð ÔÖ Ñ Ö Ô Ö Ù Ö Ö ÐÓ× Ö Ó׸ Ð × ÙÒ Ô Ö Ð Ñ Ò ÖÐÓ׺ ÄÓ ÑÓ× ×Ø Ñ Ò Ö ÔÓÖÕÙ × Ð Ó Ð Ñ Ò Ö ÙÒ Ö Ó ÒØÖÓ ÙÒ Ø Ö ÓÖ Ö Ó׺ ÄÓ× Ö Ó× × Ð ÒØ × sink¸ Ù Ö Ó× Ò from sink arcs¸ Ò × Ö Ö ×Ø ÙÖ Ó× Ñ ÒØ ¾¿ Ê ×Ø ÙÖ Ö Ö Ó× × Ð ÒØ × × Ò ¾¿ ≡ ´ ¾¿µ while (not from_sink_arcs.is_empty()) net.connect_arc(from_sink_arcs.get()); ÓÒ ØÓ Ó× ÐÓ× ÐÓÕÙ × × ÖÖÓÐÐ Ó׸ Ð Ð ÓÖ ØÑÓ º½¼ × ÑÔÐ ÒØ × ¾¿ ÓÒ Ø Ú Ò Ö Ó× ¾¿ ≡ ¾¿ template <class GT, template <class> class Max_Flow> long edge_connectivity(GT & g) { Ð ÙÐ Ö → ¾¾ − G long min_k = min_degree; for (Node_Iterator<Net> it(net); it.has_current(); it.next()) { typename Net::Node * sink = it.get_current(); if (sink == source) continue; Ð Ñ Ò Ö Ö Ó× × Ð ÒØ × × Ò ¾¿ const typename Net::Flow_Type flow = Max_Flow <Net> () (net); if (flow < min_k) min_k = flow; Ê ×Ø ÙÖ Ö Ö Ó× × Ð ÒØ × × Ò ¾¿ net.reset(); // colocar flujo en cero } return min_k; } Í× × Node Iterator º Ä ÓÒ Ø Ú Ò Ö Ó× × ÙÒ Ñ ÑÙÝ ÑÔÓÖØ ÒØ Ò× Ð Ö Óº Ò ÑÙ Ó× ÓÒØ ÜØÓ׸ Ke(G) ÜÔÖ × Ð ÖÓ Ùר Þ Ð Ö Ó Ò × ÒØ Ó ×Ù ÓÒ Ø Ú º Ò Ð ÙÒ × × ØÙ ÓÒ × ÔÙ × Ö ÑÔÓÖØ ÒØ Ð ÙÐ Ö Ð ÓÖØ Ñ Ò ÑÓ Gº È Ö ÐÐÓ¸ Ð Ð ÓØ ÔÖÓÚ Ð ÖÙØ Ò compute min cut()¸ ÙÝ ×ØÖÙ ØÙÖ × Ð Ñ ×Ñ ÕÙ Ð edge connectivity()¸ ÓÒ Ð Ò Ó ÕÙ ×Ø Ð ÙÐ Ð ÓÖØ Ñ Ò ÑÓ → ݸ − G Ñ ÒØ Ñ Ô Ó G¸ Ó Ø Ò Ð Ú ÐÓÖ Ð ÓÖØ ¾¿ ÓÒ Ø Ú Ò Ö Ó× ¾¿ +≡ ¾¿
  • 850.
    824 Cap´ ıtulo 7. Grafos 22 23 24 25 26 22 23 24 25 26 16 17 18 19 20 21 16 17 18 19 20 21 11 12 13 14 15 11 12 13 14 15 5 6 7 8 9 10 5 6 7 8 9 10 0 1 2 3 4 0 1 2 3 4 ´ µ Ke (G) = 4 ´ µ Ke (G) = 3 ÙÖ º ¿ Ó× Ö Ó× ×Ø ÒØ × ÓÒ Ø Ú × ÓÒ ×Ù× ÓÖØ × template <class GT, template <class> class Max_Flow> long compute_min_cut(GT & g, Aleph::set<typename GT::Node*> & l, Aleph::set<typename GT::Node*> & r, DynDlist<typename GT::Arc *> & cut) { Ð ÙÐ Ö Ý Ñ Ô Ö → ¾ − G Aleph::set<typename Net::Node*> tmp_vs, tmp_vt; DynDlist<typename Net::Arc*> tmp_cuts, tmp_cutt; long min_k = numeric_limits<long>::max(); for (Node_Iterator<Net> it(net); it.has_current(); it.next()) { typename Net::Node * sink = it.get_current(); if (sink == source) continue; Ð Ñ Ò Ö Ö Ó× × Ð ÒØ × × Ò ¾¿ Aleph::set<typename Net::Node*> vs, vt; DynDlist<typename Net::Arc *> cuts, cutt; const typename Net::Flow_Type flow = Min_Cut <Net, Max_Flow> () (net, vs, vt, cuts, cutt); if (flow < min_k) { min_k = flow; tmp_vs.swap(vs); tmp_vt.swap(vt); tmp_cuts.swap(cuts); tmp_cutt.swap(cutt); } net.reset(); // colocar flujo en cero Ê ×Ø ÙÖ Ö Ö Ó× × Ð ÒØ × × Ò ¾¿ } Ø ÖÑ Ò Ö Ð ÓÖØ ´Ð¸ Ö Ý ÙØµ Ô ÖØ Ö ØÑÔ Ú׸ ØÑÔ ÚØ Ý ØÑÔ ÙØ× ¾ return min_k;
  • 851.
    7.11. Reducciones alproblema del flujo m´ximo a 825 } Í× × DynDlist ¿ Ò Node Iterator º ÓÒר Ø ÑÓ× ÕÙ Ð ×ØÖÙ ØÙÖ × ÒØ edge connectivity()º À Ý ÙÒ ×ÙØ Ð ¹ Ö Ò ÒÓ ÑÓ×ØÖ Ò Ð ÐÓÕÙ × Ð ÓÒ Ø Ú × Ñ ÒÓÖ Ó Ù Ð ÕÙ Ð ÙÒ ¸ ÒÓ × Ð ÙÐ Ð ÓÖØ ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð ÒÚÓ ÒØ ÓÒ×ÙÐØ Ö Ð Ú ÐÓÖ Ö ØÓÖÒÓ Ô Ö Ò Ö × ×Ø × Ð ÙÐÓ Ó ÒÓº Ä Ö ÞÓÒ ×Ø × ÓÒ × Ó Ð º Ò ÔÖ Ñ Ö ÐÙ Ö¸ × Ð ÓÒ Ø Ú × ÙÒÓ¸ ÒØÓÒ × × ×Ø ÒØ ÔÖÓ Ð ÕÙ Ð Ö Ó × ×Ô Ö Ó¸ ÓÒ Ñ × ÙÒ ÒÓ Ó Ö Ó ÙÒ Ø Ö Óº Ò ×Ø ×Ó¸ Ð Ð ÓÖ ØÑÓ Ð ÙÐ Ö ­Ù Ó× Ú ÒÓ× Ý Ö ÓÒ× Ö Ö Ò Ð × Ø Ö ÓÒ × Ð × ÓÒ Ü ÓÒ Ð Ú ÐÓÖ ØÙ Ð sinkº Ò × ÙÒ Ó ÐÙ Ö¸ Ò Ü º º½ ´Ô Ò ¿ µ ÓÒ× Ö ÑÓ× ÙÒ ÑÔÐ ×Ù ¹× ÓÒ Ô Ö ØÖ Ø Ö ÓÒ ÐÓ× ÔÙÒØÓ× ÓÖØ ¸ ÕÙ × Ð ×Ó Ô ÖØ ÙÐ Ö Ô Ö Ke(G) = 1º Ú ÒØÙ ÐÑ ÒØ ¸ ÓÒ ÐÓ× Ú ÐÓÖ × l¸ r Ý cut¸ ÔÓ ÑÓ× ÑÔÐ Ö Ø Ò × × Ñ Ð Ö × Ð × × ÖÖÓÐÐ × Ò Ü º º½ ´Ô Ò ¼µ Ô Ö Ð ÙÐ Ö ÐÓ× ÐÓÕ٠׺ ¾ Ð ÙÐ Ö Ý Ñ Ô Ö → ¾ ≡ − G ´ ¾¿ µ typedef Net_Graph<Net_Node<Empty_Class>, Net_Arc<Empty_Class> > Net; Net net; typename Net::Node * source = NULL; // fuente ser´ el de menor grado de salida a long min_degree = numeric_limits<long>::max(); // menor grado de salida for (Node_Iterator<GT> it(g); it.has_current(); it.next()) { typename GT::Node * p = it.get_current(); typename Net::Node * q = net.insert_node(); NODE_COOKIE(p) = q; NODE_COOKIE(q) = p; if (g.get_num_arcs(p) < min_degree) { source = (typename Net::Node *) NODE_COOKIE(p); min_degree = g.get_num_arcs(p); } } if (min_degree <= 1) return min_degree; // No vale la pena el c´lculo porque este es el resultado a for (Arc_Iterator<GT> it(g); it.has_current(); it.next()) { typename GT::Arc * a = it.get_current(); typename Net::Node * src = (typename Net::Node*) NODE_COOKIE(g.get_src_node(a)); typename Net::Node * tgt = (typename Net::Node*) NODE_COOKIE(g.get_tgt_node(a)); if (src != source) { typename Net::Arc * arc = net.insert_arc(tgt, src, 1); ARC_COOKIE(arc) = a; } if (tgt != source) { typename Net::Arc * arc = net.insert_arc(src, tgt, 1); ARC_COOKIE(arc) = a; } } Í× × Arc Iterator Ò Node Iterator º
  • 852.
    826 Cap´ ıtulo 7. Grafos ¾ Ø ÖÑ Ò Ö Ð ÓÖØ ´Ð¸ Ö Ý ÙØµ Ô ÖØ Ö ØÑÔ Ú׸ ØÑÔ ÚØ Ý ØÑÔ ÙØ× ¾ ≡ ´ ¾¿ µ for (typename Aleph::set<typename Net::Node*>::iterator it = tmp_vs.begin(); it != tmp_vs.end(); it++) l.insert((typename GT::Node*) NODE_COOKIE(*it)); for (typename Aleph::set<typename Net::Node*>::iterator it = tmp_vt.begin(); it != tmp_vt.end(); it++) r.insert((typename GT::Node*) NODE_COOKIE(*it)); for (typename DynDlist<typename Net::Arc*>::Iterator it(tmp_cuts); it.has_current(); it.next()) { typename Net::Arc* arc = it.get_current(); cut.append((typename GT::Arc*) ARC_COOKIE(arc)); } Í× × DynDlist ¿ º 7.11.6.4 An´lisis del algoritmo 7.10 a Ò ÐÓ× Ø ÖÑ ÒÓ× Ò ÕÙ ÐÓ ÑÓ× ÔÐ ÒØ Ó¸ Ð Ö Ò Ñ ÒØÓ Ð Ð ÓÖ ØÑÓ º½¼ × ÓÖÖ ×ÔÓÒ ÓÒ Ð Ð ÖÙØ Ò edge connectivity()º → − ÐÐ Ð Ö Ñ ÒØ × ÒÓØ ÕÙ × ÙØ Ò |V| − 1 Ñ Ü Ñ Þ ÓÒ × ×Ó Ö G º ÈÓÖ Ø ÒØÓ¸ Ð × ÑÔ ÒÓ × Ö V − 1× ´ × ÑÔ ÒÓ Max Flow <Net> () (net)µº Ë ÑÔÐ ÑÓ× ÙÒ Ð ÓÖ ØÑÓ Ñ¹ ÔÙ ÔÓÖ ÔÖ ¹­Ù Ó¸ ÕÙ × Ð Ð ÓÖ ØÑÓ ÔÓÖ ÓÑ × ÓÒ¸ ÒØÓÒ × ÔÓ ÑÓ× Ò ÓÒØÖ Ö Ke(G) Ò (V − 1) × O(V 2E) = O(V 3E) Ô ×Ó׺ Ð ÙÐ Ö → ¾¾ ØÓÑ O(E) Ô ×Ó׸ ÐÓ× Ù Ð × ×ÓÒ × ÒØÓØ Ñ ÒØ ×ÓÖ Ó× ÔÓÖ − G Ð forº Ð Ñ ×ÑÓ ÑÓ Ó¸ Ð Ñ Ò Ö Ö Ó× × Ð ÒØ × × Ò ¾¿ Ý Ê ×Ø ÙÖ Ö Ö Ó× × Ð ÒØ × × Ò ¾¿ ØÓÑ Ò Ð Ö Ó × Ð sink¸ Ð Ù Ð ÐÓ ×ÓÖ × ÒØÓØ Ñ ÒØ Max Flow <Net> () (net)º 7.11.7 C´lculo de Kv(e) a Ç Ú Ñ ÒØ Ð ÓÒ Ø Ú Ò ÒÓ Ó× ×Ø ×ØÖ Ñ ÒØ Ö Ð ÓÒ ÓÒ ×Ù ÕÙ Ú Ð ÒØ Ò Ö Ó׺ × Ö Ø Ñ ÒØ Ù Ð ÕÙ Kv(G) ≤ Ke(G)¸ ÔÙ × ÐÓ× Ö Ó× ÕÙ Ø ÖÑ Ò Ò Ke(G) ÒÓ ×ÓÐÓ Ò Ö Ð ÓÒ Ö ÐÓ× ÒÓ Ó× ÕÙ × ÓÒ Ø Ò G¸ × ÒÓ ÕÙ × ÔÓ× Ð ÕÙ ÙÒÓ Ó Ñ × Ö Ó× ÐÓ× ÒÚÓÐÙ Ö Ó× Ò Ð ÓÖØ ÕÙ ÖÖÓ Ke(G) ÓÑÔ ÖØ ÒÓ Ó× ÒÚÓÐÙ Ö Ó× Ò Kv(G)º ÈÓ ÑÓ× Ð ÙÐ Ö¸ Ô٠׸ Kv(G) Ô ÖØ Ö Ð ÓÖØ Ñ Ò ÑÓº È Ö ÐÐÓ¸ Ñ ÒØ compute min cut()¸ Ð ÙÐ ÑÓ× Ð ÓÖØ Ñ Ò ÑÓ Ð Ö Ó Ý ÐÙ Ó Ñ Ö ÑÓ× ÐÓ× ÒÓ Ó× ÕÙ ÓÒØ Ò Ð ÓÖØ ר ÓÒ ÙÒØÓ Ò Ö Ð ÓÒ ÐÓ× Ö Ó× Ð ÓÖØ Ð ÙÐ ÑÓ× Kv(G)º ÇØÖ ÐØ ÖÒ Ø Ú ÓÒ× ×Ø Ò × ÖÖÓÐÐ Ö ÙÒ Ð ÓÖ ØÑÓ × Ñ Ð Ö Ð º½¼º È ÖÓ Ô Ö ×ØÓ ÑÓ× ÒØ ÖÔÖ Ø Ö ´Ó ÔÐ ÒØ Öµ Ð Ø ÓÖ Ñ Å Ò Ö ´ º½ µ Ò ÙÒ ÓÒ ÒÓ¹ Ó× Ý ÒÓ Ö Ó׺ Ò ×Ø × ÒØ Ó¸ ÙÒ ÔÖ Ñ Ø Ú Ð ÙÐÓ Kv(G)¸ ÒÓÑ Ò vertex connectivity()¸ Ð Ñ ×ÑÓ ×Ø ÐÓ ÕÙ edge connectivity Ô ÖÓ Ô Ö ÐÓ× ÒÓ Ó׸ × ÜÔÓÖØ Ò ALEPHº 7.12 Flujos de coste m´ ınimo Ò Ó × ÓÒ ×¸ Ñ ÒØ Ò Ö ÙÒ ­Ù Ó ÔÓÖ ÙÒ Ö ÖÖ Óר ׺ ÓÒ× Ö ÑÓ× Ð ÙÒ × × ØÙ ¹ ÓÒ ×
  • 853.
    7.12. Flujos decoste m´ ınimo 827 ½º Ò ÙÒ Ö ÕÙ ÑÓ Ð Ð ÙÒ ­Ù Ó¸ Ñ ÒØ Ò Ö ÙÒ Ú ÐÓÖ ­Ù Ó ÓÒÐÐ Ú ÙÒ Óר Ò Ö Ø Ó Ó ÓÒÓÑ Ó¸ Ú × ÔÖÓÔÓÖ ÓÒ Ð Ð ÐÓÒ ØÙ Ð ØÙ Ö º ¾º Ò ÙÒ Ö ØÖ ¬ Ó Ö Ó Ñ ÒØ Ò Ö ÙÒ ­Ù Ó Ó ÔÓÖ Ð ÙÒ ÖÙØ Ø Ñ Ò ÒÚÓÐÙ Ö Óר × ÓÑ Ùר Ð ¸ ÒØ Ú ÓÒ ×¸ Ø º ¿º ÍÒ Ö Ð ØÖ Ö ÕÙ Ö Óר × Ñ ÒØ Ò Ñ ÒØÓ × ÙÒ Ð Ù ÓÒ Ó Ö ¬ º רÓ× ÑÔÐÓ× ÒÓ× Ô ÖÑ Ø Ò Ú ×ÐÙÑ Ö Ö ÕÙ Ý × ØÙ ÓÒ × Ò Ð × Ù Ð × ÒÓ ×ÓÐÓ Ù ÒØ Ñ Ü Ñ Þ Ö Ð ÒØ ­Ù Ó¸ × ÒÓ × Ø × Ö Ð ÙÒ Ö Ø Ö Ó ×Ùר ÒØ Ð × ÙÒ × Ð Ò ÓÐ ÐÓ× Óר ׺ ÄÓ× Óר × ÒÓ Ò × Ö Ñ ÒØ ×ÓÒ Ò ÓÐ ÓÒÓÑ Ý ÐÓ× ­Ù Ó× ÒÓ Ò × Ö Ñ ÒØ Ö ÔÖ × ÒØ Ò Ð ÕÙ Ó׺ Ø ÒÓÖ ÑÔÐÓ¸ ÙÒ ÔÐ ÓÒ Ð × × Ö Ð ÓÒ ÓÒ Ð ØÖ Ò×¹ ÔÓÖØ Ò×ÙÑÓ× Ó Ñ Ö Ò ×º Ò ×Ø ×Ó Ð ÑÓ× ÙÒ Ö ØÖ Ò×ÔÓÖØ º Ä Ô ­Ù Ó Ö ÔÖ × ÒØ Ð ØÖ Ò×ÔÓÖØ ×Ó ÙÒ ÙÖ ÓÒº Ô Ö ¸ Ô٠׸ Ð ÔÖÓ Ð Ñ Ñ Ü Ñ Þ Ö Ð ÒØ Ò×ÙÑÓ× ØÖ Ò×ÔÓÖØ Ö Ò Ð Ñ ÒÓÖ Ø ÑÔÓ ÔÓ× Ð º È Ö ØÖ Ø Ö ÔÖÓ Ð Ñ × ÕÙ Ò Ò Ò Ð Ñ Ü Ñ Þ ÓÒ ­Ù Ó Ð Ñ Ò ÑÓ Óר ¸ ÔÐ ÒØ Ö ÑÓ× Ð × Ù ÒØ ÑÓ ÐÓº Definici´n 7.22 (Modelo de red capacitada con costes) ÍÒ Ö o Ô Ø ­Ù Ó ÓÒ Óר × × ÙÒ Ö Ô Ø N =< V, E, s, t, C, C >º C : E −→ C¸ Ð ÙÐ Ð ×Ó Ö Ó ÙÒ ØÖ ÙØÓ ÓÒ Ð¸ ÒÓÑ Ò Ó “coste”¸ ÕÙ Ö ÔÖ × ÒØ Ð Óר ÔÓÖ ÙÒ ­Ù Óº Ð Óר ×Ó Ó ÙÒ Ö Ó × ÒÓØ ÓÑÓ c(a) Ý Ö ÔÖ × ÒØ ÐÓ ÕÙ Ù ×Ø ­Ù Ö ÙÒ ÙÒ º Ð Óר ÙÒ ­Ù Ó ÔÓÖ ÙÒ Ö Ó a × ¬Ò ÓÑÓ (a) = f(a) c(a) ´ º¿ µ Ð Ó×ØÓ ÙÒ ­Ù Ó ÙÒ Ö × ¬Ò ÓÑÓ (N) = (e) = f(e) c(e) ´ º¿ µ ∀e∈E ∀e∈E ÓÒ ×Ø ¬Ò ÓÒ¸ Ý ×Ø ÑÓ× ÔÖ Ô Ö Ó× Ô Ö ÒÙÒ Ö ÙÒ ÔÖÓ Ð Ñ Ò Ö Ð ÕÙ ÒÓ× × ÖÚ Ö ÙÒ Ñ ÒØÓ ×ÓÐÙ ÓÒ ÙÒ Ù Ò Ú Ö ÓØÖÓ× ÔÖÓ Ð Ñ ×º Definici´n 7.23 (Flujo m´ximo de coste m´ o a ınimo) Ë N =< V, E, s, t, C, C > ÙÒ Ö Ô Ø ÓÒ Óר ׺ ÍÒ ­Ù Ó Ñ Ü ÑÓ × ınimo” × ÒÓ Ü ×Ø ÓØÖÓ “coste m´ ­Ù Ó Ñ Ü ÑÓ ÓÒ Óר Ñ ÒÓÖº Ò ÙÒ Ö Ô Ø ÔÙ Ö Ú Ö × ÓÒ¬ ÙÖ ÓÒ × ­Ù Ó× ÕÙ ÓÒÐÐ Ú Ò ÙÒ ­Ù Ó Ñ Ü ÑÓº ÈÓÖ ÑÔÐÓ¸ Ô Ö Ð Ö ÐÙ×ØÖ Ò Ð ¬ ÙÖ º Ø Ò ÑÓ× Ó× ´Ó Ñ ×µ ÓÒ¬ ÙÖ ÓÒ × ÕÙ Ñ Ü Ñ Þ Ò Ð ­Ù Ó Ý ÕÙ ×ÓÒ ÑÓ×ØÖ × Ò Ð × ¬ ÙÖ × º ¹ Ý º ¹ ¸ Ö ×Ô Ø Ú Ñ ÒØ º Ñ Ó× ­Ù Ó× ×ÓÒ Ñ Ü ÑÓ׸ Ô ÖÓ Ð ÔÖ Ñ ÖÓ Ø Ò ÙÒ Óר 14860 Ñ ÒØÖ × ÕÙ Ð × ÙÒ Ó 16400º Ë ÑÓ× ÕÙ ÙÒ Ö Ô Ø ÔÙ Ø Ò Ö Ú Ö × ÓÒ¬ ÙÖ ÓÒ × ÕÙ Ñ Ü Ñ Ò Ð ­Ù Óº × Ð × Ó× ×¸ ÔÙ Ô Ö Ö× ÓÑÓ Ò ÓÕÙ ×ÓÐÙ ÓÒ Ð Ò ÓÒØÖ Ö ØÓ × Ð × ÓÒ¬ ÙÖ ÓÒ × Ñ Ü Ñ × Ý ÒØÓÒ × × Ð ÓÒ Ö Ð Ñ ÒÓÖ Óר ¸ Ô ÖÓ ÒØÓÒ × ÑÓ×
  • 854.
    828 Cap´ ıtulo 7. Grafos Ë ¼» ¼ ¼»¾¼ ¿¼» ¿¼»¾¼ ¼» ¼ ¿¼»½¼ ½¼»½ ¼»¾¼ ¼»¿¼ ¼»½¼ ¿¼»½ ¼»¿ ¾¼»¿¼ ¼»¿¼ Á ¼»¾¼ ¿¼» ¾¼» À ¼» ¼ ½ » ¼»¾ ¼»¿¼ ¼» ¼ à ¿¼»¾ ¼»½  ¼»¾¼ Ì ÙÖ º ÑÔÐÓ ÙÒ Ö Ô Ø ÓÒ Óר ׺ ÈÖ Ñ Ö Ú ÐÓÖ Ö Ó ÓÖÖ ×¹ ÔÓÒ Ð × Ô ×¸ Ñ ÒØÖ × ÕÙ Ð × ÙÒ Ó Ð Óר ÐÐ Ú Ö ÙÒ ÙÒ ­Ù Óº Ò Ð Ø ÖÖ ÒÓ ÐÓ ÒØÖ Ø Ð Ñ × ÕÙ ×Ø Ö Ø Ö ÒØÖ Ø Ð Ù Ùר Ñ ÒØ ÐÓ Ò Ö ÒØ Ó ÓÖ Ò ÐÑ ÒØ ÔÓÖ ÐÓ× ×ØÙ Ó×Ó× Ð ­Ù Ó Ñ Ü ÑÓ Ý ÕÙ Ô ÖÓ Ò Ð × × Ñ ÒÓ× ÙÑ ÒØÓ Ý ÑÔÙ ÔÖ ¹­Ù Óº ÈÙ ×ØÓ ÕÙ Ñ × Ø Ò × Ñ Ü Ñ Þ ÓÒ ­Ù Ó × × ÖÚ Ò Ð Ö Ö × Ù Ð¸ × ÒØ Ö × ¬Ò Ö ÙÒ Ö Ö × Ù Ð Ò Ð Ñ ØÓ Óר º Definici´n 7.24 (Red residual en una red capacitada con costes) o Ë N =< V, E, s, t, C, C > ÙÒ Ö Ô Ø ÓÒ Óר ׺ Ê ×Ô ØÓ Ð ­Ù Ó¸ ×Ù Ö Ö × Ù Ð × ÒØ Ð Ð ¬Ò ÓÒ º½ ÓÒ Ð ÕÙ Ý ÑÓ× ØÖ Ó¸ Ô ÖÓ¸ Ö ×Ô ØÓ Ð Óר ¸ ÐÓ× Ö Ó× Ö × Ù Ð × Ø Ò Ò Óר Ò Ø ÚÓ׺ Ê ÓÖ ÑÓ× ÕÙ ÙÒ Ö Ó Ö × Ù Ð × ÙÒ Ö Ó Ö ØÖÓ ×Ó × Ö¸ ÔÓÖ ÓÒ × ÔÙ Ö Ñ ÒØ Ö ­Ù Óº × Ô٠׸ Ð ÕÙ ÙÒ Ö Ó Ö × Ù Ð Ø Ò Óר Ò Ø ÚÓ Ö ÔÖ × ÒØ Ð Ó ÕÙ Ð ×Ñ ÒÙ Ö Ð ­Ù Ó Ö ÙÐ ÒØ ÔÓÖ ×Ù Ö Ó Ö Ð ×Ñ ÒÙÝ Ð Óר º Ä ¬ ÙÖ × º ¹ Ý º ¹ ÑÙ ×ØÖ Ò Ð × Ö × Ö × Ù Ð × ÐÓ× ­Ù Ó× Ñ Ü ÑÓ× ÑÓ×ØÖ Ó× Ò Ð × ¬ ÙÖ × º ¹ Ý º ¹ ¸ Ö ×Ô Ø Ú Ñ ÒØ º Ò Ñ × ¬ ÙÖ × × ÔÙ Ò ÒÓØ Ö Ð ÔÖ × Ò ÐÓ× Ò Ø ÚÓ× × ÙÒ Ð Óר Ð ­Ù Óº Î ÑÓ׸ Ô٠׸ ÕÙ ÒØÖ ×Ø ÒØÓ× ­Ù Ó× ÔÓ× Ð ×¸ Ñ Ü ÑÓ× Ò ÐÙ× Ú ¸ × ÔÙ Ò Ø Ò Ö ÐÓ× Óר Ò Ø ÚÓ ÐÓ ÕÙ ×Ù Ö ¸ Ù Ò Ó Ñ ÒÓ× ÔÓÖ ×ÙÖ Ó¸ ÕÙ Ð ­Ù Ó Ò Ù ×Ø ÓÒ ÒÓ ÔÙ × Ö Ñ Ò ÑÓ Óר º ¸ ÒØÓÒ ×¸ Ö ÔÐ ÒØ Ö Ð ­Ù Ó Ø Ð º Definici´n 7.25 (Flujo factible sobre una red capacitada con costes) o Ë N =<
  • 855.
    7.12. Flujos decoste m´ ınimo 829 Ë Ë ¼» ¼» ¼ ¼» ¼»¾¼ ¼» ¼» ¼ ¼» ¼»¾¼ ¿¼»¼» ¿¼»½¼»¾¼ ¿¼»¿¼» ¿¼»½¼»¾¼ ¼» ¼» ¼ ¼»¾¼» ¼ ¿¼»½¼»½¼ ½¼»¼»½ ¿¼»¼»½¼ ½¼»¼»½ ¼»½¼»¾¼ ¼» ¼»¾¼ ¼»¼»¿¼ ¼» ¼»½¼ ¼»¼»¿¼ ¼» ¼»½¼ ¿¼»¼»½ ¿¼»¾¼»½ ¼» ¼»¿ ¾¼»¼»¿¼ ¼»¼»¿ ¾¼»¼»¿¼ ¼»¼»¿¼ Á ¼»¾ »¿¼ Á ¼»¼»¾¼ ¿¼»¼» ¾¼»¾¼» ¼»¼»¾¼ ¿¼»¼» ¾¼»½ » À ¼»¼» ¼ À ¼»¾¼» ¼ ½ »¼» ½ »½ » ¼» ¼»¾ ¼»½¼»¾ ¼»¾¼»¿¼ ¼» ¼» ¼ ¼» ¼»¿¼ ¼» ¼» ¼ à à ¿¼»¼»¾ ¿¼»½¼»¾ ¼» ¼»½  ¼» ¼»½  ¼» ¼»¾¼ ¼» ¼»¾¼ Ì Ì ´µ ÑÓÒ ×¹Ã ÖÔ ´ µ ÓÖ ¹ ÙÐ Ö×ÓÒ ÙÖ º Ó× ÓÒ¬ ÙÖ ÓÒ × ­Ù Ó Ñ Ü ÑÓ Ô Ö Ð Ö Ð ¬ ÙÖ º ÙÒ Ö V, E, s, t, C, C > Ô Ø ÓÒ Óר ׺ ÍÒ ­Ù Ó Ñ Ü ÑÓ × Ø Ð × Ý ×ÓÐÓ × ×Ø ÒÓ ÓÒØ Ò ÐÓ× Óר Ò Ø ÚÓº Ä Ø Ð ×ØÖ Ò ÕÙ × ×ÙÖ Ó Ø Ò Ö ÐÓ× Ò Ø ÚÓ׺ È ÖÓ ×Ø Ö Ø Ö ×ÙÖ Ó Ø Ò Ô Ö Ú Ð ÓÖ ¸ Ø Ð ÓÑÓ Ú Ö ÑÓ× Ò Ð × Ù ÒØ ÔÖÓÔÓ× ÓÒ ÙÒ ¹ Ñ ÒØ к Proposici´n 7.18 o ÍÒ ­Ù Ó Ñ Ü ÑÓ × Óר Ñ Ò ÑÓ × Ý ×ÓÐÓ × ×Ù Ö Ö × Ù Ð ÒÓ ÓÒØ Ò ÐÓ× Ò Ø ÚÓ׺ Demostraci´no È Ö Ð ÔÖ Ò× ÓÒ¸ × Ñ Ò ×Ø Ö Ö ÓÖ Ö Ð Ö ÙÐ ÓÒ Ý Ð Ø ÓÖ Ñ º½ × ÓÑÔÓ× ÓÒ ­Ù Ó Ò ÐÓ× Ó Ö ÙÐ ÓÒ ×º Ò ×Ø × ÒØ Ó¸ ÓÒ× ¹ Ö ÑÓ× ÙÒ ÐÓ ´Ò Ø ÚÓ Ó ÒÓµ ÓÑÓ ÙÒ Ö ÙÐ ÓÒ Ò Ð Ö º ÓÖ ÔÐ ÒØ ÑÓ× ÐÓ× Ó× Ñ ÒÓ× ÑÓ×ØÖ Ø ÚÓ× ¯ =⇒ ´ÔÓÖ ÓÒØÖ ÓÒµ ×ÙÔÓÒ ÑÓ× ÕÙ Ø Ò ÑÓ× ÙÒ ­Ù Ó Ñ Ü ÑÓ Óר Ñ Ò ÑÓ ÙÝ Ö Ö × Ù Ð ÓÒØ Ò ÙÒ ÐÓ Óר Ò Ø ÚÓº Ë u Ð Ö Ó Ð ÐÓ ÓÒ Ñ ÒÓÖ Ô Ö ×Ø ÒØ ÓÒ Ú ÐÓÖ cmº ÓÖ ÙÑ ÒØ ÑÓ× Ð ­Ù Ó Ð Ö ØÖ Ú × Ð ÐÓ Ò cm ×ÙÑ Ò Ó× ÐÓ ØÓ Ó× ÐÓ× Ö Ó× Óר ÔÓ× Ø ÚÓ ´ Ð ÒØÓµ Ý Ö ×Ø Ò Ó× ÐÓ ØÓ Ó× ÐÓ× Ö Ó× Óר Ò Ø ÚÓ ´ Ö ØÖÓ ×Óµº ÈÙ ×ØÓ ÕÙ ×ØÓ× Ñ Ó× ÒÓ Ø Ò Ð ÔÖÓÔ ÓÒ× ÖÚ ÓÒ Ð ­Ù Ó¸ Ð ­Ù Ó Ö ÙÐ ÒØ × Ð Ñ ×ÑÓ Ý¸ ÔÓÖ Ø ÒØÓ¸ ÙÒ Ñ Ü ÑÓ¸ Ô ÖÓ ×Ù Óר ×Ñ ÒÙÝ Ò cm¸ ÐÓ ÕÙ ÓÒØÖ
  • 856.
    830 Cap´ ıtulo 7. Grafos ¼»¹ ¼ Ì Â ¼»¹ ¼ ½¼»¾¼ ¼»¹¾¼ ¼»¹¾¼ À  ¼»¹½ ½¼»¹¾ Ì ¾¼»¾ ¼»¹¾ ½¼»¾ ¿¼»¾ ¿¼» ¼»¹¿¼ ¼»¹½ ½¼»½ ¿¼» ½ » à ½ »¹ à ¼»¾¼ ¾¼»¹¿¼ ¿¼»¿¼ ¾¼» ¼ ¾¼»¹ ¼ ¼»¾ ½¼»¹¾ ¼»¿¼ » ½ »¹ À ¼» ¼ ¼»¾¼ ¼»¹¿ Á ¾¼»¹ Á ¾ »¿¼ ¾ »¹¿¼ ¼»¹½¼ ¼»¹½¼ ¾¼»¿¼ ¾¼»¿¼ Ë ¼»¿ Ë ¼»¹ ¼ ¿¼»½ ½¼»¹½¼ ¾¼»½¼ ¾¼»¹½ ½¼»½ ¿¼»½¼ ¼»¹ ¼ ¼»¿¼ ¼»¿¼ ½¼» ¼ ¼»¹ ¼ ½¼»¹¾¼ ¿¼»¾¼ ¾¼»¹ ¼ ¿¼» ¼ ¼»¹¾¼ ¼»¹¾¼ ¿¼» ¿¼»¹ ¼»¹¾¼ ½¼»½ ½¼»½ ¾¼»¾¼ ½¼»¹¾¼ ½¼»¹¾¼ ¾¼»¾¼ ´µ º ¹ ´ µ º ¹ ÙÖ º Ê × Ö × Ù Ð × Ô Ö ÐÓ× ­Ù Ó× Ñ Ü ÑÓ× Ð × ¬ ÙÖ × º ¹ Ý º ¹ ºÈÖ ¬ ÙÖ × Ö × ÐØ ÐÓ× Ò Ø ÚÓ× × ÙÒ Ð Óר º Ð ×ÙÔÓ× ÓÒ ÕÙ Ð Óר × Ñ Ò ÑÓº ÈÓÖ Ø ÒØÓ¸ × ÙÒ ­Ù Ó Ñ Ü ÑÓ × Ñ Ò ÑÓ Óר ¸ ÒØÓÒ × ×Ø ÒÓ ÔÙ Ø Ò Ö ÐÓ× Ò Ø ÚÓ× ¯ ⇐= ´ÔÓÖ ÓÒØÖ ÓÒµ ÓÖ ×ÙÔÓÒ ÑÓ× ÕÙ Ø Ò ÑÓ× ÙÒ ­Ù Ó Ñ Ü ÑÓ f¸ × Ò ÐÓ× Ò Ø ÚÓ׸ ÙÝÓ Óר ÒÓ × Ñ Ò ÑÓº ÓÖ ×ÙÔÓÒ ÑÓ× ÙÒ ­Ù Ó Ñ Ü ÑÓ Ù ÐÕÙ Ö f ¸ × Ò ÐÓ× Ò Ø ÚÓ׸ ÙÝÓ Óר ÒÓ × Ñ Ò ÑÓº Ë ÙÒ Ð Ø ÓÖ Ñ º½ × ÓÑÔÓ× ÓÒ ­Ù Ó¸ ÔÓÖ Ð Ú ÔÐ ÓÒ Ð Ð¹ ÓÖ ØÑÓ º ¸ ÔÓ ÑÓ× Ò ÓÒØÖ Ö ÐÓ Ñ × E ÐÓ× Ð ­Ù Ó f Ø Ð ÕÙ Ð ×ÙÑ ÖÐÓ× Ó Ø Ò ÑÓ× Ð ­Ù Ó f º Ë Ò Ñ Ö Ó¸ ÔÙ ×ØÓ ÕÙ f ÒÓ Ø Ò ÐÓ× Ò Ø ÚÓ׸ ר ÓÔ¹ Ö ÓÒ ÒÓ ÔÓ Ö Ö Ð Óר ØÓØ Ð¸ ÐÓ ÕÙ × ÙÒ ÓÒØÖ ÓÒº ÈÓÖ ÓÒ× Ù ÒØ ¸ × ÙÒ ­Ù Ó ÒÓ Ø Ò ÐÓ× Ò Ø ÚÓ׸ ÒØÓÒ × ×Ø × Ñ Ü ÑÓ Ý Óר Ñ Ò ÑÓ Ð ÓÒÓ Ñ ÒØÓ ÕÙ ÒÓ× ÖÖÓ ×Ø Ø ÓÖ Ñ × Ð × ÙÒ Ñ Ð ÓÖ ØÑÓ× ÕÙ Ð ÙÐ Ò Ð ­Ù Ó Ñ Ü ÑÓ ÙÝÓ Óר × Ñ Ò ÑÓº ÙÒ Ñ ÒØ ÐÑ ÒØ ¸ ר Ð × Ð ÓÖ ØÑÓ× × ×ØÖÙ ØÙÖ Ò × Algoritmo 7.11 (Algoritmo gen´rico de eliminaci´n de ciclos negativos) e o Ä Ò¹ ØÖ Ð Ð ÓÖ ØÑÓ × ÙÒ Ö Ô Ø Óר × Nº Ä × Ð × Ð Ñ ×Ñ Ö ÓÒ Ð ­Ù Ó Ñ Ü ÑÓ ÙÝÓ Óר × Ñ Ò ÑÓº ½º Ð ÙÐ ÙÒ ­Ù Ó Ò Ð ×Ó Ö N ´ÔÙ × Ö ÙÒ ­Ù Ó Ñ Ü ÑÓµ
  • 857.
    7.12. Flujos decoste m´ ınimo 831 ¾º while N ÓÒØ Ò ÐÓ× Óר Ò Ø ÚÓ ´ µ Ë C ÙÒ ÐÓ Óר Ò Ø ÚÓ ×Ó Ö Nº Ë cm Ð Ñ Ò Ñ Ô Ö ×Ø ÒØ Ð ÐÓº ´ µ ÙÑ ÒØ Ð ­Ù Ó N Ò Ð Ú ÐÓÖ cmº ÈÖ × ÖÖÓÐÐ Ö ×Ø Ý ÓØÖÓ× Ð ÓÖ ØÑÓ׸ × Ò × Ö Ó ÒרÖÙÑ ÒØ Ö ÙÒ Ñ ÕÙ Ò Ö ×¸Ð Ù Ð ÔÖ × ÒØ Ö ÑÓ× Ò Ð ÔÖÓÜ Ñ ×Ù ¹× ÓÒº 7.12.1 El TAD Net Max Flow Min Cost<TNode,TArc,T> Ð Ì Net Max Flow Min Cost<TNode,TArc,T> ÒרÖÙÑ ÒØ Ð Ñ ÕÙ Ò Ö Ò × Ö Ô Ö ÓÔ Ö Ö Ö × ­Ù Ó ÓÒ Óר × ×Ó Ó׺ ËÙ ×Ô ¬ ÓÒ Ö × Ò Ð Ö ÚÓ tpl maxflow mincost.Hº Net Max Flow Min Cost<TNode,TArc,T> × ÙÒ Ñ ÒØ ×Ó Ö Net Graph<TNode,TArc,T> ÓÒ Ð Ò Ó ÕÙ ×Ù× Ö Ó× Ð Ö Ò Ò ÓÖÑ ÓÒ Ô Ö Ð Óר ¿½ Ö Ó ÓÒ Óר ¿½ ≡ template <typename Arc_Info, typename F_Type = long> class Net_Cost_Arc : public Net_Arc<Arc_Info, F_Type> { typedef F_Type Flow_Type; Flow_Type cost; Flow_Type flow_cost() const { return this->flow*cost; } }; ÓÑÓ Ú ÑÓ׸ ×ÓÐÓ × Ò Ð Óר ÔÓÖ ÙÒ ­Ù Óº ÄÓ× ÒÓ Ó× ×ÓÒ ÐÓ× Ñ ×ÑÓ× ÕÙ Ô Ö Net Graph<TNode,TArc,T>º ÓÒ ÐÓ ÒØ Ö ÓÖ¸ Ý ÔÓ ÑÓ× ¬Ò Ö Ð Ì Net Max Flow Min Cost<TNode,TArc,T> ¿½ Ð × Net Max Flow Min Cost<TNode,TArc,T> ¿½ ≡ template <class NodeT, class ArcT> class Net_Max_Flow_Min_Cost : public Net_Graph<NodeT, ArcT> { Å ØÓ Ó× ÔÙ Ð Ó× Net Max Flow Min Cost<TNode,TArc,T> ¿½ }; Ð Ù×Ó × × Ñ Ð Ö Ð ÐÓ× Ö Ó× Ý Ö × × ×Ô ¬ Ò ÐÓ× ÒÓ Ó× ØÖ Ú × Ð Ø ÔÓ Net Node<Node Info,F Type>¸ ÐÓ× Ö Ó× ÓÒ Net Cost Arc Ý Ð Ö ÓÒ Net Max Flow Min Cost<TNode,TArc,T>º ÍÒ ÔÖ Ñ Ö Ñ ØÓ Ó Net Max Flow Min Cost<TNode,TArc,T> ÓÒ× ×Ø Ò Ó Ö Ö Ð Ô ÓÒ×ÙÐØ Ö Ó ÑÓ ¬ Ö Ð Óר ×Ó Ó ÙÒ Ö Ó ¿½ Å ØÓ Ó× ÔÙ Ð Ó× Net Max Flow Min Cost<TNode,TArc,T> ¿½ ≡ ´ ¿½ µ ¿½ Flow_Type & get_cost(Arc * a) { return a->cost; } × ÓÑÓ ÓÒ×ÙÐØ Ö Ð Óר Ð ­Ù Ó ¿½ Å ØÓ Ó× ÔÙ Ð Ó× Net Max Flow Min Cost<TNode,TArc,T> ¿½ +≡ ´ ¿½ µ ¿½ ¿¾ const Flow_Type & flow_cost(Arc * a) const { return a->flow_cost(); }
  • 858.
    832 Cap´ ıtulo 7. Grafos ÈÙ ×ØÓ ÕÙ Ò ×Ø ÑÓ ÐÓ × Ö ÕÙ Ö Ð Óר ¸ Ø Ò ÑÓ× Ð Ò × ×Ó Ö Ö Ö Ð Ò× Ö ÓÒ Ö Ó ¿¾ Å ØÓ Ó× ÔÙ Ð Ó× Net Max Flow Min Cost<TNode,TArc,T> ¿½ +≡ ´ ¿½ µ ¿½ ¿¾ virtual Arc * insert_arc(Node * src_node, Node * tgt_node, const Flow_Type & cap, const Flow_Type & cost) { Arc * a = Net::insert_arc(src_node, tgt_node, Arc_Type(), cap, 0); a->cost = cost; return a; } ÇØÖ ÐØ ÖÒ Ø Ú × ÑÔÐ Ö Ù ÐÕÙ Ö ÔÖ Ñ Ø Ú Ò× Ö ÓÒ Net Graph<TNode,TArc,T> Ý ÐÙ Ó ×Ô ¬ Ö Ð Óר ¸ Р٠и × ÙÒ Ð ÓÒרÖÙ ØÓÖ Net Cost Arc¸ Ø Ñ Ò ØÓÑ Ú ÐÓÖ ÓÑ × ÓÒ ÖÓº Ð Óר Ð ­Ù Ó Ö ÙÐ ÒØ ÔÓÖ Ð Ö × Ð ÙÐ × ÙÒ ´ º¿ µ Ý × ÒרÖÙÑ ÒØ × ¿¾ Å ØÓ Ó× ÔÙ Ð Ó× Net Max Flow Min Cost<TNode,TArc,T> ¿½ +≡ ´ ¿½ µ ¿¾ Flow_Type compute_flow_cost() { Flow_Type total = 0; for (Arc_Iterator<Net_MFMC> it(*this); it.has_current(); it.next()) { Arc * a = it.get_current(); if (not a->is_residual) total += a->flow_cost(); } return total; } Í× × Arc Iterator º ¬Ò Ó Ð Ì Net Max Flow Min Cost<TNode,TArc,T>¸ ÒÓ× Ó Ö ÑÓ× × ÖÖÓ¹ ÐÐ Ö ÓØÖ × Ô Þ × ÕÙ Ö ÕÙ Ö ÑÓ× Ô Ö ÒרÖÙÑ ÒØ Ö Ð Ð ÓÖ ØÑÓ º½½º 7.12.1.1 Acceso al coste de un arco ÇØÖÓ Ö ÕÙ Ö Ñ ÒØÓ Ð Ð ÓÖ ØÑÓ º½½ × Ð ÔÓ Ö Ø Ø Ö ÐÓ× Ò Ø ÚÓ׺ È Ö ÐÐÓ¸ ÒÓ× × ÖÚ ÑÓ× Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ÔÖ × ÒØ Ó Ò Ü º º¿ ´Ô Ò ¾ µº Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¸ × ÓÑÓ ÐÓ× Ñ × Ð ÓÖ ØÑÓ× Ð ÙÐÓ Ñ ÒÓ× Ñ Ò ÑÓ׸ Ö ÕÙ Ö ÙÒ Ð × ×Ó Ð ×Ø Ò ´Ú × Ü º º½ ´Ô Ò µµº Ò ÒÙ ×ØÖÓ ×Ó¸ ÑÓ× ÑÓ Ð Þ Ö Ð Óר Ò ÙÒ ÓÒ Ð Ú ÐÓÖ ­Ù Ó Ö ÙÐ ÒØ ÔÓÖ Ð Ö Ó Ý ÓÒ× Ö Ö × ×Ø × Ó ÒÓ Ö × Ù Ðº ×ØÓ ÐÓ ÑÓ× × Ù Ò Ó Ð × Ö Ð × ¬Ò ÓÒ ×Ó Ô ×Ó× ÐÓ× Ö Ó× ¿¾ ÙÒ ÓÒ × Ô Ö Net Max Flow Min Cost<TNode,TArc,T> ¿¾ ≡ ¿¿ template <class Net> class Access_Cost { typename Net::Flow_Type operator () (typename Net::Arc * a) const { return a->is_residual ? -((typename Net::Arc *) a->img_arc)->cost : a->cost; } };
  • 859.
    7.12. Flujos decoste m´ ınimo 833 ÓÒ ×Ø Ð × ¸ ÒרÖÙ ÑÓ× Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ Ô Ö ÕÙ Ö Ð ×Ù× Ð ÙÐÓ× Ò ÙÒ ÓÒ Ð Óר Ð ­Ù Ó Ö ÙÐ ÒØ ×Ó Ö ÙÒ Ö Ö × Ù Ðº 7.12.2 Algoritmos de m´ximo flujo con coste m´ a ınimo mediante elimi- naci´n de ciclos o ÓÖ ×ÔÓÒ ÑÓ× ØÓ Ó ÐÓ Ò × Ö Ó Ô Ö ÒרÖÙÑ ÒØ Ö Ú Ö ÒØ × Ð Ð ÓÖ ØÑÓ º½½º ÙÒ Ñ ÒØ ÐÑ ÒØ ¸ ÔÖ × ÒØ Ö ÑÓ× Ó× Ð ÓÖ ØÑÓ׸ ÙÝ Ö Ò ×ØÖ Ò Ð Ñ Ò Ö Ò ÕÙ × Ð ÙÐ ÙÒ Ú ÐÓÖ ­Ù Ó Ò Ðº 7.12.2.1 Eliminaci´n de ciclos con flujo m´ximo inicial o a ÆÙ ×ØÖ ÔÖ Ñ Ö Ú Ö ÒØ ÑÔÐ ÙÒ ­Ù Ó Ñ Ü ÑÓ Ò Ðº ÈÙ ×ØÓ ÕÙ ×ÔÓÒ ÑÓ× ÙÒ ÓÑÔÐ Ø Ñ Ð Ð ÓÖ ØÑÓ× Ô Ö Ñ Ü Ñ Þ Ö ­Ù Ó¸ Ð Ö Ø Ö Ó Ñ Ü Ñ Þ ÓÒ × Ö ÙÒ Ô Ö Ñ ØÖÓ Ð ÔÖ Ñ Ø Ú ¿¿ ÙÒ ÓÒ × Ô Ö Net Max Flow Min Cost<TNode,TArc,T> ¿¾ +≡ ¿¾ ¿ template <class Net, template <class> class Max_Flow_Algo> void max_flow_min_cost_by_cycle_canceling(Net & net, bool leave_residual = false) { typedef Aleph::less<typename Access_Cost<Net>::Distance_Type> Cmp_Dist; typedef Aleph::plus<typename Access_Cost<Net>::Distance_Type> Plus_Dist; typedef Res_F<Net> Res_Filter; Max_Flow_Algo <Net> () (net, true); // obtiene un flujo m´ximo inicial a Path<Net> cycle(net); // aqu´ se guardan ciclos negativos ı // eliminar ciclos negativos mientras estos existan ´ while (Bellman_Ford_Negative_Cycle <Net, Access_Cost<Net>, Cmp_Dist, Plus_Dist, Res_Filter>()(net, cycle)) if (increase_flow <Net> (net, cycle) == 0) break; if (not leave_residual) net.unmake_residual_net(); } Í× × Path ¼¾ º Ä Ö Ñ ÜÑÞ Óר Ñ Ò ÑÓ Ð ÙÐ ÔÓÖ ×Ø ÔÖÓ Ö Ñ ÓÒ Ð Ð ÓÖ ØÑÓ ÓÖ ¹ ÙÐ Ö×ÓÒ × ÑÓ×ØÖ Ò Ð ¬ ÙÖ º º Ð Óר Ñ Ò ÑÓ Ð ­Ù Ó Ñ Ü ÑÓ × 13620º Ò ×Ø ÑÓÑ ÒØÓ ÔÙ Ö× ÕÙ ÒÓ× Ò ÓÒØÖ ÑÓ× Ò ÙÒ ÔÙÒØÓ ÙÐÑ Ò ÒØ ר Ø ÜØÓº ÓÑÓ Ú ÑÓ׸ Ð ÖÙØ Ò max flow min cost by cycle canceling() ÒרÖÙÑ ÒØ Ð Ð ÓÖ ØÑÓ º½½ ÙÒ Ñ Ò Ö ÔÖ Ø Ñ ÒØ ÒØ × ÑÔÐ ÔÓ× Ð Ö × ÕÙ ÒÓ× ÔÓÝ ÑÓ× ×Ó Ö ØÓ ÙÒ Ñ ÕÙ Ò Ö ×ØÖÙ ØÙÖ ØÓ× Ý Ð ÓÖ ØÑÓ׺ Ò ×Ø ×Ó¸ ÔÓ ÑÓ× Ñ Ò ÓÒ Ö Ð Ì List Graph<Node, Arc> × ÓÑÓ ×Ù× Ð × × Ö Ú ×º Ð Ñ ×ÑÓ ÑÓ Ó¸ ר Ð ÓÖ ØÑÓ ×Ù Ý ×Ó Ö ÓØÖÓ× Ð ÓÖ ØÑÓ׸ ÐÓ× Ù Ð × Ñ Ò ÓÒ Ö Ð Ù×ÕÙ Ñ ÒÓ× ÙÑ ÒØÓ¸ Ñ Ü Ñ Þ ÓÒ ­Ù Ó¸ Ñ ÒÓ× Ñ × ÓÖØÓ× Ý ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ׸ ÒØÖ ÓØÖÓ׸ ÐÓ× Ù Ð × ×Ù Ú Þ ×Ù Ý Ò Ò Ñ × ×ØÖÙ ØÙÖ × ØÓ× Ý Ð ÓÖ ØÑÓ׺ 7.12.2.2 Eliminaci´n de ciclos mediante supra-arco negativo o ÇØÖÓ Ð ÓÖ ØÑÓ × Ó Ð Ñ Ò ÓÒ ÐÓ× Ò Ø ÚÓ× Ô ÖØ × ÙÒ Ú ÐÓÖ ­Ù Ó ÒÙÐÓº ÄÙ Ó × ÙÑ ÒØ Ð ­Ù Ó Ò ÙÒ Ú ÐÓÖ Ó¸ × Ð Ñ Ò Ò ÐÓ× Ò Ø ÚÓ× Ý × ÚÙ ÐÚ Ù¹
  • 860.
    834 Cap´ ıtulo 7. Grafos Ë ¼» ¼» ¼ ¼» ¼»¾¼ ¿¼»¾¼» ¿¼»½¼»¾¼ ¼»¼» ¼ ¿¼»¿¼»½¼ ½¼»½¼»½ ¼»¾¼»¾¼ ¼»¼»¿¼ ¼» ¼»½¼ ¿¼»½¼»½ ¼»¼»¿ ¾¼»¼»¿¼ ¼»¿¼»¿¼ Á ¼»½¼»¾¼ ¿¼»¼»¾¼»¾¼» À ¼»¼» ¼ ½ »¼» ¼» ¼»¾ ¼»¾¼»¿¼ ¼» ¼» ¼ à ¿¼»¼»¾ ¼» ¼»½  ¼» ¼»¾¼ Ì ÙÖ º ÐÙ Ó Ñ Ü ÑÓ Óר Ñ Ò ÑÓ Ð Ö Ð ¬ ÙÖ º ÔÖÓ Ù Ó ÔÓÖ Ð Ð Ñ Ò ÓÒ ÐÓ× ÓÒ ­Ù Ó Ñ Ü ÑÓ Ò Ð Ñ ÒØ Ö Ð ­Ù Óº Ð ÔÖÓ Ñ ÒØÓ × ÔÐ ×Ù × Ú Ñ ÒØ ר ÕÙ Ý ÒÓ Ý Ò ÐÓ× Ò ¹ Ø ÚÓ× ÑÓÑ ÒØÓ Ò Ð Ù Ð¸ ÔÓÖ Ð ÓÒÓ Ñ ÒØÓ ÕÙ ÒÓ× ÔÓÖØÓ Ð ÔÖÓÔÓ× ÓÒ º½ ´⇐=µ¸ × ÑÓ× ÕÙ Ð ­Ù Ó × Ñ Ü ÑÓº ÓÖ Ò¸ ÔÓÖ Ù Ð Ú ÐÓÖ ­Ù Ó ÓÑ ÒÞ Ö Ë Ò Ü ×Ø Ò Ú Ö × Ý ÒØ Ù × Ø Ò × ½ ¸ ¿½¸ ¾ ¸ ÙÒ ÕÙ × Ö Ø Ö Þ ÔÓÖ ×Ù × ÑÔÐ Ý Ú ÐÓ ¹Ö Ð Ø Ú Ð Ð× Ð ÓÖ ØÑÓ¹¸ ÓÒ× ×Ø Ò Ò Ö ÙÒ Ð ÞÓ ÒØÖ Ð Ù ÒØ Ý Ð ×ÙÑ ÖÓ ÓÒ ­Ù Ó Ñ ÝÓÖ Ð Ñ Ü ÑÓ Ý Óר Ò Ø ÚÓ ÙÝÓ Ú ÐÓÖ ×ÓÐÙØÓ × Ñ ÝÓÖ Ð Óר ØÓØ Ð Ù ÐÕÙ Ö Ñ ÒÓ ÒØÖ Ð Ù ÒØ Ý Ð ×ÙÑ ÖÓº ר Ð ÞÓ ÐÓ ÐÐ Ñ ÑÓ× ×ÙÔÖ ¹ Ö Ó º ר ØÖÙ Ó ÒÓ× Ô ÖÑ Ø Ö Ú Ö Ð Ð ÙÐÓ Ò Ð Ð ­Ù Ó Ñ Ü ÑÓ Ö Ø Ö Ø Ú Ñ ÒØ Ð ÙÐ Ò Ó Ð Ñ Ò ÑÓ Óר Ð Ú Þ ÕÙ Ñ Ü Ñ Þ ÑÓ× Ð Ö º Ä × Ö Ö ÙÒ ÐÓ Ò Ø ÚÓ Ò Ð¸ Ù Ð ÔÙ Ô ØÓÖ Þ Ö× Ð × Ù ÒØ ÑÓ Ó s Red t f > max/ − VC − 1 ÄÓ× ÐÓ× ÕÙ ÓÒØ Ò Ò Ð ×ÙÔÖ ¹ Ö Ó ÙÒ Ò Ñ ÒÓ× ÙÑ ÒØÓ¸ ÔÙ × Ò ÐÙÝ Ò ÙÒ Ñ ÒÓ ÒØÖ Ð Ù ÒØ Ý Ð ×ÙÑ ÖÓº ÍÒ ÒØ ÒØÓ Ð Ñ Ò ÓÒ ×Ø ÐÓ ÑÙ Ú Ð
  • 861.
    7.12. Flujos decoste m´ ınimo 835 Ñ ÝÓÖ ÒØ ÔÓ× Ð ­Ù Ó Ð ×ÙÔÖ ¹ Ö Ó Ð Ñ ÒÓ ÙÑ ÒØÓ ÒØÖ Ð Ù ÒØ Ý Ð ×ÙÑ ÖÓº Ë ÙÒ × Ð Ú ÐÓÖ Ð ×Ð ÓÒ Ñ Ò ÑÓ Ð ÐÓ ÔÙ Ó ÒÓ Ð Ñ Ò Ö× º × ¸ ר Ð × ÐÓ× ÙÑ ÒØ Ð ­Ù Óº ÄÓ× ÐÓ× ÕÙ ÒÓ ÓÒØ Ò Ò Ð ×ÙÔÖ ¹ Ö Ó ×Ø Ò ÓÑ Ò Ó׸ Ò Ð × ÒØ Ó × Ö Ò Ø ÚÓ× ÔÓÖ Ö Ó× Ö ØÖÓ ×Ó ´Ó Ö × Ù Ð ×µº ËÙ Ð Ñ Ò ÓÒ Ö Ù Ð Óר ØÓØ Ð Ð ­Ù Óº Ð Ò ÓÕÙ ÒØ Ö ÓÖ Ø Ò Ð Ö Ò Ú ÒØ × Ö Ö Ð Ø Ú Ñ ÒØ × Ò ÐÐÓ ÑÔÐ Ñ Ò¹ Ø Ö¸ ÔÙ × ÒÓ Ö ÕÙ Ö ÜÔÐ Ø Ñ ÒØ Ô Ò× Ö Ò Ð ÓÖ ØÑ ­Ù Ó Ñ Ü ÑÓ¸ Ñ ÒÓ× ÙÑ ÒØÓ Ý ÓØÖ × Ó× ×º ËÓÐÓ Ö ÕÙ Ö ÑÓ× Ð × ×ØÖÙ ØÙÖ × ØÓ׸ Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ Ý Ð Ð ÓÖ ØÑÓ Ì Ö Ò¸ Ù Ð × ×ÓÒ Ö Ð Ø Ú Ñ ÒØ × Ò ÐÐÓ× ÑÔÐ Ñ ÒØ Öº ×ØÓ Ó Ö Ö ÑÔÓÖØ Ò ¸ ×Ó Ö ØÓ Ó¸ × ÒÓ ×ÔÙ× Ö ÑÓ× ÙÒ ÓÖÔÙ× Ð ÓØ Ö Ó × Ñ Ð Ö Ð ×Ø Ø ÜØÓº Ð ÔÖ Ñ Ö Ô ×Ó Ð × ÒÓ ×Ø Ð ÓÖ ØÑÓ × ÔÐ ÒØ Ö Ð Ò× Ö ÓÒ Ð ×ÙÔÖ ¹ Ö Ó ¿ ÙÒ ÓÒ × Ô Ö Net Max Flow Min Cost<TNode,TArc,T> ¿¾ +≡ ¿¿ ¿ template <class Net, template <class> class Cost> static typename Net::Arc * create_dummy_arc(Net & net) { const typename Net::Flow_Type max_cost = net.get_num_nodes() * search_max_arc_cost <Net, Cost> (net); net.make_residual_net(); typename Net::Node * src = net.get_source(); typename Net::Node * tgt = net.get_sink(); const typename Net::Flow_Type max_flow = Aleph::min(net.get_out_cap(src), net.get_in_cap(tgt)); typename Net::Net::Digraph * digraph = &net; typename Net::Arc * a = digraph->insert_arc(src, tgt, typename Net::Arc_Type()); net.get_cookie() = a; typename Net::Arc * img = digraph->insert_arc(tgt, src, typename Net::Arc_Type()); digraph->desconnect_arc(a); // no es supra-arco, pero se deja por coste a->is_residual = false; a->img_arc = img; a->cap = max_flow; a->cost = max_cost; a->flow = 0; img->is_residual = true; img->img_arc = a; img->cap = max_flow; img->cost = max_cost; img->flow = 0; return img; } È Ö ÕÙ Ð Ð × Ó × ÖÚ ÓÒ ×Ø Ò Access Cost ÓÒ× Ö Ð ×ÙÔÖ ¹ Ö Ó Ò Ø ÚÓ¸ ר × Ö Ö × Ù Ðº ÐÐ ÕÙ Ö ÑÓ× Ó× Ö Ó׸ ÙÒÓ Ö × Ù Ð¸ ÕÙ × Ð ×ÙÔÖ Ö Ó¸ Ý ÓØÖÓ ÒÓÖÑ Ð¸ ÕÙ × ×Ð Ó Ð Ö Ñ ÒØ desconnect arc() ר ÑÓ Ó¸ Ð Ö Ó Ô Ö Ð ÐÓ Ð ×ÙÔÖ ¹ Ö Ó ÒÓ × Ú ×ØÓ ÔÓÖ Ò Ò ÙÒ Ø Ö ÓÖ Ö Ó׺ create dummy arc() Ô Ð Ó× ÖÙØ Ò ×º Ä ÔÖ Ñ Ö ¸ compute max possible flow()¸ Ö ØÓÖÒ Ð Ñ Ü ÑÓ Ú ÐÓÖ ­Ù Ó ÕÙ ÔÙ Ð ÒÞ Ö Ð Ö Ò ÙÒ ÓÒ Ð × Ô × ×Ð Ð Ù ÒØ Ý ÒØÖ Ð ×ÙÑ ÖÓº Ä × ÙÒ ÖÙØ Ò ¸ search max arc cost()¸
  • 862.
    836 Cap´ ıtulo 7. Grafos Ö ØÓÖÒ Ð Ñ ÝÓÖ Ú ÐÓÖ Ð Óר C ÒØÖ ØÓ Ó× ÐÓ× Ö Ó× Ð Ö º Ð Óר Ñ Ü ÑÓ Ð ÙÒ ­Ù Ó Ö ×Ø ÓØ Ó ÔÓÖ V C¸ Ù Ð × Ñ ÝÓÖ ÕÙ Ð Ñ Ü Ñ ÐÓÒ ØÙ Ò Ö Ó× ÙÒ ÐÓ ´ Ö ÙÐ ÓÒµº Ë Ñ ØÖ Ó create dummy arc()¸ Ý ÓØÖ ÔÖ Ñ Ø Ú ÐÐ Ñ destroy dummy arc()¸ Ð Ù Ð Ð Ñ Ò Ð ×ÙÔÖ ¹ Ö Ó Ý Ð Ö Ö × Ù Ðº ÓÖ Ý ×Ø ÑÓ× Ð ×ØÓ× Ô Ö × ÖÖÓÐÐ Ö Ð Ð ÓÖ ØÑÓ ¿ ÙÒ ÓÒ × Ô Ö Net Max Flow Min Cost<TNode,TArc,T> ¿¾ +≡ ¿ template <class Net> void max_flow_min_cost_by_cycle_canceling(Net & net) { typedef Aleph::less<typename Access_Cost<Net>::Distance_Type> CmpD; typedef Aleph::plus<typename Access_Cost<Net>::Distance_Type> PlusD; typedef Res_F<Net> Res_Filter; create_dummy_arc <Net, Access_Cost> (net); Path<Net> cycle(net); // aqu´ se guardan ciclos negativos ı while (Bellman_Ford_Negative_Cycle <Net, Access_Cost<Net>, CmpD, PlusD, Res_Filter> () (net, cycle)) if (increase_flow <Net> (net, cycle) == 0) ((typename Net::Arc *) net.get_cookie())->cost = 0; destroy_dummy_arc(net); } Í× × Path ¼¾ º Ð ­Ù Ó Ý Óר Ð ×ÙÔÖ ¹ Ö Ó ×Ø Ò Ð ÙÐ Ó× × Ö ÙÒ ÔÓ Ó Ñ × ÐØÓ× ÕÙ Ð ­Ù Ó Ñ Ü ÑÓ Ý Ð Óר Ñ Ü ÑÓ ÔÓ× Ð º Ë Ò Ñ Ö Ó¸ ÒÓ ÓÒÓ ÑÓ× ÔÖ ÓÖ ×ØÓ× Ú ÐÓÖ ×º Ò ÐÓ ÕÙ ÓÒ ÖÒ Ð Ú ÐÓÖ ­Ù Ó¸ ר ÔÓ Ö × Ö Ñ ÒÓÖ ´Ý ÕÙ Þ ÔÓÖ ÑÙ Óµ ÕÙ Ð Ô ×Ð Ð Ù ÒØ Ó Ð ÒØÖ Ð ×ÙÑ ÖÓº × ÔÓ× Ð ¸ Ô٠׸ Ö Ò ÙÒ × ØÙ ÓÒ Ò Ð Ù Ð × ÑÔÖ Ò ÓÒØÖ ÑÓ× ÙÒ ÐÓ Ò Ø ÚÓ ÓÒ Ð ×ÙÔÖ ¹ Ö Ó Ð Ù Ð ÒÓ × ÔÓ× Ð Ö Ù ÖÐ Ð Óר ´ÔÓÖÕÙ Ð ­Ù Ó Ý ×Ø Ñ Ü Ñ Þ Óµº ÈÓÖ Ø ÒØÓ¸ ÑÓ× Ù× Ö ÐÓ× Ò Ø ÚÓ× ÕÙ ÒÓ Ò ÐÙÝ Ò Ð ×ÙÔÖ ¹ Ö Óº ÍÒ Ø ÒØ ÓÒ Ô Ö ÖÐÓ × ÑÔÐ Ö ÙÒ Ø Ö ÓÖ Ö Ó× ÕÙ ¬ÐØÖ Ð ×ÙÔÖ ¹ Ö Ó¸ Ô ÖÓ¸ Ô ÖØ ÕÙ ÒÓ × Ö ØÓ Ö ÓÒÓ Ö Ð ×ÙÔÖ ¹ Ö Ó¸ × ÒÒ × Ö Óº Ë ÒÓ × ÔÙ ÙÑ ÒØ Ö Ð ­Ù Ó ØÖ Ú × ÙÒ ÐÓ ÕÙ Ò ÐÙÝ Ð ×ÙÔÖ ¹ Ö Ó¸ ÒØÓÒ ×¸ × ÙÒ Ð ÔÖÓÔÓ× ÓÒ º½¼ ´Ô º ¿µ¸ Ð ­Ù Ó × Ñ Ü ÑÓº Ò ×Ø ÑÓÑ ÒØÓ × ÐØ Ö Ð Óר Ð ×ÙÔÖ ¹ Ö Ó Ð Ú ÐÓÖ ÒÙÐÓ ÐÓ ÕÙ ÕÙ Ð Ö ×ØÓ Ð × Ø Ö ÓÒ × Ù×ÕÙ Ò ÐÓ× × Ò Ð ×ÙÔÖ ¹ Ö Ó Ý × ÓÒ× Ö Ò Ö Ù Ö Ð Óר ØÓØ Ðº 7.12.3 An´lisis de los algoritmos basados en eliminaci´n de ciclos nega- a o tivos È Ö Ò ÐÞ ÖÐ Ð × Ð ÓÖ ØÑÓ× ÕÙ ÑÓ× ×ØÙ Ö ÑÓ× Ô Ð Ö ÐÓ× Ò Ð × × ÔÖ Ú Ó× ­Ù Ó× Ñ Ü ÑÓ× Ý Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ º Ä × Ù ÒØ ÔÖÓÔÓ× ÓÒ ÐÙ Ð Ö ×Ô ØÓº Proposici´n 7.19 o Ë N =< V, E, s, t, C, C > ÙÒ Ö Ô Ø ÓÒ Óר ׺ Ë F Ð Ú ÐÓÖ ­Ù Ó Ñ Ü ÑÓº Ë C Ð Ñ Ü ÑÓ Óר ÙÒ ­Ù Ó Ñ Ü ÑÓº ÒØÓÒ ×¸ × Ð Ö Ó × ×Ô Ö Ó¸ Ð ÙÖ ÓÒ Ù ÓÒ Ð Ð ÓÖ ØÑÓ º½½ ר ÓØ ÔÓÖ O(V 3 C F)º Demostraci´n o Ð Ô ÓÖ × Ò Ö Ó ÕÙ ÔÓ ÑÓ× Ò ÓÒØÖ Ö × ÕÙ ÖÓØÒ ¹ Ô F Ý Óר C º Ò ×Ø × ØÙ ÓÒ¸ ÔÙ Ð ÒÞ Ö× ÙÒ Óר Ñ Ü ÑÓ Ö O(E C M)º
  • 863.
    7.12. Flujos decoste m´ ınimo 837 Ë ¼» ¼» ¼ ¼» ¼»¾¼ ¿¼»¾¼» ¿¼»½¼»¾¼ ¼»¼» ¼ ¿¼»¿¼»½¼ ½¼»½¼»½ ¼»¾¼»¾¼ ¼»¼»¿¼ ¼» ¼»½¼ ¿¼»½¼»½ ¼»¼»¿ ¾¼»¼»¿¼ ¼»¿¼»¿¼ Á ¼»½¼»¾¼ ¿¼»¼» ¾¼»¾¼» À ¼»¼» ¼ ½ »¼» ¼» ¼»¾ ¼»¾¼»¿¼ ¼» ¼» ¼ à ¿¼»¼»¾ ¼» ¼»½  ¼» ¼»¾¼ Ì ÙÖ º ÐÙ Ó Ñ Ü ÑÓ Óר Ñ Ò ÑÓ Ð Ö Ð ¬ ÙÖ º ÔÖÓ Ù Ó ÔÓÖ Ð Ð Ñ Ò ÓÒ ÐÓ× × Ò ­Ù Ó Ò Ð Ý ×ÙÔÖ ¹ Ö Ó Ð ÑÓÑ ÒØÓ Ö ÓÒ ×Ø ÑÓ×ØÖ ÓÒ¸ ÐÓ× Ñ ÓÖ × Ð ÓÖ ØÑÓ× ÓÒÓ Ó× Ô Ö Ù×ÕÙ ÐÓ× Ò Ö Ó× × × Ò Ò ÙÒ Ù×ÕÙ Ò ÔÖÓ ÙÒ ÐÓ Ù Ð × ÒÙ ×ØÖÓ ×Ó¸ ÔÙ × ÑÔÐ ÑÓ× Ð Ð ÓÖ ØÑÓ Ì Ö Ò ´Ü º º¿º¾ ´Ô Ò µµ¸ Ð Ù Ð × O(E)º × Ð Ò Ð × × Ð Ð ÓÖ ØÑÓ ÓÖ ¹ ÙÐ Ö×ÓÒ ´Ü º½¼º½½º½ ´Ô Ò µµ¸ × ÑÓ× ÕÙ ÔÙ Ò Ö ÕÙ Ö Ö× O(F) Ö Ô Ø ÓÒ × Ô Ö Ñ Ü Ñ Þ Ö Ð ­Ù Ó¸ ×Ó ÜØÖ ÑÓ Ù Ò Ó × ÙÑ ÒØ Ò Ö ÙÐ ÓÒ × Ò ÙÒ ÙÒ º ÈÓÖ Ø ÒØÓ¸ Ñ Ü Ñ Þ Ö Ð ­Ù Ó ÔÙ Ö ÕÙ Ö Ö O(EF)º È ÖÓ ÙÒ Ò Ð × × Ò ÐÓ Ó Ð Ð Ô ÖÖ Ó ÒØ Ö ÓÖ¸ ÒÓ× ÖÖÓ Ð ÔÓ× Ð ÕÙ ÔÙ Ò Ö ÕÙ Ö Ö× O(E C F) ×Ñ ÒÙ ÓÒ × Óר Ô Ö ×Ñ ÒÙ Ö Ð Óר Ð Ñ Ò ÑÓº ÙÒ ×Ø × ×Ñ ÒÙ ÓÒ × Ö ÕÙ Ö ÒÚÓ Ö Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¸ Р٠Р׸ × ÙÒ ÐÓ Ò Ð Þ Ó Ò Ü º º¿º ´Ô Ò ¿ µ¸ O(V E)º ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ð Ð ÓÖ ØÑÓ ÔÙ ØÓÑ Ö O(E C F) × O(V E) = O(V E2 C F)º Ë Ð Ö Ó × ×Ô Ö Ó¸ ÒØÓÒ × E ≈ cV ¸ ÓÒ c × ÓÒר ÒØ º ×ØÓ ÒÓ× ÖÖÓ ÙÒ ÓÑÔÐ O(V 3 C F) Ò Ö ÓÖ Ð ÔÖ Ø ¸ ר Ò Ð × × × ÑÙÝ Ô × Ñ ×Ø º Ò Ð ÔÖÓÑ Ó¸ Ð ÙÖ ÓÒ × ÑÙ Ó Ñ ÓÖº Ë Ò Ñ Ö Ó¸ ÔÓÖ Ù×ÕÙ ÐÓ¸ ר Ð × Ð ÓÖ ØÑÓ ÒÓ ÔÖÓÚ Ð Ð ÙÐÓ Ö Ð Þ Ó Ý ÓÒÓ Ñ ÒØÓ Ó Ø Ò Ó ÔÓÖ Ù×ÕÙ × ÒØ Ö ÓÖ × ¹ ÐÓ׺ Ò Ò ÙÖ ¸ Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ Ö ØÓÖÒ ÐÓ× Ò Ø ÚÓ× Ò ÖÙØÓ ÒÓ Ò × Ö Ñ ÒØ ÕÙ ÐÐÓ× ÕÙ ÔÙ Ò Ð Ö Ö Ð ÙÑ ÒØÓ Ð ­Ù Ó Ó Ð Ö Ù ÓÒ Ð Óר º
  • 864.
    838 Cap´ ıtulo 7. Grafos 7.12.4 Problemas que se reducen a enunciados de flujo m´ximo a coste a m´ ınimo ØÓ× Ñ ÓÖ Ö ÒÙ ×ØÖ ÓÑÔÖ × ÓÒ¸ ÓÒ× Ö ÑÓ× ÙÒ ÔÓØ Ø × ØÙ ÓÒ Ñ ÖÓ¹ ÓÒÓÑ ÕÙ Ú Ò ÙÐ ÔÖÓ Ù ØÓ× ÖÓÔ Ù Ö Ó׸ Ö ÓÒ × Ó Ô × × ÔÖÓ Ù ØÓÖ × Ý Ù × ÕÙ Ñ Ò Ò ÐÓ× ÔÖÓ Ù ØÓ׿ º ¼ ¼ ½¾¼ ÖÕÙ × Ñ ØÓ ¿½¼ ¾ ¼ È × Ó ¼ Ð ÓÒ Ö × ¿¼¼ ¼¼ È × Ó ¼¼ ËÙ Ö ¼¼ ½ ¼ Ö ÒØ Ò ÈÓÐÐÓ ¿ ¼ ¼ Å Ö ¼¼ ¾¼¼ ÙÐ ÖÖÓÞ ¼¼ ÖÒ Ö × ¼ ¼ ¼ ÖÒ Ö × ¼ ÈÓÐÐÓ ¾¼¼ ¼¼ Ö × Ð Å Ö Ó ½ ¼ ¾ ¼ ÓÐÓÑ ¼ ¾ ¼ ¼ ÖÖÓÞ ¼¼ ÈÓÖØÙ Ù × ¿¿¼ ÈÙ ÖØÓ ÇÖ Þ Ù ÓÖ ¿¼¼ ´ µ ÈÖÓÚ ÓÖ × ´ µ Ñ Ò ÒØ × ÙÖ º Ö Ó× ÔÖÓÚ ÓÖ × Ý Ñ Ò × Ð Ñ ÒØÓ× Ò Ð × ÒØ Ó Ý ÜÔÐ Ó¸ ×ÙÔÓÒ ÑÓ× ÓÑÓ ÔÖÓ Ù ØÓ× Ð ÖÒ ¸ ÔÓÐÐÓ¸ Ô × Ó Ý ÖÖÓÞ Ý ÓÑÓ ÔÖÓ Ù ØÓÖ × Ð ÓÒ¸ ËÙ Ö ¸ ÈÓÖØÙ Ù × ¸ ÙÐ ¸ Ö ÒØ Ò ¸ Ù ÓÖ¸ ÓÐÓѹ Ý Ö × Ðº Ä × Ô × ÔÖÓ Ù ÓÒ ÞÓÒ × Ô ØÓÖ Þ Ò Ò Ð Ö Ó Ð ¬ ÙÖ º ¹ º¸ Ð Ù Ð ÔÙ ÒØ ÖÔÖ Ø Ö× ÓÑÓ ÙÒ ×ÕÙ Ñ ÔÖÓÚ × ÓÒº Ð Ñ ×ÑÓ ÑÓ Ó¸ Ð × Ö ÓÒ × Ö Ò ÙÒ Ñ Ò ÐÓ× ÔÖÓ Ù ØÓ׺ Ò ÒÙ ×ØÖÓ ÔÓØ Ø Ó ÑÔÐÓ¸ Ð Ö Ó Ð ¬ ÙÖ º ¹ ÐÙ×ØÖ Ð × Ò × × ÐÓ× ÔÖÓ Ù ØÓ× ÔÓÖ Ö ÓÒº È Ö ×ØÙ Ö Ð Ø Ð × Ø × ÓÒ Ò × × × ÙÒ Ð × Ô × ÔÙ Ù× Ö× ÙÒ Ú Ö ÒØ Ð Ø Ò ÜÔÐ Ò Ü º½½º¾ ´Ô Ò ¼ µ¸ Ð Ù Ð × Ô ØÓÖ Þ Ò Ð ¬ ÙÖ º ¼º Ä ÓÒ× ×Ø Ò Ù× ÓÒ Ö ÐÓ× ÒÓ Ó× ÔÖÓ Ù ØÓ× Ý × ÓÒ Ø Ö ÔÖÓ Ù ØÓÖ × ÓÒ Ñ Ò ÒØ ׺ Ò ×Ø ×Ó¸ Ð Ô ÙÒ Ö Ó ÒØÖ ÔÖÓ Ù ØÓ Ý Ù Ö ÔÖ × ÒØ Ð Ñ Ò ¹× Ò Ò × Ô ÖØ Ö Ð ÒÓ Ó Ù ÓÑÓ × ÜÔÐ Ò Ü º½½º¾ ´Ô Ò ¼ µ¹ º ÄÙ Ó × ÒÐ Þ Ò ÐÓ× ÔÖÓ Ù ØÓÖ × ÓÒ ÙÒ ×ÙÔÖ ¹ Ù ÒØ Ñ ÒØ Ö Ó× Ô Ò¬Ò Ø Ý ÐÓ× Ñ Ò ÒØ × ÓÒ ÙÒ ×ÙÔÖ ¹×ÙÑ ÖÓ ÓÒ Ö Ó× Ô Ò¬Ò Ø ´ Ò ×Ó ÕÙ × × Ú Ð Ö Ð Ø Ð µº ÄÙ Ó Ñ Ü Ñ Þ Ö Ð ­Ù Ó¸ × ÖÓ × ¿ Ä × ØÙ ÓÒ × ÓÑÔÐ Ø Ñ ÒØ ÔÓØ Ø º
  • 865.
    7.12. Flujos decoste m´ ınimo 839 ½ ¼ ¼ ¿¼¼ ¼ Ð ÓÒ È × Ó ¼¼ ∞ ¼ ËÙ Ö ∞ ½ ¼ ÈÓÖØÙ Ù × ¼¼ ¿½¼ ∞ Å Ö Ó ¿¿¼ ÖÖÓÞ ¾¼¼ ∞ ∞ Ù ÓÖ ¾ ¼ Ë ∞ ¼¼ ÖÕÙ × Ñ ØÓ ∞ ÓÐÓÑ ∞ ∞ ¼ Ì ∞ ¾ ¼ ¼ Å Ö ∞ Ö × Ð ∞ ∞ ¼ ¾ ¼ Ö × ∞ ¼¼ ¼ ÖÒ Ö × Ö ÒØ Ò ÈÙ ÖØÓ ÇÖ Þ ¿ ¼ ¼¼ ¼¼ ¿¼¼ ÙÐ ¾¼¼ ¼¼ ½¾¼ ÈÓÐÐÓ ¼ ¼ ¼ ÙÖ º ¼ Ê ÕÙ Ú Ð ÒØ Ô Ö Ð ÙÐ Ö Ø Ð ÔÖÓÚ × ÓÒ» Ñ Ò ÔÖÓ Ù ØÓ Ñ Ò ÒØ Ø Ò ­Ù Ó Ù Ð ×Ù Ô ¸ ÒØÓÒ × Ð ­Ù Ó × Ø Ð × Ö¸ Ð Ñ Ò ÔÙ × Ö × Ø × º ÓÒÓ Ö × Ð ­Ù Ó × Ø Ð Ó ÒÓ × × Ò Ð ÒØ × Ô Ò× Ö Ò Óר × ØÖ Ò×ÔÓÖØ Ó Óר × Ð ÔÖÓ Ù ØÓ¸ ÔÙ × Ð ÔÐ ÒØ Ñ ÒØÓ Ö Ñ Ò ÙÒ ÓÒ Ð Ø Ð ¹ º ÆÓØ ÑÓ× ÕÙ Ð ×ÙÑ Ñ Ò × Ú Ö×Ù× Ð ×ÙÑ ÔÖÓÚ × ÓÒ × ÒÓ Ò × Ö Ñ ÒØ ÖÖÓ Ð Ø Ð ¸ ÔÙ × ×Ø Ô Ò Ð ÔÓ× Ð ÐÐ Ú Ö Ð ÔÖÓ Ù ØÓ Ð Ñ Ò ÒØ º Ò Ø ÖÑ ÒÓ× ÙÒ Ö ¸ Ð Ü ×Ø Ò Ö Ó× ÒØÖ Ð ÔÖÓ Ù ØÓ Ý Ð Ñ Ò ÒØ º 7.12.4.1 Transporte Ò Ø ÖÑ ÒÓ ÓÖÑ Ð × Ý Ò Ö Ð ×¸ Ò Ð ÔÖÓ Ð Ñ Ð ØÖ Ò×ÔÓÖØ × Ø Ò Ò m ÔÖÓÚ ÓÖ × Ý n Ñ Ò ÒØ ׺ ÔÖÓÚ ÓÖ Ø Ò ÙÒ ÖØ Ô ÔÖÓÚ × ÓÒ Ý Ñ Ò ÒØ Ø Ò ÙÒ Ò × Ó Ñ Ò ÔÖÓÚ × ÓÒº ÈÓÖ ×Ó ÓÒ ÒØÖ ÙÒ ÔÖÓÚ ÓÖ i Ý ÙÒ Ñ Ò ÒØ j Ü ×Ø ÙÒ Óר ØÖ ×ÔÓÖØ ci,jº ÓÑÓ ÑÔÐÓ¸ ÓÒ× Ö ÑÓ× Ð × Ù ÒØ Òר Ò Ñ Ò ÒØ × D1 D2 D3 D4 D5 D6 Ñ Ò ¿¼ ¼ ½¼ ¾ ½ ¾¼ ½ ¼ ÈÖÓÚ ÓÖ × ÈÖÓÚ × ÓÒ P1 ¿¼ ¿¼ ¼ ½ ½ ¾¼ P2 ¼ ½ ¾¼ ½¼ ¾¼ ¾¼ P3 ¾ ½¼¼ ½¾¼ ¼ ¼ P4 ¼ ¾ ¼ ¿¼ ¾¼ ¿¼ P5 ¼ ¿ ¼ ¼ ½ ¾ ¼
  • 866.
    840 Cap´ ıtulo 7. Grafos Ð ÔÖÓ Ð Ñ Ð ØÖ Ò×ÔÓÖØ ÔÙ ÑÓ Ð Þ Ö× Ý Ö ×ÓÐÚ Ö× Ñ ÒØ ÙÒ Ö Ô ¹ Ø º Ð ÒÓ Ó Ù ÒØ ÓÒ Ø ÐÓ× ÔÖÓÚ ÓÖ × ÓÒ Ô × Ù Ð × Ð × ÔÖÓÚ × ÓÒ × Ý Óר × ÒÙÐÓ׺ ÄÓ× ÒÓ Ó× Ñ Ò ÒØ × × ÓÒ Ø Ò Ð ×ÙÑ ÖÓ ÓÒ Ô × ÙÐ× ×Ù× Ñ Ò × Ý Óר × ÒÙÐÓ׺ Ò ÐÑ ÒØ ¸ Óר ØÖ Ò×ÔÓÖØ × Ö ÔÖ × ÒØ ÔÓÖ ÙÒ Ö Ó × Ð ÔÖÓÚ ÓÖ Ð Ñ Ò ÒØ ÓÒ Ô Ò¬Ò Ø ¹Ó ÙÒ Ú ÐÓÖ ×ÙÔ Ö ÓÖ Ó Ù Ð ÕÙ Ð ÔÖÓÚ × ÓÒ¹ Ý ÓÒ Óר Ù Ð Ð ØÖ Ò×ÔÓÖØ × Ð ÔÖÓÚ ÓÖ Ð Ñ Ò ÒØ º Ä ¬ ÙÖ º ½ ÐÙ×ØÖ Ð ÑÓ ÐÓ Ò Ö Ô Ø ÒÙ ×ØÖ Òר Ò ÑÔÐÓº ∞ »¿ ∞» ¼ ∞ »½¾¼ ∞» ¼ D7 ∞ »¿¼ ∞ »¾¼ ∞» ¼ ∞» ¼ ∞ »¾¼ D10 ∞ »½ ¼»¼ ∞ »¾¼ P5 ∞» ¼»¼ ½ »¼ P3 ¾ »¼ ∞» ¼ Ë ¼»¼ P4 ∞ »¿¼ D11 ¿¼»¼ ∞ »¾¼ ¾¼»¼ ¼»¼ P1 ∞ »¾¼ Ì ∞» ¼ ¾ »¼ P2 ∞» D9 ∞» ½¼»¼ ∞ »½ ∞ »½¼ ¿¼»¼ ∞» ∞» D8 ∞ »¿¼ ∞» ¼ ∞» ∞ »½¼¼ D6 ∞ »¾ ∞» ∞ »½ ÙÖ º ½ Ê ÕÙ ÑÓ Ð Þ Ð ÔÖÓ Ð Ñ Ð ØÖ Ò×ÔÓÖØ × ÙÒ Ð Ø Ð ÒØ Ö ÓÖ Ë ÙÒ Ð × Ö Ð ÓÒ × ÔÖÓÚ × ÓÒ Ý Ñ Ò ÜÔÖ × × Ò Ð ¬ ÙÖ º ¼¸ Ý Ú Ö × Ñ Ò Ö × ÔÐ ÒØ Ö Ð ØÖ Ò×ÔÓÖØ º ÈÓÖ ÑÔÐÓ¸ ÔÙ Ö ÑÓ× Ñ Ö Ö ÐÓ× ÔÖÓÚ ÓÖ × Ý Ó Ø Ò Ö¸ Ô Ö Ð ×Ó ÙÐ Ý Ö × Ð¸ Ð × Ö Ð ÓÒ × Óר ØÖ Ò×ÔÓÖØ ÕÙ × ÑÙ ×ØÖ Ò Ò Ð ¬ ÙÖ º ¾º × ÑÔÓÖØ ÒØ ר Ö ÕÙ ×ØÓ× Ö Ó× ×Ø Ò ÓÖ ÒØ Ó× ÐÐ Ó Ð ÔÖÓ Ù ØÓÖº Ò ÓØÖ × Ô Ð Ö ×¸ ÐÓ× Ò ¬ Ó× Ñ Ü Ñ Þ Ö ×ØÖ Ù ÓÒ ÔÖÓ Ù ØÓ×
  • 867.
    7.12. Flujos decoste m´ ınimo 841 ¼»½¿¼ ¼»¾½¼ ¼¼»½½¼ Å Ö ¼¼» ¼ ¼» ¼ ¼¼»½ Å Ö Ó ÖÒ ¼¼»¾¼ ¼ ¼¼»½¼¼ Å Ö ¼¼»½¼ ¼» ¼ ¼¼»½¾ ¼¼ Ö × Ð ÈÓÐÐÓ ¼¼» ¼ ¾ ¼ Ö × ¼¼»½¼¼ Å Ö Ó ¼¼»¿¼ ÖÒ ¼¼» ÖÖÓÞ ¼»½¼¼ ¼¼ ÙÐ ¼¼»¿¼ ¼¼ ÈÙ ÖØÓ ÇÖ Þ ¼¼»¿¼ ÈÓÐÐÓ ¼¼» ¼ ÈÙ ÖØÓ ÇÖ Þ ¼¼»½ ¼¼»½¼ Ö × ¼¼» ¼¼»¾ ÖÕÙ × Ñ ØÓ ÖÕÙ × Ñ ØÓ ¼¼» ¼¼» ´ µ ÙÐ ´ µ Ö ×Ð ÙÖ º ¾ Ê Ð ÓÒ × Óר ØÖ Ò×ÔÓÖØ Ô Ö Ð ÙÒÓ× ÔÖÓÚ ÓÖ × Ý Ñ Ò ÒØ × Ð Ñ Ò ÑÓ Óר Ø Ò Ò Ð ÔÖÓ Ù ØÓÖ Ý ÒÓ ÐÓ× Ñ Ò ÒØ ׺ È Ö ÕÙ ÙÒ ÑÓ ÐÓ Ð Ø ÔÓ ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ º ¾ Ð ÙÐ Ð ×ØÖ Ù ÓÒ Ò Ù ×Ø ÓÒ¸ × ÓÒÚ Ò ÒØ Ð ÙÐ Ö ÖÙ ÖÓ ÔÓÖ × Ô Ö Ó Ý ÓØ Ö Ð Ñ Ò Ù º Ä ÖÒ ¸ Ò ÒÙ ×ØÖÓ× ÑÔÐÓ׸ ÖÖÓ Ö Ö Ó× ÓÑÓ ÐÓ× Ð ¬ ÙÖ º ¿º Å Ö Å Ö ¼¼»¾¼ ¾¼¼»¼ ¼»½¿¼ ¾¼¼»¼ ÈÙ ÖØÓ ÇÖ Þ ÈÙ ÖØÓ ÇÖ Þ ¼¼»½¼¼ ¼¼»¼ ¼» ¼ ¼¼»¼ ¼¼ ¼¼»½¼ ¼¼»¼ ¼ ¼»¾½¼ ¼¼»¼ ÙÐ ÖÒ Å Ö Ó Ì Ö × Ð ÖÒ Å Ö Ó Ì ¼¼»½ ¼»¼ ¼»½¼¼ ¼»¼ ¼¼»¿¼ ¼¼»¼ ¼» ¼ ¼¼»¼ ÖÕÙ × Ñ ØÓ ÖÕÙ × Ñ ØÓ Ö × Ö × ´µ ´ µ ÙÖ º ¿ Ö Ó× ÔÖÓÚ × ÓÒ ÖÒ Ô Ö ÙÐ Ý Ö × Ðº Ô × × Ð Ù Ð ×ÙÑ ÖÓ Ö ÔÖ × ÒØ Ò Ð × Ñ Ò × Ð Ù Ë Ñ Ö ÑÓ× Ð Ö Ó Ñ × × Ò ÐÐÓ¸ Ð ÙÐ ¸ ÒÓ× Ô Ö Ø ÑÓ× ÕÙ ×Ø ÔÖÓ Ù ØÓÖ¸ ÔÓÖ × ×ÓÐÓ¸ ÒÓ ×Ø Ô Ö Ù Ö Ö Ð Ñ Ò º Ò Ð Ú Ö Ð¸ × Ô Ð ×ÓÐ Ø ÖÐ Ð ÔÖÓÚ ÓÖ ÙÒ ÙÑ ÒØÓ ÔÖÓ Ù ÓÒ¸ Ù× Ö ÓØÖÓ× ÔÖÓ Ù ØÓÖ × Ó Ñ Ó× ×ÕÙ Ñ ×º Ò Ø ÖÑ ÒÓ× ÙÒ Ö ØÖ Ò×ÔÓÖØ ¸ ×ØÓ ÕÙ Ú Ð Ò Ö ØÓ Ó× ÐÓ× ÔÖÓ Ù ØÓÖ × ÔÓ× Ð × Ý Ó Ø Ò Ö Ö Ó× ÓÑÓ ÐÓ× Ð ¬ ÙÖ º º Ë ×Ø Ð Ó× ØÓ Ó× ÐÓ× ÔÖÓÚ ÓÖ × ÔÓ× Ð × ÒÓ Ø Ò ÑÓ× Ø Ð × Ö¸ ÕÙ Ð ÒØ ÔÖÓÚ ×Ø ÔÓÖ ÐÓ× ÔÖÓÚ ÓÖ × ÒÓ × Ø × Ð Ñ Ò ¸ Ù Ð × Ð ×Ó Ð ÖÒ ¸ ÒØÓÒ × ÔÓ ÑÓ× ÓÒ× Ö Ö ÔÖ ÓÖ Þ Ö ×ÙÑ ÖÓ× Ó × Ù ×º È Ö ÐÐÓ ÔÓ ¹ ÑÓ× ¬Ò Ö¸ ÔÓÖ ÑÔÐÓ¸ ÙÒ Ö Ó ÔÖ ÓÖ × ÒØÖ Ð × Ù × Ø Ð ÓÑÓ Ð Ð ¬ ÙÖ º ÔÓÖ × ÑÔÐ ¸Ð× ÑÒ × Ù ×ÓÒ ÒÓØ × Ò Ð ÒÓ Óº Ò ×Ø ×Ó¸ Ð ÙÐ ÑÓ× Ð Ñ Ò ØÓØ Ð¸ Ù Ð × Ð ×ÙÑ ÑÒ × Ù º
  • 868.
    842 Cap´ ıtulo 7. Grafos ¼» ¿ ¼» ¼ ¼»½¿¼ ¾ ¼»¾¼ ¼¼»¾¼ Å Ö ¼¼» Å Ö ¿ ¼»½ ¼ ¾ ¼» ¼ ¿ ¼»¾¼¼ ¾ ¼»½¼ ¼»½ ¼ ¿ ¼»½¾¼ ¾¼¼»¼ ¼»¼ ¼» ¼ ÈÙ ÖØÓ ÇÖ Þ ¾ ¼»½¼¼ ÈÙ ÖØÓ ÇÖ Þ ¼¼»½¼¼ ¼¼»½ Ö ÒØ Ò Ö × Ð ¼¼»¼ ¾¼¼»¼ ¿ ¼ ¼» ¼ ¾ ¼ ¿ ¼»¿¼ ÓÐÓÑ Ù ÓÖ ¼ ¿ ¼ ¼»¾½¼ ¼¼»¼ ¾ ¼»½¼ ¾¼¼»¼ ¼ ÖÒ Å Ö Ó Ì ¾ ¼ ÖÖÓÞ Å Ö Ó Ì ¼¼»½¼ ¼¼» Ö × Ð ¼¼ ¼»¼ ÓÐÓÑ ¼¼ ½ ¼»¼ ¿ ¼»½¾ ¾ ¼»½¼¼ ÙÐ ¼» ¼¼»¼ ÈÓÖØÙ Ù × ¿ ¼»¿ ¼¼»¼ ¼»½¼¼ ¾ ¼»½ ÖÕÙ × Ñ ØÓ ÖÕÙ × Ñ ØÓ ¼¼»½ ¼¼»¿ ¿ ¼»½¿ ¾ ¼» ¼» ¼ ¿ ¼» ¼ ¼» ¼ ¾ ¼»¿¼ Ö × Ö × ¼¼»¿¼ ¼¼» ¿ ¼»½¾¼ ¾ ¼»¿¼ ´µ ÖÒ Ö× ´ µ ÖÖÓÞ ÙÖ º Óר × ØÖ Ò×ÔÓÖØ Ô Ö Ð ÙÒÓ× ÔÖÓ Ù ØÓ× × ÙÒ Ð × Ö Ð ÓÒ × Ð Ö º Å Ö Ó ¼¼ Å Ö ¾¼¼ ÖÕÙ × Ñ ØÓ Ö × ÈÙ ÖØÓ ÇÖ Þ ¼ ¼¼ ¼¼ ÙÖ º Ö Ó ÔÖ ÓÖ × ×ØÖ Ù ÓÒ ÒØÖ Ð Ù ×ÔÖ Ð ÑÒ ÖÒ Ò ÐÓ Ñ ÒØ ¸ ÑÓ× Ð ÙÐ Ö Ð ÔÖÓÚ × ÓÒ ØÓØ Ð¸ Ù Ð × Ð ×ÙÑ ÔÖÓÚ × ÓÒ ×º Ò Ð ÑÔÐÓ¸ Ø Ò ÑÓ× ÓÑÓ Ñ Ò ØÓØ Ð 2900 Ý ÔÖÓÚ × ÓÒ ØÓØ Ð 1950º ÓÖ ÓÑ ÒÞ ÑÓ× ×ÙÔÖ Ñ Ö ÐÓ× ÒÓ Ó× Ù × Ý Ö ×Ø Ö Ð Ñ Ò ØÓØ Ð × Ð ÙÐØ ÑÓ Ö Ò Ó ØÓÔÓÐÓ Ó ×Ø Ð ÔÖ Ñ ÖÓ ×Ø ÕÙ Ù×ØÓ Ð Ñ Ò × Ñ ÒÓÖ ÕÙ Ð ÔÖÓÚ × ÓÒº Ò Ð ×Ó Ð ÖÒ ´¬ ÙÖ º µ¸ ÓÑ ÒÞ ÑÓ× ÔÓÖ ÈÙ ÖØÓ ÇÖ Þ ¹ÙÐØ ÑÓ Ö Ò Ó ØÓÔÓÐÓ Ó¹¸ ÐÓ ÕÙ ÒÓ× ÙÒ Ñ Ò 2300º ÄÙ Ó Ö ×Ø ÑÓ× Ö × ¹Ô ÒÙÐØ ÑÓ Ö Ò Ó ØÓÔÓÐÓ Ó¹¸ ÐÓ ÕÙ ÒÓ× ÙÒ Ñ Ò 1400¸ Ð Ù Ð × Ñ ÒÓÖ ÕÙ Ð ÔÖÓÚ × ÓÒ 1950º Ë ÙÒ ×ØÓ¸ ÒÓ× ÕÙ Ð ×Ù ¹Ö Ð ¬ ÙÖ º ¹ ¸ Ð Ù Ð ÒÓ× Ô ÖÑ Ø Ð ÙÐ Ö Ð × Ò ÓÒ Óר Ñ Ò ÑÓº Ò ×Ø ×Ù ¹Ö × × Ò Ð Ö ×ØÖ Ò Ö Ð Ô ÙÒ Ù Ð ×ÙÑ ÖÓ Ð Ú ÐÓÖ Ð Ñ Ò ¸ Ô٠׸ ÐÓ ÓÒØÖ Ö Ó¸ Ð Ð ÓÖ ØÑÓ ÔÙ ÐÐ Ú Ö Ñ × ­Ù Ó Ð Ñ Ò Óº Ë Ù Ñ ÒØ ¸ Ø Ò ÑÓ× Ó× ÐØ ÖÒ Ø Ú × Ò Ö Ð × Ô Ö ×ØÖ Ù Ö Ð ÔÖÓÚ × ÓÒ Ö ×Ø ÒØ º Ä ÔÖ Ñ Ö × ÓÒרÖÙ Ö ÙÒ ×Ù ¹Ö ÓÒ ÐÓ× ÒÓ Ó× Ð ÔÖ Ñ Ö Ö Ò Ó ØÓÔÓÐÓ Ó × ÙÒ Ð ÔÖ ÓÖ Ð × ÙÒ × ÓÐÓ Ö ØÓ Ó× ÐÓ× ÒÓ Ó× Ö ×Ø ÒØ ׸ Ñ Ò Ö ÖÑ×
  • 869.
    7.12. Flujos decoste m´ ınimo 843 Ñ Ò Ñ Ð º ר ÙÐØ ÑÓ Ö Ø Ö Ó ÒÓ× ÖÖÓ ÙÒ ×Ù ¹Ö רÖÙ ØÙÖ ÐÑ ÒØ × Ñ Ð Ö Ð Ð ¬ ÙÖ º ¹ º Ò Ù Ð ×ÕÙ Ö Ð × Ó× ÐØ ÖÒ Ø Ú × × ×ØÖ ÙÝ ØÓ Ð ÔÖÓÚ × ÓÒ Ö ×Ø ÒØ Ð Ñ Ò ÑÓ Óר º ¼» ¼»½¿¼ ¼¼»¾¼ Å Ö ¿ ¼»½ ¼ Ö ÒØ Ò 200/0 ¿ ¼ ¼»¾½¼ ÓÐÓÑ ¼ ¼¼»½¼ 600/0 ¼ ÖÒ Å Ö Ó Ì ¿ ¼»½¾ Ö × Ð ¼¼ 500/0 ¼» ¼ Ö ÒØ Ò ¼»½¼¼ ÙÐ ÓÐÓÑ ÈÙ ÖØÓ ÇÖ Þ ¼¼»½ ÖÒ ÖÕÙ × Ñ ØÓ Ö × Ð Ö × ¿ ¼»½¿ ¼» ÙÐ ´ µ ËÙ ¹Ö ÓÒ ÑÒ × ÙÖ ´ µ ËÙ ¹Ö ÓÒ Ñ Ò Ò×Ù¬ ÒØ ÙÖ º ËÙ ¹Ö × Ð ÙÐÓ × ÙÒ ÔÖ ÓÖ × 7.12.4.2 Trasbordo Ò Ð ÔÖÓ Ð Ñ Ð ØÖ × ÓÖ Ó × Ø Ò Ò m ÔÖÓÚ ÓÖ ×¸ n Ñ Ò ÒØ × Ý k ÔÓ× ØÓ× Ó ÔÙÒØÓ× ØÖ × ÓÖ Óº Ë Ñ Ð Ö Ð ÔÖÓ Ð Ñ Ð ØÖ Ò×ÔÓÖØ ¸ ÔÖÓÚ ÓÖ Ø Ò ÙÒ ¹ Ô ÔÖÓÚ × ÓÒ × ÓÑÓ Ñ Ò ÒØ ÙÒ ÑÒ º Ä Ö Ò ÓÒ Ð ÔÖÓ Ð Ñ ØÖ Ò×ÔÓÖØ Ö × Ò ÕÙ ÔÙ Ò Ö ÒÓ Ó× ÔÓ× ØÓ× ÒØÖ ÐÓ× ÔÖÓÚ ÓÖ × Ý Ñ Ò ÒØ × ÕÙ Ö ÔÖ × ÒØ Ò ÔÙÒØÓ× ØÖ × ÓÖ Ó º Ô ÖØ ÐÓ× Óר × ÒÚ Ó × ÐÓ× ÔÖÓÚ ÓÖ × ÐÓ× ÔÓ× ØÓ× Ý × ÐÓ× ÔÓ× ØÓ× ÐÓ× Ñ Ò ÒØ ¸ Ø Ñ Ò × Ó Ö ÔÓÖ ÐÑ Ò Ñ ÒØÓº ÜØ Ò Ò Ó Ð ÑÔÐÓ Ð ×Ù ¹× ÓÒ ÔÖ ÒØ ¸ ÓÒ¹ × Ö ÑÓ× Ð × Ù ÒØ Ø Ð Ñ Ò ÒØ × D1 D2 D3 D4 ÌÓØ Ð Ñ Ò ¼ ¼ ¼ ¾ ¼ ÈÖÓÚ ÓÖ × ÈÖÓÚ × ÓÒ W1 W2 P1 ¼ ¿¼ ¼ ß Óר × ¿¼ ½ P2 ¼ ½ ¾¼ ½¼ ÒÚ Ó × ß P3 ½¼¼ ½¾¼ ß ÔÖÓÚ ÓÖ ß ¾¼ ÌÓØ Ð ½ ÔÓ× ØÓ× Óר ÔÓ× ØÓ Óר × ÒÚ Ó W1 ¿¼ ¿ ß ¿ Ð W2 ¼ ß ¼ ¾¼ ½¼ Ñ Ò ÒØ Ð ÔÖÓ Ð Ñ × ÙÒ ÜØ Ò× ÓÒ Ð ØÖ Ò×ÔÓÖØ ¸ ÓÒ ÐÓ× ÔÓ× ØÓ× ÓÑÓ ÒÓ Ó× ÒØ Ö¹ Ñ Ó׺ ÆÓØ ÑÓ× ÕÙ Ð ÙÒ × ÒØÖ × Ò Ð Ø Ð ÒÓ Ø Ò Ò Ú ÐÓÖ × ÐÓ ÕÙ × Ò ¬ ÕÙ ÒÓ Ü ×Ø ÓÒ Ü ÓÒ Ö Ø ÒØÖ Ð ÔÖÓÚ ÓÖ Ó ÔÓ× ØÓ Ý Ð Ñ Ò ÒØ º ×ØÓ ÔÙ Ö ÔÖ × ÒØ Ö Ú Ö× × × ØÙ ÓÒ ×¸ × ÑÔÓ× Ð × Ó Ö ¬ × ×Ø Ñ Ö Ó׺ Ä ×ÓÐÙ ÓÒ ÓÒ× ×Ø Ò × ÑÔÐ Ñ ÒØ Ú Ö ÐÓ× ÒÓ Ó× ÔÓ× ØÓ× Ò Ó׺ ÍÒ ÔÓ× ØÓ w × Ú Ò Ó× ÒÓ Ó× w → w º À w Ò Ò Ö Ó× × ÐÓ× ÔÖÓÚ ÓÖ × ÕÙ
  • 870.
    844 Cap´ ıtulo 7. Grafos ÑÓ Ð Þ Ò Ð × Ô × ÒÚ Ó Ý ×Ù× Óר ׺ × w Ñ Ò ÙÒ ×ÓÐÓ Ö Ó ÓÖÖ ×ÔÓÒ¹ ÒØ Ð Óר ÔÓ× ØÓ ÔÓÖ ÙÒ º × w Ñ Ò Ò Ö Ó× ÐÓ× Ñ Ò ÒØ × × ÙÒ Ð Ô ØÖ ×ÔÓÖØ Ý Óר ÒÚ Óº Ä ¬ ÙÖ º ÐÙ×ØÖ Ð Ö ÔÖ × ÒØ ÓÒ Ò Ö Ô Ø ÓÒ Óר × Ð Ø Ð ÒØ Ö ÓÖº Ð Óר ÔÓÖ ÔÓ× ØÓ ÔÙ ÓÑ Ø Ö× × ÒÓ ÔÐ ¸ Ò ÙÝÓ ×Ó ÒÓ × Ò × Ö Ó Ú Ö Ò Ó× ÐÓ× ÒÓ Ó× ÔÓ× ØÓ׺ ∞ »½¼ ∞ »½ ¼»¿ D4 ¼»¿ ¼»¿¼ ¼» W1 W1 P2 ¿ »½¼ ∞ »¾¼ »¼ ¼» ¼»¿¼ ∞» ¼»¼ ∞» D1 ¼»¼ ∞ »½¼¼ ¼»¼ Ì D2 Ë ¼»¼ P1 ∞ »¿¼ ¼»¼ ¿ » ¼ »¼ ¿ »½ ¿ » ¼ W2 W ¿ »¾¼ 2 ¿ »¾¼ ∞» ¼ D3 P3 ∞ »½¾¼ ∞» ÙÖ º Ê ÕÙ ÑÓ Ð Þ Ð ØÖ × ÓÖ Ó × ÙÒ Ð Ø Ð ÒØ Ö ÓÖ ÓÑÓ × Ú ¸ Ð ÔÖÓ Ð Ñ ØÖ × ÓÖ Ó × ÙÒ ÔÖÓ Ð Ñ ØÖ Ò×ÔÓÖØ ¸ ÓÒ Ð Ò Ó ÕÙ Ü ×Ø Ò ÒÓ Ó× ÒØ ÖÑ Ó× ´ÐÓ× ØÖ × ÓÖ Ó×µº Ò × ×Ù Ú ÐÓÖ × ×ØÖ ÓÒ¸ Ò Ð × ÒØ Ó ÕÙ ÔÙ × ÖÒÓ× Ñ × Ð ÒØ ÖÔÖ Ø Ö ÙÒ × ØÙ ÓÒ Ò Ø ÖÑ ÒÓ× Ð ØÖ × ÓÖ Ó ÕÙ Ò Ð Ð ØÖ Ò×ÔÓÖØ Ó Ö × Ô Ø ×º ÅÙ × × ØÙ ÓÒ × ÑÙÒ Ò × ×ÓÒ ÑÓ Ð Þ Ð × Ò Ø ÖÑ ÒÓ× ØÖ × ÓÖ Óº Ä × ÖÙØ × Ö ×¸ Ñ Ö Ø Ñ ×¸ ÑÔÓÖØ ÓÒ ×¸ ÓÑ Ö Ó׸ Ø º¸ ÓÒר ØÙÝ Ò ÑÔÐÓ× Ô Ö Ñ Ø Ó׺ ÈÙÒØÓ Ó ÓÐÓÑ Ë Ò ÒØÓÒ Ó Å Ö Ó ÈÙ ÖØÓ ÐÐÓ Å Ö Ù ÓÖ È Ò Ñ ÖÕÙ × Ñ ØÓ Ö ÒØ Ò Ä Ù Ö Å ÕÙ Ø Ö × ×Ø Ó× ÍÒ Ó× Ë ÒØ Ð Ò ÈÙ ÖØÓ ÇÖ Þ Ö × Ð ÈÙ ÖØÓ Ä ÖÙÞ ÙÖ º ÍÒ Ö ÔÓØ Ø ÔÖÓÚ ÓÖ ×¸ ÔÙÒØÓ× ØÖ × ÓÖ Ó Ý Ù × ¹ Ñ Ò ÒØ ׺ ÄÓ× ØÖ × ÓÖ Ó× Ø ÖÖ ×ØÖ × ×ÓÒ Ö ÓÒÓ Ó× ÓÒ ÙÒ ÖÓÑ Ó¸ ÐÓ× Ö Ó× ÓÒ ÙÒ Ö Ø Ò ÙÐÓ Ý ÐÓ× Ñ Ö Ø ÑÓ× ÓÒ ÙÒ Ü ÓÒÓº
  • 871.
    7.12. Flujos decoste m´ ınimo 845 ÓÑÓ ÙÐØ ÑÓ ÑÔÐÓ¸ ÓÒ× Ö ÑÓ× ÙÒ ÓÒ ÙÒØÓ Ô × × ÜÔÓÖØ ÓÖ × Ð ¸ ÙÒ ÓÒ ÙÒØÓ ÔÙ ÖØÓ× Ó ÔÙÒØÓ× ØÖ × ÓÖ Ó Ý ÙÒ ÓÒ ÙÒØÓ Ù × Ö ÔØÓÖ ×º Ë ÙÒ Ð Ñ Ó ØÖ Ò×ÔÓÖØ ¸ ÐÓ× ÔÙ ÖØÓ× ÔÙ Ò Ð × ¬ Ö× Ò Ø ÖÖ ×ØÖ ×¸ Ñ Ö Ø ÑÓ× Ý Ö Ó× × Ò¸ Ô ÖØ ÐÓ× Óר ׸ ×ØÓ ÒÓ ÓÒØ Ö Ö Ò Ó× Ò Ð ÑÓ ÐÓ¸ ÔÙ × Ö ÙØ Ð ×Ù ×Ø Ò ÓÒ ÔÓÖ ÑÔÐÓ¸ ÔÙ Ö ÑÓ× Ö ÕÙ Ö Ö ÐÓ× Ð ÙÐÓ× ×ÓÐÓ Ô Ö ÖÙØ × Ø ÖÖ ×ØÖ ×º Ä 7.12.4.3 Asignaci´n de trabajos o ÑÒÖ ÒÖ ¸ Ò Ð ÔÖÓ Ð Ñ × Ò ÓÒ × Ø Ò Ò n ØÖ Ó× Ó ÔÖÓÝ ØÓ× Ý m ØÖ ÓÖ ×º ØÖ ÓÖ ÔÙ Ö Ð Þ Ö Ð ÙÒÓ× ´Ó ØÓ Ó×µ ØÖ Ó× ÙÒ Óר ¬ Ó ÔÓÖ Ðº Ä Ñ Ø ×¸ Ô٠׸ Ñ Ü Ñ Þ Ö Ð ÒØ ØÖ Ó× Ð Ñ Ò ÑÓ Óר º ÍÒ Ö ÔÖ × ÒØ ÓÒ Ð × ÔÙ ×ÕÙ Ñ Ø Þ Ö× × ÌÖ Ó t1 t2 t3 t4 t5 t6 ÌÖ ÓÖ T1 ¾¼ ¿¼ ½¼ ¾¼ T2 ½¼ ¾ ¾ ½ T3 ½ ½ ¿¼ ¼ T4 ¿¼ ½¼ ¾¼ ¿ Ð ÔÖÓ Ð Ñ × ÑÓ Ð Þ Ý Ö ×Ù ÐÚ Ñ ÒØ ÙÒ Ö Ô Ø ÓÒ Óר × Ò Ð Ù Ð Ð× Ô × ÒØÖ ÐÓ× ØÖ ÓÖ × Ý ØÖ Ó× ×ÓÒ ÙÒ Ø Ö × Ý ÐÓ× Óר × ÐÓ× ÓÖÖ ×ÔÓÒ¹ ÒØ × Ð Ö Ó׺ Ð ÒÓ Ó Ù ÒØ × ÓÒ Ø ÓÒ ÐÓ× ØÖ ÓÖ × Ô × Ñ ÝÓÖ × Ó Ù Ð × ÕÙ Ð ÒØ ØÖ Ó× Ý Óר × ÒÙÐÓ׺ ÄÓ× ØÖ Ó× × ÓÒ Ø Ò ÙÒ ×Ù¹ Ñ ÖÓ ÓÒ Ô × Ñ ÝÓÖ × Ó Ù Ð × ÕÙ Ð ÒØ ØÖ ÓÖ × Ý Óר × ÒÙÐÓ׺ ÍÒ ÑÔÐÓ Ô Ö Ð Ø Ð ÒØ Ö ÓÖ × ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ º º ½»¾¼ ½»¾¼ t6 ½»½ t1 ½»½¼ ∞ »¼ ½»½ t1 ∞ »¼ ½»¿¼ ∞ »¼ ½»¾ t4 ∞ »¼ ½»¾¼ ∞ »¼ Ì ½»¾ t2 t3 ∞ »¼ ∞ »¼ Ë ∞ »¼ ½»½¼ ∞ »¼ ½»¿¼ ∞ »¼ t3 ½»½¼ t2 t4 ½»½ ½» ¼ t5 ½»¿¼ ½»¿ ÙÖ º Ê Ô Ø Ð ÔÖÓ Ð Ñ × Ò ÓÒ × ÙÒ Ð Ø Ð ÒØ Ö ÓÖ Ä Ñ Ü Ñ Þ ÓÒ Ð ­Ù Ó ÖÖÓ Ð × Ò ÓÒ ÕÙ Ù Ö Ñ × ØÖ Ó׺ ÓÒ× Ù ÒØ ¹ Ñ ÒØ ¸ Ð Ñ Ò Ñ Þ ÓÒ Ð Óר ÔÖÓÔÓÖ ÓÒ Ð Ñ Ü Ñ × Ò ÓÒ Ñ Ò ÑÓ Óר º
  • 872.
    846 Cap´ ıtulo 7. Grafos 7.12.4.4 Camino m´ ınimo È Ö Ð ÙÐ Ö Ð Ñ ÒÓ Ñ Ò ÑÓ ÒØÖ ÙÒ Ô Ö ÒÓ Ó× u Ý v ÙÒ Ö Ó¸ Ð ÓÒ Ø ÑÓ× u ÙÒ Ù ÒØ s ÓÒ Ô Ñ ÝÓÖ Ó Ù Ð Ð Ñ Ü ÑÓ Óר ÒØÖ ÙÒ Ñ ÒÓ Ù ÐÕÙ Ö Ò Ð Ö Óº Ò ÐÓ Ñ ÒØ ¸ ÓÒ Ø ÑÓ× v ÙÒ ×ÙÑ ÖÓ tº Ð Ö ×ØÓ Ð Ö Ð ÓÒ ÓÖÑ Ò ÐÓ× Ö Ó× Ð Ö Ó ÓÒ Ô ÙÒ Ø Ö Ý Óר Ù Ð Ð Ô ×Ó Ð Ö Óº ÄÙ Ó¸ Ð Ñ Ü Ñ Þ Ö Ð ­Ù Ó Ð Ö ÒØ Ö ÓÖ Óר Ñ Ò ÑÓ¸ ÐÓ× Ö Ó× ÓÒ ­Ù Ó Ù Ð ×Ù Ô ¸ ÕÙ ×ÓÒ ÙÒ Ø Ö Ó׸ ÓÒ ÓÖÑ Ò Ð Ñ ÒÓ Ñ Ò ÑÓ ÒØÖ u Ý vº Ò Ð ×Ó ÙÒ Ö Ó G Ð Ð ÓÖ ØÑÓ × × Ñ Ð Ö¸ Ô ÖÓ ÔÖ Ú Ñ ÒØ Ð ÙÐ ÑÓ× Ð ÕÙ Ú Ð ÒØ Ö Ó →º − G 7.12.4.5 Planificaci´n o Ä ÔÐ Ò ¬ ÓÒ × ÙÒÓ ÐÓ× ÔÖÓ Ð Ñ × Ñ × ×Ó Ó× ÐÓ× Ö Ó׺ À Ý ÑÙ × Ð × × Ý Ú Ö×Ó× ÑÓ ÐÓ× Ý ×ÓÐÙ ÓÒ ×¸ Ý Ò Ó × ÓÑÔÐ × Ð Ò Ð × ×Ø ÒØÖ Ø Ð × Ð ÓÖ Ò Ñ ÒØÓ ØÓÔÓÐÓ Ó ×ØÙ Ó Ò Ü º º ´Ô Ò ¼µ × ÙÒ ÑÔÐÓº Ò ×Ø ×Ù ¹× ÓÒ ÔÐ ÒØ Ö ÑÓ× ÙÒ Ú Ö ÒØ ÔÐ Ò ¬ ÓÒ ÙÒ ÓÒ ÙÒØÓ ¹ ÓÒ × Ö ÕÙ Ö × Ô Ö Ð Ö Ð Þ ÓÒ ÖØ Ó Ö º Ä Ó Ö Ö ÕÙ Ö × Ø × Ö m Ò × ¹ × ÕÙ Ñ Ò Ò Ð ÑÔÐ Ó n Ô × ÖØ × ÓÒ × Ý Óר ׺ Ð ÔÖÓ Ð Ñ ÔÙ ÑÓ Ð Þ Ö× Ñ ÒØ ÙÒ Ö Ó Ô ÖØ ØÓ ´Ó ÙÒ Ñ ØÖ Þµ ÕÙ ÜÔÖ × Ð × Ö Ð ÓÒ × ÒØÖ Ô ×ÝÒ × ×¸ ÓÒ ×Ù× ÔÓÖ ÒØ × Ó ÙÔ ÓÒ Ý ×Ù× Óר × ÔÓÖ ÙÒ Ð Ô×Ó ¬ Ó Ø ÑÔÓ Ý Ð Ù Ð ÙÒ ÑÔÐÓ × ÑÓ×ØÖ Ó Ò Ð ¬ ÙÖ º½¼¼¹ º È Ö ÕÙ Ð ÑÓ ÐÓ Ý ×Ù ×ÓÐÙ ÓÒ Ø Ò Ò × ÒØ Ó¸ Ö Ð ÓÒ Ô Ò × Ö ÔÖ × ÒØ Ö ÙÒ ÙÖ ÓÒ Ù Ðº Ë Ð × Ö Ð ÓÒ × ÜÔÖ × × Ò Ð ¬ ÙÖ º½¼¼¹ Ö ÔÖ × ÒØ Ò ÙÒ Ñ × ÑÔÐ Ó¸ ÒØÓÒ ×¸ × Ù Ò Ó Ð ÑÔÐÓ¸ ÔÓ ÑÓ× Ö ÕÙ Ð Ö Ð ÓÒ C1 −→ N1 Ö ÔÖ × ÒØ Ð Ù×Ó Ð ½¼¼± Ð Ô C1 ÙÒ Óר ¿ ÙÖ ÒØ ÙÒ Ñ ×º ר ÑÓ Ó¸ ØÓ × Ð × Ö Ð ÓÒ × Ö ÔÖ × ÒØ Ò ÙÒ Ñ × ÔÐ ÓÒ Ð Ô º Ä Ñ Ø ×¸ ÒØÓÒ ×¸ Ò ÓÒØÖ Ö¸ ÔÓÖ Ô ¸ ÓÑÓ ×Ø ÔÐ Ò ¬ Ö× Ñ Ò Ö Ø Ð ÕÙ × Ù Ö Ò ØÓ × Ð × Ò × × Ð Ñ ÒÓÖ Óר ÔÓ× Ð º C1 Ä Ô×Ó ¼ Ä Ô×Ó ½ Óר C1 Ä Ô×Ó ¼ Ä Ô×Ó ½ Óר N1 ¾¼± ¿ N1 ¼± ¿ N1 ¾¼± ¿ N1 ¼± ¿ N2 ¼± ¾¾ ¾¾ N2 ¼± ¾¾ ¾¾ ÌÓØ Ð ± ½¼¼ ¼ ¼ ÌÓØ Ð ± ½¼¼ ¼ ¼ C10 Ä Ô×Ó ¼ Ä Ô×Ó ½ Óר N1 ¿¼± ¾ N6 ¾¼± N2 ¾¼± ¾ ¾ N3 ¿¼± N6 ¾¼± ÌÓØ Ð ± ½¼¼ ¾¼ ¼ Ì Ð º½ Ð ÙÒ × ÔÐ Ò ¬ ÓÒ × Ð ÔÖÓ Ð Ñ × ÑÓ Ð Þ ÓÑÓ Ò Ð ¬ ÙÖ º½¼¼¹ º È Ö ÕÙ Ð ­Ù Ó Ô Ò × × ÒÓ Ü Ð ½¼¼±¸ Ð Ù ÒØ × ÓÒ Ø Ô ÓÒ ÙÒ Ô Ò ­Ù Ó Ð ½¼¼±º Ò ÐÓ Ñ ÒØ ¸ Ò × × ÓÒ Ø Ð ×ÙÑ ÖÓ ÓÒ Ô
  • 873.
    7.12. Flujos decoste m´ ınimo 847 ½¼¼» ¾º¼ ½¼¼» ¾º¼ C5 »½¾º¼ C5 »½¾º¼ ½¼¼»¿ º¼ ½¼¼»¿ º¼ C1 ¼»¾¾º¼ ¼»¾¼º¼ C1 ¼»¾¾º¼ ¼»¾¼º¼ N1 ½¼¼»¼º¼ ¼»¿¼º¼ ¼»¿¼º¼ C2 ½ »½¼º¼ ¼»½ º¼ N1 ¼» º¼ ¿¼»¾º¼ ¼»½ º¼ »½¾º¼ N2 ½¼¼»¼º¼ ¼» ¾º¼ C2 ½ »½¼º¼ ½½¼¼»¼º¼ C0 ¼» º¼ N2 ¼» ¾º¼ ¼»½¾º¼ ¾¼»¾º¼ ½¼¼»¼º¼ ¿¼»¾º¼ ¼» º¼ ¾¼»¾º¼ C0 ¼» º¼ ½½¼¼»¼º¼ C10 ¼» º¼ N6 ½¼¼»¼º¼ C10 ¼» º¼ ¿¼» º¼ ¿¼»½ º¼ N6 ½¼¼»¼º¼ »½¾º¼ ¼»¿¼º¼ ½½¼¼»¼º¼ ¿¼»½ º¼ Ë ½¼¼»¼º¼ C9 ¼» º¼ ½¼¼»¼º¼ C9 ¼» º¼ ¿¼» º¼ N0 ½½¼¼»¼º¼ Ì ½¼¼»¼º¼ ¼»¿º¼ C4 ½¼»¿¼º¼ ½½¼¼»¼º¼ ¼»½¾º¼ ¿¼» º¼ N0 ½¼¼»¼º¼ ¼»¿¼º¼ ¼»¿º¼ N3 ½½¼¼»¼º¼ ½¼»¿¼º¼ ¼» ¼º¼ C4 N3 ¼» ¼º¼ ¼» ¼º¼ C3 ½¼¼»¼º¼ ½½¼¼»¼º¼ ¿¼» ¼º¼ ¼»½ º¼ ¿¼» º¼ ¼» ¼º¼ C3 ¼»½ º¼ ½¼¼»¼º¼ ¼»¾¼º¼ N4 C8 N4 ¼»¾ º¼ ½¼¼» ¼º¼ C7 ½¼¼» ¼º¼ ½¼¼» ¼º¼ C7 ¿¼» ¼º¼ ¿¼» º¼ N5 C6 ¾¼» º¼ ¼»½¾º¼ N5 ¼»¾¼º¼ ½¼¼» ¼º¼ ¿¼» º¼ C8 ¼»¾ º¼ C6 ¼»½¾º¼ ¾¼» º¼ ´µ Ö Ó Ô ÖØ ØÓ ´ µ Ê Ô Ø ÓÒ Óר × ÕÙ Ú Ð ÒØ Ô × Ö¹ ÕÙ Ö × Ô Ö Ö ×ÓÐÚ Ö Ò × × ÙÖ º½¼¼ ÈÐ ÒØ Ñ ÒØÓ Ö Ô Ö ÔÐ Ò ¬ Ö Ô × Ò × × ×Ù¬ ÒØ Ô Ö ×ÓÔÓÖØ Ö ØÓ × Ð × Ô × Ð Ñ Ü ÑÓ ÕÙ ÐÐ Ù Ò Ð Ò × Ò Ð ×Ó Ð ÑÔÐÓ × ×ÙÑ 100nº Ä Ñ Ü Ñ Þ ÓÒ Ð ­Ù Ó ÖÖÓ Ð ×ÕÙ Ñ ÕÙ Ñ × Ô × ÔÖÓÚ Ò Ð ÒØ ÖÚ ÐÓ Ø ÑÔÓ Óº Ä Ñ Ò Ñ Þ ÓÒ Ð Óר ¸ Ð Ö ÔÖ Ñ ÖÓ Ð × Ô × ÕÙ Ø Ò Ò Ñ ÒÓ× Óר ׸ ÑÓ Ó ÕÙ ×Ø × ÕÙ Ò ×ÔÓÒ Ð × Ô Ö Ò × × ÓØÖ × Ó Ö ×º Ë Ð Ó Ö ÓÑÓ Ø Ð Ö ÕÙ Ö ØÓ × Ð × Ô ×¸ ÒØÓÒ × ÒÓ × Ò × Ö Ó Ð ÙÐ Ö Ð Óר Ñ Ò ÑÓ¸ ÔÙ × ØÓ Ó× ÑÓ Ó× Ð ÑÔÐ Ó Ô ××ÖÒÔ ×º ÐÓ ÓÒ¹ ØÖ Ö Ó¸ × Ð Ö Ó ÑÓ Ð Þ ÙÒ ÓÒ ÙÒØÓ Ô × ÔÓ× Ð ×¸ ÒØÓÒ × Ð Ñ Ò Ñ Þ ÓÒ Ð Óר ÖÖÓ Ð × Ò ÓÒ Ñ ÒÓ× ÓרÓ× º
  • 874.
    848 Cap´ ıtulo 7. Grafos ½¼¼» º¼¼» ¾º¼ C5 » º¼¼»½¾º¼ ½¼¼»¾¼º¼¼»¿ º¼ ½¼¼»½¼¼º¼¼»¼º¼ ¼»¿¼º¼¼»¾¼º¼ C1 ¼» ¼º¼¼»¾¾º¼ ¼» ¼º¼¼»¿¼º¼ ¼» ¼º¼¼»½ º¼ N1 ½¼¼»½¼¼º¼¼»¼º¼ ¿¼»¿¼º¼¼»¾º¼ C5 » º¼¼» ¾º¼ ½½¼¼»¾½ º¼¼»¼º¼ »¼º¼¼»½¾º¼ ½¼¼» º¼¼»¼º¼ ¼» ¼º¼¼»¿ º¼ C2 ½ »¼º¼¼»½¼º¼ ½¼»½¼º¼¼»¾¼º¼ N1 ¼»¼º¼¼» ¾º¼ N2 C1 ½¼¼»½¼¼º¼¼»¼º¼ ¾¼»¾¼º¼¼»¾º¼ ½¼¼» ¼º¼¼»¼º¼ ¼» ¼º¼¼» º¼ ¼»½¼º¼¼» º¼ ½½¼¼»¾¾ º¼¼»¼º¼ ½½¼¼»½ ¼º¼¼»¼º¼ » º¼¼»½¾º¼ C0 ¼»¾¼º¼¼» º¼ ½¼¼»½¼¼º¼¼»¼º¼ C2 ½¼¼» º¼¼»¼º¼ ½ »½ º¼¼»½¼º¼ C10 ¼»¾¼º¼¼» º¼ ½¼¼»½¼¼º¼¼»¼º¼ ¿¼»¼º¼¼»½ º¼ N6 C3 ¼» ¼º¼¼» ¼º¼ ¼»¾¼º¼¼»¿¼º¼ ½½¼¼» ¼º¼¼»¼º¼ N0 ½¼¼» ¼º¼¼»¼º¼ ½¼»½¼º¼¼» º¼ Ë ½¼¼»½¼¼º¼¼»¼º¼ C9 ¼»¿¼º¼¼» º¼ ½¼¼»½¼¼º¼¼»¼º¼ ½½¼¼»½½¼º¼¼»¼º¼ ¿¼»¿¼º¼¼» º¼ C9 ½¼¼» º¼¼»¼º¼ ½¼¼»½¼¼º¼¼»¼º¼ N0 ½½¼¼»½ ¼º¼¼»¼º¼ Ì ¿¼»¿¼º¼¼»½ º¼ C4 ½¼»¼º¼¼»¿¼º¼ ½½¼¼»½ ¼º¼¼»¼º¼ Ë ½¼¼»½¼¼º¼¼»¼º¼ ¼»¼º¼¼»½¾º¼ ¼»¼º¼¼» ¾º¼ N2 ½½¼¼» º¼¼»¼º¼ ½½¼¼»½ ¼º¼¼»¼º¼ C0 ¼» ¼º¼¼»¿º¼ N3 ½¼¼»¾¼º¼¼»¼º¼ ¿¼»¿¼º¼¼» º¼ Ì ½¼¼»½¼¼º¼¼»¼º¼ ½½¼¼» ¼º¼¼»¼º¼ ¼» ¼º¼¼» ¼º¼ ¼» ¼º¼¼»¿¼º¼ N6 ½½¼¼»½ ¼º¼¼»¼º¼ ¼» ¼º¼¼» ¼º¼ ½¼¼» ¼º¼¼»¼º¼ C3 C10 ¼» ¼º¼¼»½ º¼ ¼» ¼º¼¼»½¾º¼ ¿¼»¿¼º¼¼» º¼ ½½¼¼» ¼º¼¼»¼º¼ N4 ½½¼¼»½ ¼º¼¼»¼º¼ ½¼¼»½¼¼º¼¼»¼º¼ ½¼¼»½¼¼º¼¼»¼º¼ ¾¼»¾¼º¼¼» º¼ ¼» ¼º¼¼»¾¼º¼ N4 C4 C8 ¼»¼º¼¼»¾ º¼ ½¼»½¼º¼¼»¿¼º¼ ½¼¼» ¼º¼¼»¼º¼ ½¼¼»½¼¼º¼¼» ¼º¼ C7 ¿¼»¿¼º¼¼» ¼º¼ ¿¼»¼º¼¼» ¼º¼ ½¼¼»½¼¼º¼¼»¼º¼ ¼» ¼º¼¼»½¾º¼ N5 ¼» ¼º¼¼»¾ º¼ C8 N5 ½¼¼»¼º¼¼» ¼º¼ ¾¼»¾¼º¼¼»½¾º¼ ¿¼»¿¼º¼¼» º¼ C6 C7 ½¼¼»½¼¼º¼¼» ¼º¼ ¾¼»¾¼º¼¼» º¼ ´µ ´ µ ¼» ¼º¼¼» ¾º¼ N2 ½½¼¼» ¼º¼¼»¼º¼ Ì ½¼¼» ¼º¼¼»¼º¼ C0 ½½¼¼»¾¼º¼¼»¼º¼ ½¼»½¼º¼¼»½¾º¼ Ë N4 ½¼¼»½¼º¼¼»¼º¼ ½¼»½¼º¼¼»¾ º¼ C8 ´µ ½¼¼» ¼º¼¼»¼º¼ ¼» ¼º¼¼» ¾º¼ ½½¼¼» ¼º¼¼»¼º¼ Ë C0 N2 Ì ´ µ ÙÖ º½¼½ ËÙ × Ú × Ø Ö ÓÒ × × Ò ÓÒ Ô × Ò × × × ÙÒ Ð × Ö Ð ÓÒ × Ð ¬ ÙÖ º½¼¼
  • 875.
    7.12. Flujos decoste m´ ınimo 849 ½¼¼» ¾º¼ C5 ½¼¼» º ½¼¼»¿ º¼ ½¼¼» º¼ C1 ½¼¼»½ º ½¼¼»½ º¼ ½¼¼»¼º¼ N1 ½¼¼»½¾º ½¼¼»¼º ½¼¼» º C2 ½¼¼»¼º¼ ½¼¼»½º ½¼¼»¾½º¼ N2 ½½¼¼»¼º¼ ½¼¼»¼º ½¼¼»¿¿º ½¼¼»¼º¼ C0 ½¼¼» º¼ ½½¼¼»¼º¼ ½¼¼»¼º¼ C10 ½¼¼»¾º¼ ½¼¼» º N6 ½¼¼»¼º¼ ½¼¼»¾½º¼ ½½¼¼»¼º¼ Ë ½¼¼»¼º¼ C9 ½¼¼»¾º¼ ½¼¼»¼º¼ ½¼¼»½º¾ N0 ½½¼¼»¼º¼ Ì ½¼¼»¼º¼ ½¼¼»¿º¼ C4 ½½¼¼»¼º¼ ½¼¼» º ½¼¼»¼º¼ ½¼¼»½º¾ N3 ½½¼¼»¼º¼ ½¼¼» º¼ ½¼¼» º¼ ½¼¼»¼º¼ C3 ½½¼¼»¼º¼ ½¼¼» º¼ ½¼¼»½º ½¼¼»¼º¼ ½¼¼»½¼º¼ N4 C8 ½¼¼»¾½º ½¼¼» ¼º¼ C7 ½¼¼»½ º¼ ½¼¼» º N5 ½¼¼» ¼º¼ ½¼¼»¾º½ C6 ½¼¼»½º¾ ÙÖ º½¼¾ Ê Ð ¬ ÙÖ º½¼¼¹ ÓÒ ×Ù× Ô × ÒÓÖÑ Ð Þ × ÓÑÓ ÐÓ ÑÓ׸ Ð ×ÓÐÙ ÓÒ Ñ Ü Ñ Þ Ð ­Ù Ó Ô Ö Ó Ø Ò Ö ÙÒ × Ò ÓÒ ÔÖ Ú Ô × Ò Ð ×Ó ÑÔÐÓ¸ ÙÒ × Ò ÓÒ Ò Ð × ÑÓ×ØÖ Ò Ð ¬ ÙÖ º½¼½¹ º Ö Ó ÐÐ ÒÓ Ò × Ò ÓÒ ÓÑÔÐ Ø Ô Ò × Ñ ÒØÖ × ÕÙ ÙÒÓ ÓÒ ­Ù Ó¸ Ô ÖÓ ÒÓ ÐÐ ÒÓ¸ × Ò ¬ × Ò ÓÒ Ô Ö Ðº Ò ×Ø ÙÐØ ÑÓ ×Ó¸ Ó × Ð Ó Ö Ö ÕÙ Ö ØÓ × Ð × Ô ×¸ × ÓÒרÖÙÝ ÙÒ ÒÙ Ú Ö Ò Ð Ù Ð ÐÓ× Ö Ó× ÐÐ ÒÓ× ×ÓÒ Ð Ñ Ò Ó× Ý ÐÓ× Ô Ö Ð × ØÙ Ð Þ Ó× ÓÒ Ð Ú ÐÓÖ Ô ×Ù×ØÖ Ð Ú ÐÓÖ Ð ­Ù Ó Ð Ø Ö ÓÒ ÔÖ ÒØ º Ä ×Ö ¬ ÙÖ × º½¼½ ÑÙ ×ØÖ Ð × Ø Ö ÓÒ × ×ÙÑ Ò Ó ­Ù Ó Ñ Ü ÑÓ ÓÒ Óר Ñ Ò ÑÓ Ò Ø Ö ÓÒº Ð ÙÒ × ÔÐ Ò ¬ ÓÒ × Ô × Ö ×ÙÐØ ÒØ × × ÑÙ ×ØÖ Ò Ò Ð × Ø Ð × º½º Ò Ð ÙÒ × × ØÙ ÓÒ × Ð × Ô × ÔÙ Ò ÒÓÖÑ Ð Þ Ö× Ý ÐÐ Ú Ö× Ð ½¼¼±º ר ÔÙ Ö × Ö Ð ×Ó¸ ÔÓÖ ÑÔÐÓ¸ Ò Ð ÙÒ × × ØÙ ÓÒ × Ò Ö ÓÒ Ó ØÖ Ò×Ñ × ÓÒ Ð ØÖ º ÈÓÖ ÑÔÐÓ¸ Ð Ö Ð ÓÒ C5 −→ N1 ÔÙ ÒÓÖÑ Ð Þ Ö× 45×12 Ý × ×Ù × ¹100 Ú Ñ ÒØ ÓÒ Ð Ö ×ØÓ Ð × Ö Ð ÓÒ × ×Ø Ó Ø Ò Ö Ð Ö ÒÓÖÑ Ð Þ Ð ¬ ÙÖ º½¼¾º
  • 876.
    850 Cap´ ıtulo 7. Grafos Ò ×Ø Ð × × ØÙ ÓÒ¸ Ð Óר ÔÙ Ö ÔÖ × ÒØ Ö ÙÒ ÙÖ ÓÒ ÔÐ ÓÒ Ð Ô º ÈÓÖ ÑÔÐÓ¸ × Ð × Ô × Ð Ø Ö ÐÑ ÒØ ÙÒ Ò ÓÑÓ ­Ù Ó× Ý Ð × Ò × ¹ × ÔÙ Ò ×Ô Ö Ö Ø ÑÔÓ× Ö ØÖ Ö Ó׸ ÒØÓÒ × Ð Ø Ò Ø Ö ÓÒ × ×Ù × Ú × ÕÙ Ý ÑÓ× ÔÐ ÒØ Ó ÔÖÓÔÓÖ ÓÒ Ø Ú Ñ ÒØ Ð × Ò ÓÒ Ô × ÕÙ ÓÒ×ÙÑ Ñ ÒÓÖ ÙÖ ÓÒº ÍÒ ÑÔÐÓ ÔÓ Ö × Ö Ð ×ØÖ Ù ÓÒ Ð ÙÒ Ò×ÙÑÓ Ò ×Ó ÓÒØ Ò¹ Ò Ú ÙÒ × Ò ×Ó ÙÒ Ô Ò Ñ Ó Ð Ñ ÒØÓ× Ò ×Ó Ð ÙÒ ×Ø Ó Ü Ô ÓÒ ´ Ù ÖÖ Ó × ×ØÖ Ò ØÙÖ Ðµº 7.13 Programaci´n lineal o × Ñ ÒØ ¸ ÙÒ ÔÖÓ Ð Ñ ÓÔØ Ñ Þ ÓÒ Ô Ö ÔÖÓ Ö Ñ ÓÒ Ð Ò Ð × ÓÑÔÓÒ ÐÓ× × Ù ÒØ × Ð Ñ ÒØÓ× ×Ø Ò Ö ½º Î Ö Ð × × ÓÒ ´Ó × ÑÔÐ Ñ ÒØ Ú Ö Ð ×µ x1, x2, . . . , xn Ö ÔÖ × ÒØ Ò ÔÙÒØÓ× Ùר Р׸ ÙÝÓ× Ú ÐÓÖ × ×ÓÒ × ÓÒÓ Ó× Ð Ò Ó Ð ÔÖÓ Ð Ñ ¸ Ý × Ð Ù Ð × ÓÒØÖÓÐ Ð × ØÙ ÓÒ ÒØ Ö ×º Ä Ñ Ø ÙÒ ÔÖÓ Ð Ñ ÓÔØ Ñ Þ ÓÒ × Ò ÓÒØÖ Ö ÐÓ× Ú ÐÓÖ × Ð Ú Ö Ð ÕÙ Ñ Ü Ñ Þ Ò Ó Ñ Ò Ñ Þ Ò ÙÒ ÙÒ ÓÒ Ó Ø ÚÓ º ¾º ÙÒ ÓÒ Ó Ø ÚÓ × ÙÒ ÜÔÖ × ÓÒ Ñ Ø Ñ Ø ÕÙ ÒÚÓÐÙ Ö Ð × Ú Ö Ð × × ÓÒ Ô Ö ÜÔÖ × Ö ÙÒ ¬Ò Ó Ñ Ø º Ä ÓÖÑ Ò Ö Ð × Ñ Ü Ñ Þ Ö Ó Ñ Ò Ñ Þ Ö Ð ÙÒ ÓÒ Z = c1x1 + c2x2 + · · · + cnxn ¿º Ê ×ØÖ ÓÒ × ×ÓÒ ÜÔÖ × ÓÒ × Ñ Ø Ñ Ø × ÕÙ ÒÚÓÐÙ Ö Ò Ð × Ú Ö Ð × × ÓÒ Ý ÕÙ ÜÔÖ × Ò Ð Ñ Ø × Ð × ×ÓÐÙ ÓÒ × ÔÓ× Ð × Ý ÜÔÖ × × Ò ÓÖÑ a1,1x1 + a1,2x2 + · · · + a1,nxn ≤ b1 a2,1x1 + a2,2x2 + · · · + a2,nxn ≤ b2 ººº am,1x1 + am,2x2 + · · · + am,nxn ≤ bm x1 ≥ 0, x2 ≥ 0, . . . xn ≥ 0 ר ÓÖÑ Ò Ö Ð ÜÔÖ × Ö ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð × Ð × ¬ “forma est´ndar”º a Ô Ð ÑÓ× ÙÒ ÑÔÐÓ Ð × Óº ËÙÔÓÒ ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ ÙÒ ÑÔÖ × ÔÖÓ Ù ØÓÖ Ð Ø × ÓÒ ØÖ × ÔÐ ÒØ × Ý Ó× Ø ÔÓ× ÐØ ÑÓÒØ Ò Ý ÖÙØ ¸ ÔÖ Ó× Ú ÒØ 2000 Ý 1400¸ Ö ×Ô Ø Ú Ñ ÒØ º ÄÓ× Ñ Ö Ó× Ð× ÐØ×× Ö Ò Ò Ð ÔÐ ÒØ ½¸ ÐÓ× ÓÑÔÓÒ ÒØ × Ò Ð ÔÐ ÒØ ¾ Ý Ð Ò× Ñ Ð × Ö Ð Þ Ò Ð ÔÐ ÒØ ¿º Ä ÔÐ ÒØ ÕÙ Ö ÐÓ× Ù ÖÓ× ÔÙ ÔÖÓ Ù Ö Ð Ñ × 70 Ù ÖÓ× ÑÓÒØ Ò Ý 30 ÖÙØ ¸ Ô ÖÓ ÔÓÖ Ö ×ØÖ ÓÒ × ×Ù Ð Ò ×ÓÐ ÙÖ ÔÙ Ö Ö ÐÓ ×ÙÑÓ 80 Ù ÖÓ× Ð Ñ ×º Ò ÐÓ Ñ ÒØ ¸ Ð ÔÐ ÒØ ¾ ÔÙ ÔÖÓ Ù Ö Ð Ñ × 40 ÓÑÔÓÒ ÒØ × Ô Ö Ð Ø ÑÓÒØ Ò Ý 90 Ô Ö ÖÙØ ¸ Ô ÖÓ ÔÓÖ Ö ×ØÖ ÓÒ × ×Ù ÔÖÓ ×Ó ÖÓÑ Ó¸ Ð Ñ Ü ÑÓ ÓÑÔÓÒ ÒØ × ÕÙ ÔÙ Ö Ö Ð Ñ × × 100º Ò ÐÑ ÒØ ¸ Ð ÔÐ ÒØ ¿ ´Ð Ò× Ñ Ð µ¸ ÔÙ Ò× Ñ Ð Ö ÔÓÖ Ñ × 50 Ð Ø × ÑÓÒØ Ò Ö × Ý 60 ÖÙØ
  • 877.
    7.13. Programaci´n lineal o 851 ÈÐ ÒØ ÑÓÒØ Ò ÊÙØ Ô ½ ´Ñ Ö Ó×µ ¼ ¿¼ ¼ ¾ ´ ÓÑÔÓÒ ÒØ × ¼ ¼ ½¼¼ ¿ ´ Ò× Ñ Ð µ ¼ ¼ ¼ ÈÖ Ó ÔÓÖ ÐØ ¾¼¼¼ ½ ¼¼ Ì Ð º¾ Ì Ð Ö ×ÙÑ Ò Óר × Ý Ö ×ØÖ ÓÒ × Ô Ö Ð ÑÔÐÓ Ö ÓÒ ÐØ× × Ò Ñ Ö Ó¸ Ø Ñ Ò ÔÓÖ Ö ×ØÖ ÓÒ × Ñ ÒÓ Ó Ö ¸ Ð ÔÐ ÒØ ÒÓ ÔÙ Ò× Ñ Ð Ö Ñ × 80 Ð Ø × Ð Ñ ×º È Ö ÑÔ Ö ÕÙ Ð Ò ÐÙ Ö Ø ÚÓ ÓÒÐÐ Ú Ð ÑÔÖ × ÓÑ Ø Ö Ò Ùר ׸ Ð Ó ÖÒÓ Ð ÑÔÓÒ Ð ÑÔÖ × Ð ÓÒ ÓÒ ÕÙ ÔÓÖ ÐØ ÖÙØ ÕÙ × Ú Ò ¸ Ð ÑÔÖ × Ø Ò ÕÙ Ú Ò Ö Ð Ñ ÒÓ× 0, 8 ÑÓÒØ Ò º × Ð × Ó× ×¸ × × ÓÒÓ Ö Ð × ÒØ × ÐØ× Ø ÔÓ ÕÙ × Ò Ö Ö Ð Ñ × Ô Ö Ñ Ü Ñ Þ Ö Ð Ò Ò º Ë x1 Ö ÔÖ × ÒØ Ð ÒØ ÐØ× ÑÓÒØ Ò Ý x2 Ð × ÖÙØ ¸ ÒØÓÒ ×¸ ×ÙÑ Ò Ó ÕÙ Ð × Ð Ø × × Ö Ò Ú Ò × Ò ×Ù ØÓØ Ð ¸ × ÔÐ ÒØ Ð × Ù ÒØ ÙÒ ÓÒ Ó Ø ÚÓ Ñ Ü Ñ Þ Ö Z = 2000x1 + 1400x2 = 10x1 + 7x2 ´ º¿ µ ÓÒ ÓÒ Ó Ð × × Ù ÒØ × Ö ×ØÖ ÓÒ × 70x1 + 30x2 ≤ 80 ⇒ 7x1 + 3x2 ≤ 8 40x1 + 90x2 ≤ 100 ⇒ 4x1 + 9x2 ≤ 10 50x1 + 60x2 ≤ 80 ⇒ 5x1 + 6x2 ≤ 8 0, 8x1 > x2 ⇒ 0, 8x1 − x2 ≥ 0 Ë Ð ÔÖÓ Ö Ñ Ð Ò Ð ÔÓÖÕÙ ØÓ × Ð × × Ù Ð × Ý Ù ÓÒ × ÒÚÓÐÙ Ö × ×ÓÒ Ð Ò Ð ×º Ò ØÓ¸ Ø Ð ÓÑÓ × ÐÙ×ØÖ Ò Ð ¬ ÙÖ º½¼¿¸ Ð × Ö Ø × ÓÖÖ ×ÔÓÒ ÒØ × Ð × Ö ×ØÖ ÓÒ × Ð Ò Ò ÙÒ ×Ô Ó ´×ÓÑ Ö Ó Ò Ð ¬ ÙÖ µ Ò ÓÒ × × Ø × Ò Ð × Ö ×ØÖ ÓÒ ×º × ¸ Ú ÑÓ× ÕÙ Ð Ñ Ü ÑÓ Ð ÙÒ ÓÒ Ó Ø ÚÓ × ÙÑÔÐ Ò Ð ÔÙÒØÓ ÒØ Ö× ÓÒ ÕÙ Ô × ÔÓÖ Ð ÙÒ ÓÒ Ó Ø ÚÓ ÈÖÓ Ö Ñ × Ð Ò Ð × ×Ø Ø ÔÓ ÔÙ Ò Ö ×ÓÐÚ Ö× Ñ ÒØ ÙÒ Ð Ö Ð ÓÖ ØÑÓ ÐÐ ¹ Ñ Ó × ÑÔÐ Ü ¸ × Ù ÖØÓ ÔÓÖ Ú Þ ÔÖ Ñ Ö ÔÓÖ ÓÖ ÒØÞ Ò ½ ¸ ÙÒ Ñ ÒØÓ Ð ÒÚ ×Ø ÓÒ ÓÔ Ö ÓÒ × Ý ÕÙ Ö Ú × Ö ÑÓ× Ò Ü º½¿º ´Ô Ò µº Ò ÓÑ ØÖ ¸ ÙÒ × ÑÔÐ Ü × ÙÒ ÔÓÐ ÓÒÓ Ó ÔÓÐ ØÓÔÓ n¹ Ñ Ò× ÓÒ Ð n + 1 Ú ÖØ ׺ × ¸ Ð Ñ ØÓ Ó ÐÙ× ÓÒ ÕÙ Ð ×ÓÐÙ ÓÒ ×Ø Ð Ñ Ø ÔÓÖ Ð ÔÓÐ ØÓÔÓ ÙÝÓ× Ú ÖØ × ÓÖÖ ×ÔÓÒ Ò ÓÒ Ð × ÒØ Ö× ÓÒ × ÒØÖ Ð × Ö Ø × Ð × × Ù Ð × ÓÖÖ ×ÔÓÒ ÒØ × Ð × Ö ×ØÖ ¹ ÓÒ ×º Ä Ø Ð ×ÓÐÙ ÓÒ Ô Ò ÕÙ Ð ÙÒ ÓÒ Ó Ø ÚÓ Ô × Ó ÒÓ ÔÓÖ Ð ÔÓÐ ØÓÔÓº Ò Ð ÑÔÐÓ Ð ¬ ÙÖ º½¼¿¸ Ü ×Ø Ò Ó× Ö ×ØÖ ÓÒ ×¸ Ö Ó Ó× Ö Ø ×¸ ÙÝ × ÒØ Ö× ÓÒ × ¬Ò Ò ÙÒ ØÖ Ò ÙÐÓ Ø Ð º Ä ×ÓÐÙ ÓÒ¸ Ô٠׸ × Ð Ñ Ü ÑÓ ÕÙ Ð ÙÒ ÓÒ Ó Ø ÚÓ ÔÙ Ð ÒÞ Ö ÓÒ ÓÒ Ó ÕÙ × Ö ÙÒ× Ö ÒØÖÓ Ð Ö Ð ØÖ Ò ÙÐÓº
  • 878.
    852 Cap´ ıtulo 7. Grafos ¿ 7x1 + 3x2 ≤ 8 ¾º ¾ 10x1 + 7x2 ´ ÙÒ ÓÒ Ó Ø ÚÓµ ½º ËÓÐÙ ÓÒ ÓÔØ Ñ ½ 0, 8x1 − x2 ≥ 0 ¼º 4x1 + 9x2 9 ≤ 10 5x1 + 6x2 ≤ 8 ¼ ¼ ¼º ½ ½º ¾ ¾º ¿ ÙÖ º½¼¿ ÁÒØ ÖÔÖ Ø ÓÒ ÓÑ ØÖ Ð ÔÖÓ Ö Ñ Ð Ò Ð Ý ×Ù ×ÓÐÙ ÓÒ ÓÔØ Ñ 7.13.1 Forma est´ndar de un programa lineal a À Ý Ú Ö× × Ñ Ò Ö × ÜÔÖ × Ö ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð¸ Ð × Ù Ð × Ú Ö Ò × ÙÒ Ð Ö ÙÒ×¹ ØÒ º ØÓ× ÙÒ ÓÑÓ Ò Ò × Ö Ô Ö ÙÒ ×ÓÐÙ ÓÒ ÓÑÔÙØ ÓÒ Ð¸ × ÓÒÚ Ò ÒØ ÕÙ ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð × ÜÔÖ × Ò Ø ÖÑ ÒÓ× ×Ù ÓÖÑ ×Ø Ò Öº Ò Ö Ñ ÒØ ¸ Ò Ð ÓÖÑ ×Ø Ò Ö × Ø Ò Ò n Ú Ö Ð × × ÓÒ x1, x2, . . . , , xn¸ n ÒÙÑ ÖÓ× Ö Ð × c1, c2, . . . , cn ÓÖÖ ×ÔÓÒ ÒØ × ÐÓ× Ó ¬ ÒØ × Ò Ð ÙÒ ÓÒ Ó Ø ÚÓ¸ m Ö Ð × b1, b2, . . . , bm ×Ó Ó× Ð × ÓØ × Ð × Ö ×ØÖ ÓÒ × Ý n × m Ö Ð × ai,j Ô Ö i = 1, 2, . . . , m Ý j = 1, 2, . . . , n ÓÖÖ ×ÔÓÒ ÒØ × ÐÓ× Ó ¬ ÒØ × Ð × Ö ×ØÖ ÓÒ ×º × ¸ Ò Ö Ý ÓÑÔÙØ ÓÒ ÐÑ ÒØ ¸ Ð ¬Ò ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð × Ò ÓÒØÖ Ö n Ö Ð × x1, x2, . . . , xn Ø Ð ÕÙ n Å Ü Ñ Þ Ö Z = cjxj ´ º¿ µ j=1 ËÙ ØÓ n ai,jxj ≤ bi ÔÖ i = 1, 2, . . . , m ´ º¿ µ j=1 xj ≥ 0 ÔÖ j = 1, 2, . . . , n ´ º ¼µ À Ý Ú Ö × Ñ Ò Ö × Ò ÕÙ ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð ÔÙ ÓÒØÖ Ú Ò Ö Ð ÓÖÑ ×Ø Ò Ö ÙÒ ÓÒ ÙÒ ØÖ Ò× ÓÖÑ ÓÒ ÕÙ Ð ×Ø Ò Ö Þ º 7.13.2 Minimizaci´n, no maximizaci´n, de la funci´n objetivo o o o Ò ×Ø ×Ó¸ Ð ÙÒ ÓÒ Ó Ø ÚÓ × ØÖ Ò× ÓÖÑ Ð Ñ Ü Ñ Þ ÓÒ Ð Ò ÓÒº × Ö¸ × Ð ÙÒ ÓÒ Ó Ø ÚÓ × Ñ Ò Ñ Þ Ö Z¸ ÒØÓÒ × Ñ Ü Ñ Þ Ö Z = −Z × ÕÙ Ú Ð ÒØ º
  • 879.
    7.13. Programaci´n lineal o 853 7.13.3 Variables con restricciones negativas ר × Ð ×Ó Ù Ò Ó × Ò Ù ÒØÖ ÙÒ Ó ¬ ÒØ Ò Ø ÚÓ ÔÓÖ ÑÔÐÓ x1 − 2x2 ≤ 4º Ë ÙÒ Ú Ö Ð xi Ø Ò ÙÒ Ó ¬ ÒØ Ò Ø ÚÓ¸ ÒØÓÒ × Ó ÙÖÖ Ò xi × ×Ùר ØÙÝ ÔÓÖ xi − xi ÓÒ Ö ×ØÖ ÓÒ × xi ≥ 0 Ý xi ≥ 0º Ë Ð ÙÒ ÓÒ Ó Ø ÚÓ ÓÒØ Ò ÙÒ Ø ÖÑ ÒÓ cixi¸ ÒØÓÒ × ×Ø × ×Ùר ØÙÝ ÔÓÖ ci(xi − xi º Ð Ñ ×ÑÓ ÑÓ Ó¸ ØÓ Ó Ø ÖÑ ÒÓ aj,ixi ÕÙ Ô Ö Þ Ò ÙÒ Ö ×ØÖ ÓÒ i × Ö ÑÔÐ Þ ÔÓÖ aj,ixi − aj,ixi º 7.13.3.1 Restricciones de igualdad ר × Ð ×Ó Ù Ò Ó Ð Ö ×ØÖ ÓÒ × Ü Ø Ñ ÒØ ÙÒ Ù Ð ÔÓÖ ÑÔÐÓ¸ x1 +x2 = 5º ÍÒ Ö ×ØÖ ÓÒ Ù Ð f(x1, x2, . . . , xn) = b × ÔÐ ÒØ Ò ÓÖÑ ×Ø Ò Ö Ñ Ò¹ Ø × Ð × Ó× Ö ØÖ ÓÒ × f(x1, x2, . . . , xn) ≤ b Ý f(x1, x2, . . . , xn) ≥ bº 7.13.4 Restricciones mayor o igual ר × Ð ×Ó Ù Ò Ó ÙÒ Ó Ñ × Ö ×ØÖ ÓÒ ×¸ Ò ÐÙ Ö ÔÖ × ÒØ Ö× ÓÑÓ ÙÒ × Ù Ð¹ Ñ ÒÓÖ Ó Ù Ð¸ × ÔÖ × ÒØ Ò ÓÑÓ Ñ ÝÓÖ Ó Ù Ð ÔÓÖ ÑÔÐÓ 2x1 + x2 ≥ 2º ÍÒ Ö ×ØÖ ÓÒ Ð Ø ÔÓ n ai,jxj ≥ bi × ÕÙ Ú Ð ÒØ j=1 j=1 −ai,jxj ≤ −biº n 7.13.5 Un ejemplo ËÙÔÓÒ ÑÓ× Ð × Ù ÒØ ÔÖÓ Ö Ñ Ð Ò Ð Å Ò Ñ Þ Ö 2x1 − x3 ËÙ ØÓ 2x1 + x2 − 3x3 ≤ 3 2x2 + x3 = 4 x1 + x2 − 2x3 ≥ −2 ´ º ½µ x1, x2, x3 ≥ 0 Ä Ù Ð × ÕÙ Ú Ð ÒØ Å ÜÑÞ Ö − 2x1 + (x3 + x3) ËÙ ØÓ 2x1 + x2 + 3x3 − 3x3 ≤ 3 2x2 + x3 − x3 ≤ 4 2x2 + x3 − x3 ≥ 4 −x1 − x2 + 2x3 − 2x3 ≤ 2 ´ º ¾µ x1, x2, x3, x3 ≥ 0 Ä ÒÚ Ö× ÓÒ Ð Ö ×ØÖ ÓÒ ´ º ½µ Ô Ö Ò Ð Ö ×ØÖ ÓÒ ´ º ¾µ¸ Ð Ù Ð ÔÐ ÒØ Ó× ÒÙ Ú × Ö ×ØÖ ÓÒ × Ò Ø Ú ×º Ê Ð Þ Ò Ó Ð ØÖ Ò× ÓÖÑ ÓÒ ÓÖÖ ×ÔÓÒ ÒØ ¸ Ô Ö ÑÓ× Ò Å Ü Ñ Þ Ö − 2(x1 + x1) + (x3 + x3)
  • 880.
    854 Cap´ ıtulo 7. Grafos ËÙ ØÓ 2x1 − 2x1 + x2 − x2 + 3x3 − 3x3 ≤ 3 2x2 − 2x2 + x3 − x3 ≤ 4 2x2 − 2x2 + x3 − x3 ≥ 4 −x1 + x1 − x2 + x2 + 2x3 − 2x3 ≤ 2 x1, x1, x2, x2, x3, x3 ≥ 0 ÈÓÖ × ÑÔÐ ¸ Ò ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð Ò ×Ù ÓÖÑ ×Ø Ò Ö ×ÓÐÓ × ×Ô ¬ Ð ÙÒ ÓÒ Ó Ø ÚÓ Ý ×Ù× Ö ×ØÖ ÓÒ × Ñ ÒÓÖ Ó Ù Ð Ð × Ö ×ØÖ ÓÒ × ÒÓ Ò Ø Ú ÒÓ × ×Ô ¬ Òº 7.13.6 Forma “holgada” de un programa lineal Ä ÓÖÑ ×Ø Ò Ö ÔÙ Ö Ú Ö× ÓÑÓ Ð ÙÒ ÓÒ Ó Ø ÚÓ Z Ý × Ù Ð Ñ ØÖ Ð × Ax ≤ b ´ º ¿µ ÓÒ A × Ð Ñ ØÖ Þ Ó ¬ ÒØ × Ð × Ö ×ØÖ ÓÒ ×¸ x Ð Ú ØÓÖ Ú Ö Ð × × ÓÒ Ý b Ð Ú ØÓÖ ÓØ × Ð × Ö ×ØÖ ÓÒ ×º Ä × Ö ×ØÖ ÓÒ × ÒÓ Ò Ø Ú × ×ÙÑ Ò ÔÖ Ð Ñ ÒØÓ xi Ý ÒÓ × ÓÐÓ Ò ÔÓÖ ÓÑ × ÓÒº ÓÖ Ò¸ Ð Ñ ÝÓÖ ÐÓ× Ñ ØÓ Ó× ×ÓÐÙ ÓÒ ÔÖÓ Ö Ñ × Ð Ò Ð × Ö ÕÙ Ö Ò ÓÑÓ ÒØÖ ÙÒ × ×Ø Ñ Ð Ò Ð ÓÖÑ Ax = b ´º µ × Ö¸ Ð Ü Ô ÓÒ Ð ÒÓ Ò Ø Ú ÔÖ xi¸ ØÓ × Ð × Ö ×ØÖ ÓÒ × ×ÓÒ ÙÐ º ËÙÔÓÒ ÑÓ× ÙÒ Ö ×ØÖ ÓÒ n ai,jxj ≤ bi ´º µ j=1 ÓÖ ÒØÖÓ ÙÞ ÑÓ× ÙÒ ÒÙ Ú Ú Ö Ð s Ý ÔÐ ÒØ ÑÓ× Ð × ÙÐ Ó Ó× Ö ×ØÖ ¹ ÓÒ × n s = bi − ai,jxj ´º µ j=1 s ≥ 0 ´º µ Ä ÚÖ Ð s × ÒÓÑ Ò ÓÐ ´ ×Ð µ¸ ÔÓÖÕÙ ÜÔÖ × Ð Ö Ò ÒØÖ ÐÓ× Ó× Ð Ó× Ð × Ù Ð ´ º µº ÈÖ ÓÒÚ ÖØ Ö ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð Ò ÓÖÑ ×Ø Ò Ö ÙÒÓ Ò ÓÖÑ ÓÐ × Ù× Ò mÚ Ö Ð× ÓÒ Ð × ÓÐ ÙÖ Ð Ø ÔÓ n xj+k = bj − ai,jxj ´º µ j=1 xj+k ≥ 0 ÔÖ k = 1, 2, . . . , m ´º µ
  • 881.
    7.13. Programaci´n lineal o 855 ÈÓÖ ÑÔÐÓ¸ Ô Ö Ð ÔÖÓ Ö Ñ Ò ÓÖÑ ×Ø Ò Ö Z = x1 − 2x2 + x3 x1 + 2x2 − x3 ≤ 4 2x1 − 3x2 − 2x3 ≤ 3 x1 + x2 + 2x3 ≤ 2 Ë ØÖ Ò× ÓÖÑ Ò ×Ù ÓÖÑ ÓÐ Ò Z = x1 − 2x2 + x3 x4 = 4 − x1 − 2x2 + x3 x5 = 3 − 2x1 + 3x2 + 2x3 x6 = 2 − x1 − x2 − 2x3 7.13.7 El m´todo simplex e 7.13.7.1 Esquema general ÍÒ Ù Ò Ñ Ò Ö ÒØ Ò Ö Ð ÔÖ Ò Ô Ó Ð × ÑÔÐ Ü ÓÒ× ×Ø Ò ÔÐ ÒØ ÖÐÓ ÓÑÓ Ð Ö ×ÓÐÙ ÓÒ ÙÒ × ×Ø Ñ Ù ÓÒ ×º ÓÒ× Ö ÑÓ׸ Ô٠׸ Ð × Ù ÒØ ÔÖÓ Ð Ñ Å Ü Ñ Þ Ö Z = 25 x3 + 40 x2 + 30 x1 ËÙ ØÓ 2 x3 + 4x2 + 3 x1 ≤ 500 5 x3 + 2 x2 + 5x1 ≤ 650 2 x3 + 6 x2 + x1 ≤ 820 Ð Ù Ð Ð ÐÐ Ú ÖÐÓ ×Ù ÓÖÑ ÓÐ ÒÓ× ÕÙ Å Ü Ñ Þ Ö z = 25 x3 + 40 x2 + 30 x1 ´ º ¼µ ËÙ ØÓ x4 = −2 x3 − 4 x2 − 3 x1 + 500 ´ º ½µ x5 = −5 x3 − 2 x2 − 5 x1 + 650 ´ º ¾µ x6 = −2 x3 − 6 x2 − x1 + 820 ´ º ¿µ ÙÒ × ×Ø Ñ Ù ÓÒ × ×Ø Ø ÔÓ ×Ù Ð ÐÐ Ñ Ö× Ð ÓÒ Ö Ó º Ò ×Ø ר Ó¸ Ð Ú ÐÓÖ Ð ÙÒ ÓÒ Ó Ø ÚÓ × 0 ÓÖÖ ×ÔÓÒ ÒØ Ð Ú ÖØ (0, 0, 0)¸ Ð Ù Ð × ÙÒ ×ÓÐÙ ÓÒ Ú Ð Ö ×Ô ØÓ Ð ÓÒ ÙÒØÓ Ö ×ØÖ ÓÒ ×¸ Ô ÖÓ ÒÓ Ñ Ü Ñ º ÓÑ Ò ÑÓ× ÔÓÖ ÙÑ ÒØ Ö Ð Ú ÐÓÖ Z ×Ô Ò Ó x2 Ð ÙÒ × Ð × Ö ×ØÖ ÓÒ ×º È Ö ÙÑ ÒØ Ö Ð × ÔÓ× Ð × Ö ÙÒ× Ö Ö× Ð × Ö ×ØÖ ÓÒ ×¸ ÑÓ× × Ó Ö Ð Ñ × × Ú Ö º È Ö ÐÐÓ¸ Ú ÐÙ ÑÓ× Ð ÑÔ ØÓ ÕÙ Ø Ò Ö Ð ÙÑ ÒØÓ Ú ÐÓÖ x2 Ò ÙÒ Ð× Ö ×ØÖ ÓÒ × x4 ≥ 0 ⇒ −4 x2 + 500 ≥ 0 ⇒ x2 < 125 x5 ≥ 0 ⇒ −2 x2 + 650 ≥ 0 ⇒ x2 < 325 410 x6 ≥ 0 ⇒ −6 x2 + 820 ⇒ x2 < ≈ 136.67 3 × ¸ ×Ô ÑÓ× x2 ´ º ½µ¸ ÔÙ × × ÔÓÖ ÓÒ Ñ × ÔÓ ÑÓ× ÙÑ ÒØ Ö Z¸ Ó ÕÙ × Ð Ñ × ÐØÓ Ó ¬ ÒØ ¸ × Ò Ú ÓÐ Ö Ò Ò ÙÒ Ö ×ØÖ ÓÒ x2 = − x4 x3 3 x1 4 − 2 − 4 + 125 ´º µ
  • 882.
    856 Cap´ ıtulo 7. Grafos ÓÖ Ö ÑÔÐ Þ ÑÓ× ×Ø Ù ÓÒ Ò Ð ÓÒ Ö Ó ÔÖ ÒØ Ô Ö Ó Ø Ò Ö Ð × Ù ÒØ Å ÜÑÞ Ö Z = −10 x4 + 5 x3 + 5000 ´º µ ËÙ ØÓ x2 = x4 x3 3 x1 − − 4 2 − 4 + 125 ´º µ x5 = x4 2 − 4 x3 − 7 x1 2 + 400 ´º µ x6 = 3 x4 2 + x3 + 7 x1 2 + 70 ´º µ ÕÙ Ð × ×Ø Ñ × Ò Ù ÒØÖ Ò Ð ÔÙÒØÓ (0, 125, 0)¸ Ð Ù Ð ÙÒ Ò Ò Ò Z 5000º Ü Ñ Ò Ò Ó Z Ò ×Ø ÒÙ ÚÓ ÓÒ Ö Ó¸ Ú ÑÓ× ÕÙ Ð ÙÒ ÔÓ× Ð ÙÑ ÒØ ÖÐ × ÔÓÖ Ð Ú Ö Ð x3¸ ÔÙ × Ð ÓØÖ Ö ×Ø ÒØ × Ò Ø Ú º × ¸ × Ð ÓÒ ÑÓ× x3 ÓÑÓ Ð Ú Ö Ð ÙÑ ÒØ Ö Ý Ð ×Ô ÑÓ× Ð Ö ×ØÖ ÓÒ Ñ × × Ú Ö ¸ Ð Ù Ð × ´ º µº ×ØÓ ÒÓ× Ð × Ù ÒØ ÓÒ Ö Ó Å ÜÑÞ Ö Z = − 5 x5 75 x4 35 x1 4 − 8 − 8 + 5500 ´º µ ËÙ ØÓ x2 = x5 5 x4 5 x1 8 − 16 − 16 + 75 ´ º ¼µ x3 x5 x4 7 x1 = − + 4 8 − 8 + 100 ´ º ½µ x6 x5 13 x4 21 x1 = − + 4 8 + 8 + 170 ´ º ¾µ Ð × Ö ØÓ Ó× ÐÓ× Ó ¬ ÒØ Z Ò Ø ÚÓ׸ ÔÓ ÑÓ× ÓÒ ÐÙ Ö ÕÙ ÒÓ × ÔÓ× Ð ÙÑ Ò¹ Ø ÖÐ Ñ ×º ÓÒ× Ù ÒØ Ñ ÒØ ¸ Z × Ñ Ü Ñ ¸ ÓÒ Ú ÐÓÖ 5500¸ ÓÖÖ ×ÔÓÒ ÒØ Ð Ú ÖØ (0, 75, 100)º Ð ÔÖÓ ×Ó ÕÙ ÑÓ× ÑÔÐ ¬ Ö ÔÙ Ò Ö Ð Þ Ö× ÙÒ ÒØ ÒÖ Ú Ö Ð × Ý ÙØÓÑ Ø Þ Ö× º È Ö ÐÐÓ¸ Ò ÔÖ Ñ Ö Òר Ò ¸ ¬Ò ÑÓ× Ð Ð × Simplex<T>¸ Ð Ù Ð Ö × Ò Ð Ö ÚÓ Ë ÑÔРܺÀ ¸ Ý ÕÙ Ö Ò × Ö × Ó× × ¬Ò ÓÑÓ × Ù Ë ÑÔРܺÀ ≡ template <typename T> class Simplex { public: enum State { Not_Solved, Solving, Unbounded, Solved, Unfeasible }; Å Ñ ÖÓ× ÔÖ Ú Ó× Ë ÑÔÐ Ü Å Ñ ÖÓ× ÔÙ Ð Ó× Ë ÑÔÐ Ü }; Ä Ð × Simplex × ÙÒ ×ÓÐÙ ÓÒ ÓÖ ÔÖÓ Ö Ñ × Ð Ò Ð × ×Ô ¬ Ó× Ò ÓÖÑ ×Ø Ò Ö¸ ÙÝ ÒØ ÚÖ Ð× Ò Ö× Ò Ø ÑÔÓ ÓÒרÖÙ ÓÒ Å Ñ ÖÓ× ÔÙ Ð Ó× Ë ÑÔÐ Ü ≡ ´ µ Simplex(int n) n ׸ Ô٠׸ Ð ÒØ Ú Ö Ð × Ö ×ØÖ ÓÒ Ð × ×Ø Ñ º Ä Ú Ö Ð × × ÒÙÑ Ö Ò × Ð 0 ר n − 1º Ð Ú ÐÓÖ n¸ ÒØ ÖÒ Ñ ÒØ ÒÓÑ Ö Ó ÓÑÓ num var¸ × Ó Ø Ò Ñ ÒØ Ð ÔÖ Ñ Ø Ú get num vars()º 7.13.7.2 Definici´n de la funci´n objetivo o o Ù Ò Ó × Òר Ò ÙÒ × ×Ø Ñ ¸ ÐÓ× Ó ¬ ÒØ × Ð ÙÒ ÓÒ Ó Ø ÚÓ ×ÓÒ ÒÙÐÓ× Ý ÒÓ Ý Ö ×ØÖ ÓÒ ×º × ¸ ×Ù ×Ô ¬ ÓÒ × Ö Ñ Ø × ÑÔÐ Ñ ÒØ Ò Ö ×Ù× Ó ¬ ÒØ ×
  • 883.
    7.13. Programaci´n lineal o 857 Ñ ÒØ Å Ñ ÖÓ× ÔÙ Ð Ó× Ë ÑÔÐ Ü +≡ ´ µ void put_objetive_function_coef(int i, const T & coef) ÓÒ i × Ð ÒÙÑ ÖÓ Ð Ú Ö Ð Ý coef ×Ù Ó ¬ ÒØ Ò Ð ÙÒ ÓÒ Ó Ø ÚÓº ÍÒ ÐØ ÖÒ Ø Ú Ô Ö Ò Ö Ð ÙÒ ÓÒ Ó Ø ÚÓ ÓÒ× ×Ø Ò ÓÐÓ Ö ×Ù× Ó ¬ ÒØ × Ò ÙÒ ÖÖ ÐÓº È Ö ÐÐÓ¸ × ÔÙ ÑÔÐ Ö Ð ÙÒ Ð × × Ù ÒØ × ÔÖ Ñ Ø Ú × Å Ñ ÖÓ× ÔÙ Ð Ó× Ë ÑÔÐ Ü +≡ ´ µ void put_objetive_function(DynArray<T> & coefs) void put_objetive_function(T coefs[]) Í× × DynArray ¾º 7.13.7.3 Definici´n de las restricciones o È Ö Ó Ð ÙÒ ÓÒ Ó Ø ÚÓ¸ Ý Ú Ö Ó× ×ÕÙ Ñ × Ô Ö ¬Ò Ö Ð × Ö ×ØÖ ÓÒ ×º Ð ÔÖ Ñ ÖÓ¸ Ù Ð Ô Ö × Ö Ð Ñ × Ù×٠и ÓÒ× ×Ø Ò Ò ÖÐ Ð × ×Ø Ñ Ð Ü ×Ø Ò ÙÒ Ö ×ØÖ ÓÒ Å Ñ ÖÓ× ÔÙ Ð Ó× Ë ÑÔÐ Ü +≡ ´ µ T * put_restriction(T * coefs = NULL) ÍÒ ÐÐ Ñ put restriction() Ö Ò Ð × ×Ø Ñ ÙÒ ÒÙ Ú Ö ×ØÖ ÓÒ Ò ÓÖÑ ×Ø Ò Ö ÓÒ Ó ¬ ÒØ × ÒÙÐÓ׺ Ä ÖÙØ Ò Ö ØÓÖÒ ÙÒ ÔÙÒØ ÖÓ ÙÒ ÖÖ ÐÓ Ó ¬ ÒØ × Ð Ö ×ØÖ ÓÒ ÒÙÑ Ö Ó× ÒØÖ 0..num varº Ä Ó Ø Ò ÓÒ ×Ø ÔÙÒØ ÖÓ ×Ó Ö ØÓ ÙÒÓ ÐÓ× Ó ¬ ÒØ ׺ × ÔÓ× Ð Ó Ø Ò Ö Ð Ñ ×ÑÓ ÔÙÒØ ÖÓ Ñ ÒØ Å Ñ ÖÓ× ÔÙ Ð Ó× Ë ÑÔÐ Ü +≡ ´ µ ½ T * get_restriction(int rest_num) Ö ØÓÖÒ ÙÒ ÔÙÒØ ÖÓ Ð i¹ × ÑÓ ÖÖ ÐÓ Ö ×ØÖ ÓÒº get restriction(i) Ì Ñ Ò × ÔÓ× Ð Ô × Ö Ö Ø Ñ ÒØ ÐÓ× Ú ÐÓÖ × ÐÓ× Ó ¬ ÒØ × Ò ÙÒ ÖÖ ÐÓ Ñ ÒØ ÙÒ ÐÐ Ñ put restriction(ptr)¸ ÓÒ ptr × Ð ÔÙÒØ ÖÓ Ð ÖÖ ÐÓ Ó ¬ ÒØ ׺ 7.13.7.4 La estructura de datos ÍÒ Ð Ú ÖÙ Ð Ò Ð ÙØÓÑ Ø Þ ÓÒ Ð × ÑÔÐ Ü Ö × Ò Ð ÑÔÐ Ó ÙÒ Ù ×ØÖÙ ØÙÖ ØÓ׺ ÆÓ × Ð Ô Ö Ø Ö× ÕÙ Ð Ñ ØÓ Ó × ×Ø ÒØ Ö Ñ Ò × ÒØ Ö ×ÓÐÚ Ö ÙÒ × ×Ø Ñ Ð Ò Ð Ù ÓÒ ×º Ò × × ÒØ Ó¸ ×Ù× Ñ ØÓ Ó× Ö ×ÓÐÙ ÓÒ ×ÓÒ ÔÐ Ð × Ô Ö Ð × ÑÔРܺ ÓÒ× Ö ÑÓ× ÓÑÓ ÑÔÐÓ Ð × Ù ÒØ × ×Ø Ñ Ò ÓÖÑ ×Ø Ò Ö Z = 40x0 + 50x1 + 60x2 + 30x3 ËÙ ØÓ 2x0 + x1 + 2x2 + 2x3 ≤ 205 x0 + x1 + 3x2 + x3 ≤ 205 x0 + 3x1 + 4x2 ≤ 255 3x0 + 2x1 + 2x2 + 2x3 ≤ 250
  • 884.
    858 Cap´ ıtulo 7. Grafos Ð ÔÖÓ Ö Ñ Ð Ò Ð × Ö ÔÖ × ÒØ Ò Ñ ÒØ ÙÒ Ñ ØÖ Þ m (n + m + 1) × (m + 1)¸ ÓÒ n ´num varµ × Ð ÒØ ÚÖ Ð× × ÓÒ Ý m ´num restµ Ð Ö ×ØÖ ÓÒ ×º Ä ÔÖ Ñ Ö ¬Ð ÓÒØ Ò Z − f(x0, x1, . . . , xn−1) Ý Ð Ö ×ØÓ Ð × Ö ×ØÖ ÓÒ × Ò ÓÖÑ ÓÐ º × ¸ Ô Ö ÑÙ ×ØÖÓ ÑÔÐÓ¸ Ð Ñ ØÖ Þ Ö ×ÙÐØ ÒØ × ¬Ò ÓÑÓ ⎛ ⎞ −40.00 −50.00 −60.00 −30.00 0.00 0.00 0.00 0.00 0.00 ⎜ 2.00 1.00 2.00 2.00 1.00 0.00 0.00 0.00 205.00 ⎟ ⎜ ⎟ ⎜ 1.00 1.00 3.00 1.00 0.00 1.00 0.00 0.00 205.00 ⎟ ⎜ ⎟ ⎝ 1.00 3.00 4.00 0.00 0.00 0.00 1.00 0.00 255.00 ⎠ 3.00 2.00 2.00 2.00 0.00 0.00 0.00 1.00 250.00 Ë ÙÒ Ð ÒØ Ú Ö Ð × ÕÙ Ø Ò Ð × ×Ø Ñ ¸ × ÑÙÝ ÑÔÓÖØ ÒØ ¸ ØÓ× ÓÒÓÑ Ñ ÑÓÖ ¸ ÕÙ Ð Ñ ØÖ Þ × ×Ô Ö º Ò × × ÒØ Ó¸ Ð Ð × Simplex<T> ÑÔÐ ÙÒ Ð × ÐÐ Ñ DynMatrix<T>¸ Ð Ù Ð ×Ø ÙÒ Ñ ÒØ Ò DynArray<T>º ÓÒ× Ù ÒØ Ñ ÒØ ¸ DynMatrix<T> ÓÖÖ Ð × Ñ ÑÓÖ Ô Ö Ð Ñ ÒØÓ× ÒÙÐÓ× Ð Ñ ØÖ Þº 7.13.7.5 Selecci´n del pivote o ÍÒ Ú Þ ÓÒרÖÙ ×Ø Ñ ØÖ Þ Ò Ð¸ × ÔÖÓ Ø Ö Ø Ú Ñ ÒØ × Ð ÓÒ Ö Ð Ð Ñ ÒØÓ Ô ÚÓØ Ý Ô ÚÓØ Ö ×Ø ÕÙ ØÓ Ó× ÐÓ× Ó ¬ ÒØ × Ð ÙÒ ÓÒ Ó Ø ÚÓ¸ ÐÓ× Ð ÔÖ Ñ Ö ¬Ð ¸ Ú Ò Ò ÔÓ× Ø ÚÓ׺ Ð ÔÖ Ñ Ö Ô ×Ó ÓÒ× ×Ø Ò Ø ÖÑ Ò Ö Ð ÓÐÙÑÒ ¸ Ù Ð × Ð Ð Ñ ÒÓÖ Ó ¬ ÒØ Ò Ø ÚÓ Ð ÙÒ ÓÒ Ó Ø ÚÓ Ó × ¸ Ð Ó ¬ ÒØ ÔÓÖ Ð Ù Ð Ý Ñ ÝÓÖ ÔÓ× Ð ÙÑ ÒØ Ö Z Å Ñ ÖÓ× ÔÖ Ú Ó× Ë ÑÔÐ Ü ≡ ´ µ int compute_pivot_col() const { T minimum = numeric_limits<T>::max(); int p = -1; for (int i = 0, M = num_var + num_rest; i < M; i++) { const T & c = m->read(0, i); if (c < minimum) { p = i; minimum = c; } } return minimum >= 0 ? -1 : p; } Ë ÒÓ Ý Ó ¬ ÒØ × Ò Ø ÚÓ׸ ÒØÓÒ × Ð × ×Ø Ñ Ý × Ò Ù ÒØÖ Ò ÙÒ ×ÓÐÙ ÓÒ ÓÔØ Ñ Ý × Ö ØÓÖÒ -1º ÐÓ ÓÒØÖ Ö Ó¸ × Ö ØÓÖÒ Ð Ò Ð ÓÐÙÑÒ Ð Ô ÚÓØ ¸ Ð Ù Ð ÒÓÑ Ò ÑÓ× pº ÈÖ Ø ÖÑ Ò Ö Ð ¬Ð Ð Ô ÚÓØ ¸ Ð ÙÐ ÑÓ× Ð Ñ ÒÓÖ Ö Ó ÔÓ× Ø ÚÓ m(i,p)/m(i,n+m) ÐÓ ÕÙ ÒÓ× ÔÖÓÔÓÖ ÓÒ Ð Ö ×ØÖ ÓÒ Ñ × × Ú Ö Å Ñ ÖÓ× ÔÖ Ú Ó× Ë ÑÔÐ Ü +≡ ´ µ int compute_pivot_row(int p) const { int q = -1;
  • 885.
    7.13. Programaci´n lineal o 859 T min_ratio = numeric_limits<T>::max(); for (int i = q + 1, M = num_var + num_rest; i <= num_rest; i++) { const T val = m->read(i, M); if (val < 0) continue; const T den = m->read(i, p); if (den <= 0) continue; const T ratio = val / den; if (ratio < min_ratio) { q = i; min_ratio = ratio; } } return q; } Ë ÒÓ × Ò Ù ÒØÖ Ò Ò ÙÒ Ö Ó ÔÓ× Ø ÚÓ¸ ÒØÓÒ × × ØÖ Ø ÙÒ × ×Ø Ñ Ð Ñ Ø Ó × Ö ÕÙ ÒÓ Ø Ò ÙÒ ÔÓÐ ØÓÔÓ ¬Ò Ó ´ÐÓ ÕÙ × Ö ÙÒ ÖÖÓÖ ÑÓ Ð Þ Óµ Ý × Ö ØÓÖÒ -1º ÐÓ ÓÒØÖ Ö Ó¸ × Ö ØÓÖÒ Ð Ò Ð ¬Ð Ð Ô ÚÓØ ¸ Ð Ù Ð ÒÓÑ Ò Ö ÑÓ× qº È Ö Ô Ö Ð × Ó× ÖÙØ Ò × ÒØ Ö ÓÖ ×¸ ÑÔÐ ÑÓ× ÙÒ Ñ ØÓ Ó ÜÔÐ ØÓ ÕÙ Ø ÖÑ Ò Ð Ð Ñ ÒØÓ Ô ÚÓØ Å Ñ ÖÓ× ÔÖ Ú Ó× Ë ÑÔÐ Ü +≡ ´ µ ¼ State select_pivot(int & p, int & q) { const int col = compute_pivot_col(); if (col == -1) return state = Solved; const int row = compute_pivot_row(col); if (row == -1) return state = Unbounded; p = row; q = col; return state = Solving; } ÓÑÓ ÔÙ Ò Ö Ö× Ð Ò×Ô ÓÒ¸ Ð ÖÙØ Ò Ô Ð Ð × Ó× Ö ÒØ × Ý Ö ØÓÖÒ ÙÒ ×Ø Ó ×ÓÐÙ ÓÒº ÇÖ Ò ÐÑ ÒØ ¸ ÒØ × Ð ÔÖ Ñ Ö ÐÐ Ñ select pivot(p, q)¸ Ð × ×Ø Ñ × Ò Ù ÒØÖ Ò Ð ×Ø Ó Not Solvedº × Ô Ö Ð ÔÖÓ Ö Ñ Ý Ð Ñ ØÖ Þ ÑÔÐÓ׸ Ð ÖÙØ Ò ÒØ Ö ÓÖ ÒØ ¬ Ð × Ù ÒØ Ô ÚÓØ ´ Ò ÖÖ Ó Ò Ö ÙÐÓµ ⎛ ⎞ −40.00 −50.00 −60.00 −30.00 0.00 0.00 0.00 0.00 0.00 ⎜ ⎟ ⎜ 2.00 1.00 2.00 2.00 1.00 0.00 0.00 0.00 205.00 ⎟ ⎜ ⎟ ⎜ 1.00 1.00 3.00 1.00 0.00 1.00 0.00 0.00 205.00 ⎟ ⎜ ⎟ ⎜ º¼¼ 255.00 ⎟ ⎝ 1.00 3.00 0.00 0.00 0.00 1.00 0.00 ⎠ 3.00 2.00 2.00 2.00 0.00 0.00 0.00 1.00 250.00 Ð Ù Ð × ÓÖÖ ×ÔÓÒ ÓÒ Ð ÓÐÙÑÒ ¾ ÙÝÓ Ñ Ò ÑÓ Ó ¬ ÒØ Ð ÙÒ ÓÒ Ó Ø ÚÓ ×
  • 886.
    860 Cap´ ıtulo 7. Grafos −60 Ý Ð ¬Ð ¿ ÓÖÖ ×ÔÓÒ ÒØ Ð Ñ Ò ÑÓ Ö Ó Ñ Ò(205/2, 205/3, 255/4, 250/2) = 255/4º 7.13.7.6 Pivoteo Ð Ô ÚÓØ Ó ÓÒ× ×Ø Ò Ð ÙÐ Ö ÐÓ× ÒÙ ÚÓ× Ó ¬ ÒØ × Ð Ñ ØÖ Þ ÓÒ Ð × Ù ÒØ Ö Ø Ö Ó ½º È Ö Ð ¬Ð Ð Ô ÚÓØ p Ð Ñ ÒØÓ ×Ø ¬Ð × Ú ÒØÖ m(p, q)º ר Ô ×Ó × ÕÙ Ú Ð ÒØ ×Ô Ö Ð Ú Ö Ð xq Ð Ö ×ØÖ ÓÒ pº ¾º È Ö Ð Ö ×ØÓ Ð × ¬Ð × × m (p) Ð ¬Ð Ð Ô ÚÓØ ØÖ Ò× ÓÖÑ × ÙÒ Ð Ô ×Ó ÒØ Ö ÓÖº ¬Ð m(i) × Ð ÙÐ ÓÑÓ m(i) = m(i) − m(i, p) × m (p)º Î ×ØÓ× ÔÓÖ ¬Ð ׸ רÓ× Ô ×Ó× ÕÙ Ú Ð Ò Ú ÐÙ Ö Z Ý Ð × Ö ×ØÖ ÓÒ × ÓÒ Ð ÓÒ Ð Ú Ö Ð xqº Ð ÔÖÓ ×Ó ÒØ Ö ÓÖ × ÔÙ Ó ¬ Ö ÓÑÓ × Ù ¼ Å Ñ ÖÓ× ÔÖ Ú Ó× Ë ÑÔÐ Ü +≡ ´ µ ½ void to_pivot(size_t p, size_t q) { const int M = num_var + num_rest; // cantidad de columnas const T pivot = m->read(p, q); for (int j = 0; j <= M; j++) // fila del pivote if (j != q) m->write(p, j, m->read(p, j) / pivot); m->write(p, q, 1); for (int i = 0; i <= num_rest; i++) // resto de las filas for (int j = 0; j <= M; j++) if (i != p and j != q) m->write(i, j, m->read(i,j) - m->read(i,q)*m->read(p,j)); for (int i = 0; i <= num_rest; i++) // columna del pivote en 0 salvo q if (i != p) m->write(i, q, 0); } Ð Ô ÚÓØ Ó × Ð Ñ ×Ñ ÓÔ Ö ÓÒ ×Ó Ö Ð Ù Ð × ÙÒ Ñ ÒØ ÙÒ Ñ ØÓ Ó ÑÙÝ ÔÓÔÙÐ Ö Ö ×ÓÐÙ ÓÒ × ×Ø Ñ × Ð Ò Ð × Ù ÓÒ × ÐÐ Ñ Ó Ù××¹ÂÓÖ Òº È Ö ÒÙ ×ØÖ Ñ ØÖ Þ ÑÔÐÓ¸ Ð Ú ÐÓÖ Ò Ð Ð ÙÒ ÓÒ Ó Ø ÚÓ × 0¸ Ð Ù Ð × ÓÖÖ ×ÔÓÒ ÓÒ Ð Ú ÖØ Ð × ÑÔÐ Ü (0, 0, 0, 0)º Ð Ö Ð Þ Ö Ð ÔÖ Ñ Ö Ô ÚÓØ Ó¸ × Ò Ö ¹ Ñ ÒØ Ð Ú ÐÓÖ Ð ÙÒ ÓÒ Ó Ø ÚÓ Ý ¸ Ð Ü Ô ÓÒ Ð ¬Ð Ô ÚÓØ ¸ ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ× ×Ù ÓÐÙÑÒ ÖÓº × ¸ Ô Ö p = 2 Ý q = 3¸ Ð Ô ÚÓØ Ó ÔÖÓ Ù ⎛ ⎞ −25.00 −5.00 0.00 −30.00 0.00 0.00 15.00 0.00 3825.00 ⎜ 1.50 −0.50 0.00 −0.50 77.50 ⎟ ⎜ 0.00 2.00 1.00 0.00 ⎟ ⎜ ⎟ ⎜ 0.25 −1.25 0.00 ½º¼¼ 0.00 1.00 −0.75 0.00 13.75 ⎟ ⎜ ⎟ ⎜ ⎟ ⎝ 0.25 0.75 1.00 0.00 0.00 0.00 0.25 0.00 63.75 ⎠ 2.50 0.50 0.00 2.00 0.00 0.00 −0.50 1.00 122.50 Ä ÓÔ Ö ÓÒ Ð Ñ Ò Ð ÓÐÙÑÒ ¾ Ý ÐÐ Ú Ð Ú ÐÓÖ Ð ÙÒ ÓÒ Ó Ø ÚÓ 3825¸ ÓÖÖ ×¹ ÔÓÒ ÒØ Ð Ú ÖØ Ð × ÑÔÐ Ü (0, 0, 63.75, 0)º ÓÒØ ÒÙ Ò Ó ÓÒ Ð Ð ÙÐÓ¸ Ô Ö ÓÑÓ ÒÙ ÚÓ Ô ÚÓØ p = 3 ´ Ð −30µ Ý q = 2 ´ Ñ Ò(77.5/2, 13.75, 122.5/2)µ¸ ÐÓ ÕÙ ÒÓ× ÖÖÓ
  • 887.
    7.13. Programaci´n lineal o 861 ⎛ ⎞ −17.50 −42.50 0.00 0.00 0.00 30.00 −7.50 0.00 4237.50 ⎜ ⎟ ⎜ 1.00 ¾º¼¼ 0.00 0.00 1.00 −2.00 1.00 0.00 50.00 ⎟ ⎜ ⎟ ⎜ ⎟ ⎜ 0.25 −1.25 0.00 1.00 0.00 1.00 −0.75 0.00 13.75 ⎟ ⎜ ⎟ ⎝ 0.25 0.75 1.00 0.00 0.00 0.00 0.25 0.00 63.75 ⎠ 2.00 3.00 0.00 0.00 0.00 −2.00 1.00 1.00 95.00 ÆÓ× Ò ÓÒØÖ ÑÓ× Ò Ð Ú ÖØ (0, 0, 63.75, 13, 75) ÓÒ Ú ÐÓÖ ÙÒ ÓÒ Ó Ø ÚÓ 4237.5º È ÚÓØ ÑÓ× ÓÒ m(1, 1) ÐÓ ÕÙ ÒÓ× ÔÖÓ Ù ⎛ ⎞ 3.75 0.00 0.00 0.00 21.25 −12.50 13.75 0.00 5300.00 ⎜ −1.00 ⎟ ⎜ 0.50 1.00 0.00 0.00 0.50 0.50 0.00 25.00 ⎟ ⎜ −0.25 −0.12 ⎟ ⎜ 0.88 0.00 0.00 1.00 0.62 0.00 45.00 ⎟ ⎜ ⎟ ⎜ −0.12 0.00 1.00 0.00 −0.38 0.75 −0.12 0.00 45.00 ⎟ ⎝ ⎠ 0.50 0.00 0.00 0.00 −1.50 ½º¼¼ −0.50 1.00 20.00 × Ö¸ Ð ÔÙÒØÓ (0, 25, 45, 45) ÓÒ Ú ÐÓÖ ÙÒ ÓÒ Ó Ø ÚÓ 5300º ÆÓ× Ö ×Ø ÙÒ ÙÐØ ÑÓ Ô ÚÓØ Ó m(4, 4)¸ ÙÝÓ Ö ×ÙÐØ Ó ¬Ò Ð × ⎛ ⎞ 10.00 0.00 0.00 0.00 2.50 0.00 7.50 12.50 5550.00 ⎜ 1.00 1.00 0.00 0.00 −1.00 0.00 0.00 1.00 45.00 ⎟ ⎜ ⎟ ⎜ 1.00 0.00 0.00 1.00 0.25 0.00 −0.25 0.25 50.00 ⎟ ⎜ ⎟ ⎝ −0.50 0.00 1.00 0.00 0.75 0.00 0.25 −0.75 30.00 ⎠ 0.50 0.00 0.00 0.00 −1.50 1.00 −0.50 1.00 20.00 × ¸ Ð Ú ÖØ (0, 45, 30, 50) Ô Ö ÙÒ Ú ÐÓÖ Ñ Ü ÑÓ 5550º Ð ÔÖÓ ×Ó ÒØ Ö ÓÖ × ÙØÓÑ Ø Þ ÑÙÝ × Ò ÐÐ Ñ ÒØ Ñ ÒØ Ð × Ù ÒØ Ñ ØÓ Ó ½ Å Ñ ÖÓ× ÔÙ Ð Ó× Ë ÑÔÐ Ü +≡ ´ µ ¾ State solve() { for (int i, j; true;) { const Simplex<T>::State state = select_pivot(i, j); if (state == Simplex<T>::Unbounded or state == Simplex<T>::Solved) return state; to_pivot(i, j); } } ÓÑÓ ÔÓ ÑÓ× ÒÓØ Ö Ð Ð ÓÖ ØÑÓ¸ Ð Ú ÐÓÖ ¬Ò Ð ÙÒ Ú Ö Ð i × Ø ÖÑ Ò Ñ Ö Ò Ó ×Ù ÓÐÙÑÒ ¸ Ð Ù Ð ÓÒØ Ò Ö ÖÓ× Ý ÙÒ ÙÒÓ¸ Ý Ü Ñ Ò Ò Ó Ð Ú ÐÓÖ m(i, num rest)¸ ÓÒ j × Ð Ò Ð Ú ÐÓÖ ÙÒÓ Ò Ð ÓÐÙÑÒ º ×ØÓ × ÔÙ Ö Ð Þ Ö ÓÒ Ð × Ù ÒØ ÖÙØ Ò ½ Å Ñ ÖÓ× ÔÖ Ú Ó× Ë ÑÔÐ Ü +≡ ´ µ ¼ T find_value(const size_t j) const { T ret_val = 0.0; for (int i = 1, count = 0; i < num_rest; i++) { const T & value = m->read(i, j); if (value == 0.0) continue; if (value == 1.0)
  • 888.
    862 Cap´ ıtulo 7. Grafos if (count++ == 0) ret_val = m->read(i, num_var + num_rest); else return 0.0; else return ret_val; } return ret_val; } × ¸ ÙÒ Ú Þ Ö ×Ù ÐØÓ Ð × ×Ø Ñ ¸ ÔÓ ÑÓ× Ö Ö Ð ×ÓÐÙ ÓÒ Ñ ÒØ ¾ Å Ñ ÖÓ× ÔÙ Ð Ó× Ë ÑÔÐ Ü +≡ ´ µ ½ void load_solution() { for (int j = 0; j < num_var; j++) solution[j] = find_value(j); } 7.13.8 Conclusi´n sobre la programaci´n lineal o o Ò ×Ø × ÓÒ ÑÓ× ÔÖ × ÒØ Ó ÙÒ Ô ÒÓÖ Ñ ÑÙÝ Ò Ö Ð Ý ×ÙÔ Ö¬ Ð ×Ó Ö Ð ÔÖÓ Ö ¹ Ñ ÓÒ Ð Ò Ð Ý ÙÒÓ ×Ù× Ñ ØÓ Ó× Ö ×ÓÐÙ ÓÒ Ñ × ÔÓÔÙÐ Ö × Ð × ÑÔРܺ Ð Ð ÓÖ ØÑÓ × ÑÔÐ Ü × ÜØÖ Ñ Ñ ÒØ Ð Ò Ð Þ Öº Å Ø Ñ Ø Ñ ÒØ × ÙÒ Ð ÓÖ ØÑÓ ÜÔÓÒ Ò Ð Ý × Ò Ò ÓÒØÖ Ó ×Ó× ÕÙ ÒÖÒÐ Ù ÓÒ ×Ø Ø ÔÓ Ö Ò Ñ ÒØÓº Ë Ò Ñ Ö Ó¸ Ò Ð ÔÖ Ø ¸ Ð ÔÖÓÑ Ó Ù ÓÒ Ð × ÑÔÐ Ü × ×Ô Ø ÙÐ Ö¸ ÙÒÕÙ ÙÒ ÒÓ × ÓÑÔÖ Ò Ò Ð Ö ÞÓÒº Ô × Ö Ð Ô Ö ÓÒ ÒÙ ÚÓ× Ñ ØÓ Ó× ÓÔØ Ñ Þ ÓÒ ´Ú × × ÓÒ Ö Ö Ò × Ü º½ ´Ô Ò ½µµ¸ ÔÓÖ ×Ù × ÑÔÐ ÑÔÐ Ñ ÒØ ÓÒ Ý ×Ù Ö Ò Ñ ÒØÓ¸ Ð × ÑÔÐ Ü × Ù × Ò Ó ÙÒ Ð × × Ó Ò × ÔÖ Ò Ô Ð × ÓÑÓ ×ÓÐÙ ÓÒ ÓÖ ÔÖÓ Ö Ñ × Ð Ò Ð ×º Ò Ð ÓÒØ ÜØÓ ×Ø Ø ÜØÓ¸ Ð ÑÔÓÖØ Ò Ð ÔÖÓ Ö Ñ ÓÒ Ð Ò Ð ×Ù Ý ×Ó Ö Ð Ó ÕÙ Ü ×Ø ÙÒ ÒØ Ñ ÓÒ Ü ÓÒ ÒØÖ Ð × ÑÔРܸ × ÓÑÓ ÓØÖÓ× Ñ ØÓ Ó× ÓÔØ Ñ Þ ÓÒ¸ Ý Ð × Ö × ­Ù Óº ÓÒ× Ù ÒØ Ñ ÒØ ¸ ר ÓÒ Ü ÓÒ × ÜØ Ò× Ú ÐÓ× Ö Ó× Ò Ò Ö Ðº ÐÓ× ×Ô ØÓ× ×Ø Ú Ò ÙÐÓ ÒÓ× Ó Ö ÑÓ× Ö Ú Ñ ÒØ Ò Ð × Ù ÒØ × ÓÒº 7.14 Redes de flujo y programaci´n lineal o ÍÒ Ö ­Ù Ó ÔÙ ÜÔÖ × Ö× ÓÑÓ ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð¸ Ö ×ÓÐÙ Ð Ñ ÒØ Ù ¹ Ð ×ÕÙ Ö ÐÓ× Ñ ØÓ Ó× Ð ÔÖÓ Ö Ñ ÓÒ Ð Ò Ðº 7.14.1 Conversi´n de una red capacitada de costes a un programa lineal o ÓÒ× Ö ÑÓ× ÙÒ Ö ÔÖ × ÒØ ÓÒ Ñ ØÖ Ð Ô Ö ÙÒ Ö Ô Ø ÓÒ Óר × n ÒÓ Ó׺ ÒÓ Ó × × Ò Ð ÔÓÖ ÙÒ Ò Ñ ØÖ Ð Ý Ð Ö Ó ÔÓÖ ×Ù ÒØÖ Ò Ð Ñ ØÖ Þº × ¸ Ð ÔÖÓ Ð Ñ ­Ù Ó Ñ Ü ÑÓ Óר Ñ Ò ÑÓ ÔÙ ÔÐ ÒØ Ö× ¸ Ò Ö Ñ ÒØ ¸ ÓÑÓ ÙÒÓ ÓÔØ Ñ Þ ÓÒ¸ Ð × Ù ÒØ ÑÓ Ó n n ÅÒÑÞ Ö Z= ci,jxi,j ´ º ¿µ i=1 j=1
  • 889.
    7.14. Redes deflujo y programaci´n lineal o 863 ËÙ ØÓ ÐÓ× ÓÒ ÙÒØÓ× Ö ×ØÖ ÓÒ × n n xi,j − xk,i = bi, i = 1, 2, . . . , n ´º µ j=1 k=1 xi,j ≥ 0, ´º µ i, j = 1, 2, . . . , n ÈÓÖ Ö Ó i −→ j¸ ×Ù Ú ÐÓÖ ­Ù Ó Ö ÔÖ × ÒØ ÙÒ Ú Ö Ð × ÓÒ xi,jº Ä ×ÙÑ Z¸ ÓÖÖ ×ÔÓÒ ÒØ Ð Ú ÐÓÖ ­Ù Ó Ð Ö ¸ Ö ÔÖ × ÒØ Ð ÙÒ ÓÒ Ó Ø ÚÓº ÈÓÖ ÒÓ Ó i¸ Ð Ú ÐÓÖ bi¸ ÓÖÖ ×ÔÓÒ ÒØ Ð Ö Ò ÒØÖ Ð ­Ù Ó ÒØÖ Ý Ð × Ð ¸ Ö ÔÖ × ÒØ ÙÒ Ö ×ØÖ ÓÒº Ð Ü Ô ÓÒ Ð Ù ÒØ Ý Ð ×ÙÑ ÖÓ¿ ¸ bi = 0¸ Ñ ÒØÖ × ÕÙ Ô Ö Ð Ù ÒØ Ý ×ÙÑ ÖÓ bs = btº Ò ÐÑ ÒØ ¸ ÔÙ ×ØÓ ÕÙ Ð ­Ù Ó ÒÓ ÔÙ × Ö Ò Ø ÚÓ¸ Ú Ö Ð xi,j ≥ 0º Î ÑÓ׸ ÒØÓÒ ×¸ ÙÒ Ñ Ô Ó Ö ØÓ × ÙÒ Ö Óר × ÙÒ ÔÖÓ Ö Ñ Ð Ò Ðº Ì Ð Ñ Ô Ó × ÒÓÖÑ ÑÔÓÖØ Ò ÔÓÖ Ó× Ö ÞÓÒ × Ú Ò ÙÐ × ÒØÖ × ½º Ù ÐÕÙ Ö ÔÖÓ Ð Ñ ­Ù Ó Ñ Ü ÑÓ¸ ÓÒ Ó × Ò Óר Ñ Ò ÑÓ¸ ÔÙ Ö ×ÓÐÚ Ö× Ñ ¹ ÒØ Ð Ñ ØÓ Ó × ÑÔРܺ ¾º Ð ÙÒÓ× ÔÖÓ Ð Ñ × ÔÖÓ Ö Ñ ÓÒ Ð Ò Ð ÔÙ Ò Ö ×ÓÐÚ Ö× Ñ ÒØ ÙÒ Ö ¹ Ô Ø º Ò Ð ÔÖ Ø ¸ ר × Ö ÞÓÒ × ÔÐ ÒØ Ò ÙÒ ÓÑÔÖÓÑ ×Ó Ð Ð ÓÖ ØÑ Ô Ö Ö ×ÓÐÚ Ö ÔÖÓ Ð Ñ × ÓÒ Ö × Ô Ø × × ÓÒ Ö × Ñ × ¬ ÒØ ÕÙ Ð Ð ÔÖÓ Ö Ñ ÓÒ Ð Ò Ð¸ Ô ÖÓ ÒÓ ØÓ Ó ÔÖÓ Ö Ñ Ð Ò Ð ÔÙ ÜÔÖ × Ö× ÓÑÓ ÙÒ Ö Ô Ø º 7.14.2 Redes generalizadas À ר Ð ÔÖ × ÒØ ¸ Ô Ö ØÓ Ó× ÐÓ× ÑÓ ÐÓ× Ö × Ô Ø ×¸ ÑÓ× ×ÙÑ Ó Ð ÓÒ ÓÒ ÓÒ× ÖÚ ÓÒ ­Ù Ó ¬Ò Ò º½¼¹ Ô º º Ê × ÕÙ ÒÓ × Ø × Ò ÕÙ ÐÐ ÓÒ ÓÒ ×ÓÒ ÐÐ Ñ ×¸ Ó ÖØ × Ö ×ØÖ ÓÒ ×¸ Ö × Ò Ö Ð Þ × º Ò Ð × Ö × Ò Ö Ð Þ × ×ÓÒ ÐÓ× Ö Ó× ÔÓ× Ò ÙÒ ØÓÖ Ò Ò ÓÔ Ö ­Ù Óº Ò Ð ÑÓ ÐÓ Ô ØÓÖ Ó¸ ÙÒ ØÓÖ Ò Ò ´Ó Ô Ö µ a ÒØÖ ÙÒ Ö Ó u −→ v × ÜÔÖ × Ñ ÒØ ×Ù Ú ÐÓÖ ÑÙÐØ ÔÐ Ò Ó Ð Ô Ð ÖÓc ac u v Ë a = 1¸ ÒØÓÒ × × ØÖ Ø ÙÒ ÒÓ Ó ÒÓÖÑ Ðº Ë 0 < a < 1¸ ÒØÓÒ × × ØÖ Ø ÙÒ ØÓÖ Ô Ö ÔÓÖ ÑÔÐÓ׸ ÙÒ ­Ù Ó ÓÖÖ ÒØ Ð ØÖ ÕÙ Ô × ÔÓÖ ÙÒ Ö × ×Ø Ò Ó ÙÒ ­Ù Ó Ù ÕÙ ×Ù Ö Ð ÙÒ ÔÖ ÔÓÖ Ú ÔÓÖ ÓÒ ¼ º Ë c > 1¸ ÒØÓÒ ×¸ × ØÖ Ø ÙÒ Ò Ò ­Ù Ó¸ ÐÓ ÕÙ Ò ÙÒ ÔÖ Ñ Ö Ñ Ö ÔÖ × Ñ ÒØ ÑÔÖÓ Ð º Ü ×Ø Ò¸ ÑÔ ÖÓ¸ ×Ó× ÒÓ Ø Ò Ü Ô ÓÒ Ð ×º ÈÓÖ Ñ¹ ÔÐÓ׸ Ö × ÔÓÖ ÓÒ Ö ÙÐ Ò Ô Ø Ð × ÓÒÓÑ Ó× ¸ Ö × ÒØ × ÓÐÓ Ó× ´ º º Ø Ö ×µ¸ Ù × Ð ÒØ ÑÔ Ö ´ÕÙ ÙÑ ÒØ Ò ÔÓÖ ÐÐÙÚ ×µ¸ Ø º ¿ Ê Ù Ö × ÕÙ Ð Ö ÔÙ Ö Ù Ö× ÙÒ ×ÓÐÓ Ù ÒØ Ý ÙÒ ×ÓÐÓ ×ÙÑ ÖÓº Ò Ð ÙÒÓ× ×Ó× ÒÓ × ØÖ Ø Ò × ¼ ÙÒ ØÓÖ Ô Ö ¸ × ÒÓ ÙÒ Ö Ù ÓÒ Ð Ô ¸Ð Ù Ð ÑÓ Ð Þ Ö× Ñ ÒØ ÙÒ ÒÓ Ó ÒØ ÖÑ Ó w a ac u w v
  • 890.
    864 Cap´ ıtulo 7. Grafos ÍÒ ØÓÖ ÖÓ ÒÓ Ø Ò × ÒØ Ó¸ ÔÙ × ÕÙ Ú Ð Ð Ù× Ò Ö Óº ÙÒÕÙ Ñ Ø Ñ Ø Ñ ÒØ ÔÓ× Ð ¸ ÙÒ ØÓÖ Ò Ø ÚÓ Ø ÑÔÓ Ó Ø Ò ÑÙ Ó × ÒØ Ó × Ó¸ ÔÙ × ÑÓ Ð Þ ÙÒ ×Ô Ö ØÖÓ ×Ó ­Ù Ó¸ Ð Ù Ð ÔÖÓ Ð Ñ ÒØ × ÑÓ Ð Þ¹ Ð × Ð Ô Ö×Ô Ø Ú ØÓÔÓÐÓ Ð Ö º Ò Ø ÖÑ ÒÓ ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð¸Ô Ö ÙÒ ÒÓ Ó Ù ÐÕÙ Ö v¸ Ð ÓÒ× ÖÚ ÓÒ Ð ­Ù Ó ÔÙ ÜÔÖ × Ö× ÓÑÓ f(e) − ae f(e) = be ´º µ ∀e∈ÁÆ(v) ∀e∈ÇÍÌ(v) ÆÓØ ÑÓ× ÕÙ Ð ÖÒ ´ º µ ÓÒ Ð ÓÒ× ÖÚ ÓÒ Ð ­Ù Ó ÜÔÖ × Ò ´ º½¼µ ´ º º½¼¹ Ô º µ × ÙÒ ØÓÖ ÑÙÐØ ÔÐ Ø ÚÓ ae Ò Ö Ó eº Ê × Ò Ö ÐÞ × × Ö ×Ù ÐÚ Ò ØÖ Ú × ÙÒ Ð ÓÖ ØÑÓ ÐÐ Ñ Ó × ÑÔÐ Ü Ö ¸ Ð Ù Ð × Ö ÔÖ × ÒØ Ó Ò Ü º½ ´Ô Ò µº 7.14.3 Capacidades acotadas Ò ×Ø Ø ÔÓ Ö Ð ­Ù Ó ÐÓ× Ö Ó× ×Ø ÓØ Ó ×Ø ÓØ Ó ÔÓÖ ÐÓ× ÜØÖ ÑÓ× ÙÒÓ Ñ Ò ÑÓ Ý ÙÒÓ Ñ Ü ÑÓ ×Ø ÙÐØ ÑÓ ÓÖÖ ×ÔÓÒ ÒØ Ð Ô º Ò Ð ÑÓ ÐÓ Ô ØÓÖ Ó¸ Ö Ó ÓÒØ Ò Ó× Ú ÐÓÖ × Ð ­Ù Ó Ñ Ò ÑÓ Ö ÕÙ Ö Ó Ý Ð Ñ Ü ÑÓ Ô ÖÑ Ø Ó¸ ÐÓ× Ù Ð × ×Ù Ð Ò ÓÐÓ Ö× ÒØÖ ÓÖ Ø × Ø Ð ÓÑÓ Ò Ð ¬ ÙÖ º½¼ ¹ º [min, max] min max u v s u v ´ µ Ö Ó ÓÒ ÓØ ­Ù Ó ´ µ ÌÖ Ò× ÓÖÑ ÓÒ ÕÙ Ú Ð ÒØ ÙÖ º½¼ Ö Ó ÓÒ ÓØ × ­Ù Ó Ý ×Ù ØÖ Ò× ÓÖÑ ÓÒ Ä ÓØ Ò Ö ÓÖ ÔÙ ÒØ ÖÔÖ Ø Ö× ÓÑÓ ÙÒ Ñ Ò ­Ù Ó Ò Ð ÒÓ Ó u¸ Ñ ÒØÖ × ÕÙ Ð ×ÙÔ Ö ÓÖ × Ð Ô Ð Ö Óº × ¸ × ÙÒ ÐÓ Ú ×ØÓ Ò Ü º½½º¿ ´Ô Ò ½¼µ¸ ÙÒ Ö Ó ×Ø Ø ÔÓ × ÕÙ Ú Ð ÒØ Ð Ð ¬ ÙÖ º½¼ ¹ º 7.14.4 Redes con restricciones laterales Ò Ð ÙÒ × Ó × ÓÒ × × Ø Ò Ò Ö ×ØÖ ÓÒ × ÓÒ Ð × ÕÙ ÒÚÓÐÙ Ö Ò Ú Ö Ó× ­Ù Ó׺ ËÙ¹ ÔÓÒ ÑÓ׸ ÔÓÖ ÑÔÐÓ¸ ØÖ × Ö Ó× a¸ b¸ c a c b Ý ÓÑÓ Ö ×ØÖ ÓÒ ×Ó Ö Ð ­Ù Ó ÐÐÓ× 2f(a) − f(b) + 3f(c) ≤ 12º ÍÒ Ö ×ØÖ ÓÒ ×Ø Ø ÔÓ × ÒÓÑ Ò Ö ×ØÖ ÓÒ Ð Ø Ö Ð º ÓÒ× Ù ÒØ Ñ ÒØ ¸ Ö × ÓÒ ×Ø Ð × Ö ×ØÖ ÓÒ × × Ø Ð Ò ÓÒ Ö ×ØÖ ÓÒ × Ð Ø Ö Ð × º Ä × Ö ×ØÖ ÓÒ × Ð Ø Ö Ð × ÒÓ Ò × Ö Ñ ÒØ Ø Ò Ò ÕÙ ×Ø Ö Ö Ð ÓÒ × ÐÓ× Ö Ó× ÙÒ ÒÓ Óº ÈÙ Ö ØÖ Ø Ö× ÙÒ Ö ×ØÖ ÓÒ ÒØÖ Ö Ó× ÕÙ ÒÓ ×Ø Ò Ö Ø Ñ ÒØ Ö Ð ÓÒ Ó× ÔÓÖ ÑÔÐÓ¸ × Ô Ö Ó× ÔÓÖ Ð Ñ ÒÓ× m Ö Ó× ×Ø Ò º Ð Ö Ñ ÒØ ¸ Ð × Ö ×ØÖ ÓÒ × Ð Ø Ö Ð × ÒÓ Ò Ò Ò Ð ÑÓ ÐÓ Ö Ô Ø ¸ Ô ÖÓ × Ò Ò ÓÑÓ ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð¸ ÐÓ ÕÙ ÔÙ Ö ×Ù Ö Ö ÕÙ Ð Ö × Ö ×Ù ÐÚ ÓÒ ÙÒ Ñ ØÓ Ó Ð ÔÖÓ Ö Ñ ÓÒ Ð Ò Ðº Ð ÔÖÓ Ð Ñ ÓÒ ×Ø Ò ÓÕÙ × ÕÙ × Ô Ö Ð
  • 891.
    7.14. Redes deflujo y programaci´n lineal o 865 Ò Ò Ò × ÑÔ ÒÓ¸ Ù Ð × ×Ø ÒØ Ñ ÓÖ ÕÙ Ð Ù ÐÕÙ Ö ÐÓ× Ñ ØÓ Ó× Ð ÔÖÓ Ö Ñ ÓÒ Ð Ò Ð¸ ÕÙ × Ø Ò ÓÒ ÙÒ Ð ÓÖ ØÑÓ Ö º È Ö ØÖ Ø Ö ÓÒ Ö ×ØÖ ÓÒ × Ð Ø Ö Ð ×¸ Ð Ö × Ô ÖØ ÓÒ Ò ÐÓÕÙ × ´×Ù ¹ Ö Ó×µ × Ô Ö Ó× ÔÓÖ Ð × Ò ÓÐ × ×Ù× Ö ×ØÖ ÓÒ ×¸ Ñ ÒØ ÙÒ Ñ ØÓ Ó ÐÐ Ñ Ó Ö Ð ÓÒ Ð Ö Ò Ò ½ ¸ Ð Ù Ð ÒÓ × Ö ØÖ Ø Ó Ò ×Ø Ø ÜØÓº Ò ×Ø ×Ó × ÓÒ× ¹ Ö Ò Ó× Ø ÔÓ× ÐÓÕÙ × ÐÓ× ÕÙ ÓÒØ Ò Ò Ö ×ØÖ ÓÒ × Ý ÐÓ× ÕÙ ×ÓÒ Ö × Ô Ø ×º ר ÑÓ Ó¸ ÐÓ× ÐÓÕÙ × ÓÒ Ö ×ØÖ ÓÒ × Ð Ø Ö Ð × × Ö ×Ù ÐÚ Ò ÓÒ Ñ ØÓ Ó× ÔÖÓ¹ Ö Ñ ÓÒ Ð Ò Ð¸ Ñ ÒØÖ × ÕÙ ÐÓ× Ö ÓÒ Ö × ­Ù Óº Ä × ×ÓÐÙ ÓÒ × Ô Ö Ð × × ÓÒ Ø Ò Ò Ø Ö Ø Ú Ñ ÒØ ר ÕÙ ÓÒÚ Ö Òº 7.14.5 Redes multi-flujo À ר Ð ÔÖ × ÒØ ¸ ØÓ Ó× ÐÓ× ÑÓ ÐÓ× Ö Ô Ø ×ÙÑ Ò ÕÙ Ð × ÙÒ × ­Ù Ó¸ Ó × ¸ Ð ­Ù Ó¸ ×ÓÒ Ð × Ñ ×Ñ × ÒØ Ò × ¸ ÔÓÖ ÐÓ× Ö Ó× ´ØÙ Ö ×µ Ö ÙÐ ÙÒ ×ÓÐÓ Ø ÔÓ ­Ù Ó ¾ º À Ý × ØÙ ÓÒ × Ò Ð × ÕÙ ÔÓÖ ÐÓ× Ñ ×ÑÓ× Ö Ó× ÔÙ Ò Ö ÙÐ Ö ×Ø ÒØ × Ð × × ­Ù Ó¸ Ñ Ò Ó× × Ú Ö Ó× Ù ÒØ × Ò Ô Ò ÒØ ׸ Ð Ñ ÒÓ× Ø ÒØÓ× ÓÑÓ ×Ø ÒØÓ× Ø ÔÓ× ­Ù Ó × Ø Ò Òº ÆÓ Ý Ö ×ØÖ ÓÒ ×Ó Ö Ð ÒØ ×ÙÑ ÖÓ׸ Ý Ù ÐÕÙ Ö ×ØÓ× ÔÙ Ö Ö Ù Ð ×ÕÙ Ö ÐÓ× ×Ø ÒØÓ× Ø ÔÓ× ­Ù Óº ÍÒ × ØÙ ÓÒ ØÖ ÓÒ Ð ×Ø Ð × Ö × ÔÖ × ÒØ ÓÒ Ð ÑÓ Ð Ó ØÖ ¬ Ó ÙØÓÑÓØÓÖ Ó Ô ØÓÒ Ðº Ë ÔÙ Ò ÓÒ× Ö Ö¸ ÔÓÖ ÑÔÐÓ¸ Ú Ö × ÞÓÒ × Ó Ö ¬ × z1, z2, . . . , zn ÓÑÓ ÔÖÓÚ ÓÖ × ­Ù Ó ÙØÓÑÓØÓÖº ÙÒ ÖØ ÓÖ Ô Ó ¹Ð × ½¾ÔѸ ÔÓÖ ÑÔÐÓ¹¸ ÐÓ× ÙØÓÑÓÚ Ð × × ×ÔÐ Þ Ò × Ý Ð × ÞÓÒ × Ò Ù ×Ø ÓÒ ØÖ Ú × Ú × ÓÑÔ ÖØ ׺ ÓÑÓ ÔÙ Ò Ö Ö× ¸ Ò ×Ø × ØÙ ÓÒ¸ ÐÓ× ­Ù Ó× Ò Ð ÙÒ ÑÓÑ ÒØÓ × Ò Ù ÒØÖ Òº ÇØÖÓ ÑÔÐÓ× ÐÓ× ÓÒר ØÙÝ Ò ÐÓ× ÔÖÓ Ð Ñ × Ð ØÖ Ò×ÔÓÖØ ´Ü º½¾º º½ ´Ô Ò ¿ µµ Ý Ð ØÖ × ÓÖ Ó ´Ü º½¾º º¾ ´Ô Ò ¿µµ Ò ÐÓ× Ù Ð × × ÔÓ× Ò Ð × Ñ ×Ñ × Ð Ò × Ý ÐÑ Ò ×¸ Ô ÖÓ ×ØÓ× × ÑÔÐ Ò Ô Ö ØÖ Ò×ÔÓÖØ Ö Ý ÐÑ Ò Ö Ú Ö×Ó× Ø ÔÓ× Ò ×º À ר Ð ÔÖ × ÒØ ×ÓÐÓ × ÓÒÓ ÙÒ Ñ Ò Ö ÔÓÐ ÒÓÑ Ð Ö ×ÓÐÚ Ö ×Ø ÔÖÓ Ð Ñ ØÖ Ò× ÓÖÑ ÖÐÓ ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð Ý × ÐÐ ×ÓÐÙ ÓÒ ÖÐÓº Ò Ó × ÓÒ × ÙÒ Ö ÑÙÐØ ¹­Ù Ó ÔÙ Ò Ò ÓÒØÖ Ö× Ð Ô ÞÓ× ´ ÐÓÕÙ ×µ ÙÒ ×ÓÐÓ ­Ù Óº × ¸ Ð Ñ ×Ñ Ñ Ò Ö ÕÙ Ô Ö Ð × Ö × Ò Ö Ð Þ ×¸ Ð Ö ÔÙ Ú Ö× Ò ÐÓÕÙ × × ÙÒ ÐÓ× ×Ø ÒØÓ× Ø ÔÓ× ­Ù Ó¸ Ö ×ÓÐÚ Ö× Ý ÐÙ Ó Ô Ö× ×Ø Ò ÓÒØÖ Ö Ð ×ÓÐÙ ÓÒ ¿ º 7.14.6 Redes de procesamiento ÍÒ Ö ÔÖÓ × Ñ ÒØÓ × ÙÒ Ö Ô Ø ×Ô Ð ÕÙ × ÖÚ Ô Ö ÑÓ Ð Þ Ö Ý ×ØÙ Ö × ×Ø Ñ × ÔÖÓ Ù ÓÒº Ì Ð Ö ÓÒØ Ò Ó× Ð × × ÒÓ Ó׺ ÄÓ× ÒÓÖÑ Ð ×¸ Ò ÐÓ× Ù Ð × × × Ø × Ð ÓÒ× ÖÚ ÓÒ ­Ù Ó Ó ×ÓÒ Ù ÒØ × Ó ×ÙÑ ÖÓ׸ Ý ÐÓ× ½ È Ö Ø ÐÐ × ×Ó Ö ×Ø Ñ ØÓ Ó ÔÙ Ò ÓÒ×ÙÐØ Ö× ¿¸ ¸ ½ º ¾ Ë Ý ×Ø ÒØÓ× ØÙ Ó× Ô Ö Ð × ­Ù Ó¸ ÒØÓÒ × × ÔÙ × Ô Ö Ö Ð ÔÖÓ Ð Ñ Ò Ø ÒØ × Ö × ÓÑÓ Ø ÔÓ× ­Ù Ó× × Ø Ò Òº ר Ù Ð ×Ó Ô Ö Ð ÑÔÐÓ Ð ØÖ Ò×ÔÓÖØ ÔÖ × ÒØ Ó Ò Ü º½¾º º½ ´Ô Ò ¿ µº ¿ Á Ù Ð ÕÙ Ô Ö Ð × Ö × Ò Ö Ð Þ ×¸ Ø Ò × Ô Ö Ö ×ÓÐÚ Ö Ö × ÑÙÐØ ¹­Ù Ó ÔÙ Ò ÓÒ×ÙÐØ Ö× ¿¸ ¸ ½¸ ¾ º
  • 892.
    866 Cap´ ıtulo 7. Grafos ÔÖÓ × Ñ ÒØÓ ¸ Ò Ð × ÒØ Ó ÕÙ ÑÓ Ð Þ Ò ÙÒ ÔÖÓ × Ñ ÒØÓ ÕÙ ÒÓ × Ø × Ð ÓÒ× ÖÚ ÓÒ Ð ­Ù Óº ÈÓÖ ÐÓ Ò Ö Ð¸ ÐÓ× ÒÓ Ó× ÒÓÖÑ Ð × ×Ù Ð Ò ÒÓØ Ö× Ñ ÒØ Ð Ô× × Ý ÐÓ× ÔÖÓ ¹ × Ñ ÒØÓ Ñ ÒØ Ö Ø Ò ÙÐÓ׺ Ä ¬ ÙÖ º½¼ ÑÔÐ ¬ ÙÒ ÔÓØ Ø Ö ÔÖÓ ¹ × Ñ ÒØÓ Ô Ö Ö Ö ÓØ ÐÐ × Ú Ö Ó Ò Ð Ù Ð × ÑÙ ×ØÖ Ò Ó× ÒÓ Ó× ÔÖÓ ¹ × Ñ ÒØÓº Ë Ð Ó ½¾¼¼ ÇÜ ÒÓ ¾ ¼ ÓØ ÐÐ × ½¼ Ù ÖÞÓ ½¾ ËÓÔÐ Ó ÐÓÖ ½¾¼¼ ÀÓÖÒÓ Å Ø ÒÓ ¾¼ C O2 ¿ ¼ Ö ÓÒÓ ½¼¼ ÙÖ º½¼ ÍÒ ÑÔÐÓ Ö ÔÖÓ × Ñ ÒØÓ Ð ÒÓ Ó ÀÓÖÒÓ Ö ÔÖ × ÒØ ÙÒ Ú ÒØÙ Ð ÔÖÓ ×Ó Ò Ð Ù Ð × Ñ Þ Ð × Ð Ó ÓÒ ÓÜ ÒÓ Ô Ö Ó Ø Ò Ö Ù ÖÞÓº ר ÔÖÓ ×Ó¸ ÔÓÖ × ÖÐÓ¸ × Ø × Ö ÙÒ ÓÒ × ÙÒ Ó ¸ ÕÙ ÑÓ Ð Ò ÐÓ× ÔÖÓ Ù ØÓ× Ö ×ÙÐØ ÒØ × ÈÓÖ ÑÔÐÓ׸ Ð ÓÖÒÓ ÔÓ Ö ÑÓ Ð Þ Ö× × C O2 = 3 O2 + 2 C Si O2 = 5 Si + 3 O2 Å ÒØÖ × ÕÙ Ð ×ÓÔÐ Ó × 12 C = 10 ÓØ ÐÐ × =⇒ ÓØ ÐÐ × = 6 C 5 ÍÒ Ö ÔÖÓ × Ñ ÒØÓ × ÙÒ Ö ÓÒ Ö ×ØÖ ÓÒ × Ð Ø Ö Ð ×¸ Ö ×ÓÐÙ Ð ÓÑÓ Ý ÑÓ× ÜÔÐ Óº Ð ÔÓ Ö ÙÒ Ö ÔÖÓ × Ñ ÒØÓ × ×Ù Ú Ö× Ø Ð Ô Ö Ð ÑÓ Ð Þ ÓÒ ÙÒ ÑÙÝ ÑÔÐ Ñ × ×Ø Ñ × Ò Ò Ö Ð ×¸ Ò Ô ÖØ ÙÐ Ö ÑÙ Ó× ÔÖÓ ×Ó× ÓÒ ÖÒ ÒØ × Ð Ö ÓÒ Ò ×º 7.14.6.1 Cadenas de producci´n o ËÙÔÓÒ ÑÓ× Ð ÔÖÓ Ù ÓÒ ÙÒ ÖØÓÒ Ó Ð Ö Ð Þ ÓÒ ÔÐ Ò ÙÒ ÖØÓ × ÖÚ Óº È Ö Ð ÓÖ Ö ÙÒ ÖØ ÒØ Ð Ò¸ × Ö ÕÙ Ö Ò ÓØÖÓ× Ò × Ý × ÖÚ Ó× ÐÓ× Ù Ð ×¸ ×Ù Ú Þ¸ Ø Ñ Ò Ö ÕÙ Ö Ò ÓØÖÓ× Ò × Ý × ÖÚ Ó׺ ÄÓ× Ò × Ý × ÖÚ Ó× ×ÓÒ Ð ÓÖ Ó× ÔÓÖ ÒØ × ÐÐ Ñ Ó× ÔÖÓ Ù ØÓÖ ×º ÍÒ ÔÖÓ Ù ØÓÖ × ÒÓ Ó ÔÖÓ × Ñ ÒØÓ Ð Ø ÔÓ B0 ½ ¼»¾¼ ½ ¼»¿¼ ½ ¼»¾ ¼ P B2 B1 ר ×Ù ¹ Ö Ó ÐÓ ÐÐ Ñ ÑÓ× Ö Ó ÔÖÓ Ù ØÓÖ º Ò ×Ø ×Ó¸ Ò ÙÒ Ð Ô×Ó Ø ÑÔÓ ¬ Ó Ô Ö ØÓ Ó× ÐÓ× ÔÖÓ Ù ØÓÖ ×¸ Ð ÔÖÓ Ù ØÓÖ P Ð ÓÖ ½ ¼ ÙÒ × Ð Ò B2 ÕÙ × Ú Ò ÙÒ ÔÖ Ó ¿¼ ÔÓÖ ÙÒ º È Ö Ö Ö B2¸ Ð ÔÖÓ Ù ØÓÖ P Ö ÕÙ Ö ÐÓ× Ò × B0 Ý B1 Ð × ÒØ × Ý Óר × × Ò Ð Ó× Ò Ð Ö Óº
  • 893.
    7.14. Redes deflujo y programaci´n lineal o 867 × ÔÓ× Ð Ø Ò Ö Ú Ö Ó× ÔÖÓ Ù ØÓÖ × Ð Ñ ×ÑÓ Ò Ò ÐÙ× Ú ¸ ÔÙ Ö Ò Ö ÔÖÓ Ù ¹ ØÓÖ × ÕÙ ¸ ÒØ Ð Ñ ×ÑÓ Ò × Ð ¸ ¬ Ö Ò ÓØÖÓ× ÔÖÓ Ù ØÓÖ × Ò Ð ÙÒÓ× Ò × ÒØÖ ¸ ÐÓ Ù Ð ÔÙ Ö Ö× ¸ ÒØÖ ÓØÖ × Ó× ×¸ ÔÖÓ ×Ó× ×Ø ÒØÓ× Ö ÓÒ Ù ÓÖ Ò Þ ÓÒº Ë ×ØÙ ÑÓ× ÐÓ× Ò × ÒØÖ ¸ ÒØÓÒ × ÔÓ ÑÓ× ÒØ ¬ Ö ×Ù× ÔÖÓ Ù ØÓÖ × Ý Ð ÓÖ Ö ÙÒ Ö Ó ÔÖÓ Ù ØÓÖ Ô Ö ÙÒÓ ÐÐÓ׺ ÈÓ ÑÓ× ÓÒØ ÒÙ Ö ×Ø ÔÖÓ ×Ó Ô Ö ÐÓ× ÒÙ ÚÓ× Ò × ÕÙ Ô Ö Þ Ò ×Ø ÕÙ ¬Ò ÐÑ ÒØ ÒÓ× Ò ÓÒØÖ ÑÓ× ÓÒ Ò × ÔÖ Ñ Ö Ó× × Ö¸ ÕÙ ÐÐÓ× ÐÓ× Ù Ð × ÒÓ × Ð × ÔÙ ÒØ ¬ Ö ÙÒ ÔÖÓ Ù ØÓÖ Ò × ÔÓÖÕÙ ×ÓÒ Ñ Ø Ö ÔÖ Ñ ¸ Ò × ÑÔÓÖØ Ó× Ù ÓØÖ × ØÙ ÓÒº ÄÓ× ÔÖÓ Ù ØÓÖ × Ò ØÓÖÒÓ ÙÒÓ Ó Ñ × Ò × ¬Ò Р׸ × Ý ×Ø ÙÒ Ò Ú Ð ÔÓ× Ð Ý × Ó¸ × ÙÒ × Ð ÒØ Ö ×¸ Ð ÒÓÑ Ò ÑÓ× Ò ÔÖÓ Ù Ø Ú º Ò ×Ø Ö Ó¸ ÕÙ Ö Ð ÓÒ ÔÖÓ Ù ØÓÖ ×¸ ÐÓ× Ö Ó× Ö ÔÖ × ÒØ Ò Ò × Ý ÐÓ× Ô ×Ó× ×Ù× ÒØ × Ý Óר ׺ Ä ¬ ÙÖ º½¼ ÑÙ ×ØÖ ÙÒ ÑÔÐÓ ÔÓØ Ø Ó¸ ÙÝÓ ÜØÖ ÑÓ× ÞÕÙ Ö Ó× Ö ÔÖ × ÒØ Ò ÐÓ× ¹ Py B4 200/450 P7 B6 95/650 B2 450/20 B5 100/450 B2 300/90 P4 B6 300/250 B7 1200/90 B5 400/250 Px P10 B0 750/30 P2 B6 800/550 B2 150/20 B0 1000/30 B4 400/200 P6 P0 B2 180/125 B3 150/20 P5 B5 95/250 B7 400/150 B1 400/40 B3 100/95 B4 200/350 B6 600/350 P1 P8 P9 B7 200/300 B2 550/75 P3 B4 200/350 B3 300/80 ÙÖ º½¼ ÍÒ Ò ÔÖÓ Ù Ø Ú Ò × ÔÖ Ñ Ö Ó× Ý Ö Ó× ÐÓ× Ò × ¬Ò Р׺ Ë ÙÒ Ð Ò ÓÐ Ð × ×Ø Ñ ÔÖÓ Ù Ø ÚÓ¸ ÔÙ Ò Ö ÔÖ × ÒØ Ö Ñ Ø Ö ÔÖ Ñ ´Ñ Ò Ö Ð × × Ó׸ Ù ¸ Ø ºµº Ò ÒÙ ×ØÖÓ Ò Ö Ó ÑÔÐÓ¸ ÐÓ× Ò × ÔÖ Ñ Ö Ó× ×ÓÒ B0 Ý B1¸ Ö ×Ô Ø Ú Ñ ÒØ º ÄÓ× ÜØÖ ÑÓ× ¬Ò Ð × Ö ÔÖ × ÒØ Ò Ð Ò ¬Ò Ð Ó ØÓ ×ØÙ Ó¸ Ð Ù Ð ÒÓÑ Ö ÑÓ× B7º ÄÓ× ÒÓ Ó× Ð Ö Ó Ö ÔÖ × ÒØ Ò ÔÖÓ¹ Ù ØÓÖ × ÔÖÓ Ù ØÓ× ÒØ ÖÑ Ó× ÕÙ ÒØÖ ÐÓ× Ò × ÔÖ Ñ Ö Ó× B0 Ý B1 Ý Ð Ò ¬Ò Ð B7 º È Ö ÔÖ Ò Ö Ð ÑÔÓÖØ Ò ×Ø ÑÔÐÓ Ý¸ ÓÒ Ð¸ Ð Ð × Ö × ÔÖÓ ¹ × Ñ ÒØÓ¸ ÔÐ ÒØ ÑÓ× Ð ÙÒÓ× × Ò Ö Ó× Ò ÐÓ× Ù Ð × Ð × Ò × ÔÖÓ Ù Ø Ú × ÝÙ Ò Ú ×ÐÙÑ Ö Ö Ö ×ÔÙ ×Ø × ¯ ÁÑÔ ØÓ ÕÙ Ø Ò Ö ×Ó Ö Ð ÔÖÓ Ù ÓÒ ÙÒ × ÕÙ × ×ÙÑ ÑÓ׸ ÔÓÖ × ÑÔÐ ¸ ÕÙ Ð × ÕÙ Ø ÔÖÓÔÓÖ ÓÒ ÐÑ ÒØ ØÓ Ó Ð Ø ÖÖ ØÓÖ Ó¸ ÒØÓÒ ×¸ Ü Ñ Ò Ò Ó ÙÒÓ ÐÓ× Ö Ó× ÔÖÓ Ù ØÓÖ × ÓÒ Ö Ó× ÒØÖ Ù ÖÓ׸ ÔÓ ÑÓ× Ö ×Ø Ö Ð ×Ñ ÒÙ ÓÒº ÄÙ Ó Ð ÙÐ ÑÓ× Ð ÑÔ ØÓ ÕÙ ×Ó Ö ÐÓ× Ò × × Ð Ø Ò Ò Ð ÙÒÓ× ÑÙÒ Ó× Ú Ò ÙÐ Ó× Ð ÓÒÓÑ ¸ ÐÓ× ×Ð ÓÒ × Ð × Ò × ÔÖÓ Ù Ø Ú × × Ð × ¬ Ò Ò Ù × ÐØ ׸ Ñ × Ý ×¸ Ò Ô Ö Ö × × ÙÒ Ö Ó ÓÒ ÙÒ × ÖÖ ÖÓ Ý Ð Ò ÔÖÓ Ù Ø Ú Ð Ñ Öº ÐÓ× Ó×ÕÙ × Ñ Ö ÖÓ× × Ò Ù ÒØÖ Ò Ò Ð × Ù × ÐØ × Ð Ö Óº ÄÓ× Ö ÓÐ × × ÓÖØ Ò Ý ÐÓ× ØÖÓÒ Ó× × Ò Ð Ö Ó ÙÝ ÓÖÖ ÒØ ÐÓ× ÖÖ ×ØÖ ×Ø Ð × ÖÖ ÖÓ ÕÙ × Ò Ù ÒØÖ Ò Ð × Ù × Ñ ´Ó ÒØ ÖÑ ×µº Ð × ÖÖ ÖÓ Ö ÐÓ× ØÖÓÒ Ó× Ý ÐÓ× ØÖ Ò× ÓÖÑ Ò ÔÖÓ Ù ØÓ× ÒØ ÖÑ Ó× ´Ø Р׸ ÐÓÕ٠׸ Ø ºµ ÕÙ × ×ØÖ ÙÝ Ò Ú Ö× × Ò Ù×ØÖ × Ø Ð × ÓÑÓ ÐÓ× ×Ø ÐÐ ÖÓ׸ ÑÙ Ð Ö ×¸ ÓÒרÖÙ ØÓÖ × × ×¸ Ø ºº ר Ñ Ø ÓÖ ¸ ÙÒ Ò Ù×Ó¸ ÐÙ×ØÖ Ð ÑÔÓÖØ Ò ÕÙ Ø Ò Ù Ó Ð Ó×ÕÙ Ô Ö ×Ùר ÒØ Ð Ð Ò ÔÖÓ Ù Ø Ú º
  • 894.
    868 Cap´ ıtulo 7. Grafos Ð ×Ñ ÒÙ ÓÒ Ð × ÕÙ º ÔÐ Ò Ó Ð Ö Ø Ö Ó Ý ÔÖÓÔ Ò ÓÐÓ ØÖ Ú × Ð× Ò × ÔÓ ÑÓ× Ü Ñ Ò Ö Ð × ÓÒ× Ù Ò × ÕÙ ÙÒ × ÕÙ Ø Ò ×Ó Ö Ð ÔÖÓ Ù ÓÒ Ò º ¯ Ó ÙÒ Ò ×Ô ¬ Ó¸ Ø ÖÑ Ò Ö Ù Ð × Ð Ò ÒØ ÖÑ Ó Ö Ø Ó Ô Ö ×Ø ÔÖÓ Ð Ñ × ÓÒרÖÙÝ ØÓ Ð Ò ÔÖÓ Ù Ø Ú ØÖ × Ð Ò ÒØ Ö ×º ÄÙ Ó × Ð ÙÐ Ð ÓÖØ Ñ Ò ÑÓ¸ Ð Ù Ð ÖÖÓ ÐÓ× Ö Ó× ÙÝ Ô Ð Ñ Ø Ð ÔÖÓ Ù ÓÒ Ð Ò ÒØ Ö ×º ÄÓ× ÔÖÓ Ù ØÓÖ × Ú Ò ÙÐ Ó× ×ØÓ× Ö Ó× ×ÓÒ ÕÙ ÐÐÓ× ÕÙ Ý ÕÙ Ö ÒØ Þ Ö Ð ÙÑ ÒØÓ Ô Ö ÕÙ ¸ Ò ÙÐØ Ñ Òר Ò ¸ × ÔÙ ÙÑ ÒØ Ö Ð ÔÖÓ Ù ÓÒº ¯ Ë × ÓÒÓ Ö Ù Ð × ÖÙ ÖÓ× Ý ÔÖÓ Ù ØÓÖ × Ý ÕÙ ÔÓÝ Ö Ó ÔÖÓØ Ö Ô Ö ÙÑ Ò¹ Ø Ö Ð ÔÖÓ Ù ÓÒ Ð ÙÒ Ò ×Ô ¬ Ó ÕÙ ¸ Ô ÖØ Ø ÖÑ Ò Ö ÐÓ× ×Ð ÓÒ × Ö Ø Ó׸ ÔÓ ÑÓ× ÔÐ ÒØ Ö ÒÙ ÚÓ× Ñ Ô × ÔÖÓ Ù Ø ÚÓ׺ ÈÓÖ ÑÔÐÓ¸ ÔÓ Ö ÑÓ× × Ñ¹ ÙÐ Ö Ð ÓÒרÖÙ ÓÒ Ö × ÒÙ Ú × Ò × Ö Ø Ó× Ý Ú ÐÙ Ö ×Ù ØÓ Ò Ð ÔÖÓ Ù ÓÒº Ð Ñ ×ÑÓ ÑÓ Ó¸ ÔÓ Ö ÑÓ× ÓÐÓ Ö Ö × Ð Ò ÒØ Ö × Ý Ó × Ö¹ Ú Ö¸ × ÙÒ Ö Ø Ö Ó× ×ØÓ ×Ø Ó× Ó Ø ÖÑ Ò ×Ø × ´ Ð Ð ÓÖ ØÑÓ ­Ù Ó¸ ÔÓÖ ÑÔÐÓµ ÕÙ ×Ù ÓÒ Ð ×Ø Ó Ð ÔÖÓ Ù ÓÒº רÓ× × Ò Ö Ó׸ ÒØÖ ÑÙ Ó× ÓØÖÓ׸ Ö ­ Ò Ð ÑÔÓÖØ Ò Ð × Ö × ÔÖÓ ¹ × Ñ ÒØÓ ÓÑÓ ÓÒ×ÓÐ ÓÒ Ð Ö × ­Ù Ó¸ × ÓÑÓ ×Ù Ú Ö× Ø Ð Ò Ö ÔÖ ¹ × ÒØ ÓÒ Ý ÑÓ Ð Þ Óº 7.15 El simplex para redes de flujo 7.15.1 Conclusi´n sobre el problema del flujo m´ximo a coste m´ o a ınimo Ð ÔÖÓ Ð Ñ Ô Ö Ñ ×Ø × ÓÒ Ø Ò Ó× Ù ÒØ × ×ØÙ Óº Ä ÔÖ Ñ Ö × Ð ÒÚ ×Ø ÓÒ ÓÔ Ö ÓÒ ×¸ Ð × ÙÒ Ð Ð Ð ÓÖ ØÑ º Ð ÒÚ ×Ø ÓÒ ÓÔ Ö ÓÒ × Ø Ò ÑÓ× Ð ÔÖÓ Ð Ñ Ò Ö Ó ÓÔØ Ñ Þ ÓÒ ÓÖÑÙÐ Ó Ò Ü º½¿ ´Ô Ò ¼µ Ý ×Ù× Ñ ØÓ Ó× Ö ×ÓÐÙ ÓÒ ÒØÖ ÐÐÓ× Ð × Ñ¹ ÔÐ Ü ´Ü º½¿º ´Ô Ò µµº ר Ú ÖØ ÒØ Ò Ó Ð Ô Ò× Ñ ÒØÓ Ñ ØÖ Ð Ý ÓÑ ØÖ Óº ÙÖ ÒØ ÐÓ× ÒÓ× ¼ Ý ¼ Ð × ÐÓ ¸ Ð ÒÚ ×Ø ÓÒ ÓÔ Ö ÓÒ × ØÓÑÓ Ð Ø ÓÖ Ö Ó× ÓÑÓ ÙÒ Ú ÙÐÓ ÑÓ Ð Þ ÓÒº Ô ÖØ Ö ÒØÓÒ ×¸ × Ò × Ù ÖØÓ ÓÒ Ü ÓÒ × ÒØ Ñ × ÒØÖ Ñ Ó× ÑÙÒ Ó׺ Ä Ö Ò Ú ÒØ Ð ÒÚ ×Ø ÓÒ ÓÔ Ö ÓÒ × × ×Ù ÒÓÖÑ ÜÔ Ö Ò Ò ÑÓ ÐÓ× Ò Ö Ó× ÔÖÓ Ð Ñ × Ý ×Ù Ñ Ô Ó × ØÙ ÓÒ × Ð Ú Ö Ð ÐÓ× ÔÖÓ Ð Ñ × ØÖ Ò×¹ ÔÓÖØ ´Ü º½¾º º½ ´Ô Ò ¿ µµ¸ ØÖ × ÓÖ Ó ´Ü º½¾º º¾ ´Ô Ò ¿µµ Ý × Ò ÓÒ ØÖ Ó× ´Ü º½¾º º¿ ´Ô Ò µµ¸ ÓÖÑÙÐ Ó× × Ð ÒÚ ×Ø ÓÒ ÓÔ Ö ÓÒ ×¸ ר ÒØ Ö Ð ×Ø × Ò Ð ÑÙÒ Ó ÔÖÓ Ù Ø ÚÓ¸ ×ÓÒ ÔÐ Ð × ÑÙ × ÓØÖ × × ØÙ ÓÒ ×º ѹ Ó× ÔÖÓ Ð Ñ × Ù ÖÓÒ ÔÐ ÒØ Ó× Ò Ø ÖÑ ÒÓ× Ñ ØÖ × Ý Ö Ó׺ Å × Ò Ö Ð ÓÑÓ Ð ÑÓÑ ÒØÓ Ö ÓÒ Ð × ÔÖ × ÒØ × Ð Ò ×¸ Î Ò ÞÙ Ð × Ò Ù ÒØÖ Ò ÙÒ × Ú Ö × ÕÙ ÕÙ Ø Ó ÒÓØ Ð Ñ ÒØ Ð ×ÙÑ Ò ×ØÖÓ Ð ØÖ Ó¸ Ð Ù Ð × Ò Ö Ó ÔÓÖ Ù ÒØ × ÖÓ Ð ØÖ × Ò ÙÒ ¿±º ÓÒ× Ù ÒØ Ñ ÒØ ¸ ÔÖ Ø Ñ ÒØ ØÓ Ð ÔÖÓ Ù ÓÒ × Ó Ø º Ò ×Ø × ÒØ Ó¸ ÔÓ Ö ÑÓ× Ú ×ÐÙÑ Ö Ö × Ò Ö Ó× ÙØÙÖÓ× × ÕÙ ¸ Ó ÑÔ ØÓ× Ù× Ö ÓØÖ × Ù ÒØ × ÐØ ÖÒ Ø Ú × Ò Ö ¸ ØÓÑ Ò Ó Ð Ð ØÖ ÓÑÓ ÙÒ Ò ÒØÖ ÐÓ× ÔÖÓ Ù ØÓÖ ×º
  • 895.
    7.16. Notas bibliogr´ficas a 869 ÔÖÓ Ð Ñ × Ð ÔÖÓ Ö Ñ ÓÒ Ð Ò Ð ´Ü º½¿ ´Ô Ò ¼µµ¸ Ô ÖÓ ×Ø ×ÓÐÓ ÙÒ ÓÒ ÙÒØÓ × Ö ÔÖ × ÒØ Ð ¹Ý Ö ×ÓÐÙ Ð ¹ ÓÒ Ö Ó׺ ÈÓÖ ×Ù ÑÔÐ ÜÔ Ö Ò ¸ ÙÒ ÙØ ÒØ Ó ÒÚ ×Ø ÓÖ ÓÔ Ö ÓÒ × × ÙÒ ×Ù ØÓ ÓÒ×ÙÐØ Ö Ù Ò Ó × ×Ø ÑÓ Ð Þ Ò Ó ÙÒ ÔÖÓ Ð Ñ º È ÖÓ Ð ÓÑÔÙØ ר Ø Ñ Ò × ÓØÖÓ ×Ù ØÓ Ð ÕÙ Ð ÒÚ ×Ø ÓÖ ÓÔ Ö ÓÒ × ÓÒ×ÙÐØ Ö Ð ÓÖ Ö Ð Þ ÓÒ Ð ÑÓ ÐÓº ÆÓ × ÓÑÙÒ Ò ÓÒØÖ Ö ÙÒ Ô Ö×ÓÒ ÕÙ ÓÒÓÞ Ý ÓÑÔÖ Ò ÐÑ ÒØ ÐÓ× Ó× ÑÙÒ Ó׺ È ÖÓ Ð ÑÓ ÐÓ ÓÖ ÒØ Ó Ö Ó׸ ØÖ Ú × Ð Ö Ô Ø ¸ Ø Ò ×Ó Ö × Ú ÒØ × ×Ó Ö Ð ÔÖÓ Ö Ñ ÓÒ Ð Ò Ðº Ä ÔÖ Ñ Ö ÐÐ × × Ð Ö Ô Þ Ð ÓÖ ØÑ ¸ Ð Ù Ð Ô Ö Ò Ð Ó Ø Ò ÓÒ Ñ × Ð Ö Ö ×ÙÐØ Ó× Ö ×Ô ØÓ ÐÓ× Ò ÓÕÙ × Ð ÔÖÓ Ö Ñ ÓÒ Ð Ò Ðº Ä ×Ù ¹× ÓÒ Ü º½ º½ ´Ô Ò ¾µ ÑÙ ×ØÖ Ð Ñ Ò Ö Ò Ö Ð ÒØ ÖÔÖ Ø Ö ÙÒ Ö Ô Ø ÓÑÓ ÙÒ ÔÖÓ Ö Ñ Ð Ò Ðº Ú Þ ÕÙ × ÔÙ ÒØ ¬ Ö ×Ø ÓÖÖ ×ÔÓÒ Ò × ÔÖ Ö Ð Ð ÑÓ ÐÓ Ö Ð ÔÖÓ Ö Ñ Ð Ò Ð ÔÓÖ Ð × Ò ÐÐ Ö ÞÓÒ ÕÙ ÐÓ× ÓÖ Ò × Ù ÓÒ Ð × Ö × ­Ù Ó ×Ø Ò ÐÖ ÓÖ ÙÒ ÓÖ Ò Ñ Ò ØÙ ×ÙÔ Ö ÓÖ ÐÓ× Ð ÔÖÓ Ö Ñ ÓÒ Ð Ò Ðº Ä × ÙÒ Ú ÒØ × ÕÙ Ð Ö Ø Ö Ö ¬ Ó Ð×Ö × Ô Ø × Ñ × Ð Ý ÔÖ Ò× Ð ¸ Ô Ö Ð Ñ ÝÓÖ Ð × Ô Ö×ÓÒ × ÕÙ ÒÓ Ø Ò Ò Ù ÖØ ÓÖÑ ÓÒ Ñ Ø Ñ Ø Ý ×ØÖ Ø ¸ Ð ÑÓ Ð Þ ÓÒ ÒØ ÖÔÖ Ø ÓÒ × ØÙ ÓÒ × Ð ÑÙÒ Ó Ö Ðº ×ÔÙ × ØÓ Ó¸ Ò ÕÙ Ò ×Ø ÑÙÒ Ó ÔÓ×ÑÓ ÖÒÓ ×Ø ÓÑ Ò Ó ÔÓÖ ÐÓ Ú ×٠к Ò ÐÑ ÒØ ¸ Ò Ð × Ö × Ô Ø × Ý ÙÒ Ñ Ñ × ÑÔÐ ÓÑ Ò ÓÒ × Ð ÓÖ ØÑÓ׸ ÐÓ ÕÙ ÒÓ× ÔÖÓÔÓÖ ÓÒ ÙÒ ÓÐ ÙÖ ÑÔÓÖØ ÒØ ¸ Ð ÓÖ Ñ ÓÖ Ö ÐÓ× Ø ÑÔÓ× Ù ÓÒº ÈÓÖ ÓØÖ Ô ÖØ ¸ Ø Ñ Ò ÑÓ× Ú ×ØÓ Ð ÔÐ Ð Ð × Ö × Ô Ø × ÓØÖÓ× ÔÖÓ Ð Ñ × Ñ × Ô ÖØ Ò ÒØ × Ð ÑÙÒ Ó ÐÓ× Ö Ó׺ Ð ÔÖÓ Ð Ñ Ð Ñ ÒÓ Ñ Ò ÑÓ ÒØÖ ÙÒ Ô Ö ÒÓ Ó׸ Ø Ú Ñ ÒØ ØÖ Ø Ó Ò Ü º ´Ô Ò ½¼µ¸ Ø Ñ Ò ÔÙ Ö ×ÓÐÚ Ö× Ñ ÒØ Ö × Ô Ø × ´Ü º½¾º º ´Ô Ò µµº È Ö Ó Ó ÙÖÖ ÓÒ ÐÓ× ÔÙÒØÓ× ÓÖØ ×ØÙ Ó× Ò Ü º º½ ´Ô Ò ¿ µ Ý Ð ÓÖØ Ñ Ò ÑÓ Ñ Ò ÑÓ Óר ¸ ÒÓ ×ØÙ Ó ÜÔÐ Ø Ñ ÒØ ¸ Ô ÖÓ Ù Ð Ô ÖØ Ö Ü º½½º º¿ ´Ô Ò ¾¿µº Ò ÖØ ÓÖÑ ¸ Ð ÑÓ ÐÓ Ö Ô Ø × ÐÓ× Ö Ó׸ Ý ÕÙ Þ Ð ÔÖÓ Ö Ñ ÓÒ Ð Ò Ð¸ ÐÓ ÕÙ Ð ØÖ Ò× ÓÖÑ Ä ÔÐ × Ð Ð ÙÐÓ Ö Ò Ð ÓØÖ Ô Ö×Ô Ø Ú ÒØ ÖÔÖ Ø Ö ÙÒ ÔÖÓ Ð Ñ ¸ Ô Ö Ð Ù Ð¸ Ò ÖØ × × ØÙ ÓÒ ×¸ × Ñ × × ÑÔÐ Ò ÓÒØÖ Ö ×ÓÐÙ ÓÒ ×º 7.16 Notas bibliogr´ficas a ÍÒ Ö Ó¸ ÓÑÓ ÐÓ× ×ØÙ ÑÓ× Ò ×Ø Ø ÜØÓ¸ ÓÒ ÓÖÑ ÙÒ Ö ÔÖ × ÒØ ÓÒ¸ Ö ¬ Ñ ÒØ ÓÖ ÒØ ¸ ÙÒ Ö Ð ÓÒ Ö Ø ¸ Ó × ¸ Ð Ó ÔÖ × ÒØ ¸ Ð Ú Ö Ð¸ Ø Ð ÓÑÓ ÙÒ Ñ Ô ¸ Ó ÙÒ Ö ÔÖ × ÒØ ÓÒ ÙÒ ×ØÖ ÓÒ¸ Ø Ð ÓÑÓ ÙÒ Ö Ð ÓÒ Ñ Ø Ñ Ø º × ¸ ÐÓ× Ö Ó× ×ÓÒ Ò Ö ÒØ × Ð ÓÒÓ Ñ ÒØÓ ÙÑ ÒÓº Ð ÙÒ ÓÖÑ Ù ÓØÖ ×Ø Ò ÔÖ × ÒØ × × Ø ÑÔÓ× ÒÑ ÑÓÖ Ð × ÔÖ Ø Ñ ÒØ × ÐÓ× Ð ÓÖ × Ð × Ö ÙÑ ÒÓº ÈÙ ×ØÓ ÕÙ Ð Ö Ó × Ô ÖØ Ð ÖÚÓ ÙÑ ÒÓ × Ø ÑÔÓ× Ñ Ð Ò Ö Ó׸ ÒÓ Ô Ö Ù×ØÓ ØÖ Ù ÖÐ Ð ÙÒ ÙØÓÖ Ô ÖØ ÙÐ Ö Ó Ò Ú Ù Ðº Ë Ò × Ù ÖØÓ Ñ Ô × ÐÓÒ Ó× ÕÙ × Ö ÑÓÒØ Ò Ð ¾¿¼¼ º º × ÕÙ ÔÖÓ Ð ¹ Ñ ÒØ ÔÖÓ Ð Ñ × ÓÑÓ Ð Ð ÖÙØ Ñ × ÓÖØ ÒØÖ Ó× × Ø Ó× Ò × Ó ÔÐ ÒØ Ó× Ò ×Ø ÒØÓ× Ø ÑÔÓ׸ Ò ÐÙ Ö × Ö ÒØ ׸ ÔÓÖ Ú Ö× × ÙÐØÙÖ ×º ÓÖ Ò¸ × Ò ÔÖ Ø Ò× ÓÒ Ñ Ö ØÓ¸ Ð ×ØÓÖ Ó¬ Ð ÐÓ× Ö Ó× × Ö ÑÓÒØ Ð ÔÖ Ñ Ö Ý Ð Ö ÖØ ÙÐÓ ÒØ ¬ Ó × Ö ØÓ ÔÓÖ Ð Ñ Ø Ñ Ø Ó ×Ù ÞÓ Ä ÓÒ Ö ÙÐ Ö Ý
  • 896.
    870 Cap´ ıtulo 7. Grafos ×Ù ×ØÙ Ó ×Ó Ö ÙÒ ÔÖÓ Ð Ñ Ø ÒÓ ÓÒÓ Ó ÓÑÓ ÐÓ× ÈÙ ÒØ × ÃÓÒ × Ö º ÈÓÖ ×Ø Ù Ô × Ð Ö Ó ÈÖ Ð¸ Ð Ù Ð Ü ×Ø Ò Ó× ×Ð × ÒÑ Ö × Ò Ð Ô Ö Ñ ØÖÓ Ð Ù º × Ð ×Ö Ö × Ð × ×Ð × Ý ÒØÖ ÐÐ × × Ù ÒØ Ò × Ø ÔÙ ÒØ × ×ØÖ Ù Ó× Ð × Ù ÒØ Ñ Ò Ö ÄÓ× Ø ÒÓ× × ÔÖ ÙÒØ Ò × Ð ÙÒ Ñ Ò Ö Ö ÓÖÖ Ö ØÓ Ó× ÐÓ× ÔÙ ÒØ × Ü ¹ Ø Ñ ÒØ ÙÒ Ú Þ × Ö¸ × Ò Ô × Ö Ó× Ú × ÔÓÖ Ð Ñ ×ÑÓ ÔÙ ÒØ º ÙÐ Ö ÑÓ Ð ÞÓ Ð ×ÙÒØÓ Ñ ÒØ Ð × Ù ÒØ Ö Ó ¸ Ý × Ö Ó Ð Ñ Ò Ö Ò Ö Ð Ö ×ÓÐÚ Ö Ð ÔÖÓ Ð Ñ ¸ Ù Ð × ÓÝ ÓÒÓ Ó Ð ÖÓØÙÐÓ ÐÓ ÙÐ Ö ÒÓ º × ÒØÓÒ ×¸ ÙÐ Ö ÐÓ ÓÒ× Ö Ò ÓÑÓ Ð ÔÖ ÙÖ×ÓÖ Ð Ø ÓÖ Ö Ó× Ó¸ Ñ × Ùר Ñ ÒØ ¸ Ð ØÓÔÓÐÓ º Æ Ø ÚÓ ÃÓÒ × Ö Ù Ùר Ú ÊÓ ÖØ Ã Ö Ó« ÕÙ Ò¸ Ø ÒÓÖ Ð × ÓÖÖ ÒØ × Ý ÚÓÐØ × Ò Ö × Ð ØÖ ׸ ÔÐ ÒØ Ó ÕÙ ½º Ä ×ÙÑ Ð × ÓÖÖ ÒØ × ×Ó × ÐÓ× Ö Ó× Ò ÒØ × ÙÒ ÒÓ Ó × ÖÓ¸ Ý ¾º Ä ×ÙÑ ÐÓ× ÚÓÐØ × ×Ó Ó× Ù ÐÕÙ Ö ÐÓ × ÖÓº À ÕÙ ÙÒ Ö Ñ Ò × Ò ÓÒ Ð ÓÒ ÓÒ ÓÒ× ÖÚ ÓÒ ­Ù Ó ´ º½¼µ ´Ô º µ Ý Ð Ø ÓÖ Ñ º½ ´Ô º ½ µ Ð × ÓÑÔÓ× ÓÒ ­Ù Ó ÔÖ × ÒØ Ó Ò Ü º½½º º ÄÓ× Ö ÓÖÖ Ó× ÖÕÙ Ø Ô Ó× ×Ó Ö Ö Ó׸ ÔÖÓ ÙÒ Ý ÑÔÐ ØÙ ¸ Ù ÖÓÒ Ö ÔÓÖ¹ Ø Ó× ÔÓÖ ÔÖ Ñ Ö Ú Þ ÔÓÖ ÊÓ ÖØº º Ì Ö Ò ¿ º Ð ÔÖÓ Ð Ñ Ð Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ × ÓÒÓ × ÐÓ× ÒÓ× ¾¼ Ð × ÐÓ º ÓÖÙÚ Ö ÔÓÖØÓ ÙÒ ÔÖ Ñ Ö ×ÓÐÙ ÓÒ Ò ½ ¾ ݸ ÔÖ Ø Ñ ÒØ ¸ Ð ÓÝ ÓÒÓ Ó Ð Ó¹ Ö ØÑÓ ÈÖ Ñ Ù × Ù ÖØÓ Ø Ñ Ò¸ Ý Ú Ö × × ÒØ ׸ ÔÓÖ Â ÖÒ ¾½ º ÓÑÓ Ý ÐÓ ÑÓ× Ò Ó¸ Ð × Ö × ­Ù Ó Ù ÖÓÒ ÔÖ × ÔÓÖ ÐÓ× ØÖ Ó× Ã Ö Ó«º Ò ×Ø Ø Ñ Ö ×ÙÐØ ÒØ Ö × ÒØ ÓÒ× Ö Ö Ð ÔÖ ×Ñ ÙÐØÙÖ Ðº Ò ÓÒØÖ Ö Ñ ÒÓ× ÙÑ ÒØÓ ÒÓ ×ÓÐÓ × Ò × Ö Ó Ô Ö Ñ Ü Ñ Þ Ö ­Ù Ó¸ × ÒÓ¸ Ø Ñ Ò¸ Ô Ö ×ÙÔÐ Ö ÙÒ Ñ Ò ­Ù Ó Ô ØÖÓÐ Ó Ò ÙÒ ÒØÖ Ò Ö ÓÐ Ó Ù ØÓ׺ Ð Ø ÓÖ Ñ Ð ÓÖØ Ñ Ò ÑÓ ×ØÙ Ó Ò Ü º½¼º ´Ô Ò µ¸ Ù Ð Ó Ô ÐÓ× ×Ù × ÚÓ× Ð ÓÖ ØÑÓ× Ñ Ü Ñ Þ ÓÒ × Ó× Ò Ñ ÒÓ ÙÑ ÒØÓ¸ Ù ÔÖ × ÒØ Ó Ò Ô Ò ÒØ Ñ ÒØ ¸ Ò Ð Ñ ×ÑÓ ÒÓ¸ ÔÓÖ ÓÖ Ý ÙÐ Ö×ÓÒ ½¿ Ý ÔÓÖ Ð ×¸ Òר Ò Ý Ë ÒÒÓÒ º ÈÓ×¹ Ø Ö ÓÖÑ ÒØ ¸ ÑÓÒ × Ý Ã ÖÔ ÑÓ×ØÖ ÖÓÒ ÙÒ Ñ ÓÖ ×Ù ×Ø Ò Ð ÐÓ× Ð ÓÖ ØÑÓ× ÔÖ Ñ Ò Ó Ð Ù×ÕÙ Ò ÑÔÐ ØÙ Ô Ö Ò ÓÒØÖ Ö Ñ ÒÓ× ÙÑ ÒØÓº ÈÓÖ ÓØÖÓ Ð Ó¸ ÐÓ× Ð ÓÖ ØÑÓ× ÔÖ ¹­Ù Ó Ù ÖÓÒ ÔÖ Ó× ÔÓÖ Ð ØÖ Ó Ã ÖÞ ÒÓÚ ¾ º Ð ÔÖ ¹­Ù Ó
  • 897.
    7.17. Ejercicios 871 Ø Ò Ñ × × ÒØ Ó Ô Ö Ñ Ü Ñ Þ Ö ÙÒ ­Ù Ó Ò ÙÒ Ö ÓÒ Ð Ú × Ó× Ð ­Ù Ó × ÑÙÝ ÐÓ Ù Ð × Ð ×Ó Ð Ù Ý ÐÓ× × ×Ø Ñ × Ö Óº ËÓ Ö Ð × Ö × ­Ù Ó Ý Ð ÖÓ× ÑÔÓÖØ ÒØ ׸ Ý Ò Ó × Ð × Ó× ÓÔØ Ñ Þ ÓÒ ÓÑ Ò ØÓÖ ÓÑÓ Ð Ä ÛÐ Ö ¾ Ó Ð È Ô Ñ ØÖ ÓÙ Ý ËØ Ð ØÞ ¿½ ר ÓØÖÓ× Ñ × Ö ¹ ÒØ × ÓÑÓ Ð ÃÓÖØ Ý ÎÝ Ò ¾ ¸ Ð Ê Ó ¿¾ Ý Ð ÆÓ Ð ÏÖ Ø ¿¼ º Ì Ñ Ò Ý Ø Ü¹ ØÓ× ×Ô Ð Þ Ó× Ò Ð × Ö × ­Ù Ó ÐÓ Ñ × ÒÓØ Ð ×ÓÒ Ð Ù ¸ Å Ò ÒØ Ý ÇÖÐ Ò ½ Ý Ð Þ Ö ¸  ÖÚ × Ý Ë Ö Ð ¿ º ÈÙ Ö× ÕÙ Ð ÔÖÓ Ö Ñ ÓÒ Ð Ò Ð¸ Ý ×Ù Ð Ö Ñ ØÓ Ó × ÑÔРܸ ¬ ÙÖ Ò ÒØÖ ÐÓ× × Ù Ö Ñ ÒØÓ× Ñ × ÑÔÓÖØ ÒØ × Ð × ÐÓ º ØÙ ÐÑ ÒØ ¸ ÒÓ Ü ×Ø ÓÖ Ò Þ ÓÒ × Ö ÕÙ ÒÓ Ö Ø ×Ù× Óר × ÔÖÓ Ù ÓÒ¸ ר ÓÒ¸ × ÖÚ Ó¸ Ø º¸ Ñ ÒØ Ð ÑÔÐ Ó Ý Ö ×ÓÐÙ ÓÒ ÑÓ ÐÓ× ÔÖÓ Ö Ñ ÓÒ Ð Ò Ðº Ò × × ÒØ Ó¸ Ð Ð ÓÖ ØÑÓ × ÑÔРܸ Ú ×ÐÙÑ Ö Ó ¬Ò Ð × ÐÓ× ÒÓ× ¿¼ Ð × ÐÓ ¸ ¬Ò Ð Ý ÓÖÑ ÐÑ ÒØ ÔÙ Ð Ó Ò ½ ¸ ÒÓ ×ÓÐÓ ÙÒ × ÙÒÓ ÐÓ× ÔÖ Ò Ô Ð × Ð ÓÖ ØÑÓ× Ð ÔÖÓ Ö Ñ ÓÒ Ð Ò Ð¸ × ÒÓ ÕÙ × Ò Ù ÒØÖ ÒØÖ ÐÓ× Þ Ð ÓÖ ØÑÓ× Ñ × ÑÔÓÖØ ÒØ × Ð × ÐÓ ¿ º Ð ½ ¸ Ð Ñ Ø Ñ Ø Ó ÖÙ×Ó Ä ÓÒ Ã Ý Ò ÔÙ Ð Ó ÙÒ ÒÙ ÚÓ Ñ ØÓ Ó ×ÓÐÙ ÓÒ ÙÝÓ Ø ÑÔÓ × ÔÓÐ ÒÓÑ Ð ¾ º ËÙ ØÖ Ó × ÙÒ ØÓ Ñ Ø Ñ Ø Ó ÕÙ Ó Ò Ó ÙÒ Ñ Ð ÓÖ ØÑÓ× ÒÓÑ Ò Ó× ÔÙÒØÓ× ÒØ ÖÒÓ× × Ù ÖØÓ× ÔÓÖ Æ Ö Ò Ö Ã ÖÑ Ö Ö Ò ½ ¾¿ º Ò ÔÖÓ Ö Ñ ÓÒ Ð Ò Ð × Ò Ù ÒØÖ Ò ÑÙÝ Ù ÒÓ× Ý ÑÓ ÖÒÓ× Ø ÜØÓ׸ Ð ÙÒÓ× ÐÐÓ× ÔÖ Ú Ñ ÒØ Ø Ó× ¿¼¸ ¾ ¸ ¿¾¸ ¿ Ý ÓØÖÓ× Ñ × ×Ô Ð Þ Ó× ÒØÖ ÐÓ× Ù Ð × ÒÓØ Ö Ð ÄÙ Ò Ö Ö Ý ¾ º ËÓ Ö Ö Ó× Ò Ò Ö Ð¸ Ñ Ò ×Ø Ö Ñ Ò ÓÒ Ö Ð Ð × Ó Ø ÓÖ Ó¸ ÙÒÕÙ Ý ÓÐ ÒØ ÐØ × Ù Ö Ñ ÒØÓ× ÑÔÓÖØ ÒØ ׸ À Ö ÖÝ ½ º Ð ×Ø ÔÙ Ð ÓÒ¸ Ò Ð ÖØ ÖÓ ×Ø ×Ù× Ö ØÓ¸ Ð Ñ ÓÖ Ø ÜØÓ Ø ÓÖ Ó ×Ó Ö Ö Ó× × Ð Ø ÜØÓ ÂÙÒ ¹ Ò Ð ¾¾ º ÍÒ Ü Ð ÒØ Ø ÜØÓ¸ ÒØÖ ÐÓ Ø ÓÖ Ó Ý ÐÓ ÒרÖÙÑ ÒØ Ð ÐÓ ÓÒר ØÙÝ Ð Ð ÖÓ ÖÓ×× Ý ÐÐ Ò ¿ º È Ö Ø ÜØÓ× ÒרÖÙÑ ÒØ Ð × ´ Ð ÓÖ ØÑ Ó×µ ÙÒ Ü Ð ÒØ Ð ÖÓ × Ð ÐÒ ÓÒ× ½ ݸ Ñ × Ö ÒØ Ñ ÒØ ¸ Ð Ë Û ¿¿ º Ð ÙÒÓ× ÐÓ× Ö Ó× ÑÓ×ØÖ Ó× Ò ×Ø Ø ÜØÓ Ù ÖÓÒ Ù Ó× Ñ ÒØ Ð ÑÙÝ Ù Ò Ù ÓÖ Graphviz ½¼ ÔÓÖ ÑÔÐÓ׸ ÐÓ× Ð × ¬ ÙÖ × º ¸ º ¸ º ¸ º ¸ º ¸ º ¸ º ¼¸ º ½¸ º ¾¸ º ¿¸ º ¸ º ¸ º ¸ º Ý º ¸ ÒØÖ ÓØÖ × Ñ ×º Ë Ò Ñ Ö Ó¸ Ô Ö ÓØÖÓ× Ö Ó× × ÑÔÐ Ó ÙÒ ÔÖÓ Ö Ñ Ù Ó × ÖÖÓÐÐ Ó ÔÓÖ ×Ø Ö ØÓÖ Ý ÒÓÑ Ò Ó ÒÐ Ð ÓØ graphpic Ñ ÒØ Ð × Ù ÖÓÒ ¬ ÙÖ × ÓÑÓ º ¸ º ¸ º ¸ º ¸ º ¸ º ¸ º ½¸ º ¾¸ º ¿¸ º ¸ º ¸ º ¸ º ¼ º ¸ º½¼º½¿º ¸ º½¼º½¿º ¸ º½¼º½¿º ¸ º ¼¸ º½¼º½¿º Ý º ½¸ Ø Ñ Ò ÒØÖ ÓØÖ × Ñ × Ù × Ñ ÒØ ר ÔÖÓ Ö Ñ º Ò Ð × ÖÖÓÐÐÓ graphpic¸ Ð Ð ÖÓ ÃÓÞÓ ËÙ Ý Ñ ¿ Ù ÑÙÝ ÙØ к ÇØÖÓ Ø ÜØÓ Ð Ö ×Ô ØÓ × Ð ØØ ר ¸ ׸ Ì Ñ ×× Ý ÌÓÐÐ × ¾ º 7.17 Ejercicios ½º Ù ÒØ × Ð ÒØ Ñ ÜÑ Ö Ó× ÕÙ ÔÙ Ø Ò Ö ÙÒ Ö Ó ¾º Ù ÒØ × Ð ÒØ Ñ ÜÑ Ö Ó× ÕÙ ÔÙ Ø Ò Ö ÙÒ Ö Ó ¿º È Ö Ð × Ù ÒØ Ö Ó
  • 898.
    872 Cap´ ıtulo 7. Grafos J B E G A F I D C H ´ µ Ø ÖÑ Ò Ý Ù ÙÒ Ö ÓÐ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ Ô ÖØ Ö Ð ÒÓ Ó Aº ´ µ Ø ÖÑ Ò Ý Ù ÙÒ Ö ÓÐ Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ Ô ÖØ Ö Ð ÒÓ Ó Aº ´ µ Ø ÖÑ Ò Ý Ù ÙÒ Ö ÓÐ Ö ÓÖ Ô ÖØ Ö Ð ÒÓ Ó Fº ´ µ Ò Ù ÒØÖ Ð ´Ó ÐÓ× µ Ñ ÒÓ´×µ Ñ × Ð Ö Ó´×µº ´ µ Ò Ù ÒØÖ Ð Ö Ó ÓÑÔÐ Ñ ÒØÓº ´ µ Ò Ù ÒØÖ ØÓ Ó× ÐÓ× Ð ÕÙ × Ó ×Ù Ö Ó× ÓÑÔÐ ØÓ׺ º ÈÐ ÒØ ×Ú ÒØ × ÐÓ× Ö Ñ × × Ø Ð × Ô Ö ÜÔÖ × Ö Ö Ð ÓÒ × Ò Ö ×º ÈÖ ÔÐ ÒØ Ñ ÒØÓ¸ ר Ð Þ Ð Ö Ò ÓÒ ÙÒ Ö Óº º × Ò ÙÒ ÖÙØ Ò ÕÙ Ö Ð Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ × Ò ÙØ Ð Þ Ö Ö ÙÖ× ÓÒº º × Ò Ð ÔÖ Ñ Ø Ú test for cycle()¸ ÔÖ × ÒØ Ò Ü º º ´Ô Ò ½ µ¸ × Ò ÙÒ ÜÔÐÓÖ ÓÒ Ò ÑÔÐ ØÙ º º × Ò Ð ÔÖ Ñ Ø Ú test for cycle(g, node, len) Ð Ù Ð Ö ØÓÖÒ true × Ü ×Ø ÙÒ ÐÓ Ò Ð ÒÓ Ó node ÙÝ ÐÓÒ ØÙ × Ü Ø Ñ ÒØ len Ö Ó׺ º ÓÑÓ ÔÙ ×Ô ¬ Ö× ÙÒ Ñ ÒÓ Ò ÙÒ Ö Ó Ó Ö Ó ØÖ Ú × ×Ù× Ö Ó× Ù Ò Ó ×ØÓ× ÒÓ ×Ø Ò Ø ÕÙ Ø Ó× º ÈÐ ÒØ ÙÒ Ð ÓÖ ØÑÓ Ù ÖÞ ÖÙØ ÕÙ Ú Ö ¬ÕÙ × Ó× Ö Ó× ×ÓÒ Ó ÒÓ ×ÓÑÓÖ Ó׺ ½¼º ÈÐ ÒØ ×ÕÙ Ñ × Ô Ö Ö ÔÖ × ÒØ Ö ÙÒ Ñ ØÖ Þ Ý Ò ÓÖÖ ×ÔÓÒ ÒØ ÙÒ ÑÙÐØ Ö Óº ½½º × Ö Ð Ð ÓÖ ØÑÓ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ × Ò Ö ÙÖ× ÓÒº ½¾º ÅÓ ¬ÕÙ Ð ÐÓÕÙ Ò Ð Þ Ö ÖÖ ÐÓ ÖÖ ÐÓ× Ô Ö ÕÙ ×ÓÐÓ Ô ÖØ ÐÓ× Ð Ñ ÒØÓ× ÔÓÖ ÖÖ Ð ÓÒ Ðº ½¿º ÅÓ ¬ÕÙ Ð ÐÓÕÙ Ò Ð Þ Ö ÖÖ ÐÓ ÖÖ ÐÓ× Ô Ö Ù× Ö Ð Ø ÔÓ BitArrayº ½ º × Ò ÙÒ Ì Ady Bit ÕÙ Ö ÔÖ × ÒØ ÙÒ Ñ ØÖ Þ Ý Ò Ø×º Í× ÙÒ ÖÖ ÐÓ Ò Ñ Ó DynArray<T> ÖÖ ÐÓ× Ø× BitArrayº Å Ò Ñ Ð ÓÒ×ÙÑÓ Ñ ÑÓÖ º ½º Ó ÙÒ Ö Ó < V, A > Ý × Ò sv Ý sa ÐÓ× Ø Ñ ÒÓ× ÐÓ× Ø ÔÓ× ÐÑ Ò Ó× Ò ÐÓ× ÒÓ Ó× Ý Ö Ó׸ Ö ×Ô Ø Ú Ñ ÒØ º Ë sp Ð Ø Ñ ÒÓ ÙÒ ÔÙÒØ ÓÖº Ù Ð × Ð Ö Ð ÓÒ ÒØÖ Ð ÒØ Ö Ó× Ö ×Ô ØÓ Ð ÒÓ Ó× ÑÓ Ó Ø Ð ÕÙ × Ñ ÒÓ× Ó Ñ × ÓרÓ×Ó Ò ×Ô Ó Ð Ö ÔÖ × ÒØ ÓÒ ÓÒ Ð ×Ø × Ý Ò ÕÙ ÓÒ Ð Ñ ØÖ ×
  • 899.
    7.17. Ejercicios 873 ½º Ò Ù Ð × ×Ó× Ð Ú Ö ¬ ÓÒ Ü ×Ø Ò Ö Ó ÓÒ Ñ ØÖ × Ý Ò × O(Ð (n)) ½º Ø ÖÑ Ò ÐÓ× ÔÙÒØÓ× ÖØ ÙÐ ÓÒ Ô Ö Ð × Ù ÒØ Ö Ó J B E G A F I D C K H ½ º Ò ÙÒ ÓÒ Ð Ì List Graph<Node, Arc>¸ ÓÒרÖÙÝ ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ð ÙÐ Ð ÓÑÔÐ Ñ ÒØÓ ÙÒ Ö Óº ½ º ÓÒרÖÙÝ ÙÒ Ú Ö× ÓÒ Ð Ñ ØÓ Ó sort arcs() ÕÙ ÒÓ Ù× ÙÒ ÖÖ ÐÓ Ò Ñ Ó Ø ÑÔÓÖ Ð¸ × ÒÓ ÕÙ ÓÖ Ò Ö Ø Ñ ÒØ Ð Ð ×Ø Ö Ó׺ ¾¼º Ò Ð ÖÙØ Ò copy graph() ´Ü º¿º½¼º ´Ô Ò ¼¼µµ¸ Ù Ð × ×ÓÒ ÐÓ× Ò ÓÒÚ Ò ÒØ × ÑÔÐ ÒØ Ö Ð Ñ Ô Ó ÓÒ ÙÒ Ø Ð × ¾½º ÁÑÔÐ ÒØ Ð Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ Ô Ö ÕÙ ÜÔÐÓÖ ØÓ Ó× ÐÓ× Ö Ó׺ ¾¾º ÁÑÔÐ ÒØ Ð Ù×ÕÙ Ò ÔÖÓ ÙÒ Ô Ö Ð Ö ÔÖ × ÒØ ÓÒ ÓÒ Ñ ØÖ × Ý¹ Ò º ¾¿º ÁÑÔÐ ÒØ Ð Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ Ô Ö ÕÙ ÜÔÐÓÖ ØÓ Ó× ÐÓ× Ö Ó׺ ¾ º ÁÑÔÐ ÒØ Ð Ù×ÕÙ Ò ÑÔÐ ØÙ Ô Ö Ð Ö ÔÖ × ÒØ ÓÒ ÓÒ Ñ ØÖ × Ý Ò º ¾ º ÜÔÐ ÕÙ ÓÑÓ × ÑÓ Ð Þ ÙÒ Ð Ö ÒØÓ Ñ ÒØ ÙÒ Ö Óº × Ö ÙÒ Ð ÓÖ ØÑÓ Ô Ö Ò ÓÒØÖ Ö Ð × Ð Ó ÙÒ ÔÙÒØÓ ÒØÖÓ Ð Ð Ö ÒØÓº ¾ º × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ø ÖÑ Ò Ð Ö Ó ÙÒ Ö Óº ¾ º ÁÑÔÐ ÒØ ÙÒ Ð ÙÐÓ Ö ÓÐ Ö ÓÖ × Ó Ò ÙÒ Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ º ܹ ÔÐ ÕÙ Ð × Ö Ò × Ð Ö ÓÐ Ö ×ÙÐØ ÒØ Ö ×Ô ØÓ Ð Ð ÓÖ ØÑÓ × Ó Ò Ù×ÕÙ Ò ÔÖÓ ÙÒ × ÖÖÓÐÐ Ó Ò Ü º º ´Ô Ò ¾ µº ¾ º ÁÑÔÐ ÒØ ÙÒ ÖÙØ Ò ÕÙ ÓÒÚ ÖØ ÙÒ Ö ÓÐ Ö ÓÖ ÐÑ Ò Ó Ò ÙÒ Ó ØÓ Ø ÔÓ List Graph<Node, Arc> ÙÒ Ö ÓÐ Ð × Tree Node<T>º ×ØÙ Ñ ÒÙ¹ Ó× Ñ ÒØ ÓÑÓ Ö Ð Þ Ö Ð ÓÒÚ Ö× ÓÒ ÐÓ× Ø ÔÓ× ×Ó Ó× ÐÓ× ÒÓ Ó× Ý Ö Ó׺ ¾ º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ð ÙÐ ÐÓ× ÔÙÒØÓ× ÓÖØ Ý ÙÖ ÒØ Ð Ñ ×ÑÓ Ö ÓÖÖ Ó ÓÐÓÖ ÐÓ× ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× ×Ó Ó× ÐÓ× ÔÙÒØÓ× ÓÖØ º ´·µ ¿¼º ËÙÔÓÒ ÕÙ ÔÓ× Ð Ö Ó ÓÖØ ´Ó Ø Ò Ó ØÖ Ú × map cut graph()µ Ý ÐÓ× ÐÓÕÙ × ´Ó Ø Ò Ó× ÓÒ ÐÐ Ñ × map subgraph() ÓÒ ÐÓ× Ö ÒØ × ÓÐÓÖ × Ó× ÔÓÖ compute cut nodes()µº × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ð ÙÐ Ð Ö Ó ÓÖ Ò Ð × Ò Ô Ð Ö ÐÓ× ÓÓ ×º
  • 900.
    874 Cap´ ıtulo 7. Grafos ¿½º × ÖÖÓÐÐ ÙÒ Ú Ö× ÓÒ Ð Ì Bit Mat Graph<GT> ÕÙ Ñ Ò ×ØÖ Ø Ñ ÒØ Ø× Ý ÕÙ × ÙÒ Ñ ÒØ Ò Ð Ø ÔÓ DynArray<T>¸ Ñ Ò Ö Ø Ð ÕÙ ÑÙ × ÒØÖ × Ú ÐÓÖ ÖÓ ÒÓ Ó ÙÔ Ò Ñ ÑÓÖ º ¿¾º Ó ÙÒ Ö Ó G Ý ÙÒ Ð ×Ø l ÒÓ Ó׸ × Ò ÙÒ Ð ÓÖ ØÑÓ ÓÒ ÔÖÓØÓØ ÔÓ template <class GT> void cut(GT & g, const DynDlist<typename GT:Node*> & l, GT & g1, GT & g2); Ð Ù Ð Ö ØÓÖÒ ÙÒ ÓÖØ Ð Ö Ó Ø Ð ÕÙ g1 ÓÒØ Ò ÐÓ× ÒÓ Ó× Ð Ð ×Ø l Ý g2 ÐÓ× Ö ×Ø ÒØ ׺ ¿¿º ×Ö Ð Ð ÓÖ ØÑÓ ×ØÖ Ô Ö Ñ ØÖ × Ý Ò º × ÙÖ × ÕÙ ¸ ÓÑÓ Ò Ð Ð ÓÖ ØÑÓ ÐÓÝ ¸ × Ð ÙÐ Ò ØÓ Ó× ÐÓ× Ô Ö × Ñ ÒÓ× Ñ × ÓÖØÓ׺ ¿º × Ö Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ Ô Ö Ñ ØÖ × Ý Ò º ¿º ÅÓ ¬ÕÙ Ð Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× ÐÐ Ô Ö Ø Ø Ö ÐÓ× Ò Ø ÚÓ׺ ´·µ ¿º ËÙÔÓÒ ÙÒ Ö Ó ÓÒ ÐÓ× Ò Ø ÚÓ׸ × Ö ÙÒ Ð ÓÖ ØÑÓ ÕÙ ÒØ ¬ÕÙ ÐÓ× ÐÓ× Ý ÓÒרÖÙÝ ÙÒ Ð ×Ø Ñ ÒÓ× ÓÖÖ ×ÔÓÒ ÒØ ÐÓ× ÐÓ× Ò Ù ×Ø ÓÒº ´·µ ÝÙ Ú Ü º º¿º ´Ô Ò ¿ µº ¿º ÓÑÓ × Ò × Ó¸ Ð Ð ÓÖ ØÑÓ ×ØÖ ÒÓ ÓÔ Ö Ô Ö Ö Ó× ÓÒ ×Ø Ò × Ò Ø Ú ×º ÍÒ Ø Ò Ô Ö ÔÐ Ö Ð Ð ÓÖ ØÑÓ ×ØÖ ÙÒ Ö Ó ÓÒ ×Ø Ò × Ò Ø Ú × ÓÒ× ×Ø Ö Ò Ù× Ö Ð Ñ Ò Ñ ×Ø Ò Ð Ö Ó Ý¸ ÒØÓÒ × ×ÙÑ ÖÐ Ð Ò Ó ØÓ Ó× ÐÓ× Ö Ó× Ð Ö Óº ר ÑÓ Ó¸ Ð Ö Ó ×ÓÐÓ ÓÒØ Ò Ö ×Ø Ò × ÔÓ× Ø Ú ×º ÑÙ ×ØÖ ÕÙ ×Ø Ø Ò ÒÓ × Ú Ð Ý ÕÙ ÐÓ× Ñ ÒÓ× Ñ Ò ÑÓ× ×Ó Ö Ð Ö Ó ØÖ Ò× ÓÖÑ Ó ÔÙ Ò × Ö ×Ø ÒØÓ× ÐÓ× Ð Ö Ó ÓÖ Ò Ðº ´·µ ¿º Ë ÙÒ ÐÓ ×ØÙ Ó ×Ó Ö Ð Ô Ü ÐÙ× ÚÓ Ò Ü º º¿º¾ ´Ô Ò ¼¾µ¸ × Ò ÙÒ ×ØÖ Ø Ò Ö Ð Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ ÙÝÓ ÓÒ×ÙÑÓ Ò ×Ô Ó ÒÓ Ü O(V)º ´·µ ¿º × Ö Ð ÓÖ Ò Ñ ÒØÓ ØÓÔÓÐÓ Ó × Ó Ò Ð Ö Ó ÒÚ Ö×Óº ¼º × ÖÖÓÐÐ ÙÒ Ð ÓÖ ØÑÓ Ð ÙÐÓ ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ× × Ó Ò Ð Ð ÓÖ ØÑÓ Ï Ö× Ðк ½º ÑÙ ×ØÖ ÕÙ Ð Ð ÓÖ ØÑÓ ÃÓ× Ö Ù Ó×ÕÙ Ó Ò Ü º º¿º½ × ÓÖÖ ØÓº ¾º ÁÑÔÐ ÒØ Ð Ð ÓÖ ØÑÓ ÃÓ× Ö Ù Ó×ÕÙ Ó Ò Ü º º¿º½º ¿º ÅÓ ¬ÕÙ ÐÓ× Ð ÓÖ ØÑÓ× Ð ÙÐÓ Ð ­Ù Ó Ñ Ü ÑÓ Ö Ô Ö ÕÙ Ð ÙÐ Ò Ð ×Ð ÓÒ Ñ Ò ÑÓ Ò Ð Ñ ×Ñ Ô × ÕÙ Ð Ð ÙÐÓ Ð Ñ ÒÓ ÙÑ ÒØÓº º Ê Ð Ð Ò Ð × × Ð Ð ÓÖ ØÑÓ ÑÔÙ ÔÖ ¹­Ù Ó ÓÒ ÓÐ Á Ç ×ØÙ Ó Ò º½¼º½¿º º º Ê Ð Ð Ò Ð × × Ð Ð ÓÖ ØÑÓ ÑÔÙ ÔÖ ¹­Ù Ó ÓÒ Ñ ÝÓÖ ×Ø Ò ×ØÙ Ó Ò º½¼º½¿º º
  • 901.
    7.17. Ejercicios 875 º ÅÓ ¬ÕÙ ØÓ × Ð × ÙÒ ÓÒ × × Ò × Ô Ö Ð ÙÐ Ö Ð ­Ù Ó Ñ Ü ÑÓ × ÙÒ ÑÔÙ ÔÖ ¹­Ù Ó Ô Ö ÕÙ Ø Ò Ò ÓÑÓ Ô Ö Ñ ØÖÓ Ð ÓÔ Ö ÓÒ Ò Ð Þ ÓÒ Ð ÐØÙÖ ÐÓ× ÒÓ Ó× ´Ú × Ü º½¼º½¿º½¼ ´Ô Ò µµº º × Ò ÙÒ ÖÙØ Ò ÓÒÚ Ö× ÓÒ ÙÒ Ö Ó ÓÒ Ô × ÙÒ Ö Ð Ø ÔÓ Net Graph<TNode,TArc,T>º º × Ò ÙÒ ÖÙØ Ò ÓÒÚ Ö× ÓÒ ÙÒ Ö Ð Ø ÔÓ Net Graph<TNode,TArc,T> ÙÒ Ö Ó List Graph<Node, Arc>º º × Ò ÒרÖÙÑ ÒØ ÙÒ Ð ÓÖ ØÑÓ Ò Ö Ð ÕÙ ÓÒÚ ÖØ ÙÒ Ö ÙÐ ÓÒ ÓÒ ÙÒ ÒØ Ö ØÖ Ö ÐÓ× ÙÒ Ö ÓÒ ÙÒ Ù ÒØ Ý ÙÒ ×ÙÑ ÖÓº ¼º × Ò ÙÒ Ð ÓÖ ØÑÓ Ò Ö Ó ÕÙ ÓÒÚ ÖØ ÙÒ Ö Ö ÙÐ ÓÒ ÙÒ Ö ÓÒ ÙÒ ×ÓÐÓ Ù ÒØ Ý ÙÒ ×ÙÑ ÖÓº ½º Ò ÙÒ ÓÒ Ð ÓÒÓ Ñ ÒØÓ ÕÙ ÔÓÖØ Ð Ø ÓÖ Ñ × ÓÑÔÓ× ÓÒ ­Ù Ó º½ ¸ ÒרÖÙÑ ÒØ Ð Ð ÓÖ ØÑÓ º ÑÔÐ Ó Ô Ö Ð ÑÓ×ØÖ ÓÒº ¾º ÒÙÒ Ý ÑÙ ×ØÖ Ð Ø ÓÖ Ñ Å Ò Ö Ô Ö Ö Ó× ÒÓ Ö Ó׺ ¿º Ò ÙÒ ÓÖ Ò Þ ÓÒ × Ø Ò Ò n ØÖ ÓÖ × {t1, t2, . . . , tn} Ý m ÔÖÓÝ ØÓ× {p1, p2, . . . , pm}º ØÖ ÓÖ ×Ø ÒØ Ö × Ó Ò Ô ÖØ Ô Ö Ò Ð ÙÒÓ× ÔÖÓÝ ØÓ× {px, py, . . . }º ÔÖÓÝ ØÓ Ø Ò ÙÒ ÓØ Ô ÖØ Ô ÒØ × N(pi) × Ö¸ Ò Ð ÔÖÓÝ ØÓ pi ÐÓ ×ÙÑÓ ÔÙ Ò Ô ÖØ Ô Ö N(pi) ØÖ ÓÖ ×º ´ µ ÅÓ Ð Ð ÔÖÓ Ð Ñ Ô Ö Ñ Ü Ñ Þ Ö Ð ÒØ ØÖ ÓÖ × ÕÙ Ô ÖØ ¹ Ô Ö Ò Ò ÐÓ× ÔÖÓÝ ØÓ׺ ´ µ ËÙÔÓÒ ÕÙ ÙÒ ØÖ ÓÖ ti Ó Ö ÙÒ ÒØ S(ti, pj) ÔÓÖ Ô ÖØ Ô Ö Ò Ð ÔÖÓÝ ØÓ pjº ÓÑÓ × Ò Ù ÒØÖ Ð Ô ÖØ Ô ÓÒ ØÖ ÓÖ × Ñ Ü Ñ Ð Ñ Ò ÑÓ Óר ´ µ ËÙÔÓÒ ÕÙ ÙÒ ØÖ ÓÖ ti Ø Ò ÙÒ ¬ Ò E(ti, pj) Ò Ð ÔÖÓÝ ØÓ pjº ÓÑÓ × Ò Ù ÒØÖ Ð Ô ÖØ Ô ÓÒ ØÖ ÓÖ × Ò Ð Ñ ÝÓÖ ÒØ ÔÖÓÝ ØÓ× ÓÒ Ð Ñ Ü Ñ ¬ Ò º Ó ÙÒ ÓÖØ ÙÒ Ö Ó Ð ÙÐ Ó Ñ ÒØ compute min cut() ´Ü º½½º º¿ ´Ô Ò ¾¿µµ¸ Ð ÙÐ ÐÓ× ÐÓÕÙ × ÕÙ × ÓÒ Ø Ö Ð ×ÙÔÖ × ÓÒ Ð ÓÖØ Ñ Ò ÑÓº º × Ò ÙÒ Ð ÓÖ ØÑÓ ÕÙ Ð ÙÐ Kv(G) ÓÒÓ Ó Ð ÓÖØ Ñ Ò ÑÓ Gº º ÅÓ ¬ÕÙ Ð Ì Net Graph<TNode,TArc,T> Ô Ö ÕÙ Ò ÐÙÝ ØÓÖ × Ò Ò¹ Ò ÐÓ× Ö Ó× Ð Ñ Ò Ö ÜÔÐ Ò Ü º½ º¾ ´Ô Ò ¿µº Ê Ú × ØÓ × Ð ÖÙØ Ò × Ð Ð ÓØ Ö Ð ÓÒ × ÓÒ Ö × ­Ù Ó¸ ÒØ ¬ÕÙ Ð × ÕÙ Ñ Ò Ò Ò Ö Ñ ÒØÓ× Ó Ö Ñ ÒØÓ× ­Ù Ó Ý ÑÓ ÕÙ Ð × Ô Ö ÕÙ ÓÒ× Ö Ò ×Ø ØÓÖº º ÜÔÖ × ÙÒ Ö Ò Ö ÑÙÐØ ¹­Ù Ó Ò Ø ÖÑ ÒÓ× ÙÒ ÔÖÓ Ö Ñ Ð Ò Ðº º ×ØÙ Ñ ÒÙ Ó× Ñ ÒØ Ð Ø ÓÒ ÐÓ× Ð Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¸ Ò Ô ÖØ ÙÐ Ö bellman ford negative cycle()¸ ÔÖ × ÒØ Ü º º¿º½¼ ´Ô Ò ½µ Ý ÜÔÐ ÕÙ ÓÑÓ ÔÓ Ö ×Ø Ð ÓÖ ØÑÓ Ò ÓÒØÖ Ö Ú Ö Ó× ÐÓ× Ò Ø ÚÓ׺ ´··µ
  • 902.
    876 Cap´ ıtulo 7. Grafos Bibliograf´ ıa ½ ʺ ú Ù ¸ ̺ ĺ Å Ò ÒØ ¸ Ò Âº º ÇÖÐ Òº Æ ØÛÓÖ ÐÓÛ× Ì ÓÖݸ Ð ÓÖ Ø Ñ׸ Ò ÔÔÐ Ø ÓÒ׺ ÈÖ ÒØ À Ðи ½ ¿º ¾ º ØØ ר ¸ Ⱥ ׸ ʺ Ì Ñ ×× ¸ Ò Áº º ÌÓÐР׺ Ö Ô Ö Û Ò Ð ÓÖ Ø Ñ× ÓÖ Ø Î ×Ù Ð Þ Ø ÓÒ Ó Ö Ô ×º ÈÖ ÒØ À Ðи ½ º ¿ ÅÓ Ø Ö Ëº Þ Ö ¸ ÂÓ Ò Âº  ÖÚ ×¸ Ò À Ò º Ë Ö Ð º Ä Ò Ö ÈÖÓ Ö ÑÑ Ò Ò Æ ØÛÓÖ ÐÓÛ׺ Ï Ð Ý¸ ÓÙÖØ Ø ÓÒ¸ ¾¼¼ º Ê Ö ÐÐÑ Òº ÇÒ ÖÓÙØ Ò ÔÖÓ Ð Ñº ÉÙ ÖØ ÖÐÝ Ó ÔÔÐ Å Ø Ñ Ø ×¸ ½ ´½µ ß ¼¸ ½ º Ñ ØÖ Ⱥ ÖØ× ×º Æ ØÛÓÖ ÇÔØ Ñ Þ Ø ÓÒ ÓÒØ ÒÙÓÙ× Ò × Ö Ø ÅÓ Ð׺ Ø Ò Ë ÒØ ¬ ¸ ÐÑÓÒØ¸ Å ×× Ù× ØØ×¸ ½ º Ǻ ÓÖÙÚ º Ç ×Ø Ñ ÔÖÓ Ð ÑÙ Ñ Ò Ñ ÐÒ Ñº ÈÖ ÅÓÖ Ú× ÈÖ ÖÓ ÓÚ ËÔÓÐ ÒÓר ¸ ¿ ¿ ß ¸ ½ ¾ º ÁÒ Þ º º º ÆÌ Á º ÈÖÓ Ö ÑÑ Ò Ò Ð Ò Ö ×ØÖÙ ØÙÖ º ÓÒÓÑ ØÖ ¸ ½ ¸ ½ º ÑÓÒ × Ò Ã ÖÔº Ì ÓÖ Ø Ð ÑÔÖÓÚ Ñ ÒØ× Ò Ð ÓÖ Ø Ñ Æ Ò Ý ÓÖ Ò ØÛÓÖ ­ÓÛ ÔÖÓ Ð Ñ׺  ŠÂÓÙÖÒ Ð Ó Ø Å¸ ½ ¸ ½ ¾º Ⱥ Р׸ º Òר Ò¸ Ò º º Ë ÒÒÓÒº ÆÓØ ÓÒ ­ÓÛ Ø ÖÓÙ Ò ØÛÓÖ º ÁÊ ÌÖ Ò׺ ÓÒ ÁÒ ÓÖÑ Ø ÓÒ Ì ÓÖݸ Ô × ½½ ß½½ ¸ ½ º ½¼ ÐÐ×ÓÒ¸ Ò×Ò Ö¸ ÃÓÙØ×Ó¬Ó׸ ÆÓÖØ ¸ Ò ÏÓÓ ÙÐк Ö Ô Ú Þ ß ÓÔ Ò ×ÓÙÖ Ö Ô Ö Û Ò ØÓÓÐ׺ ÁÒ Ê ÏÁÆ ÓÒ Ö Ò ÓÒ Ö Ô Ö Û Ò ´ µ¸ ¾¼¼½º ½½ ʺ ÐÓÝ º Ð ÓÖ Ø Ñ Ë ÓÖØ ר Ô Ø º ÓÑÑÙÒº Ÿ ´ µ ¿ ¸ ½ ¾º ½¾ ĺ ʺ ÓÖ Ò º ʺ ÙÐ Ö×ÓÒº Å Ü Ñ Ð ­ÓÛ Ø ÖÓÙ Ò ØÛÓÖ º Ò Ò ÂÓÙÖÒ Ð Ó Å Ø Ñ Ø ×¸ ¿ ß ¼ ¸ ½ º ½¿ ĺ ʺ ÓÖ Ò º ʺ ÙÐ Ö×ÓÒº Å Ü Ñ Ð ­ÓÛ Ø ÖÓÙ Ò ØÛÓÖ º Ò Ò Âº Ó Å Ø Ñ Ø ×¸ ¿ ß ¼ ¸ ½ º ½ Ä ×ØÓÖ Êº ÓÖ ¸ ÂÖº Ò º ʺ ÙÐ Ö×ÓÒº ÐÓÛ× Ò Æ ØÛÓÖ ×º ÈÖ Ò ØÓÒ ÍÒ Ú Ö× ØÝ ÈÖ ×׸ ½ ¾º ½ º ÑÑ ¸ ʺ À ÐѸ ʺ ÂÓ Ò×ÓÒ¸ Ò Âº ÎÐ ×× ×º × Ò È ØØ ÖÒ׺ ×ÓÒ¹Ï ×Рݸ ½ º ½ ÐÒ ÓÒ׺ Ð ÓÖ Ø Ñ Ö Ô Ì ÓÖݺ Ñ Ö ÍÒ Ú Ö× ØÝ ÈÖ ×׸ Ñ Ö ¸ ½ º ½ ÓÐ Ö Ò Ì Ö Òº Ò Û ÔÔÖÓ ØÓ Ø Ñ Ü ÑÙѹ­ÓÛ ÔÖÓ Ð Ñº  ŠÂÓÙÖÒ Ð Ó Ø Å¸ ¿ ¸ ½ º ½ ÓÐ Ö Ò Ì Ö Òº Ò Ò Ñ Ò ÑÙѹ Óר Ö ÙÐ Ø ÓÒ× Ý ×Ù ×× Ú ÔÔÖÓÜ Ñ ¹ Ø ÓÒº ÅÇÊ Å Ø Ñ Ø × Ó ÇÔ Ö Ø ÓÒ× Ê × Ö ¸ ½ ¸ ½ ¼º
  • 903.
    7.17. Bibliograf´ ıa 877 ½ Ö Ò À Ö Öݺ Ö Ô Ì ÓÖݺ ×ÓÒ¹Ï ×Рݸ Ê Ò ¸ Å ¸ ½ º ¾¼ º º ÀÓÔ ÖÓ Ø Ò Êº º Ì Ö Òº Æ ÒØ Ð ÓÖ Ø Ñ× ÓÖ Ö Ô Ñ Ò ÔÙÐ Ø ÓÒº Óѹ ÑÙÒº Ÿ ½´ µ ¿ ¾ß¿ ¸ ÂÙÒ ½ ¿º ¾½ κ  ÖÒ º Ç ×Ø Ñ ÔÖÓ Ð ÑÙ Ñ Ò Ñ ÐÒ Ñº ÈÖ ÅÓÖ Ú× ÈÖ ÖÓ ÓÚ ËÔÓÐ ÒÓר ¸ ß ¿¸ ½ ¿¼º Ò Þ º ¾¾ Ø Ö ÂÙÒ Ò Ðº Ö Ô ×¸ Æ ØÛÓÖ × Ò Ð ÓÖ Ø Ñ׺ ËÔÖ Ò Ö¸ ¾¼¼ º ¾¿ ƺ à ÖÑ Ö Öº Ò Û ÔÓÐÝÒÓÑ Ðߨ Ñ Ð ÓÖ Ø Ñ ÓÖ Ð Ò Ö ÔÖÓ Ö ÑÑ Ò º ÓÑ ¹ Ò ØÓÖ ¸ ¿ ¿ß¿ ¸ ½ º ¾ º κ à ÖÞ ÒÓÚº Ø ÖÑ Ò Ò Ø Ñ Ü Ñ Ð ­ÓÛ Ò Ò ØÛÓÖ Ý Ø Ñ Ø Ó Ó ÔÖ ­ÓÛ׺ ËÓÚ Ø Å Ø º Ó Ðº¸ ½ ¿ ß ¿ ¸ ½ º ¾ ĺ º Ã Ý Òº ÔÓÐÝÒÓÑ Ð Ð ÓÖ Ø Ñ Ò Ð Ò Ö ÔÖÓ Ö ÑÑ Ò º ËÓÚ Ø Å Ø ¹ Ñ Ø × Ó Ð Ý¸ ¾¼ ½ ½ß½ ¸ ½ º ¾ ÖÒ Ö ÃÓÖØ Ò Â Ò× ÎÝ Òº ÓÑ Ò ØÓÖ Ð ÇÔØ Ñ Þ Ø ÓÒ Ì ÓÖÝ Ò Ð Ó¹ Ö Ø Ñ׺ ÔÖ Ò Ö¹Î ÖÐ ¸ ÓÙÖØ Ø ÓÒ¸ ¾¼¼ º ¾ º ĺ Ä ÛÐ Öº ÓÑ Ò ØÓÖ Ð ÇÔØ Ñ Þ Ø ÓÒ Æ ØÛÓÖ × Ò Å ØÖÓ ×º ÀÓÐØ¹ Ê Ò ÖØ¹Ï ÒרÓÒ¸ Æ Û ÓÖ ¸ ½ º ¾ Ú º ÄÙ Ò Ö Ö Ò ÒÝÙ º Ä Ò Ö Ò ÆÓÒÐ Ò Ö ÈÖÓ Ö ÑÑ Ò º ËÔÖ Ò ¹ ֹΠÖÐ ¸ Ø Ö Ø ÓÒ¸ ¾¼¼ º ¾ ú Å Ò Öº ÍÒØ Ö×Ù ÙÒ Ò Ù Ö ÐÐ Ñ Ò Å ØÖ º Å Ø º ÒÒº¸ ½¼¼ ß½ ¿¸ ½ ¾ º ¿¼ ÂÓÖ ÆÓ Ð Ò ËØ Ô Ò Âº ÏÖ Øº ÆÙÑ Ö Ð ÓÔØ Ñ Þ Ø ÓÒº ËÔÖ Ò Ö × Ö × Ò ÓÔ Ö Ø ÓÒ× Ö × Ö º ËÔÖ Ò Ö¹Î ÖÐ ¸ ÔÙ ¹ËÎ Ö¸ × ÓÒ Ø ÓÒ¸ ¾¼¼ º ¿½ º Àº È Ô Ñ ØÖ ÓÙ Ò Ãº ËØ Ð ØÞº ÓÑ Ò ØÓÖ Ð ÇÔØ Ñ Þ Ø ÓÒº ÈÖ ÒØ ¹À Ðи ½ ¾º ¿¾ Ë Ò Ö ×٠˺ Ê Óº Ò Ò Ö Ò ÇÔØ Ñ Þ Ø ÓÒº ÂÇÀÆ ÏÁÄ ² ËÇÆË¸ ÁÆ º¸ ÓÙÖØ Ø ÓÒ¸ ¾¼¼ º ¿¿ ÊÓ ÖØ Ë Û º Ð ÓÖ Ø Ñ× Ò È ÖØ Ö Ô Ð ÓÖ Ø Ñ׺ ×ÓÒ¹Ï ×Рݸ ÔÙ ¹ Ï Ö¸ ¾¼¼¾º ¿ ÃÓÞÓ ËÙ Ý Ñ º Ö Ô Ö Û Ò Ò ÔÔÐ Ø ÓÒ× ÓÖ ËÓ ØÛ Ö Ò Ò Ö Ò Ò ÃÒÓÛÐ Ò Ò Ö׸ ÚÓÐÙÑ ½½ Ó ËÓ ØÛ Ö Ò Ò Ö Ò Ò ÃÒÓÛÐ Ò ¹ Ò Ö Ò º ÏÓÖÐ Ë ÒØ ¬ ¸ ¾¼¼¾º ¿ ʺ º Ì Ö Òº ÔØ ¬Öר × Ö Ò Ð Ò Ö Ö Ô Ð ÓÖ Ø Ñ׺ ËÁ Šº ÓÑÔÙØº¸ ½´¾µ ½ ß½ ¼¸ ÂÙÒ ½ ¾º ¿ Î Ö Ó׺ Ù ×Ø ØÓÖ³× ÒØÖÓ Ù Ø ÓÒ Ì ØÓÔ ½¼ Ð ÓÖ Ø Ñ׺ ÓÑÔÙØ Ò Ò Ë Ò Ò Ò Ò Ö Ò ´ Ë µ¸ ¾´½µ ¾¾ß¾¿¸  ÒÙ ÖÝ ¾¼¼¼º ¿ ËØ Ô Ò Ï Ö× Ðк Ø ÓÖ Ñ ÓÒ ÓÓÐ Ò Ñ ØÖ ׺ ÂÓÙÖÒ Ð Ó Ø Å¸ ´½µ ½½ß½¾¸  ÒÙ ÖÝ ½ ¾º
  • 904.
    878 Cap´ ıtulo 7. Grafos ¿ Â Ý ÐÐ Ò Ò ÂÓÒ Ø Ò Äº ÖÓ×׺ Ö Ô Ì ÓÖÝ ² ÁØ× ÔÔÐ Ø ÓÒ׺ Ê ÈÖ ×׸ ½ º ÁË Æ ¼ß ß¿¿ ¾ß¼º
  • 905.
    ´ Indice Ö ÓÐ Ñ Ü ÑÓ¸ ¿¿¿ ÐØÙÖ ÙÒ¸ ¾ Ñ Ò ÑÓ¸ ¿¿¿ ÓÑÔÐ ØÓ ×ÙÔÖ × ÓÒ¸ ´¿ ¾¸ ¿ ¿ Ö ÔÖ × ÒØ ÓÒ ÓÒ ÖÖ ÐÓ × Ù Ò Ð¸ Ò Ö ÓÒ ÙÒ ÒÓ Ó¸ ¾ ¿¼¼ Ö Ó ÙÒ ÒÓ Ó¸ ¾ ¬Ò ÓÒ¸ ¾ Ö ÔÖ × ÒØ ÓÒ Ò Ñ ÑÓÖ ¸ ¾ ¼ Ö ÓÐ Ö ÓÖ ÙÒ Ö Ó¸ Ö ÓÐ × Ò Ö Ó× Ö ÓÐ Ö ÓÖ ÑÔÐ ØÙ ¸ ¿¼ Ð ÙÐÓ Ð ÐØÙÖ ¸ ¾ Ö ÓÐ Ò Ö Ó Ð ÙÐÓ Ð Ö Ò Ð ¸ ¾ ¬Ò ÓÒ¸ ¾ ¾ ÓÑÔ Ö ÓÒ¸ ¾ ÒÓ Ó ÓÑÔÐ ØÓ¸ ¾ רÖÙ ÓÒ¸ ¾ ÒÓ Ó Ò ÓÑÔÐ ØÓ¸ ¾ ÕÙ Ú Ð Ò ¸ ¾ ÒÓ Ó ÐÐ ÒÓ¸ ¾ ÜØ Ò× ÓÒ × Ö ÓÖÖ Ó Ò¬ Ó¸ ¾ Ð ÙÐÓ Ð ÔÓ× ÓÒ Ò¬ ¸ ¿ Ö ÓÖÖ Ó ÔÓÖ Ò Ú Ð ×¸ ¾ Ò× Ö ÓÒ ÔÓÖ Ð Ú ¸ ¿ Ö ÓÖÖ Ó ÔÖ ¬ Ó¸ ¾ × Ð ÓÒ¸ ¿ Ö ÓÖÖ Ó ×Ù¬ Ó¸ ¾ Ð Ó׸ ´¾ ¸ ¾ Ö ÓÐ Ò Ö Ó Ù×ÕÙ Ó Ò¸ ¿ Ù×ÕÙ ¸ ¿¿¾ Ó Ò Ü ÐÙ× ÚÓ¸ ¿ ½ ¬Ò ÓÒ¸ ¿¿¼ Ô ÖØ ÓÒ¸ ¿¿ Ð Ñ Ò ÓÒ¸ ¿ ¾ ÔÓÖ ÔÓ× ÓÒ¸ ¿ Ò× Ö ÓÒ¸ ¿¿ Ô ÖØ ÓÒ ÔÓÖ Ð Ú ¸ ¿ Ò× Ö ÓÒ Ò Ö Þ¸ ¿ ¿ Ö ÓÖÖ Ó× ÒÓ Ö ÙÖ× ÚÓ׸ ¾ ×ÙÔÖ × ÓÒ¸ ´¿ ¾¸ ¿ ¿ ÖÓØ ÓÒ¸ ¿ ½ Ö ÓÐ Ò Ö Ó Ù×ÕÙ ÜØ Ò Ó ×ÔРظ ¿¿ Ò× Ö ÓÒ Ò Ö Þ¸ ¿ ÙÒ ÓÒ¸ ¿ Ö ÓÐ × ÙÒ ÓÒ Ü ÐÙ× Ú ¸ ¿ ½ Ò ×ØÖÓ× ÙÒ ÒÓ Ó¸ ¾ Ö ÓÐ × Ò Ö Ó× ÓÒ Ö Ò Ó׸ ¿ ¿ Ò Ö Ó× Ù×ÕÙ ¸ ´¿¿¼¸ ¿ Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ ¸ ´¿¿¼ Ò Ð × ×¸ ´¿ ¸ ¿ Ò Ð × ×¸ ´¿ ¸ ¿ Ù×ÕÙ ¸ ´¿¿¾¸ ¿¿ Ö Ø ¸ ´¿ ¸ ¿ Ù×ÕÙ Ô Ö ¸ ¿¿ ÜØ Ò Ó׸ ¿ ¿ Ù×ÕÙ Ö Ò Ó¸ ¿¿ Ö ÓÐ × Ò Ö Ó× ÜØ Ò Ó׸ ´¿ ¿¸ µ¿ ½ Ù×ÕÙ Ð ÔÖ ×ÓÖ¸ ¿¿ Ð Ñ Ò ÓÒ ÔÓÖ Ð Ú ¸ ¿ ¼ Ù×ÕÙ Ð ×Ù ×ÓÖ¸ ¿¿ Ð Ñ Ò ÓÒ ÔÓÖ ÔÓ× ÓÒ¸ ¿ ¼ Ö Ø ¸ ´¿ ¸ ¿ Ò× Ö ÓÒ ¬Ò ÓÒ¸ ¿¿¼ ÔÓÖ ÔÓ× ÓÒ¸ ¿ Ò× Ö ÓÒ¸ ´¿¿ ¸ ¿¿ ÖÓØ ÓÒ¸ ¿ ¿
  • 906.
    880 ´ INDICE ÙÒ ÓÒ Ü ÐÙ× Ú ¸ ¿ Ð ØÓÖ Þ ÓÒ¸ ½ ¾ Ö ÓÐ × ×Ø Ø Ó× ÓÔØ ÑÓ׸ ´¿ ¸ ¿ ¾ Ð Ö O¸ ½ ¾ Ö ÑÓÚ ÐÐ Ò Ð Ø ´µ¸ Ð ÓÖ ØÑÓ ×ØÖÙ ØÙÖ ØÓ× Ð ÙÐÓ Ke(G)¸ ¾½ ÓÖ ÒØ Ð ÓÒ ÔØÓ¸ ¾¾ ÓÑÔ Ö ÓÒ Ö ÓÐ Ò Ö Ó¸ ¾ ÓÖ ÒØ Ð ­Ù Ó¸ ¾¾ × ÓÑÔÓ× ÓÒ ­Ù Ó¸ ½ ÓÖ ÒØ × ÐÓ× ØÓ׸ ¾½ רÖÙ ÓÒ Ö ÓÐ Ò Ö Ó¸ ¾ ØÖ ÙØÓ׸ ¼ ÃÖÙ× Ð¸ ß ¼¾ Ù Ø ×¸ ¼ ÈÖ Ñ¸ ¼¾ß ½¼ Ò× Ö ÓÒ¸ ¼ Ö ÙÖ× ÚÓ ÐØÙÖ ÙÒ Ö ÓÐ Ò Ö Ó¸ ¼¹¾¼ Ö Ð ¸ ¾¾ ¾ Ö ÙÖ× ÚÓ Ö ÒÐ ÙÒ Ö ÓÐ ¹ Ò Ö Ó¸ ¾ Ù×ÕÙ ¸ ¿¿¾ Ð ÓÖ ØÑÓ ÓÖ ¹ ÙÐ Ö×ÓÒ¸ ¿ Ù×ÕÙ × ×Ô Ð ×¸ ¿¿ Ò Ð × ×¸ ÓÒ Ø Ò ÓÒ¸ ¿ Ð ÓÖ ØÑÓ ÑÓÒ ×¹Ã ÖÔ¸ ÓÒ Ø Ò ÓÒ Ü ÐÙ× Ú ¸ ¿ ½ Ò Ð × ×¸ ¼ Ð Ñ Ò ÓÒ¸ ¿ ¾ Ð ÓÖ ØÑÓ Ð ÙÐÓ Ke(G))¸ ¾½ Ò× Ö ÓÒ¸ ¿¿ Ð ÓÖ ØÑÓ Ð ÙÐÓ ÓÒ Ø Ú Ö¹ Ò× Ö ÓÒ Ò Ö Þ¸ ¿ ¿ Ó׸ ¾½ Ó Ò¸ ¿ Ð ÓÖ ØÑÓ ÓÒÚ Ö× ÓÒ Ö ÓÒ Ô ¹ Ó Ò Ü ÐÙ× ÚÓ¸ ¿ ½ × Ò ÒÓ Ó× ÙÒ Ö ØÖ ¹ Ô ÖØ ÓÒ¸ ¿¿ ÓÒ Ð¸ ¼ ÔÖ ×ÓÖ¸ ¿¿ Ð ÓÖ ØÑÓ Ê Ò¹Ã ÖÔ¸ ¿ ×ÔРظ ¿¿ Ð ÓÖ ØÑÓ Ï Ö× ÐÐ Ô Ö Ð Ð Ù×ÙÖ ×Ù ×ÓÖ¸ ¿¿ ØÖ Ò× Ø Ú ¸ ½ ÙÒ ÓÒ¸ ¿ Ð ÓÖ ØÑÓ × ÑÔРܸ ß ¾ ÙÒ ÓÒ Ü ÐÙ× ÚÓ¸ ¿ ½ Ð ÓÖ ØÑÓ× Ð ØÓÖ Ó׸ ½ ¾ ÐØÙÖ ÙÒ ÓÒ Ü ÐÙ× Ú ¸ ¼ ÒÓ Ó Ò Ö ­Ù Ó¸ ¿ ÙÒ Ö Óи ¾ Ð ÙÐÓ Ð ÔÓ× ÓÒ Ò¬ ¸ ¿ ÙÒ ÒÓ Ó¸ ¾ × ÑÔ ÒÓ¸ ¿ ½ ÐØÙÖ ÙÒ Ö Óи ¾ Ð Ñ Ò ÓÒ ÔÓÖ Ð Ú ¸ ¿ ¼ ÐØÙÖ ÙÒ Ö ÓÐ Ò Ö Ó¸ ¾ Ð Ñ Ò ÓÒ ÔÓÖ ÔÓ× ÓÒ¸ ¿ ¼ ÐØÙÖ Ò Ö Ò ÙÒ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ¸ ½ Ò× Ö ÓÒ Ò Ö Þ¸ ¿ Ò Ð × × ÑÓÖØ Þ Ó¸ ¾¼¼ Ò× Ö ÓÒ ÔÓÖ Ð Ú ¸ ¿ Ò Ð × × ÓÒØ Ð ¸ ¾¼ ß¾¼ Ò× Ö ÓÒ ÔÓÖ ÔÓ× ÓÒ¸ ¿ Ò Ð × × Ð ÓÖ ØÑÓ׸ ½ Ô ÖØ ÓÒ¸ ¿ Ò Ð × × ÐÓ× Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ ¸ Ô ÖØ ÓÒ ÔÓÖ ÔÓ× ÓÒ¸ ¿ ´¿ ¸ ¿ × Ð ÓÒ¸ ¿ Ò Ð × × Ð Ð ÓÖ ØÑÓ ÓÖ ¹ ÙÐ Ö×ÓÒ¸ ×ÔРظ ¿ ÙÒ ÓÒ Ü ÐÙ× Ú ¸ ¿ Ò Ð×× Ð Ð ÓÖ ØÑÓ ÑÓÒ ×¹Ã ÖÔ¸ ×Ó Ù Ö ÐÓÕÙ ¸ ¾¾½ ¼ Ð ¸ ½ Ò Ð × × Ð Ð ÓÖ ØÑÓ Ò Ö Ó ÔÖ ¹­Ù Ó¸ ØÙ ÓÖ¸ ¾ Ð ÒÞ Ð ¸
  • 907.
    ´ INDICE 881 Ò Ð×× Ð Ñ Ò Ó ÓÐ × ÓÒ × ÔÓÖ Ö ¹ Ò× Ö ÓÒ¸ ´ ¸ ¼½ ÓÒ Ñ ÒØÓ ÖØÓ Ý ×ÓÒ Ó Ð Ò Ð¸ Ö ÓÐ × Ð ØÓÖ Þ Ó׸ ß ¾¼ Ò Ð × ×¸ ¾ß Ò Ð × × Ð Ñ Ò Ó ÓÐ × ÓÒ × ÔÓÖ Ò ¹ ÓÒ Ø Ò ÓÒ¸ ¼ Ò Ñ ÒØÓ ÖÖ Ó¸ ½¾ Ð Ñ Ò ÓÒ¸ ¼ Ò Ð × × Ð Ñ Ò Ó ÓÐ × ÓÒ × ÔÓÖ Ò ¹ Ò× Ö ÓÒ¸ Ò Ñ ÒØÓ × Ô Ö Ó¸ ¼ ×ÙÔÖ × ÓÒ¸ ¼ Ò Ð × × Ð Ñ Ö ×ÓÖØ¸ ½ ØÖ Ô¸ ¼ Ò Ð × × Ð ×ÓÒ Ó Ð¸ ½ Ö ÓÐ × Ò Ö Ó× Ò Ð × × ÔÓØ Ò Ð¸ ¾¼½ß¾¼ ×ÑÐ Ö ¸ ¾ Ò Ð × × ÑÓÖØ Þ Ó Ö ÓÐ × Ò Ö Ó× Ð ØÓÖ Þ Ó× Ò Ð × × ÓÒØ Ð ¸ ¾¼ ß¾¼ ÙÒ ÓÒ Ü ÐÙ× Ú ¸ ¼ Ò Ð × × ÔÓØ Ò Ð¸ ¾¼½ß¾¼ Ö ÓÐ × Ò Ö Ó× ÜØ Ò Ó × Ð ÓÒ Ö ØÓ׸ ¾¼ ß¾¼ ×ÔРظ ¿ × Ð ÓÒ ÙÒ ÓÒ ÔÓØ Ò Ð¸ ¾¼ ß¾¼ Ö ÓÐ × ÓÒ ¸ ¼ ß ½½ Ò Ð × × ÐÓ× Ö ÓÐ × Ð ØÓÖ Þ Ó׸ ¾ß ÐØÙÖ ¸ ¼ Ò Ð × × ÐÓ× Ö ÓÐ × ×ÔРݸ ¿ ß ¾ Ö ÒÐ ¸ ¼ Ò Ð × × ÐÓ× ØÖ Ô׸ ¾ß ¿ Ö ÓÐ × ÕÙ Ð Ö Ó׸ ß Ò Ð × × Ð ÕÙ ×ÓÖØ¸ ½ Ö ÓÐ × ×ÔРݸ ¿¼ß ¾ Ò ×ØÖÓ× ÙÒ ÒÓ Ó¸ ¾ Ò Ð × ×¸ ¿ ß ¾ ÔÐ ÓÒ × Ð × ÓР׸ ½¿¾ Ö ÓÐ × ØÖ Ô× ÔÙÒØ ÓÖ × Ý ÖÖ ÐÓ¸ ¿½ Ò Ð × ×¸ ¾ß ¿ Ö ÓÐ Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ ¸ ¿ ÖÓ Ó¹Ò ÖÓ¸ ½¿ Ö ÓÐ × ÓÑÔÐ ØÓ× ÓÒ ¸ ¼ Ö ÔÖ × ÒØ ÓÒ Ò Ñ ÑÓÖ ¸ ¾ Ö ÓÐ ÎÄ Ö Ø Ó¸ ½¼ Ö ÓÖ × Ò ¸ ¾ Ö ÓÐ Ö ÓÖ ÔÖÓ ÙÒ ¸ ¾ Ö ÓÖÖ Ó׸ ¾ ¼¸ ¾ Ö ÓÐ Ö ÓÖ Ñ Ò ÑÓ¸ ß ½¼ Ì Tree Node<T>¸ ¾ Ö ÓÐ Ò Ö Ó Ù×ÕÙ Ð ØÓÖ Ó¸ ÖÓ Ö ÓÐ × Ö Ð ÓÒ¸ ¿¼ ÎÄ Ö Ó Ò ÒØ ¸ ¾ Ò Ð × ×¸ ¼ ß ½¿ Ö Ó Ô Ö Ð ÐÓ¸ Ð Ñ Ò ÓÒ¸ ´ ¼½¸ ¼ Ö Ó× ÙÒ Ö Ó Ò× Ö ÓÒ¸ ´ ¸ ¼½ ÑÔÐ ÒØ ÓÒ¸ ½ ÕÙ Ð Ö Ó Ô Ö ØÓ¸ Ö ØÑ Ø ÔÓÐ ÒÓÑ Ó× ÒÓ Ó Ò Ö Ó Ù×Ó Ð ×Ø × ÒÐ Þ ×¸ ½¼¼ Ì BinNode<Key>¸ ¾ Ö ØÑ Ø ÔÙÒØ ÖÓ׸ ¿½ ÖÓ Ó¹Ò ÖÓ¸ ½¿ß ¾ ÖÖ ÐÓ Ò Ð × ×¸ ¾ ß ¾ Ò Ñ ÑÓÖ Ò Ñ ¸ ¿ Ð Ñ Ò ÓÒ¸ ´ ¾¼¸ ¾ Ù×ÕÙ Ò Ö ¸ ¿¾ Ò× Ö ÓÒ¸ ´ ½ ¸ ¾¼ Ù×ÕÙ ÔÓÖ Ð Ú ¸ ¿¾ ×ÔРݸ ¿¼ß ¾ Ð ÙÐÓ Ö ÓÒ¸ ¿½ Ö ÓÐ × Îĸ ß ½¿ ÓÒ ÔØÓ× Ò Ö Ð ×¸ ¿¼ Ò Ð × ×¸ ¼ ß ½¿ Ø×¸ ¿ ß ½ ¬Ò ÓÒ¸ Ò Ñ Ó¸ ½ß ½ Ð Ñ Ò ÓÒ¸ ´ ¼½¸ ¼ Ð Ñ Ò ÓÒ ÔÓÖ Ð Ú ¸ ¿¿
  • 908.
    882 ´ INDICE Ò Ñ ÑÓÖ ×Ø Ø ¸ ¿ Ù×ÕÙ Ð ØÓÖ ÒÔÐ ¸ ¿ Ò ÖÖ ÐÓ¸ ½ Ò× Ö ÓÒ ÔÓÖ Ð Ú ¸ ¿¿ Ò Ð ×Ø ׸ ½ ÑÙÐØ Ñ Ò× ÓÒ Ð¸ ½ Ù×ÕÙ Ò Ö ¸ ¿¾¸ ½ ß½ Ô Ö Ö ÔÖ × ÒØ Ö Ö ÓР׸ ¾ ½ Ù×ÕÙ Ñ ÒÓ× ÔÓÖ ÑÔÐ ØÙ ¸ ¾ × ÖØÓ׸ ¾½ Ù×ÕÙ Ñ ÒÓ× ÔÓÖ ÔÖÓ ÙÒ ¸ ¾½ × Ò ÓÒ¸ ½½ Ù×ÕÙ ÐÓ× Ò ÙÒ Ö Ó¸ ½ ­Ù Ó Ñ Ü ÑÓ Óר Ñ Ò ÑÓ¸ ¸ LhashTable<Key>¸ ¼ Ð ÙÐÓ ÒÓ Ó× Ô ÖØ Ò ÒØ × ÙÒ Ò Ú Ð¸ ØÖ ÙØÓ× ÓÒØÖÓÐ ÒÓ Ó× Ý Ö Ó× ÙÒ ¾¿ Ö Ó¸ ¼ Ð ÙÐÓ Ð ÒÙÑ ÖÓ Û Ý¸ ¾ ¼ ÙØÓÑ Ø ¸ ¾½ Ó Ó× ÀÙ«Ñ Ò¸ ¿ ¿ß¿ ÎÄ Ó ¬ ÓÒ Ø ÜØÓ¸ ¿ ½ Ö ÓР׸ ß ½¿ Ó ¬ ÓÒ¸ ¿ Ò Ö ×Ó Ö Ù Ò ×¸ ¿ ¼ Ù×ÕÙ ÓÔØ Ñ ÓÒ¸ ¿ ¿ Ö Ó× Ò Ö Ó¸ ¸ ¾¿¼ ÐÓ× Ò Ø ÚÓ׸ ¿ Ò × ÔÖÓ Ù ÓÒ ÒÓ Ó× Ò Ö Ó¸ ¿ ­Ù Ó Ñ Ü ÑÓ Óר Ñ Ò ÑÓ¸ × Ù Ò Ð¸ ½ Ð ÙÐÓ Ö Ö × Ù Ð Ò ÙÒ Ö ­Ù Ó¸ Ù×ÕÙ Ò Ö ¸ ¿¾ Ù×ÕÙ Ö Ó× Ò ÙÒ Ö Ó Ñ ÒÓ ÑÔÐ Ñ ÒØ ÓÒ¸ ¼ Ù×ÕÙ Ò ÔÖÓ ÙÒ ¸ ¾¿ Ù×ÕÙ ÜØÖ ÑÓ׸ ½ ÒØÖ ÒÓ Ó× ÙÒ Ö Óи ¾ Ù×ÕÙ Ñ Ü ÑÓ¸ ½ ÐÓÒ ØÙ Ò ÙÒ Ö Óи ¾ Ù×ÕÙ Ñ Ò ÑÓ¸ ½ ÔÖÙ Ü ×Ø Ò ¸ ¾½¸ ½ Ù×ÕÙ ÒÓ Ó× Ò ÙÒ Ö Ó × ÑÔÐ ¸ ¾ ÑÔÐ Ñ ÒØ ÓÒ¸ ¼ Ñ ÒÓ Ñ × ÓÖØÓ¸ ¾¾¿ Ù×ÕÙ Ò Ø Ð × Ð Ò Ð¸ ¿ Ñ ÒÓ Ø Ð Ò¸ ¿¾ Ù×ÕÙ × Ù Ò ¸ ½ ß½ Ñ ÒÓ ÙÒ Ö Ó¸ ¾ ÐÐÑ Ò¹ ÓÖ Ñ ÒÓ Ñ × ÓÖØÓ¸ ¾¾ Ñ ÒÓ× Ñ Ò ÑÓ׸ ¾ ß ¾ Ñ ÒÓ× ÙÑ ÒØÓ¸ BinHeap<Key> Ð ÙÐÓ ¸ ½ ØÙ Ð Þ ÓÒ ÙÒ Ð Ñ ÒØÓ¸ ¿½ Ñ ÒÓ× Ñ Ò ÑÓ׸ ½¼ß ¿ Ð Ñ Ò ÓÒ¸ ¿½ Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¸ ¾ ß ¾ Ð Ñ Ò ÓÒ Ù ÐÕÙ Ö Ð Ñ ÒØÓ¸ ¿½ Ð ÓÖ ØÑÓ ×ØÖ ¸ ½½ß ¾¼ Ð Ñ Ò ÓÒ ØÓ Ó× ÐÓ× Ð Ñ ÒØÓ׸ ¿½ Ð ÓÖ ØÑÓ ÐÓÝ ¹Ï Ö× Ðи ¾¼ß ¾ ÁÒ× Ö ÓÒ¸ ¿½ × Ù× ÓÒ¸ ¾ ÒØ Ö Ñ Ó ÒØÖ ÒÓ Ó׸ ¿½ Ô ¸ ¿ BinNode<Key> Ô ÙÒ ÓÖØ ¸ ÓÒÚ Ö× ÓÒ Tree Node<T>¸ ¾¾ Ö ÒÐ BinTree<Key>¸ ¿¿ ÙÒ Ö Óи ¾ BitArray¸ ¿ ß ½ ÒØ ¸ ¾ Ø× ÓÒØÖÓи ¼ Ð Ò Ú Ð¸ ¾ Ùи ¾ Ö ÒÐ ÙÒ Ö ÓÐ Ò Ö Ó¸ ¾ Ù×ÕÙ ×Ø Ò ×Ó Ö ÖÖ ÐÓ׸ ½ Dlink רÖÙ ØÙÖ ÓÒØ Ò ¸
  • 909.
    ´ INDICE 883 Slink רÖÙ ØÙÖ ÓÒØ Ò ¸ ¼ ÓÒ Ø Ú Ö Ó× ØÐÒ Ð ÓÖ ØÑÓ¸ ¾½ ÒÙÑ ÖÓ ¸ ¿¾ ß¿¿¼ Ð ÙÐÓ¸ ¾½ ÐÓ× ÑÔÐ ÒØ ÓÒ Ð Ð ÓÖ ØÑÓ Ð ÙÐÓ¸ Ù×ÕÙ Ò Ø ÚÓ׸ ¿ ¾¾ Ø ÓÒ¸ ½ ÓÒ Ø Ú ÒØÖ Ö Ó׸ ½ ÔÖÙ Ð ¸ ½ ÓÒ ÙÒØÓ¸ ¾½ Ù×Ó Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ Ô Ö ÓÒ ÙÒØÓ ÔÖ ¬ Ó¸ ¿¾¾ ×Ù Ø ÓÒ¸ ¿ ÓÒ ÙÒØÓ× ÐÓ× Ò Ø ÚÓ× Ö ÔÖ × ÒØ ÓÒ Ö ÓР׸ ¾ Ð ÓÖ ØÑÓ ÐÐÑ Ò¹ ÓÖ ¸ ¿ ÓÒØÖ ÓÒ Ø Ð × Ð Ò Ð¸ ¿ Ù×ÕÙ ¸ ¿ ÓÒÚ Ö× ÓÒ Ö ÙÐ ÓÒ ×¸ ½ Dlink רÖÙ ØÙÖ ÓÒØ Ò ¸ Ð× Slink רÖÙ ØÙÖ ÓÒØ Ò ¸ ¼ רÓÖ ¸ ÓÒÚ Ö× ÓÒ ÙÒ Ö ÓÐ Ö ÓÖ ÙÒ ÒØ ÖÑ Ö ¸ Tree Node<T>¸ ¿¿ ÔÖÓÜݸ ÓÖÖ Ø ØÙ Ð Ù×ÙÖ ØÖ Ò× Ø Ú ¸ ¾¿¸ ½ Ù×ÕÙ ¸ ¾¼ Ð ÕÙ ÙÒ Ö Ó¸ Ø ÓÒ¸ ¾¼ Ó Ó ÔÐ ÒØ Ñ ÒØÓ Ð ÔÖÓ Ð Ñ ¸ ¾¼ ÄÙ × Û Þ¸ ¿¾½¸ ¿¾ ÓÖÖ ×ÔÓÒ Ò ÒØÖ Ö ÓÐ × Ò Ö Ó× Ý m¹ Ó Ó ÙÒ Ö ÓÐ Ò Ö Ó¸ ¿¾½ Ö Ó׸ ¾ ÓÐ × ÓÖÖ ×ÔÓÒ Ò ÒØÖ BinNode<Key> Ý ÔÐ ÓÒ ×¸ ½¿¾ Tree Node<T>¸ ¾ ¾ Ñ ÒØ ÖÖ ÐÓ׸ ½¿ ÓÖÖ ×ÔÓÒ Ò ÒØÖ Tree Node<T> Ý Ñ ÒØ Ð ×Ø × ÒÐ Þ ×¸ ½¿ BinNode<Key>¸ ¾ ¾ Ñ ÒØ Ð ×Ø × ÒÐ Þ × Ò Ñ ×¸ ÓÖØ ½¼ Ô ¸ Ö ÔÖ × ÒØ ÓÒ × Ò Ñ ÑÓÖ ¸ ½¿¿ Ú ÐÓÖ ­Ù Ó¸ ¿ ÓÐ × ÔÖ ÓÖ ¸ ¿¼ ÓÖØ ÙÒ Ö ¸ ¾ ØÙ Ð Þ ÓÒ ÙÒ Ð Ñ ÒØÓ¸ ¿¼ ÓÖØ Ñ Ò ÑÓ¸ ÓÑÔ Ö ÓÒ Ö ÓÐ × Ò Ö Ó׸ ¾ Ð ÙÐÓ ¸ ¼½ ÓÑÔ Ö Ý Dlink¸ ½ ÓÖØ × Ö ¸ ¾ ÓÑÔÐ Ñ ÒØÓ ÙÒ Ö Ó¸ ¿ Óר Ò ×Ô Ó Ð ÓÖ ØÑÓ× Ú Ö Óѹ ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ× ÐÓ× ÔÙÒØÓ× ÓÖØ ¸ Ò Ö¸ ½ ¼ Óר Ñ Ò ÑÓ ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ× ÙÒ ¹ Ð ­Ù Ó Ñ Ü ÑÓ¸ ¾ Ö Ó¸ ß ÓרÙÑ Ö × ÓÖÖ Ø ØÙ ÓÑÔÓÒ ÒØ × Ò ÓÒ ÜÓ× ÙÒ Ö Ó¸ ¿ ÐÓ Ó ÀÓÐØÞÑ ÒÒ¸ ¾¼ ÓÑÔÖ Ò× ÓÒ ØÓ׸ ¿ ¿ß¿ ÈÖ ÙÒØ × Ø ØÙ Ò Ö × Î Ò Ð ¸ ÓÒ Ø Ò ÓÒ Ö ÓÐ × Ð ØÓÖ Þ Ó׸ ¼ ¾½¿ ÓÒ ÓÒ ÖÓ ¸ ½¿ ÖØ Ð ÓÖ ØÑÓ׸ ½ ÓÒ ÓÒ Ò Ö ¸ ½¿ ÖØ ÐÓ× Ö ÓÐ × Ò Ö Ó× Ù×ÕÙ ¸ ÓÒ Ø Ú ¸ ¾¼ ´¿ ¸ ¿ ÒØÖ Ö Ó׸ ÖØ Ð Ñ Ö ×ÓÖØ¸ ½ ÒØÖ Ö Ó׸ ½ ÖØ Ð ÕÙ ×ÓÖØ¸ ½
  • 910.
    884 ´ INDICE LhashTable<Key>¸ ¼ Óר Ò ×Ô Ó¸ ½ ÙÑÔÐ ÒÓ׸ ¼½ Ñ ÐÐÓ ¸ ¾¾¾ ¸ DynArray<T> Ð ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ и ½ ¸ ¾¾¿ ÝÒË ØÌÖ ¸ ¿ ¼ ÐÓ ¸ ¾½ Í ¸ ¾½ ÙÒ ÒÓ Ó¸ ¾ ÐÓ Ó ÀÓÐØÞÑ ÒÒ¸ ¾¼ Ð ÔÖÓ Ð Ñ Ð ×Ø ÓÒ Ñ ÒØÓ¸ ¼¼ Ù ÓÒ¸ ¾¿ Ð Ñ Ò ÓÒ ÐØ¸¿ Ò ¸¿ ¾ ÔÙÖ ÓÖ ×¸ ¾¾¿ Ö ÓÐ Ò Ö Ó Ù×ÕÙ ¸ ¿ ¾ × ÓÑÔÓ× ÓÒ ­Ù Ó¸ ½ Ð Ñ Ò ÓÒ ÐÓ× Ò Ø ÚÓ׸ ¿¿ × ÑÔ ÒÓ ÐÓ× Ö ÓÐ × Ò Ö Ó× ÜØ Ò ¹ Ð Ñ Ò ÓÒ Ð Ö ÙÖ× ÓÒ¸ ½¾ Ó׸ ¿ ½ Ð Ñ Ò ÓÒ Ð Ö ÙÖ× ÓÒ ÓÐ ¸ ½¾ רÖÓÝÊ ¸ ¾ Ð Ñ Ò ÓÒ Ð Ö ÙÖ× ÓÒ ÔÓÖ ÑÙÐ ÓÒ ×ØÖÙ ÓÒ ÐÓ× Ö ×ØÖÓ× Ø Ú ÓÒ¸ ½¾ Tree Node<T>¸ ¾ Ð Ñ Ò ÓÒ Ò Ø Ð × Ð Ò Ð¸ ¼ רÖÙ ÓÒ ÙÒ Ö ÓÐ Ò Ö Ó¸ ¾ Ð Ñ Ò ÓÒ ÔÓÖ Ð Ú Ò Ö ÓÐ × Ò Ö Ó× Ü¹ רÖÙ ØÓÖ × Ú ÖØÙ Ð × Ø Ò Ó׸ ¿ ¼ ÔÖÓ Ð Ñ ¸ Ð Ñ Ò ÓÒ ÔÓÖ ÔÓ× ÓÒ Ò Ö ÓÐ × Ò Ö Ó× Ø ÓÒ ÐÓ× Ò Ø ÚÓ׸ ¿ ÜØ Ò Ó׸ ¿ ¼ ÛÝ Ð Ñ Ò ÓÒ ØÓØ Ð Ð Ö ÙÖ× ÓÒ¸ ½¿¼ Ù×ÕÙ Ò Tree Node<T>¸ ¾ ¼ Ð Ñ Ò ÓÒ Ò Ö ÓÐ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ¸ ´ ¾¼¸ ÒÓØ ÓÒ Ô Ö Ö ÓР׸ ¾ ¾ ¸ ¾ Ð Ñ Ò ÓÒ Ò Ö ÓÐ Ð ØÓÖ Þ Ó¸ ¼ Ñ ØÖÓ ÙÒ Ö Ó¸ ¿ Ð Ñ Ò ÓÒ Ò ØÖ Ô¸ ¼ Ö Ñ ÍÅÄ ÑÔ Ö Ñ ÒØÓ¸ ½½ Ä ×Ø × Ó Ð Ñ ÒØ ÒÐ Þ ×¸ Ô ÖØ Ó¸ ½¾ ÓР׸ ½¿¾ Ö ÒÐ Ñ Ü Ñ ¸ ½½ Ö Ó¸ ¾ Ñ Ü ÑÓ¸ ½¾ ÓÑÔÓÒ ÒØ × Ù ÖØ Ñ ÒØ ÓÒ ÜÓ׸ ß Ô Ö ØÓ¸ ½¾ Ò Ð Ö¸ ¾½ Ö Ó׸ ß ÒÐ Óи ÓÒ Ø Ú ¸ ÒÐ × ÑÔÐ ¸ ÒÚ Ö× ÓÒ¸ Ò× Ò ÒÞ ÓÖ Ò Ñ ÒØÓ ØÓÔÓÐÓ Ó¸ ¼ß Ø ÑÓÐÓ ¸ ÔÐ Ò ¬ ÓÒ¸ ÒÙÑ Ö ÓÒ Ö ÓР׸ ¿¾¼ Ö Ó× Ð Ó׸ ÕÙ Ð Ö Ó Ô Ö ØÓ Ï ÖØ ¸ ×ØÖ ÕÙ Ú Ð Ò Ñ ÒÓ× Ñ Ò ÑÓ׸ ½½ß ¾¼ Ö ÓÐ × Ò Ö Ó׸ ¾ ÌÖ ÔÐ Ô ÖØ ÓÒ Ð ÕÙ ×ÓÖØ¸ ½ ÕÙ Ú Ð Ò ÒØÖ Ö Ý ÓÖØ ¸ ¿ ÔÓÐÓ׸ ½¿¾ ÖÖÓÖ × Ñ ÑÓÖ ×Ô Ö× ÓÒ Ò× Ö Ø Ö ×¸ ½ ×Ó Ù Ö ÐÓÕÙ ¸ ¾¾½ ×Ô Ö× ÓÒ ÔÓÖ Ú × ÓÒ¸ Ù ¸ ¾¾½ ×Ô Ö× ÓÒ ÔÓÖ ÑÙÐØ ÔÐ ÓÒ¸ ר Ð ×Ô Ö× ÓÒ ÙÒ Ú Ö× Ð¸ ½ Ò ÓÖ Ò Ñ ÒØÓ¸ ½ Ú Ö ÓÑ Ò Ö¸ ½ ¼ Ñ Ö ×ÓÖØ¸ ½
  • 911.
    ´ INDICE 885 ר ÓÒ Ñ ÒØÓ¸ ¼¼ Ð ÓÖ ØÑÓ Ò Ö Ó ÑÔÙ ÔÖ ¹ רÖÙ ØÙÖ ØÓ× ­Ù Ó¸ ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ и ½ ß¾½ Ð ÓÖ ØÑÓ Ò Ö Ó ÔÖ ¹­Ù Ó¸ ¿ Ø ÑÓÐÓ Ú ÐÓÖ × Ò Ð × ÐØÙÖ ¸ ÑÓÖØ Þ Ö¸ ¾¼ Ð ÓÖ ØÑÓ ÔÓÖ ÑÔÙ ÔÖ ¹­Ù Ó Ò Ð × ×¸ ½ Ò Ö Ó ÔÓÖ Ö Ó׸ Ð ÒÞ ¸ ¿ Ð ÓÖ ØÑÓ× ÑÔÙ Ý ÔÖ ¹­Ù Ó¸ ¾ Ö ØÓ¸ ¾¼ Ð ÓÖ ØÑÓ× ÔÖ ¹­Ù Ó ÖØ ¸ ½ ÐØÙÖ ÒÓ Ó¸ ¿ Ò Ö ¸ ¾¼¾ ÐØÙÖ ÒÓ Ó¸ ¿ ÕÙ Ð Ö Ó¸ ¿ Ò Ð × × Ð Ð ÓÖ ØÑÓ Ò Ö Ó ÔÖ ¹ Ò Ö Ó¸ ½ ­Ù Ó¸ ¾ Ò ÐÓ ¸ ¾ ½ Ð ÙÐÓ Ð ÓÖØ Ñ Ò ÑÓ¸ ¼½ Ò Ö Ð¸ ½ ÓÒ Ô × Ò ÐÓ× ÒÓ Ó׸ ¼ Ö Ó¸ Óר Ñ Ò ÑÓ¸ ¾ Ñ ØÓ Ó¸ ÑÔÙ ÔÖ ¹­Ù Ó ÓÒ ÓÐ Ð ØÓÖ ¸ Ó ØÓ¸ ¾ ÔÓÐ ÑÓÖ Ó¸ ½¿ ÑÔÙ ÔÖ ¹­Ù Ó ÓÒ ÓÐ ÔÖ ÓÖ ¹ ÔÓØ Ò ¸ ¾¼¾ ¸ Ö ÙÖÖ Ò ¸ ¾ ÑÔÙ ÔÖ ¹­Ù Ó ÓÒ ÓÐ Á Ǹ Ö ÙÖ× ÓÒ¸ ¾ ÑÔÙ ÔÖ ¹­Ù Ó ÓÒ Ñ ÝÓÖ ×Ø Ò¹ × ÒØ × ×¸ ½ ¸ ×Ù ØÓ¸ ÑÔÐ ÒØ ÓÒ Ð Ð ÓÖ ØÑÓ Ò Ö Ó Ú ÐÙ ÓÒ ÜÔÖ × ÓÒ × Ò¬ ׸ ½½ ÔÖ ¹­Ù Ó¸ ¼ Ú ÐÙ ÓÒ ÜÔÖ × ÓÒ ×Ù¬ ¸ ½½ ÒÓ Ó Ø ÚÓ¸ ¾ Ü ×Ó ­Ù Ó¸ ¿ ÔÖÓÚ × ÓÒ ­Ù Ó¸ ½¼ ÜÔ Ò× ÓÒ Ø Ð × Ð Ò Ð¸ ¿ Ö Ù ÓÒ × ÙÒ Ö ÒÓ¹ Ö ¸ ÜØ Ò× ÓÒ × ÐÓ× Ö ÓÐ × Ò Ö Ó׸ ¿ ¿ ¼ Ð ÙÐÓ Ð ÔÓ× ÓÒ Ò¬ ¸ ¿ ­Ù Ó Ñ Ü ÑÓ Óר Ñ Ò ÑÓ ÜØ Ò× ÓÒ × ÐÓ× Ö ÓÐ × Ò Ö Ó× × Ñ ÓÐÓ× × Ò ÓÒ¸ ¸ × ÑÔ ÒÓ¸ ¿ ½ Ò × ÔÖÓ Ù ÓÒ¸ ÜØ Ò× ÓÒ × ÐÓ× Ö ÓÐ Ò Ö Ó × Ñ ÓÐÓ× Ð ÔÖÓ Ð Ñ × Ò ÓÒ¸ ¸ Ò× Ö ÓÒ ÔÓÖ Ð Ú ¸ ¿ ÔÖÓ Ð Ñ Ð ØÖ Ò×ÔÓÖØ ¸ ¿ ÜØ Ò× ÓÒ × ÐÓ× ÔÖÓ Ð Ñ Ð ØÖ × ÓÖ Ó¸ ¿ × Ð ÓÒ¸ ¿ ­Ù Ó Ñ Ü ÑÓ» ÓÖØ Ñ Ò ÑÓ¸ ¸ ¼½ ­Ù Ó Ö Ð Þ Ð ¸ ½¼ ÓÒ ¸ ½¾ ­Ù Ó× Óר Ñ Ò ÑÓ¸ ¾ ß ¬Ò¸ ¾¾ ÓÒÚ Ö× ÓÒ ÔÖÓ Ö Ñ Ð Ò Ð¸ ¾ ­ Û¬Ò Ö¸ ¾½ ÓÖÑ ×Ø Ò Ö ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð¸ ¾ ÐÓÝ ¹Ï Ö× ÐÐ ÓÖÑ ÓÐ ÙÒ ÔÖÓ Ö Ñ Ð Ò Ð¸ Ñ ÒÓ× Ñ Ò ÑÓ׸ ¾¼ß ¾ ÓÖØÖ Ò¸ ½ ­Ù Ó Ù ÒØ ¸ ¸ ¿ Ø ÓÖ Ñ × ÓÑÔÓ× ÓÒ¸ ½ Ù × Ñ ÑÓÖ ¸ ¾¾½ Ú ÐÓÖ ¸ ÙÒ ÓÒ ÓÒ ¸ ½¾ ­Ù Ó Ø Ð ¸ ÙÒ ÓÒ × ­Ù Ó Ñ Ü ÑÓ ÓÐ ÙÖ ×Ô Ö× ÓÒ¸
  • 912.
    886 ´ INDICE Ñ ØÓ Ó Ú × ÓÒ¸ Ô Ü ÐÙ× ÚÓ¸ ¼¾ Ñ ØÓ Ó ÑÙÐØ ÔÐ ÓÒ¸ Ô׸ ¿¼½ ÙÒ ÓÒ × × ¸ ÓÒ ÖÖ ÐÓ׸ ¿¼¾ Ô×ÓÖØ¸ ¿¼ ¸ ¾¾¿ Ö Ò ¸ ½½ Ò Ö Ó¸ ½ Ø ÔÓ׸ ½¾ Ò Ö ÓÒ ÙÒ ÒÓ Ó¸ ¾ Ö Ò ÑÙÐØ ÔÐ ¸ ½¿ Ò Ö Ð¸ ½ ÙÖ ×Ø Ö Ó Ñ ÒÓ Ñ × ÓÖØÓ¸ ¾¾ ÙÒ Ö Ó¸ ¾ Ð Ó Ö ÓÐ × Ò Ö Ó׸ ´¾ ¸ ¾ Ö Ó ÓÐ ÙÖ ×Ô Ö× ÓÒ ÙÒ ÙÒ ÓÒ × ¸ Ö ÓÐ Ö ÓÖ¸ Ô ÖØ Ó¸ ÀÓÐØÞÑ ÒÒ¸ ¾¼ Ñ ÒÓ¸ ¾ ÀÙ«Ñ Ò ÐÓ¸ ¾ Ó Ó׸ ¿ ¿ß¿ Ð ÕÙ ¸ Ó ¬ ÓÒ Ø ÜØÓ¸ ¿ ½ ÓÑÔÐ Ñ ÒØÓ ¸ ¿ Ó ¬ ÓÒ¸ ¿ ÓÑÔÐ Ø Ñ ÒØ ÓÒ ÜÓ¸ ¾ Ò Ö ×Ó Ö Ù Ò ×¸ ¿ ¼ ÓÑÔÐ ØÓ¸ ¾ ÓÔØ Ñ ÓÒ¸ ¿ ¿ ÓÒ Ô ×Ó׸ ½ ÓÒ ÜÓ¸ ¾ Ò ÒØ ÓÒ Ö Ó¸ ¾ Ö ÔÖ × ÒØ ÓÒ Ö ÓР׸ ¾ Ò ÓÒ ÜÓ¸ Ò Ù ÓÒ¸ ¾¿ ÒÓ Ó× LhashTable<Key>¸ ¼ Ø Ö ÓÖ Ö Ó׸ Ò× Ö ÓÒ Ò Ö ÓÐ Ò Ö Ó Ù×ÕÙ ¸ ¿¿ Ø Ö ÓÖ ÒÓ Ó׸ Ò× Ö ÓÒ Ò Ö Þ ×Ù Ö Ó¸ Ò Ö ÓÐ Ò Ö Ó Ù×ÕÙ ¸ ¿ ¿ ØÓØ ÐÑ ÒØ ÓÒ ÜÓ¸ ¾ Ò ¸¿ ¿ Ö Ó× Ò Ò ÖÓ Ù×ÕÙ ÜØ Ò Ó¸ ¿ ÓÐÓÖ ÓÒ¸ Ò× Ö ÓÒ Ò Ø Ð × ÓÒ Ö ×ÓÐÙ ÓÒ ÓÒ Ø Ú ¸ ½ ÓÐ × ÓÒ × ÔÓÖ Ò Ò Ñ ÒØÓ × Ô¹ ÓÖØ ¸ ¾ Ö Ó¸ ¼ ¬Ò ÓÒ ÓÖÑ Ð¸ ½ Ò× Ö ÓÒ Ò Ø Ð × Ð Ò Ð¸ ¼ Ñ ØÖÓ¸ ¿ Ò× Ö ÓÒ ÔÓÖ Ð Ú Ò Ö ÓÐ Ò Ö Ó ÜØ Ò¹ ÑÔ Ö Ñ ÒØÓ¸ ½½ Ó¸ ¿ Graph Node<Node Type>¸ ½ Ò× Ö ÓÒ ÔÓÖ ÔÓ× ÓÒ Ö ÓÐ × Ò Ö Ó× ÜØ Ò Ó׸ ¿ Ô Ò× Ö ÓÒ Ò Ö Þ BinHeap<Key>¸ ¿½¾ Ò ¸¿ ÔÐ ÓÒ ×¸ ¿½¼ Ò× Ö ÓÒ ÓÐ × ÔÖ ÓÖ ¸ ¿¼ Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓ¸ ½ ¸ ½ ØÙ Ð Þ ÓÒ ÙÒ Ð Ñ ÒØÓ¸ ¿¼ Ò× Ö ÓÒ Ò Ö ÓÐ Ð ØÓÖ Þ Ó¸ ÓÒ Ö ÓР׸ ¿½¾ Ò× Ö ÓÒ Ò Ö ÓÐ Ö ÓÐ ÖÓ Ó¹Ò ÖÓ¸ ´ ½ ¸ ÓÒ Ð ×Ø × ÒÐ Þ ×¸ ¿½¾ ¾¼ Ð Ñ Ò ÓÒ¸ ¿¼ Ò× Ö ÓÒ Ò ØÖ Ô¸ Ò× Ö ÓÒ¸ ¿¼¿ ÒØ Ö ÓÖ ¬ÐØÖÓ Ô Ö Ó× Ñ Ò ÑÓ׸ ¼¾ Ö Ó× ÒÓ Ó¸ ¼
  • 913.
    ´ INDICE 887 Ö Ó× ÙÒ Ö Ó¸ ½¼ Ó Ð Ñ ÒØ ÒÐ Þ × Ò Ñ ×¸ ¿ ÒØ Ö Þ Ð ÙÒ ÓÒ × ¸ × ÑÔÐ Ñ ÒØ ÒÐ Þ × ÒÚ Ö ÒØ ׸ ¾½ DynSlist<T>¸ ÁØ Ö ÓÖ ÒÐ × ÑÔÐ ¸ Ö Ó× ÙÒ Ö Ó Ø Ö ÓÖ¸ ¿ ÑÔÐ ÒØ ÓÒ¸ ¼ ÒÓ Ó × ÑÔÐ ¸ ½ Ö Ó× ÙÒ ÒÓ Ó Ö Ó¸ Slink¸ ¸ ½ ÒÓ Ó× ÙÒ Ö Ó Slist<T>¸ ¾ ÑÔÐ ÒØ ÓÒ¸ Ð ×Ø × Ý Ò ¸ Ð ×Ø Ó Ð Ñ ÒØ ÒÐ Þ ¸ ¾ Ò List Graph<Node, Arc>¸ ½ ×Ó Ö Dlink¸ Ð ×Ø × ÒÐ Þ ×¸ ×Ó Ö Dnode<T>¸ Ô Ö Ö ÔÖ × ÒØ Ö Ö ÓР׸ ¾ ¼ Ø Ö ÓÖ List Graph<Node, Arc>¸ Ö Ó× ÙÒ ÒÓ Ó Ö Ó¸ × Ò ÓÒ¸ ÒÓ Ó× ×Ó Ö ÙÒ Ö Ó¸ ÓÒרÖÙ ÓÒ¸ Ð ×Ø × ÑÔÐ Ñ ÒØ ÒÐ Þ ¸ ¿ רÖÙ ÓÒ¸ ÁØ Ö ÓÖ Ö Ó× ×Ó Ö ÙÒ ÒÓ Ó ÑÔÐ ÒØ ÓÒ Ð ÓÔ Ö Ó׸ ¼¼ ÑÔÐ ÒØ ÓÒ¸ ÑÔÐ ÒØ ÓÒ Ð Ð Ñ Ò ÓÒ Ö Ó׸ Ø Ö ÓÖ ×¸ ¾ß Ø Ö ÓÖ × ¬ÐØÖÓ׸ ¼ ß ½¼ ÑÔÐ ÒØ ÓÒ Ð Ð Ñ Ò ÓÒ ÒÓ¹ Ø× ¸ ¾½ Ó׸ ÑÔÐ ÒØ ÓÒ Ð Ò× Ö ÓÒ Ö Ó׸ Ke(G) Ð ÓÖ ØÑÓ¸ ¾½ ÑÔÐ ÒØ ÓÒ Ð Ò× Ö ÓÒ ÒÓ Ó׸ Ð ÙÐÓ¸ ¾½ ÑÔÐ ÒØ ÓÒ Ð Ð ÓÖ ØÑÓ Ð ÙÐÓ ÑÔÐ ÒØ ÓÒ Ð Ð ÑÔ Þ ÙÒ Ö Ó¸ Ke(G)¸ ¾¾ ÃÓÖ ×Ù ÑÔÐ ÒØ ÓÒ Ð Ñ Ô Ó ÒÓ Ó× Ý Ö¹ Ð ÓÖ ØÑÓ Ð ÙÐÓ ÓÑÔÓÒ ÒØ × Ó× ÙÒ Ö Ó¸ Ù ÖØ Ñ ÒØ ÓÒ ÜÓ׸ Ð Ú ÐÓ ¸ ¾½ ÃÖÙ× Ð¸ ÐÓ Ð Ö Ö Ò ¸ ¾¾ ¸ ¾¿¼ Ò Ð × ×¸ ¼½ ×Ô Ð¸ ¾¾ ¸ ¾¿¼ ÓÖÖ Ø ØÙ ¸ ¼½ Ø ÑÔÓÖ Ð¸ ¾¾ ¸ ¾¿¼ Ð ÞÓ¸ ¾ ÐÓÒ ØÙ ÐÑ Ð Ñ ÒÓ Ò Ö ÓР׸ ¾ Ð ÙÒ ÙÒ ØÖ Ô¸ ÐÓÒ ØÙ Ð Ñ ÒÓ Ð ÒØ¸ ¾½ ¬Ò ÓÒ¸ ¾ Ð ×Ø × ÜØ ÖÒÓ Ó Ð Ñ ÒØ ÒÐ Þ × ÓÖÑÙÐ Ò ÙÒ ÓÒ Ð Ñ ÒÓ Ò¹ Dlink¸ Ø ÖÒÓ¸ ¾ Dlist<T>¸ ÒØ ׸ ¾ Dnode<T>¸ ÒØ ÖÒÓ DynDlist<T>¸ ¿ Ð Ñ Ø ×¸ ¾ ÒÐ Óи ÐÓÒ ØÙ Ð Ñ ÒÓ ÒØ ÖÒ ÔÓÒ Ö ¸ ¿ Ø Ö ÓÖ¸ ¾ ÄÙ × Û Þ¸ ¿¾½ ÒÓ Ó Ó Ð ¸ Ñ Ü ÑÓ ÑÔ Ö Ñ ÒØÓ Ô ÖØ Ó¸ ½½ß ½
  • 914.
    888 ´ INDICE Ñ ØÓ Ó Ú × ÓÒ ÓÑÓ ÙÒ ÓÒ × ¸ ¸¾ Ñ ØÓ Ó ÑÙÐØ ÔÐ ÓÒ ÓÑÓ ÙÒ ÓÒ Ò Ö ÓÒ ¸ ¾ ׸ Ö Ó ÙÒ ÒÓ Ó Ò Ö Óи ¾ Ñ ØÓ Ó× Ú ÖØÙ Ð¸ ½¿ ÒÓ Ó Ò ÒØ ¸ ¾ Ñ Ò ÑÓ Óר ­Ù Ó Ñ Ü ÑÓ¸ ¾ ÒÓ Ó Ø ÚÓ¸ ¾ Ñ ÖÓ× Ô Ö Ö Ó׸ ÒÓ Ó Ý ÒØ ¸ ¾ Ñ Ô¸ ¾½ ÆÓ Ó ÙÒ Ö Ó¸ ½ Ñ Ô Ó¸ ¾½ ÒÓ Ó ÜØ ÖÒÓ Ö Ó׸ ÒØ Ò ÙÒ Ö Óи ¾ ÒÓ Ó׸ ¬Ò ÓÒ¸ ¾ Ñ Ô Ó ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ׸ ÒÓ Ó × ÑÔÐ ¸ ½ Ñ ÔÔ Ò ¸ ¾½ ÒÓØ ÓÒ Ñ Ø Ò ¸ ½½ Û Ý¸ ¾ Ñ Ø Ñ Ø × ×Ó Ö Ö ÓР׸ ´¾ ¸ ¿¿¼ ÒÓØ ÓÒ O¸ ½ ß½ ¼ Ñ ØÖ ׸ ½ O Ñ ØÖ Þ ¬Ò ÓÒ¸ ½ Ð ÙÐÓ Ö ÓÒ¸ ½ o¸ ½ ¼ Ò ÓÖØÖ Ò¸ ½ Ω¸ ½ ¼ Å ØÖ Þ Ý Ò ¸ ω¸ ½ ½ Ñ ØÖ Þ Ý Ò ¸ Θ¸ ½ ½ Ñ ÑÓÖÝ Ð ×¸ ¾¾½ ÒÓØ ÓÒ Ò¬ ¸ ½½ Ñ Ö ×ÓÖØ ÒÓØ ÓÒ ÔÖ ¬ ¸ ½½ Ò Ð × ×¸ ½ ÒÓØ ÓÒ ×Ù¬ ¸ ½½ ÖØ ¸ ½ ÒÙÑ ÖÓ ¸ ¾ Ñ Ø ¹ ÓÑÔ Ð ÓÒ¸ ¾½ O¸ ½ ß½ ¼ ÑÞÐ Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓ¸ ½ ¾ß½ Ð Ö O¸ ½ ¾ ÑÞÐ ÖÖ ÐÓ׸ ½ ¾ Ò Ð × × Ð ÓÖ ØÑÓ× Ñ ÒØ O¸ ½ ¾ß ÑÓ ¬ ÓÖ¸ ½ ÑÙÐØ ÓÒ ÙÒØÓ¸ ¾½ ÖÖÓÖ ×¸ ½ o¸ ½ ¼ ÑÙÐØ Ö Ó¸ ÑÙÐØ Ö Ò ¸ ½¿ Ó × ÖÚ ÓÖ¸ ÑÙÐØ Ð ×Ø ׸ ½ ½ Ó ÙÐØ Ñ ÒØÓ Ò ÓÖÑ ÓÒ¸ ¾ Ω¸ ½ ¼ ÑÙÐØ Ñ Ô¸ ¾½ ω¸ ½ ½ ÑÙÐØ ÔÓÔ¸ ½½½ ÑÙÐØ × Ø¸ ¾½ ÓÔ Ö ÓÖ ÐØ¸¿ ÒÙÑ ÖÓ Ø Ð Ò¸ ¿¾ ß¿¿¼ Ò Û¸ ¿½¸ ¿ ÆÙÑ ÖÓ ÛÝ ÓÖ Ò Ð ÙÐÓ¸ ¾ ¼ ÙÒ Ö Óи ¾ ÒÙÑ ÖÓ× ÓÒ ¸ ½¾ ÓÖ Ò Ñ ÒØÓ Ò Ò ¸ ¾½ ß¾¾¼ ר Ð ¸ ½ Net Graph<TNode,TArc,T>¸ Ò× Ö ÓÒ¸ ½ ¸ ½ Ò Û¸ ¿½¸ ¿ Ñ Þ Ð ¸ ½ ¾ß½ Ò Ú Ð ÙÒ ÒÓ Ó Ò ÙÒ Ö Óи ¾ × Ð ÓÒ¸ ½ ¾ß½ Node Arc Iterator¸ ÓÖ Ò Ñ ÒØÓ Ö Ó× ×Ó Ö ÙÒ Ö Ó¸ ¼½ ÒÓ Ó ÇÖ Ò Ñ ÒØÓ Ð ×Ø × ÒÐ Þ ×¸ ½
  • 915.
    ´ INDICE 889 ÓÖ Ò Ñ ÒØÓ ØÓÔÓÐÓ Ó¸ ¼ß ÔÖÓ ÐÑ ×ØÖÙ ØÓÖ × Ú ÖØÙ Ð ×¸ ÓÖ ÒØ ÓÒ ÔÖÓ Ð Ñ Ð ØÖ Ò×ÔÓÖØ ¸ ¿ Ð ÓÒ ÔØÓ¸ ¾¾ ÔÖÓ Ð Ñ Ð ØÖ × ÓÖ Ó¸ ¿ Ð ­Ù Ó¸ ¾¾ ÔÖÓ Ð Ñ ÙÒ Ñ ÒØ Ð ×ØÖÙ ØÙÖ × ÐÓ× ØÓ׸ ¾½ ØÓ׸ ½ ÔÖÓ¬Ð Ò ¸ ¾¾ ÔÖ Ó ÔÖÓ Ö Ñ ÓÒ Ð Ò Ð¸ ¼ß ¾ ÙÑÔÐ ÒÓ׸ ¼½ ÓÒÚ Ö× ÓÒ × ÙÒ Ö Ô Ø ¸ È Ö ØÓ Î Ð Ö Ó¸ ¾¾ ¾ Ô ÖØ ÓÒ Ö ÓÐ × Ò Ö Ó׸ ¿¿ ÓÖÑ ×Ø Ò Ö¸ ¾ Ô ÖØ ÓÒ ¸ ¿¿ ÓÖÑ ÓÐ ¸ Ô ÖØ ÓÒ ¸¿ ÓÖÑ ×Ð ¸ Ô ÖØ ÓÒ Ð ÕÙ ×ÓÖØ¸ ½ × ÑÔРܸ Ô ÖØ ÓÒ ÔÓÖ Ð Ú Ö ÓÐ × Ò Ö Ó× Ü¹ ÔÖÓÔ × ÑØÑØ × ÐÓ× Ö ÓР׸ Ø Ò Ó׸ ¿ ´¾ ¸ ¿¿¼ Ô ÖØ ÓÒ ÔÓÖ ÔÓ× ÓÒ Ö ÓÐ × Ò Ö Ó׸ ÔÖÓÜݸ ¿ ÔÖÙ Ð ¸ ½ Ô ×Ó Ù ÓÒ¸ ½ ½ ÔÖÙ ÓÒ Ø Ú ¸ ½ ¸ Ô Ö¬Ð ¸ ¾¾ ÔÖÙ Ü ×Ø Ò Ñ ÒÓ¸ ¾½¸ ½ ÔÐ ÔÙÒØ ÖÓ× Ý ÖÖ ÐÓ¸ ¿½ Ö ÔÖ × ÒØ ÓÒ × Ò Ñ ÑÓÖ ¸ ½¼ ÔÙÒØÓ ÖØ ÙÐ ÓÒ¸ ¿ ÔÐ × ÔÙÒØÓ ÓÖØ ¸ ¿ ÓÒ ÖÖ ÐÓ׸ ½¼ Ô ÒØ Ó ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ׸ ¾ ÓÒ Ð ×Ø × ÒÐ Þ ×¸ ½½¾ ÔÙÒØÓ× ÓÖØ ÓÒ Ð ×Ø × ÒÐ Þ × Ò Ñ ×¸ ½½ ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ׸ ¼ ÐÐ Ñ × ÔÖÓ Ñ ÒØÓ׸ ½¾¾ Ñ Ô Ó ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ׸ Ö ÙÖ× ÓÒ¸ ½¾¾ Ô ÒØ Ó ÓÑÔÓÒ ÒØ × ÓÒ ÜÓ׸ ¾ ÕÙ ×ÓÖØ¸ ½ ß¾¼¼ Ô ÚÓØ Ò Ð × ×¸ ½ × Ð ÓÒ Ò Ð ÕÙ ×ÓÖØ¸ ½ ¾ Ð Ú × Ö Ô Ø ×¸ ½ ÔÐ ÒØ ÐР׸ ½ ÓÒ Ð ×Ø × ÒÐ Þ ×¸ ½ ÔÐ Ó Ð Ú Ò ÙÒ ÓÒ × ¸ ÖØ ¸ ½ ÔÓÐ ÑÓÖ¬×ÑÓ¸ ½¿ × Ð ÓÒ Ð Ô ÚÓØ ¸ ½ ¾ ÖÒ ¸½ × Ò Ö ÙÖ× ÓÒ¸ ½ ¿ ×Ó Ö Ö ¸ ½ ØÖ ÔÐ Ô ÖØ ÓÒ ×ØÖ ¸ ½ ÔÓÐ ÒÓÑ Ó× ÕÙ ×ÓÖØ ÓÒ ÙÖÖ ÒØ ¸ ½ ÑÔÐ ÒØ ÓÒ ÓÒ Ð ×Ø × ÒÐ Þ ×¸ ½¼¼ ÕÙ ×ÓÖØ Ô Ö Ð ÐÓ¸ ½ ×ÙÑ ¸ ½¼¿ ÈÖ ÙÒØ × Î Ò Ð ¸ ¾½¿ Ê Ò¹Ã ÖÔ ÈÖ Ñ¸ ¼¾ Ù×ÕÙ ×Ù ¹ Ò ×¸ ¿ Ò Ð × ×¸ ¼ ÖÔ Ó ÓÖÖ Ø ØÙ ¸ ¼ Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓ¸ ¾¼¼ ÔÖ Ò Ô Ó realloc¸ ½ È Ö ØÓ¸ ¾¾ Ö ÓÖÖ Ó Ð ¼¹¾¼¸ ¾¾ Ò¬ Ó ÔÖ Ò Ô Ó ¬Ò¹ ¹¬Ò¸ ¾¾ ×Ó Ö Ö ÓÐ Ò Ö Ó¸ ¾ ÔÖ ÓÖ × ÑÔÐ Ø × Ò ØÖ Ô׸ ÔÓÖ Ò Ú Ð ×
  • 916.
    890 ´ INDICE ×Ó Ö Ö ÓÐ Ò Ö Ó¸ ¾ ¸ ¾ ¼ Ð ÓÖ ØÑÓ ÓÖ ¹ ÙÐ Ö×ÓÒ¸ ¿ ÔÖ ¬ Ó Ð ÓÖ ØÑÓ ÑÓÒ ×¹Ã ÖÔ¸ ×Ó Ö Ö ÓÖ × Ò ¸ ¾ ¼ Ñ ÒÓ× ÙÑ ÒØÓ¸ ×Ó Ö Ö ÓÐ Ò Ö Ó¸ ¾ ÓÒ Ô × Ò ÐÓ× ÒÓ Ó׸ ¼ ×Ù¬ Ó ÓÒ Ö Ó× ÒÓ¹ Ö Ó׸ ¼ ×Ó Ö Ö ÓÐ Ò Ö Ó¸ ¾ ÓÖØ Ñ Ò ÑÓ¸ ×Ó Ö Ö ÓÖ × Ò ¸ ¾ ¼ ÓÖØ ׸ ¾ Ö ÓÖÖ Ó Ò ÑÔÐ ØÙ ¸ ½ ¬Ò ÓÒ ×¸ ¿ Ö ÓÖÖ Ó Ò ÔÖÓ ÙÒ ¸ ½¼ ­Ù Ó Ñ Ü ÑÓ¸ Ö ÓÖÖ Ó ÒÓÖ Ò¸ × Ö ÓÖÖ Ó Ò¬ Ó Ò Ö Ñ ÒØÓ ­Ù Ó ÔÓÖ Ñ ÒÓ Ù¹ Ö ÓÖÖ Ó ÔÓרÓÖ Ò¸ × Ö ÓÖÖ Ó ×Ù¬ Ó Ñ ÒØÓ¸ ¾ Ö ÓÖÖ Ó ÔÖ ÓÖ Ò¸ × Ö ÓÖÖ Ó ÔÖ ¬ Ó Ñ Ò Ó Ú Ö Ó× Ù ÒØ × Ó ×ÙÑ ÖÓ׸ Ö ÓÖÖ Ó× ×Ó Ö Ö ÓÖ × Ò ×¸ ¾ ¼¸ ¾ ÓÔ Ö ÓÒ × ØÓÔÓÐÓ ×¸ Ö ÓÖÖ Ó× Ô× Ù Ó¹ Ð Ó× ×Ó Ö Ö ÓÐ × ¹ Ö Ö × Ù Ð¸ Ò Ö Ó׸ ¾ Ö × Ô Ø × ÓÒ ÔÖÓÚ × ÓÒ ­Ù Ó¸ ½¼ Ö ÓÖÖ Ó× ×Ó Ö Ö ÓÐ × Ò Ö Ó׸ ¾ ¿ Ö × Ô Ø × Ò Ö Ð Þ ×¸ ¿ Ö ÓÖÖ Ó× ×Ó Ö Ö Ó׸ ¼ ß Ê × ÓÒ Ö ×ØÖ ÓÒ × Ð Ø Ö Ð ×¸ Ö ÙÖ× ÓÒ Ö × ­Ù Ó¸ ¿ß ¼ ÓÒ× Ó׸ ½¾ Ö ÙÐ ÓÒ ×¸ ½ Ð Ñ Ò ÓÒ¸ ½¾ Ö × ÔÖÓ × Ñ ÒØÓ¸ ÑÙÐ ÓÒ ÐÓ× Ö ×ØÖÓ× Ø ¹ Ê × ÑÙÐØ ¹­Ù Ó¸ Ú ÓÒ¸ ½¾ Ö Ù ÓÒ × Ð ­Ù Ó Ñ Ò ÑÓ¸ ¼ ß ¾ Ð Ñ Ò ÓÒ ØÓØ Ð¸ ½¿¼ Ö ×ØÖÓ Ø Ú ÓÒ¸ ½¾ Ô Ð ×¸ ½¾¾ Ö Ð Ö ÙÖ× ÓÒ ÓÐ È Ö ØÓ¸ ¾¾ Ð Ñ Ò ÓÒ¸ ½¾ Ð ¼¹¾¼¸ ¾¾ Ö ¸ ¿ Ö Ð ÓÒ ÓÖØ ¸ ¾ × Ñ ØÖ ¸ ½ Ö × Ù Ð¸ Ö Ð ÓÒ Ö Ó¸ ¿¼ Ö Ö× ÙÐ Ö ÑÓÚ ÐÐ Ò Ð Ø ´µ¸ ÒÖ Ô Ø ÓÒ Óר ׸ ¾ Ö ÔÖ × ÒØ ÓÒ Ö ÓÐ × Ö Ô Ø ÓÒ ÙÒØÓ× Ò Ó׸ ¾ Ð ÙÐÓ Ñ ÒÓ ÙÑ ÒØÓ¸ ½ Ò ÒØ ÓÒ¸ ¾ Ö Ô Ø ÓÒ Óר ׸ ¾ × Ù Ò Ô Ö ÒØ Þ ¸ ¾ Ö ÓÒ Ô × Ò ÐÓ× ÒÓ Ó׸ ¼ Ö ÔÖ × ÒØ ÓÒ Ö ÓÐ × ÓÒ ÖÖ ÐÓ׸ ¾ ½ Ö Ö × Ù Ð¸ Ö ÔÖ × ÒØ ÓÒ Ö ÓÐ × ÓÒ Ð ×Ø × Ò¹ Ö × Ð Þ ×¸ ¾ ¼ Ñ ÒÓ ÙÑ ÒØÓ Ê ÔÖ × ÒØ ÓÒ ÙÒ Ö ÓÐ Ö ÓÖ Ò ÙÒ Ò Ö Ñ ÒØÓ ­Ù Ó¸ ¾ ÖÖ ÐÓ¸ ¿½ Ô ¸ ¿ Ö ÔÖ × ÒØ ÓÒ × Ò Ñ ÑÓÖ ÙÒ ÓÐ ¸ Ù ÒØ ¸ ¿ ½¿¿ ÔÖ ¹­Ù Ó¸ ¾ ÖÓØ ÓÒ Ò Ö ÓÐ Ò Ö Ó׸ ¿ ½ ×ÙÑ ÖÓ¸ ¿ ÖÓØ ÓÒ Ò Ö ÓÐ × Ò Ö Ó× ÜØ Ò Ó׸ ¿ ¿ Ú ÐÓÖ ­Ù Ó¸ ¿ Ö × Ô Ø × × Ù Ò Ô Ö ÒØ Þ Ô Ö Ö ÔÖ × ÒØ Ö Ö ÓР׸ ¾
  • 917.
    ´ INDICE 891 Ë Û ¸ ¼¿ Ò Ð × ×¸ ¾¼ × Ð ÓÒ Ö ¹ Ñ Ò× ÓÒ Ñ ÒØÓ¸ ¿¼ Ñ ØÓ Ó ÓÖ Ò Ñ ÒØÓ¸ ½ ¾ß½ Ö Ùר Ñ Ò× ÓÒ¸ ¿¼ ÔÓÖ ÔÓ× ÓÒ Ò Ö ÓÐ Ò Ö Ó¸ ¿ ×ÙÔ ÖØÖ Þ ¸ × Ð ÓÒ Ø Ð × × Ð Ò Ð ×¸ ¿¿ß ÔÓÖ ÔÓ× ÓÒ Ò ÖÖ ÐÓ¸ ½ Ù×ÕÙ ¸ ¿ ×Ó Ö ÖÖ ÐÓ׸ ½ Ð Ñ Ò ÓÒ¸ ¼ × Ø¸ ¾½ ÜÔ Ò× ÓÒ¸ ¿ ¸ ¿ × Ø ÓÛÒ¸ ¿¼ Ò× Ö ÓÒ¸ ¼ × Ø ÙÔ¸ ¿¼¿ Ø Ð × × Ô Ö Ø ×¸ ¾ ×ÑÐ Ö Ö ÓÐ × Ò Ö Ó׸ ¾ Ì × ÑÔРܸ ß ¾ Ady Mat<GT, Entry>¸ ß × ÑÔÐ Ü Ö × ­Ù Ó´¸ Bit Mat Graph<GT>¸ ß ½ × ÑÔÐ Ü Ö × ­Ù Óµ¸ DynMapTree<Tree, Key, Range, Compare>¸ Ë Ò ¸ ËØ Ú Ò¸ ¾¾¿ ¿ ß¿ ¿ ×Ð List Graph<Node, Arc>¸ Ò Ñ ÒÓ ÙÑ ÒØÓ¸ Map Matrix Graph<GT>¸ ÔÖÓ Ö Ñ Ð Ò Ð¸ Matrix Graph<GT>¸ ¿ß Slink¸ ArrayStack<T>¸ ½¼ ß½½¾ ×ÓÒ Ó ArrayQueue<T>¸ ½¿ ß½¿ Ð Ò Ð¸ ½ Avl Tree<Key>¸ ß¼ ×ÓÒ Ó Ð BinNode<Key>¸ ´¾ ¸ ¾ ¾ Ò Ð × ×¸ ½ BinNodeXt<Key>¸ ´¿ ¿¸ ¿ ¿ ×Ù Ö Ó ÙÒ Ö Ó¸ BinTree<Key>¸ ´¿¿ ¸ ¿ ×ÙÑ ÔÓÐ ÒÓÑ Ó׸ ½¼¿ Dlink¸ ß ×ÙÑ ÖÓ¸ ¸ ¿ Dlist<T>¸ ß ¿ ×ÙÔ ÖØÖ Þ ¸ ¾½ ¸ Dnode<T>¸ ß ×ÙÔÖ × ÓÒ Ò Ö ÓÐ Ò Ö Ó Ù×ÕÙ ¸ DynArray<T>¸ ½ß ½ ´¿ ¾¸ ¿ ¿ DynDlist<T>¸ ¿ß ×ÙÔÖ × ÓÒ Ò Ö ÓÐ Ð ØÓÖ Þ Ó¸ ¼ DynListQueue<T>¸ ½ ¼ß½ ½ ×ÙÔÖ × ÓÒ Ò ØÖ Ô¸ ¼ DynListStack<T>¸ ½½ ß½½ DynSlist<T>¸ ß Ø Ð × ListQueue<T>¸ ½¿ ß½ ¼ ÓÐ ÙÖ ×Ô Ö× ÓÒ¸ ListStack<T>¸ ½½¾ß½½ ÒØ Ö Þ Ð ÙÒ ÓÒ × ¸ Rand Tree<Key>¸ ß ¾ ÔÐ Ó Ð Ú Ò ÙÒ ÓÒ × ¸ Rb Tree<Key>¸ ½ ß ¾ Ø Ð× × Slink¸ ß ½ ×Ô Ö× ÓÒ Ò× Ö Ø Ö ×¸ ½ Slist<T>¸ ¾ß ×Ô Ö× ÓÒ ÙÒ Ú Ö× Ð¸ ½ Snode<T>¸ ½ß ¾ ÙÒ ÓÒ ×¸ Splay Tree<Key>¸ ¿¾ß ¿ ÙÒ ÓÒ × × ¸ Treap<Key>¸ ß ¾ Ñ Ò Ó ÓÐ × ÓÒ ×¸ ¼½ Tree Node<T>¸ ´¾ ¿¸ ¾ Ö ÓÒ Ñ ÒØÓ ÖØÓ¸ ½ ÌÖ Ò Ò Ò Ñ ÒØÓ¸ ¼¿ Ð ÓÖ ØÑÓ Ô Ö Ð ÙÐÓ ÓÑÔÓÒ ÒØ × Ò Ò Ñ ÒØÓ × Ô Ö Ó¸ ¼¿ Ù ÖØ Ñ ÒØ ÓÒ ÜÓ׸ Ñ Ò Ó ÓÐ × ÓÒ × ÔÓÖ Ö ÓÒ Ñ ÒØÓ Ø ÑÔÐ Ø ×¸ ½ ÖØÓ Ý ×ÓÒ Ó Ð Ò Ð
  • 918.
    892 ´ INDICE Ø ÓÖ Ñ × ÓÑÔÓ× ÓÒ ­Ù Ó¸ ½ Ø ÓÖ Ñ Ð ­Ù Ó Ñ Ü ÑÓ» ÓÖØ Ñ Ò ÑÓ¸ Ø ×Ø Ð ¸ ½ Θ¸ ½ ½ ØÖ× Ò¸ Ø ÔÓ× ×ØÖÙ ØÙÖ ØÓ׸ ¾½ Ø ÔÓ× ÖÖÓÖ ×¸ ¾¼ ÌÓÑ Î Ò Ð ¸ ¾½¿ ÌÖ Ô ¬Ò ÓÒ¸ ØÖ Ô׸ ß Ò Ð × ×¸ ¾ß ¿ Ð Ñ Ò ÓÒ¸ ¼ Ò× Ö ÓÒ¸ ÔÖ ÓÖ × ÑÔÐ Ø ×¸ Tree Node<T> Ù×ÕÙ ÔÓÖ ÒÙÑ ÖÓ Û Ý¸ ¾ ¼ ÓÒÚ Ö× ÓÒ BinNode<Key>¸ ¾ ¾ רÖÙ ÓÒ¸ ¾ ÑÓ ¬ ÓÖ ×¸ ¾ Ó × ÖÚ ÓÖ ×¸ ¾ Ó × ÖÚ ÓÖ × Ö ÓÖ × Ò ×¸ ¾ Ö ÓÖÖ Ó׸ ¾ ÍÅĸ ½¼ ÙÒ ÓÒ Ö ÓÐ × Ò Ö Ó׸ ¿ ÙÒ ÓÒ ¸¿ ÙÒ ÓÒ Ü ÐÙ× Ú Ö ÓÐ × Ò Ö Ó׸ ¿ ½ ÙÒ ÓÒ Ü ÐÙ× Ú Ö ÓÐ × Ò Ö Ó× ÜØ Ò ¹ Ó׸ ¿ ÙÒ ÓÒ Ü ÐÙ× Ú ¸¿ ½ ÙÒ Ù ÓÒ¸ ½ ½ ÙÒ ÓÒ Ü ÐÙ× Ú Ö ÓÐ × Ò Ö Ó× Ð ØÓÖ ¹ Þ Ó׸ ¼ Ú ÐÓÖ ­Ù Ó¸ ¸ ¿ virtual¸ ½¿ Ï Ö× Ðи ¾¿ Ð ÓÖ ØÑÓ Ô Ö Ð Ð Ù×ÙÖ ØÖ Ò× Ø Ú ¸ ½ Ï ÖØ ÕÙ Ð Ö Ó Ô Ö ØÓ¸
  • 919.
    ´ Indice de identificadores ActivationRecord ½¾ ¸ ½¾ Ady Mat ¸ ¸ ¸ ¸ ¾½ ¸ ¾½ ¸ ¾¾ ¸ ¾¿ allocate block ¸ ¸ ¸ allocate bucket ¾ ¸ ¾ allocate dir ¸ ¸ ¾¸ ¾ allocate segment ¸ ¾¸ ¸ ¸ apply ½½ ¸ ½¾½ ¸ ½¾½ ¸ ½¾½ ARC DIST ½ ¸ ½ ArcHeap ¼¿ ¸ ¼ ¸ ¼ ¸ ½¾ ¸ ½ Arc Iterator ¸ ¾¸ ¿¸ ¸ ¸ ¼¸ ¸ ¸ ¼¼ ¸ ½¼ ¸ ¸ ¸ ¸ ¸ ¿½¸ ¿ ¸ ½ ¸ ½ ¸ ¼¿ ¸ ½ ¸ ¾¾¸ ¾ ¸ ¿¾ Arc Node ¾¸ ¾¸ ¿¸ ¿¸ ¸ ¸ ¸ arcs ¿¾¸ ¸ ¸ ¸ ¾ ¸ ¾ ¸ ¿¼ ¸ ¿¿ ¸ ¿ ¸ ¿ ¸ ¿ ¸ ¼ ArrayQueue ½¿ ¸ ½¿ ¸ ¾ ¼ ArrayStack ½¼ ¸ ½½¼ ¸ ½½ ¸ ½½ ¸ ½¾ ¸ ¾ ¸ ¾ ¸ ¾ ¸ ¾ ¸ ¿¾ AvlNode ¸ avl stack ¸ ¸ ¸ ¼¼ ¸ ¼½ ¸ ¼¾¸ ¼¿¸ ¼ avl stack empty ¸ ¼¼ ¸ ¼½ Bellman Ford Node Info ¾ ¸ ¾ binary search ¿¾¸ ¿¿¸ ¿ ¸ ¼ BinNode ¾ ¼ ¸ ¿¿ ¸ ¿ ¸ ¿ ¸ ¿ ¸ ¿ ¸ ¿ ¸ ¿ ¸ ¿ ¸ ¿ ½ ¸ ¿¾ BinNodeVtl ¾ ¼ ¸ ¿¿ ¸ ¿¾ BitArray ¿ ¸ ¿ ¸ ¿ ¸ ¿ ¸ ¿ ¸ ¿ ¸ ¿ ¸ ¿ ¼ ¸ ¿ ½ ¸ ¿ ¾¸ Bit Fields ¼¸ ¾ ¸ ¾ ¸ ¾ ¸ ¾ Bit Mat Graph ¸ ¼ ¸ ¾¸ ¿ BitProxy ¿ ¸ ¿ ¸ ¿ ¸ ¼ Cache Entry ¸ ¸ ¾¸ ¾¸ ¾¸ ¿¸ ¿¸ ¿¸ ¸ ¸ ¸ ¸ ¸ ¸ cache size ¼¸ ¾¸ call hash fct ¿ ¸ ¿ ¸ ¼ chunk list ¾¸ ¾¸ clean avl stack ¸ ¸ ¼¼ ¸ ¼½ ¸ ¼½ ¸ ¼¾¸ ¼ Compare Arc Data ½ Compare Dnode ½ ¸½ ¸½ Complejo computeHeightRec ¾ ¸¿ ¼ compute optimal costs ¿ ¸¿ ¼ ¿
  • 920.
    894 ıtulo . ´ Cap´ Indice de identificadores compute tree ¿ ¸ ¿ ½ contract ¿ ¸ ¼ copy list graph ¾¸ ¾¸ ¿¸ ¼¸ ¼ copyRec ¾ ¸¿ ½ COST ¿ ¸ ¿ ¼ ¸ ¿ ¼ ¸ ¿ ¼ ¸ ¿ ½ Cross Arc ¾¸ ¾¸ ¿ deallocate bucket ¾ ¸ ¾ DECLARE BINNODE ¾ ¸ ¾ ¼ ¸ ¿½ ¸ DECLARE BINNODE SENTINEL ¾ ¸ ¿ ¿¸ ¸ ¸ ½ decrease probe counter ¾ ¸ ¾ destroyRec ¾ ¸ ¿ ½ ¸ ¿ ¾ Dijkstra Arc Info ½ ¸ ½ ¸ ½ Dijkstra Heap Info ½¾ ¸ ½ Dijkstra Node Info ½¾ ¸ ½¿ ¸ ½¿ ¸ ½¿ Distance Compare ¸ ¸ ¼¿ ¸ ¼¿ ¸ ¼ DLBucket ¿¾ ¸ ¿¿ ¸ ¿¿ ¸ ¿¿ ¸ ¿¿ dlink lru ¸ ¸ DLINK TO TYPE ¿ Dnode ¸ ¸ ¸ ¼¸ ¾¸ ¿¸ ¿¸ ¸ ¸ ¸ ¸ ¸ ¸ ¸ ¸ ¸ ¸ ¸ ¸½ ¸½ ¸½ ¸½ ¸½ ¸½ ¸ ¼ ¸ ¼ ¸ ¾ do mru ¿¸ ¿¸ doubleRotateLeft ¼¼ doubleRotateRight ¼¼ DynArray ¾¸ ¸ ½ ¸ ½ ¸ ¾ ¸ ¸ ¸ ¸ ½ ¸ ¾ ¾¸ ¿¿¾ ¸ ¿ ¸¿ ¼ ¸¿½¸ ¿ ½ ¸ ¿¾¸ ¸ ¸ ¼¸ ½¸ ½¸ ¸ ¸ ¸ ¼¸ ¾ ¸ ¿ ¸ ¾¸ DynDlist ¿¸ ¿¸ ¸ ¸ ¸ ¸ ¸ ¸ ¸ ¸ ¸ ¸ ¸ ¸ ½¼¾ ¸ ½¼ ¸ ½¼ ¸ ½¼ ¸ ½ ¸ ¾¾¼¸ ¾ ¿ ¸ ¾ ¸ ¼¿ ¸ ¼ ¸ ¼ ¸ ¿ ¸ ¿ ¸ ¸ ¸ ¸ ¸ ¸ ¸ ¸ ¾ ¸ ¿ ¸ ¿ ¸ ¸ ½ ¸ ½ ¸ ¾¸ ¿¸ ½¸ ¸ ¼¿ ¸ ½ ¸ ½ ¸ ½ ¸ ¾¿ ¸ ¾¿ ¸ ¾ DynListQueue ½ ¼ ¸ ½ ¸ ¾ ¸ ¾ ¸ ¿¼ ¸ ¾¸ ¿¸ ¿¾¸ ¿¿ ¸ ¸ DynListStack ½½ ¸ ½½ ¸ ¾¼½¸ ¸ ¿¸ ¸ ¸ ¸ DynSlist ¸ expand ¿ ¸ ¼¸ Figure ¸ ¸ ¸ ½¾¸ ½ fill dir to null ¸ fill seg to null ¸ Filter Iterator ¼ ¸ ¼ ¸ ¼ ¸ ½¼ ¸ ½¼ find min path ¾¾ ¸ ¾¾ ¸ ¾ find succ and swap ¾¼ fix black condition ¾¼¸ ¾¾ FixedStack ½¼ ¸ ½ ¿ ¸ ¸ ½ fix red condition ½ ¸ ½ floyd all shortest paths ¾½ ¸ ¾½ GenDlist ½¸ ½¸ ¾ GenLhashTable ¼ ¸ ¼ Gen Rand Tree ¸
  • 921.
    895 Gen Treap ¸ get lru entry ¿¸ get min arc ¼ ¸ ¼¸ ½ Graph Arc ¸ Hash Cache ¸ ¾¸ inconnected components ¿¸ ¿ index in block ¸ ¿¸ ¿¸ ¸ index in dir ¸ ¿¸ ¿¸ ¿¸ ¸ ¸ ¸ index in seg ¸ ¿¸ ¿¸ ¿¸ ¸ ¸ ¸ Initialize Dist Floyd ¾¾ ¸ ¾¿ Init Prim Info ¼ ¸ ¼ insert entry to lru list ¾¸ ¾¸ ¸ insert in binary search tree ¿¿ ¸ ¿¿ ¸¿ insert root ¿ ¸ ¿ insert root xt ¿ ¸ insert sorted ½ ¸ ½ inside list ¼¸ ¸ join exclusive ¿ ½ ¸ ¿ ¿ ¸ ¿ join exclusive xt ¿ ¸¿ ¼ ¸¿ ¼ LhashBucket ¼ ¸ ¼ ¸ ¿ LhashTable ¼ ¸ ¿¾ ¸ ¿¾ ¸ ¿¿ ¸ ¿¿ ¸ ¿¿ ¸ ¸ LhashTableVtl ¼ LINKNAME TO TYPE ¿¸ ¾ ¸ List Digraph ½¸ ¸ List Graph ¼¸ ¼¸ ½¸ ¸ ¸ ¸ ¸ ¸ ¸ ¸ ¸ ¼¸ ¼¸ ½¸ ½¸ ¸ ¸ ¸ ¸ ¸ ¸ ¼½ ListQueue ½¿ ¸ ½¿ ¸ ½¿ ¸ ½ ¼ ListStack ½½¾ ¸ ½½¿ ¸ ½½ ¸ ½½ ¸ ½½ ¸ ½½ lru list ¸ ¾¸ ¿¸ ¿¸ ¿¸ Matrix Graph ¿¸ merge ½ ¾¸ ½ ¿ mergesort ½ ¾¸ ½ ¸ ¼½ min index ¿ ¼ ¸ ¿ ½ Node Arc Iterator ¸ ¸ ¸ ¸ ¸ ¼ ¸ ½¾ ¸ ½ ¸ ½ ¸ ½ ¸ ½ ¸ ¾¾ ¸ ¾¾ ¸ ¾ ¸ ¾ ¸ ¾ ¸ ¾ ¸ ¿¼ ¸ ¿ ¸ ¿ ¸ ¸ ¸ ¿¸ ¿¸ ¿¸ ¸ ¾¸ ¸ ¸ ¾¸ ¾¸ ¸ ¸ ½ ¸ ¾¸ ¿¸ ¼ ¸ ¼ ¸ ½ ¸ ½ ¸ ¿¿ ¸ ¼¸ ½¸ ¸ ¸ ¸ ½ ¸ ½ ¸ ¾¿ Node Iterator ¸ ¾¸ ¿¸ ¸ ¸ ¼¸ ¸ ¼¼ ¸ ½¼ ¸ ¾¼ ¸ ¿ ¸ ¸ ¾¸ ¾¸ ¸ ¸ ¸ ¾¸ ¿¸ ¸ ¸ ½ ¸ ¾¸ ¿¸ ¾ ¸ ½ ¸ ¼¾ ¸ ½ ¸ ¾¾¸ ¾¿ ¸ ¾¿ ¸ ¾ Null Value ¸ ¸ ¸ ¸ ¸ ¸ ¸ ODhashTable ¾¸ ¾ operate all arcs list graph ¸ ¸ operate all arcs matrix ¸ ¸ ¾¿ partition ½ ¸ ½ ¸ ½ ¼¸ ½ ¿ ¸ ½ ¸ ½ ¸ ½ Path ¼¾ ¸ ¼¿ ¸ ¼¿ ¸ ¼ ¸ ¼ ¸ ¾¿ ¸ ¾¿ ¸ ¾ ¸ ¾ ¸ ¾ ¸ ¾ ¸ ¾ ¸ ¾ ¸ ¾ ¸
  • 922.
    896 ıtulo . ´ Cap´ Indice de identificadores ¸ ½ ¸ ½ ¸ ½ ¸ ¾¾ ¸ ¾¾ ¸ ¾ ¸ ¿ ¸ ¼¸ ½¸ ¾ ¸ ¿¸ ¼ ¸ ¼ ¸ ¼ ¸ ¿¿¸ ¿ Path Desc ¼¿ ¸ ¼¿ ¸ ¼¿ ¸ ¼ ¸ ¼ ¸ ¼ POT ½ ¸ ½ ¸ ½ ¸ ½ precedence ½½ ¸ ½¾½ pred ¿¾¸ ¾ ¸ ¾ ¸ ¿¼ ¸ ¿¿ ¸ ¿ ¸ ¿ ¸ ¼ Prim Heap Info ¼ ¸ ¼ Prim Info ¼ ¸ ¼ push in splay stack ¿¿ ¸ ¿¿ ¸ ¿ ¸ ¿ put arc ¼¸ ¼ ¸ ¼¸ ½ ¸ ½ quicksort ½ ¿ ¸ ½ ¸ ¾ ¸ RandNode ¸ RandNodeVtl ¸ random insert ¸ ¼ random join exclusive ¼¸ ½ random remove ½¸ ½ RbNode ½¸ ½ read matrix ½¸ ½ release all segments and blocks ¸ release block ¸ ¸ release blocks and segment release segment ¸ ¸ remove entry from hash table ¿¸ remove entry from lru list ¾¸ remove from search binary tree ¿ ¿ ¸ ¿ ¿ ¸¿ restore avl ¼¼ ¸ ¼½ ¸ ¼ restore avl after deletion ¼½ ¸ ¼ restore avl after insertion ¸ ¼¼ rotateLeft ¼¼ rotateRight ¼¼ rotation type ¸ ¼¼ search and push in splay stack ¿¿ ¸ ¿ ¸ ¿ ¸ ¿ search and stack avl ¸ ¸ ¼½ search and stack rb ½ ¸ ½ ¸ ¾¼ searchInBinTree ¿¿¾ ¸ ¿¿ search min ½ ¿ ¸ ½ ¸ ½ select gotoup root ¸ sequential search ½ ¸ ¿ ¸ ½ ¸ ½ ¸½ ¸½ set list graph ¼¸ ¿ Slink ¸ ¸ ¸ ¸ ¸ ½¸ ½¸ ¾¸ ¾¸ SLINK TO TYPE ½ Slist ¾¸ ¿ ¸ ¿¸ ¸ ¸ Snode ½ ¸ ¾ ¸ ¾ ¸ ¾ ¸ ¾ ¸ ¾ ¸ ¸ ½½¾ ¸ ½½¿ ¸ ½¾ ¸ ½¾ ¸ ½¿ splay ¿ ¸ ¿ ¸ ¿ ¸ ¿ split key rec ¿¿ ¸ ¿ ½ ¸ ¿ split key rec xt ¿ ¸ ¿
  • 923.
    897 split pos rec¿ ¸¿ str to token ½½ ¸ ½¾¼ sum p ¿ ¼ ¸ ¿ ¼ Termino ½¼¾ ¸ ½¼¾ ¸ ½¼¾ ¸ ½¼¾ ¸ ½¼¾ ¸ ½¼¿ ¸ ½¼¿ ¸ ½¼ ¸ ½¼ ¸ ½¼ ¸ ½¼ ¸ ½¼ ¸ ½¼ Token Type ½½ ¸ ½½ ¸ ½¾¼ TreapNode ¸ TREE ¿ ¸ ¿ ¼ ¸ ¿ ¼ ¸ ¿ ¼ ¸ ¿ ½ TREEARC ½ ¸ ½ ¸ ½ zig type ¿ ¸ ¿