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

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

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

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

IT-новости

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

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

подробнее

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

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

подробнее

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

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

подробнее

@temp_unsorted =

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

@temp_sorted =

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

@sorted =

    map {$_->[1]} @temp_sorted;

Здесь нам встречается оператор map, позвольте сказать два слова о нём для тех, кто не знаком с Perl. Оператор map получает в качестве аргументов блок операторов и массив; блок операторов применяется последовательно к каждому элементу массива, в каждой итерации переменная $_[7] становится синонимом очередного элемента; все результаты итераций возвращаются оператором в виде массива результатов.

Давайте теперь посмотрим, как работает последний листинг.

Сперва (первый вызов map), мы создаём временный несортированный массив @temp_unsorted, состоящий из указателей на двухэлементные массивы. Нулевой элемент каждого из них содержит критерий сортировки. В нашем случае это строка в верхнем регистре. Первый элемент содержит оригинальную (исходную) строку. Созданная нами конструкция напоминает двумерный массив. В Perl не предусмотрено многомерных массивов, их роль выполняют массивы указателей на массивы. В данном случае нам нужно именно это, и при реализации подобного подхода на других языках понадобится скорее всего нечто подобное. Работа с настоящим двумерным массивом в этой ситуации может оказаться менее эффективной (в зависимости от конкретной реализации двумерных массивов в языке).

Затем (вызов sort) мы сортируем временный массив @temp_unsorted, используя в качестве критерия сортировки нулевые элементы анонимных двухэлементных массивов. В переменной @temp_sorted получаем уже отсортированный массив указателей на наши двухэлементные массивы.

Наконец (второй вызов map), восстанавливаем отсортированный массив @sorted, извлекая оригинальные строки из первых элементов анонимных массивов, указатели на которые составляют @temp_sorted.

Вы уже заметили, что теперь мы вычисляем uc ровно столько раз, сколько у нас сортируемых элементов. Это прогресс! Но теперь кроме sort мы дважды вызываем map. Это лишняя трата времени. Тем не менее, затраты времени на выполнение map растут пропорционально количеству элементов в массиве @unsorted, а экономия времени на выполнение процедуры sort растёт пропорционально количеству сравнений, то есть гораздо быстрее, чем прямая пропорциональность количеству элементов.

Одним словом, при достаточном количестве элементов мы обязательно снизим суммарный расход времени на сортировку. Какое количество элементов следует считать «достаточным»? Это зависит от сложности критерия сортировки. Часто (но не всегда), чем сложнее критерий (тот критерий, который сформулирован в блоке оператора sort), тем меньше надо элементов, чтобы почувствовать выигрыш; но, чем сложнее процедура вычисления критерия (та процедура, которая находится в map), тем больше надо элементов, чтобы выигрыш стал ощутимым. Подробнее это обсудим совсем скоро, а пока рассмотрим детальнее наш последний код.


Предыдущая страницаОглавлениеСледующая страница
 
[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