Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Алгоритм Выравнивания  (Прочитано 15071 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« : 02-03-2012 21:42 » 

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

вот такое родилось
if (h1 >= h2  && h1 >= h3 { hmax = h1}
if (h2 >= h1  && h2 >= h3 { hmax = h2}
if (h3 >= h1  && h3 >= h2 { hmax = h3}
h1 = h2 =h3 = hmax


Добавлено через 3 минуты и 51 секунду:
Вот еще...

if (h1 >= h2) {
   h2 = h1
} else {
   h1 = h2
}
if (h2 >= h3) {
   h3 = h2
} else {
   h1 = h2 =h3
}
« Последнее редактирование: 02-03-2012 21:46 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 02-03-2012 22:18 » 

Я бы сделал (независимо от языка реализации) h1 = h2 = h3 = max(h1, h2, h3) или max(h1, max(h2, h3)).
max уже дальше может быть любым из перечисленных вариантов, std::max, или что-то ещё.
И пофиг на производительность - вдруг потом это будет читать психопат, знающий, где я живу Улыбаюсь
« Последнее редактирование: 02-03-2012 22:20 от Вад » Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 02-03-2012 22:29 » 

И пофиг на производительность - вдруг потом это будет читать психопат, знающий, где я живу Улыбаюсь

Ну второй алгоритм как раз и говорит об этом (о психопате)
Ни слова о макс
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 03-03-2012 07:05 » 

и пофиг на производительность:

Код:
int arr[]={h1,h2,h3};
int count=sizeof(arr)/sizeof(*arr);

std::sort(arr,arr+count);
int hmax=arr[count-1];


или совсем пофиг на производительность:

Код:
std::set<int> _set;
_set.insert(h1);
_set.insert(h2);
_set.insert(h3);

int hmax=_set.rbegin();
« Последнее редактирование: 03-03-2012 07:09 от Алексей1153++ » Записан

Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 03-03-2012 09:22 » 

Алексей1153++,
Не.. так нечестно...
у меня нет std
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 03-03-2012 09:36 » 

Sla, сам виноват )

Ну тогда

Я бы сделал (независимо от языка реализации) h1 = h2 = h3 = max(h1, h2, h3) или max(h1, max(h2, h3)).
max уже дальше может быть любым из перечисленных вариантов, std::max, или что-то ещё.
И пофиг на производительность - вдруг потом это будет читать психопат, знающий, где я живу Улыбаюсь

+ локальный структур с единственной статической функцией, реализацией max

Добавлено через 2 минуты и 59 секунд:
хотя, если всё так запущено, пусть остаётся банальный if

Добавлено через 1 минуту и 47 секунд:
то есть


Код:
int hmax=0;
if (h1 > hmax)hmax=h1;
if (h2 > hmax)hmax=h2;
if (h3 > hmax)hmax=h3;
« Последнее редактирование: 03-03-2012 09:40 от Алексей1153++ » Записан

zubr
Гость
« Ответ #6 : 03-03-2012 09:41 » 

Код:
hmax = 0;
if(h1 > hmax)
hmax = h1;
if(h2 > hmax)
hmax = h2;
if(h3 > hmax)
hmax = h3;
h1 = h2 = h3 = hmax;
Алексей1153++, я опоздал Улыбаюсь
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 03-03-2012 09:48 » 

hmax = h1;
if(h2 > hmax) hmax = h2;
if(h3 > hmax) hmax = h3;
h1 = h2 = h3 = hmax;

Мне так больше нравится
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 03-03-2012 12:58 » 

Я бы выбрал вариант Вад'а:

Код:
max(h1, max(h2, h3))

Во-первых, программа читается как обычный текст: "максимум от h1 и максимума от h2 и h3". Четко и ясно говорит о том, что нужно сделать, а не как это нужно сделать. Не нужно вникать во все выкрутасы, что чему при каких условиях присваивается. Не забываем, что программы читают не только компиляторы, но и люди. Принцип "грамотного программирования" Кнута.

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

Опять же, если вместо максмума, не дай бог, понадобится минимум... Или добавятся еще один-два параметра...

По мне, чем меньше в программе клуджей, тем лучше.
Записан

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

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 03-03-2012 13:13 » 

Возможно так и сделаю
Задача элементарная.
Выровнять три блока по высоте на странице.
Заранее неизвестно какой из блоков будет выше.
Решение:
Получить высоту блока (о методах здесь пока не говорим)
Найти максимум
Изменить высоту на максимальную.

1. Скорость? Это делается один раз при загрузке страницы
2. Оптимальность? Только в размере кода. h1=h2=h3 = Math.max(h1,h2,h3)
3. Читабельность и сопровождаемость. Это краеугольный камень

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
zubr
Гость
« Ответ #10 : 03-03-2012 13:53 » 

Один хрен, если что то испортится, то искать причину придется. А если на каждый клудж делать тест, то я бы точно уже без штанов ходил.
Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 03-03-2012 14:29 » 

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

P.S. Дабы не разводить бесплодных дискуссий, сразу же оговорюсь, что я не имею в виду совершенно неведомую мне область "социального программирования". Там действуют свои собственные законы и правила, ортогональные известным мне. Речь скорее о более привычных мне встроенном софте реального времени и серверных приложениях.
Записан

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

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 04-03-2012 09:34 » 

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

P.S. Дабы не разводить бесплодных дискуссий, сразу же оговорюсь, что я не имею в виду совершенно неведомую мне область "социального программирования". Там действуют свои собственные законы и правила, ортогональные известным мне. Речь скорее о более привычных мне встроенном софте реального времени и серверных приложениях.
1. Чесслово не знаю что такое клудж... (инет в этом плане мне не помог)
2. Тесты - жизнь покажет Улыбаюсь На самом деле тест проводится, но не пишется Улыбаюсь
3. Элементарность задачи я описал, и... нет необходимости распространения на большой объем данных. Впрочем приведенное решение - для любого размера


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

Например. Как быстро умножить на 10. (инструкций умножения в контроллере нет)


« Последнее редактирование: 04-03-2012 09:37 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 04-03-2012 10:26 » 

1. Чесслово не знаю что такое клудж... (инет в этом плане мне не помог)

Строго говоря, это слово правильно произносится "кладж" (kludge), но в рускоязычном варианте почему-то больше прижился именно "клудж".

Викисловарь:
Цитата
жарг. клудж (устройство, программа или часть программы, которые теоретически не должны работать, но почему-то работают).

Английская Вики:
Цитата
A kludge (or kluge) is a workaround, a quick-and-dirty solution, a clumsy or inelegant, yet effective, solution to a problem, typically using parts that are cobbled together. This term is diversely used in fields such as computer science, aerospace engineering, Internet slang, and evolutionary neuroscience.

Еще вариант:
Цитата
Практически все сходятся на том, что термин получил распространение в 1962 году после публикации статьи под названием «Как спроектировать клудж», иронично написанной компьютерным пионером по имени Джексон Гренхольм, определившим клудж как «набор несовместимых друг с другом плохо подогнанных элементов, образующих ужасающее целое». И далее: «создание клуджа – работа не для любителей. Тут требуется неизъяснимая мазохистская ловкость. Профессионал поймет это сразу. Любитель может предположить, что именно так и устроен компьютер».

Как быстро умножить на 10. (инструкций умножения в контроллере нет)

Например:

1. Сдвинуть множимое на 1 разряд влево (== умножить на 2). Запомнить.
2. Сдвинуть результат п.2 еще на 2 разряда влево (== умножить на 4).
3. Сложить результаты п.п. 1 и 2. (2*X + 8*X = 10*X).

Сдвиг в системе команд наверняка найдется (хотя бы на 1 разряд за раз).
Записан

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

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 04-03-2012 10:40 » 

Цитата
Например. Как быстро умножить на 10. (инструкций умножения в контроллере нет)
Ну да...
Сдвинуть дважды влево и дважды прибавить само себя.

по поводу клуджей... Я ознакомился с вики, у меня вопрос, скорей всего, относился вот к этому
Цитата
Если в программе есть клуджи и нет тестов,
Т.е. мой моСК отказался это понимать.
Наличие клуджей и тестов в данной задаче
Т.е. теоретически не должны работать, но почему-то работают.

Теоретически это работает, и практически это работает. Тестов нет и клуджей нет.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 04-03-2012 10:56 » new

В данном контексте "клудж" относится скорее к неэлегантности и неуклюжести решения, хотя и работающего (a clumsy or inelegant, yet effective, solution to a problem).

Компьютеру все равно, он выполнит любой набор литер, не нарушающих требования формальной грамматики. А вот человеком, читающим программу, фразы "возьми максимальное значение из (h1, h2, h3)" и "если h1>h2, тогда возьми h1, иначе, если..." воспринимаются существенно по-разному.
Записан

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

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines