Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> задача от Yandex, ваше мнение 
:(
    Опции темы
dva300
Дата 4.9.2010, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 17.2.2010
Где: Москва

Репутация: -1
Всего: 1



Доброго дня,
Давиче столкнулся с задачей которую якобы предлагали на собеседовании Perl программиста в Yandex.
Суть : Есть файл со строками. В каждой строке число, характеризующее время, за которое отработан некоторый поисковый запрос. Числа в файле принадлежат типу double и имеют как минимум 10 значимых цифр после запятой. Задача - посчитать в какое время не уложилось 10% самых медленных запросов.

Все бы ничего если бы не следующий комментарий - файл состоит из минимум 10млрд строк !!! И естественно файл не отсортирован и возможны дырки между числами.

Посидел, подумал. Интересно однако стало smile 
Вспомнил пару алгоритмов и максимум что у меня получилось это 46 секунд на 1млн (на 10млн получил 413 сек, дальше не пробовал ) что при даже самых скромных вычислениях даст ~ 127 часов на 10млдр smile 

Собственно вопрос - как решить задачу в приемлемые сроки. Какой алгоритм использовать ? Свои результаты получал на половинчатом делении. Ниже реализация.
Будет интересно послушать ваше мнение относительно данной задачи.

Код

use strict;

my $p = $ARGV[0] || 10;
my $file_name = $ARGV[1] || "yandex.txt";

my $tstart = time();
my ($max,$count,$count_of_str,$pc) = (0,0,0,0);
open(FF,"$file_name") or die "$!";
while(<FF>)
    {
    chomp;
    if ($_ > $max)
        {
        $max = $_;
        }
    }
$count_of_str = $.;    
close(FF);

$pc = ($count_of_str*$p) / 100;

print "Max = $max, Count of str = $count_of_str, \$p = $p% [ $pc ]\n";

my $bb = $max / 2;
my $ab = $max - $bb;
my $error = 0.00000000001;
my ($f1,$f2,$abl,$cofo) = (0,0,0,1);

open(FF,"$file_name");
while(1)
    {
    $count = 0;
    while(<FF>)
        {
        chomp;
        if ($_ > $ab)
            {
            $count++;
            last if ($count > $pc);
            }
        }    
    last if (($pc - $count) >= 0 && abs($ab - $abl) <= $error);    
    $abl = $ab;
    if ($count > $pc) 
        {
        $f1 = 1;
        print "[ + ]($cofo) \$ab = $ab, \$count >> $pc\n";    
        $ab = $ab + $bb;
        }
    else
        {
        $f2 = 1;
        print "[ - ]($cofo) \$ab = $ab, \$count = $count\n";    
        $ab = $ab - $bb;
        }    
    $bb = $bb / 2 if ($f1 && $f2);    
    seek(FF,0,0);
    $cofo++;    
    }
close(FF);
print "----------------------------------------------------\n";
my $tstop = time();
my $tdiff = $tstop - $tstart;
print "[$tdiff sec] ($cofo) \$ab = $ab, \$p = $p% [$pc / $count]\n";    


 


--------------------
Участник движения Культура Вождения
PM   Вверх
gcc
Дата 4.9.2010, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



какой размер файла не написан... 

Это сообщение отредактировал(а) gcc - 4.9.2010, 15:09
PM WWW ICQ Skype GTalk Jabber   Вверх
dva300
Дата 4.9.2010, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 17.2.2010
Где: Москва

Репутация: -1
Всего: 1



Цитата

какой размер файла не написан...

этого в условии нет.
дано лишь то что тип doulbe. и мин 10млрд 
но вариации на тему кол-во элементов = size of file / size of double не прокатать потому как мин 10 значащих знаков... погрешность на лицо

--------------------
Участник движения Культура Вождения
PM   Вверх
DurRandir
Дата 4.9.2010, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



Размер там написан - минимум 112гб на диске. 

Т.е. прочитать всё в память - не вариант. У вас выбран вариант "читаем всё очень много раз" - пока данных мало (даже 10м - мало), вы читаете всё из дискового кэша, скорее всего, поэтому не сильно чувствуете ограничения на скорость дискового чтения. Если бы было надо найти 1% самых медленных (т.е. столько, сколько в принципе может влезть в память) - было бы проще (бонусный вопрос - почему?). А так - читаем какими-то разумными блоками (10м?), сортируем их в памяти, пишем на диск. Занимаем этим занятием все процессоры попутно. Потом, т.к. сами данные нам не нужны, а нужна только граница, то вместо полноценного merge'a результатов, просто пропускаем первые 10% значений (общее количество мы уже знаем - т.к. прочитали на предварительной сортировке все)  - и получаем границу. 
PM   Вверх
Logo
Дата 4.9.2010, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Хех smile 
Это правда. Весной к ним устраивался. Интересно, что после моего решения они несколько изменили условия задачи. Несколько обидно, что я тогда к ним не попал, считаю что если бы не так плохо подготовился ко второму собеседованию, все могло бы сложится иначе.

На счет задачи ты уж как нибудь сам)
PM MAIL   Вверх
DurRandir
Дата 4.9.2010, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



PS: а сколько они обущали/обещают платить, если не секрет?)
PM   Вверх
dva300
Дата 4.9.2010, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 17.2.2010
Где: Москва

Репутация: -1
Всего: 1



Цитата

На счет задачи ты уж как нибудь сам)


так не корысти ради же smile я уже старый так всякого рода конкуренции smile
просто интересно.

вариации на тему если ... ну если бы файл был отсортирован то я бы тут не спрашивал smile

Добавлено через 1 минуту и 6 секунд
Цитата

PS: а сколько они обущали/обещают платить, если не секрет?) 


вы не поняли - это просто задача без продолжения.
а сколько платить - устраивайтесь и узнаете 
--------------------
Участник движения Культура Вождения
PM   Вверх
DurRandir
Дата 4.9.2010, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



>а сколько платить - устраивайтесь и узнаете  
Мне _очень_ лениво ездить в Мск ради непонятного результата и без точных цифр (а сейчас все скрываютsmile. Конечно, это спорная позиция, но что поделать.
PM   Вверх
dva300
Дата 4.9.2010, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 17.2.2010
Где: Москва

Репутация: -1
Всего: 1



Цитата

Мне _очень_ лениво ездить в Мск ради непонятного результата и без точных цифр (а сейчас все скрываютsmile. Конечно, это спорная позиция, но что поделать.


ну так если даже Lоgo послали то напишите им решение и узнаете цену  smile 
--------------------
Участник движения Культура Вождения
PM   Вверх
DurRandir
Дата 4.9.2010, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



А они принимают случайно присланные решения?)))
PM   Вверх
dva300
Дата 4.9.2010, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 17.2.2010
Где: Москва

Репутация: -1
Всего: 1



Цитата

А они принимают случайно присланные решения?))) 


я так понимаю и искренне надеюсь что они принимают правильные решения  smile 
тем более если как говорит Logo задача жива еще с весны smile 

Это сообщение отредактировал(а) dva300 - 4.9.2010, 16:36
--------------------
Участник движения Культура Вождения
PM   Вверх
Logo
Дата 4.9.2010, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Вы можете попробоватьsmileВот та вакансия, входные тесты элементарные, после них высылают задачу. Если получится, расскажите, интересноsmile

Я тему зп  не затрагивал, ждал их предложения. Свои тесты они предложили пройти в ответ на размещенное резюме, в котором была указана зп 60 или 50 т. р. 
Условия у них хорошие, свободный график.
PM MAIL   Вверх
sir_nuf_nuf
Дата 5.9.2010, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



ЭЭЭ.. а никому не пришло в голову что не нужно весь файл перелопачивать ?
По моему выборки в 1 000 000 запросов вполне достаточно будет что бы посчитать время 10 % самых медленных.
Тем более что они говорят, что файл не отсортирован. 
ИМХО нужно уточнить откуда они этот файл взяли. И если это не выдуманная ситуация - то сократить себе работу


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
dva300
Дата 5.9.2010, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 17.2.2010
Где: Москва

Репутация: -1
Всего: 1



Цитата

По моему выборки в 1 000 000 запросов вполне достаточно будет что бы посчитать время 10 % самых медленных.

как ? файл то не отсортирован.

Цитата

Тем более что они говорят, что файл не отсортирован. 

ну так в том то и дело не что отсортирован smile так бы действительно было бы все просто.
хм... или я смотрю в книгу и вижу фигу....

Цитата

ИМХО нужно уточнить откуда они этот файл взяли. И если это не выдуманная ситуация - то сократить себе работу


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

--------------------
Участник движения Культура Вождения
PM   Вверх
DurRandir
Дата 5.9.2010, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



>sir_nuf_nuf
Это вероятностный подход. Предположим, вы выбрали 1кк самых быстрых или самых медленных запросов, и нашли среди них нижние 10% - это будет не точный результат. Если говорить о равномерном распределении запросов по файлу - это одно, но, если это реальный лог, то такого не будет, существуют пики нагрузки.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1303 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.