LinuxForum.Fans
Тема

Задача для желающих пошевелить мозгами

Автор: deleted_user 40 сообщений 8491 просмотров 🔒 закрыта
#15713

Есть функция, генерящая числа типа long в произвольном порядке (random). Предложите алгоритм работы программы, при котором ее выполнение прерывается как только вышеупомянутая функция сгенерит уже ранее сгенеренное ею число.

P.S. Просьба уже знающих решение в тему не писать. Пусть попробуют решить те, кто с этой задачей не сталкивался (задача очень часто встречается на собеседованиях, поэтому многим, наверное, это будет полезно)

#15736

Теоретически я представляю как это можно сделать :lol:

#15746
Leviafan написал:
Теоретически я представляю как это можно сделать :lol:

Ну так расскажите. Я нигде не говорил, что обязательно писать код. Я говорил про АЛГОРИТМ

#15752

Я знаю только вариант на быдлокоде: сгенеренные числа складируются в список (текстовый файл), каждое новое число сравнивается со списком по какому-то одному параметру (например первой цифре, или числу знаков). Если есть совпадение, то сравниваем уже всё число с выборкой от предыдущего условия. Совпадает - goto end.

С удовольствием узнаю более изящное решение.

#15753

Надо генерируемые числа куда то сохранять, а потом при новой генерации сверять с сохраненными значениями

#15754
Leviafan написал:
Надо генерируемые числа куда то сохранять, а потом при новой генерации сверять с сохраненными значениями

Ключевое слово "куда-то" :) Вопрос в том, куда и как?

#15756

Writer написал:
Я знаю только вариант на быдлокоде: сгенеренные числа складируются в список (текстовый файл)
если я не ошибаюсь то можно сразу в массив добавлять минуя текстовые файлы или БД
#15759

nesk,
представьте себе, что в течение довольно продолжительного времени рандом-функция генерит вам лонги. За какой промежуток времени у вас память забьется? А потом, поиск (в массиве значений) занимает какое-никакое время, которое увеличивается с ростом объема просматриваемых данных

#15760

Leviafan написал:
если я не ошибаюсь то можно сразу в массив добавлять минуя текстовые файлы или БД
если язык поддерживает динамические массивы, как php например.
#15762

Мой опыт половой жизни с BAT-файламив досе подсказывает, что нужно складироватьчисла в обычный текстовый файл, а потом читать из него строки для сравнения. Если кого волнует размер файла, то весь процесс можно организовать на ФС со сжатием.

#15763
Writer написал:
Я знаю только вариант на быдлокоде: сгенеренные числа складируются в список (текстовый файл), каждое новое число сравнивается со списком по какому-то одному параметру (например первой цифре, или числу знаков). Если есть совпадение, то сравниваем уже всё число с выборкой от предыдущего условия. Совпадает - goto end.

С удовольствием узнаю более изящное решение.

Кстати, предыдущее мое сообщение и к Вашему алгоритму тоже относится. Вы, наверное, знаете, что один из самых медленных процессов в современном компьютере это чтение-запись инфы на внешние носители. Ну, и поиск тоже медленноватый

#15765
Hvzh написал:
представьте себе, что в течение довольно продолжительного времени рандом-функция генерит вам лонги. За какой промежуток времени у вас память забьется? А потом, поиск (в массиве значений) занимает какое-никакое время, которое увеличивается с ростом объема просматриваемых данных

Числа хранить в любом случае не надо. Надо хранить бит по адресу сосуществующему сгенерированному лонгу.

#15766

Немножко упрощу (или усложню - как для кого) задачу. На компе нет внешнего носителя информации. Программа грузится в оперативную память размером, ну пусть будет 16 Гб или 32, или 64. Кроме этой программы никаких других процессов нет. Учтите господа, что я этим сильно облегчаю вам задачу

#15778

Выделяем некую область памяти. Зависящую от границ чисел. Заполняем 0. Далее генерируем число. И пишем в эту память со смещением равным этому числу 1. При записи проверяем если там уже 1 - задача решена.

Ой не до конца тему дочитал nesk уже практически это написал

#15781

voral,
5 баллов! Вы прошли тестирование на должность программиста в компании Microsoft!
Кстати, ответ знали или как?

#15784

это не юникс дао, мы не смещаем и не заполняем память, мы обращаемся к pipe как к вершине совершенства.

#15787
Hvzh написал:
voral,
5 баллов! Вы прошли тестирование на должность программиста в компании Microsoft!
Кстати, ответ знали или как?

Нет. Я с такой задачей не сталкивался.

Но работал с неким протоколом в котором очень много работал по байтно с памятью, а потом отправлял. Видимо это и помогло

#15788

что-то в условиях задачи я не вижу про границы диапозона чисел

#15789
system-root написал:
это не юникс дао, мы не смещаем и не заполняем память, мы обращаемся к pipe как к вершине совершенства.

Вероятно. На линуксе я 1 год. И, пока, ни одного значительного проекта под Линукс не делал. (Точнее даже мелких завершенных нет)
Интересно, а как с пайпами в этой задаче работать? Если это коротко можно . Подробнее пойду в гугль курить когда время будет.

komcumir написал:
что-то в условиях задачи я не вижу про границы диапозона чисел

Да же если использовать лонг. На это потребуется 4,294,967,295 байт (на 32 разрядной системе)
Но как, правило, ведь генерят в задачах в неком диапазоне (более узком)

Войдите или зарегистрируйтесь, чтобы ответить.