Разработка динамических сайтов
SEO услуги
Управление контекстной рекламой

Вход на хостинг

Имя пользователя:*

Пароль пользователя:*

IT-новости

20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла

Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......

подробнее

30.07.2015 Ищем уникальный контент для сайта

Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......

подробнее

11.05.2015 Распространённые ошибки разработчиков сайтов

Не секрет, что в сети Интернет насчитывается миллионы сайтов, и каждый день появляются тысячси новых......

подробнее

Всю описанную здесь процедуру можно записать короче и без использования временных массивов:

Листинг 6

 

# Оптимизированная сортировка строк по алфавиту без учёта регистра; короткая форма без временных массивов

@sorted =

    map {$_->[1]}

    sort {$a->[0] cmp $b->[0]}

    map {[uc, $_]} @unsorted;

Эта конструкция известна как преобразование Рэндала Шварца[8].

Последний код выглядит гораздо более изящно, но иногда уместнее использовать первый вариант (листинг 5) или некий гибридный подход. Например, это полезно, когда критерий сортировки используется многократно, или в тех случаях, когда целесообразно рассчитывать сразу несколько критериев.

В следующем примере мы создаём два сортированных без учёта регистра списка: по алфавиту и в обратном алфавитном порядке. При этом uc вызывается только один раз для каждого элемента.

Листинг 7

 

# Создание двух сортированных без учёта регистра списков; вдвойне оптимизированная реализация

@temp_unsorted = map {[uc, $_]} @unsorted;

@sorted_a2z = map {$_->[1]}

    sort {$a->[0] cmp $b->[0]} @temp_unsorted;

@sorted_z2a = map {$_->[1]}

    sort {$b->[0] cmp $a->[0]} @temp_unsorted;

Помимо выигрыша, который дала бы оптимизация каждой отдельной сортировки, здесь мы получили дополнительный выигрыш. Если просто дважды применить классическое преобразование Рэндала Шварца, то на одну сортировку потребовалось бы два вызова map. Здесь же на каждую сортировку приходится полтора вызова map (три map на два sort). Причём реальный выигрыш ещё больше, так как дважды выполняется процедура map, восстанавливающая данные, а процедура расчёта критерия сортировки (более ресурсоёмкая, чем восстановление данных) выполняется всего один раз на две сортировки. То есть для каждой из двух сортировок на один элемент понадобилась половина, если можно так сказать, вызова uc. Впечатляющий результат?! Особенно, если вспомнить, что если бы мы просто дважды использовали неоптимизированный код, аналогичный приведённому в листинге 4, применительно к массиву из миллиона строк, то каждая строка была бы преобразована к верхнему регистру без малого сто раз (более 86 раз).


Предыдущая страницаОглавлениеСледующая страница
 
[001] [002] [003] [004] [005] [006] [007] [008] [009] [010] [011] [012] [013] [014] [015] [016] [017] [018] [019] [020]
[021] [022] [023] [024] [025] [026] [027] [028] [029] [030] [031] [032] [033] [034] [035] [036] [037] [038] [039] [040]
[041] [042] [043] [044] [045] [046] [047] [048] [049] [050] [051] [052] [053] [054] [055] [056] [057] [058] [059] [060]
[061] [062] [063] [064] [065] [066] [067] [068] [069] [070] [071] [072] [073] [074] [075] [076] [077] [078] [079] [080]
[081] [082] [083] [084] [085] [086] [087] [088] [089] [090] [091] [092] [093] [094] [095] [096] [097] [098] [099] [100]
[101] [102] [103] [104] [105] [106] [107] [108] [109] [110] [111] [112] [113] [114] [115] [116] [117] [118] [119] [120]
[121] [122] [123] [124] [125] [126] [127] [128] [129] [130] [131] [132] [133] [134] [135] [136] [137] [138] [139] [140]
[141] [142] [143] [144] [145] [146] [147] [148]

+7 (831) 413-63-27
ООО Дельта-Технология ©2007 - 2023 год
Нижний Новгород, ул. Дальняя, 17А.
Rambler's Top100