Главная страница


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Andrey Sapozhnikov                   2:5020/400     01 Feb 2002  16:06:30
 To : Artem Chuprina
 Subject : Re: Как из списка @list   удалить скаляр $num
 -------------------------------------------------------------------------------- 
 
 Artem Chuprina wrote:
 
 > Здравствуй, kan.
 > 
 > k> А может тебе лучше хэш поюзать? Тогда алгоpитм будет логаpифмический.
 > 
 > Какой-какой? У хэша он в норме O(1).
 Ошибаетесь, на размерах хэша превышающих разрядность hash-функции
 он близок к O(log N). А разрядность выбирают малой, для экономии памяти.
 К примеру, пусть для ключа "ILoveMyBraveDog" значение hash-функции
 будет: 0xffee3322. Так вот врядли кто станет использовать таблицу
 в 4 миллиарда ячеек для такого хэша. Его обычно разбивают так:
 
 HASH_TABLE_LEVEL1[0xff]->HASH_TABLE_LEVEL2[0xee]->...
 
 и даже в этом случае таблички длиной в 256 делают списками
 реально существующих элементов. И время просмотра этих списочков
 растет. "Чистый" хэш дает O(0), но реализации чистого хэша возможны
 лишь в константном варианте, когда подобрана абсолютная хэш-функция
 для данного набора ключей (см. например man gperf и исходники gcc).
 
 А теперь вернемся к жизни. В исходниках perl-5.6.1, файл hv.c,
 функция Perl_hv_fetch:
 
 ...
      entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
      for (; entry; entry = HeNEXT(entry)) {
          if (HeHASH(entry) != hash)              /* strings can't be equal */
              continue;
          if (HeKLEN(entry) != klen)
              continue;
          if (memNE(HeKEY(entry),key,klen))       /* is this it? */
              continue;
          return &HeVAL(entry);
      }
 ...
 выясняем, что перлу пофиг на теорию. Он ищет перебором, O(N). А хэш-значения
 использует только для ускорения сравнения ключей. Т.е. ключи сравниваются только
 после того, как оказались равны хэш-значения и длины ключей. Вывод: не хотелось
 бы разочаровываться в Ларри, ну да поживем - увидим. Через годик-пять Перл 6
 появится...
 
 Андрей
 
 --- ifmail v.2.15dev5
  * Origin: Demos online service (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Как из списка @list удалить скаляр $num   Andrey Titov   30 Jan 2002 21:35:48 
 Re: Как из списка @list удалить скаляр $num   Andrey Sapozhnikov   30 Jan 2002 22:00:27 
 Re: Как из списка @list удалить скаляр $num   Andrey Titov   30 Jan 2002 22:43:32 
 Как из списка @list удалить скаляр $num   kan   31 Jan 2002 11:34:13 
 Re: Как из списка @list удалить скаляр $num   Artem Chuprina   01 Feb 2002 13:02:11 
 Re: Как из списка @list удалить скаляр $num   Andrey Sapozhnikov   01 Feb 2002 16:06:30 
 Re: Как из списка @list удалить скаляр $num   Artem Chuprina   01 Feb 2002 17:18:39 
 Re: Как из списка @list удалить скаляр $num   Andrey Sapozhnikov   01 Feb 2002 20:17:26 
 Re: Как из списка @list удалить скаляр $num   Konstantin Stupnik   01 Feb 2002 14:12:12 
 Как из списка @list удалить скаляр $num   Aleksey Kotov   31 Jan 2002 17:47:39 
 Re: Как из списка @list удалить скаляр $num   Andrey Sapozhnikov   31 Jan 2002 20:01:19 
 Как из списка @list удалить скаляр $num   Aleksey Kotov   01 Feb 2002 00:24:10 
 Как из списка @list удалить скаляр $num   Ivan Frolcov   01 Feb 2002 20:37:24 
 Re: Как из списка @list удалить скаляр $num   Artem Chuprina   01 Feb 2002 20:33:50 
 Re: Как из списка @list удалить скаляр $num   vitus@ice.ru   01 Feb 2002 20:37:57 
 Re: Как из списка @list удалить скаляр $num   vitus@ice.ru   30 Jan 2002 22:55:51 
 Re: Как из списка @list удалить скаляр $num   Andrey Sapozhnikov   31 Jan 2002 03:18:28 
 Re: Как из списка @list удалить скаляр $num   Artem Chuprina   31 Jan 2002 12:26:01 
 Re: Как из списка @list удалить скаляр $num   Andrey Sapozhnikov   31 Jan 2002 17:37:14 
 Re: Как из списка @list удалить скаляр $num   Andrey Titov   01 Feb 2002 16:12:41 
 Как из списка @list удалить скаляр $num   Michael Savin   31 Jan 2002 04:51:33 
 Re: Как из списка @list удалить скаляр $num   Andrey Sapozhnikov   31 Jan 2002 02:57:57 
Архивное /ru.perl/5284a4176e3c.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional