Абсолютно согласен! Но вы же должны понимать, что все, что представляется в данном топике имеет чисто спортивный интерес.
Кстати, если переписать на PHP 5.3 (с замыканиями), то думаю график еще уменьшился бы.
Переделал реализацию заново, с минимальным использованием функций PHP.
Заранее предупреждаю: это чисто спортивный интерес, реализовывать quicksort на PHP (да еще и так!) не нужно!
Получилась вообще какая-то вакханалия…
Подсмотрел, что нахваливаемый всеми Haskell добивается такого графа за счет того, что программа уважаемого автора (точнее GraphViz) не учитывает в качестве слов последовательности меньшие по длине, чем 2 буквы. Соответственно, модифицировал исходник и получил вот что:
Угадал оба! Но скорее не в силу экстрасенсорных способностей, а потому что по невнимательности не заметил ассемблер и алгол :). Ну а с хаскеллом все ясно было с самого начала.
На мой взгляд это неправильно. Тут владельцы проекта должны решать, что им нужно индексировать, а что — нет. Лучше уж потратить часть времени на то, чтобы сделать выдачу части закрытого материала только для поисковых ботов, чем запросто отдать все логины и пароли неизвестно кому.
Интеграция в ZF Dojo мне непонятна… А мне, например ExtJS нравится, и что???
А вот интеграция SOAP (наконец-то!!!) — это очень большой плюс.
Кстати, есть еще одно добавление, которое не указано в списке:
В ZF 1.6.0 можно использовать UNION в Zend_Db_Select!
Например так:
Что я хочу (в порядке приоритета):
1. Уважительное отношение к работникам — не только ко мне лично (никаких «эй, слыш, сгоняй за пивом» или «я не помню как тебя зовут, но у меня для тя проект есть»)…
2. Не следить за тем, что я делаю в тот или иной момент. Если я на удафф.коме, но при этом как-то укладываюсь в сроки, то просто радуйся.
3. Не лезть в мою работу, если не понимаешь. Не указывать мне как выполнять задание.
4. Не лезть ко мне с нравоучениями (об успешности, о том, как нужно работать, как классно живут в Европе, Америке и т.д.)
5. Очень желательно — компетентность руководства в своих обязанностях. Как показывает практика, обычно — это только мечты.
Что для меня необязательно (или даже нежелательно):
1. Нефиксированный рабочий день (я могу себя заставить встать рано утром, хотя и очень не хочется)
2. Бесплатная еда в офисе (это я вообще воспринимаю даже, как нежелательный момент. Некоторые работодатели думают, что если они купили в офис за свой счет пачку чая, то работники должны ползать перед ними на коленях)
п.6 и п.7 говворят о том, что пользователь сам несет ответственность за сохранность своих паролей, но ни слова нет о том, что Гугл не претендует на эти данные.
Ничего подобного. Прочитайте определение Content и Services. Services — это любой сайт, веб-сервис или приложение Гугла. То есть Chrome относится к Services. А по поводу Content не путайте п.8, который говорит о правах на контент третьей стороне, с п.11, который говорит о содержимом с вашими авторскими правами. В п.11 нигде не сказано, что это относится к сервисам третьей стороны.
Я не юрист, но слово «заключаемого» меня приводит в замешательство… Тут важен нюанс, является ли нажатие на кнопку «да, я согласен» заключением юридического соглашения.
На той странице — это единственная нерекурсивная реализация алгоритма. Отсюда и сложность!
Кстати, если переписать на PHP 5.3 (с замыканиями), то думаю график еще уменьшился бы.
Заранее предупреждаю: это чисто спортивный интерес, реализовывать quicksort на PHP (да еще и так!) не нужно!
Получилась вообще какая-то вакханалия…
function q($s) { $l = count($s); $r = $s; if ($l != 0) { $x = $y = $r = array(); $d = $f = 0; $k = $s[0]; for($i=1; $i < $l; $i++) { if($s[$i] <= $k) { $x[] = $s[$i]; $d++; } else { $y[] = $s[$i]; $f++; } } $a = q($x); $b = q($y); for($i=0;$i<$d;$i++){ $r[] = $a[$i]; } $r[] = $k; for($i=0;$i<$f;$i++){ $r[] = $b[$i]; } } return $r; }Ну и результат:
Вы-то строили при 2.
Вот я и пытаюсь выправить положение :)
function q($s) { $f = array('count', 'array_shift', 'array_filter', 'create_function', 'array_diff', 'array_merge'); $l = $f[0]($s); $r = $s; if ($l != 0) { $x = $y = $m = array(); $k = $f[1]($s); $x = $f[2]($s, $f[3]('$s', 'return $s <= '.$k.';')); $y = $f[4]($s, $x); $m[] = $k; $r = $f[5](q($x), $m, q($y)); } return $r; }Правда, получился уже какой-то ассемблер.
Вот результат:
function mine_quicksort($seq) { $f = array('count', 'array_shift', 'array_filter', 'create_function', 'array_diff', 'array_merge', 'mine_quicksort'); $l = $f[0]($seq); $r = $seq; if ($l != 0) { $x = $y = array(); $k = $f[1]($seq); $x = $f[2]($seq, $f[3]('$s', 'return $s <= '.$k.';')); $y = $f[4]($seq, $x); $r = $f[5]($f[6]($x), array($k), $f[6]($y)); } return $r; }Теперь граф выглядит так:
function mine_quicksort($seq) { $length = count($seq); if ($length == 0) { return $seq; } $x = $y = array(); $k = array_shift($seq); $x = array_filter($seq, create_function('$s', 'return $s <= '.$k.';')); $y = array_diff($seq, $x); return array_merge(mine_quicksort($x), array($k), mine_quicksort($y)); }… что, однако, не повлияло, как мне показалось, на красивость графа:
А вот интеграция SOAP (наконец-то!!!) — это очень большой плюс.
Кстати, есть еще одно добавление, которое не указано в списке:
В ZF 1.6.0 можно использовать UNION в Zend_Db_Select!
Например так:
$adapter = $this->getAdapter(); $criteria = $adapter->select() ->from($adapter->select()->union(array( $adapter->select() ->from($this->_name, array('user_id', 'x' => "('user_name')")) ->where('user_name=:user_name') ->limit(1), $adapter->select() ->from($this->_name, array('user_id', 'x' => "('email')")) ->where('email=:email') ->limit(1) ), Zend_Db_Select::SQL_UNION_ALL), array( 'user_id' => 'GROUP_CONCAT(user_id)', 'x' => 'GROUP_CONCAT(x)') ); $duplicate = $adapter->fetchRow($criteria, array('user_name' => $user_name, 'email' => $email));1. Уважительное отношение к работникам — не только ко мне лично (никаких «эй, слыш, сгоняй за пивом» или «я не помню как тебя зовут, но у меня для тя проект есть»)…
2. Не следить за тем, что я делаю в тот или иной момент. Если я на удафф.коме, но при этом как-то укладываюсь в сроки, то просто радуйся.
3. Не лезть в мою работу, если не понимаешь. Не указывать мне как выполнять задание.
4. Не лезть ко мне с нравоучениями (об успешности, о том, как нужно работать, как классно живут в Европе, Америке и т.д.)
5. Очень желательно — компетентность руководства в своих обязанностях. Как показывает практика, обычно — это только мечты.
Что для меня необязательно (или даже нежелательно):
1. Нефиксированный рабочий день (я могу себя заставить встать рано утром, хотя и очень не хочется)
2. Бесплатная еда в офисе (это я вообще воспринимаю даже, как нежелательный момент. Некоторые работодатели думают, что если они купили в офис за свой счет пачку чая, то работники должны ползать перед ними на коленях)