Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как избежать двойников в списке? Добавление в List<String> 
V
    Опции темы
Mirkes
Дата 26.3.2012, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Обещал прекратить дискуссию, но не удержался.
Обидно, что простое обсуждение скатилось к общению на уровне "От дурака слышу" (эту фразу в научный мир ввел известный чам и гениальный физик Лев Ландау).
Сразу извинюсь перед студентом, что отвечать буду с позиции профессора и программиста, за плечами которого множество внедренных продуктов.
Мне приходилось преподавать технологию программирования и я прекрасно знаю разницу в сложности алгоритмов.
Однако в мне приходилось участовать в разработке проектов, когда определенная структура данных хорошо подходит для одной задачи в проекте и жутко тормозит в другой. Тогда как другая структура дданных прекрасно работает во втором месте и просто не пригодна (по времени обработки) в первом.
Иногда можно пойти на трансформацию структур данных, но это сильно зависит от сложности трансформации. Предлагаемая замена List на Set происходит с потерей информации. Причем эта информация (порядок записей) может быть очень важна.
Сегодня закончил научный проект в котором довольн долго колебался между Set и List. Для оценки что лучше пришлось реализовать оба варианта и проверить что даст выигрыш. В моем случае выигрыш дал List, поскольку обращение по индексу быстрее обращения по ключу, а в большинстве мест мне нужен был перебор всех элементов последовательно. Более того, в некоторых местах сначала формировал List, а затем трансформировал его в обычный массив. Это давало существенный выигрыш во времени.
Теперь о том проекте, который послужил темой для обсуждения. Я не знаю деталей, но судя по ряду ответов автора темы, добавление нового "пользователя" это частный случай работы со структурой. Во всех остальных местах нужен List. Ради получения выигрыша в одном месте Вы предлагаете поменять структуру всего проекта. Скорее всего это будет не эффективно, поскольку приведет к потере производительности в других местах. Второе Ваше предложение - делать локальное преобразование не выдерживает никакой критики в случае больших массивов данных. Преобразование будет работать мног дольше, чем поиск одного или нескольких имен. В случае последовательного внесения нескольких имен возникнет еще более сложная проблема - добавлять нужно будет сразу в обе коллекции.
Именно это я подразумевал под "общим трепом об О(0) и О(n)". Оценка сложности одного алгоритма актуальна только в том случае, когда способ ускорения не затрагивает других алгоритмов. В противном случае нужно оценивать эффективность для ВСЕХ алгоритмов, а не для одного выделенного.
Позволю себе профессорскиое отступление. Сегодня на лекции я обсуждал со студентами различие между учебными и реальными задачами в информатике.
В нашем случае учебная задача - задача о реализации одного алгоритма. А реальная задача, как правило, подразумевает несколько этапов обработки.
Надеюсь я достаточно четко объяснил причину того, что мы все согласились с условием автора поста, и обсуждали решение в рамках, заданных автором.


--------------------
Mirkes
PM MAIL   Вверх
Karadul
Дата 26.3.2012, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Mirkes @  26.3.2012,  17:50 Найти цитируемый пост)
Сразу извинюсь перед студентом, что отвечать буду с позиции профессора и программиста, за плечами которого множество внедренных продуктов.

\m/ \m/ ? smile

Цитата(Mirkes @  26.3.2012,  17:50 Найти цитируемый пост)
Предлагаемая замена List на Set происходит с потерей информации. 

О порядке элементов? Set - это не тип, а интерфейс. Есть и Set с сохранением порядка элементов, LinkedHashSet, который предложили выше.

Цитата(Mirkes @  26.3.2012,  17:50 Найти цитируемый пост)
 а в большинстве мест мне нужен был перебор всех элементов последовательно

А для этого обязательно по чему-то обращаться? Есть же итераторы и foreach (вот не знаю можно ли в яве так сделать, но в питоне есть for key, value in hash.iteritems())

Цитата(Mirkes @  26.3.2012,  17:50 Найти цитируемый пост)
Второе Ваше предложение - делать локальное преобразование не выдерживает никакой критики в случае больших массивов данных. П

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

Цитата(Mirkes @  26.3.2012,  17:50 Найти цитируемый пост)
добавлять нужно будет сразу в обе коллекции.

Зачем держать параллельно List и Set, есть структуры, которые сочетают и порядок элементов, и поиск за O(1).

Цитата(Mirkes @  26.3.2012,  17:50 Найти цитируемый пост)
О(0)

Опечатка?

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

Класс сложности одной операции имеет таки не абсолютный приоритет, но имеет. Может, лично у Вас (проект-то научный? вычислялка какая-то?) это оказалось не так, но как правило, будет наоборот, и проверить в любом случае не помешает. То есть, позиция по умолчанию - брать структуру с лучшим классом сложности на типичных операциях, иной выбор должен быть обоснован. У Вас он был обоснован (тесты ведь проводили?). 
Иначе будет как с Git. Сишники этим славились (не знаю, как сейчас) - нужных структур данных искаропки нет, или пишем свои с ошибками, или используем массив вместо хеш-массива, т.к. реализовать проще, а на класс сложности пох. 





Это сообщение отредактировал(а) Karadul - 26.3.2012, 19:02
PM MAIL   Вверх
knopka
Дата 26.3.2012, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



to Karadul

Позволю себе как автору изложить своё видение вопроса.

Абстрактно:

Я как первоклассник спросил: как сложить 2 + 2, на что коллеги мне объяснили, что нужно к двум палочкам приложить ещё две палочки и посчитать получившееся количество. Меня устроил предложенный способ...
Но тут встревает ученик 11 класса и говорит: 
- Всё не так,  и это плохой очень сложный способ...
        Разве вы не знаете, что компьютер использует двоичную арифметику!
        нужно число два преобразовать в двоичный код и складывать, а потом полученный результат преобразовать!!!
 
Когда же 11 класснику предложили взять и показать как эти палочки преобразовать в двоичный код, он дал множество исчерпывающих ответов:

1. я не учитель, что бы бесплатно палочки перекладывать
Цитата

тут бесплатное программирование на заказ?

2. вашими палочками мне неудобно работать, они у меня в руки на помещаются
Цитата

У меня эклипс не запускается

3. ваши палочки плохо обструганы
Цитата

Кроме меня, на них никто и внимания не обратил.

4. и мне в жизни никогда не придётся складывать палочки
Цитата

Надеюсь, мне с таким кодом дела иметь не придется


--------- конец абстракции

То, что я не гуру программист на Java, ещё не значит, что я не разбираюсь в сложности алгоритмов. 
5 лет преподавания в ВУЗе предмета "Структуры и алгоритмы обработки данных" позволяют мне это утверждать. 

Меня устроило предложенное решение, при этом я конечно учитывал и сложность и требования своей конкретной задачи. 
К чему надо было влазить с рассуждениями о сложности, в уже решённый вопрос. 
Есть соответствующие разделы форума, заведите тему и вперёд...

Надеюсь, я никого не обидел
PM MAIL ICQ   Вверх
Karadul
Дата 27.3.2012, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(knopka @  26.3.2012,  23:49 Найти цитируемый пост)
я не учитель, что бы бесплатно палочки перекладывать

Я не учитель, чтобы учить складывать 2+2. У меня не работал эклипс, чтобы проверить код, а заменить метод на нужный - задача, с которой можно не справиться только при нежелании. Поэтому я и сказал, что здесь не бесплатный цирк, и для того, чтобы тебе помогли, стоит самому приложить какие-то усилия.

По поводу нужности замены, претензии не столько к тебе, сколько к остальным, что их поиск в неоптимальной структуре нисколько не смущал. Кстати, а вам такие мелочи не преподают? Нам преподавали smile

Цитата(knopka @  26.3.2012,  23:49 Найти цитируемый пост)
5 лет преподавания в ВУЗе предмета "Структуры и алгоритмы обработки данных" позволяют мне это утверждать. 

Ого! 5 лет преподавания - и сами хреначим поиск в списке? Это как безопасник, который ставит пароль 123 на доступный в инете сервер smile А потом отвечает "я же безопасник, все под контролем, не лезьте, без вас разберутся".

Как у автора темы, можно спросить: а почему все-таки List, а не что-то другое? Знания явы не позволили? Так посоветовали же LinkedHashSet. Или просто по барабану? Без претензий, просто интересно.
Про ожидаемый размер списка и частоту поиска в нем в теме не было ни слова.

А к чему влазить... ну если структуры с неподходящим классом сложности тут никого не смущают - может валить отсюда, как поросенок Петр? Меня просто возмутило то, что на такие "мелочи" никто не обращает внимание, и понеслось.
PM MAIL   Вверх
Mirkes
Дата 27.3.2012, 03:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Karadul @  27.3.2012,  00:36 Найти цитируемый пост)
А к чему влазить... ну если структуры с неподходящим классом сложности тут никого не смущают - может валить отсюда, как поросенок Петр? Меня просто возмутило то, что на такие "мелочи" никто не обращает внимание, и понеслось. 


Предельно не внимательно. Читаем третий пост от начала темы.
Я таки окончательно выхожу из дискуссии, поскольку по содержанию и даже по теории сказано уже все.


--------------------
Mirkes
PM MAIL   Вверх
Karadul
Дата 27.3.2012, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Mirkes @  27.3.2012,  03:52 Найти цитируемый пост)
Предельно не внимательно. Читаем третий пост от начала темы.

Ув. Mirkes, не надо в меня тыкать постом, на который я в своих предыдущих постах не раз обращал внимание форумчан. Но там нет ни слова про класс сложности как причину выбора, да и на пост, кроме меня, никто не обратил внимания. Все танцы шли вокруг поиска в списке.
PM MAIL   Вверх
sergioK1
Дата 27.3.2012, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Karadul @ 27.3.2012,  11:52)
Цитата(Mirkes @  27.3.2012,  03:52 Найти цитируемый пост)
Предельно не внимательно. Читаем третий пост от начала темы.

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

Граждане тема о чем ? ,  
запутался немного  smile 


PM MAIL   Вверх
Pawl
Дата 28.3.2012, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 7
Всего: 28



Цитата(Karadul @  27.3.2012,  12:52 Найти цитируемый пост)
Но там нет ни слова про класс сложности как причину выбора.

НУ вот Вы доколупались до причины выбора! Ну, хочется так человеку!
Цитата(knopka @  26.3.2012,  23:49 Найти цитируемый пост)
Позволю себе как автору изложить своё видение вопроса.

Вот этот пост здорово улыбнул! Отличная ирония, можно при случае воспользуюсь без ссылки на авторство? smile
З. Ы.
Цитата(sergioK1 @  27.3.2012,  15:53 Найти цитируемый пост)
Граждане тема о чем ? ,

Походу, уже ни о чём, но читать интересно! smile

Добавлено через 2 минуты и 42 секунды
to Karadul Вы тоже очень смешной человек! Пытаетесь всем доказать, что Вы не верблюд, и, на мой взгляд, преуспели в этом: Вы гораздо упрямее! smile


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Karadul
Дата 28.3.2012, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну и хрен с вами, похоже, класс сложности тут никого не интересует в принципе. Надеюсь, мне с программами, написанными вами подобными сталкиваться не придется.
PM MAIL   Вверх
sergioK1
Дата 28.3.2012, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Karadul @ 28.3.2012,  01:04)
Ну и хрен с вами, похоже, класс сложности тут никого не интересует в принципе. Надеюсь, мне с программами, написанными вами подобными сталкиваться не придется.

похоже ты форумом ошибся , 
PM MAIL   Вверх
LSD
Дата 28.3.2012, 12:42 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538




M
LSD
Поскольку Karadul так и не прекратил хамить, да еще и не смог привести никакого удовлетворительного решения задачи, он отправляется в баню на неделю.


Proof of concept решения с List<String> и временем порядка O(log(n)):
Код

import org.apache.commons.collections.list.TreeList;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;


public class NamesGenTest {
    @SuppressWarnings("unchecked")
    private List<String> names = new TreeList();

    public NamesGenTest(String... names) {
        Arrays.sort(names);
        this.names.addAll(Arrays.asList(names));
    }

    public String generateName(final String name) {
        int i = Collections.binarySearch(names, name);
        if (i < 0) {
            names.add(-i - 1, name);
            return name;
        } else {
            return generateNewName(name, i);
        }
    }

    private String generateNewName(final String oldName, final int index) {
        final int namesSize = names.size();
        int counter = 1;
        int pos = index;
        while (pos < namesSize) {
            String newName = oldName + counter;
            int compare = newName.compareTo(names.get(pos));
            if (compare == 0) {
                counter++;
                pos++;
            } else if (compare < 0) {
                names.add(pos, newName);
                return newName;
            } else {
                pos++;
            }
        }
        String newName = oldName + counter;
        names.add(pos, newName);
        return newName;
    }

    public static void main(String[] args) {
        NamesGenTest test = new NamesGenTest("aaa", "abc", "abc!", "abc1", "abc2", "abc4", "cde");
        System.out.println("Initial list: " + test.names);
        String generatedName = test.generateName("abc");
        System.out.println("Generated name: " + generatedName);
        System.out.println("Modified list: " + test.names);
    }
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

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


 




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


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

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