Найти ответы in Java

fleshold
Уже с Приветом
Posts: 143
Joined: 29 Apr 2014 12:22

Re: Найти ответы in Java

Post by fleshold »

dup
Last edited by fleshold on 20 Dec 2019 14:18, edited 1 time in total.
fleshold
Уже с Приветом
Posts: 143
Joined: 29 Apr 2014 12:22

Re: Найти ответы in Java

Post by fleshold »

brrdrr wrote: 19 Dec 2019 23:17 Вот тоже задачка на Java.
Имеется array и нужно найти минимальную разницу между его членами.
Так решение выглядит без стрима.

Code: Select all

public class Solution {
    static int minimumAbsoluteDifference(int[] arr) {
        int min = Integer.MAX_VALUE;
        Arrays.sort(arr);
        for( int i = 0; i < arr.length - 1; i++){
                min = Math.min(Math.abs(arr[i] - arr[i + 1]), min);                     
            }
    return min;
    }
А если на i = 0 получим min = 0 зачем бежать дальше? :pain1:
tessob
Уже с Приветом
Posts: 549
Joined: 07 Jan 2016 13:04

Re: Найти ответы in Java

Post by tessob »

Можно так:

Code: Select all

public class Solution {

    public static void main(String[] args) {
        var test = new int[]{1, 10, 12, 30};
        System.out.println(solve(test)); // 2
    }

    public static int solve(int[] arr) {
        IntFunction<Integer> fn = (i) -> Math.abs(arr[i] - arr[i + 1]);
        return IntStream.range(0, arr.length - 1).map(fn::apply).min().orElseThrow();
    }

}
UPD:
Я короче, перечитал и понял, что вопрос был про сортировку. Это сделать можно, создав отдельный класс, который содержит указатель на массив и на позицию в этом массиве. Далее просто реализовать два метода:
- один, возвращающий значение массива
- второй, возвращающий разницу до следующего элемента

Только это в принципе плохая идея, когда элементы стрима знают друг о друге. Сортировка стрима тоже не особо хорошая идея во многих случаях, т.к. параллельный стрим не может быть отсортированным.
first1
Posts: 2
Joined: 20 Dec 2019 22:54

Re: Найти ответы in Java

Post by first1 »

Это задача на алгоритмы. Решение без сортирoвки 0(n). С потоком тоже работает
KinDzaDza
Уже с Приветом
Posts: 2273
Joined: 29 Jul 2005 17:39
Location: Калифорнийский Мухосранск

Re: Найти ответы in Java

Post by KinDzaDza »

Извините, что влезаю, но, так сказать чисто из любви к искусству - у вас горизонт завален ваш код ломается на массивах из одного элемента.
Ну и еше весьма интересным получается значение минимальной разницы для массивов типа таких { Integer.MIN_VALUE + 100, Integer.MAX_VALUE - 100 }.
Palych
Уже с Приветом
Posts: 13722
Joined: 16 Jan 2001 10:01

Re: Найти ответы in Java

Post by Palych »

brrdrr wrote: 19 Dec 2019 23:17 Вот тоже задачка на Java.
Имеется array и нужно найти минимальную разницу между его членами.
Вот что у меня получилось пока:

Code: Select all

package org.pal.stream;

import java.util.stream.Stream;

public class ConsumEx {
    public static void main(String[] a) {
        Stream<Integer> s1 = Stream.of(1, 5, 3, 11, 10);
        Res r = s1.sequential().sorted().collect(() -> new Res(), (res, i) -> {
            res.fmin(i);
        }, (res, res2) -> {
            //todo: combiner
        });
        System.out.println(r.diff);
    }

    static class Res {
        Integer prev;
        Integer diff;

        public void fmin(Integer i) {
            if (prev != null) {
                int newDiff = i - prev;
                if (diff == null || newDiff < diff) {
                    diff = newDiff;
                }
            }
            prev = i;
        }
    }
}
tessob
Уже с Приветом
Posts: 549
Joined: 07 Jan 2016 13:04

Re: Найти ответы in Java

Post by tessob »

KinDzaDza wrote: 21 Dec 2019 01:44Извините, что влезаю, но, так сказать чисто из любви к искусству - у вас горизонт завален ваш код ломается на массивах из одного элемента.
Возможно, в меня сейчас полетят тонны комментариев, но ломаться -- это нормальное поведение кода. Допустим мне надо выполнить цепочку функций над элементами стрима, то если любой оператор не будет выполнен по любой причине, это уже повод остановить обработку и вылететь наверх из стека с эксепшн. С ручными проверками даже если я и выиграю несколько наносекунд, я все равно буду вынужден бросить эксепшн. Просто, обычно любая обработка подобного рода исключений внутри логики обработки стрима приводит к разным вариантам хардкода или анальным трюкам с депенденси инжекшн.
fleshold
Уже с Приветом
Posts: 143
Joined: 29 Apr 2014 12:22

Re: Найти ответы in Java

Post by fleshold »

tessob wrote: 21 Dec 2019 12:18 ломаться -- это нормальное поведение кода.
фгранит :great:
Palych
Уже с Приветом
Posts: 13722
Joined: 16 Jan 2001 10:01

Re: Найти ответы in Java

Post by Palych »

Ломается в данном случае задача (не применима к единственному элементу)
Задача кода по возможности адекватно сообщить почему он сломался.
Palych
Уже с Приветом
Posts: 13722
Joined: 16 Jan 2001 10:01

Re: Найти ответы in Java

Post by Palych »

Кстати, тут я погорячился:
Palych wrote: 21 Dec 2019 03:58

Code: Select all

        }, (res, res2) -> {
            //todo: combiner
        });
Никакого туду с параллельным коллектором не получается.
Во всяком случае с сортировкой.
Может я чего-то не догоняю...
Palych
Уже с Приветом
Posts: 13722
Joined: 16 Jan 2001 10:01

Re: Найти ответы in Java

Post by Palych »

Вот что получилось. Не очень fancy, но работает с параллельными не сортированными потоками:

Code: Select all

package org.pal.stream;

import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;

public class ConsumEx {
    public static void main(String[] a) {
        MinDiffFinder collect = List.of(10, 40, 500, 444, 23, 525, 334, 356, 35, 93, 32, 44, 123, 53, 130, 21)
                .parallelStream()
                .collect(MinDiffFinder::new,
                        MinDiffFinder::accum, MinDiffFinder::combine);
        System.out.println(collect.minDiff);
    }

    static class MinDiffFinder {
        int minDiff = Integer.MAX_VALUE;
        SortedSet<Integer> set = new TreeSet<>();

        void accum(Integer i) {
            if (set.isEmpty()) {
                set.add(i);
            } else {
                if (minDiff != 0) {
                    if (set.contains(i)) {
                        minDiff = 0;
                    } else {
                        SortedSet<Integer> headSet = set.headSet(i);
                        if (! headSet.isEmpty()) {
                            int headDiff = i - headSet.last();
                            if (headDiff < minDiff) {
                                minDiff = headDiff;
                            }
                        }
                        SortedSet<Integer> tailSet = set.tailSet(i);
                        if (! tailSet.isEmpty()) {
                            int tailDiff = tailSet.first() - i;
                            if (tailDiff < minDiff) {
                                minDiff = tailDiff;
                            }
                        }
                        set.add(i);
                    }
                }
            }
        }
        void combine(MinDiffFinder other) {
            if (other.minDiff == 0) {
                minDiff = 0;
            } else {
                for (Integer i: other.set) {
                    accum(i);
                }
            }
        }
    }
}

User avatar
IvanGrozniy
Уже с Приветом
Posts: 10399
Joined: 04 Feb 2004 14:14
Location: Edgewater, NJ

Re: Найти ответы in Java

Post by IvanGrozniy »

first1 wrote: 20 Dec 2019 22:59 Это задача на алгоритмы. Решение без сортирoвки 0(n). С потоком тоже работает
Не думаю, что такое возможно с O(n) в данном случае.
first1
Posts: 2
Joined: 20 Dec 2019 22:54

Re: Найти ответы in Java

Post by first1 »

Максимальная разница между элементами массива - это разница между максимальным и минимальным элементами. Про сортировку в условии задачи ничего не сказано.
User avatar
IvanGrozniy
Уже с Приветом
Posts: 10399
Joined: 04 Feb 2004 14:14
Location: Edgewater, NJ

Re: Найти ответы in Java

Post by IvanGrozniy »

first1 wrote: 27 Dec 2019 04:39 Максимальная разница между элементами массива - это разница между максимальным и минимальным элементами. Про сортировку в условии задачи ничего не сказано.
Если расмматривать первоначальную задачу, то да, можно. Но со второй страницы народ обсуждает уже следующую задачу «найти минимальную разницу между элементами массива».
User avatar
liamkin
Уже с Приветом
Posts: 2643
Joined: 19 Jun 2003 20:22
Location: USA

Re: Найти ответы in Java

Post by liamkin »

IvanGrozniy wrote: 27 Dec 2019 13:06
first1 wrote: 27 Dec 2019 04:39 Максимальная разница между элементами массива - это разница между максимальным и минимальным элементами. Про сортировку в условии задачи ничего не сказано.
Если расмматривать первоначальную задачу, то да, можно. Но со второй страницы народ обсуждает уже следующую задачу «найти минимальную разницу между элементами массива».
найти минимальную разницу между максимальными элементами массива, с минимальными затратами, и максимально быстро!

Return to “Вопросы и новости IT”