Разделить массив на все возможные массивы одинакового размера [дублировать]

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
0
задан Wormbo 22 August 2015 в 15:38
поделиться

2 ответа

Мое предложение состояло в том, чтобы отсортировать значения, затем рассмотреть каждую пару значений (v1, v2), (v3, v4), поместив один элемент из каждой пары в один раздел.

Идея состоит в том, чтобы поочередно помещая значения в каждый набор, поэтому:

s1 = {v1, v4, v5, v8, . . . }
s2 = {v2, v3, v6, v7, . . . }

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

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

2
ответ дан Gordon Linoff 17 August 2018 в 21:41
поделиться
  • 1
    Это не отвечает на вопрос. Если установлено [1, 2, 3, 4, 5, 7], этот алгоритм будет разделен на s1 = [1, 4, 5] и s2 = [2, 3, 7], а правильный ответ - s1 = [2, 4, 5], s2 = [1, 3, 7], – Juan Lopes 22 August 2015 в 17:14
  • 2
    Мне действительно нравится этот подход, потому что он дешевый и может оказаться достаточно хорошим приближением. Даже в том случае, когда он оказывается недостаточно хорошим, он кажется хорошей отправной точкой для какой-то одинаково простой рандомизированной пост-обработки. Это, безусловно, стоит посмотреть, спасибо. – Wormbo 22 August 2015 в 18:16
  • 3
    Да, этот подход дает очень хорошие результаты большую часть времени, даже без какой-либо последующей обработки. Итерирование значения в порядке убывания, по-видимому, помогает уменьшить ошибку. – Wormbo 23 August 2015 в 18:47
  • 4
    Кроме того, в случае нечетного числа значений, положить самое низкое значение в одном из наборов в начале дает гораздо лучшие результаты, чем положить его в меньший набор в конце. – Wormbo 23 August 2015 в 19:47

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

Представьте, что вы хотите разрешить раздел для некоторого массива A, но знаете только, как решить свою проблему. Вам просто нужно удвоить длину массива, заполнив его нулями. Если вы можете решить это с помощью своего алгоритма, то вы решили проблему раздела. Это доказывает, что ваша проблема - NP-hard.

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

В общем случае лучшее, что вы можете сделать, это откат.

3
ответ дан Juan Lopes 17 August 2018 в 21:41
поделиться
  • 1
    Понимаю. Это говорит мне, что я определенно не буду искать точного решения. Учитывая, что данные, которые я буду использовать, также не должны считаться абсолютно точными, для моего варианта использования достаточно приблизительного решения. +1 для указания моей исходной проблемы, вероятно, эквивалентно проблеме partitioin. – Wormbo 22 August 2015 в 18:07