powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Задачка с дробями.
25 сообщений из 131, страница 3 из 6
Задачка с дробями.
    #38132727
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стоп! Брейк. Не надо ругаться. Давайте только по задаче.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38132742
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда не понимаю :)
Тупо построил n^2/2 (треугольную) матрицу и получил все возможные варианты, проредил сократимое и отсортировал на месте.
Условие "быстро" не выполняется, но в исходной задаче его не было :)
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38132808
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov, давай. Для себя я пытаюсь решить задачу где не будет
хранения полу-матрицы.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38132880
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тестовые данные для n=256 приаттачу на всякий.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38132902
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мой код - некрасив. 70 сек для генерации n=2048.
Только для тестов. Поэтому хвастаться особо нечем.

Но есть мысль что функция z=x/y непрерывна на каком-то
множестве. И можно найти подъём или спуск по ней.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38132919
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДля себя я пытаюсь решить задачу где не будет хранения полу-матрицы.Спускаемся от заданного значения к единице, если остаток по модулю текущего значения равен нулю - идём на следующий шаг, иначе - добавляем очередного кандидата в столбец числителей. Так мы получаем "несократимое при данном знаменателе". Уменьшаем знаменатель на единицу и переходим к следующему столбцу.
Начиная со второго столбца требуется дополнительная проверка, что (a/b) / (c/d) <> 1 "по всем предыдущим столбикам". Тривиально переписывается в a*d <> b*c.
Остаётся сортировка, которая будет основана на этом же сравнении. Не исключено, что эффективнее (по времени) будет "сортировать" во время проверки на сократимость.
Индексация, конечно, э-э-э ... Для педантов, в общем, но, вроде, сам алгоритм рабочий.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38132922
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя, пожалуй, с индексацией и сортировкой особых проблем не будет
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38132925
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonBasil A. Sidorov, давай. Для себя я пытаюсь решить задачу где не будет
хранения полу-матрицы.а толку.
вот мое решение, в котором память расходуется линейно, не дает особых преимуществ, так как временная сложность растет квадратично, и даже при не большем n(для которого легко и матрицу построить), время на выполнение становится неприемлемым.

хотя, если стоит задача найти первую сотню элементов, для n = 1000000, то мое решение норм себя чувствует. так как памяти расходуется не много.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38132932
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovХотя, пожалуй, с индексацией и сортировкой особых проблем не будет
Я не профилировал свой код но думаю что у меня просадка из-за использования
java.lang.BigInteger длинной арифметики. И компаратор также тормозит
из-за перерасчётов. Формула a*d <> b*c прекрасна. Но символьные расчёты
всё скушали. Так что эти 70 сек - фейк который надо списать на ненужный тип
данных. Тем более что знаменатель еще не вышел за диапазаон int64.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38132954
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМой код - некрасив. 70 сек для генерации n=2048.
где твой код?
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38132961
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНо символьные расчёты всё скушали.Изначально ясно, что в этой задаче должна быть целая арифметика.
Вспоминаем школу и "переворот дробей" :)
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38132965
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNmaytonМой код - некрасив. 70 сек для генерации n=2048.
где твой код?
Да мне стыдно его показывать. Да и вообще он только для тестов. Чтобы
сгенерить тесткейсы. Или картинку эту нарисовать.

Ну вот пока за эталон возму код с хаскелем.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38132974
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНу вот пока за эталон возму код с хаскелем.не потепуй )
maytonДа мне стыдно его показывать
я же не постыдился.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38132983
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

просто хотел сравнить. на моем компе, хаскельный код посчитал элементы для н = 2048 за 65 сек.

поэтому я выше и писал, что для 2048 экономить память смысла нет. а больше в моем коде приемуществ и нет.

нужно попробовать другой эксперимент. посчитать 1-ю сотню для н = 1000000.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38132986
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNнужно попробовать другой эксперимент. посчитать 1-ю сотню для н = 1000000.за 30 сек посчитало.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38132990
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNZyK_BotaNнужно попробовать другой эксперимент. посчитать 1-ю сотню для н = 1000000.за 30 сек посчитало.но такая постановка задачи не интересна. все равно в числителе будут одни 1-ци.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133008
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNZyK_BotaNпропущено...
за 30 сек посчитало.но такая постановка задачи не интересна. все равно в числителе будут одни 1-ци.хотя, если поставить задачу первые 20000 элементов для н = 10000, то находит их за 10 сек.
но для современных компов построить матрицу размером 100 000 000, не такая уж и проблема, но все же решение требующее только 10000 элементов одновременно - гораздо лучше, а именно в 10000 раз
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133082
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно Rational - не мой а заимствованый из другой библиотечки.
Я допилил символьную арифметику. Логики здесь особой нету.
Компаратор, сорт-множество, и internal GCD делают 70% работы.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
    
public static void main(String[] args) throws IOException {
        long begin = System.currentTimeMillis();
        int N=Integer.valueOf(args[0]);
        TreeSet<Rational> ts=new TreeSet<Rational>();
        for(int i=1;i<=N;i++){
            for(int j=1;j<=N;j++){
                if (i<j){
                    ts.add(new Rational(i,j));
                }
            }
        }
        String fullPath = ""+N+".txt";
        Writer w = new FileWriter(fullPath);
        for(Rational r : ts){
            w.write(r.toString());
            w.write("\n");
        }
        w.close();
        System.out.println("Wrote "+fullPath+", elapsed (sec) "+(System.currentTimeMillis()-begin)/1000);
    }
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133083
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133089
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСобственно Rational - не мой а заимствованый из другой библиотечки.
Я допилил символьную арифметику. Логики здесь особой нету.
Компаратор, сорт-множество, и internal GCD делают 70% работы.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
    
public static void main(String[] args) throws IOException {
        long begin = System.currentTimeMillis();
        int N=Integer.valueOf(args[0]);
        TreeSet<Rational> ts=new TreeSet<Rational>();
        for(int i=1;i<=N;i++){
            for(int j=1;j<=N;j++){
                if (i<j){
                    ts.add(new Rational(i,j));
                }
            }
        }
        String fullPath = ""+N+".txt";
        Writer w = new FileWriter(fullPath);
        for(Rational r : ts){
            w.write(r.toString());
            w.write("\n");
        }
        w.close();
        System.out.println("Wrote "+fullPath+", elapsed (sec) "+(System.currentTimeMillis()-begin)/1000);
    }


а ты не пробовал адаптировать данное решение, под мной переделанную постановку задачи:

авторхотя, если поставить задачу первые 20000 элементов для н = 10000

я ее спецом под свое решение подогнал )
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133098
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNа ты не пробовал адаптировать данное решение, под мной переделанную постановку задачи:

я ее спецом под свое решение подогнал )
Я оценил. Я еще не занимался скоростной оптимизацией этой задачи на своей
библиотеке. Она слишком концептуальна. И прелесть рациональных чисел
в том что постановка в общем случае не дает тебе возможности подменить
их на double или привести к общему знаменателю в целых числах всё.

А для того чтоб понять твой исходник - мне надо или сломать себе мозг или заставить
тебя прокомментировать все строки. Хаскель штука хитрая и не на обывателя.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133108
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА для того чтоб понять твой исходник - мне надо или сломать себе мозг или заставить
тебя прокомментировать все строки.

ок

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
import Data.Ratio

main = putStr (show last10OfFirst20000)


--берем первых 20000 элементов, и отбрасываем первые 19990
last10OfFirst20000 = drop 19990 $ take 20000 _10000SortedRationals

-- строим отсортированную последовательность рациональных чисел, 
--с числителем к, и знаменателем от к+1 до н
rats n k = map ((%) k) [n, n-1..k+1]

-- строим н последовательностей, для каждого числителя от 1 до н
rows n = map (rats n) [1..n]

--берем 10000 отсортированных последовательностей,
--и мержим их в одну отсортированную последовательность без дубликатов.
_10000SortedRationals = foldl merge [] (rows 10000)

--функция принимает две отсортированных последовательности без дубликатов
--и возвращает смерженную отсортированную последовательность без дубликатов.
merge [] s2 = s2
merge s1 [] = s1
merge (s1:s1s) (s2:s2s) 
    | s1 < s2   = s1 : (merge s1s      (s2:s2s))
    | s1 > s2   = s2 : (merge (s1:s1s) s2s)
    | otherwise = s1 : (merge s1s      s2s)



если есть вопросы по конкретным строчкам или функциям - спрашивай.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133110
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

могу сделать такое же решение, только на си или джаве.
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133114
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaN, в отбрасывании 19990 есть какая-то хитрость?

Вообще весь код работает быстрее с отбрасыванием или нет?
...
Рейтинг: 0 / 0
Задачка с дробями.
    #38133115
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNмогу сделать такое же решение, только на си или джаве.
Нет. Не надо.
...
Рейтинг: 0 / 0
25 сообщений из 131, страница 3 из 6
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Задачка с дробями.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]